diff --git a/.env b/.env index 6ac42ba97b4..3b91f44d813 100644 --- a/.env +++ b/.env @@ -1,3 +1,6 @@ VITE_BYPASS_LOGIN=0 VITE_BYPASS_TUTORIAL=0 -VITE_SERVER_URL=http://localhost:8001 \ No newline at end of file +VITE_SERVER_URL=http://localhost:8001 +VITE_DISCORD_CLIENT_ID=1248062921129459756 +VITE_GOOGLE_CLIENT_ID=955345393540-2k6lfftf0fdnb0krqmpthjnqavfvvf73.apps.googleusercontent.com +VITE_I18N_DEBUG=0 diff --git a/.env.beta b/.env.beta index 8d1e93b3277..88147215258 100644 --- a/.env.beta +++ b/.env.beta @@ -1,3 +1,6 @@ VITE_BYPASS_LOGIN=0 VITE_BYPASS_TUTORIAL=0 -VITE_SERVER_URL=https://api.beta.pokerogue.net \ No newline at end of file +VITE_SERVER_URL=https://api.beta.pokerogue.net +VITE_DISCORD_CLIENT_ID=1248062921129459756 +VITE_GOOGLE_CLIENT_ID=955345393540-2k6lfftf0fdnb0krqmpthjnqavfvvf73.apps.googleusercontent.com +VITE_I18N_DEBUG=1 diff --git a/.env.development b/.env.development index e9180f0875d..6c92036270f 100644 --- a/.env.development +++ b/.env.development @@ -1,3 +1,7 @@ VITE_BYPASS_LOGIN=1 VITE_BYPASS_TUTORIAL=0 -VITE_SERVER_URL=http://localhost:8001 \ No newline at end of file +VITE_SERVER_URL=http://localhost:8001 +VITE_DISCORD_CLIENT_ID=1234567890 +VITE_GOOGLE_CLIENT_ID=1234567890 +VITE_I18N_DEBUG=1 +VITE_PORT=8000 diff --git a/.env.production b/.env.production index 74818d41a12..65dc7875902 100644 --- a/.env.production +++ b/.env.production @@ -1,3 +1,6 @@ VITE_BYPASS_LOGIN=0 VITE_BYPASS_TUTORIAL=0 -VITE_SERVER_URL=https://api.pokerogue.net \ No newline at end of file +VITE_SERVER_URL=https://api.pokerogue.net +VITE_DISCORD_CLIENT_ID=1248062921129459756 +VITE_GOOGLE_CLIENT_ID=955345393540-2k6lfftf0fdnb0krqmpthjnqavfvvf73.apps.googleusercontent.com +VITE_I18N_DEBUG=0 \ No newline at end of file diff --git a/.env.test b/.env.test new file mode 100644 index 00000000000..54d5bd6f257 --- /dev/null +++ b/.env.test @@ -0,0 +1 @@ +VITE_I18N_DEBUG=0 \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000000..ce942deba5f --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,45 @@ +# Order is important; the last matching pattern takes the most precedence. + +# everything (whole code-base) - Junior Devs +* @pagefaultgames/junior-dev-team + +# github actions/templates etc. - Dev Leads +/.github @pagefaultgames/dev-leads + +# --- Translations --- + +# all translations - Translation Leads +/src/locales @pagefaultgames/translation-leads + +# Catalan (Spain/Spanish) +/src/locales/ca_ES @pagefaultgames/catalan-translation-team + +# German +/src/locales/de @pagefaultgames/german-translation-team + +# English +/src/locales/en @pagefaultgames/english-translation-team + +# Spanish +/src/locales/es @pagefaultgames/spanish-translation-team + +# French +/src/locales/fr @pagefaultgames/french-translation-team + +# Italian +/src/locales/it @pagefaultgames/italian-translation-team + +# Japenese +/src/locales/ja @pagefaultgames/japanese-translation-team + +# Korean +/src/locales/ko @pagefaultgames/korean-translation-team + +# Brasilian (Brasil/Portuguese) +/src/locales/pt_BR @pagefaultgames/portuguese_br-translation-team + +# Chinese (simplified) +/src/locales/zh_CN @pagefaultgames/chinese_simplified-translation-team + +# Chinese (traditional) +/src/locales/zh_TW @pagefaultgames/chinese_traditional-translation-team diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000000..180c7af1240 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: patapancakes diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 6545a0d2367..00000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: "[BUG]" -labels: Bug -assignees: '' - ---- - -**Describe the bug** - - -**To Reproduce** - -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** - - -**Screenshots / Videos** - - -**Device** - - -**Additional context** - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000000..23c4a0a2159 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,115 @@ +name: Bug Report +description: Create a report to help us improve +title: "[Bug] " +labels: ["Bug"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + - type: textarea + id: description + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: markdown + attributes: + value: | + --- + - type: textarea + id: session-file + attributes: + label: Session export file + description: Open Menu → ManageData → Export Session → Select slot. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)). + placeholder: Focus me and then drop your file here (or use the upload button at the bottom) + validations: + required: false + - type: textarea + id: data-file + attributes: + label: User data export file + description: Open Menu → ManageData → Export Data. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)). + placeholder: Focus me and then drop your file here (or use the upload button at the bottom) + validations: + required: false + - type: markdown + attributes: + value: | + --- + - type: textarea + id: expected-behavior + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. If it is an existing move or ability + validations: + required: true + - type: markdown + attributes: + value: | + --- + - type: textarea + id: media + attributes: + label: Screenshots / Videos + description: If applicable, add screenshots or videos to help explain your problem. + validations: + required: false + - type: markdown + attributes: + value: | + --- + - type: dropdown + id: os + attributes: + label: What OS did you observe the bug on? + multiple: true + options: + - PC/Windows + - Mac/OSX + - Linux + - iOS + - Android + - Other + validations: + required: true + - type: input + id: os-other + attributes: + label: If other please specify + validations: + required: false + - type: markdown + attributes: + value: | + --- + - type: dropdown + id: browser + attributes: + label: Which browser do you use? + multiple: true + options: + - Chrome + - Firefox + - Safari + - Edge + - Opera + - Other + validations: + required: true + - type: input + id: browser-other + attributes: + label: If other please specify + validations: + required: false + - type: markdown + attributes: + value: | + --- + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index cb5c8a1b6f3..00000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: "[Feature]" -labels: enhancement -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** - - -**Describe the Feature** - - - -**Additional context** - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000000..843f7feab59 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,37 @@ +name: Feature Request +description: Suggest an idea for this project +title: "[Feature] " +labels: ["Enhancement"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this feature request! + - type: textarea + id: relation + attributes: + label: Is your feature request related to a problem? Please describe. + description: Clear and concise description of what the problem is. + placeholder: E.g. "I'm always frustrated when [...]" + validations: + required: true + - type: markdown + attributes: + value: | + --- + - type: textarea + id: description + attributes: + label: Describe the Feature + description: A clear and concise description of what you want to happen. Add a link to the feature if it is an existing move/ability/etc. + validations: + required: true + - type: markdown + attributes: + value: | + --- + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d3130a73ab8..a30cb642a46 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -2,15 +2,15 @@ -## What are the changes? +## What are the changes the user will see? -## Why am I doing these changes? +## Why am I making these changes? -## What did change? +## What are the changes from a developer perspective? @@ -25,10 +25,13 @@ ## Checklist +- [ ] **I'm using `beta` as my base branch** - [ ] There is no overlap with another PR? - [ ] 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 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? - - [ ] Have I provided screenshots/videos of the changes? \ No newline at end of file + - [ ] Have I provided screenshots/videos of the changes? diff --git a/.github/workflows/deploy-beta.yml b/.github/workflows/deploy-beta.yml index d954d9bb865..3af48b400af 100644 --- a/.github/workflows/deploy-beta.yml +++ b/.github/workflows/deploy-beta.yml @@ -1,8 +1,9 @@ name: Deploy Beta on: - push: {} - pull_request: {} + push: + branches: + - beta jobs: deploy: @@ -20,7 +21,6 @@ jobs: env: NODE_ENV: production - name: Set up SSH - if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch run: | mkdir ~/.ssh echo "${{ secrets.BETA_SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub @@ -28,6 +28,5 @@ jobs: chmod 600 ~/.ssh/* ssh-keyscan -H ${{ secrets.BETA_SSH_HOST }} >> ~/.ssh/known_hosts - name: Deploy build on server - if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch run: | rsync --del --no-times --checksum -vrm dist/* ${{ secrets.BETA_SSH_USER }}@${{ secrets.BETA_SSH_HOST }}:${{ secrets.BETA_DESTINATION_DIR }} \ No newline at end of file diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml index 32c0ca7707a..2850418bc59 100644 --- a/.github/workflows/eslint.yml +++ b/.github/workflows/eslint.yml @@ -6,9 +6,13 @@ on: push: branches: - main # Trigger on push events to the main branch + - beta # Trigger on push events to the beta branch pull_request: 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 ce52e8d9772..a092ccb425a 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -7,6 +7,9 @@ on: pull_request: branches: - main + - beta + merge_group: + types: [checks_requested] jobs: pages: @@ -52,7 +55,7 @@ jobs: working-directory: ${{env.api-dir}} run: | cd pokerogue_docs - npx typedoc --out /tmp/docs --githubPages false --entryPoints ./src/ + npm run docs -- --out /tmp/docs --githubPages false --entryPoints ./src/ - name: Commit & Push docs if: github.event_name == 'push' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c1c32a95cd6..2a78ec252b8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,13 +6,17 @@ on: push: branches: - main # Trigger on push events to the main branch + - beta # Trigger on push events to the beta branch pull_request: 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" - name: Run tests # Human-readable name for the job + run-misc-tests: # Define a job named "run-tests" + name: Run misc tests # Human-readable name for the job runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job steps: @@ -27,5 +31,75 @@ jobs: - name: Install Node.js dependencies # Step to install Node.js dependencies run: npm ci # Use 'npm ci' to install dependencies - - name: tests # Step to run tests - run: npm run test:silent \ No newline at end of file + - name: pre-test # pre-test to check overrides + run: npx vitest run --project pre + - name: test misc + run: npx vitest --project misc + + run-abilities-tests: + name: Run abilities tests + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: pre-test + run: npx vitest run --project pre + - name: test abilities + run: npx vitest --project abilities + + run-items-tests: + name: Run items tests + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: pre-test + run: npx vitest run --project pre + - name: test items + run: npx vitest --project items + + run-moves-tests: + name: Run moves tests + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: pre-test + run: npx vitest run --project pre + - name: test moves + run: npx vitest --project moves + + run-battle-tests: + name: Run battle tests + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: pre-test + run: npx vitest run --project pre + - name: test battle + run: npx vitest --project battle \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0ae49fe9e1c..c22d0b2ce4c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,5 @@ coverage # Local Documentation /typedoc -/dependency-graph.svg \ No newline at end of file +/dependency-graph.svg +/.vs diff --git a/README.md b/README.md index d1b46e630bf..0f9ed992352 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ PokéRogue -PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, fighting trainers, bosses, and more! +PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, fighting trainers, bosses, and more! # Contributing ## 🛠️ Development -If you have the motivation and experience with Typescript/Javascript (or are willing to learn) please feel free to fork the repository and make pull requests with contributions. If you don't know what to work on but want to help, reference the below **To-Do** section or the **#feature-vote** channel in the discord. +If you have the motivation and experience with Typescript/Javascript (or are willing to learn) please feel free to fork the repository and make pull requests with contributions. If you don't know what to work on but want to help, reference the below **To-Do** section or the **#feature-vote** channel in the discord. ### 💻 Environment Setup #### Prerequisites @@ -17,9 +17,9 @@ If you have the motivation and experience with Typescript/Javascript (or are wil 2. Run `npm run start:dev` to locally run the project in `localhost:8000` #### Linting -We're using ESLint as our common linter and formatter. It will run automatically during the pre-commit hook but if you would like to manually run it, use the `npm run eslint` script. +We're using ESLint as our common linter and formatter. It will run automatically during the pre-commit hook but if you would like to manually run it, use the `npm run eslint` script. -### ❔ FAQ +### ❔ FAQ **How do I test a new _______?** - In the `src/overrides.ts` file there are overrides for most values you'll need to change for testing @@ -53,9 +53,11 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - Pokémon Sun/Moon - Pokémon Ultra Sun/Ultra Moon - Pokémon Sword/Shield + - Pokémon Legends: Arceus - Pokémon Scarlet/Violet - Firel (Custom Laboratory, Metropolis, Seabed, and Space biome music) - Lmz (Custom Jungle biome music) + - Andr06 (Custom Slum and Sea biome music) ### 🎵 Sound Effects - Pokémon Emerald @@ -80,6 +82,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - kyledove - Brumirage - pkmn_realidea (Paid Commissions) + - IceJkai ### 🎨 Trainer Portraits - pkmn_realidea (Paid Commissions) @@ -111,6 +114,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - mangalos810 - Involuntary-Twitch - selstar + - koda_want_to_sleep ### 🎨 Move Animations - Pokémon Reborn diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js new file mode 100644 index 00000000000..3c53eb1125b --- /dev/null +++ b/create-test-boilerplate.js @@ -0,0 +1,105 @@ +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", "ability", + * or "item". + * @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", "ability", or "item") 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 if (type === "item") { + dir = path.join(__dirname, 'src', 'test', 'items'); + description = `Items - ${formattedName}`; +} else { + console.error('Invalid type. Please use "move", "ability", or "item".'); + 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}`); diff --git a/docs/enemy-ai.md b/docs/enemy-ai.md new file mode 100644 index 00000000000..46482f56a90 --- /dev/null +++ b/docs/enemy-ai.md @@ -0,0 +1,224 @@ +# EnemyCommandPhase: How Enemy Pokémon Decide What to Do + +## Step 1: Should the Enemy Pokémon Switch? + +When battling an enemy Trainer, the first decision the enemy needs to make is whether or not to switch an active Pokémon with another Pokémon in their party. This decision is primarily made by comparing **matchup scores** between each Pokémon in the enemy's party. + +### Calculating Matchup Scores + +The core function for matchup score calculation can be found in `src/field/pokemon.ts`, within the `Pokemon` class: + +```ts +getMatchupScore(pokemon: Pokemon): number; +``` + +This computes the source Pokémon's matchup score against the Pokémon passed by argument using the formula + +$$\text{MUScore} = (\text{atkScore}+\text{defScore}) * \text{hpDiffRatio} $$ + +where +- $\text{atkScore}$ is the combined effectiveness of the source Pokémon's types against the opposing Pokémon's defensive typing: $\prod_{\text{types}} \text{typeEffectiveness}(\text{type}, \text{oppPokemon})$. $\text{typeEffectiveness}$ is 1 when the type deals neutral damage to the opposing Pokémon's defensive typing, 2 when the type deals super effective damage, and so on. $atkScore$ is also increased by 25 percent if the source Pokémon has a higher Speed stat than the opposing Pokémon. +- $\text{defScore}$ is the inverse of the opposing Pokémon's $\text{atkScore}$ against the source Pokémon's defensive typing, or $(\prod_{\text{types}} \text{typeEffectiveness}(\text{type}, \text{sourcePokemon}))^{-1}$. Unlike $\text{atkScore}$, $\text{defScore}$ is capped at a maximum score of 4. +- $\text{hpDiffRatio}= \text{sourceHpRatio}-\text{oppHpRatio}+1$. This is further multiplied by 1.5 if the source Pokémon has a higher Speed stat than the opposing Pokémon; however, $\text{hpDiffRatio}$ cannot be higher than 1. + +The maximum possible matchup score a Pokémon could have against a single opponent is $(16+16)\times 2=64$, which occurs when +- the Pokémon hits its opponent for 4x super effective damage with both of its types. +- the Pokémon is immune to or resists both of the opponent's types by 4x. +- the Pokémon is at max HP while the opponent's HP ratio is near zero. + +In most situations, though, a Pokémon's matchup score against an opponent will be at most 16, which is equivalent to having two super effective types and resisting both of the opponent's types with the same HP ratios as before. + +The minimum possible matchup score a Pokémon could have against a single opponent is near zero, which occurs when the Pokémon's HP ratio is near zero while the opponent is at max HP. However, a Pokémon's matchup score can also be very low when its type(s) are 4x weak to and/or resisted by its opponent's types. + +### Determining Switches in EnemyCommandPhase + +The `EnemyCommandPhase` follows this process to determine whether or not an enemy Pokémon should switch on each turn during a Trainer battle. + +1. If the Pokémon has a move already queued (e.g. they are recharging after using Hyper Beam), or they are trapped (e.g. by Bind or Arena Trap), skip to resolving a `FIGHT` command (see next section). +2. For each Pokémon in the enemy's party, [compute their matchup scores](#calculating-matchup-scores) against the active player Pokémon. If there are two active player Pokémon in the battle, add their matchup scores together. +3. Take the party member with the highest matchup score and apply a multiplier to the score that reduces the score based on how frequently the enemy trainer has switched Pokémon in the current battle. + - The multiplier scales off of a counter that increments when the enemy trainer chooses to switch a Pokémon and decrements when they choose to use a move. +4. Compare the result of Step 3 with the active enemy Pokémon's matchup score. If the party member's matchup score is at least three times that of the active Pokémon, switch to that party member. + - "Boss" trainers only require the party member's matchup score to be at least two times that of the active Pokémon, so they are more likely to switch than other trainers. The full list of boss trainers in the game is as follows: + - All gym leaders, Elite 4 members, and Champions + - All Evil Team leaders + - The last three Rival Fights (on waves 95, 145, and 195) +5. If the enemy decided to switch, send a switch `turnCommand` and end this `EnemyCommandPhase`; otherwise, move on to resolving a `FIGHT` enemy command. + +## Step 2: Selecting a Move + +At this point, the enemy (a wild or trainer Pokémon) has decided against switching and instead will use a move from its moveset. However, it still needs to figure out which move to use and, if applicable, which target to use the move against. The logic for determining an enemy's next move and target is contained within two methods: `EnemyPokemon.getNextMove()` and `EnemyPokemon.getNextTargets()` in `src/field/pokemon.ts`. + +### Choosing a Move with `getNextMove()` + +In `getNextMove()`, the enemy Pokémon chooses a move to use in the following steps: +1. If the Pokémon has a move in its Move Queue (e.g. the second turn of a charging move), and the queued move is still usable, use that move against the given target. +2. Filter out any moves it can't use within its moveset. The remaining moves make up the enemy's **move pool** for the turn. + 1. A move can be unusable if it has no PP left or it has been disabled by another move or effect + 2. If the enemy's move pool is empty, use Struggle. +3. Calculate the **move score** of each move in the enemy's move pool. + 1. A move's move score is equivalent to the move's maximum **target score** among all of the move's possible targets on the field ([more on this later](#calculating-move-and-target-scores)). + 2. A move's move score is set to -20 if at least one of these conditions are met: + - The move is unimplemented (or, more precisely, the move's name ends with " (N)"). + - Conditions for the move to succeed are not met (unless the move is Sucker Punch, Upper Hand, or Thunderclap, as those moves' conditions can't be resolved before the turn starts). + - The move's target scores are 0 or `NaN` for each target. In this case, the game assumes the target score calculation for that move is unimplemented. +4. Sort the move pool in descending order of move scores. +5. From here, the enemy's move selection varies based on its `aiType`. If the enemy is a Boss Pokémon or has a Trainer, it uses the `SMART` AI type; otherwise, it uses the `SMART_RANDOM` AI type. + 1. Let $m_i$ be the *i*-th move in the sorted move pool $M$: + - If `aiType === SMART_RANDOM`, the enemy has a 5/8 chance of selecting $m_0$ and a 3/8 chance of advancing to the next best move $m_1$, where it then repeats this roll. This process stops when a move is selected or the last move in the move pool is reached. + - If `aiType === SMART`, a similar loop is used to decide between selecting the move $m_i$ and advancing to the next iteration with the move $m_{i+1}$. However, instead of using a flat probability, the following conditions need to be met to advance from selecting $m_i$ to $m_{i+1}$: + - $\text{sign}(s_i) = \text{sign}(s_{i+1})$, where $s_i$ is the move score of $m_i$. + - $\text{randInt}(0, 100) < \text{round}(\frac{s_{i+1}}{s_i}\times 50)$. In other words: if the scores of $m_i$ and $m_{i+1}$ have the same sign, the chance to advance to the next iteration with $m_{i+1}$ is proportional to how close the scores are to each other. The probability to advance to the next iteration is at most 50 percent (when $s_i$ and $s_{i+1}$ are equal). +6. The enemy will use the move selected in Step 5 against the target(s) with the highest [**target selection score (TSS)**](#choosing-targets-with-getnexttargets) + +### Calculating Move and Target Scores + +As part of the move selection process, the enemy Pokémon must compute a **target score (TS)** for each legal target for each move in its move pool. The base target score for all moves is a combination of the move's **user benefit score (UBS)** and **target benefit score (TBS)**. + +![equation](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7D%5Ctext%7BTS%7D=%5Ctext%7BUBS%7D+%5Ctext%7BTBS%7D%5Ctimes%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D-1&%5Ctext%7Bif%20target%20is%20an%20opponent%7D%5C%5C1&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) + +A move's UBS and TBS are computed with the respective functions in the `Move` class: + +```ts +getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer; +getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer; +``` + +Logically, these functions are very similar – they add up their respective benefit scores from each of the move's attributes (as determined by `attr.getUserBenefitScore`, and `attr.getTargetBenefitScore`, respectively) and return the total benefit score. However, there are two key functional differences in how the UBS and TBS of a move are handled: +1. In addition to influencing move selection, a move's TBS also influences target selection for that move, whereas UBS has no influence. +2. When evaluating the target score of a move against an opposing Pokémon, the move's TBS is multiplied by -1, whereas the move's UBS does not change. For this reason, move attributes return negative values for their TBS to reward using the move against an enemy. + +#### Calculating Target Benefit Score (TBS) for Attack Moves + +In addition to the base score from `Move.getTargetBenefitScore()`, attack moves calculate an `attackScore` which influences the move's TBS based on the following properties: +- The move's power (after the move's `VariablePowerAttrs` are applied) +- The move's type effectiveness against the target (note that this also accounts for type immunities from abilities such as Levitate and field effects such as Strong Winds). +- The move's category (Physical/Special), and whether the user has a higher Attack or Special Attack stat. + +More specifically, the following steps are taken to compute the move's `attackScore`: +1. Compute a multiplier based on the move's type effectiveness: + + ![typeMultEqn](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D%5Cbg%7Bwhite%7D%5Ctext%7BtypeMult%7D=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D2&&%5Ctext%7Bif%20move%20is%20super%20effective(or%20better)%7D%5C%5C-2&&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) +2. Compute a multiplier based on the move's category and the user's offensive stats: + 1. Compute the user's offensive stat ratio: + + ![statRatioEqn](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7D%5Ctext%7BstatRatio%7D=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%5Cfrac%7B%5Ctext%7BuserSpAtk%7D%7D%7B%5Ctext%7BuserAtk%7D%7D&%5Ctext%7Bif%20move%20is%20physical%7D%5C%5C%5Cfrac%7B%5Ctext%7BuserAtk%7D%7D%7B%5Ctext%7BuserSpAtk%7D%7D&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) + 2. Compute the stat-based multiplier: + + ![statMultEqn](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7D%5Ctext%7BstatMult%7D=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D2&%5Ctext%7Bif%20statRatio%7D%5Cle%200.75%5C%5C1.5&%5Ctext%7Bif%5C;%7D0.75%5Cle%5Ctext%7BstatRatio%7D%5Cle%200.875%5C%5C1&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) +3. Calculate the move's `attackScore`: + + $\text{attackScore} = (\text{typeMult}\times \text{statMult})+\lfloor \frac{\text{power}}{5} \rfloor$ + +The maximum total multiplier in `attackScore` ($\text{typeMult}\times \text{statMult}$) is 4, which occurs for attacks that are super effective against the target and are categorically aligned with the user's offensive stats (e.g. the move is physical, and the user has much higher Attack than Sp. Atk). The minimum total multiplier of -4 occurs (somewhat confusingly) for attacks that are not super effective but are categorically aligned with the user's offensive stats. + +The attack move's total TBS, then, is $\text{TBS}=\text{baseScore}-\text{attackScore}$, where $\text{baseScore}$ is the result of `Move.getTargetBenefitScore()`. + +#### Calculating Target Score (TS) for Attack Moves + +The final step to calculate an attack move's target score (TS) is to multiply the base target score by the move's type effectiveness and STAB (if it applies): +- If the target is an enemy, the corresponding TS is multiplied by the move's type effectiveness against the enemy (e.g. 2 if the move is super effective), then by 1.5 if the move shares a type with the user. +- If the target is an ally, the TS is divided by these factors instead. +- If $\text{TS}=0$ after these multipliers are applied, the TS is set to -20 for the current target. + +### Choosing Targets with `getNextTargets()` + +The enemy's target selection for single-target moves works in a very similar way to its move selection. Each potential target is given a **target selection score (TSS)** which is based on the move's [target benefit score](#calculating-move-and-target-scores) for that target: + +![TSSEqn](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7D%5Ctext%7BTSS%7D=%5Ctext%7BTBS%7D%5Ctimes%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D-1&%5Ctext%7Bif%20target%20is%20an%20opponent%7D%5C%5C1&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) + +Once the TSS is calculated for each target, the target is selected as follows: +1. Sort the targets (indexes) in decreasing order of their target selection scores (or weights). Let $t_i$ be the index of the *i*-th target in the sorted list, and let $w_i$ be that target's corresponding TSS. +2. Normalize the weights. Let $w_n$ be the lowest-weighted target in the sorted list, then: + + ![normWeightEqn](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7DW_i=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7Dw_i+%7Cw_n%7C&%5Ctext%7Bif%5C;%7Dw_n%5C;%5Ctext%7Bis%20negative%7D%5C%5Cw_i&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) +3. Remove all weights from the list such that $W_i < \frac{W_0}{2}$ +4. Generate a random integer $R=\text{rand}(0, W_{\text{total}})$ where $W_{\text{total}}$ is the sum of all the remaining weights after Step 3. +5. For each target $(t_i, W_i)$, + 1. if $R \le \sum_{j=0}^{i} W_i$, or if $t_i$ is the last target in the list, **return** $t_i$ + 2. otherwise, advance to the next target $t_{i+1}$ and repeat this check. + +Once the target is selected, the enemy has successfully determined its next action for the turn, and its corresponding `EnemyCommandPhase` ends. From here, the `TurnStartPhase` processes the enemy's commands alongside the player's commands and begins to resolve the turn. + +## An Example in Battle + +Suppose you enter a single battle against an enemy trainer with the following Pokémon in their party: + +1. An [Excadrill](https://bulbapedia.bulbagarden.net/wiki/Excadrill_(Pok%C3%A9mon)) with the Ability Sand Force and the following moveset + 1. Earthquake + 2. Iron Head + 3. Crush Claw + 4. Swords Dance +2. A [Heatmor](https://bulbapedia.bulbagarden.net/wiki/Heatmor_(Pok%C3%A9mon)) with the Ability Flash Fire and the following moveset + 1. Fire Lash + 2. Inferno + 3. Hone Claws + 4. Shadow Claw + +The enemy trainer leads with their Heatmor, and you lead with a [Dachsbun](https://bulbapedia.bulbagarden.net/wiki/Dachsbun_(Pok%C3%A9mon)) with the Ability Well-Baked Body. We'll cover the enemy's behavior over the next two turns. + +### Turn 1 + +To determine whether the enemy should switch Pokémon, it first calculates each party member's matchup scores against the player's Dachsbun: + +$$\text{MUScore} = (\text{atkScore}+\text{defScore}) * \text{hpDiffRatio} $$ +- Defensively, Heatmor's Fire typing resists Dachsbun's Fairy typing, so its `defScore` is 2. However, because of Dachsbun's Fire immunity granted by Well-Baked Body, Heatmor's `atkScore` against Dachsbun is 0. With both Pokémon at maximum HP, Heatmor's total matchup score is 2. +- Excadrill's Steel typing also resists Fairy, so its `defScore` is also 2. In this case, though, Steel is also super effective against Fairy, so Excadrill's base `atkScore` is 2. If Excadrill outspeeds Dachsbun (possibly due to it having a +Spd nature or holding a Carbos), its `atkScore` is further increased to 2.5. Since both Pokémon are at maximum HP, Excadrill's total matchup score is 4 (or 4.5 if it outspeeds). + +Based on the enemy party's matchup scores, whether or not the trainer switches out Heatmor for Excadrill depends on the trainer's type. The difference in matchup scores is enough to cause a switch to Excadrill for boss trainers (e.g. gym leaders) but not for regular trainers. For this example, we'll assume the trainer is a boss and, therefore, decides to switch to Excadrill on this turn. + +### Turn 2 + +Now that the enemy Pokémon with the best matchup score is on the field (assuming it survives Dachsbun's attack on the last turn), the enemy will now decide to have Excadrill use one of its moves. Assuming all of its moves are usable, we'll go through the target score calculations for each move: + +- **Earthquake**: In a single battle, this move is just a 100-power Ground-type physical attack with no additional effects. With no additional benefit score from attributes, the move's base target score against the player's Dachsbun is just the `attackScore` from `AttackMove.getTargetBenefitScore()`. In this case, Earthquake's `attackScore` is given by + + $\text{attackScore}=(\text{typeMult}\times \text{statMult}) + \lfloor \frac{\text{power}}{5} \rfloor = -2\times 2 + 20 = 16$ + + Here, `typeMult` is -2 because the move is not super effective, and `statMult` is 2 because Excadrill's Attack is significantly higher than its Sp. Atk. Accounting for STAB thanks to Excadrill's typing, the final target score for this move is **24** + +- **Iron Head**: This move is an 80-power Steel-type physical attack with an additional chance to cause the target to flinch. With these properties, Iron Head has a user benefit score of 0 and a target benefit score given by + + $\text{TBS}=\text{getTargetBenefitScore(FlinchAttr)}-\text{attackScore}$ + + Under its current implementation, the target benefit score of `FlinchAttr` is -5. Calculating the move's `attackScore`, we get: + + $\text{attackScore}=(\text{typeMult}\times \text{statMult}) + \lfloor \frac{\text{power}}{5} \rfloor = 2\times 2 + 16 = 20$ + + Note that `typeMult` in this case is 2 because Iron Head is super effective (or better) against Dachsbun. With the move's UBS at 0, the base target score calculation against Dachsbun simplifies to + + $\text{TS}=-\text{TBS}=-(-5-20)=25$ + + 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 `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 `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(StatStageChangeAttr)}-\text{attackScore}$ + + $\text{TBS}=(-4 + 2)-(-2\times 2 + \lfloor \frac{75}{5} \rfloor)=-2-11=-13$ + + $\text{TS}=-\text{TBS}=13$ + + This move is neutral against Dachsbun and isn't boosted by STAB from Excadrill, so we don't need to apply any extra multipliers. The final score for this move is **13**. + +We now have a sorted move pool in decreasing order of move scores: +1. Iron Head (**75**) +2. Earthquake (**24**) +3. Crush Claw (**13**) +4. Swords Dance (**6**) + +Since no other score is at least half that of Iron Head's score, the enemy AI automatically chooses to use Iron Head against Dachsbun at this point. + +## Guidelines for Implementing Benefit Scores + +When implementing a new move attribute, it's important to override `MoveAttr`'s `getUserBenefitScore` and `getTargetBenefitScore` functions to ensure that the enemy AI can accurately determine when and how to use moves with that attribute. Here are a few basic specifications you should adhere to when implementing benefit scores for a new attribute: +- 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. diff --git a/eslint.config.js b/eslint.config.js index d04b7a7176d..eeea38e3178 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,6 +1,7 @@ import tseslint from '@typescript-eslint/eslint-plugin'; +import stylisticTs from '@stylistic/eslint-plugin-ts' import parser from '@typescript-eslint/parser'; -import imports from 'eslint-plugin-import'; +// import imports from 'eslint-plugin-import'; // Disabled due to not being compatible with eslint v9 export default [ { @@ -10,7 +11,8 @@ export default [ parser: parser }, plugins: { - imports: imports.configs.recommended, + // imports: imports.configs.recommended // Disabled due to not being compatible with eslint v9 + '@stylistic/ts': stylisticTs, '@typescript-eslint': tseslint }, rules: { @@ -25,18 +27,19 @@ export default [ "ignoreRestSiblings": true // Allows unused variables that are part of a rest property in object destructuring. Useful for excluding certain properties from an object while using the rest. }], "eol-last": ["error", "always"], // Enforces at least one newline at the end of files - "@typescript-eslint/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax + "@stylistic/ts/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax "semi": "off", // Disables the general semi rule for TypeScript files "no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax "brace-style": "off", // Note: you must disable the base rule as it can report incorrect errors "curly": ["error", "all"], // Enforces the use of curly braces for all control statements - "@typescript-eslint/brace-style": ["error", "1tbs"], + "@stylistic/ts/brace-style": ["error", "1tbs"], "no-trailing-spaces": ["error", { // Disallows trailing whitespace at the end of lines "skipBlankLines": false, // Enforces the rule even on blank lines "ignoreComments": false // Enforces the rule on lines containing comments }], "space-before-blocks": ["error", "always"], // Enforces a space before blocks - "keyword-spacing": ["error", { "before": true, "after": true }] // Enforces spacing before and after keywords + "keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords + "comma-spacing": ["error", { "before": false, "after": true }] // Enforces spacing after comma } } ] diff --git a/index.css b/index.css index 30e7c63d954..1274f2fcead 100644 --- a/index.css +++ b/index.css @@ -1,16 +1,8 @@ +/* Global */ :root { --color-base: hsl(0, 0%, 55%); --color-light: hsl(0, 0%, 90%); --color-dark: hsl(0, 0%, 10%); - --controls-size: 10vh; - --text-shadow-size: 0.65vh; -} - -@media (orientation: landscape) { - :root { - --controls-size: 20vh; - --text-shadow-size: 1.3vh; - } } html { @@ -19,9 +11,18 @@ html { body { margin: 0; + display:flex; + flex-direction: column; + align-items: center; background: #484050; } +@media (display-mode: fullscreen) { + body { + background: #000000; + } +} + #app { display: flex; justify-content: center; @@ -31,33 +32,181 @@ body { transform-origin: top !important; } +#layout:fullscreen #dpad, #layout:fullscreen { + bottom: 6rem; +} + +input:-internal-autofill-selected { + -webkit-background-clip: text; + background-clip: text; +} + /* Need adjust input font-size */ input { font-size: 3.2rem; } +.hidden { + display: none !important; +} + + +input:-internal-autofill-selected { + -webkit-background-clip: text; + background-clip: text; +} + +/* Touch Controls: */ + +#touchControls { + --text-shadow-size: 0.65vh; + --controls-size: 10vh; + --touch-control-opacity: 0.6; + + --controls-padding: 1rem; + + --controls-size-with-padding: calc(var(--controls-size) + var(--controls-padding)); + --controls-size-with-wide-padding: calc(var(--controls-size) *1.2 + var(--controls-padding)); + --control-group-extra-size: calc(var(--controls-size) * 0.8); + --control-group-extra-wide-size: calc(var(--controls-size) * 1.2); + + --control-group-extra-2-offset: calc(var(--controls-size-with-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2); + --control-group-extra-1-offset: calc(var(--controls-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2); + + --small-control-size: calc(var(--controls-size) / 3); + --rect-control-size: calc(var(--controls-size) * 0.74); + + font-family: 'emerald'; + font-size: var(--controls-size); + text-shadow: var(--color-dark) var(--text-shadow-size) var(--text-shadow-size); + color: var(--color-light); +} + +@media (orientation: landscape) { + #touchControls { + --controls-size: 20vh; + --text-shadow-size: 1.3vh; + --small-button-offset: 4vh; + } +} + #touchControls:not(.visible) { display: none; } -#dpad, #apad { +#touchControls .active { + opacity: var(--touch-control-opacity); +} + +.control-group { position: fixed; - bottom: 1rem; + display: flex; + flex-wrap: wrap; + justify-content: space-around; + align-items: center; + width: var(--controls-size); +} + +.control-group-dpad { + width: calc(2 * var(--controls-size)); + height: calc(2 * var(--controls-size)); +} + +.control-group-extra { + width: var(--control-group-extra-size); + height: var(--control-group-extra-size); +} + +/* Hide buttons on specific UIs */ + +/* Show #apadPreviousTab and #apadNextTab only in settings, except in touch configuration panel */ +#touchControls:not([data-ui-mode^='SETTINGS']) #apadPreviousTab, +#touchControls:not([data-ui-mode^='SETTINGS']) #apadNextTab, +#touchControls:is(.config-mode) #apadPreviousTab, +#touchControls:is(.config-mode) #apadNextTab { + display: none; +} + +/* Show #apadInfo only in battle */ +#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']) #apadInfo { + display: none; +} + +/* Show #apadStats only in battle and shop */ +#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apadStats { + display: none; +} + +/* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */ +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadOpenFilters, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleForm, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleVariant { + display: none; +} + +/* Configuration toolbar */ + +#configToolbar { + width: 100%; + position: fixed; + top: 1rem; + left: 0; + z-index: 9; + user-select: none; +} + +#configToolbar .column { + display: flex; + flex-direction: column; + align-items: center; + gap: 10%; + padding: 0 var(--controls-padding); +} + +#configToolbar .button-row { + display: flex; + justify-content: space-evenly; + width: 100%; +} + +#configToolbar .info-row { + display: flex; + justify-content: flex-start; + width: 100%; +} + +#configToolbar .button { z-index: 3; + background-color: var(--color-base); + display: flex; + justify-content: center; + align-items: center; + text-align: center; + border-radius: 10%; + height: var(--small-control-size); + font-size: var(--small-control-size); + border-radius: 8px; + padding: 2px 8px; + text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); } -@media (orientation: portrait) { - #dpad, #apad { - bottom: calc(1rem + env(safe-area-inset-bottom)); - } +#configToolbar .button:active { + opacity: var(--touch-control-opacity) } +#configToolbar .orientation-label { + font-size: var(--small-control-size); + text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); +} + +/* dpad */ #dpad { - left: 1rem; -} - -#apad { - right: 1rem; + z-index: 3; + opacity: 0.8; } #dpad svg { @@ -66,114 +215,84 @@ input { fill: var(--color-base); } -#dpad svg rect { - opacity: 0.6; -} +/* apad buttons */ -#apad > * { - width: var(--controls-size); - height: var(--controls-size); -} - -#apad .apadBtn { - width: var(--controls-size); - height: var(--controls-size); +.apad-button { background-color: var(--color-base); border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + right: 0; + bottom: 0; + width: var(--controls-size); + height: var(--controls-size); + opacity: 0.8; + border-radius: 8px; } -#apad .apadLabel { - font-family: 'emerald'; - font-size: var(--controls-size); - text-shadow: var(--color-dark) var(--text-shadow-size) var(--text-shadow-size); - color: var(--color-light); +.apad-small { + width: var(--small-control-size); + height: var(--small-control-size); +} + +.apad-label { user-select: none; + height: 100%; + margin-right: -2px; } -#apad .apadLabelSmall { - font-size: calc(var(--controls-size) / 3); +.apad-small > .apad-label { + font-size: var(--small-control-size); text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); } -#apad #apadLabelAction, #apad #apadLabelCancel { - margin-left: calc(var(--controls-size) / 3); - line-height: 0.9; -} - -#apad > :nth-child(2) { - position: relative; - right: var(--controls-size); -} - -#apad .apadRectBtn { - position: relative; +.apad-rectangle { text-align: center; - padding-right: 10%; - border-radius: 10%; - bottom: calc(var(--controls-size) * 0.05); - width: calc(var(--controls-size) * 0.6); - height: calc(var(--controls-size) * 0.3); + width: var(--rect-control-size); + height: var(--small-control-size); } -#apad .apadSqBtn { - border-radius: 10%; - width: calc(var(--controls-size) * 0.3); - height: calc(var(--controls-size) * 0.3); +.apad-square { + width: var(--small-control-size); + height: var(--small-control-size); } -#apad .apadBtnContainer { - position: relative; - display: flex; +.apad-circle { + width: var(--controls-size); + height: var(--controls-size); + border-radius: 50%; } -#apad .apadRectBtnContainer { - flex-wrap: wrap; - margin-top: calc(var(--controls-size) * -0.8); - left: calc(var(--controls-size) * 0.175); - height: calc(var(--controls-size) * 0.8); +/* Defaults:*/ + +#control-group-dpad { + left: var(--controls-padding); + bottom: var(--controls-padding); } -#apad .apadSqBtnContainer { - flex-wrap: wrap; - justify-content: space-evenly; - align-items: center; - margin-bottom: calc(var(--controls-size) * -0.8); - top: calc(var(--controls-size) * -0.9); - width: calc(var(--controls-size) * 0.8); - height: calc(var(--controls-size) * 0.8); +#control-group-action { + right: var(--controls-padding); + bottom: var(--controls-size-with-padding); } -#apad .apadRectBtnContainer > #apadMenu { - align-self: flex-end; +#control-group-cancel { + right: var(--controls-size-with-wide-padding); + bottom: var(--controls-padding); } -#apad .apadRectBtnContainer > .apadSqBtn:not(:first-child) { - margin-left: 10%; +#control-group-extra-1 { + right: var(--control-group-extra-1-offset); + bottom: var(--control-group-extra-1-offset); } -#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_DISPLAY']):not([data-ui-mode='SETTINGS_AUDIO']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadRectBtnContainer > .apadSqBtn:not(.apadBattle), -#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_DISPLAY']):not([data-ui-mode='SETTINGS_AUDIO']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadSqBtnContainer > .apadSqBtn:not(.apadBattle) -{ - display: none; +#control-group-extra-2 { + width: var(--control-group-extra-wide-size); + right: var(--control-group-extra-2-offset); + bottom: var(--control-group-extra-2-offset); } -#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apad .apadBattle { - display: none; -} - -#apad .apadRectBtnContainer + .apadSqBtnContainer { - top: calc(var(--controls-size) * -1.9); - left: calc(var(--controls-size) * -0.9); -} - -#apad .apadBtnContainer .apadLabel { - margin-left: calc(var(--controls-size) / 12); - line-height: 0.8; -} - -#dpad path:not(.active), #apad .apadBtn:not(.active) { - opacity: 0.6; -} +/* Layout */ #layout:fullscreen #dpad, #layout:fullscreen #apad { bottom: 6rem; @@ -195,6 +314,17 @@ input:-internal-autofill-selected { } } +#tnc-links { + font-size: xx-small; + position: relative; +} + +a { + color: #328cea; + margin-right: 4px; + margin-left: 4px; +} + /* Firefox old*/ @-moz-keyframes blink { 0% { diff --git a/index.html b/index.html index 3722bdd3422..390a29fb365 100644 --- a/index.html +++ b/index.html @@ -63,59 +63,88 @@
-
- - - - - - - +
+
+
+ + + + + + + +
+
-
-
- A -
-
- B -
-
-
- R -
-
- V -
-
- C -
-
- Menu +
+
+
+ A
-
-
- F -
-
- G -
-
- E -
-
- N -
-
- V + +
+
+ B
+ +
+ +
+ F +
+
+ R +
+ +
+ C +
+ +
+ Menu +
+
+ +
+ +
+ F +
+
+ G +
+
+ R +
+
+ E +
+
+ N +
+
+ V +
+ +
+ V +
+
+ C +
+
+
- \ No newline at end of file diff --git a/lefthook.yml b/lefthook.yml index 01ffebc69c7..662d3b5617b 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -2,6 +2,15 @@ pre-commit: parallel: true commands: eslint: - glob: '*.{js,jsx,ts,tsx}' + glob: "*.{js,jsx,ts,tsx}" run: npx eslint --fix {staged_files} - stage_fixed: true \ No newline at end of file + stage_fixed: true + skip: + - merge + - rebase + +pre-push: + commands: + eslint: + glob: "*.{js,ts,jsx,tsx}" + run: npx eslint --fix {push_files} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 638a173d7e2..0605b299dab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,8 @@ "name": "pokemon-rogue-battle", "version": "1.0.4", "dependencies": { - "@hpcc-js/wasm": "^2.16.2", "@material/material-color-utilities": "^0.2.7", - "@types/jsdom": "^21.1.7", "crypto-js": "^4.2.0", - "dependency-cruiser": "^16.3.3", "i18next": "^23.11.1", "i18next-browser-languagedetector": "^7.2.1", "i18next-korean-postposition-processor": "^1.0.0", @@ -22,26 +19,24 @@ }, "devDependencies": { "@eslint/js": "^9.3.0", + "@hpcc-js/wasm": "^2.18.0", + "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", + "@types/jsdom": "^21.1.7", "@types/node": "^20.12.13", - "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", - "@vitest/coverage-istanbul": "^1.4.0", - "axios": "^1.6.2", - "axios-cache-interceptor": "^1.3.2", - "eslint": "^8.57.0", - "eslint-plugin-import": "^2.29.1", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", + "@vitest/coverage-istanbul": "^2.0.4", + "dependency-cruiser": "^16.3.10", + "eslint": "^9.7.0", "jsdom": "^24.0.0", - "json-beautify": "^1.1.1", "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", - "pokenode-ts": "^1.20.0", - "typedoc": "^0.25.13", - "typescript": "^5.4.5", - "typescript-eslint": "^7.10.0", - "vite": "^4.5.0", - "vite-plugin-fs": "^0.4.4", + "typedoc": "^0.26.4", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.0-alpha.54", + "vite": "^5.3.5", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.4.0", + "vitest": "^2.0.4", "vitest-canvas-mock": "^0.3.3" }, "engines": { @@ -53,6 +48,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -62,12 +58,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -75,30 +72,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -118,17 +117,19 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -138,14 +139,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -158,67 +160,74 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -228,77 +237,83 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -307,11 +322,89 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", + "dev": true, + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -320,9 +413,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -331,33 +424,35 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -365,14 +460,24 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", + "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -380,13 +485,14 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -396,13 +502,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -412,13 +519,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -428,13 +536,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -444,13 +553,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -460,13 +570,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -476,13 +587,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -492,13 +604,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -508,13 +621,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -524,13 +638,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -540,13 +655,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -556,13 +672,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -572,13 +689,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -588,13 +706,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -604,13 +723,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -620,13 +740,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -636,13 +757,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -652,13 +774,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -668,13 +791,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -684,13 +808,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -700,13 +825,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -716,13 +842,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -732,13 +859,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -752,6 +880,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -763,24 +892,65 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@eslint/config-array": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", + "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -788,40 +958,82 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/@eslint/js": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", - "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", + "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@hpcc-js/wasm": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.16.2.tgz", - "integrity": "sha512-THiidUMYR8/cIfFT3MVcWuRE7bQKh295nrFBxGvUNc4Nq8e2uU1LtiplHs7AUkJ0GxgvZoR+8TQ1/E3Qb/uE2g==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.18.0.tgz", + "integrity": "sha512-M9XVIvAXGH4Xcyb5UoiohWcn6fil89pcos/gClNdBZG2v+W48xSf2bjcA8BW131X/AFHUerVY28n1P1Jw81/9A==", + "dev": true, "dependencies": { "yargs": "17.7.2" }, @@ -829,25 +1041,12 @@ "dot-wasm": "bin/dot-wasm.js" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -856,38 +1055,83 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -902,6 +1146,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -911,14 +1156,15 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -926,6 +1172,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -934,13 +1181,15 @@ "node_modules/@material/material-color-utilities": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.2.7.tgz", - "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==" + "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==", + "license": "Apache-2.0" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -954,6 +1203,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -963,6 +1213,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -971,246 +1222,351 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", - "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "node_modules/@shikijs/core": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.12.0.tgz", + "integrity": "sha512-mc1cLbm6UQ8RxLc0dZES7v5rkH+99LxQp/ZvTqV3NLyYsO/fD6JhEflP1H5b2SDq9gI0+0G36AVZWxvounfR9w==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.4" + } + }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "2.6.0-beta.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.0-beta.0.tgz", + "integrity": "sha512-KQiNvzNzvl9AmMs1MiIBszLIy/Xy1bTExnyaVy5dSzOF9c+yT64JQfH0p0jP6XpGwoCnZsrPUNflwP30G42QBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^8.56.10", + "acorn": "^8.12.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-js/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "2.6.0-beta.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.0-beta.0.tgz", + "integrity": "sha512-WMz1zgmMC3bvg1L/tiYt5ygvDbTDKlbezoHoX2lV9MnUCAEQZUP4xJ9Wj3jmIKxb4mUuK5+vFZJVcOygvbbqow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@stylistic/eslint-plugin-js": "2.6.0-beta.0", + "@types/eslint": "^8.56.10", + "@typescript-eslint/utils": "^8.0.0-alpha.34" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.11", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz", + "integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } }, "node_modules/@types/jsdom": { "version": "21.1.7", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", "parse5": "^7.0.0" } }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.12.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.13.tgz", - "integrity": "sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -1218,34 +1574,43 @@ "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", - "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.58.tgz", + "integrity": "sha512-5G9oIj8jvosj8RTa0VDFXvRmUg1U6FxXJu7ZEfyJYMvFkdMJoY5YnzFvgAvHbYsXOj+YgXZu81fNOTRWQzwk5A==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/type-utils": "7.10.0", - "@typescript-eslint/utils": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/type-utils": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1254,26 +1619,27 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", - "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0-alpha.58.tgz", + "integrity": "sha512-/RpgxIejBui6WXJgV9ukwzxmvbZt5TlfHUGGLB/BsNLj+NRZEbXVtWT9rKuxVOqsGb1Dn9c5gxvBI/XzyuIsMQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1282,16 +1648,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", - "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.58.tgz", + "integrity": "sha512-bGgJXn8B3Pf3mzEOUQTPxEqhux54MOJSqw4HcgBReuP7dudz/hsN4TH9GqHbMXkFv8N4Ed1iqVRfgGeC8b1mGw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0" + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1299,26 +1666,24 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", - "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.58.tgz", + "integrity": "sha512-spW/I/UAY6HM0lKj+/333Zb9arOvUoi8+H0cVNYHELPhOti9re9NjyyJFhck84PNiwi8WmpkEf3GXe7/h+Cquw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -1326,12 +1691,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", - "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0-alpha.58.tgz", + "integrity": "sha512-6+jM4y31a6pwKeV3MVQuVXPZl6d3I1ySMvP5WjZdZ+n57uovMvasZ3ZJstXngoRpa7JtkjVZ7NrMhQ1J8dxKCQ==", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1339,13 +1705,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", - "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.58.tgz", + "integrity": "sha512-hm4nsoJnQcA7axMopUJrH7CD0MJhAMtE2zQt65uMFCy+U2YDdKPwE0g6qEAUBoKn6UBLQJWthJgUmwDbWrnwZg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1354,7 +1721,7 @@ "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1366,271 +1733,164 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", - "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0-alpha.58.tgz", + "integrity": "sha512-lZuGnpK23jr3huebgY4/qqrOKsWJ8dX0Q1Fo4oVYcyAy+sK6p+6nObK4VEPJG098gUmrriiavRiDKIhPDFm4Ig==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0" + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", - "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.58.tgz", + "integrity": "sha512-V//E9PRY2216kh9fN/ihRvTtjpobAXEtmrsr3utlVUwHa2iklcofq1J12yl3KOjx9QBRfBrtfQnYaeruF7L0Fw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/types": "8.0.0-alpha.58", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@vitest/coverage-istanbul": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.5.2.tgz", - "integrity": "sha512-YGC+QSWOL8cQ2HQaTEFttmG9v3DGLy7lMZIGdqjtTgaW6omW17/uZPxuh6m2t69T0rFLqImduVthm5o/gYYWTQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.0.4.tgz", + "integrity": "sha512-6VibYMkXh8cJm5Bg8JYeOoR4oURlPf4YKP9kuVRE/NKasfYrXPnzSwuxrpgMbgOfPj13KUJXgMB3VAGukECtlQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.3.4", + "@istanbuljs/schema": "^0.1.3", + "debug": "^4.3.5", "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-instrument": "^6.0.1", + "istanbul-lib-instrument": "^6.0.3", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "test-exclude": "^6.0.0" + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magicast": "^0.3.4", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "1.5.2" + "vitest": "2.0.4" } }, "node_modules/@vitest/expect": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.2.tgz", - "integrity": "sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", + "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "1.5.2", - "@vitest/utils": "1.5.2", - "chai": "^4.3.10" + "@vitest/spy": "2.0.4", + "@vitest/utils": "2.0.4", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@vitest/expect/node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "node_modules/@vitest/pretty-format": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", + "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", "dev": true, + "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@vitest/expect/node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@vitest/expect/node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@vitest/expect/node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.2.tgz", - "integrity": "sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", + "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/utils": "1.5.2", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@vitest/utils": "2.0.4", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@vitest/snapshot": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz", - "integrity": "sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", + "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", "dev": true, + "license": "MIT", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "2.0.4", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz", - "integrity": "sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", + "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", "dev": true, + "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "tinyspy": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.2.tgz", - "integrity": "sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", + "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", "dev": true, + "license": "MIT", "dependencies": { - "diff-sequences": "^29.6.3", + "@vitest/pretty-format": "2.0.4", "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -1642,6 +1902,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1649,12 +1911,16 @@ "node_modules/acorn-jsx-walk": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", - "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==" + "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", + "dev": true, + "license": "MIT" }, "node_modules/acorn-loose": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.4.0.tgz", "integrity": "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==", + "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -1663,9 +1929,13 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -1675,6 +1945,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -1683,15 +1954,15 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -1702,166 +1973,57 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true - }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -1873,51 +2035,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios-cache-interceptor": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.5.2.tgz", - "integrity": "sha512-zrJZ9DZo5hKfrU+SEN/qhXxGD7GWRzwoqJ7sSvxikizUvDhWy/U9BoAbWLZZdyjbHHsfmS1OlQZCDW6o69r4DA==", - "dev": true, - "dependencies": { - "cache-parser": "1.2.4", - "fast-defer": "1.1.8", - "object-code": "1.3.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/arthurfiorette/axios-cache-interceptor?sponsor=1" - }, - "peerDependencies": { - "axios": "^1" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -1925,6 +2057,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1933,9 +2066,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "dev": true, "funding": [ { @@ -1951,11 +2084,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1964,47 +2098,21 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dev": true, - "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/cache-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.4.tgz", - "integrity": "sha512-O0KwuHuJnbHUrghHi2kGp0SxnWSIBXTYt7M8WVhW0kbPRUNUKoE/Of6e1rRD6AAxmfxFunKnt90yEK09D+sc5g==", - "dev": true - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2024,14 +2132,15 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001612", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", - "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", "dev": true, "funding": [ { @@ -2046,26 +2155,58 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" } }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2075,41 +2216,62 @@ "node": ">=12" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=8" } }, - "node_modules/co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/combined-stream": { @@ -2117,6 +2279,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2128,6 +2291,8 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -2136,64 +2301,21 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/copy-to": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", - "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", - "dev": true + "license": "MIT" }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" } @@ -2203,6 +2325,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2215,19 +2338,22 @@ "node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" }, "node_modules/cssfontparser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cssstyle": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", "dev": true, + "license": "MIT", "dependencies": { "rrweb-cssom": "^0.6.0" }, @@ -2235,11 +2361,18 @@ "node": ">=18" } }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" @@ -2248,96 +2381,12 @@ "node": ">=18" } }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -2354,24 +2403,31 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2384,79 +2440,45 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dependency-cruiser": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.3.tgz", - "integrity": "sha512-+YHPbd6RqM1nLUUbRVkbYO6mVeeq+VEL+bBkR+KFkYVU20vs1D0TalZ9z/hDLxiYiYCSTctUaoWWaUrRc1I+mw==", + "version": "16.3.10", + "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.10.tgz", + "integrity": "sha512-WkCnibHBfvaiaQ+S46LZ6h4AR6oj42Vsf5/0Vgtrwdwn7ZekMJdZ/ALoTwNp/RaGlKW+MbV/fhSZOvmhAWVWzQ==", + "dev": true, + "license": "MIT", "dependencies": { - "acorn": "8.11.3", + "acorn": "8.12.1", "acorn-jsx": "5.3.2", "acorn-jsx-walk": "2.0.0", "acorn-loose": "8.4.0", - "acorn-walk": "8.3.2", - "ajv": "8.16.0", - "chalk": "5.3.0", + "acorn-walk": "8.3.3", + "ajv": "8.17.1", "commander": "12.1.0", - "enhanced-resolve": "5.17.0", - "figures": "6.1.0", + "enhanced-resolve": "5.17.1", "ignore": "5.3.1", - "indent-string": "5.0.0", "interpret": "^3.1.1", "is-installed-globally": "1.0.0", "json5": "2.2.3", - "lodash": "4.17.21", "memoize": "10.0.0", + "picocolors": "1.0.1", "picomatch": "4.0.2", "prompts": "2.4.2", "rechoir": "^0.8.0", "safe-regex": "2.1.1", - "semver": "^7.6.2", - "semver-try-require": "7.0.0", + "semver": "^7.6.3", "teamcity-service-messages": "0.1.14", "tsconfig-paths-webpack-plugin": "4.1.0", - "watskeburt": "4.0.2", - "wrap-ansi": "9.0.0" + "watskeburt": "4.1.0" }, "bin": { "depcruise": "bin/dependency-cruise.mjs", @@ -2470,134 +2492,12 @@ "node": "^18.17||>=20" } }, - "node_modules/dependency-cruiser/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/dependency-cruiser/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/dependency-cruiser/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/dependency-cruiser/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/dependency-cruiser/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" - }, - "node_modules/dependency-cruiser/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/dependency-cruiser/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-cruiser/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/dependency-cruiser/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -2605,48 +2505,32 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.749", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz", - "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==", + "version": "1.4.830", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.830.tgz", + "integrity": "sha512-TrPKKH20HeN0J1LHzsYLs2qwXrp8TF4nHdu4sq61ozGbzMpWhI7iIOPYPPkxeq1azMT9PZ8enPFcftbs/Npcjg==", "dev": true }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -2659,6 +2543,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -2666,70 +2552,11 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -2741,68 +2568,18 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -2810,89 +2587,87 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", + "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.17.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.7.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -2906,130 +2681,24 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3040,6 +2709,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3047,134 +2717,103 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "type-fest": "^0.20.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": "*" } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3187,6 +2826,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3199,6 +2839,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3208,6 +2849,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -3217,6 +2859,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -3224,13 +2867,15 @@ "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -3252,19 +2897,16 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-defer": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/fast-defer/-/fast-defer-1.1.8.tgz", - "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3281,6 +2923,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3292,12 +2935,20 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", "dev": true }, "node_modules/fastq": { @@ -3305,34 +2956,22 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -3340,6 +2979,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3352,6 +2992,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3364,52 +3005,41 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } + "license": "ISC" }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, + "license": "ISC", "dependencies": { - "is-callable": "^1.1.3" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/form-data": { @@ -3417,6 +3047,7 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -3426,27 +3057,13 @@ "node": ">= 6" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3459,33 +3076,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3495,6 +3086,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -3503,26 +3095,18 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -3531,6 +3115,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -3550,6 +3135,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -3557,48 +3143,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -3610,6 +3160,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "license": "MIT", "dependencies": { "ini": "4.1.1" }, @@ -3621,28 +3173,16 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { @@ -3650,6 +3190,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -3669,12 +3210,14 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -3685,36 +3228,31 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -3726,6 +3264,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3737,21 +3276,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3763,6 +3288,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -3775,6 +3301,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^3.1.1" }, @@ -3786,51 +3313,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -3840,10 +3331,11 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -3857,14 +3349,15 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } }, "node_modules/i18next": { - "version": "23.11.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz", - "integrity": "sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==", + "version": "23.12.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", + "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==", "funding": [ { "type": "individual", @@ -3879,6 +3372,7 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } @@ -3887,14 +3381,15 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } }, "node_modules/i18next-http-backend": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.1.tgz", - "integrity": "sha512-+rNX1tghdVxdfjfPt0bI1sNg5ahGW9kA7OboG7b4t03Fp69NdDlRIze6yXhIbN8rbHxJ8IP4dzRm/okZ15lkQg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz", + "integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==", "dependencies": { "cross-fetch": "4.0.0" } @@ -3903,26 +3398,17 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/i18next-korean-postposition-processor/-/i18next-korean-postposition-processor-1.0.0.tgz", "integrity": "sha512-ruNXjI9awsFK6Ie+F9gYaMW8ciLMuCkeRjH9QkSv2Wb8xI0mnm773v3M9eua8dtvAXudIUk4p6Ho7hNkEASXDg==", + "license": "MIT", "peerDependencies": { "i18next": ">=8.4.0" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -3932,6 +3418,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3948,166 +3435,38 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "node_modules/ini": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -4121,6 +3480,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4129,30 +3489,18 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4164,6 +3512,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "dev": true, + "license": "MIT", "dependencies": { "global-directory": "^4.0.1", "is-path-inside": "^4.0.0" @@ -4179,6 +3529,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4186,47 +3538,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4235,44 +3562,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -4280,99 +3578,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -4389,6 +3623,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -4398,32 +3633,12 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz", - "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", @@ -4438,6 +3653,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -4446,11 +3662,28 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-canvas-mock": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", "dev": true, + "license": "MIT", "dependencies": { "cssfontparser": "^1.2.1", "moo-color": "^1.0.2" @@ -4460,12 +3693,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -4474,31 +3709,32 @@ } }, "node_modules/jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", - "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", + "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", "dev": true, + "license": "MIT", "dependencies": { "cssstyle": "^4.0.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", + "nwsapi": "^2.2.10", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", + "tough-cookie": "^4.1.4", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", - "ws": "^8.16.0", + "ws": "^8.17.0", "xml-name-validator": "^5.0.0" }, "engines": { @@ -4513,45 +3749,12 @@ } } }, - "node_modules/jsdom/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -4559,31 +3762,24 @@ "node": ">=4" } }, - "node_modules/json-beautify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-beautify/-/json-beautify-1.1.1.tgz", - "integrity": "sha512-17j+Hk2lado0xqKtUcyAjK0AtoHnPSIgktWRsEXgdFQFG9UnaGw6CHa0J7xsvulxRpFl6CrkDFHght1p5ZJc4A==", - "dev": true, - "bin": { - "json-beautify": "bin/json-beautify" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "node_modules/json-stable-stringify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", @@ -4601,12 +3797,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -4614,37 +3813,21 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, "node_modules/jsonify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "license": "Public Domain", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -4653,219 +3836,140 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", - "dev": true, - "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/koa-bodyparser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz", - "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==", - "dev": true, - "dependencies": { - "co-body": "^6.0.0", - "copy-to": "^2.0.1", - "type-is": "^1.6.18" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true - }, - "node_modules/koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/koa-cors": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/koa-cors/-/koa-cors-0.0.16.tgz", - "integrity": "sha512-s15knPxe3AJBi2I/ZMPL0pSqU+PLYLO6k5tI0AqClkzavowvocPlSdFUwaHNqtjHMhsGmiq2tiX/25iILJx9YA==", - "dev": true - }, - "node_modules/koa-router": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-10.1.1.tgz", - "integrity": "sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==", - "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.1.0" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/lefthook": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.6.12.tgz", - "integrity": "sha512-SoHhB0L1D5twH5KKsGAT1h4qF+RhGfPo/JC5z60H0RDuFWtSwFNOeFpT4Qa7XwM6J9c1fvqZzOH9/4XF7dG9Uw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.4.tgz", + "integrity": "sha512-lVv3nKH9l3KMDS3bySROvWJSw1+AsBHUO7xaA0rg1IEBZrj3+ePmM+a8elX+GU3Go1OzsZEYjo5AOOeLoZ7FQg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "lefthook": "bin/index.js" }, "optionalDependencies": { - "lefthook-darwin-arm64": "1.6.12", - "lefthook-darwin-x64": "1.6.12", - "lefthook-freebsd-arm64": "1.6.12", - "lefthook-freebsd-x64": "1.6.12", - "lefthook-linux-arm64": "1.6.12", - "lefthook-linux-x64": "1.6.12", - "lefthook-windows-arm64": "1.6.12", - "lefthook-windows-x64": "1.6.12" + "lefthook-darwin-arm64": "1.7.4", + "lefthook-darwin-x64": "1.7.4", + "lefthook-freebsd-arm64": "1.7.4", + "lefthook-freebsd-x64": "1.7.4", + "lefthook-linux-arm64": "1.7.4", + "lefthook-linux-x64": "1.7.4", + "lefthook-windows-arm64": "1.7.4", + "lefthook-windows-x64": "1.7.4" } }, "node_modules/lefthook-darwin-arm64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.12.tgz", - "integrity": "sha512-IJa50i+78nGxtSvnxLSDfSjBjjM7Ixl03V4+yl3Kdn+S+FwzEZet3LYTLbnKFUVy9Bg23obI3yXgwUx+tJjFXg==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.4.tgz", + "integrity": "sha512-6XpenaP0W7ZYA3lhHey/C1U+KmYz6eCq2cGswQsrTX+xdtHdWW3NbbOKngxATRTF8+CtF6m9UB2afP7qqkCghQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/lefthook-darwin-x64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.12.tgz", - "integrity": "sha512-h11ByUtwM78FShgWgSUyyZtwKW6pjYfYvTygw24c/lZXKjupfowK5Ps5A73hCsjr0AEJNVpgW1S5Jd22gIJJCA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.4.tgz", + "integrity": "sha512-lpQXbPMHiaWE7+9fV+spjuMKiZ3J/+oI6hY1/l48MO3LmSpIv6DNy0VHho1fZVQnHdBU4bDh5c1G0r1f5T0irg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/lefthook-freebsd-arm64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.12.tgz", - "integrity": "sha512-Aw1+AosL8r/LFSVKG7i8GI1FpHnWFG66/6DBDUgCwNAwhNCXt7tERAM8dj9S6EqmqHCQCC0nI/6qKNBsFPk7Ow==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.4.tgz", + "integrity": "sha512-wv+JZgkD1/wi4X5aKKNodvxNcFcYmvL7uyzKkbtd/LgX5ssh9r5pO9J/71ULGtEuTXH4kqORRtez7u/ygqMEew==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/lefthook-freebsd-x64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.12.tgz", - "integrity": "sha512-G8Dg7UuRstXrqaEA8MSOZikz6PpjPUQu3QmiihzcyGdzI76jFsmjJb2vkrnvMsH9u2gWb3J4sp3TULhbMHXwSw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.4.tgz", + "integrity": "sha512-xoYR0Ay8pbyY9W9mI+iI9VDkkCVYSXhMf9XyOChSlu2XmjKiqi23hjCXvSOpvHQ7jphGvAVpE3Byijr6Xjuihw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/lefthook-linux-arm64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.12.tgz", - "integrity": "sha512-fwO0i6x5EPelL66EwaySzGzvVbN2vLFZDUWuTi8nZzEgBsCBuG0mORxZg91cNCGLRPT3sgzWPraTkyzIJa7kHg==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.4.tgz", + "integrity": "sha512-WvXWzSM/e08n2f5lcC8j+pUMS0RzZftJK4zuBQ36TstSYXfBjWiw+FMnKCVZk6Q8Zc0icyF8sTmKQAyKCgX+UA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/lefthook-linux-x64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.6.12.tgz", - "integrity": "sha512-pRAZKZhSoirjRwDF0TrqxgkeXtUmJqaUi0kGmMJmutToqo9IXQcnpueVmyV9Z1m6lLJn4PpKoFydY6tFXqvyNQ==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.4.tgz", + "integrity": "sha512-eR5NxGzqPJm3wDTm4HStwGxOZ8Omb0ooodyuQdEOxtYidLrd4U18N14huwCEFd3BAOrjIWYV8plH+ReTZE56eg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/lefthook-windows-arm64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.12.tgz", - "integrity": "sha512-jMMIoqNKtiqGrwyWeN3JXGXi7H7iAXsGB5v4DkcUbdw9y50qhruxWz84I2PoxwYmZVeMxRR+VpYvS7nOvBmzWA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.4.tgz", + "integrity": "sha512-C+MdHH+0ylermetMHwfHsYYNI5HI6QEOx7N4Iw4Ea6c3Yuj3eG3LsAzrhsup7KLSSBmDgIHOCJUx/Mfh2z+ATw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/lefthook-windows-x64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.6.12.tgz", - "integrity": "sha512-XqEBVIhp/Fd1Fs+VBlPhrSJlUkyXEJuxQmiYSYow3C18RNpQQrJFVFpz0wE/IDTn2jOXx+p5+hcdlJb+s6bnpA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.4.tgz", + "integrity": "sha512-BDQhiRzmMYPFQFtVtkRfUfeZuSlemG1oJfGKYXlCGFskvK9Jm1nGFnG0Ig63FAQaFdW33DFoLdr9ZKFTUQeSwQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4876,6 +3980,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -4884,20 +3989,13 @@ "node": ">= 0.8.0" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "uc.micro": "^2.0.0" } }, "node_modules/locate-path": { @@ -4905,6 +4003,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -4915,22 +4014,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } @@ -4940,6 +4036,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -4948,15 +4045,17 @@ "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/magicast": { @@ -4964,6 +4063,7 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.24.4", "@babel/types": "^7.24.0", @@ -4975,6 +4075,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -4985,31 +4086,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, - "bin": { - "marked": "bin/marked.js" + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, - "engines": { - "node": ">= 12" + "bin": { + "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true }, "node_modules/memoize": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz", "integrity": "sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==", + "dev": true, + "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" }, @@ -5024,44 +4129,52 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.6.tgz", - "integrity": "sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", - "picomatch": "^4.0.2" + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5071,6 +4184,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -5083,6 +4197,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5094,6 +4209,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -5102,35 +4219,39 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mlly": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", - "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/moo-color": { @@ -5138,26 +4259,23 @@ "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "^1.1.4" } }, - "node_modules/moo-color/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", "bin": { "mustache": "bin/mustache" } @@ -5173,6 +4291,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -5184,21 +4303,14 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5214,10 +4326,29 @@ } } }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, "node_modules/npm-run-path": { @@ -5225,6 +4356,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -5240,6 +4372,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5248,127 +4381,26 @@ } }, "node_modules/nwsapi": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", - "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", "dev": true }, - "node_modules/object-code": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", - "integrity": "sha512-/Ds4Xd5xzrtUOJ+xJQ57iAy0BZsZltOHssnDgcZ8DOhgh41q1YJCnTPnWdWSLkNGNnxYzhYChjc5dgC9mEERCA==", - "dev": true - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -5379,17 +4411,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", - "dev": true - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -5407,6 +4434,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -5422,6 +4450,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -5432,16 +4461,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/papaparse": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", + "license": "MIT" }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -5453,6 +4491,8 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -5460,38 +4500,22 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5499,19 +4523,40 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5520,24 +4565,36 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } }, "node_modules/phaser": { "version": "3.80.1", "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.1.tgz", "integrity": "sha512-VQGAWoDOkEpAWYkI+PUADv5Ql+SM0xpLuAMBJHz9tBcOLqjJ2wd8bUhxJgOqclQlLTg97NmMd9MhS75w16x1Cw==", + "license": "MIT", "dependencies": { "eventemitter3": "^5.0.1" } }, "node_modules/phaser3-rex-plugins": { - "version": "1.80.2", - "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.2.tgz", - "integrity": "sha512-ZPA4c47WQRU6rqLdlOFizGU+ljtP4C2blhcpbYSsNMqNRHD7o8vRBEzEhl8w6CMGvcy+eVoA6v10cyL4eIZARw==", + "version": "1.80.5", + "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.5.tgz", + "integrity": "sha512-hdL3Cm6dK72w6phQdGnEiqqntlwT8SvjU0yit7DkdqiPy/Io1g3KnsRFqndtY+Hu69zaMEuckpIVeQK6yVwx4A==", "dependencies": { "eventemitter3": "^3.1.2", "i18next": "^22.5.1", - "i18next-http-backend": "^2.5.0", + "i18next-http-backend": "^2.5.2", "js-yaml": "^4.1.0", "mustache": "^4.2.0", "papaparse": "^5.4.1", @@ -5547,7 +4604,8 @@ "node_modules/phaser3-rex-plugins/node_modules/eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "license": "MIT" }, "node_modules/phaser3-rex-plugins/node_modules/i18next": { "version": "22.5.1", @@ -5567,6 +4625,7 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.6" } @@ -5575,18 +4634,21 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/phaser3spectorjs/-/phaser3spectorjs-0.0.8.tgz", "integrity": "sha512-0dSO7/aMjEUPrp5EcjRvRRsEf+jXDbmzalPeJ6VtTB2Pn1PeaKc+qlL/DmO3l1Dvc5lkzc+Sil1Ta+Hkyi5cbA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5594,33 +4656,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", - "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", - "dev": true, - "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.6.1", - "pathe": "^1.1.2" - } - }, - "node_modules/pokenode-ts": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/pokenode-ts/-/pokenode-ts-1.20.0.tgz", - "integrity": "sha512-6MekrbiQc9nmaZJ5xpyhRSEMFo4xEsMuB7RR3EqfPvuXo/3StnH1p4brfIiIWDCcZvu7t9a0vjodiR4TnRdLEw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/Gabb-c/pokenode-ts?sponsor=1" - }, - "peerDependencies": { - "axios": "^1.4.0", - "axios-cache-interceptor": "^1.2.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -5631,9 +4666,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -5649,9 +4684,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -5663,40 +4699,17 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -5705,46 +4718,37 @@ "node": ">= 6" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -5766,68 +4770,12 @@ } ] }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz", - "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==", - "dev": true - }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.20.0" }, @@ -5838,38 +4786,25 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", "bin": { "regexp-tree": "bin/regexp-tree" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5878,6 +4813,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5886,12 +4823,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -5909,6 +4849,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -5918,46 +4859,51 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/rollup": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", + "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "@types/estree": "1.0.5" }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.1", + "@rollup/rollup-android-arm64": "4.18.1", + "@rollup/rollup-darwin-arm64": "4.18.1", + "@rollup/rollup-darwin-x64": "4.18.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", + "@rollup/rollup-linux-arm-musleabihf": "4.18.1", + "@rollup/rollup-linux-arm64-gnu": "4.18.1", + "@rollup/rollup-linux-arm64-musl": "4.18.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", + "@rollup/rollup-linux-riscv64-gnu": "4.18.1", + "@rollup/rollup-linux-s390x-gnu": "4.18.1", + "@rollup/rollup-linux-x64-gnu": "4.18.1", + "@rollup/rollup-linux-x64-musl": "4.18.1", + "@rollup/rollup-win32-arm64-msvc": "4.18.1", + "@rollup/rollup-win32-ia32-msvc": "4.18.1", + "@rollup/rollup-win32-x64-msvc": "4.18.1", "fsevents": "~2.3.2" } }, "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true }, "node_modules/run-parallel": { @@ -5979,84 +4925,34 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/safe-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "license": "MIT", "dependencies": { "regexp-tree": "~0.1.1" } }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -6065,9 +4961,10 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -6075,21 +4972,11 @@ "node": ">=10" } }, - "node_modules/semver-try-require": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver-try-require/-/semver-try-require-7.0.0.tgz", - "integrity": "sha512-LI7GzDuAZmNKOY0/LY4nB3ifh6kYMvBimFTHVpA6wNEl3gw59QrLbTAnJb7vQzPd1qXPz+BtKJZaYORXWMerrA==", - "dependencies": { - "semver": "^7.6.0" - }, - "engines": { - "node": "^18.17||>=20" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -6102,32 +4989,12 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -6140,51 +5007,34 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.12.0.tgz", + "integrity": "sha512-BuAxWOm5JhRcbSOl7XCei8wGjgJJonnV0oipUupPY58iULxUGyHhW5CF+9FRMuM1pcJ5cGEJGll1LusX6FwpPA==", "dev": true, "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@shikijs/core": "1.12.0", + "@types/hast": "^3.0.4" } }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -6195,13 +5045,16 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6211,6 +5064,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6219,27 +5073,41 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, "node_modules/std-env": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6249,59 +5117,62 @@ "node": ">=8" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6313,6 +5184,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6322,6 +5195,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6334,6 +5208,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6341,40 +5216,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "dev": true, - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true - }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6386,12 +5245,15 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6399,48 +5261,86 @@ "node_modules/teamcity-service-messages": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz", - "integrity": "sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==" + "integrity": "sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==", + "dev": true, + "license": "MIT" }, "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tinybench": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", + "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -6450,6 +5350,7 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6459,6 +5360,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6466,20 +5368,12 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -6491,15 +5385,23 @@ } }, "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -6508,10 +5410,11 @@ } }, "node_modules/tsconfck": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.0.tgz", - "integrity": "sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", + "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", "dev": true, + "license": "MIT", "bin": { "tsconfck": "bin/tsconfck.js" }, @@ -6527,22 +5430,12 @@ } } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", @@ -6552,74 +5445,12 @@ "node": ">=10.13.0" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -6629,32 +5460,12 @@ "node": ">=6" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true, - "engines": { - "node": ">=0.6.x" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -6662,162 +5473,32 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typedoc": { - "version": "0.25.13", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.13.tgz", - "integrity": "sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==", + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.5.tgz", + "integrity": "sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg==", "dev": true, "dependencies": { "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.3", - "shiki": "^0.14.7" + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.9.1", + "yaml": "^2.4.5" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 16" + "node": ">= 18" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -6828,79 +5509,56 @@ } }, "node_modules/typescript-eslint": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.10.0.tgz", - "integrity": "sha512-thO8nyqptXdfWHQrMJJiJyftpW8aLmwRNs11xA8pSrXneoclFPstQZqXvDWuH1WNL4CHffqHvYUeCHTit6yfhQ==", + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.0.0-alpha.58.tgz", + "integrity": "sha512-0mvrodNhExpkWns+5RaZP8YqsAfPyjmPVVM1p+kaJkvApMH58/VFcQ0iSQuun0bFRNCMvW0ZUdulS9AsHqVXkg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "7.10.0", - "@typescript-eslint/parser": "7.10.0", - "@typescript-eslint/utils": "7.10.0" + "@typescript-eslint/eslint-plugin": "8.0.0-alpha.58", + "@typescript-eslint/parser": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/ufo": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", - "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -6916,9 +5574,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -6931,6 +5590,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -6940,44 +5600,37 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, + "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", @@ -7010,15 +5663,16 @@ } }, "node_modules/vite-node": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.2.tgz", - "integrity": "sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", + "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -7031,506 +5685,12 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-node/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/vite-node/node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/vite-node/node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-fs": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/vite-plugin-fs/-/vite-plugin-fs-0.4.4.tgz", - "integrity": "sha512-TT9kEU2LX3musejDL99nLdjDl7P74AdTnK3yozehswg0FhKSGlNstkHVUgcswKSk6vH/Uzqgz+df7WT0sEA/IA==", - "dev": true, - "dependencies": { - "koa": "^2.13.4", - "koa-bodyparser": "^4.3.0", - "koa-cors": "^0.0.16", - "koa-router": "^10.1.1" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/vite-tsconfig-paths": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", @@ -7546,31 +5706,31 @@ } }, "node_modules/vitest": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.2.tgz", - "integrity": "sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", + "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/expect": "1.5.2", - "@vitest/runner": "1.5.2", - "@vitest/snapshot": "1.5.2", - "@vitest/spy": "1.5.2", - "@vitest/utils": "1.5.2", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.4", + "@vitest/pretty-format": "^2.0.4", + "@vitest/runner": "2.0.4", + "@vitest/snapshot": "2.0.4", + "@vitest/spy": "2.0.4", + "@vitest/utils": "2.0.4", + "chai": "^5.1.1", + "debug": "^4.3.5", "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "1.5.2", - "why-is-node-running": "^2.2.2" + "vite-node": "2.0.4", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" @@ -7584,8 +5744,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.5.2", - "@vitest/ui": "1.5.2", + "@vitest/browser": "2.0.4", + "@vitest/ui": "2.0.4", "happy-dom": "*", "jsdom": "*" }, @@ -7615,6 +5775,7 @@ "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", "dev": true, + "license": "MIT", "dependencies": { "jest-canvas-mock": "~2.5.2" }, @@ -7622,563 +5783,12 @@ "vitest": "*" } }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/vitest/node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vitest/node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/vitest/node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/vitest/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/vitest/node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/vitest/node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/vitest/node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, + "license": "MIT", "dependencies": { "xml-name-validator": "^5.0.0" }, @@ -8187,9 +5797,10 @@ } }, "node_modules/watskeburt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.0.2.tgz", - "integrity": "sha512-w7X8AGrBZExP5/3e3c1X/CUY8Yod/aiAazQCvrg7n8Un6piD+NFFK926G15zRq4+wu0XAEWpSsZ4C+fEfVOCYw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.1.0.tgz", + "integrity": "sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw==", + "dev": true, "bin": { "watskeburt": "dist/run-cli.js" }, @@ -8200,18 +5811,24 @@ "node_modules/webfontloader": { "version": "1.6.28", "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", - "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" + "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==", + "license": "Apache-2.0" }, "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -8219,22 +5836,39 @@ "node": ">=18" } }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-mimetype": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/which": { @@ -8242,6 +5876,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8252,46 +5887,12 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -8308,14 +5909,36 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8328,47 +5951,76 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -8390,6 +6042,7 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18" } @@ -8398,12 +6051,15 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -8412,12 +6068,27 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -8435,17 +6106,32 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/ylru": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", - "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=8" } }, "node_modules/yocto-queue": { @@ -8453,6 +6139,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 160ca965bc8..83e82585d1e 100644 --- a/package.json +++ b/package.json @@ -9,46 +9,43 @@ "build": "vite build", "build:beta": "vite build --mode beta", "preview": "vite preview", - "test": "vitest run", - "test:cov": "vitest run --coverage", - "test:watch": "vitest watch --coverage", - "test:silent": "vitest run --silent", + "test": "vitest run --project pre && vitest run --project main", + "test:cov": "vitest run --project pre && vitest run --project main --coverage", + "test:watch": "vitest run --project pre && vitest watch --project main --coverage", + "test:silent": "vitest run --project pre && vitest run --project main --silent", + "typecheck": "tsc --noEmit", "eslint": "eslint --fix .", "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", + "@hpcc-js/wasm": "^2.18.0", + "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", + "@types/jsdom": "^21.1.7", "@types/node": "^20.12.13", - "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", - "@vitest/coverage-istanbul": "^1.4.0", - "axios": "^1.6.2", - "axios-cache-interceptor": "^1.3.2", - "eslint": "^8.57.0", - "eslint-plugin-import": "^2.29.1", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", + "@vitest/coverage-istanbul": "^2.0.4", + "dependency-cruiser": "^16.3.10", + "eslint": "^9.7.0", "jsdom": "^24.0.0", - "json-beautify": "^1.1.1", "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", - "pokenode-ts": "^1.20.0", - "typedoc": "^0.25.13", - "typescript": "^5.4.5", - "typescript-eslint": "^7.10.0", - "vite": "^4.5.0", - "vite-plugin-fs": "^0.4.4", + "typedoc": "^0.26.4", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.0-alpha.54", + "vite": "^5.3.5", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.4.0", + "vitest": "^2.0.4", "vitest-canvas-mock": "^0.3.3" }, "dependencies": { - "@hpcc-js/wasm": "^2.16.2", "@material/material-color-utilities": "^0.2.7", - "@types/jsdom": "^21.1.7", "crypto-js": "^4.2.0", - "dependency-cruiser": "^16.3.3", "i18next": "^23.11.1", "i18next-browser-languagedetector": "^7.2.1", "i18next-korean-postposition-processor": "^1.0.0", diff --git a/public/audio/se/battle_anims/Absorb2.m4a b/public/audio/battle_anims/Absorb2.m4a similarity index 100% rename from public/audio/se/battle_anims/Absorb2.m4a rename to public/audio/battle_anims/Absorb2.m4a diff --git a/public/audio/se/battle_anims/Ace.m4a b/public/audio/battle_anims/Ace.m4a similarity index 100% rename from public/audio/se/battle_anims/Ace.m4a rename to public/audio/battle_anims/Ace.m4a diff --git a/public/audio/se/battle_anims/Acupressure.mp3 b/public/audio/battle_anims/Acupressure.mp3 similarity index 100% rename from public/audio/se/battle_anims/Acupressure.mp3 rename to public/audio/battle_anims/Acupressure.mp3 diff --git a/public/audio/se/battle_anims/Applause.m4a b/public/audio/battle_anims/Applause.m4a similarity index 100% rename from public/audio/se/battle_anims/Applause.m4a rename to public/audio/battle_anims/Applause.m4a diff --git a/public/audio/se/battle_anims/Battle1.m4a b/public/audio/battle_anims/Battle1.m4a similarity index 100% rename from public/audio/se/battle_anims/Battle1.m4a rename to public/audio/battle_anims/Battle1.m4a diff --git a/public/audio/se/battle_anims/Blow1.m4a b/public/audio/battle_anims/Blow1.m4a similarity index 100% rename from public/audio/se/battle_anims/Blow1.m4a rename to public/audio/battle_anims/Blow1.m4a diff --git a/public/audio/se/battle_anims/Blow3.m4a b/public/audio/battle_anims/Blow3.m4a similarity index 100% rename from public/audio/se/battle_anims/Blow3.m4a rename to public/audio/battle_anims/Blow3.m4a diff --git a/public/audio/se/battle_anims/Blow4.m4a b/public/audio/battle_anims/Blow4.m4a similarity index 100% rename from public/audio/se/battle_anims/Blow4.m4a rename to public/audio/battle_anims/Blow4.m4a diff --git a/public/audio/se/battle_anims/Blow5.m4a b/public/audio/battle_anims/Blow5.m4a similarity index 100% rename from public/audio/se/battle_anims/Blow5.m4a rename to public/audio/battle_anims/Blow5.m4a diff --git a/public/audio/se/battle_anims/Blow6.m4a b/public/audio/battle_anims/Blow6.m4a similarity index 100% rename from public/audio/se/battle_anims/Blow6.m4a rename to public/audio/battle_anims/Blow6.m4a diff --git a/public/audio/se/battle_anims/Blow7.m4a b/public/audio/battle_anims/Blow7.m4a similarity index 100% rename from public/audio/se/battle_anims/Blow7.m4a rename to public/audio/battle_anims/Blow7.m4a diff --git a/public/audio/se/battle_anims/Bow1.m4a b/public/audio/battle_anims/Bow1.m4a similarity index 100% rename from public/audio/se/battle_anims/Bow1.m4a rename to public/audio/battle_anims/Bow1.m4a diff --git a/public/audio/se/battle_anims/Collapse1.m4a b/public/audio/battle_anims/Collapse1.m4a similarity index 100% rename from public/audio/se/battle_anims/Collapse1.m4a rename to public/audio/battle_anims/Collapse1.m4a diff --git a/public/audio/se/battle_anims/Comet Punch.mp3 b/public/audio/battle_anims/Comet Punch.mp3 similarity index 100% rename from public/audio/se/battle_anims/Comet Punch.mp3 rename to public/audio/battle_anims/Comet Punch.mp3 diff --git a/public/audio/se/battle_anims/Confuse.m4a b/public/audio/battle_anims/Confuse.m4a similarity index 100% rename from public/audio/se/battle_anims/Confuse.m4a rename to public/audio/battle_anims/Confuse.m4a diff --git a/public/audio/se/battle_anims/Crash.m4a b/public/audio/battle_anims/Crash.m4a similarity index 100% rename from public/audio/se/battle_anims/Crash.m4a rename to public/audio/battle_anims/Crash.m4a diff --git a/public/audio/se/battle_anims/Damage1.m4a b/public/audio/battle_anims/Damage1.m4a similarity index 100% rename from public/audio/se/battle_anims/Damage1.m4a rename to public/audio/battle_anims/Damage1.m4a diff --git a/public/audio/se/battle_anims/Darkness2.m4a b/public/audio/battle_anims/Darkness2.m4a similarity index 100% rename from public/audio/se/battle_anims/Darkness2.m4a rename to public/audio/battle_anims/Darkness2.m4a diff --git a/public/audio/se/battle_anims/Darkness6.m4a b/public/audio/battle_anims/Darkness6.m4a similarity index 100% rename from public/audio/se/battle_anims/Darkness6.m4a rename to public/audio/battle_anims/Darkness6.m4a diff --git a/public/audio/se/battle_anims/Defense Curl.mp3 b/public/audio/battle_anims/Defense Curl.mp3 similarity index 100% rename from public/audio/se/battle_anims/Defense Curl.mp3 rename to public/audio/battle_anims/Defense Curl.mp3 diff --git a/public/audio/se/battle_anims/Dizzy Punch.mp3 b/public/audio/battle_anims/Dizzy Punch.mp3 similarity index 100% rename from public/audio/se/battle_anims/Dizzy Punch.mp3 rename to public/audio/battle_anims/Dizzy Punch.mp3 diff --git a/public/audio/se/battle_anims/Earth1.m4a b/public/audio/battle_anims/Earth1.m4a similarity index 100% rename from public/audio/se/battle_anims/Earth1.m4a rename to public/audio/battle_anims/Earth1.m4a diff --git a/public/audio/se/battle_anims/Earth3.m4a b/public/audio/battle_anims/Earth3.m4a similarity index 100% rename from public/audio/se/battle_anims/Earth3.m4a rename to public/audio/battle_anims/Earth3.m4a diff --git a/public/audio/se/battle_anims/Earth4.m4a b/public/audio/battle_anims/Earth4.m4a similarity index 100% rename from public/audio/se/battle_anims/Earth4.m4a rename to public/audio/battle_anims/Earth4.m4a diff --git a/public/audio/se/battle_anims/Earth5.m4a b/public/audio/battle_anims/Earth5.m4a similarity index 100% rename from public/audio/se/battle_anims/Earth5.m4a rename to public/audio/battle_anims/Earth5.m4a diff --git a/public/audio/se/battle_anims/Explosion.mp3 b/public/audio/battle_anims/Explosion.mp3 similarity index 100% rename from public/audio/se/battle_anims/Explosion.mp3 rename to public/audio/battle_anims/Explosion.mp3 diff --git a/public/audio/se/battle_anims/Explosion1.m4a b/public/audio/battle_anims/Explosion1.m4a similarity index 100% rename from public/audio/se/battle_anims/Explosion1.m4a rename to public/audio/battle_anims/Explosion1.m4a diff --git a/public/audio/se/battle_anims/Explosion2.m4a b/public/audio/battle_anims/Explosion2.m4a similarity index 100% rename from public/audio/se/battle_anims/Explosion2.m4a rename to public/audio/battle_anims/Explosion2.m4a diff --git a/public/audio/se/battle_anims/Explosion3.m4a b/public/audio/battle_anims/Explosion3.m4a similarity index 100% rename from public/audio/se/battle_anims/Explosion3.m4a rename to public/audio/battle_anims/Explosion3.m4a diff --git a/public/audio/se/battle_anims/Explosion4.m4a b/public/audio/battle_anims/Explosion4.m4a similarity index 100% rename from public/audio/se/battle_anims/Explosion4.m4a rename to public/audio/battle_anims/Explosion4.m4a diff --git a/public/audio/se/battle_anims/Explosion6.m4a b/public/audio/battle_anims/Explosion6.m4a similarity index 100% rename from public/audio/se/battle_anims/Explosion6.m4a rename to public/audio/battle_anims/Explosion6.m4a diff --git a/public/audio/se/battle_anims/Explosion7.m4a b/public/audio/battle_anims/Explosion7.m4a similarity index 100% rename from public/audio/se/battle_anims/Explosion7.m4a rename to public/audio/battle_anims/Explosion7.m4a diff --git a/public/audio/se/battle_anims/Fire1.m4a b/public/audio/battle_anims/Fire1.m4a similarity index 100% rename from public/audio/se/battle_anims/Fire1.m4a rename to public/audio/battle_anims/Fire1.m4a diff --git a/public/audio/se/battle_anims/Fire2.m4a b/public/audio/battle_anims/Fire2.m4a similarity index 100% rename from public/audio/se/battle_anims/Fire2.m4a rename to public/audio/battle_anims/Fire2.m4a diff --git a/public/audio/se/battle_anims/Fire3.m4a b/public/audio/battle_anims/Fire3.m4a similarity index 100% rename from public/audio/se/battle_anims/Fire3.m4a rename to public/audio/battle_anims/Fire3.m4a diff --git a/public/audio/se/battle_anims/Fire4.m4a b/public/audio/battle_anims/Fire4.m4a similarity index 100% rename from public/audio/se/battle_anims/Fire4.m4a rename to public/audio/battle_anims/Fire4.m4a diff --git a/public/audio/se/battle_anims/Fire5.m4a b/public/audio/battle_anims/Fire5.m4a similarity index 100% rename from public/audio/se/battle_anims/Fire5.m4a rename to public/audio/battle_anims/Fire5.m4a diff --git a/public/audio/se/battle_anims/Fire6.m4a b/public/audio/battle_anims/Fire6.m4a similarity index 100% rename from public/audio/se/battle_anims/Fire6.m4a rename to public/audio/battle_anims/Fire6.m4a diff --git a/public/audio/se/battle_anims/Flail.mp3 b/public/audio/battle_anims/Flail.mp3 similarity index 100% rename from public/audio/se/battle_anims/Flail.mp3 rename to public/audio/battle_anims/Flail.mp3 diff --git a/public/audio/se/battle_anims/Flash2.m4a b/public/audio/battle_anims/Flash2.m4a similarity index 100% rename from public/audio/se/battle_anims/Flash2.m4a rename to public/audio/battle_anims/Flash2.m4a diff --git a/public/audio/se/battle_anims/Follow Me.mp3 b/public/audio/battle_anims/Follow Me.mp3 similarity index 100% rename from public/audio/se/battle_anims/Follow Me.mp3 rename to public/audio/battle_anims/Follow Me.mp3 diff --git a/public/audio/se/battle_anims/Fury Swipes.m4a b/public/audio/battle_anims/Fury Swipes.m4a similarity index 100% rename from public/audio/se/battle_anims/Fury Swipes.m4a rename to public/audio/battle_anims/Fury Swipes.m4a diff --git a/public/audio/se/battle_anims/GEN8- Electricity1.wav b/public/audio/battle_anims/GEN8- Electricity1.wav similarity index 100% rename from public/audio/se/battle_anims/GEN8- Electricity1.wav rename to public/audio/battle_anims/GEN8- Electricity1.wav diff --git a/public/audio/se/battle_anims/GEN8- Exclaim.wav b/public/audio/battle_anims/GEN8- Exclaim.wav similarity index 100% rename from public/audio/se/battle_anims/GEN8- Exclaim.wav rename to public/audio/battle_anims/GEN8- Exclaim.wav diff --git a/public/audio/se/battle_anims/GEN8- Revelation Dance 1.m4a b/public/audio/battle_anims/GEN8- Revelation Dance 1.m4a similarity index 100% rename from public/audio/se/battle_anims/GEN8- Revelation Dance 1.m4a rename to public/audio/battle_anims/GEN8- Revelation Dance 1.m4a diff --git a/public/audio/se/battle_anims/GEN8- Revelation Dance 2.m4a b/public/audio/battle_anims/GEN8- Revelation Dance 2.m4a similarity index 100% rename from public/audio/se/battle_anims/GEN8- Revelation Dance 2.m4a rename to public/audio/battle_anims/GEN8- Revelation Dance 2.m4a diff --git a/public/audio/se/battle_anims/Gen8- Pyroball.wav b/public/audio/battle_anims/Gen8- Pyroball.wav similarity index 100% rename from public/audio/se/battle_anims/Gen8- Pyroball.wav rename to public/audio/battle_anims/Gen8- Pyroball.wav diff --git a/public/audio/se/battle_anims/Harden.mp3 b/public/audio/battle_anims/Harden.mp3 similarity index 100% rename from public/audio/se/battle_anims/Harden.mp3 rename to public/audio/battle_anims/Harden.mp3 diff --git a/public/audio/se/battle_anims/Ice2.m4a b/public/audio/battle_anims/Ice2.m4a similarity index 100% rename from public/audio/se/battle_anims/Ice2.m4a rename to public/audio/battle_anims/Ice2.m4a diff --git a/public/audio/se/battle_anims/Ice5.m4a b/public/audio/battle_anims/Ice5.m4a similarity index 100% rename from public/audio/se/battle_anims/Ice5.m4a rename to public/audio/battle_anims/Ice5.m4a diff --git a/public/audio/se/battle_anims/Ice8.m4a b/public/audio/battle_anims/Ice8.m4a similarity index 100% rename from public/audio/se/battle_anims/Ice8.m4a rename to public/audio/battle_anims/Ice8.m4a diff --git a/public/audio/se/battle_anims/Knock.m4a b/public/audio/battle_anims/Knock.m4a similarity index 100% rename from public/audio/se/battle_anims/Knock.m4a rename to public/audio/battle_anims/Knock.m4a diff --git a/public/audio/se/battle_anims/Lock On.mp3 b/public/audio/battle_anims/Lock On.mp3 similarity index 100% rename from public/audio/se/battle_anims/Lock On.mp3 rename to public/audio/battle_anims/Lock On.mp3 diff --git a/public/audio/se/battle_anims/Lovely Kiss.mp3 b/public/audio/battle_anims/Lovely Kiss.mp3 similarity index 100% rename from public/audio/se/battle_anims/Lovely Kiss.mp3 rename to public/audio/battle_anims/Lovely Kiss.mp3 diff --git a/public/audio/se/battle_anims/Lucky Chant.mp3 b/public/audio/battle_anims/Lucky Chant.mp3 similarity index 100% rename from public/audio/se/battle_anims/Lucky Chant.mp3 rename to public/audio/battle_anims/Lucky Chant.mp3 diff --git a/public/audio/se/battle_anims/Mega Punch.mp3 b/public/audio/battle_anims/Mega Punch.mp3 similarity index 100% rename from public/audio/se/battle_anims/Mega Punch.mp3 rename to public/audio/battle_anims/Mega Punch.mp3 diff --git a/public/audio/se/battle_anims/Metronome.mp3 b/public/audio/battle_anims/Metronome.mp3 similarity index 100% rename from public/audio/se/battle_anims/Metronome.mp3 rename to public/audio/battle_anims/Metronome.mp3 diff --git a/public/audio/se/battle_anims/MiningCollapse.mp3 b/public/audio/battle_anims/MiningCollapse.mp3 similarity index 100% rename from public/audio/se/battle_anims/MiningCollapse.mp3 rename to public/audio/battle_anims/MiningCollapse.mp3 diff --git a/public/audio/se/battle_anims/MiningPing.mp3 b/public/audio/battle_anims/MiningPing.mp3 similarity index 100% rename from public/audio/se/battle_anims/MiningPing.mp3 rename to public/audio/battle_anims/MiningPing.mp3 diff --git a/public/audio/se/battle_anims/Natural Gift.mp3 b/public/audio/battle_anims/Natural Gift.mp3 similarity index 100% rename from public/audio/se/battle_anims/Natural Gift.mp3 rename to public/audio/battle_anims/Natural Gift.mp3 diff --git a/public/audio/se/battle_anims/PRSFX- Absorb1.wav b/public/audio/battle_anims/PRSFX- Absorb1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Absorb1.wav rename to public/audio/battle_anims/PRSFX- Absorb1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Absorb2.wav b/public/audio/battle_anims/PRSFX- Absorb2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Absorb2.wav rename to public/audio/battle_anims/PRSFX- Absorb2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Accelerock1.wav b/public/audio/battle_anims/PRSFX- Accelerock1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Accelerock1.wav rename to public/audio/battle_anims/PRSFX- Accelerock1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Accelerock2.wav b/public/audio/battle_anims/PRSFX- Accelerock2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Accelerock2.wav rename to public/audio/battle_anims/PRSFX- Accelerock2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Accelerock3.wav b/public/audio/battle_anims/PRSFX- Accelerock3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Accelerock3.wav rename to public/audio/battle_anims/PRSFX- Accelerock3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acid Armor1.wav b/public/audio/battle_anims/PRSFX- Acid Armor1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acid Armor1.wav rename to public/audio/battle_anims/PRSFX- Acid Armor1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acid Armor2.wav b/public/audio/battle_anims/PRSFX- Acid Armor2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acid Armor2.wav rename to public/audio/battle_anims/PRSFX- Acid Armor2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acid Spray.wav b/public/audio/battle_anims/PRSFX- Acid Spray.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acid Spray.wav rename to public/audio/battle_anims/PRSFX- Acid Spray.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acid.wav b/public/audio/battle_anims/PRSFX- Acid.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acid.wav rename to public/audio/battle_anims/PRSFX- Acid.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acrobatics1.wav b/public/audio/battle_anims/PRSFX- Acrobatics1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acrobatics1.wav rename to public/audio/battle_anims/PRSFX- Acrobatics1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acrobatics2.wav b/public/audio/battle_anims/PRSFX- Acrobatics2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acrobatics2.wav rename to public/audio/battle_anims/PRSFX- Acrobatics2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acrobatics3.wav b/public/audio/battle_anims/PRSFX- Acrobatics3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acrobatics3.wav rename to public/audio/battle_anims/PRSFX- Acrobatics3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acupressure1.wav b/public/audio/battle_anims/PRSFX- Acupressure1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acupressure1.wav rename to public/audio/battle_anims/PRSFX- Acupressure1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Acupressure2.wav b/public/audio/battle_anims/PRSFX- Acupressure2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Acupressure2.wav rename to public/audio/battle_anims/PRSFX- Acupressure2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aerial Ace.wav b/public/audio/battle_anims/PRSFX- Aerial Ace.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aerial Ace.wav rename to public/audio/battle_anims/PRSFX- Aerial Ace.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aeroblast.wav b/public/audio/battle_anims/PRSFX- Aeroblast.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aeroblast.wav rename to public/audio/battle_anims/PRSFX- Aeroblast.wav diff --git a/public/audio/se/battle_anims/PRSFX- After You1.wav b/public/audio/battle_anims/PRSFX- After You1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- After You1.wav rename to public/audio/battle_anims/PRSFX- After You1.wav diff --git a/public/audio/se/battle_anims/PRSFX- After You2.wav b/public/audio/battle_anims/PRSFX- After You2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- After You2.wav rename to public/audio/battle_anims/PRSFX- After You2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Agility.wav b/public/audio/battle_anims/PRSFX- Agility.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Agility.wav rename to public/audio/battle_anims/PRSFX- Agility.wav diff --git a/public/audio/se/battle_anims/PRSFX- Air Cutter1.wav b/public/audio/battle_anims/PRSFX- Air Cutter1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Air Cutter1.wav rename to public/audio/battle_anims/PRSFX- Air Cutter1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Air Cutter2.wav b/public/audio/battle_anims/PRSFX- Air Cutter2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Air Cutter2.wav rename to public/audio/battle_anims/PRSFX- Air Cutter2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Air Slash1.wav b/public/audio/battle_anims/PRSFX- Air Slash1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Air Slash1.wav rename to public/audio/battle_anims/PRSFX- Air Slash1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Air Slash2.wav b/public/audio/battle_anims/PRSFX- Air Slash2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Air Slash2.wav rename to public/audio/battle_anims/PRSFX- Air Slash2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Air Slash3.wav b/public/audio/battle_anims/PRSFX- Air Slash3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Air Slash3.wav rename to public/audio/battle_anims/PRSFX- Air Slash3.wav diff --git a/public/audio/se/battle_anims/PRSFX- All Out Pummeling1.wav b/public/audio/battle_anims/PRSFX- All Out Pummeling1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- All Out Pummeling1.wav rename to public/audio/battle_anims/PRSFX- All Out Pummeling1.wav diff --git a/public/audio/se/battle_anims/PRSFX- All Out Pummeling2.wav b/public/audio/battle_anims/PRSFX- All Out Pummeling2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- All Out Pummeling2.wav rename to public/audio/battle_anims/PRSFX- All Out Pummeling2.wav diff --git a/public/audio/se/battle_anims/PRSFX- All Out Pummeling3.wav b/public/audio/battle_anims/PRSFX- All Out Pummeling3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- All Out Pummeling3.wav rename to public/audio/battle_anims/PRSFX- All Out Pummeling3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ally Switch.wav b/public/audio/battle_anims/PRSFX- Ally Switch.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ally Switch.wav rename to public/audio/battle_anims/PRSFX- Ally Switch.wav diff --git a/public/audio/se/battle_anims/PRSFX- Amnesia.wav b/public/audio/battle_anims/PRSFX- Amnesia.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Amnesia.wav rename to public/audio/battle_anims/PRSFX- Amnesia.wav diff --git a/public/audio/se/battle_anims/PRSFX- Anchor Shot.wav b/public/audio/battle_anims/PRSFX- Anchor Shot.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Anchor Shot.wav rename to public/audio/battle_anims/PRSFX- Anchor Shot.wav diff --git a/public/audio/se/battle_anims/PRSFX- Anchor Shot1.wav b/public/audio/battle_anims/PRSFX- Anchor Shot1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Anchor Shot1.wav rename to public/audio/battle_anims/PRSFX- Anchor Shot1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Anchor Shot2.wav b/public/audio/battle_anims/PRSFX- Anchor Shot2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Anchor Shot2.wav rename to public/audio/battle_anims/PRSFX- Anchor Shot2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ancient Power1.wav b/public/audio/battle_anims/PRSFX- Ancient Power1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ancient Power1.wav rename to public/audio/battle_anims/PRSFX- Ancient Power1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ancient Power2.wav b/public/audio/battle_anims/PRSFX- Ancient Power2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ancient Power2.wav rename to public/audio/battle_anims/PRSFX- Ancient Power2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aqua Jet.wav b/public/audio/battle_anims/PRSFX- Aqua Jet.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aqua Jet.wav rename to public/audio/battle_anims/PRSFX- Aqua Jet.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aqua Ring1.wav b/public/audio/battle_anims/PRSFX- Aqua Ring1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aqua Ring1.wav rename to public/audio/battle_anims/PRSFX- Aqua Ring1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aqua Ring2.wav b/public/audio/battle_anims/PRSFX- Aqua Ring2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aqua Ring2.wav rename to public/audio/battle_anims/PRSFX- Aqua Ring2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aqua Tail.wav b/public/audio/battle_anims/PRSFX- Aqua Tail.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aqua Tail.wav rename to public/audio/battle_anims/PRSFX- Aqua Tail.wav diff --git a/public/audio/se/battle_anims/PRSFX- Arm Thrust.wav b/public/audio/battle_anims/PRSFX- Arm Thrust.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Arm Thrust.wav rename to public/audio/battle_anims/PRSFX- Arm Thrust.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aromatherapy.wav b/public/audio/battle_anims/PRSFX- Aromatherapy.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aromatherapy.wav rename to public/audio/battle_anims/PRSFX- Aromatherapy.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aromatic Mist.wav b/public/audio/battle_anims/PRSFX- Aromatic Mist.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aromatic Mist.wav rename to public/audio/battle_anims/PRSFX- Aromatic Mist.wav diff --git a/public/audio/se/battle_anims/PRSFX- Assist.wav b/public/audio/battle_anims/PRSFX- Assist.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Assist.wav rename to public/audio/battle_anims/PRSFX- Assist.wav diff --git a/public/audio/se/battle_anims/PRSFX- Assurance.wav b/public/audio/battle_anims/PRSFX- Assurance.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Assurance.wav rename to public/audio/battle_anims/PRSFX- Assurance.wav diff --git a/public/audio/se/battle_anims/PRSFX- Astonish1.wav b/public/audio/battle_anims/PRSFX- Astonish1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Astonish1.wav rename to public/audio/battle_anims/PRSFX- Astonish1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Astonish2.wav b/public/audio/battle_anims/PRSFX- Astonish2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Astonish2.wav rename to public/audio/battle_anims/PRSFX- Astonish2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Attack Order1.wav b/public/audio/battle_anims/PRSFX- Attack Order1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Attack Order1.wav rename to public/audio/battle_anims/PRSFX- Attack Order1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Attack Order2.wav b/public/audio/battle_anims/PRSFX- Attack Order2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Attack Order2.wav rename to public/audio/battle_anims/PRSFX- Attack Order2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Attract.wav b/public/audio/battle_anims/PRSFX- Attract.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Attract.wav rename to public/audio/battle_anims/PRSFX- Attract.wav diff --git a/public/audio/se/battle_anims/PRSFX- Attract1.wav b/public/audio/battle_anims/PRSFX- Attract1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Attract1.wav rename to public/audio/battle_anims/PRSFX- Attract1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Attract2.wav b/public/audio/battle_anims/PRSFX- Attract2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Attract2.wav rename to public/audio/battle_anims/PRSFX- Attract2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aura Sphere1.wav b/public/audio/battle_anims/PRSFX- Aura Sphere1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aura Sphere1.wav rename to public/audio/battle_anims/PRSFX- Aura Sphere1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aura Sphere2.wav b/public/audio/battle_anims/PRSFX- Aura Sphere2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aura Sphere2.wav rename to public/audio/battle_anims/PRSFX- Aura Sphere2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aurora Beam.wav b/public/audio/battle_anims/PRSFX- Aurora Beam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aurora Beam.wav rename to public/audio/battle_anims/PRSFX- Aurora Beam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aurora Veil1.wav b/public/audio/battle_anims/PRSFX- Aurora Veil1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aurora Veil1.wav rename to public/audio/battle_anims/PRSFX- Aurora Veil1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aurora Veil2.wav b/public/audio/battle_anims/PRSFX- Aurora Veil2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aurora Veil2.wav rename to public/audio/battle_anims/PRSFX- Aurora Veil2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aurora Veil3.wav b/public/audio/battle_anims/PRSFX- Aurora Veil3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aurora Veil3.wav rename to public/audio/battle_anims/PRSFX- Aurora Veil3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Aurora Veil4.wav b/public/audio/battle_anims/PRSFX- Aurora Veil4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Aurora Veil4.wav rename to public/audio/battle_anims/PRSFX- Aurora Veil4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Autotomize.wav b/public/audio/battle_anims/PRSFX- Autotomize.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Autotomize.wav rename to public/audio/battle_anims/PRSFX- Autotomize.wav diff --git a/public/audio/se/battle_anims/PRSFX- Autotomize1.mp3 b/public/audio/battle_anims/PRSFX- Autotomize1.mp3 similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Autotomize1.mp3 rename to public/audio/battle_anims/PRSFX- Autotomize1.mp3 diff --git a/public/audio/se/battle_anims/PRSFX- Autotomize2.wav b/public/audio/battle_anims/PRSFX- Autotomize2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Autotomize2.wav rename to public/audio/battle_anims/PRSFX- Autotomize2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Avalanche.wav b/public/audio/battle_anims/PRSFX- Avalanche.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Avalanche.wav rename to public/audio/battle_anims/PRSFX- Avalanche.wav diff --git a/public/audio/se/battle_anims/PRSFX- Baby Doll Eyes.wav b/public/audio/battle_anims/PRSFX- Baby Doll Eyes.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Baby Doll Eyes.wav rename to public/audio/battle_anims/PRSFX- Baby Doll Eyes.wav diff --git a/public/audio/se/battle_anims/PRSFX- Baneful Bunker1.wav b/public/audio/battle_anims/PRSFX- Baneful Bunker1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Baneful Bunker1.wav rename to public/audio/battle_anims/PRSFX- Baneful Bunker1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Baneful Bunker2.wav b/public/audio/battle_anims/PRSFX- Baneful Bunker2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Baneful Bunker2.wav rename to public/audio/battle_anims/PRSFX- Baneful Bunker2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Baneful Bunker3.wav b/public/audio/battle_anims/PRSFX- Baneful Bunker3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Baneful Bunker3.wav rename to public/audio/battle_anims/PRSFX- Baneful Bunker3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Barrage1.wav b/public/audio/battle_anims/PRSFX- Barrage1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Barrage1.wav rename to public/audio/battle_anims/PRSFX- Barrage1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Barrage2.wav b/public/audio/battle_anims/PRSFX- Barrage2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Barrage2.wav rename to public/audio/battle_anims/PRSFX- Barrage2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Barrier.wav b/public/audio/battle_anims/PRSFX- Barrier.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Barrier.wav rename to public/audio/battle_anims/PRSFX- Barrier.wav diff --git a/public/audio/se/battle_anims/PRSFX- Baton Pass1.wav b/public/audio/battle_anims/PRSFX- Baton Pass1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Baton Pass1.wav rename to public/audio/battle_anims/PRSFX- Baton Pass1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Baton Pass2.wav b/public/audio/battle_anims/PRSFX- Baton Pass2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Baton Pass2.wav rename to public/audio/battle_anims/PRSFX- Baton Pass2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Beak Blast1.wav b/public/audio/battle_anims/PRSFX- Beak Blast1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Beak Blast1.wav rename to public/audio/battle_anims/PRSFX- Beak Blast1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Beak Blast2.wav b/public/audio/battle_anims/PRSFX- Beak Blast2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Beak Blast2.wav rename to public/audio/battle_anims/PRSFX- Beak Blast2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Beak Blast3.wav b/public/audio/battle_anims/PRSFX- Beak Blast3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Beak Blast3.wav rename to public/audio/battle_anims/PRSFX- Beak Blast3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Beak Blast4.wav b/public/audio/battle_anims/PRSFX- Beak Blast4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Beak Blast4.wav rename to public/audio/battle_anims/PRSFX- Beak Blast4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Beat Up.wav b/public/audio/battle_anims/PRSFX- Beat Up.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Beat Up.wav rename to public/audio/battle_anims/PRSFX- Beat Up.wav diff --git a/public/audio/se/battle_anims/PRSFX- Belch1.wav b/public/audio/battle_anims/PRSFX- Belch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Belch1.wav rename to public/audio/battle_anims/PRSFX- Belch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Belch2.wav b/public/audio/battle_anims/PRSFX- Belch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Belch2.wav rename to public/audio/battle_anims/PRSFX- Belch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Belch3.wav b/public/audio/battle_anims/PRSFX- Belch3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Belch3.wav rename to public/audio/battle_anims/PRSFX- Belch3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Belly Drum.wav b/public/audio/battle_anims/PRSFX- Belly Drum.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Belly Drum.wav rename to public/audio/battle_anims/PRSFX- Belly Drum.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bestow1.wav b/public/audio/battle_anims/PRSFX- Bestow1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bestow1.wav rename to public/audio/battle_anims/PRSFX- Bestow1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bestow2.wav b/public/audio/battle_anims/PRSFX- Bestow2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bestow2.wav rename to public/audio/battle_anims/PRSFX- Bestow2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bide1.wav b/public/audio/battle_anims/PRSFX- Bide1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bide1.wav rename to public/audio/battle_anims/PRSFX- Bide1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bide2.wav b/public/audio/battle_anims/PRSFX- Bide2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bide2.wav rename to public/audio/battle_anims/PRSFX- Bide2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bind.wav b/public/audio/battle_anims/PRSFX- Bind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bind.wav rename to public/audio/battle_anims/PRSFX- Bind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bite.wav b/public/audio/battle_anims/PRSFX- Bite.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bite.wav rename to public/audio/battle_anims/PRSFX- Bite.wav diff --git a/public/audio/se/battle_anims/PRSFX- Black Hole Eclipse1.wav b/public/audio/battle_anims/PRSFX- Black Hole Eclipse1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Black Hole Eclipse1.wav rename to public/audio/battle_anims/PRSFX- Black Hole Eclipse1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Black Hole Eclipse2.wav b/public/audio/battle_anims/PRSFX- Black Hole Eclipse2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Black Hole Eclipse2.wav rename to public/audio/battle_anims/PRSFX- Black Hole Eclipse2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Black Hole Eclipse3.wav b/public/audio/battle_anims/PRSFX- Black Hole Eclipse3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Black Hole Eclipse3.wav rename to public/audio/battle_anims/PRSFX- Black Hole Eclipse3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Black Hole Eclipse4.wav b/public/audio/battle_anims/PRSFX- Black Hole Eclipse4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Black Hole Eclipse4.wav rename to public/audio/battle_anims/PRSFX- Black Hole Eclipse4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Blast Burn.wav b/public/audio/battle_anims/PRSFX- Blast Burn.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Blast Burn.wav rename to public/audio/battle_anims/PRSFX- Blast Burn.wav diff --git a/public/audio/se/battle_anims/PRSFX- Blast Burn2.wav b/public/audio/battle_anims/PRSFX- Blast Burn2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Blast Burn2.wav rename to public/audio/battle_anims/PRSFX- Blast Burn2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Blast Burn3.wav b/public/audio/battle_anims/PRSFX- Blast Burn3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Blast Burn3.wav rename to public/audio/battle_anims/PRSFX- Blast Burn3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Blaze Kick1.wav b/public/audio/battle_anims/PRSFX- Blaze Kick1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Blaze Kick1.wav rename to public/audio/battle_anims/PRSFX- Blaze Kick1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Blaze Kick2.wav b/public/audio/battle_anims/PRSFX- Blaze Kick2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Blaze Kick2.wav rename to public/audio/battle_anims/PRSFX- Blaze Kick2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Blizzard.wav b/public/audio/battle_anims/PRSFX- Blizzard.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Blizzard.wav rename to public/audio/battle_anims/PRSFX- Blizzard.wav diff --git a/public/audio/se/battle_anims/PRSFX- Block.wav b/public/audio/battle_anims/PRSFX- Block.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Block.wav rename to public/audio/battle_anims/PRSFX- Block.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bloom Doom1.wav b/public/audio/battle_anims/PRSFX- Bloom Doom1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bloom Doom1.wav rename to public/audio/battle_anims/PRSFX- Bloom Doom1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bloom Doom2.wav b/public/audio/battle_anims/PRSFX- Bloom Doom2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bloom Doom2.wav rename to public/audio/battle_anims/PRSFX- Bloom Doom2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bloom Doom3.wav b/public/audio/battle_anims/PRSFX- Bloom Doom3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bloom Doom3.wav rename to public/audio/battle_anims/PRSFX- Bloom Doom3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Blue Flare1.wav b/public/audio/battle_anims/PRSFX- Blue Flare1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Blue Flare1.wav rename to public/audio/battle_anims/PRSFX- Blue Flare1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Blue Flare2.wav b/public/audio/battle_anims/PRSFX- Blue Flare2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Blue Flare2.wav rename to public/audio/battle_anims/PRSFX- Blue Flare2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Body Slam1.wav b/public/audio/battle_anims/PRSFX- Body Slam1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Body Slam1.wav rename to public/audio/battle_anims/PRSFX- Body Slam1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Body Slam2.wav b/public/audio/battle_anims/PRSFX- Body Slam2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Body Slam2.wav rename to public/audio/battle_anims/PRSFX- Body Slam2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bolt Strike1.wav b/public/audio/battle_anims/PRSFX- Bolt Strike1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bolt Strike1.wav rename to public/audio/battle_anims/PRSFX- Bolt Strike1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bolt Strike2.wav b/public/audio/battle_anims/PRSFX- Bolt Strike2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bolt Strike2.wav rename to public/audio/battle_anims/PRSFX- Bolt Strike2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bone Club1.wav b/public/audio/battle_anims/PRSFX- Bone Club1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bone Club1.wav rename to public/audio/battle_anims/PRSFX- Bone Club1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bone Club2.wav b/public/audio/battle_anims/PRSFX- Bone Club2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bone Club2.wav rename to public/audio/battle_anims/PRSFX- Bone Club2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bone Rush1.wav b/public/audio/battle_anims/PRSFX- Bone Rush1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bone Rush1.wav rename to public/audio/battle_anims/PRSFX- Bone Rush1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bone Rush2.wav b/public/audio/battle_anims/PRSFX- Bone Rush2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bone Rush2.wav rename to public/audio/battle_anims/PRSFX- Bone Rush2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bonemerang1.wav b/public/audio/battle_anims/PRSFX- Bonemerang1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bonemerang1.wav rename to public/audio/battle_anims/PRSFX- Bonemerang1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bonemerang2.wav b/public/audio/battle_anims/PRSFX- Bonemerang2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bonemerang2.wav rename to public/audio/battle_anims/PRSFX- Bonemerang2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Boomburst.wav b/public/audio/battle_anims/PRSFX- Boomburst.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Boomburst.wav rename to public/audio/battle_anims/PRSFX- Boomburst.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bounce1.wav b/public/audio/battle_anims/PRSFX- Bounce1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bounce1.wav rename to public/audio/battle_anims/PRSFX- Bounce1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bounce2.wav b/public/audio/battle_anims/PRSFX- Bounce2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bounce2.wav rename to public/audio/battle_anims/PRSFX- Bounce2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bounce3.wav b/public/audio/battle_anims/PRSFX- Bounce3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bounce3.wav rename to public/audio/battle_anims/PRSFX- Bounce3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bounce4.wav b/public/audio/battle_anims/PRSFX- Bounce4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bounce4.wav rename to public/audio/battle_anims/PRSFX- Bounce4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Brave Bird1.wav b/public/audio/battle_anims/PRSFX- Brave Bird1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Brave Bird1.wav rename to public/audio/battle_anims/PRSFX- Brave Bird1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Brave Bird2.wav b/public/audio/battle_anims/PRSFX- Brave Bird2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Brave Bird2.wav rename to public/audio/battle_anims/PRSFX- Brave Bird2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Brick Break1.wav b/public/audio/battle_anims/PRSFX- Brick Break1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Brick Break1.wav rename to public/audio/battle_anims/PRSFX- Brick Break1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Brick Break2.wav b/public/audio/battle_anims/PRSFX- Brick Break2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Brick Break2.wav rename to public/audio/battle_anims/PRSFX- Brick Break2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Brine.wav b/public/audio/battle_anims/PRSFX- Brine.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Brine.wav rename to public/audio/battle_anims/PRSFX- Brine.wav diff --git a/public/audio/se/battle_anims/PRSFX- Brutal Swing1.wav b/public/audio/battle_anims/PRSFX- Brutal Swing1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Brutal Swing1.wav rename to public/audio/battle_anims/PRSFX- Brutal Swing1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Brutal Swing2.wav b/public/audio/battle_anims/PRSFX- Brutal Swing2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Brutal Swing2.wav rename to public/audio/battle_anims/PRSFX- Brutal Swing2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Brutal Swing3.wav b/public/audio/battle_anims/PRSFX- Brutal Swing3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Brutal Swing3.wav rename to public/audio/battle_anims/PRSFX- Brutal Swing3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bubble.wav b/public/audio/battle_anims/PRSFX- Bubble.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bubble.wav rename to public/audio/battle_anims/PRSFX- Bubble.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bubblebeam.wav b/public/audio/battle_anims/PRSFX- Bubblebeam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bubblebeam.wav rename to public/audio/battle_anims/PRSFX- Bubblebeam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bug Bite.wav b/public/audio/battle_anims/PRSFX- Bug Bite.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bug Bite.wav rename to public/audio/battle_anims/PRSFX- Bug Bite.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bug Buzz.wav b/public/audio/battle_anims/PRSFX- Bug Buzz.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bug Buzz.wav rename to public/audio/battle_anims/PRSFX- Bug Buzz.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bulk Up1.wav b/public/audio/battle_anims/PRSFX- Bulk Up1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bulk Up1.wav rename to public/audio/battle_anims/PRSFX- Bulk Up1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bulk Up2.wav b/public/audio/battle_anims/PRSFX- Bulk Up2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bulk Up2.wav rename to public/audio/battle_anims/PRSFX- Bulk Up2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bulldoze.wav b/public/audio/battle_anims/PRSFX- Bulldoze.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bulldoze.wav rename to public/audio/battle_anims/PRSFX- Bulldoze.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bullet Punch.wav b/public/audio/battle_anims/PRSFX- Bullet Punch.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bullet Punch.wav rename to public/audio/battle_anims/PRSFX- Bullet Punch.wav diff --git a/public/audio/se/battle_anims/PRSFX- Bullet Seed.wav b/public/audio/battle_anims/PRSFX- Bullet Seed.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Bullet Seed.wav rename to public/audio/battle_anims/PRSFX- Bullet Seed.wav diff --git a/public/audio/se/battle_anims/PRSFX- Burn Up1.wav b/public/audio/battle_anims/PRSFX- Burn Up1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Burn Up1.wav rename to public/audio/battle_anims/PRSFX- Burn Up1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Burn Up2.wav b/public/audio/battle_anims/PRSFX- Burn Up2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Burn Up2.wav rename to public/audio/battle_anims/PRSFX- Burn Up2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Burn.wav b/public/audio/battle_anims/PRSFX- Burn.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Burn.wav rename to public/audio/battle_anims/PRSFX- Burn.wav diff --git a/public/audio/se/battle_anims/PRSFX- Calm Mind.wav b/public/audio/battle_anims/PRSFX- Calm Mind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Calm Mind.wav rename to public/audio/battle_anims/PRSFX- Calm Mind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Camouflage.wav b/public/audio/battle_anims/PRSFX- Camouflage.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Camouflage.wav rename to public/audio/battle_anims/PRSFX- Camouflage.wav diff --git a/public/audio/se/battle_anims/PRSFX- Captivate.wav b/public/audio/battle_anims/PRSFX- Captivate.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Captivate.wav rename to public/audio/battle_anims/PRSFX- Captivate.wav diff --git a/public/audio/se/battle_anims/PRSFX- Catastropika1.wav b/public/audio/battle_anims/PRSFX- Catastropika1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Catastropika1.wav rename to public/audio/battle_anims/PRSFX- Catastropika1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Catastropika2.wav b/public/audio/battle_anims/PRSFX- Catastropika2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Catastropika2.wav rename to public/audio/battle_anims/PRSFX- Catastropika2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Catastropika3.wav b/public/audio/battle_anims/PRSFX- Catastropika3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Catastropika3.wav rename to public/audio/battle_anims/PRSFX- Catastropika3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Catastropika4.wav b/public/audio/battle_anims/PRSFX- Catastropika4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Catastropika4.wav rename to public/audio/battle_anims/PRSFX- Catastropika4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Catastropika5.wav b/public/audio/battle_anims/PRSFX- Catastropika5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Catastropika5.wav rename to public/audio/battle_anims/PRSFX- Catastropika5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Catastropika6.wav b/public/audio/battle_anims/PRSFX- Catastropika6.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Catastropika6.wav rename to public/audio/battle_anims/PRSFX- Catastropika6.wav diff --git a/public/audio/se/battle_anims/PRSFX- Charge Beam.wav b/public/audio/battle_anims/PRSFX- Charge Beam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Charge Beam.wav rename to public/audio/battle_anims/PRSFX- Charge Beam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Charge.wav b/public/audio/battle_anims/PRSFX- Charge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Charge.wav rename to public/audio/battle_anims/PRSFX- Charge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Charm.wav b/public/audio/battle_anims/PRSFX- Charm.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Charm.wav rename to public/audio/battle_anims/PRSFX- Charm.wav diff --git a/public/audio/se/battle_anims/PRSFX- Chatter.wav b/public/audio/battle_anims/PRSFX- Chatter.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Chatter.wav rename to public/audio/battle_anims/PRSFX- Chatter.wav diff --git a/public/audio/se/battle_anims/PRSFX- Chip Away.wav b/public/audio/battle_anims/PRSFX- Chip Away.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Chip Away.wav rename to public/audio/battle_anims/PRSFX- Chip Away.wav diff --git a/public/audio/se/battle_anims/PRSFX- Circle Throw1.wav b/public/audio/battle_anims/PRSFX- Circle Throw1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Circle Throw1.wav rename to public/audio/battle_anims/PRSFX- Circle Throw1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Circle Throw2.wav b/public/audio/battle_anims/PRSFX- Circle Throw2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Circle Throw2.wav rename to public/audio/battle_anims/PRSFX- Circle Throw2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Clamp1.wav b/public/audio/battle_anims/PRSFX- Clamp1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Clamp1.wav rename to public/audio/battle_anims/PRSFX- Clamp1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Clamp2.wav b/public/audio/battle_anims/PRSFX- Clamp2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Clamp2.wav rename to public/audio/battle_anims/PRSFX- Clamp2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Clamp3.wav b/public/audio/battle_anims/PRSFX- Clamp3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Clamp3.wav rename to public/audio/battle_anims/PRSFX- Clamp3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Clear Smog.wav b/public/audio/battle_anims/PRSFX- Clear Smog.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Clear Smog.wav rename to public/audio/battle_anims/PRSFX- Clear Smog.wav diff --git a/public/audio/se/battle_anims/PRSFX- Close Combat.wav b/public/audio/battle_anims/PRSFX- Close Combat.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Close Combat.wav rename to public/audio/battle_anims/PRSFX- Close Combat.wav diff --git a/public/audio/se/battle_anims/PRSFX- Coil.wav b/public/audio/battle_anims/PRSFX- Coil.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Coil.wav rename to public/audio/battle_anims/PRSFX- Coil.wav diff --git a/public/audio/se/battle_anims/PRSFX- Comet Punch.wav b/public/audio/battle_anims/PRSFX- Comet Punch.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Comet Punch.wav rename to public/audio/battle_anims/PRSFX- Comet Punch.wav diff --git a/public/audio/se/battle_anims/PRSFX- Confide.wav b/public/audio/battle_anims/PRSFX- Confide.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Confide.wav rename to public/audio/battle_anims/PRSFX- Confide.wav diff --git a/public/audio/se/battle_anims/PRSFX- Confuse Ray.wav b/public/audio/battle_anims/PRSFX- Confuse Ray.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Confuse Ray.wav rename to public/audio/battle_anims/PRSFX- Confuse Ray.wav diff --git a/public/audio/se/battle_anims/PRSFX- Confused.wav b/public/audio/battle_anims/PRSFX- Confused.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Confused.wav rename to public/audio/battle_anims/PRSFX- Confused.wav diff --git a/public/audio/se/battle_anims/PRSFX- Confusion.wav b/public/audio/battle_anims/PRSFX- Confusion.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Confusion.wav rename to public/audio/battle_anims/PRSFX- Confusion.wav diff --git a/public/audio/se/battle_anims/PRSFX- Constrict.wav b/public/audio/battle_anims/PRSFX- Constrict.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Constrict.wav rename to public/audio/battle_anims/PRSFX- Constrict.wav diff --git a/public/audio/se/battle_anims/PRSFX- Conversion.wav b/public/audio/battle_anims/PRSFX- Conversion.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Conversion.wav rename to public/audio/battle_anims/PRSFX- Conversion.wav diff --git a/public/audio/se/battle_anims/PRSFX- Conversion2.wav b/public/audio/battle_anims/PRSFX- Conversion2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Conversion2.wav rename to public/audio/battle_anims/PRSFX- Conversion2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Cosmic Power.wav b/public/audio/battle_anims/PRSFX- Cosmic Power.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Cosmic Power.wav rename to public/audio/battle_anims/PRSFX- Cosmic Power.wav diff --git a/public/audio/se/battle_anims/PRSFX- Cotton Guard.wav b/public/audio/battle_anims/PRSFX- Cotton Guard.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Cotton Guard.wav rename to public/audio/battle_anims/PRSFX- Cotton Guard.wav diff --git a/public/audio/se/battle_anims/PRSFX- Cotton Spore.wav b/public/audio/battle_anims/PRSFX- Cotton Spore.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Cotton Spore.wav rename to public/audio/battle_anims/PRSFX- Cotton Spore.wav diff --git a/public/audio/se/battle_anims/PRSFX- Counter1.wav b/public/audio/battle_anims/PRSFX- Counter1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Counter1.wav rename to public/audio/battle_anims/PRSFX- Counter1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Counter2.wav b/public/audio/battle_anims/PRSFX- Counter2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Counter2.wav rename to public/audio/battle_anims/PRSFX- Counter2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Covet1.wav b/public/audio/battle_anims/PRSFX- Covet1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Covet1.wav rename to public/audio/battle_anims/PRSFX- Covet1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Covet2.wav b/public/audio/battle_anims/PRSFX- Covet2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Covet2.wav rename to public/audio/battle_anims/PRSFX- Covet2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Crabhammer.wav b/public/audio/battle_anims/PRSFX- Crabhammer.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Crabhammer.wav rename to public/audio/battle_anims/PRSFX- Crabhammer.wav diff --git a/public/audio/se/battle_anims/PRSFX- Crafty Shield.wav b/public/audio/battle_anims/PRSFX- Crafty Shield.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Crafty Shield.wav rename to public/audio/battle_anims/PRSFX- Crafty Shield.wav diff --git a/public/audio/se/battle_anims/PRSFX- Cross Chop1.wav b/public/audio/battle_anims/PRSFX- Cross Chop1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Cross Chop1.wav rename to public/audio/battle_anims/PRSFX- Cross Chop1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Cross Chop2.wav b/public/audio/battle_anims/PRSFX- Cross Chop2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Cross Chop2.wav rename to public/audio/battle_anims/PRSFX- Cross Chop2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Cross Poison1.wav b/public/audio/battle_anims/PRSFX- Cross Poison1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Cross Poison1.wav rename to public/audio/battle_anims/PRSFX- Cross Poison1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Cross Poison2.wav b/public/audio/battle_anims/PRSFX- Cross Poison2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Cross Poison2.wav rename to public/audio/battle_anims/PRSFX- Cross Poison2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Crunch.wav b/public/audio/battle_anims/PRSFX- Crunch.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Crunch.wav rename to public/audio/battle_anims/PRSFX- Crunch.wav diff --git a/public/audio/se/battle_anims/PRSFX- Crush Claw.wav b/public/audio/battle_anims/PRSFX- Crush Claw.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Crush Claw.wav rename to public/audio/battle_anims/PRSFX- Crush Claw.wav diff --git a/public/audio/se/battle_anims/PRSFX- Crush Grip1.wav b/public/audio/battle_anims/PRSFX- Crush Grip1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Crush Grip1.wav rename to public/audio/battle_anims/PRSFX- Crush Grip1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Crush Grip2.wav b/public/audio/battle_anims/PRSFX- Crush Grip2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Crush Grip2.wav rename to public/audio/battle_anims/PRSFX- Crush Grip2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Curse.wav b/public/audio/battle_anims/PRSFX- Curse.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Curse.wav rename to public/audio/battle_anims/PRSFX- Curse.wav diff --git a/public/audio/se/battle_anims/PRSFX- Curse2.wav b/public/audio/battle_anims/PRSFX- Curse2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Curse2.wav rename to public/audio/battle_anims/PRSFX- Curse2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Cut.wav b/public/audio/battle_anims/PRSFX- Cut.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Cut.wav rename to public/audio/battle_anims/PRSFX- Cut.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dark Pulse1.wav b/public/audio/battle_anims/PRSFX- Dark Pulse1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dark Pulse1.wav rename to public/audio/battle_anims/PRSFX- Dark Pulse1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dark Pulse2.wav b/public/audio/battle_anims/PRSFX- Dark Pulse2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dark Pulse2.wav rename to public/audio/battle_anims/PRSFX- Dark Pulse2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dark Void.wav b/public/audio/battle_anims/PRSFX- Dark Void.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dark Void.wav rename to public/audio/battle_anims/PRSFX- Dark Void.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dazzling Gleam.wav b/public/audio/battle_anims/PRSFX- Dazzling Gleam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dazzling Gleam.wav rename to public/audio/battle_anims/PRSFX- Dazzling Gleam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Defend Order1.wav b/public/audio/battle_anims/PRSFX- Defend Order1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Defend Order1.wav rename to public/audio/battle_anims/PRSFX- Defend Order1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Defend Order2.wav b/public/audio/battle_anims/PRSFX- Defend Order2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Defend Order2.wav rename to public/audio/battle_anims/PRSFX- Defend Order2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Defense Curl1.wav b/public/audio/battle_anims/PRSFX- Defense Curl1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Defense Curl1.wav rename to public/audio/battle_anims/PRSFX- Defense Curl1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Defense Curl2.wav b/public/audio/battle_anims/PRSFX- Defense Curl2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Defense Curl2.wav rename to public/audio/battle_anims/PRSFX- Defense Curl2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Defog.wav b/public/audio/battle_anims/PRSFX- Defog.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Defog.wav rename to public/audio/battle_anims/PRSFX- Defog.wav diff --git a/public/audio/se/battle_anims/PRSFX- Destiny Bond1.wav b/public/audio/battle_anims/PRSFX- Destiny Bond1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Destiny Bond1.wav rename to public/audio/battle_anims/PRSFX- Destiny Bond1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Destiny Bond2.wav b/public/audio/battle_anims/PRSFX- Destiny Bond2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Destiny Bond2.wav rename to public/audio/battle_anims/PRSFX- Destiny Bond2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Detect.wav b/public/audio/battle_anims/PRSFX- Detect.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Detect.wav rename to public/audio/battle_anims/PRSFX- Detect.wav diff --git a/public/audio/se/battle_anims/PRSFX- Devastating Drake1.wav b/public/audio/battle_anims/PRSFX- Devastating Drake1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Devastating Drake1.wav rename to public/audio/battle_anims/PRSFX- Devastating Drake1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Devastating Drake2.wav b/public/audio/battle_anims/PRSFX- Devastating Drake2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Devastating Drake2.wav rename to public/audio/battle_anims/PRSFX- Devastating Drake2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Devastating Drake3.wav b/public/audio/battle_anims/PRSFX- Devastating Drake3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Devastating Drake3.wav rename to public/audio/battle_anims/PRSFX- Devastating Drake3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Diamond Storm1.wav b/public/audio/battle_anims/PRSFX- Diamond Storm1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Diamond Storm1.wav rename to public/audio/battle_anims/PRSFX- Diamond Storm1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Diamond Storm2.wav b/public/audio/battle_anims/PRSFX- Diamond Storm2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Diamond Storm2.wav rename to public/audio/battle_anims/PRSFX- Diamond Storm2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dig1.wav b/public/audio/battle_anims/PRSFX- Dig1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dig1.wav rename to public/audio/battle_anims/PRSFX- Dig1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dig2.wav b/public/audio/battle_anims/PRSFX- Dig2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dig2.wav rename to public/audio/battle_anims/PRSFX- Dig2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Disable.wav b/public/audio/battle_anims/PRSFX- Disable.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Disable.wav rename to public/audio/battle_anims/PRSFX- Disable.wav diff --git a/public/audio/se/battle_anims/PRSFX- Discharge.wav b/public/audio/battle_anims/PRSFX- Discharge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Discharge.wav rename to public/audio/battle_anims/PRSFX- Discharge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dive1.wav b/public/audio/battle_anims/PRSFX- Dive1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dive1.wav rename to public/audio/battle_anims/PRSFX- Dive1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dive2.wav b/public/audio/battle_anims/PRSFX- Dive2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dive2.wav rename to public/audio/battle_anims/PRSFX- Dive2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dive3.wav b/public/audio/battle_anims/PRSFX- Dive3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dive3.wav rename to public/audio/battle_anims/PRSFX- Dive3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dizzy Punch1.wav b/public/audio/battle_anims/PRSFX- Dizzy Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dizzy Punch1.wav rename to public/audio/battle_anims/PRSFX- Dizzy Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dizzy Punch2.wav b/public/audio/battle_anims/PRSFX- Dizzy Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dizzy Punch2.wav rename to public/audio/battle_anims/PRSFX- Dizzy Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Doom Desire1.wav b/public/audio/battle_anims/PRSFX- Doom Desire1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Doom Desire1.wav rename to public/audio/battle_anims/PRSFX- Doom Desire1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Doom Desire2.wav b/public/audio/battle_anims/PRSFX- Doom Desire2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Doom Desire2.wav rename to public/audio/battle_anims/PRSFX- Doom Desire2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Double Edge1.wav b/public/audio/battle_anims/PRSFX- Double Edge1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Double Edge1.wav rename to public/audio/battle_anims/PRSFX- Double Edge1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Double Edge2.wav b/public/audio/battle_anims/PRSFX- Double Edge2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Double Edge2.wav rename to public/audio/battle_anims/PRSFX- Double Edge2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Double Hit.wav b/public/audio/battle_anims/PRSFX- Double Hit.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Double Hit.wav rename to public/audio/battle_anims/PRSFX- Double Hit.wav diff --git a/public/audio/se/battle_anims/PRSFX- Double Kick.wav b/public/audio/battle_anims/PRSFX- Double Kick.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Double Kick.wav rename to public/audio/battle_anims/PRSFX- Double Kick.wav diff --git a/public/audio/se/battle_anims/PRSFX- Double Slap.wav b/public/audio/battle_anims/PRSFX- Double Slap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Double Slap.wav rename to public/audio/battle_anims/PRSFX- Double Slap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Double Team.wav b/public/audio/battle_anims/PRSFX- Double Team.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Double Team.wav rename to public/audio/battle_anims/PRSFX- Double Team.wav diff --git a/public/audio/se/battle_anims/PRSFX- Draco Meteor1.wav b/public/audio/battle_anims/PRSFX- Draco Meteor1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Draco Meteor1.wav rename to public/audio/battle_anims/PRSFX- Draco Meteor1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Draco Meteor2.wav b/public/audio/battle_anims/PRSFX- Draco Meteor2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Draco Meteor2.wav rename to public/audio/battle_anims/PRSFX- Draco Meteor2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Draco Meteor3.wav b/public/audio/battle_anims/PRSFX- Draco Meteor3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Draco Meteor3.wav rename to public/audio/battle_anims/PRSFX- Draco Meteor3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Ascent1.wav b/public/audio/battle_anims/PRSFX- Dragon Ascent1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Ascent1.wav rename to public/audio/battle_anims/PRSFX- Dragon Ascent1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Ascent2.wav b/public/audio/battle_anims/PRSFX- Dragon Ascent2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Ascent2.wav rename to public/audio/battle_anims/PRSFX- Dragon Ascent2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Ascent3.wav b/public/audio/battle_anims/PRSFX- Dragon Ascent3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Ascent3.wav rename to public/audio/battle_anims/PRSFX- Dragon Ascent3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Breath.wav b/public/audio/battle_anims/PRSFX- Dragon Breath.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Breath.wav rename to public/audio/battle_anims/PRSFX- Dragon Breath.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Claw.wav b/public/audio/battle_anims/PRSFX- Dragon Claw.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Claw.wav rename to public/audio/battle_anims/PRSFX- Dragon Claw.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Dance.wav b/public/audio/battle_anims/PRSFX- Dragon Dance.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Dance.wav rename to public/audio/battle_anims/PRSFX- Dragon Dance.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Pulse.wav b/public/audio/battle_anims/PRSFX- Dragon Pulse.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Pulse.wav rename to public/audio/battle_anims/PRSFX- Dragon Pulse.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Rage.wav b/public/audio/battle_anims/PRSFX- Dragon Rage.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Rage.wav rename to public/audio/battle_anims/PRSFX- Dragon Rage.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Rush1.wav b/public/audio/battle_anims/PRSFX- Dragon Rush1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Rush1.wav rename to public/audio/battle_anims/PRSFX- Dragon Rush1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Rush2.wav b/public/audio/battle_anims/PRSFX- Dragon Rush2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Rush2.wav rename to public/audio/battle_anims/PRSFX- Dragon Rush2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dragon Tail.wav b/public/audio/battle_anims/PRSFX- Dragon Tail.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dragon Tail.wav rename to public/audio/battle_anims/PRSFX- Dragon Tail.wav diff --git a/public/audio/se/battle_anims/PRSFX- Drain Punch1.wav b/public/audio/battle_anims/PRSFX- Drain Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Drain Punch1.wav rename to public/audio/battle_anims/PRSFX- Drain Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Drain Punch2.wav b/public/audio/battle_anims/PRSFX- Drain Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Drain Punch2.wav rename to public/audio/battle_anims/PRSFX- Drain Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Draining Kiss1.wav b/public/audio/battle_anims/PRSFX- Draining Kiss1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Draining Kiss1.wav rename to public/audio/battle_anims/PRSFX- Draining Kiss1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Draining Kiss2.wav b/public/audio/battle_anims/PRSFX- Draining Kiss2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Draining Kiss2.wav rename to public/audio/battle_anims/PRSFX- Draining Kiss2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dream Eater1.wav b/public/audio/battle_anims/PRSFX- Dream Eater1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dream Eater1.wav rename to public/audio/battle_anims/PRSFX- Dream Eater1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dream Eater2.wav b/public/audio/battle_anims/PRSFX- Dream Eater2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dream Eater2.wav rename to public/audio/battle_anims/PRSFX- Dream Eater2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dream Eater3.wav b/public/audio/battle_anims/PRSFX- Dream Eater3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dream Eater3.wav rename to public/audio/battle_anims/PRSFX- Dream Eater3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Drill Peck.wav b/public/audio/battle_anims/PRSFX- Drill Peck.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Drill Peck.wav rename to public/audio/battle_anims/PRSFX- Drill Peck.wav diff --git a/public/audio/se/battle_anims/PRSFX- Drill Run.wav b/public/audio/battle_anims/PRSFX- Drill Run.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Drill Run.wav rename to public/audio/battle_anims/PRSFX- Drill Run.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dual Chop.wav b/public/audio/battle_anims/PRSFX- Dual Chop.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dual Chop.wav rename to public/audio/battle_anims/PRSFX- Dual Chop.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dynamic Punch1.wav b/public/audio/battle_anims/PRSFX- Dynamic Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dynamic Punch1.wav rename to public/audio/battle_anims/PRSFX- Dynamic Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Dynamic Punch2.wav b/public/audio/battle_anims/PRSFX- Dynamic Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Dynamic Punch2.wav rename to public/audio/battle_anims/PRSFX- Dynamic Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Earth Power.wav b/public/audio/battle_anims/PRSFX- Earth Power.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Earth Power.wav rename to public/audio/battle_anims/PRSFX- Earth Power.wav diff --git a/public/audio/se/battle_anims/PRSFX- Earthquake.wav b/public/audio/battle_anims/PRSFX- Earthquake.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Earthquake.wav rename to public/audio/battle_anims/PRSFX- Earthquake.wav diff --git a/public/audio/se/battle_anims/PRSFX- Earthquake1.wav b/public/audio/battle_anims/PRSFX- Earthquake1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Earthquake1.wav rename to public/audio/battle_anims/PRSFX- Earthquake1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Earthquake2.wav b/public/audio/battle_anims/PRSFX- Earthquake2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Earthquake2.wav rename to public/audio/battle_anims/PRSFX- Earthquake2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Echoed Voice.wav b/public/audio/battle_anims/PRSFX- Echoed Voice.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Echoed Voice.wav rename to public/audio/battle_anims/PRSFX- Echoed Voice.wav diff --git a/public/audio/se/battle_anims/PRSFX- Eerie Impulse.wav b/public/audio/battle_anims/PRSFX- Eerie Impulse.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Eerie Impulse.wav rename to public/audio/battle_anims/PRSFX- Eerie Impulse.wav diff --git a/public/audio/se/battle_anims/PRSFX- Egg Bomb1.wav b/public/audio/battle_anims/PRSFX- Egg Bomb1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Egg Bomb1.wav rename to public/audio/battle_anims/PRSFX- Egg Bomb1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Egg Bomb2.wav b/public/audio/battle_anims/PRSFX- Egg Bomb2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Egg Bomb2.wav rename to public/audio/battle_anims/PRSFX- Egg Bomb2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Electric Terrain.wav b/public/audio/battle_anims/PRSFX- Electric Terrain.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Electric Terrain.wav rename to public/audio/battle_anims/PRSFX- Electric Terrain.wav diff --git a/public/audio/se/battle_anims/PRSFX- Electric Terrain2.wav b/public/audio/battle_anims/PRSFX- Electric Terrain2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Electric Terrain2.wav rename to public/audio/battle_anims/PRSFX- Electric Terrain2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Electrify.wav b/public/audio/battle_anims/PRSFX- Electrify.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Electrify.wav rename to public/audio/battle_anims/PRSFX- Electrify.wav diff --git a/public/audio/se/battle_anims/PRSFX- Electro Ball1.wav b/public/audio/battle_anims/PRSFX- Electro Ball1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Electro Ball1.wav rename to public/audio/battle_anims/PRSFX- Electro Ball1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Electro Ball2.wav b/public/audio/battle_anims/PRSFX- Electro Ball2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Electro Ball2.wav rename to public/audio/battle_anims/PRSFX- Electro Ball2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Electroweb1.wav b/public/audio/battle_anims/PRSFX- Electroweb1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Electroweb1.wav rename to public/audio/battle_anims/PRSFX- Electroweb1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Electroweb2.wav b/public/audio/battle_anims/PRSFX- Electroweb2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Electroweb2.wav rename to public/audio/battle_anims/PRSFX- Electroweb2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Embargo.wav b/public/audio/battle_anims/PRSFX- Embargo.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Embargo.wav rename to public/audio/battle_anims/PRSFX- Embargo.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ember.wav b/public/audio/battle_anims/PRSFX- Ember.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ember.wav rename to public/audio/battle_anims/PRSFX- Ember.wav diff --git a/public/audio/se/battle_anims/PRSFX- Encore.wav b/public/audio/battle_anims/PRSFX- Encore.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Encore.wav rename to public/audio/battle_anims/PRSFX- Encore.wav diff --git a/public/audio/se/battle_anims/PRSFX- Endeavor1.wav b/public/audio/battle_anims/PRSFX- Endeavor1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Endeavor1.wav rename to public/audio/battle_anims/PRSFX- Endeavor1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Endeavor2.wav b/public/audio/battle_anims/PRSFX- Endeavor2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Endeavor2.wav rename to public/audio/battle_anims/PRSFX- Endeavor2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Endure.wav b/public/audio/battle_anims/PRSFX- Endure.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Endure.wav rename to public/audio/battle_anims/PRSFX- Endure.wav diff --git a/public/audio/se/battle_anims/PRSFX- Energy Ball1.wav b/public/audio/battle_anims/PRSFX- Energy Ball1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Energy Ball1.wav rename to public/audio/battle_anims/PRSFX- Energy Ball1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Energy Ball2.wav b/public/audio/battle_anims/PRSFX- Energy Ball2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Energy Ball2.wav rename to public/audio/battle_anims/PRSFX- Energy Ball2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Entrainment.wav b/public/audio/battle_anims/PRSFX- Entrainment.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Entrainment.wav rename to public/audio/battle_anims/PRSFX- Entrainment.wav diff --git a/public/audio/se/battle_anims/PRSFX- Eruption1.wav b/public/audio/battle_anims/PRSFX- Eruption1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Eruption1.wav rename to public/audio/battle_anims/PRSFX- Eruption1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Eruption2.wav b/public/audio/battle_anims/PRSFX- Eruption2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Eruption2.wav rename to public/audio/battle_anims/PRSFX- Eruption2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Explosion.wav b/public/audio/battle_anims/PRSFX- Explosion.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Explosion.wav rename to public/audio/battle_anims/PRSFX- Explosion.wav diff --git a/public/audio/se/battle_anims/PRSFX- Explosion2.wav b/public/audio/battle_anims/PRSFX- Explosion2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Explosion2.wav rename to public/audio/battle_anims/PRSFX- Explosion2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Extrasensory.wav b/public/audio/battle_anims/PRSFX- Extrasensory.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Extrasensory.wav rename to public/audio/battle_anims/PRSFX- Extrasensory.wav diff --git a/public/audio/se/battle_anims/PRSFX- Extreme Evoboost1.wav b/public/audio/battle_anims/PRSFX- Extreme Evoboost1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Extreme Evoboost1.wav rename to public/audio/battle_anims/PRSFX- Extreme Evoboost1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Extreme Evoboost2.wav b/public/audio/battle_anims/PRSFX- Extreme Evoboost2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Extreme Evoboost2.wav rename to public/audio/battle_anims/PRSFX- Extreme Evoboost2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Extreme Evoboost3.wav b/public/audio/battle_anims/PRSFX- Extreme Evoboost3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Extreme Evoboost3.wav rename to public/audio/battle_anims/PRSFX- Extreme Evoboost3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Extremespeed1.wav b/public/audio/battle_anims/PRSFX- Extremespeed1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Extremespeed1.wav rename to public/audio/battle_anims/PRSFX- Extremespeed1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Extremespeed2.wav b/public/audio/battle_anims/PRSFX- Extremespeed2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Extremespeed2.wav rename to public/audio/battle_anims/PRSFX- Extremespeed2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Facade1.wav b/public/audio/battle_anims/PRSFX- Facade1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Facade1.wav rename to public/audio/battle_anims/PRSFX- Facade1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Facade2.wav b/public/audio/battle_anims/PRSFX- Facade2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Facade2.wav rename to public/audio/battle_anims/PRSFX- Facade2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fairy Lock.wav b/public/audio/battle_anims/PRSFX- Fairy Lock.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fairy Lock.wav rename to public/audio/battle_anims/PRSFX- Fairy Lock.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fairy Wind.wav b/public/audio/battle_anims/PRSFX- Fairy Wind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fairy Wind.wav rename to public/audio/battle_anims/PRSFX- Fairy Wind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fake Out1.wav b/public/audio/battle_anims/PRSFX- Fake Out1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fake Out1.wav rename to public/audio/battle_anims/PRSFX- Fake Out1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fake Out2.wav b/public/audio/battle_anims/PRSFX- Fake Out2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fake Out2.wav rename to public/audio/battle_anims/PRSFX- Fake Out2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fake Tears.wav b/public/audio/battle_anims/PRSFX- Fake Tears.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fake Tears.wav rename to public/audio/battle_anims/PRSFX- Fake Tears.wav diff --git a/public/audio/se/battle_anims/PRSFX- False Swipe.wav b/public/audio/battle_anims/PRSFX- False Swipe.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- False Swipe.wav rename to public/audio/battle_anims/PRSFX- False Swipe.wav diff --git a/public/audio/se/battle_anims/PRSFX- Featherdance1.wav b/public/audio/battle_anims/PRSFX- Featherdance1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Featherdance1.wav rename to public/audio/battle_anims/PRSFX- Featherdance1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Featherdance2.wav b/public/audio/battle_anims/PRSFX- Featherdance2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Featherdance2.wav rename to public/audio/battle_anims/PRSFX- Featherdance2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Feint Attack1.wav b/public/audio/battle_anims/PRSFX- Feint Attack1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Feint Attack1.wav rename to public/audio/battle_anims/PRSFX- Feint Attack1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Feint Attack2.wav b/public/audio/battle_anims/PRSFX- Feint Attack2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Feint Attack2.wav rename to public/audio/battle_anims/PRSFX- Feint Attack2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Feint1.wav b/public/audio/battle_anims/PRSFX- Feint1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Feint1.wav rename to public/audio/battle_anims/PRSFX- Feint1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Feint2.wav b/public/audio/battle_anims/PRSFX- Feint2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Feint2.wav rename to public/audio/battle_anims/PRSFX- Feint2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fell Stinger1.wav b/public/audio/battle_anims/PRSFX- Fell Stinger1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fell Stinger1.wav rename to public/audio/battle_anims/PRSFX- Fell Stinger1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fell Stinger2.wav b/public/audio/battle_anims/PRSFX- Fell Stinger2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fell Stinger2.wav rename to public/audio/battle_anims/PRSFX- Fell Stinger2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fell Stinger3.wav b/public/audio/battle_anims/PRSFX- Fell Stinger3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fell Stinger3.wav rename to public/audio/battle_anims/PRSFX- Fell Stinger3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fiery Dance1.wav b/public/audio/battle_anims/PRSFX- Fiery Dance1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fiery Dance1.wav rename to public/audio/battle_anims/PRSFX- Fiery Dance1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fiery Dance2.wav b/public/audio/battle_anims/PRSFX- Fiery Dance2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fiery Dance2.wav rename to public/audio/battle_anims/PRSFX- Fiery Dance2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Final Gambit1.wav b/public/audio/battle_anims/PRSFX- Final Gambit1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Final Gambit1.wav rename to public/audio/battle_anims/PRSFX- Final Gambit1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Final Gambit2.wav b/public/audio/battle_anims/PRSFX- Final Gambit2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Final Gambit2.wav rename to public/audio/battle_anims/PRSFX- Final Gambit2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Blast.wav b/public/audio/battle_anims/PRSFX- Fire Blast.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Blast.wav rename to public/audio/battle_anims/PRSFX- Fire Blast.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Fang1.wav b/public/audio/battle_anims/PRSFX- Fire Fang1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Fang1.wav rename to public/audio/battle_anims/PRSFX- Fire Fang1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Fang2.wav b/public/audio/battle_anims/PRSFX- Fire Fang2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Fang2.wav rename to public/audio/battle_anims/PRSFX- Fire Fang2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Lash1.wav b/public/audio/battle_anims/PRSFX- Fire Lash1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Lash1.wav rename to public/audio/battle_anims/PRSFX- Fire Lash1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Lash2.wav b/public/audio/battle_anims/PRSFX- Fire Lash2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Lash2.wav rename to public/audio/battle_anims/PRSFX- Fire Lash2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Lash3.wav b/public/audio/battle_anims/PRSFX- Fire Lash3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Lash3.wav rename to public/audio/battle_anims/PRSFX- Fire Lash3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Lash4.wav b/public/audio/battle_anims/PRSFX- Fire Lash4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Lash4.wav rename to public/audio/battle_anims/PRSFX- Fire Lash4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Pledge.wav b/public/audio/battle_anims/PRSFX- Fire Pledge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Pledge.wav rename to public/audio/battle_anims/PRSFX- Fire Pledge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Punch1.wav b/public/audio/battle_anims/PRSFX- Fire Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Punch1.wav rename to public/audio/battle_anims/PRSFX- Fire Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Punch2.wav b/public/audio/battle_anims/PRSFX- Fire Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Punch2.wav rename to public/audio/battle_anims/PRSFX- Fire Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Punch3.wav b/public/audio/battle_anims/PRSFX- Fire Punch3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Punch3.wav rename to public/audio/battle_anims/PRSFX- Fire Punch3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fire Spin.wav b/public/audio/battle_anims/PRSFX- Fire Spin.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fire Spin.wav rename to public/audio/battle_anims/PRSFX- Fire Spin.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fissure.wav b/public/audio/battle_anims/PRSFX- Fissure.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fissure.wav rename to public/audio/battle_anims/PRSFX- Fissure.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flail.wav b/public/audio/battle_anims/PRSFX- Flail.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flail.wav rename to public/audio/battle_anims/PRSFX- Flail.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flame Burst.wav b/public/audio/battle_anims/PRSFX- Flame Burst.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flame Burst.wav rename to public/audio/battle_anims/PRSFX- Flame Burst.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flame Charge1.wav b/public/audio/battle_anims/PRSFX- Flame Charge1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flame Charge1.wav rename to public/audio/battle_anims/PRSFX- Flame Charge1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flame Charge2.wav b/public/audio/battle_anims/PRSFX- Flame Charge2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flame Charge2.wav rename to public/audio/battle_anims/PRSFX- Flame Charge2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flame Wheel1.wav b/public/audio/battle_anims/PRSFX- Flame Wheel1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flame Wheel1.wav rename to public/audio/battle_anims/PRSFX- Flame Wheel1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flame Wheel2.wav b/public/audio/battle_anims/PRSFX- Flame Wheel2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flame Wheel2.wav rename to public/audio/battle_anims/PRSFX- Flame Wheel2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flamethrower.wav b/public/audio/battle_anims/PRSFX- Flamethrower.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flamethrower.wav rename to public/audio/battle_anims/PRSFX- Flamethrower.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flare Blitz1.wav b/public/audio/battle_anims/PRSFX- Flare Blitz1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flare Blitz1.wav rename to public/audio/battle_anims/PRSFX- Flare Blitz1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flare Blitz2.wav b/public/audio/battle_anims/PRSFX- Flare Blitz2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flare Blitz2.wav rename to public/audio/battle_anims/PRSFX- Flare Blitz2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flare Blitz3.wav b/public/audio/battle_anims/PRSFX- Flare Blitz3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flare Blitz3.wav rename to public/audio/battle_anims/PRSFX- Flare Blitz3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flash Cannon.wav b/public/audio/battle_anims/PRSFX- Flash Cannon.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flash Cannon.wav rename to public/audio/battle_anims/PRSFX- Flash Cannon.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flash.wav b/public/audio/battle_anims/PRSFX- Flash.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flash.wav rename to public/audio/battle_anims/PRSFX- Flash.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flatter.wav b/public/audio/battle_anims/PRSFX- Flatter.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flatter.wav rename to public/audio/battle_anims/PRSFX- Flatter.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fling1.wav b/public/audio/battle_anims/PRSFX- Fling1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fling1.wav rename to public/audio/battle_anims/PRSFX- Fling1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fling2.wav b/public/audio/battle_anims/PRSFX- Fling2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fling2.wav rename to public/audio/battle_anims/PRSFX- Fling2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Floral Healing1.wav b/public/audio/battle_anims/PRSFX- Floral Healing1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Floral Healing1.wav rename to public/audio/battle_anims/PRSFX- Floral Healing1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Floral Healing2.wav b/public/audio/battle_anims/PRSFX- Floral Healing2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Floral Healing2.wav rename to public/audio/battle_anims/PRSFX- Floral Healing2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flower Shield.wav b/public/audio/battle_anims/PRSFX- Flower Shield.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flower Shield.wav rename to public/audio/battle_anims/PRSFX- Flower Shield.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fly1.wav b/public/audio/battle_anims/PRSFX- Fly1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fly1.wav rename to public/audio/battle_anims/PRSFX- Fly1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fly2.wav b/public/audio/battle_anims/PRSFX- Fly2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fly2.wav rename to public/audio/battle_anims/PRSFX- Fly2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flying Press1.wav b/public/audio/battle_anims/PRSFX- Flying Press1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flying Press1.wav rename to public/audio/battle_anims/PRSFX- Flying Press1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flying Press2.wav b/public/audio/battle_anims/PRSFX- Flying Press2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flying Press2.wav rename to public/audio/battle_anims/PRSFX- Flying Press2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Flying Press3.wav b/public/audio/battle_anims/PRSFX- Flying Press3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Flying Press3.wav rename to public/audio/battle_anims/PRSFX- Flying Press3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Focus Blast1.wav b/public/audio/battle_anims/PRSFX- Focus Blast1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Focus Blast1.wav rename to public/audio/battle_anims/PRSFX- Focus Blast1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Focus Blast2.wav b/public/audio/battle_anims/PRSFX- Focus Blast2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Focus Blast2.wav rename to public/audio/battle_anims/PRSFX- Focus Blast2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Focus Blast3.wav b/public/audio/battle_anims/PRSFX- Focus Blast3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Focus Blast3.wav rename to public/audio/battle_anims/PRSFX- Focus Blast3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Focus Energy.wav b/public/audio/battle_anims/PRSFX- Focus Energy.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Focus Energy.wav rename to public/audio/battle_anims/PRSFX- Focus Energy.wav diff --git a/public/audio/se/battle_anims/PRSFX- Focus Punch1.wav b/public/audio/battle_anims/PRSFX- Focus Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Focus Punch1.wav rename to public/audio/battle_anims/PRSFX- Focus Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Focus Punch2.wav b/public/audio/battle_anims/PRSFX- Focus Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Focus Punch2.wav rename to public/audio/battle_anims/PRSFX- Focus Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Focus Punch3.wav b/public/audio/battle_anims/PRSFX- Focus Punch3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Focus Punch3.wav rename to public/audio/battle_anims/PRSFX- Focus Punch3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Follow Me.wav b/public/audio/battle_anims/PRSFX- Follow Me.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Follow Me.wav rename to public/audio/battle_anims/PRSFX- Follow Me.wav diff --git a/public/audio/se/battle_anims/PRSFX- Force Palm1.wav b/public/audio/battle_anims/PRSFX- Force Palm1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Force Palm1.wav rename to public/audio/battle_anims/PRSFX- Force Palm1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Force Palm2.wav b/public/audio/battle_anims/PRSFX- Force Palm2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Force Palm2.wav rename to public/audio/battle_anims/PRSFX- Force Palm2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Foresight1.wav b/public/audio/battle_anims/PRSFX- Foresight1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Foresight1.wav rename to public/audio/battle_anims/PRSFX- Foresight1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Foresight2.wav b/public/audio/battle_anims/PRSFX- Foresight2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Foresight2.wav rename to public/audio/battle_anims/PRSFX- Foresight2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Forests Curse.wav b/public/audio/battle_anims/PRSFX- Forests Curse.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Forests Curse.wav rename to public/audio/battle_anims/PRSFX- Forests Curse.wav diff --git a/public/audio/se/battle_anims/PRSFX- Foul Play1.wav b/public/audio/battle_anims/PRSFX- Foul Play1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Foul Play1.wav rename to public/audio/battle_anims/PRSFX- Foul Play1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Foul Play2.wav b/public/audio/battle_anims/PRSFX- Foul Play2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Foul Play2.wav rename to public/audio/battle_anims/PRSFX- Foul Play2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Freeze Dry1.wav b/public/audio/battle_anims/PRSFX- Freeze Dry1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Freeze Dry1.wav rename to public/audio/battle_anims/PRSFX- Freeze Dry1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Freeze Dry2.wav b/public/audio/battle_anims/PRSFX- Freeze Dry2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Freeze Dry2.wav rename to public/audio/battle_anims/PRSFX- Freeze Dry2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Freeze Dry3.wav b/public/audio/battle_anims/PRSFX- Freeze Dry3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Freeze Dry3.wav rename to public/audio/battle_anims/PRSFX- Freeze Dry3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Freeze Shock1.wav b/public/audio/battle_anims/PRSFX- Freeze Shock1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Freeze Shock1.wav rename to public/audio/battle_anims/PRSFX- Freeze Shock1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Freeze Shock2.wav b/public/audio/battle_anims/PRSFX- Freeze Shock2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Freeze Shock2.wav rename to public/audio/battle_anims/PRSFX- Freeze Shock2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Freeze Shock3.wav b/public/audio/battle_anims/PRSFX- Freeze Shock3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Freeze Shock3.wav rename to public/audio/battle_anims/PRSFX- Freeze Shock3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Frenzy Plant1.wav b/public/audio/battle_anims/PRSFX- Frenzy Plant1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Frenzy Plant1.wav rename to public/audio/battle_anims/PRSFX- Frenzy Plant1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Frenzy Plant2.wav b/public/audio/battle_anims/PRSFX- Frenzy Plant2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Frenzy Plant2.wav rename to public/audio/battle_anims/PRSFX- Frenzy Plant2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Frost Breath1.wav b/public/audio/battle_anims/PRSFX- Frost Breath1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Frost Breath1.wav rename to public/audio/battle_anims/PRSFX- Frost Breath1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Frost Breath2.wav b/public/audio/battle_anims/PRSFX- Frost Breath2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Frost Breath2.wav rename to public/audio/battle_anims/PRSFX- Frost Breath2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Frozen.wav b/public/audio/battle_anims/PRSFX- Frozen.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Frozen.wav rename to public/audio/battle_anims/PRSFX- Frozen.wav diff --git a/public/audio/se/battle_anims/PRSFX- Frustration1.wav b/public/audio/battle_anims/PRSFX- Frustration1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Frustration1.wav rename to public/audio/battle_anims/PRSFX- Frustration1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Frustration2.wav b/public/audio/battle_anims/PRSFX- Frustration2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Frustration2.wav rename to public/audio/battle_anims/PRSFX- Frustration2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fury Attack.wav b/public/audio/battle_anims/PRSFX- Fury Attack.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fury Attack.wav rename to public/audio/battle_anims/PRSFX- Fury Attack.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fury Cutter.wav b/public/audio/battle_anims/PRSFX- Fury Cutter.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fury Cutter.wav rename to public/audio/battle_anims/PRSFX- Fury Cutter.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fury Swipes.wav b/public/audio/battle_anims/PRSFX- Fury Swipes.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fury Swipes.wav rename to public/audio/battle_anims/PRSFX- Fury Swipes.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fusion Bolt1.wav b/public/audio/battle_anims/PRSFX- Fusion Bolt1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fusion Bolt1.wav rename to public/audio/battle_anims/PRSFX- Fusion Bolt1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fusion Bolt2.wav b/public/audio/battle_anims/PRSFX- Fusion Bolt2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fusion Bolt2.wav rename to public/audio/battle_anims/PRSFX- Fusion Bolt2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fusion Flare1.wav b/public/audio/battle_anims/PRSFX- Fusion Flare1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fusion Flare1.wav rename to public/audio/battle_anims/PRSFX- Fusion Flare1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fusion Flare2.wav b/public/audio/battle_anims/PRSFX- Fusion Flare2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fusion Flare2.wav rename to public/audio/battle_anims/PRSFX- Fusion Flare2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Fusion Flare3.wav b/public/audio/battle_anims/PRSFX- Fusion Flare3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Fusion Flare3.wav rename to public/audio/battle_anims/PRSFX- Fusion Flare3.wav diff --git a/public/audio/se/battle_anims/PRSFX- FusionFlare3.wav b/public/audio/battle_anims/PRSFX- FusionFlare3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- FusionFlare3.wav rename to public/audio/battle_anims/PRSFX- FusionFlare3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Future Sight1.wav b/public/audio/battle_anims/PRSFX- Future Sight1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Future Sight1.wav rename to public/audio/battle_anims/PRSFX- Future Sight1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Future Sight2.wav b/public/audio/battle_anims/PRSFX- Future Sight2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Future Sight2.wav rename to public/audio/battle_anims/PRSFX- Future Sight2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gastro Acid.wav b/public/audio/battle_anims/PRSFX- Gastro Acid.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gastro Acid.wav rename to public/audio/battle_anims/PRSFX- Gastro Acid.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gear Grind.wav b/public/audio/battle_anims/PRSFX- Gear Grind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gear Grind.wav rename to public/audio/battle_anims/PRSFX- Gear Grind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gear Up1.wav b/public/audio/battle_anims/PRSFX- Gear Up1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gear Up1.wav rename to public/audio/battle_anims/PRSFX- Gear Up1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gear Up2.wav b/public/audio/battle_anims/PRSFX- Gear Up2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gear Up2.wav rename to public/audio/battle_anims/PRSFX- Gear Up2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gear Up3.wav b/public/audio/battle_anims/PRSFX- Gear Up3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gear Up3.wav rename to public/audio/battle_anims/PRSFX- Gear Up3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gear Up4.wav b/public/audio/battle_anims/PRSFX- Gear Up4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gear Up4.wav rename to public/audio/battle_anims/PRSFX- Gear Up4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gear Up5.wav b/public/audio/battle_anims/PRSFX- Gear Up5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gear Up5.wav rename to public/audio/battle_anims/PRSFX- Gear Up5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gear Up6.wav b/public/audio/battle_anims/PRSFX- Gear Up6.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gear Up6.wav rename to public/audio/battle_anims/PRSFX- Gear Up6.wav diff --git a/public/audio/se/battle_anims/PRSFX- Geomancy.wav b/public/audio/battle_anims/PRSFX- Geomancy.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Geomancy.wav rename to public/audio/battle_anims/PRSFX- Geomancy.wav diff --git a/public/audio/se/battle_anims/PRSFX- Giga Drain1.wav b/public/audio/battle_anims/PRSFX- Giga Drain1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Giga Drain1.wav rename to public/audio/battle_anims/PRSFX- Giga Drain1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Giga Drain2.wav b/public/audio/battle_anims/PRSFX- Giga Drain2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Giga Drain2.wav rename to public/audio/battle_anims/PRSFX- Giga Drain2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Giga Impact1.wav b/public/audio/battle_anims/PRSFX- Giga Impact1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Giga Impact1.wav rename to public/audio/battle_anims/PRSFX- Giga Impact1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Giga Impact2.wav b/public/audio/battle_anims/PRSFX- Giga Impact2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Giga Impact2.wav rename to public/audio/battle_anims/PRSFX- Giga Impact2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gigavolt Havoc1.wav b/public/audio/battle_anims/PRSFX- Gigavolt Havoc1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gigavolt Havoc1.wav rename to public/audio/battle_anims/PRSFX- Gigavolt Havoc1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gigavolt Havoc2.wav b/public/audio/battle_anims/PRSFX- Gigavolt Havoc2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gigavolt Havoc2.wav rename to public/audio/battle_anims/PRSFX- Gigavolt Havoc2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gigavolt Havoc3.wav b/public/audio/battle_anims/PRSFX- Gigavolt Havoc3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gigavolt Havoc3.wav rename to public/audio/battle_anims/PRSFX- Gigavolt Havoc3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Glaciate1.wav b/public/audio/battle_anims/PRSFX- Glaciate1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Glaciate1.wav rename to public/audio/battle_anims/PRSFX- Glaciate1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Glaciate2.wav b/public/audio/battle_anims/PRSFX- Glaciate2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Glaciate2.wav rename to public/audio/battle_anims/PRSFX- Glaciate2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Glare.wav b/public/audio/battle_anims/PRSFX- Glare.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Glare.wav rename to public/audio/battle_anims/PRSFX- Glare.wav diff --git a/public/audio/se/battle_anims/PRSFX- Glitch1.wav b/public/audio/battle_anims/PRSFX- Glitch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Glitch1.wav rename to public/audio/battle_anims/PRSFX- Glitch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Glitch2.wav b/public/audio/battle_anims/PRSFX- Glitch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Glitch2.wav rename to public/audio/battle_anims/PRSFX- Glitch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Grass Knot1.wav b/public/audio/battle_anims/PRSFX- Grass Knot1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Grass Knot1.wav rename to public/audio/battle_anims/PRSFX- Grass Knot1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Grass Knot2.wav b/public/audio/battle_anims/PRSFX- Grass Knot2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Grass Knot2.wav rename to public/audio/battle_anims/PRSFX- Grass Knot2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Grass Pledge1.wav b/public/audio/battle_anims/PRSFX- Grass Pledge1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Grass Pledge1.wav rename to public/audio/battle_anims/PRSFX- Grass Pledge1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Grass Pledge2.wav b/public/audio/battle_anims/PRSFX- Grass Pledge2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Grass Pledge2.wav rename to public/audio/battle_anims/PRSFX- Grass Pledge2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Grass Whistle.wav b/public/audio/battle_anims/PRSFX- Grass Whistle.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Grass Whistle.wav rename to public/audio/battle_anims/PRSFX- Grass Whistle.wav diff --git a/public/audio/se/battle_anims/PRSFX- Grassy Terrain.wav b/public/audio/battle_anims/PRSFX- Grassy Terrain.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Grassy Terrain.wav rename to public/audio/battle_anims/PRSFX- Grassy Terrain.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gravity.wav b/public/audio/battle_anims/PRSFX- Gravity.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gravity.wav rename to public/audio/battle_anims/PRSFX- Gravity.wav diff --git a/public/audio/se/battle_anims/PRSFX- Growth.wav b/public/audio/battle_anims/PRSFX- Growth.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Growth.wav rename to public/audio/battle_anims/PRSFX- Growth.wav diff --git a/public/audio/se/battle_anims/PRSFX- Grudge.wav b/public/audio/battle_anims/PRSFX- Grudge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Grudge.wav rename to public/audio/battle_anims/PRSFX- Grudge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Guard Split.wav b/public/audio/battle_anims/PRSFX- Guard Split.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Guard Split.wav rename to public/audio/battle_anims/PRSFX- Guard Split.wav diff --git a/public/audio/se/battle_anims/PRSFX- Guard Swap.wav b/public/audio/battle_anims/PRSFX- Guard Swap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Guard Swap.wav rename to public/audio/battle_anims/PRSFX- Guard Swap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Guillotine1.wav b/public/audio/battle_anims/PRSFX- Guillotine1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Guillotine1.wav rename to public/audio/battle_anims/PRSFX- Guillotine1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Guillotine2.wav b/public/audio/battle_anims/PRSFX- Guillotine2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Guillotine2.wav rename to public/audio/battle_anims/PRSFX- Guillotine2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gunk Shot.wav b/public/audio/battle_anims/PRSFX- Gunk Shot.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gunk Shot.wav rename to public/audio/battle_anims/PRSFX- Gunk Shot.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gust.wav b/public/audio/battle_anims/PRSFX- Gust.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gust.wav rename to public/audio/battle_anims/PRSFX- Gust.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gyro Ball1.wav b/public/audio/battle_anims/PRSFX- Gyro Ball1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gyro Ball1.wav rename to public/audio/battle_anims/PRSFX- Gyro Ball1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Gyro Ball2.wav b/public/audio/battle_anims/PRSFX- Gyro Ball2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Gyro Ball2.wav rename to public/audio/battle_anims/PRSFX- Gyro Ball2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hail.wav b/public/audio/battle_anims/PRSFX- Hail.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hail.wav rename to public/audio/battle_anims/PRSFX- Hail.wav diff --git a/public/audio/se/battle_anims/PRSFX- HailMove.wav b/public/audio/battle_anims/PRSFX- HailMove.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- HailMove.wav rename to public/audio/battle_anims/PRSFX- HailMove.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hammer Arm1.wav b/public/audio/battle_anims/PRSFX- Hammer Arm1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hammer Arm1.wav rename to public/audio/battle_anims/PRSFX- Hammer Arm1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hammer Arm2.wav b/public/audio/battle_anims/PRSFX- Hammer Arm2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hammer Arm2.wav rename to public/audio/battle_anims/PRSFX- Hammer Arm2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Harden.wav b/public/audio/battle_anims/PRSFX- Harden.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Harden.wav rename to public/audio/battle_anims/PRSFX- Harden.wav diff --git a/public/audio/se/battle_anims/PRSFX- Haze.wav b/public/audio/battle_anims/PRSFX- Haze.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Haze.wav rename to public/audio/battle_anims/PRSFX- Haze.wav diff --git a/public/audio/se/battle_anims/PRSFX- Head Charge.wav b/public/audio/battle_anims/PRSFX- Head Charge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Head Charge.wav rename to public/audio/battle_anims/PRSFX- Head Charge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Head Smash.wav b/public/audio/battle_anims/PRSFX- Head Smash.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Head Smash.wav rename to public/audio/battle_anims/PRSFX- Head Smash.wav diff --git a/public/audio/se/battle_anims/PRSFX- Headbutt1.wav b/public/audio/battle_anims/PRSFX- Headbutt1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Headbutt1.wav rename to public/audio/battle_anims/PRSFX- Headbutt1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Headbutt2.wav b/public/audio/battle_anims/PRSFX- Headbutt2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Headbutt2.wav rename to public/audio/battle_anims/PRSFX- Headbutt2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heal Bell.wav b/public/audio/battle_anims/PRSFX- Heal Bell.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heal Bell.wav rename to public/audio/battle_anims/PRSFX- Heal Bell.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heal Block.wav b/public/audio/battle_anims/PRSFX- Heal Block.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heal Block.wav rename to public/audio/battle_anims/PRSFX- Heal Block.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heal Order1.wav b/public/audio/battle_anims/PRSFX- Heal Order1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heal Order1.wav rename to public/audio/battle_anims/PRSFX- Heal Order1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heal Order2.wav b/public/audio/battle_anims/PRSFX- Heal Order2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heal Order2.wav rename to public/audio/battle_anims/PRSFX- Heal Order2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Healing Pulse.wav b/public/audio/battle_anims/PRSFX- Healing Pulse.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Healing Pulse.wav rename to public/audio/battle_anims/PRSFX- Healing Pulse.wav diff --git a/public/audio/se/battle_anims/PRSFX- Healing Wish.wav b/public/audio/battle_anims/PRSFX- Healing Wish.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Healing Wish.wav rename to public/audio/battle_anims/PRSFX- Healing Wish.wav diff --git a/public/audio/se/battle_anims/PRSFX- Health Down.wav b/public/audio/battle_anims/PRSFX- Health Down.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Health Down.wav rename to public/audio/battle_anims/PRSFX- Health Down.wav diff --git a/public/audio/se/battle_anims/PRSFX- Health Up.wav b/public/audio/battle_anims/PRSFX- Health Up.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Health Up.wav rename to public/audio/battle_anims/PRSFX- Health Up.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heart Stamp1.wav b/public/audio/battle_anims/PRSFX- Heart Stamp1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heart Stamp1.wav rename to public/audio/battle_anims/PRSFX- Heart Stamp1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heart Stamp2.wav b/public/audio/battle_anims/PRSFX- Heart Stamp2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heart Stamp2.wav rename to public/audio/battle_anims/PRSFX- Heart Stamp2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heart Swap.wav b/public/audio/battle_anims/PRSFX- Heart Swap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heart Swap.wav rename to public/audio/battle_anims/PRSFX- Heart Swap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heat Crash.wav b/public/audio/battle_anims/PRSFX- Heat Crash.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heat Crash.wav rename to public/audio/battle_anims/PRSFX- Heat Crash.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heat Wave.wav b/public/audio/battle_anims/PRSFX- Heat Wave.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heat Wave.wav rename to public/audio/battle_anims/PRSFX- Heat Wave.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heavy Slam1.wav b/public/audio/battle_anims/PRSFX- Heavy Slam1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heavy Slam1.wav rename to public/audio/battle_anims/PRSFX- Heavy Slam1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Heavy Slam2.wav b/public/audio/battle_anims/PRSFX- Heavy Slam2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Heavy Slam2.wav rename to public/audio/battle_anims/PRSFX- Heavy Slam2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Helping Hand.wav b/public/audio/battle_anims/PRSFX- Helping Hand.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Helping Hand.wav rename to public/audio/battle_anims/PRSFX- Helping Hand.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hex.wav b/public/audio/battle_anims/PRSFX- Hex.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hex.wav rename to public/audio/battle_anims/PRSFX- Hex.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hi Jump Kick1.wav b/public/audio/battle_anims/PRSFX- Hi Jump Kick1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hi Jump Kick1.wav rename to public/audio/battle_anims/PRSFX- Hi Jump Kick1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hi Jump Kick2.wav b/public/audio/battle_anims/PRSFX- Hi Jump Kick2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hi Jump Kick2.wav rename to public/audio/battle_anims/PRSFX- Hi Jump Kick2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hidden Power1.wav b/public/audio/battle_anims/PRSFX- Hidden Power1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hidden Power1.wav rename to public/audio/battle_anims/PRSFX- Hidden Power1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hidden Power2.wav b/public/audio/battle_anims/PRSFX- Hidden Power2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hidden Power2.wav rename to public/audio/battle_anims/PRSFX- Hidden Power2.wav diff --git a/public/audio/se/battle_anims/PRSFX- High Horse Power1.wav b/public/audio/battle_anims/PRSFX- High Horse Power1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- High Horse Power1.wav rename to public/audio/battle_anims/PRSFX- High Horse Power1.wav diff --git a/public/audio/se/battle_anims/PRSFX- High Horse Power2.wav b/public/audio/battle_anims/PRSFX- High Horse Power2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- High Horse Power2.wav rename to public/audio/battle_anims/PRSFX- High Horse Power2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hone Claws.wav b/public/audio/battle_anims/PRSFX- Hone Claws.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hone Claws.wav rename to public/audio/battle_anims/PRSFX- Hone Claws.wav diff --git a/public/audio/se/battle_anims/PRSFX- Horn Attack.wav b/public/audio/battle_anims/PRSFX- Horn Attack.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Horn Attack.wav rename to public/audio/battle_anims/PRSFX- Horn Attack.wav diff --git a/public/audio/se/battle_anims/PRSFX- Horn Drill1.wav b/public/audio/battle_anims/PRSFX- Horn Drill1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Horn Drill1.wav rename to public/audio/battle_anims/PRSFX- Horn Drill1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Horn Drill2.wav b/public/audio/battle_anims/PRSFX- Horn Drill2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Horn Drill2.wav rename to public/audio/battle_anims/PRSFX- Horn Drill2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Horn Drill3.wav b/public/audio/battle_anims/PRSFX- Horn Drill3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Horn Drill3.wav rename to public/audio/battle_anims/PRSFX- Horn Drill3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Horn Drill3_1.mp3 b/public/audio/battle_anims/PRSFX- Horn Drill3_1.mp3 similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Horn Drill3_1.mp3 rename to public/audio/battle_anims/PRSFX- Horn Drill3_1.mp3 diff --git a/public/audio/se/battle_anims/PRSFX- Horn Leech1.wav b/public/audio/battle_anims/PRSFX- Horn Leech1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Horn Leech1.wav rename to public/audio/battle_anims/PRSFX- Horn Leech1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Horn Leech2.wav b/public/audio/battle_anims/PRSFX- Horn Leech2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Horn Leech2.wav rename to public/audio/battle_anims/PRSFX- Horn Leech2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hurricane.wav b/public/audio/battle_anims/PRSFX- Hurricane.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hurricane.wav rename to public/audio/battle_anims/PRSFX- Hurricane.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hydro Cannon.wav b/public/audio/battle_anims/PRSFX- Hydro Cannon.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hydro Cannon.wav rename to public/audio/battle_anims/PRSFX- Hydro Cannon.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hydro Cannon1.wav b/public/audio/battle_anims/PRSFX- Hydro Cannon1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hydro Cannon1.wav rename to public/audio/battle_anims/PRSFX- Hydro Cannon1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hydro Cannon2.wav b/public/audio/battle_anims/PRSFX- Hydro Cannon2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hydro Cannon2.wav rename to public/audio/battle_anims/PRSFX- Hydro Cannon2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hydro Pump.wav b/public/audio/battle_anims/PRSFX- Hydro Pump.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hydro Pump.wav rename to public/audio/battle_anims/PRSFX- Hydro Pump.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hydro Vortex1.wav b/public/audio/battle_anims/PRSFX- Hydro Vortex1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hydro Vortex1.wav rename to public/audio/battle_anims/PRSFX- Hydro Vortex1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hydro Vortex2.wav b/public/audio/battle_anims/PRSFX- Hydro Vortex2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hydro Vortex2.wav rename to public/audio/battle_anims/PRSFX- Hydro Vortex2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hydro Vortex3.wav b/public/audio/battle_anims/PRSFX- Hydro Vortex3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hydro Vortex3.wav rename to public/audio/battle_anims/PRSFX- Hydro Vortex3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hyper Beam.wav b/public/audio/battle_anims/PRSFX- Hyper Beam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hyper Beam.wav rename to public/audio/battle_anims/PRSFX- Hyper Beam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hyper Fang.wav b/public/audio/battle_anims/PRSFX- Hyper Fang.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hyper Fang.wav rename to public/audio/battle_anims/PRSFX- Hyper Fang.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hyperspace Fury1.wav b/public/audio/battle_anims/PRSFX- Hyperspace Fury1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hyperspace Fury1.wav rename to public/audio/battle_anims/PRSFX- Hyperspace Fury1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hyperspace Fury2.wav b/public/audio/battle_anims/PRSFX- Hyperspace Fury2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hyperspace Fury2.wav rename to public/audio/battle_anims/PRSFX- Hyperspace Fury2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hyperspace Hole1.wav b/public/audio/battle_anims/PRSFX- Hyperspace Hole1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hyperspace Hole1.wav rename to public/audio/battle_anims/PRSFX- Hyperspace Hole1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hyperspace Hole2.wav b/public/audio/battle_anims/PRSFX- Hyperspace Hole2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hyperspace Hole2.wav rename to public/audio/battle_anims/PRSFX- Hyperspace Hole2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Hypnosis.wav b/public/audio/battle_anims/PRSFX- Hypnosis.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Hypnosis.wav rename to public/audio/battle_anims/PRSFX- Hypnosis.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Ball1.wav b/public/audio/battle_anims/PRSFX- Ice Ball1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Ball1.wav rename to public/audio/battle_anims/PRSFX- Ice Ball1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Ball2.wav b/public/audio/battle_anims/PRSFX- Ice Ball2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Ball2.wav rename to public/audio/battle_anims/PRSFX- Ice Ball2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Beam.wav b/public/audio/battle_anims/PRSFX- Ice Beam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Beam.wav rename to public/audio/battle_anims/PRSFX- Ice Beam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Burn1.wav b/public/audio/battle_anims/PRSFX- Ice Burn1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Burn1.wav rename to public/audio/battle_anims/PRSFX- Ice Burn1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Burn2.wav b/public/audio/battle_anims/PRSFX- Ice Burn2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Burn2.wav rename to public/audio/battle_anims/PRSFX- Ice Burn2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Burn3.wav b/public/audio/battle_anims/PRSFX- Ice Burn3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Burn3.wav rename to public/audio/battle_anims/PRSFX- Ice Burn3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Burn4.wav b/public/audio/battle_anims/PRSFX- Ice Burn4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Burn4.wav rename to public/audio/battle_anims/PRSFX- Ice Burn4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Fang1.wav b/public/audio/battle_anims/PRSFX- Ice Fang1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Fang1.wav rename to public/audio/battle_anims/PRSFX- Ice Fang1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Fang2.wav b/public/audio/battle_anims/PRSFX- Ice Fang2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Fang2.wav rename to public/audio/battle_anims/PRSFX- Ice Fang2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Hammer1.wav b/public/audio/battle_anims/PRSFX- Ice Hammer1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Hammer1.wav rename to public/audio/battle_anims/PRSFX- Ice Hammer1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Hammer2.wav b/public/audio/battle_anims/PRSFX- Ice Hammer2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Hammer2.wav rename to public/audio/battle_anims/PRSFX- Ice Hammer2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Punch1.wav b/public/audio/battle_anims/PRSFX- Ice Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Punch1.wav rename to public/audio/battle_anims/PRSFX- Ice Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Punch2.wav b/public/audio/battle_anims/PRSFX- Ice Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Punch2.wav rename to public/audio/battle_anims/PRSFX- Ice Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ice Shard.wav b/public/audio/battle_anims/PRSFX- Ice Shard.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ice Shard.wav rename to public/audio/battle_anims/PRSFX- Ice Shard.wav diff --git a/public/audio/se/battle_anims/PRSFX- Icicle Crash1.wav b/public/audio/battle_anims/PRSFX- Icicle Crash1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Icicle Crash1.wav rename to public/audio/battle_anims/PRSFX- Icicle Crash1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Icicle Crash2.wav b/public/audio/battle_anims/PRSFX- Icicle Crash2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Icicle Crash2.wav rename to public/audio/battle_anims/PRSFX- Icicle Crash2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Icicle Spear.wav b/public/audio/battle_anims/PRSFX- Icicle Spear.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Icicle Spear.wav rename to public/audio/battle_anims/PRSFX- Icicle Spear.wav diff --git a/public/audio/se/battle_anims/PRSFX- Icy Wind1.wav b/public/audio/battle_anims/PRSFX- Icy Wind1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Icy Wind1.wav rename to public/audio/battle_anims/PRSFX- Icy Wind1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Icy Wind2.wav b/public/audio/battle_anims/PRSFX- Icy Wind2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Icy Wind2.wav rename to public/audio/battle_anims/PRSFX- Icy Wind2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Imprison1.wav b/public/audio/battle_anims/PRSFX- Imprison1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Imprison1.wav rename to public/audio/battle_anims/PRSFX- Imprison1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Imprison2.wav b/public/audio/battle_anims/PRSFX- Imprison2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Imprison2.wav rename to public/audio/battle_anims/PRSFX- Imprison2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Incinerate1.wav b/public/audio/battle_anims/PRSFX- Incinerate1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Incinerate1.wav rename to public/audio/battle_anims/PRSFX- Incinerate1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Incinerate2.wav b/public/audio/battle_anims/PRSFX- Incinerate2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Incinerate2.wav rename to public/audio/battle_anims/PRSFX- Incinerate2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Inferno Overdrive1.wav b/public/audio/battle_anims/PRSFX- Inferno Overdrive1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Inferno Overdrive1.wav rename to public/audio/battle_anims/PRSFX- Inferno Overdrive1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Inferno Overdrive2.wav b/public/audio/battle_anims/PRSFX- Inferno Overdrive2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Inferno Overdrive2.wav rename to public/audio/battle_anims/PRSFX- Inferno Overdrive2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Inferno Overdrive3.wav b/public/audio/battle_anims/PRSFX- Inferno Overdrive3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Inferno Overdrive3.wav rename to public/audio/battle_anims/PRSFX- Inferno Overdrive3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Inferno Overdrive4.wav b/public/audio/battle_anims/PRSFX- Inferno Overdrive4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Inferno Overdrive4.wav rename to public/audio/battle_anims/PRSFX- Inferno Overdrive4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Inferno Overdrive5.wav b/public/audio/battle_anims/PRSFX- Inferno Overdrive5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Inferno Overdrive5.wav rename to public/audio/battle_anims/PRSFX- Inferno Overdrive5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Inferno.wav b/public/audio/battle_anims/PRSFX- Inferno.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Inferno.wav rename to public/audio/battle_anims/PRSFX- Inferno.wav diff --git a/public/audio/se/battle_anims/PRSFX- Infestation.wav b/public/audio/battle_anims/PRSFX- Infestation.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Infestation.wav rename to public/audio/battle_anims/PRSFX- Infestation.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ingrain1.wav b/public/audio/battle_anims/PRSFX- Ingrain1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ingrain1.wav rename to public/audio/battle_anims/PRSFX- Ingrain1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ingrain2.wav b/public/audio/battle_anims/PRSFX- Ingrain2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ingrain2.wav rename to public/audio/battle_anims/PRSFX- Ingrain2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Instruct1.wav b/public/audio/battle_anims/PRSFX- Instruct1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Instruct1.wav rename to public/audio/battle_anims/PRSFX- Instruct1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Instruct2.wav b/public/audio/battle_anims/PRSFX- Instruct2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Instruct2.wav rename to public/audio/battle_anims/PRSFX- Instruct2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ion Deluge.wav b/public/audio/battle_anims/PRSFX- Ion Deluge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ion Deluge.wav rename to public/audio/battle_anims/PRSFX- Ion Deluge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Iron Defense.wav b/public/audio/battle_anims/PRSFX- Iron Defense.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Iron Defense.wav rename to public/audio/battle_anims/PRSFX- Iron Defense.wav diff --git a/public/audio/se/battle_anims/PRSFX- Iron Head.wav b/public/audio/battle_anims/PRSFX- Iron Head.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Iron Head.wav rename to public/audio/battle_anims/PRSFX- Iron Head.wav diff --git a/public/audio/se/battle_anims/PRSFX- Iron Tail1.wav b/public/audio/battle_anims/PRSFX- Iron Tail1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Iron Tail1.wav rename to public/audio/battle_anims/PRSFX- Iron Tail1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Iron Tail2.wav b/public/audio/battle_anims/PRSFX- Iron Tail2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Iron Tail2.wav rename to public/audio/battle_anims/PRSFX- Iron Tail2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Judgment.wav b/public/audio/battle_anims/PRSFX- Judgment.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Judgment.wav rename to public/audio/battle_anims/PRSFX- Judgment.wav diff --git a/public/audio/se/battle_anims/PRSFX- Jump Kick1.wav b/public/audio/battle_anims/PRSFX- Jump Kick1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Jump Kick1.wav rename to public/audio/battle_anims/PRSFX- Jump Kick1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Jump Kick2.wav b/public/audio/battle_anims/PRSFX- Jump Kick2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Jump Kick2.wav rename to public/audio/battle_anims/PRSFX- Jump Kick2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Karate Chop1.wav b/public/audio/battle_anims/PRSFX- Karate Chop1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Karate Chop1.wav rename to public/audio/battle_anims/PRSFX- Karate Chop1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Karate Chop2.wav b/public/audio/battle_anims/PRSFX- Karate Chop2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Karate Chop2.wav rename to public/audio/battle_anims/PRSFX- Karate Chop2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Kinesis.wav b/public/audio/battle_anims/PRSFX- Kinesis.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Kinesis.wav rename to public/audio/battle_anims/PRSFX- Kinesis.wav diff --git a/public/audio/se/battle_anims/PRSFX- King's Shield1.wav b/public/audio/battle_anims/PRSFX- King's Shield1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- King's Shield1.wav rename to public/audio/battle_anims/PRSFX- King's Shield1.wav diff --git a/public/audio/se/battle_anims/PRSFX- King's Shield2.wav b/public/audio/battle_anims/PRSFX- King's Shield2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- King's Shield2.wav rename to public/audio/battle_anims/PRSFX- King's Shield2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Knock Off.wav b/public/audio/battle_anims/PRSFX- Knock Off.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Knock Off.wav rename to public/audio/battle_anims/PRSFX- Knock Off.wav diff --git a/public/audio/se/battle_anims/PRSFX- LTBTS1.wav b/public/audio/battle_anims/PRSFX- LTBTS1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- LTBTS1.wav rename to public/audio/battle_anims/PRSFX- LTBTS1.wav diff --git a/public/audio/se/battle_anims/PRSFX- LTBTS2.wav b/public/audio/battle_anims/PRSFX- LTBTS2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- LTBTS2.wav rename to public/audio/battle_anims/PRSFX- LTBTS2.wav diff --git a/public/audio/se/battle_anims/PRSFX- LTBTS3.wav b/public/audio/battle_anims/PRSFX- LTBTS3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- LTBTS3.wav rename to public/audio/battle_anims/PRSFX- LTBTS3.wav diff --git a/public/audio/se/battle_anims/PRSFX- LTBTS4.wav b/public/audio/battle_anims/PRSFX- LTBTS4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- LTBTS4.wav rename to public/audio/battle_anims/PRSFX- LTBTS4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Lands Wrath1.wav b/public/audio/battle_anims/PRSFX- Lands Wrath1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Lands Wrath1.wav rename to public/audio/battle_anims/PRSFX- Lands Wrath1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Lands Wrath2.wav b/public/audio/battle_anims/PRSFX- Lands Wrath2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Lands Wrath2.wav rename to public/audio/battle_anims/PRSFX- Lands Wrath2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Laser Focus1.wav b/public/audio/battle_anims/PRSFX- Laser Focus1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Laser Focus1.wav rename to public/audio/battle_anims/PRSFX- Laser Focus1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Laser Focus2.wav b/public/audio/battle_anims/PRSFX- Laser Focus2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Laser Focus2.wav rename to public/audio/battle_anims/PRSFX- Laser Focus2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Last Resort1.wav b/public/audio/battle_anims/PRSFX- Last Resort1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Last Resort1.wav rename to public/audio/battle_anims/PRSFX- Last Resort1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Last Resort2.wav b/public/audio/battle_anims/PRSFX- Last Resort2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Last Resort2.wav rename to public/audio/battle_anims/PRSFX- Last Resort2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Lava Plume.wav b/public/audio/battle_anims/PRSFX- Lava Plume.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Lava Plume.wav rename to public/audio/battle_anims/PRSFX- Lava Plume.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leaf Blade.wav b/public/audio/battle_anims/PRSFX- Leaf Blade.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leaf Blade.wav rename to public/audio/battle_anims/PRSFX- Leaf Blade.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leaf Storm1.wav b/public/audio/battle_anims/PRSFX- Leaf Storm1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leaf Storm1.wav rename to public/audio/battle_anims/PRSFX- Leaf Storm1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leaf Storm2.wav b/public/audio/battle_anims/PRSFX- Leaf Storm2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leaf Storm2.wav rename to public/audio/battle_anims/PRSFX- Leaf Storm2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leaf Tornado1.wav b/public/audio/battle_anims/PRSFX- Leaf Tornado1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leaf Tornado1.wav rename to public/audio/battle_anims/PRSFX- Leaf Tornado1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leaf Tornado2.wav b/public/audio/battle_anims/PRSFX- Leaf Tornado2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leaf Tornado2.wav rename to public/audio/battle_anims/PRSFX- Leaf Tornado2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leafage 1.wav b/public/audio/battle_anims/PRSFX- Leafage 1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leafage 1.wav rename to public/audio/battle_anims/PRSFX- Leafage 1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leafage 2.wav b/public/audio/battle_anims/PRSFX- Leafage 2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leafage 2.wav rename to public/audio/battle_anims/PRSFX- Leafage 2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leech Life1.wav b/public/audio/battle_anims/PRSFX- Leech Life1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leech Life1.wav rename to public/audio/battle_anims/PRSFX- Leech Life1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leech Life2.wav b/public/audio/battle_anims/PRSFX- Leech Life2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leech Life2.wav rename to public/audio/battle_anims/PRSFX- Leech Life2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leech Seed1.wav b/public/audio/battle_anims/PRSFX- Leech Seed1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leech Seed1.wav rename to public/audio/battle_anims/PRSFX- Leech Seed1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leech Seed2.wav b/public/audio/battle_anims/PRSFX- Leech Seed2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leech Seed2.wav rename to public/audio/battle_anims/PRSFX- Leech Seed2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leech Seed3.wav b/public/audio/battle_anims/PRSFX- Leech Seed3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leech Seed3.wav rename to public/audio/battle_anims/PRSFX- Leech Seed3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Leer.wav b/public/audio/battle_anims/PRSFX- Leer.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Leer.wav rename to public/audio/battle_anims/PRSFX- Leer.wav diff --git a/public/audio/se/battle_anims/PRSFX- Lick.wav b/public/audio/battle_anims/PRSFX- Lick.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Lick.wav rename to public/audio/battle_anims/PRSFX- Lick.wav diff --git a/public/audio/se/battle_anims/PRSFX- Light Screen.wav b/public/audio/battle_anims/PRSFX- Light Screen.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Light Screen.wav rename to public/audio/battle_anims/PRSFX- Light Screen.wav diff --git a/public/audio/se/battle_anims/PRSFX- Liquidation1.wav b/public/audio/battle_anims/PRSFX- Liquidation1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Liquidation1.wav rename to public/audio/battle_anims/PRSFX- Liquidation1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Liquidation2.wav b/public/audio/battle_anims/PRSFX- Liquidation2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Liquidation2.wav rename to public/audio/battle_anims/PRSFX- Liquidation2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Liquidation3.wav b/public/audio/battle_anims/PRSFX- Liquidation3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Liquidation3.wav rename to public/audio/battle_anims/PRSFX- Liquidation3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Liquidation4.wav b/public/audio/battle_anims/PRSFX- Liquidation4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Liquidation4.wav rename to public/audio/battle_anims/PRSFX- Liquidation4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Lock On.wav b/public/audio/battle_anims/PRSFX- Lock On.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Lock On.wav rename to public/audio/battle_anims/PRSFX- Lock On.wav diff --git a/public/audio/se/battle_anims/PRSFX- Lovely Kiss.wav b/public/audio/battle_anims/PRSFX- Lovely Kiss.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Lovely Kiss.wav rename to public/audio/battle_anims/PRSFX- Lovely Kiss.wav diff --git a/public/audio/se/battle_anims/PRSFX- Low Kick.wav b/public/audio/battle_anims/PRSFX- Low Kick.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Low Kick.wav rename to public/audio/battle_anims/PRSFX- Low Kick.wav diff --git a/public/audio/se/battle_anims/PRSFX- Low Sweep.wav b/public/audio/battle_anims/PRSFX- Low Sweep.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Low Sweep.wav rename to public/audio/battle_anims/PRSFX- Low Sweep.wav diff --git a/public/audio/se/battle_anims/PRSFX- Lucky Chant.wav b/public/audio/battle_anims/PRSFX- Lucky Chant.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Lucky Chant.wav rename to public/audio/battle_anims/PRSFX- Lucky Chant.wav diff --git a/public/audio/se/battle_anims/PRSFX- Lunar Dance.wav b/public/audio/battle_anims/PRSFX- Lunar Dance.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Lunar Dance.wav rename to public/audio/battle_anims/PRSFX- Lunar Dance.wav diff --git a/public/audio/se/battle_anims/PRSFX- Luster Purge1.wav b/public/audio/battle_anims/PRSFX- Luster Purge1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Luster Purge1.wav rename to public/audio/battle_anims/PRSFX- Luster Purge1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Luster Purge2.wav b/public/audio/battle_anims/PRSFX- Luster Purge2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Luster Purge2.wav rename to public/audio/battle_anims/PRSFX- Luster Purge2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Luster Purge3.wav b/public/audio/battle_anims/PRSFX- Luster Purge3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Luster Purge3.wav rename to public/audio/battle_anims/PRSFX- Luster Purge3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mach Punch.wav b/public/audio/battle_anims/PRSFX- Mach Punch.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mach Punch.wav rename to public/audio/battle_anims/PRSFX- Mach Punch.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magic Coat.wav b/public/audio/battle_anims/PRSFX- Magic Coat.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magic Coat.wav rename to public/audio/battle_anims/PRSFX- Magic Coat.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magic Room.wav b/public/audio/battle_anims/PRSFX- Magic Room.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magic Room.wav rename to public/audio/battle_anims/PRSFX- Magic Room.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magical Leaf1.wav b/public/audio/battle_anims/PRSFX- Magical Leaf1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magical Leaf1.wav rename to public/audio/battle_anims/PRSFX- Magical Leaf1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magical Leaf2.wav b/public/audio/battle_anims/PRSFX- Magical Leaf2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magical Leaf2.wav rename to public/audio/battle_anims/PRSFX- Magical Leaf2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magma Storm1.wav b/public/audio/battle_anims/PRSFX- Magma Storm1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magma Storm1.wav rename to public/audio/battle_anims/PRSFX- Magma Storm1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magma Storm2.wav b/public/audio/battle_anims/PRSFX- Magma Storm2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magma Storm2.wav rename to public/audio/battle_anims/PRSFX- Magma Storm2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magnet Bomb1.wav b/public/audio/battle_anims/PRSFX- Magnet Bomb1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magnet Bomb1.wav rename to public/audio/battle_anims/PRSFX- Magnet Bomb1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magnet Bomb2.wav b/public/audio/battle_anims/PRSFX- Magnet Bomb2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magnet Bomb2.wav rename to public/audio/battle_anims/PRSFX- Magnet Bomb2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magnet Rise.wav b/public/audio/battle_anims/PRSFX- Magnet Rise.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magnet Rise.wav rename to public/audio/battle_anims/PRSFX- Magnet Rise.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magnetic Flux.wav b/public/audio/battle_anims/PRSFX- Magnetic Flux.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magnetic Flux.wav rename to public/audio/battle_anims/PRSFX- Magnetic Flux.wav diff --git a/public/audio/se/battle_anims/PRSFX- Magnitude.wav b/public/audio/battle_anims/PRSFX- Magnitude.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Magnitude.wav rename to public/audio/battle_anims/PRSFX- Magnitude.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mat Block.wav b/public/audio/battle_anims/PRSFX- Mat Block.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mat Block.wav rename to public/audio/battle_anims/PRSFX- Mat Block.wav diff --git a/public/audio/se/battle_anims/PRSFX- Me First1.wav b/public/audio/battle_anims/PRSFX- Me First1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Me First1.wav rename to public/audio/battle_anims/PRSFX- Me First1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Me First2.wav b/public/audio/battle_anims/PRSFX- Me First2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Me First2.wav rename to public/audio/battle_anims/PRSFX- Me First2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Me First3.wav b/public/audio/battle_anims/PRSFX- Me First3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Me First3.wav rename to public/audio/battle_anims/PRSFX- Me First3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mean Look.wav b/public/audio/battle_anims/PRSFX- Mean Look.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mean Look.wav rename to public/audio/battle_anims/PRSFX- Mean Look.wav diff --git a/public/audio/se/battle_anims/PRSFX- Meditate.wav b/public/audio/battle_anims/PRSFX- Meditate.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Meditate.wav rename to public/audio/battle_anims/PRSFX- Meditate.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mega Drain1.wav b/public/audio/battle_anims/PRSFX- Mega Drain1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mega Drain1.wav rename to public/audio/battle_anims/PRSFX- Mega Drain1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mega Drain2.wav b/public/audio/battle_anims/PRSFX- Mega Drain2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mega Drain2.wav rename to public/audio/battle_anims/PRSFX- Mega Drain2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mega Evolution1.wav b/public/audio/battle_anims/PRSFX- Mega Evolution1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mega Evolution1.wav rename to public/audio/battle_anims/PRSFX- Mega Evolution1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mega Evolution2.wav b/public/audio/battle_anims/PRSFX- Mega Evolution2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mega Evolution2.wav rename to public/audio/battle_anims/PRSFX- Mega Evolution2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mega Punch1.wav b/public/audio/battle_anims/PRSFX- Mega Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mega Punch1.wav rename to public/audio/battle_anims/PRSFX- Mega Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mega Punch2.wav b/public/audio/battle_anims/PRSFX- Mega Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mega Punch2.wav rename to public/audio/battle_anims/PRSFX- Mega Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Megahorn1.wav b/public/audio/battle_anims/PRSFX- Megahorn1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Megahorn1.wav rename to public/audio/battle_anims/PRSFX- Megahorn1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Megahorn2.wav b/public/audio/battle_anims/PRSFX- Megahorn2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Megahorn2.wav rename to public/audio/battle_anims/PRSFX- Megahorn2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Megakick.wav b/public/audio/battle_anims/PRSFX- Megakick.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Megakick.wav rename to public/audio/battle_anims/PRSFX- Megakick.wav diff --git a/public/audio/se/battle_anims/PRSFX- Memento1.wav b/public/audio/battle_anims/PRSFX- Memento1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Memento1.wav rename to public/audio/battle_anims/PRSFX- Memento1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Memento2.wav b/public/audio/battle_anims/PRSFX- Memento2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Memento2.wav rename to public/audio/battle_anims/PRSFX- Memento2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Metal Burst1.wav b/public/audio/battle_anims/PRSFX- Metal Burst1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Metal Burst1.wav rename to public/audio/battle_anims/PRSFX- Metal Burst1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Metal Burst2.wav b/public/audio/battle_anims/PRSFX- Metal Burst2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Metal Burst2.wav rename to public/audio/battle_anims/PRSFX- Metal Burst2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Metal Claw1.wav b/public/audio/battle_anims/PRSFX- Metal Claw1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Metal Claw1.wav rename to public/audio/battle_anims/PRSFX- Metal Claw1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Metal Claw2.wav b/public/audio/battle_anims/PRSFX- Metal Claw2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Metal Claw2.wav rename to public/audio/battle_anims/PRSFX- Metal Claw2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Metal Sound.wav b/public/audio/battle_anims/PRSFX- Metal Sound.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Metal Sound.wav rename to public/audio/battle_anims/PRSFX- Metal Sound.wav diff --git a/public/audio/se/battle_anims/PRSFX- Meteor Mash1.wav b/public/audio/battle_anims/PRSFX- Meteor Mash1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Meteor Mash1.wav rename to public/audio/battle_anims/PRSFX- Meteor Mash1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Meteor Mash2.wav b/public/audio/battle_anims/PRSFX- Meteor Mash2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Meteor Mash2.wav rename to public/audio/battle_anims/PRSFX- Meteor Mash2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Metronome.wav b/public/audio/battle_anims/PRSFX- Metronome.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Metronome.wav rename to public/audio/battle_anims/PRSFX- Metronome.wav diff --git a/public/audio/se/battle_anims/PRSFX- Milk Drink.wav b/public/audio/battle_anims/PRSFX- Milk Drink.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Milk Drink.wav rename to public/audio/battle_anims/PRSFX- Milk Drink.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mimic1.wav b/public/audio/battle_anims/PRSFX- Mimic1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mimic1.wav rename to public/audio/battle_anims/PRSFX- Mimic1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mimic2.wav b/public/audio/battle_anims/PRSFX- Mimic2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mimic2.wav rename to public/audio/battle_anims/PRSFX- Mimic2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mind Blow1.wav b/public/audio/battle_anims/PRSFX- Mind Blow1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mind Blow1.wav rename to public/audio/battle_anims/PRSFX- Mind Blow1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mind Blow2.wav b/public/audio/battle_anims/PRSFX- Mind Blow2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mind Blow2.wav rename to public/audio/battle_anims/PRSFX- Mind Blow2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mind Blow3.wav b/public/audio/battle_anims/PRSFX- Mind Blow3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mind Blow3.wav rename to public/audio/battle_anims/PRSFX- Mind Blow3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mind Blow4.wav b/public/audio/battle_anims/PRSFX- Mind Blow4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mind Blow4.wav rename to public/audio/battle_anims/PRSFX- Mind Blow4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mind Reader.wav b/public/audio/battle_anims/PRSFX- Mind Reader.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mind Reader.wav rename to public/audio/battle_anims/PRSFX- Mind Reader.wav diff --git a/public/audio/se/battle_anims/PRSFX- Minimize1.wav b/public/audio/battle_anims/PRSFX- Minimize1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Minimize1.wav rename to public/audio/battle_anims/PRSFX- Minimize1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Minimize2.wav b/public/audio/battle_anims/PRSFX- Minimize2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Minimize2.wav rename to public/audio/battle_anims/PRSFX- Minimize2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Minimize3.wav b/public/audio/battle_anims/PRSFX- Minimize3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Minimize3.wav rename to public/audio/battle_anims/PRSFX- Minimize3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Miracle Eye.wav b/public/audio/battle_anims/PRSFX- Miracle Eye.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Miracle Eye.wav rename to public/audio/battle_anims/PRSFX- Miracle Eye.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mirror Coat.wav b/public/audio/battle_anims/PRSFX- Mirror Coat.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mirror Coat.wav rename to public/audio/battle_anims/PRSFX- Mirror Coat.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mirror Shatter.wav b/public/audio/battle_anims/PRSFX- Mirror Shatter.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mirror Shatter.wav rename to public/audio/battle_anims/PRSFX- Mirror Shatter.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mirror Shot.wav b/public/audio/battle_anims/PRSFX- Mirror Shot.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mirror Shot.wav rename to public/audio/battle_anims/PRSFX- Mirror Shot.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mist Ball1.wav b/public/audio/battle_anims/PRSFX- Mist Ball1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mist Ball1.wav rename to public/audio/battle_anims/PRSFX- Mist Ball1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mist Ball2.wav b/public/audio/battle_anims/PRSFX- Mist Ball2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mist Ball2.wav rename to public/audio/battle_anims/PRSFX- Mist Ball2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mist.wav b/public/audio/battle_anims/PRSFX- Mist.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mist.wav rename to public/audio/battle_anims/PRSFX- Mist.wav diff --git a/public/audio/se/battle_anims/PRSFX- Misty Terrain.wav b/public/audio/battle_anims/PRSFX- Misty Terrain.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Misty Terrain.wav rename to public/audio/battle_anims/PRSFX- Misty Terrain.wav diff --git a/public/audio/se/battle_anims/PRSFX- Moonblast1.wav b/public/audio/battle_anims/PRSFX- Moonblast1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Moonblast1.wav rename to public/audio/battle_anims/PRSFX- Moonblast1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Moonblast2.wav b/public/audio/battle_anims/PRSFX- Moonblast2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Moonblast2.wav rename to public/audio/battle_anims/PRSFX- Moonblast2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Moonlight.wav b/public/audio/battle_anims/PRSFX- Moonlight.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Moonlight.wav rename to public/audio/battle_anims/PRSFX- Moonlight.wav diff --git a/public/audio/se/battle_anims/PRSFX- Morning Sun.wav b/public/audio/battle_anims/PRSFX- Morning Sun.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Morning Sun.wav rename to public/audio/battle_anims/PRSFX- Morning Sun.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mud Bomb1.wav b/public/audio/battle_anims/PRSFX- Mud Bomb1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mud Bomb1.wav rename to public/audio/battle_anims/PRSFX- Mud Bomb1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mud Bomb2.wav b/public/audio/battle_anims/PRSFX- Mud Bomb2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mud Bomb2.wav rename to public/audio/battle_anims/PRSFX- Mud Bomb2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mud Shot.wav b/public/audio/battle_anims/PRSFX- Mud Shot.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mud Shot.wav rename to public/audio/battle_anims/PRSFX- Mud Shot.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mud Slap.wav b/public/audio/battle_anims/PRSFX- Mud Slap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mud Slap.wav rename to public/audio/battle_anims/PRSFX- Mud Slap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mud Sport1.wav b/public/audio/battle_anims/PRSFX- Mud Sport1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mud Sport1.wav rename to public/audio/battle_anims/PRSFX- Mud Sport1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mud Sport2.wav b/public/audio/battle_anims/PRSFX- Mud Sport2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mud Sport2.wav rename to public/audio/battle_anims/PRSFX- Mud Sport2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Muddy Water.wav b/public/audio/battle_anims/PRSFX- Muddy Water.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Muddy Water.wav rename to public/audio/battle_anims/PRSFX- Muddy Water.wav diff --git a/public/audio/se/battle_anims/PRSFX- Multi Attack1.wav b/public/audio/battle_anims/PRSFX- Multi Attack1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Multi Attack1.wav rename to public/audio/battle_anims/PRSFX- Multi Attack1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Multi Attack2.wav b/public/audio/battle_anims/PRSFX- Multi Attack2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Multi Attack2.wav rename to public/audio/battle_anims/PRSFX- Multi Attack2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Multi Attack3.wav b/public/audio/battle_anims/PRSFX- Multi Attack3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Multi Attack3.wav rename to public/audio/battle_anims/PRSFX- Multi Attack3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Multi Attack4.wav b/public/audio/battle_anims/PRSFX- Multi Attack4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Multi Attack4.wav rename to public/audio/battle_anims/PRSFX- Multi Attack4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Multi Attack5.wav b/public/audio/battle_anims/PRSFX- Multi Attack5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Multi Attack5.wav rename to public/audio/battle_anims/PRSFX- Multi Attack5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mystical Fire1.wav b/public/audio/battle_anims/PRSFX- Mystical Fire1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mystical Fire1.wav rename to public/audio/battle_anims/PRSFX- Mystical Fire1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Mystical Fire2.wav b/public/audio/battle_anims/PRSFX- Mystical Fire2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Mystical Fire2.wav rename to public/audio/battle_anims/PRSFX- Mystical Fire2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Nasty Plot.wav b/public/audio/battle_anims/PRSFX- Nasty Plot.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Nasty Plot.wav rename to public/audio/battle_anims/PRSFX- Nasty Plot.wav diff --git a/public/audio/se/battle_anims/PRSFX- Natural Gift1.wav b/public/audio/battle_anims/PRSFX- Natural Gift1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Natural Gift1.wav rename to public/audio/battle_anims/PRSFX- Natural Gift1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Natural Gift2.wav b/public/audio/battle_anims/PRSFX- Natural Gift2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Natural Gift2.wav rename to public/audio/battle_anims/PRSFX- Natural Gift2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Natures Madness1.wav b/public/audio/battle_anims/PRSFX- Natures Madness1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Natures Madness1.wav rename to public/audio/battle_anims/PRSFX- Natures Madness1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Natures Madness2.wav b/public/audio/battle_anims/PRSFX- Natures Madness2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Natures Madness2.wav rename to public/audio/battle_anims/PRSFX- Natures Madness2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Needle Arm1.wav b/public/audio/battle_anims/PRSFX- Needle Arm1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Needle Arm1.wav rename to public/audio/battle_anims/PRSFX- Needle Arm1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Needle Arm2.wav b/public/audio/battle_anims/PRSFX- Needle Arm2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Needle Arm2.wav rename to public/audio/battle_anims/PRSFX- Needle Arm2.wav diff --git a/public/audio/se/battle_anims/PRSFX- NeverEndingNightmare1.wav b/public/audio/battle_anims/PRSFX- NeverEndingNightmare1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- NeverEndingNightmare1.wav rename to public/audio/battle_anims/PRSFX- NeverEndingNightmare1.wav diff --git a/public/audio/se/battle_anims/PRSFX- NeverEndingNightmare2.wav b/public/audio/battle_anims/PRSFX- NeverEndingNightmare2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- NeverEndingNightmare2.wav rename to public/audio/battle_anims/PRSFX- NeverEndingNightmare2.wav diff --git a/public/audio/se/battle_anims/PRSFX- NeverEndingNightmare3.wav b/public/audio/battle_anims/PRSFX- NeverEndingNightmare3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- NeverEndingNightmare3.wav rename to public/audio/battle_anims/PRSFX- NeverEndingNightmare3.wav diff --git a/public/audio/se/battle_anims/PRSFX- NeverEndingNightmare4.wav b/public/audio/battle_anims/PRSFX- NeverEndingNightmare4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- NeverEndingNightmare4.wav rename to public/audio/battle_anims/PRSFX- NeverEndingNightmare4.wav diff --git a/public/audio/se/battle_anims/PRSFX- NeverEndingNightmare5.wav b/public/audio/battle_anims/PRSFX- NeverEndingNightmare5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- NeverEndingNightmare5.wav rename to public/audio/battle_anims/PRSFX- NeverEndingNightmare5.wav diff --git a/public/audio/se/battle_anims/PRSFX- NeverEndingNightmare6.wav b/public/audio/battle_anims/PRSFX- NeverEndingNightmare6.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- NeverEndingNightmare6.wav rename to public/audio/battle_anims/PRSFX- NeverEndingNightmare6.wav diff --git a/public/audio/se/battle_anims/PRSFX- Night Daze1.wav b/public/audio/battle_anims/PRSFX- Night Daze1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Night Daze1.wav rename to public/audio/battle_anims/PRSFX- Night Daze1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Night Daze2.wav b/public/audio/battle_anims/PRSFX- Night Daze2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Night Daze2.wav rename to public/audio/battle_anims/PRSFX- Night Daze2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Night Shade.wav b/public/audio/battle_anims/PRSFX- Night Shade.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Night Shade.wav rename to public/audio/battle_anims/PRSFX- Night Shade.wav diff --git a/public/audio/se/battle_anims/PRSFX- Night Slash1.wav b/public/audio/battle_anims/PRSFX- Night Slash1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Night Slash1.wav rename to public/audio/battle_anims/PRSFX- Night Slash1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Night Slash2.wav b/public/audio/battle_anims/PRSFX- Night Slash2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Night Slash2.wav rename to public/audio/battle_anims/PRSFX- Night Slash2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Nightmare.wav b/public/audio/battle_anims/PRSFX- Nightmare.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Nightmare.wav rename to public/audio/battle_anims/PRSFX- Nightmare.wav diff --git a/public/audio/se/battle_anims/PRSFX- Noble Roar1.wav b/public/audio/battle_anims/PRSFX- Noble Roar1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Noble Roar1.wav rename to public/audio/battle_anims/PRSFX- Noble Roar1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Noble Roar2.wav b/public/audio/battle_anims/PRSFX- Noble Roar2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Noble Roar2.wav rename to public/audio/battle_anims/PRSFX- Noble Roar2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Nuzzle1.wav b/public/audio/battle_anims/PRSFX- Nuzzle1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Nuzzle1.wav rename to public/audio/battle_anims/PRSFX- Nuzzle1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Nuzzle2.wav b/public/audio/battle_anims/PRSFX- Nuzzle2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Nuzzle2.wav rename to public/audio/battle_anims/PRSFX- Nuzzle2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Oblivion Wing1.wav b/public/audio/battle_anims/PRSFX- Oblivion Wing1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Oblivion Wing1.wav rename to public/audio/battle_anims/PRSFX- Oblivion Wing1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Oblivion Wing2.wav b/public/audio/battle_anims/PRSFX- Oblivion Wing2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Oblivion Wing2.wav rename to public/audio/battle_anims/PRSFX- Oblivion Wing2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Oceanic Operetta1.wav b/public/audio/battle_anims/PRSFX- Oceanic Operetta1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Oceanic Operetta1.wav rename to public/audio/battle_anims/PRSFX- Oceanic Operetta1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Oceanic Operetta2.wav b/public/audio/battle_anims/PRSFX- Oceanic Operetta2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Oceanic Operetta2.wav rename to public/audio/battle_anims/PRSFX- Oceanic Operetta2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Oceanic Operetta3.wav b/public/audio/battle_anims/PRSFX- Oceanic Operetta3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Oceanic Operetta3.wav rename to public/audio/battle_anims/PRSFX- Oceanic Operetta3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Oceanic Operetta4.wav b/public/audio/battle_anims/PRSFX- Oceanic Operetta4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Oceanic Operetta4.wav rename to public/audio/battle_anims/PRSFX- Oceanic Operetta4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Octazooka.wav b/public/audio/battle_anims/PRSFX- Octazooka.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Octazooka.wav rename to public/audio/battle_anims/PRSFX- Octazooka.wav diff --git a/public/audio/se/battle_anims/PRSFX- Odor Sleuth1.wav b/public/audio/battle_anims/PRSFX- Odor Sleuth1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Odor Sleuth1.wav rename to public/audio/battle_anims/PRSFX- Odor Sleuth1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Odor Sleuth2.wav b/public/audio/battle_anims/PRSFX- Odor Sleuth2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Odor Sleuth2.wav rename to public/audio/battle_anims/PRSFX- Odor Sleuth2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Ominous Wind.wav b/public/audio/battle_anims/PRSFX- Ominous Wind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Ominous Wind.wav rename to public/audio/battle_anims/PRSFX- Ominous Wind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Origin Pulse.wav b/public/audio/battle_anims/PRSFX- Origin Pulse.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Origin Pulse.wav rename to public/audio/battle_anims/PRSFX- Origin Pulse.wav diff --git a/public/audio/se/battle_anims/PRSFX- Origin Pulse1.wav b/public/audio/battle_anims/PRSFX- Origin Pulse1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Origin Pulse1.wav rename to public/audio/battle_anims/PRSFX- Origin Pulse1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Origin Pulse2.wav b/public/audio/battle_anims/PRSFX- Origin Pulse2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Origin Pulse2.wav rename to public/audio/battle_anims/PRSFX- Origin Pulse2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Origin Pulse3.wav b/public/audio/battle_anims/PRSFX- Origin Pulse3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Origin Pulse3.wav rename to public/audio/battle_anims/PRSFX- Origin Pulse3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Outrage1.wav b/public/audio/battle_anims/PRSFX- Outrage1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Outrage1.wav rename to public/audio/battle_anims/PRSFX- Outrage1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Outrage2.wav b/public/audio/battle_anims/PRSFX- Outrage2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Outrage2.wav rename to public/audio/battle_anims/PRSFX- Outrage2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Overheat1.wav b/public/audio/battle_anims/PRSFX- Overheat1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Overheat1.wav rename to public/audio/battle_anims/PRSFX- Overheat1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Overheat2.wav b/public/audio/battle_anims/PRSFX- Overheat2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Overheat2.wav rename to public/audio/battle_anims/PRSFX- Overheat2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pain Split.wav b/public/audio/battle_anims/PRSFX- Pain Split.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pain Split.wav rename to public/audio/battle_anims/PRSFX- Pain Split.wav diff --git a/public/audio/se/battle_anims/PRSFX- Parabolic Charge.wav b/public/audio/battle_anims/PRSFX- Parabolic Charge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Parabolic Charge.wav rename to public/audio/battle_anims/PRSFX- Parabolic Charge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Paralysis.wav b/public/audio/battle_anims/PRSFX- Paralysis.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Paralysis.wav rename to public/audio/battle_anims/PRSFX- Paralysis.wav diff --git a/public/audio/se/battle_anims/PRSFX- Parting Shot.wav b/public/audio/battle_anims/PRSFX- Parting Shot.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Parting Shot.wav rename to public/audio/battle_anims/PRSFX- Parting Shot.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pay Day1.wav b/public/audio/battle_anims/PRSFX- Pay Day1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pay Day1.wav rename to public/audio/battle_anims/PRSFX- Pay Day1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pay Day2.wav b/public/audio/battle_anims/PRSFX- Pay Day2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pay Day2.wav rename to public/audio/battle_anims/PRSFX- Pay Day2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Payback1.wav b/public/audio/battle_anims/PRSFX- Payback1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Payback1.wav rename to public/audio/battle_anims/PRSFX- Payback1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Payback2.wav b/public/audio/battle_anims/PRSFX- Payback2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Payback2.wav rename to public/audio/battle_anims/PRSFX- Payback2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Peck.wav b/public/audio/battle_anims/PRSFX- Peck.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Peck.wav rename to public/audio/battle_anims/PRSFX- Peck.wav diff --git a/public/audio/se/battle_anims/PRSFX- Perish Song.wav b/public/audio/battle_anims/PRSFX- Perish Song.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Perish Song.wav rename to public/audio/battle_anims/PRSFX- Perish Song.wav diff --git a/public/audio/se/battle_anims/PRSFX- Petal Blizzard1.wav b/public/audio/battle_anims/PRSFX- Petal Blizzard1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Petal Blizzard1.wav rename to public/audio/battle_anims/PRSFX- Petal Blizzard1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Petal Blizzard2.wav b/public/audio/battle_anims/PRSFX- Petal Blizzard2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Petal Blizzard2.wav rename to public/audio/battle_anims/PRSFX- Petal Blizzard2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Petal Dance.wav b/public/audio/battle_anims/PRSFX- Petal Dance.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Petal Dance.wav rename to public/audio/battle_anims/PRSFX- Petal Dance.wav diff --git a/public/audio/se/battle_anims/PRSFX- Phantom Force1.wav b/public/audio/battle_anims/PRSFX- Phantom Force1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Phantom Force1.wav rename to public/audio/battle_anims/PRSFX- Phantom Force1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Phantom Force2.wav b/public/audio/battle_anims/PRSFX- Phantom Force2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Phantom Force2.wav rename to public/audio/battle_anims/PRSFX- Phantom Force2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Photon Guyser1.wav b/public/audio/battle_anims/PRSFX- Photon Guyser1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Photon Guyser1.wav rename to public/audio/battle_anims/PRSFX- Photon Guyser1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Photon Guyser2.wav b/public/audio/battle_anims/PRSFX- Photon Guyser2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Photon Guyser2.wav rename to public/audio/battle_anims/PRSFX- Photon Guyser2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Photon Guyser3.wav b/public/audio/battle_anims/PRSFX- Photon Guyser3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Photon Guyser3.wav rename to public/audio/battle_anims/PRSFX- Photon Guyser3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pin Missile.wav b/public/audio/battle_anims/PRSFX- Pin Missile.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pin Missile.wav rename to public/audio/battle_anims/PRSFX- Pin Missile.wav diff --git a/public/audio/se/battle_anims/PRSFX- Plasma Fist1.wav b/public/audio/battle_anims/PRSFX- Plasma Fist1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Plasma Fist1.wav rename to public/audio/battle_anims/PRSFX- Plasma Fist1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Plasma Fist2.wav b/public/audio/battle_anims/PRSFX- Plasma Fist2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Plasma Fist2.wav rename to public/audio/battle_anims/PRSFX- Plasma Fist2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Plasma Fist3.wav b/public/audio/battle_anims/PRSFX- Plasma Fist3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Plasma Fist3.wav rename to public/audio/battle_anims/PRSFX- Plasma Fist3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Play Nice1.wav b/public/audio/battle_anims/PRSFX- Play Nice1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Play Nice1.wav rename to public/audio/battle_anims/PRSFX- Play Nice1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Play Nice2.wav b/public/audio/battle_anims/PRSFX- Play Nice2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Play Nice2.wav rename to public/audio/battle_anims/PRSFX- Play Nice2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Play Rough1.wav b/public/audio/battle_anims/PRSFX- Play Rough1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Play Rough1.wav rename to public/audio/battle_anims/PRSFX- Play Rough1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Play Rough2.wav b/public/audio/battle_anims/PRSFX- Play Rough2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Play Rough2.wav rename to public/audio/battle_anims/PRSFX- Play Rough2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Play Rough3.wav b/public/audio/battle_anims/PRSFX- Play Rough3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Play Rough3.wav rename to public/audio/battle_anims/PRSFX- Play Rough3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Play Rough4.wav b/public/audio/battle_anims/PRSFX- Play Rough4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Play Rough4.wav rename to public/audio/battle_anims/PRSFX- Play Rough4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pluck1.wav b/public/audio/battle_anims/PRSFX- Pluck1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pluck1.wav rename to public/audio/battle_anims/PRSFX- Pluck1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pluck2.wav b/public/audio/battle_anims/PRSFX- Pluck2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pluck2.wav rename to public/audio/battle_anims/PRSFX- Pluck2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Fang1.wav b/public/audio/battle_anims/PRSFX- Poison Fang1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Fang1.wav rename to public/audio/battle_anims/PRSFX- Poison Fang1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Fang2.wav b/public/audio/battle_anims/PRSFX- Poison Fang2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Fang2.wav rename to public/audio/battle_anims/PRSFX- Poison Fang2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Gas.wav b/public/audio/battle_anims/PRSFX- Poison Gas.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Gas.wav rename to public/audio/battle_anims/PRSFX- Poison Gas.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Jab1.wav b/public/audio/battle_anims/PRSFX- Poison Jab1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Jab1.wav rename to public/audio/battle_anims/PRSFX- Poison Jab1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Jab2.wav b/public/audio/battle_anims/PRSFX- Poison Jab2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Jab2.wav rename to public/audio/battle_anims/PRSFX- Poison Jab2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Powder.wav b/public/audio/battle_anims/PRSFX- Poison Powder.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Powder.wav rename to public/audio/battle_anims/PRSFX- Poison Powder.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Sting.wav b/public/audio/battle_anims/PRSFX- Poison Sting.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Sting.wav rename to public/audio/battle_anims/PRSFX- Poison Sting.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Tail1.wav b/public/audio/battle_anims/PRSFX- Poison Tail1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Tail1.wav rename to public/audio/battle_anims/PRSFX- Poison Tail1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison Tail2.wav b/public/audio/battle_anims/PRSFX- Poison Tail2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison Tail2.wav rename to public/audio/battle_anims/PRSFX- Poison Tail2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Poison.wav b/public/audio/battle_anims/PRSFX- Poison.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Poison.wav rename to public/audio/battle_anims/PRSFX- Poison.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pollen Puff1.wav b/public/audio/battle_anims/PRSFX- Pollen Puff1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pollen Puff1.wav rename to public/audio/battle_anims/PRSFX- Pollen Puff1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pollen Puff2.wav b/public/audio/battle_anims/PRSFX- Pollen Puff2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pollen Puff2.wav rename to public/audio/battle_anims/PRSFX- Pollen Puff2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pollen Puff3.wav b/public/audio/battle_anims/PRSFX- Pollen Puff3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pollen Puff3.wav rename to public/audio/battle_anims/PRSFX- Pollen Puff3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pollen Puff4.wav b/public/audio/battle_anims/PRSFX- Pollen Puff4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pollen Puff4.wav rename to public/audio/battle_anims/PRSFX- Pollen Puff4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pollen Puff5.wav b/public/audio/battle_anims/PRSFX- Pollen Puff5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pollen Puff5.wav rename to public/audio/battle_anims/PRSFX- Pollen Puff5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pollen Puff6.wav b/public/audio/battle_anims/PRSFX- Pollen Puff6.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pollen Puff6.wav rename to public/audio/battle_anims/PRSFX- Pollen Puff6.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pound.wav b/public/audio/battle_anims/PRSFX- Pound.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pound.wav rename to public/audio/battle_anims/PRSFX- Pound.wav diff --git a/public/audio/se/battle_anims/PRSFX- Powder 1.wav b/public/audio/battle_anims/PRSFX- Powder 1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Powder 1.wav rename to public/audio/battle_anims/PRSFX- Powder 1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Powder 2.wav b/public/audio/battle_anims/PRSFX- Powder 2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Powder 2.wav rename to public/audio/battle_anims/PRSFX- Powder 2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Powder Snow1.wav b/public/audio/battle_anims/PRSFX- Powder Snow1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Powder Snow1.wav rename to public/audio/battle_anims/PRSFX- Powder Snow1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Powder Snow2.wav b/public/audio/battle_anims/PRSFX- Powder Snow2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Powder Snow2.wav rename to public/audio/battle_anims/PRSFX- Powder Snow2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Powder common1.wav b/public/audio/battle_anims/PRSFX- Powder common1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Powder common1.wav rename to public/audio/battle_anims/PRSFX- Powder common1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Powder common2.wav b/public/audio/battle_anims/PRSFX- Powder common2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Powder common2.wav rename to public/audio/battle_anims/PRSFX- Powder common2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Gem1.wav b/public/audio/battle_anims/PRSFX- Power Gem1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Gem1.wav rename to public/audio/battle_anims/PRSFX- Power Gem1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Split.wav b/public/audio/battle_anims/PRSFX- Power Split.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Split.wav rename to public/audio/battle_anims/PRSFX- Power Split.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Swap.wav b/public/audio/battle_anims/PRSFX- Power Swap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Swap.wav rename to public/audio/battle_anims/PRSFX- Power Swap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Trick.wav b/public/audio/battle_anims/PRSFX- Power Trick.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Trick.wav rename to public/audio/battle_anims/PRSFX- Power Trick.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Trip1.wav b/public/audio/battle_anims/PRSFX- Power Trip1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Trip1.wav rename to public/audio/battle_anims/PRSFX- Power Trip1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Trip2.wav b/public/audio/battle_anims/PRSFX- Power Trip2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Trip2.wav rename to public/audio/battle_anims/PRSFX- Power Trip2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Trip3.wav b/public/audio/battle_anims/PRSFX- Power Trip3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Trip3.wav rename to public/audio/battle_anims/PRSFX- Power Trip3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Trip4.wav b/public/audio/battle_anims/PRSFX- Power Trip4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Trip4.wav rename to public/audio/battle_anims/PRSFX- Power Trip4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Trip5.wav b/public/audio/battle_anims/PRSFX- Power Trip5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Trip5.wav rename to public/audio/battle_anims/PRSFX- Power Trip5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Up Punch1.wav b/public/audio/battle_anims/PRSFX- Power Up Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Up Punch1.wav rename to public/audio/battle_anims/PRSFX- Power Up Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Up Punch2.wav b/public/audio/battle_anims/PRSFX- Power Up Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Up Punch2.wav rename to public/audio/battle_anims/PRSFX- Power Up Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Power Whip.wav b/public/audio/battle_anims/PRSFX- Power Whip.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Power Whip.wav rename to public/audio/battle_anims/PRSFX- Power Whip.wav diff --git a/public/audio/se/battle_anims/PRSFX- Precipice Blades.wav b/public/audio/battle_anims/PRSFX- Precipice Blades.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Precipice Blades.wav rename to public/audio/battle_anims/PRSFX- Precipice Blades.wav diff --git a/public/audio/se/battle_anims/PRSFX- Present1.wav b/public/audio/battle_anims/PRSFX- Present1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Present1.wav rename to public/audio/battle_anims/PRSFX- Present1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Present2.wav b/public/audio/battle_anims/PRSFX- Present2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Present2.wav rename to public/audio/battle_anims/PRSFX- Present2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Prismatic Laser1.wav b/public/audio/battle_anims/PRSFX- Prismatic Laser1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Prismatic Laser1.wav rename to public/audio/battle_anims/PRSFX- Prismatic Laser1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Prismatic Laser2.wav b/public/audio/battle_anims/PRSFX- Prismatic Laser2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Prismatic Laser2.wav rename to public/audio/battle_anims/PRSFX- Prismatic Laser2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Prismatic Laser3.wav b/public/audio/battle_anims/PRSFX- Prismatic Laser3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Prismatic Laser3.wav rename to public/audio/battle_anims/PRSFX- Prismatic Laser3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Protect.wav b/public/audio/battle_anims/PRSFX- Protect.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Protect.wav rename to public/audio/battle_anims/PRSFX- Protect.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psybeam.wav b/public/audio/battle_anims/PRSFX- Psybeam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psybeam.wav rename to public/audio/battle_anims/PRSFX- Psybeam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psych Up.wav b/public/audio/battle_anims/PRSFX- Psych Up.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psych Up.wav rename to public/audio/battle_anims/PRSFX- Psych Up.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psychic Terrain1.wav b/public/audio/battle_anims/PRSFX- Psychic Terrain1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psychic Terrain1.wav rename to public/audio/battle_anims/PRSFX- Psychic Terrain1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psychic Terrain2.wav b/public/audio/battle_anims/PRSFX- Psychic Terrain2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psychic Terrain2.wav rename to public/audio/battle_anims/PRSFX- Psychic Terrain2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psychic Terrain3.wav b/public/audio/battle_anims/PRSFX- Psychic Terrain3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psychic Terrain3.wav rename to public/audio/battle_anims/PRSFX- Psychic Terrain3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psychic.wav b/public/audio/battle_anims/PRSFX- Psychic.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psychic.wav rename to public/audio/battle_anims/PRSFX- Psychic.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psycho Boost1.wav b/public/audio/battle_anims/PRSFX- Psycho Boost1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psycho Boost1.wav rename to public/audio/battle_anims/PRSFX- Psycho Boost1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psycho Boost2.wav b/public/audio/battle_anims/PRSFX- Psycho Boost2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psycho Boost2.wav rename to public/audio/battle_anims/PRSFX- Psycho Boost2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psycho Cut.wav b/public/audio/battle_anims/PRSFX- Psycho Cut.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psycho Cut.wav rename to public/audio/battle_anims/PRSFX- Psycho Cut.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psycho Shift.wav b/public/audio/battle_anims/PRSFX- Psycho Shift.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psycho Shift.wav rename to public/audio/battle_anims/PRSFX- Psycho Shift.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psyshock1.wav b/public/audio/battle_anims/PRSFX- Psyshock1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psyshock1.wav rename to public/audio/battle_anims/PRSFX- Psyshock1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psyshock2.wav b/public/audio/battle_anims/PRSFX- Psyshock2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psyshock2.wav rename to public/audio/battle_anims/PRSFX- Psyshock2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psystrike1.wav b/public/audio/battle_anims/PRSFX- Psystrike1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psystrike1.wav rename to public/audio/battle_anims/PRSFX- Psystrike1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psystrike2.wav b/public/audio/battle_anims/PRSFX- Psystrike2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psystrike2.wav rename to public/audio/battle_anims/PRSFX- Psystrike2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psystrike3.wav b/public/audio/battle_anims/PRSFX- Psystrike3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psystrike3.wav rename to public/audio/battle_anims/PRSFX- Psystrike3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Psywave.wav b/public/audio/battle_anims/PRSFX- Psywave.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Psywave.wav rename to public/audio/battle_anims/PRSFX- Psywave.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pulse Evolution1.wav b/public/audio/battle_anims/PRSFX- Pulse Evolution1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pulse Evolution1.wav rename to public/audio/battle_anims/PRSFX- Pulse Evolution1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pulse Evolution2.wav b/public/audio/battle_anims/PRSFX- Pulse Evolution2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pulse Evolution2.wav rename to public/audio/battle_anims/PRSFX- Pulse Evolution2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pulverizing Pancake1.wav b/public/audio/battle_anims/PRSFX- Pulverizing Pancake1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pulverizing Pancake1.wav rename to public/audio/battle_anims/PRSFX- Pulverizing Pancake1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pulverizing Pancake2.wav b/public/audio/battle_anims/PRSFX- Pulverizing Pancake2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pulverizing Pancake2.wav rename to public/audio/battle_anims/PRSFX- Pulverizing Pancake2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pulverizing Pancake3.wav b/public/audio/battle_anims/PRSFX- Pulverizing Pancake3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pulverizing Pancake3.wav rename to public/audio/battle_anims/PRSFX- Pulverizing Pancake3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pulverizing Pancake4.wav b/public/audio/battle_anims/PRSFX- Pulverizing Pancake4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pulverizing Pancake4.wav rename to public/audio/battle_anims/PRSFX- Pulverizing Pancake4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pulverizing Pancake5.wav b/public/audio/battle_anims/PRSFX- Pulverizing Pancake5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pulverizing Pancake5.wav rename to public/audio/battle_anims/PRSFX- Pulverizing Pancake5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Punishment1.wav b/public/audio/battle_anims/PRSFX- Punishment1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Punishment1.wav rename to public/audio/battle_anims/PRSFX- Punishment1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Punishment2.wav b/public/audio/battle_anims/PRSFX- Punishment2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Punishment2.wav rename to public/audio/battle_anims/PRSFX- Punishment2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Purify1.wav b/public/audio/battle_anims/PRSFX- Purify1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Purify1.wav rename to public/audio/battle_anims/PRSFX- Purify1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Purify2.wav b/public/audio/battle_anims/PRSFX- Purify2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Purify2.wav rename to public/audio/battle_anims/PRSFX- Purify2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Purify3.wav b/public/audio/battle_anims/PRSFX- Purify3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Purify3.wav rename to public/audio/battle_anims/PRSFX- Purify3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pursuit1.wav b/public/audio/battle_anims/PRSFX- Pursuit1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pursuit1.wav rename to public/audio/battle_anims/PRSFX- Pursuit1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Pursuit2.wav b/public/audio/battle_anims/PRSFX- Pursuit2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Pursuit2.wav rename to public/audio/battle_anims/PRSFX- Pursuit2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Quash.wav b/public/audio/battle_anims/PRSFX- Quash.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Quash.wav rename to public/audio/battle_anims/PRSFX- Quash.wav diff --git a/public/audio/se/battle_anims/PRSFX- Quick Attack.wav b/public/audio/battle_anims/PRSFX- Quick Attack.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Quick Attack.wav rename to public/audio/battle_anims/PRSFX- Quick Attack.wav diff --git a/public/audio/se/battle_anims/PRSFX- Quick Guard.wav b/public/audio/battle_anims/PRSFX- Quick Guard.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Quick Guard.wav rename to public/audio/battle_anims/PRSFX- Quick Guard.wav diff --git a/public/audio/se/battle_anims/PRSFX- Quiver Dance.wav b/public/audio/battle_anims/PRSFX- Quiver Dance.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Quiver Dance.wav rename to public/audio/battle_anims/PRSFX- Quiver Dance.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rage Powder.wav b/public/audio/battle_anims/PRSFX- Rage Powder.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rage Powder.wav rename to public/audio/battle_anims/PRSFX- Rage Powder.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rage1.wav b/public/audio/battle_anims/PRSFX- Rage1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rage1.wav rename to public/audio/battle_anims/PRSFX- Rage1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rage2.wav b/public/audio/battle_anims/PRSFX- Rage2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rage2.wav rename to public/audio/battle_anims/PRSFX- Rage2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rain Dance.wav b/public/audio/battle_anims/PRSFX- Rain Dance.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rain Dance.wav rename to public/audio/battle_anims/PRSFX- Rain Dance.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rain.wav b/public/audio/battle_anims/PRSFX- Rain.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rain.wav rename to public/audio/battle_anims/PRSFX- Rain.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rainbow Field.wav b/public/audio/battle_anims/PRSFX- Rainbow Field.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rainbow Field.wav rename to public/audio/battle_anims/PRSFX- Rainbow Field.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rapid Spin.wav b/public/audio/battle_anims/PRSFX- Rapid Spin.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rapid Spin.wav rename to public/audio/battle_anims/PRSFX- Rapid Spin.wav diff --git a/public/audio/se/battle_anims/PRSFX- Razor Leaf1.wav b/public/audio/battle_anims/PRSFX- Razor Leaf1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Razor Leaf1.wav rename to public/audio/battle_anims/PRSFX- Razor Leaf1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Razor Leaf2.wav b/public/audio/battle_anims/PRSFX- Razor Leaf2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Razor Leaf2.wav rename to public/audio/battle_anims/PRSFX- Razor Leaf2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Razor Shell.wav b/public/audio/battle_anims/PRSFX- Razor Shell.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Razor Shell.wav rename to public/audio/battle_anims/PRSFX- Razor Shell.wav diff --git a/public/audio/se/battle_anims/PRSFX- Razor Wind1.wav b/public/audio/battle_anims/PRSFX- Razor Wind1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Razor Wind1.wav rename to public/audio/battle_anims/PRSFX- Razor Wind1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Razor Wind2.wav b/public/audio/battle_anims/PRSFX- Razor Wind2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Razor Wind2.wav rename to public/audio/battle_anims/PRSFX- Razor Wind2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Recover.wav b/public/audio/battle_anims/PRSFX- Recover.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Recover.wav rename to public/audio/battle_anims/PRSFX- Recover.wav diff --git a/public/audio/se/battle_anims/PRSFX- Recycle.wav b/public/audio/battle_anims/PRSFX- Recycle.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Recycle.wav rename to public/audio/battle_anims/PRSFX- Recycle.wav diff --git a/public/audio/se/battle_anims/PRSFX- Reflect Type.wav b/public/audio/battle_anims/PRSFX- Reflect Type.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Reflect Type.wav rename to public/audio/battle_anims/PRSFX- Reflect Type.wav diff --git a/public/audio/se/battle_anims/PRSFX- Reflect.wav b/public/audio/battle_anims/PRSFX- Reflect.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Reflect.wav rename to public/audio/battle_anims/PRSFX- Reflect.wav diff --git a/public/audio/se/battle_anims/PRSFX- Refresh.wav b/public/audio/battle_anims/PRSFX- Refresh.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Refresh.wav rename to public/audio/battle_anims/PRSFX- Refresh.wav diff --git a/public/audio/se/battle_anims/PRSFX- Relic Song1.wav b/public/audio/battle_anims/PRSFX- Relic Song1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Relic Song1.wav rename to public/audio/battle_anims/PRSFX- Relic Song1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Relic Song2.wav b/public/audio/battle_anims/PRSFX- Relic Song2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Relic Song2.wav rename to public/audio/battle_anims/PRSFX- Relic Song2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Retaliate1.wav b/public/audio/battle_anims/PRSFX- Retaliate1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Retaliate1.wav rename to public/audio/battle_anims/PRSFX- Retaliate1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Retaliate2.wav b/public/audio/battle_anims/PRSFX- Retaliate2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Retaliate2.wav rename to public/audio/battle_anims/PRSFX- Retaliate2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Return1.wav b/public/audio/battle_anims/PRSFX- Return1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Return1.wav rename to public/audio/battle_anims/PRSFX- Return1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Return2.wav b/public/audio/battle_anims/PRSFX- Return2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Return2.wav rename to public/audio/battle_anims/PRSFX- Return2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Revenge1.wav b/public/audio/battle_anims/PRSFX- Revenge1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Revenge1.wav rename to public/audio/battle_anims/PRSFX- Revenge1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Revenge2.wav b/public/audio/battle_anims/PRSFX- Revenge2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Revenge2.wav rename to public/audio/battle_anims/PRSFX- Revenge2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Reversal1.wav b/public/audio/battle_anims/PRSFX- Reversal1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Reversal1.wav rename to public/audio/battle_anims/PRSFX- Reversal1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Reversal2.wav b/public/audio/battle_anims/PRSFX- Reversal2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Reversal2.wav rename to public/audio/battle_anims/PRSFX- Reversal2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Roar of Time.wav b/public/audio/battle_anims/PRSFX- Roar of Time.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Roar of Time.wav rename to public/audio/battle_anims/PRSFX- Roar of Time.wav diff --git a/public/audio/se/battle_anims/PRSFX- Roar.wav b/public/audio/battle_anims/PRSFX- Roar.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Roar.wav rename to public/audio/battle_anims/PRSFX- Roar.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Blast.wav b/public/audio/battle_anims/PRSFX- Rock Blast.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Blast.wav rename to public/audio/battle_anims/PRSFX- Rock Blast.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Climb.wav b/public/audio/battle_anims/PRSFX- Rock Climb.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Climb.wav rename to public/audio/battle_anims/PRSFX- Rock Climb.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Polish.wav b/public/audio/battle_anims/PRSFX- Rock Polish.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Polish.wav rename to public/audio/battle_anims/PRSFX- Rock Polish.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Slide.wav b/public/audio/battle_anims/PRSFX- Rock Slide.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Slide.wav rename to public/audio/battle_anims/PRSFX- Rock Slide.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Smash.wav b/public/audio/battle_anims/PRSFX- Rock Smash.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Smash.wav rename to public/audio/battle_anims/PRSFX- Rock Smash.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Throw1.wav b/public/audio/battle_anims/PRSFX- Rock Throw1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Throw1.wav rename to public/audio/battle_anims/PRSFX- Rock Throw1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Throw2.wav b/public/audio/battle_anims/PRSFX- Rock Throw2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Throw2.wav rename to public/audio/battle_anims/PRSFX- Rock Throw2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Tomb.wav b/public/audio/battle_anims/PRSFX- Rock Tomb.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Tomb.wav rename to public/audio/battle_anims/PRSFX- Rock Tomb.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Wrecker1.wav b/public/audio/battle_anims/PRSFX- Rock Wrecker1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Wrecker1.wav rename to public/audio/battle_anims/PRSFX- Rock Wrecker1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rock Wrecker2.wav b/public/audio/battle_anims/PRSFX- Rock Wrecker2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rock Wrecker2.wav rename to public/audio/battle_anims/PRSFX- Rock Wrecker2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Roleplay.wav b/public/audio/battle_anims/PRSFX- Roleplay.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Roleplay.wav rename to public/audio/battle_anims/PRSFX- Roleplay.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rolling Kick.wav b/public/audio/battle_anims/PRSFX- Rolling Kick.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rolling Kick.wav rename to public/audio/battle_anims/PRSFX- Rolling Kick.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rollout1.wav b/public/audio/battle_anims/PRSFX- Rollout1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rollout1.wav rename to public/audio/battle_anims/PRSFX- Rollout1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rollout2.wav b/public/audio/battle_anims/PRSFX- Rollout2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rollout2.wav rename to public/audio/battle_anims/PRSFX- Rollout2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Roost1.wav b/public/audio/battle_anims/PRSFX- Roost1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Roost1.wav rename to public/audio/battle_anims/PRSFX- Roost1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Roost2.wav b/public/audio/battle_anims/PRSFX- Roost2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Roost2.wav rename to public/audio/battle_anims/PRSFX- Roost2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Rototiller.wav b/public/audio/battle_anims/PRSFX- Rototiller.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Rototiller.wav rename to public/audio/battle_anims/PRSFX- Rototiller.wav diff --git a/public/audio/se/battle_anims/PRSFX- Round.wav b/public/audio/battle_anims/PRSFX- Round.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Round.wav rename to public/audio/battle_anims/PRSFX- Round.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sacred Fire1.wav b/public/audio/battle_anims/PRSFX- Sacred Fire1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sacred Fire1.wav rename to public/audio/battle_anims/PRSFX- Sacred Fire1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sacred Fire2.wav b/public/audio/battle_anims/PRSFX- Sacred Fire2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sacred Fire2.wav rename to public/audio/battle_anims/PRSFX- Sacred Fire2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sacred Sword1.wav b/public/audio/battle_anims/PRSFX- Sacred Sword1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sacred Sword1.wav rename to public/audio/battle_anims/PRSFX- Sacred Sword1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sacred Sword2.wav b/public/audio/battle_anims/PRSFX- Sacred Sword2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sacred Sword2.wav rename to public/audio/battle_anims/PRSFX- Sacred Sword2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Safeguard.wav b/public/audio/battle_anims/PRSFX- Safeguard.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Safeguard.wav rename to public/audio/battle_anims/PRSFX- Safeguard.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sand Attack.wav b/public/audio/battle_anims/PRSFX- Sand Attack.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sand Attack.wav rename to public/audio/battle_anims/PRSFX- Sand Attack.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sand Tomb.wav b/public/audio/battle_anims/PRSFX- Sand Tomb.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sand Tomb.wav rename to public/audio/battle_anims/PRSFX- Sand Tomb.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sand.wav b/public/audio/battle_anims/PRSFX- Sand.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sand.wav rename to public/audio/battle_anims/PRSFX- Sand.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sandstorm.wav b/public/audio/battle_anims/PRSFX- Sandstorm.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sandstorm.wav rename to public/audio/battle_anims/PRSFX- Sandstorm.wav diff --git a/public/audio/se/battle_anims/PRSFX- Scald1.wav b/public/audio/battle_anims/PRSFX- Scald1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Scald1.wav rename to public/audio/battle_anims/PRSFX- Scald1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Scald2.wav b/public/audio/battle_anims/PRSFX- Scald2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Scald2.wav rename to public/audio/battle_anims/PRSFX- Scald2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Scary Face.wav b/public/audio/battle_anims/PRSFX- Scary Face.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Scary Face.wav rename to public/audio/battle_anims/PRSFX- Scary Face.wav diff --git a/public/audio/se/battle_anims/PRSFX- Scratch.wav b/public/audio/battle_anims/PRSFX- Scratch.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Scratch.wav rename to public/audio/battle_anims/PRSFX- Scratch.wav diff --git a/public/audio/se/battle_anims/PRSFX- Screech.wav b/public/audio/battle_anims/PRSFX- Screech.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Screech.wav rename to public/audio/battle_anims/PRSFX- Screech.wav diff --git a/public/audio/se/battle_anims/PRSFX- Searing Shot1.wav b/public/audio/battle_anims/PRSFX- Searing Shot1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Searing Shot1.wav rename to public/audio/battle_anims/PRSFX- Searing Shot1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Searing Shot2.wav b/public/audio/battle_anims/PRSFX- Searing Shot2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Searing Shot2.wav rename to public/audio/battle_anims/PRSFX- Searing Shot2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Searing Shot3.wav b/public/audio/battle_anims/PRSFX- Searing Shot3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Searing Shot3.wav rename to public/audio/battle_anims/PRSFX- Searing Shot3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Secret Sword1.wav b/public/audio/battle_anims/PRSFX- Secret Sword1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Secret Sword1.wav rename to public/audio/battle_anims/PRSFX- Secret Sword1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Secret Sword2.wav b/public/audio/battle_anims/PRSFX- Secret Sword2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Secret Sword2.wav rename to public/audio/battle_anims/PRSFX- Secret Sword2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Secret Sword3.wav b/public/audio/battle_anims/PRSFX- Secret Sword3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Secret Sword3.wav rename to public/audio/battle_anims/PRSFX- Secret Sword3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seed Bomb1.wav b/public/audio/battle_anims/PRSFX- Seed Bomb1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seed Bomb1.wav rename to public/audio/battle_anims/PRSFX- Seed Bomb1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seed Bomb2.wav b/public/audio/battle_anims/PRSFX- Seed Bomb2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seed Bomb2.wav rename to public/audio/battle_anims/PRSFX- Seed Bomb2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seed Flare1.wav b/public/audio/battle_anims/PRSFX- Seed Flare1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seed Flare1.wav rename to public/audio/battle_anims/PRSFX- Seed Flare1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seed Flare2.wav b/public/audio/battle_anims/PRSFX- Seed Flare2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seed Flare2.wav rename to public/audio/battle_anims/PRSFX- Seed Flare2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seed Flare3.wav b/public/audio/battle_anims/PRSFX- Seed Flare3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seed Flare3.wav rename to public/audio/battle_anims/PRSFX- Seed Flare3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seismic Toss1.wav b/public/audio/battle_anims/PRSFX- Seismic Toss1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seismic Toss1.wav rename to public/audio/battle_anims/PRSFX- Seismic Toss1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seismic Toss2.wav b/public/audio/battle_anims/PRSFX- Seismic Toss2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seismic Toss2.wav rename to public/audio/battle_anims/PRSFX- Seismic Toss2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seismic Toss3.wav b/public/audio/battle_anims/PRSFX- Seismic Toss3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seismic Toss3.wav rename to public/audio/battle_anims/PRSFX- Seismic Toss3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seismic Toss4.wav b/public/audio/battle_anims/PRSFX- Seismic Toss4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seismic Toss4.wav rename to public/audio/battle_anims/PRSFX- Seismic Toss4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Seismic Toss5.wav b/public/audio/battle_anims/PRSFX- Seismic Toss5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Seismic Toss5.wav rename to public/audio/battle_anims/PRSFX- Seismic Toss5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Selfdestruct1.wav b/public/audio/battle_anims/PRSFX- Selfdestruct1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Selfdestruct1.wav rename to public/audio/battle_anims/PRSFX- Selfdestruct1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Selfedestruct2.wav b/public/audio/battle_anims/PRSFX- Selfedestruct2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Selfedestruct2.wav rename to public/audio/battle_anims/PRSFX- Selfedestruct2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Ball1.wav b/public/audio/battle_anims/PRSFX- Shadow Ball1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Ball1.wav rename to public/audio/battle_anims/PRSFX- Shadow Ball1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Ball2.wav b/public/audio/battle_anims/PRSFX- Shadow Ball2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Ball2.wav rename to public/audio/battle_anims/PRSFX- Shadow Ball2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Claw1.wav b/public/audio/battle_anims/PRSFX- Shadow Claw1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Claw1.wav rename to public/audio/battle_anims/PRSFX- Shadow Claw1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Claw2.wav b/public/audio/battle_anims/PRSFX- Shadow Claw2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Claw2.wav rename to public/audio/battle_anims/PRSFX- Shadow Claw2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Force1.wav b/public/audio/battle_anims/PRSFX- Shadow Force1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Force1.wav rename to public/audio/battle_anims/PRSFX- Shadow Force1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Force2.wav b/public/audio/battle_anims/PRSFX- Shadow Force2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Force2.wav rename to public/audio/battle_anims/PRSFX- Shadow Force2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Punch1.wav b/public/audio/battle_anims/PRSFX- Shadow Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Punch1.wav rename to public/audio/battle_anims/PRSFX- Shadow Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Punch2.wav b/public/audio/battle_anims/PRSFX- Shadow Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Punch2.wav rename to public/audio/battle_anims/PRSFX- Shadow Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Sneak1.wav b/public/audio/battle_anims/PRSFX- Shadow Sneak1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Sneak1.wav rename to public/audio/battle_anims/PRSFX- Shadow Sneak1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shadow Sneak2.wav b/public/audio/battle_anims/PRSFX- Shadow Sneak2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shadow Sneak2.wav rename to public/audio/battle_anims/PRSFX- Shadow Sneak2.wav diff --git a/public/audio/se/battle_anims/PRSFX- ShadowBone1.wav b/public/audio/battle_anims/PRSFX- ShadowBone1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- ShadowBone1.wav rename to public/audio/battle_anims/PRSFX- ShadowBone1.wav diff --git a/public/audio/se/battle_anims/PRSFX- ShadowBone2.wav b/public/audio/battle_anims/PRSFX- ShadowBone2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- ShadowBone2.wav rename to public/audio/battle_anims/PRSFX- ShadowBone2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sharpen.wav b/public/audio/battle_anims/PRSFX- Sharpen.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sharpen.wav rename to public/audio/battle_anims/PRSFX- Sharpen.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shattered Psyche1.wav b/public/audio/battle_anims/PRSFX- Shattered Psyche1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shattered Psyche1.wav rename to public/audio/battle_anims/PRSFX- Shattered Psyche1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shattered Psyche2.wav b/public/audio/battle_anims/PRSFX- Shattered Psyche2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shattered Psyche2.wav rename to public/audio/battle_anims/PRSFX- Shattered Psyche2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shattered Psyche3.wav b/public/audio/battle_anims/PRSFX- Shattered Psyche3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shattered Psyche3.wav rename to public/audio/battle_anims/PRSFX- Shattered Psyche3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sheer Cold.wav b/public/audio/battle_anims/PRSFX- Sheer Cold.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sheer Cold.wav rename to public/audio/battle_anims/PRSFX- Sheer Cold.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shell Smash1.wav b/public/audio/battle_anims/PRSFX- Shell Smash1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shell Smash1.wav rename to public/audio/battle_anims/PRSFX- Shell Smash1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shell Smash2.wav b/public/audio/battle_anims/PRSFX- Shell Smash2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shell Smash2.wav rename to public/audio/battle_anims/PRSFX- Shell Smash2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shell Trap1.wav b/public/audio/battle_anims/PRSFX- Shell Trap1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shell Trap1.wav rename to public/audio/battle_anims/PRSFX- Shell Trap1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shell Trap2.wav b/public/audio/battle_anims/PRSFX- Shell Trap2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shell Trap2.wav rename to public/audio/battle_anims/PRSFX- Shell Trap2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shell Trap3.wav b/public/audio/battle_anims/PRSFX- Shell Trap3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shell Trap3.wav rename to public/audio/battle_anims/PRSFX- Shell Trap3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shift Gear.wav b/public/audio/battle_anims/PRSFX- Shift Gear.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shift Gear.wav rename to public/audio/battle_anims/PRSFX- Shift Gear.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shiny.wav b/public/audio/battle_anims/PRSFX- Shiny.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shiny.wav rename to public/audio/battle_anims/PRSFX- Shiny.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shockwave.wav b/public/audio/battle_anims/PRSFX- Shockwave.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shockwave.wav rename to public/audio/battle_anims/PRSFX- Shockwave.wav diff --git a/public/audio/se/battle_anims/PRSFX- Shore Up.wav b/public/audio/battle_anims/PRSFX- Shore Up.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Shore Up.wav rename to public/audio/battle_anims/PRSFX- Shore Up.wav diff --git a/public/audio/se/battle_anims/PRSFX- Signal Beam.wav b/public/audio/battle_anims/PRSFX- Signal Beam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Signal Beam.wav rename to public/audio/battle_anims/PRSFX- Signal Beam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Silver Wind.wav b/public/audio/battle_anims/PRSFX- Silver Wind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Silver Wind.wav rename to public/audio/battle_anims/PRSFX- Silver Wind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Simple Beam.wav b/public/audio/battle_anims/PRSFX- Simple Beam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Simple Beam.wav rename to public/audio/battle_anims/PRSFX- Simple Beam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sing.wav b/public/audio/battle_anims/PRSFX- Sing.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sing.wav rename to public/audio/battle_anims/PRSFX- Sing.wav diff --git a/public/audio/se/battle_anims/PRSFX- SinisterArrowRaid1.wav b/public/audio/battle_anims/PRSFX- SinisterArrowRaid1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- SinisterArrowRaid1.wav rename to public/audio/battle_anims/PRSFX- SinisterArrowRaid1.wav diff --git a/public/audio/se/battle_anims/PRSFX- SinisterArrowRaid2.wav b/public/audio/battle_anims/PRSFX- SinisterArrowRaid2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- SinisterArrowRaid2.wav rename to public/audio/battle_anims/PRSFX- SinisterArrowRaid2.wav diff --git a/public/audio/se/battle_anims/PRSFX- SinisterArrowRaid3.wav b/public/audio/battle_anims/PRSFX- SinisterArrowRaid3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- SinisterArrowRaid3.wav rename to public/audio/battle_anims/PRSFX- SinisterArrowRaid3.wav diff --git a/public/audio/se/battle_anims/PRSFX- SinisterArrowRaid4.wav b/public/audio/battle_anims/PRSFX- SinisterArrowRaid4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- SinisterArrowRaid4.wav rename to public/audio/battle_anims/PRSFX- SinisterArrowRaid4.wav diff --git a/public/audio/se/battle_anims/PRSFX- SinisterArrowRaid5.wav b/public/audio/battle_anims/PRSFX- SinisterArrowRaid5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- SinisterArrowRaid5.wav rename to public/audio/battle_anims/PRSFX- SinisterArrowRaid5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sketch.wav b/public/audio/battle_anims/PRSFX- Sketch.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sketch.wav rename to public/audio/battle_anims/PRSFX- Sketch.wav diff --git a/public/audio/se/battle_anims/PRSFX- Skill Swap.wav b/public/audio/battle_anims/PRSFX- Skill Swap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Skill Swap.wav rename to public/audio/battle_anims/PRSFX- Skill Swap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Skull Bash1.wav b/public/audio/battle_anims/PRSFX- Skull Bash1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Skull Bash1.wav rename to public/audio/battle_anims/PRSFX- Skull Bash1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Skull Bash2.wav b/public/audio/battle_anims/PRSFX- Skull Bash2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Skull Bash2.wav rename to public/audio/battle_anims/PRSFX- Skull Bash2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sky Attack1.wav b/public/audio/battle_anims/PRSFX- Sky Attack1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sky Attack1.wav rename to public/audio/battle_anims/PRSFX- Sky Attack1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sky Attack2.wav b/public/audio/battle_anims/PRSFX- Sky Attack2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sky Attack2.wav rename to public/audio/battle_anims/PRSFX- Sky Attack2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sky Attack3.wav b/public/audio/battle_anims/PRSFX- Sky Attack3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sky Attack3.wav rename to public/audio/battle_anims/PRSFX- Sky Attack3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sky Drop1.wav b/public/audio/battle_anims/PRSFX- Sky Drop1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sky Drop1.wav rename to public/audio/battle_anims/PRSFX- Sky Drop1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sky Drop2.wav b/public/audio/battle_anims/PRSFX- Sky Drop2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sky Drop2.wav rename to public/audio/battle_anims/PRSFX- Sky Drop2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sky Drop3.wav b/public/audio/battle_anims/PRSFX- Sky Drop3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sky Drop3.wav rename to public/audio/battle_anims/PRSFX- Sky Drop3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sky Uppercut1.wav b/public/audio/battle_anims/PRSFX- Sky Uppercut1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sky Uppercut1.wav rename to public/audio/battle_anims/PRSFX- Sky Uppercut1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sky Uppercut2.wav b/public/audio/battle_anims/PRSFX- Sky Uppercut2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sky Uppercut2.wav rename to public/audio/battle_anims/PRSFX- Sky Uppercut2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Slack Off.wav b/public/audio/battle_anims/PRSFX- Slack Off.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Slack Off.wav rename to public/audio/battle_anims/PRSFX- Slack Off.wav diff --git a/public/audio/se/battle_anims/PRSFX- Slam.wav b/public/audio/battle_anims/PRSFX- Slam.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Slam.wav rename to public/audio/battle_anims/PRSFX- Slam.wav diff --git a/public/audio/se/battle_anims/PRSFX- Slash.wav b/public/audio/battle_anims/PRSFX- Slash.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Slash.wav rename to public/audio/battle_anims/PRSFX- Slash.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sleep Powder.wav b/public/audio/battle_anims/PRSFX- Sleep Powder.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sleep Powder.wav rename to public/audio/battle_anims/PRSFX- Sleep Powder.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sleep Talk.wav b/public/audio/battle_anims/PRSFX- Sleep Talk.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sleep Talk.wav rename to public/audio/battle_anims/PRSFX- Sleep Talk.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sleep.wav b/public/audio/battle_anims/PRSFX- Sleep.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sleep.wav rename to public/audio/battle_anims/PRSFX- Sleep.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sludge Bomb1.wav b/public/audio/battle_anims/PRSFX- Sludge Bomb1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sludge Bomb1.wav rename to public/audio/battle_anims/PRSFX- Sludge Bomb1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sludge Bomb2.wav b/public/audio/battle_anims/PRSFX- Sludge Bomb2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sludge Bomb2.wav rename to public/audio/battle_anims/PRSFX- Sludge Bomb2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sludge Wave.wav b/public/audio/battle_anims/PRSFX- Sludge Wave.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sludge Wave.wav rename to public/audio/battle_anims/PRSFX- Sludge Wave.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sludge.wav b/public/audio/battle_anims/PRSFX- Sludge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sludge.wav rename to public/audio/battle_anims/PRSFX- Sludge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smack Down1.wav b/public/audio/battle_anims/PRSFX- Smack Down1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smack Down1.wav rename to public/audio/battle_anims/PRSFX- Smack Down1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smack Down2.wav b/public/audio/battle_anims/PRSFX- Smack Down2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smack Down2.wav rename to public/audio/battle_anims/PRSFX- Smack Down2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smack Down3.wav b/public/audio/battle_anims/PRSFX- Smack Down3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smack Down3.wav rename to public/audio/battle_anims/PRSFX- Smack Down3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smart Strike1.wav b/public/audio/battle_anims/PRSFX- Smart Strike1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smart Strike1.wav rename to public/audio/battle_anims/PRSFX- Smart Strike1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smart Strike2.wav b/public/audio/battle_anims/PRSFX- Smart Strike2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smart Strike2.wav rename to public/audio/battle_anims/PRSFX- Smart Strike2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smart Strike3.wav b/public/audio/battle_anims/PRSFX- Smart Strike3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smart Strike3.wav rename to public/audio/battle_anims/PRSFX- Smart Strike3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smart Strike4.wav b/public/audio/battle_anims/PRSFX- Smart Strike4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smart Strike4.wav rename to public/audio/battle_anims/PRSFX- Smart Strike4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smellingsalts.wav b/public/audio/battle_anims/PRSFX- Smellingsalts.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smellingsalts.wav rename to public/audio/battle_anims/PRSFX- Smellingsalts.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smog.wav b/public/audio/battle_anims/PRSFX- Smog.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smog.wav rename to public/audio/battle_anims/PRSFX- Smog.wav diff --git a/public/audio/se/battle_anims/PRSFX- Smokescreen.wav b/public/audio/battle_anims/PRSFX- Smokescreen.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Smokescreen.wav rename to public/audio/battle_anims/PRSFX- Smokescreen.wav diff --git a/public/audio/se/battle_anims/PRSFX- Snarl.wav b/public/audio/battle_anims/PRSFX- Snarl.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Snarl.wav rename to public/audio/battle_anims/PRSFX- Snarl.wav diff --git a/public/audio/se/battle_anims/PRSFX- Snatch.wav b/public/audio/battle_anims/PRSFX- Snatch.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Snatch.wav rename to public/audio/battle_anims/PRSFX- Snatch.wav diff --git a/public/audio/se/battle_anims/PRSFX- Snore.wav b/public/audio/battle_anims/PRSFX- Snore.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Snore.wav rename to public/audio/battle_anims/PRSFX- Snore.wav diff --git a/public/audio/se/battle_anims/PRSFX- Soak.wav b/public/audio/battle_anims/PRSFX- Soak.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Soak.wav rename to public/audio/battle_anims/PRSFX- Soak.wav diff --git a/public/audio/se/battle_anims/PRSFX- Softboiled1.wav b/public/audio/battle_anims/PRSFX- Softboiled1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Softboiled1.wav rename to public/audio/battle_anims/PRSFX- Softboiled1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Softboiled2.wav b/public/audio/battle_anims/PRSFX- Softboiled2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Softboiled2.wav rename to public/audio/battle_anims/PRSFX- Softboiled2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Softboiled3.wav b/public/audio/battle_anims/PRSFX- Softboiled3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Softboiled3.wav rename to public/audio/battle_anims/PRSFX- Softboiled3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Solar Beam1.wav b/public/audio/battle_anims/PRSFX- Solar Beam1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Solar Beam1.wav rename to public/audio/battle_anims/PRSFX- Solar Beam1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Solar Beam2.wav b/public/audio/battle_anims/PRSFX- Solar Beam2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Solar Beam2.wav rename to public/audio/battle_anims/PRSFX- Solar Beam2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sonic Boom1.wav b/public/audio/battle_anims/PRSFX- Sonic Boom1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sonic Boom1.wav rename to public/audio/battle_anims/PRSFX- Sonic Boom1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sonic Boom2.wav b/public/audio/battle_anims/PRSFX- Sonic Boom2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sonic Boom2.wav rename to public/audio/battle_anims/PRSFX- Sonic Boom2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spacial Rend.wav b/public/audio/battle_anims/PRSFX- Spacial Rend.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spacial Rend.wav rename to public/audio/battle_anims/PRSFX- Spacial Rend.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spark1.wav b/public/audio/battle_anims/PRSFX- Spark1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spark1.wav rename to public/audio/battle_anims/PRSFX- Spark1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spark2.wav b/public/audio/battle_anims/PRSFX- Spark2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spark2.wav rename to public/audio/battle_anims/PRSFX- Spark2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sparkling Aria1.wav b/public/audio/battle_anims/PRSFX- Sparkling Aria1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sparkling Aria1.wav rename to public/audio/battle_anims/PRSFX- Sparkling Aria1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sparkling Aria2.wav b/public/audio/battle_anims/PRSFX- Sparkling Aria2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sparkling Aria2.wav rename to public/audio/battle_anims/PRSFX- Sparkling Aria2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sparkling Aria3.wav b/public/audio/battle_anims/PRSFX- Sparkling Aria3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sparkling Aria3.wav rename to public/audio/battle_anims/PRSFX- Sparkling Aria3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spectral Thief1.wav b/public/audio/battle_anims/PRSFX- Spectral Thief1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spectral Thief1.wav rename to public/audio/battle_anims/PRSFX- Spectral Thief1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spectral Thief2.wav b/public/audio/battle_anims/PRSFX- Spectral Thief2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spectral Thief2.wav rename to public/audio/battle_anims/PRSFX- Spectral Thief2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spectral Thief3.wav b/public/audio/battle_anims/PRSFX- Spectral Thief3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spectral Thief3.wav rename to public/audio/battle_anims/PRSFX- Spectral Thief3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spectral Thief4.wav b/public/audio/battle_anims/PRSFX- Spectral Thief4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spectral Thief4.wav rename to public/audio/battle_anims/PRSFX- Spectral Thief4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Speed Swap.wav b/public/audio/battle_anims/PRSFX- Speed Swap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Speed Swap.wav rename to public/audio/battle_anims/PRSFX- Speed Swap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spider Web1.wav b/public/audio/battle_anims/PRSFX- Spider Web1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spider Web1.wav rename to public/audio/battle_anims/PRSFX- Spider Web1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spider Web2.wav b/public/audio/battle_anims/PRSFX- Spider Web2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spider Web2.wav rename to public/audio/battle_anims/PRSFX- Spider Web2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spike Cannon.wav b/public/audio/battle_anims/PRSFX- Spike Cannon.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spike Cannon.wav rename to public/audio/battle_anims/PRSFX- Spike Cannon.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spikes1.wav b/public/audio/battle_anims/PRSFX- Spikes1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spikes1.wav rename to public/audio/battle_anims/PRSFX- Spikes1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spikes2.wav b/public/audio/battle_anims/PRSFX- Spikes2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spikes2.wav rename to public/audio/battle_anims/PRSFX- Spikes2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spiky Shield1.wav b/public/audio/battle_anims/PRSFX- Spiky Shield1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spiky Shield1.wav rename to public/audio/battle_anims/PRSFX- Spiky Shield1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spiky Shield2.wav b/public/audio/battle_anims/PRSFX- Spiky Shield2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spiky Shield2.wav rename to public/audio/battle_anims/PRSFX- Spiky Shield2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spirit Shackle1.wav b/public/audio/battle_anims/PRSFX- Spirit Shackle1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spirit Shackle1.wav rename to public/audio/battle_anims/PRSFX- Spirit Shackle1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spirit Shackle2.wav b/public/audio/battle_anims/PRSFX- Spirit Shackle2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spirit Shackle2.wav rename to public/audio/battle_anims/PRSFX- Spirit Shackle2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spirit Shackle3.wav b/public/audio/battle_anims/PRSFX- Spirit Shackle3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spirit Shackle3.wav rename to public/audio/battle_anims/PRSFX- Spirit Shackle3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spirit Shackle4.wav b/public/audio/battle_anims/PRSFX- Spirit Shackle4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spirit Shackle4.wav rename to public/audio/battle_anims/PRSFX- Spirit Shackle4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spit Up.wav b/public/audio/battle_anims/PRSFX- Spit Up.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spit Up.wav rename to public/audio/battle_anims/PRSFX- Spit Up.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spite1.wav b/public/audio/battle_anims/PRSFX- Spite1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spite1.wav rename to public/audio/battle_anims/PRSFX- Spite1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spite2.wav b/public/audio/battle_anims/PRSFX- Spite2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spite2.wav rename to public/audio/battle_anims/PRSFX- Spite2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Splash.wav b/public/audio/battle_anims/PRSFX- Splash.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Splash.wav rename to public/audio/battle_anims/PRSFX- Splash.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spore.wav b/public/audio/battle_anims/PRSFX- Spore.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spore.wav rename to public/audio/battle_anims/PRSFX- Spore.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spotlight1.wav b/public/audio/battle_anims/PRSFX- Spotlight1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spotlight1.wav rename to public/audio/battle_anims/PRSFX- Spotlight1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spotlight2.wav b/public/audio/battle_anims/PRSFX- Spotlight2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spotlight2.wav rename to public/audio/battle_anims/PRSFX- Spotlight2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spotlight3.wav b/public/audio/battle_anims/PRSFX- Spotlight3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spotlight3.wav rename to public/audio/battle_anims/PRSFX- Spotlight3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spotlight4.wav b/public/audio/battle_anims/PRSFX- Spotlight4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spotlight4.wav rename to public/audio/battle_anims/PRSFX- Spotlight4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Spotlight5.wav b/public/audio/battle_anims/PRSFX- Spotlight5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Spotlight5.wav rename to public/audio/battle_anims/PRSFX- Spotlight5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stat Down.wav b/public/audio/battle_anims/PRSFX- Stat Down.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stat Down.wav rename to public/audio/battle_anims/PRSFX- Stat Down.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stat Up.wav b/public/audio/battle_anims/PRSFX- Stat Up.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stat Up.wav rename to public/audio/battle_anims/PRSFX- Stat Up.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stealth Rocks.wav b/public/audio/battle_anims/PRSFX- Stealth Rocks.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stealth Rocks.wav rename to public/audio/battle_anims/PRSFX- Stealth Rocks.wav diff --git a/public/audio/se/battle_anims/PRSFX- Steam Eruption1.wav b/public/audio/battle_anims/PRSFX- Steam Eruption1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Steam Eruption1.wav rename to public/audio/battle_anims/PRSFX- Steam Eruption1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Steam Eruption2.wav b/public/audio/battle_anims/PRSFX- Steam Eruption2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Steam Eruption2.wav rename to public/audio/battle_anims/PRSFX- Steam Eruption2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Steamroller1.wav b/public/audio/battle_anims/PRSFX- Steamroller1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Steamroller1.wav rename to public/audio/battle_anims/PRSFX- Steamroller1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Steamroller2.wav b/public/audio/battle_anims/PRSFX- Steamroller2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Steamroller2.wav rename to public/audio/battle_anims/PRSFX- Steamroller2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Steel Wing.wav b/public/audio/battle_anims/PRSFX- Steel Wing.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Steel Wing.wav rename to public/audio/battle_anims/PRSFX- Steel Wing.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sticky Web.wav b/public/audio/battle_anims/PRSFX- Sticky Web.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sticky Web.wav rename to public/audio/battle_anims/PRSFX- Sticky Web.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stockpile.wav b/public/audio/battle_anims/PRSFX- Stockpile.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stockpile.wav rename to public/audio/battle_anims/PRSFX- Stockpile.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stomp.wav b/public/audio/battle_anims/PRSFX- Stomp.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stomp.wav rename to public/audio/battle_anims/PRSFX- Stomp.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stomping Tantrum.wav b/public/audio/battle_anims/PRSFX- Stomping Tantrum.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stomping Tantrum.wav rename to public/audio/battle_anims/PRSFX- Stomping Tantrum.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stone Edge.wav b/public/audio/battle_anims/PRSFX- Stone Edge.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stone Edge.wav rename to public/audio/battle_anims/PRSFX- Stone Edge.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stored Power1.wav b/public/audio/battle_anims/PRSFX- Stored Power1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stored Power1.wav rename to public/audio/battle_anims/PRSFX- Stored Power1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stored Power2.wav b/public/audio/battle_anims/PRSFX- Stored Power2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stored Power2.wav rename to public/audio/battle_anims/PRSFX- Stored Power2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Storm Throw1.wav b/public/audio/battle_anims/PRSFX- Storm Throw1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Storm Throw1.wav rename to public/audio/battle_anims/PRSFX- Storm Throw1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Storm Throw2.wav b/public/audio/battle_anims/PRSFX- Storm Throw2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Storm Throw2.wav rename to public/audio/battle_anims/PRSFX- Storm Throw2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Strength Sap1.wav b/public/audio/battle_anims/PRSFX- Strength Sap1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Strength Sap1.wav rename to public/audio/battle_anims/PRSFX- Strength Sap1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Strength Sap2.wav b/public/audio/battle_anims/PRSFX- Strength Sap2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Strength Sap2.wav rename to public/audio/battle_anims/PRSFX- Strength Sap2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Strength Sap3.wav b/public/audio/battle_anims/PRSFX- Strength Sap3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Strength Sap3.wav rename to public/audio/battle_anims/PRSFX- Strength Sap3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Strength.wav b/public/audio/battle_anims/PRSFX- Strength.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Strength.wav rename to public/audio/battle_anims/PRSFX- Strength.wav diff --git a/public/audio/se/battle_anims/PRSFX- String Shot1.wav b/public/audio/battle_anims/PRSFX- String Shot1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- String Shot1.wav rename to public/audio/battle_anims/PRSFX- String Shot1.wav diff --git a/public/audio/se/battle_anims/PRSFX- String Shot2.wav b/public/audio/battle_anims/PRSFX- String Shot2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- String Shot2.wav rename to public/audio/battle_anims/PRSFX- String Shot2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Struggle Bug.wav b/public/audio/battle_anims/PRSFX- Struggle Bug.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Struggle Bug.wav rename to public/audio/battle_anims/PRSFX- Struggle Bug.wav diff --git a/public/audio/se/battle_anims/PRSFX- Struggle.wav b/public/audio/battle_anims/PRSFX- Struggle.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Struggle.wav rename to public/audio/battle_anims/PRSFX- Struggle.wav diff --git a/public/audio/se/battle_anims/PRSFX- Stun Spore.wav b/public/audio/battle_anims/PRSFX- Stun Spore.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Stun Spore.wav rename to public/audio/battle_anims/PRSFX- Stun Spore.wav diff --git a/public/audio/se/battle_anims/PRSFX- Submission.wav b/public/audio/battle_anims/PRSFX- Submission.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Submission.wav rename to public/audio/battle_anims/PRSFX- Submission.wav diff --git a/public/audio/se/battle_anims/PRSFX- Substitute1.wav b/public/audio/battle_anims/PRSFX- Substitute1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Substitute1.wav rename to public/audio/battle_anims/PRSFX- Substitute1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Substitute2.wav b/public/audio/battle_anims/PRSFX- Substitute2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Substitute2.wav rename to public/audio/battle_anims/PRSFX- Substitute2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Subzero Slammer1.wav b/public/audio/battle_anims/PRSFX- Subzero Slammer1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Subzero Slammer1.wav rename to public/audio/battle_anims/PRSFX- Subzero Slammer1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Subzero Slammer2.wav b/public/audio/battle_anims/PRSFX- Subzero Slammer2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Subzero Slammer2.wav rename to public/audio/battle_anims/PRSFX- Subzero Slammer2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Subzero Slammer3.wav b/public/audio/battle_anims/PRSFX- Subzero Slammer3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Subzero Slammer3.wav rename to public/audio/battle_anims/PRSFX- Subzero Slammer3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Subzero Slammer4.wav b/public/audio/battle_anims/PRSFX- Subzero Slammer4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Subzero Slammer4.wav rename to public/audio/battle_anims/PRSFX- Subzero Slammer4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sucker Punch1.wav b/public/audio/battle_anims/PRSFX- Sucker Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sucker Punch1.wav rename to public/audio/battle_anims/PRSFX- Sucker Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sucker Punch2.wav b/public/audio/battle_anims/PRSFX- Sucker Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sucker Punch2.wav rename to public/audio/battle_anims/PRSFX- Sucker Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sunny Day.wav b/public/audio/battle_anims/PRSFX- Sunny Day.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sunny Day.wav rename to public/audio/battle_anims/PRSFX- Sunny Day.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sunny.wav b/public/audio/battle_anims/PRSFX- Sunny.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sunny.wav rename to public/audio/battle_anims/PRSFX- Sunny.wav diff --git a/public/audio/se/battle_anims/PRSFX- Super Fang1.wav b/public/audio/battle_anims/PRSFX- Super Fang1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Super Fang1.wav rename to public/audio/battle_anims/PRSFX- Super Fang1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Super Fang2.wav b/public/audio/battle_anims/PRSFX- Super Fang2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Super Fang2.wav rename to public/audio/battle_anims/PRSFX- Super Fang2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Superpower1.wav b/public/audio/battle_anims/PRSFX- Superpower1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Superpower1.wav rename to public/audio/battle_anims/PRSFX- Superpower1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Superpower2.wav b/public/audio/battle_anims/PRSFX- Superpower2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Superpower2.wav rename to public/audio/battle_anims/PRSFX- Superpower2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Supersonic.wav b/public/audio/battle_anims/PRSFX- Supersonic.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Supersonic.wav rename to public/audio/battle_anims/PRSFX- Supersonic.wav diff --git a/public/audio/se/battle_anims/PRSFX- Surf.wav b/public/audio/battle_anims/PRSFX- Surf.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Surf.wav rename to public/audio/battle_anims/PRSFX- Surf.wav diff --git a/public/audio/se/battle_anims/PRSFX- Swagger1.wav b/public/audio/battle_anims/PRSFX- Swagger1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Swagger1.wav rename to public/audio/battle_anims/PRSFX- Swagger1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Swagger2.wav b/public/audio/battle_anims/PRSFX- Swagger2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Swagger2.wav rename to public/audio/battle_anims/PRSFX- Swagger2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Swallow.wav b/public/audio/battle_anims/PRSFX- Swallow.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Swallow.wav rename to public/audio/battle_anims/PRSFX- Swallow.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sweet Kiss1.wav b/public/audio/battle_anims/PRSFX- Sweet Kiss1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sweet Kiss1.wav rename to public/audio/battle_anims/PRSFX- Sweet Kiss1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sweet Kiss2.wav b/public/audio/battle_anims/PRSFX- Sweet Kiss2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sweet Kiss2.wav rename to public/audio/battle_anims/PRSFX- Sweet Kiss2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Sweet Scent.wav b/public/audio/battle_anims/PRSFX- Sweet Scent.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Sweet Scent.wav rename to public/audio/battle_anims/PRSFX- Sweet Scent.wav diff --git a/public/audio/se/battle_anims/PRSFX- Swift1.wav b/public/audio/battle_anims/PRSFX- Swift1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Swift1.wav rename to public/audio/battle_anims/PRSFX- Swift1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Swift2.wav b/public/audio/battle_anims/PRSFX- Swift2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Swift2.wav rename to public/audio/battle_anims/PRSFX- Swift2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Switcheroo.wav b/public/audio/battle_anims/PRSFX- Switcheroo.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Switcheroo.wav rename to public/audio/battle_anims/PRSFX- Switcheroo.wav diff --git a/public/audio/se/battle_anims/PRSFX- Swords Dance1.wav b/public/audio/battle_anims/PRSFX- Swords Dance1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Swords Dance1.wav rename to public/audio/battle_anims/PRSFX- Swords Dance1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Swords Dance2.wav b/public/audio/battle_anims/PRSFX- Swords Dance2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Swords Dance2.wav rename to public/audio/battle_anims/PRSFX- Swords Dance2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Synchronoise.wav b/public/audio/battle_anims/PRSFX- Synchronoise.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Synchronoise.wav rename to public/audio/battle_anims/PRSFX- Synchronoise.wav diff --git a/public/audio/se/battle_anims/PRSFX- Synthesis.wav b/public/audio/battle_anims/PRSFX- Synthesis.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Synthesis.wav rename to public/audio/battle_anims/PRSFX- Synthesis.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tackle.wav b/public/audio/battle_anims/PRSFX- Tackle.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tackle.wav rename to public/audio/battle_anims/PRSFX- Tackle.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tail Glow.wav b/public/audio/battle_anims/PRSFX- Tail Glow.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tail Glow.wav rename to public/audio/battle_anims/PRSFX- Tail Glow.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tail Slap.wav b/public/audio/battle_anims/PRSFX- Tail Slap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tail Slap.wav rename to public/audio/battle_anims/PRSFX- Tail Slap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tail Whip.wav b/public/audio/battle_anims/PRSFX- Tail Whip.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tail Whip.wav rename to public/audio/battle_anims/PRSFX- Tail Whip.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tailwind.wav b/public/audio/battle_anims/PRSFX- Tailwind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tailwind.wav rename to public/audio/battle_anims/PRSFX- Tailwind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Take Down1.wav b/public/audio/battle_anims/PRSFX- Take Down1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Take Down1.wav rename to public/audio/battle_anims/PRSFX- Take Down1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Take Down2.wav b/public/audio/battle_anims/PRSFX- Take Down2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Take Down2.wav rename to public/audio/battle_anims/PRSFX- Take Down2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Taunt1.wav b/public/audio/battle_anims/PRSFX- Taunt1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Taunt1.wav rename to public/audio/battle_anims/PRSFX- Taunt1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Taunt2.wav b/public/audio/battle_anims/PRSFX- Taunt2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Taunt2.wav rename to public/audio/battle_anims/PRSFX- Taunt2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Taunt3.wav b/public/audio/battle_anims/PRSFX- Taunt3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Taunt3.wav rename to public/audio/battle_anims/PRSFX- Taunt3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tearful Look1.wav b/public/audio/battle_anims/PRSFX- Tearful Look1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tearful Look1.wav rename to public/audio/battle_anims/PRSFX- Tearful Look1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tearful Look2.wav b/public/audio/battle_anims/PRSFX- Tearful Look2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tearful Look2.wav rename to public/audio/battle_anims/PRSFX- Tearful Look2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tearful Look3.wav b/public/audio/battle_anims/PRSFX- Tearful Look3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tearful Look3.wav rename to public/audio/battle_anims/PRSFX- Tearful Look3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Techno Blast 1.wav b/public/audio/battle_anims/PRSFX- Techno Blast 1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Techno Blast 1.wav rename to public/audio/battle_anims/PRSFX- Techno Blast 1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Techno Blast 2.wav b/public/audio/battle_anims/PRSFX- Techno Blast 2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Techno Blast 2.wav rename to public/audio/battle_anims/PRSFX- Techno Blast 2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Techno Blast 3.wav b/public/audio/battle_anims/PRSFX- Techno Blast 3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Techno Blast 3.wav rename to public/audio/battle_anims/PRSFX- Techno Blast 3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Teeter Dance.wav b/public/audio/battle_anims/PRSFX- Teeter Dance.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Teeter Dance.wav rename to public/audio/battle_anims/PRSFX- Teeter Dance.wav diff --git a/public/audio/se/battle_anims/PRSFX- Telekinesis.wav b/public/audio/battle_anims/PRSFX- Telekinesis.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Telekinesis.wav rename to public/audio/battle_anims/PRSFX- Telekinesis.wav diff --git a/public/audio/se/battle_anims/PRSFX- Teleport.wav b/public/audio/battle_anims/PRSFX- Teleport.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Teleport.wav rename to public/audio/battle_anims/PRSFX- Teleport.wav diff --git a/public/audio/se/battle_anims/PRSFX- Theif1.wav b/public/audio/battle_anims/PRSFX- Theif1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Theif1.wav rename to public/audio/battle_anims/PRSFX- Theif1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Theif2.wav b/public/audio/battle_anims/PRSFX- Theif2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Theif2.wav rename to public/audio/battle_anims/PRSFX- Theif2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thousand Arrows1.wav b/public/audio/battle_anims/PRSFX- Thousand Arrows1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thousand Arrows1.wav rename to public/audio/battle_anims/PRSFX- Thousand Arrows1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thousand Arrows2.wav b/public/audio/battle_anims/PRSFX- Thousand Arrows2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thousand Arrows2.wav rename to public/audio/battle_anims/PRSFX- Thousand Arrows2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thousand Waves1.wav b/public/audio/battle_anims/PRSFX- Thousand Waves1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thousand Waves1.wav rename to public/audio/battle_anims/PRSFX- Thousand Waves1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thousand Waves2.wav b/public/audio/battle_anims/PRSFX- Thousand Waves2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thousand Waves2.wav rename to public/audio/battle_anims/PRSFX- Thousand Waves2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thrash.wav b/public/audio/battle_anims/PRSFX- Thrash.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thrash.wav rename to public/audio/battle_anims/PRSFX- Thrash.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thrash2.wav b/public/audio/battle_anims/PRSFX- Thrash2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thrash2.wav rename to public/audio/battle_anims/PRSFX- Thrash2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Throat Chop1.wav b/public/audio/battle_anims/PRSFX- Throat Chop1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Throat Chop1.wav rename to public/audio/battle_anims/PRSFX- Throat Chop1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Throat Chop2.wav b/public/audio/battle_anims/PRSFX- Throat Chop2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Throat Chop2.wav rename to public/audio/battle_anims/PRSFX- Throat Chop2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Throat Chop3.wav b/public/audio/battle_anims/PRSFX- Throat Chop3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Throat Chop3.wav rename to public/audio/battle_anims/PRSFX- Throat Chop3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Throat Chop4.wav b/public/audio/battle_anims/PRSFX- Throat Chop4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Throat Chop4.wav rename to public/audio/battle_anims/PRSFX- Throat Chop4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Throat Chop5.wav b/public/audio/battle_anims/PRSFX- Throat Chop5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Throat Chop5.wav rename to public/audio/battle_anims/PRSFX- Throat Chop5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thunder Fang.wav b/public/audio/battle_anims/PRSFX- Thunder Fang.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thunder Fang.wav rename to public/audio/battle_anims/PRSFX- Thunder Fang.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thunder Punch1.wav b/public/audio/battle_anims/PRSFX- Thunder Punch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thunder Punch1.wav rename to public/audio/battle_anims/PRSFX- Thunder Punch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thunder Punch2.wav b/public/audio/battle_anims/PRSFX- Thunder Punch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thunder Punch2.wav rename to public/audio/battle_anims/PRSFX- Thunder Punch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thunder Wave.wav b/public/audio/battle_anims/PRSFX- Thunder Wave.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thunder Wave.wav rename to public/audio/battle_anims/PRSFX- Thunder Wave.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thunder.wav b/public/audio/battle_anims/PRSFX- Thunder.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thunder.wav rename to public/audio/battle_anims/PRSFX- Thunder.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thunderbolt1.wav b/public/audio/battle_anims/PRSFX- Thunderbolt1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thunderbolt1.wav rename to public/audio/battle_anims/PRSFX- Thunderbolt1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thunderbolt2.wav b/public/audio/battle_anims/PRSFX- Thunderbolt2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thunderbolt2.wav rename to public/audio/battle_anims/PRSFX- Thunderbolt2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Thundershock.wav b/public/audio/battle_anims/PRSFX- Thundershock.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Thundershock.wav rename to public/audio/battle_anims/PRSFX- Thundershock.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tickle.wav b/public/audio/battle_anims/PRSFX- Tickle.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tickle.wav rename to public/audio/battle_anims/PRSFX- Tickle.wav diff --git a/public/audio/se/battle_anims/PRSFX- Topsy Turvy.wav b/public/audio/battle_anims/PRSFX- Topsy Turvy.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Topsy Turvy.wav rename to public/audio/battle_anims/PRSFX- Topsy Turvy.wav diff --git a/public/audio/se/battle_anims/PRSFX- Torment1.wav b/public/audio/battle_anims/PRSFX- Torment1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Torment1.wav rename to public/audio/battle_anims/PRSFX- Torment1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Torment2.wav b/public/audio/battle_anims/PRSFX- Torment2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Torment2.wav rename to public/audio/battle_anims/PRSFX- Torment2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Toxic Spikes1.wav b/public/audio/battle_anims/PRSFX- Toxic Spikes1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Toxic Spikes1.wav rename to public/audio/battle_anims/PRSFX- Toxic Spikes1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Toxic Spikes2.wav b/public/audio/battle_anims/PRSFX- Toxic Spikes2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Toxic Spikes2.wav rename to public/audio/battle_anims/PRSFX- Toxic Spikes2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Toxic Thread1.wav b/public/audio/battle_anims/PRSFX- Toxic Thread1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Toxic Thread1.wav rename to public/audio/battle_anims/PRSFX- Toxic Thread1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Toxic Thread2.wav b/public/audio/battle_anims/PRSFX- Toxic Thread2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Toxic Thread2.wav rename to public/audio/battle_anims/PRSFX- Toxic Thread2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Toxic Thread3.wav b/public/audio/battle_anims/PRSFX- Toxic Thread3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Toxic Thread3.wav rename to public/audio/battle_anims/PRSFX- Toxic Thread3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Toxic1.wav b/public/audio/battle_anims/PRSFX- Toxic1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Toxic1.wav rename to public/audio/battle_anims/PRSFX- Toxic1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Toxic2.wav b/public/audio/battle_anims/PRSFX- Toxic2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Toxic2.wav rename to public/audio/battle_anims/PRSFX- Toxic2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trainer.wav b/public/audio/battle_anims/PRSFX- Trainer.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trainer.wav rename to public/audio/battle_anims/PRSFX- Trainer.wav diff --git a/public/audio/se/battle_anims/PRSFX- Transform.wav b/public/audio/battle_anims/PRSFX- Transform.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Transform.wav rename to public/audio/battle_anims/PRSFX- Transform.wav diff --git a/public/audio/se/battle_anims/PRSFX- Tri Attack.wav b/public/audio/battle_anims/PRSFX- Tri Attack.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Tri Attack.wav rename to public/audio/battle_anims/PRSFX- Tri Attack.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trick Room.wav b/public/audio/battle_anims/PRSFX- Trick Room.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trick Room.wav rename to public/audio/battle_anims/PRSFX- Trick Room.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trick or Treat.wav b/public/audio/battle_anims/PRSFX- Trick or Treat.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trick or Treat.wav rename to public/audio/battle_anims/PRSFX- Trick or Treat.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trick.wav b/public/audio/battle_anims/PRSFX- Trick.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trick.wav rename to public/audio/battle_anims/PRSFX- Trick.wav diff --git a/public/audio/se/battle_anims/PRSFX- Triple Kick.wav b/public/audio/battle_anims/PRSFX- Triple Kick.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Triple Kick.wav rename to public/audio/battle_anims/PRSFX- Triple Kick.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trop Kick1.wav b/public/audio/battle_anims/PRSFX- Trop Kick1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trop Kick1.wav rename to public/audio/battle_anims/PRSFX- Trop Kick1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trop Kick2.wav b/public/audio/battle_anims/PRSFX- Trop Kick2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trop Kick2.wav rename to public/audio/battle_anims/PRSFX- Trop Kick2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trop Kick3.wav b/public/audio/battle_anims/PRSFX- Trop Kick3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trop Kick3.wav rename to public/audio/battle_anims/PRSFX- Trop Kick3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trump Card1.wav b/public/audio/battle_anims/PRSFX- Trump Card1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trump Card1.wav rename to public/audio/battle_anims/PRSFX- Trump Card1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Trump Card2.wav b/public/audio/battle_anims/PRSFX- Trump Card2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Trump Card2.wav rename to public/audio/battle_anims/PRSFX- Trump Card2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Twineedle1.wav b/public/audio/battle_anims/PRSFX- Twineedle1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Twineedle1.wav rename to public/audio/battle_anims/PRSFX- Twineedle1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Twineedle2.wav b/public/audio/battle_anims/PRSFX- Twineedle2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Twineedle2.wav rename to public/audio/battle_anims/PRSFX- Twineedle2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Twinkle Tackle1.wav b/public/audio/battle_anims/PRSFX- Twinkle Tackle1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Twinkle Tackle1.wav rename to public/audio/battle_anims/PRSFX- Twinkle Tackle1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Twinkle Tackle2.wav b/public/audio/battle_anims/PRSFX- Twinkle Tackle2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Twinkle Tackle2.wav rename to public/audio/battle_anims/PRSFX- Twinkle Tackle2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Twinkle Tackle3.wav b/public/audio/battle_anims/PRSFX- Twinkle Tackle3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Twinkle Tackle3.wav rename to public/audio/battle_anims/PRSFX- Twinkle Tackle3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Twister.wav b/public/audio/battle_anims/PRSFX- Twister.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Twister.wav rename to public/audio/battle_anims/PRSFX- Twister.wav diff --git a/public/audio/se/battle_anims/PRSFX- U-Turn.wav b/public/audio/battle_anims/PRSFX- U-Turn.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- U-Turn.wav rename to public/audio/battle_anims/PRSFX- U-Turn.wav diff --git a/public/audio/se/battle_anims/PRSFX- U-Turn2.wav b/public/audio/battle_anims/PRSFX- U-Turn2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- U-Turn2.wav rename to public/audio/battle_anims/PRSFX- U-Turn2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Uproar1.wav b/public/audio/battle_anims/PRSFX- Uproar1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Uproar1.wav rename to public/audio/battle_anims/PRSFX- Uproar1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Uproar2.wav b/public/audio/battle_anims/PRSFX- Uproar2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Uproar2.wav rename to public/audio/battle_anims/PRSFX- Uproar2.wav diff --git a/public/audio/se/battle_anims/PRSFX- V-Create1.wav b/public/audio/battle_anims/PRSFX- V-Create1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- V-Create1.wav rename to public/audio/battle_anims/PRSFX- V-Create1.wav diff --git a/public/audio/se/battle_anims/PRSFX- V-Create2.wav b/public/audio/battle_anims/PRSFX- V-Create2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- V-Create2.wav rename to public/audio/battle_anims/PRSFX- V-Create2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Vacuum Wave1.wav b/public/audio/battle_anims/PRSFX- Vacuum Wave1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Vacuum Wave1.wav rename to public/audio/battle_anims/PRSFX- Vacuum Wave1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Vacuum Wave2.wav b/public/audio/battle_anims/PRSFX- Vacuum Wave2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Vacuum Wave2.wav rename to public/audio/battle_anims/PRSFX- Vacuum Wave2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Venom Drench.wav b/public/audio/battle_anims/PRSFX- Venom Drench.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Venom Drench.wav rename to public/audio/battle_anims/PRSFX- Venom Drench.wav diff --git a/public/audio/se/battle_anims/PRSFX- Venoshock1.wav b/public/audio/battle_anims/PRSFX- Venoshock1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Venoshock1.wav rename to public/audio/battle_anims/PRSFX- Venoshock1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Venoshock2.wav b/public/audio/battle_anims/PRSFX- Venoshock2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Venoshock2.wav rename to public/audio/battle_anims/PRSFX- Venoshock2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Vice Grip.wav b/public/audio/battle_anims/PRSFX- Vice Grip.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Vice Grip.wav rename to public/audio/battle_anims/PRSFX- Vice Grip.wav diff --git a/public/audio/se/battle_anims/PRSFX- Vine Whip.wav b/public/audio/battle_anims/PRSFX- Vine Whip.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Vine Whip.wav rename to public/audio/battle_anims/PRSFX- Vine Whip.wav diff --git a/public/audio/se/battle_anims/PRSFX- Vital Throw1.wav b/public/audio/battle_anims/PRSFX- Vital Throw1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Vital Throw1.wav rename to public/audio/battle_anims/PRSFX- Vital Throw1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Vital Throw2.wav b/public/audio/battle_anims/PRSFX- Vital Throw2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Vital Throw2.wav rename to public/audio/battle_anims/PRSFX- Vital Throw2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Volt Switch1.wav b/public/audio/battle_anims/PRSFX- Volt Switch1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Volt Switch1.wav rename to public/audio/battle_anims/PRSFX- Volt Switch1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Volt Switch2.wav b/public/audio/battle_anims/PRSFX- Volt Switch2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Volt Switch2.wav rename to public/audio/battle_anims/PRSFX- Volt Switch2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Volt Tackle1.wav b/public/audio/battle_anims/PRSFX- Volt Tackle1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Volt Tackle1.wav rename to public/audio/battle_anims/PRSFX- Volt Tackle1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Volt Tackle2.wav b/public/audio/battle_anims/PRSFX- Volt Tackle2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Volt Tackle2.wav rename to public/audio/battle_anims/PRSFX- Volt Tackle2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wake Up Slap.wav b/public/audio/battle_anims/PRSFX- Wake Up Slap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wake Up Slap.wav rename to public/audio/battle_anims/PRSFX- Wake Up Slap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Gun.wav b/public/audio/battle_anims/PRSFX- Water Gun.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Gun.wav rename to public/audio/battle_anims/PRSFX- Water Gun.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Pledge1.wav b/public/audio/battle_anims/PRSFX- Water Pledge1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Pledge1.wav rename to public/audio/battle_anims/PRSFX- Water Pledge1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Pledge2.wav b/public/audio/battle_anims/PRSFX- Water Pledge2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Pledge2.wav rename to public/audio/battle_anims/PRSFX- Water Pledge2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Pulse.wav b/public/audio/battle_anims/PRSFX- Water Pulse.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Pulse.wav rename to public/audio/battle_anims/PRSFX- Water Pulse.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Pulse2.wav b/public/audio/battle_anims/PRSFX- Water Pulse2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Pulse2.wav rename to public/audio/battle_anims/PRSFX- Water Pulse2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Shurkein.wav b/public/audio/battle_anims/PRSFX- Water Shurkein.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Shurkein.wav rename to public/audio/battle_anims/PRSFX- Water Shurkein.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Sport.wav b/public/audio/battle_anims/PRSFX- Water Sport.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Sport.wav rename to public/audio/battle_anims/PRSFX- Water Sport.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Spout1.wav b/public/audio/battle_anims/PRSFX- Water Spout1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Spout1.wav rename to public/audio/battle_anims/PRSFX- Water Spout1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Water Spout2.wav b/public/audio/battle_anims/PRSFX- Water Spout2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Water Spout2.wav rename to public/audio/battle_anims/PRSFX- Water Spout2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Waterfall1.wav b/public/audio/battle_anims/PRSFX- Waterfall1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Waterfall1.wav rename to public/audio/battle_anims/PRSFX- Waterfall1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Waterfall2.wav b/public/audio/battle_anims/PRSFX- Waterfall2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Waterfall2.wav rename to public/audio/battle_anims/PRSFX- Waterfall2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Weather Ball1.wav b/public/audio/battle_anims/PRSFX- Weather Ball1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Weather Ball1.wav rename to public/audio/battle_anims/PRSFX- Weather Ball1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Weather Ball2.wav b/public/audio/battle_anims/PRSFX- Weather Ball2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Weather Ball2.wav rename to public/audio/battle_anims/PRSFX- Weather Ball2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Weather Ball3.wav b/public/audio/battle_anims/PRSFX- Weather Ball3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Weather Ball3.wav rename to public/audio/battle_anims/PRSFX- Weather Ball3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Weather Ball4.wav b/public/audio/battle_anims/PRSFX- Weather Ball4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Weather Ball4.wav rename to public/audio/battle_anims/PRSFX- Weather Ball4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Weather Ball5.wav b/public/audio/battle_anims/PRSFX- Weather Ball5.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Weather Ball5.wav rename to public/audio/battle_anims/PRSFX- Weather Ball5.wav diff --git a/public/audio/se/battle_anims/PRSFX- Weather Ball6.wav b/public/audio/battle_anims/PRSFX- Weather Ball6.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Weather Ball6.wav rename to public/audio/battle_anims/PRSFX- Weather Ball6.wav diff --git a/public/audio/se/battle_anims/PRSFX- Whirlpool.wav b/public/audio/battle_anims/PRSFX- Whirlpool.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Whirlpool.wav rename to public/audio/battle_anims/PRSFX- Whirlpool.wav diff --git a/public/audio/se/battle_anims/PRSFX- Whirlpool2.wav b/public/audio/battle_anims/PRSFX- Whirlpool2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Whirlpool2.wav rename to public/audio/battle_anims/PRSFX- Whirlpool2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Whirlwind.wav b/public/audio/battle_anims/PRSFX- Whirlwind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Whirlwind.wav rename to public/audio/battle_anims/PRSFX- Whirlwind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wide Guard.wav b/public/audio/battle_anims/PRSFX- Wide Guard.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wide Guard.wav rename to public/audio/battle_anims/PRSFX- Wide Guard.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wild Charge1.wav b/public/audio/battle_anims/PRSFX- Wild Charge1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wild Charge1.wav rename to public/audio/battle_anims/PRSFX- Wild Charge1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wild Charge2.wav b/public/audio/battle_anims/PRSFX- Wild Charge2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wild Charge2.wav rename to public/audio/battle_anims/PRSFX- Wild Charge2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Will O Wisp1.wav b/public/audio/battle_anims/PRSFX- Will O Wisp1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Will O Wisp1.wav rename to public/audio/battle_anims/PRSFX- Will O Wisp1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Will O Wisp2.wav b/public/audio/battle_anims/PRSFX- Will O Wisp2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Will O Wisp2.wav rename to public/audio/battle_anims/PRSFX- Will O Wisp2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wind.wav b/public/audio/battle_anims/PRSFX- Wind.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wind.wav rename to public/audio/battle_anims/PRSFX- Wind.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wing Attack1.wav b/public/audio/battle_anims/PRSFX- Wing Attack1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wing Attack1.wav rename to public/audio/battle_anims/PRSFX- Wing Attack1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wing Attack2.wav b/public/audio/battle_anims/PRSFX- Wing Attack2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wing Attack2.wav rename to public/audio/battle_anims/PRSFX- Wing Attack2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wish.wav b/public/audio/battle_anims/PRSFX- Wish.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wish.wav rename to public/audio/battle_anims/PRSFX- Wish.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wish2.wav b/public/audio/battle_anims/PRSFX- Wish2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wish2.wav rename to public/audio/battle_anims/PRSFX- Wish2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Withdraw.wav b/public/audio/battle_anims/PRSFX- Withdraw.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Withdraw.wav rename to public/audio/battle_anims/PRSFX- Withdraw.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wonder Room.wav b/public/audio/battle_anims/PRSFX- Wonder Room.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wonder Room.wav rename to public/audio/battle_anims/PRSFX- Wonder Room.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wood Hammer.wav b/public/audio/battle_anims/PRSFX- Wood Hammer.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wood Hammer.wav rename to public/audio/battle_anims/PRSFX- Wood Hammer.wav diff --git a/public/audio/se/battle_anims/PRSFX- Work Up.wav b/public/audio/battle_anims/PRSFX- Work Up.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Work Up.wav rename to public/audio/battle_anims/PRSFX- Work Up.wav diff --git a/public/audio/se/battle_anims/PRSFX- Worry Seed1.wav b/public/audio/battle_anims/PRSFX- Worry Seed1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Worry Seed1.wav rename to public/audio/battle_anims/PRSFX- Worry Seed1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Worry Seed2.wav b/public/audio/battle_anims/PRSFX- Worry Seed2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Worry Seed2.wav rename to public/audio/battle_anims/PRSFX- Worry Seed2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wrap.wav b/public/audio/battle_anims/PRSFX- Wrap.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wrap.wav rename to public/audio/battle_anims/PRSFX- Wrap.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wring Out1.wav b/public/audio/battle_anims/PRSFX- Wring Out1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wring Out1.wav rename to public/audio/battle_anims/PRSFX- Wring Out1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Wring Out2.wav b/public/audio/battle_anims/PRSFX- Wring Out2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Wring Out2.wav rename to public/audio/battle_anims/PRSFX- Wring Out2.wav diff --git a/public/audio/se/battle_anims/PRSFX- X Scissor.wav b/public/audio/battle_anims/PRSFX- X Scissor.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- X Scissor.wav rename to public/audio/battle_anims/PRSFX- X Scissor.wav diff --git a/public/audio/se/battle_anims/PRSFX- Yawn.wav b/public/audio/battle_anims/PRSFX- Yawn.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Yawn.wav rename to public/audio/battle_anims/PRSFX- Yawn.wav diff --git a/public/audio/se/battle_anims/PRSFX- ZPower2.wav b/public/audio/battle_anims/PRSFX- ZPower2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- ZPower2.wav rename to public/audio/battle_anims/PRSFX- ZPower2.wav diff --git a/public/audio/se/battle_anims/PRSFX- ZPower3.wav b/public/audio/battle_anims/PRSFX- ZPower3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- ZPower3.wav rename to public/audio/battle_anims/PRSFX- ZPower3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zap Cannon1.wav b/public/audio/battle_anims/PRSFX- Zap Cannon1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zap Cannon1.wav rename to public/audio/battle_anims/PRSFX- Zap Cannon1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zap Cannon2.wav b/public/audio/battle_anims/PRSFX- Zap Cannon2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zap Cannon2.wav rename to public/audio/battle_anims/PRSFX- Zap Cannon2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zap Cannon3.wav b/public/audio/battle_anims/PRSFX- Zap Cannon3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zap Cannon3.wav rename to public/audio/battle_anims/PRSFX- Zap Cannon3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zen Headbutt1.wav b/public/audio/battle_anims/PRSFX- Zen Headbutt1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zen Headbutt1.wav rename to public/audio/battle_anims/PRSFX- Zen Headbutt1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zen Headbutt2.wav b/public/audio/battle_anims/PRSFX- Zen Headbutt2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zen Headbutt2.wav rename to public/audio/battle_anims/PRSFX- Zen Headbutt2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zing Zap1.wav b/public/audio/battle_anims/PRSFX- Zing Zap1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zing Zap1.wav rename to public/audio/battle_anims/PRSFX- Zing Zap1.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zing Zap2.wav b/public/audio/battle_anims/PRSFX- Zing Zap2.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zing Zap2.wav rename to public/audio/battle_anims/PRSFX- Zing Zap2.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zing Zap3.wav b/public/audio/battle_anims/PRSFX- Zing Zap3.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zing Zap3.wav rename to public/audio/battle_anims/PRSFX- Zing Zap3.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zing Zap4.wav b/public/audio/battle_anims/PRSFX- Zing Zap4.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zing Zap4.wav rename to public/audio/battle_anims/PRSFX- Zing Zap4.wav diff --git a/public/audio/se/battle_anims/PRSFX- Zpower1.wav b/public/audio/battle_anims/PRSFX- Zpower1.wav similarity index 100% rename from public/audio/se/battle_anims/PRSFX- Zpower1.wav rename to public/audio/battle_anims/PRSFX- Zpower1.wav diff --git a/public/audio/se/battle_anims/Paralyze1.m4a b/public/audio/battle_anims/Paralyze1.m4a similarity index 100% rename from public/audio/se/battle_anims/Paralyze1.m4a rename to public/audio/battle_anims/Paralyze1.m4a diff --git a/public/audio/se/battle_anims/Paralyze3.m4a b/public/audio/battle_anims/Paralyze3.m4a similarity index 100% rename from public/audio/se/battle_anims/Paralyze3.m4a rename to public/audio/battle_anims/Paralyze3.m4a diff --git a/public/audio/se/battle_anims/Poison.m4a b/public/audio/battle_anims/Poison.m4a similarity index 100% rename from public/audio/se/battle_anims/Poison.m4a rename to public/audio/battle_anims/Poison.m4a diff --git a/public/audio/se/battle_anims/Pollen.m4a b/public/audio/battle_anims/Pollen.m4a similarity index 100% rename from public/audio/se/battle_anims/Pollen.m4a rename to public/audio/battle_anims/Pollen.m4a diff --git a/public/audio/se/battle_anims/Present - Heal.mp3 b/public/audio/battle_anims/Present - Heal.mp3 similarity index 100% rename from public/audio/se/battle_anims/Present - Heal.mp3 rename to public/audio/battle_anims/Present - Heal.mp3 diff --git a/public/audio/se/battle_anims/Psych Up.mp3 b/public/audio/battle_anims/Psych Up.mp3 similarity index 100% rename from public/audio/se/battle_anims/Psych Up.mp3 rename to public/audio/battle_anims/Psych Up.mp3 diff --git a/public/audio/se/battle_anims/Psycho Cut.wav b/public/audio/battle_anims/Psycho Cut.wav similarity index 100% rename from public/audio/se/battle_anims/Psycho Cut.wav rename to public/audio/battle_anims/Psycho Cut.wav diff --git a/public/audio/se/battle_anims/Recovery.m4a b/public/audio/battle_anims/Recovery.m4a similarity index 100% rename from public/audio/se/battle_anims/Recovery.m4a rename to public/audio/battle_anims/Recovery.m4a diff --git a/public/audio/se/battle_anims/Refresh.mp3 b/public/audio/battle_anims/Refresh.mp3 similarity index 100% rename from public/audio/se/battle_anims/Refresh.mp3 rename to public/audio/battle_anims/Refresh.mp3 diff --git a/public/audio/se/battle_anims/RockFall1.wav b/public/audio/battle_anims/RockFall1.wav similarity index 100% rename from public/audio/se/battle_anims/RockFall1.wav rename to public/audio/battle_anims/RockFall1.wav diff --git a/public/audio/se/battle_anims/Saint1.m4a b/public/audio/battle_anims/Saint1.m4a similarity index 100% rename from public/audio/se/battle_anims/Saint1.m4a rename to public/audio/battle_anims/Saint1.m4a diff --git a/public/audio/se/battle_anims/Saint3.m4a b/public/audio/battle_anims/Saint3.m4a similarity index 100% rename from public/audio/se/battle_anims/Saint3.m4a rename to public/audio/battle_anims/Saint3.m4a diff --git a/public/audio/se/battle_anims/Saint4.m4a b/public/audio/battle_anims/Saint4.m4a similarity index 100% rename from public/audio/se/battle_anims/Saint4.m4a rename to public/audio/battle_anims/Saint4.m4a diff --git a/public/audio/se/battle_anims/Saint6.m4a b/public/audio/battle_anims/Saint6.m4a similarity index 100% rename from public/audio/se/battle_anims/Saint6.m4a rename to public/audio/battle_anims/Saint6.m4a diff --git a/public/audio/se/battle_anims/Saint7.m4a b/public/audio/battle_anims/Saint7.m4a similarity index 100% rename from public/audio/se/battle_anims/Saint7.m4a rename to public/audio/battle_anims/Saint7.m4a diff --git a/public/audio/se/battle_anims/Saint8.m4a b/public/audio/battle_anims/Saint8.m4a similarity index 100% rename from public/audio/se/battle_anims/Saint8.m4a rename to public/audio/battle_anims/Saint8.m4a diff --git a/public/audio/se/battle_anims/Saint9.m4a b/public/audio/battle_anims/Saint9.m4a similarity index 100% rename from public/audio/se/battle_anims/Saint9.m4a rename to public/audio/battle_anims/Saint9.m4a diff --git a/public/audio/se/battle_anims/Sand.m4a b/public/audio/battle_anims/Sand.m4a similarity index 100% rename from public/audio/se/battle_anims/Sand.m4a rename to public/audio/battle_anims/Sand.m4a diff --git a/public/audio/se/battle_anims/Scary Face.mp3 b/public/audio/battle_anims/Scary Face.mp3 similarity index 100% rename from public/audio/se/battle_anims/Scary Face.mp3 rename to public/audio/battle_anims/Scary Face.mp3 diff --git a/public/audio/se/battle_anims/Select.WAV b/public/audio/battle_anims/Select.WAV similarity index 100% rename from public/audio/se/battle_anims/Select.WAV rename to public/audio/battle_anims/Select.WAV diff --git a/public/audio/se/battle_anims/Shell Smash.mp3 b/public/audio/battle_anims/Shell Smash.mp3 similarity index 100% rename from public/audio/se/battle_anims/Shell Smash.mp3 rename to public/audio/battle_anims/Shell Smash.mp3 diff --git a/public/audio/se/battle_anims/Shiny sparkle.m4a b/public/audio/battle_anims/Shiny sparkle.m4a similarity index 100% rename from public/audio/se/battle_anims/Shiny sparkle.m4a rename to public/audio/battle_anims/Shiny sparkle.m4a diff --git a/public/audio/se/battle_anims/Sing.m4a b/public/audio/battle_anims/Sing.m4a similarity index 100% rename from public/audio/se/battle_anims/Sing.m4a rename to public/audio/battle_anims/Sing.m4a diff --git a/public/audio/se/battle_anims/Slam.mp3 b/public/audio/battle_anims/Slam.mp3 similarity index 100% rename from public/audio/se/battle_anims/Slam.mp3 rename to public/audio/battle_anims/Slam.mp3 diff --git a/public/audio/se/battle_anims/Slash.mp3 b/public/audio/battle_anims/Slash.mp3 similarity index 100% rename from public/audio/se/battle_anims/Slash.mp3 rename to public/audio/battle_anims/Slash.mp3 diff --git a/public/audio/se/battle_anims/Slash1.m4a b/public/audio/battle_anims/Slash1.m4a similarity index 100% rename from public/audio/se/battle_anims/Slash1.m4a rename to public/audio/battle_anims/Slash1.m4a diff --git a/public/audio/se/battle_anims/Slash10.m4a b/public/audio/battle_anims/Slash10.m4a similarity index 100% rename from public/audio/se/battle_anims/Slash10.m4a rename to public/audio/battle_anims/Slash10.m4a diff --git a/public/audio/se/battle_anims/Slash11.m4a b/public/audio/battle_anims/Slash11.m4a similarity index 100% rename from public/audio/se/battle_anims/Slash11.m4a rename to public/audio/battle_anims/Slash11.m4a diff --git a/public/audio/se/battle_anims/Slash2.m4a b/public/audio/battle_anims/Slash2.m4a similarity index 100% rename from public/audio/se/battle_anims/Slash2.m4a rename to public/audio/battle_anims/Slash2.m4a diff --git a/public/audio/se/battle_anims/Slash3.m4a b/public/audio/battle_anims/Slash3.m4a similarity index 100% rename from public/audio/se/battle_anims/Slash3.m4a rename to public/audio/battle_anims/Slash3.m4a diff --git a/public/audio/se/battle_anims/Slash6.m4a b/public/audio/battle_anims/Slash6.m4a similarity index 100% rename from public/audio/se/battle_anims/Slash6.m4a rename to public/audio/battle_anims/Slash6.m4a diff --git a/public/audio/se/battle_anims/Slash8.m4a b/public/audio/battle_anims/Slash8.m4a similarity index 100% rename from public/audio/se/battle_anims/Slash8.m4a rename to public/audio/battle_anims/Slash8.m4a diff --git a/public/audio/se/battle_anims/Slash9.m4a b/public/audio/battle_anims/Slash9.m4a similarity index 100% rename from public/audio/se/battle_anims/Slash9.m4a rename to public/audio/battle_anims/Slash9.m4a diff --git a/public/audio/se/battle_anims/Sleep.m4a b/public/audio/battle_anims/Sleep.m4a similarity index 100% rename from public/audio/se/battle_anims/Sleep.m4a rename to public/audio/battle_anims/Sleep.m4a diff --git a/public/audio/se/battle_anims/Smokescreen.mp3 b/public/audio/battle_anims/Smokescreen.mp3 similarity index 100% rename from public/audio/se/battle_anims/Smokescreen.mp3 rename to public/audio/battle_anims/Smokescreen.mp3 diff --git a/public/audio/se/battle_anims/Snore.mp3 b/public/audio/battle_anims/Snore.mp3 similarity index 100% rename from public/audio/se/battle_anims/Snore.mp3 rename to public/audio/battle_anims/Snore.mp3 diff --git a/public/audio/se/battle_anims/Sound2.m4a b/public/audio/battle_anims/Sound2.m4a similarity index 100% rename from public/audio/se/battle_anims/Sound2.m4a rename to public/audio/battle_anims/Sound2.m4a diff --git a/public/audio/se/battle_anims/Stare.m4a b/public/audio/battle_anims/Stare.m4a similarity index 100% rename from public/audio/se/battle_anims/Stare.m4a rename to public/audio/battle_anims/Stare.m4a diff --git a/public/audio/se/battle_anims/Stone Axe 1.m4a b/public/audio/battle_anims/Stone Axe 1.m4a similarity index 100% rename from public/audio/se/battle_anims/Stone Axe 1.m4a rename to public/audio/battle_anims/Stone Axe 1.m4a diff --git a/public/audio/se/battle_anims/Stone Axe 2.wav b/public/audio/battle_anims/Stone Axe 2.wav similarity index 100% rename from public/audio/se/battle_anims/Stone Axe 2.wav rename to public/audio/battle_anims/Stone Axe 2.wav diff --git a/public/audio/se/battle_anims/Substitute.mp3 b/public/audio/battle_anims/Substitute.mp3 similarity index 100% rename from public/audio/se/battle_anims/Substitute.mp3 rename to public/audio/battle_anims/Substitute.mp3 diff --git a/public/audio/se/battle_anims/Super Fang.mp3 b/public/audio/battle_anims/Super Fang.mp3 similarity index 100% rename from public/audio/se/battle_anims/Super Fang.mp3 rename to public/audio/battle_anims/Super Fang.mp3 diff --git a/public/audio/se/battle_anims/Swagger.mp3 b/public/audio/battle_anims/Swagger.mp3 similarity index 100% rename from public/audio/se/battle_anims/Swagger.mp3 rename to public/audio/battle_anims/Swagger.mp3 diff --git a/public/audio/se/battle_anims/Sweet Scent.m4a b/public/audio/battle_anims/Sweet Scent.m4a similarity index 100% rename from public/audio/se/battle_anims/Sweet Scent.m4a rename to public/audio/battle_anims/Sweet Scent.m4a diff --git a/public/audio/se/battle_anims/Sword1.m4a b/public/audio/battle_anims/Sword1.m4a similarity index 100% rename from public/audio/se/battle_anims/Sword1.m4a rename to public/audio/battle_anims/Sword1.m4a diff --git a/public/audio/se/battle_anims/Sword2.m4a b/public/audio/battle_anims/Sword2.m4a similarity index 100% rename from public/audio/se/battle_anims/Sword2.m4a rename to public/audio/battle_anims/Sword2.m4a diff --git a/public/audio/se/battle_anims/Swords Dance.mp3 b/public/audio/battle_anims/Swords Dance.mp3 similarity index 100% rename from public/audio/se/battle_anims/Swords Dance.mp3 rename to public/audio/battle_anims/Swords Dance.mp3 diff --git a/public/audio/se/battle_anims/Take Down.mp3 b/public/audio/battle_anims/Take Down.mp3 similarity index 100% rename from public/audio/se/battle_anims/Take Down.mp3 rename to public/audio/battle_anims/Take Down.mp3 diff --git a/public/audio/se/battle_anims/Teleport.m4a b/public/audio/battle_anims/Teleport.m4a similarity index 100% rename from public/audio/se/battle_anims/Teleport.m4a rename to public/audio/battle_anims/Teleport.m4a diff --git a/public/audio/se/battle_anims/Thunder1.m4a b/public/audio/battle_anims/Thunder1.m4a similarity index 100% rename from public/audio/se/battle_anims/Thunder1.m4a rename to public/audio/battle_anims/Thunder1.m4a diff --git a/public/audio/se/battle_anims/Thunder3.m4a b/public/audio/battle_anims/Thunder3.m4a similarity index 100% rename from public/audio/se/battle_anims/Thunder3.m4a rename to public/audio/battle_anims/Thunder3.m4a diff --git a/public/audio/se/battle_anims/Thunder4.m4a b/public/audio/battle_anims/Thunder4.m4a similarity index 100% rename from public/audio/se/battle_anims/Thunder4.m4a rename to public/audio/battle_anims/Thunder4.m4a diff --git a/public/audio/se/battle_anims/Thunder9.m4a b/public/audio/battle_anims/Thunder9.m4a similarity index 100% rename from public/audio/se/battle_anims/Thunder9.m4a rename to public/audio/battle_anims/Thunder9.m4a diff --git a/public/audio/se/battle_anims/Trump Card.mp3 b/public/audio/battle_anims/Trump Card.mp3 similarity index 100% rename from public/audio/se/battle_anims/Trump Card.mp3 rename to public/audio/battle_anims/Trump Card.mp3 diff --git a/public/audio/se/battle_anims/Twine.m4a b/public/audio/battle_anims/Twine.m4a similarity index 100% rename from public/audio/se/battle_anims/Twine.m4a rename to public/audio/battle_anims/Twine.m4a diff --git a/public/audio/se/battle_anims/Up.m4a b/public/audio/battle_anims/Up.m4a similarity index 100% rename from public/audio/se/battle_anims/Up.m4a rename to public/audio/battle_anims/Up.m4a diff --git a/public/audio/se/battle_anims/Uproar.mp3 b/public/audio/battle_anims/Uproar.mp3 similarity index 100% rename from public/audio/se/battle_anims/Uproar.mp3 rename to public/audio/battle_anims/Uproar.mp3 diff --git a/public/audio/se/battle_anims/Vice Grip.mp3 b/public/audio/battle_anims/Vice Grip.mp3 similarity index 100% rename from public/audio/se/battle_anims/Vice Grip.mp3 rename to public/audio/battle_anims/Vice Grip.mp3 diff --git a/public/audio/se/battle_anims/Voltorb Flip Explosion.mp3 b/public/audio/battle_anims/Voltorb Flip Explosion.mp3 similarity index 100% rename from public/audio/se/battle_anims/Voltorb Flip Explosion.mp3 rename to public/audio/battle_anims/Voltorb Flip Explosion.mp3 diff --git a/public/audio/se/battle_anims/Voltorb Flip Mark.wav b/public/audio/battle_anims/Voltorb Flip Mark.wav similarity index 100% rename from public/audio/se/battle_anims/Voltorb Flip Mark.wav rename to public/audio/battle_anims/Voltorb Flip Mark.wav diff --git a/public/audio/se/battle_anims/Water1.m4a b/public/audio/battle_anims/Water1.m4a similarity index 100% rename from public/audio/se/battle_anims/Water1.m4a rename to public/audio/battle_anims/Water1.m4a diff --git a/public/audio/se/battle_anims/Water2.m4a b/public/audio/battle_anims/Water2.m4a similarity index 100% rename from public/audio/se/battle_anims/Water2.m4a rename to public/audio/battle_anims/Water2.m4a diff --git a/public/audio/se/battle_anims/Water3.m4a b/public/audio/battle_anims/Water3.m4a similarity index 100% rename from public/audio/se/battle_anims/Water3.m4a rename to public/audio/battle_anims/Water3.m4a diff --git a/public/audio/se/battle_anims/Water5.m4a b/public/audio/battle_anims/Water5.m4a similarity index 100% rename from public/audio/se/battle_anims/Water5.m4a rename to public/audio/battle_anims/Water5.m4a diff --git a/public/audio/se/battle_anims/Weatherball.mp3 b/public/audio/battle_anims/Weatherball.mp3 similarity index 100% rename from public/audio/se/battle_anims/Weatherball.mp3 rename to public/audio/battle_anims/Weatherball.mp3 diff --git a/public/audio/se/battle_anims/Whirlwind.mp3 b/public/audio/battle_anims/Whirlwind.mp3 similarity index 100% rename from public/audio/se/battle_anims/Whirlwind.mp3 rename to public/audio/battle_anims/Whirlwind.mp3 diff --git a/public/audio/se/battle_anims/Wind1.m4a b/public/audio/battle_anims/Wind1.m4a similarity index 100% rename from public/audio/se/battle_anims/Wind1.m4a rename to public/audio/battle_anims/Wind1.m4a diff --git a/public/audio/se/battle_anims/Wind5.m4a b/public/audio/battle_anims/Wind5.m4a similarity index 100% rename from public/audio/se/battle_anims/Wind5.m4a rename to public/audio/battle_anims/Wind5.m4a diff --git a/public/audio/se/battle_anims/Wind7.m4a b/public/audio/battle_anims/Wind7.m4a similarity index 100% rename from public/audio/se/battle_anims/Wind7.m4a rename to public/audio/battle_anims/Wind7.m4a diff --git a/public/audio/se/battle_anims/Wind8.m4a b/public/audio/battle_anims/Wind8.m4a similarity index 100% rename from public/audio/se/battle_anims/Wind8.m4a rename to public/audio/battle_anims/Wind8.m4a diff --git a/public/audio/se/battle_anims/Work Up.mp3 b/public/audio/battle_anims/Work Up.mp3 similarity index 100% rename from public/audio/se/battle_anims/Work Up.mp3 rename to public/audio/battle_anims/Work Up.mp3 diff --git a/public/audio/se/battle_anims/Wring Out.mp3 b/public/audio/battle_anims/Wring Out.mp3 similarity index 100% rename from public/audio/se/battle_anims/Wring Out.mp3 rename to public/audio/battle_anims/Wring Out.mp3 diff --git a/public/audio/se/battle_anims/Yawn.mp3 b/public/audio/battle_anims/Yawn.mp3 similarity index 100% rename from public/audio/se/battle_anims/Yawn.mp3 rename to public/audio/battle_anims/Yawn.mp3 diff --git a/public/audio/se/battle_anims/buzzer.wav b/public/audio/battle_anims/buzzer.wav similarity index 100% rename from public/audio/se/battle_anims/buzzer.wav rename to public/audio/battle_anims/buzzer.wav diff --git a/public/audio/se/battle_anims/decrease.m4a b/public/audio/battle_anims/decrease.m4a similarity index 100% rename from public/audio/se/battle_anims/decrease.m4a rename to public/audio/battle_anims/decrease.m4a diff --git a/public/audio/se/battle_anims/fog2.mp3 b/public/audio/battle_anims/fog2.mp3 similarity index 100% rename from public/audio/se/battle_anims/fog2.mp3 rename to public/audio/battle_anims/fog2.mp3 diff --git a/public/audio/se/battle_anims/gust.mp3 b/public/audio/battle_anims/gust.mp3 similarity index 100% rename from public/audio/se/battle_anims/gust.mp3 rename to public/audio/battle_anims/gust.mp3 diff --git a/public/audio/se/battle_anims/hit.wav b/public/audio/battle_anims/hit.wav similarity index 100% rename from public/audio/se/battle_anims/hit.wav rename to public/audio/battle_anims/hit.wav diff --git a/public/audio/se/battle_anims/increase.m4a b/public/audio/battle_anims/increase.m4a similarity index 100% rename from public/audio/se/battle_anims/increase.m4a rename to public/audio/battle_anims/increase.m4a diff --git a/public/audio/se/battle_anims/infatuated.mp3 b/public/audio/battle_anims/infatuated.mp3 similarity index 100% rename from public/audio/se/battle_anims/infatuated.mp3 rename to public/audio/battle_anims/infatuated.mp3 diff --git a/public/audio/se/battle_anims/metal.m4a b/public/audio/battle_anims/metal.m4a similarity index 100% rename from public/audio/se/battle_anims/metal.m4a rename to public/audio/battle_anims/metal.m4a diff --git a/public/audio/se/battle_anims/normaldamage.m4a b/public/audio/battle_anims/normaldamage.m4a similarity index 100% rename from public/audio/se/battle_anims/normaldamage.m4a rename to public/audio/battle_anims/normaldamage.m4a diff --git a/public/audio/se/battle_anims/punch5.wav b/public/audio/battle_anims/punch5.wav similarity index 100% rename from public/audio/se/battle_anims/punch5.wav rename to public/audio/battle_anims/punch5.wav diff --git a/public/audio/se/battle_anims/superdamage.m4a b/public/audio/battle_anims/superdamage.m4a similarity index 100% rename from public/audio/se/battle_anims/superdamage.m4a rename to public/audio/battle_anims/superdamage.m4a diff --git a/public/audio/se/battle_anims/throw.m4a b/public/audio/battle_anims/throw.m4a similarity index 100% rename from public/audio/se/battle_anims/throw.m4a rename to public/audio/battle_anims/throw.m4a diff --git a/public/audio/bgm/battle_aether_boss.mp3 b/public/audio/bgm/battle_aether_boss.mp3 new file mode 100644 index 00000000000..7b776976777 Binary files /dev/null and b/public/audio/bgm/battle_aether_boss.mp3 differ diff --git a/public/audio/bgm/battle_aether_grunt.mp3 b/public/audio/bgm/battle_aether_grunt.mp3 new file mode 100644 index 00000000000..ede518c8c3f Binary files /dev/null and b/public/audio/bgm/battle_aether_grunt.mp3 differ diff --git a/public/audio/bgm/battle_galactic_admin.mp3 b/public/audio/bgm/battle_galactic_admin.mp3 new file mode 100644 index 00000000000..69b6ea918dd Binary files /dev/null and b/public/audio/bgm/battle_galactic_admin.mp3 differ diff --git a/public/audio/bgm/battle_hoenn_champion.mp3 b/public/audio/bgm/battle_hoenn_champion_g5.mp3 similarity index 100% rename from public/audio/bgm/battle_hoenn_champion.mp3 rename to public/audio/bgm/battle_hoenn_champion_g5.mp3 diff --git a/public/audio/bgm/battle_hoenn_champion_g6.mp3 b/public/audio/bgm/battle_hoenn_champion_g6.mp3 new file mode 100644 index 00000000000..16ef20a5bea Binary files /dev/null and b/public/audio/bgm/battle_hoenn_champion_g6.mp3 differ diff --git a/public/audio/bgm/battle_legendary_origin_forme.mp3 b/public/audio/bgm/battle_legendary_origin_forme.mp3 new file mode 100644 index 00000000000..830eeff2f84 Binary files /dev/null and b/public/audio/bgm/battle_legendary_origin_forme.mp3 differ diff --git a/public/audio/bgm/battle_legendary_riders.mp3 b/public/audio/bgm/battle_legendary_riders.mp3 new file mode 100644 index 00000000000..8e9e5f47312 Binary files /dev/null and b/public/audio/bgm/battle_legendary_riders.mp3 differ diff --git a/public/audio/bgm/battle_macro_boss.mp3 b/public/audio/bgm/battle_macro_boss.mp3 new file mode 100644 index 00000000000..b72d5238b4d Binary files /dev/null and b/public/audio/bgm/battle_macro_boss.mp3 differ diff --git a/public/audio/bgm/battle_macro_grunt.mp3 b/public/audio/bgm/battle_macro_grunt.mp3 new file mode 100644 index 00000000000..8a80bfb553b Binary files /dev/null and b/public/audio/bgm/battle_macro_grunt.mp3 differ diff --git a/public/audio/bgm/battle_oleana.mp3 b/public/audio/bgm/battle_oleana.mp3 new file mode 100644 index 00000000000..b75bdcb337e Binary files /dev/null and b/public/audio/bgm/battle_oleana.mp3 differ diff --git a/public/audio/bgm/battle_rival.mp3 b/public/audio/bgm/battle_rival.mp3 index 82ff586576a..a17bc759b59 100644 Binary files a/public/audio/bgm/battle_rival.mp3 and b/public/audio/bgm/battle_rival.mp3 differ diff --git a/public/audio/bgm/battle_skull_admin.mp3 b/public/audio/bgm/battle_skull_admin.mp3 new file mode 100644 index 00000000000..a6ac5cf1bf7 Binary files /dev/null and b/public/audio/bgm/battle_skull_admin.mp3 differ diff --git a/public/audio/bgm/battle_skull_boss.mp3 b/public/audio/bgm/battle_skull_boss.mp3 new file mode 100644 index 00000000000..2fde7a5524a Binary files /dev/null and b/public/audio/bgm/battle_skull_boss.mp3 differ diff --git a/public/audio/bgm/battle_skull_grunt.mp3 b/public/audio/bgm/battle_skull_grunt.mp3 new file mode 100644 index 00000000000..b6f575fc2ad Binary files /dev/null and b/public/audio/bgm/battle_skull_grunt.mp3 differ diff --git a/public/audio/bgm/sea.mp3 b/public/audio/bgm/sea.mp3 index 8bdaaa696f1..147dad0960d 100644 Binary files a/public/audio/bgm/sea.mp3 and b/public/audio/bgm/sea.mp3 differ diff --git a/public/audio/bgm/slum.mp3 b/public/audio/bgm/slum.mp3 index 1315c7838fc..5431671d0ae 100644 Binary files a/public/audio/bgm/slum.mp3 and b/public/audio/bgm/slum.mp3 differ diff --git a/public/audio/se/error.wav b/public/audio/ui/error.wav similarity index 100% rename from public/audio/se/error.wav rename to public/audio/ui/error.wav diff --git a/public/audio/se/menu_open.wav b/public/audio/ui/menu_open.wav similarity index 100% rename from public/audio/se/menu_open.wav rename to public/audio/ui/menu_open.wav diff --git a/public/audio/se/select.wav b/public/audio/ui/select.wav similarity index 100% rename from public/audio/se/select.wav rename to public/audio/ui/select.wav 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/muddy-water.json b/public/battle-anims/muddy-water.json index 450e767a75a..e415f1056bf 100644 --- a/public/battle-anims/muddy-water.json +++ b/public/battle-anims/muddy-water.json @@ -673,6 +673,33 @@ "focus": 1 } ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 129, + "y": -64.6, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ], [ { "x": 0, @@ -688,8 +715,399 @@ "focus": 2 }, { - "x": 128, - "y": -64, + "x": 129, + "y": -64.6, + "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": 130, + "y": -66, + "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": 130, + "y": -66, + "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": 131.6, + "y": -66.6, + "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": 131.6, + "y": -66.6, + "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": 131.6, + "y": -66.6, + "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": 132, + "y": -67, + "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": 132, + "y": -67, + "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": 132, + "y": -67, + "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": 131.6, + "y": -67, + "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": 131.6, + "y": -66.5, + "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": 131, + "y": -66.5, + "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": 131, + "y": -66, + "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": 129, + "y": -66, + "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": 129, + "y": -64.9, "zoomX": 100, "zoomY": 100, "visible": true, @@ -717,595 +1135,7 @@ }, { "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, + "y": -64.3, "zoomX": 100, "zoomY": 100, "visible": true, @@ -1382,6 +1212,41 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Muddy Water 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" } ] }, @@ -2510,230 +2375,6 @@ "focus": 1 } ], - [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 1, - "focus": 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, @@ -2771,10 +2412,45 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Muddy Water FG Opp", + "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 } -] \ 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/sludge-wave.json b/public/battle-anims/sludge-wave.json index 4fe008da80d..a51cfd51ac5 100644 --- a/public/battle-anims/sludge-wave.json +++ b/public/battle-anims/sludge-wave.json @@ -1149,202 +1149,6 @@ "focus": 1 } ], - [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 1, - "focus": 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, @@ -1382,6 +1186,41 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Sludge Wave 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" } ] }, @@ -2538,202 +2377,6 @@ "focus": 1 } ], - [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 1, - "focus": 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, @@ -2771,10 +2414,45 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Sludge Wave FG Opp", + "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 } -] \ 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/surf.json b/public/battle-anims/surf.json index e5a7fe45f46..99718798bb5 100644 --- a/public/battle-anims/surf.json +++ b/public/battle-anims/surf.json @@ -1186,6 +1186,41 @@ "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" } ] }, @@ -2379,10 +2414,45 @@ "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 } -] \ No newline at end of file +] 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/fonts/Galmuri11.subset.woff2 b/public/fonts/Galmuri11.subset.woff2 new file mode 100644 index 00000000000..0b626506255 Binary files /dev/null and b/public/fonts/Galmuri11.subset.woff2 differ diff --git a/public/fonts/Galmuri9.subset.woff2 b/public/fonts/Galmuri9.subset.woff2 new file mode 100644 index 00000000000..5475af0cdad Binary files /dev/null and b/public/fonts/Galmuri9.subset.woff2 differ diff --git a/public/fonts/PokePT_Wansung.ttf b/public/fonts/PokePT_Wansung.ttf deleted file mode 100644 index cd846107db4..00000000000 Binary files a/public/fonts/PokePT_Wansung.ttf and /dev/null differ diff --git a/public/fonts/PokePT_Wansung.woff2 b/public/fonts/PokePT_Wansung.woff2 new file mode 100644 index 00000000000..15aab3eb4f4 Binary files /dev/null and b/public/fonts/PokePT_Wansung.woff2 differ diff --git a/public/fonts/unifont-15.1.05.otf b/public/fonts/unifont-15.1.05.otf deleted file mode 100644 index 3d0dcd3c1a0..00000000000 Binary files a/public/fonts/unifont-15.1.05.otf and /dev/null differ diff --git a/public/fonts/unifont-15.1.05.subset.woff2 b/public/fonts/unifont-15.1.05.subset.woff2 new file mode 100644 index 00000000000..cde898e35bf Binary files /dev/null and b/public/fonts/unifont-15.1.05.subset.woff2 differ 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/august-variant-update.png b/public/images/events/august-variant-update.png new file mode 100644 index 00000000000..1c78aa2fe14 Binary files /dev/null and b/public/images/events/august-variant-update.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 33dcf8f5e9a..442b93d657b 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 415, - "h": 415 + "w": 426, + "h": 426 }, "scale": 1, "frames": [ @@ -72,6 +72,48 @@ "h": 28 } }, + { + "filename": "ribbon_gen4", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 30, + "h": 28 + }, + "frame": { + "x": 29, + "y": 27, + "w": 30, + "h": 28 + } + }, + { + "filename": "ribbon_gen2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 28, + "h": 28 + }, + "frame": { + "x": 0, + "y": 58, + "w": 28, + "h": 28 + } + }, { "filename": "bronze_ribbon", "rotated": false, @@ -87,8 +129,8 @@ "h": 31 }, "frame": { - "x": 29, - "y": 27, + "x": 0, + "y": 86, "w": 22, "h": 31 } @@ -109,7 +151,7 @@ }, "frame": { "x": 0, - "y": 58, + "y": 117, "w": 22, "h": 31 } @@ -151,7 +193,7 @@ }, "frame": { "x": 0, - "y": 89, + "y": 148, "w": 22, "h": 31 } @@ -171,8 +213,8 @@ "h": 31 }, "frame": { - "x": 22, - "y": 58, + "x": 0, + "y": 179, "w": 22, "h": 31 } @@ -193,11 +235,95 @@ }, "frame": { "x": 0, - "y": 120, + "y": 210, "w": 22, "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 271, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon_gen7", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 300, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon_gen9", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 329, + "w": 22, + "h": 29 + } + }, { "filename": "cornerstone_mask", "rotated": false, @@ -219,6 +345,48 @@ "h": 26 } }, + { + "filename": "ribbon_gen1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 358, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon_gen5", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 386, + "w": 22, + "h": 28 + } + }, { "filename": "ability_charm", "rotated": false, @@ -387,132 +555,6 @@ "h": 21 } }, - { - "filename": "exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 89, - "w": 17, - "h": 31 - } - }, - { - "filename": "golden_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 0, - "y": 151, - "w": 17, - "h": 31 - } - }, - { - "filename": "super_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 120, - "w": 17, - "h": 31 - } - }, - { - "filename": "black_augurite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 17, - "y": 151, - "w": 22, - "h": 25 - } - }, - { - "filename": "prison_bottle", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 30 - }, - "frame": { - "x": 0, - "y": 182, - "w": 17, - "h": 30 - } - }, - { - "filename": "big_root", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 17, - "y": 176, - "w": 23, - "h": 24 - } - }, { "filename": "chipped_pot", "rotated": false, @@ -576,6 +618,195 @@ "h": 20 } }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 407, + "y": 0, + "w": 19, + "h": 22 + } + }, + { + "filename": "exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 22, + "y": 86, + "w": 17, + "h": 31 + } + }, + { + "filename": "golden_exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 22, + "y": 117, + "w": 17, + "h": 31 + } + }, + { + "filename": "super_exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 22, + "y": 148, + "w": 17, + "h": 31 + } + }, + { + "filename": "prison_bottle", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 30 + }, + "frame": { + "x": 22, + "y": 179, + "w": 17, + "h": 30 + } + }, + { + "filename": "ribbon_gen6", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 22, + "y": 209, + "w": 22, + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 22, + "y": 265, + "w": 22, + "h": 25 + } + }, + { + "filename": "big_root", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 22, + "y": 290, + "w": 23, + "h": 24 + } + }, { "filename": "blank_plate", "rotated": false, @@ -591,8 +822,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 212, + "x": 22, + "y": 314, "w": 24, "h": 24 } @@ -612,8 +843,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 236, + "x": 22, + "y": 338, "w": 24, "h": 24 } @@ -633,8 +864,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 260, + "x": 22, + "y": 362, "w": 24, "h": 24 } @@ -654,12 +885,138 @@ "h": 24 }, "frame": { - "x": 0, - "y": 284, + "x": 22, + "y": 386, "w": 24, "h": 24 } }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 22, + "y": 410, + "w": 20, + "h": 16 + } + }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 42, + "y": 410, + "w": 17, + "h": 16 + } + }, + { + "filename": "ultranecrozium_z", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 30, + "h": 15 + }, + "frame": { + "x": 29, + "y": 55, + "w": 30, + "h": 15 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 28, + "y": 70, + "w": 16, + "h": 16 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 44, + "y": 70, + "w": 16, + "h": 16 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 39, + "y": 86, + "w": 21, + "h": 24 + } + }, { "filename": "earth_plate", "rotated": false, @@ -675,8 +1032,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 308, + "x": 39, + "y": 110, "w": 24, "h": 24 } @@ -696,8 +1053,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 332, + "x": 39, + "y": 134, "w": 24, "h": 24 } @@ -717,8 +1074,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 356, + "x": 39, + "y": 158, "w": 24, "h": 24 } @@ -738,54 +1095,12 @@ "h": 24 }, "frame": { - "x": 0, - "y": 380, + "x": 39, + "y": 182, "w": 24, "h": 24 } }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 0, - "y": 404, - "w": 15, - "h": 11 - } - }, - { - "filename": "calcium", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 51, - "y": 27, - "w": 16, - "h": 24 - } - }, { "filename": "golden_punch", "rotated": false, @@ -801,8 +1116,8 @@ "h": 24 }, "frame": { - "x": 67, - "y": 26, + "x": 44, + "y": 206, "w": 24, "h": 24 } @@ -822,33 +1137,12 @@ "h": 24 }, "frame": { - "x": 91, - "y": 26, + "x": 44, + "y": 230, "w": 24, "h": 24 } }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 115, - "y": 26, - "w": 21, - "h": 24 - } - }, { "filename": "grip_claw", "rotated": false, @@ -863,116 +1157,11 @@ "w": 24, "h": 24 }, - "frame": { - "x": 136, - "y": 22, - "w": 24, - "h": 24 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, "frame": { "x": 44, - "y": 58, - "w": 16, - "h": 24 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 89, - "w": 18, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 113, - "w": 18, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 137, - "w": 18, - "h": 24 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, + "y": 254, "w": 24, - "h": 15 - }, - "frame": { - "x": 39, - "y": 161, - "w": 24, - "h": 15 + "h": 24 } }, { @@ -990,8 +1179,8 @@ "h": 24 }, "frame": { - "x": 40, - "y": 176, + "x": 45, + "y": 278, "w": 24, "h": 24 } @@ -1011,8 +1200,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 200, + "x": 46, + "y": 302, "w": 24, "h": 24 } @@ -1032,8 +1221,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 224, + "x": 46, + "y": 326, "w": 24, "h": 24 } @@ -1053,8 +1242,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 248, + "x": 46, + "y": 350, "w": 24, "h": 24 } @@ -1074,12 +1263,54 @@ "h": 24 }, "frame": { - "x": 24, - "y": 272, + "x": 46, + "y": 374, "w": 24, "h": 24 } }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 135, + "y": 22, + "w": 24, + "h": 14 + } + }, + { + "filename": "calcium", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 59, + "y": 27, + "w": 16, + "h": 24 + } + }, { "filename": "lucky_punch_master", "rotated": false, @@ -1095,8 +1326,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 296, + "x": 75, + "y": 26, "w": 24, "h": 24 } @@ -1116,14 +1347,14 @@ "h": 24 }, "frame": { - "x": 24, - "y": 320, + "x": 99, + "y": 26, "w": 24, "h": 24 } }, { - "filename": "lustrous_globe", + "filename": "revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -1131,20 +1362,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 10, + "y": 8, + "w": 12, + "h": 17 }, "frame": { - "x": 24, - "y": 344, - "w": 24, - "h": 24 + "x": 123, + "y": 26, + "w": 12, + "h": 17 } }, { - "filename": "meadow_plate", + "filename": "big_mushroom", "rotated": false, "trimmed": true, "sourceSize": { @@ -1152,16 +1383,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 6, + "y": 6, + "w": 19, + "h": 19 }, "frame": { - "x": 24, - "y": 368, - "w": 24, - "h": 24 + "x": 59, + "y": 51, + "w": 19, + "h": 19 } }, { @@ -1179,14 +1410,14 @@ "h": 23 }, "frame": { - "x": 24, - "y": 392, + "x": 78, + "y": 50, "w": 24, "h": 23 } }, { - "filename": "hp_up", + "filename": "elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -1194,162 +1425,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 7, "y": 4, - "w": 16, + "w": 18, "h": 24 }, "frame": { - "x": 48, - "y": 200, - "w": 16, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 48, - "y": 224, - "w": 16, - "h": 24 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 48, - "y": 248, - "w": 23, - "h": 24 - } - }, - { - "filename": "mind_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 272, - "w": 24, - "h": 24 - } - }, - { - "filename": "muscle_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 296, - "w": 24, - "h": 24 - } - }, - { - "filename": "pixie_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 320, - "w": 24, - "h": 24 - } - }, - { - "filename": "salac_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 344, - "w": 24, - "h": 24 - } - }, - { - "filename": "scanner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 368, - "w": 24, + "x": 60, + "y": 70, + "w": 18, "h": 24 } }, @@ -1368,14 +1452,35 @@ "h": 23 }, "frame": { - "x": 48, - "y": 392, + "x": 78, + "y": 73, "w": 24, "h": 23 } }, { - "filename": "ability_capsule", + "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, "trimmed": true, "sourceSize": { @@ -1384,19 +1489,40 @@ }, "spriteSourceSize": { "x": 4, - "y": 9, - "w": 24, - "h": 14 + "y": 5, + "w": 23, + "h": 23 }, "frame": { - "x": 136, - "y": 46, - "w": 24, - "h": 14 + "x": 102, + "y": 74, + "w": 23, + "h": 23 } }, { - "filename": "lure", + "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": { @@ -1406,144 +1532,18 @@ "spriteSourceSize": { "x": 8, "y": 4, - "w": 17, + "w": 16, "h": 24 }, "frame": { - "x": 160, - "y": 22, - "w": 17, + "x": 63, + "y": 110, + "w": 16, "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": 177, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "sky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 201, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "splash_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 225, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "spooky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 249, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "stone_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 273, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 297, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_elixir", + "filename": "ether", "rotated": false, "trimmed": true, "sourceSize": { @@ -1557,14 +1557,14 @@ "h": 24 }, "frame": { - "x": 321, - "y": 21, + "x": 63, + "y": 134, "w": 18, "h": 24 } }, { - "filename": "toxic_plate", + "filename": "full_restore", "rotated": false, "trimmed": true, "sourceSize": { @@ -1572,20 +1572,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 7, "y": 4, - "w": 24, + "w": 18, "h": 24 }, "frame": { - "x": 339, - "y": 20, - "w": 24, + "x": 63, + "y": 158, + "w": 18, "h": 24 } }, { - "filename": "zap_plate", + "filename": "lustrous_globe", "rotated": false, "trimmed": true, "sourceSize": { @@ -1599,8 +1599,8 @@ "h": 24 }, "frame": { - "x": 363, - "y": 20, + "x": 63, + "y": 182, "w": 24, "h": 24 } @@ -1620,77 +1620,14 @@ "h": 24 }, "frame": { - "x": 387, - "y": 20, + "x": 68, + "y": 206, "w": 22, "h": 24 } }, { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 160, - "y": 46, - "w": 23, - "h": 21 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 183, - "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": 207, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "expert_belt", + "filename": "meadow_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1701,17 +1638,17 @@ "x": 4, "y": 4, "w": 24, - "h": 23 + "h": 24 }, "frame": { - "x": 231, - "y": 45, + "x": 68, + "y": 230, "w": 24, - "h": 23 + "h": 24 } }, { - "filename": "hearthflame_mask", + "filename": "mind_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1722,17 +1659,17 @@ "x": 4, "y": 4, "w": 24, - "h": 23 + "h": 24 }, "frame": { - "x": 255, - "y": 45, + "x": 68, + "y": 254, "w": 24, - "h": 23 + "h": 24 } }, { - "filename": "leppa_berry", + "filename": "muscle_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -1741,19 +1678,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 24, - "h": 23 + "h": 24 }, "frame": { - "x": 279, - "y": 45, + "x": 69, + "y": 278, "w": 24, - "h": 23 + "h": 24 } }, { - "filename": "scope_lens", + "filename": "pixie_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1762,19 +1699,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 24, - "h": 23 + "h": 24 }, "frame": { - "x": 303, - "y": 45, + "x": 70, + "y": 302, "w": 24, - "h": 23 + "h": 24 } }, { - "filename": "berry_pouch", + "filename": "salac_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -1783,15 +1720,99 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, - "w": 23, - "h": 23 + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 327, - "y": 45, - "w": 23, - "h": 23 + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 59, + "y": 398, + "w": 24, + "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": 83, + "y": 398, + "w": 16, + "h": 24 } }, { @@ -1809,201 +1830,12 @@ "h": 24 }, "frame": { - "x": 350, - "y": 44, + "x": 79, + "y": 96, "w": 23, "h": 24 } }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 373, - "y": 44, - "w": 24, - "h": 23 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 397, - "y": 44, - "w": 18, - "h": 24 - } - }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 373, - "y": 67, - "w": 24, - "h": 18 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 397, - "y": 68, - "w": 18, - "h": 24 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 67, - "y": 50, - "w": 24, - "h": 18 - } - }, - { - "filename": "icy_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 91, - "y": 50, - "w": 24, - "h": 20 - } - }, - { - "filename": "dragon_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 115, - "y": 50, - "w": 21, - "h": 23 - } - }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 136, - "y": 60, - "w": 24, - "h": 20 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 160, - "y": 67, - "w": 24, - "h": 22 - } - }, { "filename": "dynamax_band", "rotated": false, @@ -2019,56 +1851,14 @@ "h": 23 }, "frame": { - "x": 184, - "y": 67, + "x": 102, + "y": 97, "w": 23, "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": 207, - "y": 67, - "w": 23, - "h": 23 - } - }, - { - "filename": "healing_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 230, - "y": 68, - "w": 23, - "h": 22 - } - }, - { - "filename": "rare_candy", + "filename": "splash_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -2077,371 +1867,35 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 253, - "y": 68, - "w": 23, - "h": 23 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 276, - "y": 68, - "w": 23, - "h": 23 - } - }, - { - "filename": "stick", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 299, - "y": 68, - "w": 23, - "h": 23 - } - }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 322, - "y": 68, - "w": 22, - "h": 23 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 344, - "y": 68, - "w": 22, - "h": 23 - } - }, - { - "filename": "quick_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, "w": 24, - "h": 20 - }, - "frame": { - "x": 60, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 57, - "y": 88, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 57, - "y": 111, - "w": 22, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 57, - "y": 134, - "w": 22, - "h": 23 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 84, - "y": 70, - "w": 24, - "h": 20 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 79, - "y": 90, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 79, - "y": 113, - "w": 22, - "h": 23 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 79, - "y": 136, - "w": 23, - "h": 21 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 63, - "y": 157, - "w": 23, - "h": 19 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 64, - "y": 176, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 64, - "y": 199, - "w": 22, - "h": 23 - } - }, - { - "filename": "flying_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 64, - "y": 222, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, "h": 24 }, "frame": { - "x": 86, - "y": 157, - "w": 17, + "x": 81, + "y": 120, + "w": 24, + "h": 24 + } + }, + { + "filename": "spooky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 81, + "y": 144, + "w": 24, "h": 24 } }, @@ -2460,8 +1914,8 @@ "h": 24 }, "frame": { - "x": 86, - "y": 181, + "x": 105, + "y": 120, "w": 21, "h": 24 } @@ -2481,14 +1935,287 @@ "h": 24 }, "frame": { - "x": 86, - "y": 205, + "x": 105, + "y": 144, "w": 21, "h": 24 } }, { - "filename": "auspicious_armor", + "filename": "stone_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 92, + "y": 216, + "w": 24, + "h": 24 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 92, + "y": 240, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 116, + "y": 216, + "w": 18, + "h": 24 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 116, + "y": 240, + "w": 18, + "h": 24 + } + }, + { + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 94, + "y": 325, + "w": 24, + "h": 23 + } + }, + { + "filename": "leppa_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -2498,60 +2225,18 @@ "spriteSourceSize": { "x": 4, "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 86, - "y": 229, - "w": 23, - "h": 21 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, + "w": 24, "h": 23 }, "frame": { - "x": 71, - "y": 245, - "w": 15, + "x": 94, + "y": 348, + "w": 24, "h": 23 } }, { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 86, - "y": 250, - "w": 23, - "h": 20 - } - }, - { - "filename": "sacred_ash", + "filename": "scope_lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -2560,19 +2245,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, + "y": 5, "w": 24, - "h": 20 + "h": 23 }, "frame": { - "x": 108, - "y": 73, + "x": 94, + "y": 371, "w": 24, - "h": 20 + "h": 23 } }, { - "filename": "focus_sash", + "filename": "bug_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2580,60 +2265,18 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 6, "y": 4, "w": 22, "h": 23 }, "frame": { - "x": 101, - "y": 93, + "x": 117, + "y": 287, "w": 22, "h": 23 } }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 101, - "y": 116, - "w": 22, - "h": 20 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 102, - "y": 136, - "w": 22, - "h": 21 - } - }, { "filename": "red_orb", "rotated": false, @@ -2649,12 +2292,285 @@ "h": 24 }, "frame": { - "x": 103, - "y": 157, + "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": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 118, + "y": 373, + "w": 23, + "h": 21 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 126, + "y": 120, + "w": 22, + "h": 23 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 126, + "y": 143, + "w": 22, + "h": 23 + } + }, + { + "filename": "dragon_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 127, + "y": 166, + "w": 21, + "h": 23 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 131, + "y": 189, + "w": 17, + "h": 24 + } + }, { "filename": "max_repel", "rotated": false, @@ -2670,8 +2586,8 @@ "h": 24 }, "frame": { - "x": 107, - "y": 181, + "x": 134, + "y": 213, "w": 16, "h": 24 } @@ -2691,8 +2607,8 @@ "h": 24 }, "frame": { - "x": 107, - "y": 205, + "x": 134, + "y": 237, "w": 16, "h": 24 } @@ -2712,14 +2628,119 @@ "h": 24 }, "frame": { - "x": 109, - "y": 229, + "x": 149, + "y": 54, "w": 16, "h": 24 } }, { - "filename": "apicot_berry", + "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": { @@ -2728,15 +2749,57 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 19, - "h": 20 + "y": 4, + "w": 22, + "h": 23 }, "frame": { - "x": 109, - "y": 253, - "w": 19, - "h": 20 + "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 } }, { @@ -2754,14 +2817,14 @@ "h": 24 }, "frame": { - "x": 123, - "y": 93, + "x": 139, + "y": 261, "w": 16, "h": 24 } }, { - "filename": "lansat_berry", + "filename": "repel", "rotated": false, "trimmed": true, "sourceSize": { @@ -2769,20 +2832,83 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 8, "y": 4, - "w": 21, - "h": 23 + "w": 16, + "h": 24 }, "frame": { "x": 139, - "y": 80, - "w": 21, + "y": 285, + "w": 16, + "h": 24 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 155, + "y": 259, + "w": 22, "h": 23 } }, { - "filename": "shadow_reins_of_unity", + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 155, + "y": 282, + "w": 22, + "h": 23 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 159, + "y": 22, + "w": 16, + "h": 24 + } + }, + { + "filename": "peat_block", "rotated": false, "trimmed": true, "sourceSize": { @@ -2791,61 +2917,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, + "y": 5, "w": 24, - "h": 20 + "h": 22 }, "frame": { - "x": 160, - "y": 89, + "x": 175, + "y": 21, "w": 24, - "h": 20 + "h": 22 } }, { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 184, - "y": 90, - "w": 24, - "h": 20 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 208, - "y": 90, - "w": 23, - "h": 21 - } - }, - { - "filename": "blank_memory", + "filename": "healing_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -2855,58 +2939,16 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 22, + "w": 23, "h": 22 }, "frame": { - "x": 231, - "y": 90, - "w": 22, + "x": 199, + "y": 21, + "w": 23, "h": 22 } }, - { - "filename": "n_lunarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 253, - "y": 91, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_solarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 276, - "y": 91, - "w": 23, - "h": 21 - } - }, { "filename": "rusted_sword", "rotated": false, @@ -2922,8 +2964,8 @@ "h": 22 }, "frame": { - "x": 299, - "y": 91, + "x": 222, + "y": 21, "w": 23, "h": 22 } @@ -2943,8 +2985,8 @@ "h": 22 }, "frame": { - "x": 322, - "y": 91, + "x": 245, + "y": 21, "w": 22, "h": 22 } @@ -2964,243 +3006,12 @@ "h": 22 }, "frame": { - "x": 344, - "y": 91, + "x": 267, + "y": 21, "w": 22, "h": 22 } }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 139, - "y": 103, - "w": 21, - "h": 21 - } - }, - { - "filename": "mystery_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 - }, - "frame": { - "x": 123, - "y": 117, - "w": 16, - "h": 18 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 160, - "y": 109, - "w": 23, - "h": 17 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 183, - "y": 110, - "w": 23, - "h": 17 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 366, - "y": 85, - "w": 22, - "h": 23 - } - }, - { - "filename": "chill_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 206, - "y": 111, - "w": 23, - "h": 17 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 229, - "y": 112, - "w": 23, - "h": 17 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 252, - "y": 112, - "w": 23, - "h": 19 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 275, - "y": 112, - "w": 23, - "h": 19 - } - }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 298, - "y": 113, - "w": 23, - "h": 19 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 321, - "y": 113, - "w": 23, - "h": 20 - } - }, { "filename": "dark_memory", "rotated": false, @@ -3216,12 +3027,75 @@ "h": 22 }, "frame": { - "x": 344, - "y": 113, + "x": 289, + "y": 21, "w": 22, "h": 22 } }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 311, + "y": 21, + "w": 22, + "h": 22 + } + }, + { + "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, @@ -3237,14 +3111,14 @@ "h": 23 }, "frame": { - "x": 366, - "y": 108, + "x": 377, + "y": 20, "w": 22, "h": 23 } }, { - "filename": "berry_pot", + "filename": "icy_reins_of_unity", "rotated": false, "trimmed": true, "sourceSize": { @@ -3252,16 +3126,268 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 + "x": 4, + "y": 7, + "w": 24, + "h": 20 }, "frame": { - "x": 124, - "y": 135, - "w": 18, - "h": 22 + "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": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 343, + "y": 43, + "w": 23, + "h": 20 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 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 } }, { @@ -3279,8 +3405,8 @@ "h": 23 }, "frame": { - "x": 123, - "y": 157, + "x": 171, + "y": 122, "w": 22, "h": 23 } @@ -3300,12 +3426,33 @@ "h": 23 }, "frame": { - "x": 123, - "y": 180, + "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, @@ -3321,12 +3468,33 @@ "h": 23 }, "frame": { - "x": 123, - "y": 203, + "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, @@ -3342,14 +3510,14 @@ "h": 23 }, "frame": { - "x": 125, - "y": 226, + "x": 172, + "y": 236, "w": 21, "h": 23 } }, { - "filename": "mystic_water", + "filename": "zinc", "rotated": false, "trimmed": true, "sourceSize": { @@ -3357,16 +3525,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 23 + "x": 8, + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 128, - "y": 249, - "w": 20, - "h": 23 + "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 } }, { @@ -3384,243 +3573,12 @@ "h": 23 }, "frame": { - "x": 388, - "y": 92, + "x": 188, + "y": 63, "w": 22, "h": 23 } }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 388, - "y": 115, - "w": 22, - "h": 19 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 142, - "y": 124, - "w": 18, - "h": 23 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 160, - "y": 126, - "w": 23, - "h": 21 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 183, - "y": 127, - "w": 23, - "h": 20 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 206, - "y": 128, - "w": 23, - "h": 18 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 229, - "y": 129, - "w": 23, - "h": 17 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 252, - "y": 131, - "w": 23, - "h": 17 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 275, - "y": 131, - "w": 22, - "h": 22 - } - }, - { - "filename": "dna_splicers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 297, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "dragon_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 319, - "y": 133, - "w": 22, - "h": 22 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 341, - "y": 135, - "w": 22, - "h": 22 - } - }, { "filename": "petaya_berry", "rotated": false, @@ -3636,8 +3594,8 @@ "h": 23 }, "frame": { - "x": 145, - "y": 147, + "x": 210, + "y": 63, "w": 22, "h": 23 } @@ -3657,8 +3615,8 @@ "h": 23 }, "frame": { - "x": 167, - "y": 147, + "x": 232, + "y": 63, "w": 22, "h": 23 } @@ -3678,8 +3636,8 @@ "h": 23 }, "frame": { - "x": 145, - "y": 170, + "x": 254, + "y": 63, "w": 22, "h": 23 } @@ -3699,8 +3657,8 @@ "h": 23 }, "frame": { - "x": 145, - "y": 193, + "x": 276, + "y": 63, "w": 22, "h": 23 } @@ -3720,8 +3678,8 @@ "h": 23 }, "frame": { - "x": 167, - "y": 170, + "x": 298, + "y": 63, "w": 22, "h": 23 } @@ -3741,33 +3699,12 @@ "h": 23 }, "frame": { - "x": 167, - "y": 193, + "x": 320, + "y": 63, "w": 22, "h": 23 } }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 189, - "y": 147, - "w": 17, - "h": 24 - } - }, { "filename": "stellar_tera_shard", "rotated": false, @@ -3783,12 +3720,390 @@ "h": 23 }, "frame": { - "x": 206, - "y": 146, + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 319, + "y": 86, + "w": 23, + "h": 21 + } + }, + { + "filename": "n_solarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 342, + "y": 86, + "w": 23, + "h": 21 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 365, + "y": 86, + "w": 22, + "h": 21 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 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 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 191, + "y": 103, + "w": 23, + "h": 19 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 193, + "y": 122, + "w": 21, + "h": 23 + } + }, { "filename": "water_tera_shard", "rotated": false, @@ -3804,8 +4119,50 @@ "h": 23 }, "frame": { - "x": 228, - "y": 146, + "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 } @@ -3825,54 +4182,12 @@ "h": 22 }, "frame": { - "x": 250, - "y": 148, + "x": 193, + "y": 168, "w": 22, "h": 22 } }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 189, - "y": 171, - "w": 17, - "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": 206, - "y": 169, - "w": 22, - "h": 23 - } - }, { "filename": "enigma_berry", "rotated": false, @@ -3888,12 +4203,33 @@ "h": 22 }, "frame": { - "x": 228, - "y": 169, + "x": 192, + "y": 190, "w": 22, "h": 22 } }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 214, + "y": 149, + "w": 22, + "h": 19 + } + }, { "filename": "fairy_memory", "rotated": false, @@ -3909,8 +4245,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 170, + "x": 215, + "y": 168, "w": 22, "h": 22 } @@ -3930,8 +4266,8 @@ "h": 22 }, "frame": { - "x": 272, - "y": 153, + "x": 214, + "y": 190, "w": 22, "h": 22 } @@ -3951,54 +4287,12 @@ "h": 22 }, "frame": { - "x": 294, - "y": 154, + "x": 193, + "y": 212, "w": 22, "h": 22 } }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 272, - "y": 175, - "w": 22, - "h": 19 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 294, - "y": 176, - "w": 22, - "h": 20 - } - }, { "filename": "flying_memory", "rotated": false, @@ -4014,8 +4308,8 @@ "h": 22 }, "frame": { - "x": 316, - "y": 155, + "x": 193, + "y": 234, "w": 22, "h": 22 } @@ -4035,8 +4329,8 @@ "h": 22 }, "frame": { - "x": 316, - "y": 177, + "x": 193, + "y": 256, "w": 22, "h": 22 } @@ -4056,8 +4350,8 @@ "h": 22 }, "frame": { - "x": 338, - "y": 157, + "x": 215, + "y": 212, "w": 22, "h": 22 } @@ -4077,8 +4371,8 @@ "h": 22 }, "frame": { - "x": 338, - "y": 179, + "x": 215, + "y": 234, "w": 22, "h": 22 } @@ -4098,33 +4392,12 @@ "h": 22 }, "frame": { - "x": 189, - "y": 194, + "x": 215, + "y": 256, "w": 22, "h": 22 } }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 211, - "y": 192, - "w": 17, - "h": 23 - } - }, { "filename": "guard_spec", "rotated": false, @@ -4140,12 +4413,33 @@ "h": 22 }, "frame": { - "x": 228, - "y": 191, + "x": 195, + "y": 278, "w": 22, "h": 22 } }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 217, + "y": 278, + "w": 20, + "h": 22 + } + }, { "filename": "ice_memory", "rotated": false, @@ -4161,8 +4455,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 192, + "x": 236, + "y": 105, "w": 22, "h": 22 } @@ -4182,33 +4476,12 @@ "h": 22 }, "frame": { - "x": 272, - "y": 194, + "x": 258, + "y": 105, "w": 22, "h": 22 } }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 294, - "y": 196, - "w": 22, - "h": 21 - } - }, { "filename": "magmarizer", "rotated": false, @@ -4224,33 +4497,12 @@ "h": 22 }, "frame": { - "x": 316, - "y": 199, + "x": 236, + "y": 127, "w": 22, "h": 22 } }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 338, - "y": 201, - "w": 22, - "h": 20 - } - }, { "filename": "mini_black_hole", "rotated": false, @@ -4266,8 +4518,29 @@ "h": 22 }, "frame": { - "x": 146, - "y": 216, + "x": 280, + "y": 105, + "w": 22, + "h": 22 + } + }, + { + "filename": "normal_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 258, + "y": 127, "w": 22, "h": 22 } @@ -4287,12 +4560,33 @@ "h": 22 }, "frame": { - "x": 168, - "y": 216, + "x": 280, + "y": 127, "w": 22, "h": 22 } }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 236, + "y": 149, + "w": 22, + "h": 19 + } + }, { "filename": "protector", "rotated": false, @@ -4308,33 +4602,12 @@ "h": 22 }, "frame": { - "x": 190, - "y": 216, + "x": 237, + "y": 168, "w": 22, "h": 22 } }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 212, - "y": 215, - "w": 16, - "h": 24 - } - }, { "filename": "psychic_memory", "rotated": false, @@ -4350,12 +4623,138 @@ "h": 22 }, "frame": { - "x": 228, - "y": 213, + "x": 236, + "y": 190, "w": 22, "h": 22 } }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 237, + "y": 212, + "w": 20, + "h": 23 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 302, + "y": 105, + "w": 17, + "h": 23 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 319, + "y": 107, + "w": 23, + "h": 21 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 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, @@ -4371,8 +4770,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 214, + "x": 237, + "y": 235, "w": 22, "h": 22 } @@ -4392,8 +4791,8 @@ "h": 22 }, "frame": { - "x": 272, - "y": 216, + "x": 237, + "y": 257, "w": 22, "h": 22 } @@ -4413,12 +4812,33 @@ "h": 22 }, "frame": { - "x": 294, - "y": 217, + "x": 237, + "y": 279, "w": 22, "h": 22 } }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 258, + "y": 149, + "w": 22, + "h": 19 + } + }, { "filename": "shed_shell", "rotated": false, @@ -4434,8 +4854,8 @@ "h": 22 }, "frame": { - "x": 316, - "y": 221, + "x": 259, + "y": 168, "w": 22, "h": 22 } @@ -4455,33 +4875,12 @@ "h": 22 }, "frame": { - "x": 338, - "y": 221, + "x": 258, + "y": 190, "w": 22, "h": 22 } }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 148, - "y": 238, - "w": 21, - "h": 23 - } - }, { "filename": "steel_memory", "rotated": false, @@ -4497,428 +4896,8 @@ "h": 22 }, "frame": { - "x": 169, - "y": 238, - "w": 22, - "h": 22 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 191, - "y": 238, - "w": 21, - "h": 23 - } - }, - { - "filename": "hard_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 212, - "y": 239, - "w": 20, - "h": 22 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 232, - "y": 235, - "w": 17, - "h": 23 - } - }, - { - "filename": "thick_club", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 249, - "y": 236, - "w": 22, - "h": 22 - } - }, - { - "filename": "sweet_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 271, - "y": 238, - "w": 22, - "h": 21 - } - }, - { - "filename": "syrupy_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 293, - "y": 239, - "w": 22, - "h": 21 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 315, - "y": 243, - "w": 22, - "h": 21 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 337, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "masterpiece_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 148, - "y": 261, - "w": 21, - "h": 18 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 169, - "y": 260, - "w": 22, - "h": 20 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 261, - "w": 22, - "h": 22 - } - }, - { - "filename": "lock_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 213, - "y": 261, - "w": 19, - "h": 22 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 232, - "y": 258, - "w": 22, - "h": 22 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 254, - "y": 258, - "w": 17, - "h": 22 - } - }, - { - "filename": "tm_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 271, - "y": 259, - "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": 293, - "y": 260, - "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": 315, - "y": 264, - "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": 337, - "y": 265, - "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": 366, - "y": 131, - "w": 22, - "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": 388, - "y": 134, + "x": 257, + "y": 212, "w": 22, "h": 22 } @@ -4938,12 +4917,33 @@ "h": 20 }, "frame": { - "x": 128, - "y": 272, + "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, @@ -4959,12 +4959,285 @@ "h": 19 }, "frame": { - "x": 148, - "y": 279, + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 301, + "y": 171, + "w": 20, + "h": 19 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 302, + "y": 190, + "w": 19, + "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": 301, + "y": 212, + "w": 22, + "h": 22 + } + }, { "filename": "tm_ghost", "rotated": false, @@ -4980,8 +5253,8 @@ "h": 22 }, "frame": { - "x": 169, - "y": 280, + "x": 303, + "y": 234, "w": 22, "h": 22 } @@ -5001,33 +5274,12 @@ "h": 22 }, "frame": { - "x": 191, - "y": 283, + "x": 303, + "y": 256, "w": 22, "h": 22 } }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 213, - "y": 283, - "w": 19, - "h": 22 - } - }, { "filename": "tm_ground", "rotated": false, @@ -5043,386 +5295,8 @@ "h": 22 }, "frame": { - "x": 232, - "y": 280, - "w": 22, - "h": 22 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 254, - "y": 280, - "w": 17, - "h": 22 - } - }, - { - "filename": "tm_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 271, - "y": 281, - "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": 293, - "y": 282, - "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": 315, - "y": 286, - "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": 337, - "y": 287, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 72, - "y": 270, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 72, - "y": 292, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 72, - "y": 314, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 72, - "y": 336, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 72, - "y": 358, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_accuracy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 72, - "y": 380, - "w": 22, - "h": 22 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 94, - "y": 270, - "w": 15, - "h": 22 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 109, - "y": 273, - "w": 19, - "h": 19 - } - }, - { - "filename": "x_attack", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 94, - "y": 292, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_defense", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 116, - "y": 292, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 94, - "y": 314, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 94, - "y": 336, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_speed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 116, - "y": 314, + "x": 303, + "y": 278, "w": 22, "h": 22 } @@ -5442,12 +5316,474 @@ "h": 21 }, "frame": { - "x": 94, - "y": 358, + "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 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 343, + "y": 171, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 367, + "y": 127, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 367, + "y": 149, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 365, + "y": 171, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 325, + "y": 234, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_def", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 325, + "y": 256, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_speed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 325, + "y": 278, + "w": 22, + "h": 22 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 361, + "y": 193, + "w": 22, + "h": 20 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 383, + "y": 193, + "w": 22, + "h": 20 + } + }, { "filename": "shiny_stone", "rotated": false, @@ -5463,14 +5799,14 @@ "h": 21 }, "frame": { - "x": 116, - "y": 336, + "x": 405, + "y": 195, "w": 21, "h": 21 } }, { - "filename": "sitrus_berry", + "filename": "mystery_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -5478,16 +5814,58 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 + "x": 8, + "y": 8, + "w": 16, + "h": 18 }, "frame": { - "x": 94, - "y": 379, - "w": 20, - "h": 22 + "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 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 384, + "y": 213, + "w": 21, + "h": 18 } }, { @@ -5505,12 +5883,96 @@ "h": 21 }, "frame": { - "x": 138, - "y": 298, + "x": 405, + "y": 216, "w": 21, "h": 21 } }, + { + "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, @@ -5526,14 +5988,14 @@ "h": 18 }, "frame": { - "x": 138, - "y": 319, + "x": 384, + "y": 231, "w": 21, "h": 18 } }, { - "filename": "upgrade", + "filename": "unremarkable_teacup", "rotated": false, "trimmed": true, "sourceSize": { @@ -5543,18 +6005,60 @@ "spriteSourceSize": { "x": 5, "y": 7, - "w": 22, - "h": 19 + "w": 21, + "h": 18 }, "frame": { - "x": 137, - "y": 337, - "w": 22, - "h": 19 + "x": 405, + "y": 237, + "w": 21, + "h": 18 } }, { - "filename": "dawn_stone", + "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": { @@ -5564,13 +6068,13 @@ "spriteSourceSize": { "x": 6, "y": 6, - "w": 20, + "w": 19, "h": 21 }, "frame": { - "x": 159, - "y": 302, - "w": 20, + "x": 386, + "y": 249, + "w": 19, "h": 21 } }, @@ -5589,159 +6093,12 @@ "h": 20 }, "frame": { - "x": 159, - "y": 323, + "x": 405, + "y": 255, "w": 20, "h": 20 } }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 159, - "y": 343, - "w": 20, - "h": 17 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 179, - "y": 302, - "w": 12, - "h": 17 - } - }, - { - "filename": "super_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 179, - "y": 319, - "w": 16, - "h": 24 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 179, - "y": 343, - "w": 18, - "h": 18 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 360, - "y": 157, - "w": 16, - "h": 24 - } - }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 360, - "y": 181, - "w": 16, - "h": 24 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 360, - "y": 205, - "w": 19, - "h": 21 - } - }, { "filename": "candy_jar", "rotated": false, @@ -5757,155 +6114,8 @@ "h": 20 }, "frame": { - "x": 360, - "y": 226, - "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": 359, - "y": 246, - "w": 20, - "h": 20 - } - }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 359, - "y": 266, - "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": 359, - "y": 286, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 376, - "y": 156, - "w": 20, - "h": 20 - } - }, - { - "filename": "spell_tag", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 396, - "y": 156, - "w": 19, - "h": 21 - } - }, - { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 376, - "y": 176, - "w": 20, - "h": 20 - } - }, - { - "filename": "hard_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 396, - "y": 177, + "x": 386, + "y": 270, "w": 19, "h": 20 } @@ -5925,8 +6135,113 @@ "h": 20 }, "frame": { - "x": 379, - "y": 196, + "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 } @@ -5946,12 +6261,159 @@ "h": 19 }, "frame": { - "x": 396, - "y": 197, + "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": 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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 279, + "y": 300, + "w": 20, + "h": 20 + } + }, + { + "filename": "pb_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 299, + "y": 300, + "w": 20, + "h": 20 + } + }, { "filename": "rb", "rotated": false, @@ -5967,14 +6429,35 @@ "h": 20 }, "frame": { - "x": 379, - "y": 216, + "x": 319, + "y": 300, "w": 20, "h": 20 } }, { - "filename": "abomasite", + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 155, + "y": 305, + "w": 23, + "h": 17 + } + }, + { + "filename": "soothe_bell", "rotated": false, "trimmed": true, "sourceSize": { @@ -5983,15 +6466,36 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, - "w": 16, - "h": 16 + "y": 5, + "w": 17, + "h": 22 }, "frame": { - "x": 399, - "y": 216, - "w": 16, - "h": 16 + "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 } }, { @@ -6009,54 +6513,12 @@ "h": 20 }, "frame": { - "x": 379, - "y": 236, + "x": 218, + "y": 321, "w": 20, "h": 20 } }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 232, - "w": 16, - "h": 16 - } - }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 248, - "w": 16, - "h": 16 - } - }, { "filename": "strange_ball", "rotated": false, @@ -6072,50 +6534,8 @@ "h": 20 }, "frame": { - "x": 379, - "y": 256, - "w": 20, - "h": 20 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 264, - "w": 16, - "h": 16 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 276, + "x": 238, + "y": 321, "w": 20, "h": 20 } @@ -6135,77 +6555,14 @@ "h": 16 }, "frame": { - "x": 399, - "y": 280, + "x": 139, + "y": 309, "w": 16, "h": 16 } }, { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 379, - "y": 296, - "w": 21, - "h": 18 - } - }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 400, - "y": 296, - "w": 15, - "h": 15 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 400, - "y": 311, - "w": 15, - "h": 15 - } - }, - { - "filename": "lum_berry", + "filename": "ub", "rotated": false, "trimmed": true, "sourceSize": { @@ -6214,124 +6571,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 359, - "y": 306, - "w": 20, - "h": 19 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 379, - "y": 314, - "w": 20, - "h": 16 - } - }, - { - "filename": "altarianite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 326, - "w": 16, - "h": 16 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 195, - "y": 305, - "w": 20, - "h": 19 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 195, - "y": 324, - "w": 18, - "h": 19 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, "y": 6, - "w": 17, + "w": 20, "h": 20 }, "frame": { - "x": 215, - "y": 305, - "w": 17, + "x": 135, + "y": 325, + "w": 20, "h": 20 } }, { - "filename": "razor_fang", + "filename": "white_herb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6339,16 +6591,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 + "x": 6, + "y": 7, + "w": 20, + "h": 19 }, "frame": { - "x": 232, - "y": 302, - "w": 18, - "h": 20 + "x": 155, + "y": 322, + "w": 20, + "h": 19 } }, { @@ -6366,8 +6618,8 @@ "h": 18 }, "frame": { - "x": 250, - "y": 302, + "x": 175, + "y": 327, "w": 20, "h": 18 } @@ -6387,12 +6639,33 @@ "h": 18 }, "frame": { - "x": 270, - "y": 303, + "x": 136, + "y": 345, "w": 20, "h": 18 } }, + { + "filename": "baton", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 156, + "y": 341, + "w": 18, + "h": 18 + } + }, { "filename": "wl_awakening", "rotated": false, @@ -6408,8 +6681,8 @@ "h": 18 }, "frame": { - "x": 213, - "y": 325, + "x": 174, + "y": 345, "w": 20, "h": 18 } @@ -6429,33 +6702,12 @@ "h": 18 }, "frame": { - "x": 197, - "y": 343, + "x": 195, + "y": 335, "w": 20, "h": 18 } }, - { - "filename": "dark_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 217, - "y": 343, - "w": 18, - "h": 18 - } - }, { "filename": "wl_custom_spliced", "rotated": false, @@ -6471,54 +6723,12 @@ "h": 18 }, "frame": { - "x": 290, - "y": 304, + "x": 215, + "y": 341, "w": 20, "h": 18 } }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 233, - "y": 322, - "w": 18, - "h": 18 - } - }, - { - "filename": "light_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 251, - "y": 320, - "w": 18, - "h": 18 - } - }, { "filename": "wl_custom_thief", "rotated": false, @@ -6534,8 +6744,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 321, + "x": 235, + "y": 341, "w": 20, "h": 18 } @@ -6555,54 +6765,12 @@ "h": 18 }, "frame": { - "x": 289, - "y": 322, + "x": 194, + "y": 353, "w": 20, "h": 18 } }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 235, - "y": 340, - "w": 18, - "h": 18 - } - }, - { - "filename": "ampharosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 253, - "y": 338, - "w": 16, - "h": 16 - } - }, { "filename": "wl_ether", "rotated": false, @@ -6618,8 +6786,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 339, + "x": 214, + "y": 359, "w": 20, "h": 18 } @@ -6639,12 +6807,33 @@ "h": 18 }, "frame": { - "x": 289, - "y": 340, + "x": 234, + "y": 359, "w": 20, "h": 18 } }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 156, + "y": 359, + "w": 18, + "h": 18 + } + }, { "filename": "wl_full_restore", "rotated": false, @@ -6660,8 +6849,8 @@ "h": 18 }, "frame": { - "x": 310, - "y": 308, + "x": 174, + "y": 363, "w": 20, "h": 18 } @@ -6681,8 +6870,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 326, + "x": 194, + "y": 371, "w": 20, "h": 18 } @@ -6702,8 +6891,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 344, + "x": 214, + "y": 377, "w": 20, "h": 18 } @@ -6723,12 +6912,33 @@ "h": 18 }, "frame": { - "x": 330, - "y": 309, + "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, @@ -6744,8 +6954,8 @@ "h": 18 }, "frame": { - "x": 329, - "y": 327, + "x": 141, + "y": 377, "w": 20, "h": 18 } @@ -6765,33 +6975,12 @@ "h": 18 }, "frame": { - "x": 329, - "y": 345, + "x": 141, + "y": 395, "w": 20, "h": 18 } }, - { - "filename": "audinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 253, - "y": 354, - "w": 16, - "h": 16 - } - }, { "filename": "wl_max_elixir", "rotated": false, @@ -6807,8 +6996,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 357, + "x": 161, + "y": 381, "w": 20, "h": 18 } @@ -6828,8 +7017,8 @@ "h": 18 }, "frame": { - "x": 289, - "y": 358, + "x": 161, + "y": 399, "w": 20, "h": 18 } @@ -6849,8 +7038,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 362, + "x": 181, + "y": 389, "w": 20, "h": 18 } @@ -6870,54 +7059,12 @@ "h": 18 }, "frame": { - "x": 329, - "y": 363, + "x": 181, + "y": 407, "w": 20, "h": 18 } }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 235, - "y": 358, - "w": 18, - "h": 18 - } - }, - { - "filename": "banettite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 253, - "y": 370, - "w": 16, - "h": 16 - } - }, { "filename": "wl_paralyze_heal", "rotated": false, @@ -6933,8 +7080,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 375, + "x": 201, + "y": 395, "w": 20, "h": 18 } @@ -6954,12 +7101,54 @@ "h": 18 }, "frame": { - "x": 289, - "y": 376, + "x": 221, + "y": 395, "w": 20, "h": 18 } }, + { + "filename": "dark_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 241, + "y": 395, + "w": 18, + "h": 18 + } + }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 255, + "y": 341, + "w": 18, + "h": 18 + } + }, { "filename": "wl_reset_urge", "rotated": false, @@ -6975,8 +7164,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 380, + "x": 254, + "y": 359, "w": 20, "h": 18 } @@ -6996,12 +7185,33 @@ "h": 18 }, "frame": { - "x": 329, - "y": 381, + "x": 254, + "y": 377, "w": 20, "h": 18 } }, + { + "filename": "light_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 259, + "y": 395, + "w": 18, + "h": 18 + } + }, { "filename": "wl_super_potion", "rotated": false, @@ -7017,14 +7227,14 @@ "h": 18 }, "frame": { - "x": 116, - "y": 357, + "x": 259, + "y": 320, "w": 20, "h": 18 } }, { - "filename": "relic_band", + "filename": "light_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -7033,14 +7243,119 @@ }, "spriteSourceSize": { "x": 7, - "y": 9, - "w": 17, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 279, + "y": 320, + "w": 18, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 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": 115, - "y": 375, - "w": 17, + "x": 315, + "y": 320, + "w": 16, + "h": 16 + } + }, + { + "filename": "ampharosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 273, + "y": 338, + "w": 16, + "h": 16 + } + }, + { + "filename": "audinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 289, + "y": 338, + "w": 16, + "h": 16 + } + }, + { + "filename": "banettite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 274, + "y": 354, + "w": 16, "h": 16 } }, @@ -7059,8 +7374,8 @@ "h": 16 }, "frame": { - "x": 114, - "y": 391, + "x": 274, + "y": 370, "w": 16, "h": 16 } @@ -7080,8 +7395,8 @@ "h": 16 }, "frame": { - "x": 130, - "y": 399, + "x": 290, + "y": 354, "w": 16, "h": 16 } @@ -7101,8 +7416,8 @@ "h": 16 }, "frame": { - "x": 146, - "y": 399, + "x": 290, + "y": 370, "w": 16, "h": 16 } @@ -7122,8 +7437,8 @@ "h": 16 }, "frame": { - "x": 162, - "y": 399, + "x": 305, + "y": 338, "w": 16, "h": 16 } @@ -7143,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 178, - "y": 399, + "x": 306, + "y": 354, "w": 16, "h": 16 } @@ -7164,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 194, - "y": 399, + "x": 306, + "y": 370, "w": 16, "h": 16 } @@ -7185,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 210, - "y": 399, + "x": 331, + "y": 320, "w": 16, "h": 16 } @@ -7206,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 226, - "y": 399, + "x": 321, + "y": 336, "w": 16, "h": 16 } @@ -7227,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 242, - "y": 399, + "x": 322, + "y": 352, "w": 16, "h": 16 } @@ -7248,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 258, - "y": 399, + "x": 322, + "y": 368, "w": 16, "h": 16 } @@ -7269,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 274, - "y": 399, + "x": 337, + "y": 336, "w": 16, "h": 16 } @@ -7290,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 290, - "y": 399, + "x": 338, + "y": 352, "w": 16, "h": 16 } @@ -7311,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 399, + "x": 338, + "y": 368, "w": 16, "h": 16 } @@ -7332,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 399, + "x": 347, + "y": 313, "w": 16, "h": 16 } @@ -7353,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 338, - "y": 399, + "x": 277, + "y": 386, "w": 16, "h": 16 } @@ -7374,33 +7689,12 @@ "h": 16 }, "frame": { - "x": 132, - "y": 375, + "x": 293, + "y": 386, "w": 16, "h": 16 } }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 136, - "y": 360, - "w": 16, - "h": 15 - } - }, { "filename": "latiasite", "rotated": false, @@ -7416,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 152, - "y": 360, + "x": 309, + "y": 386, "w": 16, "h": 16 } @@ -7437,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 148, - "y": 376, + "x": 325, + "y": 384, "w": 16, "h": 16 } @@ -7458,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 168, - "y": 361, + "x": 341, + "y": 384, "w": 16, "h": 16 } @@ -7479,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 184, - "y": 361, + "x": 277, + "y": 402, "w": 16, "h": 16 } @@ -7500,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 200, - "y": 361, + "x": 293, + "y": 402, "w": 16, "h": 16 } @@ -7521,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 216, - "y": 361, + "x": 309, + "y": 402, "w": 16, "h": 16 } @@ -7542,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 164, - "y": 377, + "x": 325, + "y": 400, "w": 16, "h": 16 } @@ -7563,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 180, - "y": 377, + "x": 341, + "y": 400, "w": 16, "h": 16 } @@ -7584,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 196, - "y": 377, + "x": 353, + "y": 329, "w": 16, "h": 16 } @@ -7605,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 212, - "y": 377, + "x": 369, + "y": 322, "w": 16, "h": 16 } @@ -7626,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 228, - "y": 377, + "x": 354, + "y": 345, "w": 16, "h": 16 } @@ -7647,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 327, + "x": 354, + "y": 361, "w": 16, "h": 16 } @@ -7668,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 343, + "x": 385, + "y": 329, "w": 16, "h": 16 } @@ -7689,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 359, + "x": 401, + "y": 332, "w": 16, "h": 16 } @@ -7710,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 375, + "x": 357, + "y": 377, "w": 16, "h": 16 } @@ -7731,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 391, + "x": 357, + "y": 393, "w": 16, "h": 16 } @@ -7752,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 330, + "x": 357, + "y": 409, "w": 16, "h": 16 } @@ -7773,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 330, + "x": 370, + "y": 345, "w": 16, "h": 16 } @@ -7794,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 346, + "x": 370, + "y": 361, "w": 16, "h": 16 } @@ -7815,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 362, + "x": 373, + "y": 377, "w": 16, "h": 16 } @@ -7836,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 346, + "x": 373, + "y": 393, "w": 16, "h": 16 } @@ -7857,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 362, + "x": 373, + "y": 409, "w": 16, "h": 16 } @@ -7878,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 342, + "x": 386, + "y": 348, "w": 16, "h": 16 } @@ -7899,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 358, + "x": 402, + "y": 348, "w": 16, "h": 16 } @@ -7920,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 374, + "x": 389, + "y": 364, "w": 16, "h": 16 } @@ -7941,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 370, - "y": 378, + "x": 389, + "y": 380, "w": 16, "h": 16 } @@ -7953,6 +8247,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:60db8f4653a650759cd9189e91c38a40:439307cbef9c000f6c45603b2d82d107:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:c004184e48566e1da6f13477a3348fd3:dc1a5489f7821641aade35ba290bbea7:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 6d9434d0454..4c366e4d72a 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/baton.png b/public/images/items/baton.png new file mode 100644 index 00000000000..8e9ebfae06d Binary files /dev/null and b/public/images/items/baton.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/stick.png b/public/images/items/leek.png similarity index 100% rename from public/images/items/stick.png rename to public/images/items/leek.png 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/items/power_herb.png b/public/images/items/power_herb.png new file mode 100644 index 00000000000..15a581490a0 Binary files /dev/null and b/public/images/items/power_herb.png differ diff --git a/public/images/items/ribbon_gen1.png b/public/images/items/ribbon_gen1.png new file mode 100644 index 00000000000..a9774d18ad0 Binary files /dev/null and b/public/images/items/ribbon_gen1.png differ diff --git a/public/images/items/ribbon_gen2.png b/public/images/items/ribbon_gen2.png new file mode 100644 index 00000000000..a04f6a32a62 Binary files /dev/null and b/public/images/items/ribbon_gen2.png differ diff --git a/public/images/items/ribbon_gen3.png b/public/images/items/ribbon_gen3.png new file mode 100644 index 00000000000..0cf20ed92ee Binary files /dev/null and b/public/images/items/ribbon_gen3.png differ diff --git a/public/images/items/ribbon_gen4.png b/public/images/items/ribbon_gen4.png new file mode 100644 index 00000000000..aa24433b71b Binary files /dev/null and b/public/images/items/ribbon_gen4.png differ diff --git a/public/images/items/ribbon_gen5.png b/public/images/items/ribbon_gen5.png new file mode 100644 index 00000000000..7bb7800671f Binary files /dev/null and b/public/images/items/ribbon_gen5.png differ diff --git a/public/images/items/ribbon_gen6.png b/public/images/items/ribbon_gen6.png new file mode 100644 index 00000000000..e466eb78842 Binary files /dev/null and b/public/images/items/ribbon_gen6.png differ diff --git a/public/images/items/ribbon_gen7.png b/public/images/items/ribbon_gen7.png new file mode 100644 index 00000000000..9c156ebd1c6 Binary files /dev/null and b/public/images/items/ribbon_gen7.png differ diff --git a/public/images/items/ribbon_gen8.png b/public/images/items/ribbon_gen8.png new file mode 100644 index 00000000000..86b3748e348 Binary files /dev/null and b/public/images/items/ribbon_gen8.png differ diff --git a/public/images/items/ribbon_gen9.png b/public/images/items/ribbon_gen9.png new file mode 100644 index 00000000000..e9609daf3cd Binary files /dev/null and b/public/images/items/ribbon_gen9.png differ diff --git a/public/images/items/ultranecrozium_z.png b/public/images/items/ultranecrozium_z.png new file mode 100644 index 00000000000..208f3fb173d Binary files /dev/null and b/public/images/items/ultranecrozium_z.png differ diff --git a/public/images/items/white_herb.png b/public/images/items/white_herb.png new file mode 100644 index 00000000000..56ca7c6aeb2 Binary files /dev/null and b/public/images/items/white_herb.png differ diff --git a/public/images/pokemon/1003.png b/public/images/pokemon/1003.png index 348f240dd4a..3a88f39d65f 100644 Binary files a/public/images/pokemon/1003.png and b/public/images/pokemon/1003.png differ diff --git a/public/images/pokemon/1006.png b/public/images/pokemon/1006.png index 918376210e1..b5baebdf428 100644 Binary files a/public/images/pokemon/1006.png and b/public/images/pokemon/1006.png differ diff --git a/public/images/pokemon/159.png b/public/images/pokemon/159.png index 58859dbcc66..62de85e4ad7 100644 Binary files a/public/images/pokemon/159.png and b/public/images/pokemon/159.png differ diff --git a/public/images/pokemon/178.png b/public/images/pokemon/178.png index 32c19417b6d..c1de10a8c9e 100644 Binary files a/public/images/pokemon/178.png and b/public/images/pokemon/178.png differ diff --git a/public/images/pokemon/190.png b/public/images/pokemon/190.png index e9f3a0c7009..b049ba83296 100644 Binary files a/public/images/pokemon/190.png and b/public/images/pokemon/190.png differ diff --git a/public/images/pokemon/196.json b/public/images/pokemon/196.json index 855bc9b1dc2..5059f85e2d0 100644 --- a/public/images/pokemon/196.json +++ b/public/images/pokemon/196.json @@ -4,122 +4,206 @@ "image": "196.png", "format": "RGBA8888", "size": { - "w": 376, - "h": 376 + "w": 386, + "h": 386 }, "scale": 1, "frames": [ { - "filename": "0010.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 10, + "w": 63, + "h": 48 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 1, + "y": 1, + "w": 63, + "h": 48 } }, { - "filename": "0031.png", + "filename": "0018.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 10, + "w": 63, + "h": 48 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 1, + "y": 1, + "w": 63, + "h": 48 } }, { - "filename": "0032.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 10, + "w": 63, + "h": 48 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 66, + "y": 1, + "w": 63, + "h": 48 } }, { - "filename": "0053.png", + "filename": "0061.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 10, + "w": 63, + "h": 48 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 131, + "y": 1, + "w": 63, + "h": 48 } }, { - "filename": "0054.png", + "filename": "0006.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 8, + "w": 62, + "h": 50 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 196, + "y": 1, + "w": 62, + "h": 50 } }, { - "filename": "0140.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, "w": 62, + "h": 50 + }, + "frame": { + "x": 196, + "y": 1, + "w": 62, + "h": 50 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 196, + "y": 1, + "w": 62, + "h": 50 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 260, + "y": 1, + "w": 62, + "h": 50 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 260, + "y": 1, + "w": 62, + "h": 50 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -129,8 +213,8 @@ "h": 53 }, "frame": { - "x": 0, - "y": 0, + "x": 324, + "y": 1, "w": 59, "h": 53 } @@ -140,7 +224,7 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -150,18 +234,123 @@ "h": 53 }, "frame": { + "x": 324, + "y": 1, + "w": 59, + "h": 53 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { "x": 0, + "y": 5, + "w": 59, + "h": 53 + }, + "frame": { + "x": 324, + "y": 1, + "w": 59, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 1, + "y": 51, + "w": 62, + "h": 50 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 65, + "y": 51, + "w": 62, + "h": 50 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 129, + "y": 51, + "w": 62, + "h": 50 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 59, + "h": 53 + }, + "frame": { + "x": 193, "y": 53, "w": 59, "h": 53 } }, { - "filename": "0017.png", + "filename": "0030.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -171,7 +360,7 @@ "h": 53 }, "frame": { - "x": 0, + "x": 193, "y": 53, "w": 59, "h": 53 @@ -182,7 +371,7 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -192,1774 +381,52 @@ "h": 53 }, "frame": { - "x": 0, + "x": 254, "y": 53, "w": 59, "h": 53 } }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 59, - "y": 0, - "w": 59, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 59, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 59, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 118, - "y": 0, - "w": 59, - "h": 53 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 301, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 301, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 301, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 271, - "w": 53, - "h": 56 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 271, - "w": 53, - "h": 56 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 59, - "y": 106, - "w": 62, - "h": 49 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 118, - "y": 53, - "w": 62, - "h": 49 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 118, - "y": 53, - "w": 62, - "h": 49 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 242, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 242, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 304, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 304, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 121, - "y": 102, - "w": 53, - "h": 56 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 121, - "y": 102, - "w": 53, - "h": 56 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 58 - }, - "frame": { - "x": 53, - "y": 159, - "w": 43, - "h": 58 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 58 - }, - "frame": { - "x": 53, - "y": 159, - "w": 43, - "h": 58 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 53, - "y": 217, - "w": 44, - "h": 58 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 53, - "y": 217, - "w": 44, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 96, - "y": 158, - "w": 53, - "h": 56 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 96, - "y": 158, - "w": 53, - "h": 56 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 97, - "y": 214, - "w": 53, - "h": 56 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 97, - "y": 214, - "w": 53, - "h": 56 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 56 - }, - "frame": { - "x": 149, - "y": 158, - "w": 43, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 150, - "y": 214, - "w": 45, - "h": 58 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, { "filename": "0041.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 49, - "h": 55 + "y": 5, + "w": 59, + "h": 53 }, "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 + "x": 315, + "y": 56, + "w": 59, + "h": 53 } }, { - "filename": "0042.png", + "filename": "0059.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 49, - "h": 55 + "y": 5, + "w": 59, + "h": 53 }, "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 + "x": 1, + "y": 103, + "w": 59, + "h": 53 } }, { @@ -1967,713 +434,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 49, - "h": 55 + "y": 5, + "w": 59, + "h": 53 }, "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 56 - }, - "frame": { - "x": 174, - "y": 102, - "w": 43, - "h": 56 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 56 - }, - "frame": { - "x": 174, - "y": 102, - "w": 43, - "h": 56 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 217, - "y": 96, - "w": 49, - "h": 55 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 217, - "y": 96, - "w": 49, - "h": 55 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 266, - "y": 96, - "w": 49, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 315, - "y": 96, - "w": 49, - "h": 55 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 195, - "y": 213, - "w": 45, - "h": 58 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 195, - "y": 213, - "w": 45, - "h": 58 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 196, - "y": 271, - "w": 45, - "h": 58 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 196, - "y": 271, - "w": 45, - "h": 58 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 237, - "y": 151, - "w": 45, - "h": 58 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 282, - "y": 151, - "w": 45, - "h": 58 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 282, - "y": 151, - "w": 45, - "h": 58 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 240, - "y": 209, - "w": 44, - "h": 58 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 240, - "y": 209, - "w": 44, - "h": 58 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 58 - }, - "frame": { - "x": 284, - "y": 209, - "w": 43, - "h": 58 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 241, - "y": 267, - "w": 45, - "h": 55 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 286, - "y": 267, - "w": 45, - "h": 55 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 286, - "y": 267, - "w": 45, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 327, - "y": 151, - "w": 45, - "h": 55 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 327, - "y": 151, - "w": 45, - "h": 55 + "x": 62, + "y": 103, + "w": 59, + "h": 53 } }, { @@ -2681,7 +455,7 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -2691,18 +465,18 @@ "h": 54 }, "frame": { - "x": 327, - "y": 206, + "x": 123, + "y": 103, "w": 42, "h": 54 } }, { - "filename": "0002.png", + "filename": "0012.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -2712,8 +486,8 @@ "h": 54 }, "frame": { - "x": 327, - "y": 206, + "x": 123, + "y": 103, "w": 42, "h": 54 } @@ -2723,7 +497,7 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -2733,18 +507,18 @@ "h": 54 }, "frame": { - "x": 327, - "y": 206, + "x": 123, + "y": 103, "w": 42, "h": 54 } }, { - "filename": "0024.png", + "filename": "0002.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -2754,8 +528,134 @@ "h": 54 }, "frame": { - "x": 327, - "y": 206, + "x": 167, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 167, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 211, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 255, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 255, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 255, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 299, + "y": 111, "w": 42, "h": 54 } @@ -2765,104 +665,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, + "y": 1, "w": 42, - "h": 54 + "h": 57 }, "frame": { - "x": 327, - "y": 206, + "x": 343, + "y": 111, "w": 42, - "h": 54 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 327, - "y": 206, - "w": 42, - "h": 54 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 327, - "y": 206, - "w": 42, - "h": 54 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 327, - "y": 206, - "w": 42, - "h": 54 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 327, - "y": 206, - "w": 42, - "h": 54 + "h": 57 } }, { @@ -2870,41 +686,209 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 3, + "w": 45, + "h": 55 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 1, + "y": 158, + "w": 45, + "h": 55 } }, { - "filename": "0004.png", + "filename": "0024.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 3, + "w": 45, + "h": 55 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 1, + "y": 158, + "w": 45, + "h": 55 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 48, + "y": 158, + "w": 49, + "h": 55 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 48, + "y": 158, + "w": 49, + "h": 55 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 48, + "y": 158, + "w": 49, + "h": 55 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 99, + "y": 159, + "w": 45, + "h": 55 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 99, + "y": 159, + "w": 45, + "h": 55 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 99, + "y": 159, + "w": 45, + "h": 55 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 99, + "y": 159, + "w": 45, + "h": 55 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 146, + "y": 164, + "w": 49, + "h": 55 } }, { @@ -2912,20 +896,83 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 3, + "w": 49, + "h": 55 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 146, + "y": 164, + "w": 49, + "h": 55 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 197, + "y": 164, + "w": 45, + "h": 55 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 244, + "y": 164, + "w": 49, + "h": 55 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 295, + "y": 167, + "w": 45, + "h": 55 } }, { @@ -2933,20 +980,251 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 43, + "h": 58 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 342, + "y": 170, + "w": 43, + "h": 58 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 1, + "y": 215, + "w": 49, + "h": 55 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 52, + "y": 216, + "w": 49, + "h": 55 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 103, + "y": 221, + "w": 49, + "h": 55 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 154, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 154, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 154, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 209, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 209, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 209, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 264, + "y": 224, + "w": 53, + "h": 56 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 319, + "y": 230, + "w": 53, + "h": 56 } }, { @@ -2954,251 +1232,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 44, + "h": 58 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 1, + "y": 272, + "w": 44, + "h": 58 } }, { - "filename": "0133.png", + "filename": "0048.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 45, + "h": 58 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 47, + "y": 273, + "w": 45, + "h": 58 } }, { - "filename": "0134.png", + "filename": "0049.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 45, + "h": 58 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 94, + "y": 278, + "w": 45, + "h": 58 } }, { - "filename": "0068.png", + "filename": "0050.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 46, + "h": 58 }, "frame": { - "x": 331, - "y": 314, - "w": 42, - "h": 54 + "x": 141, + "y": 279, + "w": 46, + "h": 58 } }, { - "filename": "0069.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 45, + "h": 58 }, "frame": { - "x": 331, - "y": 314, - "w": 42, - "h": 54 + "x": 189, + "y": 279, + "w": 45, + "h": 58 } }, { - "filename": "0088.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 44, + "h": 58 }, "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 + "x": 236, + "y": 282, + "w": 44, + "h": 58 } }, { - "filename": "0089.png", + "filename": "0053.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, + "y": 0, + "w": 43, "h": 58 }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, + "x": 282, + "y": 288, + "w": 43, "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 283, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 283, - "y": 322, - "w": 42, - "h": 54 } } ] @@ -3207,6 +1380,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8035313afb7abed8b9f404fc150b5ea6:228857b9794392478592ec3b8c178953:fb684cbb576f205e45dc62e63d92a744$" + "smartupdate": "$TexturePacker:SmartUpdate:b40733fff3c9e56156288de85200b9b2:255376a3a047a525a42dff59155c43ba:fb684cbb576f205e45dc62e63d92a744$" } } diff --git a/public/images/pokemon/196.png b/public/images/pokemon/196.png index 435f9e9a73b..7b1890777bd 100644 Binary files a/public/images/pokemon/196.png and b/public/images/pokemon/196.png differ diff --git a/public/images/pokemon/199.png b/public/images/pokemon/199.png index d849798a36d..d3b072497bd 100644 Binary files a/public/images/pokemon/199.png and b/public/images/pokemon/199.png differ diff --git a/public/images/pokemon/256.png b/public/images/pokemon/256.png index 59e974fba54..beb509fa9de 100644 Binary files a/public/images/pokemon/256.png and b/public/images/pokemon/256.png differ diff --git a/public/images/pokemon/257-mega.png b/public/images/pokemon/257-mega.png index 9e59fe7140c..0350e97deee 100644 Binary files a/public/images/pokemon/257-mega.png and b/public/images/pokemon/257-mega.png differ diff --git a/public/images/pokemon/257.png b/public/images/pokemon/257.png index 45c02087c63..76cfb0490e8 100644 Binary files a/public/images/pokemon/257.png and b/public/images/pokemon/257.png differ diff --git a/public/images/pokemon/261.png b/public/images/pokemon/261.png index e44306fbd65..a519b9951a4 100644 Binary files a/public/images/pokemon/261.png and b/public/images/pokemon/261.png differ diff --git a/public/images/pokemon/262.png b/public/images/pokemon/262.png index eb83f5c576e..ee95836e908 100644 Binary files a/public/images/pokemon/262.png and b/public/images/pokemon/262.png differ diff --git a/public/images/pokemon/2670.png b/public/images/pokemon/2670.png index b59b74b39ea..e6660c6285a 100644 Binary files a/public/images/pokemon/2670.png and b/public/images/pokemon/2670.png differ 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/394.png b/public/images/pokemon/394.png index d3336a63741..63b5aa5a29d 100644 Binary files a/public/images/pokemon/394.png and b/public/images/pokemon/394.png differ diff --git a/public/images/pokemon/395.png b/public/images/pokemon/395.png index 656bd1dd3b7..a6a62e3b9f0 100644 Binary files a/public/images/pokemon/395.png and b/public/images/pokemon/395.png differ diff --git a/public/images/pokemon/4080.png b/public/images/pokemon/4080.png index dbb3c5fb4c5..4af9ba7ea0d 100644 Binary files a/public/images/pokemon/4080.png and b/public/images/pokemon/4080.png differ diff --git a/public/images/pokemon/418.png b/public/images/pokemon/418.png index c24d87b0546..005c917463f 100644 Binary files a/public/images/pokemon/418.png and b/public/images/pokemon/418.png differ diff --git a/public/images/pokemon/419.png b/public/images/pokemon/419.png index 572172a72fe..572f819749b 100644 Binary files a/public/images/pokemon/419.png and b/public/images/pokemon/419.png differ diff --git a/public/images/pokemon/4199.png b/public/images/pokemon/4199.png index 57896fd3810..df9dee11cdb 100644 Binary files a/public/images/pokemon/4199.png and b/public/images/pokemon/4199.png differ diff --git a/public/images/pokemon/424.png b/public/images/pokemon/424.png index bee82d91557..d19a5a79e4a 100644 Binary files a/public/images/pokemon/424.png and b/public/images/pokemon/424.png differ diff --git a/public/images/pokemon/45.png b/public/images/pokemon/45.png index b97df83b717..db9c8d9c3f2 100644 Binary files a/public/images/pokemon/45.png and b/public/images/pokemon/45.png differ diff --git a/public/images/pokemon/456.png b/public/images/pokemon/456.png index 0562ec6022d..4b6c8c4e52f 100644 Binary files a/public/images/pokemon/456.png and b/public/images/pokemon/456.png differ diff --git a/public/images/pokemon/4562.png b/public/images/pokemon/4562.png index 90f765b6494..1165444cc50 100644 Binary files a/public/images/pokemon/4562.png and b/public/images/pokemon/4562.png differ diff --git a/public/images/pokemon/457.png b/public/images/pokemon/457.png index 2647dd800c4..6ee49243598 100644 Binary files a/public/images/pokemon/457.png and b/public/images/pokemon/457.png differ diff --git a/public/images/pokemon/467.png b/public/images/pokemon/467.png index f2fafb8d121..a22d045f925 100644 Binary files a/public/images/pokemon/467.png and b/public/images/pokemon/467.png differ diff --git a/public/images/pokemon/469.png b/public/images/pokemon/469.png index f598c8a3b8a..f9f9ea8af1a 100644 Binary files a/public/images/pokemon/469.png and b/public/images/pokemon/469.png differ diff --git a/public/images/pokemon/472.png b/public/images/pokemon/472.png index 56f3c91aa9b..cc13377bd53 100644 Binary files a/public/images/pokemon/472.png and b/public/images/pokemon/472.png differ diff --git a/public/images/pokemon/556.png b/public/images/pokemon/556.png index 0b78201effc..2fa67c09d55 100644 Binary files a/public/images/pokemon/556.png and b/public/images/pokemon/556.png differ diff --git a/public/images/pokemon/563.json b/public/images/pokemon/563.json index 81979d38c9e..666ec547d18 100644 --- a/public/images/pokemon/563.json +++ b/public/images/pokemon/563.json @@ -1,3485 +1,699 @@ -{ - "textures": [ - { - "image": "563.png", - "format": "RGBA8888", - "size": { - "w": 500, - "h": 500 - }, - "scale": 1, - "frames": [ - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 191, - "y": 366, - "w": 93, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 18, - "w": 73, - "h": 64 - }, - "frame": { - "x": 96, - "y": 436, - "w": 73, - "h": 64 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 28, - "y": 17, - "w": 52, - "h": 65 - }, - "frame": { - "x": 446, - "y": 0, - "w": 52, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 79 - }, - "frame": { - "x": 303, - "y": 140, - "w": 93, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 93, - "h": 77 - }, - "frame": { - "x": 286, - "y": 297, - "w": 93, - "h": 77 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 85, - "h": 73 - }, - "frame": { - "x": 284, - "y": 374, - "w": 85, - "h": 73 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 75, - "h": 79 - }, - "frame": { - "x": 396, - "y": 139, - "w": 75, - "h": 79 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 85, - "h": 79 - }, - "frame": { - "x": 384, - "y": 219, - "w": 85, - "h": 79 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 435, - "y": 365, - "w": 59, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 19, - "w": 66, - "h": 63 - }, - "frame": { - "x": 432, - "y": 72, - "w": 66, - "h": 63 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1c52466e8cdc83633a9fbd5b8675ca7:19652e451f806ac9b4bbb01e17b071df:12f3eae8283ab6c8e555ff3e46b7d8dc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0002.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0003.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0004.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0005.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0007.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0008.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0009.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0010.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0011.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0013.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0014.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0015.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0016.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0017.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0019.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0020.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0021.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0022.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0023.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0024.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0025.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0027.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0028.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0029.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0030.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0031.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0033.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0034.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0035.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0036.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0037.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0039.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0040.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0041.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0042.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0043.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0044.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0045.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0047.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0048.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0049.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0050.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0051.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0052.png", + "frame": { "x": 208, "y": 228, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0053.png", + "frame": { "x": 203, "y": 81, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 229, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0055.png", + "frame": { "x": 300, "y": 302, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 91, "h": 75 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0056.png", + "frame": { "x": 300, "y": 228, "w": 83, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 83, "h": 71 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0057.png", + "frame": { "x": 208, "y": 159, "w": 76, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 17, "w": 76, "h": 65 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0058.png", + "frame": { "x": 392, "y": 370, "w": 70, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 16, "w": 70, "h": 66 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0059.png", + "frame": { "x": 494, "y": 305, "w": 64, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 15, "w": 64, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0060.png", + "frame": { "x": 463, "y": 373, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 20, "w": 58, "h": 62 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0061.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0062.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0063.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 19, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0064.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0065.png", + "frame": { "x": 242, "y": 373, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 16, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 373, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0067.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0068.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0069.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 19, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0070.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0071.png", + "frame": { "x": 506, "y": 81, "w": 50, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 50, "h": 64 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0072.png", + "frame": { "x": 185, "y": 373, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 14, "w": 56, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0073.png", + "frame": { "x": 494, "y": 230, "w": 64, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 64, "h": 74 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0074.png", + "frame": { "x": 486, "y": 152, "w": 73, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 73, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 306, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 83, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0076.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0078.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0079.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0080.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0081.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0082.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0084.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0085.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0086.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "563.png", + "format": "I8", + "size": { "w": 559, "h": 441 }, + "scale": "1" + } } diff --git a/public/images/pokemon/563.png b/public/images/pokemon/563.png index 7135a54ca51..2834d54535e 100644 Binary files a/public/images/pokemon/563.png and b/public/images/pokemon/563.png differ diff --git a/public/images/pokemon/618.png b/public/images/pokemon/618.png index 6a1c2f8986a..9b2e3cae12d 100644 Binary files a/public/images/pokemon/618.png and b/public/images/pokemon/618.png differ diff --git a/public/images/pokemon/636.json b/public/images/pokemon/636.json index 86c639663e9..9626c6d8263 100644 --- a/public/images/pokemon/636.json +++ b/public/images/pokemon/636.json @@ -4,744 +4,51 @@ "image": "636.png", "format": "RGBA8888", "size": { - "w": 341, - "h": 341 + "w": 301, + "h": 301 }, "scale": 1, "frames": [ - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 50 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 100, - "w": 44, - "h": 50 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 150, - "w": 44, - "h": 50 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 200, - "w": 44, - "h": 50 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 250, - "w": 44, - "h": 50 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 45, - "y": 0, - "w": 44, - "h": 50 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 100, - "w": 44, - "h": 50 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 150, - "w": 44, - "h": 50 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 200, - "w": 44, - "h": 50 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 250, - "w": 44, - "h": 50 - } - }, { "filename": "0005.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 45, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0020.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 45, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 269, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 49, - "w": 45, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 + "w": 46, + "h": 48 } }, { @@ -749,545 +56,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 224, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 269, - "y": 49, - "w": 44, - "h": 50 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 134, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 88, - "y": 98, - "w": 44, - "h": 50 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 178, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 222, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 266, - "y": 99, - "w": 44, - "h": 50 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 132, - "y": 146, - "w": 44, - "h": 50 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 88, - "y": 148, - "w": 44, - "h": 50 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "w": 46, + "h": 48 } }, { @@ -1295,82 +77,103 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0067.png", + "filename": "0049.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0082.png", + "filename": "0060.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0116.png", + "filename": "0071.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, + "w": 46, + "h": 48 + }, + "frame": { + "x": 1, + "y": 51, + "w": 46, + "h": 48 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, "h": 49 }, "frame": { - "x": 132, - "y": 196, - "w": 44, + "x": 49, + "y": 1, + "w": 45, "h": 49 } }, @@ -1379,103 +182,40 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 88, - "y": 198, - "w": 44, + "x": 1, + "y": 101, + "w": 45, "h": 48 } }, { - "filename": "0033.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 101, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 220, - "y": 195, - "w": 44, "h": 48 } }, @@ -1484,40 +224,208 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, + "x": 1, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 220, - "y": 195, - "w": 44, + "x": 1, + "y": 101, + "w": 45, "h": 48 } }, { - "filename": "0055.png", + "filename": "0037.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, + "x": 1, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 220, - "y": 195, - "w": 44, + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, "h": 48 } }, @@ -1526,123 +434,102 @@ "rotated": false, "trimmed": true, "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, "w": 45, - "h": 50 + "h": 48 + }, + "frame": { + "x": 1, + "y": 151, + "w": 45, + "h": 48 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 0, "w": 44, - "h": 48 + "h": 49 }, "frame": { - "x": 220, - "y": 195, - "w": 44, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { "x": 1, - "y": 2, + "y": 201, "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 + "h": 49 } }, { - "filename": "0034.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, + "w": 44, + "h": 48 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 1, + "y": 252, + "w": 44, + "h": 48 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 1, + "y": 252, "w": 44, "h": 48 } @@ -1652,733 +539,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, "w": 44, "h": 48 } }, { - "filename": "0069.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, "w": 44, "h": 48 } }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 220, - "y": 243, - "w": 44, - "h": 48 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 176, - "y": 244, - "w": 44, - "h": 48 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 132, - "y": 245, - "w": 44, - "h": 48 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 246, - "w": 44, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, { "filename": "0062.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, + "x": 0, + "y": 1, "w": 44, - "h": 47 + "h": 48 }, "frame": { - "x": 132, - "y": 293, + "x": 1, + "y": 252, "w": 44, - "h": 47 + "h": 48 } }, { - "filename": "0013.png", + "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 2, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, "h": 47 }, "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "x": 49, + "y": 52, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, "h": 47 } }, @@ -2387,40 +623,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, { - "filename": "0043.png", + "filename": "0025.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, + "h": 47 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 49, + "y": 52, + "w": 45, + "h": 47 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, @@ -2429,61 +707,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, { - "filename": "0087.png", + "filename": "0084.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, + "x": 0, + "y": 0, "w": 44, + "h": 49 + }, + "frame": { + "x": 48, + "y": 101, + "w": 44, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, { - "filename": "0017.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, @@ -2492,83 +791,1112 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, { - "filename": "0061.png", + "filename": "0043.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 96, + "y": 51, + "w": 45, + "h": 47 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 96, + "y": 51, + "w": 45, + "h": 47 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 143, + "y": 1, + "w": 44, + "h": 49 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 189, + "y": 1, + "w": 45, + "h": 47 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 236, + "y": 1, + "w": 45, + "h": 47 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 94, + "y": 101, + "w": 43, + "h": 49 + } + }, { "filename": "0076.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 + "y": 0, + "w": 43, + "h": 49 }, "frame": { - "x": 264, - "y": 246, - "w": 44, - "h": 47 + "x": 139, + "y": 100, + "w": 43, + "h": 49 } }, { - "filename": "0091.png", + "filename": "0077.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 + "y": 0, + "w": 43, + "h": 49 }, "frame": { - "x": 264, - "y": 293, - "w": 44, - "h": 47 + "x": 184, + "y": 100, + "w": 43, + "h": 49 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 100, + "w": 43, + "h": 49 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 94, + "y": 152, + "w": 43, + "h": 49 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 139, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 184, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 47, + "y": 201, + "w": 42, + "h": 49 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 47, + "y": 252, + "w": 43, + "h": 48 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 139, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 184, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 92, + "y": 203, + "w": 43, + "h": 48 } } ] @@ -2577,6 +1905,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d74d016320d4e69be41021af2e23899d:84d9208986a6ccae41903e4853367cb7:1d471fa25be339df4c4184625fad00b3$" + "smartupdate": "$TexturePacker:SmartUpdate:a44c0ac06d9b3f225bf4ca6ae3326041:93ae31dcf0673c1e0be8d6dfea13f44f:1d471fa25be339df4c4184625fad00b3$" } } diff --git a/public/images/pokemon/636.png b/public/images/pokemon/636.png index e3780aaab83..24b296bcb9d 100644 Binary files a/public/images/pokemon/636.png and b/public/images/pokemon/636.png differ diff --git a/public/images/pokemon/669-blue.png b/public/images/pokemon/669-blue.png index de61d540bf7..5cdefbbae6b 100644 Binary files a/public/images/pokemon/669-blue.png and b/public/images/pokemon/669-blue.png differ diff --git a/public/images/pokemon/669-orange.png b/public/images/pokemon/669-orange.png index bffdc26aa6b..6d93c5b13b8 100644 Binary files a/public/images/pokemon/669-orange.png and b/public/images/pokemon/669-orange.png differ diff --git a/public/images/pokemon/669-red.png b/public/images/pokemon/669-red.png index 3d38e825271..02d89f59c31 100644 Binary files a/public/images/pokemon/669-red.png and b/public/images/pokemon/669-red.png differ diff --git a/public/images/pokemon/669-white.png b/public/images/pokemon/669-white.png index 857381b9d4e..b815b86c5f5 100644 Binary files a/public/images/pokemon/669-white.png and b/public/images/pokemon/669-white.png differ diff --git a/public/images/pokemon/669-yellow.png b/public/images/pokemon/669-yellow.png index d5250295349..517406798e7 100644 Binary files a/public/images/pokemon/669-yellow.png and b/public/images/pokemon/669-yellow.png differ diff --git a/public/images/pokemon/670-blue.png b/public/images/pokemon/670-blue.png index 5a95af3a85d..b70ec5532f9 100644 Binary files a/public/images/pokemon/670-blue.png and b/public/images/pokemon/670-blue.png differ diff --git a/public/images/pokemon/670-orange.png b/public/images/pokemon/670-orange.png index e8b56898504..9beb7d884d5 100644 Binary files a/public/images/pokemon/670-orange.png and b/public/images/pokemon/670-orange.png differ diff --git a/public/images/pokemon/670-red.png b/public/images/pokemon/670-red.png index aa0bfc0bfdc..9452ba90968 100644 Binary files a/public/images/pokemon/670-red.png and b/public/images/pokemon/670-red.png differ diff --git a/public/images/pokemon/670-white.png b/public/images/pokemon/670-white.png index d93fdf98c12..dba946ff47a 100644 Binary files a/public/images/pokemon/670-white.png and b/public/images/pokemon/670-white.png differ diff --git a/public/images/pokemon/670-yellow.png b/public/images/pokemon/670-yellow.png index 019a618ed1a..2d028fe5b1a 100644 Binary files a/public/images/pokemon/670-yellow.png and b/public/images/pokemon/670-yellow.png differ diff --git a/public/images/pokemon/671-blue.png b/public/images/pokemon/671-blue.png index 3f236de8367..ccbd88bb0b8 100644 Binary files a/public/images/pokemon/671-blue.png and b/public/images/pokemon/671-blue.png differ diff --git a/public/images/pokemon/671-orange.png b/public/images/pokemon/671-orange.png index 863c863eb63..a99b8302e76 100644 Binary files a/public/images/pokemon/671-orange.png and b/public/images/pokemon/671-orange.png differ diff --git a/public/images/pokemon/671-red.png b/public/images/pokemon/671-red.png index 952b5b5c52f..460dafd4cc1 100644 Binary files a/public/images/pokemon/671-red.png and b/public/images/pokemon/671-red.png differ diff --git a/public/images/pokemon/671-white.png b/public/images/pokemon/671-white.png index 236262ef9ad..3d6f0d841b8 100644 Binary files a/public/images/pokemon/671-white.png and b/public/images/pokemon/671-white.png differ diff --git a/public/images/pokemon/671-yellow.png b/public/images/pokemon/671-yellow.png index 083939cdb54..650e8db7a35 100644 Binary files a/public/images/pokemon/671-yellow.png and b/public/images/pokemon/671-yellow.png differ diff --git a/public/images/pokemon/677.png b/public/images/pokemon/677.png index 50272316478..d0ebc245b32 100644 Binary files a/public/images/pokemon/677.png and b/public/images/pokemon/677.png differ diff --git a/public/images/pokemon/678-female.png b/public/images/pokemon/678-female.png index 34752640e4e..73abb68900a 100644 Binary files a/public/images/pokemon/678-female.png and b/public/images/pokemon/678-female.png differ diff --git a/public/images/pokemon/678.png b/public/images/pokemon/678.png index fc62b70c410..7846bebd294 100644 Binary files a/public/images/pokemon/678.png and b/public/images/pokemon/678.png differ diff --git a/public/images/pokemon/698.png b/public/images/pokemon/698.png index 58944c3501c..81c7b03e375 100644 Binary files a/public/images/pokemon/698.png and b/public/images/pokemon/698.png differ diff --git a/public/images/pokemon/699.png b/public/images/pokemon/699.png index 43de5e1b564..c8b7dda83ba 100644 Binary files a/public/images/pokemon/699.png and b/public/images/pokemon/699.png differ diff --git a/public/images/pokemon/702.png b/public/images/pokemon/702.png index 34da65b9c50..0e3daf90889 100644 Binary files a/public/images/pokemon/702.png and b/public/images/pokemon/702.png differ diff --git a/public/images/pokemon/80-mega.png b/public/images/pokemon/80-mega.png index bc640c5ce61..42aed7b3c66 100644 Binary files a/public/images/pokemon/80-mega.png and b/public/images/pokemon/80-mega.png differ diff --git a/public/images/pokemon/80.png b/public/images/pokemon/80.png index 10259c7a6f3..c6120f8b0b1 100644 Binary files a/public/images/pokemon/80.png and b/public/images/pokemon/80.png differ diff --git a/public/images/pokemon/802-zenith.png b/public/images/pokemon/802-zenith.png index b6db4621a0b..17d2831a50c 100644 Binary files a/public/images/pokemon/802-zenith.png and b/public/images/pokemon/802-zenith.png differ diff --git a/public/images/pokemon/867.png b/public/images/pokemon/867.png index 6712f398dfa..2fe8856d74d 100644 Binary files a/public/images/pokemon/867.png and b/public/images/pokemon/867.png differ diff --git a/public/images/pokemon/881.png b/public/images/pokemon/881.png index 8a0c9a0d180..01cc12c00dd 100644 Binary files a/public/images/pokemon/881.png and b/public/images/pokemon/881.png differ diff --git a/public/images/pokemon/912.png b/public/images/pokemon/912.png index dd296d8d863..60b288d350e 100644 Binary files a/public/images/pokemon/912.png and b/public/images/pokemon/912.png differ diff --git a/public/images/pokemon/913.png b/public/images/pokemon/913.png index fc4beaaa549..7baef852807 100644 Binary files a/public/images/pokemon/913.png and b/public/images/pokemon/913.png differ diff --git a/public/images/pokemon/914.png b/public/images/pokemon/914.png index 5c934808f13..a2a89748c90 100644 Binary files a/public/images/pokemon/914.png and b/public/images/pokemon/914.png differ diff --git a/public/images/pokemon/940.png b/public/images/pokemon/940.png index 9e2d44e516f..f35482bb36a 100644 Binary files a/public/images/pokemon/940.png and b/public/images/pokemon/940.png differ diff --git a/public/images/pokemon/941.png b/public/images/pokemon/941.png index f63a495f647..417d7923296 100644 Binary files a/public/images/pokemon/941.png and b/public/images/pokemon/941.png differ diff --git a/public/images/pokemon/981.png b/public/images/pokemon/981.png index 33f696637cc..ff66259c58d 100644 Binary files a/public/images/pokemon/981.png and b/public/images/pokemon/981.png differ diff --git a/public/images/pokemon/back/1003.png b/public/images/pokemon/back/1003.png index 26f6238fb2f..77ece80dcc9 100644 Binary files a/public/images/pokemon/back/1003.png and b/public/images/pokemon/back/1003.png differ diff --git a/public/images/pokemon/back/1006.png b/public/images/pokemon/back/1006.png index eefebdce39b..527665e6ec1 100644 Binary files a/public/images/pokemon/back/1006.png and b/public/images/pokemon/back/1006.png differ diff --git a/public/images/pokemon/back/126.png b/public/images/pokemon/back/126.png index 77eafe5af27..4b65d1323c8 100644 Binary files a/public/images/pokemon/back/126.png and b/public/images/pokemon/back/126.png differ diff --git a/public/images/pokemon/back/159.png b/public/images/pokemon/back/159.png index ebfcccbfe60..710014bf180 100644 Binary files a/public/images/pokemon/back/159.png and b/public/images/pokemon/back/159.png differ diff --git a/public/images/pokemon/back/178.png b/public/images/pokemon/back/178.png index 18c19e80d68..34b837f5082 100644 Binary files a/public/images/pokemon/back/178.png and b/public/images/pokemon/back/178.png differ diff --git a/public/images/pokemon/back/186.json b/public/images/pokemon/back/186.json index 692fa44fcb4..cc95a3819ea 100644 --- a/public/images/pokemon/back/186.json +++ b/public/images/pokemon/back/186.json @@ -1,2036 +1,712 @@ { - "textures": [ - { - "image": "186.png", - "format": "RGBA8888", - "size": { - "w": 329, - "h": 329 - }, - "scale": 1, - "frames": [ - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 75 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 75 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 0, - "y": 146, - "w": 40, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 43, - "h": 45 - }, - "frame": { - "x": 0, - "y": 283, - "w": 43, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 81, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 161, - "y": 64, - "w": 41, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 22, - "w": 40, - "h": 56 - }, - "frame": { - "x": 124, - "y": 122, - "w": 40, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 56 - }, - "frame": { - "x": 164, - "y": 120, - "w": 40, - "h": 56 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 202, - "y": 64, - "w": 40, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 208, - "y": 277, - "w": 40, - "h": 52 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 40, - "h": 51 - }, - "frame": { - "x": 248, - "y": 277, - "w": 40, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:569ea621d956c206da79e28dfe2f2447:f1450a5308004ae8dfd8b74920b34436:2e42f825bd325ece9bcbe5d573264582$" - } -} + "textures":[ + { + "image": "186.png", + "format": "RGBA8888", + "size": { "w": 164, "h": 264 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/back/186.png b/public/images/pokemon/back/186.png index 1192a7efe20..e6af67d75fa 100644 Binary files a/public/images/pokemon/back/186.png and b/public/images/pokemon/back/186.png differ diff --git a/public/images/pokemon/back/190.png b/public/images/pokemon/back/190.png index 7b375c8782c..bc4a5eee405 100644 Binary files a/public/images/pokemon/back/190.png and b/public/images/pokemon/back/190.png differ diff --git a/public/images/pokemon/back/199.png b/public/images/pokemon/back/199.png index e9be1e25542..099dffb2a61 100644 Binary files a/public/images/pokemon/back/199.png and b/public/images/pokemon/back/199.png differ diff --git a/public/images/pokemon/back/2028.png b/public/images/pokemon/back/2028.png index e810af77abb..722fb3698bf 100644 Binary files a/public/images/pokemon/back/2028.png and b/public/images/pokemon/back/2028.png differ diff --git a/public/images/pokemon/back/256.png b/public/images/pokemon/back/256.png index 4aafe572220..86f771dee3f 100644 Binary files a/public/images/pokemon/back/256.png and b/public/images/pokemon/back/256.png differ diff --git a/public/images/pokemon/back/257-mega.png b/public/images/pokemon/back/257-mega.png index 5fbb89adebc..1222c1cf8e2 100644 Binary files a/public/images/pokemon/back/257-mega.png and b/public/images/pokemon/back/257-mega.png differ diff --git a/public/images/pokemon/back/257.png b/public/images/pokemon/back/257.png index 8906fea139c..cc319ea4841 100644 Binary files a/public/images/pokemon/back/257.png and b/public/images/pokemon/back/257.png differ diff --git a/public/images/pokemon/back/261.png b/public/images/pokemon/back/261.png index 8b1d3f51ef9..ce8d9579465 100644 Binary files a/public/images/pokemon/back/261.png and b/public/images/pokemon/back/261.png differ diff --git a/public/images/pokemon/back/262.png b/public/images/pokemon/back/262.png index 4561b2715d1..e1c7a26e2e8 100644 Binary files a/public/images/pokemon/back/262.png and b/public/images/pokemon/back/262.png differ diff --git a/public/images/pokemon/back/394.png b/public/images/pokemon/back/394.png index 83f72f517b9..cded0dbb0ec 100644 Binary files a/public/images/pokemon/back/394.png and b/public/images/pokemon/back/394.png differ diff --git a/public/images/pokemon/back/395.png b/public/images/pokemon/back/395.png index d19831ef448..877b3e352a4 100644 Binary files a/public/images/pokemon/back/395.png and b/public/images/pokemon/back/395.png differ diff --git a/public/images/pokemon/back/4080.png b/public/images/pokemon/back/4080.png index c715b63f10b..ce3c9cbd3f5 100644 Binary files a/public/images/pokemon/back/4080.png and b/public/images/pokemon/back/4080.png differ diff --git a/public/images/pokemon/back/418.png b/public/images/pokemon/back/418.png index a596e3e4a64..5d2cf6c1368 100644 Binary files a/public/images/pokemon/back/418.png and b/public/images/pokemon/back/418.png differ diff --git a/public/images/pokemon/back/419.png b/public/images/pokemon/back/419.png index fb093ddd9df..6ece4983987 100644 Binary files a/public/images/pokemon/back/419.png and b/public/images/pokemon/back/419.png differ diff --git a/public/images/pokemon/back/4199.png b/public/images/pokemon/back/4199.png index 4e68be3e319..1b45a0c2016 100644 Binary files a/public/images/pokemon/back/4199.png and b/public/images/pokemon/back/4199.png differ diff --git a/public/images/pokemon/back/424.png b/public/images/pokemon/back/424.png index 7708055c6f2..76bc69d20e8 100644 Binary files a/public/images/pokemon/back/424.png and b/public/images/pokemon/back/424.png differ diff --git a/public/images/pokemon/back/456.png b/public/images/pokemon/back/456.png index d8512337995..74d21eee031 100644 Binary files a/public/images/pokemon/back/456.png and b/public/images/pokemon/back/456.png differ diff --git a/public/images/pokemon/back/4562.png b/public/images/pokemon/back/4562.png index 37878a19128..6bbbf07ebdc 100644 Binary files a/public/images/pokemon/back/4562.png and b/public/images/pokemon/back/4562.png differ diff --git a/public/images/pokemon/back/457.png b/public/images/pokemon/back/457.png index 5d8c3758315..239b235e7bd 100644 Binary files a/public/images/pokemon/back/457.png and b/public/images/pokemon/back/457.png differ diff --git a/public/images/pokemon/back/467.png b/public/images/pokemon/back/467.png index 3c5627906ff..0073f964ade 100644 Binary files a/public/images/pokemon/back/467.png and b/public/images/pokemon/back/467.png differ diff --git a/public/images/pokemon/back/469.png b/public/images/pokemon/back/469.png index e1c0fe49753..f55bdd8f25f 100644 Binary files a/public/images/pokemon/back/469.png and b/public/images/pokemon/back/469.png differ diff --git a/public/images/pokemon/back/472.png b/public/images/pokemon/back/472.png index 223e43838d9..af5bfd64473 100644 Binary files a/public/images/pokemon/back/472.png and b/public/images/pokemon/back/472.png differ diff --git a/public/images/pokemon/back/556.png b/public/images/pokemon/back/556.png index 22fd024c5f1..aeab696307a 100644 Binary files a/public/images/pokemon/back/556.png and b/public/images/pokemon/back/556.png differ diff --git a/public/images/pokemon/back/618.png b/public/images/pokemon/back/618.png index 9cbb818790c..a3bc75aa00e 100644 Binary files a/public/images/pokemon/back/618.png and b/public/images/pokemon/back/618.png differ diff --git a/public/images/pokemon/back/699.png b/public/images/pokemon/back/699.png index 028696af971..d24d2ad0a73 100644 Binary files a/public/images/pokemon/back/699.png and b/public/images/pokemon/back/699.png differ diff --git a/public/images/pokemon/back/700.png b/public/images/pokemon/back/700.png index cfd4063921b..229c786c67e 100644 Binary files a/public/images/pokemon/back/700.png and b/public/images/pokemon/back/700.png differ diff --git a/public/images/pokemon/back/702.png b/public/images/pokemon/back/702.png index a22163a1cf6..9b375837be3 100644 Binary files a/public/images/pokemon/back/702.png and b/public/images/pokemon/back/702.png differ diff --git a/public/images/pokemon/back/71.json b/public/images/pokemon/back/71.json index b3f5a0792db..195188d13e7 100644 --- a/public/images/pokemon/back/71.json +++ b/public/images/pokemon/back/71.json @@ -1,1532 +1,306 @@ { - "textures": [ - { - "image": "71.png", - "format": "RGBA8888", - "size": { - "w": 333, - "h": 333 - }, - "scale": 1, - "frames": [ - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:751712009fd74222715d70b43a4283e8:5955b5b390b7b5ccf4dce1abfcc58af2:699363ed1732140836e97f90bcfd26b2$" - } + "textures": + [ + { + "image": "71.png", + "format": "RGB8888", + "size": { "w": 338, + "h": 269 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 272, "y": 0, "w": 66, "h": 68 } + }, + { + "filename": "0002.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 272, "y": 0, "w": 66, "h": 68 } + }, + { + "filename": "0003.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 0, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0004.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 0, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0005.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 128, "y": 136, "w": 64, "h": 67 } + }, + { + "filename": "0006.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 128, "y": 136, "w": 64, "h": 67 } + }, + { + "filename": "0007.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 263, "y": 135, "w": 64, "h": 68 } + }, + { + "filename": "0008.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 263, "y": 135, "w": 64, "h": 68 } + }, + { + "filename": "0009.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 128, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0010.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 128, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0011.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 65, "h": 67 }, + "frame": { "x": 198, "y": 135, "w": 65, "h": 67 } + }, + { + "filename": "0012.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 65, "h": 67 }, + "frame": { "x": 198, "y": 135, "w": 65, "h": 67 } + }, + { + "filename": "0013.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 198, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0014.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 198, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0015.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 0, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0016.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 0, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0017.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 68, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0018.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 68, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0019.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 136, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0020.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 136, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0021.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 204, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0022.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 204, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0023.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 264, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0024.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 264, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0025.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 0, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0026.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 0, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0027.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 256, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0028.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 256, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0029.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 64, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0030.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 64, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0031.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 192, "y": 202, "w": 64, "h": 67 } + }, + { + "filename": "0032.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 192, "y": 202, "w": 64, "h": 67 } + }, + { + "filename": "0033.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 66, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0034.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 66, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0035.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 132, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0036.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 132, "y": 68, "w": 66, "h": 68 }} + ], + + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } } +] +} \ No newline at end of file diff --git a/public/images/pokemon/back/71.png b/public/images/pokemon/back/71.png index 3e3424c865e..24a546f6166 100644 Binary files a/public/images/pokemon/back/71.png and b/public/images/pokemon/back/71.png differ diff --git a/public/images/pokemon/back/80-mega.png b/public/images/pokemon/back/80-mega.png index e77a7dc44f1..5bc773e3475 100644 Binary files a/public/images/pokemon/back/80-mega.png and b/public/images/pokemon/back/80-mega.png differ diff --git a/public/images/pokemon/back/80.png b/public/images/pokemon/back/80.png index 5be43d7187a..25b7f5fff9c 100644 Binary files a/public/images/pokemon/back/80.png and b/public/images/pokemon/back/80.png differ diff --git a/public/images/pokemon/back/802-zenith.png b/public/images/pokemon/back/802-zenith.png index 4158e0c1ed2..e38e295be75 100644 Binary files a/public/images/pokemon/back/802-zenith.png and b/public/images/pokemon/back/802-zenith.png differ diff --git a/public/images/pokemon/back/821.png b/public/images/pokemon/back/821.png index a102a0491de..24e0edd705d 100644 Binary files a/public/images/pokemon/back/821.png and b/public/images/pokemon/back/821.png differ diff --git a/public/images/pokemon/back/867.png b/public/images/pokemon/back/867.png index dc7a48ff4e9..ae631607ef2 100644 Binary files a/public/images/pokemon/back/867.png and b/public/images/pokemon/back/867.png differ diff --git a/public/images/pokemon/back/880.png b/public/images/pokemon/back/880.png index 15bbd0f9525..a82239996bc 100644 Binary files a/public/images/pokemon/back/880.png and b/public/images/pokemon/back/880.png differ diff --git a/public/images/pokemon/back/881.png b/public/images/pokemon/back/881.png index 8fe28c2a9dd..852453aaaa0 100644 Binary files a/public/images/pokemon/back/881.png and b/public/images/pokemon/back/881.png differ diff --git a/public/images/pokemon/back/882.png b/public/images/pokemon/back/882.png index 3ab462c25c5..cb05d6c5a91 100644 Binary files a/public/images/pokemon/back/882.png and b/public/images/pokemon/back/882.png differ diff --git a/public/images/pokemon/back/913.png b/public/images/pokemon/back/913.png index e76d9ebd80e..0935def3821 100644 Binary files a/public/images/pokemon/back/913.png and b/public/images/pokemon/back/913.png differ diff --git a/public/images/pokemon/back/914.png b/public/images/pokemon/back/914.png index 52d409c3f2d..7e87e0cc60e 100644 Binary files a/public/images/pokemon/back/914.png and b/public/images/pokemon/back/914.png differ diff --git a/public/images/pokemon/back/981.png b/public/images/pokemon/back/981.png index edda3d89919..38b1a715f69 100644 Binary files a/public/images/pokemon/back/981.png and b/public/images/pokemon/back/981.png differ diff --git a/public/images/pokemon/back/female/178.png b/public/images/pokemon/back/female/178.png index b6b1aa908d8..bf4e727088f 100644 Binary files a/public/images/pokemon/back/female/178.png and b/public/images/pokemon/back/female/178.png differ diff --git a/public/images/pokemon/back/female/186.json b/public/images/pokemon/back/female/186.json index e7fb46aacbb..cc95a3819ea 100644 --- a/public/images/pokemon/back/female/186.json +++ b/public/images/pokemon/back/female/186.json @@ -1,2036 +1,712 @@ { - "textures": [ - { - "image": "186.png", - "format": "RGBA8888", - "size": { - "w": 329, - "h": 329 - }, - "scale": 1, - "frames": [ - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 75 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 75 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 0, - "y": 146, - "w": 40, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 43, - "h": 45 - }, - "frame": { - "x": 0, - "y": 283, - "w": 43, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 81, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 161, - "y": 64, - "w": 41, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 22, - "w": 40, - "h": 56 - }, - "frame": { - "x": 124, - "y": 122, - "w": 40, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 56 - }, - "frame": { - "x": 164, - "y": 120, - "w": 40, - "h": 56 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 202, - "y": 64, - "w": 40, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 208, - "y": 277, - "w": 40, - "h": 52 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 40, - "h": 51 - }, - "frame": { - "x": 248, - "y": 277, - "w": 40, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e783e29253c9ef760ff5a12ced054a0f:ee321b7b0e31ea09eef99c67e0124e50:2e42f825bd325ece9bcbe5d573264582$" - } -} + "textures":[ + { + "image": "186.png", + "format": "RGBA8888", + "size": { "w": 164, "h": 264 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/back/female/186.png b/public/images/pokemon/back/female/186.png index 22437991c8f..2156157cf8d 100644 Binary files a/public/images/pokemon/back/female/186.png and b/public/images/pokemon/back/female/186.png differ diff --git a/public/images/pokemon/back/female/190.png b/public/images/pokemon/back/female/190.png index 5feb07b0620..68b0624d213 100644 Binary files a/public/images/pokemon/back/female/190.png and b/public/images/pokemon/back/female/190.png differ diff --git a/public/images/pokemon/back/female/256.png b/public/images/pokemon/back/female/256.png index 750acd33ade..6b6f7b97b7c 100644 Binary files a/public/images/pokemon/back/female/256.png and b/public/images/pokemon/back/female/256.png differ diff --git a/public/images/pokemon/back/female/257.png b/public/images/pokemon/back/female/257.png index fd3b32752bf..0b93d07d99e 100644 Binary files a/public/images/pokemon/back/female/257.png and b/public/images/pokemon/back/female/257.png differ diff --git a/public/images/pokemon/back/female/418.png b/public/images/pokemon/back/female/418.png index 38be9bb18fb..14c1eee1a63 100644 Binary files a/public/images/pokemon/back/female/418.png and b/public/images/pokemon/back/female/418.png differ diff --git a/public/images/pokemon/back/female/419.png b/public/images/pokemon/back/female/419.png index 1f81caedbc5..9c757d2faba 100644 Binary files a/public/images/pokemon/back/female/419.png and b/public/images/pokemon/back/female/419.png differ diff --git a/public/images/pokemon/back/female/424.png b/public/images/pokemon/back/female/424.png index 8c5fe40d2df..b05fbcf8a19 100644 Binary files a/public/images/pokemon/back/female/424.png and b/public/images/pokemon/back/female/424.png differ diff --git a/public/images/pokemon/back/female/456.png b/public/images/pokemon/back/female/456.png index a830a9a7213..dd326cb32f1 100644 Binary files a/public/images/pokemon/back/female/456.png and b/public/images/pokemon/back/female/456.png differ diff --git a/public/images/pokemon/back/female/457.png b/public/images/pokemon/back/female/457.png index d4090cf197e..04e1ae12ff4 100644 Binary files a/public/images/pokemon/back/female/457.png and b/public/images/pokemon/back/female/457.png differ diff --git a/public/images/pokemon/back/shiny/1003.png b/public/images/pokemon/back/shiny/1003.png index 4c9cc4a578d..6ebce339091 100644 Binary files a/public/images/pokemon/back/shiny/1003.png and b/public/images/pokemon/back/shiny/1003.png differ diff --git a/public/images/pokemon/back/shiny/178.png b/public/images/pokemon/back/shiny/178.png index 28603814a9c..4ea3e7ea3be 100644 Binary files a/public/images/pokemon/back/shiny/178.png and b/public/images/pokemon/back/shiny/178.png differ diff --git a/public/images/pokemon/back/shiny/186.json b/public/images/pokemon/back/shiny/186.json index 2c92bca3f25..cc95a3819ea 100644 --- a/public/images/pokemon/back/shiny/186.json +++ b/public/images/pokemon/back/shiny/186.json @@ -1,2036 +1,712 @@ { - "textures": [ - { - "image": "186.png", - "format": "RGBA8888", - "size": { - "w": 329, - "h": 329 - }, - "scale": 1, - "frames": [ - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 75 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 75 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 0, - "y": 146, - "w": 40, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 43, - "h": 45 - }, - "frame": { - "x": 0, - "y": 283, - "w": 43, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 81, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 161, - "y": 64, - "w": 41, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 22, - "w": 40, - "h": 56 - }, - "frame": { - "x": 124, - "y": 122, - "w": 40, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 56 - }, - "frame": { - "x": 164, - "y": 120, - "w": 40, - "h": 56 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 202, - "y": 64, - "w": 40, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 208, - "y": 277, - "w": 40, - "h": 52 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 40, - "h": 51 - }, - "frame": { - "x": 248, - "y": 277, - "w": 40, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b0fe8f842c4145dc8b788d0827cf5633:3022c0d409f271d6c7f77fb00af76bd8:2e42f825bd325ece9bcbe5d573264582$" - } -} + "textures":[ + { + "image": "186.png", + "format": "RGBA8888", + "size": { "w": 164, "h": 264 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/back/shiny/186.png b/public/images/pokemon/back/shiny/186.png index 8c49b0ea7d6..336c3727346 100644 Binary files a/public/images/pokemon/back/shiny/186.png and b/public/images/pokemon/back/shiny/186.png differ diff --git a/public/images/pokemon/back/shiny/190.png b/public/images/pokemon/back/shiny/190.png index 251b136df42..cdbf2611180 100644 Binary files a/public/images/pokemon/back/shiny/190.png and b/public/images/pokemon/back/shiny/190.png differ diff --git a/public/images/pokemon/back/shiny/257-mega.png b/public/images/pokemon/back/shiny/257-mega.png index 8b61ee96049..40eb7a61bb5 100644 Binary files a/public/images/pokemon/back/shiny/257-mega.png and b/public/images/pokemon/back/shiny/257-mega.png differ diff --git a/public/images/pokemon/back/shiny/261.png b/public/images/pokemon/back/shiny/261.png index 7beb4730a49..a43f3d73f76 100644 Binary files a/public/images/pokemon/back/shiny/261.png and b/public/images/pokemon/back/shiny/261.png differ diff --git a/public/images/pokemon/back/shiny/262.png b/public/images/pokemon/back/shiny/262.png index 1599170a4ef..afcc2c8bfe6 100644 Binary files a/public/images/pokemon/back/shiny/262.png and b/public/images/pokemon/back/shiny/262.png differ diff --git a/public/images/pokemon/back/shiny/4080.png b/public/images/pokemon/back/shiny/4080.png index 6500b325862..2c8d85fa5d7 100644 Binary files a/public/images/pokemon/back/shiny/4080.png and b/public/images/pokemon/back/shiny/4080.png differ diff --git a/public/images/pokemon/back/shiny/424.png b/public/images/pokemon/back/shiny/424.png index d646d600665..67675146686 100644 Binary files a/public/images/pokemon/back/shiny/424.png and b/public/images/pokemon/back/shiny/424.png differ diff --git a/public/images/pokemon/back/shiny/469.png b/public/images/pokemon/back/shiny/469.png index 2fc41e311f6..8ac1f32335d 100644 Binary files a/public/images/pokemon/back/shiny/469.png and b/public/images/pokemon/back/shiny/469.png differ diff --git a/public/images/pokemon/back/shiny/556.png b/public/images/pokemon/back/shiny/556.png index d6c993a5caa..4f2e991b010 100644 Binary files a/public/images/pokemon/back/shiny/556.png and b/public/images/pokemon/back/shiny/556.png differ diff --git a/public/images/pokemon/back/shiny/698.png b/public/images/pokemon/back/shiny/698.png index 5a61053b12d..22f9b2b660d 100644 Binary files a/public/images/pokemon/back/shiny/698.png and b/public/images/pokemon/back/shiny/698.png differ diff --git a/public/images/pokemon/back/shiny/699.png b/public/images/pokemon/back/shiny/699.png index 76356f9f806..58bd840f1e3 100644 Binary files a/public/images/pokemon/back/shiny/699.png and b/public/images/pokemon/back/shiny/699.png differ diff --git a/public/images/pokemon/back/shiny/71.json b/public/images/pokemon/back/shiny/71.json index d40924360b0..7407c0befe1 100644 --- a/public/images/pokemon/back/shiny/71.json +++ b/public/images/pokemon/back/shiny/71.json @@ -1,1532 +1,306 @@ { - "textures": [ - { - "image": "71.png", - "format": "RGBA8888", - "size": { - "w": 333, - "h": 333 - }, - "scale": 1, - "frames": [ - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f8d42fbc7e4634a1aafab7a9441fe58f:13cd2160ec05982d017bab80e7a8b69a:699363ed1732140836e97f90bcfd26b2$" - } -} + "textures": + [ + { + "image": "71.png", + "format": "RGB8888", + "size": { "w": 338, + "h": 269 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 272, "y": 0, "w": 66, "h": 68 } + }, + { + "filename": "0002.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 272, "y": 0, "w": 66, "h": 68 } + }, + { + "filename": "0003.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 0, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0004.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 0, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0005.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 128, "y": 136, "w": 64, "h": 67 } + }, + { + "filename": "0006.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 128, "y": 136, "w": 64, "h": 67 } + }, + { + "filename": "0007.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 263, "y": 135, "w": 64, "h": 68 } + }, + { + "filename": "0008.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 263, "y": 135, "w": 64, "h": 68 } + }, + { + "filename": "0009.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 128, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0010.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 128, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0011.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 65, "h": 67 }, + "frame": { "x": 198, "y": 135, "w": 65, "h": 67 } + }, + { + "filename": "0012.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 65, "h": 67 }, + "frame": { "x": 198, "y": 135, "w": 65, "h": 67 } + }, + { + "filename": "0013.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 198, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0014.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 198, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0015.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 0, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0016.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 0, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0017.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 68, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0018.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 68, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0019.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 136, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0020.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 136, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0021.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 204, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0022.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 204, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0023.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 264, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0024.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 264, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0025.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 0, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0026.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 0, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0027.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 256, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0028.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 256, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0029.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 64, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0030.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 64, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0031.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 192, "y": 202, "w": 64, "h": 67 } + }, + { + "filename": "0032.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 192, "y": 202, "w": 64, "h": 67 } + }, + { + "filename": "0033.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 66, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0034.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 66, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0035.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 132, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0036.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 132, "y": 68, "w": 66, "h": 68 }} + ], + + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } + } + ] + } \ No newline at end of file diff --git a/public/images/pokemon/back/shiny/71.png b/public/images/pokemon/back/shiny/71.png index 03244865da7..99663f744ac 100644 Binary files a/public/images/pokemon/back/shiny/71.png and b/public/images/pokemon/back/shiny/71.png differ diff --git a/public/images/pokemon/back/shiny/715.png b/public/images/pokemon/back/shiny/715.png index e71e12f7445..dfd07126e59 100644 Binary files a/public/images/pokemon/back/shiny/715.png and b/public/images/pokemon/back/shiny/715.png differ diff --git a/public/images/pokemon/back/shiny/774.json b/public/images/pokemon/back/shiny/774.json index cabd0eb027b..7643e0ccc87 100644 --- a/public/images/pokemon/back/shiny/774.json +++ b/public/images/pokemon/back/shiny/774.json @@ -1,41 +1,41 @@ -{ - "textures": [ - { - "image": "774.png", - "format": "RGBA8888", - "size": { - "w": 37, - "h": 37 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fa61a53a0684a1d00e0ed5d6737743af:3e6463caf33bbb58cfba4bd9c20890aa:37281ac0aa1e619ef385b889b64064b7$" - } -} +{ + "textures": [ + { + "image": "774.png", + "format": "RGBA8888", + "size": { + "w": 37, + "h": 37 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 37, + "h": 37 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 37 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$" + } +} diff --git a/public/images/pokemon/back/shiny/774.png b/public/images/pokemon/back/shiny/774.png index 3f91ba876a4..6f93da7a00d 100644 Binary files a/public/images/pokemon/back/shiny/774.png and b/public/images/pokemon/back/shiny/774.png differ diff --git a/public/images/pokemon/back/shiny/80-mega.png b/public/images/pokemon/back/shiny/80-mega.png index 404b5642f5d..6c508034c3e 100644 Binary files a/public/images/pokemon/back/shiny/80-mega.png and b/public/images/pokemon/back/shiny/80-mega.png differ diff --git a/public/images/pokemon/back/shiny/80.png b/public/images/pokemon/back/shiny/80.png index c14b3bacc95..68e3d526965 100644 Binary files a/public/images/pokemon/back/shiny/80.png and b/public/images/pokemon/back/shiny/80.png differ diff --git a/public/images/pokemon/back/shiny/802-zenith.png b/public/images/pokemon/back/shiny/802-zenith.png index 4158e0c1ed2..8e71dd7c762 100644 Binary files a/public/images/pokemon/back/shiny/802-zenith.png and b/public/images/pokemon/back/shiny/802-zenith.png differ diff --git a/public/images/pokemon/back/shiny/821.png b/public/images/pokemon/back/shiny/821.png index 200489518c4..6d29988ed9f 100644 Binary files a/public/images/pokemon/back/shiny/821.png and b/public/images/pokemon/back/shiny/821.png differ diff --git a/public/images/pokemon/back/shiny/867.png b/public/images/pokemon/back/shiny/867.png index fce3fe4e37e..accb87844f1 100644 Binary files a/public/images/pokemon/back/shiny/867.png and b/public/images/pokemon/back/shiny/867.png differ diff --git a/public/images/pokemon/back/shiny/913.png b/public/images/pokemon/back/shiny/913.png index 1d5c17d66f2..d57246f3565 100644 Binary files a/public/images/pokemon/back/shiny/913.png and b/public/images/pokemon/back/shiny/913.png differ diff --git a/public/images/pokemon/back/shiny/914.png b/public/images/pokemon/back/shiny/914.png index 9931131bee4..f22947be030 100644 Binary files a/public/images/pokemon/back/shiny/914.png and b/public/images/pokemon/back/shiny/914.png differ diff --git a/public/images/pokemon/back/shiny/981.png b/public/images/pokemon/back/shiny/981.png index 9cc3f57cadb..b89fa6b1629 100644 Binary files a/public/images/pokemon/back/shiny/981.png and b/public/images/pokemon/back/shiny/981.png differ diff --git a/public/images/pokemon/back/shiny/982-three-segment.png b/public/images/pokemon/back/shiny/982-three-segment.png index 13d150bcdc7..11f855f9366 100644 Binary files a/public/images/pokemon/back/shiny/982-three-segment.png and b/public/images/pokemon/back/shiny/982-three-segment.png differ diff --git a/public/images/pokemon/back/shiny/982.png b/public/images/pokemon/back/shiny/982.png index df537fd151c..3f72e2a644f 100644 Binary files a/public/images/pokemon/back/shiny/982.png and b/public/images/pokemon/back/shiny/982.png differ diff --git a/public/images/pokemon/back/shiny/female/178.png b/public/images/pokemon/back/shiny/female/178.png index e82027f2da8..7978ec22e7f 100644 Binary files a/public/images/pokemon/back/shiny/female/178.png and b/public/images/pokemon/back/shiny/female/178.png differ diff --git a/public/images/pokemon/back/shiny/female/186.json b/public/images/pokemon/back/shiny/female/186.json index 04476516116..cc95a3819ea 100644 --- a/public/images/pokemon/back/shiny/female/186.json +++ b/public/images/pokemon/back/shiny/female/186.json @@ -1,2036 +1,712 @@ { - "textures": [ - { - "image": "186.png", - "format": "RGBA8888", - "size": { - "w": 329, - "h": 329 - }, - "scale": 1, - "frames": [ - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 75 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 75 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 0, - "y": 146, - "w": 40, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 43, - "h": 45 - }, - "frame": { - "x": 0, - "y": 283, - "w": 43, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 81, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 161, - "y": 64, - "w": 41, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 22, - "w": 40, - "h": 56 - }, - "frame": { - "x": 124, - "y": 122, - "w": 40, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 56 - }, - "frame": { - "x": 164, - "y": 120, - "w": 40, - "h": 56 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 202, - "y": 64, - "w": 40, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 208, - "y": 277, - "w": 40, - "h": 52 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 40, - "h": 51 - }, - "frame": { - "x": 248, - "y": 277, - "w": 40, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2fafa31e40697aa1ab7bc1619c303f9a:3af9773306c3ebb89af2d8ec9b6d7e0e:2e42f825bd325ece9bcbe5d573264582$" - } -} + "textures":[ + { + "image": "186.png", + "format": "RGBA8888", + "size": { "w": 164, "h": 264 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/back/shiny/female/186.png b/public/images/pokemon/back/shiny/female/186.png index d63999a4f2d..37b157dce85 100644 Binary files a/public/images/pokemon/back/shiny/female/186.png and b/public/images/pokemon/back/shiny/female/186.png differ diff --git a/public/images/pokemon/back/shiny/female/190.png b/public/images/pokemon/back/shiny/female/190.png index a3832cb2219..11c7f6a84e5 100644 Binary files a/public/images/pokemon/back/shiny/female/190.png and b/public/images/pokemon/back/shiny/female/190.png differ diff --git a/public/images/pokemon/back/shiny/female/424.png b/public/images/pokemon/back/shiny/female/424.png index 6d1fc2e53ef..dd620a0cfa9 100644 Binary files a/public/images/pokemon/back/shiny/female/424.png and b/public/images/pokemon/back/shiny/female/424.png differ diff --git a/public/images/pokemon/exp/1003.png b/public/images/pokemon/exp/1003.png index 94f9aa88381..e6c8cbc2b67 100644 Binary files a/public/images/pokemon/exp/1003.png and b/public/images/pokemon/exp/1003.png differ diff --git a/public/images/pokemon/exp/380-mega.png b/public/images/pokemon/exp/380-mega.png index 50be5e401f3..2a0cfa8797b 100644 Binary files a/public/images/pokemon/exp/380-mega.png and b/public/images/pokemon/exp/380-mega.png differ diff --git a/public/images/pokemon/exp/381-mega.png b/public/images/pokemon/exp/381-mega.png index cf9addd7b12..a40e3eb8655 100644 Binary files a/public/images/pokemon/exp/381-mega.png and b/public/images/pokemon/exp/381-mega.png differ diff --git a/public/images/pokemon/exp/4080.png b/public/images/pokemon/exp/4080.png index 6a882bef2ce..81890a8b9e5 100644 Binary files a/public/images/pokemon/exp/4080.png and b/public/images/pokemon/exp/4080.png differ diff --git a/public/images/pokemon/exp/4083.json b/public/images/pokemon/exp/4083.json index 8a5bae6080a..26ced14739b 100644 --- a/public/images/pokemon/exp/4083.json +++ b/public/images/pokemon/exp/4083.json @@ -1,1595 +1,616 @@ { - "textures": [ - { - "image": "4083.png", - "format": "RGBA8888", - "size": { - "w": 276, - "h": 276 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 48 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 0, - "y": 48, - "w": 88, - "h": 46 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 0, - "y": 48, - "w": 88, - "h": 46 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 81, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 88, - "y": 46, - "w": 88, - "h": 46 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 169, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 169, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 88, - "y": 92, - "w": 86, - "h": 46 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 86, - "h": 46 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 86, - "h": 46 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 86, - "y": 138, - "w": 86, - "h": 46 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 140, - "w": 86, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 140, - "w": 86, - "h": 46 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 46 - }, - "frame": { - "x": 172, - "y": 138, - "w": 85, - "h": 46 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 46 - }, - "frame": { - "x": 172, - "y": 138, - "w": 85, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 83, - "y": 230, - "w": 83, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 83, - "y": 230, - "w": 83, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1de2d6bd2e4f26446b2c6f55de0f7b9b:e56909341ef6baa38f2c9dc5a42c7808:c8e39c2aa3816f24d9e5ee92c7ddf6b0$" - } + "textures": [ + { + "image": "4083.png", + "format": "RGBA8888", + "size": { "w": 264, "h": 240 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } } diff --git a/public/images/pokemon/exp/4083.png b/public/images/pokemon/exp/4083.png index 0ce1b804a79..d0fd23c248d 100644 Binary files a/public/images/pokemon/exp/4083.png and b/public/images/pokemon/exp/4083.png differ diff --git a/public/images/pokemon/exp/4199.png b/public/images/pokemon/exp/4199.png index b807a32fe97..b1858760c0c 100644 Binary files a/public/images/pokemon/exp/4199.png and b/public/images/pokemon/exp/4199.png differ diff --git a/public/images/pokemon/exp/4562.png b/public/images/pokemon/exp/4562.png index d369b50686b..69b90f182ca 100644 Binary files a/public/images/pokemon/exp/4562.png and b/public/images/pokemon/exp/4562.png differ diff --git a/public/images/pokemon/exp/670-blue.json b/public/images/pokemon/exp/670-blue.json index 95b040e8302..ba237724cbc 100644 --- a/public/images/pokemon/exp/670-blue.json +++ b/public/images/pokemon/exp/670-blue.json @@ -4,135 +4,156 @@ "image": "670-blue.png", "format": "RGBA8888", "size": { - "w": 131, - "h": 131 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 65 } }, { - "filename": "0006.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 3, + "y": 9, + "w": 60, + "h": 67 }, "frame": { - "x": 0, + "x": 60, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0012.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 5, + "w": 60, + "h": 67 }, "frame": { - "x": 0, + "x": 120, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0001.png", + "filename": "0082.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, + "x": 4, + "y": 10, + "w": 61, + "h": 68 + }, + "frame": { + "x": 180, + "y": 0, + "w": 61, + "h": 68 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, "y": 2, - "w": 40, - "h": 65 + "w": 60, + "h": 68 }, "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 65 - }, - "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, + "x": 241, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 68 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, + "w": 62, + "h": 69 + }, + "frame": { + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 } }, { @@ -140,62 +161,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 40, - "y": 66, - "w": 38, - "h": 65 + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { - "filename": "0010.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 40, - "y": 66, - "w": 38, - "h": 65 + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { - "filename": "0003.png", + "filename": "0026.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 80, + "x": 419, "y": 0, - "w": 39, - "h": 66 + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { @@ -203,41 +308,1259 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 8, + "w": 59, + "h": 70 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 0, + "y": 65, + "w": 59, + "h": 70 } }, { - "filename": "0009.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 56, + "h": 70 + }, + "frame": { + "x": 59, + "y": 67, + "w": 56, + "h": 70 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 70 + }, + "frame": { + "x": 115, + "y": 67, + "w": 57, + "h": 70 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 57, + "h": 70 + }, + "frame": { + "x": 172, + "y": 68, + "w": 57, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 53, + "y": 137, + "w": 61, + "h": 73 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 73 + }, + "frame": { + "x": 114, + "y": 137, + "w": 54, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, + "y": 139, + "w": 61, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 52, + "h": 74 + }, + "frame": { + "x": 339, + "y": 141, + "w": 52, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 39, - "h": 66 + "y": 4, + "w": 51, + "h": 76 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 } }, { @@ -245,20 +1568,944 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 53, + "h": 76 + }, + "frame": { + "x": 265, + "y": 214, + "w": 53, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 51, + "h": 77 + }, + "frame": { + "x": 419, + "y": 217, + "w": 51, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 47, + "h": 77 + }, + "frame": { + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 50, + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 48, + "h": 78 + }, + "frame": { + "x": 259, + "y": 290, + "w": 48, + "h": 78 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 39, - "h": 66 + "y": 3, + "w": 45, + "h": 79 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 48, + "h": 79 + }, + "frame": { + "x": 44, + "y": 362, + "w": 48, + "h": 79 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 48, + "h": 79 + }, + "frame": { + "x": 92, + "y": 363, + "w": 48, + "h": 79 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 48, + "h": 79 + }, + "frame": { + "x": 140, + "y": 364, + "w": 48, + "h": 79 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 48, + "h": 79 + }, + "frame": { + "x": 188, + "y": 366, + "w": 48, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 46, + "h": 80 + }, + "frame": { + "x": 236, + "y": 368, + "w": 46, + "h": 80 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 47, + "h": 80 + }, + "frame": { + "x": 282, + "y": 370, + "w": 47, + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -266,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6da8d1608a9c65309f0d1306470072d7:4ca05025221d73b733ddbeb890226940:f28e65cb64de91b1773f7b4998e488a5$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/670-blue.png b/public/images/pokemon/exp/670-blue.png index 449a4c67b46..2134e15d6f9 100644 Binary files a/public/images/pokemon/exp/670-blue.png and b/public/images/pokemon/exp/670-blue.png differ diff --git a/public/images/pokemon/exp/670-orange.json b/public/images/pokemon/exp/670-orange.json index e43c9fb689e..ded85695da2 100644 --- a/public/images/pokemon/exp/670-orange.json +++ b/public/images/pokemon/exp/670-orange.json @@ -4,135 +4,156 @@ "image": "670-orange.png", "format": "RGBA8888", "size": { - "w": 131, - "h": 131 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 65 } }, { - "filename": "0006.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 3, + "y": 9, + "w": 60, + "h": 67 }, "frame": { - "x": 0, + "x": 60, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0012.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 5, + "w": 60, + "h": 67 }, "frame": { - "x": 0, + "x": 120, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0001.png", + "filename": "0082.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, + "x": 4, + "y": 10, + "w": 61, + "h": 68 + }, + "frame": { + "x": 180, + "y": 0, + "w": 61, + "h": 68 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, "y": 2, - "w": 40, - "h": 65 + "w": 60, + "h": 68 }, "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 65 - }, - "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, + "x": 241, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 68 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, + "w": 62, + "h": 69 + }, + "frame": { + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 } }, { @@ -140,62 +161,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 40, - "y": 66, - "w": 38, - "h": 65 + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { - "filename": "0010.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 40, - "y": 66, - "w": 38, - "h": 65 + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { - "filename": "0003.png", + "filename": "0026.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 80, + "x": 419, "y": 0, - "w": 39, - "h": 66 + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { @@ -203,41 +308,1259 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 8, + "w": 59, + "h": 70 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 0, + "y": 65, + "w": 59, + "h": 70 } }, { - "filename": "0009.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 56, + "h": 70 + }, + "frame": { + "x": 59, + "y": 67, + "w": 56, + "h": 70 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 70 + }, + "frame": { + "x": 115, + "y": 67, + "w": 57, + "h": 70 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 57, + "h": 70 + }, + "frame": { + "x": 172, + "y": 68, + "w": 57, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 53, + "y": 137, + "w": 61, + "h": 73 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 73 + }, + "frame": { + "x": 114, + "y": 137, + "w": 54, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, + "y": 139, + "w": 61, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 52, + "h": 74 + }, + "frame": { + "x": 339, + "y": 141, + "w": 52, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 39, - "h": 66 + "y": 4, + "w": 51, + "h": 76 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 } }, { @@ -245,20 +1568,944 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 53, + "h": 76 + }, + "frame": { + "x": 265, + "y": 214, + "w": 53, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 51, + "h": 77 + }, + "frame": { + "x": 419, + "y": 217, + "w": 51, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 47, + "h": 77 + }, + "frame": { + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 50, + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 48, + "h": 78 + }, + "frame": { + "x": 259, + "y": 290, + "w": 48, + "h": 78 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 39, - "h": 66 + "y": 3, + "w": 45, + "h": 79 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 48, + "h": 79 + }, + "frame": { + "x": 44, + "y": 362, + "w": 48, + "h": 79 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 48, + "h": 79 + }, + "frame": { + "x": 92, + "y": 363, + "w": 48, + "h": 79 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 48, + "h": 79 + }, + "frame": { + "x": 140, + "y": 364, + "w": 48, + "h": 79 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 48, + "h": 79 + }, + "frame": { + "x": 188, + "y": 366, + "w": 48, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 46, + "h": 80 + }, + "frame": { + "x": 236, + "y": 368, + "w": 46, + "h": 80 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 47, + "h": 80 + }, + "frame": { + "x": 282, + "y": 370, + "w": 47, + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -266,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f5cb262b81e50f1216f7c96b87cee008:1e93586061e47c799fccb4b2e32678a7:a4ae1870548474db9c466580d9a207bb$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/670-orange.png b/public/images/pokemon/exp/670-orange.png index 58594979aad..456c956d01c 100644 Binary files a/public/images/pokemon/exp/670-orange.png and b/public/images/pokemon/exp/670-orange.png differ diff --git a/public/images/pokemon/exp/670-red.json b/public/images/pokemon/exp/670-red.json index d5879f024af..098b0efca76 100644 --- a/public/images/pokemon/exp/670-red.json +++ b/public/images/pokemon/exp/670-red.json @@ -2513,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:edb2df3a947401efb05329a2c96d5d73:f256d83ef4df17c17958acc6e0432ab0:bad05b37c157676604256a043511a6a2$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/670-red.png b/public/images/pokemon/exp/670-red.png index 6eb15f4fce5..78707eada6e 100644 Binary files a/public/images/pokemon/exp/670-red.png and b/public/images/pokemon/exp/670-red.png differ diff --git a/public/images/pokemon/exp/670-white.json b/public/images/pokemon/exp/670-white.json index 3a30277b875..521ca042bf2 100644 --- a/public/images/pokemon/exp/670-white.json +++ b/public/images/pokemon/exp/670-white.json @@ -4,135 +4,156 @@ "image": "670-white.png", "format": "RGBA8888", "size": { - "w": 131, - "h": 131 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 65 } }, { - "filename": "0006.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 3, + "y": 9, + "w": 60, + "h": 67 }, "frame": { - "x": 0, + "x": 60, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0012.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 5, + "w": 60, + "h": 67 }, "frame": { - "x": 0, + "x": 120, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0001.png", + "filename": "0082.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, + "x": 4, + "y": 10, + "w": 61, + "h": 68 + }, + "frame": { + "x": 180, + "y": 0, + "w": 61, + "h": 68 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, "y": 2, - "w": 40, - "h": 65 + "w": 60, + "h": 68 }, "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 65 - }, - "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, + "x": 241, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 68 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, + "w": 62, + "h": 69 + }, + "frame": { + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 } }, { @@ -140,62 +161,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 40, - "y": 66, - "w": 38, - "h": 65 + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { - "filename": "0010.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 40, - "y": 66, - "w": 38, - "h": 65 + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { - "filename": "0003.png", + "filename": "0026.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 80, + "x": 419, "y": 0, - "w": 39, - "h": 66 + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { @@ -203,41 +308,1259 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 8, + "w": 59, + "h": 70 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 0, + "y": 65, + "w": 59, + "h": 70 } }, { - "filename": "0009.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 56, + "h": 70 + }, + "frame": { + "x": 59, + "y": 67, + "w": 56, + "h": 70 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 70 + }, + "frame": { + "x": 115, + "y": 67, + "w": 57, + "h": 70 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 57, + "h": 70 + }, + "frame": { + "x": 172, + "y": 68, + "w": 57, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 53, + "y": 137, + "w": 61, + "h": 73 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 73 + }, + "frame": { + "x": 114, + "y": 137, + "w": 54, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, + "y": 139, + "w": 61, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 52, + "h": 74 + }, + "frame": { + "x": 339, + "y": 141, + "w": 52, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 39, - "h": 66 + "y": 4, + "w": 51, + "h": 76 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 } }, { @@ -245,20 +1568,944 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 53, + "h": 76 + }, + "frame": { + "x": 265, + "y": 214, + "w": 53, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 51, + "h": 77 + }, + "frame": { + "x": 419, + "y": 217, + "w": 51, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 47, + "h": 77 + }, + "frame": { + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 50, + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 48, + "h": 78 + }, + "frame": { + "x": 259, + "y": 290, + "w": 48, + "h": 78 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 39, - "h": 66 + "y": 3, + "w": 45, + "h": 79 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 48, + "h": 79 + }, + "frame": { + "x": 44, + "y": 362, + "w": 48, + "h": 79 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 48, + "h": 79 + }, + "frame": { + "x": 92, + "y": 363, + "w": 48, + "h": 79 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 48, + "h": 79 + }, + "frame": { + "x": 140, + "y": 364, + "w": 48, + "h": 79 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 48, + "h": 79 + }, + "frame": { + "x": 188, + "y": 366, + "w": 48, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 46, + "h": 80 + }, + "frame": { + "x": 236, + "y": 368, + "w": 46, + "h": 80 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 47, + "h": 80 + }, + "frame": { + "x": 282, + "y": 370, + "w": 47, + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -266,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c665c1ed8b3570782ceb8fe40f155b3a:43fe4cf13bd16f48a733e1533ed1dc70:3b5fc0bf297b00d7e2adc65825803c41$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/670-white.png b/public/images/pokemon/exp/670-white.png index 398e11c58b6..884492ab4c5 100644 Binary files a/public/images/pokemon/exp/670-white.png and b/public/images/pokemon/exp/670-white.png differ diff --git a/public/images/pokemon/exp/670-yellow.json b/public/images/pokemon/exp/670-yellow.json index 7b870101a5f..ffd722006d3 100644 --- a/public/images/pokemon/exp/670-yellow.json +++ b/public/images/pokemon/exp/670-yellow.json @@ -4,135 +4,156 @@ "image": "670-yellow.png", "format": "RGBA8888", "size": { - "w": 131, - "h": 131 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 65 } }, { - "filename": "0006.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 3, + "y": 9, + "w": 60, + "h": 67 }, "frame": { - "x": 0, + "x": 60, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0012.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 5, + "w": 60, + "h": 67 }, "frame": { - "x": 0, + "x": 120, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0001.png", + "filename": "0082.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, + "x": 4, + "y": 10, + "w": 61, + "h": 68 + }, + "frame": { + "x": 180, + "y": 0, + "w": 61, + "h": 68 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, "y": 2, - "w": 40, - "h": 65 + "w": 60, + "h": 68 }, "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 65 - }, - "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, + "x": 241, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 68 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, + "w": 62, + "h": 69 + }, + "frame": { + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 } }, { @@ -140,62 +161,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 40, - "y": 66, - "w": 38, - "h": 65 + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { - "filename": "0010.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 40, - "y": 66, - "w": 38, - "h": 65 + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { - "filename": "0003.png", + "filename": "0026.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 11, + "w": 62, + "h": 70 }, "frame": { - "x": 80, + "x": 419, "y": 0, - "w": 39, - "h": 66 + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 } }, { @@ -203,41 +308,1259 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 8, + "w": 59, + "h": 70 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 0, + "y": 65, + "w": 59, + "h": 70 } }, { - "filename": "0009.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 56, + "h": 70 + }, + "frame": { + "x": 59, + "y": 67, + "w": 56, + "h": 70 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 70 + }, + "frame": { + "x": 115, + "y": 67, + "w": 57, + "h": 70 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 57, + "h": 70 + }, + "frame": { + "x": 172, + "y": 68, + "w": 57, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 53, + "y": 137, + "w": 61, + "h": 73 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 73 + }, + "frame": { + "x": 114, + "y": 137, + "w": 54, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, + "y": 139, + "w": 61, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 52, + "h": 74 + }, + "frame": { + "x": 339, + "y": 141, + "w": 52, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 39, - "h": 66 + "y": 4, + "w": 51, + "h": 76 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 } }, { @@ -245,20 +1568,944 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 53, + "h": 76 + }, + "frame": { + "x": 265, + "y": 214, + "w": 53, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 51, + "h": 77 + }, + "frame": { + "x": 419, + "y": 217, + "w": 51, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 47, + "h": 77 + }, + "frame": { + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 50, + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 48, + "h": 78 + }, + "frame": { + "x": 259, + "y": 290, + "w": 48, + "h": 78 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 39, - "h": 66 + "y": 3, + "w": 45, + "h": 79 }, "frame": { - "x": 80, - "y": 0, - "w": 39, - "h": 66 + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 48, + "h": 79 + }, + "frame": { + "x": 44, + "y": 362, + "w": 48, + "h": 79 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 48, + "h": 79 + }, + "frame": { + "x": 92, + "y": 363, + "w": 48, + "h": 79 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 48, + "h": 79 + }, + "frame": { + "x": 140, + "y": 364, + "w": 48, + "h": 79 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 48, + "h": 79 + }, + "frame": { + "x": 188, + "y": 366, + "w": 48, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 46, + "h": 80 + }, + "frame": { + "x": 236, + "y": 368, + "w": 46, + "h": 80 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 47, + "h": 80 + }, + "frame": { + "x": 282, + "y": 370, + "w": 47, + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -266,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fa4d73da9ed13167c827701785bfb172:cffbc78a697506fc6a1560471e6521e9:e33b1f5cc51f17c070e89705329e1246$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/670-yellow.png b/public/images/pokemon/exp/670-yellow.png index a172034d5cf..1da9a6ea862 100644 Binary files a/public/images/pokemon/exp/670-yellow.png and b/public/images/pokemon/exp/670-yellow.png differ diff --git a/public/images/pokemon/exp/677.png b/public/images/pokemon/exp/677.png index 6abdd53afe6..70d8a0f185d 100644 Binary files a/public/images/pokemon/exp/677.png and b/public/images/pokemon/exp/677.png differ diff --git a/public/images/pokemon/exp/678-female.png b/public/images/pokemon/exp/678-female.png index 15f571c3109..3af30f5d2a7 100644 Binary files a/public/images/pokemon/exp/678-female.png and b/public/images/pokemon/exp/678-female.png differ diff --git a/public/images/pokemon/exp/698.png b/public/images/pokemon/exp/698.png index 582e627dd97..3fba3dad32a 100644 Binary files a/public/images/pokemon/exp/698.png and b/public/images/pokemon/exp/698.png differ diff --git a/public/images/pokemon/exp/699.png b/public/images/pokemon/exp/699.png index 219060ba37b..d2108e813aa 100644 Binary files a/public/images/pokemon/exp/699.png and b/public/images/pokemon/exp/699.png differ diff --git a/public/images/pokemon/exp/702.png b/public/images/pokemon/exp/702.png index 519fdbf6e88..a5d375e779a 100644 Binary files a/public/images/pokemon/exp/702.png and b/public/images/pokemon/exp/702.png differ diff --git a/public/images/pokemon/exp/751.json b/public/images/pokemon/exp/751.json index 7ac34e0ac04..2e28048706d 100644 --- a/public/images/pokemon/exp/751.json +++ b/public/images/pokemon/exp/751.json @@ -4,71 +4,155 @@ "image": "751.png", "format": "RGBA8888", "size": { - "w": 146, - "h": 146 + "w": 169, + "h": 169 }, "scale": 1, "frames": [ { - "filename": "0005.png", + "filename": "0006.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 55 + "w": 35, + "h": 43 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 52 - }, - "frame": { "x": 0, "y": 0, - "w": 32, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 32, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 32, - "h": 51 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 32, + "w": 33, "h": 43 }, "frame": { "x": 0, - "y": 103, - "w": 32, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 0, + "y": 43, + "w": 33, "h": 43 } }, @@ -77,104 +161,104 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 55 + "w": 35, + "h": 43 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 32, - "h": 50 + "y": 0, + "w": 33, + "h": 43 }, "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 50 + "x": 0, + "y": 43, + "w": 33, + "h": 43 } }, { - "filename": "0006.png", + "filename": "0047.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 55 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 30, - "h": 51 - }, - "frame": { - "x": 32, - "y": 50, - "w": 30, - "h": 51 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 55 + "w": 35, + "h": 43 }, "spriteSourceSize": { "x": 0, - "y": 10, - "w": 32, - "h": 45 - }, - "frame": { - "x": 32, - "y": 101, - "w": 32, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 55 - }, - "spriteSourceSize": { - "x": 1, "y": 0, - "w": 31, - "h": 50 + "w": 33, + "h": 43 }, "frame": { - "x": 62, - "y": 50, - "w": 31, - "h": 50 + "x": 0, + "y": 43, + "w": 33, + "h": 43 } }, { - "filename": "0002.png", + "filename": "0048.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 55 + "w": 35, + "h": 43 }, "spriteSourceSize": { "x": 0, - "y": 9, - "w": 32, - "h": 46 + "y": 0, + "w": 33, + "h": 43 }, "frame": { - "x": 64, - "y": 100, - "w": 32, - "h": 46 + "x": 0, + "y": 43, + "w": 33, + "h": 43 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 0, + "y": 43, + "w": 33, + "h": 43 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 0, + "y": 43, + "w": 33, + "h": 43 } }, { @@ -182,62 +266,377 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 55 + "w": 35, + "h": 43 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 32, - "h": 49 + "y": 0, + "w": 33, + "h": 43 }, "frame": { - "x": 64, + "x": 33, "y": 0, - "w": 32, - "h": 49 + "w": 33, + "h": 43 } }, { - "filename": "0007.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 55 + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 33, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 33, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 33, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 33, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 33, + "h": 43 + }, + "frame": { + "x": 33, + "y": 0, + "w": 33, + "h": 43 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 }, "spriteSourceSize": { "x": 1, "y": 0, - "w": 31, - "h": 49 + "w": 32, + "h": 43 }, "frame": { - "x": 93, - "y": 49, - "w": 31, - "h": 49 + "x": 0, + "y": 86, + "w": 32, + "h": 43 } }, { - "filename": "0001.png", + "filename": "0005.png", "rotated": false, "trimmed": true, "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, "w": 32, - "h": 55 + "h": 43 + }, + "frame": { + "x": 0, + "y": 86, + "w": 32, + "h": 43 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 0, + "y": 86, + "w": 32, + "h": 43 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 0, + "y": 86, + "w": 32, + "h": 43 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 0, + "y": 86, + "w": 32, + "h": 43 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 0, + "y": 86, + "w": 32, + "h": 43 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 }, "spriteSourceSize": { "x": 0, - "y": 7, - "w": 32, - "h": 48 + "y": 3, + "w": 34, + "h": 40 }, "frame": { - "x": 96, - "y": 98, - "w": 32, - "h": 48 + "x": 0, + "y": 129, + "w": 34, + "h": 40 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 34, + "h": 40 + }, + "frame": { + "x": 0, + "y": 129, + "w": 34, + "h": 40 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 34, + "h": 40 + }, + "frame": { + "x": 0, + "y": 129, + "w": 34, + "h": 40 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 34, + "h": 40 + }, + "frame": { + "x": 0, + "y": 129, + "w": 34, + "h": 40 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 34, + "h": 40 + }, + "frame": { + "x": 0, + "y": 129, + "w": 34, + "h": 40 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 34, + "h": 40 + }, + "frame": { + "x": 0, + "y": 129, + "w": 34, + "h": 40 } }, { @@ -245,20 +644,2393 @@ "rotated": false, "trimmed": true, "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, "w": 32, - "h": 55 + "h": 43 + }, + "frame": { + "x": 66, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 66, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 66, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 }, "spriteSourceSize": { "x": 0, - "y": 10, - "w": 32, - "h": 45 + "y": 2, + "w": 34, + "h": 41 }, "frame": { - "x": 96, + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 33, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, "y": 0, "w": 32, - "h": 45 + "h": 43 + }, + "frame": { + "x": 98, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 98, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 98, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 98, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 98, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 32, + "h": 43 + }, + "frame": { + "x": 98, + "y": 0, + "w": 32, + "h": 43 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 67, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0134.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 67, + "y": 43, + "w": 34, + "h": 41 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 130, + "y": 0, + "w": 34, + "h": 41 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 130, + "y": 0, + "w": 34, + "h": 41 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 130, + "y": 0, + "w": 34, + "h": 41 + } + }, + { + "filename": "0141.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 130, + "y": 0, + "w": 34, + "h": 41 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0130.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0142.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0143.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0144.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 31, + "h": 42 + }, + "frame": { + "x": 101, + "y": 43, + "w": 31, + "h": 42 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 132, + "y": 41, + "w": 31, + "h": 43 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 132, + "y": 41, + "w": 31, + "h": 43 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 132, + "y": 41, + "w": 31, + "h": 43 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 132, + "y": 41, + "w": 31, + "h": 43 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 132, + "y": 41, + "w": 31, + "h": 43 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 132, + "y": 41, + "w": 31, + "h": 43 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 32, + "y": 86, + "w": 31, + "h": 43 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 32, + "y": 86, + "w": 31, + "h": 43 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 32, + "y": 86, + "w": 31, + "h": 43 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 32, + "y": 86, + "w": 31, + "h": 43 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 32, + "y": 86, + "w": 31, + "h": 43 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 32, + "y": 86, + "w": 31, + "h": 43 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 63, + "y": 84, + "w": 34, + "h": 41 + } + }, + { + "filename": "0140.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 34, + "h": 41 + }, + "frame": { + "x": 63, + "y": 84, + "w": 34, + "h": 41 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 35, + "h": 39 + }, + "frame": { + "x": 97, + "y": 85, + "w": 35, + "h": 39 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 35, + "h": 39 + }, + "frame": { + "x": 97, + "y": 85, + "w": 35, + "h": 39 + } + }, + { + "filename": "0133.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 35, + "h": 39 + }, + "frame": { + "x": 97, + "y": 85, + "w": 35, + "h": 39 + } + }, + { + "filename": "0139.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 35, + "h": 39 + }, + "frame": { + "x": 97, + "y": 85, + "w": 35, + "h": 39 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 32, + "h": 42 + }, + "frame": { + "x": 132, + "y": 84, + "w": 32, + "h": 42 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 32, + "h": 42 + }, + "frame": { + "x": 132, + "y": 84, + "w": 32, + "h": 42 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 32, + "h": 42 + }, + "frame": { + "x": 132, + "y": 84, + "w": 32, + "h": 42 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 32, + "h": 42 + }, + "frame": { + "x": 132, + "y": 84, + "w": 32, + "h": 42 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 32, + "h": 42 + }, + "frame": { + "x": 132, + "y": 84, + "w": 32, + "h": 42 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 32, + "h": 42 + }, + "frame": { + "x": 132, + "y": 84, + "w": 32, + "h": 42 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 35, + "h": 38 + }, + "frame": { + "x": 34, + "y": 129, + "w": 35, + "h": 38 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 35, + "h": 38 + }, + "frame": { + "x": 34, + "y": 129, + "w": 35, + "h": 38 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 35, + "h": 38 + }, + "frame": { + "x": 34, + "y": 129, + "w": 35, + "h": 38 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 35, + "h": 38 + }, + "frame": { + "x": 34, + "y": 129, + "w": 35, + "h": 38 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 35, + "h": 38 + }, + "frame": { + "x": 34, + "y": 129, + "w": 35, + "h": 38 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 35, + "h": 38 + }, + "frame": { + "x": 34, + "y": 129, + "w": 35, + "h": 38 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 69, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 69, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 69, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 100, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 100, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0131.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 100, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0137.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 100, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 131, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 131, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0132.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 131, + "y": 126, + "w": 31, + "h": 43 + } + }, + { + "filename": "0138.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 35, + "h": 43 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 31, + "h": 43 + }, + "frame": { + "x": 131, + "y": 126, + "w": 31, + "h": 43 } } ] @@ -267,6 +3039,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cc1e42833991a58e9cbe6f8a40a3d179:832e53524cd611a274742603a96b9ff4:1d193c65e68b1611f35fce7f3295865c$" + "smartupdate": "$TexturePacker:SmartUpdate:4cce3abef08fd679bfca3bda14d2e7a8:fa6cfa01fadaa0ac727b8c3a4d1d49fc:1d193c65e68b1611f35fce7f3295865c$" } } diff --git a/public/images/pokemon/exp/751.png b/public/images/pokemon/exp/751.png index 2f331ba746a..b670acad126 100644 Binary files a/public/images/pokemon/exp/751.png and b/public/images/pokemon/exp/751.png differ diff --git a/public/images/pokemon/exp/821.png b/public/images/pokemon/exp/821.png index e4a73a66140..8bb00063bcb 100644 Binary files a/public/images/pokemon/exp/821.png and b/public/images/pokemon/exp/821.png differ diff --git a/public/images/pokemon/exp/823.png b/public/images/pokemon/exp/823.png index 22301ca3abe..b280ac7c9e6 100644 Binary files a/public/images/pokemon/exp/823.png and b/public/images/pokemon/exp/823.png differ diff --git a/public/images/pokemon/exp/867.json b/public/images/pokemon/exp/867.json index 1a9c7572f43..52e0127509b 100644 --- a/public/images/pokemon/exp/867.json +++ b/public/images/pokemon/exp/867.json @@ -4,8 +4,8 @@ "image": "867.png", "format": "RGBA8888", "size": { - "w": 344, - "h": 344 + "w": 361, + "h": 361 }, "scale": 1, "frames": [ @@ -31,7 +31,7 @@ } }, { - "filename": "0020.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -52,7 +52,7 @@ } }, { - "filename": "0035.png", + "filename": "0037.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -94,70 +94,7 @@ } }, { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 113, - "h": 56 - }, - "frame": { - "x": 114, - "y": 0, - "w": 113, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 113, - "h": 56 - }, - "frame": { - "x": 114, - "y": 0, - "w": 113, - "h": 56 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 113, - "h": 56 - }, - "frame": { - "x": 114, - "y": 0, - "w": 113, - "h": 56 - } - }, - { - "filename": "0034.png", + "filename": "0020.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -199,7 +136,7 @@ } }, { - "filename": "0003.png", + "filename": "0006.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -207,20 +144,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 4, + "x": 2, "y": 0, - "w": 107, + "w": 112, "h": 56 }, "frame": { "x": 227, "y": 0, - "w": 107, + "w": 112, "h": 56 } }, { - "filename": "0018.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -228,20 +165,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 4, + "x": 2, "y": 0, - "w": 107, + "w": 112, "h": 56 }, "frame": { "x": 227, "y": 0, - "w": 107, + "w": 112, "h": 56 } }, { - "filename": "0033.png", + "filename": "0038.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -249,62 +186,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 4, + "x": 2, "y": 0, - "w": 107, + "w": 112, "h": 56 }, "frame": { "x": 227, "y": 0, - "w": 107, + "w": 112, "h": 56 } }, { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 103, - "h": 65 - }, - "frame": { - "x": 0, - "y": 56, - "w": 103, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 103, - "h": 65 - }, - "frame": { - "x": 0, - "y": 56, - "w": 103, - "h": 65 - } - }, - { - "filename": "0026.png", + "filename": "0012.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -346,7 +241,7 @@ } }, { - "filename": "0041.png", + "filename": "0044.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -367,7 +262,7 @@ } }, { - "filename": "0043.png", + "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -375,16 +270,58 @@ "h": 66 }, "spriteSourceSize": { - "x": 5, + "x": 4, "y": 0, - "w": 103, - "h": 65 + "w": 107, + "h": 56 }, "frame": { - "x": 0, + "x": 103, "y": 56, - "w": 103, - "h": 65 + "w": 107, + "h": 56 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 107, + "h": 56 + }, + "frame": { + "x": 103, + "y": 56, + "w": 107, + "h": 56 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 107, + "h": 56 + }, + "frame": { + "x": 103, + "y": 56, + "w": 107, + "h": 56 } }, { @@ -402,14 +339,14 @@ "h": 56 }, "frame": { - "x": 103, + "x": 210, "y": 56, "w": 107, "h": 56 } }, { - "filename": "0022.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -423,14 +360,14 @@ "h": 56 }, "frame": { - "x": 103, + "x": 210, "y": 56, "w": 107, "h": 56 } }, { - "filename": "0037.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -444,12 +381,54 @@ "h": 56 }, "frame": { - "x": 103, + "x": 210, "y": 56, "w": 107, "h": 56 } }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 40, + "y": 1, + "w": 44, + "h": 56 + }, + "frame": { + "x": 317, + "y": 56, + "w": 44, + "h": 56 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 40, + "y": 1, + "w": 44, + "h": 56 + }, + "frame": { + "x": 317, + "y": 56, + "w": 44, + "h": 56 + } + }, { "filename": "0002.png", "rotated": false, @@ -465,14 +444,14 @@ "h": 57 }, "frame": { - "x": 210, - "y": 56, + "x": 103, + "y": 112, "w": 102, "h": 57 } }, { - "filename": "0017.png", + "filename": "0018.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -486,14 +465,14 @@ "h": 57 }, "frame": { - "x": 210, - "y": 56, + "x": 103, + "y": 112, "w": 102, "h": 57 } }, { - "filename": "0032.png", + "filename": "0034.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -507,12 +486,138 @@ "h": 57 }, "frame": { - "x": 210, - "y": 56, + "x": 103, + "y": 112, "w": 102, "h": 57 } }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 101, + "h": 65 + }, + "frame": { + "x": 0, + "y": 121, + "w": 101, + "h": 65 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 101, + "h": 65 + }, + "frame": { + "x": 0, + "y": 121, + "w": 101, + "h": 65 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 101, + "h": 65 + }, + "frame": { + "x": 0, + "y": 121, + "w": 101, + "h": 65 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 101, + "h": 61 + }, + "frame": { + "x": 205, + "y": 112, + "w": 101, + "h": 61 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 101, + "h": 61 + }, + "frame": { + "x": 205, + "y": 112, + "w": 101, + "h": 61 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 101, + "h": 61 + }, + "frame": { + "x": 205, + "y": 112, + "w": 101, + "h": 61 + } + }, { "filename": "0008.png", "rotated": false, @@ -524,266 +629,14 @@ "spriteSourceSize": { "x": 6, "y": 0, - "w": 102, + "w": 101, "h": 57 }, - "frame": { - "x": 103, - "y": 112, - "w": 102, - "h": 57 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 102, - "h": 57 - }, - "frame": { - "x": 103, - "y": 112, - "w": 102, - "h": 57 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 102, - "h": 57 - }, - "frame": { - "x": 103, - "y": 112, - "w": 102, - "h": 57 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 101, - "h": 65 - }, - "frame": { - "x": 0, - "y": 121, - "w": 101, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 101, - "h": 65 - }, - "frame": { - "x": 0, - "y": 121, - "w": 101, - "h": 65 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 101, - "h": 65 - }, - "frame": { - "x": 0, - "y": 121, - "w": 101, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 101, - "h": 61 - }, - "frame": { - "x": 205, - "y": 113, - "w": 101, - "h": 61 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 101, - "h": 61 - }, - "frame": { - "x": 205, - "y": 113, - "w": 101, - "h": 61 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 101, - "h": 61 - }, - "frame": { - "x": 205, - "y": 113, - "w": 101, - "h": 61 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 101, - "h": 61 - }, - "frame": { - "x": 205, - "y": 113, - "w": 101, - "h": 61 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 101, - "h": 61 - }, - "frame": { - "x": 205, - "y": 113, - "w": 101, - "h": 61 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 101, - "h": 61 - }, - "frame": { - "x": 205, - "y": 113, - "w": 101, - "h": 61 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 99, - "h": 59 - }, "frame": { "x": 101, "y": 169, - "w": 99, - "h": 59 + "w": 101, + "h": 57 } }, { @@ -795,20 +648,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 8, + "x": 6, "y": 0, - "w": 99, - "h": 59 + "w": 101, + "h": 57 }, "frame": { "x": 101, "y": 169, - "w": 99, - "h": 59 + "w": 101, + "h": 57 } }, { - "filename": "0039.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -816,20 +669,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 8, + "x": 6, "y": 0, - "w": 99, - "h": 59 + "w": 101, + "h": 57 }, "frame": { "x": 101, "y": 169, - "w": 99, - "h": 59 + "w": 101, + "h": 57 } }, { - "filename": "0015.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -849,6 +702,195 @@ "h": 59 } }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 99, + "h": 59 + }, + "frame": { + "x": 0, + "y": 186, + "w": 99, + "h": 59 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 99, + "h": 59 + }, + "frame": { + "x": 0, + "y": 186, + "w": 99, + "h": 59 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 40, + "y": 0, + "w": 44, + "h": 54 + }, + "frame": { + "x": 306, + "y": 112, + "w": 44, + "h": 54 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 40, + "y": 3, + "w": 44, + "h": 54 + }, + "frame": { + "x": 306, + "y": 112, + "w": 44, + "h": 54 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 40, + "y": 3, + "w": 44, + "h": 54 + }, + "frame": { + "x": 306, + "y": 112, + "w": 44, + "h": 54 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 40, + "y": 3, + "w": 44, + "h": 54 + }, + "frame": { + "x": 306, + "y": 112, + "w": 44, + "h": 54 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 39, + "y": 3, + "w": 44, + "h": 54 + }, + "frame": { + "x": 306, + "y": 166, + "w": 44, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 39, + "y": 3, + "w": 44, + "h": 54 + }, + "frame": { + "x": 306, + "y": 166, + "w": 44, + "h": 54 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 97, + "h": 65 + }, + "frame": { + "x": 202, + "y": 173, + "w": 97, + "h": 65 + } + }, { "filename": "0030.png", "rotated": false, @@ -858,20 +900,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 8, + "x": 5, "y": 0, - "w": 99, - "h": 59 + "w": 97, + "h": 65 }, "frame": { - "x": 0, - "y": 186, - "w": 99, - "h": 59 + "x": 202, + "y": 173, + "w": 97, + "h": 65 } }, { - "filename": "0045.png", + "filename": "0046.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -879,16 +921,58 @@ "h": 66 }, "spriteSourceSize": { - "x": 8, + "x": 5, "y": 0, - "w": 99, - "h": 59 + "w": 97, + "h": 65 }, "frame": { - "x": 0, - "y": 186, - "w": 99, - "h": 59 + "x": 202, + "y": 173, + "w": 97, + "h": 65 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 29, + "y": 1, + "w": 58, + "h": 57 + }, + "frame": { + "x": 299, + "y": 220, + "w": 58, + "h": 57 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 29, + "y": 1, + "w": 58, + "h": 57 + }, + "frame": { + "x": 299, + "y": 220, + "w": 58, + "h": 57 } }, { @@ -906,8 +990,134 @@ "h": 59 }, "frame": { - "x": 0, - "y": 245, + "x": 99, + "y": 226, + "w": 95, + "h": 59 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 9, + "y": 1, + "w": 95, + "h": 59 + }, + "frame": { + "x": 99, + "y": 226, + "w": 95, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 9, + "y": 1, + "w": 95, + "h": 59 + }, + "frame": { + "x": 99, + "y": 226, + "w": 95, + "h": 59 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 9, + "y": 1, + "w": 95, + "h": 59 + }, + "frame": { + "x": 99, + "y": 226, + "w": 95, + "h": 59 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 9, + "y": 1, + "w": 95, + "h": 59 + }, + "frame": { + "x": 99, + "y": 226, + "w": 95, + "h": 59 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 9, + "y": 1, + "w": 95, + "h": 59 + }, + "frame": { + "x": 99, + "y": 226, + "w": 95, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 9, + "y": 1, + "w": 95, + "h": 59 + }, + "frame": { + "x": 99, + "y": 226, "w": 95, "h": 59 } @@ -921,146 +1131,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 95, - "h": 59 - }, - "frame": { - "x": 0, - "y": 245, - "w": 95, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 95, - "h": 59 - }, - "frame": { - "x": 0, - "y": 245, - "w": 95, - "h": 59 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 95, - "h": 59 - }, - "frame": { - "x": 0, - "y": 245, - "w": 95, - "h": 59 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 12, - "y": 1, - "w": 90, - "h": 59 - }, - "frame": { - "x": 95, - "y": 245, - "w": 90, - "h": 59 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 22, - "y": 1, - "w": 70, - "h": 59 - }, - "frame": { - "x": 185, - "y": 228, - "w": 70, - "h": 59 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 22, - "y": 1, - "w": 70, - "h": 59 - }, - "frame": { - "x": 185, - "y": 228, - "w": 70, - "h": 59 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 40, + "x": 8, "y": 0, - "w": 44, - "h": 54 + "w": 95, + "h": 59 }, "frame": { - "x": 200, - "y": 174, - "w": 44, - "h": 54 + "x": 0, + "y": 245, + "w": 95, + "h": 59 } }, { - "filename": "0052.png", + "filename": "0032.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1068,100 +1152,16 @@ "h": 66 }, "spriteSourceSize": { - "x": 40, - "y": 3, - "w": 44, - "h": 54 + "x": 8, + "y": 0, + "w": 95, + "h": 59 }, "frame": { - "x": 200, - "y": 174, - "w": 44, - "h": 54 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 40, - "y": 3, - "w": 44, - "h": 54 - }, - "frame": { - "x": 200, - "y": 174, - "w": 44, - "h": 54 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 40, - "y": 3, - "w": 44, - "h": 54 - }, - "frame": { - "x": 200, - "y": 174, - "w": 44, - "h": 54 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 39, - "y": 3, - "w": 44, - "h": 54 - }, - "frame": { - "x": 244, - "y": 174, - "w": 44, - "h": 54 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 39, - "y": 3, - "w": 44, - "h": 54 - }, - "frame": { - "x": 244, - "y": 174, - "w": 44, - "h": 54 + "x": 0, + "y": 245, + "w": 95, + "h": 59 } }, { @@ -1173,41 +1173,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 29, - "y": 1, - "w": 58, - "h": 57 + "x": 8, + "y": 0, + "w": 95, + "h": 59 }, "frame": { - "x": 185, - "y": 287, - "w": 58, - "h": 57 + "x": 0, + "y": 245, + "w": 95, + "h": 59 } }, { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 29, - "y": 1, - "w": 58, - "h": 57 - }, - "frame": { - "x": 185, - "y": 287, - "w": 58, - "h": 57 - } - }, - { - "filename": "0049.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1221,14 +1200,14 @@ "h": 56 }, "frame": { - "x": 288, - "y": 174, + "x": 0, + "y": 304, "w": 56, "h": 56 } }, { - "filename": "0062.png", + "filename": "0065.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1242,56 +1221,14 @@ "h": 56 }, "frame": { - "x": 288, - "y": 174, + "x": 0, + "y": 304, "w": 56, "h": 56 } }, { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 40, - "y": 1, - "w": 44, - "h": 56 - }, - "frame": { - "x": 243, - "y": 287, - "w": 44, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 40, - "y": 1, - "w": 44, - "h": 56 - }, - "frame": { - "x": 243, - "y": 287, - "w": 44, - "h": 56 - } - }, - { - "filename": "0053.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1305,29 +1242,8 @@ "h": 53 }, "frame": { - "x": 255, - "y": 230, - "w": 44, - "h": 53 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 114, - "h": 66 - }, - "spriteSourceSize": { - "x": 41, - "y": 4, - "w": 44, - "h": 53 - }, - "frame": { - "x": 255, - "y": 230, + "x": 56, + "y": 304, "w": 44, "h": 53 } @@ -1341,20 +1257,20 @@ "h": 66 }, "spriteSourceSize": { - "x": 38, + "x": 41, "y": 4, "w": 44, "h": 53 }, "frame": { - "x": 299, - "y": 230, + "x": 56, + "y": 304, "w": 44, "h": 53 } }, { - "filename": "0054.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1362,14 +1278,161 @@ "h": 66 }, "spriteSourceSize": { - "x": 42, + "x": 7, + "y": 0, + "w": 94, + "h": 61 + }, + "frame": { + "x": 194, + "y": 238, + "w": 94, + "h": 61 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 94, + "h": 61 + }, + "frame": { + "x": 194, + "y": 238, + "w": 94, + "h": 61 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 94, + "h": 61 + }, + "frame": { + "x": 194, + "y": 238, + "w": 94, + "h": 61 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 22, + "y": 1, + "w": 70, + "h": 59 + }, + "frame": { + "x": 288, + "y": 277, + "w": 70, + "h": 59 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 22, + "y": 1, + "w": 70, + "h": 59 + }, + "frame": { + "x": 288, + "y": 277, + "w": 70, + "h": 59 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 12, + "y": 1, + "w": 90, + "h": 59 + }, + "frame": { + "x": 100, + "y": 299, + "w": 90, + "h": 59 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 37, + "y": 4, + "w": 44, + "h": 53 + }, + "frame": { + "x": 190, + "y": 299, + "w": 44, + "h": 53 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 114, + "h": 66 + }, + "spriteSourceSize": { + "x": 43, "y": 5, "w": 44, "h": 52 }, "frame": { - "x": 287, - "y": 283, + "x": 234, + "y": 299, "w": 44, "h": 52 } @@ -1379,7 +1442,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b8ca75f7f37906e78ed633b32d037b74:92bc79a7ca35490600679451c06105fc:58bcd289dd222ce646aec14ff657c9fc$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/867.png b/public/images/pokemon/exp/867.png index 521b6288a69..4f8f67842bd 100644 Binary files a/public/images/pokemon/exp/867.png and b/public/images/pokemon/exp/867.png differ diff --git a/public/images/pokemon/exp/880.png b/public/images/pokemon/exp/880.png index 179377ea576..7edffc97cc7 100644 Binary files a/public/images/pokemon/exp/880.png and b/public/images/pokemon/exp/880.png differ diff --git a/public/images/pokemon/exp/881.png b/public/images/pokemon/exp/881.png index f95273abb69..aeaa1728f1a 100644 Binary files a/public/images/pokemon/exp/881.png and b/public/images/pokemon/exp/881.png differ diff --git a/public/images/pokemon/exp/882.png b/public/images/pokemon/exp/882.png index 40cb6719db4..15269a499ca 100644 Binary files a/public/images/pokemon/exp/882.png and b/public/images/pokemon/exp/882.png differ diff --git a/public/images/pokemon/exp/912.png b/public/images/pokemon/exp/912.png index 724355927b7..23c03342039 100644 Binary files a/public/images/pokemon/exp/912.png and b/public/images/pokemon/exp/912.png differ diff --git a/public/images/pokemon/exp/913.png b/public/images/pokemon/exp/913.png index 64126a46029..1bfd1c8f022 100644 Binary files a/public/images/pokemon/exp/913.png and b/public/images/pokemon/exp/913.png differ diff --git a/public/images/pokemon/exp/914.png b/public/images/pokemon/exp/914.png index 6681270ff6b..33ca7719da2 100644 Binary files a/public/images/pokemon/exp/914.png and b/public/images/pokemon/exp/914.png differ diff --git a/public/images/pokemon/exp/940.png b/public/images/pokemon/exp/940.png index 9ace3ca8866..42aed88443c 100644 Binary files a/public/images/pokemon/exp/940.png and b/public/images/pokemon/exp/940.png differ diff --git a/public/images/pokemon/exp/953.png b/public/images/pokemon/exp/953.png index fb4255a112b..8a6ca2e7eff 100644 Binary files a/public/images/pokemon/exp/953.png and b/public/images/pokemon/exp/953.png differ diff --git a/public/images/pokemon/exp/954.png b/public/images/pokemon/exp/954.png index e404d3e5047..6097a0f0393 100644 Binary files a/public/images/pokemon/exp/954.png and b/public/images/pokemon/exp/954.png differ diff --git a/public/images/pokemon/exp/981.png b/public/images/pokemon/exp/981.png index 039cbdd4429..5c87495f6e9 100644 Binary files a/public/images/pokemon/exp/981.png and b/public/images/pokemon/exp/981.png differ diff --git a/public/images/pokemon/exp/back/1001.json b/public/images/pokemon/exp/back/1001.json index 7547fbd93bd..e8b2776127c 100644 --- a/public/images/pokemon/exp/back/1001.json +++ b/public/images/pokemon/exp/back/1001.json @@ -1,272 +1,140 @@ { - "textures": [ - { - "image": "1001.png", - "format": "RGBA8888", - "size": { - "w": 237, - "h": 237 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 79, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 79, - "h": 78 - }, - "frame": { - "x": 79, - "y": 0, - "w": 79, - "h": 78 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 79, - "h": 78 - }, - "frame": { - "x": 79, - "y": 0, - "w": 79, - "h": 78 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 79, - "h": 76 - }, - "frame": { - "x": 158, - "y": 0, - "w": 79, - "h": 76 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 79, - "h": 76 - }, - "frame": { - "x": 158, - "y": 0, - "w": 79, - "h": 76 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 79, - "h": 75 - }, - "frame": { - "x": 158, - "y": 76, - "w": 79, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 79, - "h": 75 - }, - "frame": { - "x": 158, - "y": 76, - "w": 79, - "h": 75 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 78, - "w": 79, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 78, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 79, - "h": 73 - }, - "frame": { - "x": 0, - "y": 79, - "w": 79, - "h": 73 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 79, - "h": 73 - }, - "frame": { - "x": 0, - "y": 79, - "w": 79, - "h": 73 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 79, - "h": 72 - }, - "frame": { - "x": 158, - "y": 151, - "w": 79, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2873276355a5ff8fe57d616764a11cb5:5516cfd39964108d480df461b020785f:c8a3fc07f857e38a4f887e43523aab92$" + "textures":[ + { + "image": "1001.png", + "format": "RGBA8888", + "size": { "w": 161, "h": 157 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + } + ]}], + "meta": {"app": "https://www.aseprite.org/","version": "1.3.7-x64" } } diff --git a/public/images/pokemon/exp/back/1001.png b/public/images/pokemon/exp/back/1001.png index 606028b4d16..7eead83b578 100644 Binary files a/public/images/pokemon/exp/back/1001.png and b/public/images/pokemon/exp/back/1001.png differ diff --git a/public/images/pokemon/exp/back/1003.png b/public/images/pokemon/exp/back/1003.png index 92d3dd5132e..d83789d1fb8 100644 Binary files a/public/images/pokemon/exp/back/1003.png and b/public/images/pokemon/exp/back/1003.png differ diff --git a/public/images/pokemon/exp/back/150-mega-x.png b/public/images/pokemon/exp/back/150-mega-x.png index c9658de8211..80907e95074 100644 Binary files a/public/images/pokemon/exp/back/150-mega-x.png and b/public/images/pokemon/exp/back/150-mega-x.png differ diff --git a/public/images/pokemon/exp/back/257-mega.png b/public/images/pokemon/exp/back/257-mega.png index 84d9a4606a5..48bd446329f 100644 Binary files a/public/images/pokemon/exp/back/257-mega.png and b/public/images/pokemon/exp/back/257-mega.png differ diff --git a/public/images/pokemon/exp/back/380-mega.png b/public/images/pokemon/exp/back/380-mega.png index d865e64c373..b6941fc2611 100644 Binary files a/public/images/pokemon/exp/back/380-mega.png and b/public/images/pokemon/exp/back/380-mega.png differ diff --git a/public/images/pokemon/exp/back/381-mega.png b/public/images/pokemon/exp/back/381-mega.png index d865e64c373..b6941fc2611 100644 Binary files a/public/images/pokemon/exp/back/381-mega.png and b/public/images/pokemon/exp/back/381-mega.png differ diff --git a/public/images/pokemon/exp/back/4080.png b/public/images/pokemon/exp/back/4080.png index 8c09d3ce3d3..f4cfb4cd3c5 100644 Binary files a/public/images/pokemon/exp/back/4080.png and b/public/images/pokemon/exp/back/4080.png differ diff --git a/public/images/pokemon/exp/back/4199.png b/public/images/pokemon/exp/back/4199.png index 2b18de7eed0..174a325b28a 100644 Binary files a/public/images/pokemon/exp/back/4199.png and b/public/images/pokemon/exp/back/4199.png differ diff --git a/public/images/pokemon/exp/back/4562.png b/public/images/pokemon/exp/back/4562.png index 6861ca898be..691c60c8b0a 100644 Binary files a/public/images/pokemon/exp/back/4562.png and b/public/images/pokemon/exp/back/4562.png differ diff --git a/public/images/pokemon/exp/back/670-blue.png b/public/images/pokemon/exp/back/670-blue.png index ae823918654..502e43b6291 100644 Binary files a/public/images/pokemon/exp/back/670-blue.png and b/public/images/pokemon/exp/back/670-blue.png differ diff --git a/public/images/pokemon/exp/back/670-orange.png b/public/images/pokemon/exp/back/670-orange.png index 0f99e71b8b1..a9fe327462c 100644 Binary files a/public/images/pokemon/exp/back/670-orange.png and b/public/images/pokemon/exp/back/670-orange.png differ diff --git a/public/images/pokemon/exp/back/670-red.png b/public/images/pokemon/exp/back/670-red.png index 2fb2fe0991e..29254d959e3 100644 Binary files a/public/images/pokemon/exp/back/670-red.png and b/public/images/pokemon/exp/back/670-red.png differ diff --git a/public/images/pokemon/exp/back/670-white.png b/public/images/pokemon/exp/back/670-white.png index c6bb42011cc..1c17a0ca8e0 100644 Binary files a/public/images/pokemon/exp/back/670-white.png and b/public/images/pokemon/exp/back/670-white.png differ diff --git a/public/images/pokemon/exp/back/670-yellow.png b/public/images/pokemon/exp/back/670-yellow.png index d48dc68011e..37a2094ac74 100644 Binary files a/public/images/pokemon/exp/back/670-yellow.png and b/public/images/pokemon/exp/back/670-yellow.png differ diff --git a/public/images/pokemon/exp/back/698.png b/public/images/pokemon/exp/back/698.png index 8b3b9c354e4..6250dc0110f 100644 Binary files a/public/images/pokemon/exp/back/698.png and b/public/images/pokemon/exp/back/698.png differ diff --git a/public/images/pokemon/exp/back/699.png b/public/images/pokemon/exp/back/699.png index 01b75322092..7558357e206 100644 Binary files a/public/images/pokemon/exp/back/699.png and b/public/images/pokemon/exp/back/699.png differ diff --git a/public/images/pokemon/exp/back/702.png b/public/images/pokemon/exp/back/702.png index 6d9de87f718..be5cf42476b 100644 Binary files a/public/images/pokemon/exp/back/702.png and b/public/images/pokemon/exp/back/702.png differ diff --git a/public/images/pokemon/exp/back/80-mega.png b/public/images/pokemon/exp/back/80-mega.png index 49f41c72706..f6c67586eaa 100644 Binary files a/public/images/pokemon/exp/back/80-mega.png and b/public/images/pokemon/exp/back/80-mega.png differ diff --git a/public/images/pokemon/exp/back/804.png b/public/images/pokemon/exp/back/804.png index 86a9dbe6031..1dbf3c502d3 100644 Binary files a/public/images/pokemon/exp/back/804.png and b/public/images/pokemon/exp/back/804.png differ diff --git a/public/images/pokemon/exp/back/821.png b/public/images/pokemon/exp/back/821.png index 80d88dce2f9..13aa5c24e83 100644 Binary files a/public/images/pokemon/exp/back/821.png and b/public/images/pokemon/exp/back/821.png differ diff --git a/public/images/pokemon/exp/back/823.png b/public/images/pokemon/exp/back/823.png index 69506ac4645..ea00aba09e5 100644 Binary files a/public/images/pokemon/exp/back/823.png and b/public/images/pokemon/exp/back/823.png differ diff --git a/public/images/pokemon/exp/back/867.png b/public/images/pokemon/exp/back/867.png index fc739364da4..b816f10a0de 100644 Binary files a/public/images/pokemon/exp/back/867.png and b/public/images/pokemon/exp/back/867.png differ diff --git a/public/images/pokemon/exp/back/880.png b/public/images/pokemon/exp/back/880.png index 12a280936a1..4ee65833e55 100644 Binary files a/public/images/pokemon/exp/back/880.png and b/public/images/pokemon/exp/back/880.png differ diff --git a/public/images/pokemon/exp/back/881.png b/public/images/pokemon/exp/back/881.png index b0aa597a825..377347f49bc 100644 Binary files a/public/images/pokemon/exp/back/881.png and b/public/images/pokemon/exp/back/881.png differ diff --git a/public/images/pokemon/exp/back/882.png b/public/images/pokemon/exp/back/882.png index 8348a070efd..c2c9b1b302b 100644 Binary files a/public/images/pokemon/exp/back/882.png and b/public/images/pokemon/exp/back/882.png differ diff --git a/public/images/pokemon/exp/back/888-crowned.png b/public/images/pokemon/exp/back/888-crowned.png index 75c78666e4c..4cc454caaa1 100644 Binary files a/public/images/pokemon/exp/back/888-crowned.png and b/public/images/pokemon/exp/back/888-crowned.png differ diff --git a/public/images/pokemon/exp/back/911.png b/public/images/pokemon/exp/back/911.png index 04010c67444..a15676954fc 100644 Binary files a/public/images/pokemon/exp/back/911.png and b/public/images/pokemon/exp/back/911.png differ diff --git a/public/images/pokemon/exp/back/913.png b/public/images/pokemon/exp/back/913.png index aab4dc4e85a..9a33a6de3af 100644 Binary files a/public/images/pokemon/exp/back/913.png and b/public/images/pokemon/exp/back/913.png differ diff --git a/public/images/pokemon/exp/back/914.png b/public/images/pokemon/exp/back/914.png index 5f20730ed79..abf275e24f0 100644 Binary files a/public/images/pokemon/exp/back/914.png and b/public/images/pokemon/exp/back/914.png differ diff --git a/public/images/pokemon/exp/back/954.png b/public/images/pokemon/exp/back/954.png index aa9287c19eb..be75ebbb453 100644 Binary files a/public/images/pokemon/exp/back/954.png and b/public/images/pokemon/exp/back/954.png differ diff --git a/public/images/pokemon/exp/back/970.json b/public/images/pokemon/exp/back/970.json index 9be45f39fd2..a516771c02b 100644 --- a/public/images/pokemon/exp/back/970.json +++ b/public/images/pokemon/exp/back/970.json @@ -1,419 +1,167 @@ -{ - "textures": [ - { - "image": "970.png", - "format": "RGBA8888", - "size": { - "w": 296, - "h": 296 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 59, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 60 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 59, - "h": 60 - }, - "frame": { - "x": 59, - "y": 0, - "w": 59, - "h": 60 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 59, - "h": 62 - }, - "frame": { - "x": 118, - "y": 0, - "w": 59, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 58, - "h": 63 - }, - "frame": { - "x": 177, - "y": 0, - "w": 58, - "h": 63 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 59, - "h": 66 - }, - "frame": { - "x": 235, - "y": 0, - "w": 59, - "h": 66 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 60, - "h": 66 - }, - "frame": { - "x": 0, - "y": 60, - "w": 60, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 59, - "h": 66 - }, - "frame": { - "x": 60, - "y": 62, - "w": 59, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 59, - "h": 67 - }, - "frame": { - "x": 119, - "y": 63, - "w": 59, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 59, - "h": 67 - }, - "frame": { - "x": 178, - "y": 66, - "w": 59, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 59, - "h": 68 - }, - "frame": { - "x": 237, - "y": 66, - "w": 59, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 59, - "h": 68 - }, - "frame": { - "x": 0, - "y": 126, - "w": 59, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 60, - "h": 69 - }, - "frame": { - "x": 59, - "y": 128, - "w": 60, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 69 - }, - "frame": { - "x": 119, - "y": 133, - "w": 61, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 69 - }, - "frame": { - "x": 119, - "y": 133, - "w": 61, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 61, - "h": 69 - }, - "frame": { - "x": 180, - "y": 134, - "w": 61, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 69 - }, - "frame": { - "x": 0, - "y": 197, - "w": 61, - "h": 69 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 69 - }, - "frame": { - "x": 61, - "y": 202, - "w": 61, - "h": 69 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - }, - "frame": { - "x": 122, - "y": 203, - "w": 61, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - }, - "frame": { - "x": 183, - "y": 203, - "w": 61, - "h": 71 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:826f0c54b74572cfb274b9973fbd50bf:a0d3e34e9b94dc843d98c54879e0c70e:97e320d73d4227f4b083688478fb20b2$" - } +{ "textures": [ + { + "image": "970.png", + "format": "RGBA8888", + "size": { "w": 294, "h": 294 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 67 }, + "frame": { "x": 120, "y": 0, "w": 59, "h": 67 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 3, "w": 59, "h": 67 }, + "frame": { "x": 179, "y": 0, "w": 59, "h": 67 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 67 }, + "frame": { "x": 120, "y": 67, "w": 59, "h": 67 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 57, "h": 65 }, + "frame": { "x": 230, "y": 134, "w": 57, "h": 65 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 5, "w": 56, "h": 61 }, + "frame": { "x": 238, "y": 0, "w": 56, "h": 61 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 6, "w": 57, "h": 60 }, + "frame": { "x": 114, "y": 198, "w": 57, "h": 60 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 57, "h": 58 }, + "frame": { "x": 57, "y": 199, "w": 57, "h": 58 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 58, "h": 58 }, + "frame": { "x": 171, "y": 198, "w": 58, "h": 58 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 2, "y": 5, "w": 58, "h": 64 }, + "frame": { "x": 114, "y": 134, "w": 58, "h": 64 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 64 }, + "frame": { "x": 172, "y": 134, "w": 58, "h": 64 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 67 }, + "frame": { "x": 120, "y": 0, "w": 59, "h": 67 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 4, "w": 57, "h": 66 }, + "frame": { "x": 0, "y": 69, "w": 57, "h": 66 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 60, "h": 69 }, + "frame": { "x": 0, "y": 0, "w": 60, "h": 69 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 67 }, + "frame": { "x": 120, "y": 0, "w": 59, "h": 67 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 4, "w": 57, "h": 66 }, + "frame": { "x": 57, "y": 69, "w": 57, "h": 66 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 60, "h": 69 }, + "frame": { "x": 60, "y": 0, "w": 60, "h": 69 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 57, "h": 65 }, + "frame": { "x": 0, "y": 135, "w": 57, "h": 65 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 4, "w": 57, "h": 64 }, + "frame": { "x": 57, "y": 135, "w": 57, "h": 64 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 67 }, + "frame": { "x": 179, "y": 67, "w": 59, "h": 67 } + } + ] +} +], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } } diff --git a/public/images/pokemon/exp/back/970.png b/public/images/pokemon/exp/back/970.png index bd6464a7bfa..533b680c117 100644 Binary files a/public/images/pokemon/exp/back/970.png and b/public/images/pokemon/exp/back/970.png differ diff --git a/public/images/pokemon/exp/back/981.png b/public/images/pokemon/exp/back/981.png index 56537ea96b5..360f4267be5 100644 Binary files a/public/images/pokemon/exp/back/981.png and b/public/images/pokemon/exp/back/981.png differ diff --git a/public/images/pokemon/exp/back/shiny/1001.json b/public/images/pokemon/exp/back/shiny/1001.json index 1ea21ec6995..cf2dd09815d 100644 --- a/public/images/pokemon/exp/back/shiny/1001.json +++ b/public/images/pokemon/exp/back/shiny/1001.json @@ -1,272 +1,140 @@ { - "textures": [ - { - "image": "1001.png", - "format": "RGBA8888", - "size": { - "w": 237, - "h": 237 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 79, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 79, - "h": 78 - }, - "frame": { - "x": 79, - "y": 0, - "w": 79, - "h": 78 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 79, - "h": 78 - }, - "frame": { - "x": 79, - "y": 0, - "w": 79, - "h": 78 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 79, - "h": 76 - }, - "frame": { - "x": 158, - "y": 0, - "w": 79, - "h": 76 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 79, - "h": 76 - }, - "frame": { - "x": 158, - "y": 0, - "w": 79, - "h": 76 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 79, - "h": 75 - }, - "frame": { - "x": 158, - "y": 76, - "w": 79, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 79, - "h": 75 - }, - "frame": { - "x": 158, - "y": 76, - "w": 79, - "h": 75 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 78, - "w": 79, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 78, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 79, - "h": 73 - }, - "frame": { - "x": 0, - "y": 79, - "w": 79, - "h": 73 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 79, - "h": 73 - }, - "frame": { - "x": 0, - "y": 79, - "w": 79, - "h": 73 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 79, - "h": 72 - }, - "frame": { - "x": 158, - "y": 151, - "w": 79, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:83b74b0673ef1ae8346efab60ae89872:f76c930177bf7a296d3f47eb6294ae4f:c8a3fc07f857e38a4f887e43523aab92$" + "textures":[ + { + "image": "1001.png", + "format": "RGBA8888", + "size": { "w": 161, "h": 157 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + } + ]}], + "meta": {"app": "https://www.aseprite.org/","version": "1.3.7-x64" } } diff --git a/public/images/pokemon/exp/back/shiny/1001.png b/public/images/pokemon/exp/back/shiny/1001.png index 6d04c70dbb8..2fd3e5fecd9 100644 Binary files a/public/images/pokemon/exp/back/shiny/1001.png and b/public/images/pokemon/exp/back/shiny/1001.png differ diff --git a/public/images/pokemon/exp/back/shiny/1003.png b/public/images/pokemon/exp/back/shiny/1003.png index 1e1f9c96038..628a1098ab6 100644 Binary files a/public/images/pokemon/exp/back/shiny/1003.png and b/public/images/pokemon/exp/back/shiny/1003.png differ diff --git a/public/images/pokemon/exp/back/shiny/150-mega-x.png b/public/images/pokemon/exp/back/shiny/150-mega-x.png index daecd9bf7b5..eca55d70313 100644 Binary files a/public/images/pokemon/exp/back/shiny/150-mega-x.png and b/public/images/pokemon/exp/back/shiny/150-mega-x.png differ diff --git a/public/images/pokemon/exp/back/shiny/257-mega.png b/public/images/pokemon/exp/back/shiny/257-mega.png index 41e27241527..47725c71073 100644 Binary files a/public/images/pokemon/exp/back/shiny/257-mega.png and b/public/images/pokemon/exp/back/shiny/257-mega.png differ diff --git a/public/images/pokemon/exp/back/shiny/380-mega.png b/public/images/pokemon/exp/back/shiny/380-mega.png index b2450dd0b9e..6efdf36e4cb 100644 Binary files a/public/images/pokemon/exp/back/shiny/380-mega.png and b/public/images/pokemon/exp/back/shiny/380-mega.png differ diff --git a/public/images/pokemon/exp/back/shiny/381-mega.png b/public/images/pokemon/exp/back/shiny/381-mega.png index 2625284e972..9c0c182235b 100644 Binary files a/public/images/pokemon/exp/back/shiny/381-mega.png and b/public/images/pokemon/exp/back/shiny/381-mega.png differ diff --git a/public/images/pokemon/exp/back/shiny/4080.png b/public/images/pokemon/exp/back/shiny/4080.png index 98825c118a7..e70503a7820 100644 Binary files a/public/images/pokemon/exp/back/shiny/4080.png and b/public/images/pokemon/exp/back/shiny/4080.png differ diff --git a/public/images/pokemon/exp/back/shiny/698.png b/public/images/pokemon/exp/back/shiny/698.png index 57662779622..781f363220a 100644 Binary files a/public/images/pokemon/exp/back/shiny/698.png and b/public/images/pokemon/exp/back/shiny/698.png differ diff --git a/public/images/pokemon/exp/back/shiny/699.png b/public/images/pokemon/exp/back/shiny/699.png index b51b5866fed..0a17af2f53f 100644 Binary files a/public/images/pokemon/exp/back/shiny/699.png and b/public/images/pokemon/exp/back/shiny/699.png differ diff --git a/public/images/pokemon/exp/back/shiny/745-midnight.png b/public/images/pokemon/exp/back/shiny/745-midnight.png index 94a9c328d01..a7d7e0497b5 100644 Binary files a/public/images/pokemon/exp/back/shiny/745-midnight.png and b/public/images/pokemon/exp/back/shiny/745-midnight.png differ diff --git a/public/images/pokemon/exp/back/shiny/774-blue.png b/public/images/pokemon/exp/back/shiny/774-blue.png index dba2d268b0d..bffbc41e81c 100644 Binary files a/public/images/pokemon/exp/back/shiny/774-blue.png and b/public/images/pokemon/exp/back/shiny/774-blue.png differ diff --git a/public/images/pokemon/exp/back/shiny/774-green.png b/public/images/pokemon/exp/back/shiny/774-green.png index 59ae18f321c..f5a85c1ba0f 100644 Binary files a/public/images/pokemon/exp/back/shiny/774-green.png and b/public/images/pokemon/exp/back/shiny/774-green.png differ diff --git a/public/images/pokemon/exp/back/shiny/774-indigo.png b/public/images/pokemon/exp/back/shiny/774-indigo.png index 25984abc9c2..115365f11b8 100644 Binary files a/public/images/pokemon/exp/back/shiny/774-indigo.png and b/public/images/pokemon/exp/back/shiny/774-indigo.png differ diff --git a/public/images/pokemon/exp/back/shiny/774-orange.png b/public/images/pokemon/exp/back/shiny/774-orange.png index a6a13f0ab7d..bf3db830ef8 100644 Binary files a/public/images/pokemon/exp/back/shiny/774-orange.png and b/public/images/pokemon/exp/back/shiny/774-orange.png differ diff --git a/public/images/pokemon/exp/back/shiny/774-red.png b/public/images/pokemon/exp/back/shiny/774-red.png index e3db7f30002..bc3407019f8 100644 Binary files a/public/images/pokemon/exp/back/shiny/774-red.png and b/public/images/pokemon/exp/back/shiny/774-red.png differ diff --git a/public/images/pokemon/exp/back/shiny/774-violet.png b/public/images/pokemon/exp/back/shiny/774-violet.png index 25984abc9c2..68da27cc960 100644 Binary files a/public/images/pokemon/exp/back/shiny/774-violet.png and b/public/images/pokemon/exp/back/shiny/774-violet.png differ diff --git a/public/images/pokemon/exp/back/shiny/774-yellow.png b/public/images/pokemon/exp/back/shiny/774-yellow.png index bdeaccaf3d8..569b836a207 100644 Binary files a/public/images/pokemon/exp/back/shiny/774-yellow.png and b/public/images/pokemon/exp/back/shiny/774-yellow.png differ diff --git a/public/images/pokemon/exp/back/shiny/80-mega.png b/public/images/pokemon/exp/back/shiny/80-mega.png index e8bc4ea5a02..12e88cdb937 100644 Binary files a/public/images/pokemon/exp/back/shiny/80-mega.png and b/public/images/pokemon/exp/back/shiny/80-mega.png differ diff --git a/public/images/pokemon/exp/back/shiny/821.png b/public/images/pokemon/exp/back/shiny/821.png index 426a1e81fea..d069d59ef72 100644 Binary files a/public/images/pokemon/exp/back/shiny/821.png and b/public/images/pokemon/exp/back/shiny/821.png differ diff --git a/public/images/pokemon/exp/back/shiny/823.png b/public/images/pokemon/exp/back/shiny/823.png index 81b3a07a6da..09c06f2aeb6 100644 Binary files a/public/images/pokemon/exp/back/shiny/823.png and b/public/images/pokemon/exp/back/shiny/823.png differ diff --git a/public/images/pokemon/exp/back/shiny/867.png b/public/images/pokemon/exp/back/shiny/867.png index 7be80836150..9821217341e 100644 Binary files a/public/images/pokemon/exp/back/shiny/867.png and b/public/images/pokemon/exp/back/shiny/867.png differ diff --git a/public/images/pokemon/exp/back/shiny/888-crowned.png b/public/images/pokemon/exp/back/shiny/888-crowned.png index a8204c34ebe..b3eb012e3c8 100644 Binary files a/public/images/pokemon/exp/back/shiny/888-crowned.png and b/public/images/pokemon/exp/back/shiny/888-crowned.png differ diff --git a/public/images/pokemon/exp/back/shiny/911.png b/public/images/pokemon/exp/back/shiny/911.png index 46b513ba014..948f8a3ae12 100644 Binary files a/public/images/pokemon/exp/back/shiny/911.png and b/public/images/pokemon/exp/back/shiny/911.png differ diff --git a/public/images/pokemon/exp/back/shiny/913.png b/public/images/pokemon/exp/back/shiny/913.png index dd802869193..07838b5d996 100644 Binary files a/public/images/pokemon/exp/back/shiny/913.png and b/public/images/pokemon/exp/back/shiny/913.png differ diff --git a/public/images/pokemon/exp/back/shiny/914.png b/public/images/pokemon/exp/back/shiny/914.png index 92d7c68f715..2f0510312bb 100644 Binary files a/public/images/pokemon/exp/back/shiny/914.png and b/public/images/pokemon/exp/back/shiny/914.png differ diff --git a/public/images/pokemon/exp/back/shiny/954.png b/public/images/pokemon/exp/back/shiny/954.png index d282fb1d096..3d2111bd99e 100644 Binary files a/public/images/pokemon/exp/back/shiny/954.png and b/public/images/pokemon/exp/back/shiny/954.png differ diff --git a/public/images/pokemon/exp/back/shiny/970.json b/public/images/pokemon/exp/back/shiny/970.json index 9be45f39fd2..a516771c02b 100644 --- a/public/images/pokemon/exp/back/shiny/970.json +++ b/public/images/pokemon/exp/back/shiny/970.json @@ -1,419 +1,167 @@ -{ - "textures": [ - { - "image": "970.png", - "format": "RGBA8888", - "size": { - "w": 296, - "h": 296 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 59, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 60 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 59, - "h": 60 - }, - "frame": { - "x": 59, - "y": 0, - "w": 59, - "h": 60 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 59, - "h": 62 - }, - "frame": { - "x": 118, - "y": 0, - "w": 59, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 58, - "h": 63 - }, - "frame": { - "x": 177, - "y": 0, - "w": 58, - "h": 63 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 59, - "h": 66 - }, - "frame": { - "x": 235, - "y": 0, - "w": 59, - "h": 66 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 60, - "h": 66 - }, - "frame": { - "x": 0, - "y": 60, - "w": 60, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 59, - "h": 66 - }, - "frame": { - "x": 60, - "y": 62, - "w": 59, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 59, - "h": 67 - }, - "frame": { - "x": 119, - "y": 63, - "w": 59, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 59, - "h": 67 - }, - "frame": { - "x": 178, - "y": 66, - "w": 59, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 59, - "h": 68 - }, - "frame": { - "x": 237, - "y": 66, - "w": 59, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 59, - "h": 68 - }, - "frame": { - "x": 0, - "y": 126, - "w": 59, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 60, - "h": 69 - }, - "frame": { - "x": 59, - "y": 128, - "w": 60, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 69 - }, - "frame": { - "x": 119, - "y": 133, - "w": 61, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 69 - }, - "frame": { - "x": 119, - "y": 133, - "w": 61, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 61, - "h": 69 - }, - "frame": { - "x": 180, - "y": 134, - "w": 61, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 69 - }, - "frame": { - "x": 0, - "y": 197, - "w": 61, - "h": 69 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 69 - }, - "frame": { - "x": 61, - "y": 202, - "w": 61, - "h": 69 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - }, - "frame": { - "x": 122, - "y": 203, - "w": 61, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - }, - "frame": { - "x": 183, - "y": 203, - "w": 61, - "h": 71 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:826f0c54b74572cfb274b9973fbd50bf:a0d3e34e9b94dc843d98c54879e0c70e:97e320d73d4227f4b083688478fb20b2$" - } +{ "textures": [ + { + "image": "970.png", + "format": "RGBA8888", + "size": { "w": 294, "h": 294 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 67 }, + "frame": { "x": 120, "y": 0, "w": 59, "h": 67 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 3, "w": 59, "h": 67 }, + "frame": { "x": 179, "y": 0, "w": 59, "h": 67 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 67 }, + "frame": { "x": 120, "y": 67, "w": 59, "h": 67 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 57, "h": 65 }, + "frame": { "x": 230, "y": 134, "w": 57, "h": 65 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 5, "w": 56, "h": 61 }, + "frame": { "x": 238, "y": 0, "w": 56, "h": 61 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 6, "w": 57, "h": 60 }, + "frame": { "x": 114, "y": 198, "w": 57, "h": 60 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 57, "h": 58 }, + "frame": { "x": 57, "y": 199, "w": 57, "h": 58 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 58, "h": 58 }, + "frame": { "x": 171, "y": 198, "w": 58, "h": 58 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 2, "y": 5, "w": 58, "h": 64 }, + "frame": { "x": 114, "y": 134, "w": 58, "h": 64 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 64 }, + "frame": { "x": 172, "y": 134, "w": 58, "h": 64 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 67 }, + "frame": { "x": 120, "y": 0, "w": 59, "h": 67 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 4, "w": 57, "h": 66 }, + "frame": { "x": 0, "y": 69, "w": 57, "h": 66 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 60, "h": 69 }, + "frame": { "x": 0, "y": 0, "w": 60, "h": 69 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 67 }, + "frame": { "x": 120, "y": 0, "w": 59, "h": 67 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 4, "w": 57, "h": 66 }, + "frame": { "x": 57, "y": 69, "w": 57, "h": 66 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 60, "h": 69 }, + "frame": { "x": 60, "y": 0, "w": 60, "h": 69 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 57, "h": 65 }, + "frame": { "x": 0, "y": 135, "w": 57, "h": 65 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 4, "w": 57, "h": 64 }, + "frame": { "x": 57, "y": 135, "w": 57, "h": 64 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 61, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 67 }, + "frame": { "x": 179, "y": 67, "w": 59, "h": 67 } + } + ] +} +], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } } diff --git a/public/images/pokemon/exp/back/shiny/970.png b/public/images/pokemon/exp/back/shiny/970.png index 1d092da94cd..03ed35af776 100644 Binary files a/public/images/pokemon/exp/back/shiny/970.png and b/public/images/pokemon/exp/back/shiny/970.png differ diff --git a/public/images/pokemon/exp/back/shiny/981.png b/public/images/pokemon/exp/back/shiny/981.png index bd3d8c731ac..90a25d7eca3 100644 Binary files a/public/images/pokemon/exp/back/shiny/981.png and b/public/images/pokemon/exp/back/shiny/981.png differ diff --git a/public/images/pokemon/exp/female/916.png b/public/images/pokemon/exp/female/916.png deleted file mode 100644 index 314062011c1..00000000000 Binary files a/public/images/pokemon/exp/female/916.png and /dev/null 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/exp/shiny/1003.png b/public/images/pokemon/exp/shiny/1003.png index 03bbd47755c..6fab9bfe143 100644 Binary files a/public/images/pokemon/exp/shiny/1003.png and b/public/images/pokemon/exp/shiny/1003.png differ diff --git a/public/images/pokemon/exp/shiny/4077.png b/public/images/pokemon/exp/shiny/4077.png index f2f5891883d..ab414e058e1 100644 Binary files a/public/images/pokemon/exp/shiny/4077.png and b/public/images/pokemon/exp/shiny/4077.png differ diff --git a/public/images/pokemon/exp/shiny/4080.png b/public/images/pokemon/exp/shiny/4080.png index 9fde8305773..9c383118928 100644 Binary files a/public/images/pokemon/exp/shiny/4080.png and b/public/images/pokemon/exp/shiny/4080.png differ diff --git a/public/images/pokemon/exp/shiny/4083.json b/public/images/pokemon/exp/shiny/4083.json index 3b08d82cc72..26ced14739b 100644 --- a/public/images/pokemon/exp/shiny/4083.json +++ b/public/images/pokemon/exp/shiny/4083.json @@ -1,1595 +1,616 @@ { - "textures": [ - { - "image": "4083.png", - "format": "RGBA8888", - "size": { - "w": 276, - "h": 276 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 48 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 0, - "y": 48, - "w": 88, - "h": 46 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 0, - "y": 48, - "w": 88, - "h": 46 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 81, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 88, - "y": 46, - "w": 88, - "h": 46 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 169, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 169, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 88, - "y": 92, - "w": 86, - "h": 46 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 86, - "h": 46 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 86, - "h": 46 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 86, - "y": 138, - "w": 86, - "h": 46 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 140, - "w": 86, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 140, - "w": 86, - "h": 46 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 46 - }, - "frame": { - "x": 172, - "y": 138, - "w": 85, - "h": 46 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 46 - }, - "frame": { - "x": 172, - "y": 138, - "w": 85, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 83, - "y": 230, - "w": 83, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 83, - "y": 230, - "w": 83, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4ad56d9607be6aa947d6e44195a90329:4e05bca229cb6af4241ccb9cf6b54cc3:c8e39c2aa3816f24d9e5ee92c7ddf6b0$" - } + "textures": [ + { + "image": "4083.png", + "format": "RGBA8888", + "size": { "w": 264, "h": 240 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } } diff --git a/public/images/pokemon/exp/shiny/4083.png b/public/images/pokemon/exp/shiny/4083.png index 4fd8c0e36a1..40d6c6cc50f 100644 Binary files a/public/images/pokemon/exp/shiny/4083.png and b/public/images/pokemon/exp/shiny/4083.png differ diff --git a/public/images/pokemon/exp/shiny/670-blue.json b/public/images/pokemon/exp/shiny/670-blue.json index efead949c9b..ba237724cbc 100644 --- a/public/images/pokemon/exp/shiny/670-blue.json +++ b/public/images/pokemon/exp/shiny/670-blue.json @@ -4,219 +4,156 @@ "image": "670-blue.png", "format": "RGBA8888", "size": { - "w": 132, - "h": 132 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 65 } }, { - "filename": "0006.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, + "x": 3, + "y": 9, + "w": 60, "h": 67 }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, + "x": 60, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0003.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 5, + "w": 60, + "h": 67 }, "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 + "x": 120, + "y": 0, + "w": 60, + "h": 67 } }, { - "filename": "0005.png", + "filename": "0082.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 10, + "w": 61, + "h": 68 }, "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, + "x": 180, "y": 0, - "w": 39, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 + "w": 61, + "h": 68 } }, { - "filename": "0011.png", + "filename": "0100.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, + "x": 5, "y": 2, - "w": 40, - "h": 65 + "w": 60, + "h": 68 }, "frame": { - "x": 79, - "y": 66, - "w": 40, - "h": 65 + "x": 241, + "y": 0, + "w": 60, + "h": 68 } }, { - "filename": "0007.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 65 + "x": 4, + "y": 12, + "w": 62, + "h": 69 }, "frame": { - "x": 79, - "y": 66, - "w": 40, - "h": 65 + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 } }, { @@ -224,20 +161,1763 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 56, + "h": 70 + }, + "frame": { + "x": 59, + "y": 67, + "w": 56, + "h": 70 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 70 + }, + "frame": { + "x": 115, + "y": 67, + "w": 57, + "h": 70 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 57, + "h": 70 + }, + "frame": { + "x": 172, + "y": 68, + "w": 57, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 53, + "y": 137, + "w": 61, + "h": 73 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 73 + }, + "frame": { + "x": 114, + "y": 137, + "w": 54, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, + "y": 139, + "w": 61, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 52, + "h": 74 + }, + "frame": { + "x": 339, + "y": 141, + "w": 52, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 38, - "h": 65 + "y": 4, + "w": 51, + "h": 76 }, "frame": { - "x": 80, - "y": 0, - "w": 38, - "h": 65 + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 53, + "h": 76 + }, + "frame": { + "x": 265, + "y": 214, + "w": 53, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 } }, { @@ -245,20 +1925,587 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 51, + "h": 77 + }, + "frame": { + "x": 419, + "y": 217, + "w": 51, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 47, + "h": 77 + }, + "frame": { + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 50, + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 48, + "h": 78 + }, + "frame": { + "x": 259, + "y": 290, + "w": 48, + "h": 78 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 38, - "h": 65 + "y": 3, + "w": 45, + "h": 79 }, "frame": { - "x": 80, - "y": 0, - "w": 38, - "h": 65 + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 48, + "h": 79 + }, + "frame": { + "x": 44, + "y": 362, + "w": 48, + "h": 79 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 48, + "h": 79 + }, + "frame": { + "x": 92, + "y": 363, + "w": 48, + "h": 79 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 48, + "h": 79 + }, + "frame": { + "x": 140, + "y": 364, + "w": 48, + "h": 79 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 48, + "h": 79 + }, + "frame": { + "x": 188, + "y": 366, + "w": 48, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 46, + "h": 80 + }, + "frame": { + "x": 236, + "y": 368, + "w": 46, + "h": 80 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 47, + "h": 80 + }, + "frame": { + "x": 282, + "y": 370, + "w": 47, + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -266,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:36694a5c0e14e2bcf35d63ad72dd1f6d:3a1ea08b2c0badd5e308726fb0dab395:f28e65cb64de91b1773f7b4998e488a5$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/shiny/670-blue.png b/public/images/pokemon/exp/shiny/670-blue.png index 005a482bca3..0b9d95f232f 100644 Binary files a/public/images/pokemon/exp/shiny/670-blue.png and b/public/images/pokemon/exp/shiny/670-blue.png differ diff --git a/public/images/pokemon/exp/shiny/670-orange.json b/public/images/pokemon/exp/shiny/670-orange.json index 0f6043e12c5..ded85695da2 100644 --- a/public/images/pokemon/exp/shiny/670-orange.json +++ b/public/images/pokemon/exp/shiny/670-orange.json @@ -4,219 +4,156 @@ "image": "670-orange.png", "format": "RGBA8888", "size": { - "w": 132, - "h": 132 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 65 } }, { - "filename": "0006.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, + "x": 3, + "y": 9, + "w": 60, "h": 67 }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, + "x": 60, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0003.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 5, + "w": 60, + "h": 67 }, "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 + "x": 120, + "y": 0, + "w": 60, + "h": 67 } }, { - "filename": "0005.png", + "filename": "0082.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 10, + "w": 61, + "h": 68 }, "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, + "x": 180, "y": 0, - "w": 39, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 + "w": 61, + "h": 68 } }, { - "filename": "0011.png", + "filename": "0100.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, + "x": 5, "y": 2, - "w": 40, - "h": 65 + "w": 60, + "h": 68 }, "frame": { - "x": 79, - "y": 66, - "w": 40, - "h": 65 + "x": 241, + "y": 0, + "w": 60, + "h": 68 } }, { - "filename": "0007.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 65 + "x": 4, + "y": 12, + "w": 62, + "h": 69 }, "frame": { - "x": 79, - "y": 66, - "w": 40, - "h": 65 + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 } }, { @@ -224,20 +161,1763 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 56, + "h": 70 + }, + "frame": { + "x": 59, + "y": 67, + "w": 56, + "h": 70 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 70 + }, + "frame": { + "x": 115, + "y": 67, + "w": 57, + "h": 70 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 57, + "h": 70 + }, + "frame": { + "x": 172, + "y": 68, + "w": 57, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 53, + "y": 137, + "w": 61, + "h": 73 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 73 + }, + "frame": { + "x": 114, + "y": 137, + "w": 54, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, + "y": 139, + "w": 61, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 52, + "h": 74 + }, + "frame": { + "x": 339, + "y": 141, + "w": 52, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 38, - "h": 65 + "y": 4, + "w": 51, + "h": 76 }, "frame": { - "x": 80, - "y": 0, - "w": 38, - "h": 65 + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 53, + "h": 76 + }, + "frame": { + "x": 265, + "y": 214, + "w": 53, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 } }, { @@ -245,20 +1925,587 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 51, + "h": 77 + }, + "frame": { + "x": 419, + "y": 217, + "w": 51, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 47, + "h": 77 + }, + "frame": { + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 50, + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 48, + "h": 78 + }, + "frame": { + "x": 259, + "y": 290, + "w": 48, + "h": 78 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 38, - "h": 65 + "y": 3, + "w": 45, + "h": 79 }, "frame": { - "x": 80, - "y": 0, - "w": 38, - "h": 65 + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 48, + "h": 79 + }, + "frame": { + "x": 44, + "y": 362, + "w": 48, + "h": 79 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 48, + "h": 79 + }, + "frame": { + "x": 92, + "y": 363, + "w": 48, + "h": 79 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 48, + "h": 79 + }, + "frame": { + "x": 140, + "y": 364, + "w": 48, + "h": 79 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 48, + "h": 79 + }, + "frame": { + "x": 188, + "y": 366, + "w": 48, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 46, + "h": 80 + }, + "frame": { + "x": 236, + "y": 368, + "w": 46, + "h": 80 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 47, + "h": 80 + }, + "frame": { + "x": 282, + "y": 370, + "w": 47, + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -266,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a63935896af8b0a45c2a96144ad240db:0991e6604fcdd7ce0b2b0f12f8c7d0fc:a4ae1870548474db9c466580d9a207bb$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/shiny/670-orange.png b/public/images/pokemon/exp/shiny/670-orange.png index e0f9cbf2378..e86c6d9e230 100644 Binary files a/public/images/pokemon/exp/shiny/670-orange.png and b/public/images/pokemon/exp/shiny/670-orange.png differ diff --git a/public/images/pokemon/exp/shiny/670-red.json b/public/images/pokemon/exp/shiny/670-red.json index 53390cee950..098b0efca76 100644 --- a/public/images/pokemon/exp/shiny/670-red.json +++ b/public/images/pokemon/exp/shiny/670-red.json @@ -4,517 +4,13 @@ "image": "670-red.png", "format": "RGBA8888", "size": { - "w": 512, - "h": 512 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 63, - "h": 72 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 12, - "w": 61, - "h": 73 - }, - "frame": { - "x": 63, - "y": 0, - "w": 61, - "h": 73 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 71 - }, - "frame": { - "x": 0, - "y": 144, - "w": 63, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 71 - }, - "frame": { - "x": 0, - "y": 144, - "w": 63, - "h": 71 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 71 - }, - "frame": { - "x": 0, - "y": 144, - "w": 63, - "h": 71 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 71 - }, - "frame": { - "x": 0, - "y": 144, - "w": 63, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 71 - }, - "frame": { - "x": 0, - "y": 144, - "w": 63, - "h": 71 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 71 - }, - "frame": { - "x": 0, - "y": 144, - "w": 63, - "h": 71 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 71 - }, - "frame": { - "x": 0, - "y": 144, - "w": 63, - "h": 71 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 12, - "w": 61, - "h": 73 - }, - "frame": { - "x": 63, - "y": 73, - "w": 61, - "h": 73 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 12, - "w": 61, - "h": 73 - }, - "frame": { - "x": 63, - "y": 73, - "w": 61, - "h": 73 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 12, - "w": 61, - "h": 73 - }, - "frame": { - "x": 63, - "y": 73, - "w": 61, - "h": 73 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 12, - "w": 61, - "h": 73 - }, - "frame": { - "x": 63, - "y": 73, - "w": 61, - "h": 73 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 12, - "w": 61, - "h": 73 - }, - "frame": { - "x": 63, - "y": 73, - "w": 61, - "h": 73 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 12, - "w": 61, - "h": 73 - }, - "frame": { - "x": 63, - "y": 73, - "w": 61, - "h": 73 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 12, - "w": 61, - "h": 73 - }, - "frame": { - "x": 124, - "y": 0, - "w": 61, - "h": 73 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 13, - "w": 63, - "h": 71 - }, - "frame": { - "x": 0, - "y": 215, - "w": 63, - "h": 71 - } - }, - { - "filename": "0004.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -523,166 +19,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 11, - "w": 62, - "h": 70 - }, - "frame": { - "x": 185, - "y": 0, - "w": 62, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 70 - }, - "frame": { - "x": 185, - "y": 0, - "w": 62, - "h": 70 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 70 - }, - "frame": { - "x": 185, - "y": 0, - "w": 62, - "h": 70 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 70 - }, - "frame": { - "x": 185, - "y": 0, - "w": 62, - "h": 70 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 70 - }, - "frame": { - "x": 185, - "y": 0, - "w": 62, - "h": 70 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 70 - }, - "frame": { - "x": 185, - "y": 0, - "w": 62, - "h": 70 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 70 + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, - "y": 286, - "w": 62, - "h": 70 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 7, "y": 0, - "w": 55, - "h": 77 - }, - "frame": { - "x": 63, - "y": 146, - "w": 55, - "h": 77 + "w": 60, + "h": 65 } }, { - "filename": "0119.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -691,19 +40,19 @@ }, "spriteSourceSize": { "x": 3, - "y": 11, - "w": 57, - "h": 75 + "y": 9, + "w": 60, + "h": 67 }, "frame": { - "x": 0, - "y": 356, - "w": 57, - "h": 75 + "x": 60, + "y": 0, + "w": 60, + "h": 67 } }, { - "filename": "0092.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -711,58 +60,16 @@ "h": 86 }, "spriteSourceSize": { - "x": 6, + "x": 4, "y": 5, - "w": 48, - "h": 81 + "w": 60, + "h": 67 }, "frame": { - "x": 0, - "y": 431, - "w": 48, - "h": 81 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 12, - "w": 62, - "h": 69 - }, - "frame": { - "x": 247, + "x": 120, "y": 0, - "w": 62, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 59, - "h": 70 - }, - "frame": { - "x": 124, - "y": 73, - "w": 59, - "h": 70 + "w": 60, + "h": 67 } }, { @@ -780,7 +87,7 @@ "h": 68 }, "frame": { - "x": 309, + "x": 180, "y": 0, "w": 61, "h": 68 @@ -801,12 +108,222 @@ "h": 68 }, "frame": { - "x": 370, + "x": 241, "y": 0, "w": 60, "h": 68 } }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, + "w": 62, + "h": 69 + }, + "frame": { + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, { "filename": "0016.png", "rotated": false, @@ -822,159 +339,12 @@ "h": 70 }, "frame": { - "x": 430, - "y": 0, + "x": 0, + "y": 65, "w": 59, "h": 70 } }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 9, - "w": 55, - "h": 76 - }, - "frame": { - "x": 63, - "y": 223, - "w": 55, - "h": 76 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 9, - "w": 55, - "h": 76 - }, - "frame": { - "x": 63, - "y": 223, - "w": 55, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 9, - "w": 55, - "h": 76 - }, - "frame": { - "x": 63, - "y": 223, - "w": 55, - "h": 76 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 9, - "w": 55, - "h": 76 - }, - "frame": { - "x": 63, - "y": 223, - "w": 55, - "h": 76 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 9, - "w": 55, - "h": 76 - }, - "frame": { - "x": 63, - "y": 223, - "w": 55, - "h": 76 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 9, - "w": 55, - "h": 76 - }, - "frame": { - "x": 63, - "y": 223, - "w": 55, - "h": 76 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 9, - "w": 55, - "h": 76 - }, - "frame": { - "x": 63, - "y": 223, - "w": 55, - "h": 76 - } - }, { "filename": "0027.png", "rotated": false, @@ -990,8 +360,8 @@ "h": 70 }, "frame": { - "x": 62, - "y": 299, + "x": 0, + "y": 65, "w": 59, "h": 70 } @@ -1011,8 +381,8 @@ "h": 70 }, "frame": { - "x": 62, - "y": 299, + "x": 0, + "y": 65, "w": 59, "h": 70 } @@ -1032,8 +402,8 @@ "h": 70 }, "frame": { - "x": 62, - "y": 299, + "x": 0, + "y": 65, "w": 59, "h": 70 } @@ -1053,8 +423,8 @@ "h": 70 }, "frame": { - "x": 62, - "y": 299, + "x": 0, + "y": 65, "w": 59, "h": 70 } @@ -1074,138 +444,12 @@ "h": 70 }, "frame": { - "x": 62, - "y": 299, + "x": 0, + "y": 65, "w": 59, "h": 70 } }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 9, - "w": 60, - "h": 67 - }, - "frame": { - "x": 57, - "y": 369, - "w": 60, - "h": 67 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 10, - "w": 53, - "h": 76 - }, - "frame": { - "x": 48, - "y": 436, - "w": 53, - "h": 76 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 51, - "h": 76 - }, - "frame": { - "x": 101, - "y": 436, - "w": 51, - "h": 76 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 60, - "h": 67 - }, - "frame": { - "x": 117, - "y": 369, - "w": 60, - "h": 67 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 10, - "w": 51, - "h": 76 - }, - "frame": { - "x": 152, - "y": 436, - "w": 51, - "h": 76 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 43, - "h": 82 - }, - "frame": { - "x": 118, - "y": 146, - "w": 43, - "h": 82 - } - }, { "filename": "0085.png", "rotated": false, @@ -1221,8 +465,8 @@ "h": 70 }, "frame": { - "x": 118, - "y": 228, + "x": 59, + "y": 67, "w": 56, "h": 70 } @@ -1242,35 +486,14 @@ "h": 70 }, "frame": { - "x": 121, - "y": 298, + "x": 115, + "y": 67, "w": 57, "h": 70 } }, { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 44, - "h": 80 - }, - "frame": { - "x": 161, - "y": 143, - "w": 44, - "h": 80 - } - }, - { - "filename": "0008.png", + "filename": "0103.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1279,19 +502,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 2, - "w": 47, - "h": 75 + "y": 4, + "w": 57, + "h": 70 }, "frame": { - "x": 174, - "y": 223, - "w": 47, - "h": 75 + "x": 172, + "y": 68, + "w": 57, + "h": 70 } }, { - "filename": "0019.png", + "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1299,16 +522,331 @@ "h": 86 }, "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 47, - "h": 75 + "x": 3, + "y": 13, + "w": 63, + "h": 71 }, "frame": { - "x": 174, - "y": 223, - "w": 47, - "h": 75 + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 } }, { @@ -1326,8 +864,8 @@ "h": 73 }, "frame": { - "x": 178, - "y": 298, + "x": 0, + "y": 135, "w": 53, "h": 73 } @@ -1347,8 +885,8 @@ "h": 73 }, "frame": { - "x": 178, - "y": 298, + "x": 0, + "y": 135, "w": 53, "h": 73 } @@ -1368,8 +906,8 @@ "h": 73 }, "frame": { - "x": 178, - "y": 298, + "x": 0, + "y": 135, "w": 53, "h": 73 } @@ -1389,8 +927,8 @@ "h": 73 }, "frame": { - "x": 178, - "y": 298, + "x": 0, + "y": 135, "w": 53, "h": 73 } @@ -1410,8 +948,8 @@ "h": 73 }, "frame": { - "x": 178, - "y": 298, + "x": 0, + "y": 135, "w": 53, "h": 73 } @@ -1431,8 +969,8 @@ "h": 73 }, "frame": { - "x": 178, - "y": 298, + "x": 0, + "y": 135, "w": 53, "h": 73 } @@ -1452,35 +990,14 @@ "h": 73 }, "frame": { - "x": 178, - "y": 298, + "x": 0, + "y": 135, "w": 53, "h": 73 } }, { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 60, - "h": 65 - }, - "frame": { - "x": 177, - "y": 371, - "w": 60, - "h": 65 - } - }, - { - "filename": "0116.png", + "filename": "0001.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1489,162 +1006,15 @@ }, "spriteSourceSize": { "x": 3, - "y": 10, - "w": 51, - "h": 76 + "y": 12, + "w": 61, + "h": 73 }, "frame": { - "x": 203, - "y": 436, - "w": 51, - "h": 76 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 57, - "h": 70 - }, - "frame": { - "x": 183, - "y": 73, - "w": 57, - "h": 70 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 46, - "h": 80 - }, - "frame": { - "x": 205, - "y": 143, - "w": 46, - "h": 80 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 47, - "h": 75 - }, - "frame": { - "x": 221, - "y": 223, - "w": 47, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 47, - "h": 75 - }, - "frame": { - "x": 221, - "y": 223, - "w": 47, - "h": 75 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 47, - "h": 75 - }, - "frame": { - "x": 221, - "y": 223, - "w": 47, - "h": 75 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 47, - "h": 75 - }, - "frame": { - "x": 221, - "y": 223, - "w": 47, - "h": 75 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 47, - "h": 75 - }, - "frame": { - "x": 221, - "y": 223, - "w": 47, - "h": 75 + "x": 53, + "y": 137, + "w": 61, + "h": 73 } }, { @@ -1662,14 +1032,14 @@ "h": 73 }, "frame": { - "x": 231, - "y": 298, + "x": 114, + "y": 137, "w": 54, "h": 73 } }, { - "filename": "0084.png", + "filename": "0012.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1678,19 +1048,19 @@ }, "spriteSourceSize": { "x": 3, - "y": 7, - "w": 56, - "h": 69 + "y": 12, + "w": 61, + "h": 73 }, "frame": { - "x": 240, - "y": 70, - "w": 56, - "h": 69 + "x": 168, + "y": 138, + "w": 61, + "h": 73 } }, { - "filename": "0091.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1699,36 +1069,120 @@ }, "spriteSourceSize": { "x": 3, - "y": 6, - "w": 47, - "h": 80 + "y": 12, + "w": 61, + "h": 73 }, "frame": { - "x": 251, + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, "y": 139, - "w": 47, - "h": 80 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 79 - }, - "frame": { - "x": 268, - "y": 219, - "w": 45, - "h": 79 + "w": 61, + "h": 73 } }, { @@ -1746,8 +1200,8 @@ "h": 74 }, "frame": { - "x": 285, - "y": 298, + "x": 290, + "y": 140, "w": 49, "h": 74 } @@ -1767,8 +1221,8 @@ "h": 74 }, "frame": { - "x": 285, - "y": 298, + "x": 290, + "y": 140, "w": 49, "h": 74 } @@ -1788,8 +1242,8 @@ "h": 74 }, "frame": { - "x": 285, - "y": 298, + "x": 290, + "y": 140, "w": 49, "h": 74 } @@ -1809,8 +1263,8 @@ "h": 74 }, "frame": { - "x": 285, - "y": 298, + "x": 290, + "y": 140, "w": 49, "h": 74 } @@ -1830,8 +1284,8 @@ "h": 74 }, "frame": { - "x": 285, - "y": 298, + "x": 290, + "y": 140, "w": 49, "h": 74 } @@ -1851,8 +1305,8 @@ "h": 74 }, "frame": { - "x": 285, - "y": 298, + "x": 290, + "y": 140, "w": 49, "h": 74 } @@ -1872,33 +1326,12 @@ "h": 74 }, "frame": { - "x": 285, - "y": 298, + "x": 290, + "y": 140, "w": 49, "h": 74 } }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 54, - "h": 77 - }, - "frame": { - "x": 309, - "y": 68, - "w": 54, - "h": 77 - } - }, { "filename": "0104.png", "rotated": false, @@ -1914,14 +1347,14 @@ "h": 74 }, "frame": { - "x": 298, - "y": 145, + "x": 339, + "y": 141, "w": 52, "h": 74 } }, { - "filename": "0093.png", + "filename": "0008.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1929,20 +1362,209 @@ "h": 86 }, "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 49, - "h": 79 + "x": 4, + "y": 2, + "w": 47, + "h": 75 }, "frame": { - "x": 313, - "y": 219, - "w": 49, - "h": 79 + "x": 391, + "y": 142, + "w": 47, + "h": 75 } }, { - "filename": "0118.png", + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 51, + "h": 76 + }, + "frame": { + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 + } + }, + { + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -1952,161 +1574,203 @@ "spriteSourceSize": { "x": 3, "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, "w": 53, - "h": 77 + "h": 76 }, "frame": { - "x": 363, - "y": 68, + "x": 265, + "y": 214, "w": 53, - "h": 77 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 52, - "h": 77 - }, - "frame": { - "x": 416, - "y": 70, - "w": 52, - "h": 77 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 52, - "h": 77 - }, - "frame": { - "x": 416, - "y": 70, - "w": 52, - "h": 77 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 52, - "h": 77 - }, - "frame": { - "x": 416, - "y": 70, - "w": 52, - "h": 77 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 52, - "h": 77 - }, - "frame": { - "x": 416, - "y": 70, - "w": 52, - "h": 77 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 52, - "h": 77 - }, - "frame": { - "x": 416, - "y": 70, - "w": 52, - "h": 77 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 52, - "h": 77 - }, - "frame": { - "x": 416, - "y": 70, - "w": 52, - "h": 77 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 86 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 52, - "h": 77 - }, - "frame": { - "x": 416, - "y": 70, - "w": 52, - "h": 77 + "h": 76 } }, { @@ -2124,8 +1788,8 @@ "h": 77 }, "frame": { - "x": 334, - "y": 298, + "x": 318, + "y": 215, "w": 49, "h": 77 } @@ -2145,8 +1809,8 @@ "h": 77 }, "frame": { - "x": 334, - "y": 298, + "x": 318, + "y": 215, "w": 49, "h": 77 } @@ -2166,8 +1830,8 @@ "h": 77 }, "frame": { - "x": 334, - "y": 298, + "x": 318, + "y": 215, "w": 49, "h": 77 } @@ -2187,8 +1851,8 @@ "h": 77 }, "frame": { - "x": 334, - "y": 298, + "x": 318, + "y": 215, "w": 49, "h": 77 } @@ -2208,8 +1872,8 @@ "h": 77 }, "frame": { - "x": 334, - "y": 298, + "x": 318, + "y": 215, "w": 49, "h": 77 } @@ -2229,8 +1893,8 @@ "h": 77 }, "frame": { - "x": 334, - "y": 298, + "x": 318, + "y": 215, "w": 49, "h": 77 } @@ -2250,14 +1914,14 @@ "h": 77 }, "frame": { - "x": 334, - "y": 298, + "x": 318, + "y": 215, "w": 49, "h": 77 } }, { - "filename": "0108.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -2265,20 +1929,20 @@ "h": 86 }, "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 50, - "h": 80 + "x": 3, + "y": 7, + "w": 52, + "h": 77 }, "frame": { - "x": 362, - "y": 145, - "w": 50, - "h": 80 + "x": 367, + "y": 217, + "w": 52, + "h": 77 } }, { - "filename": "0094.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -2286,20 +1950,20 @@ "h": 86 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 50, - "h": 78 + "x": 3, + "y": 7, + "w": 52, + "h": 77 }, "frame": { - "x": 412, - "y": 147, - "w": 50, - "h": 78 + "x": 367, + "y": 217, + "w": 52, + "h": 77 } }, { - "filename": "0109.png", + "filename": "0032.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -2307,16 +1971,100 @@ "h": 86 }, "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 50, - "h": 80 + "x": 3, + "y": 7, + "w": 52, + "h": 77 }, "frame": { - "x": 462, - "y": 147, - "w": 50, - "h": 80 + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 } }, { @@ -2334,14 +2082,14 @@ "h": 77 }, "frame": { - "x": 383, - "y": 225, + "x": 419, + "y": 217, "w": 51, "h": 77 } }, { - "filename": "0114.png", + "filename": "0113.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -2350,15 +2098,99 @@ }, "spriteSourceSize": { "x": 4, - "y": 11, - "w": 50, - "h": 75 + "y": 9, + "w": 47, + "h": 77 }, "frame": { - "x": 383, - "y": 302, + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, "w": 50, - "h": 75 + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 } }, { @@ -2376,12 +2208,117 @@ "h": 78 }, "frame": { - "x": 434, - "y": 227, + "x": 259, + "y": 290, "w": 48, "h": 78 } }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 79 + }, + "frame": { + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, { "filename": "0106.png", "rotated": false, @@ -2397,8 +2334,8 @@ "h": 79 }, "frame": { - "x": 433, - "y": 305, + "x": 44, + "y": 362, "w": 48, "h": 79 } @@ -2418,8 +2355,8 @@ "h": 79 }, "frame": { - "x": 254, - "y": 372, + "x": 92, + "y": 363, "w": 48, "h": 79 } @@ -2439,8 +2376,8 @@ "h": 79 }, "frame": { - "x": 302, - "y": 375, + "x": 140, + "y": 364, "w": 48, "h": 79 } @@ -2460,14 +2397,14 @@ "h": 79 }, "frame": { - "x": 350, - "y": 377, + "x": 188, + "y": 366, "w": 48, "h": 79 } }, { - "filename": "0112.png", + "filename": "0090.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -2475,20 +2412,20 @@ "h": 86 }, "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 47, - "h": 78 + "x": 1, + "y": 6, + "w": 46, + "h": 80 }, "frame": { - "x": 398, - "y": 384, - "w": 47, - "h": 78 + "x": 236, + "y": 368, + "w": 46, + "h": 80 } }, { - "filename": "0113.png", + "filename": "0091.png", "rotated": false, "trimmed": true, "sourceSize": { @@ -2496,16 +2433,79 @@ "h": 86 }, "spriteSourceSize": { - "x": 4, - "y": 9, + "x": 3, + "y": 6, "w": 47, - "h": 77 + "h": 80 }, "frame": { - "x": 445, - "y": 384, + "x": 282, + "y": 370, "w": 47, - "h": 77 + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -2513,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9e48c848a41465f492d915f4dce7450d:4400a226a5397c6ca3d4bfb29ba2dc10:bad05b37c157676604256a043511a6a2$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/shiny/670-red.png b/public/images/pokemon/exp/shiny/670-red.png index 80cf1374591..0095258dd68 100644 Binary files a/public/images/pokemon/exp/shiny/670-red.png and b/public/images/pokemon/exp/shiny/670-red.png differ diff --git a/public/images/pokemon/exp/shiny/670-white.json b/public/images/pokemon/exp/shiny/670-white.json index abebccdf384..521ca042bf2 100644 --- a/public/images/pokemon/exp/shiny/670-white.json +++ b/public/images/pokemon/exp/shiny/670-white.json @@ -4,219 +4,156 @@ "image": "670-white.png", "format": "RGBA8888", "size": { - "w": 132, - "h": 132 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 65 } }, { - "filename": "0006.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, + "x": 3, + "y": 9, + "w": 60, "h": 67 }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, + "x": 60, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0003.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 5, + "w": 60, + "h": 67 }, "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 + "x": 120, + "y": 0, + "w": 60, + "h": 67 } }, { - "filename": "0005.png", + "filename": "0082.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 10, + "w": 61, + "h": 68 }, "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, + "x": 180, "y": 0, - "w": 39, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 + "w": 61, + "h": 68 } }, { - "filename": "0011.png", + "filename": "0100.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, + "x": 5, "y": 2, - "w": 40, - "h": 65 + "w": 60, + "h": 68 }, "frame": { - "x": 79, - "y": 66, - "w": 40, - "h": 65 + "x": 241, + "y": 0, + "w": 60, + "h": 68 } }, { - "filename": "0007.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 65 + "x": 4, + "y": 12, + "w": 62, + "h": 69 }, "frame": { - "x": 79, - "y": 66, - "w": 40, - "h": 65 + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 } }, { @@ -224,20 +161,1763 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 56, + "h": 70 + }, + "frame": { + "x": 59, + "y": 67, + "w": 56, + "h": 70 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 70 + }, + "frame": { + "x": 115, + "y": 67, + "w": 57, + "h": 70 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 57, + "h": 70 + }, + "frame": { + "x": 172, + "y": 68, + "w": 57, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 53, + "y": 137, + "w": 61, + "h": 73 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 73 + }, + "frame": { + "x": 114, + "y": 137, + "w": 54, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, + "y": 139, + "w": 61, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 52, + "h": 74 + }, + "frame": { + "x": 339, + "y": 141, + "w": 52, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 38, - "h": 65 + "y": 4, + "w": 51, + "h": 76 }, "frame": { - "x": 80, - "y": 0, - "w": 38, - "h": 65 + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 53, + "h": 76 + }, + "frame": { + "x": 265, + "y": 214, + "w": 53, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 } }, { @@ -245,20 +1925,587 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 51, + "h": 77 + }, + "frame": { + "x": 419, + "y": 217, + "w": 51, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 47, + "h": 77 + }, + "frame": { + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 50, + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 48, + "h": 78 + }, + "frame": { + "x": 259, + "y": 290, + "w": 48, + "h": 78 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 38, - "h": 65 + "y": 3, + "w": 45, + "h": 79 }, "frame": { - "x": 80, - "y": 0, - "w": 38, - "h": 65 + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 48, + "h": 79 + }, + "frame": { + "x": 44, + "y": 362, + "w": 48, + "h": 79 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 48, + "h": 79 + }, + "frame": { + "x": 92, + "y": 363, + "w": 48, + "h": 79 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 48, + "h": 79 + }, + "frame": { + "x": 140, + "y": 364, + "w": 48, + "h": 79 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 48, + "h": 79 + }, + "frame": { + "x": 188, + "y": 366, + "w": 48, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 46, + "h": 80 + }, + "frame": { + "x": 236, + "y": 368, + "w": 46, + "h": 80 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 47, + "h": 80 + }, + "frame": { + "x": 282, + "y": 370, + "w": 47, + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -266,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:01dae0b687f736498b0c925683fd383c:e338b45598e34ba8ebac09b743db09de:3b5fc0bf297b00d7e2adc65825803c41$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/shiny/670-white.png b/public/images/pokemon/exp/shiny/670-white.png index b972d374938..29fc8bad662 100644 Binary files a/public/images/pokemon/exp/shiny/670-white.png and b/public/images/pokemon/exp/shiny/670-white.png differ diff --git a/public/images/pokemon/exp/shiny/670-yellow.json b/public/images/pokemon/exp/shiny/670-yellow.json index 50b2d8ed3fc..ffd722006d3 100644 --- a/public/images/pokemon/exp/shiny/670-yellow.json +++ b/public/images/pokemon/exp/shiny/670-yellow.json @@ -4,219 +4,156 @@ "image": "670-yellow.png", "format": "RGBA8888", "size": { - "w": 132, - "h": 132 + "w": 491, + "h": 491 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0101.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 + "x": 4, + "y": 4, + "w": 60, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 65 } }, { - "filename": "0006.png", + "filename": "0083.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, + "x": 3, + "y": 9, + "w": 60, "h": 67 }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, "frame": { - "x": 0, - "y": 66, - "w": 40, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, + "x": 60, "y": 0, - "w": 40, - "h": 66 + "w": 60, + "h": 67 } }, { - "filename": "0003.png", + "filename": "0102.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 5, + "w": 60, + "h": 67 }, "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 + "x": 120, + "y": 0, + "w": 60, + "h": 67 } }, { - "filename": "0005.png", + "filename": "0082.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 + "x": 4, + "y": 10, + "w": 61, + "h": 68 }, "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, + "x": 180, "y": 0, - "w": 39, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 + "w": 61, + "h": 68 } }, { - "filename": "0011.png", + "filename": "0100.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 39, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, + "x": 5, "y": 2, - "w": 40, - "h": 65 + "w": 60, + "h": 68 }, "frame": { - "x": 79, - "y": 66, - "w": 40, - "h": 65 + "x": 241, + "y": 0, + "w": 60, + "h": 68 } }, { - "filename": "0007.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 65 + "x": 4, + "y": 12, + "w": 62, + "h": 69 }, "frame": { - "x": 79, - "y": 66, - "w": 40, - "h": 65 + "x": 301, + "y": 0, + "w": 62, + "h": 69 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 56, + "h": 69 + }, + "frame": { + "x": 363, + "y": 0, + "w": 56, + "h": 69 } }, { @@ -224,20 +161,1763 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 62, + "h": 70 + }, + "frame": { + "x": 419, + "y": 0, + "w": 62, + "h": 70 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 59, + "h": 70 + }, + "frame": { + "x": 0, + "y": 65, + "w": 59, + "h": 70 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 56, + "h": 70 + }, + "frame": { + "x": 59, + "y": 67, + "w": 56, + "h": 70 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 70 + }, + "frame": { + "x": 115, + "y": 67, + "w": 57, + "h": 70 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 57, + "h": 70 + }, + "frame": { + "x": 172, + "y": 68, + "w": 57, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 229, + "y": 68, + "w": 63, + "h": 71 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 71 + }, + "frame": { + "x": 292, + "y": 69, + "w": 63, + "h": 71 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 355, + "y": 69, + "w": 63, + "h": 72 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 63, + "h": 72 + }, + "frame": { + "x": 418, + "y": 70, + "w": 63, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 53, + "h": 73 + }, + "frame": { + "x": 0, + "y": 135, + "w": 53, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 53, + "y": 137, + "w": 61, + "h": 73 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 73 + }, + "frame": { + "x": 114, + "y": 137, + "w": 54, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 168, + "y": 138, + "w": 61, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 61, + "h": 73 + }, + "frame": { + "x": 229, + "y": 139, + "w": 61, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 49, + "h": 74 + }, + "frame": { + "x": 290, + "y": 140, + "w": 49, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 52, + "h": 74 + }, + "frame": { + "x": 339, + "y": 141, + "w": 52, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 47, + "h": 75 + }, + "frame": { + "x": 391, + "y": 142, + "w": 47, + "h": 75 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 50, + "h": 75 + }, + "frame": { + "x": 438, + "y": 142, + "w": 50, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 38, - "h": 65 + "y": 4, + "w": 51, + "h": 76 }, "frame": { - "x": 80, - "y": 0, - "w": 38, - "h": 65 + "x": 0, + "y": 208, + "w": 51, + "h": 76 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 57, + "h": 75 + }, + "frame": { + "x": 51, + "y": 210, + "w": 57, + "h": 75 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 55, + "h": 76 + }, + "frame": { + "x": 108, + "y": 210, + "w": 55, + "h": 76 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 163, + "y": 211, + "w": 51, + "h": 76 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 51, + "h": 76 + }, + "frame": { + "x": 214, + "y": 212, + "w": 51, + "h": 76 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 53, + "h": 76 + }, + "frame": { + "x": 265, + "y": 214, + "w": 53, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 49, + "h": 77 + }, + "frame": { + "x": 318, + "y": 215, + "w": 49, + "h": 77 } }, { @@ -245,20 +1925,587 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 40, - "h": 67 + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 52, + "h": 77 + }, + "frame": { + "x": 367, + "y": 217, + "w": 52, + "h": 77 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 51, + "h": 77 + }, + "frame": { + "x": 419, + "y": 217, + "w": 51, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 47, + "h": 77 + }, + "frame": { + "x": 0, + "y": 284, + "w": 47, + "h": 77 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 54, + "h": 77 + }, + "frame": { + "x": 47, + "y": 285, + "w": 54, + "h": 77 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 55, + "h": 77 + }, + "frame": { + "x": 101, + "y": 286, + "w": 55, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 53, + "h": 77 + }, + "frame": { + "x": 156, + "y": 287, + "w": 53, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 50, + "h": 78 + }, + "frame": { + "x": 209, + "y": 288, + "w": 50, + "h": 78 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 48, + "h": 78 + }, + "frame": { + "x": 259, + "y": 290, + "w": 48, + "h": 78 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 47, + "h": 78 + }, + "frame": { + "x": 307, + "y": 292, + "w": 47, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 38, - "h": 65 + "y": 3, + "w": 45, + "h": 79 }, "frame": { - "x": 80, - "y": 0, - "w": 38, - "h": 65 + "x": 354, + "y": 294, + "w": 45, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 49, + "h": 79 + }, + "frame": { + "x": 399, + "y": 294, + "w": 49, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 43, + "h": 82 + }, + "frame": { + "x": 448, + "y": 294, + "w": 43, + "h": 82 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 44, + "h": 80 + }, + "frame": { + "x": 0, + "y": 361, + "w": 44, + "h": 80 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 48, + "h": 79 + }, + "frame": { + "x": 44, + "y": 362, + "w": 48, + "h": 79 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 48, + "h": 79 + }, + "frame": { + "x": 92, + "y": 363, + "w": 48, + "h": 79 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 48, + "h": 79 + }, + "frame": { + "x": 140, + "y": 364, + "w": 48, + "h": 79 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 48, + "h": 79 + }, + "frame": { + "x": 188, + "y": 366, + "w": 48, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 46, + "h": 80 + }, + "frame": { + "x": 236, + "y": 368, + "w": 46, + "h": 80 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 47, + "h": 80 + }, + "frame": { + "x": 282, + "y": 370, + "w": 47, + "h": 80 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 50, + "h": 80 + }, + "frame": { + "x": 329, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 50, + "h": 80 + }, + "frame": { + "x": 379, + "y": 373, + "w": 50, + "h": 80 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 86 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 48, + "h": 81 + }, + "frame": { + "x": 429, + "y": 376, + "w": 48, + "h": 81 } } ] @@ -266,7 +2513,6 @@ ], "meta": { "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:91de02bbe0d8b5422a0590701d05eada:8288efcc5ff6f1e55757cca59d77c9b3:e33b1f5cc51f17c070e89705329e1246$" + "version": "3.0" } } diff --git a/public/images/pokemon/exp/shiny/670-yellow_1.png b/public/images/pokemon/exp/shiny/670-yellow_1.png new file mode 100644 index 00000000000..fdc31ce08d8 Binary files /dev/null and b/public/images/pokemon/exp/shiny/670-yellow_1.png differ diff --git a/public/images/pokemon/exp/shiny/677.png b/public/images/pokemon/exp/shiny/677.png index 35a25b901d4..d2703b7f7c0 100644 Binary files a/public/images/pokemon/exp/shiny/677.png and b/public/images/pokemon/exp/shiny/677.png differ diff --git a/public/images/pokemon/exp/shiny/678-female.png b/public/images/pokemon/exp/shiny/678-female.png index 1bcd9bcf6c7..7ae67d63a33 100644 Binary files a/public/images/pokemon/exp/shiny/678-female.png and b/public/images/pokemon/exp/shiny/678-female.png differ diff --git a/public/images/pokemon/exp/shiny/693.png b/public/images/pokemon/exp/shiny/693.png index 2212a4a5158..328c909b196 100644 Binary files a/public/images/pokemon/exp/shiny/693.png and b/public/images/pokemon/exp/shiny/693.png differ diff --git a/public/images/pokemon/exp/shiny/698.png b/public/images/pokemon/exp/shiny/698.png index 5f1dba59b77..322a44b92e8 100644 Binary files a/public/images/pokemon/exp/shiny/698.png and b/public/images/pokemon/exp/shiny/698.png differ diff --git a/public/images/pokemon/exp/shiny/699.png b/public/images/pokemon/exp/shiny/699.png index c4d5686811a..d68bd5c0e2a 100644 Binary files a/public/images/pokemon/exp/shiny/699.png and b/public/images/pokemon/exp/shiny/699.png differ diff --git a/public/images/pokemon/exp/shiny/774-blue.png b/public/images/pokemon/exp/shiny/774-blue.png index 82b53ea3d81..a6d5fd10f18 100644 Binary files a/public/images/pokemon/exp/shiny/774-blue.png and b/public/images/pokemon/exp/shiny/774-blue.png differ diff --git a/public/images/pokemon/exp/shiny/774-green.png b/public/images/pokemon/exp/shiny/774-green.png index 9ee225dc61c..ed8deff92bd 100644 Binary files a/public/images/pokemon/exp/shiny/774-green.png and b/public/images/pokemon/exp/shiny/774-green.png differ diff --git a/public/images/pokemon/exp/shiny/774-indigo.png b/public/images/pokemon/exp/shiny/774-indigo.png index f378b828450..4c2c954f2e7 100644 Binary files a/public/images/pokemon/exp/shiny/774-indigo.png and b/public/images/pokemon/exp/shiny/774-indigo.png differ diff --git a/public/images/pokemon/exp/shiny/774-orange.png b/public/images/pokemon/exp/shiny/774-orange.png index 54b6eb8eaed..4edcc654418 100644 Binary files a/public/images/pokemon/exp/shiny/774-orange.png and b/public/images/pokemon/exp/shiny/774-orange.png differ diff --git a/public/images/pokemon/exp/shiny/774-red.png b/public/images/pokemon/exp/shiny/774-red.png index 539e8d17913..d04e4468df9 100644 Binary files a/public/images/pokemon/exp/shiny/774-red.png and b/public/images/pokemon/exp/shiny/774-red.png differ diff --git a/public/images/pokemon/exp/shiny/774-violet.png b/public/images/pokemon/exp/shiny/774-violet.png index 840e8dbaeb8..d0721c118a0 100644 Binary files a/public/images/pokemon/exp/shiny/774-violet.png and b/public/images/pokemon/exp/shiny/774-violet.png differ diff --git a/public/images/pokemon/exp/shiny/774-yellow.png b/public/images/pokemon/exp/shiny/774-yellow.png index 64b10fdae1e..ab2f44c185a 100644 Binary files a/public/images/pokemon/exp/shiny/774-yellow.png and b/public/images/pokemon/exp/shiny/774-yellow.png differ diff --git a/public/images/pokemon/exp/shiny/821.png b/public/images/pokemon/exp/shiny/821.png index 5c03c17c793..6f6cf7f2991 100644 Binary files a/public/images/pokemon/exp/shiny/821.png and b/public/images/pokemon/exp/shiny/821.png differ diff --git a/public/images/pokemon/exp/shiny/823.png b/public/images/pokemon/exp/shiny/823.png index 1e90dcb67d3..9df29297e3a 100644 Binary files a/public/images/pokemon/exp/shiny/823.png and b/public/images/pokemon/exp/shiny/823.png differ diff --git a/public/images/pokemon/exp/shiny/912.png b/public/images/pokemon/exp/shiny/912.png index ab4464032a3..1f1692d6ceb 100644 Binary files a/public/images/pokemon/exp/shiny/912.png and b/public/images/pokemon/exp/shiny/912.png differ diff --git a/public/images/pokemon/exp/shiny/913.png b/public/images/pokemon/exp/shiny/913.png index 093d315ce33..7e458a0796c 100644 Binary files a/public/images/pokemon/exp/shiny/913.png and b/public/images/pokemon/exp/shiny/913.png differ diff --git a/public/images/pokemon/exp/shiny/914.png b/public/images/pokemon/exp/shiny/914.png index 866d22dac27..bffa5a1489d 100644 Binary files a/public/images/pokemon/exp/shiny/914.png and b/public/images/pokemon/exp/shiny/914.png differ diff --git a/public/images/pokemon/exp/shiny/940.png b/public/images/pokemon/exp/shiny/940.png index 4b8f43b64bf..2e66b03cd9f 100644 Binary files a/public/images/pokemon/exp/shiny/940.png and b/public/images/pokemon/exp/shiny/940.png differ diff --git a/public/images/pokemon/exp/shiny/954.png b/public/images/pokemon/exp/shiny/954.png index 8d6444a06c2..8bb46149716 100644 Binary files a/public/images/pokemon/exp/shiny/954.png and b/public/images/pokemon/exp/shiny/954.png differ diff --git a/public/images/pokemon/exp/shiny/981.png b/public/images/pokemon/exp/shiny/981.png index ba4b86a7568..f8f977fed92 100644 Binary files a/public/images/pokemon/exp/shiny/981.png and b/public/images/pokemon/exp/shiny/981.png differ diff --git a/public/images/pokemon/female/178.png b/public/images/pokemon/female/178.png index 87815289b78..96323eeea94 100644 Binary files a/public/images/pokemon/female/178.png and b/public/images/pokemon/female/178.png differ diff --git a/public/images/pokemon/female/190.png b/public/images/pokemon/female/190.png index 2ca059fb3c0..d0d5a1a2f76 100644 Binary files a/public/images/pokemon/female/190.png and b/public/images/pokemon/female/190.png differ diff --git a/public/images/pokemon/female/256.png b/public/images/pokemon/female/256.png index e38e87ee3f7..f470f5daf4b 100644 Binary files a/public/images/pokemon/female/256.png and b/public/images/pokemon/female/256.png differ diff --git a/public/images/pokemon/female/257.png b/public/images/pokemon/female/257.png index a67f36ee959..1c8a4c70757 100644 Binary files a/public/images/pokemon/female/257.png and b/public/images/pokemon/female/257.png differ diff --git a/public/images/pokemon/female/418.png b/public/images/pokemon/female/418.png index c24d87b0546..005c917463f 100644 Binary files a/public/images/pokemon/female/418.png and b/public/images/pokemon/female/418.png differ diff --git a/public/images/pokemon/female/419.png b/public/images/pokemon/female/419.png index 572172a72fe..572f819749b 100644 Binary files a/public/images/pokemon/female/419.png and b/public/images/pokemon/female/419.png differ diff --git a/public/images/pokemon/female/424.png b/public/images/pokemon/female/424.png index 0f9814abb53..8e4fbc235ca 100644 Binary files a/public/images/pokemon/female/424.png and b/public/images/pokemon/female/424.png differ diff --git a/public/images/pokemon/female/45.png b/public/images/pokemon/female/45.png index c1d4fa0024b..fad183bbf8d 100644 Binary files a/public/images/pokemon/female/45.png and b/public/images/pokemon/female/45.png differ diff --git a/public/images/pokemon/female/456.png b/public/images/pokemon/female/456.png index 1ada7dcaf30..a50fd2aa034 100644 Binary files a/public/images/pokemon/female/456.png and b/public/images/pokemon/female/456.png differ diff --git a/public/images/pokemon/female/457.png b/public/images/pokemon/female/457.png index 92d4c076df0..2aec3e26a07 100644 Binary files a/public/images/pokemon/female/457.png and b/public/images/pokemon/female/457.png differ diff --git a/public/images/pokemon/female/6215.png b/public/images/pokemon/female/6215.png index 0bfb2114c0f..c98bc4847b7 100644 Binary files a/public/images/pokemon/female/6215.png and b/public/images/pokemon/female/6215.png differ diff --git a/public/images/pokemon/female/916.png b/public/images/pokemon/female/916.png deleted file mode 100644 index 452b8403c66..00000000000 Binary files a/public/images/pokemon/female/916.png and /dev/null differ diff --git a/public/images/pokemon/icons/1/79.png b/public/images/pokemon/icons/1/79.png index 0802dd28d52..c1f638e8610 100644 Binary files a/public/images/pokemon/icons/1/79.png and b/public/images/pokemon/icons/1/79.png differ diff --git a/public/images/pokemon/icons/1/79s.png b/public/images/pokemon/icons/1/79s.png index 2cdb932b921..e5943d4d904 100644 Binary files a/public/images/pokemon/icons/1/79s.png and b/public/images/pokemon/icons/1/79s.png differ diff --git a/public/images/pokemon/icons/1/80s-mega.png b/public/images/pokemon/icons/1/80s-mega.png index fcfdd90ab85..9670635448a 100644 Binary files a/public/images/pokemon/icons/1/80s-mega.png and b/public/images/pokemon/icons/1/80s-mega.png differ diff --git a/public/images/pokemon/icons/1/80s.png b/public/images/pokemon/icons/1/80s.png index 9f8c593c9bf..1dd4bb79389 100644 Binary files a/public/images/pokemon/icons/1/80s.png and b/public/images/pokemon/icons/1/80s.png 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/2/159.png b/public/images/pokemon/icons/2/159.png index be2dba4cb43..23c749d84fb 100644 Binary files a/public/images/pokemon/icons/2/159.png and b/public/images/pokemon/icons/2/159.png differ diff --git a/public/images/pokemon/icons/2/178.png b/public/images/pokemon/icons/2/178.png index b28b33a5e69..9f4b97ffc1c 100644 Binary files a/public/images/pokemon/icons/2/178.png and b/public/images/pokemon/icons/2/178.png differ diff --git a/public/images/pokemon/icons/2/178s.png b/public/images/pokemon/icons/2/178s.png index 79ae763fcb8..55edd478de2 100644 Binary files a/public/images/pokemon/icons/2/178s.png and b/public/images/pokemon/icons/2/178s.png differ diff --git a/public/images/pokemon/icons/2/190.png b/public/images/pokemon/icons/2/190.png index 638d54913ad..1db25331440 100644 Binary files a/public/images/pokemon/icons/2/190.png and b/public/images/pokemon/icons/2/190.png differ diff --git a/public/images/pokemon/icons/2/190_1.png b/public/images/pokemon/icons/2/190_1.png new file mode 100644 index 00000000000..e7de93f7994 Binary files /dev/null and b/public/images/pokemon/icons/2/190_1.png differ diff --git a/public/images/pokemon/icons/2/203.png b/public/images/pokemon/icons/2/203.png index 9eabf361194..28f419a1553 100644 Binary files a/public/images/pokemon/icons/2/203.png and b/public/images/pokemon/icons/2/203.png differ diff --git a/public/images/pokemon/icons/2/203s.png b/public/images/pokemon/icons/2/203s.png index 9be89bd1e08..47f06e0b995 100644 Binary files a/public/images/pokemon/icons/2/203s.png and b/public/images/pokemon/icons/2/203s.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/424.png b/public/images/pokemon/icons/4/424.png index c8fab87bc90..fbcf2b8bd25 100644 Binary files a/public/images/pokemon/icons/4/424.png and b/public/images/pokemon/icons/4/424.png differ diff --git a/public/images/pokemon/icons/4/424_1.png b/public/images/pokemon/icons/4/424_1.png new file mode 100644 index 00000000000..f21bb7c64ea Binary files /dev/null and b/public/images/pokemon/icons/4/424_1.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/4/494.png b/public/images/pokemon/icons/5/494.png similarity index 100% rename from public/images/pokemon/icons/4/494.png rename to public/images/pokemon/icons/5/494.png diff --git a/public/images/pokemon/icons/4/494s.png b/public/images/pokemon/icons/5/494s.png similarity index 100% rename from public/images/pokemon/icons/4/494s.png rename to public/images/pokemon/icons/5/494s.png 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/556.png b/public/images/pokemon/icons/5/556.png index e3ec6954b75..f2837e78c58 100644 Binary files a/public/images/pokemon/icons/5/556.png and b/public/images/pokemon/icons/5/556.png differ diff --git a/public/images/pokemon/icons/5/556s.png b/public/images/pokemon/icons/5/556s.png index 095eecd9375..884b6510120 100644 Binary files a/public/images/pokemon/icons/5/556s.png and b/public/images/pokemon/icons/5/556s.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/6/698.png b/public/images/pokemon/icons/6/698.png index 72cf06cd111..30ccc4d2ecb 100644 Binary files a/public/images/pokemon/icons/6/698.png and b/public/images/pokemon/icons/6/698.png differ diff --git a/public/images/pokemon/icons/6/698s.png b/public/images/pokemon/icons/6/698s.png index 1d04ffcea1d..f6b73ee290d 100644 Binary files a/public/images/pokemon/icons/6/698s.png and b/public/images/pokemon/icons/6/698s.png differ diff --git a/public/images/pokemon/icons/6/699.png b/public/images/pokemon/icons/6/699.png index 47f015af8e4..3d973829cb8 100644 Binary files a/public/images/pokemon/icons/6/699.png and b/public/images/pokemon/icons/6/699.png differ diff --git a/public/images/pokemon/icons/6/699s.png b/public/images/pokemon/icons/6/699s.png index 925f623659a..6b6e5e7dea4 100644 Binary files a/public/images/pokemon/icons/6/699s.png and b/public/images/pokemon/icons/6/699s.png differ diff --git a/public/images/pokemon/icons/9/1003.png b/public/images/pokemon/icons/9/1003.png index 14a16362cbc..b0d97595a24 100644 Binary files a/public/images/pokemon/icons/9/1003.png and b/public/images/pokemon/icons/9/1003.png differ diff --git a/public/images/pokemon/icons/9/1003s.png b/public/images/pokemon/icons/9/1003s.png index d5cbf03d083..50fed79fbf7 100644 Binary files a/public/images/pokemon/icons/9/1003s.png and b/public/images/pokemon/icons/9/1003s.png differ diff --git a/public/images/pokemon/icons/9/1012-artisan.png b/public/images/pokemon/icons/9/1012-artisan.png new file mode 100644 index 00000000000..96a215e47de Binary files /dev/null and b/public/images/pokemon/icons/9/1012-artisan.png differ diff --git a/public/images/pokemon/icons/9/1012s-artisan.png b/public/images/pokemon/icons/9/1012s-artisan.png new file mode 100644 index 00000000000..43d0f32a0c4 Binary files /dev/null and b/public/images/pokemon/icons/9/1012s-artisan.png differ diff --git a/public/images/pokemon/icons/9/1013-masterpiece.png b/public/images/pokemon/icons/9/1013-masterpiece.png new file mode 100644 index 00000000000..7f5ee1fddd1 Binary files /dev/null and b/public/images/pokemon/icons/9/1013-masterpiece.png differ diff --git a/public/images/pokemon/icons/9/1013s-masterpiece.png b/public/images/pokemon/icons/9/1013s-masterpiece.png new file mode 100644 index 00000000000..85edbb60ae0 Binary files /dev/null and b/public/images/pokemon/icons/9/1013s-masterpiece.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/9/981.png b/public/images/pokemon/icons/9/981.png index 6db4c0f9b92..be4b43ef897 100644 Binary files a/public/images/pokemon/icons/9/981.png and b/public/images/pokemon/icons/9/981.png differ diff --git a/public/images/pokemon/icons/9/981s.png b/public/images/pokemon/icons/9/981s.png index 4bfcf9ae77d..beba477b455 100644 Binary files a/public/images/pokemon/icons/9/981s.png and b/public/images/pokemon/icons/9/981s.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/177_2.png b/public/images/pokemon/icons/variant/2/177_2.png new file mode 100644 index 00000000000..676224d2827 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/177_2.png differ diff --git a/public/images/pokemon/icons/variant/2/177_3.png b/public/images/pokemon/icons/variant/2/177_3.png new file mode 100644 index 00000000000..2952d8f4926 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/177_3.png differ diff --git a/public/images/pokemon/icons/variant/2/178_2.png b/public/images/pokemon/icons/variant/2/178_2.png new file mode 100644 index 00000000000..060c25138e0 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/178_2.png differ diff --git a/public/images/pokemon/icons/variant/2/178_3.png b/public/images/pokemon/icons/variant/2/178_3.png new file mode 100644 index 00000000000..34d38f8cf1f Binary files /dev/null and b/public/images/pokemon/icons/variant/2/178_3.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/6/354-mega_2.png b/public/images/pokemon/icons/variant/3/354-mega_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/354-mega_2.png rename to public/images/pokemon/icons/variant/3/354-mega_2.png diff --git a/public/images/pokemon/icons/variant/6/354-mega_3.png b/public/images/pokemon/icons/variant/3/354-mega_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/354-mega_3.png rename to public/images/pokemon/icons/variant/3/354-mega_3.png 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/472_2.png b/public/images/pokemon/icons/variant/4/472_2.png index 80282fd1f75..29cb7014389 100644 Binary files a/public/images/pokemon/icons/variant/4/472_2.png and b/public/images/pokemon/icons/variant/4/472_2.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/4/494_2.png b/public/images/pokemon/icons/variant/5/494_2.png similarity index 100% rename from public/images/pokemon/icons/variant/4/494_2.png rename to public/images/pokemon/icons/variant/5/494_2.png diff --git a/public/images/pokemon/icons/variant/4/494_3.png b/public/images/pokemon/icons/variant/5/494_3.png similarity index 100% rename from public/images/pokemon/icons/variant/4/494_3.png rename to public/images/pokemon/icons/variant/5/494_3.png 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/6/742_2.png b/public/images/pokemon/icons/variant/7/742_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/742_2.png rename to public/images/pokemon/icons/variant/7/742_2.png diff --git a/public/images/pokemon/icons/variant/6/742_3.png b/public/images/pokemon/icons/variant/7/742_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/742_3.png rename to public/images/pokemon/icons/variant/7/742_3.png diff --git a/public/images/pokemon/icons/variant/6/743_2.png b/public/images/pokemon/icons/variant/7/743_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/743_2.png rename to public/images/pokemon/icons/variant/7/743_2.png diff --git a/public/images/pokemon/icons/variant/6/743_3.png b/public/images/pokemon/icons/variant/7/743_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/743_3.png rename to public/images/pokemon/icons/variant/7/743_3.png diff --git a/public/images/pokemon/icons/variant/6/777_2.png b/public/images/pokemon/icons/variant/7/777_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/777_2.png rename to public/images/pokemon/icons/variant/7/777_2.png diff --git a/public/images/pokemon/icons/variant/6/777_3.png b/public/images/pokemon/icons/variant/7/777_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/777_3.png rename to public/images/pokemon/icons/variant/7/777_3.png diff --git a/public/images/pokemon/icons/variant/7/778-busted_2.png b/public/images/pokemon/icons/variant/7/778-busted_2.png new file mode 100644 index 00000000000..4ee05ae0a64 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/778-busted_2.png differ diff --git a/public/images/pokemon/icons/variant/7/778-busted_3.png b/public/images/pokemon/icons/variant/7/778-busted_3.png new file mode 100644 index 00000000000..a6c987989e1 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/778-busted_3.png differ diff --git a/public/images/pokemon/icons/variant/6/779_2.png b/public/images/pokemon/icons/variant/7/779_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/779_2.png rename to public/images/pokemon/icons/variant/7/779_2.png diff --git a/public/images/pokemon/icons/variant/6/779_3.png b/public/images/pokemon/icons/variant/7/779_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/779_3.png rename to public/images/pokemon/icons/variant/7/779_3.png 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/1003.png b/public/images/pokemon/shiny/1003.png index c649763e9ff..3c5415cf94e 100644 Binary files a/public/images/pokemon/shiny/1003.png and b/public/images/pokemon/shiny/1003.png differ diff --git a/public/images/pokemon/shiny/1006.png b/public/images/pokemon/shiny/1006.png index 850d3792de9..f077d000ca1 100644 Binary files a/public/images/pokemon/shiny/1006.png and b/public/images/pokemon/shiny/1006.png differ diff --git a/public/images/pokemon/shiny/178.png b/public/images/pokemon/shiny/178.png index 238db2016ac..248015ee65e 100644 Binary files a/public/images/pokemon/shiny/178.png and b/public/images/pokemon/shiny/178.png differ diff --git a/public/images/pokemon/shiny/190.png b/public/images/pokemon/shiny/190.png index 6d9ae3a9157..3ad2e7b5582 100644 Binary files a/public/images/pokemon/shiny/190.png and b/public/images/pokemon/shiny/190.png differ diff --git a/public/images/pokemon/shiny/196.json b/public/images/pokemon/shiny/196.json index bf812262cc2..27d8e8bb15e 100644 --- a/public/images/pokemon/shiny/196.json +++ b/public/images/pokemon/shiny/196.json @@ -4,122 +4,206 @@ "image": "196.png", "format": "RGBA8888", "size": { - "w": 376, - "h": 376 + "w": 386, + "h": 386 }, "scale": 1, "frames": [ { - "filename": "0010.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 10, + "w": 63, + "h": 48 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 1, + "y": 1, + "w": 63, + "h": 48 } }, { - "filename": "0031.png", + "filename": "0018.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 10, + "w": 63, + "h": 48 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 1, + "y": 1, + "w": 63, + "h": 48 } }, { - "filename": "0032.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 10, + "w": 63, + "h": 48 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 66, + "y": 1, + "w": 63, + "h": 48 } }, { - "filename": "0053.png", + "filename": "0061.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 10, + "w": 63, + "h": 48 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 131, + "y": 1, + "w": 63, + "h": 48 } }, { - "filename": "0054.png", + "filename": "0006.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 59, - "h": 53 + "y": 8, + "w": 62, + "h": 50 }, "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 53 + "x": 196, + "y": 1, + "w": 62, + "h": 50 } }, { - "filename": "0140.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, "w": 62, + "h": 50 + }, + "frame": { + "x": 196, + "y": 1, + "w": 62, + "h": 50 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 196, + "y": 1, + "w": 62, + "h": 50 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 260, + "y": 1, + "w": 62, + "h": 50 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 260, + "y": 1, + "w": 62, + "h": 50 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -129,8 +213,8 @@ "h": 53 }, "frame": { - "x": 0, - "y": 0, + "x": 324, + "y": 1, "w": 59, "h": 53 } @@ -140,7 +224,7 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -150,18 +234,123 @@ "h": 53 }, "frame": { + "x": 324, + "y": 1, + "w": 59, + "h": 53 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { "x": 0, + "y": 5, + "w": 59, + "h": 53 + }, + "frame": { + "x": 324, + "y": 1, + "w": 59, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 1, + "y": 51, + "w": 62, + "h": 50 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 65, + "y": 51, + "w": 62, + "h": 50 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 62, + "h": 50 + }, + "frame": { + "x": 129, + "y": 51, + "w": 62, + "h": 50 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 59, + "h": 53 + }, + "frame": { + "x": 193, "y": 53, "w": 59, "h": 53 } }, { - "filename": "0017.png", + "filename": "0030.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -171,7 +360,7 @@ "h": 53 }, "frame": { - "x": 0, + "x": 193, "y": 53, "w": 59, "h": 53 @@ -182,7 +371,7 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -192,1774 +381,52 @@ "h": 53 }, "frame": { - "x": 0, + "x": 254, "y": 53, "w": 59, "h": 53 } }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 59, - "y": 0, - "w": 59, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 0, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 59, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 59, - "y": 53, - "w": 59, - "h": 53 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 59, - "h": 53 - }, - "frame": { - "x": 118, - "y": 0, - "w": 59, - "h": 53 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 177, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 239, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 301, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 301, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 301, - "y": 0, - "w": 62, - "h": 49 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 159, - "w": 53, - "h": 56 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 215, - "w": 53, - "h": 56 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 271, - "w": 53, - "h": 56 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 271, - "w": 53, - "h": 56 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 59, - "y": 106, - "w": 62, - "h": 49 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 118, - "y": 53, - "w": 62, - "h": 49 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 62, - "h": 49 - }, - "frame": { - "x": 118, - "y": 53, - "w": 62, - "h": 49 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 180, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 242, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 242, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 304, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 62, - "h": 47 - }, - "frame": { - "x": 304, - "y": 49, - "w": 62, - "h": 47 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 121, - "y": 102, - "w": 53, - "h": 56 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 121, - "y": 102, - "w": 53, - "h": 56 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 58 - }, - "frame": { - "x": 53, - "y": 159, - "w": 43, - "h": 58 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 58 - }, - "frame": { - "x": 53, - "y": 159, - "w": 43, - "h": 58 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 53, - "y": 217, - "w": 44, - "h": 58 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 53, - "y": 217, - "w": 44, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 53, - "y": 275, - "w": 45, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 96, - "y": 158, - "w": 53, - "h": 56 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 96, - "y": 158, - "w": 53, - "h": 56 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 97, - "y": 214, - "w": 53, - "h": 56 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 56 - }, - "frame": { - "x": 97, - "y": 214, - "w": 53, - "h": 56 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 98, - "y": 270, - "w": 49, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 56 - }, - "frame": { - "x": 149, - "y": 158, - "w": 43, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 150, - "y": 214, - "w": 45, - "h": 58 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, { "filename": "0041.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 49, - "h": 55 + "y": 5, + "w": 59, + "h": 53 }, "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 + "x": 315, + "y": 56, + "w": 59, + "h": 53 } }, { - "filename": "0042.png", + "filename": "0059.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 49, - "h": 55 + "y": 5, + "w": 59, + "h": 53 }, "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 + "x": 1, + "y": 103, + "w": 59, + "h": 53 } }, { @@ -1967,713 +434,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 49, - "h": 55 + "y": 5, + "w": 59, + "h": 53 }, "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 147, - "y": 272, - "w": 49, - "h": 55 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 56 - }, - "frame": { - "x": 174, - "y": 102, - "w": 43, - "h": 56 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 56 - }, - "frame": { - "x": 174, - "y": 102, - "w": 43, - "h": 56 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 217, - "y": 96, - "w": 49, - "h": 55 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 217, - "y": 96, - "w": 49, - "h": 55 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 266, - "y": 96, - "w": 49, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 49, - "h": 55 - }, - "frame": { - "x": 315, - "y": 96, - "w": 49, - "h": 55 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 192, - "y": 158, - "w": 45, - "h": 55 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 195, - "y": 213, - "w": 45, - "h": 58 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 195, - "y": 213, - "w": 45, - "h": 58 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 196, - "y": 271, - "w": 45, - "h": 58 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 196, - "y": 271, - "w": 45, - "h": 58 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 237, - "y": 151, - "w": 45, - "h": 58 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 282, - "y": 151, - "w": 45, - "h": 58 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 282, - "y": 151, - "w": 45, - "h": 58 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 240, - "y": 209, - "w": 44, - "h": 58 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 240, - "y": 209, - "w": 44, - "h": 58 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 58 - }, - "frame": { - "x": 284, - "y": 209, - "w": 43, - "h": 58 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 241, - "y": 267, - "w": 45, - "h": 55 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 286, - "y": 267, - "w": 45, - "h": 55 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 286, - "y": 267, - "w": 45, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 327, - "y": 151, - "w": 45, - "h": 55 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 55 - }, - "frame": { - "x": 327, - "y": 151, - "w": 45, - "h": 55 + "x": 62, + "y": 103, + "w": 59, + "h": 53 } }, { @@ -2681,7 +455,7 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -2691,18 +465,18 @@ "h": 54 }, "frame": { - "x": 327, - "y": 206, + "x": 123, + "y": 103, "w": 42, "h": 54 } }, { - "filename": "0002.png", + "filename": "0012.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -2712,8 +486,8 @@ "h": 54 }, "frame": { - "x": 327, - "y": 206, + "x": 123, + "y": 103, "w": 42, "h": 54 } @@ -2723,7 +497,7 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -2733,18 +507,18 @@ "h": 54 }, "frame": { - "x": 327, - "y": 206, + "x": 123, + "y": 103, "w": 42, "h": 54 } }, { - "filename": "0024.png", + "filename": "0002.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { @@ -2754,8 +528,134 @@ "h": 54 }, "frame": { - "x": 327, - "y": 206, + "x": 167, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 167, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 211, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 255, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 255, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 255, + "y": 108, + "w": 42, + "h": 54 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 54 + }, + "frame": { + "x": 299, + "y": 111, "w": 42, "h": 54 } @@ -2765,104 +665,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, + "y": 1, "w": 42, - "h": 54 + "h": 57 }, "frame": { - "x": 327, - "y": 206, + "x": 343, + "y": 111, "w": 42, - "h": 54 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 327, - "y": 206, - "w": 42, - "h": 54 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 327, - "y": 206, - "w": 42, - "h": 54 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 327, - "y": 206, - "w": 42, - "h": 54 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 327, - "y": 206, - "w": 42, - "h": 54 + "h": 57 } }, { @@ -2870,41 +686,209 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 3, + "w": 45, + "h": 55 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 1, + "y": 158, + "w": 45, + "h": 55 } }, { - "filename": "0004.png", + "filename": "0024.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 3, + "w": 45, + "h": 55 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 1, + "y": 158, + "w": 45, + "h": 55 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 48, + "y": 158, + "w": 49, + "h": 55 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 48, + "y": 158, + "w": 49, + "h": 55 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 48, + "y": 158, + "w": 49, + "h": 55 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 99, + "y": 159, + "w": 45, + "h": 55 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 99, + "y": 159, + "w": 45, + "h": 55 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 99, + "y": 159, + "w": 45, + "h": 55 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 99, + "y": 159, + "w": 45, + "h": 55 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 146, + "y": 164, + "w": 49, + "h": 55 } }, { @@ -2912,20 +896,83 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 3, + "w": 49, + "h": 55 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 146, + "y": 164, + "w": 49, + "h": 55 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 197, + "y": 164, + "w": 45, + "h": 55 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 244, + "y": 164, + "w": 49, + "h": 55 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 45, + "h": 55 + }, + "frame": { + "x": 295, + "y": 167, + "w": 45, + "h": 55 } }, { @@ -2933,20 +980,251 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 43, + "h": 58 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 342, + "y": 170, + "w": 43, + "h": 58 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 1, + "y": 215, + "w": 49, + "h": 55 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 52, + "y": 216, + "w": 49, + "h": 55 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 49, + "h": 55 + }, + "frame": { + "x": 103, + "y": 221, + "w": 49, + "h": 55 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 154, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 154, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 154, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 209, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 209, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 209, + "y": 221, + "w": 53, + "h": 56 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 264, + "y": 224, + "w": 53, + "h": 56 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 63, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 56 + }, + "frame": { + "x": 319, + "y": 230, + "w": 53, + "h": 56 } }, { @@ -2954,251 +1232,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 44, + "h": 58 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 1, + "y": 272, + "w": 44, + "h": 58 } }, { - "filename": "0133.png", + "filename": "0048.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 45, + "h": 58 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 47, + "y": 273, + "w": 45, + "h": 58 } }, { - "filename": "0134.png", + "filename": "0049.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 45, + "h": 58 }, "frame": { - "x": 331, - "y": 260, - "w": 42, - "h": 54 + "x": 94, + "y": 278, + "w": 45, + "h": 58 } }, { - "filename": "0068.png", + "filename": "0050.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 46, + "h": 58 }, "frame": { - "x": 331, - "y": 314, - "w": 42, - "h": 54 + "x": 141, + "y": 279, + "w": 46, + "h": 58 } }, { - "filename": "0069.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 45, + "h": 58 }, "frame": { - "x": 331, - "y": 314, - "w": 42, - "h": 54 + "x": 189, + "y": 279, + "w": 45, + "h": 58 } }, { - "filename": "0088.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 + "y": 0, + "w": 44, + "h": 58 }, "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 + "x": 236, + "y": 282, + "w": 44, + "h": 58 } }, { - "filename": "0089.png", + "filename": "0053.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, + "w": 63, "h": 58 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, + "y": 0, + "w": 43, "h": 58 }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, + "x": 282, + "y": 288, + "w": 43, "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 241, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 283, - "y": 322, - "w": 42, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 42, - "h": 54 - }, - "frame": { - "x": 283, - "y": 322, - "w": 42, - "h": 54 } } ] @@ -3207,6 +1380,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9b65a3f3f9e736f3f4fec050eff11e3d:fd53c026e4013df6b8f49ce61e619ad0:fb684cbb576f205e45dc62e63d92a744$" + "smartupdate": "$TexturePacker:SmartUpdate:bd99ee2b4895f86f89c98243112d8b68:096f60b1c9de4943f19a8b4fe8653625:fb684cbb576f205e45dc62e63d92a744$" } } diff --git a/public/images/pokemon/shiny/196.png b/public/images/pokemon/shiny/196.png index 61cf6c7c901..8b62939e300 100644 Binary files a/public/images/pokemon/shiny/196.png and b/public/images/pokemon/shiny/196.png differ diff --git a/public/images/pokemon/shiny/261.png b/public/images/pokemon/shiny/261.png index b48c65d1698..1a976339b67 100644 Binary files a/public/images/pokemon/shiny/261.png and b/public/images/pokemon/shiny/261.png differ diff --git a/public/images/pokemon/shiny/262.png b/public/images/pokemon/shiny/262.png index a4baa168c3c..ea42b525b6b 100644 Binary files a/public/images/pokemon/shiny/262.png and b/public/images/pokemon/shiny/262.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/shiny/4080.png b/public/images/pokemon/shiny/4080.png index 14524fe2021..9ff6184d692 100644 Binary files a/public/images/pokemon/shiny/4080.png and b/public/images/pokemon/shiny/4080.png differ diff --git a/public/images/pokemon/shiny/4199.png b/public/images/pokemon/shiny/4199.png index 6a8868ddd16..d428931eff8 100644 Binary files a/public/images/pokemon/shiny/4199.png and b/public/images/pokemon/shiny/4199.png differ diff --git a/public/images/pokemon/shiny/424.png b/public/images/pokemon/shiny/424.png index 34c8b61b4c8..0c97de2883e 100644 Binary files a/public/images/pokemon/shiny/424.png and b/public/images/pokemon/shiny/424.png differ diff --git a/public/images/pokemon/shiny/45.png b/public/images/pokemon/shiny/45.png index 1595f0eaefd..92b28c054c9 100644 Binary files a/public/images/pokemon/shiny/45.png and b/public/images/pokemon/shiny/45.png differ diff --git a/public/images/pokemon/shiny/469.png b/public/images/pokemon/shiny/469.png index 3b8e14811ab..c7f7ee3b68e 100644 Binary files a/public/images/pokemon/shiny/469.png and b/public/images/pokemon/shiny/469.png differ diff --git a/public/images/pokemon/shiny/556.png b/public/images/pokemon/shiny/556.png index 8f9c6534ea5..b0052759531 100644 Binary files a/public/images/pokemon/shiny/556.png and b/public/images/pokemon/shiny/556.png differ diff --git a/public/images/pokemon/shiny/563.json b/public/images/pokemon/shiny/563.json index 73e9cc7ca33..666ec547d18 100644 --- a/public/images/pokemon/shiny/563.json +++ b/public/images/pokemon/shiny/563.json @@ -1,3485 +1,699 @@ -{ - "textures": [ - { - "image": "563.png", - "format": "RGBA8888", - "size": { - "w": 500, - "h": 500 - }, - "scale": 1, - "frames": [ - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 191, - "y": 366, - "w": 93, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 18, - "w": 73, - "h": 64 - }, - "frame": { - "x": 96, - "y": 436, - "w": 73, - "h": 64 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 28, - "y": 17, - "w": 52, - "h": 65 - }, - "frame": { - "x": 446, - "y": 0, - "w": 52, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 79 - }, - "frame": { - "x": 303, - "y": 140, - "w": 93, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 93, - "h": 77 - }, - "frame": { - "x": 286, - "y": 297, - "w": 93, - "h": 77 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 85, - "h": 73 - }, - "frame": { - "x": 284, - "y": 374, - "w": 85, - "h": 73 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 75, - "h": 79 - }, - "frame": { - "x": 396, - "y": 139, - "w": 75, - "h": 79 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 85, - "h": 79 - }, - "frame": { - "x": 384, - "y": 219, - "w": 85, - "h": 79 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 435, - "y": 365, - "w": 59, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 19, - "w": 66, - "h": 63 - }, - "frame": { - "x": 432, - "y": 72, - "w": 66, - "h": 63 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:697c20c4ebed8144399c4936c33f0236:3973650c39d034cfc27663d9051d4736:12f3eae8283ab6c8e555ff3e46b7d8dc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0002.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0003.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0004.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0005.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0007.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0008.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0009.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0010.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0011.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0013.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0014.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0015.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0016.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0017.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0019.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0020.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0021.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0022.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0023.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0024.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0025.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0027.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0028.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0029.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0030.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0031.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0033.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0034.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0035.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0036.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0037.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0039.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0040.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0041.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0042.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0043.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0044.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0045.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0047.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0048.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0049.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0050.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0051.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0052.png", + "frame": { "x": 208, "y": 228, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0053.png", + "frame": { "x": 203, "y": 81, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 229, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0055.png", + "frame": { "x": 300, "y": 302, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 91, "h": 75 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0056.png", + "frame": { "x": 300, "y": 228, "w": 83, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 83, "h": 71 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0057.png", + "frame": { "x": 208, "y": 159, "w": 76, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 17, "w": 76, "h": 65 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0058.png", + "frame": { "x": 392, "y": 370, "w": 70, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 16, "w": 70, "h": 66 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0059.png", + "frame": { "x": 494, "y": 305, "w": 64, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 15, "w": 64, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0060.png", + "frame": { "x": 463, "y": 373, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 20, "w": 58, "h": 62 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0061.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0062.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0063.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 19, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0064.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0065.png", + "frame": { "x": 242, "y": 373, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 16, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 373, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0067.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0068.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0069.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 19, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0070.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0071.png", + "frame": { "x": 506, "y": 81, "w": 50, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 50, "h": 64 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0072.png", + "frame": { "x": 185, "y": 373, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 14, "w": 56, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0073.png", + "frame": { "x": 494, "y": 230, "w": 64, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 64, "h": 74 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0074.png", + "frame": { "x": 486, "y": 152, "w": 73, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 73, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 306, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 83, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0076.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0078.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0079.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0080.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0081.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0082.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0084.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0085.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0086.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "563.png", + "format": "I8", + "size": { "w": 559, "h": 441 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/563.png b/public/images/pokemon/shiny/563.png index 1958a3c1352..91624b28dc5 100644 Binary files a/public/images/pokemon/shiny/563.png and b/public/images/pokemon/shiny/563.png differ diff --git a/public/images/pokemon/shiny/636.json b/public/images/pokemon/shiny/636.json index e7878da24d1..9626c6d8263 100644 --- a/public/images/pokemon/shiny/636.json +++ b/public/images/pokemon/shiny/636.json @@ -4,744 +4,51 @@ "image": "636.png", "format": "RGBA8888", "size": { - "w": 341, - "h": 341 + "w": 301, + "h": 301 }, "scale": 1, "frames": [ - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 50 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 100, - "w": 44, - "h": 50 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 150, - "w": 44, - "h": 50 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 200, - "w": 44, - "h": 50 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 250, - "w": 44, - "h": 50 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 45, - "y": 0, - "w": 44, - "h": 50 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 100, - "w": 44, - "h": 50 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 150, - "w": 44, - "h": 50 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 200, - "w": 44, - "h": 50 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 250, - "w": 44, - "h": 50 - } - }, { "filename": "0005.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 45, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0020.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 45, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 269, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 49, - "w": 45, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 + "w": 46, + "h": 48 } }, { @@ -749,545 +56,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 224, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 269, - "y": 49, - "w": 44, - "h": 50 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 134, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 88, - "y": 98, - "w": 44, - "h": 50 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 178, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 222, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 266, - "y": 99, - "w": 44, - "h": 50 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 132, - "y": 146, - "w": 44, - "h": 50 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 88, - "y": 148, - "w": 44, - "h": 50 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "w": 46, + "h": 48 } }, { @@ -1295,82 +77,103 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0067.png", + "filename": "0049.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0082.png", + "filename": "0060.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0116.png", + "filename": "0071.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, + "w": 46, + "h": 48 + }, + "frame": { + "x": 1, + "y": 51, + "w": 46, + "h": 48 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, "h": 49 }, "frame": { - "x": 132, - "y": 196, - "w": 44, + "x": 49, + "y": 1, + "w": 45, "h": 49 } }, @@ -1379,103 +182,40 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 88, - "y": 198, - "w": 44, + "x": 1, + "y": 101, + "w": 45, "h": 48 } }, { - "filename": "0033.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 101, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 220, - "y": 195, - "w": 44, "h": 48 } }, @@ -1484,40 +224,208 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, + "x": 1, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 220, - "y": 195, - "w": 44, + "x": 1, + "y": 101, + "w": 45, "h": 48 } }, { - "filename": "0055.png", + "filename": "0037.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, + "x": 1, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 220, - "y": 195, - "w": 44, + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, "h": 48 } }, @@ -1526,123 +434,102 @@ "rotated": false, "trimmed": true, "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, "w": 45, - "h": 50 + "h": 48 + }, + "frame": { + "x": 1, + "y": 151, + "w": 45, + "h": 48 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 0, "w": 44, - "h": 48 + "h": 49 }, "frame": { - "x": 220, - "y": 195, - "w": 44, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { "x": 1, - "y": 2, + "y": 201, "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 + "h": 49 } }, { - "filename": "0034.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, + "w": 44, + "h": 48 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 1, + "y": 252, + "w": 44, + "h": 48 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 1, + "y": 252, "w": 44, "h": 48 } @@ -1652,733 +539,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, "w": 44, "h": 48 } }, { - "filename": "0069.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, "w": 44, "h": 48 } }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 220, - "y": 243, - "w": 44, - "h": 48 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 176, - "y": 244, - "w": 44, - "h": 48 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 132, - "y": 245, - "w": 44, - "h": 48 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 246, - "w": 44, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, { "filename": "0062.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, + "x": 0, + "y": 1, "w": 44, - "h": 47 + "h": 48 }, "frame": { - "x": 132, - "y": 293, + "x": 1, + "y": 252, "w": 44, - "h": 47 + "h": 48 } }, { - "filename": "0013.png", + "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 2, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, "h": 47 }, "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "x": 49, + "y": 52, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, "h": 47 } }, @@ -2387,40 +623,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, { - "filename": "0043.png", + "filename": "0025.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, + "h": 47 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 49, + "y": 52, + "w": 45, + "h": 47 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, @@ -2429,61 +707,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, { - "filename": "0087.png", + "filename": "0084.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, + "x": 0, + "y": 0, "w": 44, + "h": 49 + }, + "frame": { + "x": 48, + "y": 101, + "w": 44, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, { - "filename": "0017.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, @@ -2492,83 +791,1112 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, { - "filename": "0061.png", + "filename": "0043.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 96, + "y": 51, + "w": 45, + "h": 47 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 96, + "y": 51, + "w": 45, + "h": 47 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 143, + "y": 1, + "w": 44, + "h": 49 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 189, + "y": 1, + "w": 45, + "h": 47 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 236, + "y": 1, + "w": 45, + "h": 47 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 94, + "y": 101, + "w": 43, + "h": 49 + } + }, { "filename": "0076.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 + "y": 0, + "w": 43, + "h": 49 }, "frame": { - "x": 264, - "y": 246, - "w": 44, - "h": 47 + "x": 139, + "y": 100, + "w": 43, + "h": 49 } }, { - "filename": "0091.png", + "filename": "0077.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 + "y": 0, + "w": 43, + "h": 49 }, "frame": { - "x": 264, - "y": 293, - "w": 44, - "h": 47 + "x": 184, + "y": 100, + "w": 43, + "h": 49 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 100, + "w": 43, + "h": 49 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 94, + "y": 152, + "w": 43, + "h": 49 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 139, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 184, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 47, + "y": 201, + "w": 42, + "h": 49 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 47, + "y": 252, + "w": 43, + "h": 48 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 139, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 184, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 92, + "y": 203, + "w": 43, + "h": 48 } } ] @@ -2577,6 +1905,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e9936479afbfa12e3add90e9463f5c72:d4c500373e36054aceb990f7143e5d30:1d471fa25be339df4c4184625fad00b3$" + "smartupdate": "$TexturePacker:SmartUpdate:a44c0ac06d9b3f225bf4ca6ae3326041:93ae31dcf0673c1e0be8d6dfea13f44f:1d471fa25be339df4c4184625fad00b3$" } } diff --git a/public/images/pokemon/shiny/636.png b/public/images/pokemon/shiny/636.png index 5d03713293d..21088248dee 100644 Binary files a/public/images/pokemon/shiny/636.png and b/public/images/pokemon/shiny/636.png differ diff --git a/public/images/pokemon/shiny/677.png b/public/images/pokemon/shiny/677.png index 5c67554b479..b90d0286879 100644 Binary files a/public/images/pokemon/shiny/677.png and b/public/images/pokemon/shiny/677.png differ diff --git a/public/images/pokemon/shiny/678-female.png b/public/images/pokemon/shiny/678-female.png index 2a7e60dd859..9a288a4fcb4 100644 Binary files a/public/images/pokemon/shiny/678-female.png and b/public/images/pokemon/shiny/678-female.png differ diff --git a/public/images/pokemon/shiny/678.png b/public/images/pokemon/shiny/678.png index a2ec8d89519..da33c6b3645 100644 Binary files a/public/images/pokemon/shiny/678.png and b/public/images/pokemon/shiny/678.png differ diff --git a/public/images/pokemon/shiny/698.png b/public/images/pokemon/shiny/698.png index 121396d4d14..0874f9af37e 100644 Binary files a/public/images/pokemon/shiny/698.png and b/public/images/pokemon/shiny/698.png differ diff --git a/public/images/pokemon/shiny/699.png b/public/images/pokemon/shiny/699.png index 1f3d51a29b7..16876941901 100644 Binary files a/public/images/pokemon/shiny/699.png and b/public/images/pokemon/shiny/699.png differ diff --git a/public/images/pokemon/shiny/774.json b/public/images/pokemon/shiny/774.json index 11d07b823e0..c61c1791862 100644 --- a/public/images/pokemon/shiny/774.json +++ b/public/images/pokemon/shiny/774.json @@ -1,41 +1,41 @@ -{ - "textures": [ - { - "image": "774.png", - "format": "RGBA8888", - "size": { - "w": 37, - "h": 37 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:29265d2eed2689ecb95874383b7e7da7:1339971def468ab6d7c93a72472c7b3d:37281ac0aa1e619ef385b889b64064b7$" - } -} +{ + "textures": [ + { + "image": "774.png", + "format": "RGBA8888", + "size": { + "w": 37, + "h": 37 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 37, + "h": 37 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 37 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:566b51540ed595250ead15a4733d98d6:172aa05dcc207383119cd2f2f7977e0e:37281ac0aa1e619ef385b889b64064b7$" + } +} diff --git a/public/images/pokemon/shiny/774.png b/public/images/pokemon/shiny/774.png index 5efd0bc8da1..7d9f5a9cb00 100644 Binary files a/public/images/pokemon/shiny/774.png and b/public/images/pokemon/shiny/774.png differ diff --git a/public/images/pokemon/shiny/80-mega.png b/public/images/pokemon/shiny/80-mega.png index 510fdb5a747..399402cf618 100644 Binary files a/public/images/pokemon/shiny/80-mega.png and b/public/images/pokemon/shiny/80-mega.png differ diff --git a/public/images/pokemon/shiny/80.png b/public/images/pokemon/shiny/80.png index cb938c974ad..750f0d7cc92 100644 Binary files a/public/images/pokemon/shiny/80.png and b/public/images/pokemon/shiny/80.png differ diff --git a/public/images/pokemon/shiny/802-zenith.png b/public/images/pokemon/shiny/802-zenith.png index b6db4621a0b..28c5a5e68d9 100644 Binary files a/public/images/pokemon/shiny/802-zenith.png and b/public/images/pokemon/shiny/802-zenith.png differ diff --git a/public/images/pokemon/shiny/867.png b/public/images/pokemon/shiny/867.png index a56e107a9c4..0443deeaf9c 100644 Binary files a/public/images/pokemon/shiny/867.png and b/public/images/pokemon/shiny/867.png differ diff --git a/public/images/pokemon/shiny/912.png b/public/images/pokemon/shiny/912.png index a0243590b1f..9fcdbbae78f 100644 Binary files a/public/images/pokemon/shiny/912.png and b/public/images/pokemon/shiny/912.png differ diff --git a/public/images/pokemon/shiny/913.png b/public/images/pokemon/shiny/913.png index 76bba7ebf0a..5791f5be095 100644 Binary files a/public/images/pokemon/shiny/913.png and b/public/images/pokemon/shiny/913.png differ diff --git a/public/images/pokemon/shiny/914.png b/public/images/pokemon/shiny/914.png index 9653b950b2c..f20466d543d 100644 Binary files a/public/images/pokemon/shiny/914.png and b/public/images/pokemon/shiny/914.png differ diff --git a/public/images/pokemon/shiny/940.png b/public/images/pokemon/shiny/940.png index 24d501956c5..77b45558e2c 100644 Binary files a/public/images/pokemon/shiny/940.png and b/public/images/pokemon/shiny/940.png differ diff --git a/public/images/pokemon/shiny/941.png b/public/images/pokemon/shiny/941.png index ba5ca93023f..986a6a53a8e 100644 Binary files a/public/images/pokemon/shiny/941.png and b/public/images/pokemon/shiny/941.png differ diff --git a/public/images/pokemon/shiny/981.png b/public/images/pokemon/shiny/981.png index 6971c204014..68570ed91f2 100644 Binary files a/public/images/pokemon/shiny/981.png and b/public/images/pokemon/shiny/981.png differ diff --git a/public/images/pokemon/shiny/female/178.png b/public/images/pokemon/shiny/female/178.png index 7695b06e155..b0d983307e4 100644 Binary files a/public/images/pokemon/shiny/female/178.png and b/public/images/pokemon/shiny/female/178.png differ diff --git a/public/images/pokemon/shiny/female/190.png b/public/images/pokemon/shiny/female/190.png index 7f5493bd245..0fc6b5f08dd 100644 Binary files a/public/images/pokemon/shiny/female/190.png and b/public/images/pokemon/shiny/female/190.png differ diff --git a/public/images/pokemon/shiny/female/424.png b/public/images/pokemon/shiny/female/424.png index abcea336cac..84ed5063655 100644 Binary files a/public/images/pokemon/shiny/female/424.png and b/public/images/pokemon/shiny/female/424.png differ diff --git a/public/images/pokemon/shiny/female/45.png b/public/images/pokemon/shiny/female/45.png index cca79b1bf9f..a6bbe3039cb 100644 Binary files a/public/images/pokemon/shiny/female/45.png and b/public/images/pokemon/shiny/female/45.png differ diff --git a/public/images/pokemon/variant/1003.json b/public/images/pokemon/variant/1003.json new file mode 100644 index 00000000000..a0b7fb54c9e --- /dev/null +++ b/public/images/pokemon/variant/1003.json @@ -0,0 +1,38 @@ +{ + "1": { + "283331": "96562e", + "a6b4a7": "e7cb7e", + "4a4a4a": "4a4a4a", + "486863": "be8550", + "0f0f0f": "0f0f0f", + "73958b": "daa666", + "5e4622": "352831", + "5c3127": "861d0f", + "8c6140": "ff7d59", + "381e1d": "4d0400", + "7e4742": "c64732", + "af9586": "beafb5", + "957560": "9c8e99", + "ff1f1a": "009db7", + "ffde24": "ffe578", + "7a6436": "514758" + }, + "2": { + "283331": "472d7c", + "a6b4a7": "cfa0f3", + "4a4a4a": "4a4a4a", + "486863": "6c4aac", + "0f0f0f": "0f0f0f", + "73958b": "8d6acc", + "5e4622": "434377", + "5c3127": "313246", + "8c6140": "767a7e", + "381e1d": "1a1a31", + "7e4742": "585869", + "af9586": "d6d8d6", + "957560": "b0a39f", + "ff1f1a": "ffec91", + "ffde24": "8f3f67", + "7a6436": "8183b3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/1006.json b/public/images/pokemon/variant/1006.json new file mode 100644 index 00000000000..420456dcd93 --- /dev/null +++ b/public/images/pokemon/variant/1006.json @@ -0,0 +1,20 @@ +{ + "2": { + "2d384a": "2a224e", + "595f6a": "181440", + "f4f8f7": "f4f8f7", + "4b8383": "3e2d63", + "6db0b4": "585995", + "0f0f0f": "0f0f0f", + "264d24": "483d5c", + "5ab46a": "c2c8dc", + "41835a": "79728e", + "a4e397": "f5edf8", + "fcfcfc": "36a5aa", + "afabce": "27678e", + "ae2060": "2ac6a5", + "80889b": "17356a", + "ff5197": "a5ffd4", + "eeb0dc": "fbfffc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/1006_2.json b/public/images/pokemon/variant/1006_2.json new file mode 100644 index 00000000000..ce214799699 --- /dev/null +++ b/public/images/pokemon/variant/1006_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "1006_2.png", + "format": "RGBA8888", + "size": { + "w": 81, + "h": 81 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 65, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 65, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 65, + "h": 81 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:51b14b77e48246f9a569a3d68e42a9a9:e6d0a9b703ab86be41be6a2ede6b37c6:ec396d31079bf59c1cfe027eb7d25f86$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/1006_2.png b/public/images/pokemon/variant/1006_2.png new file mode 100644 index 00000000000..5819330574a Binary files /dev/null and b/public/images/pokemon/variant/1006_2.png differ diff --git a/public/images/pokemon/variant/1010.json b/public/images/pokemon/variant/1010.json new file mode 100644 index 00000000000..f216f9f184a --- /dev/null +++ b/public/images/pokemon/variant/1010.json @@ -0,0 +1,32 @@ +{ + "1": { + "1e5238": "63193a", + "69b95b": "d6637b", + "39804b": "943a5a", + "c51333": "4a6329", + "ff5f7c": "638c10", + "ffb2c0": "9cce52", + "0b0b0b": "0b0b0b", + "aedf87": "ef8ca5", + "343631": "313436", + "61635b": "5b6263", + "8a8d85": "858d8c", + "c0c1be": "bec1c0", + "1d1d1c": "1d1d1c" + }, + "2": { + "1e5238": "834b04", + "69b95b": "bba010", + "39804b": "a4790a", + "c51333": "9131a3", + "ff5f7c": "e565fd", + "ffb2c0": "eeeeee", + "0b0b0b": "0b0b0b", + "aedf87": "e3d520", + "343631": "54544c", + "61635b": "a1a19b", + "8a8d85": "cacac6", + "c0c1be": "eeeeee", + "1d1d1c": "1d1d1c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/116.json b/public/images/pokemon/variant/116.json new file mode 100644 index 00000000000..978af835a5c --- /dev/null +++ b/public/images/pokemon/variant/116.json @@ -0,0 +1,28 @@ +{ + "1": { + "3a5263": "1f4f3e", + "bddeff": "7ed683", + "a5c5ef": "5bab65", + "6b94b5": "3d7b4f", + "101010": "101010", + "ffffff": "ffffff", + "ff7373": "34b9af", + "d6d6d6": "d6d6d6", + "dec54a": "91bf49", + "9c844a": "548133", + "ffffad": "fff370" + }, + "2": { + "3a5263": "cf7d3a", + "bddeff": "fffaa1", + "a5c5ef": "ffe675", + "6b94b5": "edb766", + "101010": "101010", + "ffffff": "ffffff", + "ff7373": "9973c7", + "d6d6d6": "d6d6d6", + "dec54a": "4e878a", + "9c844a": "314e5e", + "ffffad": "7bc9bb" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/117.json b/public/images/pokemon/variant/117.json new file mode 100644 index 00000000000..81b047d6142 --- /dev/null +++ b/public/images/pokemon/variant/117.json @@ -0,0 +1,28 @@ +{ + "1": { + "6b849c": "185461", + "21425a": "122647", + "a5cee6": "45b38f", + "84adce": "2e8b7b", + "101010": "101010", + "4a6b84": "143c4f", + "7b6321": "3f8a49", + "dec552": "87c563", + "ffffad": "b5e37f", + "ffffff": "ffffff", + "9c9c9c": "243b61" + }, + "2": { + "6b849c": "f2705c", + "21425a": "702525", + "a5cee6": "ffd166", + "84adce": "ffab66", + "101010": "101010", + "4a6b84": "c74c4c", + "7b6321": "4e878a", + "dec552": "7bc9bb", + "ffffad": "b3f2d8", + "ffffff": "ffffff", + "9c9c9c": "ff9a47" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/120.json b/public/images/pokemon/variant/120.json new file mode 100644 index 00000000000..f9970a1f814 --- /dev/null +++ b/public/images/pokemon/variant/120.json @@ -0,0 +1,36 @@ +{ + "1": { + "633131": "07293b", + "9c6b3a": "1b7272", + "000000": "000000", + "deb563": "4bd09b", + "7b523a": "0f4c58", + "d69c52": "2d9683", + "846b42": "8c383d", + "efde31": "ee9494", + "fff7a5": "ffc5b4", + "ce9429": "de6262", + "5a4231": "631c26", + "ad2110": "1c1918", + "f7c5bd": "ad9b88", + "ffffff": "fff2e5", + "f74242": "4c4640" + }, + "2": { + "633131": "1d5198", + "9c6b3a": "3eb7e5", + "000000": "000000", + "deb563": "9cffff", + "7b523a": "2c81bc", + "d69c52": "74e7f7", + "846b42": "8291cb", + "efde31": "d6e8ff", + "fff7a5": "ffffff", + "ce9429": "acc2e8", + "5a4231": "4e5293", + "ad2110": "3d2f7a", + "f7c5bd": "74a7f7", + "ffffff": "c1ffff", + "f74242": "5b67d3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/121.json b/public/images/pokemon/variant/121.json new file mode 100644 index 00000000000..82840e49783 --- /dev/null +++ b/public/images/pokemon/variant/121.json @@ -0,0 +1,36 @@ +{ + "1": { + "5a529c": "8b4a52", + "8c73bd": "de6262", + "000000": "000000", + "313a73": "631c26", + "d6adef": "ffc5b4", + "b58cd6": "ee9494", + "5a4231": "07293b", + "c59421": "1b7272", + "efc54a": "2d9683", + "ffe694": "4bd09b", + "947342": "0f4c58", + "f75273": "f3cb82", + "efb5ce": "ffffcc", + "ce215a": "e27b4f", + "8c1052": "bc4a5a" + }, + "2": { + "5a529c": "9eb4ff", + "8c73bd": "c5d5ff", + "000000": "000000", + "313a73": "597cdb", + "d6adef": "ffffff", + "b58cd6": "d6e8ff", + "5a4231": "1a3454", + "c59421": "3973ac", + "efc54a": "5a8bc5", + "ffe694": "83b4e6", + "947342": "31527b", + "f75273": "74e7f7", + "efb5ce": "9cffff", + "ce215a": "3eb7e5", + "8c1052": "2c81bc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/126.json b/public/images/pokemon/variant/126.json new file mode 100644 index 00000000000..8c90e069d6d --- /dev/null +++ b/public/images/pokemon/variant/126.json @@ -0,0 +1,18 @@ +{ + "2": { + "7b5231": "699296", + "000000": "000000", + "ffef4a": "eaffff", + "c57b10": "9ec9cf", + "e6bd31": "c6edf2", + "6b2121": "303d58", + "ce1042": "4065b0", + "ff4a31": "5398cf", + "636363": "636363", + "ffffff": "ffffff", + "c5c5c5": "c5c5c5", + "ff8c63": "b2a0b1", + "ffcebd": "cabac8", + "fff7ce": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/126_2.json b/public/images/pokemon/variant/126_2.json new file mode 100644 index 00000000000..f0b406ecdc4 --- /dev/null +++ b/public/images/pokemon/variant/126_2.json @@ -0,0 +1,1406 @@ +{ + "textures": [ + { + "image": "126_2.png", + "format": "RGBA8888", + "size": { + "w": 286, + "h": 286 + }, + "scale": 1, + "frames": [ + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 73, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 73, + "h": 58 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 73, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 73, + "h": 58 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 73, + "h": 58 + }, + "frame": { + "x": 73, + "y": 0, + "w": 73, + "h": 58 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 73, + "h": 58 + }, + "frame": { + "x": 73, + "y": 0, + "w": 73, + "h": 58 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 73, + "h": 56 + }, + "frame": { + "x": 146, + "y": 0, + "w": 73, + "h": 56 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 73, + "h": 56 + }, + "frame": { + "x": 146, + "y": 0, + "w": 73, + "h": 56 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 65, + "h": 61 + }, + "frame": { + "x": 219, + "y": 0, + "w": 65, + "h": 61 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 65, + "h": 61 + }, + "frame": { + "x": 219, + "y": 0, + "w": 65, + "h": 61 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 73, + "h": 56 + }, + "frame": { + "x": 146, + "y": 56, + "w": 73, + "h": 56 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 73, + "h": 56 + }, + "frame": { + "x": 146, + "y": 56, + "w": 73, + "h": 56 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 65, + "h": 61 + }, + "frame": { + "x": 219, + "y": 61, + "w": 65, + "h": 61 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 65, + "h": 61 + }, + "frame": { + "x": 219, + "y": 61, + "w": 65, + "h": 61 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 71, + "h": 59 + }, + "frame": { + "x": 0, + "y": 58, + "w": 71, + "h": 59 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 71, + "h": 59 + }, + "frame": { + "x": 0, + "y": 58, + "w": 71, + "h": 59 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 71, + "h": 59 + }, + "frame": { + "x": 71, + "y": 58, + "w": 71, + "h": 59 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 71, + "h": 59 + }, + "frame": { + "x": 71, + "y": 58, + "w": 71, + "h": 59 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 64, + "h": 57 + }, + "frame": { + "x": 142, + "y": 112, + "w": 64, + "h": 57 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 64, + "h": 57 + }, + "frame": { + "x": 142, + "y": 112, + "w": 64, + "h": 57 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 64, + "h": 57 + }, + "frame": { + "x": 142, + "y": 112, + "w": 64, + "h": 57 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 64, + "h": 57 + }, + "frame": { + "x": 142, + "y": 112, + "w": 64, + "h": 57 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 64, + "h": 57 + }, + "frame": { + "x": 142, + "y": 112, + "w": 64, + "h": 57 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 64, + "h": 57 + }, + "frame": { + "x": 142, + "y": 112, + "w": 64, + "h": 57 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 63, + "h": 61 + }, + "frame": { + "x": 206, + "y": 122, + "w": 63, + "h": 61 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 63, + "h": 61 + }, + "frame": { + "x": 206, + "y": 122, + "w": 63, + "h": 61 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 62, + "h": 61 + }, + "frame": { + "x": 0, + "y": 183, + "w": 62, + "h": 61 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 62, + "h": 61 + }, + "frame": { + "x": 0, + "y": 183, + "w": 62, + "h": 61 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 62, + "h": 61 + }, + "frame": { + "x": 0, + "y": 183, + "w": 62, + "h": 61 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 62, + "h": 61 + }, + "frame": { + "x": 0, + "y": 183, + "w": 62, + "h": 61 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 62, + "h": 61 + }, + "frame": { + "x": 0, + "y": 183, + "w": 62, + "h": 61 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 62, + "h": 61 + }, + "frame": { + "x": 0, + "y": 183, + "w": 62, + "h": 61 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 0, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 0, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 0, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 0, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 0, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 0, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 61, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 61, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 61, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 61, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 61, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 61, + "h": 61 + }, + "frame": { + "x": 61, + "y": 117, + "w": 61, + "h": 61 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 122, + "y": 169, + "w": 62, + "h": 59 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 122, + "y": 169, + "w": 62, + "h": 59 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 122, + "y": 169, + "w": 62, + "h": 59 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 122, + "y": 169, + "w": 62, + "h": 59 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 122, + "y": 169, + "w": 62, + "h": 59 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 122, + "y": 169, + "w": 62, + "h": 59 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 62, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 62, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 62, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 62, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 62, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 62, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 124, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 124, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 124, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 124, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 124, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 62, + "h": 58 + }, + "frame": { + "x": 124, + "y": 228, + "w": 62, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 186, + "y": 183, + "w": 62, + "h": 59 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 186, + "y": 183, + "w": 62, + "h": 59 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 186, + "y": 183, + "w": 62, + "h": 59 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 186, + "y": 183, + "w": 62, + "h": 59 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 186, + "y": 183, + "w": 62, + "h": 59 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 61 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 62, + "h": 59 + }, + "frame": { + "x": 186, + "y": 183, + "w": 62, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:56f898082932699240e8d110fa60840b:f5981d6feece2eabc697cb67156facbb:60f24648782f6bde87f7468b66ef2059$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/126_2.png b/public/images/pokemon/variant/126_2.png new file mode 100644 index 00000000000..19aa928037d Binary files /dev/null and b/public/images/pokemon/variant/126_2.png differ diff --git a/public/images/pokemon/variant/133-partner.json b/public/images/pokemon/variant/133-partner.json new file mode 100644 index 00000000000..1939d16ec22 --- /dev/null +++ b/public/images/pokemon/variant/133-partner.json @@ -0,0 +1,24 @@ +{ + "1": { + "a5634a": "5982b7", + "734a4a": "334b7d", + "d69c4a": "90c1f1", + "000000": "000000", + "523121": "13235c", + "e6c594": "9db5d8", + "bd9c7b": "5f6f94", + "ffffff": "ffffff", + "ffe6ad": "d7ebff" + }, + "2": { + "a5634a": "915ea3", + "734a4a": "5e3372", + "d69c4a": "bf88cb", + "000000": "000000", + "523121": "461144", + "e6c594": "d7b8ba", + "bd9c7b": "a07c83", + "ffffff": "ffffff", + "ffe6ad": "f3e6e3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/137.json b/public/images/pokemon/variant/137.json new file mode 100644 index 00000000000..81f82938bcc --- /dev/null +++ b/public/images/pokemon/variant/137.json @@ -0,0 +1,32 @@ +{ + "1": { + "c53a5a": "d9546f", + "7b2942": "ad2d2d", + "f7d6c5": "fccee9", + "ffffff": "e1dbff", + "efad9c": "f8a8cd", + "085a73": "4d030f", + "5abde6": "e9635a", + "000000": "000000", + "ff6363": "e9778e", + "0884a5": "841023", + "08add6": "ba333b", + "8cd6ef": "e9635a", + "c5c5c5": "bab1e8" + }, + "2": { + "c53a5a": "31150e", + "7b2942": "210903", + "f7d6c5": "a04c27", + "ffffff": "dea27e", + "efad9c": "82391d", + "085a73": "a1562c", + "5abde6": "ffd9ab", + "000000": "000000", + "ff6363": "491c0c", + "0884a5": "cf8556", + "08add6": "efb787", + "8cd6ef": "ffd9ab", + "c5c5c5": "c67f4b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/169.json b/public/images/pokemon/variant/169.json index 3824fc5e351..751102ef4a0 100644 --- a/public/images/pokemon/variant/169.json +++ b/public/images/pokemon/variant/169.json @@ -1,19 +1,4 @@ { - "0": { - "7b4a9c": "d684ce", - "63197b": "9c528c", - "a55ace": "ffb5f7", - "101010": "101010", - "b57bce": "ffd6ef", - "08426b": "638400", - "ce0021": "940821", - "ffd600": "ffd600", - "d69400": "d69400", - "216b94": "8ca508", - "ffffff": "ffffff", - "a5a5a5": "a5a5a5", - "6b6b6b": "6b6b6b" - }, "1": { "7b4a9c": "2f2a5f", "63197b": "14093b", diff --git a/public/images/pokemon/variant/169_1.png b/public/images/pokemon/variant/169_1.png deleted file mode 100644 index 1baf868c278..00000000000 Binary files a/public/images/pokemon/variant/169_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/177.json b/public/images/pokemon/variant/177.json new file mode 100644 index 00000000000..f1736061523 --- /dev/null +++ b/public/images/pokemon/variant/177.json @@ -0,0 +1,32 @@ +{ + "1": { + "842900": "001d3f", + "ff424a": "4b798a", + "d63131": "174d69", + "292929": "292929", + "296b29": "b36848", + "73bd42": "ffbe79", + "94d642": "ffe88e", + "4a9442": "d1915e", + "ffffff": "ffffff", + "846321": "356f6d", + "d6ad29": "4ca690", + "ffde29": "8ddcaf", + "cecece": "cecece" + }, + "2": { + "842900": "3b060c", + "ff424a": "9a3841", + "d63131": "662340", + "292929": "292929", + "296b29": "224181", + "73bd42": "62a1e8", + "94d642": "82d4fc", + "4a9442": "4973c7", + "ffffff": "ffffff", + "846321": "382c78", + "d6ad29": "554196", + "ffde29": "8767bf", + "cecece": "cecece" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/178_2.json b/public/images/pokemon/variant/178_2.json new file mode 100644 index 00000000000..c7366c3ab12 --- /dev/null +++ b/public/images/pokemon/variant/178_2.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "178_2.png", + "format": "RGBA8888", + "size": { + "w": 224, + "h": 224 + }, + "scale": 1, + "frames": [ + { + "filename": "0101.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + }, + "frame": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + }, + "frame": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 45, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 45, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 88, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 88, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 41, + "h": 59 + }, + "frame": { + "x": 131, + "y": 0, + "w": 41, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 41, + "h": 59 + }, + "frame": { + "x": 131, + "y": 0, + "w": 41, + "h": 59 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 59 + }, + "frame": { + "x": 131, + "y": 59, + "w": 39, + "h": 59 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 59 + }, + "frame": { + "x": 131, + "y": 59, + "w": 39, + "h": 59 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 37, + "h": 59 + }, + "frame": { + "x": 0, + "y": 60, + "w": 37, + "h": 59 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 37, + "h": 59 + }, + "frame": { + "x": 0, + "y": 60, + "w": 37, + "h": 59 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 57 + }, + "frame": { + "x": 37, + "y": 60, + "w": 40, + "h": 57 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 57 + }, + "frame": { + "x": 37, + "y": 60, + "w": 40, + "h": 57 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 57 + }, + "frame": { + "x": 0, + "y": 119, + "w": 36, + "h": 57 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 57 + }, + "frame": { + "x": 0, + "y": 119, + "w": 36, + "h": 57 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 115, + "w": 37, + "h": 55 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 115, + "w": 37, + "h": 55 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 77, + "y": 170, + "w": 36, + "h": 54 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 77, + "y": 170, + "w": 36, + "h": 54 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 172, + "y": 0, + "w": 36, + "h": 54 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 172, + "y": 0, + "w": 36, + "h": 54 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:898a0175e268e2bf429019b4b00a4414:3e0d176fabaa6df9ef39756046ad4ad5:319c95b9f5acf1139a5c6761349cd6ab$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/178_2.png b/public/images/pokemon/variant/178_2.png new file mode 100644 index 00000000000..82e478b4d54 Binary files /dev/null and b/public/images/pokemon/variant/178_2.png differ diff --git a/public/images/pokemon/variant/178_3.json b/public/images/pokemon/variant/178_3.json new file mode 100644 index 00000000000..d702e96f2f0 --- /dev/null +++ b/public/images/pokemon/variant/178_3.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "178_3.png", + "format": "RGBA8888", + "size": { + "w": 224, + "h": 224 + }, + "scale": 1, + "frames": [ + { + "filename": "0101.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + }, + "frame": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + }, + "frame": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 45, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 45, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 88, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 88, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 41, + "h": 59 + }, + "frame": { + "x": 131, + "y": 0, + "w": 41, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 41, + "h": 59 + }, + "frame": { + "x": 131, + "y": 0, + "w": 41, + "h": 59 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 59 + }, + "frame": { + "x": 131, + "y": 59, + "w": 39, + "h": 59 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 59 + }, + "frame": { + "x": 131, + "y": 59, + "w": 39, + "h": 59 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 37, + "h": 59 + }, + "frame": { + "x": 0, + "y": 60, + "w": 37, + "h": 59 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 37, + "h": 59 + }, + "frame": { + "x": 0, + "y": 60, + "w": 37, + "h": 59 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 57 + }, + "frame": { + "x": 37, + "y": 60, + "w": 40, + "h": 57 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 57 + }, + "frame": { + "x": 37, + "y": 60, + "w": 40, + "h": 57 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 57 + }, + "frame": { + "x": 0, + "y": 119, + "w": 36, + "h": 57 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 57 + }, + "frame": { + "x": 0, + "y": 119, + "w": 36, + "h": 57 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 115, + "w": 37, + "h": 55 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 115, + "w": 37, + "h": 55 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 77, + "y": 170, + "w": 36, + "h": 54 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 77, + "y": 170, + "w": 36, + "h": 54 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 172, + "y": 0, + "w": 36, + "h": 54 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 172, + "y": 0, + "w": 36, + "h": 54 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:898a0175e268e2bf429019b4b00a4414:3e0d176fabaa6df9ef39756046ad4ad5:319c95b9f5acf1139a5c6761349cd6ab$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/178_3.png b/public/images/pokemon/variant/178_3.png new file mode 100644 index 00000000000..57cedc11b67 Binary files /dev/null and b/public/images/pokemon/variant/178_3.png differ diff --git a/public/images/pokemon/variant/182.json b/public/images/pokemon/variant/182.json new file mode 100644 index 00000000000..11f04f60f96 --- /dev/null +++ b/public/images/pokemon/variant/182.json @@ -0,0 +1,34 @@ +{ + "1": { + "d62100": "49c1c2", + "f76b00": "79f6d5", + "840000": "338497", + "e6d66b": "5c51b9", + "101010": "101010", + "b5a53a": "3a2c7d", + "847319": "231c5a", + "73ad31": "a2d281", + "9cd64a": "d8ecb1", + "526329": "659251", + "ffffff": "ffffff", + "3a9400": "6370b3", + "105210": "373c8b", + "52ce31": "90a4d7" + }, + "2": { + "d62100": "cdbb39", + "f76b00": "eaed6e", + "840000": "a7801f", + "e6d66b": "eb4f50", + "101010": "101010", + "b5a53a": "ca3442", + "847319": "a21b36", + "73ad31": "804428", + "9cd64a": "b68356", + "526329": "592819", + "ffffff": "ffffff", + "3a9400": "b8462a", + "105210": "901a17", + "52ce31": "e87940" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/185.json b/public/images/pokemon/variant/185.json new file mode 100644 index 00000000000..9935620d320 --- /dev/null +++ b/public/images/pokemon/variant/185.json @@ -0,0 +1,30 @@ +{ + "1": { + "635a4a": "322a22", + "c5a54a": "7b7670", + "ad845a": "5d564e", + "101010": "101010", + "315a19": "3d1e0c", + "4ac542": "8a6a24", + "5a8c5a": "6c4616", + "94d67b": "b6a747", + "8c7342": "4c443b", + "ce2910": "8d911d", + "ffce00": "afb331", + "e6b54a": "8f991b" + }, + "2": { + "635a4a": "2d2164", + "c5a54a": "5c80c0", + "ad845a": "4058a8", + "101010": "101010", + "315a19": "cf985e", + "4ac542": "efe1b2", + "5a8c5a": "e0c282", + "94d67b": "fffde9", + "8c7342": "3c389d", + "ce2910": "a5424a", + "ffce00": "c1e0f3", + "e6b54a": "8fb5dc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/190.json b/public/images/pokemon/variant/190.json new file mode 100644 index 00000000000..3a8e737b470 --- /dev/null +++ b/public/images/pokemon/variant/190.json @@ -0,0 +1,28 @@ +{ + "1": { + "8442ad": "ad452f", + "bd7bde": "dea95a", + "000000": "000000", + "52216b": "701523", + "a55ac5": "c47440", + "8c6b42": "8c7457", + "bd8c63": "bd9a7e", + "c5ad6b": "c4b487", + "ffdea5": "ffeccc", + "ffffff": "ffffff", + "adada5": "adada5" + }, + "2": { + "8442ad": "a6a297", + "bd7bde": "e5dfdf", + "000000": "000000", + "52216b": "807870", + "a55ac5": "bfbeb4", + "8c6b42": "632339", + "bd8c63": "802d44", + "c5ad6b": "99455d", + "ffdea5": "ed8286", + "ffffff": "ffffff", + "adada5": "adada5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/193.json b/public/images/pokemon/variant/193.json new file mode 100644 index 00000000000..90199bf510b --- /dev/null +++ b/public/images/pokemon/variant/193.json @@ -0,0 +1,36 @@ +{ + "1": { + "632900": "a13a80", + "f75a52": "fc95c5", + "101010": "101010", + "ad3119": "e069b1", + "94adbd": "c9859d", + "e6ffff": "f0afbc", + "ffbd9c": "ffded9", + "ff8c63": "ffc9d6", + "3a5a29": "2e2e70", + "73a54a": "7262de", + "c5d6ef": "ed9db5", + "b5ef73": "e1b6ff", + "7bd65a": "9d88f2", + "6b7b84": "a36280", + "4a4a52": "693e78" + }, + "2": { + "632900": "913919", + "f75a52": "eba64d", + "101010": "101010", + "ad3119": "cf6838", + "94adbd": "81a690", + "e6ffff": "f3ffe6", + "ffbd9c": "ebe0a7", + "ff8c63": "ebcf83", + "3a5a29": "25364f", + "73a54a": "46769c", + "c5d6ef": "d8edbb", + "b5ef73": "3ccfc5", + "7bd65a": "18adbd", + "6b7b84": "607b84", + "4a4a52": "3e4a52" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/196.json b/public/images/pokemon/variant/196.json index 02084307b2e..ce41a030de1 100644 --- a/public/images/pokemon/variant/196.json +++ b/public/images/pokemon/variant/196.json @@ -3,42 +3,42 @@ "7b4a7b": "204024", "101010": "101010", "efbdef": "bddd9e", - "e6a5d6": "6c9e63", + "e7a5d6": "6c9e63", "b57bb5": "416240", "314273": "a86a2c", "4a73b5": "ffb554", - "c52152": "ffa80e", + "c62152": "ffa80e", "ffffff": "ffffff", "8c2152": "c54200", "8463b5": "ffa72a", - "c5c5c5": "c5c5c5" + "c6c6c6": "c5c5c5" }, "1": { "7b4a7b": "581747", "101010": "101010", "efbdef": "e99eae", - "e6a5d6": "d1759c", + "e7a5d6": "d1759c", "b57bb5": "953b6c", "314273": "537fde", "4a73b5": "90b7f9", - "c52152": "31d9ff", + "c62152": "31d9ff", "ffffff": "ffffff", "8c2152": "15a7d2", "8463b5": "1662bf", - "c5c5c5": "c5c5c5" + "c6c6c6": "c5c5c5" }, "2": { "7b4a7b": "9b5250", "101010": "101010", "efbdef": "f5f3e1", - "e6a5d6": "ded0af", + "e7a5d6": "ded0af", "b57bb5": "ce987a", "314273": "194540", "4a73b5": "39816d", - "c52152": "00de92", + "c62152": "00de92", "ffffff": "ffffff", "8c2152": "00ad7f", "8463b5": "006b5b", - "c5c5c5": "c5c5c5" + "c6c6c6": "c5c5c5" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/199.json b/public/images/pokemon/variant/199.json new file mode 100644 index 00000000000..22e345030c0 --- /dev/null +++ b/public/images/pokemon/variant/199.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "63636b": "734927", + "d6d6d6": "f1d191", + "ada5a5": "bf9562", + "b52919": "2b191b", + "ffffff": "ffffff", + "ef736b": "5b3332", + "ce5252": "4c2523", + "ff9c94": "885345", + "d1cdc9": "d1cdc9", + "ad6310": "a25a53", + "deb531": "b97565", + "ffff8c": "e0b69d", + "a53129": "538a55", + "e64221": "50b64e", + "ff5a4a": "93de76" + }, + "2": { + "101010": "101010", + "63636b": "192b32", + "d6d6d6": "4c7668", + "ada5a5": "2b4a48", + "b52919": "893d28", + "ffffff": "ffffff", + "ef736b": "de9048", + "ce5252": "b0613c", + "ff9c94": "edbc69", + "d1cdc9": "d1cdc9", + "ad6310": "a12d18", + "deb531": "ba5127", + "ffff8c": "d16d36", + "a53129": "2e1910", + "e64221": "543322", + "ff5a4a": "6f4d35" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/2027.json b/public/images/pokemon/variant/2027.json new file mode 100644 index 00000000000..b479f8e2283 --- /dev/null +++ b/public/images/pokemon/variant/2027.json @@ -0,0 +1,32 @@ +{ + "1": { + "518d9f": "a24c68", + "354e73": "752e42", + "fefefe": "fefefe", + "b6dbe7": "ffdac2", + "84b3ce": "d27c80", + "101010": "101010", + "10397b": "212d55", + "897e67": "aaaa96", + "297bcd": "3b5e82", + "d1c592": "d3d3c6", + "fefea9": "fffffc", + "ebe2b1": "e9e9e0", + "cfd3d8": "cfd3d8" + }, + "2": { + "518d9f": "6a439e", + "354e73": "3d2c78", + "fefefe": "fefefe", + "b6dbe7": "dbb1eb", + "84b3ce": "a87bcf", + "101010": "101010", + "10397b": "1d6268", + "897e67": "2e163d", + "297bcd": "3a9b8a", + "d1c592": "44225a", + "fefea9": "6f3480", + "ebe2b1": "552668", + "cfd3d8": "cfd3d8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/2028.json b/public/images/pokemon/variant/2028.json new file mode 100644 index 00000000000..955b24576a2 --- /dev/null +++ b/public/images/pokemon/variant/2028.json @@ -0,0 +1,34 @@ +{ + "1": { + "3c88b4": "966281", + "101010": "101010", + "52b0cf": "e2877b", + "f1f1f4": "fffffc", + "b0e5f8": "fffed9", + "7dcff2": "f9e7b2", + "3a6b8c": "692a61", + "29397b": "3e1d4d", + "434f6f": "a14253", + "b7e3e7": "ffb59e", + "77a2bb": "d9746e", + "606060": "6f525d", + "8b8b8b": "8b8b8b", + "bdbdcd": "d0c0b6" + }, + "2": { + "3c88b4": "515fa9", + "101010": "101010", + "52b0cf": "57a5c5", + "f1f1f4": "e3f0ff", + "b0e5f8": "f8f5b0", + "7dcff2": "6edcaf", + "3a6b8c": "3c2d74", + "29397b": "321846", + "434f6f": "171227", + "b7e3e7": "5f2e71", + "77a2bb": "381d4d", + "606060": "3a3a54", + "8b8b8b": "8b8b8b", + "bdbdcd": "acb7d0" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/203.json b/public/images/pokemon/variant/203.json new file mode 100644 index 00000000000..a4391436a20 --- /dev/null +++ b/public/images/pokemon/variant/203.json @@ -0,0 +1,36 @@ +{ + "1": { + "424a73": "351810", + "ffffff": "ffffff", + "adb5d6": "8f6f66", + "6b8cb5": "512b21", + "4a3a3a": "231117", + "c5a53a": "7e262d", + "9c7b42": "571522", + "efde52": "9c3e3e", + "9c3a5a": "ab9d75", + "101010": "101010", + "ce6b94": "d8d1ad", + "947b6b": "1f4062", + "635252": "112246", + "d6c53a": "863838", + "8c735a": "213457" + }, + "2": { + "424a73": "27091d", + "ffffff": "ffffff", + "adb5d6": "c5b0b7", + "6b8cb5": "4a1b33", + "4a3a3a": "091225", + "c5a53a": "1e7884", + "9c7b42": "15545d", + "efde52": "2a9d8f", + "9c3a5a": "52ab5f", + "101010": "101010", + "ce6b94": "a8e781", + "947b6b": "1a2e43", + "635252": "111d34", + "d6c53a": "1f887b", + "8c735a": "152b3b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/213.json b/public/images/pokemon/variant/213.json new file mode 100644 index 00000000000..3ce19ff580c --- /dev/null +++ b/public/images/pokemon/variant/213.json @@ -0,0 +1,30 @@ +{ + "1": { + "bd8c29": "9b3e60", + "efc54a": "cc5b74", + "735210": "5d1931", + "ffff5a": "d68b71", + "101010": "101010", + "842100": "0d1f2d", + "6b633a": "8e4d31", + "d6ceb5": "fcc86f", + "ffffff": "fff0d8", + "bdad94": "db894a", + "b53129": "103a48", + "e64a42": "336c77" + }, + "2": { + "bd8c29": "328470", + "efc54a": "5bbfaa", + "735210": "254d59", + "ffff5a": "aaedbe", + "101010": "101010", + "842100": "2c1b2a", + "6b633a": "1f1f1f", + "d6ceb5": "4f3e46", + "ffffff": "705b66", + "bdad94": "44303b", + "b53129": "8a564d", + "e64a42": "c28d65" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/23.json b/public/images/pokemon/variant/23.json new file mode 100644 index 00000000000..f0f5f749d4d --- /dev/null +++ b/public/images/pokemon/variant/23.json @@ -0,0 +1,36 @@ +{ + "1": { + "b57b31": "96775e", + "ce63b5": "34a78a", + "a54a8c": "1f8179", + "ffe69c": "fffeee", + "efa5d6": "77d3a7", + "5a104a": "093640", + "845210": "6f483e", + "ffd66b": "f3f1d4", + "e6ad5a": "d6c7a2", + "101010": "101010", + "ffffff": "ffffff", + "9c1000": "9e352b", + "c54219": "c76740", + "f7734a": "e59d59", + "7b316b": "146569" + }, + "2": { + "b57b31": "293e6f", + "ce63b5": "cdb4aa", + "a54a8c": "b3857d", + "ffe69c": "82afcd", + "efa5d6": "ebe1d7", + "5a104a": "522a37", + "845210": "1d265b", + "ffd66b": "4d759b", + "e6ad5a": "3b5a87", + "101010": "101010", + "ffffff": "ffffff", + "9c1000": "67305a", + "c54219": "904864", + "f7734a": "a75e6d", + "7b316b": "8a5554" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/230.json b/public/images/pokemon/variant/230.json new file mode 100644 index 00000000000..83212a90de2 --- /dev/null +++ b/public/images/pokemon/variant/230.json @@ -0,0 +1,32 @@ +{ + "1": { + "4a5a94": "2a2750", + "639cce": "2f4861", + "101010": "101010", + "8cbdef": "396979", + "cee6f7": "5dac9b", + "add6ff": "3e8383", + "ffffff": "d0f9ea", + "bd3a31": "481e1c", + "7b7b7b": "425c58", + "d6d6d6": "709587", + "ad6b00": "377b4b", + "f7e64a": "abdd82", + "e6ad3a": "63a666" + }, + "2": { + "4a5a94": "54133f", + "639cce": "b53f49", + "101010": "101010", + "8cbdef": "d64b52", + "cee6f7": "ffb273", + "add6ff": "f27461", + "ffffff": "ffe8ea", + "bd3a31": "60806d", + "7b7b7b": "cd6093", + "d6d6d6": "ffaeb6", + "ad6b00": "4e878a", + "f7e64a": "b3f2d8", + "e6ad3a": "7bc9bb" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/233.json b/public/images/pokemon/variant/233.json new file mode 100644 index 00000000000..dd2b7299736 --- /dev/null +++ b/public/images/pokemon/variant/233.json @@ -0,0 +1,30 @@ +{ + "1": { + "94426b": "e27089", + "ef5a63": "f8a8cd", + "5a3a4a": "d9546f", + "ff94b5": "fccee9", + "ffffff": "ffffff", + "101010": "101010", + "31739c": "6d224c", + "8cd6ff": "9e4971", + "4a9cd6": "833462", + "313a63": "4c1131", + "d6d6d6": "e1dbff", + "6b6b7b": "887acd" + }, + "2": { + "94426b": "491c0c", + "ef5a63": "82391d", + "5a3a4a": "31150e", + "ff94b5": "a04c27", + "ffffff": "ffe4d4", + "101010": "101010", + "31739c": "cf8556", + "8cd6ff": "ffd9ab", + "4a9cd6": "efb787", + "313a63": "b77751", + "d6d6d6": "dcaa82", + "6b6b7b": "c67f4b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/24.json b/public/images/pokemon/variant/24.json new file mode 100644 index 00000000000..6faaf4b0c4e --- /dev/null +++ b/public/images/pokemon/variant/24.json @@ -0,0 +1,28 @@ +{ + "1": { + "7b63ad": "146d7d", + "c5a5ef": "8feae4", + "523a7b": "113a53", + "a584c5": "30abb3", + "101010": "101010", + "ffffff": "ffffff", + "c5c5c5": "c5c5c5", + "9c1000": "aa352b", + "f7734a": "e3aa74", + "c54219": "c27048", + "efe652": "fffde8" + }, + "2": { + "7b63ad": "bf9a8e", + "c5a5ef": "fff9e5", + "523a7b": "875a5f", + "a584c5": "eed3b1", + "101010": "101010", + "ffffff": "ffffff", + "c5c5c5": "c5c5c5", + "9c1000": "393c81", + "f7734a": "6388ac", + "c54219": "4f5a98", + "efe652": "86ddea" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/240.json b/public/images/pokemon/variant/240.json new file mode 100644 index 00000000000..06b748f4cb7 --- /dev/null +++ b/public/images/pokemon/variant/240.json @@ -0,0 +1,28 @@ +{ + "1": { + "d6523a": "372d49", + "ff7b63": "524b6f", + "943121": "272034", + "101010": "101010", + "c5c5c5": "c5c5c5", + "73737b": "73737b", + "ffffff": "ffffff", + "ffffb5": "f5ad27", + "f7d63a": "fb832b", + "d6ad00": "db4d19", + "ad8400": "a93f18" + }, + "2": { + "d6523a": "4065b0", + "ff7b63": "5398cf", + "943121": "303d58", + "101010": "101010", + "c5c5c5": "c5c5c5", + "73737b": "73737b", + "ffffff": "ffffff", + "ffffb5": "ffffff", + "f7d63a": "eaffff", + "d6ad00": "c6edf2", + "ad8400": "699296" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/255.json b/public/images/pokemon/variant/255.json new file mode 100644 index 00000000000..78d2d1d13dd --- /dev/null +++ b/public/images/pokemon/variant/255.json @@ -0,0 +1,28 @@ +{ + "1": { + "ad8c00": "298084", + "efbd31": "34ad90", + "f7de6b": "58dfa5", + "000000": "000000", + "ad4210": "b93a23", + "ff8c31": "ff9039", + "e65a21": "e86434", + "ffad52": "ffde8e", + "7b4a19": "6f1214", + "ffffff": "ffffff", + "8c5221": "1d5461" + }, + "2": { + "ad8c00": "550d28", + "efbd31": "811c2c", + "f7de6b": "ad3633", + "000000": "000000", + "ad4210": "b3817d", + "ff8c31": "f3e5cf", + "e65a21": "d3afa0", + "ffad52": "fffef6", + "7b4a19": "364464", + "ffffff": "ffffff", + "8c5221": "400724" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/256.json b/public/images/pokemon/variant/256.json new file mode 100644 index 00000000000..130891974ba --- /dev/null +++ b/public/images/pokemon/variant/256.json @@ -0,0 +1,42 @@ +{ + "1": { + "de5a29": "1f9ba4", + "181818": "181818", + "ff7b4a": "3dd0b0", + "9c3110": "11526f", + "9c7329": "a7471f", + "191919": "191919", + "efde73": "ffc148", + "efbd4a": "f19830", + "d63131": "9083aa", + "962d0d": "605c8d", + "ffffff": "ffffff", + "d05325": "414f7b", + "6b6b73": "413d75", + "dedece": "9386b8", + "9c8c84": "696098", + "645455": "3b3869", + "5a4a4a": "2c2a44", + "84736b": "574b6e" + }, + "2": { + "de5a29": "cdb09b", + "181818": "181818", + "ff7b4a": "fff7e1", + "9c3110": "8a685f", + "9c7329": "641835", + "191919": "191919", + "efde73": "c4584d", + "efbd4a": "962b39", + "d63131": "89bed0", + "962d0d": "5f7faa", + "ffffff": "ffffff", + "d05325": "39487b", + "6b6b73": "192132", + "dedece": "494f67", + "9c8c84": "2d2e46", + "645455": "211d32", + "5a4a4a": "ad662b", + "84736b": "e6a653" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/257-mega.json b/public/images/pokemon/variant/257-mega.json new file mode 100644 index 00000000000..e97fd77c50f --- /dev/null +++ b/public/images/pokemon/variant/257-mega.json @@ -0,0 +1,40 @@ +{ + "1": { + "ff6e45": "51b5cd", + "62524a": "55607d", + "dedeb4": "f0fbff", + "948362": "8095b3", + "010101": "010101", + "bdb494": "a8c7da", + "832929": "9b422a", + "ee6262": "f7ca4b", + "dea452": "94f1d8", + "bd4141": "da8923", + "f6d562": "dafff0", + "614e47": "2c2a44", + "93827a": "574b6e", + "297bd5": "930808", + "dfdfc1": "9386b8", + "292929": "16607e", + "414141": "279e91" + }, + "2": { + "ff6e45": "7747bf", + "62524a": "5b143d", + "dedeb4": "bc474d", + "948362": "842446", + "010101": "010101", + "bdb494": "a1304d", + "832929": "9c7c70", + "ee6262": "fffae1", + "dea452": "9d9bf3", + "bd4141": "d2bda7", + "f6d562": "c6e6ff", + "614e47": "ad662b", + "93827a": "e6a653", + "297bd5": "1f3061", + "dfdfc1": "4d4266", + "292929": "373260", + "414141": "505386" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/257.json b/public/images/pokemon/variant/257.json new file mode 100644 index 00000000000..e56213da4a7 --- /dev/null +++ b/public/images/pokemon/variant/257.json @@ -0,0 +1,26 @@ +{ + "1": { + "b93e3e": "46649c", + "000000": "000000", + "bdb594": "a8c7da", + "948463": "8095b3", + "ee5e5e": "598dc1", + "ff8463": "70b0d5", + "dedeb5": "f0fbff", + "63524a": "55607d", + "7b2525": "232647", + "842929": "11526f", + "ef6363": "3dd0b0", + "bd5f42": "97a3cc", + "ffde6b": "e1f0ff", + "dfa550": "b2c3e3", + "297bd6": "c64c07", + "bd4242": "1f9ba4", + "9c8c84": "574b6e", + "634e4a": "2c2a44", + "ffffff": "9386b8", + "dea552": "f99140", + "8c633a": "bf462a", + "f7d663": "ffc96b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/257_3.json b/public/images/pokemon/variant/257_3.json new file mode 100644 index 00000000000..daea32d3ee6 --- /dev/null +++ b/public/images/pokemon/variant/257_3.json @@ -0,0 +1,2624 @@ +{ + "textures": [ + { + "image": "257_3.png", + "format": "RGBA8888", + "size": { + "w": 372, + "h": 372 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 150, + "w": 59, + "h": 75 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 150, + "w": 59, + "h": 75 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 150, + "w": 59, + "h": 75 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 150, + "w": 59, + "h": 75 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 225, + "w": 59, + "h": 75 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 225, + "w": 59, + "h": 75 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 225, + "w": 59, + "h": 75 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 225, + "w": 59, + "h": 75 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 0, + "y": 225, + "w": 59, + "h": 75 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 300, + "w": 56, + "h": 72 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 118, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 118, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 118, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 118, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 177, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 236, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 236, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 236, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 236, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 295, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 295, + "y": 0, + "w": 59, + "h": 75 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 150, + "w": 59, + "h": 75 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 150, + "w": 59, + "h": 75 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 225, + "w": 59, + "h": 75 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 59, + "y": 225, + "w": 59, + "h": 75 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 118, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 177, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 177, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 75 + }, + "frame": { + "x": 236, + "y": 75, + "w": 59, + "h": 75 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 74 + }, + "frame": { + "x": 295, + "y": 75, + "w": 59, + "h": 74 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 74 + }, + "frame": { + "x": 295, + "y": 75, + "w": 59, + "h": 74 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 74 + }, + "frame": { + "x": 295, + "y": 149, + "w": 59, + "h": 74 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 74 + }, + "frame": { + "x": 295, + "y": 149, + "w": 59, + "h": 74 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 118, + "y": 223, + "w": 58, + "h": 75 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 118, + "y": 223, + "w": 58, + "h": 75 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 118, + "y": 223, + "w": 58, + "h": 75 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 118, + "y": 223, + "w": 58, + "h": 75 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 118, + "y": 223, + "w": 58, + "h": 75 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 118, + "y": 150, + "w": 59, + "h": 73 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 118, + "y": 150, + "w": 59, + "h": 73 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 118, + "y": 150, + "w": 59, + "h": 73 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 118, + "y": 150, + "w": 59, + "h": 73 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 118, + "y": 150, + "w": 59, + "h": 73 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 118, + "y": 150, + "w": 59, + "h": 73 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 118, + "y": 298, + "w": 58, + "h": 74 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 118, + "y": 298, + "w": 58, + "h": 74 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 118, + "y": 298, + "w": 58, + "h": 74 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 118, + "y": 298, + "w": 58, + "h": 74 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 118, + "y": 298, + "w": 58, + "h": 74 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 118, + "y": 298, + "w": 58, + "h": 74 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 177, + "y": 150, + "w": 58, + "h": 75 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 177, + "y": 150, + "w": 58, + "h": 75 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 177, + "y": 150, + "w": 58, + "h": 75 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 177, + "y": 150, + "w": 58, + "h": 75 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 235, + "y": 150, + "w": 58, + "h": 74 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 235, + "y": 150, + "w": 58, + "h": 74 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 235, + "y": 150, + "w": 58, + "h": 74 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 235, + "y": 150, + "w": 58, + "h": 74 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 235, + "y": 150, + "w": 58, + "h": 74 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 58, + "h": 74 + }, + "frame": { + "x": 235, + "y": 150, + "w": 58, + "h": 74 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 293, + "y": 223, + "w": 57, + "h": 74 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 293, + "y": 223, + "w": 57, + "h": 74 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 293, + "y": 223, + "w": 57, + "h": 74 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 293, + "y": 223, + "w": 57, + "h": 74 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 235, + "y": 224, + "w": 57, + "h": 74 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 235, + "y": 224, + "w": 57, + "h": 74 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 235, + "y": 224, + "w": 57, + "h": 74 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 235, + "y": 224, + "w": 57, + "h": 74 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 74 + }, + "frame": { + "x": 235, + "y": 224, + "w": 57, + "h": 74 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 298, + "w": 57, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 298, + "w": 57, + "h": 73 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 298, + "w": 57, + "h": 73 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 298, + "w": 57, + "h": 73 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 298, + "w": 57, + "h": 73 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 225, + "w": 57, + "h": 73 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 225, + "w": 57, + "h": 73 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 225, + "w": 57, + "h": 73 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 57, + "h": 73 + }, + "frame": { + "x": 176, + "y": 225, + "w": 57, + "h": 73 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 233, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 233, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 233, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 233, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 233, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 233, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 289, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 289, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 289, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 289, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 289, + "y": 298, + "w": 56, + "h": 73 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 59, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 56, + "h": 73 + }, + "frame": { + "x": 289, + "y": 298, + "w": 56, + "h": 73 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:087002afd0757bd4e12d606264bb7a81:7d472227d9af570b8c8f255eb906d77c:e7fdb8691ec4c35857529d9ecbe686ad$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/257_3.png b/public/images/pokemon/variant/257_3.png new file mode 100644 index 00000000000..8242580aaec Binary files /dev/null and b/public/images/pokemon/variant/257_3.png differ diff --git a/public/images/pokemon/variant/261.json b/public/images/pokemon/variant/261.json new file mode 100644 index 00000000000..ec04e5dbf43 --- /dev/null +++ b/public/images/pokemon/variant/261.json @@ -0,0 +1,34 @@ +{ + "1": { + "636363": "803c2c", + "c5c5c5": "d4a172", + "000000": "000000", + "a5a5a5": "b26c55", + "424242": "380927", + "595963": "71231f", + "5a5a63": "6d1757", + "9c2942": "222d84", + "e6193a": "3a56b1", + "bd8c42": "a968a1", + "ffffff": "ffffff", + "f7f75a": "c59aaa", + "6b6b84": "6b6b84", + "ff0018": "ff0018" + }, + "2": { + "636363": "24103c", + "c5c5c5": "753e93", + "000000": "000000", + "a5a5a5": "402067", + "424242": "4e9ea3", + "595963": "0a0f43", + "5a5a63": "96eedf", + "9c2942": "182556", + "e6193a": "263f74", + "bd8c42": "8aa8cd", + "ffffff": "ffffff", + "f7f75a": "bdd9f2", + "6b6b84": "6b6b84", + "ff0018": "ff0018" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/262.json b/public/images/pokemon/variant/262.json new file mode 100644 index 00000000000..3451ee0f16f --- /dev/null +++ b/public/images/pokemon/variant/262.json @@ -0,0 +1,36 @@ +{ + "1": { + "000000": "000000", + "525252": "7a3424", + "94949c": "ad5c41", + "bdbdc5": "d2975f", + "313131": "510c2b", + "4d4d4d": "71231f", + "4a4a4a": "711956", + "de2942": "a32c60", + "f7ef5a": "f7ef5a", + "bd8c42": "bd8c42", + "ad1021": "761b51", + "323232": "5a1c15", + "bd4a7b": "bd4a7b", + "ffffff": "ffffff", + "949cad": "949cad" + }, + "2": { + "000000": "000000", + "525252": "230f3b", + "94949c": "402067", + "bdbdc5": "753e93", + "313131": "4f9fa4", + "4d4d4d": "0b1044", + "4a4a4a": "96eedf", + "de2942": "5ba7ba", + "f7ef5a": "ffb98c", + "bd8c42": "d36b58", + "ad1021": "45809a", + "323232": "0a0b3d", + "bd4a7b": "bd4a7b", + "ffffff": "ffffff", + "949cad": "949cad" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/2670.json b/public/images/pokemon/variant/2670.json new file mode 100644 index 00000000000..a2a1fde327e --- /dev/null +++ b/public/images/pokemon/variant/2670.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "666161": "516378", + "403d3d": "222547", + "802d2d": "302a9c", + "d94c4c": "4c7dd9", + "ff7373": "73e1ff", + "243a66": "63132f", + "4068b8": "bf434e", + "595959": "151414", + "bfbfbf": "756b8e", + "f8f8f8": "9ea4bf", + "515151": "474040", + "fffbfb": "f8f4f4" + }, + "2": { + "101010": "101010", + "666161": "fff9f2", + "403d3d": "b5c6c3", + "802d2d": "20877a", + "d94c4c": "3aa68b", + "ff7373": "4cd9af", + "243a66": "1e5c1a", + "4068b8": "76b12a", + "595959": "1c1c1c", + "bfbfbf": "404040", + "f8f8f8": "636262", + "515151": "2a2a2a", + "fffbfb": "f9f9f9" + } +} \ No newline at end of file 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.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.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/327.json b/public/images/pokemon/variant/327.json new file mode 100644 index 00000000000..14d757e1002 --- /dev/null +++ b/public/images/pokemon/variant/327.json @@ -0,0 +1,24 @@ +{ + "1": { + "7b4231": "0a1b2e", + "e6d6a5": "b2dcd7", + "101010": "101010", + "735242": "122c3b", + "cea573": "6ca9ac", + "e66373": "df6341", + "ef524a": "2b6967", + "bd4a31": "17414a", + "ef947b": "4d918e" + }, + "2": { + "7b4231": "522014", + "e6d6a5": "be5f3c", + "101010": "101010", + "735242": "52180f", + "cea573": "93381f", + "e66373": "de625a", + "ef524a": "ebe1be", + "bd4a31": "cfc191", + "ef947b": "e5be9f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/337.json b/public/images/pokemon/variant/337.json new file mode 100644 index 00000000000..4681d4cd48d --- /dev/null +++ b/public/images/pokemon/variant/337.json @@ -0,0 +1,26 @@ +{ + "1": { + "94843a": "2a2836", + "b5a552": "38384b", + "efde8c": "8396a8", + "846b42": "161617", + "cebd6b": "505c71", + "101010": "101010", + "3a423a": "20282b", + "841029": "611267", + "d65a73": "ec40c7", + "b5213a": "b81fac" + }, + "2": { + "94843a": "45061e", + "b5a552": "630923", + "efde8c": "a63c22", + "846b42": "2f0616", + "cebd6b": "8a1211", + "101010": "101010", + "3a423a": "341413", + "841029": "08adad", + "d65a73": "73ffff", + "b5213a": "30d6d6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/393.json b/public/images/pokemon/variant/393.json new file mode 100644 index 00000000000..1449d14b88f --- /dev/null +++ b/public/images/pokemon/variant/393.json @@ -0,0 +1,36 @@ +{ + "1": { + "21639c": "3b7260", + "104a73": "244941", + "318cd6": "44a36b", + "6ba5e6": "54c461", + "ffffff": "ffffff", + "bdcede": "e2d7a5", + "63a5c5": "ce8a56", + "101010": "101010", + "9cd6f7": "e8ce81", + "637b94": "c68a67", + "ad843a": "81899b", + "ffefc5": "d0dde8", + "f7ce42": "bec8d1", + "634a10": "363b56", + "086b7b": "bc4423" + }, + "2": { + "21639c": "ae386b", + "104a73": "6f244e", + "318cd6": "df5d7e", + "6ba5e6": "ff8692", + "ffffff": "f4ede8", + "bdcede": "ccb9af", + "63a5c5": "4a172e", + "101010": "101010", + "9cd6f7": "782439", + "637b94": "877e78", + "ad843a": "368089", + "ffefc5": "92edcf", + "f7ce42": "67c1b7", + "634a10": "163e59", + "086b7b": "31091f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/394.json b/public/images/pokemon/variant/394.json new file mode 100644 index 00000000000..559eaa8b020 --- /dev/null +++ b/public/images/pokemon/variant/394.json @@ -0,0 +1,36 @@ +{ + "1": { + "bd8c6b": "363b56", + "ffe684": "bec8d1", + "7b5242": "1e202b", + "efce63": "81899b", + "101010": "101010", + "21426b": "2b544b", + "215a94": "338757", + "639cf7": "c97d4e", + "9cceff": "e8ce81", + "deefff": "ffefde", + "ffffff": "ffffff", + "3a7bb5": "b24125", + "bdcede": "e5dca5", + "225c96": "8c2419", + "84b5ff": "d6a466" + }, + "2": { + "bd8c6b": "3c7d84", + "ffe684": "baf3e4", + "7b5242": "265255", + "efce63": "82d3d0", + "101010": "101010", + "21426b": "c44a7c", + "215a94": "f880a0", + "639cf7": "670f2f", + "9cceff": "982332", + "deefff": "e2cbb4", + "ffffff": "fff9ea", + "3a7bb5": "460725", + "bdcede": "e2a3ad", + "225c96": "3d0c3a", + "84b5ff": "7d1535" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/395.json b/public/images/pokemon/variant/395.json new file mode 100644 index 00000000000..ad87c323be3 --- /dev/null +++ b/public/images/pokemon/variant/395.json @@ -0,0 +1,42 @@ +{ + "1": { + "bd8c6b": "363b56", + "ffe684": "bec8d1", + "efce63": "81899b", + "101010": "101010", + "103a73": "23603f", + "103c75": "7f1711", + "528ce6": "cc8043", + "9cceff": "fff18c", + "4a73ad": "c66933", + "f9fcff": "ffffff", + "295a94": "af4724", + "102142": "1c3834", + "7b5242": "1e202b", + "deefff": "cbede1", + "73a5ef": "e0b757", + "5891e8": "77ba95", + "f9fcfb": "eaf9f4", + "000000": "000000" + }, + "2": { + "bd8c6b": "2c7787", + "ffe684": "8af3dc", + "efce63": "4bb3b1", + "101010": "101010", + "103a73": "ffa5b2", + "103c75": "32092a", + "528ce6": "4f1438", + "9cceff": "7e2b44", + "4a73ad": "400e30", + "f9fcff": "f9fcff", + "295a94": "380b2a", + "102142": "da6785", + "7b5242": "184555", + "deefff": "7e1939", + "73a5ef": "641b3c", + "5891e8": "962849", + "f9fcfb": "ad2b41", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/4079.json b/public/images/pokemon/variant/4079.json new file mode 100644 index 00000000000..f1fd0c2ca2a --- /dev/null +++ b/public/images/pokemon/variant/4079.json @@ -0,0 +1,32 @@ +{ + "1": { + "936d20": "ad937b", + "caaa2c": "edc59e", + "fefe3c": "ffeccb", + "aa4a6b": "613934", + "f88daf": "bb694b", + "7c2847": "452a29", + "d5cdcd": "d5cdcd", + "fcfcfc": "fcfcfc", + "d76d96": "8f5345", + "101010": "101010", + "dea462": "e0799c", + "8b5a18": "a84071", + "ffe6b4": "ff9eba" + }, + "2": { + "936d20": "7b2c51", + "caaa2c": "963e59", + "fefe3c": "d9736b", + "aa4a6b": "846467", + "f88daf": "ecdcbe", + "7c2847": "503941", + "d5cdcd": "d5cdcd", + "fcfcfc": "fcfcfc", + "d76d96": "c6aead", + "101010": "101010", + "dea462": "ca8e74", + "8b5a18": "a45c58", + "ffe6b4": "eec596" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/4080.json b/public/images/pokemon/variant/4080.json new file mode 100644 index 00000000000..8a4b733e0ee --- /dev/null +++ b/public/images/pokemon/variant/4080.json @@ -0,0 +1,42 @@ +{ + "1": { + "723f7c": "edc59e", + "a565c0": "ffedcc", + "181818": "181818", + "d76792": "905446", + "c9c9c9": "c9c9c9", + "fbfbfb": "fbfbfb", + "7b6987": "a94172", + "f985aa": "bb694b", + "ede2ef": "ff9fbb", + "b5a0bd": "e17a9d", + "7b2645": "573531", + "e65229": "b56548", + "52525a": "831e2b", + "c2c9c9": "de504e", + "8b9494": "ad3139", + "c89a51": "a84254", + "875a2d": "752433", + "eed583": "c85966" + }, + "2": { + "723f7c": "963e59", + "a565c0": "d9736b", + "181818": "181818", + "d76792": "c6aead", + "c9c9c9": "c9c9c9", + "fbfbfb": "fbfbfb", + "7b6987": "a45c58", + "f985aa": "ecdcbe", + "ede2ef": "efc697", + "b5a0bd": "ca8e74", + "7b2645": "846467", + "e65229": "bfada6", + "52525a": "2a6122", + "c2c9c9": "b1dd73", + "8b9494": "71ae48", + "c89a51": "2a4948", + "875a2d": "1c2f35", + "eed583": "4c766a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/41.json b/public/images/pokemon/variant/41.json index d3af6fbd948..99ab116de02 100644 --- a/public/images/pokemon/variant/41.json +++ b/public/images/pokemon/variant/41.json @@ -1,28 +1,14 @@ { - "0": { - "101010": "101010", - "637bb5": "398422", - "4a427b": "084a00", - "bdceff": "99e870", - "8cb5ef": "5caf3b", - "b5529c": "bd9273", - "73215a": "a5785e", - "d673bd": "efd69c", - "ffffff": "ffffff", - "d6d6d6": "d6d6d6", - "636363": "636363" - }, "1": { "101010": "101010", - "637bb5": "37326f", + "637bb5": "12325c", "4a427b": "14093b", "bdceff": "868ecc", - "8cb5ef": "4e538f", - "b5529c": "cc7b32", - "73215a": "aa4c18", + "8cb5ef": "205182", + "b5529c": "d58e41", + "73215a": "b6591e", "d673bd": "f0ad57", "ffffff": "ffffff", - "d6d6d6": "d6d6d6", "636363": "636363" }, "2": { @@ -35,7 +21,6 @@ "73215a": "670f10", "d673bd": "bc3b1d", "ffffff": "ffffff", - "d6d6d6": "d6d6d6", "636363": "636363" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/418.json b/public/images/pokemon/variant/418.json new file mode 100644 index 00000000000..628252e5296 --- /dev/null +++ b/public/images/pokemon/variant/418.json @@ -0,0 +1,36 @@ +{ + "1": { + "ad5a21": "7d1e39", + "ef7b19": "9c354f", + "7b4221": "611b35", + "191919": "191919", + "dec584": "cea49d", + "f7f7b5": "e8d4cc", + "ffffff": "ffffff", + "6b6b6b": "6b6b6b", + "d6d6ce": "d6d6ce", + "ffde00": "d2e5e8", + "9c6300": "995e5c", + "e6a531": "a0b3ba", + "2163a5": "385e11", + "63bde6": "6a9539", + "ce6b19": "851d3e" + }, + "2": { + "ad5a21": "cd91aa", + "ef7b19": "e8c3ce", + "7b4221": "84466b", + "191919": "191919", + "dec584": "8a4370", + "f7f7b5": "a8688f", + "ffffff": "ffffff", + "6b6b6b": "432e38", + "d6d6ce": "d6d6ce", + "ffde00": "eda342", + "9c6300": "642858", + "e6a531": "ca6e26", + "2163a5": "4b2a70", + "63bde6": "744d99", + "ce6b19": "d9a8bc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/419.json b/public/images/pokemon/variant/419.json new file mode 100644 index 00000000000..414cd251187 --- /dev/null +++ b/public/images/pokemon/variant/419.json @@ -0,0 +1,36 @@ +{ + "1": { + "7b4221": "611b35", + "ef7b19": "9c354f", + "191919": "191919", + "ce6b19": "851d3e", + "ad5a21": "7d1e39", + "9c6300": "995e5c", + "f7f7b5": "e8d4cc", + "cebd84": "cea49d", + "99693c": "6a808c", + "e6a531": "a0b3ba", + "6b6b6b": "6b6b6b", + "ffffff": "ffffff", + "ffde00": "d2e5e8", + "2163a5": "385e11", + "63bde6": "6a9539" + }, + "2": { + "7b4221": "9e6a86", + "ef7b19": "debfc8", + "191919": "191919", + "ce6b19": "dca5b5", + "ad5a21": "cd91aa", + "9c6300": "672e5d", + "f7f7b5": "a8688f", + "cebd84": "965080", + "99693c": "8e410e", + "e6a531": "d4812f", + "6b6b6b": "726481", + "ffffff": "ffffff", + "ffde00": "eda342", + "2163a5": "4b2a70", + "63bde6": "744d99" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/4199.json b/public/images/pokemon/variant/4199.json new file mode 100644 index 00000000000..1b17bcc8234 --- /dev/null +++ b/public/images/pokemon/variant/4199.json @@ -0,0 +1,50 @@ +{ + "1": { + "493e66": "831e2b", + "a191b5": "de504e", + "7a6a98": "ad3139", + "101010": "101010", + "654493": "7e3351", + "413668": "622344", + "403468": "4f0926", + "269a36": "f28783", + "f8f8f8": "f8f8f8", + "a090b5": "ff9eba", + "63577d": "a84071", + "723f7c": "d0bca2", + "403568": "66222b", + "624493": "85363d", + "a565c0": "ffeccb", + "482a5b": "ae947c", + "7b2645": "573531", + "f985aa": "bb694b", + "d76792": "8f5345", + "a36c37": "752433", + "eed583": "c75865", + "c89a51": "a84254" + }, + "2": { + "493e66": "2a6122", + "a191b5": "b0dc72", + "7a6a98": "71ae48", + "101010": "101010", + "654493": "38735c", + "413668": "1d4c46", + "403468": "9f3637", + "269a36": "e68c5d", + "f8f8f8": "f8f8f8", + "a090b5": "efc697", + "63577d": "a55d59", + "723f7c": "ae4653", + "403568": "e7a673", + "624493": "ffedad", + "a565c0": "d9736b", + "482a5b": "7b2c51", + "7b2645": "846467", + "f985aa": "ecdcbe", + "d76792": "c7afae", + "a36c37": "1b2e34", + "eed583": "4c766a", + "c89a51": "2b4a49" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/41_1.png b/public/images/pokemon/variant/41_1.png deleted file mode 100644 index 003d45e5591..00000000000 Binary files a/public/images/pokemon/variant/41_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/41_2.png b/public/images/pokemon/variant/41_2.png deleted file mode 100644 index 59605d5265a..00000000000 Binary files a/public/images/pokemon/variant/41_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/41_3.png b/public/images/pokemon/variant/41_3.png deleted file mode 100644 index cd8c4542d2c..00000000000 Binary files a/public/images/pokemon/variant/41_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/42.json b/public/images/pokemon/variant/42.json index 74311a59fb2..af784a0fd2c 100644 --- a/public/images/pokemon/variant/42.json +++ b/public/images/pokemon/variant/42.json @@ -1,31 +1,17 @@ { - "0": { - "3a3a7b": "142557", - "5aadef": "6265b4", - "6384ce": "323f81", - "631052": "093263", - "ce6bb5": "61b6da", - "adceff": "99a3ee", - "000000": "000000", - "ad52ad": "348cc1", - "636363": "636363", - "ffffff": "ffffff", - "d6d6d6": "d6d6d6", - "943a7b": "175990" - }, "1": { - "3a3a7b": "084a00", - "5aadef": "6b9c29", - "6384ce": "317300", - "631052": "c52931", - "ce6bb5": "ffada5", - "adceff": "84d64a", + "3a3a7b": "14093b", + "5aadef": "204882", + "6384ce": "12245c", + "631052": "892d03", + "ce6bb5": "f1a139", + "adceff": "3c74b1", "000000": "000000", - "ad52ad": "e6737b", + "ad52ad": "d5711b", "636363": "636363", "ffffff": "ffffff", "d6d6d6": "d6d6d6", - "943a7b": "d6525a" + "943a7b": "af4e0c" }, "2": { "3a3a7b": "3d2349", diff --git a/public/images/pokemon/variant/424.json b/public/images/pokemon/variant/424.json new file mode 100644 index 00000000000..4e00c3c1234 --- /dev/null +++ b/public/images/pokemon/variant/424.json @@ -0,0 +1,38 @@ +{ + "1": { + "734a42": "415c73", + "ad5242": "428dad", + "ff735a": "5ae9ff", + "101010": "101010", + "debd73": "c4b487", + "ffefa5": "ffeccc", + "8c6b42": "8c7457", + "52216b": "701523", + "843aad": "ad452f", + "b563e6": "dea95a", + "9c4ac5": "c47440", + "bd9473": "bd9a7e", + "ab5141": "293b94", + "ffffff": "ffffff", + "fc7158": "3973e5", + "adada5": "adada5" + }, + "2": { + "734a42": "593802", + "ad5242": "946212", + "ff735a": "ffb338", + "101010": "101010", + "debd73": "99455d", + "ffefa5": "ed8286", + "8c6b42": "632339", + "52216b": "807870", + "843aad": "a6a297", + "b563e6": "e5dfdf", + "9c4ac5": "bfbeb4", + "bd9473": "802d44", + "ab5141": "8c1c2f", + "ffffff": "ffffff", + "fc7158": "b33636", + "adada5": "adada5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/42_2.png b/public/images/pokemon/variant/42_2.png deleted file mode 100644 index 629e3a926f4..00000000000 Binary files a/public/images/pokemon/variant/42_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/42_3.png b/public/images/pokemon/variant/42_3.png deleted file mode 100644 index 6fcfcbf1859..00000000000 Binary files a/public/images/pokemon/variant/42_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/43.json b/public/images/pokemon/variant/43.json new file mode 100644 index 00000000000..382d5ea10ad --- /dev/null +++ b/public/images/pokemon/variant/43.json @@ -0,0 +1,28 @@ +{ + "1": { + "4a5a21": "2a2274", + "8cad31": "3f419d", + "c5e67b": "90a1d7", + "9cd64a": "606dbb", + "101010": "101010", + "5a6b84": "7946a9", + "7394a5": "a564c7", + "94b5c5": "d688e6", + "ef3a31": "51ebc6", + "293a4a": "522c90", + "b52931": "2db8b8" + }, + "2": { + "4a5a21": "6a2509", + "8cad31": "8b4a13", + "c5e67b": "e8b737", + "9cd64a": "b88026", + "101010": "101010", + "5a6b84": "79152a", + "7394a5": "b3292e", + "94b5c5": "de6042", + "ef3a31": "e3d890", + "293a4a": "560a25", + "b52931": "c2a362" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/438.json b/public/images/pokemon/variant/438.json new file mode 100644 index 00000000000..11b250edd0c --- /dev/null +++ b/public/images/pokemon/variant/438.json @@ -0,0 +1,30 @@ +{ + "1": { + "315a19": "3d1e0c", + "5a8c5a": "6c4616", + "9cde7b": "b6a747", + "4ac542": "8a6a24", + "000000": "000000", + "846b42": "4c443b", + "524231": "322a22", + "ad845a": "5d564e", + "c5a54a": "7b7670", + "ffef7b": "dce069", + "f7ce3a": "adb743", + "a5424a": "8d911d" + }, + "2": { + "315a19": "846764", + "5a8c5a": "b9ac9d", + "9cde7b": "fffdee", + "4ac542": "e8e6d7", + "000000": "000000", + "846b42": "3c389d", + "524231": "2d2164", + "ad845a": "4058a8", + "c5a54a": "5c80c0", + "ffef7b": "c1e0f3", + "f7ce3a": "8fb5dc", + "a5424a": "a5424a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/44.json b/public/images/pokemon/variant/44.json new file mode 100644 index 00000000000..143a57297ec --- /dev/null +++ b/public/images/pokemon/variant/44.json @@ -0,0 +1,34 @@ +{ + "1": { + "5a2900": "162486", + "101010": "101010", + "ad523a": "4d75b6", + "843a19": "2c489f", + "ffbd42": "55bb7e", + "f7efbd": "7dcf94", + "ce734a": "7aa8d2", + "c57329": "0f7469", + "ff7300": "219771", + "8c3a19": "043d44", + "4a6b7b": "8259a9", + "10314a": "5d3d90", + "7b84a5": "ac76c7", + "b55ac5": "1d579d" + }, + "2": { + "5a2900": "680b10", + "101010": "101010", + "ad523a": "bd4e2d", + "843a19": "8d1e11", + "ffbd42": "e8d65e", + "f7efbd": "ede68f", + "ce734a": "d98247", + "c57329": "9f631f", + "ff7300": "bd9434", + "8c3a19": "773811", + "4a6b7b": "792033", + "10314a": "490e23", + "7b84a5": "b33c40", + "b55ac5": "d47230" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/441.json b/public/images/pokemon/variant/441.json new file mode 100644 index 00000000000..1fce9238ec2 --- /dev/null +++ b/public/images/pokemon/variant/441.json @@ -0,0 +1,34 @@ +{ + "1": { + "292931": "331d29", + "42424a": "573244", + "5a5a63": "8f5a70", + "000000": "000000", + "ffffff": "deacce", + "c5c5c5": "ffeef7", + "e67b9c": "ffd067", + "c51952": "e6a04c", + "2994ce": "f28f61", + "21317b": "7d3023", + "2963b5": "ca6543", + "a58c21": "803d67", + "f7d642": "cc6b95", + "216310": "3c3c64" + }, + "2": { + "292931": "212530", + "42424a": "2e333d", + "5a5a63": "3c4047", + "000000": "000000", + "ffffff": "dec0ac", + "c5c5c5": "fff1dc", + "e67b9c": "f37878", + "c51952": "cc4c63", + "2994ce": "a3a4a8", + "21317b": "35353d", + "2963b5": "71727a", + "a58c21": "7e8094", + "f7d642": "c0c4cc", + "216310": "4a4c57" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/45.json b/public/images/pokemon/variant/45.json new file mode 100644 index 00000000000..a1dfd2e7558 --- /dev/null +++ b/public/images/pokemon/variant/45.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "731910": "091d79", + "f78c8c": "8cbef7", + "f77373": "5e8fde", + "de4a5a": "436ac7", + "f7adb5": "add8f7", + "ffced6": "ceedff", + "944a00": "472b86", + "9c3a42": "2243ae", + "ce6319": "724ba4", + "ff8429": "966fbb", + "3a4263": "4a2f81", + "19294a": "201349", + "de4a5f": "3e9bae", + "5a6384": "6e4b9f", + "7384a5": "966fbb" + }, + "2": { + "101010": "101010", + "731910": "97696f", + "f78c8c": "ebe8d1", + "f77373": "d2cbb2", + "de4a5a": "cdb2a2", + "f7adb5": "51030e", + "ffced6": "880808", + "944a00": "621734", + "9c3a42": "bb9089", + "ce6319": "8b293e", + "ff8429": "a23d44", + "3a4263": "8b1b50", + "19294a": "510c35", + "de4a5f": "dca280", + "5a6384": "b32952", + "7384a5": "de4263" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/456.json b/public/images/pokemon/variant/456.json new file mode 100644 index 00000000000..d73c8b48616 --- /dev/null +++ b/public/images/pokemon/variant/456.json @@ -0,0 +1,32 @@ +{ + "1": { + "526b8c": "966764", + "94d6e6": "f3e1c6", + "101010": "101010", + "7394ad": "cda38c", + "833171": "d3633a", + "29293a": "4f2846", + "31425a": "824568", + "c5e6f7": "fffbf2", + "c54591": "f19e53", + "426b84": "aa6985", + "efffff": "efffff", + "c54a94": "8bbcd9", + "ad8cbd": "ffca7b" + }, + "2": { + "526b8c": "181e52", + "94d6e6": "34507e", + "101010": "101010", + "7394ad": "1c335b", + "833171": "366ea4", + "29293a": "b66736", + "31425a": "ffc452", + "c5e6f7": "49749b", + "c54591": "50a8c2", + "426b84": "fff8b0", + "efffff": "efffff", + "c54a94": "7b1615", + "ad8cbd": "3979a1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/4562.json b/public/images/pokemon/variant/4562.json new file mode 100644 index 00000000000..52855aa484a --- /dev/null +++ b/public/images/pokemon/variant/4562.json @@ -0,0 +1,32 @@ +{ + "1": { + "313131": "145555", + "525252": "257e6a", + "101010": "101010", + "672b82": "7e173e", + "ab38d1": "b0264c", + "371d3f": "371d3f", + "000000": "000000", + "6f5c6b": "743949", + "c5b9bb": "c69981", + "cb414b": "18265b", + "e6ddde": "d6b8a0", + "d0626a": "334599", + "927e8d": "a46361" + }, + "2": { + "313131": "69162c", + "525252": "90222b", + "101010": "101010", + "672b82": "57a0b9", + "ab38d1": "c2ffe2", + "371d3f": "371d3f", + "000000": "000000", + "6f5c6b": "0a4340", + "c5b9bb": "298a61", + "cb414b": "ffad58", + "e6ddde": "4fb66a", + "d0626a": "ffe78d", + "927e8d": "1f6455" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/457.json b/public/images/pokemon/variant/457.json new file mode 100644 index 00000000000..2c9766d905b --- /dev/null +++ b/public/images/pokemon/variant/457.json @@ -0,0 +1,30 @@ +{ + "1": { + "526b8c": "966764", + "101010": "101010", + "c5e6f7": "fffbf2", + "94d6e6": "f3e1c6", + "29293a": "4f2846", + "31425a": "824568", + "7394ad": "cda38c", + "c54591": "ffc369", + "9e357b": "c7703c", + "73427b": "6f75a0", + "c54a94": "aadff3", + "efffff": "efffff" + }, + "2": { + "526b8c": "0f154a", + "101010": "101010", + "c5e6f7": "5781c7", + "94d6e6": "34507e", + "29293a": "ffa849", + "31425a": "ffde67", + "7394ad": "1c335b", + "c54591": "50a8c2", + "9e357b": "366ea4", + "73427b": "7b1213", + "c54a94": "983121", + "efffff": "efffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/465.json b/public/images/pokemon/variant/465.json new file mode 100644 index 00000000000..a7ff2338057 --- /dev/null +++ b/public/images/pokemon/variant/465.json @@ -0,0 +1,22 @@ +{ + "1": { + "529cc5": "8153c7", + "d65a94": "5ad662", + "3a73ad": "6b3aad", + "bd216b": "21bd69", + "5a193a": "195a2a", + "193a63": "391963", + "295a84": "472984" + }, + "2": { + "529cc5": "ffedb6", + "d65a94": "e67d2f", + "3a73ad": "ebc582", + "bd216b": "b35131", + "31313a": "3d1519", + "5a193a": "752e2e", + "193a63": "705040", + "295a84": "ad875a", + "4a4a52": "57211a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/465_2.png b/public/images/pokemon/variant/465_2.png deleted file mode 100644 index db25e88ad98..00000000000 Binary files a/public/images/pokemon/variant/465_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/465_3.png b/public/images/pokemon/variant/465_3.png deleted file mode 100644 index fe8e764028b..00000000000 Binary files a/public/images/pokemon/variant/465_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/467.json b/public/images/pokemon/variant/467.json new file mode 100644 index 00000000000..684a34c97fa --- /dev/null +++ b/public/images/pokemon/variant/467.json @@ -0,0 +1,42 @@ +{ + "1": { + "846321": "8c3313", + "d33939": "cf4614", + "ffc53a": "fb8c3b", + "cea53a": "db4d19", + "f76331": "ee7f2d", + "4a4a42": "4a4a42", + "9e344a": "8c3313", + "ad3a52": "372d49", + "642423": "272034", + "4e251d": "581d08", + "101010": "101010", + "e64231": "524b6f", + "ff94a5": "777066", + "c55a6b": "474139", + "ffffff": "ffffff", + "ced6e6": "ced6e6", + "9b3c56": "3f352f", + "2a2523": "2a2523" + }, + "2": { + "846321": "699296", + "d33939": "31508c", + "ffc53a": "eaffff", + "cea53a": "c6edf2", + "f76331": "478bc0", + "4a4a42": "4a4a42", + "9e344a": "4065b0", + "ad3a52": "4065b0", + "642423": "303d58", + "4e251d": "303d58", + "101010": "101010", + "e64231": "5398cf", + "ff94a5": "abc7de", + "c55a6b": "7f90a9", + "ffffff": "ffffff", + "ced6e6": "ced6e6", + "9b3c56": "586271", + "2a2523": "2a2523" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/469.json b/public/images/pokemon/variant/469.json new file mode 100644 index 00000000000..afaaeab8796 --- /dev/null +++ b/public/images/pokemon/variant/469.json @@ -0,0 +1,38 @@ +{ + "1": { + "3a5a29": "8577e0", + "797982": "ba4369", + "f75a52": "5555ab", + "739c63": "dfbaff", + "733100": "322966", + "213a19": "534fab", + "4a4a52": "942b5a", + "ffffff": "c4f2ff", + "52844a": "c59eff", + "c5cee6": "91c2fa", + "7b7b84": "6143b3", + "797983": "6143b3", + "a5adc5": "6e8ce0", + "292931": "511d5e", + "b53119": "403a91", + "ff948c": "5c7db5" + }, + "2": { + "3a5a29": "965a2f", + "797982": "516d82", + "f75a52": "21b0a6", + "739c63": "ebcf7c", + "733100": "2e5785", + "213a19": "70331d", + "4a4a52": "2e4a52", + "ffffff": "c1dede", + "52844a": "e0a14f", + "c5cee6": "97c0c4", + "7b7b84": "4f6b80", + "797983": "4f6b80", + "a5adc5": "678ea6", + "292931": "1f3144", + "b53119": "2c8199", + "ff948c": "79d4ba" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/469_2.json b/public/images/pokemon/variant/469_2.json new file mode 100644 index 00000000000..5b7f5b44785 --- /dev/null +++ b/public/images/pokemon/variant/469_2.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "469_2.png", + "format": "RGBA8888", + "size": { + "w": 553, + "h": 553 + }, + "scale": 1, + "frames": [ + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 38, + "w": 82, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 82, + "h": 54 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 20, + "w": 82, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 82, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 81, + "h": 65 + }, + "frame": { + "x": 82, + "y": 0, + "w": 81, + "h": 65 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 16, + "w": 81, + "h": 65 + }, + "frame": { + "x": 82, + "y": 0, + "w": 81, + "h": 65 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 81, + "h": 64 + }, + "frame": { + "x": 0, + "y": 54, + "w": 81, + "h": 64 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 81, + "h": 64 + }, + "frame": { + "x": 0, + "y": 54, + "w": 81, + "h": 64 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, + "w": 81, + "h": 62 + }, + "frame": { + "x": 163, + "y": 0, + "w": 81, + "h": 62 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 27, + "w": 81, + "h": 62 + }, + "frame": { + "x": 163, + "y": 0, + "w": 81, + "h": 62 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 13, + "w": 81, + "h": 62 + }, + "frame": { + "x": 163, + "y": 0, + "w": 81, + "h": 62 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 15, + "w": 81, + "h": 61 + }, + "frame": { + "x": 244, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 26, + "w": 81, + "h": 61 + }, + "frame": { + "x": 244, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 81, + "h": 61 + }, + "frame": { + "x": 244, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 27, + "w": 81, + "h": 61 + }, + "frame": { + "x": 244, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 1, + "y": 33, + "w": 81, + "h": 61 + }, + "frame": { + "x": 325, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 33, + "w": 81, + "h": 59 + }, + "frame": { + "x": 406, + "y": 0, + "w": 81, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 81, + "h": 59 + }, + "frame": { + "x": 406, + "y": 0, + "w": 81, + "h": 59 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 32, + "w": 81, + "h": 58 + }, + "frame": { + "x": 406, + "y": 59, + "w": 81, + "h": 58 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 19, + "w": 81, + "h": 58 + }, + "frame": { + "x": 406, + "y": 59, + "w": 81, + "h": 58 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 80, + "h": 69 + }, + "frame": { + "x": 244, + "y": 61, + "w": 80, + "h": 69 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 80, + "h": 68 + }, + "frame": { + "x": 163, + "y": 62, + "w": 80, + "h": 68 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 80, + "h": 65 + }, + "frame": { + "x": 81, + "y": 65, + "w": 80, + "h": 65 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 80, + "h": 65 + }, + "frame": { + "x": 81, + "y": 65, + "w": 80, + "h": 65 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 80, + "h": 64 + }, + "frame": { + "x": 0, + "y": 118, + "w": 80, + "h": 64 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 17, + "w": 80, + "h": 64 + }, + "frame": { + "x": 0, + "y": 118, + "w": 80, + "h": 64 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 80, + "h": 64 + }, + "frame": { + "x": 324, + "y": 61, + "w": 80, + "h": 64 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 80, + "h": 64 + }, + "frame": { + "x": 324, + "y": 61, + "w": 80, + "h": 64 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 80, + "h": 64 + }, + "frame": { + "x": 404, + "y": 117, + "w": 80, + "h": 64 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 80, + "h": 64 + }, + "frame": { + "x": 404, + "y": 117, + "w": 80, + "h": 64 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 2, + "y": 9, + "w": 80, + "h": 63 + }, + "frame": { + "x": 324, + "y": 125, + "w": 80, + "h": 63 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 25, + "w": 80, + "h": 63 + }, + "frame": { + "x": 324, + "y": 125, + "w": 80, + "h": 63 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 23, + "w": 80, + "h": 63 + }, + "frame": { + "x": 404, + "y": 181, + "w": 80, + "h": 63 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 80, + "h": 63 + }, + "frame": { + "x": 404, + "y": 181, + "w": 80, + "h": 63 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 31, + "w": 80, + "h": 63 + }, + "frame": { + "x": 80, + "y": 130, + "w": 80, + "h": 63 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 80, + "h": 63 + }, + "frame": { + "x": 80, + "y": 130, + "w": 80, + "h": 63 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 182, + "w": 80, + "h": 62 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 1, + "y": 29, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 182, + "w": 80, + "h": 62 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 182, + "w": 80, + "h": 62 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 182, + "w": 80, + "h": 62 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 1, + "y": 29, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 2, + "y": 10, + "w": 80, + "h": 62 + }, + "frame": { + "x": 240, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 26, + "w": 80, + "h": 62 + }, + "frame": { + "x": 240, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 32, + "w": 80, + "h": 62 + }, + "frame": { + "x": 320, + "y": 188, + "w": 80, + "h": 62 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 10, + "w": 80, + "h": 62 + }, + "frame": { + "x": 320, + "y": 188, + "w": 80, + "h": 62 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 12, + "w": 80, + "h": 62 + }, + "frame": { + "x": 400, + "y": 244, + "w": 80, + "h": 62 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 62 + }, + "frame": { + "x": 400, + "y": 244, + "w": 80, + "h": 62 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 13, + "w": 80, + "h": 62 + }, + "frame": { + "x": 400, + "y": 244, + "w": 80, + "h": 62 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 192, + "w": 80, + "h": 62 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 192, + "w": 80, + "h": 62 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 192, + "w": 80, + "h": 62 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 15, + "w": 80, + "h": 61 + }, + "frame": { + "x": 80, + "y": 193, + "w": 80, + "h": 61 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 26, + "w": 80, + "h": 61 + }, + "frame": { + "x": 80, + "y": 193, + "w": 80, + "h": 61 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 80, + "h": 61 + }, + "frame": { + "x": 80, + "y": 193, + "w": 80, + "h": 61 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 61 + }, + "frame": { + "x": 80, + "y": 193, + "w": 80, + "h": 61 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 13, + "w": 80, + "h": 61 + }, + "frame": { + "x": 0, + "y": 244, + "w": 80, + "h": 61 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 24, + "w": 80, + "h": 61 + }, + "frame": { + "x": 0, + "y": 244, + "w": 80, + "h": 61 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 80, + "h": 61 + }, + "frame": { + "x": 0, + "y": 244, + "w": 80, + "h": 61 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 61 + }, + "frame": { + "x": 0, + "y": 244, + "w": 80, + "h": 61 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 2, + "y": 33, + "w": 80, + "h": 61 + }, + "frame": { + "x": 240, + "y": 192, + "w": 80, + "h": 61 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 18, + "w": 80, + "h": 61 + }, + "frame": { + "x": 320, + "y": 250, + "w": 80, + "h": 61 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 24, + "w": 80, + "h": 61 + }, + "frame": { + "x": 320, + "y": 250, + "w": 80, + "h": 61 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 80, + "h": 61 + }, + "frame": { + "x": 240, + "y": 253, + "w": 80, + "h": 61 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 32, + "w": 80, + "h": 60 + }, + "frame": { + "x": 400, + "y": 306, + "w": 80, + "h": 60 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 80, + "h": 60 + }, + "frame": { + "x": 400, + "y": 306, + "w": 80, + "h": 60 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 19, + "w": 80, + "h": 60 + }, + "frame": { + "x": 320, + "y": 311, + "w": 80, + "h": 60 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 25, + "w": 80, + "h": 60 + }, + "frame": { + "x": 320, + "y": 311, + "w": 80, + "h": 60 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 80, + "h": 60 + }, + "frame": { + "x": 400, + "y": 366, + "w": 80, + "h": 60 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 78, + "h": 69 + }, + "frame": { + "x": 0, + "y": 426, + "w": 78, + "h": 69 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 34, + "w": 79, + "h": 58 + }, + "frame": { + "x": 0, + "y": 495, + "w": 79, + "h": 58 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 11, + "w": 79, + "h": 58 + }, + "frame": { + "x": 0, + "y": 495, + "w": 79, + "h": 58 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 78, + "h": 68 + }, + "frame": { + "x": 78, + "y": 426, + "w": 78, + "h": 68 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 25, + "w": 80, + "h": 59 + }, + "frame": { + "x": 79, + "y": 494, + "w": 80, + "h": 59 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 21, + "w": 80, + "h": 59 + }, + "frame": { + "x": 79, + "y": 494, + "w": 80, + "h": 59 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 35, + "w": 80, + "h": 57 + }, + "frame": { + "x": 159, + "y": 254, + "w": 80, + "h": 57 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 12, + "w": 80, + "h": 57 + }, + "frame": { + "x": 159, + "y": 254, + "w": 80, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 79, + "h": 65 + }, + "frame": { + "x": 80, + "y": 254, + "w": 79, + "h": 65 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 79, + "h": 65 + }, + "frame": { + "x": 80, + "y": 254, + "w": 79, + "h": 65 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 33, + "w": 80, + "h": 57 + }, + "frame": { + "x": 0, + "y": 305, + "w": 80, + "h": 57 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 20, + "w": 80, + "h": 57 + }, + "frame": { + "x": 0, + "y": 305, + "w": 80, + "h": 57 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 36, + "w": 80, + "h": 56 + }, + "frame": { + "x": 159, + "y": 311, + "w": 80, + "h": 56 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 9, + "y": 18, + "w": 80, + "h": 56 + }, + "frame": { + "x": 159, + "y": 311, + "w": 80, + "h": 56 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 23, + "w": 79, + "h": 63 + }, + "frame": { + "x": 80, + "y": 319, + "w": 79, + "h": 63 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 79, + "h": 63 + }, + "frame": { + "x": 80, + "y": 319, + "w": 79, + "h": 63 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 35, + "w": 80, + "h": 56 + }, + "frame": { + "x": 0, + "y": 362, + "w": 80, + "h": 56 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 17, + "w": 80, + "h": 56 + }, + "frame": { + "x": 0, + "y": 362, + "w": 80, + "h": 56 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 0, + "y": 32, + "w": 79, + "h": 62 + }, + "frame": { + "x": 239, + "y": 314, + "w": 79, + "h": 62 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 79, + "h": 62 + }, + "frame": { + "x": 159, + "y": 367, + "w": 79, + "h": 62 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 79, + "h": 62 + }, + "frame": { + "x": 159, + "y": 367, + "w": 79, + "h": 62 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 79, + "h": 62 + }, + "frame": { + "x": 159, + "y": 367, + "w": 79, + "h": 62 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 78, + "h": 63 + }, + "frame": { + "x": 156, + "y": 429, + "w": 78, + "h": 63 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 25, + "w": 78, + "h": 63 + }, + "frame": { + "x": 156, + "y": 429, + "w": 78, + "h": 63 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 13, + "w": 79, + "h": 61 + }, + "frame": { + "x": 159, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 24, + "w": 79, + "h": 61 + }, + "frame": { + "x": 159, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 79, + "h": 61 + }, + "frame": { + "x": 159, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 79, + "h": 61 + }, + "frame": { + "x": 159, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 31, + "w": 78, + "h": 63 + }, + "frame": { + "x": 234, + "y": 429, + "w": 78, + "h": 63 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 78, + "h": 63 + }, + "frame": { + "x": 234, + "y": 429, + "w": 78, + "h": 63 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 10, + "y": 27, + "w": 79, + "h": 61 + }, + "frame": { + "x": 238, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 10, + "y": 28, + "w": 79, + "h": 60 + }, + "frame": { + "x": 318, + "y": 371, + "w": 79, + "h": 60 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 18, + "w": 78, + "h": 61 + }, + "frame": { + "x": 312, + "y": 431, + "w": 78, + "h": 61 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 24, + "w": 78, + "h": 61 + }, + "frame": { + "x": 312, + "y": 431, + "w": 78, + "h": 61 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 24, + "w": 79, + "h": 60 + }, + "frame": { + "x": 317, + "y": 492, + "w": 79, + "h": 60 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 20, + "w": 79, + "h": 60 + }, + "frame": { + "x": 317, + "y": 492, + "w": 79, + "h": 60 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 78, + "h": 60 + }, + "frame": { + "x": 390, + "y": 431, + "w": 78, + "h": 60 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 15, + "w": 78, + "h": 62 + }, + "frame": { + "x": 396, + "y": 491, + "w": 78, + "h": 62 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 3, + "y": 29, + "w": 78, + "h": 62 + }, + "frame": { + "x": 396, + "y": 491, + "w": 78, + "h": 62 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 78, + "h": 62 + }, + "frame": { + "x": 396, + "y": 491, + "w": 78, + "h": 62 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 27, + "w": 78, + "h": 62 + }, + "frame": { + "x": 396, + "y": 491, + "w": 78, + "h": 62 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 0, + "y": 32, + "w": 78, + "h": 62 + }, + "frame": { + "x": 474, + "y": 426, + "w": 78, + "h": 62 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 12, + "y": 28, + "w": 77, + "h": 60 + }, + "frame": { + "x": 474, + "y": 488, + "w": 77, + "h": 60 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:ca128330213972f2e2b14fcc562acba5:087f6709d9573f70630b64c92020e5c9:c00bbabb917bffee4efc8a00433e2079$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/469_2.png b/public/images/pokemon/variant/469_2.png new file mode 100644 index 00000000000..f7ea79b0509 Binary files /dev/null and b/public/images/pokemon/variant/469_2.png differ diff --git a/public/images/pokemon/variant/469_3.json b/public/images/pokemon/variant/469_3.json new file mode 100644 index 00000000000..3628c373155 --- /dev/null +++ b/public/images/pokemon/variant/469_3.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "469_3.png", + "format": "RGBA8888", + "size": { + "w": 553, + "h": 553 + }, + "scale": 1, + "frames": [ + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 38, + "w": 82, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 82, + "h": 54 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 20, + "w": 82, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 82, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 81, + "h": 65 + }, + "frame": { + "x": 82, + "y": 0, + "w": 81, + "h": 65 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 16, + "w": 81, + "h": 65 + }, + "frame": { + "x": 82, + "y": 0, + "w": 81, + "h": 65 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 81, + "h": 64 + }, + "frame": { + "x": 0, + "y": 54, + "w": 81, + "h": 64 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 81, + "h": 64 + }, + "frame": { + "x": 0, + "y": 54, + "w": 81, + "h": 64 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, + "w": 81, + "h": 62 + }, + "frame": { + "x": 163, + "y": 0, + "w": 81, + "h": 62 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 27, + "w": 81, + "h": 62 + }, + "frame": { + "x": 163, + "y": 0, + "w": 81, + "h": 62 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 13, + "w": 81, + "h": 62 + }, + "frame": { + "x": 163, + "y": 0, + "w": 81, + "h": 62 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 15, + "w": 81, + "h": 61 + }, + "frame": { + "x": 244, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 26, + "w": 81, + "h": 61 + }, + "frame": { + "x": 244, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 81, + "h": 61 + }, + "frame": { + "x": 244, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 27, + "w": 81, + "h": 61 + }, + "frame": { + "x": 244, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 1, + "y": 33, + "w": 81, + "h": 61 + }, + "frame": { + "x": 325, + "y": 0, + "w": 81, + "h": 61 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 33, + "w": 81, + "h": 59 + }, + "frame": { + "x": 406, + "y": 0, + "w": 81, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 81, + "h": 59 + }, + "frame": { + "x": 406, + "y": 0, + "w": 81, + "h": 59 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 32, + "w": 81, + "h": 58 + }, + "frame": { + "x": 406, + "y": 59, + "w": 81, + "h": 58 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 19, + "w": 81, + "h": 58 + }, + "frame": { + "x": 406, + "y": 59, + "w": 81, + "h": 58 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 80, + "h": 69 + }, + "frame": { + "x": 244, + "y": 61, + "w": 80, + "h": 69 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 80, + "h": 68 + }, + "frame": { + "x": 163, + "y": 62, + "w": 80, + "h": 68 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 80, + "h": 65 + }, + "frame": { + "x": 81, + "y": 65, + "w": 80, + "h": 65 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 80, + "h": 65 + }, + "frame": { + "x": 81, + "y": 65, + "w": 80, + "h": 65 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 80, + "h": 64 + }, + "frame": { + "x": 0, + "y": 118, + "w": 80, + "h": 64 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 17, + "w": 80, + "h": 64 + }, + "frame": { + "x": 0, + "y": 118, + "w": 80, + "h": 64 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 80, + "h": 64 + }, + "frame": { + "x": 324, + "y": 61, + "w": 80, + "h": 64 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 80, + "h": 64 + }, + "frame": { + "x": 324, + "y": 61, + "w": 80, + "h": 64 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 80, + "h": 64 + }, + "frame": { + "x": 404, + "y": 117, + "w": 80, + "h": 64 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 80, + "h": 64 + }, + "frame": { + "x": 404, + "y": 117, + "w": 80, + "h": 64 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 2, + "y": 9, + "w": 80, + "h": 63 + }, + "frame": { + "x": 324, + "y": 125, + "w": 80, + "h": 63 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 25, + "w": 80, + "h": 63 + }, + "frame": { + "x": 324, + "y": 125, + "w": 80, + "h": 63 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 23, + "w": 80, + "h": 63 + }, + "frame": { + "x": 404, + "y": 181, + "w": 80, + "h": 63 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 80, + "h": 63 + }, + "frame": { + "x": 404, + "y": 181, + "w": 80, + "h": 63 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 31, + "w": 80, + "h": 63 + }, + "frame": { + "x": 80, + "y": 130, + "w": 80, + "h": 63 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 80, + "h": 63 + }, + "frame": { + "x": 80, + "y": 130, + "w": 80, + "h": 63 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 182, + "w": 80, + "h": 62 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 1, + "y": 29, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 182, + "w": 80, + "h": 62 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 182, + "w": 80, + "h": 62 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 182, + "w": 80, + "h": 62 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 1, + "y": 29, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 2, + "y": 10, + "w": 80, + "h": 62 + }, + "frame": { + "x": 240, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 26, + "w": 80, + "h": 62 + }, + "frame": { + "x": 240, + "y": 130, + "w": 80, + "h": 62 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 32, + "w": 80, + "h": 62 + }, + "frame": { + "x": 320, + "y": 188, + "w": 80, + "h": 62 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 10, + "w": 80, + "h": 62 + }, + "frame": { + "x": 320, + "y": 188, + "w": 80, + "h": 62 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 12, + "w": 80, + "h": 62 + }, + "frame": { + "x": 400, + "y": 244, + "w": 80, + "h": 62 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 62 + }, + "frame": { + "x": 400, + "y": 244, + "w": 80, + "h": 62 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 13, + "w": 80, + "h": 62 + }, + "frame": { + "x": 400, + "y": 244, + "w": 80, + "h": 62 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 192, + "w": 80, + "h": 62 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 192, + "w": 80, + "h": 62 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 80, + "h": 62 + }, + "frame": { + "x": 160, + "y": 192, + "w": 80, + "h": 62 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 15, + "w": 80, + "h": 61 + }, + "frame": { + "x": 80, + "y": 193, + "w": 80, + "h": 61 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 26, + "w": 80, + "h": 61 + }, + "frame": { + "x": 80, + "y": 193, + "w": 80, + "h": 61 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 80, + "h": 61 + }, + "frame": { + "x": 80, + "y": 193, + "w": 80, + "h": 61 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 61 + }, + "frame": { + "x": 80, + "y": 193, + "w": 80, + "h": 61 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 13, + "w": 80, + "h": 61 + }, + "frame": { + "x": 0, + "y": 244, + "w": 80, + "h": 61 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 24, + "w": 80, + "h": 61 + }, + "frame": { + "x": 0, + "y": 244, + "w": 80, + "h": 61 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 80, + "h": 61 + }, + "frame": { + "x": 0, + "y": 244, + "w": 80, + "h": 61 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 80, + "h": 61 + }, + "frame": { + "x": 0, + "y": 244, + "w": 80, + "h": 61 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 2, + "y": 33, + "w": 80, + "h": 61 + }, + "frame": { + "x": 240, + "y": 192, + "w": 80, + "h": 61 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 18, + "w": 80, + "h": 61 + }, + "frame": { + "x": 320, + "y": 250, + "w": 80, + "h": 61 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 24, + "w": 80, + "h": 61 + }, + "frame": { + "x": 320, + "y": 250, + "w": 80, + "h": 61 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 80, + "h": 61 + }, + "frame": { + "x": 240, + "y": 253, + "w": 80, + "h": 61 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 32, + "w": 80, + "h": 60 + }, + "frame": { + "x": 400, + "y": 306, + "w": 80, + "h": 60 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 80, + "h": 60 + }, + "frame": { + "x": 400, + "y": 306, + "w": 80, + "h": 60 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 19, + "w": 80, + "h": 60 + }, + "frame": { + "x": 320, + "y": 311, + "w": 80, + "h": 60 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 25, + "w": 80, + "h": 60 + }, + "frame": { + "x": 320, + "y": 311, + "w": 80, + "h": 60 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 80, + "h": 60 + }, + "frame": { + "x": 400, + "y": 366, + "w": 80, + "h": 60 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 78, + "h": 69 + }, + "frame": { + "x": 0, + "y": 426, + "w": 78, + "h": 69 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 34, + "w": 79, + "h": 58 + }, + "frame": { + "x": 0, + "y": 495, + "w": 79, + "h": 58 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 11, + "w": 79, + "h": 58 + }, + "frame": { + "x": 0, + "y": 495, + "w": 79, + "h": 58 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 78, + "h": 68 + }, + "frame": { + "x": 78, + "y": 426, + "w": 78, + "h": 68 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 25, + "w": 80, + "h": 59 + }, + "frame": { + "x": 79, + "y": 494, + "w": 80, + "h": 59 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 21, + "w": 80, + "h": 59 + }, + "frame": { + "x": 79, + "y": 494, + "w": 80, + "h": 59 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 35, + "w": 80, + "h": 57 + }, + "frame": { + "x": 159, + "y": 254, + "w": 80, + "h": 57 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 6, + "y": 12, + "w": 80, + "h": 57 + }, + "frame": { + "x": 159, + "y": 254, + "w": 80, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 79, + "h": 65 + }, + "frame": { + "x": 80, + "y": 254, + "w": 79, + "h": 65 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 79, + "h": 65 + }, + "frame": { + "x": 80, + "y": 254, + "w": 79, + "h": 65 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 33, + "w": 80, + "h": 57 + }, + "frame": { + "x": 0, + "y": 305, + "w": 80, + "h": 57 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 20, + "w": 80, + "h": 57 + }, + "frame": { + "x": 0, + "y": 305, + "w": 80, + "h": 57 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 36, + "w": 80, + "h": 56 + }, + "frame": { + "x": 159, + "y": 311, + "w": 80, + "h": 56 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 9, + "y": 18, + "w": 80, + "h": 56 + }, + "frame": { + "x": 159, + "y": 311, + "w": 80, + "h": 56 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 23, + "w": 79, + "h": 63 + }, + "frame": { + "x": 80, + "y": 319, + "w": 79, + "h": 63 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 79, + "h": 63 + }, + "frame": { + "x": 80, + "y": 319, + "w": 79, + "h": 63 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 35, + "w": 80, + "h": 56 + }, + "frame": { + "x": 0, + "y": 362, + "w": 80, + "h": 56 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 17, + "w": 80, + "h": 56 + }, + "frame": { + "x": 0, + "y": 362, + "w": 80, + "h": 56 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 0, + "y": 32, + "w": 79, + "h": 62 + }, + "frame": { + "x": 239, + "y": 314, + "w": 79, + "h": 62 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 79, + "h": 62 + }, + "frame": { + "x": 159, + "y": 367, + "w": 79, + "h": 62 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 79, + "h": 62 + }, + "frame": { + "x": 159, + "y": 367, + "w": 79, + "h": 62 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 79, + "h": 62 + }, + "frame": { + "x": 159, + "y": 367, + "w": 79, + "h": 62 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 78, + "h": 63 + }, + "frame": { + "x": 156, + "y": 429, + "w": 78, + "h": 63 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 25, + "w": 78, + "h": 63 + }, + "frame": { + "x": 156, + "y": 429, + "w": 78, + "h": 63 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 13, + "w": 79, + "h": 61 + }, + "frame": { + "x": 159, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 24, + "w": 79, + "h": 61 + }, + "frame": { + "x": 159, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 79, + "h": 61 + }, + "frame": { + "x": 159, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 27, + "w": 79, + "h": 61 + }, + "frame": { + "x": 159, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 31, + "w": 78, + "h": 63 + }, + "frame": { + "x": 234, + "y": 429, + "w": 78, + "h": 63 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 78, + "h": 63 + }, + "frame": { + "x": 234, + "y": 429, + "w": 78, + "h": 63 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 10, + "y": 27, + "w": 79, + "h": 61 + }, + "frame": { + "x": 238, + "y": 492, + "w": 79, + "h": 61 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 10, + "y": 28, + "w": 79, + "h": 60 + }, + "frame": { + "x": 318, + "y": 371, + "w": 79, + "h": 60 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 18, + "w": 78, + "h": 61 + }, + "frame": { + "x": 312, + "y": 431, + "w": 78, + "h": 61 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 8, + "y": 24, + "w": 78, + "h": 61 + }, + "frame": { + "x": 312, + "y": 431, + "w": 78, + "h": 61 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 5, + "y": 24, + "w": 79, + "h": 60 + }, + "frame": { + "x": 317, + "y": 492, + "w": 79, + "h": 60 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 20, + "w": 79, + "h": 60 + }, + "frame": { + "x": 317, + "y": 492, + "w": 79, + "h": 60 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 78, + "h": 60 + }, + "frame": { + "x": 390, + "y": 431, + "w": 78, + "h": 60 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 15, + "w": 78, + "h": 62 + }, + "frame": { + "x": 396, + "y": 491, + "w": 78, + "h": 62 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 3, + "y": 29, + "w": 78, + "h": 62 + }, + "frame": { + "x": 396, + "y": 491, + "w": 78, + "h": 62 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 78, + "h": 62 + }, + "frame": { + "x": 396, + "y": 491, + "w": 78, + "h": 62 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 7, + "y": 27, + "w": 78, + "h": 62 + }, + "frame": { + "x": 396, + "y": 491, + "w": 78, + "h": 62 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 0, + "y": 32, + "w": 78, + "h": 62 + }, + "frame": { + "x": 474, + "y": 426, + "w": 78, + "h": 62 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 89, + "h": 94 + }, + "spriteSourceSize": { + "x": 12, + "y": 28, + "w": 77, + "h": 60 + }, + "frame": { + "x": 474, + "y": 488, + "w": 77, + "h": 60 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:ca128330213972f2e2b14fcc562acba5:087f6709d9573f70630b64c92020e5c9:c00bbabb917bffee4efc8a00433e2079$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/469_3.png b/public/images/pokemon/variant/469_3.png new file mode 100644 index 00000000000..9c724123f37 Binary files /dev/null and b/public/images/pokemon/variant/469_3.png differ diff --git a/public/images/pokemon/variant/472.json b/public/images/pokemon/variant/472.json index a98fd1a0355..937ea1334de 100644 --- a/public/images/pokemon/variant/472.json +++ b/public/images/pokemon/variant/472.json @@ -1,44 +1,33 @@ { "1": { "5a63a5": "974d16", - "293163": "5c2a09", - "9c8cef": "d28b36", - "b5a5ff": "e9bb57", - "ffffff": "ffffff", - "737bc5": "b86f27", - "101010": "101010", - "730800": "143262", - "ad2131": "2a6197", "de3a6b": "4c83a9", - "43050d": "5c2a09", - "ad9400": "4b64ff", - "ffde00": "84b8ff", - "2a2a2a": "130e27", + "293163": "5c2a09", "424252": "2a2752", - "c55294": "5270c5", - "d8d8d8": "d8d8d8", + "ffde00": "84b8ff", + "b5a5ff": "e9bb57", "6b6b7b": "48487a", - "103f47": "103f47" + "737bc5": "b86f27", + "730800": "143262", + "9c8cef": "d28b36", + "ad2131": "2a6197", + "c55294": "5270c5", + "ad9400": "4b64ff", + "2a2a2a": "130e27" }, "2": { "5a63a5": "731e37", - "293163": "43050d", - "9c8cef": "b3404a", - "b5a5ff": "eb6a64", - "ffffff": "ffffff", - "737bc5": "952b41", - "101010": "101010", - "730800": "262138", - "ad2131": "453b57", "de3a6b": "594b6a", - "43050d": "43050d", - "ad9400": "16a9c0", - "ffde00": "6bffd4", - "2a2a2a": "1a554f", + "293163": "43050d", "424252": "57b6a6", - "c55294": "c55294", - "d8d8d8": "d8d8d8", + "ffde00": "6bffd4", + "b5a5ff": "eb6a64", "6b6b7b": "81e4c2", - "103f47": "103f47" + "737bc5": "952b41", + "730800": "262138", + "9c8cef": "b3404a", + "ad2131": "453b57", + "ad9400": "16a9c0", + "2a2a2a": "103f47" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/474.json b/public/images/pokemon/variant/474.json new file mode 100644 index 00000000000..83d717503a6 --- /dev/null +++ b/public/images/pokemon/variant/474.json @@ -0,0 +1,34 @@ +{ + "1": { + "5a3a4a": "9e264e", + "94426b": "d95492", + "ef5a63": "f8a8e6", + "101010": "101010", + "bd4a6b": "e883c8", + "ff94b5": "fccef2", + "ffffff": "ffffff", + "313a63": "110a25", + "8cd6ff": "5e4868", + "31739c": "271a3e", + "4a9cd6": "402c4f", + "ffd663": "887acd", + "636342": "31128a", + "b5944a": "5e3bc0" + }, + "2": { + "5a3a4a": "31150e", + "94426b": "491c0c", + "ef5a63": "82391d", + "101010": "101010", + "bd4a6b": "612a17", + "ff94b5": "a04c27", + "ffffff": "ffe4d4", + "313a63": "b77751", + "8cd6ff": "ffd9ab", + "31739c": "cf8556", + "4a9cd6": "efb787", + "ffd663": "a56d40", + "636342": "41281a", + "b5944a": "6f3f22" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/479-fan.json b/public/images/pokemon/variant/479-fan.json new file mode 100644 index 00000000000..6f4818f6770 --- /dev/null +++ b/public/images/pokemon/variant/479-fan.json @@ -0,0 +1,32 @@ +{ + "1": { + "d6ad00": "204336", + "ffe65a": "648c50", + "ffefa5": "9ea436", + "c54a19": "205027", + "7b3a21": "113526", + "ffffff": "fbffbd", + "ef7329": "417131", + "ffad84": "819d56", + "101010": "101010", + "4a4a52": "2e3f18", + "bdbdbd": "d8e082", + "ffde73": "7aa26f", + "e67319": "507f44" + }, + "2": { + "d6ad00": "adbed7", + "ffe65a": "d9e1ec", + "ffefa5": "edf2fa", + "c54a19": "cbb240", + "7b3a21": "ad7d28", + "ffffff": "ffffff", + "ef7329": "e4de6d", + "ffad84": "fcfebf", + "101010": "101010", + "4a4a52": "374f6c", + "bdbdbd": "bdbdbd", + "ffde73": "e99499", + "e67319": "d36172" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/479-frost.json b/public/images/pokemon/variant/479-frost.json new file mode 100644 index 00000000000..a45e4bea735 --- /dev/null +++ b/public/images/pokemon/variant/479-frost.json @@ -0,0 +1,32 @@ +{ + "1": { + "ce73ff": "648c50", + "b552ce": "204336", + "de9cff": "9ea436", + "c54a19": "205027", + "ffad84": "819d56", + "7b3a21": "183b29", + "ef7329": "417131", + "101010": "101010", + "ffffff": "fbffbd", + "9484de": "9ea436", + "6b3aad": "648c50", + "bdbdbd": "d8e082", + "4a4a52": "1c3225" + }, + "2": { + "ce73ff": "59b5d7", + "b552ce": "2b95c5", + "de9cff": "8ed4e9", + "c54a19": "93a5ba", + "ffad84": "e9edfe", + "7b3a21": "536d8c", + "ef7329": "c5cbe5", + "101010": "101010", + "ffffff": "ffffff", + "9484de": "f0e096", + "6b3aad": "d3a94c", + "bdbdbd": "bdbdbd", + "4a4a52": "2f4865" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/479-heat.json b/public/images/pokemon/variant/479-heat.json new file mode 100644 index 00000000000..b0cf3c22876 --- /dev/null +++ b/public/images/pokemon/variant/479-heat.json @@ -0,0 +1,34 @@ +{ + "1": { + "bd2929": "204336", + "ff4231": "648c50", + "ff9c94": "9ea436", + "ffffff": "fbffbd", + "c54a19": "205027", + "7b3a21": "143b2b", + "ef7329": "417131", + "ffad84": "819d56", + "bdbdbd": "d8e082", + "ff7373": "9ea436", + "ce313a": "648c50", + "101010": "101010", + "292929": "183b29", + "4a4a52": "505a46" + }, + "2": { + "bd2929": "cbbf4c", + "ff4231": "f5f4ab", + "ff9c94": "fdffe1", + "ffffff": "ffffff", + "c54a19": "d06280", + "7b3a21": "9e3867", + "ef7329": "ff8493", + "ffad84": "ffd5d0", + "bdbdbd": "bdbdbd", + "ff7373": "37c983", + "ce313a": "1b976a", + "101010": "101010", + "292929": "581944", + "4a4a52": "793142" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/479-mow.json b/public/images/pokemon/variant/479-mow.json new file mode 100644 index 00000000000..ef080956443 --- /dev/null +++ b/public/images/pokemon/variant/479-mow.json @@ -0,0 +1,32 @@ +{ + "1": { + "009c00": "204336", + "00ce00": "648c50", + "c54a19": "205027", + "7b3a21": "143b2b", + "8cf7ad": "9ea436", + "ef7329": "417131", + "ffad84": "819d56", + "101010": "101010", + "4a4a52": "183b29", + "21b552": "9ea436", + "ffffff": "fbffbd", + "bdbdbd": "d8e082", + "087b42": "648c50" + }, + "2": { + "009c00": "b01145", + "00ce00": "e14b6e", + "c54a19": "147a5c", + "7b3a21": "064f40", + "8cf7ad": "ffbcc2", + "ef7329": "279e69", + "ffad84": "6ada9c", + "101010": "101010", + "4a4a52": "4a4a52", + "21b552": "83d0ec", + "ffffff": "ffffff", + "bdbdbd": "bdbdbd", + "087b42": "40b4de" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/479-wash.json b/public/images/pokemon/variant/479-wash.json new file mode 100644 index 00000000000..05366c8e80f --- /dev/null +++ b/public/images/pokemon/variant/479-wash.json @@ -0,0 +1,32 @@ +{ + "1": { + "4a7bff": "648c50", + "8cbdf7": "9ea436", + "084ac5": "204336", + "c54a19": "205027", + "ef7329": "417131", + "7b3a21": "143b2b", + "ffad84": "819d56", + "bdbdbd": "d8e082", + "ffffff": "fbffbd", + "317bef": "9ea436", + "0842ad": "648c50", + "101010": "101010", + "4a4a52": "183b29" + }, + "2": { + "4a7bff": "6de1a7", + "8cbdf7": "b4feca", + "084ac5": "1aac79", + "c54a19": "53abd0", + "ef7329": "86d7ec", + "7b3a21": "255e90", + "ffad84": "bbf7fe", + "bdbdbd": "bdbdbd", + "ffffff": "ffffff", + "317bef": "73757f", + "0842ad": "53555e", + "101010": "101010", + "4a4a52": "3f3f4e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/479.json b/public/images/pokemon/variant/479.json new file mode 100644 index 00000000000..1ecfab64f61 --- /dev/null +++ b/public/images/pokemon/variant/479.json @@ -0,0 +1,30 @@ +{ + "1": { + "29adbd": "204336", + "5ac5bd": "648c50", + "bdf7ef": "9ea436", + "c54a19": "205027", + "7b3a21": "143b2b", + "ef7329": "417131", + "ffad84": "819d56", + "ffffff": "fbffbd", + "101010": "101010", + "bdbdbd": "d8e082", + "317bef": "89a271", + "0842ad": "648c50" + }, + "2": { + "29adbd": "1fb18e", + "5ac5bd": "64da6a", + "bdf7ef": "d7f3c1", + "c54a19": "2e3948", + "7b3a21": "242834", + "ef7329": "4d5262", + "ffad84": "777b88", + "ffffff": "ffffff", + "101010": "101010", + "bdbdbd": "bdbdbd", + "317bef": "e9919c", + "0842ad": "c95367" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/524.json b/public/images/pokemon/variant/524.json new file mode 100644 index 00000000000..a13526e2c5e --- /dev/null +++ b/public/images/pokemon/variant/524.json @@ -0,0 +1,26 @@ +{ + "1": { + "3a2119": "4d8c77", + "000000": "000000", + "7b5a4a": "97d9c3", + "5a4231": "63a690", + "19213a": "292538", + "42528c": "656273", + "293a6b": "464558", + "5a4221": "a81b43", + "9c7310": "c44267", + "ffbd4a": "e27e9a" + }, + "2": { + "3a2119": "292933", + "000000": "000000", + "7b5a4a": "979bb3", + "5a4231": "515266", + "19213a": "584245", + "42528c": "cdac94", + "293a6b": "9b7570", + "5a4221": "d97a28", + "9c7310": "fdab4e", + "ffbd4a": "fae39a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/525.json b/public/images/pokemon/variant/525.json new file mode 100644 index 00000000000..dd485da0763 --- /dev/null +++ b/public/images/pokemon/variant/525.json @@ -0,0 +1,28 @@ +{ + "1": { + "293a6b": "464558", + "101010": "101010", + "42528c": "656273", + "21293a": "292538", + "ad2919": "0d6d58", + "733121": "0c3b37", + "ff6b52": "bcf1a6", + "ce4a3a": "50cd61", + "5a4221": "a81b43", + "9c7b10": "c44267", + "ffce42": "e27e9a" + }, + "2": { + "293a6b": "9b7570", + "101010": "101010", + "42528c": "cdac94", + "21293a": "584245", + "ad2919": "a7323b", + "733121": "733120", + "ff6b52": "eeb570", + "ce4a3a": "dc6c44", + "5a4221": "d97a28", + "9c7b10": "fdab4e", + "ffce42": "fae39a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/465_3.json b/public/images/pokemon/variant/526_2.json similarity index 56% rename from public/images/pokemon/variant/465_3.json rename to public/images/pokemon/variant/526_2.json index c092ec585e7..338c6859608 100644 --- a/public/images/pokemon/variant/465_3.json +++ b/public/images/pokemon/variant/526_2.json @@ -1,1377 +1,33 @@ { "textures": [ { - "image": "465_3.png", + "image": "526_2.png", "format": "RGBA8888", "size": { - "w": 407, - "h": 407 + "w": 486, + "h": 486 }, "scale": 1, "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0171.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0172.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0185.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0186.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0187.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0188.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0179.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0180.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, { "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 17, + "x": 0, "y": 1, - "w": 64, - "h": 66 + "w": 81, + "h": 73 }, "frame": { "x": 0, - "y": 64, - "w": 64, - "h": 66 + "y": 0, + "w": 81, + "h": 73 } }, { @@ -1379,1532 +35,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0173.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0174.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 98, - "h": 65 + "w": 81, + "h": 73 }, "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 + "x": 0, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0106.png", + "filename": "0131.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 98, - "h": 65 + "w": 81, + "h": 73 }, "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 + "x": 0, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0121.png", + "filename": "0132.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0189.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0190.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 + "w": 81, + "h": 73 }, "frame": { "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0177.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0178.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0193.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0194.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0181.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0182.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 + "w": 81, + "h": 73 } }, { @@ -2912,20 +98,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { @@ -2933,188 +119,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, + "x": 81, "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0175.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0176.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 + "w": 81, + "h": 73 } }, { @@ -3122,20 +140,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { @@ -3143,398 +161,398 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0183.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0184.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { "x": 0, - "y": 196, - "w": 86, - "h": 66 + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0100.png", + "filename": "0133.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { "x": 0, - "y": 196, - "w": 86, - "h": 66 + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0101.png", + "filename": "0134.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0102.png", + "filename": "0141.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0125.png", + "filename": "0142.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0126.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0103.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 176, - "y": 198, - "w": 94, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0104.png", + "filename": "0019.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 176, - "y": 198, - "w": 94, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0107.png", + "filename": "0020.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 270, - "y": 198, - "w": 97, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0108.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 270, - "y": 198, - "w": 97, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0139.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0140.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0143.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0144.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 243, + "y": 0, + "w": 81, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 243, + "y": 0, + "w": 81, + "h": 74 } }, { @@ -3542,20 +560,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 86, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 0, - "y": 262, - "w": 86, - "h": 66 + "x": 243, + "y": 0, + "w": 81, + "h": 74 } }, { @@ -3563,482 +581,566 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 86, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0191.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0192.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 + "x": 243, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0110.png", + "filename": "0009.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 + "x": 324, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0117.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 + "x": 324, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0118.png", + "filename": "0129.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 + "x": 324, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0111.png", + "filename": "0130.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 97, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 254, - "y": 264, - "w": 97, - "h": 66 + "x": 324, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0112.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 97, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 254, - "y": 264, - "w": 97, - "h": 66 + "x": 405, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0113.png", + "filename": "0018.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 0, - "y": 330, - "w": 98, - "h": 66 + "x": 405, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0114.png", + "filename": "0137.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 0, - "y": 330, - "w": 98, - "h": 66 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, + "x": 405, "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 98, - "y": 330, - "w": 97, - "h": 66 + "w": 81, + "h": 74 } }, { - "filename": "0116.png", + "filename": "0138.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 98, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 97, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 195, - "y": 330, - "w": 97, - "h": 66 + "x": 405, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0120.png", + "filename": "0025.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 97, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 195, - "y": 330, - "w": 97, - "h": 66 + "x": 0, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0145.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0146.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 81, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 81, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0147.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 81, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0148.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 81, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 75 + }, + "frame": { + "x": 162, + "y": 73, + "w": 81, + "h": 75 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 75 + }, + "frame": { + "x": 162, + "y": 73, + "w": 81, + "h": 75 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 75 + }, + "frame": { + "x": 162, + "y": 73, + "w": 81, + "h": 75 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 75 + }, + "frame": { + "x": 162, + "y": 73, + "w": 81, + "h": 75 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 75 + }, + "frame": { + "x": 243, + "y": 74, + "w": 81, + "h": 75 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 75 + }, + "frame": { + "x": 243, + "y": 74, + "w": 81, + "h": 75 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 75 + }, + "frame": { + "x": 243, + "y": 74, + "w": 81, + "h": 75 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 75 + }, + "frame": { + "x": 243, + "y": 74, + "w": 81, + "h": 75 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 76 + }, + "frame": { + "x": 324, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 76 + }, + "frame": { + "x": 324, + "y": 74, + "w": 81, + "h": 76 } }, { @@ -4046,20 +1148,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 3, + "x": 0, "y": 0, - "w": 94, - "h": 66 + "w": 81, + "h": 76 }, "frame": { - "x": 292, - "y": 330, - "w": 94, - "h": 66 + "x": 324, + "y": 74, + "w": 81, + "h": 76 } }, { @@ -4067,20 +1169,3128 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 3, + "x": 0, "y": 0, - "w": 94, - "h": 66 + "w": 81, + "h": 76 }, "frame": { - "x": 292, - "y": 330, - "w": 94, - "h": 66 + "x": 324, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 405, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 405, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0151.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 405, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0152.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 405, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0169.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0170.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0193.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0194.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 81, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 81, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0155.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0156.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0157.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0158.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0181.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0182.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0153.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0154.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0165.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0166.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0173.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0174.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0189.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0190.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0197.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0198.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0167.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0168.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0171.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0172.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0191.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0192.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0195.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0196.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 81, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 81, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 162, + "y": 224, + "w": 81, + "h": 77 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 162, + "y": 224, + "w": 81, + "h": 77 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 226, + "w": 81, + "h": 77 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 226, + "w": 81, + "h": 77 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 300, + "w": 81, + "h": 77 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 300, + "w": 81, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 81, + "y": 300, + "w": 81, + "h": 77 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 81, + "y": 300, + "w": 81, + "h": 77 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 162, + "y": 301, + "w": 81, + "h": 77 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 162, + "y": 301, + "w": 81, + "h": 77 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 303, + "w": 81, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 303, + "w": 81, + "h": 77 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 324, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 324, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0149.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 324, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0150.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 324, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0159.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0160.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0179.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0180.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0183.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0184.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0203.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0204.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0161.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0162.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0177.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0178.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0185.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0186.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0201.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0202.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0163.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0164.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0175.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0176.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0187.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0188.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0199.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0200.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 } } ] @@ -4089,6 +4299,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9fb6238f8e585be9be5e520abb59e23d:2204e0edc6a9e184240a16c4ee5faa7c:06d67de9e8d7f60fc986e0c00145d6b1$" + "smartupdate": "$TexturePacker:SmartUpdate:b7c5af386f9014169576cd9ca23170af:fa9cadfcf488d686c622ab70bdb448b4:3aac848890de9bedcf8c34e6928e8255$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/526_2.png b/public/images/pokemon/variant/526_2.png new file mode 100644 index 00000000000..cf095fcc45b Binary files /dev/null and b/public/images/pokemon/variant/526_2.png differ diff --git a/public/images/pokemon/variant/465_2.json b/public/images/pokemon/variant/526_3.json similarity index 56% rename from public/images/pokemon/variant/465_2.json rename to public/images/pokemon/variant/526_3.json index 7c6d5ea081a..d690f710077 100644 --- a/public/images/pokemon/variant/465_2.json +++ b/public/images/pokemon/variant/526_3.json @@ -1,1377 +1,33 @@ { "textures": [ { - "image": "465_2.png", + "image": "526_3.png", "format": "RGBA8888", "size": { - "w": 407, - "h": 407 + "w": 486, + "h": 486 }, "scale": 1, "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0171.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0172.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 74, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0185.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0186.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0187.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0188.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0179.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, - { - "filename": "0180.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 314, - "y": 0, - "w": 83, - "h": 66 - } - }, { "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 17, + "x": 0, "y": 1, - "w": 64, - "h": 66 + "w": 81, + "h": 73 }, "frame": { "x": 0, - "y": 64, - "w": 64, - "h": 66 + "y": 0, + "w": 81, + "h": 73 } }, { @@ -1379,1532 +35,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0173.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0174.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 0, - "y": 64, - "w": 64, - "h": 66 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 98, - "h": 65 + "w": 81, + "h": 73 }, "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 + "x": 0, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0106.png", + "filename": "0131.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 98, - "h": 65 + "w": 81, + "h": 73 }, "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 + "x": 0, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0121.png", + "filename": "0132.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 64, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 162, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0189.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0190.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 64, - "h": 66 - }, - "frame": { - "x": 250, - "y": 65, - "w": 64, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 314, - "y": 66, - "w": 93, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 + "w": 81, + "h": 73 }, "frame": { "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0177.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0178.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0193.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0194.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 76, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0181.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0182.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 152, - "y": 131, - "w": 88, - "h": 66 + "w": 81, + "h": 73 } }, { @@ -2912,20 +98,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { @@ -2933,188 +119,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, + "x": 81, "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0175.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 - } - }, - { - "filename": "0176.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 240, - "y": 131, - "w": 70, - "h": 67 + "w": 81, + "h": 73 } }, { @@ -3122,20 +140,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { @@ -3143,398 +161,398 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0183.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0184.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 310, - "y": 132, - "w": 93, - "h": 66 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { "x": 0, - "y": 196, - "w": 86, - "h": 66 + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0100.png", + "filename": "0133.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { "x": 0, - "y": 196, - "w": 86, - "h": 66 + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0101.png", + "filename": "0134.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0102.png", + "filename": "0141.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0125.png", + "filename": "0142.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 + "x": 81, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0126.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 86, - "y": 197, - "w": 90, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0103.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 176, - "y": 198, - "w": 94, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0104.png", + "filename": "0019.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 176, - "y": 198, - "w": 94, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0107.png", + "filename": "0020.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 270, - "y": 198, - "w": 97, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 } }, { - "filename": "0108.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 + "x": 0, + "y": 1, + "w": 81, + "h": 73 }, "frame": { - "x": 270, - "y": 198, - "w": 97, - "h": 66 + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0139.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0140.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0143.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0144.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 73 + }, + "frame": { + "x": 162, + "y": 0, + "w": 81, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 243, + "y": 0, + "w": 81, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 243, + "y": 0, + "w": 81, + "h": 74 } }, { @@ -3542,20 +560,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 86, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 0, - "y": 262, - "w": 86, - "h": 66 + "x": 243, + "y": 0, + "w": 81, + "h": 74 } }, { @@ -3563,482 +581,566 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 86, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0191.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0192.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 86, - "y": 263, - "w": 70, - "h": 67 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 + "x": 243, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0110.png", + "filename": "0009.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 + "x": 324, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0117.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 + "x": 324, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0118.png", + "filename": "0129.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 156, - "y": 264, - "w": 98, - "h": 66 + "x": 324, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0111.png", + "filename": "0130.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 97, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 254, - "y": 264, - "w": 97, - "h": 66 + "x": 324, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0112.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 97, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 254, - "y": 264, - "w": 97, - "h": 66 + "x": 405, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0113.png", + "filename": "0018.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 0, - "y": 330, - "w": 98, - "h": 66 + "x": 405, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0114.png", + "filename": "0137.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 98, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 0, - "y": 330, - "w": 98, - "h": 66 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, + "x": 405, "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 98, - "y": 330, - "w": 97, - "h": 66 + "w": 81, + "h": 74 } }, { - "filename": "0116.png", + "filename": "0138.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 98, - "y": 330, - "w": 97, - "h": 66 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 97, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 195, - "y": 330, - "w": 97, - "h": 66 + "x": 405, + "y": 0, + "w": 81, + "h": 74 } }, { - "filename": "0120.png", + "filename": "0025.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 97, - "h": 66 + "w": 81, + "h": 74 }, "frame": { - "x": 195, - "y": 330, - "w": 97, - "h": 66 + "x": 0, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0145.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0146.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 81, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 81, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0147.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 81, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0148.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 81, + "y": 73, + "w": 81, + "h": 74 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 75 + }, + "frame": { + "x": 162, + "y": 73, + "w": 81, + "h": 75 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 75 + }, + "frame": { + "x": 162, + "y": 73, + "w": 81, + "h": 75 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 75 + }, + "frame": { + "x": 162, + "y": 73, + "w": 81, + "h": 75 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 75 + }, + "frame": { + "x": 162, + "y": 73, + "w": 81, + "h": 75 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 75 + }, + "frame": { + "x": 243, + "y": 74, + "w": 81, + "h": 75 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 75 + }, + "frame": { + "x": 243, + "y": 74, + "w": 81, + "h": 75 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 75 + }, + "frame": { + "x": 243, + "y": 74, + "w": 81, + "h": 75 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 75 + }, + "frame": { + "x": 243, + "y": 74, + "w": 81, + "h": 75 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 76 + }, + "frame": { + "x": 324, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 76 + }, + "frame": { + "x": 324, + "y": 74, + "w": 81, + "h": 76 } }, { @@ -4046,20 +1148,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 3, + "x": 0, "y": 0, - "w": 94, - "h": 66 + "w": 81, + "h": 76 }, "frame": { - "x": 292, - "y": 330, - "w": 94, - "h": 66 + "x": 324, + "y": 74, + "w": 81, + "h": 76 } }, { @@ -4067,20 +1169,3128 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 98, - "h": 67 + "w": 81, + "h": 78 }, "spriteSourceSize": { - "x": 3, + "x": 0, "y": 0, - "w": 94, - "h": 66 + "w": 81, + "h": 76 }, "frame": { - "x": 292, - "y": 330, - "w": 94, - "h": 66 + "x": 324, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 405, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 405, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0151.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 405, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0152.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 405, + "y": 74, + "w": 81, + "h": 76 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0169.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0170.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0193.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0194.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 81, + "h": 76 + }, + "frame": { + "x": 0, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 81, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 81, + "y": 147, + "w": 81, + "h": 76 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 76 + }, + "frame": { + "x": 162, + "y": 148, + "w": 81, + "h": 76 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0155.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0156.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0157.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0158.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0181.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0182.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 149, + "w": 81, + "h": 77 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0153.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0154.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0165.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0166.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0173.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0174.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0189.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0190.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0197.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0198.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 150, + "w": 81, + "h": 77 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0167.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0168.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0171.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0172.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0191.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0192.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0195.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0196.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 81, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 81, + "y": 223, + "w": 81, + "h": 77 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 162, + "y": 224, + "w": 81, + "h": 77 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 162, + "y": 224, + "w": 81, + "h": 77 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 226, + "w": 81, + "h": 77 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 226, + "w": 81, + "h": 77 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 324, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 405, + "y": 227, + "w": 81, + "h": 77 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 300, + "w": 81, + "h": 77 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 0, + "y": 300, + "w": 81, + "h": 77 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 81, + "y": 300, + "w": 81, + "h": 77 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 81, + "y": 300, + "w": 81, + "h": 77 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 162, + "y": 301, + "w": 81, + "h": 77 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 81, + "h": 77 + }, + "frame": { + "x": 162, + "y": 301, + "w": 81, + "h": 77 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 303, + "w": 81, + "h": 77 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 77 + }, + "frame": { + "x": 243, + "y": 303, + "w": 81, + "h": 77 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 324, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 324, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0149.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 324, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0150.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 324, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0159.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0160.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0179.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0180.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0183.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0184.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0203.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0204.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 405, + "y": 304, + "w": 81, + "h": 78 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0161.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0162.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0177.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0178.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0185.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0186.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0201.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0202.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 0, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0163.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0164.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0175.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0176.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0187.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0188.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0199.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 + } + }, + { + "filename": "0200.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 81, + "h": 78 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 81, + "h": 78 + }, + "frame": { + "x": 81, + "y": 377, + "w": 81, + "h": 78 } } ] @@ -4089,6 +4299,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9fb6238f8e585be9be5e520abb59e23d:2204e0edc6a9e184240a16c4ee5faa7c:06d67de9e8d7f60fc986e0c00145d6b1$" + "smartupdate": "$TexturePacker:SmartUpdate:b7c5af386f9014169576cd9ca23170af:fa9cadfcf488d686c622ab70bdb448b4:3aac848890de9bedcf8c34e6928e8255$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/526_3.png b/public/images/pokemon/variant/526_3.png new file mode 100644 index 00000000000..c365c379910 Binary files /dev/null and b/public/images/pokemon/variant/526_3.png differ diff --git a/public/images/pokemon/variant/553.json b/public/images/pokemon/variant/553.json index b89de1b329b..5bc0be23fb5 100644 --- a/public/images/pokemon/variant/553.json +++ b/public/images/pokemon/variant/553.json @@ -1,9 +1,9 @@ { "1": { - "8c3142": "143a4b", + "8c3142": "164954", "522921": "0b2033", "c55252": "1b7871", - "191921": "100f2b", + "191921": "131735", "212129": "192540", "101010": "101010", "e67b73": "40a592", @@ -25,7 +25,7 @@ "e67b73": "e8e9eb", "52525a": "52525a", "b5b5b5": "45545d", - "8c948c": "13171b", + "8c948c": "171b20", "ffffff": "69777e", "bdc5ce": "262d31", "525263": "273136", diff --git a/public/images/pokemon/variant/556.json b/public/images/pokemon/variant/556.json new file mode 100644 index 00000000000..4c43ef55532 --- /dev/null +++ b/public/images/pokemon/variant/556.json @@ -0,0 +1,32 @@ +{ + "1": { + "b53173": "7191ca", + "8c1957": "454792", + "e66ba5": "aad7ec", + "101010": "101010", + "857510": "8d4026", + "ffd600": "ff9b3b", + "214a21": "375460", + "5ad66b": "eff8f5", + "429c4a": "acd2d3", + "108c73": "5fa7b3", + "196352": "467398", + "083b2d": "1c3d71", + "b59c10": "d66430" + }, + "2": { + "b53173": "dc9bbd", + "8c1957": "b06ea0", + "e66ba5": "ffcadc", + "101010": "101010", + "857510": "c78366", + "ffd600": "fff1ac", + "214a21": "68023b", + "5ad66b": "d6375e", + "429c4a": "971746", + "108c73": "90b452", + "196352": "4a7640", + "083b2d": "1e3822", + "b59c10": "e0be7a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/563.json b/public/images/pokemon/variant/563.json new file mode 100644 index 00000000000..0657f362348 --- /dev/null +++ b/public/images/pokemon/variant/563.json @@ -0,0 +1,30 @@ +{ + "1": { + "101010": "101010", + "216b7b": "18265c", + "294a4a": "242b71", + "3194ad": "32459b", + "393942": "a40e38", + "6b5a21": "684327", + "b58431": "8c6742", + "ffbd31": "d29887", + "ffffff": "e4d8ff", + "9c2142": "63f3ca", + "ff3121": "a0f7ff", + "393941": "521f2d" + }, + "2": { + "101010": "101010", + "216b7b": "923c1c", + "294a4a": "591105", + "3194ad": "e03241", + "393942": "3ce483", + "6b5a21": "74350f", + "b58431": "9c5e19", + "ffbd31": "d9e878", + "ffffff": "eaffa6", + "9c2142": "b1f1d2", + "ff3121": "ecffeb", + "393941": "2a3430" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/563_2.json b/public/images/pokemon/variant/563_2.json deleted file mode 100644 index 2b619fc1086..00000000000 --- a/public/images/pokemon/variant/563_2.json +++ /dev/null @@ -1,3485 +0,0 @@ -{ - "textures": [ - { - "image": "563_2.png", - "format": "RGBA8888", - "size": { - "w": 500, - "h": 500 - }, - "scale": 1, - "frames": [ - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 191, - "y": 366, - "w": 93, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 18, - "w": 73, - "h": 64 - }, - "frame": { - "x": 96, - "y": 436, - "w": 73, - "h": 64 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 28, - "y": 17, - "w": 52, - "h": 65 - }, - "frame": { - "x": 446, - "y": 0, - "w": 52, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 79 - }, - "frame": { - "x": 303, - "y": 140, - "w": 93, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 93, - "h": 77 - }, - "frame": { - "x": 286, - "y": 297, - "w": 93, - "h": 77 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 85, - "h": 73 - }, - "frame": { - "x": 284, - "y": 374, - "w": 85, - "h": 73 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 75, - "h": 79 - }, - "frame": { - "x": 396, - "y": 139, - "w": 75, - "h": 79 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 85, - "h": 79 - }, - "frame": { - "x": 384, - "y": 219, - "w": 85, - "h": 79 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 435, - "y": 365, - "w": 59, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 19, - "w": 66, - "h": 63 - }, - "frame": { - "x": 432, - "y": 72, - "w": 66, - "h": 63 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1c52466e8cdc83633a9fbd5b8675ca7:19652e451f806ac9b4bbb01e17b071df:12f3eae8283ab6c8e555ff3e46b7d8dc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/563_2.png b/public/images/pokemon/variant/563_2.png deleted file mode 100644 index 3a0e775d833..00000000000 Binary files a/public/images/pokemon/variant/563_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/563_3.png b/public/images/pokemon/variant/563_3.png deleted file mode 100644 index d7988d44d23..00000000000 Binary files a/public/images/pokemon/variant/563_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/594.json b/public/images/pokemon/variant/594.json new file mode 100644 index 00000000000..18aa79a0569 --- /dev/null +++ b/public/images/pokemon/variant/594.json @@ -0,0 +1,19 @@ +{ + "1": { + "8c4263": "aa3a18", + "ffbdbd": "f9c976", + "c55a7b": "ca4f16", + "000000": "000000", + "633a42": "882915", + "ff8cad": "f5a454", + "f77384": "e37830", + "e68c9c": "d68147", + "ffeff7": "ffffef", + "ffd6e6": "fee1b0", + "002931": "310000", + "005263": "681f16", + "9c8c10": "a74c8e", + "ffffff": "ffffff", + "d6d63a": "dc8ec6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/594_3.json b/public/images/pokemon/variant/594_3.json new file mode 100644 index 00000000000..0acb9948aff --- /dev/null +++ b/public/images/pokemon/variant/594_3.json @@ -0,0 +1,2708 @@ +{ + "textures": [ + { + "image": "594_3.png", + "format": "RGBA8888", + "size": { + "w": 256, + "h": 256 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 82 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 35, + "h": 81 + }, + "frame": { + "x": 0, + "y": 82, + "w": 35, + "h": 81 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 35, + "h": 81 + }, + "frame": { + "x": 0, + "y": 82, + "w": 35, + "h": 81 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 0, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 34, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 34, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 34, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 34, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 34, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 34, + "h": 81 + }, + "frame": { + "x": 34, + "y": 163, + "w": 34, + "h": 81 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 36, + "h": 80 + }, + "frame": { + "x": 35, + "y": 0, + "w": 36, + "h": 80 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 80 + }, + "frame": { + "x": 35, + "y": 80, + "w": 35, + "h": 80 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 34, + "h": 80 + }, + "frame": { + "x": 68, + "y": 160, + "w": 34, + "h": 80 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 79 + }, + "frame": { + "x": 70, + "y": 80, + "w": 38, + "h": 79 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 37, + "h": 79 + }, + "frame": { + "x": 71, + "y": 0, + "w": 37, + "h": 79 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 34, + "h": 79 + }, + "frame": { + "x": 102, + "y": 159, + "w": 34, + "h": 79 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 78 + }, + "frame": { + "x": 108, + "y": 0, + "w": 39, + "h": 78 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 38, + "h": 78 + }, + "frame": { + "x": 108, + "y": 78, + "w": 38, + "h": 78 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 77 + }, + "frame": { + "x": 136, + "y": 156, + "w": 39, + "h": 77 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 77 + }, + "frame": { + "x": 136, + "y": 156, + "w": 39, + "h": 77 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 77 + }, + "frame": { + "x": 136, + "y": 156, + "w": 39, + "h": 77 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 77 + }, + "frame": { + "x": 136, + "y": 156, + "w": 39, + "h": 77 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 77 + }, + "frame": { + "x": 136, + "y": 156, + "w": 39, + "h": 77 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 77 + }, + "frame": { + "x": 136, + "y": 156, + "w": 39, + "h": 77 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 9, + "w": 34, + "h": 77 + }, + "frame": { + "x": 146, + "y": 78, + "w": 34, + "h": 77 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 10, + "w": 34, + "h": 76 + }, + "frame": { + "x": 147, + "y": 0, + "w": 34, + "h": 76 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 2, + "y": 11, + "w": 34, + "h": 75 + }, + "frame": { + "x": 175, + "y": 155, + "w": 34, + "h": 75 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 11, + "w": 38, + "h": 74 + }, + "frame": { + "x": 180, + "y": 76, + "w": 38, + "h": 74 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 11, + "w": 38, + "h": 74 + }, + "frame": { + "x": 180, + "y": 76, + "w": 38, + "h": 74 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 38, + "h": 67 + }, + "frame": { + "x": 218, + "y": 0, + "w": 38, + "h": 67 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 17, + "w": 38, + "h": 65 + }, + "frame": { + "x": 218, + "y": 67, + "w": 38, + "h": 65 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 21, + "w": 38, + "h": 57 + }, + "frame": { + "x": 218, + "y": 132, + "w": 38, + "h": 57 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 21, + "w": 38, + "h": 57 + }, + "frame": { + "x": 218, + "y": 132, + "w": 38, + "h": 57 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 21, + "w": 38, + "h": 57 + }, + "frame": { + "x": 218, + "y": 132, + "w": 38, + "h": 57 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 21, + "w": 38, + "h": 57 + }, + "frame": { + "x": 209, + "y": 189, + "w": 38, + "h": 57 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 39, + "h": 87 + }, + "spriteSourceSize": { + "x": 1, + "y": 21, + "w": 38, + "h": 57 + }, + "frame": { + "x": 209, + "y": 189, + "w": 38, + "h": 57 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:67143640e0fcffc7a4ecd0530822d5fe:086881796df22ea96b66cebbc49c5686:2e1b2146909d07717b7904c0cdf1b2b2$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/594_3.png b/public/images/pokemon/variant/594_3.png new file mode 100644 index 00000000000..5db7ef43b86 Binary files /dev/null and b/public/images/pokemon/variant/594_3.png differ diff --git a/public/images/pokemon/variant/618.json b/public/images/pokemon/variant/618.json new file mode 100644 index 00000000000..dcce711b155 --- /dev/null +++ b/public/images/pokemon/variant/618.json @@ -0,0 +1,38 @@ +{ + "1": { + "cebd00": "bdac99", + "ffff00": "f3e6dd", + "6b6319": "987b6d", + "081019": "081019", + "52423a": "312118", + "6b524a": "4a342a", + "bd846b": "8c3841", + "846b63": "6b3838", + "d69c84": "ad4c4c", + "efce42": "eac2bd", + "d6cec5": "d6cec5", + "ffffff": "ffffff", + "081018": "081019", + "735a52": "564038", + "9c8473": "a08773", + "bda59c": "e6dbd6" + }, + "2": { + "cebd00": "58536b", + "ffff00": "707488", + "6b6319": "39314a", + "081019": "081019", + "52423a": "5a2e2e", + "6b524a": "804e48", + "bd846b": "cec9b1", + "846b63": "9c7765", + "d69c84": "f0ead6", + "efce42": "9fadb9", + "d6cec5": "4c8c4c", + "ffffff": "79a962", + "081018": "204a29", + "735a52": "885011", + "9c8473": "c18a2c", + "bda59c": "efc44b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/622.json b/public/images/pokemon/variant/622.json index e43817498e7..9d3d631c473 100644 --- a/public/images/pokemon/variant/622.json +++ b/public/images/pokemon/variant/622.json @@ -1,20 +1,4 @@ { - "0": { - "106b63": "0d1e10", - "004a52": "102c16", - "84cece": "758076", - "191921": "191921", - "29848c": "224427", - "298c8c": "1c3820", - "5aada5": "3e5d43", - "106b7b": "102c16", - "ffefa5": "ff9942", - "dece94": "e46424", - "bdad73": "cb3000", - "6b4200": "54190e", - "c59c52": "a65c3f", - "9c7329": "763826" - }, "1": { "106b63": "732d02", "004a52": "4c1b11", diff --git a/public/images/pokemon/variant/622_1.png b/public/images/pokemon/variant/622_1.png deleted file mode 100644 index 615a9a629ae..00000000000 Binary files a/public/images/pokemon/variant/622_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/622_2.png b/public/images/pokemon/variant/622_2.png deleted file mode 100644 index 1ce1c3e9f0e..00000000000 Binary files a/public/images/pokemon/variant/622_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/623.json b/public/images/pokemon/variant/623.json index d4a00ad94ba..2a9f0774f9a 100644 --- a/public/images/pokemon/variant/623.json +++ b/public/images/pokemon/variant/623.json @@ -1,19 +1,4 @@ { - "0": { - "297b8c": "152c18", - "105263": "041408", - "5aa5a5": "2b3c2d", - "195a7b": "051b0a", - "84c5ce": "3f4a3f", - "003a52": "020e06", - "191921": "191921", - "ffefa5": "ff9942", - "bdad73": "e46424", - "dece94": "cb3000", - "6b4200": "5e1c0b", - "c59c52": "ad5735", - "9c7329": "943b21" - }, "1": { "297b8c": "6b2808", "105263": "8b2a05", diff --git a/public/images/pokemon/variant/623_1.png b/public/images/pokemon/variant/623_1.png deleted file mode 100644 index 836f46d459f..00000000000 Binary files a/public/images/pokemon/variant/623_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/623_2.png b/public/images/pokemon/variant/623_2.png deleted file mode 100644 index fc7de7bdccb..00000000000 Binary files a/public/images/pokemon/variant/623_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/631_2.json b/public/images/pokemon/variant/631_2.json new file mode 100644 index 00000000000..c4bfc1799a3 --- /dev/null +++ b/public/images/pokemon/variant/631_2.json @@ -0,0 +1,2918 @@ +{ + "textures": [ + { + "image": "631_2.png", + "format": "RGBA8888", + "size": { + "w": 397, + "h": 397 + }, + "scale": 1, + "frames": [ + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 86, + "h": 53 + }, + "frame": { + "x": 75, + "y": 0, + "w": 86, + "h": 53 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 82, + "h": 53 + }, + "frame": { + "x": 161, + "y": 0, + "w": 82, + "h": 53 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 82, + "h": 53 + }, + "frame": { + "x": 243, + "y": 0, + "w": 82, + "h": 53 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 80, + "h": 53 + }, + "frame": { + "x": 0, + "y": 53, + "w": 80, + "h": 53 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 84, + "h": 53 + }, + "frame": { + "x": 80, + "y": 53, + "w": 84, + "h": 53 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 85, + "h": 53 + }, + "frame": { + "x": 164, + "y": 53, + "w": 85, + "h": 53 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 2, + "w": 75, + "h": 55 + }, + "frame": { + "x": 322, + "y": 55, + "w": 75, + "h": 55 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 87, + "h": 53 + }, + "frame": { + "x": 0, + "y": 106, + "w": 87, + "h": 53 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 85, + "h": 53 + }, + "frame": { + "x": 87, + "y": 106, + "w": 85, + "h": 53 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 82, + "h": 53 + }, + "frame": { + "x": 172, + "y": 107, + "w": 82, + "h": 53 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 82, + "h": 53 + }, + "frame": { + "x": 254, + "y": 110, + "w": 82, + "h": 53 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 87, + "h": 53 + }, + "frame": { + "x": 0, + "y": 159, + "w": 87, + "h": 53 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 12, + "y": 3, + "w": 79, + "h": 54 + }, + "frame": { + "x": 87, + "y": 159, + "w": 79, + "h": 54 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 82, + "h": 54 + }, + "frame": { + "x": 166, + "y": 160, + "w": 82, + "h": 54 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 83, + "h": 54 + }, + "frame": { + "x": 248, + "y": 163, + "w": 83, + "h": 54 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 84, + "h": 54 + }, + "frame": { + "x": 0, + "y": 212, + "w": 84, + "h": 54 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 12, + "y": 2, + "w": 80, + "h": 55 + }, + "frame": { + "x": 84, + "y": 213, + "w": 80, + "h": 55 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0137.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0138.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 85, + "h": 54 + }, + "frame": { + "x": 232, + "y": 217, + "w": 85, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 85, + "h": 54 + }, + "frame": { + "x": 0, + "y": 268, + "w": 85, + "h": 54 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 85, + "y": 268, + "w": 70, + "h": 57 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 85, + "y": 268, + "w": 70, + "h": 57 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 85, + "y": 268, + "w": 70, + "h": 57 + } + }, + { + "filename": "0130.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 87, + "h": 55 + }, + "frame": { + "x": 155, + "y": 271, + "w": 87, + "h": 55 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 0, + "w": 73, + "h": 57 + }, + "frame": { + "x": 242, + "y": 271, + "w": 73, + "h": 57 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 0, + "w": 75, + "h": 57 + }, + "frame": { + "x": 315, + "y": 274, + "w": 75, + "h": 57 + } + }, + { + "filename": "0134.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 0, + "y": 322, + "w": 70, + "h": 57 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 0, + "y": 322, + "w": 70, + "h": 57 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 0, + "y": 322, + "w": 70, + "h": 57 + } + }, + { + "filename": "0131.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 90, + "h": 55 + }, + "frame": { + "x": 70, + "y": 326, + "w": 90, + "h": 55 + } + }, + { + "filename": "0132.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 89, + "h": 57 + }, + "frame": { + "x": 160, + "y": 328, + "w": 89, + "h": 57 + } + }, + { + "filename": "0133.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 57 + }, + "frame": { + "x": 249, + "y": 331, + "w": 92, + "h": 57 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:842c835ca805448441356b967e5ae423:94c72bc2cb17ad56ec8a53b129af00a3:1ec188c732b5f709b15967dc6e0b9332$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/631_2.png b/public/images/pokemon/variant/631_2.png new file mode 100644 index 00000000000..846ab3c59b5 Binary files /dev/null and b/public/images/pokemon/variant/631_2.png differ diff --git a/public/images/pokemon/variant/631_3.json b/public/images/pokemon/variant/631_3.json new file mode 100644 index 00000000000..6d975445253 --- /dev/null +++ b/public/images/pokemon/variant/631_3.json @@ -0,0 +1,2918 @@ +{ + "textures": [ + { + "image": "631_3.png", + "format": "RGBA8888", + "size": { + "w": 397, + "h": 397 + }, + "scale": 1, + "frames": [ + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 4, + "w": 75, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 53 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 86, + "h": 53 + }, + "frame": { + "x": 75, + "y": 0, + "w": 86, + "h": 53 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 82, + "h": 53 + }, + "frame": { + "x": 161, + "y": 0, + "w": 82, + "h": 53 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 82, + "h": 53 + }, + "frame": { + "x": 243, + "y": 0, + "w": 82, + "h": 53 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 2, + "w": 72, + "h": 55 + }, + "frame": { + "x": 325, + "y": 0, + "w": 72, + "h": 55 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 80, + "h": 53 + }, + "frame": { + "x": 0, + "y": 53, + "w": 80, + "h": 53 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 84, + "h": 53 + }, + "frame": { + "x": 80, + "y": 53, + "w": 84, + "h": 53 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 85, + "h": 53 + }, + "frame": { + "x": 164, + "y": 53, + "w": 85, + "h": 53 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 73, + "h": 54 + }, + "frame": { + "x": 249, + "y": 53, + "w": 73, + "h": 54 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 2, + "w": 75, + "h": 55 + }, + "frame": { + "x": 322, + "y": 55, + "w": 75, + "h": 55 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 87, + "h": 53 + }, + "frame": { + "x": 0, + "y": 106, + "w": 87, + "h": 53 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 85, + "h": 53 + }, + "frame": { + "x": 87, + "y": 106, + "w": 85, + "h": 53 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 82, + "h": 53 + }, + "frame": { + "x": 172, + "y": 107, + "w": 82, + "h": 53 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 82, + "h": 53 + }, + "frame": { + "x": 254, + "y": 110, + "w": 82, + "h": 53 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 87, + "h": 53 + }, + "frame": { + "x": 0, + "y": 159, + "w": 87, + "h": 53 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 12, + "y": 3, + "w": 79, + "h": 54 + }, + "frame": { + "x": 87, + "y": 159, + "w": 79, + "h": 54 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 82, + "h": 54 + }, + "frame": { + "x": 166, + "y": 160, + "w": 82, + "h": 54 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 83, + "h": 54 + }, + "frame": { + "x": 248, + "y": 163, + "w": 83, + "h": 54 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 84, + "h": 54 + }, + "frame": { + "x": 0, + "y": 212, + "w": 84, + "h": 54 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 12, + "y": 2, + "w": 80, + "h": 55 + }, + "frame": { + "x": 84, + "y": 213, + "w": 80, + "h": 55 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0137.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0138.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 68, + "h": 57 + }, + "frame": { + "x": 164, + "y": 214, + "w": 68, + "h": 57 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 85, + "h": 54 + }, + "frame": { + "x": 232, + "y": 217, + "w": 85, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 69, + "h": 57 + }, + "frame": { + "x": 317, + "y": 217, + "w": 69, + "h": 57 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 85, + "h": 54 + }, + "frame": { + "x": 0, + "y": 268, + "w": 85, + "h": 54 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 85, + "y": 268, + "w": 70, + "h": 57 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 85, + "y": 268, + "w": 70, + "h": 57 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 85, + "y": 268, + "w": 70, + "h": 57 + } + }, + { + "filename": "0130.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 87, + "h": 55 + }, + "frame": { + "x": 155, + "y": 271, + "w": 87, + "h": 55 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 19, + "y": 0, + "w": 73, + "h": 57 + }, + "frame": { + "x": 242, + "y": 271, + "w": 73, + "h": 57 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 17, + "y": 0, + "w": 75, + "h": 57 + }, + "frame": { + "x": 315, + "y": 274, + "w": 75, + "h": 57 + } + }, + { + "filename": "0134.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 0, + "y": 322, + "w": 70, + "h": 57 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 0, + "y": 322, + "w": 70, + "h": 57 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 70, + "h": 57 + }, + "frame": { + "x": 0, + "y": 322, + "w": 70, + "h": 57 + } + }, + { + "filename": "0131.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 90, + "h": 55 + }, + "frame": { + "x": 70, + "y": 326, + "w": 90, + "h": 55 + } + }, + { + "filename": "0132.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 89, + "h": 57 + }, + "frame": { + "x": 160, + "y": 328, + "w": 89, + "h": 57 + } + }, + { + "filename": "0133.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 57 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 57 + }, + "frame": { + "x": 249, + "y": 331, + "w": 92, + "h": 57 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:842c835ca805448441356b967e5ae423:94c72bc2cb17ad56ec8a53b129af00a3:1ec188c732b5f709b15967dc6e0b9332$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/631_3.png b/public/images/pokemon/variant/631_3.png new file mode 100644 index 00000000000..bd271ebda23 Binary files /dev/null and b/public/images/pokemon/variant/631_3.png differ diff --git a/public/images/pokemon/variant/669-blue_2.json b/public/images/pokemon/variant/669-blue_2.json new file mode 100644 index 00000000000..33f1b541a85 --- /dev/null +++ b/public/images/pokemon/variant/669-blue_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "669-blue_2.png", + "format": "RGBA8888", + "size": { + "w": 46, + "h": 46 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 43, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:8b791ba3398ba437c65ea7a665de4a1c:ae319e414161e8c409f1706cf1db417b:85cbd8c67625a9e5741e5c57eeadf2da$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-blue_2.png b/public/images/pokemon/variant/669-blue_2.png new file mode 100644 index 00000000000..b2f9ac59598 Binary files /dev/null and b/public/images/pokemon/variant/669-blue_2.png differ diff --git a/public/images/pokemon/variant/669-blue_3.json b/public/images/pokemon/variant/669-blue_3.json new file mode 100644 index 00000000000..cee819034ea --- /dev/null +++ b/public/images/pokemon/variant/669-blue_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "669-blue_3.png", + "format": "RGBA8888", + "size": { + "w": 46, + "h": 46 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 43, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:8b791ba3398ba437c65ea7a665de4a1c:ae319e414161e8c409f1706cf1db417b:85cbd8c67625a9e5741e5c57eeadf2da$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-blue_3.png b/public/images/pokemon/variant/669-blue_3.png new file mode 100644 index 00000000000..8cc36b72d06 Binary files /dev/null and b/public/images/pokemon/variant/669-blue_3.png differ diff --git a/public/images/pokemon/variant/669-orange.json b/public/images/pokemon/variant/669-orange.json new file mode 100644 index 00000000000..bc1328bebf9 --- /dev/null +++ b/public/images/pokemon/variant/669-orange.json @@ -0,0 +1,20 @@ +{ + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "712b2b", + "f8f8f8": "fff1df", + "bfbfbf": "f1beb3", + "101010": "101010", + "686868": "712b2b", + "fffbfb": "fff6f6", + "e15455": "b84816", + "65a943": "ea8c48", + "805326": "215510", + "d98d41": "739f1f", + "ffb266": "afcf4f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-orange_2.json b/public/images/pokemon/variant/669-orange_2.json new file mode 100644 index 00000000000..665abf3374c --- /dev/null +++ b/public/images/pokemon/variant/669-orange_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "669-orange_2.png", + "format": "RGBA8888", + "size": { + "w": 46, + "h": 46 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 43, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:38846c7e5ae96ac7d971559d23a54994:0e26c21396fa433071ffe9ca8fdb57de:0f1b4caba50b5b288825169e096a95d8$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-orange_2.png b/public/images/pokemon/variant/669-orange_2.png new file mode 100644 index 00000000000..3131bba78ea Binary files /dev/null and b/public/images/pokemon/variant/669-orange_2.png differ diff --git a/public/images/pokemon/variant/669-red.json b/public/images/pokemon/variant/669-red.json new file mode 100644 index 00000000000..627fdbeb44f --- /dev/null +++ b/public/images/pokemon/variant/669-red.json @@ -0,0 +1,20 @@ +{ + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "800d3e", + "f8f8f8": "ffd7db", + "bfbfbf": "f1a2a9", + "101010": "101010", + "686868": "800d3e", + "fffbfb": "fff6f6", + "e15455": "8e0a0a", + "65a943": "dc3543", + "802d2d": "215510", + "d94c4c": "739f1f", + "ff7373": "afcf4f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-red_2.json b/public/images/pokemon/variant/669-red_2.json new file mode 100644 index 00000000000..33816135db6 --- /dev/null +++ b/public/images/pokemon/variant/669-red_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "669-red_2.png", + "format": "RGBA8888", + "size": { + "w": 46, + "h": 46 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 43, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:30be9438b4a7afb54dfbdae88661c2ed:ba8475f09ea3d2213c2462b54bc4a3e0:9f8ada9cf46c4e29f954b2eb815bc4e5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-red_2.png b/public/images/pokemon/variant/669-red_2.png new file mode 100644 index 00000000000..b898c298fbf Binary files /dev/null and b/public/images/pokemon/variant/669-red_2.png differ diff --git a/public/images/pokemon/variant/669-white.json b/public/images/pokemon/variant/669-white.json new file mode 100644 index 00000000000..4556e17f09b --- /dev/null +++ b/public/images/pokemon/variant/669-white.json @@ -0,0 +1,38 @@ +{ + "1": { + "665a1f": "110732", + "ffe14c": "4c495c", + "ccb43d": "302b40", + "595959": "595959", + "f8f8f8": "f8f8f8", + "bfbfbf": "bfbfbf", + "101010": "101010", + "686868": "686868", + "fffbfb": "f8f8f8", + "e15455": "dc6295", + "65a943": "e493a1", + "808080": "1e1d2a", + "d9d9d9": "64636a", + "fefefe": "89898e", + "3d6629": "094740", + "6bb347": "1d8057" + }, + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "616a64", + "f8f8f8": "f8f8f8", + "bfbfbf": "d4dcd5", + "101010": "101010", + "686868": "686868", + "fffbfb": "fff6f6", + "e15455": "273232", + "65a943": "636a67", + "808080": "215510", + "d9d9d9": "739f1f", + "fefefe": "afcf4f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-yellow.json b/public/images/pokemon/variant/669-yellow.json new file mode 100644 index 00000000000..3ad52b61c15 --- /dev/null +++ b/public/images/pokemon/variant/669-yellow.json @@ -0,0 +1,20 @@ +{ + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "6a532c", + "f8f8f8": "fffde0", + "bfbfbf": "ead295", + "101010": "101010", + "686868": "6a532c", + "fffbfb": "fff6f6", + "e15455": "bf8f10", + "65a943": "f1d74b", + "807826": "215510", + "d9cc41": "739f1f", + "fff266": "afcf4f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-yellow_2.json b/public/images/pokemon/variant/669-yellow_2.json new file mode 100644 index 00000000000..20293e60908 --- /dev/null +++ b/public/images/pokemon/variant/669-yellow_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "669-yellow_2.png", + "format": "RGBA8888", + "size": { + "w": 46, + "h": 46 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 43, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 43, + "h": 46 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4c0c2008315a9b5bfbcadf6d6e0b860a:ab343ab5176c48954bf7d246e0d38d28:3b20c6e9fefe380b26ae05046de54595$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-yellow_2.png b/public/images/pokemon/variant/669-yellow_2.png new file mode 100644 index 00000000000..37e8d8726a9 Binary files /dev/null and b/public/images/pokemon/variant/669-yellow_2.png differ diff --git a/public/images/pokemon/variant/670-blue_2.json b/public/images/pokemon/variant/670-blue_2.json new file mode 100644 index 00000000000..a8cfa1f76de --- /dev/null +++ b/public/images/pokemon/variant/670-blue_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-blue_2.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:2521bf6b3e83a3b7935a51408cab53ad:6b69564d80a49fa8e1400add0aed8457:f28e65cb64de91b1773f7b4998e488a5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-blue_2.png b/public/images/pokemon/variant/670-blue_2.png new file mode 100644 index 00000000000..1362ccbd2e5 Binary files /dev/null and b/public/images/pokemon/variant/670-blue_2.png differ diff --git a/public/images/pokemon/variant/670-blue_3.json b/public/images/pokemon/variant/670-blue_3.json new file mode 100644 index 00000000000..b2b0d07682c --- /dev/null +++ b/public/images/pokemon/variant/670-blue_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-blue_3.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:2521bf6b3e83a3b7935a51408cab53ad:6b69564d80a49fa8e1400add0aed8457:f28e65cb64de91b1773f7b4998e488a5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-blue_3.png b/public/images/pokemon/variant/670-blue_3.png new file mode 100644 index 00000000000..881ca7f208f Binary files /dev/null and b/public/images/pokemon/variant/670-blue_3.png differ diff --git a/public/images/pokemon/variant/670-orange_2.json b/public/images/pokemon/variant/670-orange_2.json new file mode 100644 index 00000000000..67ba1f4fcfd --- /dev/null +++ b/public/images/pokemon/variant/670-orange_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-orange_2.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:1bdc88748225dcdacdae9e10a858b7aa:e371409ad2d55f213cbd49c0065fe702:a4ae1870548474db9c466580d9a207bb$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-orange_2.png b/public/images/pokemon/variant/670-orange_2.png new file mode 100644 index 00000000000..80ccbdf030a Binary files /dev/null and b/public/images/pokemon/variant/670-orange_2.png differ diff --git a/public/images/pokemon/variant/670-orange_3.json b/public/images/pokemon/variant/670-orange_3.json new file mode 100644 index 00000000000..62d839e09bc --- /dev/null +++ b/public/images/pokemon/variant/670-orange_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-orange_3.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:1bdc88748225dcdacdae9e10a858b7aa:e371409ad2d55f213cbd49c0065fe702:a4ae1870548474db9c466580d9a207bb$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-orange_3.png b/public/images/pokemon/variant/670-orange_3.png new file mode 100644 index 00000000000..0c579de4ed8 Binary files /dev/null and b/public/images/pokemon/variant/670-orange_3.png differ diff --git a/public/images/pokemon/variant/670-red_2.json b/public/images/pokemon/variant/670-red_2.json new file mode 100644 index 00000000000..fd7b554d664 --- /dev/null +++ b/public/images/pokemon/variant/670-red_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-red_2.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:89019971585f16a2d7ca1661aa22d93d:2d2ac09e2cc549d585a5a5967dc6c8ed:bad05b37c157676604256a043511a6a2$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-red_2.png b/public/images/pokemon/variant/670-red_2.png new file mode 100644 index 00000000000..7c7618848b9 Binary files /dev/null and b/public/images/pokemon/variant/670-red_2.png differ diff --git a/public/images/pokemon/variant/670-red_3.json b/public/images/pokemon/variant/670-red_3.json new file mode 100644 index 00000000000..d3e50945dec --- /dev/null +++ b/public/images/pokemon/variant/670-red_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-red_3.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:89019971585f16a2d7ca1661aa22d93d:2d2ac09e2cc549d585a5a5967dc6c8ed:bad05b37c157676604256a043511a6a2$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-red_3.png b/public/images/pokemon/variant/670-red_3.png new file mode 100644 index 00000000000..95bea559c8d Binary files /dev/null and b/public/images/pokemon/variant/670-red_3.png differ diff --git a/public/images/pokemon/variant/670-white_2.json b/public/images/pokemon/variant/670-white_2.json new file mode 100644 index 00000000000..85771ab96da --- /dev/null +++ b/public/images/pokemon/variant/670-white_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-white_2.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:949a523bd2d5b5ad449237a48c6af998:28a2cc510f6d6dbccfbace75cc64608f:3b5fc0bf297b00d7e2adc65825803c41$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-white_2.png b/public/images/pokemon/variant/670-white_2.png new file mode 100644 index 00000000000..303905201d8 Binary files /dev/null and b/public/images/pokemon/variant/670-white_2.png differ diff --git a/public/images/pokemon/variant/670-white_3.json b/public/images/pokemon/variant/670-white_3.json new file mode 100644 index 00000000000..2cc5ba7d9f6 --- /dev/null +++ b/public/images/pokemon/variant/670-white_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-white_3.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:949a523bd2d5b5ad449237a48c6af998:28a2cc510f6d6dbccfbace75cc64608f:3b5fc0bf297b00d7e2adc65825803c41$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-white_3.png b/public/images/pokemon/variant/670-white_3.png new file mode 100644 index 00000000000..ce9479353f4 Binary files /dev/null and b/public/images/pokemon/variant/670-white_3.png differ diff --git a/public/images/pokemon/variant/670-yellow_2.json b/public/images/pokemon/variant/670-yellow_2.json new file mode 100644 index 00000000000..3f0e601ea3a --- /dev/null +++ b/public/images/pokemon/variant/670-yellow_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-yellow_2.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:46cab680c0ad7bc52d2c1bb54ac6cef1:e7fa0c54ba5f98ae104dfe606014d11b:e33b1f5cc51f17c070e89705329e1246$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-yellow_2.png b/public/images/pokemon/variant/670-yellow_2.png new file mode 100644 index 00000000000..e1866464222 Binary files /dev/null and b/public/images/pokemon/variant/670-yellow_2.png differ diff --git a/public/images/pokemon/variant/670-yellow_3.json b/public/images/pokemon/variant/670-yellow_3.json new file mode 100644 index 00000000000..6769575d788 --- /dev/null +++ b/public/images/pokemon/variant/670-yellow_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "670-yellow_3.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 59 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:46cab680c0ad7bc52d2c1bb54ac6cef1:e7fa0c54ba5f98ae104dfe606014d11b:e33b1f5cc51f17c070e89705329e1246$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/670-yellow_3.png b/public/images/pokemon/variant/670-yellow_3.png new file mode 100644 index 00000000000..af6e6d83f43 Binary files /dev/null and b/public/images/pokemon/variant/670-yellow_3.png differ diff --git a/public/images/pokemon/variant/671-blue.json b/public/images/pokemon/variant/671-blue.json new file mode 100644 index 00000000000..cb538b357dc --- /dev/null +++ b/public/images/pokemon/variant/671-blue.json @@ -0,0 +1,20 @@ +{ + "1": { + "476d80": "130540", + "aaf2f2": "3827a3", + "73bfbf": "291371", + "3d9ccc": "2938a3", + "61c2f2": "3c54b8", + "e5ffff": "69c9e3", + "101010": "101010", + "1b594a": "aa1a58", + "ffa64c": "ff3e3e", + "2d806b": "dc5073", + "3aa68b": "ff91a4", + "595959": "595959", + "f8f8f8": "f8f8f8", + "bfbfbf": "bfbfbf", + "262626": "262626", + "fff6f6": "f8f8f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-blue_3.json b/public/images/pokemon/variant/671-blue_3.json new file mode 100644 index 00000000000..77b1328de60 --- /dev/null +++ b/public/images/pokemon/variant/671-blue_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "671-blue_3.png", + "format": "RGBA8888", + "size": { + "w": 73, + "h": 73 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 63, + "h": 73 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 73 + }, + "frame": { + "x": 0, + "y": 0, + "w": 63, + "h": 73 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4f719a2cf4d334bac18fdb059e6b8e8c:ffd06acada2e9c527443858cc89f6865:70589a17d5b8efc84d2e63a080a74193$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-blue_3.png b/public/images/pokemon/variant/671-blue_3.png new file mode 100644 index 00000000000..8d755b76a7c Binary files /dev/null and b/public/images/pokemon/variant/671-blue_3.png differ diff --git a/public/images/pokemon/variant/671-orange.json b/public/images/pokemon/variant/671-orange.json new file mode 100644 index 00000000000..25ffaa4bec2 --- /dev/null +++ b/public/images/pokemon/variant/671-orange.json @@ -0,0 +1,38 @@ +{ + "1": { + "71543f": "401d04", + "ffd9b2": "a34b2c", + "cca37a": "631818", + "d98d41": "954c17", + "ffb266": "cd8e31", + "fff2e5": "ffbc77", + "101010": "101010", + "1b594a": "aa1a58", + "b36bb3": "fff35a", + "2d806b": "dc5073", + "3aa68b": "ff91a4", + "595959": "595959", + "f8f8f8": "f8f8f8", + "bfbfbf": "bfbfbf", + "262626": "262626", + "fff6f6": "f8f8f8" + }, + "2": { + "71543f": "0a320e", + "ffd9b2": "4d4e46", + "cca37a": "28392c", + "d98d41": "7f9f1f", + "ffb266": "afcf4f", + "fff2e5": "dfe3e1", + "101010": "101010", + "1b594a": "800707", + "b36bb3": "ffca98", + "2d806b": "b1380f", + "3aa68b": "dc7226", + "595959": "712b2b", + "f8f8f8": "fff1df", + "bfbfbf": "f1a695", + "262626": "262626", + "fff6f6": "f9f9f9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-red.json b/public/images/pokemon/variant/671-red.json new file mode 100644 index 00000000000..a07f1bf5d25 --- /dev/null +++ b/public/images/pokemon/variant/671-red.json @@ -0,0 +1,20 @@ +{ + "1": { + "683644": "390614", + "d998c3": "8e1a55", + "a66390": "4e0c38", + "d94c4c": "95172c", + "ff7373": "c64040", + "ffb2cc": "ff90a2", + "101010": "101010", + "1b594a": "aa1a58", + "ffe14c": "ff7c39", + "2d806b": "dc5073", + "3aa68b": "ff91a4", + "595959": "595959", + "f8f8f8": "f8f8f8", + "bfbfbf": "bfbfbf", + "262626": "262626", + "fff6f6": "f8f8f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-red_3.json b/public/images/pokemon/variant/671-red_3.json new file mode 100644 index 00000000000..1ec10d89bf0 --- /dev/null +++ b/public/images/pokemon/variant/671-red_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "671-red_3.png", + "format": "RGBA8888", + "size": { + "w": 73, + "h": 73 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 63, + "h": 73 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 73 + }, + "frame": { + "x": 0, + "y": 0, + "w": 63, + "h": 73 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:1b14e3dff9b86428cb4d1b1469c59f37:0cc9495c8a1736eea511b5b5651c5dd3:022a17391d930b8042a1289e0c46e3eb$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-red_3.png b/public/images/pokemon/variant/671-red_3.png new file mode 100644 index 00000000000..ad3656d2b62 Binary files /dev/null and b/public/images/pokemon/variant/671-red_3.png differ diff --git a/public/images/pokemon/variant/671-white.json b/public/images/pokemon/variant/671-white.json new file mode 100644 index 00000000000..1db360bee55 --- /dev/null +++ b/public/images/pokemon/variant/671-white.json @@ -0,0 +1,20 @@ +{ + "1": { + "808080": "171a1c", + "f2f2f2": "353340", + "b3b3b3": "0f0d15", + "d9d9d9": "3c3b47", + "fefefe": "60616a", + "ffbfca": "c2c1c6", + "101010": "101010", + "1b594a": "aa1a58", + "41d9d9": "ffffff", + "2d806b": "dc5073", + "3aa68b": "ff91a4", + "595959": "595959", + "f8f8f8": "f8f8f8", + "bfbfbf": "bfbfbf", + "262626": "262626", + "fff6f6": "f8f8f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-white_3.json b/public/images/pokemon/variant/671-white_3.json new file mode 100644 index 00000000000..f7f6abed529 --- /dev/null +++ b/public/images/pokemon/variant/671-white_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "671-white_3.png", + "format": "RGBA8888", + "size": { + "w": 73, + "h": 73 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 63, + "h": 73 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 73 + }, + "frame": { + "x": 0, + "y": 0, + "w": 63, + "h": 73 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c917e47c77e82d76657cd700e269570e:7c69057af5dd431cccd12f8317199aec:3de87aeb33f03ad735679a257f0fc482$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-white_3.png b/public/images/pokemon/variant/671-white_3.png new file mode 100644 index 00000000000..bab8091ae50 Binary files /dev/null and b/public/images/pokemon/variant/671-white_3.png differ diff --git a/public/images/pokemon/variant/671-yellow.json b/public/images/pokemon/variant/671-yellow.json new file mode 100644 index 00000000000..f6e962d1f3f --- /dev/null +++ b/public/images/pokemon/variant/671-yellow.json @@ -0,0 +1,20 @@ +{ + "1": { + "6e6b4a": "074034", + "ffeabf": "22b14a", + "ccb485": "227850", + "d9cc41": "789c16", + "fff266": "b0bf2b", + "ffd2a6": "ffe593", + "101010": "101010", + "1b594a": "aa1a58", + "93b336": "5f30ff", + "2d806b": "dc5073", + "3aa68b": "ff91a4", + "595959": "595959", + "f8f8f8": "f8f8f8", + "bfbfbf": "bfbfbf", + "262626": "262626", + "fff6f6": "f8f8f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-yellow_3.json b/public/images/pokemon/variant/671-yellow_3.json new file mode 100644 index 00000000000..5184a594006 --- /dev/null +++ b/public/images/pokemon/variant/671-yellow_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "671-yellow_3.png", + "format": "RGBA8888", + "size": { + "w": 73, + "h": 73 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 63, + "h": 73 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 73 + }, + "frame": { + "x": 0, + "y": 0, + "w": 63, + "h": 73 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c89bc9b8c343979094f3c29746db4e29:1b27a705f14adbb9e8076c6b9173b355:3175ed80409caf1e1b2ac1da18f8d0bd$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/671-yellow_3.png b/public/images/pokemon/variant/671-yellow_3.png new file mode 100644 index 00000000000..f518af40869 Binary files /dev/null and b/public/images/pokemon/variant/671-yellow_3.png differ diff --git a/public/images/pokemon/variant/677.json b/public/images/pokemon/variant/677.json new file mode 100644 index 00000000000..9708332f277 --- /dev/null +++ b/public/images/pokemon/variant/677.json @@ -0,0 +1,26 @@ +{ + "1": { + "5c5c66": "601339", + "b8b8cc": "bd5c81", + "45454d": "470d28", + "8a8a99": "943b5d", + "f8f8f8": "f1f0e4", + "cca3cc": "43adaf", + "ffffff": "ffffff", + "3f6273": "30237a", + "995c99": "29767f", + "101010": "101010" + }, + "2": { + "5c5c66": "243e41", + "b8b8cc": "6ba78a", + "45454d": "193437", + "8a8a99": "426b62", + "f8f8f8": "67415e", + "cca3cc": "ff657d", + "ffffff": "ffffff", + "3f6273": "69004e", + "995c99": "d13955", + "101010": "101010" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/678-female.json b/public/images/pokemon/variant/678-female.json new file mode 100644 index 00000000000..06f6eb9ca3b --- /dev/null +++ b/public/images/pokemon/variant/678-female.json @@ -0,0 +1,28 @@ +{ + "1": { + "737373": "947859", + "bfbfbf": "d5c49f", + "f8f8f8": "f8f5cd", + "17294d": "47182e", + "365fb3": "a5346b", + "101010": "101010", + "264480": "76264d", + "ffe54f": "3fbae2", + "ffffff": "ffffff", + "d92121": "415493", + "c9ad20": "4b86bd" + }, + "2": { + "737373": "33142f", + "bfbfbf": "613d5a", + "f8f8f8": "855577", + "17294d": "1d3f33", + "365fb3": "7bd38d", + "101010": "101010", + "264480": "47946c", + "ffe54f": "ff85ad", + "ffffff": "ffffff", + "d92121": "9d0067", + "c9ad20": "f2557b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/678.json b/public/images/pokemon/variant/678.json new file mode 100644 index 00000000000..a4ca1b86f3f --- /dev/null +++ b/public/images/pokemon/variant/678.json @@ -0,0 +1,28 @@ +{ + "1": { + "737373": "947859", + "f8f8f8": "f8f5cd", + "bfbfbf": "d5c49f", + "17294d": "47182e", + "365fb3": "a5346b", + "264480": "76264d", + "101010": "101010", + "7ff5f5": "74e8eb", + "43c3a7": "1fa5bb", + "ffffff": "ffffff", + "14864d": "415493" + }, + "2": { + "737373": "33142f", + "f8f8f8": "855577", + "bfbfbf": "613d5a", + "17294d": "1d3f33", + "365fb3": "7bd38d", + "264480": "47946c", + "101010": "101010", + "7ff5f5": "ff867c", + "43c3a7": "df4272", + "ffffff": "ffffff", + "14864d": "9a0066" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/698.json b/public/images/pokemon/variant/698.json new file mode 100644 index 00000000000..f4b95a1c7bf --- /dev/null +++ b/public/images/pokemon/variant/698.json @@ -0,0 +1,36 @@ +{ + "1": { + "b3747e": "4b7465", + "ffbfca": "43bf8d", + "fff2b2": "9bffa9", + "85b4cc": "cf755d", + "a6e1ff": "efab87", + "cacaca": "cacaca", + "101010": "101010", + "2eaeec": "4dc796", + "1f75a0": "29988e", + "fdfdfd": "fdfdfd", + "537180": "b04f4b", + "217aa6": "7f99e1", + "30b2f2": "b5dcff", + "f9f9f9": "e6e3b4", + "c0c0c0": "d7cca0" + }, + "2": { + "b3747e": "c452a6", + "ffbfca": "faccff", + "fff2b2": "eb88b9", + "85b4cc": "654a8a", + "a6e1ff": "936daa", + "cacaca": "cacaca", + "101010": "101010", + "2eaeec": "ad4e6e", + "1f75a0": "8d2656", + "fdfdfd": "fdfdfd", + "537180": "392d65", + "217aa6": "efaa51", + "30b2f2": "ffd169", + "f9f9f9": "373453", + "c0c0c0": "282747" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/699.json b/public/images/pokemon/variant/699.json new file mode 100644 index 00000000000..8aecfd2f2c2 --- /dev/null +++ b/public/images/pokemon/variant/699.json @@ -0,0 +1,44 @@ +{ + "1": { + "7279a1": "164450", + "ccd2ee": "237578", + "fff2b2": "4eb87f", + "a7afd5": "1c5962", + "e5d68a": "429a77", + "6d749a": "2d7c63", + "4e568b": "a03c58", + "3689b3": "8487e1", + "81a0dc": "e5756b", + "ffffff": "ffeac0", + "f8f8f8": "f8f8f8", + "4cc3ff": "c2d5ff", + "657dac": "c44f5d", + "101010": "101010", + "3d8eb6": "12545e", + "53c5ff": "1c7376", + "4b6f76": "b78460", + "94b7bd": "d3a47b", + "d4edf3": "ffe4a7" + }, + "2": { + "7279a1": "c89ad8", + "ccd2ee": "fedbff", + "fff2b2": "4cdfc7", + "a7afd5": "e6b9ea", + "e5d68a": "38c1c7", + "6d749a": "2c97b3", + "4e568b": "243369", + "3689b3": "efbe63", + "81a0dc": "3f648b", + "ffffff": "bae8ff", + "f8f8f8": "f8f8f8", + "4cc3ff": "ffea82", + "657dac": "2f4978", + "101010": "101010", + "3d8eb6": "852d6b", + "53c5ff": "ab467e", + "4b6f76": "1c183a", + "94b7bd": "261e44", + "d4edf3": "382955" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/702.json b/public/images/pokemon/variant/702.json new file mode 100644 index 00000000000..12feb29a0fd --- /dev/null +++ b/public/images/pokemon/variant/702.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "262626": "2a3b5e", + "4d4d4d": "6789b3", + "bfbf86": "a3d1cc", + "f2f2aa": "ddfff5", + "735c2e": "a53c42", + "997a3d": "c9685f", + "f2c261": "ffd3b6", + "bf994c": "e49f84", + "1d1d1d": "1a1c45", + "f8f8f8": "f8f8f8", + "464646": "424b8f", + "d97d21": "7cd6a1" + }, + "2": { + "101010": "101010", + "262626": "072d38", + "4d4d4d": "197870", + "bfbf86": "aaa8d6", + "f2f2aa": "ece5ff", + "735c2e": "1e0e27", + "997a3d": "2d1533", + "f2c261": "5f3662", + "bf994c": "432249", + "1d1d1d": "02172d", + "f8f8f8": "f8f8f8", + "464646": "17646c", + "d97d21": "d2fff1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/703.json b/public/images/pokemon/variant/703.json new file mode 100644 index 00000000000..46a8ec413b4 --- /dev/null +++ b/public/images/pokemon/variant/703.json @@ -0,0 +1,32 @@ +{ + "1": { + "6994bf": "e67c37", + "474759": "292638", + "f8f8f8": "f8f8f8", + "8cc6ff": "ffa633", + "2e5073": "c35b2a", + "8f8fb3": "4d496b", + "adadd9": "68638e", + "666680": "37344e", + "101010": "101010", + "21abd9": "ff9b44", + "595959": "e6ac60", + "f2f2f2": "ffeed6", + "bfbfbf": "ffd3a1" + }, + "2": { + "6994bf": "e25493", + "474759": "976ba9", + "f8f8f8": "ffe2ee", + "8cc6ff": "f591bd", + "2e5073": "a03c69", + "8f8fb3": "e4cdf9", + "adadd9": "faecff", + "666680": "cca1db", + "101010": "101010", + "21abd9": "de5f8e", + "595959": "5a3d84", + "f2f2f2": "a473bf", + "bfbfbf": "8359a7" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/751.json b/public/images/pokemon/variant/751.json index 19dc7bedb56..f58b50b56a4 100644 --- a/public/images/pokemon/variant/751.json +++ b/public/images/pokemon/variant/751.json @@ -1,30 +1,33 @@ { "1": { - "8895ac": "ae504b", - "e8e8ea": "ffc8d1", + "5e9cbd": "cc7854", + "39628d": "a14835", + "516a7b": "812b3e", + "32455b": "4c152c", + "aed7ee": "f6e4c2", + "fcfcfd": "fffae3", + "cedf42": "673252", + "dee3f1": "ffc8d1", "9bad34": "4e1f42", "69670e": "3a112f", - "cedf42": "673252", - "fcfcfc": "fcfcfc", - "3c4459": "4c152c", - "aed7ee": "aed7ee", + "8895ac": "ae504b", + "8e99ad": "98433e", "79c4d4": "f3bd8a", - "101010": "101010", - "516a7b": "812b3e", - "5e9cbd": "cc7854" + "3a4055": "4c152c" }, "2": { - "8895ac": "ea9b43", - "e8e8ea": "f1dcc2", + "5e9cbd": "253155", + "39628d": "1c2246", + "516a7b": "ba5c2c", + "32455b": "7b3836", + "fcfcfd": "f0f0f2", + "cedf42": "72add9", + "dee3f1": "f1dcc2", "9bad34": "4980ac", "69670e": "263756", - "cedf42": "72add9", - "fcfcfc": "fcfcfc", - "3c4459": "73312f", - "aed7ee": "aed7ee", + "8895ac": "ea9b43", + "8e99ad": "cd8330", "79c4d4": "3b5373", - "101010": "101010", - "516a7b": "ba5c2c", - "5e9cbd": "253155" + "3a4055": "73312f" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/79.json b/public/images/pokemon/variant/79.json index f9a866f85e4..7c9fa7a0ba8 100644 --- a/public/images/pokemon/variant/79.json +++ b/public/images/pokemon/variant/79.json @@ -13,5 +13,35 @@ "8c5a19": "8c6b10", "efc58c": "efc58c", "ffe6b5": "fff7b5" + }, + "1": { + "6b6363": "6b6363", + "101010": "101010", + "d6cece": "d6cece", + "ffffff": "ffffff", + "ffa5a5": "ad7459", + "de637b": "5b3332", + "ff8494": "885345", + "ad4252": "422220", + "7b2131": "3b1111", + "dea563": "b97565", + "8c5a19": "714942", + "efc58c": "d49983", + "ffe6b5": "e0b69d" + }, + "2": { + "6b6363": "6b6363", + "101010": "101010", + "d6cece": "d6cece", + "ffffff": "ffffff", + "ffa5a5": "ffeb9b", + "de637b": "dd8f47", + "ff8494": "eebd6a", + "ad4252": "a54729", + "7b2131": "4d2820", + "dea563": "8f2622", + "8c5a19": "69080f", + "efc58c": "b34d2e", + "ffe6b5": "d16b34" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/80-mega.json b/public/images/pokemon/variant/80-mega.json new file mode 100644 index 00000000000..9bf85259157 --- /dev/null +++ b/public/images/pokemon/variant/80-mega.json @@ -0,0 +1,34 @@ +{ + "1": { + "181818": "181818", + "b55565": "3f2729", + "e66a7b": "5b3332", + "ff9494": "885345", + "ffbdac": "ad7459", + "deded5": "deded5", + "f8f8f8": "f8f8f8", + "835a20": "9f675f", + "cda462": "b97565", + "ffeeb4": "e0b69d", + "eed583": "d49983", + "52525a": "7c5b40", + "b4bdbd": "f0d090", + "8b9494": "bf9562" + }, + "2": { + "181818": "181818", + "b55565": "c08746", + "e66a7b": "de9048", + "ff9494": "eebd6a", + "ffbdac": "ffea9a", + "deded5": "deded5", + "f8f8f8": "f8f8f8", + "835a20": "69080f", + "cda462": "8f2622", + "ffeeb4": "d16b34", + "eed583": "b34d2e", + "52525a": "192b32", + "b4bdbd": "4c7668", + "8b9494": "2b4a48" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/80.json b/public/images/pokemon/variant/80.json new file mode 100644 index 00000000000..83203a8cc62 --- /dev/null +++ b/public/images/pokemon/variant/80.json @@ -0,0 +1,36 @@ +{ + "1": { + "7b3131": "3f2729", + "e66b7b": "5c3433", + "ff9494": "895446", + "191919": "191919", + "ffbdad": "ae755a", + "deded6": "deded6", + "ffffff": "ffffff", + "52525a": "8b5d37", + "845a21": "9f675f", + "8c9494": "bf9562", + "ffefb5": "e0b69d", + "efd684": "d49983", + "cea563": "ba7666", + "b5bdbd": "f0d090", + "e65229": "7b4f44" + }, + "2": { + "7b3131": "a54729", + "e66b7b": "dd8f47", + "ff9494": "edbc69", + "191919": "191919", + "ffbdad": "ffeb9b", + "deded6": "deded6", + "ffffff": "ffffff", + "52525a": "192b32", + "845a21": "69080f", + "8c9494": "2a4947", + "ffefb5": "d16b34", + "efd684": "b34d2e", + "cea563": "8f2622", + "b5bdbd": "4b7567", + "e65229": "e8b15f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/802.json b/public/images/pokemon/variant/802.json index 841bb430fad..95a92d8babc 100644 --- a/public/images/pokemon/variant/802.json +++ b/public/images/pokemon/variant/802.json @@ -24,9 +24,9 @@ "f2a455": "ff9a50" }, "2": { - "2c3e30": "5a0423", - "6a806d": "ce3e63", - "536155": "97123b", + "2c3e30": "508294", + "6a806d": "a7eaee", + "536155": "82b7c3", "101010": "101010", "2d3137": "5a0423", "747778": "ce3e63", diff --git a/public/images/pokemon/variant/803.json b/public/images/pokemon/variant/803.json new file mode 100644 index 00000000000..1f612916938 --- /dev/null +++ b/public/images/pokemon/variant/803.json @@ -0,0 +1,32 @@ +{ + "1": { + "78757f": "449e93", + "ccc0d8": "e3ffec", + "101010": "101010", + "98295e": "27579e", + "ff6ccc": "54cbdc", + "d9338e": "3492b9", + "453966": "211c49", + "814eba": "2e4b84", + "39284d": "1d1638", + "583f87": "2e2e69", + "b389d3": "4e80ad", + "008fdd": "81262d", + "b6e4f3": "df6541" + }, + "2": { + "78757f": "cd9b85", + "ccc0d8": "ffefe0", + "101010": "101010", + "98295e": "a12f63", + "ff6ccc": "ff778d", + "d9338e": "d6487a", + "453966": "0d293d", + "814eba": "095654", + "39284d": "08172f", + "583f87": "103a47", + "b389d3": "2b987d", + "008fdd": "ffaa7a", + "b6e4f3": "fffce3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/804.json b/public/images/pokemon/variant/804.json new file mode 100644 index 00000000000..53abed974c1 --- /dev/null +++ b/public/images/pokemon/variant/804.json @@ -0,0 +1,34 @@ +{ + "1": { + "5f4670": "16396f", + "bc88ff": "359faf", + "9372c0": "22658d", + "9e2348": "81262d", + "ff6cd3": "e88354", + "db3e94": "c74736", + "793fbe": "284173", + "101010": "101010", + "6d656d": "2b5d67", + "aaeaff": "ffdfa3", + "a896a9": "8edfd5", + "e8d9e4": "e3ffec", + "513786": "212149", + "36244c": "18183d" + }, + "2": { + "5f4670": "0b353d", + "bc88ff": "68b363", + "9372c0": "2d794e", + "9e2348": "7e4e3d", + "ff6cd3": "fff8cc", + "db3e94": "dcbb94", + "793fbe": "095654", + "101010": "101010", + "6d656d": "690940", + "aaeaff": "475269", + "a896a9": "96234e", + "e8d9e4": "e54558", + "513786": "103a47", + "36244c": "042a35" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/867.json b/public/images/pokemon/variant/867.json new file mode 100644 index 00000000000..fcf7e29867a --- /dev/null +++ b/public/images/pokemon/variant/867.json @@ -0,0 +1,26 @@ +{ + "1": { + "393941": "69d9bf", + "101010": "101010", + "d9d0d1": "d6b8a0", + "c5b9bb": "c69981", + "d66770": "334599", + "cb414b": "18265b", + "927e8d": "a46361", + "816968": "743949", + "463c3f": "5a2940", + "ab38d1": "a30e37" + }, + "2": { + "393941": "a4222c", + "101010": "101010", + "d9d0d1": "4fb66a", + "c5b9bb": "298a61", + "d66770": "ffe78d", + "cb414b": "ffad58", + "927e8d": "1f6455", + "816968": "0a4340", + "463c3f": "052b2f", + "ab38d1": "c2ffe2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/880.json b/public/images/pokemon/variant/880.json new file mode 100644 index 00000000000..3e626f744bd --- /dev/null +++ b/public/images/pokemon/variant/880.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "975e17": "5b0610", + "ffff84": "ee8563", + "ead900": "c6362b", + "8f261b": "1b1829", + "e39e1e": "9c1430", + "ed4e76": "312f47", + "ff8d9f": "6a98c4", + "ff3868": "7cac72", + "871f16": "427d47", + "ff9946": "bb3333", + "008567": "757798", + "005e44": "564e6e", + "003319": "26233c", + "39ad5a": "a2b5c8" + }, + "2": { + "101010": "101010", + "975e17": "211b3d", + "ffff84": "dceeeb", + "ead900": "636287", + "8f261b": "8f261b", + "e39e1e": "35365e", + "ed4e76": "ca5939", + "ff8d9f": "e28854", + "ff3868": "48d385", + "871f16": "239d73", + "ff9946": "8993b9", + "008567": "fff491", + "005e44": "f1b45f", + "003319": "671d18", + "39ad5a": "ce734d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/881.json b/public/images/pokemon/variant/881.json new file mode 100644 index 00000000000..231947e9afd --- /dev/null +++ b/public/images/pokemon/variant/881.json @@ -0,0 +1,40 @@ +{ + "1": { + "975e17": "5b0610", + "ffff84": "ee8563", + "101010": "101010", + "e39e1e": "9c1430", + "ead900": "c6362b", + "2abbfc": "ceb16f", + "1e6edd": "ae7a4e", + "9ab8ba": "cea5b9", + "edf3f2": "faebc8", + "5c7996": "a57185", + "09354d": "271014", + "08256c": "4d254a", + "085d94": "714363", + "b0e8ec": "ead2dd", + "27aed6": "6e4145", + "0981ae": "45242e", + "25a7ce": "b59795" + }, + "2": { + "975e17": "211b3d", + "ffff84": "dceeeb", + "101010": "101010", + "e39e1e": "35365e", + "ead900": "636287", + "2abbfc": "26c248", + "1e6edd": "11974c", + "9ab8ba": "a3c465", + "edf3f2": "fcffe4", + "5c7996": "50a751", + "09354d": "0d2834", + "08256c": "7b1a5e", + "085d94": "ad3b6c", + "b0e8ec": "deedc5", + "27aed6": "2d7b65", + "0981ae": "205e5d", + "25a7ce": "d49da9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/882.json b/public/images/pokemon/variant/882.json new file mode 100644 index 00000000000..cffd202806d --- /dev/null +++ b/public/images/pokemon/variant/882.json @@ -0,0 +1,36 @@ +{ + "1": { + "871f16": "771922", + "434c63": "3a151c", + "ff3868": "6a94b0", + "83bbed": "eaa561", + "777ebd": "cc6235", + "edf3f2": "faebc8", + "101010": "101010", + "005e44": "564e6e", + "ff3c6d": "312f47", + "8f261b": "1d2238", + "d5657b": "4b729f", + "008567": "757798", + "ff8d9f": "6a98c4", + "39ad5a": "b5a49e", + "003319": "1a182b" + }, + "2": { + "871f16": "320432", + "434c63": "450940", + "ff3868": "ffaf3c", + "83bbed": "8c1f45", + "777ebd": "6c1046", + "edf3f2": "fbecff", + "101010": "101010", + "005e44": "f1b45f", + "ff3c6d": "ca5939", + "8f261b": "215b68", + "d5657b": "308a86", + "008567": "fff491", + "ff8d9f": "63bb8b", + "39ad5a": "ce734d", + "003319": "671d18" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/883.json b/public/images/pokemon/variant/883.json new file mode 100644 index 00000000000..1cc1087f458 --- /dev/null +++ b/public/images/pokemon/variant/883.json @@ -0,0 +1,32 @@ +{ + "1": { + "434c63": "3a151c", + "83bbed": "eaa561", + "777ebd": "cc6235", + "172459": "771922", + "101010": "101010", + "edf3f2": "faebc8", + "09354d": "2f1f1a", + "085d94": "714363", + "5c7996": "8c6060", + "9ab8ba": "cea5b9", + "3f6fb1": "883f72", + "27aed6": "6e4145", + "0981ae": "45242e" + }, + "2": { + "434c63": "450940", + "83bbed": "8c1f45", + "777ebd": "6c1046", + "172459": "320432", + "101010": "101010", + "edf3f2": "fcffe4", + "09354d": "2f1a20", + "085d94": "ad3b6c", + "5c7996": "50a751", + "9ab8ba": "a3c465", + "3f6fb1": "883f72", + "27aed6": "2d7b65", + "0981ae": "205e5d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/888-crowned.json b/public/images/pokemon/variant/888-crowned.json new file mode 100644 index 00000000000..64509128dc6 --- /dev/null +++ b/public/images/pokemon/variant/888-crowned.json @@ -0,0 +1,36 @@ +{ + "1": { + "8f4e2f": "2f4567", + "d79a53": "5a829b", + "f2db8a": "a1c9cd", + "080808": "080808", + "3471b4": "b74323", + "2d4377": "5c1a1d", + "4999da": "ec813b", + "93262f": "0d2729", + "be3c45": "224d42", + "f45353": "448b48", + "fae2c0": "fff8cd", + "d3a79a": "da9772", + "34313e": "32171f", + "fdfdfd": "fdfdfd", + "9d6862": "a85f49" + }, + "2": { + "8f4e2f": "692e47", + "d79a53": "964c5c", + "f2db8a": "c4826b", + "080808": "080808", + "3471b4": "9fa7d0", + "2d4377": "615c7e", + "4999da": "e6ecff", + "93262f": "431042", + "be3c45": "6c1d59", + "f45353": "902d57", + "fae2c0": "3d5b72", + "d3a79a": "243149", + "34313e": "1a1829", + "fdfdfd": "fdfdfd", + "9d6862": "1c2238" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/888.json b/public/images/pokemon/variant/888.json new file mode 100644 index 00000000000..e6a4c1e784f --- /dev/null +++ b/public/images/pokemon/variant/888.json @@ -0,0 +1,30 @@ +{ + "1": { + "2d4377": "5c1a1d", + "080808": "080808", + "4999da": "ec813b", + "3471b4": "b74323", + "f45353": "448b48", + "d3a79a": "da9772", + "fae2c0": "fff8cd", + "34313e": "32171f", + "be3c45": "224d42", + "93262f": "0d2729", + "fdfdfd": "fdfdfd", + "9d6862": "a85f49" + }, + "2": { + "2d4377": "615c7e", + "080808": "080808", + "4999da": "e6ecff", + "3471b4": "9fa7d0", + "f45353": "902d57", + "d3a79a": "243149", + "fae2c0": "3d5b72", + "34313e": "1a1829", + "be3c45": "6c1d59", + "93262f": "431042", + "fdfdfd": "fdfdfd", + "9d6862": "1c2238" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/889-crowned.json b/public/images/pokemon/variant/889-crowned.json new file mode 100644 index 00000000000..9a91c8a7939 --- /dev/null +++ b/public/images/pokemon/variant/889-crowned.json @@ -0,0 +1,36 @@ +{ + "1": { + "2d2f7b": "102c2c", + "080808": "080808", + "396dce": "70a757", + "2d48a8": "3c6959", + "8f4e2f": "2f4567", + "f2db8a": "a1c9cd", + "d79a53": "5a829b", + "eb363a": "614378", + "fffccc": "d3eeea", + "731a27": "1c163d", + "ae2836": "422b61", + "34313e": "19142f", + "fdfdfd": "fdfdfd", + "c2c3cf": "ffe0cc", + "8887a8": "d69f97" + }, + "2": { + "2d2f7b": "244e61", + "080808": "080808", + "396dce": "6fc7c1", + "2d48a8": "4797a4", + "8f4e2f": "692e47", + "f2db8a": "c4826b", + "d79a53": "964c5c", + "eb363a": "e6ecff", + "fffccc": "e5b885", + "731a27": "615c7e", + "ae2836": "9fa7d0", + "34313e": "22192c", + "fdfdfd": "fdfdfd", + "c2c3cf": "694f69", + "8887a8": "442e49" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/889.json b/public/images/pokemon/variant/889.json new file mode 100644 index 00000000000..ec9903b04a3 --- /dev/null +++ b/public/images/pokemon/variant/889.json @@ -0,0 +1,30 @@ +{ + "1": { + "2d2f7b": "102c2c", + "396dce": "70a757", + "2d48a8": "3c6959", + "080808": "080808", + "f2db8a": "a1c9cd", + "731a27": "1c163d", + "eb363a": "614378", + "ae2836": "422b61", + "c2c3cf": "ffe0cc", + "8887a8": "d69f97", + "34313e": "19142f", + "fdfdfd": "fdfdfd" + }, + "2": { + "2d2f7b": "244e61", + "396dce": "6fc7c1", + "2d48a8": "4797a4", + "080808": "080808", + "f2db8a": "c4826b", + "731a27": "615c7e", + "eb363a": "e6ecff", + "ae2836": "9fa7d0", + "c2c3cf": "694f69", + "8887a8": "442e49", + "34313e": "22192c", + "fdfdfd": "fdfdfd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/912.json b/public/images/pokemon/variant/912.json new file mode 100644 index 00000000000..c366d573c0a --- /dev/null +++ b/public/images/pokemon/variant/912.json @@ -0,0 +1,36 @@ +{ + "1": { + "1f5978": "8c3b14", + "3686b1": "d96536", + "2fbee8": "e69c51", + "84d7ff": "f7ca7b", + "0f0f0f": "0f0f0f", + "f2fdff": "fff0d4", + "4d6373": "a05f27", + "becde4": "d79f63", + "005ba2": "7f0e0b", + "7999bd": "b9865a", + "f6fbfc": "ffe3b0", + "ffffff": "ffffff", + "6a6a41": "3b2e28", + "aca462": "5b5450", + "f6f64a": "868382" + }, + "2": { + "1f5978": "0a3025", + "3686b1": "1c7962", + "2fbee8": "33b37e", + "84d7ff": "58d299", + "0f0f0f": "0f0f0f", + "f2fdff": "a6f5bb", + "4d6373": "2d185d", + "becde4": "5137a0", + "005ba2": "0e3f31", + "7999bd": "422c84", + "f6fbfc": "6767e3", + "ffffff": "ffffff", + "6a6a41": "601a0d", + "aca462": "bb602f", + "f6f64a": "f49651" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/913_2.json b/public/images/pokemon/variant/913_2.json new file mode 100644 index 00000000000..a063bff593f --- /dev/null +++ b/public/images/pokemon/variant/913_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "913_2.png", + "format": "RGBA8888", + "size": { + "w": 63, + "h": 63 + }, + "scale": 0.5, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 96, + "h": 96 + }, + "spriteSourceSize": { + "x": 28, + "y": 16, + "w": 40, + "h": 63 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 63 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4704c70abfc3c2daa9e946223e718b25:34020b8b58e265e680b0a7fd946eb53f:6c6d101ae74d8a8237faf96bfea4e6ac$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/913_2.png b/public/images/pokemon/variant/913_2.png new file mode 100644 index 00000000000..0af21bab11c Binary files /dev/null and b/public/images/pokemon/variant/913_2.png differ diff --git a/public/images/pokemon/variant/913_3.json b/public/images/pokemon/variant/913_3.json new file mode 100644 index 00000000000..3104110cbfe --- /dev/null +++ b/public/images/pokemon/variant/913_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "913_3.png", + "format": "RGBA8888", + "size": { + "w": 63, + "h": 63 + }, + "scale": 0.5, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 96, + "h": 96 + }, + "spriteSourceSize": { + "x": 28, + "y": 16, + "w": 40, + "h": 63 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 63 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4704c70abfc3c2daa9e946223e718b25:34020b8b58e265e680b0a7fd946eb53f:6c6d101ae74d8a8237faf96bfea4e6ac$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/913_3.png b/public/images/pokemon/variant/913_3.png new file mode 100644 index 00000000000..42398fe12d6 Binary files /dev/null and b/public/images/pokemon/variant/913_3.png differ diff --git a/public/images/pokemon/variant/914.json b/public/images/pokemon/variant/914.json new file mode 100644 index 00000000000..1204b6c99a1 --- /dev/null +++ b/public/images/pokemon/variant/914.json @@ -0,0 +1,22 @@ +{ + "2": { + "3d7a71": "541222", + "55dbe6": "f15e76", + "0f0f0f": "0f0f0f", + "394bee": "1d6c42", + "282a4d": "072a2b", + "419bc2": "a22f49", + "effffd": "ffd2cf", + "333f93": "0f4537", + "6e260f": "664747", + "e3460f": "fff2e5", + "a24720": "eac7b4", + "eda936": "ffa564", + "803213": "4b251b", + "ffffff": "ffffff", + "efffff": "4b40be", + "cb7e29": "c76740", + "8ea6a8": "3b188e", + "5f787d": "120e4a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/914_2.json b/public/images/pokemon/variant/914_2.json new file mode 100644 index 00000000000..b81c7269abf --- /dev/null +++ b/public/images/pokemon/variant/914_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "914_2.png", + "format": "RGBA8888", + "size": { + "w": 79, + "h": 79 + }, + "scale": 0.5, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 96, + "h": 96 + }, + "spriteSourceSize": { + "x": 21, + "y": 8, + "w": 55, + "h": 79 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:64813566971e46c8ce6045b90dff5c6c:f6066f9a430e46d035ba97e3d3c7ee4b:a123ce346d124b2d12481db361d1b25b$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/914_2.png b/public/images/pokemon/variant/914_2.png new file mode 100644 index 00000000000..672e45f026a Binary files /dev/null and b/public/images/pokemon/variant/914_2.png differ diff --git a/public/images/pokemon/variant/940.json b/public/images/pokemon/variant/940.json new file mode 100644 index 00000000000..a84fb9ed44d --- /dev/null +++ b/public/images/pokemon/variant/940.json @@ -0,0 +1,38 @@ +{ + "1": { + "2f3135": "372b61", + "3f424d": "4c4982", + "181a1b": "271945", + "ffcd37": "7dffc0", + "91a5c3": "e39fc5", + "f9f9f9": "f9f9f9", + "be8f29": "5dd9c8", + "0f0f0f": "0f0f0f", + "643c28": "433382", + "73bbbf": "73bbbf", + "f1a156": "ce87fa", + "c27741": "9a5fd9", + "826426": "1b9ea1", + "6d768e": "b66ec4", + "323438": "382c63", + "434854": "754494" + }, + "2": { + "2f3135": "e099a5", + "3f424d": "edc5c8", + "181a1b": "532d61", + "ffcd37": "d9647b", + "91a5c3": "ba73b2", + "f9f9f9": "f9f9f9", + "be8f29": "b3466a", + "0f0f0f": "0f0f0f", + "643c28": "2b2745", + "73bbbf": "ffcf4a", + "f1a156": "745b85", + "c27741": "57436e", + "826426": "8c2a55", + "6d768e": "904fa1", + "323438": "641543", + "434854": "59317a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/941.json b/public/images/pokemon/variant/941.json new file mode 100644 index 00000000000..3c36d6a91da --- /dev/null +++ b/public/images/pokemon/variant/941.json @@ -0,0 +1,38 @@ +{ + "1": { + "15161e": "16173b", + "26282c": "1f1d54", + "34393f": "2b3863", + "aa7e24": "3dd1cc", + "ffcd37": "6ef5c8", + "8c898c": "9c5bd9", + "fdfdfd": "fdfdfd", + "2b1717": "773185", + "73bbbf": "de82ff", + "441e21": "d16492", + "692a2f": "ff9ec6", + "0f0f0f": "0f0f0f", + "624a20": "217991", + "37415a": "55348a", + "272a2e": "3b227a", + "171821": "23175e" + }, + "2": { + "15161e": "873e58", + "26282c": "e394a7", + "34393f": "f7bebe", + "aa7e24": "c44f6c", + "ffcd37": "e3667d", + "8c898c": "cf7827", + "fdfdfd": "fdfdfd", + "2b1717": "3a3466", + "73bbbf": "ffcf4a", + "441e21": "51467a", + "692a2f": "776294", + "0f0f0f": "0f0f0f", + "624a20": "8a2f62", + "37415a": "723b80", + "272a2e": "56286b", + "171821": "401b52" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/953.json b/public/images/pokemon/variant/953.json new file mode 100644 index 00000000000..417229d550b --- /dev/null +++ b/public/images/pokemon/variant/953.json @@ -0,0 +1,36 @@ +{ + "1": { + "5b4d37": "1c1e76", + "776348": "323aa5", + "9e8461": "4059bd", + "c5b4aa": "d3e6e6", + "f38725": "2e8c19", + "37332b": "104139", + "b96c26": "2f7410", + "575244": "18734a", + "0f0f0f": "0f0f0f", + "777463": "199e46", + "4d4530": "b29c3e", + "b0a766": "f9fba2", + "a28e86": "c1d8db", + "b74695": "dedb64", + "f2f2f2": "e8eab5" + }, + "2": { + "5b4d37": "333e5f", + "776348": "8c9fbf", + "9e8461": "dbedec", + "c5b4aa": "39cfbc", + "f38725": "4baecd", + "37332b": "261031", + "b96c26": "4792bd", + "575244": "5e2d72", + "0f0f0f": "0f0f0f", + "777463": "8358a1", + "4d4530": "534b8c", + "b0a766": "c9dbac", + "a28e86": "52b0b0", + "b74695": "b56c3e", + "f2f2f2": "d9c951" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/954.json b/public/images/pokemon/variant/954.json new file mode 100644 index 00000000000..efdb5836805 --- /dev/null +++ b/public/images/pokemon/variant/954.json @@ -0,0 +1,34 @@ +{ + "1": { + "750082": "4b5173", + "e310fb": "e1efff", + "ab0eab": "a0a9da", + "c22461": "87ceeb", + "9a1b48": "fffd91", + "f73983": "ffbc00", + "f8f8f8": "fbf3ab", + "3f4f5c": "523223", + "5ea2c6": "7d4538", + "181818": "181818", + "6bc0dd": "b05858", + "98979d": "d9bd6f", + "c94c5a": "159464", + "6a2027": "096757" + }, + "2": { + "750082": "470d1a", + "e310fb": "9b2f17", + "ab0eab": "6b1911", + "c22461": "c85712", + "9a1b48": "ded051", + "f73983": "141031", + "f8f8f8": "432f77", + "3f4f5c": "21214c", + "5ea2c6": "616481", + "181818": "181818", + "6bc0dd": "9e9fb6", + "98979d": "221a4c", + "c94c5a": "4c92c5", + "6a2027": "215d85" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/98.json b/public/images/pokemon/variant/98.json new file mode 100644 index 00000000000..972444eae32 --- /dev/null +++ b/public/images/pokemon/variant/98.json @@ -0,0 +1,30 @@ +{ + "1": { + "de524a": "674796", + "ffa563": "c466f3", + "ff7331": "9359ca", + "843110": "3e3662", + "101010": "101010", + "5a4221": "231947", + "735210": "534681", + "ffdebd": "c3d6ff", + "dedede": "dedede", + "e6bd8c": "9ba3d9", + "b58442": "7c72b6", + "ffffff": "ffffff" + }, + "2": { + "de524a": "2678b8", + "ffa563": "5ce6f3", + "ff7331": "4abbd4", + "843110": "23457e", + "101010": "101010", + "5a4221": "040522", + "735210": "0d0e3c", + "ffdebd": "4c549a", + "dedede": "dedede", + "e6bd8c": "342b78", + "b58442": "1b1d62", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/981.json b/public/images/pokemon/variant/981.json new file mode 100644 index 00000000000..32e3fac7aa9 --- /dev/null +++ b/public/images/pokemon/variant/981.json @@ -0,0 +1,52 @@ +{ + "1": { + "242322": "2e1f1f", + "43341e": "112246", + "36383d": "503a2d", + "6f5431": "1f4062", + "9ca0ab": "665144", + "8b704c": "3d6186", + "322513": "091e34", + "0f0f0f": "0f0f0f", + "fff42f": "c29925", + "fcfcfc": "fcfcfc", + "deb43d": "dec93d", + "a8abb3": "a8abb3", + "775c10": "774f10", + "b1a75c": "7e262d", + "fdec8a": "9c3e3e", + "ed7474": "c59671", + "ce5742": "ab9d75", + "513c21": "430b0f", + "68281c": "59513a", + "6f5d35": "5b1a1f", + "a03f2e": "8a7e5e", + "f18d4e": "d8d1ad", + "f5aa77": "d4b095" + }, + "2": { + "242322": "34162a", + "43341e": "52ab5f", + "36383d": "792e51", + "6f5431": "a8e781", + "9ca0ab": "9c5978", + "8b704c": "e4efcf", + "322513": "337142", + "0f0f0f": "0f0f0f", + "fff42f": "ed9233", + "fcfcfc": "fcfcfc", + "deb43d": "ebbb72", + "a8abb3": "a8abb3", + "775c10": "b35127", + "b1a75c": "1e7884", + "fdec8a": "2a9d8f", + "ed7474": "314f7a", + "ce5742": "1a2e43", + "513c21": "1a456c", + "68281c": "0e182e", + "6f5d35": "1b5c77", + "a03f2e": "17253d", + "f18d4e": "264653", + "f5aa77": "4a7688" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/99-gigantamax.json b/public/images/pokemon/variant/99-gigantamax.json new file mode 100644 index 00000000000..ecf9643d77c --- /dev/null +++ b/public/images/pokemon/variant/99-gigantamax.json @@ -0,0 +1,36 @@ +{ + "1": { + "c56a5a": "6232a9", + "f6c58b": "9f60d5", + "832908": "3b1c69", + "ee8b4a": "8853bf", + "101010": "101010", + "735210": "534681", + "fdfdfd": "ffdbdb", + "e1d0db": "d5869b", + "ffe6b4": "c3d6ff", + "eebd8b": "9ba3d9", + "b47b5a": "7c72b6", + "b5a6b5": "b65782", + "9a859a": "872d65", + "ff6a6a": "2693ce", + "ff9191": "3bc1f2" + }, + "2": { + "c56a5a": "2d6f9e", + "f6c58b": "75e0e8", + "832908": "22447d", + "ee8b4a": "43adc4", + "101010": "101010", + "735210": "1e1743", + "fdfdfd": "b1f1cf", + "e1d0db": "73c1c2", + "ffe6b4": "464d89", + "eebd8b": "31296f", + "b47b5a": "231b4e", + "b5a6b5": "44778a", + "9a859a": "2f4c6b", + "ff6a6a": "ddac48", + "ff9191": "fff391" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/99.json b/public/images/pokemon/variant/99.json new file mode 100644 index 00000000000..d907c0f85fc --- /dev/null +++ b/public/images/pokemon/variant/99.json @@ -0,0 +1,32 @@ +{ + "1": { + "c56b5a": "534681", + "842908": "3b1c69", + "ef8c4a": "8853bf", + "f7c58c": "9f60d5", + "101010": "101010", + "4a3121": "1c1f46", + "5a4231": "2c3c61", + "b57b5a": "7c72b6", + "735210": "534681", + "dedef7": "dedef7", + "ffffff": "ffffff", + "ffe6b5": "c3d6ff", + "efbd8c": "9ba3d9" + }, + "2": { + "c56b5a": "2d6f9e", + "842908": "23457e", + "ef8c4a": "43adc4", + "f7c58c": "75e0e8", + "101010": "101010", + "4a3121": "1b1e3b", + "5a4231": "2b354e", + "b57b5a": "231d51", + "735210": "1e1743", + "dedef7": "dedef7", + "ffffff": "ffffff", + "ffe6b5": "464d89", + "efbd8c": "31296f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index f3e690395e1..938c92f5056 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -89,6 +89,16 @@ 1, 1 ], + "23": [ + 0, + 1, + 1 + ], + "24": [ + 0, + 1, + 1 + ], "29": [ 0, 1, @@ -125,12 +135,27 @@ 1 ], "41": [ - 1, + 0, 1, 1 ], "42": [ + 0, 1, + 1 + ], + "43": [ + 0, + 1, + 1 + ], + "44": [ + 0, + 1, + 1 + ], + "45": [ + 0, 1, 1 ], @@ -206,8 +231,18 @@ ], "79": [ 1, + 1, + 1 + ], + "80": [ 0, - 0 + 1, + 1 + ], + "80-mega": [ + 0, + 1, + 1 ], "81": [ 0, @@ -269,6 +304,21 @@ 1, 1 ], + "98": [ + 0, + 1, + 1 + ], + "99": [ + 0, + 1, + 1 + ], + "99-gigantamax": [ + 0, + 1, + 1 + ], "100": [ 0, 1, @@ -299,6 +349,16 @@ 1, 1 ], + "116": [ + 0, + 1, + 1 + ], + "117": [ + 0, + 1, + 1 + ], "118": [ 1, 1, @@ -309,6 +369,16 @@ 1, 1 ], + "120": [ + 0, + 1, + 1 + ], + "121": [ + 0, + 1, + 1 + ], "123": [ 1, 1, @@ -319,6 +389,11 @@ 1, 2 ], + "126": [ + 0, + 2, + 1 + ], "127-mega": [ 0, 1, @@ -364,6 +439,11 @@ 1, 1 ], + "133-partner": [ + 0, + 1, + 1 + ], "134": [ 0, 1, @@ -379,6 +459,11 @@ 1, 1 ], + "137": [ + 0, + 1, + 1 + ], "138": [ 0, 1, @@ -480,7 +565,7 @@ 2 ], "169": [ - 1, + 0, 1, 1 ], @@ -499,6 +584,16 @@ 1, 1 ], + "177": [ + 0, + 1, + 1 + ], + "178": [ + 0, + 2, + 2 + ], "179": [ 0, 1, @@ -519,6 +614,11 @@ 1, 1 ], + "182": [ + 0, + 1, + 1 + ], "183": [ 0, 1, @@ -529,6 +629,21 @@ 2, 2 ], + "185": [ + 0, + 1, + 1 + ], + "190": [ + 0, + 1, + 1 + ], + "193": [ + 0, + 1, + 1 + ], "196": [ 1, 1, @@ -541,8 +656,8 @@ ], "199": [ 2, - 0, - 0 + 1, + 1 ], "200": [ 1, @@ -689,6 +804,11 @@ 1, 1 ], + "203": [ + 0, + 1, + 1 + ], "206": [ 0, 1, @@ -709,6 +829,11 @@ 1, 1 ], + "213": [ + 0, + 1, + 1 + ], "215": [ 0, 1, @@ -754,6 +879,11 @@ 1, 1 ], + "230": [ + 0, + 1, + 1 + ], "231": [ 0, 1, @@ -764,6 +894,11 @@ 1, 1 ], + "233": [ + 0, + 1, + 1 + ], "235": [ 0, 1, @@ -774,6 +909,11 @@ 1, 2 ], + "240": [ + 0, + 1, + 1 + ], "242": [ 2, 2, @@ -829,6 +969,36 @@ 1, 1 ], + "255": [ + 0, + 1, + 1 + ], + "256": [ + 0, + 1, + 1 + ], + "257": [ + 0, + 1, + 2 + ], + "257-mega": [ + 0, + 1, + 1 + ], + "261": [ + 0, + 1, + 1 + ], + "262": [ + 0, + 1, + 1 + ], "263": [ 0, 1, @@ -847,7 +1017,7 @@ "279": [ 1, 1, - 2 + 1 ], "280": [ 0, @@ -1004,6 +1174,11 @@ 1, 1 ], + "327": [ + 0, + 1, + 1 + ], "328": [ 0, 1, @@ -1044,6 +1219,11 @@ 1, 1 ], + "337": [ + 0, + 1, + 1 + ], "338": [ 0, 1, @@ -1254,6 +1434,21 @@ 1, 1 ], + "393": [ + 0, + 1, + 1 + ], + "394": [ + 0, + 1, + 1 + ], + "395": [ + 0, + 1, + 1 + ], "399": [ 0, 1, @@ -1319,6 +1514,16 @@ 1, 1 ], + "418": [ + 0, + 1, + 1 + ], + "419": [ + 0, + 1, + 1 + ], "422-west": [ 1, 1, @@ -1339,6 +1544,11 @@ 1, 1 ], + "424": [ + 0, + 1, + 1 + ], "425": [ 0, 1, @@ -1384,11 +1594,21 @@ 1, 1 ], + "438": [ + 0, + 1, + 1 + ], "440": [ 1, 1, 2 ], + "441": [ + 0, + 1, + 1 + ], "442": [ 0, 1, @@ -1439,6 +1659,16 @@ 1, 1 ], + "456": [ + 0, + 1, + 1 + ], + "457": [ + 0, + 1, + 1 + ], "458": [ 0, 1, @@ -1461,19 +1691,29 @@ ], "465": [ 0, - 2, - 2 + 1, + 1 ], "466": [ 1, 1, 2 ], + "467": [ + 0, + 1, + 1 + ], "468": [ 1, 1, 1 ], + "469": [ + 0, + 1, + 1 + ], "470": [ 1, 1, @@ -1489,6 +1729,11 @@ 1, 1 ], + "474": [ + 0, + 1, + 1 + ], "475-mega": [ 0, 2, @@ -1504,6 +1749,36 @@ 2, 1 ], + "479-heat": [ + 0, + 1, + 1 + ], + "479-wash": [ + 0, + 1, + 1 + ], + "479-mow": [ + 0, + 1, + 1 + ], + "479-frost": [ + 0, + 1, + 1 + ], + "479": [ + 0, + 1, + 1 + ], + "479-fan": [ + 0, + 1, + 1 + ], "480": [ 1, 1, @@ -1594,6 +1869,21 @@ 1, 1 ], + "524": [ + 0, + 1, + 1 + ], + "525": [ + 0, + 1, + 1 + ], + "526": [ + 0, + 2, + 2 + ], "529": [ 0, 2, @@ -1704,6 +1994,11 @@ 1, 1 ], + "556": [ + 0, + 1, + 1 + ], "559": [ 1, 1, @@ -1721,8 +2016,8 @@ ], "563": [ 0, - 2, - 2 + 1, + 1 ], "568": [ 0, @@ -1819,6 +2114,11 @@ 1, 1 ], + "594": [ + 0, + 1, + 2 + ], "595": [ 0, 1, @@ -1884,6 +2184,11 @@ 1, 2 ], + "618": [ + 0, + 1, + 1 + ], "619": [ 0, 1, @@ -1895,15 +2200,20 @@ 1 ], "622": [ - 1, + 0, 1, 1 ], "623": [ - 2, + 0, 1, 1 ], + "631": [ + 0, + 2, + 2 + ], "632": [ 0, 1, @@ -1939,36 +2249,6 @@ 1, 1 ], - "641-incarnate": [ - 0, - 0, - 0 - ], - "641-therian": [ - 0, - 0, - 0 - ], - "642-incarnate": [ - 0, - 0, - 0 - ], - "642-therian": [ - 0, - 0, - 0 - ], - "645-incarnate": [ - 0, - 0, - 0 - ], - "645-therian": [ - 0, - 0, - 0 - ], "647-resolute": [ 0, 1, @@ -2139,6 +2419,81 @@ 1, 1 ], + "669-red": [ + 0, + 2, + 1 + ], + "669-blue": [ + 0, + 2, + 2 + ], + "669-white": [ + 0, + 1, + 1 + ], + "669-yellow": [ + 0, + 2, + 1 + ], + "669-orange": [ + 0, + 2, + 1 + ], + "670-white": [ + 0, + 2, + 2 + ], + "670-blue": [ + 0, + 2, + 2 + ], + "670-orange": [ + 0, + 2, + 2 + ], + "670-red": [ + 0, + 2, + 2 + ], + "670-yellow": [ + 0, + 2, + 2 + ], + "671-red": [ + 0, + 1, + 2 + ], + "671-blue": [ + 0, + 1, + 2 + ], + "671-yellow": [ + 0, + 1, + 2 + ], + "671-white": [ + 0, + 1, + 2 + ], + "671-orange": [ + 0, + 1, + 1 + ], "672": [ 0, 1, @@ -2149,6 +2504,21 @@ 1, 1 ], + "677": [ + 0, + 1, + 1 + ], + "678-female": [ + 0, + 1, + 1 + ], + "678": [ + 0, + 1, + 1 + ], "690": [ 0, 1, @@ -2169,11 +2539,31 @@ 1, 2 ], + "698": [ + 0, + 1, + 1 + ], + "699": [ + 0, + 1, + 1 + ], "700": [ 0, 1, 1 ], + "702": [ + 0, + 1, + 1 + ], + "703": [ + 0, + 1, + 1 + ], "704": [ 0, 1, @@ -2549,6 +2939,16 @@ 1, 1 ], + "803": [ + 0, + 1, + 1 + ], + "804": [ + 0, + 1, + 1 + ], "808": [ 0, 1, @@ -2704,6 +3104,11 @@ 1, 1 ], + "867": [ + 0, + 1, + 1 + ], "872": [ 1, 1, @@ -2734,6 +3139,26 @@ 1, 1 ], + "880": [ + 0, + 1, + 1 + ], + "881": [ + 0, + 1, + 1 + ], + "882": [ + 0, + 1, + 1 + ], + "883": [ + 0, + 1, + 1 + ], "884-gigantamax": [ 0, 1, @@ -2759,6 +3184,26 @@ 1, 1 ], + "888": [ + 0, + 1, + 1 + ], + "888-crowned": [ + 0, + 1, + 1 + ], + "889": [ + 0, + 1, + 1 + ], + "889-crowned": [ + 0, + 1, + 1 + ], "890-eternamax": [ 0, 1, @@ -2849,6 +3294,21 @@ 1, 1 ], + "912": [ + 0, + 1, + 1 + ], + "913": [ + 0, + 2, + 2 + ], + "914": [ + 0, + 2, + 1 + ], "919": [ 1, 1, @@ -2904,6 +3364,16 @@ 2, 2 ], + "940": [ + 0, + 1, + 1 + ], + "941": [ + 0, + 1, + 1 + ], "948": [ 0, 1, @@ -2924,6 +3394,16 @@ 1, 1 ], + "953": [ + 0, + 1, + 1 + ], + "954": [ + 0, + 1, + 1 + ], "957": [ 1, 2, @@ -2999,6 +3479,11 @@ 2, 2 ], + "981": [ + 0, + 1, + 1 + ], "982": [ 0, 1, @@ -3064,11 +3549,21 @@ 1, 1 ], + "1003": [ + 0, + 1, + 1 + ], "1004": [ 0, 1, 1 ], + "1006": [ + 0, + 2, + 1 + ], "1007-apex-build": [ 0, 2, @@ -3079,6 +3574,11 @@ 1, 1 ], + "1010": [ + 0, + 1, + 1 + ], "1018": [ 0, 1, @@ -3094,6 +3594,16 @@ 1, 1 ], + "2027": [ + 0, + 1, + 1 + ], + "2028": [ + 0, + 1, + 1 + ], "2052": [ 0, 1, @@ -3104,6 +3614,11 @@ 1, 1 ], + "2670": [ + 0, + 1, + 1 + ], "4052": [ 0, 1, @@ -3119,10 +3634,15 @@ 1, 1 ], + "4079": [ + 0, + 1, + 1 + ], "4080": [ 2, - 0, - 0 + 1, + 1 ], "4144": [ 0, @@ -3141,8 +3661,8 @@ ], "4199": [ 2, - 0, - 0 + 1, + 1 ], "4222": [ 0, @@ -3159,6 +3679,11 @@ 1, 1 ], + "4562": [ + 0, + 1, + 1 + ], "6100": [ 0, 1, @@ -3235,6 +3760,16 @@ 1, 1 ], + "44": [ + 0, + 1, + 1 + ], + "45": [ + 0, + 1, + 1 + ], "84": [ 1, 1, @@ -3280,6 +3815,26 @@ 1, 1 ], + "178": [ + 0, + 2, + 2 + ], + "185": [ + 0, + 1, + 1 + ], + "190": [ + 0, + 1, + 1 + ], + "203": [ + 0, + 1, + 1 + ], "207": [ 0, 1, @@ -3290,6 +3845,11 @@ 1, 1 ], + "217": [ + 1, + 1, + 1 + ], "229": [ 0, 1, @@ -3300,6 +3860,26 @@ 1, 1 ], + "255": [ + 0, + 1, + 1 + ], + "256": [ + 0, + 1, + 1 + ], + "257": [ + 0, + 1, + 1 + ], + "307": [ + 0, + 1, + 1 + ], "308": [ 0, 1, @@ -3340,6 +3920,21 @@ 1, 1 ], + "418": [ + 0, + 1, + 1 + ], + "419": [ + 0, + 2, + 1 + ], + "424": [ + 0, + 1, + 1 + ], "443": [ 1, 1, @@ -3365,6 +3960,16 @@ 1, 1 ], + "456": [ + 0, + 1, + 1 + ], + "457": [ + 0, + 1, + 1 + ], "461": [ 0, 1, @@ -3375,6 +3980,11 @@ 1, 1 ], + "465": [ + 0, + 1, + 1 + ], "592": [ 1, 1, @@ -3384,6 +3994,11 @@ 1, 1, 1 + ], + "6215": [ + 0, + 1, + 1 ] }, "back": { @@ -3477,6 +4092,16 @@ 1, 1 ], + "23": [ + 0, + 1, + 1 + ], + "24": [ + 0, + 1, + 1 + ], "29": [ 0, 1, @@ -3513,12 +4138,27 @@ 1 ], "41": [ - 1, + 0, 1, 1 ], "42": [ + 0, 1, + 1 + ], + "43": [ + 0, + 1, + 1 + ], + "44": [ + 0, + 1, + 1 + ], + "45": [ + 0, 1, 1 ], @@ -3594,8 +4234,18 @@ ], "79": [ 1, + 1, + 1 + ], + "80": [ 0, - 0 + 1, + 1 + ], + "80-mega": [ + 0, + 1, + 1 ], "81": [ 0, @@ -3657,6 +4307,21 @@ 1, 1 ], + "98": [ + 0, + 1, + 1 + ], + "99": [ + 0, + 1, + 1 + ], + "99-gigantamax": [ + 0, + 1, + 1 + ], "100": [ 0, 1, @@ -3687,6 +4352,16 @@ 1, 1 ], + "116": [ + 0, + 1, + 1 + ], + "117": [ + 0, + 1, + 1 + ], "118": [ 1, 1, @@ -3697,6 +4372,16 @@ 1, 1 ], + "120": [ + 0, + 1, + 1 + ], + "121": [ + 0, + 1, + 1 + ], "123": [ 1, 1, @@ -3707,6 +4392,11 @@ 1, 2 ], + "126": [ + 0, + 2, + 1 + ], "127-mega": [ 0, 1, @@ -3752,6 +4442,11 @@ 1, 1 ], + "133-partner": [ + 0, + 1, + 1 + ], "134": [ 0, 1, @@ -3767,6 +4462,11 @@ 1, 1 ], + "137": [ + 0, + 1, + 1 + ], "138": [ 0, 1, @@ -3835,7 +4535,7 @@ "150-mega-y": [ 0, 1, - 0 + 1 ], "150": [ 0, @@ -3868,7 +4568,7 @@ 1 ], "169": [ - 1, + 0, 1, 1 ], @@ -3887,6 +4587,16 @@ 1, 1 ], + "177": [ + 0, + 1, + 1 + ], + "178": [ + 0, + 2, + 2 + ], "179": [ 0, 1, @@ -3907,6 +4617,11 @@ 1, 1 ], + "182": [ + 0, + 1, + 1 + ], "183": [ 0, 1, @@ -3917,6 +4632,21 @@ 1, 1 ], + "185": [ + 0, + 1, + 1 + ], + "190": [ + 0, + 1, + 1 + ], + "193": [ + 0, + 1, + 1 + ], "196": [ 1, 1, @@ -3929,8 +4659,8 @@ ], "199": [ 2, - 0, - 0 + 1, + 1 ], "200": [ 1, @@ -4077,6 +4807,11 @@ 1, 1 ], + "203": [ + 0, + 1, + 1 + ], "206": [ 0, 1, @@ -4097,6 +4832,11 @@ 1, 1 ], + "213": [ + 0, + 1, + 1 + ], "215": [ 0, 1, @@ -4142,6 +4882,11 @@ 1, 1 ], + "230": [ + 0, + 1, + 1 + ], "231": [ 0, 1, @@ -4152,6 +4897,11 @@ 1, 1 ], + "233": [ + 0, + 1, + 1 + ], "235": [ 0, 1, @@ -4162,6 +4912,11 @@ 1, 2 ], + "240": [ + 0, + 1, + 1 + ], "242": [ 1, 1, @@ -4217,6 +4972,36 @@ 1, 1 ], + "255": [ + 0, + 1, + 1 + ], + "256": [ + 0, + 1, + 1 + ], + "257": [ + 0, + 1, + 1 + ], + "257-mega": [ + 0, + 1, + 1 + ], + "261": [ + 0, + 1, + 1 + ], + "262": [ + 0, + 1, + 1 + ], "263": [ 0, 1, @@ -4392,6 +5177,11 @@ 1, 1 ], + "327": [ + 0, + 1, + 1 + ], "328": [ 0, 1, @@ -4432,6 +5222,11 @@ 1, 1 ], + "337": [ + 0, + 1, + 1 + ], "338": [ 0, 1, @@ -4642,6 +5437,21 @@ 1, 1 ], + "393": [ + 0, + 1, + 1 + ], + "394": [ + 0, + 1, + 1 + ], + "395": [ + 0, + 1, + 1 + ], "399": [ 0, 2, @@ -4707,6 +5517,16 @@ 1, 1 ], + "418": [ + 0, + 1, + 1 + ], + "419": [ + 0, + 1, + 1 + ], "422-west": [ 1, 1, @@ -4727,6 +5547,11 @@ 1, 1 ], + "424": [ + 0, + 1, + 1 + ], "425": [ 0, 1, @@ -4772,11 +5597,21 @@ 1, 1 ], + "438": [ + 0, + 1, + 1 + ], "440": [ 1, 1, 1 ], + "441": [ + 0, + 1, + 2 + ], "442": [ 0, 1, @@ -4827,6 +5662,16 @@ 1, 1 ], + "456": [ + 0, + 1, + 1 + ], + "457": [ + 0, + 2, + 1 + ], "458": [ 0, 2, @@ -4850,18 +5695,28 @@ "465": [ 0, 1, - 2 + 1 ], "466": [ 2, 1, 1 ], + "467": [ + 0, + 1, + 1 + ], "468": [ 1, 1, 1 ], + "469": [ + 0, + 1, + 1 + ], "470": [ 2, 2, @@ -4875,7 +5730,12 @@ "472": [ 0, 1, - 2 + 1 + ], + "474": [ + 0, + 1, + 1 ], "475-mega": [ 0, @@ -4892,6 +5752,36 @@ 2, 1 ], + "479-heat": [ + 0, + 1, + 1 + ], + "479-wash": [ + 0, + 1, + 1 + ], + "479-mow": [ + 0, + 1, + 1 + ], + "479-frost": [ + 0, + 1, + 1 + ], + "479": [ + 0, + 1, + 1 + ], + "479-fan": [ + 0, + 1, + 1 + ], "480": [ 1, 1, @@ -4982,6 +5872,21 @@ 1, 1 ], + "524": [ + 0, + 1, + 1 + ], + "525": [ + 0, + 1, + 1 + ], + "526": [ + 0, + 1, + 1 + ], "529": [ 0, 2, @@ -5092,6 +5997,11 @@ 1, 1 ], + "556": [ + 0, + 1, + 1 + ], "559": [ 1, 1, @@ -5207,6 +6117,11 @@ 1, 1 ], + "594": [ + 0, + 1, + 2 + ], "595": [ 0, 1, @@ -5272,6 +6187,11 @@ 1, 1 ], + "618": [ + 0, + 2, + 2 + ], "619": [ 0, 1, @@ -5283,15 +6203,20 @@ 1 ], "622": [ - 1, + 0, 1, 1 ], "623": [ - 2, + 0, 1, 1 ], + "631": [ + 0, + 2, + 2 + ], "632": [ 0, 1, @@ -5527,6 +6452,106 @@ 1, 1 ], + "669-red": [ + 0, + 1, + 1 + ], + "669-blue": [ + 0, + 1, + 1 + ], + "669-white": [ + 0, + 1, + 1 + ], + "669-yellow": [ + 0, + 1, + 1 + ], + "669-orange": [ + 0, + 1, + 1 + ], + "670-white": [ + 0, + 1, + 1 + ], + "670-blue": [ + 0, + 1, + 1 + ], + "670-orange": [ + 0, + 1, + 1 + ], + "670-red": [ + 0, + 1, + 1 + ], + "670-yellow": [ + 0, + 1, + 1 + ], + "671-red": [ + 0, + 1, + 1 + ], + "671-blue": [ + 0, + 1, + 1 + ], + "671-yellow": [ + 0, + 1, + 1 + ], + "671-white": [ + 0, + 1, + 1 + ], + "671-orange": [ + 0, + 1, + 1 + ], + "672": [ + 0, + 1, + 1 + ], + "673": [ + 0, + 1, + 1 + ], + "677": [ + 0, + 1, + 1 + ], + "678-female": [ + 0, + 1, + 1 + ], + "678": [ + 0, + 1, + 1 + ], "690": [ 0, 1, @@ -5547,11 +6572,31 @@ 1, 2 ], + "698": [ + 0, + 1, + 1 + ], + "699": [ + 0, + 1, + 1 + ], "700": [ 0, 1, 1 ], + "702": [ + 0, + 1, + 1 + ], + "703": [ + 0, + 1, + 1 + ], "704": [ 0, 1, @@ -5927,6 +6972,16 @@ 1, 1 ], + "803": [ + 0, + 1, + 1 + ], + "804": [ + 0, + 1, + 1 + ], "808": [ 0, 1, @@ -6082,6 +7137,11 @@ 1, 1 ], + "867": [ + 0, + 1, + 1 + ], "872": [ 1, 1, @@ -6112,6 +7172,26 @@ 1, 1 ], + "880": [ + 0, + 1, + 1 + ], + "881": [ + 0, + 2, + 2 + ], + "882": [ + 0, + 1, + 1 + ], + "883": [ + 0, + 1, + 1 + ], "884-gigantamax": [ 0, 1, @@ -6137,6 +7217,26 @@ 1, 1 ], + "888": [ + 0, + 1, + 1 + ], + "888-crowned": [ + 0, + 1, + 1 + ], + "889": [ + 0, + 1, + 1 + ], + "889-crowned": [ + 0, + 1, + 1 + ], "890-eternamax": [ 0, 1, @@ -6227,6 +7327,21 @@ 1, 1 ], + "912": [ + 0, + 1, + 1 + ], + "913": [ + 0, + 1, + 1 + ], + "914": [ + 0, + 1, + 1 + ], "919": [ 1, 1, @@ -6282,6 +7397,16 @@ 1, 1 ], + "940": [ + 0, + 1, + 1 + ], + "941": [ + 0, + 1, + 1 + ], "948": [ 0, 1, @@ -6302,6 +7427,16 @@ 1, 1 ], + "953": [ + 0, + 1, + 1 + ], + "954": [ + 0, + 1, + 1 + ], "957": [ 1, 1, @@ -6377,6 +7512,11 @@ 1, 1 ], + "981": [ + 0, + 1, + 1 + ], "982": [ 0, 1, @@ -6442,11 +7582,21 @@ 1, 1 ], + "1003": [ + 0, + 1, + 1 + ], "1004": [ 0, 1, 1 ], + "1006": [ + 0, + 2, + 1 + ], "1007-apex-build": [ 0, 2, @@ -6457,6 +7607,11 @@ 1, 1 ], + "1010": [ + 0, + 1, + 1 + ], "1018": [ 0, 1, @@ -6472,6 +7627,16 @@ 1, 1 ], + "2027": [ + 0, + 1, + 1 + ], + "2028": [ + 0, + 1, + 1 + ], "2052": [ 0, 1, @@ -6482,6 +7647,11 @@ 1, 1 ], + "2670": [ + 0, + 1, + 1 + ], "4052": [ 0, 1, @@ -6497,10 +7667,15 @@ 1, 1 ], + "4079": [ + 0, + 1, + 1 + ], "4080": [ 2, - 0, - 0 + 1, + 1 ], "4144": [ 0, @@ -6519,8 +7694,8 @@ ], "4199": [ 2, - 0, - 0 + 1, + 1 ], "4222": [ 0, @@ -6537,6 +7712,11 @@ 1, 1 ], + "4562": [ + 0, + 1, + 1 + ], "6100": [ 0, 1, @@ -6613,6 +7793,16 @@ 1, 1 ], + "44": [ + 0, + 1, + 1 + ], + "45": [ + 0, + 1, + 1 + ], "84": [ 1, 1, @@ -6658,6 +7848,26 @@ 1, 1 ], + "178": [ + 0, + 2, + 2 + ], + "185": [ + 0, + 1, + 1 + ], + "190": [ + 0, + 1, + 1 + ], + "203": [ + 0, + 1, + 1 + ], "207": [ 0, 1, @@ -6668,6 +7878,11 @@ 1, 1 ], + "217": [ + 1, + 1, + 1 + ], "229": [ 0, 1, @@ -6678,6 +7893,26 @@ 1, 1 ], + "255": [ + 0, + 1, + 1 + ], + "256": [ + 0, + 1, + 1 + ], + "257": [ + 0, + 1, + 1 + ], + "307": [ + 0, + 1, + 1 + ], "308": [ 0, 1, @@ -6718,6 +7953,21 @@ 1, 1 ], + "418": [ + 0, + 2, + 2 + ], + "419": [ + 0, + 1, + 1 + ], + "424": [ + 0, + 1, + 1 + ], "443": [ 1, 1, @@ -6743,6 +7993,16 @@ 1, 1 ], + "456": [ + 0, + 1, + 1 + ], + "457": [ + 0, + 1, + 1 + ], "461": [ 0, 1, @@ -6753,6 +8013,11 @@ 1, 1 ], + "465": [ + 0, + 1, + 1 + ], "592": [ 1, 1, @@ -6762,6 +8027,11 @@ 1, 1, 1 + ], + "6215": [ + 0, + 1, + 1 ] } }, @@ -6781,6 +8051,11 @@ 2, 2 ], + "80-mega": [ + 0, + 1, + 1 + ], "94-mega": [ 2, 2, @@ -6831,6 +8106,11 @@ 1, 1 ], + "257-mega": [ + 0, + 1, + 1 + ], "282-mega": [ 0, 2, @@ -7061,6 +8341,81 @@ 1, 1 ], + "669-red": [ + 0, + 2, + 2 + ], + "669-blue": [ + 0, + 1, + 1 + ], + "669-white": [ + 0, + 1, + 1 + ], + "669-yellow": [ + 0, + 1, + 1 + ], + "669-orange": [ + 0, + 2, + 2 + ], + "670-white": [ + 0, + 1, + 1 + ], + "670-blue": [ + 0, + 1, + 1 + ], + "670-orange": [ + 0, + 1, + 1 + ], + "670-red": [ + 0, + 1, + 1 + ], + "670-yellow": [ + 0, + 1, + 1 + ], + "671-red": [ + 0, + 1, + 2 + ], + "671-blue": [ + 0, + 1, + 2 + ], + "671-yellow": [ + 0, + 1, + 1 + ], + "671-white": [ + 0, + 1, + 2 + ], + "671-orange": [ + 0, + 1, + 2 + ], "672": [ 0, 1, @@ -7071,6 +8426,21 @@ 1, 1 ], + "677": [ + 0, + 1, + 1 + ], + "678-female": [ + 0, + 1, + 1 + ], + "678": [ + 0, + 1, + 1 + ], "690": [ 0, 1, @@ -7091,11 +8461,31 @@ 1, 2 ], + "698": [ + 0, + 1, + 1 + ], + "699": [ + 0, + 1, + 1 + ], "700": [ 0, 1, 1 ], + "702": [ + 0, + 1, + 1 + ], + "703": [ + 0, + 1, + 1 + ], "704": [ 0, 1, @@ -7466,6 +8856,16 @@ 1, 1 ], + "803": [ + 0, + 1, + 1 + ], + "804": [ + 0, + 1, + 1 + ], "808": [ 0, 1, @@ -7591,6 +8991,11 @@ 1, 1 ], + "867": [ + 0, + 1, + 1 + ], "872": [ 1, 1, @@ -7621,6 +9026,26 @@ 1, 1 ], + "880": [ + 0, + 1, + 1 + ], + "881": [ + 0, + 1, + 1 + ], + "882": [ + 0, + 2, + 1 + ], + "883": [ + 0, + 1, + 1 + ], "884": [ 0, 1, @@ -7641,6 +9066,26 @@ 1, 1 ], + "888": [ + 0, + 1, + 1 + ], + "888-crowned": [ + 0, + 1, + 1 + ], + "889": [ + 0, + 1, + 1 + ], + "889-crowned": [ + 0, + 1, + 1 + ], "890": [ 0, 2, @@ -7721,6 +9166,21 @@ 2, 2 ], + "912": [ + 0, + 1, + 2 + ], + "913": [ + 0, + 1, + 2 + ], + "914": [ + 0, + 2, + 1 + ], "919": [ 1, 1, @@ -7776,6 +9236,16 @@ 2, 2 ], + "940": [ + 0, + 1, + 1 + ], + "941": [ + 0, + 1, + 1 + ], "948": [ 0, 1, @@ -7796,6 +9266,16 @@ 1, 1 ], + "953": [ + 0, + 1, + 1 + ], + "954": [ + 0, + 1, + 1 + ], "957": [ 2, 2, @@ -7833,8 +9313,8 @@ ], "970": [ 0, - 2, - 2 + 1, + 1 ], "973": [ 1, @@ -7871,6 +9351,11 @@ 2, 2 ], + "981": [ + 0, + 1, + 1 + ], "982": [ 0, 1, @@ -7936,11 +9421,21 @@ 1, 1 ], + "1003": [ + 0, + 1, + 1 + ], "1004": [ 0, 1, 1 ], + "1006": [ + 0, + 2, + 1 + ], "1007-apex-build": [ 0, 2, @@ -7951,6 +9446,16 @@ 1, 1 ], + "2027": [ + 0, + 1, + 1 + ], + "2028": [ + 0, + 1, + 1 + ], "2052": [ 0, 1, @@ -7976,10 +9481,15 @@ 1, 1 ], + "4079": [ + 0, + 1, + 1 + ], "4080": [ 2, - 0, - 0 + 1, + 1 ], "4144": [ 0, @@ -7998,8 +9508,8 @@ ], "4199": [ 2, - 0, - 0 + 1, + 1 ], "4222": [ 0, @@ -8016,6 +9526,11 @@ 1, 1 ], + "4562": [ + 0, + 1, + 1 + ], "6100": [ 0, 1, @@ -8073,6 +9588,11 @@ 1, 2 ], + "80-mega": [ + 0, + 1, + 1 + ], "94-mega": [ 1, 1, @@ -8123,6 +9643,11 @@ 2, 1 ], + "257-mega": [ + 0, + 1, + 1 + ], "282-mega": [ 0, 1, @@ -8353,14 +9878,104 @@ 2, 2 ], - "672": [ + "669-red": [ 0, 2, + 2 + ], + "669-blue": [ + 0, + 2, + 2 + ], + "669-white": [ + 0, + 2, + 2 + ], + "669-yellow": [ + 0, + 2, + 2 + ], + "669-orange": [ + 0, + 2, + 2 + ], + "670-white": [ + 0, + 1, + 1 + ], + "670-blue": [ + 0, + 2, + 2 + ], + "670-orange": [ + 0, + 1, + 1 + ], + "670-red": [ + 0, + 1, + 1 + ], + "670-yellow": [ + 0, + 1, + 1 + ], + "671-red": [ + 0, + 1, + 1 + ], + "671-blue": [ + 0, + 1, + 1 + ], + "671-yellow": [ + 0, + 1, + 1 + ], + "671-white": [ + 0, + 1, + 1 + ], + "671-orange": [ + 0, + 1, + 1 + ], + "672": [ + 0, + 1, 1 ], "673": [ 0, - 2, + 1, + 1 + ], + "677": [ + 0, + 1, + 1 + ], + "678-female": [ + 0, + 1, + 1 + ], + "678": [ + 0, + 1, 1 ], "690": [ @@ -8383,11 +9998,31 @@ 1, 2 ], + "698": [ + 0, + 1, + 1 + ], + "699": [ + 0, + 2, + 2 + ], "700": [ 0, 1, 1 ], + "702": [ + 0, + 1, + 1 + ], + "703": [ + 0, + 1, + 1 + ], "704": [ 0, 1, @@ -8753,6 +10388,16 @@ 1, 1 ], + "803": [ + 0, + 1, + 1 + ], + "804": [ + 0, + 1, + 1 + ], "808": [ 0, 1, @@ -8878,6 +10523,11 @@ 1, 1 ], + "867": [ + 0, + 1, + 1 + ], "872": [ 1, 1, @@ -8908,6 +10558,26 @@ 1, 1 ], + "880": [ + 0, + 1, + 1 + ], + "881": [ + 0, + 1, + 1 + ], + "882": [ + 0, + 1, + 1 + ], + "883": [ + 0, + 1, + 1 + ], "884": [ 0, 1, @@ -8928,6 +10598,26 @@ 1, 1 ], + "888": [ + 0, + 1, + 1 + ], + "888-crowned": [ + 0, + 1, + 1 + ], + "889": [ + 0, + 1, + 1 + ], + "889-crowned": [ + 0, + 1, + 1 + ], "890": [ 0, 1, @@ -9003,6 +10693,21 @@ 1, 1 ], + "912": [ + 0, + 1, + 1 + ], + "913": [ + 0, + 1, + 1 + ], + "914": [ + 0, + 2, + 2 + ], "919": [ 1, 1, @@ -9058,6 +10763,16 @@ 2, 2 ], + "940": [ + 0, + 1, + 1 + ], + "941": [ + 0, + 1, + 1 + ], "948": [ 0, 1, @@ -9078,6 +10793,16 @@ 2, 1 ], + "953": [ + 0, + 1, + 1 + ], + "954": [ + 0, + 1, + 1 + ], "957": [ 1, 1, @@ -9096,7 +10821,7 @@ "962": [ 1, 1, - 2 + 1 ], "967": [ 0, @@ -9153,6 +10878,11 @@ 1, 1 ], + "981": [ + 0, + 1, + 1 + ], "982": [ 0, 1, @@ -9218,11 +10948,21 @@ 1, 1 ], + "1003": [ + 0, + 1, + 1 + ], "1004": [ 0, 1, 1 ], + "1006": [ + 0, + 2, + 2 + ], "1007-apex-build": [ 0, 2, @@ -9233,6 +10973,16 @@ 1, 1 ], + "2027": [ + 0, + 1, + 1 + ], + "2028": [ + 0, + 1, + 1 + ], "2052": [ 0, 1, @@ -9258,10 +11008,15 @@ 1, 1 ], + "4079": [ + 0, + 1, + 1 + ], "4080": [ 2, - 0, - 0 + 2, + 2 ], "4144": [ 0, @@ -9280,8 +11035,8 @@ ], "4199": [ 2, - 0, - 0 + 1, + 1 ], "4222": [ 0, @@ -9298,6 +11053,11 @@ 1, 1 ], + "4562": [ + 0, + 1, + 1 + ], "6100": [ 0, 1, diff --git a/public/images/pokemon/variant/back/1003.json b/public/images/pokemon/variant/back/1003.json new file mode 100644 index 00000000000..a7216e678f1 --- /dev/null +++ b/public/images/pokemon/variant/back/1003.json @@ -0,0 +1,32 @@ +{ + "1": { + "283331": "96562e", + "a6b4a7": "e7cb7e", + "73958b": "daa666", + "486863": "be8550", + "0f0f0f": "0f0f0f", + "5e4622": "352831", + "5c3127": "861d0f", + "8c6140": "ff7d59", + "7e4742": "c64732", + "381e1d": "4d0400", + "957560": "9c8e99", + "af9586": "beafb5", + "7a6436": "514758" + }, + "2": { + "283331": "472d7c", + "a6b4a7": "cfa0f3", + "73958b": "8d6acc", + "486863": "6c4aac", + "0f0f0f": "0f0f0f", + "5e4622": "434377", + "5c3127": "313246", + "8c6140": "767a7e", + "7e4742": "585869", + "381e1d": "1a1a31", + "957560": "b0a39f", + "af9586": "d6d8d6", + "7a6436": "8183b3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/1006.json b/public/images/pokemon/variant/back/1006.json new file mode 100644 index 00000000000..c03a810dcec --- /dev/null +++ b/public/images/pokemon/variant/back/1006.json @@ -0,0 +1,20 @@ +{ + "2": { + "293549": "2a224e", + "6db1b5": "585995", + "4a8484": "3e2d63", + "f8f8f8": "f8f8f8", + "030303": "030303", + "214c1f": "483d5c", + "59b56a": "c2c8dc", + "3f845a": "79728e", + "8bcb97": "f5edf8", + "af1a60": "2ac6a5", + "b0accf": "27678e", + "ff5098": "a5ffd4", + "fcfcfc": "36a5aa", + "81899c": "81899c", + "eeb1dd": "fbfffc", + "585f6a": "2a224e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/1006_2.json b/public/images/pokemon/variant/back/1006_2.json new file mode 100644 index 00000000000..1d602ff023f --- /dev/null +++ b/public/images/pokemon/variant/back/1006_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "1006_2.png", + "format": "RGBA8888", + "size": { + "w": 81, + "h": 81 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 60, + "h": 81 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:8aa0fd119a1faa329076550b8b0b3e21:eb0b9b5444810c5f4ed6568b504ca493:ec396d31079bf59c1cfe027eb7d25f86$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/1006_2.png b/public/images/pokemon/variant/back/1006_2.png new file mode 100644 index 00000000000..d9e3df3a6de Binary files /dev/null and b/public/images/pokemon/variant/back/1006_2.png differ diff --git a/public/images/pokemon/variant/back/1010.json b/public/images/pokemon/variant/back/1010.json new file mode 100644 index 00000000000..bc8248c6576 --- /dev/null +++ b/public/images/pokemon/variant/back/1010.json @@ -0,0 +1,32 @@ +{ + "1": { + "0b0b0b": "0b0b0b", + "1e5238": "63193a", + "39804b": "943a5a", + "69b95b": "d6637b", + "aedf87": "ef8ca5", + "c51333": "4a6329", + "8a8d85": "858d8c", + "61635b": "5b6263", + "343631": "313436", + "c0c1be": "bec1c0", + "ff5f7c": "638c10", + "ffb2c0": "9cce52", + "1d1d1c": "1d1d1c" + }, + "2": { + "0b0b0b": "0b0b0b", + "1e5238": "834b04", + "39804b": "a4790a", + "69b95b": "bba010", + "aedf87": "e3d520", + "c51333": "9131a3", + "8a8d85": "cacac6", + "61635b": "a1a19b", + "343631": "54544c", + "c0c1be": "eeeeee", + "ff5f7c": "e565fd", + "ffb2c0": "eeeeee", + "1d1d1c": "1d1d1c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/116.json b/public/images/pokemon/variant/back/116.json new file mode 100644 index 00000000000..f19c6b2b98e --- /dev/null +++ b/public/images/pokemon/variant/back/116.json @@ -0,0 +1,28 @@ +{ + "1": { + "3a5263": "1f4f3e", + "a5c5ef": "5bab65", + "6b94b5": "3d7b4f", + "101010": "101010", + "ffffff": "ffffff", + "c52929": "34b9af", + "d6d6d6": "d6d6d6", + "bddeff": "7ed683", + "9c844a": "548133", + "dec54a": "91bf49", + "ffffad": "f3f36c" + }, + "2": { + "3a5263": "cf7d3a", + "a5c5ef": "ffe675", + "6b94b5": "edb766", + "101010": "101010", + "ffffff": "ffffff", + "c52929": "9973c7", + "d6d6d6": "d6d6d6", + "bddeff": "fffaa1", + "9c844a": "314e5e", + "dec54a": "4e878a", + "ffffad": "7bc9bb" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/117.json b/public/images/pokemon/variant/back/117.json new file mode 100644 index 00000000000..ff7bebd575a --- /dev/null +++ b/public/images/pokemon/variant/back/117.json @@ -0,0 +1,28 @@ +{ + "1": { + "7b6321": "3f8a49", + "101010": "101010", + "ffffad": "b5e37f", + "dec552": "87c563", + "4a6b84": "143c4f", + "21425a": "122647", + "a5cee6": "45b38f", + "84adce": "2e8b7b", + "6b849c": "185461", + "ffffff": "ffffff", + "9c9c9c": "9c9c9c" + }, + "2": { + "7b6321": "4e878a", + "101010": "101010", + "ffffad": "b3f2d8", + "dec552": "7bc9bb", + "4a6b84": "c74c4c", + "21425a": "702525", + "a5cee6": "ffd166", + "84adce": "ffab66", + "6b849c": "f2705c", + "ffffff": "ffffff", + "9c9c9c": "9c9c9c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/120.json b/public/images/pokemon/variant/back/120.json new file mode 100644 index 00000000000..3b40ba1cfd8 --- /dev/null +++ b/public/images/pokemon/variant/back/120.json @@ -0,0 +1,26 @@ +{ + "1": { + "633131": "07293b", + "000000": "000000", + "9c6b3a": "1b7272", + "deb563": "4bd09b", + "7b523a": "0f4c58", + "d69c52": "2d9683", + "efde31": "ee9494", + "5a4231": "631c26", + "ce9429": "de6262", + "846b42": "8c383d" + }, + "2": { + "633131": "1d5198", + "000000": "000000", + "9c6b3a": "3eb7e5", + "deb563": "9cffff", + "7b523a": "2c81bc", + "d69c52": "74e7f7", + "efde31": "d6e8ff", + "5a4231": "4e5293", + "ce9429": "acc2e8", + "846b42": "8291cb" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/121.json b/public/images/pokemon/variant/back/121.json new file mode 100644 index 00000000000..7679498bfa0 --- /dev/null +++ b/public/images/pokemon/variant/back/121.json @@ -0,0 +1,18 @@ +{ + "1": { + "5a529c": "8b4a52", + "313a73": "631c26", + "d6adef": "ffc5b4", + "8c73bd": "de6262", + "b58cd6": "ee9494", + "000000": "000000" + }, + "2": { + "5a529c": "9eb4ff", + "313a73": "597cdb", + "d6adef": "ffffff", + "8c73bd": "c5d5ff", + "b58cd6": "d6e8ff", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/126.json b/public/images/pokemon/variant/back/126.json new file mode 100644 index 00000000000..c636ff760ad --- /dev/null +++ b/public/images/pokemon/variant/back/126.json @@ -0,0 +1,21 @@ +{ + "2": { + "c57b10": "9ec9cf", + "ffef4a": "eaffff", + "7b5231": "699296", + "e6bd31": "c6edf2", + "636363": "636363", + "ffffff": "ffffff", + "ff4a31": "5398cf", + "ce1042": "4065b0", + "6b2121": "303d58", + "c5c5c5": "c5c5c5", + "000000": "000000", + "ff8c63": "81c9e6", + "ee442d": "5398cf", + "ffcebd": "cabac8", + "d02a22": "4065b0", + "ca7671": "b2a0b1", + "905962": "4065b0" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/126_2.json b/public/images/pokemon/variant/back/126_2.json new file mode 100644 index 00000000000..57207480b17 --- /dev/null +++ b/public/images/pokemon/variant/back/126_2.json @@ -0,0 +1,1406 @@ +{ + "textures": [ + { + "image": "126_2.png", + "format": "RGBA8888", + "size": { + "w": 260, + "h": 260 + }, + "scale": 1, + "frames": [ + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 67, + "h": 58 + }, + "frame": { + "x": 67, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 67, + "h": 58 + }, + "frame": { + "x": 67, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 67, + "h": 56 + }, + "frame": { + "x": 134, + "y": 0, + "w": 67, + "h": 56 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 67, + "h": 56 + }, + "frame": { + "x": 134, + "y": 0, + "w": 67, + "h": 56 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 59, + "h": 57 + }, + "frame": { + "x": 201, + "y": 0, + "w": 59, + "h": 57 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 59, + "h": 57 + }, + "frame": { + "x": 201, + "y": 0, + "w": 59, + "h": 57 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 59, + "h": 57 + }, + "frame": { + "x": 201, + "y": 0, + "w": 59, + "h": 57 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 59, + "h": 57 + }, + "frame": { + "x": 201, + "y": 0, + "w": 59, + "h": 57 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 59, + "h": 57 + }, + "frame": { + "x": 201, + "y": 0, + "w": 59, + "h": 57 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 59, + "h": 57 + }, + "frame": { + "x": 201, + "y": 0, + "w": 59, + "h": 57 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 59 + }, + "frame": { + "x": 134, + "y": 56, + "w": 63, + "h": 59 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 59 + }, + "frame": { + "x": 134, + "y": 56, + "w": 63, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 59 + }, + "frame": { + "x": 134, + "y": 56, + "w": 63, + "h": 59 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 59 + }, + "frame": { + "x": 134, + "y": 56, + "w": 63, + "h": 59 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 59 + }, + "frame": { + "x": 134, + "y": 56, + "w": 63, + "h": 59 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 59 + }, + "frame": { + "x": 134, + "y": 56, + "w": 63, + "h": 59 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 59 + }, + "frame": { + "x": 134, + "y": 56, + "w": 63, + "h": 59 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 63, + "h": 59 + }, + "frame": { + "x": 134, + "y": 56, + "w": 63, + "h": 59 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 62, + "h": 59 + }, + "frame": { + "x": 197, + "y": 57, + "w": 62, + "h": 59 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 62, + "h": 59 + }, + "frame": { + "x": 197, + "y": 57, + "w": 62, + "h": 59 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 62, + "h": 59 + }, + "frame": { + "x": 197, + "y": 57, + "w": 62, + "h": 59 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 62, + "h": 59 + }, + "frame": { + "x": 197, + "y": 57, + "w": 62, + "h": 59 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 62, + "h": 59 + }, + "frame": { + "x": 197, + "y": 57, + "w": 62, + "h": 59 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 62, + "h": 59 + }, + "frame": { + "x": 197, + "y": 57, + "w": 62, + "h": 59 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 69, + "h": 54 + }, + "frame": { + "x": 0, + "y": 58, + "w": 69, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 69, + "h": 54 + }, + "frame": { + "x": 0, + "y": 58, + "w": 69, + "h": 54 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 61, + "h": 59 + }, + "frame": { + "x": 69, + "y": 58, + "w": 61, + "h": 59 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 61, + "h": 59 + }, + "frame": { + "x": 69, + "y": 58, + "w": 61, + "h": 59 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 61, + "h": 59 + }, + "frame": { + "x": 69, + "y": 58, + "w": 61, + "h": 59 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 61, + "h": 59 + }, + "frame": { + "x": 69, + "y": 58, + "w": 61, + "h": 59 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 61, + "h": 59 + }, + "frame": { + "x": 69, + "y": 58, + "w": 61, + "h": 59 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 61, + "h": 59 + }, + "frame": { + "x": 69, + "y": 58, + "w": 61, + "h": 59 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 66, + "h": 56 + }, + "frame": { + "x": 130, + "y": 115, + "w": 66, + "h": 56 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 66, + "h": 56 + }, + "frame": { + "x": 130, + "y": 115, + "w": 66, + "h": 56 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 57 + }, + "frame": { + "x": 196, + "y": 116, + "w": 62, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 57 + }, + "frame": { + "x": 196, + "y": 116, + "w": 62, + "h": 57 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 57 + }, + "frame": { + "x": 196, + "y": 116, + "w": 62, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 57 + }, + "frame": { + "x": 196, + "y": 116, + "w": 62, + "h": 57 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 57 + }, + "frame": { + "x": 196, + "y": 116, + "w": 62, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 57 + }, + "frame": { + "x": 196, + "y": 116, + "w": 62, + "h": 57 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 68, + "h": 54 + }, + "frame": { + "x": 0, + "y": 112, + "w": 68, + "h": 54 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 68, + "h": 54 + }, + "frame": { + "x": 0, + "y": 112, + "w": 68, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 61, + "h": 57 + }, + "frame": { + "x": 68, + "y": 117, + "w": 61, + "h": 57 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 61, + "h": 57 + }, + "frame": { + "x": 68, + "y": 117, + "w": 61, + "h": 57 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 61, + "h": 57 + }, + "frame": { + "x": 68, + "y": 117, + "w": 61, + "h": 57 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 61, + "h": 57 + }, + "frame": { + "x": 68, + "y": 117, + "w": 61, + "h": 57 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 61, + "h": 57 + }, + "frame": { + "x": 68, + "y": 117, + "w": 61, + "h": 57 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 61, + "h": 57 + }, + "frame": { + "x": 68, + "y": 117, + "w": 61, + "h": 57 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 67, + "h": 52 + }, + "frame": { + "x": 129, + "y": 171, + "w": 67, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 67, + "h": 52 + }, + "frame": { + "x": 129, + "y": 171, + "w": 67, + "h": 52 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 60, + "h": 57 + }, + "frame": { + "x": 196, + "y": 173, + "w": 60, + "h": 57 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 60, + "h": 57 + }, + "frame": { + "x": 196, + "y": 173, + "w": 60, + "h": 57 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 60, + "h": 57 + }, + "frame": { + "x": 196, + "y": 173, + "w": 60, + "h": 57 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 60, + "h": 57 + }, + "frame": { + "x": 196, + "y": 173, + "w": 60, + "h": 57 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 60, + "h": 57 + }, + "frame": { + "x": 196, + "y": 173, + "w": 60, + "h": 57 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 60, + "h": 57 + }, + "frame": { + "x": 196, + "y": 173, + "w": 60, + "h": 57 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 68, + "h": 52 + }, + "frame": { + "x": 0, + "y": 166, + "w": 68, + "h": 52 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 68, + "h": 52 + }, + "frame": { + "x": 0, + "y": 166, + "w": 68, + "h": 52 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 58, + "h": 56 + }, + "frame": { + "x": 68, + "y": 174, + "w": 58, + "h": 56 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 58, + "h": 56 + }, + "frame": { + "x": 68, + "y": 174, + "w": 58, + "h": 56 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 58, + "h": 56 + }, + "frame": { + "x": 68, + "y": 174, + "w": 58, + "h": 56 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 58, + "h": 56 + }, + "frame": { + "x": 68, + "y": 174, + "w": 58, + "h": 56 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 58, + "h": 56 + }, + "frame": { + "x": 68, + "y": 174, + "w": 58, + "h": 56 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 58, + "h": 56 + }, + "frame": { + "x": 68, + "y": 174, + "w": 58, + "h": 56 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b3e3aa0934489acf6a4cfb29341d1258:aa1ea22025abcbfd80c49896e6b63bc1:60f24648782f6bde87f7468b66ef2059$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/126_2.png b/public/images/pokemon/variant/back/126_2.png new file mode 100644 index 00000000000..9f22780f1d8 Binary files /dev/null and b/public/images/pokemon/variant/back/126_2.png differ diff --git a/public/images/pokemon/variant/back/133-partner.json b/public/images/pokemon/variant/back/133-partner.json new file mode 100644 index 00000000000..d48eaad4364 --- /dev/null +++ b/public/images/pokemon/variant/back/133-partner.json @@ -0,0 +1,22 @@ +{ + "1": { + "734a4a": "13235c", + "523121": "0b1145", + "d69c4a": "90c1f1", + "a5634a": "5982b7", + "000000": "000000", + "ffe6ad": "d7ebff", + "bd9c7b": "5f6f94", + "e6c594": "8ca8d2" + }, + "2": { + "734a4a": "5e3372", + "523121": "461144", + "d69c4a": "bf88cb", + "a5634a": "915ea3", + "000000": "000000", + "ffe6ad": "f3e6e3", + "bd9c7b": "a07c83", + "e6c594": "cfa7a9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/137.json b/public/images/pokemon/variant/back/137.json new file mode 100644 index 00000000000..47b4c121ebe --- /dev/null +++ b/public/images/pokemon/variant/back/137.json @@ -0,0 +1,32 @@ +{ + "1": { + "0884a5": "841023", + "085a73": "4d030f", + "c53a5a": "e9778e", + "8cd6ef": "e9635a", + "08add6": "ba333b", + "f7d6c5": "fccee9", + "ffffff": "ffffff", + "ff6363": "f8a8cd", + "7b2942": "c5415c", + "000000": "000000", + "c5c5c5": "c5c5c5", + "5abde6": "e9635a", + "efad9c": "e883a9" + }, + "2": { + "0884a5": "cf8556", + "085a73": "a1562c", + "c53a5a": "491c0c", + "8cd6ef": "ffd9ab", + "08add6": "efb787", + "f7d6c5": "a04c27", + "ffffff": "dea27e", + "ff6363": "82391d", + "7b2942": "280e07", + "000000": "000000", + "c5c5c5": "c67f4b", + "5abde6": "ffd9ab", + "efad9c": "683420" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/150-mega-y.json b/public/images/pokemon/variant/back/150-mega-y.json index d00e44e0579..daae4ff6ca7 100644 --- a/public/images/pokemon/variant/back/150-mega-y.json +++ b/public/images/pokemon/variant/back/150-mega-y.json @@ -11,5 +11,18 @@ "6e318c": "318c8a", "f8f8f8": "f8f8f8", "f25555": "4bac9a" + }, + "2": { + "101010": "101010", + "36364d": "884c17", + "461f59": "59201f", + "6e318c": "8c3331", + "7a7a99": "d68f40", + "9643bf": "bf4c43", + "be55f2": "f26155", + "acacbf": "edaf5b", + "f25555": "f25555", + "f8f8f8": "ffdd98", + "dadaf2": "ffdd98" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/169.json b/public/images/pokemon/variant/back/169.json index b66c1c82caa..34cfabeb573 100644 --- a/public/images/pokemon/variant/back/169.json +++ b/public/images/pokemon/variant/back/169.json @@ -1,27 +1,18 @@ { - "0": { - "63197b": "142557", - "a55ace": "6265b4", - "7b4a9c": "323f81", - "b57bce": "99a3ee", - "101010": "101010", - "08426b": "206f9e", - "216b94": "4aa6ce" - }, "1": { - "63197b": "9c528c", - "a55ace": "ffb5f7", - "7b4a9c": "d684ce", - "b57bce": "ffd6ef", + "63197b": "14093b", + "a55ace": "3d4381", + "7b4a9c": "2f2a5f", + "b57bce": "666fb4", "101010": "101010", - "08426b": "638400", - "216b94": "8ca508" + "08426b": "b06130", + "216b94": "ffb049" }, "2": { "63197b": "3c1e39", - "a55ace": "b5a3b3", - "7b4a9c": "958093", - "b57bce": "d4c3d1", + "a55ace": "b49db2", + "7b4a9c": "80607b", + "b57bce": "c8b6c2", "101010": "101010", "08426b": "901606", "216b94": "b52c0c" diff --git a/public/images/pokemon/variant/back/177.json b/public/images/pokemon/variant/back/177.json new file mode 100644 index 00000000000..7b2c7d04a48 --- /dev/null +++ b/public/images/pokemon/variant/back/177.json @@ -0,0 +1,32 @@ +{ + "1": { + "292929": "292929", + "842900": "001d3f", + "d63131": "174d69", + "ff424a": "4b798a", + "4a9442": "d1915e", + "73bd42": "ffbe79", + "94d642": "ffe88e", + "296b29": "b36848", + "846321": "356f6d", + "ffde29": "8ddcaf", + "d6ad29": "4ca690", + "ffffff": "ffffff", + "cecece": "cecece" + }, + "2": { + "292929": "292929", + "842900": "3b060c", + "d63131": "662340", + "ff424a": "9a3841", + "4a9442": "4973c7", + "73bd42": "62a1e8", + "94d642": "82d4fc", + "296b29": "224181", + "846321": "382c78", + "ffde29": "8767bf", + "d6ad29": "554196", + "ffffff": "ffffff", + "cecece": "cecece" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/177_2.png b/public/images/pokemon/variant/back/177_2.png new file mode 100644 index 00000000000..1c775f2ef3f Binary files /dev/null and b/public/images/pokemon/variant/back/177_2.png differ diff --git a/public/images/pokemon/variant/back/177_3.png b/public/images/pokemon/variant/back/177_3.png new file mode 100644 index 00000000000..04ec33986cd Binary files /dev/null and b/public/images/pokemon/variant/back/177_3.png differ diff --git a/public/images/pokemon/variant/back/178_2.json b/public/images/pokemon/variant/back/178_2.json new file mode 100644 index 00000000000..202894b474c --- /dev/null +++ b/public/images/pokemon/variant/back/178_2.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "178_2.png", + "format": "RGBA8888", + "size": { + "w": 263, + "h": 263 + }, + "scale": 1, + "frames": [ + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 58, + "w": 64, + "h": 58 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 58, + "w": 64, + "h": 58 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 58, + "h": 57 + }, + "frame": { + "x": 67, + "y": 0, + "w": 58, + "h": 57 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 58, + "h": 57 + }, + "frame": { + "x": 67, + "y": 0, + "w": 58, + "h": 57 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 59, + "h": 54 + }, + "frame": { + "x": 0, + "y": 116, + "w": 59, + "h": 54 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 59, + "h": 54 + }, + "frame": { + "x": 0, + "y": 116, + "w": 59, + "h": 54 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 55, + "h": 57 + }, + "frame": { + "x": 125, + "y": 0, + "w": 55, + "h": 57 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 55, + "h": 57 + }, + "frame": { + "x": 125, + "y": 0, + "w": 55, + "h": 57 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 54, + "h": 57 + }, + "frame": { + "x": 0, + "y": 170, + "w": 54, + "h": 57 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 54, + "h": 57 + }, + "frame": { + "x": 0, + "y": 170, + "w": 54, + "h": 57 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 54, + "h": 52 + }, + "frame": { + "x": 180, + "y": 0, + "w": 54, + "h": 52 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 54, + "h": 52 + }, + "frame": { + "x": 180, + "y": 0, + "w": 54, + "h": 52 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 48, + "h": 56 + }, + "frame": { + "x": 54, + "y": 170, + "w": 48, + "h": 56 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 48, + "h": 56 + }, + "frame": { + "x": 54, + "y": 170, + "w": 48, + "h": 56 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 48, + "h": 54 + }, + "frame": { + "x": 59, + "y": 116, + "w": 48, + "h": 54 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 48, + "h": 54 + }, + "frame": { + "x": 59, + "y": 116, + "w": 48, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 199, + "y": 156, + "w": 48, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 199, + "y": 156, + "w": 48, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 48, + "h": 51 + }, + "frame": { + "x": 150, + "y": 162, + "w": 48, + "h": 51 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 48, + "h": 51 + }, + "frame": { + "x": 150, + "y": 162, + "w": 48, + "h": 51 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 50, + "h": 51 + }, + "frame": { + "x": 198, + "y": 208, + "w": 50, + "h": 51 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 50, + "h": 51 + }, + "frame": { + "x": 198, + "y": 208, + "w": 50, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:09a3b8263891ad99a615fcb08d56ef56:420667b66547b2d5cc8ddbc8c794dd00:319c95b9f5acf1139a5c6761349cd6ab$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/178_2.png b/public/images/pokemon/variant/back/178_2.png new file mode 100644 index 00000000000..f65577f26bd Binary files /dev/null and b/public/images/pokemon/variant/back/178_2.png differ diff --git a/public/images/pokemon/variant/back/178_3.json b/public/images/pokemon/variant/back/178_3.json new file mode 100644 index 00000000000..a1ba7af59d3 --- /dev/null +++ b/public/images/pokemon/variant/back/178_3.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "178_3.png", + "format": "RGBA8888", + "size": { + "w": 263, + "h": 263 + }, + "scale": 1, + "frames": [ + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 58, + "w": 64, + "h": 58 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 58, + "w": 64, + "h": 58 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 58, + "h": 57 + }, + "frame": { + "x": 67, + "y": 0, + "w": 58, + "h": 57 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 58, + "h": 57 + }, + "frame": { + "x": 67, + "y": 0, + "w": 58, + "h": 57 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 59, + "h": 54 + }, + "frame": { + "x": 0, + "y": 116, + "w": 59, + "h": 54 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 59, + "h": 54 + }, + "frame": { + "x": 0, + "y": 116, + "w": 59, + "h": 54 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 55, + "h": 57 + }, + "frame": { + "x": 125, + "y": 0, + "w": 55, + "h": 57 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 55, + "h": 57 + }, + "frame": { + "x": 125, + "y": 0, + "w": 55, + "h": 57 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 54, + "h": 57 + }, + "frame": { + "x": 0, + "y": 170, + "w": 54, + "h": 57 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 54, + "h": 57 + }, + "frame": { + "x": 0, + "y": 170, + "w": 54, + "h": 57 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 54, + "h": 52 + }, + "frame": { + "x": 180, + "y": 0, + "w": 54, + "h": 52 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 54, + "h": 52 + }, + "frame": { + "x": 180, + "y": 0, + "w": 54, + "h": 52 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 48, + "h": 56 + }, + "frame": { + "x": 54, + "y": 170, + "w": 48, + "h": 56 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 48, + "h": 56 + }, + "frame": { + "x": 54, + "y": 170, + "w": 48, + "h": 56 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 48, + "h": 54 + }, + "frame": { + "x": 59, + "y": 116, + "w": 48, + "h": 54 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 48, + "h": 54 + }, + "frame": { + "x": 59, + "y": 116, + "w": 48, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 199, + "y": 156, + "w": 48, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 199, + "y": 156, + "w": 48, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 48, + "h": 51 + }, + "frame": { + "x": 150, + "y": 162, + "w": 48, + "h": 51 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 48, + "h": 51 + }, + "frame": { + "x": 150, + "y": 162, + "w": 48, + "h": 51 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 50, + "h": 51 + }, + "frame": { + "x": 198, + "y": 208, + "w": 50, + "h": 51 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 50, + "h": 51 + }, + "frame": { + "x": 198, + "y": 208, + "w": 50, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:09a3b8263891ad99a615fcb08d56ef56:420667b66547b2d5cc8ddbc8c794dd00:319c95b9f5acf1139a5c6761349cd6ab$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/178_3.png b/public/images/pokemon/variant/back/178_3.png new file mode 100644 index 00000000000..fe003a6c5a1 Binary files /dev/null and b/public/images/pokemon/variant/back/178_3.png differ diff --git a/public/images/pokemon/variant/back/182.json b/public/images/pokemon/variant/back/182.json new file mode 100644 index 00000000000..b544187f64e --- /dev/null +++ b/public/images/pokemon/variant/back/182.json @@ -0,0 +1,32 @@ +{ + "1": { + "840000": "338497", + "f76b00": "79f6d5", + "d62100": "49c1c2", + "101010": "101010", + "526329": "659251", + "9cd64a": "d8ecb1", + "73ad31": "a2d281", + "847319": "231c5a", + "e6d66b": "3a2c7d", + "105210": "373c8b", + "3a9400": "6370b3", + "b5a53a": "3a2c7d", + "52ce31": "90a4d7" + }, + "2": { + "840000": "a7801f", + "f76b00": "eaed6e", + "d62100": "cdbb39", + "101010": "101010", + "526329": "592819", + "9cd64a": "b68356", + "73ad31": "804428", + "847319": "a21b36", + "e6d66b": "eb4f50", + "105210": "901a17", + "3a9400": "b8462a", + "b5a53a": "ca3442", + "52ce31": "e87940" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/185.json b/public/images/pokemon/variant/back/185.json new file mode 100644 index 00000000000..2d8d461fbe7 --- /dev/null +++ b/public/images/pokemon/variant/back/185.json @@ -0,0 +1,24 @@ +{ + "1": { + "635a4a": "322a22", + "101010": "101010", + "ad845a": "5d564e", + "8c7342": "4c443b", + "315a19": "3d1e0c", + "5a8c5a": "6c4616", + "4ac542": "8a6a24", + "c5a54a": "7b7670", + "e6b54a": "8f991b" + }, + "2": { + "635a4a": "332868", + "101010": "101010", + "ad845a": "4058a8", + "8c7342": "47449e", + "315a19": "cf985e", + "5a8c5a": "e0c282", + "4ac542": "efe1b2", + "c5a54a": "5c80c0", + "e6b54a": "8fb5dc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/190.json b/public/images/pokemon/variant/back/190.json new file mode 100644 index 00000000000..d89680a2200 --- /dev/null +++ b/public/images/pokemon/variant/back/190.json @@ -0,0 +1,24 @@ +{ + "1": { + "52216b": "701523", + "a55ac5": "c47440", + "000000": "000000", + "bd7bde": "dea95a", + "8442ad": "ad452f", + "8c6b42": "8c7457", + "c5ad6b": "c4b487", + "ffdea5": "ffeccc", + "bd8c63": "bd9a7e" + }, + "2": { + "52216b": "807870", + "a55ac5": "bfbeb4", + "000000": "000000", + "bd7bde": "e5dfdf", + "8442ad": "a6a297", + "8c6b42": "632339", + "c5ad6b": "99455d", + "ffdea5": "ed8286", + "bd8c63": "802d44" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/193.json b/public/images/pokemon/variant/back/193.json new file mode 100644 index 00000000000..8c6770f192a --- /dev/null +++ b/public/images/pokemon/variant/back/193.json @@ -0,0 +1,32 @@ +{ + "1": { + "632900": "a13a80", + "f75a52": "fc95c5", + "ad3119": "e069b1", + "94adbd": "c9859d", + "e6ffff": "f0afbc", + "ffbd9c": "ffded9", + "7bd65a": "9d88f2", + "3a5a29": "2e2e70", + "73a54a": "7262de", + "6b7b84": "a36280", + "c5d6ef": "ed9db5", + "101010": "101010", + "4a4a52": "693e78" + }, + "2": { + "632900": "913919", + "f75a52": "eba64d", + "ad3119": "cf6838", + "94adbd": "81a690", + "e6ffff": "f3ffe6", + "ffbd9c": "ebe0a7", + "7bd65a": "18adbd", + "3a5a29": "25364f", + "73a54a": "46769c", + "6b7b84": "607b84", + "c5d6ef": "d8edbb", + "101010": "101010", + "4a4a52": "3e4a52" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/199.json b/public/images/pokemon/variant/back/199.json new file mode 100644 index 00000000000..f17d7951ccd --- /dev/null +++ b/public/images/pokemon/variant/back/199.json @@ -0,0 +1,36 @@ +{ + "1": { + "63636b": "734927", + "d6d6d6": "f1d191", + "ada5a5": "bf9562", + "101010": "101010", + "ffffff": "ffffff", + "a53129": "538a55", + "ce5252": "542a28", + "ff5a4a": "93de76", + "e64221": "50b64e", + "b52919": "2b191b", + "d1cdc9": "d1cdc9", + "ef736b": "5b3332", + "ff9c94": "885345", + "deb531": "b97565", + "ffff8c": "e0b69d" + }, + "2": { + "63636b": "192b32", + "d6d6d6": "4c7668", + "ada5a5": "2b4a48", + "101010": "101010", + "ffffff": "ffffff", + "a53129": "2e1910", + "ce5252": "b0613c", + "ff5a4a": "6f4d35", + "e64221": "543322", + "b52919": "893d28", + "d1cdc9": "d1cdc9", + "ef736b": "de9048", + "ff9c94": "edbc69", + "deb531": "bf4f2a", + "ffff8c": "e68047" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/2027.json b/public/images/pokemon/variant/back/2027.json new file mode 100644 index 00000000000..19a32275979 --- /dev/null +++ b/public/images/pokemon/variant/back/2027.json @@ -0,0 +1,24 @@ +{ + "1": { + "518d9f": "a24c68", + "354e73": "752e42", + "b6dbe7": "ffdac2", + "84b3ce": "d27c80", + "fefefe": "fefefe", + "101010": "101010", + "897e67": "aaaa96", + "fefea9": "fffffc", + "d1c592": "d3d3c6" + }, + "2": { + "518d9f": "6a439e", + "354e73": "3d2c78", + "b6dbe7": "dbb1eb", + "84b3ce": "a87bcf", + "fefefe": "fefefe", + "101010": "101010", + "897e67": "2e163d", + "fefea9": "6f3480", + "d1c592": "44225a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/2028.json b/public/images/pokemon/variant/back/2028.json new file mode 100644 index 00000000000..e2a25c789c1 --- /dev/null +++ b/public/images/pokemon/variant/back/2028.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "3a6b8c": "692a61", + "f1f1f4": "fffffc", + "b0e5f8": "fffed9", + "7dcff2": "f9e7b2", + "52b0cf": "e2877b", + "29397b": "3e1d4d", + "3c88b4": "966281", + "77a2bb": "d9746e", + "434f6f": "a14253", + "b7e3e7": "ffb59e", + "606060": "6f525d", + "bdbdcd": "d0c0b6", + "9994b6": "8d6e6f" + }, + "2": { + "101010": "101010", + "3a6b8c": "3c2d74", + "f1f1f4": "e3f0ff", + "b0e5f8": "f8f5b0", + "7dcff2": "6edcaf", + "52b0cf": "57a5c5", + "29397b": "321846", + "3c88b4": "515fa9", + "77a2bb": "381d4d", + "434f6f": "171227", + "b7e3e7": "5f2e71", + "606060": "3a3a54", + "bdbdcd": "acb7d0", + "9994b6": "7d83a4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/203.json b/public/images/pokemon/variant/back/203.json new file mode 100644 index 00000000000..1429eb40c25 --- /dev/null +++ b/public/images/pokemon/variant/back/203.json @@ -0,0 +1,36 @@ +{ + "1": { + "424a73": "351810", + "ffffff": "ffffff", + "adb5d6": "8f6f66", + "6b8cb5": "512b21", + "4a3a3a": "231117", + "efde52": "9c3e3e", + "c5a53a": "7e262d", + "9c3a5a": "ab9d75", + "101010": "101010", + "9c7b42": "571522", + "ce6b94": "d8d1ad", + "947b6b": "1f4062", + "635252": "112246", + "8c735a": "732027", + "d6c53a": "863838" + }, + "2": { + "424a73": "27091d", + "ffffff": "ffffff", + "adb5d6": "c5b0b7", + "6b8cb5": "4a1b33", + "4a3a3a": "091225", + "efde52": "2a9d8f", + "c5a53a": "1e7884", + "9c3a5a": "52ab5f", + "101010": "101010", + "9c7b42": "15545d", + "ce6b94": "a8e781", + "947b6b": "1a2e43", + "635252": "111d34", + "8c735a": "16656f", + "d6c53a": "1f887b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/213.json b/public/images/pokemon/variant/back/213.json new file mode 100644 index 00000000000..11a4ca52ff1 --- /dev/null +++ b/public/images/pokemon/variant/back/213.json @@ -0,0 +1,30 @@ +{ + "1": { + "bd8c29": "9b3e60", + "735210": "5d1931", + "ffff5a": "d68b71", + "efc54a": "cc5b74", + "101010": "101010", + "6b633a": "8e4d31", + "ffffff": "fff0d8", + "d6ceb5": "fcc86f", + "bdad94": "db894a", + "842100": "0d1f2d", + "b53129": "103a48", + "e64a42": "336c77" + }, + "2": { + "bd8c29": "328470", + "735210": "254d59", + "ffff5a": "aaedbe", + "efc54a": "5bbfaa", + "101010": "101010", + "6b633a": "1f1f1f", + "ffffff": "705b66", + "d6ceb5": "4f3e46", + "bdad94": "44303b", + "842100": "2c1b2a", + "b53129": "8a564d", + "e64a42": "c28d65" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/23.json b/public/images/pokemon/variant/back/23.json new file mode 100644 index 00000000000..b77da94b156 --- /dev/null +++ b/public/images/pokemon/variant/back/23.json @@ -0,0 +1,28 @@ +{ + "1": { + "b57b31": "96775e", + "845210": "6f483e", + "ffe69c": "fffeee", + "ffd66b": "f3f1d4", + "a54a8c": "34a78a", + "ce63b5": "77d3a7", + "7b316b": "1f8179", + "e6ad5a": "d6c7a2", + "5a104a": "093640", + "101010": "101010", + "ffffff": "ffffff" + }, + "2": { + "b57b31": "293e6f", + "845210": "1d265b", + "ffe69c": "cee8f9", + "ffd66b": "82afcd", + "a54a8c": "cdb4aa", + "ce63b5": "ebe1d7", + "7b316b": "b3857d", + "e6ad5a": "4d759b", + "5a104a": "5b303e", + "101010": "101010", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/230.json b/public/images/pokemon/variant/back/230.json new file mode 100644 index 00000000000..2603b437bbe --- /dev/null +++ b/public/images/pokemon/variant/back/230.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "4a5a94": "2a2750", + "8cbdef": "396979", + "cee6f7": "5dac9b", + "add6ff": "3e8383", + "639cce": "2f4861", + "ffffff": "d0f9ea", + "bd3a31": "481e1c", + "7b7b7b": "425c58", + "d6d6d6": "709587", + "ad6b00": "377b4b", + "f7e64a": "abdd82", + "e6ad3a": "63a666" + }, + "2": { + "101010": "101010", + "4a5a94": "54133f", + "8cbdef": "d64b52", + "cee6f7": "ffb273", + "add6ff": "f27461", + "639cce": "b53f49", + "ffffff": "ffe8ea", + "bd3a31": "60806d", + "7b7b7b": "cd6093", + "d6d6d6": "ffaeb6", + "ad6b00": "4e878a", + "f7e64a": "b3f2d8", + "e6ad3a": "7bc9bb" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/233.json b/public/images/pokemon/variant/back/233.json new file mode 100644 index 00000000000..e177f4e243a --- /dev/null +++ b/public/images/pokemon/variant/back/233.json @@ -0,0 +1,28 @@ +{ + "1": { + "94426b": "e27089", + "ef5a63": "f8a8cd", + "ff94b5": "fccee9", + "ffffff": "ffffff", + "31739c": "6d224c", + "d6d6d6": "e1dbff", + "4a9cd6": "833462", + "313a63": "4c1131", + "5a3a4a": "d94664", + "6b6b7b": "887acd", + "101010": "101010" + }, + "2": { + "94426b": "491c0c", + "ef5a63": "82391d", + "ff94b5": "a04c27", + "ffffff": "ffe4d4", + "31739c": "efb787", + "d6d6d6": "efb787", + "4a9cd6": "ffd9ab", + "313a63": "b77751", + "5a3a4a": "31150e", + "6b6b7b": "b77751", + "101010": "101010" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/24.json b/public/images/pokemon/variant/back/24.json new file mode 100644 index 00000000000..a54eb499950 --- /dev/null +++ b/public/images/pokemon/variant/back/24.json @@ -0,0 +1,20 @@ +{ + "1": { + "523a7b": "113a53", + "a584c5": "30abb3", + "7b63ad": "146d7d", + "ffffff": "ffffff", + "101010": "101010", + "c5a5ef": "8feae4", + "c5c5c5": "c5c5c5" + }, + "2": { + "523a7b": "875a5f", + "a584c5": "eed3b1", + "7b63ad": "bf9a8e", + "ffffff": "ffffff", + "101010": "101010", + "c5a5ef": "fff9e5", + "c5c5c5": "c5c5c5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/240.json b/public/images/pokemon/variant/back/240.json new file mode 100644 index 00000000000..d9fdfa30751 --- /dev/null +++ b/public/images/pokemon/variant/back/240.json @@ -0,0 +1,26 @@ +{ + "1": { + "d6523a": "372d49", + "943121": "101010", + "ff7b63": "524b6f", + "101010": "101010", + "ffffb5": "ffffff", + "ad8400": "db4d19", + "f7d63a": "fba42e", + "d6ad00": "fb832b", + "73737b": "73737b", + "ffffff": "ffffff" + }, + "2": { + "d6523a": "4065b0", + "943121": "303d58", + "ff7b63": "5398cf", + "101010": "101010", + "ffffb5": "ffffff", + "ad8400": "699296", + "f7d63a": "eaffff", + "d6ad00": "c6edf2", + "73737b": "73737b", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/255.json b/public/images/pokemon/variant/back/255.json new file mode 100644 index 00000000000..94804ee8f02 --- /dev/null +++ b/public/images/pokemon/variant/back/255.json @@ -0,0 +1,24 @@ +{ + "1": { + "ad8c00": "298084", + "f7de6b": "58dfa5", + "000000": "000000", + "efbd31": "34ad90", + "7b4a19": "1d5461", + "ad4210": "b93a23", + "e65a21": "e86434", + "ff8c31": "ff9039", + "ffffff": "ffffff" + }, + "2": { + "ad8c00": "550d28", + "f7de6b": "ad3633", + "000000": "000000", + "efbd31": "811c2c", + "7b4a19": "400724", + "ad4210": "b3817d", + "e65a21": "d3afa0", + "ff8c31": "f3e5cf", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/256.json b/public/images/pokemon/variant/back/256.json new file mode 100644 index 00000000000..159cc5a51f5 --- /dev/null +++ b/public/images/pokemon/variant/back/256.json @@ -0,0 +1,30 @@ +{ + "1": { + "9c3110": "11526f", + "191919": "191919", + "ff7b4a": "3dd0b0", + "de5a29": "1f9ba4", + "9c7329": "a7471f", + "efbd4a": "f19830", + "efde73": "ffc148", + "6b6b73": "413d75", + "9c8c84": "696098", + "dedece": "9386b8", + "5a4a4a": "2c2a44", + "84736b": "574b6e" + }, + "2": { + "9c3110": "8a685f", + "191919": "191919", + "ff7b4a": "fff7e1", + "de5a29": "cdb09b", + "9c7329": "641835", + "efbd4a": "962b39", + "efde73": "c4584d", + "6b6b73": "192132", + "9c8c84": "2d2e46", + "dedece": "494f67", + "5a4a4a": "ad662b", + "84736b": "e6a653" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/257-mega.json b/public/images/pokemon/variant/back/257-mega.json new file mode 100644 index 00000000000..8cde98eae09 --- /dev/null +++ b/public/images/pokemon/variant/back/257-mega.json @@ -0,0 +1,42 @@ +{ + "1": { + "62524a": "55607d", + "dedeb4": "f0fbff", + "948362": "8095b3", + "bdb494": "a8c7da", + "f6d562": "dafff0", + "832929": "9b422a", + "f0a010": "94f1d8", + "ff9a7f": "fff185", + "e55858": "51b5cd", + "ee6262": "f7ca4b", + "000000": "000000", + "bd4141": "da8923", + "fff188": "ecfff8", + "297bd5": "930808", + "614e47": "2c2a44", + "93827a": "574b6e", + "414141": "279e91", + "292929": "16607e" + }, + "2": { + "62524a": "5b143d", + "dedeb4": "bc474d", + "948362": "842446", + "bdb494": "a1304d", + "f6d562": "9d9bf3", + "832929": "9c7c70", + "f0a010": "7747bf", + "ff9a7f": "fffce9", + "e55858": "c6e6ff", + "ee6262": "fffae1", + "000000": "000000", + "bd4141": "d2bda7", + "fff188": "c6fffd", + "297bd5": "1f3061", + "614e47": "ad662b", + "93827a": "e6a653", + "414141": "505386", + "292929": "373260" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/257.json b/public/images/pokemon/variant/back/257.json new file mode 100644 index 00000000000..42cd254566d --- /dev/null +++ b/public/images/pokemon/variant/back/257.json @@ -0,0 +1,52 @@ +{ + "1": { + "b93e3e": "46649c", + "ff8463": "70b0d5", + "bdb594": "a8c7da", + "948463": "8095b3", + "dedeb5": "f0fbff", + "63524a": "55607d", + "000000": "000000", + "ee5e5e": "598dc1", + "842929": "11526f", + "ef6363": "3dd0b0", + "bd4242": "1f9ba4", + "7b2525": "232647", + "634e4a": "2c2a44", + "bd5f42": "97a3cc", + "9c8c84": "574b6e", + "ffde6b": "e1f0ff", + "297bd6": "c64c07", + "ffffff": "9386b8", + "dfa550": "b2c3e3", + "8c633a": "bf462a", + "c46b37": "c46b37", + "dea552": "f99140", + "f7d663": "ffc96b" + }, + "2": { + "b93e3e": "55153a", + "ff8463": "912d42", + "bdb594": "a43b45", + "948463": "772436", + "dedeb5": "cc6155", + "63524a": "5b1832", + "000000": "000000", + "ee5e5e": "772040", + "842929": "9c7c70", + "ef6363": "fffae1", + "bd4242": "d2bda7", + "7b2525": "470f2f", + "634e4a": "ad662b", + "bd5f42": "983b2d", + "9c8c84": "e6a653", + "ffde6b": "da9b60", + "297bd6": "297bd6", + "ffffff": "473c61", + "dfa550": "be6646", + "8c633a": "2d2e58", + "c46b37": "5f7190", + "dea552": "48537d", + "f7d663": "7a8faa" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/261.json b/public/images/pokemon/variant/back/261.json new file mode 100644 index 00000000000..47e9abd21a6 --- /dev/null +++ b/public/images/pokemon/variant/back/261.json @@ -0,0 +1,28 @@ +{ + "1": { + "636363": "803c2c", + "c5c5c5": "d4a172", + "000000": "000000", + "a5a5a5": "b26c55", + "424242": "380927", + "5a5a63": "6d1757", + "bd8c42": "a3738d", + "f7f75a": "c59cbe", + "9c2942": "222d84", + "ffffff": "ffffff", + "6b6b84": "6b6b84" + }, + "2": { + "636363": "24103c", + "c5c5c5": "763f94", + "000000": "000000", + "a5a5a5": "402067", + "424242": "4e9ea3", + "5a5a63": "96eedf", + "bd8c42": "8aa8cd", + "f7f75a": "bdd9f2", + "9c2942": "182556", + "ffffff": "ffffff", + "6b6b84": "6b6b84" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/262.json b/public/images/pokemon/variant/back/262.json new file mode 100644 index 00000000000..492ca26dca5 --- /dev/null +++ b/public/images/pokemon/variant/back/262.json @@ -0,0 +1,36 @@ +{ + "1": { + "525252": "7a3424", + "000000": "000000", + "94949c": "ad5c41", + "bdbdc5": "d2975f", + "313131": "510c2b", + "4a4a4a": "711956", + "4d4d4d": "71231f", + "bd8c42": "bd8c42", + "f7ef5a": "f7ef5a", + "ad1021": "5f0d3e", + "bd4a7b": "bd4a7b", + "ffffff": "ffffff", + "de2942": "8f1c4e", + "323232": "5a1c15", + "949cad": "949cad" + }, + "2": { + "525252": "230f3b", + "000000": "000000", + "94949c": "402067", + "bdbdc5": "753e93", + "313131": "4f9fa4", + "4a4a4a": "96eedf", + "4d4d4d": "230f3b", + "bd8c42": "cb6654", + "f7ef5a": "ffb98c", + "ad1021": "45809a", + "bd4a7b": "bd4a7b", + "ffffff": "ffffff", + "de2942": "5ba7ba", + "323232": "0b1044", + "949cad": "949cad" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/2670.json b/public/images/pokemon/variant/back/2670.json new file mode 100644 index 00000000000..81e91c8fb72 --- /dev/null +++ b/public/images/pokemon/variant/back/2670.json @@ -0,0 +1,28 @@ +{ + "1": { + "101010": "101010", + "404040": "1d2040", + "ff7373": "73e1ff", + "802d2d": "1f298e", + "666161": "4c6271", + "d94c4c": "4c7dd9", + "bfbfbf": "756b8e", + "595959": "151414", + "f8f8f8": "9ea4bf", + "4068b8": "b12d38", + "243a66": "63132f" + }, + "2": { + "101010": "101010", + "404040": "b3b3b3", + "ff7373": "4cd9af", + "802d2d": "20877a", + "666161": "f8f4f4", + "d94c4c": "3aa68b", + "bfbfbf": "404040", + "595959": "1c1c1c", + "f8f8f8": "636262", + "4068b8": "76b12a", + "243a66": "1e5c1a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/307.json b/public/images/pokemon/variant/back/307.json index 3c2ef92171c..3bdadaa8e16 100644 --- a/public/images/pokemon/variant/back/307.json +++ b/public/images/pokemon/variant/back/307.json @@ -1,15 +1,5 @@ { "1": { - "7b6b6b": "314b76", - "b5adad": "677d98", - "e6dede": "c2cfdb", - "000000": "000000", - "3a84b5": "51876e", - "3a4a5a": "113926", - "6bcee6": "7edfb7", - "5aa5ce": "66c3a3" - }, - "2": { "7b6b6b": "7a5f5f", "b5adad": "9f8383", "e6dede": "deccc3", @@ -18,5 +8,15 @@ "3a4a5a": "5a2859", "6bcee6": "f4a8c8", "5aa5ce": "ce7bb0" + }, + "2": { + "7b6b6b": "314b76", + "b5adad": "677d98", + "e6dede": "c2cfdb", + "000000": "000000", + "3a84b5": "51876e", + "3a4a5a": "113926", + "6bcee6": "7edfb7", + "5aa5ce": "66c3a3" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/327.json b/public/images/pokemon/variant/back/327.json new file mode 100644 index 00000000000..29d66d38e43 --- /dev/null +++ b/public/images/pokemon/variant/back/327.json @@ -0,0 +1,22 @@ +{ + "1": { + "7b4231": "21384a", + "101010": "101010", + "735242": "122c3b", + "e6d6a5": "b2dcd7", + "cea573": "6ca9ac", + "9c845a": "21384a", + "bd4a31": "17414a", + "ef524a": "2b6967" + }, + "2": { + "7b4231": "75211a", + "101010": "101010", + "735242": "52180f", + "e6d6a5": "be5f3c", + "cea573": "93381f", + "9c845a": "75211a", + "bd4a31": "cfc191", + "ef524a": "ebe1be" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/337.json b/public/images/pokemon/variant/back/337.json new file mode 100644 index 00000000000..3b6b2e7d4ef --- /dev/null +++ b/public/images/pokemon/variant/back/337.json @@ -0,0 +1,26 @@ +{ + "1": { + "94843a": "2a2836", + "efde8c": "8396a8", + "cebd6b": "505c71", + "b5a552": "38384b", + "846b42": "161617", + "101010": "101010", + "3a423a": "20282b", + "b5213a": "b81fac", + "841029": "611267", + "d65a73": "ec40c7" + }, + "2": { + "94843a": "45061e", + "efde8c": "a63c22", + "cebd6b": "8a1211", + "b5a552": "630923", + "846b42": "2f0616", + "101010": "101010", + "3a423a": "341413", + "b5213a": "30d6d6", + "841029": "08adad", + "d65a73": "73ffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/393.json b/public/images/pokemon/variant/back/393.json new file mode 100644 index 00000000000..e11dce3b058 --- /dev/null +++ b/public/images/pokemon/variant/back/393.json @@ -0,0 +1,34 @@ +{ + "1": { + "21639c": "3b7260", + "6ba5e6": "54c461", + "318cd6": "44a36b", + "104a73": "244941", + "63a5c5": "ce8a56", + "9cd6f7": "e8ce81", + "bdcede": "e2d7a5", + "ffffff": "ffffff", + "637b94": "c68a67", + "101010": "101010", + "634a10": "363b56", + "f7ce42": "bec8d1", + "ad843a": "81899b", + "086b7b": "bc4423" + }, + "2": { + "21639c": "ae386b", + "6ba5e6": "ff8692", + "318cd6": "df5d7e", + "104a73": "6f244e", + "63a5c5": "4a172e", + "9cd6f7": "782439", + "bdcede": "ccb9af", + "ffffff": "f4ede8", + "637b94": "877e78", + "101010": "101010", + "634a10": "368089", + "f7ce42": "92edcf", + "ad843a": "67c1b7", + "086b7b": "31091f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/394.json b/public/images/pokemon/variant/back/394.json new file mode 100644 index 00000000000..c18a4eadc37 --- /dev/null +++ b/public/images/pokemon/variant/back/394.json @@ -0,0 +1,30 @@ +{ + "1": { + "7b5242": "2a2c3a", + "bd8c6b": "4f5572", + "101010": "101010", + "efce63": "81899b", + "ffe684": "bec8d1", + "21426b": "2b544b", + "639cf7": "c97d4e", + "9cceff": "e8ce81", + "215a94": "338757", + "21446d": "8c2419", + "3a7bb5": "b24125", + "84b5ff": "d6a466" + }, + "2": { + "7b5242": "3c7d84", + "bd8c6b": "438084", + "101010": "101010", + "efce63": "82d3d0", + "ffe684": "baf3e4", + "21426b": "aa3565", + "639cf7": "670f2f", + "9cceff": "982337", + "215a94": "f880a0", + "21446d": "320a2f", + "3a7bb5": "460725", + "84b5ff": "7d1535" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/395.json b/public/images/pokemon/variant/back/395.json new file mode 100644 index 00000000000..e497e8b78e6 --- /dev/null +++ b/public/images/pokemon/variant/back/395.json @@ -0,0 +1,32 @@ +{ + "1": { + "bd8c6b": "464c6b", + "ffe684": "bec8d1", + "7b5242": "1e202b", + "101010": "101010", + "103c75": "7f1711", + "9cceff": "fff18c", + "528ce6": "cc8043", + "4a73ad": "c66933", + "103a73": "23603f", + "73a5ef": "e0b757", + "102142": "1c3834", + "295a94": "af4724", + "efce63": "81899b" + }, + "2": { + "bd8c6b": "2c7787", + "ffe684": "6cd3cd", + "7b5242": "184555", + "101010": "101010", + "103c75": "26061c", + "9cceff": "7e2b44", + "528ce6": "4f1438", + "4a73ad": "430f2f", + "103a73": "f1919f", + "73a5ef": "641b3c", + "102142": "bf4b69", + "295a94": "400e30", + "efce63": "a8c4b8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/4079.json b/public/images/pokemon/variant/back/4079.json new file mode 100644 index 00000000000..e958fc537ab --- /dev/null +++ b/public/images/pokemon/variant/back/4079.json @@ -0,0 +1,32 @@ +{ + "1": { + "d76d96": "8f5345", + "aa4a6b": "613934", + "936d20": "ad937b", + "f88daf": "bb694b", + "fefe3c": "ffeccb", + "7c2847": "452a29", + "caaa2c": "edc59e", + "101010": "101010", + "8b5a18": "a84071", + "ffe6b4": "ff9eba", + "dea462": "e0799c", + "fcfcfc": "fcfcfc", + "d5cdcd": "d5cdcd" + }, + "2": { + "d76d96": "c6aead", + "aa4a6b": "846467", + "936d20": "7b2c51", + "f88daf": "ecdcbe", + "fefe3c": "d9736b", + "7c2847": "503941", + "caaa2c": "963e59", + "101010": "101010", + "8b5a18": "a45c58", + "ffe6b4": "efc697", + "dea462": "cb8f75", + "fcfcfc": "fcfcfc", + "d5cdcd": "d5cdcd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/4080.json b/public/images/pokemon/variant/back/4080.json new file mode 100644 index 00000000000..0101712afb7 --- /dev/null +++ b/public/images/pokemon/variant/back/4080.json @@ -0,0 +1,36 @@ +{ + "1": { + "723f7c": "edc59e", + "a565c0": "ffedcc", + "181818": "181818", + "7b2645": "573531", + "d76792": "905446", + "c9c9c9": "c9c9c9", + "b6b6ae": "b6b6ae", + "7c6987": "a94172", + "fbfbfb": "fbfbfb", + "ede2ef": "ff9fbb", + "b5a0bd": "e17a9d", + "f985aa": "bb694b", + "52525a": "831e2b", + "8b9494": "ad3139", + "c2c9c9": "de504e" + }, + "2": { + "723f7c": "963e59", + "a565c0": "d9736b", + "181818": "181818", + "7b2645": "846467", + "d76792": "c6aead", + "c9c9c9": "c9c9c9", + "b6b6ae": "b6b6ae", + "7c6987": "a45c58", + "fbfbfb": "fbfbfb", + "ede2ef": "efc697", + "b5a0bd": "ca8e74", + "f985aa": "ecdcbe", + "52525a": "2a6122", + "8b9494": "71ae48", + "c2c9c9": "b1dd73" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/41.json b/public/images/pokemon/variant/back/41.json index 6a75080db16..42283672198 100644 --- a/public/images/pokemon/variant/back/41.json +++ b/public/images/pokemon/variant/back/41.json @@ -1,16 +1,4 @@ { - "0": { - "101010": "101010", - "8cb5ef": "6569c0", - "4a427b": "142557", - "637bb5": "323f81", - "73215a": "196297", - "b5529c": "61b6da", - "bdceff": "959ee9", - "ffffff": "ffffff", - "636363": "636363", - "d6d6d6": "d6d6d6" - }, "1": { "101010": "101010", "8cb5ef": "205182", @@ -25,12 +13,12 @@ }, "2": { "101010": "101010", - "8cb5ef": "c1aec0", + "8cb5ef": "cbabca", "4a427b": "4d3259", - "637bb5": "866881", + "637bb5": "916c8b", "73215a": "670f10", "b5529c": "94241c", - "bdceff": "dfcddd", + "bdceff": "e8d2e6", "ffffff": "ffffff", "636363": "636363", "d6d6d6": "d6d6d6" diff --git a/public/images/pokemon/variant/back/418.json b/public/images/pokemon/variant/back/418.json new file mode 100644 index 00000000000..58fb6a055b6 --- /dev/null +++ b/public/images/pokemon/variant/back/418.json @@ -0,0 +1,38 @@ +{ + "1": { + "ad5a21": "7d1e39", + "7b4221": "611b35", + "ef7b19": "9c354f", + "191919": "191919", + "ce6b19": "851d3e", + "f7f7b5": "e8d4cc", + "c59452": "995e5c", + "d6d6ce": "d6d6ce", + "ffffff": "ffffff", + "cebd84": "cea49d", + "6b6b6b": "6b6b6b", + "99693c": "6a808c", + "e6a531": "a0b3ba", + "2163a5": "385e11", + "ffde00": "d2e5e8", + "63bde6": "6a9539" + }, + "2": { + "ad5a21": "cd91aa", + "7b4221": "9e6a86", + "ef7b19": "debfc8", + "191919": "191919", + "ce6b19": "dca5b5", + "f7f7b5": "a8688f", + "c59452": "672e5d", + "d6d6ce": "d6d6ce", + "ffffff": "ffffff", + "cebd84": "965080", + "6b6b6b": "432e38", + "99693c": "8e410e", + "e6a531": "d4812f", + "2163a5": "4b2a70", + "ffde00": "eda342", + "63bde6": "744d99" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/419.json b/public/images/pokemon/variant/back/419.json new file mode 100644 index 00000000000..3202d442933 --- /dev/null +++ b/public/images/pokemon/variant/back/419.json @@ -0,0 +1,38 @@ +{ + "1": { + "7b4221": "611b35", + "ef7b19": "9c354f", + "191919": "191919", + "ce6b19": "851d3e", + "ad5a21": "7d1e39", + "cebd84": "cea49d", + "f7f7b5": "e8d4cc", + "99693c": "6a808c", + "6b6b6b": "6b6b6b", + "e6a531": "a0b3ba", + "ffde00": "d2e5e8", + "d6d6ce": "d6d6ce", + "ffffff": "ffffff", + "c59452": "995e5c", + "2163a5": "385e11", + "63bde6": "6a9539" + }, + "2": { + "7b4221": "9e6a86", + "ef7b19": "debfc8", + "191919": "191919", + "ce6b19": "dca5b5", + "ad5a21": "cd91aa", + "cebd84": "965080", + "f7f7b5": "a8688f", + "99693c": "8e410e", + "6b6b6b": "726481", + "e6a531": "d4812f", + "ffde00": "eda342", + "d6d6ce": "d6d6ce", + "ffffff": "ffffff", + "c59452": "672e5d", + "2163a5": "4b2a70", + "63bde6": "744d99" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/4199.json b/public/images/pokemon/variant/back/4199.json new file mode 100644 index 00000000000..3feab3d0964 --- /dev/null +++ b/public/images/pokemon/variant/back/4199.json @@ -0,0 +1,36 @@ +{ + "1": { + "413668": "622344", + "101010": "101010", + "a191b5": "de504e", + "7a6a98": "ad3139", + "654493": "7e3351", + "723f7c": "d0bca2", + "403568": "66222b", + "624493": "85363d", + "a565c0": "ffeccb", + "d76792": "8f5345", + "7b2645": "573531", + "f8f8f8": "f8f8f8", + "c89a51": "a84254", + "eed583": "c75865", + "f985aa": "bb694b" + }, + "2": { + "413668": "1d4c46", + "101010": "101010", + "a191b5": "b0dc72", + "7a6a98": "71ae48", + "654493": "38735c", + "723f7c": "ae4653", + "403568": "e7a673", + "624493": "ffedad", + "a565c0": "d9736b", + "d76792": "c7afae", + "7b2645": "846467", + "f8f8f8": "f8f8f8", + "c89a51": "2b4a49", + "eed583": "4c766a", + "f985aa": "ecdcbe" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/41_1.png b/public/images/pokemon/variant/back/41_1.png deleted file mode 100644 index 6943a2eddb4..00000000000 Binary files a/public/images/pokemon/variant/back/41_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/42.json b/public/images/pokemon/variant/back/42.json index 54417a7af59..df3cf67d3ef 100644 --- a/public/images/pokemon/variant/back/42.json +++ b/public/images/pokemon/variant/back/42.json @@ -1,15 +1,4 @@ { - "0": { - "3a3a7b": "142557", - "6384ce": "323f81", - "adceff": "99a3ee", - "5aadef": "6265b4", - "631052": "093263", - "000000": "000000", - "ce6bb5": "61b6da", - "ad52ad": "348cc1", - "943a7b": "348cc1" - }, "1": { "3a3a7b": "14093b", "6384ce": "12245c", @@ -22,10 +11,10 @@ "943a7b": "af4e0c" }, "2": { - "3a3a7b": "584055", - "6384ce": "866881", + "3a3a7b": "3d2349", + "6384ce": "916c8b", "adceff": "dfcddd", - "5aadef": "c1aec0", + "5aadef": "cbabca", "631052": "54070c", "000000": "000000", "ce6bb5": "bc3b1d", diff --git a/public/images/pokemon/variant/back/424.json b/public/images/pokemon/variant/back/424.json new file mode 100644 index 00000000000..c0e9356a7a4 --- /dev/null +++ b/public/images/pokemon/variant/back/424.json @@ -0,0 +1,28 @@ +{ + "1": { + "734a42": "415c73", + "ad5242": "428dad", + "ff735a": "5ae9ff", + "101010": "101010", + "8c6b42": "8c7457", + "debd73": "c4b487", + "ffefa5": "ffeccc", + "52216b": "701523", + "b563e6": "dea95a", + "843aad": "ad452f", + "9c4ac5": "c47440" + }, + "2": { + "734a42": "593802", + "ad5242": "946212", + "ff735a": "ffb338", + "101010": "101010", + "8c6b42": "632339", + "debd73": "99455d", + "ffefa5": "ed8286", + "52216b": "807870", + "b563e6": "e5dfdf", + "843aad": "a6a297", + "9c4ac5": "bfbeb4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/426_3.png b/public/images/pokemon/variant/back/426_3.png deleted file mode 100644 index e994a22f917..00000000000 Binary files a/public/images/pokemon/variant/back/426_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/42_1.png b/public/images/pokemon/variant/back/42_1.png deleted file mode 100644 index 2f649cdc649..00000000000 Binary files a/public/images/pokemon/variant/back/42_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/43.json b/public/images/pokemon/variant/back/43.json new file mode 100644 index 00000000000..e94b27ad756 --- /dev/null +++ b/public/images/pokemon/variant/back/43.json @@ -0,0 +1,22 @@ +{ + "1": { + "8cad31": "3f419d", + "c5e67b": "90a1d7", + "4a5a21": "2a2274", + "9cd64a": "606dbb", + "101010": "101010", + "293a4a": "522c90", + "5a6b84": "7946a9", + "7394a5": "a564c7" + }, + "2": { + "8cad31": "8b4a13", + "c5e67b": "e8b737", + "4a5a21": "6a2509", + "9cd64a": "b88026", + "101010": "101010", + "293a4a": "560a25", + "5a6b84": "79152a", + "7394a5": "b3292e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/438.json b/public/images/pokemon/variant/back/438.json new file mode 100644 index 00000000000..78a49203dd6 --- /dev/null +++ b/public/images/pokemon/variant/back/438.json @@ -0,0 +1,22 @@ +{ + "1": { + "315a19": "3d1e0c", + "9cde7b": "b6a747", + "4ac542": "8a6a24", + "000000": "000000", + "5a8c5a": "6c4616", + "846b42": "4c443b", + "524231": "322a22", + "ad845a": "5d564e" + }, + "2": { + "315a19": "846764", + "9cde7b": "fffdee", + "4ac542": "e8e6d7", + "000000": "000000", + "5a8c5a": "b9ac9d", + "846b42": "3c389d", + "524231": "2d2164", + "ad845a": "4058a8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/44.json b/public/images/pokemon/variant/back/44.json new file mode 100644 index 00000000000..0f4b93f23d8 --- /dev/null +++ b/public/images/pokemon/variant/back/44.json @@ -0,0 +1,32 @@ +{ + "1": { + "c57329": "0f7469", + "8c3a19": "043d44", + "5a2900": "162486", + "101010": "101010", + "ce734a": "7aa8d2", + "ffbd42": "55bb7e", + "f7efbd": "7dcf94", + "ad523a": "4d75b6", + "843a19": "2c489f", + "ff7300": "219771", + "4a6b7b": "8259a9", + "10314a": "5d3d90", + "7b84a5": "ac76c7" + }, + "2": { + "c57329": "9f631f", + "8c3a19": "773811", + "5a2900": "680b10", + "101010": "101010", + "ce734a": "d98247", + "ffbd42": "e8d65e", + "f7efbd": "ede68f", + "ad523a": "bd4e2d", + "843a19": "8d1e11", + "ff7300": "bd9434", + "4a6b7b": "792033", + "10314a": "490e23", + "7b84a5": "b33c40" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/441.json b/public/images/pokemon/variant/back/441.json new file mode 100644 index 00000000000..ab17493bee6 --- /dev/null +++ b/public/images/pokemon/variant/back/441.json @@ -0,0 +1,18 @@ +{ + "1": { + "292931": "331d29", + "5a5a63": "8f5a70", + "000000": "000000", + "42424a": "573244", + "c5c5c5": "deacce", + "ffffff": "ffeef7", + "e67b9c": "ffd067", + "c51952": "e6a04c", + "21317b": "7d3023", + "2963b5": "ca6543", + "2994ce": "f28f61", + "216310": "3c3c64", + "f7d642": "cc6b95", + "a58c21": "803d67" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/563_3.json b/public/images/pokemon/variant/back/441_3.json similarity index 58% rename from public/images/pokemon/variant/563_3.json rename to public/images/pokemon/variant/back/441_3.json index 9f6a43a4a97..665d1333603 100644 --- a/public/images/pokemon/variant/563_3.json +++ b/public/images/pokemon/variant/back/441_3.json @@ -1,768 +1,33 @@ { "textures": [ { - "image": "563_3.png", + "image": "441_3.png", "format": "RGBA8888", "size": { - "w": 500, - "h": 500 + "w": 292, + "h": 292 }, "scale": 1, "frames": [ - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, { "filename": "0029.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 13, - "w": 116, - "h": 69 + "y": 5, + "w": 43, + "h": 44 }, "frame": { - "x": 116, + "x": 0, "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 + "w": 43, + "h": 44 } }, { @@ -770,2120 +35,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 191, - "y": 366, - "w": 93, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 18, - "w": 73, - "h": 64 - }, - "frame": { - "x": 96, - "y": 436, - "w": 73, - "h": 64 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 28, - "y": 17, - "w": 52, - "h": 65 - }, - "frame": { - "x": 446, - "y": 0, - "w": 52, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 79 - }, - "frame": { - "x": 303, - "y": 140, - "w": 93, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, + "x": 1, "y": 5, - "w": 93, - "h": 77 + "w": 43, + "h": 44 }, "frame": { - "x": 286, - "y": 297, - "w": 93, - "h": 77 + "x": 0, + "y": 0, + "w": 43, + "h": 44 } }, { - "filename": "0078.png", + "filename": "0063.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 85, - "h": 73 - }, - "frame": { - "x": 284, - "y": 374, - "w": 85, - "h": 73 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, + "x": 1, "y": 5, - "w": 75, - "h": 79 + "w": 43, + "h": 44 }, "frame": { - "x": 396, - "y": 139, - "w": 75, - "h": 79 + "x": 0, + "y": 0, + "w": 43, + "h": 44 } }, { - "filename": "0130.png", + "filename": "0064.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 85, - "h": 79 + "x": 1, + "y": 5, + "w": 43, + "h": 44 }, "frame": { - "x": 384, - "y": 219, - "w": 85, - "h": 79 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 435, - "y": 365, - "w": 59, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 19, - "w": 66, - "h": 63 - }, - "frame": { - "x": 432, - "y": 72, - "w": 66, - "h": 63 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 0, + "y": 0, + "w": 43, + "h": 44 } }, { @@ -2891,20 +98,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 + "x": 1, + "y": 5, + "w": 43, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 0, + "y": 0, + "w": 43, + "h": 44 } }, { @@ -2912,20 +119,293 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 + "x": 1, + "y": 5, + "w": 43, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 0, + "y": 0, + "w": 43, + "h": 44 + } + }, + { + "filename": "0148.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 44 + }, + "frame": { + "x": 0, + "y": 44, + "w": 43, + "h": 44 + } + }, + { + "filename": "0155.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 44 + }, + "frame": { + "x": 0, + "y": 44, + "w": 43, + "h": 44 + } + }, + { + "filename": "0151.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 44 + }, + "frame": { + "x": 0, + "y": 88, + "w": 43, + "h": 44 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 43, + "h": 43 + }, + "frame": { + "x": 0, + "y": 132, + "w": 43, + "h": 43 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 43, + "h": 43 + }, + "frame": { + "x": 0, + "y": 132, + "w": 43, + "h": 43 + } + }, + { + "filename": "0137.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 43, + "h": 43 + }, + "frame": { + "x": 0, + "y": 175, + "w": 43, + "h": 43 + } + }, + { + "filename": "0138.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 43, + "h": 43 + }, + "frame": { + "x": 0, + "y": 175, + "w": 43, + "h": 43 + } + }, + { + "filename": "0139.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 43, + "h": 43 + }, + "frame": { + "x": 0, + "y": 218, + "w": 43, + "h": 43 + } + }, + { + "filename": "0140.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 43, + "h": 43 + }, + "frame": { + "x": 0, + "y": 218, + "w": 43, + "h": 43 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 42, + "h": 44 + }, + "frame": { + "x": 43, + "y": 0, + "w": 42, + "h": 44 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 42, + "h": 44 + }, + "frame": { + "x": 43, + "y": 0, + "w": 42, + "h": 44 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 42, + "h": 44 + }, + "frame": { + "x": 43, + "y": 0, + "w": 42, + "h": 44 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 42, + "h": 44 + }, + "frame": { + "x": 43, + "y": 0, + "w": 42, + "h": 44 } }, { @@ -2933,20 +413,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 3, + "y": 5, + "w": 42, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 43, + "y": 0, + "w": 42, + "h": 44 } }, { @@ -2954,20 +434,335 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 3, + "y": 5, + "w": 42, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 43, + "y": 0, + "w": 42, + "h": 44 + } + }, + { + "filename": "0147.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 45, + "h": 41 + }, + "frame": { + "x": 85, + "y": 0, + "w": 45, + "h": 41 + } + }, + { + "filename": "0153.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 45, + "h": 41 + }, + "frame": { + "x": 85, + "y": 0, + "w": 45, + "h": 41 + } + }, + { + "filename": "0154.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 45, + "h": 41 + }, + "frame": { + "x": 85, + "y": 0, + "w": 45, + "h": 41 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 42, + "h": 43 + }, + "frame": { + "x": 130, + "y": 0, + "w": 42, + "h": 43 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 42, + "h": 43 + }, + "frame": { + "x": 130, + "y": 0, + "w": 42, + "h": 43 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 42, + "h": 43 + }, + "frame": { + "x": 130, + "y": 0, + "w": 42, + "h": 43 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 42, + "h": 43 + }, + "frame": { + "x": 130, + "y": 0, + "w": 42, + "h": 43 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 42, + "h": 43 + }, + "frame": { + "x": 130, + "y": 0, + "w": 42, + "h": 43 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 42, + "h": 43 + }, + "frame": { + "x": 130, + "y": 0, + "w": 42, + "h": 43 + } + }, + { + "filename": "0133.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 42, + "h": 43 + }, + "frame": { + "x": 85, + "y": 41, + "w": 42, + "h": 43 + } + }, + { + "filename": "0134.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 42, + "h": 43 + }, + "frame": { + "x": 85, + "y": 41, + "w": 42, + "h": 43 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 41, + "h": 44 + }, + "frame": { + "x": 43, + "y": 44, + "w": 41, + "h": 44 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 41, + "h": 44 + }, + "frame": { + "x": 43, + "y": 44, + "w": 41, + "h": 44 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 41, + "h": 44 + }, + "frame": { + "x": 43, + "y": 44, + "w": 41, + "h": 44 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 41, + "h": 44 + }, + "frame": { + "x": 43, + "y": 44, + "w": 41, + "h": 44 } }, { @@ -2975,20 +770,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 4, + "y": 5, + "w": 41, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 43, + "y": 44, + "w": 41, + "h": 44 } }, { @@ -2996,20 +791,335 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 4, + "y": 5, + "w": 41, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 43, + "y": 44, + "w": 41, + "h": 44 + } + }, + { + "filename": "0141.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 42, + "h": 42 + }, + "frame": { + "x": 172, + "y": 0, + "w": 42, + "h": 42 + } + }, + { + "filename": "0142.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 42, + "h": 42 + }, + "frame": { + "x": 172, + "y": 0, + "w": 42, + "h": 42 + } + }, + { + "filename": "0159.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 43, + "h": 41 + }, + "frame": { + "x": 214, + "y": 0, + "w": 43, + "h": 41 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 35, + "h": 45 + }, + "frame": { + "x": 257, + "y": 0, + "w": 35, + "h": 45 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 35, + "h": 45 + }, + "frame": { + "x": 257, + "y": 0, + "w": 35, + "h": 45 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 35, + "h": 45 + }, + "frame": { + "x": 257, + "y": 0, + "w": 35, + "h": 45 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 35, + "h": 45 + }, + "frame": { + "x": 257, + "y": 0, + "w": 35, + "h": 45 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 35, + "h": 45 + }, + "frame": { + "x": 257, + "y": 0, + "w": 35, + "h": 45 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 35, + "h": 45 + }, + "frame": { + "x": 257, + "y": 0, + "w": 35, + "h": 45 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 } }, { @@ -3017,20 +1127,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 4, + "y": 6, + "w": 41, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 214, + "y": 41, + "w": 41, + "h": 43 } }, { @@ -3038,62 +1148,230 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 4, + "y": 6, + "w": 41, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 214, + "y": 41, + "w": 41, + "h": 43 } }, { - "filename": "0105.png", + "filename": "0145.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 4, + "y": 6, + "w": 41, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 214, + "y": 41, + "w": 41, + "h": 43 } }, { - "filename": "0106.png", + "filename": "0146.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 4, + "y": 6, + "w": 41, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0152.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0160.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0161.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0162.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0163.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0164.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0165.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 + } + }, + { + "filename": "0166.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 214, + "y": 41, + "w": 41, + "h": 43 } }, { @@ -3101,20 +1379,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 16, + "x": 11, + "y": 5, "w": 37, - "h": 61 + "h": 44 }, "frame": { - "x": 457, - "y": 298, + "x": 255, + "y": 45, "w": 37, - "h": 61 + "h": 44 } }, { @@ -3122,62 +1400,1154 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 16, + "x": 11, + "y": 5, "w": 37, - "h": 61 + "h": 44 }, "frame": { - "x": 457, - "y": 298, + "x": 255, + "y": 45, "w": 37, - "h": 61 + "h": 44 } }, { - "filename": "0109.png", + "filename": "0131.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 + "x": 2, + "y": 6, + "w": 41, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 172, + "y": 42, + "w": 41, + "h": 43 } }, { - "filename": "0110.png", + "filename": "0132.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 + "x": 2, + "y": 6, + "w": 41, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 172, + "y": 42, + "w": 41, + "h": 43 + } + }, + { + "filename": "0143.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 213, + "y": 84, + "w": 41, + "h": 43 + } + }, + { + "filename": "0144.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 41, + "h": 43 + }, + "frame": { + "x": 213, + "y": 84, + "w": 41, + "h": 43 + } + }, + { + "filename": "0157.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 38, + "h": 44 + }, + "frame": { + "x": 254, + "y": 89, + "w": 38, + "h": 44 + } + }, + { + "filename": "0158.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 38, + "h": 44 + }, + "frame": { + "x": 254, + "y": 89, + "w": 38, + "h": 44 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 41, + "h": 42 + }, + "frame": { + "x": 127, + "y": 43, + "w": 41, + "h": 42 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 41, + "h": 42 + }, + "frame": { + "x": 127, + "y": 43, + "w": 41, + "h": 42 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 41, + "h": 42 + }, + "frame": { + "x": 127, + "y": 43, + "w": 41, + "h": 42 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 41, + "h": 42 + }, + "frame": { + "x": 127, + "y": 43, + "w": 41, + "h": 42 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 41, + "h": 42 + }, + "frame": { + "x": 127, + "y": 43, + "w": 41, + "h": 42 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 41, + "h": 42 + }, + "frame": { + "x": 127, + "y": 43, + "w": 41, + "h": 42 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 40, + "h": 43 + }, + "frame": { + "x": 84, + "y": 84, + "w": 40, + "h": 43 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 40, + "h": 43 + }, + "frame": { + "x": 84, + "y": 84, + "w": 40, + "h": 43 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 41, + "h": 41 + }, + "frame": { + "x": 43, + "y": 88, + "w": 41, + "h": 41 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 41, + "h": 41 + }, + "frame": { + "x": 43, + "y": 88, + "w": 41, + "h": 41 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 41, + "h": 41 + }, + "frame": { + "x": 43, + "y": 88, + "w": 41, + "h": 41 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 41, + "h": 41 + }, + "frame": { + "x": 43, + "y": 88, + "w": 41, + "h": 41 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 41, + "h": 41 + }, + "frame": { + "x": 43, + "y": 88, + "w": 41, + "h": 41 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 41, + "h": 41 + }, + "frame": { + "x": 43, + "y": 88, + "w": 41, + "h": 41 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 39, + "h": 43 + }, + "frame": { + "x": 124, + "y": 85, + "w": 39, + "h": 43 + } + }, + { + "filename": "0130.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 39, + "h": 43 + }, + "frame": { + "x": 124, + "y": 85, + "w": 39, + "h": 43 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 40, + "h": 41 + }, + "frame": { + "x": 84, + "y": 127, + "w": 40, + "h": 41 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 40, + "h": 41 + }, + "frame": { + "x": 84, + "y": 127, + "w": 40, + "h": 41 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 40, + "h": 41 + }, + "frame": { + "x": 84, + "y": 127, + "w": 40, + "h": 41 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 40, + "h": 41 + }, + "frame": { + "x": 84, + "y": 127, + "w": 40, + "h": 41 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 40, + "h": 41 + }, + "frame": { + "x": 84, + "y": 127, + "w": 40, + "h": 41 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 40, + "h": 41 + }, + "frame": { + "x": 84, + "y": 127, + "w": 40, + "h": 41 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 38, + "h": 43 + }, + "frame": { + "x": 43, + "y": 129, + "w": 38, + "h": 43 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 38, + "h": 43 + }, + "frame": { + "x": 43, + "y": 129, + "w": 38, + "h": 43 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 36, + "h": 45 + }, + "frame": { + "x": 163, + "y": 85, + "w": 36, + "h": 45 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 36, + "h": 45 + }, + "frame": { + "x": 163, + "y": 85, + "w": 36, + "h": 45 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 36, + "h": 45 + }, + "frame": { + "x": 163, + "y": 85, + "w": 36, + "h": 45 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 36, + "h": 45 + }, + "frame": { + "x": 163, + "y": 85, + "w": 36, + "h": 45 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 36, + "h": 45 + }, + "frame": { + "x": 163, + "y": 85, + "w": 36, + "h": 45 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 36, + "h": 45 + }, + "frame": { + "x": 163, + "y": 85, + "w": 36, + "h": 45 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 39, + "h": 41 + }, + "frame": { + "x": 124, + "y": 128, + "w": 39, + "h": 41 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 39, + "h": 41 + }, + "frame": { + "x": 124, + "y": 128, + "w": 39, + "h": 41 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 39, + "h": 41 + }, + "frame": { + "x": 124, + "y": 128, + "w": 39, + "h": 41 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 39, + "h": 41 + }, + "frame": { + "x": 124, + "y": 128, + "w": 39, + "h": 41 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 39, + "h": 41 + }, + "frame": { + "x": 124, + "y": 128, + "w": 39, + "h": 41 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 39, + "h": 41 + }, + "frame": { + "x": 124, + "y": 128, + "w": 39, + "h": 41 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 81, + "y": 168, + "w": 36, + "h": 44 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 81, + "y": 168, + "w": 36, + "h": 44 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 81, + "y": 168, + "w": 36, + "h": 44 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 81, + "y": 168, + "w": 36, + "h": 44 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 81, + "y": 168, + "w": 36, + "h": 44 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 81, + "y": 168, + "w": 36, + "h": 44 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 43, + "y": 172, + "w": 36, + "h": 44 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 43, + "y": 172, + "w": 36, + "h": 44 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 43, + "y": 172, + "w": 36, + "h": 44 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 43, + "y": 172, + "w": 36, + "h": 44 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 43, + "y": 172, + "w": 36, + "h": 44 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 36, + "h": 44 + }, + "frame": { + "x": 43, + "y": 172, + "w": 36, + "h": 44 } }, { @@ -3185,20 +2555,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 15, + "y": 4, + "w": 35, + "h": 45 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 199, + "y": 127, + "w": 35, + "h": 45 } }, { @@ -3206,20 +2576,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 15, + "y": 4, + "w": 35, + "h": 45 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 199, + "y": 127, + "w": 35, + "h": 45 } }, { @@ -3227,20 +2597,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 15, + "y": 4, + "w": 35, + "h": 45 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 163, + "y": 130, + "w": 35, + "h": 45 } }, { @@ -3248,20 +2618,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 15, + "y": 4, + "w": 35, + "h": 45 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 163, + "y": 130, + "w": 35, + "h": 45 } }, { @@ -3269,20 +2639,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 15, + "y": 4, + "w": 35, + "h": 45 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 117, + "y": 169, + "w": 35, + "h": 45 } }, { @@ -3290,20 +2660,629 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 15, + "y": 4, + "w": 35, + "h": 45 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 117, + "y": 169, + "w": 35, + "h": 45 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 38, + "h": 41 + }, + "frame": { + "x": 79, + "y": 212, + "w": 38, + "h": 41 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 38, + "h": 41 + }, + "frame": { + "x": 79, + "y": 212, + "w": 38, + "h": 41 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 38, + "h": 41 + }, + "frame": { + "x": 79, + "y": 212, + "w": 38, + "h": 41 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 38, + "h": 41 + }, + "frame": { + "x": 79, + "y": 212, + "w": 38, + "h": 41 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 38, + "h": 41 + }, + "frame": { + "x": 79, + "y": 212, + "w": 38, + "h": 41 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 38, + "h": 41 + }, + "frame": { + "x": 79, + "y": 212, + "w": 38, + "h": 41 + } + }, + { + "filename": "0149.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 36, + "h": 43 + }, + "frame": { + "x": 43, + "y": 216, + "w": 36, + "h": 43 + } + }, + { + "filename": "0150.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 36, + "h": 43 + }, + "frame": { + "x": 43, + "y": 216, + "w": 36, + "h": 43 + } + }, + { + "filename": "0156.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 36, + "h": 43 + }, + "frame": { + "x": 43, + "y": 216, + "w": 36, + "h": 43 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 39, + "h": 40 + }, + "frame": { + "x": 234, + "y": 133, + "w": 39, + "h": 40 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 39, + "h": 40 + }, + "frame": { + "x": 234, + "y": 133, + "w": 39, + "h": 40 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 39, + "h": 40 + }, + "frame": { + "x": 234, + "y": 133, + "w": 39, + "h": 40 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 39, + "h": 40 + }, + "frame": { + "x": 234, + "y": 133, + "w": 39, + "h": 40 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 39, + "h": 40 + }, + "frame": { + "x": 234, + "y": 133, + "w": 39, + "h": 40 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 39, + "h": 40 + }, + "frame": { + "x": 234, + "y": 133, + "w": 39, + "h": 40 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 35, + "h": 44 + }, + "frame": { + "x": 198, + "y": 172, + "w": 35, + "h": 44 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 35, + "h": 44 + }, + "frame": { + "x": 198, + "y": 172, + "w": 35, + "h": 44 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 36, + "h": 42 + }, + "frame": { + "x": 152, + "y": 175, + "w": 36, + "h": 42 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 36, + "h": 42 + }, + "frame": { + "x": 152, + "y": 175, + "w": 36, + "h": 42 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 36, + "h": 42 + }, + "frame": { + "x": 152, + "y": 175, + "w": 36, + "h": 42 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 36, + "h": 42 + }, + "frame": { + "x": 152, + "y": 175, + "w": 36, + "h": 42 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 36, + "h": 42 + }, + "frame": { + "x": 152, + "y": 175, + "w": 36, + "h": 42 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 36, + "h": 42 + }, + "frame": { + "x": 152, + "y": 175, + "w": 36, + "h": 42 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 34, + "h": 44 + }, + "frame": { + "x": 117, + "y": 214, + "w": 34, + "h": 44 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 34, + "h": 44 + }, + "frame": { + "x": 117, + "y": 214, + "w": 34, + "h": 44 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 34, + "h": 44 + }, + "frame": { + "x": 117, + "y": 214, + "w": 34, + "h": 44 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 34, + "h": 44 + }, + "frame": { + "x": 117, + "y": 214, + "w": 34, + "h": 44 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 34, + "h": 44 + }, + "frame": { + "x": 117, + "y": 214, + "w": 34, + "h": 44 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 14, + "y": 5, + "w": 34, + "h": 44 + }, + "frame": { + "x": 117, + "y": 214, + "w": 34, + "h": 44 } }, { @@ -3311,20 +3290,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 14, + "y": 5, + "w": 34, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 233, + "y": 173, + "w": 34, + "h": 44 } }, { @@ -3332,20 +3311,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 14, + "y": 5, + "w": 34, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 233, + "y": 173, + "w": 34, + "h": 44 } }, { @@ -3353,20 +3332,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 14, + "y": 5, + "w": 34, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 188, + "y": 216, + "w": 34, + "h": 44 } }, { @@ -3374,20 +3353,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 14, + "y": 5, + "w": 34, + "h": 44 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 188, + "y": 216, + "w": 34, + "h": 44 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 35, + "h": 42 + }, + "frame": { + "x": 151, + "y": 217, + "w": 35, + "h": 42 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 35, + "h": 42 + }, + "frame": { + "x": 151, + "y": 217, + "w": 35, + "h": 42 } }, { @@ -3395,20 +3416,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 13, + "y": 6, + "w": 34, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 222, + "y": 217, + "w": 34, + "h": 43 } }, { @@ -3416,20 +3437,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 13, + "y": 6, + "w": 34, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 222, + "y": 217, + "w": 34, + "h": 43 } }, { @@ -3437,20 +3458,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 12, + "y": 6, + "w": 33, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 256, + "y": 217, + "w": 33, + "h": 43 } }, { @@ -3458,20 +3479,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 122, - "h": 88 + "w": 50, + "h": 49 }, "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 + "x": 12, + "y": 6, + "w": 33, + "h": 43 }, "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 + "x": 256, + "y": 217, + "w": 33, + "h": 43 } } ] @@ -3480,6 +3501,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1c52466e8cdc83633a9fbd5b8675ca7:19652e451f806ac9b4bbb01e17b071df:12f3eae8283ab6c8e555ff3e46b7d8dc$" + "smartupdate": "$TexturePacker:SmartUpdate:8c1d9f2744e9fb2f0436bf84f8f9dd6a:55d0a5ae4dfbbab2e69cc71184f95775:12e566f8808e766b1eff38e5e05b84b4$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/441_3.png b/public/images/pokemon/variant/back/441_3.png new file mode 100644 index 00000000000..271e40e3423 Binary files /dev/null and b/public/images/pokemon/variant/back/441_3.png differ diff --git a/public/images/pokemon/variant/back/445.json b/public/images/pokemon/variant/back/445.json index c5b10066d10..7bf76d03212 100644 --- a/public/images/pokemon/variant/back/445.json +++ b/public/images/pokemon/variant/back/445.json @@ -1,8 +1,8 @@ { "0": { - "292952": "091f4e", - "5a63ad": "33719e", - "42428c": "1e4b77", + "292952": "0a1347", + "5a63ad": "226596", + "42428c": "264074", "7b7bce": "65a2d5", "101010": "101010", "c59410": "3aadc5", diff --git a/public/images/pokemon/variant/back/45.json b/public/images/pokemon/variant/back/45.json new file mode 100644 index 00000000000..ea6e7dea875 --- /dev/null +++ b/public/images/pokemon/variant/back/45.json @@ -0,0 +1,36 @@ +{ + "1": { + "731910": "091d79", + "f78c8c": "8cbef7", + "ffced6": "ceedff", + "f7adb5": "add8f7", + "f77373": "5e8fde", + "de4a5a": "436ac7", + "944a00": "472b86", + "101010": "101010", + "ff8429": "966fbb", + "ce6319": "724ba4", + "19294a": "201349", + "3a4263": "4a2f81", + "9c3a42": "2243ae", + "5a6384": "6e4b9f", + "7384a5": "966fbb" + }, + "2": { + "731910": "97696f", + "f78c8c": "ebe8d1", + "ffced6": "880808", + "f7adb5": "51030e", + "f77373": "d2cbb2", + "de4a5a": "cdb2a2", + "944a00": "621734", + "101010": "101010", + "ff8429": "a23d44", + "ce6319": "8b293e", + "19294a": "510c35", + "3a4263": "8b1b50", + "9c3a42": "bb9089", + "5a6384": "b32952", + "7384a5": "de4263" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/456.json b/public/images/pokemon/variant/back/456.json new file mode 100644 index 00000000000..e10373acbf4 --- /dev/null +++ b/public/images/pokemon/variant/back/456.json @@ -0,0 +1,34 @@ +{ + "1": { + "31425a": "824568", + "526b8c": "966764", + "101010": "101010", + "426b84": "aa6985", + "94d6e6": "f3e1c6", + "29293a": "4f2846", + "7394ad": "cda38c", + "ad8cbd": "ffca7b", + "c54591": "f19e53", + "833171": "d3633a", + "c54a94": "8bbcd9", + "efffff": "efffff", + "73427b": "6d90c2", + "15202e": "15202e" + }, + "2": { + "31425a": "eeb547", + "526b8c": "181e52", + "101010": "101010", + "426b84": "fff8b0", + "94d6e6": "34507e", + "29293a": "d36a2b", + "7394ad": "1c335b", + "ad8cbd": "3979a1", + "c54591": "50a8c2", + "833171": "366ea4", + "c54a94": "7b1615", + "efffff": "efffff", + "73427b": "5e0e0e", + "15202e": "15202e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/4562.json b/public/images/pokemon/variant/back/4562.json new file mode 100644 index 00000000000..9e8c1bee22e --- /dev/null +++ b/public/images/pokemon/variant/back/4562.json @@ -0,0 +1,26 @@ +{ + "1": { + "313131": "145555", + "525252": "257e6a", + "101010": "101010", + "672b82": "7e173e", + "ab38d1": "b0264c", + "371d3f": "371d3f", + "6f5c6b": "743949", + "e6ddde": "d6b8a0", + "927e8d": "a46361", + "c5b9bb": "c69981" + }, + "2": { + "313131": "69162c", + "525252": "90222b", + "101010": "101010", + "672b82": "57a0b9", + "ab38d1": "c2ffe2", + "371d3f": "371d3f", + "6f5c6b": "0a4340", + "e6ddde": "4fb66a", + "927e8d": "1f6455", + "c5b9bb": "298a61" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/457.json b/public/images/pokemon/variant/back/457.json new file mode 100644 index 00000000000..d6a2fad6569 --- /dev/null +++ b/public/images/pokemon/variant/back/457.json @@ -0,0 +1,18 @@ +{ + "2": { + "526b8c": "0f154a", + "101010": "101010", + "c5e6f7": "5781c7", + "94d6e6": "34507e", + "7394ad": "1c335b", + "29293a": "f39c3d", + "31425a": "ffde67", + "303449": "b95735", + "c54591": "ffc369", + "9e357b": "c7703c", + "efffff": "efffff", + "c54a94": "983121", + "73427b": "7b1213", + "26344c": "121c2f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/623_1.json b/public/images/pokemon/variant/back/457_2.json similarity index 64% rename from public/images/pokemon/variant/back/623_1.json rename to public/images/pokemon/variant/back/457_2.json index 893fe66c597..08e4a70f688 100644 --- a/public/images/pokemon/variant/back/623_1.json +++ b/public/images/pokemon/variant/back/457_2.json @@ -1,2721 +1,33 @@ { "textures": [ { - "image": "623_1.png", + "image": "457_2.png", "format": "RGBA8888", "size": { - "w": 392, - "h": 392 + "w": 328, + "h": 328 }, "scale": 1, "frames": [ - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 78, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 79 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 78, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 79 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 0, - "y": 79, - "w": 78, - "h": 78 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 0, - "y": 79, - "w": 78, - "h": 78 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 78, - "y": 0, - "w": 78, - "h": 78 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 78, - "y": 0, - "w": 78, - "h": 78 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 78, - "y": 0, - "w": 78, - "h": 78 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 78, - "y": 0, - "w": 78, - "h": 78 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 0, - "y": 157, - "w": 78, - "h": 78 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 0, - "y": 157, - "w": 78, - "h": 78 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 77, - "h": 79 - }, - "frame": { - "x": 78, - "y": 78, - "w": 77, - "h": 79 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 77, - "h": 79 - }, - "frame": { - "x": 78, - "y": 78, - "w": 77, - "h": 79 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 76, - "h": 80 - }, - "frame": { - "x": 0, - "y": 235, - "w": 76, - "h": 80 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 76, - "h": 80 - }, - "frame": { - "x": 0, - "y": 235, - "w": 76, - "h": 80 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 75, - "h": 79 - }, - "frame": { - "x": 156, - "y": 0, - "w": 75, - "h": 79 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 75, - "h": 79 - }, - "frame": { - "x": 156, - "y": 0, - "w": 75, - "h": 79 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 74, - "h": 80 - }, - "frame": { - "x": 231, - "y": 0, - "w": 74, - "h": 80 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 74, - "h": 80 - }, - "frame": { - "x": 231, - "y": 0, - "w": 74, - "h": 80 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 76, - "y": 235, - "w": 73, - "h": 80 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 76, - "y": 235, - "w": 73, - "h": 80 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, { "filename": "0009.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 + "x": 12, + "y": 5, + "w": 58, + "h": 66 }, "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 + "x": 0, + "y": 0, + "w": 58, + "h": 66 } }, { @@ -2723,524 +35,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 + "x": 12, + "y": 5, + "w": 58, + "h": 66 }, "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 + "w": 58, + "h": 66 } }, { - "filename": "0106.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, + "x": 12, + "y": 9, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 + "w": 58, + "h": 66 } }, { - "filename": "0133.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, + "x": 12, + "y": 5, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 + "w": 58, + "h": 66 } }, { @@ -3248,20 +98,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 + "x": 12, + "y": 9, + "w": 58, + "h": 66 }, "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 + "x": 0, + "y": 0, + "w": 58, + "h": 66 } }, { @@ -3269,83 +119,797 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 + "x": 12, + "y": 9, + "w": 58, + "h": 66 }, "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 + "x": 0, + "y": 0, + "w": 58, + "h": 66 } }, { - "filename": "0079.png", + "filename": "0095.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 + "x": 12, + "y": 5, + "w": 58, + "h": 66 }, "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 + "x": 0, + "y": 0, + "w": 58, + "h": 66 } }, { - "filename": "0080.png", + "filename": "0100.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 + "x": 12, + "y": 9, + "w": 58, + "h": 66 }, "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 + "x": 0, + "y": 0, + "w": 58, + "h": 66 } }, { - "filename": "0091.png", + "filename": "0137.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 + "x": 12, + "y": 5, + "w": 58, + "h": 66 }, "frame": { - "x": 224, - "y": 160, + "x": 0, + "y": 0, + "w": 58, + "h": 66 + } + }, + { + "filename": "0138.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 72, - "h": 78 + "h": 77 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, + "y": 0, + "w": 58, + "h": 66 + } + }, + { + "filename": "0143.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, + "y": 0, + "w": 58, + "h": 66 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, + "y": 66, + "w": 58, + "h": 66 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, + "y": 66, + "w": 58, + "h": 66 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, + "y": 66, + "w": 58, + "h": 66 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, + "y": 66, + "w": 58, + "h": 66 + } + }, + { + "filename": "0144.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 58, + "h": 66 + }, + "frame": { + "x": 0, + "y": 66, + "w": 58, + "h": 66 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 7, + "w": 58, + "h": 65 + }, + "frame": { + "x": 0, + "y": 132, + "w": 58, + "h": 65 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 7, + "w": 58, + "h": 65 + }, + "frame": { + "x": 0, + "y": 132, + "w": 58, + "h": 65 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 7, + "w": 58, + "h": 65 + }, + "frame": { + "x": 0, + "y": 132, + "w": 58, + "h": 65 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 7, + "w": 58, + "h": 65 + }, + "frame": { + "x": 0, + "y": 132, + "w": 58, + "h": 65 + } + }, + { + "filename": "0139.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 7, + "w": 58, + "h": 65 + }, + "frame": { + "x": 0, + "y": 132, + "w": 58, + "h": 65 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 56, + "h": 67 + }, + "frame": { + "x": 0, + "y": 197, + "w": 56, + "h": 67 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 56, + "h": 67 + }, + "frame": { + "x": 0, + "y": 197, + "w": 56, + "h": 67 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 56, + "h": 67 + }, + "frame": { + "x": 0, + "y": 197, + "w": 56, + "h": 67 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 56, + "h": 67 + }, + "frame": { + "x": 0, + "y": 197, + "w": 56, + "h": 67 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 56, + "h": 67 + }, + "frame": { + "x": 0, + "y": 197, + "w": 56, + "h": 67 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 58, + "h": 64 + }, + "frame": { + "x": 0, + "y": 264, + "w": 58, + "h": 64 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 58, + "h": 64 + }, + "frame": { + "x": 0, + "y": 264, + "w": 58, + "h": 64 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 58, + "h": 64 + }, + "frame": { + "x": 0, + "y": 264, + "w": 58, + "h": 64 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 58, + "h": 64 + }, + "frame": { + "x": 0, + "y": 264, + "w": 58, + "h": 64 + } + }, + { + "filename": "0141.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 58, + "h": 64 + }, + "frame": { + "x": 0, + "y": 264, + "w": 58, + "h": 64 + } + }, + { + "filename": "0142.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 58, + "h": 64 + }, + "frame": { + "x": 0, + "y": 264, + "w": 58, + "h": 64 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 15, + "y": 9, + "w": 57, + "h": 65 + }, + "frame": { + "x": 56, + "y": 197, + "w": 57, + "h": 65 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 15, + "y": 9, + "w": 57, + "h": 65 + }, + "frame": { + "x": 56, + "y": 197, + "w": 57, + "h": 65 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 15, + "y": 9, + "w": 57, + "h": 65 + }, + "frame": { + "x": 56, + "y": 197, + "w": 57, + "h": 65 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 15, + "y": 9, + "w": 57, + "h": 65 + }, + "frame": { + "x": 56, + "y": 197, + "w": 57, + "h": 65 + } + }, + { + "filename": "0140.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 15, + "y": 9, + "w": 57, + "h": 65 + }, + "frame": { + "x": 56, + "y": 197, + "w": 57, + "h": 65 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 } }, { @@ -3353,20 +917,188 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 + "x": 11, + "y": 4, + "w": 56, + "h": 66 }, "frame": { - "x": 224, - "y": 160, + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 72, - "h": 78 + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0145.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0146.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 262, + "w": 56, + "h": 66 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 0, + "w": 56, + "h": 66 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 0, + "w": 56, + "h": 66 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 0, + "w": 56, + "h": 66 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 56, + "h": 66 + }, + "frame": { + "x": 58, + "y": 0, + "w": 56, + "h": 66 } }, { @@ -3374,146 +1106,314 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 + "x": 9, + "y": 11, + "w": 56, + "h": 66 }, "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, + "x": 58, "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 221, - "y": 238, - "w": 72, - "h": 80 + "w": 56, + "h": 66 } }, { - "filename": "0108.png", + "filename": "0037.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 + "x": 3, + "y": 2, + "w": 55, + "h": 66 }, "frame": { - "x": 221, - "y": 238, - "w": 72, - "h": 80 + "x": 58, + "y": 66, + "w": 55, + "h": 66 } }, { - "filename": "0131.png", + "filename": "0038.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 + "x": 3, + "y": 2, + "w": 55, + "h": 66 }, "frame": { - "x": 296, - "y": 160, + "x": 58, + "y": 66, + "w": 55, + "h": 66 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 72, - "h": 80 + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 55, + "h": 66 + }, + "frame": { + "x": 58, + "y": 66, + "w": 55, + "h": 66 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 55, + "h": 66 + }, + "frame": { + "x": 58, + "y": 66, + "w": 55, + "h": 66 + } + }, + { + "filename": "0165.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 55, + "h": 66 + }, + "frame": { + "x": 58, + "y": 66, + "w": 55, + "h": 66 + } + }, + { + "filename": "0166.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 55, + "h": 66 + }, + "frame": { + "x": 58, + "y": 66, + "w": 55, + "h": 66 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 } }, { @@ -3521,20 +1421,1868 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 + "x": 10, + "y": 2, + "w": 55, + "h": 65 }, "frame": { - "x": 296, - "y": 160, + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0148.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 72, - "h": 80 + "h": 77 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 58, + "y": 132, + "w": 55, + "h": 65 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0156.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0167.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 66, + "w": 54, + "h": 67 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 114, + "y": 0, + "w": 55, + "h": 65 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 114, + "y": 0, + "w": 55, + "h": 65 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 114, + "y": 0, + "w": 55, + "h": 65 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 114, + "y": 0, + "w": 55, + "h": 65 + } + }, + { + "filename": "0149.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 114, + "y": 0, + "w": 55, + "h": 65 + } + }, + { + "filename": "0150.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 55, + "h": 65 + }, + "frame": { + "x": 114, + "y": 0, + "w": 55, + "h": 65 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 133, + "w": 54, + "h": 67 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 133, + "w": 54, + "h": 67 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 133, + "w": 54, + "h": 67 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 133, + "w": 54, + "h": 67 + } + }, + { + "filename": "0157.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 133, + "w": 54, + "h": 67 + } + }, + { + "filename": "0158.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 67 + }, + "frame": { + "x": 113, + "y": 133, + "w": 54, + "h": 67 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 54, + "h": 67 + }, + "frame": { + "x": 114, + "y": 200, + "w": 54, + "h": 67 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 54, + "h": 67 + }, + "frame": { + "x": 114, + "y": 200, + "w": 54, + "h": 67 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 54, + "h": 67 + }, + "frame": { + "x": 114, + "y": 200, + "w": 54, + "h": 67 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 54, + "h": 67 + }, + "frame": { + "x": 114, + "y": 200, + "w": 54, + "h": 67 + } + }, + { + "filename": "0163.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 54, + "h": 67 + }, + "frame": { + "x": 114, + "y": 200, + "w": 54, + "h": 67 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0133.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0134.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 169, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 169, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 169, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 169, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 169, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0130.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 169, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0155.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 54, + "h": 66 + }, + "frame": { + "x": 167, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0159.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0164.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 54, + "h": 66 + }, + "frame": { + "x": 168, + "y": 197, + "w": 54, + "h": 66 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 53, + "h": 65 + }, + "frame": { + "x": 168, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 53, + "h": 65 + }, + "frame": { + "x": 168, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 53, + "h": 65 + }, + "frame": { + "x": 168, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 53, + "h": 65 + }, + "frame": { + "x": 168, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0151.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 53, + "h": 65 + }, + "frame": { + "x": 168, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 221, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 221, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 221, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 221, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0171.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 221, + "y": 263, + "w": 53, + "h": 65 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0160.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 65, + "w": 54, + "h": 66 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0168.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 54, + "h": 66 + }, + "frame": { + "x": 221, + "y": 131, + "w": 54, + "h": 66 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 222, + "y": 197, + "w": 53, + "h": 66 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 222, + "y": 197, + "w": 53, + "h": 66 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 222, + "y": 197, + "w": 53, + "h": 66 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 222, + "y": 197, + "w": 53, + "h": 66 + } + }, + { + "filename": "0131.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 222, + "y": 197, + "w": 53, + "h": 66 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 53, + "h": 67 + }, + "frame": { + "x": 275, + "y": 0, + "w": 53, + "h": 67 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 53, + "h": 67 + }, + "frame": { + "x": 275, + "y": 0, + "w": 53, + "h": 67 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 53, + "h": 67 + }, + "frame": { + "x": 275, + "y": 0, + "w": 53, + "h": 67 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 53, + "h": 67 + }, + "frame": { + "x": 275, + "y": 0, + "w": 53, + "h": 67 + } + }, + { + "filename": "0161.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 53, + "h": 67 + }, + "frame": { + "x": 275, + "y": 0, + "w": 53, + "h": 67 + } + }, + { + "filename": "0162.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 53, + "h": 67 + }, + "frame": { + "x": 275, + "y": 0, + "w": 53, + "h": 67 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 11, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 67, + "w": 53, + "h": 66 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 11, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 67, + "w": 53, + "h": 66 } }, { @@ -3542,20 +3290,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 71, - "h": 80 + "x": 8, + "y": 11, + "w": 53, + "h": 66 }, "frame": { - "x": 293, - "y": 240, - "w": 71, - "h": 80 + "x": 275, + "y": 67, + "w": 53, + "h": 66 } }, { @@ -3563,20 +3311,293 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 78, - "h": 80 + "w": 72, + "h": 77 }, "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 71, - "h": 80 + "x": 8, + "y": 11, + "w": 53, + "h": 66 }, "frame": { - "x": 293, - "y": 240, - "w": 71, - "h": 80 + "x": 275, + "y": 67, + "w": 53, + "h": 66 + } + }, + { + "filename": "0152.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 8, + "y": 11, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 67, + "w": 53, + "h": 66 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0153.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0154.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0169.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 + } + }, + { + "filename": "0170.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 77 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 53, + "h": 66 + }, + "frame": { + "x": 275, + "y": 133, + "w": 53, + "h": 66 } } ] @@ -3585,6 +3606,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d2a0b4f8d67951bad9facc61ed8ecd29:029ea763f8f267a92908e8da6c5b70c9:869abf8e0bcb859d5abfb33d03e5db07$" + "smartupdate": "$TexturePacker:SmartUpdate:c96de822c8122bad58d81305aec69ce7:b941dede35f725659cb35f39aa363609:4eee87856a136df658e93e41eb89efc1$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/457_2.png b/public/images/pokemon/variant/back/457_2.png new file mode 100644 index 00000000000..9168013d2e6 Binary files /dev/null and b/public/images/pokemon/variant/back/457_2.png differ diff --git a/public/images/pokemon/variant/back/465.json b/public/images/pokemon/variant/back/465.json index c8dad539b75..cc868023c2b 100644 --- a/public/images/pokemon/variant/back/465.json +++ b/public/images/pokemon/variant/back/465.json @@ -8,5 +8,14 @@ "bd216b": "21bd69", "31313a": "31313a", "d65a94": "5ad662" + }, + "2": { + "5a193a": "752e2e", + "31313a": "3d1519", + "d65a94": "e67d2f", + "3a73ad": "ebc582", + "295a84": "ad875a", + "bd216b": "b35131", + "193a63": "705040" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/465_3.json b/public/images/pokemon/variant/back/465_3.json deleted file mode 100644 index 3141b3c6cee..00000000000 --- a/public/images/pokemon/variant/back/465_3.json +++ /dev/null @@ -1,4094 +0,0 @@ -{ - "textures": [ - { - "image": "465_3.png", - "format": "RGBA8888", - "size": { - "w": 407, - "h": 407 - }, - "scale": 1, - "frames": [ - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0185.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0186.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 83, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 64 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0187.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0188.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 74, - "h": 64 - }, - "frame": { - "x": 83, - "y": 0, - "w": 74, - "h": 64 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 83, - "h": 65 - }, - "frame": { - "x": 157, - "y": 0, - "w": 83, - "h": 65 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0171.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0172.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 74, - "h": 65 - }, - "frame": { - "x": 240, - "y": 0, - "w": 74, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0183.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0184.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 93, - "h": 65 - }, - "frame": { - "x": 314, - "y": 0, - "w": 93, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0189.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0190.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 65, - "h": 65 - }, - "frame": { - "x": 0, - "y": 64, - "w": 65, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0179.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0180.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 83, - "h": 66 - }, - "frame": { - "x": 65, - "y": 64, - "w": 83, - "h": 66 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 148, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 148, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 148, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 98, - "h": 65 - }, - "frame": { - "x": 148, - "y": 65, - "w": 98, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 246, - "y": 65, - "w": 88, - "h": 66 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0173.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0174.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 17, - "y": 1, - "w": 65, - "h": 66 - }, - "frame": { - "x": 334, - "y": 65, - "w": 65, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 93, - "h": 66 - }, - "frame": { - "x": 0, - "y": 130, - "w": 93, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0177.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0178.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 93, - "y": 130, - "w": 76, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0191.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0192.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 70, - "h": 66 - }, - "frame": { - "x": 169, - "y": 130, - "w": 70, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0181.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0182.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 88, - "h": 66 - }, - "frame": { - "x": 239, - "y": 131, - "w": 88, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0193.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0194.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 76, - "h": 66 - }, - "frame": { - "x": 327, - "y": 131, - "w": 76, - "h": 66 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 196, - "w": 86, - "h": 66 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 0, - "y": 196, - "w": 86, - "h": 66 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 196, - "w": 90, - "h": 66 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 196, - "w": 90, - "h": 66 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 196, - "w": 90, - "h": 66 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 90, - "h": 66 - }, - "frame": { - "x": 86, - "y": 196, - "w": 90, - "h": 66 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 176, - "y": 197, - "w": 94, - "h": 66 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 176, - "y": 197, - "w": 94, - "h": 66 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 270, - "y": 197, - "w": 97, - "h": 66 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 270, - "y": 197, - "w": 97, - "h": 66 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 98, - "h": 66 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 98, - "h": 66 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 98, - "h": 66 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 0, - "y": 262, - "w": 98, - "h": 66 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0175.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0176.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 70, - "h": 67 - }, - "frame": { - "x": 98, - "y": 262, - "w": 70, - "h": 67 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 168, - "y": 263, - "w": 97, - "h": 66 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 168, - "y": 263, - "w": 97, - "h": 66 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 265, - "y": 263, - "w": 98, - "h": 66 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 98, - "h": 66 - }, - "frame": { - "x": 265, - "y": 263, - "w": 98, - "h": 66 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 0, - "y": 328, - "w": 97, - "h": 66 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 0, - "y": 328, - "w": 97, - "h": 66 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 97, - "y": 329, - "w": 97, - "h": 66 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 97, - "h": 66 - }, - "frame": { - "x": 97, - "y": 329, - "w": 97, - "h": 66 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 194, - "y": 329, - "w": 94, - "h": 66 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 94, - "h": 66 - }, - "frame": { - "x": 194, - "y": 329, - "w": 94, - "h": 66 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 288, - "y": 329, - "w": 86, - "h": 66 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 98, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 86, - "h": 66 - }, - "frame": { - "x": 288, - "y": 329, - "w": 86, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cd959f202c47f9ac8c3bb6f34f5e04e0:4fa06c9f7e584689369e76122c6343e8:06d67de9e8d7f60fc986e0c00145d6b1$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/465_3.png b/public/images/pokemon/variant/back/465_3.png deleted file mode 100644 index 876725447af..00000000000 Binary files a/public/images/pokemon/variant/back/465_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/467.json b/public/images/pokemon/variant/back/467.json new file mode 100644 index 00000000000..8371e4c36a2 --- /dev/null +++ b/public/images/pokemon/variant/back/467.json @@ -0,0 +1,54 @@ +{ + "1": { + "9e3248": "8c3313", + "846321": "8c3313", + "752e35": "1f1d19", + "f76331": "fb832b", + "773b4d": "6e2d1b", + "e64231": "db4d19", + "d63131": "ba4014", + "953f47": "8c3313", + "101010": "101010", + "612922": "8c3313", + "ff94a5": "fb832b", + "c55a6b": "db4d19", + "4a4a42": "4a4a42", + "ca2b2b": "372d49", + "a1354b": "272034", + "cea53a": "db4d19", + "ffc53a": "fb832b", + "bc5969": "474139", + "ff9dad": "777066", + "ced6e6": "ced6e6", + "662f20": "8c3313", + "e2937a": "fb832b", + "b14849": "db4d19", + "4f433f": "1f1d19" + }, + "2": { + "9e3248": "31508c", + "846321": "699296", + "752e35": "2a2523", + "f76331": "5398cf", + "773b4d": "31508c", + "e64231": "478bc0", + "d63131": "4065b0", + "953f47": "4065b0", + "101010": "101010", + "612922": "699296", + "ff94a5": "eaffff", + "c55a6b": "c6edf2", + "4a4a42": "4a4a42", + "ca2b2b": "4065b0", + "a1354b": "31508c", + "cea53a": "c6edf2", + "ffc53a": "eaffff", + "bc5969": "7f90a9", + "ff9dad": "abc7de", + "ced6e6": "ced6e6", + "662f20": "2a2523", + "e2937a": "eaffff", + "b14849": "4065b0", + "4f433f": "699296" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/469.json b/public/images/pokemon/variant/back/469.json new file mode 100644 index 00000000000..d07bfada1c8 --- /dev/null +++ b/public/images/pokemon/variant/back/469.json @@ -0,0 +1,34 @@ +{ + "1": { + "797982": "ba4369", + "52844a": "c59eff", + "f75a52": "5555ab", + "47474f": "6143b3", + "a5adc5": "6e8ce0", + "b53119": "403a91", + "739c63": "dfbaff", + "4a4a52": "942b5a", + "213a19": "534fab", + "ffffff": "c4f2ff", + "733100": "322966", + "c5cee6": "91c2fa", + "3a5a29": "8577e0", + "7b7b84": "3b3687" + }, + "2": { + "797982": "516d82", + "52844a": "e0a14f", + "f75a52": "21b0a6", + "47474f": "4f6b80", + "a5adc5": "678ea6", + "b53119": "2c8199", + "739c63": "ebcf7c", + "4a4a52": "2e4a52", + "213a19": "70331d", + "ffffff": "c1dede", + "733100": "2e5785", + "c5cee6": "97c0c4", + "3a5a29": "965a2f", + "7b7b84": "4d687d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/469_2.json b/public/images/pokemon/variant/back/469_2.json new file mode 100644 index 00000000000..027da773e1c --- /dev/null +++ b/public/images/pokemon/variant/back/469_2.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "469_2.png", + "format": "RGBA8888", + "size": { + "w": 513, + "h": 513 + }, + "scale": 1, + "frames": [ + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 88, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 46 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 88, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 46 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 87, + "h": 47 + }, + "frame": { + "x": 88, + "y": 0, + "w": 87, + "h": 47 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 87, + "h": 47 + }, + "frame": { + "x": 88, + "y": 0, + "w": 87, + "h": 47 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 87, + "h": 47 + }, + "frame": { + "x": 175, + "y": 0, + "w": 87, + "h": 47 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 87, + "h": 47 + }, + "frame": { + "x": 175, + "y": 0, + "w": 87, + "h": 47 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 87, + "h": 47 + }, + "frame": { + "x": 262, + "y": 0, + "w": 87, + "h": 47 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 87, + "h": 47 + }, + "frame": { + "x": 262, + "y": 0, + "w": 87, + "h": 47 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 87, + "h": 48 + }, + "frame": { + "x": 349, + "y": 0, + "w": 87, + "h": 48 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 87, + "h": 48 + }, + "frame": { + "x": 349, + "y": 0, + "w": 87, + "h": 48 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 12, + "y": 25, + "w": 77, + "h": 65 + }, + "frame": { + "x": 436, + "y": 0, + "w": 77, + "h": 65 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 87, + "h": 48 + }, + "frame": { + "x": 0, + "y": 46, + "w": 87, + "h": 48 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 87, + "h": 48 + }, + "frame": { + "x": 0, + "y": 46, + "w": 87, + "h": 48 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 86, + "h": 48 + }, + "frame": { + "x": 87, + "y": 47, + "w": 86, + "h": 48 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 86, + "h": 48 + }, + "frame": { + "x": 87, + "y": 47, + "w": 86, + "h": 48 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 29, + "w": 87, + "h": 49 + }, + "frame": { + "x": 173, + "y": 47, + "w": 87, + "h": 49 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 87, + "h": 49 + }, + "frame": { + "x": 173, + "y": 47, + "w": 87, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 87, + "h": 50 + }, + "frame": { + "x": 260, + "y": 47, + "w": 87, + "h": 50 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 22, + "w": 87, + "h": 50 + }, + "frame": { + "x": 260, + "y": 47, + "w": 87, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 87, + "h": 50 + }, + "frame": { + "x": 347, + "y": 48, + "w": 87, + "h": 50 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 14, + "w": 87, + "h": 50 + }, + "frame": { + "x": 347, + "y": 48, + "w": 87, + "h": 50 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 10, + "y": 25, + "w": 79, + "h": 65 + }, + "frame": { + "x": 434, + "y": 65, + "w": 79, + "h": 65 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 21, + "w": 87, + "h": 50 + }, + "frame": { + "x": 0, + "y": 94, + "w": 87, + "h": 50 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 87, + "h": 50 + }, + "frame": { + "x": 0, + "y": 94, + "w": 87, + "h": 50 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 29, + "w": 86, + "h": 50 + }, + "frame": { + "x": 87, + "y": 95, + "w": 86, + "h": 50 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 86, + "h": 50 + }, + "frame": { + "x": 87, + "y": 95, + "w": 86, + "h": 50 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 86, + "h": 51 + }, + "frame": { + "x": 173, + "y": 96, + "w": 86, + "h": 51 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 51 + }, + "frame": { + "x": 173, + "y": 96, + "w": 86, + "h": 51 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 86, + "h": 52 + }, + "frame": { + "x": 259, + "y": 97, + "w": 86, + "h": 52 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 7, + "y": 26, + "w": 86, + "h": 52 + }, + "frame": { + "x": 259, + "y": 97, + "w": 86, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 86, + "h": 52 + }, + "frame": { + "x": 259, + "y": 97, + "w": 86, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 24, + "w": 86, + "h": 52 + }, + "frame": { + "x": 259, + "y": 97, + "w": 86, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 86, + "h": 52 + }, + "frame": { + "x": 345, + "y": 98, + "w": 86, + "h": 52 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 14, + "w": 86, + "h": 52 + }, + "frame": { + "x": 345, + "y": 98, + "w": 86, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 8, + "y": 25, + "w": 81, + "h": 60 + }, + "frame": { + "x": 431, + "y": 130, + "w": 81, + "h": 60 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 5, + "y": 12, + "w": 81, + "h": 60 + }, + "frame": { + "x": 431, + "y": 130, + "w": 81, + "h": 60 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 21, + "w": 86, + "h": 52 + }, + "frame": { + "x": 0, + "y": 144, + "w": 86, + "h": 52 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 86, + "h": 52 + }, + "frame": { + "x": 0, + "y": 144, + "w": 86, + "h": 52 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 86, + "h": 53 + }, + "frame": { + "x": 86, + "y": 145, + "w": 86, + "h": 53 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 7, + "y": 25, + "w": 86, + "h": 53 + }, + "frame": { + "x": 86, + "y": 145, + "w": 86, + "h": 53 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 86, + "h": 53 + }, + "frame": { + "x": 86, + "y": 145, + "w": 86, + "h": 53 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 53 + }, + "frame": { + "x": 86, + "y": 145, + "w": 86, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 86, + "h": 53 + }, + "frame": { + "x": 172, + "y": 147, + "w": 86, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 20, + "w": 86, + "h": 53 + }, + "frame": { + "x": 172, + "y": 147, + "w": 86, + "h": 53 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 86, + "h": 53 + }, + "frame": { + "x": 172, + "y": 147, + "w": 86, + "h": 53 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 53 + }, + "frame": { + "x": 172, + "y": 147, + "w": 86, + "h": 53 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 6, + "y": 29, + "w": 86, + "h": 53 + }, + "frame": { + "x": 258, + "y": 149, + "w": 86, + "h": 53 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 86, + "h": 53 + }, + "frame": { + "x": 258, + "y": 149, + "w": 86, + "h": 53 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 53 + }, + "frame": { + "x": 258, + "y": 149, + "w": 86, + "h": 53 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 86, + "h": 53 + }, + "frame": { + "x": 258, + "y": 149, + "w": 86, + "h": 53 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 6, + "y": 29, + "w": 86, + "h": 53 + }, + "frame": { + "x": 344, + "y": 150, + "w": 86, + "h": 53 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 86, + "h": 53 + }, + "frame": { + "x": 344, + "y": 150, + "w": 86, + "h": 53 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 53 + }, + "frame": { + "x": 344, + "y": 150, + "w": 86, + "h": 53 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 86, + "h": 53 + }, + "frame": { + "x": 344, + "y": 150, + "w": 86, + "h": 53 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 6, + "y": 19, + "w": 83, + "h": 58 + }, + "frame": { + "x": 430, + "y": 190, + "w": 83, + "h": 58 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 4, + "y": 15, + "w": 83, + "h": 58 + }, + "frame": { + "x": 430, + "y": 190, + "w": 83, + "h": 58 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 9, + "y": 28, + "w": 85, + "h": 53 + }, + "frame": { + "x": 0, + "y": 196, + "w": 85, + "h": 53 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 9, + "y": 28, + "w": 85, + "h": 53 + }, + "frame": { + "x": 85, + "y": 198, + "w": 85, + "h": 53 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 86, + "h": 53 + }, + "frame": { + "x": 170, + "y": 200, + "w": 86, + "h": 53 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 53 + }, + "frame": { + "x": 170, + "y": 200, + "w": 86, + "h": 53 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 86, + "h": 53 + }, + "frame": { + "x": 170, + "y": 200, + "w": 86, + "h": 53 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 86, + "h": 53 + }, + "frame": { + "x": 256, + "y": 202, + "w": 86, + "h": 53 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 53 + }, + "frame": { + "x": 256, + "y": 202, + "w": 86, + "h": 53 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 86, + "h": 53 + }, + "frame": { + "x": 256, + "y": 202, + "w": 86, + "h": 53 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 11, + "w": 86, + "h": 54 + }, + "frame": { + "x": 342, + "y": 203, + "w": 86, + "h": 54 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 7, + "y": 25, + "w": 86, + "h": 54 + }, + "frame": { + "x": 342, + "y": 203, + "w": 86, + "h": 54 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 86, + "h": 54 + }, + "frame": { + "x": 342, + "y": 203, + "w": 86, + "h": 54 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 54 + }, + "frame": { + "x": 342, + "y": 203, + "w": 86, + "h": 54 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 23, + "w": 84, + "h": 54 + }, + "frame": { + "x": 428, + "y": 248, + "w": 84, + "h": 54 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 85, + "h": 54 + }, + "frame": { + "x": 0, + "y": 249, + "w": 85, + "h": 54 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 4, + "y": 14, + "w": 85, + "h": 55 + }, + "frame": { + "x": 85, + "y": 251, + "w": 85, + "h": 55 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 20, + "w": 85, + "h": 55 + }, + "frame": { + "x": 85, + "y": 251, + "w": 85, + "h": 55 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 11, + "w": 86, + "h": 54 + }, + "frame": { + "x": 170, + "y": 253, + "w": 86, + "h": 54 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 22, + "w": 86, + "h": 54 + }, + "frame": { + "x": 170, + "y": 253, + "w": 86, + "h": 54 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 86, + "h": 54 + }, + "frame": { + "x": 170, + "y": 253, + "w": 86, + "h": 54 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 23, + "w": 86, + "h": 54 + }, + "frame": { + "x": 170, + "y": 253, + "w": 86, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 86, + "h": 54 + }, + "frame": { + "x": 256, + "y": 255, + "w": 86, + "h": 54 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 22, + "w": 86, + "h": 54 + }, + "frame": { + "x": 256, + "y": 255, + "w": 86, + "h": 54 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 28, + "w": 86, + "h": 54 + }, + "frame": { + "x": 342, + "y": 257, + "w": 86, + "h": 54 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 86, + "h": 54 + }, + "frame": { + "x": 342, + "y": 257, + "w": 86, + "h": 54 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 4, + "y": 13, + "w": 85, + "h": 55 + }, + "frame": { + "x": 428, + "y": 302, + "w": 85, + "h": 55 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 19, + "w": 85, + "h": 55 + }, + "frame": { + "x": 428, + "y": 302, + "w": 85, + "h": 55 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 5, + "y": 19, + "w": 84, + "h": 56 + }, + "frame": { + "x": 0, + "y": 303, + "w": 84, + "h": 56 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 15, + "w": 84, + "h": 56 + }, + "frame": { + "x": 0, + "y": 303, + "w": 84, + "h": 56 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 86, + "h": 54 + }, + "frame": { + "x": 84, + "y": 306, + "w": 86, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 86, + "h": 54 + }, + "frame": { + "x": 170, + "y": 307, + "w": 86, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 86, + "h": 55 + }, + "frame": { + "x": 256, + "y": 309, + "w": 86, + "h": 55 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 20, + "w": 86, + "h": 55 + }, + "frame": { + "x": 256, + "y": 309, + "w": 86, + "h": 55 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 21, + "w": 86, + "h": 55 + }, + "frame": { + "x": 256, + "y": 309, + "w": 86, + "h": 55 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 86, + "h": 55 + }, + "frame": { + "x": 342, + "y": 311, + "w": 86, + "h": 55 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 18, + "w": 86, + "h": 55 + }, + "frame": { + "x": 342, + "y": 311, + "w": 86, + "h": 55 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 3, + "y": 21, + "w": 86, + "h": 55 + }, + "frame": { + "x": 342, + "y": 311, + "w": 86, + "h": 55 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 5, + "y": 14, + "w": 84, + "h": 56 + }, + "frame": { + "x": 428, + "y": 357, + "w": 84, + "h": 56 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 4, + "y": 20, + "w": 84, + "h": 56 + }, + "frame": { + "x": 428, + "y": 357, + "w": 84, + "h": 56 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 22, + "w": 84, + "h": 57 + }, + "frame": { + "x": 0, + "y": 359, + "w": 84, + "h": 57 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 0, + "y": 22, + "w": 84, + "h": 57 + }, + "frame": { + "x": 84, + "y": 360, + "w": 84, + "h": 57 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 84, + "h": 57 + }, + "frame": { + "x": 84, + "y": 360, + "w": 84, + "h": 57 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 85, + "h": 57 + }, + "frame": { + "x": 168, + "y": 361, + "w": 85, + "h": 57 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 5, + "y": 25, + "w": 83, + "h": 59 + }, + "frame": { + "x": 253, + "y": 364, + "w": 83, + "h": 59 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 83, + "h": 59 + }, + "frame": { + "x": 253, + "y": 364, + "w": 83, + "h": 59 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 6, + "y": 25, + "w": 82, + "h": 61 + }, + "frame": { + "x": 336, + "y": 366, + "w": 82, + "h": 61 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 82, + "h": 61 + }, + "frame": { + "x": 336, + "y": 366, + "w": 82, + "h": 61 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 9, + "y": 26, + "w": 80, + "h": 62 + }, + "frame": { + "x": 418, + "y": 413, + "w": 80, + "h": 62 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 80, + "h": 62 + }, + "frame": { + "x": 418, + "y": 413, + "w": 80, + "h": 62 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 9, + "y": 25, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 416, + "w": 80, + "h": 62 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 6, + "y": 12, + "w": 80, + "h": 62 + }, + "frame": { + "x": 0, + "y": 416, + "w": 80, + "h": 62 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 9, + "y": 25, + "w": 80, + "h": 63 + }, + "frame": { + "x": 80, + "y": 417, + "w": 80, + "h": 63 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 80, + "h": 63 + }, + "frame": { + "x": 80, + "y": 417, + "w": 80, + "h": 63 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 9, + "y": 25, + "w": 80, + "h": 63 + }, + "frame": { + "x": 160, + "y": 418, + "w": 80, + "h": 63 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 80, + "h": 63 + }, + "frame": { + "x": 160, + "y": 418, + "w": 80, + "h": 63 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 79, + "h": 66 + }, + "frame": { + "x": 240, + "y": 423, + "w": 79, + "h": 66 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 94, + "h": 90 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 77, + "h": 66 + }, + "frame": { + "x": 319, + "y": 427, + "w": 77, + "h": 66 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:43c807a42a007bc99e5289888b5fe3a7:0e32d8a925df6c60a22c0faea437ed0c:c00bbabb917bffee4efc8a00433e2079$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/469_2.png b/public/images/pokemon/variant/back/469_2.png new file mode 100644 index 00000000000..6e064707bba Binary files /dev/null and b/public/images/pokemon/variant/back/469_2.png differ diff --git a/public/images/pokemon/variant/back/472.json b/public/images/pokemon/variant/back/472.json index a47102ad603..eedf44dc6ec 100644 --- a/public/images/pokemon/variant/back/472.json +++ b/public/images/pokemon/variant/back/472.json @@ -1,15 +1,25 @@ { "1": { "5a63a5": "974d16", - "293163": "401b02", - "9c8cef": "d28b36", - "b5a5ff": "e9bb57", "737bc5": "b86f27", - "ffffff": "ffffff", - "101010": "101010", - "6b6b7b": "48487a", - "424252": "2a2752", + "ad2131": "2a6197", + "9c8cef": "d28b36", "730800": "143262", - "ad2131": "2a6197" + "293163": "401b02", + "424252": "2a2752", + "b5a5ff": "e9bb57", + "6b6b7b": "48487a" + }, + "2": { + "5a63a5": "731e37", + "737bc5": "952b41", + "ad2131": "594b6a", + "9c8cef": "b3404a", + "730800": "262138", + "293163": "43050d", + "424252": "57b6a6", + "b5a5ff": "eb6a64", + "0d0d0d": "1a554f", + "6b6b7b": "81e4c2" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/474.json b/public/images/pokemon/variant/back/474.json new file mode 100644 index 00000000000..2490d3fd713 --- /dev/null +++ b/public/images/pokemon/variant/back/474.json @@ -0,0 +1,34 @@ +{ + "1": { + "5a3a4a": "9e264e", + "ef5a63": "f8a8e6", + "94426b": "d95492", + "101010": "101010", + "bd4a6b": "e883c8", + "ff94b5": "fccef2", + "ffffff": "ffffff", + "313a63": "110a25", + "31739c": "271a3e", + "8cd6ff": "5e4868", + "4a9cd6": "402c4f", + "ffd663": "887acd", + "b5944a": "5e3bc0", + "636342": "31128a" + }, + "2": { + "5a3a4a": "31150e", + "ef5a63": "82391d", + "94426b": "491c0c", + "101010": "101010", + "bd4a6b": "612a17", + "ff94b5": "a04c27", + "ffffff": "ffe4d4", + "313a63": "b77751", + "31739c": "cf8556", + "8cd6ff": "ffd9ab", + "4a9cd6": "efb787", + "ffd663": "a56d40", + "b5944a": "6f3f22", + "636342": "41281a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/479-fan.json b/public/images/pokemon/variant/back/479-fan.json new file mode 100644 index 00000000000..60cb7e4fc50 --- /dev/null +++ b/public/images/pokemon/variant/back/479-fan.json @@ -0,0 +1,28 @@ +{ + "1": { + "d6ad00": "204336", + "ffe65a": "648c50", + "ffefa5": "9ea436", + "ffffff": "fbffbd", + "c54a19": "205027", + "7b3a21": "113526", + "ef7329": "417131", + "ffad84": "819d56", + "101010": "101010", + "4a4a52": "2e3f18", + "bdbdbd": "bdbdbd" + }, + "2": { + "d6ad00": "adbed7", + "ffe65a": "d9e1ec", + "ffefa5": "edf2fa", + "ffffff": "ffffff", + "c54a19": "cbb240", + "7b3a21": "ad7d28", + "ef7329": "e4de6d", + "ffad84": "fcfebf", + "101010": "101010", + "4a4a52": "374f6c", + "bdbdbd": "bdbdbd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/479-frost.json b/public/images/pokemon/variant/back/479-frost.json new file mode 100644 index 00000000000..357bc3ceb99 --- /dev/null +++ b/public/images/pokemon/variant/back/479-frost.json @@ -0,0 +1,26 @@ +{ + "1": { + "b552ce": "204336", + "ce73ff": "648c50", + "de9cff": "9ea436", + "7b3a21": "183b29", + "101010": "101010", + "ef7329": "417131", + "c54a19": "205027", + "292929": "292929", + "4a4a52": "4a4a52", + "ffffff": "fbffbd" + }, + "2": { + "b552ce": "2b95c5", + "ce73ff": "59b5d7", + "de9cff": "8ed4e9", + "7b3a21": "536d8c", + "101010": "101010", + "ef7329": "c5cbe5", + "c54a19": "93a5ba", + "292929": "292929", + "4a4a52": "4a4a52", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/479-heat.json b/public/images/pokemon/variant/back/479-heat.json new file mode 100644 index 00000000000..eb5aa5503f2 --- /dev/null +++ b/public/images/pokemon/variant/back/479-heat.json @@ -0,0 +1,26 @@ +{ + "1": { + "bd2929": "204336", + "ff4231": "648c50", + "ff9c94": "9ea436", + "ffffff": "fbffbd", + "7b3a21": "143b2b", + "ffad84": "819d56", + "c54a19": "205027", + "ef7329": "417131", + "101010": "101010", + "292929": "142a1f" + }, + "2": { + "bd2929": "cbbf4c", + "ff4231": "f5f4ab", + "ff9c94": "fdffe1", + "ffffff": "ffffff", + "7b3a21": "9e3867", + "ffad84": "ffd5d0", + "c54a19": "d06280", + "ef7329": "ff8493", + "101010": "101010", + "292929": "581944" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/479-mow.json b/public/images/pokemon/variant/back/479-mow.json new file mode 100644 index 00000000000..b05f61a329c --- /dev/null +++ b/public/images/pokemon/variant/back/479-mow.json @@ -0,0 +1,26 @@ +{ + "1": { + "009c00": "204336", + "00ce00": "648c50", + "8cf7ad": "9ea436", + "7b3a21": "183b29", + "c54a19": "205027", + "ef7329": "417131", + "ffad84": "819d56", + "101010": "101010", + "4a4a52": "183b29", + "ffffff": "fbffbd" + }, + "2": { + "009c00": "b01145", + "00ce00": "e14b6e", + "8cf7ad": "ffbcc2", + "7b3a21": "064f40", + "c54a19": "147a5c", + "ef7329": "279e69", + "ffad84": "6ada9c", + "101010": "101010", + "4a4a52": "4a4a52", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/479-wash.json b/public/images/pokemon/variant/back/479-wash.json new file mode 100644 index 00000000000..eac753f790f --- /dev/null +++ b/public/images/pokemon/variant/back/479-wash.json @@ -0,0 +1,28 @@ +{ + "1": { + "4a7bff": "648c50", + "084ac5": "204336", + "8cbdf7": "9ea436", + "c54a19": "205027", + "101010": "101010", + "ffad84": "819d56", + "7b3a21": "143b2b", + "ef7329": "417131", + "4a4a52": "183b29", + "292929": "292929", + "ffffff": "fbffbd" + }, + "2": { + "4a7bff": "6de1a7", + "084ac5": "1aac79", + "8cbdf7": "b4feca", + "c54a19": "53abd0", + "101010": "101010", + "ffad84": "bbf7fe", + "7b3a21": "255e90", + "ef7329": "86d7ec", + "4a4a52": "4a4a52", + "292929": "292929", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/479.json b/public/images/pokemon/variant/back/479.json new file mode 100644 index 00000000000..e6bd74a3c5a --- /dev/null +++ b/public/images/pokemon/variant/back/479.json @@ -0,0 +1,28 @@ +{ + "1": { + "5ac5bd": "648c50", + "bdf7ef": "9ea436", + "ffffff": "fbffbd", + "c54a19": "205027", + "7b3a21": "143b2b", + "ef7329": "417131", + "101010": "101010", + "bdbdbd": "d8e082", + "0842ad": "648c50", + "317bef": "89a271", + "29adbd": "204336" + }, + "2": { + "5ac5bd": "64da6a", + "bdf7ef": "d7f3c1", + "ffffff": "ffffff", + "c54a19": "2e3948", + "7b3a21": "242834", + "ef7329": "4d5262", + "101010": "101010", + "bdbdbd": "bdbdbd", + "0842ad": "c95367", + "317bef": "e9919c", + "29adbd": "1fb18e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/524.json b/public/images/pokemon/variant/back/524.json new file mode 100644 index 00000000000..3ce39b1bc45 --- /dev/null +++ b/public/images/pokemon/variant/back/524.json @@ -0,0 +1,20 @@ +{ + "1": { + "000000": "000000", + "3a2119": "4d8c77", + "5a4231": "63a690", + "7b5a4a": "97d9c3", + "19213a": "292538", + "293a6b": "464558", + "42528c": "656273" + }, + "2": { + "000000": "000000", + "3a2119": "292933", + "5a4231": "515266", + "7b5a4a": "979bb3", + "19213a": "584245", + "293a6b": "9b7570", + "42528c": "cdac94" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/525.json b/public/images/pokemon/variant/back/525.json new file mode 100644 index 00000000000..da6fd7b6282 --- /dev/null +++ b/public/images/pokemon/variant/back/525.json @@ -0,0 +1,22 @@ +{ + "1": { + "21293a": "292538", + "293a6b": "464558", + "42528c": "656273", + "101010": "101010", + "733121": "0c3b37", + "ff6b52": "bcf1a6", + "ce4a3a": "50cd61", + "ad2919": "0d6d58" + }, + "2": { + "21293a": "584245", + "293a6b": "9b7570", + "42528c": "cdac94", + "101010": "101010", + "733121": "733120", + "ff6b52": "eeb570", + "ce4a3a": "dc6c44", + "ad2919": "a7323b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/526.json b/public/images/pokemon/variant/back/526.json new file mode 100644 index 00000000000..f6cf26e75fc --- /dev/null +++ b/public/images/pokemon/variant/back/526.json @@ -0,0 +1,28 @@ +{ + "1": { + "000000": "000000", + "e63131": "50cd61", + "6b2121": "0c3b37", + "9c3131": "0d6d58", + "293a6b": "464558", + "212129": "191721", + "42528c": "656273", + "ef7373": "bcf1a6", + "212942": "292538", + "4a4a4a": "788b9c", + "848484": "afc1c8" + }, + "2": { + "000000": "000000", + "e63131": "dc6c44", + "6b2121": "733120", + "9c3131": "a7323b", + "293a6b": "9b7570", + "212129": "251315", + "42528c": "cdac94", + "ef7373": "eeb570", + "212942": "584245", + "4a4a4a": "661a1a", + "848484": "802626" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/553.json b/public/images/pokemon/variant/back/553.json index 63d29c62863..aa8ea69e2ad 100644 --- a/public/images/pokemon/variant/back/553.json +++ b/public/images/pokemon/variant/back/553.json @@ -1,13 +1,13 @@ { "1": { "101010": "101010", - "8c3142": "143a4b", + "8c3142": "164954", "212129": "192540", "c55252": "1b7871", "e67b73": "40a592", "522921": "0b2033", "525263": "6b3b20", - "191921": "100f2b", + "191921": "161a38", "b5b5b5": "c98e5c", "ffffff": "ffefa7" }, diff --git a/public/images/pokemon/variant/back/556.json b/public/images/pokemon/variant/back/556.json new file mode 100644 index 00000000000..3863d4bda29 --- /dev/null +++ b/public/images/pokemon/variant/back/556.json @@ -0,0 +1,34 @@ +{ + "1": { + "b53175": "7191ca", + "e66ba5": "aad7ec", + "ce4a8c": "95bcdb", + "8c1957": "454792", + "101010": "101010", + "b59c10": "d66430", + "ffd600": "ff9b3b", + "429c4a": "acd2d3", + "214a21": "375460", + "857510": "8d4026", + "5ad66b": "eff8f5", + "196352": "467398", + "083b2d": "1c3d71", + "108c73": "5fa7b3" + }, + "2": { + "b53175": "dc9bbd", + "e66ba5": "ffcadc", + "ce4a8c": "eea9be", + "8c1957": "b06ea0", + "101010": "101010", + "b59c10": "e0be7a", + "ffd600": "fff1ac", + "429c4a": "971746", + "214a21": "68023b", + "857510": "c78366", + "5ad66b": "d6375e", + "196352": "4a7640", + "083b2d": "1e3822", + "108c73": "90b452" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/594.json b/public/images/pokemon/variant/back/594.json new file mode 100644 index 00000000000..22beae73c5e --- /dev/null +++ b/public/images/pokemon/variant/back/594.json @@ -0,0 +1,16 @@ +{ + "1": { + "8c4263": "aa3a18", + "ffbdbd": "f9c976", + "c55a7b": "ca4f16", + "ff8cad": "f5a454", + "f77384": "e37830", + "633a42": "882915", + "000000": "000000", + "e68c9c": "d68147", + "005263": "681f16", + "002931": "310000", + "9c8c10": "a74c8e", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/594_3.json b/public/images/pokemon/variant/back/594_3.json new file mode 100644 index 00000000000..8a642eeaca1 --- /dev/null +++ b/public/images/pokemon/variant/back/594_3.json @@ -0,0 +1,2708 @@ +{ + "textures": [ + { + "image": "594_3.png", + "format": "RGBA8888", + "size": { + "w": 265, + "h": 265 + }, + "scale": 1, + "frames": [ + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 81 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 40, + "y": 0, + "w": 39, + "h": 81 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 40, + "y": 0, + "w": 39, + "h": 81 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 40, + "y": 0, + "w": 39, + "h": 81 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 40, + "y": 0, + "w": 39, + "h": 81 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 40, + "y": 0, + "w": 39, + "h": 81 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 40, + "y": 0, + "w": 39, + "h": 81 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 39, + "h": 81 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 39, + "h": 81 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 39, + "h": 81 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 39, + "h": 81 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 39, + "h": 81 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 39, + "h": 81 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 39, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 39, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 39, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 39, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 39, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 39, + "h": 81 + }, + "frame": { + "x": 39, + "y": 81, + "w": 39, + "h": 81 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 38, + "h": 81 + }, + "frame": { + "x": 79, + "y": 0, + "w": 38, + "h": 81 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 37, + "h": 81 + }, + "frame": { + "x": 39, + "y": 162, + "w": 37, + "h": 81 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 80 + }, + "frame": { + "x": 78, + "y": 81, + "w": 37, + "h": 80 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 9, + "w": 37, + "h": 80 + }, + "frame": { + "x": 117, + "y": 0, + "w": 37, + "h": 80 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 2, + "y": 9, + "w": 37, + "h": 80 + }, + "frame": { + "x": 117, + "y": 0, + "w": 37, + "h": 80 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 81 + }, + "frame": { + "x": 154, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 81 + }, + "frame": { + "x": 189, + "y": 0, + "w": 35, + "h": 81 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 35, + "h": 80 + }, + "frame": { + "x": 224, + "y": 0, + "w": 35, + "h": 80 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 35, + "h": 80 + }, + "frame": { + "x": 224, + "y": 0, + "w": 35, + "h": 80 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 35, + "h": 80 + }, + "frame": { + "x": 224, + "y": 0, + "w": 35, + "h": 80 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 35, + "h": 80 + }, + "frame": { + "x": 224, + "y": 0, + "w": 35, + "h": 80 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 35, + "h": 80 + }, + "frame": { + "x": 224, + "y": 0, + "w": 35, + "h": 80 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 35, + "h": 80 + }, + "frame": { + "x": 224, + "y": 0, + "w": 35, + "h": 80 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 9, + "w": 34, + "h": 80 + }, + "frame": { + "x": 76, + "y": 162, + "w": 34, + "h": 80 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 10, + "w": 35, + "h": 79 + }, + "frame": { + "x": 110, + "y": 161, + "w": 35, + "h": 79 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 12, + "w": 35, + "h": 76 + }, + "frame": { + "x": 115, + "y": 81, + "w": 35, + "h": 76 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 13, + "w": 35, + "h": 74 + }, + "frame": { + "x": 150, + "y": 81, + "w": 35, + "h": 74 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 17, + "w": 39, + "h": 69 + }, + "frame": { + "x": 185, + "y": 81, + "w": 39, + "h": 69 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 17, + "w": 39, + "h": 69 + }, + "frame": { + "x": 185, + "y": 81, + "w": 39, + "h": 69 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 15, + "w": 35, + "h": 71 + }, + "frame": { + "x": 224, + "y": 80, + "w": 35, + "h": 71 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 3, + "y": 15, + "w": 35, + "h": 71 + }, + "frame": { + "x": 145, + "y": 157, + "w": 35, + "h": 71 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 24, + "w": 39, + "h": 58 + }, + "frame": { + "x": 180, + "y": 155, + "w": 39, + "h": 58 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 25, + "w": 39, + "h": 56 + }, + "frame": { + "x": 219, + "y": 151, + "w": 39, + "h": 56 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 24, + "w": 38, + "h": 52 + }, + "frame": { + "x": 180, + "y": 213, + "w": 38, + "h": 52 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 24, + "w": 38, + "h": 52 + }, + "frame": { + "x": 180, + "y": 213, + "w": 38, + "h": 52 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 24, + "w": 38, + "h": 52 + }, + "frame": { + "x": 180, + "y": 213, + "w": 38, + "h": 52 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 24, + "w": 38, + "h": 52 + }, + "frame": { + "x": 218, + "y": 213, + "w": 38, + "h": 52 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 24, + "w": 38, + "h": 52 + }, + "frame": { + "x": 218, + "y": 213, + "w": 38, + "h": 52 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:50e379ebedf3fac27226f78046000101:a89f5cbf02246b7bd044f035effe839f:2e1b2146909d07717b7904c0cdf1b2b2$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/594_3.png b/public/images/pokemon/variant/back/594_3.png new file mode 100644 index 00000000000..9e4215d42b7 Binary files /dev/null and b/public/images/pokemon/variant/back/594_3.png differ diff --git a/public/images/pokemon/variant/back/618_2.json b/public/images/pokemon/variant/back/618_2.json new file mode 100644 index 00000000000..d82c52e26e2 --- /dev/null +++ b/public/images/pokemon/variant/back/618_2.json @@ -0,0 +1,2750 @@ +{ + "textures": [ + { + "image": "618_2.png", + "format": "RGBA8888", + "size": { + "w": 221, + "h": 221 + }, + "scale": 1, + "frames": [ + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 76, + "h": 27 + }, + "frame": { + "x": 0, + "y": 61, + "w": 76, + "h": 27 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 76, + "h": 27 + }, + "frame": { + "x": 0, + "y": 61, + "w": 76, + "h": 27 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 76, + "h": 27 + }, + "frame": { + "x": 0, + "y": 61, + "w": 76, + "h": 27 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 76, + "h": 27 + }, + "frame": { + "x": 0, + "y": 61, + "w": 76, + "h": 27 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 76, + "h": 26 + }, + "frame": { + "x": 76, + "y": 87, + "w": 76, + "h": 26 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 76, + "h": 26 + }, + "frame": { + "x": 76, + "y": 87, + "w": 76, + "h": 26 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 76, + "h": 26 + }, + "frame": { + "x": 76, + "y": 87, + "w": 76, + "h": 26 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 76, + "h": 26 + }, + "frame": { + "x": 76, + "y": 87, + "w": 76, + "h": 26 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0130.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:7ed241f9d4e0679b62ab26da17057d65:739de537da7171a9caf5769b4458f68f:22e585907b89e90c4fc3ab2512d175fd$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_2.png b/public/images/pokemon/variant/back/618_2.png new file mode 100644 index 00000000000..e74c6db3f04 Binary files /dev/null and b/public/images/pokemon/variant/back/618_2.png differ diff --git a/public/images/pokemon/variant/back/618_3.json b/public/images/pokemon/variant/back/618_3.json new file mode 100644 index 00000000000..17c49c5e59b --- /dev/null +++ b/public/images/pokemon/variant/back/618_3.json @@ -0,0 +1,2750 @@ +{ + "textures": [ + { + "image": "618_3.png", + "format": "RGBA8888", + "size": { + "w": 221, + "h": 221 + }, + "scale": 1, + "frames": [ + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 77, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 30 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 77, + "h": 26 + }, + "frame": { + "x": 77, + "y": 0, + "w": 77, + "h": 26 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 32 + }, + "frame": { + "x": 77, + "y": 26, + "w": 76, + "h": 32 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 76, + "h": 31 + }, + "frame": { + "x": 0, + "y": 30, + "w": 76, + "h": 31 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 76, + "h": 29 + }, + "frame": { + "x": 76, + "y": 58, + "w": 76, + "h": 29 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 76, + "h": 27 + }, + "frame": { + "x": 0, + "y": 61, + "w": 76, + "h": 27 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 76, + "h": 27 + }, + "frame": { + "x": 0, + "y": 61, + "w": 76, + "h": 27 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 76, + "h": 27 + }, + "frame": { + "x": 0, + "y": 61, + "w": 76, + "h": 27 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 76, + "h": 27 + }, + "frame": { + "x": 0, + "y": 61, + "w": 76, + "h": 27 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 76, + "h": 26 + }, + "frame": { + "x": 76, + "y": 87, + "w": 76, + "h": 26 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 76, + "h": 26 + }, + "frame": { + "x": 76, + "y": 87, + "w": 76, + "h": 26 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 76, + "h": 26 + }, + "frame": { + "x": 76, + "y": 87, + "w": 76, + "h": 26 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 76, + "h": 26 + }, + "frame": { + "x": 76, + "y": 87, + "w": 76, + "h": 26 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 88, + "w": 75, + "h": 32 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 32 + }, + "frame": { + "x": 0, + "y": 120, + "w": 75, + "h": 32 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 73, + "h": 32 + }, + "frame": { + "x": 0, + "y": 152, + "w": 73, + "h": 32 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 73, + "h": 31 + }, + "frame": { + "x": 0, + "y": 184, + "w": 73, + "h": 31 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 73, + "h": 30 + }, + "frame": { + "x": 73, + "y": 152, + "w": 73, + "h": 30 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 75, + "h": 27 + }, + "frame": { + "x": 146, + "y": 113, + "w": 75, + "h": 27 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 74, + "h": 28 + }, + "frame": { + "x": 146, + "y": 140, + "w": 74, + "h": 28 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 29 + }, + "frame": { + "x": 146, + "y": 168, + "w": 73, + "h": 29 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + }, + { + "filename": "0130.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 77, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 73, + "h": 28 + }, + "frame": { + "x": 73, + "y": 182, + "w": 73, + "h": 28 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:7ed241f9d4e0679b62ab26da17057d65:739de537da7171a9caf5769b4458f68f:22e585907b89e90c4fc3ab2512d175fd$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_3.png b/public/images/pokemon/variant/back/618_3.png new file mode 100644 index 00000000000..aaba24cfc58 Binary files /dev/null and b/public/images/pokemon/variant/back/618_3.png differ diff --git a/public/images/pokemon/variant/back/622.json b/public/images/pokemon/variant/back/622.json index 9ad7426a9d7..97f38954bab 100644 --- a/public/images/pokemon/variant/back/622.json +++ b/public/images/pokemon/variant/back/622.json @@ -1,20 +1,4 @@ { - "0": { - "298c8c": "427373", - "5aada5": "6b9c94", - "84cece": "94bdbd", - "004a52": "192121", - "106b63": "21524a", - "191921": "191921", - "106b7b": "293a42", - "29848c": "424a5a", - "6b4200": "523a10", - "c59c52": "b59463", - "9c7329": "846b3a", - "dece94": "b5de21", - "ffefa5": "d6ff42", - "bdad73": "94bd00" - }, "1": { "298c8c": "793907", "5aada5": "9d5915", diff --git a/public/images/pokemon/variant/back/622_1.png b/public/images/pokemon/variant/back/622_1.png deleted file mode 100644 index 8caa7b15ac0..00000000000 Binary files a/public/images/pokemon/variant/back/622_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/622_2.png b/public/images/pokemon/variant/back/622_2.png deleted file mode 100644 index 9e57b6fd73a..00000000000 Binary files a/public/images/pokemon/variant/back/622_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/623.json b/public/images/pokemon/variant/back/623.json index 56017b98f59..7c3429ecb26 100644 --- a/public/images/pokemon/variant/back/623.json +++ b/public/images/pokemon/variant/back/623.json @@ -1,16 +1,4 @@ { - "0": { - "003a52": "020e06", - "195a7b": "051b0a", - "191921": "191921", - "297b8c": "152c18", - "84c5ce": "3f4a3f", - "5aa5a5": "2b3c2d", - "105263": "041408", - "6b4200": "54190e", - "9c7329": "763826", - "c59c52": "a65c3f" - }, "1": { "003a52": "471205", "195a7b": "4d0a00", diff --git a/public/images/pokemon/variant/back/623_1.png b/public/images/pokemon/variant/back/623_1.png deleted file mode 100644 index b02cc764502..00000000000 Binary files a/public/images/pokemon/variant/back/623_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/623_2.png b/public/images/pokemon/variant/back/623_2.png deleted file mode 100644 index 456f439cd86..00000000000 Binary files a/public/images/pokemon/variant/back/623_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/279_1.json b/public/images/pokemon/variant/back/631_2.json similarity index 52% rename from public/images/pokemon/variant/279_1.json rename to public/images/pokemon/variant/back/631_2.json index 3f884262e14..3a96333fb35 100644 --- a/public/images/pokemon/variant/279_1.json +++ b/public/images/pokemon/variant/back/631_2.json @@ -1,54 +1,33 @@ { "textures": [ { - "image": "279_1.png", + "image": "631_2.png", "format": "RGBA8888", "size": { - "w": 422, - "h": 422 + "w": 430, + "h": 430 }, "scale": 1, "frames": [ { - "filename": "0003.png", + "filename": "0133.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 96, - "h": 53 + "y": 0, + "w": 102, + "h": 54 }, "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 + "w": 102, + "h": 54 } }, { @@ -56,356 +35,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 0, - "y": 1, + "x": 2, + "y": 2, "w": 96, - "h": 53 + "h": 57 }, "frame": { - "x": 0, + "x": 102, "y": 0, "w": 96, - "h": 53 + "h": 57 } }, { - "filename": "0040.png", + "filename": "0130.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "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, + "x": 2, + "y": 2, "w": 94, - "h": 53 + "h": 57 }, "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, + "y": 54, "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 + "h": 57 } }, { @@ -413,965 +77,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "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 + "y": 0, + "w": 98, + "h": 54 + }, + "frame": { + "x": 198, + "y": 0, + "w": 98, + "h": 54 } }, { - "filename": "0010.png", + "filename": "0122.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "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 + "w": 94, + "h": 55 }, "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 + "x": 296, + "y": 0, + "w": 94, + "h": 55 } }, { @@ -1379,83 +119,167 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 0, - "y": 7, + "y": 5, + "w": 93, + "h": 55 + }, + "frame": { + "x": 198, + "y": 54, + "w": 93, + "h": 55 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 94, + "h": 54 + }, + "frame": { + "x": 94, + "y": 57, + "w": 94, + "h": 54 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 93, + "h": 54 + }, + "frame": { + "x": 291, + "y": 55, + "w": 93, + "h": 54 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 91, + "h": 55 + }, + "frame": { + "x": 188, + "y": 109, + "w": 91, + "h": 55 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 94, + "h": 53 + }, + "frame": { + "x": 279, + "y": 109, + "w": 94, + "h": 53 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, "w": 93, "h": 53 }, "frame": { "x": 279, - "y": 106, + "y": 162, "w": 93, "h": 53 } }, { - "filename": "0166.png", + "filename": "0112.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 93, - "h": 53 + "x": 2, + "y": 2, + "w": 88, + "h": 56 }, "frame": { - "x": 279, - "y": 106, - "w": 93, - "h": 53 + "x": 0, + "y": 111, + "w": 88, + "h": 56 } }, { - "filename": "0039.png", + "filename": "0124.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 2, "y": 5, - "w": 93, - "h": 53 + "w": 89, + "h": 55 }, "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 + "x": 88, + "y": 111, + "w": 89, + "h": 55 } }, { @@ -1463,61 +287,124 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 2, "y": 5, - "w": 93, - "h": 53 + "w": 89, + "h": 55 }, "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 53 + "x": 177, + "y": 164, + "w": 89, + "h": 55 } }, { - "filename": "0167.png", + "filename": "0120.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 89, + "h": 54 + }, + "frame": { + "x": 88, + "y": 166, + "w": 89, + "h": 54 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 87, + "h": 55 + }, + "frame": { + "x": 0, + "y": 167, + "w": 87, + "h": 55 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 2, - "y": 5, - "w": 93, + "y": 4, + "w": 92, "h": 53 }, "frame": { - "x": 0, - "y": 106, - "w": 93, + "x": 266, + "y": 215, + "w": 92, "h": 53 } }, { - "filename": "0083.png", + "filename": "0118.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 0, + "x": 6, "y": 5, - "w": 93, + "w": 87, + "h": 55 + }, + "frame": { + "x": 177, + "y": 219, + "w": 87, + "h": 55 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 90, "h": 53 }, "frame": { - "x": 93, - "y": 106, - "w": 93, + "x": 87, + "y": 220, + "w": 90, "h": 53 } }, @@ -1526,1427 +413,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 - }, - "spriteSourceSize": { - "x": 6, - "y": 9, - "w": 82, + "w": 102, "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, + "x": 5, "y": 5, - "w": 81, - "h": 60 + "w": 86, + "h": 54 }, "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 + "y": 222, + "w": 86, + "h": 54 } }, { @@ -2954,587 +434,461 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 2, - "y": 10, - "w": 93, - "h": 52 + "y": 4, + "w": 91, + "h": 53 }, "frame": { - "x": 254, - "y": 271, - "w": 93, - "h": 52 + "x": 86, + "y": 273, + "w": 91, + "h": 53 } }, { - "filename": "0156.png", + "filename": "0111.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "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 + "y": 2, + "w": 82, + "h": 56 }, "frame": { "x": 0, - "y": 345, - "w": 63, - "h": 66 + "y": 276, + "w": 82, + "h": 56 } }, { - "filename": "0086.png", + "filename": "0113.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 63, - "h": 66 + "x": 2, + "y": 4, + "w": 88, + "h": 53 + }, + "frame": { + "x": 264, + "y": 268, + "w": 88, + "h": 53 + } + }, + { + "filename": "0134.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 55 + }, + "frame": { + "x": 352, + "y": 268, + "w": 77, + "h": 55 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 55 + }, + "frame": { + "x": 352, + "y": 268, + "w": 77, + "h": 55 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 55 + }, + "frame": { + "x": 352, + "y": 268, + "w": 77, + "h": 55 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 84, + "h": 54 + }, + "frame": { + "x": 177, + "y": 274, + "w": 84, + "h": 54 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 83, + "h": 54 + }, + "frame": { + "x": 82, + "y": 326, + "w": 83, + "h": 54 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { "x": 0, - "y": 345, - "w": 63, - "h": 66 + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0171.png", + "filename": "0014.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 63, - "h": 66 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { "x": 0, - "y": 345, - "w": 63, - "h": 66 + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0077.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 63, - "h": 66 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 160, - "y": 322, - "w": 63, - "h": 66 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0120.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 63, - "h": 66 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 160, - "y": 322, - "w": 63, - "h": 66 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0001.png", + "filename": "0064.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 67, - "h": 62 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 223, - "y": 323, - "w": 67, - "h": 62 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0044.png", + "filename": "0065.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 67, - "h": 62 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 223, - "y": 323, - "w": 67, - "h": 62 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0129.png", + "filename": "0066.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 67, - "h": 62 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 223, - "y": 323, - "w": 67, - "h": 62 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0035.png", + "filename": "0090.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 57, - "h": 67 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 290, - "y": 323, - "w": 57, - "h": 67 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0078.png", + "filename": "0091.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 57, - "h": 67 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 290, - "y": 323, - "w": 57, - "h": 67 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0163.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 57, - "h": 67 + "x": 2, + "y": 4, + "w": 81, + "h": 53 }, "frame": { - "x": 290, - "y": 323, - "w": 57, - "h": 67 + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 } }, { @@ -3542,62 +896,2015 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 62, - "h": 66 + "x": 2, + "y": 4, + "w": 81, + "h": 53 }, "frame": { - "x": 347, - "y": 356, - "w": 62, - "h": 66 + "x": 261, + "y": 321, + "w": 81, + "h": 53 } }, { - "filename": "0121.png", + "filename": "0037.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 62, - "h": 66 + "x": 2, + "y": 4, + "w": 81, + "h": 53 }, "frame": { - "x": 347, - "y": 356, - "w": 62, - "h": 66 + "x": 261, + "y": 321, + "w": 81, + "h": 53 } }, { - "filename": "0164.png", + "filename": "0038.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 62, - "h": 66 + "x": 2, + "y": 4, + "w": 81, + "h": 53 }, "frame": { - "x": 347, - "y": 356, - "w": 62, - "h": 66 + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0137.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0138.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 320, + "y": 376, + "w": 77, + "h": 54 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 320, + "y": 376, + "w": 77, + "h": 54 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 320, + "y": 376, + "w": 77, + "h": 54 } } ] @@ -3606,6 +2913,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:37124082e206aa3cddb045440ab1e9cf:8d64288649efa3066ed9b372190e868f:b1d275d5bba320dd22d2f2c7e56d52ec$" + "smartupdate": "$TexturePacker:SmartUpdate:f065036d2fe4a7ea6140331d0e860d32:649d5ebaa98d42ab30ee67be9d8a7b28:1ec188c732b5f709b15967dc6e0b9332$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/631_2.png b/public/images/pokemon/variant/back/631_2.png new file mode 100644 index 00000000000..d5d6af70546 Binary files /dev/null and b/public/images/pokemon/variant/back/631_2.png differ diff --git a/public/images/pokemon/variant/279_3.json b/public/images/pokemon/variant/back/631_3.json similarity index 52% rename from public/images/pokemon/variant/279_3.json rename to public/images/pokemon/variant/back/631_3.json index e2415bee4cd..553961b51e5 100644 --- a/public/images/pokemon/variant/279_3.json +++ b/public/images/pokemon/variant/back/631_3.json @@ -1,54 +1,33 @@ { "textures": [ { - "image": "279_3.png", + "image": "631_3.png", "format": "RGBA8888", "size": { - "w": 422, - "h": 422 + "w": 430, + "h": 430 }, "scale": 1, "frames": [ { - "filename": "0003.png", + "filename": "0133.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 96, - "h": 53 + "y": 0, + "w": 102, + "h": 54 }, "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 + "w": 102, + "h": 54 } }, { @@ -56,356 +35,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 0, - "y": 1, + "x": 2, + "y": 2, "w": 96, - "h": 53 + "h": 57 }, "frame": { - "x": 0, + "x": 102, "y": 0, "w": 96, - "h": 53 + "h": 57 } }, { - "filename": "0040.png", + "filename": "0130.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "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, + "x": 2, + "y": 2, "w": 94, - "h": 53 + "h": 57 }, "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, + "y": 54, "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 + "h": 57 } }, { @@ -413,965 +77,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "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 + "y": 0, + "w": 98, + "h": 54 + }, + "frame": { + "x": 198, + "y": 0, + "w": 98, + "h": 54 } }, { - "filename": "0010.png", + "filename": "0122.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "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 + "w": 94, + "h": 55 }, "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 + "x": 296, + "y": 0, + "w": 94, + "h": 55 } }, { @@ -1379,83 +119,167 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 0, - "y": 7, + "y": 5, + "w": 93, + "h": 55 + }, + "frame": { + "x": 198, + "y": 54, + "w": 93, + "h": 55 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 94, + "h": 54 + }, + "frame": { + "x": 94, + "y": 57, + "w": 94, + "h": 54 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 93, + "h": 54 + }, + "frame": { + "x": 291, + "y": 55, + "w": 93, + "h": 54 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 91, + "h": 55 + }, + "frame": { + "x": 188, + "y": 109, + "w": 91, + "h": 55 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 94, + "h": 53 + }, + "frame": { + "x": 279, + "y": 109, + "w": 94, + "h": 53 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, "w": 93, "h": 53 }, "frame": { "x": 279, - "y": 106, + "y": 162, "w": 93, "h": 53 } }, { - "filename": "0166.png", + "filename": "0112.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 93, - "h": 53 + "x": 2, + "y": 2, + "w": 88, + "h": 56 }, "frame": { - "x": 279, - "y": 106, - "w": 93, - "h": 53 + "x": 0, + "y": 111, + "w": 88, + "h": 56 } }, { - "filename": "0039.png", + "filename": "0124.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 2, "y": 5, - "w": 93, - "h": 53 + "w": 89, + "h": 55 }, "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 + "x": 88, + "y": 111, + "w": 89, + "h": 55 } }, { @@ -1463,61 +287,124 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 2, "y": 5, - "w": 93, - "h": 53 + "w": 89, + "h": 55 }, "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 53 + "x": 177, + "y": 164, + "w": 89, + "h": 55 } }, { - "filename": "0167.png", + "filename": "0120.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 89, + "h": 54 + }, + "frame": { + "x": 88, + "y": 166, + "w": 89, + "h": 54 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 87, + "h": 55 + }, + "frame": { + "x": 0, + "y": 167, + "w": 87, + "h": 55 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 2, - "y": 5, - "w": 93, + "y": 4, + "w": 92, "h": 53 }, "frame": { - "x": 0, - "y": 106, - "w": 93, + "x": 266, + "y": 215, + "w": 92, "h": 53 } }, { - "filename": "0083.png", + "filename": "0118.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 0, + "x": 6, "y": 5, - "w": 93, + "w": 87, + "h": 55 + }, + "frame": { + "x": 177, + "y": 219, + "w": 87, + "h": 55 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 90, "h": 53 }, "frame": { - "x": 93, - "y": 106, - "w": 93, + "x": 87, + "y": 220, + "w": 90, "h": 53 } }, @@ -1526,1427 +413,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 - }, - "spriteSourceSize": { - "x": 6, - "y": 9, - "w": 82, + "w": 102, "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, + "x": 5, "y": 5, - "w": 81, - "h": 60 + "w": 86, + "h": 54 }, "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 + "y": 222, + "w": 86, + "h": 54 } }, { @@ -2954,587 +434,461 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { "x": 2, - "y": 10, - "w": 93, - "h": 52 + "y": 4, + "w": 91, + "h": 53 }, "frame": { - "x": 254, - "y": 271, - "w": 93, - "h": 52 + "x": 86, + "y": 273, + "w": 91, + "h": 53 } }, { - "filename": "0156.png", + "filename": "0111.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "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 + "y": 2, + "w": 82, + "h": 56 }, "frame": { "x": 0, - "y": 345, - "w": 63, - "h": 66 + "y": 276, + "w": 82, + "h": 56 } }, { - "filename": "0086.png", + "filename": "0113.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 63, - "h": 66 + "x": 2, + "y": 4, + "w": 88, + "h": 53 + }, + "frame": { + "x": 264, + "y": 268, + "w": 88, + "h": 53 + } + }, + { + "filename": "0134.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 55 + }, + "frame": { + "x": 352, + "y": 268, + "w": 77, + "h": 55 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 55 + }, + "frame": { + "x": 352, + "y": 268, + "w": 77, + "h": 55 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 55 + }, + "frame": { + "x": 352, + "y": 268, + "w": 77, + "h": 55 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 84, + "h": 54 + }, + "frame": { + "x": 177, + "y": 274, + "w": 84, + "h": 54 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 83, + "h": 54 + }, + "frame": { + "x": 82, + "y": 326, + "w": 83, + "h": 54 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { "x": 0, - "y": 345, - "w": 63, - "h": 66 + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0171.png", + "filename": "0014.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 63, - "h": 66 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { "x": 0, - "y": 345, - "w": 63, - "h": 66 + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0077.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 63, - "h": 66 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 160, - "y": 322, - "w": 63, - "h": 66 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0120.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 63, - "h": 66 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 160, - "y": 322, - "w": 63, - "h": 66 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0001.png", + "filename": "0064.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 67, - "h": 62 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 223, - "y": 323, - "w": 67, - "h": 62 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0044.png", + "filename": "0065.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 67, - "h": 62 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 223, - "y": 323, - "w": 67, - "h": 62 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0129.png", + "filename": "0066.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 67, - "h": 62 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 223, - "y": 323, - "w": 67, - "h": 62 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0035.png", + "filename": "0090.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 57, - "h": 67 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 290, - "y": 323, - "w": 57, - "h": 67 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0078.png", + "filename": "0091.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 57, - "h": 67 + "x": 2, + "y": 5, + "w": 82, + "h": 54 }, "frame": { - "x": 290, - "y": 323, - "w": 57, - "h": 67 + "x": 0, + "y": 332, + "w": 82, + "h": 54 } }, { - "filename": "0163.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 57, - "h": 67 + "x": 2, + "y": 4, + "w": 81, + "h": 53 }, "frame": { - "x": 290, - "y": 323, - "w": 57, - "h": 67 + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 } }, { @@ -3542,62 +896,2015 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 62, - "h": 66 + "x": 2, + "y": 4, + "w": 81, + "h": 53 }, "frame": { - "x": 347, - "y": 356, - "w": 62, - "h": 66 + "x": 261, + "y": 321, + "w": 81, + "h": 53 } }, { - "filename": "0121.png", + "filename": "0037.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 62, - "h": 66 + "x": 2, + "y": 4, + "w": 81, + "h": 53 }, "frame": { - "x": 347, - "y": 356, - "w": 62, - "h": 66 + "x": 261, + "y": 321, + "w": 81, + "h": 53 } }, { - "filename": "0164.png", + "filename": "0038.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 76 + "w": 102, + "h": 60 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 62, - "h": 66 + "x": 2, + "y": 4, + "w": 81, + "h": 53 }, "frame": { - "x": 347, - "y": 356, - "w": 62, - "h": 66 + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 81, + "h": 53 + }, + "frame": { + "x": 261, + "y": 321, + "w": 81, + "h": 53 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 80, + "h": 53 + }, + "frame": { + "x": 342, + "y": 323, + "w": 80, + "h": 53 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 78, + "h": 54 + }, + "frame": { + "x": 165, + "y": 328, + "w": 78, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0137.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0138.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 243, + "y": 374, + "w": 77, + "h": 54 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 320, + "y": 376, + "w": 77, + "h": 54 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 320, + "y": 376, + "w": 77, + "h": 54 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 102, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 77, + "h": 54 + }, + "frame": { + "x": 320, + "y": 376, + "w": 77, + "h": 54 } } ] @@ -3606,6 +2913,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:37124082e206aa3cddb045440ab1e9cf:8d64288649efa3066ed9b372190e868f:b1d275d5bba320dd22d2f2c7e56d52ec$" + "smartupdate": "$TexturePacker:SmartUpdate:f065036d2fe4a7ea6140331d0e860d32:649d5ebaa98d42ab30ee67be9d8a7b28:1ec188c732b5f709b15967dc6e0b9332$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/631_3.png b/public/images/pokemon/variant/back/631_3.png new file mode 100644 index 00000000000..bb029fd7f3c Binary files /dev/null and b/public/images/pokemon/variant/back/631_3.png differ diff --git a/public/images/pokemon/variant/back/669-blue.json b/public/images/pokemon/variant/back/669-blue.json new file mode 100644 index 00000000000..758b01c48f8 --- /dev/null +++ b/public/images/pokemon/variant/back/669-blue.json @@ -0,0 +1,32 @@ +{ + "1": { + "665a1f": "230e63", + "ffe14c": "4d37d5", + "ccb43d": "3c118e", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8", + "101010": "101010", + "65a943": "e493a1", + "266280": "200e5c", + "61c2f2": "4d72d5", + "3d9ccc": "3841bf", + "3d6629": "094740", + "6bb347": "1d8057" + }, + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "32448e", + "bfbfbf": "a5c3ea", + "f8f8f8": "dff2ff", + "101010": "101010", + "65a943": "33a2bf", + "266280": "215510", + "61c2f2": "afcf4f", + "3d9ccc": "739f1f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/669-orange.json b/public/images/pokemon/variant/back/669-orange.json new file mode 100644 index 00000000000..a7ca575c15e --- /dev/null +++ b/public/images/pokemon/variant/back/669-orange.json @@ -0,0 +1,32 @@ +{ + "1": { + "665a1f": "5c0d0d", + "ffe14c": "a3382c", + "ccb43d": "871723", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8", + "101010": "101010", + "65a943": "e493a1", + "805326": "5c2c09", + "ffb266": "cd9231", + "d98d41": "b8662c", + "3d6629": "094740", + "6bb347": "1d8057" + }, + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "712b2b", + "bfbfbf": "f1beb3", + "f8f8f8": "fff1df", + "101010": "101010", + "65a943": "ea8c48", + "805326": "215510", + "ffb266": "afcf4f", + "d98d41": "739f1f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/669-red.json b/public/images/pokemon/variant/back/669-red.json new file mode 100644 index 00000000000..249fedd9e3d --- /dev/null +++ b/public/images/pokemon/variant/back/669-red.json @@ -0,0 +1,32 @@ +{ + "1": { + "665a1f": "3e0547", + "ffe14c": "9c235f", + "ccb43d": "6a094f", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8", + "101010": "101010", + "65a943": "e493a1", + "802d2d": "55061c", + "ff7373": "cd4a4a", + "d94c4c": "aa263c", + "3d6629": "094740", + "6bb347": "1d8057" + }, + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "800d3e", + "bfbfbf": "f1a2a9", + "f8f8f8": "ffd7db", + "101010": "101010", + "65a943": "dc3543", + "802d2d": "215510", + "ff7373": "afcf4f", + "d94c4c": "739f1f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/669-white.json b/public/images/pokemon/variant/back/669-white.json new file mode 100644 index 00000000000..2140e493685 --- /dev/null +++ b/public/images/pokemon/variant/back/669-white.json @@ -0,0 +1,32 @@ +{ + "1": { + "665a1f": "110732", + "ffe14c": "4c495c", + "ccb43d": "302b40", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8", + "101010": "101010", + "65a943": "e493a1", + "808080": "1e1d2a", + "fefefe": "89898e", + "d9d9d9": "64636a", + "3d6629": "094740", + "6bb347": "1d8057" + }, + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "616a64", + "bfbfbf": "d4dcd5", + "f8f8f8": "f8f8f8", + "101010": "101010", + "65a943": "636a67", + "808080": "215510", + "fefefe": "afcf4f", + "d9d9d9": "739f1f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/669-yellow.json b/public/images/pokemon/variant/back/669-yellow.json new file mode 100644 index 00000000000..09e57788049 --- /dev/null +++ b/public/images/pokemon/variant/back/669-yellow.json @@ -0,0 +1,32 @@ +{ + "1": { + "665a1f": "034020", + "ffe14c": "1a8e16", + "ccb43d": "0a6323", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8", + "101010": "101010", + "65a943": "e493a1", + "807826": "054e19", + "fff266": "abb830", + "d9cc41": "6f950a", + "3d6629": "094740", + "6bb347": "1d8057" + }, + "2": { + "665a1f": "393833", + "ffe14c": "fdfffb", + "ccb43d": "c4c6bf", + "595959": "6a532c", + "bfbfbf": "ead295", + "f8f8f8": "fffde0", + "101010": "101010", + "65a943": "f1d74b", + "807826": "215510", + "fff266": "afcf4f", + "d9cc41": "739f1f", + "3d6629": "121c0d", + "6bb347": "3c403a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/670-blue.json b/public/images/pokemon/variant/back/670-blue.json new file mode 100644 index 00000000000..f06692d2c71 --- /dev/null +++ b/public/images/pokemon/variant/back/670-blue.json @@ -0,0 +1,34 @@ +{ + "1": { + "665a1f": "240e63", + "266280": "200e5c", + "ffe14c": "402bbf", + "61c2f2": "4a64cd", + "3d9ccc": "3342b8", + "101010": "101010", + "ccb43d": "33168e", + "6bb347": "1d8057", + "3d6629": "094740", + "288a71": "e493a1", + "134035": "aa2960", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "665a1f": "b1b1b1", + "266280": "215510", + "ffe14c": "f8f8f4", + "61c2f2": "afcf4f", + "3d9ccc": "739f1f", + "101010": "101010", + "ccb43d": "dcdad8", + "6bb347": "3c403a", + "3d6629": "121c0d", + "288a71": "33bfb9", + "134035": "0d5c80", + "595959": "32448e", + "bfbfbf": "9fb6d4", + "f8f8f8": "dff2ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/670-orange.json b/public/images/pokemon/variant/back/670-orange.json new file mode 100644 index 00000000000..a9f85ce8395 --- /dev/null +++ b/public/images/pokemon/variant/back/670-orange.json @@ -0,0 +1,34 @@ +{ + "1": { + "665a1f": "5c0d0d", + "805326": "5c2c09", + "ffe14c": "a3382c", + "ffb266": "cd9231", + "d98d41": "aa571d", + "101010": "101010", + "ccb43d": "871723", + "6bb347": "1d8057", + "3d6629": "094740", + "288a71": "e493a1", + "134035": "aa2960", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "665a1f": "b1b1b1", + "805326": "215510", + "ffe14c": "f8f8f4", + "ffb266": "afcf4f", + "d98d41": "739f1f", + "101010": "101010", + "ccb43d": "dcdad8", + "6bb347": "3c403a", + "3d6629": "121c0d", + "288a71": "ea8c48", + "134035": "952e0a", + "595959": "712b2b", + "bfbfbf": "e3b1a6", + "f8f8f8": "fff1df" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/670-red.json b/public/images/pokemon/variant/back/670-red.json new file mode 100644 index 00000000000..bfceb377666 --- /dev/null +++ b/public/images/pokemon/variant/back/670-red.json @@ -0,0 +1,34 @@ +{ + "1": { + "665a1f": "3e0547", + "802d2d": "630a23", + "ffe14c": "8e1653", + "ff7373": "cd4a4a", + "d94c4c": "a31f35", + "101010": "101010", + "ccb43d": "6a094f", + "6bb347": "1d8057", + "3d6629": "094740", + "288a71": "e493a1", + "134035": "aa2960", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "665a1f": "b1b1b1", + "802d2d": "215510", + "ffe14c": "f8f8f4", + "ff7373": "afcf4f", + "d94c4c": "739f1f", + "101010": "101010", + "ccb43d": "dcdad8", + "6bb347": "3c403a", + "3d6629": "121c0d", + "288a71": "dc3543", + "134035": "801621", + "595959": "5c0c2e", + "bfbfbf": "dc818a", + "f8f8f8": "ffd7db" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/670-white.json b/public/images/pokemon/variant/back/670-white.json new file mode 100644 index 00000000000..fa7b45d2158 --- /dev/null +++ b/public/images/pokemon/variant/back/670-white.json @@ -0,0 +1,34 @@ +{ + "1": { + "665a1f": "110732", + "808080": "1e1d2a", + "ffe14c": "3b374e", + "fefefe": "747478", + "d9d9d9": "4c4b55", + "101010": "101010", + "ccb43d": "2c2347", + "6bb347": "1d8057", + "3d6629": "094740", + "288a71": "e493a1", + "134035": "aa2960", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "665a1f": "b1b1b1", + "808080": "215510", + "ffe14c": "f8f8f4", + "fefefe": "afcf4f", + "d9d9d9": "739f1f", + "101010": "101010", + "ccb43d": "dcdad8", + "6bb347": "3c403a", + "3d6629": "121c0d", + "288a71": "6d716f", + "134035": "1c2d32", + "595959": "595959", + "bfbfbf": "c6c6c6", + "f8f8f8": "f8f8f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/670-yellow.json b/public/images/pokemon/variant/back/670-yellow.json new file mode 100644 index 00000000000..d98e0f97054 --- /dev/null +++ b/public/images/pokemon/variant/back/670-yellow.json @@ -0,0 +1,34 @@ +{ + "1": { + "665a1f": "033928", + "807826": "064718", + "ffe14c": "1a8021", + "fff266": "abb830", + "d9cc41": "6f950a", + "101010": "101010", + "ccb43d": "0b5c19", + "6bb347": "1d8057", + "3d6629": "094740", + "288a71": "e493a1", + "134035": "aa2960", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "665a1f": "b1b1b1", + "807826": "215510", + "ffe14c": "f8f8f4", + "fff266": "afcf4f", + "d9cc41": "739f1f", + "101010": "101010", + "ccb43d": "dcdad8", + "6bb347": "3c403a", + "3d6629": "121c0d", + "288a71": "f1d74b", + "134035": "955615", + "595959": "4e3e23", + "bfbfbf": "d4c18f", + "f8f8f8": "fffde0" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/671-blue.json b/public/images/pokemon/variant/back/671-blue.json new file mode 100644 index 00000000000..935eeeab1b3 --- /dev/null +++ b/public/images/pokemon/variant/back/671-blue.json @@ -0,0 +1,32 @@ +{ + "1": { + "476d80": "110539", + "73bfbf": "291371", + "e5ffff": "69c9e3", + "aaf2f2": "3827a3", + "101010": "101010", + "3d9ccc": "2938a3", + "61c2f2": "3c54b8", + "1b594a": "aa1a58", + "3aa68b": "ff91a4", + "2d806b": "dc5073", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "476d80": "07230a", + "73bfbf": "28392c", + "e5ffff": "dfe3e1", + "aaf2f2": "4d4e46", + "101010": "101010", + "3d9ccc": "7f9f1f", + "61c2f2": "afcf4f", + "1b594a": "0d4a80", + "3aa68b": "25b1ab", + "2d806b": "11738e", + "595959": "32448e", + "bfbfbf": "9fb6d4", + "f8f8f8": "dff2ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/671-orange.json b/public/images/pokemon/variant/back/671-orange.json new file mode 100644 index 00000000000..08a78a394bb --- /dev/null +++ b/public/images/pokemon/variant/back/671-orange.json @@ -0,0 +1,32 @@ +{ + "1": { + "71543f": "391b05", + "cca37a": "631818", + "fff2e5": "ffbc77", + "ffd9b2": "a34b2c", + "101010": "101010", + "d98d41": "954c17", + "ffb266": "cd8e31", + "1b594a": "aa1a58", + "3aa68b": "ff91a4", + "2d806b": "dc5073", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "71543f": "07230a", + "cca37a": "28392c", + "fff2e5": "dfe3e1", + "ffd9b2": "4d4e46", + "101010": "101010", + "d98d41": "7f9f1f", + "ffb266": "afcf4f", + "1b594a": "800707", + "3aa68b": "dc7226", + "2d806b": "b1380f", + "595959": "712b2b", + "bfbfbf": "f1a695", + "f8f8f8": "fff1df" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/671-red.json b/public/images/pokemon/variant/back/671-red.json new file mode 100644 index 00000000000..642c0c96cae --- /dev/null +++ b/public/images/pokemon/variant/back/671-red.json @@ -0,0 +1,32 @@ +{ + "1": { + "683644": "390614", + "a66390": "4e0c38", + "ffb2cc": "ff90a2", + "d998c3": "8e1a55", + "101010": "101010", + "d94c4c": "95172c", + "ff7373": "c64040", + "1b594a": "aa1a58", + "3aa68b": "ff91a4", + "2d806b": "dc5073", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "683644": "07230a", + "a66390": "28392c", + "ffb2cc": "dfe3e1", + "d998c3": "4d4e46", + "101010": "101010", + "d94c4c": "7f9f1f", + "ff7373": "afcf4f", + "1b594a": "710846", + "3aa68b": "dc3543", + "2d806b": "a31e40", + "595959": "5c0c2e", + "bfbfbf": "dca4b2", + "f8f8f8": "ffd7db" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/671-white.json b/public/images/pokemon/variant/back/671-white.json new file mode 100644 index 00000000000..9f3e489ca31 --- /dev/null +++ b/public/images/pokemon/variant/back/671-white.json @@ -0,0 +1,32 @@ +{ + "1": { + "808080": "1a1723", + "b3b3b3": "272232", + "ffbfca": "c2c1c6", + "f2f2f2": "353340", + "101010": "101010", + "d9d9d9": "3c3b47", + "fefefe": "60616a", + "1b594a": "aa1a58", + "3aa68b": "ff91a4", + "2d806b": "dc5073", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "808080": "07230a", + "b3b3b3": "28392c", + "ffbfca": "dfe3e1", + "f2f2f2": "4d4e46", + "101010": "101010", + "d9d9d9": "7f9f1f", + "fefefe": "afcf4f", + "1b594a": "1c2d32", + "3aa68b": "6d716f", + "2d806b": "3c4747", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f9f9f9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/671-yellow.json b/public/images/pokemon/variant/back/671-yellow.json new file mode 100644 index 00000000000..a2aea6302ad --- /dev/null +++ b/public/images/pokemon/variant/back/671-yellow.json @@ -0,0 +1,32 @@ +{ + "1": { + "6e6b4a": "07473a", + "ccb485": "227850", + "ffd2a6": "ffe593", + "ffeabf": "22b14a", + "101010": "101010", + "d9cc41": "789c16", + "fff266": "b0bf2b", + "1b594a": "aa1a58", + "3aa68b": "ff91a4", + "2d806b": "dc5073", + "595959": "595959", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8" + }, + "2": { + "6e6b4a": "07230a", + "ccb485": "28392c", + "ffd2a6": "dfe3e1", + "ffeabf": "4d4e46", + "101010": "101010", + "d9cc41": "7f9f1f", + "fff266": "afcf4f", + "1b594a": "8e4d0a", + "3aa68b": "dcbf26", + "2d806b": "b18018", + "595959": "4e3e23", + "bfbfbf": "e3d0a0", + "f8f8f8": "fffde0" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/672.json b/public/images/pokemon/variant/back/672.json new file mode 100644 index 00000000000..ad732e63266 --- /dev/null +++ b/public/images/pokemon/variant/back/672.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "737373": "9e2c3d", + "404040": "73132e", + "403830": "642509", + "66594c": "89431b", + "998673": "b3743e", + "bfbfbf": "e3a378", + "174d3b": "8c6859", + "f8f8f8": "f8e2b7", + "36b389": "f8f0e2", + "268062": "d2af94", + "4d4d4d": "9b6751", + "99522e": "321512", + "ff884c": "552d30" + }, + "2": { + "101010": "101010", + "737373": "2d2b40", + "404040": "161526", + "403830": "305a4f", + "66594c": "4c7a68", + "998673": "72b692", + "bfbfbf": "d4b3d7", + "174d3b": "363e6c", + "f8f8f8": "ffeffe", + "36b389": "96d5e3", + "268062": "6885b6", + "4d4d4d": "6b4473", + "99522e": "612c6b", + "ff884c": "9f5f9b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/673.json b/public/images/pokemon/variant/back/673.json new file mode 100644 index 00000000000..2861d12d0dd --- /dev/null +++ b/public/images/pokemon/variant/back/673.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "666666": "9e2c3d", + "404040": "73132e", + "542914": "471405", + "7a4932": "61240a", + "bfbfbf": "e3a378", + "f8f8f8": "f8e2b7", + "144f26": "8c6859", + "2fb657": "f8f0e2", + "9f2f1d": "321512", + "21833e": "d2af94", + "ff543a": "552d30", + "9e895c": "9e4e21", + "d6b778": "ce8648" + }, + "2": { + "101010": "101010", + "666666": "2d2b40", + "404040": "161526", + "542914": "37224d", + "7a4932": "513a6b", + "bfbfbf": "d4b3d7", + "f8f8f8": "ffeffe", + "144f26": "36466c", + "2fb657": "96e3e3", + "9f2f1d": "612c6b", + "21833e": "6893b6", + "ff543a": "9f5f9b", + "9e895c": "74a0a5", + "d6b778": "c3e1cf" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/677.json b/public/images/pokemon/variant/back/677.json new file mode 100644 index 00000000000..425ffc7ec90 --- /dev/null +++ b/public/images/pokemon/variant/back/677.json @@ -0,0 +1,18 @@ +{ + "1": { + "5c5c66": "601339", + "b8b8cc": "bd5c81", + "45454d": "470d28", + "8a8a99": "943b5d", + "f8f8f8": "f1f0e4", + "101010": "101010" + }, + "2": { + "5c5c66": "243e41", + "b8b8cc": "6ba78a", + "45454d": "193437", + "8a8a99": "426b62", + "f8f8f8": "67415e", + "101010": "101010" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/678-female.json b/public/images/pokemon/variant/back/678-female.json new file mode 100644 index 00000000000..c628e4db4ed --- /dev/null +++ b/public/images/pokemon/variant/back/678-female.json @@ -0,0 +1,20 @@ +{ + "1": { + "101010": "101010", + "737373": "947859", + "bfbfbf": "d5c49f", + "f8f8f8": "f8f5cd", + "17294d": "47182e", + "264480": "76264d", + "365fb3": "a5346b" + }, + "2": { + "101010": "101010", + "737373": "3a1633", + "bfbfbf": "613d5a", + "f8f8f8": "855577", + "17294d": "1d3f33", + "264480": "47946c", + "365fb3": "7bd38d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/678.json b/public/images/pokemon/variant/back/678.json new file mode 100644 index 00000000000..c628e4db4ed --- /dev/null +++ b/public/images/pokemon/variant/back/678.json @@ -0,0 +1,20 @@ +{ + "1": { + "101010": "101010", + "737373": "947859", + "bfbfbf": "d5c49f", + "f8f8f8": "f8f5cd", + "17294d": "47182e", + "264480": "76264d", + "365fb3": "a5346b" + }, + "2": { + "101010": "101010", + "737373": "3a1633", + "bfbfbf": "613d5a", + "f8f8f8": "855577", + "17294d": "1d3f33", + "264480": "47946c", + "365fb3": "7bd38d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/698.json b/public/images/pokemon/variant/back/698.json new file mode 100644 index 00000000000..48a717ac503 --- /dev/null +++ b/public/images/pokemon/variant/back/698.json @@ -0,0 +1,30 @@ +{ + "1": { + "b3747e": "4b7465", + "ffbfca": "43bf8d", + "fff2b2": "9bffa9", + "537180": "b04f4b", + "a6e1ff": "efab87", + "101010": "101010", + "85b4cc": "cf755d", + "217aa6": "7f99e1", + "30b2f2": "b5dcff", + "fdfdfd": "fdfdfd", + "c0c0c0": "d7cca0", + "cacaca": "cacaca" + }, + "2": { + "b3747e": "c452a6", + "ffbfca": "faccff", + "fff2b2": "eb88b9", + "537180": "392d65", + "a6e1ff": "936daa", + "101010": "101010", + "85b4cc": "654a8a", + "217aa6": "efaa51", + "30b2f2": "ffd169", + "fdfdfd": "fdfdfd", + "c0c0c0": "282747", + "cacaca": "cacaca" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/699.json b/public/images/pokemon/variant/back/699.json new file mode 100644 index 00000000000..aa7a63c04c6 --- /dev/null +++ b/public/images/pokemon/variant/back/699.json @@ -0,0 +1,44 @@ +{ + "1": { + "7279a1": "164450", + "ccd2ee": "237578", + "a7afd5": "1c5962", + "fff2b2": "4eb87f", + "e5d68a": "429a77", + "6d749a": "2d7c63", + "81a0dc": "e5756b", + "657dac": "c44f5d", + "ffffff": "ffeac0", + "4e568b": "a03c58", + "101010": "101010", + "f8f8f8": "f8f8f8", + "3d8eb6": "12545e", + "53c5ff": "1c7376", + "94b7bd": "d3a47b", + "4b6f76": "b78460", + "3689b3": "8487e1", + "4cc3ff": "c2d5ff", + "d4edf3": "ffe4a7" + }, + "2": { + "7279a1": "c89ad8", + "ccd2ee": "fedbff", + "a7afd5": "e6b9ea", + "fff2b2": "4cdfc7", + "e5d68a": "38c1c7", + "6d749a": "2c97b3", + "81a0dc": "3f648b", + "657dac": "2f4978", + "ffffff": "bae8ff", + "4e568b": "243369", + "101010": "101010", + "f8f8f8": "f8f8f8", + "3d8eb6": "852d6b", + "53c5ff": "ab467e", + "94b7bd": "261e44", + "4b6f76": "1c183a", + "3689b3": "efbe63", + "4cc3ff": "ffea82", + "d4edf3": "382955" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/702.json b/public/images/pokemon/variant/back/702.json new file mode 100644 index 00000000000..1c19fa48122 --- /dev/null +++ b/public/images/pokemon/variant/back/702.json @@ -0,0 +1,20 @@ +{ + "1": { + "101010": "101010", + "4d4d4d": "6789b3", + "262626": "2a3b5e", + "735c2e": "a53c42", + "f2c261": "ffd3b6", + "bf994c": "e49f84", + "997a3d": "c9685f" + }, + "2": { + "101010": "101010", + "4d4d4d": "197870", + "262626": "072d38", + "735c2e": "1e0e27", + "f2c261": "5f3662", + "bf994c": "432249", + "997a3d": "2d1533" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/703.json b/public/images/pokemon/variant/back/703.json new file mode 100644 index 00000000000..951c8b311b9 --- /dev/null +++ b/public/images/pokemon/variant/back/703.json @@ -0,0 +1,28 @@ +{ + "1": { + "2e5073": "c35b2a", + "474759": "292638", + "6994bf": "e67c37", + "8cc6ff": "ffa633", + "8f8fb3": "4d496b", + "f8f8f8": "f8f8f8", + "666680": "37344e", + "101010": "101010", + "595959": "e6ac60", + "bfbfbf": "ffd3a1", + "f2f2f2": "ffeed6" + }, + "2": { + "2e5073": "a03c69", + "474759": "976ba9", + "6994bf": "e25493", + "8cc6ff": "f591bd", + "8f8fb3": "e4cdf9", + "f8f8f8": "ffe2ee", + "666680": "cca1db", + "101010": "101010", + "595959": "5a3d84", + "bfbfbf": "8359a7", + "f2f2f2": "a473bf" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/79.json b/public/images/pokemon/variant/back/79.json index 223f60349a2..4bec35f4691 100644 --- a/public/images/pokemon/variant/back/79.json +++ b/public/images/pokemon/variant/back/79.json @@ -13,5 +13,35 @@ "ffe6b5": "fff7b5", "dea563": "deb55a", "efc58c": "efc58c" + }, + "1": { + "6b6363": "6b6363", + "d6cece": "d6cece", + "101010": "101010", + "ffffff": "ffffff", + "ffa5a5": "ad7459", + "de637b": "5b3332", + "ff8494": "885345", + "ad4252": "422220", + "7b2131": "3b1111", + "8c5a19": "714942", + "ffe6b5": "e0b69d", + "dea563": "b97565", + "efc58c": "d49983" + }, + "2": { + "6b6363": "6b6363", + "d6cece": "d6cece", + "101010": "101010", + "ffffff": "ffffff", + "ffa5a5": "ffeb9b", + "de637b": "dd8f47", + "ff8494": "eebd6a", + "ad4252": "a54729", + "7b2131": "4d2820", + "8c5a19": "69080f", + "ffe6b5": "d16b34", + "dea563": "8f2622", + "efc58c": "b34d2e" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/80-mega.json b/public/images/pokemon/variant/back/80-mega.json new file mode 100644 index 00000000000..96b9c22aa83 --- /dev/null +++ b/public/images/pokemon/variant/back/80-mega.json @@ -0,0 +1,30 @@ +{ + "1": { + "783030": "3f2729", + "181818": "181818", + "f89090": "885345", + "e06878": "5b3332", + "deded5": "deded5", + "f8f8f8": "f8f8f8", + "805820": "9f675f", + "e8d080": "e0b69d", + "505058": "7c5b40", + "c8a060": "d49983", + "889090": "bf9562", + "b0b8b8": "f0d090" + }, + "2": { + "783030": "c08746", + "181818": "181818", + "f89090": "eebd6a", + "e06878": "de9048", + "deded5": "deded5", + "f8f8f8": "f8f8f8", + "805820": "69080f", + "e8d080": "d16b34", + "505058": "192b32", + "c8a060": "b34d2e", + "889090": "2b4a48", + "b0b8b8": "4c7668" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/80.json b/public/images/pokemon/variant/back/80.json new file mode 100644 index 00000000000..a95ecf48908 --- /dev/null +++ b/public/images/pokemon/variant/back/80.json @@ -0,0 +1,32 @@ +{ + "1": { + "7b3131": "3f2729", + "191919": "191919", + "52525a": "8b5d37", + "ff9494": "895446", + "b5bdbd": "f0d090", + "e66b7b": "5c3433", + "8c9494": "bf9562", + "b6b6ae": "b6b6ae", + "845a21": "9f675f", + "deded6": "deded6", + "efd684": "e0b69d", + "ffffff": "ffffff", + "cea563": "d49983" + }, + "2": { + "7b3131": "a54729", + "191919": "191919", + "52525a": "192b32", + "ff9494": "edbc69", + "b5bdbd": "4b7567", + "e66b7b": "dd8f47", + "8c9494": "2a4947", + "b6b6ae": "b6b6ae", + "845a21": "69080f", + "deded6": "deded6", + "efd684": "d16b34", + "ffffff": "ffffff", + "cea563": "b34d2e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/803.json b/public/images/pokemon/variant/back/803.json new file mode 100644 index 00000000000..99736595873 --- /dev/null +++ b/public/images/pokemon/variant/back/803.json @@ -0,0 +1,26 @@ +{ + "1": { + "78757f": "449e93", + "101010": "101010", + "ccc0d8": "e3ffec", + "98295e": "27579e", + "d9338e": "3492b9", + "ff6ccc": "54cbdc", + "39284d": "1d1638", + "453966": "211c49", + "583f87": "2e2e69", + "814eba": "2e4b84" + }, + "2": { + "78757f": "cd9b85", + "101010": "101010", + "ccc0d8": "ffefe0", + "98295e": "a12f63", + "d9338e": "d6487a", + "ff6ccc": "ff778d", + "39284d": "08172f", + "453966": "0d293d", + "583f87": "103a47", + "814eba": "095654" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/804.json b/public/images/pokemon/variant/back/804.json new file mode 100644 index 00000000000..5686b72ac9b --- /dev/null +++ b/public/images/pokemon/variant/back/804.json @@ -0,0 +1,34 @@ +{ + "1": { + "5f4670": "16396f", + "101010": "101010", + "9372c0": "22658d", + "bc88ff": "359faf", + "9e2348": "81262d", + "db3e94": "c74736", + "ff6cd3": "e88354", + "513786": "212149", + "a896a9": "8edfd5", + "36244c": "18183d", + "3e2a68": "1d193d", + "793fbe": "284173", + "6d656d": "2b5d67", + "e8d9e4": "e3ffec" + }, + "2": { + "5f4670": "0e3346", + "101010": "101010", + "9372c0": "2d794e", + "bc88ff": "68b363", + "9e2348": "7e4e3d", + "db3e94": "dcbb94", + "ff6cd3": "fff8cc", + "513786": "103a47", + "a896a9": "96234e", + "36244c": "081e35", + "3e2a68": "052c3d", + "793fbe": "095654", + "6d656d": "690940", + "e8d9e4": "e54558" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/867.json b/public/images/pokemon/variant/back/867.json new file mode 100644 index 00000000000..124ea0d4f66 --- /dev/null +++ b/public/images/pokemon/variant/back/867.json @@ -0,0 +1,20 @@ +{ + "1": { + "393941": "69d9bf", + "101010": "101010", + "927e8d": "a46361", + "d9d0d1": "d6b8a0", + "c5b9bb": "c69981", + "816968": "743949", + "463c3f": "5a2940" + }, + "2": { + "393941": "a4222c", + "101010": "101010", + "927e8d": "1f6455", + "d9d0d1": "4fb66a", + "c5b9bb": "298a61", + "816968": "0a4340", + "463c3f": "052b2f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/880.json b/public/images/pokemon/variant/back/880.json new file mode 100644 index 00000000000..1270725b8a2 --- /dev/null +++ b/public/images/pokemon/variant/back/880.json @@ -0,0 +1,34 @@ +{ + "1": { + "8f261b": "1b1829", + "101010": "101010", + "ff8d9f": "6a98c4", + "ed4e76": "312f47", + "975e17": "5b0610", + "e39e1e": "9c1430", + "ffff84": "ee8563", + "ead900": "c6362b", + "005e44": "564e6e", + "003319": "26233c", + "01886a": "3f3a58", + "39ad5a": "a2b5c8", + "008567": "757798", + "025f46": "26253e" + }, + "2": { + "8f261b": "8f261b", + "101010": "101010", + "ff8d9f": "e28854", + "ed4e76": "ca5939", + "975e17": "211b3d", + "e39e1e": "35365e", + "ffff84": "dceeeb", + "ead900": "636287", + "005e44": "f1b45f", + "003319": "671d18", + "01886a": "9b4c1d", + "39ad5a": "ce734d", + "008567": "fff491", + "025f46": "702c11" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/881_2.json b/public/images/pokemon/variant/back/881_2.json new file mode 100644 index 00000000000..568946ee9f9 --- /dev/null +++ b/public/images/pokemon/variant/back/881_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "881_2.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 66, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 66, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:08f9e60b28adb0f1c25487a3423af005:e78d63b8a44825ae516935d669e48f61:1f7350865753535cbb572c579820f817$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/881_2.png b/public/images/pokemon/variant/back/881_2.png new file mode 100644 index 00000000000..76176d7d5fe Binary files /dev/null and b/public/images/pokemon/variant/back/881_2.png differ diff --git a/public/images/pokemon/variant/back/881_3.json b/public/images/pokemon/variant/back/881_3.json new file mode 100644 index 00000000000..b9101d9b13f --- /dev/null +++ b/public/images/pokemon/variant/back/881_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "881_3.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 66, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 66, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:08f9e60b28adb0f1c25487a3423af005:e78d63b8a44825ae516935d669e48f61:1f7350865753535cbb572c579820f817$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/881_3.png b/public/images/pokemon/variant/back/881_3.png new file mode 100644 index 00000000000..c255e83cc16 Binary files /dev/null and b/public/images/pokemon/variant/back/881_3.png differ diff --git a/public/images/pokemon/variant/back/882.json b/public/images/pokemon/variant/back/882.json new file mode 100644 index 00000000000..bfaf844e6ed --- /dev/null +++ b/public/images/pokemon/variant/back/882.json @@ -0,0 +1,34 @@ +{ + "1": { + "434c63": "771922", + "83bbed": "eaa561", + "777ebd": "cc6235", + "101010": "101010", + "003319": "1a182b", + "005e44": "564e6e", + "8f261b": "1d2238", + "048366": "977c7c", + "ff3c6d": "312f47", + "39ad5a": "b5a49e", + "d5657b": "4b729f", + "ff8d9f": "6a98c4", + "edf3f2": "faebc8", + "008567": "757798" + }, + "2": { + "434c63": "450940", + "83bbed": "8c1f45", + "777ebd": "6c1046", + "101010": "101010", + "003319": "cc7d3b", + "005e44": "f1b45f", + "8f261b": "215b68", + "048366": "b24835", + "ff3c6d": "ca5939", + "39ad5a": "ce734d", + "d5657b": "308a86", + "ff8d9f": "63bb8b", + "edf3f2": "fbecff", + "008567": "fff491" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/883.json b/public/images/pokemon/variant/back/883.json new file mode 100644 index 00000000000..354ac125db9 --- /dev/null +++ b/public/images/pokemon/variant/back/883.json @@ -0,0 +1,30 @@ +{ + "1": { + "434c63": "3a151c", + "83bbed": "eaa561", + "172459": "771922", + "101010": "101010", + "777ebd": "cc6235", + "5c7996": "8c6060", + "9ab8ba": "cea5b9", + "edf3f2": "faebc8", + "09354d": "2f1f1a", + "085d94": "714363", + "0981ae": "45242e", + "27aed6": "6e4145" + }, + "2": { + "434c63": "450940", + "83bbed": "8c1f45", + "172459": "320432", + "101010": "101010", + "777ebd": "6c1046", + "5c7996": "50a751", + "9ab8ba": "a3c465", + "edf3f2": "fcffe4", + "09354d": "2f1a20", + "085d94": "ad3b6c", + "0981ae": "205e5d", + "27aed6": "2d7b65" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/888-crowned.json b/public/images/pokemon/variant/back/888-crowned.json new file mode 100644 index 00000000000..e0e62e49bd5 --- /dev/null +++ b/public/images/pokemon/variant/back/888-crowned.json @@ -0,0 +1,34 @@ +{ + "1": { + "8f4e2f": "2f4567", + "f2db8a": "a1c9cd", + "080808": "080808", + "d79a53": "5a829b", + "3471b4": "b74323", + "2d4377": "5c1a1d", + "4999da": "ec813b", + "93262f": "0d2729", + "be3c45": "224d42", + "f45353": "448b48", + "d3a79a": "da9772", + "fae2c0": "fff8cd", + "9d6862": "a85f49", + "34313e": "32171f" + }, + "2": { + "8f4e2f": "692e47", + "f2db8a": "c4826b", + "080808": "080808", + "d79a53": "964c5c", + "3471b4": "9fa7d0", + "2d4377": "615c7e", + "4999da": "e6ecff", + "93262f": "431042", + "be3c45": "6c1d59", + "f45353": "902d57", + "d3a79a": "243149", + "fae2c0": "3d5b72", + "9d6862": "1c2238", + "34313e": "1a1829" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/888.json b/public/images/pokemon/variant/back/888.json new file mode 100644 index 00000000000..22953486afb --- /dev/null +++ b/public/images/pokemon/variant/back/888.json @@ -0,0 +1,28 @@ +{ + "1": { + "2d4377": "5c1a1d", + "4999da": "ec813b", + "3471b4": "b74323", + "080808": "080808", + "93262f": "0d2729", + "f45353": "448b48", + "be3c45": "224d42", + "fae2c0": "fff8cd", + "d3a79a": "da9772", + "34313e": "32171f", + "9d6862": "a85f49" + }, + "2": { + "2d4377": "615c7e", + "4999da": "e6ecff", + "3471b4": "9fa7d0", + "080808": "080808", + "93262f": "431042", + "f45353": "902d57", + "be3c45": "6c1d59", + "fae2c0": "3d5b72", + "d3a79a": "243149", + "34313e": "1a1829", + "9d6862": "1c2238" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/889-crowned.json b/public/images/pokemon/variant/back/889-crowned.json new file mode 100644 index 00000000000..cd69c495fff --- /dev/null +++ b/public/images/pokemon/variant/back/889-crowned.json @@ -0,0 +1,34 @@ +{ + "1": { + "2d2f7b": "102c2c", + "080808": "080808", + "396dce": "70a757", + "2d48a8": "3c6959", + "8f4e2f": "2f4567", + "f2db8a": "a1c9cd", + "d79a53": "5a829b", + "eb363a": "614378", + "fffccc": "d3eeea", + "731a27": "1c163d", + "ae2836": "422b61", + "8887a8": "d69f97", + "c2c3cf": "ffe0cc", + "34313e": "19142f" + }, + "2": { + "2d2f7b": "244e61", + "080808": "080808", + "396dce": "6fc7c1", + "2d48a8": "4797a4", + "8f4e2f": "692e47", + "f2db8a": "c4826b", + "d79a53": "964c5c", + "eb363a": "e6ecff", + "fffccc": "e5b885", + "731a27": "615c7e", + "ae2836": "9fa7d0", + "8887a8": "442e49", + "c2c3cf": "694f69", + "34313e": "22192c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/889.json b/public/images/pokemon/variant/back/889.json new file mode 100644 index 00000000000..883802e962a --- /dev/null +++ b/public/images/pokemon/variant/back/889.json @@ -0,0 +1,28 @@ +{ + "1": { + "2d2f7b": "102c2c", + "396dce": "70a757", + "2d48a8": "3c6959", + "f2db8a": "a1c9cd", + "080808": "080808", + "731a27": "1c163d", + "eb363a": "614378", + "ae2836": "422b61", + "c2c3cf": "ffe0cc", + "8887a8": "d69f97", + "34313e": "19142f" + }, + "2": { + "2d2f7b": "244e61", + "396dce": "6fc7c1", + "2d48a8": "4797a4", + "f2db8a": "c4826b", + "080808": "080808", + "731a27": "615c7e", + "eb363a": "e6ecff", + "ae2836": "9fa7d0", + "c2c3cf": "694f69", + "8887a8": "442e49", + "34313e": "22192c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/912.json b/public/images/pokemon/variant/back/912.json new file mode 100644 index 00000000000..bbbe5288893 --- /dev/null +++ b/public/images/pokemon/variant/back/912.json @@ -0,0 +1,20 @@ +{ + "1": { + "1f5978": "8c3b14", + "2fbee8": "e69c51", + "0f0f0f": "0f0f0f", + "3686b1": "d96536", + "becde4": "d79f63", + "4d6373": "975432", + "f6fbfc": "ffe3b0" + }, + "2": { + "1f5978": "0a3025", + "2fbee8": "33b37e", + "0f0f0f": "0f0f0f", + "3686b1": "1c7962", + "becde4": "5137a0", + "4d6373": "2d185d", + "f6fbfc": "6767e3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/913.json b/public/images/pokemon/variant/back/913.json new file mode 100644 index 00000000000..e9d85674c0e --- /dev/null +++ b/public/images/pokemon/variant/back/913.json @@ -0,0 +1,36 @@ +{ + "1": { + "2357aa": "821e24", + "2782d1": "bd3c24", + "2cb9e8": "f77122", + "13325e": "3f050e", + "174b6a": "862311", + "30b0ba": "f77122", + "0f0f0f": "0f0f0f", + "916a44": "3b2e28", + "ddc271": "5b5450", + "d0c4d3": "d79f63", + "555268": "50281c", + "ffffff": "ffe3b0", + "92879b": "ad6a47", + "4ad2e6": "ffb75c", + "fff36b": "868382" + }, + "2": { + "2357aa": "0f4537", + "2782d1": "1d6c42", + "2cb9e8": "42ad7b", + "13325e": "072a2b", + "174b6a": "541222", + "30b0ba": "a22f49", + "0f0f0f": "0f0f0f", + "916a44": "4b251b", + "ddc271": "c76740", + "d0c4d3": "3b188e", + "555268": "120e4a", + "ffffff": "4b40be", + "92879b": "341261", + "4ad2e6": "f15e76", + "fff36b": "ffa564" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/914.json b/public/images/pokemon/variant/back/914.json new file mode 100644 index 00000000000..2179ed6d464 --- /dev/null +++ b/public/images/pokemon/variant/back/914.json @@ -0,0 +1,40 @@ +{ + "1": { + "3d7a71": "571509", + "55dbe6": "ffb75c", + "282a4d": "3f050e", + "394bee": "bd3c24", + "333f93": "821e24", + "752911": "302822", + "e3460f": "f8edb9", + "0f0f0f": "0f0f0f", + "a24720": "dac194", + "8ea6a8": "d79f63", + "62747b": "975432", + "efffff": "ffe3b0", + "419bc2": "f77122", + "effffd": "ffe3b0", + "803213": "302822", + "cb7e29": "5b5450", + "eda936": "868382" + }, + "2": { + "3d7a71": "541222", + "55dbe6": "f15e76", + "282a4d": "072a2b", + "394bee": "1d6c42", + "333f93": "0f4537", + "752911": "664747", + "e3460f": "fff2e5", + "0f0f0f": "0f0f0f", + "a24720": "eac7b4", + "8ea6a8": "3b188e", + "62747b": "120e4a", + "efffff": "4b40be", + "419bc2": "a22f49", + "effffd": "ffd2cf", + "803213": "4b251b", + "cb7e29": "c76740", + "eda936": "ffa564" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/940.json b/public/images/pokemon/variant/back/940.json new file mode 100644 index 00000000000..313dbd273ec --- /dev/null +++ b/public/images/pokemon/variant/back/940.json @@ -0,0 +1,32 @@ +{ + "1": { + "2f3135": "372b61", + "3f424d": "4c4982", + "181a1b": "181a1b", + "ffcd37": "7dffc0", + "be8f29": "5dd9c8", + "91a5c3": "e39fc5", + "f9f9f9": "f9f9f9", + "73bbbf": "f7859b", + "643c28": "433382", + "c27741": "9a5fd9", + "f1a156": "ce87fa", + "826426": "1b9ea1", + "434854": "754494" + }, + "2": { + "2f3135": "e099a5", + "3f424d": "edc5c8", + "181a1b": "181a1b", + "ffcd37": "d9647b", + "be8f29": "b3466a", + "91a5c3": "ba73b2", + "f9f9f9": "f9f9f9", + "73bbbf": "ffcf4a", + "643c28": "2b2745", + "c27741": "57436e", + "f1a156": "745b85", + "826426": "8c2a55", + "434854": "59317a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/941.json b/public/images/pokemon/variant/back/941.json new file mode 100644 index 00000000000..8ac4f1c0d7f --- /dev/null +++ b/public/images/pokemon/variant/back/941.json @@ -0,0 +1,32 @@ +{ + "1": { + "15161e": "15161e", + "34393f": "2b3863", + "26282c": "1f1d54", + "aa7e24": "3dd1cc", + "ffcd37": "6ef5c8", + "fdfdfd": "fdfdfd", + "0f0f0f": "0f0f0f", + "73bbbf": "de82ff", + "2b1717": "773185", + "692a2f": "ff9ec6", + "441e21": "d16492", + "624a20": "217991", + "37415a": "55348a" + }, + "2": { + "15161e": "15161e", + "34393f": "f7bebe", + "26282c": "e394a7", + "aa7e24": "c44f6c", + "ffcd37": "e3667d", + "fdfdfd": "fdfdfd", + "0f0f0f": "0f0f0f", + "73bbbf": "ffcf4a", + "2b1717": "3a3466", + "692a2f": "776294", + "441e21": "51467a", + "624a20": "8a2f62", + "37415a": "723b80" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/953.json b/public/images/pokemon/variant/back/953.json new file mode 100644 index 00000000000..9a56df52cb9 --- /dev/null +++ b/public/images/pokemon/variant/back/953.json @@ -0,0 +1,28 @@ +{ + "1": { + "776348": "323aa5", + "5b4d37": "1c1e76", + "9e8461": "4059bd", + "f38725": "2e8c19", + "575244": "18734a", + "c5b4aa": "d3e6e6", + "37332b": "104139", + "777463": "199e46", + "000000": "000000", + "a28e86": "c1d8db", + "b96c26": "2f7410" + }, + "2": { + "776348": "8c9fbf", + "5b4d37": "333e5f", + "9e8461": "dbedec", + "f38725": "4baecd", + "575244": "5e2d72", + "c5b4aa": "39cfbc", + "37332b": "261031", + "777463": "8358a1", + "000000": "000000", + "a28e86": "52b0b0", + "b96c26": "4792bd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/954.json b/public/images/pokemon/variant/back/954.json new file mode 100644 index 00000000000..b760ea947d4 --- /dev/null +++ b/public/images/pokemon/variant/back/954.json @@ -0,0 +1,34 @@ +{ + "1": { + "750082": "4b5173", + "e310fb": "e1efff", + "ab0eab": "a0a9da", + "c22461": "87ceeb", + "f73983": "ffbc00", + "9a1b48": "fffd91", + "f8f8f8": "fbf3ab", + "181818": "181818", + "5ea2c6": "7d4538", + "6bc0dd": "b05858", + "3f4f5c": "523223", + "c94c5a": "159464", + "6a2027": "096757", + "98979d": "d9bd6f" + }, + "2": { + "750082": "470d1a", + "e310fb": "9b2f17", + "ab0eab": "6b1911", + "c22461": "c85712", + "f73983": "141031", + "9a1b48": "ded051", + "f8f8f8": "432f77", + "181818": "181818", + "5ea2c6": "616481", + "6bc0dd": "9e9fb6", + "3f4f5c": "21214c", + "c94c5a": "4c92c5", + "6a2027": "215d85", + "98979d": "221a4c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/98.json b/public/images/pokemon/variant/back/98.json new file mode 100644 index 00000000000..3fc272d9ff2 --- /dev/null +++ b/public/images/pokemon/variant/back/98.json @@ -0,0 +1,30 @@ +{ + "1": { + "de524a": "674796", + "843110": "433868", + "ffa563": "c466f3", + "ff7331": "9359ca", + "101010": "101010", + "5a4221": "231947", + "ffdebd": "c3d6ff", + "e6bd8c": "9ba3d9", + "735210": "4c5067", + "ffffff": "ffffff", + "dedede": "dedede", + "b58442": "847ebe" + }, + "2": { + "de524a": "2678b8", + "843110": "234b85", + "ffa563": "5ce6f3", + "ff7331": "4abbd4", + "101010": "101010", + "5a4221": "0d193e", + "ffdebd": "4a5197", + "e6bd8c": "342b78", + "735210": "232756", + "ffffff": "ffffff", + "dedede": "dedede", + "b58442": "1e1e64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/981.json b/public/images/pokemon/variant/back/981.json new file mode 100644 index 00000000000..985b3611ab8 --- /dev/null +++ b/public/images/pokemon/variant/back/981.json @@ -0,0 +1,50 @@ +{ + "1": { + "43341e": "112b46", + "0f0f0f": "0f0f0f", + "6f5431": "1f4062", + "8b704c": "3d6186", + "36383d": "503a2d", + "242322": "39291f", + "9ca0ab": "665144", + "fff42f": "c29925", + "deb43d": "dec93d", + "fcfcfc": "fcfcfc", + "775c10": "774f10", + "a8abb3": "a8abb3", + "b1a75c": "882d2d", + "513c21": "500f0f", + "fdec8a": "9c3e3e", + "ce5742": "aba275", + "6f5d35": "6c1919", + "ed7474": "c59671", + "68281c": "534f3a", + "a03f2e": "868062", + "f5aa77": "d4b095", + "f18d4e": "d8d1ad" + }, + "2": { + "43341e": "52ab5f", + "0f0f0f": "0f0f0f", + "6f5431": "a8e781", + "8b704c": "e4efcf", + "36383d": "792e51", + "242322": "34162a", + "9ca0ab": "9c5978", + "fff42f": "ed9233", + "deb43d": "ebbb72", + "fcfcfc": "fcfcfc", + "775c10": "b35127", + "a8abb3": "a8abb3", + "b1a75c": "1e7884", + "513c21": "1a456c", + "fdec8a": "2a9d8f", + "ce5742": "1a2e43", + "6f5d35": "1b5c77", + "ed7474": "314f7a", + "68281c": "0e182e", + "a03f2e": "17253d", + "f5aa77": "4a7688", + "f18d4e": "264653" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/99-gigantamax.json b/public/images/pokemon/variant/back/99-gigantamax.json new file mode 100644 index 00000000000..31fa87f0e8d --- /dev/null +++ b/public/images/pokemon/variant/back/99-gigantamax.json @@ -0,0 +1,32 @@ +{ + "1": { + "c56a5a": "6232a9", + "f6c58b": "9f60d5", + "832908": "3b1c69", + "ee8b4a": "8853bf", + "101010": "101010", + "735210": "534681", + "fdfdfd": "ffdbdb", + "e1d0db": "d5869b", + "ffe6b4": "c3d6ff", + "eebd8b": "9ba3d9", + "b47b5a": "7c72b6", + "b5a6b5": "b65782", + "9a859a": "872d65" + }, + "2": { + "c56a5a": "2d6f9e", + "f6c58b": "75e0e8", + "832908": "22447d", + "ee8b4a": "43adc4", + "101010": "101010", + "735210": "1e1743", + "fdfdfd": "b1f1cf", + "e1d0db": "73c1c2", + "ffe6b4": "464d89", + "eebd8b": "31296f", + "b47b5a": "231b4e", + "b5a6b5": "44778a", + "9a859a": "2f4c6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/99.json b/public/images/pokemon/variant/back/99.json new file mode 100644 index 00000000000..3dcbff624f5 --- /dev/null +++ b/public/images/pokemon/variant/back/99.json @@ -0,0 +1,26 @@ +{ + "1": { + "842908": "3b1c69", + "c56b5a": "6232a9", + "ef8c4a": "8853bf", + "f7c58c": "9f60d5", + "101010": "101010", + "4a3121": "4a3121", + "efbd8c": "9ba3d9", + "ffe6b5": "c3d6ff", + "b57b5a": "7c72b6", + "735210": "534681" + }, + "2": { + "842908": "213d78", + "c56b5a": "2d6f9e", + "ef8c4a": "43adc4", + "f7c58c": "75e0e8", + "101010": "101010", + "4a3121": "1c1f46", + "efbd8c": "31296f", + "ffe6b5": "464d89", + "b57b5a": "231d51", + "735210": "1e1743" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/178_2.json b/public/images/pokemon/variant/back/female/178_2.json new file mode 100644 index 00000000000..202894b474c --- /dev/null +++ b/public/images/pokemon/variant/back/female/178_2.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "178_2.png", + "format": "RGBA8888", + "size": { + "w": 263, + "h": 263 + }, + "scale": 1, + "frames": [ + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 58, + "w": 64, + "h": 58 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 58, + "w": 64, + "h": 58 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 58, + "h": 57 + }, + "frame": { + "x": 67, + "y": 0, + "w": 58, + "h": 57 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 58, + "h": 57 + }, + "frame": { + "x": 67, + "y": 0, + "w": 58, + "h": 57 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 59, + "h": 54 + }, + "frame": { + "x": 0, + "y": 116, + "w": 59, + "h": 54 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 59, + "h": 54 + }, + "frame": { + "x": 0, + "y": 116, + "w": 59, + "h": 54 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 55, + "h": 57 + }, + "frame": { + "x": 125, + "y": 0, + "w": 55, + "h": 57 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 55, + "h": 57 + }, + "frame": { + "x": 125, + "y": 0, + "w": 55, + "h": 57 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 54, + "h": 57 + }, + "frame": { + "x": 0, + "y": 170, + "w": 54, + "h": 57 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 54, + "h": 57 + }, + "frame": { + "x": 0, + "y": 170, + "w": 54, + "h": 57 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 54, + "h": 52 + }, + "frame": { + "x": 180, + "y": 0, + "w": 54, + "h": 52 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 54, + "h": 52 + }, + "frame": { + "x": 180, + "y": 0, + "w": 54, + "h": 52 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 48, + "h": 56 + }, + "frame": { + "x": 54, + "y": 170, + "w": 48, + "h": 56 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 48, + "h": 56 + }, + "frame": { + "x": 54, + "y": 170, + "w": 48, + "h": 56 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 48, + "h": 54 + }, + "frame": { + "x": 59, + "y": 116, + "w": 48, + "h": 54 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 48, + "h": 54 + }, + "frame": { + "x": 59, + "y": 116, + "w": 48, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 199, + "y": 156, + "w": 48, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 199, + "y": 156, + "w": 48, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 48, + "h": 51 + }, + "frame": { + "x": 150, + "y": 162, + "w": 48, + "h": 51 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 48, + "h": 51 + }, + "frame": { + "x": 150, + "y": 162, + "w": 48, + "h": 51 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 50, + "h": 51 + }, + "frame": { + "x": 198, + "y": 208, + "w": 50, + "h": 51 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 50, + "h": 51 + }, + "frame": { + "x": 198, + "y": 208, + "w": 50, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:09a3b8263891ad99a615fcb08d56ef56:420667b66547b2d5cc8ddbc8c794dd00:319c95b9f5acf1139a5c6761349cd6ab$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/178_2.png b/public/images/pokemon/variant/back/female/178_2.png new file mode 100644 index 00000000000..3bf2b443719 Binary files /dev/null and b/public/images/pokemon/variant/back/female/178_2.png differ diff --git a/public/images/pokemon/variant/back/female/178_3.json b/public/images/pokemon/variant/back/female/178_3.json new file mode 100644 index 00000000000..a1ba7af59d3 --- /dev/null +++ b/public/images/pokemon/variant/back/female/178_3.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "178_3.png", + "format": "RGBA8888", + "size": { + "w": 263, + "h": 263 + }, + "scale": 1, + "frames": [ + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 67, + "h": 58 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 58, + "w": 64, + "h": 58 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 58, + "w": 64, + "h": 58 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 58, + "h": 57 + }, + "frame": { + "x": 67, + "y": 0, + "w": 58, + "h": 57 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 58, + "h": 57 + }, + "frame": { + "x": 67, + "y": 0, + "w": 58, + "h": 57 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 59, + "h": 54 + }, + "frame": { + "x": 0, + "y": 116, + "w": 59, + "h": 54 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 59, + "h": 54 + }, + "frame": { + "x": 0, + "y": 116, + "w": 59, + "h": 54 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 55, + "h": 57 + }, + "frame": { + "x": 125, + "y": 0, + "w": 55, + "h": 57 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 55, + "h": 57 + }, + "frame": { + "x": 125, + "y": 0, + "w": 55, + "h": 57 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 54, + "h": 57 + }, + "frame": { + "x": 0, + "y": 170, + "w": 54, + "h": 57 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 54, + "h": 57 + }, + "frame": { + "x": 0, + "y": 170, + "w": 54, + "h": 57 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 54, + "h": 52 + }, + "frame": { + "x": 180, + "y": 0, + "w": 54, + "h": 52 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 54, + "h": 52 + }, + "frame": { + "x": 180, + "y": 0, + "w": 54, + "h": 52 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 48, + "h": 56 + }, + "frame": { + "x": 54, + "y": 170, + "w": 48, + "h": 56 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 48, + "h": 56 + }, + "frame": { + "x": 54, + "y": 170, + "w": 48, + "h": 56 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 48, + "h": 54 + }, + "frame": { + "x": 59, + "y": 116, + "w": 48, + "h": 54 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 48, + "h": 54 + }, + "frame": { + "x": 59, + "y": 116, + "w": 48, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 102, + "y": 170, + "w": 48, + "h": 52 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 52, + "h": 52 + }, + "frame": { + "x": 180, + "y": 52, + "w": 52, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 50, + "h": 52 + }, + "frame": { + "x": 64, + "y": 58, + "w": 50, + "h": 52 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 51, + "h": 52 + }, + "frame": { + "x": 114, + "y": 57, + "w": 51, + "h": 52 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 47, + "h": 52 + }, + "frame": { + "x": 107, + "y": 110, + "w": 47, + "h": 52 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 154, + "y": 109, + "w": 45, + "h": 52 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 45, + "h": 52 + }, + "frame": { + "x": 199, + "y": 104, + "w": 45, + "h": 52 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 199, + "y": 156, + "w": 48, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 48, + "h": 52 + }, + "frame": { + "x": 199, + "y": 156, + "w": 48, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 48, + "h": 51 + }, + "frame": { + "x": 150, + "y": 162, + "w": 48, + "h": 51 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 48, + "h": 51 + }, + "frame": { + "x": 150, + "y": 162, + "w": 48, + "h": 51 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 48, + "h": 50 + }, + "frame": { + "x": 150, + "y": 213, + "w": 48, + "h": 50 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 50, + "h": 51 + }, + "frame": { + "x": 198, + "y": 208, + "w": 50, + "h": 51 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 59 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 50, + "h": 51 + }, + "frame": { + "x": 198, + "y": 208, + "w": 50, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:09a3b8263891ad99a615fcb08d56ef56:420667b66547b2d5cc8ddbc8c794dd00:319c95b9f5acf1139a5c6761349cd6ab$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/178_3.png b/public/images/pokemon/variant/back/female/178_3.png new file mode 100644 index 00000000000..9533621c6d6 Binary files /dev/null and b/public/images/pokemon/variant/back/female/178_3.png differ diff --git a/public/images/pokemon/variant/back/female/185.json b/public/images/pokemon/variant/back/female/185.json new file mode 100644 index 00000000000..f65d9951e05 --- /dev/null +++ b/public/images/pokemon/variant/back/female/185.json @@ -0,0 +1,24 @@ +{ + "1": { + "101010": "101010", + "635a4a": "303429", + "ad845a": "6f7367", + "8c7342": "515549", + "315a19": "39270c", + "5a8c5a": "8e641a", + "4ac542": "a48d29", + "c5a54a": "82847c", + "e6b54a": "8f991b" + }, + "2": { + "101010": "101010", + "635a4a": "243075", + "ad845a": "4663b1", + "8c7342": "3d47a2", + "315a19": "427ab3", + "5a8c5a": "60b7d3", + "4ac542": "96e4ed", + "c5a54a": "648cc6", + "e6b54a": "cbc7e6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/190.json b/public/images/pokemon/variant/back/female/190.json new file mode 100644 index 00000000000..7945e4a1186 --- /dev/null +++ b/public/images/pokemon/variant/back/female/190.json @@ -0,0 +1,24 @@ +{ + "1": { + "52216b": "701523", + "a55ac5": "c47440", + "bd7bde": "dea95a", + "000000": "000000", + "8442ad": "ad452f", + "8c6b42": "8c7457", + "c5ad6b": "c4b487", + "ffdea5": "ffeccc", + "bd8c63": "bd9a7e" + }, + "2": { + "52216b": "807870", + "a55ac5": "bfbeb4", + "bd7bde": "e5dfdf", + "000000": "000000", + "8442ad": "a6a297", + "8c6b42": "632339", + "c5ad6b": "99455d", + "ffdea5": "ed8286", + "bd8c63": "802d44" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/203.json b/public/images/pokemon/variant/back/female/203.json new file mode 100644 index 00000000000..1429eb40c25 --- /dev/null +++ b/public/images/pokemon/variant/back/female/203.json @@ -0,0 +1,36 @@ +{ + "1": { + "424a73": "351810", + "ffffff": "ffffff", + "adb5d6": "8f6f66", + "6b8cb5": "512b21", + "4a3a3a": "231117", + "efde52": "9c3e3e", + "c5a53a": "7e262d", + "9c3a5a": "ab9d75", + "101010": "101010", + "9c7b42": "571522", + "ce6b94": "d8d1ad", + "947b6b": "1f4062", + "635252": "112246", + "8c735a": "732027", + "d6c53a": "863838" + }, + "2": { + "424a73": "27091d", + "ffffff": "ffffff", + "adb5d6": "c5b0b7", + "6b8cb5": "4a1b33", + "4a3a3a": "091225", + "efde52": "2a9d8f", + "c5a53a": "1e7884", + "9c3a5a": "52ab5f", + "101010": "101010", + "9c7b42": "15545d", + "ce6b94": "a8e781", + "947b6b": "1a2e43", + "635252": "111d34", + "8c735a": "16656f", + "d6c53a": "1f887b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/217.json b/public/images/pokemon/variant/back/female/217.json new file mode 100644 index 00000000000..7ce80e163b6 --- /dev/null +++ b/public/images/pokemon/variant/back/female/217.json @@ -0,0 +1,38 @@ +{ + "0": { + "422919": "112114", + "7b7b8c": "7b7b8c", + "101010": "101010", + "945221": "2f6324", + "ffffff": "ffffff", + "634229": "1d3d26", + "b5b5bd": "b5b5bd", + "f7c563": "fecd85", + "c59c4a": "cd9343", + "dedede": "dedede" + }, + "1": { + "422919": "2d0e1f", + "7b7b8c": "7b7b8c", + "101010": "101010", + "945221": "8c2a37", + "ffffff": "ffffff", + "634229": "6b1d38", + "b5b5bd": "b5b5bd", + "f7c563": "f2cab8", + "c59c4a": "c48e81", + "dedede": "dedede" + }, + "2": { + "422919": "111433", + "7b7b8c": "7b7b8c", + "101010": "101010", + "945221": "323760", + "ffffff": "ffffff", + "634229": "1e2249", + "b5b5bd": "b5b5bd", + "f7c563": "5ccaf2", + "c59c4a": "45a2f9", + "dedede": "dedede" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/255.json b/public/images/pokemon/variant/back/female/255.json new file mode 100644 index 00000000000..d3666839aac --- /dev/null +++ b/public/images/pokemon/variant/back/female/255.json @@ -0,0 +1,24 @@ +{ + "1": { + "ad8c00": "782a14", + "f7de6b": "f1a545", + "000000": "000000", + "efbd31": "d36f2b", + "7b4a19": "580c0b", + "ad4210": "318793", + "e65a21": "4cada9", + "ff8c31": "6bcdb2", + "ffffff": "ffffff" + }, + "2": { + "ad8c00": "550d38", + "f7de6b": "ad3342", + "000000": "000000", + "efbd31": "811c3e", + "7b4a19": "43082f", + "ad4210": "b3817d", + "e65a21": "d3afa0", + "ff8c31": "f3e5cf", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/256.json b/public/images/pokemon/variant/back/female/256.json new file mode 100644 index 00000000000..a688ca2f6d0 --- /dev/null +++ b/public/images/pokemon/variant/back/female/256.json @@ -0,0 +1,32 @@ +{ + "1": { + "9c3110": "8e3820", + "191919": "191919", + "ff7b4a": "f7ca4b", + "de5a29": "da8923", + "9c7329": "3a888d", + "efbd4a": "84cfc1", + "efde73": "c3f4cd", + "645455": "3e3969", + "9c8c84": "696098", + "dedece": "9386b8", + "6b6b73": "3e3969", + "5a4a4a": "2c2a44", + "84736b": "574b6e" + }, + "2": { + "9c3110": "8a685f", + "191919": "191919", + "ff7b4a": "fff7e1", + "de5a29": "cdb09b", + "9c7329": "64163c", + "efbd4a": "962b4a", + "efde73": "c44d52", + "645455": "211d32", + "9c8c84": "2d2e46", + "dedece": "494f67", + "6b6b73": "161c2c", + "5a4a4a": "ad662b", + "84736b": "e6a653" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/257.json b/public/images/pokemon/variant/back/female/257.json new file mode 100644 index 00000000000..dadb97bbad6 --- /dev/null +++ b/public/images/pokemon/variant/back/female/257.json @@ -0,0 +1,52 @@ +{ + "1": { + "b93e3e": "46649c", + "bdb594": "a8c7da", + "948463": "8095b3", + "ee5e5e": "598dc1", + "dedeb5": "f0fbff", + "ff8463": "70b0d5", + "000000": "000000", + "63524a": "55607d", + "842929": "8e3820", + "ef6363": "f7ca4b", + "bd4242": "da8923", + "7b2525": "232647", + "bd5f42": "97a3cc", + "ffde6b": "e1f0ff", + "297bd6": "c64c07", + "dfa550": "b2c3e3", + "634e4a": "2c2a44", + "9c8c84": "574b6e", + "ffffff": "9386b8", + "8c633a": "3a9898", + "c46b37": "e29b47", + "dea552": "6bcdb2", + "f7d663": "a3f6be" + }, + "2": { + "b93e3e": "55153a", + "bdb594": "a43b45", + "948463": "772436", + "ee5e5e": "772040", + "dedeb5": "cc6155", + "ff8463": "912d42", + "000000": "000000", + "63524a": "5b1832", + "842929": "9c7c70", + "ef6363": "fffae1", + "bd4242": "d2bda7", + "7b2525": "470f2f", + "bd5f42": "983b2d", + "ffde6b": "da9b60", + "297bd6": "3a4881", + "dfa550": "be6646", + "634e4a": "ad662b", + "9c8c84": "e6a653", + "ffffff": "4d4266", + "8c633a": "2d2449", + "c46b37": "655387", + "dea552": "453969", + "f7d663": "6e6187" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/307.json b/public/images/pokemon/variant/back/female/307.json new file mode 100644 index 00000000000..3bdadaa8e16 --- /dev/null +++ b/public/images/pokemon/variant/back/female/307.json @@ -0,0 +1,22 @@ +{ + "1": { + "7b6b6b": "7a5f5f", + "b5adad": "9f8383", + "e6dede": "deccc3", + "000000": "000000", + "3a84b5": "7e4377", + "3a4a5a": "5a2859", + "6bcee6": "f4a8c8", + "5aa5ce": "ce7bb0" + }, + "2": { + "7b6b6b": "314b76", + "b5adad": "677d98", + "e6dede": "c2cfdb", + "000000": "000000", + "3a84b5": "51876e", + "3a4a5a": "113926", + "6bcee6": "7edfb7", + "5aa5ce": "66c3a3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/418_2.json b/public/images/pokemon/variant/back/female/418_2.json new file mode 100644 index 00000000000..3b8f35a81a3 --- /dev/null +++ b/public/images/pokemon/variant/back/female/418_2.json @@ -0,0 +1,2666 @@ +{ + "textures": [ + { + "image": "418_2.png", + "format": "RGBA8888", + "size": { + "w": 291, + "h": 291 + }, + "scale": 1, + "frames": [ + { + "filename": "0107.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + }, + "frame": { + "x": 0, + "y": 49, + "w": 48, + "h": 49 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + }, + "frame": { + "x": 0, + "y": 49, + "w": 48, + "h": 49 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 47, + "h": 49 + }, + "frame": { + "x": 0, + "y": 98, + "w": 47, + "h": 49 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 47, + "h": 49 + }, + "frame": { + "x": 0, + "y": 98, + "w": 47, + "h": 49 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 46, + "h": 49 + }, + "frame": { + "x": 0, + "y": 147, + "w": 46, + "h": 49 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 46, + "h": 49 + }, + "frame": { + "x": 0, + "y": 147, + "w": 46, + "h": 49 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 45, + "h": 49 + }, + "frame": { + "x": 0, + "y": 196, + "w": 45, + "h": 49 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 45, + "h": 49 + }, + "frame": { + "x": 0, + "y": 196, + "w": 45, + "h": 49 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 47, + "y": 98, + "w": 44, + "h": 49 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 47, + "y": 98, + "w": 44, + "h": 49 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 47, + "y": 98, + "w": 44, + "h": 49 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 89, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 89, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 89, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 90, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 90, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 90, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 133, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 133, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 48, + "y": 0, + "w": 44, + "h": 49 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 48, + "y": 0, + "w": 44, + "h": 49 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 92, + "y": 0, + "w": 43, + "h": 49 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 92, + "y": 0, + "w": 43, + "h": 49 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 92, + "y": 0, + "w": 43, + "h": 49 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 98, + "w": 43, + "h": 49 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 98, + "w": 43, + "h": 49 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 98, + "w": 43, + "h": 49 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 222, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 222, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 222, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 48, + "w": 45, + "h": 48 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 48, + "w": 45, + "h": 48 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 48, + "w": 45, + "h": 48 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 134, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 134, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 48, + "w": 45, + "h": 47 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 48, + "w": 45, + "h": 47 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 48, + "w": 45, + "h": 47 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 95, + "w": 45, + "h": 47 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 95, + "w": 45, + "h": 47 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 95, + "w": 45, + "h": 47 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 177, + "y": 96, + "w": 44, + "h": 48 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 177, + "y": 96, + "w": 44, + "h": 48 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 177, + "y": 96, + "w": 44, + "h": 48 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 134, + "y": 145, + "w": 42, + "h": 49 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 134, + "y": 145, + "w": 42, + "h": 49 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 217, + "y": 190, + "w": 41, + "h": 49 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 217, + "y": 190, + "w": 41, + "h": 49 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 38, + "h": 49 + }, + "frame": { + "x": 216, + "y": 242, + "w": 38, + "h": 49 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 38, + "h": 49 + }, + "frame": { + "x": 216, + "y": 242, + "w": 38, + "h": 49 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a608e432dea74224c0d3ab901f59492a:1c195d11645cac90cbfa18b2ad372fe5:1c8a49eb3d86294ba53e7ed6e109832e$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/418_2.png b/public/images/pokemon/variant/back/female/418_2.png new file mode 100644 index 00000000000..fc6ad0362df Binary files /dev/null and b/public/images/pokemon/variant/back/female/418_2.png differ diff --git a/public/images/pokemon/variant/back/female/418_3.json b/public/images/pokemon/variant/back/female/418_3.json new file mode 100644 index 00000000000..a03183259a7 --- /dev/null +++ b/public/images/pokemon/variant/back/female/418_3.json @@ -0,0 +1,2666 @@ +{ + "textures": [ + { + "image": "418_3.png", + "format": "RGBA8888", + "size": { + "w": 291, + "h": 291 + }, + "scale": 1, + "frames": [ + { + "filename": "0107.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + }, + "frame": { + "x": 0, + "y": 49, + "w": 48, + "h": 49 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 49 + }, + "frame": { + "x": 0, + "y": 49, + "w": 48, + "h": 49 + } + }, + { + "filename": "0123.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 47, + "h": 49 + }, + "frame": { + "x": 0, + "y": 98, + "w": 47, + "h": 49 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 47, + "h": 49 + }, + "frame": { + "x": 0, + "y": 98, + "w": 47, + "h": 49 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 46, + "h": 49 + }, + "frame": { + "x": 0, + "y": 147, + "w": 46, + "h": 49 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 46, + "h": 49 + }, + "frame": { + "x": 0, + "y": 147, + "w": 46, + "h": 49 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 45, + "h": 49 + }, + "frame": { + "x": 0, + "y": 196, + "w": 45, + "h": 49 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 45, + "h": 49 + }, + "frame": { + "x": 0, + "y": 196, + "w": 45, + "h": 49 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 45, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 46, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 47, + "y": 98, + "w": 44, + "h": 49 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 47, + "y": 98, + "w": 44, + "h": 49 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 47, + "y": 98, + "w": 44, + "h": 49 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 89, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 89, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 89, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 90, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 90, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 90, + "y": 147, + "w": 44, + "h": 49 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 133, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 133, + "y": 196, + "w": 44, + "h": 49 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 48, + "y": 0, + "w": 44, + "h": 49 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 48, + "y": 0, + "w": 44, + "h": 49 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 48, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 92, + "y": 0, + "w": 43, + "h": 49 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 92, + "y": 0, + "w": 43, + "h": 49 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 92, + "y": 0, + "w": 43, + "h": 49 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 98, + "w": 43, + "h": 49 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 98, + "w": 43, + "h": 49 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 91, + "y": 98, + "w": 43, + "h": 49 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 135, + "y": 0, + "w": 42, + "h": 49 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 222, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 222, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 222, + "y": 0, + "w": 45, + "h": 48 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 48, + "w": 45, + "h": 48 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 48, + "w": 45, + "h": 48 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 177, + "y": 48, + "w": 45, + "h": 48 + } + }, + { + "filename": "0125.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 134, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0126.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 134, + "y": 49, + "w": 43, + "h": 49 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 48, + "w": 45, + "h": 47 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 48, + "w": 45, + "h": 47 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 48, + "w": 45, + "h": 47 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 95, + "w": 45, + "h": 47 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 95, + "w": 45, + "h": 47 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 222, + "y": 95, + "w": 45, + "h": 47 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 177, + "y": 96, + "w": 44, + "h": 48 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 177, + "y": 96, + "w": 44, + "h": 48 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 177, + "y": 96, + "w": 44, + "h": 48 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 43, + "h": 47 + }, + "frame": { + "x": 134, + "y": 98, + "w": 43, + "h": 47 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 134, + "y": 145, + "w": 42, + "h": 49 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 134, + "y": 145, + "w": 42, + "h": 49 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 176, + "y": 145, + "w": 41, + "h": 49 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 221, + "y": 142, + "w": 44, + "h": 48 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 217, + "y": 190, + "w": 41, + "h": 49 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 41, + "h": 49 + }, + "frame": { + "x": 217, + "y": 190, + "w": 41, + "h": 49 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 40, + "h": 48 + }, + "frame": { + "x": 177, + "y": 194, + "w": 40, + "h": 48 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 39, + "h": 49 + }, + "frame": { + "x": 177, + "y": 242, + "w": 39, + "h": 49 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 38, + "h": 49 + }, + "frame": { + "x": 216, + "y": 242, + "w": 38, + "h": 49 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 49 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 38, + "h": 49 + }, + "frame": { + "x": 216, + "y": 242, + "w": 38, + "h": 49 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a608e432dea74224c0d3ab901f59492a:1c195d11645cac90cbfa18b2ad372fe5:1c8a49eb3d86294ba53e7ed6e109832e$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/418_3.png b/public/images/pokemon/variant/back/female/418_3.png new file mode 100644 index 00000000000..a9051456db9 Binary files /dev/null and b/public/images/pokemon/variant/back/female/418_3.png differ diff --git a/public/images/pokemon/variant/back/female/419.json b/public/images/pokemon/variant/back/female/419.json new file mode 100644 index 00000000000..3202d442933 --- /dev/null +++ b/public/images/pokemon/variant/back/female/419.json @@ -0,0 +1,38 @@ +{ + "1": { + "7b4221": "611b35", + "ef7b19": "9c354f", + "191919": "191919", + "ce6b19": "851d3e", + "ad5a21": "7d1e39", + "cebd84": "cea49d", + "f7f7b5": "e8d4cc", + "99693c": "6a808c", + "6b6b6b": "6b6b6b", + "e6a531": "a0b3ba", + "ffde00": "d2e5e8", + "d6d6ce": "d6d6ce", + "ffffff": "ffffff", + "c59452": "995e5c", + "2163a5": "385e11", + "63bde6": "6a9539" + }, + "2": { + "7b4221": "9e6a86", + "ef7b19": "debfc8", + "191919": "191919", + "ce6b19": "dca5b5", + "ad5a21": "cd91aa", + "cebd84": "965080", + "f7f7b5": "a8688f", + "99693c": "8e410e", + "6b6b6b": "726481", + "e6a531": "d4812f", + "ffde00": "eda342", + "d6d6ce": "d6d6ce", + "ffffff": "ffffff", + "c59452": "672e5d", + "2163a5": "4b2a70", + "63bde6": "744d99" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/424.json b/public/images/pokemon/variant/back/female/424.json new file mode 100644 index 00000000000..c0e9356a7a4 --- /dev/null +++ b/public/images/pokemon/variant/back/female/424.json @@ -0,0 +1,28 @@ +{ + "1": { + "734a42": "415c73", + "ad5242": "428dad", + "ff735a": "5ae9ff", + "101010": "101010", + "8c6b42": "8c7457", + "debd73": "c4b487", + "ffefa5": "ffeccc", + "52216b": "701523", + "b563e6": "dea95a", + "843aad": "ad452f", + "9c4ac5": "c47440" + }, + "2": { + "734a42": "593802", + "ad5242": "946212", + "ff735a": "ffb338", + "101010": "101010", + "8c6b42": "632339", + "debd73": "99455d", + "ffefa5": "ed8286", + "52216b": "807870", + "b563e6": "e5dfdf", + "843aad": "a6a297", + "9c4ac5": "bfbeb4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/44.json b/public/images/pokemon/variant/back/female/44.json new file mode 100644 index 00000000000..c3e5290e2a9 --- /dev/null +++ b/public/images/pokemon/variant/back/female/44.json @@ -0,0 +1,32 @@ +{ + "1": { + "c57329": "0f7469", + "8c3a19": "043d44", + "5a2900": "162486", + "101010": "101010", + "ce734a": "7aa8d2", + "ffbd42": "55bb7e", + "ad523a": "4d75b6", + "843a19": "2c489f", + "f7efbd": "7dcf94", + "ff7300": "219771", + "4a6b7b": "8259a9", + "10314a": "5d3d90", + "7b84a5": "ac76c7" + }, + "2": { + "c57329": "9f631f", + "8c3a19": "773811", + "5a2900": "5a2900", + "101010": "101010", + "ce734a": "d98247", + "ffbd42": "e8d65e", + "ad523a": "bd4e2d", + "843a19": "8d1e11", + "f7efbd": "ede68f", + "ff7300": "bd9434", + "4a6b7b": "792033", + "10314a": "490e23", + "7b84a5": "b33c40" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/45.json b/public/images/pokemon/variant/back/female/45.json new file mode 100644 index 00000000000..b278635e4cc --- /dev/null +++ b/public/images/pokemon/variant/back/female/45.json @@ -0,0 +1,36 @@ +{ + "1": { + "731910": "091d79", + "f78c8c": "8cbef7", + "f7adb5": "add8f7", + "ffced6": "ceedff", + "f77373": "5e8fde", + "de4a5a": "436ac7", + "944a00": "472b86", + "101010": "101010", + "ff8429": "966fbb", + "ce6319": "724ba4", + "19294a": "201349", + "3a4263": "4a2f81", + "9c3a42": "2243ae", + "5a6384": "6e4b9f", + "7384a5": "966fbb" + }, + "2": { + "731910": "97696f", + "f78c8c": "ebe8d1", + "f7adb5": "51030e", + "ffced6": "880808", + "f77373": "d2cbb2", + "de4a5a": "cdb2a2", + "944a00": "621734", + "101010": "101010", + "ff8429": "a23d44", + "ce6319": "8b293e", + "19294a": "510c35", + "3a4263": "8b1b50", + "9c3a42": "bb9089", + "5a6384": "b32952", + "7384a5": "de4263" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/456.json b/public/images/pokemon/variant/back/female/456.json new file mode 100644 index 00000000000..5a7072a85e3 --- /dev/null +++ b/public/images/pokemon/variant/back/female/456.json @@ -0,0 +1,34 @@ +{ + "1": { + "31425a": "b94539", + "526b8c": "986259", + "101010": "101010", + "426b84": "e2895d", + "94d6e6": "f3e1c6", + "29293a": "7e2023", + "7394ad": "cda38c", + "ad8cbd": "f6c37c", + "c54591": "f19e53", + "833171": "d3633a", + "c54a94": "8bbcd9", + "efffff": "efffff", + "73427b": "688db9", + "15202e": "15202e" + }, + "2": { + "31425a": "e89e3d", + "526b8c": "162743", + "101010": "101010", + "426b84": "fff8b0", + "94d6e6": "27616f", + "29293a": "b66736", + "7394ad": "1c405b", + "ad8cbd": "38a493", + "c54591": "5fd0a4", + "833171": "349b8b", + "c54a94": "7b1615", + "efffff": "efffff", + "73427b": "550a16", + "15202e": "15202e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/457.json b/public/images/pokemon/variant/back/female/457.json new file mode 100644 index 00000000000..d12664b8695 --- /dev/null +++ b/public/images/pokemon/variant/back/female/457.json @@ -0,0 +1,34 @@ +{ + "1": { + "526b8c": "966764", + "101010": "101010", + "c5e6f7": "fffbf2", + "94d6e6": "f3e1c6", + "7394ad": "cda38c", + "29293a": "a42d2f", + "31425a": "c75b45", + "303449": "812628", + "c54591": "ffc369", + "9e357b": "c7703c", + "efffff": "efffff", + "c54a94": "aadff3", + "73427b": "6f75a0", + "26344c": "815358" + }, + "2": { + "526b8c": "162743", + "101010": "101010", + "c5e6f7": "429b91", + "94d6e6": "27616f", + "7394ad": "1c405b", + "29293a": "ffa849", + "31425a": "ffde67", + "303449": "d67947", + "c54591": "50c2a1", + "9e357b": "2e9b8f", + "efffff": "efffff", + "c54a94": "983121", + "73427b": "7b1213", + "26344c": "12223d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/465.json b/public/images/pokemon/variant/back/female/465.json new file mode 100644 index 00000000000..ed257655add --- /dev/null +++ b/public/images/pokemon/variant/back/female/465.json @@ -0,0 +1,21 @@ +{ + "1": { + "193a63": "391963", + "295a84": "472984", + "3a73ad": "6b3aad", + "000000": "000000", + "5a193a": "195a2a", + "bd216b": "21bd69", + "31313a": "31313a", + "d65a94": "5ad662" + }, + "2": { + "5a193a": "752e2e", + "31313a": "3d1519", + "d65a94": "e67d2f", + "3a73ad": "ebc582", + "295a84": "ad875a", + "bd216b": "b35131", + "193a63": "705040" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/6215.json b/public/images/pokemon/variant/back/female/6215.json new file mode 100644 index 00000000000..741d6ddc0bb --- /dev/null +++ b/public/images/pokemon/variant/back/female/6215.json @@ -0,0 +1,32 @@ +{ + "1": { + "724ca2": "12968b", + "503678": "0f5d6d", + "956cbe": "31dabb", + "9c9bce": "ae8976", + "514a80": "402010", + "dcdbf7": "d0b3a4", + "080808": "080808", + "28234b": "220d0a", + "7d6ca4": "853a36", + "584d80": "562627", + "f6f6ff": "f6f6ff", + "bdbdc5": "bdbdc5", + "c52973": "ea903f" + }, + "2": { + "724ca2": "982e33", + "503678": "601522", + "956cbe": "cc5427", + "9c9bce": "3c8775", + "514a80": "14273a", + "dcdbf7": "60ae7e", + "080808": "080808", + "28234b": "0a191e", + "7d6ca4": "395962", + "584d80": "1c3942", + "f6f6ff": "f6f6ff", + "bdbdc5": "bdbdc5", + "c52973": "f49633" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/1003.json b/public/images/pokemon/variant/exp/1003.json new file mode 100644 index 00000000000..b9e73bfb9aa --- /dev/null +++ b/public/images/pokemon/variant/exp/1003.json @@ -0,0 +1,44 @@ +{ + "1": { + "000000": "000000", + "477068": "daa666", + "905a20": "655062", + "2e4f49": "96562e", + "212021": "653318", + "be8b54": "cb523d", + "e2b07a": "ff7d59", + "6f4312": "4e3d51", + "885a27": "962f26", + "685e4c": "7c6a7b", + "97886e": "9c8e99", + "c6b79e": "beafb5", + "5a2020": "861d0f", + "411616": "4d0400", + "654b3e": "352831", + "883c3c": "c64732", + "36271f": "1f1822", + "a52020": "009db7", + "856e62": "514758" + }, + "2": { + "000000": "000000", + "477068": "8d6acc", + "905a20": "57599c", + "2e4f49": "6241a1", + "212021": "342368", + "be8b54": "555861", + "e2b07a": "767a7e", + "6f4312": "36366f", + "885a27": "363741", + "685e4c": "5e5456", + "97886e": "ada09c", + "c6b79e": "d5d1c7", + "5a2020": "313246", + "411616": "1a1a31", + "654b3e": "434377", + "883c3c": "585869", + "36271f": "1c1c3e", + "a52020": "ffeb88", + "856e62": "8183b3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/1006.json b/public/images/pokemon/variant/exp/1006.json new file mode 100644 index 00000000000..3fd7c511936 --- /dev/null +++ b/public/images/pokemon/variant/exp/1006.json @@ -0,0 +1,50 @@ +{ + "2": { + "37522e": "2a224e", + "000000": "000000", + "456539": "2a224e", + "4b9080": "3e2d63", + "456639": "2a224e", + "72d9bc": "585995", + "56b64c": "c2c8dc", + "4e873a": "79728e", + "64bc5b": "ccd1e3", + "599942": "908aa3", + "53b249": "c2c8dc", + "538f3e": "88819c", + "6f706f": "17256a", + "7b7c7b": "2a224e", + "717271": "2a224e", + "ffffff": "36a5aa", + "691938": "2ac6a5", + "9dcf91": "f5edf8", + "a83966": "59e3c5", + "a5d39a": "fdf8ff", + "88c67a": "f5edf8", + "bababa": "27678e", + "ff78ac": "d8f8e9", + "ffdbe4": "f1fff4", + "ff3e89": "a5ffd4", + "8c2f55": "24806c", + "ffe8ee": "e8fff8", + "5b834a": "686278", + "ffa3c7": "d8f8e9", + "669353": "777287", + "5f884d": "686278", + "4a4a4a": "2a224e", + "ffafce": "dffff0", + "517843": "17256a", + "4b6e3e": "17256a", + "70c168": "c2c8dc", + "62a949": "88819c", + "60ba57": "c2c8dc", + "5a9b43": "88819c", + "868786": "17256a", + "acd7a2": "f5edf8", + "99ce8d": "f5edf8", + "ff9ec4": "d8f8e9", + "70a15b": "686278", + "ffdfe8": "d2f8e6", + "679454": "686278" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/672_2.json b/public/images/pokemon/variant/exp/1006_2.json similarity index 57% rename from public/images/pokemon/variant/exp/back/672_2.json rename to public/images/pokemon/variant/exp/1006_2.json index 216c213bc12..f8c8864dff3 100644 --- a/public/images/pokemon/variant/exp/back/672_2.json +++ b/public/images/pokemon/variant/exp/1006_2.json @@ -1,159 +1,33 @@ { "textures": [ { - "image": "672_2.png", + "image": "1006_2.png", "format": "RGBA8888", "size": { - "w": 282, - "h": 282 + "w": 528, + "h": 528 }, "scale": 1, "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, { "filename": "0002.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { "x": 0, "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 } }, { @@ -161,20 +35,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { "x": 0, - "y": 42, - "w": 41, - "h": 42 + "y": 106, + "w": 48, + "h": 106 } }, { @@ -182,20 +56,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { "x": 0, - "y": 42, - "w": 41, - "h": 42 + "y": 212, + "w": 48, + "h": 106 } }, { @@ -203,20 +77,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { "x": 0, - "y": 84, - "w": 41, - "h": 42 + "y": 318, + "w": 48, + "h": 106 } }, { @@ -224,20 +98,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { - "x": 0, - "y": 126, - "w": 41, - "h": 42 + "x": 48, + "y": 0, + "w": 48, + "h": 106 } }, { @@ -245,20 +119,230 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { + "x": 48, + "y": 106, + "w": 48, + "h": 106 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { "x": 0, - "y": 168, - "w": 41, - "h": 42 + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 48, + "y": 212, + "w": 48, + "h": 106 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 48, + "y": 318, + "w": 48, + "h": 106 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 96, + "y": 0, + "w": 48, + "h": 106 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 96, + "y": 106, + "w": 48, + "h": 106 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 96, + "y": 212, + "w": 48, + "h": 106 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 96, + "y": 318, + "w": 48, + "h": 106 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 144, + "y": 0, + "w": 48, + "h": 106 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 192, + "y": 0, + "w": 48, + "h": 106 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 240, + "y": 0, + "w": 48, + "h": 106 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 288, + "y": 0, + "w": 48, + "h": 106 } }, { @@ -266,104 +350,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { - "x": 0, - "y": 210, - "w": 41, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, + "x": 336, "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 82, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 123, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 164, - "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 } }, { @@ -371,20 +371,251 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { - "x": 205, + "x": 384, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 432, + "y": 0, + "w": 48, + "h": 106 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 480, + "y": 0, + "w": 48, + "h": 106 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 144, + "y": 106, + "w": 48, + "h": 106 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 144, + "y": 212, + "w": 48, + "h": 106 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 144, + "y": 318, + "w": 48, + "h": 106 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 192, + "y": 106, + "w": 48, + "h": 106 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 192, + "y": 212, + "w": 48, + "h": 106 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 192, + "y": 318, + "w": 48, + "h": 106 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 240, + "y": 106, + "w": 48, + "h": 106 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 288, + "y": 106, + "w": 48, + "h": 106 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 48, + "h": 106 + }, + "frame": { + "x": 336, + "y": 106, + "w": 48, + "h": 106 } }, { @@ -392,356 +623,272 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { - "x": 41, - "y": 42, - "w": 41, - "h": 42 + "x": 384, + "y": 106, + "w": 48, + "h": 106 } }, { - "filename": "0043.png", + "filename": "0046.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { - "x": 41, - "y": 84, - "w": 41, - "h": 42 + "x": 432, + "y": 106, + "w": 48, + "h": 106 } }, { - "filename": "0044.png", + "filename": "0047.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "frame": { - "x": 41, - "y": 126, - "w": 41, - "h": 42 + "x": 480, + "y": 106, + "w": 48, + "h": 106 } }, { - "filename": "0008.png", + "filename": "0048.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 168, - "w": 41, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 209, - "w": 41, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 123, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 164, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 205, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 83, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 124, - "w": 41, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, "y": 0, - "w": 40, - "h": 42 + "w": 48, + "h": 106 }, "frame": { - "x": 82, - "y": 165, - "w": 40, - "h": 42 + "x": 240, + "y": 212, + "w": 48, + "h": 106 } }, { - "filename": "0041.png", + "filename": "0001.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 207, - "w": 40, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 40, - "h": 41 + "w": 48, + "h": 105 }, "frame": { - "x": 122, - "y": 165, - "w": 40, - "h": 41 + "x": 240, + "y": 318, + "w": 48, + "h": 105 } }, { - "filename": "0012.png", + "filename": "0019.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 40, - "h": 41 + "w": 48, + "h": 105 }, "frame": { - "x": 122, - "y": 206, - "w": 40, - "h": 41 + "x": 240, + "y": 423, + "w": 48, + "h": 105 } }, { - "filename": "0013.png", + "filename": "0020.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 40, - "h": 41 + "w": 48, + "h": 105 }, "frame": { - "x": 123, - "y": 83, - "w": 40, - "h": 41 + "x": 288, + "y": 212, + "w": 48, + "h": 105 } }, { - "filename": "0014.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 40, - "h": 41 + "w": 48, + "h": 105 }, "frame": { - "x": 123, - "y": 124, - "w": 40, - "h": 41 + "x": 288, + "y": 317, + "w": 48, + "h": 105 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 105 + }, + "frame": { + "x": 288, + "y": 422, + "w": 48, + "h": 105 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 105 + }, + "frame": { + "x": 336, + "y": 212, + "w": 48, + "h": 105 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 105 + }, + "frame": { + "x": 384, + "y": 212, + "w": 48, + "h": 105 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 105 + }, + "frame": { + "x": 432, + "y": 212, + "w": 48, + "h": 105 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 48, + "h": 106 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 105 + }, + "frame": { + "x": 480, + "y": 212, + "w": 48, + "h": 105 } }, { @@ -749,20 +896,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { - "x": 1, + "x": 0, "y": 1, - "w": 40, - "h": 41 + "w": 48, + "h": 105 }, "frame": { - "x": 162, - "y": 165, - "w": 40, - "h": 41 + "x": 336, + "y": 317, + "w": 48, + "h": 105 } }, { @@ -770,20 +917,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { - "x": 1, + "x": 0, "y": 1, - "w": 40, - "h": 41 + "w": 48, + "h": 105 }, "frame": { - "x": 162, - "y": 206, - "w": 40, - "h": 41 + "x": 336, + "y": 317, + "w": 48, + "h": 105 } }, { @@ -791,167 +938,83 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { - "x": 1, + "x": 0, "y": 1, - "w": 40, - "h": 41 + "w": 48, + "h": 105 }, "frame": { - "x": 163, - "y": 83, - "w": 40, - "h": 41 + "x": 336, + "y": 422, + "w": 48, + "h": 105 } }, { - "filename": "0030.png", + "filename": "0043.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, - "y": 2, - "w": 41, - "h": 40 + "y": 1, + "w": 48, + "h": 105 }, "frame": { - "x": 163, - "y": 124, - "w": 41, - "h": 40 + "x": 384, + "y": 317, + "w": 48, + "h": 105 } }, { - "filename": "0031.png", + "filename": "0044.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { "x": 0, - "y": 2, - "w": 41, - "h": 40 + "y": 1, + "w": 48, + "h": 105 }, "frame": { - "x": 203, - "y": 83, - "w": 41, - "h": 40 + "x": 384, + "y": 317, + "w": 48, + "h": 105 } }, { - "filename": "0032.png", + "filename": "0045.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 41, - "h": 42 + "w": 48, + "h": 106 }, "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 + "x": 0, + "y": 1, + "w": 48, + "h": 105 }, "frame": { - "x": 202, - "y": 164, - "w": 40, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 204, - "y": 123, - "w": 40, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 163, - "w": 40, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 203, - "w": 40, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 204, - "w": 40, - "h": 40 + "x": 384, + "y": 422, + "w": 48, + "h": 105 } } ] @@ -960,6 +1023,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b36f1de558a8fa8ac8b56a9ba43a0dfd:5fe84a3f522e543bfbbfe0837355266b:2e4767b7cd134fc0ab1bb6e9eee82bc7$" + "smartupdate": "$TexturePacker:SmartUpdate:f1a2a3b6968ed0fc055a8dd23b7664ec:e7ed7ca85f11b9bb954989b8b7a8ca4f:ec396d31079bf59c1cfe027eb7d25f86$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/1006_2.png b/public/images/pokemon/variant/exp/1006_2.png new file mode 100644 index 00000000000..f9316dd10d6 Binary files /dev/null and b/public/images/pokemon/variant/exp/1006_2.png differ diff --git a/public/images/pokemon/variant/exp/2027.json b/public/images/pokemon/variant/exp/2027.json new file mode 100644 index 00000000000..1bf950569fb --- /dev/null +++ b/public/images/pokemon/variant/exp/2027.json @@ -0,0 +1,26 @@ +{ + "1": { + "354e73": "752e42", + "fefefe": "fefefe", + "b6dbe7": "ffdac2", + "84b3ce": "d27c80", + "101010": "101010", + "518d9f": "a24c68", + "10397b": "212d55", + "cdbe85": "d3d3c6", + "fefea9": "fffffc", + "897e67": "aaaa96" + }, + "2": { + "354e73": "3d2c78", + "fefefe": "fefefe", + "b6dbe7": "dbb1eb", + "84b3ce": "a87bcf", + "101010": "101010", + "518d9f": "6a439e", + "10397b": "1d6268", + "cdbe85": "44225a", + "fefea9": "6f3480", + "897e67": "2e163d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/2028.json b/public/images/pokemon/variant/exp/2028.json new file mode 100644 index 00000000000..36887e3f321 --- /dev/null +++ b/public/images/pokemon/variant/exp/2028.json @@ -0,0 +1,36 @@ +{ + "1": { + "3c88b4": "966281", + "101010": "101010", + "ffffff": "fffffc", + "52b0cf": "e2877b", + "b0e5f8": "fffed9", + "7dcff2": "f9e7b2", + "3a6b8c": "692a61", + "434f6f": "a14253", + "b7e3e7": "ffb59e", + "77a2bb": "d9746e", + "8c8c8c": "8d6e6f", + "525252": "6f525d", + "bdbdcd": "d0c0b6", + "606060": "4f364c", + "f1f1f4": "f1f1f4" + }, + "2": { + "3c88b4": "515fa9", + "101010": "101010", + "ffffff": "e3f0ff", + "52b0cf": "57a5c5", + "b0e5f8": "f8f5b0", + "7dcff2": "6edcaf", + "3a6b8c": "3c2d74", + "434f6f": "171227", + "b7e3e7": "5f2e71", + "77a2bb": "381d4d", + "8c8c8c": "7d83a4", + "525252": "3a3a54", + "bdbdcd": "acb7d0", + "606060": "8893ad", + "f1f1f4": "dcecff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/257-mega.json b/public/images/pokemon/variant/exp/257-mega.json new file mode 100644 index 00000000000..0da37a3799f --- /dev/null +++ b/public/images/pokemon/variant/exp/257-mega.json @@ -0,0 +1,40 @@ +{ + "1": { + "62524a": "3b3f61", + "000000": "000000", + "832929": "9b422a", + "bdb494": "a8c7da", + "dedeb4": "f0fbff", + "948362": "8095b3", + "ee6262": "f7ca4b", + "ff8362": "fff07d", + "bd4141": "da8923", + "dea452": "51b5cd", + "ffffff": "9386b8", + "9c8b83": "675c87", + "f6d562": "dafff0", + "297bd5": "930808", + "615f5d": "279e91", + "302e2d": "113b5b", + "434141": "16607e" + }, + "2": { + "62524a": "5b143d", + "000000": "000000", + "832929": "9c7c70", + "bdb494": "a1304d", + "dedeb4": "bc474d", + "948362": "842446", + "ee6262": "e8dbbe", + "ff8362": "fffce9", + "bd4141": "c7b39d", + "dea452": "7747bf", + "ffffff": "4d4266", + "9c8b83": "bf763a", + "f6d562": "c6e6ff", + "297bd5": "1d3561", + "615f5d": "505386", + "302e2d": "2b2652", + "434141": "373260" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/380-mega.json b/public/images/pokemon/variant/exp/380-mega.json index 8774aec6dcd..aedcc39909c 100644 --- a/public/images/pokemon/variant/exp/380-mega.json +++ b/public/images/pokemon/variant/exp/380-mega.json @@ -9,8 +9,8 @@ "ffffff": "fafafa", "7b73a4": "b48f79", "cdcdee": "f3e6df", - "ff005a": "6734bf", - "62004a": "97440c", + "ffcd5a": "9b75ff", + "cda44a": "6734bf", "cd4a52": "6734bf" }, "2": { @@ -23,8 +23,8 @@ "ffffff": "fafafa", "7b73a4": "c78ac4", "cdcdee": "eedaea", - "ff005a": "dd6800", - "62004a": "2393a2", + "ffcd5a": "e88a00", + "cda44a": "dd6800", "cd4a52": "dd6800" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/381-mega.json b/public/images/pokemon/variant/exp/381-mega.json index 5b4d0638c6d..bb5b7cffd0b 100644 --- a/public/images/pokemon/variant/exp/381-mega.json +++ b/public/images/pokemon/variant/exp/381-mega.json @@ -9,8 +9,8 @@ "ffffff": "fafafa", "7b73a4": "b673ad", "cdcdee": "f9cfed", - "ffcd5a": "f78232", - "cda44a": "f78232", + "ff005a": "f78232", + "62004a": "f78232", "cd4a52": "d05718" }, "2": { @@ -23,8 +23,8 @@ "ffffff": "fafafa", "7b73a4": "d086ac", "cdcdee": "f7d9ec", - "ffcd5a": "9344b8", - "cda44a": "9344b8", + "ff005a": "9344b8", + "62004a": "9344b8", "cd4a52": "70309f" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/4079.json b/public/images/pokemon/variant/exp/4079.json new file mode 100644 index 00000000000..cb94f21fed1 --- /dev/null +++ b/public/images/pokemon/variant/exp/4079.json @@ -0,0 +1,32 @@ +{ + "1": { + "936d20": "ad937b", + "caaa2c": "edc59e", + "aa4a6b": "613934", + "fefe3c": "ffeccb", + "f88daf": "bb694b", + "7c2847": "452a29", + "d76d96": "8f5345", + "101010": "101010", + "d5cdcd": "d5cdcd", + "fcfcfc": "fcfcfc", + "dea462": "e0799c", + "8b5a18": "a84071", + "ffe6b4": "ff9eba" + }, + "2": { + "936d20": "7b2c51", + "caaa2c": "963e59", + "aa4a6b": "846467", + "fefe3c": "d9736b", + "f88daf": "ecdcbe", + "7c2847": "503941", + "d76d96": "c6aead", + "101010": "101010", + "d5cdcd": "d5cdcd", + "fcfcfc": "fcfcfc", + "dea462": "ca8e74", + "8b5a18": "a45c58", + "ffe6b4": "eec596" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/4080.json b/public/images/pokemon/variant/exp/4080.json new file mode 100644 index 00000000000..0d1bb55a1f9 --- /dev/null +++ b/public/images/pokemon/variant/exp/4080.json @@ -0,0 +1,42 @@ +{ + "1": { + "723f7c": "edc59e", + "a565c0": "ffedcc", + "181818": "181818", + "d76792": "905446", + "c9c9c9": "c9c9c9", + "fbfbfb": "fbfbfb", + "c2c9c9": "de504e", + "f985aa": "bb694b", + "52525a": "821d2a", + "8b9494": "ad3139", + "7b6987": "a94172", + "ede2ef": "ff9fbb", + "b5a0bd": "e17a9d", + "7b2645": "573531", + "e65229": "b56548", + "875a2d": "752433", + "eed583": "c75865", + "c89a51": "a84254" + }, + "2": { + "723f7c": "963e59", + "a565c0": "d9736b", + "181818": "181818", + "d76792": "c6aead", + "c9c9c9": "c9c9c9", + "fbfbfb": "fbfbfb", + "c2c9c9": "b0dc72", + "f985aa": "ecdcbe", + "52525a": "2a6122", + "8b9494": "71ae48", + "7b6987": "a45c58", + "ede2ef": "eec596", + "b5a0bd": "ca8e74", + "7b2645": "846467", + "e65229": "bfada6", + "875a2d": "1b2e34", + "eed583": "4b7569", + "c89a51": "2a4948" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/4199.json b/public/images/pokemon/variant/exp/4199.json new file mode 100644 index 00000000000..703b641ef72 --- /dev/null +++ b/public/images/pokemon/variant/exp/4199.json @@ -0,0 +1,50 @@ +{ + "1": { + "493e66": "831e2b", + "a191b5": "de504e", + "7a6a98": "ad3139", + "101010": "101010", + "654493": "7e3351", + "413668": "622344", + "403468": "4f0926", + "269a36": "f28783", + "f8f8f8": "f8f8f8", + "a090b5": "ff9eba", + "63577d": "a84071", + "403568": "66222b", + "723f7c": "d0bca2", + "7b2645": "573531", + "624493": "85363d", + "d76792": "8f5345", + "a565c0": "ffeccb", + "482a5b": "ae947c", + "f985aa": "bb694b", + "a36c37": "752433", + "eed583": "c75865", + "c89a51": "a84254" + }, + "2": { + "493e66": "2a6122", + "a191b5": "b0dc72", + "7a6a98": "71ae48", + "101010": "101010", + "654493": "37725b", + "413668": "1d4c46", + "403468": "9e3536", + "269a36": "e58b5c", + "f8f8f8": "f8f8f8", + "a090b5": "efc697", + "63577d": "a55d59", + "403568": "e6a572", + "723f7c": "ae4653", + "7b2645": "846467", + "624493": "ffedad", + "d76792": "c7afae", + "a565c0": "d9736b", + "482a5b": "7b2c51", + "f985aa": "ecdcbe", + "a36c37": "1b2e34", + "eed583": "4b7569", + "c89a51": "2a4948" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/4562.json b/public/images/pokemon/variant/exp/4562.json new file mode 100644 index 00000000000..66dc22274b9 --- /dev/null +++ b/public/images/pokemon/variant/exp/4562.json @@ -0,0 +1,30 @@ +{ + "1": { + "313131": "145555", + "525252": "257e6a", + "101010": "101010", + "672b82": "7e173e", + "ab38d1": "b0264c", + "371d3f": "371d3f", + "6f5c6b": "743949", + "c5b9bb": "c69981", + "cb414b": "18265b", + "e6ddde": "d6b8a0", + "d0626a": "334599", + "927e8d": "a46361" + }, + "2": { + "313131": "69162c", + "525252": "90222b", + "101010": "101010", + "672b82": "57a0b9", + "ab38d1": "c2ffe2", + "371d3f": "371d3f", + "6f5c6b": "0a4340", + "c5b9bb": "298a61", + "cb414b": "ffad58", + "e6ddde": "4fb66a", + "d0626a": "ffe78d", + "927e8d": "1f6455" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/669-blue.json b/public/images/pokemon/variant/exp/669-blue.json new file mode 100644 index 00000000000..7b79007d9e8 --- /dev/null +++ b/public/images/pokemon/variant/exp/669-blue.json @@ -0,0 +1,42 @@ +{ + "1": { + "706050": "635c55", + "f8f7f9": "f8f7f9", + "7f6f1f": "1b0755", + "cfbfaf": "d5cabf", + "cfae4f": "350d80", + "faef69": "422cc6", + "101010": "101010", + "df4f4f": "dc6295", + "ef6f6f": "ef6fbe", + "1d563a": "95315a", + "4b8e4b": "e493a1", + "1e4b60": "200e5c", + "2e7698": "3841bf", + "42a7e1": "4d72d5", + "ffffff": "4d72d5", + "206040": "094740", + "509950": "1d8057", + "90bf60": "3baa65" + }, + "2": { + "706050": "32448e", + "f8f7f9": "dff2ff", + "7f6f1f": "393833", + "cfbfaf": "a5c3ea", + "cfae4f": "c4c6bf", + "faef69": "fdfffb", + "101010": "101010", + "df4f4f": "048080", + "ef6f6f": "5fa9dd", + "1d563a": "193b94", + "4b8e4b": "33a2bf", + "1e4b60": "215510", + "2e7698": "739f1f", + "42a7e1": "afcf4f", + "ffffff": "afcf4f", + "206040": "121c0d", + "509950": "3c403a", + "90bf60": "8f948c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/exp/female/916.json b/public/images/pokemon/variant/exp/669-orange_2.json similarity index 58% rename from public/images/pokemon/exp/female/916.json rename to public/images/pokemon/variant/exp/669-orange_2.json index e937dadda95..fe14267b273 100644 --- a/public/images/pokemon/exp/female/916.json +++ b/public/images/pokemon/variant/exp/669-orange_2.json @@ -1,243 +1,33 @@ { "textures": [ { - "image": "916.png", + "image": "669-orange_2.png", "format": "RGBA8888", "size": { - "w": 250, - "h": 250 + "w": 159, + "h": 159 }, "scale": 1, "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 85 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 60, - "h": 85 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 60, - "h": 80 - }, - "frame": { - "x": 0, - "y": 170, - "w": 60, - "h": 80 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 85 - }, - "frame": { - "x": 60, - "y": 85, - "w": 60, - "h": 85 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 85 - }, - "frame": { - "x": 61, - "y": 0, - "w": 60, - "h": 85 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 59, - "h": 80 - }, - "frame": { - "x": 60, - "y": 170, - "w": 59, - "h": 80 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 60, - "h": 79 - }, - "frame": { - "x": 119, - "y": 170, - "w": 60, - "h": 79 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 85 - }, - "frame": { - "x": 120, - "y": 85, - "w": 60, - "h": 85 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 60, - "h": 83 - }, - "frame": { - "x": 121, - "y": 0, - "w": 60, - "h": 83 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 60, - "h": 83 - }, - "frame": { - "x": 181, - "y": 0, - "w": 60, - "h": 83 - } - }, { "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 61, - "h": 85 + "w": 47, + "h": 55 }, "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 60, - "h": 81 + "x": 0, + "y": 1, + "w": 47, + "h": 54 }, "frame": { - "x": 180, - "y": 83, - "w": 60, - "h": 81 + "x": 0, + "y": 0, + "w": 47, + "h": 54 } }, { @@ -245,20 +35,230 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 61, - "h": 85 + "w": 47, + "h": 55 }, "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 59, - "h": 81 + "x": 0, + "y": 1, + "w": 47, + "h": 54 }, "frame": { - "x": 180, - "y": 164, - "w": 59, - "h": 81 + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 0, + "y": 108, + "w": 47, + "h": 51 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 47, + "y": 107, + "w": 47, + "h": 52 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 54, + "w": 47, + "h": 53 } } ] @@ -267,6 +267,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:08f91248c91e426c4993be4e9988fc0d:215799a2235190ac587b1617d8e7e8b9:72483d103fb6b8e5c1889150025102c8$" + "smartupdate": "$TexturePacker:SmartUpdate:c6d341e652d65eabb19d960986335ef8:0dd35a3769b2bcdd286841ae8bac20cb:0f1b4caba50b5b288825169e096a95d8$" } -} +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/669-orange_2.png b/public/images/pokemon/variant/exp/669-orange_2.png new file mode 100644 index 00000000000..ebf9f30f78e Binary files /dev/null and b/public/images/pokemon/variant/exp/669-orange_2.png differ diff --git a/public/images/pokemon/female/916.json b/public/images/pokemon/variant/exp/669-orange_3.json similarity index 56% rename from public/images/pokemon/female/916.json rename to public/images/pokemon/variant/exp/669-orange_3.json index e174d4b2d1c..ecfa39f0fd2 100644 --- a/public/images/pokemon/female/916.json +++ b/public/images/pokemon/variant/exp/669-orange_3.json @@ -1,222 +1,33 @@ { "textures": [ { - "image": "916.png", + "image": "669-orange_3.png", "format": "RGBA8888", "size": { - "w": 251, - "h": 251 + "w": 159, + "h": 159 }, "scale": 1, "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 62, - "h": 86 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 86 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 10, - "w": 61, - "h": 86 - }, - "frame": { - "x": 62, - "y": 0, - "w": 61, - "h": 86 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 10, - "w": 61, - "h": 86 - }, - "frame": { - "x": 123, - "y": 0, - "w": 61, - "h": 86 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 10, - "w": 60, - "h": 86 - }, - "frame": { - "x": 184, - "y": 0, - "w": 60, - "h": 86 - } - }, { "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 96 + "w": 47, + "h": 55 }, "spriteSourceSize": { - "x": 15, - "y": 15, - "w": 61, - "h": 81 + "x": 0, + "y": 1, + "w": 47, + "h": 54 }, "frame": { "x": 0, - "y": 86, - "w": 61, - "h": 81 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 16, - "w": 61, - "h": 80 - }, - "frame": { - "x": 61, - "y": 86, - "w": 61, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 10, - "w": 60, - "h": 86 - }, - "frame": { - "x": 122, - "y": 86, - "w": 60, - "h": 86 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 13, - "w": 60, - "h": 83 - }, - "frame": { - "x": 61, - "y": 166, - "w": 60, - "h": 83 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 13, - "w": 60, - "h": 83 - }, - "frame": { - "x": 0, - "y": 167, - "w": 60, - "h": 83 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 17, - "w": 60, - "h": 79 - }, - "frame": { - "x": 121, - "y": 172, - "w": 60, - "h": 79 + "y": 0, + "w": 47, + "h": 54 } }, { @@ -224,20 +35,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 96 + "w": 47, + "h": 55 }, "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 60, - "h": 81 + "x": 0, + "y": 1, + "w": 47, + "h": 54 }, "frame": { - "x": 182, - "y": 86, - "w": 60, - "h": 81 + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 0, + "y": 108, + "w": 47, + "h": 51 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 } }, { @@ -245,20 +182,83 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 96, - "h": 96 + "w": 47, + "h": 55 }, "spriteSourceSize": { - "x": 16, - "y": 16, - "w": 60, - "h": 80 + "x": 0, + "y": 0, + "w": 47, + "h": 53 }, "frame": { - "x": 182, - "y": 167, - "w": 60, - "h": 80 + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 47, + "y": 107, + "w": 47, + "h": 52 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 54, + "w": 47, + "h": 53 } } ] @@ -267,6 +267,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f1919e76120351b77d053dd0b1048890:6cc484548a07e592b87dcc37f6c74a39:72483d103fb6b8e5c1889150025102c8$" + "smartupdate": "$TexturePacker:SmartUpdate:c6d341e652d65eabb19d960986335ef8:0dd35a3769b2bcdd286841ae8bac20cb:0f1b4caba50b5b288825169e096a95d8$" } -} +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/669-orange_3.png b/public/images/pokemon/variant/exp/669-orange_3.png new file mode 100644 index 00000000000..8bd4cb39e3c Binary files /dev/null and b/public/images/pokemon/variant/exp/669-orange_3.png differ diff --git a/public/images/pokemon/variant/exp/669-red_2.json b/public/images/pokemon/variant/exp/669-red_2.json new file mode 100644 index 00000000000..41f3a25c227 --- /dev/null +++ b/public/images/pokemon/variant/exp/669-red_2.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-red_2.png", + "format": "RGBA8888", + "size": { + "w": 159, + "h": 159 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 0, + "y": 108, + "w": 47, + "h": 51 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 47, + "y": 107, + "w": 47, + "h": 52 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 54, + "w": 47, + "h": 53 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:58139ca151960a3dade06e99e9a37b67:19f0cd547c603cbd381f98c4d7e770cc:9f8ada9cf46c4e29f954b2eb815bc4e5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/669-red_2.png b/public/images/pokemon/variant/exp/669-red_2.png new file mode 100644 index 00000000000..8248bedd6eb Binary files /dev/null and b/public/images/pokemon/variant/exp/669-red_2.png differ diff --git a/public/images/pokemon/variant/exp/669-red_3.json b/public/images/pokemon/variant/exp/669-red_3.json new file mode 100644 index 00000000000..5f8d78023c0 --- /dev/null +++ b/public/images/pokemon/variant/exp/669-red_3.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-red_3.png", + "format": "RGBA8888", + "size": { + "w": 159, + "h": 159 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 0, + "y": 108, + "w": 47, + "h": 51 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 47, + "y": 107, + "w": 47, + "h": 52 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 54, + "w": 47, + "h": 53 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:58139ca151960a3dade06e99e9a37b67:19f0cd547c603cbd381f98c4d7e770cc:9f8ada9cf46c4e29f954b2eb815bc4e5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/669-red_3.png b/public/images/pokemon/variant/exp/669-red_3.png new file mode 100644 index 00000000000..cb2f32a4d21 Binary files /dev/null and b/public/images/pokemon/variant/exp/669-red_3.png differ diff --git a/public/images/pokemon/variant/exp/669-white.json b/public/images/pokemon/variant/exp/669-white.json new file mode 100644 index 00000000000..43bea313995 --- /dev/null +++ b/public/images/pokemon/variant/exp/669-white.json @@ -0,0 +1,40 @@ +{ + "1": { + "706050": "635c55", + "f8f7f9": "f8f7f9", + "7f6f1f": "110732", + "cfbfaf": "d5cabf", + "cfae4f": "302b40", + "faef69": "4c495c", + "101010": "101010", + "df4f4f": "dc6295", + "ef6f6f": "ef6fbe", + "1d563a": "95315a", + "4b8e4b": "e493a1", + "afafaf": "1e1d2a", + "dbdbdb": "64636a", + "ffffff": "89898e", + "206040": "094740", + "509950": "1d8057", + "90bf60": "3baa65" + }, + "2": { + "706050": "4e5751", + "f8f7f9": "f8f8f8", + "7f6f1f": "393833", + "cfbfaf": "d4dcd5", + "cfae4f": "c4c6bf", + "faef69": "fdfffb", + "101010": "101010", + "df4f4f": "273232", + "ef6f6f": "7e878d", + "1d563a": "272f2d", + "4b8e4b": "636a67", + "afafaf": "215510", + "dbdbdb": "739f1f", + "ffffff": "afcf4f", + "206040": "121c0d", + "509950": "3c403a", + "90bf60": "8f948c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/669-yellow.json b/public/images/pokemon/variant/exp/669-yellow.json new file mode 100644 index 00000000000..232013c6f88 --- /dev/null +++ b/public/images/pokemon/variant/exp/669-yellow.json @@ -0,0 +1,42 @@ +{ + "1": { + "706050": "635c55", + "f8f7f9": "f8f7f9", + "7f6f1f": "034020", + "cfbfaf": "d5cabf", + "cfae4f": "0a6323", + "faef69": "1a8e16", + "101010": "101010", + "df4f4f": "dc6295", + "ef6f6f": "ef6fbe", + "1d563a": "95315a", + "4b8e4b": "e493a1", + "a59a5b": "054e19", + "d1c472": "6f950a", + "fffd97": "abb830", + "ffffff": "abb830", + "206040": "094740", + "509950": "1d8057", + "90bf60": "3baa65" + }, + "2": { + "706050": "6a532c", + "f8f7f9": "fffde0", + "7f6f1f": "393833", + "cfbfaf": "ead295", + "cfae4f": "c4c6bf", + "faef69": "fdfffb", + "101010": "101010", + "df4f4f": "bf8f10", + "ef6f6f": "d7a34e", + "1d563a": "945919", + "4b8e4b": "f1d74b", + "a59a5b": "215510", + "d1c472": "739f1f", + "fffd97": "afcf4f", + "ffffff": "afcf4f", + "206040": "121c0d", + "509950": "3c403a", + "90bf60": "8f948c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/670-blue.json b/public/images/pokemon/variant/exp/670-blue.json new file mode 100644 index 00000000000..58db57808f3 --- /dev/null +++ b/public/images/pokemon/variant/exp/670-blue.json @@ -0,0 +1,54 @@ +{ + "1": { + "286786": "200e5c", + "60c1f1": "4a64cd", + "857402": "240e63", + "3c9bcb": "3342b8", + "f0eb57": "402bbf", + "231e1e": "231e1e", + "dcd405": "33168e", + "10765d": "094740", + "86b24d": "1d8057", + "aae762": "38c96f", + "107359": "d9567f", + "52ab5d": "e493a1", + "0f5436": "ae2d63", + "879496": "879496", + "f5f7fa": "f5f7fa", + "cecee6": "cecee6", + "74660f": "110732", + "c0ba4b": "33168e", + "b3ae28": "33168e", + "475148": "475148", + "201d1d": "73141e", + "9b93c4": "9b93c4", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + }, + "2": { + "286786": "215510", + "60c1f1": "afcf4f", + "857402": "b1b1b1", + "3c9bcb": "739f1f", + "f0eb57": "f8f8f4", + "231e1e": "231e1e", + "dcd405": "dcdad8", + "10765d": "121c0d", + "86b24d": "3c403a", + "aae762": "737975", + "107359": "1c96b5", + "52ab5d": "33bfb1", + "0f5436": "136f9a", + "879496": "455aae", + "f5f7fa": "dff2ff", + "cecee6": "b3d1f2", + "74660f": "b1b1b1", + "c0ba4b": "dcdad8", + "b3ae28": "dcdad8", + "475148": "475148", + "201d1d": "0f5741", + "9b93c4": "6195d9", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/670-orange.json b/public/images/pokemon/variant/exp/670-orange.json new file mode 100644 index 00000000000..d48c0b4e5d6 --- /dev/null +++ b/public/images/pokemon/variant/exp/670-orange.json @@ -0,0 +1,54 @@ +{ + "1": { + "a24b1e": "5c2c09", + "f1963b": "cd9231", + "857402": "5c0d0d", + "c6763c": "aa571d", + "f0eb57": "a3382c", + "231e1e": "231e1e", + "dcd405": "871723", + "10765d": "094740", + "86b24d": "1d8057", + "aae762": "38c96f", + "107359": "d9567f", + "52ab5d": "e493a1", + "0f5436": "ae2d63", + "879496": "879496", + "f5f7fa": "f5f7fa", + "cecee6": "cecee6", + "74660f": "5c0d0d", + "c0ba4b": "871723", + "b3ae28": "871723", + "475148": "475148", + "211d1d": "73141e", + "9b93c4": "9b93c4", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + }, + "2": { + "a24b1e": "215510", + "f1963b": "afcf4f", + "857402": "b1b1b1", + "c6763c": "739f1f", + "f0eb57": "f8f8f4", + "231e1e": "231e1e", + "dcd405": "dcdad8", + "10765d": "121c0d", + "86b24d": "3c403a", + "aae762": "737975", + "107359": "dd7141", + "52ab5d": "ea8c48", + "0f5436": "ae3b12", + "879496": "792a15", + "f5f7fa": "ffeacf", + "cecee6": "f8cab4", + "74660f": "b1b1b1", + "c0ba4b": "dcdad8", + "b3ae28": "dcdad8", + "475148": "475148", + "211d1d": "0f5741", + "9b93c4": "d78876", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/670-red.json b/public/images/pokemon/variant/exp/670-red.json new file mode 100644 index 00000000000..6ce51d9440a --- /dev/null +++ b/public/images/pokemon/variant/exp/670-red.json @@ -0,0 +1,54 @@ +{ + "1": { + "6d1b24": "630a23", + "c92d30": "cd4a4a", + "857402": "3e0547", + "972935": "a31f35", + "f0eb57": "8e1653", + "231e1e": "231e1e", + "dcd405": "6a094f", + "10765d": "094740", + "86b24d": "1d8057", + "aae762": "38c96f", + "107359": "d9567f", + "52ab5d": "e493a1", + "0f5436": "ae2d63", + "879496": "879496", + "f5f7fa": "f5f7fa", + "cecee6": "cecee6", + "74660f": "3e0547", + "c0ba4b": "6a094f", + "b3ae28": "6a094f", + "475148": "475148", + "211d1d": "73141e", + "9b93c4": "9b93c4", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + }, + "2": { + "6d1b24": "215510", + "c92d30": "afcf4f", + "857402": "b1b1b1", + "972935": "739f1f", + "f0eb57": "f8f8f4", + "231e1e": "231e1e", + "dcd405": "dcdad8", + "10765d": "121c0d", + "86b24d": "3c403a", + "aae762": "737975", + "107359": "a11927", + "52ab5d": "dc3535", + "0f5436": "790f30", + "879496": "861e4a", + "f5f7fa": "ffd7d7", + "cecee6": "f8b4bb", + "74660f": "b1b1b1", + "c0ba4b": "dcdad8", + "b3ae28": "dcdad8", + "475148": "475148", + "211d1d": "0f5741", + "9b93c4": "cc6283", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/670-white.json b/public/images/pokemon/variant/exp/670-white.json new file mode 100644 index 00000000000..8b2f572a523 --- /dev/null +++ b/public/images/pokemon/variant/exp/670-white.json @@ -0,0 +1,54 @@ +{ + "1": { + "868686": "1e1d2a", + "fcfcfc": "747478", + "857402": "110732", + "d8d8d8": "4c4b55", + "f0eb57": "3b374e", + "231e1e": "231e1e", + "dcd405": "2c2347", + "10765d": "094740", + "86b24d": "1d8057", + "aae762": "38c96f", + "107359": "d9567f", + "52ab5d": "e493a1", + "0f5436": "ae2d63", + "879496": "879496", + "f5f7fa": "f5f7fa", + "cecee6": "cecee6", + "74660f": "110732", + "c0ba4b": "2c2347", + "b3ae28": "2c2347", + "475148": "475148", + "211d1d": "73141e", + "9b93c4": "9b93c4", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + }, + "2": { + "868686": "215510", + "fcfcfc": "afcf4f", + "857402": "b1b1b1", + "d8d8d8": "739f1f", + "f0eb57": "f8f8f4", + "231e1e": "231e1e", + "dcd405": "dcdad8", + "10765d": "121c0d", + "86b24d": "3c403a", + "aae762": "737975", + "107359": "505756", + "52ab5d": "6d716f", + "0f5436": "1c2d32", + "879496": "879496", + "f5f7fa": "f5f7fa", + "cecee6": "e3e3eb", + "74660f": "b1b1b1", + "c0ba4b": "dcdad8", + "b3ae28": "dcdad8", + "475148": "475148", + "211d1d": "0f5741", + "9b93c4": "bfbfc9", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/670-yellow.json b/public/images/pokemon/variant/exp/670-yellow.json new file mode 100644 index 00000000000..ac7dc7ebe6c --- /dev/null +++ b/public/images/pokemon/variant/exp/670-yellow.json @@ -0,0 +1,54 @@ +{ + "1": { + "857c28": "064718", + "fff265": "abb830", + "857402": "06471f", + "d8cb40": "6f950a", + "f0eb57": "1a8021", + "231e1e": "231e1e", + "dcd405": "0b5c19", + "10765d": "094740", + "86b24d": "1d8057", + "aae762": "38c96f", + "107359": "d9567f", + "52ab5d": "e493a1", + "0f5436": "ae2d63", + "879496": "879496", + "f5f7fa": "f5f7fa", + "cecee6": "cecee6", + "74660f": "06471f", + "c0ba4b": "0b5c19", + "b3ae28": "0b5c19", + "475148": "475148", + "211d1d": "73141e", + "9b93c4": "9b93c4", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + }, + "2": { + "857c28": "215510", + "fff265": "afcf4f", + "857402": "b1b1b1", + "d8cb40": "739f1f", + "f0eb57": "f8f8f4", + "231e1e": "231e1e", + "dcd405": "dcdad8", + "10765d": "121c0d", + "86b24d": "3c403a", + "aae762": "737975", + "107359": "ddb241", + "52ab5d": "f1e64b", + "0f5436": "b56f25", + "879496": "996e25", + "f5f7fa": "fffde0", + "cecee6": "f2e1b3", + "74660f": "b1b1b1", + "c0ba4b": "dcdad8", + "b3ae28": "dcdad8", + "475148": "475148", + "211d1d": "0f5741", + "9b93c4": "c6a46d", + "9e2d39": "9e2d39", + "dc494d": "dc494d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-blue.json b/public/images/pokemon/variant/exp/671-blue.json new file mode 100644 index 00000000000..1da5b13b301 --- /dev/null +++ b/public/images/pokemon/variant/exp/671-blue.json @@ -0,0 +1,27 @@ +{ + "1": { + "4c7385": "200e5c", + "141214": "141214", + "7fc9c9": "291371", + "abf2f2": "3827a3", + "dcfafa": "69c9e3", + "487286": "200e5c", + "41a2d2": "2938a3", + "60c2f2": "3c54b8", + "1c5a4c": "aa1a58", + "dba86b": "ff3e3e", + "3ca68c": "ff91a4", + "2c826c": "dc5073", + "5c5a5c": "5c5a5c", + "fcfafc": "f8f8f8", + "bcbebc": "bcbebc", + "141614": "141614", + "144234": "951f43", + "2c7664": "c6306e", + "242624": "242624", + "34866c": "dc4c5b", + "2c866c": "d53b6a", + "34967c": "ea5574", + "1c1e1c": "1c1e1c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-blue_3.json b/public/images/pokemon/variant/exp/671-blue_3.json new file mode 100644 index 00000000000..2e079bc3bd7 --- /dev/null +++ b/public/images/pokemon/variant/exp/671-blue_3.json @@ -0,0 +1,524 @@ +{ + "textures": [ + { + "image": "671-blue_3.png", + "format": "RGBA8888", + "size": { + "w": 222, + "h": 222 + }, + "scale": 1, + "frames": [ + { + "filename": "0013.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:ec7d50fb53c7da18b1a52a93f6b993f2:01db5bc981a8a134d11e56c640b861bf:70589a17d5b8efc84d2e63a080a74193$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-blue_3.png b/public/images/pokemon/variant/exp/671-blue_3.png new file mode 100644 index 00000000000..59fc50a823d Binary files /dev/null and b/public/images/pokemon/variant/exp/671-blue_3.png differ diff --git a/public/images/pokemon/variant/exp/671-orange.json b/public/images/pokemon/variant/exp/671-orange.json new file mode 100644 index 00000000000..b164a67d444 --- /dev/null +++ b/public/images/pokemon/variant/exp/671-orange.json @@ -0,0 +1,27 @@ +{ + "1": { + "785a44": "631818", + "141214": "141214", + "d2ab84": "631818", + "fbd5ad": "a34b2c", + "f9eadb": "ffbc77", + "785941": "5c2c09", + "de9042": "954c17", + "feb064": "cd8e31", + "1c5a4c": "aa1a58", + "c077a0": "fff35a", + "3ca68c": "ff91a4", + "2c826c": "dc5073", + "5c5a5c": "5c5a5c", + "fcfafc": "f8f8f8", + "bcbebc": "bcbebc", + "141614": "141614", + "144234": "951f43", + "2c7664": "c6306e", + "242624": "242624", + "34866c": "dc4c5b", + "2c866c": "d53b6a", + "34967c": "ea5574", + "1c1e1c": "1c1e1c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-orange_3.json b/public/images/pokemon/variant/exp/671-orange_3.json new file mode 100644 index 00000000000..4b377b5a5a5 --- /dev/null +++ b/public/images/pokemon/variant/exp/671-orange_3.json @@ -0,0 +1,524 @@ +{ + "textures": [ + { + "image": "671-orange_3.png", + "format": "RGBA8888", + "size": { + "w": 222, + "h": 222 + }, + "scale": 1, + "frames": [ + { + "filename": "0013.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:fb5854349fdf6f647427c19784043a38:13a2418007eebb8ef98377506e0fd0e9:bd379a600bdf18b4a00a0ab57b349563$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-orange_3.png b/public/images/pokemon/variant/exp/671-orange_3.png new file mode 100644 index 00000000000..37d5cbf4e9d Binary files /dev/null and b/public/images/pokemon/variant/exp/671-orange_3.png differ diff --git a/public/images/pokemon/variant/exp/671-red.json b/public/images/pokemon/variant/exp/671-red.json new file mode 100644 index 00000000000..b45ae4f5a2a --- /dev/null +++ b/public/images/pokemon/variant/exp/671-red.json @@ -0,0 +1,29 @@ +{ + "1": { + "643e5c": "390614", + "141214": "141214", + "a4628c": "4e0c38", + "dc96c4": "8e1a55", + "dc9ac4": "8e1a55", + "fcb2cc": "ff90a2", + "842e2c": "390614", + "a46294": "4e0c38", + "dc4e4c": "95172c", + "fc7274": "c64040", + "1c5a4c": "aa1a58", + "fce24c": "ff7c39", + "3ca68c": "ff91a4", + "2c826c": "dc5073", + "5c5a5c": "5c5a5c", + "fcfafc": "f8f8f8", + "bcbebc": "bcbebc", + "141614": "141614", + "144234": "951f43", + "2c7664": "c6306e", + "242624": "242624", + "34866c": "dc4c5b", + "2c866c": "d53b6a", + "34967c": "ea5574", + "1c1e1c": "1c1e1c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-red_3.json b/public/images/pokemon/variant/exp/671-red_3.json new file mode 100644 index 00000000000..38cce4f38d3 --- /dev/null +++ b/public/images/pokemon/variant/exp/671-red_3.json @@ -0,0 +1,524 @@ +{ + "textures": [ + { + "image": "671-red_3.png", + "format": "RGBA8888", + "size": { + "w": 222, + "h": 222 + }, + "scale": 1, + "frames": [ + { + "filename": "0013.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d9774b5264e8a1ae273694201b2bf281:9b2d9f470d0a26b7f2904f756d5bb281:022a17391d930b8042a1289e0c46e3eb$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-red_3.png b/public/images/pokemon/variant/exp/671-red_3.png new file mode 100644 index 00000000000..329d9591947 Binary files /dev/null and b/public/images/pokemon/variant/exp/671-red_3.png differ diff --git a/public/images/pokemon/variant/exp/671-white.json b/public/images/pokemon/variant/exp/671-white.json new file mode 100644 index 00000000000..5e46ac97606 --- /dev/null +++ b/public/images/pokemon/variant/exp/671-white.json @@ -0,0 +1,26 @@ +{ + "1": { + "858585": "232323", + "141214": "141214", + "b6b3b4": "0f0d15", + "f3f3f3": "353340", + "f9bdc8": "c2c1c6", + "dedede": "3c3b47", + "fefefe": "60616a", + "1c5a4c": "aa1a58", + "66dede": "ffffff", + "3ca68c": "ff91a4", + "2c826c": "dc5073", + "5c5a5c": "5c5a5c", + "fcfafc": "f8f8f8", + "bcbebc": "bcbebc", + "141614": "141614", + "144234": "951f43", + "2c7664": "c6306e", + "242624": "242624", + "34866c": "dc4c5b", + "2c866c": "d53b6a", + "34967c": "ea5574", + "1c1e1c": "1c1e1c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-white_3.json b/public/images/pokemon/variant/exp/671-white_3.json new file mode 100644 index 00000000000..99430a4f482 --- /dev/null +++ b/public/images/pokemon/variant/exp/671-white_3.json @@ -0,0 +1,524 @@ +{ + "textures": [ + { + "image": "671-white_3.png", + "format": "RGBA8888", + "size": { + "w": 222, + "h": 222 + }, + "scale": 1, + "frames": [ + { + "filename": "0013.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 74 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 81, + "h": 74 + }, + "frame": { + "x": 0, + "y": 74, + "w": 81, + "h": 74 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 72, + "h": 74 + }, + "frame": { + "x": 81, + "y": 74, + "w": 72, + "h": 74 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 12, + "y": 0, + "w": 69, + "h": 74 + }, + "frame": { + "x": 88, + "y": 0, + "w": 69, + "h": 74 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 13, + "y": 0, + "w": 67, + "h": 74 + }, + "frame": { + "x": 153, + "y": 74, + "w": 67, + "h": 74 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 74 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 65, + "h": 74 + }, + "frame": { + "x": 157, + "y": 0, + "w": 65, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:98e3a59a6520bfd8dd8a03fb34d365be:064937132b9f5352af7fc4168e0f5038:3de87aeb33f03ad735679a257f0fc482$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/671-white_3.png b/public/images/pokemon/variant/exp/671-white_3.png new file mode 100644 index 00000000000..77d53d0afcb Binary files /dev/null and b/public/images/pokemon/variant/exp/671-white_3.png differ diff --git a/public/images/pokemon/variant/exp/671-yellow.json b/public/images/pokemon/variant/exp/671-yellow.json new file mode 100644 index 00000000000..fae27d650ae --- /dev/null +++ b/public/images/pokemon/variant/exp/671-yellow.json @@ -0,0 +1,52 @@ +{ + "1": { + "75714f": "084e40", + "141214": "141214", + "d2b98b": "137849", + "ffeac0": "22b14a", + "fbcfa3": "ffe593", + "75714c": "165548", + "cec344": "789c16", + "fef265": "b0bf2b", + "1c5a4c": "aa1a58", + "a6bd3d": "5f30ff", + "3ca68c": "ff91a4", + "2c826c": "dc5073", + "5c5a5c": "5c5a5c", + "fcfafc": "f8f8f8", + "bcbebc": "bcbebc", + "141614": "141614", + "144234": "951f43", + "2c7664": "c6306e", + "242624": "242624", + "34866c": "dc4c5b", + "2c866c": "d53b6a", + "34967c": "ea5574", + "1c1e1c": "1c1e1c" + }, + "2": { + "75714f": "0a320e", + "141214": "141214", + "d2b98b": "28392c", + "ffeac0": "4d4e46", + "fbcfa3": "dfe3e1", + "75714c": "0a320e", + "cec344": "7f9f1f", + "fef265": "afcf4f", + "1c5a4c": "8e4d0a", + "a6bd3d": "fdff90", + "3ca68c": "e3c733", + "2c826c": "b18018", + "5c5a5c": "4e3e23", + "fcfafc": "fffde0", + "bcbebc": "d4c18f", + "141614": "141614", + "144234": "951f43", + "2c7664": "b18018", + "242624": "242624", + "34866c": "dc4c5b", + "2c866c": "d53b6a", + "34967c": "ea5574", + "1c1e1c": "1c1e1c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/677.json b/public/images/pokemon/variant/exp/677.json new file mode 100644 index 00000000000..b532dd61c77 --- /dev/null +++ b/public/images/pokemon/variant/exp/677.json @@ -0,0 +1,26 @@ +{ + "1": { + "5a5a65": "601339", + "b9b9cd": "bd5c81", + "42424b": "470d28", + "8a8a99": "943b5d", + "f8f8f8": "f1f0e4", + "cda4cd": "43adaf", + "ffffff": "ffffff", + "3c6172": "30237a", + "995a99": "29767f", + "070707": "070707" + }, + "2": { + "5a5a65": "243e41", + "b9b9cd": "6ba78a", + "42424b": "193437", + "8a8a99": "426b62", + "f8f8f8": "67415e", + "cda4cd": "ff657d", + "ffffff": "ffffff", + "3c6172": "69004e", + "995a99": "d13955", + "070707": "070707" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/678-female.json b/public/images/pokemon/variant/exp/678-female.json new file mode 100644 index 00000000000..cf5423c1547 --- /dev/null +++ b/public/images/pokemon/variant/exp/678-female.json @@ -0,0 +1,28 @@ +{ + "1": { + "737373": "947859", + "bfbfbf": "d5c49f", + "f8f8f8": "f8f5cd", + "17294d": "47182e", + "365fb3": "a5346b", + "264480": "76264d", + "101010": "101010", + "ffe54f": "3fbae2", + "ffffff": "ffffff", + "d92121": "415493", + "c9ad20": "4b86bd" + }, + "2": { + "737373": "3a1633", + "bfbfbf": "613d5a", + "f8f8f8": "855577", + "17294d": "1d3f33", + "365fb3": "7bd38d", + "264480": "47946c", + "101010": "101010", + "ffe54f": "ff85ad", + "ffffff": "ffffff", + "d92121": "9d0067", + "c9ad20": "f2557b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/678.json b/public/images/pokemon/variant/exp/678.json new file mode 100644 index 00000000000..972a970a59c --- /dev/null +++ b/public/images/pokemon/variant/exp/678.json @@ -0,0 +1,26 @@ +{ + "1": { + "737373": "947859", + "f8f8f8": "f8f5cd", + "bfbfbf": "d5c49f", + "17294d": "47182e", + "101010": "101010", + "365fb3": "a5346b", + "264480": "76264d", + "aaf2f2": "aaf2f2", + "179958": "415493", + "ffffff": "ffffff" + }, + "2": { + "737373": "3a1633", + "f8f8f8": "855577", + "bfbfbf": "613d5a", + "17294d": "1d3f33", + "101010": "101010", + "365fb3": "7bd38d", + "264480": "47946c", + "aaf2f2": "ff867c", + "179958": "9a0066", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/698.json b/public/images/pokemon/variant/exp/698.json new file mode 100644 index 00000000000..daf9b8c6f84 --- /dev/null +++ b/public/images/pokemon/variant/exp/698.json @@ -0,0 +1,48 @@ +{ + "1": { + "cbaa84": "44827c", + "b3747e": "4b7465", + "eeffbf": "cdffb5", + "dcffb2": "8eeab9", + "ffbfca": "43bf8d", + "b7ffb2": "72d8ce", + "fff2b2": "9bffa9", + "85b4cc": "cf755d", + "a6e1ff": "efab87", + "101010": "101010", + "cacaca": "cacaca", + "537180": "b04f4b", + "2eaeec": "4dc796", + "1f75a0": "29988e", + "fdfdfd": "fdfdfd", + "d197a1": "d197a1", + "ffdce6": "ffdce6", + "217aa6": "7f99e1", + "30b2f2": "b5dcff", + "f9f9f9": "e6e3b4", + "c0c0c0": "d7cca0" + }, + "2": { + "cbaa84": "cc78db", + "b3747e": "c452a6", + "eeffbf": "ed9ff2", + "dcffb2": "d7bbf4", + "ffbfca": "faccff", + "b7ffb2": "dceeff", + "fff2b2": "eb88b9", + "85b4cc": "654a8a", + "a6e1ff": "936daa", + "101010": "101010", + "cacaca": "cacaca", + "537180": "392d65", + "2eaeec": "ad4e6e", + "1f75a0": "8d2656", + "fdfdfd": "fdfdfd", + "d197a1": "d197a1", + "ffdce6": "ffdce6", + "217aa6": "efaa51", + "30b2f2": "ffd169", + "f9f9f9": "373453", + "c0c0c0": "282747" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/699.json b/public/images/pokemon/variant/exp/699.json new file mode 100644 index 00000000000..107352097cd --- /dev/null +++ b/public/images/pokemon/variant/exp/699.json @@ -0,0 +1,44 @@ +{ + "1": { + "7279a1": "164450", + "ccd2ee": "237578", + "a7afd5": "1c5962", + "fff2b2": "4eb87f", + "e5d68a": "429a77", + "6d749a": "2d7c63", + "657dac": "c44f5d", + "81a0dc": "e5756b", + "4e568b": "a03c58", + "101010": "101010", + "ffffff": "ffeac0", + "4cc3ff": "c2d5ff", + "f8f8f8": "f8f8f8", + "3689b3": "8487e1", + "3d8eb6": "12545e", + "53c5ff": "1c7376", + "94b7bd": "d3a47b", + "d4edf3": "ffe4a7", + "4b6f76": "b78460" + }, + "2": { + "7279a1": "c89ad8", + "ccd2ee": "fedbff", + "a7afd5": "e6b9ea", + "fff2b2": "4cdfc7", + "e5d68a": "38c1c7", + "6d749a": "2c97b3", + "657dac": "2f4978", + "81a0dc": "3f648b", + "4e568b": "243369", + "101010": "101010", + "ffffff": "bae8ff", + "4cc3ff": "ffea82", + "f8f8f8": "f8f8f8", + "3689b3": "efbe63", + "3d8eb6": "852d6b", + "53c5ff": "ab467e", + "94b7bd": "261e44", + "d4edf3": "382955", + "4b6f76": "1c183a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/702.json b/public/images/pokemon/variant/exp/702.json new file mode 100644 index 00000000000..1edd126264e --- /dev/null +++ b/public/images/pokemon/variant/exp/702.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "262626": "2a3b5e", + "4d4d4d": "6789b3", + "ccbb99": "a3d1cc", + "efefcf": "ddfff5", + "704030": "a53c42", + "906030": "c9685f", + "efbf5f": "ffd3b6", + "cf8f4f": "e49f84", + "1d1d1d": "1a1c45", + "fefefe": "fefefe", + "464646": "424b8f", + "df7f5f": "7cd6a1" + }, + "2": { + "101010": "101010", + "262626": "072d38", + "4d4d4d": "197870", + "ccbb99": "aaa8d6", + "efefcf": "ece5ff", + "704030": "1e0e27", + "906030": "2d1533", + "efbf5f": "5f3662", + "cf8f4f": "432249", + "1d1d1d": "02172d", + "fefefe": "fefefe", + "464646": "17646c", + "df7f5f": "d2fff1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/703.json b/public/images/pokemon/variant/exp/703.json new file mode 100644 index 00000000000..c024feb1b30 --- /dev/null +++ b/public/images/pokemon/variant/exp/703.json @@ -0,0 +1,32 @@ +{ + "1": { + "535763": "292638", + "306090": "c35b2a", + "c3c7d3": "68638e", + "88aacc": "e67c37", + "fefefe": "fefefe", + "a3a7b3": "4d496b", + "737783": "37344e", + "101010": "101010", + "bbddff": "ffa633", + "1fbfdf": "ff9b44", + "5f6060": "e6ac60", + "fcfefe": "ffeed6", + "bfbbbb": "ffd3a1" + }, + "2": { + "535763": "976ba9", + "306090": "a03c69", + "c3c7d3": "faecff", + "88aacc": "e25493", + "fefefe": "ffe2ee", + "a3a7b3": "e4cdf9", + "737783": "cca1db", + "101010": "101010", + "bbddff": "f591bd", + "1fbfdf": "de5f8e", + "5f6060": "5a3d84", + "fcfefe": "a473bf", + "bfbbbb": "8359a7" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/751.json b/public/images/pokemon/variant/exp/751.json index 70af2b6d7f4..fd1955824af 100644 --- a/public/images/pokemon/variant/exp/751.json +++ b/public/images/pokemon/variant/exp/751.json @@ -1,50 +1,33 @@ { "1": { - "85abc8": "ae504b", - "bdd9e5": "ffc8d1", - "acc38c": "a65f86", + "dee3f1": "ffc8d1", + "79c4d4": "f3bd8a", + "fcfcfd": "fffae3", + "39628d": "a14835", + "5e9cbd": "cc7854", + "32455b": "4c152c", + "8895ac": "ae504b", "9bad34": "4e1f42", - "c6dc93": "8a4d6d", - "cedf42": "673252", - "93a079": "6c3064", - "697d89": "8d4358", "69670e": "3a112f", - "8dd0e6": "f8b29c", - "101010": "101010", - "6893a5": "b0546e", - "8da0ac": "d37075", - "8397aa": "8397aa", - "66747a": "c75c5b", - "d3e1e8": "d3e1e8", - "81bbd1": "da826e", - "788a94": "9e4155", - "8ba8b8": "d37075", - "5d6773": "ae504b", - "15222d": "15222d", - "343c43": "812b3e" + "516a7b": "812b3e", + "aed7ee": "f6e4c2", + "cedf42": "673252", + "3a4055": "4c152c", + "8e99ad": "98433e" }, "2": { - "85abc8": "ecaa61", - "bdd9e5": "f1dcc2", - "acc38c": "7196b1", + "dee3f1": "f1dcc2", + "79c4d4": "3b5373", + "fcfcfd": "f0f0f2", + "39628d": "1c2246", + "5e9cbd": "253155", + "32455b": "7b3836", + "8895ac": "ea9b43", "9bad34": "4980ac", - "c6dc93": "90b8d4", - "cedf42": "72add9", - "93a079": "586d7a", - "697d89": "915952", "69670e": "263756", - "8dd0e6": "667386", - "101010": "101010", - "6893a5": "b76545", - "8da0ac": "ecaa61", - "8397aa": "8397aa", - "66747a": "66747a", - "d3e1e8": "d3e1e8", - "81bbd1": "55596f", - "788a94": "c77a4f", - "8ba8b8": "c77a4f", - "5d6773": "ea9b43", - "15222d": "15222d", - "343c43": "ba5c2c" + "516a7b": "ba5c2c", + "cedf42": "72add9", + "3a4055": "73312f", + "8e99ad": "cd8330" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/80-mega.json b/public/images/pokemon/variant/exp/80-mega.json new file mode 100644 index 00000000000..5d3d810f095 --- /dev/null +++ b/public/images/pokemon/variant/exp/80-mega.json @@ -0,0 +1,36 @@ +{ + "1": { + "7b3131": "3f2729", + "000000": "000000", + "e66a7b": "5b3332", + "ff9494": "885345", + "ffbdac": "ad7459", + "deded5": "deded5", + "ffffff": "ffffff", + "835a20": "9f675f", + "eed583": "d49983", + "ffeeb4": "e0b69d", + "cda462": "b97565", + "52525a": "7c5b40", + "8b9494": "bf9562", + "e65229": "7a4e43", + "b4bdbd": "f0d090" + }, + "2": { + "7b3131": "bf8645", + "000000": "000000", + "e66a7b": "d9a95d", + "ff9494": "e8cd82", + "ffbdac": "f7e6a8", + "deded5": "deded5", + "ffffff": "ffffff", + "835a20": "69080f", + "eed583": "b34d2e", + "ffeeb4": "d16b34", + "cda462": "8f2622", + "52525a": "192b32", + "8b9494": "2a4947", + "e65229": "e3c778", + "b4bdbd": "4b7567" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/800-ultra.json b/public/images/pokemon/variant/exp/800-ultra.json index 53dd9b55df0..cab917ec271 100644 --- a/public/images/pokemon/variant/exp/800-ultra.json +++ b/public/images/pokemon/variant/exp/800-ultra.json @@ -1,21 +1,5 @@ { "1": { - "b0a080": "e552ec", - "f8f8e8": "ffe2ed", - "9b8259": "b021c5", - "e5e4c2": "ffb9f9", - "000000": "000000", - "bc9b4e": "900090", - "f8f8d0": "ff8ae9", - "e8e088": "ff49e7", - "d0b868": "d10cc7", - "7d673b": "510059", - "282828": "282828", - "f84040": "f84040", - "f88888": "1ae2e6", - "c81010": "00c2d2" - }, - "2": { "b0a080": "d96b23", "f8f8e8": "ffe1b8", "9b8259": "b43c06", @@ -30,5 +14,21 @@ "f84040": "f84040", "f88888": "f88888", "c81010": "c81010" + }, + "2": { + "b0a080": "e552ec", + "f8f8e8": "ffe2ed", + "9b8259": "b021c5", + "e5e4c2": "ffb9f9", + "000000": "000000", + "bc9b4e": "900090", + "f8f8d0": "ff8ae9", + "e8e088": "ff49e7", + "d0b868": "d10cc7", + "7d673b": "510059", + "282828": "282828", + "f84040": "f84040", + "f88888": "1ae2e6", + "c81010": "00c2d2" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/803.json b/public/images/pokemon/variant/exp/803.json new file mode 100644 index 00000000000..1f612916938 --- /dev/null +++ b/public/images/pokemon/variant/exp/803.json @@ -0,0 +1,32 @@ +{ + "1": { + "78757f": "449e93", + "ccc0d8": "e3ffec", + "101010": "101010", + "98295e": "27579e", + "ff6ccc": "54cbdc", + "d9338e": "3492b9", + "453966": "211c49", + "814eba": "2e4b84", + "39284d": "1d1638", + "583f87": "2e2e69", + "b389d3": "4e80ad", + "008fdd": "81262d", + "b6e4f3": "df6541" + }, + "2": { + "78757f": "cd9b85", + "ccc0d8": "ffefe0", + "101010": "101010", + "98295e": "a12f63", + "ff6ccc": "ff778d", + "d9338e": "d6487a", + "453966": "0d293d", + "814eba": "095654", + "39284d": "08172f", + "583f87": "103a47", + "b389d3": "2b987d", + "008fdd": "ffaa7a", + "b6e4f3": "fffce3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/804.json b/public/images/pokemon/variant/exp/804.json new file mode 100644 index 00000000000..bee1c93ca0f --- /dev/null +++ b/public/images/pokemon/variant/exp/804.json @@ -0,0 +1,38 @@ +{ + "1": { + "523e68": "16396f", + "b699f2": "359faf", + "101010": "101010", + "8570b1": "22658d", + "9e2348": "81262d", + "ff6cd3": "e88354", + "814eba": "284173", + "583f87": "212149", + "db3e94": "c74736", + "39284d": "18183d", + "67656d": "2b5d67", + "e0d9e8": "e3ffec", + "9996a9": "8edfd5", + "008fdd": "f3c58a", + "b6e4f3": "fff5c9", + "000000": "000000" + }, + "2": { + "523e68": "0e3346", + "b699f2": "68b363", + "101010": "101010", + "8570b1": "2d794e", + "9e2348": "7e4e3d", + "ff6cd3": "fff8cc", + "814eba": "095654", + "583f87": "103a47", + "db3e94": "dcbb94", + "39284d": "042a35", + "67656d": "580736", + "e0d9e8": "e54558", + "9996a9": "96234e", + "008fdd": "4c495b", + "b6e4f3": "68637e", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/867.json b/public/images/pokemon/variant/exp/867.json new file mode 100644 index 00000000000..fcf7e29867a --- /dev/null +++ b/public/images/pokemon/variant/exp/867.json @@ -0,0 +1,26 @@ +{ + "1": { + "393941": "69d9bf", + "101010": "101010", + "d9d0d1": "d6b8a0", + "c5b9bb": "c69981", + "d66770": "334599", + "cb414b": "18265b", + "927e8d": "a46361", + "816968": "743949", + "463c3f": "5a2940", + "ab38d1": "a30e37" + }, + "2": { + "393941": "a4222c", + "101010": "101010", + "d9d0d1": "4fb66a", + "c5b9bb": "298a61", + "d66770": "ffe78d", + "cb414b": "ffad58", + "927e8d": "1f6455", + "816968": "0a4340", + "463c3f": "052b2f", + "ab38d1": "c2ffe2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/880.json b/public/images/pokemon/variant/exp/880.json new file mode 100644 index 00000000000..96812db4d1b --- /dev/null +++ b/public/images/pokemon/variant/exp/880.json @@ -0,0 +1,82 @@ +{ + "1": { + "101010": "101010", + "975e17": "5b0610", + "ffff84": "ee8563", + "e39e1e": "9c1430", + "8f261b": "1b1829", + "ead900": "c6362b", + "ed4e76": "312f47", + "ff8d9f": "6a98c4", + "ff3868": "7cac72", + "871f16": "427d47", + "47202a": "20132d", + "732c3e": "271d3c", + "0f1514": "0f1514", + "b3761a": "271447", + "301613": "301613", + "491a15": "491a15", + "ff9946": "bb3333", + "008567": "757798", + "005e44": "564e6e", + "39ad5a": "a2b5c8", + "003319": "26233c", + "4c3313": "4c3313", + "4c321e": "4c321e", + "b68b0f": "b68b0f", + "3a1c23": "3a1c23", + "471f29": "471f29", + "5f8047": "5f8047", + "747335": "40030a", + "101514": "101514", + "171412": "171412", + "5a2532": "5a2532", + "8a3248": "8a3248", + "322412": "322412", + "7b4d28": "7b4d28", + "17160f": "17160f", + "654114": "654114", + "171410": "171410", + "2f191e": "2f191e" + }, + "2": { + "101010": "101010", + "975e17": "211b3d", + "ffff84": "dceeeb", + "e39e1e": "35365e", + "8f261b": "8f261b", + "ead900": "636287", + "ed4e76": "ca5939", + "ff8d9f": "e28854", + "ff3868": "48d385", + "871f16": "239d73", + "47202a": "47202a", + "732c3e": "732c3e", + "0f1514": "0f1514", + "b3761a": "b3761a", + "301613": "301613", + "491a15": "491a15", + "ff9946": "8993b9", + "008567": "fff491", + "005e44": "f1b45f", + "39ad5a": "ce734d", + "003319": "671d18", + "4c3313": "4c3313", + "4c321e": "4c321e", + "b68b0f": "b68b0f", + "3a1c23": "3a1c23", + "471f29": "471f29", + "5f8047": "5f8047", + "747335": "1a122d", + "101514": "101514", + "171412": "171412", + "5a2532": "5a2532", + "8a3248": "8a3248", + "322412": "322412", + "7b4d28": "7b4d28", + "17160f": "17160f", + "654114": "654114", + "171410": "171410", + "2f191e": "2f191e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/881.json b/public/images/pokemon/variant/exp/881.json new file mode 100644 index 00000000000..0d408a71172 --- /dev/null +++ b/public/images/pokemon/variant/exp/881.json @@ -0,0 +1,40 @@ +{ + "1": { + "975e17": "5b0610", + "101010": "101010", + "ffff84": "ee8563", + "e39e1e": "9c1430", + "ead900": "c6362b", + "2abbfc": "ceb16f", + "1e6edd": "ae7a4e", + "9ab8ba": "cea5b9", + "5c7996": "a57185", + "edf3f2": "faebc8", + "09354d": "271014", + "08256c": "4d254a", + "085d94": "714363", + "0981ae": "45242e", + "deeae8": "ead2dd", + "27aed6": "6e4145", + "25a7ce": "b59795" + }, + "2": { + "975e17": "211b3d", + "101010": "101010", + "ffff84": "dceeeb", + "e39e1e": "35365e", + "ead900": "636287", + "2abbfc": "26c248", + "1e6edd": "11974c", + "9ab8ba": "a3c465", + "5c7996": "50a751", + "edf3f2": "fcffe4", + "09354d": "0d2834", + "08256c": "7b1a5e", + "085d94": "ad3b6c", + "0981ae": "205e5d", + "deeae8": "deedc5", + "27aed6": "2d7b65", + "25a7ce": "d49da9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/882.json b/public/images/pokemon/variant/exp/882.json new file mode 100644 index 00000000000..8420c0f3cb2 --- /dev/null +++ b/public/images/pokemon/variant/exp/882.json @@ -0,0 +1,19 @@ +{ + "2": { + "871f16": "320432", + "434c63": "450940", + "ff3868": "ffaf3c", + "83bbed": "8c1f45", + "777ebd": "6c1046", + "edf3f2": "fbecff", + "101010": "0f0808", + "005e44": "f1b45f", + "ff3c6d": "ca5939", + "8f261b": "215b68", + "d5657b": "308a86", + "008567": "fff491", + "ff8d9f": "63bb8b", + "39ad5a": "ce734d", + "003319": "671d18" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/882_2.json b/public/images/pokemon/variant/exp/882_2.json new file mode 100644 index 00000000000..d9164887f7a --- /dev/null +++ b/public/images/pokemon/variant/exp/882_2.json @@ -0,0 +1,1658 @@ +{ + "textures": [ + { + "image": "882_2.png", + "format": "RGBA8888", + "size": { + "w": 400, + "h": 400 + }, + "scale": 1, + "frames": [ + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 0, + "y": 0, + "w": 58, + "h": 84 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 0, + "y": 0, + "w": 58, + "h": 84 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 0, + "y": 0, + "w": 58, + "h": 84 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 0, + "y": 0, + "w": 58, + "h": 84 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 0, + "y": 84, + "w": 58, + "h": 84 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 0, + "y": 84, + "w": 58, + "h": 84 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 0, + "y": 84, + "w": 58, + "h": 84 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 0, + "y": 84, + "w": 58, + "h": 84 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 58, + "y": 0, + "w": 58, + "h": 84 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 58, + "y": 0, + "w": 58, + "h": 84 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 58, + "y": 0, + "w": 58, + "h": 84 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 58, + "h": 84 + }, + "frame": { + "x": 58, + "y": 0, + "w": 58, + "h": 84 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 58, + "h": 83 + }, + "frame": { + "x": 0, + "y": 168, + "w": 58, + "h": 83 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 116, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 116, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 116, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 116, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 175, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 175, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 175, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 175, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 234, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 234, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 234, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 234, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 293, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 293, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 293, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 59, + "h": 82 + }, + "frame": { + "x": 293, + "y": 0, + "w": 59, + "h": 82 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 59, + "h": 81 + }, + "frame": { + "x": 58, + "y": 84, + "w": 59, + "h": 81 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 59, + "h": 81 + }, + "frame": { + "x": 58, + "y": 84, + "w": 59, + "h": 81 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 59, + "h": 81 + }, + "frame": { + "x": 58, + "y": 84, + "w": 59, + "h": 81 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 59, + "h": 81 + }, + "frame": { + "x": 58, + "y": 84, + "w": 59, + "h": 81 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 59, + "h": 81 + }, + "frame": { + "x": 58, + "y": 165, + "w": 59, + "h": 81 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 59, + "h": 81 + }, + "frame": { + "x": 58, + "y": 165, + "w": 59, + "h": 81 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 59, + "h": 81 + }, + "frame": { + "x": 58, + "y": 165, + "w": 59, + "h": 81 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 59, + "h": 81 + }, + "frame": { + "x": 58, + "y": 165, + "w": 59, + "h": 81 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 56, + "h": 83 + }, + "frame": { + "x": 0, + "y": 251, + "w": 56, + "h": 83 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 60, + "h": 80 + }, + "frame": { + "x": 117, + "y": 82, + "w": 60, + "h": 80 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 60, + "h": 80 + }, + "frame": { + "x": 117, + "y": 82, + "w": 60, + "h": 80 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 117, + "y": 162, + "w": 59, + "h": 79 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 117, + "y": 162, + "w": 59, + "h": 79 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 117, + "y": 162, + "w": 59, + "h": 79 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 117, + "y": 162, + "w": 59, + "h": 79 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 177, + "y": 82, + "w": 59, + "h": 79 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 177, + "y": 82, + "w": 59, + "h": 79 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 177, + "y": 82, + "w": 59, + "h": 79 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 177, + "y": 82, + "w": 59, + "h": 79 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 236, + "y": 82, + "w": 59, + "h": 79 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 236, + "y": 82, + "w": 59, + "h": 79 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 236, + "y": 82, + "w": 59, + "h": 79 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 59, + "h": 79 + }, + "frame": { + "x": 236, + "y": 82, + "w": 59, + "h": 79 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 58, + "h": 78 + }, + "frame": { + "x": 295, + "y": 82, + "w": 58, + "h": 78 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 9, + "y": 1, + "w": 55, + "h": 83 + }, + "frame": { + "x": 56, + "y": 251, + "w": 55, + "h": 83 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 15, + "y": 0, + "w": 53, + "h": 84 + }, + "frame": { + "x": 111, + "y": 246, + "w": 53, + "h": 84 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 17, + "y": 0, + "w": 52, + "h": 84 + }, + "frame": { + "x": 164, + "y": 241, + "w": 52, + "h": 84 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 17, + "y": 0, + "w": 52, + "h": 84 + }, + "frame": { + "x": 164, + "y": 241, + "w": 52, + "h": 84 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 61, + "h": 75 + }, + "frame": { + "x": 164, + "y": 325, + "w": 61, + "h": 75 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 61, + "h": 77 + }, + "frame": { + "x": 176, + "y": 162, + "w": 61, + "h": 77 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 61, + "h": 77 + }, + "frame": { + "x": 176, + "y": 162, + "w": 61, + "h": 77 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 61, + "h": 75 + }, + "frame": { + "x": 237, + "y": 161, + "w": 61, + "h": 75 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 61, + "h": 75 + }, + "frame": { + "x": 298, + "y": 160, + "w": 61, + "h": 75 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 61, + "h": 75 + }, + "frame": { + "x": 298, + "y": 160, + "w": 61, + "h": 75 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 18, + "y": 0, + "w": 51, + "h": 84 + }, + "frame": { + "x": 216, + "y": 239, + "w": 51, + "h": 84 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 18, + "y": 0, + "w": 51, + "h": 84 + }, + "frame": { + "x": 216, + "y": 239, + "w": 51, + "h": 84 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 61, + "h": 75 + }, + "frame": { + "x": 225, + "y": 323, + "w": 61, + "h": 75 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 53, + "h": 83 + }, + "frame": { + "x": 267, + "y": 236, + "w": 53, + "h": 83 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 13, + "y": 1, + "w": 53, + "h": 83 + }, + "frame": { + "x": 320, + "y": 235, + "w": 53, + "h": 83 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 84 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 61, + "h": 75 + }, + "frame": { + "x": 286, + "y": 319, + "w": 61, + "h": 75 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:cb1f28cb1769f7b13cdcb4178c482682:1bda8abc357b3e7f5b5daf13b6efdae5:99c2cabbb59deb20cf6bc9b595065759$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/882_2.png b/public/images/pokemon/variant/exp/882_2.png new file mode 100644 index 00000000000..a702a507f22 Binary files /dev/null and b/public/images/pokemon/variant/exp/882_2.png differ diff --git a/public/images/pokemon/variant/exp/883.json b/public/images/pokemon/variant/exp/883.json new file mode 100644 index 00000000000..723a0a9bd40 --- /dev/null +++ b/public/images/pokemon/variant/exp/883.json @@ -0,0 +1,32 @@ +{ + "1": { + "434c63": "3a151c", + "83bbed": "eaa561", + "777ebd": "cc6235", + "172459": "771922", + "edf3f2": "faebc8", + "101010": "101010", + "09354d": "2f1f1a", + "085d94": "714363", + "9ab8ba": "cea5b9", + "5c7996": "8c6060", + "3f6fb1": "883f72", + "27aed6": "6e4145", + "0981ae": "45242e" + }, + "2": { + "434c63": "450940", + "83bbed": "8c1f45", + "777ebd": "6c1046", + "172459": "320432", + "edf3f2": "fcffe4", + "101010": "101010", + "09354d": "2f1a20", + "085d94": "ad3b6c", + "9ab8ba": "a3c465", + "5c7996": "50a751", + "3f6fb1": "93c755", + "27aed6": "2d7b65", + "0981ae": "205e5d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/888-crowned.json b/public/images/pokemon/variant/exp/888-crowned.json new file mode 100644 index 00000000000..a78ba1d9299 --- /dev/null +++ b/public/images/pokemon/variant/exp/888-crowned.json @@ -0,0 +1,38 @@ +{ + "1": { + "f2db8a": "a1c9cd", + "8f4e2f": "2f4567", + "d79a53": "5a829b", + "080808": "080808", + "000000": "000000", + "3471b4": "b74323", + "2d4377": "5c1a1d", + "4999da": "ec813b", + "93262f": "0d2729", + "be3c45": "224d42", + "f45353": "448b48", + "fae2c0": "fff8cd", + "d3a79a": "da9772", + "34313e": "32171f", + "fdfdfd": "fdfdfd", + "9d6862": "a85f49" + }, + "2": { + "f2db8a": "c4826b", + "8f4e2f": "692e47", + "d79a53": "964c5c", + "080808": "080808", + "000000": "000000", + "3471b4": "9fa7d0", + "2d4377": "615c7e", + "4999da": "e6ecff", + "93262f": "431042", + "be3c45": "6c1d59", + "f45353": "902d57", + "fae2c0": "3d5b72", + "d3a79a": "243149", + "34313e": "1a1829", + "fdfdfd": "fdfdfd", + "9d6862": "1c2238" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/888.json b/public/images/pokemon/variant/exp/888.json new file mode 100644 index 00000000000..f949289b05b --- /dev/null +++ b/public/images/pokemon/variant/exp/888.json @@ -0,0 +1,32 @@ +{ + "1": { + "2d4377": "5c1a1d", + "080808": "080808", + "4999da": "ec813b", + "3471b4": "b74323", + "f45353": "448b48", + "d3a79a": "da9772", + "fae2c0": "fff8cd", + "34313e": "32171f", + "be3c45": "224d42", + "93262f": "0d2729", + "fdfdfd": "fdfdfd", + "9d6862": "a85f49", + "000000": "000000" + }, + "2": { + "2d4377": "615c7e", + "080808": "080808", + "4999da": "e6ecff", + "3471b4": "9fa7d0", + "f45353": "902d57", + "d3a79a": "243149", + "fae2c0": "3d5b72", + "34313e": "1a1829", + "be3c45": "6c1d59", + "93262f": "431042", + "fdfdfd": "fdfdfd", + "9d6862": "1c2238", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/889-crowned.json b/public/images/pokemon/variant/exp/889-crowned.json new file mode 100644 index 00000000000..65bffb601fc --- /dev/null +++ b/public/images/pokemon/variant/exp/889-crowned.json @@ -0,0 +1,38 @@ +{ + "1": { + "2d2f7b": "102c2c", + "080808": "080808", + "396dce": "70a757", + "2d48a8": "3c6959", + "8f4e2f": "2f4567", + "f2db8a": "a1c9cd", + "d79a53": "5a829b", + "eb363a": "614378", + "fffccc": "d3eeea", + "000000": "000000", + "731a27": "1c163d", + "ae2836": "422b61", + "34313e": "19142f", + "fdfdfd": "fdfdfd", + "8887a8": "d69f97", + "c2c3cf": "ffe0cc" + }, + "2": { + "2d2f7b": "244e61", + "080808": "080808", + "396dce": "6fc7c1", + "2d48a8": "4797a4", + "8f4e2f": "692e47", + "f2db8a": "c4826b", + "d79a53": "964c5c", + "eb363a": "e6ecff", + "fffccc": "e5b885", + "000000": "000000", + "731a27": "615c7e", + "ae2836": "9fa7d0", + "34313e": "19142f", + "fdfdfd": "fdfdfd", + "8887a8": "442e49", + "c2c3cf": "694f69" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/889.json b/public/images/pokemon/variant/exp/889.json new file mode 100644 index 00000000000..0d3dbf024cb --- /dev/null +++ b/public/images/pokemon/variant/exp/889.json @@ -0,0 +1,32 @@ +{ + "1": { + "2d2f7b": "102c2c", + "396dce": "70a757", + "2d48a8": "3c6959", + "080808": "080808", + "f2db8a": "a1c9cd", + "731a27": "1c163d", + "eb363a": "614378", + "ae2836": "422b61", + "c2c3cf": "ffe0cc", + "000000": "000000", + "8887a8": "d69f97", + "34313e": "19142f", + "fdfdfd": "fdfdfd" + }, + "2": { + "2d2f7b": "244e61", + "396dce": "6fc7c1", + "2d48a8": "4797a4", + "080808": "080808", + "f2db8a": "c4826b", + "731a27": "615c7e", + "eb363a": "e6ecff", + "ae2836": "9fa7d0", + "c2c3cf": "694f69", + "000000": "000000", + "8887a8": "442e49", + "34313e": "22192c", + "fdfdfd": "fdfdfd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/912.json b/public/images/pokemon/variant/exp/912.json new file mode 100644 index 00000000000..a374c871331 --- /dev/null +++ b/public/images/pokemon/variant/exp/912.json @@ -0,0 +1,20 @@ +{ + "1": { + "1f5978": "8c3b14", + "3686b1": "d96536", + "2fbee8": "e69c51", + "0f0f0f": "0f0f0f", + "84d7ff": "f7ca7b", + "f2fdff": "fff0d4", + "4d6373": "a05926", + "f6fbfc": "ffe3b0", + "becde4": "d79f63", + "001b77": "7f0e0b", + "ffffff": "ffffff", + "7999bd": "b17d4f", + "005ba2": "a2301b", + "6a6a41": "3b2e28", + "aca462": "5b5450", + "f6f64a": "868382" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/912_3.json b/public/images/pokemon/variant/exp/912_3.json new file mode 100644 index 00000000000..6922a7aefdf --- /dev/null +++ b/public/images/pokemon/variant/exp/912_3.json @@ -0,0 +1,1322 @@ +{ + "textures": [ + { + "image": "912_3.png", + "format": "RGBA8888", + "size": { + "w": 206, + "h": 206 + }, + "scale": 1, + "frames": [ + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 35, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 50 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 35, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 50 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 35, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 50 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 35, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 50 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 35, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 50 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 35, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 50 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 36, + "h": 48 + }, + "frame": { + "x": 0, + "y": 50, + "w": 36, + "h": 48 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 36, + "h": 48 + }, + "frame": { + "x": 0, + "y": 50, + "w": 36, + "h": 48 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 35, + "y": 0, + "w": 34, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 35, + "y": 0, + "w": 34, + "h": 50 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 35, + "y": 0, + "w": 34, + "h": 50 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 35, + "y": 0, + "w": 34, + "h": 50 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 35, + "y": 0, + "w": 34, + "h": 50 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 35, + "y": 0, + "w": 34, + "h": 50 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 98, + "w": 34, + "h": 50 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 98, + "w": 34, + "h": 50 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 98, + "w": 34, + "h": 50 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 98, + "w": 34, + "h": 50 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 98, + "w": 34, + "h": 50 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 98, + "w": 34, + "h": 50 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 98, + "w": 34, + "h": 50 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 98, + "w": 34, + "h": 50 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 148, + "w": 34, + "h": 50 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 0, + "w": 34, + "h": 50 + }, + "frame": { + "x": 0, + "y": 148, + "w": 34, + "h": 50 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 35, + "h": 48 + }, + "frame": { + "x": 34, + "y": 98, + "w": 35, + "h": 48 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 35, + "h": 48 + }, + "frame": { + "x": 36, + "y": 50, + "w": 35, + "h": 48 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 1, + "w": 34, + "h": 49 + }, + "frame": { + "x": 69, + "y": 0, + "w": 34, + "h": 49 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 1, + "w": 34, + "h": 49 + }, + "frame": { + "x": 69, + "y": 0, + "w": 34, + "h": 49 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 1, + "w": 34, + "h": 49 + }, + "frame": { + "x": 69, + "y": 0, + "w": 34, + "h": 49 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 1, + "w": 34, + "h": 49 + }, + "frame": { + "x": 69, + "y": 0, + "w": 34, + "h": 49 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 1, + "w": 34, + "h": 49 + }, + "frame": { + "x": 69, + "y": 0, + "w": 34, + "h": 49 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 1, + "w": 34, + "h": 49 + }, + "frame": { + "x": 69, + "y": 0, + "w": 34, + "h": 49 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 34, + "h": 49 + }, + "frame": { + "x": 34, + "y": 146, + "w": 34, + "h": 49 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 34, + "h": 49 + }, + "frame": { + "x": 34, + "y": 146, + "w": 34, + "h": 49 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 34, + "h": 48 + }, + "frame": { + "x": 68, + "y": 146, + "w": 34, + "h": 48 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 34, + "h": 48 + }, + "frame": { + "x": 68, + "y": 146, + "w": 34, + "h": 48 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 34, + "h": 48 + }, + "frame": { + "x": 68, + "y": 146, + "w": 34, + "h": 48 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 2, + "w": 34, + "h": 48 + }, + "frame": { + "x": 69, + "y": 98, + "w": 34, + "h": 48 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 2, + "w": 34, + "h": 48 + }, + "frame": { + "x": 69, + "y": 98, + "w": 34, + "h": 48 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 12, + "y": 2, + "w": 34, + "h": 48 + }, + "frame": { + "x": 69, + "y": 98, + "w": 34, + "h": 48 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 34, + "h": 48 + }, + "frame": { + "x": 102, + "y": 146, + "w": 34, + "h": 48 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 34, + "h": 48 + }, + "frame": { + "x": 71, + "y": 49, + "w": 34, + "h": 48 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 35, + "h": 46 + }, + "frame": { + "x": 103, + "y": 0, + "w": 35, + "h": 46 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 35, + "h": 46 + }, + "frame": { + "x": 103, + "y": 0, + "w": 35, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 33, + "h": 48 + }, + "frame": { + "x": 103, + "y": 97, + "w": 33, + "h": 48 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 33, + "h": 48 + }, + "frame": { + "x": 103, + "y": 97, + "w": 33, + "h": 48 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 33, + "h": 48 + }, + "frame": { + "x": 103, + "y": 97, + "w": 33, + "h": 48 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 33, + "h": 48 + }, + "frame": { + "x": 103, + "y": 97, + "w": 33, + "h": 48 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 33, + "h": 48 + }, + "frame": { + "x": 103, + "y": 97, + "w": 33, + "h": 48 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 33, + "h": 48 + }, + "frame": { + "x": 103, + "y": 97, + "w": 33, + "h": 48 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 33, + "h": 48 + }, + "frame": { + "x": 103, + "y": 97, + "w": 33, + "h": 48 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 33, + "h": 48 + }, + "frame": { + "x": 103, + "y": 97, + "w": 33, + "h": 48 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 35, + "h": 45 + }, + "frame": { + "x": 105, + "y": 46, + "w": 35, + "h": 45 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 35, + "h": 45 + }, + "frame": { + "x": 105, + "y": 46, + "w": 35, + "h": 45 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 36, + "h": 42 + }, + "frame": { + "x": 138, + "y": 0, + "w": 36, + "h": 42 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 31, + "h": 43 + }, + "frame": { + "x": 174, + "y": 0, + "w": 31, + "h": 43 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 33, + "h": 42 + }, + "frame": { + "x": 140, + "y": 42, + "w": 33, + "h": 42 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 32, + "h": 41 + }, + "frame": { + "x": 173, + "y": 43, + "w": 32, + "h": 41 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 35, + "h": 43 + }, + "frame": { + "x": 136, + "y": 91, + "w": 35, + "h": 43 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 35, + "h": 42 + }, + "frame": { + "x": 171, + "y": 84, + "w": 35, + "h": 42 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 5, + "y": 10, + "w": 34, + "h": 40 + }, + "frame": { + "x": 171, + "y": 126, + "w": 34, + "h": 40 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 50 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 32, + "h": 41 + }, + "frame": { + "x": 136, + "y": 134, + "w": 32, + "h": 41 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:5e52f984dc343b3c37e67fb01b7f66ac:998779f71a17fd2516ed9abb842a03c8:837ed90d4f212f45f6b317e301d03492$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/912_3.png b/public/images/pokemon/variant/exp/912_3.png new file mode 100644 index 00000000000..846915f851e Binary files /dev/null and b/public/images/pokemon/variant/exp/912_3.png differ diff --git a/public/images/pokemon/variant/exp/913.json b/public/images/pokemon/variant/exp/913.json new file mode 100644 index 00000000000..ef10ed6c0e4 --- /dev/null +++ b/public/images/pokemon/variant/exp/913.json @@ -0,0 +1,19 @@ +{ + "1": { + "215c98": "821e24", + "1a3055": "3f050e", + "37a0f7": "f77122", + "1e7cd3": "bd3c24", + "304f5a": "62290c", + "64d9ea": "ffb75c", + "0f0f0f": "0f0f0f", + "4296a2": "f77122", + "ab9a3a": "5b5450", + "735c28": "3b2e28", + "ffdf2b": "868382", + "ffffff": "ffffff", + "535153": "975432", + "fcfcfc": "ffe3b0", + "af9aa5": "d79f63" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/426_3.json b/public/images/pokemon/variant/exp/913_3.json similarity index 62% rename from public/images/pokemon/variant/back/426_3.json rename to public/images/pokemon/variant/exp/913_3.json index 72c1bf371ad..af730d21176 100644 --- a/public/images/pokemon/variant/back/426_3.json +++ b/public/images/pokemon/variant/exp/913_3.json @@ -1,999 +1,54 @@ { "textures": [ { - "image": "426_3.png", + "image": "913_3.png", "format": "RGBA8888", "size": { - "w": 335, - "h": 335 + "w": 334, + "h": 334 }, "scale": 1, "frames": [ { - "filename": "0037.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { - "x": 3, + "x": 0, "y": 0, - "w": 63, - "h": 57 + "w": 43, + "h": 64 }, "frame": { "x": 0, "y": 0, - "w": 63, - "h": 57 + "w": 43, + "h": 64 } }, { - "filename": "0038.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 63, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 58 - }, - "frame": { - "x": 63, - "y": 0, - "w": 63, - "h": 58 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 58 - }, - "frame": { - "x": 63, - "y": 0, - "w": 63, - "h": 58 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 64, - "h": 59 - }, - "frame": { - "x": 126, - "y": 0, - "w": 64, - "h": 59 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 64, - "h": 59 - }, - "frame": { - "x": 126, - "y": 0, - "w": 64, - "h": 59 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 126, - "y": 0, - "w": 64, - "h": 59 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 126, - "y": 0, - "w": 64, - "h": 59 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 67, - "h": 59 - }, - "frame": { - "x": 190, - "y": 0, - "w": 67, - "h": 59 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 67, - "h": 59 - }, - "frame": { - "x": 190, - "y": 0, - "w": 67, - "h": 59 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 59 - }, - "frame": { - "x": 190, - "y": 0, - "w": 67, - "h": 59 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 59 - }, - "frame": { - "x": 190, - "y": 0, - "w": 67, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 64, - "h": 60 - }, - "frame": { - "x": 257, - "y": 0, - "w": 64, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 64, - "h": 60 - }, - "frame": { - "x": 257, - "y": 0, - "w": 64, - "h": 60 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 64, - "h": 60 - }, - "frame": { - "x": 257, - "y": 0, - "w": 64, - "h": 60 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 64, - "h": 60 - }, - "frame": { - "x": 257, - "y": 0, - "w": 64, - "h": 60 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 57, - "w": 63, - "h": 60 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 57, - "w": 63, - "h": 60 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 61 - }, - "frame": { - "x": 63, - "y": 58, - "w": 62, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 61 - }, - "frame": { - "x": 63, - "y": 58, - "w": 62, - "h": 61 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 8, - "w": 67, - "h": 60 - }, - "frame": { - "x": 125, - "y": 59, - "w": 67, - "h": 60 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 8, - "w": 67, - "h": 60 - }, - "frame": { - "x": 125, - "y": 59, - "w": 67, - "h": 60 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 64, - "h": 61 - }, - "frame": { - "x": 192, - "y": 59, - "w": 64, - "h": 61 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 64, - "h": 61 - }, - "frame": { - "x": 192, - "y": 59, - "w": 64, - "h": 61 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 64, - "h": 61 - }, - "frame": { - "x": 192, - "y": 59, - "w": 64, - "h": 61 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 64, - "h": 61 - }, - "frame": { - "x": 192, - "y": 59, - "w": 64, - "h": 61 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 69, - "h": 60 - }, - "frame": { - "x": 256, - "y": 60, - "w": 69, - "h": 60 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 69, - "h": 60 - }, - "frame": { - "x": 256, - "y": 60, - "w": 69, - "h": 60 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 63, - "h": 62 - }, - "frame": { - "x": 0, - "y": 117, - "w": 63, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 63, - "h": 62 - }, - "frame": { - "x": 0, - "y": 117, - "w": 63, - "h": 62 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 63, - "h": 62 - }, - "frame": { - "x": 0, - "y": 117, - "w": 63, - "h": 62 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 63, - "h": 62 - }, - "frame": { - "x": 0, - "y": 117, - "w": 63, - "h": 62 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { "x": 0, - "y": 10, - "w": 70, - "h": 60 - }, - "frame": { - "x": 63, - "y": 119, - "w": 70, - "h": 60 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 70, - "h": 60 - }, - "frame": { - "x": 63, - "y": 119, - "w": 70, - "h": 60 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 69, - "h": 61 - }, - "frame": { - "x": 133, - "y": 120, - "w": 69, - "h": 61 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 69, - "h": 61 - }, - "frame": { - "x": 133, - "y": 120, - "w": 69, - "h": 61 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, "y": 0, - "w": 69, - "h": 61 - }, - "frame": { - "x": 133, - "y": 120, - "w": 69, - "h": 61 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 69, - "h": 61 - }, - "frame": { - "x": 133, - "y": 120, - "w": 69, - "h": 61 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 71, - "h": 61 - }, - "frame": { - "x": 202, - "y": 120, - "w": 71, - "h": 61 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 71, - "h": 61 - }, - "frame": { - "x": 202, - "y": 120, - "w": 71, - "h": 61 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 71, - "h": 61 - }, - "frame": { - "x": 202, - "y": 120, - "w": 71, - "h": 61 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 71, - "h": 61 - }, - "frame": { - "x": 202, - "y": 120, - "w": 71, - "h": 61 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 62, - "h": 62 - }, - "frame": { - "x": 273, - "y": 120, - "w": 62, - "h": 62 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 62, - "h": 62 - }, - "frame": { - "x": 273, - "y": 120, - "w": 62, - "h": 62 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 62, - "h": 62 - }, - "frame": { - "x": 273, - "y": 120, - "w": 62, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 62, - "h": 62 - }, - "frame": { - "x": 273, - "y": 120, - "w": 62, - "h": 62 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 64, - "h": 61 + "w": 43, + "h": 64 }, "frame": { "x": 0, - "y": 179, - "w": 64, - "h": 61 + "y": 64, + "w": 43, + "h": 64 } }, { @@ -1001,356 +56,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 64, - "h": 61 + "x": 0, + "y": 0, + "w": 43, + "h": 64 + }, + "frame": { + "x": 43, + "y": 0, + "w": 43, + "h": 64 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 64 }, "frame": { "x": 0, - "y": 179, - "w": 64, - "h": 61 + "y": 128, + "w": 43, + "h": 64 } }, { - "filename": "0069.png", + "filename": "0050.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { - "x": 1, - "y": 11, - "w": 69, - "h": 61 - }, - "frame": { - "x": 64, - "y": 179, - "w": 69, - "h": 61 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 11, - "w": 69, - "h": 61 - }, - "frame": { - "x": 64, - "y": 179, - "w": 69, - "h": 61 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 11, - "w": 66, - "h": 61 - }, - "frame": { - "x": 133, - "y": 181, - "w": 66, - "h": 61 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 11, - "w": 66, - "h": 61 - }, - "frame": { - "x": 133, - "y": 181, - "w": 66, - "h": 61 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 64, - "h": 62 - }, - "frame": { - "x": 199, - "y": 181, - "w": 64, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 64, - "h": 62 - }, - "frame": { - "x": 199, - "y": 181, - "w": 64, - "h": 62 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 62 - }, - "frame": { - "x": 199, - "y": 181, - "w": 64, - "h": 62 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 62 - }, - "frame": { - "x": 199, - "y": 181, - "w": 64, - "h": 62 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 62 - }, - "frame": { - "x": 263, - "y": 182, - "w": 69, - "h": 62 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 62 - }, - "frame": { - "x": 263, - "y": 182, - "w": 69, - "h": 62 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 69, - "h": 62 - }, - "frame": { - "x": 263, - "y": 182, - "w": 69, - "h": 62 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 69, - "h": 62 - }, - "frame": { - "x": 263, - "y": 182, - "w": 69, - "h": 62 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 66, - "h": 62 - }, - "frame": { "x": 0, - "y": 240, - "w": 66, - "h": 62 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 66, - "h": 62 + "y": 0, + "w": 42, + "h": 64 }, "frame": { - "x": 0, - "y": 240, - "w": 66, - "h": 62 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 66, - "h": 62 - }, - "frame": { - "x": 0, - "y": 240, - "w": 66, - "h": 62 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 66, - "h": 62 - }, - "frame": { - "x": 0, - "y": 240, - "w": 66, - "h": 62 + "x": 43, + "y": 64, + "w": 42, + "h": 64 } }, { @@ -1358,83 +119,524 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, + "x": 0, + "y": 0, + "w": 42, + "h": 64 + }, + "frame": { + "x": 86, + "y": 0, + "w": 42, + "h": 64 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 42, + "h": 64 + }, + "frame": { + "x": 86, + "y": 0, + "w": 42, + "h": 64 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 42, + "h": 64 + }, + "frame": { + "x": 0, + "y": 192, + "w": 42, + "h": 64 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 42, + "h": 63 + }, + "frame": { + "x": 43, + "y": 128, + "w": 42, + "h": 63 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 42, + "h": 63 + }, + "frame": { + "x": 43, + "y": 128, + "w": 42, + "h": 63 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 42, + "h": 63 + }, + "frame": { + "x": 43, + "y": 128, + "w": 42, + "h": 63 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 42, + "h": 63 + }, + "frame": { + "x": 43, + "y": 128, + "w": 42, + "h": 63 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 42, + "h": 63 + }, + "frame": { + "x": 43, + "y": 128, + "w": 42, + "h": 63 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 42, + "h": 63 + }, + "frame": { + "x": 85, + "y": 64, + "w": 42, + "h": 63 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, + "h": 63 + }, + "frame": { + "x": 128, + "y": 0, + "w": 41, + "h": 63 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, + "h": 63 + }, + "frame": { + "x": 128, + "y": 0, + "w": 41, + "h": 63 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, + "h": 63 + }, + "frame": { + "x": 128, + "y": 0, + "w": 41, + "h": 63 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, + "h": 63 + }, + "frame": { + "x": 128, + "y": 0, + "w": 41, + "h": 63 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, + "h": 63 + }, + "frame": { + "x": 128, + "y": 0, + "w": 41, + "h": 63 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, + "h": 63 + }, + "frame": { + "x": 128, + "y": 0, + "w": 41, + "h": 63 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, + "h": 63 + }, + "frame": { + "x": 128, + "y": 0, + "w": 41, + "h": 63 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 42, "h": 62 }, "frame": { - "x": 66, - "y": 240, - "w": 64, + "x": 0, + "y": 256, + "w": 42, "h": 62 } }, { - "filename": "0058.png", + "filename": "0008.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, + "x": 1, + "y": 2, + "w": 42, "h": 62 }, "frame": { - "x": 66, - "y": 240, - "w": 64, + "x": 85, + "y": 127, + "w": 42, "h": 62 } }, { - "filename": "0051.png", + "filename": "0032.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 63, + "x": 1, + "y": 2, + "w": 42, + "h": 62 + }, + "frame": { + "x": 85, + "y": 127, + "w": 42, + "h": 62 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, "h": 63 }, "frame": { - "x": 130, - "y": 242, - "w": 63, + "x": 169, + "y": 0, + "w": 41, "h": 63 } }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 42, + "h": 62 + }, + "frame": { + "x": 210, + "y": 0, + "w": 42, + "h": 62 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 42, + "h": 62 + }, + "frame": { + "x": 252, + "y": 0, + "w": 42, + "h": 62 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 39, + "h": 62 + }, + "frame": { + "x": 294, + "y": 0, + "w": 39, + "h": 62 + } + }, { "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 63, - "h": 63 + "x": 2, + "y": 0, + "w": 39, + "h": 64 }, "frame": { - "x": 130, - "y": 242, - "w": 63, - "h": 63 + "x": 42, + "y": 192, + "w": 39, + "h": 64 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 42, + "h": 62 + }, + "frame": { + "x": 42, + "y": 256, + "w": 42, + "h": 62 } }, { @@ -1442,19 +644,61 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { "x": 6, - "y": 5, - "w": 64, + "y": 0, + "w": 33, + "h": 64 + }, + "frame": { + "x": 81, + "y": 191, + "w": 33, + "h": 64 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, "h": 63 }, "frame": { - "x": 193, - "y": 243, - "w": 64, + "x": 84, + "y": 255, + "w": 41, + "h": 63 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, + "h": 63 + }, + "frame": { + "x": 84, + "y": 255, + "w": 41, "h": 63 } }, @@ -1463,20 +707,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 }, "spriteSourceSize": { "x": 6, - "y": 5, - "w": 64, - "h": 63 + "y": 0, + "w": 31, + "h": 64 }, "frame": { - "x": 193, - "y": 243, - "w": 64, - "h": 63 + "x": 114, + "y": 189, + "w": 31, + "h": 64 } }, { @@ -1484,41 +728,755 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 39, + "h": 64 + }, + "frame": { + "x": 125, + "y": 253, + "w": 39, + "h": 64 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 39, + "h": 64 + }, + "frame": { + "x": 127, + "y": 64, + "w": 39, + "h": 64 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 41, + "h": 61 + }, + "frame": { + "x": 127, + "y": 128, + "w": 41, + "h": 61 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 }, "spriteSourceSize": { "x": 6, - "y": 5, - "w": 65, + "y": 0, + "w": 33, + "h": 64 + }, + "frame": { + "x": 145, + "y": 189, + "w": 33, + "h": 64 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 41, "h": 63 }, "frame": { - "x": 257, - "y": 244, - "w": 65, + "x": 166, + "y": 63, + "w": 41, "h": 63 } }, { - "filename": "0056.png", + "filename": "0068.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 71, - "h": 72 + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 39, + "h": 62 + }, + "frame": { + "x": 168, + "y": 126, + "w": 39, + "h": 62 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 }, "spriteSourceSize": { "x": 6, - "y": 5, - "w": 65, - "h": 63 + "y": 0, + "w": 31, + "h": 64 }, "frame": { - "x": 257, - "y": 244, - "w": 65, - "h": 63 + "x": 178, + "y": 188, + "w": 31, + "h": 64 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 39, + "h": 64 + }, + "frame": { + "x": 164, + "y": 253, + "w": 39, + "h": 64 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 203, + "y": 252, + "w": 38, + "h": 62 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 203, + "y": 252, + "w": 38, + "h": 62 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 203, + "y": 252, + "w": 38, + "h": 62 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 203, + "y": 252, + "w": 38, + "h": 62 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 203, + "y": 252, + "w": 38, + "h": 62 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 203, + "y": 252, + "w": 38, + "h": 62 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 207, + "y": 63, + "w": 38, + "h": 62 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 207, + "y": 63, + "w": 38, + "h": 62 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 207, + "y": 63, + "w": 38, + "h": 62 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 207, + "y": 63, + "w": 38, + "h": 62 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 207, + "y": 63, + "w": 38, + "h": 62 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 207, + "y": 63, + "w": 38, + "h": 62 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 207, + "y": 63, + "w": 38, + "h": 62 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 41, + "h": 61 + }, + "frame": { + "x": 245, + "y": 62, + "w": 41, + "h": 61 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 41, + "h": 61 + }, + "frame": { + "x": 286, + "y": 62, + "w": 41, + "h": 61 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 38, + "h": 62 + }, + "frame": { + "x": 207, + "y": 125, + "w": 38, + "h": 62 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 61 + }, + "frame": { + "x": 245, + "y": 123, + "w": 36, + "h": 61 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 61 + }, + "frame": { + "x": 245, + "y": 123, + "w": 36, + "h": 61 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 61 + }, + "frame": { + "x": 245, + "y": 123, + "w": 36, + "h": 61 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 61 + }, + "frame": { + "x": 245, + "y": 123, + "w": 36, + "h": 61 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 33, + "h": 60 + }, + "frame": { + "x": 281, + "y": 123, + "w": 33, + "h": 60 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 3, + "y": 4, + "w": 32, + "h": 60 + }, + "frame": { + "x": 209, + "y": 187, + "w": 32, + "h": 60 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 33, + "h": 58 + }, + "frame": { + "x": 241, + "y": 187, + "w": 33, + "h": 58 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 32, + "h": 56 + }, + "frame": { + "x": 241, + "y": 245, + "w": 32, + "h": 56 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 3, + "y": 8, + "w": 30, + "h": 56 + }, + "frame": { + "x": 274, + "y": 184, + "w": 30, + "h": 56 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 16, + "w": 30, + "h": 48 + }, + "frame": { + "x": 304, + "y": 183, + "w": 30, + "h": 48 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 9, + "w": 31, + "h": 55 + }, + "frame": { + "x": 273, + "y": 245, + "w": 31, + "h": 55 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 44, + "h": 64 + }, + "spriteSourceSize": { + "x": 2, + "y": 12, + "w": 29, + "h": 52 + }, + "frame": { + "x": 304, + "y": 231, + "w": 29, + "h": 52 } } ] @@ -1527,6 +1485,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5a260d2a6180d3a382a352c076369741:e26f8902d45a6e7b427d7dd3cc82c868:b81a75872f1ff6f03d9cd643388500e3$" + "smartupdate": "$TexturePacker:SmartUpdate:cd9358e107a98d62c3ec205801586149:dc3a3276c520321f023388de9bbe1fc9:6c6d101ae74d8a8237faf96bfea4e6ac$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/913_3.png b/public/images/pokemon/variant/exp/913_3.png new file mode 100644 index 00000000000..acb749c995d Binary files /dev/null and b/public/images/pokemon/variant/exp/913_3.png differ diff --git a/public/images/pokemon/variant/exp/914.json b/public/images/pokemon/variant/exp/914.json new file mode 100644 index 00000000000..88384878b7a --- /dev/null +++ b/public/images/pokemon/variant/exp/914.json @@ -0,0 +1,23 @@ +{ + "2": { + "3d7a71": "541222", + "55dbe6": "f15e76", + "0f0f0f": "0f0f0f", + "394bee": "1d6c42", + "282a4d": "072a2b", + "419bc2": "a22f49", + "effffd": "ffcede", + "333f93": "0f4537", + "7f2b11": "664747", + "e3460f": "fff2e5", + "a24720": "eac7b4", + "eda936": "ffa564", + "803213": "4b251b", + "ffffff": "ffffff", + "efffff": "4b40be", + "cb7e29": "c76740", + "8ea6a8": "3b188e", + "63797f": "120e4a", + "004040": "004040" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/673_2.json b/public/images/pokemon/variant/exp/914_2.json similarity index 53% rename from public/images/pokemon/variant/exp/back/673_2.json rename to public/images/pokemon/variant/exp/914_2.json index b9c2b2d54e7..64edc903128 100644 --- a/public/images/pokemon/variant/exp/back/673_2.json +++ b/public/images/pokemon/variant/exp/914_2.json @@ -1,390 +1,33 @@ { "textures": [ { - "image": "673_2.png", + "image": "914_2.png", "format": "RGBA8888", "size": { - "w": 384, - "h": 384 + "w": 510, + "h": 510 }, "scale": 1, "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 124, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 186, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 248, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 248, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 310, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 65, - "w": 62, - "h": 65 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 65, - "w": 62, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - }, - "frame": { - "x": 124, - "y": 65, - "w": 61, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - }, - "frame": { - "x": 124, - "y": 65, - "w": 61, - "h": 65 - } - }, { "filename": "0026.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 }, "spriteSourceSize": { - "x": 1, + "x": 3, "y": 0, "w": 60, - "h": 65 - }, - "frame": { - "x": 185, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 245, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 305, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 + "h": 80 }, "frame": { "x": 0, - "y": 130, + "y": 0, "w": 60, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 60, - "h": 62 - }, - "frame": { - "x": 60, - "y": 130, - "w": 60, - "h": 62 + "h": 80 } }, { @@ -392,125 +35,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 }, "spriteSourceSize": { - "x": 1, + "x": 2, "y": 0, "w": 59, - "h": 65 + "h": 80 }, "frame": { - "x": 120, - "y": 130, + "x": 0, + "y": 80, "w": 59, - "h": 65 + "h": 80 } }, { - "filename": "0023.png", + "filename": "0027.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 }, "spriteSourceSize": { - "x": 1, + "x": 2, "y": 0, "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 + "h": 80 }, "frame": { "x": 60, - "y": 192, + "y": 0, "w": 59, - "h": 65 + "h": 80 } }, { - "filename": "0022.png", + "filename": "0032.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 + "x": 2, + "y": 4, + "w": 62, + "h": 76 }, "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 + "x": 119, + "y": 0, + "w": 62, + "h": 76 } }, { @@ -518,83 +98,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 + "x": 2, + "y": 1, + "w": 58, + "h": 79 }, "frame": { "x": 0, - "y": 195, - "w": 59, - "h": 65 + "y": 160, + "w": 58, + "h": 79 } }, { - "filename": "0044.png", + "filename": "0028.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 }, "spriteSourceSize": { - "x": 1, + "x": 3, "y": 0, - "w": 59, - "h": 65 + "w": 57, + "h": 80 }, "frame": { - "x": 179, - "y": 130, - "w": 59, - "h": 65 + "x": 59, + "y": 80, + "w": 57, + "h": 80 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 0, + "y": 239, + "w": 57, + "h": 80 } }, { @@ -602,293 +161,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 }, "spriteSourceSize": { "x": 2, "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 130, - "w": 58, - "h": 64 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 130, - "w": 58, - "h": 64 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 194, - "w": 58, - "h": 64 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 59, - "y": 257, - "w": 58, - "h": 64 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 0, - "y": 260, - "w": 58, - "h": 64 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 117, - "y": 257, - "w": 58, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 58, - "h": 62 - }, - "frame": { - "x": 119, - "y": 195, - "w": 58, - "h": 62 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, "w": 57, - "h": 64 - }, - "frame": { - "x": 175, - "y": 257, - "w": 57, - "h": 64 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 58, - "h": 62 - }, - "frame": { - "x": 177, - "y": 195, - "w": 58, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 232, - "y": 258, - "w": 57, - "h": 63 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 289, - "y": 258, - "w": 57, - "h": 63 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 296, - "y": 130, - "w": 57, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 296, - "y": 193, - "w": 57, - "h": 63 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 56, - "h": 63 + "h": 79 }, "frame": { "x": 58, - "y": 321, - "w": 56, - "h": 63 + "y": 160, + "w": 57, + "h": 79 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 58, + "h": 78 + }, + "frame": { + "x": 57, + "y": 239, + "w": 58, + "h": 78 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 55, + "h": 80 + }, + "frame": { + "x": 0, + "y": 319, + "w": 55, + "h": 80 } }, { @@ -896,20 +224,587 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 61, + "h": 74 + }, + "frame": { + "x": 181, + "y": 0, + "w": 61, + "h": 74 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 61, + "h": 74 + }, + "frame": { + "x": 242, + "y": 0, + "w": 61, + "h": 74 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 55, + "h": 80 + }, + "frame": { + "x": 0, + "y": 399, + "w": 55, + "h": 80 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 60, + "h": 74 + }, + "frame": { + "x": 303, + "y": 0, + "w": 60, + "h": 74 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 60, + "h": 75 + }, + "frame": { + "x": 363, + "y": 0, + "w": 60, + "h": 75 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 59, + "h": 76 + }, + "frame": { + "x": 423, + "y": 0, + "w": 59, + "h": 76 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 54, + "h": 80 + }, + "frame": { + "x": 116, + "y": 80, + "w": 54, + "h": 80 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 57, + "h": 78 + }, + "frame": { + "x": 115, + "y": 160, + "w": 57, + "h": 78 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 56, + "h": 77 + }, + "frame": { + "x": 115, + "y": 238, + "w": 56, + "h": 77 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 55, + "h": 78 + }, + "frame": { + "x": 170, + "y": 76, + "w": 55, + "h": 78 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 58, + "h": 76 + }, + "frame": { + "x": 225, + "y": 74, + "w": 58, + "h": 76 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 57, + "h": 76 + }, + "frame": { + "x": 283, + "y": 74, + "w": 57, + "h": 76 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 53, + "h": 78 + }, + "frame": { + "x": 172, + "y": 154, + "w": 53, + "h": 78 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 60, + "h": 73 + }, + "frame": { + "x": 225, + "y": 150, + "w": 60, + "h": 73 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 58, + "h": 74 + }, + "frame": { + "x": 285, + "y": 150, + "w": 58, + "h": 74 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 57, + "h": 75 + }, + "frame": { + "x": 340, + "y": 75, + "w": 57, + "h": 75 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 }, "spriteSourceSize": { "x": 4, - "y": 2, - "w": 56, - "h": 63 + "y": 4, + "w": 54, + "h": 76 }, "frame": { - "x": 114, - "y": 321, - "w": 56, - "h": 63 + "x": 343, + "y": 150, + "w": 54, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 60, + "h": 73 + }, + "frame": { + "x": 397, + "y": 76, + "w": 60, + "h": 73 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 457, + "y": 76, + "w": 53, + "h": 76 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 60, + "h": 73 + }, + "frame": { + "x": 397, + "y": 149, + "w": 60, + "h": 73 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 52, + "h": 75 + }, + "frame": { + "x": 457, + "y": 152, + "w": 52, + "h": 75 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 55, + "h": 77 + }, + "frame": { + "x": 55, + "y": 319, + "w": 55, + "h": 77 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 57, + "h": 76 + }, + "frame": { + "x": 55, + "y": 396, + "w": 57, + "h": 76 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 4, + "w": 51, + "h": 76 + }, + "frame": { + "x": 110, + "y": 317, + "w": 51, + "h": 76 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 51, + "h": 76 + }, + "frame": { + "x": 112, + "y": 393, + "w": 51, + "h": 76 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 54, + "h": 76 + }, + "frame": { + "x": 161, + "y": 315, + "w": 54, + "h": 76 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 54, + "h": 75 + }, + "frame": { + "x": 163, + "y": 391, + "w": 54, + "h": 75 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 54, + "h": 75 + }, + "frame": { + "x": 171, + "y": 238, + "w": 54, + "h": 75 } }, { @@ -917,20 +812,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 }, "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 62 + "x": 1, + "y": 8, + "w": 60, + "h": 72 }, "frame": { - "x": 170, - "y": 321, - "w": 56, - "h": 62 + "x": 225, + "y": 223, + "w": 60, + "h": 72 } }, { @@ -938,20 +833,314 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 62, - "h": 65 + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 58, + "h": 73 + }, + "frame": { + "x": 285, + "y": 224, + "w": 58, + "h": 73 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 58, + "h": 74 + }, + "frame": { + "x": 343, + "y": 226, + "w": 58, + "h": 74 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 401, + "y": 222, + "w": 56, + "h": 72 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 54, + "h": 75 + }, + "frame": { + "x": 215, + "y": 313, + "w": 54, + "h": 75 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 55, + "h": 74 + }, + "frame": { + "x": 217, + "y": 388, + "w": 55, + "h": 74 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 59, + "h": 72 + }, + "frame": { + "x": 269, + "y": 297, + "w": 59, + "h": 72 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 59, + "h": 71 + }, + "frame": { + "x": 328, + "y": 300, + "w": 59, + "h": 71 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 56, + "h": 71 + }, + "frame": { + "x": 272, + "y": 369, + "w": 56, + "h": 71 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 }, "spriteSourceSize": { "x": 4, - "y": 3, - "w": 56, - "h": 62 + "y": 10, + "w": 58, + "h": 70 }, "frame": { - "x": 226, - "y": 321, - "w": 56, - "h": 62 + "x": 272, + "y": 440, + "w": 58, + "h": 70 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 3, + "y": 7, + "w": 55, + "h": 73 + }, + "frame": { + "x": 387, + "y": 300, + "w": 55, + "h": 73 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 55, + "h": 72 + }, + "frame": { + "x": 442, + "y": 294, + "w": 55, + "h": 72 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 55, + "h": 71 + }, + "frame": { + "x": 442, + "y": 366, + "w": 55, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 55, + "h": 72 + }, + "frame": { + "x": 330, + "y": 437, + "w": 55, + "h": 72 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 4, + "y": 10, + "w": 57, + "h": 70 + }, + "frame": { + "x": 385, + "y": 373, + "w": 57, + "h": 70 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 80 + }, + "spriteSourceSize": { + "x": 6, + "y": 9, + "w": 59, + "h": 71 + }, + "frame": { + "x": 442, + "y": 437, + "w": 59, + "h": 71 } } ] @@ -960,6 +1149,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:05149e465b79b92adcb764d8f903ce8d:523fbed3890bc743f1863e6db3150ddb:5d92dd5d09b0875a1d8f3606df775958$" + "smartupdate": "$TexturePacker:SmartUpdate:ae43c07229a61843736e4c11fe90d5ff:e6dde358d4823825471d2804129bc79e:a123ce346d124b2d12481db361d1b25b$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/914_2.png b/public/images/pokemon/variant/exp/914_2.png new file mode 100644 index 00000000000..08093e2b50b Binary files /dev/null and b/public/images/pokemon/variant/exp/914_2.png differ diff --git a/public/images/pokemon/variant/exp/940.json b/public/images/pokemon/variant/exp/940.json new file mode 100644 index 00000000000..f5f5ae5663b --- /dev/null +++ b/public/images/pokemon/variant/exp/940.json @@ -0,0 +1,42 @@ +{ + "1": { + "1c1e22": "271945", + "000000": "000000", + "3d4049": "4c4982", + "7d5e1b": "1b9ea1", + "c2a227": "5dd9c8", + "ffce34": "7dffc0", + "292c32": "372b61", + "666971": "595e99", + "3f424b": "4a4780", + "ffffff": "ffffff", + "8596b0": "e39fc5", + "b06b38": "9a5fd9", + "000618": "000618", + "704424": "433382", + "ff9b37": "ce87fa", + "4fc6b4": "4fc6b4", + "40434d": "754494", + "af6a37": "413280" + }, + "2": { + "1c1e22": "532d61", + "000000": "000000", + "3d4049": "edc5c8", + "7d5e1b": "8c2a55", + "c2a227": "b3466a", + "ffce34": "d9647b", + "292c32": "e099a5", + "666971": "f7dfdc", + "3f424b": "ebc3c5", + "ffffff": "ffffff", + "8596b0": "e39fc5", + "b06b38": "57436e", + "000618": "000618", + "704424": "2b2745", + "ff9b37": "745b85", + "4fc6b4": "ffcf4a", + "40434d": "59317a", + "af6a37": "2a2642" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/941.json b/public/images/pokemon/variant/exp/941.json new file mode 100644 index 00000000000..1c9bc304c35 --- /dev/null +++ b/public/images/pokemon/variant/exp/941.json @@ -0,0 +1,42 @@ +{ + "1": { + "825d21": "217991", + "000000": "000000", + "ffcd37": "6ef5c8", + "aa7e24": "3dd1cc", + "34393f": "2b3863", + "6c7177": "354c70", + "26282c": "1f1d54", + "8c898c": "9c5bd9", + "fdfdfd": "fdfdfd", + "1a1c1f": "1a1c1f", + "73bbbf": "de82ff", + "441e21": "d16492", + "0f0f0f": "0f0f0f", + "ebffff": "ebffff", + "692a2f": "ff9ec6", + "2b1717": "773185", + "37415a": "55348a", + "565f77": "6e4596" + }, + "2": { + "825d21": "8a2f62", + "000000": "000000", + "ffcd37": "e3667d", + "aa7e24": "c44f6c", + "34393f": "f7bebe", + "6c7177": "f7dfdc", + "26282c": "e394a7", + "8c898c": "cf7827", + "fdfdfd": "fdfdfd", + "1a1c1f": "1a1c1f", + "73bbbf": "ffcf4a", + "441e21": "51467a", + "0f0f0f": "0f0f0f", + "ebffff": "ebffff", + "692a2f": "776294", + "2b1717": "3a3466", + "37415a": "723b80", + "565f77": "93529e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/953.json b/public/images/pokemon/variant/exp/953.json new file mode 100644 index 00000000000..6f2885be607 --- /dev/null +++ b/public/images/pokemon/variant/exp/953.json @@ -0,0 +1,36 @@ +{ + "1": { + "5a4d37": "1c1e76", + "766348": "323aa5", + "c5b4aa": "d3e6e6", + "37332b": "104139", + "9e8360": "4059bd", + "0f0f0f": "0f0f0f", + "575243": "18734a", + "777462": "199e46", + "afa668": "f9fba2", + "a28c88": "c1d8db", + "f2f2f2": "e8eab5", + "b45492": "dedb64", + "f28625": "2e8c19", + "4e4530": "b29c3e", + "ba6e29": "2f7410" + }, + "2": { + "5a4d37": "333e5f", + "766348": "8c9fbf", + "c5b4aa": "39cfbc", + "37332b": "261031", + "9e8360": "dbedec", + "0f0f0f": "0f0f0f", + "575243": "5e2d72", + "777462": "8358a1", + "afa668": "c9dbac", + "a28e88": "52b0b0", + "f2f2f2": "d9c951", + "b45492": "b56c3e", + "f28625": "4baecd", + "4e4530": "534b8c", + "ba6e29": "4792bd" + } +} diff --git a/public/images/pokemon/variant/exp/954.json b/public/images/pokemon/variant/exp/954.json new file mode 100644 index 00000000000..825973cc6b0 --- /dev/null +++ b/public/images/pokemon/variant/exp/954.json @@ -0,0 +1,50 @@ +{ + "1": { + "6f0c76": "4b5173", + "e11bff": "e1efff", + "aa13b7": "a0a9da", + "91263f": "87ceeb", + "000000": "000000", + "ce2d6b": "fffd91", + "ff4c90": "ffbc00", + "ffd5e5": "fbf3ab", + "ff6aa3": "ff9600", + "ff8ac2": "ff6900", + "4a8c98": "7d4538", + "3c5384": "523223", + "63c5d5": "b05858", + "7c6e7d": "675941", + "ffffff": "f1d074", + "932742": "07493e", + "cd2c6a": "11854e", + "f1f1f1": "96ebef", + "fb86b1": "72dee4", + "fa6ca0": "24eff1", + "7d2036": "096757", + "f73e6f": "159464" + }, + "2": { + "6f0c76": "3e091a", + "e11bff": "9b2f17", + "aa13b7": "6b1911", + "91263f": "c65813", + "000000": "000000", + "ce2d6b": "ded051", + "ff4c90": "141031", + "ffd5e5": "432f77", + "ff6aa3": "080809", + "ff8ac2": "030304", + "4a8c98": "616481", + "3c5384": "21214c", + "63c5d5": "9e9fb6", + "7c6e7d": "21214c", + "ffffff": "221a4c", + "932742": "206a61", + "cd2c6a": "4cc9ba", + "f1f1f1": "efda1f", + "fb86b1": "f97130", + "fa6ca0": "f54747", + "7d2036": "204c6a", + "f73e6f": "4c97c9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/970.json b/public/images/pokemon/variant/exp/970.json new file mode 100644 index 00000000000..7e25970c4bc --- /dev/null +++ b/public/images/pokemon/variant/exp/970.json @@ -0,0 +1,36 @@ +{ + "1": { + "366956": "692915", + "ffff31": "dde4e6", + "5de0aa": "fbce5d", + "5a869c": "bd2646", + "2c369a": "435469", + "4d6076": "6b1933", + "3d464b": "44111b", + "000000": "ffffff", + "41968b": "c57833", + "e0548f": "758eb4", + "fd84ba": "bbe3ee", + "a02c75": "3f4a6f", + "3253d6": "577b81", + "242737": "171c28", + "262b6b": "323b51" + }, + "2": { + "366956": "6d171f", + "ffff31": "c0efff", + "5de0aa": "df543b", + "5a869c": "656b8b", + "2c369a": "e1a47a", + "4d6076": "433e53", + "3d464b": "2d293a", + "000000": "ffffff", + "41968b": "a51414", + "e0548f": "235c65", + "fd84ba": "3e8768", + "a02c75": "1b3842", + "3253d6": "ffedd1", + "242737": "352b2f", + "262b6b": "bb7154" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/981.json b/public/images/pokemon/variant/exp/981.json new file mode 100644 index 00000000000..79ff9efd3ac --- /dev/null +++ b/public/images/pokemon/variant/exp/981.json @@ -0,0 +1,58 @@ +{ + "1": { + "242322": "2e1f1f", + "43341e": "112246", + "36383d": "503a2d", + "6f5431": "1f4062", + "9ca0ab": "665144", + "8b704c": "3d6186", + "322513": "091e34", + "0f0f0f": "0f0f0f", + "fff42f": "c29925", + "b4ff68": "ff8f00", + "fcfcfc": "fcfcfc", + "deb43d": "dec93d", + "6aad21": "ffbd42", + "a8abb3": "a8abb3", + "775c10": "774f10", + "b1a75c": "7e262d", + "3d680f": "be5302", + "fdec8a": "9c3e3e", + "ed7474": "c59671", + "ce5742": "ab9d75", + "513c21": "430b0f", + "68281c": "59513a", + "6f5d35": "5b1a1f", + "a03f2e": "8a7e5e", + "f18d4e": "d8d1ad", + "f5aa77": "d4b095" + }, + "2": { + "242322": "34162a", + "43341e": "52ab5f", + "36383d": "792e51", + "6f5431": "a8e781", + "9ca0ab": "9c5978", + "8b704c": "e4efcf", + "322513": "337142", + "0f0f0f": "0f0f0f", + "fff42f": "ed9233", + "b4ff68": "dc7346", + "fcfcfc": "fcfcfc", + "deb43d": "ebbb72", + "6aad21": "d8975d", + "a8abb3": "a8abb3", + "775c10": "b35127", + "b1a75c": "1e7884", + "3d680f": "953c2f", + "fdec8a": "2a9d8f", + "ed7474": "314f7a", + "ce5742": "1a2e43", + "513c21": "1a456c", + "68281c": "0e182e", + "6f5d35": "1b5c77", + "a03f2e": "17253d", + "f18d4e": "264653", + "f5aa77": "4a7688" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/1003.json b/public/images/pokemon/variant/exp/back/1003.json new file mode 100644 index 00000000000..4498fa9e84b --- /dev/null +++ b/public/images/pokemon/variant/exp/back/1003.json @@ -0,0 +1,34 @@ +{ + "1": { + "0f0f0f": "0f0f0f", + "73958b": "daa666", + "486863": "be8550", + "a6b4a7": "e7cb7e", + "5e4622": "352831", + "283331": "96562e", + "381e1d": "4d0400", + "8c6140": "ff7d59", + "7e4742": "c64732", + "ff1f1a": "009db7", + "7a6436": "514758", + "5c3127": "861d0f", + "af9586": "beafb5", + "957560": "9c8e99" + }, + "2": { + "0f0f0f": "0f0f0f", + "73958b": "8d6acc", + "486863": "6c4aac", + "a6b4a7": "cfa0f3", + "5e4622": "434377", + "283331": "472d7c", + "381e1d": "1a1a31", + "8c6140": "767a7e", + "7e4742": "585869", + "ff1f1a": "ffec91", + "7a6436": "8183b3", + "5c3127": "313246", + "af9586": "d6d8d6", + "957560": "b0a39f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/1006_2.json b/public/images/pokemon/variant/exp/back/1006_2.json new file mode 100644 index 00000000000..47f8b260f6c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/1006_2.json @@ -0,0 +1,692 @@ +{ + "textures": [ + { + "image": "1006_2.png", + "format": "RGBA8888", + "size": { + "w": 320, + "h": 320 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 82, + "w": 64, + "h": 82 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 82, + "w": 64, + "h": 82 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 164, + "w": 64, + "h": 82 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 164, + "w": 64, + "h": 82 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 64, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 64, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 128, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 128, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 192, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 192, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 256, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 256, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 64, + "y": 82, + "w": 64, + "h": 82 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 64, + "y": 82, + "w": 64, + "h": 82 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 64, + "h": 81 + }, + "frame": { + "x": 64, + "y": 164, + "w": 64, + "h": 81 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 64, + "h": 81 + }, + "frame": { + "x": 64, + "y": 164, + "w": 64, + "h": 81 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 80 + }, + "frame": { + "x": 128, + "y": 82, + "w": 64, + "h": 80 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 80 + }, + "frame": { + "x": 128, + "y": 82, + "w": 64, + "h": 80 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 80 + }, + "frame": { + "x": 192, + "y": 82, + "w": 64, + "h": 80 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 80 + }, + "frame": { + "x": 192, + "y": 82, + "w": 64, + "h": 80 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 64, + "h": 79 + }, + "frame": { + "x": 256, + "y": 82, + "w": 64, + "h": 79 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 64, + "h": 79 + }, + "frame": { + "x": 256, + "y": 82, + "w": 64, + "h": 79 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 256, + "y": 161, + "w": 64, + "h": 78 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 256, + "y": 161, + "w": 64, + "h": 78 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 128, + "y": 239, + "w": 64, + "h": 78 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 128, + "y": 239, + "w": 64, + "h": 78 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:62e212f37c32fa2be2f5ac9a0b99c57a:99cb86a06a7cd22b0cdb0a9abe27ceb4:ec396d31079bf59c1cfe027eb7d25f86$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/1006_2.png b/public/images/pokemon/variant/exp/back/1006_2.png new file mode 100644 index 00000000000..814e1460081 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/1006_2.png differ diff --git a/public/images/pokemon/variant/exp/back/1006_3.json b/public/images/pokemon/variant/exp/back/1006_3.json new file mode 100644 index 00000000000..545b89b812b --- /dev/null +++ b/public/images/pokemon/variant/exp/back/1006_3.json @@ -0,0 +1,692 @@ +{ + "textures": [ + { + "image": "1006_3.png", + "format": "RGBA8888", + "size": { + "w": 320, + "h": 320 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 82, + "w": 64, + "h": 82 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 82, + "w": 64, + "h": 82 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 164, + "w": 64, + "h": 82 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 0, + "y": 164, + "w": 64, + "h": 82 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 64, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 64, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 128, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 128, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 192, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 192, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 256, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 256, + "y": 0, + "w": 64, + "h": 82 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 64, + "y": 82, + "w": 64, + "h": 82 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 82 + }, + "frame": { + "x": 64, + "y": 82, + "w": 64, + "h": 82 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 64, + "h": 81 + }, + "frame": { + "x": 64, + "y": 164, + "w": 64, + "h": 81 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 64, + "h": 81 + }, + "frame": { + "x": 64, + "y": 164, + "w": 64, + "h": 81 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 80 + }, + "frame": { + "x": 128, + "y": 82, + "w": 64, + "h": 80 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 80 + }, + "frame": { + "x": 128, + "y": 82, + "w": 64, + "h": 80 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 80 + }, + "frame": { + "x": 192, + "y": 82, + "w": 64, + "h": 80 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 80 + }, + "frame": { + "x": 192, + "y": 82, + "w": 64, + "h": 80 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 64, + "h": 79 + }, + "frame": { + "x": 256, + "y": 82, + "w": 64, + "h": 79 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 64, + "h": 79 + }, + "frame": { + "x": 256, + "y": 82, + "w": 64, + "h": 79 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 256, + "y": 161, + "w": 64, + "h": 78 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 256, + "y": 161, + "w": 64, + "h": 78 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 128, + "y": 239, + "w": 64, + "h": 78 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 128, + "y": 239, + "w": 64, + "h": 78 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 64, + "h": 82 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 64, + "h": 78 + }, + "frame": { + "x": 192, + "y": 162, + "w": 64, + "h": 78 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:62e212f37c32fa2be2f5ac9a0b99c57a:99cb86a06a7cd22b0cdb0a9abe27ceb4:ec396d31079bf59c1cfe027eb7d25f86$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/1006_3.png b/public/images/pokemon/variant/exp/back/1006_3.png new file mode 100644 index 00000000000..c5bb5104666 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/1006_3.png differ diff --git a/public/images/pokemon/variant/exp/back/2027.json b/public/images/pokemon/variant/exp/back/2027.json new file mode 100644 index 00000000000..04686fda98b --- /dev/null +++ b/public/images/pokemon/variant/exp/back/2027.json @@ -0,0 +1,26 @@ +{ + "1": { + "518d9f": "a24c68", + "354e73": "752e42", + "b6dbe7": "ffdac2", + "84b3ce": "d27c80", + "fefefe": "fefefe", + "101010": "101010", + "897e67": "aaaa96", + "fefea9": "fffffc", + "d1c592": "d3d3c6", + "000000": "000000" + }, + "2": { + "518d9f": "6a439e", + "354e73": "3d2c78", + "b6dbe7": "dbb1eb", + "84b3ce": "a87bcf", + "fefefe": "fefefe", + "101010": "101010", + "897e67": "2e163d", + "fefea9": "6f3480", + "d1c592": "44225a", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/2028.json b/public/images/pokemon/variant/exp/back/2028.json new file mode 100644 index 00000000000..19710fd1b41 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/2028.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "3a6b8c": "692a61", + "f1f1f4": "fffffc", + "b0e5f8": "fffed9", + "7dcff2": "f9e7b2", + "52b0cf": "e2877b", + "29397b": "3e1d4d", + "3c88b4": "966281", + "77a2bb": "d9746e", + "434f6f": "a14253", + "b7e3e7": "ffb59e", + "606060": "6f525d", + "bdbdcd": "d0c0b6", + "9994b6": "8d6e6f", + "000000": "000000" + }, + "2": { + "101010": "101010", + "3a6b8c": "3c2d74", + "f1f1f4": "e3f0ff", + "b0e5f8": "f8f5b0", + "7dcff2": "6edcaf", + "52b0cf": "57a5c5", + "29397b": "321846", + "3c88b4": "515fa9", + "77a2bb": "381d4d", + "434f6f": "171227", + "b7e3e7": "5f2e71", + "606060": "3a3a54", + "bdbdcd": "acb7d0", + "9994b6": "7d83a4", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/257-mega.json b/public/images/pokemon/variant/exp/back/257-mega.json new file mode 100644 index 00000000000..7f2925da1d9 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/257-mega.json @@ -0,0 +1,42 @@ +{ + "1": { + "62524a": "55607d", + "dedeb4": "f0fbff", + "948362": "8095b3", + "bdb494": "a8c7da", + "f6d562": "dafff0", + "832929": "9b422a", + "ff9a7f": "fff185", + "f0a010": "94f1d8", + "ee6262": "f7ca4b", + "000000": "000000", + "e55858": "51b5cd", + "bd4141": "da8923", + "fff188": "ecfff8", + "297bd5": "930808", + "614e47": "2c2a44", + "93827a": "574b6e", + "292929": "16607e", + "414141": "279e91" + }, + "2": { + "62524a": "5b143d", + "dedeb4": "bc474d", + "948362": "842446", + "bdb494": "a1304d", + "f6d562": "9d9bf3", + "832929": "9c7c70", + "ff9a7f": "fffce9", + "f0a010": "7747bf", + "ee6262": "fffae1", + "000000": "000000", + "e55858": "c6e6ff", + "bd4141": "d2bda7", + "fff188": "c6fffd", + "297bd5": "1f3061", + "614e47": "ad662b", + "93827a": "e6a653", + "292929": "373260", + "414141": "505386" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/4079.json b/public/images/pokemon/variant/exp/back/4079.json new file mode 100644 index 00000000000..5dd35eec151 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/4079.json @@ -0,0 +1,32 @@ +{ + "1": { + "de627b": "8f5345", + "ff8394": "bb694b", + "936d20": "ad937b", + "fefe3c": "ffeccb", + "caaa2c": "edc59e", + "ac4152": "613934", + "101010": "101010", + "7b2031": "452a29", + "8b5a18": "a84071", + "ffe6b4": "ff9eba", + "dea462": "e0799c", + "fcfcfc": "fcfcfc", + "d5cdcd": "d5cdcd" + }, + "2": { + "de627b": "c6aead", + "ff8394": "ecdcbe", + "936d20": "7b2c51", + "fefe3c": "d9736b", + "caaa2c": "963e59", + "ac4152": "846467", + "101010": "101010", + "7b2031": "503941", + "8b5a18": "a45c58", + "ffe6b4": "efc697", + "dea462": "cb8f75", + "fcfcfc": "fcfcfc", + "d5cdcd": "d5cdcd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/4080_2.json b/public/images/pokemon/variant/exp/back/4080_2.json new file mode 100644 index 00000000000..42437a2d2d8 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/4080_2.json @@ -0,0 +1,230 @@ +{ + "textures": [ + { + "image": "4080_2.png", + "format": "RGBA8888", + "size": { + "w": 173, + "h": 173 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 57 + }, + "frame": { + "x": 0, + "y": 0, + "w": 66, + "h": 57 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 57 + }, + "frame": { + "x": 66, + "y": 0, + "w": 66, + "h": 57 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 57 + }, + "frame": { + "x": 66, + "y": 0, + "w": 66, + "h": 57 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 57, + "w": 64, + "h": 58 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 57, + "w": 64, + "h": 58 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 61, + "h": 58 + }, + "frame": { + "x": 0, + "y": 115, + "w": 61, + "h": 58 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 61, + "h": 58 + }, + "frame": { + "x": 0, + "y": 115, + "w": 61, + "h": 58 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 59, + "h": 58 + }, + "frame": { + "x": 61, + "y": 115, + "w": 59, + "h": 58 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 59, + "h": 58 + }, + "frame": { + "x": 61, + "y": 115, + "w": 59, + "h": 58 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 57, + "h": 58 + }, + "frame": { + "x": 64, + "y": 57, + "w": 57, + "h": 58 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:66364c3fa8f967bd9310393d8a1b25e1:0e96af7d45da466b62eff36d92a3f121:015ff34e49c83f5df583f6ee4f397d44$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/4080_2.png b/public/images/pokemon/variant/exp/back/4080_2.png new file mode 100644 index 00000000000..988ac3f7834 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/4080_2.png differ diff --git a/public/images/pokemon/variant/exp/back/4080_3.json b/public/images/pokemon/variant/exp/back/4080_3.json new file mode 100644 index 00000000000..c0046d88efe --- /dev/null +++ b/public/images/pokemon/variant/exp/back/4080_3.json @@ -0,0 +1,230 @@ +{ + "textures": [ + { + "image": "4080_3.png", + "format": "RGBA8888", + "size": { + "w": 173, + "h": 173 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 57 + }, + "frame": { + "x": 0, + "y": 0, + "w": 66, + "h": 57 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 57 + }, + "frame": { + "x": 66, + "y": 0, + "w": 66, + "h": 57 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 57 + }, + "frame": { + "x": 66, + "y": 0, + "w": 66, + "h": 57 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 57, + "w": 64, + "h": 58 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 64, + "h": 58 + }, + "frame": { + "x": 0, + "y": 57, + "w": 64, + "h": 58 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 61, + "h": 58 + }, + "frame": { + "x": 0, + "y": 115, + "w": 61, + "h": 58 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 61, + "h": 58 + }, + "frame": { + "x": 0, + "y": 115, + "w": 61, + "h": 58 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 59, + "h": 58 + }, + "frame": { + "x": 61, + "y": 115, + "w": 59, + "h": 58 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 59, + "h": 58 + }, + "frame": { + "x": 61, + "y": 115, + "w": 59, + "h": 58 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 66, + "h": 58 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 57, + "h": 58 + }, + "frame": { + "x": 64, + "y": 57, + "w": 57, + "h": 58 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:66364c3fa8f967bd9310393d8a1b25e1:0e96af7d45da466b62eff36d92a3f121:015ff34e49c83f5df583f6ee4f397d44$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/4080_3.png b/public/images/pokemon/variant/exp/back/4080_3.png new file mode 100644 index 00000000000..0fb239266ec Binary files /dev/null and b/public/images/pokemon/variant/exp/back/4080_3.png differ diff --git a/public/images/pokemon/variant/exp/back/4199.json b/public/images/pokemon/variant/exp/back/4199.json new file mode 100644 index 00000000000..9b0e2810a2e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/4199.json @@ -0,0 +1,38 @@ +{ + "1": { + "493e66": "821d2a", + "101010": "101010", + "a191b5": "de504e", + "7a6a98": "ad3139", + "413668": "622344", + "654493": "7e3351", + "723f7c": "d0bca2", + "403568": "66222b", + "624493": "85363d", + "a565c0": "ffeccb", + "7b2645": "573531", + "d76792": "8f5345", + "f985aa": "bb694b", + "f8f8f8": "f8f8f8", + "c89a51": "a84254", + "eed583": "c75865" + }, + "2": { + "493e66": "2a6122", + "101010": "101010", + "a191b5": "b0dc72", + "7a6a98": "71ae48", + "413668": "1d4c46", + "654493": "37725b", + "723f7c": "ad4552", + "403568": "e6a572", + "624493": "ffedad", + "a565c0": "d9736b", + "7b2645": "856568", + "d76792": "c6aead", + "f985aa": "ecdcbe", + "f8f8f8": "f8f8f8", + "c89a51": "2a4948", + "eed583": "4b7569" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/4562.json b/public/images/pokemon/variant/exp/back/4562.json new file mode 100644 index 00000000000..9e8c1bee22e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/4562.json @@ -0,0 +1,26 @@ +{ + "1": { + "313131": "145555", + "525252": "257e6a", + "101010": "101010", + "672b82": "7e173e", + "ab38d1": "b0264c", + "371d3f": "371d3f", + "6f5c6b": "743949", + "e6ddde": "d6b8a0", + "927e8d": "a46361", + "c5b9bb": "c69981" + }, + "2": { + "313131": "69162c", + "525252": "90222b", + "101010": "101010", + "672b82": "57a0b9", + "ab38d1": "c2ffe2", + "371d3f": "371d3f", + "6f5c6b": "0a4340", + "e6ddde": "4fb66a", + "927e8d": "1f6455", + "c5b9bb": "298a61" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-blue_2.json b/public/images/pokemon/variant/exp/back/669-blue_2.json new file mode 100644 index 00000000000..d21786bf39c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-blue_2.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-blue_2.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d8cb14bfbbcaf842b87815db5bbbff6d:829e486a344c35c9d0eaf774e0857780:85cbd8c67625a9e5741e5c57eeadf2da$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-blue_2.png b/public/images/pokemon/variant/exp/back/669-blue_2.png new file mode 100644 index 00000000000..303e7005e86 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-blue_2.png differ diff --git a/public/images/pokemon/variant/exp/back/669-blue_3.json b/public/images/pokemon/variant/exp/back/669-blue_3.json new file mode 100644 index 00000000000..165b1fad339 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-blue_3.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-blue_3.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d8cb14bfbbcaf842b87815db5bbbff6d:829e486a344c35c9d0eaf774e0857780:85cbd8c67625a9e5741e5c57eeadf2da$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-blue_3.png b/public/images/pokemon/variant/exp/back/669-blue_3.png new file mode 100644 index 00000000000..fd0bc4299e9 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-blue_3.png differ diff --git a/public/images/pokemon/variant/exp/back/669-orange_2.json b/public/images/pokemon/variant/exp/back/669-orange_2.json new file mode 100644 index 00000000000..2105b500ad7 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-orange_2.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-orange_2.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b6b13c2062e46bc2993e1936e652ec55:eddd647f0ee69f1cebd0f5981a930bb4:0f1b4caba50b5b288825169e096a95d8$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-orange_2.png b/public/images/pokemon/variant/exp/back/669-orange_2.png new file mode 100644 index 00000000000..bc2fecc2169 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-orange_2.png differ diff --git a/public/images/pokemon/variant/exp/back/669-orange_3.json b/public/images/pokemon/variant/exp/back/669-orange_3.json new file mode 100644 index 00000000000..38dcceef00d --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-orange_3.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-orange_3.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b6b13c2062e46bc2993e1936e652ec55:eddd647f0ee69f1cebd0f5981a930bb4:0f1b4caba50b5b288825169e096a95d8$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-orange_3.png b/public/images/pokemon/variant/exp/back/669-orange_3.png new file mode 100644 index 00000000000..0e47ec26347 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-orange_3.png differ diff --git a/public/images/pokemon/variant/exp/back/669-red_2.json b/public/images/pokemon/variant/exp/back/669-red_2.json new file mode 100644 index 00000000000..6640a719bdb --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-red_2.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-red_2.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b7f2b5b6e5bdce0c57ba5100ca627f6f:0eb67c773d6ce4b69762520e9ef8321b:9f8ada9cf46c4e29f954b2eb815bc4e5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-red_2.png b/public/images/pokemon/variant/exp/back/669-red_2.png new file mode 100644 index 00000000000..32e67fc83b1 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-red_2.png differ diff --git a/public/images/pokemon/variant/exp/back/669-red_3.json b/public/images/pokemon/variant/exp/back/669-red_3.json new file mode 100644 index 00000000000..c6b67af63c0 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-red_3.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-red_3.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b7f2b5b6e5bdce0c57ba5100ca627f6f:0eb67c773d6ce4b69762520e9ef8321b:9f8ada9cf46c4e29f954b2eb815bc4e5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-red_3.png b/public/images/pokemon/variant/exp/back/669-red_3.png new file mode 100644 index 00000000000..964365c2d64 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-red_3.png differ diff --git a/public/images/pokemon/variant/exp/back/669-white_2.json b/public/images/pokemon/variant/exp/back/669-white_2.json new file mode 100644 index 00000000000..53c4cc4838f --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-white_2.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-white_2.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4a295db1c328b3cdd3f2aff88fd27f13:56c18dff2ed555a9751824c2df5c70ae:0a1947645b1b28bf52e913464569aa21$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-white_2.png b/public/images/pokemon/variant/exp/back/669-white_2.png new file mode 100644 index 00000000000..1adb148eaa4 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-white_2.png differ diff --git a/public/images/pokemon/variant/exp/back/669-white_3.json b/public/images/pokemon/variant/exp/back/669-white_3.json new file mode 100644 index 00000000000..c4169913114 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-white_3.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-white_3.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4a295db1c328b3cdd3f2aff88fd27f13:56c18dff2ed555a9751824c2df5c70ae:0a1947645b1b28bf52e913464569aa21$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-white_3.png b/public/images/pokemon/variant/exp/back/669-white_3.png new file mode 100644 index 00000000000..dfe0a2c8441 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-white_3.png differ diff --git a/public/images/pokemon/variant/exp/back/669-yellow_2.json b/public/images/pokemon/variant/exp/back/669-yellow_2.json new file mode 100644 index 00000000000..d91b847f9f7 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-yellow_2.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-yellow_2.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:54b272ba1f6ccda5cab18a5f768ed559:3e1b836cb5f4a89121da291caf524f4a:3b20c6e9fefe380b26ae05046de54595$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-yellow_2.png b/public/images/pokemon/variant/exp/back/669-yellow_2.png new file mode 100644 index 00000000000..aab9fbd4e81 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-yellow_2.png differ diff --git a/public/images/pokemon/variant/exp/back/669-yellow_3.json b/public/images/pokemon/variant/exp/back/669-yellow_3.json new file mode 100644 index 00000000000..7df5c91ae9a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/669-yellow_3.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "669-yellow_3.png", + "format": "RGBA8888", + "size": { + "w": 156, + "h": 156 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 47, + "h": 54 + }, + "frame": { + "x": 0, + "y": 54, + "w": 47, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 54 + }, + "frame": { + "x": 47, + "y": 0, + "w": 47, + "h": 54 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 53 + }, + "frame": { + "x": 47, + "y": 54, + "w": 47, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 47, + "h": 53 + }, + "frame": { + "x": 94, + "y": 0, + "w": 47, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 52 + }, + "frame": { + "x": 94, + "y": 53, + "w": 47, + "h": 52 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 47, + "h": 55 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 47, + "h": 51 + }, + "frame": { + "x": 94, + "y": 105, + "w": 47, + "h": 51 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:54b272ba1f6ccda5cab18a5f768ed559:3e1b836cb5f4a89121da291caf524f4a:3b20c6e9fefe380b26ae05046de54595$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/669-yellow_3.png b/public/images/pokemon/variant/exp/back/669-yellow_3.png new file mode 100644 index 00000000000..d5ae155327f Binary files /dev/null and b/public/images/pokemon/variant/exp/back/669-yellow_3.png differ diff --git a/public/images/pokemon/variant/exp/back/670-blue_2.json b/public/images/pokemon/variant/exp/back/670-blue_2.json new file mode 100644 index 00000000000..a13459bf491 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/670-blue_2.json @@ -0,0 +1,146 @@ +{ + "textures": [ + { + "image": "670-blue_2.png", + "format": "RGBA8888", + "size": { + "w": 130, + "h": 130 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 66 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 66 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 66 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 66 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 40, + "h": 65 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 65 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 38, + "h": 65 + }, + "frame": { + "x": 40, + "y": 65, + "w": 38, + "h": 65 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 39, + "h": 66 + }, + "frame": { + "x": 80, + "y": 0, + "w": 39, + "h": 66 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 39, + "h": 66 + }, + "frame": { + "x": 80, + "y": 0, + "w": 39, + "h": 66 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b82d0606814f151a19eee7e549a977a5:1f55a6b2e6d7f2794ada09e24566bce8:f28e65cb64de91b1773f7b4998e488a5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/670-blue_2.png b/public/images/pokemon/variant/exp/back/670-blue_2.png new file mode 100644 index 00000000000..c26ec8469e2 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/670-blue_2.png differ diff --git a/public/images/pokemon/variant/exp/back/670-blue_3.json b/public/images/pokemon/variant/exp/back/670-blue_3.json new file mode 100644 index 00000000000..4a288ad9288 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/670-blue_3.json @@ -0,0 +1,146 @@ +{ + "textures": [ + { + "image": "670-blue_3.png", + "format": "RGBA8888", + "size": { + "w": 130, + "h": 130 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 66 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 66 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 66 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 66 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 40, + "h": 65 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 65 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 38, + "h": 65 + }, + "frame": { + "x": 40, + "y": 65, + "w": 38, + "h": 65 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 39, + "h": 66 + }, + "frame": { + "x": 80, + "y": 0, + "w": 39, + "h": 66 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 39, + "h": 66 + }, + "frame": { + "x": 80, + "y": 0, + "w": 39, + "h": 66 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b82d0606814f151a19eee7e549a977a5:1f55a6b2e6d7f2794ada09e24566bce8:f28e65cb64de91b1773f7b4998e488a5$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/670-blue_3.png b/public/images/pokemon/variant/exp/back/670-blue_3.png new file mode 100644 index 00000000000..f725df5f1ab Binary files /dev/null and b/public/images/pokemon/variant/exp/back/670-blue_3.png differ diff --git a/public/images/pokemon/variant/exp/back/670-orange.json b/public/images/pokemon/variant/exp/back/670-orange.json new file mode 100644 index 00000000000..4cf657f0a43 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/670-orange.json @@ -0,0 +1,36 @@ +{ + "1": { + "7f6f1f": "5c0d0d", + "cfae4f": "a3382c", + "101010": "101010", + "875829": "5c2c09", + "d98d41": "aa571d", + "ffb568": "cd9231", + "faef69": "d25f2c", + "0d4d25": "094740", + "2a8639": "1d8057", + "208050": "e493a1", + "cfbfaf": "bfbfbf", + "706050": "595959", + "f8f7f9": "f8f7f9", + "50996f": "f2b4b4", + "205030": "aa2960" + }, + "2": { + "7f6f1f": "b1b1b1", + "cfae4f": "f8f8f4", + "101010": "101010", + "875829": "215510", + "d98d41": "739f1f", + "ffb568": "afcf4f", + "faef69": "6a6a80", + "0d4d25": "121c0d", + "2a8639": "3c403a", + "208050": "ea8c48", + "cfbfaf": "e3b1a6", + "706050": "73603f", + "f8f7f9": "fff1df", + "50996f": "f9d08d", + "205030": "952e0a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/670-red.json b/public/images/pokemon/variant/exp/back/670-red.json new file mode 100644 index 00000000000..d6f3f1bc99c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/670-red.json @@ -0,0 +1,36 @@ +{ + "1": { + "7f6f1f": "3e0547", + "cfae4f": "8e1653", + "101010": "101010", + "703040": "630a23", + "df4f4f": "a31f35", + "ef6f6f": "cd4a4a", + "faef69": "b9205f", + "0d4d25": "094740", + "2a8639": "1d8057", + "208050": "e493a1", + "cfbfaf": "bfbfbf", + "706050": "595959", + "f8f7f9": "f8f7f9", + "50996f": "f2b4b4", + "205030": "aa2960" + }, + "2": { + "7f6f1f": "b1b1b1", + "cfae4f": "f8f8f4", + "101010": "101010", + "703040": "215510", + "df4f4f": "739f1f", + "ef6f6f": "afcf4f", + "faef69": "6a6a80", + "0d4d25": "121c0d", + "2a8639": "3c403a", + "208050": "dc3543", + "cfbfaf": "dc818a", + "706050": "5c0c2e", + "f8f7f9": "ffd7db", + "50996f": "ec8a8a", + "205030": "801621" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/670-white.json b/public/images/pokemon/variant/exp/back/670-white.json new file mode 100644 index 00000000000..6c781f728dc --- /dev/null +++ b/public/images/pokemon/variant/exp/back/670-white.json @@ -0,0 +1,36 @@ +{ + "1": { + "7f6f1f": "110732", + "cfae4f": "3b374e", + "101010": "101010", + "878787": "1e1d2a", + "d9d9d9": "4c4b55", + "fdfdfd": "747478", + "faef69": "6a6a80", + "0d4d25": "094740", + "2a8639": "1d8057", + "208050": "e493a1", + "cfbfaf": "bfbfbf", + "706050": "595959", + "f8f7f9": "f8f7f9", + "50996f": "f2b4b4", + "205030": "aa2960" + }, + "2": { + "7f6f1f": "b1b1b1", + "cfae4f": "f8f8f4", + "101010": "101010", + "878787": "215510", + "d9d9d9": "739f1f", + "fdfdfd": "afcf4f", + "faef69": "6a6a80", + "0d4d25": "121c0d", + "2a8639": "3c403a", + "208050": "6d716f", + "cfbfaf": "c6c6c6", + "706050": "595959", + "f8f7f9": "f8f7f9", + "50996f": "a3a6a4", + "205030": "1c2d32" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/670-yellow.json b/public/images/pokemon/variant/exp/back/670-yellow.json new file mode 100644 index 00000000000..44f974da441 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/670-yellow.json @@ -0,0 +1,36 @@ +{ + "1": { + "7f6f1f": "06471f", + "cfae4f": "1a8021", + "101010": "101010", + "857c28": "064718", + "d8cb40": "6f950a", + "f9ec63": "abb830", + "faef69": "4fbf14", + "0d4d25": "094740", + "2a8639": "1d8057", + "208050": "e493a1", + "cfbfaf": "bfbfbf", + "706050": "595959", + "f8f7f9": "f8f7f9", + "50996f": "f2b4b4", + "205030": "aa2960" + }, + "2": { + "7f6f1f": "b1b1b1", + "cfae4f": "f8f8f4", + "101010": "101010", + "857c28": "215510", + "d8cb40": "739f1f", + "f9ec63": "afcf4f", + "faef69": "6a6a80", + "0d4d25": "121c0d", + "2a8639": "3c403a", + "208050": "f1d74b", + "cfbfaf": "e6d3a2", + "706050": "73603f", + "f8f7f9": "fffde0", + "50996f": "fffccf", + "205030": "955615" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/671-blue.json b/public/images/pokemon/variant/exp/back/671-blue.json new file mode 100644 index 00000000000..d439421802b --- /dev/null +++ b/public/images/pokemon/variant/exp/back/671-blue.json @@ -0,0 +1,40 @@ +{ + "1": { + "4a778a": "130540", + "7cc6c6": "291371", + "daf8f8": "69c9e3", + "141214": "141214", + "aaf2f2": "3827a3", + "466e82": "130540", + "3d9ccc": "2938a3", + "61c2f2": "3c54b8", + "1c5a4c": "aa1a58", + "247264": "dc5073", + "2c826c": "dc5073", + "3ca68c": "ff91a4", + "5c5a5c": "5c5a5c", + "bcbebc": "bcbebc", + "fcfafc": "fcfafc", + "245a4c": "aa1a58", + "1c362c": "1c362c" + }, + "2": { + "4a778a": "07230a", + "7cc6c6": "213225", + "daf8f8": "dfe3e1", + "141214": "141214", + "aaf2f2": "4d4e46", + "466e82": "0a320e", + "3d9ccc": "7f9f1f", + "61c2f2": "afcf4f", + "1c5a4c": "0d4a80", + "247264": "11738e", + "2c826c": "11738e", + "3ca68c": "25b1ab", + "5c5a5c": "32448e", + "bcbebc": "9fb6d4", + "fcfafc": "dff2ff", + "245a4c": "0d4a80", + "1c362c": "1c362c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/671-orange.json b/public/images/pokemon/variant/exp/back/671-orange.json new file mode 100644 index 00000000000..9a543e497f5 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/671-orange.json @@ -0,0 +1,40 @@ +{ + "1": { + "795941": "401d04", + "d2ab84": "631818", + "faeadb": "ffbc77", + "141214": "141214", + "ffd9b2": "a34b2c", + "785941": "401d04", + "d98d41": "954c17", + "feb266": "cd8e31", + "1c5a4c": "aa1a58", + "247264": "dc5073", + "2c826c": "dc5073", + "3ca68c": "ff91a4", + "5c5a5c": "5c5a5c", + "bcbebc": "bcbebc", + "fcfafc": "fcfafc", + "245a4c": "aa1a58", + "1c362c": "1c362c" + }, + "2": { + "795941": "07230a", + "d2ab84": "213225", + "faeadb": "dfe3e1", + "141214": "141214", + "ffd9b2": "4d4e46", + "785941": "0a320e", + "d98d41": "7f9f1f", + "feb266": "afcf4f", + "1c5a4c": "800707", + "247264": "b1380f", + "2c826c": "b1380f", + "3ca68c": "dc7226", + "5c5a5c": "5c0c2e", + "bcbebc": "f1a695", + "fcfafc": "fff1df", + "245a4c": "800707", + "1c362c": "1c362c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/671-red.json b/public/images/pokemon/variant/exp/back/671-red.json new file mode 100644 index 00000000000..46fe34c7d0c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/671-red.json @@ -0,0 +1,40 @@ +{ + "1": { + "643e5c": "390614", + "a46294": "4e0c38", + "fcb2cc": "ff90a2", + "141214": "141214", + "dc9ac4": "8e1a55", + "842e2c": "390614", + "dc4e4c": "95172c", + "fc7274": "c64040", + "1c5a4c": "aa1a58", + "247264": "dc5073", + "2c826c": "dc5073", + "3ca68c": "ff91a4", + "5c5a5c": "5c5a5c", + "bcbebc": "bcbebc", + "fcfafc": "fcfafc", + "245a4c": "aa1a58", + "1c362c": "1c362c" + }, + "2": { + "643e5c": "07230a", + "a46294": "213225", + "fcb2cc": "dfe3e1", + "141214": "141214", + "dc9ac4": "4d4e46", + "842e2c": "0a320e", + "dc4e4c": "7f9f1f", + "fc7274": "afcf4f", + "1c5a4c": "710846", + "247264": "a31e40", + "2c826c": "a31e40", + "3ca68c": "dc3543", + "5c5a5c": "5c0c2e", + "bcbebc": "dca4b2", + "fcfafc": "ffd7db", + "245a4c": "710846", + "1c362c": "1c362c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/671-white.json b/public/images/pokemon/variant/exp/back/671-white.json new file mode 100644 index 00000000000..a4953029afe --- /dev/null +++ b/public/images/pokemon/variant/exp/back/671-white.json @@ -0,0 +1,40 @@ +{ + "1": { + "868686": "171a1c", + "b4b4b4": "231e32", + "f7bcc6": "c2c1c6", + "141214": "141214", + "f2f2f2": "353340", + "878787": "171a1c", + "d9d9d9": "3c3b47", + "fefefe": "60616a", + "1c5a4c": "aa1a58", + "247264": "dc5073", + "2c826c": "dc5073", + "3ca68c": "ff91a4", + "5c5a5c": "5c5a5c", + "bcbebc": "bcbebc", + "fcfafc": "fcfafc", + "245a4c": "aa1a58", + "1c362c": "1c362c" + }, + "2": { + "868686": "07230a", + "b4b4b4": "213225", + "f7bcc6": "dfe3e1", + "141214": "141214", + "f2f2f2": "4d4e46", + "878787": "0a320e", + "d9d9d9": "7f9f1f", + "fefefe": "afcf4f", + "1c5a4c": "1c2d32", + "247264": "3c4747", + "2c826c": "3c4747", + "3ca68c": "6d716f", + "5c5a5c": "595959", + "bcbebc": "bfbfbf", + "fcfafc": "f9f9f9", + "245a4c": "1c2d32", + "1c362c": "1c362c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/671-yellow.json b/public/images/pokemon/variant/exp/back/671-yellow.json new file mode 100644 index 00000000000..81a74ac231e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/671-yellow.json @@ -0,0 +1,40 @@ +{ + "1": { + "7c7755": "074034", + "d2b98b": "227850", + "facea2": "ffe593", + "141214": "141214", + "feeabf": "22b14a", + "76724b": "074034", + "d9cc41": "789c16", + "fef266": "b0bf2b", + "1c5a4c": "aa1a58", + "247264": "dc5073", + "2c826c": "dc5073", + "3ca68c": "ff91a4", + "5c5a5c": "5c5a5c", + "bcbebc": "bcbebc", + "fcfafc": "fcfafc", + "245a4c": "aa1a58", + "1c362c": "1c362c" + }, + "2": { + "7c7755": "07230a", + "d2b98b": "213225", + "facea2": "dfe3e1", + "141214": "141214", + "feeabf": "4d4e46", + "76724b": "0a320e", + "d9cc41": "7f9f1f", + "fef266": "afcf4f", + "1c5a4c": "8e4d0a", + "247264": "b18018", + "2c826c": "b18018", + "3ca68c": "e3c733", + "5c5a5c": "8e4d0a", + "bcbebc": "d4c18f", + "fcfafc": "fffde0", + "245a4c": "8e4d0a", + "1c362c": "1c362c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/672.json b/public/images/pokemon/variant/exp/back/672.json index 8ee91469917..7282ef5e693 100644 --- a/public/images/pokemon/variant/exp/back/672.json +++ b/public/images/pokemon/variant/exp/back/672.json @@ -1,4 +1,20 @@ { + "1": { + "3d3128": "69112a", + "000000": "000000", + "67615b": "9e2c3d", + "615140": "89431b", + "7e6d5a": "b3743e", + "554538": "642509", + "efeded": "f8e2b7", + "beb8b6": "e3a378", + "0e5d58": "8c6859", + "09a77c": "f8f0e2", + "0d8374": "d2af94", + "c16a3f": "321512", + "c6b379": "552d30", + "a8905c": "4b2525" + }, "2": { "3d3128": "161526", "000000": "000000", @@ -15,4 +31,4 @@ "c6b379": "9f5f9b", "a8905c": "854d87" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/672_2.png b/public/images/pokemon/variant/exp/back/672_2.png deleted file mode 100644 index a51b8cba11f..00000000000 Binary files a/public/images/pokemon/variant/exp/back/672_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/673.json b/public/images/pokemon/variant/exp/back/673.json index be9d3af3965..7e5bc69976d 100644 --- a/public/images/pokemon/variant/exp/back/673.json +++ b/public/images/pokemon/variant/exp/back/673.json @@ -1,4 +1,20 @@ { + "1": { + "3d3128": "5a0e24", + "000000": "000000", + "554538": "471405", + "67615b": "8f2837", + "0d835a": "d2af94", + "0e5d58": "8c6352", + "74593a": "61240a", + "09a766": "f8f0e2", + "cabfbb": "e3a378", + "efeded": "f8e2b7", + "a8905c": "9e4e21", + "c6b379": "ce8648", + "ae492a": "321512", + "c16a3f": "552d30" + }, "2": { "3d3128": "121123", "000000": "000000", @@ -15,4 +31,4 @@ "ae492a": "612c6b", "c16a3f": "9f5f9b" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/673_2.png b/public/images/pokemon/variant/exp/back/673_2.png deleted file mode 100644 index be4e73acce4..00000000000 Binary files a/public/images/pokemon/variant/exp/back/673_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/677.json b/public/images/pokemon/variant/exp/back/677.json new file mode 100644 index 00000000000..9403c5c6e8e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/677.json @@ -0,0 +1,22 @@ +{ + "1": { + "565581": "470d28", + "8988b6": "943b5d", + "999fdc": "bd5c81", + "000000": "000000", + "c0c3e5": "e2dfcb", + "e8e8ef": "f1f0e4", + "8871a2": "601339", + "cad0d1": "f1f0e4" + }, + "2": { + "565581": "193437", + "8988b6": "426b62", + "999fdc": "6ba78a", + "000000": "000000", + "c0c3e5": "5f3656", + "e8e8ef": "67415e", + "8871a2": "243e41", + "cad0d1": "67415e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/678-female.json b/public/images/pokemon/variant/exp/back/678-female.json new file mode 100644 index 00000000000..6639b1e6674 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/678-female.json @@ -0,0 +1,20 @@ +{ + "1": { + "b2afb6": "d5c49f", + "fbfcfe": "f8f5cd", + "737373": "947859", + "334575": "76264d", + "1e2945": "47182e", + "375794": "a5346b", + "000000": "000000" + }, + "2": { + "b2afb6": "613d5a", + "fbfcfe": "855577", + "737373": "3a1633", + "334575": "47946c", + "1e2945": "1d3f33", + "375794": "7bd38d", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/678.json b/public/images/pokemon/variant/exp/back/678.json new file mode 100644 index 00000000000..e194c472468 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/678.json @@ -0,0 +1,20 @@ +{ + "1": { + "101010": "101010", + "bfbfbf": "d5c49f", + "f8f8f8": "f8f5cd", + "737373": "947859", + "264480": "76264d", + "365fb3": "a5346b", + "17294d": "47182e" + }, + "2": { + "101010": "101010", + "bfbfbf": "613d5a", + "f8f8f8": "855577", + "737373": "3a1633", + "264480": "47946c", + "365fb3": "7bd38d", + "17294d": "1d3f33" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/698.json b/public/images/pokemon/variant/exp/back/698.json new file mode 100644 index 00000000000..af193c3bc0c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/698.json @@ -0,0 +1,38 @@ +{ + "1": { + "b3747e": "4b7465", + "ffbfca": "43bf8d", + "fff2b2": "9bffa9", + "537180": "b04f4b", + "a6e1ff": "efab87", + "101010": "101010", + "85b4cc": "cf755d", + "217aa6": "7f99e1", + "30b2f2": "b5dcff", + "fdfdfd": "fdfdfd", + "c0c0c0": "d7cca0", + "cacaca": "cacaca", + "cbaa84": "44827c", + "dcffb2": "8eeab9", + "eeffbf": "cdffb5", + "b7ffb2": "72d8ce" + }, + "2": { + "b3747e": "c452a6", + "ffbfca": "faccff", + "fff2b2": "eb88b9", + "537180": "392d65", + "a6e1ff": "936daa", + "101010": "101010", + "85b4cc": "654a8a", + "217aa6": "efaa51", + "30b2f2": "ffd169", + "fdfdfd": "fdfdfd", + "c0c0c0": "282747", + "cacaca": "cacaca", + "cbaa84": "cc78db", + "dcffb2": "d7bbf4", + "eeffbf": "ed9ff2", + "b7ffb2": "dceeff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/699_2.json b/public/images/pokemon/variant/exp/back/699_2.json new file mode 100644 index 00000000000..6362510c1cb --- /dev/null +++ b/public/images/pokemon/variant/exp/back/699_2.json @@ -0,0 +1,230 @@ +{ + "textures": [ + { + "image": "699_2.png", + "format": "RGBA8888", + "size": { + "w": 233, + "h": 233 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 78, + "h": 91 + }, + "frame": { + "x": 0, + "y": 0, + "w": 78, + "h": 91 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 78, + "h": 91 + }, + "frame": { + "x": 0, + "y": 0, + "w": 78, + "h": 91 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 80, + "h": 87 + }, + "frame": { + "x": 0, + "y": 91, + "w": 80, + "h": 87 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 80, + "h": 87 + }, + "frame": { + "x": 0, + "y": 91, + "w": 80, + "h": 87 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 78, + "h": 89 + }, + "frame": { + "x": 78, + "y": 0, + "w": 78, + "h": 89 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 78, + "h": 89 + }, + "frame": { + "x": 78, + "y": 0, + "w": 78, + "h": 89 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 91 + }, + "frame": { + "x": 156, + "y": 0, + "w": 76, + "h": 91 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 91 + }, + "frame": { + "x": 156, + "y": 0, + "w": 76, + "h": 91 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 73, + "h": 91 + }, + "frame": { + "x": 80, + "y": 89, + "w": 73, + "h": 91 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 80, + "h": 85 + }, + "frame": { + "x": 153, + "y": 91, + "w": 80, + "h": 85 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:3e16ce6a13e2d58d014c062c712bf2af:04d58b511d4f12886597276802759575:538306c76155ad76f42bfb469a98a35b$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/699_2.png b/public/images/pokemon/variant/exp/back/699_2.png new file mode 100644 index 00000000000..249930be50f Binary files /dev/null and b/public/images/pokemon/variant/exp/back/699_2.png differ diff --git a/public/images/pokemon/variant/exp/back/699_3.json b/public/images/pokemon/variant/exp/back/699_3.json new file mode 100644 index 00000000000..b96d0043bd6 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/699_3.json @@ -0,0 +1,230 @@ +{ + "textures": [ + { + "image": "699_3.png", + "format": "RGBA8888", + "size": { + "w": 233, + "h": 233 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 78, + "h": 91 + }, + "frame": { + "x": 0, + "y": 0, + "w": 78, + "h": 91 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 78, + "h": 91 + }, + "frame": { + "x": 0, + "y": 0, + "w": 78, + "h": 91 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 80, + "h": 87 + }, + "frame": { + "x": 0, + "y": 91, + "w": 80, + "h": 87 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 80, + "h": 87 + }, + "frame": { + "x": 0, + "y": 91, + "w": 80, + "h": 87 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 78, + "h": 89 + }, + "frame": { + "x": 78, + "y": 0, + "w": 78, + "h": 89 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 78, + "h": 89 + }, + "frame": { + "x": 78, + "y": 0, + "w": 78, + "h": 89 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 91 + }, + "frame": { + "x": 156, + "y": 0, + "w": 76, + "h": 91 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 76, + "h": 91 + }, + "frame": { + "x": 156, + "y": 0, + "w": 76, + "h": 91 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 73, + "h": 91 + }, + "frame": { + "x": 80, + "y": 89, + "w": 73, + "h": 91 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 88, + "h": 91 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 80, + "h": 85 + }, + "frame": { + "x": 153, + "y": 91, + "w": 80, + "h": 85 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:3e16ce6a13e2d58d014c062c712bf2af:04d58b511d4f12886597276802759575:538306c76155ad76f42bfb469a98a35b$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/699_3.png b/public/images/pokemon/variant/exp/back/699_3.png new file mode 100644 index 00000000000..f5082d58284 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/699_3.png differ diff --git a/public/images/pokemon/variant/exp/back/702.json b/public/images/pokemon/variant/exp/back/702.json new file mode 100644 index 00000000000..a5bb32bb790 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/702.json @@ -0,0 +1,22 @@ +{ + "1": { + "101010": "101010", + "4d4d4d": "6789b3", + "262626": "2a3b5e", + "735c2e": "a53c42", + "f2c261": "ffd3b6", + "bf994c": "e49f84", + "997a3d": "c9685f", + "000000": "000000" + }, + "2": { + "101010": "101010", + "4d4d4d": "197870", + "262626": "072d38", + "735c2e": "1e0e27", + "f2c261": "5f3662", + "bf994c": "432249", + "997a3d": "2d1533", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/703.json b/public/images/pokemon/variant/exp/back/703.json new file mode 100644 index 00000000000..376abd466d2 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/703.json @@ -0,0 +1,28 @@ +{ + "1": { + "306090": "c35b2a", + "88aacc": "e67c37", + "fefefe": "fefefe", + "535763": "292638", + "a3a7b3": "4d496b", + "737783": "37344e", + "bbddff": "ffa633", + "101010": "101010", + "5f6060": "e6ac60", + "bfbbbb": "ffd3a1", + "fcfefe": "ffeed6" + }, + "2": { + "306090": "a03c69", + "88aacc": "e25493", + "fefefe": "ffe2ee", + "535763": "976ba9", + "a3a7b3": "e4cdf9", + "737783": "cca1db", + "bbddff": "f591bd", + "101010": "101010", + "5f6060": "5a3d84", + "bfbbbb": "8359a7", + "fcfefe": "a473bf" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/80-mega.json b/public/images/pokemon/variant/exp/back/80-mega.json new file mode 100644 index 00000000000..1506d6c7c6b --- /dev/null +++ b/public/images/pokemon/variant/exp/back/80-mega.json @@ -0,0 +1,30 @@ +{ + "1": { + "783030": "3f2729", + "181818": "181818", + "f89090": "885345", + "e06878": "5b3332", + "deded5": "deded5", + "f8f8f8": "f8f8f8", + "805820": "9f675f", + "e8d080": "e0b69d", + "505058": "7c5b40", + "c8a060": "d49983", + "889090": "bf9562", + "b0b8b8": "f0d090" + }, + "2": { + "783030": "c08746", + "181818": "181818", + "f89090": "eebd6a", + "e06878": "de9048", + "deded5": "deded5", + "f8f8f8": "f8f8f8", + "805820": "69080f", + "e8d080": "d16b34", + "505058": "192b32", + "c8a060": "b34d2e", + "889090": "2a4947", + "b0b8b8": "4b7567" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/803.json b/public/images/pokemon/variant/exp/back/803.json new file mode 100644 index 00000000000..215130ac568 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/803.json @@ -0,0 +1,26 @@ +{ + "1": { + "78757f": "449e93", + "101010": "101010", + "ccc0d8": "e3ffec", + "98295e": "27579e", + "d13d8f": "3492b9", + "ff6ccc": "54cbdc", + "2c1a42": "1d1638", + "463772": "211c49", + "614497": "2e2e69", + "8856bd": "2e4b84" + }, + "2": { + "78757f": "cd9b85", + "101010": "101010", + "ccc0d8": "ffefe0", + "98295e": "a12f63", + "d13d8f": "d6487a", + "ff6ccc": "ff778d", + "2c1a42": "08172f", + "463772": "0d293d", + "614497": "103a47", + "8856bd": "095654" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/804.json b/public/images/pokemon/variant/exp/back/804.json new file mode 100644 index 00000000000..b41cb813bda --- /dev/null +++ b/public/images/pokemon/variant/exp/back/804.json @@ -0,0 +1,36 @@ +{ + "1": { + "331952": "18183d", + "533078": "152149", + "b69aef": "359faf", + "9d3478": "c74736", + "6b3357": "81262d", + "101010": "101010", + "ec74d8": "e88354", + "583f87": "212149", + "987bcc": "22658d", + "cb52b7": "cd4935", + "814eba": "284173", + "3f404b": "1c3f4c", + "7a7882": "2b5d67", + "9996a9": "8edfd5", + "e0d9e8": "e3ffec" + }, + "2": { + "331952": "042235", + "533078": "0e3346", + "b69aef": "68b363", + "9d3478": "dcbb94", + "6b3357": "7e4e3d", + "101010": "101010", + "ec74d8": "fff8cc", + "583f87": "103a47", + "987bcc": "2d794e", + "cb52b7": "b9a582", + "814eba": "095654", + "3f404b": "430231", + "7a7882": "580736", + "9996a9": "96234e", + "e0d9e8": "e54558" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/867.json b/public/images/pokemon/variant/exp/back/867.json new file mode 100644 index 00000000000..124ea0d4f66 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/867.json @@ -0,0 +1,20 @@ +{ + "1": { + "393941": "69d9bf", + "101010": "101010", + "927e8d": "a46361", + "d9d0d1": "d6b8a0", + "c5b9bb": "c69981", + "816968": "743949", + "463c3f": "5a2940" + }, + "2": { + "393941": "a4222c", + "101010": "101010", + "927e8d": "1f6455", + "d9d0d1": "4fb66a", + "c5b9bb": "298a61", + "816968": "0a4340", + "463c3f": "052b2f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/880.json b/public/images/pokemon/variant/exp/back/880.json new file mode 100644 index 00000000000..1db9d4f60a3 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/880.json @@ -0,0 +1,34 @@ +{ + "1": { + "8f261b": "1b1829", + "101010": "101010", + "ff8d9f": "6a98c4", + "ed4e76": "312f47", + "975e17": "5b0610", + "e39e1e": "9c1430", + "ffff84": "ee8563", + "ead900": "c6362b", + "005e44": "564e6e", + "003319": "26233c", + "058165": "3f3a58", + "39ad5a": "a2b5c8", + "008567": "757798", + "025c43": "26253e" + }, + "2": { + "8f261b": "8f261b", + "101010": "101010", + "ff8d9f": "e28854", + "ed4e76": "ca5939", + "975e17": "211b3d", + "e39e1e": "35365e", + "ffff84": "dceeeb", + "ead900": "636287", + "005e44": "f1b45f", + "003319": "671d18", + "058165": "9b4c1d", + "39ad5a": "ce734d", + "008567": "fff491", + "025c43": "702c11" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/881.json b/public/images/pokemon/variant/exp/back/881.json new file mode 100644 index 00000000000..3efad4efe60 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/881.json @@ -0,0 +1,42 @@ +{ + "1": { + "e39e1e": "9c1430", + "975e17": "5b0610", + "ffff84": "ee8563", + "ead900": "c6362b", + "101010": "101010", + "2abbfc": "ceb16f", + "09354d": "271014", + "9ab8ba": "cea5b9", + "edf3f2": "faebc8", + "5c7996": "a57185", + "07305f": "4d254a", + "085d94": "714363", + "0981ae": "45242e", + "27aed6": "6e4145", + "072241": "301636", + "097da8": "43222c", + "0a3463": "492146", + "23abd3": "b59795" + }, + "2": { + "e39e1e": "35365e", + "975e17": "211b3d", + "ffff84": "dceeeb", + "ead900": "636287", + "101010": "101010", + "2abbfc": "26c248", + "09354d": "09354d", + "9ab8ba": "a3c465", + "edf3f2": "fcffe4", + "5c7996": "50a751", + "07305f": "7b1a5e", + "085d94": "ad3b6c", + "0981ae": "205e5d", + "27aed6": "2d7b65", + "072241": "5d0e54", + "097da8": "185453", + "0a3463": "721957", + "23abd3": "d49da9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/882.json b/public/images/pokemon/variant/exp/back/882.json new file mode 100644 index 00000000000..bfaf844e6ed --- /dev/null +++ b/public/images/pokemon/variant/exp/back/882.json @@ -0,0 +1,34 @@ +{ + "1": { + "434c63": "771922", + "83bbed": "eaa561", + "777ebd": "cc6235", + "101010": "101010", + "003319": "1a182b", + "005e44": "564e6e", + "8f261b": "1d2238", + "048366": "977c7c", + "ff3c6d": "312f47", + "39ad5a": "b5a49e", + "d5657b": "4b729f", + "ff8d9f": "6a98c4", + "edf3f2": "faebc8", + "008567": "757798" + }, + "2": { + "434c63": "450940", + "83bbed": "8c1f45", + "777ebd": "6c1046", + "101010": "101010", + "003319": "cc7d3b", + "005e44": "f1b45f", + "8f261b": "215b68", + "048366": "b24835", + "ff3c6d": "ca5939", + "39ad5a": "ce734d", + "d5657b": "308a86", + "ff8d9f": "63bb8b", + "edf3f2": "fbecff", + "008567": "fff491" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/883.json b/public/images/pokemon/variant/exp/back/883.json new file mode 100644 index 00000000000..3fb71aaebc6 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/883.json @@ -0,0 +1,32 @@ +{ + "1": { + "434c63": "3a151c", + "ffffff": "ffffff", + "83bbed": "eaa561", + "172459": "771922", + "101010": "101010", + "777ebd": "cc6235", + "5c7996": "8c6060", + "9ab8ba": "cea5b9", + "edf3f2": "faebc8", + "09354d": "2f1f1a", + "085d94": "714363", + "0981ae": "45242e", + "27aed6": "6e4145" + }, + "2": { + "434c63": "450940", + "ffffff": "ffffff", + "83bbed": "8c1f45", + "172459": "320432", + "101010": "101010", + "777ebd": "6c1046", + "5c7996": "50a751", + "9ab8ba": "a3c465", + "edf3f2": "fcffe4", + "09354d": "2f1a20", + "085d94": "ad3b6c", + "0981ae": "205e5d", + "27aed6": "2d7b65" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/888-crowned.json b/public/images/pokemon/variant/exp/back/888-crowned.json new file mode 100644 index 00000000000..e9fdeccc8f5 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/888-crowned.json @@ -0,0 +1,46 @@ +{ + "1": { + "8f4e2f": "2f4567", + "d79a53": "5a829b", + "101010": "101010", + "111111": "111111", + "f2db8a": "a1c9cd", + "3471b4": "b74323", + "2d4377": "5c1a1d", + "4999da": "ec813b", + "be3c45": "224d42", + "9d6862": "a85f49", + "ffffff": "ffffff", + "f45353": "448b48", + "d3a79a": "da9772", + "fae2c0": "fff8cd", + "93262f": "0d2729", + "fff8a9": "c6e5e3", + "454754": "454754", + "121212": "121212", + "3f3736": "3f3736", + "131313": "131313" + }, + "2": { + "8f4e2f": "692e47", + "d79a53": "964c5c", + "101010": "101010", + "111111": "111111", + "f2db8a": "c4826b", + "3471b4": "9fa7d0", + "2d4377": "615c7e", + "4999da": "e6ecff", + "be3c45": "6c1d59", + "9d6862": "1c2238", + "ffffff": "ffffff", + "f45353": "902d57", + "d3a79a": "243149", + "fae2c0": "3d5b72", + "93262f": "431042", + "fff8a9": "e5b792", + "454754": "454754", + "121212": "121212", + "3f3736": "3f3736", + "131313": "131313" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/888.json b/public/images/pokemon/variant/exp/back/888.json new file mode 100644 index 00000000000..84bab51307e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/888.json @@ -0,0 +1,28 @@ +{ + "1": { + "2d4377": "5c1a1d", + "4999da": "ec813b", + "3471b4": "b74323", + "080808": "080808", + "93262f": "0d2729", + "be3c45": "224d42", + "f45353": "448b48", + "fae2c0": "fff8cd", + "d3a79a": "da9772", + "34313e": "32171f", + "9d6862": "a85f49" + }, + "2": { + "2d4377": "615c7e", + "4999da": "e6ecff", + "3471b4": "9fa7d0", + "080808": "080808", + "93262f": "431042", + "be3c45": "6c1d59", + "f45353": "902d57", + "fae2c0": "3d5b72", + "d3a79a": "243149", + "34313e": "1a1829", + "9d6862": "1c2238" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/889-crowned.json b/public/images/pokemon/variant/exp/back/889-crowned.json new file mode 100644 index 00000000000..cd69c495fff --- /dev/null +++ b/public/images/pokemon/variant/exp/back/889-crowned.json @@ -0,0 +1,34 @@ +{ + "1": { + "2d2f7b": "102c2c", + "080808": "080808", + "396dce": "70a757", + "2d48a8": "3c6959", + "8f4e2f": "2f4567", + "f2db8a": "a1c9cd", + "d79a53": "5a829b", + "eb363a": "614378", + "fffccc": "d3eeea", + "731a27": "1c163d", + "ae2836": "422b61", + "8887a8": "d69f97", + "c2c3cf": "ffe0cc", + "34313e": "19142f" + }, + "2": { + "2d2f7b": "244e61", + "080808": "080808", + "396dce": "6fc7c1", + "2d48a8": "4797a4", + "8f4e2f": "692e47", + "f2db8a": "c4826b", + "d79a53": "964c5c", + "eb363a": "e6ecff", + "fffccc": "e5b885", + "731a27": "615c7e", + "ae2836": "9fa7d0", + "8887a8": "442e49", + "c2c3cf": "694f69", + "34313e": "22192c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/889.json b/public/images/pokemon/variant/exp/back/889.json new file mode 100644 index 00000000000..8d1334c6172 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/889.json @@ -0,0 +1,28 @@ +{ + "1": { + "396dce": "70a757", + "2d2f7b": "102c2c", + "2d48a8": "3c6959", + "f2db8a": "a1c9cd", + "080808": "080808", + "731a27": "1c163d", + "eb363a": "614378", + "ae2836": "422b61", + "c2c3cf": "ffe0cc", + "8887a8": "d69f97", + "34313e": "19142f" + }, + "2": { + "396dce": "6fc7c1", + "2d2f7b": "244e61", + "2d48a8": "4797a4", + "f2db8a": "c4826b", + "080808": "080808", + "731a27": "615c7e", + "eb363a": "e6ecff", + "ae2836": "9fa7d0", + "c2c3cf": "694f69", + "8887a8": "442e49", + "34313e": "22192c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/912.json b/public/images/pokemon/variant/exp/back/912.json new file mode 100644 index 00000000000..fb1f20998dd --- /dev/null +++ b/public/images/pokemon/variant/exp/back/912.json @@ -0,0 +1,30 @@ +{ + "1": { + "1f5978": "8c3b14", + "84d7ff": "f7ca7b", + "2fbee8": "e69c51", + "060606": "060606", + "3686b1": "d96536", + "ffffff": "ffe3b0", + "5a82a1": "975432", + "684b27": "3b2e28", + "ffdb1c": "868382", + "baae27": "5b5450", + "a9c7e3": "d79f63", + "cee2f0": "ebc698" + }, + "2": { + "1f5978": "0a3025", + "84d7ff": "58d299", + "2fbee8": "33b37e", + "060606": "060606", + "3686b1": "1c7962", + "ffffff": "6767e3", + "5a82a1": "2d185d", + "684b27": "601a0d", + "ffdb1c": "f49651", + "baae27": "bb602f", + "a9c7e3": "5137a0", + "cee2f0": "615cd9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/913.json b/public/images/pokemon/variant/exp/back/913.json new file mode 100644 index 00000000000..e7ab41d58fc --- /dev/null +++ b/public/images/pokemon/variant/exp/back/913.json @@ -0,0 +1,36 @@ +{ + "1": { + "2357aa": "821e24", + "2782d1": "bd3c24", + "2cb9e8": "f77122", + "13325e": "3f050e", + "174b6a": "642b0f", + "30b0ba": "f77122", + "0f0f0f": "0f0f0f", + "916a44": "3b2e28", + "ddc271": "5b5450", + "d0c4d3": "d79f63", + "555268": "6a291a", + "ffffff": "ffe3b0", + "92879b": "a0653a", + "4ad2e6": "ffb75c", + "fff36b": "868382" + }, + "2": { + "2357aa": "0f4537", + "2782d1": "1d6c42", + "2cb9e8": "3a9d5d", + "13325e": "072a2b", + "174b6a": "541222", + "30b0ba": "a22f49", + "0f0f0f": "0f0f0f", + "916a44": "4b251b", + "ddc271": "c76740", + "d0c4d3": "3b188e", + "555268": "120e4a", + "ffffff": "4b40be", + "92879b": "3c1470", + "4ad2e6": "f15e76", + "fff36b": "ffa564" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/962_3.json b/public/images/pokemon/variant/exp/back/914_2.json similarity index 52% rename from public/images/pokemon/variant/exp/back/962_3.json rename to public/images/pokemon/variant/exp/back/914_2.json index 397453d3274..9742433b042 100644 --- a/public/images/pokemon/variant/exp/back/962_3.json +++ b/public/images/pokemon/variant/exp/back/914_2.json @@ -1,33 +1,33 @@ { "textures": [ { - "image": "962_3.png", + "image": "914_2.png", "format": "RGBA8888", "size": { - "w": 224, - "h": 224 + "w": 178, + "h": 178 }, "scale": 1, "frames": [ { - "filename": "0003.png", + "filename": "0001.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 101, - "h": 97 + "w": 70, + "h": 89 }, "spriteSourceSize": { "x": 1, "y": 0, - "w": 82, - "h": 86 + "w": 69, + "h": 89 }, "frame": { "x": 0, "y": 0, - "w": 82, - "h": 86 + "w": 69, + "h": 89 } }, { @@ -35,83 +35,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 101, - "h": 97 + "w": 70, + "h": 89 }, "spriteSourceSize": { "x": 1, - "y": 4, - "w": 87, - "h": 79 - }, - "frame": { - "x": 0, - "y": 86, - "w": 87, - "h": 79 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 92, - "h": 74 - }, - "frame": { - "x": 82, "y": 0, - "w": 92, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 38, - "w": 91, - "h": 59 + "w": 69, + "h": 89 }, "frame": { "x": 0, - "y": 165, - "w": 91, - "h": 59 + "y": 0, + "w": 69, + "h": 89 } }, { - "filename": "0007.png", + "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 101, - "h": 97 + "w": 70, + "h": 89 }, "spriteSourceSize": { - "x": 1, - "y": 36, - "w": 91, - "h": 60 + "x": 4, + "y": 0, + "w": 66, + "h": 89 }, "frame": { - "x": 87, - "y": 74, - "w": 91, - "h": 60 + "x": 0, + "y": 89, + "w": 66, + "h": 89 } }, { @@ -119,20 +77,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 101, - "h": 97 + "w": 70, + "h": 89 }, "spriteSourceSize": { - "x": 0, - "y": 41, - "w": 101, - "h": 41 + "x": 4, + "y": 0, + "w": 66, + "h": 89 }, "frame": { - "x": 91, - "y": 134, - "w": 101, - "h": 41 + "x": 0, + "y": 89, + "w": 66, + "h": 89 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 66, + "h": 89 + }, + "frame": { + "x": 66, + "y": 89, + "w": 66, + "h": 89 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 66, + "h": 89 + }, + "frame": { + "x": 66, + "y": 89, + "w": 66, + "h": 89 } }, { @@ -140,20 +140,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 101, - "h": 97 + "w": 70, + "h": 89 }, "spriteSourceSize": { "x": 0, - "y": 40, - "w": 100, - "h": 38 + "y": 1, + "w": 70, + "h": 88 }, "frame": { - "x": 91, - "y": 175, - "w": 100, - "h": 38 + "x": 69, + "y": 0, + "w": 70, + "h": 88 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 70, + "h": 88 + }, + "frame": { + "x": 69, + "y": 0, + "w": 70, + "h": 88 } } ] @@ -162,6 +183,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ee54d59ae73a6775b5d1d9b10f273445:828dff0b1dc45966e927a7a1419412f2:1e70eb3d02dd5c47565da4b5d26e2400$" + "smartupdate": "$TexturePacker:SmartUpdate:b0dfeeca618e8d5bccee4ca0838c0bbc:653e6a548e994ab9fc503a6868609517:a123ce346d124b2d12481db361d1b25b$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/914_2.png b/public/images/pokemon/variant/exp/back/914_2.png new file mode 100644 index 00000000000..5dee5c12f76 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/914_2.png differ diff --git a/public/images/pokemon/variant/exp/back/914_3.json b/public/images/pokemon/variant/exp/back/914_3.json new file mode 100644 index 00000000000..de89232f27c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/914_3.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "914_3.png", + "format": "RGBA8888", + "size": { + "w": 178, + "h": 178 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 89 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 89 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 89 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 89 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 66, + "h": 89 + }, + "frame": { + "x": 0, + "y": 89, + "w": 66, + "h": 89 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 66, + "h": 89 + }, + "frame": { + "x": 0, + "y": 89, + "w": 66, + "h": 89 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 66, + "h": 89 + }, + "frame": { + "x": 66, + "y": 89, + "w": 66, + "h": 89 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 66, + "h": 89 + }, + "frame": { + "x": 66, + "y": 89, + "w": 66, + "h": 89 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 70, + "h": 88 + }, + "frame": { + "x": 69, + "y": 0, + "w": 70, + "h": 88 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 70, + "h": 89 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 70, + "h": 88 + }, + "frame": { + "x": 69, + "y": 0, + "w": 70, + "h": 88 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b0dfeeca618e8d5bccee4ca0838c0bbc:653e6a548e994ab9fc503a6868609517:a123ce346d124b2d12481db361d1b25b$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/914_3.png b/public/images/pokemon/variant/exp/back/914_3.png new file mode 100644 index 00000000000..0185c529f70 Binary files /dev/null and b/public/images/pokemon/variant/exp/back/914_3.png differ diff --git a/public/images/pokemon/variant/exp/back/940.json b/public/images/pokemon/variant/exp/back/940.json new file mode 100644 index 00000000000..313dbd273ec --- /dev/null +++ b/public/images/pokemon/variant/exp/back/940.json @@ -0,0 +1,32 @@ +{ + "1": { + "2f3135": "372b61", + "3f424d": "4c4982", + "181a1b": "181a1b", + "ffcd37": "7dffc0", + "be8f29": "5dd9c8", + "91a5c3": "e39fc5", + "f9f9f9": "f9f9f9", + "73bbbf": "f7859b", + "643c28": "433382", + "c27741": "9a5fd9", + "f1a156": "ce87fa", + "826426": "1b9ea1", + "434854": "754494" + }, + "2": { + "2f3135": "e099a5", + "3f424d": "edc5c8", + "181a1b": "181a1b", + "ffcd37": "d9647b", + "be8f29": "b3466a", + "91a5c3": "ba73b2", + "f9f9f9": "f9f9f9", + "73bbbf": "ffcf4a", + "643c28": "2b2745", + "c27741": "57436e", + "f1a156": "745b85", + "826426": "8c2a55", + "434854": "59317a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/941.json b/public/images/pokemon/variant/exp/back/941.json new file mode 100644 index 00000000000..63e5f56449e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/941.json @@ -0,0 +1,34 @@ +{ + "1": { + "000000": "000000", + "825d21": "217991", + "34393f": "2b3863", + "aa7e24": "3dd1cc", + "ffcd37": "6ef5c8", + "26282c": "1f1d54", + "6c7177": "354c70", + "73bbbf": "de82ff", + "2b1717": "2b1717", + "441e21": "d16492", + "692a2f": "ff9ec6", + "0f0f0f": "0f0f0f", + "37415a": "55348a", + "1a1c1f": "1a1c1f" + }, + "2": { + "000000": "000000", + "825d21": "8a2f62", + "34393f": "f7bebe", + "aa7e24": "c44f6c", + "ffcd37": "e3667d", + "26282c": "e394a7", + "6c7177": "f7dfdc", + "73bbbf": "ffcf4a", + "2b1717": "2b1717", + "441e21": "51467a", + "692a2f": "776294", + "0f0f0f": "0f0f0f", + "37415a": "55348a", + "1a1c1f": "1a1c1f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/953.json b/public/images/pokemon/variant/exp/back/953.json new file mode 100644 index 00000000000..6c48dfa65f5 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/953.json @@ -0,0 +1,28 @@ +{ + "1": { + "37332b": "104139", + "776348": "323aa5", + "5b4d37": "1c1e76", + "9e8461": "4059bd", + "575244": "18734a", + "777463": "199e46", + "f38725": "2e8c19", + "000000": "000000", + "c5b4aa": "d3e6e6", + "a28e86": "c1d8db", + "b96c26": "2f7410" + }, + "2": { + "37332b": "261031", + "776348": "8c9fbf", + "5b4d37": "333e5f", + "9e8461": "dbedec", + "575244": "5e2d72", + "777463": "8358a1", + "f38725": "4baecd", + "000000": "000000", + "c5b4aa": "39cfbc", + "a28e86": "52b0b0", + "b96c26": "4792bd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/954.json b/public/images/pokemon/variant/exp/back/954.json new file mode 100644 index 00000000000..56ad50388fd --- /dev/null +++ b/public/images/pokemon/variant/exp/back/954.json @@ -0,0 +1,34 @@ +{ + "1": { + "6f0c76": "4b5173", + "e11bff": "e1efff", + "aa13b7": "a0a9da", + "000000": "000000", + "91263f": "87ceeb", + "ce2d6b": "fffd91", + "ff4c90": "ffbc00", + "ffd5e5": "fbf3ab", + "4a8c98": "7d4538", + "3c5384": "523223", + "63c5d5": "b05858", + "7d2036": "096757", + "7c6e7d": "675941", + "ffffff": "f1d074" + }, + "2": { + "6f0c76": "3e091a", + "e11bff": "9b2217", + "aa13b7": "6b1111", + "000000": "000000", + "91263f": "c85712", + "ce2d6b": "ded051", + "ff4c90": "141031", + "ffd5e5": "432f77", + "4a8c98": "616481", + "3c5384": "21214c", + "63c5d5": "9e9fb6", + "7d2036": "204c6a", + "7c6e7d": "21214c", + "ffffff": "221a4c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/962.json b/public/images/pokemon/variant/exp/back/962.json index 860c4515df7..118a0f26768 100644 --- a/public/images/pokemon/variant/exp/back/962.json +++ b/public/images/pokemon/variant/exp/back/962.json @@ -28,5 +28,20 @@ "fffbff": "edf8e6", "7b827b": "6a856a", "a7aba7": "98a798" + }, + "2": { + "342930": "754156", + "0f0f0f": "0f0f0f", + "4a3942": "a5777f", + "937d85": "2f2655", + "b9aaaf": "453863", + "665b60": "211f45", + "efe3e1": "67548a", + "a7aba7": "ddac84", + "fffbff": "f7e5d0", + "e64c62": "aba7a8", + "993e49": "797877", + "501d25": "545151", + "7b827b": "a96c4b" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/962_3.png b/public/images/pokemon/variant/exp/back/962_3.png deleted file mode 100644 index 9356040a0e9..00000000000 Binary files a/public/images/pokemon/variant/exp/back/962_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/981.json b/public/images/pokemon/variant/exp/back/981.json new file mode 100644 index 00000000000..30098b9de2d --- /dev/null +++ b/public/images/pokemon/variant/exp/back/981.json @@ -0,0 +1,56 @@ +{ + "1": { + "0f0f0f": "0f0f0f", + "43341e": "112246", + "36383d": "503a2d", + "6f5431": "1f4062", + "8b704c": "3d6186", + "242322": "2e1f1f", + "9ca0ab": "665144", + "b4ff68": "ff8f00", + "fff42f": "c29925", + "6aad21": "dec93d", + "fcfcfc": "fcfcfc", + "deb43d": "dec93d", + "3d680f": "be6b02", + "775c10": "774f10", + "a8abb3": "a8abb3", + "513c21": "430b0f", + "b1a75c": "7e262d", + "fdec8a": "9c3e3e", + "ce5742": "ab9d75", + "6f5d35": "5b1a1f", + "ed7474": "c59671", + "68281c": "59513a", + "a03f2e": "8a7e5e", + "f5aa77": "d4b095", + "f18d4e": "d8d1ad" + }, + "2": { + "0f0f0f": "0f0f0f", + "43341e": "52ab5f", + "36383d": "792e51", + "6f5431": "a8e781", + "8b704c": "e4efcf", + "242322": "34162a", + "9ca0ab": "9c5978", + "b4ff68": "dc7346", + "fff42f": "ed9233", + "6aad21": "d8975d", + "fcfcfc": "fcfcfc", + "deb43d": "ebbb72", + "3d680f": "953c2f", + "775c10": "b35127", + "a8abb3": "a8abb3", + "513c21": "1a456c", + "b1a75c": "1e7884", + "fdec8a": "2a9d8f", + "ce5742": "1a2e43", + "6f5d35": "1b5c77", + "ed7474": "314f7a", + "68281c": "0e182e", + "a03f2e": "17253d", + "f5aa77": "4a7688", + "f18d4e": "264653" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/118.json b/public/images/pokemon/variant/female/118.json index 659fcbf17d3..ba5a9377fdb 100644 --- a/public/images/pokemon/variant/female/118.json +++ b/public/images/pokemon/variant/female/118.json @@ -1,22 +1,5 @@ { "1": { - "52525a": "2e5453", - "ffffff": "f0fff8", - "101010": "101010", - "8c8c94": "4c867a", - "d6d6de": "9cd8c4", - "efefef": "c3f0dd", - "ceb57b": "65aaae", - "ffc57b": "5addc9", - "ef7b42": "4cb5b1", - "d64210": "2a7580", - "ad1000": "174a5a", - "006b63": "8c3824", - "42ada5": "af704f", - "ad5273": "1f562f", - "f7848c": "5e9964" - }, - "2": { "52525a": "5b3856", "ffffff": "fff9fc", "101010": "101010", @@ -32,5 +15,22 @@ "42ada5": "ffdf5b", "ad5273": "762066", "f7848c": "c450a5" + }, + "2": { + "52525a": "2e5453", + "ffffff": "f0fff8", + "101010": "101010", + "8c8c94": "4c867a", + "d6d6de": "9cd8c4", + "efefef": "c3f0dd", + "ceb57b": "65aaae", + "ffc57b": "5addc9", + "ef7b42": "4cb5b1", + "d64210": "2a7580", + "ad1000": "174a5a", + "006b63": "8c3824", + "42ada5": "af704f", + "ad5273": "1f562f", + "f7848c": "5e9964" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/female/178_2.json b/public/images/pokemon/variant/female/178_2.json new file mode 100644 index 00000000000..d2326f5acbf --- /dev/null +++ b/public/images/pokemon/variant/female/178_2.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "178_2.png", + "format": "RGBA8888", + "size": { + "w": 224, + "h": 224 + }, + "scale": 1, + "frames": [ + { + "filename": "0101.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + }, + "frame": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + }, + "frame": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 45, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 45, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 88, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 88, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 41, + "h": 59 + }, + "frame": { + "x": 131, + "y": 0, + "w": 41, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 41, + "h": 59 + }, + "frame": { + "x": 131, + "y": 0, + "w": 41, + "h": 59 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 59 + }, + "frame": { + "x": 131, + "y": 59, + "w": 39, + "h": 59 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 59 + }, + "frame": { + "x": 131, + "y": 59, + "w": 39, + "h": 59 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 37, + "h": 59 + }, + "frame": { + "x": 0, + "y": 60, + "w": 37, + "h": 59 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 37, + "h": 59 + }, + "frame": { + "x": 0, + "y": 60, + "w": 37, + "h": 59 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 57 + }, + "frame": { + "x": 37, + "y": 60, + "w": 40, + "h": 57 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 57 + }, + "frame": { + "x": 37, + "y": 60, + "w": 40, + "h": 57 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 57 + }, + "frame": { + "x": 0, + "y": 119, + "w": 36, + "h": 57 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 57 + }, + "frame": { + "x": 0, + "y": 119, + "w": 36, + "h": 57 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 115, + "w": 37, + "h": 55 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 115, + "w": 37, + "h": 55 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 77, + "y": 170, + "w": 36, + "h": 54 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 77, + "y": 170, + "w": 36, + "h": 54 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 172, + "y": 0, + "w": 36, + "h": 54 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 172, + "y": 0, + "w": 36, + "h": 54 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:898a0175e268e2bf429019b4b00a4414:3e0d176fabaa6df9ef39756046ad4ad5:319c95b9f5acf1139a5c6761349cd6ab$" + } +} diff --git a/public/images/pokemon/variant/female/178_2.png b/public/images/pokemon/variant/female/178_2.png new file mode 100644 index 00000000000..1c0fe8c9153 Binary files /dev/null and b/public/images/pokemon/variant/female/178_2.png differ diff --git a/public/images/pokemon/variant/female/178_3.json b/public/images/pokemon/variant/female/178_3.json new file mode 100644 index 00000000000..2e851f20d9d --- /dev/null +++ b/public/images/pokemon/variant/female/178_3.json @@ -0,0 +1,2372 @@ +{ + "textures": [ + { + "image": "178_3.png", + "format": "RGBA8888", + "size": { + "w": 224, + "h": 224 + }, + "scale": 1, + "frames": [ + { + "filename": "0101.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + }, + "frame": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + }, + "frame": { + "x": 0, + "y": 0, + "w": 45, + "h": 60 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 45, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 45, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 88, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 60 + }, + "frame": { + "x": 88, + "y": 0, + "w": 43, + "h": 60 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 41, + "h": 59 + }, + "frame": { + "x": 131, + "y": 0, + "w": 41, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 41, + "h": 59 + }, + "frame": { + "x": 131, + "y": 0, + "w": 41, + "h": 59 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 59 + }, + "frame": { + "x": 131, + "y": 59, + "w": 39, + "h": 59 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 39, + "h": 59 + }, + "frame": { + "x": 131, + "y": 59, + "w": 39, + "h": 59 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 37, + "h": 59 + }, + "frame": { + "x": 0, + "y": 60, + "w": 37, + "h": 59 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 37, + "h": 59 + }, + "frame": { + "x": 0, + "y": 60, + "w": 37, + "h": 59 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 57 + }, + "frame": { + "x": 37, + "y": 60, + "w": 40, + "h": 57 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 57 + }, + "frame": { + "x": 37, + "y": 60, + "w": 40, + "h": 57 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 40, + "h": 54 + }, + "frame": { + "x": 37, + "y": 117, + "w": 40, + "h": 54 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 57 + }, + "frame": { + "x": 0, + "y": 119, + "w": 36, + "h": 57 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 36, + "h": 57 + }, + "frame": { + "x": 0, + "y": 119, + "w": 36, + "h": 57 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 60, + "w": 37, + "h": 55 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 115, + "w": 37, + "h": 55 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 37, + "h": 55 + }, + "frame": { + "x": 77, + "y": 115, + "w": 37, + "h": 55 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 38, + "h": 54 + }, + "frame": { + "x": 114, + "y": 118, + "w": 38, + "h": 54 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 77, + "y": 170, + "w": 36, + "h": 54 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 77, + "y": 170, + "w": 36, + "h": 54 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 7, + "w": 36, + "h": 53 + }, + "frame": { + "x": 36, + "y": 171, + "w": 36, + "h": 53 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 152, + "y": 118, + "w": 36, + "h": 55 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 36, + "h": 55 + }, + "frame": { + "x": 170, + "y": 59, + "w": 36, + "h": 55 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 172, + "y": 0, + "w": 36, + "h": 54 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 6, + "w": 36, + "h": 54 + }, + "frame": { + "x": 172, + "y": 0, + "w": 36, + "h": 54 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 35, + "h": 55 + }, + "frame": { + "x": 188, + "y": 114, + "w": 35, + "h": 55 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 45, + "h": 60 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 34, + "h": 55 + }, + "frame": { + "x": 188, + "y": 169, + "w": 34, + "h": 55 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:898a0175e268e2bf429019b4b00a4414:3e0d176fabaa6df9ef39756046ad4ad5:319c95b9f5acf1139a5c6761349cd6ab$" + } +} diff --git a/public/images/pokemon/variant/female/178_3.png b/public/images/pokemon/variant/female/178_3.png new file mode 100644 index 00000000000..0ca5fe14c72 Binary files /dev/null and b/public/images/pokemon/variant/female/178_3.png differ diff --git a/public/images/pokemon/variant/female/185.json b/public/images/pokemon/variant/female/185.json new file mode 100644 index 00000000000..493ad0c8286 --- /dev/null +++ b/public/images/pokemon/variant/female/185.json @@ -0,0 +1,30 @@ +{ + "1": { + "635a4a": "303429", + "c5a54a": "82847c", + "101010": "101010", + "ad845a": "6f7367", + "315a19": "39270c", + "4ac542": "a48d29", + "5a8c5a": "8e641a", + "94d67b": "d3cd52", + "8c7342": "515549", + "ce2910": "afb331", + "ffce00": "afb331", + "e6b54a": "8f991b" + }, + "2": { + "635a4a": "243075", + "c5a54a": "648cc6", + "101010": "101010", + "ad845a": "4663b1", + "315a19": "427ab3", + "4ac542": "96e4ed", + "5a8c5a": "60b7d3", + "94d67b": "dbfcfb", + "8c7342": "3d47a2", + "ce2910": "a5424a", + "ffce00": "e5e3f7", + "e6b54a": "cbc7e6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/190.json b/public/images/pokemon/variant/female/190.json new file mode 100644 index 00000000000..8c8837946be --- /dev/null +++ b/public/images/pokemon/variant/female/190.json @@ -0,0 +1,28 @@ +{ + "1": { + "52216b": "701523", + "000000": "000000", + "bd7bde": "dea95a", + "8442ad": "ad452f", + "a55ac5": "c47440", + "8c6b42": "8c7457", + "bd8c63": "bd9a7e", + "c5ad6b": "c4b487", + "ffdea5": "ffeccc", + "ffffff": "ffffff", + "adada5": "adada5" + }, + "2": { + "52216b": "807870", + "000000": "000000", + "bd7bde": "e5dfdf", + "8442ad": "a6a297", + "a55ac5": "bfbeb4", + "8c6b42": "632339", + "bd8c63": "802d44", + "c5ad6b": "99455d", + "ffdea5": "ed8286", + "ffffff": "ffffff", + "adada5": "adada5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/203.json b/public/images/pokemon/variant/female/203.json new file mode 100644 index 00000000000..a4391436a20 --- /dev/null +++ b/public/images/pokemon/variant/female/203.json @@ -0,0 +1,36 @@ +{ + "1": { + "424a73": "351810", + "ffffff": "ffffff", + "adb5d6": "8f6f66", + "6b8cb5": "512b21", + "4a3a3a": "231117", + "c5a53a": "7e262d", + "9c7b42": "571522", + "efde52": "9c3e3e", + "9c3a5a": "ab9d75", + "101010": "101010", + "ce6b94": "d8d1ad", + "947b6b": "1f4062", + "635252": "112246", + "d6c53a": "863838", + "8c735a": "213457" + }, + "2": { + "424a73": "27091d", + "ffffff": "ffffff", + "adb5d6": "c5b0b7", + "6b8cb5": "4a1b33", + "4a3a3a": "091225", + "c5a53a": "1e7884", + "9c7b42": "15545d", + "efde52": "2a9d8f", + "9c3a5a": "52ab5f", + "101010": "101010", + "ce6b94": "a8e781", + "947b6b": "1a2e43", + "635252": "111d34", + "d6c53a": "1f887b", + "8c735a": "152b3b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/217.json b/public/images/pokemon/variant/female/217.json new file mode 100644 index 00000000000..e09efa5de60 --- /dev/null +++ b/public/images/pokemon/variant/female/217.json @@ -0,0 +1,50 @@ +{ + "0": { + "7b7b8c": "7b7b8c", + "101010": "101010", + "634229": "1d3d26", + "ffffff": "ffffff", + "945221": "2f6324", + "422919": "112114", + "dedede": "dedede", + "bd7342": "6a8a46", + "ffef84": "f7ffa5", + "b5b5bd": "b5b5bd", + "c59c4a": "ceb552", + "f7c563": "f7de7b", + "841931": "a52942", + "de3a5a": "ef526b" + }, + "1": { + "7b7b8c": "7b7b8c", + "101010": "101010", + "634229": "6b1d38", + "ffffff": "ffffff", + "945221": "8c2a37", + "422919": "2d0e1f", + "dedede": "dedede", + "bd7342": "b74543", + "ffef84": "f9eddb", + "b5b5bd": "b5b5bd", + "c59c4a": "c48e81", + "f7c563": "f2cab8", + "841931": "841931", + "de3a5a": "de3a5a" + }, + "2": { + "7b7b8c": "7b7b8c", + "101010": "101010", + "634229": "1e2249", + "ffffff": "ffffff", + "945221": "323760", + "422919": "111433", + "dedede": "dedede", + "bd7342": "46527a", + "ffef84": "adf2f7", + "b5b5bd": "b5b5bd", + "c59c4a": "45a2f9", + "f7c563": "5ccaf2", + "841931": "a52942", + "de3a5a": "ef526b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/255.json b/public/images/pokemon/variant/female/255.json new file mode 100644 index 00000000000..4637ce061ca --- /dev/null +++ b/public/images/pokemon/variant/female/255.json @@ -0,0 +1,28 @@ +{ + "1": { + "ad8c00": "782a14", + "efbd31": "d36f2b", + "f7de6b": "f1a545", + "000000": "000000", + "ad4210": "318793", + "ff8c31": "6bcdb2", + "e65a21": "4cada9", + "ffad52": "a7ebe2", + "7b4a19": "1c2d5b", + "ffffff": "ffffff", + "8c5221": "580c0b" + }, + "2": { + "ad8c00": "550d38", + "efbd31": "811c3e", + "f7de6b": "ad3342", + "000000": "000000", + "ad4210": "b3817d", + "ff8c31": "f3e5cf", + "e65a21": "d3afa0", + "ffad52": "fffef6", + "7b4a19": "4b2661", + "ffffff": "ffffff", + "8c5221": "43082f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/256.json b/public/images/pokemon/variant/female/256.json new file mode 100644 index 00000000000..0895f764700 --- /dev/null +++ b/public/images/pokemon/variant/female/256.json @@ -0,0 +1,44 @@ +{ + "1": { + "de5a29": "da8923", + "121212": "121212", + "ff7b4a": "f7ca4b", + "9c3110": "8e3820", + "9c7329": "3a888d", + "191919": "191919", + "efde73": "c3f4cd", + "efbd4a": "84cfc1", + "d63131": "9083aa", + "962d0d": "605c8d", + "ffffff": "ffffff", + "d05325": "414f7b", + "6b6b73": "3e3969", + "dedece": "9386b8", + "9c8c84": "696098", + "645455": "3e3969", + "5a4a4a": "2c2a44", + "84736b": "574b6e", + "000000": "000000" + }, + "2": { + "de5a29": "cdb09b", + "121212": "121212", + "ff7b4a": "fff7e1", + "9c3110": "8a685f", + "9c7329": "64163c", + "191919": "191919", + "efde73": "c44d52", + "efbd4a": "962b4a", + "d63131": "d3c3ff", + "962d0d": "938bd6", + "ffffff": "ffffff", + "d05325": "53346f", + "6b6b73": "161c2c", + "dedece": "494f67", + "9c8c84": "2d2e46", + "645455": "211d32", + "5a4a4a": "ad662b", + "84736b": "e6a653", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/257.json b/public/images/pokemon/variant/female/257.json new file mode 100644 index 00000000000..7d1e3988e81 --- /dev/null +++ b/public/images/pokemon/variant/female/257.json @@ -0,0 +1,50 @@ +{ + "1": { + "bdb594": "a8c7da", + "948463": "8095b3", + "b93e3e": "46649c", + "000000": "000000", + "63524a": "55607d", + "dedeb5": "f0fbff", + "ee5e5e": "598dc1", + "ff8463": "70b0d5", + "7b2525": "232647", + "842929": "8e3820", + "ef6363": "f7ca4b", + "bd5f42": "97a3cc", + "ffde6b": "e1f0ff", + "dfa550": "b2c3e3", + "297bd6": "c64c07", + "bd4242": "da8923", + "9c8c84": "574b6e", + "634e4a": "2c2a44", + "ffffff": "9386b8", + "dea552": "6bcdb2", + "8c633a": "3a9898", + "f7d663": "a3f6be" + }, + "2": { + "bdb594": "a43b45", + "948463": "772436", + "b93e3e": "55153a", + "000000": "000000", + "63524a": "5b1832", + "dedeb5": "cc6155", + "ee5e5e": "772040", + "ff8463": "912d42", + "7b2525": "470f2f", + "842929": "9c7c70", + "ef6363": "fffae1", + "bd5f42": "983b2d", + "ffde6b": "da9b60", + "dfa550": "be6646", + "297bd6": "3a4881", + "bd4242": "d2bda7", + "9c8c84": "e6a653", + "634e4a": "ad662b", + "ffffff": "4d4266", + "dea552": "453969", + "8c633a": "2d2449", + "f7d663": "6e6187" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/307.json b/public/images/pokemon/variant/female/307.json new file mode 100644 index 00000000000..d3e6a2437f1 --- /dev/null +++ b/public/images/pokemon/variant/female/307.json @@ -0,0 +1,34 @@ +{ + "1": { + "7b6b6b": "7a5f5f", + "000000": "000000", + "e6dede": "deccc3", + "b5adad": "9f8383", + "4a4242": "4a4242", + "ffffff": "ffffff", + "3a4a5a": "5a2859", + "b5d6ff": "f4a8c8", + "6bcee6": "ce7bb0", + "d65252": "d65287", + "84424a": "84424a", + "3a84b5": "7e4377", + "5aa5ce": "b95ba1", + "d65273": "d65273" + }, + "2": { + "7b6b6b": "314b76", + "000000": "000000", + "e6dede": "c2cfdb", + "b5adad": "6f89aa", + "4a4242": "1e2f52", + "ffffff": "ffffff", + "3a4a5a": "113926", + "b5d6ff": "7edfb7", + "6bcee6": "66c3a3", + "d65252": "c067c7", + "84424a": "84424a", + "3a84b5": "375a47", + "5aa5ce": "579578", + "d65273": "d65273" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/418.json b/public/images/pokemon/variant/female/418.json new file mode 100644 index 00000000000..628252e5296 --- /dev/null +++ b/public/images/pokemon/variant/female/418.json @@ -0,0 +1,36 @@ +{ + "1": { + "ad5a21": "7d1e39", + "ef7b19": "9c354f", + "7b4221": "611b35", + "191919": "191919", + "dec584": "cea49d", + "f7f7b5": "e8d4cc", + "ffffff": "ffffff", + "6b6b6b": "6b6b6b", + "d6d6ce": "d6d6ce", + "ffde00": "d2e5e8", + "9c6300": "995e5c", + "e6a531": "a0b3ba", + "2163a5": "385e11", + "63bde6": "6a9539", + "ce6b19": "851d3e" + }, + "2": { + "ad5a21": "cd91aa", + "ef7b19": "e8c3ce", + "7b4221": "84466b", + "191919": "191919", + "dec584": "8a4370", + "f7f7b5": "a8688f", + "ffffff": "ffffff", + "6b6b6b": "432e38", + "d6d6ce": "d6d6ce", + "ffde00": "eda342", + "9c6300": "642858", + "e6a531": "ca6e26", + "2163a5": "4b2a70", + "63bde6": "744d99", + "ce6b19": "d9a8bc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/419.json b/public/images/pokemon/variant/female/419.json new file mode 100644 index 00000000000..1ea1637ff2c --- /dev/null +++ b/public/images/pokemon/variant/female/419.json @@ -0,0 +1,19 @@ +{ + "2": { + "7b4221": "9e6a86", + "ef7b19": "debfc8", + "191919": "191919", + "ce6b19": "dca5b5", + "ad5a21": "cd91aa", + "9c6300": "672e5d", + "f7f7b5": "a8688f", + "cebd84": "965080", + "99693c": "8e410e", + "e6a531": "d4812f", + "6b6b6b": "726481", + "ffffff": "ffffff", + "ffde00": "eda342", + "2163a5": "4b2a70", + "63bde6": "744d99" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/623_1.json b/public/images/pokemon/variant/female/419_2.json similarity index 58% rename from public/images/pokemon/variant/623_1.json rename to public/images/pokemon/variant/female/419_2.json index 3a12266f102..a021966e74f 100644 --- a/public/images/pokemon/variant/623_1.json +++ b/public/images/pokemon/variant/female/419_2.json @@ -1,2658 +1,54 @@ { "textures": [ { - "image": "623_1.png", + "image": "419_2.png", "format": "RGBA8888", "size": { - "w": 401, - "h": 401 + "w": 358, + "h": 358 }, "scale": 1, "frames": [ - { - "filename": "0121.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 0, - "y": 80, - "w": 83, - "h": 80 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 0, - "y": 80, - "w": 83, - "h": 80 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 83, - "y": 0, - "w": 83, - "h": 80 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 83, - "y": 0, - "w": 83, - "h": 80 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 0, - "y": 160, - "w": 83, - "h": 79 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 0, - "y": 160, - "w": 83, - "h": 79 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 83, - "y": 80, - "w": 83, - "h": 79 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 83, - "y": 80, - "w": 83, - "h": 79 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 166, - "y": 0, - "w": 83, - "h": 79 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 166, - "y": 0, - "w": 83, - "h": 79 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 0, - "y": 239, - "w": 81, - "h": 80 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 0, - "y": 239, - "w": 81, - "h": 80 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 83, - "y": 159, - "w": 81, - "h": 80 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 83, - "y": 159, - "w": 81, - "h": 80 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 166, - "y": 79, - "w": 81, - "h": 80 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 166, - "y": 79, - "w": 81, - "h": 80 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, { "filename": "0067.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 + "x": 0, + "y": 2, + "w": 59, + "h": 69 }, "frame": { "x": 0, - "y": 319, - "w": 79, - "h": 80 + "y": 0, + "w": 59, + "h": 69 } }, { - "filename": "0068.png", + "filename": "0123.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 + "x": 0, + "y": 2, + "w": 59, + "h": 69 }, "frame": { "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 164, - "y": 159, - "w": 79, - "h": 80 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 164, - "y": 159, - "w": 79, - "h": 80 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 164, - "y": 159, - "w": 79, - "h": 80 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 164, - "y": 159, - "w": 79, - "h": 80 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 79, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 79, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 160, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 160, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 158, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 158, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 247, - "y": 79, - "w": 79, - "h": 80 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 247, - "y": 79, - "w": 79, - "h": 80 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 + "w": 59, + "h": 69 } }, { @@ -2660,20 +56,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 + "x": 0, + "y": 2, + "w": 59, + "h": 69 }, "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 + "x": 0, + "y": 0, + "w": 59, + "h": 69 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 58, + "h": 69 + }, + "frame": { + "x": 59, + "y": 0, + "w": 58, + "h": 69 + } + }, + { + "filename": "0124.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 58, + "h": 69 + }, + "frame": { + "x": 59, + "y": 0, + "w": 58, + "h": 69 } }, { @@ -2681,314 +119,104 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 58, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 + "x": 59, + "y": 0, + "w": 58, + "h": 69 } }, { - "filename": "0014.png", + "filename": "0069.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 57, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 + "x": 117, + "y": 0, + "w": 57, + "h": 69 } }, { - "filename": "0021.png", + "filename": "0070.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 57, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 + "x": 117, + "y": 0, + "w": 57, + "h": 69 } }, { - "filename": "0022.png", + "filename": "0125.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 57, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 + "x": 117, + "y": 0, + "w": 57, + "h": 69 } }, { - "filename": "0047.png", + "filename": "0126.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 57, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 + "x": 117, + "y": 0, + "w": 57, + "h": 69 } }, { @@ -2996,20 +224,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 57, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 + "x": 117, + "y": 0, + "w": 57, + "h": 69 } }, { @@ -3017,356 +245,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 57, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 + "x": 117, + "y": 0, + "w": 57, + "h": 69 } }, { - "filename": "0157.png", + "filename": "0075.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 64, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 + "x": 174, + "y": 0, + "w": 64, + "h": 69 } }, { - "filename": "0158.png", + "filename": "0131.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 81, - "h": 77 + "y": 2, + "w": 64, + "h": 69 }, "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 + "x": 174, + "y": 0, + "w": 64, + "h": 69 } }, { @@ -3374,20 +308,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 81, - "h": 76 + "y": 2, + "w": 64, + "h": 69 }, "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 + "x": 174, + "y": 0, + "w": 64, + "h": 69 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 63, + "h": 69 + }, + "frame": { + "x": 238, + "y": 0, + "w": 63, + "h": 69 + } + }, + { + "filename": "0132.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 63, + "h": 69 + }, + "frame": { + "x": 238, + "y": 0, + "w": 63, + "h": 69 } }, { @@ -3395,104 +371,272 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 81, - "h": 76 + "y": 2, + "w": 63, + "h": 69 }, "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 + "x": 238, + "y": 0, + "w": 63, + "h": 69 } }, { - "filename": "0017.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 82, - "h": 75 + "y": 0, + "w": 57, + "h": 71 }, "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 + "x": 301, + "y": 0, + "w": 57, + "h": 71 } }, { - "filename": "0018.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 82, - "h": 75 + "y": 0, + "w": 57, + "h": 71 }, "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 + "x": 301, + "y": 0, + "w": 57, + "h": 71 } }, { - "filename": "0051.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 82, - "h": 75 + "y": 0, + "w": 57, + "h": 71 }, "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 + "x": 301, + "y": 0, + "w": 57, + "h": 71 } }, { - "filename": "0052.png", + "filename": "0055.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 82, - "h": 75 + "y": 0, + "w": 57, + "h": 71 }, "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 + "x": 301, + "y": 0, + "w": 57, + "h": 71 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 57, + "h": 71 + }, + "frame": { + "x": 301, + "y": 0, + "w": 57, + "h": 71 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 57, + "h": 71 + }, + "frame": { + "x": 301, + "y": 0, + "w": 57, + "h": 71 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 69 + }, + "frame": { + "x": 0, + "y": 69, + "w": 59, + "h": 69 + } + }, + { + "filename": "0135.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 69 + }, + "frame": { + "x": 0, + "y": 69, + "w": 59, + "h": 69 + } + }, + { + "filename": "0159.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 69 + }, + "frame": { + "x": 0, + "y": 69, + "w": 59, + "h": 69 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 58, + "h": 69 + }, + "frame": { + "x": 59, + "y": 69, + "w": 58, + "h": 69 + } + }, + { + "filename": "0136.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 58, + "h": 69 + }, + "frame": { + "x": 59, + "y": 69, + "w": 58, + "h": 69 + } + }, + { + "filename": "0160.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 58, + "h": 69 + }, + "frame": { + "x": 59, + "y": 69, + "w": 58, + "h": 69 } }, { @@ -3500,20 +644,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 82, - "h": 75 + "y": 2, + "w": 67, + "h": 69 }, "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 + "x": 117, + "y": 69, + "w": 67, + "h": 69 } }, { @@ -3521,62 +665,2876 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 82, - "h": 75 + "y": 2, + "w": 67, + "h": 69 }, "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 + "x": 117, + "y": 69, + "w": 67, + "h": 69 + } + }, + { + "filename": "0141.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 67, + "h": 69 + }, + "frame": { + "x": 117, + "y": 69, + "w": 67, + "h": 69 + } + }, + { + "filename": "0142.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 67, + "h": 69 + }, + "frame": { + "x": 117, + "y": 69, + "w": 67, + "h": 69 + } + }, + { + "filename": "0165.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 67, + "h": 69 + }, + "frame": { + "x": 117, + "y": 69, + "w": 67, + "h": 69 + } + }, + { + "filename": "0166.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 67, + "h": 69 + }, + "frame": { + "x": 117, + "y": 69, + "w": 67, + "h": 69 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 69 + }, + "frame": { + "x": 184, + "y": 69, + "w": 64, + "h": 69 + } + }, + { + "filename": "0143.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 69 + }, + "frame": { + "x": 184, + "y": 69, + "w": 64, + "h": 69 + } + }, + { + "filename": "0167.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 64, + "h": 69 + }, + "frame": { + "x": 184, + "y": 69, + "w": 64, + "h": 69 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 63, + "h": 69 + }, + "frame": { + "x": 248, + "y": 71, + "w": 63, + "h": 69 + } + }, + { + "filename": "0144.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 63, + "h": 69 + }, + "frame": { + "x": 248, + "y": 71, + "w": 63, + "h": 69 + } + }, + { + "filename": "0168.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 63, + "h": 69 + }, + "frame": { + "x": 248, + "y": 71, + "w": 63, + "h": 69 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0145.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0146.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 61, + "h": 70 + }, + "frame": { + "x": 0, + "y": 138, + "w": 61, + "h": 70 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 70 + }, + "frame": { + "x": 61, + "y": 138, + "w": 60, + "h": 70 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 70 + }, + "frame": { + "x": 61, + "y": 138, + "w": 60, + "h": 70 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 70 + }, + "frame": { + "x": 61, + "y": 138, + "w": 60, + "h": 70 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 70 + }, + "frame": { + "x": 61, + "y": 138, + "w": 60, + "h": 70 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 70 + }, + "frame": { + "x": 61, + "y": 138, + "w": 60, + "h": 70 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 70 + }, + "frame": { + "x": 61, + "y": 138, + "w": 60, + "h": 70 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 70 + }, + "frame": { + "x": 121, + "y": 138, + "w": 59, + "h": 70 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 70 + }, + "frame": { + "x": 121, + "y": 138, + "w": 59, + "h": 70 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 70 + }, + "frame": { + "x": 121, + "y": 138, + "w": 59, + "h": 70 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 70 + }, + "frame": { + "x": 121, + "y": 138, + "w": 59, + "h": 70 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 70 + }, + "frame": { + "x": 121, + "y": 138, + "w": 59, + "h": 70 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 70 + }, + "frame": { + "x": 121, + "y": 138, + "w": 59, + "h": 70 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 58, + "h": 70 + }, + "frame": { + "x": 180, + "y": 138, + "w": 58, + "h": 70 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 63, + "h": 70 + }, + "frame": { + "x": 238, + "y": 140, + "w": 63, + "h": 70 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 63, + "h": 70 + }, + "frame": { + "x": 238, + "y": 140, + "w": 63, + "h": 70 + } + }, + { + "filename": "0127.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 63, + "h": 70 + }, + "frame": { + "x": 238, + "y": 140, + "w": 63, + "h": 70 + } + }, + { + "filename": "0139.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 63, + "h": 70 + }, + "frame": { + "x": 238, + "y": 140, + "w": 63, + "h": 70 + } + }, + { + "filename": "0151.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 63, + "h": 70 + }, + "frame": { + "x": 238, + "y": 140, + "w": 63, + "h": 70 + } + }, + { + "filename": "0163.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 63, + "h": 70 + }, + "frame": { + "x": 238, + "y": 140, + "w": 63, + "h": 70 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 57, + "h": 71 + }, + "frame": { + "x": 301, + "y": 140, + "w": 57, + "h": 71 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 57, + "h": 71 + }, + "frame": { + "x": 301, + "y": 140, + "w": 57, + "h": 71 + } + }, + { + "filename": "0137.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 57, + "h": 71 + }, + "frame": { + "x": 301, + "y": 140, + "w": 57, + "h": 71 + } + }, + { + "filename": "0138.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 57, + "h": 71 + }, + "frame": { + "x": 301, + "y": 140, + "w": 57, + "h": 71 + } + }, + { + "filename": "0161.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 57, + "h": 71 + }, + "frame": { + "x": 301, + "y": 140, + "w": 57, + "h": 71 + } + }, + { + "filename": "0162.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 57, + "h": 71 + }, + "frame": { + "x": 301, + "y": 140, + "w": 57, + "h": 71 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 70 + }, + "frame": { + "x": 0, + "y": 208, + "w": 66, + "h": 70 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 70 + }, + "frame": { + "x": 0, + "y": 208, + "w": 66, + "h": 70 + } + }, + { + "filename": "0128.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 70 + }, + "frame": { + "x": 0, + "y": 208, + "w": 66, + "h": 70 + } + }, + { + "filename": "0140.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 70 + }, + "frame": { + "x": 0, + "y": 208, + "w": 66, + "h": 70 + } + }, + { + "filename": "0152.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 70 + }, + "frame": { + "x": 0, + "y": 208, + "w": 66, + "h": 70 + } + }, + { + "filename": "0164.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 66, + "h": 70 + }, + "frame": { + "x": 0, + "y": 208, + "w": 66, + "h": 70 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 71 + }, + "frame": { + "x": 66, + "y": 208, + "w": 59, + "h": 71 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 71 + }, + "frame": { + "x": 66, + "y": 208, + "w": 59, + "h": 71 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 71 + }, + "frame": { + "x": 66, + "y": 208, + "w": 59, + "h": 71 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 71 + }, + "frame": { + "x": 66, + "y": 208, + "w": 59, + "h": 71 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 71 + }, + "frame": { + "x": 66, + "y": 208, + "w": 59, + "h": 71 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 59, + "h": 71 + }, + "frame": { + "x": 66, + "y": 208, + "w": 59, + "h": 71 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 125, + "y": 208, + "w": 61, + "h": 71 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 62, + "h": 71 + }, + "frame": { + "x": 186, + "y": 210, + "w": 62, + "h": 71 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 62, + "h": 71 + }, + "frame": { + "x": 186, + "y": 210, + "w": 62, + "h": 71 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 62, + "h": 71 + }, + "frame": { + "x": 186, + "y": 210, + "w": 62, + "h": 71 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 62, + "h": 71 + }, + "frame": { + "x": 186, + "y": 210, + "w": 62, + "h": 71 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 62, + "h": 71 + }, + "frame": { + "x": 186, + "y": 210, + "w": 62, + "h": 71 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 62, + "h": 71 + }, + "frame": { + "x": 186, + "y": 210, + "w": 62, + "h": 71 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 248, + "y": 211, + "w": 64, + "h": 71 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 248, + "y": 211, + "w": 64, + "h": 71 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 248, + "y": 211, + "w": 64, + "h": 71 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 248, + "y": 211, + "w": 64, + "h": 71 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 248, + "y": 211, + "w": 64, + "h": 71 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 248, + "y": 211, + "w": 64, + "h": 71 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 66, + "h": 71 + }, + "frame": { + "x": 0, + "y": 278, + "w": 66, + "h": 71 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 66, + "y": 279, + "w": 67, + "h": 71 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 66, + "y": 279, + "w": 67, + "h": 71 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 66, + "y": 279, + "w": 67, + "h": 71 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 66, + "y": 279, + "w": 67, + "h": 71 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 66, + "y": 279, + "w": 67, + "h": 71 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 66, + "y": 279, + "w": 67, + "h": 71 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 133, + "y": 281, + "w": 64, + "h": 71 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 133, + "y": 281, + "w": 64, + "h": 71 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 133, + "y": 281, + "w": 64, + "h": 71 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 133, + "y": 281, + "w": 64, + "h": 71 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 133, + "y": 281, + "w": 64, + "h": 71 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 71 + }, + "frame": { + "x": 133, + "y": 281, + "w": 64, + "h": 71 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 197, + "y": 282, + "w": 67, + "h": 71 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 197, + "y": 282, + "w": 67, + "h": 71 + } + }, + { + "filename": "0129.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 197, + "y": 282, + "w": 67, + "h": 71 + } + }, + { + "filename": "0130.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 67, + "h": 71 + }, + "frame": { + "x": 197, + "y": 282, + "w": 67, + "h": 71 } }, { "filename": "0153.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 82, - "h": 75 + "y": 0, + "w": 67, + "h": 71 }, "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 + "x": 197, + "y": 282, + "w": 67, + "h": 71 } }, { "filename": "0154.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 83, - "h": 80 + "w": 67, + "h": 71 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 82, - "h": 75 + "y": 0, + "w": 67, + "h": 71 }, "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 + "x": 197, + "y": 282, + "w": 67, + "h": 71 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 264, + "y": 282, + "w": 61, + "h": 71 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 264, + "y": 282, + "w": 61, + "h": 71 + } + }, + { + "filename": "0133.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 264, + "y": 282, + "w": 61, + "h": 71 + } + }, + { + "filename": "0134.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 264, + "y": 282, + "w": 61, + "h": 71 + } + }, + { + "filename": "0157.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 264, + "y": 282, + "w": 61, + "h": 71 + } + }, + { + "filename": "0158.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 67, + "h": 71 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 61, + "h": 71 + }, + "frame": { + "x": 264, + "y": 282, + "w": 61, + "h": 71 } } ] @@ -3585,6 +3543,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:76e8001e2d30637bbf46d66a3c01cc86:32d4799151bd0a494e1cc16c07cc1afb:869abf8e0bcb859d5abfb33d03e5db07$" + "smartupdate": "$TexturePacker:SmartUpdate:7d23882aac8c0408e9d7daa626fe7a34:3703e8474c5c90ed70fecc132873b21f:98b722f1b401d467899e75c514bedea0$" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/female/419_2.png b/public/images/pokemon/variant/female/419_2.png new file mode 100644 index 00000000000..897efbd57ba Binary files /dev/null and b/public/images/pokemon/variant/female/419_2.png differ diff --git a/public/images/pokemon/variant/female/41_2.png b/public/images/pokemon/variant/female/41_2.png deleted file mode 100644 index 9ef30a5e98e..00000000000 Binary files a/public/images/pokemon/variant/female/41_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/female/41_3.png b/public/images/pokemon/variant/female/41_3.png deleted file mode 100644 index cbc73b70515..00000000000 Binary files a/public/images/pokemon/variant/female/41_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/female/424.json b/public/images/pokemon/variant/female/424.json new file mode 100644 index 00000000000..4e00c3c1234 --- /dev/null +++ b/public/images/pokemon/variant/female/424.json @@ -0,0 +1,38 @@ +{ + "1": { + "734a42": "415c73", + "ad5242": "428dad", + "ff735a": "5ae9ff", + "101010": "101010", + "debd73": "c4b487", + "ffefa5": "ffeccc", + "8c6b42": "8c7457", + "52216b": "701523", + "843aad": "ad452f", + "b563e6": "dea95a", + "9c4ac5": "c47440", + "bd9473": "bd9a7e", + "ab5141": "293b94", + "ffffff": "ffffff", + "fc7158": "3973e5", + "adada5": "adada5" + }, + "2": { + "734a42": "593802", + "ad5242": "946212", + "ff735a": "ffb338", + "101010": "101010", + "debd73": "99455d", + "ffefa5": "ed8286", + "8c6b42": "632339", + "52216b": "807870", + "843aad": "a6a297", + "b563e6": "e5dfdf", + "9c4ac5": "bfbeb4", + "bd9473": "802d44", + "ab5141": "8c1c2f", + "ffffff": "ffffff", + "fc7158": "b33636", + "adada5": "adada5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/42_2.png b/public/images/pokemon/variant/female/42_2.png deleted file mode 100644 index a8183eaf60b..00000000000 Binary files a/public/images/pokemon/variant/female/42_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/female/42_3.png b/public/images/pokemon/variant/female/42_3.png deleted file mode 100644 index a0029ba8548..00000000000 Binary files a/public/images/pokemon/variant/female/42_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/female/44.json b/public/images/pokemon/variant/female/44.json new file mode 100644 index 00000000000..afaf4860bf5 --- /dev/null +++ b/public/images/pokemon/variant/female/44.json @@ -0,0 +1,34 @@ +{ + "1": { + "5a2900": "162486", + "101010": "101010", + "ad523a": "4d75b6", + "843a19": "2c489f", + "ce734a": "7aa8d2", + "f7efbd": "7dcf94", + "ffbd42": "55bb7e", + "c57329": "0f7469", + "ff7300": "219771", + "8c3a19": "043d44", + "4a6b7b": "8259a9", + "10314a": "5d3d90", + "7b84a5": "ac76c7", + "b55ac5": "1d579d" + }, + "2": { + "5a2900": "680b10", + "101010": "101010", + "ad523a": "bd4e2d", + "843a19": "8d1e11", + "ce734a": "d98247", + "f7efbd": "ede68f", + "ffbd42": "e8d65e", + "c57329": "9f631f", + "ff7300": "bd9434", + "8c3a19": "773811", + "4a6b7b": "792033", + "10314a": "490e23", + "7b84a5": "b33c40", + "b55ac5": "d47230" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/45.json b/public/images/pokemon/variant/female/45.json new file mode 100644 index 00000000000..0da9343d254 --- /dev/null +++ b/public/images/pokemon/variant/female/45.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "731910": "091d79", + "f78c8c": "8cbef7", + "f7adb5": "add8f7", + "ffced6": "ceedff", + "de4a5a": "436ac7", + "f77373": "5e8fde", + "944a00": "472b86", + "9c3a42": "2243ae", + "ce6319": "724ba4", + "ff8429": "966fbb", + "3a4263": "4a2f81", + "19294a": "201349", + "de4a5f": "3e9bae", + "5a6384": "6e4b9f", + "7384a5": "966fbb" + }, + "2": { + "101010": "101010", + "731910": "97696f", + "f78c8c": "ebe8d1", + "f7adb5": "51030e", + "ffced6": "880808", + "de4a5a": "cdb2a2", + "f77373": "d2cbb2", + "944a00": "621734", + "9c3a42": "bb9089", + "ce6319": "8b293e", + "ff8429": "a23d44", + "3a4263": "8b1b50", + "19294a": "510c35", + "de4a5f": "dca280", + "5a6384": "b32952", + "7384a5": "de4263" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/456.json b/public/images/pokemon/variant/female/456.json new file mode 100644 index 00000000000..68b30fe1a31 --- /dev/null +++ b/public/images/pokemon/variant/female/456.json @@ -0,0 +1,32 @@ +{ + "1": { + "526b8c": "966764", + "94d6e6": "f3e1c6", + "101010": "101010", + "7394ad": "cda38c", + "833171": "d3633a", + "29293a": "7e2023", + "31425a": "b94539", + "c5e6f7": "fffbf2", + "c54591": "f19e53", + "426b84": "e2895d", + "efffff": "efffff", + "c54a94": "8bbcd9", + "ad8cbd": "f6c37c" + }, + "2": { + "526b8c": "162743", + "94d6e6": "27616f", + "101010": "101010", + "7394ad": "1c405b", + "833171": "349b8b", + "29293a": "b66736", + "31425a": "ffc452", + "c5e6f7": "429b91", + "c54591": "5fd0a4", + "426b84": "fff8b0", + "efffff": "efffff", + "c54a94": "7b1615", + "ad8cbd": "38a493" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/457.json b/public/images/pokemon/variant/female/457.json new file mode 100644 index 00000000000..158974b5d96 --- /dev/null +++ b/public/images/pokemon/variant/female/457.json @@ -0,0 +1,30 @@ +{ + "1": { + "526b8c": "966764", + "101010": "101010", + "c5e6f7": "fffbf2", + "94d6e6": "f3e1c6", + "29293a": "a42d2f", + "31425a": "c75b45", + "7394ad": "cda38c", + "c54591": "ffc369", + "9e357b": "c7703c", + "73427b": "6f75a0", + "c54a94": "aadff3", + "efffff": "efffff" + }, + "2": { + "526b8c": "162743", + "101010": "101010", + "c5e6f7": "429b91", + "94d6e6": "27616f", + "29293a": "ffa849", + "31425a": "ffde67", + "7394ad": "1c405b", + "c54591": "50c2a1", + "9e357b": "2e9b8f", + "73427b": "7b1213", + "c54a94": "983121", + "efffff": "efffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/465.json b/public/images/pokemon/variant/female/465.json new file mode 100644 index 00000000000..a7ff2338057 --- /dev/null +++ b/public/images/pokemon/variant/female/465.json @@ -0,0 +1,22 @@ +{ + "1": { + "529cc5": "8153c7", + "d65a94": "5ad662", + "3a73ad": "6b3aad", + "bd216b": "21bd69", + "5a193a": "195a2a", + "193a63": "391963", + "295a84": "472984" + }, + "2": { + "529cc5": "ffedb6", + "d65a94": "e67d2f", + "3a73ad": "ebc582", + "bd216b": "b35131", + "31313a": "3d1519", + "5a193a": "752e2e", + "193a63": "705040", + "295a84": "ad875a", + "4a4a52": "57211a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/6215.json b/public/images/pokemon/variant/female/6215.json new file mode 100644 index 00000000000..99e0c880142 --- /dev/null +++ b/public/images/pokemon/variant/female/6215.json @@ -0,0 +1,36 @@ +{ + "1": { + "503678": "0f5d6d", + "080808": "080808", + "514a80": "402010", + "956cbe": "31dabb", + "9c9bce": "ae8976", + "724ca2": "12968b", + "dcdbf7": "d0b3a4", + "7d6ca4": "853a36", + "c58b08": "6e6f6f", + "ffde7b": "a7a7a7", + "584d80": "562627", + "28234b": "220d0a", + "c52973": "ea903f", + "bdbdc5": "bdbdc5", + "f6f6ff": "f6f6ff" + }, + "2": { + "503678": "601522", + "080808": "080808", + "514a80": "14273a", + "956cbe": "cc5427", + "9c9bce": "3c8775", + "724ca2": "982e33", + "dcdbf7": "60ae7e", + "7d6ca4": "395962", + "c58b08": "ffa341", + "ffde7b": "ffe07e", + "584d80": "1c3942", + "28234b": "0a191e", + "c52973": "f49633", + "bdbdc5": "bdbdc5", + "f6f6ff": "f6f6ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon_icons_1.json b/public/images/pokemon_icons_1.json index e313cec5d7d..49e471514cd 100644 --- a/public/images/pokemon_icons_1.json +++ b/public/images/pokemon_icons_1.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_1.png", "format": "RGBA8888", "size": { - "w": 255, - "h": 790 + "w": 254, + "h": 788 }, "scale": 1, "frames": [ @@ -723,48 +723,6 @@ "h": 28 } }, - { - "filename": "74", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 0, - "y": 775, - "w": 24, - "h": 15 - } - }, - { - "filename": "66", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 239, - "y": 0, - "w": 16, - "h": 20 - } - }, { "filename": "34", "rotated": false, @@ -871,7 +829,7 @@ } }, { - "filename": "80-mega", + "filename": "6-gigantamax", "rotated": false, "trimmed": true, "sourceSize": { @@ -879,16 +837,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 25, - "h": 26 + "x": 8, + "y": 0, + "w": 24, + "h": 30 }, "frame": { "x": 230, "y": 27, - "w": 25, - "h": 26 + "w": 24, + "h": 30 } }, { @@ -1115,27 +1073,6 @@ "w": 29, "h": 26 }, - "frame": { - "x": 223, - "y": 53, - "w": 29, - "h": 26 - } - }, - { - "filename": "3s-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 26 - }, "frame": { "x": 93, "y": 77, @@ -1165,7 +1102,7 @@ } }, { - "filename": "74s", + "filename": "3", "rotated": false, "trimmed": true, "sourceSize": { @@ -1173,16 +1110,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 + "x": 5, + "y": 4, + "w": 30, + "h": 24 }, "frame": { - "x": 24, + "x": 223, + "y": 57, + "w": 30, + "h": 24 + } + }, + { + "filename": "132", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 16, + "h": 13 + }, + "frame": { + "x": 0, "y": 775, - "w": 24, - "h": 15 + "w": 16, + "h": 13 } }, { @@ -1207,7 +1165,7 @@ } }, { - "filename": "78", + "filename": "3s-mega", "rotated": false, "trimmed": true, "sourceSize": { @@ -1215,7 +1173,7 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, + "x": 6, "y": 2, "w": 29, "h": 26 @@ -1249,7 +1207,7 @@ } }, { - "filename": "78s", + "filename": "78", "rotated": false, "trimmed": true, "sourceSize": { @@ -1270,7 +1228,7 @@ } }, { - "filename": "3", + "filename": "3s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1291,7 +1249,7 @@ } }, { - "filename": "3s", + "filename": "78s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1299,20 +1257,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 30, - "h": 24 + "x": 7, + "y": 2, + "w": 29, + "h": 26 }, "frame": { "x": 179, "y": 103, - "w": 30, - "h": 24 + "w": 29, + "h": 26 } }, { - "filename": "64", + "filename": "50", "rotated": false, "trimmed": true, "sourceSize": { @@ -1320,16 +1278,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 29, - "h": 25 + "x": 13, + "y": 14, + "w": 15, + "h": 14 }, "frame": { - "x": 212, - "y": 79, - "w": 29, - "h": 25 + "x": 239, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "132s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 16, + "h": 13 + }, + "frame": { + "x": 16, + "y": 775, + "w": 16, + "h": 13 } }, { @@ -1347,77 +1326,14 @@ "h": 22 }, "frame": { - "x": 209, - "y": 104, + "x": 212, + "y": 81, "w": 30, "h": 22 } }, { - "filename": "10", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 14, - "h": 16 - }, - "frame": { - "x": 241, - "y": 79, - "w": 14, - "h": 16 - } - }, - { - "filename": "66s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 239, - "y": 104, - "w": 16, - "h": 20 - } - }, - { - "filename": "13", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 239, - "y": 124, - "w": 16, - "h": 17 - } - }, - { - "filename": "22s", + "filename": "64", "rotated": false, "trimmed": true, "sourceSize": { @@ -1426,145 +1342,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 209, - "y": 126, - "w": 30, - "h": 22 - } - }, - { - "filename": "115-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 179, - "y": 127, - "w": 30, - "h": 22 - } - }, - { - "filename": "13s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 239, - "y": 141, - "w": 16, - "h": 17 - } - }, - { - "filename": "115s-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 209, - "y": 148, - "w": 30, - "h": 22 - } - }, - { - "filename": "101", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 239, - "y": 158, - "w": 16, - "h": 16 - } - }, - { - "filename": "6-gigantamax", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 24, - "h": 30 - }, - "frame": { - "x": 29, - "y": 719, - "w": 24, - "h": 30 - } - }, - { - "filename": "15-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, "y": 3, - "w": 27, - "h": 26 + "w": 29, + "h": 25 }, "frame": { - "x": 29, - "y": 749, - "w": 27, - "h": 26 + "x": 208, + "y": 103, + "w": 29, + "h": 25 } }, { - "filename": "81", + "filename": "48", "rotated": false, "trimmed": true, "sourceSize": { @@ -1572,16 +1362,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 23, - "h": 15 + "x": 12, + "y": 2, + "w": 17, + "h": 26 }, "frame": { - "x": 48, - "y": 775, - "w": 23, - "h": 15 + "x": 237, + "y": 103, + "w": 17, + "h": 26 + } + }, + { + "filename": "11", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 242, + "y": 81, + "w": 12, + "h": 18 } }, { @@ -1648,7 +1459,7 @@ } }, { - "filename": "15s-mega", + "filename": "15-mega", "rotated": false, "trimmed": true, "sourceSize": { @@ -1668,6 +1479,27 @@ "h": 26 } }, + { + "filename": "15s-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 27, + "h": 26 + }, + "frame": { + "x": 32, + "y": 219, + "w": 27, + "h": 26 + } + }, { "filename": "52-gigantamax", "rotated": false, @@ -1684,7 +1516,7 @@ }, "frame": { "x": 32, - "y": 219, + "y": 245, "w": 23, "h": 30 } @@ -1705,7 +1537,7 @@ }, "frame": { "x": 32, - "y": 249, + "y": 275, "w": 23, "h": 30 } @@ -1724,27 +1556,6 @@ "w": 21, "h": 30 }, - "frame": { - "x": 32, - "y": 279, - "w": 21, - "h": 30 - } - }, - { - "filename": "25s-gigantamax", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 21, - "h": 30 - }, "frame": { "x": 59, "y": 161, @@ -1753,7 +1564,7 @@ } }, { - "filename": "150-mega-y", + "filename": "25s-gigantamax", "rotated": false, "trimmed": true, "sourceSize": { @@ -1763,18 +1574,123 @@ "spriteSourceSize": { "x": 10, "y": 0, - "w": 20, + "w": 21, "h": 30 }, "frame": { "x": 59, "y": 191, - "w": 20, + "w": 21, "h": 30 } }, { - "filename": "80s-mega", + "filename": "9", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 59, + "y": 221, + "w": 25, + "h": 24 + } + }, + { + "filename": "64s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 55, + "y": 245, + "w": 29, + "h": 25 + } + }, + { + "filename": "85", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 55, + "y": 270, + "w": 29, + "h": 25 + } + }, + { + "filename": "22s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 55, + "y": 295, + "w": 30, + "h": 22 + } + }, + { + "filename": "31", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 32, + "y": 305, + "w": 23, + "h": 23 + } + }, + { + "filename": "80-mega", "rotated": false, "trimmed": true, "sourceSize": { @@ -1788,12 +1704,54 @@ "h": 26 }, "frame": { - "x": 55, - "y": 221, + "x": 31, + "y": 328, "w": 25, "h": 26 } }, + { + "filename": "85s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 56, + "y": 317, + "w": 29, + "h": 25 + } + }, + { + "filename": "9s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 31, + "y": 354, + "w": 25, + "h": 24 + } + }, { "filename": "97", "rotated": false, @@ -1809,12 +1767,264 @@ "h": 26 }, "frame": { - "x": 55, - "y": 247, + "x": 56, + "y": 342, "w": 27, "h": 26 } }, + { + "filename": "97s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 27, + "h": 26 + }, + "frame": { + "x": 30, + "y": 378, + "w": 27, + "h": 26 + } + }, + { + "filename": "80s-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 25, + "h": 26 + }, + "frame": { + "x": 30, + "y": 404, + "w": 25, + "h": 26 + } + }, + { + "filename": "109", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 26 + }, + "frame": { + "x": 30, + "y": 430, + "w": 25, + "h": 26 + } + }, + { + "filename": "109s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 26 + }, + "frame": { + "x": 30, + "y": 456, + "w": 25, + "h": 26 + } + }, + { + "filename": "89", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 30, + "y": 482, + "w": 26, + "h": 25 + } + }, + { + "filename": "89s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 30, + "y": 507, + "w": 26, + "h": 25 + } + }, + { + "filename": "143", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 27, + "h": 24 + }, + "frame": { + "x": 30, + "y": 532, + "w": 27, + "h": 24 + } + }, + { + "filename": "143s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 27, + "h": 24 + }, + "frame": { + "x": 30, + "y": 556, + "w": 27, + "h": 24 + } + }, + { + "filename": "57", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 28, + "h": 23 + }, + "frame": { + "x": 30, + "y": 580, + "w": 28, + "h": 23 + } + }, + { + "filename": "57s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 28, + "h": 23 + }, + "frame": { + "x": 30, + "y": 603, + "w": 28, + "h": 23 + } + }, + { + "filename": "71", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 28, + "h": 23 + }, + "frame": { + "x": 30, + "y": 626, + "w": 28, + "h": 23 + } + }, + { + "filename": "150-mega-y", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 20, + "h": 30 + }, + "frame": { + "x": 57, + "y": 368, + "w": 20, + "h": 30 + } + }, { "filename": "150s-mega-y", "rotated": false, @@ -1837,7 +2047,7 @@ } }, { - "filename": "97s", + "filename": "151", "rotated": false, "trimmed": true, "sourceSize": { @@ -1845,20 +2055,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 27, - "h": 26 + "x": 9, + "y": 2, + "w": 23, + "h": 25 }, "frame": { "x": 80, "y": 161, - "w": 27, - "h": 26 + "w": 23, + "h": 25 } }, { - "filename": "109", + "filename": "151s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1866,20 +2076,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, + "x": 9, + "y": 2, + "w": 23, + "h": 25 + }, + "frame": { + "x": 80, + "y": 186, + "w": 23, + "h": 25 + } + }, + { + "filename": "150-mega-x", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 21, "h": 26 }, "frame": { "x": 103, "y": 130, - "w": 25, + "w": 21, "h": 26 } }, { - "filename": "64s", + "filename": "115-mega", "rotated": false, "trimmed": true, "sourceSize": { @@ -1887,230 +2118,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 128, - "y": 129, - "w": 29, - "h": 25 - } - }, - { - "filename": "25-beauty-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 157, - "y": 129, - "w": 22, - "h": 25 - } - }, - { - "filename": "109s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 26 - }, - "frame": { - "x": 107, - "y": 156, - "w": 25, - "h": 26 - } - }, - { - "filename": "85", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 132, - "y": 154, - "w": 29, - "h": 25 - } - }, - { - "filename": "25s-beauty-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 161, - "y": 154, - "w": 22, - "h": 25 - } - }, - { - "filename": "89", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 183, - "y": 149, - "w": 26, - "h": 25 - } - }, - { - "filename": "56", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 55, - "y": 273, - "w": 28, - "h": 20 - } - }, - { - "filename": "62", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 29, - "h": 21 - }, - "frame": { - "x": 53, - "y": 293, - "w": 29, - "h": 21 - } - }, - { - "filename": "62s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 29, - "h": 21 - }, - "frame": { - "x": 209, - "y": 170, - "w": 29, - "h": 21 - } - }, - { - "filename": "48", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 17, - "h": 26 - }, - "frame": { - "x": 238, - "y": 174, - "w": 17, - "h": 26 - } - }, - { - "filename": "25-partner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, + "x": 4, "y": 6, - "w": 26, + "w": 30, "h": 22 }, "frame": { - "x": 183, - "y": 174, - "w": 26, + "x": 124, + "y": 129, + "w": 30, "h": 22 } }, { - "filename": "85s", + "filename": "115s-mega", "rotated": false, "trimmed": true, "sourceSize": { @@ -2118,20 +2139,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 29, - "h": 25 + "x": 4, + "y": 6, + "w": 30, + "h": 22 }, "frame": { - "x": 209, - "y": 191, - "w": 29, - "h": 25 + "x": 154, + "y": 129, + "w": 30, + "h": 22 } }, { - "filename": "48s", + "filename": "150s-mega-x", "rotated": false, "trimmed": true, "sourceSize": { @@ -2139,18 +2160,39 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, + "x": 9, "y": 2, - "w": 17, + "w": 21, "h": 26 }, "frame": { - "x": 238, - "y": 200, - "w": 17, + "x": 103, + "y": 156, + "w": 21, "h": 26 } }, + { + "filename": "71s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 28, + "h": 23 + }, + "frame": { + "x": 124, + "y": 151, + "w": 28, + "h": 23 + } + }, { "filename": "142", "rotated": false, @@ -2166,14 +2208,14 @@ "h": 22 }, "frame": { - "x": 132, - "y": 179, + "x": 152, + "y": 151, "w": 29, "h": 22 } }, { - "filename": "5", + "filename": "8", "rotated": false, "trimmed": true, "sourceSize": { @@ -2181,78 +2223,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 161, - "y": 179, - "w": 22, - "h": 23 - } - }, - { - "filename": "25s-partner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, + "x": 10, "y": 6, - "w": 26, + "w": 24, "h": 22 }, "frame": { - "x": 183, - "y": 196, - "w": 26, - "h": 22 - } - }, - { - "filename": "9", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 107, - "y": 182, - "w": 25, - "h": 24 - } - }, - { - "filename": "68", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 80, - "y": 187, - "w": 27, + "x": 184, + "y": 129, + "w": 24, "h": 22 } }, @@ -2271,12 +2250,75 @@ "h": 22 }, "frame": { - "x": 209, - "y": 216, + "x": 208, + "y": 128, "w": 29, "h": 22 } }, + { + "filename": "48s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 2, + "w": 17, + "h": 26 + }, + "frame": { + "x": 237, + "y": 129, + "w": 17, + "h": 26 + } + }, + { + "filename": "68", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 181, + "y": 151, + "w": 27, + "h": 22 + } + }, + { + "filename": "62", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 29, + "h": 21 + }, + "frame": { + "x": 208, + "y": 150, + "w": 29, + "h": 21 + } + }, { "filename": "40", "rotated": false, @@ -2292,56 +2334,14 @@ "h": 25 }, "frame": { - "x": 238, - "y": 226, + "x": 237, + "y": 155, "w": 17, "h": 25 } }, { - "filename": "89s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 80, - "y": 209, - "w": 26, - "h": 25 - } - }, - { - "filename": "9s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 82, - "y": 234, - "w": 25, - "h": 24 - } - }, - { - "filename": "81s", + "filename": "25-beauty-cosplay", "rotated": false, "trimmed": true, "sourceSize": { @@ -2350,19 +2350,40 @@ }, "spriteSourceSize": { "x": 9, - "y": 12, - "w": 23, - "h": 15 + "y": 3, + "w": 22, + "h": 25 }, "frame": { - "x": 82, - "y": 258, - "w": 23, - "h": 15 + "x": 103, + "y": 182, + "w": 22, + "h": 25 } }, { - "filename": "5s", + "filename": "25s-beauty-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 103, + "y": 182, + "w": 22, + "h": 25 + } + }, + { + "filename": "80", "rotated": false, "trimmed": true, "sourceSize": { @@ -2372,18 +2393,18 @@ "spriteSourceSize": { "x": 9, "y": 5, - "w": 22, + "w": 27, "h": 23 }, "frame": { - "x": 83, - "y": 273, - "w": 22, + "x": 125, + "y": 174, + "w": 27, "h": 23 } }, { - "filename": "8", + "filename": "62s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2391,15 +2412,36 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 6, + "y": 7, + "w": 29, + "h": 21 + }, + "frame": { + "x": 152, + "y": 173, + "w": 29, + "h": 21 + } + }, + { + "filename": "68s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, "y": 6, - "w": 24, + "w": 27, "h": 22 }, "frame": { - "x": 82, - "y": 296, - "w": 24, + "x": 181, + "y": 173, + "w": 27, "h": 22 } }, @@ -2418,71 +2460,8 @@ "h": 19 }, "frame": { - "x": 132, - "y": 201, - "w": 29, - "h": 19 - } - }, - { - "filename": "44", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 161, - "y": 202, - "w": 22, - "h": 21 - } - }, - { - "filename": "42", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 26, - "h": 22 - }, - "frame": { - "x": 183, - "y": 218, - "w": 26, - "h": 22 - } - }, - { - "filename": "145s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 29, - "h": 19 - }, - "frame": { - "x": 209, - "y": 238, + "x": 208, + "y": 171, "w": 29, "h": 19 } @@ -2502,56 +2481,14 @@ "h": 25 }, "frame": { - "x": 238, - "y": 251, + "x": 237, + "y": 180, "w": 17, "h": 25 } }, { - "filename": "15", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 23 - }, - "frame": { - "x": 107, - "y": 206, - "w": 25, - "h": 23 - } - }, - { - "filename": "26", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 107, - "y": 229, - "w": 25, - "h": 24 - } - }, - { - "filename": "57", + "filename": "145s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2560,267 +2497,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 132, - "y": 220, - "w": 28, - "h": 23 - } - }, - { - "filename": "31", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 160, - "y": 223, - "w": 23, - "h": 23 - } - }, - { - "filename": "42s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 26, - "h": 22 - }, - "frame": { - "x": 183, - "y": 240, - "w": 26, - "h": 22 - } - }, - { - "filename": "56s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 132, - "y": 243, - "w": 28, - "h": 20 - } - }, - { - "filename": "31s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 160, - "y": 246, - "w": 23, - "h": 23 - } - }, - { - "filename": "15s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 23 - }, - "frame": { - "x": 107, - "y": 253, - "w": 25, - "h": 23 - } - }, - { - "filename": "57s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 132, - "y": 263, - "w": 28, - "h": 23 - } - }, - { - "filename": "144", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, "y": 7, - "w": 27, - "h": 20 + "w": 29, + "h": 19 }, "frame": { - "x": 105, - "y": 276, - "w": 27, - "h": 20 - } - }, - { - "filename": "67", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 106, - "y": 296, - "w": 26, - "h": 22 - } - }, - { - "filename": "71", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 132, - "y": 286, - "w": 28, - "h": 23 - } - }, - { - "filename": "151", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 23, - "h": 25 - }, - "frame": { - "x": 160, - "y": 269, - "w": 23, - "h": 25 - } - }, - { - "filename": "143", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 27, - "h": 24 - }, - "frame": { - "x": 183, - "y": 262, - "w": 27, - "h": 24 - } - }, - { - "filename": "71s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 210, - "y": 257, - "w": 28, - "h": 23 + "x": 208, + "y": 190, + "w": 29, + "h": 19 } }, { @@ -2838,119 +2523,14 @@ "h": 24 }, "frame": { - "x": 238, - "y": 276, + "x": 237, + "y": 205, "w": 17, "h": 24 } }, { - "filename": "98", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 21 - }, - "frame": { - "x": 210, - "y": 280, - "w": 28, - "h": 21 - } - }, - { - "filename": "68s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 183, - "y": 286, - "w": 27, - "h": 22 - } - }, - { - "filename": "49", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 160, - "y": 294, - "w": 23, - "h": 24 - } - }, - { - "filename": "98s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 21 - }, - "frame": { - "x": 132, - "y": 309, - "w": 28, - "h": 21 - } - }, - { - "filename": "103s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 238, - "y": 300, - "w": 17, - "h": 24 - } - }, - { - "filename": "146", + "filename": "56", "rotated": false, "trimmed": true, "sourceSize": { @@ -2961,97 +2541,13 @@ "x": 7, "y": 8, "w": 28, - "h": 18 + "h": 20 }, "frame": { - "x": 210, - "y": 301, + "x": 125, + "y": 197, "w": 28, - "h": 18 - } - }, - { - "filename": "80", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 183, - "y": 308, - "w": 27, - "h": 23 - } - }, - { - "filename": "49s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 160, - "y": 318, - "w": 23, - "h": 24 - } - }, - { - "filename": "146s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 18 - }, - "frame": { - "x": 210, - "y": 319, - "w": 28, - "h": 18 - } - }, - { - "filename": "43", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 17, - "h": 19 - }, - "frame": { - "x": 238, - "y": 324, - "w": 17, - "h": 19 + "h": 20 } }, { @@ -3069,14 +2565,14 @@ "h": 23 }, "frame": { - "x": 183, - "y": 331, + "x": 153, + "y": 194, "w": 27, "h": 23 } }, { - "filename": "143s", + "filename": "98", "rotated": false, "trimmed": true, "sourceSize": { @@ -3084,62 +2580,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 27, - "h": 24 - }, - "frame": { - "x": 210, - "y": 337, - "w": 27, - "h": 24 - } - }, - { - "filename": "23", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, + "x": 7, "y": 7, - "w": 18, + "w": 28, "h": 21 }, "frame": { - "x": 237, - "y": 343, - "w": 18, + "x": 180, + "y": 195, + "w": 28, "h": 21 } }, { - "filename": "2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 32, - "y": 309, - "w": 21, - "h": 20 - } - }, - { - "filename": "150-mega-x", + "filename": "5", "rotated": false, "trimmed": true, "sourceSize": { @@ -3148,313 +2602,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 2, - "w": 21, - "h": 26 - }, - "frame": { - "x": 31, - "y": 329, - "w": 21, - "h": 26 - } - }, - { - "filename": "144s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 20 - }, - "frame": { - "x": 53, - "y": 314, - "w": 27, - "h": 20 - } - }, - { - "filename": "67s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 52, - "y": 334, - "w": 26, - "h": 22 - } - }, - { - "filename": "75", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 80, - "y": 318, - "w": 26, - "h": 22 - } - }, - { - "filename": "75s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 106, - "y": 318, - "w": 26, - "h": 22 - } - }, - { - "filename": "76", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 78, - "y": 340, - "w": 26, - "h": 21 - } - }, - { - "filename": "76s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 104, - "y": 340, - "w": 26, - "h": 21 - } - }, - { - "filename": "2s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 31, - "y": 355, - "w": 21, - "h": 20 - } - }, - { - "filename": "83", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 52, - "y": 356, - "w": 26, - "h": 22 - } - }, - { - "filename": "129", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, "y": 5, "w": 22, - "h": 24 - }, - "frame": { - "x": 30, - "y": 375, - "w": 22, - "h": 24 - } - }, - { - "filename": "83s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 52, - "y": 378, - "w": 26, - "h": 22 - } - }, - { - "filename": "26s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 78, - "y": 361, - "w": 25, - "h": 24 - } - }, - { - "filename": "91", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 24 + "h": 23 }, "frame": { "x": 103, - "y": 361, - "w": 25, - "h": 24 - } - }, - { - "filename": "129s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, + "y": 207, "w": 22, - "h": 24 - }, - "frame": { - "x": 30, - "y": 399, - "w": 22, - "h": 24 - } - }, - { - "filename": "18", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 52, - "y": 400, - "w": 25, "h": 23 } }, { - "filename": "91s", + "filename": "30", "rotated": false, "trimmed": true, "sourceSize": { @@ -3462,16 +2622,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 24 + "x": 11, + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 30, - "y": 423, - "w": 25, - "h": 24 + "x": 84, + "y": 211, + "w": 19, + "h": 22 } }, { @@ -3489,8 +2649,8 @@ "h": 24 }, "frame": { - "x": 30, - "y": 447, + "x": 84, + "y": 233, "w": 24, "h": 24 } @@ -3510,14 +2670,14 @@ "h": 24 }, "frame": { - "x": 30, - "y": 471, + "x": 84, + "y": 257, "w": 24, "h": 24 } }, { - "filename": "94", + "filename": "56s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3526,19 +2686,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 4, - "w": 24, - "h": 24 + "y": 8, + "w": 28, + "h": 20 }, "frame": { - "x": 30, - "y": 495, - "w": 24, - "h": 24 + "x": 125, + "y": 217, + "w": 28, + "h": 20 } }, { - "filename": "94s", + "filename": "98s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3547,19 +2707,61 @@ }, "spriteSourceSize": { "x": 7, + "y": 7, + "w": 28, + "h": 21 + }, + "frame": { + "x": 153, + "y": 217, + "w": 28, + "h": 21 + } + }, + { + "filename": "25-partner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 181, + "y": 216, + "w": 26, + "h": 22 + } + }, + { + "filename": "103s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, "y": 4, - "w": 24, + "w": 17, "h": 24 }, "frame": { - "x": 30, - "y": 519, - "w": 24, + "x": 108, + "y": 230, + "w": 17, "h": 24 } }, { - "filename": "151s", + "filename": "146", "rotated": false, "trimmed": true, "sourceSize": { @@ -3567,20 +2769,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 23, - "h": 25 + "x": 7, + "y": 8, + "w": 28, + "h": 18 }, "frame": { - "x": 30, - "y": 543, - "w": 23, - "h": 25 + "x": 125, + "y": 237, + "w": 28, + "h": 18 } }, { - "filename": "150s-mega-x", + "filename": "146s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3588,20 +2790,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 21, - "h": 26 + "x": 7, + "y": 8, + "w": 28, + "h": 18 }, "frame": { - "x": 30, - "y": 568, - "w": 21, - "h": 26 + "x": 153, + "y": 238, + "w": 28, + "h": 18 } }, { - "filename": "18s", + "filename": "25s-partner", "rotated": false, "trimmed": true, "sourceSize": { @@ -3609,20 +2811,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 + "x": 7, + "y": 6, + "w": 26, + "h": 22 }, "frame": { - "x": 55, - "y": 423, - "w": 25, - "h": 23 + "x": 181, + "y": 238, + "w": 26, + "h": 22 } }, { - "filename": "38", + "filename": "43", "rotated": false, "trimmed": true, "sourceSize": { @@ -3630,20 +2832,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 + "x": 13, + "y": 9, + "w": 17, + "h": 19 }, "frame": { - "x": 30, - "y": 594, - "w": 24, - "h": 23 + "x": 108, + "y": 254, + "w": 17, + "h": 19 } }, { - "filename": "38s", + "filename": "144", "rotated": false, "trimmed": true, "sourceSize": { @@ -3651,104 +2853,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 30, - "y": 617, - "w": 24, - "h": 23 - } - }, - { - "filename": "77", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 30, - "y": 640, - "w": 24, - "h": 23 - } - }, - { - "filename": "77s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 31, - "y": 663, - "w": 24, - "h": 23 - } - }, - { - "filename": "86", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 31, - "y": 686, - "w": 25, - "h": 23 - } - }, - { - "filename": "20", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, + "x": 7, "y": 7, - "w": 25, - "h": 21 + "w": 27, + "h": 20 }, "frame": { - "x": 78, - "y": 385, - "w": 25, - "h": 21 + "x": 125, + "y": 255, + "w": 27, + "h": 20 } }, { - "filename": "20s", + "filename": "144s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3756,20 +2874,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, + "x": 7, "y": 7, - "w": 25, - "h": 21 + "w": 27, + "h": 20 }, "frame": { - "x": 103, - "y": 385, - "w": 25, - "h": 21 + "x": 152, + "y": 256, + "w": 27, + "h": 20 } }, { - "filename": "7", + "filename": "42", "rotated": false, "trimmed": true, "sourceSize": { @@ -3778,19 +2896,61 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, - "w": 21, - "h": 17 + "y": 5, + "w": 26, + "h": 22 }, "frame": { - "x": 77, - "y": 406, - "w": 21, - "h": 17 + "x": 179, + "y": 260, + "w": 26, + "h": 22 } }, { - "filename": "28", + "filename": "26", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 31, + "y": 649, + "w": 25, + "h": 24 + } + }, + { + "filename": "26s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 31, + "y": 673, + "w": 25, + "h": 24 + } + }, + { + "filename": "15", "rotated": false, "trimmed": true, "sourceSize": { @@ -3799,103 +2959,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, + "y": 4, "w": 25, - "h": 22 + "h": 23 }, "frame": { - "x": 98, - "y": 406, + "x": 31, + "y": 697, "w": 25, - "h": 22 + "h": 23 } }, { - "filename": "23s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 18, - "h": 21 - }, - "frame": { - "x": 80, - "y": 423, - "w": 18, - "h": 21 - } - }, - { - "filename": "28s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 98, - "y": 428, - "w": 25, - "h": 22 - } - }, - { - "filename": "55", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 132, - "y": 330, - "w": 25, - "h": 21 - } - }, - { - "filename": "55s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 130, - "y": 351, - "w": 25, - "h": 21 - } - }, - { - "filename": "86s", + "filename": "91", "rotated": false, "trimmed": true, "sourceSize": { @@ -3906,38 +2982,17 @@ "x": 8, "y": 5, "w": 25, - "h": 23 + "h": 24 }, "frame": { - "x": 128, - "y": 372, + "x": 29, + "y": 720, "w": 25, - "h": 23 + "h": 24 } }, { - "filename": "73", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 25, - "h": 22 - }, - "frame": { - "x": 128, - "y": 395, - "w": 25, - "h": 22 - } - }, - { - "filename": "87", + "filename": "91s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3948,118 +3003,13 @@ "x": 8, "y": 5, "w": 25, - "h": 23 + "h": 24 }, "frame": { - "x": 123, - "y": 417, + "x": 29, + "y": 744, "w": 25, - "h": 23 - } - }, - { - "filename": "73s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 25, - "h": 22 - }, - "frame": { - "x": 123, - "y": 440, - "w": 25, - "h": 22 - } - }, - { - "filename": "87s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 157, - "y": 342, - "w": 25, - "h": 23 - } - }, - { - "filename": "112", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 182, - "y": 354, - "w": 25, - "h": 23 - } - }, - { - "filename": "112s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 207, - "y": 361, - "w": 25, - "h": 23 - } - }, - { - "filename": "53", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 232, - "y": 364, - "w": 23, - "h": 22 + "h": 24 } }, { @@ -4077,14 +3027,14 @@ "h": 20 }, "frame": { - "x": 155, - "y": 365, + "x": 32, + "y": 768, "w": 25, "h": 20 } }, { - "filename": "149", + "filename": "42s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4092,20 +3042,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 25, + "x": 10, + "y": 5, + "w": 26, "h": 22 }, "frame": { - "x": 153, - "y": 385, - "w": 25, + "x": 208, + "y": 209, + "w": 26, "h": 22 } }, { - "filename": "119s", + "filename": "15s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4114,19 +3064,103 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, + "y": 4, "w": 25, - "h": 20 + "h": 23 }, "frame": { - "x": 153, - "y": 407, + "x": 207, + "y": 231, "w": 25, - "h": 20 + "h": 23 } }, { - "filename": "149s", + "filename": "129", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 232, + "y": 231, + "w": 22, + "h": 24 + } + }, + { + "filename": "49", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 85, + "y": 281, + "w": 23, + "h": 24 + } + }, + { + "filename": "49s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 85, + "y": 305, + "w": 23, + "h": 24 + } + }, + { + "filename": "43s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 17, + "h": 19 + }, + "frame": { + "x": 108, + "y": 273, + "w": 17, + "h": 19 + } + }, + { + "filename": "67", "rotated": false, "trimmed": true, "sourceSize": { @@ -4136,18 +3170,18 @@ "spriteSourceSize": { "x": 7, "y": 6, - "w": 25, + "w": 26, "h": 22 }, "frame": { - "x": 148, - "y": 427, - "w": 25, + "x": 125, + "y": 275, + "w": 26, "h": 22 } }, { - "filename": "128", + "filename": "67s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4155,20 +3189,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 25, - "h": 21 + "x": 7, + "y": 6, + "w": 26, + "h": 22 }, "frame": { - "x": 148, - "y": 449, - "w": 25, - "h": 21 + "x": 151, + "y": 276, + "w": 26, + "h": 22 } }, { - "filename": "128s", + "filename": "75", "rotated": false, "trimmed": true, "sourceSize": { @@ -4176,15 +3210,120 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 177, + "y": 282, + "w": 26, + "h": 22 + } + }, + { + "filename": "122", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 10, + "w": 17, + "h": 18 + }, + "frame": { + "x": 108, + "y": 292, + "w": 17, + "h": 18 + } + }, + { + "filename": "75s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 125, + "y": 297, + "w": 26, + "h": 22 + } + }, + { + "filename": "76", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, "y": 7, - "w": 25, + "w": 26, "h": 21 }, "frame": { - "x": 180, - "y": 377, - "w": 25, + "x": 151, + "y": 298, + "w": 26, + "h": 21 + } + }, + { + "filename": "122s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 10, + "w": 17, + "h": 18 + }, + "frame": { + "x": 108, + "y": 310, + "w": 17, + "h": 18 + } + }, + { + "filename": "76s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 26, + "h": 21 + }, + "frame": { + "x": 177, + "y": 304, + "w": 26, "h": 21 } }, @@ -4203,14 +3342,14 @@ "h": 22 }, "frame": { - "x": 178, - "y": 398, + "x": 85, + "y": 329, "w": 24, "h": 22 } }, { - "filename": "133-partner", + "filename": "83", "rotated": false, "trimmed": true, "sourceSize": { @@ -4218,20 +3357,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 25, - "h": 20 + "x": 8, + "y": 6, + "w": 26, + "h": 22 }, "frame": { - "x": 205, - "y": 384, - "w": 25, - "h": 20 + "x": 83, + "y": 351, + "w": 26, + "h": 22 } }, { - "filename": "133s-partner", + "filename": "18", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 77, + "y": 373, + "w": 25, + "h": 23 + } + }, + { + "filename": "94", "rotated": false, "trimmed": true, "sourceSize": { @@ -4240,15 +3400,183 @@ }, "spriteSourceSize": { "x": 7, - "y": 8, - "w": 25, - "h": 20 + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 230, - "y": 386, + "x": 109, + "y": 328, + "w": 24, + "h": 24 + } + }, + { + "filename": "18s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, "w": 25, - "h": 20 + "h": 23 + }, + "frame": { + "x": 109, + "y": 352, + "w": 25, + "h": 23 + } + }, + { + "filename": "83s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 102, + "y": 375, + "w": 26, + "h": 22 + } + }, + { + "filename": "86", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 133, + "y": 319, + "w": 25, + "h": 23 + } + }, + { + "filename": "30s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 158, + "y": 319, + "w": 19, + "h": 22 + } + }, + { + "filename": "20", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 177, + "y": 325, + "w": 25, + "h": 21 + } + }, + { + "filename": "94s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 134, + "y": 342, + "w": 24, + "h": 24 + } + }, + { + "filename": "33", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 158, + "y": 341, + "w": 19, + "h": 22 + } + }, + { + "filename": "20s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 177, + "y": 346, + "w": 25, + "h": 21 } }, { @@ -4266,8 +3594,8 @@ "h": 20 }, "frame": { - "x": 202, - "y": 404, + "x": 134, + "y": 366, "w": 24, "h": 20 } @@ -4287,12 +3615,390 @@ "h": 20 }, "frame": { - "x": 226, - "y": 406, + "x": 134, + "y": 366, "w": 24, "h": 20 } }, + { + "filename": "33s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 158, + "y": 363, + "w": 19, + "h": 22 + } + }, + { + "filename": "28", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 177, + "y": 367, + "w": 25, + "h": 22 + } + }, + { + "filename": "28s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 207, + "y": 254, + "w": 25, + "h": 22 + } + }, + { + "filename": "129s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 232, + "y": 255, + "w": 22, + "h": 24 + } + }, + { + "filename": "55", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 128, + "y": 386, + "w": 25, + "h": 21 + } + }, + { + "filename": "38", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 153, + "y": 386, + "w": 24, + "h": 23 + } + }, + { + "filename": "55s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 177, + "y": 389, + "w": 25, + "h": 21 + } + }, + { + "filename": "73", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 25, + "h": 22 + }, + "frame": { + "x": 205, + "y": 276, + "w": 25, + "h": 22 + } + }, + { + "filename": "38s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 230, + "y": 279, + "w": 24, + "h": 23 + } + }, + { + "filename": "86s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 203, + "y": 298, + "w": 25, + "h": 23 + } + }, + { + "filename": "73s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 25, + "h": 22 + }, + "frame": { + "x": 228, + "y": 302, + "w": 25, + "h": 22 + } + }, + { + "filename": "87", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 203, + "y": 321, + "w": 25, + "h": 23 + } + }, + { + "filename": "87s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 202, + "y": 344, + "w": 25, + "h": 23 + } + }, + { + "filename": "112", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 202, + "y": 367, + "w": 25, + "h": 23 + } + }, + { + "filename": "112s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 228, + "y": 324, + "w": 25, + "h": 23 + } + }, + { + "filename": "77", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 227, + "y": 347, + "w": 24, + "h": 23 + } + }, + { + "filename": "119s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 25, + "h": 20 + }, + "frame": { + "x": 202, + "y": 390, + "w": 25, + "h": 20 + } + }, + { + "filename": "77s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 227, + "y": 370, + "w": 24, + "h": 23 + } + }, { "filename": "72", "rotated": false, @@ -4308,12 +4014,138 @@ "h": 22 }, "frame": { - "x": 178, - "y": 420, + "x": 227, + "y": 393, "w": 24, "h": 22 } }, + { + "filename": "128", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 77, + "y": 396, + "w": 25, + "h": 21 + } + }, + { + "filename": "1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 20, + "h": 19 + }, + "frame": { + "x": 57, + "y": 398, + "w": 20, + "h": 19 + } + }, + { + "filename": "128s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 102, + "y": 397, + "w": 25, + "h": 21 + } + }, + { + "filename": "149", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 55, + "y": 417, + "w": 25, + "h": 22 + } + }, + { + "filename": "149s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 55, + "y": 439, + "w": 25, + "h": 22 + } + }, + { + "filename": "5s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 80, + "y": 417, + "w": 22, + "h": 23 + } + }, { "filename": "72s", "rotated": false, @@ -4329,12 +4161,75 @@ "h": 22 }, "frame": { - "x": 202, - "y": 424, + "x": 102, + "y": 418, "w": 24, "h": 22 } }, + { + "filename": "131", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 55, + "y": 461, + "w": 24, + "h": 21 + } + }, + { + "filename": "31s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 56, + "y": 482, + "w": 23, + "h": 23 + } + }, + { + "filename": "45", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 56, + "y": 505, + "w": 22, + "h": 23 + } + }, { "filename": "82", "rotated": false, @@ -4350,8 +4245,8 @@ "h": 22 }, "frame": { - "x": 226, - "y": 426, + "x": 80, + "y": 440, "w": 24, "h": 22 } @@ -4371,8 +4266,8 @@ "h": 22 }, "frame": { - "x": 173, - "y": 442, + "x": 79, + "y": 462, "w": 24, "h": 22 } @@ -4392,8 +4287,8 @@ "h": 22 }, "frame": { - "x": 197, - "y": 446, + "x": 79, + "y": 484, "w": 24, "h": 22 } @@ -4413,138 +4308,12 @@ "h": 22 }, "frame": { - "x": 221, - "y": 448, + "x": 78, + "y": 506, "w": 24, "h": 22 } }, - { - "filename": "102", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 173, - "y": 464, - "w": 24, - "h": 18 - } - }, - { - "filename": "102s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 197, - "y": 468, - "w": 24, - "h": 18 - } - }, - { - "filename": "111", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 24, - "h": 20 - }, - "frame": { - "x": 221, - "y": 470, - "w": 24, - "h": 20 - } - }, - { - "filename": "16", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 18, - "h": 17 - }, - "frame": { - "x": 80, - "y": 444, - "w": 18, - "h": 17 - } - }, - { - "filename": "111s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 24, - "h": 20 - }, - "frame": { - "x": 56, - "y": 446, - "w": 24, - "h": 20 - } - }, - { - "filename": "45", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 54, - "y": 466, - "w": 22, - "h": 23 - } - }, { "filename": "45s", "rotated": false, @@ -4560,14 +4329,14 @@ "h": 23 }, "frame": { - "x": 54, - "y": 489, + "x": 104, + "y": 440, "w": 22, "h": 23 } }, { - "filename": "126", + "filename": "53", "rotated": false, "trimmed": true, "sourceSize": { @@ -4575,79 +4344,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 22, - "h": 23 + "x": 8, + "y": 6, + "w": 23, + "h": 22 }, "frame": { - "x": 54, - "y": 512, - "w": 22, - "h": 23 - } - }, - { - "filename": "117", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 24, - "h": 20 - }, - "frame": { - "x": 98, - "y": 450, - "w": 24, - "h": 20 - } - }, - { - "filename": "16s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 18, - "h": 17 - }, - "frame": { - "x": 80, - "y": 461, - "w": 18, - "h": 17 - } - }, - { - "filename": "126s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 76, - "y": 478, - "w": 22, - "h": 23 + "x": 103, + "y": 463, + "w": 23, + "h": 22 } }, { @@ -4665,12 +4371,117 @@ "h": 22 }, "frame": { - "x": 98, - "y": 470, + "x": 103, + "y": 485, "w": 23, "h": 22 } }, + { + "filename": "131s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 102, + "y": 507, + "w": 24, + "h": 21 + } + }, + { + "filename": "126", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 57, + "y": 528, + "w": 22, + "h": 23 + } + }, + { + "filename": "126s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 57, + "y": 551, + "w": 22, + "h": 23 + } + }, + { + "filename": "133-partner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 25, + "h": 20 + }, + "frame": { + "x": 79, + "y": 528, + "w": 25, + "h": 20 + } + }, + { + "filename": "133s-partner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 25, + "h": 20 + }, + "frame": { + "x": 79, + "y": 548, + "w": 25, + "h": 20 + } + }, { "filename": "47", "rotated": false, @@ -4686,35 +4497,14 @@ "h": 22 }, "frame": { - "x": 76, - "y": 501, + "x": 104, + "y": 528, "w": 22, "h": 22 } }, { - "filename": "47s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 98, - "y": 492, - "w": 22, - "h": 22 - } - }, - { - "filename": "44s", + "filename": "44", "rotated": false, "trimmed": true, "sourceSize": { @@ -4728,138 +4518,12 @@ "h": 21 }, "frame": { - "x": 76, - "y": 523, + "x": 104, + "y": 550, "w": 22, "h": 21 } }, - { - "filename": "51", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 98, - "y": 514, - "w": 22, - "h": 22 - } - }, - { - "filename": "46", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 54, - "y": 535, - "w": 22, - "h": 20 - } - }, - { - "filename": "63", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 21 - }, - "frame": { - "x": 53, - "y": 555, - "w": 23, - "h": 21 - } - }, - { - "filename": "51s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 76, - "y": 544, - "w": 22, - "h": 22 - } - }, - { - "filename": "139", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 98, - "y": 536, - "w": 22, - "h": 22 - } - }, - { - "filename": "108", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 23, - "h": 18 - }, - "frame": { - "x": 51, - "y": 576, - "w": 23, - "h": 18 - } - }, { "filename": "24", "rotated": false, @@ -4875,8 +4539,8 @@ "h": 23 }, "frame": { - "x": 54, - "y": 594, + "x": 58, + "y": 574, "w": 20, "h": 23 } @@ -4896,8 +4560,8 @@ "h": 23 }, "frame": { - "x": 54, - "y": 617, + "x": 58, + "y": 597, "w": 20, "h": 23 } @@ -4917,77 +4581,14 @@ "h": 23 }, "frame": { - "x": 54, - "y": 640, + "x": 58, + "y": 620, "w": 20, "h": 23 } }, { - "filename": "36s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 55, - "y": 663, - "w": 20, - "h": 23 - } - }, - { - "filename": "150", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 56, - "y": 686, - "w": 20, - "h": 23 - } - }, - { - "filename": "63s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 21 - }, - "frame": { - "x": 53, - "y": 709, - "w": 23, - "h": 21 - } - }, - { - "filename": "106", + "filename": "74", "rotated": false, "trimmed": true, "sourceSize": { @@ -4996,40 +4597,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 9, - "w": 23, - "h": 19 + "y": 13, + "w": 24, + "h": 15 }, "frame": { - "x": 53, - "y": 730, - "w": 23, - "h": 19 + "x": 127, + "y": 407, + "w": 24, + "h": 15 } }, { - "filename": "150s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 56, - "y": 749, - "w": 20, - "h": 23 - } - }, - { - "filename": "108s", + "filename": "47s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5038,19 +4618,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 11, - "w": 23, - "h": 18 + "y": 6, + "w": 22, + "h": 22 }, "frame": { - "x": 71, - "y": 772, - "w": 23, - "h": 18 + "x": 126, + "y": 422, + "w": 22, + "h": 22 } }, { - "filename": "46s", + "filename": "51", "rotated": false, "trimmed": true, "sourceSize": { @@ -5059,15 +4639,57 @@ }, "spriteSourceSize": { "x": 9, - "y": 8, + "y": 6, "w": 22, - "h": 20 + "h": 22 }, "frame": { - "x": 76, - "y": 566, + "x": 126, + "y": 444, "w": 22, - "h": 20 + "h": 22 + } + }, + { + "filename": "51s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 126, + "y": 466, + "w": 22, + "h": 22 + } + }, + { + "filename": "139", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 126, + "y": 488, + "w": 22, + "h": 22 } }, { @@ -5085,14 +4707,14 @@ "h": 22 }, "frame": { - "x": 98, - "y": 558, + "x": 126, + "y": 510, "w": 22, "h": 22 } }, { - "filename": "131", + "filename": "148", "rotated": false, "trimmed": true, "sourceSize": { @@ -5101,19 +4723,40 @@ }, "spriteSourceSize": { "x": 8, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 126, + "y": 532, + "w": 22, + "h": 22 + } + }, + { + "filename": "44s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, "y": 7, - "w": 24, + "w": 22, "h": 21 }, "frame": { - "x": 74, - "y": 586, - "w": 24, + "x": 126, + "y": 554, + "w": 22, "h": 21 } }, { - "filename": "131s", + "filename": "74s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5122,14 +4765,56 @@ }, "spriteSourceSize": { "x": 8, - "y": 7, + "y": 13, "w": 24, + "h": 15 + }, + "frame": { + "x": 151, + "y": 409, + "w": 24, + "h": 15 + } + }, + { + "filename": "63", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, "h": 21 }, "frame": { - "x": 74, - "y": 607, - "w": 24, + "x": 148, + "y": 424, + "w": 23, + "h": 21 + } + }, + { + "filename": "63s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 21 + }, + "frame": { + "x": 148, + "y": 445, + "w": 23, "h": 21 } }, @@ -5148,117 +4833,12 @@ "h": 21 }, "frame": { - "x": 74, - "y": 628, + "x": 148, + "y": 466, "w": 23, "h": 21 } }, - { - "filename": "148", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 98, - "y": 580, - "w": 22, - "h": 22 - } - }, - { - "filename": "148s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 98, - "y": 602, - "w": 22, - "h": 22 - } - }, - { - "filename": "117s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 24, - "h": 20 - }, - "frame": { - "x": 122, - "y": 462, - "w": 24, - "h": 20 - } - }, - { - "filename": "118", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 146, - "y": 470, - "w": 24, - "h": 19 - } - }, - { - "filename": "118s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 121, - "y": 482, - "w": 24, - "h": 19 - } - }, { "filename": "92s", "rotated": false, @@ -5274,8 +4854,8 @@ "h": 21 }, "frame": { - "x": 120, - "y": 501, + "x": 148, + "y": 487, "w": 23, "h": 21 } @@ -5295,8 +4875,8 @@ "h": 21 }, "frame": { - "x": 120, - "y": 522, + "x": 148, + "y": 508, "w": 23, "h": 21 } @@ -5316,8 +4896,8 @@ "h": 21 }, "frame": { - "x": 120, - "y": 543, + "x": 148, + "y": 529, "w": 23, "h": 21 } @@ -5337,12 +4917,138 @@ "h": 21 }, "frame": { - "x": 120, - "y": 564, + "x": 148, + "y": 550, "w": 23, "h": 21 } }, + { + "filename": "102", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 10, + "w": 24, + "h": 18 + }, + "frame": { + "x": 175, + "y": 410, + "w": 24, + "h": 18 + } + }, + { + "filename": "102s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 10, + "w": 24, + "h": 18 + }, + "frame": { + "x": 199, + "y": 410, + "w": 24, + "h": 18 + } + }, + { + "filename": "111", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 24, + "h": 20 + }, + "frame": { + "x": 171, + "y": 428, + "w": 24, + "h": 20 + } + }, + { + "filename": "111s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 24, + "h": 20 + }, + "frame": { + "x": 171, + "y": 448, + "w": 24, + "h": 20 + } + }, + { + "filename": "117", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 24, + "h": 20 + }, + "frame": { + "x": 195, + "y": 428, + "w": 24, + "h": 20 + } + }, + { + "filename": "117s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 24, + "h": 20 + }, + "frame": { + "x": 171, + "y": 468, + "w": 24, + "h": 20 + } + }, { "filename": "127s", "rotated": false, @@ -5358,33 +5064,12 @@ "h": 21 }, "frame": { - "x": 120, - "y": 585, + "x": 195, + "y": 448, "w": 23, "h": 21 } }, - { - "filename": "106s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 120, - "y": 606, - "w": 23, - "h": 19 - } - }, { "filename": "134", "rotated": false, @@ -5400,8 +5085,8 @@ "h": 21 }, "frame": { - "x": 145, - "y": 489, + "x": 171, + "y": 488, "w": 23, "h": 21 } @@ -5421,8 +5106,8 @@ "h": 21 }, "frame": { - "x": 143, - "y": 510, + "x": 171, + "y": 509, "w": 23, "h": 21 } @@ -5442,8 +5127,8 @@ "h": 21 }, "frame": { - "x": 143, - "y": 531, + "x": 171, + "y": 530, "w": 23, "h": 21 } @@ -5463,14 +5148,14 @@ "h": 21 }, "frame": { - "x": 143, - "y": 552, + "x": 171, + "y": 551, "w": 23, "h": 21 } }, { - "filename": "58", + "filename": "106", "rotated": false, "trimmed": true, "sourceSize": { @@ -5478,209 +5163,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 143, - "y": 573, - "w": 21, - "h": 22 - } - }, - { - "filename": "58s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 143, - "y": 595, - "w": 21, - "h": 22 - } - }, - { - "filename": "50", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 74, - "y": 649, - "w": 15, - "h": 14 - } - }, - { - "filename": "30", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 75, - "y": 663, - "w": 19, - "h": 22 - } - }, - { - "filename": "30s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 76, - "y": 685, - "w": 19, - "h": 22 - } - }, - { - "filename": "33", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 76, - "y": 707, - "w": 19, - "h": 22 - } - }, - { - "filename": "33s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 76, - "y": 729, - "w": 19, - "h": 22 - } - }, - { - "filename": "19", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 76, - "y": 751, - "w": 20, - "h": 21 - } - }, - { - "filename": "84", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 94, - "y": 772, - "w": 21, - "h": 18 - } - }, - { - "filename": "4", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 8, "y": 9, - "w": 21, + "w": 23, "h": 19 }, "frame": { - "x": 143, - "y": 617, - "w": 21, + "x": 195, + "y": 469, + "w": 23, "h": 19 } }, { - "filename": "50s", + "filename": "148s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5688,146 +5184,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 89, - "y": 649, - "w": 15, - "h": 14 - } - }, - { - "filename": "125", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 8, "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 94, - "y": 663, - "w": 21, - "h": 22 - } - }, - { - "filename": "125s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 95, - "y": 685, - "w": 21, - "h": 22 - } - }, - { - "filename": "52", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 95, - "y": 707, - "w": 21, - "h": 21 - } - }, - { - "filename": "52s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 95, - "y": 728, - "w": 21, - "h": 21 - } - }, - { - "filename": "19s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 96, - "y": 749, - "w": 20, - "h": 21 - } - }, - { - "filename": "70", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, "w": 22, - "h": 20 + "h": 22 }, "frame": { - "x": 115, - "y": 770, + "x": 194, + "y": 488, "w": 22, - "h": 20 + "h": 22 } }, { - "filename": "54", + "filename": "36s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 194, + "y": 510, + "w": 20, + "h": 23 + } + }, + { + "filename": "150", "rotated": false, "trimmed": true, "sourceSize": { @@ -5836,288 +5227,15 @@ }, "spriteSourceSize": { "x": 12, - "y": 7, - "w": 18, - "h": 21 - }, - "frame": { - "x": 97, - "y": 628, - "w": 18, - "h": 21 - } - }, - { - "filename": "100", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 14, - "h": 14 - }, - "frame": { - "x": 104, - "y": 649, - "w": 14, - "h": 14 - } - }, - { - "filename": "105", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 115, - "y": 625, - "w": 22, - "h": 21 - } - }, - { - "filename": "1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, + "y": 5, "w": 20, - "h": 19 + "h": 23 }, "frame": { - "x": 118, - "y": 646, + "x": 194, + "y": 533, "w": 20, - "h": 19 - } - }, - { - "filename": "70s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 115, - "y": 665, - "w": 22, - "h": 20 - } - }, - { - "filename": "79", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 116, - "y": 685, - "w": 21, - "h": 21 - } - }, - { - "filename": "79s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 116, - "y": 706, - "w": 21, - "h": 21 - } - }, - { - "filename": "105s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 116, - "y": 727, - "w": 22, - "h": 21 - } - }, - { - "filename": "17", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 116, - "y": 748, - "w": 21, - "h": 20 - } - }, - { - "filename": "17s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 138, - "y": 636, - "w": 21, - "h": 20 - } - }, - { - "filename": "4s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 138, - "y": 656, - "w": 21, - "h": 19 - } - }, - { - "filename": "25-cool-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 137, - "y": 675, - "w": 21, - "h": 20 - } - }, - { - "filename": "25-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 137, - "y": 695, - "w": 21, - "h": 20 - } - }, - { - "filename": "135", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 138, - "y": 715, - "w": 20, - "h": 21 + "h": 23 } }, { @@ -6135,203 +5253,14 @@ "h": 19 }, "frame": { - "x": 138, - "y": 736, + "x": 194, + "y": 556, "w": 20, "h": 19 } }, { - "filename": "25-smart-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 137, - "y": 755, - "w": 21, - "h": 20 - } - }, - { - "filename": "60", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 137, - "y": 775, - "w": 20, - "h": 15 - } - }, - { - "filename": "60s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 157, - "y": 775, - "w": 20, - "h": 15 - } - }, - { - "filename": "54s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 18, - "h": 21 - }, - "frame": { - "x": 159, - "y": 636, - "w": 18, - "h": 21 - } - }, - { - "filename": "25-tough-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 657, - "w": 21, - "h": 20 - } - }, - { - "filename": "25", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 158, - "y": 677, - "w": 21, - "h": 20 - } - }, - { - "filename": "25s-cool-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 158, - "y": 697, - "w": 21, - "h": 20 - } - }, - { - "filename": "25s-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 158, - "y": 717, - "w": 21, - "h": 20 - } - }, - { - "filename": "25s-smart-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 158, - "y": 737, - "w": 21, - "h": 20 - } - }, - { - "filename": "84s", + "filename": "118", "rotated": false, "trimmed": true, "sourceSize": { @@ -6340,19 +5269,40 @@ }, "spriteSourceSize": { "x": 9, - "y": 10, - "w": 21, - "h": 18 + "y": 9, + "w": 24, + "h": 19 }, "frame": { - "x": 158, - "y": 757, - "w": 21, - "h": 18 + "x": 223, + "y": 415, + "w": 24, + "h": 19 } }, { - "filename": "69", + "filename": "118s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 9, + "w": 24, + "h": 19 + }, + "frame": { + "x": 219, + "y": 434, + "w": 24, + "h": 19 + } + }, + { + "filename": "58", "rotated": false, "trimmed": true, "sourceSize": { @@ -6361,393 +5311,78 @@ }, "spriteSourceSize": { "x": 11, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 177, - "y": 775, - "w": 20, - "h": 15 - } - }, - { - "filename": "61", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 170, - "y": 482, - "w": 22, - "h": 19 - } - }, - { - "filename": "61s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 192, - "y": 486, - "w": 22, - "h": 19 - } - }, - { - "filename": "7s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, + "y": 6, "w": 21, - "h": 17 + "h": 22 + }, + "frame": { + "x": 218, + "y": 453, + "w": 21, + "h": 22 + } + }, + { + "filename": "2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 218, + "y": 475, + "w": 21, + "h": 20 + } + }, + { + "filename": "81", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 23, + "h": 15 + }, + "frame": { + "x": 216, + "y": 495, + "w": 23, + "h": 15 + } + }, + { + "filename": "58s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 21, + "h": 22 }, "frame": { "x": 214, - "y": 490, + "y": 510, "w": 21, - "h": 17 - } - }, - { - "filename": "135s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 235, - "y": 490, - "w": 20, - "h": 21 - } - }, - { - "filename": "25s-tough-cosplay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 168, - "y": 501, - "w": 21, - "h": 20 - } - }, - { - "filename": "25s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 166, - "y": 521, - "w": 21, - "h": 20 - } - }, - { - "filename": "41", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 166, - "y": 541, - "w": 21, - "h": 20 - } - }, - { - "filename": "41s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 189, - "y": 505, - "w": 21, - "h": 20 - } - }, - { - "filename": "107", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 187, - "y": 525, - "w": 21, - "h": 20 - } - }, - { - "filename": "88", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 187, - "y": 545, - "w": 21, - "h": 18 - } - }, - { - "filename": "88s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 210, - "y": 507, - "w": 21, - "h": 18 - } - }, - { - "filename": "107s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 208, - "y": 525, - "w": 21, - "h": 20 - } - }, - { - "filename": "124", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 208, - "y": 545, - "w": 21, - "h": 20 - } - }, - { - "filename": "124s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 166, - "y": 561, - "w": 21, - "h": 20 - } - }, - { - "filename": "27", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 187, - "y": 563, - "w": 20, - "h": 18 - } - }, - { - "filename": "37", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 164, - "y": 581, - "w": 20, - "h": 20 - } - }, - { - "filename": "37s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 164, - "y": 601, - "w": 20, - "h": 20 - } - }, - { - "filename": "69s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 164, - "y": 621, - "w": 20, - "h": 15 + "h": 22 } }, { @@ -6765,12 +5400,33 @@ "h": 21 }, "frame": { - "x": 184, - "y": 581, + "x": 235, + "y": 510, "w": 19, "h": 21 } }, + { + "filename": "125", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 214, + "y": 532, + "w": 21, + "h": 22 + } + }, { "filename": "141s", "rotated": false, @@ -6786,77 +5442,14 @@ "h": 21 }, "frame": { - "x": 184, - "y": 602, + "x": 235, + "y": 531, "w": 19, "h": 21 } }, { - "filename": "27s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 207, - "y": 565, - "w": 20, - "h": 18 - } - }, - { - "filename": "104", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 203, - "y": 583, - "w": 20, - "h": 19 - } - }, - { - "filename": "104s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 203, - "y": 602, - "w": 20, - "h": 19 - } - }, - { - "filename": "21", + "filename": "52", "rotated": false, "trimmed": true, "sourceSize": { @@ -6865,78 +5458,15 @@ }, "spriteSourceSize": { "x": 11, - "y": 12, - "w": 19, - "h": 16 + "y": 7, + "w": 21, + "h": 21 }, "frame": { - "x": 184, - "y": 623, - "w": 19, - "h": 16 - } - }, - { - "filename": "147", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 203, - "y": 621, - "w": 20, - "h": 18 - } - }, - { - "filename": "147s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 177, - "y": 639, - "w": 20, - "h": 18 - } - }, - { - "filename": "32", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 180, - "y": 657, - "w": 18, - "h": 20 + "x": 214, + "y": 554, + "w": 21, + "h": 21 } }, { @@ -6954,8 +5484,8 @@ "h": 20 }, "frame": { - "x": 179, - "y": 677, + "x": 235, + "y": 552, "w": 19, "h": 20 } @@ -6975,308 +5505,14 @@ "h": 20 }, "frame": { - "x": 179, - "y": 697, + "x": 235, + "y": 572, "w": 19, "h": 20 } }, { - "filename": "32s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 179, - "y": 717, - "w": 18, - "h": 20 - } - }, - { - "filename": "39", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 179, - "y": 737, - "w": 18, - "h": 20 - } - }, - { - "filename": "90", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 179, - "y": 757, - "w": 19, - "h": 18 - } - }, - { - "filename": "90s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 197, - "y": 639, - "w": 19, - "h": 18 - } - }, - { - "filename": "39s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 198, - "y": 657, - "w": 18, - "h": 20 - } - }, - { - "filename": "29", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 198, - "y": 677, - "w": 18, - "h": 19 - } - }, - { - "filename": "29s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 198, - "y": 696, - "w": 18, - "h": 19 - } - }, - { - "filename": "21s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 12, - "w": 19, - "h": 16 - }, - "frame": { - "x": 231, - "y": 511, - "w": 19, - "h": 16 - } - }, - { - "filename": "123", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 229, - "y": 527, - "w": 19, - "h": 19 - } - }, - { - "filename": "123s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 229, - "y": 546, - "w": 19, - "h": 19 - } - }, - { - "filename": "114", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 227, - "y": 565, - "w": 19, - "h": 18 - } - }, - { - "filename": "35", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 223, - "y": 583, - "w": 18, - "h": 19 - } - }, - { - "filename": "10s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 14, - "h": 16 - }, - "frame": { - "x": 241, - "y": 583, - "w": 14, - "h": 16 - } - }, - { - "filename": "35s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 223, - "y": 602, - "w": 18, - "h": 19 - } - }, - { - "filename": "100s", + "filename": "50s", "rotated": false, "trimmed": true, "sourceSize": { @@ -7286,37 +5522,16 @@ "spriteSourceSize": { "x": 13, "y": 14, - "w": 14, + "w": 15, "h": 14 }, "frame": { - "x": 241, - "y": 599, - "w": 14, + "x": 239, + "y": 453, + "w": 15, "h": 14 } }, - { - "filename": "114s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 223, - "y": 621, - "w": 19, - "h": 18 - } - }, { "filename": "14", "rotated": false, @@ -7332,8 +5547,8 @@ "h": 18 }, "frame": { - "x": 242, - "y": 613, + "x": 239, + "y": 467, "w": 13, "h": 18 } @@ -7353,12 +5568,1713 @@ "h": 18 }, "frame": { - "x": 242, - "y": 631, + "x": 239, + "y": 485, "w": 13, "h": 18 } }, + { + "filename": "81s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 23, + "h": 15 + }, + "frame": { + "x": 79, + "y": 568, + "w": 23, + "h": 15 + } + }, + { + "filename": "105", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 78, + "y": 583, + "w": 22, + "h": 21 + } + }, + { + "filename": "105s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 78, + "y": 604, + "w": 22, + "h": 21 + } + }, + { + "filename": "46", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 78, + "y": 625, + "w": 22, + "h": 20 + } + }, + { + "filename": "106s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 102, + "y": 571, + "w": 23, + "h": 19 + } + }, + { + "filename": "125s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 100, + "y": 590, + "w": 21, + "h": 22 + } + }, + { + "filename": "150s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 100, + "y": 612, + "w": 20, + "h": 23 + } + }, + { + "filename": "108", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 23, + "h": 18 + }, + "frame": { + "x": 125, + "y": 575, + "w": 23, + "h": 18 + } + }, + { + "filename": "46s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 148, + "y": 571, + "w": 22, + "h": 20 + } + }, + { + "filename": "61", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 22, + "h": 19 + }, + "frame": { + "x": 170, + "y": 572, + "w": 22, + "h": 19 + } + }, + { + "filename": "61s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 22, + "h": 19 + }, + "frame": { + "x": 121, + "y": 593, + "w": 22, + "h": 19 + } + }, + { + "filename": "52s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 120, + "y": 612, + "w": 21, + "h": 21 + } + }, + { + "filename": "108s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 23, + "h": 18 + }, + "frame": { + "x": 192, + "y": 575, + "w": 23, + "h": 18 + } + }, + { + "filename": "19", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 215, + "y": 575, + "w": 20, + "h": 21 + } + }, + { + "filename": "123", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 19 + }, + "frame": { + "x": 235, + "y": 592, + "w": 19, + "h": 19 + } + }, + { + "filename": "2s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 100, + "y": 635, + "w": 21, + "h": 20 + } + }, + { + "filename": "19s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 121, + "y": 633, + "w": 20, + "h": 21 + } + }, + { + "filename": "27", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 20, + "h": 18 + }, + "frame": { + "x": 58, + "y": 643, + "w": 20, + "h": 18 + } + }, + { + "filename": "70", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 78, + "y": 645, + "w": 22, + "h": 20 + } + }, + { + "filename": "70s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 56, + "y": 661, + "w": 22, + "h": 20 + } + }, + { + "filename": "79", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 56, + "y": 681, + "w": 21, + "h": 21 + } + }, + { + "filename": "4", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 21, + "h": 19 + }, + "frame": { + "x": 56, + "y": 702, + "w": 21, + "h": 19 + } + }, + { + "filename": "79s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 54, + "y": 721, + "w": 21, + "h": 21 + } + }, + { + "filename": "17", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 54, + "y": 742, + "w": 21, + "h": 20 + } + }, + { + "filename": "4s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 21, + "h": 19 + }, + "frame": { + "x": 78, + "y": 665, + "w": 21, + "h": 19 + } + }, + { + "filename": "17s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 77, + "y": 684, + "w": 21, + "h": 20 + } + }, + { + "filename": "7", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 21, + "h": 17 + }, + "frame": { + "x": 77, + "y": 704, + "w": 21, + "h": 17 + } + }, + { + "filename": "25", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 75, + "y": 721, + "w": 21, + "h": 20 + } + }, + { + "filename": "25-cool-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 75, + "y": 741, + "w": 21, + "h": 20 + } + }, + { + "filename": "25s-cool-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 75, + "y": 741, + "w": 21, + "h": 20 + } + }, + { + "filename": "23", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 18, + "h": 21 + }, + "frame": { + "x": 57, + "y": 762, + "w": 18, + "h": 21 + } + }, + { + "filename": "25-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 75, + "y": 761, + "w": 21, + "h": 20 + } + }, + { + "filename": "25s-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 75, + "y": 761, + "w": 21, + "h": 20 + } + }, + { + "filename": "7s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 21, + "h": 17 + }, + "frame": { + "x": 100, + "y": 655, + "w": 21, + "h": 17 + } + }, + { + "filename": "25-smart-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 121, + "y": 654, + "w": 21, + "h": 20 + } + }, + { + "filename": "25s-smart-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 121, + "y": 654, + "w": 21, + "h": 20 + } + }, + { + "filename": "25-tough-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 99, + "y": 672, + "w": 21, + "h": 20 + } + }, + { + "filename": "25s-tough-cosplay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 99, + "y": 672, + "w": 21, + "h": 20 + } + }, + { + "filename": "25s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 98, + "y": 692, + "w": 21, + "h": 20 + } + }, + { + "filename": "41", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 120, + "y": 674, + "w": 21, + "h": 20 + } + }, + { + "filename": "41s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 119, + "y": 694, + "w": 21, + "h": 20 + } + }, + { + "filename": "84", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 98, + "y": 712, + "w": 21, + "h": 18 + } + }, + { + "filename": "107", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 96, + "y": 730, + "w": 21, + "h": 20 + } + }, + { + "filename": "107s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 96, + "y": 750, + "w": 21, + "h": 20 + } + }, + { + "filename": "84s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 96, + "y": 770, + "w": 21, + "h": 18 + } + }, + { + "filename": "88", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 119, + "y": 714, + "w": 21, + "h": 18 + } + }, + { + "filename": "124", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 117, + "y": 732, + "w": 21, + "h": 20 + } + }, + { + "filename": "124s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 117, + "y": 752, + "w": 21, + "h": 20 + } + }, + { + "filename": "21", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 12, + "w": 19, + "h": 16 + }, + "frame": { + "x": 117, + "y": 772, + "w": 19, + "h": 16 + } + }, + { + "filename": "21s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 12, + "w": 19, + "h": 16 + }, + "frame": { + "x": 136, + "y": 772, + "w": 19, + "h": 16 + } + }, + { + "filename": "23s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 18, + "h": 21 + }, + "frame": { + "x": 143, + "y": 593, + "w": 18, + "h": 21 + } + }, + { + "filename": "135", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 141, + "y": 614, + "w": 20, + "h": 21 + } + }, + { + "filename": "104", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 9, + "w": 20, + "h": 19 + }, + "frame": { + "x": 141, + "y": 635, + "w": 20, + "h": 19 + } + }, + { + "filename": "37", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 142, + "y": 654, + "w": 20, + "h": 20 + } + }, + { + "filename": "37s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 141, + "y": 674, + "w": 20, + "h": 20 + } + }, + { + "filename": "135s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 140, + "y": 694, + "w": 20, + "h": 21 + } + }, + { + "filename": "27s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 20, + "h": 18 + }, + "frame": { + "x": 140, + "y": 715, + "w": 20, + "h": 18 + } + }, + { + "filename": "54", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 18, + "h": 21 + }, + "frame": { + "x": 161, + "y": 591, + "w": 18, + "h": 21 + } + }, + { + "filename": "54s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 18, + "h": 21 + }, + "frame": { + "x": 161, + "y": 612, + "w": 18, + "h": 21 + } + }, + { + "filename": "32", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 18, + "h": 20 + }, + "frame": { + "x": 161, + "y": 633, + "w": 18, + "h": 20 + } + }, + { + "filename": "88s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 138, + "y": 733, + "w": 21, + "h": 18 + } + }, + { + "filename": "104s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 9, + "w": 20, + "h": 19 + }, + "frame": { + "x": 138, + "y": 751, + "w": 20, + "h": 19 + } + }, + { + "filename": "147", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 20, + "h": 18 + }, + "frame": { + "x": 155, + "y": 770, + "w": 20, + "h": 18 + } + }, + { + "filename": "29", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 18, + "h": 19 + }, + "frame": { + "x": 158, + "y": 751, + "w": 18, + "h": 19 + } + }, + { + "filename": "147s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 20, + "h": 18 + }, + "frame": { + "x": 175, + "y": 770, + "w": 20, + "h": 18 + } + }, + { + "filename": "32s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 18, + "h": 20 + }, + "frame": { + "x": 162, + "y": 653, + "w": 18, + "h": 20 + } + }, + { + "filename": "90", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 159, + "y": 733, + "w": 19, + "h": 18 + } + }, + { + "filename": "123s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 19 + }, + "frame": { + "x": 176, + "y": 751, + "w": 19, + "h": 19 + } + }, + { + "filename": "11s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 179, + "y": 591, + "w": 12, + "h": 18 + } + }, + { + "filename": "60", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 191, + "y": 593, + "w": 20, + "h": 15 + } + }, + { + "filename": "39", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 18, + "h": 20 + }, + "frame": { + "x": 179, + "y": 609, + "w": 18, + "h": 20 + } + }, + { + "filename": "39s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 18, + "h": 20 + }, + "frame": { + "x": 179, + "y": 629, + "w": 18, + "h": 20 + } + }, + { + "filename": "66", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 197, + "y": 608, + "w": 16, + "h": 20 + } + }, + { + "filename": "66s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 197, + "y": 628, + "w": 16, + "h": 20 + } + }, + { + "filename": "29s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 18, + "h": 19 + }, + "frame": { + "x": 180, + "y": 649, + "w": 18, + "h": 19 + } + }, + { + "filename": "35", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 18, + "h": 19 + }, + "frame": { + "x": 198, + "y": 648, + "w": 18, + "h": 19 + } + }, + { + "filename": "90s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 216, + "y": 596, + "w": 19, + "h": 18 + } + }, + { + "filename": "114", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 235, + "y": 611, + "w": 19, + "h": 18 + } + }, + { + "filename": "35s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 18, + "h": 19 + }, + "frame": { + "x": 213, + "y": 614, + "w": 18, + "h": 19 + } + }, + { + "filename": "60s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 213, + "y": 633, + "w": 20, + "h": 15 + } + }, + { + "filename": "114s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 216, + "y": 648, + "w": 19, + "h": 18 + } + }, { "filename": "121", "rotated": false, @@ -7374,8 +7290,8 @@ "h": 18 }, "frame": { - "x": 216, - "y": 639, + "x": 235, + "y": 629, "w": 19, "h": 18 } @@ -7395,8 +7311,8 @@ "h": 18 }, "frame": { - "x": 216, - "y": 657, + "x": 235, + "y": 647, "w": 19, "h": 18 } @@ -7416,8 +7332,8 @@ "h": 18 }, "frame": { - "x": 216, - "y": 675, + "x": 235, + "y": 665, "w": 19, "h": 18 } @@ -7438,13 +7354,13 @@ }, "frame": { "x": 216, - "y": 693, + "y": 666, "w": 19, "h": 18 } }, { - "filename": "43s", + "filename": "16", "rotated": false, "trimmed": true, "sourceSize": { @@ -7452,20 +7368,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 17, - "h": 19 + "x": 11, + "y": 11, + "w": 18, + "h": 17 }, "frame": { - "x": 235, - "y": 649, - "w": 17, - "h": 19 + "x": 198, + "y": 667, + "w": 18, + "h": 17 } }, { - "filename": "122", + "filename": "16s", "rotated": false, "trimmed": true, "sourceSize": { @@ -7473,37 +7389,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 17, - "h": 18 + "x": 11, + "y": 11, + "w": 18, + "h": 17 }, "frame": { - "x": 235, + "x": 180, "y": 668, - "w": 17, - "h": 18 - } - }, - { - "filename": "122s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 17, - "h": 18 - }, - "frame": { - "x": 235, - "y": 686, - "w": 17, - "h": 18 + "w": 18, + "h": 17 } }, { @@ -7521,14 +7416,14 @@ "h": 17 }, "frame": { - "x": 235, - "y": 704, + "x": 162, + "y": 673, "w": 18, "h": 17 } }, { - "filename": "116s", + "filename": "69", "rotated": false, "trimmed": true, "sourceSize": { @@ -7536,15 +7431,57 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 11, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 180, + "y": 685, + "w": 20, + "h": 15 + } + }, + { + "filename": "69s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 200, + "y": 684, + "w": 20, + "h": 15 + } + }, + { + "filename": "13", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, "y": 11, - "w": 18, + "w": 16, "h": 17 }, "frame": { - "x": 216, - "y": 711, - "w": 18, + "x": 220, + "y": 684, + "w": 16, "h": 17 } }, @@ -7563,12 +7500,33 @@ "h": 18 }, "frame": { - "x": 198, - "y": 715, + "x": 236, + "y": 683, "w": 18, "h": 18 } }, + { + "filename": "116s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 18, + "h": 17 + }, + "frame": { + "x": 161, + "y": 690, + "w": 18, + "h": 17 + } + }, { "filename": "138s", "rotated": false, @@ -7584,33 +7542,12 @@ "h": 18 }, "frame": { - "x": 197, - "y": 733, + "x": 160, + "y": 707, "w": 18, "h": 18 } }, - { - "filename": "133", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 17, - "h": 18 - }, - "frame": { - "x": 198, - "y": 751, - "w": 17, - "h": 18 - } - }, { "filename": "120", "rotated": false, @@ -7626,14 +7563,56 @@ "h": 17 }, "frame": { - "x": 234, - "y": 721, + "x": 179, + "y": 700, "w": 17, "h": 17 } }, { - "filename": "120s", + "filename": "133", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 10, + "w": 17, + "h": 18 + }, + "frame": { + "x": 178, + "y": 717, + "w": 17, + "h": 18 + } + }, + { + "filename": "101", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 16, + "h": 16 + }, + "frame": { + "x": 178, + "y": 735, + "w": 16, + "h": 16 + } + }, + { + "filename": "13s", "rotated": false, "trimmed": true, "sourceSize": { @@ -7643,13 +7622,13 @@ "spriteSourceSize": { "x": 12, "y": 11, - "w": 17, + "w": 16, "h": 17 }, "frame": { - "x": 198, - "y": 769, - "w": 17, + "x": 196, + "y": 700, + "w": 16, "h": 17 } }, @@ -7668,8 +7647,8 @@ "h": 18 }, "frame": { - "x": 216, - "y": 728, + "x": 195, + "y": 717, "w": 17, "h": 18 } @@ -7689,35 +7668,14 @@ "h": 16 }, "frame": { - "x": 215, - "y": 746, + "x": 194, + "y": 735, "w": 16, "h": 16 } }, { - "filename": "11", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 215, - "y": 762, - "w": 12, - "h": 18 - } - }, - { - "filename": "132", + "filename": "120s", "rotated": false, "trimmed": true, "sourceSize": { @@ -7726,36 +7684,57 @@ }, "spriteSourceSize": { "x": 12, - "y": 15, - "w": 16, - "h": 13 + "y": 11, + "w": 17, + "h": 17 }, "frame": { - "x": 233, - "y": 738, - "w": 16, - "h": 13 - } - }, - { - "filename": "132s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 15, - "w": 16, - "h": 13 - }, - "frame": { - "x": 231, + "x": 195, "y": 751, - "w": 16, - "h": 13 + "w": 17, + "h": 17 + } + }, + { + "filename": "10", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 14, + "h": 16 + }, + "frame": { + "x": 195, + "y": 768, + "w": 14, + "h": 16 + } + }, + { + "filename": "10s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 14, + "h": 16 + }, + "frame": { + "x": 212, + "y": 701, + "w": 14, + "h": 16 } }, { @@ -7773,14 +7752,14 @@ "h": 13 }, "frame": { - "x": 227, - "y": 764, + "x": 226, + "y": 701, "w": 16, "h": 13 } }, { - "filename": "11s", + "filename": "100", "rotated": false, "trimmed": true, "sourceSize": { @@ -7788,16 +7767,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 + "x": 13, + "y": 14, + "w": 14, + "h": 14 }, "frame": { - "x": 243, - "y": 764, - "w": 12, - "h": 18 + "x": 212, + "y": 717, + "w": 14, + "h": 14 } }, { @@ -7815,11 +7794,32 @@ "h": 13 }, "frame": { - "x": 227, - "y": 777, + "x": 226, + "y": 714, "w": 16, "h": 13 } + }, + { + "filename": "100s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 14, + "h": 14 + }, + "frame": { + "x": 212, + "y": 731, + "w": 14, + "h": 14 + } } ] } @@ -7827,6 +7827,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:67cbb69780250451ffff0dda6617c079:95ec22440af6402ebbc5ded9fb8ffd09:e0e302e76ca76d7185883646a41dda84$" + "smartupdate": "$TexturePacker:SmartUpdate:aecb73c17a7c6ffdc28e73b8f7592118:7b770922e2a206398df33b3775973f94:e0e302e76ca76d7185883646a41dda84$" } } diff --git a/public/images/pokemon_icons_1.png b/public/images/pokemon_icons_1.png index ee3a10ef113..4091f15165f 100644 Binary files a/public/images/pokemon_icons_1.png and b/public/images/pokemon_icons_1.png differ diff --git a/public/images/pokemon_icons_1v.json b/public/images/pokemon_icons_1v.json index dccfb2121d2..4400b9d0213 100644 --- a/public/images/pokemon_icons_1v.json +++ b/public/images/pokemon_icons_1v.json @@ -1,4493 +1,1740 @@ -{ - "textures": [ - { - "image": "pokemon_icons_1v.png", - "format": "RGBA8888", - "size": { - "w": 248, - "h": 480 - }, - "scale": 1, - "frames": [ - { - "filename": "6-mega-x_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 25 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 25 - } - }, - { - "filename": "6-mega-x_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 25 - }, - "frame": { - "x": 0, - "y": 25, - "w": 40, - "h": 25 - } - }, - { - "filename": "6-mega-y_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 25 - }, - "frame": { - "x": 40, - "y": 0, - "w": 38, - "h": 25 - } - }, - { - "filename": "6-mega-y_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 25 - }, - "frame": { - "x": 0, - "y": 50, - "w": 38, - "h": 25 - } - }, - { - "filename": "94-mega_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 34, - "h": 29 - }, - "frame": { - "x": 0, - "y": 75, - "w": 34, - "h": 29 - } - }, - { - "filename": "94-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 34, - "h": 29 - }, - "frame": { - "x": 0, - "y": 104, - "w": 34, - "h": 29 - } - }, - { - "filename": "94-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 34, - "h": 29 - }, - "frame": { - "x": 0, - "y": 133, - "w": 34, - "h": 29 - } - }, - { - "filename": "3-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 162, - "w": 32, - "h": 30 - } - }, - { - "filename": "3-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 192, - "w": 32, - "h": 30 - } - }, - { - "filename": "94-gigantamax_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 222, - "w": 32, - "h": 30 - } - }, - { - "filename": "94-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 252, - "w": 32, - "h": 30 - } - }, - { - "filename": "94-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 282, - "w": 32, - "h": 30 - } - }, - { - "filename": "6_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 27 - }, - "frame": { - "x": 0, - "y": 312, - "w": 32, - "h": 27 - } - }, - { - "filename": "6_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 27 - }, - "frame": { - "x": 0, - "y": 339, - "w": 32, - "h": 27 - } - }, - { - "filename": "130-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 30, - "h": 29 - }, - "frame": { - "x": 0, - "y": 366, - "w": 30, - "h": 29 - } - }, - { - "filename": "130-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 30, - "h": 29 - }, - "frame": { - "x": 0, - "y": 395, - "w": 30, - "h": 29 - } - }, - { - "filename": "9-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 30, - "h": 28 - }, - "frame": { - "x": 0, - "y": 424, - "w": 30, - "h": 28 - } - }, - { - "filename": "131-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 28 - }, - "frame": { - "x": 0, - "y": 452, - "w": 31, - "h": 28 - } - }, - { - "filename": "127-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 31, - "h": 25 - }, - "frame": { - "x": 40, - "y": 25, - "w": 31, - "h": 25 - } - }, - { - "filename": "127-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 31, - "h": 25 - }, - "frame": { - "x": 78, - "y": 0, - "w": 31, - "h": 25 - } - }, - { - "filename": "131-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 28 - }, - "frame": { - "x": 38, - "y": 50, - "w": 31, - "h": 28 - } - }, - { - "filename": "142-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 32, - "h": 24 - }, - "frame": { - "x": 71, - "y": 25, - "w": 32, - "h": 24 - } - }, - { - "filename": "142-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 32, - "h": 24 - }, - "frame": { - "x": 109, - "y": 0, - "w": 32, - "h": 24 - } - }, - { - "filename": "3_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 30, - "h": 24 - }, - "frame": { - "x": 141, - "y": 0, - "w": 30, - "h": 24 - } - }, - { - "filename": "3_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 30, - "h": 24 - }, - "frame": { - "x": 171, - "y": 0, - "w": 30, - "h": 24 - } - }, - { - "filename": "9-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 30, - "h": 28 - }, - "frame": { - "x": 34, - "y": 78, - "w": 30, - "h": 28 - } - }, - { - "filename": "9-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 29, - "h": 28 - }, - "frame": { - "x": 34, - "y": 106, - "w": 29, - "h": 28 - } - }, - { - "filename": "9-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 29, - "h": 28 - }, - "frame": { - "x": 34, - "y": 134, - "w": 29, - "h": 28 - } - }, - { - "filename": "130_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 162, - "w": 29, - "h": 28 - } - }, - { - "filename": "130_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 190, - "w": 29, - "h": 28 - } - }, - { - "filename": "3-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 26 - }, - "frame": { - "x": 32, - "y": 218, - "w": 29, - "h": 26 - } - }, - { - "filename": "3-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 26 - }, - "frame": { - "x": 32, - "y": 244, - "w": 29, - "h": 26 - } - }, - { - "filename": "78_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 29, - "h": 26 - }, - "frame": { - "x": 32, - "y": 270, - "w": 29, - "h": 26 - } - }, - { - "filename": "78_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 29, - "h": 26 - }, - "frame": { - "x": 32, - "y": 296, - "w": 29, - "h": 26 - } - }, - { - "filename": "93_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 30, - "h": 26 - }, - "frame": { - "x": 32, - "y": 322, - "w": 30, - "h": 26 - } - }, - { - "filename": "93_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 30, - "h": 26 - }, - "frame": { - "x": 201, - "y": 0, - "w": 30, - "h": 26 - } - }, - { - "filename": "133_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 17, - "h": 18 - }, - "frame": { - "x": 231, - "y": 0, - "w": 17, - "h": 18 - } - }, - { - "filename": "93_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 30, - "h": 26 - }, - "frame": { - "x": 32, - "y": 348, - "w": 30, - "h": 26 - } - }, - { - "filename": "6-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 24, - "h": 30 - }, - "frame": { - "x": 30, - "y": 374, - "w": 24, - "h": 30 - } - }, - { - "filename": "6-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 24, - "h": 30 - }, - "frame": { - "x": 30, - "y": 404, - "w": 24, - "h": 30 - } - }, - { - "filename": "133_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 17, - "h": 18 - }, - "frame": { - "x": 231, - "y": 18, - "w": 17, - "h": 18 - } - }, - { - "filename": "146_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 18 - }, - "frame": { - "x": 30, - "y": 434, - "w": 28, - "h": 18 - } - }, - { - "filename": "85_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 31, - "y": 452, - "w": 29, - "h": 25 - } - }, - { - "filename": "52-gigantamax_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 23, - "h": 30 - }, - "frame": { - "x": 54, - "y": 374, - "w": 23, - "h": 30 - } - }, - { - "filename": "52-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 23, - "h": 30 - }, - "frame": { - "x": 54, - "y": 404, - "w": 23, - "h": 30 - } - }, - { - "filename": "84_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 58, - "y": 434, - "w": 21, - "h": 18 - } - }, - { - "filename": "85_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 60, - "y": 452, - "w": 29, - "h": 25 - } - }, - { - "filename": "52-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 23, - "h": 30 - }, - "frame": { - "x": 64, - "y": 78, - "w": 23, - "h": 30 - } - }, - { - "filename": "150-mega-y_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 20, - "h": 30 - }, - "frame": { - "x": 63, - "y": 108, - "w": 20, - "h": 30 - } - }, - { - "filename": "9_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 63, - "y": 138, - "w": 25, - "h": 24 - } - }, - { - "filename": "85_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 61, - "y": 162, - "w": 29, - "h": 25 - } - }, - { - "filename": "57_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 61, - "y": 187, - "w": 28, - "h": 23 - } - }, - { - "filename": "57_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 61, - "y": 210, - "w": 28, - "h": 23 - } - }, - { - "filename": "57_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 61, - "y": 233, - "w": 28, - "h": 23 - } - }, - { - "filename": "71_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 61, - "y": 256, - "w": 28, - "h": 23 - } - }, - { - "filename": "71_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 61, - "y": 279, - "w": 28, - "h": 23 - } - }, - { - "filename": "56_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 61, - "y": 302, - "w": 28, - "h": 20 - } - }, - { - "filename": "150-mega-y_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 20, - "h": 30 - }, - "frame": { - "x": 62, - "y": 322, - "w": 20, - "h": 30 - } - }, - { - "filename": "8_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 62, - "y": 352, - "w": 24, - "h": 22 - } - }, - { - "filename": "150-mega-x_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 21, - "h": 26 - }, - "frame": { - "x": 77, - "y": 374, - "w": 21, - "h": 26 - } - }, - { - "filename": "150-mega-x_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 21, - "h": 26 - }, - "frame": { - "x": 77, - "y": 400, - "w": 21, - "h": 26 - } - }, - { - "filename": "151_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 23, - "h": 25 - }, - "frame": { - "x": 79, - "y": 426, - "w": 23, - "h": 25 - } - }, - { - "filename": "151_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 23, - "h": 25 - }, - "frame": { - "x": 89, - "y": 451, - "w": 23, - "h": 25 - } - }, - { - "filename": "9_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 82, - "y": 322, - "w": 25, - "h": 24 - } - }, - { - "filename": "94_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 86, - "y": 346, - "w": 24, - "h": 24 - } - }, - { - "filename": "94_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 98, - "y": 370, - "w": 24, - "h": 24 - } - }, - { - "filename": "94_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 98, - "y": 394, - "w": 24, - "h": 24 - } - }, - { - "filename": "129_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 102, - "y": 418, - "w": 22, - "h": 24 - } - }, - { - "filename": "129_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 103, - "y": 25, - "w": 22, - "h": 24 - } - }, - { - "filename": "142_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 29, - "h": 22 - }, - "frame": { - "x": 125, - "y": 24, - "w": 29, - "h": 22 - } - }, - { - "filename": "142_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 29, - "h": 22 - }, - "frame": { - "x": 154, - "y": 24, - "w": 29, - "h": 22 - } - }, - { - "filename": "29_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 183, - "y": 24, - "w": 18, - "h": 19 - } - }, - { - "filename": "145_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 29, - "h": 19 - }, - "frame": { - "x": 201, - "y": 26, - "w": 29, - "h": 19 - } - }, - { - "filename": "29_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 230, - "y": 36, - "w": 18, - "h": 19 - } - }, - { - "filename": "5_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 69, - "y": 55, - "w": 22, - "h": 23 - } - }, - { - "filename": "42_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 26, - "h": 22 - }, - "frame": { - "x": 91, - "y": 49, - "w": 26, - "h": 22 - } - }, - { - "filename": "42_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 26, - "h": 22 - }, - "frame": { - "x": 91, - "y": 71, - "w": 26, - "h": 22 - } - }, - { - "filename": "145_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 29, - "h": 19 - }, - "frame": { - "x": 87, - "y": 93, - "w": 29, - "h": 19 - } - }, - { - "filename": "42_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 26, - "h": 22 - }, - "frame": { - "x": 83, - "y": 112, - "w": 26, - "h": 22 - } - }, - { - "filename": "5_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 88, - "y": 134, - "w": 22, - "h": 23 - } - }, - { - "filename": "31_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 90, - "y": 157, - "w": 23, - "h": 23 - } - }, - { - "filename": "145_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 29, - "h": 19 - }, - "frame": { - "x": 125, - "y": 46, - "w": 29, - "h": 19 - } - }, - { - "filename": "56_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 154, - "y": 46, - "w": 28, - "h": 20 - } - }, - { - "filename": "56_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 117, - "y": 65, - "w": 28, - "h": 20 - } - }, - { - "filename": "144_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 20 - }, - "frame": { - "x": 145, - "y": 66, - "w": 27, - "h": 20 - } - }, - { - "filename": "146_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 18 - }, - "frame": { - "x": 117, - "y": 85, - "w": 28, - "h": 18 - } - }, - { - "filename": "144_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 20 - }, - "frame": { - "x": 145, - "y": 86, - "w": 27, - "h": 20 - } - }, - { - "filename": "146_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 28, - "h": 18 - }, - "frame": { - "x": 116, - "y": 103, - "w": 28, - "h": 18 - } - }, - { - "filename": "144_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 20 - }, - "frame": { - "x": 144, - "y": 106, - "w": 27, - "h": 20 - } - }, - { - "filename": "31_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 172, - "y": 66, - "w": 23, - "h": 23 - } - }, - { - "filename": "8_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 172, - "y": 89, - "w": 24, - "h": 22 - } - }, - { - "filename": "20_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 171, - "y": 111, - "w": 25, - "h": 21 - } - }, - { - "filename": "2_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 182, - "y": 46, - "w": 21, - "h": 20 - } - }, - { - "filename": "83_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 203, - "y": 45, - "w": 26, - "h": 22 - } - }, - { - "filename": "30_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 229, - "y": 55, - "w": 19, - "h": 22 - } - }, - { - "filename": "83_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 195, - "y": 67, - "w": 26, - "h": 22 - } - }, - { - "filename": "86_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 196, - "y": 89, - "w": 25, - "h": 23 - } - }, - { - "filename": "20_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 196, - "y": 112, - "w": 25, - "h": 21 - } - }, - { - "filename": "86_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 221, - "y": 77, - "w": 25, - "h": 23 - } - }, - { - "filename": "86_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 221, - "y": 100, - "w": 25, - "h": 23 - } - }, - { - "filename": "87_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 221, - "y": 123, - "w": 25, - "h": 23 - } - }, - { - "filename": "31_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 90, - "y": 180, - "w": 23, - "h": 23 - } - }, - { - "filename": "38_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 89, - "y": 203, - "w": 24, - "h": 23 - } - }, - { - "filename": "38_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 89, - "y": 226, - "w": 24, - "h": 23 - } - }, - { - "filename": "77_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 89, - "y": 249, - "w": 24, - "h": 23 - } - }, - { - "filename": "77_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 89, - "y": 272, - "w": 24, - "h": 23 - } - }, - { - "filename": "87_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 89, - "y": 295, - "w": 25, - "h": 23 - } - }, - { - "filename": "87_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 110, - "y": 121, - "w": 25, - "h": 23 - } - }, - { - "filename": "112_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 135, - "y": 126, - "w": 25, - "h": 23 - } - }, - { - "filename": "47_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 113, - "y": 144, - "w": 22, - "h": 22 - } - }, - { - "filename": "112_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 113, - "y": 166, - "w": 25, - "h": 23 - } - }, - { - "filename": "149_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 113, - "y": 189, - "w": 25, - "h": 22 - } - }, - { - "filename": "149_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 113, - "y": 211, - "w": 25, - "h": 22 - } - }, - { - "filename": "82_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 113, - "y": 233, - "w": 24, - "h": 22 - } - }, - { - "filename": "82_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 113, - "y": 255, - "w": 24, - "h": 22 - } - }, - { - "filename": "7_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 21, - "h": 17 - }, - "frame": { - "x": 135, - "y": 149, - "w": 21, - "h": 17 - } - }, - { - "filename": "36_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 138, - "y": 166, - "w": 20, - "h": 23 - } - }, - { - "filename": "36_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 138, - "y": 189, - "w": 20, - "h": 23 - } - }, - { - "filename": "19_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 138, - "y": 212, - "w": 20, - "h": 21 - } - }, - { - "filename": "47_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 137, - "y": 233, - "w": 22, - "h": 22 - } - }, - { - "filename": "47_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 137, - "y": 255, - "w": 22, - "h": 22 - } - }, - { - "filename": "84_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 113, - "y": 277, - "w": 21, - "h": 18 - } - }, - { - "filename": "119_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 25, - "h": 20 - }, - "frame": { - "x": 134, - "y": 277, - "w": 25, - "h": 20 - } - }, - { - "filename": "150_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 114, - "y": 295, - "w": 20, - "h": 23 - } - }, - { - "filename": "119_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 25, - "h": 20 - }, - "frame": { - "x": 134, - "y": 297, - "w": 25, - "h": 20 - } - }, - { - "filename": "53_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 107, - "y": 318, - "w": 23, - "h": 22 - } - }, - { - "filename": "150_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 110, - "y": 340, - "w": 20, - "h": 23 - } - }, - { - "filename": "119_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 25, - "h": 20 - }, - "frame": { - "x": 160, - "y": 132, - "w": 25, - "h": 20 - } - }, - { - "filename": "111_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 24, - "h": 20 - }, - "frame": { - "x": 185, - "y": 133, - "w": 24, - "h": 20 - } - }, - { - "filename": "53_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 158, - "y": 152, - "w": 23, - "h": 22 - } - }, - { - "filename": "53_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 158, - "y": 174, - "w": 23, - "h": 22 - } - }, - { - "filename": "51_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 158, - "y": 196, - "w": 22, - "h": 22 - } - }, - { - "filename": "131_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 181, - "y": 153, - "w": 24, - "h": 21 - } - }, - { - "filename": "131_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 181, - "y": 174, - "w": 24, - "h": 21 - } - }, - { - "filename": "81_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 23, - "h": 15 - }, - "frame": { - "x": 158, - "y": 218, - "w": 23, - "h": 15 - } - }, - { - "filename": "51_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 159, - "y": 233, - "w": 22, - "h": 22 - } - }, - { - "filename": "139_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 159, - "y": 255, - "w": 22, - "h": 22 - } - }, - { - "filename": "139_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 159, - "y": 277, - "w": 22, - "h": 22 - } - }, - { - "filename": "46_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 159, - "y": 299, - "w": 22, - "h": 20 - } - }, - { - "filename": "30_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 205, - "y": 153, - "w": 19, - "h": 22 - } - }, - { - "filename": "111_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 24, - "h": 20 - }, - "frame": { - "x": 224, - "y": 146, - "w": 24, - "h": 20 - } - }, - { - "filename": "118_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 224, - "y": 166, - "w": 24, - "h": 19 - } - }, - { - "filename": "113_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 205, - "y": 175, - "w": 19, - "h": 20 - } - }, - { - "filename": "118_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 224, - "y": 185, - "w": 24, - "h": 19 - } - }, - { - "filename": "125_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 130, - "y": 318, - "w": 21, - "h": 22 - } - }, - { - "filename": "125_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 130, - "y": 340, - "w": 21, - "h": 22 - } - }, - { - "filename": "92_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 151, - "y": 319, - "w": 23, - "h": 21 - } - }, - { - "filename": "92_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 151, - "y": 340, - "w": 23, - "h": 21 - } - }, - { - "filename": "125_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 174, - "y": 319, - "w": 21, - "h": 22 - } - }, - { - "filename": "2_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 174, - "y": 341, - "w": 21, - "h": 20 - } - }, - { - "filename": "118_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 151, - "y": 361, - "w": 24, - "h": 19 - } - }, - { - "filename": "4_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 130, - "y": 362, - "w": 21, - "h": 19 - } - }, - { - "filename": "1_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 175, - "y": 361, - "w": 20, - "h": 19 - } - }, - { - "filename": "92_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 122, - "y": 381, - "w": 23, - "h": 21 - } - }, - { - "filename": "81_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 23, - "h": 15 - }, - "frame": { - "x": 122, - "y": 402, - "w": 23, - "h": 15 - } - }, - { - "filename": "148_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 124, - "y": 417, - "w": 22, - "h": 22 - } - }, - { - "filename": "148_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 145, - "y": 381, - "w": 22, - "h": 22 - } - }, - { - "filename": "127_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 167, - "y": 380, - "w": 23, - "h": 21 - } - }, - { - "filename": "50_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 145, - "y": 403, - "w": 15, - "h": 14 - } - }, - { - "filename": "19_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 146, - "y": 417, - "w": 20, - "h": 21 - } - }, - { - "filename": "50_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 160, - "y": 403, - "w": 15, - "h": 14 - } - }, - { - "filename": "52_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 166, - "y": 417, - "w": 21, - "h": 21 - } - }, - { - "filename": "101_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 175, - "y": 401, - "w": 16, - "h": 16 - } - }, - { - "filename": "52_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 190, - "y": 380, - "w": 21, - "h": 21 - } - }, - { - "filename": "1_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 191, - "y": 401, - "w": 20, - "h": 19 - } - }, - { - "filename": "127_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 187, - "y": 420, - "w": 23, - "h": 21 - } - }, - { - "filename": "46_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 124, - "y": 439, - "w": 22, - "h": 20 - } - }, - { - "filename": "134_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 112, - "y": 459, - "w": 23, - "h": 21 - } - }, - { - "filename": "134_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 135, - "y": 459, - "w": 23, - "h": 21 - } - }, - { - "filename": "136_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 146, - "y": 438, - "w": 23, - "h": 21 - } - }, - { - "filename": "136_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 158, - "y": 459, - "w": 23, - "h": 21 - } - }, - { - "filename": "29_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 169, - "y": 438, - "w": 18, - "h": 19 - } - }, - { - "filename": "136_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 187, - "y": 441, - "w": 23, - "h": 21 - } - }, - { - "filename": "84_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 181, - "y": 462, - "w": 21, - "h": 18 - } - }, - { - "filename": "147_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 202, - "y": 462, - "w": 20, - "h": 18 - } - }, - { - "filename": "46_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 181, - "y": 195, - "w": 22, - "h": 20 - } - }, - { - "filename": "41_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 203, - "y": 195, - "w": 21, - "h": 20 - } - }, - { - "filename": "52_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 181, - "y": 215, - "w": 21, - "h": 21 - } - }, - { - "filename": "70_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 202, - "y": 215, - "w": 22, - "h": 20 - } - }, - { - "filename": "70_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 224, - "y": 204, - "w": 22, - "h": 20 - } - }, - { - "filename": "79_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 181, - "y": 236, - "w": 21, - "h": 21 - } - }, - { - "filename": "41_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 202, - "y": 235, - "w": 21, - "h": 20 - } - }, - { - "filename": "41_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 181, - "y": 257, - "w": 21, - "h": 20 - } - }, - { - "filename": "135_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 202, - "y": 255, - "w": 20, - "h": 21 - } - }, - { - "filename": "135_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 181, - "y": 277, - "w": 20, - "h": 21 - } - }, - { - "filename": "135_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 181, - "y": 298, - "w": 20, - "h": 21 - } - }, - { - "filename": "4_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 224, - "y": 224, - "w": 21, - "h": 19 - } - }, - { - "filename": "7_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 21, - "h": 17 - }, - "frame": { - "x": 223, - "y": 243, - "w": 21, - "h": 17 - } - }, - { - "filename": "37_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 222, - "y": 260, - "w": 20, - "h": 20 - } - }, - { - "filename": "141_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 19, - "h": 21 - }, - "frame": { - "x": 195, - "y": 319, - "w": 19, - "h": 21 - } - }, - { - "filename": "141_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 19, - "h": 21 - }, - "frame": { - "x": 195, - "y": 340, - "w": 19, - "h": 21 - } - }, - { - "filename": "123_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 195, - "y": 361, - "w": 19, - "h": 19 - } - }, - { - "filename": "37_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 202, - "y": 276, - "w": 20, - "h": 20 - } - }, - { - "filename": "113_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 201, - "y": 296, - "w": 19, - "h": 20 - } - }, - { - "filename": "147_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 222, - "y": 280, - "w": 20, - "h": 18 - } - }, - { - "filename": "113_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 220, - "y": 298, - "w": 19, - "h": 20 - } - }, - { - "filename": "123_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 214, - "y": 318, - "w": 19, - "h": 19 - } - }, - { - "filename": "123_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 214, - "y": 337, - "w": 19, - "h": 19 - } - }, - { - "filename": "35_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 214, - "y": 356, - "w": 18, - "h": 19 - } - }, - { - "filename": "101_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 232, - "y": 356, - "w": 16, - "h": 16 - } - }, - { - "filename": "132_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 15, - "w": 16, - "h": 13 - }, - "frame": { - "x": 232, - "y": 372, - "w": 16, - "h": 13 - } - }, - { - "filename": "35_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 214, - "y": 375, - "w": 18, - "h": 19 - } - }, - { - "filename": "132_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 15, - "w": 16, - "h": 13 - }, - "frame": { - "x": 232, - "y": 385, - "w": 16, - "h": 13 - } - }, - { - "filename": "114_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 211, - "y": 394, - "w": 19, - "h": 18 - } - }, - { - "filename": "138_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 230, - "y": 398, - "w": 18, - "h": 18 - } - }, - { - "filename": "114_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 211, - "y": 412, - "w": 19, - "h": 18 - } - }, - { - "filename": "138_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 230, - "y": 416, - "w": 18, - "h": 18 - } - }, - { - "filename": "69_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 210, - "y": 430, - "w": 20, - "h": 15 - } - }, - { - "filename": "69_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 210, - "y": 445, - "w": 20, - "h": 15 - } - }, - { - "filename": "140_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 15, - "w": 16, - "h": 13 - }, - "frame": { - "x": 230, - "y": 434, - "w": 16, - "h": 13 - } - }, - { - "filename": "140_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 15, - "w": 16, - "h": 13 - }, - "frame": { - "x": 230, - "y": 447, - "w": 16, - "h": 13 - } - }, - { - "filename": "100_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 14, - "h": 14 - }, - "frame": { - "x": 222, - "y": 460, - "w": 14, - "h": 14 - } - }, - { - "filename": "100_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 14, - "h": 14 - }, - "frame": { - "x": 233, - "y": 318, - "w": 14, - "h": 14 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f68174181676c13948ca79a046fcbf7e:94e2e7f92900fbe73acb909ce5c02904:2fc2d7db306a93e9369e20846ccef45c$" - } -} +{ "frames": { + "100_2": { + "frame": { "x": 390, "y": 53, "w": 14, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "100_3": { + "frame": { "x": 328, "y": 30, "w": 14, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "101_2": { + "frame": { "x": 287, "y": 172, "w": 16, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "101_3": { + "frame": { "x": 263, "y": 156, "w": 16, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "111_2": { + "frame": { "x": 211, "y": 226, "w": 24, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 24, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "111_3": { + "frame": { "x": 265, "y": 233, "w": 24, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 24, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "112_2": { + "frame": { "x": 347, "y": 125, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "112_3": { + "frame": { "x": 322, "y": 125, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "113_1": { + "frame": { "x": 421, "y": 158, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "113_2": { + "frame": { "x": 299, "y": 277, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "113_3": { + "frame": { "x": 280, "y": 276, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "114_2": { + "frame": { "x": 212, "y": 297, "w": 19, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "114_3": { + "frame": { "x": 336, "y": 298, "w": 19, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "116_2": { + "frame": { "x": 142, "y": 303, "w": 18, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 18, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "116_3": { + "frame": { "x": 17, "y": 303, "w": 18, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 18, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "117_2": { + "frame": { "x": 92, "y": 226, "w": 24, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 24, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "117_3": { + "frame": { "x": 376, "y": 223, "w": 24, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 24, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "118_1": { + "frame": { "x": 400, "y": 241, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "118_2": { + "frame": { "x": 20, "y": 242, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "118_3": { + "frame": { "x": 372, "y": 243, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "119_1": { + "frame": { "x": 400, "y": 200, "w": 25, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "119_2": { + "frame": { "x": 196, "y": 199, "w": 25, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "119_3": { + "frame": { "x": 0, "y": 199, "w": 25, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "120_2": { + "frame": { "x": 77, "y": 306, "w": 17, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "120_3": { + "frame": { "x": 94, "y": 311, "w": 17, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "121_2": { + "frame": { "x": 355, "y": 300, "w": 19, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "121_3": { + "frame": { "x": 58, "y": 296, "w": 19, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "123_1": { + "frame": { "x": 148, "y": 284, "w": 19, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "123_2": { + "frame": { "x": 0, "y": 284, "w": 19, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "123_3": { + "frame": { "x": 173, "y": 283, "w": 19, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "125_1": { + "frame": { "x": 69, "y": 235, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "125_2": { + "frame": { "x": 311, "y": 235, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "125_3": { + "frame": { "x": 235, "y": 234, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "126_2": { + "frame": { "x": 287, "y": 188, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "126_3": { + "frame": { "x": 378, "y": 178, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "127-mega_2": { + "frame": { "x": 0, "y": 54, "w": 31, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 31, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "127-mega_3": { + "frame": { "x": 359, "y": 53, "w": 31, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 31, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "127_2": { + "frame": { "x": 0, "y": 219, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "127_3": { + "frame": { "x": 46, "y": 223, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "129_2": { + "frame": { "x": 213, "y": 175, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "129_3": { + "frame": { "x": 418, "y": 0, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "130-mega_2": { + "frame": { "x": 30, "y": 25, "w": 30, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "130-mega_3": { + "frame": { "x": 0, "y": 25, "w": 30, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "130_2": { + "frame": { "x": 210, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "130_3": { + "frame": { "x": 239, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "131-gigantamax_2": { + "frame": { "x": 373, "y": 25, "w": 31, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "131-gigantamax_3": { + "frame": { "x": 342, "y": 25, "w": 31, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "131_2": { + "frame": { "x": 172, "y": 198, "w": 24, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "131_3": { + "frame": { "x": 354, "y": 194, "w": 24, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "132_2": { + "frame": { "x": 231, "y": 311, "w": 16, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "132_3": { + "frame": { "x": 247, "y": 312, "w": 16, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "133_2": { + "frame": { "x": 0, "y": 303, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "133_3": { + "frame": { "x": 35, "y": 305, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "134_2": { + "frame": { "x": 165, "y": 219, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "134_3": { + "frame": { "x": 69, "y": 214, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "135_1": { + "frame": { "x": 20, "y": 261, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "135_2": { + "frame": { "x": 153, "y": 263, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "135_3": { + "frame": { "x": 396, "y": 260, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "136_1": { + "frame": { "x": 23, "y": 221, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "136_2": { + "frame": { "x": 400, "y": 220, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "136_3": { + "frame": { "x": 142, "y": 217, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "137_2": { + "frame": { "x": 280, "y": 296, "w": 19, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "137_3": { + "frame": { "x": 299, "y": 297, "w": 19, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "138_2": { + "frame": { "x": 415, "y": 301, "w": 18, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 18, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "138_3": { + "frame": { "x": 167, "y": 302, "w": 18, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 18, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "139_2": { + "frame": { "x": 47, "y": 201, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "139_3": { + "frame": { "x": 243, "y": 212, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "140_2": { + "frame": { "x": 263, "y": 312, "w": 16, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "140_3": { + "frame": { "x": 424, "y": 239, "w": 16, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "141_2": { + "frame": { "x": 261, "y": 276, "w": 19, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "141_3": { + "frame": { "x": 214, "y": 276, "w": 19, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "142-mega_2": { + "frame": { "x": 268, "y": 56, "w": 32, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 32, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "142-mega_3": { + "frame": { "x": 62, "y": 57, "w": 32, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 32, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "142_2": { + "frame": { "x": 322, "y": 103, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "142_3": { + "frame": { "x": 351, "y": 103, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "144_1": { + "frame": { "x": 304, "y": 168, "w": 27, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "144_2": { + "frame": { "x": 49, "y": 158, "w": 27, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "144_3": { + "frame": { "x": 394, "y": 158, "w": 27, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "145_1": { + "frame": { "x": 77, "y": 155, "w": 29, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "145_2": { + "frame": { "x": 130, "y": 153, "w": 29, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "145_3": { + "frame": { "x": 159, "y": 153, "w": 29, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "146_1": { + "frame": { "x": 70, "y": 196, "w": 28, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "146_2": { + "frame": { "x": 122, "y": 195, "w": 28, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "146_3": { + "frame": { "x": 258, "y": 194, "w": 28, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "147_2": { + "frame": { "x": 192, "y": 287, "w": 20, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 20, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "147_3": { + "frame": { "x": 38, "y": 287, "w": 20, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 20, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "148_2": { + "frame": { "x": 98, "y": 204, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "148_3": { + "frame": { "x": 378, "y": 201, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "149_2": { + "frame": { "x": 188, "y": 155, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "149_3": { + "frame": { "x": 24, "y": 156, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "150-mega-x_2": { + "frame": { "x": 106, "y": 155, "w": 21, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "150-mega-x_3": { + "frame": { "x": 242, "y": 156, "w": 21, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "150-mega-y_2": { + "frame": { "x": 175, "y": 107, "w": 20, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "150-mega-y_3": { + "frame": { "x": 407, "y": 108, "w": 20, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "150_2": { + "frame": { "x": 352, "y": 236, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "150_3": { + "frame": { "x": 332, "y": 235, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "151_2": { + "frame": { "x": 195, "y": 130, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "151_3": { + "frame": { "x": 231, "y": 127, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "19_2": { + "frame": { "x": 321, "y": 258, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "19_3": { + "frame": { "x": 0, "y": 263, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1_2": { + "frame": { "x": 338, "y": 279, "w": 20, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1_3": { + "frame": { "x": 318, "y": 279, "w": 20, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "20_2": { + "frame": { "x": 174, "y": 177, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "20_3": { + "frame": { "x": 23, "y": 178, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "23_2": { + "frame": { "x": 416, "y": 280, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "23_3": { + "frame": { "x": 20, "y": 282, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "24_2": { + "frame": { "x": 138, "y": 238, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "24_3": { + "frame": { "x": 0, "y": 240, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "29_1": { + "frame": { "x": 130, "y": 133, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "29_2": { + "frame": { "x": 397, "y": 299, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "29_3": { + "frame": { "x": 379, "y": 299, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2_2": { + "frame": { "x": 362, "y": 262, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2_3": { + "frame": { "x": 173, "y": 263, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "3-gigantamax_2": { + "frame": { "x": 214, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "3-gigantamax_3": { + "frame": { "x": 246, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "3-mega_2": { + "frame": { "x": 181, "y": 58, "w": 29, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "3-mega_3": { + "frame": { "x": 152, "y": 57, "w": 29, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "30_2": { + "frame": { "x": 87, "y": 267, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "30_3": { + "frame": { "x": 40, "y": 265, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "31_1": { + "frame": { "x": 331, "y": 168, "w": 23, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "31_2": { + "frame": { "x": 0, "y": 172, "w": 23, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "31_3": { + "frame": { "x": 127, "y": 172, "w": 23, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "35_2": { + "frame": { "x": 318, "y": 298, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "35_3": { + "frame": { "x": 124, "y": 299, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "36_2": { + "frame": { "x": 178, "y": 240, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "36_3": { + "frame": { "x": 158, "y": 240, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "37_2": { + "frame": { "x": 194, "y": 267, "w": 20, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "37_3": { + "frame": { "x": 241, "y": 274, "w": 20, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "38_2": { + "frame": { "x": 370, "y": 149, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "38_3": { + "frame": { "x": 218, "y": 152, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "3_2": { + "frame": { "x": 0, "y": 79, "w": 30, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "3_3": { + "frame": { "x": 240, "y": 80, "w": 30, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "41_1": { + "frame": { "x": 341, "y": 259, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "41_2": { + "frame": { "x": 416, "y": 260, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "41_3": { + "frame": { "x": 132, "y": 261, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "42_1": { + "frame": { "x": 104, "y": 133, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "42_2": { + "frame": { "x": 25, "y": 134, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "42_3": { + "frame": { "x": 51, "y": 136, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "43_2": { + "frame": { "x": 423, "y": 220, "w": 17, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 17, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "43_3": { + "frame": { "x": 423, "y": 178, "w": 17, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 17, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "44_2": { + "frame": { "x": 116, "y": 235, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "44_3": { + "frame": { "x": 289, "y": 235, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "45_2": { + "frame": { "x": 100, "y": 181, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "45_3": { + "frame": { "x": 48, "y": 178, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "46_1": { + "frame": { "x": 65, "y": 257, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "46_2": { + "frame": { "x": 299, "y": 257, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "46_3": { + "frame": { "x": 78, "y": 113, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "47_1": { + "frame": { "x": 25, "y": 199, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "47_2": { + "frame": { "x": 308, "y": 213, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "47_3": { + "frame": { "x": 120, "y": 213, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4_2": { + "frame": { "x": 59, "y": 277, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4_3": { + "frame": { "x": 106, "y": 277, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "50_2": { + "frame": { "x": 425, "y": 138, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "50_3": { + "frame": { "x": 425, "y": 197, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "51_2": { + "frame": { "x": 286, "y": 211, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "51_3": { + "frame": { "x": 221, "y": 204, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "52-gigantamax_1": { + "frame": { "x": 77, "y": 83, "w": 23, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "52-gigantamax_2": { + "frame": { "x": 54, "y": 81, "w": 23, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "52-gigantamax_3": { + "frame": { "x": 417, "y": 78, "w": 23, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "52_1": { + "frame": { "x": 44, "y": 244, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "52_2": { + "frame": { "x": 90, "y": 246, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "52_3": { + "frame": { "x": 198, "y": 246, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "53_1": { + "frame": { "x": 235, "y": 182, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "53_2": { + "frame": { "x": 400, "y": 178, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "53_3": { + "frame": { "x": 309, "y": 191, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "56_1": { + "frame": { "x": 342, "y": 148, "w": 28, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "56_2": { + "frame": { "x": 314, "y": 148, "w": 28, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "56_3": { + "frame": { "x": 397, "y": 138, "w": 28, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "57_1": { + "frame": { "x": 150, "y": 83, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "57_2": { + "frame": { "x": 294, "y": 103, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "57_3": { + "frame": { "x": 0, "y": 103, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "5_2": { + "frame": { "x": 332, "y": 191, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "5_3": { + "frame": { "x": 150, "y": 194, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6-gigantamax_2": { + "frame": { "x": 270, "y": 80, "w": 24, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6-gigantamax_3": { + "frame": { "x": 30, "y": 81, "w": 24, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6-mega-x_2": { + "frame": { "x": 40, "y": 0, "w": 40, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6-mega-x_3": { + "frame": { "x": 0, "y": 0, "w": 40, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6-mega-y_2": { + "frame": { "x": 380, "y": 0, "w": 38, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6-mega-y_3": { + "frame": { "x": 342, "y": 0, "w": 38, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "69_2": { + "frame": { "x": 173, "y": 137, "w": 20, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 20, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "69_3": { + "frame": { "x": 185, "y": 305, "w": 20, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 20, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6_2": { + "frame": { "x": 60, "y": 29, "w": 32, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6_3": { + "frame": { "x": 404, "y": 25, "w": 32, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "70_2": { + "frame": { "x": 277, "y": 256, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "70_3": { + "frame": { "x": 219, "y": 256, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "71_2": { + "frame": { "x": 178, "y": 84, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "71_3": { + "frame": { "x": 210, "y": 83, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "77_2": { + "frame": { "x": 280, "y": 149, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "77_3": { + "frame": { "x": 0, "y": 149, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "78_2": { + "frame": { "x": 123, "y": 57, "w": 29, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "78_3": { + "frame": { "x": 94, "y": 57, "w": 29, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "79_1": { + "frame": { "x": 265, "y": 212, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "79_2": { + "frame": { "x": 256, "y": 253, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "79_3": { + "frame": { "x": 111, "y": 256, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "7_2": { + "frame": { "x": 233, "y": 294, "w": 21, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 21, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "7_3": { + "frame": { "x": 80, "y": 289, "w": 21, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 21, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "80-mega_2": { + "frame": { "x": 125, "y": 83, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "80-mega_3": { + "frame": { "x": 100, "y": 83, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "80_2": { + "frame": { "x": 238, "y": 104, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "80_3": { + "frame": { "x": 380, "y": 103, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "81_2": { + "frame": { "x": 101, "y": 296, "w": 23, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 23, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "81_3": { + "frame": { "x": 254, "y": 297, "w": 23, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 23, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "82_2": { + "frame": { "x": 354, "y": 172, "w": 24, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "82_3": { + "frame": { "x": 76, "y": 174, "w": 24, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "83_2": { + "frame": { "x": 78, "y": 133, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "83_3": { + "frame": { "x": 254, "y": 134, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "84_1": { + "frame": { "x": 358, "y": 282, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "84_2": { + "frame": { "x": 383, "y": 281, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "84_3": { + "frame": { "x": 127, "y": 281, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "85_1": { + "frame": { "x": 388, "y": 78, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "85_2": { + "frame": { "x": 359, "y": 78, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "85_3": { + "frame": { "x": 330, "y": 78, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "86_1": { + "frame": { "x": 53, "y": 113, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "86_2": { + "frame": { "x": 28, "y": 111, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "86_3": { + "frame": { "x": 148, "y": 130, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "87_1": { + "frame": { "x": 372, "y": 126, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "87_2": { + "frame": { "x": 0, "y": 126, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "87_3": { + "frame": { "x": 289, "y": 126, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "8_2": { + "frame": { "x": 150, "y": 172, "w": 24, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 24, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "8_3": { + "frame": { "x": 263, "y": 172, "w": 24, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 24, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "9-gigantamax_2": { + "frame": { "x": 181, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "9-gigantamax_3": { + "frame": { "x": 152, "y": 29, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "9-mega_2": { + "frame": { "x": 122, "y": 29, "w": 30, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 30, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "9-mega_3": { + "frame": { "x": 92, "y": 29, "w": 30, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 30, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "92_1": { + "frame": { "x": 188, "y": 219, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "92_2": { + "frame": { "x": 330, "y": 214, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "92_3": { + "frame": { "x": 353, "y": 215, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "93_1": { + "frame": { "x": 404, "y": 52, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "93_2": { + "frame": { "x": 268, "y": 30, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "93_3": { + "frame": { "x": 298, "y": 30, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94-gigantamax_1": { + "frame": { "x": 182, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94-gigantamax_2": { + "frame": { "x": 310, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94-gigantamax_3": { + "frame": { "x": 278, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94-mega_1": { + "frame": { "x": 148, "y": 0, "w": 34, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94-mega_2": { + "frame": { "x": 114, "y": 0, "w": 34, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94-mega_3": { + "frame": { "x": 80, "y": 0, "w": 34, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94_1": { + "frame": { "x": 265, "y": 110, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94_2": { + "frame": { "x": 124, "y": 109, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "94_3": { + "frame": { "x": 100, "y": 109, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "98_2": { + "frame": { "x": 240, "y": 58, "w": 28, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "98_3": { + "frame": { "x": 300, "y": 56, "w": 28, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "99-gigantamax_2": { + "frame": { "x": 328, "y": 53, "w": 31, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 31, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "99-gigantamax_3": { + "frame": { "x": 31, "y": 56, "w": 31, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 31, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "99_2": { + "frame": { "x": 300, "y": 78, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "99_3": { + "frame": { "x": 210, "y": 58, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "9_2": { + "frame": { "x": 150, "y": 106, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "9_3": { + "frame": { "x": 206, "y": 106, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_1v.png", + "format": "RGBA8888", + "size": { "w": 440, "h": 328 }, + "scale": "1" + } +} diff --git a/public/images/pokemon_icons_1v.png b/public/images/pokemon_icons_1v.png index ba233cf5c95..2aa0433b3f6 100644 Binary files a/public/images/pokemon_icons_1v.png and b/public/images/pokemon_icons_1v.png differ diff --git a/public/images/pokemon_icons_2.json b/public/images/pokemon_icons_2.json index c99d8030ae8..5a389362bc0 100644 --- a/public/images/pokemon_icons_2.json +++ b/public/images/pokemon_icons_2.json @@ -1647,6 +1647,27 @@ "h": 19 } }, + { + "filename": "190_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 9, + "w": 24, + "h": 19 + }, + "frame": { + "x": 135, + "y": 213, + "w": 24, + "h": 19 + } + }, { "filename": "190s", "rotated": false, @@ -5643,6 +5664,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fb65cd7da07b1ca17dcf790954979dcb:904e2f46add51b0142753f21661bb455:c4863c5093a921f7cedf2f07c8e4b312$" + "smartupdate": "$TexturePacker:SmartUpdate:e559311a1087d0e40f44c39d79d49d7f:29d53260d330bde712bd25f381df311b:c4863c5093a921f7cedf2f07c8e4b312$" } } diff --git a/public/images/pokemon_icons_2.png b/public/images/pokemon_icons_2.png index 2596dfa265f..fed696d7154 100644 Binary files a/public/images/pokemon_icons_2.png and b/public/images/pokemon_icons_2.png differ diff --git a/public/images/pokemon_icons_2v.json b/public/images/pokemon_icons_2v.json index edc1237c81e..ac38ebbcf6b 100644 --- a/public/images/pokemon_icons_2v.json +++ b/public/images/pokemon_icons_2v.json @@ -1,3296 +1,1271 @@ -{ - "textures": [ - { - "image": "pokemon_icons_2v.png", - "format": "RGBA8888", - "size": { - "w": 251, - "h": 271 - }, - "scale": 1, - "frames": [ - { - "filename": "249_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 29 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 29 - } - }, - { - "filename": "249_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 29 - }, - "frame": { - "x": 0, - "y": 29, - "w": 32, - "h": 29 - } - }, - { - "filename": "250_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 29, - "h": 30 - }, - "frame": { - "x": 32, - "y": 0, - "w": 29, - "h": 30 - } - }, - { - "filename": "250_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 58, - "w": 29, - "h": 30 - } - }, - { - "filename": "248-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 28, - "h": 29 - }, - "frame": { - "x": 61, - "y": 0, - "w": 28, - "h": 29 - } - }, - { - "filename": "248-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 28, - "h": 29 - }, - "frame": { - "x": 0, - "y": 88, - "w": 28, - "h": 29 - } - }, - { - "filename": "212-mega_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 32, - "y": 30, - "w": 28, - "h": 28 - } - }, - { - "filename": "212-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 29, - "y": 58, - "w": 28, - "h": 28 - } - }, - { - "filename": "212-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 89, - "y": 0, - "w": 28, - "h": 28 - } - }, - { - "filename": "181-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 29, - "h": 26 - }, - "frame": { - "x": 117, - "y": 0, - "w": 29, - "h": 26 - } - }, - { - "filename": "181-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 29, - "h": 26 - }, - "frame": { - "x": 146, - "y": 0, - "w": 29, - "h": 26 - } - }, - { - "filename": "243_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 30, - "h": 25 - }, - "frame": { - "x": 175, - "y": 0, - "w": 30, - "h": 25 - } - }, - { - "filename": "243_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 30, - "h": 25 - }, - "frame": { - "x": 205, - "y": 0, - "w": 30, - "h": 25 - } - }, - { - "filename": "216_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 235, - "y": 0, - "w": 16, - "h": 20 - } - }, - { - "filename": "212_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 26, - "h": 27 - }, - "frame": { - "x": 0, - "y": 117, - "w": 26, - "h": 27 - } - }, - { - "filename": "212_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 26, - "h": 27 - }, - "frame": { - "x": 0, - "y": 144, - "w": 26, - "h": 27 - } - }, - { - "filename": "212_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 26, - "h": 27 - }, - "frame": { - "x": 0, - "y": 171, - "w": 26, - "h": 27 - } - }, - { - "filename": "245_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 0, - "y": 198, - "w": 29, - "h": 25 - } - }, - { - "filename": "245_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 0, - "y": 223, - "w": 29, - "h": 25 - } - }, - { - "filename": "169_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 23 - }, - "frame": { - "x": 0, - "y": 248, - "w": 30, - "h": 23 - } - }, - { - "filename": "216_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 235, - "y": 20, - "w": 16, - "h": 20 - } - }, - { - "filename": "169_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 23 - }, - "frame": { - "x": 117, - "y": 26, - "w": 30, - "h": 23 - } - }, - { - "filename": "169_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 23 - }, - "frame": { - "x": 147, - "y": 26, - "w": 30, - "h": 23 - } - }, - { - "filename": "232_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 177, - "y": 25, - "w": 29, - "h": 22 - } - }, - { - "filename": "232_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 206, - "y": 25, - "w": 29, - "h": 22 - } - }, - { - "filename": "200_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 235, - "y": 40, - "w": 16, - "h": 19 - } - }, - { - "filename": "226_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 30, - "h": 19 - }, - "frame": { - "x": 177, - "y": 47, - "w": 30, - "h": 19 - } - }, - { - "filename": "196_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 21 - }, - "frame": { - "x": 207, - "y": 47, - "w": 27, - "h": 21 - } - }, - { - "filename": "176_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 234, - "y": 59, - "w": 17, - "h": 21 - } - }, - { - "filename": "226_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 30, - "h": 19 - }, - "frame": { - "x": 29, - "y": 86, - "w": 30, - "h": 19 - } - }, - { - "filename": "196_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 21 - }, - "frame": { - "x": 28, - "y": 105, - "w": 27, - "h": 21 - } - }, - { - "filename": "229-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 23, - "h": 27 - }, - "frame": { - "x": 26, - "y": 126, - "w": 23, - "h": 27 - } - }, - { - "filename": "229-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 23, - "h": 27 - }, - "frame": { - "x": 26, - "y": 153, - "w": 23, - "h": 27 - } - }, - { - "filename": "183_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 26, - "y": 180, - "w": 23, - "h": 17 - } - }, - { - "filename": "181_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 29, - "y": 197, - "w": 20, - "h": 25 - } - }, - { - "filename": "199_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 19, - "h": 26 - }, - "frame": { - "x": 29, - "y": 222, - "w": 19, - "h": 26 - } - }, - { - "filename": "227_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 30, - "y": 248, - "w": 25, - "h": 23 - } - }, - { - "filename": "161_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 15, - "h": 26 - }, - "frame": { - "x": 48, - "y": 222, - "w": 15, - "h": 26 - } - }, - { - "filename": "227_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 55, - "y": 248, - "w": 25, - "h": 23 - } - }, - { - "filename": "161_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 15, - "h": 26 - }, - "frame": { - "x": 49, - "y": 126, - "w": 15, - "h": 26 - } - }, - { - "filename": "181_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 49, - "y": 152, - "w": 20, - "h": 25 - } - }, - { - "filename": "184_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 49, - "y": 177, - "w": 25, - "h": 24 - } - }, - { - "filename": "196_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 21 - }, - "frame": { - "x": 49, - "y": 201, - "w": 27, - "h": 21 - } - }, - { - "filename": "184_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 63, - "y": 222, - "w": 25, - "h": 24 - } - }, - { - "filename": "162_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 55, - "y": 105, - "w": 23, - "h": 21 - } - }, - { - "filename": "207_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 24 - }, - "frame": { - "x": 64, - "y": 126, - "w": 24, - "h": 24 - } - }, - { - "filename": "207_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 24 - }, - "frame": { - "x": 69, - "y": 150, - "w": 24, - "h": 24 - } - }, - { - "filename": "235_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 93, - "y": 28, - "w": 24, - "h": 21 - } - }, - { - "filename": "244_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 74, - "y": 174, - "w": 25, - "h": 24 - } - }, - { - "filename": "244_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 76, - "y": 198, - "w": 25, - "h": 24 - } - }, - { - "filename": "248_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 88, - "y": 222, - "w": 25, - "h": 24 - } - }, - { - "filename": "248_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 80, - "y": 246, - "w": 25, - "h": 24 - } - }, - { - "filename": "164_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 18, - "h": 23 - }, - "frame": { - "x": 105, - "y": 246, - "w": 18, - "h": 23 - } - }, - { - "filename": "201-c_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 20 - }, - "frame": { - "x": 78, - "y": 29, - "w": 15, - "h": 20 - } - }, - { - "filename": "164_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 18, - "h": 23 - }, - "frame": { - "x": 60, - "y": 30, - "w": 18, - "h": 23 - } - }, - { - "filename": "235_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 78, - "y": 49, - "w": 24, - "h": 21 - } - }, - { - "filename": "162_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 102, - "y": 49, - "w": 23, - "h": 21 - } - }, - { - "filename": "242_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 125, - "y": 49, - "w": 22, - "h": 22 - } - }, - { - "filename": "242_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 147, - "y": 49, - "w": 22, - "h": 22 - } - }, - { - "filename": "201-h_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 60, - "y": 53, - "w": 18, - "h": 19 - } - }, - { - "filename": "201-n_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 13, - "w": 22, - "h": 14 - }, - "frame": { - "x": 57, - "y": 72, - "w": 22, - "h": 14 - } - }, - { - "filename": "206_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 59, - "y": 86, - "w": 21, - "h": 19 - } - }, - { - "filename": "231_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 79, - "y": 70, - "w": 20, - "h": 16 - } - }, - { - "filename": "183_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 99, - "y": 70, - "w": 23, - "h": 17 - } - }, - { - "filename": "228_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 80, - "y": 86, - "w": 19, - "h": 20 - } - }, - { - "filename": "179_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 78, - "y": 106, - "w": 22, - "h": 20 - } - }, - { - "filename": "206_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 99, - "y": 87, - "w": 21, - "h": 19 - } - }, - { - "filename": "179_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 100, - "y": 106, - "w": 22, - "h": 20 - } - }, - { - "filename": "217_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 88, - "y": 126, - "w": 21, - "h": 23 - } - }, - { - "filename": "217_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 93, - "y": 149, - "w": 21, - "h": 23 - } - }, - { - "filename": "201-s_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 14, - "h": 23 - }, - "frame": { - "x": 109, - "y": 126, - "w": 14, - "h": 23 - } - }, - { - "filename": "217_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 99, - "y": 172, - "w": 21, - "h": 23 - } - }, - { - "filename": "229_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 101, - "y": 195, - "w": 20, - "h": 23 - } - }, - { - "filename": "201-s_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 14, - "h": 23 - }, - "frame": { - "x": 114, - "y": 149, - "w": 14, - "h": 23 - } - }, - { - "filename": "242_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 122, - "y": 71, - "w": 22, - "h": 22 - } - }, - { - "filename": "180_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 144, - "y": 71, - "w": 21, - "h": 22 - } - }, - { - "filename": "229_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 120, - "y": 172, - "w": 20, - "h": 23 - } - }, - { - "filename": "180_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 121, - "y": 195, - "w": 21, - "h": 22 - } - }, - { - "filename": "197_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 122, - "y": 93, - "w": 20, - "h": 21 - } - }, - { - "filename": "197_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 142, - "y": 93, - "w": 20, - "h": 21 - } - }, - { - "filename": "222_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 123, - "y": 114, - "w": 21, - "h": 20 - } - }, - { - "filename": "201-m_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 144, - "y": 114, - "w": 18, - "h": 20 - } - }, - { - "filename": "201-n_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 13, - "w": 22, - "h": 14 - }, - "frame": { - "x": 123, - "y": 134, - "w": 22, - "h": 14 - } - }, - { - "filename": "176_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 128, - "y": 148, - "w": 17, - "h": 21 - } - }, - { - "filename": "176_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 145, - "y": 134, - "w": 17, - "h": 21 - } - }, - { - "filename": "163_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 145, - "y": 155, - "w": 17, - "h": 20 - } - }, - { - "filename": "222_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 140, - "y": 175, - "w": 21, - "h": 20 - } - }, - { - "filename": "228_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 142, - "y": 195, - "w": 19, - "h": 20 - } - }, - { - "filename": "201-a_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 10, - "h": 21 - }, - "frame": { - "x": 113, - "y": 218, - "w": 10, - "h": 21 - } - }, - { - "filename": "239_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 123, - "y": 217, - "w": 21, - "h": 20 - } - }, - { - "filename": "215_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 144, - "y": 215, - "w": 17, - "h": 21 - } - }, - { - "filename": "239_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 123, - "y": 237, - "w": 21, - "h": 20 - } - }, - { - "filename": "201-x_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 14, - "w": 13, - "h": 14 - }, - "frame": { - "x": 123, - "y": 257, - "w": 13, - "h": 14 - } - }, - { - "filename": "215_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 144, - "y": 236, - "w": 17, - "h": 21 - } - }, - { - "filename": "201-x_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 14, - "w": 13, - "h": 14 - }, - "frame": { - "x": 136, - "y": 257, - "w": 13, - "h": 14 - } - }, - { - "filename": "201-a_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 10, - "h": 21 - }, - "frame": { - "x": 165, - "y": 71, - "w": 10, - "h": 21 - } - }, - { - "filename": "239_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 175, - "y": 66, - "w": 21, - "h": 20 - } - }, - { - "filename": "201-p_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 8, - "w": 11, - "h": 20 - }, - "frame": { - "x": 196, - "y": 66, - "w": 11, - "h": 20 - } - }, - { - "filename": "201-h_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 207, - "y": 68, - "w": 18, - "h": 19 - } - }, - { - "filename": "231_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 175, - "y": 86, - "w": 20, - "h": 16 - } - }, - { - "filename": "201-k_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 13, - "h": 20 - }, - "frame": { - "x": 162, - "y": 93, - "w": 13, - "h": 20 - } - }, - { - "filename": "163_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 162, - "y": 113, - "w": 17, - "h": 20 - } - }, - { - "filename": "201-m_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 162, - "y": 133, - "w": 18, - "h": 20 - } - }, - { - "filename": "201-o_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 162, - "y": 153, - "w": 18, - "h": 19 - } - }, - { - "filename": "201-b_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 12, - "h": 21 - }, - "frame": { - "x": 195, - "y": 86, - "w": 12, - "h": 21 - } - }, - { - "filename": "201-o_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 207, - "y": 87, - "w": 18, - "h": 19 - } - }, - { - "filename": "200_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 179, - "y": 102, - "w": 16, - "h": 19 - } - }, - { - "filename": "173_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 195, - "y": 107, - "w": 16, - "h": 16 - } - }, - { - "filename": "175_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 16, - "h": 18 - }, - "frame": { - "x": 211, - "y": 106, - "w": 16, - "h": 18 - } - }, - { - "filename": "200_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 225, - "y": 80, - "w": 16, - "h": 19 - } - }, - { - "filename": "201-g_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 10, - "h": 21 - }, - "frame": { - "x": 241, - "y": 80, - "w": 10, - "h": 21 - } - }, - { - "filename": "201-e_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 227, - "y": 99, - "w": 14, - "h": 20 - } - }, - { - "filename": "201-g_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 10, - "h": 21 - }, - "frame": { - "x": 241, - "y": 101, - "w": 10, - "h": 21 - } - }, - { - "filename": "201-c_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 20 - }, - "frame": { - "x": 180, - "y": 121, - "w": 15, - "h": 20 - } - }, - { - "filename": "175_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 16, - "h": 18 - }, - "frame": { - "x": 195, - "y": 123, - "w": 16, - "h": 18 - } - }, - { - "filename": "246_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 15, - "h": 20 - }, - "frame": { - "x": 180, - "y": 141, - "w": 15, - "h": 20 - } - }, - { - "filename": "246_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 15, - "h": 20 - }, - "frame": { - "x": 195, - "y": 141, - "w": 15, - "h": 20 - } - }, - { - "filename": "175_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 16, - "h": 18 - }, - "frame": { - "x": 211, - "y": 124, - "w": 16, - "h": 18 - } - }, - { - "filename": "201-e_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 227, - "y": 119, - "w": 14, - "h": 20 - } - }, - { - "filename": "201-exclamation_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 10, - "h": 20 - }, - "frame": { - "x": 241, - "y": 122, - "w": 10, - "h": 20 - } - }, - { - "filename": "247_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 210, - "y": 142, - "w": 16, - "h": 19 - } - }, - { - "filename": "201-u_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 180, - "y": 161, - "w": 18, - "h": 16 - } - }, - { - "filename": "201-u_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 198, - "y": 161, - "w": 18, - "h": 16 - } - }, - { - "filename": "201-b_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 12, - "h": 21 - }, - "frame": { - "x": 216, - "y": 161, - "w": 12, - "h": 21 - } - }, - { - "filename": "247_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 226, - "y": 142, - "w": 16, - "h": 19 - } - }, - { - "filename": "201-d_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 228, - "y": 161, - "w": 14, - "h": 19 - } - }, - { - "filename": "201-question_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 11, - "h": 21 - }, - "frame": { - "x": 161, - "y": 175, - "w": 11, - "h": 21 - } - }, - { - "filename": "201-question_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 11, - "h": 21 - }, - "frame": { - "x": 161, - "y": 196, - "w": 11, - "h": 21 - } - }, - { - "filename": "201-k_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 13, - "h": 20 - }, - "frame": { - "x": 161, - "y": 217, - "w": 13, - "h": 20 - } - }, - { - "filename": "201-l_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 13, - "h": 20 - }, - "frame": { - "x": 161, - "y": 237, - "w": 13, - "h": 20 - } - }, - { - "filename": "201-f_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 15, - "h": 19 - }, - "frame": { - "x": 172, - "y": 177, - "w": 15, - "h": 19 - } - }, - { - "filename": "201-f_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 15, - "h": 19 - }, - "frame": { - "x": 172, - "y": 196, - "w": 15, - "h": 19 - } - }, - { - "filename": "201-w_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 187, - "y": 177, - "w": 17, - "h": 17 - } - }, - { - "filename": "201-t_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 12, - "h": 19 - }, - "frame": { - "x": 204, - "y": 177, - "w": 12, - "h": 19 - } - }, - { - "filename": "201-w_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 187, - "y": 194, - "w": 17, - "h": 17 - } - }, - { - "filename": "201-l_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 13, - "h": 20 - }, - "frame": { - "x": 174, - "y": 215, - "w": 13, - "h": 20 - } - }, - { - "filename": "201-d_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 187, - "y": 211, - "w": 14, - "h": 19 - } - }, - { - "filename": "201-y_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 174, - "y": 235, - "w": 13, - "h": 19 - } - }, - { - "filename": "201-v_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 187, - "y": 230, - "w": 14, - "h": 18 - } - }, - { - "filename": "201-q_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 14, - "h": 16 - }, - "frame": { - "x": 204, - "y": 196, - "w": 14, - "h": 16 - } - }, - { - "filename": "201-v_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 201, - "y": 212, - "w": 14, - "h": 18 - } - }, - { - "filename": "251_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 18 - }, - "frame": { - "x": 201, - "y": 230, - "w": 14, - "h": 18 - } - }, - { - "filename": "201-exclamation_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 10, - "h": 20 - }, - "frame": { - "x": 215, - "y": 212, - "w": 10, - "h": 20 - } - }, - { - "filename": "201-i_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 8, - "w": 10, - "h": 20 - }, - "frame": { - "x": 215, - "y": 232, - "w": 10, - "h": 20 - } - }, - { - "filename": "201-q_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 14, - "h": 16 - }, - "frame": { - "x": 187, - "y": 248, - "w": 14, - "h": 16 - } - }, - { - "filename": "251_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 18 - }, - "frame": { - "x": 201, - "y": 248, - "w": 14, - "h": 18 - } - }, - { - "filename": "201-y_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 215, - "y": 252, - "w": 13, - "h": 19 - } - }, - { - "filename": "201-i_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 8, - "w": 10, - "h": 20 - }, - "frame": { - "x": 218, - "y": 182, - "w": 10, - "h": 20 - } - }, - { - "filename": "201-p_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 8, - "w": 11, - "h": 20 - }, - "frame": { - "x": 228, - "y": 180, - "w": 11, - "h": 20 - } - }, - { - "filename": "201-t_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 12, - "h": 19 - }, - "frame": { - "x": 239, - "y": 180, - "w": 12, - "h": 19 - } - }, - { - "filename": "201-j_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 9, - "w": 11, - "h": 19 - }, - "frame": { - "x": 228, - "y": 200, - "w": 11, - "h": 19 - } - }, - { - "filename": "201-j_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 9, - "w": 11, - "h": 19 - }, - "frame": { - "x": 239, - "y": 199, - "w": 11, - "h": 19 - } - }, - { - "filename": "201-z_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 9, - "w": 10, - "h": 19 - }, - "frame": { - "x": 225, - "y": 219, - "w": 10, - "h": 19 - } - }, - { - "filename": "201-z_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 9, - "w": 10, - "h": 19 - }, - "frame": { - "x": 235, - "y": 219, - "w": 10, - "h": 19 - } - }, - { - "filename": "201-r_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 16, - "y": 10, - "w": 10, - "h": 18 - }, - "frame": { - "x": 228, - "y": 238, - "w": 10, - "h": 18 - } - }, - { - "filename": "201-r_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 16, - "y": 10, - "w": 10, - "h": 18 - }, - "frame": { - "x": 238, - "y": 238, - "w": 10, - "h": 18 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f68072f2f63507b99c4550bc32bafaf3:ecfff43f4672541500abdde038d7f530:63b368599cdc6e139499267117e91cd5$" - } -} +{ "frames": { + "161_2": { + "frame": { "x": 225, "y": 163, "w": 15, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 15, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "161_3": { + "frame": { "x": 82, "y": 162, "w": 15, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 15, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "162_2": { + "frame": { "x": 22, "y": 102, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "162_3": { + "frame": { "x": 45, "y": 103, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "163_2": { + "frame": { "x": 0, "y": 184, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "163_3": { + "frame": { "x": 240, "y": 183, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "164_2": { + "frame": { "x": 64, "y": 145, "w": 18, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 18, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "164_3": { + "frame": { "x": 186, "y": 145, "w": 18, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 18, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "169_1": { + "frame": { "x": 148, "y": 29, "w": 30, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "169_2": { + "frame": { "x": 55, "y": 30, "w": 30, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "169_3": { + "frame": { "x": 85, "y": 30, "w": 30, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "173_3": { + "frame": { "x": 64, "y": 223, "w": 16, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "175_1": { + "frame": { "x": 185, "y": 206, "w": 16, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "175_2": { + "frame": { "x": 31, "y": 207, "w": 16, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "175_3": { + "frame": { "x": 169, "y": 207, "w": 16, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "176_1": { + "frame": { "x": 54, "y": 168, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "176_2": { + "frame": { "x": 37, "y": 166, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "176_3": { + "frame": { "x": 261, "y": 99, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "177_2": { + "frame": { "x": 135, "y": 196, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "177_3": { + "frame": { "x": 152, "y": 196, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "178_2": { + "frame": { "x": 276, "y": 164, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "178_3": { + "frame": { "x": 293, "y": 164, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "179_2": { + "frame": { "x": 226, "y": 143, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "179_3": { + "frame": { "x": 88, "y": 142, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "180_2": { + "frame": { "x": 116, "y": 122, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "180_3": { + "frame": { "x": 239, "y": 121, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "181-mega_2": { + "frame": { "x": 262, "y": 0, "w": 29, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 29, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "181-mega_3": { + "frame": { "x": 291, "y": 0, "w": 29, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 29, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "181_2": { + "frame": { "x": 200, "y": 96, "w": 20, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 20, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "181_3": { + "frame": { "x": 124, "y": 97, "w": 20, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 20, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "182_2": { + "frame": { "x": 97, "y": 184, "w": 16, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "182_3": { + "frame": { "x": 17, "y": 184, "w": 16, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "183_2": { + "frame": { "x": 154, "y": 160, "w": 23, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 23, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "183_3": { + "frame": { "x": 131, "y": 156, "w": 23, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 23, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "184_2": { + "frame": { "x": 25, "y": 56, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "184_3": { + "frame": { "x": 202, "y": 53, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "185_2": { + "frame": { "x": 22, "y": 123, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "185_3": { + "frame": { "x": 0, "y": 123, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "190_2": { + "frame": { "x": 284, "y": 124, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "190_3": { + "frame": { "x": 260, "y": 124, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "193_2": { + "frame": { "x": 137, "y": 140, "w": 28, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 12, "w": 28, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "193_3": { + "frame": { "x": 88, "y": 126, "w": 28, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 12, "w": 28, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "196_1": { + "frame": { "x": 251, "y": 78, "w": 27, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "196_2": { + "frame": { "x": 0, "y": 80, "w": 27, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "196_3": { + "frame": { "x": 289, "y": 77, "w": 27, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "197_2": { + "frame": { "x": 289, "y": 143, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "197_3": { + "frame": { "x": 269, "y": 143, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "199_1": { + "frame": { "x": 220, "y": 97, "w": 19, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "199_2": { + "frame": { "x": 297, "y": 98, "w": 19, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "199_3": { + "frame": { "x": 278, "y": 98, "w": 19, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "200_1": { + "frame": { "x": 69, "y": 204, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "200_2": { + "frame": { "x": 257, "y": 202, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "200_3": { + "frame": { "x": 211, "y": 203, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-a_2": { + "frame": { "x": 148, "y": 233, "w": 10, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-a_3": { + "frame": { "x": 128, "y": 230, "w": 10, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-b_2": { + "frame": { "x": 13, "y": 225, "w": 12, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 12, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-b_3": { + "frame": { "x": 271, "y": 224, "w": 12, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 12, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-c_2": { + "frame": { "x": 85, "y": 205, "w": 15, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-c_3": { + "frame": { "x": 304, "y": 205, "w": 15, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-d_2": { + "frame": { "x": 201, "y": 222, "w": 14, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 14, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-d_3": { + "frame": { "x": 215, "y": 222, "w": 14, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 14, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-exclamation_2": { + "frame": { "x": 227, "y": 53, "w": 10, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 10, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-exclamation_3": { + "frame": { "x": 103, "y": 241, "w": 10, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 10, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-e_2": { + "frame": { "x": 257, "y": 221, "w": 14, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 14, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-e_3": { + "frame": { "x": 243, "y": 203, "w": 14, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 14, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-f_2": { + "frame": { "x": 152, "y": 214, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-f_3": { + "frame": { "x": 212, "y": 77, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-g_2": { + "frame": { "x": 310, "y": 145, "w": 10, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-g_3": { + "frame": { "x": 138, "y": 230, "w": 10, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-h_2": { + "frame": { "x": 177, "y": 168, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-h_3": { + "frame": { "x": 115, "y": 173, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-i_2": { + "frame": { "x": 113, "y": 241, "w": 10, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 8, "w": 10, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-i_3": { + "frame": { "x": 199, "y": 241, "w": 10, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 8, "w": 10, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-j_2": { + "frame": { "x": 62, "y": 239, "w": 11, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 9, "w": 11, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-j_3": { + "frame": { "x": 92, "y": 241, "w": 11, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 9, "w": 11, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-k_2": { + "frame": { "x": 229, "y": 222, "w": 13, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-k_3": { + "frame": { "x": 226, "y": 123, "w": 13, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-l_2": { + "frame": { "x": 291, "y": 208, "w": 13, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-l_3": { + "frame": { "x": 0, "y": 223, "w": 13, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-m_2": { + "frame": { "x": 97, "y": 164, "w": 18, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-m_3": { + "frame": { "x": 19, "y": 164, "w": 18, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-n_2": { + "frame": { "x": 211, "y": 189, "w": 22, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-n_3": { + "frame": { "x": 113, "y": 192, "w": 22, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-o_2": { + "frame": { "x": 151, "y": 177, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-o_3": { + "frame": { "x": 133, "y": 173, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-p_2": { + "frame": { "x": 71, "y": 168, "w": 11, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 8, "w": 11, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-p_3": { + "frame": { "x": 278, "y": 78, "w": 11, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 8, "w": 11, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-question_2": { + "frame": { "x": 309, "y": 124, "w": 11, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 11, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-question_3": { + "frame": { "x": 51, "y": 225, "w": 11, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 11, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-q_2": { + "frame": { "x": 304, "y": 225, "w": 14, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 14, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-q_3": { + "frame": { "x": 283, "y": 228, "w": 14, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 14, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-r_2": { + "frame": { "x": 255, "y": 241, "w": 10, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 10, "w": 10, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-r_3": { + "frame": { "x": 297, "y": 241, "w": 10, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 10, "w": 10, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-s_2": { + "frame": { "x": 290, "y": 185, "w": 14, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 14, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-s_3": { + "frame": { "x": 276, "y": 185, "w": 14, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 14, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-t_2": { + "frame": { "x": 167, "y": 225, "w": 12, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 12, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-t_3": { + "frame": { "x": 80, "y": 225, "w": 12, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 12, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-u_2": { + "frame": { "x": 273, "y": 208, "w": 18, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 18, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-u_3": { + "frame": { "x": 134, "y": 214, "w": 18, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 18, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-v_2": { + "frame": { "x": 100, "y": 223, "w": 14, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-v_3": { + "frame": { "x": 185, "y": 224, "w": 14, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-w_2": { + "frame": { "x": 100, "y": 206, "w": 17, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-w_3": { + "frame": { "x": 117, "y": 206, "w": 17, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-x_2": { + "frame": { "x": 242, "y": 241, "w": 13, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 13, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-x_3": { + "frame": { "x": 209, "y": 241, "w": 13, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 13, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-y_2": { + "frame": { "x": 25, "y": 225, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-y_3": { + "frame": { "x": 38, "y": 225, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-z_2": { + "frame": { "x": 310, "y": 166, "w": 10, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 9, "w": 10, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "201-z_3": { + "frame": { "x": 185, "y": 187, "w": 10, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 9, "w": 10, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "203_2": { + "frame": { "x": 102, "y": 80, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "203_3": { + "frame": { "x": 51, "y": 80, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "206_2": { + "frame": { "x": 204, "y": 146, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "206_3": { + "frame": { "x": 42, "y": 147, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "207_2": { + "frame": { "x": 227, "y": 73, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "207_3": { + "frame": { "x": 103, "y": 56, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "212-mega_1": { + "frame": { "x": 234, "y": 0, "w": 28, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "212-mega_2": { + "frame": { "x": 206, "y": 0, "w": 28, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "212-mega_3": { + "frame": { "x": 178, "y": 0, "w": 28, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "212_1": { + "frame": { "x": 122, "y": 29, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "212_2": { + "frame": { "x": 292, "y": 26, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "212_3": { + "frame": { "x": 29, "y": 29, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "213_2": { + "frame": { "x": 27, "y": 80, "w": 24, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "213_3": { + "frame": { "x": 78, "y": 77, "w": 24, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "215_2": { + "frame": { "x": 259, "y": 164, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "215_3": { + "frame": { "x": 204, "y": 165, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "216_2": { + "frame": { "x": 304, "y": 185, "w": 16, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "216_3": { + "frame": { "x": 169, "y": 187, "w": 16, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "217_1": { + "frame": { "x": 95, "y": 103, "w": 21, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "217_2": { + "frame": { "x": 144, "y": 117, "w": 21, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "217_3": { + "frame": { "x": 165, "y": 117, "w": 21, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "222_2": { + "frame": { "x": 248, "y": 143, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "222_3": { + "frame": { "x": 110, "y": 144, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "226_2": { + "frame": { "x": 182, "y": 77, "w": 30, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 9, "w": 30, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "226_3": { + "frame": { "x": 152, "y": 77, "w": 30, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 9, "w": 30, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "227_2": { + "frame": { "x": 127, "y": 74, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "227_3": { + "frame": { "x": 237, "y": 28, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "228_2": { + "frame": { "x": 0, "y": 164, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "228_3": { + "frame": { "x": 240, "y": 163, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "229-mega_2": { + "frame": { "x": 266, "y": 51, "w": 23, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 23, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "229-mega_3": { + "frame": { "x": 55, "y": 53, "w": 23, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 23, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "229_2": { + "frame": { "x": 44, "y": 124, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "229_3": { + "frame": { "x": 206, "y": 123, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "230_2": { + "frame": { "x": 68, "y": 121, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "230_3": { + "frame": { "x": 186, "y": 121, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "231_2": { + "frame": { "x": 49, "y": 189, "w": 20, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "231_3": { + "frame": { "x": 71, "y": 188, "w": 20, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "232_2": { + "frame": { "x": 237, "y": 51, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "232_3": { + "frame": { "x": 148, "y": 52, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "233_2": { + "frame": { "x": 257, "y": 185, "w": 19, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "233_3": { + "frame": { "x": 127, "y": 56, "w": 19, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "235_2": { + "frame": { "x": 176, "y": 96, "w": 24, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 24, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "235_3": { + "frame": { "x": 152, "y": 96, "w": 24, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 24, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "239_1": { + "frame": { "x": 0, "y": 144, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "239_2": { + "frame": { "x": 21, "y": 144, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "239_3": { + "frame": { "x": 165, "y": 140, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "240_2": { + "frame": { "x": 33, "y": 187, "w": 16, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "240_3": { + "frame": { "x": 195, "y": 186, "w": 16, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "242_1": { + "frame": { "x": 239, "y": 99, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "242_2": { + "frame": { "x": 0, "y": 101, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "242_3": { + "frame": { "x": 73, "y": 99, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "243_2": { + "frame": { "x": 262, "y": 26, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "243_3": { + "frame": { "x": 178, "y": 28, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "244_2": { + "frame": { "x": 289, "y": 53, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "244_3": { + "frame": { "x": 0, "y": 54, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "245_2": { + "frame": { "x": 208, "y": 28, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "245_3": { + "frame": { "x": 0, "y": 29, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "246_2": { + "frame": { "x": 49, "y": 205, "w": 15, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 15, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "246_3": { + "frame": { "x": 16, "y": 205, "w": 15, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 15, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "247_2": { + "frame": { "x": 0, "y": 204, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "247_3": { + "frame": { "x": 227, "y": 203, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "248-mega_2": { + "frame": { "x": 122, "y": 0, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "248-mega_3": { + "frame": { "x": 150, "y": 0, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "248_2": { + "frame": { "x": 177, "y": 53, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "248_3": { + "frame": { "x": 78, "y": 53, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "249_2": { + "frame": { "x": 0, "y": 0, "w": 32, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "249_3": { + "frame": { "x": 32, "y": 0, "w": 32, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "250_2": { + "frame": { "x": 93, "y": 0, "w": 29, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "250_3": { + "frame": { "x": 64, "y": 0, "w": 29, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "251_2": { + "frame": { "x": 114, "y": 223, "w": 14, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "251_3": { + "frame": { "x": 242, "y": 223, "w": 14, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_2v.png", + "format": "RGBA8888", + "size": { "w": 320, "h": 261 }, + "scale": "1" + } +} diff --git a/public/images/pokemon_icons_2v.png b/public/images/pokemon_icons_2v.png index 21260b4d38f..443d14b176d 100644 Binary files a/public/images/pokemon_icons_2v.png and b/public/images/pokemon_icons_2v.png differ diff --git a/public/images/pokemon_icons_3v.json b/public/images/pokemon_icons_3v.json index 99de7cb8d7f..2cd15286a81 100644 --- a/public/images/pokemon_icons_3v.json +++ b/public/images/pokemon_icons_3v.json @@ -1,3842 +1,1411 @@ -{ - "textures": [ - { - "image": "pokemon_icons_3v.png", - "format": "RGBA8888", - "size": { - "w": 128, - "h": 741 - }, - "scale": 1, - "frames": [ - { - "filename": "384-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 25 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 25 - } - }, - { - "filename": "384-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 25 - }, - "frame": { - "x": 0, - "y": 25, - "w": 38, - "h": 25 - } - }, - { - "filename": "373-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 35, - "h": 25 - }, - "frame": { - "x": 38, - "y": 0, - "w": 35, - "h": 25 - } - }, - { - "filename": "373-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 35, - "h": 25 - }, - "frame": { - "x": 0, - "y": 50, - "w": 35, - "h": 25 - } - }, - { - "filename": "383-primal_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 24 - }, - "frame": { - "x": 73, - "y": 0, - "w": 36, - "h": 24 - } - }, - { - "filename": "362_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 109, - "y": 0, - "w": 19, - "h": 20 - } - }, - { - "filename": "380-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 35, - "h": 24 - }, - "frame": { - "x": 38, - "y": 25, - "w": 35, - "h": 24 - } - }, - { - "filename": "383-primal_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 24 - }, - "frame": { - "x": 73, - "y": 24, - "w": 36, - "h": 24 - } - }, - { - "filename": "362_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 109, - "y": 20, - "w": 19, - "h": 20 - } - }, - { - "filename": "380-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 35, - "h": 24 - }, - "frame": { - "x": 0, - "y": 75, - "w": 35, - "h": 24 - } - }, - { - "filename": "381-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 35, - "h": 24 - }, - "frame": { - "x": 0, - "y": 99, - "w": 35, - "h": 24 - } - }, - { - "filename": "381-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 35, - "h": 24 - }, - "frame": { - "x": 0, - "y": 123, - "w": 35, - "h": 24 - } - }, - { - "filename": "384_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 31, - "h": 27 - }, - "frame": { - "x": 0, - "y": 147, - "w": 31, - "h": 27 - } - }, - { - "filename": "384_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 31, - "h": 27 - }, - "frame": { - "x": 0, - "y": 174, - "w": 31, - "h": 27 - } - }, - { - "filename": "306-mega_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 31, - "h": 26 - }, - "frame": { - "x": 0, - "y": 201, - "w": 31, - "h": 26 - } - }, - { - "filename": "306-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 31, - "h": 26 - }, - "frame": { - "x": 0, - "y": 227, - "w": 31, - "h": 26 - } - }, - { - "filename": "306-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 31, - "h": 26 - }, - "frame": { - "x": 0, - "y": 253, - "w": 31, - "h": 26 - } - }, - { - "filename": "357_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 31, - "h": 26 - }, - "frame": { - "x": 0, - "y": 279, - "w": 31, - "h": 26 - } - }, - { - "filename": "357_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 31, - "h": 26 - }, - "frame": { - "x": 0, - "y": 305, - "w": 31, - "h": 26 - } - }, - { - "filename": "303-mega_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 30, - "h": 26 - }, - "frame": { - "x": 0, - "y": 331, - "w": 30, - "h": 26 - } - }, - { - "filename": "303-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 30, - "h": 26 - }, - "frame": { - "x": 0, - "y": 357, - "w": 30, - "h": 26 - } - }, - { - "filename": "303-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 30, - "h": 26 - }, - "frame": { - "x": 0, - "y": 383, - "w": 30, - "h": 26 - } - }, - { - "filename": "308-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 29, - "h": 27 - }, - "frame": { - "x": 0, - "y": 409, - "w": 29, - "h": 27 - } - }, - { - "filename": "308-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 29, - "h": 27 - }, - "frame": { - "x": 0, - "y": 436, - "w": 29, - "h": 27 - } - }, - { - "filename": "302-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 28, - "h": 27 - }, - "frame": { - "x": 0, - "y": 463, - "w": 28, - "h": 27 - } - }, - { - "filename": "302-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 28, - "h": 27 - }, - "frame": { - "x": 0, - "y": 490, - "w": 28, - "h": 27 - } - }, - { - "filename": "306_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 0, - "y": 517, - "w": 29, - "h": 24 - } - }, - { - "filename": "306_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 0, - "y": 541, - "w": 29, - "h": 24 - } - }, - { - "filename": "306_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 0, - "y": 565, - "w": 29, - "h": 24 - } - }, - { - "filename": "376-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 32, - "h": 24 - }, - "frame": { - "x": 0, - "y": 589, - "w": 32, - "h": 24 - } - }, - { - "filename": "376-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 32, - "h": 24 - }, - "frame": { - "x": 0, - "y": 613, - "w": 32, - "h": 24 - } - }, - { - "filename": "383_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 33, - "h": 24 - }, - "frame": { - "x": 0, - "y": 637, - "w": 33, - "h": 24 - } - }, - { - "filename": "383_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 33, - "h": 24 - }, - "frame": { - "x": 0, - "y": 661, - "w": 33, - "h": 24 - } - }, - { - "filename": "373_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 32, - "h": 23 - }, - "frame": { - "x": 0, - "y": 685, - "w": 32, - "h": 23 - } - }, - { - "filename": "373_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 32, - "h": 23 - }, - "frame": { - "x": 0, - "y": 708, - "w": 32, - "h": 23 - } - }, - { - "filename": "328_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 109, - "y": 40, - "w": 19, - "h": 19 - } - }, - { - "filename": "382-primal_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 8, - "w": 36, - "h": 21 - }, - "frame": { - "x": 73, - "y": 48, - "w": 36, - "h": 21 - } - }, - { - "filename": "328_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 109, - "y": 59, - "w": 19, - "h": 19 - } - }, - { - "filename": "382_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 33, - "h": 21 - }, - "frame": { - "x": 38, - "y": 49, - "w": 33, - "h": 21 - } - }, - { - "filename": "382-primal_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 8, - "w": 36, - "h": 21 - }, - "frame": { - "x": 35, - "y": 70, - "w": 36, - "h": 21 - } - }, - { - "filename": "376_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 32, - "h": 23 - }, - "frame": { - "x": 35, - "y": 91, - "w": 32, - "h": 23 - } - }, - { - "filename": "376_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 32, - "h": 23 - }, - "frame": { - "x": 35, - "y": 114, - "w": 32, - "h": 23 - } - }, - { - "filename": "382_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 33, - "h": 21 - }, - "frame": { - "x": 71, - "y": 69, - "w": 33, - "h": 21 - } - }, - { - "filename": "342_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 104, - "y": 78, - "w": 24, - "h": 23 - } - }, - { - "filename": "321_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 30, - "h": 23 - }, - "frame": { - "x": 35, - "y": 137, - "w": 30, - "h": 23 - } - }, - { - "filename": "321_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 30, - "h": 23 - }, - "frame": { - "x": 31, - "y": 160, - "w": 30, - "h": 23 - } - }, - { - "filename": "475-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 31, - "y": 183, - "w": 25, - "h": 26 - } - }, - { - "filename": "282-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 31, - "y": 209, - "w": 26, - "h": 24 - } - }, - { - "filename": "282-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 31, - "y": 233, - "w": 26, - "h": 24 - } - }, - { - "filename": "282_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 31, - "y": 257, - "w": 26, - "h": 24 - } - }, - { - "filename": "282_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 31, - "y": 281, - "w": 26, - "h": 24 - } - }, - { - "filename": "310-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 24 - }, - "frame": { - "x": 31, - "y": 305, - "w": 26, - "h": 24 - } - }, - { - "filename": "286_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 56, - "y": 183, - "w": 23, - "h": 25 - } - }, - { - "filename": "286_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 57, - "y": 208, - "w": 23, - "h": 25 - } - }, - { - "filename": "310-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 24 - }, - "frame": { - "x": 57, - "y": 233, - "w": 26, - "h": 24 - } - }, - { - "filename": "330_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 57, - "y": 257, - "w": 27, - "h": 23 - } - }, - { - "filename": "330_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 57, - "y": 280, - "w": 27, - "h": 23 - } - }, - { - "filename": "334-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 57, - "y": 303, - "w": 27, - "h": 23 - } - }, - { - "filename": "281_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 18, - "h": 23 - }, - "frame": { - "x": 61, - "y": 160, - "w": 18, - "h": 23 - } - }, - { - "filename": "281_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 18, - "h": 23 - }, - "frame": { - "x": 65, - "y": 137, - "w": 18, - "h": 23 - } - }, - { - "filename": "338_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 83, - "y": 90, - "w": 21, - "h": 22 - } - }, - { - "filename": "342_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 104, - "y": 101, - "w": 24, - "h": 23 - } - }, - { - "filename": "475_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 67, - "y": 112, - "w": 22, - "h": 25 - } - }, - { - "filename": "358_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 21 - }, - "frame": { - "x": 89, - "y": 112, - "w": 15, - "h": 21 - } - }, - { - "filename": "340_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 24, - "h": 19 - }, - "frame": { - "x": 104, - "y": 124, - "w": 24, - "h": 19 - } - }, - { - "filename": "311_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 67, - "y": 91, - "w": 16, - "h": 19 - } - }, - { - "filename": "338_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 83, - "y": 137, - "w": 21, - "h": 22 - } - }, - { - "filename": "340_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 24, - "h": 19 - }, - "frame": { - "x": 104, - "y": 143, - "w": 24, - "h": 19 - } - }, - { - "filename": "334-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 57, - "y": 326, - "w": 27, - "h": 23 - } - }, - { - "filename": "303_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 31, - "y": 329, - "w": 26, - "h": 21 - } - }, - { - "filename": "375_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 27, - "h": 22 - }, - "frame": { - "x": 30, - "y": 350, - "w": 27, - "h": 22 - } - }, - { - "filename": "375_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 27, - "h": 22 - }, - "frame": { - "x": 57, - "y": 349, - "w": 27, - "h": 22 - } - }, - { - "filename": "381_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 22 - }, - "frame": { - "x": 30, - "y": 372, - "w": 28, - "h": 22 - } - }, - { - "filename": "381_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 22 - }, - "frame": { - "x": 58, - "y": 371, - "w": 28, - "h": 22 - } - }, - { - "filename": "380_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 21 - }, - "frame": { - "x": 30, - "y": 394, - "w": 27, - "h": 21 - } - }, - { - "filename": "380_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 21 - }, - "frame": { - "x": 29, - "y": 415, - "w": 27, - "h": 21 - } - }, - { - "filename": "303_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 29, - "y": 436, - "w": 26, - "h": 21 - } - }, - { - "filename": "278_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 14, - "w": 26, - "h": 14 - }, - "frame": { - "x": 29, - "y": 457, - "w": 26, - "h": 14 - } - }, - { - "filename": "303_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 28, - "y": 471, - "w": 26, - "h": 21 - } - }, - { - "filename": "315_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 28, - "y": 492, - "w": 25, - "h": 22 - } - }, - { - "filename": "362-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 29, - "y": 514, - "w": 23, - "h": 24 - } - }, - { - "filename": "362-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 29, - "y": 538, - "w": 23, - "h": 24 - } - }, - { - "filename": "315_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 29, - "y": 562, - "w": 25, - "h": 22 - } - }, - { - "filename": "334_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 32, - "y": 584, - "w": 20, - "h": 24 - } - }, - { - "filename": "334_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 32, - "y": 608, - "w": 20, - "h": 24 - } - }, - { - "filename": "308_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 17, - "h": 25 - }, - "frame": { - "x": 33, - "y": 632, - "w": 17, - "h": 25 - } - }, - { - "filename": "308_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 3, - "w": 17, - "h": 25 - }, - "frame": { - "x": 33, - "y": 657, - "w": 17, - "h": 25 - } - }, - { - "filename": "278_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 14, - "w": 26, - "h": 14 - }, - "frame": { - "x": 58, - "y": 393, - "w": 26, - "h": 14 - } - }, - { - "filename": "278_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 14, - "w": 26, - "h": 14 - }, - "frame": { - "x": 57, - "y": 407, - "w": 26, - "h": 14 - } - }, - { - "filename": "329_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 25, - "h": 20 - }, - "frame": { - "x": 56, - "y": 421, - "w": 25, - "h": 20 - } - }, - { - "filename": "369_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 55, - "y": 441, - "w": 25, - "h": 21 - } - }, - { - "filename": "329_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 25, - "h": 20 - }, - "frame": { - "x": 55, - "y": 462, - "w": 25, - "h": 20 - } - }, - { - "filename": "369_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 54, - "y": 482, - "w": 25, - "h": 21 - } - }, - { - "filename": "320_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 53, - "y": 503, - "w": 24, - "h": 18 - } - }, - { - "filename": "335_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 52, - "y": 521, - "w": 23, - "h": 22 - } - }, - { - "filename": "354_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 52, - "y": 543, - "w": 22, - "h": 19 - } - }, - { - "filename": "310_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 54, - "y": 562, - "w": 20, - "h": 23 - } - }, - { - "filename": "335_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 52, - "y": 585, - "w": 23, - "h": 22 - } - }, - { - "filename": "279_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 52, - "y": 607, - "w": 23, - "h": 21 - } - }, - { - "filename": "279_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 52, - "y": 628, - "w": 23, - "h": 21 - } - }, - { - "filename": "279_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 50, - "y": 649, - "w": 23, - "h": 21 - } - }, - { - "filename": "290_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 23, - "h": 14 - }, - "frame": { - "x": 50, - "y": 670, - "w": 23, - "h": 14 - } - }, - { - "filename": "310_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 79, - "y": 160, - "w": 20, - "h": 23 - } - }, - { - "filename": "301_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 79, - "y": 183, - "w": 22, - "h": 21 - } - }, - { - "filename": "302_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 99, - "y": 162, - "w": 23, - "h": 21 - } - }, - { - "filename": "301_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 101, - "y": 183, - "w": 22, - "h": 21 - } - }, - { - "filename": "302_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 80, - "y": 204, - "w": 23, - "h": 21 - } - }, - { - "filename": "301_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 103, - "y": 204, - "w": 22, - "h": 21 - } - }, - { - "filename": "291_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 83, - "y": 225, - "w": 23, - "h": 20 - } - }, - { - "filename": "264_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 106, - "y": 225, - "w": 22, - "h": 20 - } - }, - { - "filename": "291_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 84, - "y": 245, - "w": 23, - "h": 20 - } - }, - { - "filename": "341_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 107, - "y": 245, - "w": 21, - "h": 19 - } - }, - { - "filename": "291_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 84, - "y": 265, - "w": 23, - "h": 20 - } - }, - { - "filename": "341_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 107, - "y": 264, - "w": 21, - "h": 19 - } - }, - { - "filename": "336_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 84, - "y": 285, - "w": 23, - "h": 20 - } - }, - { - "filename": "339_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 14, - "w": 21, - "h": 13 - }, - "frame": { - "x": 107, - "y": 283, - "w": 21, - "h": 13 - } - }, - { - "filename": "336_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 84, - "y": 305, - "w": 23, - "h": 20 - } - }, - { - "filename": "339_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 14, - "w": 21, - "h": 13 - }, - "frame": { - "x": 107, - "y": 296, - "w": 21, - "h": 13 - } - }, - { - "filename": "264_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 84, - "y": 325, - "w": 22, - "h": 20 - } - }, - { - "filename": "385_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 84, - "y": 345, - "w": 22, - "h": 20 - } - }, - { - "filename": "385_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 106, - "y": 325, - "w": 22, - "h": 20 - } - }, - { - "filename": "385_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 106, - "y": 345, - "w": 22, - "h": 20 - } - }, - { - "filename": "333_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 19, - "h": 16 - }, - "frame": { - "x": 107, - "y": 309, - "w": 19, - "h": 16 - } - }, - { - "filename": "320_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 86, - "y": 365, - "w": 24, - "h": 18 - } - }, - { - "filename": "351-sunny_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 110, - "y": 365, - "w": 18, - "h": 20 - } - }, - { - "filename": "290_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 23, - "h": 14 - }, - "frame": { - "x": 86, - "y": 383, - "w": 23, - "h": 14 - } - }, - { - "filename": "374_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 17 - }, - "frame": { - "x": 109, - "y": 385, - "w": 19, - "h": 17 - } - }, - { - "filename": "290_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 23, - "h": 14 - }, - "frame": { - "x": 84, - "y": 397, - "w": 23, - "h": 14 - } - }, - { - "filename": "305_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 83, - "y": 411, - "w": 23, - "h": 17 - } - }, - { - "filename": "354_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 106, - "y": 411, - "w": 22, - "h": 19 - } - }, - { - "filename": "305_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 81, - "y": 428, - "w": 23, - "h": 17 - } - }, - { - "filename": "372_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 80, - "y": 445, - "w": 20, - "h": 21 - } - }, - { - "filename": "263_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 80, - "y": 466, - "w": 22, - "h": 16 - } - }, - { - "filename": "372_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 79, - "y": 482, - "w": 20, - "h": 21 - } - }, - { - "filename": "305_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 77, - "y": 503, - "w": 23, - "h": 17 - } - }, - { - "filename": "263_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 104, - "y": 430, - "w": 22, - "h": 16 - } - }, - { - "filename": "300_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 100, - "y": 446, - "w": 20, - "h": 20 - } - }, - { - "filename": "292_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 102, - "y": 466, - "w": 20, - "h": 19 - } - }, - { - "filename": "374_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 17 - }, - "frame": { - "x": 99, - "y": 485, - "w": 19, - "h": 17 - } - }, - { - "filename": "292_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 100, - "y": 502, - "w": 20, - "h": 19 - } - }, - { - "filename": "351-snowy_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 73, - "y": 649, - "w": 17, - "h": 23 - } - }, - { - "filename": "285_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 18, - "h": 15 - }, - "frame": { - "x": 73, - "y": 672, - "w": 18, - "h": 15 - } - }, - { - "filename": "351-snowy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 74, - "y": 543, - "w": 17, - "h": 23 - } - }, - { - "filename": "292_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 74, - "y": 566, - "w": 20, - "h": 19 - } - }, - { - "filename": "351-snowy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 75, - "y": 585, - "w": 17, - "h": 23 - } - }, - { - "filename": "300_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 75, - "y": 608, - "w": 20, - "h": 20 - } - }, - { - "filename": "358_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 21 - }, - "frame": { - "x": 75, - "y": 628, - "w": 15, - "h": 21 - } - }, - { - "filename": "351-rainy_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 90, - "y": 628, - "w": 14, - "h": 21 - } - }, - { - "filename": "351-rainy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 90, - "y": 649, - "w": 14, - "h": 21 - } - }, - { - "filename": "280_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 91, - "y": 670, - "w": 14, - "h": 18 - } - }, - { - "filename": "351-rainy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 75, - "y": 521, - "w": 14, - "h": 21 - } - }, - { - "filename": "300_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 89, - "y": 521, - "w": 20, - "h": 20 - } - }, - { - "filename": "333_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 19, - "h": 16 - }, - "frame": { - "x": 109, - "y": 521, - "w": 19, - "h": 16 - } - }, - { - "filename": "309_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 19, - "h": 15 - }, - "frame": { - "x": 109, - "y": 537, - "w": 19, - "h": 15 - } - }, - { - "filename": "351-sunny_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 91, - "y": 541, - "w": 18, - "h": 20 - } - }, - { - "filename": "309_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 19, - "h": 15 - }, - "frame": { - "x": 109, - "y": 552, - "w": 19, - "h": 15 - } - }, - { - "filename": "358_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 21 - }, - "frame": { - "x": 94, - "y": 561, - "w": 15, - "h": 21 - } - }, - { - "filename": "285_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 18, - "h": 15 - }, - "frame": { - "x": 109, - "y": 567, - "w": 18, - "h": 15 - } - }, - { - "filename": "352_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 94, - "y": 582, - "w": 20, - "h": 20 - } - }, - { - "filename": "280_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 114, - "y": 582, - "w": 14, - "h": 18 - } - }, - { - "filename": "352_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 95, - "y": 602, - "w": 20, - "h": 20 - } - }, - { - "filename": "351_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 13, - "h": 20 - }, - "frame": { - "x": 115, - "y": 600, - "w": 13, - "h": 20 - } - }, - { - "filename": "351_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 13, - "h": 20 - }, - "frame": { - "x": 115, - "y": 620, - "w": 13, - "h": 20 - } - }, - { - "filename": "352_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 104, - "y": 640, - "w": 20, - "h": 20 - } - }, - { - "filename": "351-sunny_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 105, - "y": 660, - "w": 18, - "h": 20 - } - }, - { - "filename": "307_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 105, - "y": 680, - "w": 17, - "h": 20 - } - }, - { - "filename": "307_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 33, - "y": 682, - "w": 17, - "h": 20 - } - }, - { - "filename": "311_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 50, - "y": 684, - "w": 16, - "h": 19 - } - }, - { - "filename": "311_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 32, - "y": 702, - "w": 16, - "h": 19 - } - }, - { - "filename": "371_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 20 - }, - "frame": { - "x": 32, - "y": 721, - "w": 15, - "h": 20 - } - }, - { - "filename": "371_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 20 - }, - "frame": { - "x": 47, - "y": 721, - "w": 15, - "h": 20 - } - }, - { - "filename": "304_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 16, - "w": 16, - "h": 12 - }, - "frame": { - "x": 48, - "y": 703, - "w": 16, - "h": 12 - } - }, - { - "filename": "312_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 66, - "y": 687, - "w": 16, - "h": 19 - } - }, - { - "filename": "312_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 82, - "y": 688, - "w": 16, - "h": 19 - } - }, - { - "filename": "304_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 16, - "w": 16, - "h": 12 - }, - "frame": { - "x": 64, - "y": 706, - "w": 16, - "h": 12 - } - }, - { - "filename": "298_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 15, - "h": 19 - }, - "frame": { - "x": 62, - "y": 718, - "w": 15, - "h": 19 - } - }, - { - "filename": "304_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 16, - "w": 16, - "h": 12 - }, - "frame": { - "x": 80, - "y": 707, - "w": 16, - "h": 12 - } - }, - { - "filename": "298_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 15, - "h": 19 - }, - "frame": { - "x": 77, - "y": 719, - "w": 15, - "h": 19 - } - }, - { - "filename": "353_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 19 - }, - "frame": { - "x": 92, - "y": 719, - "w": 15, - "h": 19 - } - }, - { - "filename": "353_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 15, - "h": 19 - }, - "frame": { - "x": 98, - "y": 700, - "w": 15, - "h": 19 - } - }, - { - "filename": "361_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 15, - "h": 19 - }, - "frame": { - "x": 113, - "y": 700, - "w": 15, - "h": 19 - } - }, - { - "filename": "361_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 15, - "h": 19 - }, - "frame": { - "x": 107, - "y": 719, - "w": 15, - "h": 19 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:08d789205e17c770aba587de5930cc48:1f40918738164700bc9f35cd79349b0a:039b026190bf1878996b3e03190bcdf3$" - } -} +{ "frames": { + "255_2": { + "frame": { "x": 167, "y": 275, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "255_3": { + "frame": { "x": 367, "y": 186, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "256_2": { + "frame": { "x": 106, "y": 124, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "256_3": { + "frame": { "x": 51, "y": 124, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "257-mega_2": { + "frame": { "x": 146, "y": 0, "w": 32, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 32, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "257-mega_3": { + "frame": { "x": 178, "y": 0, "w": 32, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 32, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "257_2": { + "frame": { "x": 0, "y": 81, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "257_3": { + "frame": { "x": 150, "y": 78, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "261_2": { + "frame": { "x": 17, "y": 232, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "261_3": { + "frame": { "x": 38, "y": 232, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "262_2": { + "frame": { "x": 48, "y": 149, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "262_3": { + "frame": { "x": 96, "y": 149, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "263_2": { + "frame": { "x": 123, "y": 243, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "263_3": { + "frame": { "x": 252, "y": 243, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "264_2": { + "frame": { "x": 115, "y": 193, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "264_3": { + "frame": { "x": 66, "y": 192, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "278_1": { + "frame": { "x": 275, "y": 78, "w": 26, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "278_2": { + "frame": { "x": 151, "y": 232, "w": 26, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "278_3": { + "frame": { "x": 97, "y": 233, "w": 26, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "279_1": { + "frame": { "x": 178, "y": 165, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "279_2": { + "frame": { "x": 144, "y": 166, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "279_3": { + "frame": { "x": 254, "y": 161, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "280_2": { + "frame": { "x": 122, "y": 275, "w": 14, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "280_3": { + "frame": { "x": 108, "y": 275, "w": 14, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "281_2": { + "frame": { "x": 159, "y": 209, "w": 18, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 18, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "281_3": { + "frame": { "x": 177, "y": 210, "w": 18, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 18, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "282-mega_2": { + "frame": { "x": 227, "y": 99, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "282-mega_3": { + "frame": { "x": 352, "y": 0, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "282_2": { + "frame": { "x": 201, "y": 98, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "282_3": { + "frame": { "x": 175, "y": 98, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "285_2": { + "frame": { "x": 15, "y": 271, "w": 18, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 18, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "285_3": { + "frame": { "x": 307, "y": 269, "w": 18, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 18, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "286_2": { + "frame": { "x": 220, "y": 123, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "286_3": { + "frame": { "x": 0, "y": 107, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "290_1": { + "frame": { "x": 291, "y": 249, "w": 23, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "290_2": { + "frame": { "x": 353, "y": 248, "w": 23, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "290_3": { + "frame": { "x": 97, "y": 247, "w": 23, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "291_1": { + "frame": { "x": 277, "y": 180, "w": 23, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "291_2": { + "frame": { "x": 245, "y": 182, "w": 23, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "291_3": { + "frame": { "x": 222, "y": 180, "w": 23, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "292_1": { + "frame": { "x": 357, "y": 229, "w": 20, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "292_2": { + "frame": { "x": 77, "y": 231, "w": 20, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "292_3": { + "frame": { "x": 296, "y": 230, "w": 20, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "298_2": { + "frame": { "x": 139, "y": 263, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "298_3": { + "frame": { "x": 277, "y": 263, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "300_1": { + "frame": { "x": 108, "y": 213, "w": 20, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "300_2": { + "frame": { "x": 17, "y": 212, "w": 20, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "300_3": { + "frame": { "x": 88, "y": 211, "w": 20, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "301_1": { + "frame": { "x": 115, "y": 172, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "301_2": { + "frame": { "x": 0, "y": 178, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "301_3": { + "frame": { "x": 93, "y": 170, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "302-mega_2": { + "frame": { "x": 274, "y": 51, "w": 28, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "302-mega_3": { + "frame": { "x": 150, "y": 51, "w": 28, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "302_2": { + "frame": { "x": 338, "y": 166, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "302_3": { + "frame": { "x": 315, "y": 166, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "303-mega_1": { + "frame": { "x": 26, "y": 51, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "303-mega_2": { + "frame": { "x": 56, "y": 51, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "303-mega_3": { + "frame": { "x": 342, "y": 50, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "303_1": { + "frame": { "x": 315, "y": 145, "w": 26, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "303_2": { + "frame": { "x": 341, "y": 145, "w": 26, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "303_3": { + "frame": { "x": 178, "y": 144, "w": 26, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "304_1": { + "frame": { "x": 196, "y": 275, "w": 16, "h": 12 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "304_2": { + "frame": { "x": 180, "y": 275, "w": 16, "h": 12 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "304_3": { + "frame": { "x": 252, "y": 202, "w": 16, "h": 12 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "305_1": { + "frame": { "x": 334, "y": 227, "w": 23, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "305_2": { + "frame": { "x": 128, "y": 226, "w": 23, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "305_3": { + "frame": { "x": 273, "y": 226, "w": 23, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "306-mega_1": { + "frame": { "x": 62, "y": 25, "w": 31, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "306-mega_2": { + "frame": { "x": 93, "y": 25, "w": 31, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "306-mega_3": { + "frame": { "x": 342, "y": 24, "w": 31, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "306_1": { + "frame": { "x": 55, "y": 77, "w": 29, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "306_2": { + "frame": { "x": 338, "y": 76, "w": 29, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "306_3": { + "frame": { "x": 26, "y": 77, "w": 29, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "307_2": { + "frame": { "x": 215, "y": 241, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "307_3": { + "frame": { "x": 274, "y": 243, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "308-mega_2": { + "frame": { "x": 190, "y": 48, "w": 29, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "308-mega_3": { + "frame": { "x": 219, "y": 48, "w": 29, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "308_2": { + "frame": { "x": 0, "y": 199, "w": 17, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 17, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "308_3": { + "frame": { "x": 235, "y": 202, "w": 17, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 17, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "309_2": { + "frame": { "x": 45, "y": 268, "w": 19, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 19, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "309_3": { + "frame": { "x": 253, "y": 99, "w": 19, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 19, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "310-mega_2": { + "frame": { "x": 25, "y": 101, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "310-mega_3": { + "frame": { "x": 338, "y": 100, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "310_2": { + "frame": { "x": 323, "y": 187, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "310_3": { + "frame": { "x": 167, "y": 186, "w": 20, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "311_1": { + "frame": { "x": 164, "y": 256, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "311_2": { + "frame": { "x": 77, "y": 250, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "311_3": { + "frame": { "x": 314, "y": 250, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "312_2": { + "frame": { "x": 196, "y": 256, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "312_3": { + "frame": { "x": 180, "y": 256, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "315_2": { + "frame": { "x": 153, "y": 144, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "315_3": { + "frame": { "x": 290, "y": 138, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "320_2": { + "frame": { "x": 211, "y": 200, "w": 24, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 24, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "320_3": { + "frame": { "x": 268, "y": 200, "w": 24, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 24, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "321_2": { + "frame": { "x": 84, "y": 98, "w": 30, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "321_3": { + "frame": { "x": 308, "y": 93, "w": 30, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "327_2": { + "frame": { "x": 364, "y": 100, "w": 15, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "327_3": { + "frame": { "x": 0, "y": 247, "w": 15, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "328_2": { + "frame": { "x": 177, "y": 237, "w": 19, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "328_3": { + "frame": { "x": 196, "y": 237, "w": 19, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "329_2": { + "frame": { "x": 229, "y": 160, "w": 25, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 25, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "329_3": { + "frame": { "x": 290, "y": 160, "w": 25, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 25, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "330_2": { + "frame": { "x": 51, "y": 101, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "330_3": { + "frame": { "x": 139, "y": 104, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "333_2": { + "frame": { "x": 45, "y": 252, "w": 19, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "333_3": { + "frame": { "x": 120, "y": 259, "w": 19, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "334-mega_2": { + "frame": { "x": 280, "y": 114, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "334-mega_3": { + "frame": { "x": 253, "y": 114, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "334_2": { + "frame": { "x": 73, "y": 168, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "334_3": { + "frame": { "x": 23, "y": 167, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "335_2": { + "frame": { "x": 0, "y": 156, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "335_3": { + "frame": { "x": 121, "y": 150, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "336_2": { + "frame": { "x": 137, "y": 187, "w": 23, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "336_3": { + "frame": { "x": 300, "y": 187, "w": 23, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "337_2": { + "frame": { "x": 277, "y": 161, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "337_3": { + "frame": { "x": 154, "y": 275, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "338_2": { + "frame": { "x": 43, "y": 170, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "338_3": { + "frame": { "x": 201, "y": 169, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "339_2": { + "frame": { "x": 226, "y": 268, "w": 21, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "339_3": { + "frame": { "x": 64, "y": 269, "w": 21, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "340_2": { + "frame": { "x": 187, "y": 191, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "340_3": { + "frame": { "x": 343, "y": 187, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "341_2": { + "frame": { "x": 252, "y": 218, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "341_3": { + "frame": { "x": 195, "y": 218, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "342_2": { + "frame": { "x": 129, "y": 127, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "342_3": { + "frame": { "x": 243, "y": 137, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-rainy_1": { + "frame": { "x": 330, "y": 261, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-rainy_2": { + "frame": { "x": 344, "y": 262, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-rainy_3": { + "frame": { "x": 212, "y": 261, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-snowy_1": { + "frame": { "x": 216, "y": 218, "w": 17, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-snowy_2": { + "frame": { "x": 363, "y": 206, "w": 17, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-snowy_3": { + "frame": { "x": 0, "y": 224, "w": 17, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-sunny_1": { + "frame": { "x": 59, "y": 232, "w": 18, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-sunny_2": { + "frame": { "x": 316, "y": 230, "w": 18, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351-sunny_3": { + "frame": { "x": 362, "y": 124, "w": 18, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351_2": { + "frame": { "x": 367, "y": 76, "w": 13, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "351_3": { + "frame": { "x": 367, "y": 144, "w": 13, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "352_1": { + "frame": { "x": 37, "y": 212, "w": 20, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "352_2": { + "frame": { "x": 57, "y": 212, "w": 20, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "352_3": { + "frame": { "x": 314, "y": 210, "w": 20, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "353_2": { + "frame": { "x": 262, "y": 263, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "353_3": { + "frame": { "x": 292, "y": 263, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "354-mega_2": { + "frame": { "x": 0, "y": 51, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "354-mega_3": { + "frame": { "x": 248, "y": 48, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "354_2": { + "frame": { "x": 137, "y": 207, "w": 22, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 22, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "354_3": { + "frame": { "x": 292, "y": 207, "w": 22, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 22, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "357_2": { + "frame": { "x": 31, "y": 25, "w": 31, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "357_3": { + "frame": { "x": 0, "y": 25, "w": 31, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "358_1": { + "frame": { "x": 232, "y": 247, "w": 15, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "358_2": { + "frame": { "x": 15, "y": 250, "w": 15, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "358_3": { + "frame": { "x": 30, "y": 250, "w": 15, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "361_2": { + "frame": { "x": 0, "y": 268, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "361_3": { + "frame": { "x": 358, "y": 262, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "362-mega_2": { + "frame": { "x": 0, "y": 132, "w": 23, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "362-mega_3": { + "frame": { "x": 267, "y": 137, "w": 23, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "362_2": { + "frame": { "x": 233, "y": 227, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "362_3": { + "frame": { "x": 361, "y": 166, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "369_2": { + "frame": { "x": 204, "y": 148, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "369_3": { + "frame": { "x": 23, "y": 146, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "371_2": { + "frame": { "x": 247, "y": 259, "w": 15, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "371_3": { + "frame": { "x": 93, "y": 261, "w": 15, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "372_2": { + "frame": { "x": 343, "y": 206, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "372_3": { + "frame": { "x": 190, "y": 27, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "373-mega_2": { + "frame": { "x": 111, "y": 0, "w": 35, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "373-mega_3": { + "frame": { "x": 76, "y": 0, "w": 35, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "373_2": { + "frame": { "x": 86, "y": 75, "w": 32, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 32, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "373_3": { + "frame": { "x": 118, "y": 75, "w": 32, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 32, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "374_2": { + "frame": { "x": 145, "y": 246, "w": 19, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "374_3": { + "frame": { "x": 334, "y": 244, "w": 19, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "375_2": { + "frame": { "x": 166, "y": 122, "w": 27, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 27, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "375_3": { + "frame": { "x": 193, "y": 122, "w": 27, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 27, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "376-mega_2": { + "frame": { "x": 118, "y": 51, "w": 32, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 32, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "376-mega_3": { + "frame": { "x": 86, "y": 51, "w": 32, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 32, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "376_2": { + "frame": { "x": 178, "y": 75, "w": 32, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 32, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "376_3": { + "frame": { "x": 210, "y": 75, "w": 32, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 32, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "380-mega_2": { + "frame": { "x": 282, "y": 0, "w": 35, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "380-mega_3": { + "frame": { "x": 317, "y": 0, "w": 35, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "380_2": { + "frame": { "x": 23, "y": 125, "w": 27, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "380_3": { + "frame": { "x": 335, "y": 124, "w": 27, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "381-mega_2": { + "frame": { "x": 210, "y": 24, "w": 35, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "381-mega_3": { + "frame": { "x": 245, "y": 24, "w": 35, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "381_2": { + "frame": { "x": 78, "y": 121, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "381_3": { + "frame": { "x": 307, "y": 116, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "382-primal_2": { + "frame": { "x": 302, "y": 72, "w": 36, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 36, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "382-primal_3": { + "frame": { "x": 302, "y": 51, "w": 36, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 36, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "382_2": { + "frame": { "x": 275, "y": 93, "w": 33, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 33, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "382_3": { + "frame": { "x": 242, "y": 78, "w": 33, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 33, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "383-primal_2": { + "frame": { "x": 246, "y": 0, "w": 36, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "383-primal_3": { + "frame": { "x": 210, "y": 0, "w": 36, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "383_2": { + "frame": { "x": 157, "y": 27, "w": 33, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 33, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "383_3": { + "frame": { "x": 124, "y": 27, "w": 33, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 33, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "384-mega_2": { + "frame": { "x": 38, "y": 0, "w": 38, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 38, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "384-mega_3": { + "frame": { "x": 0, "y": 0, "w": 38, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 38, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "384_2": { + "frame": { "x": 311, "y": 24, "w": 31, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 31, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "384_3": { + "frame": { "x": 280, "y": 24, "w": 31, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 31, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "385_1": { + "frame": { "x": 22, "y": 192, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "385_2": { + "frame": { "x": 93, "y": 191, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "385_3": { + "frame": { "x": 44, "y": 192, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "475-mega_3": { + "frame": { "x": 114, "y": 98, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "475_3": { + "frame": { "x": 74, "y": 143, "w": 22, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_3v.png", + "format": "RGBA8888", + "size": { "w": 380, "h": 294 }, + "scale": "1" + } +} diff --git a/public/images/pokemon_icons_3v.png b/public/images/pokemon_icons_3v.png index ab3eeae09ae..51a1707ea35 100644 Binary files a/public/images/pokemon_icons_3v.png and b/public/images/pokemon_icons_3v.png differ diff --git a/public/images/pokemon_icons_4.json b/public/images/pokemon_icons_4.json index baa804fa2a0..d4c8b4a5ded 100644 --- a/public/images/pokemon_icons_4.json +++ b/public/images/pokemon_icons_4.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_4.png", "format": "RGBA8888", "size": { - "w": 252, - "h": 663 + "w": 250, + "h": 665 }, "scale": 1, "frames": [ @@ -682,7 +682,7 @@ } }, { - "filename": "399", + "filename": "415", "rotated": false, "trimmed": true, "sourceSize": { @@ -690,16 +690,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 + "x": 9, + "y": 9, + "w": 25, + "h": 18 }, "frame": { "x": 0, "y": 647, - "w": 20, - "h": 16 + "w": 25, + "h": 18 } }, { @@ -829,7 +829,7 @@ } }, { - "filename": "438", + "filename": "415s", "rotated": false, "trimmed": true, "sourceSize": { @@ -837,37 +837,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 12, - "h": 20 + "x": 9, + "y": 9, + "w": 25, + "h": 18 }, "frame": { - "x": 240, - "y": 23, - "w": 12, - "h": 20 - } - }, - { - "filename": "399s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 20, + "x": 25, "y": 647, - "w": 20, - "h": 16 + "w": 25, + "h": 18 } }, { @@ -1459,7 +1438,7 @@ } }, { - "filename": "462", + "filename": "479-mow", "rotated": false, "trimmed": true, "sourceSize": { @@ -1467,16 +1446,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 26, - "h": 24 + "x": 8, + "y": 5, + "w": 24, + "h": 25 }, "frame": { "x": 226, "y": 94, - "w": 26, - "h": 24 + "w": 24, + "h": 25 } }, { @@ -1501,7 +1480,7 @@ } }, { - "filename": "462s", + "filename": "479s-mow", "rotated": false, "trimmed": true, "sourceSize": { @@ -1509,20 +1488,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 26, - "h": 24 + "x": 8, + "y": 5, + "w": 24, + "h": 25 }, "frame": { "x": 226, - "y": 118, - "w": 26, - "h": 24 + "y": 119, + "w": 24, + "h": 25 } }, { - "filename": "482", + "filename": "426", "rotated": false, "trimmed": true, "sourceSize": { @@ -1530,15 +1509,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 8, "y": 4, - "w": 26, + "w": 24, "h": 24 }, "frame": { "x": 226, - "y": 142, - "w": 26, + "y": 144, + "w": 24, "h": 24 } }, @@ -1563,27 +1542,6 @@ "h": 20 } }, - { - "filename": "482s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 226, - "y": 166, - "w": 26, - "h": 24 - } - }, { "filename": "469", "rotated": false, @@ -1689,6 +1647,27 @@ "h": 23 } }, + { + "filename": "424_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 120, + "y": 149, + "w": 29, + "h": 25 + } + }, { "filename": "424s", "rotated": false, @@ -1732,7 +1711,7 @@ } }, { - "filename": "411", + "filename": "462", "rotated": false, "trimmed": true, "sourceSize": { @@ -1740,37 +1719,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 6, + "y": 4, "w": 26, - "h": 23 + "h": 24 }, "frame": { "x": 172, "y": 150, "w": 26, - "h": 23 - } - }, - { - "filename": "479-wash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 198, - "y": 168, - "w": 28, - "h": 22 + "h": 24 } }, { @@ -2131,7 +2089,7 @@ } }, { - "filename": "411s", + "filename": "411", "rotated": false, "trimmed": true, "sourceSize": { @@ -2215,7 +2173,7 @@ } }, { - "filename": "479-mow", + "filename": "462s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2223,62 +2181,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 25 + "x": 6, + "y": 4, + "w": 26, + "h": 24 }, "frame": { "x": 56, "y": 353, - "w": 24, - "h": 25 + "w": 26, + "h": 24 } }, { - "filename": "479s-mow", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 25 - }, - "frame": { - "x": 28, - "y": 454, - "w": 24, - "h": 25 - } - }, - { - "filename": "395s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 28, - "y": 479, - "w": 23, - "h": 25 - } - }, - { - "filename": "398", + "filename": "482", "rotated": false, "trimmed": true, "sourceSize": { @@ -2288,58 +2204,58 @@ "spriteSourceSize": { "x": 10, "y": 4, - "w": 23, - "h": 25 - }, - "frame": { - "x": 28, - "y": 504, - "w": 23, - "h": 25 - } - }, - { - "filename": "398s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 23, - "h": 25 - }, - "frame": { - "x": 28, - "y": 529, - "w": 23, - "h": 25 - } - }, - { - "filename": "426", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, + "w": 26, "h": 24 }, "frame": { "x": 56, - "y": 378, - "w": 24, + "y": 377, + "w": 26, "h": 24 } }, + { + "filename": "482s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 26, + "h": 24 + }, + "frame": { + "x": 28, + "y": 454, + "w": 26, + "h": 24 + } + }, + { + "filename": "411s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 23 + }, + "frame": { + "x": 28, + "y": 478, + "w": 26, + "h": 23 + } + }, { "filename": "455", "rotated": false, @@ -2355,8 +2271,8 @@ "h": 23 }, "frame": { - "x": 53, - "y": 402, + "x": 28, + "y": 501, "w": 27, "h": 23 } @@ -2376,119 +2292,14 @@ "h": 23 }, "frame": { - "x": 53, - "y": 425, + "x": 28, + "y": 524, "w": 27, "h": 23 } }, { - "filename": "426s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 28, - "y": 554, - "w": 24, - "h": 24 - } - }, - { - "filename": "409", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 28, - "y": 578, - "w": 25, - "h": 23 - } - }, - { - "filename": "409s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 28, - "y": 601, - "w": 25, - "h": 23 - } - }, - { - "filename": "466", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 23 - }, - "frame": { - "x": 28, - "y": 624, - "w": 26, - "h": 23 - } - }, - { - "filename": "492-land", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 40, - "y": 647, - "w": 18, - "h": 16 - } - }, - { - "filename": "416", + "filename": "471", "rotated": false, "trimmed": true, "sourceSize": { @@ -2497,15 +2308,78 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 26, - "h": 21 + "y": 5, + "w": 27, + "h": 23 }, "frame": { - "x": 172, - "y": 173, - "w": 26, - "h": 21 + "x": 28, + "y": 547, + "w": 27, + "h": 23 + } + }, + { + "filename": "471s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 27, + "h": 23 + }, + "frame": { + "x": 28, + "y": 570, + "w": 27, + "h": 23 + } + }, + { + "filename": "464", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 28, + "y": 593, + "w": 27, + "h": 22 + } + }, + { + "filename": "464s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 28, + "y": 615, + "w": 27, + "h": 22 } }, { @@ -2635,7 +2509,7 @@ } }, { - "filename": "471", + "filename": "479-wash", "rotated": false, "trimmed": true, "sourceSize": { @@ -2643,58 +2517,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 141, - "y": 218, - "w": 27, - "h": 23 - } - }, - { - "filename": "471s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 112, - "y": 262, - "w": 27, - "h": 23 - } - }, - { - "filename": "437", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, + "x": 8, "y": 6, - "w": 27, - "h": 21 + "w": 28, + "h": 22 }, "frame": { - "x": 141, - "y": 241, - "w": 27, - "h": 21 + "x": 170, + "y": 174, + "w": 28, + "h": 22 } }, { @@ -2712,14 +2544,35 @@ "h": 22 }, "frame": { - "x": 139, - "y": 262, + "x": 198, + "y": 168, "w": 28, "h": 22 } }, { - "filename": "464", + "filename": "426s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 226, + "y": 168, + "w": 24, + "h": 24 + } + }, + { + "filename": "466", "rotated": false, "trimmed": true, "sourceSize": { @@ -2728,17 +2581,185 @@ }, "spriteSourceSize": { "x": 7, + "y": 5, + "w": 26, + "h": 23 + }, + "frame": { + "x": 141, + "y": 218, + "w": 26, + "h": 23 + } + }, + { + "filename": "466s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 23 + }, + "frame": { + "x": 112, + "y": 262, + "w": 26, + "h": 23 + } + }, + { + "filename": "473", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, "y": 6, "w": 27, "h": 22 }, "frame": { "x": 170, - "y": 194, + "y": 196, "w": 27, "h": 22 } }, + { + "filename": "473s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 167, + "y": 218, + "w": 27, + "h": 22 + } + }, + { + "filename": "416", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 26, + "h": 21 + }, + "frame": { + "x": 141, + "y": 241, + "w": 26, + "h": 21 + } + }, + { + "filename": "409", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 138, + "y": 262, + "w": 25, + "h": 23 + } + }, + { + "filename": "428", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 167, + "y": 240, + "w": 26, + "h": 22 + } + }, + { + "filename": "409s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 163, + "y": 262, + "w": 25, + "h": 23 + } + }, + { + "filename": "429", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 19, + "h": 28 + }, + "frame": { + "x": 50, + "y": 637, + "w": 19, + "h": 28 + } + }, { "filename": "450-f", "rotated": false, @@ -2761,7 +2782,7 @@ } }, { - "filename": "464s", + "filename": "395s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2769,20 +2790,167 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 + "x": 10, + "y": 3, + "w": 23, + "h": 25 }, "frame": { "x": 81, "y": 308, - "w": 27, + "w": 23, + "h": 25 + } + }, + { + "filename": "414", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 25, + "h": 20 + }, + "frame": { + "x": 81, + "y": 333, + "w": 25, + "h": 20 + } + }, + { + "filename": "398", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 23, + "h": 25 + }, + "frame": { + "x": 82, + "y": 353, + "w": 23, + "h": 25 + } + }, + { + "filename": "398s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 23, + "h": 25 + }, + "frame": { + "x": 82, + "y": 378, + "w": 23, + "h": 25 + } + }, + { + "filename": "450s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 198, + "y": 190, + "w": 28, + "h": 20 + } + }, + { + "filename": "413-sandy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 226, + "y": 192, + "w": 24, + "h": 23 + } + }, + { + "filename": "450s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 197, + "y": 210, + "w": 28, + "h": 20 + } + }, + { + "filename": "467", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 225, + "y": 215, + "w": 25, "h": 22 } }, { - "filename": "466s", + "filename": "468", "rotated": false, "trimmed": true, "sourceSize": { @@ -2791,19 +2959,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 5, - "w": 26, - "h": 23 + "y": 7, + "w": 28, + "h": 19 }, "frame": { - "x": 81, - "y": 330, - "w": 26, - "h": 23 + "x": 194, + "y": 230, + "w": 28, + "h": 19 } }, { - "filename": "473", + "filename": "468s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2811,99 +2979,36 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, + "x": 7, + "y": 7, + "w": 28, + "h": 19 + }, + "frame": { + "x": 222, + "y": 237, + "w": 28, + "h": 19 + } + }, + { + "filename": "437", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, "y": 6, "w": 27, - "h": 22 - }, - "frame": { - "x": 80, - "y": 353, - "w": 27, - "h": 22 - } - }, - { - "filename": "473s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 80, - "y": 375, - "w": 27, - "h": 22 - } - }, - { - "filename": "428", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 80, - "y": 397, - "w": 26, - "h": 22 - } - }, - { - "filename": "428s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 80, - "y": 419, - "w": 26, - "h": 22 - } - }, - { - "filename": "416s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 26, "h": 21 }, "frame": { - "x": 80, - "y": 441, - "w": 26, + "x": 193, + "y": 249, + "w": 27, "h": 21 } }, @@ -2922,14 +3027,14 @@ "h": 21 }, "frame": { - "x": 53, - "y": 448, + "x": 220, + "y": 256, "w": 27, "h": 21 } }, { - "filename": "450s", + "filename": "416s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2938,15 +3043,78 @@ }, "spriteSourceSize": { "x": 6, - "y": 8, - "w": 28, - "h": 20 + "y": 6, + "w": 26, + "h": 21 }, "frame": { - "x": 52, - "y": 469, - "w": 28, - "h": 20 + "x": 188, + "y": 270, + "w": 26, + "h": 21 + } + }, + { + "filename": "428s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 214, + "y": 277, + "w": 26, + "h": 22 + } + }, + { + "filename": "475", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 104, + "y": 308, + "w": 22, + "h": 25 + } + }, + { + "filename": "413s-sandy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 112, + "y": 285, + "w": 24, + "h": 23 } }, { @@ -2964,8 +3132,8 @@ "h": 22 }, "frame": { - "x": 80, - "y": 462, + "x": 136, + "y": 285, "w": 26, "h": 22 } @@ -2985,8 +3153,8 @@ "h": 22 }, "frame": { - "x": 51, - "y": 489, + "x": 162, + "y": 285, "w": 26, "h": 22 } @@ -3006,14 +3174,14 @@ "h": 22 }, "frame": { - "x": 51, - "y": 511, + "x": 188, + "y": 291, "w": 26, "h": 22 } }, { - "filename": "479-fan", + "filename": "388", "rotated": false, "trimmed": true, "sourceSize": { @@ -3021,123 +3189,18 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, + "x": 9, "y": 7, - "w": 26, + "w": 22, "h": 21 }, "frame": { - "x": 51, - "y": 533, - "w": 26, + "x": 106, + "y": 333, + "w": 22, "h": 21 } }, - { - "filename": "413-sandy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 52, - "y": 554, - "w": 24, - "h": 23 - } - }, - { - "filename": "429", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 53, - "y": 577, - "w": 19, - "h": 28 - } - }, - { - "filename": "408", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 53, - "y": 605, - "w": 21, - "h": 19 - } - }, - { - "filename": "391", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 23 - }, - "frame": { - "x": 54, - "y": 624, - "w": 22, - "h": 23 - } - }, - { - "filename": "492s-land", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 58, - "y": 647, - "w": 18, - "h": 16 - } - }, { "filename": "429s", "rotated": false, @@ -3153,14 +3216,14 @@ "h": 28 }, "frame": { - "x": 72, - "y": 577, + "x": 105, + "y": 354, "w": 19, "h": 28 } }, { - "filename": "391s", + "filename": "388s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3169,78 +3232,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 6, + "y": 7, "w": 22, - "h": 23 + "h": 21 }, "frame": { - "x": 76, - "y": 554, + "x": 105, + "y": 382, "w": 22, - "h": 23 - } - }, - { - "filename": "408s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 74, - "y": 605, - "w": 21, - "h": 19 - } - }, - { - "filename": "475", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 76, - "y": 624, - "w": 22, - "h": 25 - } - }, - { - "filename": "450s-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 198, - "y": 190, - "w": 28, - "h": 20 + "h": 21 } }, { @@ -3258,54 +3258,12 @@ "h": 22 }, "frame": { - "x": 226, - "y": 190, + "x": 214, + "y": 299, "w": 26, "h": 22 } }, - { - "filename": "468", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 19 - }, - "frame": { - "x": 197, - "y": 210, - "w": 28, - "h": 19 - } - }, - { - "filename": "434", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 26, - "h": 19 - }, - "frame": { - "x": 225, - "y": 212, - "w": 26, - "h": 19 - } - }, { "filename": "475s", "rotated": false, @@ -3321,75 +3279,12 @@ "h": 25 }, "frame": { - "x": 91, - "y": 577, + "x": 126, + "y": 308, "w": 22, "h": 25 } }, - { - "filename": "387s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 95, - "y": 602, - "w": 18, - "h": 22 - } - }, - { - "filename": "402", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 98, - "y": 624, - "w": 20, - "h": 24 - } - }, - { - "filename": "434s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 26, - "h": 19 - }, - "frame": { - "x": 80, - "y": 484, - "w": 26, - "h": 19 - } - }, { "filename": "480", "rotated": false, @@ -3405,12 +3300,33 @@ "h": 22 }, "frame": { - "x": 77, - "y": 503, + "x": 148, + "y": 307, "w": 26, "h": 22 } }, + { + "filename": "391", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 22, + "h": 23 + }, + "frame": { + "x": 128, + "y": 333, + "w": 22, + "h": 23 + } + }, { "filename": "480s", "rotated": false, @@ -3426,138 +3342,12 @@ "h": 22 }, "frame": { - "x": 77, - "y": 525, + "x": 124, + "y": 356, "w": 26, "h": 22 } }, - { - "filename": "468s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 19 - }, - "frame": { - "x": 112, - "y": 285, - "w": 28, - "h": 19 - } - }, - { - "filename": "479s-fan", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 140, - "y": 284, - "w": 26, - "h": 21 - } - }, - { - "filename": "414", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 25, - "h": 20 - }, - "frame": { - "x": 111, - "y": 304, - "w": 25, - "h": 20 - } - }, - { - "filename": "414s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 25, - "h": 20 - }, - "frame": { - "x": 136, - "y": 305, - "w": 25, - "h": 20 - } - }, - { - "filename": "415", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 25, - "h": 18 - }, - "frame": { - "x": 108, - "y": 324, - "w": 25, - "h": 18 - } - }, - { - "filename": "413s-sandy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 107, - "y": 342, - "w": 24, - "h": 23 - } - }, { "filename": "476", "rotated": false, @@ -3573,138 +3363,12 @@ "h": 23 }, "frame": { - "x": 107, - "y": 365, + "x": 150, + "y": 329, "w": 24, "h": 23 } }, - { - "filename": "415s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 25, - "h": 18 - }, - "frame": { - "x": 133, - "y": 325, - "w": 25, - "h": 18 - } - }, - { - "filename": "467", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 131, - "y": 343, - "w": 25, - "h": 22 - } - }, - { - "filename": "467s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 131, - "y": 365, - "w": 25, - "h": 22 - } - }, - { - "filename": "403", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 107, - "y": 388, - "w": 24, - "h": 21 - } - }, - { - "filename": "470", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 131, - "y": 387, - "w": 25, - "h": 22 - } - }, - { - "filename": "470s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 106, - "y": 409, - "w": 25, - "h": 22 - } - }, { "filename": "476s", "rotated": false, @@ -3720,8 +3384,8 @@ "h": 23 }, "frame": { - "x": 106, - "y": 431, + "x": 150, + "y": 352, "w": 24, "h": 23 } @@ -3741,8 +3405,8 @@ "h": 23 }, "frame": { - "x": 106, - "y": 454, + "x": 127, + "y": 378, "w": 23, "h": 23 } @@ -3762,12 +3426,222 @@ "h": 23 }, "frame": { - "x": 106, - "y": 477, + "x": 150, + "y": 375, "w": 23, "h": 23 } }, + { + "filename": "439", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 174, + "y": 307, + "w": 14, + "h": 21 + } + }, + { + "filename": "434", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 26, + "h": 19 + }, + "frame": { + "x": 188, + "y": 313, + "w": 26, + "h": 19 + } + }, + { + "filename": "439s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 174, + "y": 328, + "w": 14, + "h": 21 + } + }, + { + "filename": "434s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 26, + "h": 19 + }, + "frame": { + "x": 188, + "y": 332, + "w": 26, + "h": 19 + } + }, + { + "filename": "467s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 214, + "y": 321, + "w": 25, + "h": 22 + } + }, + { + "filename": "440", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 174, + "y": 349, + "w": 14, + "h": 19 + } + }, + { + "filename": "479-fan", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 26, + "h": 21 + }, + "frame": { + "x": 188, + "y": 351, + "w": 26, + "h": 21 + } + }, + { + "filename": "470", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 214, + "y": 343, + "w": 25, + "h": 22 + } + }, + { + "filename": "414s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 25, + "h": 20 + }, + "frame": { + "x": 214, + "y": 365, + "w": 25, + "h": 20 + } + }, + { + "filename": "479s-fan", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 26, + "h": 21 + }, + "frame": { + "x": 56, + "y": 401, + "w": 26, + "h": 21 + } + }, { "filename": "419", "rotated": false, @@ -3783,14 +3657,14 @@ "h": 21 }, "frame": { - "x": 131, - "y": 409, + "x": 82, + "y": 403, "w": 25, "h": 21 } }, { - "filename": "402s", + "filename": "470s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3798,20 +3672,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 + "x": 8, + "y": 6, + "w": 25, + "h": 22 }, "frame": { - "x": 103, - "y": 503, - "w": 20, - "h": 24 + "x": 53, + "y": 422, + "w": 25, + "h": 22 } }, { - "filename": "388", + "filename": "391s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3820,141 +3694,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 103, - "y": 527, - "w": 22, - "h": 21 - } - }, - { - "filename": "419s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 98, - "y": 548, - "w": 25, - "h": 21 - } - }, - { - "filename": "448-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 123, - "y": 500, - "w": 19, - "h": 24 - } - }, - { - "filename": "448s-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 125, - "y": 524, - "w": 19, - "h": 24 - } - }, - { - "filename": "388s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 123, - "y": 548, - "w": 22, - "h": 21 - } - }, - { - "filename": "451", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, "y": 6, - "w": 24, - "h": 22 + "w": 22, + "h": 23 }, "frame": { - "x": 113, - "y": 569, - "w": 24, - "h": 22 - } - }, - { - "filename": "451s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 113, - "y": 591, - "w": 24, - "h": 22 + "x": 107, + "y": 403, + "w": 22, + "h": 23 } }, { @@ -3972,8 +3720,8 @@ "h": 23 }, "frame": { - "x": 137, - "y": 569, + "x": 129, + "y": 401, "w": 22, "h": 23 } @@ -3993,14 +3741,14 @@ "h": 23 }, "frame": { - "x": 137, - "y": 592, + "x": 151, + "y": 398, "w": 22, "h": 23 } }, { - "filename": "390", + "filename": "419s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4008,20 +3756,62 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 10, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 78, + "y": 424, + "w": 25, + "h": 21 + } + }, + { + "filename": "403", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 103, + "y": 426, + "w": 24, + "h": 21 + } + }, + { + "filename": "451", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, "y": 6, - "w": 19, + "w": 24, "h": 22 }, "frame": { - "x": 118, - "y": 613, - "w": 19, + "x": 54, + "y": 444, + "w": 24, "h": 22 } }, { - "filename": "400", + "filename": "451s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4029,57 +3819,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 7, "y": 6, - "w": 22, + "w": 24, "h": 22 }, "frame": { - "x": 137, - "y": 615, - "w": 22, - "h": 22 - } - }, - { - "filename": "390s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 118, - "y": 635, - "w": 19, - "h": 22 - } - }, - { - "filename": "400s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 137, - "y": 637, - "w": 22, + "x": 54, + "y": 466, + "w": 24, "h": 22 } }, @@ -4098,159 +3846,12 @@ "h": 21 }, "frame": { - "x": 170, - "y": 216, + "x": 78, + "y": 445, "w": 24, "h": 21 } }, - { - "filename": "413-plant", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 168, - "y": 237, - "w": 22, - "h": 23 - } - }, - { - "filename": "449", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 194, - "y": 229, - "w": 24, - "h": 18 - } - }, - { - "filename": "449-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 218, - "y": 231, - "w": 24, - "h": 18 - } - }, - { - "filename": "449s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 190, - "y": 247, - "w": 24, - "h": 18 - } - }, - { - "filename": "449s-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 214, - "y": 249, - "w": 24, - "h": 18 - } - }, - { - "filename": "439", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 238, - "y": 249, - "w": 14, - "h": 21 - } - }, - { - "filename": "413s-plant", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 168, - "y": 260, - "w": 22, - "h": 23 - } - }, { "filename": "423-east", "rotated": false, @@ -4266,8 +3867,8 @@ "h": 22 }, "frame": { - "x": 190, - "y": 265, + "x": 78, + "y": 466, "w": 23, "h": 22 } @@ -4287,33 +3888,12 @@ "h": 22 }, "frame": { - "x": 213, - "y": 267, + "x": 102, + "y": 447, "w": 23, "h": 22 } }, - { - "filename": "412-trash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 236, - "y": 270, - "w": 16, - "h": 23 - } - }, { "filename": "423s-east", "rotated": false, @@ -4329,14 +3909,14 @@ "h": 22 }, "frame": { - "x": 167, - "y": 283, + "x": 101, + "y": 469, "w": 23, "h": 22 } }, { - "filename": "423s-west", + "filename": "413-plant", "rotated": false, "trimmed": true, "sourceSize": { @@ -4344,62 +3924,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 190, - "y": 287, - "w": 23, - "h": 22 - } - }, - { - "filename": "432", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 213, - "y": 289, - "w": 23, - "h": 21 - } - }, - { - "filename": "412s-trash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, + "x": 9, "y": 5, - "w": 16, + "w": 22, "h": 23 }, "frame": { - "x": 236, - "y": 293, - "w": 16, + "x": 55, + "y": 488, + "w": 22, "h": 23 } }, { - "filename": "432s", + "filename": "413s-plant", "rotated": false, "trimmed": true, "sourceSize": { @@ -4407,37 +3945,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 23, - "h": 21 + "x": 9, + "y": 5, + "w": 22, + "h": 23 }, "frame": { - "x": 161, - "y": 305, - "w": 23, - "h": 21 - } - }, - { - "filename": "433", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 158, - "y": 326, - "w": 23, - "h": 19 + "x": 77, + "y": 488, + "w": 22, + "h": 23 } }, { @@ -4455,8 +3972,8 @@ "h": 23 }, "frame": { - "x": 156, - "y": 345, + "x": 55, + "y": 511, "w": 22, "h": 23 } @@ -4476,12 +3993,33 @@ "h": 23 }, "frame": { - "x": 156, - "y": 368, + "x": 77, + "y": 511, "w": 22, "h": 23 } }, + { + "filename": "423s-west", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 55, + "y": 534, + "w": 23, + "h": 22 + } + }, { "filename": "457", "rotated": false, @@ -4497,75 +4035,12 @@ "h": 23 }, "frame": { - "x": 156, - "y": 391, + "x": 55, + "y": 556, "w": 22, "h": 23 } }, - { - "filename": "433s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 156, - "y": 414, - "w": 23, - "h": 19 - } - }, - { - "filename": "444", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 184, - "y": 309, - "w": 23, - "h": 21 - } - }, - { - "filename": "444s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 207, - "y": 310, - "w": 23, - "h": 21 - } - }, { "filename": "457s", "rotated": false, @@ -4581,33 +4056,12 @@ "h": 23 }, "frame": { - "x": 230, - "y": 316, + "x": 55, + "y": 579, "w": 22, "h": 23 } }, - { - "filename": "489", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 181, - "y": 330, - "w": 23, - "h": 17 - } - }, { "filename": "463", "rotated": false, @@ -4623,12 +4077,33 @@ "h": 23 }, "frame": { - "x": 178, - "y": 347, + "x": 55, + "y": 602, "w": 22, "h": 23 } }, + { + "filename": "400", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 78, + "y": 534, + "w": 22, + "h": 22 + } + }, { "filename": "463s", "rotated": false, @@ -4644,14 +4119,77 @@ "h": 23 }, "frame": { - "x": 178, - "y": 370, + "x": 77, + "y": 556, "w": 22, "h": 23 } }, { - "filename": "474", + "filename": "400s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 77, + "y": 579, + "w": 22, + "h": 22 + } + }, + { + "filename": "402", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 77, + "y": 601, + "w": 20, + "h": 24 + } + }, + { + "filename": "402s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 99, + "y": 491, + "w": 20, + "h": 24 + } + }, + { + "filename": "408", "rotated": false, "trimmed": true, "sourceSize": { @@ -4660,15 +4198,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 6, + "y": 9, "w": 21, - "h": 21 + "h": 19 }, "frame": { - "x": 178, - "y": 393, + "x": 99, + "y": 515, "w": 21, - "h": 21 + "h": 19 } }, { @@ -4686,33 +4224,12 @@ "h": 22 }, "frame": { - "x": 179, - "y": 414, + "x": 100, + "y": 534, "w": 20, "h": 22 } }, - { - "filename": "489s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 204, - "y": 331, - "w": 23, - "h": 17 - } - }, { "filename": "460", "rotated": false, @@ -4728,8 +4245,8 @@ "h": 23 }, "frame": { - "x": 200, - "y": 348, + "x": 99, + "y": 556, "w": 21, "h": 23 } @@ -4749,12 +4266,117 @@ "h": 22 }, "frame": { - "x": 200, - "y": 371, + "x": 99, + "y": 579, "w": 21, "h": 22 } }, + { + "filename": "432", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 97, + "y": 601, + "w": 23, + "h": 21 + } + }, + { + "filename": "432s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 69, + "y": 625, + "w": 23, + "h": 21 + } + }, + { + "filename": "433", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 69, + "y": 646, + "w": 23, + "h": 19 + } + }, + { + "filename": "448-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 19, + "h": 24 + }, + "frame": { + "x": 119, + "y": 491, + "w": 19, + "h": 24 + } + }, + { + "filename": "448s-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 19, + "h": 24 + }, + "frame": { + "x": 120, + "y": 515, + "w": 19, + "h": 24 + } + }, { "filename": "460s", "rotated": false, @@ -4770,285 +4392,12 @@ "h": 23 }, "frame": { - "x": 199, - "y": 393, + "x": 120, + "y": 539, "w": 21, "h": 23 } }, - { - "filename": "418", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 199, - "y": 416, - "w": 21, - "h": 20 - } - }, - { - "filename": "412-sandy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 221, - "y": 348, - "w": 15, - "h": 23 - } - }, - { - "filename": "478", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 236, - "y": 339, - "w": 16, - "h": 22 - } - }, - { - "filename": "478s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 236, - "y": 361, - "w": 16, - "h": 22 - } - }, - { - "filename": "412s-sandy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 221, - "y": 371, - "w": 15, - "h": 23 - } - }, - { - "filename": "448", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 236, - "y": 383, - "w": 16, - "h": 21 - } - }, - { - "filename": "448s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 220, - "y": 394, - "w": 16, - "h": 21 - } - }, - { - "filename": "421-overcast", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 236, - "y": 404, - "w": 16, - "h": 20 - } - }, - { - "filename": "421s-overcast", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 220, - "y": 415, - "w": 16, - "h": 20 - } - }, - { - "filename": "425", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 15, - "h": 22 - }, - "frame": { - "x": 236, - "y": 424, - "w": 15, - "h": 22 - } - }, - { - "filename": "394", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 129, - "y": 454, - "w": 17, - "h": 22 - } - }, - { - "filename": "394s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 129, - "y": 476, - "w": 17, - "h": 22 - } - }, - { - "filename": "421-sunshine", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 130, - "y": 433, - "w": 20, - "h": 21 - } - }, { "filename": "454s", "rotated": false, @@ -5064,8 +4413,8 @@ "h": 22 }, "frame": { - "x": 150, - "y": 433, + "x": 120, + "y": 562, "w": 21, "h": 22 } @@ -5085,14 +4434,77 @@ "h": 22 }, "frame": { - "x": 146, - "y": 455, + "x": 120, + "y": 584, "w": 21, "h": 22 } }, { - "filename": "474s", + "filename": "387s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 124, + "y": 469, + "w": 18, + "h": 22 + } + }, + { + "filename": "390", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 125, + "y": 447, + "w": 19, + "h": 22 + } + }, + { + "filename": "421-sunshine", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 127, + "y": 426, + "w": 20, + "h": 21 + } + }, + { + "filename": "408s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5101,19 +4513,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 6, + "y": 9, "w": 21, - "h": 21 + "h": 19 }, "frame": { - "x": 146, - "y": 477, + "x": 120, + "y": 606, "w": 21, - "h": 21 + "h": 19 } }, { - "filename": "492s-sky", + "filename": "433s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5121,20 +4533,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 + "x": 12, + "y": 9, + "w": 23, + "h": 19 }, "frame": { - "x": 142, - "y": 498, - "w": 21, - "h": 22 + "x": 97, + "y": 622, + "w": 23, + "h": 19 } }, { - "filename": "407s", + "filename": "444", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 92, + "y": 641, + "w": 23, + "h": 21 + } + }, + { + "filename": "418", "rotated": false, "trimmed": true, "sourceSize": { @@ -5143,36 +4576,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 6, - "w": 20, - "h": 22 + "y": 8, + "w": 21, + "h": 20 }, "frame": { - "x": 144, - "y": 520, - "w": 20, - "h": 22 - } - }, - { - "filename": "441", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 145, - "y": 542, - "w": 20, - "h": 22 + "x": 120, + "y": 625, + "w": 21, + "h": 20 } }, { @@ -5190,8 +4602,8 @@ "h": 20 }, "frame": { - "x": 171, - "y": 436, + "x": 115, + "y": 645, "w": 22, "h": 20 } @@ -5211,14 +4623,14 @@ "h": 20 }, "frame": { - "x": 193, - "y": 436, + "x": 137, + "y": 645, "w": 22, "h": 20 } }, { - "filename": "441s", + "filename": "412-sandy", "rotated": false, "trimmed": true, "sourceSize": { @@ -5226,104 +4638,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 + "x": 13, + "y": 5, + "w": 15, + "h": 23 }, "frame": { - "x": 167, - "y": 456, - "w": 20, - "h": 22 + "x": 138, + "y": 491, + "w": 15, + "h": 23 } }, { - "filename": "418s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 187, - "y": 456, - "w": 21, - "h": 20 - } - }, - { - "filename": "410", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 167, - "y": 478, - "w": 20, - "h": 20 - } - }, - { - "filename": "461", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 163, - "y": 498, - "w": 19, - "h": 22 - } - }, - { - "filename": "421s-sunshine", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 187, - "y": 476, - "w": 20, - "h": 21 - } - }, - { - "filename": "427", + "filename": "412-trash", "rotated": false, "trimmed": true, "sourceSize": { @@ -5332,14 +4660,119 @@ }, "spriteSourceSize": { "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 139, + "y": 514, + "w": 16, + "h": 23 + } + }, + { + "filename": "390s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 6, - "w": 18, + "w": 19, "h": 22 }, "frame": { - "x": 164, - "y": 520, - "w": 18, + "x": 142, + "y": 469, + "w": 19, + "h": 22 + } + }, + { + "filename": "394", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 144, + "y": 447, + "w": 17, + "h": 22 + } + }, + { + "filename": "412s-sandy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 147, + "y": 424, + "w": 15, + "h": 23 + } + }, + { + "filename": "412s-trash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 141, + "y": 537, + "w": 16, + "h": 23 + } + }, + { + "filename": "394s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 141, + "y": 560, + "w": 17, "h": 22 } }, @@ -5358,138 +4791,12 @@ "h": 22 }, "frame": { - "x": 165, - "y": 542, + "x": 141, + "y": 582, "w": 17, "h": 22 } }, - { - "filename": "442", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 564, - "w": 21, - "h": 20 - } - }, - { - "filename": "442s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 584, - "w": 21, - "h": 20 - } - }, - { - "filename": "459", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 604, - "w": 21, - "h": 20 - } - }, - { - "filename": "459s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 624, - "w": 21, - "h": 20 - } - }, - { - "filename": "443", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 159, - "y": 644, - "w": 19, - "h": 19 - } - }, - { - "filename": "443s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 178, - "y": 644, - "w": 19, - "h": 19 - } - }, { "filename": "401s", "rotated": false, @@ -5505,14 +4812,35 @@ "h": 22 }, "frame": { - "x": 208, - "y": 456, + "x": 141, + "y": 604, "w": 17, "h": 22 } }, { - "filename": "410s", + "filename": "443", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 19 + }, + "frame": { + "x": 141, + "y": 626, + "w": 19, + "h": 19 + } + }, + { + "filename": "418s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5522,18 +4850,18 @@ "spriteSourceSize": { "x": 10, "y": 8, - "w": 20, + "w": 21, "h": 20 }, "frame": { - "x": 207, - "y": 478, - "w": 20, + "x": 159, + "y": 645, + "w": 21, "h": 20 } }, { - "filename": "422-east", + "filename": "407s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5541,20 +4869,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 + "x": 10, + "y": 6, + "w": 20, + "h": 22 }, "frame": { - "x": 215, - "y": 436, - "w": 19, - "h": 20 + "x": 153, + "y": 491, + "w": 20, + "h": 22 } }, { - "filename": "427s", + "filename": "427", "rotated": false, "trimmed": true, "sourceSize": { @@ -5568,8 +4896,8 @@ "h": 22 }, "frame": { - "x": 234, - "y": 446, + "x": 155, + "y": 513, "w": 18, "h": 22 } @@ -5589,8 +4917,8 @@ "h": 22 }, "frame": { - "x": 182, - "y": 498, + "x": 157, + "y": 535, "w": 17, "h": 22 } @@ -5610,14 +4938,35 @@ "h": 22 }, "frame": { - "x": 182, - "y": 520, + "x": 158, + "y": 557, "w": 17, "h": 22 } }, { - "filename": "461s", + "filename": "427s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 158, + "y": 579, + "w": 18, + "h": 22 + } + }, + { + "filename": "441", "rotated": false, "trimmed": true, "sourceSize": { @@ -5627,18 +4976,18 @@ "spriteSourceSize": { "x": 10, "y": 6, - "w": 19, + "w": 20, "h": 22 }, "frame": { - "x": 182, - "y": 542, - "w": 19, + "x": 158, + "y": 601, + "w": 20, "h": 22 } }, { - "filename": "494", + "filename": "441s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5646,62 +4995,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 10, "y": 6, - "w": 18, + "w": 20, "h": 22 }, "frame": { - "x": 180, - "y": 564, - "w": 18, + "x": 160, + "y": 623, + "w": 20, "h": 22 } }, { - "filename": "494s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 180, - "y": 586, - "w": 18, - "h": 22 - } - }, - { - "filename": "422s-east", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 180, - "y": 608, - "w": 19, - "h": 20 - } - }, - { - "filename": "436", + "filename": "425", "rotated": false, "trimmed": true, "sourceSize": { @@ -5710,19 +5017,19 @@ }, "spriteSourceSize": { "x": 13, - "y": 12, - "w": 13, - "h": 16 + "y": 7, + "w": 15, + "h": 22 }, "frame": { - "x": 180, - "y": 628, - "w": 13, - "h": 16 + "x": 162, + "y": 421, + "w": 15, + "h": 22 } }, { - "filename": "456", + "filename": "440s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5730,20 +5037,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 13, "y": 9, - "w": 20, - "h": 18 + "w": 14, + "h": 19 }, "frame": { - "x": 199, - "y": 498, - "w": 20, - "h": 18 + "x": 174, + "y": 368, + "w": 14, + "h": 19 } }, { - "filename": "456s", + "filename": "449", "rotated": false, "trimmed": true, "sourceSize": { @@ -5751,15 +5058,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 20, + "x": 8, + "y": 10, + "w": 24, "h": 18 }, "frame": { - "x": 199, - "y": 516, - "w": 20, + "x": 188, + "y": 372, + "w": 24, "h": 18 } }, @@ -5778,12 +5085,369 @@ "h": 22 }, "frame": { - "x": 219, - "y": 498, + "x": 173, + "y": 387, "w": 15, "h": 22 } }, + { + "filename": "444s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 188, + "y": 390, + "w": 23, + "h": 21 + } + }, + { + "filename": "449-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 10, + "w": 24, + "h": 18 + }, + "frame": { + "x": 212, + "y": 385, + "w": 24, + "h": 18 + } + }, + { + "filename": "446", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 236, + "y": 385, + "w": 14, + "h": 19 + } + }, + { + "filename": "449s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 10, + "w": 24, + "h": 18 + }, + "frame": { + "x": 211, + "y": 403, + "w": 24, + "h": 18 + } + }, + { + "filename": "446s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 235, + "y": 404, + "w": 14, + "h": 19 + } + }, + { + "filename": "461", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 161, + "y": 447, + "w": 19, + "h": 22 + } + }, + { + "filename": "461s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 161, + "y": 469, + "w": 19, + "h": 22 + } + }, + { + "filename": "478", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 173, + "y": 491, + "w": 16, + "h": 22 + } + }, + { + "filename": "478s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 173, + "y": 513, + "w": 16, + "h": 22 + } + }, + { + "filename": "492s-sky", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 174, + "y": 535, + "w": 21, + "h": 22 + } + }, + { + "filename": "421s-sunshine", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 175, + "y": 557, + "w": 20, + "h": 21 + } + }, + { + "filename": "474", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 176, + "y": 578, + "w": 21, + "h": 21 + } + }, + { + "filename": "474s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 178, + "y": 599, + "w": 21, + "h": 21 + } + }, + { + "filename": "410", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 180, + "y": 620, + "w": 20, + "h": 20 + } + }, + { + "filename": "410s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 180, + "y": 640, + "w": 20, + "h": 20 + } + }, + { + "filename": "421-overcast", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 195, + "y": 411, + "w": 16, + "h": 20 + } + }, + { + "filename": "449s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 10, + "w": 24, + "h": 18 + }, + "frame": { + "x": 211, + "y": 421, + "w": 24, + "h": 18 + } + }, { "filename": "420", "rotated": false, @@ -5799,8 +5463,8 @@ "h": 18 }, "frame": { - "x": 234, - "y": 468, + "x": 177, + "y": 411, "w": 18, "h": 18 } @@ -5820,12 +5484,117 @@ "h": 18 }, "frame": { - "x": 234, - "y": 486, + "x": 177, + "y": 429, "w": 18, "h": 18 } }, + { + "filename": "421s-overcast", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 195, + "y": 431, + "w": 16, + "h": 20 + } + }, + { + "filename": "489", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 23, + "h": 17 + }, + "frame": { + "x": 211, + "y": 439, + "w": 23, + "h": 17 + } + }, + { + "filename": "448", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 16, + "h": 21 + }, + "frame": { + "x": 234, + "y": 439, + "w": 16, + "h": 21 + } + }, + { + "filename": "436", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 13, + "h": 16 + }, + "frame": { + "x": 235, + "y": 423, + "w": 13, + "h": 16 + } + }, + { + "filename": "393", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 180, + "y": 447, + "w": 13, + "h": 19 + } + }, { "filename": "447", "rotated": false, @@ -5841,12 +5610,327 @@ "h": 18 }, "frame": { - "x": 234, - "y": 504, + "x": 193, + "y": 451, "w": 18, "h": 18 } }, + { + "filename": "489s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 23, + "h": 17 + }, + "frame": { + "x": 211, + "y": 456, + "w": 23, + "h": 17 + } + }, + { + "filename": "448s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 16, + "h": 21 + }, + "frame": { + "x": 234, + "y": 460, + "w": 16, + "h": 21 + } + }, + { + "filename": "393s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 180, + "y": 466, + "w": 13, + "h": 19 + } + }, + { + "filename": "447s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 193, + "y": 469, + "w": 18, + "h": 18 + } + }, + { + "filename": "442", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 211, + "y": 473, + "w": 21, + "h": 20 + } + }, + { + "filename": "492-land", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 18, + "h": 16 + }, + "frame": { + "x": 232, + "y": 481, + "w": 18, + "h": 16 + } + }, + { + "filename": "442s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 189, + "y": 487, + "w": 21, + "h": 20 + } + }, + { + "filename": "459", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 189, + "y": 507, + "w": 21, + "h": 20 + } + }, + { + "filename": "459s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 210, + "y": 493, + "w": 21, + "h": 20 + } + }, + { + "filename": "422-east", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 231, + "y": 497, + "w": 19, + "h": 20 + } + }, + { + "filename": "399", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 210, + "y": 513, + "w": 20, + "h": 16 + } + }, + { + "filename": "456", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 20, + "h": 18 + }, + "frame": { + "x": 230, + "y": 517, + "w": 20, + "h": 18 + } + }, + { + "filename": "438", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 12, + "h": 20 + }, + "frame": { + "x": 195, + "y": 527, + "w": 12, + "h": 20 + } + }, + { + "filename": "456s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 20, + "h": 18 + }, + "frame": { + "x": 207, + "y": 529, + "w": 20, + "h": 18 + } + }, + { + "filename": "422s-east", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 195, + "y": 547, + "w": 19, + "h": 20 + } + }, { "filename": "422-west", "rotated": false, @@ -5862,14 +5946,14 @@ "h": 20 }, "frame": { - "x": 201, - "y": 534, + "x": 214, + "y": 547, "w": 17, "h": 20 } }, { - "filename": "439s", + "filename": "443s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5877,16 +5961,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 + "x": 11, + "y": 9, + "w": 19, + "h": 19 }, "frame": { - "x": 219, - "y": 520, - "w": 14, - "h": 21 + "x": 231, + "y": 535, + "w": 19, + "h": 19 } }, { @@ -5904,8 +5988,8 @@ "h": 18 }, "frame": { - "x": 233, - "y": 522, + "x": 231, + "y": 554, "w": 19, "h": 18 } @@ -5925,12 +6009,54 @@ "h": 18 }, "frame": { - "x": 233, - "y": 540, + "x": 197, + "y": 567, "w": 19, "h": 18 } }, + { + "filename": "406", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 216, + "y": 567, + "w": 12, + "h": 18 + } + }, + { + "filename": "399s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 228, + "y": 572, + "w": 20, + "h": 16 + } + }, { "filename": "422s-west", "rotated": false, @@ -5946,12 +6072,33 @@ "h": 20 }, "frame": { - "x": 201, - "y": 554, + "x": 199, + "y": 585, "w": 17, "h": 20 } }, + { + "filename": "438s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 12, + "h": 20 + }, + "frame": { + "x": 216, + "y": 585, + "w": 12, + "h": 20 + } + }, { "filename": "458", "rotated": false, @@ -5967,8 +6114,8 @@ "h": 17 }, "frame": { - "x": 198, - "y": 574, + "x": 228, + "y": 588, "w": 20, "h": 17 } @@ -5988,96 +6135,12 @@ "h": 17 }, "frame": { - "x": 198, - "y": 591, + "x": 200, + "y": 605, "w": 20, "h": 17 } }, - { - "filename": "447s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 199, - "y": 608, - "w": 18, - "h": 18 - } - }, - { - "filename": "440", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 218, - "y": 541, - "w": 14, - "h": 19 - } - }, - { - "filename": "440s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 218, - "y": 560, - "w": 14, - "h": 19 - } - }, - { - "filename": "446", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 218, - "y": 579, - "w": 14, - "h": 19 - } - }, { "filename": "453", "rotated": false, @@ -6093,8 +6156,8 @@ "h": 17 }, "frame": { - "x": 232, - "y": 558, + "x": 200, + "y": 622, "w": 17, "h": 17 } @@ -6114,8 +6177,8 @@ "h": 17 }, "frame": { - "x": 232, - "y": 575, + "x": 220, + "y": 605, "w": 17, "h": 17 } @@ -6135,14 +6198,14 @@ "h": 16 }, "frame": { - "x": 193, - "y": 628, + "x": 237, + "y": 605, "w": 13, "h": 16 } }, { - "filename": "446s", + "filename": "492s-land", "rotated": false, "trimmed": true, "sourceSize": { @@ -6150,100 +6213,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 + "x": 12, + "y": 12, + "w": 18, + "h": 16 }, "frame": { - "x": 197, - "y": 644, - "w": 14, - "h": 19 - } - }, - { - "filename": "406", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 206, - "y": 626, - "w": 12, - "h": 18 - } - }, - { - "filename": "393", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 211, - "y": 644, - "w": 13, - "h": 19 - } - }, - { - "filename": "393s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 218, - "y": 598, - "w": 13, - "h": 19 - } - }, - { - "filename": "438s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 12, - "h": 20 - }, - "frame": { - "x": 218, - "y": 617, - "w": 12, - "h": 20 + "x": 217, + "y": 622, + "w": 18, + "h": 16 } }, { @@ -6261,8 +6240,8 @@ "h": 18 }, "frame": { - "x": 231, - "y": 598, + "x": 200, + "y": 639, "w": 12, "h": 18 } @@ -6273,6 +6252,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d81cce65ebf0d5fbab1f9b7dbc080d4a:2eeffac5a7c6cd09ee563c646d89e345:3f74c54ad2b3085ce7282c3466535f4a$" + "smartupdate": "$TexturePacker:SmartUpdate:b4b98161b1f6d86135dc671aff2b6d8a:4ca054d2a7d475da30cbada037aa3a4e:3f74c54ad2b3085ce7282c3466535f4a$" } } diff --git a/public/images/pokemon_icons_4.png b/public/images/pokemon_icons_4.png index 5dcfffb5579..5b271a3930c 100644 Binary files a/public/images/pokemon_icons_4.png and b/public/images/pokemon_icons_4.png differ diff --git a/public/images/pokemon_icons_4v.json b/public/images/pokemon_icons_4v.json index 48c1519d88a..9113fe89dc8 100644 --- a/public/images/pokemon_icons_4v.json +++ b/public/images/pokemon_icons_4v.json @@ -1,3401 +1,1390 @@ -{ - "textures": [ - { - "image": "pokemon_icons_4v.png", - "format": "RGBA8888", - "size": { - "w": 124, - "h": 660 - }, - "scale": 1, - "frames": [ - { - "filename": "491_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 31, - "h": 28 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 28 - } - }, - { - "filename": "491_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 31, - "h": 28 - }, - "frame": { - "x": 0, - "y": 28, - "w": 31, - "h": 28 - } - }, - { - "filename": "428-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 33, - "h": 24 - }, - "frame": { - "x": 31, - "y": 0, - "w": 33, - "h": 24 - } - }, - { - "filename": "428-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 33, - "h": 24 - }, - "frame": { - "x": 31, - "y": 24, - "w": 33, - "h": 24 - } - }, - { - "filename": "445-mega_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 30, - "h": 25 - }, - "frame": { - "x": 0, - "y": 56, - "w": 30, - "h": 25 - } - }, - { - "filename": "445-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 30, - "h": 25 - }, - "frame": { - "x": 64, - "y": 0, - "w": 30, - "h": 25 - } - }, - { - "filename": "445-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 30, - "h": 25 - }, - "frame": { - "x": 94, - "y": 0, - "w": 30, - "h": 25 - } - }, - { - "filename": "487-altered_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 30, - "h": 24 - }, - "frame": { - "x": 0, - "y": 81, - "w": 30, - "h": 24 - } - }, - { - "filename": "487-altered_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 30, - "h": 24 - }, - "frame": { - "x": 0, - "y": 105, - "w": 30, - "h": 24 - } - }, - { - "filename": "472_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 31, - "h": 22 - }, - "frame": { - "x": 64, - "y": 25, - "w": 31, - "h": 22 - } - }, - { - "filename": "445_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 95, - "y": 25, - "w": 29, - "h": 22 - } - }, - { - "filename": "487-origin_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 28, - "h": 25 - }, - "frame": { - "x": 0, - "y": 129, - "w": 28, - "h": 25 - } - }, - { - "filename": "487-origin_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 28, - "h": 25 - }, - "frame": { - "x": 0, - "y": 154, - "w": 28, - "h": 25 - } - }, - { - "filename": "389_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 0, - "y": 179, - "w": 28, - "h": 23 - } - }, - { - "filename": "389_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 0, - "y": 202, - "w": 28, - "h": 23 - } - }, - { - "filename": "475-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 0, - "y": 225, - "w": 25, - "h": 26 - } - }, - { - "filename": "475-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 0, - "y": 251, - "w": 25, - "h": 26 - } - }, - { - "filename": "488_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 0, - "y": 277, - "w": 25, - "h": 26 - } - }, - { - "filename": "488_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 0, - "y": 303, - "w": 25, - "h": 26 - } - }, - { - "filename": "462_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 0, - "y": 329, - "w": 26, - "h": 24 - } - }, - { - "filename": "462_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 0, - "y": 353, - "w": 26, - "h": 24 - } - }, - { - "filename": "482_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 0, - "y": 377, - "w": 26, - "h": 24 - } - }, - { - "filename": "482_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 0, - "y": 401, - "w": 26, - "h": 24 - } - }, - { - "filename": "482_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 0, - "y": 425, - "w": 26, - "h": 24 - } - }, - { - "filename": "466_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 23 - }, - "frame": { - "x": 0, - "y": 449, - "w": 26, - "h": 23 - } - }, - { - "filename": "466_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 23 - }, - "frame": { - "x": 0, - "y": 472, - "w": 26, - "h": 23 - } - }, - { - "filename": "466_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 23 - }, - "frame": { - "x": 0, - "y": 495, - "w": 26, - "h": 23 - } - }, - { - "filename": "471_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 0, - "y": 518, - "w": 27, - "h": 23 - } - }, - { - "filename": "471_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 0, - "y": 541, - "w": 27, - "h": 23 - } - }, - { - "filename": "471_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 0, - "y": 564, - "w": 27, - "h": 23 - } - }, - { - "filename": "445_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 0, - "y": 587, - "w": 29, - "h": 22 - } - }, - { - "filename": "445_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 0, - "y": 609, - "w": 29, - "h": 22 - } - }, - { - "filename": "465_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 0, - "y": 631, - "w": 29, - "h": 22 - } - }, - { - "filename": "485_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 33, - "h": 20 - }, - "frame": { - "x": 31, - "y": 48, - "w": 33, - "h": 20 - } - }, - { - "filename": "485_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 33, - "h": 20 - }, - "frame": { - "x": 64, - "y": 47, - "w": 33, - "h": 20 - } - }, - { - "filename": "464_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 97, - "y": 47, - "w": 27, - "h": 22 - } - }, - { - "filename": "472_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 31, - "h": 22 - }, - "frame": { - "x": 30, - "y": 68, - "w": 31, - "h": 22 - } - }, - { - "filename": "465_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 30, - "y": 90, - "w": 29, - "h": 22 - } - }, - { - "filename": "481_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 30, - "y": 112, - "w": 29, - "h": 22 - } - }, - { - "filename": "481_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 28, - "y": 134, - "w": 29, - "h": 22 - } - }, - { - "filename": "481_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 28, - "y": 156, - "w": 29, - "h": 22 - } - }, - { - "filename": "464_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 28, - "y": 178, - "w": 27, - "h": 22 - } - }, - { - "filename": "426_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 28, - "y": 200, - "w": 24, - "h": 24 - } - }, - { - "filename": "429_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 25, - "y": 225, - "w": 19, - "h": 28 - } - }, - { - "filename": "429_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 25, - "y": 253, - "w": 19, - "h": 28 - } - }, - { - "filename": "429_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 25, - "y": 281, - "w": 19, - "h": 28 - } - }, - { - "filename": "414_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 25, - "h": 20 - }, - "frame": { - "x": 25, - "y": 309, - "w": 25, - "h": 20 - } - }, - { - "filename": "426_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 26, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "413-sandy_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 26, - "y": 353, - "w": 24, - "h": 23 - } - }, - { - "filename": "413-sandy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 26, - "y": 376, - "w": 24, - "h": 23 - } - }, - { - "filename": "413-sandy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 26, - "y": 399, - "w": 24, - "h": 23 - } - }, - { - "filename": "475_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 26, - "y": 422, - "w": 22, - "h": 25 - } - }, - { - "filename": "475_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 26, - "y": 447, - "w": 22, - "h": 25 - } - }, - { - "filename": "413-plant_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 26, - "y": 472, - "w": 22, - "h": 23 - } - }, - { - "filename": "413-plant_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 26, - "y": 495, - "w": 22, - "h": 23 - } - }, - { - "filename": "402_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 27, - "y": 518, - "w": 20, - "h": 24 - } - }, - { - "filename": "402_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 27, - "y": 542, - "w": 20, - "h": 24 - } - }, - { - "filename": "388_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 27, - "y": 566, - "w": 22, - "h": 21 - } - }, - { - "filename": "413-plant_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 29, - "y": 587, - "w": 22, - "h": 23 - } - }, - { - "filename": "413-trash_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 29, - "y": 610, - "w": 23, - "h": 23 - } - }, - { - "filename": "413-trash_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 29, - "y": 633, - "w": 23, - "h": 23 - } - }, - { - "filename": "448-mega_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 44, - "y": 224, - "w": 19, - "h": 24 - } - }, - { - "filename": "448-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 44, - "y": 248, - "w": 19, - "h": 24 - } - }, - { - "filename": "448-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 44, - "y": 272, - "w": 19, - "h": 24 - } - }, - { - "filename": "468_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 19 - }, - "frame": { - "x": 64, - "y": 67, - "w": 28, - "h": 19 - } - }, - { - "filename": "468_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 19 - }, - "frame": { - "x": 92, - "y": 69, - "w": 28, - "h": 19 - } - }, - { - "filename": "468_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 19 - }, - "frame": { - "x": 61, - "y": 86, - "w": 28, - "h": 19 - } - }, - { - "filename": "428_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 59, - "y": 105, - "w": 26, - "h": 22 - } - }, - { - "filename": "437_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 21 - }, - "frame": { - "x": 89, - "y": 88, - "w": 27, - "h": 21 - } - }, - { - "filename": "437_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 21 - }, - "frame": { - "x": 85, - "y": 109, - "w": 27, - "h": 21 - } - }, - { - "filename": "406_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 112, - "y": 109, - "w": 12, - "h": 18 - } - }, - { - "filename": "428_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 59, - "y": 127, - "w": 26, - "h": 22 - } - }, - { - "filename": "480_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 57, - "y": 149, - "w": 26, - "h": 22 - } - }, - { - "filename": "480_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 85, - "y": 130, - "w": 26, - "h": 22 - } - }, - { - "filename": "480_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 83, - "y": 152, - "w": 26, - "h": 22 - } - }, - { - "filename": "412-sandy_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 109, - "y": 152, - "w": 15, - "h": 23 - } - }, - { - "filename": "406_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 112, - "y": 127, - "w": 12, - "h": 18 - } - }, - { - "filename": "414_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 25, - "h": 20 - }, - "frame": { - "x": 57, - "y": 171, - "w": 25, - "h": 20 - } - }, - { - "filename": "470_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 82, - "y": 174, - "w": 25, - "h": 22 - } - }, - { - "filename": "401_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 107, - "y": 175, - "w": 17, - "h": 22 - } - }, - { - "filename": "470_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 55, - "y": 191, - "w": 25, - "h": 22 - } - }, - { - "filename": "470_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 80, - "y": 196, - "w": 25, - "h": 22 - } - }, - { - "filename": "461_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 105, - "y": 197, - "w": 19, - "h": 22 - } - }, - { - "filename": "401_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 63, - "y": 213, - "w": 17, - "h": 22 - } - }, - { - "filename": "413-trash_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 63, - "y": 235, - "w": 23, - "h": 23 - } - }, - { - "filename": "489_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 80, - "y": 218, - "w": 23, - "h": 17 - } - }, - { - "filename": "454_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 103, - "y": 219, - "w": 21, - "h": 22 - } - }, - { - "filename": "412-plant_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 86, - "y": 235, - "w": 17, - "h": 22 - } - }, - { - "filename": "454_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 103, - "y": 241, - "w": 21, - "h": 22 - } - }, - { - "filename": "423-east_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 63, - "y": 258, - "w": 23, - "h": 22 - } - }, - { - "filename": "412-plant_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 86, - "y": 257, - "w": 17, - "h": 22 - } - }, - { - "filename": "492-sky_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 103, - "y": 263, - "w": 21, - "h": 22 - } - }, - { - "filename": "423-east_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 63, - "y": 280, - "w": 23, - "h": 22 - } - }, - { - "filename": "412-plant_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 86, - "y": 279, - "w": 17, - "h": 22 - } - }, - { - "filename": "492-sky_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 103, - "y": 285, - "w": 21, - "h": 22 - } - }, - { - "filename": "412-sandy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 48, - "y": 422, - "w": 15, - "h": 23 - } - }, - { - "filename": "412-sandy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 48, - "y": 445, - "w": 15, - "h": 23 - } - }, - { - "filename": "412-trash_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 48, - "y": 468, - "w": 16, - "h": 23 - } - }, - { - "filename": "412-trash_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 48, - "y": 491, - "w": 16, - "h": 23 - } - }, - { - "filename": "423-east_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 50, - "y": 302, - "w": 23, - "h": 22 - } - }, - { - "filename": "423-west_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 50, - "y": 324, - "w": 23, - "h": 22 - } - }, - { - "filename": "423-west_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 50, - "y": 346, - "w": 23, - "h": 22 - } - }, - { - "filename": "423-west_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 50, - "y": 368, - "w": 23, - "h": 22 - } - }, - { - "filename": "400_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 50, - "y": 390, - "w": 22, - "h": 22 - } - }, - { - "filename": "412-trash_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 73, - "y": 302, - "w": 16, - "h": 23 - } - }, - { - "filename": "387_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 73, - "y": 325, - "w": 18, - "h": 22 - } - }, - { - "filename": "387_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 73, - "y": 347, - "w": 18, - "h": 22 - } - }, - { - "filename": "388_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 73, - "y": 369, - "w": 22, - "h": 21 - } - }, - { - "filename": "400_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 72, - "y": 390, - "w": 22, - "h": 22 - } - }, - { - "filename": "440_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 89, - "y": 301, - "w": 14, - "h": 19 - } - }, - { - "filename": "442_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 103, - "y": 307, - "w": 21, - "h": 20 - } - }, - { - "filename": "444_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 63, - "y": 412, - "w": 23, - "h": 21 - } - }, - { - "filename": "444_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 63, - "y": 433, - "w": 23, - "h": 21 - } - }, - { - "filename": "444_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 91, - "y": 327, - "w": 23, - "h": 21 - } - }, - { - "filename": "433_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 91, - "y": 348, - "w": 23, - "h": 19 - } - }, - { - "filename": "407_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 95, - "y": 367, - "w": 20, - "h": 22 - } - }, - { - "filename": "407_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 86, - "y": 412, - "w": 20, - "h": 22 - } - }, - { - "filename": "442_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 86, - "y": 434, - "w": 21, - "h": 20 - } - }, - { - "filename": "425_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 15, - "h": 22 - }, - "frame": { - "x": 94, - "y": 390, - "w": 15, - "h": 22 - } - }, - { - "filename": "425_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 15, - "h": 22 - }, - "frame": { - "x": 109, - "y": 389, - "w": 15, - "h": 22 - } - }, - { - "filename": "427_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 106, - "y": 412, - "w": 18, - "h": 22 - } - }, - { - "filename": "422-west_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 107, - "y": 434, - "w": 17, - "h": 20 - } - }, - { - "filename": "433_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 64, - "y": 454, - "w": 23, - "h": 19 - } - }, - { - "filename": "433_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 64, - "y": 473, - "w": 23, - "h": 19 - } - }, - { - "filename": "490_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 87, - "y": 454, - "w": 22, - "h": 20 - } - }, - { - "filename": "490_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 64, - "y": 492, - "w": 22, - "h": 20 - } - }, - { - "filename": "490_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 87, - "y": 474, - "w": 22, - "h": 20 - } - }, - { - "filename": "489_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 86, - "y": 494, - "w": 23, - "h": 17 - } - }, - { - "filename": "440_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 109, - "y": 454, - "w": 14, - "h": 19 - } - }, - { - "filename": "440_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 109, - "y": 473, - "w": 14, - "h": 19 - } - }, - { - "filename": "436_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 13, - "h": 16 - }, - "frame": { - "x": 109, - "y": 492, - "w": 13, - "h": 16 - } - }, - { - "filename": "489_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 64, - "y": 512, - "w": 23, - "h": 17 - } - }, - { - "filename": "422-east_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 87, - "y": 511, - "w": 19, - "h": 20 - } - }, - { - "filename": "427_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 106, - "y": 511, - "w": 18, - "h": 22 - } - }, - { - "filename": "448_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 48, - "y": 514, - "w": 16, - "h": 21 - } - }, - { - "filename": "461_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 47, - "y": 535, - "w": 19, - "h": 22 - } - }, - { - "filename": "494_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 66, - "y": 529, - "w": 18, - "h": 22 - } - }, - { - "filename": "422-east_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 84, - "y": 531, - "w": 19, - "h": 20 - } - }, - { - "filename": "422-east_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 103, - "y": 533, - "w": 19, - "h": 20 - } - }, - { - "filename": "494_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 49, - "y": 557, - "w": 18, - "h": 22 - } - }, - { - "filename": "443_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 67, - "y": 551, - "w": 19, - "h": 19 - } - }, - { - "filename": "422-west_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 86, - "y": 551, - "w": 17, - "h": 20 - } - }, - { - "filename": "443_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 103, - "y": 553, - "w": 19, - "h": 19 - } - }, - { - "filename": "478_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 51, - "y": 579, - "w": 16, - "h": 22 - } - }, - { - "filename": "443_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 67, - "y": 570, - "w": 19, - "h": 19 - } - }, - { - "filename": "422-west_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 86, - "y": 571, - "w": 17, - "h": 20 - } - }, - { - "filename": "447_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 103, - "y": 572, - "w": 18, - "h": 18 - } - }, - { - "filename": "447_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 67, - "y": 589, - "w": 18, - "h": 18 - } - }, - { - "filename": "399_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 85, - "y": 591, - "w": 20, - "h": 16 - } - }, - { - "filename": "447_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 105, - "y": 590, - "w": 18, - "h": 18 - } - }, - { - "filename": "436_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 13, - "h": 16 - }, - "frame": { - "x": 52, - "y": 601, - "w": 13, - "h": 16 - } - }, - { - "filename": "478_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 52, - "y": 617, - "w": 16, - "h": 22 - } - }, - { - "filename": "448_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 52, - "y": 639, - "w": 16, - "h": 21 - } - }, - { - "filename": "448_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 68, - "y": 607, - "w": 16, - "h": 21 - } - }, - { - "filename": "458_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 17 - }, - "frame": { - "x": 84, - "y": 607, - "w": 20, - "h": 17 - } - }, - { - "filename": "458_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 17 - }, - "frame": { - "x": 104, - "y": 608, - "w": 20, - "h": 17 - } - }, - { - "filename": "453_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 68, - "y": 628, - "w": 17, - "h": 17 - } - }, - { - "filename": "453_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 85, - "y": 624, - "w": 17, - "h": 17 - } - }, - { - "filename": "399_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 102, - "y": 625, - "w": 20, - "h": 16 - } - }, - { - "filename": "492-land_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 85, - "y": 641, - "w": 18, - "h": 16 - } - }, - { - "filename": "492-land_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 103, - "y": 641, - "w": 18, - "h": 16 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8d567785b198c5a2f6892242773436c5:1a0706846c40b2345d9ac32977f8c2e5:ebc3f8ec5b2480b298192d752b6e57dc$" - } -} +{ "frames": { + "387_2": { + "frame": { "x": 39, "y": 225, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "387_3": { + "frame": { "x": 148, "y": 225, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "388_2": { + "frame": { "x": 261, "y": 187, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "388_3": { + "frame": { "x": 64, "y": 190, "w": 22, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "389_2": { + "frame": { "x": 272, "y": 47, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "389_3": { + "frame": { "x": 244, "y": 47, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "393_2": { + "frame": { "x": 69, "y": 275, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "393_3": { + "frame": { "x": 285, "y": 275, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "394_2": { + "frame": { "x": 321, "y": 232, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "394_3": { + "frame": { "x": 0, "y": 244, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "395_2": { + "frame": { "x": 340, "y": 95, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "395_3": { + "frame": { "x": 24, "y": 98, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "399_2": { + "frame": { "x": 24, "y": 123, "w": 20, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "399_3": { + "frame": { "x": 108, "y": 267, "w": 20, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "400_2": { + "frame": { "x": 217, "y": 180, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "400_3": { + "frame": { "x": 239, "y": 180, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "401_2": { + "frame": { "x": 279, "y": 243, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "401_3": { + "frame": { "x": 201, "y": 243, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "402_2": { + "frame": { "x": 97, "y": 186, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "402_3": { + "frame": { "x": 289, "y": 182, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "406_2": { + "frame": { "x": 298, "y": 275, "w": 12, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "406_3": { + "frame": { "x": 184, "y": 225, "w": 12, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "407_2": { + "frame": { "x": 177, "y": 203, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "407_3": { + "frame": { "x": 86, "y": 210, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-plant_1": { + "frame": { "x": 338, "y": 232, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-plant_2": { + "frame": { "x": 184, "y": 243, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-plant_3": { + "frame": { "x": 99, "y": 242, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-sandy_1": { + "frame": { "x": 164, "y": 247, "w": 15, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-sandy_2": { + "frame": { "x": 76, "y": 252, "w": 15, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-sandy_3": { + "frame": { "x": 296, "y": 252, "w": 15, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-trash_1": { + "frame": { "x": 218, "y": 245, "w": 16, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-trash_2": { + "frame": { "x": 132, "y": 244, "w": 16, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "412-trash_3": { + "frame": { "x": 116, "y": 244, "w": 16, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-plant_1": { + "frame": { "x": 333, "y": 168, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-plant_2": { + "frame": { "x": 311, "y": 168, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-plant_3": { + "frame": { "x": 75, "y": 167, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-sandy_1": { + "frame": { "x": 0, "y": 117, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-sandy_2": { + "frame": { "x": 292, "y": 117, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-sandy_3": { + "frame": { "x": 316, "y": 117, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-trash_1": { + "frame": { "x": 125, "y": 157, "w": 23, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-trash_2": { + "frame": { "x": 319, "y": 145, "w": 23, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "413-trash_3": { + "frame": { "x": 266, "y": 142, "w": 23, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "414_2": { + "frame": { "x": 120, "y": 180, "w": 25, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "414_3": { + "frame": { "x": 145, "y": 180, "w": 25, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "418_2": { + "frame": { "x": 127, "y": 224, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "418_3": { + "frame": { "x": 0, "y": 224, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "419_2": { + "frame": { "x": 221, "y": 159, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "419_3": { + "frame": { "x": 50, "y": 158, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "422-east_1": { + "frame": { "x": 197, "y": 203, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "422-east_2": { + "frame": { "x": 302, "y": 232, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "422-east_3": { + "frame": { "x": 80, "y": 232, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "422-west_1": { + "frame": { "x": 36, "y": 265, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "422-west_2": { + "frame": { "x": 91, "y": 264, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "422-west_3": { + "frame": { "x": 253, "y": 264, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "423-east_1": { + "frame": { "x": 148, "y": 157, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "423-east_2": { + "frame": { "x": 266, "y": 165, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "423-east_3": { + "frame": { "x": 41, "y": 179, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "423-west_1": { + "frame": { "x": 97, "y": 164, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "423-west_2": { + "frame": { "x": 194, "y": 160, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "423-west_3": { + "frame": { "x": 171, "y": 160, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "424_2": { + "frame": { "x": 303, "y": 0, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "424_3": { + "frame": { "x": 274, "y": 0, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "425_2": { + "frame": { "x": 270, "y": 265, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "425_3": { + "frame": { "x": 234, "y": 265, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "426_2": { + "frame": { "x": 110, "y": 96, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "426_3": { + "frame": { "x": 268, "y": 96, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "427_2": { + "frame": { "x": 21, "y": 225, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "427_3": { + "frame": { "x": 166, "y": 225, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "428-mega_2": { + "frame": { "x": 95, "y": 0, "w": 33, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 33, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "428-mega_3": { + "frame": { "x": 62, "y": 0, "w": 33, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 33, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "428_2": { + "frame": { "x": 47, "y": 117, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "428_3": { + "frame": { "x": 73, "y": 117, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "429_1": { + "frame": { "x": 247, "y": 138, "w": 19, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "429_2": { + "frame": { "x": 0, "y": 140, "w": 19, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "429_3": { + "frame": { "x": 78, "y": 139, "w": 19, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "433_1": { + "frame": { "x": 328, "y": 213, "w": 23, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "433_2": { + "frame": { "x": 305, "y": 213, "w": 23, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "433_3": { + "frame": { "x": 61, "y": 211, "w": 23, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "436_2": { + "frame": { "x": 0, "y": 284, "w": 13, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 13, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "436_3": { + "frame": { "x": 108, "y": 283, "w": 13, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 13, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "437_2": { + "frame": { "x": 239, "y": 117, "w": 27, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "437_3": { + "frame": { "x": 212, "y": 117, "w": 27, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "438_2": { + "frame": { "x": 351, "y": 211, "w": 12, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 12, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "438_3": { + "frame": { "x": 351, "y": 191, "w": 12, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 12, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "440_1": { + "frame": { "x": 163, "y": 270, "w": 14, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "440_2": { + "frame": { "x": 343, "y": 271, "w": 14, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "440_3": { + "frame": { "x": 329, "y": 271, "w": 14, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "441_2": { + "frame": { "x": 157, "y": 203, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "441_3": { + "frame": { "x": 237, "y": 202, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "442_2": { + "frame": { "x": 106, "y": 222, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "442_3": { + "frame": { "x": 197, "y": 223, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "443_1": { + "frame": { "x": 256, "y": 245, "w": 19, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "443_2": { + "frame": { "x": 17, "y": 247, "w": 19, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "443_3": { + "frame": { "x": 234, "y": 246, "w": 19, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "444_1": { + "frame": { "x": 170, "y": 182, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "444_2": { + "frame": { "x": 0, "y": 183, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "444_3": { + "frame": { "x": 193, "y": 182, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "445-mega_1": { + "frame": { "x": 214, "y": 0, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "445-mega_2": { + "frame": { "x": 184, "y": 0, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "445-mega_3": { + "frame": { "x": 244, "y": 0, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "445_1": { + "frame": { "x": 207, "y": 48, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "445_2": { + "frame": { "x": 87, "y": 49, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "445_3": { + "frame": { "x": 331, "y": 49, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "447_1": { + "frame": { "x": 23, "y": 183, "w": 18, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "447_2": { + "frame": { "x": 0, "y": 266, "w": 18, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "447_3": { + "frame": { "x": 18, "y": 266, "w": 18, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "448-mega_1": { + "frame": { "x": 138, "y": 200, "w": 19, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "448-mega_2": { + "frame": { "x": 42, "y": 201, "w": 19, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "448-mega_3": { + "frame": { "x": 23, "y": 201, "w": 19, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "448_1": { + "frame": { "x": 195, "y": 265, "w": 16, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "448_2": { + "frame": { "x": 179, "y": 265, "w": 16, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "448_3": { + "frame": { "x": 53, "y": 265, "w": 16, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "453_2": { + "frame": { "x": 128, "y": 267, "w": 17, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "453_3": { + "frame": { "x": 211, "y": 268, "w": 17, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "454_2": { + "frame": { "x": 330, "y": 191, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "454_3": { + "frame": { "x": 342, "y": 145, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "456_2": { + "frame": { "x": 56, "y": 247, "w": 20, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 20, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "456_3": { + "frame": { "x": 36, "y": 247, "w": 20, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 20, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "457_2": { + "frame": { "x": 19, "y": 160, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "457_3": { + "frame": { "x": 289, "y": 159, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "458_2": { + "frame": { "x": 311, "y": 254, "w": 20, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 20, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "458_3": { + "frame": { "x": 331, "y": 254, "w": 20, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 20, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "461_2": { + "frame": { "x": 218, "y": 223, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "461_3": { + "frame": { "x": 237, "y": 224, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "462_2": { + "frame": { "x": 58, "y": 70, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "462_3": { + "frame": { "x": 329, "y": 71, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "464_2": { + "frame": { "x": 83, "y": 95, "w": 27, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "464_3": { + "frame": { "x": 313, "y": 95, "w": 27, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "465_2": { + "frame": { "x": 145, "y": 53, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "465_3": { + "frame": { "x": 300, "y": 51, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "466_1": { + "frame": { "x": 216, "y": 94, "w": 26, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "466_2": { + "frame": { "x": 242, "y": 94, "w": 26, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "466_3": { + "frame": { "x": 57, "y": 94, "w": 26, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "467_2": { + "frame": { "x": 171, "y": 138, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "467_3": { + "frame": { "x": 121, "y": 120, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "468_1": { + "frame": { "x": 97, "y": 145, "w": 28, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "468_2": { + "frame": { "x": 291, "y": 140, "w": 28, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "468_3": { + "frame": { "x": 50, "y": 139, "w": 28, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "469_2": { + "frame": { "x": 204, "y": 70, "w": 30, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "469_3": { + "frame": { "x": 174, "y": 70, "w": 30, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "470_1": { + "frame": { "x": 266, "y": 120, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "470_2": { + "frame": { "x": 146, "y": 135, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "470_3": { + "frame": { "x": 196, "y": 138, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "471_1": { + "frame": { "x": 110, "y": 73, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "471_2": { + "frame": { "x": 286, "y": 73, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "471_3": { + "frame": { "x": 137, "y": 75, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "472_2": { + "frame": { "x": 275, "y": 25, "w": 31, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 31, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "472_3": { + "frame": { "x": 244, "y": 25, "w": 31, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 31, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "474_2": { + "frame": { "x": 292, "y": 96, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "474_3": { + "frame": { "x": 216, "y": 202, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "475-mega_2": { + "frame": { "x": 120, "y": 47, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "475-mega_3": { + "frame": { "x": 33, "y": 28, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "475_2": { + "frame": { "x": 99, "y": 120, "w": 22, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "475_3": { + "frame": { "x": 340, "y": 120, "w": 22, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "478_2": { + "frame": { "x": 148, "y": 247, "w": 16, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 16, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "478_3": { + "frame": { "x": 313, "y": 73, "w": 16, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 16, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-fan_2": { + "frame": { "x": 221, "y": 138, "w": 26, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 26, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-fan_3": { + "frame": { "x": 24, "y": 139, "w": 26, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 26, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-frost_2": { + "frame": { "x": 214, "y": 25, "w": 30, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-frost_3": { + "frame": { "x": 184, "y": 25, "w": 30, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-heat_2": { + "frame": { "x": 58, "y": 48, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-heat_3": { + "frame": { "x": 0, "y": 70, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-mow_2": { + "frame": { "x": 192, "y": 91, "w": 24, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-mow_3": { + "frame": { "x": 0, "y": 92, "w": 24, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-wash_2": { + "frame": { "x": 164, "y": 91, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479-wash_3": { + "frame": { "x": 29, "y": 76, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479_2": { + "frame": { "x": 156, "y": 0, "w": 28, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 28, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "479_3": { + "frame": { "x": 128, "y": 0, "w": 28, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 28, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "480_1": { + "frame": { "x": 186, "y": 116, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "480_2": { + "frame": { "x": 160, "y": 113, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "480_3": { + "frame": { "x": 134, "y": 98, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "481_1": { + "frame": { "x": 178, "y": 48, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "481_2": { + "frame": { "x": 0, "y": 48, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "481_3": { + "frame": { "x": 29, "y": 54, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "482_1": { + "frame": { "x": 84, "y": 71, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "482_2": { + "frame": { "x": 260, "y": 70, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "482_3": { + "frame": { "x": 234, "y": 70, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "485_2": { + "frame": { "x": 0, "y": 28, "w": 33, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 33, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "485_3": { + "frame": { "x": 120, "y": 27, "w": 33, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 33, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "487-altered_2": { + "frame": { "x": 332, "y": 0, "w": 30, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "487-altered_3": { + "frame": { "x": 62, "y": 24, "w": 30, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "487-origin_2": { + "frame": { "x": 92, "y": 24, "w": 28, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 28, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "487-origin_3": { + "frame": { "x": 332, "y": 24, "w": 28, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 28, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "488_2": { + "frame": { "x": 153, "y": 27, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "488_3": { + "frame": { "x": 306, "y": 25, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "489_1": { + "frame": { "x": 57, "y": 230, "w": 23, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "489_2": { + "frame": { "x": 279, "y": 226, "w": 23, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "489_3": { + "frame": { "x": 256, "y": 228, "w": 23, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "490_1": { + "frame": { "x": 257, "y": 208, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "490_2": { + "frame": { "x": 283, "y": 206, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "490_3": { + "frame": { "x": 0, "y": 204, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "491_2": { + "frame": { "x": 0, "y": 0, "w": 31, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 31, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "491_3": { + "frame": { "x": 31, "y": 0, "w": 31, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 31, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "492-land_2": { + "frame": { "x": 145, "y": 269, "w": 18, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 18, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "492-land_3": { + "frame": { "x": 311, "y": 271, "w": 18, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 18, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "492-sky_2": { + "frame": { "x": 117, "y": 200, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "492-sky_3": { + "frame": { "x": 309, "y": 191, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_4v.png", + "format": "RGBA8888", + "size": { "w": 363, "h": 300 }, + "scale": "1" + } +} diff --git a/public/images/pokemon_icons_4v.png b/public/images/pokemon_icons_4v.png index eaf8d009ca8..4dbf5cc6918 100644 Binary files a/public/images/pokemon_icons_4v.png and b/public/images/pokemon_icons_4v.png differ diff --git a/public/images/pokemon_icons_5.json b/public/images/pokemon_icons_5.json index fdbba6575e7..c6248b92342 100644 --- a/public/images/pokemon_icons_5.json +++ b/public/images/pokemon_icons_5.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_5.png", "format": "RGBA8888", "size": { - "w": 256, - "h": 681 + "w": 498, + "h": 352 }, "scale": 1, "frames": [ @@ -366,6 +366,111 @@ "h": 26 } }, + { + "filename": "645s-incarnate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 31, + "h": 26 + }, + "frame": { + "x": 255, + "y": 0, + "w": 31, + "h": 26 + } + }, + { + "filename": "646", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 31, + "h": 26 + }, + "frame": { + "x": 286, + "y": 0, + "w": 31, + "h": 26 + } + }, + { + "filename": "646s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 31, + "h": 26 + }, + "frame": { + "x": 317, + "y": 0, + "w": 31, + "h": 26 + } + }, + { + "filename": "534", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 31, + "h": 25 + }, + "frame": { + "x": 348, + "y": 0, + "w": 31, + "h": 25 + } + }, + { + "filename": "534s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 31, + "h": 25 + }, + "frame": { + "x": 379, + "y": 0, + "w": 31, + "h": 25 + } + }, { "filename": "641-incarnate", "rotated": false, @@ -408,111 +513,6 @@ "h": 26 } }, - { - "filename": "645s-incarnate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 31, - "h": 26 - }, - "frame": { - "x": 0, - "y": 274, - "w": 31, - "h": 26 - } - }, - { - "filename": "646", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 31, - "h": 26 - }, - "frame": { - "x": 0, - "y": 300, - "w": 31, - "h": 26 - } - }, - { - "filename": "646s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 31, - "h": 26 - }, - "frame": { - "x": 0, - "y": 326, - "w": 31, - "h": 26 - } - }, - { - "filename": "534", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 31, - "h": 25 - }, - "frame": { - "x": 0, - "y": 352, - "w": 31, - "h": 25 - } - }, - { - "filename": "534s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 31, - "h": 25 - }, - "frame": { - "x": 0, - "y": 377, - "w": 31, - "h": 25 - } - }, { "filename": "563", "rotated": false, @@ -528,8 +528,8 @@ "h": 25 }, "frame": { - "x": 0, - "y": 402, + "x": 410, + "y": 0, "w": 30, "h": 25 } @@ -550,7 +550,7 @@ }, "frame": { "x": 0, - "y": 427, + "y": 274, "w": 30, "h": 25 } @@ -570,12 +570,33 @@ "h": 25 }, "frame": { - "x": 0, - "y": 452, + "x": 440, + "y": 0, "w": 30, "h": 25 } }, + { + "filename": "500", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 28, + "h": 25 + }, + "frame": { + "x": 470, + "y": 0, + "w": 28, + "h": 25 + } + }, { "filename": "601s", "rotated": false, @@ -592,7 +613,7 @@ }, "frame": { "x": 0, - "y": 477, + "y": 299, "w": 30, "h": 25 } @@ -613,7 +634,7 @@ }, "frame": { "x": 0, - "y": 502, + "y": 324, "w": 27, "h": 28 } @@ -633,14 +654,140 @@ "h": 28 }, "frame": { - "x": 0, - "y": 530, + "x": 27, + "y": 324, "w": 27, "h": 28 } }, { - "filename": "500", + "filename": "503", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 31, + "h": 23 + }, + "frame": { + "x": 69, + "y": 56, + "w": 31, + "h": 23 + } + }, + { + "filename": "583", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 15, + "h": 21 + }, + "frame": { + "x": 54, + "y": 58, + "w": 15, + "h": 21 + } + }, + { + "filename": "640", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 21, + "h": 26 + }, + "frame": { + "x": 33, + "y": 60, + "w": 21, + "h": 26 + } + }, + { + "filename": "503s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 31, + "h": 23 + }, + "frame": { + "x": 54, + "y": 79, + "w": 31, + "h": 23 + } + }, + { + "filename": "507", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 33, + "y": 86, + "w": 21, + "h": 22 + } + }, + { + "filename": "531-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 32, + "y": 108, + "w": 22, + "h": 26 + } + }, + { + "filename": "526", "rotated": false, "trimmed": true, "sourceSize": { @@ -650,13 +797,55 @@ "spriteSourceSize": { "x": 6, "y": 3, - "w": 28, + "w": 29, "h": 25 }, "frame": { - "x": 0, - "y": 558, - "w": 28, + "x": 54, + "y": 102, + "w": 29, + "h": 25 + } + }, + { + "filename": "531s-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 32, + "y": 134, + "w": 22, + "h": 26 + } + }, + { + "filename": "526s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 54, + "y": 127, + "w": 29, "h": 25 } }, @@ -675,14 +864,14 @@ "h": 25 }, "frame": { - "x": 0, - "y": 583, + "x": 85, + "y": 79, "w": 28, "h": 25 } }, { - "filename": "526", + "filename": "635", "rotated": false, "trimmed": true, "sourceSize": { @@ -696,14 +885,14 @@ "h": 25 }, "frame": { - "x": 0, - "y": 608, + "x": 83, + "y": 104, "w": 29, "h": 25 } }, { - "filename": "526s", + "filename": "609", "rotated": false, "trimmed": true, "sourceSize": { @@ -712,56 +901,14 @@ }, "spriteSourceSize": { "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 0, - "y": 633, - "w": 29, - "h": 25 - } - }, - { - "filename": "503", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, "y": 5, - "w": 31, + "w": 29, "h": 23 }, "frame": { - "x": 0, - "y": 658, - "w": 31, - "h": 23 - } - }, - { - "filename": "503s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 31, - "h": 23 - }, - "frame": { - "x": 37, - "y": 58, - "w": 31, + "x": 83, + "y": 129, + "w": 29, "h": 23 } }, @@ -780,369 +927,12 @@ "h": 22 }, "frame": { - "x": 33, - "y": 81, + "x": 54, + "y": 152, "w": 30, "h": 22 } }, - { - "filename": "635", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 32, - "y": 103, - "w": 29, - "h": 25 - } - }, - { - "filename": "635s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 32, - "y": 128, - "w": 29, - "h": 25 - } - }, - { - "filename": "530", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 32, - "y": 153, - "w": 29, - "h": 22 - } - }, - { - "filename": "569s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 30, - "y": 175, - "w": 30, - "h": 22 - } - }, - { - "filename": "581", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 30, - "y": 197, - "w": 30, - "h": 22 - } - }, - { - "filename": "581s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 30, - "y": 219, - "w": 30, - "h": 22 - } - }, - { - "filename": "598", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 22 - }, - "frame": { - "x": 30, - "y": 241, - "w": 30, - "h": 22 - } - }, - { - "filename": "609", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 29, - "h": 23 - }, - "frame": { - "x": 31, - "y": 263, - "w": 29, - "h": 23 - } - }, - { - "filename": "609s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 29, - "h": 23 - }, - "frame": { - "x": 31, - "y": 286, - "w": 29, - "h": 23 - } - }, - { - "filename": "530s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 31, - "y": 309, - "w": 29, - "h": 22 - } - }, - { - "filename": "533", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 27, - "h": 24 - }, - "frame": { - "x": 31, - "y": 331, - "w": 27, - "h": 24 - } - }, - { - "filename": "533s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 27, - "h": 24 - }, - "frame": { - "x": 31, - "y": 355, - "w": 27, - "h": 24 - } - }, - { - "filename": "508", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 31, - "y": 379, - "w": 27, - "h": 23 - } - }, - { - "filename": "553", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 30, - "y": 402, - "w": 28, - "h": 23 - } - }, - { - "filename": "553s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 30, - "y": 425, - "w": 28, - "h": 23 - } - }, - { - "filename": "558", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 30, - "y": 448, - "w": 28, - "h": 23 - } - }, - { - "filename": "558s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 30, - "y": 471, - "w": 28, - "h": 23 - } - }, { "filename": "497", "rotated": false, @@ -1158,14 +948,14 @@ "h": 22 }, "frame": { - "x": 30, - "y": 494, + "x": 84, + "y": 152, "w": 28, "h": 22 } }, { - "filename": "598s", + "filename": "496", "rotated": false, "trimmed": true, "sourceSize": { @@ -1173,81 +963,18 @@ "h": 30 }, "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 22 - }, - "frame": { - "x": 27, - "y": 516, - "w": 30, - "h": 22 - } - }, - { - "filename": "639", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, + "x": 9, "y": 8, - "w": 29, + "w": 22, "h": 20 }, "frame": { - "x": 27, - "y": 538, - "w": 29, + "x": 32, + "y": 160, + "w": 22, "h": 20 } }, - { - "filename": "623", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 28, - "y": 558, - "w": 26, - "h": 25 - } - }, - { - "filename": "623s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 28, - "y": 583, - "w": 26, - "h": 25 - } - }, { "filename": "512", "rotated": false, @@ -1263,8 +990,8 @@ "h": 25 }, "frame": { - "x": 29, - "y": 608, + "x": 30, + "y": 180, "w": 25, "h": 25 } @@ -1284,495 +1011,12 @@ "h": 25 }, "frame": { - "x": 29, - "y": 633, + "x": 30, + "y": 205, "w": 25, "h": 25 } }, - { - "filename": "508s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 31, - "y": 658, - "w": 27, - "h": 23 - } - }, - { - "filename": "579", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 21 - }, - "frame": { - "x": 69, - "y": 56, - "w": 30, - "h": 21 - } - }, - { - "filename": "579s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 21 - }, - "frame": { - "x": 68, - "y": 77, - "w": 30, - "h": 21 - } - }, - { - "filename": "604", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 22 - }, - "frame": { - "x": 102, - "y": 27, - "w": 30, - "h": 22 - } - }, - { - "filename": "604s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 22 - }, - "frame": { - "x": 132, - "y": 27, - "w": 30, - "h": 22 - } - }, - { - "filename": "647-resolute", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 162, - "y": 27, - "w": 30, - "h": 22 - } - }, - { - "filename": "647s-resolute", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 192, - "y": 27, - "w": 30, - "h": 22 - } - }, - { - "filename": "545", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 101, - "y": 49, - "w": 29, - "h": 22 - } - }, - { - "filename": "545s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 130, - "y": 49, - "w": 29, - "h": 22 - } - }, - { - "filename": "571", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 159, - "y": 49, - "w": 29, - "h": 22 - } - }, - { - "filename": "571s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 188, - "y": 49, - "w": 29, - "h": 22 - } - }, - { - "filename": "639s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 29, - "h": 20 - }, - "frame": { - "x": 99, - "y": 71, - "w": 29, - "h": 20 - } - }, - { - "filename": "497s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 128, - "y": 71, - "w": 28, - "h": 22 - } - }, - { - "filename": "593", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 156, - "y": 71, - "w": 28, - "h": 22 - } - }, - { - "filename": "593s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 184, - "y": 71, - "w": 28, - "h": 22 - } - }, - { - "filename": "537", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 28, - "h": 21 - }, - "frame": { - "x": 98, - "y": 91, - "w": 28, - "h": 21 - } - }, - { - "filename": "537s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 28, - "h": 21 - }, - "frame": { - "x": 126, - "y": 93, - "w": 28, - "h": 21 - } - }, - { - "filename": "596", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 154, - "y": 93, - "w": 28, - "h": 22 - } - }, - { - "filename": "596s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 182, - "y": 93, - "w": 28, - "h": 22 - } - }, - { - "filename": "538", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 224, - "y": 26, - "w": 28, - "h": 20 - } - }, - { - "filename": "538s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 222, - "y": 46, - "w": 28, - "h": 20 - } - }, - { - "filename": "531-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 58, - "y": 331, - "w": 22, - "h": 26 - } - }, - { - "filename": "531s-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 58, - "y": 357, - "w": 22, - "h": 26 - } - }, { "filename": "586-autumn", "rotated": false, @@ -1788,8 +1032,8 @@ "h": 25 }, "frame": { - "x": 58, - "y": 383, + "x": 30, + "y": 230, "w": 25, "h": 25 } @@ -1809,14 +1053,392 @@ "h": 25 }, "frame": { - "x": 58, - "y": 408, + "x": 30, + "y": 255, "w": 25, "h": 25 } }, { - "filename": "612", + "filename": "623", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 30, + "y": 280, + "w": 26, + "h": 25 + } + }, + { + "filename": "600", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 27, + "h": 19 + }, + "frame": { + "x": 30, + "y": 305, + "w": 27, + "h": 19 + } + }, + { + "filename": "635s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 55, + "y": 174, + "w": 29, + "h": 25 + } + }, + { + "filename": "609s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 29, + "h": 23 + }, + "frame": { + "x": 55, + "y": 199, + "w": 29, + "h": 23 + } + }, + { + "filename": "530", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 55, + "y": 222, + "w": 29, + "h": 22 + } + }, + { + "filename": "530s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 55, + "y": 244, + "w": 29, + "h": 22 + } + }, + { + "filename": "533", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 27, + "h": 24 + }, + "frame": { + "x": 84, + "y": 174, + "w": 27, + "h": 24 + } + }, + { + "filename": "533s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 27, + "h": 24 + }, + "frame": { + "x": 84, + "y": 198, + "w": 27, + "h": 24 + } + }, + { + "filename": "623s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 84, + "y": 222, + "w": 26, + "h": 25 + } + }, + { + "filename": "497s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 28, + "h": 22 + }, + "frame": { + "x": 84, + "y": 247, + "w": 28, + "h": 22 + } + }, + { + "filename": "553", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 28, + "h": 23 + }, + "frame": { + "x": 56, + "y": 266, + "w": 28, + "h": 23 + } + }, + { + "filename": "537", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 28, + "h": 21 + }, + "frame": { + "x": 84, + "y": 269, + "w": 28, + "h": 21 + } + }, + { + "filename": "632", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 24, + "h": 16 + }, + "frame": { + "x": 56, + "y": 289, + "w": 24, + "h": 16 + } + }, + { + "filename": "499", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 57, + "y": 305, + "w": 23, + "h": 21 + } + }, + { + "filename": "640s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 21, + "h": 26 + }, + "frame": { + "x": 54, + "y": 326, + "w": 21, + "h": 26 + } + }, + { + "filename": "569s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 80, + "y": 290, + "w": 30, + "h": 22 + } + }, + { + "filename": "579", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 30, + "h": 21 + }, + "frame": { + "x": 80, + "y": 312, + "w": 30, + "h": 21 + } + }, + { + "filename": "600s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 27, + "h": 19 + }, + "frame": { + "x": 75, + "y": 333, + "w": 27, + "h": 19 + } + }, + { + "filename": "628", "rotated": false, "trimmed": true, "sourceSize": { @@ -1825,19 +1447,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 4, - "w": 26, - "h": 24 + "y": 10, + "w": 25, + "h": 19 }, "frame": { - "x": 58, - "y": 433, - "w": 26, - "h": 24 + "x": 102, + "y": 333, + "w": 25, + "h": 19 } }, { - "filename": "612s", + "filename": "502", "rotated": false, "trimmed": true, "sourceSize": { @@ -1845,20 +1467,398 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 24 + "x": 11, + "y": 5, + "w": 19, + "h": 23 }, "frame": { - "x": 58, - "y": 457, - "w": 26, - "h": 24 + "x": 100, + "y": 56, + "w": 19, + "h": 23 } }, { - "filename": "510", + "filename": "579s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 30, + "h": 21 + }, + "frame": { + "x": 102, + "y": 27, + "w": 30, + "h": 21 + } + }, + { + "filename": "581", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 132, + "y": 27, + "w": 30, + "h": 22 + } + }, + { + "filename": "581s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 162, + "y": 27, + "w": 30, + "h": 22 + } + }, + { + "filename": "598", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 30, + "h": 22 + }, + "frame": { + "x": 192, + "y": 27, + "w": 30, + "h": 22 + } + }, + { + "filename": "598s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 30, + "h": 22 + }, + "frame": { + "x": 119, + "y": 49, + "w": 30, + "h": 22 + } + }, + { + "filename": "604", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 30, + "h": 22 + }, + "frame": { + "x": 149, + "y": 49, + "w": 30, + "h": 22 + } + }, + { + "filename": "604s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 30, + "h": 22 + }, + "frame": { + "x": 179, + "y": 49, + "w": 30, + "h": 22 + } + }, + { + "filename": "647-resolute", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 119, + "y": 71, + "w": 30, + "h": 22 + } + }, + { + "filename": "647s-resolute", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 149, + "y": 71, + "w": 30, + "h": 22 + } + }, + { + "filename": "545", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 179, + "y": 71, + "w": 29, + "h": 22 + } + }, + { + "filename": "494", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 209, + "y": 49, + "w": 18, + "h": 22 + } + }, + { + "filename": "502s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 19, + "h": 23 + }, + "frame": { + "x": 208, + "y": 71, + "w": 19, + "h": 23 + } + }, + { + "filename": "545s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 113, + "y": 93, + "w": 29, + "h": 22 + } + }, + { + "filename": "571", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 142, + "y": 93, + "w": 29, + "h": 22 + } + }, + { + "filename": "571s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 171, + "y": 93, + "w": 29, + "h": 22 + } + }, + { + "filename": "553s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 28, + "h": 23 + }, + "frame": { + "x": 112, + "y": 115, + "w": 28, + "h": 23 + } + }, + { + "filename": "558", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 28, + "h": 23 + }, + "frame": { + "x": 112, + "y": 138, + "w": 28, + "h": 23 + } + }, + { + "filename": "558s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 28, + "h": 23 + }, + "frame": { + "x": 140, + "y": 115, + "w": 28, + "h": 23 + } + }, + { + "filename": "508", "rotated": false, "trimmed": true, "sourceSize": { @@ -1868,18 +1868,18 @@ "spriteSourceSize": { "x": 7, "y": 5, - "w": 26, + "w": 27, "h": 23 }, "frame": { - "x": 58, - "y": 481, - "w": 26, + "x": 140, + "y": 138, + "w": 27, "h": 23 } }, { - "filename": "510s", + "filename": "508s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1889,13 +1889,13 @@ "spriteSourceSize": { "x": 7, "y": 5, - "w": 26, + "w": 27, "h": 23 }, "frame": { - "x": 58, - "y": 504, - "w": 26, + "x": 168, + "y": 115, + "w": 27, "h": 23 } }, @@ -1914,14 +1914,14 @@ "h": 23 }, "frame": { - "x": 57, - "y": 527, + "x": 167, + "y": 138, "w": 27, "h": 23 } }, { - "filename": "631", + "filename": "639", "rotated": false, "trimmed": true, "sourceSize": { @@ -1929,15 +1929,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, + "x": 5, "y": 8, - "w": 28, + "w": 29, "h": 20 }, "frame": { - "x": 56, - "y": 550, - "w": 28, + "x": 112, + "y": 161, + "w": 29, "h": 20 } }, @@ -1956,12 +1956,222 @@ "h": 23 }, "frame": { - "x": 54, - "y": 570, + "x": 111, + "y": 181, "w": 27, "h": 23 } }, + { + "filename": "639s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 29, + "h": 20 + }, + "frame": { + "x": 141, + "y": 161, + "w": 29, + "h": 20 + } + }, + { + "filename": "593", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 28, + "h": 22 + }, + "frame": { + "x": 138, + "y": 181, + "w": 28, + "h": 22 + } + }, + { + "filename": "537s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 28, + "h": 21 + }, + "frame": { + "x": 111, + "y": 204, + "w": 28, + "h": 21 + } + }, + { + "filename": "593s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 28, + "h": 22 + }, + "frame": { + "x": 110, + "y": 225, + "w": 28, + "h": 22 + } + }, + { + "filename": "612", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 26, + "h": 24 + }, + "frame": { + "x": 112, + "y": 247, + "w": 26, + "h": 24 + } + }, + { + "filename": "593-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 139, + "y": 203, + "w": 27, + "h": 22 + } + }, + { + "filename": "596", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 28, + "h": 22 + }, + "frame": { + "x": 138, + "y": 225, + "w": 28, + "h": 22 + } + }, + { + "filename": "596s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 28, + "h": 22 + }, + "frame": { + "x": 138, + "y": 247, + "w": 28, + "h": 22 + } + }, + { + "filename": "510", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 23 + }, + "frame": { + "x": 112, + "y": 271, + "w": 26, + "h": 23 + } + }, + { + "filename": "612s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 26, + "h": 24 + }, + "frame": { + "x": 138, + "y": 269, + "w": 26, + "h": 24 + } + }, { "filename": "621", "rotated": false, @@ -1977,12 +2187,75 @@ "h": 23 }, "frame": { - "x": 54, - "y": 593, + "x": 110, + "y": 294, "w": 27, "h": 23 } }, + { + "filename": "632s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 24, + "h": 16 + }, + "frame": { + "x": 110, + "y": 317, + "w": 24, + "h": 16 + } + }, + { + "filename": "628s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 25, + "h": 19 + }, + "frame": { + "x": 127, + "y": 333, + "w": 25, + "h": 19 + } + }, + { + "filename": "510s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 23 + }, + "frame": { + "x": 170, + "y": 161, + "w": 26, + "h": 23 + } + }, { "filename": "621s", "rotated": false, @@ -1998,33 +2271,12 @@ "h": 23 }, "frame": { - "x": 54, - "y": 616, + "x": 166, + "y": 184, "w": 27, "h": 23 } }, - { - "filename": "600", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 27, - "h": 19 - }, - "frame": { - "x": 54, - "y": 639, - "w": 27, - "h": 19 - } - }, { "filename": "584", "rotated": false, @@ -2040,96 +2292,12 @@ "h": 23 }, "frame": { - "x": 58, - "y": 658, + "x": 166, + "y": 207, "w": 26, "h": 23 } }, - { - "filename": "498", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 80, - "y": 98, - "w": 18, - "h": 18 - } - }, - { - "filename": "502", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 19, - "h": 23 - }, - "frame": { - "x": 61, - "y": 103, - "w": 19, - "h": 23 - } - }, - { - "filename": "640", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 21, - "h": 26 - }, - "frame": { - "x": 61, - "y": 126, - "w": 21, - "h": 26 - } - }, - { - "filename": "556", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 61, - "y": 152, - "w": 23, - "h": 23 - } - }, { "filename": "584s", "rotated": false, @@ -2145,8 +2313,8 @@ "h": 23 }, "frame": { - "x": 60, - "y": 175, + "x": 166, + "y": 230, "w": 26, "h": 23 } @@ -2166,12 +2334,54 @@ "h": 22 }, "frame": { - "x": 60, - "y": 198, + "x": 166, + "y": 253, "w": 26, "h": 22 } }, + { + "filename": "538", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 164, + "y": 275, + "w": 28, + "h": 20 + } + }, + { + "filename": "593s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 200, + "y": 94, + "w": 27, + "h": 22 + } + }, { "filename": "514s", "rotated": false, @@ -2187,14 +2397,14 @@ "h": 22 }, "frame": { - "x": 60, - "y": 220, + "x": 195, + "y": 116, "w": 26, "h": 22 } }, { - "filename": "593-f", + "filename": "556", "rotated": false, "trimmed": true, "sourceSize": { @@ -2202,58 +2412,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 + "x": 8, + "y": 5, + "w": 23, + "h": 23 }, "frame": { - "x": 60, - "y": 242, - "w": 27, - "h": 22 - } - }, - { - "filename": "593s-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 60, - "y": 264, - "w": 27, - "h": 22 - } - }, - { - "filename": "634", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 60, - "y": 286, - "w": 26, - "h": 22 + "x": 194, + "y": 138, + "w": 23, + "h": 23 } }, { @@ -2271,12 +2439,243 @@ "h": 23 }, "frame": { - "x": 60, - "y": 308, + "x": 196, + "y": 161, "w": 23, "h": 23 } }, + { + "filename": "634", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 193, + "y": 184, + "w": 26, + "h": 22 + } + }, + { + "filename": "541", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 134, + "y": 317, + "w": 20, + "h": 16 + } + }, + { + "filename": "532", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 9, + "w": 24, + "h": 19 + }, + "frame": { + "x": 152, + "y": 333, + "w": 24, + "h": 19 + } + }, + { + "filename": "521", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 137, + "y": 294, + "w": 20, + "h": 23 + } + }, + { + "filename": "538s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 157, + "y": 295, + "w": 28, + "h": 20 + } + }, + { + "filename": "568", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 157, + "y": 315, + "w": 21, + "h": 18 + } + }, + { + "filename": "532s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 9, + "w": 24, + "h": 19 + }, + "frame": { + "x": 176, + "y": 333, + "w": 24, + "h": 19 + } + }, + { + "filename": "568s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 178, + "y": 315, + "w": 21, + "h": 18 + } + }, + { + "filename": "496s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 185, + "y": 295, + "w": 22, + "h": 20 + } + }, + { + "filename": "494s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 222, + "y": 27, + "w": 18, + "h": 22 + } + }, + { + "filename": "631", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 240, + "y": 26, + "w": 28, + "h": 20 + } + }, { "filename": "631s", "rotated": false, @@ -2292,54 +2691,12 @@ "h": 20 }, "frame": { - "x": 98, - "y": 112, + "x": 268, + "y": 26, "w": 28, "h": 20 } }, - { - "filename": "600s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 27, - "h": 19 - }, - "frame": { - "x": 126, - "y": 114, - "w": 27, - "h": 19 - } - }, - { - "filename": "630", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 82, - "y": 116, - "w": 16, - "h": 22 - } - }, { "filename": "567", "rotated": false, @@ -2355,8 +2712,8 @@ "h": 21 }, "frame": { - "x": 153, - "y": 115, + "x": 296, + "y": 26, "w": 26, "h": 21 } @@ -2376,138 +2733,12 @@ "h": 21 }, "frame": { - "x": 179, - "y": 115, + "x": 322, + "y": 26, "w": 26, "h": 21 } }, - { - "filename": "543", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 14, - "w": 18, - "h": 14 - }, - "frame": { - "x": 82, - "y": 138, - "w": 18, - "h": 14 - } - }, - { - "filename": "502s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 19, - "h": 23 - }, - "frame": { - "x": 84, - "y": 152, - "w": 19, - "h": 23 - } - }, - { - "filename": "640s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 21, - "h": 26 - }, - "frame": { - "x": 86, - "y": 175, - "w": 21, - "h": 26 - } - }, - { - "filename": "586-spring", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 86, - "y": 201, - "w": 23, - "h": 24 - } - }, - { - "filename": "528", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 100, - "y": 132, - "w": 23, - "h": 20 - } - }, - { - "filename": "521", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 103, - "y": 152, - "w": 20, - "h": 23 - } - }, { "filename": "634s", "rotated": false, @@ -2523,33 +2754,12 @@ "h": 22 }, "frame": { - "x": 123, - "y": 133, + "x": 348, + "y": 25, "w": 26, "h": 22 } }, - { - "filename": "626", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 123, - "y": 155, - "w": 26, - "h": 21 - } - }, { "filename": "637", "rotated": false, @@ -2565,8 +2775,8 @@ "h": 22 }, "frame": { - "x": 149, - "y": 136, + "x": 374, + "y": 25, "w": 26, "h": 22 } @@ -2586,138 +2796,12 @@ "h": 22 }, "frame": { - "x": 175, - "y": 136, + "x": 400, + "y": 25, "w": 26, "h": 22 } }, - { - "filename": "626s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 149, - "y": 158, - "w": 26, - "h": 21 - } - }, - { - "filename": "552", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 175, - "y": 158, - "w": 25, - "h": 21 - } - }, - { - "filename": "529", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 21, - "h": 17 - }, - "frame": { - "x": 86, - "y": 225, - "w": 21, - "h": 17 - } - }, - { - "filename": "638", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 87, - "y": 242, - "w": 20, - "h": 25 - } - }, - { - "filename": "496", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 87, - "y": 267, - "w": 22, - "h": 20 - } - }, - { - "filename": "499", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 86, - "y": 287, - "w": 23, - "h": 21 - } - }, { "filename": "565", "rotated": false, @@ -2733,54 +2817,12 @@ "h": 22 }, "frame": { - "x": 83, - "y": 308, + "x": 426, + "y": 25, "w": 25, "h": 22 } }, - { - "filename": "630s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 107, - "y": 175, - "w": 16, - "h": 22 - } - }, - { - "filename": "552s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 123, - "y": 176, - "w": 25, - "h": 21 - } - }, { "filename": "565s", "rotated": false, @@ -2796,14 +2838,98 @@ "h": 22 }, "frame": { - "x": 109, - "y": 197, + "x": 451, + "y": 25, "w": 25, "h": 22 } }, { - "filename": "611", + "filename": "625", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 476, + "y": 25, + "w": 22, + "h": 24 + } + }, + { + "filename": "638", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 227, + "y": 49, + "w": 20, + "h": 25 + } + }, + { + "filename": "638s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 227, + "y": 74, + "w": 20, + "h": 25 + } + }, + { + "filename": "586-spring", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 247, + "y": 46, + "w": 23, + "h": 24 + } + }, + { + "filename": "626", "rotated": false, "trimmed": true, "sourceSize": { @@ -2813,121 +2939,16 @@ "spriteSourceSize": { "x": 7, "y": 7, - "w": 25, + "w": 26, "h": 21 }, "frame": { - "x": 148, - "y": 179, - "w": 25, + "x": 270, + "y": 46, + "w": 26, "h": 21 } }, - { - "filename": "611s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 173, - "y": 179, - "w": 25, - "h": 21 - } - }, - { - "filename": "542", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 134, - "y": 197, - "w": 14, - "h": 21 - } - }, - { - "filename": "620", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 148, - "y": 200, - "w": 25, - "h": 22 - } - }, - { - "filename": "620s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 173, - "y": 200, - "w": 25, - "h": 22 - } - }, - { - "filename": "628", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 10, - "w": 25, - "h": 19 - }, - "frame": { - "x": 109, - "y": 219, - "w": 25, - "h": 19 - } - }, { "filename": "586-summer", "rotated": false, @@ -2943,8 +2964,8 @@ "h": 24 }, "frame": { - "x": 107, - "y": 238, + "x": 247, + "y": 70, "w": 23, "h": 24 } @@ -2964,14 +2985,14 @@ "h": 24 }, "frame": { - "x": 109, - "y": 262, + "x": 270, + "y": 67, "w": 23, "h": 24 } }, { - "filename": "518", + "filename": "626s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2979,15 +3000,141 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 7, + "y": 7, + "w": 26, + "h": 21 + }, + "frame": { + "x": 296, + "y": 47, + "w": 26, + "h": 21 + } + }, + { + "filename": "552", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 322, + "y": 47, + "w": 25, + "h": 21 + } + }, + { + "filename": "552s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 347, + "y": 47, + "w": 25, + "h": 21 + } + }, + { + "filename": "611", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 372, + "y": 47, + "w": 25, + "h": 21 + } + }, + { + "filename": "611s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 397, + "y": 47, + "w": 25, + "h": 21 + } + }, + { + "filename": "620", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, "y": 6, - "w": 23, + "w": 25, "h": 22 }, "frame": { - "x": 109, - "y": 286, - "w": 23, + "x": 422, + "y": 47, + "w": 25, + "h": 22 + } + }, + { + "filename": "620s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 447, + "y": 47, + "w": 25, "h": 22 } }, @@ -3006,54 +3153,12 @@ "h": 22 }, "frame": { - "x": 108, - "y": 308, + "x": 293, + "y": 68, "w": 25, "h": 22 } }, - { - "filename": "542s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 134, - "y": 218, - "w": 14, - "h": 21 - } - }, - { - "filename": "628s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 10, - "w": 25, - "h": 19 - }, - "frame": { - "x": 148, - "y": 222, - "w": 25, - "h": 19 - } - }, { "filename": "647s-ordinary", "rotated": false, @@ -3069,33 +3174,12 @@ "h": 22 }, "frame": { - "x": 173, - "y": 222, + "x": 318, + "y": 68, "w": 25, "h": 22 } }, - { - "filename": "585-autumn", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 130, - "y": 239, - "w": 18, - "h": 22 - } - }, { "filename": "516", "rotated": false, @@ -3111,8 +3195,8 @@ "h": 21 }, "frame": { - "x": 148, - "y": 241, + "x": 343, + "y": 68, "w": 24, "h": 21 } @@ -3132,14 +3216,14 @@ "h": 21 }, "frame": { - "x": 172, - "y": 244, + "x": 367, + "y": 68, "w": 24, "h": 21 } }, { - "filename": "648-pirouette", + "filename": "525", "rotated": false, "trimmed": true, "sourceSize": { @@ -3147,15 +3231,99 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 391, + "y": 68, + "w": 24, + "h": 21 + } + }, + { + "filename": "525s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 472, + "y": 49, + "w": 24, + "h": 21 + } + }, + { + "filename": "495", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 20, + "h": 17 + }, + "frame": { + "x": 227, + "y": 99, + "w": 20, + "h": 17 + } + }, + { + "filename": "518", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 221, + "y": 116, + "w": 23, + "h": 22 + } + }, + { + "filename": "561", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, "y": 5, - "w": 15, + "w": 21, "h": 23 }, "frame": { - "x": 132, - "y": 261, - "w": 15, + "x": 217, + "y": 138, + "w": 21, "h": 23 } }, @@ -3174,8 +3342,8 @@ "h": 22 }, "frame": { - "x": 147, - "y": 262, + "x": 247, + "y": 94, "w": 23, "h": 22 } @@ -3195,96 +3363,12 @@ "h": 24 }, "frame": { - "x": 132, - "y": 284, + "x": 270, + "y": 91, "w": 23, "h": 24 } }, - { - "filename": "531", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 133, - "y": 308, - "w": 22, - "h": 22 - } - }, - { - "filename": "525", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 170, - "y": 265, - "w": 24, - "h": 21 - } - }, - { - "filename": "648s-pirouette", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 155, - "y": 284, - "w": 15, - "h": 23 - } - }, - { - "filename": "525s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 170, - "y": 286, - "w": 24, - "h": 21 - } - }, { "filename": "586s-summer", "rotated": false, @@ -3300,8 +3384,8 @@ "h": 24 }, "frame": { - "x": 155, - "y": 307, + "x": 293, + "y": 90, "w": 23, "h": 24 } @@ -3321,14 +3405,14 @@ "h": 24 }, "frame": { - "x": 178, - "y": 307, + "x": 316, + "y": 90, "w": 23, "h": 24 } }, { - "filename": "638s", + "filename": "555", "rotated": false, "trimmed": true, "sourceSize": { @@ -3336,16 +3420,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 20, - "h": 25 + "x": 8, + "y": 6, + "w": 23, + "h": 22 }, "frame": { - "x": 81, - "y": 570, - "w": 20, - "h": 25 + "x": 244, + "y": 116, + "w": 23, + "h": 22 } }, { @@ -3363,12 +3447,33 @@ "h": 24 }, "frame": { - "x": 81, - "y": 595, + "x": 238, + "y": 138, "w": 23, "h": 24 } }, + { + "filename": "520", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 219, + "y": 161, + "w": 19, + "h": 20 + } + }, { "filename": "589s", "rotated": false, @@ -3384,14 +3489,14 @@ "h": 24 }, "frame": { - "x": 81, - "y": 619, + "x": 219, + "y": 181, "w": 23, "h": 24 } }, { - "filename": "564", + "filename": "572", "rotated": false, "trimmed": true, "sourceSize": { @@ -3400,19 +3505,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 13, - "w": 23, - "h": 15 + "y": 9, + "w": 22, + "h": 19 }, "frame": { - "x": 81, - "y": 643, - "w": 23, - "h": 15 + "x": 238, + "y": 162, + "w": 22, + "h": 19 } }, { - "filename": "561", + "filename": "625s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3422,35 +3527,14 @@ "spriteSourceSize": { "x": 9, "y": 5, - "w": 21, - "h": 23 + "w": 22, + "h": 24 }, "frame": { - "x": 84, - "y": 658, - "w": 21, - "h": 23 - } - }, - { - "filename": "505", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 212, - "y": 71, - "w": 20, - "h": 22 + "x": 242, + "y": 181, + "w": 22, + "h": 24 } }, { @@ -3468,8 +3552,8 @@ "h": 21 }, "frame": { - "x": 232, - "y": 66, + "x": 415, + "y": 69, "w": 24, "h": 21 } @@ -3489,54 +3573,12 @@ "h": 21 }, "frame": { - "x": 232, - "y": 87, + "x": 439, + "y": 69, "w": 24, "h": 21 } }, - { - "filename": "531s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 210, - "y": 93, - "w": 22, - "h": 22 - } - }, - { - "filename": "532", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 232, - "y": 108, - "w": 24, - "h": 19 - } - }, { "filename": "499s", "rotated": false, @@ -3552,14 +3594,56 @@ "h": 21 }, "frame": { - "x": 205, - "y": 115, + "x": 463, + "y": 70, "w": 23, "h": 21 } }, { - "filename": "555", + "filename": "548", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 486, + "y": 70, + "w": 12, + "h": 18 + } + }, + { + "filename": "548s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 486, + "y": 88, + "w": 12, + "h": 18 + } + }, + { + "filename": "649", "rotated": false, "trimmed": true, "sourceSize": { @@ -3568,14 +3652,224 @@ }, "spriteSourceSize": { "x": 8, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 261, + "y": 138, + "w": 22, + "h": 24 + } + }, + { + "filename": "572s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 9, + "w": 22, + "h": 19 + }, + "frame": { + "x": 260, + "y": 162, + "w": 22, + "h": 19 + } + }, + { + "filename": "649-burn", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 264, + "y": 181, + "w": 22, + "h": 24 + } + }, + { + "filename": "505", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, "y": 6, - "w": 23, + "w": 20, "h": 22 }, "frame": { - "x": 201, - "y": 136, + "x": 267, + "y": 116, + "w": 20, + "h": 22 + } + }, + { + "filename": "521s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 287, + "y": 115, + "w": 20, + "h": 23 + } + }, + { + "filename": "649-chill", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 283, + "y": 138, + "w": 22, + "h": 24 + } + }, + { + "filename": "629", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 9, + "w": 22, + "h": 19 + }, + "frame": { + "x": 282, + "y": 162, + "w": 22, + "h": 19 + } + }, + { + "filename": "649-douse", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 307, + "y": 114, + "w": 22, + "h": 24 + } + }, + { + "filename": "649-shock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 305, + "y": 138, + "w": 22, + "h": 24 + } + }, + { + "filename": "528", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, "w": 23, + "h": 20 + }, + "frame": { + "x": 304, + "y": 162, + "w": 23, + "h": 20 + } + }, + { + "filename": "585-autumn", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 286, + "y": 181, + "w": 18, "h": 22 } }, @@ -3594,411 +3888,12 @@ "h": 22 }, "frame": { - "x": 200, - "y": 158, + "x": 304, + "y": 182, "w": 23, "h": 22 } }, - { - "filename": "625", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 198, - "y": 180, - "w": 22, - "h": 24 - } - }, - { - "filename": "625s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 198, - "y": 204, - "w": 22, - "h": 24 - } - }, - { - "filename": "496s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 198, - "y": 228, - "w": 22, - "h": 20 - } - }, - { - "filename": "532s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 196, - "y": 248, - "w": 24, - "h": 19 - } - }, - { - "filename": "649", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 194, - "y": 267, - "w": 22, - "h": 24 - } - }, - { - "filename": "544", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 194, - "y": 291, - "w": 22, - "h": 16 - } - }, - { - "filename": "649-burn", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 201, - "y": 307, - "w": 22, - "h": 24 - } - }, - { - "filename": "632", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 24, - "h": 16 - }, - "frame": { - "x": 228, - "y": 127, - "w": 24, - "h": 16 - } - }, - { - "filename": "632s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 24, - "h": 16 - }, - "frame": { - "x": 224, - "y": 143, - "w": 24, - "h": 16 - } - }, - { - "filename": "614", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 223, - "y": 159, - "w": 23, - "h": 22 - } - }, - { - "filename": "649-chill", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 220, - "y": 181, - "w": 22, - "h": 24 - } - }, - { - "filename": "648-aria", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 242, - "y": 181, - "w": 14, - "h": 21 - } - }, - { - "filename": "649-douse", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 220, - "y": 205, - "w": 22, - "h": 24 - } - }, - { - "filename": "648s-aria", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 242, - "y": 202, - "w": 14, - "h": 21 - } - }, - { - "filename": "649-shock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 220, - "y": 229, - "w": 22, - "h": 24 - } - }, - { - "filename": "624", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 242, - "y": 223, - "w": 14, - "h": 20 - } - }, - { - "filename": "624s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 242, - "y": 243, - "w": 14, - "h": 20 - } - }, - { - "filename": "539", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 220, - "y": 253, - "w": 22, - "h": 22 - } - }, - { - "filename": "574", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 242, - "y": 263, - "w": 14, - "h": 18 - } - }, { "filename": "649s", "rotated": false, @@ -4014,117 +3909,12 @@ "h": 24 }, "frame": { - "x": 216, - "y": 275, + "x": 329, + "y": 114, "w": 22, "h": 24 } }, - { - "filename": "585-spring", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 238, - "y": 281, - "w": 18, - "h": 22 - } - }, - { - "filename": "606", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 223, - "y": 299, - "w": 15, - "h": 22 - } - }, - { - "filename": "585-summer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 238, - "y": 303, - "w": 18, - "h": 22 - } - }, - { - "filename": "517", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 223, - "y": 321, - "w": 15, - "h": 14 - } - }, - { - "filename": "585-winter", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 238, - "y": 325, - "w": 18, - "h": 22 - } - }, { "filename": "649s-burn", "rotated": false, @@ -4140,8 +3930,8 @@ "h": 24 }, "frame": { - "x": 80, - "y": 331, + "x": 327, + "y": 138, "w": 22, "h": 24 } @@ -4161,12 +3951,33 @@ "h": 24 }, "frame": { - "x": 80, - "y": 355, + "x": 327, + "y": 162, "w": 22, "h": 24 } }, + { + "filename": "528s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 327, + "y": 186, + "w": 23, + "h": 20 + } + }, { "filename": "649s-douse", "rotated": false, @@ -4182,8 +3993,8 @@ "h": 24 }, "frame": { - "x": 102, - "y": 330, + "x": 339, + "y": 90, "w": 22, "h": 24 } @@ -4203,12 +4014,33 @@ "h": 24 }, "frame": { - "x": 124, - "y": 330, + "x": 361, + "y": 89, "w": 22, "h": 24 } }, + { + "filename": "614", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 383, + "y": 89, + "w": 23, + "h": 22 + } + }, { "filename": "614s", "rotated": false, @@ -4224,14 +4056,14 @@ "h": 22 }, "frame": { - "x": 102, - "y": 354, + "x": 406, + "y": 90, "w": 23, "h": 22 } }, { - "filename": "507", + "filename": "531", "rotated": false, "trimmed": true, "sourceSize": { @@ -4241,37 +4073,16 @@ "spriteSourceSize": { "x": 9, "y": 6, - "w": 21, + "w": 22, "h": 22 }, "frame": { - "x": 125, - "y": 354, - "w": 21, + "x": 429, + "y": 90, + "w": 22, "h": 22 } }, - { - "filename": "521s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 83, - "y": 379, - "w": 20, - "h": 23 - } - }, { "filename": "561s", "rotated": false, @@ -4287,12 +4098,138 @@ "h": 23 }, "frame": { - "x": 83, - "y": 402, + "x": 351, + "y": 114, "w": 21, "h": 23 } }, + { + "filename": "648-pirouette", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 372, + "y": 113, + "w": 15, + "h": 23 + } + }, + { + "filename": "520s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 387, + "y": 111, + "w": 19, + "h": 20 + } + }, + { + "filename": "587", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 406, + "y": 112, + "w": 23, + "h": 20 + } + }, + { + "filename": "531s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 429, + "y": 112, + "w": 22, + "h": 22 + } + }, + { + "filename": "539", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 451, + "y": 91, + "w": 22, + "h": 22 + } + }, + { + "filename": "594", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 6, + "w": 13, + "h": 22 + }, + "frame": { + "x": 473, + "y": 91, + "w": 13, + "h": 22 + } + }, { "filename": "539s", "rotated": false, @@ -4308,12 +4245,264 @@ "h": 22 }, "frame": { - "x": 103, - "y": 376, + "x": 451, + "y": 113, "w": 22, "h": 22 } }, + { + "filename": "588", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 11, + "w": 12, + "h": 17 + }, + "frame": { + "x": 486, + "y": 106, + "w": 12, + "h": 17 + } + }, + { + "filename": "594s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 6, + "w": 13, + "h": 22 + }, + "frame": { + "x": 473, + "y": 113, + "w": 13, + "h": 22 + } + }, + { + "filename": "588s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 11, + "w": 12, + "h": 17 + }, + "frame": { + "x": 486, + "y": 123, + "w": 12, + "h": 17 + } + }, + { + "filename": "498", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 199, + "y": 315, + "w": 18, + "h": 18 + } + }, + { + "filename": "629s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 9, + "w": 22, + "h": 19 + }, + "frame": { + "x": 200, + "y": 333, + "w": 22, + "h": 19 + } + }, + { + "filename": "557", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 19, + "h": 17 + }, + "frame": { + "x": 387, + "y": 131, + "w": 19, + "h": 17 + } + }, + { + "filename": "587s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 406, + "y": 132, + "w": 23, + "h": 20 + } + }, + { + "filename": "575", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 429, + "y": 134, + "w": 22, + "h": 20 + } + }, + { + "filename": "617", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 451, + "y": 135, + "w": 23, + "h": 20 + } + }, + { + "filename": "582", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 12, + "w": 12, + "h": 16 + }, + "frame": { + "x": 474, + "y": 135, + "w": 12, + "h": 16 + } + }, + { + "filename": "582s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 12, + "w": 12, + "h": 16 + }, + "frame": { + "x": 486, + "y": 140, + "w": 12, + "h": 16 + } + }, + { + "filename": "517", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 15, + "h": 14 + }, + "frame": { + "x": 372, + "y": 136, + "w": 15, + "h": 14 + } + }, { "filename": "507s", "rotated": false, @@ -4329,8 +4518,8 @@ "h": 22 }, "frame": { - "x": 125, - "y": 376, + "x": 351, + "y": 137, "w": 21, "h": 22 } @@ -4350,29 +4539,8 @@ "h": 22 }, "frame": { - "x": 104, - "y": 398, - "w": 21, - "h": 22 - } - }, - { - "filename": "509s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 125, - "y": 398, + "x": 349, + "y": 159, "w": 21, "h": 22 } @@ -4392,14 +4560,119 @@ "h": 22 }, "frame": { - "x": 84, - "y": 425, + "x": 350, + "y": 181, "w": 20, "h": 22 } }, { - "filename": "528s", + "filename": "557s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 19, + "h": 17 + }, + "frame": { + "x": 387, + "y": 148, + "w": 19, + "h": 17 + } + }, + { + "filename": "540", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 15, + "h": 17 + }, + "frame": { + "x": 372, + "y": 150, + "w": 15, + "h": 17 + } + }, + { + "filename": "564", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 13, + "w": 23, + "h": 15 + }, + "frame": { + "x": 406, + "y": 152, + "w": 23, + "h": 15 + } + }, + { + "filename": "509s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 370, + "y": 167, + "w": 21, + "h": 22 + } + }, + { + "filename": "648s-pirouette", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 391, + "y": 165, + "w": 15, + "h": 23 + } + }, + { + "filename": "617s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4413,8 +4686,8 @@ "h": 20 }, "frame": { - "x": 104, - "y": 420, + "x": 406, + "y": 167, "w": 23, "h": 20 } @@ -4434,29 +4707,8 @@ "h": 22 }, "frame": { - "x": 84, - "y": 447, - "w": 21, - "h": 22 - } - }, - { - "filename": "547s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 84, - "y": 469, + "x": 429, + "y": 154, "w": 21, "h": 22 } @@ -4476,8 +4728,8 @@ "h": 21 }, "frame": { - "x": 84, - "y": 491, + "x": 450, + "y": 155, "w": 21, "h": 21 } @@ -4497,14 +4749,14 @@ "h": 21 }, "frame": { - "x": 84, - "y": 512, + "x": 370, + "y": 189, "w": 21, "h": 21 } }, { - "filename": "576", + "filename": "522", "rotated": false, "trimmed": true, "sourceSize": { @@ -4512,62 +4764,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 12, "y": 6, - "w": 20, + "w": 17, "h": 22 }, "frame": { - "x": 84, - "y": 533, - "w": 20, + "x": 391, + "y": 188, + "w": 17, "h": 22 } }, { - "filename": "527", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 84, - "y": 555, - "w": 20, - "h": 15 - } - }, - { - "filename": "511", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 127, - "y": 420, - "w": 20, - "h": 21 - } - }, - { - "filename": "575", + "filename": "547s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4576,15 +4786,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 8, - "w": 22, - "h": 20 + "y": 6, + "w": 21, + "h": 22 }, "frame": { - "x": 105, - "y": 440, - "w": 22, - "h": 20 + "x": 408, + "y": 187, + "w": 21, + "h": 22 } }, { @@ -4602,14 +4812,14 @@ "h": 20 }, "frame": { - "x": 105, - "y": 460, + "x": 429, + "y": 176, "w": 22, "h": 20 } }, { - "filename": "576s", + "filename": "511", "rotated": false, "trimmed": true, "sourceSize": { @@ -4617,20 +4827,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 6, + "x": 11, + "y": 7, "w": 20, - "h": 22 + "h": 21 }, "frame": { - "x": 127, - "y": 441, + "x": 451, + "y": 176, "w": 20, - "h": 22 + "h": 21 } }, { - "filename": "587", + "filename": "544", "rotated": false, "trimmed": true, "sourceSize": { @@ -4639,40 +4849,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 8, - "w": 23, - "h": 20 + "y": 12, + "w": 22, + "h": 16 }, "frame": { - "x": 105, - "y": 480, - "w": 23, - "h": 20 + "x": 429, + "y": 196, + "w": 22, + "h": 16 } }, { - "filename": "587s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 105, - "y": 500, - "w": 23, - "h": 20 - } - }, - { - "filename": "495", + "filename": "495s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4686,33 +4875,12 @@ "h": 17 }, "frame": { - "x": 127, - "y": 463, + "x": 451, + "y": 197, "w": 20, "h": 17 } }, - { - "filename": "591", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 128, - "y": 480, - "w": 20, - "h": 22 - } - }, { "filename": "504", "rotated": false, @@ -4728,8 +4896,8 @@ "h": 18 }, "frame": { - "x": 128, - "y": 502, + "x": 350, + "y": 203, "w": 20, "h": 18 } @@ -4749,56 +4917,14 @@ "h": 15 }, "frame": { - "x": 105, - "y": 520, + "x": 370, + "y": 210, "w": 23, "h": 15 } }, { - "filename": "617", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 104, - "y": 535, - "w": 23, - "h": 20 - } - }, - { - "filename": "617s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 104, - "y": 555, - "w": 23, - "h": 20 - } - }, - { - "filename": "513", + "filename": "498s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4807,124 +4933,19 @@ }, "spriteSourceSize": { "x": 11, - "y": 8, - "w": 20, - "h": 20 + "y": 10, + "w": 18, + "h": 18 }, "frame": { - "x": 101, - "y": 575, - "w": 20, - "h": 20 + "x": 393, + "y": 210, + "w": 18, + "h": 18 } }, { - "filename": "522", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 104, - "y": 595, - "w": 17, - "h": 22 - } - }, - { - "filename": "522s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 104, - "y": 617, - "w": 17, - "h": 22 - } - }, - { - "filename": "572", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 104, - "y": 639, - "w": 22, - "h": 19 - } - }, - { - "filename": "591s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 105, - "y": 658, - "w": 20, - "h": 22 - } - }, - { - "filename": "495s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 20, - "h": 17 - }, - "frame": { - "x": 128, - "y": 520, - "w": 20, - "h": 17 - } - }, - { - "filename": "511s", + "filename": "521-f", "rotated": false, "trimmed": true, "sourceSize": { @@ -4934,16 +4955,37 @@ "spriteSourceSize": { "x": 11, "y": 7, - "w": 20, + "w": 18, "h": 21 }, "frame": { - "x": 127, - "y": 537, - "w": 20, + "x": 411, + "y": 209, + "w": 18, "h": 21 } }, + { + "filename": "544s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 429, + "y": 212, + "w": 22, + "h": 16 + } + }, { "filename": "504s", "rotated": false, @@ -4959,12 +5001,327 @@ "h": 18 }, "frame": { - "x": 127, - "y": 558, + "x": 451, + "y": 214, "w": 20, "h": 18 } }, + { + "filename": "551", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 22, + "h": 16 + }, + "frame": { + "x": 429, + "y": 228, + "w": 22, + "h": 16 + } + }, + { + "filename": "511s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 451, + "y": 232, + "w": 20, + "h": 21 + } + }, + { + "filename": "576", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 471, + "y": 156, + "w": 20, + "h": 22 + } + }, + { + "filename": "576s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 471, + "y": 178, + "w": 20, + "h": 22 + } + }, + { + "filename": "591", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 471, + "y": 200, + "w": 20, + "h": 22 + } + }, + { + "filename": "591s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 471, + "y": 222, + "w": 20, + "h": 22 + } + }, + { + "filename": "513", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 471, + "y": 244, + "w": 20, + "h": 20 + } + }, + { + "filename": "522s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 192, + "y": 207, + "w": 17, + "h": 22 + } + }, + { + "filename": "585-spring", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 192, + "y": 229, + "w": 18, + "h": 22 + } + }, + { + "filename": "585-summer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 192, + "y": 251, + "w": 18, + "h": 22 + } + }, + { + "filename": "585-winter", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 192, + "y": 273, + "w": 18, + "h": 22 + } + }, + { + "filename": "513s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 207, + "y": 295, + "w": 20, + "h": 20 + } + }, + { + "filename": "501", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 16, + "h": 18 + }, + "frame": { + "x": 217, + "y": 315, + "w": 16, + "h": 18 + } + }, + { + "filename": "603", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 21, + "h": 19 + }, + "frame": { + "x": 222, + "y": 333, + "w": 21, + "h": 19 + } + }, + { + "filename": "585s-autumn", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 209, + "y": 206, + "w": 18, + "h": 22 + } + }, { "filename": "560", "rotated": false, @@ -4980,8 +5337,8 @@ "h": 21 }, "frame": { - "x": 121, - "y": 576, + "x": 227, + "y": 205, "w": 20, "h": 21 } @@ -5001,14 +5358,14 @@ "h": 21 }, "frame": { - "x": 121, - "y": 597, + "x": 247, + "y": 205, "w": 20, "h": 21 } }, { - "filename": "521-f", + "filename": "521s-f", "rotated": false, "trimmed": true, "sourceSize": { @@ -5022,54 +5379,12 @@ "h": 21 }, "frame": { - "x": 121, - "y": 618, + "x": 267, + "y": 205, "w": 18, "h": 21 } }, - { - "filename": "513s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 126, - "y": 639, - "w": 20, - "h": 20 - } - }, - { - "filename": "585s-autumn", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 125, - "y": 659, - "w": 18, - "h": 22 - } - }, { "filename": "585s-spring", "rotated": false, @@ -5085,75 +5400,12 @@ "h": 22 }, "frame": { - "x": 143, - "y": 659, + "x": 210, + "y": 228, "w": 18, "h": 22 } }, - { - "filename": "572s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 146, - "y": 331, - "w": 22, - "h": 19 - } - }, - { - "filename": "629", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 146, - "y": 350, - "w": 22, - "h": 19 - } - }, - { - "filename": "629s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 168, - "y": 331, - "w": 22, - "h": 19 - } - }, { "filename": "585s-summer", "rotated": false, @@ -5169,8 +5421,8 @@ "h": 22 }, "frame": { - "x": 146, - "y": 369, + "x": 210, + "y": 250, "w": 18, "h": 22 } @@ -5190,33 +5442,12 @@ "h": 22 }, "frame": { - "x": 146, - "y": 391, + "x": 210, + "y": 272, "w": 18, "h": 22 } }, - { - "filename": "603", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 190, - "y": 331, - "w": 21, - "h": 19 - } - }, { "filename": "603s", "rotated": false, @@ -5232,159 +5463,12 @@ "h": 19 }, "frame": { - "x": 168, - "y": 350, + "x": 228, + "y": 226, "w": 21, "h": 19 } }, - { - "filename": "520", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 369, - "w": 19, - "h": 20 - } - }, - { - "filename": "520s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 389, - "w": 19, - "h": 20 - } - }, - { - "filename": "568", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 189, - "y": 350, - "w": 21, - "h": 18 - } - }, - { - "filename": "548", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 211, - "y": 331, - "w": 12, - "h": 18 - } - }, - { - "filename": "517s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 223, - "y": 335, - "w": 15, - "h": 14 - } - }, - { - "filename": "521s-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 18, - "h": 21 - }, - "frame": { - "x": 238, - "y": 347, - "w": 18, - "h": 21 - } - }, - { - "filename": "549", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 147, - "y": 413, - "w": 17, - "h": 21 - } - }, { "filename": "592", "rotated": false, @@ -5400,33 +5484,12 @@ "h": 20 }, "frame": { - "x": 164, - "y": 409, + "x": 228, + "y": 245, "w": 19, "h": 20 } }, - { - "filename": "549s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 147, - "y": 434, - "w": 17, - "h": 21 - } - }, { "filename": "592-f", "rotated": false, @@ -5442,14 +5505,14 @@ "h": 20 }, "frame": { - "x": 164, - "y": 429, + "x": 228, + "y": 265, "w": 19, "h": 20 } }, { - "filename": "627", + "filename": "636", "rotated": false, "trimmed": true, "sourceSize": { @@ -5457,16 +5520,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 + "x": 10, + "y": 9, + "w": 20, + "h": 19 }, "frame": { - "x": 147, - "y": 455, - "w": 17, - "h": 21 + "x": 249, + "y": 226, + "w": 20, + "h": 19 } }, { @@ -5484,75 +5547,12 @@ "h": 20 }, "frame": { - "x": 164, - "y": 449, + "x": 247, + "y": 245, "w": 19, "h": 20 } }, - { - "filename": "606s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 148, - "y": 476, - "w": 15, - "h": 22 - } - }, - { - "filename": "583", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 15, - "h": 21 - }, - "frame": { - "x": 148, - "y": 498, - "w": 15, - "h": 21 - } - }, - { - "filename": "498s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 148, - "y": 519, - "w": 18, - "h": 18 - } - }, { "filename": "592s-f", "rotated": false, @@ -5568,12 +5568,33 @@ "h": 20 }, "frame": { - "x": 147, - "y": 537, + "x": 247, + "y": 265, "w": 19, "h": 20 } }, + { + "filename": "549", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 269, + "y": 226, + "w": 17, + "h": 21 + } + }, { "filename": "615", "rotated": false, @@ -5589,14 +5610,14 @@ "h": 20 }, "frame": { - "x": 147, - "y": 557, + "x": 266, + "y": 247, "w": 19, "h": 20 } }, { - "filename": "568s", + "filename": "608", "rotated": false, "trimmed": true, "sourceSize": { @@ -5604,20 +5625,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 11, "y": 10, - "w": 21, + "w": 19, "h": 18 }, "frame": { - "x": 141, - "y": 577, - "w": 21, + "x": 266, + "y": 267, + "w": 19, "h": 18 } }, { - "filename": "615s", + "filename": "551s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 22, + "h": 16 + }, + "frame": { + "x": 228, + "y": 285, + "w": 22, + "h": 16 + } + }, + { + "filename": "546", "rotated": false, "trimmed": true, "sourceSize": { @@ -5626,19 +5668,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 8, - "w": 19, - "h": 20 + "y": 14, + "w": 21, + "h": 14 }, "frame": { - "x": 141, - "y": 595, - "w": 19, - "h": 20 + "x": 227, + "y": 301, + "w": 21, + "h": 14 } }, { - "filename": "583s", + "filename": "501s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5646,20 +5688,83 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 15, - "h": 21 + "x": 14, + "y": 10, + "w": 16, + "h": 18 }, "frame": { - "x": 139, - "y": 618, - "w": 15, - "h": 21 + "x": 233, + "y": 315, + "w": 16, + "h": 18 } }, { - "filename": "610", + "filename": "636s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 20, + "h": 19 + }, + "frame": { + "x": 243, + "y": 333, + "w": 20, + "h": 19 + } + }, + { + "filename": "562", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 250, + "y": 285, + "w": 22, + "h": 16 + } + }, + { + "filename": "546s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 21, + "h": 14 + }, + "frame": { + "x": 248, + "y": 301, + "w": 21, + "h": 14 + } + }, + { + "filename": "608s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5668,99 +5773,15 @@ }, "spriteSourceSize": { "x": 11, - "y": 8, - "w": 18, - "h": 20 + "y": 10, + "w": 19, + "h": 18 }, "frame": { - "x": 146, - "y": 639, - "w": 18, - "h": 20 - } - }, - { - "filename": "594", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 13, - "h": 22 - }, - "frame": { - "x": 161, - "y": 659, - "w": 13, - "h": 22 - } - }, - { - "filename": "594s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 13, - "h": 22 - }, - "frame": { - "x": 183, - "y": 369, - "w": 13, - "h": 22 - } - }, - { - "filename": "627s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 183, - "y": 391, - "w": 17, - "h": 21 - } - }, - { - "filename": "610s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 183, - "y": 412, - "w": 18, - "h": 20 + "x": 249, + "y": 315, + "w": 19, + "h": 18 } }, { @@ -5778,8 +5799,8 @@ "h": 19 }, "frame": { - "x": 183, - "y": 432, + "x": 263, + "y": 333, "w": 18, "h": 19 } @@ -5799,96 +5820,12 @@ "h": 18 }, "frame": { - "x": 183, - "y": 451, + "x": 268, + "y": 315, "w": 18, "h": 18 } }, - { - "filename": "633", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 196, - "y": 368, - "w": 16, - "h": 20 - } - }, - { - "filename": "544s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 164, - "y": 469, - "w": 22, - "h": 16 - } - }, - { - "filename": "636", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 163, - "y": 485, - "w": 20, - "h": 19 - } - }, - { - "filename": "527s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 163, - "y": 504, - "w": 20, - "h": 15 - } - }, { "filename": "619s", "rotated": false, @@ -5904,77 +5841,14 @@ "h": 19 }, "frame": { - "x": 166, - "y": 519, + "x": 281, + "y": 333, "w": 18, "h": 19 } }, { - "filename": "636s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 166, - "y": 538, - "w": 20, - "h": 19 - } - }, - { - "filename": "529s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 21, - "h": 17 - }, - "frame": { - "x": 166, - "y": 557, - "w": 21, - "h": 17 - } - }, - { - "filename": "501", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 16, - "h": 18 - }, - "frame": { - "x": 186, - "y": 469, - "w": 16, - "h": 18 - } - }, - { - "filename": "608", + "filename": "543", "rotated": false, "trimmed": true, "sourceSize": { @@ -5983,40 +5857,19 @@ }, "spriteSourceSize": { "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 183, - "y": 487, - "w": 19, - "h": 18 - } - }, - { - "filename": "546", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, "y": 14, - "w": 21, + "w": 18, "h": 14 }, "frame": { - "x": 183, - "y": 505, - "w": 21, + "x": 269, + "y": 301, + "w": 18, "h": 14 } }, { - "filename": "555-zen", + "filename": "519", "rotated": false, "trimmed": true, "sourceSize": { @@ -6024,16 +5877,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 20, - "h": 17 + "x": 12, + "y": 12, + "w": 16, + "h": 16 }, "frame": { - "x": 184, - "y": 519, - "w": 20, - "h": 17 + "x": 272, + "y": 285, + "w": 16, + "h": 16 } }, { @@ -6051,33 +5904,12 @@ "h": 18 }, "frame": { - "x": 186, - "y": 536, + "x": 286, + "y": 315, "w": 18, "h": 18 } }, - { - "filename": "633s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 187, - "y": 554, - "w": 16, - "h": 20 - } - }, { "filename": "578", "rotated": false, @@ -6093,14 +5925,14 @@ "h": 19 }, "frame": { - "x": 200, - "y": 388, + "x": 299, + "y": 333, "w": 16, "h": 19 } }, { - "filename": "551", + "filename": "543s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6108,58 +5940,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 + "x": 11, + "y": 14, + "w": 18, + "h": 14 }, "frame": { - "x": 216, - "y": 349, - "w": 22, - "h": 16 - } - }, - { - "filename": "551s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 - }, - "frame": { - "x": 212, - "y": 365, - "w": 22, - "h": 16 - } - }, - { - "filename": "562", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 234, - "y": 368, - "w": 22, - "h": 16 + "x": 287, + "y": 301, + "w": 18, + "h": 14 } }, { @@ -6177,33 +5967,12 @@ "h": 18 }, "frame": { - "x": 216, - "y": 381, + "x": 304, + "y": 315, "w": 18, "h": 18 } }, - { - "filename": "562s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 234, - "y": 384, - "w": 22, - "h": 16 - } - }, { "filename": "578s", "rotated": false, @@ -6219,14 +5988,14 @@ "h": 19 }, "frame": { - "x": 201, - "y": 407, + "x": 315, + "y": 333, "w": 16, "h": 19 } }, { - "filename": "580", + "filename": "615s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6234,20 +6003,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 + "x": 10, + "y": 8, + "w": 19, + "h": 20 }, "frame": { - "x": 201, - "y": 426, - "w": 16, - "h": 19 + "x": 331, + "y": 206, + "w": 19, + "h": 20 } }, { - "filename": "580s", + "filename": "527", "rotated": false, "trimmed": true, "sourceSize": { @@ -6255,20 +6024,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 + "x": 10, + "y": 13, + "w": 20, + "h": 15 }, "frame": { - "x": 201, - "y": 445, - "w": 16, - "h": 19 + "x": 350, + "y": 221, + "w": 20, + "h": 15 } }, { - "filename": "501s", + "filename": "562s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6276,16 +6045,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 16, - "h": 18 + "x": 9, + "y": 12, + "w": 22, + "h": 16 }, "frame": { - "x": 202, - "y": 464, - "w": 16, - "h": 18 + "x": 370, + "y": 225, + "w": 22, + "h": 16 } }, { @@ -6303,14 +6072,14 @@ "h": 18 }, "frame": { - "x": 202, - "y": 482, + "x": 392, + "y": 228, "w": 18, "h": 18 } }, { - "filename": "608s", + "filename": "550-blue-striped", "rotated": false, "trimmed": true, "sourceSize": { @@ -6319,187 +6088,19 @@ }, "spriteSourceSize": { "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 204, - "y": 500, - "w": 19, - "h": 18 - } - }, - { - "filename": "555s-zen", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 20, - "h": 17 - }, - "frame": { - "x": 204, - "y": 518, - "w": 20, - "h": 17 - } - }, - { - "filename": "541", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 204, - "y": 535, - "w": 20, - "h": 16 - } - }, - { - "filename": "554", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 17, - "h": 15 - }, - "frame": { - "x": 217, - "y": 399, - "w": 17, - "h": 15 - } - }, - { - "filename": "599", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 22, - "h": 16 - }, - "frame": { - "x": 234, - "y": 400, - "w": 22, - "h": 16 - } - }, - { - "filename": "554s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 13, - "w": 17, - "h": 15 - }, - "frame": { - "x": 217, - "y": 414, - "w": 17, - "h": 15 - } - }, - { - "filename": "599s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 22, - "h": 16 - }, - "frame": { - "x": 234, - "y": 416, - "w": 22, - "h": 16 - } - }, - { - "filename": "570", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 217, - "y": 429, - "w": 16, - "h": 17 - } - }, - { - "filename": "622", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, "w": 18, - "h": 18 + "h": 16 }, "frame": { - "x": 217, - "y": 446, + "x": 410, + "y": 230, "w": 18, - "h": 18 + "h": 16 } }, { - "filename": "595", + "filename": "542", "rotated": false, "trimmed": true, "sourceSize": { @@ -6507,58 +6108,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 + "x": 13, + "y": 7, + "w": 14, + "h": 21 }, "frame": { - "x": 235, - "y": 432, - "w": 21, - "h": 16 - } - }, - { - "filename": "595s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 235, - "y": 448, - "w": 21, - "h": 16 - } - }, - { - "filename": "622s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 218, - "y": 464, - "w": 18, - "h": 18 + "x": 285, + "y": 264, + "w": 14, + "h": 21 } }, { @@ -6576,8 +6135,8 @@ "h": 16 }, "frame": { - "x": 236, - "y": 464, + "x": 288, + "y": 285, "w": 20, "h": 16 } @@ -6597,14 +6156,56 @@ "h": 14 }, "frame": { - "x": 236, - "y": 480, + "x": 305, + "y": 301, "w": 20, "h": 14 } }, { - "filename": "570s", + "filename": "529", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 21, + "h": 17 + }, + "frame": { + "x": 285, + "y": 247, + "w": 21, + "h": 17 + } + }, + { + "filename": "549s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 286, + "y": 226, + "w": 17, + "h": 21 + } + }, + { + "filename": "627", "rotated": false, "trimmed": true, "sourceSize": { @@ -6613,14 +6214,476 @@ }, "spriteSourceSize": { "x": 12, - "y": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 285, + "y": 205, + "w": 17, + "h": 21 + } + }, + { + "filename": "542s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 299, + "y": 264, + "w": 14, + "h": 21 + } + }, + { + "filename": "550-red-striped", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 12, + "w": 18, + "h": 16 + }, + "frame": { + "x": 308, + "y": 285, + "w": 18, + "h": 16 + } + }, + { + "filename": "630", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, "w": 16, + "h": 22 + }, + "frame": { + "x": 302, + "y": 204, + "w": 16, + "h": 22 + } + }, + { + "filename": "605", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 318, + "y": 206, + "w": 13, + "h": 19 + } + }, + { + "filename": "583s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 15, + "h": 21 + }, + "frame": { + "x": 303, + "y": 226, + "w": 15, + "h": 21 + } + }, + { + "filename": "529s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 21, "h": 17 }, "frame": { - "x": 220, - "y": 482, + "x": 306, + "y": 247, + "w": 21, + "h": 17 + } + }, + { + "filename": "627s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 313, + "y": 264, + "w": 17, + "h": 21 + } + }, + { + "filename": "605s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 318, + "y": 225, + "w": 13, + "h": 19 + } + }, + { + "filename": "610", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 18, + "h": 20 + }, + "frame": { + "x": 331, + "y": 226, + "w": 18, + "h": 20 + } + }, + { + "filename": "566", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 21, + "h": 15 + }, + "frame": { + "x": 349, + "y": 236, + "w": 21, + "h": 15 + } + }, + { + "filename": "599", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 22, + "h": 16 + }, + "frame": { + "x": 327, + "y": 246, + "w": 22, + "h": 16 + } + }, + { + "filename": "599s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 22, + "h": 16 + }, + "frame": { + "x": 370, + "y": 241, + "w": 22, + "h": 16 + } + }, + { + "filename": "566s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 21, + "h": 15 + }, + "frame": { + "x": 349, + "y": 251, + "w": 21, + "h": 15 + } + }, + { + "filename": "610s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 18, + "h": 20 + }, + "frame": { + "x": 330, + "y": 262, + "w": 18, + "h": 20 + } + }, + { + "filename": "595", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 348, + "y": 266, + "w": 21, + "h": 16 + } + }, + { + "filename": "595s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 392, + "y": 246, + "w": 21, + "h": 16 + } + }, + { + "filename": "519s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, "w": 16, + "h": 16 + }, + "frame": { + "x": 413, + "y": 246, + "w": 16, + "h": 16 + } + }, + { + "filename": "555-zen", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 20, + "h": 17 + }, + "frame": { + "x": 429, + "y": 244, + "w": 20, + "h": 17 + } + }, + { + "filename": "574", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 14, + "h": 18 + }, + "frame": { + "x": 322, + "y": 315, + "w": 14, + "h": 18 + } + }, + { + "filename": "580", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 331, + "y": 333, + "w": 16, + "h": 19 + } + }, + { + "filename": "527s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 370, + "y": 257, + "w": 20, + "h": 15 + } + }, + { + "filename": "555s-zen", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 20, + "h": 17 + }, + "frame": { + "x": 369, + "y": 272, + "w": 20, "h": 17 } }, @@ -6639,264 +6702,12 @@ "h": 14 }, "frame": { - "x": 236, - "y": 494, + "x": 390, + "y": 262, "w": 20, "h": 14 } }, - { - "filename": "605", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 223, - "y": 499, - "w": 13, - "h": 19 - } - }, - { - "filename": "605s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 224, - "y": 518, - "w": 13, - "h": 19 - } - }, - { - "filename": "557", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 19, - "h": 17 - }, - "frame": { - "x": 237, - "y": 508, - "w": 19, - "h": 17 - } - }, - { - "filename": "557s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 19, - "h": 17 - }, - "frame": { - "x": 237, - "y": 525, - "w": 19, - "h": 17 - } - }, - { - "filename": "607", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 13, - "h": 18 - }, - "frame": { - "x": 224, - "y": 537, - "w": 13, - "h": 18 - } - }, - { - "filename": "543s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 14, - "w": 18, - "h": 14 - }, - "frame": { - "x": 237, - "y": 542, - "w": 18, - "h": 14 - } - }, - { - "filename": "546s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 14, - "w": 21, - "h": 14 - }, - "frame": { - "x": 166, - "y": 574, - "w": 21, - "h": 14 - } - }, - { - "filename": "519", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 187, - "y": 574, - "w": 16, - "h": 16 - } - }, - { - "filename": "566", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 21, - "h": 15 - }, - "frame": { - "x": 162, - "y": 588, - "w": 21, - "h": 15 - } - }, - { - "filename": "566s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 21, - "h": 15 - }, - "frame": { - "x": 160, - "y": 603, - "w": 21, - "h": 15 - } - }, - { - "filename": "550-blue-striped", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 154, - "y": 618, - "w": 18, - "h": 16 - } - }, - { - "filename": "550-red-striped", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 183, - "y": 590, - "w": 18, - "h": 16 - } - }, { "filename": "550-white-striped", "rotated": false, @@ -6912,33 +6723,12 @@ "h": 16 }, "frame": { - "x": 181, - "y": 606, + "x": 410, + "y": 262, "w": 18, "h": 16 } }, - { - "filename": "548s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 164, - "y": 634, - "w": 12, - "h": 18 - } - }, { "filename": "550s-blue-striped", "rotated": false, @@ -6954,8 +6744,8 @@ "h": 16 }, "frame": { - "x": 204, - "y": 551, + "x": 389, + "y": 276, "w": 18, "h": 16 } @@ -6975,14 +6765,14 @@ "h": 16 }, "frame": { - "x": 203, - "y": 567, + "x": 407, + "y": 278, "w": 18, "h": 16 } }, { - "filename": "540", + "filename": "517s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6991,15 +6781,15 @@ }, "spriteSourceSize": { "x": 13, - "y": 11, + "y": 14, "w": 15, - "h": 17 + "h": 14 }, "frame": { - "x": 222, - "y": 555, + "x": 325, + "y": 301, "w": 15, - "h": 17 + "h": 14 } }, { @@ -7017,14 +6807,14 @@ "h": 16 }, "frame": { - "x": 237, - "y": 556, + "x": 326, + "y": 285, "w": 18, "h": 16 } }, { - "filename": "616", + "filename": "574s", "rotated": false, "trimmed": true, "sourceSize": { @@ -7032,20 +6822,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 18, - "h": 15 + "x": 13, + "y": 10, + "w": 14, + "h": 18 }, "frame": { - "x": 221, - "y": 572, - "w": 18, - "h": 15 + "x": 336, + "y": 315, + "w": 14, + "h": 18 } }, { - "filename": "519s", + "filename": "580s", "rotated": false, "trimmed": true, "sourceSize": { @@ -7054,19 +6844,19 @@ }, "spriteSourceSize": { "x": 12, - "y": 12, + "y": 9, "w": 16, - "h": 16 + "h": 19 }, "frame": { - "x": 239, - "y": 572, + "x": 347, + "y": 333, "w": 16, - "h": 16 + "h": 19 } }, { - "filename": "616s", + "filename": "622", "rotated": false, "trimmed": true, "sourceSize": { @@ -7075,78 +6865,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 13, + "y": 10, "w": 18, - "h": 15 + "h": 18 }, "frame": { - "x": 203, - "y": 583, + "x": 344, + "y": 282, "w": 18, - "h": 15 - } - }, - { - "filename": "540s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 15, - "h": 17 - }, - "frame": { - "x": 221, - "y": 587, - "w": 15, - "h": 17 - } - }, - { - "filename": "559", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 236, - "y": 588, - "w": 15, - "h": 16 - } - }, - { - "filename": "559s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 201, - "y": 598, - "w": 15, - "h": 16 + "h": 18 } }, { @@ -7164,12 +6891,369 @@ "h": 14 }, "frame": { - "x": 199, - "y": 614, + "x": 340, + "y": 301, "w": 15, "h": 14 } }, + { + "filename": "607", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 13, + "h": 18 + }, + "frame": { + "x": 350, + "y": 315, + "w": 13, + "h": 18 + } + }, + { + "filename": "554", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 13, + "w": 17, + "h": 15 + }, + "frame": { + "x": 355, + "y": 300, + "w": 17, + "h": 15 + } + }, + { + "filename": "606", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 15, + "h": 22 + }, + "frame": { + "x": 363, + "y": 315, + "w": 15, + "h": 22 + } + }, + { + "filename": "616", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 18, + "h": 15 + }, + "frame": { + "x": 363, + "y": 337, + "w": 18, + "h": 15 + } + }, + { + "filename": "602", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 17, + "w": 14, + "h": 11 + }, + "frame": { + "x": 362, + "y": 289, + "w": 14, + "h": 11 + } + }, + { + "filename": "607s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 13, + "h": 18 + }, + "frame": { + "x": 376, + "y": 289, + "w": 13, + "h": 18 + } + }, + { + "filename": "616s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 18, + "h": 15 + }, + "frame": { + "x": 389, + "y": 292, + "w": 18, + "h": 15 + } + }, + { + "filename": "622s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 407, + "y": 294, + "w": 18, + "h": 18 + } + }, + { + "filename": "630s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 378, + "y": 307, + "w": 16, + "h": 22 + } + }, + { + "filename": "524", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 15, + "y": 11, + "w": 11, + "h": 17 + }, + "frame": { + "x": 394, + "y": 307, + "w": 11, + "h": 17 + } + }, + { + "filename": "554s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 13, + "w": 17, + "h": 15 + }, + "frame": { + "x": 405, + "y": 312, + "w": 17, + "h": 15 + } + }, + { + "filename": "606s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 15, + "h": 22 + }, + "frame": { + "x": 381, + "y": 329, + "w": 15, + "h": 22 + } + }, + { + "filename": "633", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 396, + "y": 327, + "w": 16, + "h": 20 + } + }, + { + "filename": "624", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 412, + "y": 327, + "w": 14, + "h": 20 + } + }, + { + "filename": "648-aria", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 425, + "y": 278, + "w": 14, + "h": 21 + } + }, + { + "filename": "559", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 15, + "h": 16 + }, + "frame": { + "x": 428, + "y": 262, + "w": 15, + "h": 16 + } + }, + { + "filename": "535", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 15, + "w": 14, + "h": 13 + }, + "frame": { + "x": 425, + "y": 299, + "w": 14, + "h": 13 + } + }, { "filename": "577s", "rotated": false, @@ -7185,12 +7269,243 @@ "h": 14 }, "frame": { - "x": 216, - "y": 604, + "x": 422, + "y": 312, "w": 15, "h": 14 } }, + { + "filename": "648s-aria", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 426, + "y": 326, + "w": 14, + "h": 21 + } + }, + { + "filename": "624s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 439, + "y": 278, + "w": 14, + "h": 20 + } + }, + { + "filename": "524s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 15, + "y": 11, + "w": 11, + "h": 17 + }, + "frame": { + "x": 443, + "y": 261, + "w": 11, + "h": 17 + } + }, + { + "filename": "540s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 15, + "h": 17 + }, + "frame": { + "x": 439, + "y": 298, + "w": 15, + "h": 17 + } + }, + { + "filename": "633s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 454, + "y": 253, + "w": 16, + "h": 20 + } + }, + { + "filename": "602s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 17, + "w": 14, + "h": 11 + }, + "frame": { + "x": 437, + "y": 315, + "w": 14, + "h": 11 + } + }, + { + "filename": "613", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 14, + "h": 18 + }, + "frame": { + "x": 440, + "y": 326, + "w": 14, + "h": 18 + } + }, + { + "filename": "570", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 16, + "h": 17 + }, + "frame": { + "x": 470, + "y": 264, + "w": 16, + "h": 17 + } + }, + { + "filename": "570s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 16, + "h": 17 + }, + "frame": { + "x": 454, + "y": 273, + "w": 16, + "h": 17 + } + }, + { + "filename": "559s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 15, + "h": 16 + }, + "frame": { + "x": 470, + "y": 281, + "w": 15, + "h": 16 + } + }, + { + "filename": "613s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 14, + "h": 18 + }, + "frame": { + "x": 454, + "y": 290, + "w": 14, + "h": 18 + } + }, { "filename": "597", "rotated": false, @@ -7206,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 231, - "y": 604, + "x": 468, + "y": 297, "w": 15, "h": 16 } @@ -7227,222 +7542,12 @@ "h": 16 }, "frame": { - "x": 214, - "y": 618, + "x": 483, + "y": 297, "w": 15, "h": 16 } }, - { - "filename": "574s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 229, - "y": 620, - "w": 14, - "h": 18 - } - }, - { - "filename": "607s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 13, - "h": 18 - }, - "frame": { - "x": 243, - "y": 620, - "w": 13, - "h": 18 - } - }, - { - "filename": "613", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 176, - "y": 634, - "w": 14, - "h": 18 - } - }, - { - "filename": "613s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 174, - "y": 652, - "w": 14, - "h": 18 - } - }, - { - "filename": "602", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 17, - "w": 14, - "h": 11 - }, - "frame": { - "x": 174, - "y": 670, - "w": 14, - "h": 11 - } - }, - { - "filename": "524", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 11, - "w": 11, - "h": 17 - }, - "frame": { - "x": 188, - "y": 652, - "w": 11, - "h": 17 - } - }, - { - "filename": "602s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 17, - "w": 14, - "h": 11 - }, - "frame": { - "x": 188, - "y": 669, - "w": 14, - "h": 11 - } - }, - { - "filename": "582", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 12, - "w": 12, - "h": 16 - }, - "frame": { - "x": 202, - "y": 628, - "w": 12, - "h": 16 - } - }, - { - "filename": "588", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 11, - "w": 12, - "h": 17 - }, - "frame": { - "x": 190, - "y": 628, - "w": 12, - "h": 17 - } - }, - { - "filename": "535", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 15, - "w": 14, - "h": 13 - }, - "frame": { - "x": 214, - "y": 634, - "w": 14, - "h": 13 - } - }, { "filename": "535s", "rotated": false, @@ -7458,8 +7563,8 @@ "h": 13 }, "frame": { - "x": 228, - "y": 638, + "x": 454, + "y": 308, "w": 14, "h": 13 } @@ -7479,33 +7584,12 @@ "h": 17 }, "frame": { - "x": 242, - "y": 638, + "x": 454, + "y": 321, "w": 14, "h": 17 } }, - { - "filename": "524s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 11, - "w": 11, - "h": 17 - }, - "frame": { - "x": 199, - "y": 651, - "w": 11, - "h": 17 - } - }, { "filename": "590s", "rotated": false, @@ -7521,53 +7605,11 @@ "h": 17 }, "frame": { - "x": 210, - "y": 647, + "x": 468, + "y": 313, "w": 14, "h": 17 } - }, - { - "filename": "588s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 11, - "w": 12, - "h": 17 - }, - "frame": { - "x": 210, - "y": 664, - "w": 12, - "h": 17 - } - }, - { - "filename": "582s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 12, - "w": 12, - "h": 16 - }, - "frame": { - "x": 224, - "y": 651, - "w": 12, - "h": 16 - } } ] } @@ -7575,6 +7617,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b1ede56fa38672ee5e2e5de6f39ff48:58f3f9bd48fa9481c3cd7a0cdebb3e00:20fe181c46701b46ac8f250d40b1bbc1$" + "smartupdate": "$TexturePacker:SmartUpdate:04dd695c2012d1dcfb9f1493caaff3b2:e16f634fd998b52650f0877620259770:20fe181c46701b46ac8f250d40b1bbc1$" } } diff --git a/public/images/pokemon_icons_5.png b/public/images/pokemon_icons_5.png index e0a4ebef303..12fa2e99e24 100644 Binary files a/public/images/pokemon_icons_5.png and b/public/images/pokemon_icons_5.png differ diff --git a/public/images/pokemon_icons_5v.json b/public/images/pokemon_icons_5v.json index 7f5356e7e2a..ef3ce80e8ef 100644 --- a/public/images/pokemon_icons_5v.json +++ b/public/images/pokemon_icons_5v.json @@ -1,3674 +1,1341 @@ -{ - "textures": [ - { - "image": "pokemon_icons_5v.png", - "format": "RGBA8888", - "size": { - "w": 127, - "h": 668 - }, - "scale": 1, - "frames": [ - { - "filename": "569-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 29 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 29 - } - }, - { - "filename": "569-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 29 - }, - "frame": { - "x": 0, - "y": 29, - "w": 32, - "h": 29 - } - }, - { - "filename": "642-incarnate_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 31, - "h": 27 - }, - "frame": { - "x": 32, - "y": 0, - "w": 31, - "h": 27 - } - }, - { - "filename": "642-therian_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 32, - "h": 26 - }, - "frame": { - "x": 0, - "y": 58, - "w": 32, - "h": 26 - } - }, - { - "filename": "641-therian_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 30, - "h": 27 - }, - "frame": { - "x": 32, - "y": 27, - "w": 30, - "h": 27 - } - }, - { - "filename": "645-incarnate_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 31, - "h": 26 - }, - "frame": { - "x": 63, - "y": 0, - "w": 31, - "h": 26 - } - }, - { - "filename": "534_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 31, - "h": 25 - }, - "frame": { - "x": 0, - "y": 84, - "w": 31, - "h": 25 - } - }, - { - "filename": "534_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 31, - "h": 25 - }, - "frame": { - "x": 94, - "y": 0, - "w": 31, - "h": 25 - } - }, - { - "filename": "641-incarnate_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 30, - "h": 26 - }, - "frame": { - "x": 32, - "y": 54, - "w": 30, - "h": 26 - } - }, - { - "filename": "563_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 30, - "h": 25 - }, - "frame": { - "x": 0, - "y": 109, - "w": 30, - "h": 25 - } - }, - { - "filename": "563_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 30, - "h": 25 - }, - "frame": { - "x": 0, - "y": 134, - "w": 30, - "h": 25 - } - }, - { - "filename": "645-therian_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 27, - "h": 28 - }, - "frame": { - "x": 0, - "y": 159, - "w": 27, - "h": 28 - } - }, - { - "filename": "635_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 0, - "y": 187, - "w": 29, - "h": 25 - } - }, - { - "filename": "635_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 0, - "y": 212, - "w": 29, - "h": 25 - } - }, - { - "filename": "609_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 29, - "h": 23 - }, - "frame": { - "x": 0, - "y": 237, - "w": 29, - "h": 23 - } - }, - { - "filename": "609_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 29, - "h": 23 - }, - "frame": { - "x": 0, - "y": 260, - "w": 29, - "h": 23 - } - }, - { - "filename": "530_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 0, - "y": 283, - "w": 29, - "h": 22 - } - }, - { - "filename": "530_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 0, - "y": 305, - "w": 29, - "h": 22 - } - }, - { - "filename": "533_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 27, - "h": 24 - }, - "frame": { - "x": 0, - "y": 327, - "w": 27, - "h": 24 - } - }, - { - "filename": "533_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 27, - "h": 24 - }, - "frame": { - "x": 0, - "y": 351, - "w": 27, - "h": 24 - } - }, - { - "filename": "623_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 375, - "w": 26, - "h": 25 - } - }, - { - "filename": "623_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 400, - "w": 26, - "h": 25 - } - }, - { - "filename": "586-autumn_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 25, - "h": 25 - }, - "frame": { - "x": 0, - "y": 425, - "w": 25, - "h": 25 - } - }, - { - "filename": "612_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 0, - "y": 450, - "w": 26, - "h": 24 - } - }, - { - "filename": "612_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 0, - "y": 474, - "w": 26, - "h": 24 - } - }, - { - "filename": "553_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 0, - "y": 498, - "w": 28, - "h": 23 - } - }, - { - "filename": "553_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 0, - "y": 521, - "w": 28, - "h": 23 - } - }, - { - "filename": "497_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 0, - "y": 544, - "w": 28, - "h": 22 - } - }, - { - "filename": "497_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 0, - "y": 566, - "w": 28, - "h": 22 - } - }, - { - "filename": "545_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 0, - "y": 588, - "w": 29, - "h": 22 - } - }, - { - "filename": "545_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 0, - "y": 610, - "w": 29, - "h": 22 - } - }, - { - "filename": "569_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 0, - "y": 632, - "w": 30, - "h": 22 - } - }, - { - "filename": "546_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 14, - "w": 21, - "h": 14 - }, - "frame": { - "x": 0, - "y": 654, - "w": 21, - "h": 14 - } - }, - { - "filename": "546_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 14, - "w": 21, - "h": 14 - }, - "frame": { - "x": 21, - "y": 654, - "w": 21, - "h": 14 - } - }, - { - "filename": "569_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 32, - "y": 80, - "w": 30, - "h": 22 - } - }, - { - "filename": "579_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 21 - }, - "frame": { - "x": 31, - "y": 102, - "w": 30, - "h": 21 - } - }, - { - "filename": "604_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 22 - }, - "frame": { - "x": 30, - "y": 123, - "w": 30, - "h": 22 - } - }, - { - "filename": "579_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 21 - }, - "frame": { - "x": 30, - "y": 145, - "w": 30, - "h": 21 - } - }, - { - "filename": "579_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 21 - }, - "frame": { - "x": 27, - "y": 166, - "w": 30, - "h": 21 - } - }, - { - "filename": "571_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 29, - "y": 187, - "w": 29, - "h": 22 - } - }, - { - "filename": "571_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 29, - "y": 209, - "w": 29, - "h": 22 - } - }, - { - "filename": "604_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 22 - }, - "frame": { - "x": 29, - "y": 231, - "w": 30, - "h": 22 - } - }, - { - "filename": "647-resolute_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 29, - "y": 253, - "w": 30, - "h": 22 - } - }, - { - "filename": "647-resolute_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 29, - "y": 275, - "w": 30, - "h": 22 - } - }, - { - "filename": "593_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 29, - "y": 297, - "w": 28, - "h": 22 - } - }, - { - "filename": "538_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 29, - "y": 319, - "w": 28, - "h": 20 - } - }, - { - "filename": "593_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 27, - "y": 339, - "w": 28, - "h": 22 - } - }, - { - "filename": "538_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 27, - "y": 361, - "w": 28, - "h": 20 - } - }, - { - "filename": "596_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 26, - "y": 381, - "w": 28, - "h": 22 - } - }, - { - "filename": "596_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 26, - "y": 403, - "w": 28, - "h": 22 - } - }, - { - "filename": "593-f_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 25, - "y": 425, - "w": 27, - "h": 22 - } - }, - { - "filename": "531-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 26, - "y": 447, - "w": 22, - "h": 26 - } - }, - { - "filename": "586-spring_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 26, - "y": 473, - "w": 23, - "h": 24 - } - }, - { - "filename": "531-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 28, - "y": 497, - "w": 22, - "h": 26 - } - }, - { - "filename": "640_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 21, - "h": 26 - }, - "frame": { - "x": 28, - "y": 523, - "w": 21, - "h": 26 - } - }, - { - "filename": "640_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 21, - "h": 26 - }, - "frame": { - "x": 28, - "y": 549, - "w": 21, - "h": 26 - } - }, - { - "filename": "586-summer_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 29, - "y": 575, - "w": 23, - "h": 24 - } - }, - { - "filename": "586-winter_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 29, - "y": 599, - "w": 23, - "h": 24 - } - }, - { - "filename": "649-burn_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 30, - "y": 623, - "w": 22, - "h": 24 - } - }, - { - "filename": "552_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 42, - "y": 647, - "w": 25, - "h": 21 - } - }, - { - "filename": "593-f_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 94, - "y": 25, - "w": 27, - "h": 22 - } - }, - { - "filename": "593-f_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 67, - "y": 26, - "w": 27, - "h": 22 - } - }, - { - "filename": "634_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 62, - "y": 48, - "w": 26, - "h": 22 - } - }, - { - "filename": "634_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 62, - "y": 70, - "w": 26, - "h": 22 - } - }, - { - "filename": "552_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 62, - "y": 92, - "w": 25, - "h": 21 - } - }, - { - "filename": "611_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 61, - "y": 113, - "w": 25, - "h": 21 - } - }, - { - "filename": "620_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 60, - "y": 134, - "w": 25, - "h": 22 - } - }, - { - "filename": "611_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 60, - "y": 156, - "w": 25, - "h": 21 - } - }, - { - "filename": "620_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 58, - "y": 177, - "w": 25, - "h": 22 - } - }, - { - "filename": "647-ordinary_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 58, - "y": 199, - "w": 25, - "h": 22 - } - }, - { - "filename": "647-ordinary_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 59, - "y": 221, - "w": 25, - "h": 22 - } - }, - { - "filename": "649-burn_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 59, - "y": 243, - "w": 22, - "h": 24 - } - }, - { - "filename": "649-chill_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 59, - "y": 267, - "w": 22, - "h": 24 - } - }, - { - "filename": "649-chill_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 88, - "y": 48, - "w": 22, - "h": 24 - } - }, - { - "filename": "549_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 110, - "y": 47, - "w": 17, - "h": 21 - } - }, - { - "filename": "496_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 88, - "y": 72, - "w": 22, - "h": 20 - } - }, - { - "filename": "549_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 110, - "y": 68, - "w": 17, - "h": 21 - } - }, - { - "filename": "518_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 87, - "y": 92, - "w": 23, - "h": 22 - } - }, - { - "filename": "518_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 86, - "y": 114, - "w": 23, - "h": 22 - } - }, - { - "filename": "585-autumn_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 109, - "y": 114, - "w": 18, - "h": 22 - } - }, - { - "filename": "649-douse_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 85, - "y": 136, - "w": 22, - "h": 24 - } - }, - { - "filename": "560_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 107, - "y": 136, - "w": 20, - "h": 21 - } - }, - { - "filename": "560_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 107, - "y": 157, - "w": 20, - "h": 21 - } - }, - { - "filename": "496_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 85, - "y": 160, - "w": 22, - "h": 20 - } - }, - { - "filename": "649-douse_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 83, - "y": 180, - "w": 22, - "h": 24 - } - }, - { - "filename": "649-shock_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 105, - "y": 180, - "w": 22, - "h": 24 - } - }, - { - "filename": "632_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 24, - "h": 16 - }, - "frame": { - "x": 83, - "y": 204, - "w": 24, - "h": 16 - } - }, - { - "filename": "560_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 107, - "y": 204, - "w": 20, - "h": 21 - } - }, - { - "filename": "649-shock_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 84, - "y": 220, - "w": 22, - "h": 24 - } - }, - { - "filename": "547_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 106, - "y": 225, - "w": 21, - "h": 22 - } - }, - { - "filename": "649_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 81, - "y": 244, - "w": 22, - "h": 24 - } - }, - { - "filename": "532_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 103, - "y": 247, - "w": 24, - "h": 19 - } - }, - { - "filename": "532_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 24, - "h": 19 - }, - "frame": { - "x": 103, - "y": 266, - "w": 24, - "h": 19 - } - }, - { - "filename": "649_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 81, - "y": 268, - "w": 22, - "h": 24 - } - }, - { - "filename": "632_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 24, - "h": 16 - }, - "frame": { - "x": 103, - "y": 285, - "w": 24, - "h": 16 - } - }, - { - "filename": "648-pirouette_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 110, - "y": 89, - "w": 15, - "h": 23 - } - }, - { - "filename": "531_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 59, - "y": 291, - "w": 22, - "h": 22 - } - }, - { - "filename": "531_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 81, - "y": 292, - "w": 22, - "h": 22 - } - }, - { - "filename": "539_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 57, - "y": 313, - "w": 22, - "h": 22 - } - }, - { - "filename": "539_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 79, - "y": 314, - "w": 22, - "h": 22 - } - }, - { - "filename": "544_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 103, - "y": 301, - "w": 22, - "h": 16 - } - }, - { - "filename": "572_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 101, - "y": 317, - "w": 22, - "h": 19 - } - }, - { - "filename": "544_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 57, - "y": 335, - "w": 22, - "h": 16 - } - }, - { - "filename": "547_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 55, - "y": 351, - "w": 21, - "h": 22 - } - }, - { - "filename": "551_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 - }, - "frame": { - "x": 79, - "y": 336, - "w": 22, - "h": 16 - } - }, - { - "filename": "551_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 - }, - "frame": { - "x": 101, - "y": 336, - "w": 22, - "h": 16 - } - }, - { - "filename": "572_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 76, - "y": 352, - "w": 22, - "h": 19 - } - }, - { - "filename": "603_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 98, - "y": 352, - "w": 21, - "h": 19 - } - }, - { - "filename": "529_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 21, - "h": 17 - }, - "frame": { - "x": 55, - "y": 373, - "w": 21, - "h": 17 - } - }, - { - "filename": "603_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 76, - "y": 371, - "w": 21, - "h": 19 - } - }, - { - "filename": "568_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 97, - "y": 371, - "w": 21, - "h": 18 - } - }, - { - "filename": "585-spring_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 54, - "y": 390, - "w": 18, - "h": 22 - } - }, - { - "filename": "585-summer_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 72, - "y": 390, - "w": 18, - "h": 22 - } - }, - { - "filename": "562_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 54, - "y": 412, - "w": 22, - "h": 16 - } - }, - { - "filename": "568_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 52, - "y": 428, - "w": 21, - "h": 18 - } - }, - { - "filename": "495_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 20, - "h": 17 - }, - "frame": { - "x": 76, - "y": 412, - "w": 20, - "h": 17 - } - }, - { - "filename": "529_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 21, - "h": 17 - }, - "frame": { - "x": 73, - "y": 429, - "w": 21, - "h": 17 - } - }, - { - "filename": "585-winter_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 90, - "y": 390, - "w": 18, - "h": 22 - } - }, - { - "filename": "592-f_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 108, - "y": 389, - "w": 19, - "h": 20 - } - }, - { - "filename": "592-f_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 108, - "y": 409, - "w": 19, - "h": 20 - } - }, - { - "filename": "548_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 96, - "y": 412, - "w": 12, - "h": 18 - } - }, - { - "filename": "592-f_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 108, - "y": 429, - "w": 19, - "h": 20 - } - }, - { - "filename": "542_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 94, - "y": 430, - "w": 14, - "h": 21 - } - }, - { - "filename": "592_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 108, - "y": 449, - "w": 19, - "h": 20 - } - }, - { - "filename": "648-pirouette_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 48, - "y": 447, - "w": 15, - "h": 23 - } - }, - { - "filename": "592_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 63, - "y": 446, - "w": 19, - "h": 20 - } - }, - { - "filename": "548_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 82, - "y": 446, - "w": 12, - "h": 18 - } - }, - { - "filename": "542_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 94, - "y": 451, - "w": 14, - "h": 21 - } - }, - { - "filename": "608_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 108, - "y": 469, - "w": 19, - "h": 18 - } - }, - { - "filename": "606_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 49, - "y": 470, - "w": 15, - "h": 22 - } - }, - { - "filename": "610_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 64, - "y": 466, - "w": 18, - "h": 20 - } - }, - { - "filename": "548_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 82, - "y": 464, - "w": 12, - "h": 18 - } - }, - { - "filename": "648-aria_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 94, - "y": 472, - "w": 14, - "h": 21 - } - }, - { - "filename": "608_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 108, - "y": 487, - "w": 19, - "h": 18 - } - }, - { - "filename": "606_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 50, - "y": 492, - "w": 15, - "h": 22 - } - }, - { - "filename": "606_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 65, - "y": 486, - "w": 15, - "h": 22 - } - }, - { - "filename": "648-aria_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 80, - "y": 486, - "w": 14, - "h": 21 - } - }, - { - "filename": "602_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 17, - "w": 14, - "h": 11 - }, - "frame": { - "x": 94, - "y": 493, - "w": 14, - "h": 11 - } - }, - { - "filename": "495_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 20, - "h": 17 - }, - "frame": { - "x": 50, - "y": 514, - "w": 20, - "h": 17 - } - }, - { - "filename": "610_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 49, - "y": 531, - "w": 18, - "h": 20 - } - }, - { - "filename": "619_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 49, - "y": 551, - "w": 18, - "h": 19 - } - }, - { - "filename": "633_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 52, - "y": 570, - "w": 16, - "h": 20 - } - }, - { - "filename": "633_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 52, - "y": 590, - "w": 16, - "h": 20 - } - }, - { - "filename": "578_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 52, - "y": 610, - "w": 16, - "h": 19 - } - }, - { - "filename": "622_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 52, - "y": 629, - "w": 18, - "h": 18 - } - }, - { - "filename": "578_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 70, - "y": 508, - "w": 16, - "h": 19 - } - }, - { - "filename": "578_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 86, - "y": 507, - "w": 16, - "h": 19 - } - }, - { - "filename": "562_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 102, - "y": 505, - "w": 22, - "h": 16 - } - }, - { - "filename": "595_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 102, - "y": 521, - "w": 21, - "h": 16 - } - }, - { - "filename": "570_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 86, - "y": 526, - "w": 16, - "h": 17 - } - }, - { - "filename": "570_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 70, - "y": 527, - "w": 16, - "h": 17 - } - }, - { - "filename": "619_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 67, - "y": 544, - "w": 18, - "h": 19 - } - }, - { - "filename": "622_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 68, - "y": 563, - "w": 18, - "h": 18 - } - }, - { - "filename": "541_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 68, - "y": 581, - "w": 20, - "h": 16 - } - }, - { - "filename": "541_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 68, - "y": 597, - "w": 20, - "h": 16 - } - }, - { - "filename": "595_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 68, - "y": 613, - "w": 21, - "h": 16 - } - }, - { - "filename": "540_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 15, - "h": 17 - }, - "frame": { - "x": 70, - "y": 629, - "w": 15, - "h": 17 - } - }, - { - "filename": "543_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 14, - "w": 18, - "h": 14 - }, - "frame": { - "x": 102, - "y": 537, - "w": 18, - "h": 14 - } - }, - { - "filename": "602_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 17, - "w": 14, - "h": 11 - }, - "frame": { - "x": 88, - "y": 543, - "w": 14, - "h": 11 - } - }, - { - "filename": "605_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 67, - "y": 647, - "w": 13, - "h": 19 - } - }, - { - "filename": "605_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 80, - "y": 646, - "w": 13, - "h": 19 - } - }, - { - "filename": "540_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 15, - "h": 17 - }, - "frame": { - "x": 85, - "y": 629, - "w": 15, - "h": 17 - } - }, - { - "filename": "605_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 93, - "y": 646, - "w": 13, - "h": 19 - } - }, - { - "filename": "543_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 14, - "w": 18, - "h": 14 - }, - "frame": { - "x": 102, - "y": 551, - "w": 18, - "h": 14 - } - }, - { - "filename": "607_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 13, - "h": 18 - }, - "frame": { - "x": 89, - "y": 554, - "w": 13, - "h": 18 - } - }, - { - "filename": "517_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 102, - "y": 565, - "w": 15, - "h": 14 - } - }, - { - "filename": "607_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 13, - "h": 18 - }, - "frame": { - "x": 88, - "y": 572, - "w": 13, - "h": 18 - } - }, - { - "filename": "559_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 88, - "y": 590, - "w": 15, - "h": 16 - } - }, - { - "filename": "559_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 89, - "y": 606, - "w": 15, - "h": 16 - } - }, - { - "filename": "559_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 103, - "y": 579, - "w": 15, - "h": 16 - } - }, - { - "filename": "517_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 104, - "y": 595, - "w": 15, - "h": 14 - } - }, - { - "filename": "577_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 104, - "y": 609, - "w": 15, - "h": 14 - } - }, - { - "filename": "577_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 100, - "y": 623, - "w": 15, - "h": 14 - } - }, - { - "filename": "577_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 106, - "y": 637, - "w": 15, - "h": 14 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:018cb8e5f06a9ed9edd0bdc8721daa73:985d20f8fcceb349f1b7fba26ba674e8:f1931bc28ee7f32dba7543723757cf2a$" - } -} +{ "frames": { + "494_2": { + "frame": { "x": 251, "y": 190, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "494_3": { + "frame": { "x": 212, "y": 186, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "495_2": { + "frame": { "x": 192, "y": 225, "w": 20, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 20, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "495_3": { + "frame": { "x": 103, "y": 224, "w": 20, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 20, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "496_2": { + "frame": { "x": 138, "y": 180, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "496_3": { + "frame": { "x": 95, "y": 183, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "497_2": { + "frame": { "x": 28, "y": 94, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "497_3": { + "frame": { "x": 242, "y": 74, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "517_2": { + "frame": { "x": 92, "y": 260, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "517_3": { + "frame": { "x": 62, "y": 260, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "518_2": { + "frame": { "x": 288, "y": 149, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "518_3": { + "frame": { "x": 0, "y": 164, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "524_2": { + "frame": { "x": 88, "y": 140, "w": 11, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 11, "w": 11, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "524_3": { + "frame": { "x": 99, "y": 118, "w": 11, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 11, "w": 11, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "525_2": { + "frame": { "x": 47, "y": 164, "w": 24, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "525_3": { + "frame": { "x": 23, "y": 164, "w": 24, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "526_2": { + "frame": { "x": 95, "y": 26, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "526_3": { + "frame": { "x": 157, "y": 26, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "529_2": { + "frame": { "x": 202, "y": 208, "w": 21, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 21, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "529_3": { + "frame": { "x": 269, "y": 209, "w": 21, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 21, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "530_2": { + "frame": { "x": 183, "y": 71, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "530_3": { + "frame": { "x": 0, "y": 51, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "531-mega_2": { + "frame": { "x": 292, "y": 97, "w": 22, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "531-mega_3": { + "frame": { "x": 270, "y": 74, "w": 22, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "531_2": { + "frame": { "x": 311, "y": 169, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "531_3": { + "frame": { "x": 263, "y": 168, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "532_2": { + "frame": { "x": 71, "y": 179, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "532_3": { + "frame": { "x": 60, "y": 75, "w": 24, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "533_2": { + "frame": { "x": 242, "y": 50, "w": 27, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 27, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "533_3": { + "frame": { "x": 269, "y": 50, "w": 27, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 27, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "534_2": { + "frame": { "x": 249, "y": 0, "w": 31, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 31, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "534_3": { + "frame": { "x": 218, "y": 0, "w": 31, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 31, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "538_2": { + "frame": { "x": 166, "y": 115, "w": 28, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "538_3": { + "frame": { "x": 0, "y": 116, "w": 28, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "539_2": { + "frame": { "x": 169, "y": 165, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "539_3": { + "frame": { "x": 208, "y": 164, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "540_2": { + "frame": { "x": 16, "y": 248, "w": 15, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 11, "w": 15, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "540_3": { + "frame": { "x": 297, "y": 245, "w": 15, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 11, "w": 15, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "541_2": { + "frame": { "x": 288, "y": 229, "w": 20, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "541_3": { + "frame": { "x": 57, "y": 230, "w": 20, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "542_2": { + "frame": { "x": 195, "y": 242, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "542_3": { + "frame": { "x": 181, "y": 242, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "543_2": { + "frame": { "x": 312, "y": 249, "w": 18, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 14, "w": 18, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "543_3": { + "frame": { "x": 241, "y": 249, "w": 18, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 14, "w": 18, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "544_2": { + "frame": { "x": 223, "y": 213, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "544_3": { + "frame": { "x": 245, "y": 213, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "545_2": { + "frame": { "x": 154, "y": 51, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "545_3": { + "frame": { "x": 115, "y": 71, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "546_2": { + "frame": { "x": 160, "y": 242, "w": 21, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "546_3": { + "frame": { "x": 139, "y": 242, "w": 21, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "547_2": { + "frame": { "x": 230, "y": 171, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "547_3": { + "frame": { "x": 285, "y": 171, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "548_1": { + "frame": { "x": 251, "y": 171, "w": 12, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "548_2": { + "frame": { "x": 340, "y": 97, "w": 12, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "548_3": { + "frame": { "x": 228, "y": 97, "w": 12, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "549_2": { + "frame": { "x": 191, "y": 165, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "549_3": { + "frame": { "x": 335, "y": 119, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "551_2": { + "frame": { "x": 324, "y": 211, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "551_3": { + "frame": { "x": 62, "y": 214, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "552_2": { + "frame": { "x": 88, "y": 158, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "552_3": { + "frame": { "x": 144, "y": 159, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "553_2": { + "frame": { "x": 324, "y": 50, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "553_3": { + "frame": { "x": 296, "y": 50, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "556_2": { + "frame": { "x": 99, "y": 135, "w": 23, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 23, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "556_3": { + "frame": { "x": 253, "y": 124, "w": 23, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 23, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "559_1": { + "frame": { "x": 166, "y": 256, "w": 15, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "559_2": { + "frame": { "x": 136, "y": 256, "w": 15, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "559_3": { + "frame": { "x": 151, "y": 256, "w": 15, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "560_1": { + "frame": { "x": 144, "y": 138, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "560_2": { + "frame": { "x": 117, "y": 183, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "560_3": { + "frame": { "x": 23, "y": 185, "w": 20, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "562_2": { + "frame": { "x": 127, "y": 220, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "562_3": { + "frame": { "x": 290, "y": 213, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "563_2": { + "frame": { "x": 218, "y": 25, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "563_3": { + "frame": { "x": 307, "y": 0, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "568_2": { + "frame": { "x": 181, "y": 205, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "568_3": { + "frame": { "x": 0, "y": 205, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "569-gigantamax_2": { + "frame": { "x": 32, "y": 0, "w": 32, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "569-gigantamax_3": { + "frame": { "x": 0, "y": 0, "w": 32, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "569_2": { + "frame": { "x": 277, "y": 28, "w": 30, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "569_3": { + "frame": { "x": 0, "y": 29, "w": 30, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "570_2": { + "frame": { "x": 209, "y": 247, "w": 16, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "570_3": { + "frame": { "x": 225, "y": 247, "w": 16, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "571_2": { + "frame": { "x": 86, "y": 51, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "571_3": { + "frame": { "x": 29, "y": 51, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "572_2": { + "frame": { "x": 43, "y": 185, "w": 22, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 22, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "572_3": { + "frame": { "x": 0, "y": 186, "w": 22, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 22, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "577_1": { + "frame": { "x": 47, "y": 260, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "577_2": { + "frame": { "x": 71, "y": 164, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "577_3": { + "frame": { "x": 77, "y": 260, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "578_1": { + "frame": { "x": 0, "y": 241, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "578_2": { + "frame": { "x": 93, "y": 241, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "578_3": { + "frame": { "x": 77, "y": 241, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "579_1": { + "frame": { "x": 0, "y": 73, "w": 30, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "579_2": { + "frame": { "x": 30, "y": 73, "w": 30, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "579_3": { + "frame": { "x": 144, "y": 73, "w": 30, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "585-autumn_1": { + "frame": { "x": 333, "y": 145, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "585-spring_1": { + "frame": { "x": 333, "y": 167, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "585-summer_1": { + "frame": { "x": 333, "y": 189, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "585-winter_1": { + "frame": { "x": 306, "y": 191, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "586-autumn_1": { + "frame": { "x": 86, "y": 73, "w": 25, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "586-spring_1": { + "frame": { "x": 51, "y": 116, "w": 23, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 23, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "586-summer_1": { + "frame": { "x": 28, "y": 116, "w": 23, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "586-winter_1": { + "frame": { "x": 267, "y": 100, "w": 23, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 23, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "592-f_1": { + "frame": { "x": 89, "y": 203, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "592-f_2": { + "frame": { "x": 43, "y": 204, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "592-f_3": { + "frame": { "x": 108, "y": 204, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "592_2": { + "frame": { "x": 137, "y": 200, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "592_3": { + "frame": { "x": 230, "y": 193, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "593-f_1": { + "frame": { "x": 56, "y": 94, "w": 27, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "593-f_2": { + "frame": { "x": 139, "y": 94, "w": 27, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "593-f_3": { + "frame": { "x": 240, "y": 96, "w": 27, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "593_2": { + "frame": { "x": 0, "y": 94, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "593_3": { + "frame": { "x": 212, "y": 75, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "594_2": { + "frame": { "x": 264, "y": 242, "w": 13, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 13, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "594_3": { + "frame": { "x": 34, "y": 243, "w": 13, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 13, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "595_2": { + "frame": { "x": 149, "y": 226, "w": 21, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "595_3": { + "frame": { "x": 267, "y": 226, "w": 21, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "596_2": { + "frame": { "x": 174, "y": 93, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "596_3": { + "frame": { "x": 111, "y": 93, "w": 28, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "602_2": { + "frame": { "x": 107, "y": 262, "w": 14, "h": 11 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 14, "h": 11 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "602_3": { + "frame": { "x": 290, "y": 262, "w": 14, "h": 11 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 14, "h": 11 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "603_2": { + "frame": { "x": 191, "y": 186, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "603_3": { + "frame": { "x": 160, "y": 187, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "604_2": { + "frame": { "x": 186, "y": 49, "w": 30, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "604_3": { + "frame": { "x": 124, "y": 49, "w": 30, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "605_1": { + "frame": { "x": 123, "y": 256, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "605_2": { + "frame": { "x": 330, "y": 249, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "605_3": { + "frame": { "x": 293, "y": 193, "w": 13, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "606_1": { + "frame": { "x": 19, "y": 226, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "606_2": { + "frame": { "x": 312, "y": 227, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "606_3": { + "frame": { "x": 327, "y": 227, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "607_2": { + "frame": { "x": 0, "y": 260, "w": 13, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 13, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "607_3": { + "frame": { "x": 277, "y": 259, "w": 13, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 13, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "608_2": { + "frame": { "x": 0, "y": 223, "w": 19, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "608_3": { + "frame": { "x": 84, "y": 223, "w": 19, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "609_2": { + "frame": { "x": 64, "y": 27, "w": 29, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 29, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "609_3": { + "frame": { "x": 186, "y": 26, "w": 29, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 29, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "610_2": { + "frame": { "x": 21, "y": 206, "w": 18, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "610_3": { + "frame": { "x": 156, "y": 206, "w": 18, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "611_2": { + "frame": { "x": 113, "y": 162, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "611_3": { + "frame": { "x": 263, "y": 147, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "612_2": { + "frame": { "x": 322, "y": 73, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "612_3": { + "frame": { "x": 296, "y": 73, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "618_2": { + "frame": { "x": 277, "y": 245, "w": 20, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 14, "w": 20, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "618_3": { + "frame": { "x": 47, "y": 246, "w": 20, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 14, "w": 20, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "619_2": { + "frame": { "x": 39, "y": 224, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "619_3": { + "frame": { "x": 174, "y": 223, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "620_2": { + "frame": { "x": 228, "y": 118, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "620_3": { + "frame": { "x": 74, "y": 118, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "622_2": { + "frame": { "x": 212, "y": 229, "w": 18, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 18, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "622_3": { + "frame": { "x": 230, "y": 229, "w": 18, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 18, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "623_2": { + "frame": { "x": 60, "y": 50, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "623_3": { + "frame": { "x": 216, "y": 50, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "631_2": { + "frame": { "x": 83, "y": 98, "w": 28, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "631_3": { + "frame": { "x": 111, "y": 115, "w": 28, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "632_2": { + "frame": { "x": 65, "y": 198, "w": 24, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "632_3": { + "frame": { "x": 269, "y": 193, "w": 24, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "633_2": { + "frame": { "x": 248, "y": 229, "w": 16, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "633_3": { + "frame": { "x": 123, "y": 236, "w": 16, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "634_2": { + "frame": { "x": 202, "y": 97, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "634_3": { + "frame": { "x": 314, "y": 97, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "635_2": { + "frame": { "x": 307, "y": 25, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "635_3": { + "frame": { "x": 248, "y": 25, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "640_2": { + "frame": { "x": 290, "y": 123, "w": 21, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "640_3": { + "frame": { "x": 314, "y": 119, "w": 21, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "641-incarnate_1": { + "frame": { "x": 188, "y": 0, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "641-therian_1": { + "frame": { "x": 127, "y": 0, "w": 30, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "642-incarnate_1": { + "frame": { "x": 64, "y": 0, "w": 31, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "642-therian_1": { + "frame": { "x": 95, "y": 0, "w": 32, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 32, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "645-incarnate_1": { + "frame": { "x": 157, "y": 0, "w": 31, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "645-therian_1": { + "frame": { "x": 280, "y": 0, "w": 27, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 27, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "647-ordinary_2": { + "frame": { "x": 194, "y": 119, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "647-ordinary_3": { + "frame": { "x": 139, "y": 116, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "647-resolute_2": { + "frame": { "x": 124, "y": 27, "w": 30, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "647-resolute_3": { + "frame": { "x": 30, "y": 29, "w": 30, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "648-aria_2": { + "frame": { "x": 109, "y": 241, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "648-aria_3": { + "frame": { "x": 276, "y": 124, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "648-pirouette_2": { + "frame": { "x": 337, "y": 23, "w": 15, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 15, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "648-pirouette_3": { + "frame": { "x": 337, "y": 0, "w": 15, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 15, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649-burn_2": { + "frame": { "x": 22, "y": 140, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649-burn_3": { + "frame": { "x": 122, "y": 138, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649-chill_2": { + "frame": { "x": 0, "y": 136, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649-chill_3": { + "frame": { "x": 164, "y": 135, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649-douse_2": { + "frame": { "x": 241, "y": 147, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649-douse_3": { + "frame": { "x": 311, "y": 145, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649-shock_2": { + "frame": { "x": 186, "y": 141, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649-shock_3": { + "frame": { "x": 219, "y": 140, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649_2": { + "frame": { "x": 66, "y": 140, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "649_3": { + "frame": { "x": 44, "y": 140, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_5v.png", + "format": "RGBA8888", + "size": { "w": 352, "h": 278 }, + "scale": "1" + } +} diff --git a/public/images/pokemon_icons_5v.png b/public/images/pokemon_icons_5v.png index 0f4099b575f..917e0621263 100644 Binary files a/public/images/pokemon_icons_5v.png and b/public/images/pokemon_icons_5v.png differ diff --git a/public/images/pokemon_icons_6.json b/public/images/pokemon_icons_6.json index ca7a24eaa40..2cd8f7340df 100644 --- a/public/images/pokemon_icons_6.json +++ b/public/images/pokemon_icons_6.json @@ -5391,6 +5391,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:eae96c5465e40fb532263c57b34ceef9:99443d59d3d788579059799020ee2aef:96737d38f2029744a75c1ee001bc1929$" + "smartupdate": "$TexturePacker:SmartUpdate:15c4f52d5b83146a8ac1e5edfe5b0a6d:c1fe6fc86a5f767302db3a47abc44b3c:96737d38f2029744a75c1ee001bc1929$" } } diff --git a/public/images/pokemon_icons_6.png b/public/images/pokemon_icons_6.png index c2ba77b593a..272018b672b 100644 Binary files a/public/images/pokemon_icons_6.png and b/public/images/pokemon_icons_6.png differ diff --git a/public/images/pokemon_icons_6v.json b/public/images/pokemon_icons_6v.json index d6c7c38304c..600624ca730 100644 --- a/public/images/pokemon_icons_6v.json +++ b/public/images/pokemon_icons_6v.json @@ -1,2099 +1,1026 @@ -{ - "textures": [ - { - "image": "pokemon_icons_6v.png", - "format": "RGBA8888", - "size": { - "w": 128, - "h": 503 - }, - "scale": 1, - "frames": [ - { - "filename": "720-unbound_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 28 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 28 - } - }, - { - "filename": "720-unbound_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 28 - }, - "frame": { - "x": 0, - "y": 28, - "w": 38, - "h": 28 - } - }, - { - "filename": "720-unbound_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 28 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 28 - } - }, - { - "filename": "716-active_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 56, - "w": 29, - "h": 30 - } - }, - { - "filename": "716-active_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 86, - "w": 29, - "h": 30 - } - }, - { - "filename": "716-neutral_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 116, - "w": 29, - "h": 30 - } - }, - { - "filename": "716-neutral_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 146, - "w": 29, - "h": 30 - } - }, - { - "filename": "717_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 30, - "h": 27 - }, - "frame": { - "x": 38, - "y": 28, - "w": 30, - "h": 27 - } - }, - { - "filename": "717_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 30, - "h": 27 - }, - "frame": { - "x": 76, - "y": 0, - "w": 30, - "h": 27 - } - }, - { - "filename": "700_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 106, - "y": 0, - "w": 22, - "h": 23 - } - }, - { - "filename": "666-archipelago_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 236, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-archipelago_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 261, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-continental_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 286, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-continental_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 311, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-elegant_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 336, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-elegant_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 361, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-fancy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 386, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-fancy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 411, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-garden_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 436, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-garden_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 0, - "y": 461, - "w": 26, - "h": 25 - } - }, - { - "filename": "696_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 17 - }, - "frame": { - "x": 0, - "y": 486, - "w": 20, - "h": 17 - } - }, - { - "filename": "700_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 106, - "y": 23, - "w": 22, - "h": 23 - } - }, - { - "filename": "697_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 76, - "y": 27, - "w": 30, - "h": 22 - } - }, - { - "filename": "696_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 17 - }, - "frame": { - "x": 20, - "y": 486, - "w": 20, - "h": 17 - } - }, - { - "filename": "666-high-plains_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 29, - "y": 56, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-high-plains_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 29, - "y": 81, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-icy-snow_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 29, - "y": 106, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-icy-snow_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 29, - "y": 131, - "w": 26, - "h": 25 - } - }, - { - "filename": "655_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 29, - "y": 156, - "w": 27, - "h": 23 - } - }, - { - "filename": "691_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 32, - "h": 23 - }, - "frame": { - "x": 26, - "y": 179, - "w": 32, - "h": 23 - } - }, - { - "filename": "691_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 32, - "h": 23 - }, - "frame": { - "x": 26, - "y": 202, - "w": 32, - "h": 23 - } - }, - { - "filename": "697_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 30, - "h": 22 - }, - "frame": { - "x": 26, - "y": 225, - "w": 30, - "h": 22 - } - }, - { - "filename": "715_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 28, - "h": 24 - }, - "frame": { - "x": 26, - "y": 247, - "w": 28, - "h": 24 - } - }, - { - "filename": "715_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 28, - "h": 24 - }, - "frame": { - "x": 26, - "y": 271, - "w": 28, - "h": 24 - } - }, - { - "filename": "666-jungle_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 26, - "y": 295, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-jungle_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 26, - "y": 320, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-marine_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 26, - "y": 345, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-marine_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 26, - "y": 370, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-meadow_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 26, - "y": 395, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-meadow_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 26, - "y": 420, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-modern_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 26, - "y": 445, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-modern_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 55, - "y": 55, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-monsoon_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 55, - "y": 80, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-monsoon_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 55, - "y": 105, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-ocean_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 55, - "y": 130, - "w": 26, - "h": 25 - } - }, - { - "filename": "713_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 27, - "h": 24 - }, - "frame": { - "x": 56, - "y": 155, - "w": 27, - "h": 24 - } - }, - { - "filename": "666-ocean_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 58, - "y": 179, - "w": 26, - "h": 25 - } - }, - { - "filename": "655_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 58, - "y": 204, - "w": 27, - "h": 23 - } - }, - { - "filename": "713_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 27, - "h": 24 - }, - "frame": { - "x": 56, - "y": 227, - "w": 27, - "h": 24 - } - }, - { - "filename": "666-poke-ball_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 54, - "y": 251, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-poke-ball_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 54, - "y": 276, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-polar_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 301, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-polar_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 326, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-river_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 351, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-river_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 376, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-sandstorm_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 401, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-sandstorm_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 426, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-savanna_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 451, - "w": 26, - "h": 25 - } - }, - { - "filename": "666-savanna_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 81, - "y": 49, - "w": 26, - "h": 25 - } - }, - { - "filename": "711_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 107, - "y": 46, - "w": 21, - "h": 23 - } - }, - { - "filename": "666-sun_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 81, - "y": 74, - "w": 26, - "h": 25 - } - }, - { - "filename": "711_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 107, - "y": 69, - "w": 21, - "h": 23 - } - }, - { - "filename": "666-sun_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 81, - "y": 99, - "w": 26, - "h": 25 - } - }, - { - "filename": "711_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 107, - "y": 92, - "w": 21, - "h": 23 - } - }, - { - "filename": "666-tundra_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 81, - "y": 124, - "w": 26, - "h": 25 - } - }, - { - "filename": "714_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 107, - "y": 115, - "w": 21, - "h": 20 - } - }, - { - "filename": "714_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 107, - "y": 135, - "w": 21, - "h": 20 - } - }, - { - "filename": "706_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 24 - }, - "frame": { - "x": 83, - "y": 149, - "w": 24, - "h": 24 - } - }, - { - "filename": "673_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 84, - "y": 173, - "w": 23, - "h": 22 - } - }, - { - "filename": "666-tundra_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 26, - "h": 25 - }, - "frame": { - "x": 85, - "y": 195, - "w": 26, - "h": 25 - } - }, - { - "filename": "653_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 17, - "h": 19 - }, - "frame": { - "x": 111, - "y": 195, - "w": 17, - "h": 19 - } - }, - { - "filename": "653_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 17, - "h": 19 - }, - "frame": { - "x": 111, - "y": 214, - "w": 17, - "h": 19 - } - }, - { - "filename": "708_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 85, - "y": 220, - "w": 25, - "h": 21 - } - }, - { - "filename": "690_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 18, - "h": 21 - }, - "frame": { - "x": 110, - "y": 233, - "w": 18, - "h": 21 - } - }, - { - "filename": "708_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 83, - "y": 241, - "w": 25, - "h": 21 - } - }, - { - "filename": "654_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 108, - "y": 254, - "w": 20, - "h": 22 - } - }, - { - "filename": "709_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 25, - "h": 25 - }, - "frame": { - "x": 80, - "y": 262, - "w": 25, - "h": 25 - } - }, - { - "filename": "673_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 105, - "y": 276, - "w": 23, - "h": 22 - } - }, - { - "filename": "709_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 25, - "h": 25 - }, - "frame": { - "x": 80, - "y": 287, - "w": 25, - "h": 25 - } - }, - { - "filename": "706_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 24 - }, - "frame": { - "x": 78, - "y": 312, - "w": 24, - "h": 24 - } - }, - { - "filename": "654_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 78, - "y": 336, - "w": 20, - "h": 22 - } - }, - { - "filename": "690_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 18, - "h": 21 - }, - "frame": { - "x": 78, - "y": 402, - "w": 18, - "h": 21 - } - }, - { - "filename": "720_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 19 - }, - "frame": { - "x": 105, - "y": 298, - "w": 21, - "h": 19 - } - }, - { - "filename": "720_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 19 - }, - "frame": { - "x": 102, - "y": 317, - "w": 21, - "h": 19 - } - }, - { - "filename": "720_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 19 - }, - "frame": { - "x": 98, - "y": 336, - "w": 21, - "h": 19 - } - }, - { - "filename": "705_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 98, - "y": 355, - "w": 15, - "h": 22 - } - }, - { - "filename": "705_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 113, - "y": 355, - "w": 15, - "h": 22 - } - }, - { - "filename": "710_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 17, - "h": 19 - }, - "frame": { - "x": 98, - "y": 377, - "w": 17, - "h": 19 - } - }, - { - "filename": "672_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 17, - "h": 18 - }, - "frame": { - "x": 78, - "y": 463, - "w": 17, - "h": 18 - } - }, - { - "filename": "704_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 14, - "w": 12, - "h": 14 - }, - "frame": { - "x": 26, - "y": 470, - "w": 12, - "h": 14 - } - }, - { - "filename": "704_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 14, - "w": 12, - "h": 14 - }, - "frame": { - "x": 115, - "y": 377, - "w": 12, - "h": 14 - } - }, - { - "filename": "664_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 96, - "y": 402, - "w": 14, - "h": 21 - } - }, - { - "filename": "664_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 97, - "y": 423, - "w": 14, - "h": 21 - } - }, - { - "filename": "710_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 17, - "h": 19 - }, - "frame": { - "x": 97, - "y": 444, - "w": 17, - "h": 19 - } - }, - { - "filename": "672_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 17, - "h": 18 - }, - "frame": { - "x": 95, - "y": 463, - "w": 17, - "h": 18 - } - }, - { - "filename": "665_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 112, - "y": 463, - "w": 16, - "h": 17 - } - }, - { - "filename": "665_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 112, - "y": 480, - "w": 16, - "h": 17 - } - }, - { - "filename": "712_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 17, - "h": 18 - }, - "frame": { - "x": 40, - "y": 476, - "w": 17, - "h": 18 - } - }, - { - "filename": "712_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 17, - "h": 18 - }, - "frame": { - "x": 57, - "y": 476, - "w": 17, - "h": 18 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ec18ec1c07f3c5e9a4d73cc7718bb008:72df57c833892d8aac4a220844408721:8a74f769af240f74b0e67390bbb36c14$" - } -} +{ "frames": { + "2670_2": { + "frame": { "x": 119, "y": 159, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2670_3": { + "frame": { "x": 175, "y": 157, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "653_2": { + "frame": { "x": 142, "y": 204, "w": 17, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 17, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "653_3": { + "frame": { "x": 304, "y": 210, "w": 17, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 17, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "654_2": { + "frame": { "x": 322, "y": 22, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "654_3": { + "frame": { "x": 322, "y": 0, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "655_2": { + "frame": { "x": 287, "y": 145, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "655_3": { + "frame": { "x": 260, "y": 145, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "664_2": { + "frame": { "x": 38, "y": 214, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "664_3": { + "frame": { "x": 159, "y": 204, "w": 14, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "665_2": { + "frame": { "x": 173, "y": 217, "w": 16, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "665_3": { + "frame": { "x": 52, "y": 218, "w": 16, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-archipelago_2": { + "frame": { "x": 78, "y": 105, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-archipelago_3": { + "frame": { "x": 130, "y": 107, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-continental_2": { + "frame": { "x": 156, "y": 107, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-continental_3": { + "frame": { "x": 182, "y": 107, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-elegant_2": { + "frame": { "x": 260, "y": 120, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-elegant_3": { + "frame": { "x": 286, "y": 120, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-fancy_2": { + "frame": { "x": 52, "y": 105, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-fancy_3": { + "frame": { "x": 208, "y": 126, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-garden_2": { + "frame": { "x": 156, "y": 82, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-garden_3": { + "frame": { "x": 234, "y": 126, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-high-plains_2": { + "frame": { "x": 0, "y": 130, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-high-plains_3": { + "frame": { "x": 26, "y": 130, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-icy-snow_2": { + "frame": { "x": 0, "y": 55, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-icy-snow_3": { + "frame": { "x": 26, "y": 55, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-jungle_2": { + "frame": { "x": 52, "y": 55, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-jungle_3": { + "frame": { "x": 78, "y": 55, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-marine_2": { + "frame": { "x": 104, "y": 57, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-marine_3": { + "frame": { "x": 130, "y": 57, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-meadow_2": { + "frame": { "x": 156, "y": 57, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-meadow_3": { + "frame": { "x": 182, "y": 57, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-modern_2": { + "frame": { "x": 268, "y": 70, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-modern_3": { + "frame": { "x": 294, "y": 70, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-monsoon_2": { + "frame": { "x": 208, "y": 76, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-monsoon_3": { + "frame": { "x": 234, "y": 76, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-ocean_2": { + "frame": { "x": 312, "y": 120, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-ocean_3": { + "frame": { "x": 0, "y": 80, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-poke-ball_2": { + "frame": { "x": 26, "y": 80, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-poke-ball_3": { + "frame": { "x": 52, "y": 80, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-polar_2": { + "frame": { "x": 78, "y": 80, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-polar_3": { + "frame": { "x": 104, "y": 82, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-river_2": { + "frame": { "x": 130, "y": 82, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-river_3": { + "frame": { "x": 104, "y": 107, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-sandstorm_2": { + "frame": { "x": 182, "y": 82, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-sandstorm_3": { + "frame": { "x": 260, "y": 95, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-savanna_2": { + "frame": { "x": 286, "y": 95, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-savanna_3": { + "frame": { "x": 312, "y": 95, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-sun_2": { + "frame": { "x": 208, "y": 101, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-sun_3": { + "frame": { "x": 234, "y": 101, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-tundra_2": { + "frame": { "x": 0, "y": 105, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "666-tundra_3": { + "frame": { "x": 26, "y": 105, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-blue_2": { + "frame": { "x": 0, "y": 220, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-blue_3": { + "frame": { "x": 142, "y": 223, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-orange_2": { + "frame": { "x": 83, "y": 223, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-orange_3": { + "frame": { "x": 113, "y": 224, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-red_2": { + "frame": { "x": 157, "y": 225, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-red_3": { + "frame": { "x": 229, "y": 229, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-white_2": { + "frame": { "x": 296, "y": 229, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-white_3": { + "frame": { "x": 189, "y": 218, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-yellow_2": { + "frame": { "x": 98, "y": 219, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "669-yellow_3": { + "frame": { "x": 68, "y": 223, "w": 15, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-blue_2": { + "frame": { "x": 175, "y": 178, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-blue_3": { + "frame": { "x": 138, "y": 180, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-orage_2": { + "frame": { "x": 86, "y": 182, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-orage_3": { + "frame": { "x": 268, "y": 190, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-red_2": { + "frame": { "x": 67, "y": 179, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-red_3": { + "frame": { "x": 119, "y": 180, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-white_2": { + "frame": { "x": 249, "y": 190, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-white_3": { + "frame": { "x": 198, "y": 175, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-yellow_2": { + "frame": { "x": 0, "y": 177, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "670-yellow_3": { + "frame": { "x": 19, "y": 177, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-blue_2": { + "frame": { "x": 230, "y": 27, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-blue_3": { + "frame": { "x": 182, "y": 30, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-orange_2": { + "frame": { "x": 156, "y": 30, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-orange_3": { + "frame": { "x": 256, "y": 27, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-red_2": { + "frame": { "x": 0, "y": 28, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-red_3": { + "frame": { "x": 26, "y": 28, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-white_2": { + "frame": { "x": 52, "y": 28, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-white_3": { + "frame": { "x": 130, "y": 30, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-yellow_2": { + "frame": { "x": 78, "y": 28, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "671-yellow_3": { + "frame": { "x": 104, "y": 30, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "672_2": { + "frame": { "x": 263, "y": 212, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "672_3": { + "frame": { "x": 321, "y": 213, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "673_2": { + "frame": { "x": 23, "y": 155, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "673_3": { + "frame": { "x": 0, "y": 155, "w": 23, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "677_2": { + "frame": { "x": 280, "y": 215, "w": 16, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "677_3": { + "frame": { "x": 18, "y": 216, "w": 16, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "678-female_2": { + "frame": { "x": 316, "y": 169, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "678-female_3": { + "frame": { "x": 253, "y": 168, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "678_2": { + "frame": { "x": 295, "y": 169, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "678_3": { + "frame": { "x": 274, "y": 168, "w": 21, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "690_2": { + "frame": { "x": 194, "y": 197, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "690_3": { + "frame": { "x": 0, "y": 199, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "691_2": { + "frame": { "x": 290, "y": 0, "w": 32, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 32, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "691_3": { + "frame": { "x": 290, "y": 23, "w": 32, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 32, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "696_2": { + "frame": { "x": 174, "y": 200, "w": 20, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "696_3": { + "frame": { "x": 18, "y": 199, "w": 20, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "697_2": { + "frame": { "x": 208, "y": 54, "w": 30, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "697_3": { + "frame": { "x": 238, "y": 54, "w": 30, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "698_2": { + "frame": { "x": 157, "y": 180, "w": 17, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "698_3": { + "frame": { "x": 287, "y": 191, "w": 17, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "699_2": { + "frame": { "x": 130, "y": 132, "w": 24, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 24, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "699_3": { + "frame": { "x": 106, "y": 132, "w": 24, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 24, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "700_2": { + "frame": { "x": 320, "y": 70, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "700_3": { + "frame": { "x": 208, "y": 30, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "702_2": { + "frame": { "x": 105, "y": 202, "w": 22, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 22, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "702_3": { + "frame": { "x": 59, "y": 201, "w": 22, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 22, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "703_2": { + "frame": { "x": 105, "y": 182, "w": 14, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 15, "w": 14, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "703_3": { + "frame": { "x": 268, "y": 54, "w": 14, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 15, "w": 14, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "704_2": { + "frame": { "x": 142, "y": 159, "w": 12, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 12, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "704_3": { + "frame": { "x": 128, "y": 224, "w": 12, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 12, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "705_2": { + "frame": { "x": 325, "y": 191, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "705_3": { + "frame": { "x": 127, "y": 202, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "706_2": { + "frame": { "x": 204, "y": 151, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "706_3": { + "frame": { "x": 314, "y": 145, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "708_2": { + "frame": { "x": 228, "y": 151, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "708_3": { + "frame": { "x": 52, "y": 154, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "709_2": { + "frame": { "x": 154, "y": 132, "w": 25, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 25, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "709_3": { + "frame": { "x": 179, "y": 132, "w": 25, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 25, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "710_2": { + "frame": { "x": 81, "y": 204, "w": 17, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 17, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "710_3": { + "frame": { "x": 212, "y": 211, "w": 17, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 9, "w": 17, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "711_1": { + "frame": { "x": 77, "y": 156, "w": 21, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "711_2": { + "frame": { "x": 154, "y": 157, "w": 21, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "711_3": { + "frame": { "x": 98, "y": 159, "w": 21, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "712_2": { + "frame": { "x": 229, "y": 211, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "712_3": { + "frame": { "x": 246, "y": 212, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "713_2": { + "frame": { "x": 52, "y": 130, "w": 27, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 27, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "713_3": { + "frame": { "x": 79, "y": 132, "w": 27, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 27, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "714_2": { + "frame": { "x": 46, "y": 175, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "714_3": { + "frame": { "x": 228, "y": 172, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "715_2": { + "frame": { "x": 310, "y": 46, "w": 28, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 28, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "715_3": { + "frame": { "x": 282, "y": 46, "w": 28, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 28, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "716-active_2": { + "frame": { "x": 114, "y": 0, "w": 29, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "716-active_3": { + "frame": { "x": 143, "y": 0, "w": 29, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "716-neutral_2": { + "frame": { "x": 172, "y": 0, "w": 29, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "716-neutral_3": { + "frame": { "x": 201, "y": 0, "w": 29, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "717_2": { + "frame": { "x": 230, "y": 0, "w": 30, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 30, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "717_3": { + "frame": { "x": 260, "y": 0, "w": 30, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 30, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "720-unbound_1": { + "frame": { "x": 38, "y": 0, "w": 38, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "720-unbound_2": { + "frame": { "x": 76, "y": 0, "w": 38, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "720-unbound_3": { + "frame": { "x": 0, "y": 0, "w": 38, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "720_1": { + "frame": { "x": 217, "y": 192, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "720_2": { + "frame": { "x": 38, "y": 195, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "720_3": { + "frame": { "x": 304, "y": 191, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_6v.png", + "format": "RGBA8888", + "size": { "w": 342, "h": 247 }, + "scale": "1" + } +} diff --git a/public/images/pokemon_icons_6v.png b/public/images/pokemon_icons_6v.png index 8b0ecd85af5..83e29e28738 100644 Binary files a/public/images/pokemon_icons_6v.png and b/public/images/pokemon_icons_6v.png differ diff --git a/public/images/pokemon_icons_7v.json b/public/images/pokemon_icons_7v.json index ceb7a0b991f..a7f828a0fe1 100644 --- a/public/images/pokemon_icons_7v.json +++ b/public/images/pokemon_icons_7v.json @@ -1,2687 +1,956 @@ -{ - "textures": [ - { - "image": "pokemon_icons_7v.png", - "format": "RGBA8888", - "size": { - "w": 126, - "h": 614 - }, - "scale": 1, - "frames": [ - { - "filename": "809_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 28 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 28 - } - }, - { - "filename": "809_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 28 - }, - "frame": { - "x": 0, - "y": 28, - "w": 40, - "h": 28 - } - }, - { - "filename": "800-dusk-mane_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 34, - "h": 30 - }, - "frame": { - "x": 40, - "y": 0, - "w": 34, - "h": 30 - } - }, - { - "filename": "800-dusk-mane_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 34, - "h": 30 - }, - "frame": { - "x": 0, - "y": 56, - "w": 34, - "h": 30 - } - }, - { - "filename": "800-ultra_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 35, - "h": 28 - }, - "frame": { - "x": 74, - "y": 0, - "w": 35, - "h": 28 - } - }, - { - "filename": "797_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 86, - "w": 32, - "h": 30 - } - }, - { - "filename": "797_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 116, - "w": 32, - "h": 30 - } - }, - { - "filename": "778-disguised_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 113, - "y": 72, - "w": 17, - "h": 22 - } - }, - { - "filename": "800-dawn-wings_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 146, - "w": 31, - "h": 30 - } - }, - { - "filename": "800-dawn-wings_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 176, - "w": 31, - "h": 30 - } - }, - { - "filename": "798_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 31, - "h": 29 - }, - "frame": { - "x": 0, - "y": 206, - "w": 31, - "h": 29 - } - }, - { - "filename": "798_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 31, - "h": 29 - }, - "frame": { - "x": 0, - "y": 235, - "w": 31, - "h": 29 - } - }, - { - "filename": "800-ultra_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 35, - "h": 28 - }, - "frame": { - "x": 40, - "y": 30, - "w": 35, - "h": 28 - } - }, - { - "filename": "800_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 264, - "w": 28, - "h": 30 - } - }, - { - "filename": "800_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 294, - "w": 28, - "h": 30 - } - }, - { - "filename": "773-bug_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-bug_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 354, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dark_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 384, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dark_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 414, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dragon_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 444, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dragon_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 474, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-electric_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 504, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-electric_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 534, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fairy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 564, - "w": 26, - "h": 30 - } - }, - { - "filename": "789_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 0, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "809-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 28 - }, - "frame": { - "x": 75, - "y": 28, - "w": 30, - "h": 28 - } - }, - { - "filename": "763_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 109, - "y": 0, - "w": 21, - "h": 24 - } - }, - { - "filename": "809-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 28 - }, - "frame": { - "x": 34, - "y": 58, - "w": 30, - "h": 28 - } - }, - { - "filename": "791_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 86, - "w": 29, - "h": 28 - } - }, - { - "filename": "791_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 114, - "w": 29, - "h": 28 - } - }, - { - "filename": "763_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 109, - "y": 24, - "w": 21, - "h": 24 - } - }, - { - "filename": "789_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 23, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "772_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 64, - "y": 58, - "w": 25, - "h": 28 - } - }, - { - "filename": "773-fairy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 61, - "y": 86, - "w": 26, - "h": 30 - } - }, - { - "filename": "730_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 - }, - "frame": { - "x": 61, - "y": 116, - "w": 28, - "h": 27 - } - }, - { - "filename": "761_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 98, - "y": 516, - "w": 16, - "h": 19 - } - }, - { - "filename": "773-fighting_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 87, - "y": 86, - "w": 26, - "h": 30 - } - }, - { - "filename": "730_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 - }, - "frame": { - "x": 89, - "y": 116, - "w": 28, - "h": 27 - } - }, - { - "filename": "755_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 4, - "w": 13, - "h": 24 - }, - "frame": { - "x": 117, - "y": 117, - "w": 13, - "h": 24 - } - }, - { - "filename": "791_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 142, - "w": 29, - "h": 28 - } - }, - { - "filename": "773-fighting_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 170, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fire_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 200, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fire_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 230, - "w": 26, - "h": 30 - } - }, - { - "filename": "792_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 61, - "y": 143, - "w": 28, - "h": 28 - } - }, - { - "filename": "792_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 89, - "y": 143, - "w": 28, - "h": 28 - } - }, - { - "filename": "773-flying_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 171, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-flying_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 201, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ghost_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 171, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ghost_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 201, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-grass_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 231, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-grass_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 231, - "w": 26, - "h": 30 - } - }, - { - "filename": "778-disguised_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 96, - "y": 445, - "w": 17, - "h": 22 - } - }, - { - "filename": "728_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 113, - "y": 448, - "w": 17, - "h": 20 - } - }, - { - "filename": "728_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 113, - "y": 94, - "w": 17, - "h": 20 - } - }, - { - "filename": "808_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 114, - "y": 468, - "w": 17, - "h": 17 - } - }, - { - "filename": "808_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 113, - "y": 235, - "w": 17, - "h": 17 - } - }, - { - "filename": "773-ground_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 264, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ground_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 294, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ice_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ice_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 354, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-poison_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 384, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-poison_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 414, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-psychic_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 444, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-psychic_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 474, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-rock_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 504, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-rock_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 534, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-steel_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 564, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-steel_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 54, - "y": 261, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-water_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 54, - "y": 291, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-water_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 80, - "y": 261, - "w": 26, - "h": 30 - } - }, - { - "filename": "735_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 109, - "y": 171, - "w": 20, - "h": 24 - } - }, - { - "filename": "773_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 80, - "y": 291, - "w": 26, - "h": 30 - } - }, - { - "filename": "735_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 109, - "y": 195, - "w": 20, - "h": 24 - } - }, - { - "filename": "789_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 46, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "754_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 106, - "y": 318, - "w": 20, - "h": 22 - } - }, - { - "filename": "773_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 52, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "772_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 52, - "y": 354, - "w": 25, - "h": 28 - } - }, - { - "filename": "748_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 382, - "w": 26, - "h": 25 - } - }, - { - "filename": "748_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 407, - "w": 26, - "h": 25 - } - }, - { - "filename": "776_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 52, - "y": 432, - "w": 23, - "h": 26 - } - }, - { - "filename": "776_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 101, - "y": 382, - "w": 23, - "h": 26 - } - }, - { - "filename": "729_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 52, - "y": 484, - "w": 23, - "h": 24 - } - }, - { - "filename": "729_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 52, - "y": 508, - "w": 23, - "h": 24 - } - }, - { - "filename": "756_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 52, - "y": 532, - "w": 22, - "h": 24 - } - }, - { - "filename": "756_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 52, - "y": 556, - "w": 22, - "h": 24 - } - }, - { - "filename": "767_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 52, - "y": 580, - "w": 24, - "h": 14 - } - }, - { - "filename": "747_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 69, - "y": 594, - "w": 22, - "h": 20 - } - }, - { - "filename": "768_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 78, - "y": 321, - "w": 24, - "h": 23 - } - }, - { - "filename": "768_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 106, - "y": 295, - "w": 24, - "h": 23 - } - }, - { - "filename": "2053_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 78, - "y": 344, - "w": 24, - "h": 22 - } - }, - { - "filename": "2053_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 102, - "y": 360, - "w": 24, - "h": 22 - } - }, - { - "filename": "734_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 77, - "y": 366, - "w": 25, - "h": 16 - } - }, - { - "filename": "802_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 78, - "y": 382, - "w": 22, - "h": 24 - } - }, - { - "filename": "802_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 78, - "y": 406, - "w": 22, - "h": 24 - } - }, - { - "filename": "802_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 52, - "y": 458, - "w": 22, - "h": 24 - } - }, - { - "filename": "793_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 109, - "y": 48, - "w": 21, - "h": 24 - } - }, - { - "filename": "734_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 78, - "y": 430, - "w": 25, - "h": 16 - } - }, - { - "filename": "752_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 104, - "y": 408, - "w": 23, - "h": 18 - } - }, - { - "filename": "793_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 75, - "y": 446, - "w": 21, - "h": 24 - } - }, - { - "filename": "754_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 74, - "y": 470, - "w": 20, - "h": 22 - } - }, - { - "filename": "762_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 75, - "y": 492, - "w": 18, - "h": 23 - } - }, - { - "filename": "747_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 109, - "y": 426, - "w": 22, - "h": 20 - } - }, - { - "filename": "752_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 75, - "y": 515, - "w": 23, - "h": 18 - } - }, - { - "filename": "2052_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 74, - "y": 533, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 74, - "y": 554, - "w": 21, - "h": 21 - } - }, - { - "filename": "790_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 76, - "y": 575, - "w": 21, - "h": 19 - } - }, - { - "filename": "751_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 102, - "y": 340, - "w": 14, - "h": 20 - } - }, - { - "filename": "790_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 91, - "y": 594, - "w": 21, - "h": 19 - } - }, - { - "filename": "762_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 93, - "y": 492, - "w": 18, - "h": 23 - } - }, - { - "filename": "755_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 4, - "w": 13, - "h": 24 - }, - "frame": { - "x": 117, - "y": 141, - "w": 13, - "h": 24 - } - }, - { - "filename": "751_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 116, - "y": 340, - "w": 14, - "h": 20 - } - }, - { - "filename": "753_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 116, - "y": 537, - "w": 14, - "h": 19 - } - }, - { - "filename": "753_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 116, - "y": 556, - "w": 14, - "h": 19 - } - }, - { - "filename": "761_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 96, - "y": 575, - "w": 16, - "h": 19 - } - }, - { - "filename": "767_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 106, - "y": 265, - "w": 24, - "h": 14 - } - }, - { - "filename": "742_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 19, - "h": 20 - }, - "frame": { - "x": 112, - "y": 575, - "w": 19, - "h": 20 - } - }, - { - "filename": "742_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 19, - "h": 20 - }, - "frame": { - "x": 112, - "y": 594, - "w": 19, - "h": 20 - } - }, - { - "filename": "743_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 94, - "y": 470, - "w": 20, - "h": 22 - } - }, - { - "filename": "743_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 89, - "y": 56, - "w": 20, - "h": 22 - } - }, - { - "filename": "777_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 114, - "y": 518, - "w": 17, - "h": 19 - } - }, - { - "filename": "777_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 114, - "y": 486, - "w": 17, - "h": 19 - } - }, - { - "filename": "778-busted_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 109, - "y": 219, - "w": 21, - "h": 16 - } - }, - { - "filename": "778-busted_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 106, - "y": 279, - "w": 21, - "h": 16 - } - }, - { - "filename": "779_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 95, - "y": 535, - "w": 21, - "h": 20 - } - }, - { - "filename": "779_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 95, - "y": 555, - "w": 21, - "h": 20 - } - }, - { - "filename": "771_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 112, - "y": 505, - "w": 18, - "h": 13 - } - }, - { - "filename": "771_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 109, - "y": 252, - "w": 18, - "h": 13 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4de745903870d93aebe9c754281ab9a1:4247d298b98d033d5b01c30d46133c87:d5975df27e1e94206a68aa1fd3c2c8d0$" - } +{ "frames": { + "2027_2": { + "frame": { "x": 160, "y": 218, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2027_3": { + "frame": { "x": 91, "y": 218, "w": 21, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2028_2": { + "frame": { "x": 26, "y": 148, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2028_3": { + "frame": { "x": 104, "y": 148, "w": 25, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2052_2": { + "frame": { "x": 144, "y": 195, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2052_3": { + "frame": { "x": 331, "y": 195, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2053_2": { + "frame": { "x": 121, "y": 172, "w": 24, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 24, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "2053_3": { + "frame": { "x": 312, "y": 172, "w": 24, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 24, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "728_2": { + "frame": { "x": 62, "y": 219, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "728_3": { + "frame": { "x": 45, "y": 219, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "729_2": { + "frame": { "x": 158, "y": 171, "w": 23, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 23, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "729_3": { + "frame": { "x": 98, "y": 172, "w": 23, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 23, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "730_2": { + "frame": { "x": 130, "y": 145, "w": 28, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 28, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "730_3": { + "frame": { "x": 234, "y": 147, "w": 28, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 28, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "734_2": { + "frame": { "x": 306, "y": 214, "w": 25, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 25, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "734_3": { + "frame": { "x": 20, "y": 215, "w": 25, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 25, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "735_2": { + "frame": { "x": 268, "y": 175, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "735_3": { + "frame": { "x": 288, "y": 175, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "742_2": { + "frame": { "x": 187, "y": 217, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "742_3": { + "frame": { "x": 283, "y": 217, "w": 19, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 19, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "743_2": { + "frame": { "x": 0, "y": 197, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "743_3": { + "frame": { "x": 96, "y": 196, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "747_2": { + "frame": { "x": 165, "y": 198, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "747_3": { + "frame": { "x": 202, "y": 197, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "748_2": { + "frame": { "x": 0, "y": 148, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "748_3": { + "frame": { "x": 312, "y": 147, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "751_2": { + "frame": { "x": 104, "y": 60, "w": 14, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 14, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "751_3": { + "frame": { "x": 130, "y": 88, "w": 14, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 14, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "752_2": { + "frame": { "x": 283, "y": 199, "w": 23, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 23, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "752_3": { + "frame": { "x": 116, "y": 214, "w": 23, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 23, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "753_2": { + "frame": { "x": 187, "y": 198, "w": 14, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 14, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "753_3": { + "frame": { "x": 234, "y": 118, "w": 14, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 14, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "754_2": { + "frame": { "x": 71, "y": 197, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "754_3": { + "frame": { "x": 224, "y": 198, "w": 20, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "755_2": { + "frame": { "x": 346, "y": 52, "w": 13, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 4, "w": 13, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "755_3": { + "frame": { "x": 268, "y": 30, "w": 13, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 4, "w": 13, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "756_2": { + "frame": { "x": 338, "y": 171, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "756_3": { + "frame": { "x": 0, "y": 173, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "761_2": { + "frame": { "x": 323, "y": 235, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "761_3": { + "frame": { "x": 129, "y": 235, "w": 16, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "762_2": { + "frame": { "x": 342, "y": 29, "w": 18, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 18, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "762_3": { + "frame": { "x": 265, "y": 199, "w": 18, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 18, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "763_2": { + "frame": { "x": 50, "y": 175, "w": 21, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 21, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "763_3": { + "frame": { "x": 181, "y": 174, "w": 21, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 21, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "767_2": { + "frame": { "x": 223, "y": 220, "w": 24, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 24, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "767_3": { + "frame": { "x": 17, "y": 231, "w": 24, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 11, "w": 24, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "768_2": { + "frame": { "x": 26, "y": 172, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "768_3": { + "frame": { "x": 74, "y": 150, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "771_2": { + "frame": { "x": 163, "y": 236, "w": 18, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 11, "w": 18, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "771_3": { + "frame": { "x": 145, "y": 236, "w": 18, "h": 13 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 11, "w": 18, "h": 13 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "772_2": { + "frame": { "x": 262, "y": 147, "w": 25, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "772_3": { + "frame": { "x": 287, "y": 147, "w": 25, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-bug_2": { + "frame": { "x": 0, "y": 118, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-bug_3": { + "frame": { "x": 26, "y": 118, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-dark_2": { + "frame": { "x": 104, "y": 118, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-dark_3": { + "frame": { "x": 182, "y": 118, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-dragon_2": { + "frame": { "x": 208, "y": 118, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-dragon_3": { + "frame": { "x": 52, "y": 120, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-electric_2": { + "frame": { "x": 78, "y": 120, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-electric_3": { + "frame": { "x": 268, "y": 57, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-fairy_2": { + "frame": { "x": 294, "y": 57, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-fairy_3": { + "frame": { "x": 320, "y": 57, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-fighting_2": { + "frame": { "x": 0, "y": 58, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-fighting_3": { + "frame": { "x": 26, "y": 58, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-fire_2": { + "frame": { "x": 118, "y": 58, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-fire_3": { + "frame": { "x": 203, "y": 58, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-flying_2": { + "frame": { "x": 229, "y": 58, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-flying_3": { + "frame": { "x": 326, "y": 117, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-ghost_2": { + "frame": { "x": 78, "y": 60, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-ghost_3": { + "frame": { "x": 144, "y": 85, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-grass_2": { + "frame": { "x": 170, "y": 85, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-grass_3": { + "frame": { "x": 255, "y": 87, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-ground_2": { + "frame": { "x": 281, "y": 87, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-ground_3": { + "frame": { "x": 307, "y": 87, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-ice_2": { + "frame": { "x": 333, "y": 87, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-ice_3": { + "frame": { "x": 0, "y": 88, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-poison_2": { + "frame": { "x": 26, "y": 88, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-poison_3": { + "frame": { "x": 104, "y": 88, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-psychic_2": { + "frame": { "x": 196, "y": 88, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-psychic_3": { + "frame": { "x": 222, "y": 88, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-rock_2": { + "frame": { "x": 52, "y": 90, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-rock_3": { + "frame": { "x": 78, "y": 90, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-steel_2": { + "frame": { "x": 130, "y": 115, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-steel_3": { + "frame": { "x": 52, "y": 60, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-water_2": { + "frame": { "x": 156, "y": 115, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773-water_3": { + "frame": { "x": 248, "y": 117, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773_2": { + "frame": { "x": 274, "y": 117, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "773_3": { + "frame": { "x": 300, "y": 117, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "776_2": { + "frame": { "x": 181, "y": 148, "w": 23, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "776_3": { + "frame": { "x": 158, "y": 145, "w": 23, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "777_2": { + "frame": { "x": 223, "y": 234, "w": 17, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "777_3": { + "frame": { "x": 112, "y": 232, "w": 17, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "778-busted_2": { + "frame": { "x": 302, "y": 230, "w": 21, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "778-busted_3": { + "frame": { "x": 247, "y": 222, "w": 21, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "778-disguised_2": { + "frame": { "x": 206, "y": 217, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "778-disguised_3": { + "frame": { "x": 0, "y": 219, "w": 17, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 17, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "779_2": { + "frame": { "x": 244, "y": 199, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "779_3": { + "frame": { "x": 45, "y": 199, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "789_1": { + "frame": { "x": 308, "y": 194, "w": 23, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "789_2": { + "frame": { "x": 22, "y": 195, "w": 23, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "789_3": { + "frame": { "x": 121, "y": 194, "w": 23, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "790_2": { + "frame": { "x": 331, "y": 216, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "790_3": { + "frame": { "x": 139, "y": 216, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "791_1": { + "frame": { "x": 239, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "791_2": { + "frame": { "x": 210, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "791_3": { + "frame": { "x": 118, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "792_2": { + "frame": { "x": 175, "y": 57, "w": 28, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 28, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "792_3": { + "frame": { "x": 147, "y": 57, "w": 28, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 28, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "793_2": { + "frame": { "x": 247, "y": 175, "w": 21, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "793_3": { + "frame": { "x": 226, "y": 174, "w": 21, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "797_2": { + "frame": { "x": 250, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "797_3": { + "frame": { "x": 218, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "798_2": { + "frame": { "x": 179, "y": 28, "w": 31, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "798_3": { + "frame": { "x": 148, "y": 28, "w": 31, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "800-dawn-wings_2": { + "frame": { "x": 31, "y": 28, "w": 31, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "800-dawn-wings_3": { + "frame": { "x": 0, "y": 28, "w": 31, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "800-dusk-mane_2": { + "frame": { "x": 114, "y": 0, "w": 34, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 34, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "800-dusk-mane_3": { + "frame": { "x": 80, "y": 0, "w": 34, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 34, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "800-ultra_2": { + "frame": { "x": 183, "y": 0, "w": 35, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "800-ultra_3": { + "frame": { "x": 148, "y": 0, "w": 35, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "800_2": { + "frame": { "x": 90, "y": 30, "w": 28, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 28, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "800_3": { + "frame": { "x": 62, "y": 30, "w": 28, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 28, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "802_1": { + "frame": { "x": 74, "y": 173, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "802_2": { + "frame": { "x": 204, "y": 173, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "802_3": { + "frame": { "x": 338, "y": 147, "w": 22, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "803_2": { + "frame": { "x": 51, "y": 150, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "803_3": { + "frame": { "x": 204, "y": 148, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "804_2": { + "frame": { "x": 315, "y": 0, "w": 33, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 33, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "804_3": { + "frame": { "x": 282, "y": 0, "w": 33, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 33, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "808_2": { + "frame": { "x": 339, "y": 235, "w": 17, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "808_3": { + "frame": { "x": 79, "y": 236, "w": 17, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "809-gigantamax_2": { + "frame": { "x": 312, "y": 29, "w": 30, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "809-gigantamax_3": { + "frame": { "x": 282, "y": 29, "w": 30, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "809_2": { + "frame": { "x": 40, "y": 0, "w": 40, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 40, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "809_3": { + "frame": { "x": 0, "y": 0, "w": 40, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 40, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_6v.png", + "format": "RGBA8888", + "size": { "w": 360, "h": 254 }, + "scale": "1" + } } diff --git a/public/images/pokemon_icons_7v.png b/public/images/pokemon_icons_7v.png index 822f7950f3e..50fee6de396 100644 Binary files a/public/images/pokemon_icons_7v.png and b/public/images/pokemon_icons_7v.png differ diff --git a/public/images/pokemon_icons_8v.json b/public/images/pokemon_icons_8v.json index 38419d46699..002957bba0c 100644 --- a/public/images/pokemon_icons_8v.json +++ b/public/images/pokemon_icons_8v.json @@ -1,3359 +1,1306 @@ -{ - "textures": [ - { - "image": "pokemon_icons_8v.png", - "format": "RGBA8888", - "size": { - "w": 127, - "h": 711 - }, - "scale": 1, - "frames": [ - { - "filename": "890-eternamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 30 - } - }, - { - "filename": "890-eternamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 30 - }, - "frame": { - "x": 0, - "y": 30, - "w": 38, - "h": 30 - } - }, - { - "filename": "851_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 30 - }, - "frame": { - "x": 38, - "y": 0, - "w": 37, - "h": 30 - } - }, - { - "filename": "851_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 30 - }, - "frame": { - "x": 0, - "y": 60, - "w": 37, - "h": 30 - } - }, - { - "filename": "890_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 33, - "h": 28 - }, - "frame": { - "x": 38, - "y": 30, - "w": 33, - "h": 28 - } - }, - { - "filename": "890_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 33, - "h": 28 - }, - "frame": { - "x": 75, - "y": 0, - "w": 33, - "h": 28 - } - }, - { - "filename": "876_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 24 - }, - "frame": { - "x": 108, - "y": 0, - "w": 19, - "h": 24 - } - }, - { - "filename": "818-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 30 - }, - "frame": { - "x": 0, - "y": 90, - "w": 30, - "h": 30 - } - }, - { - "filename": "818-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 30 - }, - "frame": { - "x": 0, - "y": 120, - "w": 30, - "h": 30 - } - }, - { - "filename": "858-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 150, - "w": 29, - "h": 30 - } - }, - { - "filename": "858-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 180, - "w": 29, - "h": 30 - } - }, - { - "filename": "884-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 27, - "h": 30 - }, - "frame": { - "x": 0, - "y": 210, - "w": 27, - "h": 30 - } - }, - { - "filename": "884-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 27, - "h": 30 - }, - "frame": { - "x": 0, - "y": 240, - "w": 27, - "h": 30 - } - }, - { - "filename": "861-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 270, - "w": 26, - "h": 30 - } - }, - { - "filename": "861-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 300, - "w": 26, - "h": 30 - } - }, - { - "filename": "898-shadow_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 330, - "w": 26, - "h": 30 - } - }, - { - "filename": "898-shadow_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 360, - "w": 26, - "h": 30 - } - }, - { - "filename": "898-shadow_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 390, - "w": 26, - "h": 30 - } - }, - { - "filename": "823-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 27 - }, - "frame": { - "x": 0, - "y": 420, - "w": 32, - "h": 27 - } - }, - { - "filename": "823-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 27 - }, - "frame": { - "x": 0, - "y": 447, - "w": 32, - "h": 27 - } - }, - { - "filename": "864_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 30, - "h": 27 - }, - "frame": { - "x": 0, - "y": 474, - "w": 30, - "h": 27 - } - }, - { - "filename": "864_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 30, - "h": 27 - }, - "frame": { - "x": 0, - "y": 501, - "w": 30, - "h": 27 - } - }, - { - "filename": "887_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 30, - "h": 26 - }, - "frame": { - "x": 0, - "y": 528, - "w": 30, - "h": 26 - } - }, - { - "filename": "887_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 30, - "h": 26 - }, - "frame": { - "x": 0, - "y": 554, - "w": 30, - "h": 26 - } - }, - { - "filename": "887_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 30, - "h": 26 - }, - "frame": { - "x": 0, - "y": 580, - "w": 30, - "h": 26 - } - }, - { - "filename": "898-ice_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 24, - "h": 29 - }, - "frame": { - "x": 0, - "y": 606, - "w": 24, - "h": 29 - } - }, - { - "filename": "898-ice_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 24, - "h": 29 - }, - "frame": { - "x": 0, - "y": 635, - "w": 24, - "h": 29 - } - }, - { - "filename": "898-ice_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 24, - "h": 29 - }, - "frame": { - "x": 0, - "y": 664, - "w": 24, - "h": 29 - } - }, - { - "filename": "4146_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 18 - }, - "frame": { - "x": 0, - "y": 693, - "w": 28, - "h": 18 - } - }, - { - "filename": "876_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 24 - }, - "frame": { - "x": 108, - "y": 24, - "w": 19, - "h": 24 - } - }, - { - "filename": "892-gigantamax-single_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 23, - "h": 29 - }, - "frame": { - "x": 30, - "y": 90, - "w": 23, - "h": 29 - } - }, - { - "filename": "892-gigantamax-single_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 23, - "h": 29 - }, - "frame": { - "x": 30, - "y": 119, - "w": 23, - "h": 29 - } - }, - { - "filename": "892-gigantamax-single_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 23, - "h": 29 - }, - "frame": { - "x": 24, - "y": 606, - "w": 23, - "h": 29 - } - }, - { - "filename": "818_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 22, - "h": 27 - }, - "frame": { - "x": 24, - "y": 635, - "w": 22, - "h": 27 - } - }, - { - "filename": "818_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 22, - "h": 27 - }, - "frame": { - "x": 24, - "y": 662, - "w": 22, - "h": 27 - } - }, - { - "filename": "892-rapid-strike_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 22 - }, - "frame": { - "x": 28, - "y": 689, - "w": 26, - "h": 22 - } - }, - { - "filename": "903_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 21, - "h": 27 - }, - "frame": { - "x": 71, - "y": 30, - "w": 21, - "h": 27 - } - }, - { - "filename": "6549_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 92, - "y": 28, - "w": 16, - "h": 23 - } - }, - { - "filename": "830_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 23 - }, - "frame": { - "x": 108, - "y": 48, - "w": 19, - "h": 23 - } - }, - { - "filename": "6549_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 92, - "y": 51, - "w": 16, - "h": 23 - } - }, - { - "filename": "830_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 23 - }, - "frame": { - "x": 108, - "y": 71, - "w": 19, - "h": 23 - } - }, - { - "filename": "903_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 21, - "h": 27 - }, - "frame": { - "x": 71, - "y": 57, - "w": 21, - "h": 27 - } - }, - { - "filename": "6101_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 92, - "y": 74, - "w": 16, - "h": 16 - } - }, - { - "filename": "891_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 18, - "h": 22 - }, - "frame": { - "x": 53, - "y": 58, - "w": 18, - "h": 22 - } - }, - { - "filename": "6705_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 38, - "y": 58, - "w": 15, - "h": 22 - } - }, - { - "filename": "850_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 10 - }, - "frame": { - "x": 37, - "y": 80, - "w": 21, - "h": 10 - } - }, - { - "filename": "4199_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 20, - "h": 27 - }, - "frame": { - "x": 53, - "y": 90, - "w": 20, - "h": 27 - } - }, - { - "filename": "861_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 53, - "y": 117, - "w": 25, - "h": 26 - } - }, - { - "filename": "856_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 23 - }, - "frame": { - "x": 73, - "y": 84, - "w": 19, - "h": 23 - } - }, - { - "filename": "6101_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 92, - "y": 90, - "w": 16, - "h": 16 - } - }, - { - "filename": "856_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 23 - }, - "frame": { - "x": 108, - "y": 94, - "w": 19, - "h": 23 - } - }, - { - "filename": "850_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 10 - }, - "frame": { - "x": 73, - "y": 107, - "w": 21, - "h": 10 - } - }, - { - "filename": "861_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 78, - "y": 117, - "w": 25, - "h": 26 - } - }, - { - "filename": "892-gigantamax-rapid_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 24, - "h": 26 - }, - "frame": { - "x": 103, - "y": 117, - "w": 24, - "h": 26 - } - }, - { - "filename": "901_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 53, - "y": 143, - "w": 28, - "h": 23 - } - }, - { - "filename": "901_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 28, - "h": 23 - }, - "frame": { - "x": 81, - "y": 143, - "w": 28, - "h": 23 - } - }, - { - "filename": "891_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 18, - "h": 22 - }, - "frame": { - "x": 109, - "y": 143, - "w": 18, - "h": 22 - } - }, - { - "filename": "892-gigantamax-rapid_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 24, - "h": 26 - }, - "frame": { - "x": 29, - "y": 150, - "w": 24, - "h": 26 - } - }, - { - "filename": "892-gigantamax-rapid_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 24, - "h": 26 - }, - "frame": { - "x": 29, - "y": 176, - "w": 24, - "h": 26 - } - }, - { - "filename": "823_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 27, - "h": 24 - }, - "frame": { - "x": 53, - "y": 166, - "w": 27, - "h": 24 - } - }, - { - "filename": "823_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 27, - "h": 24 - }, - "frame": { - "x": 80, - "y": 166, - "w": 27, - "h": 24 - } - }, - { - "filename": "863_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 20, - "h": 24 - }, - "frame": { - "x": 107, - "y": 166, - "w": 20, - "h": 24 - } - }, - { - "filename": "4145_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 28, - "h": 23 - }, - "frame": { - "x": 53, - "y": 190, - "w": 28, - "h": 23 - } - }, - { - "filename": "4145_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 28, - "h": 23 - }, - "frame": { - "x": 81, - "y": 190, - "w": 28, - "h": 23 - } - }, - { - "filename": "891_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 18, - "h": 22 - }, - "frame": { - "x": 109, - "y": 190, - "w": 18, - "h": 22 - } - }, - { - "filename": "817_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 24, - "h": 24 - }, - "frame": { - "x": 29, - "y": 202, - "w": 24, - "h": 24 - } - }, - { - "filename": "6706_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 26, - "h": 25 - }, - "frame": { - "x": 27, - "y": 226, - "w": 26, - "h": 25 - } - }, - { - "filename": "6706_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 26, - "h": 25 - }, - "frame": { - "x": 53, - "y": 213, - "w": 26, - "h": 25 - } - }, - { - "filename": "886_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 26, - "h": 24 - }, - "frame": { - "x": 79, - "y": 213, - "w": 26, - "h": 24 - } - }, - { - "filename": "858_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 22, - "h": 25 - }, - "frame": { - "x": 105, - "y": 213, - "w": 22, - "h": 25 - } - }, - { - "filename": "886_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 26, - "h": 24 - }, - "frame": { - "x": 27, - "y": 251, - "w": 26, - "h": 24 - } - }, - { - "filename": "886_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 26, - "h": 24 - }, - "frame": { - "x": 53, - "y": 238, - "w": 26, - "h": 24 - } - }, - { - "filename": "897_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 26, - "h": 24 - }, - "frame": { - "x": 79, - "y": 237, - "w": 26, - "h": 24 - } - }, - { - "filename": "858_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 22, - "h": 25 - }, - "frame": { - "x": 105, - "y": 238, - "w": 22, - "h": 25 - } - }, - { - "filename": "897_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 26, - "h": 24 - }, - "frame": { - "x": 26, - "y": 275, - "w": 26, - "h": 24 - } - }, - { - "filename": "897_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 26, - "h": 24 - }, - "frame": { - "x": 26, - "y": 299, - "w": 26, - "h": 24 - } - }, - { - "filename": "900_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 25, - "h": 25 - }, - "frame": { - "x": 26, - "y": 323, - "w": 25, - "h": 25 - } - }, - { - "filename": "900_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 25, - "h": 25 - }, - "frame": { - "x": 26, - "y": 348, - "w": 25, - "h": 25 - } - }, - { - "filename": "817_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 24, - "h": 24 - }, - "frame": { - "x": 26, - "y": 373, - "w": 24, - "h": 24 - } - }, - { - "filename": "4078_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 27, - "h": 23 - }, - "frame": { - "x": 26, - "y": 397, - "w": 27, - "h": 23 - } - }, - { - "filename": "884_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 22, - "h": 25 - }, - "frame": { - "x": 32, - "y": 420, - "w": 22, - "h": 25 - } - }, - { - "filename": "884_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 22, - "h": 25 - }, - "frame": { - "x": 32, - "y": 445, - "w": 22, - "h": 25 - } - }, - { - "filename": "892-rapid-strike_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 22 - }, - "frame": { - "x": 53, - "y": 262, - "w": 26, - "h": 22 - } - }, - { - "filename": "892-rapid-strike_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 22 - }, - "frame": { - "x": 79, - "y": 261, - "w": 26, - "h": 22 - } - }, - { - "filename": "816_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 23 - }, - "frame": { - "x": 105, - "y": 263, - "w": 22, - "h": 23 - } - }, - { - "filename": "4078_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 27, - "h": 23 - }, - "frame": { - "x": 52, - "y": 284, - "w": 27, - "h": 23 - } - }, - { - "filename": "896_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 24, - "h": 24 - }, - "frame": { - "x": 79, - "y": 283, - "w": 24, - "h": 24 - } - }, - { - "filename": "896_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 24, - "h": 24 - }, - "frame": { - "x": 103, - "y": 286, - "w": 24, - "h": 24 - } - }, - { - "filename": "4146_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 18 - }, - "frame": { - "x": 52, - "y": 307, - "w": 28, - "h": 18 - } - }, - { - "filename": "6713_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 51, - "y": 325, - "w": 27, - "h": 23 - } - }, - { - "filename": "6713_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 51, - "y": 348, - "w": 27, - "h": 23 - } - }, - { - "filename": "892_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 23, - "h": 25 - }, - "frame": { - "x": 80, - "y": 307, - "w": 23, - "h": 25 - } - }, - { - "filename": "896_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 24, - "h": 24 - }, - "frame": { - "x": 103, - "y": 310, - "w": 24, - "h": 24 - } - }, - { - "filename": "6571_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 78, - "y": 332, - "w": 25, - "h": 23 - } - }, - { - "filename": "4080_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 24, - "h": 23 - }, - "frame": { - "x": 103, - "y": 334, - "w": 24, - "h": 23 - } - }, - { - "filename": "873_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 25, - "h": 22 - }, - "frame": { - "x": 78, - "y": 355, - "w": 25, - "h": 22 - } - }, - { - "filename": "4077_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, - "h": 21 - }, - "frame": { - "x": 103, - "y": 357, - "w": 24, - "h": 21 - } - }, - { - "filename": "873_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 25, - "h": 22 - }, - "frame": { - "x": 53, - "y": 371, - "w": 25, - "h": 22 - } - }, - { - "filename": "892_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 23, - "h": 25 - }, - "frame": { - "x": 53, - "y": 393, - "w": 23, - "h": 25 - } - }, - { - "filename": "892_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 23, - "h": 25 - }, - "frame": { - "x": 54, - "y": 418, - "w": 23, - "h": 25 - } - }, - { - "filename": "6571_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 54, - "y": 443, - "w": 25, - "h": 23 - } - }, - { - "filename": "873_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 25, - "h": 22 - }, - "frame": { - "x": 78, - "y": 377, - "w": 25, - "h": 22 - } - }, - { - "filename": "4077_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, - "h": 21 - }, - "frame": { - "x": 103, - "y": 378, - "w": 24, - "h": 21 - } - }, - { - "filename": "822_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 19 - }, - "frame": { - "x": 76, - "y": 399, - "w": 22, - "h": 19 - } - }, - { - "filename": "816_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 23 - }, - "frame": { - "x": 77, - "y": 418, - "w": 22, - "h": 23 - } - }, - { - "filename": "822_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 19 - }, - "frame": { - "x": 98, - "y": 399, - "w": 22, - "h": 19 - } - }, - { - "filename": "855_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 23 - }, - "frame": { - "x": 99, - "y": 418, - "w": 22, - "h": 23 - } - }, - { - "filename": "855_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 23 - }, - "frame": { - "x": 79, - "y": 441, - "w": 22, - "h": 23 - } - }, - { - "filename": "860_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 23 - }, - "frame": { - "x": 101, - "y": 441, - "w": 22, - "h": 23 - } - }, - { - "filename": "885_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 24, - "h": 17 - }, - "frame": { - "x": 54, - "y": 466, - "w": 24, - "h": 17 - } - }, - { - "filename": "835_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 20 - }, - "frame": { - "x": 32, - "y": 470, - "w": 22, - "h": 20 - } - }, - { - "filename": "860_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 23 - }, - "frame": { - "x": 30, - "y": 490, - "w": 22, - "h": 23 - } - }, - { - "filename": "876-female_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 23 - }, - "frame": { - "x": 30, - "y": 513, - "w": 22, - "h": 23 - } - }, - { - "filename": "876-female_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 23 - }, - "frame": { - "x": 30, - "y": 536, - "w": 22, - "h": 23 - } - }, - { - "filename": "836_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 22, - "h": 22 - }, - "frame": { - "x": 30, - "y": 559, - "w": 22, - "h": 22 - } - }, - { - "filename": "836_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 22, - "h": 22 - }, - "frame": { - "x": 30, - "y": 581, - "w": 22, - "h": 22 - } - }, - { - "filename": "885_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 24, - "h": 17 - }, - "frame": { - "x": 54, - "y": 483, - "w": 24, - "h": 17 - } - }, - { - "filename": "857_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 22, - "h": 22 - }, - "frame": { - "x": 52, - "y": 500, - "w": 22, - "h": 22 - } - }, - { - "filename": "857_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 22, - "h": 22 - }, - "frame": { - "x": 52, - "y": 522, - "w": 22, - "h": 22 - } - }, - { - "filename": "863_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 20, - "h": 24 - }, - "frame": { - "x": 52, - "y": 544, - "w": 20, - "h": 24 - } - }, - { - "filename": "898_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 19, - "h": 22 - }, - "frame": { - "x": 52, - "y": 568, - "w": 19, - "h": 22 - } - }, - { - "filename": "821_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 19, - "h": 16 - }, - "frame": { - "x": 52, - "y": 590, - "w": 19, - "h": 16 - } - }, - { - "filename": "835_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 20 - }, - "frame": { - "x": 47, - "y": 606, - "w": 22, - "h": 20 - } - }, - { - "filename": "885_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 24, - "h": 17 - }, - "frame": { - "x": 47, - "y": 626, - "w": 24, - "h": 17 - } - }, - { - "filename": "4052_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 21, - "h": 21 - }, - "frame": { - "x": 46, - "y": 643, - "w": 21, - "h": 21 - } - }, - { - "filename": "4052_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 21, - "h": 21 - }, - "frame": { - "x": 46, - "y": 664, - "w": 21, - "h": 21 - } - }, - { - "filename": "898_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 19, - "h": 22 - }, - "frame": { - "x": 54, - "y": 685, - "w": 19, - "h": 22 - } - }, - { - "filename": "898_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 19, - "h": 22 - }, - "frame": { - "x": 74, - "y": 500, - "w": 19, - "h": 22 - } - }, - { - "filename": "6570_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 74, - "y": 522, - "w": 18, - "h": 22 - } - }, - { - "filename": "4222_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 21, - "h": 20 - }, - "frame": { - "x": 72, - "y": 544, - "w": 21, - "h": 20 - } - }, - { - "filename": "6570_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 67, - "y": 643, - "w": 18, - "h": 22 - } - }, - { - "filename": "4222_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 21, - "h": 20 - }, - "frame": { - "x": 67, - "y": 665, - "w": 21, - "h": 20 - } - }, - { - "filename": "6705_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 73, - "y": 685, - "w": 15, - "h": 22 - } - }, - { - "filename": "4144_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 19 - }, - "frame": { - "x": 72, - "y": 564, - "w": 22, - "h": 19 - } - }, - { - "filename": "4264_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 20 - }, - "frame": { - "x": 71, - "y": 583, - "w": 22, - "h": 20 - } - }, - { - "filename": "4144_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 19 - }, - "frame": { - "x": 71, - "y": 603, - "w": 22, - "h": 19 - } - }, - { - "filename": "877-hangry_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 17, - "h": 21 - }, - "frame": { - "x": 71, - "y": 622, - "w": 17, - "h": 21 - } - }, - { - "filename": "877-hangry_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 17, - "h": 21 - }, - "frame": { - "x": 88, - "y": 622, - "w": 17, - "h": 21 - } - }, - { - "filename": "4264_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 20 - }, - "frame": { - "x": 85, - "y": 643, - "w": 22, - "h": 20 - } - }, - { - "filename": "877-hangry_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 17, - "h": 21 - }, - "frame": { - "x": 88, - "y": 663, - "w": 17, - "h": 21 - } - }, - { - "filename": "877_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 17, - "h": 21 - }, - "frame": { - "x": 88, - "y": 684, - "w": 17, - "h": 21 - } - }, - { - "filename": "4263_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 16 - }, - "frame": { - "x": 105, - "y": 464, - "w": 22, - "h": 16 - } - }, - { - "filename": "4263_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 16 - }, - "frame": { - "x": 105, - "y": 480, - "w": 22, - "h": 16 - } - }, - { - "filename": "877_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 17, - "h": 21 - }, - "frame": { - "x": 105, - "y": 663, - "w": 17, - "h": 21 - } - }, - { - "filename": "877_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 17, - "h": 21 - }, - "frame": { - "x": 105, - "y": 684, - "w": 17, - "h": 21 - } - }, - { - "filename": "6215_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 92, - "y": 522, - "w": 17, - "h": 21 - } - }, - { - "filename": "6215_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 93, - "y": 543, - "w": 17, - "h": 21 - } - }, - { - "filename": "859_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 20 - }, - "frame": { - "x": 110, - "y": 496, - "w": 17, - "h": 20 - } - }, - { - "filename": "859_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 20 - }, - "frame": { - "x": 93, - "y": 496, - "w": 17, - "h": 20 - } - }, - { - "filename": "829_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 17, - "h": 18 - }, - "frame": { - "x": 110, - "y": 516, - "w": 17, - "h": 18 - } - }, - { - "filename": "829_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 17, - "h": 18 - }, - "frame": { - "x": 110, - "y": 534, - "w": 17, - "h": 18 - } - }, - { - "filename": "854_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 14 - }, - "frame": { - "x": 110, - "y": 552, - "w": 17, - "h": 14 - } - }, - { - "filename": "6100_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 14, - "h": 14 - }, - "frame": { - "x": 94, - "y": 564, - "w": 14, - "h": 14 - } - }, - { - "filename": "821_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 19, - "h": 16 - }, - "frame": { - "x": 108, - "y": 566, - "w": 19, - "h": 16 - } - }, - { - "filename": "6100_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 14, - "h": 14 - }, - "frame": { - "x": 94, - "y": 578, - "w": 14, - "h": 14 - } - }, - { - "filename": "854_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 14 - }, - "frame": { - "x": 93, - "y": 592, - "w": 17, - "h": 14 - } - }, - { - "filename": "872_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 14 - }, - "frame": { - "x": 110, - "y": 582, - "w": 17, - "h": 14 - } - }, - { - "filename": "872_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 14 - }, - "frame": { - "x": 110, - "y": 596, - "w": 17, - "h": 14 - } - }, - { - "filename": "872_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 14 - }, - "frame": { - "x": 93, - "y": 606, - "w": 17, - "h": 14 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e57165b71bf3e3ae5c42c992a485f65c:793bc46ac44791f8e836adaa13efdcd3:ec5f05e7f30cd98f74db0c2326109fd3$" - } -} +{ "frames": { + "4052_2": { + "frame": { "x": 85, "y": 209, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4052_3": { + "frame": { "x": 106, "y": 210, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4077_2": { + "frame": { "x": 203, "y": 112, "w": 24, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4077_3": { + "frame": { "x": 48, "y": 112, "w": 24, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4078_2": { + "frame": { "x": 230, "y": 133, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4078_3": { + "frame": { "x": 203, "y": 133, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4079_2": { + "frame": { "x": 79, "y": 250, "w": 26, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 26, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4079_3": { + "frame": { "x": 351, "y": 250, "w": 26, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 26, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4080_1": { + "frame": { "x": 352, "y": 161, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4080_2": { + "frame": { "x": 23, "y": 161, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4080_3": { + "frame": { "x": 328, "y": 160, "w": 24, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4144_2": { + "frame": { "x": 146, "y": 230, "w": 22, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4144_3": { + "frame": { "x": 85, "y": 231, "w": 22, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4145_2": { + "frame": { "x": 228, "y": 110, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4145_3": { + "frame": { "x": 97, "y": 89, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4146_2": { + "frame": { "x": 240, "y": 200, "w": 28, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4146_3": { + "frame": { "x": 212, "y": 200, "w": 28, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4199_1": { + "frame": { "x": 360, "y": 30, "w": 20, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4199_2": { + "frame": { "x": 96, "y": 182, "w": 20, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4199_3": { + "frame": { "x": 192, "y": 179, "w": 20, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4222_2": { + "frame": { "x": 309, "y": 228, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4222_3": { + "frame": { "x": 330, "y": 228, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4263_2": { + "frame": { "x": 216, "y": 258, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4263_3": { + "frame": { "x": 304, "y": 265, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4264_2": { + "frame": { "x": 287, "y": 210, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4264_3": { + "frame": { "x": 160, "y": 210, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4562_2": { + "frame": { "x": 76, "y": 264, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "4562_3": { + "frame": { "x": 351, "y": 264, "w": 22, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6100_2": { + "frame": { "x": 168, "y": 230, "w": 14, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6100_3": { + "frame": { "x": 49, "y": 277, "w": 14, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6101_2": { + "frame": { "x": 312, "y": 187, "w": 16, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6101_3": { + "frame": { "x": 266, "y": 271, "w": 16, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6215_2": { + "frame": { "x": 182, "y": 251, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6215_3": { + "frame": { "x": 126, "y": 250, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6549_2": { + "frame": { "x": 288, "y": 249, "w": 16, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6549_3": { + "frame": { "x": 286, "y": 58, "w": 16, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6570_2": { + "frame": { "x": 146, "y": 249, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6570_3": { + "frame": { "x": 333, "y": 248, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6571_2": { + "frame": { "x": 193, "y": 156, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6571_3": { + "frame": { "x": 23, "y": 138, "w": 25, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 25, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6705_2": { + "frame": { "x": 125, "y": 89, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6705_3": { + "frame": { "x": 34, "y": 271, "w": 15, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6706_2": { + "frame": { "x": 234, "y": 85, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6706_3": { + "frame": { "x": 260, "y": 85, "w": 26, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 26, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6713_2": { + "frame": { "x": 257, "y": 133, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "6713_3": { + "frame": { "x": 48, "y": 134, "w": 27, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "816_2": { + "frame": { "x": 0, "y": 188, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "816_3": { + "frame": { "x": 290, "y": 187, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "817_2": { + "frame": { "x": 308, "y": 136, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "817_3": { + "frame": { "x": 332, "y": 136, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "818-gigantamax_2": { + "frame": { "x": 214, "y": 28, "w": 30, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "818-gigantamax_3": { + "frame": { "x": 348, "y": 0, "w": 30, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "818_2": { + "frame": { "x": 75, "y": 134, "w": 22, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "818_3": { + "frame": { "x": 123, "y": 135, "w": 22, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "821_2": { + "frame": { "x": 139, "y": 271, "w": 19, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "821_3": { + "frame": { "x": 158, "y": 271, "w": 19, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "822_2": { + "frame": { "x": 0, "y": 231, "w": 22, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "822_3": { + "frame": { "x": 287, "y": 230, "w": 22, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "823-gigantamax_2": { + "frame": { "x": 302, "y": 28, "w": 32, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "823-gigantamax_3": { + "frame": { "x": 0, "y": 30, "w": 32, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "823_2": { + "frame": { "x": 140, "y": 87, "w": 27, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "823_3": { + "frame": { "x": 201, "y": 88, "w": 27, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "829_2": { + "frame": { "x": 270, "y": 231, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "829_3": { + "frame": { "x": 122, "y": 271, "w": 17, "h": 18 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 18 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "830_2": { + "frame": { "x": 42, "y": 226, "w": 19, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "830_3": { + "frame": { "x": 233, "y": 218, "w": 19, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "835_2": { + "frame": { "x": 211, "y": 218, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "835_3": { + "frame": { "x": 0, "y": 211, "w": 22, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "836_2": { + "frame": { "x": 189, "y": 206, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "836_3": { + "frame": { "x": 138, "y": 205, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "850_2": { + "frame": { "x": 194, "y": 276, "w": 21, "h": 10 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 10 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "850_3": { + "frame": { "x": 233, "y": 275, "w": 21, "h": 10 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 10 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "851_2": { + "frame": { "x": 113, "y": 0, "w": 37, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 37, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "851_3": { + "frame": { "x": 76, "y": 0, "w": 37, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 37, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "854_2": { + "frame": { "x": 98, "y": 274, "w": 17, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "854_3": { + "frame": { "x": 177, "y": 272, "w": 17, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "855_2": { + "frame": { "x": 116, "y": 187, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "855_3": { + "frame": { "x": 167, "y": 187, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "856_2": { + "frame": { "x": 127, "y": 227, "w": 19, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "856_3": { + "frame": { "x": 182, "y": 228, "w": 19, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "857_2": { + "frame": { "x": 312, "y": 206, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "857_3": { + "frame": { "x": 44, "y": 204, "w": 22, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "858-gigantamax_2": { + "frame": { "x": 273, "y": 28, "w": 29, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "858-gigantamax_3": { + "frame": { "x": 244, "y": 28, "w": 29, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "858_2": { + "frame": { "x": 47, "y": 179, "w": 22, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "858_3": { + "frame": { "x": 74, "y": 161, "w": 22, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "859_2": { + "frame": { "x": 326, "y": 270, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "859_3": { + "frame": { "x": 0, "y": 271, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "860_2": { + "frame": { "x": 22, "y": 184, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "860_3": { + "frame": { "x": 69, "y": 186, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "861-gigantamax_2": { + "frame": { "x": 0, "y": 57, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "861-gigantamax_3": { + "frame": { "x": 302, "y": 55, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "861_2": { + "frame": { "x": 286, "y": 85, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "861_3": { + "frame": { "x": 72, "y": 83, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "863_2": { + "frame": { "x": 22, "y": 207, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "863_3": { + "frame": { "x": 360, "y": 112, "w": 20, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "864_2": { + "frame": { "x": 94, "y": 30, "w": 30, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "864_3": { + "frame": { "x": 151, "y": 30, "w": 30, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "867_2": { + "frame": { "x": 32, "y": 30, "w": 31, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "867_3": { + "frame": { "x": 63, "y": 30, "w": 31, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "872_1": { + "frame": { "x": 282, "y": 272, "w": 17, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "872_2": { + "frame": { "x": 216, "y": 274, "w": 17, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "872_3": { + "frame": { "x": 17, "y": 274, "w": 17, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "873_1": { + "frame": { "x": 243, "y": 178, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "873_2": { + "frame": { "x": 218, "y": 178, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "873_3": { + "frame": { "x": 270, "y": 162, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "876-female_2": { + "frame": { "x": 350, "y": 184, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "876-female_3": { + "frame": { "x": 268, "y": 184, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "876_2": { + "frame": { "x": 268, "y": 207, "w": 19, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "876_3": { + "frame": { "x": 66, "y": 209, "w": 19, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "877-hangry_1": { + "frame": { "x": 105, "y": 253, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "877-hangry_2": { + "frame": { "x": 249, "y": 254, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "877-hangry_3": { + "frame": { "x": 199, "y": 255, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "877_1": { + "frame": { "x": 59, "y": 256, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "877_2": { + "frame": { "x": 0, "y": 250, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "877_3": { + "frame": { "x": 17, "y": 253, "w": 17, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "880_2": { + "frame": { "x": 244, "y": 156, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "880_3": { + "frame": { "x": 218, "y": 156, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "881_2": { + "frame": { "x": 252, "y": 231, "w": 18, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 18, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "881_3": { + "frame": { "x": 61, "y": 233, "w": 18, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 18, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "882_2": { + "frame": { "x": 328, "y": 183, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "882_3": { + "frame": { "x": 145, "y": 182, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "883_2": { + "frame": { "x": 357, "y": 207, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "883_3": { + "frame": { "x": 334, "y": 207, "w": 23, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "884-gigantamax_2": { + "frame": { "x": 124, "y": 30, "w": 27, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "884-gigantamax_3": { + "frame": { "x": 181, "y": 30, "w": 27, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "884_2": { + "frame": { "x": 123, "y": 162, "w": 22, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "884_3": { + "frame": { "x": 0, "y": 163, "w": 22, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "885_1": { + "frame": { "x": 201, "y": 238, "w": 24, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "885_2": { + "frame": { "x": 225, "y": 241, "w": 24, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "885_3": { + "frame": { "x": 309, "y": 248, "w": 24, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "886_1": { + "frame": { "x": 308, "y": 112, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "886_2": { + "frame": { "x": 125, "y": 111, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "886_3": { + "frame": { "x": 177, "y": 112, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "887_1": { + "frame": { "x": 86, "y": 57, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "887_2": { + "frame": { "x": 56, "y": 57, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "887_3": { + "frame": { "x": 26, "y": 57, "w": 30, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "888-crowned_2": { + "frame": { "x": 182, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "888-crowned_3": { + "frame": { "x": 150, "y": 0, "w": 32, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "888_2": { + "frame": { "x": 167, "y": 89, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "888_3": { + "frame": { "x": 311, "y": 89, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "889-crowned_2": { + "frame": { "x": 214, "y": 0, "w": 34, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "889-crowned_3": { + "frame": { "x": 248, "y": 0, "w": 34, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "889_2": { + "frame": { "x": 260, "y": 58, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "889_3": { + "frame": { "x": 234, "y": 58, "w": 26, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 26, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "890-eternamax_2": { + "frame": { "x": 0, "y": 0, "w": 38, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 38, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "890-eternamax_3": { + "frame": { "x": 38, "y": 0, "w": 38, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 38, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "890_2": { + "frame": { "x": 282, "y": 0, "w": 33, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 33, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "890_3": { + "frame": { "x": 315, "y": 0, "w": 33, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 33, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "891_1": { + "frame": { "x": 164, "y": 249, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "891_2": { + "frame": { "x": 270, "y": 249, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "891_3": { + "frame": { "x": 41, "y": 249, "w": 18, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-gigantamax-rapid_1": { + "frame": { "x": 284, "y": 111, "w": 24, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-gigantamax-rapid_2": { + "frame": { "x": 0, "y": 112, "w": 24, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-gigantamax-rapid_3": { + "frame": { "x": 24, "y": 112, "w": 24, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-gigantamax-single_1": { + "frame": { "x": 26, "y": 83, "w": 23, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-gigantamax-single_2": { + "frame": { "x": 49, "y": 83, "w": 23, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-gigantamax-single_3": { + "frame": { "x": 352, "y": 60, "w": 23, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-rapid-strike_1": { + "frame": { "x": 48, "y": 157, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-rapid-strike_2": { + "frame": { "x": 97, "y": 160, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892-rapid-strike_3": { + "frame": { "x": 145, "y": 160, "w": 26, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892_1": { + "frame": { "x": 356, "y": 136, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892_2": { + "frame": { "x": 284, "y": 137, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "892_3": { + "frame": { "x": 0, "y": 138, "w": 23, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "896_1": { + "frame": { "x": 97, "y": 136, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "896_2": { + "frame": { "x": 145, "y": 136, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "896_3": { + "frame": { "x": 169, "y": 136, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "897_1": { + "frame": { "x": 151, "y": 112, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "897_2": { + "frame": { "x": 97, "y": 112, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "897_3": { + "frame": { "x": 334, "y": 112, "w": 26, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898-ice_1": { + "frame": { "x": 328, "y": 60, "w": 24, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898-ice_2": { + "frame": { "x": 116, "y": 60, "w": 24, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898-ice_3": { + "frame": { "x": 177, "y": 60, "w": 24, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898-shadow_1": { + "frame": { "x": 151, "y": 57, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898-shadow_2": { + "frame": { "x": 208, "y": 58, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898-shadow_3": { + "frame": { "x": 334, "y": 30, "w": 26, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898_1": { + "frame": { "x": 351, "y": 228, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898_2": { + "frame": { "x": 22, "y": 231, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "898_3": { + "frame": { "x": 107, "y": 231, "w": 19, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "900_2": { + "frame": { "x": 0, "y": 87, "w": 25, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "900_3": { + "frame": { "x": 72, "y": 109, "w": 25, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "901_2": { + "frame": { "x": 256, "y": 110, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "901_3": { + "frame": { "x": 339, "y": 89, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "903_2": { + "frame": { "x": 307, "y": 160, "w": 21, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 21, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "903_3": { + "frame": { "x": 171, "y": 160, "w": 21, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 21, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_8v.png", + "format": "RGBA8888", + "size": { "w": 380, "h": 293 }, + "scale": "1" + } +} diff --git a/public/images/pokemon_icons_8v.png b/public/images/pokemon_icons_8v.png index 3b2ef39de62..1968bfe6214 100644 Binary files a/public/images/pokemon_icons_8v.png and b/public/images/pokemon_icons_8v.png differ diff --git a/public/images/pokemon_icons_9.json b/public/images/pokemon_icons_9.json index e08ebd4dcca..26e28eedae0 100644 --- a/public/images/pokemon_icons_9.json +++ b/public/images/pokemon_icons_9.json @@ -2613,6 +2613,27 @@ "h": 24 } }, + { + "filename": "1012-artisan", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 122, + "y": 333, + "w": 26, + "h": 22 + } + }, { "filename": "1012-counterfeit", "rotated": false, @@ -3222,6 +3243,27 @@ "h": 22 } }, + { + "filename": "1012s-artisan", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 194, + "y": 173, + "w": 26, + "h": 22 + } + }, { "filename": "1012s-counterfeit", "rotated": false, @@ -4209,6 +4251,27 @@ "h": 24 } }, + { + "filename": "1013-masterpiece", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 78, + "y": 543, + "w": 20, + "h": 24 + } + }, { "filename": "1013-unremarkable", "rotated": false, @@ -4230,6 +4293,27 @@ "h": 24 } }, + { + "filename": "1013s-masterpiece", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 78, + "y": 567, + "w": 20, + "h": 24 + } + }, { "filename": "1013s-unremarkable", "rotated": false, @@ -6063,6 +6147,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8b16dd09022b670e1292a2198ba0ee01:ad245407ccbb4d50190a033da06426e5:6fb417eff82c0971c86b4818772ba292$" + "smartupdate": "$TexturePacker:SmartUpdate:d412b44b05c0ac7988fc321b8a4eb571:51dd93a83920102d7a1b879808f62790:6fb417eff82c0971c86b4818772ba292$" } } diff --git a/public/images/pokemon_icons_9.png b/public/images/pokemon_icons_9.png index 70e1ada98dd..6123a15cbe9 100644 Binary files a/public/images/pokemon_icons_9.png and b/public/images/pokemon_icons_9.png differ diff --git a/public/images/pokemon_icons_9v.json b/public/images/pokemon_icons_9v.json index 5e4e786d50f..83a47f101fa 100644 --- a/public/images/pokemon_icons_9v.json +++ b/public/images/pokemon_icons_9v.json @@ -1,2666 +1,1047 @@ -{ - "textures": [ - { - "image": "pokemon_icons_9v.png", - "format": "RGBA8888", - "size": { - "w": 126, - "h": 580 - }, - "scale": 1, - "frames": [ - { - "filename": "959_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 30 - } - }, - { - "filename": "959_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 30, - "w": 31, - "h": 30 - } - }, - { - "filename": "959_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 31, - "y": 0, - "w": 31, - "h": 30 - } - }, - { - "filename": "1007-apex-build_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 29 - }, - "frame": { - "x": 62, - "y": 0, - "w": 32, - "h": 29 - } - }, - { - "filename": "1007-apex-build_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 29 - }, - "frame": { - "x": 94, - "y": 0, - "w": 32, - "h": 29 - } - }, - { - "filename": "1018_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 60, - "w": 31, - "h": 30 - } - }, - { - "filename": "1018_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 31, - "y": 30, - "w": 31, - "h": 30 - } - }, - { - "filename": "1001_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 30 - }, - "frame": { - "x": 62, - "y": 29, - "w": 30, - "h": 30 - } - }, - { - "filename": "1001_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 30 - }, - "frame": { - "x": 0, - "y": 90, - "w": 30, - "h": 30 - } - }, - { - "filename": "1008-ultimate-mode_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 30 - }, - "frame": { - "x": 31, - "y": 60, - "w": 30, - "h": 30 - } - }, - { - "filename": "1008-ultimate-mode_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 30 - }, - "frame": { - "x": 92, - "y": 29, - "w": 30, - "h": 30 - } - }, - { - "filename": "1008-ultimate-mode_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 30 - }, - "frame": { - "x": 0, - "y": 120, - "w": 30, - "h": 30 - } - }, - { - "filename": "8901_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 30, - "h": 28 - }, - "frame": { - "x": 30, - "y": 90, - "w": 30, - "h": 28 - } - }, - { - "filename": "8901_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 30, - "h": 28 - }, - "frame": { - "x": 0, - "y": 150, - "w": 30, - "h": 28 - } - }, - { - "filename": "8901_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 30, - "h": 28 - }, - "frame": { - "x": 30, - "y": 118, - "w": 30, - "h": 28 - } - }, - { - "filename": "934_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 27, - "h": 30 - }, - "frame": { - "x": 0, - "y": 178, - "w": 27, - "h": 30 - } - }, - { - "filename": "934_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 27, - "h": 30 - }, - "frame": { - "x": 30, - "y": 146, - "w": 27, - "h": 30 - } - }, - { - "filename": "995_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 27, - "h": 29 - }, - "frame": { - "x": 0, - "y": 208, - "w": 27, - "h": 29 - } - }, - { - "filename": "995_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 27, - "h": 29 - }, - "frame": { - "x": 0, - "y": 237, - "w": 27, - "h": 29 - } - }, - { - "filename": "937_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 29, - "h": 28 - }, - "frame": { - "x": 0, - "y": 266, - "w": 29, - "h": 28 - } - }, - { - "filename": "937_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 29, - "h": 28 - }, - "frame": { - "x": 0, - "y": 294, - "w": 29, - "h": 28 - } - }, - { - "filename": "937_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 29, - "h": 28 - }, - "frame": { - "x": 0, - "y": 322, - "w": 29, - "h": 28 - } - }, - { - "filename": "937_9", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 29, - "h": 28 - }, - "frame": { - "x": 0, - "y": 350, - "w": 29, - "h": 28 - } - }, - { - "filename": "994_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 27, - "h": 28 - }, - "frame": { - "x": 0, - "y": 378, - "w": 27, - "h": 28 - } - }, - { - "filename": "994_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 27, - "h": 28 - }, - "frame": { - "x": 0, - "y": 406, - "w": 27, - "h": 28 - } - }, - { - "filename": "988_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 26, - "h": 28 - }, - "frame": { - "x": 0, - "y": 434, - "w": 26, - "h": 28 - } - }, - { - "filename": "988_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 26, - "h": 28 - }, - "frame": { - "x": 0, - "y": 462, - "w": 26, - "h": 28 - } - }, - { - "filename": "982-three-segment_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 28 - }, - "frame": { - "x": 0, - "y": 490, - "w": 25, - "h": 28 - } - }, - { - "filename": "982-three-segment_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 28 - }, - "frame": { - "x": 0, - "y": 518, - "w": 25, - "h": 28 - } - }, - { - "filename": "968_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 23, - "h": 28 - }, - "frame": { - "x": 0, - "y": 546, - "w": 23, - "h": 28 - } - }, - { - "filename": "975_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 32, - "h": 21 - }, - "frame": { - "x": 62, - "y": 59, - "w": 32, - "h": 21 - } - }, - { - "filename": "975_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 32, - "h": 21 - }, - "frame": { - "x": 94, - "y": 59, - "w": 32, - "h": 21 - } - }, - { - "filename": "993_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 30, - "h": 25 - }, - "frame": { - "x": 61, - "y": 80, - "w": 30, - "h": 25 - } - }, - { - "filename": "993_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 30, - "h": 25 - }, - "frame": { - "x": 91, - "y": 80, - "w": 30, - "h": 25 - } - }, - { - "filename": "1022_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 60, - "y": 105, - "w": 29, - "h": 25 - } - }, - { - "filename": "1022_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 89, - "y": 105, - "w": 29, - "h": 25 - } - }, - { - "filename": "924_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 29, - "h": 20 - }, - "frame": { - "x": 60, - "y": 130, - "w": 29, - "h": 20 - } - }, - { - "filename": "979_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 27, - "h": 26 - }, - "frame": { - "x": 57, - "y": 150, - "w": 27, - "h": 26 - } - }, - { - "filename": "924_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 29, - "h": 20 - }, - "frame": { - "x": 89, - "y": 130, - "w": 29, - "h": 20 - } - }, - { - "filename": "979_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 27, - "h": 26 - }, - "frame": { - "x": 84, - "y": 150, - "w": 27, - "h": 26 - } - }, - { - "filename": "973_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 15, - "h": 26 - }, - "frame": { - "x": 111, - "y": 150, - "w": 15, - "h": 26 - } - }, - { - "filename": "999_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 22, - "h": 29 - }, - "frame": { - "x": 27, - "y": 178, - "w": 22, - "h": 29 - } - }, - { - "filename": "979_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 27, - "h": 26 - }, - "frame": { - "x": 49, - "y": 176, - "w": 27, - "h": 26 - } - }, - { - "filename": "911_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 28, - "h": 23 - }, - "frame": { - "x": 76, - "y": 176, - "w": 28, - "h": 23 - } - }, - { - "filename": "999_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 22, - "h": 29 - }, - "frame": { - "x": 104, - "y": 176, - "w": 22, - "h": 29 - } - }, - { - "filename": "999_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 22, - "h": 29 - }, - "frame": { - "x": 27, - "y": 207, - "w": 22, - "h": 29 - } - }, - { - "filename": "968_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 23, - "h": 28 - }, - "frame": { - "x": 49, - "y": 202, - "w": 23, - "h": 28 - } - }, - { - "filename": "1000_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 22, - "h": 27 - }, - "frame": { - "x": 27, - "y": 236, - "w": 22, - "h": 27 - } - }, - { - "filename": "998_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 49, - "y": 230, - "w": 25, - "h": 26 - } - }, - { - "filename": "936_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 20, - "h": 28 - }, - "frame": { - "x": 29, - "y": 263, - "w": 20, - "h": 28 - } - }, - { - "filename": "998_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 25, - "h": 26 - }, - "frame": { - "x": 49, - "y": 256, - "w": 25, - "h": 26 - } - }, - { - "filename": "936_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 20, - "h": 28 - }, - "frame": { - "x": 29, - "y": 291, - "w": 20, - "h": 28 - } - }, - { - "filename": "1000_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 22, - "h": 27 - }, - "frame": { - "x": 49, - "y": 282, - "w": 22, - "h": 27 - } - }, - { - "filename": "936_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 20, - "h": 28 - }, - "frame": { - "x": 29, - "y": 319, - "w": 20, - "h": 28 - } - }, - { - "filename": "1000_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 22, - "h": 27 - }, - "frame": { - "x": 49, - "y": 309, - "w": 22, - "h": 27 - } - }, - { - "filename": "1023_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 20, - "h": 28 - }, - "frame": { - "x": 29, - "y": 347, - "w": 20, - "h": 28 - } - }, - { - "filename": "982_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 49, - "y": 336, - "w": 22, - "h": 26 - } - }, - { - "filename": "911_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 28, - "h": 23 - }, - "frame": { - "x": 76, - "y": 199, - "w": 28, - "h": 23 - } - }, - { - "filename": "982_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 104, - "y": 205, - "w": 22, - "h": 26 - } - }, - { - "filename": "925-four_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 74, - "y": 222, - "w": 29, - "h": 22 - } - }, - { - "filename": "925-four_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 74, - "y": 244, - "w": 29, - "h": 22 - } - }, - { - "filename": "1023_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 20, - "h": 28 - }, - "frame": { - "x": 103, - "y": 231, - "w": 20, - "h": 28 - } - }, - { - "filename": "924_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 29, - "h": 20 - }, - "frame": { - "x": 74, - "y": 266, - "w": 29, - "h": 20 - } - }, - { - "filename": "925-four_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 71, - "y": 286, - "w": 29, - "h": 22 - } - }, - { - "filename": "925-three_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 29, - "h": 20 - }, - "frame": { - "x": 71, - "y": 308, - "w": 29, - "h": 20 - } - }, - { - "filename": "925-three_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 29, - "h": 20 - }, - "frame": { - "x": 71, - "y": 328, - "w": 29, - "h": 20 - } - }, - { - "filename": "949_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 103, - "y": 259, - "w": 20, - "h": 25 - } - }, - { - "filename": "925-three_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 29, - "h": 20 - }, - "frame": { - "x": 71, - "y": 348, - "w": 29, - "h": 20 - } - }, - { - "filename": "920_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 49, - "y": 362, - "w": 22, - "h": 23 - } - }, - { - "filename": "933_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 71, - "y": 368, - "w": 25, - "h": 21 - } - }, - { - "filename": "949_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 29, - "y": 375, - "w": 20, - "h": 25 - } - }, - { - "filename": "987_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 27, - "y": 400, - "w": 24, - "h": 24 - } - }, - { - "filename": "974_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 13, - "w": 22, - "h": 15 - }, - "frame": { - "x": 49, - "y": 385, - "w": 22, - "h": 15 - } - }, - { - "filename": "987_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 51, - "y": 400, - "w": 24, - "h": 24 - } - }, - { - "filename": "933_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 27, - "y": 424, - "w": 25, - "h": 21 - } - }, - { - "filename": "987_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 26, - "y": 445, - "w": 24, - "h": 24 - } - }, - { - "filename": "952_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 26, - "y": 469, - "w": 25, - "h": 22 - } - }, - { - "filename": "952_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 25, - "y": 491, - "w": 25, - "h": 22 - } - }, - { - "filename": "920_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 25, - "y": 513, - "w": 22, - "h": 23 - } - }, - { - "filename": "920_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 52, - "y": 424, - "w": 22, - "h": 23 - } - }, - { - "filename": "910_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 21 - }, - "frame": { - "x": 50, - "y": 447, - "w": 21, - "h": 21 - } - }, - { - "filename": "909_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 51, - "y": 468, - "w": 21, - "h": 23 - } - }, - { - "filename": "909_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 50, - "y": 491, - "w": 21, - "h": 23 - } - }, - { - "filename": "910_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 21 - }, - "frame": { - "x": 47, - "y": 514, - "w": 21, - "h": 21 - } - }, - { - "filename": "962_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 75, - "y": 389, - "w": 19, - "h": 25 - } - }, - { - "filename": "974_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 13, - "w": 22, - "h": 15 - }, - "frame": { - "x": 25, - "y": 536, - "w": 22, - "h": 15 - } - }, - { - "filename": "962_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 23, - "y": 551, - "w": 19, - "h": 25 - } - }, - { - "filename": "997_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 47, - "y": 535, - "w": 21, - "h": 19 - } - }, - { - "filename": "973_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 15, - "h": 26 - }, - "frame": { - "x": 42, - "y": 554, - "w": 15, - "h": 26 - } - }, - { - "filename": "973_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 2, - "w": 15, - "h": 26 - }, - "frame": { - "x": 57, - "y": 554, - "w": 15, - "h": 26 - } - }, - { - "filename": "962_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 75, - "y": 414, - "w": 19, - "h": 25 - } - }, - { - "filename": "967_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 74, - "y": 439, - "w": 20, - "h": 19 - } - }, - { - "filename": "1004_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 72, - "y": 458, - "w": 21, - "h": 20 - } - }, - { - "filename": "997_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 72, - "y": 478, - "w": 21, - "h": 19 - } - }, - { - "filename": "1004_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 71, - "y": 497, - "w": 21, - "h": 20 - } - }, - { - "filename": "967_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 9, - "w": 20, - "h": 19 - }, - "frame": { - "x": 68, - "y": 517, - "w": 20, - "h": 19 - } - }, - { - "filename": "970_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 68, - "y": 536, - "w": 20, - "h": 16 - } - }, - { - "filename": "948_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 72, - "y": 552, - "w": 16, - "h": 21 - } - }, - { - "filename": "935_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 13, - "h": 21 - }, - "frame": { - "x": 96, - "y": 368, - "w": 13, - "h": 21 - } - }, - { - "filename": "948_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 94, - "y": 389, - "w": 16, - "h": 21 - } - }, - { - "filename": "951_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 94, - "y": 410, - "w": 16, - "h": 20 - } - }, - { - "filename": "951_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 94, - "y": 430, - "w": 16, - "h": 20 - } - }, - { - "filename": "958_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 109, - "y": 284, - "w": 17, - "h": 20 - } - }, - { - "filename": "958_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 109, - "y": 304, - "w": 17, - "h": 20 - } - }, - { - "filename": "958_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 109, - "y": 324, - "w": 17, - "h": 20 - } - }, - { - "filename": "957_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 110, - "y": 344, - "w": 16, - "h": 17 - } - }, - { - "filename": "957_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 110, - "y": 361, - "w": 16, - "h": 17 - } - }, - { - "filename": "957_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 110, - "y": 378, - "w": 16, - "h": 17 - } - }, - { - "filename": "919_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 13, - "w": 16, - "h": 15 - }, - "frame": { - "x": 110, - "y": 395, - "w": 16, - "h": 15 - } - }, - { - "filename": "919_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 13, - "w": 16, - "h": 15 - }, - "frame": { - "x": 110, - "y": 410, - "w": 16, - "h": 15 - } - }, - { - "filename": "919_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 13, - "w": 16, - "h": 15 - }, - "frame": { - "x": 110, - "y": 425, - "w": 16, - "h": 15 - } - }, - { - "filename": "935_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 13, - "h": 21 - }, - "frame": { - "x": 88, - "y": 517, - "w": 13, - "h": 21 - } - }, - { - "filename": "935_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 13, - "h": 21 - }, - "frame": { - "x": 88, - "y": 538, - "w": 13, - "h": 21 - } - }, - { - "filename": "932_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 88, - "y": 559, - "w": 18, - "h": 19 - } - }, - { - "filename": "978-curly_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 110, - "y": 440, - "w": 15, - "h": 14 - } - }, - { - "filename": "970_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 106, - "y": 454, - "w": 20, - "h": 16 - } - }, - { - "filename": "932_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 93, - "y": 470, - "w": 18, - "h": 19 - } - }, - { - "filename": "996_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 111, - "y": 470, - "w": 15, - "h": 16 - } - }, - { - "filename": "996_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 111, - "y": 486, - "w": 15, - "h": 16 - } - }, - { - "filename": "969_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 16, - "w": 18, - "h": 12 - }, - "frame": { - "x": 93, - "y": 489, - "w": 18, - "h": 12 - } - }, - { - "filename": "969_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 16, - "w": 18, - "h": 12 - }, - "frame": { - "x": 92, - "y": 501, - "w": 18, - "h": 12 - } - }, - { - "filename": "978-curly_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 110, - "y": 502, - "w": 15, - "h": 14 - } - }, - { - "filename": "978-droopy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 101, - "y": 516, - "w": 15, - "h": 14 - } - }, - { - "filename": "978-droopy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 101, - "y": 530, - "w": 15, - "h": 14 - } - }, - { - "filename": "978-stretchy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 101, - "y": 544, - "w": 15, - "h": 14 - } - }, - { - "filename": "978-stretchy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 106, - "y": 558, - "w": 15, - "h": 14 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b15ef57152451054d5ae039df52e3d03:6bdd73a990ad7f8fbaec172a42e5dcb6:3ec5c0bc286c296cfb7fa30a8b06f3da$" - } -} +{ "frames": { + "1000_1": { + "frame": { "x": 93, "y": 139, "w": 22, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1000_2": { + "frame": { "x": 170, "y": 135, "w": 22, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1000_3": { + "frame": { "x": 192, "y": 135, "w": 22, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1001_2": { + "frame": { "x": 249, "y": 0, "w": 30, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1001_3": { + "frame": { "x": 279, "y": 0, "w": 30, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1003_2": { + "frame": { "x": 27, "y": 58, "w": 28, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 28, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1003_3": { + "frame": { "x": 55, "y": 58, "w": 28, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 28, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1004_2": { + "frame": { "x": 249, "y": 207, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1004_3": { + "frame": { "x": 204, "y": 206, "w": 21, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1006_2": { + "frame": { "x": 44, "y": 140, "w": 22, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 22, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1006_3": { + "frame": { "x": 22, "y": 139, "w": 22, "h": 27 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 22, "h": 27 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1007-apex-build_2": { + "frame": { "x": 155, "y": 0, "w": 32, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1007-apex-build_3": { + "frame": { "x": 187, "y": 0, "w": 32, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1008-ultimate-mode_1": { + "frame": { "x": 185, "y": 29, "w": 30, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1008-ultimate-mode_2": { + "frame": { "x": 155, "y": 29, "w": 30, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1008-ultimate-mode_3": { + "frame": { "x": 219, "y": 0, "w": 30, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1010_2": { + "frame": { "x": 271, "y": 179, "w": 21, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1010_3": { + "frame": { "x": 162, "y": 182, "w": 21, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1018_2": { + "frame": { "x": 0, "y": 0, "w": 31, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1018_3": { + "frame": { "x": 31, "y": 0, "w": 31, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1022_2": { + "frame": { "x": 27, "y": 86, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1022_3": { + "frame": { "x": 163, "y": 84, "w": 29, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1023_2": { + "frame": { "x": 300, "y": 30, "w": 20, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "1023_3": { + "frame": { "x": 46, "y": 167, "w": 20, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "8901_1": { + "frame": { "x": 30, "y": 30, "w": 30, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "8901_2": { + "frame": { "x": 60, "y": 30, "w": 30, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "8901_3": { + "frame": { "x": 0, "y": 30, "w": 30, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "909_2": { + "frame": { "x": 42, "y": 195, "w": 21, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 21, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "909_3": { + "frame": { "x": 63, "y": 196, "w": 21, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 21, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "910_2": { + "frame": { "x": 271, "y": 205, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "910_3": { + "frame": { "x": 292, "y": 204, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "911_2": { + "frame": { "x": 131, "y": 112, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "911_3": { + "frame": { "x": 188, "y": 112, "w": 28, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "912_2": { + "frame": { "x": 36, "y": 244, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "912_3": { + "frame": { "x": 178, "y": 244, "w": 15, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "913_2": { + "frame": { "x": 84, "y": 217, "w": 17, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "913_3": { + "frame": { "x": 197, "y": 59, "w": 17, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "914_2": { + "frame": { "x": 122, "y": 135, "w": 24, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "914_3": { + "frame": { "x": 146, "y": 135, "w": 24, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "919_1": { + "frame": { "x": 0, "y": 253, "w": 16, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "919_2": { + "frame": { "x": 51, "y": 250, "w": 16, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "919_3": { + "frame": { "x": 95, "y": 247, "w": 16, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "920_1": { + "frame": { "x": 0, "y": 190, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "920_2": { + "frame": { "x": 208, "y": 183, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "920_3": { + "frame": { "x": 0, "y": 143, "w": 22, "h": 23 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "924_1": { + "frame": { "x": 237, "y": 152, "w": 29, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "924_2": { + "frame": { "x": 144, "y": 162, "w": 29, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "924_3": { + "frame": { "x": 266, "y": 159, "w": 29, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "925-four_1": { + "frame": { "x": 93, "y": 117, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "925-four_2": { + "frame": { "x": 245, "y": 130, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "925-four_3": { + "frame": { "x": 216, "y": 112, "w": 29, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "925-three_1": { + "frame": { "x": 115, "y": 160, "w": 29, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "925-three_2": { + "frame": { "x": 202, "y": 163, "w": 29, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "925-three_3": { + "frame": { "x": 173, "y": 162, "w": 29, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "932_2": { + "frame": { "x": 202, "y": 226, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "932_3": { + "frame": { "x": 292, "y": 225, "w": 18, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "933_2": { + "frame": { "x": 183, "y": 183, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "933_3": { + "frame": { "x": 292, "y": 183, "w": 25, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "934_2": { + "frame": { "x": 273, "y": 30, "w": 27, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "934_3": { + "frame": { "x": 0, "y": 58, "w": 27, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "935_1": { + "frame": { "x": 300, "y": 244, "w": 13, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "935_2": { + "frame": { "x": 287, "y": 244, "w": 13, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "935_3": { + "frame": { "x": 236, "y": 241, "w": 13, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "936_1": { + "frame": { "x": 251, "y": 179, "w": 20, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "936_2": { + "frame": { "x": 66, "y": 168, "w": 20, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "936_3": { + "frame": { "x": 231, "y": 172, "w": 20, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "937_1": { + "frame": { "x": 215, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "937_2": { + "frame": { "x": 244, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "937_3": { + "frame": { "x": 90, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "937_9": { + "frame": { "x": 119, "y": 30, "w": 29, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "940_2": { + "frame": { "x": 245, "y": 116, "w": 17, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 14, "w": 17, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "940_3": { + "frame": { "x": 153, "y": 254, "w": 17, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 14, "w": 17, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "941_2": { + "frame": { "x": 183, "y": 204, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "941_3": { + "frame": { "x": 125, "y": 204, "w": 21, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 21, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "948_2": { + "frame": { "x": 249, "y": 227, "w": 16, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "948_3": { + "frame": { "x": 0, "y": 232, "w": 16, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "949_2": { + "frame": { "x": 22, "y": 193, "w": 20, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "949_3": { + "frame": { "x": 86, "y": 192, "w": 20, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "951_2": { + "frame": { "x": 220, "y": 241, "w": 16, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "951_3": { + "frame": { "x": 162, "y": 234, "w": 16, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "952_2": { + "frame": { "x": 112, "y": 180, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "952_3": { + "frame": { "x": 137, "y": 182, "w": 25, "h": 22 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "953_2": { + "frame": { "x": 51, "y": 219, "w": 24, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "953_3": { + "frame": { "x": 225, "y": 225, "w": 24, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "954_2": { + "frame": { "x": 296, "y": 130, "w": 21, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 21, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "954_3": { + "frame": { "x": 216, "y": 134, "w": 21, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 21, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "957_1": { + "frame": { "x": 193, "y": 245, "w": 16, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "957_2": { + "frame": { "x": 301, "y": 113, "w": 16, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "957_3": { + "frame": { "x": 265, "y": 246, "w": 16, "h": 17 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "958_1": { + "frame": { "x": 270, "y": 226, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "958_2": { + "frame": { "x": 145, "y": 227, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "958_3": { + "frame": { "x": 101, "y": 227, "w": 17, "h": 20 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "959_1": { + "frame": { "x": 62, "y": 0, "w": 31, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "959_2": { + "frame": { "x": 93, "y": 0, "w": 31, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "959_3": { + "frame": { "x": 124, "y": 0, "w": 31, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "962_1": { + "frame": { "x": 301, "y": 88, "w": 19, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "962_2": { + "frame": { "x": 230, "y": 200, "w": 19, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "962_3": { + "frame": { "x": 106, "y": 202, "w": 19, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "967_2": { + "frame": { "x": 182, "y": 225, "w": 20, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "967_3": { + "frame": { "x": 125, "y": 225, "w": 20, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "968_2": { + "frame": { "x": 48, "y": 112, "w": 23, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "968_3": { + "frame": { "x": 25, "y": 111, "w": 23, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "969_2": { + "frame": { "x": 16, "y": 260, "w": 18, "h": 12 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 16, "w": 18, "h": 12 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "969_3": { + "frame": { "x": 67, "y": 255, "w": 18, "h": 12 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 16, "w": 18, "h": 12 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "970_2": { + "frame": { "x": 118, "y": 244, "w": 20, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "970_3": { + "frame": { "x": 16, "y": 244, "w": 20, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "973_1": { + "frame": { "x": 167, "y": 208, "w": 15, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "973_2": { + "frame": { "x": 21, "y": 218, "w": 15, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "973_3": { + "frame": { "x": 36, "y": 218, "w": 15, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "974_2": { + "frame": { "x": 73, "y": 240, "w": 22, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "974_3": { + "frame": { "x": 51, "y": 235, "w": 22, "h": 15 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 15 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "975_2": { + "frame": { "x": 269, "y": 109, "w": 32, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 32, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "975_3": { + "frame": { "x": 269, "y": 88, "w": 32, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 32, "h": 21 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "978-curly_2": { + "frame": { "x": 111, "y": 260, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "978-curly_3": { + "frame": { "x": 209, "y": 261, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "978-droopy_2": { + "frame": { "x": 85, "y": 262, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "978-droopy_3": { + "frame": { "x": 193, "y": 262, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "978-stretchy_2": { + "frame": { "x": 224, "y": 262, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "978-stretchy_3": { + "frame": { "x": 34, "y": 263, "w": 15, "h": 14 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "979_1": { + "frame": { "x": 56, "y": 86, "w": 27, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "979_2": { + "frame": { "x": 192, "y": 86, "w": 27, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "979_3": { + "frame": { "x": 219, "y": 86, "w": 27, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "981_2.png": { + "frame": { "x": 108, "y": 87, "w": 23, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 23, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "981_3.png": { + "frame": { "x": 246, "y": 86, "w": 23, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 23, "h": 30 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "982-three-segment_2": { + "frame": { "x": 83, "y": 87, "w": 25, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 25, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "982-three-segment_3": { + "frame": { "x": 295, "y": 60, "w": 25, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 25, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "982_2": { + "frame": { "x": 24, "y": 167, "w": 22, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "982_3": { + "frame": { "x": 90, "y": 166, "w": 22, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "987_1": { + "frame": { "x": 66, "y": 144, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "987_2": { + "frame": { "x": 295, "y": 159, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "987_3": { + "frame": { "x": 0, "y": 166, "w": 24, "h": 24 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "988_2": { + "frame": { "x": 137, "y": 84, "w": 26, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 26, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "988_3": { + "frame": { "x": 269, "y": 60, "w": 26, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 26, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "993_2": { + "frame": { "x": 167, "y": 59, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "993_3": { + "frame": { "x": 137, "y": 59, "w": 30, "h": 25 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 30, "h": 25 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "994_2": { + "frame": { "x": 242, "y": 58, "w": 27, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 27, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "994_3": { + "frame": { "x": 215, "y": 58, "w": 27, "h": 28 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 27, "h": 28 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "995_2": { + "frame": { "x": 110, "y": 58, "w": 27, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 27, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "995_3": { + "frame": { "x": 83, "y": 58, "w": 27, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 27, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "996_2": { + "frame": { "x": 138, "y": 247, "w": 15, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 15, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "996_3": { + "frame": { "x": 249, "y": 248, "w": 15, "h": 16 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 15, "h": 16 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "997_2": { + "frame": { "x": 146, "y": 208, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "997_3": { + "frame": { "x": 0, "y": 213, "w": 21, "h": 19 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "998_2": { + "frame": { "x": 163, "y": 109, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "998_3": { + "frame": { "x": 0, "y": 88, "w": 25, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "999_1": { + "frame": { "x": 274, "y": 130, "w": 22, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "999_2": { + "frame": { "x": 71, "y": 115, "w": 22, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + }, + "999_3": { + "frame": { "x": 0, "y": 114, "w": 22, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, + "sourceSize": { "w": 40, "h": 30 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "pokemon_icons_9v.png", + "format": "RGBA8888", + "size": { "w": 320, "h": 277 }, + "scale": "1" + } +} diff --git a/public/images/pokemon_icons_9v.png b/public/images/pokemon_icons_9v.png index 71fd591b55a..5d0908d0590 100644 Binary files a/public/images/pokemon_icons_9v.png and b/public/images/pokemon_icons_9v.png differ diff --git a/public/images/trainer/aether_grunt_f.json b/public/images/trainer/aether_grunt_f.json new file mode 100644 index 00000000000..c43bdae9b2e --- /dev/null +++ b/public/images/trainer/aether_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aether_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 69, + "h": 69 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 23, + "y": 10, + "w": 35, + "h": 69 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 69 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:0c9e77856d3b434e719021572bcb93de:f9c45dc5d67009b134dd1bbc5593f6ec:a694f8828aff21c718e5161e2fd63ade$" + } +} diff --git a/public/images/trainer/aether_grunt_f.png b/public/images/trainer/aether_grunt_f.png new file mode 100644 index 00000000000..b43c5e71a51 Binary files /dev/null and b/public/images/trainer/aether_grunt_f.png differ diff --git a/public/images/trainer/aether_grunt_m.json b/public/images/trainer/aether_grunt_m.json new file mode 100644 index 00000000000..eba00096f8d --- /dev/null +++ b/public/images/trainer/aether_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aether_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 65, + "h": 65 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 14, + "w": 47, + "h": 65 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 65 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:963887cf29549ad3c123b8055cb4d701:68004c4a6e04c93bd21c26a6f8921f0c:d2241fc11d0fc31b26ecbedae6da74f4$" + } +} diff --git a/public/images/trainer/aether_grunt_m.png b/public/images/trainer/aether_grunt_m.png new file mode 100644 index 00000000000..f4df26ef007 Binary files /dev/null and b/public/images/trainer/aether_grunt_m.png differ diff --git a/public/images/trainer/archer.json b/public/images/trainer/archer.json new file mode 100644 index 00000000000..892a137d61c --- /dev/null +++ b/public/images/trainer/archer.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "archer.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/archer.png b/public/images/trainer/archer.png new file mode 100644 index 00000000000..5dcc4ff286e Binary files /dev/null and b/public/images/trainer/archer.png differ diff --git a/public/images/trainer/ariana.json b/public/images/trainer/ariana.json new file mode 100644 index 00000000000..d7d24afed6e --- /dev/null +++ b/public/images/trainer/ariana.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "ariana.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/ariana.png b/public/images/trainer/ariana.png new file mode 100644 index 00000000000..0244538d91e Binary files /dev/null and b/public/images/trainer/ariana.png differ diff --git a/public/images/trainer/bryony.json b/public/images/trainer/bryony.json new file mode 100644 index 00000000000..7d939fff58f --- /dev/null +++ b/public/images/trainer/bryony.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "bryony.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/bryony.png b/public/images/trainer/bryony.png new file mode 100644 index 00000000000..14d8abdaa39 Binary files /dev/null and b/public/images/trainer/bryony.png differ diff --git a/public/images/trainer/courtney.json b/public/images/trainer/courtney.json new file mode 100644 index 00000000000..de55e91eb85 --- /dev/null +++ b/public/images/trainer/courtney.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "courtney.png", + "format": "RGBA8888", + "size": { + "w": 52, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 52, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 52, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 52, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/courtney.png b/public/images/trainer/courtney.png new file mode 100644 index 00000000000..0efdb615fcd Binary files /dev/null and b/public/images/trainer/courtney.png differ diff --git a/public/images/trainer/faba.json b/public/images/trainer/faba.json new file mode 100644 index 00000000000..0e9544e2529 --- /dev/null +++ b/public/images/trainer/faba.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "faba.png", + "format": "RGBA8888", + "size": { + "w": 74, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 25, + "y": 5, + "w": 31, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:47622708d99a504998950bd9c389a504:fe1c51be191dd9fafb5b6f309c08ae1a:8d64db18930325b8b513740c1d83ce4c$" + } +} diff --git a/public/images/trainer/faba.png b/public/images/trainer/faba.png new file mode 100644 index 00000000000..a7fa0fb4879 Binary files /dev/null and b/public/images/trainer/faba.png differ diff --git a/public/images/trainer/guzma.json b/public/images/trainer/guzma.json new file mode 100644 index 00000000000..c278d68be24 --- /dev/null +++ b/public/images/trainer/guzma.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "guzma.png", + "format": "RGBA8888", + "size": { + "w": 58, + "h": 58 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 20, + "w": 37, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 58 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c3b08a562a2882d1ca8b5e031e245da9:72a8305e547f091d15abccd2b142e401:3b302c7f9eb6ea81b65bcaeead4a95a9$" + } +} diff --git a/public/images/trainer/guzma.png b/public/images/trainer/guzma.png new file mode 100644 index 00000000000..6afd6f3b34a Binary files /dev/null and b/public/images/trainer/guzma.png differ diff --git a/public/images/trainer/jupiter.json b/public/images/trainer/jupiter.json new file mode 100644 index 00000000000..45147497eaa --- /dev/null +++ b/public/images/trainer/jupiter.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "jupiter.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/jupiter.png b/public/images/trainer/jupiter.png new file mode 100644 index 00000000000..1a460bbfecc Binary files /dev/null and b/public/images/trainer/jupiter.png differ diff --git a/public/images/trainer/lusamine.json b/public/images/trainer/lusamine.json new file mode 100644 index 00000000000..55a711a21fb --- /dev/null +++ b/public/images/trainer/lusamine.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "lusamine.png", + "format": "RGBA8888", + "size": { + "w": 74, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 5, + "w": 36, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 36, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:41da3a1299e3831be70016dc91e49313:2413ba06767fb10fdc6fde8cc736c51c:4012333084c529872232c8d052561dc1$" + } +} diff --git a/public/images/trainer/lusamine.png b/public/images/trainer/lusamine.png new file mode 100644 index 00000000000..8b835a2d0be Binary files /dev/null and b/public/images/trainer/lusamine.png differ diff --git a/public/images/trainer/macro_grunt_f.json b/public/images/trainer/macro_grunt_f.json new file mode 100644 index 00000000000..04b30ec4ca5 --- /dev/null +++ b/public/images/trainer/macro_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "macro_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 74, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 24, + "y": 5, + "w": 31, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a015c43d80f8fd1932758e0e2cfcec61:59fc8205ea5ca04295831b4a2eb623ec:30df2ea8e9dac9e95f70534ec43d5ecd$" + } +} diff --git a/public/images/trainer/macro_grunt_f.png b/public/images/trainer/macro_grunt_f.png new file mode 100644 index 00000000000..892299d701e Binary files /dev/null and b/public/images/trainer/macro_grunt_f.png differ diff --git a/public/images/trainer/macro_grunt_m.json b/public/images/trainer/macro_grunt_m.json new file mode 100644 index 00000000000..5357fdb0767 --- /dev/null +++ b/public/images/trainer/macro_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "macro_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 75, + "h": 75 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 4, + "w": 48, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 48, + "h": 75 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:52fccff2a0675b4e10139ddb7067d4cf:10d254175d2d8a9111cce096ffb55fa3:d57016467aa07cafdfaf13e0ff643c1b$" + } +} diff --git a/public/images/trainer/macro_grunt_m.png b/public/images/trainer/macro_grunt_m.png new file mode 100644 index 00000000000..aa6b3607a87 Binary files /dev/null and b/public/images/trainer/macro_grunt_m.png differ diff --git a/public/images/trainer/mars.json b/public/images/trainer/mars.json new file mode 100644 index 00000000000..0f2dcded0c3 --- /dev/null +++ b/public/images/trainer/mars.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "mars.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/mars.png b/public/images/trainer/mars.png new file mode 100644 index 00000000000..ca7af064bc8 Binary files /dev/null and b/public/images/trainer/mars.png differ diff --git a/public/images/trainer/matt.json b/public/images/trainer/matt.json new file mode 100644 index 00000000000..b749e740d00 --- /dev/null +++ b/public/images/trainer/matt.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "matt.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/matt.png b/public/images/trainer/matt.png new file mode 100644 index 00000000000..a4f7893e565 Binary files /dev/null and b/public/images/trainer/matt.png differ diff --git a/public/images/trainer/oleana.json b/public/images/trainer/oleana.json new file mode 100644 index 00000000000..7219b640c38 --- /dev/null +++ b/public/images/trainer/oleana.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "oleana.png", + "format": "RGBA8888", + "size": { + "w": 79, + "h": 79 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 53, + "h": 79 + }, + "frame": { + "x": 0, + "y": 0, + "w": 53, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:30987a671771127a38491a588c465964:38b28effcfd5c6cbc0f358912a775af3:82e2a1f8afed29be57f6c2473f4c5be2$" + } +} diff --git a/public/images/trainer/oleana.png b/public/images/trainer/oleana.png new file mode 100644 index 00000000000..3252c67ab8e Binary files /dev/null and b/public/images/trainer/oleana.png differ diff --git a/public/images/trainer/petrel.json b/public/images/trainer/petrel.json new file mode 100644 index 00000000000..182a402cae4 --- /dev/null +++ b/public/images/trainer/petrel.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "petrel.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/petrel.png b/public/images/trainer/petrel.png new file mode 100644 index 00000000000..d4043735316 Binary files /dev/null and b/public/images/trainer/petrel.png differ diff --git a/public/images/trainer/plumeria.json b/public/images/trainer/plumeria.json new file mode 100644 index 00000000000..936a8766750 --- /dev/null +++ b/public/images/trainer/plumeria.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "plumeria.png", + "format": "RGBA8888", + "size": { + "w": 72, + "h": 72 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 23, + "y": 7, + "w": 36, + "h": 72 + }, + "frame": { + "x": 0, + "y": 0, + "w": 36, + "h": 72 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:5527e7b646932d429928b53f055e9d27:c0640510780d2974f9b74a7f8e6b29aa:7bfec029bae78c9d483f59c35b73afad$" + } +} diff --git a/public/images/trainer/plumeria.png b/public/images/trainer/plumeria.png new file mode 100644 index 00000000000..b7382f6afde Binary files /dev/null and b/public/images/trainer/plumeria.png differ diff --git a/public/images/trainer/proton.json b/public/images/trainer/proton.json new file mode 100644 index 00000000000..87a2e8e2b40 --- /dev/null +++ b/public/images/trainer/proton.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "proton.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/proton.png b/public/images/trainer/proton.png new file mode 100644 index 00000000000..6bf48a0c57c Binary files /dev/null and b/public/images/trainer/proton.png differ diff --git a/public/images/trainer/rose.json b/public/images/trainer/rose.json new file mode 100644 index 00000000000..86869257b63 --- /dev/null +++ b/public/images/trainer/rose.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "rose.png", + "format": "RGBA8888", + "size": { + "w": 79, + "h": 79 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 1, + "w": 52, + "h": 79 + }, + "frame": { + "x": 0, + "y": 0, + "w": 52, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:2b4ccaff7255c7d72661eac13de83ff8:72ee3660cdf470bd67375d355307e19d:8d35b104fc841baa4443581e6cea979e$" + } +} diff --git a/public/images/trainer/rose.png b/public/images/trainer/rose.png new file mode 100644 index 00000000000..f90da7568d4 Binary files /dev/null and b/public/images/trainer/rose.png differ diff --git a/public/images/trainer/saturn.json b/public/images/trainer/saturn.json new file mode 100644 index 00000000000..29fad6324c9 --- /dev/null +++ b/public/images/trainer/saturn.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "saturn.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/saturn.png b/public/images/trainer/saturn.png new file mode 100644 index 00000000000..cb59227c7a7 Binary files /dev/null and b/public/images/trainer/saturn.png differ diff --git a/public/images/trainer/shelly.json b/public/images/trainer/shelly.json new file mode 100644 index 00000000000..7761779864a --- /dev/null +++ b/public/images/trainer/shelly.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "shelly.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/shelly.png b/public/images/trainer/shelly.png new file mode 100644 index 00000000000..505dce1b110 Binary files /dev/null and b/public/images/trainer/shelly.png differ diff --git a/public/images/trainer/skull_grunt_f.json b/public/images/trainer/skull_grunt_f.json new file mode 100644 index 00000000000..182f9300ad5 --- /dev/null +++ b/public/images/trainer/skull_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "skull_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 74, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 31, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 31, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:71a1f5b1981674c6e81163ac8ea576c3:a5e612d58e5f0a1489e111212baea09d:dd369353af16e4c5eb6547e129dfac18$" + } +} diff --git a/public/images/trainer/skull_grunt_f.png b/public/images/trainer/skull_grunt_f.png new file mode 100644 index 00000000000..fe7834ba4a8 Binary files /dev/null and b/public/images/trainer/skull_grunt_f.png differ diff --git a/public/images/trainer/skull_grunt_m.json b/public/images/trainer/skull_grunt_m.json new file mode 100644 index 00000000000..7c728e9d3fc --- /dev/null +++ b/public/images/trainer/skull_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "skull_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 72, + "h": 72 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 51, + "h": 72 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 51, + "h": 72 + }, + "frame": { + "x": 0, + "y": 0, + "w": 51, + "h": 72 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4deb2a68e4d168bb1a40cb5d190a7d1f:be3d7b29f4b544ba51cf907691fef51d:df57ca2c9bf5f80d930306e15a851d4d$" + } +} diff --git a/public/images/trainer/skull_grunt_m.png b/public/images/trainer/skull_grunt_m.png new file mode 100644 index 00000000000..f2b8acba984 Binary files /dev/null and b/public/images/trainer/skull_grunt_m.png differ diff --git a/public/images/trainer/tabitha.json b/public/images/trainer/tabitha.json new file mode 100644 index 00000000000..8360f33bffe --- /dev/null +++ b/public/images/trainer/tabitha.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "tabitha.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/tabitha.png b/public/images/trainer/tabitha.png new file mode 100644 index 00000000000..93e3a17539d Binary files /dev/null and b/public/images/trainer/tabitha.png differ diff --git a/public/images/trainer/xerosic.json b/public/images/trainer/xerosic.json new file mode 100644 index 00000000000..fd9604637ac --- /dev/null +++ b/public/images/trainer/xerosic.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "xerosic.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/xerosic.png b/public/images/trainer/xerosic.png new file mode 100644 index 00000000000..f431c20a479 Binary files /dev/null and b/public/images/trainer/xerosic.png differ diff --git a/public/images/types_ja.json b/public/images/types_ja.json new file mode 100644 index 00000000000..95fd645829e --- /dev/null +++ b/public/images/types_ja.json @@ -0,0 +1,440 @@ +{ + "textures": [ + { + "image": "types_ja.png", + "format": "RGBA8888", + "size": { + "w": 32, + "h": 280 + }, + "scale": 1, + "frames": [ + { + "filename": "unknown", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + } + }, + { + "filename": "bug", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 14, + "w": 32, + "h": 14 + } + }, + { + "filename": "dark", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 28, + "w": 32, + "h": 14 + } + }, + { + "filename": "dragon", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 42, + "w": 32, + "h": 14 + } + }, + { + "filename": "electric", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 56, + "w": 32, + "h": 14 + } + }, + { + "filename": "fairy", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 70, + "w": 32, + "h": 14 + } + }, + { + "filename": "fighting", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 84, + "w": 32, + "h": 14 + } + }, + { + "filename": "fire", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 98, + "w": 32, + "h": 14 + } + }, + { + "filename": "flying", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 112, + "w": 32, + "h": 14 + } + }, + { + "filename": "ghost", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 126, + "w": 32, + "h": 14 + } + }, + { + "filename": "grass", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 140, + "w": 32, + "h": 14 + } + }, + { + "filename": "ground", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 154, + "w": 32, + "h": 14 + } + }, + { + "filename": "ice", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 168, + "w": 32, + "h": 14 + } + }, + { + "filename": "normal", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 182, + "w": 32, + "h": 14 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 196, + "w": 32, + "h": 14 + } + }, + { + "filename": "psychic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 210, + "w": 32, + "h": 14 + } + }, + { + "filename": "rock", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 224, + "w": 32, + "h": 14 + } + }, + { + "filename": "steel", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 238, + "w": 32, + "h": 14 + } + }, + { + "filename": "water", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 252, + "w": 32, + "h": 14 + } + }, + { + "filename": "stellar", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 266, + "w": 32, + "h": 14 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f14cf47d9a8f1d40c8e03aa6ba00fff3:6fc4227b57a95d429a1faad4280f7ec8:5961efbfbf4c56b8745347e7a663a32f$" + } +} \ No newline at end of file diff --git a/public/images/types_ja.png b/public/images/types_ja.png new file mode 100644 index 00000000000..a6f3b00607f Binary files /dev/null and b/public/images/types_ja.png differ diff --git a/public/images/ui/bgm_bar.png b/public/images/ui/bgm_bar.png new file mode 100644 index 00000000000..54abe4c5a94 Binary files /dev/null and b/public/images/ui/bgm_bar.png differ diff --git a/public/images/ui/discord.png b/public/images/ui/discord.png new file mode 100644 index 00000000000..1cd833854b0 Binary files /dev/null and b/public/images/ui/discord.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..e81934b9d75 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/favorite.png b/public/images/ui/favorite.png new file mode 100644 index 00000000000..d86dd58f5ab Binary files /dev/null and b/public/images/ui/favorite.png differ diff --git a/public/images/ui/google.png b/public/images/ui/google.png new file mode 100644 index 00000000000..82760552886 Binary files /dev/null and b/public/images/ui/google.png differ diff --git a/public/images/ui/hall_of_fame_blue.png b/public/images/ui/hall_of_fame_blue.png new file mode 100644 index 00000000000..87fadf565fd Binary files /dev/null and b/public/images/ui/hall_of_fame_blue.png differ diff --git a/public/images/ui/hall_of_fame_red.png b/public/images/ui/hall_of_fame_red.png new file mode 100644 index 00000000000..5d4d5e41e9c Binary files /dev/null and b/public/images/ui/hall_of_fame_red.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/bgm_bar.png b/public/images/ui/legacy/bgm_bar.png new file mode 100644 index 00000000000..fedeb323fc2 Binary files /dev/null and b/public/images/ui/legacy/bgm_bar.png differ diff --git a/public/images/ui/legacy/discord.png b/public/images/ui/legacy/discord.png new file mode 100644 index 00000000000..eac801cdd9d Binary files /dev/null and b/public/images/ui/legacy/discord.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/favorite.png b/public/images/ui/legacy/favorite.png new file mode 100644 index 00000000000..d86dd58f5ab Binary files /dev/null and b/public/images/ui/legacy/favorite.png differ diff --git a/public/images/ui/legacy/google.png b/public/images/ui/legacy/google.png new file mode 100644 index 00000000000..82760552886 Binary files /dev/null and b/public/images/ui/legacy/google.png differ diff --git a/public/images/ui/legacy/hall_of_fame_blue.png b/public/images/ui/legacy/hall_of_fame_blue.png new file mode 100644 index 00000000000..87fadf565fd Binary files /dev/null and b/public/images/ui/legacy/hall_of_fame_blue.png differ diff --git a/public/images/ui/legacy/hall_of_fame_red.png b/public/images/ui/legacy/hall_of_fame_red.png new file mode 100644 index 00000000000..5d4d5e41e9c Binary files /dev/null and b/public/images/ui/legacy/hall_of_fame_red.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/public/images/ui/legacy/passive_bg.png b/public/images/ui/legacy/passive_bg.png new file mode 100644 index 00000000000..1e18a47b881 Binary files /dev/null and b/public/images/ui/legacy/passive_bg.png differ diff --git a/public/images/ui/legacy/pbinfo_stat.json b/public/images/ui/legacy/pbinfo_stat.json index b7da47fc192..a956f81150d 100644 --- a/public/images/ui/legacy/pbinfo_stat.json +++ b/public/images/ui/legacy/pbinfo_stat.json @@ -176,6 +176,27 @@ "w": 12, "h": 6 } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } } ] } diff --git a/public/images/ui/legacy/pbinfo_stat.png b/public/images/ui/legacy/pbinfo_stat.png index 62ec3758772..18b0ca314de 100644 Binary files a/public/images/ui/legacy/pbinfo_stat.png and b/public/images/ui/legacy/pbinfo_stat.png differ diff --git a/public/images/ui/legacy/pbinfo_stat_numbers.json b/public/images/ui/legacy/pbinfo_stat_numbers.json index fa7d757990f..c106d1cf41e 100644 --- a/public/images/ui/legacy/pbinfo_stat_numbers.json +++ b/public/images/ui/legacy/pbinfo_stat_numbers.json @@ -281,6 +281,27 @@ "w": 9, "h": 8 } + }, + { + "filename": "empty", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 1, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 1, + "h": 8 + }, + "frame": { + "x": 117, + "y": 0, + "w": 1, + "h": 8 + } } ] } diff --git a/public/images/ui/legacy/pbinfo_stat_numbers.png b/public/images/ui/legacy/pbinfo_stat_numbers.png index ee1453b2107..b02dfbec72f 100644 Binary files a/public/images/ui/legacy/pbinfo_stat_numbers.png and b/public/images/ui/legacy/pbinfo_stat_numbers.png differ diff --git a/public/images/ui/legacy/scroll_bar.png b/public/images/ui/legacy/scroll_bar.png new file mode 100644 index 00000000000..e4e5eb34dd2 Binary files /dev/null and b/public/images/ui/legacy/scroll_bar.png differ diff --git a/public/images/ui/legacy/scroll_bar_handle.png b/public/images/ui/legacy/scroll_bar_handle.png new file mode 100644 index 00000000000..95a1726b3ba Binary files /dev/null and b/public/images/ui/legacy/scroll_bar_handle.png differ diff --git a/public/images/ui/legacy/settings_icon.png b/public/images/ui/legacy/settings_icon.png new file mode 100644 index 00000000000..21680cce7fc Binary files /dev/null and b/public/images/ui/legacy/settings_icon.png differ diff --git a/public/images/ui/legacy/starter_container_bg.png b/public/images/ui/legacy/starter_container_bg.png new file mode 100644 index 00000000000..5b60fcf551e Binary files /dev/null and b/public/images/ui/legacy/starter_container_bg.png differ diff --git a/public/images/ui/passive_bg.png b/public/images/ui/passive_bg.png new file mode 100644 index 00000000000..1e18a47b881 Binary files /dev/null and b/public/images/ui/passive_bg.png differ diff --git a/public/images/ui/pbinfo_stat.json b/public/images/ui/pbinfo_stat.json index f431e5afafd..4ec46c467b1 100644 --- a/public/images/ui/pbinfo_stat.json +++ b/public/images/ui/pbinfo_stat.json @@ -176,6 +176,27 @@ "w": 13, "h": 7 } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } } ] } diff --git a/public/images/ui/pbinfo_stat.png b/public/images/ui/pbinfo_stat.png index 46169091e7c..1c20ed70e82 100644 Binary files a/public/images/ui/pbinfo_stat.png and b/public/images/ui/pbinfo_stat.png differ diff --git a/public/images/ui/pbinfo_stat_numbers.json b/public/images/ui/pbinfo_stat_numbers.json index ec4f7117bb7..ccd49bbbb79 100644 --- a/public/images/ui/pbinfo_stat_numbers.json +++ b/public/images/ui/pbinfo_stat_numbers.json @@ -281,6 +281,27 @@ "w": 9, "h": 8 } + }, + { + "filename": "empty", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 1, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 1, + "h": 8 + }, + "frame": { + "x": 117, + "y": 0, + "w": 1, + "h": 8 + } } ] } diff --git a/public/images/ui/pbinfo_stat_numbers.png b/public/images/ui/pbinfo_stat_numbers.png index c778ba99273..1465f8b7a64 100644 Binary files a/public/images/ui/pbinfo_stat_numbers.png and b/public/images/ui/pbinfo_stat_numbers.png differ diff --git a/public/images/ui/scroll_bar.png b/public/images/ui/scroll_bar.png new file mode 100644 index 00000000000..e4e5eb34dd2 Binary files /dev/null and b/public/images/ui/scroll_bar.png differ diff --git a/public/images/ui/scroll_bar_handle.png b/public/images/ui/scroll_bar_handle.png new file mode 100644 index 00000000000..95a1726b3ba Binary files /dev/null and b/public/images/ui/scroll_bar_handle.png differ diff --git a/public/images/ui/settings_icon.png b/public/images/ui/settings_icon.png new file mode 100644 index 00000000000..21680cce7fc Binary files /dev/null and b/public/images/ui/settings_icon.png differ diff --git a/public/images/ui/starter_container_bg.png b/public/images/ui/starter_container_bg.png new file mode 100644 index 00000000000..5b60fcf551e Binary files /dev/null and b/public/images/ui/starter_container_bg.png differ diff --git a/public/images/ui/starter_select_bg.png b/public/images/ui/starter_select_bg.png index f02182fe140..8b11f55a963 100644 Binary files a/public/images/ui/starter_select_bg.png and b/public/images/ui/starter_select_bg.png differ diff --git a/src/@types/common.ts b/src/@types/common.ts new file mode 100644 index 00000000000..fcd946656dc --- /dev/null +++ b/src/@types/common.ts @@ -0,0 +1,3 @@ +import BattleScene from "#app/battle-scene"; + +export type ConditionFn = (scene: BattleScene, args?: any[]) => boolean; diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts index f3a63d6f4ec..9e8418a8977 100644 --- a/src/@types/i18next.d.ts +++ b/src/@types/i18next.d.ts @@ -1,9 +1,18 @@ -import { enConfig } from "#app/locales/en/config.js"; +import { type enConfig } from "#app/locales/en/config"; +import { TOptions } from "i18next"; +//TODO: this needs to be type properly in the future // Module declared to make referencing keys in the localization files type-safe. declare module "i18next" { interface CustomTypeOptions { defaultNS: "menu", // needed here as well for typedoc resources: typeof enConfig } + + interface TFunction { + ( + key: string | string[], + options?: TOptions & Record + ): string; + } } diff --git a/src/account.ts b/src/account.ts index 4d19513908f..c6d2f85489a 100644 --- a/src/account.ts +++ b/src/account.ts @@ -4,20 +4,23 @@ import * as Utils from "./utils"; export interface UserInfo { username: string; lastSessionSlot: integer; + discordId: string; + googleId: string; + hasAdminRole: boolean; } -export let loggedInUser: UserInfo = null; +export let loggedInUser: UserInfo | null = null; // This is a random string that is used to identify the client session - unique per session (tab or window) so that the game will only save on the one that the server is expecting export const clientSessionId = Utils.randomString(32); export function initLoggedInUser(): void { - loggedInUser = { username: "Guest", lastSessionSlot: -1 }; + loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "", hasAdminRole: false }; } export function updateUserInfo(): Promise<[boolean, integer]> { return new Promise<[boolean, integer]>(resolve => { if (bypassLogin) { - loggedInUser = { username: "Guest", lastSessionSlot: -1 }; + loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "", hasAdminRole: false}; let lastSessionSlot = -1; for (let s = 0; s < 5; s++) { if (localStorage.getItem(`sessionData${s ? s : ""}_${loggedInUser.username}`)) { @@ -28,11 +31,13 @@ export function updateUserInfo(): Promise<[boolean, integer]> { loggedInUser.lastSessionSlot = lastSessionSlot; // Migrate old data from before the username was appended [ "data", "sessionData", "sessionData1", "sessionData2", "sessionData3", "sessionData4" ].map(d => { - if (localStorage.hasOwnProperty(d)) { - if (localStorage.hasOwnProperty(`${d}_${loggedInUser.username}`)) { - localStorage.setItem(`${d}_${loggedInUser.username}_bak`, localStorage.getItem(`${d}_${loggedInUser.username}`)); + const lsItem = localStorage.getItem(d); + if (lsItem && !!loggedInUser?.username) { + const lsUserItem = localStorage.getItem(`${d}_${loggedInUser.username}`); + if (lsUserItem) { + localStorage.setItem(`${d}_${loggedInUser.username}_bak`, lsUserItem); } - localStorage.setItem(`${d}_${loggedInUser.username}`, localStorage.getItem(d)); + localStorage.setItem(`${d}_${loggedInUser.username}`, lsItem); localStorage.removeItem(d); } }); diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 1b1d1fde83f..ff4258a13f5 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1,11 +1,10 @@ import Phaser from "phaser"; import UI from "./ui/ui"; -import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from "./phases"; import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon"; import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species"; import { Constructor } from "#app/utils"; import * as Utils from "./utils"; -import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; +import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, TurnHeldItemTransferModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims"; import { Phase } from "./phase"; @@ -14,9 +13,9 @@ import { Arena, ArenaBase } from "./field/arena"; import { GameData } from "./system/game-data"; import { TextStyle, addTextObject, getTextColor } from "./ui/text"; import { allMoves } from "./data/move"; -import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue } from "./modifier/modifier-type"; +import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, modifierTypes } from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; -import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; +import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, ChangeMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; import { allAbilities } from "./data/ability"; import Battle, { BattleType, FixedBattleConfig } from "./battle"; import { GameMode, GameModes, getGameMode } from "./game-mode"; @@ -37,8 +36,8 @@ import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import { addUiThemeOverrides } from "./ui/ui-theme"; import PokemonData from "./system/pokemon-data"; import { Nature } from "./data/nature"; -import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from "./data/pokemon-forms"; -import { FormChangePhase, QuietFormChangePhase } from "./form-change-phase"; +import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges, FormChangeItem, SpeciesFormChange } from "./data/pokemon-forms"; +import { FormChangePhase } from "./phases/form-change-phase"; import { getTypeRgb } from "./data/type"; import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler"; import CharSprite from "./ui/char-sprite"; @@ -49,13 +48,12 @@ import { SceneBase } from "./scene-base"; import CandyBar from "./ui/candy-bar"; import { Variant, variantData } from "./data/variant"; import { Localizable } from "#app/interfaces/locales"; -import * as Overrides from "./overrides"; -import {InputsController} from "./inputs-controller"; -import {UiInputs} from "./ui-inputs"; +import Overrides from "#app/overrides"; +import { InputsController } from "./inputs-controller"; +import { UiInputs } from "./ui-inputs"; import { NewArenaEvent } from "./events/battle-scene"; -import ArenaFlyout from "./ui/arena-flyout"; +import { ArenaFlyout } from "./ui/arena-flyout"; import { EaseType } from "#enums/ease-type"; -import { Abilities } from "#enums/abilities"; import { BattleSpec } from "#enums/battle-spec"; import { BattleStyle } from "#enums/battle-style"; import { Biome } from "#enums/biome"; @@ -65,7 +63,27 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { UiTheme } from "#enums/ui-theme"; -import { TimedEventManager } from "#app/timed-event-manager.js"; +import { TimedEventManager } from "#app/timed-event-manager"; +import i18next from "i18next"; +import { TrainerType } from "#enums/trainer-type"; +import { battleSpecDialogue } from "./data/dialogue"; +import { LoadingScene } from "./loading-scene"; +import { LevelCapPhase } from "./phases/level-cap-phase"; +import { LoginPhase } from "./phases/login-phase"; +import { MessagePhase } from "./phases/message-phase"; +import { MovePhase } from "./phases/move-phase"; +import { NewBiomeEncounterPhase } from "./phases/new-biome-encounter-phase"; +import { NextEncounterPhase } from "./phases/next-encounter-phase"; +import { QuietFormChangePhase } from "./phases/quiet-form-change-phase"; +import { ReturnPhase } from "./phases/return-phase"; +import { SelectBiomePhase } from "./phases/select-biome-phase"; +import { ShowTrainerPhase } from "./phases/show-trainer-phase"; +import { SummonPhase } from "./phases/summon-phase"; +import { SwitchPhase } from "./phases/switch-phase"; +import { TitlePhase } from "./phases/title-phase"; +import { ToggleDoublePositionPhase } from "./phases/toggle-double-position-phase"; +import { TurnInitPhase } from "./phases/turn-init-phase"; +import { ShopCursorTarget } from "./enums/shop-cursor-target"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -102,14 +120,17 @@ export default class BattleScene extends SceneBase { public inputController: InputsController; public uiInputs: UiInputs; - public sessionPlayTime: integer = null; - public lastSavePlayTime: integer = null; + public sessionPlayTime: integer | null = null; + public lastSavePlayTime: integer | null = null; public masterVolume: number = 0.5; public bgmVolume: number = 1; + public fieldVolume: number = 1; public seVolume: number = 1; + public uiVolume: number = 1; public gameSpeed: integer = 1; public damageNumbersMode: integer = 0; public reroll: boolean = false; + public shopCursorTarget: number = ShopCursorTarget.REWARDS; public showMovesetFlyout: boolean = true; public showArenaFlyout: boolean = true; public showTimeOfDayWidget: boolean = true; @@ -118,6 +139,7 @@ export default class BattleScene extends SceneBase { public enableTutorials: boolean = import.meta.env.VITE_BYPASS_TUTORIAL === "1"; public enableMoveInfo: boolean = true; public enableRetries: boolean = false; + public hideIvs: boolean = false; /** * Determines the condition for a notification should be shown for Candy Upgrades * - 0 = 'Off' @@ -178,13 +200,18 @@ export default class BattleScene extends SceneBase { public gameData: GameData; public sessionSlotId: integer; + /** PhaseQueue: dequeue/remove the first element to get the next phase */ public phaseQueue: Phase[]; public conditionalQueue: Array<[() => boolean, Phase]>; + /** PhaseQueuePrepend: is a temp storage of what will be added to PhaseQueue */ private phaseQueuePrepend: Phase[]; + + /** overrides default of inserting phases to end of phaseQueuePrepend array, useful or inserting Phases "out of order" */ private phaseQueuePrependSpliceIndex: integer; private nextCommandPhaseQueue: Phase[]; - private currentPhase: Phase; - private standbyPhase: Phase; + + private currentPhase: Phase | null; + private standbyPhase: Phase | null; public field: Phaser.GameObjects.Container; public fieldUI: Phaser.GameObjects.Container; public charSprite: CharSprite; @@ -204,7 +231,7 @@ export default class BattleScene extends SceneBase { public score: integer; public lockModifierTiers: boolean; public trainer: Phaser.GameObjects.Sprite; - public lastEnemyTrainer: Trainer; + public lastEnemyTrainer: Trainer | null; public currentBattle: Battle; public pokeballCounts: PokeballCounts; public money: integer; @@ -222,6 +249,9 @@ export default class BattleScene extends SceneBase { private fieldOverlay: Phaser.GameObjects.Rectangle; private shopOverlay: Phaser.GameObjects.Rectangle; + private shopOverlayShown: boolean = false; + private shopOverlayOpacity: number = .8; + public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; public uiContainer: Phaser.GameObjects.Container; @@ -239,7 +269,7 @@ export default class BattleScene extends SceneBase { public spritePipeline: SpritePipeline; private bgm: AnySound; - private bgmResumeTimer: Phaser.Time.TimerEvent; + private bgmResumeTimer: Phaser.Time.TimerEvent | null; private bgmCache: Set = new Set(); private playTimeTimer: Phaser.Time.TimerEvent; @@ -309,6 +339,7 @@ export default class BattleScene extends SceneBase { } create() { + this.scene.remove(LoadingScene.KEY); initGameSpeed.apply(this); this.inputController = new InputsController(this); this.uiInputs = new UiInputs(this, this.inputController); @@ -359,7 +390,7 @@ export default class BattleScene extends SceneBase { this.fieldUI = fieldUI; - const transition = (this.make as any).rexTransitionImagePack({ + const transition = this.make.rexTransitionImagePack({ x: 0, y: 0, scale: 6, @@ -367,11 +398,14 @@ export default class BattleScene extends SceneBase { origin: { x: 0, y: 0 } }, true); + //@ts-ignore (the defined types in the package are incromplete...) transition.transit({ mode: "blinds", ease: "Cubic.easeInOut", duration: 1250, - oncomplete: () => transition.destroy() + }); + transition.once("complete", () => { + transition.destroy(); }); this.add.existing(transition); @@ -463,7 +497,7 @@ export default class BattleScene extends SceneBase { this.luckText.setVisible(false); this.fieldUI.add(this.luckText); - this.luckLabelText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "Luck:", TextStyle.PARTY, { fontSize: "54px" }); + this.luckLabelText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, i18next.t("common:luckIndicator"), TextStyle.PARTY, { fontSize: "54px" }); this.luckLabelText.setName("text-luck-label"); this.luckLabelText.setOrigin(1, 0.5); this.luckLabelText.setVisible(false); @@ -684,7 +718,11 @@ export default class BattleScene extends SceneBase { hasExpSprite(key: string): boolean { const keyMatch = /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec(key); - let k = keyMatch[4]; + if (!keyMatch) { + return false; + } + + let k = keyMatch[4]!; if (keyMatch[2]) { k += "s"; } @@ -707,7 +745,7 @@ export default class BattleScene extends SceneBase { return this.party; } - getPlayerPokemon(): PlayerPokemon { + getPlayerPokemon(): PlayerPokemon | undefined { return this.getPlayerField().find(p => p.isActive()); } @@ -724,7 +762,7 @@ export default class BattleScene extends SceneBase { return this.currentBattle?.enemyParty || []; } - getEnemyPokemon(): EnemyPokemon { + getEnemyPokemon(): EnemyPokemon | undefined { return this.getEnemyField().find(p => p.isActive()); } @@ -748,12 +786,34 @@ export default class BattleScene extends SceneBase { : ret; } + /** + * Used in doubles battles to redirect moves from one pokemon to another when one faints or is removed from the field + * @param removedPokemon {@linkcode Pokemon} the pokemon that is being removed from the field (flee, faint), moves to be redirected FROM + * @param allyPokemon {@linkcode Pokemon} the pokemon that will have the moves be redirected TO + */ + redirectPokemonMoves(removedPokemon: Pokemon, allyPokemon: Pokemon): void { + // failsafe: if not a double battle just return + if (this.currentBattle.double === false) { + return; + } + if (allyPokemon?.isActive(true)) { + let targetingMovePhase: MovePhase; + do { + targetingMovePhase = this.findPhase(mp => mp instanceof MovePhase && mp.targets.length === 1 && mp.targets[0] === removedPokemon.getBattlerIndex() && mp.pokemon.isPlayer() !== allyPokemon.isPlayer()) as MovePhase; + if (targetingMovePhase && targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex()) { + targetingMovePhase.targets[0] = allyPokemon.getBattlerIndex(); + } + } while (targetingMovePhase); + } + } + /** * Returns the ModifierBar of this scene, which is declared private and therefore not accessible elsewhere + * @param isEnemy Whether to return the enemy's modifier bar * @returns {ModifierBar} */ - getModifierBar(): ModifierBar { - return this.modifierBar; + getModifierBar(isEnemy?: boolean): ModifierBar { + return isEnemy ? this.enemyModifierBar : this.modifierBar; } // store info toggles to be accessible by the ui @@ -766,12 +826,12 @@ export default class BattleScene extends SceneBase { return activeOnly ? this.infoToggles.filter(t => t?.isActive()) : this.infoToggles; } - getPokemonById(pokemonId: integer): Pokemon { + getPokemonById(pokemonId: integer): Pokemon | null { const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId); - return findInParty(this.getParty()) || findInParty(this.getEnemyParty()); + return (findInParty(this.getParty()) || findInParty(this.getEnemyParty())) ?? null; } - addPlayerPokemon(species: PokemonSpecies, level: integer, abilityIndex: integer, formIndex: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon { + addPlayerPokemon(species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon { const pokemon = new PlayerPokemon(this, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); if (postProcess) { postProcess(pokemon); @@ -781,21 +841,21 @@ 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); - } - const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); - if (Overrides.OPP_LEVEL_OVERRIDE !== 0) { - pokemon.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; } - if (Overrides.OPP_GENDER_OVERRIDE !== null) { - pokemon.gender = Overrides.OPP_GENDER_OVERRIDE; - } + const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); + overrideModifiers(this, false); overrideHeldItems(this, pokemon, false); if (boss && !dataSource) { - const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); + const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967296)); for (let s = 0; s < pokemon.ivs.length; s++) { pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75)); @@ -901,8 +961,18 @@ export default class BattleScene extends SceneBase { this.offsetGym = this.gameMode.isClassic && this.getGeneratedOffsetGym(); } + /** + * Generates a random number using the current battle's seed + * + * This calls {@linkcode Battle.randSeedInt}(`scene`, {@linkcode range}, {@linkcode min}) in `src/battle.ts` + * which calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts` + * + * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} + * @param min The minimum integer to pick, default `0` + * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) + */ randBattleSeedInt(range: integer, min: integer = 0): integer { - return this.currentBattle.randSeedInt(this, range, min); + return this.currentBattle?.randSeedInt(this, range, min); } reset(clearScene: boolean = false, clearData: boolean = false, reloadI18n: boolean = false): void { @@ -914,6 +984,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; @@ -941,7 +1012,8 @@ export default class BattleScene extends SceneBase { p.destroy(); } - this.currentBattle = null; + //@ts-ignore - allowing `null` for currentBattle causes a lot of trouble + this.currentBattle = null; // TODO: resolve ts-ignore this.biomeWaveText.setText(startingWave.toString()); this.biomeWaveText.setVisible(false); @@ -1005,14 +1077,14 @@ export default class BattleScene extends SceneBase { } } - newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean): Battle { + newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean): Battle | null { const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave; const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1); - let newDouble: boolean; + let newDouble: boolean | undefined; let newBattleType: BattleType; - let newTrainer: Trainer; + let newTrainer: Trainer | undefined; - let battleConfig: FixedBattleConfig = null; + let battleConfig: FixedBattleConfig | null = null; this.resetSeed(newWaveIndex); @@ -1022,7 +1094,7 @@ export default class BattleScene extends SceneBase { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; newBattleType = battleConfig.battleType; - this.executeWithSeedOffset(() => newTrainer = battleConfig.getTrainer(this), (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8); + this.executeWithSeedOffset(() => newTrainer = battleConfig?.getTrainer(this), (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8); if (newTrainer) { this.field.add(newTrainer); } @@ -1043,10 +1115,15 @@ export default class BattleScene extends SceneBase { } else if (trainerConfigs[trainerType].hasDouble) { const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); - playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance)); + playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); doubleTrainer = !Utils.randSeedInt(doubleChance.value); + // Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance + if (trainerConfigs[trainerType].trainerTypeDouble && ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType)) { + doubleTrainer = false; + } } - newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, doubleTrainer ? TrainerVariant.DOUBLE : Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); + const variant = doubleTrainer ? TrainerVariant.DOUBLE : (Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); + newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, variant); this.field.add(newTrainer); } } @@ -1055,20 +1132,20 @@ export default class BattleScene extends SceneBase { if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) { const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); - playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance)); + playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); newDouble = !Utils.randSeedInt(doubleChance.value); } else if (newBattleType === BattleType.TRAINER) { - newDouble = newTrainer.variant === TrainerVariant.DOUBLE; + newDouble = newTrainer?.variant === TrainerVariant.DOUBLE; } } else if (!battleConfig) { newDouble = !!double; } - if (Overrides.DOUBLE_BATTLE_OVERRIDE) { + if (Overrides.BATTLE_TYPE_OVERRIDE === "double") { newDouble = true; } /* Override battles into single only if not fighting with trainers */ - if (newBattleType !== BattleType.TRAINER && Overrides.SINGLE_BATTLE_OVERRIDE) { + if (newBattleType !== BattleType.TRAINER && Overrides.BATTLE_TYPE_OVERRIDE === "single") { newDouble = false; } @@ -1090,27 +1167,11 @@ export default class BattleScene extends SceneBase { //this.pushPhase(new TrainerMessageTestPhase(this, TrainerType.RIVAL, TrainerType.RIVAL_2, TrainerType.RIVAL_3, TrainerType.RIVAL_4, TrainerType.RIVAL_5, TrainerType.RIVAL_6)); if (!waveIndex && lastBattle) { - let isNewBiome = !(lastBattle.waveIndex % 10) || ((this.gameMode.hasShortBiomes || this.gameMode.isDaily) && (lastBattle.waveIndex % 50) === 49); - if (!isNewBiome && this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 10) < 9) { - let w = lastBattle.waveIndex - ((lastBattle.waveIndex % 10) - 1); - let biomeWaves = 1; - while (w < lastBattle.waveIndex) { - let wasNewBiome = false; - this.executeWithSeedOffset(() => { - wasNewBiome = !Utils.randSeedInt(6 - biomeWaves); - }, w << 4); - if (wasNewBiome) { - biomeWaves = 1; - } else { - biomeWaves++; - } - w++; - } - - this.executeWithSeedOffset(() => { - isNewBiome = !Utils.randSeedInt(6 - biomeWaves); - }, lastBattle.waveIndex << 4); - } + const isWaveIndexMultipleOfTen = !(lastBattle.waveIndex % 10); + const isEndlessOrDaily = this.gameMode.hasShortBiomes || this.gameMode.isDaily; + const isEndlessFifthWave = this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 5) === 0; + const isWaveIndexMultipleOfFiftyMinusOne = (lastBattle.waveIndex % 50) === 49; + const isNewBiome = isWaveIndexMultipleOfTen || isEndlessFifthWave || (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); const resetArenaState = isNewBiome || this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); this.trySpreadPokerus(); @@ -1118,21 +1179,15 @@ export default class BattleScene extends SceneBase { this.arena.updatePoolsForTimeOfDay(); } if (resetArenaState) { - this.arena.removeAllTags(); - playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); + this.arena.resetArenaEffects(); + playerField.forEach((_, p) => this.pushPhase(new ReturnPhase(this, p))); for (const pokemon of this.getParty()) { - // Only trigger form change when Eiscue is in Noice form - // Hardcoded Eiscue for now in case it is fused with another pokemon - if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); - } - pokemon.resetBattleData(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } - this.unshiftPhase(new ShowTrainerPhase(this)); + this.pushPhase(new ShowTrainerPhase(this)); } for (const pokemon of this.getParty()) { @@ -1226,6 +1281,7 @@ export default class BattleScene extends SceneBase { case Species.ZARUDE: case Species.SQUAWKABILLY: case Species.TATSUGIRI: + case Species.GIMMIGHOUL: case Species.PALDEA_TAUROS: return Utils.randSeedInt(species.forms.length); case Species.PIKACHU: @@ -1284,11 +1340,18 @@ 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; } - let isBoss: boolean; + let isBoss: boolean | undefined; if (forceBoss || (species && (species.subLegendary || species.legendary || species.mythical))) { isBoss = true; } else { @@ -1421,19 +1484,29 @@ export default class BattleScene extends SceneBase { }); } + updateShopOverlayOpacity(value: number): void { + this.shopOverlayOpacity = value; + + if (this.shopOverlayShown) { + this.shopOverlay.setAlpha(this.shopOverlayOpacity); + } + } + showShopOverlay(duration: integer): Promise { + this.shopOverlayShown = true; return new Promise(resolve => { this.tweens.add({ targets: this.shopOverlay, - alpha: 0.8, + alpha: this.shopOverlayOpacity, ease: "Sine.easeOut", - duration: duration, + duration, onComplete: () => resolve() }); }); } hideShopOverlay(duration: integer): Promise { + this.shopOverlayShown = false; return new Promise(resolve => { this.tweens.add({ targets: this.shopOverlay, @@ -1468,7 +1541,7 @@ export default class BattleScene extends SceneBase { return; } const formattedMoney = Utils.formatMoney(this.moneyFormat, this.money); - this.moneyText.setText(`₽${formattedMoney}`); + this.moneyText.setText(i18next.t("battleScene:moneyOwned", { formattedMoney })); this.fieldUI.moveAbove(this.moneyText, this.luckText); if (forceVisible) { this.moneyText.setVisible(true); @@ -1577,7 +1650,7 @@ export default class BattleScene extends SceneBase { randomSpecies(waveIndex: integer, level: integer, fromArenaPool?: boolean, speciesFilter?: PokemonSpeciesFilter, filterAllEvolutions?: boolean): PokemonSpecies { if (fromArenaPool) { - return this.arena.randomSpecies(waveIndex, level,null , getPartyLuckValue(this.party)); + return this.arena.randomSpecies(waveIndex, level, undefined, getPartyLuckValue(this.party)); } const filteredSpecies = speciesFilter ? [...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => { if (!filterAllEvolutions) { @@ -1696,8 +1769,26 @@ export default class BattleScene extends SceneBase { updateSoundVolume(): void { if (this.sound) { - for (const sound of this.sound.getAllPlaying()) { - (sound as AnySound).setVolume(this.masterVolume * (this.bgmCache.has(sound.key) ? this.bgmVolume : this.seVolume)); + for (const sound of this.sound.getAllPlaying() as AnySound[]) { + if (this.bgmCache.has(sound.key)) { + sound.setVolume(this.masterVolume * this.bgmVolume); + } else { + const soundDetails = sound.key.split("/"); + switch (soundDetails[0]) { + + case "battle_anims": + case "cry": + if (soundDetails[1].startsWith("PRSFX- ")) { + sound.setVolume(this.masterVolume*this.fieldVolume*0.5); + } else { + sound.setVolume(this.masterVolume*this.fieldVolume); + } + break; + case "se": + case "ui": + sound.setVolume(this.masterVolume*this.seVolume); + } + } } } } @@ -1716,25 +1807,43 @@ export default class BattleScene extends SceneBase { } playSound(sound: string | AnySound, config?: object): AnySound { - if (config) { - if (config.hasOwnProperty("volume")) { - config["volume"] *= this.masterVolume * this.seVolume; - } else { - config["volume"] = this.masterVolume * this.seVolume; + const key = typeof sound === "string" ? sound : sound.key; + config = config ?? {}; + try { + const keyDetails = key.split("/"); + config["volume"] = config["volume"] ?? 1; + switch (keyDetails[0]) { + case "level_up_fanfare": + case "item_fanfare": + case "minor_fanfare": + case "heal": + case "evolution": + case "evolution_fanfare": + // These sounds are loaded in as BGM, but played as sound effects + // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() + config["volume"] *= (this.masterVolume * this.bgmVolume); + break; + case "battle_anims": + case "cry": + config["volume"] *= (this.masterVolume * this.fieldVolume); + //PRSFX sound files are unusually loud + if (keyDetails[1].startsWith("PRSFX- ")) { + config["volume"] *= 0.5; + } + break; + case "ui": + //As of, right now this applies to the "select", "menu_open", "error" sound effects + config["volume"] *= (this.masterVolume * this.uiVolume); + break; + case "se": + config["volume"] *= (this.masterVolume * this.seVolume); + break; } - } else { - config = { volume: this.masterVolume * this.seVolume }; - } - // PRSFX sounds are mixed too loud - if ((typeof sound === "string" ? sound : sound.key).startsWith("PRSFX- ")) { - config["volume"] *= 0.5; - } - if (typeof sound === "string") { - this.sound.play(sound, config); - return this.sound.get(sound) as AnySound; - } else { - sound.play(config); - return sound; + this.sound.play(key, config); + return this.sound.get(key) as AnySound; + } catch { + console.log(`${key} not found`); + return sound as AnySound; } } @@ -1761,8 +1870,10 @@ export default class BattleScene extends SceneBase { return 13.950; case "battle_johto_champion": //B2W2 Johto Champion Battle return 23.498; - case "battle_hoenn_champion": //B2W2 Hoenn Champion Battle + case "battle_hoenn_champion_g5": //B2W2 Hoenn Champion Battle return 11.328; + case "battle_hoenn_champion_g6": //ORAS Hoenn Champion Battle + return 11.762; case "battle_sinnoh_champion": //B2W2 Sinnoh Champion Battle return 12.235; case "battle_champion_alder": //BW Unova Champion Battle @@ -1843,6 +1954,8 @@ export default class BattleScene extends SceneBase { return 22.770; case "battle_legendary_dia_pal": //ORAS Dialga & Palkia Battle return 16.009; + case "battle_legendary_origin_forme": //LA Origin Dialga & Palkia Battle + return 18.961; case "battle_legendary_giratina": //ORAS Giratina Battle return 10.451; case "battle_legendary_arceus": //HGSS Arceus Battle @@ -1871,6 +1984,8 @@ export default class BattleScene extends SceneBase { return 12.503; case "battle_legendary_calyrex": //SWSH Calyrex Battle return 50.641; + case "battle_legendary_riders": //SWSH Ice & Shadow Rider Calyrex Battle + return 18.155; case "battle_legendary_birds_galar": //SWSH Galarian Legendary Birds Battle return 0.175; case "battle_legendary_ruinous": //SV Treasures of Ruin Battle @@ -1886,7 +2001,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_pecharunt": //SV Pecharunt Battle return 6.508; case "battle_rival": //BW Rival Battle - return 13.689; + return 14.110; case "battle_rival_2": //BW N Battle return 17.714; case "battle_rival_3": //BW Final N Battle @@ -1909,6 +2024,18 @@ export default class BattleScene extends SceneBase { return 12.974; case "battle_flare_grunt": //XY Team Flare Battle return 4.228; + case "battle_aether_grunt": // SM Aether Foundation Battle + return 16.00; + case "battle_skull_grunt": // SM Team Skull Battle + return 20.87; + case "battle_macro_grunt": // SWSH Trainer Battle + return 11.56; + case "battle_galactic_admin": //BDSP Team Galactic Admin Battle + return 11.997; + case "battle_skull_admin": //SM Team Skull Admin Battle + return 15.463; + case "battle_oleana": //SWSH Oleana Battle + return 14.110; case "battle_rocket_boss": //USUM Giovanni Battle return 9.115; case "battle_aqua_magma_boss": //ORAS Archie & Maxie Battle @@ -1919,6 +2046,12 @@ export default class BattleScene extends SceneBase { return 25.624; case "battle_flare_boss": //XY Lysandre Battle return 8.085; + case "battle_aether_boss": //SM Lusamine Battle + return 11.33; + case "battle_skull_boss": //SM Guzma Battle + return 13.13; + case "battle_macro_boss": //SWSH Rose Battle + return 11.42; } return 0; @@ -1933,14 +2066,15 @@ export default class BattleScene extends SceneBase { } /* Phase Functions */ - getCurrentPhase(): Phase { + getCurrentPhase(): Phase | null { return this.currentPhase; } - getStandbyPhase(): Phase { + getStandbyPhase(): Phase | null { return this.standbyPhase; } + /** * Adds a phase to the conditional queue and ensures it is executed only when the specified condition is met. * @@ -1955,11 +2089,19 @@ export default class BattleScene extends SceneBase { this.conditionalQueue.push([condition, phase]); } - + /** + * Adds a phase to nextCommandPhaseQueue, as long as boolean passed in is false + * @param phase {@linkcode Phase} the phase to add + * @param defer boolean on which queue to add to, defaults to false, and adds to phaseQueue + */ pushPhase(phase: Phase, defer: boolean = false): void { (!defer ? this.phaseQueue : this.nextCommandPhaseQueue).push(phase); } + /** + * Adds Phase to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex + * @param phase {@linkcode Phase} the phase to add + */ unshiftPhase(phase: Phase): void { if (this.phaseQueuePrependSpliceIndex === -1) { this.phaseQueuePrepend.push(phase); @@ -1968,18 +2110,32 @@ export default class BattleScene extends SceneBase { } } + /** + * Clears the phaseQueue + */ clearPhaseQueue(): void { this.phaseQueue.splice(0, this.phaseQueue.length); } + /** + * Used by function unshiftPhase(), sets index to start inserting at current length instead of the end of the array, useful if phaseQueuePrepend gets longer with Phases + */ setPhaseQueueSplice(): void { this.phaseQueuePrependSpliceIndex = this.phaseQueuePrepend.length; } + /** + * Resets phaseQueuePrependSpliceIndex to -1, implies that calls to unshiftPhase will insert at end of phaseQueuePrepend + */ clearPhaseQueueSplice(): void { this.phaseQueuePrependSpliceIndex = -1; } + /** + * Is called by each Phase implementations "end()" by default + * We dump everything from phaseQueuePrepend to the start of of phaseQueue + * then removes first Phase and starts it + */ shiftPhase(): void { if (this.standbyPhase) { this.currentPhase = this.standbyPhase; @@ -1992,31 +2148,37 @@ export default class BattleScene extends SceneBase { } if (this.phaseQueuePrepend.length) { while (this.phaseQueuePrepend.length) { - this.phaseQueue.unshift(this.phaseQueuePrepend.pop()); + const poppedPhase = this.phaseQueuePrepend.pop(); + if (poppedPhase) { + this.phaseQueue.unshift(poppedPhase); + } } } if (!this.phaseQueue.length) { this.populatePhaseQueue(); - // clear the conditionalQueue if there are no phases left in the phaseQueue + // Clear the conditionalQueue if there are no phases left in the phaseQueue this.conditionalQueue = []; } - this.currentPhase = this.phaseQueue.shift(); + + this.currentPhase = this.phaseQueue.shift() ?? null; // Check if there are any conditional phases queued if (this.conditionalQueue?.length) { // Retrieve the first conditional phase from the queue const conditionalPhase = this.conditionalQueue.shift(); // Evaluate the condition associated with the phase - if (conditionalPhase[0]()) { - // If the condition is met, add the phase to the front of the phase queue - this.unshiftPhase(conditionalPhase[1]); - } else { + if (conditionalPhase?.[0]()) { + // If the condition is met, add the phase to the phase queue + this.pushPhase(conditionalPhase[1]); + } else if (conditionalPhase) { // If the condition is not met, re-add the phase back to the front of the conditional queue this.conditionalQueue.unshift(conditionalPhase); + } else { + console.warn("condition phase is undefined/null!", conditionalPhase); } } - this.currentPhase.start(); + this.currentPhase?.start(); } overridePhase(phase: Phase): boolean { @@ -2031,7 +2193,7 @@ export default class BattleScene extends SceneBase { return true; } - findPhase(phaseFilter: (phase: Phase) => boolean): Phase { + findPhase(phaseFilter: (phase: Phase) => boolean): Phase | undefined { return this.phaseQueue.find(phaseFilter); } @@ -2055,7 +2217,7 @@ export default class BattleScene extends SceneBase { pushMovePhase(movePhase: MovePhase, priorityOverride?: integer): void { const movePriority = new Utils.IntegerHolder(priorityOverride !== undefined ? priorityOverride : movePhase.move.getMove().priority); - applyAbAttrs(IncrementMovePriorityAbAttr, movePhase.pokemon, null, movePhase.move.getMove(), movePriority); + applyAbAttrs(ChangeMovePriorityAbAttr, movePhase.pokemon, null, false, movePhase.move.getMove(), movePriority); const lowerPriorityPhase = this.phaseQueue.find(p => p instanceof MovePhase && p.move.getMove().priority < movePriority.value); if (lowerPriorityPhase) { this.phaseQueue.splice(this.phaseQueue.indexOf(lowerPriorityPhase), 0, movePhase); @@ -2064,15 +2226,46 @@ export default class BattleScene extends SceneBase { } } - queueMessage(message: string, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer, defer?: boolean) { + /** + * Tries to add the input phase to index before target phase in the phaseQueue, else simply calls unshiftPhase() + * @param phase {@linkcode Phase} the phase to be added + * @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue + * @returns boolean if a targetPhase was found and added + */ + prependToPhase(phase: Phase, targetPhase: Constructor): boolean { + const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + + if (targetIndex !== -1) { + this.phaseQueue.splice(targetIndex, 0, phase); + return true; + } else { + this.unshiftPhase(phase); + return false; + } + } + + /** + * Adds a MessagePhase, either to PhaseQueuePrepend or nextCommandPhaseQueue + * @param message string for MessagePhase + * @param callbackDelay optional param for MessagePhase constructor + * @param prompt optional param for MessagePhase constructor + * @param promptDelay optional param for MessagePhase constructor + * @param defer boolean for which queue to add it to, false -> add to PhaseQueuePrepend, true -> nextCommandPhaseQueue + */ + queueMessage(message: string, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null, defer?: boolean | null) { const phase = new MessagePhase(this, message, callbackDelay, prompt, promptDelay); if (!defer) { + // adds to the end of PhaseQueuePrepend this.unshiftPhase(phase); } else { + //remember that pushPhase adds it to nextCommandPhaseQueue this.pushPhase(phase); } } + /** + * Moves everything from nextCommandPhaseQueue to phaseQueue (keeping order) + */ populatePhaseQueue(): void { if (this.nextCommandPhaseQueue.length) { this.phaseQueue.push(...this.nextCommandPhaseQueue); @@ -2095,7 +2288,10 @@ export default class BattleScene extends SceneBase { return Math.floor(moneyValue / 10) * 10; } - addModifier(modifier: Modifier, ignoreUpdate?: boolean, playSound?: boolean, virtual?: boolean, instant?: boolean): Promise { + addModifier(modifier: Modifier | null, ignoreUpdate?: boolean, playSound?: boolean, virtual?: boolean, instant?: boolean): Promise { + if (!modifier) { + return Promise.resolve(false); + } return new Promise(resolve => { let success = false; const soundName = modifier.type.soundName; @@ -2115,7 +2311,7 @@ export default class BattleScene extends SceneBase { } } else if (!virtual) { const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); - this.queueMessage(`The stack for this item is full.\n You will receive ${defaultModifierType.name} instead.`, null, true); + this.queueMessage(i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, itemName: defaultModifierType.name }), undefined, true); return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); } @@ -2215,7 +2411,7 @@ export default class BattleScene extends SceneBase { return new Promise(resolve => { const source = itemModifier.pokemonId ? itemModifier.getPokemon(target.scene) : null; const cancelled = new Utils.BooleanHolder(false); - Utils.executeIf(source && source.isPlayer() !== target.isPlayer(), () => applyAbAttrs(BlockItemTheftAbAttr, source, cancelled)).then(() => { + Utils.executeIf(!!source && source.isPlayer() !== target.isPlayer(), () => applyAbAttrs(BlockItemTheftAbAttr, source! /* checked in condition*/, cancelled)).then(() => { if (cancelled.value) { return resolve(false); } @@ -2296,7 +2492,7 @@ export default class BattleScene extends SceneBase { } party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { - const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer.config.isBoss); + const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); let upgradeChance = 32; if (isBoss) { upgradeChance /= 2; @@ -2306,7 +2502,7 @@ export default class BattleScene extends SceneBase { } const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); let pokemonModifierChance = modifierChance; - if (this.currentBattle.battleType === BattleType.TRAINER) + if (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer) pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line let count = 0; for (let c = 0; c < chances; c++) { @@ -2320,7 +2516,6 @@ export default class BattleScene extends SceneBase { getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); }); - this.updateModifiers(false).then(() => resolve()); }); } @@ -2425,7 +2620,7 @@ export default class BattleScene extends SceneBase { return (player ? this.modifiers : this.enemyModifiers).filter(m => (modifierFilter as ModifierPredicate)(m)); } - findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier { + findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier | undefined { return (player ? this.modifiers : this.enemyModifiers).find(m => (modifierFilter as ModifierPredicate)(m)); } @@ -2436,7 +2631,7 @@ export default class BattleScene extends SceneBase { if (mods.length < 1) { return mods; } - const rand = Math.floor(Utils.randSeedInt(mods.length)); + const rand = Utils.randSeedInt(mods.length); return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))]; }; modifiers = shuffleModifiers(modifiers); @@ -2461,7 +2656,7 @@ export default class BattleScene extends SceneBase { return appliedModifiers; } - applyModifier(modifierType: Constructor, player: boolean = true, ...args: any[]): PersistentModifier { + applyModifier(modifierType: Constructor, player: boolean = true, ...args: any[]): PersistentModifier | null { const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); for (const modifier of modifiers) { if (modifier.apply(args)) { @@ -2475,7 +2670,23 @@ export default class BattleScene extends SceneBase { triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: Constructor, delayed: boolean = false, modal: boolean = false): boolean { if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { - const matchingFormChange = pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); + + // in case this is NECROZMA, determine which forms this + const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); + let matchingFormChange: SpeciesFormChange | null; + if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) { + // Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves. + const formChangeItemModifiers = (this.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]).filter(m => m.active).map(m => m.formChangeItem); + + + matchingFormChange = formChangeItemModifiers.includes(FormChangeItem.N_LUNARIZER) ? + matchingFormChangeOpts[0] : + formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) ? + matchingFormChangeOpts[1] : + null; + } else { + matchingFormChange = matchingFormChangeOpts[0]; + } if (matchingFormChange) { let phase: Phase; if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet) { @@ -2536,8 +2747,69 @@ export default class BattleScene extends SceneBase { wave: this.currentBattle?.waveIndex || 0, party: this.party ? this.party.map(p => { return { name: p.name, level: p.level }; - }) : [] + }) : [], + modeChain: this.ui?.getModeChain() ?? [], }; (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)); + if (p.fusionSpecies && p.getSpeciesForm() !== p.getFusionSpeciesForm()) { + keys.push("cry/"+p.getFusionSpeciesForm().getCryKey(p.fusionSpecies.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)); + if (p.fusionSpecies && p.getSpeciesForm() !== p.getFusionSpeciesForm()) { + keys.push("cry/"+p.getFusionSpeciesForm().getCryKey(p.fusionSpecies.formIndex)); + } + }); + return keys; + } + + /** + * Initialized the 2nd phase of the final boss (e.g. form-change for Eternatus) + * @param pokemon The (enemy) pokemon + */ + initFinalBossPhaseTwo(pokemon: Pokemon): void { + if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { + this.fadeOutBgm(Utils.fixedInt(2000), false); + this.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, undefined, () => { + const finalBossMBH = getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as TurnHeldItemTransferModifier; + finalBossMBH.setTransferrableFalse(); + this.addEnemyModifier(finalBossMBH, false, true); + pokemon.generateAndPopulateMoveset(1); + this.setFieldScale(0.75); + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + this.currentBattle.double = true; + const availablePartyMembers = this.getParty().filter((p) => p.isAllowedInBattle()); + if (availablePartyMembers.length > 1) { + this.pushPhase(new ToggleDoublePositionPhase(this, true)); + if (!availablePartyMembers[1].isOnField()) { + this.pushPhase(new SummonPhase(this, 1)); + } + } + + this.shiftPhase(); + }); + return; + } + + this.shiftPhase(); + } } diff --git a/src/battle.ts b/src/battle.ts index c3a481e9956..b80caa9e679 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -6,13 +6,14 @@ import Trainer, { TrainerVariant } from "./field/trainer"; import { GameMode } from "./game-mode"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; -import {trainerConfigs} from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainer-config"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleSpec } from "#enums/battle-spec"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import i18next from "#app/plugins/i18n"; export enum BattleType { WILD, @@ -30,7 +31,7 @@ export enum BattlerIndex { export interface TurnCommand { command: Command; - cursor?: integer; + cursor?: number; move?: QueuedMove; targets?: BattlerIndex[]; skip?: boolean; @@ -38,62 +39,49 @@ export interface TurnCommand { } interface TurnCommands { - [key: integer]: TurnCommand + [key: number]: TurnCommand | null } export default class Battle { protected gameMode: GameMode; - public waveIndex: integer; + public waveIndex: number; public battleType: BattleType; public battleSpec: BattleSpec; - public trainer: Trainer; - public enemyLevels: integer[]; - public enemyParty: EnemyPokemon[]; - public seenEnemyPartyMemberIds: Set; + public trainer: Trainer | null; + public enemyLevels: number[] | undefined; + public enemyParty: EnemyPokemon[] = []; + public seenEnemyPartyMemberIds: Set = new Set(); public double: boolean; - public started: boolean; - public enemySwitchCounter: integer; - public turn: integer; + public started: boolean = false; + public enemySwitchCounter: number = 0; + public turn: number = 0; public turnCommands: TurnCommands; - public playerParticipantIds: Set; - public battleScore: integer; - public postBattleLoot: PokemonHeldItemModifier[]; - public escapeAttempts: integer; + public playerParticipantIds: Set = new Set(); + public battleScore: number = 0; + public postBattleLoot: PokemonHeldItemModifier[] = []; + public escapeAttempts: number = 0; public lastMove: Moves; - public battleSeed: string; - private battleSeedState: string; - public moneyScattered: number; - public lastUsedPokeball: PokeballType; - public playerFaints: number; // The amount of times pokemon on the players side have fainted - public enemyFaints: number; // The amount of times pokemon on the enemies side have fainted + public battleSeed: string = Utils.randomString(16, true); + private battleSeedState: string | null = null; + public moneyScattered: number = 0; + public lastUsedPokeball: PokeballType | null = null; + /** The number of times a Pokemon on the player's side has fainted this battle */ + public playerFaints: number = 0; + /** The number of times a Pokemon on the enemy's side has fainted this battle */ + public enemyFaints: number = 0; - private rngCounter: integer = 0; + private rngCounter: number = 0; - constructor(gameMode: GameMode, waveIndex: integer, battleType: BattleType, trainer: Trainer, double: boolean) { + constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double?: boolean) { this.gameMode = gameMode; this.waveIndex = waveIndex; this.battleType = battleType; - this.trainer = trainer; + this.trainer = trainer ?? null; this.initBattleSpec(); this.enemyLevels = battleType !== BattleType.TRAINER ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) - : trainer.getPartyLevels(this.waveIndex); - this.enemyParty = []; - this.seenEnemyPartyMemberIds = new Set(); - this.double = double; - this.enemySwitchCounter = 0; - this.turn = 0; - this.playerParticipantIds = new Set(); - this.battleScore = 0; - this.postBattleLoot = []; - this.escapeAttempts = 0; - this.started = false; - this.battleSeed = Utils.randomString(16, true); - this.battleSeedState = null; - this.moneyScattered = 0; - this.lastUsedPokeball = null; - this.playerFaints = 0; - this.enemyFaints = 0; + : trainer?.getPartyLevels(this.waveIndex); + this.double = double ?? false; } private initBattleSpec(): void { @@ -104,7 +92,7 @@ export default class Battle { this.battleSpec = spec; } - private getLevelForWave(): integer { + private getLevelForWave(): number { const levelWaveIndex = this.gameMode.getWaveForDifficulty(this.waveIndex); const baseLevel = 1 + levelWaveIndex / 2 + Math.pow(levelWaveIndex / 25, 2); const bossMultiplier = 1.2; @@ -137,7 +125,7 @@ export default class Battle { return rand / value; } - getBattlerCount(): integer { + getBattlerCount(): number { return this.double ? 2 : 1; } @@ -156,8 +144,9 @@ export default class Battle { } addPostBattleLoot(enemyPokemon: EnemyPokemon): void { - this.postBattleLoot.push(...enemyPokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.getTransferrable(false), false).map(i => { + this.postBattleLoot.push(...enemyPokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.isTransferrable, false).map(i => { const ret = i as PokemonHeldItemModifier; + //@ts-ignore - this is awful to fix/change ret.pokemonId = null; return ret; })); @@ -173,7 +162,10 @@ export default class Battle { scene.addMoney(moneyAmount.value); - scene.queueMessage(`You picked up ₽${moneyAmount.value.toLocaleString("en-US")}!`, null, true); + const userLocale = navigator.language || "en-US"; + const formattedMoneyAmount = moneyAmount.value.toLocaleString(userLocale); + const message = i18next.t("battle:moneyPickedUp", { moneyAmount: formattedMoneyAmount }); + scene.queueMessage(message, undefined, true); scene.currentBattle.moneyScattered = 0; } @@ -196,16 +188,16 @@ export default class Battle { scene.updateScoreText(); } - getBgmOverride(scene: BattleScene): string { + getBgmOverride(scene: BattleScene): string | null { const battlers = this.enemyParty.slice(0, this.getBattlerCount()); if (this.battleType === BattleType.TRAINER) { - if (!this.started && this.trainer.config.encounterBgm && this.trainer.getEncounterMessages()?.length) { - return `encounter_${this.trainer.getEncounterBgm()}`; + if (!this.started && this.trainer?.config.encounterBgm && this.trainer?.getEncounterMessages()?.length) { + return `encounter_${this.trainer?.getEncounterBgm()}`; } if (scene.musicPreference === 0) { - return this.trainer.getBattleBgm(); + return this.trainer?.getBattleBgm() ?? null; } else { - return this.trainer.getMixedBattleBgm(); + return this.trainer?.getMixedBattleBgm() ?? null; } } else if (this.gameMode.isClassic && this.waveIndex > 195 && this.battleSpec !== BattleSpec.FINAL_BOSS) { return "end_summit"; @@ -270,7 +262,12 @@ export default class Battle { return "battle_legendary_sinnoh"; } if (pokemon.species.speciesId === Species.DIALGA || pokemon.species.speciesId === Species.PALKIA) { - return "battle_legendary_dia_pal"; + if (pokemon.getFormKey() === "") { + return "battle_legendary_dia_pal"; + } + if (pokemon.getFormKey() === "origin") { + return "battle_legendary_origin_forme"; + } } if (pokemon.species.speciesId === Species.GIRATINA) { return "battle_legendary_giratina"; @@ -290,10 +287,21 @@ export default class Battle { if (pokemon.species.speciesId === Species.TAPU_KOKO || pokemon.species.speciesId === Species.TAPU_LELE || pokemon.species.speciesId === Species.TAPU_BULU || pokemon.species.speciesId === Species.TAPU_FINI) { return "battle_legendary_tapu"; } - if (pokemon.species.speciesId === Species.COSMOG || pokemon.species.speciesId === Species.COSMOEM || pokemon.species.speciesId === Species.SOLGALEO || pokemon.species.speciesId === Species.LUNALA || pokemon.species.speciesId === Species.NECROZMA) { + if ([ Species.COSMOG, Species.COSMOEM, Species.SOLGALEO, Species.LUNALA ].includes(pokemon.species.speciesId)) { return "battle_legendary_sol_lun"; } - if (pokemon.species.speciesId === Species.NIHILEGO || pokemon.species.speciesId === Species.BUZZWOLE || pokemon.species.speciesId === Species.PHEROMOSA || pokemon.species.speciesId === Species.XURKITREE || pokemon.species.speciesId === Species.CELESTEELA || pokemon.species.speciesId === Species.KARTANA || pokemon.species.speciesId === Species.GUZZLORD || pokemon.species.speciesId === Species.POIPOLE || pokemon.species.speciesId === Species.NAGANADEL || pokemon.species.speciesId === Species.STAKATAKA || pokemon.species.speciesId === Species.BLACEPHALON) { + if (pokemon.species.speciesId === Species.NECROZMA) { + if (pokemon.getFormKey() === "") { + return "battle_legendary_sol_lun"; + } + if (pokemon.getFormKey() === "dusk-mane" || pokemon.getFormKey() === "dawn-wings") { + return "battle_legendary_dusk_dawn"; + } + if (pokemon.getFormKey() === "ultra") { + return "battle_legendary_ultra_nec"; + } + } + if ([ Species.NIHILEGO, Species.BUZZWOLE, Species.PHEROMOSA, Species.XURKITREE, Species.CELESTEELA, Species.KARTANA, Species.GUZZLORD, Species.POIPOLE, Species.NAGANADEL, Species.STAKATAKA, Species.BLACEPHALON ].includes(pokemon.species.speciesId)) { return "battle_legendary_ub"; } if (pokemon.species.speciesId === Species.ZACIAN || pokemon.species.speciesId === Species.ZAMAZENTA) { @@ -303,7 +311,12 @@ export default class Battle { return "battle_legendary_glas_spec"; } if (pokemon.species.speciesId === Species.CALYREX) { - return "battle_legendary_calyrex"; + if (pokemon.getFormKey() === "") { + return "battle_legendary_calyrex"; + } + if (pokemon.getFormKey() === "ice" || pokemon.getFormKey() === "shadow") { + return "battle_legendary_riders"; + } } if (pokemon.species.speciesId === Species.GALAR_ARTICUNO || pokemon.species.speciesId === Species.GALAR_ZAPDOS || pokemon.species.speciesId === Species.GALAR_MOLTRES) { return "battle_legendary_birds_galar"; @@ -341,7 +354,13 @@ export default class Battle { return null; } - randSeedInt(scene: BattleScene, range: integer, min: integer = 0): integer { + /** + * Generates a random number using the current battle's seed. Calls {@linkcode Utils.randSeedInt} + * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} + * @param min The minimum integer to pick, default `0` + * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) + */ + randSeedInt(scene: BattleScene, range: number, min: number = 0): number { if (range <= 1) { return min; } @@ -366,8 +385,8 @@ export default class Battle { } export class FixedBattle extends Battle { - constructor(scene: BattleScene, waveIndex: integer, config: FixedBattleConfig) { - super(scene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : null, config.double); + constructor(scene: BattleScene, waveIndex: number, config: FixedBattleConfig) { + super(scene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : undefined, config.double); if (config.getEnemyParty) { this.enemyParty = config.getEnemyParty(scene); } @@ -382,7 +401,7 @@ export class FixedBattleConfig { public double: boolean; public getTrainer: GetTrainerFunc; public getEnemyParty: GetEnemyPartyFunc; - public seedOffsetWaveIndex: integer; + public seedOffsetWaveIndex: number; setBattleType(battleType: BattleType): FixedBattleConfig { this.battleType = battleType; @@ -404,37 +423,59 @@ export class FixedBattleConfig { return this; } - setSeedOffsetWave(seedOffsetWaveIndex: integer): FixedBattleConfig { + setSeedOffsetWave(seedOffsetWaveIndex: number): FixedBattleConfig { this.seedOffsetWaveIndex = seedOffsetWaveIndex; return this; } } -function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): GetTrainerFunc { + +/** + * Helper function to generate a random trainer for evil team trainers and the elite 4/champion + * @param trainerPool The TrainerType or list of TrainerTypes that can possibly be generated + * @param randomGender whether or not to randomly (50%) generate a female trainer (for use with evil team grunts) + * @param seedOffset the seed offset to use for the random generation of the trainer + * @returns the generated trainer + */ +function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], randomGender: boolean = false, seedOffset: number = 0): GetTrainerFunc { return (scene: BattleScene) => { const rand = Utils.randSeedInt(trainerPool.length); const trainerTypes: TrainerType[] = []; - for (const trainerPoolEntry of trainerPool) { - const trainerType = Array.isArray(trainerPoolEntry) - ? Utils.randSeedItem(trainerPoolEntry) - : trainerPoolEntry; - trainerTypes.push(trainerType); + + scene.executeWithSeedOffset(() => { + for (const trainerPoolEntry of trainerPool) { + const trainerType = Array.isArray(trainerPoolEntry) + ? Utils.randSeedItem(trainerPoolEntry) + : trainerPoolEntry; + trainerTypes.push(trainerType); + } + }, seedOffset); + + let trainerGender = TrainerVariant.DEFAULT; + if (randomGender) { + trainerGender = (Utils.randInt(2) === 0) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; } - // If the trainer type has a double variant, there's a 33% chance of it being a double battle (for now we only allow tate&liza to be double) - if (trainerConfigs[trainerTypes[rand]].trainerTypeDouble && (trainerTypes[rand] === TrainerType.TATE || trainerTypes[rand] === TrainerType.LIZA)) { - return new Trainer(scene, trainerTypes[rand], Utils.randSeedInt(3) ? TrainerVariant.DOUBLE : TrainerVariant.DEFAULT); + + /* 1/3 chance for evil team grunts to be double battles */ + const evilTeamGrunts = [TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT]; + const isEvilTeamGrunt = evilTeamGrunts.includes(trainerTypes[rand]); + + if (trainerConfigs[trainerTypes[rand]].hasDouble && isEvilTeamGrunt) { + return new Trainer(scene, trainerTypes[rand], (Utils.randInt(3) === 0) ? TrainerVariant.DOUBLE : trainerGender); } - return new Trainer(scene, trainerTypes[rand], TrainerVariant.DEFAULT); + + return new Trainer(scene, trainerTypes[rand], trainerGender); }; } export interface FixedBattleConfigs { - [key: integer]: FixedBattleConfig + [key: number]: FixedBattleConfig } /** * Youngster/Lass on 5 * Rival on 8, 55, 95, 145, 195 - * Evil team grunts on 35, 62, 64, 66, 112, 114 + * Evil team grunts on 35, 62, 64, and 112 + * Evil team admin on 66 and 114 * Evil leader on 115, 165 * E4 on 182, 184, 186, 188 * Champion on 190 @@ -447,27 +488,27 @@ export const classicFixedBattles: FixedBattleConfigs = { [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)), [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)), [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)), [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA ], true)), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)), [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA ], true, 1)), [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE, TrainerType.LUSAMINE, TrainerType.GUZMA, TrainerType.ROSE ])), [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), + [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2, TrainerType.LUSAMINE_2, TrainerType.GUZMA_2, TrainerType.ROSE_2 ])), [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) diff --git a/src/configs/inputs/configHandler.ts b/src/configs/inputs/configHandler.ts index a67c45fd413..45fb033e9fa 100644 --- a/src/configs/inputs/configHandler.ts +++ b/src/configs/inputs/configHandler.ts @@ -20,7 +20,7 @@ export function getKeyWithKeycode(config, keycode) { */ export function getSettingNameWithKeycode(config, keycode) { const key = getKeyWithKeycode(config, keycode); - return config.custom[key]; + return key ? config.custom[key] : null; } /** @@ -32,7 +32,7 @@ export function getSettingNameWithKeycode(config, keycode) { */ export function getIconWithKeycode(config, keycode) { const key = getKeyWithKeycode(config, keycode); - return config.icons[key]; + return key ? config.icons[key] : null; } /** @@ -122,15 +122,21 @@ export function assign(config, settingNameTarget, keycode): boolean { // if it was already bound, we delete the bind if (previousSettingName) { const previousKey = getKeyWithSettingName(config, previousSettingName); - config.custom[previousKey] = -1; + if (previousKey) { + config.custom[previousKey] = -1; + } } // then, we need to delete the current key for this settingName const currentKey = getKeyWithSettingName(config, settingNameTarget); - config.custom[currentKey] = -1; + if (currentKey) { + config.custom[currentKey] = -1; + } // then, the new key is assigned to the new settingName const newKey = getKeyWithKeycode(config, keycode); - config.custom[newKey] = settingNameTarget; + if (newKey) { + config.custom[newKey] = settingNameTarget; + } return true; } @@ -145,8 +151,12 @@ export function swap(config, settingNameTarget, keycode) { const new_key = getKeyWithKeycode(config, keycode); const new_settingName = getSettingNameWithKey(config, new_key); - config.custom[prev_key] = new_settingName; - config.custom[new_key] = prev_settingName; + if (prev_key) { + config.custom[prev_key] = new_settingName; + } + if (new_key) { + config.custom[new_key] = prev_settingName; + } return true; } @@ -161,7 +171,9 @@ export function deleteBind(config, settingName) { if (config.blacklist.includes(key)) { return false; } - config.custom[key] = -1; + if (key) { + config.custom[key] = -1; + } return true; } diff --git a/src/configs/inputs/pad_procon.ts b/src/configs/inputs/pad_procon.ts index 8cb707f882a..be751cc3acc 100644 --- a/src/configs/inputs/pad_procon.ts +++ b/src/configs/inputs/pad_procon.ts @@ -1,4 +1,4 @@ -import {SettingGamepad} from "#app/system/settings/settings-gamepad.js"; +import {SettingGamepad} from "#app/system/settings/settings-gamepad"; import {Button} from "#enums/buttons"; /** diff --git a/src/data/ability.ts b/src/data/ability.ts index 988496e1316..16649bcd2c2 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,22 +1,19 @@ -import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; +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 { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +import { getPokemonNameWithAffix } from "../messages"; import { Weather, WeatherType } from "./weather"; -import { BattlerTag, GroundedTag } from "./battler-tags"; +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 } 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 } from "./pokemon-forms"; +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"; @@ -26,6 +23,12 @@ 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 { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; +import BattleScene from "#app/battle-scene"; export class Ability implements Localizable { public id: Abilities; @@ -120,9 +123,9 @@ export class Ability implements Localizable { type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean | Promise; type AbAttrCondition = (pokemon: Pokemon) => boolean; -type PokemonAttackCondition = (user: Pokemon, target: Pokemon, move: Move) => 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; @@ -132,11 +135,11 @@ export abstract class AbAttr { this.showAbility = showAbility; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { return false; } - getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + getTriggerMessage(_pokemon: Pokemon, _abilityName: string, ..._args: any[]): string | null { return null; } @@ -151,7 +154,7 @@ export abstract class AbAttr { } export class BlockRecoilDamageAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; return true; @@ -167,7 +170,7 @@ export class DoubleBattleChanceAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const doubleChance = (args[0] as Utils.IntegerHolder); doubleChance.value = Math.max(doubleChance.value / 2, 1); return true; @@ -175,7 +178,7 @@ export class DoubleBattleChanceAbAttr extends AbAttr { } export class PostBattleInitAbAttr extends AbAttr { - applyPostBattleInit(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { return false; } } @@ -189,9 +192,9 @@ export class PostBattleInitFormChangeAbAttr extends PostBattleInitAbAttr { this.formFunc = formFunc; } - applyPostBattleInit(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { + if (formIndex !== pokemon.formIndex && !simulated) { return pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); } @@ -199,37 +202,37 @@ 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, args: any[]): boolean { - const statChangePhases: StatChangePhase[] = []; + applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const statStageChangePhases: StatStageChangePhase[] = []; - if (this.selfTarget) { - statChangePhases.push(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels)); - } else { - for (const opponent of pokemon.getOpponents()) { - statChangePhases.push(new StatChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.levels)); + if (!simulated) { + if (this.selfTarget) { + statStageChangePhases.push(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages)); + } else { + for (const opponent of pokemon.getOpponents()) { + 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); - } else { // TODO: This causes the ability bar to be shown at the wrong time - pokemon.scene.unshiftPhase(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(statStageChangePhase); + } } } @@ -240,36 +243,17 @@ export class PostBattleInitStatChangeAbAttr extends PostBattleInitAbAttr { type PreDefendAbAttrCondition = (pokemon: Pokemon, attacker: Pokemon, move: Move) => boolean; export class PreDefendAbAttr extends AbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { return false; } } -export class PreDefendFormChangeAbAttr extends PreDefendAbAttr { - private formFunc: (p: Pokemon) => integer; - - constructor(formFunc: ((p: Pokemon) => integer)) { - super(true); - - this.formFunc = formFunc; - } - - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - return true; - } - - return false; - } -} export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (pokemon.hp === pokemon.getMaxHp() && - pokemon.getMaxHp() > 1 && //Checks if pokemon has wonder_guard (which forces 1hp) - (args[0] as Utils.NumberHolder).value >= pokemon.hp) { //Damage >= hp - return pokemon.addTag(BattlerTagType.STURDY, 1); + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (pokemon.isFullHp() + && pokemon.getMaxHp() > 1 //Checks if pokemon has wonder_guard (which forces 1hp) + && (args[0] as Utils.NumberHolder).value >= pokemon.hp) { //Damage >= hp + return simulated || pokemon.addTag(BattlerTagType.STURDY, 1); } return false; @@ -277,19 +261,22 @@ export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { } export class BlockItemTheftAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents item theft!`); + return i18next.t("abilityTriggers:blockItemTheft", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName + }); } } export class StabBoostAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if ((args[0] as Utils.NumberHolder).value > 1) { (args[0] as Utils.NumberHolder).value += 0.5; return true; @@ -310,9 +297,9 @@ export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { this.damageMultiplier = damageMultiplier; } - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value = Math.floor((args[0] as Utils.NumberHolder).value * this.damageMultiplier); + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue((args[0] as Utils.NumberHolder).value * this.damageMultiplier); return true; } @@ -323,22 +310,7 @@ export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultiplierAbAttr { constructor(moveType: Type, damageMultiplier: number) { - super((user, target, move) => move.type === moveType, damageMultiplier); - } -} - -export class PreDefendMoveDamageToOneAbAttr extends ReceivedMoveDamageMultiplierAbAttr { - constructor(condition: PokemonDefendCondition) { - super(condition, 1); - } - - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value = Math.floor(pokemon.getMaxHp() / 8); - return true; - } - - return false; + super((target, user, move) => user.getMoveType(move) === moveType, damageMultiplier); } } @@ -349,61 +321,76 @@ export class PreDefendMoveDamageToOneAbAttr extends ReceivedMoveDamageMultiplier * @see {@linkcode getCondition} */ export class TypeImmunityAbAttr extends PreDefendAbAttr { - private immuneType: Type; - private condition: AbAttrCondition; + private immuneType: Type | null; + private condition: AbAttrCondition | null; - constructor(immuneType: Type, condition?: AbAttrCondition) { + constructor(immuneType: Type | null, condition?: AbAttrCondition) { super(); this.immuneType = immuneType; - this.condition = condition; + this.condition = condition ?? null; } /** * Applies immunity if this ability grants immunity to the type of the given move. - * @param pokemon {@linkcode Pokemon} the defending Pokemon - * @param passive N/A - * @param attacker {@linkcode Pokemon} the attacking Pokemon - * @param move {@linkcode Move} the attacking move - * @param cancelled N/A + * @param pokemon {@linkcode Pokemon} The defending Pokemon. + * @param passive - Whether the ability is passive. + * @param attacker {@linkcode Pokemon} The attacking Pokemon. + * @param move {@linkcode Move} The attacking move. + * @param cancelled {@linkcode Utils.BooleanHolder} - A holder for a boolean value indicating if the move was cancelled. * @param args [0] {@linkcode Utils.NumberHolder} gets set to 0 if move is immuned by an ability. - * @param args [1] {@linkcode Utils.NumberHolder} type of move being defended against in case it has changed from default type + * @param args [1] - Whether the move is simulated. */ - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { // Field moves should ignore immunity if ([ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget)) { return false; } - - if (attacker !== pokemon && move.type === this.immuneType) { + if (attacker !== pokemon && attacker.getMoveType(move) === this.immuneType) { (args[0] as Utils.NumberHolder).value = 0; return true; } - return false; } - getCondition(): AbAttrCondition { + override getCondition(): AbAttrCondition | null { return this.condition; } } +export class AttackTypeImmunityAbAttr extends TypeImmunityAbAttr { + constructor(immuneType: Type, condition?: AbAttrCondition) { + super(immuneType, condition); + } + + /** + * Applies immunity if the move used is not a status move. + * Type immunity abilities that do not give additional benefits (HP recovery, stat boosts, etc) are not immune to status moves of the type + * Example: Levitate + */ + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + // this is a hacky way to fix the Levitate/Thousand Arrows interaction, but it works for now... + if (move.category !== MoveCategory.STATUS && !move.hasAttr(NeutralDamageAgainstFlyingTypeMultiplierAttr)) { + return super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } + return false; + } +} + export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { constructor(immuneType: Type) { super(immuneType); } - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); + 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) { - if (pokemon.getHpRatio() < 1) { - const simulated = args.length > 1 && args[1]; - if (!simulated) { - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 4), 1), getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP a little!`), true)); - } + if (!pokemon.isFullHp() && !simulated) { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 4), i18next.t("abilityTriggers:typeImmunityHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); + cancelled.value = true; // Suppresses "No Effect" message } return true; } @@ -412,25 +399,24 @@ 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, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); + 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) { - cancelled.value = true; - const simulated = args.length > 1 && args[1]; + 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)); } } @@ -449,12 +435,11 @@ class TypeImmunityAddBattlerTagAbAttr extends TypeImmunityAbAttr { this.turnCount = turnCount; } - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); + 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) { - cancelled.value = true; - const simulated = args.length > 1 && args[1]; + cancelled.value = true; // Suppresses "No Effect" message if (!simulated) { pokemon.addTag(this.tagType, this.turnCount, undefined, pokemon.id); } @@ -469,9 +454,9 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { super(null, condition); } - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (move instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.type, attacker) < 2) { - cancelled.value = true; + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (move instanceof AttackMove && pokemon.getAttackTypeEffectiveness(attacker.getMoveType(move), attacker) < 2) { + cancelled.value = true; // Suppresses "No Effect" message (args[0] as Utils.NumberHolder).value = 0; return true; } @@ -480,62 +465,114 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, ` avoided damage\nwith ${abilityName}!`); + return i18next.t("abilityTriggers:nonSuperEffectiveImmunity", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName + }); + } +} + +/** + * 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, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { return false; } } -export class PostDefendDisguiseAbAttr extends PostDefendAbAttr { - - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (pokemon.formIndex === 0 && pokemon.battleData.hitCount !== 0 && (move.category === MoveCategory.SPECIAL || move.category === MoveCategory.PHYSICAL)) { - - const recoilDamage = Math.ceil((pokemon.getMaxHp() / 8) - attacker.turnData.damageDealt); - if (!recoilDamage) { - return false; - } - pokemon.damageAndUpdate(recoilDamage, HitResult.OTHER); - pokemon.turnData.damageTaken += recoilDamage; - pokemon.scene.queueMessage(getPokemonMessage(pokemon, "'s disguise was busted!")); - return true; - } - - return false; - } -} - -export class PostDefendFormChangeAbAttr extends PostDefendAbAttr { - private formFunc: (p: Pokemon) => integer; - - constructor(formFunc: ((p: Pokemon) => integer)) { +/** + * Applies the effects of Gulp Missile when the user is hit by an attack. + * @extends PostDefendAbAttr + */ +export class PostDefendGulpMissileAbAttr extends PostDefendAbAttr { + constructor() { super(true); - - this.formFunc = formFunc; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + /** + * Damages the attacker and triggers the secondary effect based on the form or the BattlerTagType. + * @param {Pokemon} pokemon - The defending Pokemon. + * @param passive - n/a + * @param {Pokemon} attacker - The attacking Pokemon. + * @param {Move} move - The move being used. + * @param {HitResult} hitResult - n/a + * @param {any[]} args - n/a + * @returns Whether the effects of the ability are applied. + */ + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise { + const battlerTag = pokemon.getTag(GulpMissileTag); + if (!battlerTag || move.category === MoveCategory.STATUS || pokemon.getTag(SemiInvulnerableTag)) { + return false; + } + + if (simulated) { return true; } - return false; + const cancelled = new Utils.BooleanHolder(false); + applyAbAttrs(BlockNonDirectDamageAbAttr, attacker, cancelled); + + if (!cancelled.value) { + attacker.damageAndUpdate(Math.max(1, Math.floor(attacker.getMaxHp() / 4)), HitResult.OTHER); + } + + if (battlerTag.tagType === BattlerTagType.GULP_MISSILE_ARROKUDA) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ Stat.DEF ], -1)); + } else { + attacker.trySetStatus(StatusEffect.PARALYSIS, true, pokemon); + } + + pokemon.removeTag(battlerTag.tagType); + return true; } } export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { const attackPriority = new Utils.IntegerHolder(move.priority); - applyMoveAttrs(IncrementMovePriorityAttr,attacker,null,move,attackPriority); - applyAbAttrs(IncrementMovePriorityAbAttr, attacker, null, move, attackPriority); + applyMoveAttrs(IncrementMovePriorityAttr, attacker, null, move, attackPriority); + applyAbAttrs(ChangeMovePriorityAbAttr, attacker, null, simulated, move, attackPriority); - if (move.moveTarget===MoveTarget.USER || move.moveTarget===MoveTarget.NEAR_ALLY) { + if (move.moveTarget === MoveTarget.USER || move.moveTarget === MoveTarget.NEAR_ALLY) { return false; } @@ -548,8 +585,8 @@ export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { } } -export class PostStatChangeAbAttr extends AbAttr { - applyPostStatChange(pokemon: Pokemon, 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; } } @@ -563,7 +600,7 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { this.immuneCondition = immuneCondition; } - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.immuneCondition(pokemon, attacker, move)) { cancelled.value = true; return true; @@ -573,7 +610,7 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return `It doesn\'t affect ${pokemon.name}!`; + return i18next.t("abilityTriggers:moveImmunity", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } @@ -584,7 +621,7 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { * @extends PreDefendAbAttr */ export class WonderSkinAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { const moveAccuracy = args[0] as Utils.NumberHolder; if (move.category === MoveCategory.STATUS && moveAccuracy.value >= 50) { moveAccuracy.value = 50; @@ -595,23 +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, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); - if (ret) { - const simulated = args.length > 1 && args[1]; - if (!simulated) { - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); - } + 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 StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); } return ret; @@ -635,42 +669,48 @@ export class ReverseDrainAbAttr extends PostDefendAbAttr { * @args N/A * @returns true if healing should be reversed on a healing move, false otherwise. */ - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.hasAttr(HitHealAttr)) { - pokemon.scene.queueMessage(getPokemonMessage(attacker, " sucked up the liquid ooze!")); + if (!simulated) { + pokemon.scene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) })); + } return true; } return false; } } -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; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { + if (simulated) { + return true; + } + 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; } @@ -678,30 +718,32 @@ 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; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { const hpGateFlat: integer = Math.ceil(pokemon.getMaxHp() * this.hpGate); const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1]; const damageReceived = lastAttackReceived?.damage || 0; if (this.condition(pokemon, attacker, move) && (pokemon.hp <= hpGateFlat && (pokemon.hp + damageReceived) > hpGateFlat)) { - 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; } @@ -720,11 +762,13 @@ export class PostDefendApplyArenaTrapTagAbAttr extends PostDefendAbAttr { this.tagType = tagType; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { const tag = pokemon.scene.arena.getTag(this.tagType) as ArenaTrapTag; if (!pokemon.scene.arena.getTag(this.tagType) || tag.layers < tag.maxLayers) { - pokemon.scene.arena.addTag(this.tagType, 0, undefined, pokemon.id, pokemon.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); + if (!simulated) { + pokemon.scene.arena.addTag(this.tagType, 0, undefined, pokemon.id, pokemon.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); + } return true; } } @@ -742,11 +786,11 @@ export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr { this.tagType = tagType; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { - if (!pokemon.getTag(this.tagType)) { + if (!pokemon.getTag(this.tagType) && !simulated) { pokemon.addTag(this.tagType, undefined, undefined, pokemon.id); - pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: pokemon.name, moveName: move.name })); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name })); } return true; } @@ -755,9 +799,12 @@ export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr { } export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (hitResult < HitResult.NO_EFFECT) { - const type = move.type; + if (simulated) { + return true; + } + const type = attacker.getMoveType(move); const pokemonTypes = pokemon.getTypes(true); if (pokemonTypes.length !== 1 || pokemonTypes[0] !== type) { pokemon.summonData.types = [ type ]; @@ -769,7 +816,11 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nmade it the ${Utils.toReadableString(Type[pokemon.getTypes(true)[0]])} type!`); + return i18next.t("abilityTriggers:postDefendTypeChange", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName, + typeName: i18next.t(`pokemonInfo:Type.${Type[pokemon.getTypes(true)[0]]}`) + }); } } @@ -782,9 +833,13 @@ export class PostDefendTerrainChangeAbAttr extends PostDefendAbAttr { this.terrainType = terrainType; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (hitResult < HitResult.NO_EFFECT) { - return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + if (simulated) { + return pokemon.scene.arena.terrain?.terrainType !== (this.terrainType || undefined); + } else { + return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + } } return false; @@ -792,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[]) { @@ -802,10 +857,14 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr { this.effects = effects; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - return attacker.trySetStatus(effect, true, pokemon); + if (simulated) { + return attacker.canSetStatus(effect, true, false, pokemon); + } else { + return attacker.trySetStatus(effect, true, pokemon); + } } return false; @@ -817,18 +876,18 @@ export class EffectSporeAbAttr extends PostDefendContactApplyStatusEffectAbAttr super(10, StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP); } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(Type.GRASS)) { return false; } - return super.applyPostDefend(pokemon, passive, attacker, move, hitResult, args); + return super.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args); } } export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { private chance: integer; private tagType: BattlerTagType; - private turnCount: integer; + private turnCount: integer | undefined; constructor(chance: integer, tagType: BattlerTagType, turnCount?: integer) { super(); @@ -838,34 +897,40 @@ export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { this.turnCount = turnCount; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance) { - return attacker.addTag(this.tagType, this.turnCount, move.id, attacker.id); + if (simulated) { + return attacker.canAddTag(this.tagType); + } else { + return attacker.addTag(this.tagType, this.turnCount, move.id, attacker.id); + } } return false; } } -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, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + if (!simulated) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); + } return true; } getCondition(): AbAttrCondition { - return (pokemon: Pokemon) => pokemon.turnData.attacksReceived.length && pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1].critical; + return (pokemon: Pokemon) => pokemon.turnData.attacksReceived.length !== 0 && pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1].critical; } } @@ -878,10 +943,10 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { this.damageRatio = damageRatio; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { - attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); - attacker.turnData.damageTaken += Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)); + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + if (!simulated && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); return true; } @@ -889,7 +954,10 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nhurt its attacker!`); + return i18next.t("abilityTriggers:postDefendContactDamage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName + }); } } /** @@ -908,13 +976,15 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr { this.turns = turns; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { if (pokemon.getTag(BattlerTagType.PERISH_SONG) || attacker.getTag(BattlerTagType.PERISH_SONG)) { return false; } else { - attacker.addTag(BattlerTagType.PERISH_SONG, this.turns); - pokemon.addTag(BattlerTagType.PERISH_SONG, this.turns); + if (!simulated) { + attacker.addTag(BattlerTagType.PERISH_SONG, this.turns); + pokemon.addTag(BattlerTagType.PERISH_SONG, this.turns); + } return true; } } @@ -928,15 +998,23 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr { export class PostDefendWeatherChangeAbAttr extends PostDefendAbAttr { private weatherType: WeatherType; + protected condition: PokemonDefendCondition | null; - constructor(weatherType: WeatherType) { + constructor(weatherType: WeatherType, condition?: PokemonDefendCondition) { super(); this.weatherType = weatherType; + this.condition = condition ?? null; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + if (this.condition !== null && !this.condition(pokemon, attacker, move)) { + return false; + } if (!pokemon.scene.arena.weather?.isImmutable()) { + if (simulated) { + return pokemon.scene.arena.weather?.weatherType !== this.weatherType; + } return pokemon.scene.arena.trySetWeather(this.weatherType, true); } @@ -949,11 +1027,13 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { super(); } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr)) { - const tempAbilityId = attacker.getAbility().id; - attacker.summonData.ability = pokemon.getAbility().id; - pokemon.summonData.ability = tempAbilityId; + if (!simulated) { + const tempAbilityId = attacker.getAbility().id; + attacker.summonData.ability = pokemon.getAbility().id; + pokemon.summonData.ability = tempAbilityId; + } return true; } @@ -961,7 +1041,7 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, " swapped\nabilities with its target!"); + return i18next.t("abilityTriggers:postDefendAbilitySwap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } @@ -973,9 +1053,11 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { this.ability = ability; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr)) { - attacker.summonData.ability = this.ability; + if (!simulated) { + attacker.summonData.ability = this.ability; + } return true; } @@ -984,7 +1066,10 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, ` gave its target\n${abilityName}!`); + return i18next.t("abilityTriggers:postDefendAbilityGive", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName + }); } } @@ -999,41 +1084,41 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr { this.chance = chance; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (!attacker.summonData.disabledMove) { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + if (attacker.getTag(BattlerTagType.DISABLED) === null) { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !attacker.isMax()) { + if (simulated) { + return true; + } + this.attacker = attacker; this.move = move; - - attacker.summonData.disabledMove = move.id; - attacker.summonData.disabledTurns = 4; + this.attacker.addTag(BattlerTagType.DISABLED, 4, 0, pokemon.id); return true; } } return false; } - - getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(this.attacker, `'s ${this.move.name}\nwas disabled!`); - } } -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, statsChanged: BattleStat[], levelsChanged: integer, selfTarget: boolean, args: any[]): boolean { - if (this.condition(pokemon, statsChanged, levelsChanged) && !selfTarget) { - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, (pokemon).getBattlerIndex(), true, this.statsToChange, this.levels)); + 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 StatStageChangePhase(pokemon.scene, (pokemon).getBattlerIndex(), true, this.statsToChange, this.stages)); + } return true; } @@ -1042,7 +1127,7 @@ export class PostStatChangeStatChangeAbAttr extends PostStatChangeAbAttr { } export class PreAttackAbAttr extends AbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean | Promise { + applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean | Promise { return false; } } @@ -1055,7 +1140,7 @@ export class PreAttackAbAttr extends AbAttr { export class MoveEffectChanceMultiplierAbAttr extends AbAttr { private chanceMultiplier: number; - constructor(chanceMultiplier?: number) { + constructor(chanceMultiplier: number) { super(true); this.chanceMultiplier = chanceMultiplier; } @@ -1063,8 +1148,9 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { * @param args [0]: {@linkcode Utils.NumberHolder} Move additional effect chance. Has to be higher than or equal to 0. * [1]: {@linkcode Moves } Move used by the ability user. */ - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + // Disable showAbility during getTargetBenefitScore + this.showAbility = args[4]; if ((args[0] as Utils.NumberHolder).value <= 0 || (args[1] as Move).id === Moves.ORDER_UP) { return false; } @@ -1085,7 +1171,7 @@ export class IgnoreMoveEffectsAbAttr extends PreDefendAbAttr { /** * @param args [0]: {@linkcode Utils.NumberHolder} Move additional effect chance. */ - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { if ((args[0] as Utils.NumberHolder).value <= 0) { return false; @@ -1098,27 +1184,27 @@ export class IgnoreMoveEffectsAbAttr extends PreDefendAbAttr { } export class VariableMovePowerAbAttr extends PreAttackAbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { //const power = args[0] as Utils.NumberHolder; return false; } } export class FieldPreventExplosiveMovesAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { cancelled.value = true; return true; } } /** - * 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; @@ -1132,7 +1218,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 @@ -1142,12 +1228,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, 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; @@ -1157,7 +1243,7 @@ export class FieldMultiplyBattleStatAbAttr extends AbAttr { } -export class MoveTypeChangeAttr extends PreAttackAbAttr { +export class MoveTypeChangeAbAttr extends PreAttackAbAttr { constructor( private newType: Type, private powerMultiplier: number, @@ -1166,11 +1252,14 @@ export class MoveTypeChangeAttr extends PreAttackAbAttr { super(true); } - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + // TODO: Decouple this into two attributes (type change / power boost) + applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if (this.condition && this.condition(pokemon, defender, move)) { - move.type = this.newType; if (args[0] && args[0] instanceof Utils.NumberHolder) { - args[0].value *= this.powerMultiplier; + args[0].value = this.newType; + } + if (args[1] && args[1] instanceof Utils.NumberHolder) { + args[1].value *= this.powerMultiplier; } return true; } @@ -1187,7 +1276,7 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { super(true); } - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if ( !pokemon.isTerastallized() && move.id !== Moves.STRUGGLE && @@ -1202,22 +1291,14 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { attr instanceof CopyMoveAttr ) ) { - // TODO remove this copy when phase order is changed so that damage, type, category, etc. - // TODO are all calculated prior to playing the move animation. - const moveCopy = new Move(move.id, move.type, move.category, move.moveTarget, move.power, move.accuracy, move.pp, move.chance, move.priority, move.generation); - moveCopy.attrs = move.attrs; + const moveType = pokemon.getMoveType(move); - // Moves like Weather Ball ignore effects of abilities like Normalize and Refrigerate - if (move.findAttr(attr => attr instanceof VariableMoveTypeAttr)) { - applyMoveAttrs(VariableMoveTypeAttr, pokemon, null, moveCopy); - } else { - applyPreAttackAbAttrs(MoveTypeChangeAttr, pokemon, null, moveCopy); - } - - if (pokemon.getTypes().some((t) => t !== moveCopy.type)) { - this.moveType = moveCopy.type; - pokemon.summonData.types = [moveCopy.type]; - pokemon.updateInfo(); + if (pokemon.getTypes().some((t) => t !== moveType)) { + if (!simulated) { + this.moveType = moveType; + pokemon.summonData.types = [moveType]; + pokemon.updateInfo(); + } return true; } @@ -1227,7 +1308,10 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, ` transformed into the ${Type[this.moveType]} type!`); + return i18next.t("abilityTriggers:pokemonTypeChange", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveType: i18next.t(`pokemonInfo:Type.${Type[this.moveType]}`), + }); } } @@ -1290,12 +1374,13 @@ export class AddSecondStrikeAbAttr extends PreAttackAbAttr { * @param {Utils.NumberHolder} args\[2\] the damage multiplier for the current strike * @returns */ - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { const numTargets = args[0] as integer; const hitCount = args[1] as Utils.IntegerHolder; const multiplier = args[2] as Utils.NumberHolder; if (this.canApplyPreAttack(move, numTargets)) { + this.showAbility = !!hitCount?.value; if (!!hitCount?.value) { hitCount.value *= 2; } @@ -1334,7 +1419,7 @@ export class DamageBoostAbAttr extends PreAttackAbAttr { * @param args Utils.NumberHolder as damage * @returns true if the function succeeds */ - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if (this.condition(pokemon, defender, move)) { const power = args[0] as Utils.NumberHolder; power.value = Math.floor(power.value * this.damageMultiplier); @@ -1355,7 +1440,7 @@ export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr { this.powerMultiplier = powerMultiplier; } - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if (this.condition(pokemon, defender, move)) { (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; @@ -1368,7 +1453,7 @@ export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr { export class MoveTypePowerBoostAbAttr extends MovePowerBoostAbAttr { constructor(boostedType: Type, powerMultiplier?: number) { - super((pokemon, defender, move) => move.type === boostedType, powerMultiplier || 1.5); + super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5); } } @@ -1402,7 +1487,7 @@ export class VariableMovePowerBoostAbAttr extends VariableMovePowerAbAttr { /** * @override */ - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move, args: any[]): boolean { + applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move, args: any[]): boolean { const multiplier = this.mult(pokemon, defender, move); if (multiplier !== 1) { (args[0] as Utils.NumberHolder).value *= multiplier; @@ -1431,7 +1516,7 @@ export class FieldMovePowerBoostAbAttr extends AbAttr { this.powerMultiplier = powerMultiplier; } - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + applyPreAttack(pokemon: Pokemon | null, passive: boolean | null, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { if (this.condition(pokemon, defender, move)) { (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; @@ -1452,7 +1537,7 @@ export class PreAttackFieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostA * @param powerMultiplier - The multiplier to apply to the move's power, defaults to 1.5 if not provided. */ constructor(boostedType: Type, powerMultiplier?: number) { - super((pokemon, defender, move) => move.type === boostedType, powerMultiplier || 1.5); + super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5); } } @@ -1482,22 +1567,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; + 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; + this.condition = condition ?? null; } - applyBattleStat(pokemon: Pokemon, passive: 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; } @@ -1507,42 +1592,69 @@ export class BattleStatMultiplierAbAttr extends AbAttr { } export class PostAttackAbAttr extends AbAttr { - applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise { + private attackCondition: PokemonAttackCondition; + + /** The default attackCondition requires that the selected move is a damaging move */ + constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS)) { + super(); + + this.attackCondition = attackCondition; + } + + /** + * Please override {@link applyPostAttackAfterMoveTypeCheck} instead of this method. By default, this method checks that the move used is a damaging attack before + * applying the effect of any inherited class. This can be changed by providing a different {@link attackCondition} to the constructor. See {@link ConfusionOnStatusEffectAbAttr} + * for an example of an effect that does not require a damaging move. + */ + applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + // When attackRequired is true, we require the move to be an attack move and to deal damage before checking secondary requirements. + // If attackRequired is false, we always defer to the secondary requirements. + if (this.attackCondition(pokemon, defender, move)) { + return this.applyPostAttackAfterMoveTypeCheck(pokemon, passive, simulated, defender, move, hitResult, args); + } else { + return false; + } + } + + /** + * This method is only called after {@link applyPostAttack} has already been applied. Use this for handling checks specific to the ability in question. + */ + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { return false; } } export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { - private condition: PokemonAttackCondition; + private stealCondition: PokemonAttackCondition | null; - constructor(condition?: PokemonAttackCondition) { + constructor(stealCondition?: PokemonAttackCondition) { super(); - this.condition = condition; + this.stealCondition = stealCondition ?? null; } - applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { return new Promise(resolve => { - if (hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, defender, move))) { - const heldItems = this.getTargetHeldItems(defender).filter(i => i.getTransferrable(false)); + if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.stealCondition || this.stealCondition(pokemon, defender, move))) { + const heldItems = this.getTargetHeldItems(defender).filter(i => i.isTransferrable); if (heldItems.length) { const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { if (success) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` stole\n${defender.name}'s ${stolenItem.type.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postAttackStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), defenderName: defender.name, stolenItemType: stolenItem.type.name })); } resolve(success); }); return; } } - resolve(false); + resolve(simulated); }); } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } } @@ -1559,14 +1671,14 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr { this.effects = effects; } - applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { /**Status inflicted by abilities post attacking are also considered additional effects.*/ - if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { + if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !simulated && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; return attacker.trySetStatus(effect, true, pokemon); } - return false; + return simulated; } } @@ -1590,11 +1702,11 @@ export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr { this.effects = effects; } - applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { /**Battler tags inflicted by abilities post attacking are also considered additional effects.*/ if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - return attacker.addTag(effect); + return simulated || attacker.addTag(effect); } return false; @@ -1602,36 +1714,36 @@ export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr { } export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { - private condition: PokemonDefendCondition; + private condition: PokemonDefendCondition | null; constructor(condition?: PokemonDefendCondition) { super(); - this.condition = condition; + this.condition = condition ?? null; } - applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { + applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { return new Promise(resolve => { - if (hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move))) { - const heldItems = this.getTargetHeldItems(attacker).filter(i => i.getTransferrable(false)); + if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move))) { + const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferrable); if (heldItems.length) { const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { if (success) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` stole\n${attacker.name}'s ${stolenItem.type.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), attackerName: attacker.name, stolenItemType: stolenItem.type.name })); } resolve(success); }); return; } } - resolve(false); + resolve(simulated); }); } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } } @@ -1651,7 +1763,7 @@ export class PostSetStatusAbAttr extends AbAttr { */ applyPostSetStatus( pokemon: Pokemon, - sourcePokemon: Pokemon = null, + sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, args: any[]) : boolean | Promise { @@ -1677,7 +1789,7 @@ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { */ applyPostSetStatus( pokemon: Pokemon, - sourcePokemon: Pokemon = null, + sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, args: any[]): boolean { @@ -1699,28 +1811,29 @@ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { } export class PostVictoryAbAttr extends AbAttr { - applyPostVictory(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { return false; } } -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, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.levels)); - + if (!simulated) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.stages)); + } return true; } } @@ -1734,10 +1847,12 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { this.formFunc = formFunc; } - applyPostVictory(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + if (!simulated) { + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + } return true; } @@ -1746,28 +1861,29 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { } export class PostKnockOutAbAttr extends AbAttr { - applyPostKnockOut(pokemon: Pokemon, passive: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { return false; } } -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, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.levels)); - + if (!simulated) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.stages)); + } return true; } } @@ -1777,10 +1893,12 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { super(); } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { if (pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr)) { - pokemon.summonData.ability = knockedOut.getAbility().id; - pokemon.scene.queueMessage(getPokemonMessage(knockedOut, `'s ${allAbilities[knockedOut.getAbility().id].name} was taken over!`)); + if (!simulated) { + pokemon.summonData.ability = knockedOut.getAbility().id; + pokemon.scene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); + } return true; } @@ -1788,37 +1906,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, 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, 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; } } @@ -1827,30 +1929,35 @@ export class IntimidateImmunityAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName} prevented it from being Intimidated!`); + return i18next.t("abilityTriggers:intimidateImmunity", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName + }); } } -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, cancelled: Utils.BooleanHolder, args: any[]): boolean { - pokemon.scene.pushPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, this.levels)); + apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!simulated) { + pokemon.scene.pushPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, this.stages)); + } cancelled.value = this.overwrites; return true; } @@ -1868,7 +1975,7 @@ export class PostSummonAbAttr extends AbAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { return false; } } @@ -1887,9 +1994,11 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { this.arenaTags = arenaTags; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { - for (const arenaTag of this.arenaTags) { - pokemon.scene.arena.removeTag(arenaTag); + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + if (!simulated) { + for (const arenaTag of this.arenaTags) { + pokemon.scene.arena.removeTag(arenaTag); + } } return true; } @@ -1904,8 +2013,10 @@ export class PostSummonMessageAbAttr extends PostSummonAbAttr { this.messageFunc = messageFunc; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - pokemon.scene.queueMessage(this.messageFunc(pokemon)); + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!simulated) { + pokemon.scene.queueMessage(this.messageFunc(pokemon)); + } return true; } @@ -1921,8 +2032,10 @@ export class PostSummonUnnamedMessageAbAttr extends PostSummonAbAttr { this.message = message; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - pokemon.scene.queueMessage(this.message); + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!simulated) { + pokemon.scene.queueMessage(this.message); + } return true; } @@ -1939,45 +2052,50 @@ export class PostSummonAddBattlerTagAbAttr extends PostSummonAbAttr { this.turnCount = turnCount; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - return pokemon.addTag(this.tagType, this.turnCount); + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (simulated) { + return pokemon.canAddTag(this.tagType); + } else { + return pokemon.addTag(this.tagType, this.turnCount); + } } } -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; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (simulated) { + return true; + } + 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); - applyAbAttrs(PostIntimidateStatChangeAbAttr, opponent, cancelled); + applyAbAttrs(IntimidateImmunityAbAttr, 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; @@ -1995,11 +2113,14 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr { this.showAnim = showAnim; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const target = pokemon.getAlly(); if (target?.isActive(true)) { - target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / this.healRatio), 1), getPokemonMessage(target, ` drank down all the\nmatcha that ${pokemon.name} made!`), true, !this.showAnim)); + if (!simulated) { + target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / this.healRatio), i18next.t("abilityTriggers:postSummonAllyHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(target), pokemonName: pokemon.name }), true, !this.showAnim)); + } + return true; } @@ -2015,19 +2136,21 @@ 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(); } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const target = pokemon.getAlly(); if (target?.isActive(true)) { - for (let s = 0; s < target.summonData.battleStats.length; s++) { - target.summonData.battleStats[s] = 0; - } + if (!simulated) { + for (const s of BATTLE_STATS) { + target.setStatStage(s, 0); + } - target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere removed!")); + target.scene.queueMessage(i18next.t("abilityTriggers:postSummonClearAllyStats", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + } return true; } @@ -2052,33 +2175,35 @@ 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 * @returns Returns true if ability is used successful, false if not. */ - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { this.enemyDef = 0; this.enemySpDef = 0; this.enemyCountTally = 0; 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 - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, 1)); + if (!simulated) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, 1)); + } return true; } @@ -2095,11 +2220,15 @@ export class PostSummonWeatherChangeAbAttr extends PostSummonAbAttr { this.weatherType = weatherType; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if ((this.weatherType === WeatherType.HEAVY_RAIN || this.weatherType === WeatherType.HARSH_SUN || this.weatherType === WeatherType.STRONG_WINDS) || !pokemon.scene.arena.weather?.isImmutable()) { - return pokemon.scene.arena.trySetWeather(this.weatherType, true); + if (simulated) { + return pokemon.scene.arena.weather?.weatherType !== this.weatherType; + } else { + return pokemon.scene.arena.trySetWeather(this.weatherType, true); + } } return false; @@ -2115,8 +2244,12 @@ export class PostSummonTerrainChangeAbAttr extends PostSummonAbAttr { this.terrainType = terrainType; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (simulated) { + return pokemon.scene.arena.terrain?.terrainType !== this.terrainType; + } else { + return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + } } } @@ -2129,10 +2262,10 @@ export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { this.formFunc = formFunc; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { - return pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + return simulated || pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); } return false; @@ -2144,7 +2277,7 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { private target: Pokemon; private targetAbilityName: string; - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); if (!targets.length) { return false; @@ -2158,18 +2291,20 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { } if ( - target.getAbility().hasAttr(UncopiableAbilityAbAttr) && + target!.getAbility().hasAttr(UncopiableAbilityAbAttr) && // Wonder Guard is normally uncopiable so has the attribute, but Trace specifically can copy it - !(pokemon.hasAbility(Abilities.TRACE) && target.getAbility().id === Abilities.WONDER_GUARD) + !(pokemon.hasAbility(Abilities.TRACE) && target!.getAbility().id === Abilities.WONDER_GUARD) ) { return false; } - this.target = target; - this.targetAbilityName = allAbilities[target.getAbility().id].name; - pokemon.summonData.ability = target.getAbility().id; - setAbilityRevealed(target); - pokemon.updateInfo(); + if (!simulated) { + this.target = target!; + this.targetAbilityName = allAbilities[target!.getAbility().id].name; + pokemon.summonData.ability = target!.getAbility().id; + setAbilityRevealed(target!); + pokemon.updateInfo(); + } return true; } @@ -2183,21 +2318,69 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { } } +/** + * Removes supplied status effects from the user's field. + */ +export class PostSummonUserFieldRemoveStatusEffectAbAttr extends PostSummonAbAttr { + private statusEffect: StatusEffect[]; + + /** + * @param statusEffect - The status effects to be removed from the user's field. + */ + constructor(...statusEffect: StatusEffect[]) { + super(false); + + this.statusEffect = statusEffect; + } + + /** + * Removes supplied status effect from the user's field when user of the ability is summoned. + * + * @param pokemon - The Pokémon that triggered the ability. + * @param passive - n/a + * @param args - n/a + * @returns A boolean or a promise that resolves to a boolean indicating the result of the ability application. + */ + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + const party = pokemon instanceof PlayerPokemon ? pokemon.scene.getPlayerField() : pokemon.scene.getEnemyField(); + const allowedParty = party.filter(p => p.isAllowedInBattle()); + + if (allowedParty.length < 1) { + return false; + } + + if (!simulated) { + for (const pokemon of allowedParty) { + if (pokemon.status && this.statusEffect.includes(pokemon.status.effect)) { + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + pokemon.resetStatus(false); + pokemon.updateInfo(); + } + } + } + return true; + } +} + /** Attempt to copy the stat changes on an ally pokemon */ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!pokemon.scene.currentBattle.double) { return false; } const ally = pokemon.getAlly(); - if (!ally || ally.summonData.battleStats.every((change) => change === 0)) { + if (!ally || ally.getStatStages().every(s => s === 0)) { return false; } - pokemon.summonData.battleStats = ally.summonData.battleStats; - pokemon.updateInfo(); + if (!simulated) { + for (const s of BATTLE_STATS) { + pokemon.setStatStage(s, ally.getStatStage(s)); + } + pokemon.updateInfo(); + } return true; } @@ -2215,10 +2398,10 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { super(true); } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); - if (!targets.length) { - return false; + if (simulated || !targets.length) { + return simulated; } let target: Pokemon; @@ -2228,41 +2411,128 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { target = targets[0]; } + target = target!; // compiler doesn't know its guranteed to be defined pokemon.summonData.speciesForm = target.getSpeciesForm(); pokemon.summonData.fusionSpeciesForm = target.getFusionSpeciesForm(); 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); - pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); + + // 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("PRSFX- Transform"); - pokemon.loadAssets(false).then(() => pokemon.playAnim()); + pokemon.scene.playSound("battle_anims/PRSFX- Transform"); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` transformed\ninto ${target.name}!`)); + pokemon.loadAssets(false).then(() => { + pokemon.playAnim(); + pokemon.updateInfo(); + }); + + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); return true; } } +/** + * Reverts weather-based forms to their normal forms when the user is summoned. + * Used by Cloud Nine and Air Lock. + * @extends PostSummonAbAttr + */ +export class PostSummonWeatherSuppressedFormChangeAbAttr extends PostSummonAbAttr { + /** + * Triggers {@linkcode Arena.triggerWeatherBasedFormChangesToNormal | triggerWeatherBasedFormChangesToNormal} + * @param {Pokemon} pokemon the Pokemon with this ability + * @param passive n/a + * @param args n/a + * @returns whether a Pokemon was reverted to its normal form + */ + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]) { + const pokemonToTransform = getPokemonWithWeatherBasedForms(pokemon.scene); + + if (pokemonToTransform.length < 1) { + return false; + } + + if (!simulated) { + pokemon.scene.arena.triggerWeatherBasedFormChangesToNormal(); + } + + return true; + } +} + +/** + * Triggers weather-based form change when summoned into an active weather. + * Used by Forecast and Flower Gift. + * @extends PostSummonAbAttr + */ +export class PostSummonFormChangeByWeatherAbAttr extends PostSummonAbAttr { + private ability: Abilities; + + constructor(ability: Abilities) { + super(false); + + this.ability = ability; + } + + /** + * Calls the {@linkcode BattleScene.triggerPokemonFormChange | triggerPokemonFormChange} for both + * {@linkcode SpeciesFormChange.SpeciesFormChangeWeatherTrigger | SpeciesFormChangeWeatherTrigger} and + * {@linkcode SpeciesFormChange.SpeciesFormChangeWeatherTrigger | SpeciesFormChangeRevertWeatherFormTrigger} if it + * is the specific Pokemon and ability + * @param {Pokemon} pokemon the Pokemon with this ability + * @param passive n/a + * @param args n/a + * @returns whether the form change was triggered + */ + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + 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; + } + + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeWeatherTrigger); + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeRevertWeatherFormTrigger); + queueShowAbility(pokemon, passive); + return true; + } + return false; + } +} + export class PreSwitchOutAbAttr extends AbAttr { constructor() { super(true); } - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { return false; } } export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { if (pokemon.status) { - pokemon.resetStatus(); - pokemon.updateInfo(); + if (!simulated) { + pokemon.resetStatus(); + pokemon.updateInfo(); + } + return true; } @@ -2281,8 +2551,8 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { * @param args N/A * @returns {boolean} Returns true if the weather clears, otherwise false. */ - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { - const weatherType = pokemon.scene.arena.weather.weatherType; + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + const weatherType = pokemon.scene.arena.weather?.weatherType; let turnOffWeather = false; // Clear weather only if user's ability matches the weather and no other pokemon has the ability. @@ -2307,6 +2577,10 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { break; } + if (simulated) { + return turnOffWeather; + } + if (turnOffWeather) { pokemon.scene.arena.trySetWeather(WeatherType.NONE, false); return true; @@ -2317,11 +2591,14 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { } export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { - if (pokemon.getHpRatio() < 1 ) { - const healAmount = Math.floor(pokemon.getMaxHp() * 0.33); - pokemon.heal(healAmount); - pokemon.updateInfo(); + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + if (!pokemon.isFullHp()) { + if (!simulated) { + const healAmount = Utils.toDmgValue(pokemon.getMaxHp() * 0.33); + pokemon.heal(healAmount); + pokemon.updateInfo(); + } + return true; } @@ -2350,10 +2627,12 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { * @param args N/A * @returns true if the form change was successful */ - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + if (!simulated) { + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + } return true; } @@ -2362,14 +2641,14 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { } -export class PreStatChangeAbAttr extends AbAttr { - applyPreStatChange(pokemon: Pokemon, passive: 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 { - private protectedStat: BattleStat; +export class ProtectStatAbAttr extends PreStatStageChangeAbAttr { + private protectedStat?: BattleStat; constructor(protectedStat?: BattleStat) { super(); @@ -2377,8 +2656,8 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { this.protectedStat = protectedStat; } - applyPreStatChange(pokemon: Pokemon, passive: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.protectedStat === undefined || stat === this.protectedStat) { + 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; } @@ -2386,8 +2665,12 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { return false; } - getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents lowering its ${this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : "stats"}!`); + getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { + return i18next.t("abilityTriggers:protectStat", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName, + statName: this.protectedStat ? i18next.t(getStatKey(this.protectedStat)) : i18next.t("battle:stats") + }); } } @@ -2403,7 +2686,8 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { private effects: StatusEffect[]; constructor(...effects: StatusEffect[]) { - super(); + /** This effect does not require a damaging move */ + super((user, target, move) => true); this.effects = effects; } /** @@ -2416,31 +2700,51 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { * @param args [0] {@linkcode StatusEffect} applied by move * @returns true if defender is confused */ - applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (this.effects.indexOf(args[0]) > -1 && !defender.isFainted()) { - return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedInt(3,2), move.id, defender.id); + if (simulated) { + return defender.canAddTag(BattlerTagType.CONFUSED); + } else { + return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5), move.id, defender.id); + } } return false; } } export class PreSetStatusAbAttr extends AbAttr { - applyPreSetStatus(pokemon: Pokemon, passive: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { return false; } } -export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { +/** + * Provides immunity to status effects to specified targets. + */ +export class PreSetStatusEffectImmunityAbAttr extends PreSetStatusAbAttr { private immuneEffects: StatusEffect[]; + /** + * @param immuneEffects - The status effects to which the Pokémon is immune. + */ constructor(...immuneEffects: StatusEffect[]) { super(); this.immuneEffects = immuneEffects; } - applyPreSetStatus(pokemon: Pokemon, passive: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.immuneEffects.length || this.immuneEffects.indexOf(effect) > -1) { + /** + * Applies immunity to supplied status effects. + * + * @param pokemon - The Pokémon to which the status is being applied. + * @param passive - n/a + * @param effect - The status effect being applied. + * @param cancelled - A holder for a boolean value indicating if the status application was cancelled. + * @param args - n/a + * @returns A boolean indicating the result of the status application. + */ + applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (this.immuneEffects.length < 1 || this.immuneEffects.includes(effect)) { cancelled.value = true; return true; } @@ -2449,18 +2753,43 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(args[0] as StatusEffect) : "status problems"}!`); + return this.immuneEffects.length ? + i18next.t("abilityTriggers:statusEffectImmunityWithName", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName, + statusEffectName: getStatusEffectDescriptor(args[0] as StatusEffect) + }) : + i18next.t("abilityTriggers:statusEffectImmunity", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName + }); } } +/** + * Provides immunity to status effects to the user. + * @extends PreSetStatusEffectImmunityAbAttr + */ +export class StatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } + +/** + * Provides immunity to status effects to the user's field. + * @extends PreSetStatusEffectImmunityAbAttr + */ +export class UserFieldStatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } + export class PreApplyBattlerTagAbAttr extends AbAttr { - applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { return false; } } -export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { +/** + * Provides immunity to BattlerTags {@linkcode BattlerTag} to specified targets. + */ +export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { private immuneTagType: BattlerTagType; + private battlerTag: BattlerTag; constructor(immuneTagType: BattlerTagType) { super(); @@ -2468,9 +2797,12 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { this.immuneTagType = immuneTagType; } - applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (tag.tagType === this.immuneTagType) { cancelled.value = true; + if (!simulated) { + this.battlerTag = tag; + } return true; } @@ -2478,19 +2810,35 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${(args[0] as BattlerTag).getDescriptor()}!`); + return i18next.t("abilityTriggers:battlerTagImmunity", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName, + battlerTagName: this.battlerTag.getDescriptor() + }); } } +/** + * Provides immunity to BattlerTags {@linkcode BattlerTag} to the user. + * @extends PreApplyBattlerTagImmunityAbAttr + */ +export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagImmunityAbAttr { } + +/** + * Provides immunity to BattlerTags {@linkcode BattlerTag} to the user's field. + * @extends PreApplyBattlerTagImmunityAbAttr + */ +export class UserFieldBattlerTagImmunityAbAttr extends PreApplyBattlerTagImmunityAbAttr { } + export class BlockCritAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.BooleanHolder).value = true; return true; } } export class BonusCritAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.BooleanHolder).value = true; return true; } @@ -2505,7 +2853,7 @@ export class MultCritAbAttr extends AbAttr { this.multAmount = multAmount; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const critMult = args[0] as Utils.NumberHolder; if (critMult.value > 1) { critMult.value *= this.multAmount; @@ -2536,10 +2884,10 @@ export class ConditionalCritAbAttr extends AbAttr { * [1] {@linkcode Pokemon} Target. * [2] {@linkcode Move} used by ability user. */ - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const target = (args[1] as Pokemon); const move = (args[2] as Move); - if (!this.condition(pokemon,target,move)) { + if (!this.condition(pokemon, target, move)) { return false; } @@ -2549,7 +2897,7 @@ export class ConditionalCritAbAttr extends AbAttr { } export class BlockNonDirectDamageAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; return true; } @@ -2577,8 +2925,8 @@ export class BlockStatusDamageAbAttr extends AbAttr { * @param {any[]} args N/A * @returns Returns true if status damage is blocked */ - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.effects.includes(pokemon.status?.effect)) { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (pokemon.status && this.effects.includes(pokemon.status.effect)) { cancelled.value = true; return true; } @@ -2587,29 +2935,38 @@ export class BlockStatusDamageAbAttr extends AbAttr { } export class BlockOneHitKOAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; return true; } } -export class IncrementMovePriorityAbAttr extends AbAttr { - private moveIncrementFunc: (pokemon: Pokemon, move: Move) => boolean; - private increaseAmount: integer; +/** + * This governs abilities that alter the priority of moves + * Abilities: Prankster, Gale Wings, Triage, Mycelium Might, Stall + * Note - Quick Claw has a separate and distinct implementation outside of priority + */ +export class ChangeMovePriorityAbAttr extends AbAttr { + private moveFunc: (pokemon: Pokemon, move: Move) => boolean; + private changeAmount: number; - constructor(moveIncrementFunc: (pokemon: Pokemon, move: Move) => boolean, increaseAmount = 1) { + /** + * @param {(pokemon, move) => boolean} moveFunc applies priority-change to moves within a provided category + * @param {number} changeAmount the amount of priority added or subtracted + */ + constructor(moveFunc: (pokemon: Pokemon, move: Move) => boolean, changeAmount: number) { super(true); - this.moveIncrementFunc = moveIncrementFunc; - this.increaseAmount = increaseAmount; + this.moveFunc = moveFunc; + this.changeAmount = changeAmount; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.moveIncrementFunc(pokemon, args[0] as Move)) { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!this.moveFunc(pokemon, args[0] as Move)) { return false; } - (args[1] as Utils.IntegerHolder).value += this.increaseAmount; + (args[1] as Utils.IntegerHolder).value += this.changeAmount; return true; } } @@ -2617,7 +2974,7 @@ export class IncrementMovePriorityAbAttr extends AbAttr { export class IgnoreContactAbAttr extends AbAttr { } export class PreWeatherEffectAbAttr extends AbAttr { - applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather | null, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { return false; } } @@ -2633,7 +2990,7 @@ export class BlockWeatherDamageAttr extends PreWeatherDamageAbAttr { this.weatherTypes = weatherTypes; } - applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (!this.weatherTypes.length || this.weatherTypes.indexOf(weather?.weatherType) > -1) { cancelled.value = true; } @@ -2648,10 +3005,10 @@ export class SuppressWeatherEffectAbAttr extends PreWeatherEffectAbAttr { constructor(affectsImmutable?: boolean) { super(); - this.affectsImmutable = affectsImmutable; + this.affectsImmutable = !!affectsImmutable; } - applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.affectsImmutable || weather.isImmutable()) { cancelled.value = true; return true; @@ -2699,7 +3056,7 @@ function getWeatherCondition(...weatherTypes: WeatherType[]): AbAttrCondition { return false; } const weatherType = pokemon.scene.arena.weather?.weatherType; - return weatherType && weatherTypes.indexOf(weatherType) > -1; + return !!weatherType && weatherTypes.indexOf(weatherType) > -1; }; } @@ -2707,7 +3064,11 @@ function getAnticipationCondition(): AbAttrCondition { return (pokemon: Pokemon) => { for (const opponent of pokemon.getOpponents()) { for (const move of opponent.moveset) { - // move is super effective + // ignore null/undefined moves + if (!move) { + continue; + } + // the move's base type (not accounting for variable type changes) is super effective if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent, true) >= 2) { return true; } @@ -2758,31 +3119,33 @@ export class ForewarnAbAttr extends PostSummonAbAttr { super(true); } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { let maxPowerSeen = 0; let maxMove = ""; let movePower = 0; for (const opponent of pokemon.getOpponents()) { for (const move of opponent.moveset) { - if (move.getMove() instanceof StatusMove) { + if (move?.getMove() instanceof StatusMove) { movePower = 1; - } else if (move.getMove().hasAttr(OneHitKOAttr)) { + } else if (move?.getMove().hasAttr(OneHitKOAttr)) { movePower = 150; - } else if (move.getMove().id === Moves.COUNTER || move.getMove().id === Moves.MIRROR_COAT || move.getMove().id === Moves.METAL_BURST) { + } else if (move?.getMove().id === Moves.COUNTER || move?.getMove().id === Moves.MIRROR_COAT || move?.getMove().id === Moves.METAL_BURST) { movePower = 120; - } else if (move.getMove().power === -1) { + } else if (move?.getMove().power === -1) { movePower = 80; } else { - movePower = move.getMove().power; + movePower = move!.getMove().power; // TODO: is this bang correct? } if (movePower > maxPowerSeen) { maxPowerSeen = movePower; - maxMove = move.getName(); + maxMove = move!.getName(); // TODO: is this bang correct? } } } - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " was forewarned about " + maxMove + "!")); + if (!simulated) { + pokemon.scene.queueMessage(i18next.t("abilityTriggers:forewarn", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: maxMove })); + } return true; } } @@ -2792,17 +3155,66 @@ export class FriskAbAttr extends PostSummonAbAttr { super(true); } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - for (const opponent of pokemon.getOpponents()) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " frisked " + opponent.name + "'s " + opponent.getAbility().name + "!")); - setAbilityRevealed(opponent); + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!simulated) { + for (const opponent of pokemon.getOpponents()) { + pokemon.scene.queueMessage(i18next.t("abilityTriggers:frisk", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), opponentName: opponent.name, opponentAbilityName: opponent.getAbility().name })); + setAbilityRevealed(opponent); + } } return true; } } export class PostWeatherChangeAbAttr extends AbAttr { - applyPostWeatherChange(pokemon: Pokemon, passive: boolean, weather: WeatherType, args: any[]): boolean { + applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { + return false; + } +} + +/** + * Triggers weather-based form change when weather changes. + * Used by Forecast and Flower Gift. + * @extends PostWeatherChangeAbAttr + */ +export class PostWeatherChangeFormChangeAbAttr extends PostWeatherChangeAbAttr { + private ability: Abilities; + private formRevertingWeathers: WeatherType[]; + + 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 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 { + 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 weatherType = pokemon.scene.arena.weather?.weatherType; + + if (weatherType && this.formRevertingWeathers.includes(weatherType)) { + pokemon.scene.arena.triggerWeatherBasedFormChangesToNormal(); + } else { + pokemon.scene.arena.triggerWeatherBasedFormChanges(); + } + return true; + } return false; } } @@ -2820,13 +3232,17 @@ export class PostWeatherChangeAddBattlerTagAttr extends PostWeatherChangeAbAttr this.weatherTypes = weatherTypes; } - applyPostWeatherChange(pokemon: Pokemon, passive: boolean, weather: WeatherType, args: any[]): boolean { + applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { console.log(this.weatherTypes.find(w => weather === w), WeatherType[weather]); if (!this.weatherTypes.find(w => weather === w)) { return false; } - return pokemon.addTag(this.tagType, this.turnCount); + if (simulated) { + return pokemon.canAddTag(this.tagType); + } else { + return pokemon.addTag(this.tagType, this.turnCount); + } } } @@ -2839,7 +3255,7 @@ export class PostWeatherLapseAbAttr extends AbAttr { this.weatherTypes = weatherTypes; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean | Promise { + applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean | Promise { return false; } @@ -2857,12 +3273,14 @@ export class PostWeatherLapseHealAbAttr extends PostWeatherLapseAbAttr { this.healFactor = healFactor; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { - if (pokemon.getHpRatio() < 1) { + applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): boolean { + if (!pokemon.isFullHp()) { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / (16 / this.healFactor)), 1), getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP a little!`), true)); + if (!simulated) { + scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.healFactor)), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); + } return true; } @@ -2879,17 +3297,24 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { this.damageFactor = damageFactor; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { + applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): boolean { const scene = pokemon.scene; - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby its ${abilityName}!`)); - pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); + if (pokemon.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + return false; + } + + if (!simulated) { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + scene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); + pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); + } + return true; } } export class PostTerrainChangeAbAttr extends AbAttr { - applyPostTerrainChange(pokemon: Pokemon, passive: boolean, terrain: TerrainType, args: any[]): boolean { + applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { return false; } } @@ -2907,24 +3332,28 @@ export class PostTerrainChangeAddBattlerTagAttr extends PostTerrainChangeAbAttr this.terrainTypes = terrainTypes; } - applyPostTerrainChange(pokemon: Pokemon, passive: boolean, terrain: TerrainType, args: any[]): boolean { + applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { if (!this.terrainTypes.find(t => t === terrain)) { return false; } - return pokemon.addTag(this.tagType, this.turnCount); + if (simulated) { + return pokemon.canAddTag(this.tagType); + } else { + return pokemon.addTag(this.tagType, this.turnCount); + } } } function getTerrainCondition(...terrainTypes: TerrainType[]): AbAttrCondition { return (pokemon: Pokemon) => { const terrainType = pokemon.scene.arena.terrain?.terrainType; - return terrainType && terrainTypes.indexOf(terrainType) > -1; + return !!terrainType && terrainTypes.indexOf(terrainType) > -1; }; } export class PostTurnAbAttr extends AbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { return false; } } @@ -2950,13 +3379,15 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { * @param {any[]} args N/A * @returns Returns true if healed from status, false if not */ - applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { - if (this.effects.includes(pokemon.status?.effect)) { - if (pokemon.getMaxHp() !== pokemon.hp) { - const scene = pokemon.scene; - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 8), 1), i18next.t("abilityTriggers:poisonHeal", { pokemonName: pokemon.name, abilityName: abilityName}), true)); + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + if (pokemon.status && this.effects.includes(pokemon.status.effect)) { + if (!pokemon.isFullHp()) { + if (!simulated) { + const scene = pokemon.scene; + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 8), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }), true)); + } return true; } } @@ -2977,17 +3408,19 @@ export class PostTurnResetStatusAbAttr extends PostTurnAbAttr { this.allyTarget = allyTarget; } - applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (this.allyTarget) { this.target = pokemon.getAlly(); } else { this.target = pokemon; } if (this.target?.status) { + if (!simulated) { + this.target.scene.queueMessage(getStatusEffectHealText(this.target.status?.effect, getPokemonNameWithAffix(this.target))); + this.target.resetStatus(false); + this.target.updateInfo(); + } - this.target.scene.queueMessage(getStatusEffectHealText(this.target.status?.effect, getPokemonNameWithAffix(this.target))); - this.target.resetStatus(false); - this.target.updateInfo(); return true; } @@ -3012,7 +3445,7 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { super(); } - applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const pass = Phaser.Math.RND.realInRange(0, 1); // Clamp procChance to [0, 1]. Skip if didn't proc (less than pass) if (Math.max(Math.min(this.procChance(pokemon), 1), 0) < pass) { @@ -3020,7 +3453,7 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { } if (this.itemType === "EATEN_BERRIES") { - return this.createEatenBerry(pokemon); + return this.createEatenBerry(pokemon, simulated); } else { return false; } @@ -3029,15 +3462,20 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { /** * Create a new berry chosen randomly from the berries the pokemon ate this battle * @param pokemon The pokemon with this ability + * @param simulated whether the associated ability call is simulated * @returns whether a new berry was created */ - createEatenBerry(pokemon: Pokemon): boolean { + createEatenBerry(pokemon: Pokemon, simulated: boolean): boolean { const berriesEaten = pokemon.battleData.berriesEaten; if (!berriesEaten.length) { return false; } + if (simulated) { + return true; + } + const randomIdx = Utils.randSeedInt(berriesEaten.length); const chosenBerryType = berriesEaten[randomIdx]; const chosenBerry = new BerryModifierType(chosenBerryType); @@ -3049,67 +3487,93 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { ) as BerryModifier | undefined; if (!berryModifier) { - pokemon.scene.addModifier(new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1)); + const newBerry = new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1); + if (pokemon.isPlayer()) { + pokemon.scene.addModifier(newBerry); + } else { + pokemon.scene.addEnemyModifier(newBerry); + } } else if (berryModifier.stackCount < berryModifier.getMaxHeldItemCount(pokemon)) { berryModifier.stackCount++; } - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` harvested one ${chosenBerry.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postTurnLootCreateEatenBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: chosenBerry.name })); pokemon.scene.updateModifiers(pokemon.isPlayer()); return true; } } +/** + * Attribute used for {@linkcode Abilities.MOODY} + */ export class MoodyAbAttr extends PostTurnAbAttr { constructor() { super(true); } + /** + * 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 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 canRaise = EFFECTIVE_STATS.filter(s => pokemon.getStatStage(s) < 6); + let canLower = EFFECTIVE_STATS.filter(s => pokemon.getStatStage(s) > -6); - applyPostTurn(pokemon: Pokemon, passive: 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); + 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)); + } + } - if (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 (decreaseStatArray.length > 0) { - const decreaseStat = selectableStats[Utils.randInt(selectableStats.length)]; - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [decreaseStat], -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, args: any[]): boolean { - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels)); + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!simulated) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages)); + } return true; } } export class PostTurnHealAbAttr extends PostTurnAbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - if (pokemon.getHpRatio() < 1) { - const scene = pokemon.scene; - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 16), 1), getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP a little!`), true)); + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!pokemon.isFullHp()) { + if (!simulated) { + const scene = pokemon.scene; + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 16), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); + } + return true; } @@ -3126,10 +3590,13 @@ export class PostTurnFormChangeAbAttr extends PostTurnAbAttr { this.formFunc = formFunc; } - applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + if (!simulated) { + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + } + return true; } @@ -3147,15 +3614,18 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { * Deals damage to all sleeping opponents equal to 1/8 of their max hp (min 1) * @param {Pokemon} pokemon Pokemon that has this ability * @param {boolean} passive N/A + * @param {boolean} simulated true if applying in a simulated call. * @param {any[]} args N/A * @returns {boolean} true if any opponents are sleeping */ - applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { let hadEffect: boolean = false; for (const opp of pokemon.getOpponents()) { - if (opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) { - opp.damageAndUpdate(Math.floor(Math.max(1, opp.getMaxHp() / 8)), HitResult.OTHER); - pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: getPokemonNameWithAffix(opp)})); + if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + if (!simulated) { + opp.damageAndUpdate(Utils.toDmgValue(opp.getMaxHp() / 8), HitResult.OTHER); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: getPokemonNameWithAffix(opp)})); + } hadEffect = true; } @@ -3180,12 +3650,15 @@ export class FetchBallAbAttr extends PostTurnAbAttr { * @param args N/A * @returns true if player has used a pokeball and this pokemon is owned by the player */ - applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (simulated) { + return false; + } const lastUsed = pokemon.scene.currentBattle.lastUsedPokeball; - if (lastUsed !== null && pokemon.isPlayer) { + if (lastUsed !== null && !!pokemon.isPlayer) { pokemon.scene.pokeballCounts[lastUsed]++; pokemon.scene.currentBattle.lastUsedPokeball = null; - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` found a\n${getPokeballName(lastUsed)}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:fetchBall", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokeballName: getPokeballName(lastUsed) })); return true; } return false; @@ -3203,9 +3676,13 @@ export class PostBiomeChangeWeatherChangeAbAttr extends PostBiomeChangeAbAttr { this.weatherType = weatherType; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (!pokemon.scene.arena.weather?.isImmutable()) { - return pokemon.scene.arena.trySetWeather(this.weatherType, true); + if (simulated) { + return pokemon.scene.arena.weather?.weatherType !== this.weatherType; + } else { + return pokemon.scene.arena.trySetWeather(this.weatherType, true); + } } return false; @@ -3221,8 +3698,12 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { this.terrainType = terrainType; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (simulated) { + return pokemon.scene.arena.terrain?.terrainType !== this.terrainType; + } else { + return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + } } } @@ -3231,7 +3712,7 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { * @extends AbAttr */ export class PostMoveUsedAbAttr extends AbAttr { - applyPostMoveUsed(pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], args: any[]): boolean | Promise { + applyPostMoveUsed(pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { return false; } } @@ -3252,20 +3733,22 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * * @return true if the Dancer ability was resolved */ - applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], args: any[]): boolean | Promise { + applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { // List of tags that prevent the Dancer from replicating the move const forbiddenTags = [BattlerTagType.FLYING, BattlerTagType.UNDERWATER, BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN]; // The move to replicate cannot come from the Dancer if (source.getBattlerIndex() !== dancer.getBattlerIndex() && !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType))) { - // 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)); - } 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)); + if (!simulated) { + // 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, 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, true)); + } } return true; } @@ -3287,7 +3770,7 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { } } -export class StatChangeMultiplierAbAttr extends AbAttr { +export class StatStageChangeMultiplierAbAttr extends AbAttr { private multiplier: integer; constructor(multiplier: integer) { @@ -3296,16 +3779,18 @@ export class StatChangeMultiplierAbAttr extends AbAttr { this.multiplier = multiplier; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.IntegerHolder).value *= this.multiplier; return true; } } -export class StatChangeCopyAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as integer), true, false, false)); +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 StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as number), true, false, false)); + } return true; } } @@ -3315,15 +3800,39 @@ export class BypassBurnDamageReductionAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; return true; } } +/** + * Causes Pokemon to take reduced damage from the {@linkcode StatusEffect.BURN | Burn} status + * @param multiplier Multiplied with the damage taken +*/ +export class ReduceBurnDamageAbAttr extends AbAttr { + constructor(protected multiplier: number) { + super(false); + } + + /** + * Applies the damage reduction + * @param pokemon N/A + * @param passive N/A + * @param cancelled N/A + * @param args `[0]` {@linkcode Utils.NumberHolder} The damage value being modified + * @returns `true` + */ + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue((args[0] as Utils.NumberHolder).value * this.multiplier); + + return true; + } +} + export class DoubleBerryEffectAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.NumberHolder).value *= 2; return true; @@ -3331,7 +3840,7 @@ export class DoubleBerryEffectAbAttr extends AbAttr { } export class PreventBerryUseAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; return true; @@ -3354,24 +3863,25 @@ export class HealFromBerryUseAbAttr extends AbAttr { this.healPercent = Math.max(Math.min(healPercent, 1), 0); } - apply(pokemon: Pokemon, passive: boolean, ...args: [Utils.BooleanHolder, any[]]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, ...args: [Utils.BooleanHolder, any[]]): boolean { const { name: abilityName } = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); - pokemon.scene.unshiftPhase( - new PokemonHealPhase( - pokemon.scene, - pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() * this.healPercent), 1), - getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP!`), - true - ) - ); - + if (!simulated) { + pokemon.scene.unshiftPhase( + new PokemonHealPhase( + pokemon.scene, + pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() * this.healPercent), + i18next.t("abilityTriggers:healFromBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), + true + ) + ); + } return true; } } export class RunSuccessAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.IntegerHolder).value = 256; return true; @@ -3394,7 +3904,7 @@ export class CheckTrappedAbAttr extends AbAttr { this.arenaTrapCondition = condition; } - applyCheckTrapped(pokemon: Pokemon, passive: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean | Promise { + applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean | Promise { return false; } } @@ -3419,7 +3929,7 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { * @param args N/A * @returns if enemy Pokemon is trapped or not */ - applyCheckTrapped(pokemon: Pokemon, passive: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean { + applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean { if (this.arenaTrapCondition(pokemon, otherPokemon)) { if (otherPokemon.getTypes(true).includes(Type.GHOST) || (otherPokemon.getTypes(true).includes(Type.STELLAR) && otherPokemon.getTypes().includes(Type.GHOST))) { trapped.value = false; @@ -3436,12 +3946,12 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `\'s ${abilityName}\nprevents switching!`); + return i18next.t("abilityTriggers:arenaTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }); } } export class MaxMultiHitAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.IntegerHolder).value = 0; return true; @@ -3453,19 +3963,20 @@ export class PostBattleAbAttr extends AbAttr { super(true); } - applyPostBattle(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } export class PostBattleLootAbAttr extends PostBattleAbAttr { - applyPostBattle(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const postBattleLoot = pokemon.scene.currentBattle.postBattleLoot; - if (postBattleLoot.length) { + if (!simulated && postBattleLoot.length) { const randItem = Utils.randSeedItem(postBattleLoot); - if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true)) { + //@ts-ignore - TODO see below + if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true)) { // TODO: fix. This is a promise!? postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` picked up\n${randItem.type.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: randItem.type.name })); return true; } } @@ -3475,11 +3986,43 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr { } export class PostFaintAbAttr extends AbAttr { - applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { return false; } } +/** + * Used for weather suppressing abilities to trigger weather-based form changes upon being fainted. + * Used by Cloud Nine and Air Lock. + * @extends PostFaintAbAttr + */ +export class PostFaintUnsuppressedWeatherFormChangeAbAttr extends PostFaintAbAttr { + /** + * Triggers {@linkcode Arena.triggerWeatherBasedFormChanges | triggerWeatherBasedFormChanges} + * when the user of the ability faints + * @param {Pokemon} pokemon the fainted Pokemon + * @param passive n/a + * @param attacker n/a + * @param move n/a + * @param hitResult n/a + * @param args n/a + * @returns whether the form change was triggered + */ + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + const pokemonToTransform = getPokemonWithWeatherBasedForms(pokemon.scene); + + if (pokemonToTransform.length < 1) { + return false; + } + + if (!simulated) { + pokemon.scene.arena.triggerWeatherBasedFormChanges(); + } + + return true; + } +} + /** * Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon fainting */ @@ -3494,8 +4037,8 @@ export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr { * @param args N/A * @returns {boolean} Returns true if the weather clears, otherwise false. */ - applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - const weatherType = pokemon.scene.arena.weather.weatherType; + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + const weatherType = pokemon.scene.arena.weather?.weatherType; let turnOffWeather = false; // Clear weather only if user's ability matches the weather and no other pokemon has the ability. @@ -3520,6 +4063,10 @@ export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr { break; } + if (simulated) { + return turnOffWeather; + } + if (turnOffWeather) { pokemon.scene.arena.trySetWeather(WeatherType.NONE, false); return true; @@ -3538,15 +4085,17 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { this.damageRatio = damageRatio; } - applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { const cancelled = new Utils.BooleanHolder(false); - pokemon.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); - if (cancelled.value) { + pokemon.scene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated)); + if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { return false; } - attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); - attacker.turnData.damageTaken += Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)); + if (!simulated) { + attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); + } return true; } @@ -3554,7 +4103,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName} hurt\nits attacker!`); + return i18next.t("abilityTriggers:postFaintContactDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }); } } @@ -3566,20 +4115,22 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { super (); } - applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - const damage = pokemon.turnData.attacksReceived[0].damage; - attacker.damageAndUpdate((damage), HitResult.OTHER); - attacker.turnData.damageTaken += damage; + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + if (!simulated) { + const damage = pokemon.turnData.attacksReceived[0].damage; + attacker.damageAndUpdate((damage), HitResult.OTHER); + attacker.turnData.damageTaken += damage; + } return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName} hurt\nits attacker!`); + return i18next.t("abilityTriggers:postFaintHpDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }); } } export class RedirectMoveAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.canRedirect(args[0] as Moves)) { const target = args[1] as Utils.IntegerHolder; const newTarget = pokemon.getBattlerIndex(); @@ -3622,9 +4173,9 @@ export class ReduceStatusEffectDurationAbAttr extends AbAttr { this.statusEffect = statusEffect; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (args[0] === this.statusEffect) { - (args[1] as Utils.IntegerHolder).value = Math.floor((args[1] as Utils.IntegerHolder).value / 2); + (args[1] as Utils.IntegerHolder).value = Utils.toDmgValue((args[1] as Utils.IntegerHolder).value / 2); return true; } @@ -3638,21 +4189,23 @@ 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, cancelled: Utils.BooleanHolder, args: any[]): boolean { - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels)); + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!simulated) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages)); + } return true; } } @@ -3660,7 +4213,7 @@ export class FlinchStatChangeAbAttr extends FlinchEffectAbAttr { export class IncreasePpAbAttr extends AbAttr { } export class ForceSwitchOutImmunityAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; return true; } @@ -3671,7 +4224,7 @@ export class ReduceBerryUseThresholdAbAttr extends AbAttr { super(); } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const hpRatio = pokemon.getHpRatio(); if (args[0].value < hpRatio) { @@ -3692,7 +4245,7 @@ export class WeightMultiplierAbAttr extends AbAttr { this.multiplier = multiplier; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.NumberHolder).value *= this.multiplier; return true; @@ -3704,7 +4257,7 @@ export class SyncEncounterNatureAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Pokemon).setNature(pokemon.getNature()); return true; @@ -3720,7 +4273,7 @@ export class MoveAbilityBypassAbAttr extends AbAttr { this.moveIgnoreFunc = moveIgnoreFunc || ((pokemon, move) => true); } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.moveIgnoreFunc(pokemon, (args[0] as Move))) { cancelled.value = true; return true; @@ -3734,7 +4287,7 @@ export class SuppressFieldAbilitiesAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const ability = (args[0] as Ability); if (!ability.hasAttr(UnsuppressableAbilityAbAttr) && !ability.hasAttr(SuppressFieldAbilitiesAbAttr)) { cancelled.value = true; @@ -3789,7 +4342,7 @@ export class IgnoreTypeImmunityAbAttr extends AbAttr { this.allowedMoveTypes = allowedMoveTypes; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.defenderType === (args[1] as Type) && this.allowedMoveTypes.includes(args[0] as Type)) { cancelled.value = true; return true; @@ -3812,7 +4365,7 @@ export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr { this.defenderType = defenderType; } - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as Type)) { cancelled.value = true; return true; @@ -3839,8 +4392,10 @@ export class MoneyAbAttr extends PostBattleAbAttr { * @param args N/A * @returns true */ - applyPostBattle(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - pokemon.scene.currentBattle.moneyScattered += pokemon.scene.getWaveMoneyAmount(0.2); + applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!simulated) { + pokemon.scene.currentBattle.moneyScattered += pokemon.scene.getWaveMoneyAmount(0.2); + } return true; } } @@ -3849,9 +4404,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 @@ -3860,13 +4415,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; } @@ -3879,45 +4434,57 @@ export class PostSummonStatChangeOnArenaAbAttr extends PostSummonStatChangeAbAtt * @param {any[]} args - Additional arguments. * @returns {boolean} - Returns true if the stat change was applied, otherwise false. */ - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const side = pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; if (pokemon.scene.arena.getTagOnSide(this.tagType, side)) { - return super.applyPostSummon(pokemon, passive, args); + return super.applyPostSummon(pokemon, passive, simulated, args); } return false; } } /** - * Takes no damage from the first hit of a physical move. - * This is used in Ice Face ability. + * Takes no damage from the first hit of a damaging move. + * This is used in the Disguise and Ice Face abilities. + * @extends ReceivedMoveDamageMultiplierAbAttr */ -export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAttr { +export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr { private multiplier: number; + private tagType: BattlerTagType; + private recoilDamageFunc: ((pokemon: Pokemon) => number) | undefined; + private triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string; - constructor(condition: PokemonDefendCondition, multiplier: number) { + constructor(condition: PokemonDefendCondition, multiplier: number, tagType: BattlerTagType, triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string, recoilDamageFunc?: (pokemon: Pokemon) => number) { super(condition, multiplier); this.multiplier = multiplier; + this.tagType = tagType; + this.recoilDamageFunc = recoilDamageFunc; + this.triggerMessageFunc = triggerMessageFunc; } /** - * Applies the Ice Face pre-defense ability to the Pokémon. - * Removes BattlerTagType.ICE_FACE when hit by physical attack and is in Ice Face form. + * Applies the pre-defense ability to the Pokémon. + * Removes the appropriate `BattlerTagType` when hit by an attack and is in its defense form. * - * @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. - * @param {boolean} passive - Whether the ability is passive. - * @param {Pokemon} attacker - The attacking Pokémon. - * @param {PokemonMove} move - The move being used. - * @param {Utils.BooleanHolder} cancelled - A holder for whether the move was cancelled. - * @param {any[]} args - Additional arguments. - * @returns {boolean} - Whether the immunity was applied. + * @param {Pokemon} pokemon The Pokémon with the ability. + * @param {boolean} passive n/a + * @param {Pokemon} attacker The attacking Pokémon. + * @param {PokemonMove} move The move being used. + * @param {Utils.BooleanHolder} cancelled n/a + * @param {any[]} args Additional arguments. + * @returns {boolean} Whether the immunity was applied. */ - applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value = this.multiplier; - pokemon.removeTag(BattlerTagType.ICE_FACE); + if (!simulated) { + (args[0] as Utils.NumberHolder).value = this.multiplier; + pokemon.removeTag(this.tagType); + if (this.recoilDamageFunc) { + pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER, false, false, true, true); + } + } return true; } @@ -3925,14 +4492,14 @@ export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAt } /** - * Gets the message triggered when the Pokémon avoids damage using the Ice Face ability. - * @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. - * @param {string} abilityName - The name of the ability. - * @param {...any} args - Additional arguments. - * @returns {string} - The trigger message. + * Gets the message triggered when the Pokémon avoids damage using the form-changing ability. + * @param {Pokemon} pokemon The Pokémon with the ability. + * @param {string} abilityName The name of the ability. + * @param {...any} args n/a + * @returns {string} The trigger message. */ getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: pokemon.name, abilityName: abilityName }); + return this.triggerMessageFunc(pokemon, abilityName); } } @@ -3960,14 +4527,17 @@ export class BypassSpeedChanceAbAttr extends AbAttr { * @param {any[]} args [0] {@linkcode Utils.BooleanHolder} set to true when the ability activated * @returns {boolean} - whether the ability was activated. */ - apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (simulated) { + return false; + } const bypassSpeed = args[0] as Utils.BooleanHolder; if (!bypassSpeed.value && pokemon.randSeedInt(100) < this.chance) { const turnCommand = pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; const isCommandFight = turnCommand?.command === Command.FIGHT; - const move = allMoves[turnCommand.move?.move]; + const move = turnCommand?.move?.move ?allMoves[turnCommand.move.move] : null; const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL; if (isCommandFight && isDamageMove) { @@ -3984,122 +4554,132 @@ export class BypassSpeedChanceAbAttr extends AbAttr { } } -function applyAbAttrsInternal(attrType: Constructor, - pokemon: Pokemon, applyFunc: AbAttrApplyFunc, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise { - return new Promise(resolve => { - if (!pokemon.canApplyAbility(passive)) { - if (!passive) { - return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); - } else { - return resolve(); - } +/** + * This attribute checks if a Pokemon's move meets a provided condition to determine if the Pokemon can use Quick Claw + * It was created because Pokemon with the ability Mycelium Might cannot access Quick Claw's benefits when using status moves. +*/ +export class PreventBypassSpeedChanceAbAttr extends AbAttr { + private condition: ((pokemon: Pokemon, move: Move) => boolean); + + /** + * @param {function} condition - checks if a move meets certain conditions + */ + constructor(condition: (pokemon: Pokemon, move: Move) => boolean) { + super(true); + this.condition = condition; + } + + /** + * @argument {boolean} bypassSpeed - determines if a Pokemon is able to bypass speed at the moment + * @argument {boolean} canCheckHeldItems - determines if a Pokemon has access to Quick Claw's effects or not + */ + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + const bypassSpeed = args[0] as Utils.BooleanHolder; + const canCheckHeldItems = args[1] as Utils.BooleanHolder; + + const turnCommand = pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const isCommandFight = turnCommand?.command === Command.FIGHT; + const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; + if (this.condition(pokemon, move!) && isCommandFight) { + bypassSpeed.value = false; + canCheckHeldItems.value = false; + return false; + } + return true; + } +} + +async function applyAbAttrsInternal( + attrType: Constructor, + pokemon: Pokemon | null, + applyFunc: AbAttrApplyFunc, + args: any[], + showAbilityInstant: boolean = false, + simulated: boolean = false, + messages: string[] = [], +) { + for (const passive of [false, true]) { + if (!pokemon?.canApplyAbility(passive)) { + continue; } - const ability = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()); - const attrs = ability.getAttrs(attrType); + const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); + for (const attr of ability.getAttrs(attrType)) { + const condition = attr.getCondition(); + if (condition && !condition(pokemon)) { + continue; + } - const clearSpliceQueueAndResolve = () => { - pokemon.scene?.clearPhaseQueueSplice(); - if (!passive) { - return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); - } else { - return resolve(); - } - }; - const applyNextAbAttr = () => { - if (attrs.length) { - applyAbAttr(attrs.shift()); - } else { - clearSpliceQueueAndResolve(); - } - }; - const applyAbAttr = (attr: TAttr) => { - if (!canApplyAttr(pokemon, attr)) { - return applyNextAbAttr(); - } pokemon.scene.setPhaseQueueSplice(); - const onApplySuccess = () => { + + let result = applyFunc(attr, passive); + // TODO Remove this when promises get reworked + 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 && !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, (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name, args); - if (message) { - if (isAsync) { - pokemon.scene.ui.showText(message, null, () => pokemon.scene.ui.showText(null, 0), null, true); - } else { - pokemon.scene.queueMessage(message); - } + const message = attr.getTriggerMessage(pokemon, ability.name, args); + if (message) { + if (!simulated) { + pokemon.scene.queueMessage(message); } } - }; - const result = applyFunc(attr, passive); - if (result instanceof Promise) { - result.then(success => { - if (success) { - onApplySuccess(); - } - applyNextAbAttr(); - }); - } else { - if (result) { - onApplySuccess(); - } - applyNextAbAttr(); + messages.push(message!); } - }; - applyNextAbAttr(); - }); + } + pokemon.scene.clearPhaseQueueSplice(); + } } -export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, cancelled, args), args); +export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), args, false, simulated); } export function applyPostBattleInitAbAttrs(attrType: Constructor, - pokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, args), args); + pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), args, false, simulated); } export function applyPreDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { - const simulated = args.length > 1 && args[1]; - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, false, simulated); + pokemon: Pokemon, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, false, simulated); } export function applyPostDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, attacker, move, hitResult, args), args); + pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); } export function applyPostMoveUsedAbAttrs(attrType: Constructor, - pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, args), args); + pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, 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); +} export function applyPostSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect, sourcePokemon?: Pokemon, ...args: any[]): Promise { + pokemon: Pokemon, effect: StatusEffect, sourcePokemon?: Pokemon | null, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, args), args); } -export function applyBattleStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, battleStat: BattleStat, statValue: Utils.NumberHolder, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyBattleStat(pokemon, passive, battleStat, statValue, args), args); -} - /** - * 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 @@ -4107,105 +4687,99 @@ export function applyBattleStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyFieldBattleStat(pokemon, passive, stat, statValue, checkedPokemon, hasApplied, args), args); +export function 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.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args); } export function applyPreAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon, move: Move, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, defender, move, args), args); + pokemon: Pokemon, defender: Pokemon | null, move: Move, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), args, false, simulated); } export function applyPostAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, defender, move, hitResult, args), args); + pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), args, false, simulated); } export function applyPostKnockOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, knockedOut: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, knockedOut, args), args); + pokemon: Pokemon, knockedOut: Pokemon, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), args, false, simulated); } export function applyPostVictoryAbAttrs(attrType: Constructor, - pokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, args), args); + pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), args, false, simulated); } export function applyPostSummonAbAttrs(attrType: Constructor, - pokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, args), args); + pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), args, false, simulated); } export function applyPreSwitchOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, args), args, false, true); + pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), args, true, simulated); } -export function applyPreStatChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: BattleStat, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreStatChange(pokemon, passive, stat, cancelled, args), args); +export function applyPreStatStageChangeAbAttrs(attrType: Constructor, + pokemon: Pokemon | null, stat: BattleStat, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { + 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, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostStatChange(pokemon, stats, levels, selfTarget, args), args); +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, - pokemon: Pokemon, effect: StatusEffect, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { - const simulated = args.length > 1 && args[1]; - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, !simulated); + pokemon: Pokemon, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), args, false, simulated); } export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, - pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, tag, cancelled, args), args); + pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), args, false, simulated); } export function applyPreWeatherEffectAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, weather, cancelled, args), args, false, true); + pokemon: Pokemon, weather: Weather | null, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), args, true, simulated); } export function applyPostTurnAbAttrs(attrType: Constructor, - pokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, args), args); + pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), args, false, simulated); } export function applyPostWeatherChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: WeatherType, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, weather, args), args); + pokemon: Pokemon, weather: WeatherType, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), args, false, simulated); } export function applyPostWeatherLapseAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, weather, args), args); + pokemon: Pokemon, weather: Weather | null, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), args, false, simulated); } export function applyPostTerrainChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, terrain: TerrainType, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, terrain, args), args); + pokemon: Pokemon, terrain: TerrainType, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), args, false, simulated); } export function applyCheckTrappedAbAttrs(attrType: Constructor, - pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, trapped, otherPokemon, args), args, true); + pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, messages: string[], simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), args, false, simulated, messages); } export function applyPostBattleAbAttrs(attrType: Constructor, - pokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, args), args); + pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), args, false, simulated); } export function applyPostFaintAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, attacker, move, hitResult, args), args); -} - -function canApplyAttr(pokemon: Pokemon, attr: AbAttr): boolean { - const condition = attr.getCondition(); - return !condition || condition(pokemon); + pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, simulated: boolean = false, ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); } function queueShowAbility(pokemon: Pokemon, passive: boolean): void { @@ -4224,17 +4798,28 @@ function setAbilityRevealed(pokemon: Pokemon): void { } } +/** + * Returns the Pokemon with weather-based forms + * @param {BattleScene} scene - The current scene + */ +function getPokemonWithWeatherBasedForms(scene: BattleScene) { + return scene.getField(true).filter(p => + (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM) + || (p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM) + ); +} + export const allAbilities = [ new Ability(Abilities.NONE, 3) ]; export function initAbilities() { allAbilities.push( new Ability(Abilities.STENCH, 3) - .attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => (move.category !== MoveCategory.STATUS && !move.hasAttr(FlinchAttr)) ? 10 : 0, BattlerTagType.FLINCHED), + .attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => !move.hasAttr(FlinchAttr) ? 10 : 0, BattlerTagType.FLINCHED), new Ability(Abilities.DRIZZLE, 3) .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(), @@ -4249,7 +4834,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(), @@ -4269,9 +4854,13 @@ export function initAbilities() { .attr(IntimidateImmunityAbAttr) .ignorable(), new Ability(Abilities.CLOUD_NINE, 3) - .attr(SuppressWeatherEffectAbAttr, true), + .attr(SuppressWeatherEffectAbAttr, true) + .attr(PostSummonUnnamedMessageAbAttr, i18next.t("abilityTriggers:weatherEffectDisappeared")) + .attr(PostSummonWeatherSuppressedFormChangeAbAttr) + .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) @@ -4283,7 +4872,7 @@ export function initAbilities() { .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .ignorable(), new Ability(Abilities.FLASH_FIRE, 3) - .attr(TypeImmunityAddBattlerTagAbAttr, Type.FIRE, BattlerTagType.FIRE_BOOST, 1, (pokemon: Pokemon) => !pokemon.status || pokemon.status.effect !== StatusEffect.FREEZE) + .attr(TypeImmunityAddBattlerTagAbAttr, Type.FIRE, BattlerTagType.FIRE_BOOST, 1) .ignorable(), new Ability(Abilities.SHIELD_DUST, 3) .attr(IgnoreMoveEffectsAbAttr) @@ -4296,7 +4885,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)) { @@ -4313,7 +4902,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.LEVITATE, 3) - .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY)) + .attr(AttackTypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY)) .ignorable(), new Ability(Abilities.EFFECT_SPORE, 3) .attr(EffectSporeAbAttr), @@ -4328,26 +4917,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(), @@ -4379,7 +4968,7 @@ export function initAbilities() { .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SANDSTORM), new Ability(Abilities.PRESSURE, 3) .attr(IncreasePpAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is exerting its Pressure!")), + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonPressure", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.THICK_FAT, 3) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.ICE, 0.5) @@ -4392,30 +4981,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, (user, target, move) => move.category === MoveCategory.PHYSICAL) - .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) - .unimplemented(), + .attr(PostSummonFormChangeByWeatherAbAttr, Abilities.FORECAST) + .attr(PostWeatherChangeFormChangeAbAttr, Abilities.FORECAST, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG ]), new Ability(Abilities.STICKY_HOLD, 3) .attr(BlockItemTheftAbAttr) .bypassFaint() @@ -4424,9 +5014,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), @@ -4459,40 +5049,44 @@ 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(), new Ability(Abilities.AIR_LOCK, 3) .attr(SuppressWeatherEffectAbAttr, true) - .attr(PostSummonUnnamedMessageAbAttr, "The effects of the weather disappeared."), + .attr(PostSummonUnnamedMessageAbAttr, i18next.t("abilityTriggers:weatherEffectDisappeared")) + .attr(PostSummonWeatherSuppressedFormChangeAbAttr) + .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), + .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) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) + .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) @@ -4517,13 +5111,13 @@ 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(MoveTypeChangeAttr, Type.NORMAL, 1.2, (user, target, move) => { + .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); }), new Ability(Abilities.SNIPER, 4) @@ -4534,7 +5128,7 @@ export function initAbilities() { .attr(AlwaysHitAbAttr) .attr(DoubleBattleChanceAbAttr), new Ability(Abilities.STALL, 4) - .unimplemented(), + .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); @@ -4548,25 +5142,26 @@ export function initAbilities() { new Ability(Abilities.KLUTZ, 4) .unimplemented(), new Ability(Abilities.MOLD_BREAKER, 4) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " breaks the mold!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonMoldBreaker", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.SUPER_LUCK, 4) .attr(BonusCritAbAttr) .partial(), new Ability(Abilities.AFTERMATH, 4) - .attr(PostFaintContactDamageAbAttr,4) + .attr(PostFaintContactDamageAbAttr, 4) .bypassFaint(), new Ability(Abilities.ANTICIPATION, 4) - .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " shuddered!")), + .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAnticipation", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.FOREWARN, 4) .attr(ForewarnAbAttr), new Ability(Abilities.UNAWARE, 4) - .attr(IgnoreOpponentStatChangesAbAttr) + .attr(IgnoreOpponentStatStagesAbAttr) .ignorable(), new Ability(Abilities.TINTED_LENS, 4) - .attr(DamageBoostAbAttr, 2, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5), + //@ts-ignore + .attr(DamageBoostAbAttr, 2, (user, target, move) => target?.getMoveEffectiveness(user, move) <= 0.5), // TODO: fix TS issues new Ability(Abilities.FILTER, 4) - .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75) + .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75) .ignorable(), new Ability(Abilities.SLOW_START, 4) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.SLOW_START, 5), @@ -4575,14 +5170,14 @@ 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) .attr(PostWeatherLapseHealAbAttr, 1, WeatherType.HAIL, WeatherType.SNOW) .partial(), // Healing not blocked by Heal Block new Ability(Abilities.SOLID_ROCK, 4) - .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75) + .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75) .ignorable(), new Ability(Abilities.SNOW_WARNING, 4) .attr(PostSummonWeatherChangeAbAttr, WeatherType.SNOW) @@ -4599,12 +5194,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) @@ -4615,15 +5212,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) @@ -4634,8 +5231,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(), @@ -4643,12 +5240,12 @@ export function initAbilities() { .attr(WeightMultiplierAbAttr, 0.5) .ignorable(), new Ability(Abilities.MULTISCALE, 5) - .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getHpRatio() === 1, 0.5) + .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.isFullHp(), 0.5) .ignorable(), new Ability(Abilities.TOXIC_BOOST, 5) - .attr(MovePowerBoostAbAttr, (user, target, move) => move.category === MoveCategory.PHYSICAL && (user.status?.effect === StatusEffect.POISON || user.status?.effect === StatusEffect.TOXIC), 1.5), + .attr(MovePowerBoostAbAttr, (user, target, move) => move.category === MoveCategory.PHYSICAL && (user?.status?.effect === StatusEffect.POISON || user?.status?.effect === StatusEffect.TOXIC), 1.5), new Ability(Abilities.FLARE_BOOST, 5) - .attr(MovePowerBoostAbAttr, (user, target, move) => move.category === MoveCategory.SPECIAL && user.status?.effect === StatusEffect.BURN, 1.5), + .attr(MovePowerBoostAbAttr, (user, target, move) => move.category === MoveCategory.SPECIAL && user?.status?.effect === StatusEffect.BURN, 1.5), new Ability(Abilities.HARVEST, 5) .attr( PostTurnLootAbAttr, @@ -4671,17 +5268,18 @@ 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) .attr(WonderSkinAbAttr) .ignorable(), new Ability(Abilities.ANALYTIC, 5) - .attr(MovePowerBoostAbAttr, (user, target, move) => !!target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command !== Command.FIGHT, 1.3), + //@ts-ignore + .attr(MovePowerBoostAbAttr, (user, target, move) => !!target?.getLastXMoves(1).find(m => m.turn === target?.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command !== Command.FIGHT, 1.3), // TODO fix TS issues new Ability(Abilities.ILLUSION, 5) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) @@ -4695,21 +5293,24 @@ 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) => user.getMoveType(move) === 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) => { + const moveType = user.getMoveType(move); + return move.category !== MoveCategory.STATUS + && (moveType === Type.DARK || moveType === Type.BUG || moveType === 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(IncrementMovePriorityAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS), + .attr(ChangeMovePriorityAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS, 1), new Ability(Abilities.SAND_FORCE, 5) .attr(MoveTypePowerBoostAbAttr, Type.ROCK, 1.3) .attr(MoveTypePowerBoostAbAttr, Type.GROUND, 1.3) @@ -4729,13 +5330,13 @@ 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) => getPokemonMessage(pokemon, " is radiating a blazing aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTurboblaze", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.TERAVOLT, 5) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a bursting aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.AROMA_VEIL, 6) .ignorable() @@ -4758,50 +5359,52 @@ 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) - .attr(MoveTypeChangeAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL), + .attr(MoveTypeChangeAbAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.SWEET_VEIL, 6) - .attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP) - .attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY) + .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.SLEEP) + .attr(UserFieldBattlerTagImmunityAbAttr, BattlerTagType.DROWSY) .ignorable() - .partial(), + .partial(), // Mold Breaker ally should not be affected by Sweet Veil new Ability(Abilities.STANCE_CHANGE, 6) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr) .attr(NoFusionAbilityAbAttr), new Ability(Abilities.GALE_WINGS, 6) - .attr(IncrementMovePriorityAbAttr, (pokemon, move) => pokemon.getHpRatio() === 1 && move.type === Type.FLYING), + .attr(ChangeMovePriorityAbAttr, (pokemon, move) => pokemon.isFullHp() && pokemon.getMoveType(move) === Type.FLYING, 1), 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(), new Ability(Abilities.TOUGH_CLAWS, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 1.3), new Ability(Abilities.PIXILATE, 6) - .attr(MoveTypeChangeAttr, Type.FAIRY, 1.2, (user, target, move) => move.type === Type.NORMAL), + .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(MoveTypeChangeAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL), + .attr(MoveTypeChangeAbAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.PARENTAL_BOND, 6) .attr(AddSecondStrikeAbAttr, 0.25), new Ability(Abilities.DARK_AURA, 6) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a Dark Aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonDarkAura", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(FieldMoveTypePowerBoostAbAttr, Type.DARK, 4 / 3), new Ability(Abilities.FAIRY_AURA, 6) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a Fairy Aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonFairyAura", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() - .conditionalAttr(target => target.hasAbility(Abilities.DARK_AURA), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) - .conditionalAttr(target => target.hasAbility(Abilities.FAIRY_AURA), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16), + .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA)), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) + .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.FAIRY_AURA)), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16) + .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA) || p.hasAbility(Abilities.FAIRY_AURA)), + PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAuraBreak", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.PRIMORDIAL_SEA, 6) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) @@ -4821,7 +5424,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(), @@ -4829,9 +5432,9 @@ 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) => user.getMoveType(move) === 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), + .attr(ConditionalCritAbAttr, (user, target, move) => target?.status?.effect === StatusEffect.TOXIC || target?.status?.effect === StatusEffect.POISON), new Ability(Abilities.SHIELDS_DOWN, 7) .attr(PostBattleInitFormChangeAbAttr, () => 0) .attr(PostSummonFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0)) @@ -4843,7 +5446,8 @@ export function initAbilities() { .bypassFaint() .partial(), new Ability(Abilities.STAKEOUT, 7) - .attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2), + //@ts-ignore + .attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2), // TODO: fix TS issues new Ability(Abilities.WATER_BUBBLE, 7) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) .attr(MoveTypePowerBoostAbAttr, Type.WATER, 2) @@ -4852,21 +5456,21 @@ 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), new Ability(Abilities.LIQUID_VOICE, 7) - .attr(MoveTypeChangeAttr, Type.WATER, 1, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED)), + .attr(MoveTypeChangeAbAttr, Type.WATER, 1, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED)), new Ability(Abilities.TRIAGE, 7) - .attr(IncrementMovePriorityAbAttr, (pokemon, move) => move.hasFlag(MoveFlags.TRIAGE_MOVE), 3), + .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.hasFlag(MoveFlags.TRIAGE_MOVE), 3), new Ability(Abilities.GALVANIZE, 7) - .attr(MoveTypeChangeAttr, Type.ELECTRIC, 1.2, (user, target, move) => move.type === Type.NORMAL), + .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) @@ -4877,20 +5481,19 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .bypassFaint(), new Ability(Abilities.DISGUISE, 7) - .attr(PreDefendMoveDamageToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0) - .attr(PostSummonFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) - .attr(PostBattleInitFormChangeAbAttr, () => 0) - .attr(PostDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) - .attr(PreDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) - .attr(PostDefendDisguiseAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) .attr(NoFusionAbilityAbAttr) + // Add BattlerTagType.DISGUISE if the pokemon is in its disguised form + .conditionalAttr(pokemon => pokemon.formIndex === 0, PostSummonAddBattlerTagAbAttr, BattlerTagType.DISGUISE, 0, false) + .attr(FormBlockDamageAbAttr, (target, user, move) => !!target.getTag(BattlerTagType.DISGUISE) && target.getMoveEffectiveness(user, move) > 0, 0, BattlerTagType.DISGUISE, + (pokemon, abilityName) => i18next.t("abilityTriggers:disguiseAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }), + (pokemon) => Utils.toDmgValue(pokemon.getMaxHp() / 8)) + .attr(PostBattleInitFormChangeAbAttr, () => 0) .bypassFaint() - .ignorable() - .partial(), + .ignorable(), new Ability(Abilities.BATTLE_BOND, 7) .attr(PostVictoryFormChangeAbAttr, () => 2) .attr(PostBattleInitFormChangeAbAttr, () => 1) @@ -4930,15 +5533,15 @@ export function initAbilities() { .attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL], 1.3), new Ability(Abilities.FLUFFY, 7) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 0.5) - .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.type === Type.FIRE, 2) + .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE, 2) .ignorable(), new Ability(Abilities.DAZZLING, 7) .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), @@ -4946,18 +5549,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) @@ -4979,16 +5581,17 @@ export function initAbilities() { new Ability(Abilities.FULL_METAL_BODY, 7) .attr(ProtectStatAbAttr), new Ability(Abilities.SHADOW_SHIELD, 7) - .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getHpRatio() === 1, 0.5), + .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.isFullHp(), 0.5), new Ability(Abilities.PRISM_ARMOR, 7) - .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75), + .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75), new Ability(Abilities.NEUROFORCE, 7) - .attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 1.25), + //@ts-ignore + .attr(MovePowerBoostAbAttr, (user, target, move) => target?.getMoveEffectiveness(user, move) >= 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), @@ -4997,7 +5600,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), @@ -5008,17 +5611,23 @@ export function initAbilities() { .attr(UnsuppressableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) .attr(NoFusionAbilityAbAttr) - .unimplemented(), + .attr(UncopiableAbilityAbAttr) + .attr(UnswappableAbilityAbAttr) + .attr(PostDefendGulpMissileAbAttr), 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) => { + const moveType = user.getMoveType(move); + return move.category !== MoveCategory.STATUS + && (moveType === Type.FIRE || moveType === Type.WATER); + }, 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) .ignorable(), new Ability(Abilities.SAND_SPIT, 8) - .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM), + .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS), new Ability(Abilities.ICE_SCALES, 8) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.SPECIAL, 0.5) .ignorable(), @@ -5036,7 +5645,10 @@ export function initAbilities() { .conditionalAttr(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW), PostSummonAddBattlerTagAbAttr, BattlerTagType.ICE_FACE, 0) // When weather changes to HAIL or SNOW while pokemon is fielded, add BattlerTagType.ICE_FACE .attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.ICE_FACE, 0, WeatherType.HAIL, WeatherType.SNOW) - .attr(IceFaceBlockPhysicalAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0) + .attr(FormBlockDamageAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0, BattlerTagType.ICE_FACE, + (pokemon, abilityName) => i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName })) + .attr(PostBattleInitFormChangeAbAttr, () => 0) + .bypassFaint() .ignorable(), new Ability(Abilities.POWER_SPOT, 8) .attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3), @@ -5059,14 +5671,17 @@ export function initAbilities() { .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, "'s Neutralizing Gas filled the area!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonNeutralizingGas", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .partial(), new Ability(Abilities.PASTEL_VEIL, 8) - .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) + .attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) + .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .ignorable(), new Ability(Abilities.HUNGER_SWITCH, 8) - .attr(PostTurnFormChangeAbAttr, p => p.getFormKey ? 0 : 1) - .attr(PostTurnFormChangeAbAttr, p => p.getFormKey ? 1 : 0) + //@ts-ignore + .attr(PostTurnFormChangeAbAttr, p => p.getFormKey ? 0 : 1) // TODO: fix ts-ignore + //@ts-ignore + .attr(PostTurnFormChangeAbAttr, p => p.getFormKey ? 1 : 0) // TODO: fix ts-ignore .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) @@ -5077,26 +5692,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) => getPokemonMessage(pokemon, " has two Abilities!")) + .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) => getPokemonMessage(pokemon, " has two Abilities!")) + .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), @@ -5106,26 +5721,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) => user.getMoveType(move) === 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) @@ -5139,7 +5754,7 @@ export function initAbilities() { .attr(NoTransformAbilityAbAttr) .attr(NoFusionAbilityAbAttr) .attr(PostBattleInitFormChangeAbAttr, () => 0) - .attr(PreSwitchOutFormChangeAbAttr, () => 1) + .attr(PreSwitchOutFormChangeAbAttr, (pokemon) => !pokemon.isFainted() ? 1 : pokemon.formIndex) .bypassFaint(), new Ability(Abilities.COMMANDER, 9) .attr(UncopiableAbilityAbAttr) @@ -5166,31 +5781,31 @@ export function initAbilities() { .ignorable() .partial(), new Ability(Abilities.VESSEL_OF_RUIN, 9) - .attr(FieldMultiplyBattleStatAbAttr, Stat.SPATK, 0.75) - .attr(PostSummonMessageAbAttr, (user) => getPokemonMessage(user, `'s Vessel of Ruin lowered the ${getStatName(Stat.SPATK)}\nof all surrounding Pokémon!`)) + .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) => getPokemonMessage(user, `'s Sword of Ruin lowered the ${getStatName(Stat.DEF)}\nof all surrounding Pokémon!`)) + .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) => getPokemonMessage(user, `'s Tablets of Ruin lowered the ${getStatName(Stat.ATK)}\nof all surrounding Pokémon!`)) + .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) => getPokemonMessage(user, `'s Beads of Ruin lowered the ${getStatName(Stat.SPDEF)}\nof all surrounding Pokémon!`)) + .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) @@ -5211,15 +5826,16 @@ export function initAbilities() { .partial() // Healing not blocked by Heal Block .ignorable(), new Ability(Abilities.MYCELIUM_MIGHT, 9) - .attr(MoveAbilityBypassAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS) - .partial(), + .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) @@ -5227,25 +5843,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) @@ -5258,10 +5874,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) @@ -5269,6 +5885,6 @@ export function initAbilities() { new Ability(Abilities.POISON_PUPPETEER, 9) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .conditionalAttr(pokemon => pokemon.species.speciesId===Species.PECHARUNT,ConfusionOnStatusEffectAbAttr,StatusEffect.POISON,StatusEffect.TOXIC) + .conditionalAttr(pokemon => pokemon.species.speciesId===Species.PECHARUNT, ConfusionOnStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) ); } diff --git a/src/data/api-generator.script.ts b/src/data/api-generator.script.ts deleted file mode 100644 index f4a72a24c76..00000000000 --- a/src/data/api-generator.script.ts +++ /dev/null @@ -1,689 +0,0 @@ -import { MainClient, NamedAPIResource } from "pokenode-ts"; -import { MoveTarget, allMoves } from "./move"; -import * as Utils from "../utils"; -import fs from "vite-plugin-fs/browser"; -import PokemonSpecies, { PokemonForm, SpeciesFormKey, allSpecies } from "./pokemon-species"; -import { GrowthRate } from "./exp"; -import { Type } from "./type"; -import { allAbilities } from "./ability"; -import { pokemonFormLevelMoves } from "./pokemon-level-moves"; -import { tmSpecies } from "./tms"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; - -const targetMap = { - "specific-move": MoveTarget.ATTACKER, - "selected-pokemon-me-first": MoveTarget.NEAR_ENEMY, - "ally": MoveTarget.NEAR_ALLY, - "users-field": MoveTarget.USER_SIDE, - "user-or-ally": MoveTarget.USER_OR_NEAR_ALLY, - "opponents-field": MoveTarget.ENEMY_SIDE, - "user": MoveTarget.USER, - "random-opponent": MoveTarget.RANDOM_NEAR_ENEMY, - "all-other-pokemon": MoveTarget.ALL_NEAR_OTHERS, - "selected-pokemon": MoveTarget.NEAR_OTHER, - "all-opponents": MoveTarget.ALL_NEAR_ENEMIES, - "entire-field": MoveTarget.BOTH_SIDES, - "user-and-allies": MoveTarget.USER_AND_ALLIES, - "all-pokemon": MoveTarget.ALL, - "all-allies": MoveTarget.NEAR_ALLY, - "fainting-pokemon": MoveTarget.NEAR_OTHER -}; - -const generationMap = { - "generation-i": 1, - "generation-ii": 2, - "generation-iii": 3, - "generation-iv": 4, - "generation-v": 5, - "generation-vi": 6, - "generation-vii": 7, - "generation-viii": 8, - "generation-ix": 9 -}; - -const growthRateMap = { - "slow-then-very-fast": GrowthRate.ERRATIC, - "fast": GrowthRate.FAST, - "medium": GrowthRate.MEDIUM_FAST, - "medium-slow": GrowthRate.MEDIUM_SLOW, - "slow": GrowthRate.SLOW, - "fast-then-very-slow": GrowthRate.FLUCTUATING -}; - -const regionalForms = [ "alola", "galar", "hisui", "paldea" ]; - -const ignoredForms = [ "gmax", "totem", "cap", "starter" ]; - -const generationDexNumbers = { - 1: 151, - 2: 251, - 3: 386, - 4: 494, - 5: 649, - 6: 721, - 7: 809, - 8: 905, - 9: 1010 -}; - -const versions = [ "scarlet-violet", "sword-shield", "sun-moon" ]; - -type LevelMove = [level: integer, moveId: integer]; - -interface SpeciesLevelMoves { - [key: string]: LevelMove[] -} - -interface FormLevelMoves { - [key: integer]: LevelMove[] -} - -interface SpeciesFormLevelMoves { - [key: string]: FormLevelMoves -} - -interface TmSpecies { - [key: string]: Array -} - -export async function printPokemon() { - const api = new MainClient(); - - const useExistingTmList = true; - - let enumStr = "export enum Species {\n"; - let pokemonSpeciesStr = "\tallSpecies.push(\n"; - const speciesLevelMoves: SpeciesLevelMoves = {}; - const speciesFormLevelMoves: SpeciesFormLevelMoves = {}; - const moveTmSpecies: TmSpecies = {}; - - let pokemonArr: NamedAPIResource[] = []; - - const offset = 0; - const pokemonResponse = await api.pokemon.listPokemons(offset, 2000); - - pokemonArr = pokemonResponse.results; - - const types = Utils.getEnumKeys(Type).map(t => t.toLowerCase()); - const abilities = Utils.getEnumKeys(Abilities).map(a => a.toLowerCase().replace(/\_/g, "-")); - - const pokemonSpeciesList: PokemonSpecies[] = []; - - for (const p of pokemonArr) { - const pokemon = await api.pokemon.getPokemonByName(p.name); - - let region: string = ""; - - if (pokemon.id > 10000) { - const dexIdMatch = /\/(\d+)\//.exec(pokemon.species.url); - if (!dexIdMatch) { - continue; - } - - const matchingSpecies = pokemonSpeciesList[parseInt(dexIdMatch[1]) - 1]; - - if (!matchingSpecies) { - continue; - } - - const speciesKey = (matchingSpecies as any).key as string; - - const formName = pokemon.name.slice(speciesKey.length + 1); - - if (ignoredForms.filter(f => formName.indexOf(f) > -1).length) { - continue; - } - - const shortFormName = formName.indexOf("-") > -1 - ? formName.slice(0, formName.indexOf("-")) - : formName; - - if (regionalForms.indexOf(shortFormName) > -1) { - region = shortFormName.toUpperCase(); - } else { - const formBaseStats: integer[] = []; - let formBaseTotal = 0; - // Assume correct stat order in API result - for (const stat of pokemon.stats) { - formBaseStats.push(stat.base_stat); - formBaseTotal += stat.base_stat; - } - - const [ formType1, formType2 ] = [ types.indexOf(pokemon.types.find(t => t.slot === 1).type.name), types.indexOf(pokemon.types.find(t => t.slot === 2)?.type.name) ]; - const [ formAbility1, formAbility2, formAbilityHidden ] = [ - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 1)?.ability.name), 0), - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 2)?.ability.name), 0), - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 3)?.ability.name), 0) - ]; - - const pokemonForm = new PokemonForm(formName, formName, formType1 as Type, formType2 > -1 ? formType2 as Type : null, pokemon.height / 10, pokemon.weight / 10, - formAbility1 as Abilities, formAbility2 as Abilities, formAbilityHidden as Abilities, formBaseTotal, formBaseStats[0], formBaseStats[1], formBaseStats[2], formBaseStats[3], formBaseStats[4], formBaseStats[5], - matchingSpecies.catchRate, matchingSpecies.baseFriendship, matchingSpecies.baseExp, matchingSpecies.genderDiffs); - pokemonForm.speciesId = matchingSpecies.speciesId; - pokemonForm.formIndex = matchingSpecies.forms.length; - pokemonForm.generation = matchingSpecies.generation; - - let moveVer: string; - - if (!speciesFormLevelMoves.hasOwnProperty(speciesKey)) { - speciesFormLevelMoves[speciesKey] = []; - } - speciesFormLevelMoves[speciesKey][pokemonForm.formIndex] = []; - - for (const version of versions) { - if (pokemon.moves.find(m => m.version_group_details.find(v => v.version_group.name === version && v.move_learn_method.name === "level-up"))) { - moveVer = version; - break; - } - } - - if (moveVer) { - pokemon.moves.forEach(moveData => { - moveData.version_group_details.filter(v => versions.indexOf(v.version_group.name) > -1).forEach(verData => { - const isMoveVer = verData.version_group.name === moveVer; - - const moveName = moveData.move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); - const moveId = Math.max(Utils.getEnumKeys(Moves).indexOf(moveName), 0); - - const learnMethod = verData.move_learn_method.name; - - if (isMoveVer && learnMethod === "level-up") { - speciesFormLevelMoves[speciesKey][pokemonForm.formIndex].push([ verData.level_learned_at, moveId ]); - } - - if ([ "machine", "tutor" ].indexOf(learnMethod) > -1 || (useExistingTmList && tmSpecies.hasOwnProperty(moveId as Moves) && learnMethod === "level-up")) { - if (!moveTmSpecies.hasOwnProperty(moveId)) { - moveTmSpecies[moveId] = []; - } - const speciesIndex = moveTmSpecies[moveId].findIndex(s => s[0] === speciesKey); - if (speciesIndex === -1) { - moveTmSpecies[moveId].push([ speciesKey, formName ]); - } else { - (moveTmSpecies[moveId][speciesIndex] as string[]).push(formName); - } - } - }); - }); - - if (JSON.stringify(speciesLevelMoves[speciesKey]) === JSON.stringify(speciesFormLevelMoves[speciesKey][pokemonForm.formIndex])) { - delete speciesFormLevelMoves[speciesKey][pokemonForm.formIndex]; - if (!Object.keys(speciesFormLevelMoves[speciesKey]).length) { - delete speciesFormLevelMoves[speciesKey]; - } - } - } - - matchingSpecies.forms.push(pokemonForm); - continue; - } - } - - const species = await api.pokemon.getPokemonSpeciesByName(pokemon.species.name); - - let speciesKey = species.name.toUpperCase().replace(/\-/g, "_"); - - const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === speciesKey); - - let dexId = species.id; - - if (region) { - dexId += (regionalForms.indexOf(region.toLowerCase()) + 1) * 2000; - speciesKey = `${region}_${speciesKey}`; - } - - let generationIndex = 0; - - if (!region) { - while (++generationIndex < 9 && dexId > generationDexNumbers[generationIndex]) {} - } else { - generationIndex = regionalForms.indexOf(region.toLowerCase()) + 6; - } - - const baseStats: integer[] = []; - let baseTotal = 0; - // Assume correct stat order in API result - for (const stat of pokemon.stats) { - baseStats.push(stat.base_stat); - baseTotal += stat.base_stat; - } - - console.log(pokemon); - - const [ type1, type2 ] = [ types.indexOf(pokemon.types.find(t => t.slot === 1).type.name), types.indexOf(pokemon.types.find(t => t.slot === 2)?.type.name) ]; - const [ ability1, ability2, abilityHidden ] = [ - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 1)?.ability.name), 0), - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 2)?.ability.name), 0), - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 3)?.ability.name), 0) - ]; - - const pokemonSpecies = new PokemonSpecies(dexId, generationIndex, species.is_legendary && baseTotal < 660, species.is_legendary && baseTotal >= 660, species.is_mythical, - species.genera.find(g => g.language.name === "en")?.genus, type1 as Type, type2 > -1 ? type2 as Type : null, pokemon.height / 10, pokemon.weight / 10, ability1 as Abilities, ability2 as Abilities, abilityHidden as Abilities, - baseTotal, baseStats[0], baseStats[1], baseStats[2], baseStats[3], baseStats[4], baseStats[5], species.capture_rate, species.base_happiness, pokemon.base_experience, growthRateMap[species.growth_rate.name], - species.gender_rate < 9 ? 100 - (species.gender_rate * 12.5) : null, species.has_gender_differences, species.forms_switchable); - - (pokemonSpecies as any).key = speciesKey; - - pokemonSpeciesList.push(pokemonSpecies); - - let moveVer: string; - - speciesLevelMoves[speciesKey] = []; - - for (const version of versions) { - if (pokemon.moves.find(m => m.version_group_details.find(v => v.version_group.name === version && v.move_learn_method.name === "level-up"))) { - moveVer = version; - break; - } - } - - const speciesTmMoves: integer[] = []; - - if (moveVer) { - pokemon.moves.forEach(moveData => { - const verData = moveData.version_group_details.find(v => v.version_group.name === moveVer); - if (!verData) { - return; - } - - const moveName = moveData.move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); - const moveId = Math.max(Utils.getEnumKeys(Moves).indexOf(moveName), 0); - - switch (verData.move_learn_method.name) { - case "level-up": - speciesLevelMoves[speciesKey].push([ verData.level_learned_at, moveId ]); - break; - case "machine": - case "tutor": - if (moveId > 0) { - if (!moveTmSpecies.hasOwnProperty(moveId)) { - moveTmSpecies[moveId] = []; - } - if (moveTmSpecies[moveId].indexOf(speciesKey) === -1) { - moveTmSpecies[moveId].push(speciesKey); - } - speciesTmMoves.push(moveId); - } - break; - } - }); - } - - for (const f of pokemon.forms) { - const form = await api.pokemon.getPokemonFormByName(f.name); - const formIndex = pokemonSpecies.forms.length; - - const matchingForm = matchingExistingSpecies && matchingExistingSpecies.forms.length > formIndex - ? matchingExistingSpecies.forms.find(f2 => f2.formKey === form.form_name || f2.formName === form.form_name) || matchingExistingSpecies.forms[formIndex] - : null; - const formName = matchingForm - ? matchingForm.formName - : form.form_names.find(fn => fn.language.name === "en")?.name || form.form_name; - const formKey = matchingForm - ? matchingForm.formKey - : form.form_name; - - const [ formType1, formType2 ] = [ types.indexOf(form.types.find(t => t.slot === 1).type.name), types.indexOf(form.types.find(t => t.slot === 2)?.type.name) ]; - const pokemonForm = new PokemonForm(formName, formKey, formType1 as Type, formType2 > -1 ? formType2 as Type : null, - pokemonSpecies.height, pokemonSpecies.weight, pokemonSpecies.ability1, pokemonSpecies.ability2, pokemonSpecies.abilityHidden, baseTotal, baseStats[0], baseStats[1], baseStats[2], baseStats[3], baseStats[4], baseStats[5], - pokemonSpecies.catchRate, pokemonSpecies.baseFriendship, pokemonSpecies.baseExp, pokemonSpecies.genderDiffs); - pokemonForm.speciesId = pokemonSpecies.speciesId; - pokemonForm.formIndex = formIndex; - pokemonForm.generation = pokemonSpecies.generation; - - if (!pokemonForm.formIndex && speciesTmMoves.length) { - for (const moveId of speciesTmMoves) { - const speciesIndex = moveTmSpecies[moveId].findIndex(s => s === speciesKey); - moveTmSpecies[moveId][speciesIndex] = [ - speciesKey, - formKey - ]; - } - } - - pokemonSpecies.forms.push(pokemonForm); - } - - console.log(pokemonSpecies.name, pokemonSpecies); - } - - for (const pokemonSpecies of pokemonSpeciesList) { - const speciesKey = (pokemonSpecies as any).key as string; - - enumStr += ` ${speciesKey}${pokemonSpecies.speciesId >= 2000 ? ` = ${pokemonSpecies.speciesId}` : ""},\n`; - pokemonSpeciesStr += ` new PokemonSpecies(Species.${speciesKey}, "${pokemonSpecies.name}", ${pokemonSpecies.generation}, ${pokemonSpecies.subLegendary}, ${pokemonSpecies.legendary}, ${pokemonSpecies.mythical}, "${pokemonSpecies.species}", Type.${Type[pokemonSpecies.type1]}, ${pokemonSpecies.type2 ? `Type.${Type[pokemonSpecies.type2]}` : "null"}, ${pokemonSpecies.height}, ${pokemonSpecies.weight}, Abilities.${Abilities[pokemonSpecies.ability1]}, Abilities.${Abilities[pokemonSpecies.ability2]}, Abilities.${Abilities[pokemonSpecies.abilityHidden]}, ${pokemonSpecies.baseTotal}, ${pokemonSpecies.baseStats[0]}, ${pokemonSpecies.baseStats[1]}, ${pokemonSpecies.baseStats[2]}, ${pokemonSpecies.baseStats[3]}, ${pokemonSpecies.baseStats[4]}, ${pokemonSpecies.baseStats[5]}, ${pokemonSpecies.catchRate}, ${pokemonSpecies.baseFriendship}, ${pokemonSpecies.baseExp}, GrowthRate.${GrowthRate[pokemonSpecies.growthRate]}, ${pokemonSpecies.malePercent}, ${pokemonSpecies.genderDiffs}`; - if (pokemonSpecies.forms.length > 1) { - pokemonSpeciesStr += `, ${pokemonSpecies.canChangeForm},`; - for (const form of pokemonSpecies.forms) { - pokemonSpeciesStr += `\n new PokemonForm("${form.formName}", "${form.formName}", Type.${Type[form.type1]}, ${form.type2 ? `Type.${Type[form.type2]}` : "null"}, ${form.height}, ${form.weight}, Abilities.${Abilities[form.ability1]}, Abilities.${Abilities[form.ability2]}, Abilities.${Abilities[form.abilityHidden]}, ${form.baseTotal}, ${form.baseStats[0]}, ${form.baseStats[1]}, ${form.baseStats[2]}, ${form.baseStats[3]}, ${form.baseStats[4]}, ${form.baseStats[5]}, ${form.catchRate}, ${form.baseFriendship}, ${form.baseExp}${form.genderDiffs ? ", true" : ""}),`; - } - pokemonSpeciesStr += "\n "; - } - pokemonSpeciesStr += "),\n"; - } - - let speciesLevelMovesStr = "export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {\n"; - let speciesFormLevelMovesStr = "export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = {\n"; - let tmSpeciesStr = "export const tmSpecies: TmSpecies = {\n"; - - for (const species of Object.keys(speciesLevelMoves)) { - speciesLevelMovesStr += ` [Species.${species}]: [\n`; - - const orderedLevelMoves = speciesLevelMoves[species].sort((a: LevelMove, b: LevelMove) => { - if (a[0] !== b[0]) { - return a[0] < b[0] ? -1 : 1; - } - return a[1] < b[1] ? -1 : 1; - }); - - for (const lm of orderedLevelMoves) { - speciesLevelMovesStr += ` [ ${lm[0]}, Moves.${Moves[lm[1]]} ],\n`; - } - - speciesLevelMovesStr += " ],\n"; - } - - for (const species of Object.keys(speciesFormLevelMoves)) { - speciesFormLevelMovesStr += ` [Species.${species}]: {\n`; - - for (const f of Object.keys(speciesFormLevelMoves[species])) { - speciesFormLevelMovesStr += ` ${f}: [\n`; - - const orderedLevelMoves = speciesFormLevelMoves[species][f].sort((a: LevelMove, b: LevelMove) => { - if (a[0] !== b[0]) { - return a[0] < b[0] ? -1 : 1; - } - return a[1] < b[1] ? -1 : 1; - }); - - for (const lm of orderedLevelMoves) { - speciesFormLevelMovesStr += ` [ ${lm[0]}, Moves.${Moves[lm[1]]} ],\n`; - } - - speciesFormLevelMovesStr += " ],\n"; - } - - speciesFormLevelMovesStr += " },\n"; - } - - for (const moveId of Object.keys(moveTmSpecies)) { - tmSpeciesStr += ` [Moves.${Moves[parseInt(moveId)]}]: [\n`; - for (const species of moveTmSpecies[moveId]) { - if (typeof species === "string") { - tmSpeciesStr += ` Species.${species},\n`; - } else { - const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === species[0]); - const forms = (species as string[]).slice(1); - if (matchingExistingSpecies && (!pokemonFormLevelMoves.hasOwnProperty(matchingExistingSpecies.speciesId) || matchingExistingSpecies.forms.length <= 1 || (matchingExistingSpecies.forms.length === 2 && matchingExistingSpecies.forms[1].formKey.indexOf(SpeciesFormKey.MEGA) > -1) || matchingExistingSpecies.forms.length === forms.length)) { - tmSpeciesStr += ` Species.${species[0]},\n`; - } else { - tmSpeciesStr += ` [\n Species.${species[0]},\n`; - for (const form of forms) { - tmSpeciesStr += ` '${form}',\n`; - } - tmSpeciesStr += " ],\n"; - } - } - } - tmSpeciesStr += " ],\n"; - } - - enumStr += "\n};"; - pokemonSpeciesStr += " );"; - speciesLevelMovesStr += "\n};"; - speciesFormLevelMovesStr += "\n};"; - tmSpeciesStr += "\n};"; - - console.log(enumStr); - console.log(pokemonSpeciesStr); - console.log(speciesLevelMovesStr); - console.log(speciesFormLevelMovesStr); - console.log(tmSpeciesStr); - - console.log(moveTmSpecies); -} - -export async function printAbilities() { - const replaceText = true; - - let abilityContent: string = await fs.readFile("./src/data/ability.ts"); - - const api = new MainClient(); - - let enumStr = "export enum Abilities {\n NONE,"; - let abilityStr = " allAbilities.push("; - - abilityContent = abilityContent.slice(abilityContent.indexOf(abilityStr)); - - let abilities: NamedAPIResource[] = []; - const offset = 0; - const abilitiesResponse = await api.pokemon.listAbilities(offset, 2000); - abilities = abilitiesResponse.results; - - for (const a of abilities) { - const ability = await api.pokemon.getAbilityByName(a.name); - const abilityEnumName = ability.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); - enumStr += `\n ${abilityEnumName},`; - console.log(ability.name, ability); - - const matchingLineIndex = abilityContent.search(new RegExp(`new Ability\\\(Abilities.${abilityEnumName},`)); - let matchingLine = matchingLineIndex > -1 ? abilityContent.slice(matchingLineIndex) : null; - if (matchingLine) { - matchingLine = matchingLine.slice(0, matchingLine.search(/,(?: \/\/.*?)?(?:\r)?\n[ \t]+(?:new|\);)/)); - } - - let abilityName = ability.names.find(ln => ln.language.name === "en").name; - [ "N", "P" ].every(s => { - if (!matchingLine || matchingLine.indexOf(` (${s})`) > -1) { - abilityName += ` (${s})`; - return false; - } - return true; - }); - - let flavorText: string; - if (!matchingLine || replaceText) { - for (const version of versions) { - if ((flavorText = ability.flavor_text_entries.find(fte => fte.language.name === "en" && fte.version_group.name === version)?.flavor_text) || "") { - if (flavorText.indexOf("forgotten") > -1) { - continue; - } - break; - } - } - } else if (matchingLine) { - flavorText = allAbilities[ability.id].description; - } - abilityStr += `\n new Ability(Abilities.${abilityEnumName}, "${abilityName}", "${flavorText?.replace(/\n/g, "\\n").replace(/ /g, " ").replace(/’/g, "'") || ""}", ${generationMap[ability.generation.name]})`; - if (matchingLine && matchingLine.length > 1) { - const newLineIndex = matchingLine.indexOf("\n"); - if (newLineIndex > -1) { - abilityStr += matchingLine.slice(newLineIndex); - } - } - abilityStr += ","; - } - - enumStr += "\n};"; - abilityStr += "\n);"; - - console.log(enumStr); - console.log(abilityStr); -} - -export async function printMoves() { - const replaceText = true; - - let moveContent: string = await fs.readFile("./src/data/move.ts"); - - const api = new MainClient(); - - let enumStr = "export enum Moves {\n NONE,"; - let moveStr = " allMoves.push("; - - moveContent = moveContent.slice(moveContent.indexOf(moveStr)); - - let moves: NamedAPIResource[] = []; - const offset = 0; - const movesResponse = await api.move.listMoves(offset, 2000); - moves = movesResponse.results; - - console.log(moves); - - for (const m of moves) { - const move = await api.move.getMoveByName(m.name); - const moveEnumName = move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); - enumStr += `\n ${moveEnumName},`; - console.log(move.name, move); - - const matchingLineIndex = moveContent.search(new RegExp(`new (?:Attack|(?:Self)?Status)Move\\\(Moves.${Moves[move.id]},`)); - let matchingLine = matchingLineIndex > -1 ? moveContent.slice(matchingLineIndex) : null; - if (matchingLine) { - matchingLine = matchingLine.slice(0, matchingLine.search(/,(?: \/\/.*?)?(?:\r)?\n[ \t]+(?:new|\);)/)); - } - - let moveName = move.names.find(ln => ln.language.name === "en").name; - [ "N", "P" ].every(s => { - if (!matchingLine || matchingLine.indexOf(` (${s})`) > -1) { - moveName += ` (${s})`; - return false; - } - return true; - }); - - let flavorText: string; - if (!matchingLine || replaceText) { - for (const version of versions) { - if ((flavorText = move.flavor_text_entries.find(fte => fte.language.name === "en" && fte.version_group.name === version)?.flavor_text) || "") { - if (flavorText.indexOf("forgotten") > -1) { - continue; - } - break; - } - } - } else if (matchingLine) { - flavorText = allMoves[move.id].effect; - } - const moveTarget = targetMap[move.target.name]; - moveStr += `\n new ${move.damage_class.name !== "status" ? "Attack" : (moveTarget === MoveTarget.USER ? "Self" : "") + "Status"}Move(Moves.${moveEnumName}, "${moveName}", Type.${move.type.name.toUpperCase()}${move.damage_class.name !== "status" ? `, MoveCategory.${move.damage_class.name.toUpperCase()}` : ""}${move.damage_class.name !== "status" ? `, ${move.power || -1}` : ""}, ${move.accuracy || -1}, ${move.pp}, "${flavorText?.replace(/\n/g, "\\n").replace(/ /g, " ").replace(/’/g, "'") || ""}", ${move.effect_chance || -1}, ${move.priority}, ${generationMap[move.generation.name]})`; - const expectedTarget = move.damage_class.name !== "status" || moveTarget !== MoveTarget.USER ? MoveTarget.NEAR_OTHER : MoveTarget.USER; - if (matchingLine && matchingLine.length > 1) { - const newLineIndex = matchingLine.indexOf("\n"); - if (newLineIndex > -1) { - console.log(matchingLine.slice(newLineIndex).replace(/(?:\r)?\n[ \t]+.target\(.*?\)/g, ""), newLineIndex); - moveStr += matchingLine.slice(newLineIndex).replace(/(?:\r)?\n[ \t]+.target\(.*?\)/g, ""); - } - } - if (moveTarget !== expectedTarget) { - moveStr += `\n .target(MoveTarget.${MoveTarget[moveTarget]})`; - } - moveStr += ","; - } - - enumStr += "\n};"; - moveStr += "\n);"; - - console.log(enumStr); - console.log(moveStr); -} - -export async function printTmSpecies() { - const moveTmSpecies: TmSpecies = {}; - - const api = new MainClient(); - - const moveIds = Object.keys(tmSpecies).map(k => parseInt(k) as Moves); - - for (const moveId of moveIds) { - const move = await api.move.getMoveById(moveId); - - moveTmSpecies[moveId] = []; - - for (const species of move.learned_by_pokemon) { - const dexIdMatch = /\/(\d+)\//.exec(species.url); - if (!dexIdMatch) { - continue; - } - - const dexId = parseInt(dexIdMatch[1]); - - let matchingSpecies: PokemonSpecies; - let formKey = ""; - - console.log(species.name); - - if (dexId < 10000) { - matchingSpecies = allSpecies[dexId - 1]; - } else { - const pokemon = await api.pokemon.getPokemonById(dexId); - - const speciesDexIdMatch = /\/(\d+)\//.exec(pokemon.species.url); - if (!speciesDexIdMatch) { - continue; - } - - const speciesDexId = parseInt(speciesDexIdMatch[1]); - - const speciesKey = Species[allSpecies[speciesDexId - 1].speciesId]; - - formKey = species.name.slice(speciesKey.length + 1); - - const regionKey = regionalForms.find(r => formKey.indexOf(r) > -1); - - if (regionKey) { - formKey = formKey.slice(regionKey.length + 1); - matchingSpecies = allSpecies.find(s => Species[s.speciesId] === `${regionKey.toUpperCase()}_${speciesKey}`); - } else { - matchingSpecies = allSpecies[speciesDexId - 1]; - } - } - - if (!matchingSpecies) { - console.log("NO MATCH", species.name); - continue; - } - - const speciesKey = Species[matchingSpecies.speciesId]; - - const matchingIndex = moveTmSpecies[moveId].findIndex(s => Array.isArray(s) ? s[0] === speciesKey : s === speciesKey); - - if (matchingIndex === -1) { - moveTmSpecies[moveId].push(!formKey ? speciesKey : [ speciesKey, formKey ]); - } else { - if (!Array.isArray(moveTmSpecies[moveId][matchingIndex])) { - moveTmSpecies[moveId][matchingIndex] = [ moveTmSpecies[moveId][matchingIndex] as string, "" ]; - } - (moveTmSpecies[moveId][matchingIndex] as string[]).push(formKey); - } - } - } - - let tmSpeciesStr = "export const tmSpecies: TmSpecies = {\n"; - - for (const moveId of Object.keys(moveTmSpecies)) { - tmSpeciesStr += ` [Moves.${Moves[parseInt(moveId)]}]: [\n`; - for (const species of moveTmSpecies[moveId]) { - if (typeof species === "string") { - tmSpeciesStr += ` Species.${species},\n`; - } else { - const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === species[0]); - const forms = (species as string[]).slice(1); - if (matchingExistingSpecies && (!pokemonFormLevelMoves.hasOwnProperty(matchingExistingSpecies.speciesId) || matchingExistingSpecies.forms.length <= 1 || (matchingExistingSpecies.forms.length === 2 && matchingExistingSpecies.forms[1].formKey.indexOf(SpeciesFormKey.MEGA) > -1) || matchingExistingSpecies.forms.length === forms.length)) { - tmSpeciesStr += ` Species.${species[0]},\n`; - } else { - tmSpeciesStr += ` [\n Species.${species[0]},\n`; - for (const form of forms) { - tmSpeciesStr += ` '${form}',\n`; - } - tmSpeciesStr += " ],\n"; - } - } - } - tmSpeciesStr += " ],\n"; - } - - tmSpeciesStr += "\n};"; - - console.log(tmSpeciesStr); -} diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 28d38daffb4..fdc32b75c19 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1,20 +1,23 @@ import { Arena } from "../field/arena"; import { Type } from "./type"; import * as Utils from "../utils"; -import { MoveCategory, allMoves, MoveTarget } from "./move"; -import { getPokemonMessage } from "../messages"; +import { MoveCategory, allMoves, MoveTarget, IncrementMovePriorityAttr, applyMoveAttrs } from "./move"; +import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; -import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { StatusEffect } from "./status-effect"; import { BattlerIndex } from "../battle"; -import { BlockNonDirectDamageAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability"; -import { BattleStat } from "./battle-stat"; +import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability"; +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"; +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, @@ -25,12 +28,12 @@ export enum ArenaTagSide { export abstract class ArenaTag { public tagType: ArenaTagType; public turnCount: integer; - public sourceMove: Moves; - public sourceId: integer; + public sourceMove?: Moves; + public sourceId?: integer; public side: ArenaTagSide; - constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId?: integer, side: ArenaTagSide = ArenaTagSide.BOTH) { + constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId?: integer, side: ArenaTagSide = ArenaTagSide.BOTH) { this.tagType = tagType; this.turnCount = turnCount; this.sourceMove = sourceMove; @@ -46,7 +49,7 @@ export abstract class ArenaTag { onRemove(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`${this.getMoveName()}\'s effect wore off${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); + arena.scene.queueMessage(i18next.t(`arenaTag:arenaOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, { moveName: this.getMoveName() })); } } @@ -56,7 +59,7 @@ export abstract class ArenaTag { return this.turnCount < 1 || !!(--this.turnCount); } - getMoveName(): string { + getMoveName(): string | null { return this.sourceMove ? allMoves[this.sourceMove].name : null; @@ -75,16 +78,21 @@ export class MistTag extends ArenaTag { onAdd(arena: Arena, quiet: boolean = false): void { super.onAdd(arena); - const source = arena.scene.getPokemonById(this.sourceId); - if (!quiet) { - arena.scene.queueMessage(getPokemonMessage(source, "'s team became\nshrouded in mist!")); + if (this.sourceId) { + const source = arena.scene.getPokemonById(this.sourceId); + + if (!quiet && source) { + arena.scene.queueMessage(i18next.t("arenaTag:mistOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + } else if (!quiet) { + console.warn("Failed to get source for MistTag onAdd"); + } } } apply(arena: Arena, args: any[]): boolean { (args[0] as Utils.BooleanHolder).value = true; - arena.scene.queueMessage("The mist prevented\nthe lowering of stats!"); + arena.scene.queueMessage(i18next.t("arenaTag:mistApply")); return true; } @@ -144,7 +152,7 @@ class ReflectTag extends WeakenMoveScreenTag { onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`Reflect reduced the damage of physical moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); + arena.scene.queueMessage(i18next.t(`arenaTag:reflectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } } } @@ -160,7 +168,7 @@ class LightScreenTag extends WeakenMoveScreenTag { onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`Light Screen reduced the damage of special moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); + arena.scene.queueMessage(i18next.t(`arenaTag:lightScreenOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } } } @@ -176,29 +184,32 @@ class AuroraVeilTag extends WeakenMoveScreenTag { onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`Aurora Veil reduced the damage of moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); + arena.scene.queueMessage(i18next.t(`arenaTag:auroraVeilOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } } } -type ProtectConditionFunc = (...args: any[]) => boolean; +type ProtectConditionFunc = (arena: Arena, moveId: Moves) => boolean; /** - * Abstract class to implement conditional team protection + * Class to implement conditional team protection * applies protection based on the attributes of incoming moves - * @param protectConditionFunc: The function determining if an incoming move is negated */ -abstract class ConditionalProtectTag extends ArenaTag { +export class ConditionalProtectTag extends ArenaTag { + /** The condition function to determine which moves are negated */ protected protectConditionFunc: ProtectConditionFunc; + /** Does this apply to all moves, including those that ignore other forms of protection? */ + protected ignoresBypass: boolean; - constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, condition: ProtectConditionFunc) { + constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, condition: ProtectConditionFunc, ignoresBypass: boolean = false) { super(tagType, 1, sourceMove, sourceId, side); this.protectConditionFunc = condition; + this.ignoresBypass = ignoresBypass; } onAdd(arena: Arena): void { - arena.scene.queueMessage(`${super.getMoveName()} protected${this.side === ArenaTagSide.PLAYER ? " your" : this.side === ArenaTagSide.ENEMY ? " the\nopposing" : ""} team!`); + arena.scene.queueMessage(i18next.t(`arenaTag:conditionalProtectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, { moveName: super.getMoveName() })); } // Removes default message for effect removal @@ -208,42 +219,91 @@ abstract class ConditionalProtectTag extends ArenaTag { * apply(): Checks incoming moves against the condition function * and protects the target if conditions are met * @param arena The arena containing this tag - * @param args[0] (Utils.BooleanHolder) Signals if the move is cancelled - * @param args[1] (Pokemon) The intended target of the move - * @param args[2...] (any[]) The parameters to the condition function + * @param args\[0\] (Utils.BooleanHolder) Signals if the move is cancelled + * @param args\[1\] (Pokemon) The Pokemon using the move + * @param args\[2\] (Pokemon) The intended target of the move + * @param args\[3\] (Moves) The parameters to the condition function + * @param args\[4\] (Utils.BooleanHolder) Signals if the applied protection supercedes protection-ignoring effects * @returns */ apply(arena: Arena, args: any[]): boolean { - if ((args[0] as Utils.BooleanHolder).value) { - return false; - } + const [ cancelled, user, target, moveId, ignoresBypass ] = args; - const target = args[1] as Pokemon; - if ((this.side === ArenaTagSide.PLAYER) === target.isPlayer() - && this.protectConditionFunc(...args.slice(2))) { - (args[0] as Utils.BooleanHolder).value = true; - new CommonBattleAnim(CommonAnim.PROTECT, target).play(arena.scene); - arena.scene.queueMessage(`${super.getMoveName()} protected ${getPokemonMessage(target, "!")}`); - return true; + if (cancelled instanceof Utils.BooleanHolder + && user instanceof Pokemon + && target instanceof Pokemon + && typeof moveId === "number" + && ignoresBypass instanceof Utils.BooleanHolder) { + + if ((this.side === ArenaTagSide.PLAYER) === target.isPlayer() + && this.protectConditionFunc(arena, moveId)) { + if (!cancelled.value) { + cancelled.value = true; + user.stopMultiHit(target); + + new CommonBattleAnim(CommonAnim.PROTECT, target).play(arena.scene); + arena.scene.queueMessage(i18next.t("arenaTag:conditionalProtectApply", { moveName: super.getMoveName(), pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + } + + ignoresBypass.value = ignoresBypass.value || this.ignoresBypass; + return true; + } } return false; } } +/** + * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Guard_(move) Quick Guard's} + * protection effect. + * @param arena {@linkcode Arena} The arena containing the protection effect + * @param moveId {@linkcode Moves} The move to check against this condition + * @returns `true` if the incoming move's priority is greater than 0. This includes + * moves with modified priorities from abilities (e.g. Prankster) + */ +const QuickGuardConditionFunc: ProtectConditionFunc = (arena, moveId) => { + const move = allMoves[moveId]; + const priority = new Utils.IntegerHolder(move.priority); + const effectPhase = arena.scene.getCurrentPhase(); + + if (effectPhase instanceof MoveEffectPhase) { + const attacker = effectPhase.getUserPokemon()!; + applyMoveAttrs(IncrementMovePriorityAttr, attacker, null, move, priority); + applyAbAttrs(ChangeMovePriorityAbAttr, attacker, null, false, move, priority); + } + return priority.value > 0; +}; + /** * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Guard_(move) Quick Guard} * Condition: The incoming move has increased priority. */ class QuickGuardTag extends ConditionalProtectTag { constructor(sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.QUICK_GUARD, Moves.QUICK_GUARD, sourceId, side, - (priority: integer) : boolean => { - return priority > 0; - } - ); + super(ArenaTagType.QUICK_GUARD, Moves.QUICK_GUARD, sourceId, side, QuickGuardConditionFunc); } } +/** + * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Wide_Guard_(move) Wide Guard's} + * protection effect. + * @param arena {@linkcode Arena} The arena containing the protection effect + * @param moveId {@linkcode Moves} The move to check against this condition + * @returns `true` if the incoming move is multi-targeted (even if it's only used against one Pokemon). + */ +const WideGuardConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean => { + const move = allMoves[moveId]; + + switch (move.moveTarget) { + case MoveTarget.ALL_ENEMIES: + case MoveTarget.ALL_NEAR_ENEMIES: + case MoveTarget.ALL_OTHERS: + case MoveTarget.ALL_NEAR_OTHERS: + return true; + } + return false; +}; + /** * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Wide_Guard_(move) Wide Guard} * Condition: The incoming move can target multiple Pokemon. The move's source @@ -251,40 +311,59 @@ class QuickGuardTag extends ConditionalProtectTag { */ class WideGuardTag extends ConditionalProtectTag { constructor(sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.WIDE_GUARD, Moves.WIDE_GUARD, sourceId, side, - (moveTarget: MoveTarget) : boolean => { - switch (moveTarget) { - case MoveTarget.ALL_ENEMIES: - case MoveTarget.ALL_NEAR_ENEMIES: - case MoveTarget.ALL_OTHERS: - case MoveTarget.ALL_NEAR_OTHERS: - return true; - } - return false; - } - ); + super(ArenaTagType.WIDE_GUARD, Moves.WIDE_GUARD, sourceId, side, WideGuardConditionFunc); } } +/** + * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Mat_Block_(move) Mat Block's} + * protection effect. + * @param arena {@linkcode Arena} The arena containing the protection effect. + * @param moveId {@linkcode Moves} The move to check against this condition. + * @returns `true` if the incoming move is not a Status move. + */ +const MatBlockConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean => { + const move = allMoves[moveId]; + return move.category !== MoveCategory.STATUS; +}; + /** * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mat_Block_(move) Mat Block} * Condition: The incoming move is a Physical or Special attack move. */ class MatBlockTag extends ConditionalProtectTag { constructor(sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side, - (moveCategory: MoveCategory) : boolean => { - return moveCategory !== MoveCategory.STATUS; - } - ); + super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side, MatBlockConditionFunc); } onAdd(arena: Arena) { - const source = arena.scene.getPokemonById(this.sourceId); - arena.scene.queueMessage(getPokemonMessage(source, " intends to flip up a mat\nand block incoming attacks!")); + if (this.sourceId) { + const source = arena.scene.getPokemonById(this.sourceId); + if (source) { + arena.scene.queueMessage(i18next.t("arenaTag:matBlockOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + } else { + console.warn("Failed to get source for MatBlockTag onAdd"); + } + } } } +/** + * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield's} + * protection effect. + * @param arena {@linkcode Arena} The arena containing the protection effect + * @param moveId {@linkcode Moves} The move to check against this condition + * @returns `true` if the incoming move is a Status move, is not a hazard, and does not target all + * Pokemon or sides of the field. + */ +const CraftyShieldConditionFunc: ProtectConditionFunc = (arena, moveId) => { + const move = allMoves[moveId]; + return move.category === MoveCategory.STATUS + && move.moveTarget !== MoveTarget.ENEMY_SIDE + && move.moveTarget !== MoveTarget.BOTH_SIDES + && move.moveTarget !== MoveTarget.ALL; +}; + /** * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield} * Condition: The incoming move is a Status move, is not a hazard, and does @@ -292,14 +371,40 @@ class MatBlockTag extends ConditionalProtectTag { */ class CraftyShieldTag extends ConditionalProtectTag { constructor(sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side, - (moveCategory: MoveCategory, moveTarget: MoveTarget) : boolean => { - return moveCategory === MoveCategory.STATUS - && moveTarget !== MoveTarget.ENEMY_SIDE - && moveTarget !== MoveTarget.BOTH_SIDES - && moveTarget !== MoveTarget.ALL; - } - ); + super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true); + } +} + +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Lucky_Chant_(move) Lucky Chant}. + * Prevents critical hits against the tag's side. + */ +export class NoCritTag extends ArenaTag { + /** + * Constructor method for the NoCritTag class + * @param turnCount `integer` the number of turns this effect lasts + * @param sourceMove {@linkcode Moves} the move that created this effect + * @param sourceId `integer` the ID of the {@linkcode Pokemon} that created this effect + * @param side {@linkcode ArenaTagSide} the side to which this effect belongs + */ + constructor(turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.NO_CRIT, turnCount, sourceMove, sourceId, side); + } + + /** Queues a message upon adding this effect to the field */ + onAdd(arena: Arena): void { + arena.scene.queueMessage(i18next.t(`arenaTag:noCritOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : "Enemy"}`, { + moveName: this.getMoveName() + })); + } + + /** Queues a message upon removing this effect from the field */ + onRemove(arena: Arena): void { + const source = arena.scene.getPokemonById(this.sourceId!); // TODO: is this bang correct? + arena.scene.queueMessage(i18next.t("arenaTag:noCritOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(source ?? undefined), + moveName: this.getMoveName() + })); } } @@ -317,10 +422,16 @@ class WishTag extends ArenaTag { } onAdd(arena: Arena): void { - const user = arena.scene.getPokemonById(this.sourceId); - this.battlerIndex = user.getBattlerIndex(); - this.triggerMessage = getPokemonMessage(user, "'s wish\ncame true!"); - this.healHp = Math.max(Math.floor(user.getMaxHp() / 2), 1); + if (this.sourceId) { + const user = arena.scene.getPokemonById(this.sourceId); + if (user) { + this.battlerIndex = user.getBattlerIndex(); + this.triggerMessage = i18next.t("arenaTag:wishTagOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user) }); + this.healHp = Utils.toDmgValue(user.getMaxHp() / 2); + } else { + console.warn("Failed to get source for WishTag onAdd"); + } + } } onRemove(arena: Arena): void { @@ -373,11 +484,11 @@ class MudSportTag extends WeakenMoveTypeTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage("Electricity's power was weakened!"); + arena.scene.queueMessage(i18next.t("arenaTag:mudSportOnAdd")); } onRemove(arena: Arena): void { - arena.scene.queueMessage("The effects of Mud Sport\nhave faded."); + arena.scene.queueMessage(i18next.t("arenaTag:mudSportOnRemove")); } } @@ -391,11 +502,11 @@ class WaterSportTag extends WeakenMoveTypeTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage("Fire's power was weakened!"); + arena.scene.queueMessage(i18next.t("arenaTag:waterSportOnAdd")); } onRemove(arena: Arena): void { - arena.scene.queueMessage("The effects of Water Sport\nhave faded."); + arena.scene.queueMessage(i18next.t("arenaTag:waterSportOnRemove")); } } @@ -461,9 +572,9 @@ class SpikesTag extends ArenaTrapTag { onAdd(arena: Arena, quiet: boolean = false): void { super.onAdd(arena); - const source = arena.scene.getPokemonById(this.sourceId); - if (!quiet) { - arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); + const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + if (!quiet && source) { + arena.scene.queueMessage(i18next.t("arenaTag:spikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -474,9 +585,9 @@ class SpikesTag extends ArenaTrapTag { if (!cancelled.value) { const damageHpRatio = 1 / (10 - 2 * this.layers); - const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); + const damage = Utils.toDmgValue(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is hurt\nby the spikes!")); + pokemon.scene.queueMessage(i18next.t("arenaTag:spikesActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -506,9 +617,9 @@ class ToxicSpikesTag extends ArenaTrapTag { onAdd(arena: Arena, quiet: boolean = false): void { super.onAdd(arena); - const source = arena.scene.getPokemonById(this.sourceId); - if (!quiet) { - arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); + const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + if (!quiet && source) { + arena.scene.queueMessage(i18next.t("arenaTag:toxicSpikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -523,12 +634,12 @@ class ToxicSpikesTag extends ArenaTrapTag { if (pokemon.isOfType(Type.POISON)) { this.neutralized = true; if (pokemon.scene.arena.removeTag(this.tagType)) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` absorbed the ${this.getMoveName()}!`)); + pokemon.scene.queueMessage(i18next.t("arenaTag:toxicSpikesActivateTrapPoison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() })); return true; } } else if (!pokemon.status) { const toxic = this.layers > 1; - if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, `the ${this.getMoveName()}`)) { + if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, this.getMoveName())) { return true; } } @@ -556,7 +667,7 @@ class ToxicSpikesTag extends ArenaTrapTag { class DelayedAttackTag extends ArenaTag { public targetIndex: BattlerIndex; - constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, targetIndex: BattlerIndex) { + constructor(tagType: ArenaTagType, sourceMove: Moves | undefined, sourceId: integer, targetIndex: BattlerIndex) { super(tagType, 3, sourceMove, sourceId); this.targetIndex = targetIndex; @@ -566,7 +677,7 @@ class DelayedAttackTag extends ArenaTag { const ret = super.lapse(arena); if (!ret) { - arena.scene.unshiftPhase(new MoveEffectPhase(arena.scene, this.sourceId, [ this.targetIndex ], new PokemonMove(this.sourceMove, 0, 0, true))); + arena.scene.unshiftPhase(new MoveEffectPhase(arena.scene, this.sourceId!, [ this.targetIndex ], new PokemonMove(this.sourceMove!, 0, 0, true))); // TODO: are those bangs correct? } return ret; @@ -588,16 +699,16 @@ class StealthRockTag extends ArenaTrapTag { onAdd(arena: Arena, quiet: boolean = false): void { super.onAdd(arena); - const source = arena.scene.getPokemonById(this.sourceId); - if (!quiet) { - arena.scene.queueMessage(`Pointed stones float in the air\naround ${source.getOpponentDescriptor()}!`); + const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + if (!quiet && source) { + arena.scene.queueMessage(i18next.t("arenaTag:stealthRockOnAdd", { opponentDesc: source.getOpponentDescriptor() })); } } getDamageHpRatio(pokemon: Pokemon): number { const effectiveness = pokemon.getAttackTypeEffectiveness(Type.ROCK, undefined, true); - let damageHpRatio: number; + let damageHpRatio: number = 0; switch (effectiveness) { case 0: @@ -634,8 +745,8 @@ class StealthRockTag extends ArenaTrapTag { const damageHpRatio = this.getDamageHpRatio(pokemon); if (damageHpRatio) { - const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(`Pointed stones dug into\n${pokemon.name}!`); + const damage = Utils.toDmgValue(pokemon.getMaxHp() * damageHpRatio); + pokemon.scene.queueMessage(i18next.t("arenaTag:stealthRockActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -663,12 +774,9 @@ class StickyWebTag extends ArenaTrapTag { onAdd(arena: Arena, quiet: boolean = false): void { super.onAdd(arena); - - // does not seem to be used anywhere - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const source = arena.scene.getPokemonById(this.sourceId); - if (!quiet) { - arena.scene.queueMessage(`A ${this.getMoveName()} has been laid out on the ground around the opposing team!`); + const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + if (!quiet && source) { + arena.scene.queueMessage(i18next.t("arenaTag:stickyWebOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -677,9 +785,9 @@ class StickyWebTag extends ArenaTrapTag { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.scene.queueMessage(`The opposing ${pokemon.name} was caught in a sticky web!`); - const statLevels = new Utils.NumberHolder(-1); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [BattleStat.SPD], statLevels.value)); + pokemon.scene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() })); + const stages = new Utils.NumberHolder(-1); + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.SPD ], stages.value)); } } @@ -705,11 +813,14 @@ export class TrickRoomTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(getPokemonMessage(arena.scene.getPokemonById(this.sourceId), " twisted\nthe dimensions!")); + const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + if (source) { + arena.scene.queueMessage(i18next.t("arenaTag:trickRoomOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + } } onRemove(arena: Arena): void { - arena.scene.queueMessage("The twisted dimensions\nreturned to normal!"); + arena.scene.queueMessage(i18next.t("arenaTag:trickRoomOnRemove")); } } @@ -724,7 +835,7 @@ export class GravityTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage("Gravity intensified!"); + arena.scene.queueMessage(i18next.t("arenaTag:gravityOnAdd")); arena.scene.getField(true).forEach((pokemon) => { if (pokemon !== null) { pokemon.removeTag(BattlerTagType.MAGNET_RISEN); @@ -733,7 +844,7 @@ export class GravityTag extends ArenaTag { } onRemove(arena: Arena): void { - arena.scene.queueMessage("Gravity returned to normal!"); + arena.scene.queueMessage(i18next.t("arenaTag:gravityOnRemove")); } } @@ -749,29 +860,29 @@ class TailwindTag extends ArenaTag { onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`The Tailwind blew from behind${this.side === ArenaTagSide.PLAYER ? "\nyour" : this.side === ArenaTagSide.ENEMY ? "\nthe opposing" : ""} team!`); + arena.scene.queueMessage(i18next.t(`arenaTag:tailwindOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } - const source = arena.scene.getPokemonById(this.sourceId); - const party = source.isPlayer() ? source.scene.getPlayerField() : source.scene.getEnemyField(); + const source = arena.scene.getPokemonById(this.sourceId!); //TODO: this bang is questionable! + const party = (source?.isPlayer() ? source.scene.getPlayerField() : source?.scene.getEnemyField()) ?? []; for (const pokemon of party) { // Apply the CHARGED tag to party members with the WIND_POWER ability if (pokemon.hasAbility(Abilities.WIND_POWER) && !pokemon.getTag(BattlerTagType.CHARGED)) { pokemon.addTag(BattlerTagType.CHARGED); - pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: pokemon.name, moveName: this.getMoveName() })); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() })); } // 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)); } } } onRemove(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`${this.side === ArenaTagSide.PLAYER ? "Your" : this.side === ArenaTagSide.ENEMY ? "The opposing" : ""} team's Tailwind petered out!`); + arena.scene.queueMessage(i18next.t(`arenaTag:tailwindOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } } } @@ -786,15 +897,30 @@ class HappyHourTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage("Everyone is caught up in the happy atmosphere!"); + arena.scene.queueMessage(i18next.t("arenaTag:happyHourOnAdd")); } onRemove(arena: Arena): void { - arena.scene.queueMessage("The atmosphere returned to normal."); + arena.scene.queueMessage(i18next.t("arenaTag:happyHourOnRemove")); } } -export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): 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: return new MistTag(turnCount, sourceId, side); @@ -806,6 +932,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov return new MatBlockTag(sourceId, side); case ArenaTagType.CRAFTY_SHIELD: return new CraftyShieldTag(sourceId, side); + case ArenaTagType.NO_CRIT: + return new NoCritTag(turnCount, sourceMove!, sourceId, side); // TODO: is this bang correct? case ArenaTagType.MUD_SPORT: return new MudSportTag(turnCount, sourceId); case ArenaTagType.WATER_SPORT: @@ -816,7 +944,7 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov return new ToxicSpikesTag(sourceId, side); case ArenaTagType.FUTURE_SIGHT: case ArenaTagType.DOOM_DESIRE: - return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex); + return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex!); // TODO:questionable bang case ArenaTagType.WISH: return new WishTag(turnCount, sourceId, side); case ArenaTagType.STEALTH_ROCK: @@ -837,5 +965,9 @@ 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 d4dbb8ec350..da4e7f6a33b 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -1,6 +1,6 @@ //import { battleAnimRawData } from "./battle-anim-raw-data"; import BattleScene from "../battle-scene"; -import { AttackMove, ChargeAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move"; +import { AttackMove, BeakBlastHeaderAttr, ChargeAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move"; import Pokemon from "../field/pokemon"; import * as Utils from "../utils"; import { BattlerIndex } from "../battle"; @@ -128,7 +128,7 @@ export class AnimConfig { for (const fte of Object.keys(frameTimedEvents)) { const timedEvents: AnimTimedEvent[] = []; for (const te of frameTimedEvents[fte]) { - let timedEvent: AnimTimedEvent; + let timedEvent: AnimTimedEvent | undefined; switch (te.eventType) { case "AnimTimedSoundEvent": timedEvent = new AnimTimedSoundEvent(te.frameIndex, te.resourceName, te); @@ -140,7 +140,8 @@ export class AnimConfig { timedEvent = new AnimTimedUpdateBgEvent(te.frameIndex, te.resourceName, te); break; } - timedEvents.push(timedEvent); + + timedEvent && timedEvents.push(timedEvent); } this.frameTimedEvents.set(parseInt(fte), timedEvents); } @@ -324,13 +325,13 @@ class AnimTimedSoundEvent extends AnimTimedEvent { const soundConfig = { rate: (this.pitch * 0.01), volume: (this.volume * 0.01) }; if (this.resourceName) { try { - scene.playSound(this.resourceName, soundConfig); + scene.playSound(`battle_anims/${this.resourceName}`, soundConfig); } catch (err) { console.error(err); } - return Math.ceil((scene.sound.get(this.resourceName).totalDuration * 1000) / 33.33); + return Math.ceil((scene.sound.get(`battle_anims/${this.resourceName}`).totalDuration * 1000) / 33.33); } else { - return Math.ceil((battleAnim.user.cry(soundConfig).totalDuration * 1000) / 33.33); + return Math.ceil((battleAnim.user!.cry(soundConfig).totalDuration * 1000) / 33.33); // TODO: is the bang behind user correct? } } @@ -441,15 +442,15 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent { } } -export const moveAnims = new Map(); -export const chargeAnims = new Map(); +export const moveAnims = new Map(); +export const chargeAnims = new Map(); export const commonAnims = new Map(); export function initCommonAnims(scene: BattleScene): Promise { return new Promise(resolve => { const commonAnimNames = Utils.getEnumKeys(CommonAnim); const commonAnimIds = Utils.getEnumValues(CommonAnim); - const commonAnimFetches = []; + const commonAnimFetches: Promise>[] = []; for (let ca = 0; ca < commonAnimIds.length; ca++) { const commonAnimId = commonAnimIds[ca]; commonAnimFetches.push(scene.cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, "-")}.json`) @@ -484,7 +485,8 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { const fetchAnimAndResolve = (move: Moves) => { scene.cachedFetch(`./battle-anims/${moveName}.json`) .then(response => { - if (!response.ok) { + const contentType = response.headers.get("content-type"); + if (!response.ok || contentType?.indexOf("application/json") === -1) { console.error(`Could not load animation file for move '${moveName}'`, response.status, response.statusText); populateMoveAnim(move, moveAnims.get(defaultMoveAnim)); return resolve(); @@ -498,7 +500,9 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { } else { populateMoveAnim(move, ba); } - const chargeAttr = allMoves[move].getAttrs(ChargeAttr)[0] || allMoves[move].getAttrs(DelayedAttackAttr)[0]; + const chargeAttr = allMoves[move].getAttrs(ChargeAttr)[0] + || allMoves[move].getAttrs(DelayedAttackAttr)[0] + || allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]; if (chargeAttr) { initMoveChargeAnim(scene, chargeAttr.chargeAnim).then(() => resolve()); } else { @@ -569,10 +573,12 @@ export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLo return new Promise(resolve => { const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat(); for (const moveId of moveIds) { - const chargeAttr = allMoves[moveId].getAttrs(ChargeAttr)[0] || allMoves[moveId].getAttrs(DelayedAttackAttr)[0]; + const chargeAttr = allMoves[moveId].getAttrs(ChargeAttr)[0] + || allMoves[moveId].getAttrs(DelayedAttackAttr)[0] + || allMoves[moveId].getAttrs(BeakBlastHeaderAttr)[0]; if (chargeAttr) { const moveChargeAnims = chargeAnims.get(chargeAttr.chargeAnim); - moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims[0]); + moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims![0]); // TODO: is the bang correct? if (Array.isArray(moveChargeAnims)) { moveAnimations.push(moveChargeAnims[1]); } @@ -668,21 +674,21 @@ interface SpriteCache { } export abstract class BattleAnim { - public user: Pokemon; - public target: Pokemon; + public user: Pokemon | null; + public target: Pokemon | null; public sprites: Phaser.GameObjects.Sprite[]; public bgSprite: Phaser.GameObjects.TileSprite | Phaser.GameObjects.Rectangle; private srcLine: number[]; private dstLine: number[]; - constructor(user: Pokemon, target: Pokemon) { - this.user = user; - this.target = target; + constructor(user?: Pokemon, target?: Pokemon) { + this.user = user ?? null; + this.target = target ?? null; this.sprites = []; } - abstract getAnim(): AnimConfig; + abstract getAnim(): AnimConfig | null; abstract isOppAnim(): boolean; @@ -705,12 +711,12 @@ export abstract class BattleAnim { const user = !isOppAnim ? this.user : this.target; const target = !isOppAnim ? this.target : this.user; - const userInitialX = user.x; - const userInitialY = user.y; - const userHalfHeight = user.getSprite().displayHeight / 2; - const targetInitialX = target.x; - const targetInitialY = target.y; - const targetHalfHeight = target.getSprite().displayHeight / 2; + const userInitialX = user!.x; // TODO: is this bang correct? + const userInitialY = user!.y; // TODO: is this bang correct? + const userHalfHeight = user!.getSprite().displayHeight! / 2; // TODO: is this bang correct? + const targetInitialX = target!.x; // TODO: is this bang correct? + const targetInitialY = target!.y; // TODO: is this bang correct? + const targetHalfHeight = target!.getSprite().displayHeight! / 2; // TODO: is this bang correct? let g = 0; let u = 0; @@ -742,7 +748,7 @@ export abstract class BattleAnim { } const angle = -frame.angle; const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; - ret.get(frame.target).set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); + ret.get(frame.target)!.set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); // TODO: is the bang correct? } return ret; @@ -750,10 +756,10 @@ export abstract class BattleAnim { play(scene: BattleScene, callback?: Function) { const isOppAnim = this.isOppAnim(); - const user = !isOppAnim ? this.user : this.target; + const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct? const target = !isOppAnim ? this.target : this.user; - if (!target.isOnField()) { + if (!target?.isOnField()) { if (callback) { callback(); } @@ -781,11 +787,11 @@ export abstract class BattleAnim { targetSprite.setAlpha(1); targetSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ]; targetSprite.setAngle(0); - if (!this.isHideUser()) { - userSprite.setVisible(true); + if (!this.isHideUser() && userSprite) { + 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) { @@ -814,20 +820,20 @@ export abstract class BattleAnim { this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; this.dstLine = [ userInitialX, userInitialY, targetInitialX, targetInitialY ]; - let r = anim.frames.length; + let r = anim!.frames.length; // TODO: is this bang correct? let f = 0; scene.tweens.addCounter({ duration: Utils.getFrameMs(3), - repeat: anim.frames.length, + repeat: anim!.frames.length, // TODO: is this bang correct? onRepeat: () => { if (!f) { userSprite.setVisible(false); targetSprite.setVisible(false); } - const spriteFrames = anim.frames[f]; - const frameData = this.getGraphicFrameData(scene, anim.frames[f]); + const spriteFrames = anim!.frames[f]; // TODO: is the bang correcT? + const frameData = this.getGraphicFrameData(scene, anim!.frames[f]); // TODO: is the bang correct? let u = 0; let t = 0; let g = 0; @@ -840,9 +846,9 @@ export abstract class BattleAnim { const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET]; const spriteSource = isUser ? userSprite : targetSprite; if ((isUser ? u : t) === sprites.length) { - const sprite = scene.addPokemonSprite(isUser ? user : target, 0, 0, spriteSource.texture, spriteSource.frame.name, true); - [ "spriteColors", "fusionSpriteColors" ].map(k => sprite.pipelineData[k] = (isUser ? user : target).getSprite().pipelineData[k]); - sprite.setPipelineData("spriteKey", (isUser ? user : target).getBattleSpriteKey()); + const sprite = scene.addPokemonSprite(isUser ? user! : target, 0, 0, spriteSource!.texture, spriteSource!.frame.name, true); // TODO: are those bangs correct? + [ "spriteColors", "fusionSpriteColors" ].map(k => sprite.pipelineData[k] = (isUser ? user! : target).getSprite().pipelineData[k]); // TODO: are those bangs correct? + sprite.setPipelineData("spriteKey", (isUser ? user! : target).getBattleSpriteKey()); sprite.setPipelineData("shiny", (isUser ? user : target).shiny); sprite.setPipelineData("variant", (isUser ? user : target).variant); sprite.setPipelineData("ignoreFieldPos", true); @@ -853,7 +859,7 @@ export abstract class BattleAnim { const spriteIndex = isUser ? u++ : t++; const pokemonSprite = sprites[spriteIndex]; - const graphicFrameData = frameData.get(frame.target).get(spriteIndex); + const graphicFrameData = frameData.get(frame.target)!.get(spriteIndex)!; // TODO: are the bangs correct? pokemonSprite.setPosition(graphicFrameData.x, graphicFrameData.y - ((spriteSource.height / 2) * (spriteSource.parentContainer.scale - 1))); pokemonSprite.setAngle(graphicFrameData.angle); @@ -868,7 +874,7 @@ export abstract class BattleAnim { } else { const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; if (g === sprites.length) { - const newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim.graphic, 1); + const newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim!.graphic, 1); // TODO: is the bang correct? sprites.push(newSprite); scene.field.add(newSprite); spritePriorities.push(1); @@ -881,7 +887,7 @@ export abstract class BattleAnim { const setSpritePriority = (priority: integer) => { switch (priority) { case 0: - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, scene.getEnemyPokemon() || scene.getPlayerPokemon()); + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, scene.getEnemyPokemon() || scene.getPlayerPokemon()!); // TODO: is this bang correct? break; case 1: scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); @@ -892,11 +898,11 @@ export abstract class BattleAnim { if (this.bgSprite) { scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.bgSprite); } else { - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user); + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? } break; case AnimFocus.TARGET: - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target); + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? break; default: setSpritePriority(1); @@ -906,10 +912,10 @@ export abstract class BattleAnim { case 3: switch (frame.focus) { case AnimFocus.USER: - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user); + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? break; case AnimFocus.TARGET: - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target); + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? break; default: setSpritePriority(1); @@ -925,7 +931,7 @@ export abstract class BattleAnim { moveSprite.setFrame(frame.graphicFrame); //console.log(AnimFocus[frame.focus]); - const graphicFrameData = frameData.get(frame.target).get(graphicIndex); + const graphicFrameData = frameData.get(frame.target)!.get(graphicIndex)!; // TODO: are those bangs correct? moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); moveSprite.setAngle(graphicFrameData.angle); moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); @@ -935,8 +941,8 @@ export abstract class BattleAnim { moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); } } - if (anim.frameTimedEvents.has(f)) { - for (const event of anim.frameTimedEvents.get(f)) { + if (anim?.frameTimedEvents.has(f)) { + for (const event of anim.frameTimedEvents.get(f)!) { // TODO: is this bang correct? r = Math.max((anim.frames.length - f) + event.execute(scene, this), r); } } @@ -980,16 +986,16 @@ export abstract class BattleAnim { } export class CommonBattleAnim extends BattleAnim { - public commonAnim: CommonAnim; + public commonAnim: CommonAnim | null; - constructor(commonAnim: CommonAnim, user: Pokemon, target?: Pokemon) { + constructor(commonAnim: CommonAnim | null, user: Pokemon, target?: Pokemon) { super(user, target || user); this.commonAnim = commonAnim; } - getAnim(): AnimConfig { - return commonAnims.get(this.commonAnim); + getAnim(): AnimConfig | null { + return this.commonAnim ? commonAnims.get(this.commonAnim)! : null; // TODO: is this bang correct? } isOppAnim(): boolean { @@ -1009,11 +1015,11 @@ export class MoveAnim extends BattleAnim { getAnim(): AnimConfig { return moveAnims.get(this.move) instanceof AnimConfig ? moveAnims.get(this.move) as AnimConfig - : moveAnims.get(this.move)[this.user.isPlayer() ? 0 : 1] as AnimConfig; + : moveAnims.get(this.move)![this.user?.isPlayer() ? 0 : 1] as AnimConfig; // TODO: is this bang correct? } isOppAnim(): boolean { - return !this.user.isPlayer() && Array.isArray(moveAnims.get(this.move)); + return !this.user?.isPlayer() && Array.isArray(moveAnims.get(this.move)); } protected isHideUser(): boolean { @@ -1035,13 +1041,13 @@ export class MoveChargeAnim extends MoveAnim { } isOppAnim(): boolean { - return !this.user.isPlayer() && Array.isArray(chargeAnims.get(this.chargeAnim)); + return !this.user?.isPlayer() && Array.isArray(chargeAnims.get(this.chargeAnim)); } getAnim(): AnimConfig { return chargeAnims.get(this.chargeAnim) instanceof AnimConfig ? chargeAnims.get(this.chargeAnim) as AnimConfig - : chargeAnims.get(this.chargeAnim)[this.user.isPlayer() ? 0 : 1] as AnimConfig; + : chargeAnims.get(this.chargeAnim)![this.user?.isPlayer() ? 0 : 1] as AnimConfig; // TODO: is this bang correct? } } @@ -1059,19 +1065,19 @@ export async function populateAnims() { moveNameToId[moveName] = move; } - const seNames = [];//(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); + const seNames: string[] = [];//(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); - const animsData = [];//battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); + const animsData : any[] = [];//battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); // TODO: add a proper type for (let a = 0; a < animsData.length; a++) { const fields = animsData[a].split("@").slice(1); const nameField = fields.find(f => f.startsWith("name: ")); - let isOppMove: boolean; - let commonAnimId: CommonAnim; - let chargeAnimId: ChargeAnim; + let isOppMove: boolean | undefined; + let commonAnimId: CommonAnim | undefined; + let chargeAnimId: ChargeAnim | undefined; if (!nameField.startsWith("name: Move:") && !(isOppMove = nameField.startsWith("name: OppMove:"))) { - const nameMatch = commonNamePattern.exec(nameField); + const nameMatch = commonNamePattern.exec(nameField)!; // TODO: is this bang correct? const name = nameMatch[2].toLowerCase(); if (commonAnimMatchNames.indexOf(name) > -1) { commonAnimId = commonAnimIds[commonAnimMatchNames.indexOf(name)]; @@ -1128,14 +1134,14 @@ export async function populateAnims() { for (let t = 0; t < timingEntries.length; t++) { const timingData = timingEntries[t].replace(/\n/g, " ").replace(/[ ]{2,}/g, " ").replace(/[a-z]+: ! '', /ig, "").replace(/name: (.*?),/, "name: \"$1\",") .replace(/flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1"); - const frameIndex = parseInt(/frame: (\d+)/.exec(timingData)[1]); - let resourceName = /name: "(.*?)"/.exec(timingData)[1].replace("''", ""); - const timingType = parseInt(/timingType: (\d)/.exec(timingData)[1]); - let timedEvent: AnimTimedEvent; + const frameIndex = parseInt(/frame: (\d+)/.exec(timingData)![1]); // TODO: is the bang correct? + let resourceName = /name: "(.*?)"/.exec(timingData)![1].replace("''", ""); // TODO: is the bang correct? + const timingType = parseInt(/timingType: (\d)/.exec(timingData)![1]); // TODO: is the bang correct? + let timedEvent: AnimTimedEvent | undefined; switch (timingType) { case 0: if (resourceName && resourceName.indexOf(".") === -1) { - let ext: string; + let ext: string | undefined; [ "wav", "mp3", "m4a" ].every(e => { if (seNames.indexOf(`${resourceName}.${e}`) > -1) { ext = e; @@ -1162,7 +1168,7 @@ export async function populateAnims() { } const propPattern = /([a-z]+): (.*?)(?:,|\})/ig; let propMatch: RegExpExecArray; - while ((propMatch = propPattern.exec(timingData))) { + while ((propMatch = propPattern.exec(timingData)!)) { // TODO: is this bang correct? const prop = propMatch[1]; let value: any = propMatch[2]; switch (prop) { @@ -1194,7 +1200,7 @@ export async function populateAnims() { if (!anim.frameTimedEvents.has(frameIndex)) { anim.frameTimedEvents.set(frameIndex, []); } - anim.frameTimedEvents.get(frameIndex).push(timedEvent); + anim.frameTimedEvents.get(frameIndex)!.push(timedEvent); // TODO: is this bang correct? } break; case "position": diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts deleted file mode 100644 index 7dccd4f8a7c..00000000000 --- a/src/data/battle-stat.ts +++ /dev/null @@ -1,69 +0,0 @@ -import i18next from "i18next"; - -export enum BattleStat { - ATK, - DEF, - SPATK, - SPDEF, - SPD, - ACC, - EVA, - RAND -} - -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"); - default: - return "???"; - } -} - -export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean) { - const stringKey = (() => { - if (up) { - switch (levels) { - case 1: - return "battle:statRose"; - case 2: - return "battle:statSharplyRose"; - case 3: - case 4: - case 5: - case 6: - return "battle:statRoseDrastically"; - default: - return "battle:statWontGoAnyHigher"; - } - } else { - switch (levels) { - case 1: - return "battle:statFell"; - case 2: - return "battle:statHarshlyFell"; - case 3: - case 4: - case 5: - case 6: - return "battle:statSeverelyFell"; - default: - return "battle:statWontGoAnyLower"; - } - } - })(); - - return i18next.t(stringKey, { pokemonNameWithAffix, stats }); -} diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 015b8b44984..ddb85600c18 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1,8 +1,6 @@ -import { CommonAnim, CommonBattleAnim } from "./battle-anims"; -import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +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"; @@ -10,14 +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 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, @@ -31,17 +35,19 @@ export enum BattlerTagLapseType { export class BattlerTag { public tagType: BattlerTagType; - public lapseType: BattlerTagLapseType; - public turnCount: integer; + public lapseTypes: BattlerTagLapseType[]; + public turnCount: number; public sourceMove: Moves; - public sourceId?: integer; + public sourceId?: number; + public isBatonPassable: boolean; - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: integer, sourceMove: Moves, sourceId?: integer) { + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove?: Moves, sourceId?: number, isBatonPassable: boolean = false) { this.tagType = tagType; - this.lapseType = lapseType; + this.lapseTypes = Array.isArray(lapseType) ? lapseType : [ lapseType ]; this.turnCount = turnCount; - this.sourceMove = sourceMove; + this.sourceMove = sourceMove!; // TODO: is this bang correct? this.sourceId = sourceId; + this.isBatonPassable = isBatonPassable; } canAdd(pokemon: Pokemon): boolean { @@ -66,7 +72,7 @@ export class BattlerTag { return false; } - getMoveName(): string { + getMoveName(): string | null { return this.sourceMove ? allMoves[this.sourceMove].name : null; @@ -92,36 +98,243 @@ export interface TerrainBattlerTag { terrainTypes: TerrainType[]; } +/** + * Base class for tags that restrict the usage of moves. This effect is generally referred to as "disabling" a move + * in-game. This is not to be confused with {@linkcode Moves.DISABLE}. + * + * Descendants can override {@linkcode isMoveRestricted} to restrict moves that + * match a condition. A restricted move gets cancelled before it is used. Players and enemies should not be allowed + * to select restricted moves. + */ +export abstract class MoveRestrictionBattlerTag extends BattlerTag { + constructor(tagType: BattlerTagType, turnCount: integer, sourceMove?: Moves, sourceId?: integer) { + super(tagType, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], turnCount, sourceMove, sourceId); + } + + /** @override */ + override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + if (lapseType === BattlerTagLapseType.PRE_MOVE) { + // Cancel the affected pokemon's selected move + const phase = pokemon.scene.getCurrentPhase() as MovePhase; + const move = phase.move; + + if (this.isMoveRestricted(move.moveId)) { + pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId)); + phase.cancel(); + } + + return true; + } + + return super.lapse(pokemon, lapseType); + } + + /** + * Gets whether this tag is restricting a move. + * + * @param {Moves} move {@linkcode Moves} ID to check restriction for. + * @returns {boolean} `true` if the move is restricted by this tag, otherwise `false`. + */ + abstract isMoveRestricted(move: Moves): boolean; + + /** + * Gets the text to display when the player attempts to select a move that is restricted by this tag. + * + * @param {Pokemon} pokemon {@linkcode Pokemon} for which the player is attempting to select the restricted move + * @param {Moves} move {@linkcode Moves} ID of the move that is having its selection denied + * @returns {string} text to display when the player attempts to select the restricted move + */ + abstract selectionDeniedText(pokemon: Pokemon, move: Moves): string; + + /** + * Gets the text to display when a move's execution is prevented as a result of the restriction. + * Because restriction effects also prevent selection of the move, this situation can only arise if a + * pokemon first selects a move, then gets outsped by a pokemon using a move that restricts the selected move. + * + * @param {Pokemon} pokemon {@linkcode Pokemon} attempting to use the restricted move + * @param {Moves} move {@linkcode Moves} ID of the move being interrupted + * @returns {string} text to display when the move is interrupted + */ + abstract interruptedText(pokemon: Pokemon, move: Moves): string; +} + +/** + * Tag representing the "disabling" effect performed by {@linkcode Moves.DISABLE} and {@linkcode Abilities.CURSED_BODY}. + * When the tag is added, the last-used move of the tag holder is set as the disabled move. + */ +export class DisabledTag extends MoveRestrictionBattlerTag { + /** The move being disabled. Gets set when {@linkcode onAdd} is called for this tag. */ + private moveId: Moves = Moves.NONE; + + constructor(sourceId: number) { + super(BattlerTagType.DISABLED, 4, Moves.DISABLE, sourceId); + } + + /** @override */ + override isMoveRestricted(move: Moves): boolean { + return move === this.moveId; + } + + /** + * @override + * + * Ensures that move history exists on `pokemon` and has a valid move. If so, sets the {@link moveId} and shows a message. + * Otherwise the move ID will not get assigned and this tag will get removed next turn. + */ + override onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + + const move = pokemon.getLastXMoves() + .find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); + if (move === undefined) { + return; + } + + this.moveId = move.move; + + pokemon.scene.queueMessage(i18next.t("battlerTags:disabledOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[this.moveId].name })); + } + + /** @override */ + override onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + + pokemon.scene.queueMessage(i18next.t("battlerTags:disabledLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[this.moveId].name })); + } + + /** @override */ + override selectionDeniedText(pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name }); + } + + /** @override */ + override interruptedText(pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + } + + /** @override */ + override loadTag(source: BattlerTag | any): void { + super.loadTag(source); + this.moveId = source.moveId; + } +} + +/** + * BattlerTag that represents the "recharge" effects of moves like Hyper Beam. + */ export class RechargingTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.RECHARGING, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); + super(BattlerTagType.RECHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 2, sourceMove); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); + // Queue a placeholder move for the Pokemon to "use" next turn pokemon.getMoveQueue().push({ move: Moves.NONE, targets: [] }); } + /** Cancels the source's move this turn and queues a "__ must recharge!" message */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - super.lapse(pokemon, lapseType); + if (lapseType === BattlerTagLapseType.PRE_MOVE) { + pokemon.scene.queueMessage(i18next.t("battlerTags:rechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + pokemon.getMoveQueue().shift(); + } + return super.lapse(pokemon, lapseType); + } +} - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsRechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.getMoveQueue().shift(); +/** + * BattlerTag representing the "charge phase" of Beak Blast. + * Pokemon with this tag will inflict BURN status on any attacker that makes contact. + * @see {@link https://bulbapedia.bulbagarden.net/wiki/Beak_Blast_(move) | Beak Blast} + */ +export class BeakBlastChargingTag extends BattlerTag { + constructor() { + super(BattlerTagType.BEAK_BLAST_CHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 1, Moves.BEAK_BLAST); + } - return true; + onAdd(pokemon: Pokemon): void { + // Play Beak Blast's charging animation + new MoveChargeAnim(ChargeAnim.BEAK_BLAST_CHARGING, this.sourceMove, pokemon).play(pokemon.scene); + + // Queue Beak Blast's header message + pokemon.scene.queueMessage(i18next.t("moveTriggers:startedHeatingUpBeak", { pokemonName: getPokemonNameWithAffix(pokemon) })); + } + + /** + * Inflicts `BURN` status on attackers that make contact, and causes this tag + * to be removed after the source makes a move (or the turn ends, whichever comes first) + * @param pokemon {@linkcode Pokemon} the owner of this tag + * @param lapseType {@linkcode BattlerTagLapseType} the type of functionality invoked in battle + * @returns `true` if invoked with the CUSTOM lapse type; `false` otherwise + */ + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + if (lapseType === BattlerTagLapseType.CUSTOM) { + const effectPhase = pokemon.scene.getCurrentPhase(); + if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { + const attacker = effectPhase.getPokemon(); + attacker.trySetStatus(StatusEffect.BURN, true, pokemon); + } + return true; + } + return super.lapse(pokemon, lapseType); + } +} + +/** + * BattlerTag implementing Shell Trap's pre-move behavior. + * Pokemon with this tag will act immediately after being hit by a physical move. + * @see {@link https://bulbapedia.bulbagarden.net/wiki/Shell_Trap_(move) | Shell Trap} + */ +export class ShellTrapTag extends BattlerTag { + public activated: boolean; + + constructor() { + super(BattlerTagType.SHELL_TRAP, BattlerTagLapseType.TURN_END, 1); + this.activated = false; + } + + onAdd(pokemon: Pokemon): void { + pokemon.scene.queueMessage(i18next.t("moveTriggers:setUpShellTrap", { pokemonName: getPokemonNameWithAffix(pokemon) })); + } + + /** + * "Activates" the shell trap, causing the tag owner to move next. + * @param pokemon {@linkcode Pokemon} the owner of this tag + * @param lapseType {@linkcode BattlerTagLapseType} the type of functionality invoked in battle + * @returns `true` if invoked with the `CUSTOM` lapse type; `false` otherwise + */ + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + if (lapseType === BattlerTagLapseType.CUSTOM) { + const shellTrapPhaseIndex = pokemon.scene.phaseQueue.findIndex( + phase => phase instanceof MovePhase && phase.pokemon === pokemon + ); + const firstMovePhaseIndex = pokemon.scene.phaseQueue.findIndex( + phase => phase instanceof MovePhase + ); + + if (shellTrapPhaseIndex !== -1 && shellTrapPhaseIndex !== firstMovePhaseIndex) { + const shellTrapMovePhase = pokemon.scene.phaseQueue.splice(shellTrapPhaseIndex, 1)[0]; + pokemon.scene.prependToPhase(shellTrapMovePhase, MovePhase); + } + + this.activated = true; + return true; + } + return super.lapse(pokemon, lapseType); } } export class TrappedTag extends BattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: integer, sourceMove: Moves, sourceId: integer) { - super(tagType, lapseType, turnCount, sourceMove, sourceId); + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: number, sourceMove: Moves, sourceId: number) { + 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; } @@ -135,14 +348,14 @@ export class TrappedTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsTrappedOnRemove", { + pokemon.scene.queueMessage(i18next.t("battlerTags:trappedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() })); } getDescriptor(): string { - return "trapping"; + return i18next.t("battlerTags:trappedDesc"); } isSourceLinked(): boolean { @@ -150,13 +363,33 @@ export class TrappedTag extends BattlerTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsTrappedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:trappedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } +/** + * 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 + */ export class FlinchedTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.FLINCHED, BattlerTagLapseType.PRE_MOVE, 0, sourceMove); + super(BattlerTagType.FLINCHED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 0, sourceMove); } onAdd(pokemon: Pokemon): void { @@ -169,17 +402,23 @@ export class FlinchedTag extends BattlerTag { return !pokemon.isMax(); } + /** + * Cancels the Pokemon's next Move on the turn this tag is applied + * @param pokemon The {@linkcode Pokemon} with this tag + * @param lapseType The {@linkcode BattlerTagLapseType lapse type} used for this function call + * @returns `false` (This tag is always removed after applying its effects) + */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - super.lapse(pokemon, lapseType); + if (lapseType === BattlerTagLapseType.PRE_MOVE) { + (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + pokemon.scene.queueMessage(i18next.t("battlerTags:flinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsFlinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - - return true; + return super.lapse(pokemon, lapseType); } getDescriptor(): string { - return "flinching"; + return i18next.t("battlerTags:flinchedDesc"); } } @@ -200,18 +439,17 @@ export class InterruptedTag extends BattlerTag { } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - super.lapse(pokemon, lapseType); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - return true; + return super.lapse(pokemon, lapseType); } } /** - * BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Confusion_(status_condition)} + * BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Confusion_(status_condition) Confusion} status condition */ export class ConfusedTag extends BattlerTag { - constructor(turnCount: integer, sourceMove: Moves) { - super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove); + constructor(turnCount: number, sourceMove: Moves) { + super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove, undefined, true); } canAdd(pokemon: Pokemon): boolean { @@ -222,34 +460,34 @@ export class ConfusedTag extends BattlerTag { super.onAdd(pokemon); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM && super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); // 1/3 chance of hitting self with a 40 base power move if (pokemon.randSeedInt(3) === 0) { - const atk = pokemon.getBattleStat(Stat.ATK); - const def = pokemon.getBattleStat(Stat.DEF); - const damage = Math.ceil(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100)); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedLapseHurtItself")); + const atk = pokemon.getEffectiveStat(Stat.ATK); + const def = pokemon.getEffectiveStat(Stat.DEF); + const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100) / 100)); + pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself")); pokemon.damageAndUpdate(damage); pokemon.battleData.hitCount++; (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); @@ -260,7 +498,7 @@ export class ConfusedTag extends BattlerTag { } getDescriptor(): string { - return "confusion"; + return i18next.t("battlerTags:confusedDesc"); } } @@ -270,8 +508,8 @@ export class ConfusedTag extends BattlerTag { * @see {@linkcode apply} */ export class DestinyBondTag extends BattlerTag { - constructor(sourceMove: Moves, sourceId: integer) { - super(BattlerTagType.DESTINY_BOND, BattlerTagLapseType.PRE_MOVE, 1, sourceMove, sourceId); + constructor(sourceMove: Moves, sourceId: number) { + super(BattlerTagType.DESTINY_BOND, BattlerTagLapseType.PRE_MOVE, 1, sourceMove, sourceId, true); } /** @@ -287,22 +525,22 @@ export class DestinyBondTag extends BattlerTag { if (lapseType !== BattlerTagLapseType.CUSTOM) { return super.lapse(pokemon, lapseType); } - const source = pokemon.scene.getPokemonById(this.sourceId); - if (!source.isFainted()) { + const source = this.sourceId ? pokemon.scene.getPokemonById(this.sourceId) : null; + if (!source?.isFainted()) { return true; } - if (source.getAlly() === pokemon) { + if (source?.getAlly() === pokemon) { return false; } if (pokemon.isBossImmune()) { - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsDestinyBondLapseIsBoss", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:destinyBondLapseIsBoss", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return false; } pokemon.scene.queueMessage( - i18next.t("battle:battlerTagsDestinyBondLapse", { + i18next.t("battlerTags:destinyBondLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(source), pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon) }) @@ -313,21 +551,33 @@ export class DestinyBondTag extends BattlerTag { } export class InfatuatedTag extends BattlerTag { - constructor(sourceMove: integer, sourceId: integer) { + constructor(sourceMove: number, sourceId: number) { super(BattlerTagType.INFATUATED, BattlerTagLapseType.MOVE, 1, sourceMove, sourceId); } canAdd(pokemon: Pokemon): boolean { - return pokemon.isOppositeGender(pokemon.scene.getPokemonById(this.sourceId)); + if (this.sourceId) { + const pkm = pokemon.scene.getPokemonById(this.sourceId); + + if (pkm) { + return pokemon.isOppositeGender(pkm); + } else { + console.warn("canAdd: this.sourceId is not a valid pokemon id!", this.sourceId); + return false; + } + } else { + console.warn("canAdd: this.sourceId is undefined"); + return false; + } } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); pokemon.scene.queueMessage( - i18next.t("battle:battlerTagsInfatuatedOnAdd", { + i18next.t("battlerTags:infatuatedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct? }) ); } @@ -335,7 +585,7 @@ export class InfatuatedTag extends BattlerTag { onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -343,15 +593,15 @@ export class InfatuatedTag extends BattlerTag { if (ret) { pokemon.scene.queueMessage( - i18next.t("battle:battlerTagsInfatuatedLapse", { + i18next.t("battlerTags:infatuatedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct? }) ); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT)); if (pokemon.randSeedInt(2)) { - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedLapseImmobilize", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedLapseImmobilize", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); } } @@ -362,7 +612,7 @@ export class InfatuatedTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } isSourceLinked(): boolean { @@ -370,15 +620,15 @@ export class InfatuatedTag extends BattlerTag { } getDescriptor(): string { - return "infatuation"; + return i18next.t("battlerTags:infatuatedDesc"); } } export class SeedTag extends BattlerTag { - private sourceIndex: integer; + private sourceIndex: number; - constructor(sourceId: integer) { - super(BattlerTagType.SEEDED, BattlerTagLapseType.TURN_END, 1, Moves.LEECH_SEED, sourceId); + constructor(sourceId: number) { + super(BattlerTagType.SEEDED, BattlerTagLapseType.TURN_END, 1, Moves.LEECH_SEED, sourceId, true); } /** @@ -397,8 +647,8 @@ export class SeedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSeededOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); + pokemon.scene.queueMessage(i18next.t("battlerTags:seededOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -413,11 +663,11 @@ export class SeedTag extends BattlerTag { if (!cancelled.value) { pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED)); - const damage = pokemon.damageAndUpdate(Math.max(Math.floor(pokemon.getMaxHp() / 8), 1)); + const damage = pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 8)); const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false); pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(), !reverseDrain ? damage : damage * -1, - !reverseDrain ? i18next.t("battle:battlerTagsSeededLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }) : i18next.t("battle:battlerTagsSeededLapseShed", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), + !reverseDrain ? i18next.t("battlerTags:seededLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }) : i18next.t("battlerTags:seededLapseShed", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), false, true)); } } @@ -427,7 +677,7 @@ export class SeedTag extends BattlerTag { } getDescriptor(): string { - return "seeding"; + return i18next.t("battlerTags:seedDesc"); } } @@ -439,27 +689,27 @@ export class NightmareTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CURSE)); // TODO: Update animation type const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / 4)); + pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 4)); } } @@ -467,32 +717,28 @@ export class NightmareTag extends BattlerTag { } getDescriptor(): string { - return "nightmares"; + return i18next.t("battlerTags:nightmareDesc"); } } export class FrenzyTag extends BattlerTag { - constructor(sourceMove: Moves, sourceId: integer) { - super(BattlerTagType.FRENZY, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); + constructor(turnCount: number, sourceMove: Moves, sourceId: number) { + super(BattlerTagType.FRENZY, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 4)); - } -} - -export class ChargingTag extends BattlerTag { - constructor(sourceMove: Moves, sourceId: integer) { - super(BattlerTagType.CHARGING, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); + if (this.turnCount < 2) { // Only add CONFUSED tag if a disruption occurs on the final confusion-inducing turn of FRENZY + pokemon.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 4)); + } } } export class EncoreTag extends BattlerTag { public moveId: Moves; - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.ENCORE, BattlerTagLapseType.AFTER_MOVE, 3, Moves.ENCORE, sourceId); } @@ -544,15 +790,15 @@ export class EncoreTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEncoreOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:encoreOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); const movePhase = pokemon.scene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon); if (movePhase) { - const movesetMove = pokemon.getMoveset().find(m => m.moveId === this.moveId); + const movesetMove = pokemon.getMoveset().find(m => m!.moveId === this.moveId); // TODO: is this bang correct? if (movesetMove) { const lastMove = pokemon.getLastXMoves(1)[0]; pokemon.scene.tryReplacePhase((m => m instanceof MovePhase && m.pokemon === pokemon), - new MovePhase(pokemon.scene, pokemon, lastMove.targets, movesetMove)); + new MovePhase(pokemon.scene, pokemon, lastMove.targets!, movesetMove)); // TODO: is this bang correct? } } } @@ -560,20 +806,20 @@ export class EncoreTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEncoreOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:encoreOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } export class HelpingHandTag extends BattlerTag { - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.HELPING_HAND, BattlerTagLapseType.TURN_END, 1, Moves.HELPING_HAND, sourceId); } onAdd(pokemon: Pokemon): void { pokemon.scene.queueMessage( - i18next.t("battle:battlerTagsHelpingHandOnAdd", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), - pokemonName: pokemon.name + i18next.t("battlerTags:helpingHandOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + pokemonName: getPokemonNameWithAffix(pokemon) }) ); } @@ -584,7 +830,7 @@ export class HelpingHandTag extends BattlerTag { * @extends TrappedTag */ export class IngrainTag extends TrappedTag { - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.INGRAIN, BattlerTagLapseType.TURN_END, 1, Moves.INGRAIN, sourceId); } @@ -607,8 +853,8 @@ export class IngrainTag extends TrappedTag { new PokemonHealPhase( pokemon.scene, pokemon.getBattlerIndex(), - Math.floor(pokemon.getMaxHp() / 16), - i18next.t("battle:battlerTagsIngrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), + Utils.toDmgValue(pokemon.getMaxHp() / 16), + i18next.t("battlerTags:ingrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), true ) ); @@ -618,23 +864,48 @@ export class IngrainTag extends TrappedTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsIngrainOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:ingrainOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } getDescriptor(): string { - return "roots"; + return i18next.t("battlerTags:ingrainDesc"); + } +} + +/** + * Octolock traps the target pokemon and reduces its DEF and SPDEF by one stage at the + * end of each turn. + */ +export class OctolockTag extends TrappedTag { + constructor(sourceId: number) { + super(BattlerTagType.OCTOLOCK, BattlerTagLapseType.TURN_END, 1, Moves.OCTOLOCK, sourceId); + } + + canAdd(pokemon: Pokemon): boolean { + return !pokemon.getTag(BattlerTagType.OCTOLOCK); + } + + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + const shouldLapse = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); + + if (shouldLapse) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.DEF, Stat.SPDEF ], -1)); + return true; + } + + return false; } } 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 { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsAquaRingOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:aquaRingOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -645,10 +916,10 @@ export class AquaRingTag extends BattlerTag { new PokemonHealPhase( pokemon.scene, pokemon.getBattlerIndex(), - Math.floor(pokemon.getMaxHp() / 16), - i18next.t("battle:battlerTagsAquaRingLapse", { + Utils.toDmgValue(pokemon.getMaxHp() / 16), + i18next.t("battlerTags:aquaRingLapse", { moveName: this.getMoveName(), - pokemonName: pokemon.name + pokemonName: getPokemonNameWithAffix(pokemon) }), true)); } @@ -660,7 +931,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 { @@ -696,7 +967,7 @@ export class DrowsyTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsDrowsyOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:drowsyOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -709,14 +980,14 @@ export class DrowsyTag extends BattlerTag { } getDescriptor(): string { - return "drowsiness"; + return i18next.t("battlerTags:drowsyDesc"); } } export abstract class DamagingTrapTag extends TrappedTag { private commonAnim: CommonAnim; - constructor(tagType: BattlerTagType, commonAnim: CommonAnim, turnCount: integer, sourceMove: Moves, sourceId: integer) { + constructor(tagType: BattlerTagType, commonAnim: CommonAnim, turnCount: number, sourceMove: Moves, sourceId: number) { super(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove, sourceId); this.commonAnim = commonAnim; @@ -732,7 +1003,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 { @@ -740,7 +1011,7 @@ export abstract class DamagingTrapTag extends TrappedTag { if (ret) { pokemon.scene.queueMessage( - i18next.t("battle:battlerTagsDamagingTrapLapse", { + i18next.t("battlerTags:damagingTrapLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() }) @@ -751,7 +1022,7 @@ export abstract class DamagingTrapTag extends TrappedTag { applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / 8)); + pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 8)); } } @@ -760,74 +1031,74 @@ export abstract class DamagingTrapTag extends TrappedTag { } export class BindTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.BIND, CommonAnim.BIND, turnCount, Moves.BIND, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsBindOnTrap", { + return i18next.t("battlerTags:bindOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name, + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? moveName: this.getMoveName() }); } } export class WrapTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.WRAP, CommonAnim.WRAP, turnCount, Moves.WRAP, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsWrapOnTrap", { + return i18next.t("battlerTags:wrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? }); } } export abstract class VortexTrapTag extends DamagingTrapTag { - constructor(tagType: BattlerTagType, commonAnim: CommonAnim, turnCount: integer, sourceMove: Moves, sourceId: integer) { + constructor(tagType: BattlerTagType, commonAnim: CommonAnim, turnCount: number, sourceMove: Moves, sourceId: number) { super(tagType, commonAnim, turnCount, sourceMove, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsVortexOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:vortexOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } export class FireSpinTag extends VortexTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.FIRE_SPIN, CommonAnim.FIRE_SPIN, turnCount, Moves.FIRE_SPIN, sourceId); } } export class WhirlpoolTag extends VortexTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.WHIRLPOOL, CommonAnim.WHIRLPOOL, turnCount, Moves.WHIRLPOOL, sourceId); } } export class ClampTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.CLAMP, CommonAnim.CLAMP, turnCount, Moves.CLAMP, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsClampOnTrap", { - sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), - pokemonName: pokemon.name, + return i18next.t("battlerTags:clampOnTrap", { + sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + pokemonName: getPokemonNameWithAffix(pokemon), }); } } export class SandTombTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.SAND_TOMB, CommonAnim.SAND_TOMB, turnCount, Moves.SAND_TOMB, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsSandTombOnTrap", { + return i18next.t("battlerTags:sandTombOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() }); @@ -835,47 +1106,47 @@ export class SandTombTag extends DamagingTrapTag { } export class MagmaStormTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.MAGMA_STORM, CommonAnim.MAGMA_STORM, turnCount, Moves.MAGMA_STORM, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsMagmaStormOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:magmaStormOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } export class SnapTrapTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.SNAP_TRAP, CommonAnim.SNAP_TRAP, turnCount, Moves.SNAP_TRAP, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsSnapTrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:snapTrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } export class ThunderCageTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.THUNDER_CAGE, CommonAnim.THUNDER_CAGE, turnCount, Moves.THUNDER_CAGE, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsThunderCageOnTrap", { + return i18next.t("battlerTags:thunderCageOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) + sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? }); } } export class InfestationTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.INFESTATION, CommonAnim.INFESTATION, turnCount, Moves.INFESTATION, sourceId); } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsInfestationOnTrap", { + return i18next.t("battlerTags:infestationOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) + sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? }); } } @@ -883,19 +1154,19 @@ export class InfestationTag extends DamagingTrapTag { export class ProtectedTag extends BattlerTag { constructor(sourceMove: Moves, tagType: BattlerTagType = BattlerTagType.PROTECTED) { - super(tagType, BattlerTagLapseType.CUSTOM, 0, sourceMove); + super(tagType, BattlerTagLapseType.TURN_END, 0, sourceMove); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsProtectedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:protectedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { new CommonBattleAnim(CommonAnim.PROTECT, pokemon).play(pokemon.scene); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsProtectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:protectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); // Stop multi-hit moves early const effectPhase = pokemon.scene.getCurrentPhase(); @@ -910,9 +1181,9 @@ export class ProtectedTag extends BattlerTag { } export class ContactDamageProtectedTag extends ProtectedTag { - private damageRatio: integer; + private damageRatio: number; - constructor(sourceMove: Moves, damageRatio: integer) { + constructor(sourceMove: Moves, damageRatio: number) { super(sourceMove, BattlerTagType.SPIKY_SHIELD); this.damageRatio = damageRatio; @@ -934,7 +1205,9 @@ export class ContactDamageProtectedTag extends ProtectedTag { const effectPhase = pokemon.scene.getCurrentPhase(); if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); - attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + if (!attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + } } } @@ -942,11 +1215,11 @@ export class ContactDamageProtectedTag extends ProtectedTag { } } -export class ContactStatChangeProtectedTag extends ProtectedTag { +export class ContactStatStageChangeProtectedTag extends ProtectedTag { private stat: BattleStat; - private levels: integer; + private levels: number; - constructor(sourceMove: Moves, tagType: BattlerTagType, stat: BattleStat, levels: integer) { + constructor(sourceMove: Moves, tagType: BattlerTagType, stat: BattleStat, levels: number) { super(sourceMove, tagType); this.stat = stat; @@ -959,7 +1232,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; } @@ -970,7 +1243,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)); } } @@ -1026,12 +1299,12 @@ export class EnduringTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEnduringOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:enduringOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEnduringLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:enduringLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return true; } @@ -1046,7 +1319,7 @@ export class SturdyTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSturdyLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:sturdyLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return true; } @@ -1055,8 +1328,8 @@ export class SturdyTag extends BattlerTag { } export class PerishSongTag extends BattlerTag { - constructor(turnCount: integer) { - super(BattlerTagType.PERISH_SONG, BattlerTagLapseType.TURN_END, turnCount, Moves.PERISH_SONG); + constructor(turnCount: number) { + super(BattlerTagType.PERISH_SONG, BattlerTagLapseType.TURN_END, turnCount, Moves.PERISH_SONG, undefined, true); } canAdd(pokemon: Pokemon): boolean { @@ -1068,7 +1341,7 @@ export class PerishSongTag extends BattlerTag { if (ret) { pokemon.scene.queueMessage( - i18next.t("battle:battlerTagsPerishSongLapse", { + i18next.t("battlerTags:perishSongLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), turnCount: this.turnCount }) @@ -1104,15 +1377,15 @@ export class CenterOfAttentionTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " became the center\nof attention!")); + pokemon.scene.queueMessage(i18next.t("battlerTags:centerOfAttentionOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } export class AbilityBattlerTag extends BattlerTag { public ability: Abilities; - constructor(tagType: BattlerTagType, ability: Abilities, lapseType: BattlerTagLapseType, turnCount: integer) { - super(tagType, lapseType, turnCount, undefined); + constructor(tagType: BattlerTagType, ability: Abilities, lapseType: BattlerTagLapseType, turnCount: number) { + super(tagType, lapseType, turnCount); this.ability = ability; } @@ -1143,7 +1416,7 @@ export class TruantTag extends AbilityBattlerTag { if (lastMove && lastMove.move !== Moves.NONE) { (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, passive)); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsTruantLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:truantLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } return true; @@ -1158,7 +1431,7 @@ export class SlowStartTag extends AbilityBattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSlowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null, true); + pokemon.scene.queueMessage(i18next.t("battlerTags:slowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null, true); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1172,7 +1445,7 @@ export class SlowStartTag extends AbilityBattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSlowStartOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null); + pokemon.scene.queueMessage(i18next.t("battlerTags:slowStartOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null); } } @@ -1197,16 +1470,16 @@ 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: integer, value: integer, i: integer) => { + 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; }, 0); + highestStat = highestStat!; // tell TS compiler it's defined! this.stat = highestStat; switch (this.stat) { @@ -1218,13 +1491,13 @@ export class HighestStatBoostTag extends AbilityBattlerTag { break; } - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHighestStatBoostOnAdd", { 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 { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHighestStatBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: allAbilities[this.ability].name })); + pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: allAbilities[this.ability].name })); } } @@ -1265,7 +1538,7 @@ export class TerrainHighestStatBoostTag extends HighestStatBoostTag implements T } export class SemiInvulnerableTag extends BattlerTag { - constructor(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves) { + constructor(tagType: BattlerTagType, turnCount: number, sourceMove: Moves) { super(tagType, BattlerTagLapseType.MOVE_EFFECT, turnCount, sourceMove); } @@ -1288,7 +1561,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; } @@ -1311,13 +1584,13 @@ export class MagnetRisenTag extends TypeImmuneTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " levitated with electromagnetism!")); + pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " stopped levitating!")); + pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } @@ -1352,13 +1625,13 @@ 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 { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCritBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:critBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1368,26 +1641,33 @@ export class CritBoostTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCritBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.scene.queueMessage(i18next.t("battlerTags:critBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } -export class AlwaysCritTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.ALWAYS_CRIT, BattlerTagLapseType.TURN_END, 2, sourceMove); - } -} +/** + * 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[]; -export class IgnoreAccuracyTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.IGNORE_ACCURACY, BattlerTagLapseType.TURN_END, 2, sourceMove); + 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: integer; + private sourceIndex: number; - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.SALT_CURED, BattlerTagLapseType.TURN_END, 1, Moves.SALT_CURE, sourceId); } @@ -1403,8 +1683,8 @@ export class SaltCuredTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSaltCuredOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); + pokemon.scene.queueMessage(i18next.t("battlerTags:saltCuredOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1418,10 +1698,10 @@ export class SaltCuredTag extends BattlerTag { if (!cancelled.value) { const pokemonSteelOrWater = pokemon.isOfType(Type.STEEL) || pokemon.isOfType(Type.WATER); - pokemon.damageAndUpdate(Math.max(Math.floor(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8), 1)); + pokemon.damageAndUpdate(Utils.toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8)); pokemon.scene.queueMessage( - i18next.t("battle:battlerTagsSaltCuredLapse", { + i18next.t("battlerTags:saltCuredLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() }) @@ -1434,10 +1714,10 @@ export class SaltCuredTag extends BattlerTag { } export class CursedTag extends BattlerTag { - private sourceIndex: integer; + private sourceIndex: number; - constructor(sourceId: integer) { - super(BattlerTagType.CURSED, BattlerTagLapseType.TURN_END, 1, Moves.CURSE, sourceId); + constructor(sourceId: number) { + super(BattlerTagType.CURSED, BattlerTagLapseType.TURN_END, 1, Moves.CURSE, sourceId, true); } /** @@ -1451,7 +1731,7 @@ export class CursedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); + this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1464,8 +1744,8 @@ export class CursedTag extends BattlerTag { applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(Math.max(Math.floor(pokemon.getMaxHp() / 4), 1)); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 4)); + pokemon.scene.queueMessage(i18next.t("battlerTags:cursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } @@ -1475,8 +1755,8 @@ export class CursedTag extends BattlerTag { /** * Battler tag for effects that ground the source, allowing Ground-type moves to hit them. Encompasses two tag types: - * @item IGNORE_FLYING: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) - * @item ROOSTED: One-turn grounding effects (i.e. from Roost) + * @item `IGNORE_FLYING`: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) + * @item `ROOSTED`: One-turn grounding effects (i.e. from Roost) */ export class GroundedTag extends BattlerTag { constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: Moves) { @@ -1484,36 +1764,25 @@ export class GroundedTag extends BattlerTag { } } -/** - * Provides the Ice Face ability's effects. - */ -export class IceFaceTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.ICE_FACE, BattlerTagLapseType.CUSTOM, 1, sourceMove); +/** Common attributes of form change abilities that block damage */ +export class FormBlockDamageTag extends BattlerTag { + constructor(tagType: BattlerTagType) { + super(tagType, BattlerTagLapseType.CUSTOM, 1); } /** - * Determines if the Ice Face tag can be added to the Pokémon. - * @param {Pokemon} pokemon - The Pokémon to which the tag might be added. - * @returns {boolean} - True if the tag can be added, false otherwise. + * Determines if the tag can be added to the Pokémon. + * @param {Pokemon} pokemon The Pokémon to which the tag might be added. + * @returns {boolean} True if the tag can be added, false otherwise. */ canAdd(pokemon: Pokemon): boolean { - const weatherType = pokemon.scene.arena.weather?.weatherType; - const isWeatherSnowOrHail = weatherType === WeatherType.HAIL || weatherType === WeatherType.SNOW; - const isFormIceFace = pokemon.formIndex === 0; - - - // Hard code Eiscue for now, this is to prevent the game from crashing if fused pokemon has Ice Face - if ((pokemon.species.speciesId === Species.EISCUE && isFormIceFace) || isWeatherSnowOrHail) { - return true; - } - return false; + return pokemon.formIndex === 0; } /** - * Applies the Ice Face tag to the Pokémon. - * Triggers a form change to Ice Face if the Pokémon is not in its Ice Face form. - * @param {Pokemon} pokemon - The Pokémon to which the tag is added. + * Applies the tag to the Pokémon. + * Triggers a form change if the Pokémon is not in its defense form. + * @param {Pokemon} pokemon The Pokémon to which the tag is added. */ onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); @@ -1524,9 +1793,9 @@ export class IceFaceTag extends BattlerTag { } /** - * Removes the Ice Face tag from the Pokémon. - * Triggers a form change to Noice when the tag is removed. - * @param {Pokemon} pokemon - The Pokémon from which the tag is removed. + * Removes the tag from the Pokémon. + * Triggers a form change when the tag is removed. + * @param {Pokemon} pokemon The Pokémon from which the tag is removed. */ onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); @@ -1535,10 +1804,195 @@ export class IceFaceTag extends BattlerTag { } } -export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves, sourceId: integer): BattlerTag { +/** Provides the additional weather-based effects of the Ice Face ability */ +export class IceFaceBlockDamageTag extends FormBlockDamageTag { + constructor(tagType: BattlerTagType) { + super(tagType); + } + + /** + * Determines if the tag can be added to the Pokémon. + * @param {Pokemon} pokemon The Pokémon to which the tag might be added. + * @returns {boolean} True if the tag can be added, false otherwise. + */ + canAdd(pokemon: Pokemon): boolean { + const weatherType = pokemon.scene.arena.weather?.weatherType; + const isWeatherSnowOrHail = weatherType === WeatherType.HAIL || weatherType === WeatherType.SNOW; + + return super.canAdd(pokemon) || isWeatherSnowOrHail; + } +} + +/** + * Battler tag enabling the Stockpile mechanic. This tag handles: + * - Stack tracking, including max limit enforcement (which is replicated in Stockpile for redundancy). + * + * - Stat changes on adding a stack. Adding a stockpile stack attempts to raise the pokemon's DEF and SPDEF by +1. + * + * - Stat changes on removal of (all) stacks. + * - Removing stacks decreases DEF and SPDEF, independently, by one stage for each stack that successfully changed + * the stat when added. + */ +export class StockpilingTag extends BattlerTag { + public stockpiledCount: number = 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 onStatStagesChanged: StatStageChangeCallback = (_, statsChanged, statChanges) => { + const defChange = statChanges[statsChanged.indexOf(Stat.DEF)] ?? 0; + const spDefChange = statChanges[statsChanged.indexOf(Stat.SPDEF)] ?? 0; + + if (defChange) { + this.statChangeCounts[Stat.DEF]++; + } + + if (spDefChange) { + this.statChangeCounts[Stat.SPDEF]++; + } + }; + + loadTag(source: BattlerTag | any): void { + super.loadTag(source); + this.stockpiledCount = source.stockpiledCount || 0; + this.statChangeCounts = { + [ Stat.DEF ]: source.statChangeCounts?.[ Stat.DEF ] ?? 0, + [ Stat.SPDEF ]: source.statChangeCounts?.[ Stat.SPDEF ] ?? 0, + }; + } + + /** + * Adds a stockpile stack to a pokemon, up to a maximum of 3 stacks. Note that onOverlap defers to this method. + * + * If a stack is added, a message is displayed and the pokemon's DEF and SPDEF are increased by 1. + * For each stat, an internal counter is incremented (by 1) if the stat was successfully changed. + */ + onAdd(pokemon: Pokemon): void { + if (this.stockpiledCount < 3) { + this.stockpiledCount++; + + pokemon.scene.queueMessage(i18next.t("battlerTags:stockpilingOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + stockpiledCount: this.stockpiledCount + })); + + // Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes. + pokemon.scene.unshiftPhase(new StatStageChangePhase( + pokemon.scene, pokemon.getBattlerIndex(), true, + [Stat.SPDEF, Stat.DEF], 1, true, false, true, this.onStatStagesChanged + )); + } + } + + onOverlap(pokemon: Pokemon): void { + this.onAdd(pokemon); + } + + /** + * Removing the tag removes all stacks, and the pokemon's DEF and SPDEF are decreased by + * one stage for each stack which had successfully changed that particular stat during onAdd. + */ + onRemove(pokemon: Pokemon): void { + const defChange = this.statChangeCounts[Stat.DEF]; + const spDefChange = this.statChangeCounts[Stat.SPDEF]; + + if (defChange) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.DEF ], -defChange, true, false, true)); + } + + if (spDefChange) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF ], -spDefChange, true, false, true)); + } + } +} + +/** + * Battler tag for Gulp Missile used by Cramorant. + * @extends BattlerTag + */ +export class GulpMissileTag extends BattlerTag { + constructor(tagType: BattlerTagType, sourceMove: Moves) { + super(tagType, BattlerTagLapseType.CUSTOM, 0, sourceMove); + } + + /** + * Gulp Missile's initial form changes are triggered by using Surf and Dive. + * @param {Pokemon} pokemon The Pokemon with Gulp Missile ability. + * @returns Whether the BattlerTag can be added. + */ + canAdd(pokemon: Pokemon): boolean { + const isSurfOrDive = [ Moves.SURF, Moves.DIVE ].includes(this.sourceMove); + const isNormalForm = pokemon.formIndex === 0 && !pokemon.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA) && !pokemon.getTag(BattlerTagType.GULP_MISSILE_PIKACHU); + const isCramorant = pokemon.species.speciesId === Species.CRAMORANT; + + return isSurfOrDive && isNormalForm && isCramorant; + } + + onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + } + + onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + } +} + +/** + * Tag that makes the target drop all of it type immunities + * and all accuracy checks ignore its evasiveness stat. + * + * Applied by moves: {@linkcode Moves.ODOR_SLEUTH | Odor Sleuth}, + * {@linkcode Moves.MIRACLE_EYE | Miracle Eye} and {@linkcode Moves.FORESIGHT | Foresight}. + * + * @extends BattlerTag + * @see {@linkcode ignoreImmunity} + */ +export class ExposedTag extends BattlerTag { + private defenderType: Type; + private allowedTypes: Type[]; + + constructor(tagType: BattlerTagType, sourceMove: Moves, defenderType: Type, allowedTypes: Type[]) { + super(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove); + this.defenderType = defenderType; + this.allowedTypes = allowedTypes; + } + + /** + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ + loadTag(source: BattlerTag | any): void { + super.loadTag(source); + this.defenderType = source.defenderType as Type; + this.allowedTypes = source.allowedTypes as Type[]; + } + + /** + * @param types {@linkcode Type} of the defending Pokemon + * @param moveType {@linkcode Type} of the move targetting it + * @returns `true` if the move should be allowed to target the defender. + */ + ignoreImmunity(type: Type, moveType: Type): boolean { + return type === this.defenderType && this.allowedTypes.includes(moveType); + } +} + + +export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag { switch (tagType) { case BattlerTagType.RECHARGING: return new RechargingTag(sourceMove); + case BattlerTagType.BEAK_BLAST_CHARGING: + return new BeakBlastChargingTag(); + case BattlerTagType.SHELL_TRAP: + return new ShellTrapTag(); case BattlerTagType.FLINCHED: return new FlinchedTag(sourceMove); case BattlerTagType.INTERRUPTED: @@ -1552,9 +2006,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.NIGHTMARE: return new NightmareTag(); case BattlerTagType.FRENZY: - return new FrenzyTag(sourceMove, sourceId); + return new FrenzyTag(turnCount, sourceMove, sourceId); case BattlerTagType.CHARGING: - return new ChargingTag(sourceMove, sourceId); + return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); case BattlerTagType.ENCORE: return new EncoreTag(sourceId); case BattlerTagType.HELPING_HAND: @@ -1567,6 +2021,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc 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: @@ -1592,11 +2048,11 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc 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: @@ -1626,14 +2082,16 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc 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: - return new AlwaysCritTag(sourceMove); - case BattlerTagType.NO_CRIT: - return new BattlerTag(tagType, BattlerTagLapseType.AFTER_MOVE, turnCount, sourceMove); case BattlerTagType.IGNORE_ACCURACY: - return new IgnoreAccuracyTag(sourceMove); + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); + case BattlerTagType.ALWAYS_GET_HIT: + case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: + return new BattlerTag(tagType, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); case BattlerTagType.BYPASS_SLEEP: - return new BattlerTag(BattlerTagType.BYPASS_SLEEP, BattlerTagLapseType.TURN_END, turnCount, sourceMove); + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); case BattlerTagType.IGNORE_FLYING: return new GroundedTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); case BattlerTagType.ROOSTED: @@ -1651,7 +2109,22 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.DESTINY_BOND: return new DestinyBondTag(sourceMove, sourceId); case BattlerTagType.ICE_FACE: - return new IceFaceTag(sourceMove); + return new IceFaceBlockDamageTag(tagType); + case BattlerTagType.DISGUISE: + return new FormBlockDamageTag(tagType); + case BattlerTagType.STOCKPILING: + return new StockpilingTag(sourceMove); + case BattlerTagType.OCTOLOCK: + return new OctolockTag(sourceId); + case BattlerTagType.DISABLED: + return new DisabledTag(sourceId); + case BattlerTagType.IGNORE_GHOST: + return new ExposedTag(tagType, sourceMove, Type.GHOST, [Type.NORMAL, Type.FIGHTING]); + case BattlerTagType.IGNORE_DARK: + return new ExposedTag(tagType, sourceMove, Type.DARK, [Type.PSYCHIC]); + case BattlerTagType.GULP_MISSILE_ARROKUDA: + case BattlerTagType.GULP_MISSILE_PIKACHU: + return new GulpMissileTag(tagType, sourceMove); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/berry.ts b/src/data/berry.ts index 2f0f466d8a9..01325ee39dd 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -1,13 +1,14 @@ -import { PokemonHealPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +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 { 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`); @@ -34,27 +35,28 @@ 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; - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); - return pokemon.getHpRatio() < threshold.value && pokemon.summonData.battleStats[battleStat] < 6; + // Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth + const stat: BattleStat = berryType - BerryType.ENIGMA; + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); + return pokemon.getHpRatio() < threshold.value && pokemon.getStatStage(stat) < 6; }; case BerryType.LANSAT: return (pokemon: Pokemon) => { const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); return pokemon.getHpRatio() < 0.25 && !pokemon.getTag(BattlerTagType.CRIT_BOOST); }; case BerryType.STARF: return (pokemon: Pokemon) => { const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); return pokemon.getHpRatio() < 0.25; }; case BerryType.LEPPA: return (pokemon: Pokemon) => { const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); - return !!pokemon.getMoveset().find(m => !m.getPpRatio()); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); + return !!pokemon.getMoveset().find(m => !m?.getPpRatio()); }; } } @@ -69,10 +71,10 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } - const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4)); - applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed); + const hpHealed = new Utils.NumberHolder(Utils.toDmgValue(pokemon.getMaxHp() / 4)); + applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, hpHealed); pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - hpHealed.value, getPokemonMessage(pokemon, `'s ${getBerryName(berryType)}\nrestored its HP!`), true)); + hpHealed.value, i18next.t("battle:hpHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: getBerryName(berryType) }), true)); }; case BerryType.LUM: return (pokemon: Pokemon) => { @@ -94,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, 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) => { @@ -111,19 +114,20 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } - const statLevels = new Utils.NumberHolder(2); - applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value)); + const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK); + const stages = new Utils.NumberHolder(2); + applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages); + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randStat ], stages.value)); }; case BerryType.LEPPA: return (pokemon: Pokemon) => { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } - const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()) ? pokemon.getMoveset().find(m => !m.getPpRatio()) : pokemon.getMoveset().find(m => m.getPpRatio() < 1); + const ppRestoreMove = pokemon.getMoveset().find(m => !m?.getPpRatio()) ? pokemon.getMoveset().find(m => !m?.getPpRatio()) : pokemon.getMoveset().find(m => m!.getPpRatio() < 1); // TODO: is this bang correct? if (ppRestoreMove !== undefined) { - ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`)); + ppRestoreMove!.ppUsed = Math.max(ppRestoreMove!.ppUsed - 10, 0); + pokemon.scene.queueMessage(i18next.t("battle:ppHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: ppRestoreMove!.getName(), berryName: getBerryName(berryType) })); } }; } diff --git a/src/data/biomes.ts b/src/data/biomes.ts index 782826d8695..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"; @@ -17,8 +17,6 @@ export function getBiomeName(biome: Biome | -1) { return i18next.t("biome:GRASS"); case Biome.RUINS: return i18next.t("biome:RUINS"); - case Biome.ABYSS: - return i18next.t("biome:ABYSS"); case Biome.END: return i18next.t("biome:END"); default: @@ -39,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 }; @@ -7665,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 ]; @@ -7707,7 +7711,7 @@ export function initBiomes() { ? pokemonEvolutions[speciesId] : []; - if (!biomeEntries.filter(b => b[0] !== Biome.END).length && !speciesEvolutions.filter(es => !!((pokemonBiomes.find(p => p[0] === es.speciesId))[3] as any[]).filter(b => b[0] !== Biome.END).length).length) { + if (!biomeEntries.filter(b => b[0] !== Biome.END).length && !speciesEvolutions.filter(es => !!((pokemonBiomes.find(p => p[0] === es.speciesId)!)[3] as any[]).filter(b => b[0] !== Biome.END).length).length) { // TODO: is the bang on the `find()` correct? uncatchableSpecies.push(speciesId); } diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 75b200b24ee..2205519c532 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,52 +1,101 @@ import * as Utils from "../utils"; import i18next from "i18next"; -import { DexAttrProps, GameData } from "#app/system/game-data.js"; +import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data"; import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species"; -import Pokemon from "#app/field/pokemon.js"; -import { BattleType, FixedBattleConfig } from "#app/battle.js"; -import Trainer, { TrainerVariant } from "#app/field/trainer.js"; -import { GameMode } from "#app/game-mode.js"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import { BattleType, FixedBattleConfig } from "#app/battle"; +import Trainer, { TrainerVariant } from "#app/field/trainer"; +import { GameMode } from "#app/game-mode"; import { Type } from "./type"; -import { pokemonEvolutions } from "./pokemon-evolutions"; -import { pokemonFormChanges } from "./pokemon-forms"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; -import { TypeColor, TypeShadow } from "#app/enums/color.js"; +import { Nature } from "./nature"; +import { Moves } from "#app/enums/moves"; +import { TypeColor, TypeShadow } from "#app/enums/color"; +import { pokemonEvolutions } from "./pokemon-evolutions"; +import { pokemonFormChanges } from "./pokemon-forms"; + +/** A constant for the default max cost of the starting party before a run */ +const DEFAULT_PARTY_MAX_COST = 10; /** * An enum for all the challenge types. The parameter entries on these describe the * parameters to use when calling the applyChallenges function. */ export enum ChallengeType { - /** - * Challenges which modify what starters you can choose - * @param args [0] {@link PokemonSpecies} The species to check - * [1] {@link Utils.BooleanHolder} Sets to false if illegal, pass in true. - */ + /** + * Challenges which modify what starters you can choose + * @see {@link Challenge.applyStarterChoice} + */ STARTER_CHOICE, - /** - * Challenges which modify how many starter points you have - * @param args [0] {@link Utils.NumberHolder} The amount of starter points you have - */ + /** + * Challenges which modify how many starter points you have + * @see {@link Challenge.applyStarterPoints} + */ STARTER_POINTS, + /** + * Challenges which modify how many starter points you have + * @see {@link Challenge.applyStarterPointCost} + */ + STARTER_COST, /** * Challenges which modify your starters in some way - * Not Fully Implemented + * @see {@link Challenge.applyStarterModify} */ STARTER_MODIFY, /** * Challenges which limit which pokemon you can have in battle. - * @param args [0] {@link Pokemon} The pokemon to check - * [1] {@link Utils.BooleanHolder} Sets to false if illegal, pass in true. + * @see {@link Challenge.applyPokemonInBattle} */ POKEMON_IN_BATTLE, /** * Adds or modifies the fixed battles in a run - * @param args [0] integer The wave to get a battle for - * [1] {@link FixedBattleConfig} A new fixed battle. It'll be modified if a battle exists. + * @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. + */ + AI_LEVEL, + /** + * Modifies how many move slots the AI has. UNIMPLEMENTED. + */ + AI_MOVE_SLOTS, + /** + * Modifies if a pokemon has its passive. UNIMPLEMENTED. + */ + PASSIVE_ACCESS, + /** + * Modifies the game mode settings in some way. UNIMPLEMENTED. + */ + GAME_MODE_MODIFY, + /** + * Modifies what level AI pokemon can access a move. UNIMPLEMENTED. + */ + MOVE_ACCESS, + /** + * Modifies what weight AI pokemon have when generating movesets. UNIMPLEMENTED. + */ + MOVE_WEIGHT, +} + +/** + * Used for challenge types that modify movesets, these denote the various sources of moves for pokemon. + */ +export enum MoveSourceType { + LEVEL_UP, // Currently unimplemented for move access + RELEARNER, // Relearner moves currently unimplemented + COMMON_TM, + GREAT_TM, + ULTRA_TM, + COMMON_EGG, + RARE_EGG } /** @@ -61,10 +110,9 @@ export abstract class Challenge { public maxSeverity: integer; // The maximum severity of the challenge. public conditions: ChallengeCondition[]; - public challengeTypes: ChallengeType[]; /** - * @param {Challenges} id The enum value for the challenge + * @param id {@link Challenges} The enum value for the challenge */ constructor(id: Challenges, maxValue: integer = Number.MAX_SAFE_INTEGER) { this.id = id; @@ -74,7 +122,6 @@ export abstract class Challenge { this.severity = 0; this.maxSeverity = 0; this.conditions = []; - this.challengeTypes = []; } /** @@ -87,7 +134,7 @@ export abstract class Challenge { /** * Gets the localisation key for the challenge - * @returns The i18n key for this challenge + * @returns {@link string} The i18n key for this challenge */ geti18nKey(): string { return Challenges[this.id].split("_").map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); @@ -95,8 +142,8 @@ export abstract class Challenge { /** * Used for unlockable challenges to check if they're unlocked. - * @param {GameData} data The save data. - * @returns {boolean} Whether this challenge is unlocked. + * @param data {@link GameData} The save data. + * @returns {@link boolean} Whether this challenge is unlocked. */ isUnlocked(data: GameData): boolean { return this.conditions.every(f => f(data)); @@ -104,8 +151,8 @@ export abstract class Challenge { /** * Adds an unlock condition to this challenge. - * @param {ChallengeCondition} condition The condition to add. - * @returns {Challenge} This challenge + * @param condition {@link ChallengeCondition} The condition to add. + * @returns {@link Challenge} This challenge */ condition(condition: ChallengeCondition): Challenge { this.conditions.push(condition); @@ -114,27 +161,7 @@ export abstract class Challenge { } /** - * If this challenge is of a particular type - * @param {ChallengeType} challengeType The challenge type to check. - * @returns {Challenge} This challenge - */ - isOfType(challengeType: ChallengeType): boolean { - return this.challengeTypes.some(c => c === challengeType); - } - - /** - * Adds a challenge type to this challenge. - * @param {ChallengeType} challengeType The challenge type to add. - * @returns {Challenge} This challenge - */ - addChallengeType(challengeType: ChallengeType): Challenge { - this.challengeTypes.push(challengeType); - - return this; - } - - /** - * @returns {string} The localised name of this challenge. + * @returns {@link string} The localised name of this challenge. */ getName(): string { return i18next.t(`challenges:${this.geti18nKey()}.name`); @@ -142,8 +169,8 @@ export abstract class Challenge { /** * Returns the textual representation of a challenge's current value. - * @param {value} overrideValue The value to check for. If undefined, gets the current value. - * @returns {string} The localised name for the current value. + * @param overrideValue {@link integer} The value to check for. If undefined, gets the current value. + * @returns {@link string} The localised name for the current value. */ getValue(overrideValue?: integer): string { if (overrideValue === undefined) { @@ -154,19 +181,19 @@ export abstract class Challenge { /** * Returns the description of a challenge's current value. - * @param {value} overrideValue The value to check for. If undefined, gets the current value. - * @returns {string} The localised description for the current value. + * @param overrideValue {@link integer} The value to check for. If undefined, gets the current value. + * @returns {@link string} The localised description for the current value. */ getDescription(overrideValue?: integer): string { if (overrideValue === undefined) { overrideValue = this.value; } - return `${i18next.t("challenges:usePokemon")}${i18next.t(`challenges:${this.geti18nKey()}.desc.${this.value}`)}`; + return `${i18next.t([`challenges:${this.geti18nKey()}.desc.${this.value}`, `challenges:${this.geti18nKey()}.desc`])}`; } /** * Increase the value of the challenge - * @returns {boolean} Returns true if the value changed + * @returns {@link boolean} Returns true if the value changed */ increaseValue(): boolean { if (this.value < this.maxValue) { @@ -178,7 +205,7 @@ export abstract class Challenge { /** * Decrease the value of the challenge - * @returns {boolean} Returns true if the value changed + * @returns {@link boolean} Returns true if the value changed */ decreaseValue(): boolean { if (this.value > 0) { @@ -197,7 +224,7 @@ export abstract class Challenge { /** * Decrease the severity of the challenge - * @returns {boolean} Returns true if the value changed + * @returns {@link boolean} Returns true if the value changed */ decreaseSeverity(): boolean { if (this.severity > 0) { @@ -209,7 +236,7 @@ export abstract class Challenge { /** * Increase the severity of the challenge - * @returns {boolean} Returns true if the value changed + * @returns {@link boolean} Returns true if the value changed */ increaseSeverity(): boolean { if (this.severity < this.maxSeverity) { @@ -221,7 +248,7 @@ export abstract class Challenge { /** * Gets the "difficulty" value of this challenge. - * @returns {integer} The difficulty value. + * @returns {@link integer} The difficulty value. */ getDifficulty(): integer { return this.value; @@ -229,27 +256,154 @@ export abstract class Challenge { /** * Gets the minimum difficulty added by this challenge. - * @returns {integer} The difficulty value. + * @returns {@link integer} The difficulty value. */ getMinDifficulty(): integer { return 0; } - /** - * Modifies the data or game state in some way to apply the challenge. - * @param {ChallengeType} challengeType Which challenge type this is being applied for. - * @param args Irrelevant. See the specific challenge's apply function for additional information. - */ - abstract apply(challengeType: ChallengeType, args: any[]): boolean; - /** * Clones a challenge, either from another challenge or json. Chainable. - * @param {Challenge | any} source The source challenge of json. - * @returns {Challenge} This challenge. + * @param source The source challenge or json. + * @returns This challenge. */ static loadChallenge(source: Challenge | any): Challenge { throw new Error("Method not implemented! Use derived class"); } + + /** + * An apply function for STARTER_CHOICE challenges. Derived classes should alter this. + * @param pokemon {@link PokemonSpecies} The pokemon to check the validity of. + * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. + * @param dexAttr {@link DexAttrProps} The dex attributes of the pokemon. + * @param soft {@link boolean} If true, allow it if it could become a valid pokemon. + * @returns {@link boolean} Whether this function did anything. + */ + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { + return false; + } + + /** + * An apply function for STARTER_POINTS challenges. Derived classes should alter this. + * @param points {@link Utils.NumberHolder} The amount of points you have available. + * @returns {@link boolean} Whether this function did anything. + */ + applyStarterPoints(points: Utils.NumberHolder): boolean { + return false; + } + + /** + * An apply function for STARTER_COST challenges. Derived classes should alter this. + * @param species {@link Species} The pokemon to change the cost of. + * @param cost {@link Utils.NumberHolder} The cost of the starter. + * @returns {@link boolean} Whether this function did anything. + */ + applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean { + return false; + } + + /** + * An apply function for STARTER_MODIFY challenges. Derived classes should alter this. + * @param pokemon {@link Pokemon} The starter pokemon to modify. + * @returns {@link boolean} Whether this function did anything. + */ + applyStarterModify(pokemon: Pokemon): boolean { + return false; + } + + /** + * An apply function for POKEMON_IN_BATTLE challenges. Derived classes should alter this. + * @param pokemon {@link Pokemon} The pokemon to check the validity of. + * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. + * @returns {@link boolean} Whether this function did anything. + */ + applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { + return false; + } + + /** + * An apply function for FIXED_BATTLE challenges. Derived classes should alter this. + * @param waveIndex {@link Number} The current wave index. + * @param battleConfig {@link FixedBattleConfig} The battle config to modify. + * @returns {@link boolean} Whether this function did anything. + */ + applyFixedBattle(waveIndex: Number, battleConfig: FixedBattleConfig): boolean { + 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. + * @param levelCap {@link Number} The current level cap. + * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. + * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. + * @returns {@link boolean} Whether this function did anything. + */ + applyLevelChange(level: Utils.IntegerHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean { + return false; + } + + /** + * An apply function for AI_MOVE_SLOTS challenges. Derived classes should alter this. + * @param pokemon {@link Pokemon} The pokemon that is being considered. + * @param moveSlots {@link Utils.IntegerHolder} The amount of move slots. + * @returns {@link boolean} Whether this function did anything. + */ + applyMoveSlot(pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean { + return false; + } + + /** + * An apply function for PASSIVE_ACCESS challenges. Derived classes should alter this. + * @param pokemon {@link Pokemon} The pokemon to change. + * @param hasPassive {@link Utils.BooleanHolder} Whether it should have its passive. + * @returns {@link boolean} Whether this function did anything. + */ + applyPassiveAccess(pokemon: Pokemon, hasPassive: Utils.BooleanHolder): boolean { + return false; + } + + /** + * An apply function for GAME_MODE_MODIFY challenges. Derived classes should alter this. + * @param gameMode {@link GameMode} The current game mode. + * @returns {@link boolean} Whether this function did anything. + */ + applyGameModeModify(gameMode: GameMode): boolean { + return false; + } + + /** + * An apply function for MOVE_ACCESS. Derived classes should alter this. + * @param pokemon {@link Pokemon} What pokemon would learn the move. + * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. + * @param move {@link Moves} The move in question. + * @param level {@link Utils.IntegerHolder} The level threshold for access. + * @returns {@link boolean} Whether this function did anything. + */ + applyMoveAccessLevel(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + return false; + } + + /** + * An apply function for MOVE_WEIGHT. Derived classes should alter this. + * @param pokemon {@link Pokemon} What pokemon would learn the move. + * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. + * @param move {@link Moves} The move in question. + * @param weight {@link Utils.IntegerHolder} The base weight of the move + * @returns {@link boolean} Whether this function did anything. + */ + applyMoveWeight(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + return false; + } } type ChallengeCondition = (data: GameData) => boolean; @@ -260,87 +414,67 @@ type ChallengeCondition = (data: GameData) => boolean; export class SingleGenerationChallenge extends Challenge { constructor() { super(Challenges.SINGLE_GENERATION, 9); - this.addChallengeType(ChallengeType.STARTER_CHOICE); - this.addChallengeType(ChallengeType.POKEMON_IN_BATTLE); - this.addChallengeType(ChallengeType.FIXED_BATTLES); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - /** - * We have special code below for victini because it is classed as a generation 4 pokemon in the code - * despite being a generation 5 pokemon. This is due to UI constraints, the starter select screen has - * no more room for pokemon so victini is put in the gen 4 section instead. This code just overrides the - * normal generation check to correctly treat victini as gen 5. - */ - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - const species = args[0] as PokemonSpecies; - const isValidStarter = args[1] as Utils.BooleanHolder; - const amountOfPokemon = args[3] as number; - const starterGeneration = species.speciesId === Species.VICTINI ? 5 : species.generation; - const generations = [starterGeneration]; - if (amountOfPokemon > 0) { - const speciesToCheck = [species.speciesId]; - while (speciesToCheck.length) { - const checking = speciesToCheck.pop(); - if (pokemonEvolutions.hasOwnProperty(checking)) { - pokemonEvolutions[checking].forEach(e => { - speciesToCheck.push(e.speciesId); - generations.push(getPokemonSpecies(e.speciesId).generation); - }); - } + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { + const generations = [pokemon.generation]; + if (soft) { + const speciesToCheck = [pokemon.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + if (checking && pokemonEvolutions.hasOwnProperty(checking)) { + pokemonEvolutions[checking].forEach(e => { + speciesToCheck.push(e.speciesId); + generations.push(getPokemonSpecies(e.speciesId).generation); + }); } } - if (!generations.includes(this.value)) { - isValidStarter.value = false; - return true; - } - break; - case ChallengeType.POKEMON_IN_BATTLE: - const pokemon = args[0] as Pokemon; - const isValidPokemon = args[1] as Utils.BooleanHolder; - const baseGeneration = pokemon.species.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.species.speciesId).generation; - const fusionGeneration = pokemon.isFusion() ? pokemon.fusionSpecies.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.fusionSpecies.speciesId).generation : 0; - if (pokemon.isPlayer() && (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value))) { - isValidPokemon.value = false; - return true; - } - break; - case ChallengeType.FIXED_BATTLES: - const waveIndex = args[0] as integer; - const battleConfig = args[1] as FixedBattleConfig; - let trainerTypes: TrainerType[] = []; - switch (waveIndex) { - case 182: - trainerTypes = [ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, Utils.randSeedItem([ TrainerType.HALA, TrainerType.MOLAYNE ]),TrainerType.MARNIE_ELITE, TrainerType.RIKA ]; - break; - case 184: - trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ]; - break; - case 186: - trainerTypes = [ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, Utils.randSeedItem([TrainerType.BEA_ELITE,TrainerType.ALLISTER_ELITE]), TrainerType.LARRY_ELITE ]; - break; - case 188: - trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; - break; - case 190: - trainerTypes = [ TrainerType.BLUE, Utils.randSeedItem([ TrainerType.RED, TrainerType.LANCE_CHAMPION ]), Utils.randSeedItem([ TrainerType.STEVEN, TrainerType.WALLACE ]), TrainerType.CYNTHIA, Utils.randSeedItem([ TrainerType.ALDER, TrainerType.IRIS ]), TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, Utils.randSeedItem([ TrainerType.GEETA, TrainerType.NEMONA ]) ]; - break; - } - if (trainerTypes.length === 0) { - return false; - } else { - battleConfig.setBattleType(BattleType.TRAINER).setGetTrainerFunc(scene => new Trainer(scene, trainerTypes[this.value - 1], TrainerVariant.DEFAULT)); - return true; - } + } + + if (!generations.includes(this.value)) { + valid.value = false; + return true; } return false; } + applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { + const baseGeneration = pokemon.species.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.species.speciesId).generation; + const fusionGeneration = pokemon.isFusion() ? pokemon.fusionSpecies?.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? + if (pokemon.isPlayer() && (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value))) { + valid.value = false; + return true; + } + return false; + } + + applyFixedBattle(waveIndex: Number, battleConfig: FixedBattleConfig): boolean { + let trainerTypes: TrainerType[] = []; + switch (waveIndex) { + case 182: + trainerTypes = [ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, Utils.randSeedItem([ TrainerType.HALA, TrainerType.MOLAYNE ]), TrainerType.MARNIE_ELITE, TrainerType.RIKA ]; + break; + case 184: + trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ]; + break; + case 186: + trainerTypes = [ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, Utils.randSeedItem([TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE]), TrainerType.LARRY_ELITE ]; + break; + case 188: + trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; + break; + case 190: + trainerTypes = [ TrainerType.BLUE, Utils.randSeedItem([ TrainerType.RED, TrainerType.LANCE_CHAMPION ]), Utils.randSeedItem([ TrainerType.STEVEN, TrainerType.WALLACE ]), TrainerType.CYNTHIA, Utils.randSeedItem([ TrainerType.ALDER, TrainerType.IRIS ]), TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, Utils.randSeedItem([ TrainerType.GEETA, TrainerType.NEMONA ]) ]; + break; + } + if (trainerTypes.length === 0) { + return false; + } else { + battleConfig.setBattleType(BattleType.TRAINER).setGetTrainerFunc(scene => new Trainer(scene, trainerTypes[this.value - 1], TrainerVariant.DEFAULT)); + return true; + } + } + /** * @overrides */ @@ -407,58 +541,44 @@ export class SingleTypeChallenge extends Challenge { constructor() { super(Challenges.SINGLE_TYPE, 18); - this.addChallengeType(ChallengeType.STARTER_CHOICE); - this.addChallengeType(ChallengeType.POKEMON_IN_BATTLE); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - const species = args[0] as PokemonSpecies; - const isValidStarter = args[1] as Utils.BooleanHolder; - const dexAttr = args[2] as DexAttrProps; - const amountOfPokemon = args[3] as number; - const speciesForm = getPokemonSpeciesForm(species.speciesId, dexAttr.formIndex); - const types = [speciesForm.type1, speciesForm.type2]; - if (amountOfPokemon > 0) { - const speciesToCheck = [species.speciesId]; - while (speciesToCheck.length) { - const checking = speciesToCheck.pop(); - if (pokemonEvolutions.hasOwnProperty(checking)) { - pokemonEvolutions[checking].forEach(e => { - speciesToCheck.push(e.speciesId); - types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2); + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { + const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex); + const types = [speciesForm.type1, speciesForm.type2]; + if (soft) { + const speciesToCheck = [pokemon.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + if (checking && pokemonEvolutions.hasOwnProperty(checking)) { + pokemonEvolutions[checking].forEach(e => { + speciesToCheck.push(e.speciesId); + types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2); + }); + } + if (checking && pokemonFormChanges.hasOwnProperty(checking)) { + pokemonFormChanges[checking].forEach(f1 => { + getPokemonSpecies(checking).forms.forEach(f2 => { + if (f1.formKey === f2.formKey) { + types.push(f2.type1, f2.type2); + } }); - } - if (pokemonFormChanges.hasOwnProperty(checking)) { - pokemonFormChanges[checking].forEach(f1 => { - getPokemonSpecies(checking).forms.forEach(f2 => { - if (f1.formKey === f2.formKey) { - types.push(f2.type1, f2.type2); - } - }); - }); - } + }); } } - if (!types.includes(this.value - 1)) { - isValidStarter.value = false; - return true; - } - break; - case ChallengeType.POKEMON_IN_BATTLE: - const pokemon = args[0] as Pokemon; - const isValidPokemon = args[1] as Utils.BooleanHolder; - if (pokemon.isPlayer() && !pokemon.isOfType(this.value - 1, false, false, true) - && !SingleTypeChallenge.TYPE_OVERRIDES.some(o => o.type === (this.value - 1) && (pokemon.isFusion() && o.fusion ? pokemon.fusionSpecies : pokemon.species).speciesId === o.species)) { - isValidPokemon.value = false; - return true; - } - break; + } + if (!types.includes(this.value - 1)) { + valid.value = false; + return true; + } + return false; + } + + applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { + if (pokemon.isPlayer() && !pokemon.isOfType(this.value - 1, false, false, true) + && !SingleTypeChallenge.TYPE_OVERRIDES.some(o => o.type === (this.value - 1) && (pokemon.isFusion() && o.fusion ? pokemon.fusionSpecies! : pokemon.species).speciesId === o.species)) { // TODO: is the bang on fusionSpecies correct? + valid.value = false; + return true; } return false; } @@ -512,32 +632,38 @@ export class SingleTypeChallenge extends Challenge { export class FreshStartChallenge extends Challenge { constructor() { super(Challenges.FRESH_START, 1); - this.addChallengeType(ChallengeType.STARTER_CHOICE); - this.addChallengeType(ChallengeType.STARTER_MODIFY); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - const species = args[0] as PokemonSpecies; - const isValidStarter = args[1] as Utils.BooleanHolder; - if (species) { - isValidStarter.value = false; - return true; - } - break; + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean { + if (!defaultStarterSpecies.includes(pokemon.speciesId)) { + valid.value = false; + return true; } return false; } - /** - * @overrides - */ - getDifficulty(): number { + applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean { + if (defaultStarterSpecies.includes(species)) { + cost.value = speciesStarters[species]; + return true; + } + return false; + } + + applyStarterModify(pokemon: Pokemon): boolean { + pokemon.abilityIndex = 0; // Always base ability, not hidden ability + pokemon.passive = false; // Passive isn't unlocked + pokemon.nature = Nature.HARDY; // Neutral nature + pokemon.moveset = pokemon.species.getLevelMoves().filter(m => m[0] <= 5).map(lm => lm[1]).slice(0, 4).map(m => new PokemonMove(m)); // No egg moves + pokemon.luck = 0; // No luck + pokemon.shiny = false; // Not shiny + pokemon.variant = 0; // Not shiny + 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; + } + + override getDifficulty(): number { return 0; } @@ -549,13 +675,44 @@ 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. */ export class LowerStarterMaxCostChallenge extends Challenge { constructor() { super(Challenges.LOWER_MAX_STARTER_COST, 9); - this.addChallengeType(ChallengeType.STARTER_CHOICE); } /** @@ -565,22 +722,13 @@ export class LowerStarterMaxCostChallenge extends Challenge { if (overrideValue === undefined) { overrideValue = this.value; } - return (10 - overrideValue).toString(); + return (DEFAULT_PARTY_MAX_COST - overrideValue).toString(); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - const species = args[0] as PokemonSpecies; - const isValid = args[1] as Utils.BooleanHolder; - if (speciesStarters[species.speciesId] > 10 - this.value) { - isValid.value = false; - return true; - } + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean { + if (speciesStarters[pokemon.speciesId] > DEFAULT_PARTY_MAX_COST - this.value) { + valid.value = false; + return true; } return false; } @@ -599,7 +747,6 @@ export class LowerStarterMaxCostChallenge extends Challenge { export class LowerStarterPointsChallenge extends Challenge { constructor() { super(Challenges.LOWER_STARTER_POINTS, 9); - this.addChallengeType(ChallengeType.STARTER_POINTS); } /** @@ -609,21 +756,12 @@ export class LowerStarterPointsChallenge extends Challenge { if (overrideValue === undefined) { overrideValue = this.value; } - return (10 - overrideValue).toString(); + return (DEFAULT_PARTY_MAX_COST - overrideValue).toString(); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - switch (challengeType) { - case ChallengeType.STARTER_POINTS: - const points = args[0] as Utils.NumberHolder; - points.value -= this.value; - return true; - } - return false; + applyStarterPoints(points: Utils.NumberHolder): boolean { + points.value -= this.value; + return true; } static loadChallenge(source: LowerStarterPointsChallenge | any): LowerStarterPointsChallenge { @@ -635,22 +773,180 @@ export class LowerStarterPointsChallenge extends Challenge { } /** - * Apply all challenges of a given challenge type. - * @param {GameMode} gameMode The current game mode - * @param {ChallengeType} challengeType What challenge type to apply - * @param {any[]} args Any args for that challenge type - * @returns {boolean} True if any challenge was successfully applied. + * Apply all challenges that modify starter choice. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_CHOICE + * @param pokemon {@link PokemonSpecies} The pokemon to check the validity of. + * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. + * @param dexAttr {@link DexAttrProps} The dex attributes of the pokemon. + * @param soft {@link boolean} If true, allow it if it could become a valid pokemon. + * @returns True if any challenge was successfully applied. */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_CHOICE, pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean): boolean; +/** + * Apply all challenges that modify available total starter points. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_POINTS + * @param points {@link Utils.NumberHolder} The amount of points you have available. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_POINTS, points: Utils.NumberHolder): boolean; +/** + * Apply all challenges that modify the cost of a starter. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_COST + * @param species {@link Species} The pokemon to change the cost of. + * @param points {@link Utils.NumberHolder} The cost of the pokemon. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_COST, species: Species, cost: Utils.NumberHolder): boolean; +/** + * Apply all challenges that modify a starter after selection. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_MODIFY + * @param pokemon {@link Pokemon} The starter pokemon to modify. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_MODIFY, pokemon: Pokemon): boolean; +/** + * Apply all challenges that what pokemon you can have in battle. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.POKEMON_IN_BATTLE + * @param pokemon {@link Pokemon} The pokemon to check the validity of. + * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.POKEMON_IN_BATTLE, pokemon: Pokemon, valid: Utils.BooleanHolder): boolean; +/** + * Apply all challenges that modify what fixed battles there are. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.FIXED_BATTLES + * @param waveIndex {@link Number} The current wave index. + * @param battleConfig {@link FixedBattleConfig} The battle config to modify. + * @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 + * @param challengeType {@link ChallengeType} ChallengeType.AI_LEVEL + * @param level {@link Utils.IntegerHolder} The generated level of the pokemon. + * @param levelCap {@link Number} The maximum level cap for the current wave. + * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. + * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_LEVEL, level: Utils.IntegerHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean; +/** + * Apply all challenges that modify how many move slots the AI has. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.AI_MOVE_SLOTS + * @param pokemon {@link Pokemon} The pokemon being considered. + * @param moveSlots {@link Utils.IntegerHolder} The amount of move slots. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_MOVE_SLOTS, pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean; +/** + * Apply all challenges that modify whether a pokemon has its passive. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.PASSIVE_ACCESS + * @param pokemon {@link Pokemon} The pokemon to modify. + * @param hasPassive {@link Utils.BooleanHolder} Whether it has its passive. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.PASSIVE_ACCESS, pokemon: Pokemon, hasPassive: Utils.BooleanHolder): boolean; +/** + * Apply all challenges that modify the game modes settings. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.GAME_MODE_MODIFY + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.GAME_MODE_MODIFY): boolean; +/** + * Apply all challenges that modify what level a pokemon can access a move. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.MOVE_ACCESS + * @param pokemon {@link Pokemon} What pokemon would learn the move. + * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. + * @param move {@link Moves} The move in question. + * @param level {@link Utils.IntegerHolder} The level threshold for access. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_ACCESS, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean; +/** + * Apply all challenges that modify what weight a pokemon gives to move generation + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.MOVE_WEIGHT + * @param pokemon {@link Pokemon} What pokemon would learn the move. + * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. + * @param move {@link Moves} The move in question. + * @param weight {@link Utils.IntegerHolder} The weight of the move. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_WEIGHT, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, weight: Utils.IntegerHolder): boolean; export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType, ...args: any[]): boolean { let ret = false; - gameMode.challenges.forEach(v => { - if (v.isOfType(challengeType)) { - ret ||= v.apply(challengeType, args); + gameMode.challenges.forEach(c => { + if (c.value !== 0) { + switch (challengeType) { + case ChallengeType.STARTER_CHOICE: + ret ||= c.applyStarterChoice(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.STARTER_POINTS: + ret ||= c.applyStarterPoints(args[0]); + break; + case ChallengeType.STARTER_COST: + ret ||= c.applyStarterCost(args[0], args[1]); + break; + case ChallengeType.STARTER_MODIFY: + ret ||= c.applyStarterModify(args[0]); + break; + case ChallengeType.POKEMON_IN_BATTLE: + ret ||= c.applyPokemonInBattle(args[0], args[1]); + break; + case ChallengeType.FIXED_BATTLES: + ret ||= c.applyFixedBattle(args[0], args[1]); + break; + case ChallengeType.TYPE_EFFECTIVENESS: + ret ||= c.applyTypeEffectiveness(args[0]); + break; + case ChallengeType.AI_LEVEL: + ret ||= c.applyLevelChange(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.AI_MOVE_SLOTS: + ret ||= c.applyMoveSlot(args[0], args[1]); + break; + case ChallengeType.PASSIVE_ACCESS: + ret ||= c.applyPassiveAccess(args[0], args[1]); + break; + case ChallengeType.GAME_MODE_MODIFY: + ret ||= c.applyGameModeModify(gameMode); + break; + case ChallengeType.MOVE_ACCESS: + ret ||= c.applyMoveAccessLevel(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.MOVE_WEIGHT: + ret ||= c.applyMoveWeight(args[0], args[1], args[2], args[3]); + break; + } } }); return ret; } +/** + * + * @param source A challenge to copy, or an object of a challenge's properties. Missing values are treated as defaults. + * @returns The challenge in question. + */ export function copyChallenge(source: Challenge | any): Challenge { switch (source.id) { case Challenges.SINGLE_GENERATION: @@ -661,6 +957,10 @@ export function copyChallenge(source: Challenge | any): Challenge { return LowerStarterMaxCostChallenge.loadChallenge(source); case Challenges.LOWER_STARTER_POINTS: return LowerStarterPointsChallenge.loadChallenge(source); + case Challenges.FRESH_START: + return FreshStartChallenge.loadChallenge(source); + case Challenges.INVERSE_BATTLE: + return InverseBattleChallenge.loadChallenge(source); } throw new Error("Unknown challenge copied"); } @@ -671,8 +971,7 @@ export function initChallenges() { allChallenges.push( new SingleGenerationChallenge(), new SingleTypeChallenge(), - // new LowerStarterMaxCostChallenge(), - // new LowerStarterPointsChallenge(), - // new FreshStartChallenge() + new FreshStartChallenge(), + new InverseBattleChallenge(), ); } diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index 4b741b6f473..370b13ea3a3 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -11,15 +11,15 @@ export interface DailyRunConfig { starters: Starter; } -export function fetchDailyRunSeed(): Promise { - return new Promise((resolve, reject) => { +export function fetchDailyRunSeed(): Promise { + return new Promise((resolve, reject) => { Utils.apiFetch("daily/seed").then(response => { if (!response.ok) { resolve(null); return; } return response.text(); - }).then(seed => resolve(seed)) + }).then(seed => resolve(seed ?? null)) .catch(err => reject(err)); }); } @@ -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])); @@ -49,7 +49,8 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[] const costSpecies = Object.keys(speciesStarters) .map(s => parseInt(s) as Species) .filter(s => speciesStarters[s] === cost); - const starterSpecies = getPokemonSpecies(getPokemonSpecies(Utils.randSeedItem(costSpecies)).getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); + const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); + const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel)); } }, 0, seed); diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index ec3358b1a77..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[], @@ -452,60 +452,410 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { [TrainerType.ROCKET_GRUNT]: [ { encounter: [ - "dialogue:rocket_grunt.encounter.1" + "dialogue:rocket_grunt.encounter.1", + "dialogue:rocket_grunt.encounter.2", + "dialogue:rocket_grunt.encounter.3", + "dialogue:rocket_grunt.encounter.4", + "dialogue:rocket_grunt.encounter.5", ], victory: [ - "dialogue:rocket_grunt.victory.1" + "dialogue:rocket_grunt.victory.1", + "dialogue:rocket_grunt.victory.2", + "dialogue:rocket_grunt.victory.3", + "dialogue:rocket_grunt.victory.4", + "dialogue:rocket_grunt.victory.5", + ] + } + ], + [TrainerType.ARCHER]: [ + { + encounter: [ + "dialogue:archer.encounter.1", + "dialogue:archer.encounter.2", + "dialogue:archer.encounter.3", + ], + victory: [ + "dialogue:archer.victory.1", + "dialogue:archer.victory.2", + "dialogue:archer.victory.3", + ] + } + ], + [TrainerType.ARIANA]: [ + { + encounter: [ + "dialogue:ariana.encounter.1", + "dialogue:ariana.encounter.2", + "dialogue:ariana.encounter.3", + ], + victory: [ + "dialogue:ariana.victory.1", + "dialogue:ariana.victory.2", + "dialogue:ariana.victory.3", + ] + } + ], + [TrainerType.PROTON]: [ + { + encounter: [ + "dialogue:proton.encounter.1", + "dialogue:proton.encounter.2", + "dialogue:proton.encounter.3", + ], + victory: [ + "dialogue:proton.victory.1", + "dialogue:proton.victory.2", + "dialogue:proton.victory.3", + ] + } + ], + [TrainerType.PETREL]: [ + { + encounter: [ + "dialogue:petrel.encounter.1", + "dialogue:petrel.encounter.2", + "dialogue:petrel.encounter.3", + ], + victory: [ + "dialogue:petrel.victory.1", + "dialogue:petrel.victory.2", + "dialogue:petrel.victory.3", ] } ], [TrainerType.MAGMA_GRUNT]: [ { encounter: [ - "dialogue:magma_grunt.encounter.1" + "dialogue:magma_grunt.encounter.1", + "dialogue:magma_grunt.encounter.2", + "dialogue:magma_grunt.encounter.3", + "dialogue:magma_grunt.encounter.4", + "dialogue:magma_grunt.encounter.5", ], victory: [ - "dialogue:magma_grunt.victory.1" + "dialogue:magma_grunt.victory.1", + "dialogue:magma_grunt.victory.2", + "dialogue:magma_grunt.victory.3", + "dialogue:magma_grunt.victory.4", + "dialogue:magma_grunt.victory.5", + ] + } + ], + [TrainerType.TABITHA]: [ + { + encounter: [ + "dialogue:tabitha.encounter.1", + "dialogue:tabitha.encounter.2", + "dialogue:tabitha.encounter.3", + ], + victory: [ + "dialogue:tabitha.victory.1", + "dialogue:tabitha.victory.2", + "dialogue:tabitha.victory.3", + ] + } + ], + [TrainerType.COURTNEY]: [ + { + encounter: [ + "dialogue:courtney.encounter.1", + "dialogue:courtney.encounter.2", + "dialogue:courtney.encounter.3", + ], + victory: [ + "dialogue:courtney.victory.1", + "dialogue:courtney.victory.2", + "dialogue:courtney.victory.3", ] } ], [TrainerType.AQUA_GRUNT]: [ { encounter: [ - "dialogue:aqua_grunt.encounter.1" + "dialogue:aqua_grunt.encounter.1", + "dialogue:aqua_grunt.encounter.2", + "dialogue:aqua_grunt.encounter.3", + "dialogue:aqua_grunt.encounter.4", + "dialogue:aqua_grunt.encounter.5", ], victory: [ - "dialogue:aqua_grunt.victory.1" + "dialogue:aqua_grunt.victory.1", + "dialogue:aqua_grunt.victory.2", + "dialogue:aqua_grunt.victory.3", + "dialogue:aqua_grunt.victory.4", + "dialogue:aqua_grunt.victory.5", + ] + } + ], + [TrainerType.MATT]: [ + { + encounter: [ + "dialogue:matt.encounter.1", + "dialogue:matt.encounter.2", + "dialogue:matt.encounter.3", + ], + victory: [ + "dialogue:matt.victory.1", + "dialogue:matt.victory.2", + "dialogue:matt.victory.3", + ] + } + ], + [TrainerType.SHELLY]: [ + { + encounter: [ + "dialogue:shelly.encounter.1", + "dialogue:shelly.encounter.2", + "dialogue:shelly.encounter.3", + ], + victory: [ + "dialogue:shelly.victory.1", + "dialogue:shelly.victory.2", + "dialogue:shelly.victory.3", ] } ], [TrainerType.GALACTIC_GRUNT]: [ { encounter: [ - "dialogue:galactic_grunt.encounter.1" + "dialogue:galactic_grunt.encounter.1", + "dialogue:galactic_grunt.encounter.2", + "dialogue:galactic_grunt.encounter.3", + "dialogue:galactic_grunt.encounter.4", + "dialogue:galactic_grunt.encounter.5", ], victory: [ - "dialogue:galactic_grunt.victory.1" + "dialogue:galactic_grunt.victory.1", + "dialogue:galactic_grunt.victory.2", + "dialogue:galactic_grunt.victory.3", + "dialogue:galactic_grunt.victory.4", + "dialogue:galactic_grunt.victory.5", + ] + } + ], + [TrainerType.JUPITER]: [ + { + encounter: [ + "dialogue:jupiter.encounter.1", + "dialogue:jupiter.encounter.2", + "dialogue:jupiter.encounter.3", + ], + victory: [ + "dialogue:jupiter.victory.1", + "dialogue:jupiter.victory.2", + "dialogue:jupiter.victory.3", + ] + } + ], + [TrainerType.MARS]: [ + { + encounter: [ + "dialogue:mars.encounter.1", + "dialogue:mars.encounter.2", + "dialogue:mars.encounter.3", + ], + victory: [ + "dialogue:mars.victory.1", + "dialogue:mars.victory.2", + "dialogue:mars.victory.3", + ] + } + ], + [TrainerType.SATURN]: [ + { + encounter: [ + "dialogue:saturn.encounter.1", + "dialogue:saturn.encounter.2", + "dialogue:saturn.encounter.3", + ], + victory: [ + "dialogue:saturn.victory.1", + "dialogue:saturn.victory.2", + "dialogue:saturn.victory.3", ] } ], [TrainerType.PLASMA_GRUNT]: [ { encounter: [ - "dialogue:plasma_grunt.encounter.1" + "dialogue:plasma_grunt.encounter.1", + "dialogue:plasma_grunt.encounter.2", + "dialogue:plasma_grunt.encounter.3", + "dialogue:plasma_grunt.encounter.4", + "dialogue:plasma_grunt.encounter.5", ], victory: [ - "dialogue:plasma_grunt.victory.1" + "dialogue:plasma_grunt.victory.1", + "dialogue:plasma_grunt.victory.2", + "dialogue:plasma_grunt.victory.3", + "dialogue:plasma_grunt.victory.4", + "dialogue:plasma_grunt.victory.5", + ] + } + ], + [TrainerType.ZINZOLIN]: [ + { + encounter: [ + "dialogue:zinzolin.encounter.1", + "dialogue:zinzolin.encounter.2", + "dialogue:zinzolin.encounter.3", + ], + victory: [ + "dialogue:zinzolin.victory.1", + "dialogue:zinzolin.victory.2", + "dialogue:zinzolin.victory.3", + ] + } + ], + [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: [ - "dialogue:flare_grunt.encounter.1" + "dialogue:flare_grunt.encounter.1", + "dialogue:flare_grunt.encounter.2", + "dialogue:flare_grunt.encounter.3", + "dialogue:flare_grunt.encounter.4", + "dialogue:flare_grunt.encounter.5", ], victory: [ - "dialogue:flare_grunt.victory.1" + "dialogue:flare_grunt.victory.1", + "dialogue:flare_grunt.victory.2", + "dialogue:flare_grunt.victory.3", + "dialogue:flare_grunt.victory.4", + "dialogue:flare_grunt.victory.5", + ] + } + ], + [TrainerType.BRYONY]: [ + { + encounter: [ + "dialogue:bryony.encounter.1", + "dialogue:bryony.encounter.2", + "dialogue:bryony.encounter.3", + ], + victory: [ + "dialogue:bryony.victory.1", + "dialogue:bryony.victory.2", + "dialogue:bryony.victory.3", + ] + } + ], + [TrainerType.XEROSIC]: [ + { + encounter: [ + "dialogue:xerosic.encounter.1", + "dialogue:xerosic.encounter.2", + "dialogue:xerosic.encounter.3", + ], + victory: [ + "dialogue:xerosic.victory.1", + "dialogue:xerosic.victory.2", + "dialogue:xerosic.victory.3", + ] + } + ], + [TrainerType.AETHER_GRUNT]: [ + { + encounter: [ + "dialogue:aether_grunt.encounter.1", + "dialogue:aether_grunt.encounter.2", + "dialogue:aether_grunt.encounter.3", + "dialogue:aether_grunt.encounter.4", + "dialogue:aether_grunt.encounter.5", + ], + victory: [ + "dialogue:aether_grunt.victory.1", + "dialogue:aether_grunt.victory.2", + "dialogue:aether_grunt.victory.3", + "dialogue:aether_grunt.victory.4", + "dialogue:aether_grunt.victory.5", + ] + } + ], + [TrainerType.FABA]: [ + { + encounter: [ + "dialogue:faba.encounter.1", + "dialogue:faba.encounter.2", + "dialogue:faba.encounter.3", + ], + victory: [ + "dialogue:faba.victory.1", + "dialogue:faba.victory.2", + "dialogue:faba.victory.3", + ] + } + ], + [TrainerType.SKULL_GRUNT]: [ + { + encounter: [ + "dialogue:skull_grunt.encounter.1", + "dialogue:skull_grunt.encounter.2", + "dialogue:skull_grunt.encounter.3", + "dialogue:skull_grunt.encounter.4", + "dialogue:skull_grunt.encounter.5", + ], + victory: [ + "dialogue:skull_grunt.victory.1", + "dialogue:skull_grunt.victory.2", + "dialogue:skull_grunt.victory.3", + "dialogue:skull_grunt.victory.4", + "dialogue:skull_grunt.victory.5", + ] + } + ], + [TrainerType.PLUMERIA]: [ + { + encounter: [ + "dialogue:plumeria.encounter.1", + "dialogue:plumeria.encounter.2", + "dialogue:plumeria.encounter.3", + ], + victory: [ + "dialogue:plumeria.victory.1", + "dialogue:plumeria.victory.2", + "dialogue:plumeria.victory.3", + ] + } + ], + [TrainerType.MACRO_GRUNT]: [ + { + encounter: [ + "dialogue:macro_grunt.encounter.1", + "dialogue:macro_grunt.encounter.2", + "dialogue:macro_grunt.encounter.3", + ], + victory: [ + "dialogue:macro_grunt.victory.1", + "dialogue:macro_grunt.victory.2", + "dialogue:macro_grunt.victory.3", + ] + } + ], + [TrainerType.OLEANA]: [ + { + encounter: [ + "dialogue:oleana.encounter.1", + "dialogue:oleana.encounter.2", + "dialogue:oleana.encounter.3", + ], + victory: [ + "dialogue:oleana.victory.1", + "dialogue:oleana.victory.2", + "dialogue:oleana.victory.3", ] } ], @@ -665,6 +1015,84 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.LUSAMINE]: [ + { + encounter: [ + "dialogue:aether_boss_lusamine_1.encounter.1" + ], + victory: [ + "dialogue:aether_boss_lusamine_1.victory.1" + ], + defeat: [ + "dialogue:aether_boss_lusamine_1.defeat.1" + ] + } + ], + [TrainerType.LUSAMINE_2]: [ + { + encounter: [ + "dialogue:aether_boss_lusamine_2.encounter.1" + ], + victory: [ + "dialogue:aether_boss_lusamine_2.victory.1" + ], + defeat: [ + "dialogue:aether_boss_lusamine_2.defeat.1" + ] + } + ], + [TrainerType.GUZMA]: [ + { + encounter: [ + "dialogue:skull_boss_guzma_1.encounter.1" + ], + victory: [ + "dialogue:skull_boss_guzma_1.victory.1" + ], + defeat: [ + "dialogue:skull_boss_guzma_1.defeat.1" + ] + } + ], + [TrainerType.GUZMA_2]: [ + { + encounter: [ + "dialogue:skull_boss_guzma_2.encounter.1" + ], + victory: [ + "dialogue:skull_boss_guzma_2.victory.1" + ], + defeat: [ + "dialogue:skull_boss_guzma_2.defeat.1" + ] + } + ], + [TrainerType.ROSE]: [ + { + encounter: [ + "dialogue:macro_boss_rose_1.encounter.1" + ], + victory: [ + "dialogue:macro_boss_rose_1.victory.1" + ], + defeat: [ + "dialogue:macro_boss_rose_1.defeat.1" + ] + } + ], + [TrainerType.ROSE_2]: [ + { + encounter: [ + "dialogue:macro_boss_rose_2.encounter.1" + ], + victory: [ + "dialogue:macro_boss_rose_2.victory.1" + ], + defeat: [ + "dialogue:macro_boss_rose_2.defeat.1" + ] + } + ], [TrainerType.BROCK]: { encounter: [ "dialogue:brock.encounter.1", 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 64e75113dbc..b516238c46e 100644 --- a/src/data/egg-moves.ts +++ b/src/data/egg-moves.ts @@ -5,30 +5,30 @@ import { Species } from "#enums/species"; export const speciesEggMoves = { - [Species.BULBASAUR]: [ Moves.GIGA_DRAIN, Moves.SLUDGE_BOMB, Moves.EARTH_POWER, Moves.SAPPY_SEED ], + [Species.BULBASAUR]: [ Moves.SAPPY_SEED, Moves.SLUDGE_WAVE, Moves.EARTH_POWER, Moves.MATCHA_GOTCHA ], [Species.CHARMANDER]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.EARTH_POWER, Moves.OBLIVION_WING ], - [Species.SQUIRTLE]: [ Moves.ICE_BEAM, Moves.DARK_PULSE, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ], + [Species.SQUIRTLE]: [ Moves.FREEZE_DRY, Moves.SHORE_UP, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ], [Species.CATERPIE]: [ Moves.SANDSEAR_STORM, Moves.SILK_TRAP, Moves.TWIN_BEAM, Moves.BLEAKWIND_STORM ], [Species.WEEDLE]: [ Moves.THOUSAND_ARROWS, Moves.SWORDS_DANCE, Moves.ATTACK_ORDER, Moves.NOXIOUS_TORQUE ], - [Species.PIDGEY]: [ Moves.HEAT_WAVE, Moves.FOCUS_BLAST, Moves.U_TURN, Moves.WILDBOLT_STORM ], + [Species.PIDGEY]: [ Moves.WILDBOLT_STORM, Moves.SANDSEAR_STORM, Moves.CALM_MIND, Moves.BOOMBURST ], [Species.RATTATA]: [ Moves.HYPER_FANG, Moves.PSYCHIC_FANGS, Moves.FIRE_FANG, Moves.EXTREME_SPEED ], [Species.SPEAROW]: [ Moves.FLOATY_FALL, Moves.EXTREME_SPEED, Moves.TIDY_UP, Moves.TRIPLE_ARROWS ], [Species.EKANS]: [ Moves.NOXIOUS_TORQUE, Moves.DRAGON_DANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ], - [Species.SANDSHREW]: [ Moves.HIGH_HORSEPOWER, Moves.CEASELESS_EDGE, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ], + [Species.SANDSHREW]: [ Moves.HIGH_HORSEPOWER, Moves.DIRE_CLAW, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ], [Species.NIDORAN_F]: [ Moves.NO_RETREAT, Moves.BANEFUL_BUNKER, Moves.SANDSEAR_STORM, Moves.MALIGNANT_CHAIN ], [Species.NIDORAN_M]: [ Moves.NOXIOUS_TORQUE, Moves.KINGS_SHIELD, Moves.NO_RETREAT, Moves.PRECIPICE_BLADES ], - [Species.VULPIX]: [ Moves.MOONBLAST, Moves.ICE_BEAM, Moves.MORNING_SUN, Moves.TAIL_GLOW ], - [Species.ZUBAT]: [ Moves.FLOATY_FALL, Moves.DIRE_CLAW, Moves.SWORDS_DANCE, Moves.WICKED_BLOW ], - [Species.ODDISH]: [ Moves.SLUDGE_BOMB, Moves.FIERY_DANCE, Moves.BOUNCY_BUBBLE, Moves.SPORE ], + [Species.VULPIX]: [ Moves.MOONBLAST, Moves.INFERNAL_PARADE, Moves.MORNING_SUN, Moves.TAIL_GLOW ], + [Species.ZUBAT]: [ Moves.FLOATY_FALL, Moves.DIRE_CLAW, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ], + [Species.ODDISH]: [ Moves.SLUDGE_BOMB, Moves.FIERY_DANCE, Moves.STRENGTH_SAP, Moves.SPORE ], [Species.PARAS]: [ Moves.LEECH_LIFE, Moves.HORN_LEECH, Moves.CRABHAMMER, Moves.SAPPY_SEED ], [Species.VENONAT]: [ Moves.SLUDGE_BOMB, Moves.MOONLIGHT, Moves.EARTH_POWER, Moves.MYSTICAL_POWER ], - [Species.DIGLETT]: [ Moves.REVERSAL, Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.HEADLONG_RUSH ], + [Species.DIGLETT]: [ Moves.TRIPLE_DIVE, Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.HEADLONG_RUSH ], [Species.MEOWTH]: [ Moves.COVET, Moves.SWORDS_DANCE, Moves.DOUBLE_KICK, Moves.TAIL_SLAP ], [Species.PSYDUCK]: [ Moves.SPLISHY_SPLASH, Moves.AQUA_STEP, Moves.AURA_SPHERE, Moves.MYSTICAL_POWER ], [Species.MANKEY]: [ Moves.DRAIN_PUNCH, Moves.PLAY_ROUGH, Moves.METEOR_MASH, Moves.NO_RETREAT ], [Species.GROWLITHE]: [ Moves.ZING_ZAP, Moves.PARTING_SHOT, Moves.MORNING_SUN, Moves.SACRED_FIRE ], [Species.POLIWAG]: [ Moves.SLACK_OFF, Moves.WILDBOLT_STORM, Moves.DRAIN_PUNCH, Moves.SURGING_STRIKES ], - [Species.ABRA]: [ Moves.MOONBLAST, Moves.FLAMETHROWER, Moves.THUNDERBOLT, Moves.PSYSTRIKE ], + [Species.ABRA]: [ Moves.AURA_SPHERE, Moves.BADDY_BAD, Moves.THUNDERBOLT, Moves.PSYSTRIKE ], [Species.MACHOP]: [ Moves.COMBAT_TORQUE, Moves.METEOR_MASH, Moves.MOUNTAIN_GALE, Moves.FISSURE ], [Species.BELLSPROUT]: [ Moves.SOLAR_BLADE, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], [Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.STRENGTH_SAP, Moves.BOUNCY_BUBBLE, Moves.MALIGNANT_CHAIN ], @@ -36,58 +36,58 @@ export const speciesEggMoves = { [Species.PONYTA]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.SWORDS_DANCE, Moves.VOLT_TACKLE ], [Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FLAMETHROWER, Moves.MYSTICAL_POWER, Moves.SHED_TAIL ], [Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.BODY_PRESS, Moves.ICE_BEAM, Moves.THUNDERCLAP ], - [Species.FARFETCHD]: [ Moves.BATON_PASS, Moves.SACRED_SWORD, Moves.ROOST, Moves.VICTORY_DANCE ], + [Species.FARFETCHD]: [ Moves.IVY_CUDGEL, Moves.TRIPLE_ARROWS, Moves.ROOST, Moves.VICTORY_DANCE ], [Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.MULTI_ATTACK, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], [Species.SEEL]: [ Moves.FREEZE_DRY, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], [Species.GRIMER]: [ Moves.SUCKER_PUNCH, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ], [Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ], [Species.GASTLY]: [ Moves.SLUDGE_BOMB, Moves.AURA_SPHERE, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE ], [Species.ONIX]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.HEAVY_SLAM, Moves.DIAMOND_STORM ], - [Species.DROWZEE]: [ Moves.DREAM_EATER, Moves.RECOVER, Moves.LUMINA_CRASH, Moves.DARK_VOID ], - [Species.KRABBY]: [ Moves.ICICLE_CRASH, Moves.LIQUIDATION, Moves.IVY_CUDGEL, Moves.SHELL_SMASH ], - [Species.VOLTORB]: [ Moves.RISING_VOLTAGE, Moves.OVERHEAT, Moves.ICE_BEAM, Moves.NASTY_PLOT ], - [Species.EXEGGCUTE]: [ Moves.MYSTICAL_POWER, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.FICKLE_BEAM ], + [Species.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 ], [Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.SHADOW_SNEAK, Moves.BITTER_BLADE ], [Species.LICKITUNG]: [ Moves.BODY_SLAM, Moves.FIRE_LASH, Moves.GRAV_APPLE, Moves.MILK_DRINK ], - [Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.MOONBLAST, Moves.MALIGNANT_CHAIN ], + [Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.BODY_PRESS, Moves.MALIGNANT_CHAIN ], [Species.RHYHORN]: [ Moves.SHORE_UP, Moves.ICE_HAMMER, Moves.ACCELEROCK, Moves.HEAD_SMASH ], - [Species.TANGELA]: [ Moves.STRENGTH_SAP, Moves.INFESTATION, Moves.PARTING_SHOT, Moves.SAPPY_SEED ], + [Species.TANGELA]: [ Moves.STRENGTH_SAP, Moves.SNAP_TRAP, Moves.PARTING_SHOT, Moves.SAPPY_SEED ], [Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.TRAILBLAZE, Moves.FACADE, Moves.SEISMIC_TOSS ], - [Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.HURRICANE, Moves.DRAGON_ENERGY ], + [Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.HURRICANE, Moves.SPACIAL_REND ], [Species.GOLDEEN]: [ Moves.DRILL_RUN, Moves.FLIP_TURN, Moves.DRAGON_DANCE, Moves.FISHIOUS_REND ], [Species.STARYU]: [ Moves.CALM_MIND, Moves.BOUNCY_BUBBLE, Moves.MOONBLAST, Moves.MYSTICAL_POWER ], [Species.SCYTHER]: [ Moves.MIGHTY_CLEAVE, Moves.BUG_BITE, Moves.STORM_THROW, Moves.DOUBLE_IRON_BASH ], [Species.PINSIR]: [ Moves.EARTHQUAKE, Moves.LEECH_LIFE, Moves.CLOSE_COMBAT, Moves.EXTREME_SPEED ], [Species.TAUROS]: [ Moves.HIGH_HORSEPOWER, Moves.BLAZING_TORQUE, Moves.LIQUIDATION, Moves.COMBAT_TORQUE ], - [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.POWER_TRIP, Moves.DRAGON_ASCENT ], + [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.DRAGON_ASCENT, Moves.SURGING_STRIKES ], [Species.LAPRAS]: [ Moves.RECOVER, Moves.FREEZE_DRY, Moves.SHELL_SMASH, Moves.STEAM_ERUPTION ], - [Species.DITTO]: [ Moves.MIMIC, Moves.COPYCAT, Moves.ME_FIRST, Moves.METRONOME ], - [Species.EEVEE]: [ Moves.WISH, Moves.REVELATION_DANCE, Moves.ZIPPY_ZAP, Moves.NO_RETREAT ], + [Species.DITTO]: [ Moves.MIMIC, Moves.SKETCH, Moves.METRONOME, Moves.IMPRISON ], + [Species.EEVEE]: [ Moves.WISH, Moves.NO_RETREAT, Moves.ZIPPY_ZAP, Moves.BOOMBURST ], [Species.PORYGON]: [ Moves.THUNDERCLAP, Moves.AURA_SPHERE, Moves.FLAMETHROWER, Moves.TECHNO_BLAST ], [Species.OMANYTE]: [ Moves.FREEZE_DRY, Moves.EARTH_POWER, Moves.POWER_GEM, Moves.STEAM_ERUPTION ], - [Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.HIGH_HORSEPOWER, Moves.RAZOR_SHELL, Moves.MIGHTY_CLEAVE ], - [Species.AERODACTYL]: [ Moves.FLOATY_FALL, Moves.HEAD_SMASH, Moves.SWORDS_DANCE, Moves.MIGHTY_CLEAVE ], - [Species.ARTICUNO]: [ Moves.AURA_SPHERE, Moves.CALM_MIND, Moves.AURORA_VEIL, Moves.AEROBLAST ], + [Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.HIGH_HORSEPOWER, Moves.TRIPLE_DIVE, Moves.MIGHTY_CLEAVE ], + [Species.AERODACTYL]: [ Moves.FLOATY_FALL, Moves.FLARE_BLITZ, Moves.SWORDS_DANCE, Moves.MIGHTY_CLEAVE ], + [Species.ARTICUNO]: [ Moves.EARTH_POWER, Moves.CALM_MIND, Moves.AURORA_VEIL, Moves.AEROBLAST ], [Species.ZAPDOS]: [ Moves.WEATHER_BALL, Moves.CALM_MIND, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ], [Species.MOLTRES]: [ Moves.SCORCHING_SANDS, Moves.CALM_MIND, Moves.AEROBLAST, Moves.TORCH_SONG ], - [Species.DRATINI]: [ Moves.DRAGON_HAMMER, Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.MULTI_ATTACK ], - [Species.MEWTWO]: [ Moves.METEOR_MASH, Moves.MOONBLAST, Moves.PLASMA_FISTS, Moves.PHOTON_GEYSER ], + [Species.DRATINI]: [ Moves.DRAGON_HAMMER, Moves.CRUSH_GRIP, Moves.FIRE_LASH, Moves.GIGATON_HAMMER ], + [Species.MEWTWO]: [ Moves.METEOR_MASH, Moves.MOONBLAST, Moves.THUNDEROUS_KICK, Moves.PHOTON_GEYSER ], [Species.MEW]: [ Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE, Moves.SHELL_SMASH ], - [Species.CHIKORITA]: [ Moves.SPORE, Moves.STONE_AXE, Moves.DRAGON_DANCE, Moves.SAPPY_SEED ], + [Species.CHIKORITA]: [ Moves.SAPPY_SEED, Moves.STONE_AXE, Moves.DRAGON_DANCE, Moves.SPORE ], [Species.CYNDAQUIL]: [ Moves.NASTY_PLOT, Moves.SCORCHING_SANDS, Moves.FIERY_DANCE, Moves.ELECTRO_DRIFT ], [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.FISHIOUS_REND ], [Species.SENTRET]: [ Moves.TIDY_UP, Moves.THIEF, Moves.NUZZLE, Moves.EXTREME_SPEED ], - [Species.HOOTHOOT]: [ Moves.CALM_MIND, Moves.ESPER_WING, Moves.BOOMBURST, Moves.OBLIVION_WING ], + [Species.HOOTHOOT]: [ Moves.CALM_MIND, Moves.ESPER_WING, Moves.AEROBLAST, Moves.BOOMBURST ], [Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.THIEF, Moves.PARTING_SHOT, Moves.SPORE ], [Species.SPINARAK]: [ Moves.PARTING_SHOT, Moves.ATTACK_ORDER, Moves.GASTRO_ACID, Moves.STRENGTH_SAP ], - [Species.CHINCHOU]: [ Moves.THUNDERCLAP, Moves.BOUNCY_BUBBLE, Moves.VOLT_SWITCH, Moves.TAIL_GLOW ], + [Species.CHINCHOU]: [ Moves.THUNDERCLAP, Moves.BOUNCY_BUBBLE, Moves.THUNDER_CAGE, Moves.TAIL_GLOW ], [Species.PICHU]: [ Moves.RISING_VOLTAGE, Moves.SPLISHY_SPLASH, Moves.FLOATY_FALL, Moves.THUNDERCLAP ], - [Species.CLEFFA]: [ Moves.TAKE_HEART, Moves.POWER_GEM, Moves.WISH, Moves.LIGHT_OF_RUIN ], + [Species.CLEFFA]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.WISH, Moves.LIGHT_OF_RUIN ], [Species.IGGLYBUFF]: [ Moves.DRAIN_PUNCH, Moves.GRAV_APPLE, Moves.SOFT_BOILED, Moves.EXTREME_SPEED ], - [Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.ROOST, Moves.MOONBLAST, Moves.FIERY_DANCE ], + [Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.ROOST, Moves.RELIC_SONG, Moves.FIERY_DANCE ], [Species.NATU]: [ Moves.AEROBLAST, Moves.ROOST, Moves.CALM_MIND, Moves.LUMINA_CRASH ], [Species.MAREEP]: [ Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE, Moves.CORE_ENFORCER, Moves.TAIL_GLOW ], - [Species.HOPPIP]: [ Moves.FLOATY_FALL, Moves.STRENGTH_SAP, Moves.SPORE, Moves.SAPPY_SEED ], + [Species.HOPPIP]: [ Moves.FLOATY_FALL, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SPORE ], [Species.AIPOM]: [ Moves.TIDY_UP, Moves.STORM_THROW, Moves.FAKE_OUT, Moves.POPULATION_BOMB ], [Species.SUNKERN]: [ Moves.SPORE, Moves.SAPPY_SEED, Moves.FIERY_DANCE, Moves.HYDRO_STEAM ], [Species.YANMA]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.HEAT_WAVE, Moves.BLEAKWIND_STORM ], @@ -103,33 +103,33 @@ export const speciesEggMoves = { [Species.QWILFISH]: [ Moves.BARB_BARRAGE, Moves.BANEFUL_BUNKER, Moves.KNOCK_OFF, Moves.FISHIOUS_REND ], [Species.SHUCKLE]: [ Moves.STUFF_CHEEKS, Moves.HEAL_ORDER, Moves.BODY_PRESS, Moves.SALT_CURE ], [Species.HERACROSS]: [ Moves.ROCK_BLAST, Moves.FIRST_IMPRESSION, Moves.ICICLE_SPEAR, Moves.DRAGON_DANCE ], - [Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.SUCKER_PUNCH, Moves.TRIPLE_AXEL, Moves.WICKED_BLOW ], - [Species.TEDDIURSA]: [ Moves.DIRE_CLAW, Moves.FACADE, Moves.BULK_UP, Moves.SLACK_OFF ], + [Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.STORM_THROW, Moves.TRIPLE_AXEL, Moves.WICKED_BLOW ], + [Species.TEDDIURSA]: [ Moves.MOUNTAIN_GALE, Moves.RAGING_BULL, Moves.SLACK_OFF, Moves.PRECIPICE_BLADES ], [Species.SLUGMA]: [ Moves.BURNING_BULWARK, Moves.POWER_GEM, Moves.SOLAR_BEAM, Moves.MAGMA_STORM ], - [Species.SWINUB]: [ Moves.ICE_SPINNER, Moves.HEADLONG_RUSH, Moves.MIGHTY_CLEAVE, Moves.GLACIAL_LANCE ], + [Species.SWINUB]: [ Moves.SLACK_OFF, Moves.LANDS_WRATH, Moves.MIGHTY_CLEAVE, Moves.GLACIAL_LANCE ], [Species.CORSOLA]: [ Moves.SCALD, Moves.FREEZE_DRY, Moves.STRENGTH_SAP, Moves.SALT_CURE ], - [Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.SNIPE_SHOT, Moves.SEARING_SHOT, Moves.ELECTRO_SHOT ], - [Species.DELIBIRD]: [ Moves.DRILL_RUN, Moves.FLOATY_FALL, Moves.NO_RETREAT, Moves.GLACIAL_LANCE ], + [Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.TAKE_HEART, Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE ], + [Species.DELIBIRD]: [ Moves.DRILL_RUN, Moves.FLOATY_FALL, Moves.VICTORY_DANCE, Moves.GLACIAL_LANCE ], [Species.SKARMORY]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.BEAK_BLAST ], [Species.HOUNDOUR]: [ Moves.HEAT_WAVE, Moves.FIERY_WRATH, Moves.SOLAR_BEAM, Moves.HYDRO_STEAM ], [Species.PHANPY]: [ Moves.SHORE_UP, Moves.SWORDS_DANCE, Moves.ICICLE_CRASH, Moves.COLLISION_COURSE ], [Species.STANTLER]: [ Moves.THUNDEROUS_KICK, Moves.HYPER_VOICE, Moves.BULK_UP, Moves.PHOTON_GEYSER ], [Species.SMEARGLE]: [ Moves.CONVERSION, Moves.BURNING_BULWARK, Moves.SALT_CURE, Moves.DARK_VOID ], - [Species.TYROGUE]: [ Moves.VICTORY_DANCE, Moves.WICKED_TORQUE, Moves.METEOR_MASH, Moves.COLLISION_COURSE ], - [Species.SMOOCHUM]: [ Moves.EXPANDING_FORCE, Moves.AURA_SPHERE, Moves.FREEZY_FROST, Moves.QUIVER_DANCE ], + [Species.TYROGUE]: [ Moves.VICTORY_DANCE, Moves.THUNDEROUS_KICK, Moves.METEOR_MASH, Moves.WICKED_BLOW ], + [Species.SMOOCHUM]: [ Moves.EXPANDING_FORCE, Moves.AURA_SPHERE, Moves.FREEZE_DRY, Moves.QUIVER_DANCE ], [Species.ELEKID]: [ Moves.BLAZING_TORQUE, Moves.TIDY_UP, Moves.MOUNTAIN_GALE, Moves.ZIPPY_ZAP ], [Species.MAGBY]: [ Moves.THUNDERCLAP, Moves.EARTH_POWER, Moves.ARMOR_CANNON, Moves.FLEUR_CANNON ], [Species.MILTANK]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.YAWN, Moves.SIZZLY_SLIDE ], - [Species.RAIKOU]: [ Moves.THUNDERCLAP, Moves.NASTY_PLOT, Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE ], + [Species.RAIKOU]: [ Moves.PARABOLIC_CHARGE, Moves.NASTY_PLOT, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ], [Species.ENTEI]: [ Moves.BURNING_BULWARK, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.MIGHTY_CLEAVE ], [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.TAKE_HEART, Moves.STORED_POWER, Moves.SCALD, Moves.OBLIVION_WING ], - [Species.HO_OH]: [ Moves.SWORDS_DANCE, Moves.EARTHQUAKE, Moves.BRAVE_BIRD, Moves.REVIVAL_BLESSING ], - [Species.CELEBI]: [ Moves.MYSTICAL_POWER, Moves.STORED_POWER, Moves.COSMIC_POWER, Moves.SEED_FLARE ], - [Species.TREECKO]: [ Moves.NASTY_PLOT, Moves.DRAGON_ENERGY, Moves.SECRET_SWORD, Moves.SEED_FLARE ], + [Species.LUGIA]: [ Moves.NASTY_PLOT, Moves.LUMINA_CRASH, Moves.AURA_SPHERE, Moves.OBLIVION_WING ], + [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 ], - [Species.MUDKIP]: [ Moves.SHORE_UP, Moves.ICICLE_CRASH, Moves.BULK_UP, Moves.SURGING_STRIKES ], + [Species.MUDKIP]: [ Moves.SHORE_UP, Moves.MOUNTAIN_GALE, Moves.BULK_UP, Moves.SURGING_STRIKES ], [Species.POOCHYENA]: [ Moves.JAW_LOCK, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.NO_RETREAT ], [Species.ZIGZAGOON]: [ Moves.EXTREME_SPEED, Moves.NUZZLE, Moves.HIGH_HORSEPOWER, Moves.TIDY_UP ], [Species.WURMPLE]: [ Moves.BATON_PASS, Moves.BLEAKWIND_STORM, Moves.STORED_POWER, Moves.MALIGNANT_CHAIN ], @@ -142,13 +142,13 @@ export const speciesEggMoves = { [Species.SHROOMISH]: [ Moves.ACCELEROCK, Moves.TRAILBLAZE, Moves.STORM_THROW, Moves.SAPPY_SEED ], [Species.SLAKOTH]: [ Moves.FACADE, Moves.DRAIN_PUNCH, Moves.KNOCK_OFF, Moves.SKILL_SWAP ], [Species.NINCADA]: [ Moves.ATTACK_ORDER, Moves.STICKY_WEB, Moves.SPIRIT_SHACKLE, Moves.SHELL_SMASH ], - [Species.WHISMUR]: [ Moves.ALLURING_VOICE, Moves.TRICK_ROOM, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ], - [Species.MAKUHITA]: [ Moves.STORM_THROW, Moves.SLACK_OFF, Moves.HEAT_CRASH, Moves.DOUBLE_IRON_BASH ], + [Species.WHISMUR]: [ Moves.ALLURING_VOICE, Moves.SHIFT_GEAR, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ], + [Species.MAKUHITA]: [ Moves.COMBAT_TORQUE, Moves.SLACK_OFF, Moves.HEAT_CRASH, Moves.DOUBLE_IRON_BASH ], [Species.AZURILL]: [ Moves.JET_PUNCH, Moves.MAGICAL_TORQUE, Moves.SWORDS_DANCE, Moves.SURGING_STRIKES ], [Species.NOSEPASS]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.CALM_MIND, Moves.TACHYON_CUTTER ], [Species.SKITTY]: [ Moves.THUNDEROUS_KICK, Moves.ENTRAINMENT, Moves.TIDY_UP, Moves.V_CREATE ], [Species.SABLEYE]: [ Moves.RECOVER, Moves.TOPSY_TURVY, Moves.CURSE, Moves.SALT_CURE ], - [Species.MAWILE]: [ Moves.BULLET_PUNCH, Moves.MAGICAL_TORQUE, Moves.EARTHQUAKE, Moves.DOUBLE_IRON_BASH ], + [Species.MAWILE]: [ Moves.BULLET_PUNCH, Moves.MAGICAL_TORQUE, Moves.EARTHQUAKE, Moves.SHIFT_GEAR ], [Species.ARON]: [ Moves.HEAD_SMASH, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SALT_CURE ], [Species.MEDITITE]: [ Moves.THUNDEROUS_KICK, Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.PHOTON_GEYSER ], [Species.ELECTRIKE]: [ Moves.RISING_VOLTAGE, Moves.FLAMETHROWER, Moves.NASTY_PLOT, Moves.ICE_BEAM ], @@ -156,7 +156,7 @@ export const speciesEggMoves = { [Species.MINUN]: [ Moves.ICE_BEAM, Moves.BADDY_BAD, Moves.SPARKLY_SWIRL, Moves.TAIL_GLOW ], [Species.VOLBEAT]: [ Moves.BATON_PASS, Moves.LUNGE, Moves.DECORATE, Moves.VICTORY_DANCE ], [Species.ILLUMISE]: [ Moves.PARTING_SHOT, Moves.GLITZY_GLOW, Moves.POWDER, Moves.QUIVER_DANCE ], - [Species.GULPIN]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.GROWTH, Moves.MALIGNANT_CHAIN ], + [Species.GULPIN]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.MALIGNANT_CHAIN ], [Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.SWORDS_DANCE, Moves.OBSTRUCT, Moves.SURGING_STRIKES ], [Species.WAILMER]: [ Moves.TAKE_HEART, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.COMEUPPANCE ], [Species.NUMEL]: [ Moves.TRICK_ROOM, Moves.ENERGY_BALL, Moves.MORNING_SUN, Moves.BLUE_FLARE ], @@ -183,22 +183,22 @@ export const speciesEggMoves = { [Species.TROPIUS]: [ Moves.STUFF_CHEEKS, Moves.EARTH_POWER, Moves.APPLE_ACID, Moves.SAPPY_SEED ], [Species.ABSOL]: [ Moves.KOWTOW_CLEAVE, Moves.SACRED_SWORD, Moves.PSYBLADE, Moves.BITTER_BLADE ], [Species.WYNAUT]: [ Moves.RECOVER, Moves.SHED_TAIL, Moves.TAUNT, Moves.COMEUPPANCE ], - [Species.SNORUNT]: [ Moves.AURORA_VEIL, Moves.HYPER_VOICE, Moves.EARTH_POWER, Moves.NO_RETREAT ], + [Species.SNORUNT]: [ Moves.FREEZY_FROST, Moves.EXTREME_SPEED, Moves.EARTH_POWER, Moves.NO_RETREAT ], [Species.SPHEAL]: [ Moves.FLIP_TURN, Moves.FREEZE_DRY, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], - [Species.CLAMPERL]: [ Moves.ICE_SPINNER, Moves.LIQUIDATION, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], - [Species.RELICANTH]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.FISHIOUS_REND ], + [Species.CLAMPERL]: [ Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], + [Species.RELICANTH]: [ Moves.DRAGON_DANCE, Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.DIAMOND_STORM ], [Species.LUVDISC]: [ Moves.BATON_PASS, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ], [Species.BAGON]: [ Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH ], [Species.BELDUM]: [ Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.TRIPLE_AXEL, Moves.SHIFT_GEAR ], - [Species.REGIROCK]: [ Moves.STONE_AXE, Moves.BODY_PRESS, Moves.RECOVER, Moves.SALT_CURE ], + [Species.REGIROCK]: [ Moves.STONE_AXE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SALT_CURE ], [Species.REGICE]: [ Moves.EARTH_POWER, Moves.TAKE_HEART, Moves.RECOVER, Moves.FREEZE_DRY ], - [Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.THOUSAND_WAVES, Moves.RECOVER, Moves.GIGATON_HAMMER ], - [Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY, Moves.QUIVER_DANCE ], - [Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY, Moves.QUIVER_DANCE ], - [Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.THUNDER, Moves.TAIL_GLOW ], + [Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.GIGATON_HAMMER ], + [Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.FUSION_FLARE, Moves.SPARKLY_SWIRL, Moves.MYSTICAL_POWER ], + [Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.BLUE_FLARE, Moves.NASTY_PLOT, Moves.TACHYON_CUTTER ], + [Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.FREEZE_DRY, Moves.ELECTRO_SHOT ], [Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ], - [Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.DRAGON_ENERGY, Moves.OBLIVION_WING ], - [Species.JIRACHI]: [ Moves.IRON_HEAD, Moves.FLOATY_FALL, Moves.ROCK_SLIDE, Moves.SHIFT_GEAR ], + [Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.OBLIVION_WING ], + [Species.JIRACHI]: [ Moves.TACHYON_CUTTER, Moves.TRIPLE_ARROWS, Moves.ROCK_SLIDE, Moves.SHELL_SMASH ], [Species.DEOXYS]: [ Moves.COLLISION_COURSE, Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.LUMINA_CRASH ], [Species.TURTWIG]: [ Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE, Moves.ICE_SPINNER, Moves.SAPPY_SEED ], [Species.CHIMCHAR]: [ Moves.FIERY_DANCE, Moves.SECRET_SWORD, Moves.TRIPLE_AXEL, Moves.SACRED_FIRE ], @@ -207,58 +207,58 @@ export const speciesEggMoves = { [Species.BIDOOF]: [ Moves.EXTREME_SPEED, Moves.COSMIC_POWER, Moves.POWER_TRIP, Moves.AQUA_STEP ], [Species.KRICKETOT]: [ Moves.BONEMERANG, Moves.VICTORY_DANCE, Moves.STONE_AXE, Moves.POPULATION_BOMB ], [Species.SHINX]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.FACADE, Moves.BOLT_STRIKE ], - [Species.BUDEW]: [ Moves.FIERY_DANCE, Moves.SLUDGE_WAVE, Moves.SPORE, Moves.QUIVER_DANCE ], - [Species.CRANIDOS]: [ Moves.DRAGON_DANCE, Moves.ACCELEROCK, Moves.HEADLONG_RUSH, Moves.VOLT_TACKLE ], + [Species.BUDEW]: [ Moves.FIERY_DANCE, Moves.ACID_SPRAY, Moves.BOUNCY_BUBBLE, Moves.QUIVER_DANCE ], + [Species.CRANIDOS]: [ Moves.VOLT_TACKLE, Moves.ACCELEROCK, Moves.FLARE_BLITZ, Moves.SHIFT_GEAR ], [Species.SHIELDON]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.DIAMOND_STORM ], - [Species.BURMY]: [ Moves.BODY_PRESS, Moves.DEFEND_ORDER, Moves.HEAL_ORDER, Moves.SAPPY_SEED ], + [Species.BURMY]: [ Moves.FIERY_DANCE, Moves.DEFEND_ORDER, Moves.HEAL_ORDER, Moves.SAPPY_SEED ], [Species.COMBEE]: [ Moves.SPORE, Moves.FLOATY_FALL, Moves.KINGS_SHIELD, Moves.VICTORY_DANCE ], - [Species.PACHIRISU]: [ Moves.BADDY_BAD, Moves.SIZZLY_SLIDE, Moves.U_TURN, Moves.ZIPPY_ZAP ], + [Species.PACHIRISU]: [ Moves.FREEZY_FROST, Moves.SIZZLY_SLIDE, Moves.SLACK_OFF, Moves.ZIPPY_ZAP ], [Species.BUIZEL]: [ Moves.JET_PUNCH, Moves.TRIPLE_AXEL, Moves.SUPERCELL_SLAM, Moves.SURGING_STRIKES ], - [Species.CHERUBI]: [ Moves.SPORE, Moves.STRENGTH_SAP, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ], + [Species.CHERUBI]: [ Moves.SPORE, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.FLOWER_TRICK ], [Species.SHELLOS]: [ Moves.BOUNCY_BUBBLE, Moves.SCORCHING_SANDS, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.DRIFLOON]: [ Moves.WILL_O_WISP, Moves.MIND_BLOWN, Moves.CALM_MIND, Moves.OBLIVION_WING ], [Species.BUNEARY]: [ Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.THUNDEROUS_KICK, Moves.MULTI_ATTACK ], - [Species.GLAMEOW]: [ Moves.U_TURN, Moves.HIGH_HORSEPOWER, Moves.BULK_UP, Moves.EXTREME_SPEED ], + [Species.GLAMEOW]: [ Moves.PARTING_SHOT, Moves.HIGH_HORSEPOWER, Moves.SWORDS_DANCE, Moves.EXTREME_SPEED ], [Species.CHINGLING]: [ Moves.BUZZY_BUZZ, Moves.EERIE_SPELL, Moves.TORCH_SONG, Moves.BOOMBURST ], [Species.STUNKY]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.DIRE_CLAW ], [Species.BRONZOR]: [ Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.GLARE, Moves.LUMINA_CRASH ], - [Species.BONSLY]: [ Moves.STONE_AXE, Moves.LEAF_BLADE, Moves.STRENGTH_SAP, Moves.HEAD_SMASH ], + [Species.BONSLY]: [ Moves.ACCELEROCK, Moves.SWORDS_DANCE, Moves.STRENGTH_SAP, Moves.SAPPY_SEED ], [Species.MIME_JR]: [ Moves.CALM_MIND, Moves.MOONBLAST, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ], [Species.HAPPINY]: [ Moves.COTTON_GUARD, Moves.SEISMIC_TOSS, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ], [Species.CHATOT]: [ Moves.SPARKLING_ARIA, Moves.TORCH_SONG, Moves.BATON_PASS, Moves.BOOMBURST ], [Species.SPIRITOMB]: [ Moves.PARTING_SHOT, Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.SPECTRAL_THIEF ], [Species.GIBLE]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.SHORE_UP, Moves.THOUSAND_ARROWS ], - [Species.MUNCHLAX]: [ Moves.CURSE, Moves.BODY_PRESS, Moves.KNOCK_OFF, Moves.SLACK_OFF ], - [Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.BULLET_PUNCH, Moves.TRIPLE_AXEL, Moves.DOUBLE_IRON_BASH ], - [Species.HIPPOPOTAS]: [ Moves.BODY_PRESS, Moves.STONE_AXE, Moves.IRON_DEFENSE, Moves.SALT_CURE ], - [Species.SKORUPI]: [ Moves.CEASELESS_EDGE, Moves.DIRE_CLAW, Moves.PARTING_SHOT, Moves.WICKED_BLOW ], + [Species.MUNCHLAX]: [ Moves.STUFF_CHEEKS, Moves.GRAV_APPLE, Moves.SLACK_OFF, Moves.EXTREME_SPEED ], + [Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.TACHYON_CUTTER, Moves.TRIPLE_AXEL, Moves.DOUBLE_IRON_BASH ], + [Species.HIPPOPOTAS]: [ Moves.SHORE_UP, Moves.STONE_AXE, Moves.BULK_UP, Moves.SALT_CURE ], + [Species.SKORUPI]: [ Moves.COIL, Moves.DIRE_CLAW, Moves.CRABHAMMER, Moves.WICKED_BLOW ], [Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.ICE_PUNCH, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ], [Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.COIL, Moves.SAPPY_SEED ], [Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ], - [Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.HAZE, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], - [Species.SNOVER]: [ Moves.HIGH_HORSEPOWER, Moves.STRENGTH_SAP, Moves.AURORA_VEIL, Moves.IVY_CUDGEL ], + [Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.FREEZY_FROST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], + [Species.SNOVER]: [ Moves.HIGH_HORSEPOWER, Moves.STRENGTH_SAP, Moves.MATCHA_GOTCHA, Moves.SAPPY_SEED ], [Species.ROTOM]: [ Moves.STRENGTH_SAP, Moves.FIERY_DANCE, Moves.SPLISHY_SPLASH, Moves.ELECTRO_DRIFT ], [Species.UXIE]: [ Moves.COSMIC_POWER, Moves.BODY_PRESS, Moves.RECOVER, Moves.SPARKLY_SWIRL ], [Species.MESPRIT]: [ Moves.TAIL_GLOW, Moves.AURA_SPHERE, Moves.RECOVER, Moves.LUMINA_CRASH ], [Species.AZELF]: [ Moves.PSYSTRIKE, Moves.ICE_BEAM, Moves.MOONBLAST, Moves.TAIL_GLOW ], [Species.DIALGA]: [ Moves.CORE_ENFORCER, Moves.TAKE_HEART, Moves.RECOVER, Moves.MAKE_IT_RAIN ], - [Species.PALKIA]: [ Moves.RECOVER, Moves.TAKE_HEART, Moves.WATER_SPOUT, Moves.DRAGON_ENERGY ], + [Species.PALKIA]: [ Moves.RECOVER, Moves.TAKE_HEART, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ], [Species.HEATRAN]: [ Moves.TORCH_SONG, Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.MATCHA_GOTCHA ], [Species.REGIGIGAS]: [ Moves.SKILL_SWAP, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.GIGATON_HAMMER ], [Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH, Moves.RECOVER, Moves.SPECTRAL_THIEF ], [Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ], [Species.PHIONE]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ], [Species.MANAPHY]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ], - [Species.DARKRAI]: [ Moves.FIERY_WRATH, Moves.MOONBLAST, Moves.SEARING_SHOT, Moves.SPORE ], + [Species.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.QUIVER_DANCE, Moves.COLLISION_COURSE, Moves.VICTORY_DANCE, Moves.SPECTRAL_THIEF ], - [Species.VICTINI]: [ Moves.RECOVER, Moves.BOLT_STRIKE, Moves.PHOTON_GEYSER, Moves.VICTORY_DANCE ], + [Species.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 ], [Species.SNIVY]: [ Moves.FLAMETHROWER, Moves.CLANGING_SCALES, Moves.MAKE_IT_RAIN, Moves.FLEUR_CANNON ], [Species.TEPIG]: [ Moves.WAVE_CRASH, Moves.VOLT_TACKLE, Moves.DRAIN_PUNCH, Moves.VICTORY_DANCE ], [Species.OSHAWOTT]: [ Moves.TRIPLE_AXEL, Moves.SHELL_SIDE_ARM, Moves.SACRED_SWORD, Moves.SHELL_SMASH ], - [Species.PATRAT]: [ Moves.FAKE_OUT, Moves.GLARE, Moves.DYNAMIC_PUNCH, Moves.EXTREME_SPEED ], - [Species.LILLIPUP]: [ Moves.CLOSE_COMBAT, Moves.THIEF, Moves.HIGH_HORSEPOWER, Moves.LAST_RESPECTS ], - [Species.PURRLOIN]: [ Moves.ENCORE, Moves.ASSIST, Moves.PARTING_SHOT, Moves.WICKED_BLOW ], + [Species.PATRAT]: [ Moves.FAKE_OUT, Moves.SWORDS_DANCE, Moves.DYNAMIC_PUNCH, Moves.EXTREME_SPEED ], + [Species.LILLIPUP]: [ Moves.CLOSE_COMBAT, Moves.BODY_SLAM, Moves.HIGH_HORSEPOWER, Moves.LAST_RESPECTS ], + [Species.PURRLOIN]: [ Moves.ENCORE, Moves.OBSTRUCT, Moves.PARTING_SHOT, Moves.WICKED_BLOW ], [Species.PANSAGE]: [ Moves.SWORDS_DANCE, Moves.FIRE_LASH, Moves.EARTHQUAKE, Moves.IVY_CUDGEL ], [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.HYDRO_STEAM, Moves.SCORCHING_SANDS, Moves.TORCH_SONG ], [Species.PANPOUR]: [ Moves.NASTY_PLOT, Moves.ENERGY_BALL, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], @@ -267,27 +267,27 @@ export const speciesEggMoves = { [Species.BLITZLE]: [ Moves.HIGH_HORSEPOWER, Moves.THUNDEROUS_KICK, Moves.FLARE_BLITZ, Moves.VOLT_TACKLE ], [Species.ROGGENROLA]: [ Moves.BODY_PRESS, Moves.CURSE, Moves.SHORE_UP, Moves.DIAMOND_STORM ], [Species.WOOBAT]: [ Moves.ESPER_WING, Moves.STORED_POWER, Moves.MYSTICAL_FIRE, Moves.OBLIVION_WING ], - [Species.DRILBUR]: [ Moves.IRON_HEAD, Moves.ICE_SPINNER, Moves.SHIFT_GEAR, Moves.THOUSAND_ARROWS ], + [Species.DRILBUR]: [ Moves.IRON_HEAD, Moves.MOUNTAIN_GALE, Moves.SHIFT_GEAR, Moves.THOUSAND_ARROWS ], [Species.AUDINO]: [ Moves.FOLLOW_ME, Moves.MOONBLAST, Moves.WISH, Moves.LUNAR_BLESSING ], [Species.TIMBURR]: [ Moves.MACH_PUNCH, Moves.DRAIN_PUNCH, Moves.ICE_HAMMER, Moves.DOUBLE_IRON_BASH ], [Species.TYMPOLE]: [ Moves.JET_PUNCH, Moves.HIGH_HORSEPOWER, Moves.BULK_UP, Moves.SURGING_STRIKES ], - [Species.THROH]: [ Moves.DRAIN_PUNCH, Moves.SLACK_OFF, Moves.METEOR_MASH, Moves.NO_RETREAT ], - [Species.SAWK]: [ Moves.DRAIN_PUNCH, Moves.MACH_PUNCH, Moves.ENDEAVOR, Moves.VICTORY_DANCE ], - [Species.SEWADDLE]: [ Moves.STONE_AXE, Moves.PSYCHO_CUT, Moves.TIDY_UP, Moves.BITTER_BLADE ], + [Species.THROH]: [ Moves.MACH_PUNCH, Moves.SLACK_OFF, Moves.METEOR_MASH, Moves.RAGE_FIST ], + [Species.SAWK]: [ Moves.DRAIN_PUNCH, Moves.SUCKER_PUNCH, Moves.METEOR_MASH, Moves.VICTORY_DANCE ], + [Species.SEWADDLE]: [ Moves.STONE_AXE, Moves.PSYCHO_CUT, Moves.BITTER_BLADE, Moves.VICTORY_DANCE ], [Species.VENIPEDE]: [ Moves.SWORDS_DANCE, Moves.LEECH_LIFE, Moves.NOXIOUS_TORQUE, Moves.POWER_TRIP ], [Species.COTTONEE]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.SLEEP_POWDER, Moves.SEED_FLARE ], - [Species.PETILIL]: [ Moves.THUNDEROUS_KICK, Moves.SPARKLING_ARIA, Moves.AQUA_STEP, Moves.FIERY_DANCE ], + [Species.PETILIL]: [ Moves.THUNDEROUS_KICK, Moves.SPARKLING_ARIA, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ], [Species.BASCULIN]: [ Moves.LAST_RESPECTS, Moves.CLOSE_COMBAT, Moves.SPLISHY_SPLASH, Moves.NO_RETREAT ], [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.WICKED_BLOW ], - [Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZING_ZAP, Moves.EARTHQUAKE, Moves.V_CREATE ], + [Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZIPPY_ZAP, Moves.EARTHQUAKE, Moves.PYRO_BALL ], [Species.MARACTUS]: [ Moves.SCORCHING_SANDS, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.SEED_FLARE ], [Species.DWEBBLE]: [ Moves.CRABHAMMER, Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.MIGHTY_CLEAVE ], [Species.SCRAGGY]: [ Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.DRAGON_DANCE, Moves.COLLISION_COURSE ], - [Species.SIGILYPH]: [ Moves.STORED_POWER, Moves.TAKE_HEART, Moves.FREEZING_GLARE, Moves.OBLIVION_WING ], + [Species.SIGILYPH]: [ Moves.MOONBLAST, Moves.CALM_MIND, Moves.FREEZING_GLARE, Moves.OBLIVION_WING ], [Species.YAMASK]: [ Moves.STRENGTH_SAP, Moves.INFERNAL_PARADE, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], [Species.TIRTOUGA]: [ Moves.ICE_SPINNER, Moves.LIQUIDATION, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ], [Species.ARCHEN]: [ Moves.ROOST, Moves.EARTHQUAKE, Moves.FLOATY_FALL, Moves.MIGHTY_CLEAVE ], - [Species.TRUBBISH]: [ Moves.TIDY_UP, Moves.RECOVER, Moves.DIRE_CLAW, Moves.GIGATON_HAMMER ], + [Species.TRUBBISH]: [ Moves.COIL, Moves.RECOVER, Moves.DIRE_CLAW, Moves.GIGATON_HAMMER ], [Species.ZORUA]: [ Moves.FLAMETHROWER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.FIERY_WRATH ], [Species.MINCCINO]: [ Moves.ICICLE_SPEAR, Moves.TIDY_UP, Moves.KNOCK_OFF, Moves.POPULATION_BOMB ], [Species.GOTHITA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.LUMINA_CRASH ], @@ -295,83 +295,83 @@ export const speciesEggMoves = { [Species.DUCKLETT]: [ Moves.SPLISHY_SPLASH, Moves.EARTH_POWER, Moves.WILDBOLT_STORM, Moves.QUIVER_DANCE ], [Species.VANILLITE]: [ Moves.EARTH_POWER, Moves.AURORA_VEIL, Moves.CALM_MIND, Moves.SPARKLY_SWIRL ], [Species.DEERLING]: [ Moves.TIDY_UP, Moves.FLOWER_TRICK, Moves.BODY_SLAM, Moves.COMBAT_TORQUE ], - [Species.EMOLGA]: [ Moves.ROOST, Moves.HEAT_WAVE, Moves.TAILWIND, Moves.ZING_ZAP ], + [Species.EMOLGA]: [ Moves.TRIPLE_AXEL, Moves.SPLISHY_SPLASH, Moves.TAILWIND, Moves.ZIPPY_ZAP ], [Species.KARRABLAST]: [ Moves.LEECH_LIFE, Moves.HEAL_ORDER, Moves.HIGH_HORSEPOWER, Moves.DOUBLE_IRON_BASH ], [Species.FOONGUS]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.SAPPY_SEED ], [Species.FRILLISH]: [ Moves.STRENGTH_SAP, Moves.INFERNAL_PARADE, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.ALOMOMOLA]: [ Moves.FLIP_TURN, Moves.HEART_SWAP, Moves.TOXIC, Moves.GLITZY_GLOW ], [Species.JOLTIK]: [ Moves.THUNDER, Moves.PARABOLIC_CHARGE, Moves.EARTH_POWER, Moves.QUIVER_DANCE ], [Species.FERROSEED]: [ Moves.STRENGTH_SAP, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.SAPPY_SEED ], - [Species.KLINK]: [ Moves.FLARE_BLITZ, Moves.HIGH_HORSEPOWER, Moves.FUSION_BOLT, Moves.DOUBLE_IRON_BASH ], + [Species.KLINK]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FUSION_BOLT, Moves.DOUBLE_IRON_BASH ], [Species.TYNAMO]: [ Moves.SCALD, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.PLASMA_FISTS ], - [Species.ELGYEM]: [ Moves.MYSTICAL_POWER, Moves.TRICK_ROOM, Moves.STORED_POWER, Moves.ASTRAL_BARRAGE ], + [Species.ELGYEM]: [ Moves.LUSTER_PURGE, Moves.TRICK_ROOM, Moves.AURA_SPHERE, Moves.TAIL_GLOW ], [Species.LITWICK]: [ Moves.FIERY_DANCE, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE ], - [Species.AXEW]: [ Moves.GLAIVE_RUSH, Moves.DIRE_CLAW, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], + [Species.AXEW]: [ Moves.STONE_AXE, Moves.DIRE_CLAW, Moves.BITTER_BLADE, Moves.GLAIVE_RUSH ], [Species.CUBCHOO]: [ Moves.TRIPLE_AXEL, Moves.LIQUIDATION, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ], - [Species.CRYOGONAL]: [ Moves.SURF, Moves.AURORA_VEIL, Moves.NASTY_PLOT, Moves.FREEZY_FROST ], + [Species.CRYOGONAL]: [ Moves.FREEZING_GLARE, Moves.AURORA_VEIL, Moves.NASTY_PLOT, Moves.ORIGIN_PULSE ], [Species.SHELMET]: [ Moves.POWER_GEM, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], - [Species.STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.EARTHQUAKE, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], + [Species.STUNFISK]: [ Moves.BANEFUL_BUNKER, Moves.SANDSEAR_STORM, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], [Species.MIENFOO]: [ Moves.GUNK_SHOT, Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.MOUNTAIN_GALE ], [Species.DRUDDIGON]: [ Moves.FIRE_LASH, Moves.ROOST, Moves.DRAGON_DARTS, Moves.CLANGOROUS_SOUL ], [Species.GOLETT]: [ Moves.SHIFT_GEAR, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.RAGE_FIST ], [Species.PAWNIARD]: [ Moves.SUCKER_PUNCH, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE, Moves.LAST_RESPECTS ], [Species.BOUFFALANT]: [ Moves.SLACK_OFF, Moves.JUMP_KICK, Moves.HEAD_SMASH, Moves.FLARE_BLITZ ], - [Species.RUFFLET]: [ Moves.FLOATY_FALL, Moves.MOONBLAST, Moves.HEAT_WAVE, Moves.BOLT_BEAK ], - [Species.VULLABY]: [ Moves.TOXIC, Moves.BODY_PRESS, Moves.ROOST, Moves.TOPSY_TURVY ], + [Species.RUFFLET]: [ Moves.FLOATY_FALL, Moves.AURA_SPHERE, Moves.NO_RETREAT, Moves.BOLT_BEAK ], + [Species.VULLABY]: [ Moves.FOUL_PLAY, Moves.BODY_PRESS, Moves.ROOST, Moves.RUINATION ], [Species.HEATMOR]: [ Moves.EARTH_POWER, Moves.OVERHEAT, Moves.THUNDERBOLT, Moves.V_CREATE ], [Species.DURANT]: [ Moves.HIGH_HORSEPOWER, Moves.FIRST_IMPRESSION, Moves.SWORDS_DANCE, Moves.BEHEMOTH_BASH ], - [Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_WAVE, Moves.FICKLE_BEAM ], + [Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_BOMB, Moves.FICKLE_BEAM ], [Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.MATCHA_GOTCHA, Moves.EARTH_POWER, Moves.TORCH_SONG ], [Species.COBALION]: [ Moves.BEHEMOTH_BLADE, Moves.BODY_PRESS, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], [Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], [Species.VIRIZION]: [ Moves.PSYBLADE, Moves.SAPPY_SEED, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], - [Species.TORNADUS]: [ Moves.EARTH_POWER, Moves.U_TURN, Moves.ICE_BEAM, Moves.OBLIVION_WING ], - [Species.THUNDURUS]: [ Moves.EARTH_POWER, Moves.HURRICANE, Moves.THUNDERCLAP, Moves.ELECTRO_SHOT ], - [Species.RESHIRAM]: [ Moves.ROOST, Moves.TAKE_HEART, Moves.ERUPTION, Moves.DRAGON_ENERGY ], + [Species.TORNADUS]: [ Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.ICE_BEAM, Moves.OBLIVION_WING ], + [Species.THUNDURUS]: [ Moves.EARTH_POWER, Moves.HURRICANE, Moves.FROST_BREATH, Moves.ELECTRO_SHOT ], + [Species.RESHIRAM]: [ Moves.MORNING_SUN, Moves.TAKE_HEART, Moves.FICKLE_BEAM, Moves.ERUPTION ], [Species.ZEKROM]: [ Moves.DRAGON_DANCE, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.BOLT_BEAK ], - [Species.LANDORUS]: [ Moves.STONE_AXE, Moves.THOUSAND_ARROWS, Moves.ROOST, Moves.FLOATY_FALL ], - [Species.KYUREM]: [ Moves.DRAGON_DARTS, Moves.DRAGON_ENERGY, Moves.NO_RETREAT, Moves.GLACIAL_LANCE ], + [Species.LANDORUS]: [ Moves.STONE_AXE, Moves.FLOATY_FALL, Moves.ROOST, Moves.BLEAKWIND_STORM ], + [Species.KYUREM]: [ Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.NO_RETREAT, Moves.GLACIAL_LANCE ], [Species.KELDEO]: [ Moves.BOUNCY_BUBBLE, Moves.THUNDERBOLT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], - [Species.MELOETTA]: [ Moves.TORCH_SONG, Moves.QUIVER_DANCE, Moves.TRIPLE_ARROWS, Moves.BOOMBURST ], + [Species.MELOETTA]: [ Moves.VICTORY_DANCE, Moves.QUIVER_DANCE, Moves.TRIPLE_ARROWS, Moves.TORCH_SONG ], [Species.GENESECT]: [ Moves.EXTREME_SPEED, Moves.U_TURN, Moves.TACHYON_CUTTER, Moves.TAIL_GLOW ], - [Species.CHESPIN]: [ Moves.DRAIN_PUNCH, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ], + [Species.CHESPIN]: [ Moves.BODY_PRESS, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ], [Species.FENNEKIN]: [ Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.THUNDERBOLT, Moves.TORCH_SONG ], - [Species.FROAKIE]: [ Moves.MOONBLAST, Moves.SHELL_SIDE_ARM, Moves.FIERY_WRATH, Moves.WATER_SPOUT ], + [Species.FROAKIE]: [ Moves.MOONBLAST, Moves.SHELL_SIDE_ARM, Moves.FIERY_WRATH, Moves.STEAM_ERUPTION ], [Species.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.FACADE, Moves.EXTREME_SPEED ], - [Species.FLETCHLING]: [ Moves.DRILL_RUN, Moves.U_TURN, Moves.HEAD_SMASH, Moves.VOLT_TACKLE ], - [Species.SCATTERBUG]: [ Moves.MOONBLAST, Moves.POLLEN_PUFF, Moves.TAILWIND, Moves.HEAT_WAVE ], + [Species.FLETCHLING]: [ Moves.DRILL_RUN, Moves.BURNING_BULWARK, Moves.HEAD_SMASH, Moves.VOLT_TACKLE ], + [Species.SCATTERBUG]: [ Moves.FOCUS_BLAST, Moves.AFTER_YOU, Moves.DECORATE, Moves.BLIZZARD ], [Species.LITLEO]: [ Moves.EARTH_POWER, Moves.NASTY_PLOT, Moves.YAWN, Moves.TORCH_SONG ], - [Species.FLABEBE]: [ Moves.GLITZY_GLOW, Moves.MYSTICAL_FIRE, Moves.JUNGLE_HEALING, Moves.QUIVER_DANCE ], + [Species.FLABEBE]: [ Moves.GLITZY_GLOW, Moves.MYSTICAL_FIRE, Moves.TAKE_HEART, Moves.SEED_FLARE ], [Species.SKIDDO]: [ Moves.HIGH_HORSEPOWER, Moves.GRASSY_GLIDE, Moves.STONE_AXE, Moves.SAPPY_SEED ], - [Species.PANCHAM]: [ Moves.DRAIN_PUNCH, Moves.FAKE_OUT, Moves.BULLET_PUNCH, Moves.WICKED_BLOW ], + [Species.PANCHAM]: [ Moves.DRAIN_PUNCH, Moves.SUCKER_PUNCH, Moves.METEOR_MASH, Moves.WICKED_BLOW ], [Species.FURFROU]: [ Moves.TIDY_UP, Moves.SLACK_OFF, Moves.COVET, Moves.MULTI_ATTACK ], [Species.ESPURR]: [ Moves.GLARE, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.PSYSTRIKE ], - [Species.HONEDGE]: [ Moves.TACHYON_CUTTER, Moves.POLTERGEIST, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ], + [Species.HONEDGE]: [ Moves.TACHYON_CUTTER, Moves.SHADOW_BONE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ], [Species.SPRITZEE]: [ Moves.TRICK_ROOM, Moves.FOUL_PLAY, Moves.WISH, Moves.REVIVAL_BLESSING ], - [Species.SWIRLIX]: [ Moves.BELLY_DRUM, Moves.SUCKER_PUNCH, Moves.MAGICAL_TORQUE, Moves.REVIVAL_BLESSING ], + [Species.SWIRLIX]: [ Moves.BELLY_DRUM, Moves.HEADLONG_RUSH, Moves.MAGICAL_TORQUE, Moves.REVIVAL_BLESSING ], [Species.INKAY]: [ Moves.POWER_TRIP, Moves.SPIN_OUT, Moves.RECOVER, Moves.PSYCHO_BOOST ], [Species.BINACLE]: [ Moves.TRIPLE_AXEL, Moves.ACCELEROCK, Moves.DIRE_CLAW, Moves.MIGHTY_CLEAVE ], - [Species.SKRELP]: [ Moves.RECOVER, Moves.CORE_ENFORCER, Moves.CALM_MIND, Moves.MALIGNANT_CHAIN ], + [Species.SKRELP]: [ Moves.STRENGTH_SAP, Moves.TRICK_ROOM, Moves.CALM_MIND, Moves.CORE_ENFORCER ], [Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.WATER_SHURIKEN, Moves.ORIGIN_PULSE ], [Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.BOOMBURST ], - [Species.TYRUNT]: [ Moves.DRAGON_HAMMER, Moves.FLARE_BLITZ, Moves.VOLT_TACKLE, Moves.AXE_KICK ], + [Species.TYRUNT]: [ Moves.DRAGON_HAMMER, Moves.FLARE_BLITZ, Moves.VOLT_TACKLE, Moves.SHIFT_GEAR ], [Species.AMAURA]: [ Moves.RECOVER, Moves.AURORA_VEIL, Moves.POWER_GEM, Moves.GEOMANCY ], [Species.HAWLUCHA]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FLOATY_FALL, Moves.WICKED_BLOW ], [Species.DEDENNE]: [ Moves.BOOMBURST, Moves.FAKE_OUT, Moves.NASTY_PLOT, Moves.REVIVAL_BLESSING ], [Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ], [Species.GOOMY]: [ Moves.SCALD, Moves.RECOVER, Moves.CALM_MIND, Moves.MAKE_IT_RAIN ], - [Species.KLEFKI]: [ Moves.HEAL_BLOCK, Moves.ENCORE, Moves.TOPSY_TURVY, Moves.INSTRUCT ], - [Species.PHANTUMP]: [ Moves.SPIRIT_SHACKLE, Moves.TRICK_ROOM, Moves.SYNTHESIS, Moves.SAPPY_SEED ], + [Species.KLEFKI]: [ Moves.HEAL_BELL, Moves.ENCORE, Moves.TOPSY_TURVY, Moves.INSTRUCT ], + [Species.PHANTUMP]: [ Moves.RAGE_FIST, Moves.TRICK_ROOM, Moves.SYNTHESIS, Moves.SAPPY_SEED ], [Species.PUMPKABOO]: [ Moves.SPIRIT_SHACKLE, Moves.FIRE_LASH, Moves.DIRE_CLAW, Moves.SAPPY_SEED ], [Species.BERGMITE]: [ Moves.STONE_AXE, Moves.METAL_BURST, Moves.BODY_PRESS, Moves.GLACIAL_LANCE ], [Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ], [Species.XERNEAS]: [ Moves.SEARING_SHOT, Moves.LUMINA_CRASH, Moves.STRENGTH_SAP, Moves.TAIL_GLOW ], - [Species.YVELTAL]: [ Moves.SLUDGE_WAVE, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], - [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.VICTORY_DANCE, Moves.DOUBLE_IRON_BASH ], + [Species.YVELTAL]: [ Moves.SHELL_SIDE_ARM, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], + [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.CLANGOROUS_SOUL, Moves.DOUBLE_IRON_BASH ], [Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.GEOMANCY ], [Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.FIERY_WRATH, Moves.SHELL_SMASH ], [Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.ENERGY_BALL, Moves.MAGMA_STORM ], - [Species.ROWLET]: [ Moves.THOUSAND_ARROWS, Moves.POLTERGEIST, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ], + [Species.ROWLET]: [ Moves.THOUSAND_ARROWS, Moves.SHADOW_BONE, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ], [Species.LITTEN]: [ Moves.FAKE_OUT, Moves.PARTING_SHOT, Moves.MORNING_SUN, Moves.SACRED_FIRE ], [Species.POPPLIO]: [ Moves.PSYCHIC_NOISE, Moves.BOUNCY_BUBBLE, Moves.ALLURING_VOICE, Moves.TORCH_SONG ], [Species.PIKIPEK]: [ Moves.DUAL_WINGBEAT, Moves.BONE_RUSH, Moves.BURNING_BULWARK, Moves.POPULATION_BOMB ], @@ -387,68 +387,68 @@ export const speciesEggMoves = { [Species.DEWPIDER]: [ Moves.JET_PUNCH, Moves.SILK_TRAP, Moves.SWORDS_DANCE, Moves.AQUA_STEP ], [Species.FOMANTIS]: [ Moves.SUPERPOWER, Moves.HEADLONG_RUSH, Moves.ICE_HAMMER, Moves.BITTER_BLADE ], [Species.MORELULL]: [ Moves.CALM_MIND, Moves.SAPPY_SEED, Moves.DRAINING_KISS, Moves.MATCHA_GOTCHA ], - [Species.SALANDIT]: [ Moves.FAKE_OUT, Moves.SLUDGE_WAVE, Moves.CORE_ENFORCER, Moves.ERUPTION ], - [Species.STUFFUL]: [ Moves.DRAIN_PUNCH, Moves.METEOR_MASH, Moves.ICE_HAMMER, Moves.RAGE_FIST ], + [Species.SALANDIT]: [ Moves.SCALD, Moves.SLUDGE_WAVE, Moves.CORE_ENFORCER, Moves.ERUPTION ], + [Species.STUFFUL]: [ Moves.DRAIN_PUNCH, Moves.METEOR_MASH, Moves.TRIPLE_AXEL, Moves.RAGE_FIST ], [Species.BOUNSWEET]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK, Moves.SAPPY_SEED ], - [Species.COMFEY]: [ Moves.REVIVAL_BLESSING, Moves.POLLEN_PUFF, Moves.STRENGTH_SAP, Moves.MATCHA_GOTCHA ], + [Species.COMFEY]: [ Moves.REVIVAL_BLESSING, Moves.TAKE_HEART, Moves.STRENGTH_SAP, Moves.MATCHA_GOTCHA ], [Species.ORANGURU]: [ Moves.JUNGLE_HEALING, Moves.YAWN, Moves.FOLLOW_ME, Moves.LUMINA_CRASH ], - [Species.PASSIMIAN]: [ Moves.FAKE_OUT, Moves.SUCKER_PUNCH, Moves.SWORDS_DANCE, Moves.PYRO_BALL ], + [Species.PASSIMIAN]: [ Moves.FAKE_OUT, Moves.SUCKER_PUNCH, Moves.ZING_ZAP, Moves.PYRO_BALL ], [Species.WIMPOD]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.JET_PUNCH, Moves.SURGING_STRIKES ], - [Species.SANDYGAST]: [ Moves.SCORCHING_SANDS, Moves.SPLISHY_SPLASH, Moves.CURSE, Moves.SALT_CURE ], + [Species.SANDYGAST]: [ Moves.SCORCHING_SANDS, Moves.SPLISHY_SPLASH, Moves.TAKE_HEART, Moves.SALT_CURE ], [Species.PYUKUMUKU]: [ Moves.COMEUPPANCE, Moves.BANEFUL_BUNKER, Moves.TOXIC_SPIKES, Moves.SALT_CURE ], - [Species.TYPE_NULL]: [ Moves.DIRE_CLAW, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.NO_RETREAT ], + [Species.TYPE_NULL]: [ Moves.DIRE_CLAW, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.SHELL_SMASH ], [Species.MINIOR]: [ Moves.EARTH_POWER, Moves.FLOATY_FALL, Moves.ZING_ZAP, Moves.DIAMOND_STORM ], [Species.KOMALA]: [ Moves.SLACK_OFF, Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.COLLISION_COURSE ], [Species.TURTONATOR]: [ Moves.BURNING_BULWARK, Moves.MORNING_SUN, Moves.BODY_PRESS, Moves.CORE_ENFORCER ], [Species.TOGEDEMARU]: [ Moves.FAKE_OUT, Moves.METAL_BURST, Moves.METEOR_MASH, Moves.BOLT_STRIKE ], - [Species.MIMIKYU]: [ Moves.MAGICAL_TORQUE, Moves.TIDY_UP, Moves.SIZZLY_SLIDE, Moves.SPECTRAL_THIEF ], - [Species.BRUXISH]: [ Moves.ICE_FANG, Moves.FIRE_FANG, Moves.FLIP_TURN, Moves.FILLET_AWAY ], - [Species.DRAMPA]: [ Moves.SLACK_OFF, Moves.FLAMETHROWER, Moves.CORE_ENFORCER, Moves.CLANGOROUS_SOUL ], - [Species.DHELMISE]: [ Moves.POLTERGEIST, Moves.STRENGTH_SAP, Moves.LIQUIDATION, Moves.SAPPY_SEED ], - [Species.JANGMO_O]: [ Moves.OVERDRIVE, Moves.SHELL_SIDE_ARM, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ], + [Species.MIMIKYU]: [ Moves.SPIRIT_BREAK, Moves.TIDY_UP, Moves.BITTER_BLADE, Moves.SPECTRAL_THIEF ], + [Species.BRUXISH]: [ Moves.PLAY_ROUGH, Moves.FIRE_FANG, Moves.DRAGON_DANCE, Moves.SURGING_STRIKES ], + [Species.DRAMPA]: [ Moves.SLACK_OFF, Moves.TRICK_ROOM, Moves.CORE_ENFORCER, Moves.BOOMBURST ], + [Species.DHELMISE]: [ Moves.SHADOW_BONE, Moves.STRENGTH_SAP, Moves.LIQUIDATION, Moves.SAPPY_SEED ], + [Species.JANGMO_O]: [ Moves.BODY_PRESS, Moves.SHELL_SIDE_ARM, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ], [Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.RISING_VOLTAGE, Moves.PLASMA_FISTS ], [Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ], [Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.DRAIN_PUNCH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], [Species.TAPU_FINI]: [ Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ], - [Species.COSMOG]: [ Moves.VICTORY_DANCE, Moves.QUIVER_DANCE, Moves.SACRED_FIRE, Moves.PHOTON_GEYSER ], - [Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.QUIVER_DANCE, Moves.ENERGY_BALL, Moves.MALIGNANT_CHAIN ], - [Species.BUZZWOLE]: [ Moves.LEECH_LIFE, Moves.BULLET_PUNCH, Moves.DARKEST_LARIAT, Moves.COLLISION_COURSE ], - [Species.PHEROMOSA]: [ Moves.AURA_SPHERE, Moves.MAKE_IT_RAIN, Moves.ATTACK_ORDER, Moves.COLLISION_COURSE ], - [Species.XURKITREE]: [ Moves.OVERHEAT, Moves.GIGA_DRAIN, Moves.TAIL_GLOW, Moves.THUNDERCLAP ], - [Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.EARTH_POWER, Moves.OBLIVION_WING ], - [Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ], - [Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.RUINATION ], - [Species.NECROZMA]: [ Moves.COSMIC_POWER, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.CLANGOROUS_SOUL ], - [Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.COSMIC_POWER, Moves.MAKE_IT_RAIN ], - [Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.STORM_THROW, Moves.DOUBLE_IRON_BASH ], - [Species.POIPOLE]: [ Moves.SLUDGE_BOMB, Moves.BUG_BUZZ, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY ], + [Species.COSMOG]: [ Moves.PHOTON_GEYSER, Moves.PRECIPICE_BLADES, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE ], + [Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.QUIVER_DANCE ], + [Species.BUZZWOLE]: [ Moves.FIRST_IMPRESSION, Moves.COMBAT_TORQUE, Moves.ROCK_WRECKER, Moves.DOUBLE_IRON_BASH ], + [Species.PHEROMOSA]: [ Moves.AURA_SPHERE, Moves.MAKE_IT_RAIN, Moves.ATTACK_ORDER, Moves.DIAMOND_STORM ], + [Species.XURKITREE]: [ Moves.FLAMETHROWER, Moves.GIGA_DRAIN, Moves.TAIL_GLOW, Moves.THUNDERCLAP ], + [Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.SANDSEAR_STORM, Moves.OBLIVION_WING ], + [Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.PSYBLADE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ], + [Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ], + [Species.NECROZMA]: [ Moves.CLANGOROUS_SOUL, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.DYNAMAX_CANNON ], + [Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.MAKE_IT_RAIN ], + [Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.METEOR_MASH, Moves.STORM_THROW ], + [Species.POIPOLE]: [ Moves.CORE_ENFORCER, Moves.ICE_BEAM, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN ], [Species.STAKATAKA]: [ Moves.HEAVY_SLAM, Moves.SHORE_UP, Moves.CURSE, Moves.SALT_CURE ], [Species.BLACEPHALON]: [ Moves.NASTY_PLOT, Moves.AURA_SPHERE, Moves.CHLOROBLAST, Moves.ASTRAL_BARRAGE ], [Species.ZERAORA]: [ Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE, Moves.PYRO_BALL ], [Species.MELTAN]: [ Moves.BULLET_PUNCH, Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS ], [Species.GROOKEY]: [ Moves.HIGH_HORSEPOWER, Moves.CLANGOROUS_SOUL, Moves.GRASSY_GLIDE, Moves.SAPPY_SEED ], [Species.SCORBUNNY]: [ Moves.EXTREME_SPEED, Moves.HIGH_JUMP_KICK, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE ], - [Species.SOBBLE]: [ Moves.AEROBLAST, Moves.FROST_BREATH, Moves.SEARING_SHOT, Moves.STEAM_ERUPTION ], + [Species.SOBBLE]: [ Moves.AEROBLAST, Moves.FROST_BREATH, Moves.SCORCHING_SANDS, Moves.NASTY_PLOT ], [Species.SKWOVET]: [ Moves.KNOCK_OFF, Moves.SLACK_OFF, Moves.BODY_PRESS, Moves.POPULATION_BOMB ], - [Species.ROOKIDEE]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.IRON_HEAD, Moves.KINGS_SHIELD ], + [Species.ROOKIDEE]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.BEHEMOTH_BASH ], [Species.BLIPBUG]: [ Moves.HEAL_ORDER, Moves.EXPANDING_FORCE, Moves.SPORE, Moves.TAIL_GLOW ], [Species.NICKIT]: [ Moves.BADDY_BAD, Moves.BURNING_JEALOUSY, Moves.SPARKLY_SWIRL, Moves.FIERY_WRATH ], - [Species.GOSSIFLEUR]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.PARTING_SHOT, Moves.SEED_FLARE ], + [Species.GOSSIFLEUR]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SEED_FLARE ], [Species.WOOLOO]: [ Moves.PSYSHIELD_BASH, Moves.MILK_DRINK, Moves.BODY_PRESS, Moves.MULTI_ATTACK ], - [Species.CHEWTLE]: [ Moves.FIRE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ], - [Species.YAMPER]: [ Moves.ICE_FANG, Moves.SWORDS_DANCE, Moves.THUNDER_FANG, Moves.ZIPPY_ZAP ], + [Species.CHEWTLE]: [ Moves.ICE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ], + [Species.YAMPER]: [ Moves.ICE_FANG, Moves.SWORDS_DANCE, Moves.THUNDER_FANG, Moves.BOLT_STRIKE ], [Species.ROLYCOLY]: [ Moves.BITTER_BLADE, Moves.BODY_PRESS, Moves.BULK_UP, Moves.DIAMOND_STORM ], - [Species.APPLIN]: [ Moves.DRAGON_CHEER, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ], - [Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.STONE_EDGE, Moves.PRECIPICE_BLADES ], + [Species.APPLIN]: [ Moves.MATCHA_GOTCHA, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ], + [Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.MOUNTAIN_GALE, Moves.THOUSAND_ARROWS ], [Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.OBLIVION_WING ], [Species.ARROKUDA]: [ Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.ICE_SPINNER, Moves.FILLET_AWAY ], [Species.TOXEL]: [ Moves.NASTY_PLOT, Moves.BUG_BUZZ, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ], - [Species.SIZZLIPEDE]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ], + [Species.SIZZLIPEDE]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.FIRST_IMPRESSION, Moves.BITTER_BLADE ], [Species.CLOBBOPUS]: [ Moves.STORM_THROW, Moves.JET_PUNCH, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ], [Species.SINISTEA]: [ Moves.SCALD, Moves.TAKE_HEART, Moves.SPARKLY_SWIRL, Moves.MATCHA_GOTCHA ], [Species.HATENNA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.BUZZY_BUZZ, Moves.SEARING_SHOT ], [Species.IMPIDIMP]: [ Moves.ENCORE, Moves.PARTING_SHOT, Moves.TOPSY_TURVY, Moves.WICKED_BLOW ], - [Species.MILCERY]: [ Moves.MOONBLAST, Moves.SYRUP_BOMB, Moves.EARTH_POWER, Moves.SEARING_SHOT ], + [Species.MILCERY]: [ Moves.MOONBLAST, Moves.CHILLY_RECEPTION, Moves.EARTH_POWER, Moves.GEOMANCY ], [Species.FALINKS]: [ Moves.COMBAT_TORQUE, Moves.PSYSHIELD_BASH, Moves.HEAL_ORDER, Moves.POPULATION_BOMB ], [Species.PINCURCHIN]: [ Moves.TRICK_ROOM, Moves.RISING_VOLTAGE, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], [Species.SNOM]: [ Moves.MOONBLAST, Moves.SURF, Moves.EARTH_POWER, Moves.FIERY_DANCE ], @@ -458,16 +458,16 @@ export const speciesEggMoves = { [Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ], [Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ], [Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.FIRE_LASH, Moves.DRAGON_DANCE ], - [Species.ARCTOZOLT]: [ Moves.TRIPLE_AXEL, Moves.LIQUIDATION, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], + [Species.ARCTOZOLT]: [ Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], [Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ], - [Species.ARCTOVISH]: [ Moves.TRIPLE_AXEL, Moves.SUPERCELL_SLAM, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], - [Species.DURALUDON]: [ Moves.ICE_BEAM, Moves.BODY_PRESS, Moves.RECOVER, Moves.CORE_ENFORCER ], - [Species.DREEPY]: [ Moves.DRAGON_ENERGY, Moves.POWER_UP_PUNCH, Moves.BLAZING_TORQUE, Moves.SPECTRAL_THIEF ], - [Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE ], + [Species.ARCTOVISH]: [ Moves.ICE_FANG, Moves.THUNDER_FANG, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], + [Species.DURALUDON]: [ Moves.CORE_ENFORCER, Moves.BODY_PRESS, Moves.RECOVER, Moves.TACHYON_CUTTER ], + [Species.DREEPY]: [ Moves.SHADOW_BONE, Moves.POWER_UP_PUNCH, Moves.BLAZING_TORQUE, Moves.GLAIVE_RUSH ], + [Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.MIGHTY_CLEAVE, Moves.BITTER_BLADE, Moves.PRECIPICE_BLADES ], [Species.ZAMAZENTA]: [ Moves.PSYSHIELD_BASH, Moves.BODY_PRESS, Moves.SLACK_OFF, Moves.VICTORY_DANCE ], - [Species.ETERNATUS]: [ Moves.BODY_PRESS, Moves.DRAGON_ENERGY, Moves.MALIGNANT_CHAIN, Moves.TAIL_GLOW ], + [Species.ETERNATUS]: [ Moves.BODY_PRESS, Moves.NASTY_PLOT, Moves.MALIGNANT_CHAIN, Moves.DRAGON_ENERGY ], [Species.KUBFU]: [ Moves.METEOR_MASH, Moves.DRAIN_PUNCH, Moves.JET_PUNCH, Moves.DRAGON_DANCE ], - [Species.ZARUDE]: [ Moves.SAPPY_SEED, Moves.PARTING_SHOT, Moves.WICKED_BLOW, Moves.VICTORY_DANCE ], + [Species.ZARUDE]: [ Moves.SAPPY_SEED, Moves.MIGHTY_CLEAVE, Moves.WICKED_BLOW, Moves.VICTORY_DANCE ], [Species.REGIELEKI]: [ Moves.NASTY_PLOT, Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.ELECTRO_DRIFT ], [Species.REGIDRAGO]: [ Moves.METEOR_MASH, Moves.FLAMETHROWER, Moves.TAKE_HEART, Moves.DRAGON_DARTS ], [Species.GLASTRIER]: [ Moves.TRICK_ROOM, Moves.SLACK_OFF, Moves.HIGH_HORSEPOWER, Moves.GLACIAL_LANCE ], @@ -476,8 +476,8 @@ export const speciesEggMoves = { [Species.ENAMORUS]: [ Moves.FLEUR_CANNON, Moves.TAKE_HEART, Moves.STORED_POWER, Moves.OBLIVION_WING ], [Species.SPRIGATITO]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], [Species.FUECOCO]: [ Moves.ALLURING_VOICE, Moves.SLACK_OFF, Moves.OVERDRIVE, Moves.MOONGEIST_BEAM ], - [Species.QUAXLY]: [ Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.TROP_KICK, Moves.THUNDEROUS_KICK ], - [Species.LECHONK]: [ Moves.MILK_DRINK, Moves.BLAZING_TORQUE, Moves.FILLET_AWAY, Moves.MULTI_ATTACK ], + [Species.QUAXLY]: [ Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.POWER_TRIP, Moves.THUNDEROUS_KICK ], + [Species.LECHONK]: [ Moves.MILK_DRINK, Moves.PSYSHIELD_BASH, Moves.FILLET_AWAY, Moves.MULTI_ATTACK ], [Species.TAROUNTULA]: [ Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.THIEF, Moves.SPORE ], [Species.NYMBLE]: [ Moves.KNOCK_OFF, Moves.FELL_STINGER, Moves.ATTACK_ORDER, Moves.WICKED_BLOW ], [Species.PAWMI]: [ Moves.DRAIN_PUNCH, Moves.ICE_PUNCH, Moves.MACH_PUNCH, Moves.PLASMA_FISTS ], @@ -488,7 +488,7 @@ export const speciesEggMoves = { [Species.NACLI]: [ Moves.BODY_PRESS, Moves.TOXIC, Moves.CURSE, Moves.DIAMOND_STORM ], [Species.CHARCADET]: [ Moves.SACRED_SWORD, Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.SPECTRAL_THIEF ], [Species.TADBULB]: [ Moves.PARABOLIC_CHARGE, Moves.SCALD, Moves.EARTH_POWER, Moves.ELECTRO_SHOT ], - [Species.WATTREL]: [ Moves.NASTY_PLOT, Moves.TAILWIND, Moves.HEAT_WAVE, Moves.ELECTRO_SHOT ], + [Species.WATTREL]: [ Moves.NASTY_PLOT, Moves.SPLISHY_SPLASH, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ], [Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.CLOSE_COMBAT, Moves.PSYCHIC_FANGS, Moves.NO_RETREAT ], [Species.SHROODLE]: [ Moves.GASTRO_ACID, Moves.PARTING_SHOT, Moves.TOXIC, Moves.SKETCH ], [Species.BRAMBLIN]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.FLOWER_TRICK, Moves.LAST_RESPECTS ], @@ -507,34 +507,34 @@ export const speciesEggMoves = { [Species.GLIMMET]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.FIERY_DANCE, Moves.MALIGNANT_CHAIN ], [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.YAWN, Moves.SHORE_UP, Moves.COLLISION_COURSE ], [Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.FLOATY_FALL, Moves.VICTORY_DANCE ], - [Species.CETODDLE]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.DRAGON_DANCE ], - [Species.VELUZA]: [ Moves.CEASELESS_EDGE, Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.PSYBLADE ], + [Species.CETODDLE]: [ Moves.MOUNTAIN_GALE, Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.DRAGON_DANCE ], + [Species.VELUZA]: [ Moves.PSYBLADE, Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.BITTER_BLADE ], [Species.DONDOZO]: [ Moves.SOFT_BOILED, Moves.ICE_SPINNER, Moves.TOXIC, Moves.SALT_CURE ], [Species.TATSUGIRI]: [ Moves.ICE_BEAM, Moves.FILLET_AWAY, Moves.CORE_ENFORCER, Moves.STEAM_ERUPTION ], - [Species.GREAT_TUSK]: [ Moves.STONE_AXE, Moves.MORNING_SUN, Moves.DRAGON_DANCE, Moves.COLLISION_COURSE ], + [Species.GREAT_TUSK]: [ Moves.STONE_AXE, Moves.MORNING_SUN, Moves.COLLISION_COURSE, Moves.SHIFT_GEAR ], [Species.SCREAM_TAIL]: [ Moves.TORCH_SONG, Moves.GLITZY_GLOW, Moves.MOONLIGHT, Moves.SPARKLY_SWIRL ], - [Species.BRUTE_BONNET]: [ Moves.DARKEST_LARIAT, Moves.STRENGTH_SAP, Moves.EARTHQUAKE, Moves.SAPPY_SEED ], + [Species.BRUTE_BONNET]: [ Moves.SAPPY_SEED, Moves.STRENGTH_SAP, Moves.EARTHQUAKE, Moves.WICKED_BLOW ], [Species.FLUTTER_MANE]: [ Moves.MOONLIGHT, Moves.FLAMETHROWER, Moves.EARTH_POWER, Moves.ASTRAL_BARRAGE ], - [Species.SLITHER_WING]: [ Moves.KNOCK_OFF, Moves.VICTORY_DANCE, Moves.FIRE_LASH, Moves.THUNDEROUS_KICK ], + [Species.SLITHER_WING]: [ Moves.MIGHTY_CLEAVE, Moves.THUNDEROUS_KICK, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], [Species.SANDY_SHOCKS]: [ Moves.MORNING_SUN, Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.THUNDERCLAP ], - [Species.IRON_TREADS]: [ Moves.SUPERCELL_SLAM, Moves.BULK_UP, Moves.SHORE_UP, Moves.DOUBLE_IRON_BASH ], - [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.WATER_SPOUT ], + [Species.IRON_TREADS]: [ Moves.FUSION_BOLT, Moves.BULK_UP, Moves.SHORE_UP, Moves.SUNSTEEL_STRIKE ], + [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.STEAM_ERUPTION ], [Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ], [Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], - [Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.HEAT_WAVE, Moves.QUIVER_DANCE, Moves.MALIGNANT_CHAIN ], + [Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.SEARING_SHOT, Moves.QUIVER_DANCE, Moves.MALIGNANT_CHAIN ], [Species.IRON_THORNS]: [ Moves.DIAMOND_STORM, Moves.SHORE_UP, Moves.SHIFT_GEAR, Moves.PLASMA_FISTS ], [Species.FRIGIBAX]: [ Moves.DRAGON_DARTS, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.GLACIAL_LANCE ], - [Species.GIMMIGHOUL]: [ Moves.ARMOR_CANNON, Moves.STORED_POWER, Moves.EARTH_POWER, Moves.ASTRAL_BARRAGE ], + [Species.GIMMIGHOUL]: [ Moves.HAPPY_HOUR, Moves.AURA_SPHERE, Moves.SURF, Moves.ASTRAL_BARRAGE ], [Species.WO_CHIEN]: [ Moves.SPORE, Moves.FIERY_WRATH, Moves.SAPPY_SEED, Moves.STRENGTH_SAP ], [Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.BITTER_BLADE, Moves.GLACIAL_LANCE ], [Species.TING_LU]: [ Moves.SHORE_UP, Moves.WICKED_BLOW, Moves.SAPPY_SEED, Moves.THOUSAND_ARROWS ], - [Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.TORCH_SONG, Moves.ERUPTION ], + [Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.MORNING_SUN, Moves.BLUE_FLARE ], [Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], [Species.IRON_VALIANT]: [ Moves.PLASMA_FISTS, Moves.NO_RETREAT, Moves.SECRET_SWORD, Moves.MAGICAL_TORQUE ], - [Species.KORAIDON]: [ Moves.BITTER_BLADE, Moves.MORNING_SUN, Moves.GLAIVE_RUSH, Moves.CLANGOROUS_SOUL ], - [Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.CLANGOROUS_SOUL, Moves.RISING_VOLTAGE, Moves.DRAGON_ENERGY ], - [Species.WALKING_WAKE]: [ Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.DRAGON_ENERGY ], - [Species.IRON_LEAVES]: [ Moves.SPORE, Moves.U_TURN, Moves.MIGHTY_CLEAVE, Moves.BITTER_BLADE ], + [Species.KORAIDON]: [ Moves.SUNSTEEL_STRIKE, Moves.MORNING_SUN, Moves.DRAGON_DARTS, Moves.BITTER_BLADE ], + [Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.CLANGOROUS_SOUL, Moves.CORE_ENFORCER, Moves.RISING_VOLTAGE ], + [Species.WALKING_WAKE]: [ Moves.CORE_ENFORCER, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE ], + [Species.IRON_LEAVES]: [ Moves.BITTER_BLADE, Moves.U_TURN, Moves.MIGHTY_CLEAVE, Moves.VICTORY_DANCE ], [Species.POLTCHAGEIST]: [ Moves.SHELL_SMASH, Moves.BOUNCY_BUBBLE, Moves.LEECH_SEED, Moves.SPARKLY_SWIRL ], [Species.OKIDOGI]: [ Moves.DRAIN_PUNCH, Moves.KNOCK_OFF, Moves.DIRE_CLAW, Moves.VICTORY_DANCE ], [Species.MUNKIDORI]: [ Moves.PSYSTRIKE, Moves.HEAT_WAVE, Moves.EARTH_POWER, Moves.MALIGNANT_CHAIN ], @@ -543,34 +543,34 @@ export const speciesEggMoves = { [Species.GOUGING_FIRE]: [ Moves.SUPERCELL_SLAM, Moves.BULK_UP, Moves.SACRED_FIRE, Moves.GLAIVE_RUSH ], [Species.RAGING_BOLT]: [ Moves.NASTY_PLOT, Moves.FLAMETHROWER, Moves.MORNING_SUN, Moves.ELECTRO_DRIFT ], [Species.IRON_BOULDER]: [ Moves.PSYBLADE, Moves.KOWTOW_CLEAVE, Moves.STONE_AXE, Moves.BITTER_BLADE ], - [Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PHOTON_GEYSER, Moves.ELECTRO_DRIFT ], + [Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PSYSTRIKE, Moves.ELECTRO_DRIFT ], [Species.TERAPAGOS]: [ Moves.MOONBLAST, Moves.RECOVER, Moves.ICE_BEAM, Moves.SHELL_SMASH ], - [Species.PECHARUNT]: [ Moves.TOXIC_SPIKES, Moves.BODY_PRESS, Moves.HEX, Moves.BANEFUL_BUNKER ], - [Species.ALOLA_RATTATA]: [ Moves.STORM_THROW, Moves.PLAY_ROUGH, Moves.TIDY_UP, Moves.POPULATION_BOMB ], + [Species.PECHARUNT]: [ Moves.TAKE_HEART, Moves.BODY_PRESS, Moves.SAPPY_SEED, Moves.KINGS_SHIELD ], + [Species.ALOLA_RATTATA]: [ Moves.FALSE_SURRENDER, Moves.PSYCHIC_FANGS, Moves.COIL, Moves.EXTREME_SPEED ], [Species.ALOLA_SANDSHREW]: [ Moves.SPIKY_SHIELD, Moves.AQUA_CUTTER, Moves.SHIFT_GEAR, Moves.GLACIAL_LANCE ], - [Species.ALOLA_VULPIX]: [ Moves.MOONBLAST, Moves.PARTING_SHOT, Moves.FLAMETHROWER, Moves.FREEZY_FROST ], + [Species.ALOLA_VULPIX]: [ Moves.MOONBLAST, Moves.PARTING_SHOT, Moves.FLAMETHROWER, Moves.REVIVAL_BLESSING ], [Species.ALOLA_DIGLETT]: [ Moves.THOUSAND_WAVES, Moves.SWORDS_DANCE, Moves.TRIPLE_DIVE, Moves.MOUNTAIN_GALE ], [Species.ALOLA_MEOWTH]: [ Moves.BADDY_BAD, Moves.BUZZY_BUZZ, Moves.PARTING_SHOT, Moves.MAKE_IT_RAIN ], - [Species.ALOLA_GEODUDE]: [ Moves.HIGH_HORSEPOWER, Moves.BULK_UP, Moves.STONE_AXE, Moves.EXTREME_SPEED ], - [Species.ALOLA_GRIMER]: [ Moves.SUCKER_PUNCH, Moves.DIRE_CLAW, Moves.STRENGTH_SAP, Moves.SURGING_STRIKES ], - [Species.ETERNAL_FLOETTE]: [ Moves.FIERY_DANCE, Moves.CHLOROBLAST, Moves.POLLEN_PUFF, Moves.QUIVER_DANCE ], + [Species.ALOLA_GEODUDE]: [ Moves.THOUSAND_WAVES, Moves.BULK_UP, Moves.STONE_AXE, Moves.EXTREME_SPEED ], + [Species.ALOLA_GRIMER]: [ Moves.SUCKER_PUNCH, Moves.BARB_BARRAGE, Moves.STRENGTH_SAP, Moves.SURGING_STRIKES ], + [Species.ETERNAL_FLOETTE]: [ Moves.MIND_BLOWN, Moves.CHLOROBLAST, Moves.PHOTON_GEYSER, Moves.QUIVER_DANCE ], [Species.GALAR_MEOWTH]: [ Moves.AQUA_CUTTER, Moves.KNOCK_OFF, Moves.BULLET_PUNCH, Moves.BEHEMOTH_BASH ], - [Species.GALAR_PONYTA]: [ Moves.SPIRIT_BREAK, Moves.EXTREME_SPEED, Moves.FLARE_BLITZ, Moves.PHOTON_GEYSER ], + [Species.GALAR_PONYTA]: [ Moves.MAGICAL_TORQUE, Moves.EXTREME_SPEED, Moves.FLARE_BLITZ, Moves.PHOTON_GEYSER ], [Species.GALAR_SLOWPOKE]: [ Moves.TRICK_ROOM, Moves.BADDY_BAD, Moves.MOONBLAST, Moves.TORCH_SONG ], [Species.GALAR_FARFETCHD]: [ Moves.ROOST, Moves.SACRED_SWORD, Moves.KINGS_SHIELD, Moves.BEHEMOTH_BLADE ], - [Species.GALAR_ARTICUNO]: [ Moves.AURA_SPHERE, Moves.OBLIVION_WING, Moves.ICE_BEAM, Moves.PSYSTRIKE ], + [Species.GALAR_ARTICUNO]: [ Moves.SECRET_SWORD, Moves.NIGHT_DAZE, Moves.ICE_BEAM, Moves.OBLIVION_WING ], [Species.GALAR_ZAPDOS]: [ Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.ROOST, Moves.BOLT_BEAK ], [Species.GALAR_MOLTRES]: [ Moves.ROOST, Moves.SLUDGE_BOMB, Moves.FLAMETHROWER, Moves.OBLIVION_WING ], - [Species.GALAR_CORSOLA]: [ Moves.SHELL_SMASH, Moves.MOONBLAST, Moves.COSMIC_POWER, Moves.ASTRAL_BARRAGE ], + [Species.GALAR_CORSOLA]: [ Moves.SHELL_SMASH, Moves.AURA_SPHERE, Moves.INFERNAL_PARADE, Moves.ASTRAL_BARRAGE ], [Species.GALAR_ZIGZAGOON]: [ Moves.CEASELESS_EDGE, Moves.FACADE, Moves.PARTING_SHOT, Moves.EXTREME_SPEED ], [Species.GALAR_DARUMAKA]: [ Moves.ICE_SPINNER, Moves.ENDURE, Moves.DRAIN_PUNCH, Moves.V_CREATE ], [Species.GALAR_YAMASK]: [ Moves.STRENGTH_SAP, Moves.DIRE_CLAW, Moves.THOUSAND_WAVES, Moves.SPECTRAL_THIEF ], - [Species.GALAR_STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.EARTHQUAKE, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], + [Species.GALAR_STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.THOUSAND_ARROWS, Moves.STRENGTH_SAP, Moves.DOUBLE_IRON_BASH ], [Species.HISUI_GROWLITHE]: [ Moves.WOOD_HAMMER, Moves.HEAD_SMASH, Moves.MORNING_SUN, Moves.DRAGON_DANCE ], - [Species.HISUI_VOLTORB]: [ Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.RISING_VOLTAGE, Moves.SEED_FLARE ], + [Species.HISUI_VOLTORB]: [ Moves.FROST_BREATH, Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.ELECTRO_DRIFT ], [Species.HISUI_QWILFISH]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.STRENGTH_SAP, Moves.FISHIOUS_REND ], [Species.HISUI_SNEASEL]: [ Moves.THUNDEROUS_KICK, Moves.KNOCK_OFF, Moves.TRIPLE_AXEL, Moves.VICTORY_DANCE ], - [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], + [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.HYPER_VOICE, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], [Species.PALDEA_TAUROS]: [ Moves.NO_RETREAT, Moves.BLAZING_TORQUE, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK ], [Species.PALDEA_WOOPER]: [ Moves.RECOVER, Moves.STONE_AXE, Moves.BANEFUL_BUNKER, Moves.SAPPY_SEED ], [Species.BLOODMOON_URSALUNA]: [ Moves.NASTY_PLOT, Moves.TRICK_ROOM, Moves.THUNDERBOLT, Moves.BOOMBURST ] diff --git a/src/data/egg.ts b/src/data/egg.ts index bb952d71fb0..ce27030ebef 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -2,22 +2,23 @@ import BattleScene from "../battle-scene"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./pokemon-species"; import { VariantTier } from "../enums/variant-tiers"; import * as Utils from "../utils"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { pokemonPrevolutions } from "./pokemon-evolutions"; import { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; -import { EggSourceType } from "#app/enums/egg-source-types.js"; +import { EggSourceType } from "#app/enums/egg-source-types"; export const EGG_SEED = 1073741824; // Rates for specific random properties in 1/x const DEFAULT_SHINY_RATE = 128; const GACHA_SHINY_UP_SHINY_RATE = 64; -const SAME_SPECIES_EGG_SHINY_RATE = 32; -const SAME_SPECIES_EGG_HA_RATE = 16; +const SAME_SPECIES_EGG_SHINY_RATE = 12; +const SAME_SPECIES_EGG_HA_RATE = 8; const MANAPHY_EGG_MANAPHY_RATE = 8; +const GACHA_EGG_HA_RATE = 192; // 1/x for legendary eggs, 1/x*2 for epic eggs, 1/x*4 for rare eggs, and 1/x*8 for common eggs const DEFAULT_RARE_EGGMOVE_RATE = 6; @@ -66,7 +67,7 @@ export interface IEggOptions { export class Egg { //// - // #region Privat properties + // #region Private properties //// private _id: number; @@ -138,51 +139,62 @@ 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 ?? undefined; - // Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced - this._tier = eggOptions.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier()); - // If egg was pulled, check if egg pity needs to override the egg tier - if (eggOptions.pulled) { - // Needs this._tier and this._sourceType to work - this.checkForPityTierOverrides(eggOptions.scene); - } + this._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); + // 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(); + // Override egg tier and hatchwaves if species was given + if (eggOptions?.species) { + this._tier = this.getEggTierFromSpeciesStarterValue(); + this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); + } // If species has no variant, set variantTier to common. This needs to - // be done because species with no variants get filtered at rollSpecies but since the - // species is set the check never happens - if (!getPokemonSpecies(this.species).hasVariants()) { + // 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); - this.addEggToGameData(eggOptions.scene); + // 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); } } //// - // #region Public methodes + // #region Public methods //// public isManaphyEgg(): boolean { @@ -199,32 +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); - } + let ret: PlayerPokemon; - const pokemonSpecies = getPokemonSpecies(this._species); + 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 if the same species egg hits the chance - let abilityIndex = undefined; - if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility - || (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)))) { - abilityIndex = pokemonSpecies.ability2 ? 2 : 1; - } + 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; } @@ -273,6 +299,9 @@ export class Egg { return i18next.t("egg:gachaTypeShiny"); case EggSourceType.GACHA_MOVE: return i18next.t("egg:gachaTypeMove"); + default: + console.warn("getEggTypeDescriptor case not defined. Returning default empty string"); + return ""; } } @@ -281,7 +310,7 @@ export class Egg { //// //// - // #region Private methodes + // #region Private methods //// private rollEggMoveIndex() { @@ -322,9 +351,9 @@ export class Egg { return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; } - private rollSpecies(scene: BattleScene): Species { + private rollSpecies(scene: BattleScene): Species | null { if (!scene) { - return undefined; + return null; } /** * Manaphy eggs have a 1/8 chance of being Manaphy and 7/8 chance of being Phione @@ -389,19 +418,18 @@ export class Egg { * 2 cost mons get 1.5x * 4, 6, 8 cost mons get 1.75x * 3, 5, 7, 9 cost mons get 1x - * Alolan, Galarian, and Paldean mons get 0.5x - * Hisui mons get 0.125x + * Alolan, Galarian, Hisui, and Paldean mons get 0.5x * * The total weight is also being calculated EACH time there is an egg hatch instead of being generated once * and being the same each time */ let totalWeight = 0; - const speciesWeights = []; + const speciesWeights : number[] = []; for (const speciesId of speciesPool) { let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); const species = getPokemonSpecies(speciesId); if (species.isRegional()) { - weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); + weight = Math.floor(weight / 2); } speciesWeights.push(totalWeight + weight); totalWeight += weight; @@ -416,6 +444,7 @@ export class Egg { break; } } + species = species!; // tell TS compiled it's defined now! if (!!scene.gameData.dexData[species].caughtAttr || scene.gameData.eggs.some(e => e.species === species)) { scene.gameData.unlockPity[this.tier] = Math.min(scene.gameData.unlockPity[this.tier] + 1, 10); @@ -513,6 +542,8 @@ export class Egg { if (speciesStartValue >= 8) { return EggTier.MASTER; } + + return EggTier.COMMON; } //// @@ -537,6 +568,7 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta scene.executeWithSeedOffset(() => { ret = Phaser.Math.RND.shuffle(legendarySpecies)[index]; }, offset, EGG_SEED.toString()); + ret = ret!; // tell TS compiler it's return ret; } diff --git a/src/data/move.ts b/src/data/move.ts index 54027886dca..cfd75591f93 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,22 +1,18 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; -import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; -import { BattleStat, getBattleStatName } from "./battle-stat"; -import { EncoreTag, SemiInvulnerableTag } from "./battler-tags"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +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 { Type } from "./type"; +import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects } from "./status-effect"; +import { getTypeDamageMultiplier, Type } from "./type"; import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { WeatherType } from "./weather"; -import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; -import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr } from "./ability"; +import { ArenaTagSide, ArenaTrapTag, WeakenMoveTypeTag } from "./arena-tag"; +import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, WonderSkinAbAttr, applyPreAttackAbAttrs, MoveTypeChangeAbAttr, UserFieldMoveTypePowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AllyMoveCategoryPowerBoostAbAttr, VariableMovePowerAbAttr } from "./ability"; import { allAbilities } from "./ability"; -import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier } from "../modifier/modifier"; -import { BattlerIndex } from "../battle"; -import { Stat } from "./pokemon-stat"; +import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier, PokemonMoveAccuracyBoosterModifier, AttackTypeBoosterModifier, PokemonMultiHitModifier } from "../modifier/modifier"; +import { BattlerIndex, BattleType } from "../battle"; import { TerrainType } from "./terrain"; -import { SpeciesFormChangeActiveTrigger } from "./pokemon-forms"; import { ModifierPoolType } from "#app/modifier/modifier-type"; import { Command } from "../ui/command-ui-handler"; import i18next from "i18next"; @@ -28,6 +24,21 @@ import { BattlerTagType } from "#enums/battler-tag-type"; 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 { 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, @@ -92,6 +103,10 @@ export enum MoveFlags { * Enables all hits of a multi-hit move to be accuracy checked individually */ CHECK_ALL_HITS = 1 << 17, + /** + * Indicates a move is able to be redirected to allies in a double battle if the attacker faints + */ + REDIRECT_COUNTER = 1 << 18, } type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; @@ -100,9 +115,8 @@ type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; export default class Move implements Localizable { public id: Moves; public name: string; - public type: Type; - public defaultType: Type; - public category: MoveCategory; + private _type: Type; + private _category: MoveCategory; public moveTarget: MoveTarget; public power: integer; public accuracy: integer; @@ -120,9 +134,8 @@ export default class Move implements Localizable { this.id = id; this.nameAppend = ""; - this.type = type; - this.defaultType = type; - this.category = category; + this._type = type; + this._category = category; this.moveTarget = defaultMoveTarget; this.power = power; this.accuracy = accuracy; @@ -145,6 +158,13 @@ export default class Move implements Localizable { this.localize(); } + get type() { + return this._type; + } + get category() { + return this._category; + } + localize(): void { const i18nKey = Moves[this.id].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join("") as unknown as string; @@ -176,7 +196,7 @@ export default class Move implements Localizable { * @returns the first {@linkcode MoveAttr} element in attrs that makes the input function return true */ findAttr(attrPredicate: (attr: MoveAttr) => boolean): MoveAttr { - return this.attrs.find(attrPredicate); + return this.attrs.find(attrPredicate)!; // TODO: is the bang correct? } /** @@ -357,7 +377,7 @@ export default class Move implements Localizable { * @param makesContact The value (boolean) to set the flag to * @returns The {@linkcode Move} that called this function */ - makesContact(makesContact?: boolean): this { + makesContact(makesContact: boolean = true): this { // TODO: is true the correct default? this.setFlag(MoveFlags.MAKES_CONTACT, makesContact); return this; } @@ -368,7 +388,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.CURSE} * @returns The {@linkcode Move} that called this function */ - ignoresProtect(ignoresProtect?: boolean): this { + ignoresProtect(ignoresProtect: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.IGNORE_PROTECT, ignoresProtect); return this; } @@ -379,7 +399,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.NATURE_POWER} * @returns The {@linkcode Move} that called this function */ - ignoresVirtual(ignoresVirtual?: boolean): this { + ignoresVirtual(ignoresVirtual: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.IGNORE_VIRTUAL, ignoresVirtual); return this; } @@ -390,7 +410,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.UPROAR} * @returns The {@linkcode Move} that called this function */ - soundBased(soundBased?: boolean): this { + soundBased(soundBased: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.SOUND_BASED, soundBased); return this; } @@ -401,7 +421,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.TELEPORT} * @returns The {@linkcode Move} that called this function */ - hidesUser(hidesUser?: boolean): this { + hidesUser(hidesUser: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.HIDE_USER, hidesUser); return this; } @@ -412,7 +432,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.WHIRLWIND} * @returns The {@linkcode Move} that called this function */ - hidesTarget(hidesTarget?: boolean): this { + hidesTarget(hidesTarget: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.HIDE_TARGET, hidesTarget); return this; } @@ -423,7 +443,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.BITE} * @returns The {@linkcode Move} that called this function */ - bitingMove(bitingMove?: boolean): this { + bitingMove(bitingMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.BITING_MOVE, bitingMove); return this; } @@ -434,7 +454,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.WATER_PULSE} * @returns The {@linkcode Move} that called this function */ - pulseMove(pulseMove?: boolean): this { + pulseMove(pulseMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.PULSE_MOVE, pulseMove); return this; } @@ -445,7 +465,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.DRAIN_PUNCH} * @returns The {@linkcode Move} that called this function */ - punchingMove(punchingMove?: boolean): this { + punchingMove(punchingMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.PUNCHING_MOVE, punchingMove); return this; } @@ -456,7 +476,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.X_SCISSOR} * @returns The {@linkcode Move} that called this function */ - slicingMove(slicingMove?: boolean): this { + slicingMove(slicingMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.SLICING_MOVE, slicingMove); return this; } @@ -467,7 +487,7 @@ export default class Move implements Localizable { * @param recklessMove The value to set the flag to * @returns The {@linkcode Move} that called this function */ - recklessMove(recklessMove?: boolean): this { + recklessMove(recklessMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.RECKLESS_MOVE, recklessMove); return this; } @@ -478,7 +498,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.ELECTRO_BALL} * @returns The {@linkcode Move} that called this function */ - ballBombMove(ballBombMove?: boolean): this { + ballBombMove(ballBombMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.BALLBOMB_MOVE, ballBombMove); return this; } @@ -489,7 +509,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.STUN_SPORE} * @returns The {@linkcode Move} that called this function */ - powderMove(powderMove?: boolean): this { + powderMove(powderMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.POWDER_MOVE, powderMove); return this; } @@ -500,7 +520,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.PETAL_DANCE} * @returns The {@linkcode Move} that called this function */ - danceMove(danceMove?: boolean): this { + danceMove(danceMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.DANCE_MOVE, danceMove); return this; } @@ -511,7 +531,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.HURRICANE} * @returns The {@linkcode Move} that called this function */ - windMove(windMove?: boolean): this { + windMove(windMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.WIND_MOVE, windMove); return this; } @@ -522,7 +542,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.ABSORB} * @returns The {@linkcode Move} that called this function */ - triageMove(triageMove?: boolean): this { + triageMove(triageMove: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.TRIAGE_MOVE, triageMove); return this; } @@ -533,7 +553,7 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.SUNSTEEL_STRIKE} * @returns The {@linkcode Move} that called this function */ - ignoresAbilities(ignoresAbilities?: boolean): this { + ignoresAbilities(ignoresAbilities: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.IGNORE_ABILITIES, ignoresAbilities); return this; } @@ -544,11 +564,22 @@ export default class Move implements Localizable { * example: @see {@linkcode Moves.TRIPLE_AXEL} * @returns The {@linkcode Move} that called this function */ - checkAllHits(checkAllHits?: boolean): this { + checkAllHits(checkAllHits: boolean = true): this { // TODO: is `true` the correct default? this.setFlag(MoveFlags.CHECK_ALL_HITS, checkAllHits); return this; } + /** + * Sets the {@linkcode MoveFlags.REDIRECT_COUNTER} flag for the calling Move + * @param redirectCounter The value (boolean) to set the flag to + * example: @see {@linkcode Moves.METAL_BURST} + * @returns The {@linkcode Move} that called this function + */ + redirectCounter(redirectCounter: boolean = true): this { // TODO: is `true` the correct default? + this.setFlag(MoveFlags.REDIRECT_COUNTER, redirectCounter); + return this; + } + /** * Checks if the move flag applies to the pokemon(s) using/receiving the move * @param flag {@linkcode MoveFlags} MoveFlag to check on user and/or target @@ -556,7 +587,7 @@ export default class Move implements Localizable { * @param target {@linkcode Pokemon} the Pokemon receiving the move * @returns boolean */ - checkFlag(flag: MoveFlags, user: Pokemon, target: Pokemon): boolean { + checkFlag(flag: MoveFlags, user: Pokemon, target: Pokemon | null): boolean { // special cases below, eg: if the move flag is MAKES_CONTACT, and the user pokemon has an ability that ignores contact (like "Long Reach"), then overrides and move does not make contact switch (flag) { case MoveFlags.MAKES_CONTACT: @@ -567,16 +598,18 @@ export default class Move implements Localizable { case MoveFlags.IGNORE_ABILITIES: if (user.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) { const abilityEffectsIgnored = new Utils.BooleanHolder(false); - applyAbAttrs(MoveAbilityBypassAbAttr, user, abilityEffectsIgnored, this); + applyAbAttrs(MoveAbilityBypassAbAttr, user, abilityEffectsIgnored, false, this); if (abilityEffectsIgnored.value) { return true; } } + break; case MoveFlags.IGNORE_PROTECT: if (user.hasAbilityWithAttr(IgnoreProtectOnContactAbAttr) && this.checkFlag(MoveFlags.MAKES_CONTACT, user, target)) { return true; } + break; } return !!(this.flags & flag); @@ -655,6 +688,114 @@ export default class Move implements Localizable { return score; } + + /** + * Calculates the accuracy of a move in battle based on various conditions and attributes. + * + * @param user {@linkcode Pokemon} The Pokémon using the move. + * @param target {@linkcode Pokemon} The Pokémon being targeted by the move. + * @returns The calculated accuracy of the move. + */ + calculateBattleAccuracy(user: Pokemon, target: Pokemon, simulated: boolean = false) { + const moveAccuracy = new Utils.NumberHolder(this.accuracy); + + applyMoveAttrs(VariableAccuracyAttr, user, target, this, moveAccuracy); + applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this, { value: false }, simulated, moveAccuracy); + + if (moveAccuracy.value === -1) { + return moveAccuracy.value; + } + + const isOhko = this.hasAttr(OneHitKOAccuracyAttr); + + if (!isOhko) { + user.scene.applyModifiers(PokemonMoveAccuracyBoosterModifier, user.isPlayer(), user, moveAccuracy); + } + + if (user.scene.arena.weather?.weatherType === WeatherType.FOG) { + /** + * The 0.9 multiplier is PokeRogue-only implementation, Bulbapedia uses 3/5 + * See Fog {@link https://bulbapedia.bulbagarden.net/wiki/Fog} + */ + moveAccuracy.value = Math.floor(moveAccuracy.value * 0.9); + } + + if (!isOhko && user.scene.arena.getTag(ArenaTagType.GRAVITY)) { + moveAccuracy.value = Math.floor(moveAccuracy.value * 1.67); + } + + return moveAccuracy.value; + } + + /** + * Calculates the power of a move in battle based on various conditions and attributes. + * + * @param source {@linkcode Pokemon} The Pokémon using the move. + * @param target {@linkcode Pokemon} The Pokémon being targeted by the move. + * @returns The calculated power of the move. + */ + calculateBattlePower(source: Pokemon, target: Pokemon, simulated: boolean = false): number { + if (this.category === MoveCategory.STATUS) { + return -1; + } + + const power = new Utils.NumberHolder(this.power); + const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1); + + applyPreAttackAbAttrs(MoveTypeChangeAbAttr, source, target, this, true, null, typeChangeMovePowerMultiplier); + + const sourceTeraType = source.getTeraType(); + if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !source.scene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { + power.value = 60; + } + + applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, target, this, simulated, power); + + if (source.getAlly()) { + applyPreAttackAbAttrs(AllyMoveCategoryPowerBoostAbAttr, source.getAlly(), target, this, simulated, power); + } + + const fieldAuras = new Set( + source.scene.getField(true) + .map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr).filter(attr => { + const condition = attr.getCondition(); + return (!condition || condition(p)); + }) as FieldMoveTypePowerBoostAbAttr[]) + .flat(), + ); + for (const aura of fieldAuras) { + aura.applyPreAttack(source, null, simulated, target, this, [power]); + } + + const alliedField: Pokemon[] = source instanceof PlayerPokemon ? source.scene.getPlayerField() : source.scene.getEnemyField(); + alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, target, this, simulated, power)); + + power.value *= typeChangeMovePowerMultiplier.value; + + const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === this.type) as TypeBoostTag; + if (typeBoost) { + power.value *= typeBoost.boostValue; + } + + if (source.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() && this.type === Type.GROUND && this.moveTarget === MoveTarget.ALL_NEAR_OTHERS) { + power.value /= 2; + } + + applyMoveAttrs(VariablePowerAttr, source, target, this, power); + + source.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); + + if (!this.hasAttr(TypelessAttr)) { + source.scene.arena.applyTags(WeakenMoveTypeTag, this.type, power); + source.scene.applyModifiers(AttackTypeBoosterModifier, source.isPlayer(), source, this.type, power); + } + + if (source.getTag(HelpingHandTag)) { + power.value *= 1.5; + } + + return power.value; + } } export class AttackMove extends Move { @@ -679,10 +820,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) { @@ -690,10 +831,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) { @@ -749,7 +890,7 @@ export abstract class MoveAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean | Promise { return true; } @@ -757,7 +898,7 @@ export abstract class MoveAttr { * @virtual * @returns the {@linkcode MoveCondition} or {@linkcode MoveConditionFunc} for this {@linkcode Move} */ - getCondition(): MoveCondition | MoveConditionFunc { + getCondition(): MoveCondition | MoveConditionFunc | null { return null; } @@ -833,14 +974,14 @@ export class MoveEffectAttr extends MoveAttr { * @param args Set of unique arguments needed by this attribute * @returns true if basic application of the ability attribute should be possible */ - canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) { + canApply(user: Pokemon, target: Pokemon, move: Move, args?: any[]) { return !! (this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp) && (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.checkFlag(MoveFlags.IGNORE_PROTECT, user, target)); } /** Applies move effects so long as they are able based on {@linkcode canApply} */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { return this.canApply(user, target, move, args); } @@ -853,14 +994,86 @@ export class MoveEffectAttr extends MoveAttr { * @param selfEffect {@linkcode Boolean} if move targets user. * @returns Move chance value. */ - getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean): integer { + getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): integer { const moveChance = new Utils.NumberHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, moveChance, move, target, selfEffect); - applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr,target,user,null,null, moveChance); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, moveChance, move, target, selfEffect, showAbility); + if (!selfEffect) { + applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, false, moveChance); + } return moveChance.value; } } +/** + * Base class defining all Move Header attributes. + * Move Header effects apply at the beginning of a turn before any moves are resolved. + * They can be used to apply effects to the field (e.g. queueing a message) or to the user + * (e.g. adding a battler tag). + */ +export class MoveHeaderAttr extends MoveAttr { + constructor() { + super(true); + } +} + +/** + * Header attribute to queue a message at the beginning of a turn. + * @see {@link MoveHeaderAttr} + */ +export class MessageHeaderAttr extends MoveHeaderAttr { + private message: string | ((user: Pokemon, move: Move) => string); + + constructor(message: string | ((user: Pokemon, move: Move) => string)) { + super(); + this.message = message; + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const message = typeof this.message === "string" + ? this.message + : this.message(user, move); + + if (message) { + user.scene.queueMessage(message); + return true; + } + return false; + } +} + +/** + * Header attribute to add a battler tag to the user at the beginning of a turn. + * @see {@linkcode MoveHeaderAttr} + */ +export class AddBattlerTagHeaderAttr extends MoveHeaderAttr { + private tagType: BattlerTagType; + + constructor(tagType: BattlerTagType) { + super(); + this.tagType = tagType; + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + user.addTag(this.tagType); + return true; + } +} + +/** + * Header attribute to implement the "charge phase" of Beak Blast at the + * beginning of a turn. + * @see {@link https://bulbapedia.bulbagarden.net/wiki/Beak_Blast_(move) | Beak Blast} + * @see {@linkcode BeakBlastChargingTag} + */ +export class BeakBlastHeaderAttr extends AddBattlerTagHeaderAttr { + /** Required to initialize Beak Blast's charge animation correctly */ + public chargeAnim = ChargeAnim.BEAK_BLAST_CHARGING; + + constructor() { + super(BattlerTagType.BEAK_BLAST_CHARGING); + } +} + export class PreMoveMessageAttr extends MoveAttr { private message: string | ((user: Pokemon, target: Pokemon, move: Move) => string); @@ -881,19 +1094,16 @@ export class PreMoveMessageAttr extends MoveAttr { } } -export class StatusMoveTypeImmunityAttr extends MoveAttr { - public immuneType: Type; +/** + * Attribute for Status moves that take attack type effectiveness + * into consideration (i.e. {@linkcode https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) | Thunder Wave}) + * @extends MoveAttr + */ +export class RespectAttackTypeImmunityAttr extends MoveAttr { } - constructor(immuneType: Type) { - super(false); - - this.immuneType = immuneType; - } -} - -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; } @@ -961,7 +1171,7 @@ export class TargetHalfHpDamageAttr extends FixedDamageAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = Math.max(Math.floor(target.hp / 2), 1); + (args[0] as Utils.IntegerHolder).value = Utils.toDmgValue(target.hp / 2); return true; } @@ -1007,7 +1217,7 @@ export class CounterDamageAttr extends FixedDamageAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const damage = user.turnData.attacksReceived.filter(ar => this.moveFilter(allMoves[ar.move])).reduce((total: integer, ar: AttackMoveResult) => total + ar.damage, 0); - (args[0] as Utils.IntegerHolder).value = Math.floor(Math.max(damage * this.multiplier, 1)); + (args[0] as Utils.IntegerHolder).value = Utils.toDmgValue(damage * this.multiplier); return true; } @@ -1033,7 +1243,7 @@ export class RandomLevelDamageAttr extends FixedDamageAttr { } getDamage(user: Pokemon, target: Pokemon, move: Move): number { - return Math.max(Math.floor(user.level * (user.randSeedIntRange(50, 150) * 0.01)), 1); + return Utils.toDmgValue(user.level * (user.randSeedIntRange(50, 150) * 0.01)); } } @@ -1085,25 +1295,26 @@ export class RecoilAttr extends MoveEffectAttr { const cancelled = new Utils.BooleanHolder(false); if (!this.unblockable) { applyAbAttrs(BlockRecoilDamageAttr, user, cancelled); + applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); } if (cancelled.value) { return false; } - const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio), - user.turnData.damageDealt ? 1 : 0); + const damageValue = (!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio; + const minValue = user.turnData.damageDealt ? 1 : 0; + const recoilDamage = Utils.toDmgValue(damageValue, minValue); if (!recoilDamage) { return false; } - applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); if (cancelled.value) { return false; } user.damageAndUpdate(recoilDamage, HitResult.OTHER, false, true, true); - user.scene.queueMessage(getPokemonMessage(user, " is hit\nwith recoil!")); + user.scene.queueMessage(i18next.t("moveTriggers:hitWithRecoil", {pokemonName: getPokemonNameWithAffix(user)})); user.turnData.damageTaken += recoilDamage; return true; @@ -1155,7 +1366,7 @@ export class SacrificialAttr extends MoveEffectAttr { **/ export class SacrificialAttrOnHit extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.POST_TARGET); + super(true, MoveEffectTrigger.HIT); } /** @@ -1214,8 +1425,8 @@ export class HalfSacrificialAttr extends MoveEffectAttr { // Check to see if the Pokemon has an ability that blocks non-direct damage applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); if (!cancelled.value) { - user.damageAndUpdate(Math.ceil(user.getMaxHp()/2), HitResult.OTHER, false, true, true); - user.scene.queueMessage(getPokemonMessage(user, " cut its own HP to power up its move!")); // Queue recoil message + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp()/2), HitResult.OTHER, false, true, true); + user.scene.queueMessage(i18next.t("moveTriggers:cutHpPowerUpMove", {pokemonName: getPokemonNameWithAffix(user)})); // Queue recoil message } return true; } @@ -1265,7 +1476,7 @@ export class HealAttr extends MoveEffectAttr { */ addHealPhase(target: Pokemon, healRatio: number) { target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, " \nhad its HP restored."), true, !this.showAnim)); + Utils.toDmgValue(target.getMaxHp() * healRatio), i18next.t("moveTriggers:healHp", {pokemonName: getPokemonNameWithAffix(target)}), true, !this.showAnim)); } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { @@ -1285,10 +1496,10 @@ export class PartyStatusCureAttr extends MoveEffectAttr { /** Skips mons with this ability, ie. Soundproof */ private abilityCondition: Abilities; - constructor(message: string, abilityCondition: Abilities) { + constructor(message: string | null, abilityCondition: Abilities) { super(); - this.message = message; + this.message = message!; // TODO: is this bang correct? this.abilityCondition = abilityCondition; } @@ -1305,6 +1516,7 @@ export class PartyStatusCureAttr extends MoveEffectAttr { return false; } this.addPartyCurePhase(user); + return true; } addPartyCurePhase(user: Pokemon) { @@ -1312,6 +1524,39 @@ export class PartyStatusCureAttr extends MoveEffectAttr { } } +/** + * Applies damage to the target's ally equal to 1/16 of that ally's max HP. + * @extends MoveEffectAttr + */ +export class FlameBurstAttr extends MoveEffectAttr { + /** + * @param user - n/a + * @param target - The target Pokémon. + * @param move - n/a + * @param args - n/a + * @returns A boolean indicating whether the effect was successfully applied. + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + const targetAlly = target.getAlly(); + const cancelled = new Utils.BooleanHolder(false); + + if (targetAlly) { + applyAbAttrs(BlockNonDirectDamageAbAttr, targetAlly, cancelled); + } + + if (cancelled.value || !targetAlly) { + return false; + } + + targetAlly.damageAndUpdate(Math.max(1, Math.floor(1/16 * targetAlly.getMaxHp())), HitResult.OTHER); + return true; + } + + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + return target.getAlly() ? -5 : 0; + } +} + export class SacrificialFullRestoreAttr extends SacrificialAttr { constructor() { super(); @@ -1326,7 +1571,7 @@ export class SacrificialFullRestoreAttr extends SacrificialAttr { const maxPartyMemberHp = user.scene.getParty().map(p => p.getMaxHp()).reduce((maxHp: integer, hp: integer) => Math.max(hp, maxHp), 0); user.scene.pushPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), - maxPartyMemberHp, getPokemonMessage(user, "'s Healing Wish\nwas granted!"), true, false, false, true), true); + maxPartyMemberHp, i18next.t("moveTriggers:sacrificialFullRestore", {pokemonName: getPokemonNameWithAffix(user)}), true, false, false, true), true); return true; } @@ -1427,16 +1672,16 @@ export class SandHealAttr extends WeatherHealAttr { */ export class BoostHealAttr extends HealAttr { /** Healing received when {@linkcode condition} is false */ - private normalHealRatio?: number; + private normalHealRatio: number; /** Healing received when {@linkcode condition} is true */ - private boostedHealRatio?: number; + private boostedHealRatio: number; /** The lambda expression to check against when boosting the healing value */ private condition?: MoveConditionFunc; constructor(normalHealRatio?: number, boostedHealRatio?: number, showAnim?: boolean, selfTarget?: boolean, condition?: MoveConditionFunc) { super(normalHealRatio, showAnim, selfTarget); - this.normalHealRatio = normalHealRatio; - this.boostedHealRatio = boostedHealRatio; + this.normalHealRatio = normalHealRatio!; // TODO: is this bang correct? + this.boostedHealRatio = boostedHealRatio!; // TODO: is this bang correct? this.condition = condition; } @@ -1448,7 +1693,7 @@ export class BoostHealAttr extends HealAttr { * @returns true if the move was successful */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const healRatio = this.condition(user, target, move) ? this.boostedHealRatio : this.normalHealRatio; + const healRatio: number = (this.condition ? this.condition(user, target, move) : false) ? this.boostedHealRatio : this.normalHealRatio; this.addHealPhase(target, healRatio); return true; } @@ -1486,14 +1731,13 @@ export class HealOnAllyAttr extends HealAttr { */ export class HitHealAttr extends MoveEffectAttr { private healRatio: number; - private message: string; - private healStat: Stat; + private healStat: EffectiveStat | null; - constructor(healRatio?: number, healStat?: Stat) { + constructor(healRatio?: number | null, healStat?: EffectiveStat) { super(true, MoveEffectTrigger.HIT); - this.healRatio = healRatio || 0.5; - this.healStat = healStat || null; + this.healRatio = healRatio ?? 0.5; + this.healStat = healStat ?? null; } /** * Heals the user the determined amount and possibly displays a message about regaining health. @@ -1509,19 +1753,24 @@ export class HitHealAttr extends MoveEffectAttr { let healAmount = 0; let message = ""; const reverseDrain = target.hasAbilityWithAttr(ReverseDrainAbAttr, false); - if (this.healStat) { + if (this.healStat !== null) { // Strength Sap formula - healAmount = target.getBattleStat(this.healStat); - message = i18next.t("battle:drainMessage", {pokemonName: target.name}); + 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. - healAmount = Math.max(Math.floor(user.turnData.currDamageDealt * this.healRatio), 1); - message = i18next.t("battle:regainHealth", {pokemonName: user.name}); + healAmount = Utils.toDmgValue(user.turnData.currDamageDealt * this.healRatio); + message = i18next.t("battle:regainHealth", {pokemonName: getPokemonNameWithAffix(user)}); } if (reverseDrain) { - user.turnData.damageTaken += healAmount; - healAmount = healAmount * -1; - message = null; + if (user.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + healAmount = 0; + message = ""; + } else { + user.turnData.damageTaken += healAmount; + healAmount = healAmount * -1; + message = ""; + } } user.scene.unshiftPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), healAmount, message, false, true)); return true; @@ -1536,7 +1785,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)); @@ -1609,18 +1858,11 @@ export class MultiHitAttr extends MoveAttr { * @returns True */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - let hitTimes: integer; + const hitType = new Utils.NumberHolder(this.multiHitType); + applyMoveAttrs(ChangeMultiHitTypeAttr, user, target, move, hitType); + this.multiHitType = hitType.value; - if (target.getAttackMoveEffectiveness(user, new PokemonMove(move.id)) === 0) { - // If there is a type immunity, the attack will stop no matter what - hitTimes = 1; - } else { - const hitType = new Utils.IntegerHolder(this.multiHitType); - applyMoveAttrs(ChangeMultiHitTypeAttr, user, target, move, hitType); - hitTimes = this.getHitCount(user, target); - } - - (args[0] as Utils.IntegerHolder).value = hitTimes; + (args[0] as Utils.NumberHolder).value = this.getHitCount(user, target); return true; } @@ -1642,7 +1884,7 @@ export class MultiHitAttr extends MoveAttr { { const rand = user.randSeedInt(16); const hitValue = new Utils.IntegerHolder(rand); - applyAbAttrs(MaxMultiHitAbAttr, user, null, hitValue); + applyAbAttrs(MaxMultiHitAbAttr, user, null, false, hitValue); if (hitValue.value >= 10) { return 2; } else if (hitValue.value >= 4) { @@ -1655,13 +1897,10 @@ export class MultiHitAttr extends MoveAttr { } case MultiHitType._2: return 2; - break; case MultiHitType._3: return 3; - break; case MultiHitType._10: return 10; - break; case MultiHitType.BEAT_UP: const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); // No status means the ally pokemon can contribute to Beat Up @@ -1691,19 +1930,19 @@ export class WaterShurikenMultiHitTypeAttr extends ChangeMultiHitTypeAttr { export class StatusEffectAttr extends MoveEffectAttr { public effect: StatusEffect; - public cureTurn: integer; + public cureTurn: integer | null; public overrideStatus: boolean; constructor(effect: StatusEffect, selfTarget?: boolean, cureTurn?: integer, overrideStatus?: boolean) { super(selfTarget, MoveEffectTrigger.HIT); this.effect = effect; - this.cureTurn = cureTurn; + this.cureTurn = cureTurn!; // TODO: is this bang correct? this.overrideStatus = !!overrideStatus; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); const statusCheck = moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance; if (statusCheck) { const pokemon = this.selfTarget ? user : target; @@ -1714,9 +1953,16 @@ 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,this.effect); + applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, move, null, false, this.effect); return true; } } @@ -1724,7 +1970,7 @@ export class StatusEffectAttr extends MoveEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const moveChance = this.getMoveChance(user, target, move, this.selfTarget, false); return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(moveChance * -0.1) : 0; } } @@ -1744,7 +1990,7 @@ export class MultiStatusEffectAttr extends StatusEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const moveChance = this.getMoveChance(user, target, move, this.selfTarget, false); return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(moveChance * -0.1) : 0; } } @@ -1755,16 +2001,19 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const statusToApply: StatusEffect = user.status?.effect; + const statusToApply: StatusEffect | undefined = user.status?.effect ?? (user.hasAbility(Abilities.COMATOSE) ? StatusEffect.SLEEP : undefined); if (target.status) { return false; } - if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { + //@ts-ignore - how can target.status.effect be checked when we return `false` before when it's defined? + if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { // TODO: resolve ts-ignore const canSetStatus = target.canSetStatus(statusToApply, true, false, user); if (canSetStatus) { - user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user))); + if (user.status) { + user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user))); + } user.resetStatus(); user.updateInfo(); target.trySetStatus(statusToApply, true, user); @@ -1799,15 +2048,15 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { if (rand >= this.chance) { return resolve(false); } - const heldItems = this.getTargetHeldItems(target).filter(i => i.getTransferrable(false)); + const heldItems = this.getTargetHeldItems(target).filter(i => i.isTransferrable); if (heldItems.length) { const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; - const highestItemTier = heldItems.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier, highestTier), 0); + const highestItemTier = heldItems.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? const tierHeldItems = heldItems.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; user.scene.tryTransferHeldItemModifier(stolenItem, user, false).then(success => { if (success) { - user.scene.queueMessage(getPokemonMessage(user, ` stole\n${target.name}'s ${stolenItem.type.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:stoleItem", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name})); } resolve(success); }); @@ -1820,7 +2069,7 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { @@ -1860,7 +2109,6 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { * @returns {boolean} True if an item was removed */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!this.berriesOnly && target.isPlayer()) { // "Wild Pokemon cannot knock off Player Pokemon's held items" (See Bulbapedia) return false; } @@ -1873,7 +2121,8 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { } // Considers entire transferrable item pool by default (Knock Off). Otherwise berries only if specified (Incinerate). - let heldItems = this.getTargetHeldItems(target).filter(i => i.getTransferrable(false)); + let heldItems = this.getTargetHeldItems(target).filter(i => i.isTransferrable); + if (this.berriesOnly) { heldItems = heldItems.filter(m => m instanceof BerryModifier && m.pokemonId === target.id, target.isPlayer()); } @@ -1886,9 +2135,9 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { target.scene.updateModifiers(target.isPlayer()); if (this.berriesOnly) { - user.scene.queueMessage(getPokemonMessage(user, ` incinerated\n${target.name}'s ${removedItem.type.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:incineratedItem", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name})); } else { - user.scene.queueMessage(getPokemonMessage(user, ` knocked off\n${target.name}'s ${removedItem.type.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:knockedOffItem", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name})); } } @@ -1897,7 +2146,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { @@ -1915,10 +2164,9 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { * Attribute that causes targets of the move to eat a berry. Used for Teatime, Stuff Cheeks */ export class EatBerryAttr extends MoveEffectAttr { - protected chosenBerry: BerryModifier; + protected chosenBerry: BerryModifier | undefined; constructor() { super(true, MoveEffectTrigger.HIT); - this.chosenBerry = undefined; } /** * Causes the target to eat a berry. @@ -1953,16 +2201,16 @@ export class EatBerryAttr extends MoveEffectAttr { } reduceBerryModifier(target: Pokemon) { - if (this.chosenBerry.stackCount === 1) { + if (this.chosenBerry?.stackCount === 1) { target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); - } else { + } else if (this.chosenBerry !== undefined && this.chosenBerry.stackCount > 1) { this.chosenBerry.stackCount--; } target.scene.updateModifiers(target.isPlayer()); } eatBerry(consumer: Pokemon) { - getBerryEffectFunc(this.chosenBerry.berryType)(consumer); // consumer eats the berry + getBerryEffectFunc(this.chosenBerry!.berryType)(consumer); // consumer eats the berry applyAbAttrs(HealFromBerryUseAbAttr, consumer, new Utils.BooleanHolder(false)); } } @@ -1989,7 +2237,8 @@ export class StealEatBerryAttr extends EatBerryAttr { if (cancelled.value === true) { return false; } - const heldBerries = this.getTargetHeldBerries(target).filter(i => i.getTransferrable(false)); + + const heldBerries = this.getTargetHeldBerries(target); if (heldBerries.length <= 0) { return false; } @@ -2033,6 +2282,12 @@ export class HealStatusEffectAttr extends MoveEffectAttr { return false; } + // Special edge case for shield dust blocking Sparkling Aria curing burn + const moveTargets = getMoveTargets(user, move.id); + if (target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && move.id === Moves.SPARKLING_ARIA && moveTargets.targets.length === 1) { + return false; + } + const pokemon = this.selfTarget ? user : target; if (pokemon.status && this.effects.includes(pokemon.status.effect)) { pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); @@ -2186,29 +2441,26 @@ export class OverrideMoveEffectAttr extends MoveAttr { export class ChargeAttr extends OverrideMoveEffectAttr { public chargeAnim: ChargeAnim; private chargeText: string; - private tagType: BattlerTagType; + private tagType: BattlerTagType | null; private chargeEffect: boolean; - public sameTurn: boolean; - public followUpPriority: integer; + public followUpPriority: integer | null; - constructor(chargeAnim: ChargeAnim, chargeText: string, tagType?: BattlerTagType, chargeEffect: boolean = false, sameTurn: boolean = false, followUpPriority?: integer) { + constructor(chargeAnim: ChargeAnim, chargeText: string, tagType?: BattlerTagType | null, chargeEffect: boolean = false) { super(); this.chargeAnim = chargeAnim; this.chargeText = chargeText; - this.tagType = tagType; + this.tagType = tagType!; // TODO: is this bang correct? this.chargeEffect = chargeEffect; - this.sameTurn = sameTurn; - this.followUpPriority = followUpPriority; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { const lastMove = user.getLastXMoves().find(() => true); - if (!lastMove || lastMove.move !== move.id || (lastMove.result !== MoveResult.OTHER && (this.sameTurn || lastMove.turn !== user.scene.currentBattle.turn))) { + if (!lastMove || lastMove.move !== move.id || (lastMove.result !== MoveResult.OTHER && lastMove.turn !== user.scene.currentBattle.turn)) { (args[0] as Utils.BooleanHolder).value = true; new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { - user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`)); + user.scene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); if (this.tagType) { user.addTag(this.tagType, 1, move.id, user.id); } @@ -2217,9 +2469,6 @@ export class ChargeAttr extends OverrideMoveEffectAttr { } user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true }); - if (this.sameTurn) { - user.scene.pushMovePhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], user.moveset.find(m => m.moveId === move.id), true), this.followUpPriority); - } user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); resolve(true); }); @@ -2230,7 +2479,7 @@ export class ChargeAttr extends OverrideMoveEffectAttr { }); } - usedChargeEffect(user: Pokemon, target: Pokemon, move: Move): boolean { + usedChargeEffect(user: Pokemon, target: Pokemon | null, move: Move): boolean { if (!this.chargeEffect) { return false; } @@ -2260,7 +2509,7 @@ export class SunlightChargeAttr extends ChargeAttr { export class ElectroShotChargeAttr extends ChargeAttr { private statIncreaseApplied: boolean; constructor() { - super(ChargeAnim.ELECTRO_SHOT_CHARGING, "absorbed electricity!", null, true); + super(ChargeAnim.ELECTRO_SHOT_CHARGING, i18next.t("moveTriggers:absorbedElectricity", {pokemonName: "{USER}"}), null, true); // Add a flag because ChargeAttr skills use themselves twice instead of once over one-to-two turns this.statIncreaseApplied = false; } @@ -2270,14 +2519,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; @@ -2312,44 +2561,42 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { if (args.length < 2 || !args[1]) { new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { (args[0] as Utils.BooleanHolder).value = true; - user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`)); + user.scene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); user.scene.arena.addTag(this.tagType, 3, move.id, user.id, ArenaTagSide.BOTH, false, target.getBattlerIndex()); resolve(true); }); } else { - user.scene.ui.showText(getPokemonMessage(user.scene.getPokemonById(target.id), ` took\nthe ${move.name} attack!`), null, () => resolve(true)); + user.scene.ui.showText(i18next.t("moveTriggers:tookMoveAttack", {pokemonName: getPokemonNameWithAffix(user.scene.getPokemonById(target.id) ?? undefined), moveName: move.name}), null, () => resolve(true)); } }); } } -export class StatChangeAttr extends MoveEffectAttr { +export class StatStageChangeAttr extends MoveEffectAttr { public stats: BattleStat[]; - public levels: integer; - private condition: MoveConditionFunc; + public stages: integer; + private condition: MoveConditionFunc | null; private showMessage: boolean; - constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, 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.condition = condition || null; + this.stats = stats; + this.stages = stages; + this.condition = condition!; // TODO: is this bang correct? this.showMessage = showMessage; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { if (!super.apply(user, target, move, args) || (this.condition && !this.condition(user, target, move))) { return false; } - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + 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; } @@ -2357,7 +2604,7 @@ export class StatChangeAttr extends MoveEffectAttr { } getLevels(_user: Pokemon): integer { - return this.levels; + return this.stages; } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { @@ -2365,29 +2612,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); } @@ -2402,113 +2650,86 @@ export class StatChangeAttr extends MoveEffectAttr { } } -export class PostVictoryStatChangeAttr extends MoveAttr { +export class PostVictoryStatStageChangeAttr extends MoveAttr { private stats: BattleStat[]; - private levels: integer; - private condition: MoveConditionFunc; + 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.condition = condition || null; + this.stats = stats; + this.stages = stages; + this.condition = condition!; // TODO: is this bang correct? this.showMessage = showMessage; } applyPostVictory(user: Pokemon, target: Pokemon, move: Move): void { if (this.condition && !this.condition(user, target, move)) { return; } - const statChangeAttr = new StatChangeAttr(this.stats, this.levels, this.showMessage); - statChangeAttr.apply(user, target, move, undefined); + 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 HalfHpStatMaxAttr extends StatChangeAttr { - constructor(stat: BattleStat) { - super(stat, 12, true, null, false); - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const damage = user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); - if (damage) { - user.scene.damageNumberHandler.add(user, damage); - } - user.updateInfo().then(() => { - const ret = super.apply(user, target, move, args); - user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand maximized its ${getBattleStatName(this.stats[0])}!`)); - resolve(ret); - }); - }); - } - - getCondition(): MoveConditionFunc { - return (user, target, move) => user.getHpRatio() > 0.5 && user.summonData.battleStats[this.stats[0]] < 6; - } - - // TODO: Add benefit score that considers HP cut -} - -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) { + constructor(stat: BattleStat[], levels: integer, cutRatio: integer, messageCallback?: ((user: Pokemon) => void) | undefined) { super(stat, levels, true, null, true); this.cutRatio = cutRatio; + this.messageCallback = messageCallback; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { - const damage = user.damageAndUpdate(Math.floor(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); - if (damage) { - user.scene.damageNumberHandler.add(user, damage); - } + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); user.updateInfo().then(() => { const ret = super.apply(user, target, move, args); + if (this.messageCallback) { + this.messageCallback(user); + } resolve(ret); }); }); } getCondition(): MoveConditionFunc { - return (user, target, move) => user.getHpRatio() > 1 / this.cutRatio; + return (user, _target, _move) => user.getHpRatio() > 1 / this.cutRatio && this.stats.some(s => user.getStatStage(s) < 6); } } @@ -2518,9 +2739,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 { @@ -2528,8 +2751,7 @@ export class CopyStatsAttr extends MoveEffectAttr { } target.updateInfo(); user.updateInfo(); - - target.scene.queueMessage(getPokemonMessage(user, " copied\n") + getPokemonMessage(target, "'s stat changes!")); + target.scene.queueMessage(i18next.t("moveTriggers:copiedStatChanges", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target)})); return true; } @@ -2541,62 +2763,98 @@ 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(); - target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere all reversed!")); + target.scene.queueMessage(i18next.t("moveTriggers:invertStats", {pokemonName: getPokemonNameWithAffix(target)})); return true; } } export class ResetStatsAttr extends MoveEffectAttr { + private targetAllPokemon: boolean; + constructor(targetAllPokemon: boolean) { + super(); + this.targetAllPokemon = targetAllPokemon; + } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - for (let s = 0; s < target.summonData.battleStats.length; s++) { - target.summonData.battleStats[s] = 0; + if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used + const activePokemon = user.scene.getField(true); + activePokemon.forEach(p => this.resetStats(p)); + target.scene.queueMessage(i18next.t("moveTriggers:statEliminated")); + } else { // Affects only the single target when Clear Smog is used + this.resetStats(target); + target.scene.queueMessage(i18next.t("moveTriggers:resetStats", {pokemonName: getPokemonNameWithAffix(target)})); } - target.updateInfo(); - user.updateInfo(); - - target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere eliminated!")); return true; } + + resetStats(pokemon: Pokemon) { + 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(getPokemonMessage(user, " switched stat changes with the target!")); - return true; + return false; } } @@ -2607,7 +2865,7 @@ export class HpSplitAttr extends MoveEffectAttr { return resolve(false); } - const infoUpdates = []; + const infoUpdates: Promise[] = []; const hpValue = Math.floor((target.hp + user.hp) / 2); if (user.hp < hpValue) { @@ -2659,7 +2917,7 @@ export class LessPPMorePowerAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const ppMax = move.pp; - const ppUsed = user.moveset.find((m) => m.moveId === move.id).ppUsed; + const ppUsed = user.moveset.find((m) => m?.moveId === move.id)?.ppUsed!; // TODO: is the bang correct? let ppRemains = ppMax - ppUsed; /** Reduce to 0 to avoid negative numbers if user has 1PP before attack and target has Ability.PRESSURE */ @@ -2726,6 +2984,7 @@ const beatUpFunc = (user: Pokemon, allyIndex: number): number => { } return (pokemon.species.getBaseStat(Stat.ATK) / 10) + 5; } + return 0; }; export class BeatUpAttr extends VariablePowerAttr { @@ -2740,18 +2999,23 @@ export class BeatUpAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - const allyIndex = user.turnData.hitCount - user.turnData.hitsLeft; + + const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); + const allyCount = party.filter(pokemon => { + return pokemon.id === user.id || !pokemon.status?.effect; + }).length; + const allyIndex = (user.turnData.hitCount - user.turnData.hitsLeft) % allyCount; power.value = beatUpFunc(user, allyIndex); return true; } } const doublePowerChanceMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { - let message: string = null; + let message: string = ""; user.scene.executeWithSeedOffset(() => { const rand = Utils.randSeedInt(100); if (rand < move.chance) { - message = getPokemonMessage(user, " is going all out for this attack!"); + message = i18next.t("moveTriggers:goingAllOutForAttack", {pokemonName: getPokemonNameWithAffix(user)}); } }, user.scene.currentBattle.turn << 6, user.scene.waveSeed); return message; @@ -2761,7 +3025,7 @@ export class DoublePowerChanceAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { let rand: integer; user.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100), user.scene.currentBattle.turn << 6, user.scene.waveSeed); - if (rand < move.chance) { + if (rand! < move.chance) { const power = args[0] as Utils.NumberHolder; power.value *= 2; return true; @@ -2777,9 +3041,9 @@ export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultipl const moveHistory = user.getLastXMoves(limit + 1).slice(1); let count = 0; - let turnMove: TurnMove; + let turnMove: TurnMove | undefined; - while (((turnMove = moveHistory.shift())?.move === move.id || (comboMoves.length && comboMoves.includes(turnMove?.move))) && (!resetOnFail || turnMove.result === MoveResult.SUCCESS)) { + while (((turnMove = moveHistory.shift())?.move === move.id || (comboMoves.length && comboMoves.includes(turnMove?.move!))) && (!resetOnFail || turnMove?.result === MoveResult.SUCCESS)) { // TODO: is this bang correct? if (count < (limit - 1)) { count++; } else if (resetOnLimit) { @@ -2835,7 +3099,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 @@ -2846,7 +3110,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 ]; @@ -2870,7 +3134,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 @@ -2880,14 +3144,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; } } @@ -2958,15 +3222,35 @@ export class CompareWeightPowerAttr extends VariablePowerAttr { export class HpPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.NumberHolder).value = Math.max(Math.floor(150 * user.getHpRatio()), 1); + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(150 * user.getHpRatio()); return true; } } +/** + * Attribute used for moves whose base power scales with the opponent's HP + * Used for Crush Grip, Wring Out, and Hard Press + * maxBasePower 100 for Hard Press, 120 for others + */ export class OpponentHighHpPowerAttr extends VariablePowerAttr { + maxBasePower: number; + + constructor(maxBasePower: number) { + super(); + this.maxBasePower = maxBasePower; + } + + /** + * Changes the base power of the move to be the target's HP ratio times the maxBasePower with a min value of 1 + * @param user n/a + * @param target the Pokemon being attacked + * @param move n/a + * @param args holds the base power of the move at args[0] + * @returns true + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.NumberHolder).value = Math.max(Math.floor(120 * target.getHpRatio()), 1); + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(this.maxBasePower * target.getHpRatio()); return true; } @@ -3010,9 +3294,9 @@ const magnitudeMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { } } - message = `Magnitude ${m + 4}!`; + message = i18next.t("moveTriggers:magnitudeMessage", {magnitude: m + 4}); }, user.scene.currentBattle.turn << 6, user.scene.waveSeed); - return message; + return message!; }; export class MagnitudePowerAttr extends VariablePowerAttr { @@ -3028,7 +3312,7 @@ export class MagnitudePowerAttr extends VariablePowerAttr { let m = 0; for (; m < magnitudeThresholds.length; m++) { - if (rand < magnitudeThresholds[m]) { + if (rand! < magnitudeThresholds[m]) { break; } } @@ -3087,18 +3371,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 @@ -3108,9 +3392,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; } } @@ -3132,10 +3416,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; } @@ -3160,7 +3444,7 @@ export class PresentPowerAttr extends VariablePowerAttr { // If this move is multi-hit, disable all other hits user.stopMultiHit(); target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Math.max(Math.floor(target.getMaxHp() / 4), 1), getPokemonMessage(target, " regained\nhealth!"), true)); + Utils.toDmgValue(target.getMaxHp() / 4), i18next.t("moveTriggers:regainedHealth", {pokemonName: getPokemonNameWithAffix(target)}), true)); } return true; @@ -3177,6 +3461,65 @@ export class WaterShurikenPowerAttr extends VariablePowerAttr { } } +/** + * Attribute used to calculate the power of attacks that scale with Stockpile stacks (i.e. Spit Up). + */ +export class SpitUpPowerAttr extends VariablePowerAttr { + private multiplier: number = 0; + + constructor(multiplier: number) { + super(); + this.multiplier = multiplier; + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const stockpilingTag = user.getTag(StockpilingTag); + + if (stockpilingTag !== null && stockpilingTag.stockpiledCount > 0) { + const power = args[0] as Utils.IntegerHolder; + power.value = this.multiplier * stockpilingTag.stockpiledCount; + return true; + } + + return false; + } +} + +/** + * Attribute used to apply Swallow's healing, which scales with Stockpile stacks. + * Does NOT remove stockpiled stacks. + */ +export class SwallowHealAttr extends HealAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const stockpilingTag = user.getTag(StockpilingTag); + + if (stockpilingTag !== null && stockpilingTag?.stockpiledCount > 0) { + const stockpiled = stockpilingTag.stockpiledCount; + let healRatio: number; + + if (stockpiled === 1) { + healRatio = 0.25; + } else if (stockpiled === 2) { + healRatio = 0.50; + } else { // stockpiled >= 3 + healRatio = 1.00; + } + + if (healRatio) { + this.addHealPhase(user, healRatio); + return true; + } + } + + return false; + } +} + +const hasStockpileStacksCondition: MoveConditionFunc = (user) => { + const hasStockpilingTag = user.getTag(StockpilingTag); + return !!hasStockpilingTag && hasStockpilingTag.stockpiledCount > 0; +}; + /** * Attribute used for multi-hit moves that increase power in increments of the * move's base power for each hit, namely Triple Kick and Triple Axel. @@ -3214,6 +3557,72 @@ export class MultiHitPowerIncrementAttr extends VariablePowerAttr { } } +/** + * Attribute used for moves that double in power if the given move immediately + * preceded the move applying the attribute, namely Fusion Flare and + * Fusion Bolt. + * @extends VariablePowerAttr + * @see {@linkcode apply} + */ +export class LastMoveDoublePowerAttr extends VariablePowerAttr { + /** The move that must precede the current move */ + private move: Moves; + + constructor(move: Moves) { + super(); + + this.move = move; + } + + /** + * Doubles power of move if the given move is found to precede the current + * move with no other moves being executed in between, only ignoring failed + * moves if any. + * @param user {@linkcode Pokemon} that used the move + * @param target N/A + * @param move N/A + * @param args [0] {@linkcode Utils.NumberHolder} that holds the resulting power of the move + * @returns true if attribute application succeeds, false otherwise + */ + apply(user: Pokemon, _target: Pokemon, _move: Move, args: any[]): boolean { + const power = args[0] as Utils.NumberHolder; + const enemy = user.getOpponent(0); + const pokemonActed: Pokemon[] = []; + + if (enemy?.turnData.acted) { + pokemonActed.push(enemy); + } + + if (user.scene.currentBattle.double) { + const userAlly = user.getAlly(); + const enemyAlly = enemy?.getAlly(); + + if (userAlly && userAlly.turnData.acted) { + pokemonActed.push(userAlly); + } + if (enemyAlly && enemyAlly.turnData.acted) { + pokemonActed.push(enemyAlly); + } + } + + pokemonActed.sort((a, b) => b.turnData.order - a.turnData.order); + + for (const p of pokemonActed) { + const [ lastMove ] = p.getLastXMoves(1); + if (lastMove.result !== MoveResult.FAIL) { + if ((lastMove.result === MoveResult.SUCCESS) && (lastMove.move === this.move)) { + power.value *= 2; + return true; + } else { + break; + } + } + } + + return false; + } +} + export class VariableAtkAttr extends MoveAttr { constructor() { super(); @@ -3230,7 +3639,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; } } @@ -3241,7 +3650,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; } } @@ -3263,7 +3672,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; } } @@ -3275,6 +3684,9 @@ export class VariableAccuracyAttr extends MoveAttr { } } +/** + * Attribute used for Thunder and Hurricane that sets accuracy to 50 in sun and never miss in rain + */ export class ThunderAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { @@ -3282,7 +3694,6 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { case WeatherType.SUNNY: - case WeatherType.SANDSTORM: case WeatherType.HARSH_SUN: accuracy.value = 50; return true; @@ -3297,6 +3708,28 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { } } +/** + * Attribute used for Bleakwind Storm, Wildbolt Storm, and Sandsear Storm that sets accuracy to never + * miss in rain + * Springtide Storm does NOT have this property + */ +export class StormAccuracyAttr extends VariableAccuracyAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { + const accuracy = args[0] as Utils.NumberHolder; + const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; + switch (weatherType) { + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + accuracy.value = -1; + return true; + } + } + + return false; + } +} + /** * Attribute used for moves which never miss * against Pokemon with the {@linkcode BattlerTagType.MINIMIZED} @@ -3359,9 +3792,9 @@ export class VariableMoveCategoryAttr extends MoveAttr { export class PhotonGeyserCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const category = (args[0] as Utils.IntegerHolder); + 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; } @@ -3372,9 +3805,9 @@ export class PhotonGeyserCategoryAttr extends VariableMoveCategoryAttr { export class TeraBlastCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const category = (args[0] as Utils.IntegerHolder); + 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; } @@ -3383,6 +3816,33 @@ export class TeraBlastCategoryAttr extends VariableMoveCategoryAttr { } } +/** + * Increases the power of Tera Blast if the user is Terastallized into Stellar type + * @extends VariablePowerAttr + */ +export class TeraBlastPowerAttr extends VariablePowerAttr { + /** + * Sets Tera Blast's power to 100 if the user is terastallized with + * the Stellar tera type. + * @param user {@linkcode Pokemon} the Pokemon using this move + * @param target n/a + * @param move {@linkcode Move} the Move with this attribute (i.e. Tera Blast) + * @param args + * - [0] {@linkcode Utils.NumberHolder} the applied move's power, factoring in + * previously applied power modifiers. + * @returns + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const power = args[0] as Utils.NumberHolder; + if (user.isTerastallized() && user.getTeraType() === Type.STELLAR) { + power.value = 100; + return true; + } + + return false; + } +} + /** * Change the move category to status when used on the ally * @extends VariableMoveCategoryAttr @@ -3411,8 +3871,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) { @@ -3435,10 +3895,15 @@ export class VariableMoveTypeAttr extends MoveAttr { export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.ARCEUS) || [user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.SILVALLY)) { - const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies.formIndex; + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } - move.type = Type[Type[form]]; + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.ARCEUS) || [user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.SILVALLY)) { + const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies?.formIndex!; // TODO: is this bang correct? + + moveType.value = Type[Type[form]]; return true; } @@ -3448,24 +3913,29 @@ export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.GENESECT)) { - const form = user.species.speciesId === Species.GENESECT ? user.formIndex : user.fusionSpecies.formIndex; + const form = user.species.speciesId === Species.GENESECT ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { case 1: // Shock Drive - move.type = Type.ELECTRIC; + moveType.value = Type.ELECTRIC; break; case 2: // Burn Drive - move.type = Type.FIRE; + moveType.value = Type.FIRE; break; case 3: // Chill Drive - move.type = Type.ICE; + moveType.value = Type.ICE; break; case 4: // Douse Drive - move.type = Type.WATER; + moveType.value = Type.WATER; break; default: - move.type = Type.NORMAL; + moveType.value = Type.NORMAL; break; } return true; @@ -3477,15 +3947,20 @@ export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { export class AuraWheelTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.MORPEKO)) { - const form = user.species.speciesId === Species.MORPEKO ? user.formIndex : user.fusionSpecies.formIndex; + const form = user.species.speciesId === Species.MORPEKO ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { case 1: // Hangry Mode - move.type = Type.DARK; + moveType.value = Type.DARK; break; default: // Full Belly Mode - move.type = Type.ELECTRIC; + moveType.value = Type.ELECTRIC; break; } return true; @@ -3497,18 +3972,23 @@ export class AuraWheelTypeAttr extends VariableMoveTypeAttr { export class RagingBullTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.PALDEA_TAUROS)) { - const form = user.species.speciesId === Species.PALDEA_TAUROS ? user.formIndex : user.fusionSpecies.formIndex; + const form = user.species.speciesId === Species.PALDEA_TAUROS ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { case 1: // Blaze breed - move.type = Type.FIRE; + moveType.value = Type.FIRE; break; case 2: // Aqua breed - move.type = Type.WATER; + moveType.value = Type.WATER; break; default: - move.type = Type.FIGHTING; + moveType.value = Type.FIGHTING; break; } return true; @@ -3520,33 +4000,30 @@ export class RagingBullTypeAttr extends VariableMoveTypeAttr { export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.OGERPON)) { - const form = user.species.speciesId === Species.OGERPON ? user.formIndex : user.fusionSpecies.formIndex; + const form = user.species.speciesId === Species.OGERPON ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { case 1: // Wellspring Mask - move.type = Type.WATER; + case 5: // Wellspring Mask Tera + moveType.value = Type.WATER; break; case 2: // Hearthflame Mask - move.type = Type.FIRE; + case 6: // Hearthflame Mask Tera + moveType.value = Type.FIRE; break; case 3: // Cornerstone Mask - move.type = Type.ROCK; + case 7: // Cornerstone Mask Tera + moveType.value = Type.ROCK; break; case 4: // Teal Mask Tera - move.type = Type.GRASS; - break; - case 5: // Wellspring Mask Tera - move.type = Type.WATER; - break; - case 6: // Hearthflame Mask Tera - move.type = Type.FIRE; - break; - case 7: // Cornerstone Mask Tera - move.type = Type.ROCK; - break; default: - move.type = Type.GRASS; + moveType.value = Type.GRASS; break; } return true; @@ -3558,22 +4035,27 @@ export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { export class WeatherBallTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { switch (user.scene.arena.weather?.weatherType) { case WeatherType.SUNNY: case WeatherType.HARSH_SUN: - move.type = Type.FIRE; + moveType.value = Type.FIRE; break; case WeatherType.RAIN: case WeatherType.HEAVY_RAIN: - move.type = Type.WATER; + moveType.value = Type.WATER; break; case WeatherType.SANDSTORM: - move.type = Type.ROCK; + moveType.value = Type.ROCK; break; case WeatherType.HAIL: case WeatherType.SNOW: - move.type = Type.ICE; + moveType.value = Type.ICE; break; default: return false; @@ -3596,27 +4078,32 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { * @param user {@linkcode Pokemon} using this move * @param target N/A * @param move N/A - * @param args [0] {@linkcode Utils.IntegerHolder} The move's type to be modified + * @param args [0] {@linkcode Utils.NumberHolder} The move's type to be modified * @returns true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!user.isGrounded) { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + + if (!user.isGrounded()) { return false; } const currentTerrain = user.scene.arena.getTerrainType(); switch (currentTerrain) { case TerrainType.MISTY: - move.type = Type.FAIRY; + moveType.value = Type.FAIRY; break; case TerrainType.ELECTRIC: - move.type = Type.ELECTRIC; + moveType.value = Type.ELECTRIC; break; case TerrainType.GRASSY: - move.type = Type.GRASS; + moveType.value = Type.GRASS; break; case TerrainType.PSYCHIC: - move.type = Type.PSYCHIC; + moveType.value = Type.PSYCHIC; break; default: return false; @@ -3625,8 +4112,17 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { } } +/** + * Changes type based on the user's IVs + * @extends VariableMoveTypeAttr + */ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + const iv_val = Math.floor(((user.ivs[Stat.HP] & 1) +(user.ivs[Stat.ATK] & 1) * 2 +(user.ivs[Stat.DEF] & 1) * 4 @@ -3634,7 +4130,7 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { +(user.ivs[Stat.SPATK] & 1) * 16 +(user.ivs[Stat.SPDEF] & 1) * 32) * 15/63); - move.type = [ + moveType.value = [ Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC, @@ -3644,16 +4140,47 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { } } +/** + * Changes the type of Tera Blast to match the user's tera type + * @extends VariableMoveTypeAttr + */ +export class TeraBlastTypeAttr extends VariableMoveTypeAttr { + /** + * @param user {@linkcode Pokemon} the user of the move + * @param target {@linkcode Pokemon} N/A + * @param move {@linkcode Move} the move with this attribute + * @param args `[0]` the move's type to be modified + * @returns `true` if the move's type was modified; `false` otherwise + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + + if (user.isTerastallized()) { + moveType.value = user.getTeraType(); // changes move type to tera type + return true; + } + + return false; + } +} + export class MatchUserTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } const userTypes = user.getTypes(true); if (userTypes.includes(Type.STELLAR)) { // will not change to stellar type const nonTeraTypes = user.getTypes(); - move.type = nonTeraTypes[0]; + moveType.value = nonTeraTypes[0]; return true; } else if (userTypes.length > 0) { - move.type = userTypes[0]; + moveType.value = userTypes[0]; return true; } else { return false; @@ -3672,8 +4199,8 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!target.getTag(BattlerTagType.IGNORE_FLYING)) { const multiplier = args[0] as Utils.NumberHolder; - //When a flying type is hit, the first hit is always 1x multiplier. Levitating pokemon are instantly affected by typing - if (target.isOfType(Type.FLYING) || target.hasAbility(Abilities.LEVITATE)) { + //When a flying type is hit, the first hit is always 1x multiplier. + if (target.isOfType(Type.FLYING)) { multiplier.value = 1; } return true; @@ -3687,8 +4214,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; @@ -3793,9 +4324,9 @@ const crashDamageFunc = (user: Pokemon, move: Move) => { return false; } - user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); - user.scene.queueMessage(getPokemonMessage(user, " kept going\nand crashed!")); - user.turnData.damageTaken += Math.floor(user.getMaxHp() / 2); + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / 2), HitResult.OTHER, false, true); + user.scene.queueMessage(i18next.t("moveTriggers:keptGoingAndCrashed", {pokemonName: getPokemonNameWithAffix(user)})); + user.turnData.damageTaken += Utils.toDmgValue(user.getMaxHp() / 2); return true; }; @@ -3807,70 +4338,6 @@ export class TypelessAttr extends MoveAttr { } */ export class BypassRedirectAttr extends MoveAttr { } -export class DisableMoveAttr extends MoveEffectAttr { - constructor() { - super(false); - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) { - return false; - } - - const moveQueue = target.getLastXMoves(); - let turnMove: TurnMove; - while (moveQueue.length) { - turnMove = moveQueue.shift(); - if (turnMove.virtual) { - continue; - } - - const moveIndex = target.getMoveset().findIndex(m => m.moveId === turnMove.move); - if (moveIndex === -1) { - return false; - } - - const disabledMove = target.getMoveset()[moveIndex]; - target.summonData.disabledMove = disabledMove.moveId; - target.summonData.disabledTurns = 4; - - user.scene.queueMessage(getPokemonMessage(target, `'s ${disabledMove.getName()}\nwas disabled!`)); - - return true; - } - - return false; - } - - getCondition(): MoveConditionFunc { - return (user, target, move) => { - if (target.summonData.disabledMove || target.isMax()) { - return false; - } - - const moveQueue = target.getLastXMoves(); - let turnMove: TurnMove; - while (moveQueue.length) { - turnMove = moveQueue.shift(); - if (turnMove.virtual) { - continue; - } - - const move = target.getMoveset().find(m => m.moveId === turnMove.move); - if (!move) { - continue; - } - - return true; - } - }; - } - - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - return -5; - } -} - export class FrenzyAttr extends MoveEffectAttr { constructor() { super(true, MoveEffectTrigger.HIT, false, true); @@ -3885,19 +4352,16 @@ export class FrenzyAttr extends MoveEffectAttr { return false; } - if (!user.getMoveQueue().length) { - if (!user.getTag(BattlerTagType.FRENZY)) { - const turnCount = user.randSeedIntRange(1, 2); - new Array(turnCount).fill(null).map(() => user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true })); - user.addTag(BattlerTagType.FRENZY, 1, move.id, user.id); - } else { - applyMoveAttrs(AddBattlerTagAttr, user, target, move, args); - user.lapseTag(BattlerTagType.FRENZY); - } - return true; + if (!user.getTag(BattlerTagType.FRENZY) && !user.getMoveQueue().length) { + const turnCount = user.randSeedIntRange(1, 2); + new Array(turnCount).fill(null).map(() => user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true })); + user.addTag(BattlerTagType.FRENZY, turnCount, move.id, user.id); + } else { + applyMoveAttrs(AddBattlerTagAttr, user, target, move, args); + user.lapseTag(BattlerTagType.FRENZY); // if FRENZY is already in effect (moveQueue.length > 0), lapse the tag } - return false; + return true; } } @@ -3905,7 +4369,7 @@ export const frenzyMissFunc: UserMoveConditionFunc = (user: Pokemon, move: Move) while (user.getMoveQueue().length && user.getMoveQueue()[0].move === move.id) { user.getMoveQueue().shift(); } - user.lapseTag(BattlerTagType.FRENZY); + user.removeTag(BattlerTagType.FRENZY); // FRENZY tag should be disrupted on miss/no effect return true; }; @@ -3914,15 +4378,25 @@ export class AddBattlerTagAttr extends MoveEffectAttr { public tagType: BattlerTagType; public turnCountMin: integer; public turnCountMax: integer; + protected cancelOnFail: boolean; private failOnOverlap: boolean; - constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: integer = 0, turnCountMax?: integer, lastHitOnly: boolean = false) { + constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: integer = 0, turnCountMax?: integer, lastHitOnly: boolean = false, cancelOnFail: boolean = false) { super(selfTarget, MoveEffectTrigger.POST_APPLY, false, lastHitOnly); this.tagType = tagType; this.turnCountMin = turnCountMin; this.turnCountMax = turnCountMax !== undefined ? turnCountMax : turnCountMin; this.failOnOverlap = !!failOnOverlap; + this.cancelOnFail = cancelOnFail; + } + + canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.canApply(user, target, move, args) || (this.cancelOnFail === true && user.getLastXMoves(1)[0].result === MoveResult.FAIL)) { + return false; + } else { + return true; + } } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -3930,21 +4404,21 @@ export class AddBattlerTagAttr extends MoveEffectAttr { return false; } - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { - return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedInt(this.turnCountMax - this.turnCountMin, this.turnCountMin), move.id, user.id); + return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedIntRange(this.turnCountMin, this.turnCountMax), move.id, user.id); } return false; } - getCondition(): MoveConditionFunc { + getCondition(): MoveConditionFunc | null { return this.failOnOverlap ? (user, target, move) => !(this.selfTarget ? user : target).getTag(this.tagType) : null; } - getTagTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTagTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer | void { switch (this.tagType) { case BattlerTagType.RECHARGING: case BattlerTagType.PERISH_SONG: @@ -3954,7 +4428,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { case BattlerTagType.INFATUATED: case BattlerTagType.NIGHTMARE: case BattlerTagType.DROWSY: - case BattlerTagType.NO_CRIT: + case BattlerTagType.DISABLED: return -5; case BattlerTagType.SEEDED: case BattlerTagType.SALT_CURED: @@ -3989,11 +4463,84 @@ export class AddBattlerTagAttr extends MoveEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - let moveChance = this.getMoveChance(user,target,move,this.selfTarget); + let moveChance = this.getMoveChance(user, target, move, this.selfTarget, false); if (moveChance < 0) { moveChance = 100; } - return Math.floor(this.getTagTargetBenefitScore(user, target, move) * (moveChance / 100)); + return Math.floor(this.getTagTargetBenefitScore(user, target, move)! * (moveChance / 100)); // TODO: is the bang correct? + } +} + +/** + * Adds the appropriate battler tag for Gulp Missile when Surf or Dive is used. + * @extends MoveEffectAttr + */ +export class GulpMissileTagAttr extends MoveEffectAttr { + constructor() { + super(true); + } + + /** + * Adds BattlerTagType from GulpMissileTag based on the Pokemon's HP ratio. + * @param {Pokemon} user The Pokemon using the move. + * @param {Pokemon} target The Pokemon being targeted by the move. + * @param {Move} move The move being used. + * @param {any[]} args Additional arguments, if any. + * @returns Whether the BattlerTag is applied. + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + if (!super.apply(user, target, move, args)) { + return false; + } + + if (user.hasAbility(Abilities.GULP_MISSILE) && user.species.speciesId === Species.CRAMORANT) { + if (user.getHpRatio() >= .5) { + user.addTag(BattlerTagType.GULP_MISSILE_ARROKUDA, 0, move.id); + } else { + user.addTag(BattlerTagType.GULP_MISSILE_PIKACHU, 0, move.id); + } + return true; + } + + return false; + } + + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + const isCramorant = user.hasAbility(Abilities.GULP_MISSILE) && user.species.speciesId === Species.CRAMORANT; + return isCramorant && !user.getTag(GulpMissileTag) ? 10 : 0; + } +} + +/** + * Attribute to implement Jaw Lock's linked trapping effect between the user and target + * @extends AddBattlerTagAttr + */ +export class JawLockAttr extends AddBattlerTagAttr { + constructor() { + super(BattlerTagType.TRAPPED); + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.canApply(user, target, move, args)) { + return false; + } + + // If either the user or the target already has the tag, do not apply + if (user.getTag(TrappedTag) || target.getTag(TrappedTag)) { + return false; + } + + const moveChance = this.getMoveChance(user, target, move, this.selfTarget); + if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { + /** + * Add the tag to both the user and the target. + * The target's tag source is considered to be the user and vice versa + */ + return target.addTag(BattlerTagType.TRAPPED, 1, move.id, user.id) + && user.addTag(BattlerTagType.TRAPPED, 1, move.id, target.id); + } + + return false; } } @@ -4008,17 +4555,17 @@ export class CurseAttr extends MoveEffectAttr { const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true); user.scene.queueMessage( - i18next.t("battle:battlerTagsCursedOnAdd", { + i18next.t("battlerTags:cursedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user), - pokemonName: target.name + pokemonName: getPokemonNameWithAffix(target) }) ); 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; } } @@ -4078,11 +4625,22 @@ 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 { constructor() { - super(BattlerTagType.RECHARGING, true, false, 1, 1, true); + super(BattlerTagType.RECHARGING, true, false, 1, 1, true, true); } } @@ -4101,11 +4659,11 @@ export class ProtectAttr extends AddBattlerTagAttr { return ((user, target, move): boolean => { let timesUsed = 0; const moveHistory = user.getLastXMoves(); - let turnMove: TurnMove; + let turnMove: TurnMove | undefined; while (moveHistory.length) { turnMove = moveHistory.shift(); - if (!allMoves[turnMove.move].hasAttr(ProtectAttr) || turnMove.result !== MoveResult.SUCCESS) { + if (!allMoves[turnMove?.move!].hasAttr(ProtectAttr) || turnMove?.result !== MoveResult.SUCCESS) { // TODO: is the bang correct? break; } timesUsed++; @@ -4118,12 +4676,6 @@ export class ProtectAttr extends AddBattlerTagAttr { } } -export class EndureAttr extends ProtectAttr { - constructor() { - super(BattlerTagType.ENDURING); - } -} - export class IgnoreAccuracyAttr extends AddBattlerTagAttr { constructor() { super(BattlerTagType.IGNORE_ACCURACY, true, false, 2); @@ -4134,23 +4686,7 @@ export class IgnoreAccuracyAttr extends AddBattlerTagAttr { return false; } - user.scene.queueMessage(getPokemonMessage(user, ` took aim\nat ${target.name}!`)); - - return true; - } -} - -export class AlwaysCritsAttr extends AddBattlerTagAttr { - constructor() { - super(BattlerTagType.ALWAYS_CRIT, true, false, 2); - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) { - return false; - } - - user.scene.queueMessage(getPokemonMessage(user, ` took aim\nat ${target.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:tookAimAtTarget", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target)})); return true; } @@ -4166,7 +4702,7 @@ export class FaintCountdownAttr extends AddBattlerTagAttr { return false; } - user.scene.queueMessage(getPokemonMessage(target, `\nwill faint in ${this.turnCountMin - 1} turns.`)); + user.scene.queueMessage(i18next.t("moveTriggers:faintCountdown", {pokemonName: getPokemonNameWithAffix(target), turnCount: this.turnCountMin - 1})); return true; } @@ -4200,11 +4736,11 @@ export class AddArenaTagAttr extends MoveEffectAttr { private failOnOverlap: boolean; public selfSideTarget: boolean; - constructor(tagType: ArenaTagType, turnCount?: integer, failOnOverlap: boolean = false, selfSideTarget: boolean = false) { - super(true, MoveEffectTrigger.POST_APPLY, true); + constructor(tagType: ArenaTagType, turnCount?: integer | null, failOnOverlap: boolean = false, selfSideTarget: boolean = false) { + super(true, MoveEffectTrigger.POST_APPLY); this.tagType = tagType; - this.turnCount = turnCount; + this.turnCount = turnCount!; // TODO: is the bang correct? this.failOnOverlap = failOnOverlap; this.selfSideTarget = selfSideTarget; } @@ -4222,7 +4758,7 @@ export class AddArenaTagAttr extends MoveEffectAttr { return false; } - getCondition(): MoveConditionFunc { + getCondition(): MoveConditionFunc | null { return this.failOnOverlap ? (user, target, move) => !user.scene.arena.getTagOnSide(this.tagType, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY) : null; @@ -4286,10 +4822,10 @@ export class AddArenaTrapTagHitAttr extends AddArenaTagAttr { * @param move {@linkcode Move} being used */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; - if ((moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance)) { + if ((moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) && user.getLastXMoves(1)[0].result === MoveResult.SUCCESS) { user.scene.arena.addTag(this.tagType, 0, move.id, user.id, side); if (!tag) { return true; @@ -4395,18 +4931,18 @@ export class SwapArenaTagsAttr extends MoveEffectAttr { if (tagPlayerTemp) { for (const swapTagsType of tagPlayerTemp) { user.scene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.PLAYER, true); - user.scene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId, ArenaTagSide.ENEMY, true); + user.scene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaTagSide.ENEMY, true); // TODO: is the bang correct? } } if (tagEnemyTemp) { for (const swapTagsType of tagEnemyTemp) { user.scene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.ENEMY, true); - user.scene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId, ArenaTagSide.PLAYER, true); + user.scene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaTagSide.PLAYER, true); // TODO: is the bang correct? } } - user.scene.queueMessage( `${user.name} swapped the battle effects affecting each side of the field!`); + user.scene.queueMessage(i18next.t("moveTriggers:swapArenaTags", {pokemonName: getPokemonNameWithAffix(user)})); return true; } } @@ -4446,15 +4982,15 @@ export class RevivalBlessingAttr extends MoveEffectAttr { const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; const slotIndex = user.scene.getEnemyParty().findIndex(p => pokemon.id === p.id); pokemon.resetStatus(); - pokemon.heal(Math.min(Math.max(Math.ceil(Math.floor(0.5 * pokemon.getMaxHp())), 1), pokemon.getMaxHp())); - user.scene.queueMessage(`${pokemon.name} was revived!`,0,true); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + user.scene.queueMessage(i18next.t("moveTriggers:revivalBlessing", {pokemonName: getPokemonNameWithAffix(pokemon)}), 0, true); if (user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { const allyPokemon = user.getAlly(); if (slotIndex<=1) { user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, pokemon.getFieldIndex(), slotIndex, false, false, false)); } else if (allyPokemon.isFainted()) { - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, allyPokemon.getFieldIndex(), slotIndex, false, false,false)); + user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, allyPokemon.getFieldIndex(), slotIndex, false, false, false)); } } resolve(true); @@ -4484,13 +5020,15 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { this.batonPass = !!batonPass; } + isBatonPass() { + return this.batonPass; + } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { // Check if the move category is not STATUS or if the switch out condition is not met if (!this.getSwitchOutCondition()(user, target, move)) { - //Apply effects before switch out i.e. poison point, flame body, etc - applyPostDefendAbAttrs(PostDefendContactApplyStatusEffectAbAttr, target, user, move, null); return resolve(false); } @@ -4498,33 +5036,36 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { // This ensures that the switch out only happens when the conditions are met const switchOutTarget = this.user ? user : target; if (switchOutTarget instanceof PlayerPokemon) { - if (switchOutTarget.hp) { - applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, switchOutTarget); - (switchOutTarget as PlayerPokemon).switchOut(this.batonPass, true).then(() => resolve(true)); - } else { + switchOutTarget.leaveField(!this.batonPass); + + if (switchOutTarget.hp > 0) { + user.scene.prependToPhase(new SwitchPhase(user.scene, switchOutTarget.getFieldIndex(), true, true), MoveEndPhase); + resolve(true); + } else { resolve(false); } return; - } else if (user.scene.currentBattle.battleType) { - // Switch out logic for the battle type - switchOutTarget.resetTurnData(); - switchOutTarget.resetSummonData(); - switchOutTarget.hideInfo(); - switchOutTarget.setVisible(false); - switchOutTarget.scene.field.remove(switchOutTarget); - user.scene.triggerPokemonFormChange(switchOutTarget, SpeciesFormChangeActiveTrigger, true); + } else if (user.scene.currentBattle.battleType !== BattleType.WILD) { + // Switch out logic for trainer battles + switchOutTarget.leaveField(!this.batonPass); - if (switchOutTarget.hp) { - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, switchOutTarget.getFieldIndex(), user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot), false, this.batonPass, false)); + if (switchOutTarget.hp > 0) { + // for opponent switching out + user.scene.prependToPhase(new SwitchSummonPhase(user.scene, switchOutTarget.getFieldIndex(), (user.scene.currentBattle.trainer ? user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0), false, this.batonPass, false), MoveEndPhase); } } else { - // Switch out logic for everything else - switchOutTarget.setVisible(false); + // Switch out logic for everything else (eg: WILD battles) + switchOutTarget.leaveField(false); if (switchOutTarget.hp) { - switchOutTarget.hideInfo().then(() => switchOutTarget.destroy()); - switchOutTarget.scene.field.remove(switchOutTarget); - user.scene.queueMessage(getPokemonMessage(switchOutTarget, " fled!"), null, true, 500); + switchOutTarget.setWildFlee(true); + user.scene.queueMessage(i18next.t("moveTriggers:fled", {pokemonName: getPokemonNameWithAffix(switchOutTarget)}), null, true, 500); + + // in double battles redirect potential moves off fled pokemon + if (switchOutTarget.scene.currentBattle.double) { + const allyPokemon = switchOutTarget.getAlly(); + switchOutTarget.scene.redirectPokemonMoves(switchOutTarget, allyPokemon); + } } if (!switchOutTarget.getAlly()?.isActive(true)) { @@ -4548,7 +5089,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { const blockedByAbility = new Utils.BooleanHolder(false); applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); - return blockedByAbility.value ? getPokemonMessage(target, " can't be switched out!") : null; + return blockedByAbility.value ? i18next.t("moveTriggers:cannotBeSwitchedOut", {pokemonName: getPokemonNameWithAffix(target)}) : null; } getSwitchOutCondition(): MoveConditionFunc { @@ -4581,8 +5122,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; } @@ -4605,7 +5146,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { return false; } - if (user.isTerastallized && user.getTeraType() === this.removedType) { // active tera types cannot be removed + if (user.isTerastallized() && user.getTeraType() === this.removedType) { // active tera types cannot be removed return false; } @@ -4636,7 +5177,7 @@ export class CopyTypeAttr extends MoveEffectAttr { user.summonData.types = target.getTypes(true); user.updateInfo(); - user.scene.queueMessage(getPokemonMessage(user, `'s type\nchanged to match ${target.name}'s!`)); + user.scene.queueMessage(i18next.t("moveTriggers:copyType", {pokemonName: getPokemonNameWithAffix(user), targetPokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -4661,7 +5202,7 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { user.summonData.types = [ biomeType ]; user.updateInfo(); - user.scene.queueMessage(getPokemonMessage(user, ` transformed\ninto the ${Utils.toReadableString(Type[biomeType])} type!`)); + user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${Type[biomeType]}`)})); return true; } @@ -4680,7 +5221,7 @@ export class ChangeTypeAttr extends MoveEffectAttr { target.summonData.types = [this.type]; target.updateInfo(); - user.scene.queueMessage(getPokemonMessage(target, ` transformed\ninto the ${Utils.toReadableString(Type[this.type])} type!`)); + user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", {pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`)})); return true; } @@ -4701,11 +5242,13 @@ export class AddTypeAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const types = target.getTypes().slice(0, 2).filter(t => t !== Type.UNKNOWN); // TODO: Figure out some way to actually check if another version of this effect is already applied - types.push(this.type); + if (this.type !== Type.UNKNOWN) { + types.push(this.type); + } target.summonData.types = types; target.updateInfo(); - user.scene.queueMessage(`${Utils.toReadableString(Type[this.type])} was added to\n` + getPokemonMessage(target, "!")); + user.scene.queueMessage(i18next.t("moveTriggers:addType", {typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`), pokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -4725,32 +5268,30 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { return false; } - const firstMoveType = target.getMoveset()[0].getMove().type; - + const firstMoveType = target.getMoveset()[0]?.getMove().type!; // TODO: is this bang correct? user.summonData.types = [ firstMoveType ]; - - user.scene.queueMessage(getPokemonMessage(user, ` transformed\ninto to the ${Utils.toReadableString(Type[firstMoveType])} type!`)); + user.scene.queueMessage(i18next.t("battle:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:Type.${Type[firstMoveType]}`)})); return true; } } export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr { - private enemyMoveset: boolean; + private enemyMoveset: boolean | null; constructor(enemyMoveset?: boolean) { super(); - this.enemyMoveset = enemyMoveset; + this.enemyMoveset = enemyMoveset!; // TODO: is this bang correct? } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveset = (!this.enemyMoveset ? user : target).getMoveset(); - const moves = moveset.filter(m => !m.getMove().hasFlag(MoveFlags.IGNORE_VIRTUAL)); + const moves = moveset.filter(m => !m?.getMove().hasFlag(MoveFlags.IGNORE_VIRTUAL)); if (moves.length) { const move = moves[user.randSeedInt(moves.length)]; - const moveIndex = moveset.findIndex(m => m.moveId === move.moveId); - const moveTargets = getMoveTargets(user, move.moveId); + const moveIndex = moveset.findIndex(m => m?.moveId === move?.moveId); + const moveTargets = getMoveTargets(user, move?.moveId!); // TODO: is this bang correct? if (!moveTargets.targets.length) { return false; } @@ -4771,8 +5312,8 @@ export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr { } } const targets = selectTargets; - user.getMoveQueue().push({ move: move.moveId, targets: targets, ignorePP: true }); - user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, moveset[moveIndex], true)); + user.getMoveQueue().push({ move: move?.moveId!, targets: targets, ignorePP: true }); // TODO: is this bang correct? + user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, moveset[moveIndex]!, true)); // There's a PR to re-do the move(s) that use this Attr, gonna put `!` for now return true; } @@ -5014,12 +5555,12 @@ export class ReducePpMoveAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { // Null checks can be skipped due to condition function const lastMove = target.getLastXMoves().find(() => true); - const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); - const lastPpUsed = movesetMove.ppUsed; - movesetMove.ppUsed = Math.min(movesetMove.ppUsed + this.reduction, movesetMove.getMovePp()); - - const message = i18next.t("battle:ppReduced", {targetName: target.name, moveName: movesetMove.getName(), reduction: movesetMove.ppUsed - lastPpUsed}); + const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove?.move); + const lastPpUsed = movesetMove?.ppUsed!; // TODO: is the bang correct? + movesetMove!.ppUsed = Math.min((movesetMove?.ppUsed!) + this.reduction, movesetMove?.getMovePp()!); // TODO: is the bang correct? + const message = i18next.t("battle:ppReduced", {targetName: getPokemonNameWithAffix(target), moveName: movesetMove?.getName(), reduction: (movesetMove?.ppUsed!) - lastPpUsed}); // TODO: is the bang correct? + user.scene.eventTarget.dispatchEvent(new MoveUsedEvent(target?.id, movesetMove?.getMove()!, movesetMove?.ppUsed!)); // TODO: are these bangs correct? user.scene.queueMessage(message); return true; @@ -5029,7 +5570,7 @@ export class ReducePpMoveAttr extends MoveEffectAttr { return (user, target, move) => { const lastMove = target.getLastXMoves().find(() => true); if (lastMove) { - const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); + const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove.move); return !!movesetMove?.getPpRatio(); } return false; @@ -5039,7 +5580,7 @@ export class ReducePpMoveAttr extends MoveEffectAttr { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { const lastMove = target.getLastXMoves().find(() => true); if (lastMove) { - const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); + const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove.move); if (movesetMove) { const maxPp = movesetMove.getMovePp(); const ppLeft = maxPp - movesetMove.ppUsed; @@ -5076,7 +5617,7 @@ export class AttackReducePpMoveAttr extends ReducePpMoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const lastMove = target.getLastXMoves().find(() => true); if (lastMove) { - const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); + const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove.move); if (Boolean(movesetMove?.getPpRatio())) { super.apply(user, target, move, args); } @@ -5122,7 +5663,7 @@ export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { const copiedMove = allMoves[targetMoves[0].move]; - const thisMoveIndex = user.getMoveset().findIndex(m => m.moveId === move.id); + const thisMoveIndex = user.getMoveset().findIndex(m => m?.moveId === move.id); if (thisMoveIndex === -1) { return false; @@ -5131,7 +5672,7 @@ export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { user.summonData.moveset = user.getMoveset().slice(0); user.summonData.moveset[thisMoveIndex] = new PokemonMove(copiedMove.id, 0, 0); - user.scene.queueMessage(getPokemonMessage(user, ` copied\n${copiedMove.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:copiedMove", {pokemonName: getPokemonNameWithAffix(user), moveName: copiedMove.name})); return true; } @@ -5141,32 +5682,46 @@ export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { } } +/** + * Attribute for {@linkcode Moves.SKETCH} that causes the user to copy the opponent's last used move + * This move copies the last used non-virtual move + * e.g. if Metronome is used, it copies Metronome itself, not the virtual move called by Metronome + * Fails if the opponent has not yet used a move. + * Fails if used on an uncopiable move, listed in unsketchableMoves in getCondition + * Fails if the move is already in the user's moveset + */ export class SketchAttr extends MoveEffectAttr { constructor() { super(true); } + /** + * User copies the opponent's last used move, if possible + * @param {Pokemon} user Pokemon that used the move and will replace Sketch with the copied move + * @param {Pokemon} target Pokemon that the user wants to copy a move from + * @param {Move} move Move being used + * @param {any[]} args Unused + * @returns {boolean} true if the function succeeds, otherwise false + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - const targetMoves = target.getMoveHistory().filter(m => !m.virtual); - if (!targetMoves.length) { + const targetMove = target.getMoveHistory().filter(m => !m.virtual).at(-1); + if (!targetMove) { return false; } - const sketchedMove = allMoves[targetMoves[0].move]; - - const sketchIndex = user.getMoveset().findIndex(m => m.moveId === move.id); - + const sketchedMove = allMoves[targetMove.move]; + const sketchIndex = user.getMoveset().findIndex(m => m?.moveId === move.id); if (sketchIndex === -1) { return false; } user.setMove(sketchIndex, sketchedMove.id); - user.scene.queueMessage(getPokemonMessage(user, ` sketched\n${sketchedMove.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:sketchedMove", {pokemonName: getPokemonNameWithAffix(user), moveName: sketchedMove.name})); return true; } @@ -5177,14 +5732,28 @@ export class SketchAttr extends MoveEffectAttr { return false; } - const targetMoves = target.getMoveHistory().filter(m => !m.virtual); - if (!targetMoves.length) { + const targetMove = target.getMoveHistory().filter(m => !m.virtual).at(-1); + if (!targetMove) { return false; } - const sketchableMove = targetMoves[0]; + const unsketchableMoves = [ + Moves.CHATTER, + Moves.MIRROR_MOVE, + Moves.SLEEP_TALK, + Moves.STRUGGLE, + Moves.SKETCH, + Moves.REVIVAL_BLESSING, + Moves.TERA_STARSTORM, + Moves.BREAKNECK_BLITZ__PHYSICAL, + Moves.BREAKNECK_BLITZ__SPECIAL + ]; - if (user.getMoveset().find(m => m.moveId === sketchableMove.move)) { + if (unsketchableMoves.includes(targetMove.move)) { + return false; + } + + if (user.getMoveset().find(m => m?.moveId === targetMove.move)) { return false; } @@ -5207,9 +5776,12 @@ export class AbilityChangeAttr extends MoveEffectAttr { return false; } - (this.selfTarget ? user : target).summonData.ability = this.ability; + const moveTarget = this.selfTarget ? user : target; - user.scene.queueMessage("The " + getPokemonMessage((this.selfTarget ? user : target), ` acquired\n${allAbilities[this.ability].name}!`)); + moveTarget.summonData.ability = this.ability; + user.scene.triggerPokemonFormChange(moveTarget, SpeciesFormChangeRevertWeatherFormTrigger); + + user.scene.queueMessage(i18next.t("moveTriggers:acquiredAbility", {pokemonName: getPokemonNameWithAffix((this.selfTarget ? user : target)), abilityName: allAbilities[this.ability].name})); return true; } @@ -5235,11 +5807,11 @@ export class AbilityCopyAttr extends MoveEffectAttr { user.summonData.ability = target.getAbility().id; - user.scene.queueMessage(getPokemonMessage(user, " copied the ") + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name})); if (this.copyToPartner && user.scene.currentBattle?.double && user.getAlly().hp) { user.getAlly().summonData.ability = target.getAbility().id; - user.getAlly().scene.queueMessage(getPokemonMessage(user.getAlly(), " copied the ") + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); + user.getAlly().scene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", {pokemonName: getPokemonNameWithAffix(user.getAlly()), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name})); } return true; @@ -5272,7 +5844,7 @@ export class AbilityGiveAttr extends MoveEffectAttr { target.summonData.ability = user.getAbility().id; - user.scene.queueMessage("The" + getPokemonMessage(target, `\nacquired ${allAbilities[user.getAbility().id].name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:acquiredAbility", {pokemonName: getPokemonNameWithAffix(target), abilityName: allAbilities[user.getAbility().id].name})); return true; } @@ -5292,7 +5864,11 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr { user.summonData.ability = target.getAbility().id; target.summonData.ability = tempAbilityId; - user.scene.queueMessage(getPokemonMessage(user, " swapped\nabilities with its target!")); + user.scene.queueMessage(i18next.t("moveTriggers:swappedAbilitiesWithTarget", {pokemonName: getPokemonNameWithAffix(user)})); + // Swaps Forecast/Flower Gift from Castform/Cherrim + user.scene.arena.triggerWeatherBasedFormChangesToNormal(); + // Swaps Forecast/Flower Gift to Castform/Cherrim (edge case) + user.scene.arena.triggerWeatherBasedFormChanges(); return true; } @@ -5318,8 +5894,9 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { } target.summonData.abilitySuppressed = true; + target.scene.arena.triggerWeatherBasedFormChangesToNormal(); - target.scene.queueMessage(getPokemonMessage(target, "'s ability\nwas suppressed!")); + target.scene.queueMessage(i18next.t("moveTriggers:suppressAbilities", {pokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -5371,21 +5948,120 @@ 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); - user.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); + + // Copy all stats (except HP) + for (const s of EFFECTIVE_STATS) { + user.setStat(s, target.getStat(s, false), false); + } + + // Copy all stat stages + for (const s of BATTLE_STATS) { + user.setStatStage(s, target.getStatStage(s)); + } + + user.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m?.moveId!, m?.ppUsed, m?.ppUp)); // TODO: is this bang correct? user.summonData.types = target.getTypes(); - user.scene.queueMessage(getPokemonMessage(user, ` transformed\ninto ${target.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target)})); 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); @@ -5407,7 +6083,7 @@ export class MoneyAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move): boolean { user.scene.currentBattle.moneyScattered += user.scene.getWaveMoneyAmount(0.2); - user.scene.queueMessage("Coins were scattered everywhere!"); + user.scene.queueMessage(i18next.t("moveTriggers:coinsScatteredEverywhere")); return true; } } @@ -5431,17 +6107,68 @@ export class DestinyBondAttr extends MoveEffectAttr { * @returns true */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - user.scene.queueMessage(`${getPokemonMessage(user, " is trying\nto take its foe down with it!")}`); + user.scene.queueMessage(`${i18next.t("moveTriggers:tryingToTakeFoeDown", {pokemonName: getPokemonNameWithAffix(user)})}`); user.addTag(BattlerTagType.DESTINY_BOND, undefined, move.id, user.id); return true; } } +/** + * 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) => { const uniqueUsedMoveIds = new Set(); - const movesetMoveIds = user.getMoveset().map(m => m.moveId); + const movesetMoveIds = user.getMoveset().map(m => m?.moveId); user.getMoveHistory().map(m => { if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move)) { uniqueUsedMoveIds.add(m.move); @@ -5464,14 +6191,13 @@ export class AttackedByItemAttr extends MoveAttr { */ getCondition(): MoveConditionFunc { return (user: Pokemon, target: Pokemon, move: Move) => { - const heldItems = target.getHeldItems().filter(i => i.getTransferrable(true)); + const heldItems = target.getHeldItems().filter(i => i.isTransferrable); if (heldItems.length === 0) { return false; } const itemName = heldItems[0]?.type?.name ?? "item"; - const attackedByItemString = ` is about to be attacked by its ${itemName}!`; - target.scene.queueMessage(getPokemonMessage(target, attackedByItemString)); + target.scene.queueMessage(i18next.t("moveTriggers:attackedByItem", {pokemonName: getPokemonNameWithAffix(target), itemName: itemName})); return true; }; @@ -5505,7 +6231,7 @@ const failIfDampCondition: MoveConditionFunc = (user, target, move) => { user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); // Queue a message if an ability prevented usage of the move if (cancelled.value) { - user.scene.queueMessage(getPokemonMessage(user, ` cannot use ${move.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:cannotUseMove", {pokemonName: getPokemonNameWithAffix(user), moveName: move.name})); } return !cancelled.value; }; @@ -5514,9 +6240,11 @@ const userSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target: const targetSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => target.status?.effect === StatusEffect.SLEEP || target.hasAbility(Abilities.COMATOSE); +const failIfLastCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => user.scene.phaseQueue.find(phase => phase instanceof MovePhase) !== undefined; + export type MoveAttrFilter = (attr: MoveAttr) => boolean; -function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { +function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise { return new Promise(resolve => { const attrPromises: Promise[] = []; const moveAttrs = move.attrs.filter(a => attrFilter(a)); @@ -5530,11 +6258,11 @@ function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon, targe }); } -export function applyMoveAttrs(attrType: Constructor, user: Pokemon, target: Pokemon, move: Move, ...args: any[]): Promise { +export function applyMoveAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: Move, ...args: any[]): Promise { return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } -export function applyFilteredMoveAttrs(attrFilter: MoveAttrFilter, user: Pokemon, target: Pokemon, move: Move, ...args: any[]): Promise { +export function applyFilteredMoveAttrs(attrFilter: MoveAttrFilter, user: Pokemon, target: Pokemon | null, move: Move, ...args: any[]): Promise { return applyMoveAttrsInternal(attrFilter, user, target, move, args); } @@ -5575,6 +6303,114 @@ export class hitsSameTypeAttr extends VariableMoveTypeMultiplierAttr { } } +/** + * Attribute used for Conversion 2, to convert the user's type to a random type that resists the target's last used move. + * Fails if the user already has ALL types that resist the target's last used move. + * Fails if the opponent has not used a move yet + * Fails if the type is unknown or stellar + * + * TODO: + * If a move has its type changed (e.g. {@linkcode Moves.HIDDEN_POWER}), it will check the new type. + */ +export class ResistLastMoveTypeAttr extends MoveEffectAttr { + constructor() { + super(true); + } + /** + * User changes its type to a random type that resists the target's last used move + * @param {Pokemon} user Pokemon that used the move and will change types + * @param {Pokemon} target Opposing pokemon that recently used a move + * @param {Move} move Move being used + * @param {any[]} args Unused + * @returns {boolean} true if the function succeeds + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } + + const [targetMove] = target.getLastXMoves(1); // target's most recent move + if (!targetMove) { + return false; + } + + const moveData = allMoves[targetMove.move]; + if (moveData.type === Type.STELLAR || moveData.type === Type.UNKNOWN) { + return false; + } + const userTypes = user.getTypes(); + 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; + } + const type = validTypes[user.randSeedInt(validTypes.length)]; + user.summonData.types = [ type ]; + user.scene.queueMessage(i18next.t("battle:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(Type[type])})); + user.updateInfo(); + + 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(); + return moveHistory.length !== 0; + }; + } +} + +/** + * Drops the target's immunity to types it is immune to + * and makes its evasiveness be ignored during accuracy + * checks. Used by: {@linkcode Moves.ODOR_SLEUTH | Odor Sleuth}, {@linkcode Moves.MIRACLE_EYE | Miracle Eye} and {@linkcode Moves.FORESIGHT | Foresight} + * + * @extends AddBattlerTagAttr + * @see {@linkcode apply} + */ +export class ExposedMoveAttr extends AddBattlerTagAttr { + constructor(tagType: BattlerTagType) { + super(tagType, false, true); + } + + /** + * Applies {@linkcode ExposedTag} to the target. + * @param user {@linkcode Pokemon} using this move + * @param target {@linkcode Pokemon} target of this move + * @param move {@linkcode Move} being used + * @param args N/A + * @returns `true` if the function succeeds + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } + + user.scene.queueMessage(i18next.t("moveTriggers:exposedMove", { pokemonName: getPokemonNameWithAffix(user), targetPokemonName: getPokemonNameWithAffix(target)})); + + return true; + } +} + + const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(Type.UNKNOWN); export type MoveTargetSet = { @@ -5643,6 +6479,8 @@ export const allMoves: Move[] = [ new SelfStatusMove(Moves.NONE, Type.NORMAL, MoveCategory.STATUS, -1, -1, 0, 1), ]; +export const selfStatLowerMoves: Moves[] = []; + export function initMoves() { allMoves.push( new AttackMove(Moves.POUND, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), @@ -5673,13 +6511,13 @@ export function initMoves() { .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), new AttackMove(Moves.RAZOR_WIND, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, "whipped\nup a whirlwind!") + .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, i18next.t("moveTriggers:whippedUpAWhirlwind", {pokemonName: "{USER}"})) .attr(HighCritAttr) .windMove() .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(), @@ -5693,7 +6531,7 @@ export function initMoves() { .hidesTarget() .windMove(), new AttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.FLY_CHARGING, "flew\nup high!", BattlerTagType.FLYING) + .attr(ChargeAttr, ChargeAnim.FLY_CHARGING, i18next.t("moveTriggers:flewUpHigh", {pokemonName: "{USER}"}), BattlerTagType.FLYING) .condition(failOnGravityCondition) .ignoresVirtual(), new AttackMove(Moves.BIND, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) @@ -5715,7 +6553,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), @@ -5737,12 +6575,13 @@ export function initMoves() { new AttackMove(Moves.THRASH, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) + .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), new AttackMove(Moves.DOUBLE_EDGE, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 1) .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) @@ -5755,13 +6594,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) @@ -5777,10 +6616,11 @@ export function initMoves() { new AttackMove(Moves.SONIC_BOOM, Type.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1) .attr(FixedDamageAttr, 20), new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1) - .attr(DisableMoveAttr) + .attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true) + .condition((user, target, move) => target.getMoveHistory().reverse().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual) !== undefined) .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), @@ -5793,7 +6633,8 @@ export function initMoves() { new AttackMove(Moves.HYDRO_PUMP, Type.WATER, MoveCategory.SPECIAL, 110, 80, 5, -1, 0, 1), new AttackMove(Moves.SURF, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 1) .target(MoveTarget.ALL_NEAR_OTHERS) - .attr(HitsTagAttr, BattlerTagType.UNDERWATER, true), + .attr(HitsTagAttr, BattlerTagType.UNDERWATER, true) + .attr(GulpMissileTagAttr), new AttackMove(Moves.ICE_BEAM, Type.ICE, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.FREEZE), new AttackMove(Moves.BLIZZARD, Type.ICE, MoveCategory.SPECIAL, 110, 70, 5, 10, 0, 1) @@ -5804,9 +6645,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), @@ -5833,14 +6674,14 @@ 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) .slicingMove() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SOLAR_BEAM, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) - .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, "took\nin sunlight!") + .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, i18next.t("moveTriggers:tookInSunlight", {pokemonName: "{USER}"})) .attr(AntiSunlightPowerDecreaseAttr) .ignoresVirtual(), new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) @@ -5855,11 +6696,12 @@ export function initMoves() { new AttackMove(Moves.PETAL_DANCE, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) + .attr(NoEffectAttr, frenzyMissFunc) .makesContact() .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), @@ -5871,7 +6713,7 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new StatusMove(Moves.THUNDER_WAVE, Type.ELECTRIC, 90, 20, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .attr(StatusMoveTypeImmunityAttr, Type.GROUND), + .attr(RespectAttackTypeImmunityAttr), new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(ThunderAccuracyAttr) @@ -5888,7 +6730,7 @@ export function initMoves() { .attr(HitsTagAttr, BattlerTagType.UNDERGROUND, false) .makesContact(false), new AttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, "dug a hole!", BattlerTagType.UNDERGROUND) + .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, i18next.t("moveTriggers:dugAHole", {pokemonName: "{USER}"}), BattlerTagType.UNDERGROUND) .ignoresVirtual(), new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.TOXIC) @@ -5896,13 +6738,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(), @@ -5915,34 +6757,33 @@ 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), - new StatusMove(Moves.HAZE, Type.ICE, -1, 30, -1, 0, 1) - .target(MoveTarget.BOTH_SIDES) - .attr(ResetStatsAttr), + new SelfStatusMove(Moves.HAZE, Type.ICE, -1, 30, -1, 0, 1) + .attr(ResetStatsAttr, true), new StatusMove(Moves.REFLECT, Type.PSYCHIC, -1, 20, -1, 0, 1) .attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, true) .target(MoveTarget.USER_SIDE), @@ -5984,18 +6825,18 @@ export function initMoves() { new AttackMove(Moves.SWIFT, Type.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, "lowered\nits head!", null, true) - .attr(StatChangeAttr, BattleStat.DEF, 1, true) + .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, i18next.t("moveTriggers:loweredItsHead", {pokemonName: "{USER}"}), null, 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(), @@ -6023,7 +6864,7 @@ export function initMoves() { new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP), new AttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKY_ATTACK_CHARGING, "is glowing!") + .attr(ChargeAttr, ChargeAnim.SKY_ATTACK_CHARGING, i18next.t("moveTriggers:isGlowing", {pokemonName: "{USER}"})) .attr(HighCritAttr) .attr(FlinchAttr) .makesContact(false) @@ -6032,7 +6873,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) @@ -6041,13 +6882,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) @@ -6063,7 +6904,7 @@ export function initMoves() { new SelfStatusMove(Moves.REST, Type.PSYCHIC, -1, 5, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP, true, 3, true) .attr(HealAttr, 1, true) - .condition((user, target, move) => user.getHpRatio() < 1 && user.canSetStatus(StatusEffect.SLEEP, true, true)) + .condition((user, target, move) => !user.isFullHp() && user.canSetStatus(StatusEffect.SLEEP, true, true)) .triageMove(), new AttackMove(Moves.ROCK_SLIDE, Type.ROCK, MoveCategory.PHYSICAL, 75, 90, 10, 30, 0, 1) .attr(FlinchAttr) @@ -6073,7 +6914,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) @@ -6122,11 +6963,13 @@ export function initMoves() { new AttackMove(Moves.FLAIL, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), new StatusMove(Moves.CONVERSION_2, Type.NORMAL, -1, 30, -1, 0, 2) - .unimplemented(), + .attr(ResistLastMoveTypeAttr) + .partial(), // Checks the move's original typing and not if its type is changed through some other means new AttackMove(Moves.AEROBLAST, Type.FLYING, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 2) + .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) @@ -6137,23 +6980,26 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.FREEZE) .target(MoveTarget.ALL_NEAR_ENEMIES), new SelfStatusMove(Moves.PROTECT, Type.NORMAL, -1, 10, -1, 4, 2) - .attr(ProtectAttr), + .attr(ProtectAttr) + .condition(failIfLastCondition), 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(HalfHpStatMaxAttr, 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) @@ -6162,10 +7008,19 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .ballBombMove(), new StatusMove(Moves.FORESIGHT, Type.NORMAL, -1, 40, -1, 0, 2) - .unimplemented(), + .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST), new SelfStatusMove(Moves.DESTINY_BOND, Type.GHOST, -1, 5, -1, 0, 2) .ignoresProtect() - .attr(DestinyBondAttr), + .attr(DestinyBondAttr) + .condition((user, target, move) => { + // Retrieves user's previous move, returns empty array if no moves have been used + const lastTurnMove = user.getLastXMoves(1); + // Checks last move and allows destiny bond to be used if: + // - no previous moves have been made + // - the previous move used was not destiny bond + // - the previous move was unsuccessful + return lastTurnMove.length === 0 || lastTurnMove[0].move !== move.id || lastTurnMove[0].result !== MoveResult.SUCCESS; + }), new StatusMove(Moves.PERISH_SONG, Type.NORMAL, -1, 5, -1, 0, 2) .attr(FaintCountdownAttr) .ignoresProtect() @@ -6173,11 +7028,12 @@ 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) - .attr(ProtectAttr), + .attr(ProtectAttr) + .condition(failIfLastCondition), new AttackMove(Moves.BONE_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 2) .attr(MultiHitAttr) .makesContact(false), @@ -6186,6 +7042,7 @@ export function initMoves() { new AttackMove(Moves.OUTRAGE, Type.DRAGON, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 2) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) + .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), new StatusMove(Moves.SANDSTORM, Type.ROCK, -1, 10, -1, 0, 2) .attr(WeatherChangeAttr, WeatherType.SANDSTORM) @@ -6194,15 +7051,16 @@ export function initMoves() { .attr(HitHealAttr) .triageMove(), new SelfStatusMove(Moves.ENDURE, Type.NORMAL, -1, 10, -1, 4, 2) - .attr(EndureAttr), + .attr(ProtectAttr, BattlerTagType.ENDURING) + .condition(failIfLastCondition), 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) @@ -6213,7 +7071,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) @@ -6226,7 +7084,7 @@ export function initMoves() { .target(MoveTarget.ALL_ENEMIES) .ignoresVirtual(), new StatusMove(Moves.HEAL_BELL, Type.NORMAL, -1, 5, -1, 0, 2) - .attr(PartyStatusCureAttr, "A bell chimed!", Abilities.SOUNDPROOF) + .attr(PartyStatusCureAttr, i18next.t("moveTriggers:bellChimed"), Abilities.SOUNDPROOF) .soundBased() .target(MoveTarget.PARTY), new AttackMove(Moves.RETURN, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) @@ -6238,7 +7096,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), @@ -6267,7 +7125,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, @@ -6283,12 +7141,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) @@ -6315,7 +7173,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) @@ -6324,14 +7182,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) - .attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, "foresaw\nan attack!"), + .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), @@ -6348,12 +7207,17 @@ export function initMoves() { .target(MoveTarget.RANDOM_NEAR_ENEMY) .partial(), new SelfStatusMove(Moves.STOCKPILE, Type.NORMAL, -1, 20, -1, 0, 3) - .unimplemented(), - new AttackMove(Moves.SPIT_UP, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 3) - .unimplemented(), + .condition(user => (user.getTag(StockpilingTag)?.stockpiledCount ?? 0) < 3) + .attr(AddBattlerTagAttr, BattlerTagType.STOCKPILING, true), + new AttackMove(Moves.SPIT_UP, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 10, -1, 0, 3) + .condition(hasStockpileStacksCondition) + .attr(SpitUpPowerAttr, 100) + .attr(RemoveBattlerTagAttr, [BattlerTagType.STOCKPILING], true), new SelfStatusMove(Moves.SWALLOW, Type.NORMAL, -1, 10, -1, 0, 3) - .triageMove() - .unimplemented(), + .condition(hasStockpileStacksCondition) + .attr(SwallowHealAttr) + .attr(RemoveBattlerTagAttr, [BattlerTagType.STOCKPILING], true) + .triageMove(), new AttackMove(Moves.HEAT_WAVE, Type.FIRE, MoveCategory.SPECIAL, 95, 90, 10, 10, 0, 3) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) @@ -6365,18 +7229,19 @@ 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) .attr(BypassBurnDamageReductionAttr), new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) + .attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", {pokemonName: getPokemonNameWithAffix(user)})) .punchingMove() .ignoresVirtual() .condition((user, target, move) => !user.turnData.attacksReceived.find(r => r.damage)), @@ -6389,7 +7254,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(), @@ -6409,7 +7274,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) @@ -6420,9 +7285,9 @@ 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.getTransferrable(false)).length > 0 ? 1.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferrable).length > 0 ? 1.5 : 1) .attr(RemoveHeldItemAttr, false), new AttackMove(Moves.ENDEAVOR, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3) .attr(MatchHpAttr) @@ -6436,7 +7301,7 @@ export function initMoves() { .unimplemented(), new SelfStatusMove(Moves.REFRESH, Type.NORMAL, -1, 20, -1, 0, 3) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN) - .condition((user, target, move) => user.status && (user.status.effect === StatusEffect.PARALYSIS || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.BURN)), + .condition((user, target, move) => !!user.status && (user.status.effect === StatusEffect.PARALYSIS || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.BURN)), new SelfStatusMove(Moves.GRUDGE, Type.GHOST, -1, 5, -1, 0, 3) .unimplemented(), new SelfStatusMove(Moves.SNATCH, Type.DARK, -1, 10, -1, 4, 3) @@ -6445,21 +7310,22 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) - .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, "hid\nunderwater!", BattlerTagType.UNDERWATER) + .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, i18next.t("moveTriggers:hidUnderwater", {pokemonName: "{USER}"}), BattlerTagType.UNDERWATER, true) + .attr(GulpMissileTagAttr) .ignoresVirtual(), new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) .attr(MultiHitAttr), 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) @@ -6486,51 +7352,51 @@ 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), new AttackMove(Moves.WEATHER_BALL, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 3) .attr(WeatherBallTypeAttr) - .attr(MovePowerMultiplierAttr, (user, target, move) => [WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN].includes(user.scene.arena.weather?.weatherType) && !user.scene.arena.weather?.isEffectSuppressed(user.scene) ? 2 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => [WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN].includes(user.scene.arena.weather?.weatherType!) && !user.scene.arena.weather?.isEffectSuppressed(user.scene) ? 2 : 1) // TODO: is this bang correct? .ballBombMove(), new StatusMove(Moves.AROMATHERAPY, Type.GRASS, -1, 5, -1, 0, 3) - .attr(PartyStatusCureAttr, "A soothing aroma wafted through the area!", Abilities.SAP_SIPPER) + .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) - .unimplemented(), + .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), @@ -6551,7 +7417,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) @@ -6563,25 +7429,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, "sprang up!", BattlerTagType.FLYING) + .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), @@ -6596,12 +7462,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) @@ -6612,9 +7478,10 @@ export function initMoves() { .attr(ConfuseAttr) .pulseMove(), new AttackMove(Moves.DOOM_DESIRE, Type.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) - .attr(DelayedAttackAttr, ArenaTagType.DOOM_DESIRE, ChargeAnim.DOOM_DESIRE_CHARGING, "chose\nDoom Desire as its destiny!"), + .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) @@ -6623,12 +7490,12 @@ export function initMoves() { .attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5) .target(MoveTarget.BOTH_SIDES), new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4) - .unimplemented(), + .attr(ExposedMoveAttr, BattlerTagType.IGNORE_DARK), new AttackMove(Moves.WAKE_UP_SLAP, Type.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => targetSleptOrComatoseCondition(user, target, move) ? 2 : 1) .attr(HealStatusEffectAttr, false, StatusEffect.SLEEP), new AttackMove(Moves.HAMMER_ARM, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, -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) @@ -6653,18 +7520,19 @@ 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) + .redirectCounter() .makesContact(false) .target(MoveTarget.ATTACKER), new AttackMove(Moves.U_TURN, Type.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) .attr(ForceSwitchOutAttr, true, false), new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -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), + .attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.BALL ? 2 : 1), new AttackMove(Moves.ASSURANCE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.turnData.damageTaken > 0 ? 2 : 1), new StatusMove(Moves.EMBARGO, Type.DARK, 100, 15, -1, 0, 4) @@ -6674,12 +7542,13 @@ export function initMoves() { .unimplemented(), new StatusMove(Moves.PSYCHO_SHIFT, Type.PSYCHIC, 100, 10, -1, 0, 4) .attr(PsychoShiftEffectAttr) - .condition((user, target, move) => (user.status?.effect === StatusEffect.BURN - || user.status?.effect === StatusEffect.POISON - || user.status?.effect === StatusEffect.TOXIC - || user.status?.effect === StatusEffect.PARALYSIS - || user.status?.effect === StatusEffect.SLEEP) - && target.canSetStatus(user.status?.effect, false, false, user) + .condition((user, target, move) => { + let statusToApply = user.hasAbility(Abilities.COMATOSE) ? StatusEffect.SLEEP : undefined; + if (user.status?.effect && isNonVolatileStatusEffect(user.status.effect)) { + statusToApply = user.status.effect; + } + return !!statusToApply && target.canSetStatus(statusToApply, false, false, user); + } ), new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) .makesContact() @@ -6688,16 +7557,15 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), new AttackMove(Moves.WRING_OUT, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4) - .attr(OpponentHighHpPowerAttr) + .attr(OpponentHighHpPowerAttr, 120) .makesContact(), new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4) .unimplemented(), new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4) .attr(SuppressAbilitiesAttr), new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4) - .attr(AddBattlerTagAttr, BattlerTagType.NO_CRIT, false, false, 5) - .target(MoveTarget.USER_SIDE) - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.NO_CRIT, 5, true, true) + .target(MoveTarget.USER_SIDE), new StatusMove(Moves.ME_FIRST, Type.NORMAL, -1, 20, -1, 0, 4) .ignoresVirtual() .target(MoveTarget.NEAR_ENEMY) @@ -6706,9 +7574,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), @@ -6717,12 +7585,12 @@ export function initMoves() { new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4) .attr(AbilityChangeAttr, Abilities.INSOMNIA), new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) - .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()].move.move].category !== MoveCategory.STATUS), + .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? new StatusMove(Moves.TOXIC_SPIKES, Type.POISON, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES) .target(MoveTarget.ENEMY_SIDE), 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) @@ -6739,7 +7607,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) @@ -6758,7 +7626,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(), @@ -6773,22 +7641,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) @@ -6811,7 +7679,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) @@ -6820,13 +7688,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) @@ -6836,7 +7704,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), @@ -6844,7 +7712,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) @@ -6866,7 +7734,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) @@ -6884,7 +7752,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(), @@ -6893,7 +7761,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(), @@ -6912,30 +7780,31 @@ export function initMoves() { .triageMove() .unimplemented(), new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) - .attr(OpponentHighHpPowerAttr), + .attr(OpponentHighHpPowerAttr, 120), new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4) .attr(TrapAttr, BattlerTagType.MAGMA_STORM), - new StatusMove(Moves.DARK_VOID, Type.DARK, 50, 10, -1, 0, 4) + new StatusMove(Moves.DARK_VOID, Type.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6 .attr(StatusEffectAttr, StatusEffect.SLEEP) .target(MoveTarget.ALL_NEAR_ENEMIES), 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, "vanished\ninstantly!", BattlerTagType.HIDDEN) + .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), + .attr(AddArenaTagAttr, ArenaTagType.WIDE_GUARD, 1, true, true) + .condition(failIfLastCondition), 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) @@ -6945,7 +7814,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() @@ -6966,12 +7835,12 @@ export function initMoves() { new AttackMove(Moves.STORM_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) .attr(CritOnlyAttr), new AttackMove(Moves.FLAME_BURST, Type.FIRE, MoveCategory.SPECIAL, 70, 100, 15, -1, 0, 5) - .partial(), + .attr(FlameBurstAttr), new AttackMove(Moves.SLUDGE_WAVE, Type.POISON, MoveCategory.SPECIAL, 95, 100, 10, 10, 0, 5) .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) @@ -6988,13 +7857,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), @@ -7012,14 +7881,15 @@ 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), + .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), + .attr(AddArenaTagAttr, ArenaTagType.QUICK_GUARD, 1, true, true) + .condition(failIfLastCondition), new SelfStatusMove(Moves.ALLY_SWITCH, Type.PSYCHIC, -1, 15, -1, 2, 5) .ignoresProtect() .unimplemented(), @@ -7028,8 +7898,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() @@ -7039,12 +7909,12 @@ export function initMoves() { MovePowerMultiplierAttr, (user, target, move) => target.status || target.hasAbility(Abilities.COMATOSE)? 2 : 1), new AttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) - .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, "took {TARGET}\ninto the sky!", BattlerTagType.FLYING) // TODO: Add 2nd turn message + .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, i18next.t("moveTriggers:tookTargetIntoSky", {pokemonName: "{USER}", targetName: "{TARGET}"}), BattlerTagType.FLYING) // TODO: Add 2nd turn message .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) @@ -7053,7 +7923,7 @@ export function initMoves() { new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5) .unimplemented(), new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) - .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().filter(i => i.getTransferrable(true)).reduce((v, m) => v + m.stackCount, 0))), + .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().filter(i => i.isTransferrable).reduce((v, m) => v + m.stackCount, 0))), new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5) .attr(CopyTypeAttr), new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) @@ -7075,20 +7945,21 @@ 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) .attr(CritOnlyAttr), new AttackMove(Moves.DRAGON_TAIL, Type.DRAGON, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) - .attr(ForceSwitchOutAttr), + .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) @@ -7103,10 +7974,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) @@ -7114,13 +7985,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) @@ -7149,38 +8020,38 @@ 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, "became cloaked\nin a freezing light!") + .attr(ChargeAttr, ChargeAnim.FREEZE_SHOCK_CHARGING, i18next.t("moveTriggers:becameCloakedInFreezingLight", {pokemonName: "{USER}"})) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .makesContact(false), new AttackMove(Moves.ICE_BURN, Type.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) - .attr(ChargeAttr, ChargeAnim.ICE_BURN_CHARGING, "became cloaked\nin freezing air!") + .attr(ChargeAttr, ChargeAnim.ICE_BURN_CHARGING, i18next.t("moveTriggers:becameCloakedInFreezingAir", {pokemonName: "{USER}"})) .attr(StatusEffectAttr, StatusEffect.BURN) .ignoresVirtual(), new AttackMove(Moves.SNARL, Type.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) - .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) - .partial(), + .attr(LastMoveDoublePowerAttr, Moves.FUSION_BOLT), new AttackMove(Moves.FUSION_BOLT, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 5) - .makesContact(false) - .partial(), + .attr(LastMoveDoublePowerAttr, Moves.FUSION_FLARE) + .makesContact(false), new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) .attr(MinimizeAccuracyAttr) .attr(FlyingTypeMultiplierAttr) @@ -7189,30 +8060,31 @@ export function initMoves() { new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.MAT_BLOCK, 1, true, true) - .condition(new FirstMoveCondition()), + .condition(new FirstMoveCondition()) + .condition(failIfLastCondition), new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) .condition((user, target, move) => user.battleData.berriesEaten.length > 0), new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) - .condition((user,target,move) => { + .condition((user, target, move) => { // 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()); + 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, "vanished\ninstantly!", BattlerTagType.HIDDEN) + .attr(ChargeAttr, ChargeAnim.PHANTOM_FORCE_CHARGING, i18next.t("moveTriggers:vanishedInstantly", {pokemonName: "{USER}"}), BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) .attr(AddTypeAttr, Type.GHOST) .partial(), new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -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) @@ -7230,12 +8102,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) @@ -7246,10 +8119,11 @@ export function initMoves() { .triageMove(), new StatusMove(Moves.CRAFTY_SHIELD, Type.FAIRY, -1, 10, -1, 3, 6) .target(MoveTarget.USER_SIDE) - .attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true), + .attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true) + .condition(failIfLastCondition), 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), @@ -7259,11 +8133,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), @@ -7271,14 +8145,15 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES) .unimplemented(), new SelfStatusMove(Moves.KINGS_SHIELD, Type.STEEL, -1, 10, -1, 4, 6) - .attr(ProtectAttr, BattlerTagType.KINGS_SHIELD), + .attr(ProtectAttr, BattlerTagType.KINGS_SHIELD) + .condition(failIfLastCondition), 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) @@ -7292,26 +8167,27 @@ 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), + .attr(ProtectAttr, BattlerTagType.SPIKY_SHIELD) + .condition(failIfLastCondition), 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, "is charging its power!") - .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 2, true) + .attr(ChargeAttr, ChargeAnim.GEOMANCY_CHARGING, i18next.t("moveTriggers:isChargingPower", {pokemonName: "{USER}"})) + .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true) .ignoresVirtual(), new StatusMove(Moves.MAGNETIC_FLUX, Type.ELECTRIC, -1, 20, -1, 0, 6) - .attr(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 @@ -7326,7 +8202,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) @@ -7335,7 +8211,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) @@ -7344,6 +8220,7 @@ export function initMoves() { .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(HitsTagAttr, BattlerTagType.FLYING, false) + .attr(HitsTagAttr, BattlerTagType.MAGNET_RISEN, false) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) .makesContact(false) @@ -7365,9 +8242,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 */ @@ -7489,18 +8366,19 @@ export function initMoves() { new AttackMove(Moves.FIRST_IMPRESSION, Type.BUG, MoveCategory.PHYSICAL, 90, 100, 10, -1, 2, 7) .condition(new FirstMoveCondition()), new SelfStatusMove(Moves.BANEFUL_BUNKER, Type.POISON, -1, 10, -1, 4, 7) - .attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER), + .attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER) + .condition(failIfLastCondition), new AttackMove(Moves.SPIRIT_SHACKLE, Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false), new AttackMove(Moves.DARKEST_LARIAT, Type.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) - .attr(IgnoreOpponentStatChangesAttr), + .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) @@ -7508,11 +8386,11 @@ 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, "is glowing!") + .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BLADE_CHARGING, i18next.t("moveTriggers:isGlowing", {pokemonName: "{USER}"})) .attr(AntiSunlightPowerDecreaseAttr) .slicingMove(), new AttackMove(Moves.LEAFAGE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 7) @@ -7521,11 +8399,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) @@ -7540,11 +8418,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); @@ -7552,14 +8430,14 @@ export function initMoves() { }) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(RemoveTypeAttr, Type.FIRE, (user) => { - user.scene.queueMessage(getPokemonMessage(user, " burned itself out!")); + 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( - (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect)) + (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect!)) // TODO: is this bang correct? .attr(HealAttr, 0.5) .attr(HealStatusEffectAttr, false, ...getNonVolatileStatusEffects()) .triageMove(), @@ -7570,16 +8448,15 @@ 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, 5, 7) - .attr(ChargeAttr, ChargeAnim.BEAK_BLAST_CHARGING, "started\nheating up its beak!", undefined, false, true, -3) + new AttackMove(Moves.BEAK_BLAST, Type.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, -3, 7) + .attr(BeakBlastHeaderAttr) .ballBombMove() - .makesContact(false) - .partial(), + .makesContact(false), new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) - .attr(StatChangeAttr, BattleStat.DEF, -1, 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), @@ -7613,28 +8490,30 @@ 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) .ignoresVirtual(), /* End Unused */ new AttackMove(Moves.SHELL_TRAP, Type.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, -3, 7) + .attr(AddBattlerTagHeaderAttr, BattlerTagType.SHELL_TRAP) .target(MoveTarget.ALL_NEAR_ENEMIES) - .partial(), + // 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) @@ -7646,7 +8525,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) @@ -7688,14 +8567,14 @@ 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() .ignoresVirtual(), /* End Unused */ - new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 100, 2, 7) - .attr(StatChangeAttr, BattleStat.EVA, 1, true), + new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 50, 100, 15, 100, 2, 7) //LGPE Implementation + .attr(CritOnlyAttr), new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -7719,7 +8598,7 @@ export function initMoves() { .makesContact(false) .attr(AddBattlerTagAttr, BattlerTagType.SEEDED), new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) - .attr(ResetStatsAttr), + .attr(ResetStatsAttr, true), new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7) .attr(PartyStatusCureAttr, null, Abilities.NONE), new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7) @@ -7731,32 +8610,43 @@ export function initMoves() { /* Unused */ new SelfStatusMove(Moves.MAX_GUARD, Type.NORMAL, -1, 10, -1, 4, 8) .attr(ProtectAttr) + .condition(failIfLastCondition) .ignoresVirtual(), /* End Unused */ new AttackMove(Moves.DYNAMAX_CANNON, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) - .attr(MovePowerMultiplierAttr, (user, target, move) => target.level > 200 ? 2 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => { + // Move is only stronger against overleveled foes. + if (target.level > target.scene.getMaxExpLevel()) { + const dynamaxCannonPercentMarginBeforeFullDamage = 0.05; // How much % above MaxExpLevel of wave will the target need to be to take full damage. + // The move's power scales as the margin is approached, reaching double power when it does or goes over it. + return 1 + Math.min(1, (target.level - target.scene.getMaxExpLevel()) / (target.scene.getMaxExpLevel() * dynamaxCannonPercentMarginBeforeFullDamage)); + } else { + return 1; + } + }) .attr(DiscourageFrequentUseAttr) .ignoresVirtual(), + new AttackMove(Moves.SNIPE_SHOT, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 8) .attr(HighCritAttr) .attr(BypassRedirectAttr), new AttackMove(Moves.JAW_LOCK, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, true, false, 1) + .attr(JawLockAttr) .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); + 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, true, 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) @@ -7769,8 +8659,7 @@ export function initMoves() { .attr(EatBerryAttr) .target(MoveTarget.ALL), new StatusMove(Moves.OCTOLOCK, Type.FIGHTING, 100, 15, -1, 0, 8) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) - .partial(), + .attr(AddBattlerTagAttr, BattlerTagType.OCTOLOCK, false, true, 1), new AttackMove(Moves.BOLT_BEAK, Type.ELECTRIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) .attr(FirstAttackDoublePowerAttr), new AttackMove(Moves.FISHIOUS_REND, Type.WATER, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) @@ -7852,15 +8741,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), @@ -7873,25 +8763,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) @@ -7899,7 +8789,8 @@ export function initMoves() { .target(MoveTarget.USER_AND_ALLIES) .ignoresProtect(), new SelfStatusMove(Moves.OBSTRUCT, Type.DARK, 100, 10, -1, 4, 8) - .attr(ProtectAttr, BattlerTagType.OBSTRUCT), + .attr(ProtectAttr, BattlerTagType.OBSTRUCT) + .condition(failIfLastCondition), new AttackMove(Moves.FALSE_SURRENDER, Type.DARK, MoveCategory.PHYSICAL, 80, -1, 10, -1, 0, 8), new AttackMove(Moves.METEOR_ASSAULT, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 5, -1, 0, 8) .attr(RechargeAttr) @@ -7915,14 +8806,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, "is overflowing\nwith space power!", null, true) - .attr(StatChangeAttr, BattleStat.SPATK, 1, true) + .attr(ChargeAttr, ChargeAnim.METEOR_BEAM_CHARGING, i18next.t("moveTriggers:isOverflowingWithSpacePower", {pokemonName: "{USER}"}), null, 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) @@ -7935,7 +8826,7 @@ export function initMoves() { .condition(failIfDampCondition) .makesContact(false), new AttackMove(Moves.GRASSY_GLIDE, Type.GRASS, MoveCategory.PHYSICAL, 55, 100, 20, -1, 0, 8) - .attr(IncrementMovePriorityAttr,(user,target,move) =>user.scene.arena.getTerrainType()===TerrainType.GRASSY&&user.isGrounded()), + .attr(IncrementMovePriorityAttr, (user, target, move) =>user.scene.arena.getTerrainType()===TerrainType.GRASSY&&user.isGrounded()), new AttackMove(Moves.RISING_VOLTAGE, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 8) .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.ELECTRIC && target.isGrounded() ? 2 : 1), new AttackMove(Moves.TERRAIN_PULSE, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 8) @@ -7943,12 +8834,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), @@ -7956,7 +8847,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), @@ -7972,8 +8863,8 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.BURN), new StatusMove(Moves.JUNGLE_HEALING, Type.GRASS, -1, 10, -1, 0, 8) .attr(HealAttr, 0.25, true, false) - .target(MoveTarget.USER_AND_ALLIES) - .partial(), + .attr(HealStatusEffectAttr, false, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) + .target(MoveTarget.USER_AND_ALLIES), new AttackMove(Moves.WICKED_BLOW, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) .attr(CritOnlyAttr) .punchingMove(), @@ -7992,7 +8883,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), @@ -8004,22 +8895,23 @@ 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) .attr(MissEffectAttr, frenzyMissFunc) + .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), new AttackMove(Moves.WAVE_CRASH, Type.WATER, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) .attr(RecoilAttr, false, 0.33) @@ -8030,10 +8922,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) @@ -8041,15 +8933,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) @@ -8059,27 +8951,27 @@ export function initMoves() { .attr(AddArenaTrapTagHitAttr, ArenaTagType.SPIKES) .slicingMove(), new AttackMove(Moves.BLEAKWIND_STORM, Type.FLYING, MoveCategory.SPECIAL, 100, 80, 10, 30, 0, 8) - .attr(ThunderAccuracyAttr) - .attr(StatChangeAttr, BattleStat.SPD, -1) + .attr(StormAccuracyAttr) + .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) - .attr(ThunderAccuracyAttr) + .attr(StormAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SANDSEAR_STORM, Type.GROUND, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) - .attr(ThunderAccuracyAttr) + .attr(StormAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.BURN) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.LUNAR_BLESSING, Type.PSYCHIC, -1, 5, -1, 0, 8) - .attr(HealAttr, 0.25) + .attr(HealAttr, 0.25, true, false) + .attr(HealStatusEffectAttr, false, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) .target(MoveTarget.USER_AND_ALLIES) - .triageMove() - .partial(), + .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) @@ -8184,9 +9076,12 @@ export function initMoves() { End Unused */ new AttackMove(Moves.TERA_BLAST, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) .attr(TeraBlastCategoryAttr) - .unimplemented(), + .attr(TeraBlastTypeAttr) + .attr(TeraBlastPowerAttr) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR)), new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9) - .attr(ProtectAttr, BattlerTagType.SILK_TRAP), + .attr(ProtectAttr, BattlerTagType.SILK_TRAP) + .condition(failIfLastCondition), new AttackMove(Moves.AXE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 90, 10, 30, 0, 9) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) @@ -8196,17 +9091,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() @@ -8214,7 +9109,11 @@ export function initMoves() { new AttackMove(Moves.ICE_SPINNER, Type.ICE, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) .attr(ClearTerrainAttr), new AttackMove(Moves.GLAIVE_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) - .partial(), + .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_GET_HIT, true, false, 0, 0, true) + .attr(AddBattlerTagAttr, BattlerTagType.RECEIVE_DOUBLE_DAMAGE, true, false, 0, 0, true) + .condition((user, target, move) => { + return !(target.getTag(BattlerTagType.PROTECTED)?.tagType === "PROTECTED" || target.scene.arena.getTag(ArenaTagType.MAT_BLOCK)?.tagType === "MAT_BLOCK"); + }), new StatusMove(Moves.REVIVAL_BLESSING, Type.NORMAL, -1, 1, -1, 0, 9) .triageMove() .attr(RevivalBlessingAttr) @@ -8244,31 +9143,31 @@ 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) .slicingMove(), new AttackMove(Moves.HYDRO_STEAM, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 9) .attr(IgnoreWeatherTypeDebuffAttr, WeatherType.SUNNY) - .attr(MovePowerMultiplierAttr, (user, target, move) => [WeatherType.SUNNY, WeatherType.HARSH_SUN].includes(user.scene.arena.weather?.weatherType) && !user.scene.arena.weather?.isEffectSuppressed(user.scene) ? 1.5 : 1), + .attr(MovePowerMultiplierAttr, (user, target, move) => [WeatherType.SUNNY, WeatherType.HARSH_SUN].includes(user.scene.arena.weather?.weatherType!) && !user.scene.arena.weather?.isEffectSuppressed(user.scene) ? 1.5 : 1), // TODO: is this bang correct? new AttackMove(Moves.RUINATION, Type.DARK, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 9) .attr(TargetHalfHpDamageAttr), new AttackMove(Moves.COLLISION_COURSE, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) @@ -8283,17 +9182,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) @@ -8302,7 +9201,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() @@ -8313,7 +9212,7 @@ export function initMoves() { return userTypes.includes(Type.ELECTRIC); }) .attr(RemoveTypeAttr, Type.ELECTRIC, (user) => { - user.scene.queueMessage(getPokemonMessage(user, " used up all its electricity!")); + user.scene.queueMessage(i18next.t("moveTriggers:usedUpAllElectricity", {pokemonName: getPokemonNameWithAffix(user)})); }), new AttackMove(Moves.GIGATON_HAMMER, Type.STEEL, MoveCategory.PHYSICAL, 160, 100, 5, -1, 0, 9) .makesContact(false) @@ -8323,6 +9222,7 @@ export function initMoves() { }), // TODO Add Instruct/Encore interaction new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) .attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5) + .redirectCounter() .target(MoveTarget.ATTACKER), new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9) .attr(HighCritAttr) @@ -8356,7 +9256,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) @@ -8373,24 +9273,24 @@ export function initMoves() { .attr(PreMoveMessageAttr, doublePowerChanceMessageFunc) .attr(DoublePowerChanceAttr), new SelfStatusMove(Moves.BURNING_BULWARK, Type.FIRE, -1, 10, -1, 4, 9) - .attr(ProtectAttr, BattlerTagType.BURNING_BULWARK), + .attr(ProtectAttr, BattlerTagType.BURNING_BULWARK) + .condition(failIfLastCondition), new AttackMove(Moves.THUNDERCLAP, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9) - .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()].move.move].category !== MoveCategory.STATUS), + .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? new AttackMove(Moves.MIGHTY_CLEAVE, Type.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9) .slicingMove() .ignoresProtect(), new AttackMove(Moves.TACHYON_CUTTER, Type.STEEL, MoveCategory.SPECIAL, 50, -1, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._2) .slicingMove(), - new AttackMove(Moves.HARD_PRESS, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) - .attr(OpponentHighHpPowerAttr), + 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) @@ -8402,10 +9302,15 @@ export function initMoves() { .partial(), new AttackMove(Moves.UPPER_HAND, Type.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 15, 100, 3, 9) .attr(FlinchAttr) - .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()].move.move].category !== MoveCategory.STATUS && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()].move.move].priority > 0 ) + .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].priority > 0 ) // TODO: is this bang correct? //TODO: Should also apply when target move priority increased by ability ex. gale wings .partial(), new AttackMove(Moves.MALIGNANT_CHAIN, Type.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) .attr(StatusEffectAttr, StatusEffect.TOXIC) ); + allMoves.map(m => { + 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 0d9be0f663d..c614be465c3 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -1,36 +1,11 @@ -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 enum Nature { - HARDY, - LONELY, - BRAVE, - ADAMANT, - NAUGHTY, - BOLD, - DOCILE, - RELAXED, - IMPISH, - LAX, - TIMID, - HASTY, - SERIOUS, - JOLLY, - NAIVE, - MODEST, - MILD, - QUIET, - BASHFUL, - RASH, - CALM, - GENTLE, - SASSY, - CAREFUL, - QUIRKY -} +export { Nature }; export function getNatureName(nature: Nature, includeStatEffects: boolean = false, forStarterSelect: boolean = false, ignoreBBCode: boolean = false, uiTheme: UiTheme = UiTheme.DEFAULT): string { let ret = Utils.toReadableString(Nature[nature]); @@ -39,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; - let decreasedStat: Stat = null; - for (const stat of stats) { + let increasedStat: Stat | null = null; + let decreasedStat: Stat | null = null; + for (const stat of EFFECTIVE_STATS) { const multiplier = getNatureStatMultiplier(nature, stat); if (multiplier > 1) { increasedStat = stat; @@ -53,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/pokeball.ts b/src/data/pokeball.ts index 5964884d967..59ff4ed86ce 100644 --- a/src/data/pokeball.ts +++ b/src/data/pokeball.ts @@ -1,14 +1,8 @@ +import { PokeballType } from "#enums/pokeball"; import BattleScene from "../battle-scene"; import i18next from "i18next"; -export enum PokeballType { - POKEBALL, - GREAT_BALL, - ULTRA_BALL, - ROGUE_BALL, - MASTER_BALL, - LUXURY_BALL -} +export { PokeballType }; export const MAX_PER_TYPE_POKEBALLS: integer = 99; @@ -101,7 +95,7 @@ export function doPokeballBounceAnim(scene: BattleScene, pokeball: Phaser.GameOb duration: bouncePower * baseBounceDuration, ease: "Cubic.easeIn", onComplete: () => { - scene.playSound("pb_bounce_1", { volume: bouncePower }); + scene.playSound("se/pb_bounce_1", { volume: bouncePower }); bouncePower = bouncePower > 0.01 ? bouncePower * 0.5 : 0; diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 1fb1f7db5fd..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"; @@ -54,31 +54,38 @@ export enum EvolutionItem { SYRUPY_APPLE } +/** + * Pokemon Evolution tuple type consisting of: + * @property 0 {@linkcode Species} The species of the Pokemon. + * @property 1 {@linkcode integer} The level at which the Pokemon evolves. + */ +export type EvolutionLevel = [species: Species, level: integer]; + export type EvolutionConditionPredicate = (p: Pokemon) => boolean; export type EvolutionConditionEnforceFunc = (p: Pokemon) => void; export class SpeciesFormEvolution { public speciesId: Species; - public preFormKey: string; - public evoFormKey: string; + public preFormKey: string | null; + public evoFormKey: string | null; public level: integer; - public item: EvolutionItem; - public condition: SpeciesEvolutionCondition; + public item: EvolutionItem | null; + public condition: SpeciesEvolutionCondition | null; public wildDelay: SpeciesWildEvolutionDelay; - constructor(speciesId: Species, preFormKey: string, evoFormKey: string, level: integer, item: EvolutionItem, condition: SpeciesEvolutionCondition, wildDelay?: SpeciesWildEvolutionDelay) { + constructor(speciesId: Species, preFormKey: string | null, evoFormKey: string | null, level: integer, item: EvolutionItem | null, condition: SpeciesEvolutionCondition | null, wildDelay?: SpeciesWildEvolutionDelay) { this.speciesId = speciesId; this.preFormKey = preFormKey; this.evoFormKey = evoFormKey; this.level = level; this.item = item || EvolutionItem.NONE; this.condition = condition; - this.wildDelay = wildDelay || SpeciesWildEvolutionDelay.NONE; + this.wildDelay = wildDelay ?? SpeciesWildEvolutionDelay.NONE; } } export class SpeciesEvolution extends SpeciesFormEvolution { - constructor(speciesId: Species, level: integer, item: EvolutionItem, condition: SpeciesEvolutionCondition, wildDelay?: SpeciesWildEvolutionDelay) { + constructor(speciesId: Species, level: integer, item: EvolutionItem | null, condition: SpeciesEvolutionCondition | null, wildDelay?: SpeciesWildEvolutionDelay) { super(speciesId, null, null, level, item, condition, wildDelay); } } @@ -95,7 +102,7 @@ export class FusionSpeciesFormEvolution extends SpeciesFormEvolution { export class SpeciesEvolutionCondition { public predicate: EvolutionConditionPredicate; - public enforceFunc: EvolutionConditionEnforceFunc; + public enforceFunc: EvolutionConditionEnforceFunc | undefined; constructor(predicate: EvolutionConditionPredicate, enforceFunc?: EvolutionConditionEnforceFunc) { this.predicate = predicate; @@ -400,8 +407,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.LINOONE, 20, null, null) ], [Species.WURMPLE]: [ - new SpeciesEvolution(Species.SILCOON, 7, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), null), - new SpeciesEvolution(Species.CASCOON, 7, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), null) + new SpeciesEvolution(Species.SILCOON, 7, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)), + new SpeciesEvolution(Species.CASCOON, 7, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.SILCOON]: [ new SpeciesEvolution(Species.BEAUTIFLY, 10, null, null) @@ -876,10 +883,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CLAWITZER, 37, null, null) ], [Species.TYRUNT]: [ - new SpeciesEvolution(Species.TYRANTRUM, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.TYRANTRUM, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.AMAURA]: [ - new SpeciesEvolution(Species.AURORUS, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.AURORUS, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.GOOMY]: [ new SpeciesEvolution(Species.HISUI_SLIGGOO, 40, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), @@ -921,7 +928,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.TOUCANNON, 28, null, null) ], [Species.YUNGOOS]: [ - new SpeciesEvolution(Species.GUMSHOOS, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.GUMSHOOS, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.GRUBBIN]: [ new SpeciesEvolution(Species.CHARJABUG, 20, null, null) @@ -939,13 +946,13 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ARAQUANID, 22, null, null) ], [Species.FOMANTIS]: [ - new SpeciesEvolution(Species.LURANTIS, 34, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.LURANTIS, 34, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.MORELULL]: [ new SpeciesEvolution(Species.SHIINOTIC, 24, null, null) ], [Species.SALANDIT]: [ - new SpeciesEvolution(Species.SALAZZLE, 33, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE), null) + new SpeciesEvolution(Species.SALAZZLE, 33, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)) ], [Species.STUFFUL]: [ new SpeciesEvolution(Species.BEWEAR, 27, null, null) @@ -969,14 +976,14 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.COSMOEM, 43, null, null) ], [Species.COSMOEM]: [ - new SpeciesEvolution(Species.SOLGALEO, 53, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), null), - new SpeciesEvolution(Species.LUNALA, 53, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), null) + new SpeciesEvolution(Species.SOLGALEO, 53, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)), + new SpeciesEvolution(Species.LUNALA, 53, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.MELTAN]: [ new SpeciesEvolution(Species.MELMETAL, 48, null, null) ], [Species.ALOLA_RATTATA]: [ - new SpeciesEvolution(Species.ALOLA_RATICATE, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.ALOLA_RATICATE, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.ALOLA_DIGLETT]: [ new SpeciesEvolution(Species.ALOLA_DUGTRIO, 26, null, null) @@ -1099,7 +1106,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GALAR_LINOONE, 20, null, null) ], [Species.GALAR_LINOONE]: [ - new SpeciesEvolution(Species.OBSTAGOON, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.OBSTAGOON, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.GALAR_YAMASK]: [ new SpeciesEvolution(Species.RUNERIGUS, 34, null, null) @@ -1145,6 +1152,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.PAWMOT, 32, null, null) ], [Species.TANDEMAUS]: [ + new SpeciesFormEvolution(Species.MAUSHOLD, "", "three", 25, null, new SpeciesEvolutionCondition(p => { + let ret = false; + p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); + return ret; + })), new SpeciesEvolution(Species.MAUSHOLD, 25, null, null) ], [Species.FIDOUGH]: [ @@ -1202,7 +1214,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GLIMMORA, 35, null, null) ], [Species.GREAVARD]: [ - new SpeciesEvolution(Species.HOUNDSTONE, 30, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.HOUNDSTONE, 30, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.FRIGIBAX]: [ new SpeciesEvolution(Species.ARCTIBAX, 35, null, null) @@ -1259,17 +1271,17 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.TANGELA]: [ - new SpeciesEvolution(Species.TANGROWTH, 34, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.TANGROWTH, 34, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.LICKITUNG]: [ - new SpeciesEvolution(Species.LICKILICKY, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.ROLLOUT).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LICKILICKY, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.ROLLOUT).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.STARYU]: [ new SpeciesEvolution(Species.STARMIE, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.EEVEE]: [ - new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => !!p.getMoveset().find(m => m.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.SYLVEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => !!p.getMoveset().find(m => m.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => !!p.getMoveset().find(m => m?.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => !!p.getMoveset().find(m => m?.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.ESPEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.ESPEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.UMBREON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), @@ -1289,13 +1301,13 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.TOGEKISS, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.AIPOM]: [ - new SpeciesEvolution(Species.AMBIPOM, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.DOUBLE_HIT).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.AMBIPOM, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.DOUBLE_HIT).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.SUNKERN]: [ new SpeciesEvolution(Species.SUNFLORA, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.YANMA]: [ - new SpeciesEvolution(Species.YANMEGA, 33, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.YANMEGA, 33, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.MURKROW]: [ new SpeciesEvolution(Species.HONCHKROW, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1304,17 +1316,17 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.MISMAGIUS, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GIRAFARIG]: [ - new SpeciesEvolution(Species.FARIGIRAF, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.TWIN_BEAM).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.FARIGIRAF, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.TWIN_BEAM).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.DUNSPARCE]: [ new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "three-segment", 32, null, new SpeciesEvolutionCondition(p => { let ret = false; - if (p.moveset.filter(m => m.moveId === Moves.HYPER_DRILL).length > 0) { + if (p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0) { p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); } return ret; }), SpeciesWildEvolutionDelay.LONG), - new SpeciesEvolution(Species.DUDUNSPARCE, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.HYPER_DRILL).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.DUDUNSPARCE, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.GLIGAR]: [ new SpeciesEvolution(Species.GLISCOR, 1, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT /* Razor fang at night*/), SpeciesWildEvolutionDelay.LONG) @@ -1326,10 +1338,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.URSALUNA, 1, EvolutionItem.PEAT_BLOCK, null, SpeciesWildEvolutionDelay.VERY_LONG) //Ursaring does not evolve into Bloodmoon Ursaluna ], [Species.PILOSWINE]: [ - new SpeciesEvolution(Species.MAMOSWINE, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MAMOSWINE, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.STANTLER]: [ - new SpeciesEvolution(Species.WYRDEER, 25, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.PSYSHIELD_BASH).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.WYRDEER, 25, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.PSYSHIELD_BASH).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.LOMBRE]: [ new SpeciesEvolution(Species.LUDICOLO, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1347,11 +1359,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ROSERADE, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.BONSLY]: [ - new SpeciesEvolution(Species.SUDOWOODO, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SUDOWOODO, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MIME_JR]: [ - new SpeciesEvolution(Species.GALAR_MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.MIMIC).length > 0 && (p.scene.arena.biomeType === Biome.ICE_CAVE || p.scene.arena.biomeType === Biome.SNOWY_FOREST)), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.GALAR_MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0 && (p.scene.arena.biomeType === Biome.ICE_CAVE || p.scene.arena.biomeType === Biome.SNOWY_FOREST)), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PANSAGE]: [ new SpeciesEvolution(Species.SIMISAGE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1401,15 +1413,15 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.ROCKRUFF]: [ - new SpeciesFormEvolution(Species.LYCANROC, "", "midday", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0)), null), - new SpeciesFormEvolution(Species.LYCANROC, "", "dusk", 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1), null), - new SpeciesFormEvolution(Species.LYCANROC, "", "midnight", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0)), null) + new SpeciesFormEvolution(Species.LYCANROC, "", "midday", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0))), + new SpeciesFormEvolution(Species.LYCANROC, "", "dusk", 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1)), + new SpeciesFormEvolution(Species.LYCANROC, "", "midnight", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0))) ], [Species.STEENEE]: [ - new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.POIPOLE]: [ - new SpeciesEvolution(Species.NAGANADEL, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.DRAGON_PULSE).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.NAGANADEL, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.DRAGON_PULSE).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.ALOLA_SANDSHREW]: [ new SpeciesEvolution(Species.ALOLA_SANDSLASH, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1423,7 +1435,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.APPLETUN, 1, EvolutionItem.SWEET_APPLE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.CLOBBOPUS]: [ - new SpeciesEvolution(Species.GRAPPLOCT, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.TAUNT).length > 0), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.GRAPPLOCT, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.TAUNT).length > 0), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.SINISTEA]: [ new SpeciesFormEvolution(Species.POLTEAGEIST, "phony", "phony", 1, EvolutionItem.CRACKED_POT, null, SpeciesWildEvolutionDelay.LONG), @@ -1457,7 +1469,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.HISUI_ELECTRODE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.HISUI_QWILFISH]: [ - new SpeciesEvolution(Species.OVERQWIL, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.BARB_BARRAGE).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.OVERQWIL, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.BARB_BARRAGE).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.HISUI_SNEASEL]: [ new SpeciesEvolution(Species.SNEASLER, 1, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY /* Razor claw at day*/), SpeciesWildEvolutionDelay.LONG) @@ -1480,7 +1492,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesFormEvolution(Species.SINISTCHA, "artisan", "masterpiece", 1, EvolutionItem.MASTERPIECE_TEACUP, null, SpeciesWildEvolutionDelay.LONG) ], [Species.DIPPLIN]: [ - new SpeciesEvolution(Species.HYDRAPPLE, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.DRAGON_CHEER).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.HYDRAPPLE, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.DRAGON_CHEER).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.KADABRA]: [ new SpeciesEvolution(Species.ALAKAZAM, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1496,7 +1508,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.ONIX]: [ new SpeciesEvolution(Species.STEELIX, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( - p => p.moveset.filter(m => m.getMove().type === Type.STEEL).length > 0), + p => p.moveset.filter(m => m?.getMove().type === Type.STEEL).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RHYDON]: [ @@ -1507,7 +1519,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.SCYTHER]: [ new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( - p => p.moveset.filter(m => m.getMove().type === Type.STEEL).length > 0), + p => p.moveset.filter(m => m?.getMove().type === Type.STEEL).length > 0), SpeciesWildEvolutionDelay.VERY_LONG), new SpeciesEvolution(Species.KLEAVOR, 1, EvolutionItem.BLACK_AUGURITE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], @@ -1561,7 +1573,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ALOLA_GOLEM, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.PRIMEAPE]: [ - new SpeciesEvolution(Species.ANNIHILAPE, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.RAGE_FIST).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.ANNIHILAPE, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.RAGE_FIST).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GOLBAT]: [ new SpeciesEvolution(Species.CROBAT, 1, null, new SpeciesFriendshipEvolutionCondition(110), SpeciesWildEvolutionDelay.VERY_LONG) @@ -1570,7 +1582,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.BLISSEY, 1, null, new SpeciesFriendshipEvolutionCondition(200), SpeciesWildEvolutionDelay.LONG) ], [Species.PICHU]: [ - new SpeciesEvolution(Species.PIKACHU, 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT) + new SpeciesFormEvolution(Species.PIKACHU, "spiky", "partner", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), + new SpeciesFormEvolution(Species.PIKACHU, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), ], [Species.CLEFFA]: [ new SpeciesEvolution(Species.CLEFAIRY, 1, null, new SpeciesFriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) @@ -1618,7 +1631,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.FROSMOTH, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.GIMMIGHOUL]: [ - new SpeciesEvolution(Species.GHOLDENGO, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG) ] }; diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index ae1532f0be0..0d3e511bcba 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -8,6 +8,9 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; +import { getPokemonNameWithAffix } from "#app/messages"; +import i18next from "i18next"; +import { WeatherType } from "./weather"; export enum FormChangeItem { NONE, @@ -63,33 +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, - - FIST_PLATE = 100, + N_SOLARIZER, + N_LUNARIZER, + WELLSPRING_MASK, + HEARTHFLAME_MASK, + CORNERSTONE_MASK, + FIST_PLATE, SKY_PLATE, TOXIC_PLATE, EARTH_PLATE, @@ -125,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; @@ -137,7 +141,7 @@ export class SpeciesFormChange { public formKey: string; public trigger: SpeciesFormChangeTrigger; public quiet: boolean; - private conditions: SpeciesFormChangeCondition[]; + public readonly conditions: SpeciesFormChangeCondition[]; constructor(speciesId: Species, preFormKey: string, evoFormKey: string, trigger: SpeciesFormChangeTrigger, quiet: boolean = false, ...conditions: SpeciesFormChangeCondition[]) { this.speciesId = speciesId; @@ -179,7 +183,7 @@ export class SpeciesFormChange { return true; } - findTrigger(triggerType: Constructor): SpeciesFormChangeTrigger { + findTrigger(triggerType: Constructor): SpeciesFormChangeTrigger | null { if (!this.trigger.hasTriggerType(triggerType)) { return null; } @@ -187,7 +191,7 @@ export class SpeciesFormChange { const trigger = this.trigger; if (trigger instanceof SpeciesFormChangeCompoundTrigger) { - return trigger.triggers.find(t => t.hasTriggerType(triggerType)); + return trigger.triggers.find(t => t.hasTriggerType(triggerType))!; // TODO: is this bang correct? } return trigger; @@ -196,11 +200,11 @@ export class SpeciesFormChange { export class SpeciesFormChangeCondition { public predicate: SpeciesFormChangeConditionPredicate; - public enforceFunc: SpeciesFormChangeConditionEnforceFunc; + public enforceFunc: SpeciesFormChangeConditionEnforceFunc | null; constructor(predicate: SpeciesFormChangeConditionPredicate, enforceFunc?: SpeciesFormChangeConditionEnforceFunc) { this.predicate = predicate; - this.enforceFunc = enforceFunc; + this.enforceFunc = enforceFunc!; // TODO: is this bang correct? } } @@ -312,7 +316,7 @@ export class SpeciesFormChangeMoveLearnedTrigger extends SpeciesFormChangeTrigge } canChange(pokemon: Pokemon): boolean { - return (!!pokemon.moveset.filter(m => m.moveId === this.move).length) === this.known; + return (!!pokemon.moveset.filter(m => m?.moveId === this.move).length) === this.known; } } @@ -330,7 +334,7 @@ export abstract class SpeciesFormChangeMoveTrigger extends SpeciesFormChangeTrig export class SpeciesFormChangePreMoveTrigger extends SpeciesFormChangeMoveTrigger { canChange(pokemon: Pokemon): boolean { const command = pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; - return command?.move && this.movePredicate(command.move.move) === this.used; + return !!command?.move && this.movePredicate(command.move.move) === this.used; } } @@ -353,25 +357,109 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { } } +/** + * Class used for triggering form changes based on weather. + * Used by Castform and Cherrim. + * @extends SpeciesFormChangeTrigger + */ +export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger { + /** The ability that triggers the form change */ + public ability: Abilities; + /** The list of weathers that trigger the form change */ + public weathers: WeatherType[]; + + constructor(ability: Abilities, weathers: WeatherType[]) { + super(); + this.ability = ability; + this.weathers = weathers; + } + + /** + * Checks if the Pokemon has the required ability and is in the correct weather while + * the weather or ability is also not suppressed. + * @param {Pokemon} pokemon the pokemon that is trying to do the form change + * @returns `true` if the Pokemon can change forms, `false` otherwise + */ + canChange(pokemon: Pokemon): boolean { + const currentWeather = pokemon.scene.arena.weather?.weatherType ?? WeatherType.NONE; + const isWeatherSuppressed = pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene); + const isAbilitySuppressed = pokemon.summonData.abilitySuppressed; + + return !isAbilitySuppressed && !isWeatherSuppressed && (pokemon.hasAbility(this.ability) && this.weathers.includes(currentWeather)); + } +} + +/** + * 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 and Cherrim. + * @extends SpeciesFormChangeTrigger + */ +export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChangeTrigger { + /** The ability that triggers the form change*/ + public ability: Abilities; + /** The list of weathers that will also trigger a form change to original form */ + public weathers: WeatherType[]; + + constructor(ability: Abilities, weathers: WeatherType[]) { + super(); + this.ability = ability; + this.weathers = weathers; + } + + /** + * Checks if the Pokemon has the required ability and the weather is one that will revert + * the Pokemon to its original form or the weather or ability is suppressed + * @param {Pokemon} pokemon the pokemon that is trying to do the form change + * @returns `true` if the Pokemon will revert to its original form, `false` otherwise + */ + canChange(pokemon: Pokemon): boolean { + if (pokemon.hasAbility(this.ability, false, true)) { + const currentWeather = pokemon.scene.arena.weather?.weatherType ?? WeatherType.NONE; + const isWeatherSuppressed = pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene); + const isAbilitySuppressed = pokemon.summonData.abilitySuppressed; + const summonDataAbility = pokemon.summonData.ability; + const isAbilityChanged = summonDataAbility !== this.ability && summonDataAbility !== Abilities.NONE; + + if (this.weathers.includes(currentWeather) || isWeatherSuppressed || isAbilitySuppressed || isAbilityChanged) { + return true; + } + } + return false; + } +} + export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: SpeciesFormChange, preName: string): string { const isMega = formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1; const isGmax = formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1; - const isEmax = formChange.formKey.indexOf("eternamax") > -1; + const isEmax = formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1; const isRevert = !isMega && formChange.formKey === pokemon.species.forms[0].formKey; - const prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? "Foe " : "Wild " : "Your "; if (isMega) { - return `${prefix}${preName} Mega Evolved\ninto ${pokemon.name}!`; + return i18next.t("battlePokemonForm:megaChange", { preName, pokemonName: pokemon.name }); } if (isGmax) { - return `${prefix}${preName} Gigantamaxed\ninto ${pokemon.name}!`; + return i18next.t("battlePokemonForm:gigantamaxChange", { preName, pokemonName: pokemon.name }); } if (isEmax) { - return `${prefix}${preName} Eternamaxed\ninto ${pokemon.name}!`; + return i18next.t("battlePokemonForm:eternamaxChange", { preName, pokemonName: pokemon.name }); } if (isRevert) { - return `${prefix}${pokemon.name} reverted\nto its original form!`; + return i18next.t("battlePokemonForm:revertChange", { pokemonName: getPokemonNameWithAffix(pokemon) }); } - return `${prefix}${preName} changed form!`; + if (pokemon.getAbility().id === Abilities.DISGUISE) { + return i18next.t("battlePokemonForm:disguiseChange"); + } + return i18next.t("battlePokemonForm:formChange", { preName }); +} + +/** + * Gives a condition for form changing checking if a species is registered as caught in the player's dex data. + * Used for fusion forms such as Kyurem and Necrozma. + * @param species {@linkcode Species} + * @returns A {@linkcode SpeciesFormChangeCondition} checking if that species is registered as caught + */ +function getSpeciesDependentFormChangeCondition(species: Species): SpeciesFormChangeCondition { + return new SpeciesFormChangeCondition(p => !!p.scene.gameData.dexData[species].caughtAttr); } interface PokemonFormChanges { @@ -567,10 +655,7 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.GIRATINA, "altered", SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.GRISEOUS_CORE)) ], [Species.SHAYMIN]: [ - new SpeciesFormChange(Species.SHAYMIN, "land", "sky", new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAY, TimeOfDay.DUSK), - new SpeciesFormChangeItemTrigger(FormChangeItem.GRACIDEA), new SpeciesFormChangeStatusEffectTrigger(StatusEffect.FREEZE, true))), - new SpeciesFormChange(Species.SHAYMIN, "sky", "land", new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAWN, TimeOfDay.NIGHT)), - new SpeciesFormChange(Species.SHAYMIN, "sky", "land", new SpeciesFormChangeStatusEffectTrigger(StatusEffect.FREEZE)) + new SpeciesFormChange(Species.SHAYMIN, "land", "sky", new SpeciesFormChangeItemTrigger(FormChangeItem.GRACIDEA)), ], [Species.ARCEUS]: [ new SpeciesFormChange(Species.ARCEUS, "normal", "fighting", new SpeciesFormChangeItemTrigger(FormChangeItem.FIST_PLATE)), @@ -608,8 +693,8 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.LANDORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) ], [Species.KYUREM]: [ - new SpeciesFormChange(Species.KYUREM, "", "black", new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_STONE)), - new SpeciesFormChange(Species.KYUREM, "", "white", new SpeciesFormChangeItemTrigger(FormChangeItem.LIGHT_STONE)) + new SpeciesFormChange(Species.KYUREM, "", "black", new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_STONE), false, getSpeciesDependentFormChangeCondition(Species.ZEKROM)), + new SpeciesFormChange(Species.KYUREM, "", "white", new SpeciesFormChangeItemTrigger(FormChangeItem.LIGHT_STONE), false, getSpeciesDependentFormChangeCondition(Species.RESHIRAM)) ], [Species.KELDEO]: [ new SpeciesFormChange(Species.KELDEO, "ordinary", "resolute", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD)), @@ -699,8 +784,10 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.MIMIKYU, "busted", "disguised", new SpeciesFormChangeManualTrigger(), true) ], [Species.NECROZMA]: [ - new SpeciesFormChange(Species.NECROZMA, "", "dawn-wings", new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER)), - new SpeciesFormChange(Species.NECROZMA, "", "dusk-mane", new SpeciesFormChangeItemTrigger(FormChangeItem.N_SOLARIZER)) + new SpeciesFormChange(Species.NECROZMA, "", "dawn-wings", new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER), false, getSpeciesDependentFormChangeCondition(Species.LUNALA)), + new SpeciesFormChange(Species.NECROZMA, "", "dusk-mane", new SpeciesFormChangeItemTrigger(FormChangeItem.N_SOLARIZER), false, getSpeciesDependentFormChangeCondition(Species.SOLGALEO)), + new SpeciesFormChange(Species.NECROZMA, "dawn-wings", "ultra", new SpeciesFormChangeItemTrigger(FormChangeItem.ULTRANECROZIUM_Z)), + new SpeciesFormChange(Species.NECROZMA, "dusk-mane", "ultra", new SpeciesFormChangeItemTrigger(FormChangeItem.ULTRANECROZIUM_Z)) ], [Species.MELMETAL]: [ new SpeciesFormChange(Species.MELMETAL, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) @@ -786,8 +873,8 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.URSHIFU, "rapid-strike", SpeciesFormKey.GIGANTAMAX_RAPID, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.CALYREX]: [ - new SpeciesFormChange(Species.CALYREX, "", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICY_REINS_OF_UNITY)), - new SpeciesFormChange(Species.CALYREX, "", "shadow", new SpeciesFormChangeItemTrigger(FormChangeItem.SHADOW_REINS_OF_UNITY)) + new SpeciesFormChange(Species.CALYREX, "", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICY_REINS_OF_UNITY), false, getSpeciesDependentFormChangeCondition(Species.GLASTRIER)), + new SpeciesFormChange(Species.CALYREX, "", "shadow", new SpeciesFormChangeItemTrigger(FormChangeItem.SHADOW_REINS_OF_UNITY), false, getSpeciesDependentFormChangeCondition(Species.SPECTRIER)) ], [Species.ENAMORUS]: [ new SpeciesFormChange(Species.ENAMORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) @@ -817,7 +904,37 @@ export const pokemonFormChanges: PokemonFormChanges = { [Species.EISCUE]: [ new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true), - ] + ], + [Species.CRAMORANT]: [ + new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)), + new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)), + new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true), + new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true), + new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true), + new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true), + ], + [Species.CASTFORM]: [ + new SpeciesFormChange(Species.CASTFORM, "", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true), + new SpeciesFormChange(Species.CASTFORM, "rainy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true), + new SpeciesFormChange(Species.CASTFORM, "snowy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true), + new SpeciesFormChange(Species.CASTFORM, "", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true), + new SpeciesFormChange(Species.CASTFORM, "sunny", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true), + new SpeciesFormChange(Species.CASTFORM, "snowy", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true), + new SpeciesFormChange(Species.CASTFORM, "", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true), + new SpeciesFormChange(Species.CASTFORM, "sunny", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true), + new SpeciesFormChange(Species.CASTFORM, "rainy", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true), + new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true), + new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true), + new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true), + new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeActiveTrigger(), true), + 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-level-moves.ts b/src/data/pokemon-level-moves.ts index 9f1f95e42ff..93bd57ae32c 100644 --- a/src/data/pokemon-level-moves.ts +++ b/src/data/pokemon-level-moves.ts @@ -15,6 +15,11 @@ interface PokemonSpeciesFormLevelMoves { [key: integer]: PokemonFormLevelMoves } +/** Moves that can only be learned with a memory-mushroom */ +const RELEARN_MOVE = -1; +/** Moves that can only be learned with an evolve */ +const EVOLVE_MOVE = 0; + export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.BULBASAUR]: [ [ 1, Moves.TACKLE ], @@ -51,7 +56,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.SOLAR_BEAM ], ], [Species.VENUSAUR]: [ - [ 0, Moves.PETAL_BLIZZARD ], + [ EVOLVE_MOVE, Moves.PETAL_BLIZZARD ], [ 1, Moves.GROWTH ], [ 1, Moves.PETAL_DANCE ], [ 1, Moves.VINE_WHIP ], @@ -97,7 +102,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 54, Moves.FLARE_BLITZ ], ], [Species.CHARIZARD]: [ - [ 0, Moves.AIR_SLASH ], + [ EVOLVE_MOVE, Moves.AIR_SLASH ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], @@ -146,7 +151,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.WAVE_CRASH ], ], [Species.BLASTOISE]: [ - [ 0, Moves.FLASH_CANNON ], + [ EVOLVE_MOVE, Moves.FLASH_CANNON ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.WATER_GUN ], @@ -168,11 +173,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 9, Moves.BUG_BITE ], ], [Species.METAPOD]: [ - [ 0, Moves.HARDEN ], + [ EVOLVE_MOVE, Moves.HARDEN ], [ 1, Moves.HARDEN ], ], [Species.BUTTERFREE]: [ - [ 0, Moves.GUST ], + [ EVOLVE_MOVE, Moves.GUST ], [ 1, Moves.TACKLE ], [ 1, Moves.STRING_SHOT ], [ 1, Moves.HARDEN ], @@ -197,11 +202,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 9, Moves.BUG_BITE ], ], [Species.KAKUNA]: [ - [ 0, Moves.HARDEN ], + [ EVOLVE_MOVE, Moves.HARDEN ], [ 1, Moves.HARDEN ], ], [Species.BEEDRILL]: [ - [ 0, Moves.TWINEEDLE ], + [ EVOLVE_MOVE, Moves.TWINEEDLE ], [ 1, Moves.FURY_ATTACK ], [ 11, Moves.FURY_CUTTER ], [ 14, Moves.RAGE ], @@ -285,7 +290,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 34, Moves.ENDEAVOR ], ], [Species.RATICATE]: [ - [ 0, Moves.SCARY_FACE ], + [ EVOLVE_MOVE, Moves.SCARY_FACE ], [ 1, Moves.SWORDS_DANCE ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], @@ -354,7 +359,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.GUNK_SHOT ], ], [Species.ARBOK]: [ - [ 0, Moves.CRUNCH ], + [ EVOLVE_MOVE, Moves.CRUNCH ], [ 1, Moves.WRAP ], [ 1, Moves.POISON_STING ], [ 1, Moves.LEER ], @@ -400,7 +405,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], [Species.RAICHU]: [ - [ 0, Moves.ZIPPY_ZAP ], + [ EVOLVE_MOVE, Moves.ZIPPY_ZAP ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -494,7 +499,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 71, Moves.EARTH_POWER ], ], [Species.NIDOQUEEN]: [ - [ 0, Moves.SUPERPOWER ], + [ EVOLVE_MOVE, Moves.SUPERPOWER ], [ 1, Moves.SLUDGE_WAVE ], [ 1, Moves.SCRATCH ], [ 1, Moves.DOUBLE_KICK ], @@ -541,7 +546,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 71, Moves.EARTH_POWER ], ], [Species.NIDOKING]: [ - [ 0, Moves.MEGAHORN ], + [ EVOLVE_MOVE, Moves.MEGAHORN ], [ 1, Moves.SLUDGE_WAVE ], [ 1, Moves.DOUBLE_KICK ], [ 1, Moves.HORN_ATTACK ], @@ -582,28 +587,28 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.HEALING_WISH ], ], [Species.CLEFABLE]: [ + [ RELEARN_MOVE, Moves.POUND ], + [ RELEARN_MOVE, Moves.GROWL ], + [ RELEARN_MOVE, Moves.SING ], + [ RELEARN_MOVE, Moves.DEFENSE_CURL ], + [ RELEARN_MOVE, Moves.SPLASH ], + [ RELEARN_MOVE, Moves.SWEET_KISS ], + [ RELEARN_MOVE, Moves.CHARM ], + [ RELEARN_MOVE, Moves.ENCORE ], + [ RELEARN_MOVE, Moves.MOONLIGHT ], + [ RELEARN_MOVE, Moves.FOLLOW_ME ], + [ RELEARN_MOVE, Moves.COSMIC_POWER ], + [ RELEARN_MOVE, Moves.GRAVITY ], + [ RELEARN_MOVE, Moves.HEALING_WISH ], + [ RELEARN_MOVE, Moves.COPYCAT ], + [ RELEARN_MOVE, Moves.AFTER_YOU ], + [ RELEARN_MOVE, Moves.STORED_POWER ], + [ RELEARN_MOVE, Moves.DISARMING_VOICE ], [ 1, Moves.METRONOME ], [ 1, Moves.METEOR_MASH ], [ 1, Moves.MOONBLAST ], [ 1, Moves.LIFE_DEW ], - [ 1, Moves.POUND ], - [ 1, Moves.GROWL ], - [ 1, Moves.SING ], - [ 1, Moves.DEFENSE_CURL ], - [ 1, Moves.SPLASH ], - [ 1, Moves.SWEET_KISS ], - [ 1, Moves.CHARM ], - [ 1, Moves.ENCORE ], - [ 1, Moves.MOONLIGHT ], - [ 1, Moves.FOLLOW_ME ], - [ 1, Moves.COSMIC_POWER ], - [ 1, Moves.GRAVITY ], - [ 1, Moves.HEALING_WISH ], - [ 1, Moves.COPYCAT ], - [ 1, Moves.AFTER_YOU ], - [ 1, Moves.STORED_POWER ], [ 1, Moves.SPOTLIGHT ], - [ 1, Moves.DISARMING_VOICE ], ], [Species.VULPIX]: [ [ 1, Moves.TAIL_WHIP ], @@ -623,22 +628,22 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.FIRE_BLAST ], ], [Species.NINETALES]: [ + [ RELEARN_MOVE, Moves.DISABLE ], + [ RELEARN_MOVE, Moves.EMBER ], + [ RELEARN_MOVE, Moves.FIRE_SPIN ], + [ RELEARN_MOVE, Moves.CONFUSE_RAY ], + [ RELEARN_MOVE, Moves.FIRE_BLAST ], + [ RELEARN_MOVE, Moves.SPITE ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.WILL_O_WISP ], + [ RELEARN_MOVE, Moves.IMPRISON ], + [ RELEARN_MOVE, Moves.EXTRASENSORY ], + [ RELEARN_MOVE, Moves.NASTY_PLOT ], + [ RELEARN_MOVE, Moves.INCINERATE ], + [ RELEARN_MOVE, Moves.INFERNO ], [ 1, Moves.FLAMETHROWER ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.DISABLE ], - [ 1, Moves.EMBER ], - [ 1, Moves.FIRE_SPIN ], - [ 1, Moves.CONFUSE_RAY ], - [ 1, Moves.FIRE_BLAST ], - [ 1, Moves.SPITE ], - [ 1, Moves.SAFEGUARD ], - [ 1, Moves.WILL_O_WISP ], - [ 1, Moves.IMPRISON ], - [ 1, Moves.EXTRASENSORY ], - [ 1, Moves.NASTY_PLOT ], - [ 1, Moves.INCINERATE ], - [ 1, Moves.INFERNO ], ], [Species.JIGGLYPUFF]: [ [ 1, Moves.POUND ], @@ -749,7 +754,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.PETAL_DANCE ], ], [Species.VILEPLUME]: [ - [ 0, Moves.PETAL_BLIZZARD ], + [ EVOLVE_MOVE, Moves.PETAL_BLIZZARD ], [ 1, Moves.ACID ], [ 1, Moves.ABSORB ], [ 1, Moves.MEGA_DRAIN ], @@ -814,7 +819,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 47, Moves.PSYCHIC ], ], [Species.VENOMOTH]: [ - [ 0, Moves.AIR_SLASH ], + [ EVOLVE_MOVE, Moves.AIR_SLASH ], [ 1, Moves.TACKLE ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.DISABLE ], @@ -847,7 +852,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.FISSURE ], ], [Species.DUGTRIO]: [ - [ 0, Moves.SAND_TOMB ], + [ EVOLVE_MOVE, Moves.SAND_TOMB ], [ 1, Moves.SCRATCH ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.GROWL ], @@ -881,7 +886,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.PLAY_ROUGH ], ], [Species.PERSIAN]: [ - [ 0, Moves.POWER_GEM ], + [ EVOLVE_MOVE, Moves.POWER_GEM ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.FAKE_OUT ], @@ -990,7 +995,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.FLARE_BLITZ ], ], [Species.ARCANINE]: [ - [ 0, Moves.EXTREME_SPEED ], + [ EVOLVE_MOVE, Moves.EXTREME_SPEED ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], @@ -1038,27 +1043,27 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 66, Moves.DOUBLE_EDGE ], ], [Species.POLIWRATH]: [ - [ 0, Moves.DYNAMIC_PUNCH ], + [ EVOLVE_MOVE, Moves.DYNAMIC_PUNCH ], [ 1, Moves.BUBBLE_BEAM ], [ 1, Moves.BODY_SLAM ], [ 1, Moves.HYPNOSIS ], - [ 1, Moves.POUND ], - [ 1, Moves.DOUBLE_EDGE ], - [ 1, Moves.WATER_GUN ], [ 1, Moves.WATER_SPORT ], - [ 1, Moves.HYDRO_PUMP ], - [ 1, Moves.BELLY_DRUM ], - [ 1, Moves.RAIN_DANCE ], - [ 1, Moves.MUD_SHOT ], - [ 1, Moves.EARTH_POWER ], - [ 1, Moves.CIRCLE_THROW ], + [ RELEARN_MOVE, Moves.POUND ], + [ RELEARN_MOVE, Moves.DOUBLE_EDGE ], + [ RELEARN_MOVE, Moves.WATER_GUN ], + [ RELEARN_MOVE, Moves.HYDRO_PUMP ], + [ RELEARN_MOVE, Moves.BELLY_DRUM ], + [ RELEARN_MOVE, Moves.RAIN_DANCE ], + [ RELEARN_MOVE, Moves.MUD_SHOT ], + [ RELEARN_MOVE, Moves.EARTH_POWER ], + [ RELEARN_MOVE, Moves.CIRCLE_THROW ], ], [Species.ABRA]: [ [ 1, Moves.TELEPORT ], [ 1, Moves.CONFUSION ], //Custom ], [Species.KADABRA]: [ - [ 0, Moves.PSYBEAM ], //Custom + [ EVOLVE_MOVE, Moves.PSYBEAM ], //LGPE [ 1, Moves.DISABLE ], [ 1, Moves.TELEPORT ], [ 1, Moves.KINESIS ], @@ -1175,16 +1180,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 58, Moves.POWER_WHIP ], ], [Species.VICTREEBEL]: [ - [ 0, Moves.LEAF_STORM ], + [ EVOLVE_MOVE, Moves.LEAF_STORM ], + [ RELEARN_MOVE, Moves.STOCKPILE ], + [ RELEARN_MOVE, Moves.SWALLOW ], + [ RELEARN_MOVE, Moves.SPIT_UP ], + [ RELEARN_MOVE, Moves.GASTRO_ACID ], + [ RELEARN_MOVE, Moves.POWER_WHIP ], [ 1, Moves.VINE_WHIP ], [ 1, Moves.SLEEP_POWDER ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RAZOR_LEAF ], - [ 1, Moves.STOCKPILE ], - [ 1, Moves.SWALLOW ], - [ 1, Moves.SPIT_UP ], - [ 1, Moves.GASTRO_ACID ], - [ 1, Moves.POWER_WHIP ], [ 44, Moves.LEAF_BLADE ], ], [Species.TENTACOOL]: [ @@ -1285,7 +1290,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.FLARE_BLITZ ], ], [Species.RAPIDASH]: [ - [ 0, Moves.SMART_STRIKE ], + [ EVOLVE_MOVE, Moves.SMART_STRIKE ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], @@ -1323,6 +1328,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.HEAL_PULSE ], ], [Species.SLOWBRO]: [ + [ RELEARN_MOVE, Moves.FUTURE_SIGHT ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -1360,7 +1366,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.ZAP_CANNON ], ], [Species.MAGNETON]: [ - [ 0, Moves.TRI_ATTACK ], + [ EVOLVE_MOVE, Moves.TRI_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.THUNDER_SHOCK ], @@ -1411,7 +1417,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.THRASH ], ], [Species.DODRIO]: [ - [ 0, Moves.TRI_ATTACK ], + [ EVOLVE_MOVE, Moves.TRI_ATTACK ], [ 1, Moves.TRI_ATTACK ], [ 1, Moves.GROWL ], [ 1, Moves.PECK ], @@ -1447,7 +1453,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 53, Moves.SNOWSCAPE ], ], [Species.DEWGONG]: [ - [ 0, Moves.SHEER_COLD ], + [ EVOLVE_MOVE, Moves.SHEER_COLD ], [ 1, Moves.HEADBUTT ], [ 1, Moves.GROWL ], [ 1, Moves.ICY_WIND ], @@ -1520,7 +1526,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.HYDRO_PUMP ], ], [Species.CLOYSTER]: [ - [ 0, Moves.ICICLE_SPEAR ], + [ EVOLVE_MOVE, Moves.ICICLE_SPEAR ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.SUPERSONIC ], @@ -1557,7 +1563,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.DREAM_EATER ], ], [Species.HAUNTER]: [ - [ 0, Moves.SHADOW_PUNCH ], + [ EVOLVE_MOVE, Moves.SHADOW_PUNCH ], [ 1, Moves.HYPNOSIS ], [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.LICK ], @@ -1739,7 +1745,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.SOLAR_BEAM ], ], [Species.EXEGGUTOR]: [ - [ 0, Moves.STOMP ], + [ EVOLVE_MOVE, Moves.STOMP ], + [ RELEARN_MOVE, Moves.GROWTH ], [ 1, Moves.BARRAGE ], [ 1, Moves.SEED_BOMB ], [ 1, Moves.PSYSHOCK ], @@ -1758,7 +1765,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HYPNOSIS ], [ 1, Moves.REFLECT ], [ 1, Moves.LEECH_SEED ], - [ 1, Moves.GROWTH ], ], [Species.CUBONE]: [ [ 1, Moves.GROWL ], @@ -1794,7 +1800,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.DOUBLE_EDGE ], ], [Species.HITMONLEE]: [ - [ 0, Moves.BRICK_BREAK ], + [ EVOLVE_MOVE, Moves.BRICK_BREAK ], [ 1, Moves.TACKLE ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.FAKE_OUT ], @@ -1817,7 +1823,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.AXE_KICK ], ], [Species.HITMONCHAN]: [ - [ 0, Moves.DRAIN_PUNCH ], + [ EVOLVE_MOVE, Moves.DRAIN_PUNCH ], [ 1, Moves.TACKLE ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.FAKE_OUT ], @@ -1873,7 +1879,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.DESTINY_BOND ], ], [Species.WEEZING]: [ - [ 0, Moves.DOUBLE_HIT ], + [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], [ 1, Moves.TACKLE ], [ 1, Moves.SMOKESCREEN ], [ 1, Moves.SMOG ], @@ -1908,7 +1914,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.HORN_DRILL ], ], [Species.RHYDON]: [ - [ 0, Moves.HAMMER_ARM ], + [ EVOLVE_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.SMACK_DOWN ], @@ -2211,7 +2217,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 25, Moves.FLAIL ], ], [Species.GYARADOS]: [ - [ 0, Moves.BITE ], + [ EVOLVE_MOVE, Moves.BITE ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.SPLASH ], @@ -2271,7 +2277,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.VEEVEE_VOLLEY ], ], [Species.VAPOREON]: [ - [ 0, Moves.BOUNCY_BUBBLE ], + [ EVOLVE_MOVE, Moves.BOUNCY_BUBBLE ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2298,7 +2304,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.LAST_RESORT ], ], [Species.JOLTEON]: [ - [ 0, Moves.BUZZY_BUZZ ], + [ EVOLVE_MOVE, Moves.BUZZY_BUZZ ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2325,7 +2331,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.LAST_RESORT ], ], [Species.FLAREON]: [ - [ 0, Moves.SIZZLY_SLIDE ], + [ EVOLVE_MOVE, Moves.SIZZLY_SLIDE ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2384,7 +2390,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.HYDRO_PUMP ], ], [Species.OMASTAR]: [ - [ 0, Moves.CRUNCH ], + [ EVOLVE_MOVE, Moves.CRUNCH ], [ 1, Moves.BIND ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.CONSTRICT ], @@ -2419,7 +2425,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.STONE_EDGE ], ], [Species.KABUTOPS]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], [ 1, Moves.SCRATCH ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.ABSORB ], @@ -2569,7 +2575,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 74, Moves.HYPER_BEAM ], ], [Species.DRAGONITE]: [ - [ 0, Moves.HURRICANE ], + [ EVOLVE_MOVE, Moves.HURRICANE ], [ 1, Moves.FIRE_PUNCH ], [ 1, Moves.THUNDER_PUNCH ], [ 1, Moves.WING_ATTACK ], @@ -2625,7 +2631,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.CHIKORITA]: [ [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], - [ 6, Moves.RAZOR_LEAF ], + [ 5, Moves.RAZOR_LEAF ], //Custom, moved from 6 to 5 [ 9, Moves.POISON_POWDER ], [ 12, Moves.SYNTHESIS ], [ 17, Moves.REFLECT ], @@ -2655,7 +2661,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 54, Moves.SOLAR_BEAM ], ], [Species.MEGANIUM]: [ - [ 0, Moves.PETAL_DANCE ], + [ EVOLVE_MOVE, Moves.PETAL_DANCE ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.RAZOR_LEAF ], @@ -2675,8 +2681,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.CYNDAQUIL]: [ [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], - [ 6, Moves.SMOKESCREEN ], - [ 10, Moves.EMBER ], + [ 5, Moves.EMBER ], //Custom, moved from 10 to 5 + [ 10, Moves.SMOKESCREEN ], //Custom, moved from 6 to 10 [ 13, Moves.QUICK_ATTACK ], [ 19, Moves.FLAME_WHEEL ], [ 22, Moves.DEFENSE_CURL ], @@ -2730,7 +2736,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.TOTODILE]: [ [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], - [ 6, Moves.WATER_GUN ], + [ 5, Moves.WATER_GUN ], //Custom, moved from 6 to 5 [ 9, Moves.BITE ], [ 13, Moves.SCARY_FACE ], [ 19, Moves.ICE_FANG ], @@ -2792,7 +2798,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 47, Moves.HYPER_VOICE ], ], [Species.FURRET]: [ - [ 0, Moves.AGILITY ], + [ EVOLVE_MOVE, Moves.AGILITY ], [ 1, Moves.SCRATCH ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.DEFENSE_CURL ], @@ -2896,7 +2902,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 51, Moves.TOXIC_THREAD ], ], [Species.ARIADOS]: [ - [ 0, Moves.SWORDS_DANCE ], + [ EVOLVE_MOVE, Moves.SWORDS_DANCE ], [ 1, Moves.POISON_STING ], [ 1, Moves.ABSORB ], [ 1, Moves.STRING_SHOT ], @@ -2919,7 +2925,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 59, Moves.TOXIC_THREAD ], ], [Species.CROBAT]: [ - [ 0, Moves.CROSS_POISON ], + [ EVOLVE_MOVE, Moves.CROSS_POISON ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.ABSORB ], [ 1, Moves.TOXIC ], @@ -2953,9 +2959,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.HYDRO_PUMP ], ], [Species.LANTURN]: [ - [ 0, Moves.STOCKPILE ], - [ 0, Moves.SPIT_UP ], - [ 0, Moves.SWALLOW ], + [ EVOLVE_MOVE, Moves.STOCKPILE ], + [ EVOLVE_MOVE, Moves.SPIT_UP ], + [ EVOLVE_MOVE, Moves.SWALLOW ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.WATER_GUN ], [ 1, Moves.SPOTLIGHT ], @@ -3019,7 +3025,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.WISH ], ], [Species.TOGETIC]: [ - [ 0, Moves.FAIRY_WIND ], + [ EVOLVE_MOVE, Moves.FAIRY_WIND ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], [ 1, Moves.SWEET_KISS ], @@ -3051,7 +3057,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.FUTURE_SIGHT ], ], [Species.XATU]: [ - [ 0, Moves.AIR_SLASH ], + [ EVOLVE_MOVE, Moves.AIR_SLASH ], [ 1, Moves.LEER ], [ 1, Moves.PECK ], [ 1, Moves.TELEPORT ], @@ -3101,7 +3107,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.THUNDER ], ], [Species.AMPHAROS]: [ - [ 0, Moves.THUNDER_PUNCH ], + [ EVOLVE_MOVE, Moves.THUNDER_PUNCH ], [ 1, Moves.FIRE_PUNCH ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], @@ -3124,7 +3130,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.THUNDER ], ], [Species.BELLOSSOM]: [ - [ 0, Moves.PETAL_BLIZZARD ], + [ EVOLVE_MOVE, Moves.PETAL_BLIZZARD ], [ 1, Moves.ACID ], [ 1, Moves.ABSORB ], [ 1, Moves.MEGA_DRAIN ], @@ -3180,7 +3186,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.SUPERPOWER ], ], [Species.SUDOWOODO]: [ - [ 0, Moves.SLAM ], + [ EVOLVE_MOVE, Moves.SLAM ], [ 1, Moves.ROCK_THROW ], [ 1, Moves.FLAIL ], [ 1, Moves.FAKE_TEARS ], @@ -3200,21 +3206,21 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.HEAD_SMASH ], ], [Species.POLITOED]: [ - [ 0, Moves.BOUNCE ], + [ EVOLVE_MOVE, Moves.BOUNCE ], + [ RELEARN_MOVE, Moves.BODY_SLAM ], + [ RELEARN_MOVE, Moves.DOUBLE_EDGE ], + [ RELEARN_MOVE, Moves.WATER_GUN ], + [ RELEARN_MOVE, Moves.BUBBLE_BEAM ], + [ RELEARN_MOVE, Moves.HYPNOSIS ], + [ RELEARN_MOVE, Moves.PERISH_SONG ], + [ RELEARN_MOVE, Moves.SWAGGER ], + [ RELEARN_MOVE, Moves.HYPER_VOICE ], + [ RELEARN_MOVE, Moves.MUD_SHOT ], + [ RELEARN_MOVE, Moves.EARTH_POWER ], [ 1, Moves.RAIN_DANCE ], [ 1, Moves.HYDRO_PUMP ], [ 1, Moves.BELLY_DRUM ], [ 1, Moves.POUND ], - [ 1, Moves.BODY_SLAM ], - [ 1, Moves.DOUBLE_EDGE ], - [ 1, Moves.WATER_GUN ], - [ 1, Moves.BUBBLE_BEAM ], - [ 1, Moves.HYPNOSIS ], - [ 1, Moves.PERISH_SONG ], - [ 1, Moves.SWAGGER ], - [ 1, Moves.HYPER_VOICE ], - [ 1, Moves.MUD_SHOT ], - [ 1, Moves.EARTH_POWER ], ], [Species.HOPPIP]: [ [ 1, Moves.TACKLE ], @@ -3374,7 +3380,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.EARTHQUAKE ], ], [Species.ESPEON]: [ - [ 0, Moves.GLITZY_GLOW ], + [ EVOLVE_MOVE, Moves.GLITZY_GLOW ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -3400,7 +3406,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.LAST_RESORT ], ], [Species.UMBREON]: [ - [ 0, Moves.BADDY_BAD ], + [ EVOLVE_MOVE, Moves.BADDY_BAD ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -3443,6 +3449,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.QUASH ], ], [Species.SLOWKING]: [ + [ RELEARN_MOVE, Moves.FUTURE_SIGHT ], + [ RELEARN_MOVE, Moves.CHILLY_RECEPTION ], [ 1, Moves.POWER_GEM ], [ 1, Moves.NASTY_PLOT ], [ 1, Moves.SWAGGER ], @@ -3450,8 +3458,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CURSE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], - [ 1, Moves.FUTURE_SIGHT ], - [ 1, Moves.CHILLY_RECEPTION ], [ 9, Moves.YAWN ], [ 12, Moves.CONFUSION ], [ 15, Moves.DISABLE ], @@ -3484,10 +3490,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HIDDEN_POWER ], ], [Species.WOBBUFFET]: [ - [ 0, Moves.COUNTER ], - [ 0, Moves.DESTINY_BOND ], - [ 0, Moves.SAFEGUARD ], - [ 0, Moves.MIRROR_COAT ], + [ EVOLVE_MOVE, Moves.COUNTER ], + [ EVOLVE_MOVE, Moves.DESTINY_BOND ], + [ EVOLVE_MOVE, Moves.SAFEGUARD ], + [ EVOLVE_MOVE, Moves.MIRROR_COAT ], [ 1, Moves.COUNTER ], [ 1, Moves.DESTINY_BOND ], [ 1, Moves.SAFEGUARD ], @@ -3532,7 +3538,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.DOUBLE_EDGE ], ], [Species.FORRETRESS]: [ - [ 0, Moves.HEAVY_SLAM ], + [ EVOLVE_MOVE, Moves.HEAVY_SLAM ], [ 1, Moves.TACKLE ], [ 1, Moves.SELF_DESTRUCT ], [ 1, Moves.PROTECT ], @@ -3668,7 +3674,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.DESTINY_BOND ], ], [Species.SCIZOR]: [ - [ 0, Moves.BULLET_PUNCH ], + [ EVOLVE_MOVE, Moves.BULLET_PUNCH ], [ 1, Moves.WING_ATTACK ], [ 1, Moves.LEER ], [ 1, Moves.AGILITY ], @@ -3791,7 +3797,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.EARTH_POWER ], ], [Species.MAGCARGO]: [ - [ 0, Moves.SHELL_SMASH ], + [ EVOLVE_MOVE, Moves.SHELL_SMASH ], [ 1, Moves.EMBER ], [ 1, Moves.ROCK_THROW ], [ 1, Moves.SMOG ], @@ -3824,7 +3830,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.BLIZZARD ], ], [Species.PILOSWINE]: [ - [ 0, Moves.ICE_FANG ], + [ EVOLVE_MOVE, Moves.ICE_FANG ], [ 1, Moves.TACKLE ], [ 1, Moves.FLAIL ], [ 1, Moves.POWDER_SNOW ], @@ -3872,7 +3878,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.HYPER_BEAM ], ], [Species.OCTILLERY]: [ - [ 0, Moves.OCTAZOOKA ], + [ EVOLVE_MOVE, Moves.OCTAZOOKA ], [ 1, Moves.WRAP ], [ 1, Moves.CONSTRICT ], [ 1, Moves.WATER_GUN ], @@ -4017,7 +4023,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 42, Moves.DOUBLE_EDGE ], ], [Species.DONPHAN]: [ - [ 0, Moves.FURY_ATTACK ], + [ EVOLVE_MOVE, Moves.FURY_ATTACK ], [ 1, Moves.HORN_ATTACK ], [ 1, Moves.GROWL ], [ 1, Moves.DEFENSE_CURL ], @@ -4068,11 +4074,18 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.IMPRISON ], [ 55, Moves.DOUBLE_EDGE ], ], + // Reverting Smeargle back to pre gen9 implementation, to make it less dependent on access to Memory Mushrooms [Species.SMEARGLE]: [ [ 1, Moves.SKETCH ], - [ 1, Moves.SKETCH ], - [ 1, Moves.SKETCH ], - [ 1, Moves.SKETCH ], + [ 11, Moves.SKETCH ], + [ 21, Moves.SKETCH ], + [ 31, Moves.SKETCH ], + [ 41, Moves.SKETCH ], + [ 51, Moves.SKETCH ], + [ 61, Moves.SKETCH ], + [ 71, Moves.SKETCH ], + [ 81, Moves.SKETCH ], + [ 91, Moves.SKETCH ], ], [Species.TYROGUE]: [ [ 1, Moves.TACKLE ], @@ -4081,7 +4094,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HELPING_HAND ], ], [Species.HITMONTOP]: [ - [ 0, Moves.TRIPLE_KICK ], + [ EVOLVE_MOVE, Moves.TRIPLE_KICK ], [ 1, Moves.TACKLE ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.RAPID_SPIN ], @@ -4209,12 +4222,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 78, Moves.ZAP_CANNON ], ], [Species.ENTEI]: [ + [ RELEARN_MOVE, Moves.SACRED_FIRE ], + [ RELEARN_MOVE, Moves.EXTREME_SPEED ], [ 1, Moves.STOMP ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], [ 1, Moves.SMOKESCREEN ], - [ 1, Moves.SACRED_FIRE ], - [ 1, Moves.EXTREME_SPEED ], [ 6, Moves.FLAME_WHEEL ], [ 12, Moves.BITE ], [ 18, Moves.CALM_MIND ], @@ -4230,12 +4243,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 78, Moves.ERUPTION ], ], [Species.SUICUNE]: [ + [ RELEARN_MOVE, Moves.EXTREME_SPEED ], + [ RELEARN_MOVE, Moves.SHEER_COLD ], [ 1, Moves.GUST ], [ 1, Moves.LEER ], [ 1, Moves.MIST ], [ 1, Moves.WATER_GUN ], - [ 1, Moves.EXTREME_SPEED ], - [ 1, Moves.SHEER_COLD ], [ 6, Moves.WATER_PULSE ], [ 12, Moves.BITE ], [ 18, Moves.CALM_MIND ], @@ -4269,7 +4282,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 42, Moves.HYPER_BEAM ], ], [Species.PUPITAR]: [ - [ 0, Moves.IRON_DEFENSE ], + [ EVOLVE_MOVE, Moves.IRON_DEFENSE ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.ROCK_THROW ], @@ -4312,11 +4325,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 59, Moves.GIGA_IMPACT ], ], [Species.LUGIA]: [ + [ RELEARN_MOVE, Moves.DRAGON_RUSH ], [ 1, Moves.GUST ], [ 1, Moves.WHIRLWIND ], [ 1, Moves.ANCIENT_POWER ], [ 1, Moves.WEATHER_BALL ], - [ 1, Moves.DRAGON_RUSH ], [ 9, Moves.MIST ], [ 18, Moves.SAFEGUARD ], [ 27, Moves.CALM_MIND ], @@ -4378,14 +4391,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 39, Moves.LEAF_STORM ], ], [Species.GROVYLE]: [ + [ RELEARN_MOVE, Moves.FALSE_SWIPE ], + [ RELEARN_MOVE, Moves.FURY_CUTTER ], + [ RELEARN_MOVE, Moves.X_SCISSOR ], + [ RELEARN_MOVE, Moves.ENERGY_BALL ], [ 1, Moves.POUND ], [ 1, Moves.LEER ], [ 1, Moves.LEAFAGE ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.FALSE_SWIPE ], - [ 1, Moves.FURY_CUTTER ], - [ 1, Moves.X_SCISSOR ], - [ 1, Moves.ENERGY_BALL ], [ 9, Moves.MEGA_DRAIN ], [ 12, Moves.DETECT ], [ 15, Moves.QUICK_GUARD ], @@ -4399,16 +4412,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.LEAF_STORM ], ], [Species.SCEPTILE]: [ - [ 0, Moves.LEAF_BLADE ], + [ EVOLVE_MOVE, Moves.LEAF_BLADE ], + [ RELEARN_MOVE, Moves.FALSE_SWIPE ], + [ RELEARN_MOVE, Moves.FURY_CUTTER ], + [ RELEARN_MOVE, Moves.X_SCISSOR ], + [ RELEARN_MOVE, Moves.ENERGY_BALL ], + [ RELEARN_MOVE, Moves.SHED_TAIL ], [ 1, Moves.POUND ], [ 1, Moves.LEER ], [ 1, Moves.LEAFAGE ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.FALSE_SWIPE ], - [ 1, Moves.FURY_CUTTER ], - [ 1, Moves.X_SCISSOR ], - [ 1, Moves.ENERGY_BALL ], - [ 1, Moves.SHED_TAIL ], [ 1, Moves.DUAL_CHOP ], [ 5, Moves.MEGA_DRAIN ], [ 12, Moves.DETECT ], @@ -4439,13 +4452,13 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 39, Moves.FLARE_BLITZ ], ], [Species.COMBUSKEN]: [ - [ 0, Moves.DOUBLE_KICK ], + [ EVOLVE_MOVE, Moves.DOUBLE_KICK ], + [ RELEARN_MOVE, Moves.FLAMETHROWER ], + [ RELEARN_MOVE, Moves.FEATHER_DANCE ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.FLAMETHROWER ], - [ 1, Moves.FEATHER_DANCE ], [ 9, Moves.FLAME_CHARGE ], [ 12, Moves.DETECT ], [ 15, Moves.SAND_ATTACK ], @@ -4459,15 +4472,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.FLARE_BLITZ ], ], [Species.BLAZIKEN]: [ - [ 0, Moves.BLAZE_KICK ], + [ EVOLVE_MOVE, Moves.BLAZE_KICK ], + [ RELEARN_MOVE, Moves.FIRE_PUNCH ], + [ RELEARN_MOVE, Moves.EMBER ], + [ RELEARN_MOVE, Moves.FLAMETHROWER ], + [ RELEARN_MOVE, Moves.FEATHER_DANCE ], [ 1, Moves.DOUBLE_KICK ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.FIRE_PUNCH ], - [ 1, Moves.EMBER ], - [ 1, Moves.FLAMETHROWER ], - [ 1, Moves.FEATHER_DANCE ], [ 9, Moves.FLAME_CHARGE ], [ 12, Moves.DETECT ], [ 15, Moves.SAND_ATTACK ], @@ -4498,11 +4511,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 39, Moves.HYDRO_PUMP ], ], [Species.MARSHTOMP]: [ - [ 0, Moves.MUD_SHOT ], + [ EVOLVE_MOVE, Moves.MUD_SHOT ], + [ RELEARN_MOVE, Moves.ROCK_SMASH ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], - [ 1, Moves.ROCK_SMASH ], [ 9, Moves.ROCK_THROW ], [ 12, Moves.PROTECT ], [ 15, Moves.SUPERSONIC ], @@ -4516,14 +4529,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.HYDRO_PUMP ], ], [Species.SWAMPERT]: [ + [ RELEARN_MOVE, Moves.SURF ], + [ RELEARN_MOVE, Moves.EARTHQUAKE ], + [ RELEARN_MOVE, Moves.ROCK_SMASH ], + [ RELEARN_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.MUD_SHOT ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], - [ 1, Moves.SURF ], - [ 1, Moves.EARTHQUAKE ], - [ 1, Moves.ROCK_SMASH ], - [ 1, Moves.HAMMER_ARM ], [ 9, Moves.ROCK_THROW ], [ 12, Moves.PROTECT ], [ 15, Moves.SUPERSONIC ], @@ -4554,7 +4567,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.PLAY_ROUGH ], ], [Species.MIGHTYENA]: [ - [ 0, Moves.SNARL ], + [ EVOLVE_MOVE, Moves.SNARL ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.BITE ], @@ -4592,7 +4605,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 36, Moves.DOUBLE_EDGE ], ], [Species.LINOONE]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], @@ -4619,11 +4632,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 15, Moves.BUG_BITE ], ], [Species.SILCOON]: [ - [ 0, Moves.HARDEN ], + [ EVOLVE_MOVE, Moves.HARDEN ], [ 1, Moves.HARDEN ], ], [Species.BEAUTIFLY]: [ - [ 0, Moves.GUST ], + [ EVOLVE_MOVE, Moves.GUST ], [ 1, Moves.BUG_BITE ], [ 1, Moves.GUST ], [ 1, Moves.HARDEN ], @@ -4643,11 +4656,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.QUIVER_DANCE ], ], [Species.CASCOON]: [ - [ 0, Moves.HARDEN ], + [ EVOLVE_MOVE, Moves.HARDEN ], [ 1, Moves.HARDEN ], ], [Species.DUSTOX]: [ - [ 0, Moves.GUST ], + [ EVOLVE_MOVE, Moves.GUST ], [ 1, Moves.BUG_BITE ], [ 1, Moves.GUST ], [ 1, Moves.HARDEN ], @@ -4701,22 +4714,22 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 64, Moves.HYDRO_PUMP ], ], [Species.LUDICOLO]: [ + [ RELEARN_MOVE, Moves.GROWL ], + [ RELEARN_MOVE, Moves.MIST ], + [ RELEARN_MOVE, Moves.WATER_GUN ], + [ RELEARN_MOVE, Moves.HYDRO_PUMP ], + [ RELEARN_MOVE, Moves.ABSORB ], + [ RELEARN_MOVE, Moves.MEGA_DRAIN ], + [ RELEARN_MOVE, Moves.FURY_SWIPES ], + [ RELEARN_MOVE, Moves.FLAIL ], + [ RELEARN_MOVE, Moves.KNOCK_OFF ], + [ RELEARN_MOVE, Moves.TEETER_DANCE ], + [ RELEARN_MOVE, Moves.ASTONISH ], + [ RELEARN_MOVE, Moves.ENERGY_BALL ], + [ RELEARN_MOVE, Moves.ZEN_HEADBUTT ], [ 1, Moves.FAKE_OUT ], [ 1, Moves.BUBBLE_BEAM ], [ 1, Moves.RAIN_DANCE ], - [ 1, Moves.GROWL ], - [ 1, Moves.MIST ], - [ 1, Moves.WATER_GUN ], - [ 1, Moves.HYDRO_PUMP ], - [ 1, Moves.ABSORB ], - [ 1, Moves.MEGA_DRAIN ], - [ 1, Moves.FURY_SWIPES ], - [ 1, Moves.FLAIL ], - [ 1, Moves.KNOCK_OFF ], - [ 1, Moves.TEETER_DANCE ], - [ 1, Moves.ASTONISH ], - [ 1, Moves.ENERGY_BALL ], - [ 1, Moves.ZEN_HEADBUTT ], ], [Species.SEEDOT]: [ [ 1, Moves.TACKLE ], @@ -4735,7 +4748,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 33, Moves.EXPLOSION ], ], [Species.NUZLEAF]: [ - [ 0, Moves.RAZOR_LEAF ], + [ EVOLVE_MOVE, Moves.RAZOR_LEAF ], [ 1, Moves.AIR_CUTTER ], [ 1, Moves.TORMENT ], [ 1, Moves.FAKE_OUT ], @@ -4756,28 +4769,28 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 57, Moves.LEAF_BLADE ], ], [Species.SHIFTRY]: [ - [ 0, Moves.LEAF_BLADE ], + [ EVOLVE_MOVE, Moves.LEAF_BLADE ], + [ RELEARN_MOVE, Moves.WHIRLWIND ], + [ RELEARN_MOVE, Moves.TACKLE ], + [ RELEARN_MOVE, Moves.ABSORB ], + [ RELEARN_MOVE, Moves.MEGA_DRAIN ], + [ RELEARN_MOVE, Moves.GROWTH ], + [ RELEARN_MOVE, Moves.RAZOR_LEAF ], + [ RELEARN_MOVE, Moves.HARDEN ], + [ RELEARN_MOVE, Moves.EXPLOSION ], + [ RELEARN_MOVE, Moves.ROLLOUT ], + [ RELEARN_MOVE, Moves.SWAGGER ], + [ RELEARN_MOVE, Moves.SYNTHESIS ], + [ RELEARN_MOVE, Moves.BEAT_UP ], + [ RELEARN_MOVE, Moves.FAKE_OUT ], + [ RELEARN_MOVE, Moves.TORMENT ], + [ RELEARN_MOVE, Moves.ASTONISH ], + [ RELEARN_MOVE, Moves.EXTRASENSORY ], + [ RELEARN_MOVE, Moves.SUCKER_PUNCH ], [ 1, Moves.AIR_CUTTER ], [ 1, Moves.HURRICANE ], [ 1, Moves.PAYBACK ], [ 1, Moves.SUNNY_DAY ], - [ 1, Moves.WHIRLWIND ], - [ 1, Moves.TACKLE ], - [ 1, Moves.ABSORB ], - [ 1, Moves.MEGA_DRAIN ], - [ 1, Moves.GROWTH ], - [ 1, Moves.RAZOR_LEAF ], - [ 1, Moves.HARDEN ], - [ 1, Moves.EXPLOSION ], - [ 1, Moves.ROLLOUT ], - [ 1, Moves.SWAGGER ], - [ 1, Moves.SYNTHESIS ], - [ 1, Moves.BEAT_UP ], - [ 1, Moves.FAKE_OUT ], - [ 1, Moves.TORMENT ], - [ 1, Moves.ASTONISH ], - [ 1, Moves.EXTRASENSORY ], - [ 1, Moves.SUCKER_PUNCH ], ], [Species.TAILLOW]: [ [ 1, Moves.PECK ], @@ -4881,7 +4894,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 53, Moves.FUTURE_SIGHT ], ], [Species.GARDEVOIR]: [ - [ 0, Moves.DAZZLING_GLEAM ], + [ EVOLVE_MOVE, Moves.DAZZLING_GLEAM ], [ 1, Moves.MISTY_TERRAIN ], [ 1, Moves.HEALING_WISH ], [ 1, Moves.CHARM ], @@ -4946,7 +4959,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.SPORE ], ], [Species.BRELOOM]: [ - [ 0, Moves.MACH_PUNCH ], + [ EVOLVE_MOVE, Moves.MACH_PUNCH ], + [ RELEARN_MOVE, Moves.SPORE ], [ 1, Moves.POISON_POWDER ], [ 1, Moves.GROWTH ], [ 1, Moves.TOXIC ], @@ -4992,7 +5006,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.REVERSAL ], ], [Species.SLAKING]: [ - [ 0, Moves.SWAGGER ], + [ EVOLVE_MOVE, Moves.SWAGGER ], [ 1, Moves.SUCKER_PUNCH ], [ 1, Moves.SCRATCH ], [ 1, Moves.YAWN ], @@ -5020,9 +5034,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.DIG ], ], [Species.NINJASK]: [ - [ 0, Moves.DOUBLE_TEAM ], - [ 0, Moves.SCREECH ], - [ 0, Moves.FURY_CUTTER ], + [ EVOLVE_MOVE, Moves.DOUBLE_TEAM ], + [ EVOLVE_MOVE, Moves.SCREECH ], + [ EVOLVE_MOVE, Moves.FURY_CUTTER ], [ 1, Moves.BATON_PASS ], [ 1, Moves.AERIAL_ACE ], [ 1, Moves.MUD_SLAP ], @@ -5075,7 +5089,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.HYPER_VOICE ], ], [Species.LOUDRED]: [ - [ 0, Moves.BITE ], + [ EVOLVE_MOVE, Moves.BITE ], [ 1, Moves.ASTONISH ], [ 1, Moves.POUND ], [ 1, Moves.ECHOED_VOICE ], @@ -5090,7 +5104,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 57, Moves.HYPER_VOICE ], ], [Species.EXPLOUD]: [ - [ 0, Moves.CRUNCH ], + [ EVOLVE_MOVE, Moves.CRUNCH ], [ 1, Moves.BITE ], [ 1, Moves.ICE_FANG ], [ 1, Moves.FIRE_FANG ], @@ -5383,11 +5397,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.ELECTRIC_TERRAIN ], ], [Species.PLUSLE]: [ + [ RELEARN_MOVE, Moves.NUZZLE ], [ 1, Moves.PLAY_NICE ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_WAVE ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.NUZZLE ], [ 4, Moves.HELPING_HAND ], [ 7, Moves.SPARK ], [ 10, Moves.ENCORE ], @@ -5405,11 +5419,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.ENTRAINMENT ], ], [Species.MINUN]: [ + [ RELEARN_MOVE, Moves.NUZZLE ], [ 1, Moves.PLAY_NICE ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_WAVE ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.NUZZLE ], [ 4, Moves.HELPING_HAND ], [ 7, Moves.SPARK ], [ 10, Moves.ENCORE ], @@ -5461,7 +5475,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 47, Moves.INFESTATION ], ], [Species.ROSELIA]: [ - [ 0, Moves.POISON_STING ], + [ EVOLVE_MOVE, Moves.POISON_STING ], [ 1, Moves.ABSORB ], [ 1, Moves.GROWTH ], [ 1, Moves.STUN_SPORE ], @@ -5498,7 +5512,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.GUNK_SHOT ], ], [Species.SWALOT]: [ - [ 0, Moves.BODY_SLAM ], + [ EVOLVE_MOVE, Moves.BODY_SLAM ], [ 1, Moves.GUNK_SHOT ], [ 1, Moves.POUND ], [ 1, Moves.YAWN ], @@ -5532,7 +5546,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.TAKE_DOWN ], ], [Species.SHARPEDO]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], [ 1, Moves.NIGHT_SLASH ], [ 1, Moves.AQUA_JET ], [ 1, Moves.LEER ], @@ -5604,7 +5618,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 47, Moves.DOUBLE_EDGE ], ], [Species.CAMERUPT]: [ - [ 0, Moves.ROCK_SLIDE ], + [ EVOLVE_MOVE, Moves.ROCK_SLIDE ], [ 1, Moves.FISSURE ], [ 1, Moves.ERUPTION ], [ 1, Moves.GROWL ], @@ -5657,7 +5671,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.BOUNCE ], ], [Species.GRUMPIG]: [ - [ 0, Moves.TEETER_DANCE ], + [ EVOLVE_MOVE, Moves.TEETER_DANCE ], [ 1, Moves.BELCH ], [ 1, Moves.SPLASH ], [ 1, Moves.CONFUSION ], @@ -5706,16 +5720,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FISSURE ], ], [Species.VIBRAVA]: [ - [ 0, Moves.DRAGON_BREATH ], + [ EVOLVE_MOVE, Moves.DRAGON_BREATH ], + [ RELEARN_MOVE, Moves.SUPERSONIC ], + [ RELEARN_MOVE, Moves.FISSURE ], + [ RELEARN_MOVE, Moves.CRUNCH ], + [ RELEARN_MOVE, Moves.SUPERPOWER ], + [ RELEARN_MOVE, Moves.ASTONISH ], + [ RELEARN_MOVE, Moves.BULLDOZE ], [ 1, Moves.DIG ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.BITE ], - [ 1, Moves.SUPERSONIC ], - [ 1, Moves.FISSURE ], - [ 1, Moves.CRUNCH ], - [ 1, Moves.SUPERPOWER ], - [ 1, Moves.ASTONISH ], - [ 1, Moves.BULLDOZE ], [ 1, Moves.BIDE ], [ 1, Moves.FEINT_ATTACK ], [ 12, Moves.MUD_SLAP ], @@ -5731,19 +5745,19 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.BOOMBURST ], ], [Species.FLYGON]: [ - [ 0, Moves.DRAGON_CLAW ], + [ EVOLVE_MOVE, Moves.DRAGON_CLAW ], + [ RELEARN_MOVE, Moves.BITE ], + [ RELEARN_MOVE, Moves.FISSURE ], + [ RELEARN_MOVE, Moves.DIG ], + [ RELEARN_MOVE, Moves.CRUNCH ], + [ RELEARN_MOVE, Moves.SUPERPOWER ], + [ RELEARN_MOVE, Moves.ASTONISH ], + [ RELEARN_MOVE, Moves.DRAGON_DANCE ], + [ RELEARN_MOVE, Moves.FEINT ], [ 1, Moves.DRAGON_BREATH ], [ 1, Moves.BULLDOZE ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.SUPERSONIC ], - [ 1, Moves.BITE ], - [ 1, Moves.FISSURE ], - [ 1, Moves.DIG ], - [ 1, Moves.CRUNCH ], - [ 1, Moves.SUPERPOWER ], - [ 1, Moves.ASTONISH ], - [ 1, Moves.DRAGON_DANCE ], - [ 1, Moves.FEINT ], [ 1, Moves.BIDE ], [ 1, Moves.FEINT_ATTACK ], [ 12, Moves.MUD_SLAP ], @@ -5778,7 +5792,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 54, Moves.DESTINY_BOND ], ], [Species.CACTURNE]: [ - [ 0, Moves.SPIKY_SHIELD ], + [ EVOLVE_MOVE, Moves.SPIKY_SHIELD ], [ 1, Moves.DESTINY_BOND ], [ 1, Moves.POISON_STING ], [ 1, Moves.LEER ], @@ -5813,7 +5827,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.PERISH_SONG ], ], [Species.ALTARIA]: [ - [ 0, Moves.DRAGON_PULSE ], + [ EVOLVE_MOVE, Moves.DRAGON_PULSE ], [ 1, Moves.PLUCK ], [ 1, Moves.PECK ], [ 1, Moves.GROWL ], @@ -5831,18 +5845,18 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.SKY_ATTACK ], ], [Species.ZANGOOSE]: [ - [ -1, Moves.DOUBLE_KICK ], - [ -1, Moves.DISABLE ], - [ -1, Moves.COUNTER ], - [ -1, Moves.FURY_SWIPES ], - [ -1, Moves.CURSE ], - [ -1, Moves.FLAIL ], - [ -1, Moves.BELLY_DRUM ], - [ -1, Moves.FEINT ], - [ -1, Moves.NIGHT_SLASH ], - [ -1, Moves.DOUBLE_HIT ], - [ -1, Moves.QUICK_GUARD ], - [ -1, Moves.FINAL_GAMBIT ], + [ RELEARN_MOVE, Moves.DOUBLE_KICK ], + [ RELEARN_MOVE, Moves.DISABLE ], + [ RELEARN_MOVE, Moves.COUNTER ], + [ RELEARN_MOVE, Moves.FURY_SWIPES ], + [ RELEARN_MOVE, Moves.CURSE ], + [ RELEARN_MOVE, Moves.FLAIL ], + [ RELEARN_MOVE, Moves.BELLY_DRUM ], + [ RELEARN_MOVE, Moves.FEINT ], + [ RELEARN_MOVE, Moves.NIGHT_SLASH ], + [ RELEARN_MOVE, Moves.DOUBLE_HIT ], + [ RELEARN_MOVE, Moves.QUICK_GUARD ], + [ RELEARN_MOVE, Moves.FINAL_GAMBIT ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 5, Moves.QUICK_ATTACK ], @@ -5929,7 +5943,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FISSURE ], ], [Species.WHISCASH]: [ - [ 0, Moves.THRASH ], + [ EVOLVE_MOVE, Moves.THRASH ], [ 1, Moves.BELCH ], [ 1, Moves.ZEN_HEADBUTT ], [ 1, Moves.TICKLE ], @@ -5963,7 +5977,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.GUILLOTINE ], ], [Species.CRAWDAUNT]: [ - [ 0, Moves.SWIFT ], + [ EVOLVE_MOVE, Moves.SWIFT ], [ 1, Moves.WATER_GUN ], [ 1, Moves.HARDEN ], [ 1, Moves.LEER ], @@ -6000,7 +6014,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 42, Moves.EXPLOSION ], ], [Species.CLAYDOL]: [ - [ 0, Moves.HYPER_BEAM ], + [ EVOLVE_MOVE, Moves.HYPER_BEAM ], [ 1, Moves.TELEPORT ], [ 1, Moves.HARDEN ], [ 1, Moves.MUD_SLAP ], @@ -6093,7 +6107,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 25, Moves.FLAIL ], ], [Species.MILOTIC]: [ - [ 0, Moves.WATER_PULSE ], + [ EVOLVE_MOVE, Moves.WATER_PULSE ], [ 1, Moves.FLAIL ], [ 1, Moves.SPLASH ], [ 1, Moves.TACKLE ], @@ -6167,7 +6181,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.PHANTOM_FORCE ], ], [Species.BANETTE]: [ - [ 0, Moves.KNOCK_OFF ], + [ EVOLVE_MOVE, Moves.KNOCK_OFF ], [ 1, Moves.SCREECH ], [ 1, Moves.NIGHT_SHADE ], [ 1, Moves.SPITE ], @@ -6198,7 +6212,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.FUTURE_SIGHT ], ], [Species.DUSCLOPS]: [ - [ 0, Moves.SHADOW_PUNCH ], + [ EVOLVE_MOVE, Moves.SHADOW_PUNCH ], [ 1, Moves.FIRE_PUNCH ], [ 1, Moves.ICE_PUNCH ], [ 1, Moves.THUNDER_PUNCH ], @@ -6295,7 +6309,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.BLIZZARD ], ], [Species.GLALIE]: [ - [ 0, Moves.FREEZE_DRY ], + [ EVOLVE_MOVE, Moves.FREEZE_DRY ], [ 1, Moves.SHEER_COLD ], [ 1, Moves.POWDER_SNOW ], [ 1, Moves.HEADBUTT ], @@ -6332,7 +6346,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.SHEER_COLD ], ], [Species.SEALEO]: [ - [ 0, Moves.SWAGGER ], + [ EVOLVE_MOVE, Moves.SWAGGER ], [ 1, Moves.ROLLOUT ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.GROWL ], @@ -6465,7 +6479,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.DOUBLE_EDGE ], ], [Species.SHELGON]: [ - [ 0, Moves.PROTECT ], + [ EVOLVE_MOVE, Moves.PROTECT ], [ 1, Moves.EMBER ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], @@ -6481,7 +6495,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 67, Moves.DOUBLE_EDGE ], ], [Species.SALAMENCE]: [ - [ 0, Moves.FLY ], + [ EVOLVE_MOVE, Moves.FLY ], [ 1, Moves.PROTECT ], [ 1, Moves.DRAGON_TAIL ], [ 1, Moves.DUAL_WINGBEAT ], @@ -6503,8 +6517,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], ], [Species.METANG]: [ - [ 0, Moves.CONFUSION ], - [ 0, Moves.METAL_CLAW ], + [ EVOLVE_MOVE, Moves.CONFUSION ], + [ EVOLVE_MOVE, Moves.METAL_CLAW ], [ 1, Moves.TACKLE ], [ 1, Moves.BULLET_PUNCH ], [ 1, Moves.HONE_CLAWS ], @@ -6520,13 +6534,13 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 74, Moves.HYPER_BEAM ], ], [Species.METAGROSS]: [ - [ 0, Moves.HAMMER_ARM ], + [ EVOLVE_MOVE, Moves.HAMMER_ARM ], + [ RELEARN_MOVE, Moves.EXPLOSION ], + [ RELEARN_MOVE, Moves.HONE_CLAWS ], [ 1, Moves.CONFUSION ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.BULLET_PUNCH ], [ 1, Moves.TACKLE ], - [ 1, Moves.EXPLOSION ], - [ 1, Moves.HONE_CLAWS ], [ 6, Moves.ZEN_HEADBUTT ], [ 12, Moves.MAGNET_RISE ], [ 16, Moves.FLASH_CANNON ], @@ -6716,7 +6730,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.TURTWIG]: [ [ 1, Moves.TACKLE ], [ 5, Moves.WITHDRAW ], - [ 9, Moves.ABSORB ], + [ 5, Moves.LEAFAGE ], //Custom, moved from 10 to 5, BDSP + [ 9, Moves.GROWTH ], //Fill empty moveslot, from BDSP level 6 [ 13, Moves.RAZOR_LEAF ], [ 17, Moves.CURSE ], [ 21, Moves.BITE ], @@ -6731,6 +6746,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.ABSORB ], [ 1, Moves.WITHDRAW ], + [ 1, Moves.LEAFAGE ], [ 13, Moves.RAZOR_LEAF ], [ 17, Moves.CURSE ], [ 22, Moves.BITE ], @@ -6742,9 +6758,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.LEAF_STORM ], ], [Species.TORTERRA]: [ - [ 0, Moves.EARTHQUAKE ], + [ EVOLVE_MOVE, Moves.EARTHQUAKE ], [ 1, Moves.TACKLE ], [ 1, Moves.ABSORB ], + [ 1, Moves.LEAFAGE ], [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.WITHDRAW ], [ 1, Moves.WOOD_HAMMER ], @@ -6761,7 +6778,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.CHIMCHAR]: [ [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], - [ 7, Moves.EMBER ], + [ 5, Moves.EMBER ], //Custom, moved from 7 to 5 [ 9, Moves.TAUNT ], [ 15, Moves.FURY_SWIPES ], [ 17, Moves.FLAME_WHEEL ], @@ -6774,7 +6791,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 47, Moves.FLAMETHROWER ], ], [Species.MONFERNO]: [ - [ 0, Moves.MACH_PUNCH ], + [ EVOLVE_MOVE, Moves.MACH_PUNCH ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -6790,7 +6807,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.FLARE_BLITZ ], ], [Species.INFERNAPE]: [ - [ 0, Moves.CLOSE_COMBAT ], + [ EVOLVE_MOVE, Moves.CLOSE_COMBAT ], + [ RELEARN_MOVE, Moves.TAUNT ], + [ RELEARN_MOVE, Moves.SLACK_OFF ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -6808,7 +6827,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.PIPLUP]: [ [ 1, Moves.POUND ], [ 4, Moves.GROWL ], - [ 8, Moves.WATER_GUN ], + [ 5, Moves.WATER_GUN ], //Custom, moved from 8 to 5 [ 11, Moves.CHARM ], [ 15, Moves.PECK ], [ 18, Moves.BUBBLE_BEAM ], @@ -6821,7 +6840,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.HYDRO_PUMP ], ], [Species.PRINPLUP]: [ - [ 0, Moves.METAL_CLAW ], + [ EVOLVE_MOVE, Moves.METAL_CLAW ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -6836,7 +6855,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.HYDRO_PUMP ], ], [Species.EMPOLEON]: [ - [ 0, Moves.AQUA_JET ], + [ EVOLVE_MOVE, Moves.AQUA_JET ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -6882,7 +6901,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FINAL_GAMBIT ], ], [Species.STARAPTOR]: [ - [ 0, Moves.CLOSE_COMBAT ], + [ EVOLVE_MOVE, Moves.CLOSE_COMBAT ], [ 1, Moves.WING_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], @@ -6913,7 +6932,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.CURSE ], ], [Species.BIBAREL]: [ - [ 0, Moves.WATER_GUN ], + [ EVOLVE_MOVE, Moves.WATER_GUN ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.AQUA_JET ], @@ -6939,7 +6958,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 16, Moves.BUG_BITE ], ], [Species.KRICKETUNE]: [ - [ 0, Moves.FURY_CUTTER ], + [ EVOLVE_MOVE, Moves.FURY_CUTTER ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.BIDE ], @@ -7047,7 +7066,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 46, Moves.HEAD_SMASH ], ], [Species.RAMPARDOS]: [ - [ 0, Moves.ENDEAVOR ], + [ EVOLVE_MOVE, Moves.ENDEAVOR ], [ 1, Moves.HEADBUTT ], [ 1, Moves.LEER ], [ 1, Moves.FOCUS_ENERGY ], @@ -7076,7 +7095,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 46, Moves.HEAVY_SLAM ], ], [Species.BASTIODON]: [ - [ 0, Moves.BLOCK ], + [ EVOLVE_MOVE, Moves.BLOCK ], + [ RELEARN_MOVE, Moves.WIDE_GUARD ], [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.TAUNT ], @@ -7098,7 +7118,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 20, Moves.STRING_SHOT ], ], [Species.WORMADAM]: [ - [ 0, Moves.QUIVER_DANCE ], + [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.SUCKER_PUNCH ], @@ -7118,7 +7138,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.BUG_BUZZ ], ], [Species.MOTHIM]: [ - [ 0, Moves.QUIVER_DANCE ], + [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.BUG_BITE ], @@ -7143,7 +7163,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.STRUGGLE_BUG ], ], [Species.VESPIQUEN]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], [ 1, Moves.GUST ], [ 1, Moves.POISON_STING ], [ 1, Moves.CONFUSE_RAY ], @@ -7231,7 +7251,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.SOLAR_BEAM ], ], [Species.CHERRIM]: [ - [ 0, Moves.SUNNY_DAY ], + [ EVOLVE_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWTH ], [ 1, Moves.MORNING_SUN ], @@ -7308,7 +7328,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.EXPLOSION ], ], [Species.DRIFBLIM]: [ - [ 0, Moves.PHANTOM_FORCE ], + [ EVOLVE_MOVE, Moves.PHANTOM_FORCE ], [ 1, Moves.GUST ], [ 1, Moves.MINIMIZE ], [ 1, Moves.FOCUS_ENERGY ], @@ -7346,7 +7366,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.HEALING_WISH ], ], [Species.LOPUNNY]: [ - [ 0, Moves.RETURN ], + [ EVOLVE_MOVE, Moves.RETURN ], [ 1, Moves.POUND ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.SPLASH ], @@ -7409,7 +7429,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.PLAY_ROUGH ], ], [Species.PURUGLY]: [ - [ 0, Moves.SWAGGER ], + [ EVOLVE_MOVE, Moves.SWAGGER ], [ 1, Moves.SCRATCH ], [ 1, Moves.PLAY_ROUGH ], [ 1, Moves.SUCKER_PUNCH ], @@ -7456,7 +7476,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 42, Moves.EXPLOSION ], ], [Species.SKUNTANK]: [ - [ 0, Moves.FLAMETHROWER ], + [ EVOLVE_MOVE, Moves.FLAMETHROWER ], [ 1, Moves.SCRATCH ], [ 1, Moves.SMOKESCREEN ], [ 1, Moves.POISON_GAS ], @@ -7490,7 +7510,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.HEAL_BLOCK ], ], [Species.BRONZONG]: [ - [ 0, Moves.BLOCK ], + [ EVOLVE_MOVE, Moves.BLOCK ], [ 1, Moves.TACKLE ], [ 1, Moves.CONFUSION ], [ 1, Moves.CONFUSE_RAY ], @@ -7619,7 +7639,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 74, Moves.DRAGON_RUSH ], ], [Species.GARCHOMP]: [ - [ 0, Moves.CRUNCH ], + [ EVOLVE_MOVE, Moves.CRUNCH ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.DRAGON_BREATH ], @@ -7672,7 +7692,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.REVERSAL ], ], [Species.LUCARIO]: [ - [ 0, Moves.AURA_SPHERE ], + [ EVOLVE_MOVE, Moves.AURA_SPHERE ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.SCREECH ], [ 1, Moves.REVERSAL ], @@ -7889,7 +7909,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.SHEER_COLD ], ], [Species.ABOMASNOW]: [ - [ 0, Moves.ICE_PUNCH ], + [ EVOLVE_MOVE, Moves.ICE_PUNCH ], [ 1, Moves.LEER ], [ 1, Moves.MIST ], [ 1, Moves.POWDER_SNOW ], @@ -8038,7 +8058,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 64, Moves.HYPER_BEAM ], ], [Species.TOGEKISS]: [ - [ 0, Moves.AIR_SLASH ], + [ EVOLVE_MOVE, Moves.AIR_SLASH ], [ 1, Moves.POUND ], [ 1, Moves.DOUBLE_EDGE ], [ 1, Moves.GROWL ], @@ -8061,6 +8081,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.LIFE_DEW ], ], [Species.YANMEGA]: [ + [ RELEARN_MOVE, Moves.HYPNOSIS ], [ 1, Moves.TACKLE ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.NIGHT_SLASH ], @@ -8078,7 +8099,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.U_TURN ], ], [Species.LEAFEON]: [ - [ 0, Moves.SAPPY_SEED ], + [ EVOLVE_MOVE, Moves.SAPPY_SEED ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -8105,7 +8126,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.LAST_RESORT ], ], [Species.GLACEON]: [ - [ 0, Moves.FREEZY_FROST ], + [ EVOLVE_MOVE, Moves.FREEZY_FROST ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -8149,7 +8170,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.SWORDS_DANCE ], ], [Species.MAMOSWINE]: [ - [ 0, Moves.DOUBLE_HIT ], + [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], [ 1, Moves.TACKLE ], [ 1, Moves.FLAIL ], [ 1, Moves.POWDER_SNOW ], @@ -8188,7 +8209,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 65, Moves.HYPER_BEAM ], ], [Species.GALLADE]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], [ 1, Moves.LEER ], [ 1, Moves.GROWL ], [ 1, Moves.PSYBEAM ], @@ -8223,7 +8244,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 63, Moves.CLOSE_COMBAT ], ], [Species.PROBOPASS]: [ - [ 0, Moves.TRI_ATTACK ], + [ EVOLVE_MOVE, Moves.TRI_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.IRON_DEFENSE ], [ 1, Moves.BLOCK ], @@ -8267,7 +8288,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 54, Moves.DESTINY_BOND ], ], [Species.FROSLASS]: [ - [ 0, Moves.HEX ], + [ EVOLVE_MOVE, Moves.HEX ], [ 1, Moves.HEADBUTT ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], @@ -8306,6 +8327,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.UPROAR ], ], [Species.UXIE]: [ + [ RELEARN_MOVE, Moves.TRI_ATTACK ], + [ RELEARN_MOVE, Moves.SNORE ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.IRON_TAIL ], + [ RELEARN_MOVE, Moves.PSYCHO_CUT ], + [ RELEARN_MOVE, Moves.WONDER_ROOM ], + [ RELEARN_MOVE, Moves.MAGIC_ROOM ], + [ RELEARN_MOVE, Moves.ROUND ], + [ RELEARN_MOVE, Moves.ALLY_SWITCH ], + [ RELEARN_MOVE, Moves.EXPANDING_FORCE ], [ 1, Moves.CONFUSION ], [ 1, Moves.REST ], [ 7, Moves.SWIFT ], @@ -8322,6 +8353,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 84, Moves.MYSTICAL_POWER ], ], [Species.MESPRIT]: [ + [ RELEARN_MOVE, Moves.TRI_ATTACK ], + [ RELEARN_MOVE, Moves.SNORE ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.IRON_TAIL ], + [ RELEARN_MOVE, Moves.PSYCHO_CUT ], + [ RELEARN_MOVE, Moves.WONDER_ROOM ], + [ RELEARN_MOVE, Moves.MAGIC_ROOM ], + [ RELEARN_MOVE, Moves.ROUND ], + [ RELEARN_MOVE, Moves.ALLY_SWITCH ], + [ RELEARN_MOVE, Moves.EXPANDING_FORCE ], [ 1, Moves.CONFUSION ], [ 1, Moves.REST ], [ 7, Moves.SWIFT ], @@ -8338,6 +8379,19 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 84, Moves.MYSTICAL_POWER ], ], [Species.AZELF]: [ + [ RELEARN_MOVE, Moves.SELF_DESTRUCT ], + [ RELEARN_MOVE, Moves.TRI_ATTACK ], + [ RELEARN_MOVE, Moves.SNORE ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.IRON_TAIL ], + [ RELEARN_MOVE, Moves.PAYBACK ], + [ RELEARN_MOVE, Moves.ASSURANCE ], + [ RELEARN_MOVE, Moves.PSYCHO_CUT ], + [ RELEARN_MOVE, Moves.WONDER_ROOM ], + [ RELEARN_MOVE, Moves.MAGIC_ROOM ], + [ RELEARN_MOVE, Moves.ROUND ], + [ RELEARN_MOVE, Moves.ALLY_SWITCH ], + [ RELEARN_MOVE, Moves.EXPANDING_FORCE ], [ 1, Moves.CONFUSION ], [ 1, Moves.REST ], [ 7, Moves.SWIFT ], @@ -8420,8 +8474,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.GIRATINA]: [ [ 1, Moves.SHADOW_SNEAK ], [ 1, Moves.DEFOG ], - [ 1, Moves.TWISTER ], //Custom - [ 7, Moves.DRAGON_BREATH ], + [ 1, Moves.DRAGON_BREATH ], //USUM + [ 7, Moves.OMINOUS_WIND ], //USUM [ 14, Moves.ANCIENT_POWER ], [ 21, Moves.HEX ], [ 28, Moves.SLASH ], @@ -8547,7 +8601,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SNIVY]: [ [ 1, Moves.TACKLE ], [ 4, Moves.LEER ], - [ 7, Moves.VINE_WHIP ], + [ 5, Moves.VINE_WHIP ], //Custom, moved from 7 to 5 [ 10, Moves.WRAP ], [ 13, Moves.GROWTH ], [ 16, Moves.MAGICAL_LEAF ], @@ -8595,7 +8649,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.TEPIG]: [ [ 1, Moves.TACKLE ], [ 3, Moves.TAIL_WHIP ], - [ 7, Moves.EMBER ], + [ 5, Moves.EMBER ], //Custom, moved from 7 to 5 [ 9, Moves.ENDURE ], [ 13, Moves.DEFENSE_CURL ], [ 15, Moves.FLAME_CHARGE ], @@ -8610,7 +8664,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.FLARE_BLITZ ], ], [Species.PIGNITE]: [ - [ 0, Moves.ARM_THRUST ], + [ EVOLVE_MOVE, Moves.ARM_THRUST ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.EMBER ], @@ -8628,12 +8682,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.FLARE_BLITZ ], ], [Species.EMBOAR]: [ + [ RELEARN_MOVE, Moves.ENDURE ], + [ RELEARN_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.EMBER ], [ 1, Moves.ARM_THRUST ], - [ 1, Moves.ENDURE ], - [ 1, Moves.HAMMER_ARM ], [ 13, Moves.DEFENSE_CURL ], [ 15, Moves.FLAME_CHARGE ], [ 20, Moves.SMOG ], @@ -8649,7 +8703,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.OSHAWOTT]: [ [ 1, Moves.TACKLE ], [ 5, Moves.TAIL_WHIP ], - [ 7, Moves.WATER_GUN ], + [ 5, Moves.WATER_GUN ], //Custom, moved from 7 to 5 [ 11, Moves.SOAK ], [ 13, Moves.FOCUS_ENERGY ], [ 17, Moves.RAZOR_SHELL ], @@ -8681,7 +8735,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 53, Moves.HYDRO_PUMP ], ], [Species.SAMUROTT]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.WATER_GUN ], @@ -8719,7 +8773,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 41, Moves.SLAM ], ], [Species.WATCHOG]: [ - [ 0, Moves.CONFUSE_RAY ], + [ EVOLVE_MOVE, Moves.CONFUSE_RAY ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], @@ -9019,7 +9073,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.EXPLOSION ], ], [Species.BOLDORE]: [ - [ 0, Moves.POWER_GEM ], + [ EVOLVE_MOVE, Moves.POWER_GEM ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.HARDEN ], @@ -9098,7 +9152,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FISSURE ], ], [Species.EXCADRILL]: [ - [ 0, Moves.HORN_DRILL ], + [ EVOLVE_MOVE, Moves.HORN_DRILL ], [ 1, Moves.SCRATCH ], [ 1, Moves.MUD_SLAP ], [ 1, Moves.RAPID_SPIN ], @@ -9186,6 +9240,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.FOCUS_PUNCH ], ], [Species.TYMPOLE]: [ + [ 1, Moves.BUBBLE ], //USUM [ 1, Moves.GROWL ], [ 1, Moves.ECHOED_VOICE ], [ 4, Moves.ACID ], @@ -9202,6 +9257,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.HYDRO_PUMP ], ], [Species.PALPITOAD]: [ + [ 1, Moves.BUBBLE ], //USUM [ 1, Moves.GROWL ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.ACID ], @@ -9218,7 +9274,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.HYDRO_PUMP ], ], [Species.SEISMITOAD]: [ - [ 0, Moves.DRAIN_PUNCH ], + [ EVOLVE_MOVE, Moves.DRAIN_PUNCH ], + [ 1, Moves.BUBBLE ], //USUM [ 1, Moves.GROWL ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.ACID ], @@ -9236,7 +9293,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 70, Moves.HYDRO_PUMP ], ], [Species.THROH]: [ - [ 1, Moves.KARATE_CHOP ], //Custom + [ 1, Moves.ROCK_SMASH ], //Custom [ 1, Moves.LEER ], [ 1, Moves.BIDE ], [ 1, Moves.MAT_BLOCK ], @@ -9281,7 +9338,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.FLAIL ], ], [Species.SWADLOON]: [ - [ 0, Moves.PROTECT ], + [ EVOLVE_MOVE, Moves.PROTECT ], [ 1, Moves.TACKLE ], [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.STRING_SHOT ], @@ -9294,7 +9351,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.FLAIL ], ], [Species.LEAVANNY]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], + [ RELEARN_MOVE, Moves.BUG_BITE ], [ 1, Moves.TACKLE ], [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.STRING_SHOT ], @@ -9324,7 +9382,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.DOUBLE_EDGE ], ], [Species.WHIRLIPEDE]: [ - [ 0, Moves.IRON_DEFENSE ], + [ EVOLVE_MOVE, Moves.IRON_DEFENSE ], [ 1, Moves.POISON_STING ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.PROTECT ], @@ -9419,7 +9477,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 42, Moves.LEAF_STORM ], ], [Species.LILLIGANT]: [ - [ 0, Moves.PETAL_DANCE ], + [ EVOLVE_MOVE, Moves.PETAL_DANCE ], [ 1, Moves.ABSORB ], [ 1, Moves.MEGA_DRAIN ], [ 1, Moves.LEECH_SEED ], @@ -9527,7 +9585,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.SUPERPOWER ], ], [Species.DARMANITAN]: [ - [ 0, Moves.HAMMER_ARM ], + [ EVOLVE_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.TACKLE ], [ 1, Moves.BITE ], [ 1, Moves.EMBER ], @@ -9669,7 +9727,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.DESTINY_BOND ], ], [Species.COFAGRIGUS]: [ - [ 0, Moves.SHADOW_CLAW ], + [ EVOLVE_MOVE, Moves.SHADOW_CLAW ], [ 1, Moves.NIGHT_SHADE ], [ 1, Moves.HAZE ], [ 1, Moves.PROTECT ], @@ -9824,7 +9882,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FOUL_PLAY ], ], [Species.ZOROARK]: [ - [ 0, Moves.NIGHT_SLASH ], + [ EVOLVE_MOVE, Moves.NIGHT_SLASH ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.TORMENT ], @@ -9858,22 +9916,22 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.LAST_RESORT ], ], [Species.CINCCINO]: [ - [ 0, Moves.TAIL_SLAP ], + [ EVOLVE_MOVE, Moves.TAIL_SLAP ], + [ RELEARN_MOVE, Moves.SLAM ], + [ RELEARN_MOVE, Moves.SWIFT ], + [ RELEARN_MOVE, Moves.ENCORE ], + [ RELEARN_MOVE, Moves.HELPING_HAND ], + [ RELEARN_MOVE, Moves.HYPER_VOICE ], + [ RELEARN_MOVE, Moves.TICKLE ], + [ RELEARN_MOVE, Moves.ROCK_BLAST ], + [ RELEARN_MOVE, Moves.LAST_RESORT ], + [ RELEARN_MOVE, Moves.AFTER_YOU ], + [ RELEARN_MOVE, Moves.ECHOED_VOICE ], + [ RELEARN_MOVE, Moves.BABY_DOLL_EYES ], [ 1, Moves.BULLET_SEED ], [ 1, Moves.SING ], [ 1, Moves.CHARM ], [ 1, Moves.POUND ], - [ 1, Moves.SLAM ], - [ 1, Moves.SWIFT ], - [ 1, Moves.ENCORE ], - [ 1, Moves.HELPING_HAND ], - [ 1, Moves.HYPER_VOICE ], - [ 1, Moves.TICKLE ], - [ 1, Moves.ROCK_BLAST ], - [ 1, Moves.LAST_RESORT ], - [ 1, Moves.AFTER_YOU ], - [ 1, Moves.ECHOED_VOICE ], - [ 1, Moves.BABY_DOLL_EYES ], ], [Species.GOTHITA]: [ [ 1, Moves.POUND ], @@ -9965,7 +10023,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 58, Moves.WONDER_ROOM ], ], [Species.REUNICLUS]: [ - [ 0, Moves.HAMMER_ARM ], + [ EVOLVE_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.CONFUSION ], [ 1, Moves.RECOVER ], [ 1, Moves.PROTECT ], @@ -10086,7 +10144,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 42, Moves.SOLAR_BEAM ], ], [Species.SAWSBUCK]: [ - [ 0, Moves.HORN_LEECH ], + [ EVOLVE_MOVE, Moves.HORN_LEECH ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], @@ -10262,7 +10320,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.BUG_BUZZ ], ], [Species.GALVANTULA]: [ - [ 0, Moves.STICKY_WEB ], + [ EVOLVE_MOVE, Moves.STICKY_WEB ], [ 1, Moves.ABSORB ], [ 1, Moves.FURY_CUTTER ], [ 1, Moves.BUG_BITE ], @@ -10294,7 +10352,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.EXPLOSION ], ], [Species.FERROTHORN]: [ - [ 0, Moves.POWER_WHIP ], + [ EVOLVE_MOVE, Moves.POWER_WHIP ], [ 1, Moves.TACKLE ], [ 1, Moves.PIN_MISSILE ], [ 1, Moves.HARDEN ], @@ -10367,7 +10425,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CHARGE_BEAM ], ], [Species.EELEKTRIK]: [ - [ 0, Moves.CRUNCH ], + [ EVOLVE_MOVE, Moves.CRUNCH ], [ 1, Moves.HEADBUTT ], [ 1, Moves.THUNDER_WAVE ], [ 1, Moves.SPARK ], @@ -10565,7 +10623,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 42, Moves.SHEER_COLD ], ], [Species.BEARTIC]: [ - [ 0, Moves.ICICLE_CRASH ], + [ EVOLVE_MOVE, Moves.ICICLE_CRASH ], [ 1, Moves.GROWL ], [ 1, Moves.FURY_SWIPES ], [ 1, Moves.POWDER_SNOW ], @@ -10733,10 +10791,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.DYNAMIC_PUNCH ], ], [Species.GOLURK]: [ + [ RELEARN_MOVE, Moves.MUD_SLAP ], + [ RELEARN_MOVE, Moves.FOCUS_PUNCH ], [ 1, Moves.POUND ], [ 1, Moves.DEFENSE_CURL ], - [ 1, Moves.MUD_SLAP ], - [ 1, Moves.FOCUS_PUNCH ], [ 1, Moves.ASTONISH ], [ 1, Moves.HIGH_HORSEPOWER ], [ 12, Moves.SHADOW_PUNCH ], @@ -10820,7 +10878,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 72, Moves.BRAVE_BIRD ], ], [Species.BRAVIARY]: [ - [ 0, Moves.SUPERPOWER ], + [ EVOLVE_MOVE, Moves.SUPERPOWER ], [ 1, Moves.WING_ATTACK ], [ 1, Moves.LEER ], [ 1, Moves.PECK ], @@ -10853,7 +10911,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 72, Moves.BRAVE_BIRD ], ], [Species.MANDIBUZZ]: [ - [ 0, Moves.BONE_RUSH ], + [ EVOLVE_MOVE, Moves.BONE_RUSH ], [ 1, Moves.GUST ], [ 1, Moves.LEER ], [ 1, Moves.TOXIC ], @@ -10984,7 +11042,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 66, Moves.FLARE_BLITZ ], ], [Species.VOLCARONA]: [ - [ 0, Moves.QUIVER_DANCE ], + [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], [ 1, Moves.GUST ], [ 1, Moves.WHIRLWIND ], [ 1, Moves.TAKE_DOWN ], @@ -11040,6 +11098,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 70, Moves.CLOSE_COMBAT ], ], [Species.VIRIZION]: [ + [ RELEARN_MOVE, Moves.TAKE_DOWN ], [ 1, Moves.LEER ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.HELPING_HAND ], @@ -11231,7 +11290,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.WOOD_HAMMER ], ], [Species.QUILLADIN]: [ - [ 0, Moves.NEEDLE_ARM ], + [ EVOLVE_MOVE, Moves.NEEDLE_ARM ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.VINE_WHIP ], @@ -11248,7 +11307,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 53, Moves.WOOD_HAMMER ], ], [Species.CHESNAUGHT]: [ - [ 0, Moves.SPIKY_SHIELD ], + [ EVOLVE_MOVE, Moves.SPIKY_SHIELD ], [ 1, Moves.VINE_WHIP ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], @@ -11302,7 +11361,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 59, Moves.FIRE_BLAST ], ], [Species.DELPHOX]: [ - [ 0, Moves.MYSTICAL_FIRE ], + [ EVOLVE_MOVE, Moves.MYSTICAL_FIRE ], [ 1, Moves.SCRATCH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.EMBER ], @@ -11356,7 +11415,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.HYDRO_PUMP ], ], [Species.GRENINJA]: [ - [ 0, Moves.WATER_SHURIKEN ], + [ EVOLVE_MOVE, Moves.WATER_SHURIKEN ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -11427,7 +11486,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.FLY ], ], [Species.FLETCHINDER]: [ - [ 0, Moves.FLAME_CHARGE ], + [ EVOLVE_MOVE, Moves.FLAME_CHARGE ], [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], [ 1, Moves.PECK ], @@ -11467,11 +11526,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 15, Moves.BUG_BITE ], ], [Species.SPEWPA]: [ - [ 0, Moves.PROTECT ], + [ EVOLVE_MOVE, Moves.PROTECT ], [ 1, Moves.HARDEN ], ], [Species.VIVILLON]: [ - [ 0, Moves.GUST ], + [ EVOLVE_MOVE, Moves.GUST ], [ 1, Moves.POISON_POWDER ], [ 1, Moves.STUN_SPORE ], [ 1, Moves.SLEEP_POWDER ], @@ -11586,7 +11645,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.LEAF_BLADE ], ], [Species.GOGOAT]: [ - [ 0, Moves.AERIAL_ACE ], + [ EVOLVE_MOVE, Moves.AERIAL_ACE ], [ 1, Moves.VINE_WHIP ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], @@ -11621,7 +11680,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.ENTRAINMENT ], ], [Species.PANGORO]: [ - [ 0, Moves.NIGHT_SLASH ], + [ EVOLVE_MOVE, Moves.NIGHT_SLASH ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.TAUNT ], @@ -11719,7 +11778,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.SACRED_SWORD ], ], [Species.AEGISLASH]: [ - [ 0, Moves.KINGS_SHIELD ], + [ EVOLVE_MOVE, Moves.KINGS_SHIELD ], [ 1, Moves.SWORDS_DANCE ], [ 1, Moves.PURSUIT ], [ 1, Moves.TACKLE ], @@ -12044,7 +12103,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 66, Moves.HYPER_BEAM ], ], [Species.SYLVEON]: [ - [ 0, Moves.SPARKLY_SWIRL ], + [ EVOLVE_MOVE, Moves.SPARKLY_SWIRL ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -12135,7 +12194,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.MUDDY_WATER ], ], [Species.SLIGGOO]: [ - [ 0, Moves.ACID_SPRAY ], + [ EVOLVE_MOVE, Moves.ACID_SPRAY ], [ 1, Moves.TACKLE ], [ 1, Moves.WATER_GUN ], [ 1, Moves.ABSORB ], @@ -12151,7 +12210,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.MUDDY_WATER ], ], [Species.GOODRA]: [ - [ 0, Moves.AQUA_TAIL ], + [ EVOLVE_MOVE, Moves.AQUA_TAIL ], [ 1, Moves.TACKLE ], [ 1, Moves.WATER_GUN ], [ 1, Moves.ABSORB ], @@ -12204,7 +12263,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.FORESTS_CURSE ], ], [Species.TREVENANT]: [ - [ 0, Moves.SHADOW_CLAW ], + [ EVOLVE_MOVE, Moves.SHADOW_CLAW ], [ 1, Moves.TACKLE ], [ 1, Moves.LEECH_SEED ], [ 1, Moves.ASTONISH ], @@ -12274,7 +12333,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 42, Moves.DOUBLE_EDGE ], ], [Species.AVALUGG]: [ - [ 0, Moves.BODY_SLAM ], + [ EVOLVE_MOVE, Moves.BODY_SLAM ], [ 1, Moves.TACKLE ], [ 1, Moves.HARDEN ], [ 1, Moves.POWDER_SNOW ], @@ -12312,7 +12371,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.HURRICANE ], ], [Species.NOIVERN]: [ - [ 0, Moves.DRAGON_PULSE ], + [ EVOLVE_MOVE, Moves.DRAGON_PULSE ], [ 1, Moves.GUST ], [ 1, Moves.TACKLE ], [ 1, Moves.SUPERSONIC ], @@ -12484,7 +12543,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.BRAVE_BIRD ], ], [Species.DECIDUEYE]: [ - [ 0, Moves.SPIRIT_SHACKLE ], + [ EVOLVE_MOVE, Moves.SPIRIT_SHACKLE ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.SPITE ], @@ -12537,14 +12596,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.FLARE_BLITZ ], ], [Species.INCINEROAR]: [ - [ 0, Moves.DARKEST_LARIAT ], - [ 1, Moves.SCRATCH ], - [ 1, Moves.GROWL ], + [ EVOLVE_MOVE, Moves.DARKEST_LARIAT ], + [ RELEARN_MOVE, Moves.SCRATCH ], + [ RELEARN_MOVE, Moves.GROWL ], + [ RELEARN_MOVE, Moves.THROAT_CHOP ], [ 1, Moves.EMBER ], [ 1, Moves.LICK ], [ 1, Moves.CROSS_CHOP ], [ 1, Moves.BULK_UP ], - [ 1, Moves.THROAT_CHOP ], [ 9, Moves.ROAR ], [ 12, Moves.FURY_SWIPES ], [ 15, Moves.BITE ], @@ -12589,7 +12648,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.HYDRO_PUMP ], ], [Species.PRIMARINA]: [ - [ 0, Moves.SPARKLING_ARIA ], + [ EVOLVE_MOVE, Moves.SPARKLING_ARIA ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -12621,11 +12680,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 37, Moves.HYPER_VOICE ], ], [Species.TRUMBEAK]: [ + [ RELEARN_MOVE, Moves.ECHOED_VOICE ], [ 1, Moves.GROWL ], [ 1, Moves.PECK ], [ 1, Moves.ROCK_SMASH ], [ 1, Moves.ROCK_BLAST ], - [ 1, Moves.ECHOED_VOICE ], [ 13, Moves.SUPERSONIC ], [ 16, Moves.PLUCK ], [ 21, Moves.ROOST ], @@ -12637,7 +12696,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.HYPER_VOICE ], ], [Species.TOUCANNON]: [ - [ 0, Moves.BEAK_BLAST ], + [ EVOLVE_MOVE, Moves.BEAK_BLAST ], [ 1, Moves.GROWL ], [ 1, Moves.PECK ], [ 1, Moves.ROCK_SMASH ], @@ -12699,7 +12758,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.DIG ], ], [Species.CHARJABUG]: [ - [ 0, Moves.CHARGE ], + [ EVOLVE_MOVE, Moves.CHARGE ], [ 1, Moves.VISE_GRIP ], [ 1, Moves.STRING_SHOT ], [ 1, Moves.MUD_SLAP ], @@ -12714,17 +12773,17 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 64, Moves.DISCHARGE ], ], [Species.VIKAVOLT]: [ - [ 0, Moves.THUNDERBOLT ], + [ EVOLVE_MOVE, Moves.THUNDERBOLT ], + [ RELEARN_MOVE, Moves.VISE_GRIP ], + [ RELEARN_MOVE, Moves.DIG ], + [ RELEARN_MOVE, Moves.MUD_SLAP ], + [ RELEARN_MOVE, Moves.IRON_DEFENSE ], + [ RELEARN_MOVE, Moves.X_SCISSOR ], + [ RELEARN_MOVE, Moves.BUG_BITE ], [ 1, Moves.CHARGE ], [ 1, Moves.CRUNCH ], [ 1, Moves.DISCHARGE ], [ 1, Moves.STRING_SHOT ], - [ 1, Moves.VISE_GRIP ], - [ 1, Moves.DIG ], - [ 1, Moves.MUD_SLAP ], - [ 1, Moves.IRON_DEFENSE ], - [ 1, Moves.X_SCISSOR ], - [ 1, Moves.BUG_BITE ], [ 15, Moves.BITE ], [ 23, Moves.SPARK ], [ 29, Moves.STICKY_WEB ], @@ -12751,7 +12810,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.CLOSE_COMBAT ], ], [Species.CRABOMINABLE]: [ - [ 0, Moves.ICE_PUNCH ], + [ EVOLVE_MOVE, Moves.ICE_PUNCH ], [ 1, Moves.LEER ], [ 1, Moves.PROTECT ], [ 1, Moves.ROCK_SMASH ], @@ -12798,7 +12857,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 54, Moves.QUIVER_DANCE ], ], [Species.RIBOMBEE]: [ - [ 0, Moves.POLLEN_PUFF ], + [ EVOLVE_MOVE, Moves.POLLEN_PUFF ], [ 1, Moves.ABSORB ], [ 1, Moves.STUN_SPORE ], [ 1, Moves.SWEET_SCENT ], @@ -12828,7 +12887,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.STONE_EDGE ], ], [Species.LYCANROC]: [ - [ 0, Moves.SUCKER_PUNCH ], + [ EVOLVE_MOVE, Moves.SUCKER_PUNCH ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], @@ -12878,7 +12937,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.TOXIC ], ], [Species.TOXAPEX]: [ - [ 0, Moves.BANEFUL_BUNKER ], + [ EVOLVE_MOVE, Moves.BANEFUL_BUNKER ], [ 1, Moves.POISON_STING ], [ 1, Moves.BITE ], [ 1, Moves.PECK ], @@ -12972,7 +13031,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.SOLAR_BEAM ], ], [Species.LURANTIS]: [ - [ 0, Moves.PETAL_BLIZZARD ], + [ EVOLVE_MOVE, Moves.PETAL_BLIZZARD ], [ 1, Moves.GROWTH ], [ 1, Moves.SOLAR_BEAM ], [ 1, Moves.FURY_CUTTER ], @@ -13036,7 +13095,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.ENDEAVOR ], ], [Species.SALAZZLE]: [ - [ 0, Moves.FIRE_LASH ], + [ EVOLVE_MOVE, Moves.FIRE_LASH ], [ 1, Moves.POUND ], [ 1, Moves.SCRATCH ], [ 1, Moves.DISABLE ], @@ -13075,7 +13134,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.SUPERPOWER ], ], [Species.BEWEAR]: [ - [ 0, Moves.BIND ], + [ EVOLVE_MOVE, Moves.BIND ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.PAYBACK ], @@ -13117,7 +13176,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 46, Moves.LEAF_STORM ], ], [Species.TSAREENA]: [ - [ 0, Moves.TROP_KICK ], + [ EVOLVE_MOVE, Moves.TROP_KICK ], [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.SPLASH ], [ 1, Moves.FLAIL ], @@ -13192,7 +13251,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.STRUGGLE_BUG ], ], [Species.GOLISOPOD]: [ - [ 0, Moves.FIRST_IMPRESSION ], + [ EVOLVE_MOVE, Moves.FIRST_IMPRESSION ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.SPITE ], @@ -13278,7 +13337,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.HEAL_BLOCK ], ], [Species.SILVALLY]: [ - [ 0, Moves.MULTI_ATTACK ], + [ EVOLVE_MOVE, Moves.MULTI_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.BITE ], [ 1, Moves.EXPLOSION ], @@ -13449,7 +13508,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.OUTRAGE ], ], [Species.HAKAMO_O]: [ - [ 0, Moves.SKY_UPPERCUT ], + [ EVOLVE_MOVE, Moves.SKY_UPPERCUT ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.PROTECT ], @@ -13467,7 +13526,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.CLOSE_COMBAT ], ], [Species.KOMMO_O]: [ - [ 0, Moves.CLANGING_SCALES ], + [ EVOLVE_MOVE, Moves.CLANGING_SCALES ], + [ RELEARN_MOVE, Moves.BELLY_DRUM ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.PROTECT ], @@ -13570,11 +13630,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.STORED_POWER ], //Custom ], [Species.COSMOEM]: [ - [ 0, Moves.COSMIC_POWER ], + [ EVOLVE_MOVE, Moves.COSMIC_POWER ], [ 1, Moves.TELEPORT ], ], [Species.SOLGALEO]: [ - [ 0, Moves.SUNSTEEL_STRIKE ], + [ EVOLVE_MOVE, Moves.SUNSTEEL_STRIKE ], [ 1, Moves.TELEPORT ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.COSMIC_POWER ], @@ -13594,7 +13654,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 84, Moves.GIGA_IMPACT ], ], [Species.LUNALA]: [ - [ 0, Moves.MOONGEIST_BEAM ], + [ EVOLVE_MOVE, Moves.MOONGEIST_BEAM ], [ 1, Moves.CONFUSION ], [ 1, Moves.HYPNOSIS ], [ 1, Moves.TELEPORT ], @@ -13764,7 +13824,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.MAGEARNA]: [ [ 1, Moves.HELPING_HAND ], [ 1, Moves.GYRO_BALL ], - [ 1, Moves.FAIRY_WIND ], //Custom + [ 1, Moves.DISARMING_VOICE ], //Custom + [ 1, Moves.CRAFTY_SHIELD ], + [ 1, Moves.GEAR_UP ], [ 6, Moves.DEFENSE_CURL ], [ 12, Moves.ROLLOUT ], [ 18, Moves.IRON_DEFENSE ], @@ -13803,11 +13865,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 99, Moves.CLOSE_COMBAT ], ], [Species.POIPOLE]: [ + [ RELEARN_MOVE, Moves.DRAGON_PULSE ], //Custom, made relearn [ 1, Moves.GROWL ], [ 1, Moves.ACID ], [ 1, Moves.PECK ], [ 1, Moves.HELPING_HAND ], - [ 1, Moves.DRAGON_PULSE ], [ 7, Moves.FURY_ATTACK ], [ 14, Moves.FELL_STINGER ], [ 21, Moves.CHARM ], @@ -13819,7 +13881,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 63, Moves.TOXIC ], ], [Species.NAGANADEL]: [ - [ 0, Moves.AIR_CUTTER ], + [ EVOLVE_MOVE, Moves.AIR_CUTTER ], [ 1, Moves.GROWL ], [ 1, Moves.ACID ], [ 1, Moves.PECK ], @@ -13903,7 +13965,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.FLASH_CANNON ], ], [Species.MELMETAL]: [ - [ 0, Moves.THUNDER_PUNCH ], + [ EVOLVE_MOVE, Moves.THUNDER_PUNCH ], [ 1, Moves.HEADBUTT ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.THUNDER_SHOCK ], @@ -13922,7 +13984,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.GROOKEY]: [ [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], - [ 6, Moves.BRANCH_POKE ], + [ 5, Moves.BRANCH_POKE ], //Custom, moved from 6 to 5 [ 8, Moves.TAUNT ], [ 12, Moves.RAZOR_LEAF ], [ 17, Moves.SCREECH ], @@ -13933,7 +13995,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 36, Moves.ENDEAVOR ], ], [Species.THWACKEY]: [ - [ 0, Moves.DOUBLE_HIT ], + [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.TAUNT ], @@ -13947,7 +14009,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.ENDEAVOR ], ], [Species.RILLABOOM]: [ - [ 0, Moves.DRUM_BEATING ], + [ EVOLVE_MOVE, Moves.DRUM_BEATING ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.TAUNT ], @@ -13967,7 +14029,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SCORBUNNY]: [ [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], - [ 6, Moves.EMBER ], + [ 5, Moves.EMBER ], //Custom, moved from 6 to 5 [ 8, Moves.QUICK_ATTACK ], [ 12, Moves.DOUBLE_KICK ], [ 17, Moves.FLAME_CHARGE ], @@ -13991,7 +14053,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.DOUBLE_EDGE ], ], [Species.CINDERACE]: [ - [ 0, Moves.PYRO_BALL ], + [ EVOLVE_MOVE, Moves.PYRO_BALL ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], @@ -14009,7 +14071,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SOBBLE]: [ [ 1, Moves.POUND ], [ 1, Moves.GROWL ], - [ 6, Moves.WATER_GUN ], + [ 5, Moves.WATER_GUN ], //Custom, moved from 6 to 5 [ 8, Moves.BIND ], [ 12, Moves.WATER_PULSE ], [ 17, Moves.TEARFUL_LOOK ], @@ -14033,7 +14095,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.RAIN_DANCE ], ], [Species.INTELEON]: [ - [ 0, Moves.SNIPE_SHOT ], + [ EVOLVE_MOVE, Moves.SNIPE_SHOT ], [ 1, Moves.POUND ], [ 1, Moves.BIND ], [ 1, Moves.GROWL ], @@ -14064,7 +14126,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.BELCH ], ], [Species.GREEDENT]: [ - [ 0, Moves.COVET ], + [ EVOLVE_MOVE, Moves.COVET ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.BITE ], @@ -14106,7 +14168,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 46, Moves.BRAVE_BIRD ], ], [Species.CORVIKNIGHT]: [ - [ 0, Moves.STEEL_WING ], + [ EVOLVE_MOVE, Moves.STEEL_WING ], [ 1, Moves.LEER ], [ 1, Moves.PECK ], [ 1, Moves.SCREECH ], @@ -14126,9 +14188,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.STRUGGLE_BUG ], ], [Species.DOTTLER]: [ - [ 0, Moves.CONFUSION ], - [ 0, Moves.LIGHT_SCREEN ], - [ 0, Moves.REFLECT ], + [ EVOLVE_MOVE, Moves.CONFUSION ], + [ EVOLVE_MOVE, Moves.LIGHT_SCREEN ], + [ EVOLVE_MOVE, Moves.REFLECT ], [ 1, Moves.CONFUSION ], [ 1, Moves.LIGHT_SCREEN ], [ 1, Moves.REFLECT ], @@ -14166,7 +14228,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 36, Moves.FOUL_PLAY ], ], [Species.THIEVUL]: [ - [ 0, Moves.THIEF ], + [ EVOLVE_MOVE, Moves.THIEF ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.BEAT_UP ], @@ -14194,7 +14256,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 36, Moves.LEAF_STORM ], ], [Species.ELDEGOSS]: [ - [ 0, Moves.COTTON_SPORE ], + [ EVOLVE_MOVE, Moves.COTTON_SPORE ], [ 1, Moves.SING ], [ 1, Moves.RAPID_SPIN ], [ 1, Moves.SWEET_SCENT ], @@ -14249,7 +14311,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.BODY_SLAM ], ], [Species.DREDNAW]: [ - [ 0, Moves.ROCK_TOMB ], + [ EVOLVE_MOVE, Moves.ROCK_TOMB ], [ 1, Moves.TACKLE ], [ 1, Moves.BITE ], [ 1, Moves.WATER_GUN ], @@ -14305,7 +14367,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.ROCK_BLAST ], ], [Species.CARKOL]: [ - [ 0, Moves.FLAME_CHARGE ], + [ EVOLVE_MOVE, Moves.FLAME_CHARGE ], [ 1, Moves.TACKLE ], [ 1, Moves.SMOKESCREEN ], [ 1, Moves.RAPID_SPIN ], @@ -14319,7 +14381,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.STONE_EDGE ], ], [Species.COALOSSAL]: [ - [ 0, Moves.TAR_SHOT ], + [ EVOLVE_MOVE, Moves.TAR_SHOT ], [ 1, Moves.TACKLE ], [ 1, Moves.SMOKESCREEN ], [ 1, Moves.RAPID_SPIN ], @@ -14339,7 +14401,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.LEAFAGE ], //Custom ], [Species.FLAPPLE]: [ - [ 0, Moves.WING_ATTACK ], + [ EVOLVE_MOVE, Moves.WING_ATTACK ], [ 1, Moves.GROWTH ], [ 1, Moves.WITHDRAW ], [ 1, Moves.TWISTER ], @@ -14358,7 +14420,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.DRAGON_RUSH ], ], [Species.APPLETUN]: [ - [ 0, Moves.HEADBUTT ], + [ EVOLVE_MOVE, Moves.HEADBUTT ], [ 1, Moves.GROWTH ], [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], @@ -14406,6 +14468,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 51, Moves.SAND_TOMB ], ], [Species.CRAMORANT]: [ + [ RELEARN_MOVE, Moves.BELCH ], [ 1, Moves.PECK ], [ 1, Moves.STOCKPILE ], [ 1, Moves.SPIT_UP ], @@ -14453,7 +14516,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TEARFUL_LOOK ], ], [Species.TOXTRICITY]: [ - [ 0, Moves.SPARK ], + [ EVOLVE_MOVE, Moves.SPARK ], [ 1, Moves.LEER ], [ 1, Moves.GROWL ], [ 1, Moves.ACID ], @@ -14522,7 +14585,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.SUPERPOWER ], ], [Species.GRAPPLOCT]: [ - [ 0, Moves.OCTOLOCK ], + [ EVOLVE_MOVE, Moves.OCTOLOCK ], [ 1, Moves.BIND ], [ 1, Moves.LEER ], [ 1, Moves.OCTAZOOKA ], @@ -14552,7 +14615,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.SHELL_SMASH ], ], [Species.POLTEAGEIST]: [ - [ 0, Moves.TEATIME ], + [ EVOLVE_MOVE, Moves.TEATIME ], [ 1, Moves.MEGA_DRAIN ], [ 1, Moves.WITHDRAW ], [ 1, Moves.ASTONISH ], @@ -14582,7 +14645,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.HEALING_WISH ], ], [Species.HATTREM]: [ - [ 0, Moves.BRUTAL_SWING ], + [ EVOLVE_MOVE, Moves.BRUTAL_SWING ], [ 1, Moves.CONFUSION ], [ 1, Moves.DISARMING_VOICE ], [ 1, Moves.PLAY_NICE ], @@ -14596,7 +14659,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 51, Moves.HEALING_WISH ], ], [Species.HATTERENE]: [ - [ 0, Moves.PSYCHO_CUT ], + [ EVOLVE_MOVE, Moves.PSYCHO_CUT ], [ 1, Moves.CONFUSION ], [ 1, Moves.DISARMING_VOICE ], [ 1, Moves.PLAY_NICE ], @@ -14627,7 +14690,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.FOUL_PLAY ], ], [Species.MORGREM]: [ - [ 0, Moves.FALSE_SURRENDER ], + [ EVOLVE_MOVE, Moves.FALSE_SURRENDER ], [ 1, Moves.BITE ], [ 1, Moves.FAKE_OUT ], [ 1, Moves.FLATTER ], @@ -14643,7 +14706,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.FOUL_PLAY ], ], [Species.GRIMMSNARL]: [ - [ 0, Moves.SPIRIT_BREAK ], + [ EVOLVE_MOVE, Moves.SPIRIT_BREAK ], [ 1, Moves.BITE ], [ 1, Moves.FAKE_OUT ], [ 1, Moves.FLATTER ], @@ -14662,7 +14725,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 64, Moves.HAMMER_ARM ], ], [Species.OBSTAGOON]: [ - [ 0, Moves.OBSTRUCT ], + [ EVOLVE_MOVE, Moves.OBSTRUCT ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.PIN_MISSILE ], @@ -14685,7 +14748,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.DOUBLE_EDGE ], ], [Species.PERRSERKER]: [ - [ 0, Moves.IRON_HEAD ], + [ EVOLVE_MOVE, Moves.IRON_HEAD ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.FAKE_OUT ], @@ -14719,7 +14782,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.MIRROR_COAT ], ], [Species.SIRFETCHD]: [ - [ 0, Moves.IRON_DEFENSE ], + [ EVOLVE_MOVE, Moves.IRON_DEFENSE ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.LEER ], [ 1, Moves.PECK ], @@ -14771,7 +14834,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.TEETER_DANCE ], ], [Species.RUNERIGUS]: [ - [ 0, Moves.SHADOW_CLAW ], + [ EVOLVE_MOVE, Moves.SHADOW_CLAW ], [ 1, Moves.NIGHT_SHADE ], [ 1, Moves.HAZE ], [ 1, Moves.PROTECT ], @@ -14805,7 +14868,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.ENTRAINMENT ], ], [Species.ALCREMIE]: [ - [ 0, Moves.DECORATE ], + [ EVOLVE_MOVE, Moves.DECORATE ], [ 1, Moves.TACKLE ], [ 1, Moves.SWEET_KISS ], [ 1, Moves.SWEET_SCENT ], @@ -14856,7 +14919,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.STRUGGLE_BUG ], ], [Species.FROSMOTH]: [ - [ 0, Moves.ICY_WIND ], + [ EVOLVE_MOVE, Moves.ICY_WIND ], [ 1, Moves.POWDER_SNOW ], [ 1, Moves.ATTRACT ], [ 1, Moves.HELPING_HAND ], @@ -14951,7 +15014,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.SUPERPOWER ], ], [Species.COPPERAJAH]: [ - [ 0, Moves.HEAVY_SLAM ], + [ EVOLVE_MOVE, Moves.HEAVY_SLAM ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.ROLLOUT ], @@ -15048,7 +15111,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.INFESTATION ], ], [Species.DRAKLOAK]: [ - [ 0, Moves.DRAGON_PULSE ], + [ EVOLVE_MOVE, Moves.DRAGON_PULSE ], [ 1, Moves.BITE ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.ASTONISH ], @@ -15067,7 +15130,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 72, Moves.LAST_RESORT ], ], [Species.DRAGAPULT]: [ - [ 0, Moves.DRAGON_DARTS ], + [ EVOLVE_MOVE, Moves.DRAGON_DARTS ], [ 1, Moves.BITE ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.DRAGON_BREATH ], @@ -15152,7 +15215,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.FOCUS_PUNCH ], ], [Species.URSHIFU]: [ - [ 0, Moves.WICKED_BLOW ], + [ EVOLVE_MOVE, Moves.WICKED_BLOW ], [ 1, Moves.LEER ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.ENDURE ], @@ -15272,7 +15335,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 88, Moves.FUTURE_SIGHT ], ], [Species.WYRDEER]: [ - [ 0, Moves.PSYSHIELD_BASH ], + [ EVOLVE_MOVE, Moves.PSYSHIELD_BASH ], [ 1, Moves.TACKLE ], [ 3, Moves.LEER ], [ 7, Moves.ASTONISH ], @@ -15289,7 +15352,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.MEGAHORN ], ], [Species.KLEAVOR]: [ - [ 0, Moves.STONE_AXE ], + [ EVOLVE_MOVE, Moves.STONE_AXE ], [ 1, Moves.LEER ], [ 1, Moves.QUICK_ATTACK ], [ 4, Moves.FURY_CUTTER ], @@ -15305,7 +15368,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.SWORDS_DANCE ], ], [Species.URSALUNA]: [ - [ 0, Moves.HEADLONG_RUSH ], + [ EVOLVE_MOVE, Moves.HEADLONG_RUSH ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.LICK ], @@ -15345,7 +15408,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.HEAD_SMASH ], ], [Species.SNEASLER]: [ - [ 0, Moves.DIRE_CLAW ], + [ EVOLVE_MOVE, Moves.DIRE_CLAW ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.ROCK_SMASH ], @@ -15431,7 +15494,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 46, Moves.LEAF_STORM ], ], [Species.MEOWSCARADA]: [ - [ 0, Moves.FLOWER_TRICK ], + [ EVOLVE_MOVE, Moves.FLOWER_TRICK ], + [ RELEARN_MOVE, Moves.DOUBLE_TEAM ], + [ RELEARN_MOVE, Moves.TRICK ], [ 1, Moves.SCRATCH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.LEAFAGE ], @@ -15481,7 +15546,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 47, Moves.FIRE_BLAST ], ], [Species.SKELEDIRGE]: [ - [ 0, Moves.TORCH_SONG ], + [ EVOLVE_MOVE, Moves.TORCH_SONG ], + [ RELEARN_MOVE, Moves.SING ], + [ RELEARN_MOVE, Moves.YAWN ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -15532,7 +15599,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FEATHER_DANCE ], ], [Species.QUAQUAVAL]: [ - [ 0, Moves.AQUA_STEP ], + [ EVOLVE_MOVE, Moves.AQUA_STEP ], + [ RELEARN_MOVE, Moves.COUNTER ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -15601,7 +15669,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.SKITTER_SMACK ], ], [Species.SPIDOPS]: [ - [ 0, Moves.SILK_TRAP ], + [ EVOLVE_MOVE, Moves.SILK_TRAP ], [ 1, Moves.TACKLE ], [ 1, Moves.STRING_SHOT ], [ 5, Moves.STRUGGLE_BUG ], @@ -15633,7 +15701,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 41, Moves.FIRST_IMPRESSION ], ], [Species.LOKIX]: [ - [ 0, Moves.LUNGE ], + [ EVOLVE_MOVE, Moves.LUNGE ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.LOW_KICK ], @@ -15671,7 +15739,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.WILD_CHARGE ], ], [Species.PAWMO]: [ - [ 0, Moves.ARM_THRUST ], + [ EVOLVE_MOVE, Moves.ARM_THRUST ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 3, Moves.THUNDER_SHOCK ], @@ -15689,7 +15757,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.WILD_CHARGE ], ], [Species.PAWMOT]: [ - [ 0, Moves.REVIVAL_BLESSING ], + [ EVOLVE_MOVE, Moves.REVIVAL_BLESSING ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.WILD_CHARGE ], @@ -15861,7 +15929,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.STONE_EDGE ], ], [Species.NACLSTACK]: [ - [ 0, Moves.SALT_CURE ], + [ EVOLVE_MOVE, Moves.SALT_CURE ], [ 1, Moves.TACKLE ], [ 1, Moves.HARDEN ], [ 5, Moves.ROCK_THROW ], @@ -15878,7 +15946,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 51, Moves.STONE_EDGE ], ], [Species.GARGANACL]: [ - [ 0, Moves.HAMMER_ARM ], + [ EVOLVE_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.TACKLE ], [ 1, Moves.HARDEN ], [ 1, Moves.BLOCK ], @@ -15911,7 +15979,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 32, Moves.LAVA_PLUME ], ], [Species.ARMAROUGE]: [ - [ 0, Moves.PSYSHOCK ], + [ EVOLVE_MOVE, Moves.PSYSHOCK ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], [ 1, Moves.ASTONISH ], @@ -15931,14 +15999,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.ARMOR_CANNON ], ], [Species.CERULEDGE]: [ - [ 0, Moves.SHADOW_CLAW ], + [ EVOLVE_MOVE, Moves.SHADOW_CLAW ], + [ RELEARN_MOVE, Moves.NIGHT_SLASH ], + [ RELEARN_MOVE, Moves.SHADOW_SNEAK ], + [ RELEARN_MOVE, Moves.QUICK_GUARD ], + [ RELEARN_MOVE, Moves.SOLAR_BLADE ], [ 1, Moves.EMBER ], [ 1, Moves.LEER ], [ 1, Moves.ASTONISH ], - [ 1, Moves.NIGHT_SLASH ], - [ 1, Moves.SHADOW_SNEAK ], - [ 1, Moves.QUICK_GUARD ], - [ 1, Moves.SOLAR_BLADE ], [ 8, Moves.CLEAR_SMOG ], [ 12, Moves.FIRE_SPIN ], [ 16, Moves.WILL_O_WISP ], @@ -15998,7 +16066,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.DISCHARGE ], ], [Species.KILOWATTREL]: [ - [ 0, Moves.ELECTRO_BALL ], + [ EVOLVE_MOVE, Moves.ELECTRO_BALL ], [ 1, Moves.GROWL ], [ 1, Moves.PECK ], [ 4, Moves.THUNDER_SHOCK ], @@ -16031,7 +16099,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.DOUBLE_EDGE ], ], [Species.MABOSSTIFF]: [ - [ 0, Moves.COMEUPPANCE ], + [ EVOLVE_MOVE, Moves.COMEUPPANCE ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.SCARY_FACE ], @@ -16067,7 +16135,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.GUNK_SHOT ], ], [Species.GRAFAIAI]: [ - [ 0, Moves.DOODLE ], + [ EVOLVE_MOVE, Moves.DOODLE ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 5, Moves.ACID_SPRAY ], @@ -16187,8 +16255,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.SOLAR_BEAM ], ], [Species.SCOVILLAIN]: [ - [ 0, Moves.FLAMETHROWER ], - [ 0, Moves.SPICY_EXTRACT ], + [ EVOLVE_MOVE, Moves.FLAMETHROWER ], + [ EVOLVE_MOVE, Moves.SPICY_EXTRACT ], [ 1, Moves.LEER ], [ 1, Moves.FIRE_FANG ], [ 1, Moves.LEAFAGE ], @@ -16218,7 +16286,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 35, Moves.LUNGE ], ], [Species.RABSCA]: [ - [ 0, Moves.REVIVAL_BLESSING ], + [ EVOLVE_MOVE, Moves.REVIVAL_BLESSING ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.PSYCH_UP ], [ 1, Moves.TACKLE ], [ 1, Moves.CONFUSION ], [ 1, Moves.DEFENSE_CURL ], @@ -16249,7 +16319,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 34, Moves.UPROAR ], ], [Species.ESPATHRA]: [ - [ 0, Moves.LUMINA_CRASH ], + [ EVOLVE_MOVE, Moves.LUMINA_CRASH ], [ 1, Moves.GROWL ], [ 1, Moves.PECK ], [ 1, Moves.DRILL_PECK ], @@ -16303,7 +16373,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.KNOCK_OFF ], ], [Species.TINKATON]: [ - [ 0, Moves.GIGATON_HAMMER ], + [ EVOLVE_MOVE, Moves.GIGATON_HAMMER ], [ 1, Moves.ASTONISH ], [ 1, Moves.FAIRY_WIND ], [ 5, Moves.BABY_DOLL_EYES ], @@ -16384,7 +16454,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.HYDRO_PUMP ], ], [Species.PALAFIN]: [ - [ 0, Moves.FLIP_TURN ], + [ EVOLVE_MOVE, Moves.FLIP_TURN ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.WATER_GUN ], [ 1, Moves.JET_PUNCH ], @@ -16420,7 +16490,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.GUNK_SHOT ], ], [Species.REVAVROOM]: [ - [ 0, Moves.SHIFT_GEAR ], + [ EVOLVE_MOVE, Moves.SHIFT_GEAR ], [ 1, Moves.LICK ], [ 1, Moves.POISON_GAS ], [ 1, Moves.MAGNET_RISE ], @@ -16487,7 +16557,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 46, Moves.SLUDGE_WAVE ], ], [Species.GLIMMORA]: [ - [ 0, Moves.MORTAL_SPIN ], + [ EVOLVE_MOVE, Moves.MORTAL_SPIN ], [ 1, Moves.ROCK_THROW ], [ 1, Moves.HARDEN ], [ 1, Moves.TOXIC_SPIKES ], @@ -16523,7 +16593,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.DOUBLE_EDGE ], ], [Species.HOUNDSTONE]: [ - [ 0, Moves.LAST_RESPECTS ], + [ EVOLVE_MOVE, Moves.LAST_RESPECTS ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 3, Moves.LICK ], @@ -16640,7 +16710,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.DRAGON_PULSE ], ], [Species.ANNIHILAPE]: [ - [ 0, Moves.SHADOW_PUNCH ], + [ EVOLVE_MOVE, Moves.SHADOW_PUNCH ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.COUNTER ], @@ -16661,7 +16731,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 57, Moves.FINAL_GAMBIT ], ], [Species.CLODSIRE]: [ - [ 0, Moves.AMNESIA ], + [ EVOLVE_MOVE, Moves.AMNESIA ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.POISON_STING ], [ 4, Moves.TOXIC_SPIKES ], @@ -16713,7 +16783,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.BOOMBURST ], ], [Species.KINGAMBIT]: [ - [ 0, Moves.KOWTOW_CLEAVE ], + [ EVOLVE_MOVE, Moves.KOWTOW_CLEAVE ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.FURY_CUTTER ], @@ -16751,6 +16821,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.HEADLONG_RUSH ], ], [Species.SCREAM_TAIL]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.POUND ], [ 1, Moves.SING ], [ 1, Moves.DISABLE ], @@ -16769,6 +16840,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.BOOMBURST ], ], [Species.BRUTE_BONNET]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.ABSORB ], [ 1, Moves.GROWTH ], [ 1, Moves.ASTONISH ], @@ -16786,10 +16858,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.SOLAR_BEAM ], ], [Species.FLUTTER_MANE]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.SPITE ], [ 1, Moves.ASTONISH ], - [ 7, Moves.PSYBEAM ], + [ 1, Moves.PSYBEAM ], //Custom, moved from 7 to 1 [ 14, Moves.MEAN_LOOK ], [ 21, Moves.MEMENTO ], [ 28, Moves.WISH ], @@ -16804,6 +16877,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.PERISH_SONG ], ], [Species.SLITHER_WING]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.GUST ], [ 1, Moves.EMBER ], [ 1, Moves.BUG_BITE ], @@ -16823,6 +16897,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.THRASH ], ], [Species.SANDY_SHOCKS]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.THUNDER_SHOCK ], [ 1, Moves.THUNDER_WAVE ], @@ -16860,6 +16935,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.STEEL_ROLLER ], ], [Species.IRON_BUNDLE]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.PRESENT ], [ 1, Moves.WATER_GUN ], //Custom [ 7, Moves.POWDER_SNOW ], @@ -16877,6 +16953,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.BLIZZARD ], ], [Species.IRON_HANDS]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.FOCUS_ENERGY ], @@ -16896,6 +16973,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.FOCUS_PUNCH ], ], [Species.IRON_JUGULIS]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.TRI_ATTACK ], [ 1, Moves.AIR_CUTTER ], @@ -16915,6 +16993,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.HYPER_BEAM ], ], [Species.IRON_MOTH]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.GUST ], [ 1, Moves.WHIRLWIND ], [ 1, Moves.EMBER ], @@ -16934,6 +17013,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.OVERHEAT ], ], [Species.IRON_THORNS]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.ROCK_THROW ], [ 1, Moves.IRON_DEFENSE ], [ 1, Moves.THUNDER_FANG ], @@ -16982,7 +17062,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.ICICLE_CRASH ], ], [Species.BAXCALIBUR]: [ - [ 0, Moves.GLAIVE_RUSH ], + [ EVOLVE_MOVE, Moves.GLAIVE_RUSH ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.ICE_SHARD ], @@ -17101,6 +17181,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 75, Moves.OVERHEAT ], ], [Species.ROARING_MOON]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], + [ RELEARN_MOVE, Moves.JAW_LOCK ], + [ RELEARN_MOVE, Moves.BREAKING_SWIPE ], + [ RELEARN_MOVE, Moves.SCALE_SHOT ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], [ 1, Moves.FOCUS_ENERGY ], @@ -17120,6 +17204,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.DOUBLE_EDGE ], ], [Species.IRON_VALIANT]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.DISABLE ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.FURY_CUTTER ], @@ -17176,8 +17261,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 98, Moves.HYPER_BEAM ], ], [Species.WALKING_WAKE]: [ - [ -1, Moves.SUNNY_DAY ], - [ -1, Moves.HONE_CLAWS ], + [ RELEARN_MOVE, Moves.SUNNY_DAY ], + [ RELEARN_MOVE, Moves.HONE_CLAWS ], [ 1, Moves.LEER ], [ 1, Moves.ROAR ], [ 1, Moves.TWISTER ], @@ -17195,8 +17280,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 84, Moves.HYDRO_PUMP ], ], [Species.IRON_LEAVES]: [ - [ -1, Moves.ELECTRIC_TERRAIN ], - [ -1, Moves.QUASH ], + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], + [ RELEARN_MOVE, Moves.QUASH ], [ 1, Moves.LEER ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.HELPING_HAND ], @@ -17216,12 +17301,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.SOLAR_BLADE ], ], [Species.DIPPLIN]: [ - [ 0, Moves.DOUBLE_HIT ], + [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], + [ RELEARN_MOVE, Moves.DRAGON_CHEER ], // Custom [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], [ 1, Moves.ASTONISH ], - [ 1, Moves.INFESTATION ], [ 4, Moves.DRAGON_TAIL ], [ 8, Moves.GROWTH ], [ 12, Moves.DRAGON_BREATH ], @@ -17249,7 +17334,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.LEAF_STORM ], ], [Species.SINISTCHA]: [ - [ 0, Moves.MATCHA_GOTCHA ], + [ EVOLVE_MOVE, Moves.MATCHA_GOTCHA ], [ 1, Moves.STUN_SPORE ], [ 1, Moves.WITHDRAW ], [ 1, Moves.ASTONISH ], @@ -17310,6 +17395,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 72, Moves.MOONBLAST ], ], [Species.OGERPON]: [ + [ RELEARN_MOVE, Moves.DOUBLE_KICK ], + [ RELEARN_MOVE, Moves.COUNTER ], + [ RELEARN_MOVE, Moves.RETALIATE ], + [ RELEARN_MOVE, Moves.HORN_LEECH ], [ 1, Moves.VINE_WHIP ], [ 1, Moves.LEECH_SEED ], [ 1, Moves.QUICK_ATTACK ], @@ -17327,7 +17416,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 66, Moves.WOOD_HAMMER ], ], [Species.ARCHALUDON]: [ - [ 0, Moves.ELECTRO_SHOT ], + [ EVOLVE_MOVE, Moves.ELECTRO_SHOT ], [ 1, Moves.LEER ], [ 1, Moves.METAL_CLAW ], [ 6, Moves.ROCK_SMASH ], @@ -17343,14 +17432,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 66, Moves.HYPER_BEAM ], ], [Species.HYDRAPPLE]: [ - [ 0, Moves.FICKLE_BEAM ], + [ EVOLVE_MOVE, Moves.FICKLE_BEAM ], + [ RELEARN_MOVE, Moves.YAWN ], + [ RELEARN_MOVE, Moves.DOUBLE_HIT ], + [ RELEARN_MOVE, Moves.INFESTATION ], [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], [ 1, Moves.ASTONISH ], - [ 1, Moves.YAWN ], - [ 1, Moves.DOUBLE_HIT ], - [ 1, Moves.INFESTATION ], [ 4, Moves.DRAGON_TAIL ], [ 8, Moves.GROWTH ], [ 12, Moves.DRAGON_BREATH ], @@ -17364,9 +17453,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 54, Moves.POWER_WHIP ], ], [Species.GOUGING_FIRE]: [ - [ -1, Moves.DOUBLE_KICK ], - [ -1, Moves.ANCIENT_POWER ], - [ -1, Moves.NOBLE_ROAR ], + [ RELEARN_MOVE, Moves.DOUBLE_KICK ], + [ RELEARN_MOVE, Moves.ANCIENT_POWER ], + [ RELEARN_MOVE, Moves.NOBLE_ROAR ], [ 1, Moves.STOMP ], [ 1, Moves.LEER ], [ 1, Moves.INCINERATE ], @@ -17386,7 +17475,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.RAGING_FURY ], ], [Species.RAGING_BOLT]: [ - [ -1, Moves.ANCIENT_POWER ], + [ RELEARN_MOVE, Moves.ANCIENT_POWER ], [ 1, Moves.TWISTER ], [ 1, Moves.SUNNY_DAY ], [ 1, Moves.SHOCK_WAVE ], @@ -17458,6 +17547,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 90, Moves.GYRO_BALL ], ], [Species.PECHARUNT]: [ + [ RELEARN_MOVE, Moves.DEFENSE_CURL ], + [ RELEARN_MOVE, Moves.ROLLOUT ], + [ RELEARN_MOVE, Moves.MEAN_LOOK ], [ 1, Moves.SMOG ], [ 1, Moves.POISON_GAS ], [ 1, Moves.MEMENTO ], @@ -17488,7 +17580,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 34, Moves.ENDEAVOR ], ], [Species.ALOLA_RATICATE]: [ - [ 0, Moves.SCARY_FACE ], + [ EVOLVE_MOVE, Moves.SCARY_FACE ], [ 1, Moves.SWORDS_DANCE ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], @@ -17505,8 +17597,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.ENDEAVOR ], ], [Species.ALOLA_RAICHU]: [ - [ 0, Moves.PSYCHIC ], - [ 0, Moves.ZIPPY_ZAP ], + [ EVOLVE_MOVE, Moves.PSYCHIC ], + [ EVOLVE_MOVE, Moves.ZIPPY_ZAP ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -17549,26 +17641,26 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.BLIZZARD ], ], [Species.ALOLA_SANDSLASH]: [ - [ 0, Moves.ICICLE_SPEAR ], + [ EVOLVE_MOVE, Moves.ICICLE_SPEAR ], + [ RELEARN_MOVE, Moves.SCRATCH ], + [ RELEARN_MOVE, Moves.MIST ], + [ RELEARN_MOVE, Moves.BLIZZARD ], + [ RELEARN_MOVE, Moves.DEFENSE_CURL ], + [ RELEARN_MOVE, Moves.SWIFT ], + [ RELEARN_MOVE, Moves.FURY_SWIPES ], + [ RELEARN_MOVE, Moves.POWDER_SNOW ], + [ RELEARN_MOVE, Moves.ROLLOUT ], + [ RELEARN_MOVE, Moves.FURY_CUTTER ], + [ RELEARN_MOVE, Moves.RAPID_SPIN ], + [ RELEARN_MOVE, Moves.IRON_DEFENSE ], + [ RELEARN_MOVE, Moves.GYRO_BALL ], + [ RELEARN_MOVE, Moves.METAL_BURST ], + [ RELEARN_MOVE, Moves.IRON_HEAD ], + [ RELEARN_MOVE, Moves.SNOWSCAPE ], [ 1, Moves.ICICLE_CRASH ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.SLASH ], [ 1, Moves.SWORDS_DANCE ], - [ 1, Moves.SCRATCH ], - [ 1, Moves.MIST ], - [ 1, Moves.BLIZZARD ], - [ 1, Moves.DEFENSE_CURL ], - [ 1, Moves.SWIFT ], - [ 1, Moves.FURY_SWIPES ], - [ 1, Moves.POWDER_SNOW ], - [ 1, Moves.ROLLOUT ], - [ 1, Moves.FURY_CUTTER ], - [ 1, Moves.RAPID_SPIN ], - [ 1, Moves.IRON_DEFENSE ], - [ 1, Moves.GYRO_BALL ], - [ 1, Moves.METAL_BURST ], - [ 1, Moves.IRON_HEAD ], - [ 1, Moves.SNOWSCAPE ], [ 1, Moves.ICE_BALL ], ], [Species.ALOLA_VULPIX]: [ @@ -17589,23 +17681,23 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.BLIZZARD ], ], [Species.ALOLA_NINETALES]: [ - [ 0, Moves.DAZZLING_GLEAM ], + [ EVOLVE_MOVE, Moves.DAZZLING_GLEAM ], + [ RELEARN_MOVE, Moves.DISABLE ], + [ RELEARN_MOVE, Moves.MIST ], + [ RELEARN_MOVE, Moves.ICE_BEAM ], + [ RELEARN_MOVE, Moves.AURORA_BEAM ], + [ RELEARN_MOVE, Moves.CONFUSE_RAY ], + [ RELEARN_MOVE, Moves.SPITE ], + [ RELEARN_MOVE, Moves.POWDER_SNOW ], + [ RELEARN_MOVE, Moves.EXTRASENSORY ], + [ RELEARN_MOVE, Moves.NASTY_PLOT ], + [ RELEARN_MOVE, Moves.ICE_SHARD ], + [ RELEARN_MOVE, Moves.FREEZE_DRY ], + [ RELEARN_MOVE, Moves.AURORA_VEIL ], [ 1, Moves.ICY_WIND ], [ 1, Moves.IMPRISON ], [ 1, Moves.BLIZZARD ], [ 1, Moves.TAIL_WHIP ], - [ 1, Moves.DISABLE ], - [ 1, Moves.MIST ], - [ 1, Moves.ICE_BEAM ], - [ 1, Moves.AURORA_BEAM ], - [ 1, Moves.CONFUSE_RAY ], - [ 1, Moves.SPITE ], - [ 1, Moves.POWDER_SNOW ], - [ 1, Moves.EXTRASENSORY ], - [ 1, Moves.NASTY_PLOT ], - [ 1, Moves.ICE_SHARD ], - [ 1, Moves.FREEZE_DRY ], - [ 1, Moves.AURORA_VEIL ], ], [Species.ALOLA_DIGLETT]: [ [ 1, Moves.SAND_ATTACK ], @@ -17623,7 +17715,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.FISSURE ], ], [Species.ALOLA_DUGTRIO]: [ - [ 0, Moves.SAND_TOMB ], + [ EVOLVE_MOVE, Moves.SAND_TOMB ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.GROWL ], [ 1, Moves.TRI_ATTACK ], @@ -17657,7 +17749,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.PLAY_ROUGH ], ], [Species.ALOLA_PERSIAN]: [ - [ 0, Moves.POWER_GEM ], + [ EVOLVE_MOVE, Moves.POWER_GEM ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.FAKE_OUT ], @@ -17765,7 +17857,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 57, Moves.MEMENTO ], ], [Species.ALOLA_EXEGGUTOR]: [ - [ 0, Moves.DRAGON_HAMMER ], + [ EVOLVE_MOVE, Moves.DRAGON_HAMMER ], + [ RELEARN_MOVE, Moves.GROWTH ], [ 1, Moves.BARRAGE ], [ 1, Moves.SEED_BOMB ], [ 1, Moves.PSYSHOCK ], @@ -17784,10 +17877,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HYPNOSIS ], [ 1, Moves.REFLECT ], [ 1, Moves.LEECH_SEED ], - [ 1, Moves.GROWTH ], ], [Species.ALOLA_MAROWAK]: [ - [ 0, Moves.SHADOW_BONE ], + [ EVOLVE_MOVE, Moves.SHADOW_BONE ], [ 1, Moves.BONE_CLUB ], [ 1, Moves.HEADBUTT ], [ 1, Moves.DOUBLE_EDGE ], @@ -17857,7 +17949,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.HEALING_WISH ], ], [Species.GALAR_RAPIDASH]: [ - [ 0, Moves.PSYCHO_CUT ], + [ EVOLVE_MOVE, Moves.PSYCHO_CUT ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], @@ -17894,7 +17986,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.HEAL_PULSE ], ], [Species.GALAR_SLOWBRO]: [ - [ 0, Moves.SHELL_SIDE_ARM ], + [ EVOLVE_MOVE, Moves.SHELL_SIDE_ARM ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.ACID ], @@ -17932,7 +18024,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 65, Moves.BRAVE_BIRD ], ], [Species.GALAR_WEEZING]: [ - [ 0, Moves.DOUBLE_HIT ], + [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], [ 1, Moves.TACKLE ], [ 1, Moves.SMOKESCREEN ], [ 1, Moves.HAZE ], @@ -18037,7 +18129,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 70, Moves.SKY_ATTACK ], ], [Species.GALAR_SLOWKING]: [ - [ 0, Moves.EERIE_SPELL ], + [ EVOLVE_MOVE, Moves.EERIE_SPELL ], + [ RELEARN_MOVE, Moves.FUTURE_SIGHT ], + [ RELEARN_MOVE, Moves.CHILLY_RECEPTION ], + [ RELEARN_MOVE, Moves.TOXIC ], [ 1, Moves.POWER_GEM ], [ 1, Moves.NASTY_PLOT ], [ 1, Moves.SWAGGER ], @@ -18045,9 +18140,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CURSE ], [ 1, Moves.GROWL ], [ 1, Moves.ACID ], - [ 1, Moves.TOXIC ], - [ 1, Moves.FUTURE_SIGHT ], - [ 1, Moves.CHILLY_RECEPTION ], [ 9, Moves.YAWN ], [ 12, Moves.CONFUSION ], [ 15, Moves.DISABLE ], @@ -18094,7 +18186,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 36, Moves.DOUBLE_EDGE ], ], [Species.GALAR_LINOONE]: [ - [ 0, Moves.NIGHT_SLASH ], + [ EVOLVE_MOVE, Moves.NIGHT_SLASH ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.PIN_MISSILE ], @@ -18130,7 +18222,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.SUPERPOWER ], ], [Species.GALAR_DARMANITAN]: [ - [ 0, Moves.ICICLE_CRASH ], + [ EVOLVE_MOVE, Moves.ICICLE_CRASH ], [ 1, Moves.TACKLE ], [ 1, Moves.BITE ], [ 1, Moves.POWDER_SNOW ], @@ -18199,7 +18291,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.FLARE_BLITZ ], ], [Species.HISUI_ARCANINE]: [ - [ 0, Moves.EXTREME_SPEED ], + [ EVOLVE_MOVE, Moves.EXTREME_SPEED ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], @@ -18239,7 +18331,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.GRASSY_TERRAIN ], ], [Species.HISUI_ELECTRODE]: [ - [ 0, Moves.CHLOROBLAST ], + [ EVOLVE_MOVE, Moves.CHLOROBLAST ], [ 1, Moves.TACKLE ], [ 1, Moves.CHARGE ], [ 4, Moves.THUNDER_SHOCK ], @@ -18259,7 +18351,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.GRASSY_TERRAIN ], ], [Species.HISUI_TYPHLOSION]: [ - [ 0, Moves.INFERNAL_PARADE ], + [ EVOLVE_MOVE, Moves.INFERNAL_PARADE ], [ 1, Moves.TACKLE ], [ 1, Moves.DOUBLE_EDGE ], [ 1, Moves.LEER ], @@ -18313,7 +18405,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.CLOSE_COMBAT ], ], [Species.HISUI_SAMUROTT]: [ - [ 0, Moves.CEASELESS_EDGE ], + [ EVOLVE_MOVE, Moves.CEASELESS_EDGE ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.WATER_GUN ], @@ -18333,7 +18425,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 63, Moves.HYDRO_PUMP ], ], [Species.HISUI_LILLIGANT]: [ - [ 0, Moves.VICTORY_DANCE ], + [ EVOLVE_MOVE, Moves.VICTORY_DANCE ], [ 1, Moves.MEGA_KICK ], [ 1, Moves.ABSORB ], [ 1, Moves.MEGA_DRAIN ], @@ -18374,7 +18466,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FOUL_PLAY ], ], [Species.HISUI_ZOROARK]: [ - [ 0, Moves.SHADOW_CLAW ], + [ EVOLVE_MOVE, Moves.SHADOW_CLAW ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.TORMENT ], @@ -18392,7 +18484,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 58, Moves.FOUL_PLAY ], ], [Species.HISUI_BRAVIARY]: [ - [ 0, Moves.ESPER_WING ], + [ EVOLVE_MOVE, Moves.ESPER_WING ], [ 1, Moves.WING_ATTACK ], [ 1, Moves.LEER ], [ 1, Moves.PECK ], @@ -18411,7 +18503,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 80, Moves.HURRICANE ], ], [Species.HISUI_SLIGGOO]: [ - [ 0, Moves.SHELTER ], + [ EVOLVE_MOVE, Moves.SHELTER ], [ 1, Moves.TACKLE ], [ 1, Moves.WATER_GUN ], [ 1, Moves.ABSORB ], @@ -18427,7 +18519,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.MUDDY_WATER ], ], [Species.HISUI_GOODRA]: [ - [ 0, Moves.IRON_TAIL ], + [ EVOLVE_MOVE, Moves.IRON_TAIL ], [ 1, Moves.TACKLE ], [ 1, Moves.WATER_GUN ], [ 1, Moves.ABSORB ], @@ -18448,7 +18540,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 67, Moves.HEAVY_SLAM ], ], [Species.HISUI_AVALUGG]: [ - [ 0, Moves.ROCK_SLIDE ], + [ EVOLVE_MOVE, Moves.ROCK_SLIDE ], [ 1, Moves.TACKLE ], [ 1, Moves.HARDEN ], [ 1, Moves.POWDER_SNOW ], @@ -18470,7 +18562,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 61, Moves.MOUNTAIN_GALE ], ], [Species.HISUI_DECIDUEYE]: [ - [ 0, Moves.TRIPLE_ARROWS ], + [ EVOLVE_MOVE, Moves.TRIPLE_ARROWS ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.U_TURN ], @@ -18518,11 +18610,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.EARTHQUAKE ], ], [Species.BLOODMOON_URSALUNA]: [ + [ RELEARN_MOVE, Moves.MOONLIGHT ], [ 1, Moves.HEADLONG_RUSH ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.LICK ], - [ 1, Moves.MOONLIGHT ], [ 8, Moves.FURY_SWIPES ], [ 13, Moves.PAYBACK ], [ 17, Moves.HARDEN ], @@ -18589,7 +18681,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 3: [ - [ 0, Moves.METEOR_MASH ], + [ 1, Moves.METEOR_MASH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18613,7 +18705,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 4: [ - [ 0, Moves.ICICLE_CRASH ], + [ 1, Moves.ICICLE_CRASH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18637,7 +18729,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 5: [ - [ 0, Moves.DRAINING_KISS ], + [ 1, Moves.DRAINING_KISS ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18661,7 +18753,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 6: [ - [ 0, Moves.ELECTRIC_TERRAIN ], + [ 1, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18685,7 +18777,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 7: [ - [ 0, Moves.FLYING_PRESS ], + [ 1, Moves.FLYING_PRESS ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18708,6 +18800,85 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 44, Moves.THUNDER ], [ 48, Moves.PIKA_PAPOW ], ], + 8: [ + [ 1, Moves.TAIL_WHIP ], + [ 1, Moves.GROWL ], + [ 1, Moves.THUNDER_SHOCK ], + [ 1, Moves.QUICK_ATTACK ], + [ 1, Moves.SWEET_KISS ], + [ 1, Moves.CHARM ], + [ 1, Moves.NASTY_PLOT ], + [ 1, Moves.PLAY_NICE ], + [ 1, Moves.NUZZLE ], + [ 4, Moves.THUNDER_WAVE ], + [ 8, Moves.DOUBLE_TEAM ], + [ 12, Moves.ELECTRO_BALL ], + [ 16, Moves.FEINT ], + [ 20, Moves.ZIPPY_ZAP ], //Custom + [ 24, Moves.AGILITY ], + [ 28, Moves.IRON_TAIL ], + [ 32, Moves.DISCHARGE ], + [ 34, Moves.FLOATY_FALL ], //Custom + [ 36, Moves.THUNDERBOLT ], + [ 40, Moves.LIGHT_SCREEN ], + [ 42, Moves.SPLISHY_SPLASH ], //Custom + [ 44, Moves.THUNDER ], + [ 48, Moves.PIKA_PAPOW ], + ], + }, + [Species.EEVEE]: { //Custom + 1: [ + [ 1, Moves.TACKLE ], + [ 1, Moves.TAIL_WHIP ], + [ 1, Moves.GROWL ], + [ 1, Moves.HELPING_HAND ], + [ 1, Moves.COVET ], + [ 5, Moves.SAND_ATTACK ], + [ 10, Moves.QUICK_ATTACK ], + [ 15, Moves.BABY_DOLL_EYES ], + [ 18, Moves.BOUNCY_BUBBLE ], //Custom + [ 18, Moves.SIZZLY_SLIDE ], //Custom + [ 18, Moves.BUZZY_BUZZ ], //Custom + [ 20, Moves.SWIFT ], + [ 25, Moves.BITE ], + [ 30, Moves.COPYCAT ], + [ 33, Moves.BADDY_BAD ], //Custom + [ 33, Moves.GLITZY_GLOW ], //Custom + [ 35, Moves.BATON_PASS ], + [ 40, Moves.VEEVEE_VOLLEY ], //Custom, replaces Take Down + [ 43, Moves.FREEZY_FROST ], //Custom + [ 43, Moves.SAPPY_SEED ], //Custom + [ 45, Moves.CHARM ], + [ 50, Moves.DOUBLE_EDGE ], + [ 53, Moves.SPARKLY_SWIRL ], //Custom + [ 55, Moves.LAST_RESORT ], + ], + 2: [ + [ 1, Moves.TACKLE ], + [ 1, Moves.TAIL_WHIP ], + [ 1, Moves.GROWL ], + [ 1, Moves.HELPING_HAND ], + [ 1, Moves.COVET ], + [ 5, Moves.SAND_ATTACK ], + [ 10, Moves.QUICK_ATTACK ], + [ 15, Moves.BABY_DOLL_EYES ], + [ 18, Moves.BOUNCY_BUBBLE ], //Custom + [ 18, Moves.SIZZLY_SLIDE ], //Custom + [ 18, Moves.BUZZY_BUZZ ], //Custom + [ 20, Moves.SWIFT ], + [ 25, Moves.BITE ], + [ 30, Moves.COPYCAT ], + [ 33, Moves.BADDY_BAD ], //Custom + [ 33, Moves.GLITZY_GLOW ], //Custom + [ 35, Moves.BATON_PASS ], + [ 40, Moves.VEEVEE_VOLLEY ], //Custom, replaces Take Down + [ 43, Moves.FREEZY_FROST ], //Custom + [ 43, Moves.SAPPY_SEED ], //Custom + [ 45, Moves.CHARM ], + [ 50, Moves.DOUBLE_EDGE ], + [ 53, Moves.SPARKLY_SWIRL ], //Custom + [ 55, Moves.LAST_RESORT ], + ], }, [Species.DEOXYS]: { 1: [ @@ -18766,7 +18937,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.WORMADAM]: { 1: [ - [ 0, Moves.QUIVER_DANCE ], + [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.SUCKER_PUNCH ], @@ -18786,7 +18957,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 50, Moves.BUG_BUZZ ], ], 2: [ - [ 0, Moves.QUIVER_DANCE ], + [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], [ 1, Moves.METAL_BURST ], [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], @@ -18809,7 +18980,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.ROTOM]: { 1: [ - [ 0, Moves.OVERHEAT ], + [ 1, Moves.OVERHEAT ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18825,7 +18996,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 2: [ - [ 0, Moves.HYDRO_PUMP ], + [ 1, Moves.HYDRO_PUMP ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18841,7 +19012,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 3: [ - [ 0, Moves.BLIZZARD ], + [ 1, Moves.BLIZZARD ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18857,7 +19028,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 4: [ - [ 0, Moves.AIR_SLASH ], + [ 1, Moves.AIR_SLASH ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18873,7 +19044,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 5: [ - [ 0, Moves.LEAF_STORM ], + [ 1, Moves.LEAF_STORM ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18987,8 +19158,8 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.GRENINJA]: { 1: [ - [ 0, Moves.WATER_SHURIKEN ], - [ 0, Moves.WATER_SHURIKEN ], + [ EVOLVE_MOVE, Moves.WATER_SHURIKEN ], + [ EVOLVE_MOVE, Moves.WATER_SHURIKEN ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -19010,7 +19181,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.LYCANROC]: { 1: [ - [ 0, Moves.COUNTER ], + [ EVOLVE_MOVE, Moves.COUNTER ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], @@ -19030,7 +19201,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 60, Moves.STONE_EDGE ], ], 2: [ - [ 0, Moves.CRUSH_CLAW ], + [ EVOLVE_MOVE, Moves.CRUSH_CLAW ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], @@ -19057,7 +19228,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.NECROZMA]: { 1: [ - [ 0, Moves.SUNSTEEL_STRIKE ], + [ EVOLVE_MOVE, Moves.SUNSTEEL_STRIKE ], [ 1, Moves.CONFUSION ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.MORNING_SUN ], @@ -19077,7 +19248,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 88, Moves.PRISMATIC_LASER ], ], 2: [ - [ 0, Moves.MOONGEIST_BEAM ], + [ EVOLVE_MOVE, Moves.MOONGEIST_BEAM ], [ 1, Moves.CONFUSION ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.MORNING_SUN ], @@ -19097,8 +19268,8 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 88, Moves.PRISMATIC_LASER ], ], 3: [ - [ 0, Moves.SUNSTEEL_STRIKE ], - [ 0, Moves.MOONGEIST_BEAM ], + [ EVOLVE_MOVE, Moves.SUNSTEEL_STRIKE ], + [ EVOLVE_MOVE, Moves.MOONGEIST_BEAM ], [ 1, Moves.CONFUSION ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.MORNING_SUN ], @@ -19120,7 +19291,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.TOXTRICITY]: { 1: [ - [ 0, Moves.SPARK ], + [ EVOLVE_MOVE, Moves.SPARK ], [ 1, Moves.LEER ], [ 1, Moves.GROWL ], [ 1, Moves.ACID ], @@ -19163,7 +19334,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.ZACIAN]: { 1: [ - [ 0, Moves.BEHEMOTH_BLADE ], + [ EVOLVE_MOVE, Moves.BEHEMOTH_BLADE ], [ 1, Moves.BITE ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.METAL_CLAW ], @@ -19182,7 +19353,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.ZAMAZENTA]: { 1: [ - [ 0, Moves.BEHEMOTH_BASH ], + [ EVOLVE_MOVE, Moves.BEHEMOTH_BASH ], [ 1, Moves.BITE ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.METAL_CLAW ], @@ -19219,7 +19390,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.URSHIFU]: { 1: [ - [ 0, Moves.SURGING_STRIKES ], + [ EVOLVE_MOVE, Moves.SURGING_STRIKES ], [ 1, Moves.LEER ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.ENDURE ], diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 2b488f330c4..09448b332e4 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1,24 +1,21 @@ - -import BattleScene, { AnySound } from "../battle-scene"; -import { Variant, variantColorCache } from "./variant"; -import { variantData } from "./variant"; -import { GrowthRate } from "./exp"; -import { SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; -import { Type } from "./type"; -import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves"; -import { uncatchableSpecies } from "./biomes"; -import * as Utils from "../utils"; -import { StarterMoveset } from "../system/game-data"; -import { speciesEggMoves } from "./egg-moves"; -import { GameMode } from "../game-mode"; -import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; -import { VariantSet } from "./variant"; -import i18next from "i18next"; import { Localizable } from "#app/interfaces/locales"; -import { Stat } from "./pokemon-stat"; import { Abilities } from "#enums/abilities"; import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; +import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; +import i18next from "i18next"; +import BattleScene, { AnySound } from "../battle-scene"; +import { GameMode } from "../game-mode"; +import { StarterMoveset } from "../system/game-data"; +import * as Utils from "../utils"; +import { uncatchableSpecies } from "./biomes"; +import { speciesEggMoves } from "./egg-moves"; +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 "#enums/stat"; +import { Variant, VariantSet, variantColorCache, variantData } from "./variant"; export enum Region { NORMAL, @@ -28,21 +25,29 @@ export enum Region { PALDEA } -export function getPokemonSpecies(species: Species): PokemonSpecies { +/** + * Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given + * @param species The species to fetch + * @returns The associated {@linkcode PokemonSpecies} object + */ +export function getPokemonSpecies(species: Species | Species[] | undefined): PokemonSpecies { + if (!species) { + throw new Error("`species` must not be undefined in `getPokemonSpecies()`"); + } // If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block if (Array.isArray(species)) { // Pick a random species from the list species = species[Math.floor(Math.random() * species.length)]; } if (species >= 2000) { - return allSpecies.find(s => s.speciesId === species); + return allSpecies.find(s => s.speciesId === species)!; // TODO: is this bang correct? } return allSpecies[species - 1]; } export function getPokemonSpeciesForm(species: Species, formIndex: integer): PokemonSpeciesForm { const retSpecies: PokemonSpecies = species >= 2000 - ? allSpecies.find(s => s.speciesId === species) + ? allSpecies.find(s => s.speciesId === species)! // TODO: is the bang correct? : allSpecies[species - 1]; if (formIndex < retSpecies.forms?.length) { return retSpecies.forms[formIndex]; @@ -97,7 +102,7 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): fragB = fragB.slice(1); } else { const newCharMatch = new RegExp(`[^${lastCharA}]`).exec(fragB); - if (newCharMatch?.index > 0) { + if (newCharMatch?.index !== undefined && newCharMatch.index > 0) { fragB = fragB.slice(newCharMatch.index); } } @@ -125,7 +130,7 @@ export abstract class PokemonSpeciesForm { public formIndex: integer; public generation: integer; public type1: Type; - public type2: Type; + public type2: Type | null; public height: number; public weight: number; public ability1: Abilities; @@ -139,7 +144,7 @@ export abstract class PokemonSpeciesForm { public genderDiffs: boolean; public isStarterSelectable: boolean; - constructor(type1: Type, type2: Type, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, + constructor(type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs: boolean, isStarterSelectable: boolean) { this.type1 = type1; @@ -147,7 +152,7 @@ export abstract class PokemonSpeciesForm { this.height = height; this.weight = weight; this.ability1 = ability1; - this.ability2 = ability2; + this.ability2 = ability2 === Abilities.NONE ? ability1 : ability2; this.abilityHidden = abilityHidden; this.baseTotal = baseTotal; this.baseStats = [ baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd ]; @@ -177,12 +182,29 @@ export abstract class PokemonSpeciesForm { return this.type1 === type || (this.type2 !== null && this.type2 === type); } + /** + * Method to get the total number of abilities a Pokemon species has. + * @returns Number of abilities + */ getAbilityCount(): integer { - return this.ability2 ? this.abilityHidden ? 3 : 2 : this.abilityHidden ? 2 : 1; + return this.abilityHidden !== Abilities.NONE ? 3 : 2; } + /** + * Method to get the ability of a Pokemon species. + * @param abilityIndex Which ability to get (should only be 0-2) + * @returns The id of the Ability + */ getAbility(abilityIndex: integer): Abilities { - return !abilityIndex ? this.ability1 : abilityIndex === 1 && this.ability2 ? this.ability2 : this.abilityHidden; + let ret: Abilities; + if (abilityIndex === 0) { + ret = this.ability1; + } else if (abilityIndex === 1) { + ret = this.ability2; + } else { + ret = this.abilityHidden; + } + return ret; } getLevelMoves(): LevelMoves { @@ -250,7 +272,7 @@ export abstract class PokemonSpeciesForm { return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } - getSpriteId(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer, back?: boolean): string { + getSpriteId(female: boolean, formIndex?: integer, shiny?: boolean, variant: integer = 0, back?: boolean): string { if (formIndex === undefined || this instanceof PokemonForm) { formIndex = this.formIndex; } @@ -264,7 +286,7 @@ export abstract class PokemonSpeciesForm { `${back ? "back__" : ""}${baseSpriteKey}`.split("__").map(p => config ? config = config[p] : null); const variantSet = config as VariantSet; - return `${back ? "back__" : ""}${shiny && (!variantSet || (!variant && !variantSet[variant || 0])) ? "shiny__" : ""}${baseSpriteKey}${shiny && variantSet && variantSet[variant || 0] === 2 ? `_${variant + 1}` : ""}`; + return `${back ? "back__" : ""}${shiny && (!variantSet || (!variant && !variantSet[variant || 0])) ? "shiny__" : ""}${baseSpriteKey}${shiny && variantSet && variantSet[variant] === 2 ? `_${variant + 1}` : ""}`; } getSpriteKey(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { @@ -280,11 +302,11 @@ export abstract class PokemonSpeciesForm { * @returns species id if no additional forms, index with formkey if a pokemon with a form */ getVariantDataIndex(formIndex?: integer) { - let formkey = null; - let variantDataIndex: integer|string = this.speciesId; + let formkey: string | null = null; + let variantDataIndex: integer | string = this.speciesId; const species = getPokemonSpecies(this.speciesId); - if (species.forms.length > 0) { - formkey = species.forms[formIndex]?.formKey; + if (species.forms.length > 0 && formIndex !== undefined) { + formkey = species.forms[formIndex]?.getFormSpriteKey(formIndex); if (formkey) { variantDataIndex = `${this.speciesId}-${formkey}`; } @@ -294,7 +316,7 @@ export abstract class PokemonSpeciesForm { getIconAtlasKey(formIndex?: integer, shiny?: boolean, variant?: integer): string { const variantDataIndex = this.getVariantDataIndex(formIndex); - const isVariant = shiny && variantData[variantDataIndex] && variantData[variantDataIndex][variant]; + const isVariant = shiny && variantData[variantDataIndex] && (variant !== undefined && variantData[variantDataIndex][variant]); return `pokemon_icons_${this.generation}${isVariant ? "v" : ""}`; } @@ -307,7 +329,7 @@ export abstract class PokemonSpeciesForm { let ret = this.speciesId.toString(); - const isVariant = shiny && variantData[variantDataIndex] && variantData[variantDataIndex][variant]; + const isVariant = shiny && variantData[variantDataIndex] && (variant !== undefined && variantData[variantDataIndex][variant]); if (shiny && !isVariant) { ret += "s"; @@ -365,7 +387,7 @@ export abstract class PokemonSpeciesForm { let ret = speciesId.toString(); const forms = getPokemonSpecies(speciesId).forms; if (forms.length) { - if (formIndex >= forms.length) { + if (formIndex !== undefined && formIndex >= forms.length) { console.warn(`Attempted accessing form with index ${formIndex} of species ${getPokemonSpecies(speciesId).getName()} with only ${forms.length || 0} forms`); formIndex = Math.min(formIndex, forms.length - 1); } @@ -418,7 +440,7 @@ export abstract class PokemonSpeciesForm { for (const moveId of moveset) { if (speciesEggMoves.hasOwnProperty(rootSpeciesId)) { const eggMoveIndex = speciesEggMoves[rootSpeciesId].findIndex(m => m === moveId); - if (eggMoveIndex > -1 && eggMoves & Math.pow(2, eggMoveIndex)) { + if (eggMoveIndex > -1 && (eggMoves & (1 << eggMoveIndex))) { continue; } } @@ -438,7 +460,7 @@ export abstract class PokemonSpeciesForm { return new Promise(resolve => { const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant); scene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant)); - scene.load.audio(this.getCryKey(formIndex), `audio/cry/${this.getCryKey(formIndex)}.m4a`); + scene.load.audio(`cry/${this.getCryKey(formIndex)}`, `audio/cry/${this.getCryKey(formIndex)}.m4a`); scene.load.once(Phaser.Loader.Events.COMPLETE, () => { const originalWarn = console.warn; // Ignore warnings for missing frames, because there will be a lot @@ -461,7 +483,7 @@ export abstract class PokemonSpeciesForm { let config = variantData; spritePath.split("/").map(p => config ? config = config[p] : null); const variantSet = config as VariantSet; - if (variantSet && variantSet[variant] === 1) { + if (variantSet && (variant !== undefined && variantSet[variant] === 1)) { const populateVariantColors = (key: string): Promise => { return new Promise(resolve => { if (variantColorCache.hasOwnProperty(key)) { @@ -490,11 +512,11 @@ export abstract class PokemonSpeciesForm { cry(scene: BattleScene, soundConfig?: Phaser.Types.Sound.SoundConfig, ignorePlay?: boolean): AnySound { const cryKey = this.getCryKey(this.formIndex); - let cry = scene.sound.get(cryKey) as AnySound; + let cry: AnySound | null = scene.sound.get(cryKey) as AnySound; if (cry?.pendingRemove) { cry = null; } - cry = scene.playSound(cry || cryKey, soundConfig); + cry = scene.playSound(`cry/${(cry ?? cryKey)}`, soundConfig); if (ignorePlay) { cry.stop(); } @@ -515,30 +537,32 @@ export abstract class PokemonSpeciesForm { const frame = sourceFrame; canvas.width = frame.width; canvas.height = frame.height; - context.drawImage(sourceImage, frame.cutX, frame.cutY, frame.width, frame.height, 0, 0, frame.width, frame.height); - const imageData = context.getImageData(frame.cutX, frame.cutY, frame.width, frame.height); - const pixelData = imageData.data; + context?.drawImage(sourceImage, frame.cutX, frame.cutY, frame.width, frame.height, 0, 0, frame.width, frame.height); + const imageData = context?.getImageData(frame.cutX, frame.cutY, frame.width, frame.height); + const pixelData = imageData?.data; + const pixelColors: number[] = []; - for (let i = 0; i < pixelData.length; i += 4) { - if (pixelData[i + 3]) { - const pixel = pixelData.slice(i, i + 4); - const [ r, g, b, a ] = pixel; - if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { - spriteColors.push([ r, g, b, a ]); + if (pixelData?.length !== undefined) { + for (let i = 0; i < pixelData.length; i += 4) { + if (pixelData[i + 3]) { + const pixel = pixelData.slice(i, i + 4); + const [ r, g, b, a ] = pixel; + if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { + spriteColors.push([ r, g, b, a ]); + } } } - } - const pixelColors = []; - for (let i = 0; i < pixelData.length; i += 4) { - const total = pixelData.slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); - if (!total) { - continue; + for (let i = 0; i < pixelData.length; i += 4) { + const total = pixelData.slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); + if (!total) { + continue; + } + pixelColors.push(argbFromRgba({ r: pixelData[i], g: pixelData[i + 1], b: pixelData[i + 2], a: pixelData[i + 3] })); } - pixelColors.push(argbFromRgba({ r: pixelData[i], g: pixelData[i + 1], b: pixelData[i + 2], a: pixelData[i + 3] })); } - let paletteColors: Map; + let paletteColors: Map = new Map(); const originalRandom = Math.random; Math.random = () => Phaser.Math.RND.realInRange(0, 1); @@ -560,15 +584,15 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali public mythical: boolean; public species: string; public growthRate: GrowthRate; - public malePercent: number; + public malePercent: number | null; public genderDiffs: boolean; public canChangeForm: boolean; public forms: PokemonForm[]; constructor(id: Species, generation: integer, subLegendary: boolean, legendary: boolean, mythical: boolean, species: string, - type1: Type, type2: Type, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, + type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, growthRate: GrowthRate, malePercent: number, + catchRate: integer, baseFriendship: integer, baseExp: integer, growthRate: GrowthRate, malePercent: number | null, genderDiffs: boolean, canChangeForm?: boolean, ...forms: PokemonForm[]) { super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp, genderDiffs, false); @@ -597,20 +621,26 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali getName(formIndex?: integer): string { if (formIndex !== undefined && this.forms.length) { const form = this.forms[formIndex]; + let key: string | null; switch (form.formKey) { case SpeciesFormKey.MEGA: case SpeciesFormKey.PRIMAL: case SpeciesFormKey.ETERNAMAX: - return `${form.formName} ${this.name}`; case SpeciesFormKey.MEGA_X: - return `Mega ${this.name} X`; case SpeciesFormKey.MEGA_Y: - return `Mega ${this.name} Y`; + key = form.formKey; + break; default: if (form.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1) { - return `G-Max ${this.name}`; + key = "gigantamax"; + } else { + key = null; } } + + if (key) { + return i18next.t(`battlePokemonForm:${key}`, {pokemonName: this.name}); + } } return this.name; } @@ -623,8 +653,8 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return this.getSpeciesForLevel(level, allowEvolving, false, (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0)); } - getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength): Species { - return this.getSpeciesForLevel(level, allowEvolving, true, strength); + getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength, currentWave: number = 0): Species { + return this.getSpeciesForLevel(level, allowEvolving, true, strength, currentWave); } private getStrengthLevelDiff(strength: PartyMemberStrength): integer { @@ -644,7 +674,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER): Species { + getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER, currentWave: number = 0): Species { const prevolutionLevels = this.getPrevolutionLevels(); if (prevolutionLevels.length) { @@ -692,11 +722,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali evolutionChance = Math.min(minChance + easeInFunc(Math.min(level - ev.level, maxLevelDiff) / maxLevelDiff) * (1 - minChance), 1); } } else { - const preferredMinLevel = Math.max((ev.level - 1) + ev.wildDelay * this.getStrengthLevelDiff(strength), 1); + const preferredMinLevel = Math.max((ev.level - 1) + (ev.wildDelay!) * this.getStrengthLevelDiff(strength), 1); // TODO: is the bang correct? let evolutionLevel = Math.max(ev.level > 1 ? ev.level : Math.floor(preferredMinLevel / 2), 1); if (ev.level <= 1 && pokemonPrevolutions.hasOwnProperty(this.speciesId)) { - const prevolutionLevel = pokemonEvolutions[pokemonPrevolutions[this.speciesId]].find(ev => ev.speciesId === this.speciesId).level; + const prevolutionLevel = pokemonEvolutions[pokemonPrevolutions[this.speciesId]].find(ev => ev.speciesId === this.speciesId)!.level; // TODO: is the bang correct? if (prevolutionLevel > 1) { evolutionLevel = prevolutionLevel; } @@ -705,6 +735,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1); } } + /* (Most) Trainers shouldn't be using unevolved Pokemon by the third gym leader / wave 80. Exceptions to this include Breeders, whose large teams are balanced by the use of weaker pokemon */ + if (currentWave >= 80 && forTrainer && strength > PartyMemberStrength.WEAKER) { + evolutionChance = 1; + noEvolutionChance = 0; + } if (evolutionChance > 0) { if (isRegionalEvolution) { @@ -729,15 +764,15 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali for (const weight of evolutionPool.keys()) { if (randValue < weight) { - return getPokemonSpecies(evolutionPool.get(weight)).getSpeciesForLevel(level, true, forTrainer, strength); + return getPokemonSpecies(evolutionPool.get(weight)).getSpeciesForLevel(level, true, forTrainer, strength, currentWave); } } return this.speciesId; } - getEvolutionLevels() { - const evolutionLevels = []; + getEvolutionLevels(): EvolutionLevel[] { + const evolutionLevels: EvolutionLevel[] = []; //console.log(Species[this.speciesId], pokemonEvolutions[this.speciesId]) @@ -757,8 +792,8 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return evolutionLevels; } - getPrevolutionLevels() { - const prevolutionLevels = []; + getPrevolutionLevels(): EvolutionLevel[] { + const prevolutionLevels: EvolutionLevel[] = []; const allEvolvingPokemon = Object.keys(pokemonEvolutions); for (const p of allEvolvingPokemon) { @@ -779,19 +814,19 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } // This could definitely be written better and more accurate to the getSpeciesForLevel logic, but it is only for generating movesets for evolved Pokemon - getSimulatedEvolutionChain(currentLevel: integer, forTrainer: boolean = false, isBoss: boolean = false, player: boolean = false): [Species, integer][] { - const ret = []; + getSimulatedEvolutionChain(currentLevel: integer, forTrainer: boolean = false, isBoss: boolean = false, player: boolean = false): EvolutionLevel[] { + const ret: EvolutionLevel[] = []; if (pokemonPrevolutions.hasOwnProperty(this.speciesId)) { const prevolutionLevels = this.getPrevolutionLevels().reverse(); const levelDiff = player ? 0 : forTrainer || isBoss ? forTrainer && isBoss ? 2.5 : 5 : 10; ret.push([ prevolutionLevels[0][0], 1 ]); for (let l = 1; l < prevolutionLevels.length; l++) { const evolution = pokemonEvolutions[prevolutionLevels[l - 1][0]].find(e => e.speciesId === prevolutionLevels[l][0]); - ret.push([ prevolutionLevels[l][0], Math.min(Math.max(evolution.level + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max(evolution.wildDelay, 0.5) * 5) - 1, 2, evolution.level), currentLevel - 1) ]); + ret.push([ prevolutionLevels[l][0], Math.min(Math.max((evolution?.level!) + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max((evolution?.wildDelay!), 0.5) * 5) - 1, 2, (evolution?.level!)), currentLevel - 1) ]); // TODO: are those bangs correct? } const lastPrevolutionLevel = ret[prevolutionLevels.length - 1][1]; const evolution = pokemonEvolutions[prevolutionLevels[prevolutionLevels.length - 1][0]].find(e => e.speciesId === this.speciesId); - ret.push([ this.speciesId, Math.min(Math.max(lastPrevolutionLevel + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max(evolution.wildDelay, 0.5) * 5), lastPrevolutionLevel + 1, evolution.level), currentLevel) ]); + ret.push([ this.speciesId, Math.min(Math.max(lastPrevolutionLevel + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max((evolution?.wildDelay!), 0.5) * 5), lastPrevolutionLevel + 1, (evolution?.level!)), currentLevel) ]); // TODO: are those bangs correct? } else { ret.push([ this.speciesId, 1 ]); } @@ -821,11 +856,18 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } hasVariants() { - return variantData.hasOwnProperty(this.speciesId); + let variantDataIndex: string | number = this.speciesId; + if (this.forms.length > 0) { + const formKey = this.forms[this.formIndex]?.formKey; + if (formKey) { + variantDataIndex = `${variantDataIndex}-${formKey}`; + } + } + return variantData.hasOwnProperty(variantDataIndex) || variantData.hasOwnProperty(this.speciesId); } getFormSpriteKey(formIndex?: integer) { - if (this.forms.length && formIndex >= this.forms.length) { + if (this.forms.length && (formIndex !== undefined && formIndex >= this.forms.length)) { console.warn(`Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`); formIndex = Math.min(formIndex, this.forms.length - 1); } @@ -838,14 +880,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali export class PokemonForm extends PokemonSpeciesForm { public formName: string; public formKey: string; - public formSpriteKey: string; + public formSpriteKey: string | null; // This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen private starterSelectableKeys: string[] = ["10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet"]; - constructor(formName: string, formKey: string, type1: Type, type2: Type, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, + constructor(formName: string, formKey: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs?: boolean, formSpriteKey?: string, isStarterSelectable?: boolean, ) { + catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs?: boolean, formSpriteKey?: string | null, isStarterSelectable?: boolean, ) { super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp, !!genderDiffs, (!!isStarterSelectable || !formKey)); this.formName = formName; @@ -881,7 +923,7 @@ export function initSpecies() { new PokemonSpecies(Species.VENUSAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, new PokemonForm("Normal", "", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GRASS, Type.POISON, 2.4, 155.5, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.POISON, 24, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 625, 100, 90, 120, 110, 130, 75, 45, 50, 263, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.POISON, 24, 100, Abilities.CHLOROPHYLL, Abilities.CHLOROPHYLL, Abilities.CHLOROPHYLL, 625, 120, 82, 98, 130, 115, 80, 45, 50, 263, true), ), new PokemonSpecies(Species.CHARMANDER, 1, false, false, false, "Lizard Pokémon", Type.FIRE, null, 0.6, 8.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.CHARMELEON, 1, false, false, false, "Flame Pokémon", Type.FIRE, null, 1.1, 19, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -889,20 +931,20 @@ export function initSpecies() { new PokemonForm("Normal", "", Type.FIRE, Type.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, Type.FIRE, Type.DRAGON, 1.7, 110.5, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, Type.FIRE, Type.FLYING, 1.7, 100.5, Abilities.DROUGHT, Abilities.NONE, Abilities.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.FLYING, 28, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 634, 98, 100, 96, 135, 110, 95, 45, 50, 267), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.FLYING, 28, 90.5, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, 634, 118, 84, 93, 139, 110, 100, 45, 50, 267), ), new PokemonSpecies(Species.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", Type.WATER, null, 0.5, 9, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.WARTORTLE, 1, false, false, false, "Turtle Pokémon", Type.WATER, null, 1, 22.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", Type.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", Type.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, null, 1.6, 101.1, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 25, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 630, 100, 95, 130, 105, 125, 75, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.STEEL, 25, 85.5, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 630, 119, 83, 130, 115, 115, 68, 45, 50, 265), ), new PokemonSpecies(Species.CATERPIE, 1, false, false, false, "Worm Pokémon", Type.BUG, null, 0.3, 2.9, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), 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.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 495, 75, 50, 75, 120, 100, 75, 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), @@ -931,7 +973,7 @@ export function initSpecies() { new PokemonForm("Cute Cosplay", "cute-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom new PokemonForm("Smart Cosplay", "smart-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom new PokemonForm("Tough Cosplay", "tough-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, null, 21, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 420, 45, 60, 65, 100, 75, 75, 190, 50, 112), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, null, 21, 6, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112), //+100 BST from Partner Form ), new PokemonSpecies(Species.RAICHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.8, 30, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.SANDSHREW, 1, false, false, false, "Mouse Pokémon", Type.GROUND, null, 0.6, 12, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 300, 50, 75, 85, 20, 30, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), @@ -961,7 +1003,7 @@ export function initSpecies() { new PokemonSpecies(Species.DUGTRIO, 1, false, false, false, "Mole Pokémon", Type.GROUND, null, 0.7, 33.3, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.MEOWTH, 1, false, false, false, "Scratch Cat Pokémon", Type.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 33, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 390, 50, 85, 60, 70, 50, 75, 255, 50, 58), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 33, 4.2, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58), //+100 BST from Persian ), new PokemonSpecies(Species.PERSIAN, 1, false, false, false, "Classy Cat Pokémon", Type.NORMAL, null, 1, 32, Abilities.LIMBER, Abilities.TECHNICIAN, Abilities.UNNERVE, 440, 65, 70, 60, 65, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PSYDUCK, 1, false, false, false, "Duck Pokémon", Type.WATER, null, 0.8, 19.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 320, 50, 52, 48, 65, 50, 55, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), @@ -983,7 +1025,7 @@ export function initSpecies() { new PokemonSpecies(Species.MACHOKE, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 1.5, 70.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), new PokemonSpecies(Species.MACHAMP, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, new PokemonForm("Normal", "", Type.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIGHTING, null, 25, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 605, 113, 170, 90, 70, 95, 67, 45, 50, 253), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIGHTING, null, 25, 130, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 115, 170, 95, 65, 95, 65, 45, 50, 253), ), new PokemonSpecies(Species.BELLSPROUT, 1, false, false, false, "Flower Pokémon", Type.GRASS, Type.POISON, 0.7, 4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1, 6.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), @@ -1016,7 +1058,7 @@ export function initSpecies() { new PokemonSpecies(Species.GENGAR, 1, false, false, false, "Shadow Pokémon", Type.GHOST, Type.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Normal", "", Type.GHOST, Type.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, false, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GHOST, Type.POISON, 1.4, 40.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.NONE, 600, 60, 65, 80, 170, 95, 130, 45, 50, 250), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GHOST, Type.POISON, 20, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 600, 75, 95, 85, 160, 95, 90, 45, 50, 250), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GHOST, Type.POISON, 20, 40.5, Abilities.CURSED_BODY, Abilities.CURSED_BODY, Abilities.CURSED_BODY, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250), ), new PokemonSpecies(Species.ONIX, 1, false, false, false, "Rock Snake Pokémon", Type.ROCK, Type.GROUND, 8.8, 210, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.WEAK_ARMOR, 385, 35, 45, 160, 30, 45, 70, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DROWZEE, 1, false, false, false, "Hypnosis Pokémon", Type.PSYCHIC, null, 1, 32.4, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), @@ -1024,7 +1066,7 @@ export function initSpecies() { new PokemonSpecies(Species.KRABBY, 1, false, false, false, "River Crab Pokémon", Type.WATER, null, 0.4, 6.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KINGLER, 1, false, false, false, "Pincer Pokémon", Type.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 19, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 575, 70, 165, 145, 60, 70, 65, 60, 50, 166), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 19, 60, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 90, 155, 140, 50, 80, 70, 60, 50, 166), ), new PokemonSpecies(Species.VOLTORB, 1, false, false, false, "Ball Pokémon", Type.ELECTRIC, null, 0.5, 10.4, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.ELECTRODE, 1, false, false, false, "Ball Pokémon", Type.ELECTRIC, null, 1.2, 66.6, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), @@ -1068,13 +1110,13 @@ export function initSpecies() { ), new PokemonSpecies(Species.LAPRAS, 1, false, false, false, "Transport Pokémon", Type.WATER, Type.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, new PokemonForm("Normal", "", Type.WATER, Type.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ICE, 24, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 635, 160, 95, 110, 95, 125, 50, 45, 50, 187), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ICE, 24, 220, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 635, 170, 85, 95, 115, 110, 60, 45, 50, 187), ), new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", Type.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, new PokemonForm("Normal", "", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), new PokemonForm("Partner", "partner", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 18, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 425, 70, 75, 80, 60, 95, 45, 45, 50, 65), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 18, 6.5, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 105, 95, 70, 95, 85, 85, 45, 50, 65), //+100 BST from Partner Form ), new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", Type.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), new PokemonSpecies(Species.JOLTEON, 1, false, false, false, "Lightning Pokémon", Type.ELECTRIC, null, 0.8, 24.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), @@ -1090,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, null, 35, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 640, 200, 130, 85, 75, 130, 20, 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), @@ -1643,7 +1685,7 @@ export function initSpecies() { new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), ), - new PokemonSpecies(Species.VICTINI, 4, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.SERVINE, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.8, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.SERPERIOR, 5, false, false, false, "Regal Pokémon", Type.GRASS, null, 3.3, 63, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -1730,7 +1772,7 @@ export function initSpecies() { new PokemonSpecies(Species.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", Type.POISON, null, 0.6, 31, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.POISON, null, 21, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 574, 100, 125, 102, 80, 102, 65, 60, 50, 166), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.POISON, Type.STEEL, 21, 107.3, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 135, 125, 102, 57, 102, 53, 60, 50, 166), ), new PokemonSpecies(Species.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", Type.DARK, null, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", Type.DARK, null, 1.6, 81.1, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -2204,25 +2246,25 @@ export function initSpecies() { new PokemonSpecies(Species.MELTAN, 7, false, false, true, "Hex Nut Pokémon", Type.STEEL, null, 0.2, 8, Abilities.MAGNET_PULL, Abilities.NONE, Abilities.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", Type.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, null, 25, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 700, 170, 165, 165, 95, 75, 30, 3, 0, 300), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, null, 25, 800, Abilities.IRON_FIST, Abilities.IRON_FIST, Abilities.IRON_FIST, 700, 175, 165, 155, 85, 75, 45, 3, 0, 300), ), new PokemonSpecies(Species.GROOKEY, 8, false, false, false, "Chimp Pokémon", Type.GRASS, null, 0.3, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), 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.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 630, 125, 150, 115, 75, 90, 75, 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.BLAZE, Abilities.NONE, Abilities.LIBERO, 630, 100, 145, 90, 75, 90, 130, 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.TORRENT, Abilities.NONE, Abilities.SNIPER, 630, 90, 100, 90, 150, 90, 110, 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), @@ -2230,13 +2272,13 @@ export function initSpecies() { new PokemonSpecies(Species.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", Type.FLYING, null, 0.8, 16, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", Type.FLYING, Type.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Normal", "", Type.FLYING, Type.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FLYING, Type.STEEL, 14, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 595, 125, 100, 135, 60, 95, 80, 45, 50, 248), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FLYING, Type.STEEL, 14, 75, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 128, 102, 140, 53, 95, 77, 45, 50, 248), ), new PokemonSpecies(Species.BLIPBUG, 8, false, false, false, "Larva Pokémon", Type.BUG, null, 0.4, 8, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DOTTLER, 8, false, false, false, "Radome Pokémon", Type.BUG, Type.PSYCHIC, 0.4, 19.5, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", Type.BUG, Type.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.BUG, Type.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.PSYCHIC, 14, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 605, 75, 50, 140, 90, 150, 100, 45, 50, 253), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.PSYCHIC, 14, 40.8, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 90, 45, 130, 110, 140, 90, 45, 50, 253), ), new PokemonSpecies(Species.NICKIT, 8, false, false, false, "Fox Pokémon", Type.DARK, null, 0.6, 8.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.THIEVUL, 8, false, false, false, "Fox Pokémon", Type.DARK, null, 1.2, 19.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), @@ -2247,7 +2289,7 @@ export function initSpecies() { new PokemonSpecies(Species.CHEWTLE, 8, false, false, false, "Snapping Pokémon", Type.WATER, null, 0.3, 8.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DREDNAW, 8, false, false, false, "Bite Pokémon", Type.WATER, Type.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.WATER, Type.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ROCK, 24, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 585, 115, 150, 110, 55, 85, 70, 75, 50, 170), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ROCK, 24, 115.5, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 145, 115, 43, 83, 84, 75, 50, 170), ), new PokemonSpecies(Species.YAMPER, 8, false, false, false, "Puppy Pokémon", Type.ELECTRIC, null, 0.3, 13.5, Abilities.BALL_FETCH, Abilities.NONE, Abilities.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.BOLTUND, 8, false, false, false, "Dog Pokémon", Type.ELECTRIC, null, 1, 34, Abilities.STRONG_JAW, Abilities.NONE, Abilities.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), @@ -2255,21 +2297,21 @@ export function initSpecies() { new PokemonSpecies(Species.CARKOL, 8, false, false, false, "Coal Pokémon", Type.ROCK, Type.FIRE, 1.1, 78, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.COALOSSAL, 8, false, false, false, "Coal Pokémon", Type.ROCK, Type.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Normal", "", Type.ROCK, Type.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ROCK, Type.FIRE, 42, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 610, 140, 95, 150, 95, 105, 25, 45, 50, 255), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ROCK, Type.FIRE, 42, 310.5, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 95, 130, 95, 110, 40, 45, 50, 255), ), new PokemonSpecies(Species.APPLIN, 8, false, false, false, "Apple Core Pokémon", Type.GRASS, Type.DRAGON, 0.2, 0.5, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), new PokemonSpecies(Species.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", Type.GRASS, Type.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, new PokemonForm("Normal", "", Type.GRASS, Type.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 585, 90, 140, 90, 120, 75, 70, 45, 50, 170), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 1, Abilities.HUSTLE, Abilities.HUSTLE, Abilities.HUSTLE, 585, 90, 130, 100, 85, 80, 100, 45, 50, 170), ), new PokemonSpecies(Species.APPLETUN, 8, false, false, false, "Apple Nectar Pokémon", Type.GRASS, Type.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, new PokemonForm("Normal", "", Type.GRASS, Type.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 585, 140, 95, 95, 135, 95, 25, 45, 50, 170), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 13, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 585, 130, 75, 115, 125, 115, 25, 45, 50, 170), ), new PokemonSpecies(Species.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", Type.GROUND, null, 2.2, 7.6, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", Type.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GROUND, null, 22, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 610, 90, 135, 150, 75, 80, 80, 120, 50, 179), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GROUND, null, 22, 65.5, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 117, 137, 140, 55, 80, 81, 120, 50, 179), ), new PokemonSpecies(Species.CRAMORANT, 8, false, false, false, "Gulp Pokémon", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Normal", "", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, false, null, true), @@ -2282,12 +2324,12 @@ export function initSpecies() { new PokemonSpecies(Species.TOXTRICITY, 8, false, false, false, "Punk Pokémon", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Amped Form", "amped", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "", true), new PokemonForm("Low-Key Form", "lowkey", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.MINUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "lowkey", true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, Type.POISON, 24, 40, Abilities.PUNK_ROCK, Abilities.MINUS, Abilities.TECHNICIAN, 602, 95, 118, 80, 144, 80, 85, 45, 50, 176), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, Type.POISON, 24, 40, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, 602, 114, 98, 82, 144, 82, 82, 45, 50, 176), ), new PokemonSpecies(Species.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", Type.FIRE, Type.BUG, 0.7, 1, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", Type.FIRE, Type.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.FIRE, Type.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.BUG, 75, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 625, 125, 145, 75, 105, 105, 70, 75, 50, 184), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.BUG, 75, 120, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 140, 145, 75, 90, 100, 75, 75, 50, 184), ), new PokemonSpecies(Species.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", Type.FIGHTING, null, 0.6, 4, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), @@ -2303,13 +2345,13 @@ export function initSpecies() { new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", Type.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), new PokemonSpecies(Species.HATTERENE, 8, false, false, false, "Silent Pokémon", Type.PSYCHIC, Type.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, GrowthRate.SLOW, 0, false, true, new PokemonForm("Normal", "", Type.PSYCHIC, Type.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.PSYCHIC, Type.FAIRY, 26, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 610, 70, 105, 110, 160, 125, 40, 45, 50, 255), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.PSYCHIC, Type.FAIRY, 26, 5.1, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 610, 97, 90, 105, 146, 122, 50, 45, 50, 255), ), new PokemonSpecies(Species.IMPIDIMP, 8, false, false, false, "Wily Pokémon", Type.DARK, Type.FAIRY, 0.4, 5.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 265, 45, 45, 30, 55, 40, 50, 255, 50, 53, GrowthRate.MEDIUM_FAST, 100, false), new PokemonSpecies(Species.MORGREM, 8, false, false, false, "Devious Pokémon", Type.DARK, Type.FAIRY, 0.8, 12.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 370, 65, 60, 45, 75, 55, 70, 120, 50, 130, GrowthRate.MEDIUM_FAST, 100, false), new PokemonSpecies(Species.GRIMMSNARL, 8, false, false, false, "Bulk Up Pokémon", Type.DARK, Type.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, GrowthRate.MEDIUM_FAST, 100, false, true, new PokemonForm("Normal", "", Type.DARK, Type.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.DARK, Type.FAIRY, 32, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 610, 120, 155, 75, 110, 85, 65, 45, 50, 255), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.DARK, Type.FAIRY, 32, 61, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 610, 135, 138, 77, 110, 85, 65, 45, 50, 255), ), new PokemonSpecies(Species.OBSTAGOON, 8, false, false, false, "Blocking Pokémon", Type.DARK, Type.NORMAL, 1.6, 46, Abilities.RECKLESS, Abilities.GUTS, Abilities.DEFIANT, 520, 93, 90, 101, 60, 81, 95, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PERRSERKER, 8, false, false, false, "Viking Pokémon", Type.STEEL, null, 0.8, 28, Abilities.BATTLE_ARMOR, Abilities.TOUGH_CLAWS, Abilities.STEELY_SPIRIT, 440, 70, 110, 100, 50, 60, 50, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), @@ -2328,7 +2370,7 @@ export function initSpecies() { new PokemonForm("Ruby Swirl", "ruby-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), new PokemonForm("Caramel Swirl", "caramel-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), new PokemonForm("Rainbow Swirl", "rainbow-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FAIRY, null, 30, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 595, 85, 70, 85, 140, 150, 65, 100, 50, 173), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FAIRY, null, 30, 0.5, Abilities.MISTY_SURGE, Abilities.MISTY_SURGE, Abilities.MISTY_SURGE, 595, 135, 60, 75, 130, 131, 64, 100, 50, 173), ), new PokemonSpecies(Species.FALINKS, 8, false, false, false, "Formation Pokémon", Type.FIGHTING, null, 3, 62, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.PINCURCHIN, 8, false, false, false, "Sea Urchin Pokémon", Type.ELECTRIC, null, 0.3, 1, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.ELECTRIC_SURGE, 435, 48, 101, 95, 91, 85, 15, 75, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), @@ -2350,7 +2392,7 @@ export function initSpecies() { new PokemonSpecies(Species.CUFANT, 8, false, false, false, "Copperderm Pokémon", Type.STEEL, null, 1.2, 100, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", Type.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, null, 23, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 600, 150, 160, 80, 90, 80, 40, 90, 50, 175), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.GROUND, 23, 650, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, 600, 167, 155, 89, 80, 89, 20, 90, 50, 175), ), new PokemonSpecies(Species.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", Type.ELECTRIC, Type.DRAGON, 1.8, 190, Abilities.VOLT_ABSORB, Abilities.HUSTLE, Abilities.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", Type.ELECTRIC, Type.ICE, 2.3, 150, Abilities.VOLT_ABSORB, Abilities.STATIC, Abilities.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), @@ -2358,7 +2400,7 @@ export function initSpecies() { new PokemonSpecies(Species.ARCTOVISH, 8, false, false, false, "Fossil Pokémon", Type.WATER, Type.ICE, 2, 175, Abilities.WATER_ABSORB, Abilities.ICE_BODY, Abilities.SLUSH_RUSH, 505, 90, 90, 100, 80, 90, 55, 45, 50, 177, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.DURALUDON, 8, false, false, false, "Alloy Pokémon", Type.STEEL, Type.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.STEEL, Type.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.DRAGON, 43, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 635, 90, 110, 145, 140, 60, 90, 45, 50, 187), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.DRAGON, 43, 40, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 635, 100, 105, 119, 166, 57, 88, 45, 50, 187), ), new PokemonSpecies(Species.DREEPY, 8, false, false, false, "Lingering Pokémon", Type.DRAGON, Type.GHOST, 0.5, 2, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 270, 28, 60, 30, 40, 30, 82, 45, 50, 54, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", Type.DRAGON, Type.GHOST, 1.4, 11, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), @@ -2379,8 +2421,8 @@ export function initSpecies() { new PokemonSpecies(Species.URSHIFU, 8, true, false, false, "Wushu Pokémon", Type.FIGHTING, Type.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, new PokemonForm("Single Strike Style", "single-strike", Type.FIGHTING, Type.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), new PokemonForm("Rapid Strike Style", "rapid-strike", Type.FIGHTING, Type.WATER, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), - new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, Type.FIGHTING, Type.DARK, 29, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 160, 120, 75, 70, 100, 3, 50, 275), - new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, Type.FIGHTING, Type.WATER, 26, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 160, 120, 75, 70, 100, 3, 50, 275), + new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, Type.FIGHTING, Type.DARK, 29, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), + new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, Type.FIGHTING, Type.WATER, 26, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), ), new PokemonSpecies(Species.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, new PokemonForm("Normal", "", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), @@ -2431,8 +2473,8 @@ export function initSpecies() { new PokemonSpecies(Species.PAWMOT, 9, false, false, false, "Hands-On Pokémon", Type.ELECTRIC, Type.FIGHTING, 0.9, 41, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 490, 70, 115, 70, 70, 60, 105, 45, 50, 245, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.TANDEMAUS, 9, false, false, false, "Couple Pokémon", Type.NORMAL, null, 0.3, 1.8, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.OWN_TEMPO, 305, 50, 50, 45, 40, 45, 75, 150, 50, 61, GrowthRate.FAST, null, false), new PokemonSpecies(Species.MAUSHOLD, 9, false, false, false, "Family Pokémon", Type.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165, GrowthRate.FAST, null, false, false, - new PokemonForm("Family of Four", "four", Type.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), - new PokemonForm("Family of Three", "three", Type.NORMAL, null, 0.3, 2.8, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), + new PokemonForm("Family of Four", "four", Type.NORMAL, null, 0.3, 2.8, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), + new PokemonForm("Family of Three", "three", Type.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), ), new PokemonSpecies(Species.FIDOUGH, 9, false, false, false, "Puppy Pokémon", Type.FAIRY, null, 0.3, 10.9, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.KLUTZ, 312, 37, 55, 70, 30, 55, 65, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.DACHSBUN, 9, false, false, false, "Dog Pokémon", Type.FAIRY, null, 0.5, 14.9, Abilities.WELL_BAKED_BODY, Abilities.NONE, Abilities.AROMA_VEIL, 477, 57, 80, 115, 50, 80, 95, 90, 50, 167, GrowthRate.MEDIUM_SLOW, 50, false), @@ -2549,7 +2591,7 @@ export function initSpecies() { ), new PokemonSpecies(Species.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", Type.WATER, Type.DRAGON, 3.5, 280, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 99, 83, 91, 125, 83, 109, 5, 0, 295, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", Type.GRASS, Type.PSYCHIC, 1.5, 125, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 130, 88, 70, 108, 104, 5, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", Type.GRASS, Type.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, null, false), + new PokemonSpecies(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", Type.GRASS, Type.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, 50, false), new PokemonSpecies(Species.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.SLOW, null, false, false, new PokemonForm("Counterfeit Form", "counterfeit", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), new PokemonForm("Artisan Form", "artisan", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), @@ -2654,71 +2696,71 @@ export const speciesStarters = { [Species.BULBASAUR]: 3, [Species.CHARMANDER]: 3, [Species.SQUIRTLE]: 3, - [Species.CATERPIE]: 1, + [Species.CATERPIE]: 2, [Species.WEEDLE]: 1, - [Species.PIDGEY]: 2, + [Species.PIDGEY]: 1, [Species.RATTATA]: 1, - [Species.SPEAROW]: 2, + [Species.SPEAROW]: 1, [Species.EKANS]: 2, - [Species.PIKACHU]: 4, + [Species.PIKACHU]: 3, [Species.SANDSHREW]: 2, [Species.NIDORAN_F]: 3, [Species.NIDORAN_M]: 3, - [Species.CLEFAIRY]: 4, + [Species.CLEFAIRY]: 3, [Species.VULPIX]: 3, - [Species.JIGGLYPUFF]: 4, - [Species.ZUBAT]: 2, - [Species.ODDISH]: 2, - [Species.PARAS]: 1, + [Species.JIGGLYPUFF]: 2, + [Species.ZUBAT]: 3, + [Species.ODDISH]: 3, + [Species.PARAS]: 2, [Species.VENONAT]: 2, - [Species.DIGLETT]: 3, - [Species.MEOWTH]: 4, + [Species.DIGLETT]: 2, + [Species.MEOWTH]: 3, [Species.PSYDUCK]: 2, [Species.MANKEY]: 4, [Species.GROWLITHE]: 4, - [Species.POLIWAG]: 3, - [Species.ABRA]: 3, + [Species.POLIWAG]: 2, + [Species.ABRA]: 4, [Species.MACHOP]: 3, - [Species.BELLSPROUT]: 3, + [Species.BELLSPROUT]: 2, [Species.TENTACOOL]: 3, [Species.GEODUDE]: 3, - [Species.PONYTA]: 3, + [Species.PONYTA]: 2, [Species.SLOWPOKE]: 3, - [Species.MAGNEMITE]: 3, - [Species.FARFETCHD]: 4, - [Species.DODUO]: 4, - [Species.SEEL]: 3, - [Species.GRIMER]: 3, - [Species.SHELLDER]: 4, - [Species.GASTLY]: 3, - [Species.ONIX]: 4, - [Species.DROWZEE]: 3, - [Species.KRABBY]: 2, + [Species.MAGNEMITE]: 4, + [Species.FARFETCHD]: 2, + [Species.DODUO]: 3, + [Species.SEEL]: 1, + [Species.GRIMER]: 2, + [Species.SHELLDER]: 5, + [Species.GASTLY]: 4, + [Species.ONIX]: 3, + [Species.DROWZEE]: 2, + [Species.KRABBY]: 3, [Species.VOLTORB]: 2, - [Species.EXEGGCUTE]: 4, + [Species.EXEGGCUTE]: 3, [Species.CUBONE]: 3, - [Species.HITMONLEE]: 5, - [Species.HITMONCHAN]: 5, - [Species.LICKITUNG]: 5, - [Species.KOFFING]: 3, + [Species.HITMONLEE]: 4, + [Species.HITMONCHAN]: 4, + [Species.LICKITUNG]: 3, + [Species.KOFFING]: 2, [Species.RHYHORN]: 3, - [Species.CHANSEY]: 5, + [Species.CHANSEY]: 3, [Species.TANGELA]: 3, - [Species.KANGASKHAN]: 5, - [Species.HORSEA]: 4, - [Species.GOLDEEN]: 3, - [Species.STARYU]: 4, - [Species.MR_MIME]: 4, + [Species.KANGASKHAN]: 4, + [Species.HORSEA]: 3, + [Species.GOLDEEN]: 2, + [Species.STARYU]: 3, + [Species.MR_MIME]: 3, [Species.SCYTHER]: 5, [Species.JYNX]: 4, - [Species.ELECTABUZZ]: 5, - [Species.MAGMAR]: 5, + [Species.ELECTABUZZ]: 4, + [Species.MAGMAR]: 4, [Species.PINSIR]: 4, - [Species.TAUROS]: 5, - [Species.MAGIKARP]: 3, - [Species.LAPRAS]: 5, + [Species.TAUROS]: 4, + [Species.MAGIKARP]: 4, + [Species.LAPRAS]: 4, [Species.DITTO]: 2, - [Species.EEVEE]: 4, + [Species.EEVEE]: 3, [Species.PORYGON]: 4, [Species.OMANYTE]: 3, [Species.KABUTO]: 3, @@ -2731,57 +2773,57 @@ export const speciesStarters = { [Species.MEWTWO]: 8, [Species.MEW]: 6, - [Species.CHIKORITA]: 3, + [Species.CHIKORITA]: 2, [Species.CYNDAQUIL]: 3, [Species.TOTODILE]: 3, [Species.SENTRET]: 1, - [Species.HOOTHOOT]: 1, + [Species.HOOTHOOT]: 2, [Species.LEDYBA]: 1, [Species.SPINARAK]: 1, - [Species.CHINCHOU]: 3, - [Species.PICHU]: 3, - [Species.CLEFFA]: 3, - [Species.IGGLYBUFF]: 3, + [Species.CHINCHOU]: 2, + [Species.PICHU]: 2, + [Species.CLEFFA]: 2, + [Species.IGGLYBUFF]: 1, [Species.TOGEPI]: 3, [Species.NATU]: 2, - [Species.MAREEP]: 3, + [Species.MAREEP]: 2, [Species.MARILL]: 4, - [Species.SUDOWOODO]: 5, - [Species.HOPPIP]: 1, - [Species.AIPOM]: 3, + [Species.SUDOWOODO]: 3, + [Species.HOPPIP]: 2, + [Species.AIPOM]: 2, [Species.SUNKERN]: 1, [Species.YANMA]: 3, [Species.WOOPER]: 2, - [Species.MURKROW]: 4, - [Species.MISDREAVUS]: 3, + [Species.MURKROW]: 3, + [Species.MISDREAVUS]: 2, [Species.UNOWN]: 1, - [Species.WOBBUFFET]: 4, - [Species.GIRAFARIG]: 4, + [Species.WOBBUFFET]: 2, + [Species.GIRAFARIG]: 3, [Species.PINECO]: 2, - [Species.DUNSPARCE]: 4, - [Species.GLIGAR]: 4, - [Species.SNUBBULL]: 3, + [Species.DUNSPARCE]: 3, + [Species.GLIGAR]: 3, + [Species.SNUBBULL]: 2, [Species.QWILFISH]: 3, - [Species.SHUCKLE]: 4, + [Species.SHUCKLE]: 3, [Species.HERACROSS]: 5, [Species.SNEASEL]: 4, [Species.TEDDIURSA]: 4, [Species.SLUGMA]: 2, [Species.SWINUB]: 3, - [Species.CORSOLA]: 3, - [Species.REMORAID]: 3, - [Species.DELIBIRD]: 3, - [Species.MANTINE]: 4, - [Species.SKARMORY]: 5, - [Species.HOUNDOUR]: 4, + [Species.CORSOLA]: 2, + [Species.REMORAID]: 2, + [Species.DELIBIRD]: 2, + [Species.MANTINE]: 3, + [Species.SKARMORY]: 4, + [Species.HOUNDOUR]: 3, [Species.PHANPY]: 3, - [Species.STANTLER]: 4, - [Species.SMEARGLE]: 3, - [Species.TYROGUE]: 4, + [Species.STANTLER]: 3, + [Species.SMEARGLE]: 1, + [Species.TYROGUE]: 3, [Species.SMOOCHUM]: 3, - [Species.ELEKID]: 4, - [Species.MAGBY]: 4, - [Species.MILTANK]: 5, + [Species.ELEKID]: 3, + [Species.MAGBY]: 3, + [Species.MILTANK]: 4, [Species.RAIKOU]: 6, [Species.ENTEI]: 6, [Species.SUICUNE]: 6, @@ -2791,68 +2833,68 @@ export const speciesStarters = { [Species.CELEBI]: 6, [Species.TREECKO]: 3, - [Species.TORCHIC]: 3, + [Species.TORCHIC]: 4, [Species.MUDKIP]: 3, [Species.POOCHYENA]: 2, [Species.ZIGZAGOON]: 2, [Species.WURMPLE]: 1, [Species.LOTAD]: 3, - [Species.SEEDOT]: 3, + [Species.SEEDOT]: 2, [Species.TAILLOW]: 3, - [Species.WINGULL]: 3, + [Species.WINGULL]: 2, [Species.RALTS]: 3, [Species.SURSKIT]: 2, [Species.SHROOMISH]: 3, [Species.SLAKOTH]: 4, [Species.NINCADA]: 4, - [Species.WHISMUR]: 3, + [Species.WHISMUR]: 2, [Species.MAKUHITA]: 3, - [Species.AZURILL]: 3, - [Species.NOSEPASS]: 3, - [Species.SKITTY]: 3, - [Species.SABLEYE]: 3, - [Species.MAWILE]: 5, + [Species.AZURILL]: 4, + [Species.NOSEPASS]: 2, + [Species.SKITTY]: 1, + [Species.SABLEYE]: 2, + [Species.MAWILE]: 3, [Species.ARON]: 3, - [Species.MEDITITE]: 4, - [Species.ELECTRIKE]: 3, + [Species.MEDITITE]: 3, + [Species.ELECTRIKE]: 2, [Species.PLUSLE]: 2, [Species.MINUN]: 2, [Species.VOLBEAT]: 2, [Species.ILLUMISE]: 2, - [Species.ROSELIA]: 4, - [Species.GULPIN]: 3, + [Species.ROSELIA]: 3, + [Species.GULPIN]: 1, [Species.CARVANHA]: 3, - [Species.WAILMER]: 3, - [Species.NUMEL]: 3, - [Species.TORKOAL]: 4, - [Species.SPOINK]: 3, - [Species.SPINDA]: 2, - [Species.TRAPINCH]: 4, - [Species.CACNEA]: 3, - [Species.SWABLU]: 3, - [Species.ZANGOOSE]: 5, - [Species.SEVIPER]: 4, - [Species.LUNATONE]: 4, - [Species.SOLROCK]: 4, - [Species.BARBOACH]: 3, + [Species.WAILMER]: 2, + [Species.NUMEL]: 2, + [Species.TORKOAL]: 3, + [Species.SPOINK]: 2, + [Species.SPINDA]: 1, + [Species.TRAPINCH]: 3, + [Species.CACNEA]: 2, + [Species.SWABLU]: 2, + [Species.ZANGOOSE]: 4, + [Species.SEVIPER]: 3, + [Species.LUNATONE]: 3, + [Species.SOLROCK]: 3, + [Species.BARBOACH]: 2, [Species.CORPHISH]: 3, - [Species.BALTOY]: 3, + [Species.BALTOY]: 2, [Species.LILEEP]: 3, [Species.ANORITH]: 3, [Species.FEEBAS]: 4, - [Species.CASTFORM]: 2, - [Species.KECLEON]: 4, - [Species.SHUPPET]: 3, + [Species.CASTFORM]: 1, + [Species.KECLEON]: 2, + [Species.SHUPPET]: 2, [Species.DUSKULL]: 3, - [Species.TROPIUS]: 5, - [Species.CHIMECHO]: 4, - [Species.ABSOL]: 5, - [Species.WYNAUT]: 3, - [Species.SNORUNT]: 3, - [Species.SPHEAL]: 3, + [Species.TROPIUS]: 3, + [Species.CHIMECHO]: 3, + [Species.ABSOL]: 4, + [Species.WYNAUT]: 2, + [Species.SNORUNT]: 2, + [Species.SPHEAL]: 2, [Species.CLAMPERL]: 3, - [Species.RELICANTH]: 4, - [Species.LUVDISC]: 2, + [Species.RELICANTH]: 3, + [Species.LUVDISC]: 1, [Species.BAGON]: 4, [Species.BELDUM]: 4, [Species.REGIROCK]: 6, @@ -2872,37 +2914,37 @@ export const speciesStarters = { [Species.STARLY]: 3, [Species.BIDOOF]: 2, [Species.KRICKETOT]: 1, - [Species.SHINX]: 3, + [Species.SHINX]: 2, [Species.BUDEW]: 3, [Species.CRANIDOS]: 3, [Species.SHIELDON]: 3, - [Species.BURMY]: 1, + [Species.BURMY]: 2, [Species.COMBEE]: 2, - [Species.PACHIRISU]: 3, - [Species.BUIZEL]: 3, - [Species.CHERUBI]: 3, + [Species.PACHIRISU]: 2, + [Species.BUIZEL]: 2, + [Species.CHERUBI]: 1, [Species.SHELLOS]: 3, - [Species.DRIFLOON]: 3, - [Species.BUNEARY]: 3, - [Species.GLAMEOW]: 3, - [Species.CHINGLING]: 3, - [Species.STUNKY]: 3, + [Species.DRIFLOON]: 2, + [Species.BUNEARY]: 2, + [Species.GLAMEOW]: 2, + [Species.CHINGLING]: 2, + [Species.STUNKY]: 2, [Species.BRONZOR]: 3, - [Species.BONSLY]: 4, - [Species.MIME_JR]: 3, - [Species.HAPPINY]: 4, - [Species.CHATOT]: 4, - [Species.SPIRITOMB]: 5, + [Species.BONSLY]: 2, + [Species.MIME_JR]: 2, + [Species.HAPPINY]: 2, + [Species.CHATOT]: 2, + [Species.SPIRITOMB]: 4, [Species.GIBLE]: 4, [Species.MUNCHLAX]: 4, - [Species.RIOLU]: 4, + [Species.RIOLU]: 3, [Species.HIPPOPOTAS]: 3, [Species.SKORUPI]: 3, - [Species.CROAGUNK]: 3, - [Species.CARNIVINE]: 4, - [Species.FINNEON]: 3, - [Species.MANTYKE]: 3, - [Species.SNOVER]: 3, + [Species.CROAGUNK]: 2, + [Species.CARNIVINE]: 2, + [Species.FINNEON]: 1, + [Species.MANTYKE]: 2, + [Species.SNOVER]: 2, [Species.ROTOM]: 5, [Species.UXIE]: 6, [Species.MESPRIT]: 6, @@ -2918,75 +2960,75 @@ export const speciesStarters = { [Species.DARKRAI]: 6, [Species.SHAYMIN]: 6, [Species.ARCEUS]: 9, - [Species.VICTINI]: 7, + [Species.VICTINI]: 7, [Species.SNIVY]: 3, [Species.TEPIG]: 3, [Species.OSHAWOTT]: 3, - [Species.PATRAT]: 2, + [Species.PATRAT]: 1, [Species.LILLIPUP]: 3, - [Species.PURRLOIN]: 3, - [Species.PANSAGE]: 3, - [Species.PANSEAR]: 3, - [Species.PANPOUR]: 3, - [Species.MUNNA]: 3, - [Species.PIDOVE]: 2, - [Species.BLITZLE]: 3, + [Species.PURRLOIN]: 2, + [Species.PANSAGE]: 2, + [Species.PANSEAR]: 2, + [Species.PANPOUR]: 2, + [Species.MUNNA]: 2, + [Species.PIDOVE]: 1, + [Species.BLITZLE]: 2, [Species.ROGGENROLA]: 3, [Species.WOOBAT]: 3, [Species.DRILBUR]: 4, - [Species.AUDINO]: 4, - [Species.TIMBURR]: 3, + [Species.AUDINO]: 3, + [Species.TIMBURR]: 4, [Species.TYMPOLE]: 3, - [Species.THROH]: 5, - [Species.SAWK]: 5, - [Species.SEWADDLE]: 3, + [Species.THROH]: 4, + [Species.SAWK]: 4, + [Species.SEWADDLE]: 2, [Species.VENIPEDE]: 3, [Species.COTTONEE]: 3, [Species.PETILIL]: 3, [Species.BASCULIN]: 4, - [Species.SANDILE]: 3, + [Species.SANDILE]: 4, [Species.DARUMAKA]: 4, - [Species.MARACTUS]: 4, - [Species.DWEBBLE]: 3, + [Species.MARACTUS]: 2, + [Species.DWEBBLE]: 2, [Species.SCRAGGY]: 3, - [Species.SIGILYPH]: 5, + [Species.SIGILYPH]: 4, [Species.YAMASK]: 3, - [Species.TIRTOUGA]: 4, - [Species.ARCHEN]: 4, - [Species.TRUBBISH]: 3, + [Species.TIRTOUGA]: 3, + [Species.ARCHEN]: 3, + [Species.TRUBBISH]: 2, [Species.ZORUA]: 3, [Species.MINCCINO]: 3, [Species.GOTHITA]: 3, [Species.SOLOSIS]: 3, - [Species.DUCKLETT]: 3, + [Species.DUCKLETT]: 2, [Species.VANILLITE]: 3, - [Species.DEERLING]: 3, - [Species.EMOLGA]: 3, + [Species.DEERLING]: 2, + [Species.EMOLGA]: 2, [Species.KARRABLAST]: 3, - [Species.FOONGUS]: 3, + [Species.FOONGUS]: 2, [Species.FRILLISH]: 3, [Species.ALOMOMOLA]: 4, [Species.JOLTIK]: 3, [Species.FERROSEED]: 3, [Species.KLINK]: 3, - [Species.TYNAMO]: 3, - [Species.ELGYEM]: 3, + [Species.TYNAMO]: 2, + [Species.ELGYEM]: 2, [Species.LITWICK]: 3, [Species.AXEW]: 4, - [Species.CUBCHOO]: 3, - [Species.CRYOGONAL]: 5, - [Species.SHELMET]: 3, - [Species.STUNFISK]: 4, + [Species.CUBCHOO]: 2, + [Species.CRYOGONAL]: 4, + [Species.SHELMET]: 2, + [Species.STUNFISK]: 3, [Species.MIENFOO]: 3, - [Species.DRUDDIGON]: 5, + [Species.DRUDDIGON]: 4, [Species.GOLETT]: 3, [Species.PAWNIARD]: 4, - [Species.BOUFFALANT]: 5, + [Species.BOUFFALANT]: 4, [Species.RUFFLET]: 3, [Species.VULLABY]: 3, - [Species.HEATMOR]: 5, - [Species.DURANT]: 5, + [Species.HEATMOR]: 3, + [Species.DURANT]: 4, [Species.DEINO]: 4, [Species.LARVESTA]: 4, [Species.COBALION]: 6, @@ -3004,77 +3046,77 @@ export const speciesStarters = { [Species.CHESPIN]: 3, [Species.FENNEKIN]: 3, - [Species.FROAKIE]: 3, - [Species.BUNNELBY]: 2, + [Species.FROAKIE]: 4, + [Species.BUNNELBY]: 3, [Species.FLETCHLING]: 3, - [Species.SCATTERBUG]: 1, - [Species.LITLEO]: 3, + [Species.SCATTERBUG]: 2, + [Species.LITLEO]: 2, [Species.FLABEBE]: 3, - [Species.SKIDDO]: 3, + [Species.SKIDDO]: 2, [Species.PANCHAM]: 3, - [Species.FURFROU]: 4, - [Species.ESPURR]: 3, + [Species.FURFROU]: 3, + [Species.ESPURR]: 2, [Species.HONEDGE]: 4, - [Species.SPRITZEE]: 3, + [Species.SPRITZEE]: 2, [Species.SWIRLIX]: 3, [Species.INKAY]: 3, [Species.BINACLE]: 3, - [Species.SKRELP]: 3, + [Species.SKRELP]: 2, [Species.CLAUNCHER]: 3, [Species.HELIOPTILE]: 3, [Species.TYRUNT]: 3, [Species.AMAURA]: 3, [Species.HAWLUCHA]: 4, - [Species.DEDENNE]: 4, - [Species.CARBINK]: 4, + [Species.DEDENNE]: 2, + [Species.CARBINK]: 2, [Species.GOOMY]: 4, - [Species.KLEFKI]: 4, - [Species.PHANTUMP]: 3, - [Species.PUMPKABOO]: 3, + [Species.KLEFKI]: 3, + [Species.PHANTUMP]: 2, + [Species.PUMPKABOO]: 2, [Species.BERGMITE]: 3, - [Species.NOIBAT]: 4, + [Species.NOIBAT]: 3, [Species.XERNEAS]: 8, [Species.YVELTAL]: 8, [Species.ZYGARDE]: 8, [Species.DIANCIE]: 7, [Species.HOOPA]: 7, [Species.VOLCANION]: 6, - [Species.ETERNAL_FLOETTE]: 5, + [Species.ETERNAL_FLOETTE]: 4, [Species.ROWLET]: 3, [Species.LITTEN]: 3, - [Species.POPPLIO]: 3, - [Species.PIKIPEK]: 3, + [Species.POPPLIO]: 4, + [Species.PIKIPEK]: 2, [Species.YUNGOOS]: 2, - [Species.GRUBBIN]: 2, - [Species.CRABRAWLER]: 4, + [Species.GRUBBIN]: 3, + [Species.CRABRAWLER]: 3, [Species.ORICORIO]: 3, [Species.CUTIEFLY]: 3, [Species.ROCKRUFF]: 3, - [Species.WISHIWASHI]: 3, - [Species.MAREANIE]: 3, + [Species.WISHIWASHI]: 2, + [Species.MAREANIE]: 2, [Species.MUDBRAY]: 3, [Species.DEWPIDER]: 3, - [Species.FOMANTIS]: 3, - [Species.MORELULL]: 3, + [Species.FOMANTIS]: 2, + [Species.MORELULL]: 2, [Species.SALANDIT]: 3, [Species.STUFFUL]: 3, [Species.BOUNSWEET]: 3, [Species.COMFEY]: 4, - [Species.ORANGURU]: 5, - [Species.PASSIMIAN]: 5, + [Species.ORANGURU]: 4, + [Species.PASSIMIAN]: 4, [Species.WIMPOD]: 3, [Species.SANDYGAST]: 3, - [Species.PYUKUMUKU]: 3, + [Species.PYUKUMUKU]: 2, [Species.TYPE_NULL]: 5, - [Species.MINIOR]: 5, - [Species.KOMALA]: 5, - [Species.TURTONATOR]: 5, - [Species.TOGEDEMARU]: 4, - [Species.MIMIKYU]: 5, - [Species.BRUXISH]: 5, - [Species.DRAMPA]: 5, - [Species.DHELMISE]: 5, + [Species.MINIOR]: 4, + [Species.KOMALA]: 3, + [Species.TURTONATOR]: 4, + [Species.TOGEDEMARU]: 3, + [Species.MIMIKYU]: 4, + [Species.BRUXISH]: 4, + [Species.DRAMPA]: 4, + [Species.DHELMISE]: 4, [Species.JANGMO_O]: 4, [Species.TAPU_KOKO]: 6, [Species.TAPU_LELE]: 6, @@ -3096,49 +3138,49 @@ export const speciesStarters = { [Species.BLACEPHALON]: 7, [Species.ZERAORA]: 6, [Species.MELTAN]: 6, - [Species.ALOLA_RATTATA]: 2, - [Species.ALOLA_SANDSHREW]: 4, - [Species.ALOLA_VULPIX]: 4, - [Species.ALOLA_DIGLETT]: 3, - [Species.ALOLA_MEOWTH]: 4, + [Species.ALOLA_RATTATA]: 1, + [Species.ALOLA_SANDSHREW]: 2, + [Species.ALOLA_VULPIX]: 3, + [Species.ALOLA_DIGLETT]: 2, + [Species.ALOLA_MEOWTH]: 3, [Species.ALOLA_GEODUDE]: 3, [Species.ALOLA_GRIMER]: 3, [Species.GROOKEY]: 3, - [Species.SCORBUNNY]: 3, + [Species.SCORBUNNY]: 4, [Species.SOBBLE]: 3, [Species.SKWOVET]: 2, - [Species.ROOKIDEE]: 4, + [Species.ROOKIDEE]: 3, [Species.BLIPBUG]: 2, - [Species.NICKIT]: 3, - [Species.GOSSIFLEUR]: 3, - [Species.WOOLOO]: 3, + [Species.NICKIT]: 1, + [Species.GOSSIFLEUR]: 2, + [Species.WOOLOO]: 2, [Species.CHEWTLE]: 3, - [Species.YAMPER]: 3, + [Species.YAMPER]: 2, [Species.ROLYCOLY]: 3, - [Species.APPLIN]: 4, + [Species.APPLIN]: 3, [Species.SILICOBRA]: 3, [Species.CRAMORANT]: 3, [Species.ARROKUDA]: 3, [Species.TOXEL]: 3, [Species.SIZZLIPEDE]: 3, - [Species.CLOBBOPUS]: 3, + [Species.CLOBBOPUS]: 2, [Species.SINISTEA]: 3, - [Species.HATENNA]: 4, + [Species.HATENNA]: 3, [Species.IMPIDIMP]: 3, [Species.MILCERY]: 3, [Species.FALINKS]: 4, [Species.PINCURCHIN]: 3, [Species.SNOM]: 3, - [Species.STONJOURNER]: 4, - [Species.EISCUE]: 4, - [Species.INDEEDEE]: 3, + [Species.STONJOURNER]: 3, + [Species.EISCUE]: 3, + [Species.INDEEDEE]: 4, [Species.MORPEKO]: 3, - [Species.CUFANT]: 4, + [Species.CUFANT]: 3, [Species.DRACOZOLT]: 5, - [Species.ARCTOZOLT]: 5, + [Species.ARCTOZOLT]: 4, [Species.DRACOVISH]: 5, - [Species.ARCTOVISH]: 5, + [Species.ARCTOVISH]: 4, [Species.DURALUDON]: 5, [Species.DREEPY]: 4, [Species.ZACIAN]: 9, @@ -3151,67 +3193,67 @@ export const speciesStarters = { [Species.GLASTRIER]: 6, [Species.SPECTRIER]: 7, [Species.CALYREX]: 8, - [Species.GALAR_MEOWTH]: 4, - [Species.GALAR_PONYTA]: 4, + [Species.GALAR_MEOWTH]: 3, + [Species.GALAR_PONYTA]: 2, [Species.GALAR_SLOWPOKE]: 3, - [Species.GALAR_FARFETCHD]: 5, - [Species.GALAR_CORSOLA]: 4, + [Species.GALAR_FARFETCHD]: 3, + [Species.GALAR_CORSOLA]: 3, [Species.GALAR_ZIGZAGOON]: 3, [Species.GALAR_DARUMAKA]: 4, [Species.GALAR_YAMASK]: 3, - [Species.GALAR_STUNFISK]: 4, - [Species.GALAR_MR_MIME]: 5, + [Species.GALAR_STUNFISK]: 2, + [Species.GALAR_MR_MIME]: 3, [Species.GALAR_ARTICUNO]: 6, [Species.GALAR_ZAPDOS]: 6, [Species.GALAR_MOLTRES]: 6, [Species.HISUI_GROWLITHE]: 4, [Species.HISUI_VOLTORB]: 3, [Species.HISUI_QWILFISH]: 4, - [Species.HISUI_SNEASEL]: 4, - [Species.HISUI_ZORUA]: 4, + [Species.HISUI_SNEASEL]: 5, + [Species.HISUI_ZORUA]: 3, [Species.ENAMORUS]: 7, - [Species.SPRIGATITO]: 3, - [Species.FUECOCO]: 3, - [Species.QUAXLY]: 3, + [Species.SPRIGATITO]: 4, + [Species.FUECOCO]: 4, + [Species.QUAXLY]: 4, [Species.LECHONK]: 2, [Species.TAROUNTULA]: 1, [Species.NYMBLE]: 3, [Species.PAWMI]: 3, [Species.TANDEMAUS]: 4, - [Species.FIDOUGH]: 3, + [Species.FIDOUGH]: 2, [Species.SMOLIV]: 3, - [Species.SQUAWKABILLY]: 3, + [Species.SQUAWKABILLY]: 2, [Species.NACLI]: 4, [Species.CHARCADET]: 4, [Species.TADBULB]: 3, [Species.WATTREL]: 3, [Species.MASCHIFF]: 3, - [Species.SHROODLE]: 3, + [Species.SHROODLE]: 2, [Species.BRAMBLIN]: 3, [Species.TOEDSCOOL]: 3, - [Species.KLAWF]: 4, + [Species.KLAWF]: 3, [Species.CAPSAKID]: 3, - [Species.RELLOR]: 3, + [Species.RELLOR]: 2, [Species.FLITTLE]: 3, [Species.TINKATINK]: 4, - [Species.WIGLETT]: 3, + [Species.WIGLETT]: 2, [Species.BOMBIRDIER]: 3, - [Species.FINIZEN]: 4, + [Species.FINIZEN]: 3, [Species.VAROOM]: 4, - [Species.CYCLIZAR]: 5, + [Species.CYCLIZAR]: 4, [Species.ORTHWORM]: 4, [Species.GLIMMET]: 4, - [Species.GREAVARD]: 4, + [Species.GREAVARD]: 3, [Species.FLAMIGO]: 4, - [Species.CETODDLE]: 4, + [Species.CETODDLE]: 3, [Species.VELUZA]: 4, - [Species.DONDOZO]: 5, - [Species.TATSUGIRI]: 5, + [Species.DONDOZO]: 4, + [Species.TATSUGIRI]: 4, [Species.GREAT_TUSK]: 6, [Species.SCREAM_TAIL]: 6, [Species.BRUTE_BONNET]: 6, - [Species.FLUTTER_MANE]: 6, + [Species.FLUTTER_MANE]: 7, [Species.SLITHER_WING]: 6, [Species.SANDY_SHOCKS]: 6, [Species.IRON_TREADS]: 6, @@ -3221,7 +3263,7 @@ export const speciesStarters = { [Species.IRON_MOTH]: 6, [Species.IRON_THORNS]: 6, [Species.FRIGIBAX]: 4, - [Species.GIMMIGHOUL]: 5, + [Species.GIMMIGHOUL]: 4, [Species.WO_CHIEN]: 6, [Species.CHIEN_PAO]: 7, [Species.TING_LU]: 6, @@ -3245,7 +3287,7 @@ export const speciesStarters = { [Species.PECHARUNT]: 6, [Species.PALDEA_TAUROS]: 5, [Species.PALDEA_WOOPER]: 3, - [Species.BLOODMOON_URSALUNA]: 7, + [Species.BLOODMOON_URSALUNA]: 6, }; export const noStarterFormKeys: string[] = [ @@ -3285,20 +3327,42 @@ export function getStarterValueFriendshipCap(value: integer): integer { } } +/** +* Method to get the daily list of starters with Pokerus. +* @param scene {@linkcode BattleScene} used as part of RNG +* @returns A list of starters with Pokerus +*/ +export function getPokerusStarters(scene: BattleScene): PokemonSpecies[] { + const pokerusStarters: PokemonSpecies[] = []; + const date = new Date(); + const starterCount = 3; //for easy future adjustment! + date.setUTCHours(0, 0, 0, 0); + scene.executeWithSeedOffset(() => { + while (pokerusStarters.length < starterCount) { + const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarters)), 10); + const species = getPokemonSpecies(randomSpeciesId); + if (!pokerusStarters.includes(species)) { + pokerusStarters.push(species); + } + } + }, 0, date.getTime().toString()); + return pokerusStarters; +} + export const starterPassiveAbilities = { [Species.BULBASAUR]: Abilities.GRASSY_SURGE, [Species.CHARMANDER]: Abilities.BEAST_BOOST, [Species.SQUIRTLE]: Abilities.STURDY, [Species.CATERPIE]: Abilities.MAGICIAN, [Species.WEEDLE]: Abilities.TINTED_LENS, - [Species.PIDGEY]: Abilities.GALE_WINGS, + [Species.PIDGEY]: Abilities.FLARE_BOOST, [Species.RATTATA]: Abilities.STRONG_JAW, [Species.SPEAROW]: Abilities.MOXIE, [Species.EKANS]: Abilities.REGENERATOR, [Species.SANDSHREW]: Abilities.TOUGH_CLAWS, [Species.NIDORAN_F]: Abilities.FLARE_BOOST, [Species.NIDORAN_M]: Abilities.GUTS, - [Species.VULPIX]: Abilities.SOLAR_POWER, + [Species.VULPIX]: Abilities.FUR_COAT, [Species.ZUBAT]: Abilities.INTIMIDATE, [Species.ODDISH]: Abilities.TRIAGE, [Species.PARAS]: Abilities.TRIAGE, @@ -3317,16 +3381,16 @@ export const starterPassiveAbilities = { [Species.PONYTA]: Abilities.MAGIC_GUARD, [Species.SLOWPOKE]: Abilities.UNAWARE, [Species.MAGNEMITE]: Abilities.LEVITATE, - [Species.FARFETCHD]: Abilities.HUGE_POWER, + [Species.FARFETCHD]: Abilities.SNIPER, [Species.DODUO]: Abilities.PARENTAL_BOND, [Species.SEEL]: Abilities.WATER_BUBBLE, [Species.GRIMER]: Abilities.WATER_ABSORB, [Species.SHELLDER]: Abilities.ICE_SCALES, [Species.GASTLY]: Abilities.SHADOW_SHIELD, [Species.ONIX]: Abilities.ROCKY_PAYLOAD, - [Species.DROWZEE]: Abilities.BAD_DREAMS, + [Species.DROWZEE]: Abilities.MAGICIAN, [Species.KRABBY]: Abilities.UNBURDEN, - [Species.VOLTORB]: Abilities.ELECTRIC_SURGE, + [Species.VOLTORB]: Abilities.TRANSISTOR, [Species.EXEGGCUTE]: Abilities.RIPEN, [Species.CUBONE]: Abilities.PARENTAL_BOND, [Species.LICKITUNG]: Abilities.THICK_FAT, @@ -3334,7 +3398,7 @@ export const starterPassiveAbilities = { [Species.RHYHORN]: Abilities.FILTER, [Species.TANGELA]: Abilities.SEED_SOWER, [Species.KANGASKHAN]: Abilities.GUTS, - [Species.HORSEA]: Abilities.DRIZZLE, + [Species.HORSEA]: Abilities.DRAGONS_MAW, [Species.GOLDEEN]: Abilities.MULTISCALE, [Species.STARYU]: Abilities.REGENERATOR, [Species.SCYTHER]: Abilities.TINTED_LENS, @@ -3343,10 +3407,10 @@ export const starterPassiveAbilities = { [Species.MAGIKARP]: Abilities.MULTISCALE, [Species.LAPRAS]: Abilities.LIGHTNING_ROD, [Species.DITTO]: Abilities.ADAPTABILITY, - [Species.EEVEE]: Abilities.SIMPLE, + [Species.EEVEE]: Abilities.PICKUP, [Species.PORYGON]: Abilities.PROTEAN, [Species.OMANYTE]: Abilities.STURDY, - [Species.KABUTO]: Abilities.SHARPNESS, + [Species.KABUTO]: Abilities.TOUGH_CLAWS, [Species.AERODACTYL]: Abilities.ORICHALCUM_PULSE, [Species.ARTICUNO]: Abilities.SNOW_WARNING, [Species.ZAPDOS]: Abilities.DRIZZLE, @@ -3440,7 +3504,7 @@ export const starterPassiveAbilities = { [Species.GULPIN]: Abilities.EARTH_EATER, [Species.CARVANHA]: Abilities.SHEER_FORCE, [Species.WAILMER]: Abilities.LEVITATE, - [Species.NUMEL]: Abilities.STAMINA, + [Species.NUMEL]: Abilities.FUR_COAT, [Species.TORKOAL]: Abilities.ANALYTIC, [Species.SPOINK]: Abilities.PSYCHIC_SURGE, [Species.SPINDA]: Abilities.SIMPLE, @@ -3448,7 +3512,7 @@ export const starterPassiveAbilities = { [Species.CACNEA]: Abilities.SAND_RUSH, [Species.SWABLU]: Abilities.ADAPTABILITY, [Species.ZANGOOSE]: Abilities.POISON_HEAL, - [Species.SEVIPER]: Abilities.INTIMIDATE, + [Species.SEVIPER]: Abilities.MULTISCALE, [Species.LUNATONE]: Abilities.SHADOW_SHIELD, [Species.SOLROCK]: Abilities.DROUGHT, [Species.BARBOACH]: Abilities.SIMPLE, @@ -3467,23 +3531,23 @@ export const starterPassiveAbilities = { [Species.SNORUNT]: Abilities.SNOW_WARNING, [Species.SPHEAL]: Abilities.UNAWARE, [Species.CLAMPERL]: Abilities.DRIZZLE, - [Species.RELICANTH]: Abilities.SOLID_ROCK, + [Species.RELICANTH]: Abilities.PRIMORDIAL_SEA, [Species.LUVDISC]: Abilities.MULTISCALE, - [Species.BAGON]: Abilities.ADAPTABILITY, + [Species.BAGON]: Abilities.DRAGONS_MAW, [Species.BELDUM]: Abilities.LEVITATE, [Species.REGIROCK]: Abilities.SAND_STREAM, [Species.REGICE]: Abilities.SNOW_WARNING, [Species.REGISTEEL]: Abilities.FILTER, - [Species.LATIAS]: Abilities.SOUL_HEART, + [Species.LATIAS]: Abilities.PRISM_ARMOR, [Species.LATIOS]: Abilities.TINTED_LENS, - [Species.KYOGRE]: Abilities.RAIN_DISH, + [Species.KYOGRE]: Abilities.MOLD_BREAKER, [Species.GROUDON]: Abilities.TURBOBLAZE, [Species.RAYQUAZA]: Abilities.UNNERVE, [Species.JIRACHI]: Abilities.COMATOSE, [Species.DEOXYS]: Abilities.PROTEAN, [Species.TURTWIG]: Abilities.THICK_FAT, [Species.CHIMCHAR]: Abilities.BEAST_BOOST, - [Species.PIPLUP]: Abilities.LIGHTNING_ROD, + [Species.PIPLUP]: Abilities.DRIZZLE, [Species.STARLY]: Abilities.ROCK_HEAD, [Species.BIDOOF]: Abilities.SAP_SIPPER, [Species.KRICKETOT]: Abilities.SHARPNESS, @@ -3495,7 +3559,7 @@ export const starterPassiveAbilities = { [Species.COMBEE]: Abilities.INTIMIDATE, [Species.PACHIRISU]: Abilities.HONEY_GATHER, [Species.BUIZEL]: Abilities.MOXIE, - [Species.CHERUBI]: Abilities.DROUGHT, + [Species.CHERUBI]: Abilities.ORICHALCUM_PULSE, [Species.SHELLOS]: Abilities.REGENERATOR, [Species.DRIFLOON]: Abilities.MAGIC_GUARD, [Species.BUNEARY]: Abilities.ADAPTABILITY, @@ -3515,7 +3579,7 @@ export const starterPassiveAbilities = { [Species.SKORUPI]: Abilities.SUPER_LUCK, [Species.CROAGUNK]: Abilities.MOXIE, [Species.CARNIVINE]: Abilities.ARENA_TRAP, - [Species.FINNEON]: Abilities.DRIZZLE, + [Species.FINNEON]: Abilities.WATER_BUBBLE, [Species.MANTYKE]: Abilities.UNAWARE, [Species.SNOVER]: Abilities.THICK_FAT, [Species.ROTOM]: Abilities.HADRON_ENGINE, @@ -3527,9 +3591,9 @@ export const starterPassiveAbilities = { [Species.HEATRAN]: Abilities.EARTH_EATER, [Species.REGIGIGAS]: Abilities.MINDS_EYE, [Species.GIRATINA]: Abilities.SHADOW_SHIELD, - [Species.CRESSELIA]: Abilities.MAGIC_BOUNCE, + [Species.CRESSELIA]: Abilities.SHADOW_SHIELD, [Species.PHIONE]: Abilities.SIMPLE, - [Species.MANAPHY]: Abilities.SIMPLE, + [Species.MANAPHY]: Abilities.PRIMORDIAL_SEA, [Species.DARKRAI]: Abilities.UNNERVE, [Species.SHAYMIN]: Abilities.WIND_RIDER, [Species.ARCEUS]: Abilities.ADAPTABILITY, @@ -3562,13 +3626,13 @@ export const starterPassiveAbilities = { [Species.SANDILE]: Abilities.TOUGH_CLAWS, [Species.DARUMAKA]: Abilities.GORILLA_TACTICS, [Species.MARACTUS]: Abilities.WELL_BAKED_BODY, - [Species.DWEBBLE]: Abilities.ANGER_SHELL, + [Species.DWEBBLE]: Abilities.ROCKY_PAYLOAD, [Species.SCRAGGY]: Abilities.PROTEAN, - [Species.SIGILYPH]: Abilities.MAGICIAN, + [Species.SIGILYPH]: Abilities.FLARE_BOOST, [Species.YAMASK]: Abilities.PURIFYING_SALT, - [Species.TIRTOUGA]: Abilities.ANGER_SHELL, + [Species.TIRTOUGA]: Abilities.WATER_ABSORB, [Species.ARCHEN]: Abilities.MULTISCALE, - [Species.TRUBBISH]: Abilities.TOXIC_DEBRIS, + [Species.TRUBBISH]: Abilities.NEUTRALIZING_GAS, [Species.ZORUA]: Abilities.DARK_AURA, [Species.MINCCINO]: Abilities.FUR_COAT, [Species.GOTHITA]: Abilities.UNNERVE, @@ -3583,7 +3647,7 @@ export const starterPassiveAbilities = { [Species.ALOMOMOLA]: Abilities.MULTISCALE, [Species.JOLTIK]: Abilities.TRANSISTOR, [Species.FERROSEED]: Abilities.ROUGH_SKIN, - [Species.KLINK]: Abilities.STEELWORKER, + [Species.KLINK]: Abilities.STEELY_SPIRIT, [Species.TYNAMO]: Abilities.POISON_HEAL, [Species.ELGYEM]: Abilities.PRISM_ARMOR, [Species.LITWICK]: Abilities.SOUL_HEART, @@ -3597,7 +3661,7 @@ export const starterPassiveAbilities = { [Species.GOLETT]: Abilities.SHADOW_SHIELD, [Species.PAWNIARD]: Abilities.SWORD_OF_RUIN, [Species.BOUFFALANT]: Abilities.ROCK_HEAD, - [Species.RUFFLET]: Abilities.GALE_WINGS, + [Species.RUFFLET]: Abilities.SPEED_BOOST, [Species.VULLABY]: Abilities.THICK_FAT, [Species.HEATMOR]: Abilities.CONTRARY, [Species.DURANT]: Abilities.COMPOUND_EYES, @@ -3623,12 +3687,12 @@ export const starterPassiveAbilities = { [Species.SCATTERBUG]: Abilities.PRANKSTER, [Species.LITLEO]: Abilities.BEAST_BOOST, [Species.FLABEBE]: Abilities.GRASSY_SURGE, - [Species.SKIDDO]: Abilities.GRASSY_SURGE, + [Species.SKIDDO]: Abilities.SEED_SOWER, [Species.PANCHAM]: Abilities.FUR_COAT, [Species.FURFROU]: Abilities.FLUFFY, [Species.ESPURR]: Abilities.FUR_COAT, [Species.HONEDGE]: Abilities.SHARPNESS, - [Species.SPRITZEE]: Abilities.MISTY_SURGE, + [Species.SPRITZEE]: Abilities.FUR_COAT, [Species.SWIRLIX]: Abilities.WELL_BAKED_BODY, [Species.INKAY]: Abilities.UNNERVE, [Species.BINACLE]: Abilities.SAP_SIPPER, @@ -3642,17 +3706,17 @@ export const starterPassiveAbilities = { [Species.CARBINK]: Abilities.SOLID_ROCK, [Species.GOOMY]: Abilities.REGENERATOR, [Species.KLEFKI]: Abilities.LEVITATE, - [Species.PHANTUMP]: Abilities.RIPEN, + [Species.PHANTUMP]: Abilities.SHADOW_TAG, [Species.PUMPKABOO]: Abilities.WELL_BAKED_BODY, [Species.BERGMITE]: Abilities.ICE_SCALES, [Species.NOIBAT]: Abilities.PUNK_ROCK, - [Species.XERNEAS]: Abilities.MISTY_SURGE, + [Species.XERNEAS]: Abilities.HARVEST, [Species.YVELTAL]: Abilities.SOUL_HEART, [Species.ZYGARDE]: Abilities.HUGE_POWER, [Species.DIANCIE]: Abilities.LEVITATE, [Species.HOOPA]: Abilities.OPPORTUNIST, [Species.VOLCANION]: Abilities.FILTER, - [Species.ROWLET]: Abilities.UNBURDEN, + [Species.ROWLET]: Abilities.SNIPER, [Species.LITTEN]: Abilities.FUR_COAT, [Species.POPPLIO]: Abilities.PUNK_ROCK, [Species.PIKIPEK]: Abilities.TECHNICIAN, @@ -3686,7 +3750,7 @@ export const starterPassiveAbilities = { [Species.BRUXISH]: Abilities.MULTISCALE, [Species.DRAMPA]: Abilities.THICK_FAT, [Species.DHELMISE]: Abilities.WATER_BUBBLE, - [Species.JANGMO_O]: Abilities.PUNK_ROCK, + [Species.JANGMO_O]: Abilities.DAUNTLESS_SHIELD, [Species.TAPU_KOKO]: Abilities.TRANSISTOR, [Species.TAPU_LELE]: Abilities.SHEER_FORCE, [Species.TAPU_BULU]: Abilities.TRIAGE, @@ -3698,7 +3762,7 @@ export const starterPassiveAbilities = { [Species.XURKITREE]: Abilities.TRANSISTOR, [Species.CELESTEELA]: Abilities.HEATPROOF, [Species.KARTANA]: Abilities.SHARPNESS, - [Species.GUZZLORD]: Abilities.INNARDS_OUT, + [Species.GUZZLORD]: Abilities.POISON_HEAL, [Species.NECROZMA]: Abilities.BEAST_BOOST, [Species.MAGEARNA]: Abilities.STEELY_SPIRIT, [Species.MARSHADOW]: Abilities.IRON_FIST, @@ -3710,13 +3774,13 @@ export const starterPassiveAbilities = { [Species.GROOKEY]: Abilities.GRASS_PELT, [Species.SCORBUNNY]: Abilities.NO_GUARD, [Species.SOBBLE]: Abilities.SUPER_LUCK, - [Species.SKWOVET]: Abilities.RIPEN, + [Species.SKWOVET]: Abilities.HARVEST, [Species.ROOKIDEE]: Abilities.IRON_BARBS, [Species.BLIPBUG]: Abilities.PSYCHIC_SURGE, [Species.NICKIT]: Abilities.MAGICIAN, [Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE, [Species.WOOLOO]: Abilities.SIMPLE, - [Species.CHEWTLE]: Abilities.ROCK_HEAD, + [Species.CHEWTLE]: Abilities.ROCKY_PAYLOAD, [Species.YAMPER]: Abilities.SHEER_FORCE, [Species.ROLYCOLY]: Abilities.SOLID_ROCK, [Species.APPLIN]: Abilities.DRAGONS_MAW, @@ -3729,7 +3793,7 @@ export const starterPassiveAbilities = { [Species.SINISTEA]: Abilities.SHADOW_SHIELD, [Species.HATENNA]: Abilities.FAIRY_AURA, [Species.IMPIDIMP]: Abilities.FUR_COAT, - [Species.MILCERY]: Abilities.MISTY_SURGE, + [Species.MILCERY]: Abilities.REGENERATOR, [Species.FALINKS]: Abilities.PARENTAL_BOND, [Species.PINCURCHIN]: Abilities.ELECTROMORPHOSIS, [Species.SNOM]: Abilities.SNOW_WARNING, @@ -3739,16 +3803,16 @@ export const starterPassiveAbilities = { [Species.MORPEKO]: Abilities.MOODY, [Species.CUFANT]: Abilities.EARTH_EATER, [Species.DRACOZOLT]: Abilities.NO_GUARD, - [Species.ARCTOZOLT]: Abilities.SNOW_WARNING, + [Species.ARCTOZOLT]: Abilities.TRANSISTOR, [Species.DRACOVISH]: Abilities.SWIFT_SWIM, - [Species.ARCTOVISH]: Abilities.SNOW_WARNING, + [Species.ARCTOVISH]: Abilities.STRONG_JAW, [Species.DURALUDON]: Abilities.STEELWORKER, [Species.DREEPY]: Abilities.PARENTAL_BOND, [Species.ZACIAN]: Abilities.UNNERVE, [Species.ZAMAZENTA]: Abilities.STAMINA, - [Species.ETERNATUS]: Abilities.SUPREME_OVERLORD, + [Species.ETERNATUS]: Abilities.NEUTRALIZING_GAS, [Species.KUBFU]: Abilities.IRON_FIST, - [Species.ZARUDE]: Abilities.GRASSY_SURGE, + [Species.ZARUDE]: Abilities.TOUGH_CLAWS, [Species.REGIELEKI]: Abilities.ELECTRIC_SURGE, [Species.REGIDRAGO]: Abilities.MULTISCALE, [Species.GLASTRIER]: Abilities.FILTER, @@ -3757,7 +3821,7 @@ export const starterPassiveAbilities = { [Species.ENAMORUS]: Abilities.FAIRY_AURA, [Species.SPRIGATITO]: Abilities.MAGICIAN, [Species.FUECOCO]: Abilities.PUNK_ROCK, - [Species.QUAXLY]: Abilities.DEFIANT, + [Species.QUAXLY]: Abilities.OPPORTUNIST, [Species.LECHONK]: Abilities.SIMPLE, [Species.TAROUNTULA]: Abilities.HONEY_GATHER, [Species.NYMBLE]: Abilities.GUTS, @@ -3805,11 +3869,11 @@ export const starterPassiveAbilities = { [Species.IRON_MOTH]: Abilities.LEVITATE, [Species.IRON_THORNS]: Abilities.SAND_STREAM, [Species.FRIGIBAX]: Abilities.SNOW_WARNING, - [Species.GIMMIGHOUL]: Abilities.CONTRARY, + [Species.GIMMIGHOUL]: Abilities.HONEY_GATHER, [Species.WO_CHIEN]: Abilities.VESSEL_OF_RUIN, - [Species.CHIEN_PAO]: Abilities.INTREPID_SWORD, + [Species.CHIEN_PAO]: Abilities.SNOW_WARNING, [Species.TING_LU]: Abilities.STAMINA, - [Species.CHI_YU]: Abilities.DROUGHT, + [Species.CHI_YU]: Abilities.BERSERK, [Species.ROARING_MOON]: Abilities.TOUGH_CLAWS, [Species.IRON_VALIANT]: Abilities.ADAPTABILITY, [Species.KORAIDON]: Abilities.OPPORTUNIST, @@ -3827,7 +3891,7 @@ export const starterPassiveAbilities = { [Species.IRON_CROWN]: Abilities.SHARPNESS, [Species.TERAPAGOS]: Abilities.SOUL_HEART, [Species.PECHARUNT]: Abilities.TOXIC_CHAIN, - [Species.ALOLA_RATTATA]: Abilities.STRONG_JAW, + [Species.ALOLA_RATTATA]: Abilities.ADAPTABILITY, [Species.ALOLA_SANDSHREW]: Abilities.TOUGH_CLAWS, [Species.ALOLA_VULPIX]: Abilities.SHEER_FORCE, [Species.ALOLA_DIGLETT]: Abilities.STURDY, @@ -3836,7 +3900,7 @@ export const starterPassiveAbilities = { [Species.ALOLA_GRIMER]: Abilities.TOXIC_DEBRIS, [Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD, [Species.GALAR_MEOWTH]: Abilities.STEELWORKER, - [Species.GALAR_PONYTA]: Abilities.PIXILATE, + [Species.GALAR_PONYTA]: Abilities.MOXIE, [Species.GALAR_SLOWPOKE]: Abilities.UNAWARE, [Species.GALAR_FARFETCHD]: Abilities.INTREPID_SWORD, [Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE, @@ -3848,7 +3912,7 @@ export const starterPassiveAbilities = { [Species.GALAR_YAMASK]: Abilities.TABLETS_OF_RUIN, [Species.GALAR_STUNFISK]: Abilities.ARENA_TRAP, [Species.HISUI_GROWLITHE]: Abilities.RECKLESS, - [Species.HISUI_VOLTORB]: Abilities.ELECTRIC_SURGE, + [Species.HISUI_VOLTORB]: Abilities.TRANSISTOR, [Species.HISUI_QWILFISH]: Abilities.MERCILESS, [Species.HISUI_SNEASEL]: Abilities.SCRAPPY, [Species.HISUI_ZORUA]: Abilities.ADAPTABILITY, diff --git a/src/data/pokemon-stat.ts b/src/data/pokemon-stat.ts deleted file mode 100644 index a6bf77b1daa..00000000000 --- a/src/data/pokemon-stat.ts +++ /dev/null @@ -1,35 +0,0 @@ -import i18next from "i18next"; - -export enum Stat { - HP = 0, - ATK, - DEF, - SPATK, - SPDEF, - SPD -} - -export function getStatName(stat: Stat, shorten: boolean = false) { - let ret: string; - switch (stat) { - case Stat.HP: - ret = !shorten ? i18next.t("pokemonInfo:Stat.HP") : i18next.t("pokemonInfo:Stat.HPshortened"); - break; - case Stat.ATK: - ret = !shorten ? i18next.t("pokemonInfo:Stat.ATK") : i18next.t("pokemonInfo:Stat.ATKshortened"); - break; - case Stat.DEF: - ret = !shorten ? i18next.t("pokemonInfo:Stat.DEF") : i18next.t("pokemonInfo:Stat.DEFshortened"); - break; - case Stat.SPATK: - ret = !shorten ? i18next.t("pokemonInfo:Stat.SPATK") : i18next.t("pokemonInfo:Stat.SPATKshortened"); - break; - case Stat.SPDEF: - ret = !shorten ? i18next.t("pokemonInfo:Stat.SPDEF") : i18next.t("pokemonInfo:Stat.SPDEFshortened"); - break; - case Stat.SPD: - ret = !shorten ? i18next.t("pokemonInfo:Stat.SPD") : i18next.t("pokemonInfo:Stat.SPDshortened"); - break; - } - return ret; -} diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index bd64456c993..8e95bba0591 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -6,7 +6,7 @@ export function getBattleCountSplashMessage(): string { export function getSplashMessages(): string[] { const splashMessages = Array(10).fill(getBattleCountSplashMessage()); - splashMessages.push(...[ + splashMessages.push( i18next.t("splashMessages:joinTheDiscord"), i18next.t("splashMessages:infiniteLevels"), i18next.t("splashMessages:everythingStacks"), @@ -39,7 +39,8 @@ export function getSplashMessages(): string[] { i18next.t("splashMessages:alsoTryRadicalRed"), i18next.t("splashMessages:eeveeExpo"), i18next.t("splashMessages:ynoproject"), - ]); + i18next.t("splashMessages:breedersInSpace"), + ); return splashMessages; } diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index 5949fb2f130..4381db5c2c6 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -1,26 +1,18 @@ import * as Utils from "../utils"; +import { StatusEffect } from "#enums/status-effect"; import i18next, { ParseKeys } from "i18next"; -export enum StatusEffect { - NONE, - POISON, - TOXIC, - PARALYSIS, - SLEEP, - FREEZE, - BURN, - FAINT -} +export { StatusEffect }; export class Status { public effect: StatusEffect; public turnCount: integer; - public cureTurn: integer; + public cureTurn: integer | null; constructor(effect: StatusEffect, turnCount: integer = 0, cureTurn?: integer) { this.effect = effect; this.turnCount = turnCount === undefined ? 0 : turnCount; - this.cureTurn = cureTurn; + this.cureTurn = cureTurn!; // TODO: is this bang correct? } incrementTurn(): void { @@ -32,7 +24,7 @@ export class Status { } } -function getStatusEffectMessageKey(statusEffect: StatusEffect): string { +function getStatusEffectMessageKey(statusEffect: StatusEffect | undefined): string { switch (statusEffect) { case StatusEffect.POISON: return "statusEffect:poison"; @@ -51,7 +43,7 @@ function getStatusEffectMessageKey(statusEffect: StatusEffect): string { } } -export function getStatusEffectObtainText(statusEffect: StatusEffect, pokemonNameWithAffix: string, sourceText?: string): string { +export function getStatusEffectObtainText(statusEffect: StatusEffect | undefined, pokemonNameWithAffix: string, sourceText?: string): string { if (!sourceText) { const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain`as ParseKeys; return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); @@ -123,11 +115,11 @@ export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB * @param statusA The first Status * @param statusB The second Status */ -export function getRandomStatus(statusA: Status, statusB: Status): Status { - if (statusA === undefined || statusA.effect === StatusEffect.NONE || statusA.effect === StatusEffect.FAINT) { +export function getRandomStatus(statusA: Status | null, statusB: Status | null): Status | null { + if (!statusA || statusA.effect === StatusEffect.NONE || statusA.effect === StatusEffect.FAINT) { return statusB; } - if (statusB === undefined || statusB.effect === StatusEffect.NONE || statusB.effect === StatusEffect.FAINT) { + if (!statusB || statusB.effect === StatusEffect.NONE || statusB.effect === StatusEffect.FAINT) { return statusA; } 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/terrain.ts b/src/data/terrain.ts index e396c693c4e..6db68b92239 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -2,9 +2,10 @@ import Pokemon from "../field/pokemon"; import Move from "./move"; import { Type } from "./type"; import * as Utils from "../utils"; -import { IncrementMovePriorityAbAttr, applyAbAttrs } from "./ability"; +import { ChangeMovePriorityAbAttr, applyAbAttrs } from "./ability"; import { ProtectAttr } from "./move"; -import { BattlerIndex } from "#app/battle.js"; +import { BattlerIndex } from "#app/battle"; +import i18next from "i18next"; export enum TerrainType { NONE, @@ -58,8 +59,9 @@ export class Terrain { case TerrainType.PSYCHIC: if (!move.hasAttr(ProtectAttr)) { const priority = new Utils.IntegerHolder(move.priority); - applyAbAttrs(IncrementMovePriorityAbAttr, user, null, move, priority); - return priority.value > 0 && user.getOpponents().filter(o => targets.includes(o.getBattlerIndex())).length > 0; + applyAbAttrs(ChangeMovePriorityAbAttr, user, null, false, move, priority); + // Cancels move if the move has positive priority and targets a Pokemon grounded on the Psychic Terrain + return priority.value > 0 && user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()); } } @@ -67,6 +69,22 @@ export class Terrain { } } +export function getTerrainName(terrainType: TerrainType): string { + switch (terrainType) { + case TerrainType.MISTY: + return i18next.t("terrain:misty"); + case TerrainType.ELECTRIC: + return i18next.t("terrain:electric"); + case TerrainType.GRASSY: + return i18next.t("terrain:grassy"); + case TerrainType.PSYCHIC: + return i18next.t("terrain:psychic"); + } + + return ""; +} + + export function getTerrainColor(terrainType: TerrainType): [ integer, integer, integer ] { switch (terrainType) { case TerrainType.MISTY: diff --git a/src/data/tms.ts b/src/data/tms.ts index 4616c177eb6..9dea6d74a86 100644 --- a/src/data/tms.ts +++ b/src/data/tms.ts @@ -282,9 +282,13 @@ export const tmSpecies: TmSpecies = { Species.MEWTWO, Species.MEW, Species.HOPPIP, + Species.SKIPLOOM, + Species.JUMPLUFF, Species.ESPEON, Species.UMBREON, Species.SLOWKING, + Species.SKITTY, + Species.DELCATTY, Species.MUNCHLAX, Species.RHYPERIOR, Species.LEAFEON, @@ -301,6 +305,7 @@ export const tmSpecies: TmSpecies = { Species.PERRSERKER, Species.INDEEDEE, Species.CALYREX, + Species.ANNIHILAPE, Species.ALOLA_RAICHU, Species.ALOLA_MEOWTH, Species.ALOLA_PERSIAN, @@ -400,11 +405,7 @@ export const tmSpecies: TmSpecies = { Species.REGIROCK, Species.GROUDON, Species.JIRACHI, - [ - Species.DEOXYS, - "", - "speed", - ], + Species.DEOXYS, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -459,6 +460,10 @@ export const tmSpecies: TmSpecies = { Species.HOOPA, Species.INCINEROAR, Species.GUMSHOOS, + [ + Species.LYCANROC, + "midnight", + ], Species.KOMMO_O, Species.MARSHADOW, Species.BLACEPHALON, @@ -603,11 +608,7 @@ export const tmSpecies: TmSpecies = { Species.REGICE, Species.REGISTEEL, Species.JIRACHI, - [ - Species.DEOXYS, - "", - "speed", - ], + Species.DEOXYS, Species.BUIZEL, Species.FLOATZEL, Species.AMBIPOM, @@ -807,11 +808,7 @@ export const tmSpecies: TmSpecies = { Species.REGISTEEL, Species.GROUDON, Species.JIRACHI, - [ - Species.DEOXYS, - "", - "speed", - ], + Species.DEOXYS, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -877,6 +874,10 @@ export const tmSpecies: TmSpecies = { Species.CRABOMINABLE, Species.STUFFUL, Species.BEWEAR, + [ + Species.LYCANROC, + "midnight", + ], Species.KOMMO_O, Species.TAPU_KOKO, Species.BUZZWOLE, @@ -954,6 +955,8 @@ export const tmSpecies: TmSpecies = { Species.EXEGGUTOR, Species.CUBONE, Species.MAROWAK, + Species.HITMONLEE, + Species.HITMONCHAN, Species.LICKITUNG, Species.RHYHORN, Species.RHYDON, @@ -1078,6 +1081,7 @@ export const tmSpecies: TmSpecies = { Species.LILLIGANT, Species.DWEBBLE, Species.CRUSTLE, + Species.SCRAFTY, Species.ZORUA, Species.ZOROARK, Species.SAWSBUCK, @@ -2026,6 +2030,7 @@ export const tmSpecies: TmSpecies = { Species.PUPITAR, Species.TYRANITAR, Species.LUGIA, + Species.HO_OH, Species.TREECKO, Species.GROVYLE, Species.SCEPTILE, @@ -2146,6 +2151,7 @@ export const tmSpecies: TmSpecies = { Species.LUXRAY, Species.ROSERADE, Species.SHIELDON, + Species.BASTIODON, Species.FLOATZEL, Species.SHELLOS, Species.GASTRODON, @@ -2188,8 +2194,15 @@ export const tmSpecies: TmSpecies = { Species.GIRATINA, Species.CRESSELIA, Species.ARCEUS, + Species.SERPERIOR, Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, Species.SAMUROTT, + Species.BLITZLE, + Species.ZEBSTRIKA, + Species.DRILBUR, + Species.EXCADRILL, Species.AUDINO, Species.CONKELDURR, Species.THROH, @@ -2197,11 +2210,13 @@ export const tmSpecies: TmSpecies = { Species.KROKOROK, Species.KROOKODILE, Species.DARMANITAN, + Species.SCRAFTY, Species.TIRTOUGA, Species.CARRACOSTA, Species.GARBODOR, Species.ZOROARK, Species.GOTHITELLE, + Species.REUNICLUS, Species.DEERLING, Species.SAWSBUCK, Species.FOONGUS, @@ -2216,6 +2231,7 @@ export const tmSpecies: TmSpecies = { Species.SHELMET, Species.ACCELGOR, Species.DRUDDIGON, + Species.GOLETT, Species.GOLURK, Species.BOUFFALANT, Species.RUFFLET, @@ -2226,9 +2242,15 @@ export const tmSpecies: TmSpecies = { Species.HYDREIGON, Species.LARVESTA, Species.VOLCARONA, + Species.COBALION, + Species.TERRAKION, + Species.VIRIZION, Species.TORNADUS, Species.THUNDURUS, + Species.RESHIRAM, + Species.ZEKROM, Species.LANDORUS, + Species.KYUREM, Species.CHESPIN, Species.QUILLADIN, Species.CHESNAUGHT, @@ -2261,18 +2283,17 @@ export const tmSpecies: TmSpecies = { Species.LITTEN, Species.TORRACAT, Species.INCINEROAR, + Species.BRIONNE, + Species.PRIMARINA, Species.GUMSHOOS, Species.CRABRAWLER, Species.CRABOMINABLE, Species.ROCKRUFF, - [ - Species.LYCANROC, - "midday", - "midnight", - ], + Species.LYCANROC, Species.TOXAPEX, Species.MUDBRAY, Species.MUDSDALE, + Species.ARAQUANID, Species.SALAZZLE, Species.BEWEAR, Species.ORANGURU, @@ -2283,10 +2304,12 @@ export const tmSpecies: TmSpecies = { Species.JANGMO_O, Species.HAKAMO_O, Species.KOMMO_O, + Species.SOLGALEO, Species.NIHILEGO, Species.BUZZWOLE, Species.CELESTEELA, Species.GUZZLORD, + Species.NECROZMA, Species.MAGEARNA, Species.STAKATAKA, Species.MELMETAL, @@ -3648,6 +3671,7 @@ export const tmSpecies: TmSpecies = { Species.SPINARAK, Species.ARIADOS, Species.PINECO, + Species.FORRETRESS, Species.QWILFISH, Species.HERACROSS, Species.ZIGZAGOON, @@ -4258,6 +4282,7 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.PANPOUR, + Species.SIMIPOUR, Species.DRILBUR, Species.EXCADRILL, Species.TYMPOLE, @@ -4288,6 +4313,7 @@ export const tmSpecies: TmSpecies = { Species.WISHIWASHI, Species.MAREANIE, Species.TOXAPEX, + Species.DEWPIDER, Species.ARAQUANID, Species.BRUXISH, Species.DRAMPA, @@ -4328,7 +4354,10 @@ export const tmSpecies: TmSpecies = { Species.ROARING_MOON, Species.WALKING_WAKE, Species.HYDRAPPLE, - Species.ROTOM, + [ + Species.ROTOM, + "wash", + ], Species.GALAR_SLOWPOKE, Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, @@ -5148,7 +5177,10 @@ export const tmSpecies: TmSpecies = { Species.ARCTIBAX, Species.BAXCALIBUR, Species.CHIEN_PAO, - Species.ROTOM, + [ + Species.ROTOM, + "frost", + ], Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_SANDSHREW, @@ -5909,6 +5941,8 @@ export const tmSpecies: TmSpecies = { Species.MACHAMP, Species.PONYTA, Species.RAPIDASH, + Species.DODUO, + Species.DODRIO, Species.DROWZEE, Species.HYPNO, Species.EXEGGUTOR, @@ -6119,6 +6153,229 @@ export const tmSpecies: TmSpecies = { Species.PALDEA_WOOPER, Species.BLOODMOON_URSALUNA, ], + [Moves.COUNTER]: [ + Species.CHARMANDER, + Species.CHARMELEON, + Species.CHARIZARD, + Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, + Species.RATTATA, + Species.RATICATE, + Species.PIKACHU, + Species.RAICHU, + Species.SANDSHREW, + Species.SANDSLASH, + Species.NIDORAN_F, + Species.NIDORINA, + Species.NIDOQUEEN, + Species.NIDORAN_M, + Species.NIDORINO, + Species.NIDOKING, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.PARAS, + Species.PARASECT, + Species.PSYDUCK, + Species.GOLDUCK, + Species.MANKEY, + Species.PRIMEAPE, + Species.POLIWHIRL, + Species.POLIWRATH, + Species.ABRA, + Species.KADABRA, + Species.ALAKAZAM, + Species.MACHOP, + Species.MACHOKE, + Species.MACHAMP, + Species.GEODUDE, + Species.GRAVELER, + Species.GOLEM, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.GENGAR, + Species.DROWZEE, + Species.HYPNO, + Species.CUBONE, + Species.MAROWAK, + Species.HITMONLEE, + Species.HITMONCHAN, + Species.LICKITUNG, + Species.RHYHORN, + Species.RHYDON, + Species.CHANSEY, + Species.KANGASKHAN, + Species.MR_MIME, + Species.SCYTHER, + Species.JYNX, + Species.ELECTABUZZ, + Species.MAGMAR, + Species.SNORLAX, + Species.MEWTWO, + Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.LEDYBA, + Species.LEDIAN, + Species.TOGEPI, + Species.TOGETIC, + Species.MAREEP, + Species.FLAAFFY, + Species.AMPHAROS, + Species.SUDOWOODO, + Species.WOOPER, + Species.QUAGSIRE, + Species.WOBBUFFET, + Species.PINECO, + Species.FORRETRESS, + Species.DUNSPARCE, + Species.GLIGAR, + Species.SNUBBULL, + Species.GRANBULL, + Species.HERACROSS, + Species.SNEASEL, + Species.TEDDIURSA, + Species.URSARING, + Species.DELIBIRD, + Species.SKARMORY, + Species.HOUNDOUR, + Species.HOUNDOOM, + Species.PHANPY, + Species.DONPHAN, + Species.MILTANK, + Species.TYRANITAR, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.TORCHIC, + Species.COMBUSKEN, + Species.BLAZIKEN, + Species.MUDKIP, + Species.MARSHTOMP, + Species.SWAMPERT, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.ZIGZAGOON, + Species.LINOONE, + Species.LOTAD, + Species.LOMBRE, + Species.LUDICOLO, + Species.TAILLOW, + Species.SWELLOW, + Species.BRELOOM, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.WHISMUR, + Species.LOUDRED, + Species.EXPLOUD, + Species.MAKUHITA, + Species.HARIYAMA, + Species.SABLEYE, + Species.MAWILE, + Species.AGGRON, + Species.MEDITITE, + Species.MEDICHAM, + Species.PLUSLE, + Species.MINUN, + Species.VOLBEAT, + Species.ILLUMISE, + Species.GULPIN, + Species.SWALOT, + Species.GRUMPIG, + Species.SPINDA, + Species.CACNEA, + Species.CACTURNE, + Species.ZANGOOSE, + Species.CORPHISH, + Species.CRAWDAUNT, + Species.KECLEON, + Species.DUSKULL, + Species.DUSCLOPS, + Species.ABSOL, + Species.REGIROCK, + Species.REGICE, + Species.REGISTEEL, + Species.GROUDON, + Species.DEOXYS, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.SHIELDON, + Species.BASTIODON, + Species.RIOLU, + Species.LUCARIO, + Species.SHELLOS, + Species.GASTRODON, + Species.CROAGUNK, + Species.TOXICROAK, + Species.TIMBURR, + Species.GURDURR, + Species.CONKELDURR, + Species.SAWK, + Species.SANDILE, + Species.KROKOROK, + Species.KROOKODILE, + Species.DWEBBLE, + Species.CRUSTLE, + Species.SCRAGGY, + Species.SCRAFTY, + Species.ZORUA, + Species.ZOROARK, + Species.KARRABLAST, + Species.ESCAVALIER, + Species.ACCELGOR, + Species.AXEW, + Species.FRAXURE, + Species.HAXORUS, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.GOOMY, + Species.SLIGGOO, + Species.GOODRA, + Species.LYCANROC, + Species.MUDBRAY, + Species.MUDSDALE, + Species.PASSIMIAN, + Species.PYUKUMUKU, + Species.JANGMO_O, + Species.HAKAMO_O, + Species.KOMMO_O, + Species.BUZZWOLE, + Species.MARSHADOW, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SKWOVET, + Species.GREEDENT, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.FALINKS, + Species.KUBFU, + Species.URSHIFU, + Species.QUAQUAVAL, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.FINIZEN, + Species.PALAFIN, + Species.TATSUGIRI, + Species.KORAIDON, + Species.OKIDOGI, + Species.OGERPON, + Species.IRON_BOULDER, + ], [Moves.STRENGTH]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -6885,6 +7142,7 @@ export const tmSpecies: TmSpecies = { Species.HEATRAN, Species.VICTINI, Species.PANSEAR, + Species.SIMISEAR, Species.DARUMAKA, Species.DARMANITAN, Species.LITWICK, @@ -9950,6 +10208,8 @@ export const tmSpecies: TmSpecies = { Species.ZORUA, Species.ZOROARK, Species.SOLOSIS, + Species.DUOSION, + Species.REUNICLUS, Species.FRILLISH, Species.JELLICENT, Species.LITWICK, @@ -9961,6 +10221,7 @@ export const tmSpecies: TmSpecies = { Species.PHANTUMP, Species.TREVENANT, Species.ROWLET, + Species.DARTRIX, Species.DECIDUEYE, Species.SANDYGAST, Species.PALOSSAND, @@ -10003,6 +10264,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZORUA, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY, + Species.HISUI_DECIDUEYE, ], [Moves.SCREECH]: [ Species.RATTATA, @@ -11309,6 +11571,7 @@ export const tmSpecies: TmSpecies = { Species.PSYDUCK, Species.GOLDUCK, Species.TENTACOOL, + Species.TENTACRUEL, Species.MAGNEMITE, Species.MAGNETON, Species.GRIMER, @@ -11364,6 +11627,9 @@ export const tmSpecies: TmSpecies = { Species.DUSKULL, Species.DUSCLOPS, Species.CLAMPERL, + Species.HUNTAIL, + Species.GOREBYSS, + Species.JIRACHI, Species.SHINX, Species.LUXIO, Species.LUXRAY, @@ -11375,6 +11641,7 @@ export const tmSpecies: TmSpecies = { Species.MIME_JR, Species.SPIRITOMB, Species.SKORUPI, + Species.DRAPION, Species.FINNEON, Species.LUMINEON, Species.MANTYKE, @@ -11389,17 +11656,23 @@ export const tmSpecies: TmSpecies = { Species.REGIGIGAS, Species.GIRATINA, Species.CRESSELIA, + Species.DARKRAI, Species.ARCEUS, Species.WATCHOG, Species.ZORUA, Species.ZOROARK, Species.SOLOSIS, + Species.DUOSION, + Species.REUNICLUS, Species.FRILLISH, + Species.JELLICENT, Species.EELEKTROSS, Species.LITWICK, Species.LAMPENT, Species.CHANDELURE, Species.CRYOGONAL, + Species.GOLETT, + Species.GOLURK, Species.DELPHOX, Species.VIVILLON, Species.PHANTUMP, @@ -11407,6 +11680,7 @@ export const tmSpecies: TmSpecies = { Species.PUMPKABOO, Species.GOURGEIST, Species.ROWLET, + Species.DARTRIX, Species.DECIDUEYE, Species.MORELULL, Species.SHIINOTIC, @@ -11420,7 +11694,11 @@ export const tmSpecies: TmSpecies = { Species.ORBEETLE, Species.SINISTEA, Species.POLTEAGEIST, + Species.CURSOLA, + Species.MR_RIME, Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, Species.ETERNATUS, Species.SPECTRIER, Species.WYRDEER, @@ -11465,6 +11743,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZORUA, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY, + Species.HISUI_DECIDUEYE, ], [Moves.LIGHT_SCREEN]: [ Species.BULBASAUR, @@ -11796,6 +12075,8 @@ export const tmSpecies: TmSpecies = { ], [Moves.HAZE]: [ Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, Species.EKANS, Species.ARBOK, Species.ZUBAT, @@ -11808,6 +12089,9 @@ export const tmSpecies: TmSpecies = { Species.TENTACOOL, Species.TENTACRUEL, Species.DODUO, + Species.DODRIO, + Species.SEEL, + Species.DEWGONG, Species.GRIMER, Species.MUK, Species.GASTLY, @@ -11816,11 +12100,15 @@ export const tmSpecies: TmSpecies = { Species.DROWZEE, Species.HYPNO, Species.KRABBY, + Species.KINGLER, Species.KOFFING, Species.WEEZING, Species.GOLDEEN, + Species.SEAKING, + Species.LAPRAS, Species.VAPOREON, Species.OMANYTE, + Species.OMASTAR, Species.ARTICUNO, Species.DRATINI, Species.DRAGONAIR, @@ -11830,6 +12118,7 @@ export const tmSpecies: TmSpecies = { Species.NOCTOWL, Species.CROBAT, Species.NATU, + Species.XATU, Species.POLITOED, Species.WOOPER, Species.QUAGSIRE, @@ -11838,6 +12127,7 @@ export const tmSpecies: TmSpecies = { Species.SWINUB, Species.PILOSWINE, Species.REMORAID, + Species.OCTILLERY, Species.DELIBIRD, Species.MANTINE, Species.SURSKIT, @@ -11868,20 +12158,24 @@ export const tmSpecies: TmSpecies = { Species.YAMASK, Species.COFAGRIGUS, Species.TRUBBISH, + Species.GARBODOR, Species.LITWICK, Species.LAMPENT, Species.CHANDELURE, Species.CRYOGONAL, + Species.ZEKROM, Species.GRENINJA, Species.SKRELP, Species.DRAGALGE, Species.AMAURA, + Species.AURORUS, Species.TREVENANT, Species.ZYGARDE, Species.VOLCANION, Species.ROWLET, Species.DARTRIX, Species.DECIDUEYE, + Species.PRIMARINA, Species.MAREANIE, Species.TOXAPEX, Species.TAPU_FINI, @@ -13637,6 +13931,7 @@ export const tmSpecies: TmSpecies = { Species.MAMOSWINE, Species.UXIE, Species.PANSEAR, + Species.SIMISEAR, Species.MUNNA, Species.MUSHARNA, Species.WOOBAT, @@ -15924,6 +16219,8 @@ export const tmSpecies: TmSpecies = { Species.ZIGZAGOON, Species.LINOONE, Species.MAWILE, + Species.PLUSLE, + Species.MINUN, Species.CARVANHA, Species.SHARPEDO, Species.GLALIE, @@ -15945,6 +16242,8 @@ export const tmSpecies: TmSpecies = { Species.SWOOBAT, Species.SCRAGGY, Species.SCRAFTY, + Species.MINCCINO, + Species.CINCCINO, Species.EELEKTRIK, Species.EELEKTROSS, Species.CHESPIN, @@ -18900,6 +19199,7 @@ export const tmSpecies: TmSpecies = { ], [Moves.REVERSAL]: [ Species.RATTATA, + Species.RATICATE, Species.PIKACHU, Species.RAICHU, Species.DIGLETT, @@ -18913,6 +19213,7 @@ export const tmSpecies: TmSpecies = { Species.MACHOKE, Species.MACHAMP, Species.HITMONLEE, + Species.HITMONCHAN, Species.RHYHORN, Species.RHYDON, Species.KANGASKHAN, @@ -18930,6 +19231,8 @@ export const tmSpecies: TmSpecies = { Species.YANMA, Species.PINECO, Species.FORRETRESS, + Species.SNUBBULL, + Species.GRANBULL, Species.QWILFISH, Species.SCIZOR, Species.SHUCKLE, @@ -18938,8 +19241,10 @@ export const tmSpecies: TmSpecies = { Species.SWINUB, Species.PILOSWINE, Species.DELIBIRD, + Species.SKARMORY, Species.HOUNDOUR, Species.HOUNDOOM, + Species.HITMONTOP, Species.MILTANK, Species.ENTEI, Species.TORCHIC, @@ -18968,11 +19273,14 @@ export const tmSpecies: TmSpecies = { Species.LUCARIO, Species.CROAGUNK, Species.TOXICROAK, + Species.WEAVILE, Species.RHYPERIOR, Species.YANMEGA, Species.MAMOSWINE, Species.GALLADE, Species.VICTINI, + Species.PIGNITE, + Species.EMBOAR, Species.LILLIPUP, Species.HERDIER, Species.STOUTLAND, @@ -18983,6 +19291,7 @@ export const tmSpecies: TmSpecies = { Species.SAWK, Species.BASCULIN, Species.DARMANITAN, + Species.SCRAFTY, Species.ESCAVALIER, Species.AXEW, Species.FRAXURE, @@ -19014,6 +19323,11 @@ export const tmSpecies: TmSpecies = { Species.CRABRAWLER, Species.CRABOMINABLE, Species.ORICORIO, + [ + Species.LYCANROC, + "midnight", + "dusk", + ], Species.BEWEAR, Species.PASSIMIAN, Species.SILVALLY, @@ -19070,6 +19384,7 @@ export const tmSpecies: TmSpecies = { Species.OGERPON, Species.GOUGING_FIRE, Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, @@ -25582,7 +25897,100 @@ export const tmSpecies: TmSpecies = { Species.DRAGAPULT, Species.KUBFU, Species.URSHIFU, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.DIPPLIN, + Species.OKIDOGI, + Species.MUNKIDORI, Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.TERAPAGOS, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -25618,6 +26026,23 @@ export const tmSpecies: TmSpecies = { Species.GALAR_DARMANITAN, Species.GALAR_YAMASK, Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.SLEEP_TALK]: [ Species.BULBASAUR, @@ -26515,6 +26940,8 @@ export const tmSpecies: TmSpecies = { Species.FUECOCO, Species.CROCALOR, Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, Species.QUAQUAVAL, Species.LECHONK, Species.OINKOLOGNE, @@ -26591,10 +27018,12 @@ export const tmSpecies: TmSpecies = { Species.FLUTTER_MANE, Species.SLITHER_WING, Species.SANDY_SHOCKS, + Species.IRON_TREADS, Species.IRON_BUNDLE, Species.IRON_HANDS, Species.IRON_JUGULIS, Species.IRON_MOTH, + Species.IRON_THORNS, Species.FRIGIBAX, Species.ARCTIBAX, Species.BAXCALIBUR, @@ -26683,6 +27112,89 @@ export const tmSpecies: TmSpecies = { Species.PALDEA_WOOPER, Species.BLOODMOON_URSALUNA, ], + [Moves.HEAL_BELL]: [ + Species.CLEFAIRY, + Species.CLEFABLE, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.LICKITUNG, + Species.CHANSEY, + Species.JYNX, + Species.LAPRAS, + Species.EEVEE, + Species.VAPOREON, + Species.JOLTEON, + Species.FLAREON, + Species.ARTICUNO, + Species.DRAGONITE, + Species.MEW, + Species.CHINCHOU, + Species.LANTURN, + Species.IGGLYBUFF, + Species.TOGEPI, + Species.TOGETIC, + Species.MAREEP, + Species.FLAAFFY, + Species.AMPHAROS, + Species.ESPEON, + Species.UMBREON, + Species.MISDREAVUS, + Species.SNUBBULL, + Species.GRANBULL, + Species.SMOOCHUM, + Species.MILTANK, + Species.BLISSEY, + Species.CELEBI, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.GARDEVOIR, + Species.SKITTY, + Species.DELCATTY, + Species.SPOINK, + Species.GRUMPIG, + Species.SWABLU, + Species.ALTARIA, + Species.CHIMECHO, + Species.KRICKETUNE, + Species.BUNEARY, + Species.LOPUNNY, + Species.MISMAGIUS, + Species.CHINGLING, + Species.HAPPINY, + Species.LICKILICKY, + Species.TOGEKISS, + Species.LEAFEON, + Species.GLACEON, + Species.UXIE, + Species.PHIONE, + Species.MANAPHY, + Species.MUNNA, + Species.MUSHARNA, + Species.AUDINO, + Species.PETILIL, + Species.LILLIGANT, + Species.GOTHITA, + Species.GOTHORITA, + Species.GOTHITELLE, + Species.MELOETTA, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.ESPURR, + Species.MEOWSTIC, + Species.SPRITZEE, + Species.AROMATISSE, + Species.SWIRLIX, + Species.SLURPUFF, + Species.SYLVEON, + Species.DIANCIE, + Species.COMFEY, + Species.MAGEARNA, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.HISUI_LILLIGANT, + Species.ETERNAL_FLOETTE, + ], [Moves.RETURN]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -29293,6 +29805,7 @@ export const tmSpecies: TmSpecies = { Species.GREAT_TUSK, Species.IRON_TREADS, Species.IRON_LEAVES, + Species.IRON_BOULDER, Species.GALAR_RAPIDASH, [ Species.CALYREX, @@ -29515,17 +30028,20 @@ export const tmSpecies: TmSpecies = { Species.GENGAR, Species.DROWZEE, Species.HYPNO, + Species.HITMONCHAN, Species.MR_MIME, Species.JYNX, Species.SNORLAX, Species.DRAGONITE, Species.MEW, Species.LEDYBA, + Species.LEDIAN, Species.PICHU, Species.CLEFFA, Species.IGGLYBUFF, Species.TOGEPI, Species.TOGETIC, + Species.BELLOSSOM, Species.MARILL, Species.AZUMARILL, Species.POLITOED, @@ -29537,6 +30053,8 @@ export const tmSpecies: TmSpecies = { Species.WOOPER, Species.QUAGSIRE, Species.WOBBUFFET, + Species.SNUBBULL, + Species.GRANBULL, Species.SHUCKLE, Species.PHANPY, Species.DONPHAN, @@ -29600,6 +30118,8 @@ export const tmSpecies: TmSpecies = { Species.LILLIGANT, Species.DARUMAKA, Species.DARMANITAN, + Species.SCRAGGY, + Species.SCRAFTY, Species.ZORUA, Species.ZOROARK, Species.MINCCINO, @@ -29626,6 +30146,7 @@ export const tmSpecies: TmSpecies = { Species.POPPLIO, Species.BRIONNE, Species.PRIMARINA, + Species.TOUCANNON, Species.SALAZZLE, Species.COMFEY, Species.ORANGURU, @@ -29636,10 +30157,14 @@ export const tmSpecies: TmSpecies = { Species.TOXTRICITY, Species.MR_RIME, Species.ALCREMIE, - Species.INDEEDEE, + [ + Species.INDEEDEE, + "male", + ], Species.ZARUDE, Species.CALYREX, Species.FUECOCO, + Species.CROCALOR, Species.SKELEDIRGE, Species.QUAXLY, Species.QUAXWELL, @@ -29982,8 +30507,13 @@ export const tmSpecies: TmSpecies = { Species.ZACIAN, Species.ZAMAZENTA, Species.ZARUDE, + Species.WYRDEER, + Species.SNEASLER, Species.CYCLIZAR, Species.ORTHWORM, + Species.ANNIHILAPE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -30003,6 +30533,10 @@ export const tmSpecies: TmSpecies = { Species.GALAR_SLOWKING, Species.GALAR_ZIGZAGOON, Species.GALAR_LINOONE, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_TYPHLOSION, + Species.HISUI_SLIGGOO, Species.HISUI_GOODRA, ], [Moves.METAL_CLAW]: [ @@ -30111,6 +30645,118 @@ export const tmSpecies: TmSpecies = { Species.HISUI_BRAVIARY, Species.BLOODMOON_URSALUNA, ], + [Moves.SYNTHESIS]: [ + Species.BULBASAUR, + Species.IVYSAUR, + Species.VENUSAUR, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, + Species.PARAS, + Species.PARASECT, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, + Species.EXEGGCUTE, + Species.EXEGGUTOR, + Species.TANGELA, + Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.BELLOSSOM, + Species.HOPPIP, + Species.SKIPLOOM, + Species.JUMPLUFF, + Species.SUNKERN, + Species.SUNFLORA, + Species.CELEBI, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.LOTAD, + Species.LOMBRE, + Species.LUDICOLO, + Species.SEEDOT, + Species.NUZLEAF, + Species.SHIFTRY, + Species.SHROOMISH, + Species.BRELOOM, + Species.ROSELIA, + Species.CACNEA, + Species.CACTURNE, + Species.LILEEP, + Species.CRADILY, + Species.TROPIUS, + Species.TURTWIG, + Species.GROTLE, + Species.TORTERRA, + Species.BUDEW, + Species.ROSERADE, + [ + Species.WORMADAM, + "plant", + ], + Species.CHERUBI, + Species.CHERRIM, + Species.CARNIVINE, + Species.SNOVER, + Species.ABOMASNOW, + Species.TANGROWTH, + Species.LEAFEON, + Species.SHAYMIN, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.PANSAGE, + Species.SIMISAGE, + Species.SEWADDLE, + Species.SWADLOON, + Species.LEAVANNY, + Species.PETILIL, + Species.LILLIGANT, + Species.MARACTUS, + Species.DEERLING, + Species.SAWSBUCK, + Species.FOONGUS, + Species.AMOONGUSS, + Species.VIRIZION, + Species.CHESPIN, + Species.QUILLADIN, + Species.CHESNAUGHT, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.SKIDDO, + Species.GOGOAT, + Species.PUMPKABOO, + Species.GOURGEIST, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.FOMANTIS, + Species.LURANTIS, + Species.MORELULL, + Species.SHIINOTIC, + Species.BOUNSWEET, + Species.STEENEE, + Species.TSAREENA, + Species.COMFEY, + Species.DHELMISE, + Species.TAPU_BULU, + Species.KARTANA, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.ZARUDE, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.BRUTE_BONNET, + Species.OGERPON, + Species.ALOLA_EXEGGUTOR, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, + ], [Moves.HIDDEN_POWER]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -32748,8 +33394,11 @@ export const tmSpecies: TmSpecies = { Species.HERDIER, Species.STOUTLAND, Species.PANSAGE, + Species.SIMISAGE, Species.PANSEAR, + Species.SIMISAGE, Species.PANPOUR, + Species.SIMIPOUR, Species.BASCULIN, Species.SANDILE, Species.KROKOROK, @@ -34138,6 +34787,7 @@ export const tmSpecies: TmSpecies = { Species.LOTAD, Species.LOMBRE, Species.LUDICOLO, + Species.WINGULL, Species.PELIPPER, Species.EXPLOUD, Species.MAKUHITA, @@ -34187,17 +34837,25 @@ export const tmSpecies: TmSpecies = { Species.PHIONE, Species.MANAPHY, Species.ARCEUS, + Species.OSHAWOTT, + Species.DEWOTT, + Species.SAMUROTT, Species.BASCULIN, Species.TIRTOUGA, Species.CARRACOSTA, + Species.DUCKLETT, + Species.SWANNA, Species.FRILLISH, Species.JELLICENT, Species.ALOMOMOLA, Species.BARBARACLE, + Species.SKRELP, + Species.DRAGALGE, Species.POPPLIO, Species.BRIONNE, Species.PRIMARINA, Species.WISHIWASHI, + Species.BRUXISH, Species.DHELMISE, Species.TAPU_FINI, Species.SOBBLE, @@ -34214,7 +34872,16 @@ export const tmSpecies: TmSpecies = { Species.EISCUE, Species.DRACOVISH, Species.ARCTOVISH, + Species.BASCULEGION, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.WIGLETT, + Species.WUGTRIO, + Species.PALAFIN, + Species.TATSUGIRI, Species.IRON_BUNDLE, + Species.WALKING_WAKE, Species.GALAR_SLOWPOKE, Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, @@ -34225,12 +34892,18 @@ export const tmSpecies: TmSpecies = { Species.URSHIFU, "rapid-strike", ], + Species.HISUI_SAMUROTT, + [ + Species.PALDEA_TAUROS, + "aqua", + ], ], [Moves.BEAT_UP]: [ Species.CHARMANDER, Species.CHARMELEON, Species.CHARIZARD, Species.EKANS, + Species.ARBOK, Species.NIDORAN_F, Species.NIDORINA, Species.NIDOQUEEN, @@ -34240,6 +34913,7 @@ export const tmSpecies: TmSpecies = { Species.DIGLETT, Species.DUGTRIO, Species.MANKEY, + Species.PRIMEAPE, Species.KANGASKHAN, Species.MEW, Species.AIPOM, @@ -34283,6 +34957,10 @@ export const tmSpecies: TmSpecies = { Species.TANDEMAUS, Species.MAUSHOLD, Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.ANNIHILAPE, + Species.FARIGIRAF, + Species.KINGAMBIT, Species.FEZANDIPITI, Species.PIKACHU, Species.ALOLA_DIGLETT, @@ -36457,6 +37135,7 @@ export const tmSpecies: TmSpecies = { Species.SCEPTILE, Species.COMBUSKEN, Species.BLAZIKEN, + Species.MARSHTOMP, Species.SWAMPERT, Species.LUDICOLO, Species.SHROOMISH, @@ -36547,6 +37226,7 @@ export const tmSpecies: TmSpecies = { Species.GOLETT, Species.GOLURK, Species.HEATMOR, + Species.ZEKROM, Species.MELOETTA, Species.CHESPIN, Species.QUILLADIN, @@ -36573,9 +37253,11 @@ export const tmSpecies: TmSpecies = { Species.ZERAORA, Species.RILLABOOM, Species.GRIMMSNARL, + Species.MR_RIME, Species.KUBFU, Species.URSHIFU, Species.ZARUDE, + Species.URSALUNA, Species.SNEASLER, Species.PAWMO, Species.PAWMOT, @@ -36598,7 +37280,9 @@ export const tmSpecies: TmSpecies = { Species.LYCANROC, "midnight", ], + Species.GALAR_MR_MIME, Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, Species.HISUI_TYPHLOSION, Species.HISUI_SNEASEL, Species.HISUI_ZORUA, @@ -36747,12 +37431,18 @@ export const tmSpecies: TmSpecies = { Species.TAPU_FINI, Species.XURKITREE, Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.CURSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_GRAVELER, Species.ALOLA_GOLEM, Species.ALOLA_EXEGGUTOR, Species.ETERNAL_FLOETTE, Species.GALAR_CORSOLA, + Species.HISUI_TYPHLOSION, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, ], [Moves.CHARGE]: [ Species.PIKACHU, @@ -38153,9 +38843,128 @@ export const tmSpecies: TmSpecies = { ], Species.HISUI_BRAVIARY, ], + [Moves.RECYCLE]: [ + Species.CLEFAIRY, + Species.CLEFABLE, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.ABRA, + Species.KADABRA, + Species.ALAKAZAM, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.MAGNEMITE, + Species.MAGNETON, + Species.DROWZEE, + Species.HYPNO, + Species.VOLTORB, + Species.ELECTRODE, + Species.CHANSEY, + Species.STARYU, + Species.STARMIE, + Species.MR_MIME, + Species.JYNX, + Species.PORYGON, + Species.SNORLAX, + Species.MEWTWO, + Species.MEW, + Species.HOOTHOOT, + Species.NOCTOWL, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.SLOWKING, + Species.GIRAFARIG, + Species.DELIBIRD, + Species.PORYGON2, + Species.SMOOCHUM, + Species.BLISSEY, + Species.RALTS, + Species.KIRLIA, + Species.GARDEVOIR, + Species.MEDITITE, + Species.MEDICHAM, + Species.SPOINK, + Species.GRUMPIG, + Species.SPINDA, + Species.LUNATONE, + Species.SOLROCK, + Species.BALTOY, + Species.CLAYDOL, + Species.KECLEON, + Species.CHIMECHO, + Species.JIRACHI, + Species.DEOXYS, + Species.DRIFLOON, + Species.DRIFBLIM, + Species.CHINGLING, + Species.BRONZOR, + Species.BRONZONG, + Species.MIME_JR, + Species.HAPPINY, + Species.MUNCHLAX, + Species.MAGNEZONE, + Species.PORYGON_Z, + Species.GALLADE, + Species.UXIE, + Species.MESPRIT, + Species.AZELF, + Species.CRESSELIA, + Species.ARCEUS, + Species.PANSAGE, + Species.SIMISAGE, + Species.PANSEAR, + Species.SIMISEAR, + Species.PANPOUR, + Species.SIMIPOUR, + Species.TRUBBISH, + Species.GARBODOR, + Species.GOTHITA, + Species.GOTHORITA, + Species.GOTHITELLE, + Species.KLINK, + Species.KLANG, + Species.KLINKLANG, + Species.ELGYEM, + Species.BEHEEYEM, + Species.HEATMOR, + Species.MELOETTA, + Species.GENESECT, + Species.BRAIXEN, + Species.DELPHOX, + Species.BUNNELBY, + Species.DIGGERSBY, + Species.ESPURR, + Species.MEOWSTIC, + Species.DEDENNE, + Species.KLEFKI, + Species.HOOPA, + Species.MORELULL, + Species.SHIINOTIC, + Species.SANDYGAST, + Species.PALOSSAND, + Species.PYUKUMUKU, + Species.NECROZMA, + Species.STAKATAKA, + Species.BLACEPHALON, + Species.APPLIN, + Species.FLAPPLE, + Species.APPLETUN, + Species.MR_RIME, + Species.FARIGIRAF, + Species.DIPPLIN, + Species.HYDRAPPLE, + Species.ALOLA_RAICHU, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + Species.GALAR_MR_MIME, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + ], [Moves.REVENGE]: [ Species.RATTATA, + Species.RATICATE, Species.MANKEY, + Species.PRIMEAPE, Species.MACHOP, Species.MACHOKE, Species.MACHAMP, @@ -38167,6 +38976,7 @@ export const tmSpecies: TmSpecies = { Species.MEW, Species.AIPOM, Species.PINECO, + Species.FORRETRESS, Species.QWILFISH, Species.HERACROSS, Species.HITMONTOP, @@ -38175,12 +38985,16 @@ export const tmSpecies: TmSpecies = { Species.BLAZIKEN, Species.SHIFTRY, Species.MAKUHITA, + Species.HARIYAMA, Species.CACTURNE, Species.ZANGOOSE, Species.CRAWDAUNT, Species.DUSKULL, Species.DUSCLOPS, Species.STARLY, + Species.STARAVIA, + Species.STARAPTOR, + Species.AMBIPOM, Species.VESPIQUEN, Species.RIOLU, Species.LUCARIO, @@ -38196,6 +39010,7 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.PATRAT, + Species.WATCHOG, Species.TIMBURR, Species.GURDURR, Species.CONKELDURR, @@ -38231,6 +39046,7 @@ export const tmSpecies: TmSpecies = { Species.TORRACAT, Species.INCINEROAR, Species.YUNGOOS, + Species.GUMSHOOS, Species.MUDSDALE, Species.BEWEAR, Species.PASSIMIAN, @@ -38263,13 +39079,18 @@ export const tmSpecies: TmSpecies = { Species.KUBFU, Species.URSHIFU, Species.ZARUDE, + Species.BASCULEGION, + Species.ANNIHILAPE, + Species.KINGAMBIT, Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, [ Species.LYCANROC, "midnight", ], Species.GALAR_FARFETCHD, Species.GALAR_ZAPDOS, + Species.HISUI_SAMUROTT, Species.GALAR_STUNFISK, ], [Moves.BRICK_BREAK]: [ @@ -38685,6 +39506,8 @@ export const tmSpecies: TmSpecies = { Species.GOLDEEN, Species.SEAKING, Species.SCYTHER, + Species.ELECTABUZZ, + Species.MAGMAR, Species.PINSIR, Species.OMANYTE, Species.OMASTAR, @@ -38692,6 +39515,8 @@ export const tmSpecies: TmSpecies = { Species.KABUTOPS, Species.MEWTWO, Species.MEW, + Species.BAYLEEF, + Species.MEGANIUM, Species.SENTRET, Species.FURRET, Species.LEDYBA, @@ -38708,8 +39533,10 @@ export const tmSpecies: TmSpecies = { Species.SNEASEL, Species.PHANPY, Species.DONPHAN, + Species.ELEKID, Species.TYRANITAR, Species.BLAZIKEN, + Species.SWAMPERT, Species.LOMBRE, Species.LUDICOLO, Species.NUZLEAF, @@ -38740,12 +39567,7 @@ export const tmSpecies: TmSpecies = { Species.CHIMECHO, Species.ABSOL, Species.METAGROSS, - [ - Species.DEOXYS, - "", - "defense", - "speed", - ], + Species.DEOXYS, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -38767,6 +39589,8 @@ export const tmSpecies: TmSpecies = { Species.WEAVILE, Species.LICKILICKY, Species.TANGROWTH, + Species.ELECTIVIRE, + Species.MAGMORTAR, Species.LEAFEON, Species.GLISCOR, Species.MAMOSWINE, @@ -38781,6 +39605,8 @@ export const tmSpecies: TmSpecies = { Species.SNIVY, Species.SERVINE, Species.SERPERIOR, + Species.PIGNITE, + Species.EMBOAR, Species.OSHAWOTT, Species.DEWOTT, Species.SAMUROTT, @@ -38837,6 +39663,8 @@ export const tmSpecies: TmSpecies = { Species.ACCELGOR, Species.MIENFOO, Species.MIENSHAO, + Species.GOLETT, + Species.GOLURK, Species.PAWNIARD, Species.BISHARP, Species.VULLABY, @@ -38873,6 +39701,7 @@ export const tmSpecies: TmSpecies = { Species.SALAZZLE, Species.STEENEE, Species.TSAREENA, + Species.COMFEY, Species.ORANGURU, Species.PASSIMIAN, Species.GOLISOPOD, @@ -38945,6 +39774,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_FARFETCHD, Species.GALAR_ZAPDOS, Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, Species.HISUI_SAMUROTT, Species.HISUI_ZORUA, Species.HISUI_ZOROARK, @@ -39754,6 +40584,7 @@ export const tmSpecies: TmSpecies = { Species.XATU, Species.MURKROW, Species.DELIBIRD, + Species.LUGIA, Species.TORCHIC, Species.COMBUSKEN, Species.BLAZIKEN, @@ -39810,6 +40641,8 @@ export const tmSpecies: TmSpecies = { Species.COMBUSKEN, Species.BLAZIKEN, Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, Species.RIOLU, Species.LUCARIO, Species.VICTINI, @@ -40066,15 +40899,21 @@ export const tmSpecies: TmSpecies = { Species.BLASTOISE, Species.VULPIX, Species.NINETALES, + Species.VILEPLUME, Species.POLIWAG, Species.POLIWHIRL, Species.POLIWRATH, Species.BELLSPROUT, Species.WEEPINBELL, Species.VICTREEBEL, + Species.TENTACRUEL, Species.SLOWPOKE, Species.SLOWBRO, + Species.SEEL, + Species.DEWGONG, Species.CLOYSTER, + Species.HORSEA, + Species.SEADRA, Species.LAPRAS, Species.EEVEE, Species.VAPOREON, @@ -40087,6 +40926,8 @@ export const tmSpecies: TmSpecies = { Species.DRAGONITE, Species.MEWTWO, Species.MEW, + Species.MEGANIUM, + Species.BELLOSSOM, Species.POLITOED, Species.SUNKERN, Species.SUNFLORA, @@ -40094,12 +40935,14 @@ export const tmSpecies: TmSpecies = { Species.UMBREON, Species.SLOWKING, Species.DELIBIRD, + Species.KINGDRA, Species.RAIKOU, Species.ENTEI, Species.SUICUNE, Species.LUGIA, Species.HO_OH, Species.CELEBI, + Species.SWAMPERT, Species.LOTAD, Species.LOMBRE, Species.LUDICOLO, @@ -40119,6 +40962,8 @@ export const tmSpecies: TmSpecies = { Species.CASTFORM, Species.SNORUNT, Species.GLALIE, + Species.LATIAS, + Species.LATIOS, Species.PIPLUP, Species.PRINPLUP, Species.EMPOLEON, @@ -40338,6 +41183,7 @@ export const tmSpecies: TmSpecies = { ], [Moves.AIR_CUTTER]: [ Species.CHARMANDER, + Species.CHARMELEON, Species.CHARIZARD, Species.BUTTERFREE, Species.BEEDRILL, @@ -40393,6 +41239,8 @@ export const tmSpecies: TmSpecies = { Species.ALTARIA, Species.TROPIUS, Species.SALAMENCE, + Species.LATIAS, + Species.LATIOS, Species.EMPOLEON, Species.STARLY, Species.STARAVIA, @@ -40433,6 +41281,9 @@ export const tmSpecies: TmSpecies = { Species.ROWLET, Species.DARTRIX, Species.DECIDUEYE, + Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, Species.ORICORIO, Species.KARTANA, Species.NAGANADEL, @@ -40559,7 +41410,10 @@ export const tmSpecies: TmSpecies = { Species.KORAIDON, Species.MIRAIDON, Species.GOUGING_FIRE, - Species.ROTOM, + [ + Species.ROTOM, + "heat", + ], Species.GALAR_WEEZING, Species.GALAR_DARUMAKA, Species.GALAR_DARMANITAN, @@ -41069,6 +41923,7 @@ export const tmSpecies: TmSpecies = { Species.NATU, Species.XATU, Species.SKITTY, + Species.DELCATTY, Species.LUNATONE, Species.SOLROCK, Species.BALTOY, @@ -41099,6 +41954,7 @@ export const tmSpecies: TmSpecies = { Species.NECROZMA, Species.ETERNATUS, Species.RELLOR, + Species.RABSCA, ], [Moves.SIGNAL_BEAM]: [ Species.BLASTOISE, @@ -41419,6 +42275,7 @@ export const tmSpecies: TmSpecies = { Species.SQUIRTLE, Species.WARTORTLE, Species.BLASTOISE, + Species.PSYDUCK, Species.GOLDUCK, Species.POLIWAG, Species.POLIWHIRL, @@ -41426,16 +42283,24 @@ export const tmSpecies: TmSpecies = { Species.TENTACOOL, Species.TENTACRUEL, Species.SLOWBRO, + Species.SEEL, + Species.DEWGONG, Species.LICKITUNG, Species.HORSEA, Species.SEADRA, Species.GOLDEEN, Species.SEAKING, Species.GYARADOS, + Species.LAPRAS, Species.VAPOREON, Species.OMANYTE, Species.OMASTAR, Species.MEW, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.CHINCHOU, + Species.LANTURN, Species.MARILL, Species.AZUMARILL, Species.POLITOED, @@ -41446,10 +42311,14 @@ export const tmSpecies: TmSpecies = { Species.LARVITAR, Species.PUPITAR, Species.TYRANITAR, + Species.MUDKIP, Species.MARSHTOMP, Species.SWAMPERT, + Species.LOTAD, Species.LOMBRE, Species.LUDICOLO, + Species.WINGULL, + Species.PELIPPER, Species.AZURILL, Species.BARBOACH, Species.WHISCASH, @@ -41460,6 +42329,7 @@ export const tmSpecies: TmSpecies = { Species.CLAMPERL, Species.RELICANTH, Species.KYOGRE, + Species.FLOATZEL, Species.SHELLOS, Species.GASTRODON, Species.HIPPOPOTAS, @@ -41475,6 +42345,8 @@ export const tmSpecies: TmSpecies = { Species.STUNFISK, Species.KELDEO, Species.BARBARACLE, + Species.SKRELP, + Species.DRAGALGE, Species.CLAUNCHER, Species.CLAWITZER, Species.GOOMY, @@ -41493,8 +42365,13 @@ export const tmSpecies: TmSpecies = { Species.CLOBBOPUS, Species.GRAPPLOCT, Species.PINCURCHIN, + Species.BASCULEGION, Species.TADBULB, + Species.BELLIBOLT, + Species.WIGLETT, + Species.WUGTRIO, Species.TATSUGIRI, + Species.CLODSIRE, Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, Species.GALAR_STUNFISK, @@ -41554,7 +42431,6 @@ export const tmSpecies: TmSpecies = { Species.TORTERRA, Species.BUDEW, Species.ROSERADE, - Species.WORMADAM, Species.CHERUBI, Species.CHERRIM, Species.CARNIVINE, @@ -41565,11 +42441,14 @@ export const tmSpecies: TmSpecies = { Species.SHAYMIN, Species.ARCEUS, Species.PATRAT, + Species.WATCHOG, Species.PANSAGE, + Species.SIMISAGE, Species.LEAVANNY, Species.PETILIL, Species.LILLIGANT, Species.MARACTUS, + Species.MINCCINO, Species.CINCCINO, Species.DEERLING, Species.SAWSBUCK, @@ -41632,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, @@ -41995,9 +42878,11 @@ export const tmSpecies: TmSpecies = { ], [Moves.ICICLE_SPEAR]: [ Species.SEEL, + Species.DEWGONG, Species.SHELLDER, Species.CLOYSTER, Species.JYNX, + Species.LAPRAS, Species.ARTICUNO, Species.MEW, Species.SNEASEL, @@ -42421,6 +43306,7 @@ export const tmSpecies: TmSpecies = { Species.MACHAMP, Species.HITMONLEE, Species.HITMONCHAN, + Species.ELECTABUZZ, Species.PINSIR, Species.MEWTWO, Species.MEW, @@ -42454,10 +43340,12 @@ export const tmSpecies: TmSpecies = { Species.LUCARIO, Species.CROAGUNK, Species.TOXICROAK, + Species.ELECTIVIRE, Species.GALLADE, Species.DIALGA, Species.PALKIA, Species.ARCEUS, + Species.PIGNITE, Species.EMBOAR, Species.TIMBURR, Species.GURDURR, @@ -42971,6 +43859,230 @@ export const tmSpecies: TmSpecies = { Species.HISUI_SNEASEL, Species.PALDEA_WOOPER, ], + [Moves.COVET]: [ + Species.RATTATA, + Species.RATICATE, + Species.PIKACHU, + Species.RAICHU, + Species.SANDSHREW, + Species.SANDSLASH, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.VULPIX, + Species.NINETALES, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.MEOWTH, + Species.PERSIAN, + Species.MANKEY, + Species.PRIMEAPE, + Species.GROWLITHE, + Species.ARCANINE, + Species.FARFETCHD, + Species.HITMONLEE, + Species.HITMONCHAN, + Species.CHANSEY, + Species.KANGASKHAN, + Species.MR_MIME, + Species.JYNX, + Species.ELECTABUZZ, + Species.MAGMAR, + Species.EEVEE, + Species.VAPOREON, + Species.JOLTEON, + Species.FLAREON, + Species.SNORLAX, + Species.MEW, + Species.CYNDAQUIL, + Species.QUILAVA, + Species.TYPHLOSION, + Species.SENTRET, + Species.FURRET, + Species.PICHU, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.TOGEPI, + Species.TOGETIC, + Species.MARILL, + Species.AZUMARILL, + Species.SUDOWOODO, + Species.AIPOM, + Species.ESPEON, + Species.UMBREON, + Species.SNUBBULL, + Species.GRANBULL, + Species.SHUCKLE, + Species.TEDDIURSA, + Species.URSARING, + Species.TYROGUE, + Species.HITMONTOP, + Species.SMOOCHUM, + Species.ELEKID, + Species.MAGBY, + Species.BLISSEY, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.ZIGZAGOON, + Species.LINOONE, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.AZURILL, + Species.SKITTY, + Species.DELCATTY, + Species.PLUSLE, + Species.MINUN, + Species.ILLUMISE, + Species.ROSELIA, + Species.SPOINK, + Species.GRUMPIG, + Species.SPINDA, + Species.LATIAS, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.PIPLUP, + Species.PRINPLUP, + Species.EMPOLEON, + Species.BIDOOF, + Species.BIBAREL, + Species.BUDEW, + Species.ROSERADE, + Species.PACHIRISU, + Species.AMBIPOM, + Species.BUNEARY, + Species.LOPUNNY, + Species.GLAMEOW, + Species.PURUGLY, + Species.BONSLY, + Species.MIME_JR, + Species.HAPPINY, + Species.MUNCHLAX, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.LICKILICKY, + Species.TOGEKISS, + Species.LEAFEON, + Species.GLACEON, + Species.PHIONE, + Species.MANAPHY, + Species.SHAYMIN, + Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, + Species.OSHAWOTT, + Species.DEWOTT, + Species.SAMUROTT, + Species.PATRAT, + Species.WATCHOG, + Species.LILLIPUP, + Species.HERDIER, + Species.STOUTLAND, + Species.PURRLOIN, + Species.LIEPARD, + Species.PANSAGE, + Species.SIMISAGE, + Species.PANPOUR, + Species.SIMIPOUR, + Species.PANSEAR, + Species.SIMISEAR, + Species.AUDINO, + Species.COTTONEE, + Species.WHIMSICOTT, + Species.PETILIL, + Species.LILLIGANT, + Species.ZORUA, + Species.ZOROARK, + Species.MINCCINO, + Species.CINCCINO, + Species.GOTHITA, + Species.GOTHORITA, + Species.GOTHITELLE, + Species.EMOLGA, + Species.CUBCHOO, + Species.BEARTIC, + Species.KELDEO, + Species.MELOETTA, + Species.FENNEKIN, + Species.BRAIXEN, + Species.DELPHOX, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.PANCHAM, + Species.PANGORO, + Species.ESPURR, + Species.MEOWSTIC, + Species.SPRITZEE, + Species.AROMATISSE, + Species.SWIRLIX, + Species.SLURPUFF, + Species.SYLVEON, + Species.DEDENNE, + Species.CARBINK, + Species.KLEFKI, + Species.DIANCIE, + Species.HOOPA, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.LITTEN, + Species.TORRACAT, + Species.INCINEROAR, + Species.POPPLIO, + Species.BRIONNE, + Species.PRIMARINA, + Species.ORICORIO, + Species.CUTIEFLY, + Species.RIBOMBEE, + Species.ROCKRUFF, + Species.LYCANROC, + Species.WISHIWASHI, + Species.MAREANIE, + Species.TOXAPEX, + Species.SALANDIT, + Species.SALAZZLE, + Species.BOUNSWEET, + Species.STEENEE, + Species.TSAREENA, + Species.COMFEY, + Species.ORANGURU, + Species.TOGEDEMARU, + Species.MIMIKYU, + Species.POIPOLE, + Species.GREEDENT, + Species.PERRSERKER, + Species.SIRFETCHD, + Species.MR_RIME, + Species.URSALUNA, + Species.LECHONK, + Species.OINKOLOGNE, + Species.FIDOUGH, + Species.DACHSBUN, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.ANNIHILAPE, + Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, + Species.ALOLA_RAICHU, + Species.ALOLA_SANDSHREW, + Species.ALOLA_SANDSLASH, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.ALOLA_MEOWTH, + Species.ALOLA_PERSIAN, + Species.GALAR_MEOWTH, + Species.GALAR_FARFETCHD, + Species.GALAR_MR_MIME, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_TYPHLOSION, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, + Species.ETERNAL_FLOETTE, + ], [Moves.MAGICAL_LEAF]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -43418,6 +44530,8 @@ export const tmSpecies: TmSpecies = { Species.DRAGONITE, Species.MEW, Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, Species.STEELIX, Species.KINGDRA, Species.LARVITAR, @@ -43520,6 +44634,7 @@ export const tmSpecies: TmSpecies = { Species.GROUDON, Species.TORTERRA, Species.SHIELDON, + Species.BASTIODON, Species.GASTRODON, Species.BRONZOR, Species.BRONZONG, @@ -43553,6 +44668,7 @@ export const tmSpecies: TmSpecies = { Species.TRUMBEAK, Species.TOUCANNON, Species.LYCANROC, + Species.MINIOR, Species.NECROZMA, Species.STAKATAKA, Species.BLACEPHALON, @@ -43579,6 +44695,7 @@ export const tmSpecies: TmSpecies = { Species.GLIMMET, Species.GLIMMORA, Species.IRON_THORNS, + Species.IRON_BOULDER, [ Species.WORMADAM, "sandy", @@ -44001,17 +45118,25 @@ export const tmSpecies: TmSpecies = { Species.BUZZWOLE, Species.PHEROMOSA, Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, Species.CRAMORANT, + Species.KLEAVOR, Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, Species.SQUAWKABILLY, Species.WATTREL, Species.KILOWATTREL, Species.FLITTLE, + Species.ESPATHRA, Species.BOMBIRDIER, Species.FLAMIGO, Species.DUDUNSPARCE, Species.ROARING_MOON, Species.FEZANDIPITI, + Species.HISUI_BRAVIARY, + Species.HISUI_DECIDUEYE, ], [Moves.GRAVITY]: [ Species.CLEFAIRY, @@ -44384,6 +45509,90 @@ export const tmSpecies: TmSpecies = { ], Species.HISUI_QWILFISH, ], + [Moves.PLUCK]: [ + Species.PIDGEY, + Species.PIDGEOTTO, + Species.PIDGEOT, + Species.RATTATA, + Species.RATICATE, + Species.SPEAROW, + Species.FEAROW, + Species.ZUBAT, + Species.GOLBAT, + Species.FARFETCHD, + Species.DODUO, + Species.DODRIO, + Species.ARTICUNO, + Species.ZAPDOS, + Species.MOLTRES, + Species.MEW, + Species.HOOTHOOT, + Species.NOCTOWL, + Species.CROBAT, + Species.NATU, + Species.XATU, + Species.MURKROW, + Species.DELIBIRD, + Species.SKARMORY, + Species.HO_OH, + Species.TAILLOW, + Species.SWELLOW, + Species.WINGULL, + Species.PELIPPER, + Species.SWABLU, + Species.ALTARIA, + Species.PIPLUP, + Species.PRINPLUP, + Species.EMPOLEON, + Species.STARLY, + Species.STARAVIA, + Species.STARAPTOR, + Species.BIDOOF, + Species.BIBAREL, + Species.HONCHKROW, + Species.CHATOT, + Species.TOGEKISS, + Species.PIDOVE, + Species.TRANQUILL, + Species.UNFEZANT, + Species.WOOBAT, + Species.SWOOBAT, + Species.SIGILYPH, + Species.ARCHEN, + Species.ARCHEOPS, + Species.DUCKLETT, + Species.SWANNA, + Species.RUFFLET, + Species.BRAVIARY, + Species.VULLABY, + Species.MANDIBUZZ, + Species.INKAY, + Species.MALAMAR, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, + Species.ORICORIO, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.CRAMORANT, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.FLITTLE, + Species.ESPATHRA, + Species.BOMBIRDIER, + Species.VELUZA, + Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, + Species.GALAR_ZAPDOS, + Species.HISUI_BRAVIARY, + Species.HISUI_DECIDUEYE, + ], [Moves.TAILWIND]: [ Species.CHARIZARD, Species.BUTTERFREE, @@ -44779,6 +45988,7 @@ export const tmSpecies: TmSpecies = { Species.TEDDIURSA, Species.URSARING, Species.HITMONTOP, + Species.COMBUSKEN, Species.BLAZIKEN, Species.BRELOOM, Species.MAKUHITA, @@ -45920,6 +47130,62 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZOROARK, Species.BLOODMOON_URSALUNA, ], + [Moves.GASTRO_ACID]: [ + Species.EKANS, + Species.ARBOK, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, + Species.SNORLAX, + Species.MEW, + Species.BELLOSSOM, + Species.SHUCKLE, + Species.GULPIN, + Species.SWALOT, + Species.SEVIPER, + Species.LILEEP, + Species.CRADILY, + Species.MUNCHLAX, + Species.CARNIVINE, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.PANSAGE, + Species.SIMISAGE, + Species.PANSEAR, + Species.SIMISEAR, + Species.PANPOUR, + Species.SIMIPOUR, + Species.PALPITOAD, + Species.SEISMITOAD, + Species.FOONGUS, + Species.AMOONGUSS, + Species.JOLTIK, + Species.GALVANTULA, + Species.EELEKTRIK, + Species.EELEKTROSS, + Species.SHELMET, + Species.ACCELGOR, + Species.HEATMOR, + Species.DIGGERSBY, + Species.SWIRLIX, + Species.SLURPUFF, + Species.MAREANIE, + Species.TOXAPEX, + Species.PYUKUMUKU, + Species.GUZZLORD, + Species.POIPOLE, + Species.NAGANADEL, + Species.CHEWTLE, + Species.DREDNAW, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + ], [Moves.POWER_SWAP]: [ Species.VULPIX, Species.NINETALES, @@ -46062,6 +47328,124 @@ export const tmSpecies: TmSpecies = { "female", ], ], + [Moves.WORRY_SEED]: [ + Species.BULBASAUR, + Species.IVYSAUR, + Species.VENUSAUR, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, + Species.PARAS, + Species.PARASECT, + Species.PSYDUCK, + Species.GOLDUCK, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, + Species.EXEGGCUTE, + Species.EXEGGUTOR, + Species.TANGELA, + Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.BELLOSSOM, + Species.HOPPIP, + Species.SKIPLOOM, + Species.JUMPLUFF, + Species.SUNKERN, + Species.SUNFLORA, + Species.CELEBI, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.SEEDOT, + Species.NUZLEAF, + Species.SHIFTRY, + Species.SHROOMISH, + Species.BRELOOM, + Species.ROSELIA, + Species.CACNEA, + Species.CACTURNE, + Species.LILEEP, + Species.CRADILY, + Species.TROPIUS, + Species.TURTWIG, + Species.GROTLE, + Species.TORTERRA, + Species.BUDEW, + Species.ROSERADE, + Species.WORMADAM, + Species.CHERUBI, + Species.CHERRIM, + Species.CARNIVINE, + Species.SNOVER, + Species.ABOMASNOW, + Species.TANGROWTH, + Species.LEAFEON, + Species.SHAYMIN, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.PANSAGE, + Species.SIMISAGE, + Species.MUNNA, + Species.MUSHARNA, + Species.SEWADDLE, + Species.SWADLOON, + Species.LEAVANNY, + Species.COTTONEE, + Species.WHIMSICOTT, + Species.PETILIL, + Species.LILLIGANT, + Species.MARACTUS, + Species.DEERLING, + Species.SAWSBUCK, + Species.FOONGUS, + Species.AMOONGUSS, + Species.FERROSEED, + Species.FERROTHORN, + Species.VIRIZION, + Species.CHESPIN, + Species.QUILLADIN, + Species.CHESNAUGHT, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.SKIDDO, + Species.GOGOAT, + Species.PHANTUMP, + Species.TREVENANT, + Species.PUMPKABOO, + Species.GOURGEIST, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.FOMANTIS, + Species.LURANTIS, + Species.MORELULL, + Species.SHIINOTIC, + Species.BOUNSWEET, + Species.STEENEE, + Species.TSAREENA, + Species.COMFEY, + Species.TAPU_BULU, + Species.NIHILEGO, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.ALOLA_EXEGGUTOR, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, + Species.ETERNAL_FLOETTE, + ], [Moves.TOXIC_SPIKES]: [ Species.BEEDRILL, Species.EKANS, @@ -46197,6 +47581,7 @@ export const tmSpecies: TmSpecies = { Species.PIGNITE, Species.EMBOAR, Species.PANSEAR, + Species.SIMISEAR, Species.DARUMAKA, Species.DARMANITAN, Species.LITWICK, @@ -46238,6 +47623,7 @@ export const tmSpecies: TmSpecies = { Species.CHI_YU, Species.KORAIDON, Species.GOUGING_FIRE, + Species.TERAPAGOS, Species.ALOLA_MAROWAK, Species.GALAR_DARUMAKA, Species.GALAR_DARMANITAN, @@ -46802,6 +48188,151 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZORUA, Species.HISUI_ZOROARK, ], + [Moves.AQUA_TAIL]: [ + Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, + Species.EKANS, + Species.ARBOK, + Species.NIDOQUEEN, + Species.NIDOKING, + Species.PSYDUCK, + Species.GOLDUCK, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.SEEL, + Species.DEWGONG, + Species.LICKITUNG, + Species.RHYHORN, + Species.RHYDON, + Species.KANGASKHAN, + Species.GOLDEEN, + Species.SEAKING, + Species.LAPRAS, + Species.VAPOREON, + Species.KABUTOPS, + Species.AERODACTYL, + Species.DRATINI, + Species.DRAGONAIR, + Species.DRAGONITE, + Species.MEWTWO, + Species.MEW, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.SENTRET, + Species.FURRET, + Species.LANTURN, + Species.MARILL, + Species.AZUMARILL, + Species.WOOPER, + Species.QUAGSIRE, + Species.SLOWKING, + Species.DUNSPARCE, + Species.GLIGAR, + Species.STEELIX, + Species.QWILFISH, + Species.MANTINE, + Species.TYRANITAR, + Species.LUGIA, + Species.MUDKIP, + Species.MARSHTOMP, + Species.SWAMPERT, + Species.AGGRON, + Species.SEVIPER, + Species.BARBOACH, + Species.WHISCASH, + Species.ARMALDO, + Species.MILOTIC, + Species.KECLEON, + Species.SPHEAL, + Species.SEALEO, + Species.WALREIN, + Species.HUNTAIL, + Species.GOREBYSS, + Species.RELICANTH, + Species.SALAMENCE, + Species.KYOGRE, + Species.RAYQUAZA, + Species.BIDOOF, + Species.BIBAREL, + Species.BUIZEL, + Species.FLOATZEL, + Species.GARCHOMP, + Species.SKORUPI, + Species.DRAPION, + Species.FINNEON, + Species.LUMINEON, + Species.LICKILICKY, + Species.RHYPERIOR, + Species.GLACEON, + Species.GLISCOR, + Species.PALKIA, + Species.GIRATINA, + Species.ARCEUS, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.OSHAWOTT, + Species.DEWOTT, + Species.SAMUROTT, + Species.PATRAT, + Species.WATCHOG, + Species.PANPOUR, + Species.SIMIPOUR, + Species.SCOLIPEDE, + Species.SANDILE, + Species.KROKOROK, + Species.KROOKODILE, + Species.TIRTOUGA, + Species.CARRACOSTA, + Species.ARCHEN, + Species.ARCHEOPS, + Species.MINCCINO, + Species.CINCCINO, + Species.EELEKTRIK, + Species.EELEKTROSS, + Species.AXEW, + Species.FRAXURE, + Species.HAXORUS, + Species.STUNFISK, + Species.DRUDDIGON, + Species.DEINO, + Species.ZWEILOUS, + Species.HYDREIGON, + Species.KELDEO, + Species.SKRELP, + Species.DRAGALGE, + Species.CLAUNCHER, + Species.CLAWITZER, + Species.AMAURA, + Species.AURORUS, + Species.GOODRA, + Species.POPPLIO, + Species.BRIONNE, + Species.PRIMARINA, + Species.WISHIWASHI, + Species.BRUXISH, + Species.JANGMO_O, + Species.HAKAMO_O, + Species.KOMMO_O, + Species.BASCULEGION, + Species.OVERQWIL, + Species.FINIZEN, + Species.PALAFIN, + Species.CYCLIZAR, + Species.DONDOZO, + Species.DUDUNSPARCE, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.ALOLA_SANDSHREW, + Species.ALOLA_SANDSLASH, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.HISUI_QWILFISH, + Species.HISUI_SAMUROTT, + ], [Moves.SEED_BOMB]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -47086,6 +48617,7 @@ export const tmSpecies: TmSpecies = { Species.WOOBAT, Species.SWOOBAT, Species.SEWADDLE, + Species.SWADLOON, Species.LEAVANNY, Species.SIGILYPH, Species.ARCHEOPS, @@ -47115,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, @@ -47150,7 +48685,10 @@ export const tmSpecies: TmSpecies = { Species.IRON_BOULDER, Species.IRON_CROWN, Species.SHAYMIN, - Species.ROTOM, + [ + Species.ROTOM, + "fan", + ], Species.GALAR_ARTICUNO, Species.GALAR_MOLTRES, Species.HISUI_SAMUROTT, @@ -47633,6 +49171,8 @@ export const tmSpecies: TmSpecies = { Species.AZELF, Species.REGIGIGAS, Species.DARKRAI, + Species.PIGNITE, + Species.EMBOAR, Species.AUDINO, Species.TIMBURR, Species.GURDURR, @@ -47719,6 +49259,8 @@ export const tmSpecies: TmSpecies = { Species.HERACROSS, Species.TYROGUE, Species.HITMONTOP, + Species.GROVYLE, + Species.SCEPTILE, Species.COMBUSKEN, Species.BLAZIKEN, Species.SHIFTRY, @@ -47728,6 +49270,7 @@ export const tmSpecies: TmSpecies = { Species.HARIYAMA, Species.MEDITITE, Species.MEDICHAM, + Species.FLYGON, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -47740,6 +49283,9 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.MIENSHAO, + Species.COBALION, + Species.VIRIZION, + Species.KELDEO, Species.PASSIMIAN, Species.HAKAMO_O, Species.KOMMO_O, @@ -48257,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, @@ -48271,6 +49820,7 @@ export const tmSpecies: TmSpecies = { Species.MURKROW, Species.DELIBIRD, Species.SKARMORY, + Species.LUGIA, Species.HO_OH, Species.BLAZIKEN, Species.TAILLOW, @@ -48298,6 +49848,8 @@ export const tmSpecies: TmSpecies = { Species.DARTRIX, Species.DECIDUEYE, Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, Species.TAPU_KOKO, Species.ROOKIDEE, Species.CORVISQUIRE, @@ -48473,6 +50025,7 @@ export const tmSpecies: TmSpecies = { Species.MUDSDALE, Species.SANDYGAST, Species.PALOSSAND, + Species.MINIOR, Species.NECROZMA, Species.RILLABOOM, Species.DREDNAW, @@ -49200,6 +50753,7 @@ export const tmSpecies: TmSpecies = { Species.KECLEON, Species.SHUPPET, Species.BANETTE, + Species.DEOXYS, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -49228,8 +50782,11 @@ export const tmSpecies: TmSpecies = { Species.PURRLOIN, Species.LIEPARD, Species.PANSAGE, + Species.SIMISAGE, Species.PANSEAR, + Species.SIMISEAR, Species.PANPOUR, + Species.SIMIPOUR, Species.WOOBAT, Species.SWOOBAT, Species.YAMASK, @@ -49976,6 +51533,7 @@ export const tmSpecies: TmSpecies = { Species.KADABRA, Species.ALAKAZAM, Species.DROWZEE, + Species.HYPNO, Species.EXEGGUTOR, Species.STARMIE, Species.SCYTHER, @@ -49987,6 +51545,7 @@ export const tmSpecies: TmSpecies = { Species.SNEASEL, Species.CELEBI, Species.MEDITITE, + Species.MEDICHAM, Species.SPINDA, Species.ABSOL, Species.METANG, @@ -50021,15 +51580,20 @@ export const tmSpecies: TmSpecies = { Species.HATTERENE, Species.ZACIAN, Species.SPECTRIER, + Species.KLEAVOR, Species.CERULEDGE, Species.VELUZA, Species.IRON_VALIANT, + Species.IRON_BOULDER, + Species.IRON_CROWN, Species.GALAR_RAPIDASH, Species.GALAR_ARTICUNO, [ Species.CALYREX, "shadow", ], + Species.HISUI_SAMUROTT, + Species.HISUI_DECIDUEYE, ], [Moves.ZEN_HEADBUTT]: [ Species.SQUIRTLE, @@ -50422,6 +51986,7 @@ export const tmSpecies: TmSpecies = { Species.BEHEEYEM, Species.CRYOGONAL, Species.DRUDDIGON, + Species.GOLETT, Species.GOLURK, Species.PAWNIARD, Species.BISHARP, @@ -50464,6 +52029,7 @@ export const tmSpecies: TmSpecies = { Species.MELTAN, Species.MELMETAL, Species.CORVIKNIGHT, + Species.PERRSERKER, Species.CUFANT, Species.COPPERAJAH, Species.DURALUDON, @@ -51032,6 +52598,9 @@ export const tmSpecies: TmSpecies = { Species.BULBASAUR, Species.IVYSAUR, Species.VENUSAUR, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, Species.BELLSPROUT, Species.WEEPINBELL, Species.VICTREEBEL, @@ -51040,6 +52609,8 @@ export const tmSpecies: TmSpecies = { Species.TANGELA, Species.MEW, Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, Species.BELLOSSOM, Species.HOPPIP, Species.SKIPLOOM, @@ -51073,6 +52644,7 @@ export const tmSpecies: TmSpecies = { Species.SERVINE, Species.SERPERIOR, Species.PANSAGE, + Species.SIMISAGE, Species.LEAVANNY, Species.PETILIL, Species.LILLIGANT, @@ -51126,7 +52698,10 @@ export const tmSpecies: TmSpecies = { Species.OGERPON, Species.HYDRAPPLE, Species.SHAYMIN, - Species.ROTOM, + [ + Species.ROTOM, + "mow", + ], Species.ALOLA_EXEGGUTOR, Species.HISUI_VOLTORB, Species.HISUI_ELECTRODE, @@ -51208,7 +52783,9 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.OBSTAGOON, Species.ETERNATUS, + Species.KLEAVOR, Species.SHROODLE, + Species.GRAFAIAI, Species.FEZANDIPITI, ], [Moves.GUNK_SHOT]: [ @@ -51642,6 +53219,8 @@ export const tmSpecies: TmSpecies = { Species.NUMEL, Species.CAMERUPT, Species.TORKOAL, + Species.TRAPINCH, + Species.VIBRAVA, Species.FLYGON, Species.LUNATONE, Species.SOLROCK, @@ -51885,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, @@ -51967,6 +53549,7 @@ export const tmSpecies: TmSpecies = { Species.HYDREIGON, Species.COBALION, Species.TERRAKION, + Species.ZEKROM, Species.LANDORUS, Species.BINACLE, Species.BARBARACLE, @@ -52869,6 +54452,7 @@ export const tmSpecies: TmSpecies = { Species.OBSTAGOON, Species.PERRSERKER, Species.DURALUDON, + Species.URSALUNA, Species.SNEASLER, Species.SPRIGATITO, Species.FLORAGATO, @@ -52876,10 +54460,13 @@ export const tmSpecies: TmSpecies = { Species.MASCHIFF, Species.MABOSSTIFF, Species.BOMBIRDIER, + Species.KINGAMBIT, Species.WALKING_WAKE, + Species.ARCHALUDON, Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, Species.ALOLA_DIGLETT, + Species.ALOLA_DUGTRIO, Species.GALAR_MEOWTH, Species.GALAR_LINOONE, Species.HISUI_SNEASEL, @@ -53009,6 +54596,7 @@ export const tmSpecies: TmSpecies = { Species.SLOWBRO, Species.DROWZEE, Species.HYPNO, + Species.EXEGGCUTE, Species.EXEGGUTOR, Species.STARMIE, Species.MR_MIME, @@ -53060,6 +54648,7 @@ export const tmSpecies: TmSpecies = { Species.MESPRIT, Species.AZELF, Species.CRESSELIA, + Species.DARKRAI, Species.ARCEUS, Species.VICTINI, Species.MUNNA, @@ -53083,6 +54672,7 @@ export const tmSpecies: TmSpecies = { Species.ESPURR, Species.MEOWSTIC, Species.AROMATISSE, + Species.INKAY, Species.MALAMAR, Species.SYLVEON, Species.KLEFKI, @@ -53500,7 +55090,11 @@ export const tmSpecies: TmSpecies = { Species.NIDOQUEEN, Species.NIDOKING, Species.VILEPLUME, + Species.VENOMOTH, Species.DUGTRIO, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, Species.TENTACOOL, Species.TENTACRUEL, Species.GRIMER, @@ -53511,6 +55105,8 @@ export const tmSpecies: TmSpecies = { Species.KOFFING, Species.WEEZING, Species.MEW, + Species.SPINARAK, + Species.ARIADOS, Species.WOOPER, Species.QUAGSIRE, Species.QWILFISH, @@ -53525,6 +55121,8 @@ export const tmSpecies: TmSpecies = { Species.CRAWDAUNT, Species.CRADILY, Species.GASTRODON, + Species.STUNKY, + Species.SKUNTANK, Species.CROAGUNK, Species.TOXICROAK, Species.TYMPOLE, @@ -53538,6 +55136,7 @@ export const tmSpecies: TmSpecies = { Species.TORNADUS, Species.THUNDURUS, Species.LANDORUS, + Species.GRENINJA, Species.BINACLE, Species.BARBARACLE, Species.SKRELP, @@ -53561,10 +55160,17 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.TOXTRICITY, Species.ETERNATUS, + Species.SNEASLER, + Species.OVERQWIL, + Species.SHROODLE, + Species.GRAFAIAI, + Species.VAROOM, + Species.REVAVROOM, Species.GLIMMET, Species.GLIMMORA, Species.CLODSIRE, Species.IRON_MOTH, + Species.OKIDOGI, Species.MUNKIDORI, Species.PECHARUNT, Species.ALOLA_RATICATE, @@ -53575,6 +55181,9 @@ export const tmSpecies: TmSpecies = { Species.GALAR_WEEZING, Species.GALAR_SLOWKING, Species.GALAR_STUNFISK, + Species.HISUI_SNEASEL, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, Species.PALDEA_WOOPER, ], [Moves.HEAVY_SLAM]: [ @@ -53586,6 +55195,7 @@ export const tmSpecies: TmSpecies = { Species.MAGNEMITE, Species.MAGNETON, Species.ONIX, + Species.RHYHORN, Species.RHYDON, Species.SNORLAX, Species.MEW, @@ -53618,6 +55228,7 @@ export const tmSpecies: TmSpecies = { Species.TURTWIG, Species.GROTLE, Species.TORTERRA, + Species.RAMPARDOS, Species.SHIELDON, Species.BASTIODON, Species.BRONZOR, @@ -53633,6 +55244,8 @@ export const tmSpecies: TmSpecies = { Species.REGIGIGAS, Species.ARCEUS, Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, Species.ROGGENROLA, Species.BOLDORE, Species.GIGALITH, @@ -53643,6 +55256,7 @@ export const tmSpecies: TmSpecies = { Species.BEARTIC, Species.GOLETT, Species.GOLURK, + Species.COBALION, Species.CARBINK, Species.AVALUGG, Species.VOLCANION, @@ -53724,6 +55338,7 @@ export const tmSpecies: TmSpecies = { Species.FLAAFFY, Species.AMPHAROS, Species.ELEKID, + Species.RAIKOU, Species.ELECTRIKE, Species.MANECTRIC, Species.PLUSLE, @@ -53735,6 +55350,8 @@ export const tmSpecies: TmSpecies = { Species.MAGNEZONE, Species.ELECTIVIRE, Species.ROTOM, + Species.BLITZLE, + Species.ZEBSTRIKA, Species.EMOLGA, Species.JOLTIK, Species.GALVANTULA, @@ -54041,8 +55658,14 @@ export const tmSpecies: TmSpecies = { Species.HISUI_DECIDUEYE, ], [Moves.ACID_SPRAY]: [ + Species.BULBASAUR, + Species.IVYSAUR, + Species.VENUSAUR, Species.EKANS, Species.ARBOK, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, Species.VENONAT, Species.VENOMOTH, Species.BELLSPROUT, @@ -54057,13 +55680,17 @@ export const tmSpecies: TmSpecies = { Species.GENGAR, Species.KOFFING, Species.WEEZING, + Species.MAGMAR, Species.MEW, Species.SPINARAK, Species.ARIADOS, + Species.BELLOSSOM, Species.WOOPER, Species.QUAGSIRE, Species.QWILFISH, Species.REMORAID, + Species.OCTILLERY, + Species.MAGBY, Species.GULPIN, Species.SWALOT, Species.SEVIPER, @@ -54072,13 +55699,16 @@ export const tmSpecies: TmSpecies = { Species.CROAGUNK, Species.TOXICROAK, Species.CARNIVINE, + Species.MAGMORTAR, Species.ARCEUS, Species.SCRAGGY, + Species.SCRAFTY, Species.TRUBBISH, Species.GARBODOR, Species.KARRABLAST, Species.ESCAVALIER, Species.FERROSEED, + Species.FERROTHORN, Species.EELEKTRIK, Species.EELEKTROSS, Species.ACCELGOR, @@ -54094,6 +55724,7 @@ export const tmSpecies: TmSpecies = { Species.FLAPPLE, Species.TOXTRICITY, Species.SNEASLER, + Species.OVERQWIL, Species.ARMAROUGE, Species.TADBULB, Species.BELLIBOLT, @@ -55466,6 +57097,8 @@ export const tmSpecies: TmSpecies = { Species.SLOWBRO, Species.DROWZEE, Species.HYPNO, + Species.EXEGGCUTE, + Species.EXEGGUTOR, Species.CHANSEY, Species.MR_MIME, Species.JYNX, @@ -55505,6 +57138,7 @@ export const tmSpecies: TmSpecies = { Species.LATIAS, Species.LATIOS, Species.JIRACHI, + Species.DEOXYS, Species.DRIFLOON, Species.DRIFBLIM, Species.MISMAGIUS, @@ -55523,6 +57157,7 @@ export const tmSpecies: TmSpecies = { Species.MESPRIT, Species.AZELF, Species.CRESSELIA, + Species.MANAPHY, Species.ARCEUS, Species.VICTINI, Species.MUNNA, @@ -55544,6 +57179,7 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, Species.FLOETTE, Species.FLORGES, + Species.MEOWSTIC, Species.INKAY, Species.MALAMAR, Species.SYLVEON, @@ -55588,14 +57224,11 @@ export const tmSpecies: TmSpecies = { Species.MUNKIDORI, Species.IRON_CROWN, Species.TERAPAGOS, - [ - Species.MEOWSTIC, - "female", - ], Species.ALOLA_RAICHU, Species.ALOLA_VULPIX, Species.ETERNAL_FLOETTE, Species.ALOLA_NINETALES, + Species.ALOLA_EXEGGUTOR, Species.GALAR_PONYTA, Species.GALAR_RAPIDASH, Species.GALAR_SLOWPOKE, @@ -56106,6 +57739,208 @@ export const tmSpecies: TmSpecies = { Species.LUNALA, Species.NAGANADEL, ], + [Moves.INCINERATE]: [ + Species.CHARMANDER, + Species.CHARMELEON, + Species.CHARIZARD, + Species.NIDOQUEEN, + Species.NIDOKING, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.VULPIX, + Species.NINETALES, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.GROWLITHE, + Species.ARCANINE, + Species.MACHOP, + Species.MACHOKE, + Species.MACHAMP, + Species.GEODUDE, + Species.GRAVELER, + Species.GOLEM, + Species.PONYTA, + Species.RAPIDASH, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.GRIMER, + Species.MUK, + Species.CUBONE, + Species.MAROWAK, + Species.LICKITUNG, + Species.KOFFING, + Species.WEEZING, + Species.RHYHORN, + Species.RHYDON, + Species.CHANSEY, + Species.KANGASKHAN, + Species.MAGMAR, + Species.TAUROS, + Species.GYARADOS, + Species.FLAREON, + Species.AERODACTYL, + Species.SNORLAX, + Species.MOLTRES, + Species.DRATINI, + Species.DRAGONAIR, + Species.DRAGONITE, + Species.MEWTWO, + Species.MEW, + Species.CYNDAQUIL, + Species.QUILAVA, + Species.TYPHLOSION, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.TOGEPI, + Species.TOGETIC, + Species.SLOWKING, + Species.DUNSPARCE, + Species.SNUBBULL, + Species.GRANBULL, + Species.SLUGMA, + Species.MAGCARGO, + Species.REMORAID, + Species.OCTILLERY, + Species.HOUNDOUR, + Species.HOUNDOOM, + Species.MAGBY, + Species.BLISSEY, + Species.ENTEI, + Species.HO_OH, + Species.TORCHIC, + Species.COMBUSKEN, + Species.BLAZIKEN, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.WHISMUR, + Species.LOUDRED, + Species.EXPLOUD, + Species.SABLEYE, + Species.MAWILE, + Species.AGGRON, + Species.NUMEL, + Species.CAMERUPT, + Species.TORKOAL, + Species.FLYGON, + Species.ALTARIA, + Species.ZANGOOSE, + Species.SOLROCK, + Species.CASTFORM, + Species.KECLEON, + Species.ABSOL, + Species.BAGON, + Species.SHELGON, + Species.SALAMENCE, + Species.GROUDON, + Species.RAYQUAZA, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.CRANIDOS, + Species.RAMPARDOS, + Species.SHIELDON, + Species.BASTIODON, + Species.HONCHKROW, + Species.STUNKY, + Species.SKUNTANK, + Species.HAPPINY, + Species.GIBLE, + Species.GABITE, + Species.GARCHOMP, + Species.MUNCHLAX, + Species.LICKILICKY, + Species.RHYPERIOR, + Species.MAGMORTAR, + Species.TOGEKISS, + Species.AZELF, + Species.DIALGA, + Species.PALKIA, + Species.HEATRAN, + Species.DARKRAI, + Species.ARCEUS, + Species.VICTINI, + Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, + Species.PANSEAR, + Species.SIMISEAR, + Species.AUDINO, + Species.SANDILE, + Species.KROKOROK, + Species.KROOKODILE, + Species.DARUMAKA, + Species.DARMANITAN, + Species.SCRAGGY, + Species.SCRAFTY, + Species.ZORUA, + Species.ZOROARK, + Species.LITWICK, + Species.LAMPENT, + Species.CHANDELURE, + Species.AXEW, + Species.FRAXURE, + Species.HAXORUS, + Species.DRUDDIGON, + Species.VULLABY, + Species.MANDIBUZZ, + Species.HEATMOR, + Species.DEINO, + Species.ZWEILOUS, + Species.HYDREIGON, + Species.LARVESTA, + Species.VOLCARONA, + Species.TORNADUS, + Species.THUNDURUS, + Species.RESHIRAM, + Species.FENNEKIN, + Species.BRAIXEN, + Species.DELPHOX, + Species.FLETCHINDER, + Species.TALONFLAME, + Species.LITLEO, + Species.PYROAR, + Species.GOODRA, + Species.PUMPKABOO, + Species.GOURGEIST, + Species.VOLCANION, + Species.SALANDIT, + Species.SALAZZLE, + Species.TURTONATOR, + Species.BLACEPHALON, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.DUDUNSPARCE, + Species.CHI_YU, + Species.ROARING_MOON, + Species.GOUGING_FIRE, + Species.ALOLA_GEODUDE, + Species.ALOLA_GRAVELER, + Species.ALOLA_GOLEM, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + Species.ALOLA_MAROWAK, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_WEEZING, + Species.GALAR_SLOWKING, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_TYPHLOSION, + Species.HISUI_GOODRA, + Species.PALDEA_TAUROS, + ], [Moves.QUASH]: [ Species.NIDOQUEEN, Species.NIDOKING, @@ -57888,6 +59723,7 @@ export const tmSpecies: TmSpecies = { Species.NIDORINO, Species.NIDOKING, Species.RAPIDASH, + Species.DODRIO, Species.SEEL, Species.DEWGONG, Species.CLOYSTER, @@ -57902,6 +59738,7 @@ export const tmSpecies: TmSpecies = { Species.FORRETRESS, Species.DUNSPARCE, Species.STEELIX, + Species.SKARMORY, Species.DELIBIRD, Species.HITMONTOP, Species.BALTOY, @@ -57989,6 +59826,7 @@ export const tmSpecies: TmSpecies = { Species.TORKOAL, Species.GROUDON, Species.RHYPERIOR, + Species.MAGMORTAR, Species.HEATRAN, Species.REGIGIGAS, Species.TEPIG, @@ -58024,6 +59862,8 @@ export const tmSpecies: TmSpecies = { Species.ZIGZAGOON, Species.LINOONE, Species.BUIZEL, + Species.FLOATZEL, + Species.AMBIPOM, Species.STUNKY, Species.SKUNTANK, Species.MINCCINO, @@ -58125,12 +59965,6 @@ export const tmSpecies: TmSpecies = { Species.HISUI_LILLIGANT, Species.HISUI_BRAVIARY, ], - [Moves.RELIC_SONG]: [ - Species.MELOETTA, - ], - [Moves.SECRET_SWORD]: [ - Species.KELDEO, - ], [Moves.SNARL]: [ Species.EKANS, Species.ARBOK, @@ -58487,6 +60321,7 @@ export const tmSpecies: TmSpecies = { Species.CHIMECHO, Species.GOREBYSS, Species.LUVDISC, + Species.LATIAS, Species.CHERUBI, Species.CHERRIM, Species.MISMAGIUS, @@ -58757,6 +60592,7 @@ export const tmSpecies: TmSpecies = { Species.ARCANINE, Species.PONYTA, Species.RAPIDASH, + Species.DEWGONG, Species.MEW, Species.CYNDAQUIL, Species.QUILAVA, @@ -58787,6 +60623,8 @@ export const tmSpecies: TmSpecies = { Species.SKITTY, Species.DELCATTY, Species.MAWILE, + Species.PLUSLE, + Species.MINUN, Species.VOLBEAT, Species.ILLUMISE, Species.SWABLU, @@ -58808,6 +60646,7 @@ export const tmSpecies: TmSpecies = { Species.UXIE, Species.MESPRIT, Species.AZELF, + Species.SHAYMIN, Species.LILLIPUP, Species.HERDIER, Species.STOUTLAND, @@ -59846,16 +61685,11 @@ export const tmSpecies: TmSpecies = { Species.ZUBAT, Species.GOLBAT, Species.TENTACRUEL, - Species.MUK, Species.KOFFING, Species.WEEZING, Species.MEW, - Species.ARIADOS, Species.CROBAT, Species.QWILFISH, - Species.GULPIN, - Species.SWALOT, - Species.SEVIPER, Species.ROSERADE, Species.STUNKY, Species.SKUNTANK, @@ -59887,8 +61721,6 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.PINCURCHIN, Species.ETERNATUS, - Species.PIKACHU, - Species.ALOLA_MUK, Species.GALAR_WEEZING, Species.GALAR_SLOWKING, [ @@ -60266,8 +62098,226 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MUK, Species.ALOLA_EXEGGUTOR, ], - [Moves.DRAGON_ASCENT]: [ - Species.RAYQUAZA, + [Moves.POWER_UP_PUNCH]: [ + Species.CHARMANDER, + Species.CHARMELEON, + Species.CHARIZARD, + Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, + Species.NIDOQUEEN, + Species.NIDOKING, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.PSYDUCK, + Species.GOLDUCK, + Species.MANKEY, + Species.PRIMEAPE, + Species.POLIWHIRL, + Species.POLIWRATH, + Species.MACHOP, + Species.MACHOKE, + Species.MACHAMP, + Species.GEODUDE, + Species.GRAVELER, + Species.GOLEM, + Species.GRIMER, + Species.MUK, + Species.GENGAR, + Species.DROWZEE, + Species.HYPNO, + Species.CUBONE, + Species.MAROWAK, + Species.HITMONLEE, + Species.HITMONCHAN, + Species.LICKITUNG, + Species.RHYDON, + Species.CHANSEY, + Species.KANGASKHAN, + Species.MR_MIME, + Species.JYNX, + Species.ELECTABUZZ, + Species.MAGMAR, + Species.SNORLAX, + Species.DRAGONITE, + Species.MEWTWO, + Species.MEW, + Species.TYPHLOSION, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.SENTRET, + Species.FURRET, + Species.LEDYBA, + Species.LEDIAN, + Species.FLAAFFY, + Species.AMPHAROS, + Species.MARILL, + Species.AZUMARILL, + Species.SUDOWOODO, + Species.POLITOED, + Species.AIPOM, + Species.WOOPER, + Species.QUAGSIRE, + Species.SLOWKING, + Species.SNUBBULL, + Species.GRANBULL, + Species.SNEASEL, + Species.TEDDIURSA, + Species.URSARING, + Species.DELIBIRD, + Species.ELEKID, + Species.MAGBY, + Species.MILTANK, + Species.BLISSEY, + Species.LARVITAR, + Species.PUPITAR, + Species.TYRANITAR, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.COMBUSKEN, + Species.BLAZIKEN, + Species.MARSHTOMP, + Species.SWAMPERT, + Species.LOMBRE, + Species.LUDICOLO, + Species.NUZLEAF, + Species.SHIFTRY, + Species.BRELOOM, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.LOUDRED, + Species.EXPLOUD, + Species.MAKUHITA, + Species.HARIYAMA, + Species.SABLEYE, + Species.MAWILE, + Species.AGGRON, + Species.MEDITITE, + Species.MEDICHAM, + Species.VOLBEAT, + Species.ILLUMISE, + Species.GULPIN, + Species.SWALOT, + Species.GRUMPIG, + Species.SPINDA, + Species.FLYGON, + Species.CACNEA, + Species.CACTURNE, + Species.ZANGOOSE, + Species.KECLEON, + Species.DUSCLOPS, + Species.METANG, + Species.METAGROSS, + Species.REGIROCK, + Species.REGICE, + Species.REGISTEEL, + Species.GROUDON, + Species.JIRACHI, + Species.DEOXYS, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.KRICKETUNE, + Species.CRANIDOS, + Species.RAMPARDOS, + Species.BUIZEL, + Species.FLOATZEL, + Species.AMBIPOM, + Species.BUNEARY, + Species.LOPUNNY, + Species.MUNCHLAX, + Species.RIOLU, + Species.LUCARIO, + Species.CROAGUNK, + Species.TOXICROAK, + Species.WEAVILE, + Species.LICKILICKY, + Species.RHYPERIOR, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.GALLADE, + Species.DUSKNOIR, + Species.UXIE, + Species.MESPRIT, + Species.AZELF, + Species.REGIGIGAS, + Species.DARKRAI, + Species.VICTINI, + Species.PIGNITE, + Species.EMBOAR, + Species.WATCHOG, + Species.SIMISAGE, + Species.SIMISEAR, + Species.SIMIPOUR, + Species.AUDINO, + Species.TIMBURR, + Species.GURDURR, + Species.CONKELDURR, + Species.SEISMITOAD, + Species.THROH, + Species.SAWK, + Species.KROKOROK, + Species.KROOKODILE, + Species.DARUMAKA, + Species.DARMANITAN, + Species.SCRAGGY, + Species.SCRAFTY, + Species.GOTHITELLE, + Species.REUNICLUS, + Species.EELEKTROSS, + Species.CUBCHOO, + Species.BEARTIC, + Species.MIENFOO, + Species.MIENSHAO, + Species.DRUDDIGON, + Species.GOLETT, + Species.GOLURK, + Species.PAWNIARD, + Species.BISHARP, + Species.HEATMOR, + Species.MELOETTA, + Species.CHESPIN, + Species.QUILLADIN, + Species.CHESNAUGHT, + Species.FENNEKIN, + Species.BRAIXEN, + Species.DELPHOX, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.BUNNELBY, + Species.DIGGERSBY, + Species.PANCHAM, + Species.PANGORO, + Species.MEOWSTIC, + Species.BINACLE, + Species.BARBARACLE, + Species.HAWLUCHA, + Species.PHANTUMP, + Species.TREVENANT, + Species.HOOPA, + Species.CRABRAWLER, + Species.CRABOMINABLE, + Species.BUZZWOLE, + Species.ZERAORA, + Species.TOXEL, + Species.TOXTRICITY, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.GRIMMSNARL, + Species.URSALUNA, + Species.ANNIHILAPE, + Species.KINGAMBIT, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + Species.ALOLA_MAROWAK, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, ], [Moves.DARKEST_LARIAT]: [ Species.POLIWRATH, @@ -60344,6 +62394,9 @@ export const tmSpecies: TmSpecies = { Species.MAMOSWINE, Species.PROBOPASS, Species.REGIGIGAS, + Species.PIGNITE, + Species.EMBOAR, + Species.ZEBSTRIKA, Species.DRILBUR, Species.EXCADRILL, Species.GURDURR, @@ -60352,6 +62405,7 @@ export const tmSpecies: TmSpecies = { Species.SAWSBUCK, Species.GOLURK, Species.BOUFFALANT, + Species.TERRAKION, Species.CHESNAUGHT, Species.DIGGERSBY, Species.GOGOAT, @@ -61014,6 +63068,7 @@ export const tmSpecies: TmSpecies = { Species.ZACIAN, Species.ETERNATUS, Species.ZARUDE, + Species.KLEAVOR, Species.TINKATINK, Species.TINKATUFF, Species.TINKATON, @@ -61030,6 +63085,33 @@ export const tmSpecies: TmSpecies = { Species.GALAR_WEEZING, Species.GALAR_YAMASK, ], + [Moves.AURORA_VEIL]: [ + Species.JYNX, + Species.ARTICUNO, + Species.MEW, + Species.DELIBIRD, + Species.SMOOCHUM, + Species.REGICE, + Species.ABOMASNOW, + Species.GLACEON, + Species.FROSLASS, + Species.VANILLITE, + Species.VANILLISH, + Species.VANILLUXE, + Species.CRYOGONAL, + Species.AMAURA, + Species.AURORUS, + Species.BERGMITE, + Species.AVALUGG, + Species.EISCUE, + Species.ARCTOVISH, + Species.IRON_BUNDLE, + Species.ALOLA_SANDSHREW, + Species.ALOLA_SANDSLASH, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.HISUI_AVALUGG, + ], [Moves.PSYCHIC_FANGS]: [ Species.EKANS, Species.ARBOK, @@ -61696,29 +63778,47 @@ export const tmSpecies: TmSpecies = { Species.BLOODMOON_URSALUNA, ], [Moves.BREAKING_SWIPE]: [ + Species.CHARMANDER, + Species.CHARMELEON, Species.CHARIZARD, + Species.ARBOK, Species.ONIX, Species.RHYDON, Species.DRATINI, Species.DRAGONAIR, Species.DRAGONITE, Species.MEW, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.AMPHAROS, + Species.DUNSPARCE, + Species.GLIGAR, Species.STEELIX, Species.KINGDRA, Species.TYRANITAR, + Species.TREECKO, + Species.GROVYLE, Species.SCEPTILE, Species.FLYGON, Species.ALTARIA, + Species.SEVIPER, Species.MILOTIC, Species.SALAMENCE, Species.LATIAS, Species.LATIOS, Species.RAYQUAZA, + Species.RAMPARDOS, + Species.GABITE, Species.GARCHOMP, Species.RHYPERIOR, + Species.GLISCOR, Species.DIALGA, Species.PALKIA, Species.GIRATINA, + Species.SERPERIOR, + Species.KROKOROK, + Species.KROOKODILE, Species.AXEW, Species.FRAXURE, Species.HAXORUS, @@ -61729,9 +63829,12 @@ export const tmSpecies: TmSpecies = { Species.HELIOLISK, Species.TYRANTRUM, Species.GOODRA, + Species.NOIVERN, Species.ZYGARDE, Species.SALAZZLE, Species.DRAMPA, + Species.JANGMO_O, + Species.HAKAMO_O, Species.KOMMO_O, Species.NECROZMA, Species.NAGANADEL, @@ -61742,12 +63845,18 @@ export const tmSpecies: TmSpecies = { Species.DRAGAPULT, Species.REGIDRAGO, Species.CYCLIZAR, + Species.DUDUNSPARCE, + Species.IRON_THORNS, Species.BAXCALIBUR, Species.ROARING_MOON, Species.KORAIDON, Species.WALKING_WAKE, Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, Species.ALOLA_EXEGGUTOR, + Species.HISUI_GOODRA, ], [Moves.STEEL_BEAM]: [ Species.MAGNEMITE, @@ -61834,6 +63943,8 @@ export const tmSpecies: TmSpecies = { Species.ALAKAZAM, Species.SLOWPOKE, Species.SLOWBRO, + Species.DROWZEE, + Species.HYPNO, Species.EXEGGUTOR, Species.STARMIE, Species.MR_MIME, @@ -61844,15 +63955,22 @@ export const tmSpecies: TmSpecies = { Species.XATU, Species.ESPEON, Species.SLOWKING, + Species.GIRAFARIG, Species.CELEBI, Species.RALTS, Species.KIRLIA, Species.GARDEVOIR, + Species.MEDITITE, + Species.MEDICHAM, + Species.SPOINK, + Species.GRUMPIG, Species.BALTOY, Species.CLAYDOL, + Species.CHIMECHO, Species.METANG, Species.METAGROSS, Species.JIRACHI, + Species.DEOXYS, Species.BRONZOR, Species.BRONZONG, Species.GALLADE, @@ -61875,11 +63993,14 @@ export const tmSpecies: TmSpecies = { Species.REUNICLUS, Species.ELGYEM, Species.BEHEEYEM, + Species.DELPHOX, Species.ESPURR, Species.MEOWSTIC, Species.INKAY, Species.MALAMAR, + Species.HOOPA, Species.ORANGURU, + Species.BRUXISH, Species.SOLGALEO, Species.LUNALA, Species.NECROZMA, @@ -61909,6 +64030,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_MR_MIME, Species.GALAR_ARTICUNO, Species.GALAR_SLOWKING, + Species.HISUI_BRAVIARY, ], [Moves.STEEL_ROLLER]: [ Species.SANDSHREW, @@ -61965,6 +64087,7 @@ export const tmSpecies: TmSpecies = { Species.COPPERAJAH, Species.DURALUDON, Species.IRON_TREADS, + Species.ARCHALUDON, Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, ], @@ -62061,10 +64184,12 @@ export const tmSpecies: TmSpecies = { Species.KABUTOPS, Species.AERODACTYL, Species.MEW, + Species.AMPHAROS, Species.SUDOWOODO, Species.STEELIX, Species.SHUCKLE, Species.CORSOLA, + Species.NOSEPASS, Species.AGGRON, Species.LUNATONE, Species.SOLROCK, @@ -62079,8 +64204,12 @@ export const tmSpecies: TmSpecies = { Species.REGISTEEL, Species.RAYQUAZA, Species.JIRACHI, + Species.DEOXYS, + Species.BASTIODON, Species.BRONZONG, Species.RHYPERIOR, + Species.PROBOPASS, + Species.ARCEUS, Species.ROGGENROLA, Species.BOLDORE, Species.GIGALITH, @@ -62098,6 +64227,7 @@ export const tmSpecies: TmSpecies = { Species.AURORUS, Species.CARBINK, Species.DIANCIE, + Species.MINIOR, Species.SOLGALEO, Species.LUNALA, Species.NIHILEGO, @@ -62129,7 +64259,9 @@ export const tmSpecies: TmSpecies = { Species.ARCHALUDON, Species.IRON_BOULDER, Species.TERAPAGOS, + Species.ALOLA_GOLEM, Species.GALAR_CORSOLA, + Species.HISUI_AVALUGG, ], [Moves.MISTY_EXPLOSION]: [ Species.CLEFAIRY, @@ -62304,6 +64436,7 @@ export const tmSpecies: TmSpecies = { Species.DRACOZOLT, Species.ARCTOZOLT, Species.REGIELEKI, + Species.RAGING_BOLT, Species.ALOLA_RAICHU, ], [Moves.TERRAIN_PULSE]: [ @@ -62332,30 +64465,63 @@ export const tmSpecies: TmSpecies = { Species.SMOLIV, Species.DOLLIV, Species.ARBOLIVA, + Species.DUDUNSPARCE, Species.ALOLA_EXEGGUTOR, Species.GALAR_STUNFISK, ], [Moves.SKITTER_SMACK]: [ + Species.EKANS, + Species.ARBOK, + Species.VENONAT, + Species.VENOMOTH, Species.PERSIAN, + Species.TENTACRUEL, Species.GASTLY, Species.HAUNTER, Species.GENGAR, + Species.SCYTHER, Species.MEW, + Species.SPINARAK, + Species.ARIADOS, + Species.YANMA, Species.DUNSPARCE, + Species.GLIGAR, + Species.SCIZOR, Species.SHUCKLE, + Species.HERACROSS, Species.OCTILLERY, + Species.SURSKIT, + Species.MASQUERAIN, Species.NINCADA, Species.NINJASK, Species.SHEDINJA, + Species.SABLEYE, + Species.VOLBEAT, + Species.ILLUMISE, + Species.CACNEA, + Species.CACTURNE, + Species.SEVIPER, Species.MILOTIC, + Species.SHUPPET, + Species.BANETTE, Species.DUSKULL, Species.DUSCLOPS, + Species.KRICKETOT, + Species.KRICKETUNE, + Species.COMBEE, + Species.VESPIQUEN, Species.SHELLOS, Species.GASTRODON, Species.SKORUPI, Species.DRAPION, + Species.YANMEGA, + Species.GLISCOR, Species.DUSKNOIR, + Species.GIRATINA, Species.LIEPARD, + Species.SEWADDLE, + Species.SWADLOON, + Species.LEAVANNY, Species.VENIPEDE, Species.WHIRLIPEDE, Species.SCOLIPEDE, @@ -62376,26 +64542,32 @@ export const tmSpecies: TmSpecies = { Species.DURANT, Species.LARVESTA, Species.VOLCARONA, + Species.VIVILLON, Species.GOOMY, Species.SLIGGOO, Species.GOODRA, + Species.KLEFKI, Species.PHANTUMP, Species.TREVENANT, Species.PUMPKABOO, Species.GOURGEIST, Species.ZYGARDE, + Species.HOOPA, Species.DECIDUEYE, Species.GRUBBIN, Species.CHARJABUG, Species.VIKAVOLT, Species.DEWPIDER, Species.ARAQUANID, + Species.FOMANTIS, + Species.LURANTIS, Species.SALANDIT, Species.SALAZZLE, Species.WIMPOD, Species.GOLISOPOD, Species.PHEROMOSA, Species.MARSHADOW, + Species.INTELEON, Species.CHEWTLE, Species.DREDNAW, Species.SILICOBRA, @@ -62405,13 +64577,29 @@ export const tmSpecies: TmSpecies = { Species.GRAPPLOCT, Species.SNOM, Species.FROSMOTH, + Species.KLEAVOR, Species.TAROUNTULA, Species.SPIDOPS, Species.NYMBLE, + Species.LOKIX, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.RELLOR, + Species.RABSCA, Species.TINKATINK, Species.TINKATUFF, Species.TINKATON, + Species.DUDUNSPARCE, + Species.SLITHER_WING, Species.ALOLA_PERSIAN, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, ], [Moves.BURNING_JEALOUSY]: [ Species.VULPIX, @@ -62719,11 +64907,16 @@ export const tmSpecies: TmSpecies = { Species.HITMONTOP, Species.COMBUSKEN, Species.BLAZIKEN, + Species.MAKUHITA, + Species.HARIYAMA, + Species.INFERNAPE, Species.RIOLU, Species.LUCARIO, Species.CROAGUNK, Species.TOXICROAK, Species.GALLADE, + Species.PIGNITE, + Species.EMBOAR, Species.TIMBURR, Species.GURDURR, Species.CONKELDURR, @@ -62737,9 +64930,13 @@ export const tmSpecies: TmSpecies = { Species.TERRAKION, Species.VIRIZION, Species.KELDEO, + Species.MELOETTA, + Species.CHESNAUGHT, Species.PANCHAM, Species.PANGORO, Species.HAWLUCHA, + Species.CRABRAWLER, + Species.CRABOMINABLE, Species.STUFFUL, Species.BEWEAR, Species.PASSIMIAN, @@ -62757,7 +64954,17 @@ export const tmSpecies: TmSpecies = { Species.ZAMAZENTA, Species.KUBFU, Species.URSHIFU, + Species.SNEASLER, + Species.QUAQUAVAL, + Species.PAWMO, + Species.PAWMOT, + Species.ANNIHILAPE, + Species.IRON_VALIANT, + Species.IRON_LEAVES, Species.GALAR_ZAPDOS, + Species.HISUI_SNEASEL, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, ], [Moves.FLIP_TURN]: [ Species.SQUIRTLE, @@ -62765,6 +64972,10 @@ export const tmSpecies: TmSpecies = { Species.BLASTOISE, Species.PSYDUCK, Species.GOLDUCK, + Species.TENTACOOL, + Species.TENTACRUEL, + Species.SEEL, + Species.DEWGONG, Species.HORSEA, Species.SEADRA, Species.GOLDEEN, @@ -62774,6 +64985,11 @@ export const tmSpecies: TmSpecies = { Species.VAPOREON, Species.KABUTOPS, Species.MEW, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.CHINCHOU, + Species.LANTURN, Species.QWILFISH, Species.KINGDRA, Species.SWAMPERT, @@ -62781,6 +64997,7 @@ export const tmSpecies: TmSpecies = { Species.SHARPEDO, Species.MILOTIC, Species.LUVDISC, + Species.LATIOS, Species.PIPLUP, Species.PRINPLUP, Species.EMPOLEON, @@ -62820,24 +65037,34 @@ export const tmSpecies: TmSpecies = { Species.HISUI_SAMUROTT, ], [Moves.TRIPLE_AXEL]: [ + Species.SEEL, + Species.DEWGONG, Species.JYNX, Species.ARTICUNO, Species.MEW, + Species.BELLOSSOM, Species.SNEASEL, Species.DELIBIRD, Species.HITMONTOP, Species.KIRLIA, Species.GARDEVOIR, Species.MILOTIC, + Species.PIPLUP, + Species.PRINPLUP, + Species.EMPOLEON, + Species.AMBIPOM, Species.BUNEARY, Species.LOPUNNY, Species.WEAVILE, Species.GLACEON, Species.GALLADE, Species.FROSLASS, + Species.LEAVANNY, Species.MINCCINO, Species.CINCCINO, Species.CRYOGONAL, + Species.MIENSHAO, + Species.MELOETTA, Species.POPPLIO, Species.BRIONNE, Species.PRIMARINA, @@ -62846,10 +65073,14 @@ export const tmSpecies: TmSpecies = { Species.PHEROMOSA, Species.MR_RIME, Species.FROSMOTH, + Species.MEOWSCARADA, + Species.QUAXWELL, + Species.QUAQUAVAL, Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, Species.ALOLA_NINETALES, Species.GALAR_MR_MIME, + Species.HISUI_LILLIGANT, ], [Moves.DUAL_WINGBEAT]: [ Species.CHARIZARD, @@ -62890,6 +65121,7 @@ export const tmSpecies: TmSpecies = { Species.FLYGON, Species.SWABLU, Species.ALTARIA, + Species.TROPIUS, Species.SALAMENCE, Species.LATIAS, Species.LATIOS, @@ -62934,6 +65166,9 @@ export const tmSpecies: TmSpecies = { Species.ROWLET, Species.DARTRIX, Species.DECIDUEYE, + Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, Species.VIKAVOLT, Species.ORICORIO, Species.CUTIEFLY, @@ -62986,10 +65221,14 @@ export const tmSpecies: TmSpecies = { Species.FLAREON, Species.MOLTRES, Species.MEW, + Species.TYPHLOSION, Species.STEELIX, + Species.MAGCARGO, Species.ENTEI, Species.HO_OH, Species.BLAZIKEN, + Species.NUMEL, + Species.CAMERUPT, Species.TORKOAL, Species.TRAPINCH, Species.VIBRAVA, @@ -62997,6 +65236,10 @@ export const tmSpecies: TmSpecies = { Species.BALTOY, Species.CLAYDOL, Species.GROUDON, + Species.INFERNAPE, + Species.TORTERRA, + Species.SHIELDON, + Species.BASTIODON, Species.GIBLE, Species.GABITE, Species.GARCHOMP, @@ -63005,6 +65248,7 @@ export const tmSpecies: TmSpecies = { Species.RHYPERIOR, Species.MAGMORTAR, Species.HEATRAN, + Species.ARCEUS, Species.VICTINI, Species.DRILBUR, Species.EXCADRILL, @@ -63015,12 +65259,16 @@ export const tmSpecies: TmSpecies = { Species.GOLURK, Species.HEATMOR, Species.RESHIRAM, + Species.LANDORUS, + Species.DELPHOX, Species.DIGGERSBY, Species.ZYGARDE, + Species.DIANCIE, Species.VOLCANION, Species.INCINEROAR, Species.SANDYGAST, Species.PALOSSAND, + Species.MINIOR, Species.TURTONATOR, Species.CINDERACE, Species.CARKOL, @@ -63037,6 +65285,8 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, Species.ALOLA_MAROWAK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, ], [Moves.TERA_BLAST]: [ Species.BULBASAUR, @@ -64070,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, @@ -64084,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, @@ -64098,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, @@ -64639,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, @@ -64650,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, @@ -64663,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, @@ -64676,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, @@ -64702,6 +66985,8 @@ export const tmSpecies: TmSpecies = { Species.MILOTIC, Species.SNORUNT, Species.GLALIE, + Species.LATIAS, + Species.LATIOS, Species.KYOGRE, Species.PIPLUP, Species.PRINPLUP, @@ -64727,6 +67012,8 @@ export const tmSpecies: TmSpecies = { "", "origin", ], + Species.PHIONE, + Species.MANAPHY, Species.ARCEUS, Species.OSHAWOTT, Species.DEWOTT, @@ -64737,6 +67024,8 @@ export const tmSpecies: TmSpecies = { "blue-striped", "white-striped", ], + Species.MINCCINO, + Species.CINCCINO, Species.DUCKLETT, Species.SWANNA, Species.ALOMOMOLA, @@ -64744,6 +67033,7 @@ export const tmSpecies: TmSpecies = { Species.BEARTIC, Species.CRYOGONAL, Species.TORNADUS, + Species.KELDEO, Species.FROAKIE, Species.FROGADIER, [ @@ -64764,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, @@ -65303,6 +67598,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.PSYBEAM]: ModifierTier.GREAT, [Moves.HYPER_BEAM]: ModifierTier.ULTRA, [Moves.LOW_KICK]: ModifierTier.COMMON, + [Moves.COUNTER]: ModifierTier.COMMON, [Moves.STRENGTH]: ModifierTier.GREAT, [Moves.SOLAR_BEAM]: ModifierTier.ULTRA, [Moves.FIRE_SPIN]: ModifierTier.COMMON, @@ -65358,6 +67654,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.STEEL_WING]: ModifierTier.GREAT, [Moves.ATTRACT]: ModifierTier.COMMON, [Moves.SLEEP_TALK]: ModifierTier.COMMON, + [Moves.HEAL_BELL]: ModifierTier.COMMON, [Moves.RETURN]: ModifierTier.ULTRA, [Moves.FRUSTRATION]: ModifierTier.COMMON, [Moves.SAFEGUARD]: ModifierTier.COMMON, @@ -65367,6 +67664,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ENCORE]: ModifierTier.COMMON, [Moves.IRON_TAIL]: ModifierTier.GREAT, [Moves.METAL_CLAW]: ModifierTier.COMMON, + [Moves.SYNTHESIS]: ModifierTier.GREAT, [Moves.HIDDEN_POWER]: ModifierTier.GREAT, [Moves.RAIN_DANCE]: ModifierTier.COMMON, [Moves.SUNNY_DAY]: ModifierTier.COMMON, @@ -65390,6 +67688,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.HELPING_HAND]: ModifierTier.COMMON, [Moves.TRICK]: ModifierTier.COMMON, [Moves.SUPERPOWER]: ModifierTier.ULTRA, + [Moves.RECYCLE]: ModifierTier.COMMON, [Moves.REVENGE]: ModifierTier.GREAT, [Moves.BRICK_BREAK]: ModifierTier.GREAT, [Moves.KNOCK_OFF]: ModifierTier.GREAT, @@ -65422,6 +67721,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.BOUNCE]: ModifierTier.GREAT, [Moves.MUD_SHOT]: ModifierTier.GREAT, [Moves.POISON_TAIL]: ModifierTier.GREAT, + [Moves.COVET]: ModifierTier.GREAT, [Moves.MAGICAL_LEAF]: ModifierTier.GREAT, [Moves.CALM_MIND]: ModifierTier.GREAT, [Moves.LEAF_BLADE]: ModifierTier.ULTRA, @@ -65432,6 +67732,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.GRAVITY]: ModifierTier.COMMON, [Moves.GYRO_BALL]: ModifierTier.COMMON, [Moves.BRINE]: ModifierTier.GREAT, + [Moves.PLUCK]: ModifierTier.GREAT, [Moves.TAILWIND]: ModifierTier.GREAT, [Moves.U_TURN]: ModifierTier.GREAT, [Moves.CLOSE_COMBAT]: ModifierTier.ULTRA, @@ -65439,14 +67740,17 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ASSURANCE]: ModifierTier.COMMON, [Moves.EMBARGO]: ModifierTier.COMMON, [Moves.FLING]: ModifierTier.COMMON, + [Moves.GASTRO_ACID]: ModifierTier.GREAT, [Moves.POWER_SWAP]: ModifierTier.COMMON, [Moves.GUARD_SWAP]: ModifierTier.COMMON, + [Moves.WORRY_SEED]: ModifierTier.GREAT, [Moves.TOXIC_SPIKES]: ModifierTier.GREAT, [Moves.FLARE_BLITZ]: ModifierTier.ULTRA, [Moves.AURA_SPHERE]: ModifierTier.GREAT, [Moves.ROCK_POLISH]: ModifierTier.COMMON, [Moves.POISON_JAB]: ModifierTier.GREAT, [Moves.DARK_PULSE]: ModifierTier.GREAT, + [Moves.AQUA_TAIL]: ModifierTier.GREAT, [Moves.SEED_BOMB]: ModifierTier.GREAT, [Moves.AIR_SLASH]: ModifierTier.GREAT, [Moves.X_SCISSOR]: ModifierTier.GREAT, @@ -65503,6 +67807,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.SCALD]: ModifierTier.GREAT, [Moves.HEX]: ModifierTier.GREAT, [Moves.SKY_DROP]: ModifierTier.GREAT, + [Moves.INCINERATE]: ModifierTier.GREAT, [Moves.QUASH]: ModifierTier.COMMON, [Moves.ACROBATICS]: ModifierTier.GREAT, [Moves.RETALIATE]: ModifierTier.GREAT, @@ -65538,7 +67843,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ELECTRIC_TERRAIN]: ModifierTier.COMMON, [Moves.DAZZLING_GLEAM]: ModifierTier.ULTRA, [Moves.INFESTATION]: ModifierTier.COMMON, - [Moves.DRAGON_ASCENT]: ModifierTier.ULTRA, + [Moves.POWER_UP_PUNCH]: ModifierTier.GREAT, [Moves.DARKEST_LARIAT]: ModifierTier.GREAT, [Moves.HIGH_HORSEPOWER]: ModifierTier.ULTRA, [Moves.SOLAR_BLADE]: ModifierTier.GREAT, @@ -65549,6 +67854,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.SPEED_SWAP]: ModifierTier.COMMON, [Moves.SMART_STRIKE]: ModifierTier.GREAT, [Moves.BRUTAL_SWING]: ModifierTier.GREAT, + [Moves.AURORA_VEIL]: ModifierTier.COMMON, [Moves.PSYCHIC_FANGS]: ModifierTier.GREAT, [Moves.STOMPING_TANTRUM]: ModifierTier.GREAT, [Moves.LIQUIDATION]: ModifierTier.ULTRA, diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 8a25406fc5a..a6cf4247f27 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -12,27 +12,28 @@ 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 {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 + COMMON, + UNCOMMON, + RARE, + SUPER_RARE, + ULTRA_RARE } export interface TrainerTierPools { - [key: integer]: Species[] + [key: integer]: Species[] } export enum TrainerSlot { - NONE, - TRAINER, - TRAINER_PARTNER + NONE, + TRAINER, + TRAINER_PARTNER } export class TrainerPartyTemplate { @@ -142,7 +143,7 @@ export const trainerPartyTemplates = { FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), - SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), + SIX_WEAK_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)), @@ -168,7 +169,7 @@ type PartyMemberFunc = (scene: BattleScene, level: integer, strength: PartyMembe type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[]; export interface PartyMemberFuncs { - [key: integer]: PartyMemberFunc + [key: integer]: PartyMemberFunc } export class TrainerConfig { @@ -201,6 +202,7 @@ export class TrainerConfig { public speciesPools: TrainerTierPools; public speciesFilter: PokemonSpeciesFilter; public specialtyTypes: Type[] = []; + public hasVoucher: boolean = false; public encounterMessages: string[] = []; public victoryMessages: string[] = []; @@ -228,7 +230,7 @@ export class TrainerConfig { return TrainerType[this.getDerivedType()].toString().toLowerCase(); } - getSpriteKey(female?: boolean,isDouble: boolean = false): string { + getSpriteKey(female?: boolean, isDouble: boolean = false): string { let ret = this.getKey(); if (this.hasGenders) { ret += `_${female ? "f" : "m"}`; @@ -257,6 +259,14 @@ export class TrainerConfig { 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()) { @@ -275,11 +285,11 @@ export class TrainerConfig { /** - * 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): TrainerType { + * 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: @@ -314,6 +324,15 @@ export class TrainerConfig { 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; @@ -335,11 +354,11 @@ export class TrainerConfig { } /** - * 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. - **/ + * 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") { @@ -352,7 +371,7 @@ export class TrainerConfig { this.nameFemale = i18next.t("trainerNames:rival_female"); } else { // Otherwise, assign the provided female name. - this.nameFemale = nameFemale; + this.nameFemale = nameFemale!; // TODO: is this bang correct? } // Indicate that this trainer configuration includes genders. @@ -372,11 +391,11 @@ export class TrainerConfig { } /** - * 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. - */ + * 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; @@ -387,10 +406,10 @@ export class TrainerConfig { } /** - * Sets the trainer type for double battles. - * @param trainerTypeDouble - The TrainerType of the partner in a double battle. - * @returns {TrainerConfig} - The updated TrainerConfig instance. - */ + * 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); @@ -398,9 +417,9 @@ export class TrainerConfig { } /** - * Sets the encounter and victory messages for double trainers. - * @param nameDouble - The name of the pair (e.g. "red_blue_double"). - */ + * 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]) { @@ -412,10 +431,10 @@ export class TrainerConfig { } /** - * 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. - */ + * 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()) { @@ -527,6 +546,119 @@ export class TrainerConfig { 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. @@ -556,9 +688,10 @@ export class TrainerConfig { const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); this.setTitle(title); - this.setMoneyMultiplier(2.25); + this.setMoneyMultiplier(2.5); this.setBoss(); this.setStaticParty(); + this.setHasVoucher(true); this.setBattleBgm("battle_plasma_boss"); this.setVictoryBgm("victory_team_plasma"); @@ -566,13 +699,13 @@ export class TrainerConfig { } /** - * 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 { + * 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(); @@ -611,24 +744,25 @@ export class TrainerConfig { 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 : null); + 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 { + * 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(); @@ -649,7 +783,7 @@ export class TrainerConfig { // Set species filter and specialty types if provided, otherwise filter by base total. if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) && p.baseTotal >= 450); + this.setSpeciesFilter(p => specialtyTypes.some(t => p.isOfType(t)) && p.baseTotal >= 450); this.setSpecialtyTypes(...specialtyTypes); } else { this.setSpeciesFilter(p => p.baseTotal >= 450); @@ -669,19 +803,20 @@ export class TrainerConfig { 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 : null)); + 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. - **/ + * 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()) { @@ -719,6 +854,7 @@ export class TrainerConfig { 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)); @@ -727,11 +863,11 @@ export class TrainerConfig { } /** - * 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. - **/ + * 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; @@ -756,11 +892,11 @@ export class TrainerConfig { } // Check if the female version exists in the i18n file if (i18next.exists(`trainerClasses:${this.name.toLowerCase()}`)) { - // If it does, return + // 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 + // 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 } } } @@ -772,7 +908,7 @@ export class TrainerConfig { return new Promise(resolve => { const isDouble = variant === TrainerVariant.DOUBLE; const trainerKey = this.getSpriteKey(variant === TrainerVariant.FEMALE, false); - const partnerTrainerKey = this.getSpriteKey(true,true); + const partnerTrainerKey = this.getSpriteKey(true, true); scene.loadAtlas(trainerKey, "trainer"); if (isDouble) { scene.loadAtlas(partnerTrainerKey, "trainer"); @@ -782,10 +918,20 @@ export class TrainerConfig { // 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 frameNames = scene.anims.generateFrameNames(trainerKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: 128 + }); const partnerFrameNames = isDouble - ? scene.anims.generateFrameNames(partnerTrainerKey, {zeroPad: 4,suffix: ".png",start: 1,end: 128}) - : null; + ? scene.anims.generateFrameNames(partnerTrainerKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: 128 + }) + : ""; console.warn = originalWarn; if (!(scene.anims.exists(trainerKey))) { scene.anims.create({ @@ -815,7 +961,7 @@ export class TrainerConfig { let t = 0; interface TrainerConfigs { - [key: integer]: TrainerConfig + [key: integer]: TrainerConfig } /** @@ -850,7 +996,7 @@ function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSl return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { let species = Utils.randSeedItem(speciesPool); if (!ignoreEvolution) { - species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength); + species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex); } return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); }; @@ -860,7 +1006,7 @@ function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilt const originalSpeciesFilter = speciesFilter; speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species); return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { - const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength)), level, trainerSlot, undefined, undefined, postProcess); + 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; }; } @@ -871,13 +1017,13 @@ function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: T for (let t = 0; t < Math.min(count, party.length); t++) { const randomIndex = Utils.randSeedItem(partyMemberIndexes); partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); - ret.push(modifierTypes.TERA_SHARD().generateType(null, [Utils.randSeedItem(types ? types : party[randomIndex].getTypes())]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); + 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[])[]; + [key in string]: (Species | Species[])[]; }; /* @@ -991,7 +1137,7 @@ export const signatureSpecies: SignatureSpecies = { 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], + 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], @@ -1182,197 +1328,242 @@ export const trainerConfigs: TrainerConfigs = { ), [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(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.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.SWINUB, Species.GLIGAR], + [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR], [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR], - [TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET] + [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.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.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.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.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK], [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG], [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD], [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON] }), - [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"],true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"],false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [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.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.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"],false, Type.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [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.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.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") + [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") + [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") + [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").setMixedBattleBgm("battle_hoenn_champion").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double") + [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").setMixedBattleBgm("battle_hoenn_champion").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double") + [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(); @@ -1381,56 +1572,60 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 1; p.generateAndPopulateMoveset(); })), - [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(signatureSpecies["CYNTHIA"],false).setBattleBgm("battle_sinnoh_champion").setMixedBattleBgm("battle_sinnoh_champion") + [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") + [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") + [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") + [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") + [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") + [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") + [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") + [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") + [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(); })), @@ -1456,7 +1651,7 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesFilter(species => species.baseTotal >= 540) .setGenModifiersFunc(party => { const starter = party[0]; - return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; + 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, @@ -1472,7 +1667,7 @@ export const trainerConfigs: TrainerConfigs = { })) .setGenModifiersFunc(party => { const starter = party[0]; - return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; + 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, @@ -1494,220 +1689,349 @@ export const trainerConfigs: TrainerConfigs = { p.shiny = true; p.variant = 1; p.formIndex = 1; + p.generateName(); })) .setGenModifiersFunc(party => { const starter = party[0]; - return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; + 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 => { + [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 => { + .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 => { + .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 => { + .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 => { + [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 => { + [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 => { + .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 => { + .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 => { + .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 => { + .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 => { + [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.KINGDRA, Species.LUDICOLO ], TrainerSlot.TRAINER, true, p => { + [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 => { + .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 => { + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.BEARTIC, Species.ARMALDO], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Swift Swim })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.OVERQWIL ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.abilityIndex = 0; // Swift Swim + p.abilityIndex = 1; // Swift Swim })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { + .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 => { + .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, Species.BASCULEGION ])) + [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.OVERQWIL ])) + .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 => { + .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 => { + [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 => { + .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 => { + .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 => { + .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 => { + [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.SLITHER_WING, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { + [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.ULTRA_BALL; + p.pokeball = PokeballType.MASTER_BALL; + p.formIndex = Utils.randSeedInt(5); })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DURANT ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DARMANITAN, Species.GALAR_DARMANITAN ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) + .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 => { + .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") + [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 ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MILOTIC ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HELIOLISK ])) + .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 => { + [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.GHOLDENGO, Species.AEGISLASH ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) + .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 => { + .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/trainer-names.ts b/src/data/trainer-names.ts index b986378ee47..899702ff193 100644 --- a/src/data/trainer-names.ts +++ b/src/data/trainer-names.ts @@ -3,7 +3,7 @@ import * as Utils from "../utils"; class TrainerNameConfig { public urls: string[]; - public femaleUrls: string[]; + public femaleUrls: string[] | null; constructor(type: TrainerType, ...urls: string[]) { this.urls = urls.length ? urls : [ Utils.toReadableString(TrainerType[type]).replace(/ /g, "_") ]; @@ -75,56 +75,56 @@ const trainerNameConfigs: TrainerNameConfigs = { }; export const trainerNamePools = { - [TrainerType.ACE_TRAINER]: [["Aaron","Allen","Blake","Brian","Gaven","Jake","Kevin","Mike","Nick","Paul","Ryan","Sean","Darin","Albert","Berke","Clyde","Edgar","George","Leroy","Owen","Parker","Randall","Ruben","Samuel","Vincent","Warren","Wilton","Zane","Alfred","Braxton","Felix","Gerald","Jonathan","Leonel","Marcel","Mitchell","Quincy","Roderick","Colby","Rolando","Yuji","Abel","Anton","Arthur","Cesar","Dalton","Dennis","Ernest","Garrett","Graham","Henry","Isaiah","Jonah","Jose","Keenan","Micah","Omar","Quinn","Rodolfo","Saul","Sergio","Skylar","Stefan","Zachery","Alton","Arabella","Bonita","Cal","Cody","French","Kobe","Paulo","Shaye","Austin","Beckett","Charlie","Corky","David","Dwayne","Elmer","Jesse","Jared","Johan","Jordan","Kipp","Lou","Terry","Tom","Webster","Billy","Doyle","Enzio","Geoff","Grant","Kelsey","Miguel","Pierce","Ray","Santino","Shel","Adelbert","Bence","Emil","Evan","Mathis","Maxim","Neil","Rico","Robbie","Theo","Viktor","Benedict","Cornelius","Hisato","Leopold","Neville","Vito","Chase","Cole","Hiroshi","Jackson","Jim","Kekoa","Makana","Yuki","Elwood","Seth","Alvin","Arjun","Arnold","Cameron","Carl","Carlton","Christopher","Dave","Dax","Dominic","Edmund","Finn","Fred","Garret","Grayson","Jace","Jaxson","Jay","Jirard","Johnson","Kayden","Kite","Louis","Mac","Marty","Percy","Raymond","Ronnie","Satch","Tim","Zach","Conner","Vince","Bedro","Boda","Botan","Daras","Dury","Herton","Rewn","Stum","Tock","Trilo","Berki","Cruik","Dazon","Desid","Dillot","Farfin","Forgon","Hebel","Morfon","Moril","Shadd","Vanhub","Bardo","Carben","Degin","Gorps","Klept","Lask","Malex","Mopar","Niled","Noxon","Teslor","Tetil"],["Beth","Carol","Cybil","Emma","Fran","Gwen","Irene","Jenn","Joyce","Kate","Kelly","Lois","Lola","Megan","Quinn","Reena","Cara","Alexa","Brooke","Caroline","Elaine","Hope","Jennifer","Jody","Julie","Lori","Mary","Michelle","Shannon","Wendy","Alexia","Alicia","Athena","Carolina","Cristin","Darcy","Dianne","Halle","Jazmyn","Katelynn","Keira","Marley","Allyson","Kathleen","Naomi","Alyssa","Ariana","Brandi","Breanna","Brenda","Brenna","Catherine","Clarice","Dana","Deanna","Destiny","Jamie","Jasmin","Kassandra","Laura","Maria","Mariah","Maya","Meagan","Mikayla","Monique","Natasha","Olivia","Sandra","Savannah","Sydney","Moira","Piper","Salma","Allison","Beverly","Cathy","Cheyenne","Clara","Dara","Eileen","Glinda","Junko","Lena","Lucille","Mariana","Olwen","Shanta","Stella","Angi","Belle","Chandra","Cora","Eve","Jacqueline","Jeanne","Juliet","Kathrine","Layla","Lucca","Melina","Miki","Nina","Sable","Shelly","Summer","Trish","Vicki","Alanza","Cordelia","Hilde","Imelda","Michele","Mireille","Claudia","Constance","Harriet","Honor","Melba","Portia","Alexis","Angela","Karla","Lindsey","Tori","Sheri","Jada","Kailee","Amanda","Annie","Kindra","Kyla","Sofia","Yvette","Becky","Flora","Gloria","Buna","Ferda","Lehan","Liqui","Lomen","Neira","Atilo","Detta","Gilly","Gosney","Levens","Moden","Rask","Rateis","Rosno","Tynan","Veron","Zoel","Cida","Dibsin","Dodin","Ebson","Equin","Flostin","Gabsen","Halsion","Hileon","Quelor","Rapeel","Roze","Tensin"]], - [TrainerType.ARTIST]: [["Ismael","William","Horton","Pierre","Zach","Gough","Salvador","Vincent","Duncan"],["Georgia"]], - [TrainerType.BACKERS]: [["Alf & Fred","Hawk & Dar","Joe & Ross","Les & Web","Masa & Yas","Stu & Art"],["Ai & Ciel","Ami & Eira","Cam & Abby","Fey & Sue","Kat & Phae","Kay & Ali","Ava & Aya","Cleo & Rio","May & Mal"]], - [TrainerType.BACKPACKER]: [["Alexander","Carlos","Herman","Jerome","Keane","Kelsey","Kiyo","Michael","Nate","Peter","Sam","Stephen","Talon","Terrance","Toru","Waylon","Boone","Clifford","Ivan","Kendall","Lowell","Randall","Reece","Roland","Shane","Walt","Farid","Heike","Joren","Lane","Roderick","Darnell","Deon","Emory","Graeme","Grayson","Aitor","Alex","Arturo","Asier","Jaime","Jonathan","Julio","Kevin","Kosuke","Lander","Markel","Mateo","Nil","Pau","Samuel"],["Anna","Corin","Elaine","Emi","Jill","Kumiko","Liz","Lois","Lora","Molly","Patty","Ruth","Vicki","Annie","Blossom","Clara","Eileen","Mae","Myra","Rachel","Tami","Ashley","Mikiko","Kiana","Perdy","Maria","Yuho","Peren","Barbara","Diane"]], - [TrainerType.BAKER]: ["Chris","Jenn","Lilly"], - [TrainerType.BEAUTY]: ["Cassie","Julia","Olivia","Samantha","Valerie","Victoria","Bridget","Connie","Jessica","Johanna","Melissa","Sheila","Shirley","Tiffany","Namiko","Thalia","Grace","Lola","Lori","Maura","Tamia","Cyndy","Devon","Gabriella","Harley","Lindsay","Nicola","Callie","Charlotte","Kassandra","December","Fleming","Nikola","Aimee","Anais","Brigitte","Cassandra","Andrea","Brittney","Carolyn","Krystal","Alexis","Alice","Aina","Anya","Arianna","Aubrey","Beverly","Camille","Beauty","Evette","Hansol","Haruka","Jill","Jo","Lana","Lois","Lucy","Mai","Nickie","Nicole","Prita","Rose","Shelly","Suzy","Tessa","Anita","Alissa","Rita","Cudsy","Eloff","Miru","Minot","Nevah","Niven","Ogoin"], - [TrainerType.BIKER]: ["Charles","Dwayne","Glenn","Harris","Joel","Riley","Zeke","Alex","Billy","Ernest","Gerald","Hideo","Isaac","Jared","Jaren","Jaxon","Jordy","Lao","Lukas","Malik","Nikolas","Ricardo","Ruben","Virgil","William","Aiden","Dale","Dan","Jacob","Markey","Reese","Teddy","Theron","Jeremy","Morgann","Phillip","Philip","Stanley","Dillon"], - [TrainerType.BLACK_BELT]: [["Kenji","Lao","Lung","Nob","Wai","Yoshi","Atsushi","Daisuke","Hideki","Hitoshi","Kiyo","Koichi","Koji","Yuji","Cristian","Rhett","Takao","Theodore","Zander","Aaron","Hugh","Mike","Nicolas","Shea","Takashi","Adam","Carl","Colby","Darren","David","Davon","Derek","Eddie","Gregory","Griffin","Jarrett","Jeffery","Kendal","Kyle","Luke","Miles","Nathaniel","Philip","Rafael","Ray","Ricky","Sean","Willie","Ander","Manford","Benjamin","Corey","Edward","Grant","Jay","Kendrew","Kentaro","Ryder","Teppei","Thomas","Tyrone","Andrey","Donny","Drago","Gordon","Grigor","Jeriel","Kenneth","Martell","Mathis","Rich","Rocky","Rodrigo","Wesley","Zachery","Alonzo","Cadoc","Gunnar","Igor","Killian","Markus","Ricardo","Yanis","Banting","Clayton","Duane","Earl","Greg","Roy","Terry","Tracy","Walter","Alvaro","Curtis","Francis","Ross","Brice","Cheng","Dudley","Eric","Kano","Masahiro","Randy","Ryuji","Steve","Tadashi","Wong","Yuen","Brian","Carter","Reece","Nick","Yang"],["Cora","Cyndy","Jill","Laura","Sadie","Tessa","Vivian","Aisha","Callie","Danielle","Helene","Jocelyn","Lilith","Paula","Reyna","Helen","Kelsey","Tyler","Amy","Chandra","Hillary","Janie","Lee","Maggie","Mikiko","Miriam","Sharon","Susie","Xiao","Alize","Azra","Brenda","Chalina","Chan","Glinda","Maki","Tia","Tiffany","Wendy","Andrea","Gabrielle","Gerardine","Hailey","Hedvig","Justine","Kinsey","Sigrid","Veronique","Tess"]], - [TrainerType.BREEDER]: [["Isaac","Myles","Salvadore","Albert","Kahlil","Eustace","Galen","Owen","Addison","Marcus","Foster","Cory","Glenn","Jay","Wesley","William","Adrian","Bradley","Jaime"],["Allison","Alize","Bethany","Lily","Lydia","Gabrielle","Jayden","Pat","Veronica","Amber","Jennifer","Kaylee","Adelaide","Brooke","Ethel","April","Irene","Magnolia","Amala","Mercy","Amanda","Ikue","Savannah","Yuka","Chloe","Debra","Denise","Elena"]], - [TrainerType.CLERK]: [["Chaz","Clemens","Doug","Fredric","Ivan","Isaac","Nelson","Wade","Warren","Augustin","Gilligan","Cody","Jeremy","Shane","Dugal","Royce","Ronald"],["Alberta","Ingrid","Katie","Piper","Trisha","Wren","Britney","Lana","Jessica","Kristen","Michelle","Gabrielle"]], - [TrainerType.CYCLIST]: [["Axel","James","John","Ryan","Hector","Jeremiah"],["Kayla","Megan","Nicole","Rachel","Krissa","Adelaide"]], - [TrainerType.DANCER]: ["Brian","Davey","Dirk","Edmond","Mickey","Raymond","Cara","Julia","Maika","Mireille","Ronda","Zoe"], - [TrainerType.DEPOT_AGENT]: ["Josh","Hank","Vincent"], - [TrainerType.DOCTOR]: [["Hank","Jerry","Jules","Logan","Wayne","Braid","Derek","Heath","Julius","Kit","Graham"],["Kirsten","Sachiko","Shery","Carol","Dixie","Mariah"]], - [TrainerType.FIREBREATHER]: ["Bill","Burt","Cliff","Dick","Lyle","Ned","Otis","Ray","Richard","Walt"], - [TrainerType.FISHERMAN]: ["Andre","Arnold","Barney","Chris","Edgar","Henry","Jonah","Justin","Kyle","Martin","Marvin","Ralph","Raymond","Scott","Stephen","Wilton","Tully","Andrew","Barny","Carter","Claude","Dale","Elliot","Eugene","Ivan","Ned","Nolan","Roger","Ronald","Wade","Wayne","Darian","Kai","Chip","Hank","Kaden","Tommy","Tylor","Alec","Brett","Cameron","Cody","Cole","Cory","Erick","George","Joseph","Juan","Kenneth","Luc","Miguel","Travis","Walter","Zachary","Josh","Gideon","Kyler","Liam","Murphy","Bruce","Damon","Devon","Hubert","Jones","Lydon","Mick","Pete","Sean","Sid","Vince","Bucky","Dean","Eustace","Kenzo","Leroy","Mack","Ryder","Ewan","Finn","Murray","Seward","Shad","Wharton","Finley","Fisher","Fisk","River","Sheaffer","Timin","Carl","Ernest","Hal","Herbert","Hisato","Mike","Vernon","Harriet","Marina","Chase"], - [TrainerType.GUITARIST]: ["Anna","Beverly","January","Tina","Alicia","Claudia","Julia","Lidia","Mireia","Noelia","Sara","Sheila","Tatiana"], - [TrainerType.HARLEQUIN]: ["Charley","Ian","Jack","Kerry","Louis","Pat","Paul","Rick","Anders","Clarence","Gary"], - [TrainerType.HIKER]: ["Anthony","Bailey","Benjamin","Daniel","Erik","Jim","Kenny","Leonard","Michael","Parry","Phillip","Russell","Sidney","Tim","Timothy","Alan","Brice","Clark","Eric","Lenny","Lucas","Mike","Trent","Devan","Eli","Marc","Sawyer","Allen","Daryl","Dudley","Earl","Franklin","Jeremy","Marcos","Nob","Oliver","Wayne","Alexander","Damon","Jonathan","Justin","Kevin","Lorenzo","Louis","Maurice","Nicholas","Reginald","Robert","Theodore","Bruce","Clarke","Devin","Dwight","Edwin","Eoin","Noland","Russel","Andy","Bret","Darrell","Gene","Hardy","Hugh","Jebediah","Jeremiah","Kit","Neil","Terrell","Don","Doug","Hunter","Jared","Jerome","Keith","Manuel","Markus","Otto","Shelby","Stephen","Teppei","Tobias","Wade","Zaiem","Aaron","Alain","Bergin","Bernard","Brent","Corwin","Craig","Delmon","Dunstan","Orestes","Ross","Davian","Calhoun","David","Gabriel","Ryan","Thomas","Travis","Zachary","Anuhea","Barnaby","Claus","Collin","Colson","Dexter","Dillan","Eugine","Farkas","Hisato","Julius","Kenji","Irwin","Lionel","Paul","Richter","Valentino","Donald","Douglas","Kevyn","Chester"], //["Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira"] - [TrainerType.HOOLIGANS]: ["Jim & Cas","Rob & Sal"], - [TrainerType.HOOPSTER]: ["Bobby","John","Lamarcus","Derrick","Nicolas"], - [TrainerType.INFIELDER]: ["Alex","Connor","Todd"], - [TrainerType.JANITOR]: ["Caleb","Geoff","Brady","Felix","Orville","Melvin","Shawn"], - [TrainerType.LINEBACKER]: ["Bob","Dan","Jonah"], - [TrainerType.MAID]: ["Belinda","Sophie","Emily","Elena","Clare","Alica","Tanya","Tammy"], - [TrainerType.MUSICIAN]: ["Boris","Preston","Charles","Clyde","Vincent","Dalton","Kirk","Shawn","Fabian","Fernando","Joseph","Marcos","Arturo","Jerry","Lonnie","Tony"], - [TrainerType.NURSERY_AIDE]: ["Autumn","Briana","Leah","Miho","Ethel","Hollie","Ilse","June","Kimya","Rosalyn"], - [TrainerType.OFFICER]: ["Dirk","Keith","Alex","Bobby","Caleb","Danny","Dylan","Thomas","Daniel","Jeff","Braven","Dell","Neagle","Haruki","Mitchell","Raymond"], - [TrainerType.PARASOL_LADY]: ["Angelica","Clarissa","Madeline","Akari","Annabell","Kayley","Rachel","Alexa","Sabrina","April","Gwyneth","Laura","Lumi","Mariah","Melita","Nicole","Tihana","Ingrid","Tyra"], - [TrainerType.PILOT]: ["Chase","Leonard","Ted","Elron","Ewing","Flynn","Winslow"], - [TrainerType.POKEFAN]: [["Alex","Allan","Brandon","Carter","Colin","Derek","Jeremy","Joshua","Rex","Robert","Trevor","William","Colton","Miguel","Francisco","Kaleb","Leonard","Boone","Elliot","Jude","Norbert","Corey","Gabe","Baxter"],["Beverly","Georgia","Jaime","Ruth","Isabel","Marissa","Vanessa","Annika","Bethany","Kimberly","Meredith","Rebekah","Eleanor","Darcy","Lydia","Sachiko","Abigail","Agnes","Lydie","Roisin","Tara","Carmen","Janet"]], - [TrainerType.PRESCHOOLER]: [["Billy","Doyle","Evan","Homer","Tully","Albert","Buster","Greg","Ike","Jojo","Tyrone","Adrian","Oliver","Hayden","Hunter","Kaleb","Liam","Dylan"],["Juliet","Mia","Sarah","Wendy","Winter","Chrissy","Eva","Lin","Samantha","Ella","Lily","Natalie","Ailey","Hannah","Malia","Kindra","Nancy"]], - [TrainerType.PSYCHIC]: [["Fidel","Franklin","Gilbert","Greg","Herman","Jared","Mark","Nathan","Norman","Phil","Richard","Rodney","Cameron","Edward","Fritz","Joshua","Preston","Virgil","William","Alvaro","Blake","Cedric","Keenan","Nicholas","Dario","Johan","Lorenzo","Tyron","Bryce","Corbin","Deandre","Elijah","Kody","Landon","Maxwell","Mitchell","Sterling","Eli","Nelson","Vernon","Gaven","Gerard","Low","Micki","Perry","Rudolf","Tommy","Al","Nandor","Tully","Arthur","Emanuel","Franz","Harry","Paschal","Robert","Sayid","Angelo","Anton","Arin","Avery","Danny","Frasier","Harrison","Jaime","Ross","Rui","Vlad","Mason"],["Alexis","Hannah","Jacki","Jaclyn","Kayla","Maura","Samantha","Alix","Brandi","Edie","Macey","Mariella","Marlene","Laura","Rodette","Abigail","Brittney","Chelsey","Daisy","Desiree","Kendra","Lindsey","Rachael","Valencia","Belle","Cybil","Doreen","Dua","Future","Lin","Madhu","Alia","Ena","Joyce","Lynette","Olesia","Sarah"]], - [TrainerType.RANGER]: [["Carlos","Jackson","Sebastian","Gav","Lorenzo","Logan","Nicolas","Trenton","Deshawn","Dwayne","Jeffery","Kyler","Taylor","Alain","Claude","Crofton","Forrest","Harry","Jaden","Keith","Lewis","Miguel","Pedro","Ralph","Richard","Bret","Daryl","Eddie","Johan","Leaf","Louis","Maxwell","Parker","Rick","Steve","Bjorn","Chaise","Dean","Lee","Maurice","Nash","Ralf","Reed","Shinobu","Silas"],["Catherine","Jenna","Sophia","Merdith","Nora","Beth","Chelsea","Katelyn","Madeline","Allison","Ashlee","Felicia","Krista","Annie","Audra","Brenda","Chloris","Eliza","Heidi","Irene","Mary","Mylene","Shanti","Shelly","Thalia","Anja","Briana","Dianna","Elaine","Elle","Hillary","Katie","Lena","Lois","Malory","Melita","Mikiko","Naoko","Serenity","Ambre","Brooke","Clementine","Melina","Petra","Twiggy"]], - [TrainerType.RICH]: [["Alfred","Edward","Gregory","Preston","Thomas","Tucker","Walter","Clifford","Everett","Micah","Nate","Pierre","Terrance","Arthur","Brooks","Emanuel","Lamar","Jeremy","Leonardo","Milton","Frederic","Renaud","Robert","Yan","Daniel","Sheldon","Stonewall","Gerald","Ronald","Smith","Stanley","Reginald","Orson","Wilco","Caden","Glenn"],["Rebecca","Reina","Cassandra","Emilia","Grace","Marian","Elizabeth","Kathleen","Sayuri","Caroline","Judy"]], - [TrainerType.RICH_KID]: [["Garret","Winston","Dawson","Enrique","Jason","Roman","Trey","Liam","Anthony","Brad","Cody","Manuel","Martin","Pierce","Rolan","Keenan","Filbert","Antoin","Cyus","Diek","Dugo","Flitz","Jurek","Lond","Perd","Quint","Basto","Benit","Brot","Denc","Guyit","Marcon","Perc","Puros","Roex","Sainz","Symin","Tark","Venak"],["Anette","Brianna","Cindy","Colleen","Daphne","Elizabeth","Naomi","Sarah","Charlotte","Gillian","Jacki","Lady","Melissa","Celeste","Colette","Elizandra","Isabel","Lynette","Magnolia","Sophie","Lina","Dulcie","Auro","Brin","Caril","Eloos","Gwin","Illa","Kowly","Rima","Ristin","Vesey","Brena","Deasy","Denslon","Kylet","Nemi","Rene","Sanol","Stouner","Sturk","Talmen","Zoila"]], - [TrainerType.ROUGHNECK]: ["Camron","Corey","Gabriel","Isaiah","Jamal","Koji","Luke","Paxton","Raul","Zeek","Kirby","Chance","Dave","Fletcher","Johnny","Reese","Joey","Ricky","Silvester","Martin"], - [TrainerType.SAILOR]: ["Alberto","Bost","Brennan","Brenden","Claude","Cory","Damian","Dirk","Duncan","Dwayne","Dylan","Eddie","Edmond","Elijah","Ernest","Eugene","Garrett","Golos","Gratin","Grestly","Harry","Hols","Hudson","Huey","Jebol","Jeff","Leonald","Luther","Kelvin","Kenneth","Kent","Knook","Marc","Mifis","Monar","Morkor","Ordes","Oxlin","Parker","Paul","Philip","Roberto","Samson","Skyler","Stanly","Tebu","Terrell","Trevor","Yasu","Zachariah"], - [TrainerType.SCIENTIST]: [["Jed","Marc","Mitch","Rich","Ross","Beau","Braydon","Connor","Ed","Ivan","Jerry","Jose","Joshua","Parker","Rodney","Taylor","Ted","Travis","Zackery","Darrius","Emilio","Fredrick","Shaun","Stefano","Travon","Daniel","Garett","Gregg","Linden","Lowell","Trenton","Dudley","Luke","Markus","Nathan","Orville","Randall","Ron","Ronald","Simon","Steve","William","Franklin","Clarke","Jacques","Terrance","Ernst","Justus","Ikaika","Jayson","Kyle","Reid","Tyrone","Adam","Albert","Alphonse","Cory","Donnie","Elton","Francis","Gordon","Herbert","Humphrey","Jordan","Julian","Keaton","Levi","Melvin","Murray","West","Craig","Coren","Dubik","Kotan","Lethco","Mante","Mort","Myron","Odlow","Ribek","Roeck","Vogi","Vonder","Zogo","Doimo","Doton","Durel","Hildon","Kukla","Messa","Nanot","Platen","Raburn","Reman","Acrod","Coffy","Elrok","Foss","Hardig","Hombol","Hospel","Kaller","Klots","Krilok","Limar","Loket","Mesak","Morbit","Newin","Orill","Tabor","Tekot"],["Blythe","Chan","Kathrine","Marie","Maria","Naoko","Samantha","Satomi","Shannon","Athena","Caroline","Lumi","Lumina","Marissa","Sonia"]], - [TrainerType.SMASHER]: ["Aspen","Elena","Mari","Amy","Lizzy"], - [TrainerType.SNOW_WORKER]: [["Braden","Brendon","Colin","Conrad","Dillan","Gary","Gerardo","Holden","Jackson","Mason","Quentin","Willy","Noel","Arnold","Brady","Brand","Cairn","Cliff","Don","Eddie","Felix","Filipe","Glenn","Gus","Heath","Matthew","Patton","Rich","Rob","Ryan","Scott","Shelby","Sterling","Tyler","Victor","Zack","Friedrich","Herman","Isaac","Leo","Maynard","Mitchell","Morgann","Nathan","Niel","Pasqual","Paul","Tavarius","Tibor","Dimitri","Narek","Yusif","Frank","Jeff","Vaclav","Ovid","Francis","Keith","Russel","Sangon","Toway","Bomber","Chean","Demit","Hubor","Kebile","Laber","Ordo","Retay","Ronix","Wagel","Dobit","Kaster","Lobel","Releo","Saken","Rustix"],["Georgia","Sandra","Yvonne"]], - [TrainerType.STRIKER]: ["Marco","Roberto","Tony"], - [TrainerType.SCHOOL_KID]: [["Alan","Billy","Chad","Danny","Dudley","Jack","Joe","Johnny","Kipp","Nate","Ricky","Tommy","Jerry","Paul","Ted","Chance","Esteban","Forrest","Harrison","Connor","Sherman","Torin","Travis","Al","Carter","Edgar","Jem","Sammy","Shane","Shayne","Alvin","Keston","Neil","Seymour","William","Carson","Clark","Nolan"],["Georgia","Karen","Meiko","Christine","Mackenzie","Tiera","Ann","Gina","Lydia","Marsha","Millie","Sally","Serena","Silvia","Alberta","Cassie","Mara","Rita","Georgie","Meena","Nitzel"]], - [TrainerType.SWIMMER]: [["Berke","Cameron","Charlie","George","Harold","Jerome","Kirk","Mathew","Parker","Randall","Seth","Simon","Tucker","Austin","Barry","Chad","Cody","Darrin","David","Dean","Douglas","Franklin","Gilbert","Herman","Jack","Luis","Matthew","Reed","Richard","Rodney","Roland","Spencer","Stan","Tony","Clarence","Declan","Dominik","Harrison","Kevin","Leonardo","Nolen","Pete","Santiago","Axle","Braden","Finn","Garrett","Mymo","Reece","Samir","Toby","Adrian","Colton","Dillon","Erik","Evan","Francisco","Glenn","Kurt","Oscar","Ricardo","Sam","Sheltin","Troy","Vincent","Wade","Wesley","Duane","Elmo","Esteban","Frankie","Ronald","Tyson","Bart","Matt","Tim","Wright","Jeffery","Kyle","Alessandro","Estaban","Kieran","Ramses","Casey","Dakota","Jared","Kalani","Keoni","Lawrence","Logan","Robert","Roddy","Yasu","Derek","Jacob","Bruce","Clayton"],["Briana","Dawn","Denise","Diana","Elaine","Kara","Kaylee","Lori","Nicole","Nikki","Paula","Susie","Wendy","Alice","Beth","Beverly","Brenda","Dana","Debra","Grace","Jenny","Katie","Laurel","Linda","Missy","Sharon","Tanya","Tara","Tisha","Carlee","Imani","Isabelle","Kyla","Sienna","Abigail","Amara","Anya","Connie","Maria","Melissa","Nora","Shirley","Shania","Tiffany","Aubree","Cassandra","Claire","Crystal","Erica","Gabrielle","Haley","Jessica","Joanna","Lydia","Mallory","Mary","Miranda","Paige","Sophia","Vanessa","Chelan","Debbie","Joy","Kendra","Leona","Mina","Caroline","Joyce","Larissa","Rebecca","Tyra","Dara","Desiree","Kaoru","Ruth","Coral","Genevieve","Isla","Marissa","Romy","Sheryl","Alexandria","Alicia","Chelsea","Jade","Kelsie","Laura","Portia","Shelby","Sara","Tiare","Kyra","Natasha","Layla","Scarlett","Cora"]], - [TrainerType.TWINS]: ["Amy & May","Jo & Zoe","Meg & Peg","Ann & Anne","Lea & Pia","Amy & Liv","Gina & Mia","Miu & Yuki","Tori & Tia","Eli & Anne","Jen & Kira","Joy & Meg","Kiri & Jan","Miu & Mia","Emma & Lil","Liv & Liz","Teri & Tia","Amy & Mimi","Clea & Gil","Day & Dani","Kay & Tia","Tori & Til","Saya & Aya","Emy & Lin","Kumi & Amy","Mayo & May","Ally & Amy","Lia & Lily","Rae & Ula","Sola & Ana","Tara & Val","Faith & Joy","Nana & Nina"], - [TrainerType.VETERAN]: [["Armando","Brenden","Brian","Clayton","Edgar","Emanuel","Grant","Harlan","Terrell","Arlen","Chester","Hugo","Martell","Ray","Shaun","Abraham","Carter","Claude","Jerry","Lucius","Murphy","Rayne","Ron","Sinan","Sterling","Vincent","Zach","Gerard","Gilles","Louis","Timeo","Akira","Don","Eric","Harry","Leon","Roger","Angus","Aristo","Brone","Johnny"],["Julia","Karla","Kim","Sayuri","Tiffany","Cathy","Cecile","Chloris","Denae","Gina","Maya","Oriana","Portia","Rhona","Rosaline","Catrina","Inga","Trisha","Heather","Lynn","Sheri","Alonsa","Ella","Leticia","Kiara"]], - [TrainerType.WAITER]: [["Bert","Clint","Maxwell","Lou"],["Kati","Aurora","Bonita","Flo","Tia","Jan","Olwen","Paget","Paula","Talia"]], - [TrainerType.WORKER]: [["Braden","Brendon","Colin","Conrad","Dillan","Gary","Gerardo","Holden","Jackson","Mason","Quentin","Willy","Noel","Arnold","Brady","Brand","Cairn","Cliff","Don","Eddie","Felix","Filipe","Glenn","Gus","Heath","Matthew","Patton","Rich","Rob","Ryan","Scott","Shelby","Sterling","Tyler","Victor","Zack","Friedrich","Herman","Isaac","Leo","Maynard","Mitchell","Morgann","Nathan","Niel","Pasqual","Paul","Tavarius","Tibor","Dimitri","Narek","Yusif","Frank","Jeff","Vaclav","Ovid","Francis","Keith","Russel","Sangon","Toway","Bomber","Chean","Demit","Hubor","Kebile","Laber","Ordo","Retay","Ronix","Wagel","Dobit","Kaster","Lobel","Releo","Saken","Rustix"],["Georgia","Sandra","Yvonne"]], - [TrainerType.YOUNGSTER]: [["Albert","Gordon","Ian","Jason","Jimmy","Mikey","Owen","Samuel","Warren","Allen","Ben","Billy","Calvin","Dillion","Eddie","Joey","Josh","Neal","Timmy","Tommy","Breyden","Deandre","Demetrius","Dillon","Jaylen","Johnson","Shigenobu","Chad","Cole","Cordell","Dan","Dave","Destin","Nash","Tyler","Yasu","Austin","Dallas","Darius","Donny","Jonathon","Logan","Michael","Oliver","Sebastian","Tristan","Wayne","Norman","Roland","Regis","Abe","Astor","Keita","Kenneth","Kevin","Kyle","Lester","Masao","Nicholas","Parker","Wes","Zachary","Cody","Henley","Jaye","Karl","Kenny","Masahiro","Pedro","Petey","Sinclair","Terrell","Waylon","Aidan","Anthony","David","Jacob","Jayden","Cutler","Ham","Caleb","Kai","Honus","Kenway","Bret","Chris","Cid","Dennis","Easton","Ken","Robby","Ronny","Shawn","Benjamin","Jake","Travis","Adan","Aday","Beltran","Elian","Hernan","Julen","Luka","Roi","Bernie","Dustin","Jonathan","Wyatt"],["Alice","Bridget","Carrie","Connie","Dana","Ellen","Krise","Laura","Linda","Michelle","Shannon","Andrea","Crissy","Janice","Robin","Sally","Tiana","Haley","Ali","Ann","Dalia","Dawn","Iris","Joana","Julia","Kay","Lisa","Megan","Mikaela","Miriam","Paige","Reli","Blythe","Briana","Caroline","Cassidy","Kaitlin","Madeline","Molly","Natalie","Samantha","Sarah","Cathy","Dye","Eri","Eva","Fey","Kara","Lurleen","Maki","Mali","Maya","Miki","Sibyl","Daya","Diana","Flo","Helia","Henrietta","Isabel","Mai","Persephone","Serena","Anna","Charlotte","Elin","Elsa","Lise","Sara","Suzette","Audrey","Emmy","Isabella","Madison","Rika","Rylee","Salla","Ellie","Alexandra","Amy","Lass","Brittany","Chel","Cindy","Dianne","Emily","Emma","Evelyn","Hana","Harleen","Hazel","Jocelyn","Katrina","Kimberly","Lina","Marge","Mila","Mizuki","Rena","Sal","Satoko","Summer","Tomoe","Vicky","Yue","Yumi","Lauren","Rei","Riley","Lois","Nancy","Tammy","Terry"]], - [TrainerType.HEX_MANIAC]: ["Kindra","Patricia","Tammy","Tasha","Valerie","Alaina","Kathleen","Leah","Makie","Sylvia","Anina","Arachna","Carrie","Desdemona","Josette","Luna","Melanie","Osanna","Raziah"], + [TrainerType.ACE_TRAINER]: [["Aaron", "Allen", "Blake", "Brian", "Gaven", "Jake", "Kevin", "Mike", "Nick", "Paul", "Ryan", "Sean", "Darin", "Albert", "Berke", "Clyde", "Edgar", "George", "Leroy", "Owen", "Parker", "Randall", "Ruben", "Samuel", "Vincent", "Warren", "Wilton", "Zane", "Alfred", "Braxton", "Felix", "Gerald", "Jonathan", "Leonel", "Marcel", "Mitchell", "Quincy", "Roderick", "Colby", "Rolando", "Yuji", "Abel", "Anton", "Arthur", "Cesar", "Dalton", "Dennis", "Ernest", "Garrett", "Graham", "Henry", "Isaiah", "Jonah", "Jose", "Keenan", "Micah", "Omar", "Quinn", "Rodolfo", "Saul", "Sergio", "Skylar", "Stefan", "Zachery", "Alton", "Arabella", "Bonita", "Cal", "Cody", "French", "Kobe", "Paulo", "Shaye", "Austin", "Beckett", "Charlie", "Corky", "David", "Dwayne", "Elmer", "Jesse", "Jared", "Johan", "Jordan", "Kipp", "Lou", "Terry", "Tom", "Webster", "Billy", "Doyle", "Enzio", "Geoff", "Grant", "Kelsey", "Miguel", "Pierce", "Ray", "Santino", "Shel", "Adelbert", "Bence", "Emil", "Evan", "Mathis", "Maxim", "Neil", "Rico", "Robbie", "Theo", "Viktor", "Benedict", "Cornelius", "Hisato", "Leopold", "Neville", "Vito", "Chase", "Cole", "Hiroshi", "Jackson", "Jim", "Kekoa", "Makana", "Yuki", "Elwood", "Seth", "Alvin", "Arjun", "Arnold", "Cameron", "Carl", "Carlton", "Christopher", "Dave", "Dax", "Dominic", "Edmund", "Finn", "Fred", "Garret", "Grayson", "Jace", "Jaxson", "Jay", "Jirard", "Johnson", "Kayden", "Kite", "Louis", "Mac", "Marty", "Percy", "Raymond", "Ronnie", "Satch", "Tim", "Zach", "Conner", "Vince", "Bedro", "Boda", "Botan", "Daras", "Dury", "Herton", "Rewn", "Stum", "Tock", "Trilo", "Berki", "Cruik", "Dazon", "Desid", "Dillot", "Farfin", "Forgon", "Hebel", "Morfon", "Moril", "Shadd", "Vanhub", "Bardo", "Carben", "Degin", "Gorps", "Klept", "Lask", "Malex", "Mopar", "Niled", "Noxon", "Teslor", "Tetil"], ["Beth", "Carol", "Cybil", "Emma", "Fran", "Gwen", "Irene", "Jenn", "Joyce", "Kate", "Kelly", "Lois", "Lola", "Megan", "Quinn", "Reena", "Cara", "Alexa", "Brooke", "Caroline", "Elaine", "Hope", "Jennifer", "Jody", "Julie", "Lori", "Mary", "Michelle", "Shannon", "Wendy", "Alexia", "Alicia", "Athena", "Carolina", "Cristin", "Darcy", "Dianne", "Halle", "Jazmyn", "Katelynn", "Keira", "Marley", "Allyson", "Kathleen", "Naomi", "Alyssa", "Ariana", "Brandi", "Breanna", "Brenda", "Brenna", "Catherine", "Clarice", "Dana", "Deanna", "Destiny", "Jamie", "Jasmin", "Kassandra", "Laura", "Maria", "Mariah", "Maya", "Meagan", "Mikayla", "Monique", "Natasha", "Olivia", "Sandra", "Savannah", "Sydney", "Moira", "Piper", "Salma", "Allison", "Beverly", "Cathy", "Cheyenne", "Clara", "Dara", "Eileen", "Glinda", "Junko", "Lena", "Lucille", "Mariana", "Olwen", "Shanta", "Stella", "Angi", "Belle", "Chandra", "Cora", "Eve", "Jacqueline", "Jeanne", "Juliet", "Kathrine", "Layla", "Lucca", "Melina", "Miki", "Nina", "Sable", "Shelly", "Summer", "Trish", "Vicki", "Alanza", "Cordelia", "Hilde", "Imelda", "Michele", "Mireille", "Claudia", "Constance", "Harriet", "Honor", "Melba", "Portia", "Alexis", "Angela", "Karla", "Lindsey", "Tori", "Sheri", "Jada", "Kailee", "Amanda", "Annie", "Kindra", "Kyla", "Sofia", "Yvette", "Becky", "Flora", "Gloria", "Buna", "Ferda", "Lehan", "Liqui", "Lomen", "Neira", "Atilo", "Detta", "Gilly", "Gosney", "Levens", "Moden", "Rask", "Rateis", "Rosno", "Tynan", "Veron", "Zoel", "Cida", "Dibsin", "Dodin", "Ebson", "Equin", "Flostin", "Gabsen", "Halsion", "Hileon", "Quelor", "Rapeel", "Roze", "Tensin"]], + [TrainerType.ARTIST]: [["Ismael", "William", "Horton", "Pierre", "Zach", "Gough", "Salvador", "Vincent", "Duncan"], ["Georgia"]], + [TrainerType.BACKERS]: [["Alf & Fred", "Hawk & Dar", "Joe & Ross", "Les & Web", "Masa & Yas", "Stu & Art"], ["Ai & Ciel", "Ami & Eira", "Cam & Abby", "Fey & Sue", "Kat & Phae", "Kay & Ali", "Ava & Aya", "Cleo & Rio", "May & Mal"]], + [TrainerType.BACKPACKER]: [["Alexander", "Carlos", "Herman", "Jerome", "Keane", "Kelsey", "Kiyo", "Michael", "Nate", "Peter", "Sam", "Stephen", "Talon", "Terrance", "Toru", "Waylon", "Boone", "Clifford", "Ivan", "Kendall", "Lowell", "Randall", "Reece", "Roland", "Shane", "Walt", "Farid", "Heike", "Joren", "Lane", "Roderick", "Darnell", "Deon", "Emory", "Graeme", "Grayson", "Aitor", "Alex", "Arturo", "Asier", "Jaime", "Jonathan", "Julio", "Kevin", "Kosuke", "Lander", "Markel", "Mateo", "Nil", "Pau", "Samuel"], ["Anna", "Corin", "Elaine", "Emi", "Jill", "Kumiko", "Liz", "Lois", "Lora", "Molly", "Patty", "Ruth", "Vicki", "Annie", "Blossom", "Clara", "Eileen", "Mae", "Myra", "Rachel", "Tami", "Ashley", "Mikiko", "Kiana", "Perdy", "Maria", "Yuho", "Peren", "Barbara", "Diane"]], + [TrainerType.BAKER]: ["Chris", "Jenn", "Lilly"], + [TrainerType.BEAUTY]: ["Cassie", "Julia", "Olivia", "Samantha", "Valerie", "Victoria", "Bridget", "Connie", "Jessica", "Johanna", "Melissa", "Sheila", "Shirley", "Tiffany", "Namiko", "Thalia", "Grace", "Lola", "Lori", "Maura", "Tamia", "Cyndy", "Devon", "Gabriella", "Harley", "Lindsay", "Nicola", "Callie", "Charlotte", "Kassandra", "December", "Fleming", "Nikola", "Aimee", "Anais", "Brigitte", "Cassandra", "Andrea", "Brittney", "Carolyn", "Krystal", "Alexis", "Alice", "Aina", "Anya", "Arianna", "Aubrey", "Beverly", "Camille", "Beauty", "Evette", "Hansol", "Haruka", "Jill", "Jo", "Lana", "Lois", "Lucy", "Mai", "Nickie", "Nicole", "Prita", "Rose", "Shelly", "Suzy", "Tessa", "Anita", "Alissa", "Rita", "Cudsy", "Eloff", "Miru", "Minot", "Nevah", "Niven", "Ogoin"], + [TrainerType.BIKER]: ["Charles", "Dwayne", "Glenn", "Harris", "Joel", "Riley", "Zeke", "Alex", "Billy", "Ernest", "Gerald", "Hideo", "Isaac", "Jared", "Jaren", "Jaxon", "Jordy", "Lao", "Lukas", "Malik", "Nikolas", "Ricardo", "Ruben", "Virgil", "William", "Aiden", "Dale", "Dan", "Jacob", "Markey", "Reese", "Teddy", "Theron", "Jeremy", "Morgann", "Phillip", "Philip", "Stanley", "Dillon"], + [TrainerType.BLACK_BELT]: [["Kenji", "Lao", "Lung", "Nob", "Wai", "Yoshi", "Atsushi", "Daisuke", "Hideki", "Hitoshi", "Kiyo", "Koichi", "Koji", "Yuji", "Cristian", "Rhett", "Takao", "Theodore", "Zander", "Aaron", "Hugh", "Mike", "Nicolas", "Shea", "Takashi", "Adam", "Carl", "Colby", "Darren", "David", "Davon", "Derek", "Eddie", "Gregory", "Griffin", "Jarrett", "Jeffery", "Kendal", "Kyle", "Luke", "Miles", "Nathaniel", "Philip", "Rafael", "Ray", "Ricky", "Sean", "Willie", "Ander", "Manford", "Benjamin", "Corey", "Edward", "Grant", "Jay", "Kendrew", "Kentaro", "Ryder", "Teppei", "Thomas", "Tyrone", "Andrey", "Donny", "Drago", "Gordon", "Grigor", "Jeriel", "Kenneth", "Martell", "Mathis", "Rich", "Rocky", "Rodrigo", "Wesley", "Zachery", "Alonzo", "Cadoc", "Gunnar", "Igor", "Killian", "Markus", "Ricardo", "Yanis", "Banting", "Clayton", "Duane", "Earl", "Greg", "Roy", "Terry", "Tracy", "Walter", "Alvaro", "Curtis", "Francis", "Ross", "Brice", "Cheng", "Dudley", "Eric", "Kano", "Masahiro", "Randy", "Ryuji", "Steve", "Tadashi", "Wong", "Yuen", "Brian", "Carter", "Reece", "Nick", "Yang"], ["Cora", "Cyndy", "Jill", "Laura", "Sadie", "Tessa", "Vivian", "Aisha", "Callie", "Danielle", "Helene", "Jocelyn", "Lilith", "Paula", "Reyna", "Helen", "Kelsey", "Tyler", "Amy", "Chandra", "Hillary", "Janie", "Lee", "Maggie", "Mikiko", "Miriam", "Sharon", "Susie", "Xiao", "Alize", "Azra", "Brenda", "Chalina", "Chan", "Glinda", "Maki", "Tia", "Tiffany", "Wendy", "Andrea", "Gabrielle", "Gerardine", "Hailey", "Hedvig", "Justine", "Kinsey", "Sigrid", "Veronique", "Tess"]], + [TrainerType.BREEDER]: [["Isaac", "Myles", "Salvadore", "Albert", "Kahlil", "Eustace", "Galen", "Owen", "Addison", "Marcus", "Foster", "Cory", "Glenn", "Jay", "Wesley", "William", "Adrian", "Bradley", "Jaime"], ["Allison", "Alize", "Bethany", "Lily", "Lydia", "Gabrielle", "Jayden", "Pat", "Veronica", "Amber", "Jennifer", "Kaylee", "Adelaide", "Brooke", "Ethel", "April", "Irene", "Magnolia", "Amala", "Mercy", "Amanda", "Ikue", "Savannah", "Yuka", "Chloe", "Debra", "Denise", "Elena"]], + [TrainerType.CLERK]: [["Chaz", "Clemens", "Doug", "Fredric", "Ivan", "Isaac", "Nelson", "Wade", "Warren", "Augustin", "Gilligan", "Cody", "Jeremy", "Shane", "Dugal", "Royce", "Ronald"], ["Alberta", "Ingrid", "Katie", "Piper", "Trisha", "Wren", "Britney", "Lana", "Jessica", "Kristen", "Michelle", "Gabrielle"]], + [TrainerType.CYCLIST]: [["Axel", "James", "John", "Ryan", "Hector", "Jeremiah"], ["Kayla", "Megan", "Nicole", "Rachel", "Krissa", "Adelaide"]], + [TrainerType.DANCER]: ["Brian", "Davey", "Dirk", "Edmond", "Mickey", "Raymond", "Cara", "Julia", "Maika", "Mireille", "Ronda", "Zoe"], + [TrainerType.DEPOT_AGENT]: ["Josh", "Hank", "Vincent"], + [TrainerType.DOCTOR]: [["Hank", "Jerry", "Jules", "Logan", "Wayne", "Braid", "Derek", "Heath", "Julius", "Kit", "Graham"], ["Kirsten", "Sachiko", "Shery", "Carol", "Dixie", "Mariah"]], + [TrainerType.FIREBREATHER]: ["Bill", "Burt", "Cliff", "Dick", "Lyle", "Ned", "Otis", "Ray", "Richard", "Walt"], + [TrainerType.FISHERMAN]: ["Andre", "Arnold", "Barney", "Chris", "Edgar", "Henry", "Jonah", "Justin", "Kyle", "Martin", "Marvin", "Ralph", "Raymond", "Scott", "Stephen", "Wilton", "Tully", "Andrew", "Barny", "Carter", "Claude", "Dale", "Elliot", "Eugene", "Ivan", "Ned", "Nolan", "Roger", "Ronald", "Wade", "Wayne", "Darian", "Kai", "Chip", "Hank", "Kaden", "Tommy", "Tylor", "Alec", "Brett", "Cameron", "Cody", "Cole", "Cory", "Erick", "George", "Joseph", "Juan", "Kenneth", "Luc", "Miguel", "Travis", "Walter", "Zachary", "Josh", "Gideon", "Kyler", "Liam", "Murphy", "Bruce", "Damon", "Devon", "Hubert", "Jones", "Lydon", "Mick", "Pete", "Sean", "Sid", "Vince", "Bucky", "Dean", "Eustace", "Kenzo", "Leroy", "Mack", "Ryder", "Ewan", "Finn", "Murray", "Seward", "Shad", "Wharton", "Finley", "Fisher", "Fisk", "River", "Sheaffer", "Timin", "Carl", "Ernest", "Hal", "Herbert", "Hisato", "Mike", "Vernon", "Harriet", "Marina", "Chase"], + [TrainerType.GUITARIST]: ["Anna", "Beverly", "January", "Tina", "Alicia", "Claudia", "Julia", "Lidia", "Mireia", "Noelia", "Sara", "Sheila", "Tatiana"], + [TrainerType.HARLEQUIN]: ["Charley", "Ian", "Jack", "Kerry", "Louis", "Pat", "Paul", "Rick", "Anders", "Clarence", "Gary"], + [TrainerType.HIKER]: ["Anthony", "Bailey", "Benjamin", "Daniel", "Erik", "Jim", "Kenny", "Leonard", "Michael", "Parry", "Phillip", "Russell", "Sidney", "Tim", "Timothy", "Alan", "Brice", "Clark", "Eric", "Lenny", "Lucas", "Mike", "Trent", "Devan", "Eli", "Marc", "Sawyer", "Allen", "Daryl", "Dudley", "Earl", "Franklin", "Jeremy", "Marcos", "Nob", "Oliver", "Wayne", "Alexander", "Damon", "Jonathan", "Justin", "Kevin", "Lorenzo", "Louis", "Maurice", "Nicholas", "Reginald", "Robert", "Theodore", "Bruce", "Clarke", "Devin", "Dwight", "Edwin", "Eoin", "Noland", "Russel", "Andy", "Bret", "Darrell", "Gene", "Hardy", "Hugh", "Jebediah", "Jeremiah", "Kit", "Neil", "Terrell", "Don", "Doug", "Hunter", "Jared", "Jerome", "Keith", "Manuel", "Markus", "Otto", "Shelby", "Stephen", "Teppei", "Tobias", "Wade", "Zaiem", "Aaron", "Alain", "Bergin", "Bernard", "Brent", "Corwin", "Craig", "Delmon", "Dunstan", "Orestes", "Ross", "Davian", "Calhoun", "David", "Gabriel", "Ryan", "Thomas", "Travis", "Zachary", "Anuhea", "Barnaby", "Claus", "Collin", "Colson", "Dexter", "Dillan", "Eugine", "Farkas", "Hisato", "Julius", "Kenji", "Irwin", "Lionel", "Paul", "Richter", "Valentino", "Donald", "Douglas", "Kevyn", "Chester"], //["Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira"] + [TrainerType.HOOLIGANS]: ["Jim & Cas", "Rob & Sal"], + [TrainerType.HOOPSTER]: ["Bobby", "John", "Lamarcus", "Derrick", "Nicolas"], + [TrainerType.INFIELDER]: ["Alex", "Connor", "Todd"], + [TrainerType.JANITOR]: ["Caleb", "Geoff", "Brady", "Felix", "Orville", "Melvin", "Shawn"], + [TrainerType.LINEBACKER]: ["Bob", "Dan", "Jonah"], + [TrainerType.MAID]: ["Belinda", "Sophie", "Emily", "Elena", "Clare", "Alica", "Tanya", "Tammy"], + [TrainerType.MUSICIAN]: ["Boris", "Preston", "Charles", "Clyde", "Vincent", "Dalton", "Kirk", "Shawn", "Fabian", "Fernando", "Joseph", "Marcos", "Arturo", "Jerry", "Lonnie", "Tony"], + [TrainerType.NURSERY_AIDE]: ["Autumn", "Briana", "Leah", "Miho", "Ethel", "Hollie", "Ilse", "June", "Kimya", "Rosalyn"], + [TrainerType.OFFICER]: ["Dirk", "Keith", "Alex", "Bobby", "Caleb", "Danny", "Dylan", "Thomas", "Daniel", "Jeff", "Braven", "Dell", "Neagle", "Haruki", "Mitchell", "Raymond"], + [TrainerType.PARASOL_LADY]: ["Angelica", "Clarissa", "Madeline", "Akari", "Annabell", "Kayley", "Rachel", "Alexa", "Sabrina", "April", "Gwyneth", "Laura", "Lumi", "Mariah", "Melita", "Nicole", "Tihana", "Ingrid", "Tyra"], + [TrainerType.PILOT]: ["Chase", "Leonard", "Ted", "Elron", "Ewing", "Flynn", "Winslow"], + [TrainerType.POKEFAN]: [["Alex", "Allan", "Brandon", "Carter", "Colin", "Derek", "Jeremy", "Joshua", "Rex", "Robert", "Trevor", "William", "Colton", "Miguel", "Francisco", "Kaleb", "Leonard", "Boone", "Elliot", "Jude", "Norbert", "Corey", "Gabe", "Baxter"], ["Beverly", "Georgia", "Jaime", "Ruth", "Isabel", "Marissa", "Vanessa", "Annika", "Bethany", "Kimberly", "Meredith", "Rebekah", "Eleanor", "Darcy", "Lydia", "Sachiko", "Abigail", "Agnes", "Lydie", "Roisin", "Tara", "Carmen", "Janet"]], + [TrainerType.PRESCHOOLER]: [["Billy", "Doyle", "Evan", "Homer", "Tully", "Albert", "Buster", "Greg", "Ike", "Jojo", "Tyrone", "Adrian", "Oliver", "Hayden", "Hunter", "Kaleb", "Liam", "Dylan"], ["Juliet", "Mia", "Sarah", "Wendy", "Winter", "Chrissy", "Eva", "Lin", "Samantha", "Ella", "Lily", "Natalie", "Ailey", "Hannah", "Malia", "Kindra", "Nancy"]], + [TrainerType.PSYCHIC]: [["Fidel", "Franklin", "Gilbert", "Greg", "Herman", "Jared", "Mark", "Nathan", "Norman", "Phil", "Richard", "Rodney", "Cameron", "Edward", "Fritz", "Joshua", "Preston", "Virgil", "William", "Alvaro", "Blake", "Cedric", "Keenan", "Nicholas", "Dario", "Johan", "Lorenzo", "Tyron", "Bryce", "Corbin", "Deandre", "Elijah", "Kody", "Landon", "Maxwell", "Mitchell", "Sterling", "Eli", "Nelson", "Vernon", "Gaven", "Gerard", "Low", "Micki", "Perry", "Rudolf", "Tommy", "Al", "Nandor", "Tully", "Arthur", "Emanuel", "Franz", "Harry", "Paschal", "Robert", "Sayid", "Angelo", "Anton", "Arin", "Avery", "Danny", "Frasier", "Harrison", "Jaime", "Ross", "Rui", "Vlad", "Mason"], ["Alexis", "Hannah", "Jacki", "Jaclyn", "Kayla", "Maura", "Samantha", "Alix", "Brandi", "Edie", "Macey", "Mariella", "Marlene", "Laura", "Rodette", "Abigail", "Brittney", "Chelsey", "Daisy", "Desiree", "Kendra", "Lindsey", "Rachael", "Valencia", "Belle", "Cybil", "Doreen", "Dua", "Future", "Lin", "Madhu", "Alia", "Ena", "Joyce", "Lynette", "Olesia", "Sarah"]], + [TrainerType.RANGER]: [["Carlos", "Jackson", "Sebastian", "Gav", "Lorenzo", "Logan", "Nicolas", "Trenton", "Deshawn", "Dwayne", "Jeffery", "Kyler", "Taylor", "Alain", "Claude", "Crofton", "Forrest", "Harry", "Jaden", "Keith", "Lewis", "Miguel", "Pedro", "Ralph", "Richard", "Bret", "Daryl", "Eddie", "Johan", "Leaf", "Louis", "Maxwell", "Parker", "Rick", "Steve", "Bjorn", "Chaise", "Dean", "Lee", "Maurice", "Nash", "Ralf", "Reed", "Shinobu", "Silas"], ["Catherine", "Jenna", "Sophia", "Merdith", "Nora", "Beth", "Chelsea", "Katelyn", "Madeline", "Allison", "Ashlee", "Felicia", "Krista", "Annie", "Audra", "Brenda", "Chloris", "Eliza", "Heidi", "Irene", "Mary", "Mylene", "Shanti", "Shelly", "Thalia", "Anja", "Briana", "Dianna", "Elaine", "Elle", "Hillary", "Katie", "Lena", "Lois", "Malory", "Melita", "Mikiko", "Naoko", "Serenity", "Ambre", "Brooke", "Clementine", "Melina", "Petra", "Twiggy"]], + [TrainerType.RICH]: [["Alfred", "Edward", "Gregory", "Preston", "Thomas", "Tucker", "Walter", "Clifford", "Everett", "Micah", "Nate", "Pierre", "Terrance", "Arthur", "Brooks", "Emanuel", "Lamar", "Jeremy", "Leonardo", "Milton", "Frederic", "Renaud", "Robert", "Yan", "Daniel", "Sheldon", "Stonewall", "Gerald", "Ronald", "Smith", "Stanley", "Reginald", "Orson", "Wilco", "Caden", "Glenn"], ["Rebecca", "Reina", "Cassandra", "Emilia", "Grace", "Marian", "Elizabeth", "Kathleen", "Sayuri", "Caroline", "Judy"]], + [TrainerType.RICH_KID]: [["Garret", "Winston", "Dawson", "Enrique", "Jason", "Roman", "Trey", "Liam", "Anthony", "Brad", "Cody", "Manuel", "Martin", "Pierce", "Rolan", "Keenan", "Filbert", "Antoin", "Cyus", "Diek", "Dugo", "Flitz", "Jurek", "Lond", "Perd", "Quint", "Basto", "Benit", "Brot", "Denc", "Guyit", "Marcon", "Perc", "Puros", "Roex", "Sainz", "Symin", "Tark", "Venak"], ["Anette", "Brianna", "Cindy", "Colleen", "Daphne", "Elizabeth", "Naomi", "Sarah", "Charlotte", "Gillian", "Jacki", "Lady", "Melissa", "Celeste", "Colette", "Elizandra", "Isabel", "Lynette", "Magnolia", "Sophie", "Lina", "Dulcie", "Auro", "Brin", "Caril", "Eloos", "Gwin", "Illa", "Kowly", "Rima", "Ristin", "Vesey", "Brena", "Deasy", "Denslon", "Kylet", "Nemi", "Rene", "Sanol", "Stouner", "Sturk", "Talmen", "Zoila"]], + [TrainerType.ROUGHNECK]: ["Camron", "Corey", "Gabriel", "Isaiah", "Jamal", "Koji", "Luke", "Paxton", "Raul", "Zeek", "Kirby", "Chance", "Dave", "Fletcher", "Johnny", "Reese", "Joey", "Ricky", "Silvester", "Martin"], + [TrainerType.SAILOR]: ["Alberto", "Bost", "Brennan", "Brenden", "Claude", "Cory", "Damian", "Dirk", "Duncan", "Dwayne", "Dylan", "Eddie", "Edmond", "Elijah", "Ernest", "Eugene", "Garrett", "Golos", "Gratin", "Grestly", "Harry", "Hols", "Hudson", "Huey", "Jebol", "Jeff", "Leonald", "Luther", "Kelvin", "Kenneth", "Kent", "Knook", "Marc", "Mifis", "Monar", "Morkor", "Ordes", "Oxlin", "Parker", "Paul", "Philip", "Roberto", "Samson", "Skyler", "Stanly", "Tebu", "Terrell", "Trevor", "Yasu", "Zachariah"], + [TrainerType.SCIENTIST]: [["Jed", "Marc", "Mitch", "Rich", "Ross", "Beau", "Braydon", "Connor", "Ed", "Ivan", "Jerry", "Jose", "Joshua", "Parker", "Rodney", "Taylor", "Ted", "Travis", "Zackery", "Darrius", "Emilio", "Fredrick", "Shaun", "Stefano", "Travon", "Daniel", "Garett", "Gregg", "Linden", "Lowell", "Trenton", "Dudley", "Luke", "Markus", "Nathan", "Orville", "Randall", "Ron", "Ronald", "Simon", "Steve", "William", "Franklin", "Clarke", "Jacques", "Terrance", "Ernst", "Justus", "Ikaika", "Jayson", "Kyle", "Reid", "Tyrone", "Adam", "Albert", "Alphonse", "Cory", "Donnie", "Elton", "Francis", "Gordon", "Herbert", "Humphrey", "Jordan", "Julian", "Keaton", "Levi", "Melvin", "Murray", "West", "Craig", "Coren", "Dubik", "Kotan", "Lethco", "Mante", "Mort", "Myron", "Odlow", "Ribek", "Roeck", "Vogi", "Vonder", "Zogo", "Doimo", "Doton", "Durel", "Hildon", "Kukla", "Messa", "Nanot", "Platen", "Raburn", "Reman", "Acrod", "Coffy", "Elrok", "Foss", "Hardig", "Hombol", "Hospel", "Kaller", "Klots", "Krilok", "Limar", "Loket", "Mesak", "Morbit", "Newin", "Orill", "Tabor", "Tekot"], ["Blythe", "Chan", "Kathrine", "Marie", "Maria", "Naoko", "Samantha", "Satomi", "Shannon", "Athena", "Caroline", "Lumi", "Lumina", "Marissa", "Sonia"]], + [TrainerType.SMASHER]: ["Aspen", "Elena", "Mari", "Amy", "Lizzy"], + [TrainerType.SNOW_WORKER]: [["Braden", "Brendon", "Colin", "Conrad", "Dillan", "Gary", "Gerardo", "Holden", "Jackson", "Mason", "Quentin", "Willy", "Noel", "Arnold", "Brady", "Brand", "Cairn", "Cliff", "Don", "Eddie", "Felix", "Filipe", "Glenn", "Gus", "Heath", "Matthew", "Patton", "Rich", "Rob", "Ryan", "Scott", "Shelby", "Sterling", "Tyler", "Victor", "Zack", "Friedrich", "Herman", "Isaac", "Leo", "Maynard", "Mitchell", "Morgann", "Nathan", "Niel", "Pasqual", "Paul", "Tavarius", "Tibor", "Dimitri", "Narek", "Yusif", "Frank", "Jeff", "Vaclav", "Ovid", "Francis", "Keith", "Russel", "Sangon", "Toway", "Bomber", "Chean", "Demit", "Hubor", "Kebile", "Laber", "Ordo", "Retay", "Ronix", "Wagel", "Dobit", "Kaster", "Lobel", "Releo", "Saken", "Rustix"], ["Georgia", "Sandra", "Yvonne"]], + [TrainerType.STRIKER]: ["Marco", "Roberto", "Tony"], + [TrainerType.SCHOOL_KID]: [["Alan", "Billy", "Chad", "Danny", "Dudley", "Jack", "Joe", "Johnny", "Kipp", "Nate", "Ricky", "Tommy", "Jerry", "Paul", "Ted", "Chance", "Esteban", "Forrest", "Harrison", "Connor", "Sherman", "Torin", "Travis", "Al", "Carter", "Edgar", "Jem", "Sammy", "Shane", "Shayne", "Alvin", "Keston", "Neil", "Seymour", "William", "Carson", "Clark", "Nolan"], ["Georgia", "Karen", "Meiko", "Christine", "Mackenzie", "Tiera", "Ann", "Gina", "Lydia", "Marsha", "Millie", "Sally", "Serena", "Silvia", "Alberta", "Cassie", "Mara", "Rita", "Georgie", "Meena", "Nitzel"]], + [TrainerType.SWIMMER]: [["Berke", "Cameron", "Charlie", "George", "Harold", "Jerome", "Kirk", "Mathew", "Parker", "Randall", "Seth", "Simon", "Tucker", "Austin", "Barry", "Chad", "Cody", "Darrin", "David", "Dean", "Douglas", "Franklin", "Gilbert", "Herman", "Jack", "Luis", "Matthew", "Reed", "Richard", "Rodney", "Roland", "Spencer", "Stan", "Tony", "Clarence", "Declan", "Dominik", "Harrison", "Kevin", "Leonardo", "Nolen", "Pete", "Santiago", "Axle", "Braden", "Finn", "Garrett", "Mymo", "Reece", "Samir", "Toby", "Adrian", "Colton", "Dillon", "Erik", "Evan", "Francisco", "Glenn", "Kurt", "Oscar", "Ricardo", "Sam", "Sheltin", "Troy", "Vincent", "Wade", "Wesley", "Duane", "Elmo", "Esteban", "Frankie", "Ronald", "Tyson", "Bart", "Matt", "Tim", "Wright", "Jeffery", "Kyle", "Alessandro", "Estaban", "Kieran", "Ramses", "Casey", "Dakota", "Jared", "Kalani", "Keoni", "Lawrence", "Logan", "Robert", "Roddy", "Yasu", "Derek", "Jacob", "Bruce", "Clayton"], ["Briana", "Dawn", "Denise", "Diana", "Elaine", "Kara", "Kaylee", "Lori", "Nicole", "Nikki", "Paula", "Susie", "Wendy", "Alice", "Beth", "Beverly", "Brenda", "Dana", "Debra", "Grace", "Jenny", "Katie", "Laurel", "Linda", "Missy", "Sharon", "Tanya", "Tara", "Tisha", "Carlee", "Imani", "Isabelle", "Kyla", "Sienna", "Abigail", "Amara", "Anya", "Connie", "Maria", "Melissa", "Nora", "Shirley", "Shania", "Tiffany", "Aubree", "Cassandra", "Claire", "Crystal", "Erica", "Gabrielle", "Haley", "Jessica", "Joanna", "Lydia", "Mallory", "Mary", "Miranda", "Paige", "Sophia", "Vanessa", "Chelan", "Debbie", "Joy", "Kendra", "Leona", "Mina", "Caroline", "Joyce", "Larissa", "Rebecca", "Tyra", "Dara", "Desiree", "Kaoru", "Ruth", "Coral", "Genevieve", "Isla", "Marissa", "Romy", "Sheryl", "Alexandria", "Alicia", "Chelsea", "Jade", "Kelsie", "Laura", "Portia", "Shelby", "Sara", "Tiare", "Kyra", "Natasha", "Layla", "Scarlett", "Cora"]], + [TrainerType.TWINS]: ["Amy & May", "Jo & Zoe", "Meg & Peg", "Ann & Anne", "Lea & Pia", "Amy & Liv", "Gina & Mia", "Miu & Yuki", "Tori & Tia", "Eli & Anne", "Jen & Kira", "Joy & Meg", "Kiri & Jan", "Miu & Mia", "Emma & Lil", "Liv & Liz", "Teri & Tia", "Amy & Mimi", "Clea & Gil", "Day & Dani", "Kay & Tia", "Tori & Til", "Saya & Aya", "Emy & Lin", "Kumi & Amy", "Mayo & May", "Ally & Amy", "Lia & Lily", "Rae & Ula", "Sola & Ana", "Tara & Val", "Faith & Joy", "Nana & Nina"], + [TrainerType.VETERAN]: [["Armando", "Brenden", "Brian", "Clayton", "Edgar", "Emanuel", "Grant", "Harlan", "Terrell", "Arlen", "Chester", "Hugo", "Martell", "Ray", "Shaun", "Abraham", "Carter", "Claude", "Jerry", "Lucius", "Murphy", "Rayne", "Ron", "Sinan", "Sterling", "Vincent", "Zach", "Gerard", "Gilles", "Louis", "Timeo", "Akira", "Don", "Eric", "Harry", "Leon", "Roger", "Angus", "Aristo", "Brone", "Johnny"], ["Julia", "Karla", "Kim", "Sayuri", "Tiffany", "Cathy", "Cecile", "Chloris", "Denae", "Gina", "Maya", "Oriana", "Portia", "Rhona", "Rosaline", "Catrina", "Inga", "Trisha", "Heather", "Lynn", "Sheri", "Alonsa", "Ella", "Leticia", "Kiara"]], + [TrainerType.WAITER]: [["Bert", "Clint", "Maxwell", "Lou"], ["Kati", "Aurora", "Bonita", "Flo", "Tia", "Jan", "Olwen", "Paget", "Paula", "Talia"]], + [TrainerType.WORKER]: [["Braden", "Brendon", "Colin", "Conrad", "Dillan", "Gary", "Gerardo", "Holden", "Jackson", "Mason", "Quentin", "Willy", "Noel", "Arnold", "Brady", "Brand", "Cairn", "Cliff", "Don", "Eddie", "Felix", "Filipe", "Glenn", "Gus", "Heath", "Matthew", "Patton", "Rich", "Rob", "Ryan", "Scott", "Shelby", "Sterling", "Tyler", "Victor", "Zack", "Friedrich", "Herman", "Isaac", "Leo", "Maynard", "Mitchell", "Morgann", "Nathan", "Niel", "Pasqual", "Paul", "Tavarius", "Tibor", "Dimitri", "Narek", "Yusif", "Frank", "Jeff", "Vaclav", "Ovid", "Francis", "Keith", "Russel", "Sangon", "Toway", "Bomber", "Chean", "Demit", "Hubor", "Kebile", "Laber", "Ordo", "Retay", "Ronix", "Wagel", "Dobit", "Kaster", "Lobel", "Releo", "Saken", "Rustix"], ["Georgia", "Sandra", "Yvonne"]], + [TrainerType.YOUNGSTER]: [["Albert", "Gordon", "Ian", "Jason", "Jimmy", "Mikey", "Owen", "Samuel", "Warren", "Allen", "Ben", "Billy", "Calvin", "Dillion", "Eddie", "Joey", "Josh", "Neal", "Timmy", "Tommy", "Breyden", "Deandre", "Demetrius", "Dillon", "Jaylen", "Johnson", "Shigenobu", "Chad", "Cole", "Cordell", "Dan", "Dave", "Destin", "Nash", "Tyler", "Yasu", "Austin", "Dallas", "Darius", "Donny", "Jonathon", "Logan", "Michael", "Oliver", "Sebastian", "Tristan", "Wayne", "Norman", "Roland", "Regis", "Abe", "Astor", "Keita", "Kenneth", "Kevin", "Kyle", "Lester", "Masao", "Nicholas", "Parker", "Wes", "Zachary", "Cody", "Henley", "Jaye", "Karl", "Kenny", "Masahiro", "Pedro", "Petey", "Sinclair", "Terrell", "Waylon", "Aidan", "Anthony", "David", "Jacob", "Jayden", "Cutler", "Ham", "Caleb", "Kai", "Honus", "Kenway", "Bret", "Chris", "Cid", "Dennis", "Easton", "Ken", "Robby", "Ronny", "Shawn", "Benjamin", "Jake", "Travis", "Adan", "Aday", "Beltran", "Elian", "Hernan", "Julen", "Luka", "Roi", "Bernie", "Dustin", "Jonathan", "Wyatt"], ["Alice", "Bridget", "Carrie", "Connie", "Dana", "Ellen", "Krise", "Laura", "Linda", "Michelle", "Shannon", "Andrea", "Crissy", "Janice", "Robin", "Sally", "Tiana", "Haley", "Ali", "Ann", "Dalia", "Dawn", "Iris", "Joana", "Julia", "Kay", "Lisa", "Megan", "Mikaela", "Miriam", "Paige", "Reli", "Blythe", "Briana", "Caroline", "Cassidy", "Kaitlin", "Madeline", "Molly", "Natalie", "Samantha", "Sarah", "Cathy", "Dye", "Eri", "Eva", "Fey", "Kara", "Lurleen", "Maki", "Mali", "Maya", "Miki", "Sibyl", "Daya", "Diana", "Flo", "Helia", "Henrietta", "Isabel", "Mai", "Persephone", "Serena", "Anna", "Charlotte", "Elin", "Elsa", "Lise", "Sara", "Suzette", "Audrey", "Emmy", "Isabella", "Madison", "Rika", "Rylee", "Salla", "Ellie", "Alexandra", "Amy", "Lass", "Brittany", "Chel", "Cindy", "Dianne", "Emily", "Emma", "Evelyn", "Hana", "Harleen", "Hazel", "Jocelyn", "Katrina", "Kimberly", "Lina", "Marge", "Mila", "Mizuki", "Rena", "Sal", "Satoko", "Summer", "Tomoe", "Vicky", "Yue", "Yumi", "Lauren", "Rei", "Riley", "Lois", "Nancy", "Tammy", "Terry"]], + [TrainerType.HEX_MANIAC]: ["Kindra", "Patricia", "Tammy", "Tasha", "Valerie", "Alaina", "Kathleen", "Leah", "Makie", "Sylvia", "Anina", "Arachna", "Carrie", "Desdemona", "Josette", "Luna", "Melanie", "Osanna", "Raziah"], }; // function used in a commented code @@ -136,8 +136,11 @@ function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNam .then(html => { console.log(url); const htmlDoc = parser.parseFromString(html, "text/html"); - const trainerListHeader = htmlDoc.querySelector("#Trainer_list").parentElement; - const elements = [...trainerListHeader.parentElement.childNodes]; + const trainerListHeader = htmlDoc.querySelector("#Trainer_list")?.parentElement; + if (!trainerListHeader) { + return []; + } + const elements = [...(trainerListHeader?.parentElement?.childNodes ?? [])]; const startChildIndex = elements.indexOf(trainerListHeader); const endChildIndex = elements.findIndex(h => h.nodeName === "H2" && elements.indexOf(h) > startChildIndex); const tables = elements.filter(t => { @@ -152,6 +155,9 @@ function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNam const trainerRows = [...table.querySelectorAll("tr:not(:first-child)")].filter(r => r.children.length === 9); for (const row of trainerRows) { const nameCell = row.firstElementChild; + if (!nameCell) { + continue; + } const content = nameCell.innerHTML; if (content.indexOf(" -1) { const female = /♀/.test(content); diff --git a/src/data/type.ts b/src/data/type.ts index c92416afca9..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,55 +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 1; } /** diff --git a/src/data/variant.ts b/src/data/variant.ts index 48369d112db..b7a01a4be89 100644 --- a/src/data/variant.ts +++ b/src/data/variant.ts @@ -1,4 +1,4 @@ -import { VariantTier } from "#app/enums/variant-tier.js"; +import { VariantTier } from "#app/enums/variant-tier"; export type Variant = 0 | 1 | 2; diff --git a/src/data/weather.ts b/src/data/weather.ts index 425dd3724f6..2421f719e6e 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -1,27 +1,16 @@ import { Biome } from "#enums/biome"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +import { WeatherType } from "#enums/weather-type"; +import { getPokemonNameWithAffix } from "../messages"; import Pokemon from "../field/pokemon"; import { Type } from "./type"; import Move, { AttackMove } from "./move"; import * as Utils from "../utils"; import BattleScene from "../battle-scene"; import { SuppressWeatherEffectAbAttr } from "./ability"; -import { TerrainType } from "./terrain"; +import { TerrainType, getTerrainName } from "./terrain"; import i18next from "i18next"; -export enum WeatherType { - NONE, - SUNNY, - RAIN, - SANDSTORM, - HAIL, - SNOW, - FOG, - HEAVY_RAIN, - HARSH_SUN, - STRONG_WINDS -} - +export { WeatherType }; export class Weather { public weatherType: WeatherType; public turnsLeft: integer; @@ -114,7 +103,7 @@ export class Weather { const field = scene.getField(true); for (const pokemon of field) { - let suppressWeatherEffectAbAttr = pokemon.getAbility().getAttrs(SuppressWeatherEffectAbAttr)[0]; + let suppressWeatherEffectAbAttr: SuppressWeatherEffectAbAttr | null = pokemon.getAbility().getAttrs(SuppressWeatherEffectAbAttr)[0]; if (!suppressWeatherEffectAbAttr) { suppressWeatherEffectAbAttr = pokemon.hasPassive() ? pokemon.getPassiveAbility().getAttrs(SuppressWeatherEffectAbAttr)[0] : null; } @@ -127,7 +116,7 @@ export class Weather { } } -export function getWeatherStartMessage(weatherType: WeatherType): string { +export function getWeatherStartMessage(weatherType: WeatherType): string | null { switch (weatherType) { case WeatherType.SUNNY: return i18next.t("weather:sunnyStartMessage"); @@ -152,7 +141,7 @@ export function getWeatherStartMessage(weatherType: WeatherType): string { return null; } -export function getWeatherLapseMessage(weatherType: WeatherType): string { +export function getWeatherLapseMessage(weatherType: WeatherType): string | null { switch (weatherType) { case WeatherType.SUNNY: return i18next.t("weather:sunnyLapseMessage"); @@ -177,7 +166,7 @@ export function getWeatherLapseMessage(weatherType: WeatherType): string { return null; } -export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string { +export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string | null { switch (weatherType) { case WeatherType.SANDSTORM: return i18next.t("weather:sandstormDamageMessage", {pokemonNameWithAffix: getPokemonNameWithAffix(pokemon)}); @@ -188,7 +177,7 @@ export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokem return null; } -export function getWeatherClearMessage(weatherType: WeatherType): string { +export function getWeatherClearMessage(weatherType: WeatherType): string | null { switch (weatherType) { case WeatherType.SUNNY: return i18next.t("weather:sunnyClearMessage"); @@ -213,37 +202,43 @@ export function getWeatherClearMessage(weatherType: WeatherType): string { return null; } -export function getTerrainStartMessage(terrainType: TerrainType): string { +export function getTerrainStartMessage(terrainType: TerrainType): string | null { switch (terrainType) { case TerrainType.MISTY: - return "Mist swirled around the battlefield!"; + return i18next.t("terrain:mistyStartMessage"); case TerrainType.ELECTRIC: - return "An electric current ran across the battlefield!"; + return i18next.t("terrain:electricStartMessage"); case TerrainType.GRASSY: - return "Grass grew to cover the battlefield!"; + return i18next.t("terrain:grassyStartMessage"); case TerrainType.PSYCHIC: - return "The battlefield got weird!"; + return i18next.t("terrain:psychicStartMessage"); + default: + console.warn("getTerrainStartMessage not defined. Using default null"); + return null; } } -export function getTerrainClearMessage(terrainType: TerrainType): string { +export function getTerrainClearMessage(terrainType: TerrainType): string | null { switch (terrainType) { case TerrainType.MISTY: - return "The mist disappeared from the battlefield."; + return i18next.t("terrain:mistyClearMessage"); case TerrainType.ELECTRIC: - return "The electricity disappeared from the battlefield."; + return i18next.t("terrain:electricClearMessage"); case TerrainType.GRASSY: - return "The grass disappeared from the battlefield."; + return i18next.t("terrain:grassyClearMessage"); case TerrainType.PSYCHIC: - return "The weirdness disappeared from the battlefield!"; + return i18next.t("terrain:psychicClearMessage"); + default: + console.warn("getTerrainClearMessage not defined. Using default null"); + return null; } } export function getTerrainBlockMessage(pokemon: Pokemon, terrainType: TerrainType): string { if (terrainType === TerrainType.MISTY) { - return getPokemonMessage(pokemon, " surrounds itself with a protective mist!"); + return i18next.t("terrain:mistyBlockMessage", {pokemonNameWithAffix: getPokemonNameWithAffix(pokemon)}); } - return getPokemonMessage(pokemon, ` is protected by the ${Utils.toReadableString(TerrainType[terrainType])} Terrain!`); + return i18next.t("terrain:defaultBlockMessage", {pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), terrainName: getTerrainName(terrainType)}); } interface WeatherPoolEntry { diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 722096c42cd..1c79750c91a 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -21,5 +21,7 @@ export enum ArenaTagType { MAT_BLOCK = "MAT_BLOCK", CRAFTY_SHIELD = "CRAFTY_SHIELD", TAILWIND = "TAILWIND", - HAPPY_HOUR = "HAPPY_HOUR" + 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 5cdabfe78c2..a2bcf9e4c0e 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -13,6 +13,7 @@ export enum BattlerTagType { ENCORE = "ENCORE", HELPING_HAND = "HELPING_HAND", INGRAIN = "INGRAIN", + OCTOLOCK = "OCTOLOCK", AQUA_RING = "AQUA_RING", DROWSY = "DROWSY", TRAPPED = "TRAPPED", @@ -47,7 +48,6 @@ export enum BattlerTagType { FIRE_BOOST = "FIRE_BOOST", CRIT_BOOST = "CRIT_BOOST", ALWAYS_CRIT = "ALWAYS_CRIT", - NO_CRIT = "NO_CRIT", IGNORE_ACCURACY = "IGNORE_ACCURACY", BYPASS_SLEEP = "BYPASS_SLEEP", IGNORE_FLYING = "IGNORE_FLYING", @@ -59,5 +59,18 @@ export enum BattlerTagType { MINIMIZED = "MINIMIZED", DESTINY_BOND = "DESTINY_BOND", CENTER_OF_ATTENTION = "CENTER_OF_ATTENTION", - ICE_FACE = "ICE_FACE" + ICE_FACE = "ICE_FACE", + DISGUISE = "DISGUISE", + STOCKPILING = "STOCKPILING", + RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE", + ALWAYS_GET_HIT = "ALWAYS_GET_HIT", + DISABLED = "DISABLED", + IGNORE_GHOST = "IGNORE_GHOST", + IGNORE_DARK = "IGNORE_DARK", + GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA", + GULP_MISSILE_PIKACHU = "GULP_MISSILE_PIKACHU", + BEAK_BLAST_CHARGING = "BEAK_BLAST_CHARGING", + 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/game-data-type.ts b/src/enums/game-data-type.ts index 179817fe5be..d672253794a 100644 --- a/src/enums/game-data-type.ts +++ b/src/enums/game-data-type.ts @@ -6,5 +6,6 @@ export enum GameDataType { SESSION, SETTINGS, TUTORIALS, - SEEN_DIALOGUES + SEEN_DIALOGUES, + RUN_HISTORY } diff --git a/src/enums/nature.ts b/src/enums/nature.ts new file mode 100644 index 00000000000..5ab8f3c850b --- /dev/null +++ b/src/enums/nature.ts @@ -0,0 +1,27 @@ +export enum Nature { + HARDY, + LONELY, + BRAVE, + ADAMANT, + NAUGHTY, + BOLD, + DOCILE, + RELAXED, + IMPISH, + LAX, + TIMID, + HASTY, + SERIOUS, + JOLLY, + NAIVE, + MODEST, + MILD, + QUIET, + BASHFUL, + RASH, + CALM, + GENTLE, + SASSY, + CAREFUL, + QUIRKY, +} diff --git a/src/enums/pokeball.ts b/src/enums/pokeball.ts new file mode 100644 index 00000000000..8d97fea464c --- /dev/null +++ b/src/enums/pokeball.ts @@ -0,0 +1,8 @@ +export enum PokeballType { + POKEBALL, + GREAT_BALL, + ULTRA_BALL, + ROGUE_BALL, + MASTER_BALL, + LUXURY_BALL, +} diff --git a/src/enums/shop-cursor-target.ts b/src/enums/shop-cursor-target.ts new file mode 100644 index 00000000000..11f524399b2 --- /dev/null +++ b/src/enums/shop-cursor-target.ts @@ -0,0 +1,13 @@ +/** + * Determines the row cursor target when entering the shop phase. + */ +export enum ShopCursorTarget { + /** Cursor points to Reroll row */ + REROLL, + /** Cursor points to Rewards row */ + REWARDS, + /** Cursor points to Shop row */ + SHOP, + /** Cursor points to Check Team row */ + CHECK_TEAM +} diff --git a/src/enums/stat.ts b/src/enums/stat.ts new file mode 100644 index 00000000000..a12d53e8559 --- /dev/null +++ b/src/enums/stat.ts @@ -0,0 +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/enums/status-effect.ts b/src/enums/status-effect.ts new file mode 100644 index 00000000000..b79951f530a --- /dev/null +++ b/src/enums/status-effect.ts @@ -0,0 +1,10 @@ +export enum StatusEffect { + NONE, + POISON, + TOXIC, + PARALYSIS, + SLEEP, + FREEZE, + BURN, + FAINT, +} diff --git a/src/enums/trainer-type.ts b/src/enums/trainer-type.ts index 6bd8f567acb..835a2c9d039 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -1,209 +1,235 @@ - export enum TrainerType { - UNKNOWN, + UNKNOWN, - ACE_TRAINER, - ARTIST, - BACKERS, - BACKPACKER, - BAKER, - BEAUTY, - BIKER, - BLACK_BELT, - BREEDER, - CLERK, - CYCLIST, - DANCER, - DEPOT_AGENT, - DOCTOR, - FIREBREATHER, - FISHERMAN, - GUITARIST, - HARLEQUIN, - HIKER, - HOOLIGANS, - HOOPSTER, - INFIELDER, - JANITOR, - LINEBACKER, - MAID, - MUSICIAN, - HEX_MANIAC, - NURSERY_AIDE, - OFFICER, - PARASOL_LADY, - PILOT, - POKEFAN, - PRESCHOOLER, - PSYCHIC, - RANGER, - RICH, - RICH_KID, - ROUGHNECK, - SAILOR, - SCIENTIST, - SMASHER, - SNOW_WORKER, - STRIKER, - SCHOOL_KID, - SWIMMER, - TWINS, - VETERAN, - WAITER, - WORKER, - YOUNGSTER, - ROCKET_GRUNT, - MAGMA_GRUNT, - AQUA_GRUNT, - GALACTIC_GRUNT, - PLASMA_GRUNT, - FLARE_GRUNT, - ROCKET_BOSS_GIOVANNI_1, - ROCKET_BOSS_GIOVANNI_2, - MAXIE, - MAXIE_2, - ARCHIE, - ARCHIE_2, - CYRUS, - CYRUS_2, - GHETSIS, - GHETSIS_2, - LYSANDRE, - LYSANDRE_2, + ACE_TRAINER, + ARTIST, + BACKERS, + BACKPACKER, + BAKER, + BEAUTY, + BIKER, + BLACK_BELT, + BREEDER, + CLERK, + CYCLIST, + DANCER, + DEPOT_AGENT, + DOCTOR, + FIREBREATHER, + FISHERMAN, + GUITARIST, + HARLEQUIN, + HIKER, + HOOLIGANS, + HOOPSTER, + INFIELDER, + JANITOR, + LINEBACKER, + MAID, + MUSICIAN, + HEX_MANIAC, + NURSERY_AIDE, + OFFICER, + PARASOL_LADY, + PILOT, + POKEFAN, + PRESCHOOLER, + PSYCHIC, + RANGER, + RICH, + RICH_KID, + ROUGHNECK, + SAILOR, + SCIENTIST, + SMASHER, + SNOW_WORKER, + STRIKER, + SCHOOL_KID, + SWIMMER, + TWINS, + VETERAN, + WAITER, + WORKER, + YOUNGSTER, + ROCKET_GRUNT, + ARCHER, + ARIANA, + PROTON, + PETREL, + MAGMA_GRUNT, + TABITHA, + COURTNEY, + AQUA_GRUNT, + MATT, + SHELLY, + GALACTIC_GRUNT, + JUPITER, + MARS, + SATURN, + PLASMA_GRUNT, + ZINZOLIN, + ROOD, + FLARE_GRUNT, + BRYONY, + XEROSIC, + AETHER_GRUNT, + FABA, + SKULL_GRUNT, + PLUMERIA, + MACRO_GRUNT, + OLEANA, + ROCKET_BOSS_GIOVANNI_1, + ROCKET_BOSS_GIOVANNI_2, + MAXIE, + MAXIE_2, + ARCHIE, + ARCHIE_2, + CYRUS, + CYRUS_2, + GHETSIS, + GHETSIS_2, + LYSANDRE, + LYSANDRE_2, + LUSAMINE, + LUSAMINE_2, + GUZMA, + GUZMA_2, + ROSE, + ROSE_2, - BROCK = 200, - 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 = 300, - 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, - MARNIE_ELITE, - NESSA_ELITE, - BEA_ELITE, - ALLISTER_ELITE, - RAIHAN_ELITE, - RIKA, - POPPY, - LARRY_ELITE, - HASSEL, - CRISPIN, - AMARYS, - LACEY, - DRAYTON, - BLUE = 350, - RED, - LANCE_CHAMPION, - STEVEN, - WALLACE, - CYNTHIA, - ALDER, - IRIS, - DIANTHA, - HAU, - LEON, - GEETA, - NEMONA, - KIERAN, - RIVAL = 375, - RIVAL_2, - RIVAL_3, - RIVAL_4, - RIVAL_5, - RIVAL_6 + BROCK = 200, + 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 = 300, + 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, + MARNIE_ELITE, + NESSA_ELITE, + BEA_ELITE, + ALLISTER_ELITE, + RAIHAN_ELITE, + RIKA, + POPPY, + LARRY_ELITE, + HASSEL, + CRISPIN, + AMARYS, + LACEY, + DRAYTON, + BLUE = 350, + RED, + LANCE_CHAMPION, + STEVEN, + WALLACE, + CYNTHIA, + ALDER, + IRIS, + DIANTHA, + HAU, + LEON, + GEETA, + NEMONA, + KIERAN, + RIVAL = 375, + RIVAL_2, + RIVAL_3, + RIVAL_4, + RIVAL_5, + RIVAL_6 } diff --git a/src/enums/weather-type.ts b/src/enums/weather-type.ts new file mode 100644 index 00000000000..fa699bb3514 --- /dev/null +++ b/src/enums/weather-type.ts @@ -0,0 +1,12 @@ +export enum WeatherType { + NONE, + SUNNY, + RAIN, + SANDSTORM, + HAIL, + SNOW, + FOG, + HEAVY_RAIN, + HARSH_SUN, + STRONG_WINDS, +} diff --git a/src/events/arena.ts b/src/events/arena.ts index 67b423f3b75..c05e67d353c 100644 --- a/src/events/arena.ts +++ b/src/events/arena.ts @@ -1,7 +1,7 @@ -import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagSide } from "#app/data/arena-tag"; import { ArenaTagType } from "#enums/arena-tag-type"; -import { TerrainType } from "#app/data/terrain.js"; -import { WeatherType } from "#app/data/weather.js"; +import { TerrainType } from "#app/data/terrain"; +import { WeatherType } from "#app/data/weather"; /** Alias for all {@linkcode ArenaEvent} type strings */ export enum ArenaEventType { @@ -81,8 +81,8 @@ export class TagAddedEvent extends ArenaEvent { this.arenaTagType = arenaTagType; this.arenaTagSide = arenaTagSide; - this.arenaTagLayers = arenaTagLayers; - this.arenaTagMaxLayers = arenaTagMaxLayers; + this.arenaTagLayers = arenaTagLayers!; // TODO: is this bang correct? + this.arenaTagMaxLayers = arenaTagMaxLayers!; // TODO: is this bang correct? } } /** diff --git a/src/field/arena.ts b/src/field/arena.ts index 2d20abeedd1..5b167791769 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -4,7 +4,6 @@ import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species"; import { Weather, WeatherType, getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage } from "../data/weather"; -import { CommonAnimPhase } from "../phases"; import { CommonAnim } from "../data/battle-anims"; import { Type } from "../data/type"; import Move from "../data/move"; @@ -13,7 +12,7 @@ import { BattlerIndex } from "../battle"; import { Terrain, TerrainType } from "../data/terrain"; import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability"; import Pokemon from "./pokemon"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { WeatherChangedEvent, TerrainChangedEvent, TagAddedEvent, TagRemovedEvent } from "../events/arena"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Biome } from "#enums/biome"; @@ -21,12 +20,16 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; import { TrainerType } from "#enums/trainer-type"; +import { Abilities } from "#app/enums/abilities"; +import { SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "#app/data/pokemon-forms"; +import { CommonAnimPhase } from "#app/phases/common-anim-phase"; +import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; export class Arena { public scene: BattleScene; public biomeType: Biome; - public weather: Weather; - public terrain: Terrain; + public weather: Weather | null; + public terrain: Terrain | null; public tags: ArenaTag[]; public bgm: string; public ignoreAbilities: boolean; @@ -57,7 +60,7 @@ export class Arena { this.scene.arenaBg.setTexture(`${biomeKey}_bg`); this.scene.arenaBgTransition.setTexture(`${biomeKey}_bg`); - // Redo this on initialise because during save/load the current wave isn't always + // Redo this on initialize because during save/load the current wave isn't always // set correctly during construction this.updatePoolsForTimeOfDay(); } @@ -121,7 +124,7 @@ export class Arena { } } - ret = getPokemonSpecies(species); + ret = getPokemonSpecies(species!); if (ret.subLegendary || ret.legendary || ret.mythical) { switch (true) { @@ -286,20 +289,20 @@ export class Arena { /** * Sets weather to the override specified in overrides.ts - * @param weather new weather to set of type WeatherType + * @param weather new {@linkcode WeatherType} to set * @returns true to force trySetWeather to return true */ trySetWeatherOverride(weather: WeatherType): boolean { this.weather = new Weather(weather, 0); this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.SUNNY + (weather - 1))); - this.scene.queueMessage(getWeatherStartMessage(weather)); + this.scene.queueMessage(getWeatherStartMessage(weather)!); // TODO: is this bang correct? return true; } /** * Attempts to set a new weather to the battle - * @param weather new weather to set of type WeatherType - * @param hasPokemonSource is the new weather from a pokemon + * @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set + * @param hasPokemonSource boolean if the new weather is from a pokemon * @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use */ trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean { @@ -314,13 +317,13 @@ export class Arena { const oldWeatherType = this.weather?.weatherType || WeatherType.NONE; this.weather = weather ? new Weather(weather, hasPokemonSource ? 5 : 0) : null; - this.eventTarget.dispatchEvent(new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType, this.weather?.turnsLeft)); + this.eventTarget.dispatchEvent(new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType!, this.weather?.turnsLeft!)); // TODO: is this bang correct? if (this.weather) { this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.SUNNY + (weather - 1))); - this.scene.queueMessage(getWeatherStartMessage(weather)); + this.scene.queueMessage(getWeatherStartMessage(weather)!); // TODO: is this bang correct? } else { - this.scene.queueMessage(getWeatherClearMessage(oldWeatherType)); + this.scene.queueMessage(getWeatherClearMessage(oldWeatherType)!); // TODO: is this bang correct? } this.scene.getField(true).filter(p => p.isOnField()).map(pokemon => { @@ -331,6 +334,36 @@ export class Arena { return true; } + /** + * Function to trigger all weather based form changes + */ + triggerWeatherBasedFormChanges(): void { + this.scene.getField(true).forEach( p => { + 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); + } + }); + } + + /** + * Function to trigger all weather based form changes back into their normal forms + */ + triggerWeatherBasedFormChangesToNormal(): void { + this.scene.getField(true).forEach( p => { + 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); + } + }); + } + trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim: boolean = false): boolean { if (this.terrain?.terrainType === (terrain || undefined)) { return false; @@ -339,15 +372,15 @@ export class Arena { const oldTerrainType = this.terrain?.terrainType || TerrainType.NONE; this.terrain = terrain ? new Terrain(terrain, hasPokemonSource ? 5 : 0) : null; - this.eventTarget.dispatchEvent(new TerrainChangedEvent(oldTerrainType,this.terrain?.terrainType, this.terrain?.turnsLeft)); + this.eventTarget.dispatchEvent(new TerrainChangedEvent(oldTerrainType, this.terrain?.terrainType!, this.terrain?.turnsLeft!)); // TODO: are those bangs correct? if (this.terrain) { if (!ignoreAnim) { this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.MISTY_TERRAIN + (terrain - 1))); } - this.scene.queueMessage(getTerrainStartMessage(terrain)); + this.scene.queueMessage(getTerrainStartMessage(terrain)!); // TODO: is this bang correct? } else { - this.scene.queueMessage(getTerrainClearMessage(oldTerrainType)); + this.scene.queueMessage(getTerrainClearMessage(oldTerrainType)!); // TODO: is this bang correct? } this.scene.getField(true).filter(p => p.isOnField()).map(pokemon => { @@ -384,6 +417,10 @@ export class Arena { return weatherMultiplier * terrainMultiplier; } + /** + * Gets the denominator for the chance for a trainer spawn + * @returns n where 1/n is the chance of a trainer battle + */ getTrainerChance(): integer { switch (this.biomeType) { case Biome.METROPOLIS: @@ -536,6 +573,12 @@ export class Arena { this.ignoreAbilities = ignoreAbilities; } + /** + * Applies each `ArenaTag` in this Arena, based on which side (self, enemy, or both) is passed in as a parameter + * @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply + * @param side {@linkcode ArenaTagSide} which side's arena tags to apply + * @param args array of parameters that the called upon tags may need + */ applyTagsForSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide, ...args: unknown[]): void { let tags = typeof tagType === "string" ? this.tags.filter(t => t.tagType === tagType) @@ -546,11 +589,28 @@ export class Arena { tags.forEach(t => t.apply(this, args)); } + /** + * Applies the specified tag to both sides (ie: both user and trainer's tag that match the Tag specified) + * by calling {@linkcode applyTagsForSide()} + * @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply + * @param args array of parameters that the called upon tags may need + */ applyTags(tagType: ArenaTagType | Constructor, ...args: unknown[]): void { this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args); } - addTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean { + /** + * Adds a new tag to the arena + * @param tagType {@linkcode ArenaTagType} the tag being added + * @param turnCount How many turns the tag lasts + * @param sourceMove {@linkcode Moves} the move the tag came from, or `undefined` if not from a move + * @param sourceId The ID of the pokemon in play the tag came from (see {@linkcode BattleScene.getPokemonById}) + * @param side {@linkcode ArenaTagSide} which side(s) the tag applies to + * @param quiet If a message should be queued on screen to announce the tag being added + * @param targetIndex The {@linkcode BattlerIndex} of the target pokemon + * @returns `false` if there already exists a tag of this type in the Arena + */ + addTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean { const existingTag = this.getTagOnSide(tagType, side); if (existingTag) { existingTag.onOverlap(this); @@ -563,31 +623,62 @@ export class Arena { return false; } + // creates a new tag object const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side); - this.tags.push(newTag); - newTag.onAdd(this, quiet); + if (newTag) { + this.tags.push(newTag); + newTag.onAdd(this, quiet); - const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {}; + const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {}; - this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers)); + this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers)); + } return true; } - getTag(tagType: ArenaTagType | Constructor): ArenaTag { + /** + * Attempts to get a tag from the Arena via {@linkcode getTagOnSide} that applies to both sides + * @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get + * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there + */ + getTag(tagType: ArenaTagType | Constructor): ArenaTag | undefined { return this.getTagOnSide(tagType, ArenaTagSide.BOTH); } - getTagOnSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide): ArenaTag { + hasTag(tagType: ArenaTagType) : boolean { + return !!this.getTag(tagType); + } + + /** + * Attempts to get a tag from the Arena from a specific side (the tag passed in has to either apply to both sides, or the specific side only) + * + * eg: `MIST` only applies to the user's side, while `MUD_SPORT` applies to both user and enemy side + * @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get + * @param side The {@linkcode ArenaTagSide} to look at + * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there + */ + getTagOnSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide): ArenaTag | undefined { return typeof(tagType) === "string" ? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)) : this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); } + /** + * Uses {@linkcode findTagsOnSide} to filter (using the parameter function) for specific tags that apply to both sides + * @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s + * @returns array of {@linkcode ArenaTag}s from which the Arena's tags return true and apply to both sides + */ findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] { return this.findTagsOnSide(tagPredicate, ArenaTagSide.BOTH); } + /** + * Returns specific tags from the arena that pass the `tagPredicate` function passed in as a parameter, and apply to the given side + * @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s + * @param side The {@linkcode ArenaTagSide} to look at + * @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side + */ findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] { return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); } @@ -634,6 +725,18 @@ export class Arena { } } + /** + * Clears weather, terrain and arena tags when entering new biome or trainer battle. + */ + resetArenaEffects(): void { + // Don't reset weather if a Biome's permanent weather is active + if (this.weather?.turnsLeft !== 0) { + this.trySetWeather(WeatherType.NONE, false); + } + this.trySetTerrain(TerrainType.NONE, false, true); + this.removeAllTags(); + } + preloadBgm(): void { this.scene.loadBgm(this.bgm); } @@ -653,7 +756,7 @@ export class Arena { case Biome.FOREST: return 4.294; case Biome.SEA: - return 1.672; + return 0.024; case Biome.SWAMP: return 4.461; case Biome.BEACH: @@ -705,9 +808,12 @@ export class Arena { case Biome.LABORATORY: return 114.862; case Biome.SLUM: - return 1.221; + return 0.000; case Biome.SNOWY_FOREST: return 3.047; + default: + console.warn(`missing bgm loop-point for biome "${Biome[this.biomeType]}" (=${this.biomeType})`); + return 0; } } } @@ -761,12 +867,12 @@ export class ArenaBase extends Phaser.GameObjects.Container { this.player = player; - this.base = scene.addFieldSprite(0, 0, "plains_a", null, 1); + this.base = scene.addFieldSprite(0, 0, "plains_a", undefined, 1); this.base.setOrigin(0, 0); this.props = !player ? new Array(3).fill(null).map(() => { - const ret = scene.addFieldSprite(0, 0, "plains_b", null, 1); + const ret = scene.addFieldSprite(0, 0, "plains_b", undefined, 1); ret.setOrigin(0, 0); ret.setVisible(false); return ret; diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index 4af219a60b9..ae0692da342 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -3,6 +3,8 @@ import Pokemon, { DamageResult, HitResult } from "./pokemon"; import * as Utils from "../utils"; import { BattlerIndex } from "../battle"; +type TextAndShadowArr = [ string | null, string | null ]; + export default class DamageNumberHandler { private damageNumbers: Map; @@ -24,7 +26,7 @@ export default class DamageNumberHandler { damageNumber.setOrigin(0.5, 1); damageNumber.setScale(baseScale); - let [ textColor, shadowColor ] = [ null, null ]; + let [ textColor, shadowColor ] : TextAndShadowArr = [ null, null ]; switch (result) { case HitResult.SUPER_EFFECTIVE: @@ -62,12 +64,12 @@ export default class DamageNumberHandler { this.damageNumbers.set(battlerIndex, []); } - const yOffset = this.damageNumbers.get(battlerIndex).length * -10; + const yOffset = this.damageNumbers.get(battlerIndex)!.length * -10; if (yOffset) { damageNumber.y += yOffset; } - this.damageNumbers.get(battlerIndex).push(damageNumber); + this.damageNumbers.get(battlerIndex)!.push(damageNumber); if (scene.damageNumbersMode === 1) { scene.tweens.add({ @@ -83,7 +85,7 @@ export default class DamageNumberHandler { alpha: 0, ease: "Sine.easeIn", onComplete: () => { - this.damageNumbers.get(battlerIndex).splice(this.damageNumbers.get(battlerIndex).indexOf(damageNumber), 1); + this.damageNumbers.get(battlerIndex)!.splice(this.damageNumbers.get(battlerIndex)!.indexOf(damageNumber), 1); damageNumber.destroy(true); } }); @@ -167,7 +169,7 @@ export default class DamageNumberHandler { delay: Utils.fixedInt(500), alpha: 0, onComplete: () => { - this.damageNumbers.get(battlerIndex).splice(this.damageNumbers.get(battlerIndex).indexOf(damageNumber), 1); + this.damageNumbers.get(battlerIndex)!.splice(this.damageNumbers.get(battlerIndex)!.indexOf(damageNumber), 1); damageNumber.destroy(true); } } diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 5312dd18727..ccf6a098667 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -35,7 +35,7 @@ export default class PokemonSpriteSparkleHandler { const ratioX = s.width / width; const ratioY = s.height / height; const pixel = texture.manager.getPixel(pixelX, pixelY, texture.key, "__BASE"); - if (pixel.alpha) { + if (pixel?.alpha) { const [ xOffset, yOffset ] = [ -s.originX * s.width, -s.originY * s.height]; const sparkle = (s.scene as BattleScene).addFieldSprite(((pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset), ((pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset), "tera_sparkle"); sparkle.pipelineData["ignoreTimeTint"] = s.pipelineData["ignoreTimeTint"]; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 6a70cb8f255..0eaa31c6630 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,27 +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, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags, NeutralDamageAgainstFlyingTypeMultiplierAttr } from "../data/move"; +import 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 { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, 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 { DamagePhase, FaintPhase, LearnMovePhase, MoveEffectPhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase } from "../phases"; -import { BattleStat } from "../data/battle-stat"; -import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, TypeImmuneTag, getBattlerTag } from "../data/battler-tags"; +import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag } from "../data/battler-tags"; import { WeatherType } from "../data/weather"; -import { TempBattleStat } from "../data/temp-battle-stat"; -import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from "../data/arena-tag"; -import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AllyMoveCategoryPowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AddSecondStrikeAbAttr, UserFieldMoveTypePowerBoostAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs } from "../data/ability"; +import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag"; +import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -37,11 +34,11 @@ import { Nature, getNatureStatMultiplier } from "../data/nature"; import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "../data/pokemon-forms"; import { TerrainType } from "../data/terrain"; import { TrainerSlot } from "../data/trainer-config"; -import * as Overrides from "../overrides"; +import 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"; @@ -50,6 +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"; +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, @@ -60,6 +68,7 @@ export enum FieldPosition { export default abstract class Pokemon extends Phaser.GameObjects.Container { public id: integer; public name: string; + public nickname: string; public species: PokemonSpecies; public formIndex: integer; public abilityIndex: integer; @@ -77,16 +86,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public ivs: integer[]; public nature: Nature; public natureOverride: Nature | -1; - public moveset: PokemonMove[]; - public status: Status; + public moveset: (PokemonMove | null)[]; + public status: Status | null; public friendship: integer; public metLevel: integer; public metBiome: Biome | -1; + public metSpecies: Species; public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; + public wildFlee: boolean; - public fusionSpecies: PokemonSpecies; + public fusionSpecies: PokemonSpecies | null; public fusionFormIndex: integer; public fusionAbilityIndex: integer; public fusionShiny: boolean; @@ -94,7 +105,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public fusionGender: Gender; public fusionLuck: integer; - private summonDataPrimer: PokemonSummonData; + private summonDataPrimer: PokemonSummonData | null; public summonData: PokemonSummonData; public battleData: PokemonBattleData; @@ -104,7 +115,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public fieldPosition: FieldPosition; public maskEnabled: boolean; - public maskSprite: Phaser.GameObjects.Sprite; + public maskSprite: Phaser.GameObjects.Sprite | null; + + public usedTMs: Moves[]; private shinySparkle: Phaser.GameObjects.Sprite; @@ -120,15 +133,26 @@ 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; - this.abilityIndex = abilityIndex !== undefined - ? abilityIndex - : (species.abilityHidden && hasHiddenAbility ? species.ability2 ? 2 : 1 : species.ability2 ? randAbilityIndex : 0); + this.wildFlee = false; + + // Determine the ability index + if (abilityIndex !== undefined) { + 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; + } else { + // If there is no hidden ability or species does not have a hidden ability + this.abilityIndex = species.ability2 !== species.ability1 ? randAbilityIndex : 0; // Use random ability index if species has a second ability, otherwise use 0 + } + } if (formIndex !== undefined) { this.formIndex = formIndex; } @@ -153,22 +177,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.variant = 0; } this.nature = dataSource.nature || 0 as Nature; + this.nickname = dataSource.nickname; this.natureOverride = dataSource.natureOverride !== undefined ? dataSource.natureOverride : -1; this.moveset = dataSource.moveset; - this.status = dataSource.status; + this.status = dataSource.status!; // TODO: is this bang correct? this.friendship = dataSource.friendship !== undefined ? dataSource.friendship : this.species.baseFriendship; this.metLevel = dataSource.metLevel || 5; this.luck = dataSource.luck; this.metBiome = dataSource.metBiome; + this.metSpecies = dataSource.metSpecies ?? (this.metBiome !== -1 ? this.species.speciesId : this.species.getRootSpeciesId(true)); this.pauseEvolutions = dataSource.pauseEvolutions; this.pokerus = !!dataSource.pokerus; - this.fusionSpecies = dataSource.fusionSpecies instanceof PokemonSpecies ? dataSource.fusionSpecies : getPokemonSpecies(dataSource.fusionSpecies); + this.fusionSpecies = dataSource.fusionSpecies instanceof PokemonSpecies ? dataSource.fusionSpecies : dataSource.fusionSpecies ? getPokemonSpecies(dataSource.fusionSpecies) : null; this.fusionFormIndex = dataSource.fusionFormIndex; this.fusionAbilityIndex = dataSource.fusionAbilityIndex; this.fusionShiny = dataSource.fusionShiny; 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); @@ -200,6 +227,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.friendship = species.baseFriendship; this.metLevel = level; this.metBiome = scene.currentBattle ? scene.arena.biomeType : -1; + this.metSpecies = species.speciesId; this.pokerus = false; if (level > 1) { @@ -223,7 +251,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.shiny = false; } - this.calculateStats(); + if (!dataSource) { + this.calculateStats(); + } + } + + + getNameToRender() { + try { + if (this.nickname) { + return decodeURIComponent(escape(atob(this.nickname))); + } + return this.name; + } catch (err) { + console.error(`Failed to decode nickname for ${this.name}`, err); + return this.name; + } } init(): void { @@ -269,14 +312,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Check if this pokemon is both not fainted and allowed to be in battle. + * Check if this pokemon is both not fainted (or a fled wild pokemon) and allowed to be in battle. * This is frequently a better alternative to {@link isFainted} * @returns {boolean} True if pokemon is allowed in battle */ isAllowedInBattle(): boolean { const challengeAllowed = new Utils.BooleanHolder(true); applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed); - return !this.isFainted() && challengeAllowed.value; + return !this.isFainted() && !this.wildFlee && challengeAllowed.value; } isActive(onField?: boolean): boolean { @@ -295,6 +338,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return ret; } + /** + * Sets the Pokemon's name. Only called when loading a Pokemon so this function needs to be called when + * initializing hardcoded Pokemon or else it will not display the form index name properly. + * @returns n/a + */ generateName(): void { if (!this.fusionSpecies) { this.name = this.species.getName(this.formIndex); @@ -316,7 +364,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { loadAssets(ignoreOverride: boolean = true): Promise { return new Promise(resolve => { - const moveIds = this.getMoveset().map(m => m.getMove().id); + const moveIds = this.getMoveset().map(m => m!.getMove().id); // TODO: is this bang correct? Promise.allSettled(moveIds.map(m => initMoveAnim(this.scene, m))) .then(() => { loadMoveAnimAssets(this.scene, moveIds); @@ -404,7 +452,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.species.forms[this.formIndex].formKey; } - getFusionFormKey(): string { + getFusionFormKey(): string | null { if (!this.fusionSpecies) { return null; } @@ -493,7 +541,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.summonData.fusionSpeciesForm; } if (!this.fusionSpecies?.forms?.length || this.fusionFormIndex >= this.fusionSpecies?.forms.length) { - return this.fusionSpecies; + //@ts-ignore + return this.fusionSpecies; // TODO: I don't even know how to fix this... A complete cluster of classes involved + null } return this.fusionSpecies?.forms[this.fusionFormIndex]; } @@ -502,7 +551,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.getAt(0) as Phaser.GameObjects.Sprite; } - getTintSprite(): Phaser.GameObjects.Sprite { + getTintSprite(): Phaser.GameObjects.Sprite | null { return !this.maskEnabled ? this.getAt(1) as Phaser.GameObjects.Sprite : this.maskSprite; @@ -520,7 +569,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.scene) { return []; } - return this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[]; + return this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[]; } updateScale(): void { @@ -528,7 +577,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } updateSpritePipelineData(): void { - [ this.getSprite(), this.getTintSprite() ].map(s => s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType())); + [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType())); this.updateInfo(true); } @@ -576,7 +625,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } playAnim(): void { - this.tryPlaySprite(this.getSprite(), this.getTintSprite(), this.getBattleSpriteKey()); + this.tryPlaySprite(this.getSprite(), this.getTintSprite()!, this.getBattleSpriteKey()); // TODO: is the bag correct? } getFieldPositionOffset(): [ number, number ] { @@ -625,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, 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)) { @@ -714,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; @@ -752,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); } } @@ -773,6 +914,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.setNature(nature); } + isFullHp(): boolean { + return this.hp >= this.getMaxHp(); + } + getMaxHp(): integer { return this.getStat(Stat.HP); } @@ -832,7 +977,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { abstract isBoss(): boolean; - getMoveset(ignoreOverride?: boolean): PokemonMove[] { + getMoveset(ignoreOverride?: boolean): (PokemonMove | null)[] { const ret = !ignoreOverride && this.summonData?.moveset ? this.summonData.moveset : this.moveset; @@ -850,11 +995,44 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * All moves that could be relearned by this pokemon at this point. Used for memory mushrooms. - * @returns {Moves[]} The valid moves + * Checks which egg moves have been unlocked for the {@linkcode Pokemon} based + * on the species it was met at or by the first {@linkcode Pokemon} in its evolution + * line that can act as a starter and provides those egg moves. + * @returns an array of {@linkcode Moves}, the length of which is determined by how many + * egg moves are unlocked for that species. + */ + getUnlockedEggMoves(): Moves[] { + const moves: Moves[] = []; + const species = this.metSpecies in speciesEggMoves ? this.metSpecies : this.getSpeciesForm(true).getRootSpeciesId(true); + if (species in speciesEggMoves) { + for (let i = 0; i < 4; i++) { + if (this.scene.gameData.starterData[species].eggMoves & (1 << i)) { + moves.push(speciesEggMoves[species][i]); + } + } + } + return moves; + } + + /** + * Gets all possible learnable level moves for the {@linkcode Pokemon}, + * excluding any moves already known. + * + * Available egg moves are only included if the {@linkcode Pokemon} was + * in the starting party of the run and if Fresh Start is not active. + * @returns an array of {@linkcode Moves}, the length of which is determined + * by how many learnable moves there are for the {@linkcode Pokemon}. */ getLearnableLevelMoves(): Moves[] { - return this.getLevelMoves(1, true, false, true).map(lm => lm[1]).filter(lm => !this.moveset.filter(m => m.moveId === lm).length).filter((move: Moves, i: integer, array: Moves[]) => array.indexOf(move) === i); + let levelMoves = this.getLevelMoves(1, true, false, true).map(lm => lm[1]); + if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge() && !this.scene.gameMode.isDaily) { + levelMoves = this.getUnlockedEggMoves().concat(levelMoves); + } + 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; } /** @@ -865,7 +1043,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns array of {@linkcode Type} */ getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride?: boolean): Type[] { - const types = []; + const types : Type[] = []; if (includeTeraType) { const teraType = this.getTeraType(); @@ -875,7 +1053,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (!types.length || !includeTeraType) { - if (!ignoreOverride && this.summonData?.types) { + if (!ignoreOverride && this.summonData?.types && this.summonData.types.length !== 0) { this.summonData.types.forEach(t => types.push(t)); } else { const speciesForm = this.getSpeciesForm(ignoreOverride); @@ -899,12 +1077,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // this.scene potentially can be undefined for a fainted pokemon in doubles // use optional chaining to avoid runtime errors - if (forDefend && (this.getTag(GroundedTag) || this.scene?.arena.getTag(ArenaTagType.GRAVITY))) { - const flyingIndex = types.indexOf(Type.FLYING); - if (flyingIndex > -1) { - types.splice(flyingIndex, 1); - } - } if (!types.length) { // become UNKNOWN if no types are present types.push(Type.UNKNOWN); @@ -1010,6 +1182,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && !this.isPlayer())) { return true; } + + // Classic Final boss and Endless Minor/Major bosses do not have passive + const { currentBattle, gameMode } = this.scene; + const waveIndex = currentBattle?.waveIndex; + if (this instanceof EnemyPokemon && + (currentBattle?.battleSpec === BattleSpec.FINAL_BOSS || + gameMode.isEndlessMinorBoss(waveIndex) || + gameMode.isEndlessMajorBoss(waveIndex))) { + return false; + } + return this.passive || this.isBoss(); } @@ -1038,17 +1221,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const suppressed = new Utils.BooleanHolder(false); this.scene.getField(true).filter(p => p !== this).map(p => { if (p.getAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility()) { - p.getAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, false, suppressed, [ability])); + p.getAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, false, false, suppressed, [ability])); } if (p.getPassiveAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility(true)) { - p.getPassiveAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, true, suppressed, [ability])); + p.getPassiveAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, true, false, suppressed, [ability])); } }); if (suppressed.value) { return false; } } - return (this.hp || ability.isBypassFaint) && !ability.conditions.find(condition => !condition(this)); + return (!!this.hp || ability.isBypassFaint) && !ability.conditions.find(condition => !condition(this)); } /** @@ -1056,7 +1239,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * effects which can affect whether an ability will be present or in effect, and both passive and * non-passive. This is the primary way to check whether a pokemon has a particular ability. * @param {Abilities} ability The ability to check for - * @param {boolean} canApply If false, it doesn't check whether the abiltiy is currently active + * @param {boolean} canApply If false, it doesn't check whether the ability is currently active * @param {boolean} ignoreOverride If true, it ignores ability changing effects * @returns {boolean} Whether the ability is present and active */ @@ -1093,7 +1276,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getWeight(): number { const weight = new Utils.NumberHolder(this.species.weight); // This will trigger the ability overlay so only call this function when necessary - applyAbAttrs(WeightMultiplierAbAttr, this, null, weight); + applyAbAttrs(WeightMultiplierAbAttr, this, null, false, weight); return weight.value; } @@ -1120,100 +1303,205 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isGrounded(): boolean { - return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN)); + 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. + * @param move {@linkcode Move} The move being used. + * @param simulated If `true`, prevents showing abilities applied in this calculation. + * @returns the {@linkcode Type} of the move after attributes are applied + */ + getMoveType(move: Move, simulated: boolean = true): Type { + const moveTypeHolder = new Utils.NumberHolder(move.type); + + applyMoveAttrs(VariableMoveTypeAttr, this, null, move, moveTypeHolder); + applyPreAttackAbAttrs(MoveTypeChangeAbAttr, this, null, move, simulated, moveTypeHolder); + + return moveTypeHolder.value as Type; + } + + + /** * Calculates the effectiveness of a move against the Pokémon. * - * @param source - The Pokémon using the move. - * @param move - The move being used. - * @returns The type damage multiplier or undefined if it's a status move + * @param source {@linkcode Pokemon} The attacking Pokémon. + * @param move {@linkcode Move} The move being used by the attacking Pokémon. + * @param ignoreAbility Whether to ignore abilities that might affect type effectiveness or immunity (defaults to `false`). + * @param simulated Whether to apply abilities via simulated calls (defaults to `true`) + * @param cancelled {@linkcode Utils.BooleanHolder} Stores whether the move was cancelled by a non-type-based immunity. + * Currently only used by {@linkcode Pokemon.apply} to determine whether a "No effect" message should be shown. + * @returns The type damage multiplier, indicating the effectiveness of the move */ - getMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier | undefined { - if (move.getMove().category === MoveCategory.STATUS) { - return undefined; + getMoveEffectiveness(source: Pokemon, move: Move, ignoreAbility: boolean = false, simulated: boolean = true, cancelled?: Utils.BooleanHolder): TypeDamageMultiplier { + if (move.hasAttr(TypelessAttr)) { + return 1; + } + const moveType = source.getMoveType(move); + + const typeMultiplier = new Utils.NumberHolder((move.category !== MoveCategory.STATUS || move.hasAttr(RespectAttackTypeImmunityAttr)) + ? this.getAttackTypeEffectiveness(moveType, source, false, simulated) + : 1); + + applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); + if (this.getTypes().find(t => move.isTypeImmune(source, this, t))) { + typeMultiplier.value = 0; } - return this.getAttackMoveEffectiveness(source, move, !this.battleData?.abilityRevealed); + const cancelledHolder = cancelled ?? new Utils.BooleanHolder(false); + if (!ignoreAbility) { + applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + + if (!cancelledHolder.value) { + applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + } + + if (!cancelledHolder.value) { + const defendingSidePlayField = this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); + defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelledHolder)); + } + } + + const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType); + for (const tag of immuneTags) { + if (move && !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType)) { + typeMultiplier.value = 0; + break; + } + } + + // 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; } /** - * Calculates the effectiveness of an attack move against the Pokémon. - * - * @param source - The attacking Pokémon. - * @param pokemonMove - The move being used by the attacking Pokémon. - * @param ignoreAbility - Whether to check for abilities that might affect type effectiveness or immunity. - * @returns The type damage multiplier, indicating the effectiveness of the move + * Calculates the type effectiveness multiplier for an attack type + * @param moveType {@linkcode Type} the type of the move being used + * @param source {@linkcode Pokemon} the Pokemon using the move + * @param ignoreStrongWinds whether or not this ignores strong winds (anticipation, forewarn, stealth rocks) + * @param simulated tag to only apply the strong winds effect message when the move is used + * @returns a multiplier for the type effectiveness */ - getAttackMoveEffectiveness(source: Pokemon, pokemonMove: PokemonMove, ignoreAbility: boolean = false): TypeDamageMultiplier { - const move = pokemonMove.getMove(); - const typeless = move.hasAttr(TypelessAttr); - const typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move.type, source)); - const cancelled = new Utils.BooleanHolder(false); - applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (!typeless && !ignoreAbility) { - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true); - } - if (!cancelled.value && !ignoreAbility) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true); - } - - return (!cancelled.value ? Number(typeMultiplier.value) : 0) as TypeDamageMultiplier; - } - - getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false): TypeDamageMultiplier { + getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true): TypeDamageMultiplier { if (moveType === Type.STELLAR) { return this.isTerastallized() ? 2 : 1; } const types = this.getTypes(true, true); + const arena = this.scene.arena; + + // Handle flying v ground type immunity without removing flying type so effective types are still effective + // Related to https://github.com/pagefaultgames/pokerogue/issues/524 + if (moveType === Type.GROUND && (this.isGrounded() || arena.hasTag(ArenaTagType.GRAVITY))) { + const flyingIndex = types.indexOf(Type.FLYING); + if (flyingIndex > -1) { + types.splice(flyingIndex, 1); + } + } let multiplier = types.map(defType => { + const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType)); + applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier); if (source) { const ignoreImmunity = new Utils.BooleanHolder(false); if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) { - applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, moveType, defType); + applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType); } if (ignoreImmunity.value) { - return 1; + if (multiplier.value === 0) { + return 1; + } + } + + const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[]; + if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) { + if (multiplier.value === 0) { + return 1; + } } } - - return getTypeDamageMultiplier(moveType, defType); + 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 && this.scene.arena.weather?.weatherType === WeatherType.STRONG_WINDS && !this.scene.arena.weather.isEffectSuppressed(this.scene) && multiplier >= 2 && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2) { + if (!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")); + } } - - if (!!this.summonData?.tags.find((tag) => tag instanceof TypeImmuneTag && tag.immuneType === moveType)) { - multiplier = 0; - } - - return multiplier; + return multiplier as TypeDamageMultiplier; } - getMatchupScore(pokemon: Pokemon): number { + /** + * Computes the given Pokemon's matchup score against this Pokemon. + * In most cases, this score ranges from near-zero to 16, but the maximum possible matchup score is 64. + * @param opponent {@linkcode Pokemon} The Pokemon to compare this Pokemon against + * @returns A score value based on how favorable this Pokemon is when fighting the given Pokemon + */ + getMatchupScore(opponent: Pokemon): number { const types = this.getTypes(true); - const enemyTypes = pokemon.getTypes(true, true); - const outspeed = (this.isActive(true) ? this.getBattleStat(Stat.SPD, pokemon) : this.getStat(Stat.SPD)) <= pokemon.getBattleStat(Stat.SPD, this); - let atkScore = pokemon.getAttackTypeEffectiveness(types[0], this) * (outspeed ? 1.25 : 1); - let defScore = 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], pokemon), 0.25); + const enemyTypes = opponent.getTypes(true, true); + /** Is this Pokemon faster than the opponent? */ + 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. + */ + let atkScore = opponent.getAttackTypeEffectiveness(types[0], this) * (outspeed ? 1.25 : 1); + /** + * Based on how effectively this Pokemon defends against the opponent's types. + * This score cannot be higher than 4. + */ + let defScore = 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], opponent), 0.25); if (types.length > 1) { - atkScore *= pokemon.getAttackTypeEffectiveness(types[1], this); + atkScore *= opponent.getAttackTypeEffectiveness(types[1], this); } if (enemyTypes.length > 1) { - defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], pokemon), 0.25)); + defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], opponent), 0.25)); } - let hpDiffRatio = this.getHpRatio() + (1 - pokemon.getHpRatio()); + /** + * Based on this Pokemon's HP ratio compared to that of the opponent. + * This ratio is multiplied by 1.5 if this Pokemon outspeeds the opponent; + * however, the final ratio cannot be higher than 1. + */ + let hpDiffRatio = this.getHpRatio() + (1 - opponent.getHpRatio()); if (outspeed) { hpDiffRatio = Math.min(hpDiffRatio * 1.5, 1); } return (atkScore + defScore) * hpDiffRatio; } - getEvolution(): SpeciesFormEvolution { + getEvolution(): SpeciesFormEvolution | null { if (pokemonEvolutions.hasOwnProperty(this.species.speciesId)) { const evolutions = pokemonEvolutions[this.species.speciesId]; for (const e of evolutions) { @@ -1225,7 +1513,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (this.isFusion() && pokemonEvolutions.hasOwnProperty(this.fusionSpecies.speciesId)) { + if (this.isFusion() && this.fusionSpecies && pokemonEvolutions.hasOwnProperty(this.fusionSpecies.speciesId)) { const fusionEvolutions = pokemonEvolutions[this.fusionSpecies.speciesId].map(e => new FusionSpeciesFormEvolution(this.species.speciesId, e)); for (const fe of fusionEvolutions) { if (!fe.item && this.level >= fe.level && (!fe.preFormKey || this.getFusionFormKey() === fe.preFormKey)) { @@ -1257,7 +1545,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const evolutionChain = this.species.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); for (let e = 0; e < evolutionChain.length; e++) { // TODO: Might need to pass specific form index in simulated evolution chain - const speciesLevelMoves = getPokemonSpeciesForm(evolutionChain[e][0] as Species, this.formIndex).getLevelMoves(); + const speciesLevelMoves = getPokemonSpeciesForm(evolutionChain[e][0], this.formIndex).getLevelMoves(); if (includeRelearnerMoves) { levelMoves.push(...speciesLevelMoves); } else { @@ -1272,7 +1560,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const fusionEvolutionChain = this.fusionSpecies.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); for (let e = 0; e < fusionEvolutionChain.length; e++) { // TODO: Might need to pass specific form index in simulated evolution chain - const speciesLevelMoves = getPokemonSpeciesForm(fusionEvolutionChain[e][0] as Species, this.fusionFormIndex).getLevelMoves(); + const speciesLevelMoves = getPokemonSpeciesForm(fusionEvolutionChain[e][0], this.fusionFormIndex).getLevelMoves(); if (includeRelearnerMoves) { levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === 0) || lm[0] !== 0)); } else { @@ -1284,30 +1572,53 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } levelMoves.sort((lma: [integer, integer], lmb: [integer, integer]) => lma[0] > lmb[0] ? 1 : lma[0] < lmb[0] ? -1 : 0); - const uniqueMoves: Moves[] = []; + + + /** + * Filter out moves not within the correct level range(s) + * Includes moves below startingLevel, or of specifically level 0 if + * includeRelearnerMoves or includeEvolutionMoves are true respectively + */ levelMoves = levelMoves.filter(lm => { - if (uniqueMoves.find(m => m === lm[1])) { - return false; - } - uniqueMoves.push(lm[1]); - return true; + const level = lm[0]; + const isRelearner = level < startingLevel; + const allowedEvolutionMove = (level === 0) && includeEvolutionMoves; + + return !(level > this.level) + && (includeRelearnerMoves || !isRelearner || allowedEvolutionMove); }); + /** + * This must be done AFTER filtering by level, else if the same move shows up + * in levelMoves multiple times all but the lowest level one will be skipped. + * This causes problems when there are intentional duplicates (i.e. Smeargle with Sketch) + */ if (levelMoves) { - for (const lm of levelMoves) { - const level = lm[0]; - if (!includeRelearnerMoves && ((level > 0 && level < startingLevel) || (!includeEvolutionMoves && level === 0) || level < 0)) { - continue; - } else if (level > this.level) { - break; - } - ret.push(lm); - } + this.getUniqueMoves(levelMoves, ret); } return ret; } + /** + * Helper function for getLevelMoves. + * Finds all non-duplicate items from the input, and pushes them into the output. + * Two items count as duplicate if they have the same Move, regardless of level. + * + * @param levelMoves the input array to search for non-duplicates from + * @param ret the output array to be pushed into. + */ + private getUniqueMoves(levelMoves: LevelMoves, ret: LevelMoves ): void { + const uniqueMoves : Moves[] = []; + for (const lm of levelMoves) { + if (!uniqueMoves.find(m => m === lm[1])) { + uniqueMoves.push(lm[1]); + ret.push(lm); + } + } + } + + setMove(moveIndex: integer, moveId: Moves): void { const move = moveId ? new PokemonMove(moveId) : null; this.moveset[moveIndex] = move; @@ -1317,13 +1628,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 { @@ -1332,13 +1644,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } - const rand1 = Utils.binToDec(Utils.decToBin(this.id).substring(0, 16)); - const rand2 = Utils.binToDec(Utils.decToBin(this.id).substring(16, 32)); + const rand1 = (this.id & 0xFFFF0000) >>> 16; + const rand2 = (this.id & 0x0000FFFF); 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(); @@ -1351,9 +1665,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(); @@ -1413,7 +1724,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }; this.fusionSpecies = this.scene.randomSpecies(this.scene.currentBattle?.waveIndex || 0, this.level, false, filter, true); - this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? this.fusionSpecies.ability2 ? 2 : 1 : this.fusionSpecies.ability2 ? randAbilityIndex : 0); + this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? 2 : this.fusionSpecies.ability2 !== this.fusionSpecies.ability1 ? randAbilityIndex : 0); this.fusionShiny = this.shiny; this.fusionVariant = this.variant; @@ -1435,7 +1746,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } clearFusionSpecies(): void { - this.fusionSpecies = undefined; + this.fusionSpecies = null; this.fusionFormIndex = 0; this.fusionAbilityIndex = 0; this.fusionShiny = false; @@ -1540,7 +1851,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)]); } @@ -1552,8 +1863,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. @@ -1595,9 +1908,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Sqrt the weight of any damaging moves with overlapping types. This is about a 0.05 - 0.1 multiplier. // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights double if STAB. // Status moves remain unchanged on weight, this encourages 1-2 - movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo.moveId)).map(m => [m[0], this.moveset.some(mo => mo.getMove().category !== MoveCategory.STATUS && mo.getMove().type === allMoves[m[0]].type) ? Math.ceil(Math.sqrt(m[1])) : allMoves[m[0]].category !== MoveCategory.STATUS ? Math.ceil(m[1]/Math.max(Math.pow(4, this.moveset.filter(mo => mo.getMove().power > 1).length)/8,0.5) * (this.isOfType(allMoves[m[0]].type) ? 2 : 1)) : m[1]]); + movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)).map(m => [m[0], this.moveset.some(mo => mo?.getMove().category !== MoveCategory.STATUS && mo?.getMove().type === allMoves[m[0]].type) ? Math.ceil(Math.sqrt(m[1])) : allMoves[m[0]].category !== MoveCategory.STATUS ? Math.ceil(m[1]/Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power!) > 1).length)/8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 2 : 1)) : m[1]]); // TODO: is this bang correct? } else { // Non-trainer pokemon just use normal weights - movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo.moveId)); + movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)); } const totalWeight = movePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); @@ -1615,7 +1928,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const move = this.getMoveset().length > moveIndex ? this.getMoveset()[moveIndex] : null; - return move?.isUsable(this, ignorePp); + return move?.isUsable(this, ignorePp)!; // TODO: is this bang correct? } showInfo(): void { @@ -1664,6 +1977,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } + /** + * sets if the pokemon has fled (implies it's a wild pokemon) + * @param status - boolean + */ + setWildFlee(status: boolean): void { + this.wildFlee = status; + } + updateInfo(instant?: boolean): Promise { return this.battleInfo.updateInfo(this, instant); } @@ -1698,7 +2019,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.levelExp = this.exp - getLevelTotalExp(this.level, this.species.growthRate); } - getOpponent(targetIndex: integer): Pokemon { + getOpponent(targetIndex: integer): Pokemon | null { const ret = this.getOpponents()[targetIndex]; if (ret.summonData) { return ret; @@ -1715,172 +2036,239 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (opponents.length === 1) { return opponents[0].name; } - return this.isPlayer() ? "the opposing team" : "your team"; + return this.isPlayer() ? i18next.t("arenaTag:opposingTeam") : i18next.t("arenaTag:yourTeam"); } getAlly(): Pokemon { return (this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.getFieldIndex() ? 0 : 1]; } + /** + * Gets the Pokémon on the allied field. + * + * @returns An array of Pokémon on the allied field. + */ + getAlliedField(): Pokemon[] { + 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. + * + * This method considers various factors such as the user's accuracy level, the target's evasion level, + * abilities, and modifiers to compute the final accuracy multiplier. + * + * @param target {@linkcode Pokemon} - The target Pokémon against which the move is used. + * @param sourceMove {@linkcode Move} - The move being used by the user. + * @returns The calculated accuracy multiplier. + */ + getAccuracyMultiplier(target: Pokemon, sourceMove: Move): number { + const isOhko = sourceMove.hasAttr(OneHitKOAccuracyAttr); + if (isOhko) { + return 1; + } + + const userAccStage = new Utils.IntegerHolder(this.getStatStage(Stat.ACC)); + const targetEvaStage = new Utils.IntegerHolder(target.getStatStage(Stat.EVA)); + + 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)) { + targetEvaStage.value = Math.min(0, targetEvaStage.value); + } + + const accuracyMultiplier = new Utils.NumberHolder(1); + 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)); + } + + applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, Stat.ACC, accuracyMultiplier, false, sourceMove); + + const evasionMultiplier = new Utils.NumberHolder(1); + applyStatMultiplierAbAttrs(StatMultiplierAbAttr, target, Stat.EVA, evasionMultiplier); + + return accuracyMultiplier.value / evasionMultiplier.value; + } + + /** + * Apply the results of a move to this pokemon + * @param {Pokemon} source The pokemon using the move + * @param {PokemonMove} battlerMove The move being used + * @returns {HitResult} The result of the attack + */ apply(source: Pokemon, move: Move): HitResult { let result: HitResult; const damage = new Utils.NumberHolder(0); - const defendingSidePlayField = this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); + const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - const variableCategory = new Utils.IntegerHolder(move.category); + const variableCategory = new Utils.NumberHolder(move.category); applyMoveAttrs(VariableMoveCategoryAttr, source, this, move, variableCategory); const moveCategory = variableCategory.value as MoveCategory; - const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1); - applyMoveAttrs(VariableMoveTypeAttr, source, this, move); - applyPreAttackAbAttrs(MoveTypeChangeAttr, source, this, move, typeChangeMovePowerMultiplier); - const types = this.getTypes(true, true); + /** The move's type after type-changing effects are applied */ + const moveType = source.getMoveType(move); + /** If `value` is `true`, cancels the move and suppresses "No Effect" messages */ const cancelled = new Utils.BooleanHolder(false); - const typeless = move.hasAttr(TypelessAttr); - const typeMultiplier = new Utils.NumberHolder(!typeless && (moveCategory !== MoveCategory.STATUS || move.getAttrs(StatusMoveTypeImmunityAttr).find(attr => types.includes(attr.immuneType))) - ? this.getAttackTypeEffectiveness(move.type, source) - : 1); - applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (typeless) { - typeMultiplier.value = 1; - } - if (types.find(t => move.isTypeImmune(source, this, t))) { - typeMultiplier.value = 0; - } - // Apply arena tags for conditional protection - if (!move.checkFlag(MoveFlags.IGNORE_PROTECT, source, this) && !move.isAllyTarget()) { - const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - this.scene.arena.applyTagsForSide(ArenaTagType.QUICK_GUARD, defendingSide, cancelled, this, move.priority); - this.scene.arena.applyTagsForSide(ArenaTagType.WIDE_GUARD, defendingSide, cancelled, this, move.moveTarget); - this.scene.arena.applyTagsForSide(ArenaTagType.MAT_BLOCK, defendingSide, cancelled, this, move.category); - this.scene.arena.applyTagsForSide(ArenaTagType.CRAFTY_SHIELD, defendingSide, cancelled, this, move.category, move.moveTarget); - } + /** + * The effectiveness of the move being used. Along with type matchups, this + * accounts for changes in effectiveness from the move's attributes and the + * abilities of both the source and this Pokemon. + */ + const typeMultiplier = this.getMoveEffectiveness(source, move, false, false, cancelled); switch (moveCategory) { case MoveCategory.PHYSICAL: case MoveCategory.SPECIAL: const isPhysical = moveCategory === MoveCategory.PHYSICAL; - const power = new Utils.NumberHolder(move.power); const sourceTeraType = source.getTeraType(); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === move.type && power.value < 60 && move.priority <= 0 && !move.hasAttr(MultiHitAttr) && !this.scene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { - power.value = 60; - } - applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, this, move, power); - if (source.getAlly()?.hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { - applyPreAttackAbAttrs(AllyMoveCategoryPowerBoostAbAttr, source, this, move, power); - } - - const fieldAuras = new Set( - this.scene.getField(true) - .map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr) as FieldMoveTypePowerBoostAbAttr[]) - .flat(), - ); - for (const aura of fieldAuras) { - // The only relevant values are `move` and the `power` holder - aura.applyPreAttack(null, null, null, move, [power]); - } - - const alliedField: Pokemon[] = source instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField(); - alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, this, move, power)); - - power.value *= typeChangeMovePowerMultiplier.value; - - if (!typeless) { - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier); - applyMoveAttrs(NeutralDamageAgainstFlyingTypeMultiplierAttr, source, this, move, typeMultiplier); - } - if (!cancelled.value) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier); - defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, typeMultiplier)); - } + const power = move.calculateBattlePower(source, this); if (cancelled.value) { + // Cancelled moves fail silently source.stopMultiHit(this); - result = HitResult.NO_EFFECT; + return HitResult.NO_EFFECT; } else { - const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === move.type) as TypeBoostTag; - if (typeBoost) { - power.value *= typeBoost.boostValue; - if (typeBoost.oneUse) { - source.removeTag(typeBoost.tagType); - } + const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === moveType) as TypeBoostTag; + if (typeBoost?.oneUse) { + source.removeTag(typeBoost.tagType); } - const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(move.type, source.isGrounded())); + + /** Combined damage multiplier from field effects such as weather, terrain, etc. */ + const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(moveType, source.isGrounded())); applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); - if (this.scene.arena.getTerrainType() === TerrainType.GRASSY && this.isGrounded() && move.type === Type.GROUND && move.moveTarget === MoveTarget.ALL_NEAR_OTHERS) { - power.value /= 2; + + /** + * Whether or not this Pokemon is immune to the incoming move. + * Note that this isn't fully resolved in `getMoveEffectiveness` because + * of possible type-suppressing field effects (e.g. Desolate Land's effect on Water-type attacks). + */ + const isTypeImmune = (typeMultiplier * arenaAttackTypeMultiplier.value) === 0; + if (isTypeImmune) { + // Moves with no effect that were not cancelled queue a "no effect" message before failing + source.stopMultiHit(this); + result = (move.id === Moves.SHEER_COLD) + ? HitResult.IMMUNE + : HitResult.NO_EFFECT; + + if (result === HitResult.IMMUNE) { + this.scene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: this.name })); + } else { + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); + } + + return result; } - applyMoveAttrs(VariablePowerAttr, source, this, move, power); - - this.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); - if (!typeless) { - this.scene.arena.applyTags(WeakenMoveTypeTag, move.type, power); - this.scene.applyModifiers(AttackTypeBoosterModifier, source.isPlayer(), source, move.type, power); - } - if (source.getTag(HelpingHandTag)) { - power.value *= 1.5; + const glaiveRushModifier = new Utils.IntegerHolder(1); + if (this.getTag(BattlerTagType.RECEIVE_DOUBLE_DAMAGE)) { + glaiveRushModifier.value = 2; } let isCritical: boolean; const critOnly = new Utils.BooleanHolder(false); const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); - applyAbAttrs(ConditionalCritAbAttr, source, null, critOnly, this, move); + applyAbAttrs(ConditionalCritAbAttr, source, null, false, critOnly, this, move); if (critOnly.value || critAlways) { isCritical = true; } else { - const critLevel = new Utils.IntegerHolder(0); - applyMoveAttrs(HighCritAttr, source, this, move, critLevel); - this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel); - const bonusCrit = new Utils.BooleanHolder(false); - if (applyAbAttrs(BonusCritAbAttr, source, null, bonusCrit)) { - if (bonusCrit.value) { - critLevel.value += 1; - } - } - if (source.getTag(BattlerTagType.CRIT_BOOST)) { - critLevel.value += 2; - } - const critChance = [24, 8, 2, 1][Math.max(0, Math.min(critLevel.value, 3))]; - isCritical = !source.getTag(BattlerTagType.NO_CRIT) && (critChance === 1 || !this.scene.randBattleSeedInt(critChance)); + 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; } } if (isCritical) { + const noCritTag = this.scene.arena.getTagOnSide(NoCritTag, defendingSide); const blockCrit = new Utils.BooleanHolder(false); - applyAbAttrs(BlockCritAbAttr, this, null, blockCrit); - if (blockCrit.value) { + applyAbAttrs(BlockCritAbAttr, this, null, false, blockCrit); + if (noCritTag || blockCrit.value) { isCritical = false; } } - const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, null, isCritical)); - const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical)); + const 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, criticalMultiplier); + applyAbAttrs(MultCritAbAttr, source, null, false, criticalMultiplier); const screenMultiplier = new Utils.NumberHolder(1); if (!isCritical) { - this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, move.category, this.scene.currentBattle.double, screenMultiplier); + this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, move.category, this.scene.currentBattle.double, screenMultiplier); } - const isTypeImmune = (typeMultiplier.value * arenaAttackTypeMultiplier.value) === 0; const sourceTypes = source.getTypes(); - const matchesSourceType = sourceTypes[0] === move.type || (sourceTypes.length > 1 && sourceTypes[1] === move.type); + const matchesSourceType = sourceTypes[0] === moveType || (sourceTypes.length > 1 && sourceTypes[1] === moveType); const stabMultiplier = new Utils.NumberHolder(1); if (sourceTeraType === Type.UNKNOWN && matchesSourceType) { stabMultiplier.value += 0.5; - } else if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === move.type) { + } else if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === moveType) { stabMultiplier.value += 0.5; } - applyAbAttrs(StabBoostAbAttr, source, null, stabMultiplier); + applyAbAttrs(StabBoostAbAttr, source, null, false, stabMultiplier); if (sourceTeraType !== Type.UNKNOWN && matchesSourceType) { stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25); } + // 25% damage debuff on moves hitting more than one non-fainted target (regardless of immunities) + const { targets, multiple } = getMoveTargets(source, move.id); + const targetMultiplier = (multiple && targets.length > 1) ? 0.75 : 1; + applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); @@ -1890,21 +2278,33 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { numTargets = effectPhase.getTargets().length; } const twoStrikeMultiplier = new Utils.NumberHolder(1); - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier); + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, false, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier); if (!isTypeImmune) { - damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * twoStrikeMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); + const levelMultiplier = (2 * source.level / 5 + 2); + const randomMultiplier = (this.randSeedIntRange(85, 100) / 100); + damage.value = Utils.toDmgValue((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2) + * stabMultiplier.value + * typeMultiplier + * arenaAttackTypeMultiplier.value + * screenMultiplier.value + * twoStrikeMultiplier.value + * targetMultiplier + * criticalMultiplier.value + * glaiveRushModifier.value + * randomMultiplier); + if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { if (!move.hasAttr(BypassBurnDamageReductionAttr)) { const burnDamageReductionCancelled = new Utils.BooleanHolder(false); - applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled); + applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled, false); if (!burnDamageReductionCancelled.value) { - damage.value = Math.floor(damage.value / 2); + damage.value = Utils.toDmgValue(damage.value / 2); } } } - applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, move, damage); + applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, move, false, damage); /** * For each {@link HitsTagAttr} the move has, doubles the damage of the move if: @@ -1919,8 +2319,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } - if (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && move.type === Type.DRAGON) { - damage.value = Math.floor(damage.value / 2); + if (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && moveType === Type.DRAGON) { + damage.value = Utils.toDmgValue(damage.value / 2); } const fixedDamage = new Utils.IntegerHolder(0); @@ -1930,58 +2330,59 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { isCritical = false; result = HitResult.EFFECTIVE; } + result = result!; // telling TS compiler that result is defined! if (!result) { - if (!typeMultiplier.value) { - result = move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT; + const isOneHitKo = new Utils.BooleanHolder(false); + applyMoveAttrs(OneHitKOAttr, source, this, move, isOneHitKo); + if (isOneHitKo.value) { + result = HitResult.ONE_HIT_KO; + isCritical = false; + damage.value = this.hp; + } else if (typeMultiplier >= 2) { + result = HitResult.SUPER_EFFECTIVE; + } else if (typeMultiplier >= 1) { + result = HitResult.EFFECTIVE; } else { - const oneHitKo = new Utils.BooleanHolder(false); - applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo); - if (oneHitKo.value) { - result = HitResult.ONE_HIT_KO; - isCritical = false; - damage.value = this.hp; - } else if (typeMultiplier.value >= 2) { - result = HitResult.SUPER_EFFECTIVE; - } else if (typeMultiplier.value >= 1) { - result = HitResult.EFFECTIVE; - } else { - result = HitResult.NOT_VERY_EFFECTIVE; - } + result = HitResult.NOT_VERY_EFFECTIVE; } } - if (!fixedDamage.value) { + const isOneHitKo = result === HitResult.ONE_HIT_KO; + + if (!fixedDamage.value && !isOneHitKo) { if (!source.isPlayer()) { this.scene.applyModifiers(EnemyDamageBoosterModifier, false, damage); } if (!this.isPlayer()) { this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage); } + + applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, false, damage); } + // This attribute may modify damage arbitrarily, so be careful about changing its order of application. applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, damage); - console.log("damage", damage.value, move.name, power.value, sourceAtk, targetDef); + console.log("damage", damage.value, move.name, power, sourceAtk, targetDef); // In case of fatal damage, this tag would have gotten cleared before we could lapse it. const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); - const oneHitKo = result === HitResult.ONE_HIT_KO; if (damage.value) { - if (this.getHpRatio() === 1) { - applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, damage); + if (this.isFullHp()) { + applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, false, damage); } else if (!this.isPlayer() && damage.value >= this.hp) { this.scene.applyModifiers(EnemyEndureChanceModifier, false, this); } /** - * We explicitly require to ignore the faint phase here, as we want to show the messages - * about the critical hit and the super effective/not very effective messages before the faint phase. - */ - damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo, true); + * We explicitly require to ignore the faint phase here, as we want to show the messages + * about the critical hit and the super effective/not very effective messages before the faint phase. + */ + damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, isOneHitKo, isOneHitKo, true); this.turnData.damageTaken += damage.value; + if (isCritical) { this.scene.queueMessage(i18next.t("battle:hitResultCriticalHit")); } @@ -1994,14 +2395,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { source.turnData.damageDealt += damage.value; source.turnData.currDamageDealt = damage.value; this.battleData.hitCount++; - const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id }; + const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; this.turnData.attacksReceived.unshift(attackResult); if (source.isPlayer() && !this.isPlayer()) { this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage); } } - if (source.turnData.hitsLeft === 1) { + // want to include is.Fainted() in case multi hit move ends early, still want to render message + if (source.turnData.hitsLeft === 1 || this.isFainted()) { switch (result) { case HitResult.SUPER_EFFECTIVE: this.scene.queueMessage(i18next.t("battle:hitResultSuperEffective")); @@ -2009,49 +2411,47 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { case HitResult.NOT_VERY_EFFECTIVE: this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); break; - case HitResult.NO_EFFECT: - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: this.name })); - break; - case HitResult.IMMUNE: - this.scene.queueMessage(`${this.name} is unaffected!`); - break; case HitResult.ONE_HIT_KO: this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO")); break; + case HitResult.IMMUNE: + case HitResult.NO_EFFECT: + console.error("Unhandled move immunity!"); + break; } } if (this.isFainted()) { - this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), oneHitKo)); + // set splice index here, so future scene queues happen before FaintedPhase + this.scene.setPhaseQueueSplice(); + this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), isOneHitKo)); this.resetSummonData(); } if (damage) { - this.scene.clearPhaseQueueSplice(); - - const attacker = this.scene.getPokemonById(source.id); - destinyTag?.lapse(attacker, BattlerTagLapseType.CUSTOM); + destinyTag?.lapse(source, BattlerTagLapseType.CUSTOM); } } break; case MoveCategory.STATUS: - if (!typeless) { - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier); + if (!cancelled.value && typeMultiplier === 0) { + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); } - if (!cancelled.value) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier); - defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, typeMultiplier)); - } - if (!typeMultiplier.value) { - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: this.name })); - } - result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS; + result = (typeMultiplier === 0) ? HitResult.NO_EFFECT : HitResult.STATUS; break; } return result; } + /** + * Called by damageAndUpdate() + * @param damage integer + * @param ignoreSegments boolean, not currently used + * @param preventEndure used to update damage if endure or sturdy + * @param ignoreFaintPhase flag on wheter to add FaintPhase if pokemon after applying damage faints + * @returns integer representing damage + */ damage(damage: integer, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): integer { if (this.isFainted()) { return 0; @@ -2073,9 +2473,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } damage = Math.min(damage, this.hp); - this.hp = this.hp - damage; if (this.isFainted() && !ignoreFaintPhase) { + /** + * When adding the FaintPhase, want to toggle future unshiftPhase() and queueMessage() calls + * to appear before the FaintPhase (as FaintPhase will potentially end the encounter and add Phases such as + * GameOverPhase, VictoryPhase, etc.. that will interfere with anything else that happens during this MoveEffectPhase) + * + * Once the MoveEffectPhase is over (and calls it's .end() function, shiftPhase() will reset the PhaseQueueSplice via clearPhaseQueueSplice() ) + */ + this.scene.setPhaseQueueSplice(); this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), preventEndure)); this.resetSummonData(); } @@ -2083,6 +2490,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return damage; } + /** + * Called by apply(), given the damage, adds a new DamagePhase and actually updates HP values, etc. + * @param damage integer - passed to damage() + * @param result an enum if it's super effective, not very, etc. + * @param critical boolean if move is a critical hit + * @param ignoreSegments boolean, passed to damage() and not used currently + * @param preventEndure boolean, ignore endure properties of pokemon, passed to damage() + * @param ignoreFaintPhase boolean to ignore adding a FaintPhase, passsed to damage() + * @returns integer of damage done + */ damageAndUpdate(damage: integer, result?: DamageResult, critical: boolean = false, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): integer { const damagePhase = new DamagePhase(this.scene, this.getBattlerIndex(), damage, result as DamageResult, critical); this.scene.unshiftPhase(damagePhase); @@ -2104,7 +2521,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { isMax(): boolean { const maxForms = [SpeciesFormKey.GIGANTAMAX, SpeciesFormKey.GIGANTAMAX_RAPID, SpeciesFormKey.GIGANTAMAX_SINGLE, SpeciesFormKey.ETERNAMAX] as string[]; - return maxForms.includes(this.getFormKey()) || maxForms.includes(this.getFusionFormKey()); + return maxForms.includes(this.getFormKey()) || (!!this.getFusionFormKey() && maxForms.includes(this.getFusionFormKey()!)); + } + + canAddTag(tagType: BattlerTagType): boolean { + if (this.getTag(tagType)) { + return false; + } + + const stubTag = new BattlerTag(tagType, 0, 0); + + const cancelled = new Utils.BooleanHolder(false); + applyPreApplyBattlerTagAbAttrs(BattlerTagImmunityAbAttr, this, stubTag, cancelled, true); + + const userField = this.getAlliedField(); + userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, stubTag, cancelled, true)); + + return !cancelled.value; } addTag(tagType: BattlerTagType, turnCount: integer = 0, sourceMove?: Moves, sourceId?: integer): boolean { @@ -2114,10 +2547,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } - const newTag = getBattlerTag(tagType, turnCount, sourceMove, sourceId); + const newTag = getBattlerTag(tagType, turnCount, sourceMove!, sourceId!); // TODO: are the bangs correct? const cancelled = new Utils.BooleanHolder(false); - applyPreApplyBattlerTagAbAttrs(PreApplyBattlerTagAbAttr, this, newTag, cancelled); + applyPreApplyBattlerTagAbAttrs(BattlerTagImmunityAbAttr, this, newTag, cancelled); + + const userField = this.getAlliedField(); + userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, newTag, cancelled)); if (!cancelled.value && newTag.canAdd(this)) { this.summonData.tags.push(newTag); @@ -2129,13 +2565,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } - getTag(tagType: BattlerTagType | Constructor): BattlerTag { + /** @overload */ + getTag(tagType: BattlerTagType): BattlerTag | null; + + /** @overload */ + getTag(tagType: Constructor): T | null; + + getTag(tagType: BattlerTagType | Constructor): BattlerTag | null { if (!this.summonData) { return null; } - return typeof(tagType) === "string" - ? this.summonData.tags.find(t => t.tagType === tagType) - : this.summonData.tags.find(t => t instanceof tagType); + return (tagType instanceof Function + ? this.summonData.tags.find(t => t instanceof tagType) + : this.summonData.tags.find(t => t.tagType === tagType) + )!; // TODO: is this bang correct? } findTag(tagFilter: ((tag: BattlerTag) => boolean)) { @@ -2145,15 +2588,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.summonData.tags.find(t => tagFilter(t)); } - getTags(tagType: BattlerTagType | Constructor): BattlerTag[] { - if (!this.summonData) { - return []; - } - return typeof(tagType) === "string" - ? this.summonData.tags.filter(t => t.tagType === tagType) - : this.summonData.tags.filter(t => t instanceof tagType); - } - findTags(tagFilter: ((tag: BattlerTag) => boolean)): BattlerTag[] { if (!this.summonData) { return []; @@ -2173,7 +2607,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { lapseTags(lapseType: BattlerTagLapseType): void { const tags = this.summonData.tags; - tags.filter(t => lapseType === BattlerTagLapseType.FAINT || ((t.lapseType === lapseType) && !(t.lapse(this, lapseType))) || (lapseType === BattlerTagLapseType.TURN_END && t.turnCount < 1)).forEach(t => { + tags.filter(t => lapseType === BattlerTagLapseType.FAINT || ((t.lapseTypes.some(lType => lType === lapseType)) && !(t.lapse(this, lapseType)))).forEach(t => { t.onRemove(this); tags.splice(tags.indexOf(t), 1); }); @@ -2183,7 +2617,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const tags = this.summonData.tags; const tag = tags.find(t => t.tagType === tagType); if (tag) { - tag.turnCount = 0; tag.onRemove(this); tags.splice(tags.indexOf(tag), 1); } @@ -2221,25 +2654,53 @@ 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 yawn, and infatuation as those can not be passed via Baton Pass - if (tag.sourceMove === Moves.YAWN || tag.tagType === BattlerTagType.INFATUATED) { + for (const tag of source.summonData.tags) { + 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(); } + /** + * Gets whether the given move is currently disabled for this Pokemon. + * + * @param {Moves} moveId {@linkcode Moves} ID of the move to check + * @returns {boolean} `true` if the move is disabled for this Pokemon, otherwise `false` + * + * @see {@linkcode MoveRestrictionBattlerTag} + */ + isMoveRestricted(moveId: Moves): boolean { + return this.getRestrictingTag(moveId) !== null; + } + + /** + * Gets the {@link MoveRestrictionBattlerTag} that is restricting a move, if it exists. + * + * @param {Moves} moveId {@linkcode Moves} ID of the move to check + * @returns {MoveRestrictionBattlerTag | null} the first tag on this Pokemon that restricts the move, or `null` if the move is not restricted. + */ + getRestrictingTag(moveId: Moves): MoveRestrictionBattlerTag | null { + for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) { + if ((tag as MoveRestrictionBattlerTag).isMoveRestricted(moveId)) { + return tag as MoveRestrictionBattlerTag; + } + } + return null; + } + getMoveHistory(): TurnMove[] { return this.battleSummonData.moveHistory; } @@ -2249,7 +2710,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.getMoveHistory().push(turnMove); } - getLastXMoves(turnCount?: integer): TurnMove[] { + getLastXMoves(turnCount: integer = 0): TurnMove[] { const moveHistory = this.getMoveHistory(); return moveHistory.slice(turnCount >= 0 ? Math.max(moveHistory.length - (turnCount || 1), 0) : 0, moveHistory.length).reverse(); } @@ -2314,7 +2775,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.fusionFaintCry(callback); } - const key = this.getSpeciesForm().getCryKey(this.formIndex); + const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`; //eslint-disable-next-line @typescript-eslint/no-unused-vars let i = 0; let rate = 0.85; @@ -2327,9 +2788,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let frameThreshold: number; sprite.anims.pause(); - tintSprite.anims.pause(); + tintSprite?.anims.pause(); - let faintCryTimer = this.scene.time.addEvent({ + let faintCryTimer : Phaser.Time.TimerEvent | null = this.scene.time.addEvent({ delay: Utils.fixedInt(delay), repeat: -1, callback: () => { @@ -2339,7 +2800,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { while (frameProgress > frameThreshold) { if (sprite.anims.duration) { sprite.anims.nextFrame(); - tintSprite.anims.nextFrame(); + tintSprite?.anims.nextFrame(); } frameProgress -= frameThreshold; } @@ -2347,7 +2808,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { rate *= 0.99; cry.setRate(rate); } else { - faintCryTimer.destroy(); + faintCryTimer?.destroy(); faintCryTimer = null; if (callback) { callback(); @@ -2372,7 +2833,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } private fusionFaintCry(callback: Function): void { - const key = this.getSpeciesForm().getCryKey(this.formIndex); + const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`; let i = 0; let rate = 0.85; const cry = this.scene.playSound(key, { rate: rate }) as AnySound; @@ -2380,7 +2841,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const tintSprite = this.getTintSprite(); let duration = cry.totalDuration * 1000; - let fusionCry = this.scene.playSound(this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex), { rate: rate }) as AnySound; + const fusionCryKey = `cry/${this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex)}`; + let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound; fusionCry.stop(); duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); @@ -2406,9 +2868,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let frameThreshold: number; sprite.anims.pause(); - tintSprite.anims.pause(); + tintSprite?.anims.pause(); - let faintCryTimer = this.scene.time.addEvent({ + let faintCryTimer: Phaser.Time.TimerEvent | null = this.scene.time.addEvent({ delay: Utils.fixedInt(delay), repeat: -1, callback: () => { @@ -2418,13 +2880,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { while (frameProgress > frameThreshold) { if (sprite.anims.duration) { sprite.anims.nextFrame(); - tintSprite.anims.nextFrame(); + tintSprite?.anims.nextFrame(); } frameProgress -= frameThreshold; } if (i === transitionIndex) { SoundFade.fadeOut(this.scene, cry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2))); - fusionCry = this.scene.playSound(this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex), Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); + fusionCry = this.scene.playSound(fusionCryKey, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); SoundFade.fadeIn(this.scene, fusionCry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), this.scene.masterVolume * this.scene.seVolume, 0); } rate *= 0.99; @@ -2435,7 +2897,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { fusionCry.setRate(rate); } if ((!cry || cry.pendingRemove) && (!fusionCry || fusionCry.pendingRemove)) { - faintCryTimer.destroy(); + faintCryTimer?.destroy(); faintCryTimer = null; if (callback) { callback(); @@ -2466,7 +2928,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.gender !== Gender.GENDERLESS && pokemon.gender === (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE); } - canSetStatus(effect: StatusEffect, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon = null): boolean { + canSetStatus(effect: StatusEffect | undefined, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon | null = null): boolean { if (effect !== StatusEffect.FAINT) { if (overrideStatus ? this.status?.effect === effect : this.status) { return false; @@ -2478,6 +2940,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: @@ -2491,7 +2958,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity const cancelImmunity = new Utils.BooleanHolder(false); if (sourcePokemon) { - applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, effect, defType); + applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, false, effect, defType); if (cancelImmunity.value) { return false; } @@ -2517,7 +2984,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } break; case StatusEffect.FREEZE: - if (this.isOfType(Type.ICE) || [WeatherType.SUNNY, WeatherType.HARSH_SUN].includes(this.scene?.arena.weather?.weatherType)) { + if (this.isOfType(Type.ICE) || (this.scene?.arena?.weather?.weatherType &&[WeatherType.SUNNY, WeatherType.HARSH_SUN].includes(this.scene.arena.weather.weatherType))) { return false; } break; @@ -2531,6 +2998,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const cancelled = new Utils.BooleanHolder(false); applyPreSetStatusAbAttrs(StatusEffectImmunityAbAttr, this, effect, cancelled, quiet); + const userField = this.getAlliedField(); + userField.forEach(pokemon => applyPreSetStatusAbAttrs(UserFieldStatusEffectImmunityAbAttr, pokemon, effect, cancelled, quiet)); + if (cancelled.value) { return false; } @@ -2538,7 +3008,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; } - trySetStatus(effect: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon = null, cureTurn: integer = 0, sourceText: string = null): boolean { + trySetStatus(effect: StatusEffect | undefined, asPhase: boolean = false, sourcePokemon: Pokemon | null = null, cureTurn: integer | null = 0, sourceText: string | null = null): boolean { if (!this.canSetStatus(effect, asPhase, false, sourcePokemon)) { return false; } @@ -2560,7 +3030,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (effect === StatusEffect.SLEEP) { statusCureTurn = new Utils.IntegerHolder(this.randSeedIntRange(2, 4)); - applyAbAttrs(ReduceStatusEffectDurationAbAttr, this, null, effect, statusCureTurn); + applyAbAttrs(ReduceStatusEffectDurationAbAttr, this, null, false, effect, statusCureTurn); this.setFrameRate(4); @@ -2580,6 +3050,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + statusCureTurn = statusCureTurn!; // tell TS compiler it's defined + effect = effect!; // If `effect` is undefined then `trySetStatus()` will have already returned early via the `canSetStatus()` call this.status = new Status(effect, 0, statusCureTurn?.value); if (effect !== StatusEffect.FAINT) { @@ -2601,7 +3073,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!revive && lastStatus === StatusEffect.FAINT) { return; } - this.status = undefined; + this.status = null; if (lastStatus === StatusEffect.SLEEP) { this.setFrameRate(12); if (this.getTag(BattlerTagType.NIGHTMARE)) { @@ -2669,16 +3141,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { setFrameRate(frameRate: integer) { this.scene.anims.get(this.getBattleSpriteKey()).frameRate = frameRate; this.getSprite().play(this.getBattleSpriteKey()); - this.getTintSprite().play(this.getBattleSpriteKey()); + this.getTintSprite()?.play(this.getBattleSpriteKey()); } tint(color: number, alpha?: number, duration?: integer, ease?: string) { const tintSprite = this.getTintSprite(); - tintSprite.setTintFill(color); - tintSprite.setVisible(true); + tintSprite?.setTintFill(color); + tintSprite?.setVisible(true); if (duration) { - tintSprite.setAlpha(0); + tintSprite?.setAlpha(0); this.scene.tweens.add({ targets: tintSprite, @@ -2687,7 +3159,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { ease: ease || "Linear" }); } else { - tintSprite.setAlpha(alpha); + tintSprite?.setAlpha(alpha); } } @@ -2701,32 +3173,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { duration: duration, ease: ease || "Linear", onComplete: () => { - tintSprite.setVisible(false); - tintSprite.setAlpha(1); + tintSprite?.setVisible(false); + tintSprite?.setAlpha(1); } }); } else { - tintSprite.setVisible(false); - tintSprite.setAlpha(1); + tintSprite?.setVisible(false); + tintSprite?.setAlpha(1); } } enableMask() { if (!this.maskEnabled) { this.maskSprite = this.getTintSprite(); - this.maskSprite.setVisible(true); - this.maskSprite.setPosition(this.x * this.parentContainer.scale + this.parentContainer.x, + this.maskSprite?.setVisible(true); + this.maskSprite?.setPosition(this.x * this.parentContainer.scale + this.parentContainer.x, this.y * this.parentContainer.scale + this.parentContainer.y); - this.maskSprite.setScale(this.getSpriteScale() * this.parentContainer.scale); + this.maskSprite?.setScale(this.getSpriteScale() * this.parentContainer.scale); this.maskEnabled = true; } } disableMask() { if (this.maskEnabled) { - this.maskSprite.setVisible(false); - this.maskSprite.setPosition(0, 0); - this.maskSprite.setScale(this.getSpriteScale()); + this.maskSprite?.setVisible(false); + this.maskSprite?.setPosition(0, 0); + this.maskSprite?.setScale(this.getSpriteScale()); this.maskSprite = null; this.maskEnabled = false; } @@ -2735,13 +3207,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { sparkle(): void { if (this.shinySparkle) { this.shinySparkle.play(`sparkle${this.variant ? `_${this.variant + 1}` : ""}`); - this.scene.playSound("sparkle"); + this.scene.playSound("se/sparkle"); } } updateFusionPalette(ignoreOveride?: boolean): void { if (!this.getFusionSpeciesForm(ignoreOveride)) { - [ this.getSprite(), this.getTintSprite() ].map(s => { + [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => { s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = []; s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = []; }); @@ -2777,9 +3249,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const frame = [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ][c]; canv.width = frame.width; canv.height = frame.height; - context.drawImage([ sourceImage, sourceBackImage, fusionImage, fusionBackImage ][c], frame.cutX, frame.cutY, frame.width, frame.height, 0, 0, frame.width, frame.height); - const imageData = context.getImageData(frame.cutX, frame.cutY, frame.width, frame.height); - pixelData.push(imageData.data); + + if (context) { + context.drawImage([ sourceImage, sourceBackImage, fusionImage, fusionBackImage ][c], frame.cutX, frame.cutY, frame.width, frame.height, 0, 0, frame.width, frame.height); + const imageData = context.getImageData(frame.cutX, frame.cutY, frame.width, frame.height); + pixelData.push(imageData.data); + } }); for (let f = 0; f < 2; f++) { @@ -2799,7 +3274,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const color = Utils.rgbaToInt([r, g, b, a]); if (variantColorSet.has(color)) { const mappedPixel = variantColorSet.get(color); - [ r, g, b, a ] = mappedPixel; + if (mappedPixel) { + [ r, g, b, a ] = mappedPixel; + } } } if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { @@ -2811,7 +3288,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const fusionSpriteColors = JSON.parse(JSON.stringify(spriteColors)); - const pixelColors = []; + const pixelColors: number[] = []; for (let f = 0; f < 2; f++) { for (let i = 0; i < pixelData[f].length; i += 4) { const total = pixelData[f].slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); @@ -2822,7 +3299,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - const fusionPixelColors = []; + const fusionPixelColors : number[] = []; for (let f = 0; f < 2; f++) { const variantColors = variantColorCache[!f ? fusionSpriteKey : fusionBackSpriteKey]; const variantColorSet = new Map(); @@ -2841,7 +3318,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const color = Utils.rgbaToInt([r, g, b, a]); if (variantColorSet.has(color)) { const mappedPixel = variantColorSet.get(color); - [ r, g, b, a ] = mappedPixel; + if (mappedPixel) { + [ r, g, b, a ] = mappedPixel; + } } } fusionPixelColors.push(argbFromRgba({ r, g, b, a })); @@ -2861,9 +3340,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { Math.random = originalRandom; + paletteColors = paletteColors!; // tell TS compiler that paletteColors is defined! + fusionPaletteColors = fusionPaletteColors!; // TS compiler that fusionPaletteColors is defined! const [ palette, fusionPalette ] = [ paletteColors, fusionPaletteColors ] .map(paletteColors => { - let keys = Array.from(paletteColors.keys()).sort((a: integer, b: integer) => paletteColors.get(a) < paletteColors.get(b) ? 1 : -1); + let keys = Array.from(paletteColors.keys()).sort((a: integer, b: integer) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); let rgbaColors: Map; let hsvColors: Map; @@ -2876,19 +3357,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { map.set(k, Object.values(rgbaFromArgb(k))); return map; }, new Map()); hsvColors = Array.from(rgbaColors.keys()).reduce((map: Map, k: number) => { - const rgb = rgbaColors.get(k).slice(0, 3); + const rgb = rgbaColors.get(k)!.slice(0, 3); map.set(k, Utils.rgbToHsv(rgb[0], rgb[1], rgb[2])); return map; }, new Map()); for (let c = keys.length - 1; c >= 0; c--) { - const hsv = hsvColors.get(keys[c]); + const hsv = hsvColors.get(keys[c])!; for (let c2 = 0; c2 < c; c2++) { - const hsv2 = hsvColors.get(keys[c2]); + const hsv2 = hsvColors.get(keys[c2])!; const diff = Math.abs(hsv[0] - hsv2[0]); if (diff < 30 || diff >= 330) { if (mappedColors.has(keys[c])) { - mappedColors.get(keys[c]).push(keys[c2]); + mappedColors.get(keys[c])!.push(keys[c2]); } else { mappedColors.set(keys[c], [ keys[c2] ]); } @@ -2898,10 +3379,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } mappedColors.forEach((values: integer[], key: integer) => { - const keyColor = rgbaColors.get(key); - const valueColors = values.map(v => rgbaColors.get(v)); + const keyColor = rgbaColors.get(key)!; + const valueColors = values.map(v => rgbaColors.get(v)!); const color = keyColor.slice(0); - let count = paletteColors.get(key); + let count = paletteColors.get(key)!; for (const value of values) { const valueCount = paletteColors.get(value); if (!valueCount) { @@ -2911,10 +3392,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } for (let c = 0; c < 3; c++) { - color[c] *= (paletteColors.get(key) / count); + color[c] *= (paletteColors.get(key)! / count); values.forEach((value: integer, i: integer) => { if (paletteColors.has(value)) { - const valueCount = paletteColors.get(value); + const valueCount = paletteColors.get(value)!; color[c] += valueColors[i][c] * (valueCount / count); } }); @@ -2932,7 +3413,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { paletteColors.set(argbFromRgba({ r: color[0], g: color[1], b: color[2], a: color[3] }), count); }); - keys = Array.from(paletteColors.keys()).sort((a: integer, b: integer) => paletteColors.get(a) < paletteColors.get(b) ? 1 : -1); + keys = Array.from(paletteColors.keys()).sort((a: integer, b: integer) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); } while (mappedColors.size); return keys.map(c => Object.values(rgbaFromArgb(c))); @@ -2963,7 +3444,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - [ this.getSprite(), this.getTintSprite() ].map(s => { + [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => { s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = spriteColors; s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = fusionSpriteColors; }); @@ -2972,16 +3453,55 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { fusionCanvas.remove(); } + /** + * Generates a random number using the current battle's seed, or the global seed if `this.scene.currentBattle` is falsy + * + * This calls either {@linkcode BattleScene.randBattleSeedInt}({@linkcode range}, {@linkcode min}) in `src/battle-scene.ts` + * which calls {@linkcode Battle.randSeedInt}(`scene`, {@linkcode range}, {@linkcode min}) in `src/battle.ts` + * which calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts`, + * or it directly calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts` if there is no current battle + * + * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} + * @param min The minimum integer to pick, default `0` + * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) + */ randSeedInt(range: integer, min: integer = 0): integer { return this.scene.currentBattle ? this.scene.randBattleSeedInt(range, min) : Utils.randSeedInt(range, min); } + /** + * Generates a random number using the current battle's seed, or the global seed if `this.scene.currentBattle` is falsy + * @param min The minimum integer to generate + * @param max The maximum integer to generate + * @returns a random integer between {@linkcode min} and {@linkcode max} inclusive + */ randSeedIntRange(min: integer, max: integer): integer { return this.randSeedInt((max - min) + 1, min); } + /** + * Causes a Pokemon to leave the field (such as in preparation for a switch out/escape). + * @param clearEffects Indicates if effects should be cleared (true) or passed + * to the next pokemon, such as during a baton pass (false) + * @param hideInfo Indicates if this should also play the animation to hide the Pokemon's + * info container. + */ + leaveField(clearEffects: boolean = true, hideInfo: boolean = true) { + this.resetTurnData(); + if (clearEffects) { + this.resetSummonData(); + this.resetBattleData(); + } + if (hideInfo) { + this.hideInfo(); + } + this.setVisible(false); + this.scene.field.remove(this); + this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true); + } + destroy(): void { this.battleInfo?.destroy(); super.destroy(); @@ -2990,6 +3510,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getBattleInfo(): BattleInfo { return this.battleInfo; } + + /** + * Checks whether or not the Pokemon's root form has the same ability + * @param abilityIndex the given ability index we are checking + * @returns true if the abilities are the same + */ + hasSameAbilityInRootForm(abilityIndex: number): boolean { + const currentAbilityIndex = this.abilityIndex; + const rootForm = getPokemonSpecies(this.species.getRootSpeciesId()); + return rootForm.getAbility(abilityIndex) === rootForm.getAbility(currentAbilityIndex); + } } export default interface Pokemon { @@ -2998,8 +3529,9 @@ 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) { + 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); if (Overrides.STATUS_OVERRIDE) { @@ -3013,11 +3545,15 @@ export class PlayerPokemon extends Pokemon { this.variant = Overrides.VARIANT_OVERRIDE; } } - if (!dataSource) { - this.generateAndPopulateMoveset(); + if (this.scene.gameMode.isDaily) { + this.generateAndPopulateMoveset(); + } else { + this.moveset = []; + } } this.generateCompatibleTms(); + this.usedTms = []; } initBattleInfo(): void { @@ -3082,36 +3618,32 @@ export class PlayerPokemon extends Pokemon { return true; } - switchOut(batonPass: boolean, removeFromField: boolean = false): Promise { + /** + * Causes this mon to leave the field (via {@linkcode leaveField}) and then + * opens the party switcher UI to switch a new mon in + * @param batonPass Indicates if this switch was caused by a baton pass (and + * thus should maintain active mon effects) + */ + switchOut(batonPass: boolean): Promise { return new Promise(resolve => { - this.resetTurnData(); - if (!batonPass) { - this.resetSummonData(); - } - this.hideInfo(); - this.setVisible(false); + this.leaveField(!batonPass); this.scene.ui.setMode(Mode.PARTY, PartyUiMode.FAINT_SWITCH, this.getFieldIndex(), (slotIndex: integer, option: PartyOption) => { if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, this.getFieldIndex(), slotIndex, false, batonPass)); + this.scene.prependToPhase(new SwitchSummonPhase(this.scene, this.getFieldIndex(), slotIndex, false, batonPass), MoveEndPhase); } - if (removeFromField) { - this.setVisible(false); - this.scene.field.remove(this); - this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true); - } - this.scene.ui.setMode(Mode.MESSAGE).then(() => resolve()); + this.scene.ui.setMode(Mode.MESSAGE).then(resolve); }, PartyUiHandler.FilterNonFainted); }); } addFriendship(friendship: integer): void { const starterSpeciesId = this.species.getRootSpeciesId(); - const fusionStarterSpeciesId = this.isFusion() ? this.fusionSpecies.getRootSpeciesId() : 0; + const fusionStarterSpeciesId = this.isFusion() && this.fusionSpecies ? this.fusionSpecies.getRootSpeciesId() : 0; const starterData = [ this.scene.gameData.starterData[starterSpeciesId], fusionStarterSpeciesId ? this.scene.gameData.starterData[fusionStarterSpeciesId] : null - ].filter(d => d); + ].filter(d => !!d); const amount = new Utils.IntegerHolder(friendship); const starterAmount = new Utils.IntegerHolder(Math.floor(friendship * (this.scene.gameMode.isClassic && friendship > 0 ? 2 : 1) / (fusionStarterSpeciesId ? 2 : 1))); if (amount.value > 0) { @@ -3153,8 +3685,8 @@ export class PlayerPokemon extends Pokemon { pokemon.resetTurnData(); pokemon.resetStatus(); - pokemon.heal(Math.min(Math.max(Math.ceil(Math.floor(0.5 * pokemon.getMaxHp())), 1), pokemon.getMaxHp())); - this.scene.queueMessage(`${pokemon.name} was revived!`,0,true); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + this.scene.queueMessage(i18next.t("moveTriggers:revivalBlessing", {pokemonName: pokemon.name}), 0, true); if (this.scene.currentBattle.double && this.scene.getParty().length > 1) { const allyPokemon = this.getAlly(); @@ -3175,7 +3707,10 @@ export class PlayerPokemon extends Pokemon { }); } - getPossibleEvolution(evolution: SpeciesFormEvolution): Promise { + getPossibleEvolution(evolution: SpeciesFormEvolution | null): Promise { + if (!evolution) { + return new Promise(resolve => resolve(this)); + } return new Promise(resolve => { const evolutionSpecies = getPokemonSpecies(evolution.speciesId); const isFusion = evolution instanceof FusionSpeciesFormEvolution; @@ -3196,9 +3731,13 @@ export class PlayerPokemon extends Pokemon { }); } - evolve(evolution: SpeciesFormEvolution): Promise { + evolve(evolution: SpeciesFormEvolution | null, preEvolution: PokemonSpeciesForm): Promise { + if (!evolution) { + return new Promise(resolve => resolve()); + } return new Promise(resolve => { this.pauseEvolutions = false; + // Handles Nincada evolving into Ninjask + Shedinja this.handleSpecialEvolutions(evolution); const isFusion = evolution instanceof FusionSpeciesFormEvolution; if (!isFusion) { @@ -3207,7 +3746,7 @@ export class PlayerPokemon extends Pokemon { this.fusionSpecies = getPokemonSpecies(evolution.speciesId); } if (evolution.preFormKey !== null) { - const formIndex = Math.max((!isFusion ? this.species : this.fusionSpecies).forms.findIndex(f => f.formKey === evolution.evoFormKey), 0); + const formIndex = Math.max((!isFusion || !this.fusionSpecies ? this.species : this.fusionSpecies).forms.findIndex(f => f.formKey === evolution.evoFormKey), 0); if (!isFusion) { this.formIndex = formIndex; } else { @@ -3217,13 +3756,28 @@ export class PlayerPokemon extends Pokemon { this.generateName(); if (!isFusion) { const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) { // Shouldn't happen - this.abilityIndex = abilityCount - 1; + const preEvoAbilityCount = preEvolution.getAbilityCount(); + if ([0, 1, 2].includes(this.abilityIndex)) { + // Handles cases where a Pokemon with 3 abilities evolves into a Pokemon with 2 abilities (ie: Eevee -> any Eeveelution) + if (this.abilityIndex === 2 && preEvoAbilityCount === 3 && abilityCount === 2) { + this.abilityIndex = 1; + } + } else { // Prevent pokemon with an illegal ability value from breaking things + console.warn("this.abilityIndex is somehow an illegal value, please report this"); + console.warn(this.abilityIndex); + this.abilityIndex = 0; } - } else { + } else { // Do the same as above, but for fusions const abilityCount = this.getFusionSpeciesForm().getAbilityCount(); - if (this.fusionAbilityIndex >= abilityCount) {// Shouldn't happen - this.fusionAbilityIndex = abilityCount - 1; + const preEvoAbilityCount = preEvolution.getAbilityCount(); + if ([0, 1, 2].includes(this.fusionAbilityIndex)) { + if (this.fusionAbilityIndex === 2 && preEvoAbilityCount === 3 && abilityCount === 2) { + this.fusionAbilityIndex = 1; + } + } else { + console.warn("this.fusionAbilityIndex is somehow an illegal value, please report this"); + console.warn(this.fusionAbilityIndex); + this.fusionAbilityIndex = 0; } } this.compatibleTms.splice(0, this.compatibleTms.length); @@ -3248,16 +3802,19 @@ export class PlayerPokemon extends Pokemon { const isFusion = evolution instanceof FusionSpeciesFormEvolution; const evoSpecies = (!isFusion ? this.species : this.fusionSpecies); - if (evoSpecies.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) { + if (evoSpecies?.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) { const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1]; - if (newEvolution.condition.predicate(this)) { + if (newEvolution.condition?.predicate(this)) { const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, undefined, this.shiny, this.variant, this.ivs, this.nature); newPokemon.natureOverride = this.natureOverride; newPokemon.passive = this.passive; newPokemon.moveset = this.moveset.slice(); newPokemon.moveset = this.copyMoveset(); 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; @@ -3267,9 +3824,9 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionLuck = this.fusionLuck; this.scene.getParty().push(newPokemon); - newPokemon.evolve(!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)); + newPokemon.evolve((!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)), evoSpecies); const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === this.id, true) as PokemonHeldItemModifier[]; + && m.pokemonId === this.id, true) as PokemonHeldItemModifier[]; modifiers.forEach(m => { const clonedModifier = m.clone() as PokemonHeldItemModifier; clonedModifier.pokemonId = newPokemon.id; @@ -3337,16 +3894,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 @@ -3362,7 +3920,7 @@ export class PlayerPokemon extends Pokemon { partyMemberIndex--; } const fusedPartyMemberHeldModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; const transferModifiers: Promise[] = []; for (const modifier of fusedPartyMemberHeldModifiers) { transferModifiers.push(this.scene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true)); @@ -3372,7 +3930,7 @@ export class PlayerPokemon extends Pokemon { this.scene.removePartyMemberModifiers(fusedPartyMemberIndex); this.scene.getParty().splice(fusedPartyMemberIndex, 1)[0]; const newPartyMemberIndex = this.scene.getParty().indexOf(this); - pokemon.getMoveset(true).map(m => this.scene.unshiftPhase(new LearnMovePhase(this.scene, newPartyMemberIndex, m.getMove().id))); + pokemon.getMoveset(true).map(m => this.scene.unshiftPhase(new LearnMovePhase(this.scene, newPartyMemberIndex, m!.getMove().id))); // TODO: is the bang correct? pokemon.destroy(); this.updateFusionPalette(); resolve(); @@ -3392,9 +3950,9 @@ export class PlayerPokemon extends Pokemon { /** Returns a deep copy of this Pokemon's moveset array */ copyMoveset(): PokemonMove[] { - const newMoveset = []; + const newMoveset : PokemonMove[] = []; this.moveset.forEach(move => - newMoveset.push(new PokemonMove(move.moveId, 0, move.ppUp, move.virtual))); + newMoveset.push(new PokemonMove(move!.moveId, 0, move!.ppUp, move!.virtual))); // TODO: are those bangs correct? return newMoveset; } @@ -3408,9 +3966,9 @@ export class EnemyPokemon extends Pokemon { /** To indicate of the instance was populated with a dataSource -> e.g. loaded & populated from session data */ public readonly isPopulatedFromDataSource: boolean; - constructor(scene: BattleScene, species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean, dataSource: PokemonData) { + constructor(scene: BattleScene, species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean, dataSource?: PokemonData) { super(scene, 236, 84, species, level, dataSource?.abilityIndex, dataSource?.formIndex, - dataSource?.gender, dataSource ? dataSource.shiny : false, dataSource ? dataSource.variant : undefined, null, dataSource ? dataSource.nature : undefined, dataSource); + dataSource?.gender, dataSource ? dataSource.shiny : false, dataSource ? dataSource.variant : undefined, undefined, dataSource ? dataSource.nature : undefined, dataSource); this.trainerSlot = trainerSlot; this.isPopulatedFromDataSource = !!dataSource; // if a dataSource is provided, then it was populated from dataSource @@ -3422,6 +3980,18 @@ export class EnemyPokemon extends Pokemon { this.status = new Status(Overrides.OPP_STATUS_OVERRIDE); } + if (Overrides.OPP_GENDER_OVERRIDE) { + this.gender = Overrides.OPP_GENDER_OVERRIDE; + } + + const speciesId = this.species.speciesId; + + if (speciesId in Overrides.OPP_FORM_OVERRIDES + && Overrides.OPP_FORM_OVERRIDES[speciesId] + && this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]]) { + this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId] ?? 0; + } + if (!dataSource) { this.generateAndPopulateMoveset(); @@ -3443,7 +4013,7 @@ export class EnemyPokemon extends Pokemon { let speciesId = species.speciesId; while ((prevolution = pokemonPrevolutions[speciesId])) { const evolution = pokemonEvolutions[prevolution].find(pe => pe.speciesId === speciesId && (!pe.evoFormKey || pe.evoFormKey === this.getFormKey())); - if (evolution.condition?.enforceFunc) { + if (evolution?.condition?.enforceFunc) { evolution.condition.enforceFunc(this); } speciesId = prevolution; @@ -3501,9 +4071,12 @@ export class EnemyPokemon extends Pokemon { : [ new PokemonMove(Moves.ETERNABEAM), new PokemonMove(Moves.SLUDGE_BOMB), - new PokemonMove(Moves.DRAGON_DANCE), + 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(); @@ -3511,9 +4084,15 @@ export class EnemyPokemon extends Pokemon { } } + /** + * Determines the move this Pokemon will use on the next turn, as well as + * the Pokemon the move will target. + * @returns this Pokemon's next move in the format {move, moveTargets} + */ getNextMove(): QueuedMove { + // If this Pokemon has a move already queued, return it. const queuedMove = this.getMoveQueue().length - ? this.getMoveset().find(m => m.moveId === this.getMoveQueue()[0].move) + ? this.getMoveset().find(m => m?.moveId === this.getMoveQueue()[0].move) : null; if (queuedMove) { if (queuedMove.isUsable(this, this.getMoveQueue()[0].ignorePP)) { @@ -3524,28 +4103,37 @@ export class EnemyPokemon extends Pokemon { } } - const movePool = this.getMoveset().filter(m => m.isUsable(this)); + // Filter out any moves this Pokemon cannot use + const movePool = this.getMoveset().filter(m => m?.isUsable(this)); + // If no moves are left, use Struggle. Otherwise, continue with move selection if (movePool.length) { + // If there's only 1 move in the move pool, use it. if (movePool.length === 1) { - return { move: movePool[0].moveId, targets: this.getNextTargets(movePool[0].moveId) }; + return { move: movePool[0]!.moveId, targets: this.getNextTargets(movePool[0]!.moveId) }; // TODO: are the bangs correct? } + // If a move is forced because of Encore, use it. const encoreTag = this.getTag(EncoreTag) as EncoreTag; if (encoreTag) { - const encoreMove = movePool.find(m => m.moveId === encoreTag.moveId); + const encoreMove = movePool.find(m => m?.moveId === encoreTag.moveId); if (encoreMove) { return { move: encoreMove.moveId, targets: this.getNextTargets(encoreMove.moveId) }; } } switch (this.aiType) { - case AiType.RANDOM: - const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)].moveId; + case AiType.RANDOM: // No enemy should spawn with this AI type in-game + const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)]!.moveId; // TODO: is the bang correct? return { move: moveId, targets: this.getNextTargets(moveId) }; case AiType.SMART_RANDOM: case AiType.SMART: + /** + * Move selection is based on the move's calculated "benefit score" against the + * best possible target(s) (as determined by {@linkcode getNextTargets}). + * For more information on how benefit scores are calculated, see `docs/enemy-ai.md`. + */ const moveScores = movePool.map(() => 0); - const moveTargets = Object.fromEntries(movePool.map(m => [ m.moveId, this.getNextTargets(m.moveId) ])); + const moveTargets = Object.fromEntries(movePool.map(m => [ m!.moveId, this.getNextTargets(m!.moveId) ])); // TODO: are those bangs correct? for (const m in movePool) { - const pokemonMove = movePool[m]; + const pokemonMove = movePool[m]!; // TODO: is the bang correct? const move = pokemonMove.getMove(); let moveScore = moveScores[m]; @@ -3558,15 +4146,27 @@ export class EnemyPokemon extends Pokemon { } const target = this.scene.getField()[mt]; + /** + * The "target score" of a move is given by the move's user benefit score + the move's target benefit score. + * If the target is an ally, the target benefit score is multiplied by -1. + */ let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); if (Number.isNaN(targetScore)) { console.error(`Move ${move.name} returned score of NaN`); targetScore = 0; } + /** + * If this move is unimplemented, or the move is known to fail when used, set its + * target score to -20 + */ if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id)) { targetScore = -20; } else if (move instanceof AttackMove) { - const effectiveness = target.getAttackMoveEffectiveness(this, pokemonMove); + /** + * Attack moves are given extra multipliers to their base benefit score based on + * the move's type effectiveness against the target and whether the move is a STAB move. + */ + const effectiveness = target.getMoveEffectiveness(this, move, !target.battleData?.abilityRevealed); if (target.isPlayer() !== this.isPlayer()) { targetScore *= effectiveness; if (this.isOfType(move.type)) { @@ -3578,13 +4178,14 @@ export class EnemyPokemon extends Pokemon { targetScore /= 1.5; } } + /** If a move has a base benefit score of 0, its benefit score is assumed to be unimplemented at this point */ if (!targetScore) { targetScore = -20; } } targetScores.push(targetScore); } - + // When a move has multiple targets, its score is equal to the maximum target score across all targets moveScore += Math.max(...targetScores); // could make smarter by checking opponent def/spdef @@ -3593,6 +4194,7 @@ export class EnemyPokemon extends Pokemon { console.log(moveScores); + // Sort the move pool in decreasing order of move score const sortedMovePool = movePool.slice(0); sortedMovePool.sort((a, b) => { const scoreA = moveScores[movePool.indexOf(a)]; @@ -3601,32 +4203,44 @@ export class EnemyPokemon extends Pokemon { }); let r = 0; if (this.aiType === AiType.SMART_RANDOM) { + // Has a 5/8 chance to select the best move, and a 3/8 chance to advance to the next best move (and repeat this roll) while (r < sortedMovePool.length - 1 && this.scene.randBattleSeedInt(8) >= 5) { r++; } } else if (this.aiType === AiType.SMART) { + // The chance to advance to the next best move increases when the compared moves' scores are closer to each other. while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0 && this.scene.randBattleSeedInt(100) < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) { r++; } } - console.log(movePool.map(m => m.getName()), moveScores, r, sortedMovePool.map(m => m.getName())); - return { move: sortedMovePool[r].moveId, targets: moveTargets[sortedMovePool[r].moveId] }; + console.log(movePool.map(m => m!.getName()), moveScores, r, sortedMovePool.map(m => m!.getName())); // TODO: are those bangs correct? + return { move: sortedMovePool[r]!.moveId, targets: moveTargets[sortedMovePool[r]!.moveId] }; } } return { move: Moves.STRUGGLE, targets: this.getNextTargets(Moves.STRUGGLE) }; } + /** + * Determines the Pokemon the given move would target if used by this Pokemon + * @param moveId {@linkcode Moves} The move to be used + * @returns The indexes of the Pokemon the given move would target + */ getNextTargets(moveId: Moves): BattlerIndex[] { const moveTargets = getMoveTargets(this, moveId); const targets = this.scene.getField(true).filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1); + // If the move is multi-target, return all targets' indexes if (moveTargets.multiple) { return targets.map(p => p.getBattlerIndex()); } const move = allMoves[moveId]; + /** + * Get the move's target benefit score against each potential target. + * For allies, this score is multiplied by -1. + */ const benefitScores = targets .map(p => [ p.getBattlerIndex(), move.getTargetBenefitScore(this, p, move) * (p.isPlayer() === this.isPlayer() ? 1 : -1) ]); @@ -3650,19 +4264,21 @@ export class EnemyPokemon extends Pokemon { let targetWeights = sortedBenefitScores.map(s => s[1]); const lowestWeight = targetWeights[targetWeights.length - 1]; + // If the lowest target weight (i.e. benefit score) is negative, add abs(lowestWeight) to all target weights if (lowestWeight < 1) { for (let w = 0; w < targetWeights.length; w++) { targetWeights[w] += Math.abs(lowestWeight - 1); } } + // Remove any targets whose weights are less than half the max of the target weights from consideration const benefitCutoffIndex = targetWeights.findIndex(s => s < targetWeights[0] / 2); if (benefitCutoffIndex > -1) { targetWeights = targetWeights.slice(0, benefitCutoffIndex); } const thresholds: integer[] = []; - let totalWeight: integer; + let totalWeight: integer = 0; targetWeights.reduce((total: integer, w: integer) => { total += w; thresholds.push(total); @@ -3670,8 +4286,13 @@ export class EnemyPokemon extends Pokemon { return total; }, 0); + /** + * Generate a random number from 0 to (totalWeight-1), + * then select the first target whose cumulative weight (with all previous targets' weights) + * is greater than that random number. + */ const randValue = this.scene.randBattleSeedInt(totalWeight); - let targetIndex: integer; + let targetIndex: integer = 0; thresholds.every((t, i) => { if (randValue >= t) { @@ -3733,7 +4354,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; @@ -3776,43 +4397,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--; } } @@ -3847,12 +4465,13 @@ export class EnemyPokemon extends Pokemon { addToParty(pokeballType: PokeballType) { const party = this.scene.getParty(); - let ret: PlayerPokemon = null; + let ret: PlayerPokemon | null = null; if (party.length < 6) { this.pokeball = pokeballType; this.metLevel = this.level; this.metBiome = this.scene.arena.biomeType; + this.metSpecies = this.species.speciesId; const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); party.push(newPokemon); ret = newPokemon; @@ -3868,7 +4487,7 @@ export interface TurnMove { targets?: BattlerIndex[]; result: MoveResult; virtual?: boolean; - turn?: integer; + turn?: number; } export interface QueuedMove { @@ -3880,33 +4499,33 @@ 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 ]; + /** [Atk, Def, SpAtk, SpDef, Spd, Acc, Eva] */ + public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ]; public moveQueue: QueuedMove[] = []; - public disabledMove: Moves = Moves.NONE; - public disabledTurns: integer = 0; public tags: BattlerTag[] = []; public abilitySuppressed: boolean = false; public abilitiesApplied: Abilities[] = []; - public speciesForm: PokemonSpeciesForm; + public speciesForm: PokemonSpeciesForm | null; public fusionSpeciesForm: PokemonSpeciesForm; public ability: Abilities = Abilities.NONE; public gender: Gender; public fusionGender: Gender; - public stats: integer[]; - public moveset: PokemonMove[]; + 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[] = null; + public types: Type[] = []; } export class PokemonBattleData { - public hitCount: integer = 0; + public hitCount: number = 0; public endured: boolean = false; public berriesEaten: BerryType[] = []; public abilitiesApplied: Abilities[] = []; @@ -3915,20 +4534,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 { @@ -3967,7 +4589,7 @@ export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | Hit * It links to {@linkcode Move} class via the move ID. * Compared to {@linkcode Move}, this class also tracks if a move has received. * PP Ups, amount of PP used, and things like that. - * @see {@linkcode isUsable} - checks if move is disabled, out of PP, or not implemented. + * @see {@linkcode isUsable} - checks if move is restricted, out of PP, or not implemented. * @see {@linkcode getMove} - returns {@linkcode Move} object by looking it up via ID. * @see {@linkcode usePp} - removes a point of PP from the move. * @see {@linkcode getMovePp} - returns amount of PP a move currently has. @@ -3987,11 +4609,25 @@ export class PokemonMove { this.virtual = !!virtual; } - isUsable(pokemon: Pokemon, ignorePp?: boolean): boolean { - if (this.moveId && pokemon.summonData?.disabledMove === this.moveId) { + /** + * Checks whether the move can be selected or performed by a Pokemon, without consideration for the move's targets. + * The move is unusable if it is out of PP, restricted by an effect, or unimplemented. + * + * @param {Pokemon} pokemon {@linkcode Pokemon} that would be using this move + * @param {boolean} ignorePp If `true`, skips the PP check + * @param {boolean} ignoreRestrictionTags If `true`, skips the check for move restriction tags (see {@link MoveRestrictionBattlerTag}) + * @returns `true` if the move can be selected and used by the Pokemon, otherwise `false`. + */ + isUsable(pokemon: Pokemon, ignorePp?: boolean, ignoreRestrictionTags?: boolean): boolean { + if (this.moveId && !ignoreRestrictionTags && pokemon.isMoveRestricted(this.moveId)) { return false; } - return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1) && !this.getMove().name.endsWith(" (N)"); + + if (this.getMove().name.endsWith(" (N)")) { + return false; + } + + return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1); } getMove(): Move { @@ -4007,7 +4643,7 @@ export class PokemonMove { } getMovePp(): integer { - return this.getMove().pp + this.ppUp * Math.max(Math.floor(this.getMove().pp / 5), 1); + return this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5); } getPpRatio(): number { diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 3e78afeae83..02827d0d69d 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -75,7 +75,7 @@ export default class Trainer extends Phaser.GameObjects.Container { console.log(Object.keys(trainerPartyTemplates)[Object.values(trainerPartyTemplates).indexOf(this.getPartyTemplate())]); const getSprite = (hasShadow?: boolean, forceFemale?: boolean) => { - const ret = this.scene.addFieldSprite(0, 0, this.config.getSpriteKey(variant === TrainerVariant.FEMALE || forceFemale,this.isDouble())); + const ret = this.scene.addFieldSprite(0, 0, this.config.getSpriteKey(variant === TrainerVariant.FEMALE || forceFemale, this.isDouble())); ret.setOrigin(0.5, 1); ret.setPipeline(this.scene.spritePipeline, {tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow}); return ret; @@ -106,7 +106,7 @@ export default class Trainer extends Phaser.GameObjects.Container { } getKey(forceFemale?: boolean): string { - return this.config.getSpriteKey(this.variant === TrainerVariant.FEMALE || forceFemale,this.isDouble()); + return this.config.getSpriteKey(this.variant === TrainerVariant.FEMALE || forceFemale, this.isDouble()); } /** @@ -121,8 +121,8 @@ export default class Trainer extends Phaser.GameObjects.Container { // Determine the title to include based on the configuration and includeTitle flag. let title = includeTitle && this.config.title ? this.config.title : null; - - if (this.name === "" && name.toLowerCase().includes("grunt")) { + const evilTeamTitles = ["grunt"]; + if (this.name === "" && evilTeamTitles.some(t => name.toLocaleLowerCase().includes(t))) { // This is a evil team grunt so we localize it by only using the "name" as the title title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`); console.log("Localized grunt name: " + title); @@ -165,6 +165,8 @@ export default class Trainer extends Phaser.GameObjects.Container { name = i18next.t(`trainerNames:${this.config.nameDouble.toLowerCase().replace(/\s/g, "_")}`); } + console.log(title ? `${title} ${name}` : name); + // Return the formatted name, including the title if it is set. return title ? `${title} ${name}` : name; } @@ -206,7 +208,7 @@ export default class Trainer extends Phaser.GameObjects.Container { } getPartyLevels(waveIndex: integer): integer[] { - const ret = []; + const ret: number[] = []; const partyTemplate = this.getPartyTemplate(); const difficultyWaveIndex = this.scene.gameMode.getWaveForDifficulty(waveIndex); @@ -255,7 +257,7 @@ export default class Trainer extends Phaser.GameObjects.Container { genPartyMember(index: integer): EnemyPokemon { const battle = this.scene.currentBattle; - const level = battle.enemyLevels[index]; + const level = battle.enemyLevels?.[index]!; // TODO: is this bang correct? let ret: EnemyPokemon; @@ -288,7 +290,7 @@ export default class Trainer extends Phaser.GameObjects.Container { } // Create an empty species pool (which will be set to one of the species pools based on the index) - let newSpeciesPool = []; + let newSpeciesPool: Species[] = []; let useNewSpeciesPool = false; // If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer) @@ -313,7 +315,7 @@ export default class Trainer extends Phaser.GameObjects.Container { return !species.some(s => AlreadyUsedSpecies.includes(s)); } return !AlreadyUsedSpecies.includes(species); - }); + }).flat(); // Filter out the species that are already in the enemy party from the partner trainer species pool const speciesPoolPartnerFiltered = speciesPoolPartner.filter(species => { @@ -322,7 +324,7 @@ export default class Trainer extends Phaser.GameObjects.Container { return !species.some(s => AlreadyUsedSpecies.includes(s)); } return !AlreadyUsedSpecies.includes(species); - }); + }).flat(); // If the index is even, use the species pool for the main trainer (that way he only uses his own pokemon in battle) @@ -357,18 +359,18 @@ export default class Trainer extends Phaser.GameObjects.Container { let species = useNewSpeciesPool ? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)]) : template.isSameSpecies(index) && index > offset - ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset))) + ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex)) : this.genNewPartyMemberSpecies(level, strength); // If the species is from newSpeciesPool, we need to adjust it based on the level and strength if (newSpeciesPool) { - species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength)); + species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength, this.scene.currentBattle.waveIndex)); } ret = this.scene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); }, this.config.hasStaticParty ? this.config.getDerivedType() + ((index + 1) << 8) : this.scene.currentBattle.waveIndex + (this.config.getDerivedType() << 10) + (((!this.config.useSameSeedForAllMembers ? index : 0) + 1) << 8)); - return ret; + return ret!; // TODO: is this bang correct? } @@ -391,7 +393,7 @@ export default class Trainer extends Phaser.GameObjects.Container { species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); } - let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); + let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex)); let retry = false; console.log(ret.getName()); @@ -410,7 +412,7 @@ export default class Trainer extends Phaser.GameObjects.Container { console.log("Attempting reroll of species evolution to fit specialty type..."); let evoAttempt = 0; while (retry && evoAttempt++ < 10) { - ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); + ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex)); console.log(ret.name); if (this.config.specialtyTypes.find(t => ret.isOfType(t))) { retry = false; @@ -479,7 +481,7 @@ export default class Trainer extends Phaser.GameObjects.Container { if (maxScorePartyMemberIndexes.length > 1) { let rand: integer; this.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(maxScorePartyMemberIndexes.length), this.scene.currentBattle.turn << 2); - return maxScorePartyMemberIndexes[rand]; + return maxScorePartyMemberIndexes[rand!]; } return maxScorePartyMemberIndexes[0]; @@ -497,6 +499,9 @@ export default class Trainer extends Phaser.GameObjects.Container { return 0.45; case PartyMemberStrength.STRONGER: return 0.375; + default: + console.warn("getPartyMemberModifierChanceMultiplier not defined. Using default 0"); + return 0; } } diff --git a/src/game-mode.ts b/src/game-mode.ts index 0a472e223e3..f5dadad6f1b 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -4,10 +4,11 @@ import BattleScene from "./battle-scene"; import { allChallenges, applyChallenges, Challenge, ChallengeType, copyChallenge } from "./data/challenge"; import PokemonSpecies, { allSpecies } from "./data/pokemon-species"; import { Arena } from "./field/arena"; -import * as Overrides from "./overrides"; +import Overrides from "#app/overrides"; import * as Utils from "./utils"; import { Biome } from "#enums/biome"; import { Species } from "#enums/species"; +import { Challenges } from "./enums/challenges"; export enum GameModes { CLASSIC, @@ -55,6 +56,23 @@ export class GameMode implements GameModeConfig { this.battleConfig = battleConfig || {}; } + /** + * Helper function to see if a GameMode has a specific challenge type + * @param challenge the Challenges it looks for + * @returns true if the game mode has that challenge + */ + hasChallenge(challenge: Challenges): boolean { + return this.challenges.some(c => c.id === challenge && c.value !== 0); + } + + /** + * Helper function to see if the game mode is using fresh start + * @returns true if a fresh start challenge is being applied + */ + isFreshStartChallenge(): boolean { + return this.hasChallenge(Challenges.FRESH_START); + } + /** * @returns either: * - override from overrides.ts @@ -107,22 +125,37 @@ export class GameMode implements GameModeConfig { } } + /** + * Determines whether or not to generate a trainer + * @param waveIndex the current floor the player is on (trainer sprites fail to generate on X1 floors) + * @param arena the arena that contains the scene and functions + * @returns true if a trainer should be generated, false otherwise + */ isWaveTrainer(waveIndex: integer, arena: Arena): boolean { + /** + * Daily spawns trainers on floors 5, 15, 20, 25, 30, 35, 40, and 45 + */ if (this.isDaily) { return waveIndex % 10 === 5 || (!(waveIndex % 10) && waveIndex > 10 && !this.isWaveFinal(waveIndex)); } if ((waveIndex % 30) === (arena.scene.offsetGym ? 0 : 20) && !this.isWaveFinal(waveIndex)) { return true; } else if (waveIndex % 10 !== 1 && waveIndex % 10) { + /** + * Do not check X1 floors since there's a bug that stops trainer sprites from appearing + * after a X0 full party heal + */ + const trainerChance = arena.getTrainerChance(); let allowTrainerBattle = true; if (trainerChance) { const waveBase = Math.floor(waveIndex / 10) * 10; + // Stop generic trainers from spawning in within 3 waves of a trainer battle for (let w = Math.max(waveIndex - 3, waveBase + 2); w <= Math.min(waveIndex + 3, waveBase + 9); w++) { if (w === waveIndex) { continue; } - if ((w % 30) === (arena.scene.offsetGym ? 0 : 20) || this.isFixedBattle(waveIndex)) { + if ((w % 30) === (arena.scene.offsetGym ? 0 : 20) || this.isFixedBattle(w)) { allowTrainerBattle = false; break; } else if (w < waveIndex) { @@ -138,7 +171,7 @@ export class GameMode implements GameModeConfig { } } } - return allowTrainerBattle && trainerChance && !Utils.randSeedInt(trainerChance); + return Boolean(allowTrainerBattle && trainerChance && !Utils.randSeedInt(trainerChance)); } return false; } @@ -152,7 +185,7 @@ export class GameMode implements GameModeConfig { } } - getOverrideSpecies(waveIndex: integer): PokemonSpecies { + getOverrideSpecies(waveIndex: integer): PokemonSpecies | null { if (this.isDaily && this.isWaveFinal(waveIndex)) { const allFinalBossSpecies = allSpecies.filter(s => (s.subLegendary || s.legendary || s.mythical) && s.baseTotal >= 600 && s.speciesId !== Species.ETERNATUS && s.speciesId !== Species.ARCEUS); @@ -195,7 +228,7 @@ export class GameMode implements GameModeConfig { * @returns true if waveIndex is a multiple of 50 in Endless */ isEndlessBoss(waveIndex: integer): boolean { - return waveIndex % 50 && + return !!(waveIndex % 50) && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); } @@ -252,6 +285,8 @@ export class GameMode implements GameModeConfig { return 5000; case GameModes.DAILY: return 2500; + default: + return 0; } } diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index 834ca233942..bb3cfcbeb3b 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -16,11 +16,12 @@ import { getIconForLatestInput, swap, } from "#app/configs/inputs/configHandler"; import BattleScene from "./battle-scene"; -import {SettingGamepad} from "#app/system/settings/settings-gamepad.js"; +import {SettingGamepad} from "#app/system/settings/settings-gamepad"; import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; import TouchControl from "#app/touch-controls"; import { Button } from "#enums/buttons"; import { Device } from "#enums/devices"; +import MoveTouchControlsHandler from "./ui/settings/move-touch-controls-handler"; export interface DeviceMapping { [key: string]: number; @@ -50,21 +51,6 @@ export interface InterfaceConfig { const repeatInputDelayMillis = 250; -// Phaser.Input.Gamepad.GamepadPlugin#refreshPads -declare module "phaser" { - namespace Input { - namespace Gamepad { - interface GamepadPlugin { - /** - * Refreshes the list of connected Gamepads. - * This is called automatically when a gamepad is connected or disconnected, and during the update loop. - */ - refreshPads(): void; - } - } - } -} - /** * Manages and handles all input controls for the game, including keyboard and gamepad interactions. * @@ -105,6 +91,7 @@ export class InputsController { public lastSource: string = "keyboard"; private inputInterval: NodeJS.Timeout[] = new Array(); private touchControls: TouchControl; + public moveTouchControlsHandler: MoveTouchControlsHandler; /** * Initializes a new instance of the game control system, setting up initial state and configurations. @@ -154,7 +141,7 @@ export class InputsController { }); if (typeof this.scene.input.gamepad !== "undefined") { - this.scene.input.gamepad.on("connected", function (thisGamepad) { + this.scene.input.gamepad?.on("connected", function (thisGamepad) { if (!thisGamepad) { return; } @@ -163,25 +150,26 @@ export class InputsController { this.onReconnect(thisGamepad); }, this); - this.scene.input.gamepad.on("disconnected", function (thisGamepad) { + this.scene.input.gamepad?.on("disconnected", function (thisGamepad) { this.onDisconnect(thisGamepad); // when a gamepad is disconnected }, this); // Check to see if the gamepad has already been setup by the browser - this.scene.input.gamepad.refreshPads(); - if (this.scene.input.gamepad.total) { + this.scene.input.gamepad?.refreshPads(); + if (this.scene.input.gamepad?.total) { this.refreshGamepads(); for (const thisGamepad of this.gamepads) { this.scene.input.gamepad.emit("connected", thisGamepad); } } - this.scene.input.gamepad.on("down", this.gamepadButtonDown, this); - this.scene.input.gamepad.on("up", this.gamepadButtonUp, this); - this.scene.input.keyboard.on("keydown", this.keyboardKeyDown, this); - this.scene.input.keyboard.on("keyup", this.keyboardKeyUp, this); + this.scene.input.gamepad?.on("down", this.gamepadButtonDown, this); + this.scene.input.gamepad?.on("up", this.gamepadButtonUp, this); + this.scene.input.keyboard?.on("keydown", this.keyboardKeyDown, this); + this.scene.input.keyboard?.on("keyup", this.keyboardKeyUp, this); } this.touchControls = new TouchControl(this.scene); + this.moveTouchControlsHandler = new MoveTouchControlsHandler(this.touchControls); } /** @@ -338,9 +326,9 @@ export class InputsController { */ refreshGamepads(): void { // Sometimes, gamepads are undefined. For some reason. - this.gamepads = this.scene.input.gamepad.gamepads.filter(function (el) { + this.gamepads = this.scene.input.gamepad?.gamepads.filter(function (el) { return el !== null; - }); + }) ?? []; for (const [index, thisGamepad] of this.gamepads.entries()) { thisGamepad.index = index; // Overwrite the gamepad index, in case we had undefined gamepads earlier 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 0a6648a9c57..0fe756ec9a0 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -24,10 +24,12 @@ import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; export class LoadingScene extends SceneBase { + public static readonly KEY = "loading"; + readonly LOAD_EVENTS = Phaser.Loader.Events; constructor() { - super("loading"); + super(LoadingScene.KEY); Phaser.Plugins.PluginCache.register("Loader", CacheBustedLoaderPlugin, "load"); initI18n(); @@ -39,7 +41,6 @@ export class LoadingScene extends SceneBase { this.loadImage("loading_bg", "arenas"); this.loadImage("logo", ""); - this.loadImage("pride-update", "events"); // Load menu images this.loadAtlas("bg", "ui"); @@ -77,7 +78,9 @@ 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"); this.loadImage("achv_bar", "ui"); this.loadImage("achv_bar_2", "ui"); @@ -90,10 +93,14 @@ export class LoadingScene extends SceneBase { this.loadImage("shiny_star_small", "ui", "shiny_small.png"); this.loadImage("shiny_star_small_1", "ui", "shiny_small_1.png"); this.loadImage("shiny_star_small_2", "ui", "shiny_small_2.png"); + this.loadImage("favorite", "ui", "favorite.png"); + this.loadImage("passive_bg", "ui", "passive_bg.png"); this.loadAtlas("shiny_icons", "ui"); this.loadImage("ha_capsule", "ui", "ha_capsule.png"); this.loadImage("champion_ribbon", "ui", "champion_ribbon.png"); this.loadImage("icon_spliced", "ui"); + 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"); @@ -144,6 +151,9 @@ export class LoadingScene extends SceneBase { this.loadImage(`summary_tabs_${t}`, "ui"); } + this.loadImage("scroll_bar", "ui"); + this.loadImage("scroll_bar_handle", "ui"); + this.loadImage("starter_container_bg", "ui"); this.loadImage("starter_select_bg", "ui"); this.loadImage("select_cursor", "ui"); this.loadImage("select_cursor_highlight", "ui"); @@ -153,6 +163,9 @@ export class LoadingScene extends SceneBase { this.loadImage("select_gen_cursor_highlight", "ui"); this.loadImage("saving_icon", "ui"); + this.loadImage("discord", "ui"); + this.loadImage("google", "ui"); + this.loadImage("settings_icon", "ui"); this.loadImage("default_bg", "arenas"); // Load arena images @@ -235,7 +248,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", ""); @@ -256,6 +274,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"); @@ -271,8 +290,9 @@ export class LoadingScene extends SceneBase { this.loadAtlas("xbox", "inputs"); this.loadAtlas("keyboard", "inputs"); - this.loadSe("select"); - this.loadSe("menu_open"); + this.loadSe("select", "ui"); + this.loadSe("menu_open", "ui"); + this.loadSe("error", "ui"); this.loadSe("hit"); this.loadSe("hit_strong"); this.loadSe("hit_weak"); @@ -292,7 +312,6 @@ export class LoadingScene extends SceneBase { this.loadSe("upgrade"); this.loadSe("buy"); this.loadSe("achv"); - this.loadSe("error"); this.loadSe("pb_rel"); this.loadSe("pb_throw"); @@ -331,8 +350,8 @@ export class LoadingScene extends SceneBase { this.loadLoadingScreen(); - initVouchers(); initAchievements(); + initVouchers(); initStatsKeys(); initPokemonPrevolutions(); initBiomes(); @@ -427,7 +446,7 @@ export class LoadingScene extends SceneBase { } const intro = this.add.video(0, 0); - intro.on(Phaser.GameObjects.Events.VIDEO_COMPLETE, (video: Phaser.GameObjects.Video) => { + intro.once(Phaser.GameObjects.Events.VIDEO_COMPLETE, (video: Phaser.GameObjects.Video) => { this.tweens.add({ targets: intro, duration: 500, @@ -444,13 +463,13 @@ export class LoadingScene extends SceneBase { // videos do not need to be preloaded intro.loadURL("images/intro_dark.mp4", true); if (mobile) { - intro.video.setAttribute("webkit-playsinline", "webkit-playsinline"); - intro.video.setAttribute("playsinline", "playsinline"); + intro.video?.setAttribute("webkit-playsinline", "webkit-playsinline"); + intro.video?.setAttribute("playsinline", "playsinline"); } intro.play(); }); - this.load.on(this.LOAD_EVENTS.PROGRESS , (progress: number) => { + this.load.on(this.LOAD_EVENTS.PROGRESS, (progress: number) => { percentText.setText(`${Math.floor(progress * 100)}%`); progressBar.clear(); progressBar.fillStyle(0xffffff, 0.8); @@ -475,7 +494,10 @@ export class LoadingScene extends SceneBase { } }); - this.load.on(this.LOAD_EVENTS.COMPLETE, () => loadingGraphics.forEach(go => go.destroy())); + this.load.on(this.LOAD_EVENTS.COMPLETE, () => { + loadingGraphics.forEach(go => go.destroy()); + intro.destroy(); + }); } get gameHeight() { @@ -487,6 +509,17 @@ export class LoadingScene extends SceneBase { } async create() { + this.events.once(Phaser.Scenes.Events.DESTROY, () => this.handleDestroy()); this.scene.start("battle"); } + + handleDestroy() { + console.debug(`Destroying ${LoadingScene.KEY} scene`); + this.load.off(this.LOAD_EVENTS.PROGRESS); + this.load.off(this.LOAD_EVENTS.FILE_COMPLETE); + this.load.off(this.LOAD_EVENTS.COMPLETE); + // this.textures.remove("loading_bg"); is removed in BattleScene.launchBattle() + this.children.removeAll(true); + console.debug(`Destroyed ${LoadingScene.KEY} scene`); + } } diff --git a/src/locales/ca_ES/ability-trigger.json b/src/locales/ca_ES/ability-trigger.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/ability-trigger.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/ability.json b/src/locales/ca_ES/ability.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/ability.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/achv.json b/src/locales/ca_ES/achv.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/achv.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/arena-flyout.json b/src/locales/ca_ES/arena-flyout.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/arena-flyout.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/arena-tag.json b/src/locales/ca_ES/arena-tag.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/arena-tag.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/battle-info.json b/src/locales/ca_ES/battle-info.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/battle-info.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/battle-message-ui-handler.json b/src/locales/ca_ES/battle-message-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/battle-message-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/battle-scene.json b/src/locales/ca_ES/battle-scene.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/battle-scene.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/battle.json b/src/locales/ca_ES/battle.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/battle.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/battler-tags.json b/src/locales/ca_ES/battler-tags.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/battler-tags.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/berry.json b/src/locales/ca_ES/berry.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/berry.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/bgm-name.json b/src/locales/ca_ES/bgm-name.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/bgm-name.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/biome.json b/src/locales/ca_ES/biome.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/biome.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/challenges.json b/src/locales/ca_ES/challenges.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/challenges.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/command-ui-handler.json b/src/locales/ca_ES/command-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/command-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/common.json b/src/locales/ca_ES/common.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/common.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/config.ts b/src/locales/ca_ES/config.ts new file mode 100644 index 00000000000..4d8f6c9dc59 --- /dev/null +++ b/src/locales/ca_ES/config.ts @@ -0,0 +1,113 @@ +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; + +export const caEsConfig = { + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory, +}; diff --git a/src/locales/ca_ES/dialogue-double-battle.json b/src/locales/ca_ES/dialogue-double-battle.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/dialogue-double-battle.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/dialogue-final-boss.json b/src/locales/ca_ES/dialogue-final-boss.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/dialogue-final-boss.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/dialogue-misc.json b/src/locales/ca_ES/dialogue-misc.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/dialogue-misc.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/dialogue.json b/src/locales/ca_ES/dialogue.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/dialogue.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/egg.json b/src/locales/ca_ES/egg.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/egg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/fight-ui-handler.json b/src/locales/ca_ES/fight-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/fight-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/filter-bar.json b/src/locales/ca_ES/filter-bar.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/filter-bar.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/game-mode.json b/src/locales/ca_ES/game-mode.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/game-mode.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/game-stats-ui-handler.json b/src/locales/ca_ES/game-stats-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/game-stats-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/growth.json b/src/locales/ca_ES/growth.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/growth.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/menu-ui-handler.json b/src/locales/ca_ES/menu-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/menu-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/menu.json b/src/locales/ca_ES/menu.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/menu.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/modifier-select-ui-handler.json b/src/locales/ca_ES/modifier-select-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/modifier-select-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/modifier-type.json b/src/locales/ca_ES/modifier-type.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/modifier-type.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/modifier.json b/src/locales/ca_ES/modifier.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/modifier.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/move-trigger.json b/src/locales/ca_ES/move-trigger.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/move-trigger.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/move.json b/src/locales/ca_ES/move.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/move.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/nature.json b/src/locales/ca_ES/nature.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/nature.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/party-ui-handler.json b/src/locales/ca_ES/party-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/party-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/pokeball.json b/src/locales/ca_ES/pokeball.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/pokeball.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/pokemon-form-battle.json b/src/locales/ca_ES/pokemon-form-battle.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/pokemon-form-battle.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/pokemon-form.json b/src/locales/ca_ES/pokemon-form.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/pokemon-form.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/pokemon-info-container.json b/src/locales/ca_ES/pokemon-info-container.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/pokemon-info-container.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/pokemon-info.json b/src/locales/ca_ES/pokemon-info.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/pokemon-info.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/pokemon-summary.json b/src/locales/ca_ES/pokemon-summary.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/pokemon-summary.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/pokemon.json b/src/locales/ca_ES/pokemon.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/pokemon.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/run-history.json b/src/locales/ca_ES/run-history.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/run-history.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/save-slot-select-ui-handler.json b/src/locales/ca_ES/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/save-slot-select-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/settings.json b/src/locales/ca_ES/settings.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/splash-messages.json b/src/locales/ca_ES/splash-messages.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/splash-messages.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/starter-select-ui-handler.json b/src/locales/ca_ES/starter-select-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/starter-select-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/status-effect.json b/src/locales/ca_ES/status-effect.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/status-effect.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/terrain.json b/src/locales/ca_ES/terrain.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/terrain.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/trainer-classes.json b/src/locales/ca_ES/trainer-classes.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/trainer-classes.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/trainer-names.json b/src/locales/ca_ES/trainer-names.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/trainer-names.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/trainer-titles.json b/src/locales/ca_ES/trainer-titles.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/trainer-titles.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/tutorial.json b/src/locales/ca_ES/tutorial.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/tutorial.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/voucher.json b/src/locales/ca_ES/voucher.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/voucher.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/ca_ES/weather.json b/src/locales/ca_ES/weather.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/ca_ES/weather.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/de/ability-trigger.json b/src/locales/de/ability-trigger.json new file mode 100644 index 00000000000..379692c45ae --- /dev/null +++ b/src/locales/de/ability-trigger.json @@ -0,0 +1,64 @@ +{ + "blockRecoilDamage": "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!", + "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", + "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} wehrt Schaden mit {{abilityName}} ab!", + "perishBody": "Durch {{abilityName}} von {{pokemonName}} werden beide Pokémon nach drei Runden K.O. gehen!", + "poisonHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", + "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", + "windPowerCharged": "Der Treffer durch {{moveName}} läd die Stärke von {{pokemonName}} auf!", + "quickDraw": "Durch Schnellschuss kann {{pokemonName}} schneller handeln als sonst!", + "blockItemTheft": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert Item-Diebstahl!", + "typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!", + "disguiseAvoidedDamage": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!", + "fullHpResistType": "Der Panzer von {{pokemonNameWithAffix}} funkelt und verzerrt die Wechselwirkungen zwischen den Typen!", + "moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...", + "reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!", + "postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!", + "postDefendContactDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} tauscht Fähigkeiten mit dem Ziel!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} gibt seinem Ziel {{abilityName}}!", + "postDefendMoveDisable": "{{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} nimmt den Typ {{moveType}} an!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} stiehlt {{stolenItemType}} von {{defenderName}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} stiehlt {{stolenItemType}} von {{attackerName}}!", + "copyFaintedAllyAbility": "Die Fähigkeit {{abilityName}} von {{pokemonNameWithAffix}} wurde übernommen!", + "intimidateImmunity": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert den Effekt von Bedroher!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} trinkt den von {{pokemonName}} zubereiteten Tee!", + "postSummonClearAllyStats": "Die Statusveränderungen von {{pokemonNameWithAffix}} wurden aufgehoben!", + "postSummonTransform": "{{pokemonNameWithAffix}} verwandelt sich in {{targetName}}!", + "protectStat": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert das der Statuswert {{statName}} gesenkt wird!", + "statusEffectImmunityWithName": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert {{statusEffectName}}!", + "statusEffectImmunity": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert Statusprobleme", + "battlerTagImmunity": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert {{battlerTagName}}!", + "forewarn": "Vorwarnung von {{pokemonNameWithAffix}}: Konzentraion auf {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} hat die Fähigkeit {{opponentAbilityName}} von {{opponentName}} erschnüffelt!", + "postWeatherLapseHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} wurde durch {{abilityName}} verletzt!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} hat {{berryName}} geerntet!", + "postTurnHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", + "fetchBall": "{{pokemonNameWithAffix}} hat einen {{pokeballName}} gefunden!", + "healFromBerryUse": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", + "arenaTrap": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert den Tausch!", + "postBattleLoot": "{{pokemonNameWithAffix}} hebt {{itemName}} auf!", + "postFaintContactDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!", + "postFaintHpDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!", + "postSummonPressure": "{{pokemonNameWithAffix}} setzt Gegner mit Erzwinger unter Druck!", + "weatherEffectDisappeared": "Jegliche wetterbedingten Effekte wurden aufgehoben!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} gelingt es, gegnerische Fähigkeiten zu überbrücken!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} erschaudert!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} strahlt eine lodernde Aura aus!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} strahlt eine knisternde Aura aus!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} strahlt eine dunkle Aura aus!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} strahlt eine Feenaura aus!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}} kehrt die Wirkung aller Aura-Fähigkeiten um!", + "postSummonNeutralizingGas": "Reaktionsgas von {{pokemonNameWithAffix}} hat sich in der Umgebung ausgebreitet!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", + "postSummonVesselOfRuin": "Unheilsgefäß von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", + "postSummonSwordOfRuin": "Unheilsschwert von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", + "postSummonTabletsOfRuin": "Unheilstafeln von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", + "postSummonBeadsOfRuin": "Unheilsjuwelen von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", + "preventBerryUse": "{{pokemonNameWithAffix}} kriegt vor Anspannung keine Beeren mehr runter!" +} diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts deleted file mode 100644 index 4e69db20231..00000000000 --- a/src/locales/de/ability-trigger.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!", - "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", - "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", - "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!", - "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", - "windPowerCharged": "Der Treffer durch {{moveName}} läd die Stärke von {{pokemonName}} auf!", - "quickDraw": "Durch Schnellschuss kann {{pokemonName}} schneller handeln als sonst!", -} as const; diff --git a/src/locales/de/ability.json b/src/locales/de/ability.json new file mode 100644 index 00000000000..84f30fac755 --- /dev/null +++ b/src/locales/de/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "Duftnote", + "description": "Lässt das Ziel beim Angriff eventuell durch Gestank zurückschrecken." + }, + "drizzle": { + "name": "Niesel", + "description": "Ruft bei Kampfantritt Regen herbei." + }, + "speedBoost": { + "name": "Temposchub", + "description": "Erhöht in jeder Runde die Initiative." + }, + "battleArmor": { + "name": "Kampfpanzer", + "description": "Wehrt gegnerische Volltreffer mit einem harten Panzer ab." + }, + "sturdy": { + "name": "Robustheit", + "description": "Bietet Schutz gegen K.O.-Attacken. Bei vollen KP übersteht das Pokémon auch K.O.-Treffer." + }, + "damp": { + "name": "Feuchtigkeit", + "description": "Befeuchtet die Umgebung und verhindert so den Einsatz von Attacken wie Finale, die Explosionen auslösen." + }, + "limber": { + "name": "Flexibilität", + "description": "Der flexible Körper des Pokémon schützt es vor Paralyse." + }, + "sandVeil": { + "name": "Sandschleier", + "description": "Erhöht in Sandstürmen den Ausweichwert." + }, + "static": { + "name": "Statik", + "description": "Kann bei Berührung durch statisch aufgeladenen Körper paralysieren." + }, + "voltAbsorb": { + "name": "Voltabsorber", + "description": "Treffer durch Elektro-Attacken verursachen keinen Schaden, sondern regenerieren stattdessen KP." + }, + "waterAbsorb": { + "name": "H2OAbsorber", + "description": "Treffer durch Wasser-Attacken verursachen keinen Schaden, sondern regenerieren stattdessen KP." + }, + "oblivious": { + "name": "Dösigkeit", + "description": "Das Pokémon ist so apathisch, dass es nicht betört oder provoziert werden kann." + }, + "cloudNine": { + "name": "Wolke Sieben", + "description": "Hebt alle Wetter-Effekte auf." + }, + "compoundEyes": { + "name": "Facettenauge", + "description": "Erhöht die Genauigkeit von Attacken." + }, + "insomnia": { + "name": "Insomnia", + "description": "Verhindert Einschlafen." + }, + "colorChange": { + "name": "Farbwechsel", + "description": "Ändert seinen Typ zu dem der Attacke des Angreifers." + }, + "immunity": { + "name": "Immunität", + "description": "Das starke Immunsystem des Pokémon verhindert Vergiftungen." + }, + "flashFire": { + "name": "Feuerfänger", + "description": "Verstärkt Feuer-Attacken, wenn es von Feuer-Attacken getroffen wird." + }, + "shieldDust": { + "name": "Puderabwehr", + "description": "Blockiert durch Puder die Zusatzeffekte gegnerischer Angriffe." + }, + "ownTempo": { + "name": "Tempomacher", + "description": "Das Pokémon lässt sich nicht aus der Ruhe bringen und verhindert so Verwirrung." + }, + "suctionCups": { + "name": "Saugnapf", + "description": "Blockt Attacken und Items, die Pokémon austauschen, indem es sich mit einem Saugnapf am Boden verankert." + }, + "intimidate": { + "name": "Bedroher", + "description": "Senkt den Angriff der Gegner, indem es sie gleich zu Kampfantritt bedroht und einschüchtert." + }, + "shadowTag": { + "name": "Wegsperre", + "description": "Hindert Gegner an der Flucht beziehungsweise am Auswechseln, indem es ihnen den Weg versperrt." + }, + "roughSkin": { + "name": "Rauhaut", + "description": "Angreifer werden durch die raue Haut des Pokémon bei direkten Attacken verletzt." + }, + "wonderGuard": { + "name": "Wunderwache", + "description": "Wundersame Kräfte bewirken, dass nur sehr effektive Treffer bei ihm Schaden anrichten." + }, + "levitate": { + "name": "Schwebe", + "description": "Verleiht volle Immunität gegen alle Boden-Attacken durch Schwebezustand." + }, + "effectSpore": { + "name": "Sporenwirt", + "description": "Wird dieses Pokémon durch eine direkte Attacke angegriffen, kann das beim Gegner Paralyse, Vergiftung oder Schlaf auslösen." + }, + "synchronize": { + "name": "Synchro", + "description": "Erleidet das Pokémon Verbrennungen, Vergiftungen oder Paralyse, ereilt das jeweilige Statusproblem auch den Verursacher." + }, + "clearBody": { + "name": "Neutraltorso", + "description": "Verhindert das Senken der Statuswerte durch Attacken und Fähigkeiten von Angreifern." + }, + "naturalCure": { + "name": "Innere Kraft", + "description": "Wird das Pokémon ausgewechselt, werden seine Statusprobleme geheilt." + }, + "lightningRod": { + "name": "Blitzfänger", + "description": "Zieht Elektro-Attacken an. Statt durch diese Schaden zu nehmen, erhöht es den eigenen Spezial-Angriff." + }, + "sereneGrace": { + "name": "Edelmut", + "description": "Erhöht die Wahrscheinlichkeit, dass Zusatzeffekte von Attacken auftreten." + }, + "swiftSwim": { + "name": "Wassertempo", + "description": "Erhöht bei Regen die Initiative." + }, + "chlorophyll": { + "name": "Chlorophyll", + "description": "Erhöht bei Sonnenschein die Initiative." + }, + "illuminate": { + "name": "Erleuchtung", + "description": "Erhellt die Umgebung und erhöht dadurch die Wahrscheinlichkeit, wilden Pokémon zu begegnen." + }, + "trace": { + "name": "Erfassen", + "description": "Kopiert bei Kampfantritt die Fähigkeit eines Gegners." + }, + "hugePower": { + "name": "Kraftkoloss", + "description": "Verdoppelt die Stärke von physischen Attacken." + }, + "poisonPoint": { + "name": "Giftdorn", + "description": "Vergiftet den Angreifer bei Berührung eventuell." + }, + "innerFocus": { + "name": "Konzentrator", + "description": "Verhindert durch erhöhte Konzentrationsfähigkeit Zurückschrecken." + }, + "magmaArmor": { + "name": "Magmapanzer", + "description": "Dank eines Panzers aus Magma kann dieses Pokémon nicht eingefroren werden." + }, + "waterVeil": { + "name": "Aquahülle", + "description": "Verhindert durch eine Hülle aus Wasser Verbrennungen." + }, + "magnetPull": { + "name": "Magnetfalle", + "description": "Hindert Stahl-Pokémon durch Magnetismus an der Flucht." + }, + "soundproof": { + "name": "Lärmschutz", + "description": "Bietet durch Schalldämmung volle Immunität gegen alle Lärm-Attacken." + }, + "rainDish": { + "name": "Regengenuss", + "description": "Regeneriert bei Regen nach und nach KP." + }, + "sandStream": { + "name": "Sandsturm", + "description": "Erzeugt bei Kampfantritt Sandstürme." + }, + "pressure": { + "name": "Erzwinger", + "description": "Zwingt Gegner dazu, beim Einsatz von Attacken mehr AP zu verbrauchen." + }, + "thickFat": { + "name": "Speckschicht", + "description": "Das Pokémon wird von einer dicken Fettschicht geschützt, was den durch Feuer- und Eis-Attacken erlittenen Schaden halbiert." + }, + "earlyBird": { + "name": "Frühwecker", + "description": "Wenn es eingeschlafen ist, kann es doppelt so schnell wieder aufwachen wie andere Pokémon." + }, + "flameBody": { + "name": "Flammkörper", + "description": "Fügt dem Angreifer bei Berührung eventuell Verbrennungen zu." + }, + "runAway": { + "name": "Angsthase", + "description": "Die Flucht vor wilden Pokémon gelingt immer." + }, + "keenEye": { + "name": "Adlerauge", + "description": "Sein scharfer Blick hindert Angreifer daran, seine Genauigkeit zu senken." + }, + "hyperCutter": { + "name": "Scherenmacht", + "description": "Hindert Angreifer durch mächtige Scheren daran, den Angriffs-Wert zu senken." + }, + "pickup": { + "name": "Mitnahme", + "description": "Hebt gelegentlich von Gegnern benutzte Items auf. Dies geschieht nicht nur während Kämpfen, sondern auch unterwegs." + }, + "truant": { + "name": "Schnarchnase", + "description": "Das Pokémon muss nach Einsatz einer Attacke eine Runde lang aussetzen." + }, + "hustle": { + "name": "Übereifer", + "description": "Erhöht den Angriffs-Wert, aber senkt die Genauigkeit." + }, + "cuteCharm": { + "name": "Charmebolzen", + "description": "Wird dieses Pokémon durch eine direkte Attacke angegriffen, verliebt sich der Gegner eventuell in es." + }, + "plus": { + "name": "Plus", + "description": "Erhöht den Spezial-Angriff, wenn das Pokémon einen Mitstreiter mit der Fähigkeit Plus oder Minus hat." + }, + "minus": { + "name": "Minus", + "description": "Erhöht den Spezial-Angriff, wenn das Pokémon einen Mitstreiter mit der Fähigkeit Plus oder Minus hat." + }, + "forecast": { + "name": "Prognose", + "description": "Nimmt je nach Wetter entweder den Typ Wasser, Feuer oder Eis an." + }, + "stickyHold": { + "name": "Klebekörper", + "description": "Trägt es ein Item, bleibt dieses an seinem klebrigen Körper haften, wodurch Item-Diebstahl verhindert wird." + }, + "shedSkin": { + "name": "Expidermis", + "description": "Das Pokémon befreit sich eventuell von Statusproblemen, indem es seine Haut abstreift." + }, + "guts": { + "name": "Adrenalin", + "description": "Bei Statusproblemen setzt es Adrenalin frei und erhöht so seinen Angriffs-Wert." + }, + "marvelScale": { + "name": "Notschutz", + "description": "Bei Statusproblemen schützt es sich mit mysteriösen Schuppen und erhöht so seine Verteidigung." + }, + "liquidOoze": { + "name": "Kloakensoße", + "description": "Angreifer, die durch Saug-Attacken Kloakensoße in sich aufgenommen haben, nehmen durch deren widerwärtigen Gestank Schaden." + }, + "overgrow": { + "name": "Notdünger", + "description": "Erhöht die Stärke von Pflanzen-Attacken, wenn die KP auf einen gewissen Wert fallen." + }, + "blaze": { + "name": "Großbrand", + "description": "Erhöht die Stärke von Feuer-Attacken, wenn die KP auf einen gewissen Wert fallen." + }, + "torrent": { + "name": "Sturzbach", + "description": "Erhöht die Stärke von Wasser-Attacken, wenn die KP auf einen gewissen Wert fallen." + }, + "swarm": { + "name": "Hexaplaga", + "description": "Erhöht die Stärke von Käfer-Attacken, wenn die KP auf einen gewissen Wert fallen." + }, + "rockHead": { + "name": "Steinhaupt", + "description": "Verhindert Schaden, der durch Rückstoß entstehen würde." + }, + "drought": { + "name": "Dürre", + "description": "Erzeugt bei Kampfantritt gleißendes Sonnenlicht." + }, + "arenaTrap": { + "name": "Ausweglos", + "description": "Hindert Gegner im Kampf an der Flucht." + }, + "vitalSpirit": { + "name": "Munterkeit", + "description": "Das Pokémon ist so munter, dass es nicht einschlafen kann." + }, + "whiteSmoke": { + "name": "Pulverrauch", + "description": "Indem es sich mit pulvrigem Rauch umhüllt, hindert es Angreifer daran, seine Statuswerte zu senken." + }, + "purePower": { + "name": "Mentalkraft", + "description": "Verdoppelt mit reiner Willenskraft die Stärke seiner physischen Attacken." + }, + "shellArmor": { + "name": "Panzerhaut", + "description": "Wehrt gegnerische Volltreffer mit einem harten Panzer ab." + }, + "airLock": { + "name": "Klimaschutz", + "description": "Hebt alle Wetter-Effekte auf." + }, + "tangledFeet": { + "name": "Fußangel", + "description": "Erhöht den Ausweichwert, wenn das Pokémon verwirrt ist." + }, + "motorDrive": { + "name": "Starthilfe", + "description": "Treffer durch Elektro-Attacken verursachen keinen Schaden, sondern geben dem Pokémon eine Starthilfe und erhöhen so seine Initiative." + }, + "rivalry": { + "name": "Rivalität", + "description": "Greift es einen Rivalen desselben Geschlechts an, wird es stärker. Greift es ein Ziel des anderen Geschlechts an, wird es schwächer." + }, + "steadfast": { + "name": "Felsenfest", + "description": "Sein eiserner Wille erhöht die Initiative, wann immer das Pokémon zurückschreckt." + }, + "snowCloak": { + "name": "Schneemantel", + "description": "Erhöht bei Hagel den Ausweichwert." + }, + "gluttony": { + "name": "Völlerei", + "description": "Setzt bestimmte Beeren nicht erst in einer Notlage ein, sondern bereits dann, wenn seine KP auf die Hälfte des Maximalwerts fallen." + }, + "angerPoint": { + "name": "Kurzschluss", + "description": "Wird nach Einstecken eines Volltreffers wütend und maximiert dabei seinen Angriffs-Wert." + }, + "unburden": { + "name": "Entlastung", + "description": "Wenn das von ihm getragene Item verwendet wird oder verloren geht, erhöht dies seine Initiative." + }, + "heatproof": { + "name": "Hitzeschutz", + "description": "Sein Hitze abweisender Körper halbiert den durch Feuer-Attacken erlittenen Schaden." + }, + "simple": { + "name": "Wankelmut", + "description": "Verdoppelt die Wirkung eigener Statusveränderungen." + }, + "drySkin": { + "name": "Trockenheit", + "description": "Bei Sonnenschein verliert das Pokémon KP und der Schaden durch Feuer-Attacken steigt. Bei Regen und Treffern durch Wasser-Attacken regeneriert es KP." + }, + "download": { + "name": "Download", + "description": "Ist die Spezial-Verteidigung des Gegners höher als seine Verteidigung, wird der eigene Spezial-Angriff erhöht. Ist die Verteidigung höher, steigt der Angriff." + }, + "ironFist": { + "name": "Eisenfaust", + "description": "Erhöht die Stärke von Hieb-, Punch-, Faust- und Schlag-Attacken." + }, + "poisonHeal": { + "name": "Aufheber", + "description": "Das Pokémon erleidet keinen Schaden durch Vergiftung, sondern regeneriert KP." + }, + "adaptability": { + "name": "Anpassung", + "description": "Erhöht die Stärke von Attacken, die dem Typ des Pokémon entsprechen." + }, + "skillLink": { + "name": "Wertelink", + "description": "Landet mit Serien-Attacken immer die maximale Anzahl an Treffern." + }, + "hydration": { + "name": "Hydration", + "description": "Heilt bei Regen Statusprobleme." + }, + "solarPower": { + "name": "Solarkraft", + "description": "Führt bei Sonnenschein in jeder Runde zu KP-Verlusten, erhöht aber den Spezial-Angriff." + }, + "quickFeet": { + "name": "Rasanz", + "description": "Erhöht bei Statusproblemen die Initiative." + }, + "normalize": { + "name": "Regulierung", + "description": "Alle Attacken des Pokémon nehmen den Typ Normal an und ihre Stärke erhöht sich ein wenig." + }, + "sniper": { + "name": "Superschütze", + "description": "Erhöht bei Volltreffern die Stärke der Attacke noch weiter." + }, + "magicGuard": { + "name": "Magieschild", + "description": "Das Pokémon nimmt nur durch Offensiv-Attacken Schaden." + }, + "noGuard": { + "name": "Schildlos", + "description": "Alle Attacken des oder auf das Pokémon gelingen aufgrund seiner deckungslosen Kampftaktik." + }, + "stall": { + "name": "Zeitspiel", + "description": "Handelt auch mit Initiative-Vorteil stets als Letztes." + }, + "technician": { + "name": "Techniker", + "description": "Erhöht die Stärke von schwächeren Attacken." + }, + "leafGuard": { + "name": "Floraschild", + "description": "Verhindert bei Sonnenschein Statusprobleme." + }, + "klutz": { + "name": "Tollpatsch", + "description": "Das Pokémon kann keine getragenen Items verwenden." + }, + "moldBreaker": { + "name": "Überbrückung", + "description": "Attacken können ungeachtet der Fähigkeiten des Zieles verwendet werden." + }, + "superLuck": { + "name": "Glückspilz", + "description": "Großes Glück erhöht die Wahrscheinlichkeit, einen Volltreffer zu landen." + }, + "aftermath": { + "name": "Finalschlag", + "description": "Wird das Pokémon durch eine direkte Attacke besiegt, fügt es dem Angreifer Schaden zu." + }, + "anticipation": { + "name": "Vorahnung", + "description": "Kann gefährliche gegnerische Attacken erahnen." + }, + "forewarn": { + "name": "Vorwarnung", + "description": "Gibt bei Kampfantritt Auskunft über eine Attacke aus dem gegnerischen Repertoire." + }, + "unaware": { + "name": "Unkenntnis", + "description": "Greift das Pokémon an, ignoriert es sämtliche Statusveränderungen des Zieles." + }, + "tintedLens": { + "name": "Aufwertung", + "description": "Bewirkt, dass nicht sehr effektive Attacken dem Ziel trotz des Typennachteils normalen Schaden zufügen." + }, + "filter": { + "name": "Filter", + "description": "Reduziert die Stärke von sehr effektiven Attacken und verringert damit den Schaden, den das Pokémon durch sie erleidet." + }, + "slowStart": { + "name": "Saumselig", + "description": "Halbiert fünf Runden lang den Angriffs-Wert und die Initiative des Pokémon." + }, + "scrappy": { + "name": "Rauflust", + "description": "Bewirkt, dass Normal- und Kampf-Attacken auch Pokémon vom Typ Geist treffen können." + }, + "stormDrain": { + "name": "Sturmsog", + "description": "Zieht Wasser-Attacken an. Statt durch diese Schaden zu nehmen, erhöht es den eigenen Spezial-Angriff." + }, + "iceBody": { + "name": "Eishaut", + "description": "Regeneriert bei Hagel nach und nach KP." + }, + "solidRock": { + "name": "Felskern", + "description": "Reduziert die Stärke von sehr effektiven Attacken und verringert damit den Schaden, den das Pokémon durch sie erleidet." + }, + "snowWarning": { + "name": "Hagelalarm", + "description": "Löst bei Kampfantritt Hagel aus." + }, + "honeyGather": { + "name": "Honigmaul", + "description": "Sammelt nach dem Kampf Honig. Dieser wird dann für Geld verkauft." + }, + "frisk": { + "name": "Schnüffler", + "description": "Kann bei Kampfantritt Auskunft über die Fähigkeit vom Gegner geben." + }, + "reckless": { + "name": "Achtlos", + "description": "Erhöht die Stärke von Attacken mit Rückstoßschaden." + }, + "multitype": { + "name": "Variabilität", + "description": "Das Pokémon passt seinen Typ dem der getragenen Tafel bzw. des getragenen Z-Kristalls an." + }, + "flowerGift": { + "name": "Pflanzengabe", + "description": "Erhöht bei Sonnenschein den Angriff und die Spezial-Verteidigung aller Team-Pokémon." + }, + "badDreams": { + "name": "Alptraum", + "description": "Fügt schlafenden Gegnern Schaden zu." + }, + "pickpocket": { + "name": "Langfinger", + "description": "Stiehlt das Item des Angreifers bei Berührung." + }, + "sheerForce": { + "name": "Rohe Gewalt", + "description": "Erhöht die Stärke von Attacken, aber hebt dafür ihre Zusatzeffekte auf." + }, + "contrary": { + "name": "Umkehrung", + "description": "Statusveränderungen werden umgekehrt: Statuswerte, die eigentlich erhöht werden sollten, sinken und umgekehrt." + }, + "unnerve": { + "name": "Anspannung", + "description": "Erzeugt bei Gegnern Stress und hindert sie so daran, Beeren zu konsumieren." + }, + "defiant": { + "name": "Siegeswille", + "description": "Erhöht den Angriff stark, wenn ein Statuswert gesenkt wurde." + }, + "defeatist": { + "name": "Schwächling", + "description": "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, bekommt es Angst. Dadurch wird die Stärke seines Angriffs und Spezial-Angriffs halbiert." + }, + "cursedBody": { + "name": "Tastfluch", + "description": "Blockiert eventuell die Attacke, mit welcher der Angreifer es getroffen hat." + }, + "healer": { + "name": "Heilherz", + "description": "Befreit Mitstreiter gelegentlich von Statusproblemen." + }, + "friendGuard": { + "name": "Freundeshut", + "description": "Kann den Schaden, den Mitstreiter erleiden, verringern." + }, + "weakArmor": { + "name": "Bruchrüstung", + "description": "Senkt bei erlittenem Treffer durch eine physische Attacke die Verteidigung des Pokémon, aber erhöht dafür seine Initiative stark." + }, + "heavyMetal": { + "name": "Schwermetall", + "description": "Verdoppelt das eigene Gewicht." + }, + "lightMetal": { + "name": "Leichtmetall", + "description": "Halbiert das eigene Gewicht." + }, + "multiscale": { + "name": "Multischuppe", + "description": "Verringert den erlittenen Schaden bei vollen KP." + }, + "toxicBoost": { + "name": "Giftwahn", + "description": "Erhöht bei Vergiftungen die Stärke von physischen Attacken." + }, + "flareBoost": { + "name": "Hitzewahn", + "description": "Erhöht bei Verbrennungen die Stärke von Spezial-Attacken." + }, + "harvest": { + "name": "Reiche Ernte", + "description": "Dieselbe Beere kann mehrmals verwendet werden." + }, + "telepathy": { + "name": "Telepathie", + "description": "Erkennt und pariert Attacken von Mitstreitern." + }, + "moody": { + "name": "Gefühlswippe", + "description": "Erhöht in jeder Runde aufs Neue einen Statuswert stark und senkt einen anderen." + }, + "overcoat": { + "name": "Partikelschutz", + "description": "Nimmt weder durch Wetterlagen wie Sandsturm oder Hagel noch durch Pulver oder Puder Schaden." + }, + "poisonTouch": { + "name": "Giftgriff", + "description": "Kann das Ziel durch bloßes Berühren vergiften." + }, + "regenerator": { + "name": "Belebekraft", + "description": "Wird das Pokémon ausgewechselt, regeneriert es eine kleine Menge an KP." + }, + "bigPecks": { + "name": "Brustbieter", + "description": "Hindert Angreifer daran, die Verteidigung des Pokémon zu senken." + }, + "sandRush": { + "name": "Sandscharrer", + "description": "Erhöht in Sandstürmen die Initiative." + }, + "wonderSkin": { + "name": "Wunderhaut", + "description": "Wehrt mit robustem Körper viele Status-Attacken ab." + }, + "analytic": { + "name": "Analyse", + "description": "Greift das Pokémon zuletzt an, erhöht sich die Stärke der Attacke, die es einsetzt." + }, + "illusion": { + "name": "Trugbild", + "description": "Führt den Gegner hinters Licht, indem es bei Kampfantritt die Gestalt des Pokémon an der letzten Stelle im Team annimmt." + }, + "imposter": { + "name": "Doppelgänger", + "description": "Kämpft als Kopie seines Gegenübers." + }, + "infiltrator": { + "name": "Schwebedurch", + "description": "Überwindet gegnerische Schilde sowie Delegatoren und greift an." + }, + "mummy": { + "name": "Mumie", + "description": "Überträgt bei Berührung die Fähigkeit Mumie auf den Angreifer." + }, + "moxie": { + "name": "Hochmut", + "description": "Besiegt es ein Pokémon, steigt sein Selbstvertrauen und somit auch sein Angriff." + }, + "justified": { + "name": "Redlichkeit", + "description": "Wird es von einer Unlicht-Attacke getroffen, meldet sich sein Sinn für Gerechtigkeit zu Wort und sein Angriff steigt." + }, + "rattled": { + "name": "Hasenfuß", + "description": "Wird es von einer Unlicht-, Geister- oder Käfer-Attacke getroffen, bekommt es Angst und seine Initiative steigt." + }, + "magicBounce": { + "name": "Magiespiegel", + "description": "Lenkt Status-Attacken auf den Angreifer um, ohne selbst von ihnen getroffen zu werden." + }, + "sapSipper": { + "name": "Vegetarier", + "description": "Wird es von einer Pflanzen-Attacke getroffen, erleidet es keinerlei Schaden und sein Angriff steigt." + }, + "prankster": { + "name": "Strolch", + "description": "Ermöglicht einen Erstschlag mit Status-Attacken." + }, + "sandForce": { + "name": "Sandgewalt", + "description": "Erhöht in Sandstürmen die Stärke von Gesteins-, Boden- und Stahl-Attacken." + }, + "ironBarbs": { + "name": "Eisenstachel", + "description": "Fügt dem Angreifer bei Berührung mit eisernen Stacheln Schaden zu." + }, + "zenMode": { + "name": "TranceModus", + "description": "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, wechselt es seine Gestalt." + }, + "victoryStar": { + "name": "Triumphstern", + "description": "Erhöht die Genauigkeit aller Team-Pokémon." + }, + "turboblaze": { + "name": "Turbobrand", + "description": "Attacken können ungeachtet der Fähigkeit des Zieles eingesetzt werden." + }, + "teravolt": { + "name": "Teravolt", + "description": "Attacken können ungeachtet der Fähigkeit des Zieles eingesetzt werden." + }, + "aromaVeil": { + "name": "Dufthülle", + "description": "Kann alle Team-Pokémon vor mentalen Angriffen schützen." + }, + "flowerVeil": { + "name": "Blütenhülle", + "description": "Schützt Mitstreiter vom Typ Pflanze vor dem Senken ihrer Statuswerte sowie vor Statusproblemen." + }, + "cheekPouch": { + "name": "Backentaschen", + "description": "Regeneriert beim Konsum von Beeren ungeachtet der Beerensorte KP." + }, + "protean": { + "name": "Wandlungskunst", + "description": "Das Pokémon nimmt bei Einsatz einer Attacke deren Typ an." + }, + "furCoat": { + "name": "Fellkleid", + "description": "Halbiert den Schaden, den das Pokémon durch physische Attacken erleidet." + }, + "magician": { + "name": "Zauberer", + "description": "Trifft das Pokémon ein Ziel mit einer Attacke, kann es ihm dabei sein Item stehlen." + }, + "bulletproof": { + "name": "Kugelsicher", + "description": "Kann das Pokémon vor geworfenen kugelförmigen Objekten, wie zum Beispiel Bomben, schützen." + }, + "competitive": { + "name": "Unbeugsamkeit", + "description": "Erhöht den Spezial-Angriff stark, wenn ein Statuswert gesenkt wurde." + }, + "strongJaw": { + "name": "Titankiefer", + "description": "Der kräftige Kiefer des Pokémon erhöht die Stärke von Biss-Attacken." + }, + "refrigerate": { + "name": "Frostschicht", + "description": "Attacken vom Typ Normal nehmen den Typ Eis an und ihre Stärke erhöht sich ein wenig." + }, + "sweetVeil": { + "name": "Zuckerhülle", + "description": "Alle Team-Pokémon können nicht einschlafen." + }, + "stanceChange": { + "name": "Taktikwechsel", + "description": "Setzt das Pokémon eine Offensiv-Attacke ein, nimmt es die Klingenform an. Setzt es danach die Attacke Königsschild ein, nimmt es die Schildform an." + }, + "galeWings": { + "name": "Orkanschwingen", + "description": "Kann bei vollen KP einen Erstschlag mit Flug-Attacken ermöglichen." + }, + "megaLauncher": { + "name": "Megawumme", + "description": "Erhöht die Stärke einiger Wellen-, Aura- und Puls-Attacken." + }, + "grassPelt": { + "name": "Pflanzenpelz", + "description": "Erhöht die Verteidigung, wenn Grasfeld aktiv ist." + }, + "symbiosis": { + "name": "Nutznießer", + "description": "Gibt Mitstreitern, die ihr Item aufgebraucht haben, sein eigenes Item." + }, + "toughClaws": { + "name": "Krallenwucht", + "description": "Erhöht die Stärke von direkten Attacken." + }, + "pixilate": { + "name": "Feenschicht", + "description": "Attacken vom Typ Normal nehmen den Typ Fee an und ihre Stärke erhöht sich ein wenig." + }, + "gooey": { + "name": "Viskosität", + "description": "Senkt bei Berührung im Zuge eines Angriffs die Initiative des Angreifers." + }, + "aerilate": { + "name": "Zenithaut", + "description": "Attacken vom Typ Normal nehmen den Typ Flug an und ihre Stärke erhöht sich ein wenig." + }, + "parentalBond": { + "name": "Familienbande", + "description": "Zwei Generationen setzen jeweils ein Mal zum Angriff an." + }, + "darkAura": { + "name": "Dunkelaura", + "description": "Erhöht die Stärke aller Attacken des Typs Unlicht." + }, + "fairyAura": { + "name": "Feenaura", + "description": "Erhöht die Stärke aller Attacken des Typs Fee." + }, + "auraBreak": { + "name": "AuraUmkehr", + "description": "Kehrt die Wirkung von Auren um und senkt so die Stärke bestimmter Attacken, anstatt sie zu erhöhen." + }, + "primordialSea": { + "name": "Urmeer", + "description": "Ändert das Wetter, um Feuer-Attacken wirkungslos zu machen." + }, + "desolateLand": { + "name": "Endland", + "description": "Ändert das Wetter, um Wasser-Attacken wirkungslos zu machen." + }, + "deltaStream": { + "name": "DeltaWind", + "description": "Ändert das Wetter, um die Schwächen des Typs Flug zu beseitigen." + }, + "stamina": { + "name": "Zähigkeit", + "description": "Wird es von einer Attacke getroffen, steigt seine Verteidigung." + }, + "wimpOut": { + "name": "Reißaus", + "description": "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, zieht es sich ängstlich zurück." + }, + "emergencyExit": { + "name": "Rückzug", + "description": "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, bringt es sich in Sicherheit." + }, + "waterCompaction": { + "name": "Verklumpen", + "description": "Wird es von einer Wasser-Attacke getroffen, steigt seine Verteidigung stark." + }, + "merciless": { + "name": "Quälerei", + "description": "Sorgt bei Angriffen auf vergiftete Ziele für Volltreffergarantie." + }, + "shieldsDown": { + "name": "Limitschild", + "description": "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, zerbricht die Panzerung des Pokémon und es wird aggressiver." + }, + "stakeout": { + "name": "Beschattung", + "description": "Bewirkt bei Angriffen auf neu eingewechselte Ziele doppelten Schaden." + }, + "waterBubble": { + "name": "Wasserblase", + "description": "Feuer-Attacken fügen dem Pokémon weniger Schaden zu. Verhindert Verbrennungen." + }, + "steelworker": { + "name": "Stahlprofi", + "description": "Erhöht die Stärke von Stahl-Attacken." + }, + "berserk": { + "name": "Wutausbruch", + "description": "Fallen seine KP nach einem Angriff auf die Hälfte des Maximalwerts oder weniger, steigt sein Spezial-Angriff." + }, + "slushRush": { + "name": "Schneescharrer", + "description": "Erhöht bei Hagel die Initiative." + }, + "longReach": { + "name": "Langstrecke", + "description": "Ermöglicht dem Pokémon den Einsatz aller seiner Attacken, ohne das Ziel dabei direkt zu berühren." + }, + "liquidVoice": { + "name": "Plätscherstimme", + "description": "Bewirkt, dass alle Lärm-Attacken des Pokémon den Typ Wasser annehmen." + }, + "triage": { + "name": "Heilwandel", + "description": "Ermöglicht einen Erstschlag mit Attacken, welche die KP des Anwenders direkt regenerieren." + }, + "galvanize": { + "name": "Elektrohaut", + "description": "Attacken vom Typ Normal nehmen den Typ Elektro an und ihre Stärke erhöht sich ein wenig." + }, + "surgeSurfer": { + "name": "SurfSchweif", + "description": "Verdoppelt die Initiative, wenn zuvor ein Elektrofeld erzeugt wurde." + }, + "schooling": { + "name": "Fischschwarm", + "description": "Verfügt es über einen hohen KP-Wert, wird es zu einem Schwarm und gewinnt an Stärke. Ist der KP-Wert niedrig, löst sich der Schwarm wieder auf." + }, + "disguise": { + "name": "Kostümspuk", + "description": "Kann ein Mal pro Kampf mit seinem gruseligen Kostüm einen Angriff abwehren." + }, + "battleBond": { + "name": "Freundschaftsakt", + "description": "Besiegt es ein Ziel, vertieft dies die Freundschaft zu seinem Trainer, wodurch es die Ash-Form annimmt und sein Wasser-Shuriken stärker wird." + }, + "powerConstruct": { + "name": "Scharwandel", + "description": "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, eilen ihm weitere Zellen zu Hilfe und es nimmt die Optimumform an." + }, + "corrosion": { + "name": "Korrosion", + "description": "Kann selbst Pokémon vom Typ Stahl oder Gift vergiften." + }, + "comatose": { + "name": "Dauerschlaf", + "description": "Das Pokémon befindet sich ununterbrochen im Halbschlaf und wacht nie vollständig auf. Es kann jedoch im Schlaf angreifen." + }, + "queenlyMajesty": { + "name": "Majestät", + "description": "Schüchtert Gegner ein und hindert sie so daran, Erstschlag-Attacken gegen es einzusetzen." + }, + "innardsOut": { + "name": "Magenkrempler", + "description": "Wird es durch eine Attacke besiegt, fügt es dem Angreifer Schaden in Höhe des KP-Werts zu, den es besaß, bevor es kampfunfähig wurde." + }, + "dancer": { + "name": "Tänzer", + "description": "Kann direkt im Anschluss an die Tanz-Attacke eines anderen Pokémon ebenfalls eine solche einsetzen." + }, + "battery": { + "name": "Batterie", + "description": "Erhöht die Stärke der Spezial-Attacken seiner Mitstreiter." + }, + "fluffy": { + "name": "Flauschigkeit", + "description": "Halbiert den Schaden, den es durch direkte Attacken nimmt, aber verdoppelt dafür den durch Feuer-Attacken erlittenen Schaden." + }, + "dazzling": { + "name": "Buntkörper", + "description": "Überrascht Gegner und hindert sie so daran, Erstschlag-Attacken gegen es einzusetzen." + }, + "soulHeart": { + "name": "Seelenherz", + "description": "Erhöht jedes Mal, wenn ein Pokémon besiegt wird, den eigenen Spezial-Angriff." + }, + "tanglingHair": { + "name": "Lockenkopf", + "description": "Senkt bei Berührung im Zuge eines Angriffs die Initiative des Angreifers." + }, + "receiver": { + "name": "Receiver", + "description": "Wird einer seiner Mitstreiter besiegt, erhält es dessen Fähigkeit." + }, + "powerOfAlchemy": { + "name": "Chemiekraft", + "description": "Wechselt seine Fähigkeit zu der eines kampfunfähig gewordenen Mitstreiters." + }, + "beastBoost": { + "name": "Bestien-Boost", + "description": "Erhöht in jeder Runde, in der es ein anderes Pokémon besiegt, seinen höchsten Statuswert." + }, + "rksSystem": { + "name": "Alpha-System", + "description": "Das Pokémon passt seinen Typ der getragenen Disc an." + }, + "electricSurge": { + "name": "Elektro-Erzeuger", + "description": "Erzeugt bei Kampfantritt ein Elektrofeld." + }, + "psychicSurge": { + "name": "Psycho-Erzeuger", + "description": "Erzeugt bei Kampfantritt ein Psychofeld." + }, + "mistySurge": { + "name": "Nebel-Erzeuger", + "description": "Erzeugt bei Kampfantritt ein Nebelfeld." + }, + "grassySurge": { + "name": "Gras-Erzeuger", + "description": "Erzeugt bei Kampfantritt ein Grasfeld." + }, + "fullMetalBody": { + "name": "Metallprotektor", + "description": "Verhindert das Senken der Statuswerte durch Attacken und Fähigkeiten von Angreifern." + }, + "shadowShield": { + "name": "Phantomschutz", + "description": "Verringert den erlittenen Schaden bei vollen KP." + }, + "prismArmor": { + "name": "Prismarüstung", + "description": "Reduziert die Stärke von sehr effektiven Attacken und verringert damit den Schaden, den das Pokémon durch sie erleidet." + }, + "neuroforce": { + "name": "Zerebralmacht", + "description": "Erhöht die Stärke von sehr effektiven Attacken." + }, + "intrepidSword": { + "name": "Kühnes Schwert", + "description": "Erhöht bei Kampfantritt den Angriff." + }, + "dauntlessShield": { + "name": "Wackerer Schild", + "description": "Erhöht bei Kampfantritt die Verteidigung." + }, + "libero": { + "name": "Libero", + "description": "Das Pokémon nimmt bei Einsatz einer Attacke deren Typ an." + }, + "ballFetch": { + "name": "Apport", + "description": "Trägt das Pokémon kein Item bei sich, hebt es den Ball aus dem ersten gescheiterten Fangversuch des Kampfes wieder auf." + }, + "cottonDown": { + "name": "Wollflaum", + "description": "Wird es von einem Angriff getroffen, verstreut es Teile seines Wollflaums, wodurch die Initiative aller anderen Pokémon sinkt." + }, + "propellerTail": { + "name": "Schraubflosse", + "description": "Ignoriert die Effekte von Fähigkeiten und Attacken anderer Pokémon, die Attacken auf sich lenken." + }, + "mirrorArmor": { + "name": "Spiegelrüstung", + "description": "Lenkt ausschließlich Effekte, welche die Statuswerte des Pokémon senken würden, auf den Angreifer um." + }, + "gulpMissile": { + "name": "Würggeschoss", + "description": "Wenn das Pokémon Surfer oder Taucher einsetzt, fängt es sich dabei Beute. Erleidet es anschließend Schaden, greift es an, indem es die Beute wieder ausspuckt." + }, + "stalwart": { + "name": "Stahlrückgrat", + "description": "Ignoriert die Effekte von Fähigkeiten und Attacken anderer Pokémon, die Attacken auf sich lenken." + }, + "steamEngine": { + "name": "Dampfantrieb", + "description": "Wird es von einer Wasser- oder Feuer-Attacke getroffen, steigt seine Initiative drastisch." + }, + "punkRock": { + "name": "Punk Rock", + "description": "Erhöht die Stärke von eigenen Lärm-Attacken und halbiert den Schaden, den das Pokémon selbst durch Lärm-Attacken erleidet." + }, + "sandSpit": { + "name": "Sandspeier", + "description": "Löst einen Sandsturm aus, wenn das Pokémon von einer Attacke erfasst wird." + }, + "iceScales": { + "name": "Eisflügelstaub", + "description": "Halbiert mithilfe von schützendem Eisflügelstaub den Schaden, den das Pokémon durch Spezial-Attacken erleidet." + }, + "ripen": { + "name": "Heranreifen", + "description": "Verdoppelt den Effekt von Beeren, indem es sie heranreifen lässt." + }, + "iceFace": { + "name": "Tiefkühlkopf", + "description": "Der Eisblock um seinen Kopf blockt eine physische Attacke ab. Dies bewirkt jedoch einen Formwechsel. Durch Hagel wird der Eisblock wiederhergestellt." + }, + "powerSpot": { + "name": "Kraftquelle", + "description": "Erhöht bei direkt benachbarten Pokémon die Stärke von Attacken." + }, + "mimicry": { + "name": "Mimese", + "description": "Der Typ des Pokémon ändert sich in Abhängigkeit vom Zustand des Feldes." + }, + "screenCleaner": { + "name": "Hemmungslos", + "description": "Hebt bei Kampfantritt die Wirkung von Lichtschild, Reflektor und Auroraschleier auf Mitstreiter- und Gegnerseite auf." + }, + "steelySpirit": { + "name": "Stählerner Wille", + "description": "Erhöht die Stärke von Stahl-Attacken auf Mitstreiterseite." + }, + "perishBody": { + "name": "Unheilskörper", + "description": "Erleidet es einen Treffer von einer direkten Attacke, wird es zusammen mit dem Angreifer nach drei Runden besiegt. Rettung ist durch Austausch möglich." + }, + "wanderingSpirit": { + "name": "Rastlose Seele", + "description": "Wird das Pokémon von einer direkten Attacke getroffen, tauscht es seine Fähigkeit mit der des Angreifers." + }, + "gorillaTactics": { + "name": "Affenfokus", + "description": "Erhöht den Angriff, aber nur die zuerst gewählte Attacke kann eingesetzt werden." + }, + "neutralizingGas": { + "name": "Reaktionsgas", + "description": "Solange ein Pokémon mit der Fähigkeit Reaktionsgas am Kampf beteiligt ist, werden die Fähigkeiten aller anderen Pokémon unterdrückt oder aufgehoben." + }, + "pastelVeil": { + "name": "Pastellhülle", + "description": "Schützt das Pokémon und seine Mitstreiter vor Vergiftung." + }, + "hungerSwitch": { + "name": "Heißhunger", + "description": "Das Pokémon ändert zum Ende jeder Runde seine Form und wechselt somit zwischen dem Pappsatt- und dem Kohldampfmuster." + }, + "quickDraw": { + "name": "Schnellschuss", + "description": "Ermöglicht dem Pokémon gelegentlich den Erstschlag." + }, + "unseenFist": { + "name": "Verborgene Faust", + "description": "Wenn das Pokémon eine direkte Attacke einsetzt, trifft diese auch dann, wenn sich das Ziel selbst schützt." + }, + "curiousMedicine": { + "name": "Kuriose Arznei", + "description": "Das Pokémon versprüht bei Kampfantritt Arznei aus seiner Muschel, die alle Statusveränderungen auf der Mitstreiterseite aufhebt." + }, + "transistor": { + "name": "Transistor", + "description": "Erhöht die Stärke von Elektro-Attacken." + }, + "dragonsMaw": { + "name": "Drachenkiefer", + "description": "Erhöht die Stärke von Drachen-Attacken." + }, + "chillingNeigh": { + "name": "Helles Wiehern", + "description": "Besiegt es ein Pokémon, stößt es ein frostiges Wiehern aus und erhöht damit seinen Angriff." + }, + "grimNeigh": { + "name": "Dunkles Wiehern", + "description": "Besiegt es ein Pokémon, stößt es ein furchteinflößendes Wiehern aus und erhöht damit seinen Spezial-Angriff." + }, + "asOneGlastrier": { + "name": "Reitgespann", + "description": "Das Pokémon verfügt sowohl über Coronospas Fähigkeit Anspannung als auch über Polaross’ Fähigkeit Helles Wiehern." + }, + "asOneSpectrier": { + "name": "Reitgespann", + "description": "Das Pokémon verfügt sowohl über Coronospas Fähigkeit Anspannung als auch über Phantoross’ Fähigkeit Dunkles Wiehern." + }, + "lingeringAroma": { + "name": "Duftschwade", + "description": "Das Pokémon überträgt bei Berührung die Fähigkeit Duftschwade auf den Angreifer." + }, + "seedSower": { + "name": "Streusaat", + "description": "Wird das Pokémon von einem Angriff getroffen, erzeugt es ein Grasfeld." + }, + "thermalExchange": { + "name": "Thermowandel", + "description": "Wird das Pokémon von einer Feuer-Attacke getroffen, steigt sein Angriff. Außerdem kann es keine Verbrennung erleiden." + }, + "angerShell": { + "name": "Wutpanzer", + "description": "Fallen die KP des Pokémon durch einen Angriff auf die Hälfte des Maximalwerts oder weniger, sinken Vert. und Sp.-Vert., aber Ang., Sp.-Ang. und Initiative steigen." + }, + "purifyingSalt": { + "name": "Läutersalz", + "description": "Das Pokémon kann dank seines läuternden Salzes keine Statusprobleme erleiden und der durch Geist-Attacken erlittene Schaden wird halbiert." + }, + "wellBakedBody": { + "name": "Knusperkruste", + "description": "Wird das Pokémon von einer Feuer-Attacke getroffen, erleidet es keinen Schaden. Stattdessen steigt seine Verteidigung stark." + }, + "windRider": { + "name": "Windreiter", + "description": "Wirkt Rückenwind oder wird das Pokémon von einer Wind-Attacke getroffen, steigt sein Angriff. Außerdem erleidet es keinen Schaden durch Wind-Attacken." + }, + "guardDog": { + "name": "Wachhund", + "description": "Wird das Pokémon bedroht, steigt sein Angriff. Attacken und Items, durch die Pokémon ausgetauscht werden, haben keine Wirkung auf es." + }, + "rockyPayload": { + "name": "Steinträger", + "description": "Die Stärke von Gesteins-Attacken des Pokémon steigt." + }, + "windPower": { + "name": "Windkraft", + "description": "Wird das Pokémon von einer Wind-Attacke getroffen, lädt es sich auf. Dadurch steigt die Stärke seiner nächsten Elektro-Attacke." + }, + "zeroToHero": { + "name": "Superwechsel", + "description": "Wird das Pokémon ausgewechselt, nimmt es die Heldenform an." + }, + "commander": { + "name": "Kommandant", + "description": "Befindet sich ein Heerashai auf der Mitstreiterseite, springt das Pokémon bei Kampfantritt in dessen Maul und gibt von dort aus Befehle." + }, + "electromorphosis": { + "name": "Dynamo", + "description": "Wenn das Pokémon Schaden erleidet, lädt es sich auf. Dadurch steigt die Stärke seiner nächsten Elektro-Attacke." + }, + "protosynthesis": { + "name": "Paläosynthese", + "description": "Bei Sonnenschein oder wenn das Pokémon eine Energiekapsel trägt, steigt sein höchster Statuswert." + }, + "quarkDrive": { + "name": "Quantenantrieb", + "description": "Im Elektrofeld oder wenn das Pokémon eine Energiekapsel trägt, steigt sein höchster Statuswert." + }, + "goodAsGold": { + "name": "Goldkörper", + "description": "Dank seines robusten Körpers aus reinem, rostfreiem Gold kann das Pokémon nicht von Status-Attacken getroffen werden." + }, + "vesselOfRuin": { + "name": "Unheilsgefäß", + "description": "Mit der Macht seines Unheil bringenden Gefäßes schwächt das Pokémon den Spezial-Angriff aller anderen Pokémon." + }, + "swordOfRuin": { + "name": "Unheilsschwert", + "description": "Mit der Macht seines Unheil bringenden Schwertes schwächt das Pokémon die Verteidigung aller anderen Pokémon." + }, + "tabletsOfRuin": { + "name": "Unheilstafeln", + "description": "Mit der Macht seiner Unheil bringenden Holztafeln schwächt das Pokémon den Angriff aller anderen Pokémon." + }, + "beadsOfRuin": { + "name": "Unheilsjuwelen", + "description": "Mit der Macht seiner Unheil bringenden Juwelen schwächt das Pokémon die Spezial-Verteidigung aller anderen Pokémon." + }, + "orichalcumPulse": { + "name": "Orichalkum-Puls", + "description": "Das Pokémon erzeugt bei Kampfantritt Sonnenschein. Bei Sonnenschein verstärkt ein urzeitlicher Puls seinen Angriff." + }, + "hadronEngine": { + "name": "Hadronen-Motor", + "description": "Das Pokémon erzeugt bei Kampfantritt ein Elektrofeld. Wenn ein Elektrofeld aktiv ist, verstärkt ein futuristischer Motor seinen Spezial-Angriff." + }, + "opportunist": { + "name": "Profiteur", + "description": "Wenn ein Statuswert eines Gegners steigt, profitiert das Pokémon ebenfalls davon und der gleiche Statuswert steigt auch bei ihm." + }, + "cudChew": { + "name": "Wiederkäuer", + "description": "Wenn ein Pokémon eine Beere isst, stößt es diese am Ende der nächsten Runde wieder aus seinem Magen auf und verspeist diese erneut." + }, + "sharpness": { + "name": "Scharfkantig", + "description": "Die Stärke von Schnitt-Attacken des Pokémon steigt." + }, + "supremeOverlord": { + "name": "Feldherr", + "description": "Bei Kampfantritt steigen der Angriff und Spezial-Angriff des Pokémon ein bisschen für jedes bis dahin besiegte Team-Mitglied." + }, + "costar": { + "name": "Synchronauftritt", + "description": "Das Pokémon kopiert bei Kampfantritt die Statusveränderungen eines Mitstreiters." + }, + "toxicDebris": { + "name": "Giftbelag", + "description": "Erleidet das Pokémon Schaden durch eine physische Attacke, verstreut es giftige Stacheln auf der gegnerischen Seite." + }, + "armorTail": { + "name": "Schweifrüstung", + "description": "Der rätselhafte Schweif, der den Kopf des Pokémon umhüllt, hindert Gegner daran, Erstschlag-Attacken gegen die Mitstreiterseite einzusetzen." + }, + "earthEater": { + "name": "Bodenschmaus", + "description": "Wird das Pokémon von einer Boden-Attacke getroffen, erleidet es keinen Schaden, sondern regeneriert stattdessen KP." + }, + "myceliumMight": { + "name": "Myzelienkraft", + "description": "Beim Einsatz von Status-Attacken handelt das Pokémon stets langsamer, aber dafür kann es sie ungeachtet der Fähigkeit des Zieles einsetzen." + }, + "mindsEye": { + "name": "Geistiges Auge", + "description": "Die Genauigkeit des Pokémon kann nicht gesenkt werden. Es ignoriert Änderungen am Ausweichwert des Zieles und trifft mit Normal- und Kampf-Attacken Geister-Pokémon." + }, + "supersweetSyrup": { + "name": "Süßer Nektar", + "description": "Beim ersten Kampfantritt verbreitet das Pokémon den Duft süßen Nektars und senkt so den Ausweichwert seiner Gegner." + }, + "hospitality": { + "name": "Gastlichkeit", + "description": "Bei Kampfantritt zeigt das Pokémon seine Gastlichkeit, indem es die KP seines Mitstreiters ein wenig auffüllt." + }, + "toxicChain": { + "name": "Giftkette", + "description": "Durch die toxischen Stoffe in seiner Kette werden Ziele, die das Pokémon mit einer Attacke trifft, gelegentlich schwer vergiftet." + }, + "embodyAspectTeal": { + "name": "Erinnerungskraft", + "description": "Die Erinnerungen, die das Pokémon in sich trägt, lassen die Türkisgrüne Maske aufleuchten und erhöhen seine Initiative." + }, + "embodyAspectWellspring": { + "name": "Erinnerungskraft", + "description": "Die Erinnerungen, die das Pokémon in sich trägt, lassen die Brunnenmaske aufleuchten und erhöhen seine Spezial-Verteidigung." + }, + "embodyAspectHearthflame": { + "name": "Erinnerungskraft", + "description": "Die Erinnerungen, die das Pokémon in sich trägt, lassen die Ofenmaske aufleuchten und erhöhen seinen Angriff." + }, + "embodyAspectCornerstone": { + "name": "Erinnerungskraft", + "description": "Die Erinnerungen, die das Pokémon in sich trägt, lassen die Fundamentmaske aufleuchten und erhöhen seine Verteidigung." + }, + "teraShift": { + "name": "Tera-Wandel", + "description": "Bei Kampfantritt absorbiert das Pokémon Energie in seiner Umgebung und nimmt die Terakristall-Form an." + }, + "teraShell": { + "name": "Tera-Panzer", + "description": "Der Panzer des Pokémon birgt die Kraft aller Typen in sich. Alle Schaden verursachenden Attacken, die es bei vollen KP treffen, sind nicht sehr effektiv." + }, + "teraformZero": { + "name": "Teraforming Null", + "description": "Wenn Terapagos die Stellarform annimmt, eliminiert es dank seiner verborgenen Kräfte sämtliche Wettereffekte und Felder." + }, + "poisonPuppeteer": { + "name": "Giftpuppenspiel", + "description": "Wenn Infamomo ein Ziel mit einer Attacke vergiftet, so wird dieses auch verwirrt." + } +} \ No newline at end of file diff --git a/src/locales/de/ability.ts b/src/locales/de/ability.ts deleted file mode 100644 index e397b84c7b7..00000000000 --- a/src/locales/de/ability.ts +++ /dev/null @@ -1,1244 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -export const ability: AbilityTranslationEntries = { - stench: { - name: "Duftnote", - description: "Lässt das Ziel beim Angriff eventuell durch Gestank zurückschrecken.", - }, - drizzle: { - name: "Niesel", - description: "Ruft bei Kampfantritt Regen herbei.", - }, - speedBoost: { - name: "Temposchub", - description: "Erhöht in jeder Runde die Initiative.", - }, - battleArmor: { - name: "Kampfpanzer", - description: "Wehrt gegnerische Volltreffer mit einem harten Panzer ab.", - }, - sturdy: { - name: "Robustheit", - description: "Bietet Schutz gegen K.O.-Attacken. Bei vollen KP übersteht das Pokémon auch K.O.-Treffer.", - }, - damp: { - name: "Feuchtigkeit", - description: "Befeuchtet die Umgebung und verhindert so den Einsatz von Attacken wie Finale, die Explosionen auslösen.", - }, - limber: { - name: "Flexibilität", - description: "Der flexible Körper des Pokémon schützt es vor Paralyse.", - }, - sandVeil: { - name: "Sandschleier", - description: "Erhöht in Sandstürmen den Ausweichwert.", - }, - static: { - name: "Statik", - description: "Kann bei Berührung durch statisch aufgeladenen Körper paralysieren.", - }, - voltAbsorb: { - name: "Voltabsorber", - description: "Treffer durch Elektro-Attacken verursachen keinen Schaden, sondern regenerieren stattdessen KP.", - }, - waterAbsorb: { - name: "H2OAbsorber", - description: "Treffer durch Wasser-Attacken verursachen keinen Schaden, sondern regenerieren stattdessen KP.", - }, - oblivious: { - name: "Dösigkeit", - description: "Das Pokémon ist so apathisch, dass es nicht betört oder provoziert werden kann.", - }, - cloudNine: { - name: "Wolke Sieben", - description: "Hebt alle Wetter-Effekte auf.", - }, - compoundEyes: { - name: "Facettenauge", - description: "Erhöht die Genauigkeit von Attacken.", - }, - insomnia: { - name: "Insomnia", - description: "Verhindert Einschlafen.", - }, - colorChange: { - name: "Farbwechsel", - description: "Ändert seinen Typ zu dem der Attacke des Angreifers.", - }, - immunity: { - name: "Immunität", - description: "Das starke Immunsystem des Pokémon verhindert Vergiftungen.", - }, - flashFire: { - name: "Feuerfänger", - description: "Verstärkt Feuer-Attacken, wenn es von Feuer-Attacken getroffen wird.", - }, - shieldDust: { - name: "Puderabwehr", - description: "Blockiert durch Puder die Zusatzeffekte gegnerischer Angriffe.", - }, - ownTempo: { - name: "Tempomacher", - description: "Das Pokémon lässt sich nicht aus der Ruhe bringen und verhindert so Verwirrung.", - }, - suctionCups: { - name: "Saugnapf", - description: "Blockt Attacken und Items, die Pokémon austauschen, indem es sich mit einem Saugnapf am Boden verankert.", - }, - intimidate: { - name: "Bedroher", - description: "Senkt den Angriff der Gegner, indem es sie gleich zu Kampfantritt bedroht und einschüchtert.", - }, - shadowTag: { - name: "Wegsperre", - description: "Hindert Gegner an der Flucht beziehungsweise am Auswechseln, indem es ihnen den Weg versperrt.", - }, - roughSkin: { - name: "Rauhaut", - description: "Angreifer werden durch die raue Haut des Pokémon bei direkten Attacken verletzt.", - }, - wonderGuard: { - name: "Wunderwache", - description: "Wundersame Kräfte bewirken, dass nur sehr effektive Treffer bei ihm Schaden anrichten.", - }, - levitate: { - name: "Schwebe", - description: "Verleiht volle Immunität gegen alle Boden-Attacken durch Schwebezustand.", - }, - effectSpore: { - name: "Sporenwirt", - description: "Wird dieses Pokémon durch eine direkte Attacke angegriffen, kann das beim Gegner Paralyse, Vergiftung oder Schlaf auslösen.", - }, - synchronize: { - name: "Synchro", - description: "Erleidet das Pokémon Verbrennungen, Vergiftungen oder Paralyse, ereilt das jeweilige Statusproblem auch den Verursacher.", - }, - clearBody: { - name: "Neutraltorso", - description: "Verhindert das Senken der Statuswerte durch Attacken und Fähigkeiten von Angreifern.", - }, - naturalCure: { - name: "Innere Kraft", - description: "Wird das Pokémon ausgewechselt, werden seine Statusprobleme geheilt.", - }, - lightningRod: { - name: "Blitzfänger", - description: "Zieht Elektro-Attacken an. Statt durch diese Schaden zu nehmen, erhöht es den eigenen Spezial-Angriff.", - }, - sereneGrace: { - name: "Edelmut", - description: "Erhöht die Wahrscheinlichkeit, dass Zusatzeffekte von Attacken auftreten.", - }, - swiftSwim: { - name: "Wassertempo", - description: "Erhöht bei Regen die Initiative.", - }, - chlorophyll: { - name: "Chlorophyll", - description: "Erhöht bei Sonnenschein die Initiative.", - }, - illuminate: { - name: "Erleuchtung", - description: "Erhellt die Umgebung und erhöht dadurch die Wahrscheinlichkeit, wilden Pokémon zu begegnen.", - }, - trace: { - name: "Erfassen", - description: "Kopiert bei Kampfantritt die Fähigkeit eines Gegners.", - }, - hugePower: { - name: "Kraftkoloss", - description: "Verdoppelt die Stärke von physischen Attacken.", - }, - poisonPoint: { - name: "Giftdorn", - description: "Vergiftet den Angreifer bei Berührung eventuell.", - }, - innerFocus: { - name: "Konzentrator", - description: "Verhindert durch erhöhte Konzentrationsfähigkeit Zurückschrecken.", - }, - magmaArmor: { - name: "Magmapanzer", - description: "Dank eines Panzers aus Magma kann dieses Pokémon nicht eingefroren werden.", - }, - waterVeil: { - name: "Aquahülle", - description: "Verhindert durch eine Hülle aus Wasser Verbrennungen.", - }, - magnetPull: { - name: "Magnetfalle", - description: "Hindert Stahl-Pokémon durch Magnetismus an der Flucht.", - }, - soundproof: { - name: "Lärmschutz", - description: "Bietet durch Schalldämmung volle Immunität gegen alle Lärm-Attacken.", - }, - rainDish: { - name: "Regengenuss", - description: "Regeneriert bei Regen nach und nach KP.", - }, - sandStream: { - name: "Sandsturm", - description: "Erzeugt bei Kampfantritt Sandstürme.", - }, - pressure: { - name: "Erzwinger", - description: "Zwingt Gegner dazu, beim Einsatz von Attacken mehr AP zu verbrauchen.", - }, - thickFat: { - name: "Speckschicht", - description: "Das Pokémon wird von einer dicken Fettschicht geschützt, was den durch Feuer- und Eis-Attacken erlittenen Schaden halbiert.", - }, - earlyBird: { - name: "Frühwecker", - description: "Wenn es eingeschlafen ist, kann es doppelt so schnell wieder aufwachen wie andere Pokémon.", - }, - flameBody: { - name: "Flammkörper", - description: "Fügt dem Angreifer bei Berührung eventuell Verbrennungen zu.", - }, - runAway: { - name: "Angsthase", - description: "Die Flucht vor wilden Pokémon gelingt immer.", - }, - keenEye: { - name: "Adlerauge", - description: "Sein scharfer Blick hindert Angreifer daran, seine Genauigkeit zu senken.", - }, - hyperCutter: { - name: "Scherenmacht", - description: "Hindert Angreifer durch mächtige Scheren daran, den Angriffs-Wert zu senken.", - }, - pickup: { - name: "Mitnahme", - description: "Hebt gelegentlich von Gegnern benutzte Items auf. Dies geschieht nicht nur während Kämpfen, sondern auch unterwegs.", - }, - truant: { - name: "Schnarchnase", - description: "Das Pokémon muss nach Einsatz einer Attacke eine Runde lang aussetzen.", - }, - hustle: { - name: "Übereifer", - description: "Erhöht den Angriffs-Wert, aber senkt die Genauigkeit.", - }, - cuteCharm: { - name: "Charmebolzen", - description: "Wird dieses Pokémon durch eine direkte Attacke angegriffen, verliebt sich der Gegner eventuell in es.", - }, - plus: { - name: "Plus", - description: "Erhöht den Spezial-Angriff, wenn das Pokémon einen Mitstreiter mit der Fähigkeit Plus oder Minus hat.", - }, - minus: { - name: "Minus", - description: "Erhöht den Spezial-Angriff, wenn das Pokémon einen Mitstreiter mit der Fähigkeit Plus oder Minus hat.", - }, - forecast: { - name: "Prognose", - description: "Nimmt je nach Wetter entweder den Typ Wasser, Feuer oder Eis an.", - }, - stickyHold: { - name: "Klebekörper", - description: "Trägt es ein Item, bleibt dieses an seinem klebrigen Körper haften, wodurch Item-Diebstahl verhindert wird.", - }, - shedSkin: { - name: "Expidermis", - description: "Das Pokémon befreit sich eventuell von Statusproblemen, indem es seine Haut abstreift.", - }, - guts: { - name: "Adrenalin", - description: "Bei Statusproblemen setzt es Adrenalin frei und erhöht so seinen Angriffs-Wert.", - }, - marvelScale: { - name: "Notschutz", - description: "Bei Statusproblemen schützt es sich mit mysteriösen Schuppen und erhöht so seine Verteidigung.", - }, - liquidOoze: { - name: "Kloakensoße", - description: "Angreifer, die durch Saug-Attacken Kloakensoße in sich aufgenommen haben, nehmen durch deren widerwärtigen Gestank Schaden.", - }, - overgrow: { - name: "Notdünger", - description: "Erhöht die Stärke von Pflanzen-Attacken, wenn die KP auf einen gewissen Wert fallen.", - }, - blaze: { - name: "Großbrand", - description: "Erhöht die Stärke von Feuer-Attacken, wenn die KP auf einen gewissen Wert fallen.", - }, - torrent: { - name: "Sturzbach", - description: "Erhöht die Stärke von Wasser-Attacken, wenn die KP auf einen gewissen Wert fallen.", - }, - swarm: { - name: "Hexaplaga", - description: "Erhöht die Stärke von Käfer-Attacken, wenn die KP auf einen gewissen Wert fallen.", - }, - rockHead: { - name: "Steinhaupt", - description: "Verhindert Schaden, der durch Rückstoß entstehen würde.", - }, - drought: { - name: "Dürre", - description: "Erzeugt bei Kampfantritt gleißendes Sonnenlicht.", - }, - arenaTrap: { - name: "Ausweglos", - description: "Hindert Gegner im Kampf an der Flucht.", - }, - vitalSpirit: { - name: "Munterkeit", - description: "Das Pokémon ist so munter, dass es nicht einschlafen kann.", - }, - whiteSmoke: { - name: "Pulverrauch", - description: "Indem es sich mit pulvrigem Rauch umhüllt, hindert es Angreifer daran, seine Statuswerte zu senken.", - }, - purePower: { - name: "Mentalkraft", - description: "Verdoppelt mit reiner Willenskraft die Stärke seiner physischen Attacken.", - }, - shellArmor: { - name: "Panzerhaut", - description: "Wehrt gegnerische Volltreffer mit einem harten Panzer ab.", - }, - airLock: { - name: "Klimaschutz", - description: "Hebt alle Wetter-Effekte auf.", - }, - tangledFeet: { - name: "Fußangel", - description: "Erhöht den Ausweichwert, wenn das Pokémon verwirrt ist.", - }, - motorDrive: { - name: "Starthilfe", - description: "Treffer durch Elektro-Attacken verursachen keinen Schaden, sondern geben dem Pokémon eine Starthilfe und erhöhen so seine Initiative.", - }, - rivalry: { - name: "Rivalität", - description: "Greift es einen Rivalen desselben Geschlechts an, wird es stärker. Greift es ein Ziel des anderen Geschlechts an, wird es schwächer.", - }, - steadfast: { - name: "Felsenfest", - description: "Sein eiserner Wille erhöht die Initiative, wann immer das Pokémon zurückschreckt.", - }, - snowCloak: { - name: "Schneemantel", - description: "Erhöht bei Hagel den Ausweichwert.", - }, - gluttony: { - name: "Völlerei", - description: "Setzt bestimmte Beeren nicht erst in einer Notlage ein, sondern bereits dann, wenn seine KP auf die Hälfte des Maximalwerts fallen.", - }, - angerPoint: { - name: "Kurzschluss", - description: "Wird nach Einstecken eines Volltreffers wütend und maximiert dabei seinen Angriffs-Wert.", - }, - unburden: { - name: "Entlastung", - description: "Wenn das von ihm getragene Item verwendet wird oder verloren geht, erhöht dies seine Initiative.", - }, - heatproof: { - name: "Hitzeschutz", - description: "Sein Hitze abweisender Körper halbiert den durch Feuer-Attacken erlittenen Schaden.", - }, - simple: { - name: "Wankelmut", - description: "Verdoppelt die Wirkung eigener Statusveränderungen.", - }, - drySkin: { - name: "Trockenheit", - description: "Bei Sonnenschein verliert das Pokémon KP und der Schaden durch Feuer-Attacken steigt. Bei Regen und Treffern durch Wasser-Attacken regeneriert es KP.", - }, - download: { - name: "Download", - description: "Ist die Spezial-Verteidigung des Gegners höher als seine Verteidigung, wird der eigene Spezial-Angriff erhöht. Ist die Verteidigung höher, steigt der Angriff.", - }, - ironFist: { - name: "Eisenfaust", - description: "Erhöht die Stärke von Hieb-, Punch-, Faust- und Schlag-Attacken.", - }, - poisonHeal: { - name: "Aufheber", - description: "Das Pokémon erleidet keinen Schaden durch Vergiftung, sondern regeneriert KP.", - }, - adaptability: { - name: "Anpassung", - description: "Erhöht die Stärke von Attacken, die dem Typ des Pokémon entsprechen.", - }, - skillLink: { - name: "Wertelink", - description: "Landet mit Serien-Attacken immer die maximale Anzahl an Treffern.", - }, - hydration: { - name: "Hydration", - description: "Heilt bei Regen Statusprobleme.", - }, - solarPower: { - name: "Solarkraft", - description: "Führt bei Sonnenschein in jeder Runde zu KP-Verlusten, erhöht aber den Spezial-Angriff.", - }, - quickFeet: { - name: "Rasanz", - description: "Erhöht bei Statusproblemen die Initiative.", - }, - normalize: { - name: "Regulierung", - description: "Alle Attacken des Pokémon nehmen den Typ Normal an und ihre Stärke erhöht sich ein wenig.", - }, - sniper: { - name: "Superschütze", - description: "Erhöht bei Volltreffern die Stärke der Attacke noch weiter.", - }, - magicGuard: { - name: "Magieschild", - description: "Das Pokémon nimmt nur durch Offensiv-Attacken Schaden.", - }, - noGuard: { - name: "Schildlos", - description: "Alle Attacken des oder auf das Pokémon gelingen aufgrund seiner deckungslosen Kampftaktik.", - }, - stall: { - name: "Zeitspiel", - description: "Handelt auch mit Initiative-Vorteil stets als Letztes.", - }, - technician: { - name: "Techniker", - description: "Erhöht die Stärke von schwächeren Attacken.", - }, - leafGuard: { - name: "Floraschild", - description: "Verhindert bei Sonnenschein Statusprobleme.", - }, - klutz: { - name: "Tollpatsch", - description: "Das Pokémon kann keine getragenen Items verwenden.", - }, - moldBreaker: { - name: "Überbrückung", - description: "Attacken können ungeachtet der Fähigkeiten des Zieles verwendet werden.", - }, - superLuck: { - name: "Glückspilz", - description: "Großes Glück erhöht die Wahrscheinlichkeit, einen Volltreffer zu landen.", - }, - aftermath: { - name: "Finalschlag", - description: "Wird das Pokémon durch eine direkte Attacke besiegt, fügt es dem Angreifer Schaden zu.", - }, - anticipation: { - name: "Vorahnung", - description: "Kann gefährliche gegnerische Attacken erahnen.", - }, - forewarn: { - name: "Vorwarnung", - description: "Gibt bei Kampfantritt Auskunft über eine Attacke aus dem gegnerischen Repertoire.", - }, - unaware: { - name: "Unkenntnis", - description: "Greift das Pokémon an, ignoriert es sämtliche Statusveränderungen des Zieles.", - }, - tintedLens: { - name: "Aufwertung", - description: "Bewirkt, dass nicht sehr effektive Attacken dem Ziel trotz des Typennachteils normalen Schaden zufügen.", - }, - filter: { - name: "Filter", - description: "Reduziert die Stärke von sehr effektiven Attacken und verringert damit den Schaden, den das Pokémon durch sie erleidet.", - }, - slowStart: { - name: "Saumselig", - description: "Halbiert fünf Runden lang den Angriffs-Wert und die Initiative des Pokémon.", - }, - scrappy: { - name: "Rauflust", - description: "Bewirkt, dass Normal- und Kampf-Attacken auch Pokémon vom Typ Geist treffen können.", - }, - stormDrain: { - name: "Sturmsog", - description: "Zieht Wasser-Attacken an. Statt durch diese Schaden zu nehmen, erhöht es den eigenen Spezial-Angriff.", - }, - iceBody: { - name: "Eishaut", - description: "Regeneriert bei Hagel nach und nach KP.", - }, - solidRock: { - name: "Felskern", - description: "Reduziert die Stärke von sehr effektiven Attacken und verringert damit den Schaden, den das Pokémon durch sie erleidet.", - }, - snowWarning: { - name: "Hagelalarm", - description: "Löst bei Kampfantritt Hagel aus.", - }, - honeyGather: { - name: "Honigmaul", - description: "Sammelt nach dem Kampf Honig. Dieser wird dann für Geld verkauft.", - }, - frisk: { - name: "Schnüffler", - description: "Kann bei Kampfantritt Auskunft über die Fähigkeit vom Gegner geben.", - }, - reckless: { - name: "Achtlos", - description: "Erhöht die Stärke von Attacken mit Rückstoßschaden.", - }, - multitype: { - name: "Variabilität", - description: "Das Pokémon passt seinen Typ dem der getragenen Tafel bzw. des getragenen Z-Kristalls an.", - }, - flowerGift: { - name: "Pflanzengabe", - description: "Erhöht bei Sonnenschein den Angriff und die Spezial-Verteidigung aller Team-Pokémon.", - }, - badDreams: { - name: "Alptraum", - description: "Fügt schlafenden Gegnern Schaden zu.", - }, - pickpocket: { - name: "Langfinger", - description: "Stiehlt das Item des Angreifers bei Berührung.", - }, - sheerForce: { - name: "Rohe Gewalt", - description: "Erhöht die Stärke von Attacken, aber hebt dafür ihre Zusatzeffekte auf.", - }, - contrary: { - name: "Umkehrung", - description: "Statusveränderungen werden umgekehrt: Statuswerte, die eigentlich erhöht werden sollten, sinken und umgekehrt.", - }, - unnerve: { - name: "Anspannung", - description: "Erzeugt bei Gegnern Stress und hindert sie so daran, Beeren zu konsumieren.", - }, - defiant: { - name: "Siegeswille", - description: "Erhöht den Angriff stark, wenn ein Statuswert gesenkt wurde.", - }, - defeatist: { - name: "Schwächling", - description: "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, bekommt es Angst. Dadurch wird die Stärke seines Angriffs und Spezial-Angriffs halbiert.", - }, - cursedBody: { - name: "Tastfluch", - description: "Blockiert eventuell die Attacke, mit welcher der Angreifer es getroffen hat.", - }, - healer: { - name: "Heilherz", - description: "Befreit Mitstreiter gelegentlich von Statusproblemen.", - }, - friendGuard: { - name: "Freundeshut", - description: "Kann den Schaden, den Mitstreiter erleiden, verringern.", - }, - weakArmor: { - name: "Bruchrüstung", - description: "Senkt bei erlittenem Treffer durch eine physische Attacke die Verteidigung des Pokémon, aber erhöht dafür seine Initiative stark.", - }, - heavyMetal: { - name: "Schwermetall", - description: "Verdoppelt das eigene Gewicht.", - }, - lightMetal: { - name: "Leichtmetall", - description: "Halbiert das eigene Gewicht.", - }, - multiscale: { - name: "Multischuppe", - description: "Verringert den erlittenen Schaden bei vollen KP.", - }, - toxicBoost: { - name: "Giftwahn", - description: "Erhöht bei Vergiftungen die Stärke von physischen Attacken.", - }, - flareBoost: { - name: "Hitzewahn", - description: "Erhöht bei Verbrennungen die Stärke von Spezial-Attacken.", - }, - harvest: { - name: "Reiche Ernte", - description: "Dieselbe Beere kann mehrmals verwendet werden.", - }, - telepathy: { - name: "Telepathie", - description: "Erkennt und pariert Attacken von Mitstreitern.", - }, - moody: { - name: "Gefühlswippe", - description: "Erhöht in jeder Runde aufs Neue einen Statuswert stark und senkt einen anderen.", - }, - overcoat: { - name: "Partikelschutz", - description: "Nimmt weder durch Wetterlagen wie Sandsturm oder Hagel noch durch Pulver oder Puder Schaden.", - }, - poisonTouch: { - name: "Giftgriff", - description: "Kann das Ziel durch bloßes Berühren vergiften.", - }, - regenerator: { - name: "Belebekraft", - description: "Wird das Pokémon ausgewechselt, regeneriert es eine kleine Menge an KP.", - }, - bigPecks: { - name: "Brustbieter", - description: "Hindert Angreifer daran, die Verteidigung des Pokémon zu senken.", - }, - sandRush: { - name: "Sandscharrer", - description: "Erhöht in Sandstürmen die Initiative.", - }, - wonderSkin: { - name: "Wunderhaut", - description: "Wehrt mit robustem Körper viele Status-Attacken ab.", - }, - analytic: { - name: "Analyse", - description: "Greift das Pokémon zuletzt an, erhöht sich die Stärke der Attacke, die es einsetzt.", - }, - illusion: { - name: "Trugbild", - description: "Führt den Gegner hinters Licht, indem es bei Kampfantritt die Gestalt des Pokémon an der letzten Stelle im Team annimmt.", - }, - imposter: { - name: "Doppelgänger", - description: "Kämpft als Kopie seines Gegenübers.", - }, - infiltrator: { - name: "Schwebedurch", - description: "Überwindet gegnerische Schilde sowie Delegatoren und greift an.", - }, - mummy: { - name: "Mumie", - description: "Überträgt bei Berührung die Fähigkeit Mumie auf den Angreifer.", - }, - moxie: { - name: "Hochmut", - description: "Besiegt es ein Pokémon, steigt sein Selbstvertrauen und somit auch sein Angriff.", - }, - justified: { - name: "Redlichkeit", - description: "Wird es von einer Unlicht-Attacke getroffen, meldet sich sein Sinn für Gerechtigkeit zu Wort und sein Angriff steigt.", - }, - rattled: { - name: "Hasenfuß", - description: "Wird es von einer Unlicht-, Geister- oder Käfer-Attacke getroffen, bekommt es Angst und seine Initiative steigt.", - }, - magicBounce: { - name: "Magiespiegel", - description: "Lenkt Status-Attacken auf den Angreifer um, ohne selbst von ihnen getroffen zu werden.", - }, - sapSipper: { - name: "Vegetarier", - description: "Wird es von einer Pflanzen-Attacke getroffen, erleidet es keinerlei Schaden und sein Angriff steigt.", - }, - prankster: { - name: "Strolch", - description: "Ermöglicht einen Erstschlag mit Status-Attacken.", - }, - sandForce: { - name: "Sandgewalt", - description: "Erhöht in Sandstürmen die Stärke von Gesteins-, Boden- und Stahl-Attacken.", - }, - ironBarbs: { - name: "Eisenstachel", - description: "Fügt dem Angreifer bei Berührung mit eisernen Stacheln Schaden zu.", - }, - zenMode: { - name: "TranceModus", - description: "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, wechselt es seine Gestalt.", - }, - victoryStar: { - name: "Triumphstern", - description: "Erhöht die Genauigkeit aller Team-Pokémon.", - }, - turboblaze: { - name: "Turbobrand", - description: "Attacken können ungeachtet der Fähigkeit des Zieles eingesetzt werden.", - }, - teravolt: { - name: "Teravolt", - description: "Attacken können ungeachtet der Fähigkeit des Zieles eingesetzt werden.", - }, - aromaVeil: { - name: "Dufthülle", - description: "Kann alle Team-Pokémon vor mentalen Angriffen schützen.", - }, - flowerVeil: { - name: "Blütenhülle", - description: "Schützt Mitstreiter vom Typ Pflanze vor dem Senken ihrer Statuswerte sowie vor Statusproblemen.", - }, - cheekPouch: { - name: "Backentaschen", - description: "Regeneriert beim Konsum von Beeren ungeachtet der Beerensorte KP.", - }, - protean: { - name: "Wandlungskunst", - description: "Das Pokémon nimmt bei Einsatz einer Attacke deren Typ an.", - }, - furCoat: { - name: "Fellkleid", - description: "Halbiert den Schaden, den das Pokémon durch physische Attacken erleidet.", - }, - magician: { - name: "Zauberer", - description: "Trifft das Pokémon ein Ziel mit einer Attacke, kann es ihm dabei sein Item stehlen.", - }, - bulletproof: { - name: "Kugelsicher", - description: "Kann das Pokémon vor geworfenen kugelförmigen Objekten, wie zum Beispiel Bomben, schützen.", - }, - competitive: { - name: "Unbeugsamkeit", - description: "Erhöht den Spezial-Angriff stark, wenn ein Statuswert gesenkt wurde.", - }, - strongJaw: { - name: "Titankiefer", - description: "Der kräftige Kiefer des Pokémon erhöht die Stärke von Biss-Attacken.", - }, - refrigerate: { - name: "Frostschicht", - description: "Attacken vom Typ Normal nehmen den Typ Eis an und ihre Stärke erhöht sich ein wenig.", - }, - sweetVeil: { - name: "Zuckerhülle", - description: "Alle Team-Pokémon können nicht einschlafen.", - }, - stanceChange: { - name: "Taktikwechsel", - description: "Setzt das Pokémon eine Offensiv-Attacke ein, nimmt es die Klingenform an. Setzt es danach die Attacke Königsschild ein, nimmt es die Schildform an.", - }, - galeWings: { - name: "Orkanschwingen", - description: "Kann bei vollen KP einen Erstschlag mit Flug-Attacken ermöglichen.", - }, - megaLauncher: { - name: "Megawumme", - description: "Erhöht die Stärke einiger Wellen-, Aura- und Puls-Attacken.", - }, - grassPelt: { - name: "Pflanzenpelz", - description: "Erhöht die Verteidigung, wenn Grasfeld aktiv ist.", - }, - symbiosis: { - name: "Nutznießer", - description: "Gibt Mitstreitern, die ihr Item aufgebraucht haben, sein eigenes Item.", - }, - toughClaws: { - name: "Krallenwucht", - description: "Erhöht die Stärke von direkten Attacken.", - }, - pixilate: { - name: "Feenschicht", - description: "Attacken vom Typ Normal nehmen den Typ Fee an und ihre Stärke erhöht sich ein wenig.", - }, - gooey: { - name: "Viskosität", - description: "Senkt bei Berührung im Zuge eines Angriffs die Initiative des Angreifers.", - }, - aerilate: { - name: "Zenithaut", - description: "Attacken vom Typ Normal nehmen den Typ Flug an und ihre Stärke erhöht sich ein wenig.", - }, - parentalBond: { - name: "Familienbande", - description: "Zwei Generationen setzen jeweils ein Mal zum Angriff an.", - }, - darkAura: { - name: "Dunkelaura", - description: "Erhöht die Stärke aller Attacken des Typs Unlicht.", - }, - fairyAura: { - name: "Feenaura", - description: "Erhöht die Stärke aller Attacken des Typs Fee.", - }, - auraBreak: { - name: "AuraUmkehr", - description: "Kehrt die Wirkung von Auren um und senkt so die Stärke bestimmter Attacken, anstatt sie zu erhöhen.", - }, - primordialSea: { - name: "Urmeer", - description: "Ändert das Wetter, um Feuer-Attacken wirkungslos zu machen.", - }, - desolateLand: { - name: "Endland", - description: "Ändert das Wetter, um Wasser-Attacken wirkungslos zu machen.", - }, - deltaStream: { - name: "DeltaWind", - description: "Ändert das Wetter, um die Schwächen des Typs Flug zu beseitigen.", - }, - stamina: { - name: "Zähigkeit", - description: "Wird es von einer Attacke getroffen, steigt seine Verteidigung.", - }, - wimpOut: { - name: "Reißaus", - description: "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, zieht es sich ängstlich zurück.", - }, - emergencyExit: { - name: "Rückzug", - description: "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, bringt es sich in Sicherheit.", - }, - waterCompaction: { - name: "Verklumpen", - description: "Wird es von einer Wasser-Attacke getroffen, steigt seine Verteidigung stark.", - }, - merciless: { - name: "Quälerei", - description: "Sorgt bei Angriffen auf vergiftete Ziele für Volltreffergarantie.", - }, - shieldsDown: { - name: "Limitschild", - description: "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, zerbricht die Panzerung des Pokémon und es wird aggressiver.", - }, - stakeout: { - name: "Beschattung", - description: "Bewirkt bei Angriffen auf neu eingewechselte Ziele doppelten Schaden.", - }, - waterBubble: { - name: "Wasserblase", - description: "Feuer-Attacken fügen dem Pokémon weniger Schaden zu. Verhindert Verbrennungen.", - }, - steelworker: { - name: "Stahlprofi", - description: "Erhöht die Stärke von Stahl-Attacken.", - }, - berserk: { - name: "Wutausbruch", - description: "Fallen seine KP nach einem Angriff auf die Hälfte des Maximalwerts oder weniger, steigt sein Spezial-Angriff.", - }, - slushRush: { - name: "Schneescharrer", - description: "Erhöht bei Hagel die Initiative.", - }, - longReach: { - name: "Langstrecke", - description: "Ermöglicht dem Pokémon den Einsatz aller seiner Attacken, ohne das Ziel dabei direkt zu berühren.", - }, - liquidVoice: { - name: "Plätscherstimme", - description: "Bewirkt, dass alle Lärm-Attacken des Pokémon den Typ Wasser annehmen.", - }, - triage: { - name: "Heilwandel", - description: "Ermöglicht einen Erstschlag mit Attacken, welche die KP des Anwenders direkt regenerieren.", - }, - galvanize: { - name: "Elektrohaut", - description: "Attacken vom Typ Normal nehmen den Typ Elektro an und ihre Stärke erhöht sich ein wenig.", - }, - surgeSurfer: { - name: "SurfSchweif", - description: "Verdoppelt die Initiative, wenn zuvor ein Elektrofeld erzeugt wurde.", - }, - schooling: { - name: "Fischschwarm", - description: "Verfügt es über einen hohen KP-Wert, wird es zu einem Schwarm und gewinnt an Stärke. Ist der KP-Wert niedrig, löst sich der Schwarm wieder auf.", - }, - disguise: { - name: "Kostümspuk", - description: "Kann ein Mal pro Kampf mit seinem gruseligen Kostüm einen Angriff abwehren.", - }, - battleBond: { - name: "Freundschaftsakt", - description: "Besiegt es ein Ziel, vertieft dies die Freundschaft zu seinem Trainer, wodurch es die Ash-Form annimmt und sein Wasser-Shuriken stärker wird.", - }, - powerConstruct: { - name: "Scharwandel", - description: "Fallen seine KP auf die Hälfte des Maximalwerts oder weniger, eilen ihm weitere Zellen zu Hilfe und es nimmt die Optimumform an.", - }, - corrosion: { - name: "Korrosion", - description: "Kann selbst Pokémon vom Typ Stahl oder Gift vergiften.", - }, - comatose: { - name: "Dauerschlaf", - description: "Das Pokémon befindet sich ununterbrochen im Halbschlaf und wacht nie vollständig auf. Es kann jedoch im Schlaf angreifen.", - }, - queenlyMajesty: { - name: "Majestät", - description: "Schüchtert Gegner ein und hindert sie so daran, Erstschlag-Attacken gegen es einzusetzen.", - }, - innardsOut: { - name: "Magenkrempler", - description: "Wird es durch eine Attacke besiegt, fügt es dem Angreifer Schaden in Höhe des KP-Werts zu, den es besaß, bevor es kampfunfähig wurde.", - }, - dancer: { - name: "Tänzer", - description: "Kann direkt im Anschluss an die Tanz-Attacke eines anderen Pokémon ebenfalls eine solche einsetzen.", - }, - battery: { - name: "Batterie", - description: "Erhöht die Stärke der Spezial-Attacken seiner Mitstreiter.", - }, - fluffy: { - name: "Flauschigkeit", - description: "Halbiert den Schaden, den es durch direkte Attacken nimmt, aber verdoppelt dafür den durch Feuer-Attacken erlittenen Schaden.", - }, - dazzling: { - name: "Buntkörper", - description: "Überrascht Gegner und hindert sie so daran, Erstschlag-Attacken gegen es einzusetzen.", - }, - soulHeart: { - name: "Seelenherz", - description: "Erhöht jedes Mal, wenn ein Pokémon besiegt wird, den eigenen Spezial-Angriff.", - }, - tanglingHair: { - name: "Lockenkopf", - description: "Senkt bei Berührung im Zuge eines Angriffs die Initiative des Angreifers.", - }, - receiver: { - name: "Receiver", - description: "Wird einer seiner Mitstreiter besiegt, erhält es dessen Fähigkeit.", - }, - powerOfAlchemy: { - name: "Chemiekraft", - description: "Wechselt seine Fähigkeit zu der eines kampfunfähig gewordenen Mitstreiters.", - }, - beastBoost: { - name: "Bestien-Boost", - description: "Erhöht in jeder Runde, in der es ein anderes Pokémon besiegt, seinen höchsten Statuswert.", - }, - rksSystem: { - name: "Alpha-System", - description: "Das Pokémon passt seinen Typ der getragenen Disc an.", - }, - electricSurge: { - name: "Elektro-Erzeuger", - description: "Erzeugt bei Kampfantritt ein Elektrofeld.", - }, - psychicSurge: { - name: "Psycho-Erzeuger", - description: "Erzeugt bei Kampfantritt ein Psychofeld.", - }, - mistySurge: { - name: "Nebel-Erzeuger", - description: "Erzeugt bei Kampfantritt ein Nebelfeld.", - }, - grassySurge: { - name: "Gras-Erzeuger", - description: "Erzeugt bei Kampfantritt ein Grasfeld.", - }, - fullMetalBody: { - name: "Metallprotektor", - description: "Verhindert das Senken der Statuswerte durch Attacken und Fähigkeiten von Angreifern.", - }, - shadowShield: { - name: "Phantomschutz", - description: "Verringert den erlittenen Schaden bei vollen KP.", - }, - prismArmor: { - name: "Prismarüstung", - description: "Reduziert die Stärke von sehr effektiven Attacken und verringert damit den Schaden, den das Pokémon durch sie erleidet.", - }, - neuroforce: { - name: "Zerebralmacht", - description: "Erhöht die Stärke von sehr effektiven Attacken.", - }, - intrepidSword: { - name: "Kühnes Schwert", - description: "Erhöht bei Kampfantritt den Angriff.", - }, - dauntlessShield: { - name: "Wackerer Schild", - description: "Erhöht bei Kampfantritt die Verteidigung.", - }, - libero: { - name: "Libero", - description: "Das Pokémon nimmt bei Einsatz einer Attacke deren Typ an.", - }, - ballFetch: { - name: "Apport", - description: "Trägt das Pokémon kein Item bei sich, hebt es den Ball aus dem ersten gescheiterten Fangversuch des Kampfes wieder auf.", - }, - cottonDown: { - name: "Wollflaum", - description: "Wird es von einem Angriff getroffen, verstreut es Teile seines Wollflaums, wodurch die Initiative aller anderen Pokémon sinkt.", - }, - propellerTail: { - name: "Schraubflosse", - description: "Ignoriert die Effekte von Fähigkeiten und Attacken anderer Pokémon, die Attacken auf sich lenken.", - }, - mirrorArmor: { - name: "Spiegelrüstung", - description: "Lenkt ausschließlich Effekte, welche die Statuswerte des Pokémon senken würden, auf den Angreifer um.", - }, - gulpMissile: { - name: "Würggeschoss", - description: "Wenn das Pokémon Surfer oder Taucher einsetzt, fängt es sich dabei Beute. Erleidet es anschließend Schaden, greift es an, indem es die Beute wieder ausspuckt.", - }, - stalwart: { - name: "Stahlrückgrat", - description: "Ignoriert die Effekte von Fähigkeiten und Attacken anderer Pokémon, die Attacken auf sich lenken.", - }, - steamEngine: { - name: "Dampfantrieb", - description: "Wird es von einer Wasser- oder Feuer-Attacke getroffen, steigt seine Initiative drastisch.", - }, - punkRock: { - name: "Punk Rock", - description: "Erhöht die Stärke von eigenen Lärm-Attacken und halbiert den Schaden, den das Pokémon selbst durch Lärm-Attacken erleidet.", - }, - sandSpit: { - name: "Sandspeier", - description: "Löst einen Sandsturm aus, wenn das Pokémon von einer Attacke erfasst wird.", - }, - iceScales: { - name: "Eisflügelstaub", - description: "Halbiert mithilfe von schützendem Eisflügelstaub den Schaden, den das Pokémon durch Spezial-Attacken erleidet.", - }, - ripen: { - name: "Heranreifen", - description: "Verdoppelt den Effekt von Beeren, indem es sie heranreifen lässt.", - }, - iceFace: { - name: "Tiefkühlkopf", - description: "Der Eisblock um seinen Kopf blockt eine physische Attacke ab. Dies bewirkt jedoch einen Formwechsel. Durch Hagel wird der Eisblock wiederhergestellt.", - }, - powerSpot: { - name: "Kraftquelle", - description: "Erhöht bei direkt benachbarten Pokémon die Stärke von Attacken.", - }, - mimicry: { - name: "Mimese", - description: "Der Typ des Pokémon ändert sich in Abhängigkeit vom Zustand des Feldes.", - }, - screenCleaner: { - name: "Hemmungslos", - description: "Hebt bei Kampfantritt die Wirkung von Lichtschild, Reflektor und Auroraschleier auf Mitstreiter- und Gegnerseite auf.", - }, - steelySpirit: { - name: "Stählerner Wille", - description: "Erhöht die Stärke von Stahl-Attacken auf Mitstreiterseite.", - }, - perishBody: { - name: "Unheilskörper", - description: "Erleidet es einen Treffer von einer direkten Attacke, wird es zusammen mit dem Angreifer nach drei Runden besiegt. Rettung ist durch Austausch möglich.", - }, - wanderingSpirit: { - name: "Rastlose Seele", - description: "Wird das Pokémon von einer direkten Attacke getroffen, tauscht es seine Fähigkeit mit der des Angreifers.", - }, - gorillaTactics: { - name: "Affenfokus", - description: "Erhöht den Angriff, aber nur die zuerst gewählte Attacke kann eingesetzt werden.", - }, - neutralizingGas: { - name: "Reaktionsgas", - description: "Solange ein Pokémon mit der Fähigkeit Reaktionsgas am Kampf beteiligt ist, werden die Fähigkeiten aller anderen Pokémon unterdrückt oder aufgehoben.", - }, - pastelVeil: { - name: "Pastellhülle", - description: "Schützt das Pokémon und seine Mitstreiter vor Vergiftung.", - }, - hungerSwitch: { - name: "Heißhunger", - description: "Das Pokémon ändert zum Ende jeder Runde seine Form und wechselt somit zwischen dem Pappsatt- und dem Kohldampfmuster.", - }, - quickDraw: { - name: "Schnellschuss", - description: "Ermöglicht dem Pokémon gelegentlich den Erstschlag.", - }, - unseenFist: { - name: "Verborgene Faust", - description: "Wenn das Pokémon eine direkte Attacke einsetzt, trifft diese auch dann, wenn sich das Ziel selbst schützt.", - }, - curiousMedicine: { - name: "Kuriose Arznei", - description: "Das Pokémon versprüht bei Kampfantritt Arznei aus seiner Muschel, die alle Statusveränderungen auf der Mitstreiterseite aufhebt.", - }, - transistor: { - name: "Transistor", - description: "Erhöht die Stärke von Elektro-Attacken.", - }, - dragonsMaw: { - name: "Drachenkiefer", - description: "Erhöht die Stärke von Drachen-Attacken.", - }, - chillingNeigh: { - name: "Helles Wiehern", - description: "Besiegt es ein Pokémon, stößt es ein frostiges Wiehern aus und erhöht damit seinen Angriff.", - }, - grimNeigh: { - name: "Dunkles Wiehern", - description: "Besiegt es ein Pokémon, stößt es ein furchteinflößendes Wiehern aus und erhöht damit seinen Spezial-Angriff.", - }, - asOneGlastrier: { - name: "Reitgespann", - description: "Das Pokémon verfügt sowohl über Coronospas Fähigkeit Anspannung als auch über Polaross’ Fähigkeit Helles Wiehern.", - }, - asOneSpectrier: { - name: "Reitgespann", - description: "Das Pokémon verfügt sowohl über Coronospas Fähigkeit Anspannung als auch über Phantoross’ Fähigkeit Dunkles Wiehern.", - }, - lingeringAroma: { - name: "Duftschwade", - description: "Das Pokémon überträgt bei Berührung die Fähigkeit Duftschwade auf den Angreifer.", - }, - seedSower: { - name: "Streusaat", - description: "Wird das Pokémon von einem Angriff getroffen, erzeugt es ein Grasfeld.", - }, - thermalExchange: { - name: "Thermowandel", - description: "Wird das Pokémon von einer Feuer-Attacke getroffen, steigt sein Angriff. Außerdem kann es keine Verbrennung erleiden.", - }, - angerShell: { - name: "Wutpanzer", - description: "Fallen die KP des Pokémon durch einen Angriff auf die Hälfte des Maximalwerts oder weniger, sinken Vert. und Sp.-Vert., aber Ang., Sp.-Ang. und Initiative steigen.", - }, - purifyingSalt: { - name: "Läutersalz", - description: "Das Pokémon kann dank seines läuternden Salzes keine Statusprobleme erleiden und der durch Geist-Attacken erlittene Schaden wird halbiert.", - }, - wellBakedBody: { - name: "Knusperkruste", - description: "Wird das Pokémon von einer Feuer-Attacke getroffen, erleidet es keinen Schaden. Stattdessen steigt seine Verteidigung stark.", - }, - windRider: { - name: "Windreiter", - description: "Wirkt Rückenwind oder wird das Pokémon von einer Wind-Attacke getroffen, steigt sein Angriff. Außerdem erleidet es keinen Schaden durch Wind-Attacken.", - }, - guardDog: { - name: "Wachhund", - description: "Wird das Pokémon bedroht, steigt sein Angriff. Attacken und Items, durch die Pokémon ausgetauscht werden, haben keine Wirkung auf es.", - }, - rockyPayload: { - name: "Steinträger", - description: "Die Stärke von Gesteins-Attacken des Pokémon steigt.", - }, - windPower: { - name: "Windkraft", - description: "Wird das Pokémon von einer Wind-Attacke getroffen, lädt es sich auf. Dadurch steigt die Stärke seiner nächsten Elektro-Attacke.", - }, - zeroToHero: { - name: "Superwechsel", - description: "Wird das Pokémon ausgewechselt, nimmt es die Heldenform an.", - }, - commander: { - name: "Kommandant", - description: "Befindet sich ein Heerashai auf der Mitstreiterseite, springt das Pokémon bei Kampfantritt in dessen Maul und gibt von dort aus Befehle.", - }, - electromorphosis: { - name: "Dynamo", - description: "Wenn das Pokémon Schaden erleidet, lädt es sich auf. Dadurch steigt die Stärke seiner nächsten Elektro-Attacke.", - }, - protosynthesis: { - name: "Paläosynthese", - description: "Bei Sonnenschein oder wenn das Pokémon eine Energiekapsel trägt, steigt sein höchster Statuswert.", - }, - quarkDrive: { - name: "Quantenantrieb", - description: "Im Elektrofeld oder wenn das Pokémon eine Energiekapsel trägt, steigt sein höchster Statuswert.", - }, - goodAsGold: { - name: "Goldkörper", - description: "Dank seines robusten Körpers aus reinem, rostfreiem Gold kann das Pokémon nicht von Status-Attacken getroffen werden.", - }, - vesselOfRuin: { - name: "Unheilsgefäß", - description: "Mit der Macht seines Unheil bringenden Gefäßes schwächt das Pokémon den Spezial-Angriff aller anderen Pokémon.", - }, - swordOfRuin: { - name: "Unheilsschwert", - description: "Mit der Macht seines Unheil bringenden Schwertes schwächt das Pokémon die Verteidigung aller anderen Pokémon.", - }, - tabletsOfRuin: { - name: "Unheilstafeln", - description: "Mit der Macht seiner Unheil bringenden Holztafeln schwächt das Pokémon den Angriff aller anderen Pokémon.", - }, - beadsOfRuin: { - name: "Unheilsjuwelen", - description: "Mit der Macht seiner Unheil bringenden Juwelen schwächt das Pokémon die Spezial-Verteidigung aller anderen Pokémon.", - }, - orichalcumPulse: { - name: "Orichalkum-Puls", - description: "Das Pokémon erzeugt bei Kampfantritt Sonnenschein. Bei Sonnenschein verstärkt ein urzeitlicher Puls seinen Angriff.", - }, - hadronEngine: { - name: "Hadronen-Motor", - description: "Das Pokémon erzeugt bei Kampfantritt ein Elektrofeld. Wenn ein Elektrofeld aktiv ist, verstärkt ein futuristischer Motor seinen Spezial-Angriff.", - }, - opportunist: { - name: "Profiteur", - description: "Wenn ein Statuswert eines Gegners steigt, profitiert das Pokémon ebenfalls davon und der gleiche Statuswert steigt auch bei ihm.", - }, - cudChew: { - name: "Wiederkäuer", - description: "Wenn ein Pokémon eine Beere isst, stößt es diese am Ende der nächsten Runde wieder aus seinem Magen auf und verspeist diese erneut.", - }, - sharpness: { - name: "Scharfkantig", - description: "Die Stärke von Schnitt-Attacken des Pokémon steigt.", - }, - supremeOverlord: { - name: "Feldherr", - description: "Bei Kampfantritt steigen der Angriff und Spezial-Angriff des Pokémon ein bisschen für jedes bis dahin besiegte Team-Mitglied.", - }, - costar: { - name: "Synchronauftritt", - description: "Das Pokémon kopiert bei Kampfantritt die Statusveränderungen eines Mitstreiters.", - }, - toxicDebris: { - name: "Giftbelag", - description: "Erleidet das Pokémon Schaden durch eine physische Attacke, verstreut es giftige Stacheln auf der gegnerischen Seite.", - }, - armorTail: { - name: "Schweifrüstung", - description: "Der rätselhafte Schweif, der den Kopf des Pokémon umhüllt, hindert Gegner daran, Erstschlag-Attacken gegen die Mitstreiterseite einzusetzen.", - }, - earthEater: { - name: "Bodenschmaus", - description: "Wird das Pokémon von einer Boden-Attacke getroffen, erleidet es keinen Schaden, sondern regeneriert stattdessen KP.", - }, - myceliumMight: { - name: "Myzelienkraft", - description: "Beim Einsatz von Status-Attacken handelt das Pokémon stets langsamer, aber dafür kann es sie ungeachtet der Fähigkeit des Zieles einsetzen.", - }, - mindsEye: { - name: "Geistiges Auge", - description: "Die Genauigkeit des Pokémon kann nicht gesenkt werden. Es ignoriert Änderungen am Ausweichwert des Zieles und trifft mit Normal- und Kampf-Attacken Geister-Pokémon.", - }, - supersweetSyrup: { - name: "Süßer Nektar", - description: "Beim ersten Kampfantritt verbreitet das Pokémon den Duft süßen Nektars und senkt so den Ausweichwert seiner Gegner.", - }, - hospitality: { - name: "Gastlichkeit", - description: "Bei Kampfantritt zeigt das Pokémon seine Gastlichkeit, indem es die KP seines Mitstreiters ein wenig auffüllt.", - }, - toxicChain: { - name: "Giftkette", - description: "Durch die toxischen Stoffe in seiner Kette werden Ziele, die das Pokémon mit einer Attacke trifft, gelegentlich schwer vergiftet.", - }, - embodyAspectTeal: { - name: "Erinnerungskraft", - description: "Die Erinnerungen, die das Pokémon in sich trägt, lassen die Türkisgrüne Maske aufleuchten und erhöhen seine Initiative.", - }, - embodyAspectWellspring: { - name: "Erinnerungskraft", - description: "Die Erinnerungen, die das Pokémon in sich trägt, lassen die Brunnenmaske aufleuchten und erhöhen seine Spezial-Verteidigung.", - }, - embodyAspectHearthflame: { - name: "Erinnerungskraft", - description: "Die Erinnerungen, die das Pokémon in sich trägt, lassen die Ofenmaske aufleuchten und erhöhen seinen Angriff.", - }, - embodyAspectCornerstone: { - name: "Erinnerungskraft", - description: "Die Erinnerungen, die das Pokémon in sich trägt, lassen die Fundamentmaske aufleuchten und erhöhen seine Verteidigung.", - }, - teraShift: { - name: "Tera-Wandel", - description: "Bei Kampfantritt absorbiert das Pokémon Energie in seiner Umgebung und nimmt die Terakristall-Form an.", - }, - teraShell: { - name: "Tera-Panzer", - description: "Der Panzer des Pokémon birgt die Kraft aller Typen in sich. Alle Schaden verursachenden Attacken, die es bei vollen KP treffen, sind nicht sehr effektiv.", - }, - teraformZero: { - name: "Teraforming Null", - description: "Wenn Terapagos die Stellarform annimmt, eliminiert es dank seiner verborgenen Kräfte sämtliche Wettereffekte und Felder.", - }, - poisonPuppeteer: { - name: "Giftpuppenspiel", - description: "Wenn Infamomo ein Ziel mit einer Attacke vergiftet, so wird dieses auch verwirrt.", - }, -} as const; diff --git a/src/locales/de/achv.json b/src/locales/de/achv.json new file mode 100644 index 00000000000..21a1d89f9d6 --- /dev/null +++ b/src/locales/de/achv.json @@ -0,0 +1,277 @@ +{ + "Achievements": { + "name": "Errungenschaften" + }, + "Locked": { + "name": "Gesperrt" + }, + "MoneyAchv": { + "description": "Häufe eine Gesamtsumme von {{moneyAmount}} ₽ an." + }, + "10K_MONEY": { + "name": "Besserverdiener", + "name_female": "Besserverdienerin" + }, + "100K_MONEY": { + "name": "Reich" + }, + "1M_MONEY": { + "name": "Millionär", + "name_female": "Millionärin" + }, + "10M_MONEY": { + "name": "Einprozenter" + }, + "DamageAchv": { + "description": "Füge mit einem Treffer {{damageAmount}} Schaden zu." + }, + "250_DMG": { + "name": "Harte Treffer" + }, + "1000_DMG": { + "name": "Härtere Treffer" + }, + "2500_DMG": { + "name": "Das ist ne Menge Schaden!" + }, + "10000_DMG": { + "name": "One Punch Man", + "name_female": "One Punch Woman" + }, + "HealAchv": { + "description": "Heile {{healAmount}} {{HP}} auf einmal. Mit einer Attacke, Fähigkeit oder einem gehaltenen Gegenstand." + }, + "250_HEAL": { + "name": "Anfänger-Heiler", + "name_female": "Anfänger-Heilerin" + }, + "1000_HEAL": { + "name": "Gesundheitsprofi" + }, + "2500_HEAL": { + "name": "Kleriker", + "name_female": "Klerikerin" + }, + "10000_HEAL": { + "name": "Wiederherstellungsmeister", + "name_female": "Wiederherstellungsmeisterin" + }, + "LevelAchv": { + "description": "Erhöhe das Level eines Pokémon auf {{level}}." + }, + "LV_100": { + "name": "Warte, es gibt mehr!" + }, + "LV_250": { + "name": "Elite" + }, + "LV_1000": { + "name": "Geh noch höher hinaus!" + }, + "RibbonAchv": { + "description": "Sammle insgesamt {{ribbonAmount}} Bänder." + }, + "10_RIBBONS": { + "name": "Champion der Pokémon Liga" + }, + "25_RIBBONS": { + "name": "Bänder-Sammler", + "name_female": "Bänder-Sammlerin" + }, + "50_RIBBONS": { + "name": "Bänder-Experte", + "name_female": "Bänder-Expertin" + }, + "75_RIBBONS": { + "name": "Bänder-Guru" + }, + "100_RIBBONS": { + "name": "Bänder-Meister", + "name_female": "Bänder-Meisterin" + }, + "TRANSFER_MAX_STAT_STAGE": { + "name": "Teamwork", + "description": "Nutze Staffette, während der Anwender mindestens eines Statuswertes maximiert hat." + }, + "MAX_FRIENDSHIP": { + "name": "Freundschaftsmaximierung", + "description": "Erreiche maximale Freundschaft bei einem Pokémon." + }, + "MEGA_EVOLVE": { + "name": "Megaverwandlung", + "description": "Megaentwickle ein Pokémon." + }, + "GIGANTAMAX": { + "name": "Absolute Einheit", + "description": "Gigadynamaximiere ein Pokémon." + }, + "TERASTALLIZE": { + "name": "Typen-Bonus Enthusiast", + "description": "Terrakristallisiere ein Pokémon." + }, + "STELLAR_TERASTALLIZE": { + "name": "Der geheime Typ", + "description": "Terrakristallisiere ein Pokémon zum Typen Stellar." + }, + "SPLICE": { + "name": "Unendliche Fusion", + "description": "Kombiniere zwei Pokémon mit einem DNS-Keil." + }, + "MINI_BLACK_HOLE": { + "name": "Ein Loch voller Items", + "description": "Erlange ein Mini-Schwarzes Loch." + }, + "CATCH_MYTHICAL": { + "name": "Mysteriöses!", + "description": "Fange ein mysteriöses Pokémon." + }, + "CATCH_SUB_LEGENDARY": { + "name": "Sub-Legendär", + "description": "Fange ein sub-legendäres Pokémon." + }, + "CATCH_LEGENDARY": { + "name": "Legendär", + "description": "Fange ein legendäres Pokémon." + }, + "SEE_SHINY": { + "name": "Schillerndes Licht", + "description": "Finde ein wildes schillerndes Pokémon." + }, + "SHINY_PARTY": { + "name": "Das ist Hingabe", + "description": "Habe ein Team aus schillernden Pokémon." + }, + "HATCH_MYTHICAL": { + "name": "Mysteriöses Ei", + "description": "Lass ein mysteriöses Pokémon aus einem Ei schlüpfen." + }, + "HATCH_SUB_LEGENDARY": { + "name": "Sub-Legendäres Ei", + "description": "Lass ein sub-legendäres Pokémon aus einem Ei schlüpfen." + }, + "HATCH_LEGENDARY": { + "name": "Legendäres Ei", + "description": "Lass ein legendäres Pokémon aus einem Ei schlüpfen." + }, + "HATCH_SHINY": { + "name": "Schillerndes Ei", + "description": "Lass ein schillerndes Pokémon aus einem Ei schlüpfen." + }, + "HIDDEN_ABILITY": { + "name": "Geheimes Talent", + "description": "Fang ein Pokémon mit versteckter Fähigkeit." + }, + "PERFECT_IVS": { + "name": "Zertifikat der Echtheit", + "description": "Erhalte ein Pokémon mit perfekten IS-Werten." + }, + "CLASSIC_VICTORY": { + "name": "Ungeschlagen", + "description": "Beende den klassischen Modus erfolgreich." + }, + "UNEVOLVED_CLASSIC_VICTORY": { + "name": "'Bringe dein Kind mit zur Arbeit'-Tag", + "description": "Beende den klassischen Modus erfolgreich mit mindestens einem nicht entwickeltem Pokémon in deinem Team" + }, + "MONO_GEN_ONE": { + "name": "Der originale Rivale", + "description": "Schließe die 'Nur 1. Generation' Herausforderung ab." + }, + "MONO_GEN_TWO": { + "name": "Generation 1.5", + "description": "Schließe die 'Nur 2. Generation' Herausforderung ab." + }, + "MONO_GEN_THREE": { + "name": "Zu viel Wasser?", + "description": "Schließe die 'Nur 3. Generation' Herausforderung ab." + }, + "MONO_GEN_FOUR": { + "name": "Ist SIE wirklich die Stärkste?", + "description": "Schließe die 'Nur 4. Generation' Herausforderung ab." + }, + "MONO_GEN_FIVE": { + "name": "Komplett Original", + "description": "Schließe die 'Nur 5. Generation' Herausforderung ab." + }, + "MONO_GEN_SIX": { + "name": "Fast Königlich", + "description": "Schließe die 'Nur 6. Generation' Herausforderung ab." + }, + "MONO_GEN_SEVEN": { + "name": "Technisch gesehen", + "description": "Schließe die 'Nur 7. Generation' Herausforderung ab." + }, + "MONO_GEN_EIGHT": { + "name": "Die Zeit des Champions", + "description": "Schließe die 'Nur 8. Generation' Herausforderung ab." + }, + "MONO_GEN_NINE": { + "name": "Sie hat es dir leicht gemacht...", + "description": "Schließe die 'Nur 9. Generation' Herausforderung ab." + }, + "MonoType": { + "description": "Beende die Monotyp-{{type}} Herausforderung." + }, + "MONO_NORMAL": { + "name": "Normaler Typ" + }, + "MONO_FIGHTING": { + "name": "Ich kenne Kung Fu." + }, + "MONO_FLYING": { + "name": "Ich glaube ich kann fliegen." + }, + "MONO_POISON": { + "name": "Kantos Liebling" + }, + "MONO_GROUND": { + "name": "Auf dem Boden bleiben." + }, + "MONO_ROCK": { + "name": "So hart wie Rocko." + }, + "MONO_BUG": { + "name": "Steche wie ein Bibor." + }, + "MONO_GHOST": { + "name": "Wer wird angerufen?" + }, + "MONO_STEEL": { + "name": "Stahlharte Entschlossenheit" + }, + "MONO_FIRE": { + "name": "Brennende Leidenschaft" + }, + "MONO_WATER": { + "name": "Wenn es regnet, schüttet es!" + }, + "MONO_GRASS": { + "name": "Grüner Daumen" + }, + "MONO_ELECTRIC": { + "name": "Elektrisierend" + }, + "MONO_PSYCHIC": { + "name": "Übernatürliches Talent" + }, + "MONO_ICE": { + "name": "Eis Eis Baby" + }, + "MONO_DRAGON": { + "name": "Siegfried bist du es?" + }, + "MONO_DARK": { + "name": "Es ist nur eine Phase!" + }, + "MONO_FAIRY": { + "name": "Ein ewiges Abenteuer!" + }, + "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" + } +} diff --git a/src/locales/de/achv.ts b/src/locales/de/achv.ts deleted file mode 100644 index 6040c3ea916..00000000000 --- a/src/locales/de/achv.ts +++ /dev/null @@ -1,377 +0,0 @@ -import {AchievementTranslationEntries} from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "Achievements": { - name: "Errungenschaften", - }, - "Locked": { - name: "Gesperrt", - }, - - - "MoneyAchv": { - description: "Häufe eine Gesamtsumme von {{moneyAmount}} ₽ an.", - }, - "10K_MONEY": { - name: "Besserverdiener", - }, - "100K_MONEY": { - name: "Reich", - }, - "1M_MONEY": { - name: "Millionär", - }, - "10M_MONEY": { - name: "Einprozenter", - }, - - "DamageAchv": { - description: "Füge mit einem Treffer {{damageAmount}} Schaden zu.", - }, - "250_DMG": { - name: "Harte Treffer", - }, - "1000_DMG": { - name: "Härtere Treffer", - }, - "2500_DMG": { - name: "Das ist ne Menge Schaden!", - }, - "10000_DMG": { - name: "One Punch Man", - }, - - "HealAchv": { - description: "Heile {{healAmount}} {{HP}} auf einmal. Mit einer Attacke, Fähigkeit oder einem gehaltenen Gegenstand.", - }, - "250_HEAL": { - name: "Anfänger-Heiler", - }, - "1000_HEAL": { - name: "Gesundheitsprofi", - }, - "2500_HEAL": { - name: "Kleriker", - }, - "10000_HEAL": { - name: "Wiederherstellungsmeister", - }, - - "LevelAchv": { - description: "Erhöhe das Level eines Pokémon auf {{level}}.", - }, - "LV_100": { - name: "Warte, es gibt mehr!", - }, - "LV_250": { - name: "Elite", - }, - "LV_1000": { - name: "Geh noch höher hinaus!", - }, - - "RibbonAchv": { - description: "Sammle insgesamt {{ribbonAmount}} Bänder.", - }, - "10_RIBBONS": { - name: "Champion der Pokémon Liga", - }, - "25_RIBBONS": { - name: "Bänder-Sammler", - }, - "50_RIBBONS": { - name: "Bänder-Experte", - }, - "75_RIBBONS": { - name: "Bänder-Guru", - }, - "100_RIBBONS": { - name: "Bänder-Meister", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "Teamwork", - description: "Nutze Staffette, während der Anwender mindestens eines Statuswertes maximiert hat.", - }, - "MAX_FRIENDSHIP": { - name: "Freundschaftsmaximierung", - description: "Erreiche maximale Freundschaft bei einem Pokémon.", - }, - "MEGA_EVOLVE": { - name: "Megaverwandlung", - description: "Megaentwickle ein Pokémon.", - }, - "GIGANTAMAX": { - name: "Absolute Einheit", - description: "Gigadynamaximiere ein Pokémon.", - }, - "TERASTALLIZE": { - name: "Typen-Bonus Enthusiast", - description: "Terrakristallisiere ein Pokémon.", - }, - "STELLAR_TERASTALLIZE": { - name: "Der geheime Typ", - description: "Terrakristallisiere ein Pokémon zum Typen Stellar.", - }, - "SPLICE": { - name: "Unendliche Fusion", - description: "Kombiniere zwei Pokémon mit einem DNS-Keil.", - }, - "MINI_BLACK_HOLE": { - name: "Ein Loch voller Items", - description: "Erlange ein Mini-Schwarzes Loch.", - }, - "CATCH_MYTHICAL": { - name: "Mysteriöses!", - description: "Fange ein mysteriöses Pokémon.", - }, - "CATCH_SUB_LEGENDARY": { - name: "Sub-Legendär", - description: "Fange ein sub-legendäres Pokémon.", - }, - "CATCH_LEGENDARY": { - name: "Legendär", - description: "Fange ein legendäres Pokémon.", - }, - "SEE_SHINY": { - name: "Schillerndes Licht", - description: "Finde ein wildes schillerndes Pokémon.", - }, - "SHINY_PARTY": { - name: "Das ist Hingabe", - description: "Habe ein Team aus schillernden Pokémon.", - }, - "HATCH_MYTHICAL": { - name: "Mysteriöses Ei", - description: "Lass ein mysteriöses Pokémon aus einem Ei schlüpfen.", - }, - "HATCH_SUB_LEGENDARY": { - name: "Sub-Legendäres Ei", - description: "Lass ein sub-legendäres Pokémon aus einem Ei schlüpfen.", - }, - "HATCH_LEGENDARY": { - name: "Legendäres Ei", - description: "Lass ein legendäres Pokémon aus einem Ei schlüpfen.", - }, - "HATCH_SHINY": { - name: "Schillerndes Ei", - description: "Lass ein schillerndes Pokémon aus einem Ei schlüpfen.", - }, - "HIDDEN_ABILITY": { - name: "Geheimes Talent", - description: "Fang ein Pokémon mit versteckter Fähigkeit.", - }, - "PERFECT_IVS": { - name: "Zertifikat der Echtheit", - description: "Erhalte ein Pokémon mit perfekten IS-Werten.", - }, - "CLASSIC_VICTORY": { - name: "Ungeschlagen", - description: "Beende den klassischen Modus erfolgreich.", - }, - "MONO_GEN_ONE": { - name: "Der originale Rivale", - description: "Schließe die 'Nur 1. Generation' Herausforderung ab.", - }, - "MONO_GEN_TWO": { - name: "Generation 1.5", - description: "Schließe die 'Nur 2. Generation' Herausforderung ab.", - }, - "MONO_GEN_THREE": { - name: "Zu viel Wasser?", - description: "Schließe die 'Nur 3. Generation' Herausforderung ab.", - }, - "MONO_GEN_FOUR": { - name: "Ist SIE wirklich die Stärkste?", - description: "Schließe die 'Nur 4. Generation' Herausforderung ab.", - }, - "MONO_GEN_FIVE": { - name: "Komplett Original", - description: "Schließe die 'Nur 5. Generation' Herausforderung ab.", - }, - "MONO_GEN_SIX": { - name: "Fast Königlich", - description: "Schließe die 'Nur 6. Generation' Herausforderung ab." - }, - "MONO_GEN_SEVEN": { - name: "Technisch gesehen", - description: "Schließe die 'Nur 7. Generation' Herausforderung ab." - }, - "MONO_GEN_EIGHT": { - name: "Die Zeit des Champions", - description: "Schließe die 'Nur 8. Generation' Herausforderung ab." - }, - "MONO_GEN_NINE": { - name: "Sie hat es dir leicht gemacht...", - description: "Schließe die 'Nur 9. Generation' Herausforderung ab." - }, - - "MonoType": { - description: "Beende die Monotyp-{{type}} Herausforderung." - }, - "MONO_NORMAL": { - name: "Normaler Typ", - }, - "MONO_FIGHTING": { - name: "Ich kenne Kung Fu." - }, - "MONO_FLYING": { - name: "Ich glaube ich kann fliegen.", - }, - "MONO_POISON": { - name: "Kantos Liebling", - }, - "MONO_GROUND": { - name: "Auf dem Boden bleiben.", - }, - "MONO_ROCK": { - name: "So hart wie Rocko.", - }, - "MONO_BUG": { - name: "Steche wie ein Bibor.", - }, - "MONO_GHOST": { - name: "Wer wird angerufen?", - }, - "MONO_STEEL": { - name: "Stahlharte Entschlossenheit", - }, - "MONO_FIRE": { - name: "Brennende Leidenschaft", - }, - "MONO_WATER": { - name: "Wenn es regnet, schüttet es!", - }, - "MONO_GRASS": { - name: "Grüner Daumen", - }, - "MONO_ELECTRIC": { - name: "Elektrisierend", - }, - "MONO_PSYCHIC": { - name: "Übernatürliches Talent", - }, - "MONO_ICE": { - name: "Eis Eis Baby", - }, - "MONO_DRAGON": { - name: "Siegfried bist du es?", - }, - "MONO_DARK": { - name: "Es ist nur eine Phase!", - }, - "MONO_FAIRY": { - name: "Ein ewiges Abenteuer!", - }, -} as const; - -// Achievement translations for the when the player character is female -export const PGFachv: AchievementTranslationEntries = { - "Achievements": { - name: PGMachv.Achievements.name, - }, - "Locked": { - name: PGMachv.Locked.name, - }, - - - "MoneyAchv": PGMachv.MoneyAchv, - "10K_MONEY": { - name: "Besserverdienerin", - }, - "100K_MONEY": PGMachv["100K_MONEY"], - "1M_MONEY": { - name: "Millionärin", - }, - "10M_MONEY": PGMachv["10M_MONEY"], - - "DamageAchv": PGMachv.DamageAchv, - "250_DMG": PGMachv["250_DMG"], - "1000_DMG": PGMachv["1000_DMG"], - "2500_DMG": PGMachv["2500_DMG"], - "10000_DMG": { - name: "One Punch Woman", - }, - - "HealAchv": PGMachv.HealAchv, - "250_HEAL": { - name: "Anfänger-Heilerin", - }, - "1000_HEAL": PGMachv["1000_HEAL"], - "2500_HEAL": { - name: "Klerikerin", - }, - "10000_HEAL": { - name: "Wiederherstellungsmeisterin", - }, - - "LevelAchv": PGMachv.LevelAchv, - "LV_100": PGMachv["LV_100"], - "LV_250": PGMachv["LV_250"], - "LV_1000": PGMachv["LV_1000"], - - "RibbonAchv": PGMachv.RibbonAchv, - "10_RIBBONS": PGMachv["10_RIBBONS"], - "25_RIBBONS": { - name: "Bänder-Sammlerin", - }, - "50_RIBBONS": { - name: "Bänder-Expertin", - }, - "75_RIBBONS": PGMachv["75_RIBBONS"], - "100_RIBBONS": { - name: "Bänder-Meisterin", - }, - - "TRANSFER_MAX_BATTLE_STAT": PGMachv.TRANSFER_MAX_BATTLE_STAT, - "MAX_FRIENDSHIP": PGMachv.MAX_FRIENDSHIP, - "MEGA_EVOLVE": PGMachv.MEGA_EVOLVE, - "GIGANTAMAX": PGMachv.GIGANTAMAX, - "TERASTALLIZE": PGMachv.TERASTALLIZE, - "STELLAR_TERASTALLIZE": PGMachv.STELLAR_TERASTALLIZE, - "SPLICE": PGMachv.SPLICE, - "MINI_BLACK_HOLE": PGMachv.MINI_BLACK_HOLE, - "CATCH_MYTHICAL": PGMachv.CATCH_MYTHICAL, - "CATCH_SUB_LEGENDARY": PGMachv.CATCH_SUB_LEGENDARY, - "CATCH_LEGENDARY": PGMachv.CATCH_LEGENDARY, - "SEE_SHINY": PGMachv.SEE_SHINY, - "SHINY_PARTY": PGMachv.SHINY_PARTY, - "HATCH_MYTHICAL": PGMachv.HATCH_MYTHICAL, - "HATCH_SUB_LEGENDARY": PGMachv.HATCH_SUB_LEGENDARY, - "HATCH_LEGENDARY": PGMachv.HATCH_LEGENDARY, - "HATCH_SHINY": PGMachv.HATCH_SHINY, - "HIDDEN_ABILITY": PGMachv.HIDDEN_ABILITY, - "PERFECT_IVS": PGMachv.PERFECT_IVS, - "CLASSIC_VICTORY": PGMachv.CLASSIC_VICTORY, - "MONO_GEN_ONE": PGMachv.MONO_GEN_ONE, - "MONO_GEN_TWO": PGMachv.MONO_GEN_TWO, - "MONO_GEN_THREE": PGMachv.MONO_GEN_THREE, - "MONO_GEN_FOUR": PGMachv.MONO_GEN_FOUR, - "MONO_GEN_FIVE": PGMachv.MONO_GEN_FIVE, - "MONO_GEN_SIX": PGMachv.MONO_GEN_SIX, - "MONO_GEN_SEVEN": PGMachv.MONO_GEN_SEVEN, - "MONO_GEN_EIGHT": PGMachv.MONO_GEN_EIGHT, - "MONO_GEN_NINE": PGMachv.MONO_GEN_NINE, - - "MonoType": PGMachv.MonoType, - "MONO_NORMAL": PGMachv.MONO_NORMAL, - "MONO_FIGHTING": PGMachv.MONO_FIGHTING, - "MONO_FLYING": PGMachv.MONO_FLYING, - "MONO_POISON": PGMachv.MONO_POISON, - "MONO_GROUND": PGMachv.MONO_GROUND, - "MONO_ROCK": PGMachv.MONO_ROCK, - "MONO_BUG": PGMachv.MONO_BUG, - "MONO_GHOST": PGMachv.MONO_GHOST, - "MONO_STEEL": PGMachv.MONO_STEEL, - "MONO_FIRE": PGMachv.MONO_FIRE, - "MONO_WATER": PGMachv.MONO_WATER, - "MONO_GRASS": PGMachv.MONO_GRASS, - "MONO_ELECTRIC": PGMachv.MONO_ELECTRIC, - "MONO_PSYCHIC": PGMachv.MONO_PSYCHIC, - "MONO_ICE": PGMachv.MONO_ICE, - "MONO_DRAGON": PGMachv.MONO_DRAGON, - "MONO_DARK": PGMachv.MONO_DARK, - "MONO_FAIRY": PGMachv.MONO_FAIRY, -} as const; - diff --git a/src/locales/de/arena-flyout.json b/src/locales/de/arena-flyout.json new file mode 100644 index 00000000000..a1f2254c642 --- /dev/null +++ b/src/locales/de/arena-flyout.json @@ -0,0 +1,41 @@ +{ + "activeBattleEffects": "Aktive Kampfeffekte", + "player": "Spieler", + "neutral": "Neutral", + "enemy": "Gegner", + "sunny": "Sonne", + "rain": "Regen", + "sandstorm": "Sandsturm", + "hail": "Hagelsturm", + "snow": "Schneesturm", + "fog": "Nebel", + "heavyRain": "Strömender Regen", + "harshSun": "Sehr starker Sonnenschein", + "strongWinds": "Luftströmungen", + "misty": "Nebelfeld", + "electric": "Elektrofeld", + "grassy": "Grasfeld", + "psychic": "Psychofeld", + "mudSport": "Lehmsuhler", + "waterSport": "Nassmacher", + "spikes": "Stachler", + "toxicSpikes": "Giftspitzen", + "mist": "Weißnebel", + "futureSight": "Seher", + "doomDesire": "Kismetwunsch", + "wish": "Wunschtraum", + "stealthRock": "Tarnsteine", + "stickyWeb": "Klebenetz", + "trickRoom": "Bizarroraum", + "gravity": "Erdanziehung", + "reflect": "Reflektor", + "lightScreen": "Lichtschild", + "auroraVeil": "Auroraschleier", + "quickGuard": "Rapidschutz", + "wideGuard": "Rundumschutz", + "matBlock": "Tatami-Schild", + "craftyShield": "Trickschutz", + "tailwind": "Rückenwind", + "happyHour": "Goldene Zeiten", + "safeguard": "Bodyguard" +} diff --git a/src/locales/de/arena-tag.json b/src/locales/de/arena-tag.json new file mode 100644 index 00000000000..3bed4fefbd0 --- /dev/null +++ b/src/locales/de/arena-tag.json @@ -0,0 +1,57 @@ +{ + "yourTeam": "Pokémon auf deiner Seite", + "opposingTeam": "Pokémon auf gegnerischer Seite", + "arenaOnRemove": "Der Effekt von {{moveName}} lässt nach!", + "arenaOnRemovePlayer": "Der Effekt von {{moveName}} lässt auf deiner Seite nach!", + "arenaOnRemoveEnemy": "Der Effekt von {{moveName}} lässt auf der Seite des Gegners nach!", + "mistOnAdd": "Pokémon, die auf der Seite von {{pokemonNameWithAffix}} kämpfen, werden in Weißnebel gehüllt!!", + "mistApply": "Der Weißnebel verhindert die Senkung von Statuswerten!", + "reflectOnAdd": "Reflektor stärkt Pokémon gegen physische Attacken!", + "reflectOnAddPlayer": "Reflektor stärkt Pokémon auf deiner Seite gegen physische Attacken!", + "reflectOnAddEnemy": "Reflektor stärkt gegnerische Pokémon gegen physische Attacken!", + "lightScreenOnAdd": "Lichtschild stärkt Pokémon gegen Spezial-Attacken!", + "lightScreenOnAddPlayer": "Lichtschild stärkt Pokémon, die auf deiner Seite kämpfen, gegen Spezial-Attacken!", + "lightScreenOnAddEnemy": "Lichtschild stärkt gegnerische Pokémon gegen Spezial-Attacken!", + "auroraVeilOnAdd": "Auroraschleier stärkt Pokémon gegen physische und Spezial-Attacken", + "auroraVeilOnAddPlayer": "Auroraschleier stärkt Pokémon auf deiner Seite gegen physische und Spezial-Attacken!", + "auroraVeilOnAddEnemy": "Auroraschleier stärkt gegnerische Pokémon gegen physische und Spezial-Attacken!", + "conditionalProtectOnAdd": "Die Pokémon werden von {{moveName}} behütet!", + "conditionalProtectOnAddPlayer": "Die Pokémon auf deiner Seite werden von {{moveName}} behütet!", + "conditionalProtectOnAddEnemy": "Die Pokémon auf der gegnerischen Seite werden von {{moveName}} behütet!", + "conditionalProtectApply": "{{pokemonNameWithAffix}} wird durch {{moveName}} geschützt!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} bringt seinen Tatami-Schild in Position!", + "noCritOnAddPlayer": "{{moveName}} schützt dein Team vor Volltreffern!", + "noCritOnAddEnemy": "{{moveName}} schützt das gegnerische Team vor Volltreffern!", + "noCritOnRemove": "{{moveName}} von {{pokemonNameWithAffix}} hört auf zu wirken!", + "wishTagOnAdd": "Der Wunschtraum von {{pokemonNameWithAffix}} erfüllt sich!", + "mudSportOnAdd": "Die Stärke aller Elektro-Attacken wurde reduziert!", + "mudSportOnRemove": "Lehmsuhler hört auf zu wirken!", + "waterSportOnAdd": "Die Stärke aller Feuer-Attacken wurde reduziert!", + "waterSportOnRemove": "Nassmacher hört auf zu wirken!", + "spikesOnAdd": "Die {{opponentDesc}} sind von Stacheln umgeben!", + "spikesActivateTrap": "Die {{pokemonNameWithAffix}} wurde durch Stachler verletzt!!", + "toxicSpikesOnAdd": "Die {{opponentDesc}} sind überall von giftigen Stacheln umgeben", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbiert die {{moveName}}!", + "stealthRockOnAdd": "Um die {{opponentDesc}} schweben spitze Steine!", + "stealthRockActivateTrap": "{{pokemonNameWithAffix}} wird von spitzen Steinen getroffen!!", + "stickyWebOnAdd": "Am Boden um die {{opponentDesc}} entspinnt sich ein {{moveName}}!", + "stickyWebActivateTrap": "{{pokemonName}} ist im Klebenetz gefangen!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} hat die Dimensionen verdreht!", + "trickRoomOnRemove": "Die verdrehte Dimension ist wieder normal!", + "gravityOnAdd": "Die Erdanziehung wurde verstärkt!", + "gravityOnRemove": "Die Erdanziehung ist wieder normal!", + "tailwindOnAdd": "Die Pokémon erhalten Rückenwind!", + "tailwindOnAddPlayer": "Die Pokémon, die auf deiner Seite kämpfen, erhalten Rückenwind!", + "tailwindOnAddEnemy": "Die gegnerischen Pokémon erhalten Rückenwind!", + "tailwindOnRemove": "Der Rückenwind hat sich gelegt!", + "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!", + "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-info.json b/src/locales/de/battle-info.json new file mode 100644 index 00000000000..f7844273af8 --- /dev/null +++ b/src/locales/de/battle-info.json @@ -0,0 +1,3 @@ +{ + "generation": "Generation {{generation}}" +} \ No newline at end of file diff --git a/src/locales/de/battle-message-ui-handler.json b/src/locales/de/battle-message-ui-handler.json new file mode 100644 index 00000000000..0d8038b5a85 --- /dev/null +++ b/src/locales/de/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "Sensationell", + "ivFantastic": "Fantastisch", + "ivVeryGood": "Sehr Gut", + "ivPrettyGood": "Gut", + "ivDecent": "Nicht Übel", + "ivNoGood": "Schlecht" +} \ No newline at end of file diff --git a/src/locales/de/battle-message-ui-handler.ts b/src/locales/de/battle-message-ui-handler.ts deleted file mode 100644 index cc1deccbaa2..00000000000 --- a/src/locales/de/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "Sensationell", - "ivFantastic": "Fantastisch", - "ivVeryGood": "Sehr Gut", - "ivPrettyGood": "Gut", - "ivDecent": "Nicht Übel", - "ivNoGood": "Schlecht", -} as const; diff --git a/src/locales/de/battle-scene.json b/src/locales/de/battle-scene.json new file mode 100644 index 00000000000..ef916edbf08 --- /dev/null +++ b/src/locales/de/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "{{formattedMoney}} ₽" +} \ No newline at end of file diff --git a/src/locales/de/battle.json b/src/locales/de/battle.json new file mode 100644 index 00000000000..38e36d4b2da --- /dev/null +++ b/src/locales/de/battle.json @@ -0,0 +1,100 @@ +{ + "bossAppeared": "{{bossName}} erscheint.", + "trainerAppeared": "{{trainerName}} möchte kämpfen!", + "trainerAppearedDouble": "{{trainerName}} möchten kämpfen!", + "trainerSendOut": "{{trainerName}} setzt {{pokemonName}} ein!", + "singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!", + "multiWildAppeared": "Ein wildes {{pokemonName1}} und {{pokemonName2}} erscheinen!", + "playerComeBack": "Komm zurück, {{pokemonName}}!", + "trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!", + "playerGo": "Los! {{pokemonName}}!", + "trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!", + "switchQuestion": "Möchtest du {{pokemonName}} auswechseln?", + "trainerDefeated": "{{trainerName}} wurde besiegt!", + "moneyWon": "Du gewinnst {{moneyAmount}} ₽!", + "moneyPickedUp": "Du hebst {{moneyAmount}} ₽ auf!", + "pokemonCaught": "{{pokemonName}} wurde gefangen!", + "addedAsAStarter": "{{pokemonName}} wurde als Starterpokémon hinzugefügt!", + "partyFull": "Dein Team ist voll. Möchtest du ein Pokémon durch {{pokemonName}} ersetzen?", + "pokemon": "Pokémon", + "sendOutPokemon": "Los, {{pokemonName}}!", + "hitResultCriticalHit": "Ein Volltreffer!", + "hitResultSuperEffective": "Das ist sehr effektiv!", + "hitResultNotVeryEffective": "Das ist nicht sehr effektiv…", + "hitResultNoEffect": "Es hat keine Wirkung auf {{pokemonName}}…", + "hitResultImmune": "{{pokemonName}} ist unversehrt!", + "hitResultOneHitKO": "Ein K.O.-Treffer!", + "attackFailed": "Es ist fehlgeschlagen!", + "attackMissed": "Die Attacke hat {{pokemonNameWithAffix}} verfehlt!", + "attackHitsCount": "{{count}}-mal getroffen!", + "rewardGain": "Du erhältst {{modifierName}}!", + "expGain": "{{pokemonName}} erhält {{exp}} Erfahrungspunkte!", + "levelUp": "{{pokemonName}} erreicht Lv. {{level}}!", + "learnMove": "{{pokemonName}} erlernt {{moveName}}!", + "learnMovePrompt": "{{pokemonName}} versucht, {{moveName}} zu erlernen.", + "learnMoveLimitReached": "Aber {{pokemonName}} kann nur maximal vier Attacken erlernen.", + "learnMoveReplaceQuestion": "Soll eine bekannte Attacke durch {{moveName}} ersetzt werden?", + "learnMoveStopTeaching": "{{moveName}} nicht erlernen?", + "learnMoveNotLearned": "{{pokemonName}} hat {{moveName}} nicht erlernt.", + "learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?", + "learnMoveForgetSuccess": "{{pokemonName}} hat {{moveName}} vergessen.", + "countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}schwupp!", + "learnMoveAnd": "Und…", + "levelCapUp": "Die Levelbeschränkung wurde auf {{levelCap}} erhöht!", + "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", + "moveNoPP": "Es sind keine AP für diese Attacke mehr übrig!", + "moveDisabled": "{{moveName}} ist deaktiviert!", + "disableInterruptedMove": "{{moveName}} von {{pokemonNameWithAffix}} ist blockiert!", + "noPokeballForce": "Eine unsichtbare Kraft verhindert die Nutzung von Pokébällen.", + "noPokeballTrainer": "Du kannst das Pokémon eines anderen Trainers nicht fangen!", + "noPokeballMulti": "Du kannst erst einen Pokéball werfen, wenn nur noch ein Pokémon übrig ist!", + "noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden! Du musst es zuerst schwächen!", + "noEscapeForce": "Eine unsichtbare Kraft verhindert die Flucht.", + "noEscapeTrainer": "Du kannst nicht aus einem Trainerkampf fliehen!", + "noEscapePokemon": "{{moveName}} von {{pokemonName}} verhindert {{escapeVerb}}!", + "runAwaySuccess": "Du bist entkommen!", + "runAwayCannotEscape": "Flucht gescheitert!", + "escapeVerbSwitch": "auswechseln", + "escapeVerbFlee": "flucht", + "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", + "itemStackFull": "Du hast bereits zu viele von {{fullItemName}}. Du erhältst stattdessen {{itemName}}.", + "notDisabled": "{{moveName}} von {{pokemonName}} ist nicht mehr deaktiviert!", + "turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.", + "hpIsFull": "Die KP von {{pokemonName}} sind voll!", + "eggHatching": "Oh?", + "ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?", + "wildPokemonWithAffix": "{{pokemonName}} (wild)", + "foePokemonWithAffix": "{{pokemonName}} (Gegner)", + "useMove": "{{pokemonNameWithAffix}} setzt {{moveName}} ein!", + "drainMessage": "{{pokemonName}} wurde Energie abgesaugt", + "regainHealth": "KP von {{pokemonName}} wurden wieder aufgefrischt!", + "stealEatBerry": "{{pokemonName}} hat {{targetName}} seine {{berryName}} weggefuttert!", + "ppHealBerry": "{{berryName}} von {{pokemonNameWithAffix}} füllt AP von {{moveName}} auf!", + "hpHealBerry": "{{berryName}} füllt KP von {{pokemonNameWithAffix}} auf!", + "fainted": "{{pokemonNameWithAffix}} wurde besiegt!", + "statsAnd": "und", + "stats": "Alle Werte", + "statRose_one": "{{stats}} von {{pokemonNameWithAffix}} steigt!", + "statRose_other": "{{stats}} von {{pokemonNameWithAffix}} steigen!", + "statSharplyRose_one": "{{stats}} von {{pokemonNameWithAffix}} steigt stark!", + "statSharplyRose_other": "{{stats}} von {{pokemonNameWithAffix}} steigen stark!", + "statRoseDrastically_one": "{{stats}} von {{pokemonNameWithAffix}} steigt drastisch!", + "statRoseDrastically_other": "{{stats}} von {{pokemonNameWithAffix}} steigen drastisch!", + "statWontGoAnyHigher_one": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter erhöht werden!", + "statWontGoAnyHigher_other": "{{stats}} von {{pokemonNameWithAffix}} können nicht weiter erhöht werden!", + "statFell_one": "{{stats}} von {{pokemonNameWithAffix}} sinkt!", + "statFell_other": "{{stats}} von {{pokemonNameWithAffix}} sinken!", + "statHarshlyFell_one": "{{stats}} von {{pokemonNameWithAffix}} sinkt stark!", + "statHarshlyFell_other": "{{stats}} von {{pokemonNameWithAffix}} sinken stark!", + "statSeverelyFell_one": "{{stats}} von {{pokemonNameWithAffix}} sinkt drastisch!", + "statSeverelyFell_other": "{{stats}} von {{pokemonNameWithAffix}} sinken drastisch!", + "statWontGoAnyLower_one": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter sinken!", + "statWontGoAnyLower_other": "{{stats}} von {{pokemonNameWithAffix}} können nicht weiter sinken!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "ppReduced": "{{moveName}} von {{targetName}} wird um {{reduction}} AP reduziert!", + "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}}!", + "eggSkipPrompt": "Zur Ei-Zusammenfassung springen?" +} diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts deleted file mode 100644 index 67c2cd9a6b0..00000000000 --- a/src/locales/de/battle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "{{bossName}} erscheint.", - "trainerAppeared": "{{trainerName}}\nmöchte kämpfen!", - "trainerAppearedDouble": "{{trainerName}}\nmöchten kämpfen!", - "trainerSendOut": "{{trainerName}} setzt\n{{pokemonName}} ein!", - "singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!", - "multiWildAppeared": "Ein wildes {{pokemonName1}}\nund {{pokemonName2}} erscheinen!", - "playerComeBack": "Komm zurück, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!", - "playerGo": "Los! {{pokemonName}}!", - "trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!", - "switchQuestion": "Möchtest du\n{{pokemonName}} auswechseln?", - "trainerDefeated": "{{trainerName}}\nwurde besiegt!", - "moneyWon": "Du gewinnst\n{{moneyAmount}} ₽!", - "pokemonCaught": "{{pokemonName}} wurde gefangen!", - "addedAsAStarter": "{{pokemonName}} wurde als Starterpokémon hinzugefügt!", - "partyFull": "Dein Team ist voll.\nMöchtest du ein Pokémon durch {{pokemonName}} ersetzen?", - "pokemon": "Pokémon", - "sendOutPokemon": "Los, {{pokemonName}}!", - "hitResultCriticalHit": "Ein Volltreffer!", - "hitResultSuperEffective": "Das ist sehr effektiv!", - "hitResultNotVeryEffective": "Das ist nicht sehr effektiv…", - "hitResultNoEffect": "Es hat keine Wirkung auf {{pokemonName}}…", - "hitResultOneHitKO": "Ein K.O.-Treffer!", - "attackFailed": "Es ist fehlgeschlagen!", - "attackHitsCount": "{{count}}-mal getroffen!", - "rewardGain": "Du erhältst\n{{modifierName}}!", - "expGain": "{{pokemonName}} erhält\n{{exp}} Erfahrungspunkte!", - "levelUp": "{{pokemonName}} erreicht\nLv. {{level}}!", - "learnMove": "{{pokemonName}} erlernt\n{{moveName}}!", - "learnMovePrompt": "{{pokemonName}} versucht, {{moveName}} zu erlernen.", - "learnMoveLimitReached": "Aber {{pokemonName}} kann nur\nmaximal vier Attacken erlernen.", - "learnMoveReplaceQuestion": "Soll eine bekannte Attacke durch\n{{moveName}} ersetzt werden?", - "learnMoveStopTeaching": "{{moveName}} nicht\nerlernen?", - "learnMoveNotLearned": "{{pokemonName}} hat\n{{moveName}} nicht erlernt.", - "learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?", - "learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.", - "countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!", - "learnMoveAnd": "Und…", - "levelCapUp": "Die Levelbeschränkung\nwurde auf {{levelCap}} erhöht!", - "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", - "moveNoPP": "Es sind keine AP für\ndiese Attacke mehr übrig!", - "moveDisabled": "{{moveName}} ist deaktiviert!", - "noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.", - "noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!", - "noPokeballMulti": "Du kannst erst einen Pokéball werfen,\nwenn nur noch ein Pokémon übrig ist!", - "noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden!\nDu musst es zuerst schwächen!", - "noEscapeForce": "Eine unsichtbare Kraft\nverhindert die Flucht.", - "noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!", - "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!", - "runAwaySuccess": "Du bist entkommen!", - "runAwayCannotEscape": "Flucht gescheitert!", - "escapeVerbSwitch": "auswechseln", - "escapeVerbFlee": "flucht", - "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", - "notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!", - "turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.", - "hpIsFull": "Die KP von {{pokemonName}} sind voll!", - "eggHatching": "Oh?", - "ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?", - "wildPokemonWithAffix": "{{pokemonName}} (wild)", - "foePokemonWithAffix": "{{pokemonName}} (Gegner)", - "useMove": "{{pokemonNameWithAffix}} setzt {{moveName}} ein!", - "drainMessage": "{{pokemonName}} wurde Energie abgesaugt", - "regainHealth": "KP von {{pokemonName}} wurden wieder aufgefrischt!", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", - "fainted": "{{pokemonNameWithAffix}} wurde besiegt!", - "statRose": "{{stats}} von {{pokemonNameWithAffix}} steigt!", - "statSharplyRose": "{{stats}} von {{pokemonNameWithAffix}} steigt stark!", - "statRoseDrastically": "{{stats}} von {{pokemonNameWithAffix}} steigt drastisch!", - "statWontGoAnyHigher": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter erhöht werden!", - "statFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt!", - "statHarshlyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt stark!", - "statSeverelyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt drastisch!", - "statWontGoAnyLower": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter sinken!", - "ppReduced": "{{moveName}} von {{targetName}} wird um {{reduction}} AP reduziert!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} kann sich wegen des Rückstoßes durch den Angriff nicht bewegen!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} kann nicht mehr fliehen!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} wurde von {{moveName}} befreit.", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} ist zurückgeschreckt und kann nicht handeln!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} wurde verwirrt!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verwirrt!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verwirrt!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} ist verwirrt!", - "battlerTagsConfusedLapseHurtItself": "Es hat sich vor Verwirrung selbst verletzt!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} ist immun gegen den Effekt von Abgangsbund!", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} nimmt {{pokemonNameWithAffix2}} mit sich!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} hat sich in {{sourcePokemonName}} verliebt!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verliebt.", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} ist in {{sourcePokemonName}} verliebt!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} ist starr vor Liebe!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verliebt!", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} wurde bepflanzt!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}} wurden durch Egelsamen KP geraubt!", - "battlerTagsSeededLapseShed": "Egelsamen von {{pokemonNameWithAffix}} saugt Kloakensoße auf!", - "battlerTagsNightmareOnAdd": "Nachtmahr sucht {{pokemonNameWithAffix}} heim!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} wird bereits von Nachtmahr heimgesucht!", - "battlerTagsNightmareLapse": "Nachtmahr schadet {{pokemonNameWithAffix}}!", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} gibt eine Zugabe", - "battlerTagsEncoreOnRemove": "Die Zugabe von {{pokemonNameWithAffix}} ist beendet!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} will {{pokemonName}} helfen!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} nimmt über seine Wurzeln Nährstoffe auf!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} pflanzt seine Wurzeln!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} umgibt sich mit einem Wasserring!", - "battlerTagsAquaRingLapse": "{{moveName}} füllt KP von {{pokemonName}} wieder auf!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} wurde schläfrig gemacht!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} wurde durch {{moveName}} von {{sourcePokemonName}} gequetscht!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} wurde von {{sourcePokemonName}} umwickelt!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} wird in dem Strudel gefangen!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} wurde von {{pokemonName}} geschnappt!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} wurde von {{moveName}} gefangen!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} wurde in wirbelndem Magma eingeschlossen!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} wurde durch Sandgrab gefangen!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} hat {{pokemonNameWithAffix}} gefangen!", - "battlerTagsInfestationOnTrap": "{{sourcePokemonNameWithAffix}} plagt {{pokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}} schützt sich selbst!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}} schützt sich selbst!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} sammelt sich, um die nächste Attacke zu überstehen!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", - "battlerTagsPerishSongLapse": "Abgesang von {{pokemonNameWithAffix}} steht bei {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} faulenzt!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} kommt nicht in Fahrt!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} kriegt schließlich doch noch die Kurve!", - "battlerTagsHighestStatBoostOnAdd": "{{statName}} von {{pokemonNameWithAffix}} wird verstärkt!", - "battlerTagsHighestStatBoostOnRemove": "Der Effekt von {{abilityName}} von {{pokemonNameWithAffix}} lässt nach!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} läuft zu Hochtouren auf!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} entspannt.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} wurde eingepökelt!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!" -} as const; diff --git a/src/locales/de/battler-tags.json b/src/locales/de/battler-tags.json new file mode 100644 index 00000000000..e65e1ddfe75 --- /dev/null +++ b/src/locales/de/battler-tags.json @@ -0,0 +1,73 @@ +{ + "trappedDesc": "Wechselsperre", + "flinchedDesc": "Zurückschrecken", + "confusedDesc": "Verwirrung", + "infatuatedDesc": "Verliebt", + "seedDesc": "Bepflanzt", + "nightmareDesc": "Nachtmahr", + "ingrainDesc": "Verwurzlung", + "drowsyDesc": "Schläfrigkeit", + "rechargingLapse": "{{pokemonNameWithAffix}} kann sich wegen des Rückstoßes durch den Angriff nicht bewegen!", + "trappedOnAdd": "{{pokemonNameWithAffix}} kann nicht mehr fliehen!", + "trappedOnRemove": "{{pokemonNameWithAffix}} wurde von {{moveName}} befreit.", + "flinchedLapse": "{{pokemonNameWithAffix}} ist zurückgeschreckt und kann nicht handeln!", + "confusedOnAdd": "{{pokemonNameWithAffix}} wurde verwirrt!", + "confusedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verwirrt!", + "confusedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verwirrt!", + "confusedLapse": "{{pokemonNameWithAffix}} ist verwirrt!", + "confusedLapseHurtItself": "Es hat sich vor Verwirrung selbst verletzt!", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} ist immun gegen den Effekt von Abgangsbund!", + "destinyBondLapse": "{{pokemonNameWithAffix}} nimmt {{pokemonNameWithAffix2}} mit sich!", + "infatuatedOnAdd": "{{pokemonNameWithAffix}} hat sich in {{sourcePokemonName}} verliebt!", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verliebt.", + "infatuatedLapse": "{{pokemonNameWithAffix}} ist in {{sourcePokemonName}} verliebt!", + "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} ist starr vor Liebe!", + "infatuatedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verliebt!", + "seededOnAdd": "{{pokemonNameWithAffix}} wurde bepflanzt!", + "seededLapse": "{{pokemonNameWithAffix}} wurden durch Egelsamen KP geraubt!", + "seededLapseShed": "Egelsamen von {{pokemonNameWithAffix}} saugt Kloakensoße auf!", + "nightmareOnAdd": "Nachtmahr sucht {{pokemonNameWithAffix}} heim!", + "nightmareOnOverlap": "{{pokemonNameWithAffix}} wird bereits von Nachtmahr heimgesucht!", + "nightmareLapse": "Nachtmahr schadet {{pokemonNameWithAffix}}!", + "encoreOnAdd": "{{pokemonNameWithAffix}} gibt eine Zugabe", + "encoreOnRemove": "Die Zugabe von {{pokemonNameWithAffix}} ist beendet!", + "helpingHandOnAdd": "{{pokemonNameWithAffix}} will {{pokemonName}} helfen!", + "ingrainLapse": "{{pokemonNameWithAffix}} nimmt über seine Wurzeln Nährstoffe auf!", + "ingrainOnTrap": "{{pokemonNameWithAffix}} pflanzt seine Wurzeln!", + "aquaRingOnAdd": "{{pokemonNameWithAffix}} umgibt sich mit einem Wasserring!", + "aquaRingLapse": "{{moveName}} füllt KP von {{pokemonName}} wieder auf!", + "drowsyOnAdd": "{{pokemonNameWithAffix}} wurde schläfrig gemacht!", + "damagingTrapLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", + "bindOnTrap": "{{pokemonNameWithAffix}} wurde durch {{moveName}} von {{sourcePokemonName}} gequetscht!", + "wrapOnTrap": "{{pokemonNameWithAffix}} wurde von {{sourcePokemonName}} umwickelt!", + "vortexOnTrap": "{{pokemonNameWithAffix}} wird in dem Strudel gefangen!", + "clampOnTrap": "{{sourcePokemonNameWithAffix}} wurde von {{pokemonName}} geschnappt!", + "sandTombOnTrap": "{{pokemonNameWithAffix}} wurde von {{moveName}} gefangen!", + "magmaStormOnTrap": "{{pokemonNameWithAffix}} wurde in wirbelndem Magma eingeschlossen!", + "snapTrapOnTrap": "{{pokemonNameWithAffix}} wurde durch Sandgrab gefangen!", + "thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} hat {{pokemonNameWithAffix}} gefangen!", + "infestationOnTrap": "{{sourcePokemonNameWithAffix}} plagt {{pokemonNameWithAffix}}!", + "protectedOnAdd": "{{pokemonNameWithAffix}} schützt sich selbst!", + "protectedLapse": "{{pokemonNameWithAffix}} schützt sich selbst!", + "enduringOnAdd": "{{pokemonNameWithAffix}} sammelt sich, um die nächste Attacke zu überstehen!", + "enduringLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", + "sturdyLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", + "perishSongLapse": "Abgesang von {{pokemonNameWithAffix}} steht bei {{turnCount}}.", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} zieht alle Aufmerksamkeit auf sich!", + "truantLapse": "{{pokemonNameWithAffix}} faulenzt!", + "slowStartOnAdd": "{{pokemonNameWithAffix}} kommt nicht in Fahrt!", + "slowStartOnRemove": "{{pokemonNameWithAffix}} kriegt schließlich doch noch die Kurve!", + "highestStatBoostOnAdd": "{{statName}} von {{pokemonNameWithAffix}} wird verstärkt!", + "highestStatBoostOnRemove": "Der Effekt von {{abilityName}} von {{pokemonNameWithAffix}} lässt nach!", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}} schwebt aufgrund von Elektromagnetismus!", + "magnetRisenOnRemove": "Der Elektromagnetismus von {{pokemonNameWithAffix}} hört auf zu wirken!", + "critBoostOnAdd": "{{pokemonNameWithAffix}} läuft zu Hochtouren auf!", + "critBoostOnRemove": "{{pokemonNameWithAffix}} entspannt.", + "saltCuredOnAdd": "{{pokemonNameWithAffix}} wurde eingepökelt!", + "saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", + "cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!", + "cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!", + "stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!", + "disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!", + "disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!" +} diff --git a/src/locales/de/berry.json b/src/locales/de/berry.json new file mode 100644 index 00000000000..61f3c623e32 --- /dev/null +++ b/src/locales/de/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "Tsitrubeere", + "effect": "Stellt 25% der KP wieder her, wenn die KP unter 50% sind." + }, + "LUM": { + "name": "Prunusbeere", + "effect": "Heilt jede nichtflüchtige Statusveränderung und Verwirrung." + }, + "ENIGMA": { + "name": "Enigmabeere", + "effect": "Stellt 25% der KP wieder her, wenn der Träger von einer sehr effektiven Attacke getroffen wird." + }, + "LIECHI": { + "name": "Lydzibeere", + "effect": "Steigert den Angriff, wenn die KP unter 25% sind." + }, + "GANLON": { + "name": "Linganbeere", + "effect": "Steigert die Verteidigung, wenn die KP unter 25% sind." + }, + "PETAYA": { + "name": "Tahaybeere", + "effect": "Steigert den Spezial-Angriff, wenn die KP unter 25% sind." + }, + "APICOT": { + "name": "Apikobeere", + "effect": "Steigert die Spezial-Verteidigung, wenn die KP unter 25% sind." + }, + "SALAC": { + "name": "Salkabeere", + "effect": "Steigert die Initiative, wenn die KP unter 25% sind." + }, + "LANSAT": { + "name": "Lansatbeere", + "effect": "Erhöht die Volltrefferchance, wenn die KP unter 25% sind." + }, + "STARF": { + "name": "Krambobeere", + "effect": "Erhöht einen zufälligen Statuswert stark, wenn die KP unter 25% sind." + }, + "LEPPA": { + "name": "Jonagobeere", + "effect": "Stellt 10 AP für eine Attacke wieder her, wenn deren AP auf 0 fallen." + } +} \ No newline at end of file diff --git a/src/locales/de/berry.ts b/src/locales/de/berry.ts deleted file mode 100644 index b041a23d646..00000000000 --- a/src/locales/de/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "Tsitrubeere", - effect: "Stellt 25% der KP wieder her, wenn die KP unter 50% sind." - }, - "LUM": { - name: "Prunusbeere", - effect: "Heilt jede nichtflüchtige Statusveränderung und Verwirrung." - }, - "ENIGMA": { - name: "Enigmabeere", - effect: "Stellt 25% der KP wieder her, wenn der Träger von einer sehr effektiven Attacke getroffen wird.", - }, - "LIECHI": { - name: "Lydzibeere", - effect: "Steigert den Angriff, wenn die KP unter 25% sind." - }, - "GANLON": { - name: "Linganbeere", - effect: "Steigert die Verteidigung, wenn die KP unter 25% sind." - }, - "PETAYA": { - name: "Tahaybeere", - effect: "Steigert den Spezial-Angriff, wenn die KP unter 25% sind." - }, - "APICOT": { - name: "Apikobeere", - effect: "Steigert die Spezial-Verteidigung, wenn die KP unter 25% sind." - }, - "SALAC": { - name: "Salkabeere", - effect: "Steigert die Initiative, wenn die KP unter 25% sind." - }, - "LANSAT": { - name: "Lansatbeere", - effect: "Erhöht die Volltrefferchance, wenn die KP unter 25% sind." - }, - "STARF": { - name: "Krambobeere", - effect: "Erhöht einen zufälligen Statuswert stark, wenn die KP unter 25% sind." - }, - "LEPPA": { - name: "Jonagobeere", - effect: "Stellt 10 AP für eine Attacke wieder her, wenn deren AP auf 0 fallen." - }, -} as const; diff --git a/src/locales/de/bgm-name.ts b/src/locales/de/bgm-name.json similarity index 81% rename from src/locales/de/bgm-name.ts rename to src/locales/de/bgm-name.json index 71e775c8846..1eab276a70a 100644 --- a/src/locales/de/bgm-name.ts +++ b/src/locales/de/bgm-name.json @@ -1,11 +1,10 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "Musik", - "missing_entries" : "{{name}}", +{ + "music": "Musik: ", + "missing_entries": "{{name}}", "battle_kanto_champion": "S2W2 Vs. Kanto Champion", "battle_johto_champion": "S2W2 Vs. Johto Champion", - "battle_hoenn_champion": "S2W2 Vs. Hoenn Champion", + "battle_hoenn_champion_g5": "S2W2 Vs. Hoenn Champion", + "battle_hoenn_champion_g6": "ORAS Vs. Hoenn Champion", "battle_sinnoh_champion": "S2W2 Vs. Champion Cynthia", "battle_champion_alder": "SW Vs. Champion Lauro", "battle_champion_iris": "S2W2 Vs. Champion Lilia", @@ -46,6 +45,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_lake_trio": "ORAS Vs. Seen-Trio", "battle_legendary_sinnoh": "ORAS Vs. Legendäres Sinnoh Pokémon", "battle_legendary_dia_pal": "ORAS Vs. Dialga & Palkia", + "battle_legendary_origin_forme": "PLA Vs. Urform Dialga & Palkia", "battle_legendary_giratina": "ORAS Vs. Giratina", "battle_legendary_arceus": "HGSS Vs. Arceus", "battle_legendary_unova": "SW Vs. Legendäres Einall Pokémon", @@ -60,6 +60,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_zac_zam": "SWSH Vs. Zacian & Zamazenta", "battle_legendary_glas_spec": "SWSH Vs. Polaross & Phantoross", "battle_legendary_calyrex": "SWSH Vs. Coronospa", + "battle_legendary_riders": "SWSH Vs. Schimmelreiter & Rappenreiter Coronospa", "battle_legendary_birds_galar": "SWSH Vs. Legendäre Galar-Vögel", "battle_legendary_ruinous": "KAPU Vs. Schätze des Unheils", "battle_legendary_kor_mir": "KAPU Die Tiefen von Zone Null", @@ -74,18 +75,26 @@ export const bgmName: SimpleTranslationEntries = { "battle_wild": "SW Vs. Wilde Pokémon", "battle_wild_strong": "SW Vs. Starke Wilde Pokémon", "end_summit": "PMDDX Gipfel des Himmelturms", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_rocket_grunt": "HGSS Vs. Team Rocket Rüpel", + "battle_aqua_magma_grunt": "ORAS Vs. Team Aqua & Magma", + "battle_galactic_grunt": "BDSP Vs. Team Galaktik Rüpel", "battle_plasma_grunt": "SW Vs. Team Plasma Rüpel", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", + "battle_flare_grunt": "XY Vs. Team Flare Rüpel", + "battle_aether_grunt": "SM Vs. Æther Foundation", + "battle_skull_grunt": "SM Vs. Team Skull Rüpel", + "battle_macro_grunt": "SWSH Vs. Trainer", + "battle_galactic_admin": "BDSP Vs. Team Galactic Commander", + "battle_skull_admin": "SM Vs. Team Skull Vorstand", + "battle_oleana": "SWSH Vs. Oleana", + "battle_rocket_boss": "USUM Vs. Giovanni", + "battle_aqua_magma_boss": "ORAS Vs. Team Aqua & Magma Boss", + "battle_galactic_boss": "BDSP Vs. Zyrus", + "battle_plasma_boss": "S2W2 Vs. G-Cis", + "battle_flare_boss": "XY Vs. Flordelis", + "battle_aether_boss": "SM Vs. Samantha", + "battle_skull_boss": "SM Vs. Bromley", + "battle_macro_boss": "SWSH Vs. Rose", - // Biome Music "abyss": "PMD Erkundungsteam Himmel Dunkelkrater", "badlands": "PMD Erkundungsteam Himmel Kargtal", "beach": "PMD Erkundungsteam Himmel Feuchtklippe", @@ -101,18 +110,18 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PMD Erkundungsteam Himmel Verwirrwald", "ice_cave": "PMD Erkundungsteam Himmel Rieseneisberg", "island": "PMD Erkundungsteam Himmel Schroffküste", - "jungle": "Lmz - Jungle", // The composer thinks about a more creative name - "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "jungle": "Lmz - Jungle", + "laboratory": "Firel - Laboratory", "lake": "PMD Erkundungsteam Himmel Kristallhöhle", "meadow": "PMD Erkundungsteam Himmel Himmelsgipfel-Wald", - "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "metropolis": "Firel - Metropolis", "mountain": "PMD Erkundungsteam Himmel Hornberg", "plains": "PMD Erkundungsteam Himmel Himmelsgipfel-Prärie", "power_plant": "PMD Erkundungsteam Himmel Weite Ampere-Ebene", "ruins": "PMD Erkundungsteam Himmel Tiefes Ruinenverlies", - "sea": "PMD Erkundungsteam Himmel Salzwasserhöhle", - "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD Erkundungsteam Himmel Himmelsgipfel-Küste", + "sea": "Andr06 - Marine Mystique", + "seabed": "Firel - Seabed", + "slum": "Andr06 - Sneaky Snom", "snowy_forest": "PMD Erkundungsteam Himmel Himmelsgipfel-Schneefeld", "space": "Firel - Aether", "swamp": "PMD Erkundungsteam Himmel Ringmeer", @@ -121,8 +130,6 @@ export const bgmName: SimpleTranslationEntries = { "town": "PMD Erkundungsteam Himmel Zufälliges Dungeon-Theme 3", "volcano": "PMD Erkundungsteam Himmel Dunsthöhle", "wasteland": "PMD Erkundungsteam Himmel Verborgenes Hochland", - - // Encounter "encounter_ace_trainer": "SW Trainerblicke treffen sich (Ass-Trainer)", "encounter_backpacker": "SW Trainerblicke treffen sich (Backpacker)", "encounter_clerk": "SW Trainerblicke treffen sich (Angestellter)", @@ -137,9 +144,7 @@ export const bgmName: SimpleTranslationEntries = { "encounter_scientist": "SW Trainerblicke treffen sich (Forscher)", "encounter_twins": "SW Trainerblicke treffen sich (Zwillinge)", "encounter_youngster": "SW Trainerblicke treffen sich (Knirps)", - - // Other "heal": "SW Pokémon-Heilung", "menu": "PMD Erkundungsteam Himmel Willkommen in der Welt der Pokémon!", - "title": "PMD Erkundungsteam Himmel Top-Menü-Thema", -} as const; + "title": "PMD Erkundungsteam Himmel Top-Menü-Thema" +} diff --git a/src/locales/de/biome.ts b/src/locales/de/biome.json similarity index 85% rename from src/locales/de/biome.ts rename to src/locales/de/biome.json index 2afb4a4b018..a4add24ad3b 100644 --- a/src/locales/de/biome.ts +++ b/src/locales/de/biome.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { +{ "unknownLocation": "An einem unbekannten Ort", "TOWN": "Stadt", "PLAINS": "Ebene", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "Verschneiter Wald", "ISLAND": "Insel", "LABORATORY": "Labor", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/de/challenges.ts b/src/locales/de/challenges.json similarity index 51% rename from src/locales/de/challenges.ts rename to src/locales/de/challenges.json index 176de9879b6..c8836c50549 100644 --- a/src/locales/de/challenges.ts +++ b/src/locales/de/challenges.json @@ -1,12 +1,11 @@ -import { TranslationEntries } from "#app/interfaces/locales"; - -export const challenges: TranslationEntries = { +{ + "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", @@ -15,12 +14,24 @@ export const challenges: TranslationEntries = { "gen_6": "sechsten", "gen_7": "siebten", "gen_8": "achten", - "gen_9": "neunten", + "gen_9": "neunten" }, "singleType": { "name": "Mono-Typ", "desc": "Du kannst nur Pokémon des Typs {{type}} verwenden.", "desc_default": "Du kannst nur Pokémon des gewählten Typs verwenden." - // types in pokemon-info }, -} as const; + "freshStart": { + "name": "Neuanfang", + "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/command-ui-handler.json b/src/locales/de/command-ui-handler.json new file mode 100644 index 00000000000..4949929770b --- /dev/null +++ b/src/locales/de/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "Kampf", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Fliehen", + "actionMessage": "Was soll\n{{pokemonName}} tun?" +} \ No newline at end of file diff --git a/src/locales/de/command-ui-handler.ts b/src/locales/de/command-ui-handler.ts deleted file mode 100644 index cd7da3fbf26..00000000000 --- a/src/locales/de/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Kampf", - "ball": "Ball", - "pokemon": "Pokémon", - "run": "Fliehen", - "actionMessage": "Was soll\n{{pokemonName}} tun?", -} as const; diff --git a/src/locales/de/common.json b/src/locales/de/common.json new file mode 100644 index 00000000000..b0ca16e04f4 --- /dev/null +++ b/src/locales/de/common.json @@ -0,0 +1,8 @@ +{ + "start": "Start", + "luckIndicator": "Glück:", + "shinyOnHover": "Schillernd", + "commonShiny": "Gewöhnlich", + "rareShiny": "Selten", + "epicShiny": "Episch" +} \ No newline at end of file diff --git a/src/locales/de/common.ts b/src/locales/de/common.ts deleted file mode 100644 index 82966b4ffeb..00000000000 --- a/src/locales/de/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "Start", -} as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index 77834849d2f..772bfb6d1d5 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -1,94 +1,113 @@ -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const deConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - statusEffect: statusEffect, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather, - partyUiHandler: partyUiHandler + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory, }; diff --git a/src/locales/de/dialogue-double-battle.json b/src/locales/de/dialogue-double-battle.json new file mode 100644 index 00000000000..ec7cf375c0c --- /dev/null +++ b/src/locales/de/dialogue-double-battle.json @@ -0,0 +1,82 @@ +{ + "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-final-boss.json b/src/locales/de/dialogue-final-boss.json new file mode 100644 index 00000000000..bffbd779be0 --- /dev/null +++ b/src/locales/de/dialogue-final-boss.json @@ -0,0 +1,4 @@ +{ + "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-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.json b/src/locales/de/dialogue.json new file mode 100644 index 00000000000..8a3dbb8880e --- /dev/null +++ b/src/locales/de/dialogue.json @@ -0,0 +1,2691 @@ +{ + "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": "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?" + }, + "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": "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": { + "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.ts b/src/locales/de/dialogue.ts deleted file mode 100644 index 02c497b3182..00000000000 --- a/src/locales/de/dialogue.ts +++ /dev/null @@ -1,2754 +0,0 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; - - -// Dialogue of the NPCs in the game when the player character is male (or unset) -export const PGMdialogue: DialogueTranslationEntries = { - "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 - $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. - $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! - $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, - $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. - $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, - $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, - $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. - $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." - }, - }, - "rocket_grunt": { - "encounter": { - 1: `Jetzt gibt es Ärger!… - $und es kommt noch härter! - $Wir wollen über die Erde regieren… - $und naja du kennst den Rest…!` - }, - "victory": { - 1: "Das war mal wieder ein Schuss in den Ofen!" - }, - }, - "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..." - }, - }, - "magma_grunt": { - "encounter": { - 1: "Keiner, der sich Team Magma in den Weg stellt, bekommt Gnade, nicht einmal Kinder!" - }, - "victory": { - 1: "Wie kann das sein? Ich bin Teil vom mächtigen Team Magma! Wir wollen doch nur die Welt verbessern…" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "Du willst dich also mit Team Aqua anlegen? Du traust dich ja was… Dich werfe ich über Bord!", - }, - "victory": { - 1: "Vielleicht sollte ich wohl lieber selber über die Planke gehen…", - }, - }, - "galactic_grunt": { - "encounter": { - 1: "Team Galaktik wird die Welt in eine bessere Welt verwandeln! Und du wirst uns nicht aufhalten!" - }, - "victory": { - 1: "Zyrus wird uns für diese Niederlage bestrafen…" - }, - }, - "plasma_grunt": { - "encounter": { - 1: "Pokémon sollten frei sein! Team Plasma wird sie befreien!" - }, - "victory": { - 1: "Wie konnte ich verlieren? Ich dachte, ich würde die Welt retten…" - }, - }, - "flare_grunt": { - "encounter": { - 1: `Ich bin ein Mitglied von Team Flare! Das sieht man mir doch an. Mein Stil ist unverkennbar! - $Du kannst definitiv ein Umstyling gebrauchen!` - }, - "victory": { - 1: "Stil ist wohl doch nicht alles…" - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: `Ich bin beeindruckt, du hast es bis hierher geschafft! - $Ich bin Giovanni, der Anführer von Team Rocket! - $Wir regieren den Untergrund von Kanto! - $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, - $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! - $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. - $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. - $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. - $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. - $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... - $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." - } - }, - "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… - $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. - $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. - $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. - $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. - $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, - $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 - $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. - $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… - $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, - $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. - $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. - $Vielleicht sollten wir darüber nachdenken, warum Pokémon uns helfen, - $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... - $Ä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? - $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, - $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 - $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. - $Du wirst mir helfen, dieses Level zu erreichen!`, - 2: `Es heißt, dass ein regenbogenfarbenes Pokémon vor einem wirklich starken Trainer erscheinen wird. - $Ich habe an diese Geschichte geglaubt, deshalb habe ich mein ganzes Leben lang heimlich trainiert. - $Als Ergebnis kann ich jetzt Dinge sehen, die andere nicht sehen. - $Ich sehe einen Schatten der Person, die das Pokémon erscheinen lassen wird. - $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. - $Ich beneide dich darum...`, - 3: "Wie ist das möglich...", - 4: `Ich glaube nicht, dass unser Potenzial so unterschiedlich ist. - $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. - $… 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. - $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. - $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? - $Ihre Stärke ist ein Zeichen meiner Stärke als Gärtner und Arenaleiter! - $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 - $oder das Aufblühen der Freude nach einem Sieg... - $Beides sind großartige Motive für meine Kamera! Fantastisch! Das wird einfach fantastisch! - $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, - $die du mit einem Pokémon an deiner Seite siehst... - $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! - $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! - $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! - $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... - $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. - $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! - $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, - $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. - $Das ist gut! Sieht wirklich gut aus! In Ordnung! - $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. - $Ja, die Bindung, die ich zu Pokémon entwickelt habe, ist extrem stark. - $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. - $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! - $Die alles verzehrende Hitze überwältigt. - $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? - $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. - $Ich denke, ich spüre das bei dir. Zeig es mir. Zeig mir die Kraft, die du mit deinen Pokémon hast. - $Und ich werde dir im Gegenzug eine Vorstellung von - $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. - $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! - $Deine Pokémon werden mir ausgeliefert sein, wenn sie erst einmal eingefroren sind! Hahaha! - $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. - $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. - $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, - $aber ich bin zuversichtlich in meine Fähigkeiten. - $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! - $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. - $Deine Pokémon haben an dich geglaubt und ihr Bestes gegeben, um dir den Sieg zu sichern. - $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, - $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... - $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... - $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. - $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? - $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… - $Du siehst aus wie ein Pokémon-Trainer mit verfeinerter Stärke und vertiefter Freundlichkeit. - $Was ich in meinem Gegner suche, ist überlegene Stärke… - $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... - $Ehrlich gesagt, es erfüllt mich mit der Energie, die ich brauche, um jeden neuen Tag anzugehen! - $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, - $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! - $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. - $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. - $Das wird ein harter Kampf! - $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... - $Der Held hat ein mystisches Schwert erlangt und steht vor seiner letzten Prüfung... Ah, egal. - $Da du es so weit geschafft hast, lege ich das beiseite und kämpfe gegen dich. - $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... - $Das sind wunderbare Neuigkeiten! Gegen Gegner wie dich und dein Team zu kämpfen, - $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, - $wie sich der feurige Atem eines erbitterten Kampfes anfühlt!` - }, - "victory": { - 1: `Das Glück hat mir dieses Mal gelächelt, aber... - $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? - $Was hast du gefühlt, als du so viele andere Trainer getroffen hast? - $Durch dieses reiche Land zu reisen... Hat es etwas in dir geweckt? - $Ich möchte, dass du mir alles zeigst, was du gelernt hast. - $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! - $Ich meine, komm schon! Die Trainer, die es hierher schaffen, sind Trainer, - $die den Sieg mit jeder Faser ihres Seins anstreben! - $Und sie kämpfen Seite an Seite mit Pokémon, die unzählige schwierige Kämpfe durchgemacht haben! - $Wenn ich mit solchen Leuten kämpfe, werde nicht nur ich stärker, sondern auch meine Pokémon! - $Und wir werden uns noch besser kennenlernen! OK! Mach dich bereit! - $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, - $je nachdem, ob er aus einer warmen oder einer kalten Region stammt. - $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. - $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... - $Aber was für eine großartige Zeit war das! - $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. - $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. - $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. - $Mit mehr jungen Trainern, die das Kommando übernehmen, ist die Zukunft der Pokémon hell! - $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… - $Ich hoffe, du bist der Trainer, der mich daran erinnert, wie viel Spaß es macht zu kämpfen!`, - }, - "victory": { - 1: `Du hast mich besiegt… - $Dein Verlangen und die edle Art, wie deine Pokémon für dich gekämpft haben… - $Ich habe mich sogar während unseres Kampfes begeistert gefühlt. Das war ein sehr guter Kampf.`, - }, - "defeat": { - 1: `Es war überhaupt nicht schockierend… - $Das ist nicht das, was ich wollte!`, - } - }, - "burgh": { - "encounter": { - 1: `M'hm… Wenn ich diesen Kampf gewinne, habe ich das Gefühl, - $dass ich ein Bild malen kann, das es so noch nie gegeben hat. - $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! - $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. - $Ich denke, wenn du dein Bestes gibst, ist jeder Sieg schön.` - } - }, - "elesa": { - "encounter": { - 1: `C'est fini! Wenn ich mir dessen sicher bin, - $fühle ich einen elektrischen Stoß durch meinen Körper laufen! - $Ich möchte dieses Gefühl erleben, also werden meine geliebten Pokémon - $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, - $der entscheidet, wer an der Spitze steht, richtig? - $Ich liebe es, auf dem Gipfel zu stehen! Weil man von hohen Orten aus für immer und ewig sehen kann! - $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. - $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. - $Lass uns mit allem kämpfen, was wir haben: dein Können, meine Erfahrung und die Liebe, - $mit der wir unsere Pokémon großgezogen haben!`, - }, - "victory": { - 1: `Dieses intensive Gefühl, das mich nach einer Niederlage überkommt… - $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. - $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. - $Das ist wirklich alles, was es dazu gibt. - $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. - $Dann nehme ich an, du hast dir das Recht auf einen Kampf verdient, als Belohnung für deine Bemühungen. - $Die schwer fassbare Fee mag zart wie eine Brise und empfindlich wie eine Blüte erscheinen, - $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… - $Aber eigentlich mache ich es nur, weil es Spaß macht. - $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. - $Aber das bedeutet, dass auch dein Gegner hart arbeitet, um zu gewinnen. - $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? - $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! - $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, - $wie stark der großartige Roy wirklich ist!` - }, - "victory": { - 1: `Ich sehe sogar gut aus, wenn ich verliere. - $Es ist ein echter Fluch. - $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? - $Hola, ciao und hallöle! Und schon bist du gefangen in meinem Elektronetz! - $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... - $Was für ein außergewöhnliches Gefühl!` - } - }, - "kieran": { - "encounter": { - 1: `Durch harte Arbeit werde ich immer stärker und stärker! - $Ich verliere nicht.` - }, - "victory": { - 1: `Ich kann es nicht glauben... - $Was für ein lustiger und herzzerreißender Kampf!` - }, - "defeat": { - 1: `Wow, was für ein Kampf! - $Es ist Zeit für dich, noch härter zu trainieren.` - } - }, - "rival": { - "encounter": { - 1: `@c{smile}Hey, ich habe dich gesucht! Ich weiß, dass du es nicht erwarten konntest loszugehen, - $aber hättest ja wenigstens Tschüss sagen können... - $@c{smile_eclosed}Du verfolgst also wirklich deinen Traum?\nIch kann es kaum glauben. - $@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. - $@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? - $@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann - $ja wirklich ganz groß raus zu kommen. - $Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus. - $@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 - $deiner besten Freundin Tschüss zu sagen? - $@c{smile_ehalf}Du folgst deinem Traum, oder?\nDas ist wirklich heute… - $@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! - $@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? - $@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. - $@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich! - $@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…? - $@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig. - $@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen. - $Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!. - $@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. - $@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n - $@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n - $@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen. - $Du kannst es haben.\n - $@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen. - $@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! - $@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. - $@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. - $@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen. - $@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… - $@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren! - $@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~. - $@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir! - $@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? - $@c{neutral_eclosed}Die Dinge waren irgendwie... seltsam.\nEs ist Zuhause einfach nicht das Gleiche ohne dich. - $@c{serious}Ich weiß es ist selbstsüchtig, aber ich musste das einfach mal loswerden. - $@c{neutral_eclosed}Denkst du nicht, dass du dich etwas übernommen hast? - $@c{serious}Es ist nicht realistisch immer zu gewinnen\nWir müssen manchmal verlieren. Um daran zu wachsen. - $@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? - $@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… - $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ß! - $@c{smile_ehalf}Aber ehrlich, vermisst du dein Zuhause garnicht? Oder mich? - $Ich… Ich meine, wir vermissen dich wirklich. - $@c{smile_eclosed}Ich unterstütze dich bei deinem Traum, aber die Realität ist, du wirst früher oder später verlieren. - $@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…? - $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. - $Ich werde jetzt keine Gefälligkeiten mit dir austauschen.\n@c{neutral_eclosed}Ich bin hier um zu gewinnen. Mehr nicht. - $@c{serious_mhalf_fists}Durch mein Traning habe ich gelernt mein Potenzial zu maximieren. - $@c{smile}Man hat deutlich mehr Zeit, wenn man auf Schlaf und unnötige soziale Interaktionen verzichtet. - $@c{serious_mopen_fists}Das ist alles nicht mehr wichtig, nicht solange ich nicht gewonnen habe. - $@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. - $@c{angry_mhalf}Nur die Schwachen verlieren, und ich bin nicht mehr schwach. - $@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? - $@c{smile}Du solltest stolz auf dich sein. Du hast es soweit gebracht. Glückwunsch! - $Aber hier endet deine Reise jetzt. - $@c{smile_eclosed}Du hast etwas in mir erwachen lassen, etwas von dem ich nicht wusste, dass es da war. - $Alles was ich jetzt mache ist tranieren. @c{smile_ehalf}Ich esse oder schlafe kaum. - $Ich traniere meine Pokémon den ganzen Tag. Und werde immer stärker. - $@c{neutral}Genau genommen, erkenne ich mich garnicht wieder. - $Und jetzt habe ich endlich meinen Höhepunkt erreicht.\nNiemand kann mich jetzt noch schlagen. - $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! - $@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. - $@c{neutral}Ich hatte Zeit über alles nachzudenken.\nÜber den Grund, warum alles so merkwürdig erscheint. - $@c{neutral_eclosed}Dein Traum, mein Antrieb dich besiegen zu wollen…\nEs ist alles Teil von etwas Größerem. - $@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. - $@c{neutral_eclosed}Ob ich meine Aufgabe erfüllt habe kann ich nicht sagen, aber ich habe alles getan was ich konnte. - $@c{neutral}Der Ort an dem wir uns befinden ist angsteinflößend… - $Trotzdem fühlt es sich so an, als würde mich das nicht stören, als wäre ich bereits schonmal hier gewesen. - $@c{serious_mhalf_fists}Dir geht es doch genauso, oder? - $@c{serious}…und irgendwas hier spricht zu mir.\nDas ist alles was die Welt seit langem kennt. - $Die Zeiten die wir zusammen verbracht haben, die so nah erscheinen, sind nichts als eine ferne Erinnerung. - $@c{neutral_eclosed}Wer weiß, ob sie jemals real waren? - $@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. - $@c{serious_smile_fists}Ich… Ich weiß nicht was das alles bedeutet, aber ich fühle, dass es wahr ist. - $@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. - $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. - $@c{smile_eclosed}Weißt du, egal wie ich es drehe und wende… - $@c{smile_ehalf}Irgendwas stört mich an der ganzen Sache, es erscheint mir irgendwie komisch… - $@c{smile}Du hast deinen Traum, und ich habe diesen Antrieb… - $Ich kann nicht anders, als zu glauben, dass es einen größeren Zweck gibt. - $@c{smile_eclosed}Ich denke, ich sollte dich an deine Grenzen treiben. - $@c{smile_ehalf}Ich bin mir nicht sicher, ob ich meine Aufgabe erfüllt habe, aber ich habe mein Bestes gegeben. - $Irgendwas an diesem komischen und furchteinflößenden Ort… All das scheint so klar… - $Es… ist alles was die Welt seit langem kennt. - $@c{smile_eclosed}Es kommt mir so vor als könnte ich mich kaum an die Erinnerungen erinnern, die wir zusammen hatten. - $@c{smile_ehalf}Waren sie jemals real? Sie scheinen so weit weg… - $@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. - $@c{smile_ehalf}Ich… Ich weiß nicht was das alles bedeutet, aber ich fühle, dass es wahr ist. - $@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. - $@c{smile_eclosed}Versprich mir… Nachdem du die Welt geheilt hast… Komm bitte sicher nach Hause. - $@c{smile_ehalf}…Danke.` - - }, - }, -}; - -// Dialogue of the NPCs in the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = PGMdialogue; - -// Dialogue of the endboss of the game when the player character is male (Or unset) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `Es scheint, als wäre es wieder mal an der Zeit.\nDu weißt, warum du hierher kommen musst, oder? - $Dich hat es hierher gezogen, du warst bereits hier.\nUnzählige Male. - $Obwohl, vielleicht doch nicht unzählig.\nUm genau zu sein, dies ist der 5.643.853te Zyklus. - $Du verlierst jeden Zyklus dein Gedächtnis. Trotzdem \nbleibt etwas, ein Teil deines ehemaligen Ichs, erhalten. - $Bis jetzt hast du es noch nicht vollbracht zu siegen, aber dieses Mal spüre ich eine andere Präsenz in dir.\n - $Du bist der Einzige hier, aber es kommt mir so vor als wäre da...jemand anderes. - $Wirst du endlich beweisen, dass du ein würdiger Herausforder bist?\nDie Herausforderung auf die ich seit Jahrtausenden warte? - $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. - $Enttäusche mich nicht.`, - "secondStageWin": "…Herrlich." -}; - -// Dialogue of the endboss of the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDialogue; - - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen. - $Aber, du bist jetzt zurück. - $@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet. - $@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren. - $@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96} - $Ich schätze, das ist in Ordnung, oder? - $@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben. - $@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen. - $@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben? - $Wenn du dazu bereit bist.`, - "ending_female": - `@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?! - $@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast. - $@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl. - $@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet. - $@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr? - $Du hast nicht einmal verloren. - $Ich werde die Einzige sein, die sich daran erinnert, was du getan hast. - $@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen! - $@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32} - $Deine Legende wird in unseren Herzen weiterleben. - $@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort. - $Lass uns nach Hause gehen. - $@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?`, -}; - - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; - - -// Dialogue of the named double battles in the game. For when the player is male (or unset). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `Blau: Hey Rot, lass uns ihnen zeigen, was wir drauf haben! - $Rot: ... - $Blau: Das ist die Macht von Alabastia!`, - }, - "victory": { - 1: `Blau: Das war ein großartiger Kampf! - $Rot: ...`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `Rot: ...! - $Blau: Er redet nicht viel... - $Blau: Aber lass dich davon nicht täuschen! Er ist schließlich ein Champ!`, - }, - "victory": { - 1: `Rot: ...! - $Blau: Das nächste Mal gewinnen wir!`, - }, - }, - "tate_liza_double": { - "encounter": { - 1: `Ben: Hehehe...Bist du überrascht? - $Svenja: Wir sind zwei Arenaleiter auf einmal! - $Ben: Wir sind Zwillinge! - $Svenja: Wir müssen nicht reden um uns gegenseitig zu verstehen! - $Ben: Die doppelte Kraft... - $Svenja: Kannst du ihr standhalten?`, - }, - "victory": { - 1: `Ben: Was? Unsere Kombination war perfekt! - $Svenja: Sieht so aus als müssten wir wohl mehr tranieren...`, - }, - }, - "liza_tate_double": { - "encounter": { - 1: `Svenja: Hihihi... Bist du überrascht? - $Ben: Ja, wir sind wirklich zwei Arenaleiter auf einmal! - $Svenja: Das ist mein Zwillingsbruder Ben! - $Ben: Und das meine Zwillingsschwester Svenja! - $Svenja: Wir sind die perfekte Kombo!` - }, - "victory": { - 1: `Svenja: Sind wir... - $Ben: ...nicht so stark wie wir dachten?`, - }, - }, - "wallace_steven_double": { - "encounter": { - 1: `Troy: Wassili, lass uns ihnen die Kraft von Champions zeigen! - $Wassili: Wir zeigen dir die Kraft von Hoenn! - $Troy: Los gehts!`, - }, - "victory": { - 1: `Troy: Das war ein großartiger Kampf! - $Wassili: Das nächste Mal gewinnen wir!`, - }, - }, - "steven_wallace_double": { - "encounter": { - 1: `Troy: Hast du irgendwelche seltenen Pokémon? - $Wassili: Troy... Wir sind hier um zu kämpfen und nicht um mit unseren Pokémon zu prahlen... - $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! - $Wassili: Troy...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `Lauro: Wir sind die stärksten Trainer aus Einall! - $Lilia: Kämpfe gegen starke Trainer machen am meisten Spaß!`, - }, - "victory": { - 1: `Lauro: Wow! Du bist super stark! - $Lilia: Beim nächsten Mal schlagen wir dich!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `Lilia: Willkommen Herausforderer! Ich bin DER Champion von Einall! - $Lauro: Lilia, bist du nicht etwas zu aufgeregt?`, - }, - "victory": { - 1: `Lilia: Eine solche Niederlage ist nicht einfach zu verkraften... - $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! - $Nezz: Wir bringen die Dunkelheit!`, - }, - "victory": { - 1: `Mary: Du hast Licht in unsere Dunkelheit gebracht! - $Piers: Es ist viel zu hell...`, - }, - }, - "piers_marnie_double": { - "encounter": { - 1: `Nezz: Bereit für ein Konzert? - $Mary: Bruder...Sie sind hier um zu kämpfen, nicht um zu singen...`, - }, - "victory": { - 1: `Nezz: Das war mal ein großartiges Konzert! - $Marnie: Bruder...`, - }, - }, -}; - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = PGMdoubleBattleDialogue; diff --git a/src/locales/de/egg.ts b/src/locales/de/egg.json similarity index 89% rename from src/locales/de/egg.ts rename to src/locales/de/egg.json index 61a2f627aa4..dbece7e81f3 100644 --- a/src/locales/de/egg.ts +++ b/src/locales/de/egg.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { +{ "egg": "Ei", "greatTier": "Selten", "ultraTier": "Episch", @@ -22,4 +20,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "Ein {{pokemonName}} ist aus dem Ei geschlüpft!", "eggMoveUnlock": "Ei-Attacke freigeschaltet: {{moveName}}", "rareEggMoveUnlock": "Seltene Ei-Attacke freigeschaltet: {{moveName}}", -} as const; + "moveUPGacha": "Mehr\nEi-Attacken!", + "shinyUPGacha": "Mehr\nSchillernde!", + "legendaryUPGacha": "erscheint\nöfter!" +} \ No newline at end of file diff --git a/src/locales/de/fight-ui-handler.json b/src/locales/de/fight-ui-handler.json new file mode 100644 index 00000000000..6965540c703 --- /dev/null +++ b/src/locales/de/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "AP", + "power": "Stärke", + "accuracy": "Genauigkeit", + "abilityFlyInText": "{{passive}}{{abilityName}} von {{pokemonName}} wirkt!", + "passive": "Passive Fähigkeit " +} \ No newline at end of file diff --git a/src/locales/de/fight-ui-handler.ts b/src/locales/de/fight-ui-handler.ts deleted file mode 100644 index 255b48b3aa4..00000000000 --- a/src/locales/de/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "AP", - "power": "Stärke", - "accuracy": "Genauigkeit", - "abilityFlyInText": "{{passive}}{{abilityName}} von {{pokemonName}} wirkt!", - "passive": "Passive Fähigkeit ", // The space at the end is important -} as const; diff --git a/src/locales/de/filter-bar.json b/src/locales/de/filter-bar.json new file mode 100644 index 00000000000..ebfeaa6a00e --- /dev/null +++ b/src/locales/de/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "Gen.", + "typeFilter": "Typ", + "caughtFilter": "Gefangen", + "unlocksFilter": "Freisch.", + "miscFilter": "Sonst.", + "sortFilter": "Sort.", + "all": "Alle", + "normal": "Normal", + "uncaught": "Nicht gefangen", + "passive": "Passive", + "passiveUnlocked": "Passive freigeschaltet", + "passiveLocked": "Passive gesperrt", + "passiveUnlockable": "Passive - Freischalten möglich", + "costReduction": "Kostenreduzierung", + "costReductionUnlocked": "Kosten bereits reduziert", + "costReductionLocked": "Kosten noch nicht reduziert", + "costReductionUnlockable": "Kosten können reduziert werden", + "favorite": "Favorit", + "isFavorite": "Favorit - Ja", + "notFavorite": "Favorit - Nein", + "ribbon": "Band", + "hasWon": "Hat Klassik-Modus gewonnen", + "hasNotWon": "Hat Klassik-Modus nicht gewonnen", + "hiddenAbility": "Versteckte Fähigkeit", + "hasHiddenAbility": "Versteckte Fähigkeit - Ja", + "noHiddenAbility": "Versteckte Fähigkeit - Nein", + "egg": "Ei", + "eggPurchasable": "Kauf möglich", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Ja", + "noPokerus": "Pokérus - Nein", + "sortByNumber": "Pokédex-Nummer", + "sortByCost": "Kosten", + "sortByCandies": "Anzahl Bonbons", + "sortByIVs": "IS-Werte", + "sortByName": "Name" +} \ No newline at end of file diff --git a/src/locales/de/game-mode.json b/src/locales/de/game-mode.json new file mode 100644 index 00000000000..214ee156b7b --- /dev/null +++ b/src/locales/de/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "Klassik", + "endless": "Endlos", + "endlessSpliced": "Endlos (Fusion)", + "dailyRun": "Täglicher Run", + "unknown": "Unbekannt", + "challenge": "Herausforderung" +} \ No newline at end of file diff --git a/src/locales/de/game-mode.ts b/src/locales/de/game-mode.ts deleted file mode 100644 index 72661bd4682..00000000000 --- a/src/locales/de/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "Klassik", - "endless": "Endlos", - "endlessSpliced": "Endlos (Fusion)", - "dailyRun": "Täglicher Run", - "unknown": "Unbekannt", - "challenge": "Challenge", -} as const; diff --git a/src/locales/de/game-stats-ui-handler.ts b/src/locales/de/game-stats-ui-handler.json similarity index 87% rename from src/locales/de/game-stats-ui-handler.ts rename to src/locales/de/game-stats-ui-handler.json index 776a28f95c7..f52c31e2ee8 100644 --- a/src/locales/de/game-stats-ui-handler.ts +++ b/src/locales/de/game-stats-ui-handler.json @@ -1,44 +1,42 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Statistiken", - "playTime": "Spielzeit", - "totalBattles": "Kämpfe insgesamt", - "starters": "Starter", - "shinyStarters": "Schillernde Starter", - "speciesSeen": "Gesehene Arten", - "speciesCaught": "Gefangene Arten", - "ribbonsOwned": "Bänder im Besitz", - "classicRuns": "Klassik-Modus Versuche", - "classicWins": "Klassik-Modus Siege", - "dailyRunAttempts": "Täglicher-Modus Versuche", - "dailyRunWins": "Täglicher-Modus Siege", - "endlessRuns": "Endlos-Modus Versuche", - "highestWaveEndless": "Höchste Welle (Endlos)", - "highestMoney": "Max. Geld im Besitz", - "highestDamage": "Höchster Schaden", - "highestHPHealed": "Höchste Heilung", - "pokemonEncountered": "Getroffene Pokémon", - "pokemonDefeated": "Besiegte Pokémon", - "pokemonCaught": "Gefangene Pokémon", - "eggsHatched": "Ausgebrütete Eier", - "subLegendsSeen": "Getroffene Sub-Legenden", - "subLegendsCaught": "Gefangene Sub-Legenden", - "subLegendsHatched": "Ausgebrütete Sub-Legenden", - "legendsSeen": "Getroffene Legenden", - "legendsCaught": "Gefangene Legenden", - "legendsHatched": "Ausgebrütete Legenden", - "mythicalsSeen": "Getroffene Mythische", - "mythicalsCaught": "Gefangene Mythische", - "mythicalsHatched": "Ausgebrütete Mythische", - "shiniesSeen": "Getroffene Schillernde", - "shiniesCaught": "Gefangene Schillernde", - "shiniesHatched": "Ausgebrütete Schillernde", - "pokemonFused": "Pokémon fusioniert", - "trainersDefeated": "Besiegte Trainer", - "eggsPulled": "Gezogene Eier", - "rareEggsPulled": "Seltene Eier Gezogen", - "epicEggsPulled": "Epische Eier Gezogen", - "legendaryEggsPulled": "Legendäre Eier Gezogen", - "manaphyEggsPulled": "Manaphy Eier Gezogen", -} as const; +{ + "stats": "Statistiken", + "playTime": "Spielzeit", + "totalBattles": "Kämpfe insgesamt", + "starters": "Starter", + "shinyStarters": "Schillernde Starter", + "speciesSeen": "Gesehene Arten", + "speciesCaught": "Gefangene Arten", + "ribbonsOwned": "Bänder im Besitz", + "classicRuns": "Klassik-Modus Versuche", + "classicWins": "Klassik-Modus Siege", + "dailyRunAttempts": "Täglicher-Modus Versuche", + "dailyRunWins": "Täglicher-Modus Siege", + "endlessRuns": "Endlos-Modus Versuche", + "highestWaveEndless": "Höchste Welle (Endlos)", + "highestMoney": "Max. Geld im Besitz", + "highestDamage": "Höchster Schaden", + "highestHPHealed": "Höchste Heilung", + "pokemonEncountered": "Getroffene Pokémon", + "pokemonDefeated": "Besiegte Pokémon", + "pokemonCaught": "Gefangene Pokémon", + "eggsHatched": "Ausgebrütete Eier", + "subLegendsSeen": "Getroffene Sub-Legenden", + "subLegendsCaught": "Gefangene Sub-Legenden", + "subLegendsHatched": "Ausgebrütete Sub-Legenden", + "legendsSeen": "Getroffene Legenden", + "legendsCaught": "Gefangene Legenden", + "legendsHatched": "Ausgebrütete Legenden", + "mythicalsSeen": "Getroffene Mythische", + "mythicalsCaught": "Gefangene Mythische", + "mythicalsHatched": "Ausgebrütete Mythische", + "shiniesSeen": "Getroffene Schillernde", + "shiniesCaught": "Gefangene Schillernde", + "shiniesHatched": "Ausgebrütete Schillernde", + "pokemonFused": "Pokémon fusioniert", + "trainersDefeated": "Besiegte Trainer", + "eggsPulled": "Gezogene Eier", + "rareEggsPulled": "Seltene Eier Gezogen", + "epicEggsPulled": "Epische Eier Gezogen", + "legendaryEggsPulled": "Legendäre Eier Gezogen", + "manaphyEggsPulled": "Manaphy Eier Gezogen" +} \ No newline at end of file diff --git a/src/locales/de/growth.ts b/src/locales/de/growth.json similarity index 55% rename from src/locales/de/growth.ts rename to src/locales/de/growth.json index 275f1645b87..9f5f17f363c 100644 --- a/src/locales/de/growth.ts +++ b/src/locales/de/growth.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { +{ "Erratic": "Unregelmäßig", "Fast": "Schnell", "Medium_Fast": "Schneller", "Medium_Slow": "Langsamer", "Slow": "Langsam", "Fluctuating": "Schwankend" -} as const; +} \ No newline at end of file diff --git a/src/locales/de/menu-ui-handler.ts b/src/locales/de/menu-ui-handler.json similarity index 64% rename from src/locales/de/menu-ui-handler.ts rename to src/locales/de/menu-ui-handler.json index 0338ba6f399..93c3f4c38e8 100644 --- a/src/locales/de/menu-ui-handler.ts +++ b/src/locales/de/menu-ui-handler.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { +{ "GAME_SETTINGS": "Spieleinstellungen", "ACHIEVEMENTS": "Erfolge", "STATS": "Statistiken", - "VOUCHERS": "Gutscheine", + "RUN_HISTORY": "Laufhistorie", "EGG_LIST": "Eierliste", "EGG_GACHA": "Eier-Gacha", "MANAGE_DATA": "Daten verwalten", @@ -16,9 +14,17 @@ export const menuUiHandler: SimpleTranslationEntries = { "importSlotSelect": "Wähle einen Slot zum Importieren.", "exportSession": "Sitzung exportieren", "exportSlotSelect": "Wähle einen Slot zum Exportieren.", + "importRunHistory": "Laufhistorie importieren", + "exportRunHistory": "Laufhistorie exportieren", "importData": "Daten importieren", "exportData": "Daten exportieren", + "consentPreferences": "Einwilligungspräferenzen", + "linkDiscord": "Discord verbinden", + "unlinkDiscord": "Discord trennen", + "linkGoogle": "Google verbinden", + "unlinkGoogle": "Google trennen", "cancel": "Abbrechen", "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?", - "noEggs": "Du brütest aktuell keine Eier aus!" -} as const; + "noEggs": "Du brütest aktuell keine Eier aus!", + "donate": "Spenden" +} \ No newline at end of file diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.json similarity index 85% rename from src/locales/de/menu.ts rename to src/locales/de/menu.json index bffcdeb1c3e..0e2ba4dc0b3 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.json @@ -1,11 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const menu: SimpleTranslationEntries = { +{ "cancel": "Abbrechen", "continue": "Fortfahren", "dailyRun": "Täglicher Run (Beta)", @@ -17,6 +10,7 @@ export const menu: SimpleTranslationEntries = { "username": "Benutzername", "password": "Passwort", "login": "Anmelden", + "orUse": "Oder nutze", "register": "Registrieren", "emptyUsername": "Benutzername darf nicht leer sein.", "invalidLoginUsername": "Der eingegebene Benutzername ist ungültig.", @@ -35,7 +29,7 @@ export const menu: SimpleTranslationEntries = { "failedToLoadSession": "Ihre Sitzungsdaten konnten nicht geladen werden.\nSie könnten beschädigt sein.", "boyOrGirl": "Bist du ein Junge oder ein Mädchen?", "evolving": "Nanu?\n{{pokemonName}} entwickelt sich!", - "stoppedEvolving": "Hm? {{pokemonName}} hat die Entwicklung \nabgebrochen.", // "Hm? Entwicklung wurde abgebrochen!" without naming the pokemon seems to be the original. + "stoppedEvolving": "Hm? {{pokemonName}} hat die Entwicklung \nabgebrochen.", "pauseEvolutionsQuestion": "Die Entwicklung von {{pokemonName}} vorübergehend pausieren?\nEntwicklungen können im Gruppenmenü wieder aktiviert werden.", "evolutionsPaused": "Entwicklung von {{pokemonName}} pausiert.", "evolutionDone": "Glückwunsch!\nDein {{pokemonName}} entwickelte sich zu {{evolvedPokemonName}}!", @@ -49,10 +43,15 @@ export const menu: SimpleTranslationEntries = { "loading": "Lade…", "loadingAsset": "Lade Asset: {{assetName}}", "playersOnline": "Spieler Online", - "yes":"Ja", - "no":"Nein", + "yes": "Ja", + "no": "Nein", "disclaimer": "HAFTUNGSAUSSCHLUSS", "disclaimerDescription": "Dieses Spiel ist ein unfertiges Produkt. Es kann spielbeinträchtigende Fehler (bis hin zum Verlust des Speicherstandes)\n aufweisen, sich ohne Vorankündigung ändern und es gibt keine Garantie dass es weiterentwickelt oder fertiggestellt wird.", "choosePokemon": "Wähle ein Pokémon.", + "renamePokemon": "Pokémon umbennenen", + "rename": "Umbenennen", + "nickname": "Spitzname", "errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden.", -} as const; + "noSaves": "Du hast keine gespeicherten Dateien!", + "tooManySaves": "Du hast zu viele gespeicherte Dateien!" +} diff --git a/src/locales/de/modifier-select-ui-handler.json b/src/locales/de/modifier-select-ui-handler.json new file mode 100644 index 00000000000..3de1222c3b4 --- /dev/null +++ b/src/locales/de/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "Übertragen", + "reroll": "Neu rollen", + "lockRarities": "Seltenheit festsetzen", + "checkTeam": "Team überprüfen", + "transferDesc": "Übertrage ein gehaltenes Item zu einem anderen Pokémon.", + "rerollDesc": "Nutze Geld um die Items neu zu rollen.", + "lockRaritiesDesc": "Setze die Seltenheit der Items fest. (Beeinflusst die Rollkosten).", + "checkTeamDesc": "Überprüfe dein Team or nutze Formänderungsitems.", + "rerollCost": "{{formattedMoney}}₽", + "itemCost": "{{formattedMoney}}₽" +} \ No newline at end of file diff --git a/src/locales/de/modifier-type.json b/src/locales/de/modifier-type.json new file mode 100644 index 00000000000..7c7972343d6 --- /dev/null +++ b/src/locales/de/modifier-type.json @@ -0,0 +1,607 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{modifierCount}}x {{pokeballName}}", + "description": "Erhalte {{pokeballName}} x{{modifierCount}}. (Inventar: {{pokeballAmount}}) \nFangrate: {{catchRate}}" + }, + "AddVoucherModifierType": { + "name": "{{modifierCount}}x {{voucherTypeName}}", + "description": "Erhalte {{voucherTypeName}} x{{modifierCount}}." + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}} kann dieses\nItem nicht nehmen!", + "tooMany": "{{pokemonName}} hat zu viele\nvon diesem Item!" + } + }, + "PokemonHpRestoreModifierType": { + "description": "Füllt {{restorePoints}} KP oder {{restorePercent}}% der KP für ein Pokémon auf. Je nachdem, welcher Wert höher ist.", + "extra": { + "fully": "Füllt die KP eines Pokémon wieder vollständig auf.", + "fullyWithStatus": "Füllt die KP eines Pokémon wieder vollständig auf und behebt alle Statusprobleme." + } + }, + "PokemonReviveModifierType": { + "description": "Belebt ein kampunfähiges Pokémon wieder und stellt {{restorePercent}}% KP wieder her." + }, + "PokemonStatusHealModifierType": { + "description": "Behebt alle Statusprobleme eines Pokémon." + }, + "PokemonPpRestoreModifierType": { + "description": "Füllt {{restorePoints}} AP der ausgewählten Attacke eines Pokémon auf.", + "extra": { + "fully": "Füllt alle AP der ausgewählten Attacke eines Pokémon auf." + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "Stellt {{restorePoints}} AP für alle Attacken eines Pokémon auf.", + "extra": { + "fully": "Füllt alle AP für alle Attacken eines Pokémon auf." + } + }, + "PokemonPpUpModifierType": { + "description": "Erhöht die maximale Anzahl der AP der ausgewählten Attacke um {{upPoints}} für jede 5 maximale AP (maximal 3)." + }, + "PokemonNatureChangeModifierType": { + "name": "{{natureName}} Minze", + "description": "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei." + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "Vervierfacht die Chance, dass ein Kampf ein Doppelkampf wird, für bis zu {{battleCount}} Kämpfe." + }, + "TempStatStageBoosterModifierType": { + "description": "Erhöht {{stat}} aller Teammitglieder um {{amount}} für bis zu 5 Kämpfe.", + "extra": { + "stage": "eine Stufe", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%." + }, + "PokemonLevelIncrementModifierType": { + "description": "Erhöht das Level eines Pokémon um {{levels}}." + }, + "AllPokemonLevelIncrementModifierType": { + "description": "Erhöht das Level aller Teammitglieder um {{levels}}." + }, + "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." + }, + "AllPokemonFullReviveModifierType": { + "description": "Belebt alle kampunfähigen Pokémon wieder und stellt ihre KP vollständig wieder her." + }, + "MoneyRewardModifierType": { + "description": "Gewährt einen {{moneyMultiplier}} Geldbetrag von (₽{{moneyAmount}}).", + "extra": { + "small": "kleinen", + "moderate": "moderaten", + "large": "großen" + } + }, + "ExpBoosterModifierType": { + "description": "Erhöht die erhaltenen Erfahrungspunkte um {{boostPercent}}%." + }, + "PokemonExpBoosterModifierType": { + "description": "Erhöht die Menge der erhaltenen Erfahrungspunkte für den Träger um {{boostPercent}}%." + }, + "PokemonFriendshipBoosterModifierType": { + "description": "Erhöht den Freundschaftszuwachs pro Sieg um 50%." + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "Erhöht die Genauigkeit der Angriffe um {{accuracyAmount}} (maximal 100)." + }, + "PokemonMultiHitModifierType": { + "description": "Attacken treffen ein weiteres mal mit einer Reduktion von 60/75/82,5% der Stärke." + }, + "TmModifierType": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "Bringt einem Pokémon {{moveName}} bei." + }, + "TmModifierTypeWithInfo": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "Bringt einem Pokémon {{moveName}} bei\n(Halte C oder Shift für mehr Infos)." + }, + "EvolutionItemModifierType": { + "description": "Erlaubt es bestimmten Pokémon sich zu entwickeln." + }, + "FormChangeItemModifierType": { + "description": "Erlaubt es bestimmten Pokémon ihre Form zu ändern." + }, + "FusePokemonModifierType": { + "description": "Fusioniert zwei Pokémon (überträgt die Fähigkeit, teilt Basiswerte und Typ auf, gemeinsamer Attackenpool)." + }, + "TerastallizeModifierType": { + "name": "{{teraType}} Terra-Stück", + "description": "{{teraType}} Terakristallisiert den Träger für bis zu 10 Kämpfe." + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "Beim Angriff besteht eine {{chancePercent}}%ige Chance, dass das getragene Item des Gegners gestohlen wird." + }, + "TurnHeldItemTransferModifierType": { + "description": "Jede Runde erhält der Träger ein getragenes Item des Gegners." + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "Fügt Angriffen eine {{chancePercent}}%ige Chance hinzu, {{statusEffect}} zu verursachen." + }, + "EnemyEndureChanceModifierType": { + "description": "Gibt den Träger eine {{chancePercent}}%ige Chance, einen Angriff zu überleben." + }, + "RARE_CANDY": { + "name": "Sonderbonbon" + }, + "RARER_CANDY": { + "name": "Supersondererbonbon" + }, + "MEGA_BRACELET": { + "name": "Mega-Armband", + "description": "Mega-Steine werden verfügbar." + }, + "DYNAMAX_BAND": { + "name": "Dynamax-Band", + "description": "Dyna-Pilze werden verfügbar." + }, + "TERA_ORB": { + "name": "Terakristall-Orb", + "description": "Tera-Stücke werden verfügbar." + }, + "MAP": { + "name": "Karte", + "description": "Ermöglicht es dir, an einer Kreuzung dein Ziel zu wählen." + }, + "POTION": { + "name": "Trank" + }, + "SUPER_POTION": { + "name": "Supertrank" + }, + "HYPER_POTION": { + "name": "Hypertrank" + }, + "MAX_POTION": { + "name": "Top-Trank" + }, + "FULL_RESTORE": { + "name": "Top-Genesung" + }, + "REVIVE": { + "name": "Beleber" + }, + "MAX_REVIVE": { + "name": "Top-Beleber" + }, + "FULL_HEAL": { + "name": "Hyperheiler" + }, + "SACRED_ASH": { + "name": "Zauberasche" + }, + "REVIVER_SEED": { + "name": "Belebersamen", + "description": "Belebt den Träger mit der Hälfte seiner KP wieder, sollte er durch einen direkten Treffer kampfunfähig werden." + }, + "WHITE_HERB": { + "name": "Schlohkraut", + "description": "Ein Item zum Tragen. Es hebt einmalig jede negative Statuswertveränderung auf." + }, + "ETHER": { + "name": "Äther" + }, + "MAX_ETHER": { + "name": "Top-Äther" + }, + "ELIXIR": { + "name": "Elixir" + }, + "MAX_ELIXIR": { + "name": "Top-Elixir" + }, + "PP_UP": { + "name": "AP-Plus" + }, + "PP_MAX": { + "name": "AP-Top" + }, + "LURE": { + "name": "Lockparfüm" + }, + "SUPER_LURE": { + "name": "Super-Lockparfüm" + }, + "MAX_LURE": { + "name": "Top-Lockparfüm" + }, + "MEMORY_MUSHROOM": { + "name": "Erinnerungspilz", + "description": "Lässt ein Pokémon eine vergessene Attacke wiedererlernen." + }, + "EXP_SHARE": { + "name": "EP-Teiler", + "description": "Pokémon, die nicht am Kampf teilgenommen haben, bekommen 20% der Erfahrungspunkte eines Kampfteilnehmers." + }, + "EXP_BALANCE": { + "name": "EP-Ausgleicher", + "description": "Gewichtet die in Kämpfen erhaltenen Erfahrungspunkte auf niedrigstufigere Gruppenmitglieder." + }, + "OVAL_CHARM": { + "name": "Ovalpin", + "description": "Wenn mehrere Pokémon am Kampf teilnehmen, erhählt jeder von ihnen 10% extra Erfahrungspunkte." + }, + "EXP_CHARM": { + "name": "EP-Pin" + }, + "SUPER_EXP_CHARM": { + "name": "Super-EP-Pin" + }, + "GOLDEN_EXP_CHARM": { + "name": "Goldener EP-Pin" + }, + "LUCKY_EGG": { + "name": "Glücks-Ei" + }, + "GOLDEN_EGG": { + "name": "Goldenes Ei" + }, + "SOOTHE_BELL": { + "name": "Sanftglocke" + }, + "SCOPE_LENS": { + "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." + }, + "EVIOLITE": { + "name": "Evolith", + "description": "Ein mysteriöser Klumpen, der die Vert. u. Spez.-Vert. von Pokémon erhöht, die sich noch entwickeln können." + }, + "SOUL_DEW": { + "name": "Seelentau", + "description": "Erhöht den Einfluss des Wesens eines Pokemon auf seine Werte um 10% (additiv)." + }, + "NUGGET": { + "name": "Nugget" + }, + "BIG_NUGGET": { + "name": "Riesennugget" + }, + "RELIC_GOLD": { + "name": "Alter Dukat" + }, + "AMULET_COIN": { + "name": "Münzamulett", + "description": "Erhöht das Preisgeld um 20%." + }, + "GOLDEN_PUNCH": { + "name": "Goldschlag", + "description": "Gewährt Geld in Höhe von 50% des zugefügten Schadens." + }, + "COIN_CASE": { + "name": "Münzkorb", + "description": "Erhalte nach jedem 10ten Kampf 10% Zinsen auf dein Geld." + }, + "LOCK_CAPSULE": { + "name": "Tresorkapsel", + "description": "Erlaubt es die Seltenheitsstufe der Items festzusetzen wenn diese neu gerollt werden." + }, + "GRIP_CLAW": { + "name": "Griffklaue" + }, + "WIDE_LENS": { + "name": "Großlinse" + }, + "MULTI_LENS": { + "name": "Mehrfachlinse" + }, + "HEALING_CHARM": { + "name": "Heilungspin", + "description": "Erhöht die Effektivität von Heilungsattacken sowie Heilitems um 10% (Beleber ausgenommen)." + }, + "CANDY_JAR": { + "name": "Bonbonglas", + "description": "Erhöht die Anzahl der Level die ein Sonderbonbon erhöht um 1." + }, + "BERRY_POUCH": { + "name": "Beerentüte", + "description": "Fügt eine 30% Chance hinzu, dass Beeren nicht verbraucht werden." + }, + "FOCUS_BAND": { + "name": "Fokusband", + "description": "Fügt eine 10% Chance hinzu, dass Angriffe die zur Kampfunfähigkeit führen mit 1 KP überlebt werden." + }, + "QUICK_CLAW": { + "name": "Flinkklaue", + "description": "Fügt eine 10% Change hinzu als erster anzugreifen. (Nach Prioritätsangriffen)." + }, + "KINGS_ROCK": { + "name": "King-Stein", + "description": "Fügt eine 10% Chance hinzu, dass der Gegner nach einem Angriff zurückschreckt." + }, + "LEFTOVERS": { + "name": "Überreste", + "description": "Heilt 1/16 der maximalen KP eines Pokémon pro Runde." + }, + "SHELL_BELL": { + "name": "Muschelglocke", + "description": "Heilt den Anwender um 1/8 des von ihm zugefügten Schadens." + }, + "TOXIC_ORB": { + "name": "Toxik-Orb", + "description": "Dieser bizarre Orb vergiftet seinen Träger im Kampf schwer." + }, + "FLAME_ORB": { + "name": "Heiß-Orb", + "description": "Dieser bizarre Orb fügt seinem Träger im Kampf Verbrennungen zu." + }, + "BATON": { + "name": "Stab", + "description": "Ermöglicht das Weitergeben von Effekten beim Wechseln von Pokémon, wodurch auch Fallen umgangen werden." + }, + "SHINY_CHARM": { + "name": "Schillerpin", + "description": "Erhöht die Chance deutlich, dass ein wildes Pokémon ein schillernd ist." + }, + "ABILITY_CHARM": { + "name": "Fähigkeitspin", + "description": "Erhöht die Chance deutlich, dass ein wildes Pokémon eine versteckte Fähigkeit hat." + }, + "IV_SCANNER": { + "name": "IS-Scanner", + "description": "Erlaubt es die IS-Werte von wilden Pokémon zu scannen.\n(2 IS-Werte pro Staplung. Die besten IS-Werte zuerst)." + }, + "DNA_SPLICERS": { + "name": "DNS-Keil" + }, + "MINI_BLACK_HOLE": { + "name": "Mini schwarzes Loch" + }, + "GOLDEN_POKEBALL": { + "name": "Goldener Pokéball", + "description": "Fügt eine zusätzliche Item-Auswahlmöglichkeit nach jedem Kampf hinzu." + }, + "ENEMY_DAMAGE_BOOSTER": { + "name": "Schadensmarke", + "description": "Erhöht den Schaden um 5%." + }, + "ENEMY_DAMAGE_REDUCTION": { + "name": "Schutzmarke", + "description": "Verringert den erhaltenen Schaden um 2,5%." + }, + "ENEMY_HEAL": { + "name": "Wiederherstellungsmarke", + "description": "Heilt 2% der maximalen KP pro Runde." + }, + "ENEMY_ATTACK_POISON_CHANCE": { + "name": "Giftmarke" + }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { + "name": "Lähmungsmarke" + }, + "ENEMY_ATTACK_BURN_CHANCE": { + "name": "Brandmarke" + }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { + "name": "Vollheilungsmarke", + "description": "Fügt eine 2,5%ige Chance hinzu, jede Runde einen Statuszustand zu heilen." + }, + "ENEMY_ENDURE_CHANCE": { + "name": "Ausdauer-Marke" + }, + "ENEMY_FUSED_CHANCE": { + "name": "Fusionsmarke", + "description": "Fügt eine 1%ige Chance hinzu, dass ein wildes Pokémon eine Fusion ist." + } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { + "name": "Kugelblitz", + "description": "Ein Item, das von Pikachu getragen werden kann. Es erhöht den Angriff und den Spezial-Angriff." + }, + "THICK_CLUB": { + "name": "Kampfknochen", + "description": "Ein Item, das von Tragosso oder Knogga getragen werden kann. Dieser harte Knochen erhöht den Angriff." + }, + "METAL_POWDER": { + "name": "Metallstaub", + "description": "Ein Item, das von Ditto getragen werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Verteidigung." + }, + "QUICK_POWDER": { + "name": "Flottstaub", + "description": "Ein Item, das Ditto zum Tragen gegeben werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Initiative." + } + }, + "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" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "Seidenschal", + "black_belt": "Schwarzgurt", + "sharp_beak": "Spitzer Schnabel", + "poison_barb": "Giftstich", + "soft_sand": "Pudersand", + "hard_stone": "Granitstein", + "silver_powder": "Silberstaub", + "spell_tag": "Bannsticker", + "metal_coat": "Metallmantel", + "charcoal": "Holzkohle", + "mystic_water": "Zauberwasser", + "miracle_seed": "Wundersaat", + "magnet": "Magnet", + "twisted_spoon": "Krümmlöffel", + "never_melt_ice": "Ewiges Eis", + "dragon_fang": "Drachenzahn", + "black_glasses": "Schattenbrille", + "fairy_feather": "Feendaune" + }, + "BaseStatBoosterItem": { + "hp_up": "KP-Plus", + "protein": "Protein", + "iron": "Eisen", + "calcium": "Kalzium", + "zinc": "Zink", + "carbos": "Carbon" + }, + "EvolutionItem": { + "NONE": "Keins", + "LINKING_CORD": "Linkkabel", + "SUN_STONE": "Sonnenstein", + "MOON_STONE": "Mondstein", + "LEAF_STONE": "Blattstein", + "FIRE_STONE": "Feuerstein", + "WATER_STONE": "Wasserstein", + "THUNDER_STONE": "Donnerstein", + "ICE_STONE": "Eisstein", + "DUSK_STONE": "Finsterstein", + "DAWN_STONE": "Funkelstein", + "SHINY_STONE": "Leuchtstein", + "CRACKED_POT": "Rissige Kanne", + "SWEET_APPLE": "Süßer Apfel", + "TART_APPLE": "Saurer Apfel", + "STRAWBERRY_SWEET": "Zucker-Erdbeere", + "UNREMARKABLE_TEACUP": "Simple Teeschale", + "CHIPPED_POT": "Löchrige Kanne", + "BLACK_AUGURITE": "Schwarzaugit", + "GALARICA_CUFF": "Galarnuss-Reif", + "GALARICA_WREATH": "Galarnuss-Kranz", + "PEAT_BLOCK": "Torfblock", + "AUSPICIOUS_ARMOR": "Glorienrüstung", + "MALICIOUS_ARMOR": "Fluchrüstung", + "MASTERPIECE_TEACUP": "Edle Teeschale", + "METAL_ALLOY": "Legierungsmetall", + "SCROLL_OF_DARKNESS": "Unlicht-Schriftrolle", + "SCROLL_OF_WATERS": "Wasser-Schriftrolle", + "SYRUPY_APPLE": "Saftiger Apfel" + }, + "FormChangeItem": { + "NONE": "Keins", + "ABOMASITE": "Rexblisarnit", + "ABSOLITE": "Absolnit", + "AERODACTYLITE": "Aerodactylonit", + "AGGRONITE": "Stollossnit", + "ALAKAZITE": "Simsalanit", + "ALTARIANITE": "Altarianit", + "AMPHAROSITE": "Ampharosnit", + "AUDINITE": "Ohrdochnit", + "BANETTITE": "Banetteonit", + "BEEDRILLITE": "Bibornit", + "BLASTOISINITE": "Turtoknit", + "BLAZIKENITE": "Lohgocknit", + "CAMERUPTITE": "Cameruptnit", + "CHARIZARDITE_X": "Gluraknit X", + "CHARIZARDITE_Y": "Gluraknit Y", + "DIANCITE": "Diancienit", + "GALLADITE": "Galagladinit", + "GARCHOMPITE": "Knakracknit", + "GARDEVOIRITE": "Guardevoirnit", + "GENGARITE": "Gengarnit ", + "GLALITITE": "Firnontornit", + "GYARADOSITE": "Garadosnit", + "HERACRONITE": "Skarabornit", + "HOUNDOOMINITE": "Hundemonit ", + "KANGASKHANITE": "Kangamanit", + "LATIASITE": "Latiasnit", + "LATIOSITE": "Latiosnit", + "LOPUNNITE": "Schlapornit", + "LUCARIONITE": "Lucarionit", + "MANECTITE": "Voltensonit", + "MAWILITE": "Flunkifernit", + "MEDICHAMITE": "Meditalisnit", + "METAGROSSITE": "Metagrossnit", + "MEWTWONITE_X": "Mewtunit X", + "MEWTWONITE_Y": "Mewtunit Y", + "PIDGEOTITE": "Taubossnit", + "PINSIRITE": "Pinsirnit", + "RAYQUAZITE": "Rayquazanit", + "SABLENITE": "Zobirisnit", + "SALAMENCITE": "Brutalandanit", + "SCEPTILITE": "Gewaldronit", + "SCIZORITE": "Scheroxnit", + "SHARPEDONITE": "Tohaidonit", + "SLOWBRONITE": "Lahmusnit", + "STEELIXITE": "Stahlosnit", + "SWAMPERTITE": "Sumpexnit", + "TYRANITARITE": "Despotarnit", + "VENUSAURITE": "Bisaflornit", + "BLUE_ORB": "Blauer Edelstein", + "RED_ORB": "Roter Edelstein", + "SHARP_METEORITE": "Scharfer Meteorit", + "HARD_METEORITE": "Harter Meteorit", + "SMOOTH_METEORITE": "Glatter Meteorit", + "ADAMANT_CRYSTAL": "Adamantkristall", + "LUSTROUS_GLOBE": "Weißkristall", + "GRISEOUS_CORE": "Platinumkristall", + "REVEAL_GLASS": "Wahrspiegel", + "GRACIDEA": "Gracidea", + "MAX_MUSHROOMS": "Dyna-Pilz", + "DARK_STONE": "Dunkelstein", + "LIGHT_STONE": "Lichtstein", + "PRISON_BOTTLE": "Banngefäß", + "N_LUNARIZER": "Necrolun", + "N_SOLARIZER": "Necrosol", + "RUSTED_SWORD": "Rostiges Schwert", + "RUSTED_SHIELD": "Rostiges Schild", + "ICY_REINS_OF_UNITY": "Eisige Zügel des Bundes", + "SHADOW_REINS_OF_UNITY": "Schattige Zügel des Bundes", + "WELLSPRING_MASK": "Brunnenmaske", + "HEARTHFLAME_MASK": "Ofenmaske", + "CORNERSTONE_MASK": "Fundamentmaske", + "SHOCK_DRIVE": "Blitzmodul", + "BURN_DRIVE": "Flammenmodul", + "CHILL_DRIVE": "Gefriermodul", + "DOUSE_DRIVE": "Aquamodul", + "ULTRANECROZIUM_Z": "Ultranecrozium Z", + "FIST_PLATE": "Fausttafel", + "SKY_PLATE": "Wolkentafel", + "TOXIC_PLATE": "Gifttafel", + "EARTH_PLATE": "Erdtafel", + "STONE_PLATE": "Steintafel", + "INSECT_PLATE": "Käfertafel", + "SPOOKY_PLATE": "Spuktafel", + "IRON_PLATE": "Eisentafel", + "FLAME_PLATE": "Feuertafel", + "SPLASH_PLATE": "Wassertafel", + "MEADOW_PLATE": "Wiesentafel", + "ZAP_PLATE": "Blitztafel", + "MIND_PLATE": "Hirntafel", + "ICICLE_PLATE": "Frosttafel", + "DRACO_PLATE": "Dracotafel", + "DREAD_PLATE": "Furchttafel", + "PIXIE_PLATE": "Feentafel", + "BLANK_PLATE": "Neutraltafel", + "LEGEND_PLATE": "Legendentafel", + "FIGHTING_MEMORY": "Kampf-Disc", + "FLYING_MEMORY": "Flug-Disc", + "POISON_MEMORY": "Gift-Disc", + "GROUND_MEMORY": "Boden-Disc", + "ROCK_MEMORY": "Gesteins-Disc", + "BUG_MEMORY": "Käfer-Disc", + "GHOST_MEMORY": "Geister-Disc", + "STEEL_MEMORY": "Stahl-Disc", + "FIRE_MEMORY": "Feuer-Disc", + "WATER_MEMORY": "Wasser-Disc", + "GRASS_MEMORY": "Pflanzen-Disc", + "ELECTRIC_MEMORY": "Elektro-Disc", + "PSYCHIC_MEMORY": "Psycho-Disc", + "ICE_MEMORY": "Eis-Disc", + "DRAGON_MEMORY": "Drachen-Disc", + "DARK_MEMORY": "Unlicht-Disc", + "FAIRY_MEMORY": "Feen-Disc", + "NORMAL_MEMORY": "Normal-Disc" + } +} diff --git a/src/locales/de/modifier-type.ts b/src/locales/de/modifier-type.ts deleted file mode 100644 index 8b2950f44c3..00000000000 --- a/src/locales/de/modifier-type.ts +++ /dev/null @@ -1,453 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - "AddPokeballModifierType": { - name: "{{modifierCount}}x {{pokeballName}}", - description: "Erhalte {{pokeballName}} x{{modifierCount}}. (Inventar: {{pokeballAmount}}) \nFangrate: {{catchRate}}", - }, - "AddVoucherModifierType": { - name: "{{modifierCount}}x {{voucherTypeName}}", - description: "Erhalte {{voucherTypeName}} x{{modifierCount}}.", - }, - "PokemonHeldItemModifierType": { - extra: { - "inoperable": "{{pokemonName}} kann dieses\nItem nicht nehmen!", - "tooMany": "{{pokemonName}} hat zu viele\nvon diesem Item!", - } - }, - "PokemonHpRestoreModifierType": { - description: "Füllt {{restorePoints}} KP oder {{restorePercent}}% der KP für ein Pokémon auf. Je nachdem, welcher Wert höher ist.", - extra: { - "fully": "Füllt die KP eines Pokémon wieder vollständig auf.", - "fullyWithStatus": "Füllt die KP eines Pokémon wieder vollständig auf und behebt alle Statusprobleme.", - } - }, - "PokemonReviveModifierType": { - description: "Belebt ein kampunfähiges Pokémon wieder und stellt {{restorePercent}}% KP wieder her.", - }, - "PokemonStatusHealModifierType": { - description: "Behebt alle Statusprobleme eines Pokémon.", - }, - "PokemonPpRestoreModifierType": { - description: "Füllt {{restorePoints}} AP der ausgewählten Attacke eines Pokémon auf.", - extra: { - "fully": "Füllt alle AP der ausgewählten Attacke eines Pokémon auf.", - } - }, - "PokemonAllMovePpRestoreModifierType": { - description: "Stellt {{restorePoints}} AP für alle Attacken eines Pokémon auf.", - extra: { - "fully": "Füllt alle AP für alle Attacken eines Pokémon auf.", - } - }, - "PokemonPpUpModifierType": { - description: "Erhöht die maximale Anzahl der AP der ausgewählten Attacke um {{upPoints}} für jede 5 maximale AP (maximal 3).", - }, - "PokemonNatureChangeModifierType": { - name: "{{natureName}} Minze", - description: "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei.", - }, - "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.", - }, - "AttackTypeBoosterModifierType": { - description: "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%.", - }, - "PokemonLevelIncrementModifierType": { - description: "Erhöht das Level eines Pokémon um 1.", - }, - "AllPokemonLevelIncrementModifierType": { - description: "Erhöht das Level aller Teammitglieder um 1.", - }, - "PokemonBaseStatBoosterModifierType": { - description: "Erhöht den {{statName}} 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.", - }, - "AllPokemonFullReviveModifierType": { - description: "Belebt alle kampunfähigen Pokémon wieder und stellt ihre KP vollständig wieder her.", - }, - "MoneyRewardModifierType": { - description:"Gewährt einen {{moneyMultiplier}} Geldbetrag von (₽{{moneyAmount}}).", - extra: { - "small": "kleinen", - "moderate": "moderaten", - "large": "großen", - }, - }, - "ExpBoosterModifierType": { - description: "Erhöht die erhaltenen Erfahrungspunkte um {{boostPercent}}%.", - }, - "PokemonExpBoosterModifierType": { - description: "Erhöht die Menge der erhaltenen Erfahrungspunkte für den Träger um {{boostPercent}}%.", - }, - "PokemonFriendshipBoosterModifierType": { - description: "Erhöht den Freundschaftszuwachs pro Sieg um 50%.", - }, - "PokemonMoveAccuracyBoosterModifierType": { - description: "Erhöht die Genauigkeit der Angriffe um {{accuracyAmount}} (maximal 100).", - }, - "PokemonMultiHitModifierType": { - description: "Attacken treffen ein weiteres mal mit einer Reduktion von 60/75/82,5% der Stärke.", - }, - "TmModifierType": { - name: "TM{{moveId}} - {{moveName}}", - description: "Bringt einem Pokémon {{moveName}} bei.", - }, - "TmModifierTypeWithInfo": { - name: "TM{{moveId}} - {{moveName}}", - description: "Bringt einem Pokémon {{moveName}} bei\n(Halte C oder Shift für mehr Infos).", - }, - "EvolutionItemModifierType": { - description: "Erlaubt es bestimmten Pokémon sich zu entwickeln.", - }, - "FormChangeItemModifierType": { - description: "Erlaubt es bestimmten Pokémon ihre Form zu ändern.", - }, - "FusePokemonModifierType": { - description: "Fusioniert zwei Pokémon (überträgt die Fähigkeit, teilt Basiswerte und Typ auf, gemeinsamer Attackenpool).", - }, - "TerastallizeModifierType": { - name: "{{teraType}} Terra-Stück", - description: "{{teraType}} Terakristallisiert den Träger für bis zu 10 Kämpfe.", - }, - "ContactHeldItemTransferChanceModifierType": { - description:"Beim Angriff besteht eine {{chancePercent}}%ige Chance, dass das getragene Item des Gegners gestohlen wird." - }, - "TurnHeldItemTransferModifierType": { - description: "Jede Runde erhält der Träger ein getragenes Item des Gegners.", - }, - "EnemyAttackStatusEffectChanceModifierType": { - description: "Fügt Angriffen eine {{chancePercent}}%ige Chance hinzu, {{statusEffect}} zu verursachen.", - }, - "EnemyEndureChanceModifierType": { - description: "Gibt den Träger eine {{chancePercent}}%ige Chance, einen Angriff zu überleben.", - }, - - "RARE_CANDY": { name: "Sonderbonbon" }, - "RARER_CANDY": { name: "Supersondererbonbon" }, - - "MEGA_BRACELET": { name: "Mega-Armband", description: "Mega-Steine werden verfügbar." }, - "DYNAMAX_BAND": { name: "Dynamax-Band", description: "Dyna-Pilze werden verfügbar."}, - "TERA_ORB": { name: "Terakristall-Orb", description: "Tera-Stücke werden verfügbar." }, - - "MAP": { name: "Karte", description: "Ermöglicht es dir, an einer Kreuzung dein Ziel zu wählen." }, - - "POTION": { name: "Trank" }, - "SUPER_POTION": { name: "Supertrank" }, - "HYPER_POTION": { name: "Hypertrank" }, - "MAX_POTION": { name: "Top-Trank" }, - "FULL_RESTORE": { name: "Top-Genesung" }, - - "REVIVE": { name: "Beleber" }, - "MAX_REVIVE": { name: "Top-Beleber" }, - - "FULL_HEAL": { name: "Hyperheiler" }, - - "SACRED_ASH": { name: "Zauberasche" }, - - "REVIVER_SEED": { name: "Belebersamen", description: "Belebt den Träger mit der Hälfte seiner KP wieder sollte er kampfunfähig werden." }, - - "ETHER": { name: "Äther" }, - "MAX_ETHER": { name: "Top-Äther" }, - - "ELIXIR": { name: "Elixir" }, - "MAX_ELIXIR": { name: "Top-Elixir" }, - - "PP_UP": { name: "AP-Plus" }, - "PP_MAX": { name: "AP-Top" }, - - "LURE": { name: "Lockparfüm" }, - "SUPER_LURE": { name: "Super-Lockparfüm" }, - "MAX_LURE": { name: "Top-Lockparfüm" }, - - "MEMORY_MUSHROOM": { name: "Erinnerungspilz", description: "Lässt ein Pokémon eine vergessene Attacke wiedererlernen." }, - - "EXP_SHARE": { name: "EP-Teiler", description: "Pokémon, die nicht am Kampf teilgenommen haben, bekommen 20% der Erfahrungspunkte eines Kampfteilnehmers." }, - "EXP_BALANCE": { name: "EP-Ausgleicher", description: "Gewichtet die in Kämpfen erhaltenen Erfahrungspunkte auf niedrigstufigere Gruppenmitglieder." }, - - "OVAL_CHARM": { name: "Ovalpin", description: "Wenn mehrere Pokémon am Kampf teilnehmen, erhählt jeder von ihnen 10% extra Erfahrungspunkte." }, - - "EXP_CHARM": { name: "EP-Pin" }, - "SUPER_EXP_CHARM": { name: "Super-EP-Pin" }, - "GOLDEN_EXP_CHARM": { name: "Goldener EP-Pin" }, - - "LUCKY_EGG": { name: "Glücks-Ei" }, - "GOLDEN_EGG": { name: "Goldenes Ei" }, - - "SOOTHE_BELL": { name: "Sanftglocke" }, - - "EVIOLITE": { name: "Evolith", description: "Ein mysteriöser Klumpen, der die Vert. u. Spez.-Vert. von Pokémon erhöht, die sich noch entwickeln können." }, - - "SOUL_DEW": { name: "Seelentau", description: "Erhöht den Einfluss des Wesens eines Pokemon auf seine Werte um 10% (additiv)." }, - - "NUGGET": { name: "Nugget" }, - "BIG_NUGGET": { name: "Riesennugget" }, - "RELIC_GOLD": { name: "Alter Dukat" }, - - "AMULET_COIN": { name: "Münzamulett", description: "Erhöht das Preisgeld um 20%." }, - "GOLDEN_PUNCH": { name: "Goldschlag", description: "Gewährt Geld in Höhe von 50% des zugefügten Schadens." }, - "COIN_CASE": { name: "Münzkorb", description: "Erhalte nach jedem 10ten Kampf 10% Zinsen auf dein Geld." }, - - "LOCK_CAPSULE": { name: "Tresorkapsel", description: "Erlaubt es die Seltenheitsstufe der Items festzusetzen wenn diese neu gerollt werden." }, - - "GRIP_CLAW": { name: "Griffklaue" }, - "WIDE_LENS": { name: "Großlinse" }, - - "MULTI_LENS": { name: "Mehrfachlinse" }, - - "HEALING_CHARM": { name: "Heilungspin", description: "Erhöht die Effektivität von Heilungsattacken sowie Heilitems um 10% (Beleber ausgenommen)." }, - "CANDY_JAR": { name: "Bonbonglas", description: "Erhöht die Anzahl der Level die ein Sonderbonbon erhöht um 1." }, - - "BERRY_POUCH": { name: "Beerentüte", description: "Fügt eine 30% Chance hinzu, dass Beeren nicht verbraucht werden." }, - - "FOCUS_BAND": { name: "Fokusband", description: "Fügt eine 10% Chance hinzu, dass Angriffe die zur Kampfunfähigkeit führen mit 1 KP überlebt werden." }, - - "QUICK_CLAW": { name: "Quick Claw", description: "Fügt eine 10% Change hinzu als erster anzugreifen. (Nach Prioritätsangriffen)." }, - - "KINGS_ROCK": { name: "King-Stein", description: "Fügt eine 10% Chance hinzu, dass der Gegner nach einem Angriff zurückschreckt." }, - - "LEFTOVERS": { name: "Überreste", description: "Heilt 1/16 der maximalen KP eines Pokémon pro Runde." }, - "SHELL_BELL": { name: "Muschelglocke", description: "Heilt den Anwender um 1/8 des von ihm zugefügten Schadens." }, - - "TOXIC_ORB": { name: "Toxik-Orb", description: "Dieser bizarre Orb vergiftet seinen Träger im Kampf schwer." }, - "FLAME_ORB": { name: "Heiß-Orb", description: "Dieser bizarre Orb fügt seinem Träger im Kampf Verbrennungen zu." }, - - "BATON": { name: "Stab", description: "Ermöglicht das Weitergeben von Effekten beim Wechseln von Pokémon, wodurch auch Fallen umgangen werden." }, - - "SHINY_CHARM": { name: "Schillerpin", description: "Erhöht die Chance deutlich, dass ein wildes Pokémon ein schillernd ist." }, - "ABILITY_CHARM": { name: "Ability Charm", description: "Erhöht die Chance deutlich, dass ein wildes Pokémon eine versteckte Fähigkeit hat." }, - - "IV_SCANNER": { name: "IS-Scanner", description: "Erlaubt es die IS-Werte von wilden Pokémon zu scannen.\n(2 IS-Werte pro Staplung. Die besten IS-Werte zuerst)." }, - - "DNA_SPLICERS": { name: "DNS-Keil" }, - - "MINI_BLACK_HOLE": { name: "Mini schwarzes Loch" }, - - "GOLDEN_POKEBALL": { name: "Goldener Pokéball", description: "Fügt eine zusätzliche Item-Auswahlmöglichkeit nach jedem Kampf hinzu." }, - - "ENEMY_DAMAGE_BOOSTER": { name: "Schadensmarke", description: "Erhöht den Schaden um 5%." }, - "ENEMY_DAMAGE_REDUCTION": { name: "Schutzmarke", description: "Verringert den erhaltenen Schaden um 2,5%." }, - "ENEMY_HEAL": { name: "Wiederherstellungsmarke", description: "Heilt 2% der maximalen KP pro Runde." }, - "ENEMY_ATTACK_POISON_CHANCE": { name: "Giftmarke" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { "name": "Lähmungsmarke" }, - "ENEMY_ATTACK_BURN_CHANCE": { "name": "Brandmarke" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Vollheilungsmarke", "description": "Fügt eine 2,5%ige Chance hinzu, jede Runde einen Statuszustand zu heilen." }, - "ENEMY_ENDURE_CHANCE": { "name": "Ausdauer-Marke" }, - "ENEMY_FUSED_CHANCE": { "name": "Fusionsmarke", "description": "Fügt eine 1%ige Chance hinzu, dass ein wildes Pokémon eine Fusion ist." }, - - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "Kugelblitz", description: "Ein Item, das von Pikachu getragen werden kann. Es erhöht den Angriff und den Spezial-Angriff." }, - "THICK_CLUB": { name: "Kampfknochen", description: "Ein Item, das von Tragosso oder Knogga getragen werden kann. Dieser harte Knochen erhöht den Angriff." }, - "METAL_POWDER": { name: "Metallstaub", description: "Ein Item, das von Ditto getragen werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Verteidigung." }, - "QUICK_POWDER": { name: "Flottstaub", description: "Ein Item, das Ditto zum Tragen gegeben werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Initiative." } - }, - TempBattleStatBoosterItem: { - "x_attack": "X-Angriff", - "x_defense": "X-Verteidigung", - "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": "???", - }, - - - AttackTypeBoosterItem: { - "silk_scarf": "Seidenschal", - "black_belt": "Schwarzgurt", - "sharp_beak": "Spitzer Schnabel", - "poison_barb": "Giftstich", - "soft_sand": "Pudersand", - "hard_stone": "Granitstein", - "silver_powder": "Silberstaub", - "spell_tag": "Bannsticker", - "metal_coat": "Metallmantel", - "charcoal": "Holzkohle", - "mystic_water": "Zauberwasser", - "miracle_seed": "Wundersaat", - "magnet": "Magnet", - "twisted_spoon": "Krümmlöffel", - "never_melt_ice": "Ewiges Eis", - "dragon_fang": "Drachenzahn", - "black_glasses": "Schattenbrille", - "fairy_feather": "Feendaune", - }, - BaseStatBoosterItem: { - "hp_up": "KP-Plus", - "protein": "Protein", - "iron": "Eisen", - "calcium": "Kalzium", - "zinc": "Zink", - "carbos": "Carbon", - }, - EvolutionItem: { - "NONE": "Keins", - - "LINKING_CORD": "Linkkabel", - "SUN_STONE": "Sonnenstein", - "MOON_STONE": "Mondstein", - "LEAF_STONE": "Blattstein", - "FIRE_STONE": "Feuerstein", - "WATER_STONE": "Wasserstein", - "THUNDER_STONE": "Donnerstein", - "ICE_STONE": "Eisstein", - "DUSK_STONE": "Finsterstein", - "DAWN_STONE": "Funkelstein", - "SHINY_STONE": "Leuchtstein", - "CRACKED_POT": "Rissige Kanne", - "SWEET_APPLE": "Süßer Apfel", - "TART_APPLE": "Saurer Apfel", - "STRAWBERRY_SWEET": "Zucker-Erdbeere", - "UNREMARKABLE_TEACUP": "Simple Teeschale", - - "CHIPPED_POT": "Löchrige Kanne", - "BLACK_AUGURITE": "Schwarzaugit", - "GALARICA_CUFF": "Galarnuss-Reif", - "GALARICA_WREATH": "Galarnuss-Kranz", - "PEAT_BLOCK": "Torfblock", - "AUSPICIOUS_ARMOR": "Glorienrüstung", - "MALICIOUS_ARMOR": "Fluchrüstung", - "MASTERPIECE_TEACUP": "Edle Teeschale", - "METAL_ALLOY": "Legierungsmetall", - "SCROLL_OF_DARKNESS": "Unlicht-Schriftrolle", - "SCROLL_OF_WATERS": "Wasser-Schriftrolle", - "SYRUPY_APPLE": "Saftiger Apfel", - }, - FormChangeItem: { - "NONE": "Keins", - - "ABOMASITE": "Rexblisarnit", - "ABSOLITE": "Absolnit", - "AERODACTYLITE": "Aerodactylonit", - "AGGRONITE": "Stollossnit", - "ALAKAZITE": "Simsalanit", - "ALTARIANITE": "Altarianit", - "AMPHAROSITE": "Ampharosnit", - "AUDINITE": "Ohrdochnit", - "BANETTITE": "Banetteonit", - "BEEDRILLITE": "Bibornit", - "BLASTOISINITE": "Turtoknit", - "BLAZIKENITE": "Lohgocknit", - "CAMERUPTITE": "Cameruptnit", - "CHARIZARDITE_X": "Gluraknit X", - "CHARIZARDITE_Y": "Gluraknit Y", - "DIANCITE": "Diancienit", - "GALLADITE": "Galagladinit", - "GARCHOMPITE": "Knakracknit", - "GARDEVOIRITE": "Guardevoirnit", - "GENGARITE": "Gengarnit ", - "GLALITITE": "Firnontornit", - "GYARADOSITE": "Garadosnit", - "HERACRONITE": "Skarabornit", - "HOUNDOOMINITE": "Hundemonit ", - "KANGASKHANITE": "Kangamanit", - "LATIASITE": "Latiasnit", - "LATIOSITE": "Latiosnit", - "LOPUNNITE": "Schlapornit", - "LUCARIONITE": "Lucarionit", - "MANECTITE": "Voltensonit", - "MAWILITE": "Flunkifernit", - "MEDICHAMITE": "Meditalisnit", - "METAGROSSITE": "Metagrossnit", - "MEWTWONITE_X": "Mewtunit X", - "MEWTWONITE_Y": "Mewtunit Y", - "PIDGEOTITE": "Taubossnit", - "PINSIRITE": "Pinsirnit", - "RAYQUAZITE": "Rayquazanit", - "SABLENITE": "Zobirisnit", - "SALAMENCITE": "Brutalandanit", - "SCEPTILITE": "Gewaldronit", - "SCIZORITE": "Scheroxnit", - "SHARPEDONITE": "Tohaidonit", - "SLOWBRONITE": "Lahmusnit", - "STEELIXITE": "Stahlosnit", - "SWAMPERTITE": "Sumpexnit", - "TYRANITARITE": "Despotarnit", - "VENUSAURITE": "Bisaflornit", - - "BLUE_ORB": "Blauer Edelstein", - "RED_ORB": "Roter Edelstein", - "SHARP_METEORITE": "Scharfer Meteorit", - "HARD_METEORITE": "Harter Meteorit", - "SMOOTH_METEORITE": "Glatter Meteorit", - "ADAMANT_CRYSTAL": "Adamantkristall", - "LUSTROUS_GLOBE": "Weißkristall", - "GRISEOUS_CORE": "Platinumkristall", - "REVEAL_GLASS": "Wahrspiegel", - "GRACIDEA": "Gracidea", - "MAX_MUSHROOMS": "Dyna-Pilz", - "DARK_STONE": "Dunkelstein", - "LIGHT_STONE": "Lichtstein", - "PRISON_BOTTLE": "Banngefäß", - "N_LUNARIZER": "Necrolun", - "N_SOLARIZER": "Necrosol", - "RUSTED_SWORD": "Rostiges Schwert", - "RUSTED_SHIELD": "Rostiges Schild", - "ICY_REINS_OF_UNITY": "Eisige Zügel des Bundes", - "SHADOW_REINS_OF_UNITY": "Schattige Zügel des Bundes", - "WELLSPRING_MASK": "Brunnenmaske", - "HEARTHFLAME_MASK": "Ofenmaske", - "CORNERSTONE_MASK": "Fundamentmaske", - "SHOCK_DRIVE": "Blitzmodul", - "BURN_DRIVE": "Flammenmodul", - "CHILL_DRIVE": "Gefriermodul", - "DOUSE_DRIVE": "Aquamodul", - - "FIST_PLATE": "Fausttafel", - "SKY_PLATE": "Wolkentafel", - "TOXIC_PLATE": "Gifttafel", - "EARTH_PLATE": "Erdtafel", - "STONE_PLATE": "Steintafel", - "INSECT_PLATE": "Käfertafel", - "SPOOKY_PLATE": "Spuktafel", - "IRON_PLATE": "Eisentafel", - "FLAME_PLATE": "Feuertafel", - "SPLASH_PLATE": "Wassertafel", - "MEADOW_PLATE": "Wiesentafel", - "ZAP_PLATE": "Blitztafel", - "MIND_PLATE": "Hirntafel", - "ICICLE_PLATE": "Frosttafel", - "DRACO_PLATE": "Dracotafel", - "DREAD_PLATE": "Furchttafel", - "PIXIE_PLATE": "Feentafel", - "BLANK_PLATE": "Neutraltafel", - "LEGEND_PLATE": "Legendentafel", - "FIGHTING_MEMORY": "Kampf-Disc", - "FLYING_MEMORY": "Flug-Disc", - "POISON_MEMORY": "Gift-Disc", - "GROUND_MEMORY": "Boden-Disc", - "ROCK_MEMORY": "Gesteins-Disc", - "BUG_MEMORY": "Käfer-Disc", - "GHOST_MEMORY": "Geister-Disc", - "STEEL_MEMORY": "Stahl-Disc", - "FIRE_MEMORY": "Feuer-Disc", - "WATER_MEMORY": "Wasser-Disc", - "GRASS_MEMORY": "Pflanzen-Disc", - "ELECTRIC_MEMORY": "Elektro-Disc", - "PSYCHIC_MEMORY": "Psycho-Disc", - "ICE_MEMORY": "Eis-Disc", - "DRAGON_MEMORY": "Drachen-Disc", - "DARK_MEMORY": "Unlicht-Disc", - "FAIRY_MEMORY": "Feen-Disc", - "BLANK_MEMORY": "Leere-Disc", - }, -} as const; diff --git a/src/locales/de/modifier.json b/src/locales/de/modifier.json new file mode 100644 index 00000000000..37227973410 --- /dev/null +++ b/src/locales/de/modifier.json @@ -0,0 +1,12 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}} hält mithilfe des Items {{typeName}} durch!", + "turnHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!", + "hitHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!", + "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} wurde durch {{typeName}} wiederbelebt!", + "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!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}} stellt einige KP wieder her!", + "bypassSpeedChanceApply": "Dank des Items {{itemName}} kann {{pokemonName}} schneller handeln als sonst!" +} \ No newline at end of file diff --git a/src/locales/de/move-trigger.json b/src/locales/de/move-trigger.json new file mode 100644 index 00000000000..61283c9e62e --- /dev/null +++ b/src/locales/de/move-trigger.json @@ -0,0 +1,70 @@ +{ + "hitWithRecoil": "{{pokemonName}} erleidet Schaden durch Rückstoß!", + "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!", + "fled": "{{pokemonName}} ist geflüchtet!", + "cannotBeSwitchedOut": "{{pokemonName}} kann nicht ausgewechselt werden!", + "swappedAbilitiesWithTarget": "{{pokemonName}} tauscht Fähigkeiten mit dem Ziel!", + "coinsScatteredEverywhere": "Es sind überall Münzen verstreut!", + "attackedByItem": "{{pokemonName}} wird von seinem Item {{itemName}} angegriffen!", + "whippedUpAWhirlwind": "{{pokemonName}} erzeugt eine Windböe!", + "flewUpHigh": "{{pokemonName}} fliegt hoch empor!", + "tookInSunlight": "{{pokemonName}} absorbiert Sonnenlicht!", + "dugAHole": "{{pokemonName}} vergräbt sich in der Erde!", + "loweredItsHead": "{{pokemonName}} zieht seinen Kopf ein!", + "isGlowing": "{{pokemonName}} leuchtet grell!", + "bellChimed": "Eine Glocke läutet!", + "foresawAnAttack": "{{pokemonName}} sieht einen Angriff voraus!", + "isTighteningFocus": "{{pokemonName}} konzentriert sich!", + "hidUnderwater": "{{pokemonName}} taucht unter!", + "soothingAromaWaftedThroughArea": "Ein wohltuendes Aroma breitet sich aus!", + "sprangUp": "{{pokemonName}} springt hoch in die Luft!", + "choseDoomDesireAsDestiny": "{{pokemonName}} äußert einen Kismetwunsch für die Zukunft!", + "vanishedInstantly": "{{pokemonName}} verschwindet augenblicklich!", + "tookTargetIntoSky": "{{pokemonName}} entführt {{targetName}} in luftige Höhen!", + "becameCloakedInFreezingLight": "{{pokemonName}} wird von einem kühlen Licht umhüllt!", + "becameCloakedInFreezingAir": "{{pokemonName}} wird in klirrend kalte Luft gehüllt!", + "isChargingPower": "{{pokemonName}} saugt Kraft in sich auf!", + "burnedItselfOut": "{{pokemonName}} braucht sein Feuer komplett auf!", + "startedHeatingUpBeak": "{{pokemonName}} erhitzt seinen Schnabel!", + "setUpShellTrap": "{{pokemonName}} hat eine Panzerfalle gelegt!", + "isOverflowingWithSpacePower": "Kosmische Kräfte strömen aus {{pokemonName}}!", + "usedUpAllElectricity": "{{pokemonName}} braucht seinen Strom komplett auf!", + "stoleItem": "{{pokemonName}} hat {{targetName}} das Item {{itemName}} geklaut!", + "incineratedItem": "{{pokemonName}} hat {{itemName}} von {{targetName}} verbrannt. Es ist somit nutzlos geworden!", + "knockedOffItem": "{{pokemonName}} schlägt das Item {{itemName}} von {{targetName}} weg!", + "tookMoveAttack": "{{pokemonName}} wurde von {{moveName}} getroffen!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} nutzt seine KP und maximiert dadurch seinen {{statName}}-Wert!", + "copiedStatChanges": "{{pokemonName}} kopiert die Statusveränderungen von {{targetName}}!", + "magnitudeMessage": "Intensität {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} zielt auf {{targetName}}!", + "transformedIntoType": "{{pokemonName}} nimmt den Typ {{typeName}} an!", + "copiedMove": "{{pokemonName}} kopiert {{moveName}}!", + "sketchedMove": "{{pokemonName}} ahmt die Attacke {{moveName}} nach!", + "acquiredAbility": "The {{pokemonName}} nimmt die Fähigkeit {{abilityName}} an!", + "copiedTargetAbility": "{{pokemonName}} kopiert{{abilityName}} von {{targetName}}!", + "transformedIntoTarget": "{{pokemonName}} verwandelt sich in {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} versucht, den Angreifer mit sich zu nehmen!", + "addType": "{{pokemonName}} nimmt zusätzlich den Typ {{typeName}} an!", + "cannotUseMove": "{{pokemonName}} kann {{moveName}} nicht einsetzen!", + "healHp": "KP von {{pokemonName}} wurden aufgefrischt!", + "sacrificialFullRestore": "Das Heilopfer von {{pokemonName}} erreicht sein Ziel!", + "invertStats": "Alle Statusveränderungen von {{pokemonName}} wurden invertiert!", + "resetStats": "Die Statusveränderungen von {{pokemonName}} wurden aufgehoben!", + "statEliminated": "Alle Statusveränderungen wurden aufgehoben!", + "faintCountdown": "{{pokemonName}} geht nach {{turnCount}} Runden K.O.!", + "copyType": "{{pokemonName}} hat den Typ von {{targetPokemonName}} angenommen!", + "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}}!", + "safeguard": "{{targetName}} wird durch Bodyguard geschützt!" +} diff --git a/src/locales/de/move.json b/src/locales/de/move.json new file mode 100644 index 00000000000..3c81ccfd7df --- /dev/null +++ b/src/locales/de/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "Klaps", + "effect": "Ein Hieb mit den Vorderbeinen oder dem Schweif." + }, + "karateChop": { + "name": "Karateschlag", + "effect": "Gute Möglichkeit, einen Volltreffer zu landen." + }, + "doubleSlap": { + "name": "Duplexhieb", + "effect": "Trifft das Ziel zwei- bis fünfmal hintereinander mit einem Duplexhieb." + }, + "cometPunch": { + "name": "Kometenhieb", + "effect": "Trifft das Ziel zwei- bis fünfmal hintereinander mit kräftigen Hieben." + }, + "megaPunch": { + "name": "Megahieb", + "effect": "Ein unglaublich kräftiger Hieb." + }, + "payDay": { + "name": "Zahltag", + "effect": "Das Ziel wird mit Münzen beworfen. Das Geld wird nach dem Kampf aufgesammelt." + }, + "firePunch": { + "name": "Feuerschlag", + "effect": "Feuriger Schlag, der dem Ziel eventuell Verbrennungen zufügt." + }, + "icePunch": { + "name": "Eishieb", + "effect": "Ein eisiger Schlag, der das Ziel eventuell einfriert." + }, + "thunderPunch": { + "name": "Donnerschlag", + "effect": "Ein elektrischer Schlag, der das Ziel eventuell paralysiert." + }, + "scratch": { + "name": "Kratzer", + "effect": "Das Ziel wird mit scharfen Klauen zerkratzt." + }, + "viseGrip": { + "name": "Klammer", + "effect": "Das Ziel wird umklammert und zusammengequetscht." + }, + "guillotine": { + "name": "Guillotine", + "effect": "Kräftige Scheren-Attacke. Führt beim Ziel sofort zum K.O." + }, + "razorWind": { + "name": "Klingensturm", + "effect": "Eine Attacke, die über zwei Runden geht. Hohe Volltrefferquote." + }, + "swordsDance": { + "name": "Schwerttanz", + "effect": "Ein wilder Kampftanz, der den eigenen Angriffs-Wert stark erhöht." + }, + "cut": { + "name": "Zerschneider", + "effect": "Ein Basisangriff mit Schere oder Klaue. Damit können kleine Bäume gefällt werden." + }, + "gust": { + "name": "Windstoß", + "effect": "Trifft das Ziel mit einem Windstoß durch einen Flügelschlag." + }, + "wingAttack": { + "name": "Flügelschlag", + "effect": "Trifft das Ziel mit ausgebreiteten Flügeln." + }, + "whirlwind": { + "name": "Wirbelwind", + "effect": "Weht das Ziel weg und ersetzt es durch ein anderes Pokémon. In der Wildnis endet der Kampf." + }, + "fly": { + "name": "Fliegen", + "effect": "Steigt in Runde 1 empor und trifft das Ziel in Runde 2." + }, + "bind": { + "name": "Klammergriff", + "effect": "Umklammert und quetscht das Ziel über vier bis fünf Runden." + }, + "slam": { + "name": "Slam", + "effect": "Schlag mit einem langen Schweif, einer Ranke oder Ähnlichem." + }, + "vineWhip": { + "name": "Rankenhieb", + "effect": "Peitschenähnlicher Schlag mit Ranken." + }, + "stomp": { + "name": "Stampfer", + "effect": "Stampfen mit dem Fuß. Das Ziel schreckt eventuell zurück." + }, + "doubleKick": { + "name": "Doppelkick", + "effect": "Der Anwender tritt in einer Runde zweimal schnell zu." + }, + "megaKick": { + "name": "Megakick", + "effect": "Das Ziel wird mit einem extrem heftigen Tritt angegriffen." + }, + "jumpKick": { + "name": "Sprungkick", + "effect": "Der Angreifer hüpft hoch und tritt zu. Bei Misserfolg schadet er sich selbst." + }, + "rollingKick": { + "name": "Fegekick", + "effect": "Heftiger Tritt aus einer schnellen Drehbewegung. Lässt das Ziel eventuell zurückschrecken." + }, + "sandAttack": { + "name": "Sandwirbel", + "effect": "Senkt Genauigkeit des Zieles, indem ihm Sand ins Gesicht geworfen wird." + }, + "headbutt": { + "name": "Kopfnuss", + "effect": "Rammt das Ziel mit einer Kopfnuss. Ziel schreckt eventuell zurück." + }, + "hornAttack": { + "name": "Hornattacke", + "effect": "Spießt das Ziel mit einem spitzen Horn auf." + }, + "furyAttack": { + "name": "Furienschlag", + "effect": "Spießt das Ziel zwei- bis fünfmal mit spitzem Horn oder Schnabel auf." + }, + "hornDrill": { + "name": "Hornbohrer", + "effect": "K.O.-Attacke, bei der ein Horn als Bohrer eingesetzt wird." + }, + "tackle": { + "name": "Tackle", + "effect": "Trifft das Ziel mit vollem Körpereinsatz." + }, + "bodySlam": { + "name": "Bodyslam", + "effect": "Trifft das Ziel mit vollem Körpereinsatz. Bewirkt eventuell Paralyse." + }, + "wrap": { + "name": "Wickel", + "effect": "Umwickelt das Ziel über vier bis fünf Runden mit Ranken oder Ähnlichem und fügt ihm Schaden zu." + }, + "takeDown": { + "name": "Bodycheck", + "effect": "Rücksichtslose Attacke, bei der sich der Angreifer selbst leicht verletzt." + }, + "thrash": { + "name": "Fuchtler", + "effect": "Attacke über zwei bis drei Runden, die den Angreifer verwirrt." + }, + "doubleEdge": { + "name": "Risikotackle", + "effect": "Lebensgefährlicher Angriff, bei dem sich der Angreifer selbst verletzt." + }, + "tailWhip": { + "name": "Rutenschlag", + "effect": "Hieb mit dem Schweif. Senkt die Verteidigung des Zieles." + }, + "poisonSting": { + "name": "Giftstachel", + "effect": "Angriff mit Giftstachel. Das Ziel wird eventuell vergiftet." + }, + "twineedle": { + "name": "Duonadel", + "effect": "Stacheln treffen das Ziel zweimal. Das Ziel wird eventuell vergiftet." + }, + "pinMissile": { + "name": "Nadelrakete", + "effect": "Spitze Nadeln treffen das Ziel zwei- bis fünfmal hintereinander." + }, + "leer": { + "name": "Silberblick", + "effect": "Gegnerischer Verteidigungs-Wert wird durch angsteinflößenden Blick gesenkt." + }, + "bite": { + "name": "Biss", + "effect": "Beißt zu und lässt das Ziel eventuell zurückschrecken." + }, + "growl": { + "name": "Heuler", + "effect": "Der Anwender nimmt das Ziel für sich ein und senkt dessen Angriffs-Wert." + }, + "roar": { + "name": "Brüller", + "effect": "Verjagt das Ziel und ersetzt es durch ein anderes Pokémon. Beendet den Kampf in der Wildnis." + }, + "sing": { + "name": "Gesang", + "effect": "Ein Lied, das das Ziel in tiefen Schlaf versetzt." + }, + "supersonic": { + "name": "Superschall", + "effect": "Ausstoß bizarrer Schallwellen. Das Ziel wird verwirrt." + }, + "sonicBoom": { + "name": "Ultraschall", + "effect": "Das Ziel wird von einer Schockwelle getroffen, die stets 20 KP Schaden anrichtet." + }, + "disable": { + "name": "Aussetzer", + "effect": "Die zuletzt eingesetzte Attacke des Zieles wird für mehrere Runden blockiert." + }, + "acid": { + "name": "Säure", + "effect": "Versprüht ätzende Flüssigkeit, die eventuell die Spezial-Verteidigung der Gegner in der Nähe des Anwenders senkt." + }, + "ember": { + "name": "Glut", + "effect": "Schwache Feuer-Attacke, durch die das Ziel eventuell Verbrennungen erleidet." + }, + "flamethrower": { + "name": "Flammenwurf", + "effect": "Starke Feuer-Attacke, durch die das Ziel eventuell Verbrennungen erleidet." + }, + "mist": { + "name": "Weißnebel", + "effect": "Anwender schützt das Team mit einem Nebel. Verhindert Statussenkungen für fünf Runden." + }, + "waterGun": { + "name": "Aquaknarre", + "effect": "Das Ziel wird mit Wasser bespritzt." + }, + "hydroPump": { + "name": "Hydropumpe", + "effect": "Spritzt eine Menge Wasser mit Hochdruck auf das Ziel." + }, + "surf": { + "name": "Surfer", + "effect": "Eine Welle bricht über alle Pokémon in der Nähe des Anwenders herein." + }, + "iceBeam": { + "name": "Eisstrahl", + "effect": "Das Ziel wird von einem Eisstrahl getroffen und friert eventuell ein." + }, + "blizzard": { + "name": "Blizzard", + "effect": "Ein Schneesturm wütet, der das Ziel einfrieren kann." + }, + "psybeam": { + "name": "Psystrahl", + "effect": "Feuert einen Strahl ab, der das Ziel verwirren kann." + }, + "bubbleBeam": { + "name": "Blubbstrahl", + "effect": "Versprüht Blasen, die eventuell den Initiative-Wert des Zieles senken." + }, + "auroraBeam": { + "name": "Aurorastrahl", + "effect": "Regenbogenfarbener Strahl, der eventuell den Angriffs-Wert des Zieles senkt." + }, + "hyperBeam": { + "name": "Hyperstrahl", + "effect": "Starke Attacke, die den Anwender zwingt, eine Runde auszusetzen." + }, + "peck": { + "name": "Pikser", + "effect": "Greift das Ziel mit dem Schnabel oder Horn an." + }, + "drillPeck": { + "name": "Bohrschnabel", + "effect": "Korkenzieherangriff, bei dem der Schnabel als Bohrer dient." + }, + "submission": { + "name": "Überroller", + "effect": "Harte Körperattacke, bei der sich der Angreifer selbst leicht verletzt." + }, + "lowKick": { + "name": "Fußkick", + "effect": "Ein Tritt, der das Ziel umwirft. Je schwerer das Ziel ist, desto mehr Schaden fügt ihm die Attacke zu." + }, + "counter": { + "name": "Konter", + "effect": "Kontert physische Treffer und fügt dem Ziel das Doppelte des Schadens zu, den der Anwender erlitten hat." + }, + "seismicToss": { + "name": "Geowurf", + "effect": "Ziel wird mit der Kraft der Gravitation umgeworfen. Richtet Schaden gemäß Level des Angreifers an." + }, + "strength": { + "name": "Stärke", + "effect": "Das Ziel wird extrem stark getroffen. Macht Verschieben von Felsen möglich." + }, + "absorb": { + "name": "Absorber", + "effect": "Attacke, die die Hälfte des Schadens absorbiert." + }, + "megaDrain": { + "name": "Megasauger", + "effect": "Attacke, die die Hälfte des Schadens absorbiert." + }, + "leechSeed": { + "name": "Egelsamen", + "effect": "Ziel wird bepflanzt und verliert jede Runde KP, die ein Pokémon aus dem Team des Anwenders heilen." + }, + "growth": { + "name": "Wachstum", + "effect": "Der Körper wächst. Dadurch steigen Angriff und Spezial-Angriff." + }, + "razorLeaf": { + "name": "Rasierblatt", + "effect": "Trifft das Ziel mit Blättern. Hohe Volltrefferquote." + }, + "solarBeam": { + "name": "Solarstrahl", + "effect": "Absorbiert Licht in Runde 1. In Runde 2 erfolgt der Angriff." + }, + "poisonPowder": { + "name": "Giftpuder", + "effect": "Verstreut giftigen Puder auf das Ziel." + }, + "stunSpore": { + "name": "Stachelspore", + "effect": "Verstreut lähmenden Puder." + }, + "sleepPowder": { + "name": "Schlafpuder", + "effect": "Verstreut Schlafpuder, der das Ziel eventuell in Schlaf versetzt." + }, + "petalDance": { + "name": "Blättertanz", + "effect": "Angriff mit Blütenblättern für zwei bis drei Runden. Angreifer wird verwirrt." + }, + "stringShot": { + "name": "Fadenschuss", + "effect": "Umwickelt Ziele in der Nähe mit Fäden aus dem Mund und senkt den Initiative-Wert." + }, + "dragonRage": { + "name": "Drachenwut", + "effect": "Stößt eine wutgeladene Schockwelle aus, die stets 40 KP Schaden anrichtet." + }, + "fireSpin": { + "name": "Feuerwirbel", + "effect": "Das Ziel wird für vier bis fünf Runden in einem Feuerkreis gefangen." + }, + "thunderShock": { + "name": "Donnerschock", + "effect": "Eine Elektro-Attacke, die das Ziel eventuell paralysiert." + }, + "thunderbolt": { + "name": "Donnerblitz", + "effect": "Eine starke Elektro-Attacke, die das Ziel eventuell paralysiert." + }, + "thunderWave": { + "name": "Donnerwelle", + "effect": "Ein schwacher Stromstoß, der das Ziel paralysiert." + }, + "thunder": { + "name": "Donner", + "effect": "Eine verheerende Elektro-Attacke, die das Ziel eventuell paralysiert." + }, + "rockThrow": { + "name": "Steinwurf", + "effect": "Das Ziel wird mit einem kleinen Stein beworfen." + }, + "earthquake": { + "name": "Erdbeben", + "effect": "Ein mächtiges Beben, das die anderen Pokémon in der Nähe des Anwenders trifft." + }, + "fissure": { + "name": "Geofissur", + "effect": "Das Ziel wird in eine Erdspalte geworfen. Ist die Attacke erfolgreich, führt sie zu einem K.O." + }, + "dig": { + "name": "Schaufler", + "effect": "In Runde 1 gräbt sich der Anwender ein und in Runde 2 greift er an. Macht Flucht aus Höhlen möglich." + }, + "toxic": { + "name": "Toxin", + "effect": "Vergiftet das Ziel mit einem potenten Toxin schwer. Vergiftung wird von Runde zu Runde stärker." + }, + "confusion": { + "name": "Konfusion", + "effect": "Das Ziel wird von schwacher telekinetischer Energie getroffen und eventuell verwirrt." + }, + "psychic": { + "name": "Psychokinese", + "effect": "Starke Psycho-Attacke, die eventuell die Spezial-Verteidigung des Zieles senkt." + }, + "hypnosis": { + "name": "Hypnose", + "effect": "Hypnose-Attacke, die das Ziel in Schlaf versetzt." + }, + "meditate": { + "name": "Meditation", + "effect": "Anwender aktiviert Kräfte, die tief in seinem Inneren schlummern, und steigert so seinen Angriffs-Wert." + }, + "agility": { + "name": "Agilität", + "effect": "Entspannt den Körper, um den Initiative-Wert stark zu steigern." + }, + "quickAttack": { + "name": "Ruckzuckhieb", + "effect": "Sehr schneller Angriff mit Erstschlaggarantie." + }, + "rage": { + "name": "Raserei", + "effect": "Erhöht Angriff des Anwenders, wenn dieser getroffen wird, solange die Attacke aktiviert ist." + }, + "teleport": { + "name": "Teleport", + "effect": "Der Anwender tauscht den Platz mit einem anderen Team-Mitglied, sofern vorhanden. Setzen wilde Pokémon die Attacke ein, ergreifen diese die Flucht." + }, + "nightShade": { + "name": "Nachtnebel", + "effect": "Das Ziel sieht eine Illusion. Richtet Schaden gemäß dem Level des Anwenders an." + }, + "mimic": { + "name": "Mimikry", + "effect": "Kopiert die zuvor ausgeführte Attacke des Zieles. Kann im Kampf bis zur Auswechslung verwendet werden." + }, + "screech": { + "name": "Kreideschrei", + "effect": "Stößt einen Schrei aus, um die Verteidigung des Zieles stark zu senken." + }, + "doubleTeam": { + "name": "Doppelteam", + "effect": "Erzeugt durch schnelle Bewegungen Ebenbilder, um den Fluchtwert zu erhöhen." + }, + "recover": { + "name": "Genesung", + "effect": "Eine Selbstheilung. KP des Anwenders werden um 50 % des maximalen Wertes aufgefüllt." + }, + "harden": { + "name": "Härtner", + "effect": "Stärkt die Muskulatur und erhöht den Verteidigungs-Wert." + }, + "minimize": { + "name": "Komprimator", + "effect": "Anwender schrumpft, um seinen Fluchtwert stark zu erhöhen." + }, + "smokescreen": { + "name": "Rauchwolke", + "effect": "Senkt Genauigkeit des Zieles mit Rauch, Tinte oder Ähnlichem." + }, + "confuseRay": { + "name": "Konfusstrahl", + "effect": "Ein fieser Strahl, der das Ziel verwirrt." + }, + "withdraw": { + "name": "Panzerschutz", + "effect": "Rückzug in den harten Panzer. Erhöht den Verteidigungs-Wert." + }, + "defenseCurl": { + "name": "Einigler", + "effect": "Verbirgt Schwächen durch Einrollen und hebt gleichzeitig den Verteidigungs-Wert." + }, + "barrier": { + "name": "Barriere", + "effect": "Erzeugt eine Barriere, die den Verteidigungs-Wert stark erhöht." + }, + "lightScreen": { + "name": "Lichtschild", + "effect": "Erzeugt eine Lichtwand und senkt den Schaden durch Spezial-Angriffe für fünf Runden." + }, + "haze": { + "name": "Dunkelnebel", + "effect": "Erzeugt einen dunklen Nebel. Alle Veränderungen der Statuswerte der Kampfteilnehmer werden annulliert." + }, + "reflect": { + "name": "Reflektor", + "effect": "Eine mysteriöse Wand, die fünf Runden den Schaden von physischen gegnerischen Treffern reduziert." + }, + "focusEnergy": { + "name": "Energiefokus", + "effect": "Anwender atmet ein und bündelt Kraft. Die Volltrefferquote steigt dadurch." + }, + "bide": { + "name": "Geduld", + "effect": "Erträgt zwei Runden Angriffe und schlägt dann mit dem doppelten Wert des erlittenen Schadens zurück." + }, + "metronome": { + "name": "Metronom", + "effect": "Bewegt Finger, um das Gehirn zu stimulieren. Wählt zufällig eine Attacke aus." + }, + "mirrorMove": { + "name": "Spiegeltrick", + "effect": "Kopiert die letzte Attacke des Zieles und greift es an." + }, + "selfDestruct": { + "name": "Finale", + "effect": "Anwender sprengt sich, richtet rundum Riesenschaden an und wird dabei besiegt." + }, + "eggBomb": { + "name": "Eierbombe", + "effect": "Ein großes Ei wird auf das Ziel abgefeuert, um ihm zu schaden." + }, + "lick": { + "name": "Schlecker", + "effect": "Leck-Attacke mit langer Zunge. Das Ziel wird eventuell paralysiert." + }, + "smog": { + "name": "Smog", + "effect": "Angriff mit Gas. Das Ziel kann eventuell vergiftet werden." + }, + "sludge": { + "name": "Schlammbad", + "effect": "Wirft Schlamm auf das Ziel. Dieses wird eventuell vergiftet." + }, + "boneClub": { + "name": "Knochenkeule", + "effect": "Schlägt das Ziel mit einer Keule und lässt es eventuell zurückschrecken." + }, + "fireBlast": { + "name": "Feuersturm", + "effect": "Feuersbrunst, die das Ziel versengt und ihm eventuell eine Verbrennung zufügt." + }, + "waterfall": { + "name": "Kaskade", + "effect": "Eine mächtige Attacke, durch die das Ziel eventuell zurückschreckt." + }, + "clamp": { + "name": "Schnapper", + "effect": "Fängt und quetscht das Ziel über vier bis fünf Runden durch die harte Schale des Anwenders." + }, + "swift": { + "name": "Sternschauer", + "effect": "Verschießt sternförmige Strahlen, die stets treffen, auf Ziele in der Umgebung." + }, + "skullBash": { + "name": "Schädelwumme", + "effect": "Der Anwender erhöht in Runde 1 seine Verteidigung und greift in Runde 2 an." + }, + "spikeCannon": { + "name": "Dornkanone", + "effect": "Spitze Nadeln treffen das Ziel zwei- bis fünfmal hintereinander." + }, + "constrict": { + "name": "Umklammerung", + "effect": "Angriff mit langen Tentakeln oder Ranken. Senkt eventuell den Initiative-Wert." + }, + "amnesia": { + "name": "Amnesie", + "effect": "Gedächtnisverlust, der die Spezial-Verteidigung stark erhöht." + }, + "kinesis": { + "name": "Psykraft", + "effect": "Lenkt Ziel durch Verbiegen eines Löffels ab. Senkt dessen Genauigkeit." + }, + "softBoiled": { + "name": "Weichei", + "effect": "KP des Anwenders werden um 50 % der maximalen KP aufgefüllt." + }, + "highJumpKick": { + "name": "Turmkick", + "effect": "Sprungtritt mit Knie. Bei Misserfolg verletzt sich der Anwender selbst." + }, + "glare": { + "name": "Schlangenblick", + "effect": "Schüchtert Ziel mit dem Muster auf seinem Bauch ein, sodass dieses paralysiert wird." + }, + "dreamEater": { + "name": "Traumfresser", + "effect": "Attacke gegen schlafendes Ziel. Die Hälfte des zugefügten Schadens wird dem Anwender gutgeschrieben." + }, + "poisonGas": { + "name": "Giftwolke", + "effect": "Hüllt Ziele in der Umgebung in Gas ein, das sie eventuell vergiftet." + }, + "barrage": { + "name": "Stakkato", + "effect": "Wirft zwei- bis fünfmal runde Gegenstände auf das Ziel." + }, + "leechLife": { + "name": "Blutsauger", + "effect": "Die Hälfte des zugefügten Schadens wird dem Anwender gutgeschrieben." + }, + "lovelyKiss": { + "name": "Todeskuss", + "effect": "Anwender zwingt dem Ziel einen Kuss auf, der Schlaf verursacht." + }, + "skyAttack": { + "name": "Himmelsfeger", + "effect": "Anwender greift in der zweiten Runde mit hoher Volltrefferquote an. Ziel schreckt eventuell zurück." + }, + "transform": { + "name": "Wandler", + "effect": "Anwender verwandelt sich in ein Abbild des Zieles und kann so auf die gleichen Attacken zugreifen." + }, + "bubble": { + "name": "Blubber", + "effect": "Angriff mit Blasen. Initiative-Wert des Zieles wird eventuell gesenkt." + }, + "dizzyPunch": { + "name": "Irrschlag", + "effect": "Rhythmische Schläge, die das Ziel verwirren können." + }, + "spore": { + "name": "Pilzspore", + "effect": "Erzeugt eine Wolke aus einschläfernden Sporen." + }, + "flash": { + "name": "Blitz", + "effect": "Erzeugt helles Licht, das die Genauigkeit des Zieles senkt." + }, + "psywave": { + "name": "Psywelle", + "effect": "Anwender erzeugt eine mysteriöse Energiewelle, deren Intensität von Mal zu Mal anders ausfällt." + }, + "splash": { + "name": "Platscher", + "effect": "Nur ein Platscher, der überhaupt nichts bewirkt." + }, + "acidArmor": { + "name": "Säurepanzer", + "effect": "Verflüssigt Körperzellen des Anwenders. Erhöht den Verteidigungs-Wert stark." + }, + "crabhammer": { + "name": "Krabbhammer", + "effect": "Schlägt mit Schere zu. Hohe Volltrefferquote." + }, + "explosion": { + "name": "Explosion", + "effect": "Anwender explodiert, richtet bei allen Pokémon in seiner Umgebung großen Schaden an und wird selbst kampfunfähig." + }, + "furySwipes": { + "name": "Kratzfurie", + "effect": "Beharkt das Ziel zwei- bis fünfmal mit scharfen Klauen oder Sicheln." + }, + "bonemerang": { + "name": "Knochmerang", + "effect": "Ein Bumerang aus Knochen, der zweimal trifft." + }, + "rest": { + "name": "Erholung", + "effect": "Anwender wird vollkommen geheilt und schläft die folgenden zwei Runden." + }, + "rockSlide": { + "name": "Steinhagel", + "effect": "Schleudert riesige Felsen auf Ziele in der Umgebung, die eventuell zurückschrecken." + }, + "hyperFang": { + "name": "Hyperzahn", + "effect": "Angriff mit scharfen Reißzähnen. Ziel schreckt eventuell zurück." + }, + "sharpen": { + "name": "Schärfer", + "effect": "Anwender senkt die Polygonzahl, um Kanten zu erzeugen, die den Angriffs-Wert erhöhen." + }, + "conversion": { + "name": "Umwandlung", + "effect": "Wandelt den Typ des Anwenders in den Typ der ersten Attacke des Anwenders um." + }, + "triAttack": { + "name": "Triplette", + "effect": "Feuert drei Strahlen ab. Verursacht eventuell Paralyse, Verbrennung oder Einfrieren." + }, + "superFang": { + "name": "Superzahn", + "effect": "Greift mit scharfen Reißzähnen an. KP des Zieles werden halbiert." + }, + "slash": { + "name": "Schlitzer", + "effect": "Hieb mit Klauen oder Ähnlichem. Hohe Volltrefferquote." + }, + "substitute": { + "name": "Delegator", + "effect": "Anwender setzt eine kleine Menge an KP ein, um einen Doppelgänger zu erzeugen, der für ihn Schläge einsteckt." + }, + "struggle": { + "name": "Verzweifler", + "effect": "Angriff nur bei verbrauchten AP. Anwender verletzt sich selbst leicht." + }, + "sketch": { + "name": "Nachahmer", + "effect": "Anwender lernt die letzte Attacke des Zieles dauerhaft. Nachahmer verschwindet nach Gebrauch." + }, + "tripleKick": { + "name": "Dreifachkick", + "effect": "Tritt das Ziel ein- bis dreimal nacheinander. Die Härte der Tritte nimmt von Treffer zu Treffer zu." + }, + "thief": { + "name": "Raub", + "effect": "Erlaubt es, das Item des Zieles zu stehlen, solang der Anwender selbst keins bei sich trägt." + }, + "spiderWeb": { + "name": "Spinnennetz", + "effect": "Wickelt das Ziel ein. Flucht oder Tausch unmöglich." + }, + "mindReader": { + "name": "Willensleser", + "effect": "Ahnt Bewegungen des Zieles voraus, um zu gewährleisten, dass die nächste eigene Attacke trifft." + }, + "nightmare": { + "name": "Nachtmahr", + "effect": "Dem schlafenden Ziel wird durch einen Alptraum in jeder Runde Schaden zugefügt, solang es schläft." + }, + "flameWheel": { + "name": "Flammenrad", + "effect": "Feuer-Attacke, die das Ziel eventuell verbrennt." + }, + "snore": { + "name": "Schnarcher", + "effect": "Attacke nur im Schlaf möglich. Ziel schreckt eventuell zurück." + }, + "curse": { + "name": "Fluch", + "effect": "Attacke, deren Wirkung davon abhängt, ob der Anwender ein Geist-Pokémon ist." + }, + "flail": { + "name": "Dreschflegel", + "effect": "Attacke richtet mehr Schaden an, wenn eigene KP niedrig sind." + }, + "conversion2": { + "name": "Umwandlung2", + "effect": "Anwender ändert Typ und wird gegen letzten Angriffstyp resistent." + }, + "aeroblast": { + "name": "Luftstoß", + "effect": "Erzeugt Luftstrudel gegen das Ziel. Hohe Volltrefferquote." + }, + "cottonSpore": { + "name": "Baumwollsaat", + "effect": "Wattebäusche heften sich an das Ziel. Der Initiative-Wert sinkt stark." + }, + "reversal": { + "name": "Gegenschlag", + "effect": "Richtet mehr Schaden an, wenn eigene KP niedrig sind." + }, + "spite": { + "name": "Groll", + "effect": "AP der letzten Attacke des Zieles werden um 4 gesenkt." + }, + "powderSnow": { + "name": "Pulverschnee", + "effect": "Angriff mit Schnee. Das Ziel wird eventuell eingefroren." + }, + "protect": { + "name": "Schutzschild", + "effect": "Anwender weicht jeder Attacke aus. Scheitert eventuell bei Wiederholung." + }, + "machPunch": { + "name": "Tempohieb", + "effect": "Extrem schneller Hieb, der stets zuerst trifft." + }, + "scaryFace": { + "name": "Grimasse", + "effect": "Jagt dem Ziel mit einer Grimasse Angst ein. Dessen Initiative-Wert sinkt stark." + }, + "feintAttack": { + "name": "Finte", + "effect": "Anwender nähert sich mit Unschuldsmiene dem Ziel und schlägt zu, sobald dieses unachtsam wird. Ein Treffer ist gewiss." + }, + "sweetKiss": { + "name": "Bitterkuss", + "effect": "Anwender küsst das Ziel, das durch diese Niedlichkeit verwirrt wird." + }, + "bellyDrum": { + "name": "Bauchtrommel", + "effect": "Der Anwender maximiert den Angriffs-Wert auf Kosten der Hälfte seiner maximalen KP." + }, + "sludgeBomb": { + "name": "Matschbombe", + "effect": "Wirft Schlamm auf das Ziel. Dieses wird eventuell vergiftet." + }, + "mudSlap": { + "name": "Lehmschelle", + "effect": "Schadet dem Ziel durch Matsch. Dessen Genauigkeit sinkt." + }, + "octazooka": { + "name": "Octazooka", + "effect": "Schießt mit Tinte, um Schaden anzurichten und die Genauigkeit zu senken." + }, + "spikes": { + "name": "Stachler", + "effect": "Der Anwender verteilt Stacheln, die gegnerische Pokémon verletzen, die in den Kampf gerufen werden." + }, + "zapCannon": { + "name": "Blitzkanone", + "effect": "Kanonenähnlicher Elektro-Schuss, der schadet und paralysiert." + }, + "foresight": { + "name": "Scharfblick", + "effect": "Erlaubt es, Geist-Pokémon mit Normal- und Kampf-Attacken anzugreifen. Ignoriert den Fluchtwert des Zieles." + }, + "destinyBond": { + "name": "Abgangsbund", + "effect": "Wird der Anwender nach Einsatz dieser Attacke besiegt, führt dies auch beim Ziel zum K.O." + }, + "perishSong": { + "name": "Abgesang", + "effect": "Wer diese Musik hört, wird nach drei Runden besiegt. Rettung ist durch den Eintausch eines neuen Pokémon möglich." + }, + "icyWind": { + "name": "Eissturm", + "effect": "Eis-Attacke, die dem Ziel Schaden zufügt und seinen Initiative-Wert senkt." + }, + "detect": { + "name": "Scanner", + "effect": "Anwender weicht jeder Attacke aus. Scheitert eventuell bei Wiederholung." + }, + "boneRush": { + "name": "Knochenhatz", + "effect": "Greift Ziel zwei- bis fünfmal in Folge mit einem harten Knochen an." + }, + "lockOn": { + "name": "Zielschuss", + "effect": "Visiert das Ziel an und trifft in der nächsten Runde garantiert." + }, + "outrage": { + "name": "Wutanfall", + "effect": "Attacke über zwei bis drei Runden, die den Anwender verwirrt." + }, + "sandstorm": { + "name": "Sandsturm", + "effect": "Sandsturm für fünf Runden. Fügt Pokémon von jedem Typ außer Gestein, Boden und Stahl Schaden zu." + }, + "gigaDrain": { + "name": "Gigasauger", + "effect": "Das Ziel wird angegriffen und die Hälfte des zugefügten Schadens dem Angreifer als KP gutgeschrieben." + }, + "endure": { + "name": "Ausdauer", + "effect": "Nach fatalen Attacken bleibt stets 1 KP übrig. Misserfolg bei Wiederholung möglich." + }, + "charm": { + "name": "Charme", + "effect": "Betört das Ziel und reduziert dessen Angriffs-Wert stark." + }, + "rollout": { + "name": "Walzer", + "effect": "Attacke, die fünf Runden dauert. Die Härte nimmt von Mal zu Mal zu." + }, + "falseSwipe": { + "name": "Trugschlag", + "effect": "Ein Angriff, der dem Ziel zumindest 1 KP lässt." + }, + "swagger": { + "name": "Angeberei", + "effect": "Verwirrt das Ziel und erhöht dessen Angriffs-Wert stark." + }, + "milkDrink": { + "name": "Milchgetränk", + "effect": "KP des Anwenders werden um 50 % der maximalen KP aufgefüllt." + }, + "spark": { + "name": "Funkensprung", + "effect": "Elektro-Hieb, der das Ziel paralysieren kann." + }, + "furyCutter": { + "name": "Zornklinge", + "effect": "Eine Attacke mit Scheren oder Klauen, deren Härte bei aufeinanderfolgenden Treffern zunimmt." + }, + "steelWing": { + "name": "Stahlflügel", + "effect": "Trifft das Ziel mit Stahlflügeln. Verteidigungs-Wert des Anwenders steigt eventuell." + }, + "meanLook": { + "name": "Horrorblick", + "effect": "Böser Blick, der die Flucht des Zieles vereitelt." + }, + "attract": { + "name": "Anziehung", + "effect": "Angriff auf Anwender vom anderen Geschlecht wird unwahrscheinlich." + }, + "sleepTalk": { + "name": "Schlafrede", + "effect": "Anwender setzt per Zufall eine ihm bekannte Attacke im Schlaf ein." + }, + "healBell": { + "name": "Vitalglocke", + "effect": "Läutet beruhigend und heilt alle Statusprobleme im Team." + }, + "return": { + "name": "Rückkehr", + "effect": "Angriff, dessen Kraft bei Freundschaft zum Trainer größer wird." + }, + "present": { + "name": "Geschenk", + "effect": "Eine Bombe als Geschenk. Kann auch KP des Zieles wiederherstellen." + }, + "frustration": { + "name": "Frustration", + "effect": "Die Attacke wird stärker, je weniger der Anwender seinen Trainer mag." + }, + "safeguard": { + "name": "Bodyguard", + "effect": "Team des Anwenders ist fünf Runden vor Statusproblemen geschützt." + }, + "painSplit": { + "name": "Leidteiler", + "effect": "Addiert KP von Anwender und Ziel. Teilt sie gerecht auf." + }, + "sacredFire": { + "name": "Läuterfeuer", + "effect": "Mystische Feuer-Attacke, durch die das Ziel eventuell Verbrennungen erleidet." + }, + "magnitude": { + "name": "Intensität", + "effect": "Erdbebenartiger Angriff von zufälliger Stärke gegen andere Pokémon in der Umgebung des Anwenders." + }, + "dynamicPunch": { + "name": "Wuchtschlag", + "effect": "Kräftiger Schlag, der das Ziel bei Erfolg verwirrt." + }, + "megahorn": { + "name": "Vielender", + "effect": "Brutaler Ramm-Angriff mit spitzem, beeindruckendem Horn." + }, + "dragonBreath": { + "name": "Feuerodem", + "effect": "Fegt das Ziel mit zerstörerisch heißem Atem weg. Paralysiert das Ziel eventuell." + }, + "batonPass": { + "name": "Stafette", + "effect": "Tauscht das eigene Pokémon aus. Alle Statusveränderungen bleiben bestehen." + }, + "encore": { + "name": "Zugabe", + "effect": "Das Ziel wiederholt die letzte Attacke drei Runden lang." + }, + "pursuit": { + "name": "Verfolgung", + "effect": "Die Attacke richtet beim Ziel doppelten Schaden an, falls es ausgetauscht wird." + }, + "rapidSpin": { + "name": "Turbodreher", + "effect": "Trifft das Ziel mit einer Dreh-Attacke. Befreit sich unter anderem von Wickel, Klammergriff, Egelsamen und Stachler." + }, + "sweetScent": { + "name": "Lockduft", + "effect": "Lockt Ziele an und senkt deren Fluchtwert. Lockt im Gras auch wilde Pokémon an." + }, + "ironTail": { + "name": "Eisenschweif", + "effect": "Attacke mit hartem Eisenschweif. Senkt eventuell den Verteidigungs-Wert des Zieles." + }, + "metalClaw": { + "name": "Metallklaue", + "effect": "Klauen-Attacke, die eventuell den Angriffs-Wert des Anwenders erhöht." + }, + "vitalThrow": { + "name": "Überwurf", + "effect": "Anwender greift als Letzter an, hat dafür aber eine Treffergarantie beim eigenen Angriff." + }, + "morningSun": { + "name": "Morgengrauen", + "effect": "Füllt KP des Anwenders auf. Die Menge hängt vom Wetter ab." + }, + "synthesis": { + "name": "Synthese", + "effect": "Füllt KP des Anwenders auf. Die Menge hängt vom Wetter ab." + }, + "moonlight": { + "name": "Mondschein", + "effect": "Füllt KP des Anwenders auf. Die Menge hängt vom Wetter ab." + }, + "hiddenPower": { + "name": "Kraftreserve", + "effect": "Wirkung und Typ der Attacke hängen vom Anwender ab." + }, + "crossChop": { + "name": "Kreuzhieb", + "effect": "Doppelter Hieb mit den Unterarmen. Hohe Volltrefferquote." + }, + "twister": { + "name": "Windhose", + "effect": "Trifft Ziele in der Umgebung mit einem heftigen Wirbelsturm, was diese eventuell zurückschrecken lässt." + }, + "rainDance": { + "name": "Regentanz", + "effect": "Anwender erzeugt starken Regen. Die Stärke von Wasser-Attacken erhöht sich fünf Runden lang." + }, + "sunnyDay": { + "name": "Sonnentag", + "effect": "Die Sonne brennt unbarmherzig fünf Runden lang. Dadurch werden Attacken vom Typ Feuer verstärkt." + }, + "crunch": { + "name": "Knirscher", + "effect": "Beißt mit scharfen Reißzähnen zu und senkt eventuell die Verteidigung." + }, + "mirrorCoat": { + "name": "Spiegelcape", + "effect": "Kontert den Spezial-Angriff des Gegners mit doppeltem Schaden." + }, + "psychUp": { + "name": "Psycho-Plus", + "effect": "Der Anwender hypnotisiert sich selbst, um die Statusveränderungen des Zieles zu kopieren." + }, + "extremeSpeed": { + "name": "Turbotempo", + "effect": "Extrem schnelle und kraftvolle Attacke, die stets zuerst trifft." + }, + "ancientPower": { + "name": "Antik-Kraft", + "effect": "Angriff mit antiker Kraft, der alle Statuswerte erhöhen kann." + }, + "shadowBall": { + "name": "Spukball", + "effect": "Bewirft das Ziel mit gruseligem Ball und senkt eventuell die Spezial-Verteidigung." + }, + "futureSight": { + "name": "Seher", + "effect": "Zwei Runden, nachdem Seher eingesetzt wurde, erfolgt der Angriff." + }, + "rockSmash": { + "name": "Zertrümmerer", + "effect": "Diese steinbrechende Attacke kann den Verteidigungs-Wert des Zieles senken und außerhalb von Kämpfen rissige Felsen zertrümmern." + }, + "whirlpool": { + "name": "Whirlpool", + "effect": "Das Ziel wird für vier bis fünf Runden in einer Wasserhose gefangen." + }, + "beatUp": { + "name": "Prügler", + "effect": "Das gesamte Team nimmt aktiv am Kampf teil. Je mehr Pokémon, desto höher die Anzahl der Angriffe." + }, + "fakeOut": { + "name": "Mogelhieb", + "effect": "Diese Attacke trifft zuerst. Das Ziel schreckt zurück. Gelingt nur in der ersten Runde eines Kampfes." + }, + "uproar": { + "name": "Aufruhr", + "effect": "Anwender greift an, indem er über drei Runden hinweg einen Aufruhr erzeugt. Verhindert Schlaf." + }, + "stockpile": { + "name": "Horter", + "effect": "Lädt Kraft für später auf. Erhöht Verteidigung und Spezial-Verteidigung. Kann bis zu dreimal eingesetzt werden." + }, + "spitUp": { + "name": "Entfessler", + "effect": "Entlädt die Kraft, die während des Einsatzes von Horter gesammelt wurde." + }, + "swallow": { + "name": "Verzehrer", + "effect": "Absorbiert die gehortete Kraft, um KP aufzufüllen." + }, + "heatWave": { + "name": "Hitzewelle", + "effect": "Ziele werden von Sturm aus heißer Luft getroffen und verbrennen sich eventuell." + }, + "hail": { + "name": "Hagelsturm", + "effect": "Hagelsturm für fünf Runden. Schadet allen, außer Eis-Pokémon." + }, + "torment": { + "name": "Folterknecht", + "effect": "Erzürnt das Ziel, um wiederholten Einsatz derselben Attacke zu verhindern." + }, + "flatter": { + "name": "Schmeichler", + "effect": "Schmeichelt dem Ziel, um es zu verwirren. Erhöht dessen Spezial-Angriff." + }, + "willOWisp": { + "name": "Irrlicht", + "effect": "Angriff mit unheimlicher Flamme, die das Ziel verbrennt." + }, + "memento": { + "name": "Memento-Mori", + "effect": "Der Anwender wird besiegt und senkt den Angriffs-Wert und den Spezial-Angriff des Zieles stark." + }, + "facade": { + "name": "Fassade", + "effect": "Doppelte Stärke nach Verbrennung, Paralyse oder Vergiftung." + }, + "focusPunch": { + "name": "Power-Punch", + "effect": "Anwender konzentriert sich, bevor er angreift. Wird er vorher getroffen, ist die Attacke erfolglos." + }, + "smellingSalts": { + "name": "Riechsalz", + "effect": "Doppelt wirksam gegen paralysierte Ziele, heilt sie aber auch von der Paralyse." + }, + "followMe": { + "name": "Spotlight", + "effect": "Zieht Aufmerksamkeit auf sich. Gegner greift nur Anwender an." + }, + "naturePower": { + "name": "Natur-Kraft", + "effect": "Angriff mit der Kraft der Natur, dessen Typ vom Ort abhängt, wo er durchgeführt wird." + }, + "charge": { + "name": "Ladevorgang", + "effect": "Lädt Energie für die kommende Elektro-Attacke auf. Erhöht die Spezial-Verteidigung." + }, + "taunt": { + "name": "Verhöhner", + "effect": "Bringt das Ziel in Rage. Dieses kann über drei Runden hinweg nur noch angreifen." + }, + "helpingHand": { + "name": "Rechte Hand", + "effect": "Anwender steigert die Kraft eines Angriffes eines Freundes." + }, + "trick": { + "name": "Trickbetrug", + "effect": "Der Anwender überrumpelt das Ziel und tauscht mit ihm die getragenen Items." + }, + "rolePlay": { + "name": "Rollenspiel", + "effect": "Parodiert das Ziel und kopiert seine Fähigkeit." + }, + "wish": { + "name": "Wunschtraum", + "effect": "Ein Wunsch füllt in der nächsten Runde 50 % der KP des Anwenders bei diesem oder einem eingewechselten Pokémon auf." + }, + "assist": { + "name": "Zuschuss", + "effect": "Greift zufällig mit einer Attacke eines Mitstreiters an." + }, + "ingrain": { + "name": "Verwurzler", + "effect": "Verwurzelung füllt jede Runde KP auf. Austausch ist unmöglich." + }, + "superpower": { + "name": "Kraftkoloss", + "effect": "Starke Attacke, die jedoch auch den Angriff und die Verteidigung des Anwenders senkt." + }, + "magicCoat": { + "name": "Magiemantel", + "effect": "Egelsamen und alle Attacken mit Status verändernden Effekten prallen ab." + }, + "recycle": { + "name": "Aufbereitung", + "effect": "Recycling eines getragenen Items, das zuvor im Kampf verwendet wurde." + }, + "revenge": { + "name": "Vergeltung", + "effect": "Schaden verdoppelt sich, wenn der Anwender in der Runde bereits Schaden vom Ziel des Angriffes genommen hat." + }, + "brickBreak": { + "name": "Durchbruch", + "effect": "Ein beherzter Handkantenschlag. Durchbricht Barrieren wie Lichtschild und Reflektor." + }, + "yawn": { + "name": "Gähner", + "effect": "Angreifer gähnt und das Ziel schläft in der nächsten Runde ein." + }, + "knockOff": { + "name": "Abschlag", + "effect": "Schlägt das Item des Zieles weg und vereitelt so dessen Gebrauch während des Kampfes. Mehr Schaden gegen Ziele, die ein Item bei sich tragen." + }, + "endeavor": { + "name": "Notsituation", + "effect": "Trifft nur, wenn KP des Anwenders geringer als KP des Zieles sind. Senkt dessen KP auf die Höhe der KP des Anwenders." + }, + "eruption": { + "name": "Eruption", + "effect": "Explosiver Angriff. Je höher die KP des Anwenders sind, desto mehr Schaden wird angerichtet." + }, + "skillSwap": { + "name": "Fähigkeitstausch", + "effect": "Anwender tauscht Fähigkeit mit dem Ziel." + }, + "imprison": { + "name": "Begrenzer", + "effect": "Hindert Gegner am Einsatz von Attacken, die der Anwender selbst auch kennt." + }, + "refresh": { + "name": "Heilung", + "effect": "Selbstheilung bei Vergiftung, Paralyse und Verbrennung." + }, + "grudge": { + "name": "Nachspiel", + "effect": "Bei K.O. des Anwenders werden die AP der Attacke, durch die er besiegt wurde, auf 0 herabgesetzt." + }, + "snatch": { + "name": "Übernahme", + "effect": "Raubt den Effekt eingesetzter heilender oder Werte verändernder Attacken." + }, + "secretPower": { + "name": "Geheimpower", + "effect": "Angriff, der abhängig vom Anwendungsort einen unterschiedlichen Zusatz-Effekt hat." + }, + "dive": { + "name": "Taucher", + "effect": "Taucht in Runde 1 ab und greift in Runde 2 aus der Tiefe an." + }, + "armThrust": { + "name": "Armstoß", + "effect": "Schläge mit geradem Arm, die das Ziel zwei- bis fünfmal treffen." + }, + "camouflage": { + "name": "Tarnung", + "effect": "Der Typ des Anwenders passt sich der Umgebung an, sei es im Wasser, im Gras oder in einer Höhle." + }, + "tailGlow": { + "name": "Schweifglanz", + "effect": "Ein blinkendes Licht, das den Spezial-Angriff drastisch erhöht." + }, + "lusterPurge": { + "name": "Scheinwerfer", + "effect": "Angriff mit grellem Licht, der die Spezial-Verteidigung des Zieles eventuell senkt." + }, + "mistBall": { + "name": "Nebelball", + "effect": "Angriff mit einer Kugel aus Wasser, die Nebel enthält. Senkt eventuell den Spezial-Angriff des Zieles." + }, + "featherDance": { + "name": "Daunenreigen", + "effect": "Hüllt das Ziel in Daunen und senkt dessen Angriffs-Wert stark." + }, + "teeterDance": { + "name": "Taumeltanz", + "effect": "Ein Wackeltanz, der andere Pokémon in der Umgebung des Anwenders verwirrt." + }, + "blazeKick": { + "name": "Feuerfeger", + "effect": "Starker Tritt mit hoher Volltrefferquote. Verursacht eventuell Verbrennung." + }, + "mudSport": { + "name": "Lehmsuhler", + "effect": "Schwächt Elektro-Attacken, solang der Anwender am Kampf teilnimmt." + }, + "iceBall": { + "name": "Frostbeule", + "effect": "Attacke, die fünf Runden dauert. Die Härte nimmt von Mal zu Mal zu." + }, + "needleArm": { + "name": "Nietenranke", + "effect": "Angriff mit dornigen Armen. Das Ziel schreckt eventuell zurück." + }, + "slackOff": { + "name": "Tagedieb", + "effect": "Durch Müßiggang werden KP des Anwenders um 50 % der maximalen KP aufgefüllt." + }, + "hyperVoice": { + "name": "Schallwelle", + "effect": "Laute Attacke mit Schallwellen." + }, + "poisonFang": { + "name": "Giftzahn", + "effect": "Angriff mit giftigen Reißzähnen. Das Ziel wird eventuell schwer vergiftet." + }, + "crushClaw": { + "name": "Zermalmklaue", + "effect": "Angriff mit scharfen Klauen. Senkt eventuell den Verteidigungs-Wert." + }, + "blastBurn": { + "name": "Lohekanonade", + "effect": "Das Ziel wird von starker Explosion getroffen. Angreifer setzt eine Runde aus." + }, + "hydroCannon": { + "name": "Aquahaubitze", + "effect": "Das Ziel wird von Wasserkanone getroffen. Angreifer setzt eine Runde aus." + }, + "meteorMash": { + "name": "Sternenhieb", + "effect": "Angriff mit einem harten, schnellen Schlag. Erhöht eventuell Angriffs-Wert des Anwenders." + }, + "astonish": { + "name": "Erstauner", + "effect": "Anwender greift mit einem Schrei an. Ein Angriff, der das Ziel eventuell zurückschrecken lässt." + }, + "weatherBall": { + "name": "Meteorologe", + "effect": "Typ und Stärke der Attacke sind vom Wetter zum Zeitpunkt der Anwendung abhängig." + }, + "aromatherapy": { + "name": "Aromakur", + "effect": "Heilt alle Statusprobleme des Teams mit beruhigendem Duft." + }, + "fakeTears": { + "name": "Trugträne", + "effect": "Täuscht Weinen vor, um die Spezial-Verteidigung des Zieles stark zu senken." + }, + "airCutter": { + "name": "Windschnitt", + "effect": "Greift mit rasierklingenartigem Wind an. Hohe Volltrefferquote." + }, + "overheat": { + "name": "Hitzekoller", + "effect": "Angriff mit voller Kraft, der den Spezial-Angriff des Anwenders durch den Rückstoß stark senkt." + }, + "odorSleuth": { + "name": "Schnüffler", + "effect": "Erlaubt es, Geist-Pokémon mit Normal- und Kampf-Attacken anzugreifen. Ignoriert den Fluchtwert des Zieles." + }, + "rockTomb": { + "name": "Felsgrab", + "effect": "Angriff mit Felsen. Bei Erfolg wird der Initiative-Wert des Zieles gesenkt." + }, + "silverWind": { + "name": "Silberhauch", + "effect": "Angriff mit Silberstaub. Eventuell werden alle Statuswerte des Anwenders erhöht." + }, + "metalSound": { + "name": "Metallsound", + "effect": "Stößt einen spitzen Schrei aus, der die Spezial-Verteidigung des Zieles stark senkt." + }, + "grassWhistle": { + "name": "Grasflöte", + "effect": "Versetzt das Ziel durch eine schöne Melodie in Tiefschlaf." + }, + "tickle": { + "name": "Spaßkanone", + "effect": "Bringt das Ziel zum Lachen und senkt dadurch dessen Angriff und Verteidigung." + }, + "cosmicPower": { + "name": "Kosmik-Kraft", + "effect": "Erhöht Verteidigung und Spezial-Verteidigung durch eine mystische Kraft." + }, + "waterSpout": { + "name": "Fontränen", + "effect": "Wasser-Attacke, die wirkungsvoller ist, wenn KP des Anwenders hoch sind." + }, + "signalBeam": { + "name": "Ampelleuchte", + "effect": "Strahlenattacke, die das Ziel eventuell verwirrt." + }, + "shadowPunch": { + "name": "Finsterfaust", + "effect": "Angriff mit der Faust aus dem Schattenreich. Ausweichen unmöglich." + }, + "extrasensory": { + "name": "Sondersensor", + "effect": "Besonderer Angriff mit einer unsichtbaren Kraft, die das Ziel eventuell zurückschrecken lässt." + }, + "skyUppercut": { + "name": "Himmelhieb", + "effect": "Kinnhaken, der das Ziel gen Himmel schickt." + }, + "sandTomb": { + "name": "Sandgrab", + "effect": "Das Ziel leidet für vier bis fünf Runden in einer Sandhose." + }, + "sheerCold": { + "name": "Eiseskälte", + "effect": "Angriff mit Kälte, die das Ziel bei Erfolg besiegt." + }, + "muddyWater": { + "name": "Lehmbrühe", + "effect": "Greift mit Matsch an und senkt eventuell die Genauigkeit des Zieles." + }, + "bulletSeed": { + "name": "Kugelsaat", + "effect": "Der Anwender wirft zwei- bis fünfmal in rascher Folge Samen auf das Ziel." + }, + "aerialAce": { + "name": "Aero-Ass", + "effect": "Eine extrem schnelle Attacke, der das Ziel nicht ausweichen kann." + }, + "icicleSpear": { + "name": "Eisspeer", + "effect": "Feuert zwei bis fünf Eiszapfen auf das Ziel." + }, + "ironDefense": { + "name": "Eisenabwehr", + "effect": "Anwender stärkt den Körper, um den Verteidigungs-Wert stark zu erhöhen." + }, + "block": { + "name": "Rückentzug", + "effect": "Anwender versperrt den Fluchtweg des Zieles." + }, + "howl": { + "name": "Jauler", + "effect": "Anwender jault, um seinen Kampfgeist und seinen Angriffs-Wert zu erhöhen." + }, + "dragonClaw": { + "name": "Drachenklaue", + "effect": "Das Ziel wird mit riesigen, scharfen Klauen stark verletzt." + }, + "frenzyPlant": { + "name": "Flora-Statue", + "effect": "Angriff mit dickem Ast. Der Angreifer muss eine Runde aussetzen." + }, + "bulkUp": { + "name": "Protzer", + "effect": "Pumpt den Körper auf, um den Angriff und die Verteidigung zu erhöhen." + }, + "bounce": { + "name": "Sprungfeder", + "effect": "Angreifer springt und landet in der nächsten Runde auf dem Ziel. Das Ziel wird eventuell paralysiert." + }, + "mudShot": { + "name": "Lehmschuss", + "effect": "Angriff mit Lehm, der den Initiative-Wert des Zieles senkt." + }, + "poisonTail": { + "name": "Giftschweif", + "effect": "Angriff mit hoher Volltrefferquote. Diese Schweifattacke vergiftet das Ziel eventuell." + }, + "covet": { + "name": "Bezirzer", + "effect": "Bittet charmant um das getragene Item des Zieles und stiehlt es dann." + }, + "voltTackle": { + "name": "Volttackle", + "effect": "Angriff mit Elektro-Tackle. Der Anwender verletzt sich dabei. Das Ziel wird eventuell paralysiert." + }, + "magicalLeaf": { + "name": "Zauberblatt", + "effect": "Magischer Blattangriff, dem nicht auszuweichen ist." + }, + "waterSport": { + "name": "Nassmacher", + "effect": "Der Anwender lässt Wasser herabregnen und schwächt damit fünf Runden lang Feuer-Attacken." + }, + "calmMind": { + "name": "Gedankengut", + "effect": "Erhöht Spezial-Angriff und Spezial-Verteidigung durch Konzentration." + }, + "leafBlade": { + "name": "Laubklinge", + "effect": "Hieb mit scharfkantigem Blatt. Hohe Volltrefferquote." + }, + "dragonDance": { + "name": "Drachentanz", + "effect": "Ein mystischer Tanz, der den Angriffs- und Initiative-Wert erhöht." + }, + "rockBlast": { + "name": "Felswurf", + "effect": "Wirft zwei- bis fünfmal in Folge Felsblöcke auf das Ziel." + }, + "shockWave": { + "name": "Schockwelle", + "effect": "Angriff mit schnellem Elektro-Schlag. Ausweichen nicht möglich." + }, + "waterPulse": { + "name": "Aquawelle", + "effect": "Angriff mit Wasserwelle, die das Ziel eventuell verwirren kann." + }, + "doomDesire": { + "name": "Kismetwunsch", + "effect": "Angriff mit gebündeltem Licht erfolgt zwei Runden nach Attackeneinsatz." + }, + "psychoBoost": { + "name": "Psyschub", + "effect": "Angriff mit voller Kraft, der den Spezial-Angriff des Anwenders durch den Rückstoß stark senkt." + }, + "roost": { + "name": "Ruheort", + "effect": "Anwender landet und ruht sich aus. KP des Anwenders werden um 50 % der maximalen KP aufgefüllt." + }, + "gravity": { + "name": "Erdanziehung", + "effect": "Die Gravitation wird für fünf Runden erhöht. Macht Fliegen unmöglich und verhindert Schwebe." + }, + "miracleEye": { + "name": "Wunderauge", + "effect": "Erlaubt es, Unlicht-Pokémon mit Psycho-Attacken anzugreifen. Ignoriert den Fluchtwert des Zieles." + }, + "wakeUpSlap": { + "name": "Weckruf", + "effect": "Richtet großen Schaden bei einem schlafenden Ziel an, weckt es aber auch auf." + }, + "hammerArm": { + "name": "Hammerarm", + "effect": "Anwender trifft mit einem starken Hieb. Senkt Initiative des Anwenders." + }, + "gyroBall": { + "name": "Gyroball", + "effect": "Angriff mit hoher Geschwindigkeit. Je niedriger die Initiative des Anwenders, desto höher der Schaden." + }, + "healingWish": { + "name": "Heilopfer", + "effect": "Anwender geht K.O. Das an seine Stelle tretende Pokémon hat volle KP. Statusprobleme werden geheilt." + }, + "brine": { + "name": "Lake", + "effect": "Hat das Ziel die Hälfte oder weniger seiner maximalen KP, trifft diese Attacke mit doppelter Kraft." + }, + "naturalGift": { + "name": "Beerenkräfte", + "effect": "Anwender zieht aus seiner derzeitigen Beere Kraft. Sie bestimmt Typ und Stärke der Attacke." + }, + "feint": { + "name": "Offenlegung", + "effect": "Ziele, die Schutzschild oder Scanner verwenden, werden getroffen. Entfernt Effekte dieser Attacken." + }, + "pluck": { + "name": "Pflücker", + "effect": "Anwender pickt das Ziel, nimmt die Beere, falls das Ziel eine trägt, und erhält ihren Effekt." + }, + "tailwind": { + "name": "Rückenwind", + "effect": "Anwender erzeugt einen Wirbelwind, der die Initiative aller Pokémon im Team für vier Runden steigert." + }, + "acupressure": { + "name": "Akupressur", + "effect": "Anwender erhöht Druck auf Stresspunkte und steigert einen Statuswert stark." + }, + "metalBurst": { + "name": "Metallstoß", + "effect": "Attacke mit großer Kraft gegen das Ziel, das dem Anwender in derselben Runde zuletzt Schaden zufügte." + }, + "uTurn": { + "name": "Kehrtwende", + "effect": "Nach der Attacke eilt der Anwender zurück und tauscht den Platz mit einem anderen Pokémon." + }, + "closeCombat": { + "name": "Nahkampf", + "effect": "Nahkampf-Attacke ohne Rücksicht auf Verluste. Senkt Verteidigung und Spezial-Verteidigung des Anwenders." + }, + "payback": { + "name": "Gegenstoß", + "effect": "Der Anwender lädt die Attacke auf. Handelt das Ziel vor dem Anwender, verdoppelt sich die Kraft der Attacke." + }, + "assurance": { + "name": "Gewissheit", + "effect": "Hat das Ziel während der Runde schon Schaden genommen, wird die Kraft der Attacke verdoppelt." + }, + "embargo": { + "name": "Itemsperre", + "effect": "Verhindert, dass auf das Ziel Items verwendet werden." + }, + "fling": { + "name": "Schleuder", + "effect": "Anwender schleudert sein Item auf das Ziel. Kraft und Effekt der Attacke hängen vom Item ab." + }, + "psychoShift": { + "name": "Psybann", + "effect": "Anwender nutzt seine Suggestivkräfte, um eigene Statusprobleme auf das Ziel zu transferieren." + }, + "trumpCard": { + "name": "Trumpfkarte", + "effect": "Je weniger AP diese Attacke hat, desto mehr Angriffskraft besitzt sie." + }, + "healBlock": { + "name": "Heilblockade", + "effect": "Anwender verhindert für fünf Runden, dass Ziele durch Attacken, Fähigkeiten oder Items KP regenerieren." + }, + "wringOut": { + "name": "Auswringen", + "effect": "Anwender presst sein Ziel aus. Je höher die KP des Zieles, desto kraftvoller die Attacke." + }, + "powerTrick": { + "name": "Krafttrick", + "effect": "Anwender setzt Psycho-Kräfte ein, um eigenen Angriffs- mit Verteidigungs-Wert auszutauschen." + }, + "gastroAcid": { + "name": "Magensäfte", + "effect": "Anwender greift das Ziel mit eigenen Magensäften an. Entfernt Effekte von dessen Fähigkeit." + }, + "luckyChant": { + "name": "Beschwörung", + "effect": "Anwender singt eine Beschwörungsformel, die Volltreffer gegen ihn verhindert." + }, + "meFirst": { + "name": "Egotrip", + "effect": "Anwender stiehlt und führt die Attacke eines langsameren Zieles zuerst und mit größerer Kraft aus." + }, + "copycat": { + "name": "Imitator", + "effect": "Anwender imitiert gerade verwendete Attacke. Dies schlägt fehl, falls zuvor keine Attacke verwendet wurde." + }, + "powerSwap": { + "name": "Krafttausch", + "effect": "Psychische Kräfte tauschen Änderungen an Angriff und Spezial-Angriff mit denen des Zieles." + }, + "guardSwap": { + "name": "Schutztausch", + "effect": "Psychische Kräfte tauschen Änderungen an Verteidigung und Spezial-Verteidigung mit denen des Zieles." + }, + "punishment": { + "name": "Strafattacke", + "effect": "Je stärker das Ziel durch Statusveränderungen ist, desto stärker wirkt diese Attacke." + }, + "lastResort": { + "name": "Zuflucht", + "effect": "Diese Attacke kann nur eingesetzt werden, nachdem alle verfügbaren Attacken ausgeführt worden sind." + }, + "worrySeed": { + "name": "Sorgensamen", + "effect": "Ziel wird bepflanzt. Wandelt Fähigkeit in Insomnia um. Verhindert so Schlaf." + }, + "suckerPunch": { + "name": "Tiefschlag", + "effect": "Ermöglicht den Erstschlag. Gelingt aber nur, wenn das Ziel gerade eine Attacke vorbereitet." + }, + "toxicSpikes": { + "name": "Giftspitzen", + "effect": "Anwender legt eine Falle mit Giftdornen aus. In den Kampf eingewechselte gegnerische Pokémon werden vergiftet." + }, + "heartSwap": { + "name": "Statustausch", + "effect": "Anwender setzt Psycho-Kräfte ein, um Statusveränderungen des Zieles mit den eigenen zu tauschen." + }, + "aquaRing": { + "name": "Wasserring", + "effect": "Anwender umgibt sich mit einem Schleier aus Wasser. Dabei regeneriert er einige KP pro Runde." + }, + "magnetRise": { + "name": "Magnetflug", + "effect": "Anwender schwebt für fünf Runden durch elektrisch erzeugten Magnetismus." + }, + "flareBlitz": { + "name": "Flammenblitz", + "effect": "Anwender hüllt sich in Flammen und stürmt auf das Ziel zu, das sich eventuell verbrennt. Anwender nimmt selbst großen Schaden." + }, + "forcePalm": { + "name": "Kraftwelle", + "effect": "Das Ziel wird mit einer Schockwelle angegriffen, die es eventuell paralysiert." + }, + "auraSphere": { + "name": "Aurasphäre", + "effect": "Tief aus dem Inneren des Anwenders löst sich ein kraftvoller Stoß Auraenergie. Trifft in jedem Fall." + }, + "rockPolish": { + "name": "Steinpolitur", + "effect": "Anwender reduziert so gut wie möglich den Luftwiderstand. Kann Initiative-Wert stark steigern." + }, + "poisonJab": { + "name": "Gifthieb", + "effect": "Ziel wird mit vergiftetem Arm oder Tentakel verletzt. Es wird dabei eventuell vergiftet." + }, + "darkPulse": { + "name": "Finsteraura", + "effect": "Anwender greift mit fürchterlicher Aura schlechter Gedanken an. Ziel schreckt eventuell zurück." + }, + "nightSlash": { + "name": "Nachthieb", + "effect": "Anwender greift bei der ersten Gelegenheit mit scharfen Klauen an. Hohe Volltrefferquote." + }, + "aquaTail": { + "name": "Nassschweif", + "effect": "Anwender attackiert mit dem Schweif, als ob dieser eine brutale Welle in einem tosenden Sturm sei." + }, + "seedBomb": { + "name": "Samenbomben", + "effect": "Anwender lässt eine Menge Samen mit harter Schale von oben auf das Ziel fallen." + }, + "airSlash": { + "name": "Luftschnitt", + "effect": "Das Ziel wird mit einer Luftklinge angegriffen. Ziel schreckt eventuell zurück." + }, + "xScissor": { + "name": "Kreuzschere", + "effect": "Der Anwender führt eine Attacke aus, die einer Scherenbewegung ähnelt." + }, + "bugBuzz": { + "name": "Käfergebrumm", + "effect": "Anwender schlägt mit den Flügeln und erzeugt eine Schockwelle. Senkt eventuell Spezial-Verteidigung des Zieles." + }, + "dragonPulse": { + "name": "Drachenpuls", + "effect": "Das Ziel wird mit einer Schockwelle angegriffen, die aus dem offenen Maul des Anwenders kommt." + }, + "dragonRush": { + "name": "Drachenstoß", + "effect": "Anwender führt einen gefährlichen Angriff aus. Das Ziel schreckt eventuell zurück." + }, + "powerGem": { + "name": "Juwelenkraft", + "effect": "Anwender attackiert mit einem Lichtstrahl, der funkelt, als sei er aus Juwelen." + }, + "drainPunch": { + "name": "Ableithieb", + "effect": "Entzieht dem Ziel Energie. Die Hälfte des Schadens wird den KP des Anwenders zugerechnet." + }, + "vacuumWave": { + "name": "Vakuumwelle", + "effect": "Ein Faustwirbel sendet eine Vakuumwelle auf das Ziel. Erstschlaggarantie." + }, + "focusBlast": { + "name": "Fokusstoß", + "effect": "Anwender erhöht seinen mentalen Fokus und greift dann an. Senkt eventuell Spezial-Verteidigung des Zieles." + }, + "energyBall": { + "name": "Energieball", + "effect": "Anwender zieht Kraft aus der Natur und feuert sie auf das Ziel. Senkt eventuell Spezial-Verteidigung des Zieles." + }, + "braveBird": { + "name": "Sturzflug", + "effect": "Anwender greift aus niedriger Höhe an. Er erleidet bei dieser Attacke selbst großen Schaden." + }, + "earthPower": { + "name": "Erdkräfte", + "effect": "Der Boden unter dem Ziel erzittert durch die Kraft der Erde. Senkt eventuell Spezial-Verteidigung." + }, + "switcheroo": { + "name": "Wechseldich", + "effect": "Item wird in Windeseile mit dem Ziel getauscht." + }, + "gigaImpact": { + "name": "Gigastoß", + "effect": "Anwender rennt mit seiner ganzen Kraft gegen das Ziel an und muss dann eine Runde ruhen." + }, + "nastyPlot": { + "name": "Ränkeschmied", + "effect": "Anwender stimuliert sein Gehirn und hat finstere Gedanken. Steigert Spezial-Angriff stark." + }, + "bulletPunch": { + "name": "Patronenhieb", + "effect": "Das Ziel wird von ultraschnellen Hieben getroffen. Erstschlaggarantie." + }, + "avalanche": { + "name": "Lawine", + "effect": "Wurde der Anwender in dieser Runde vom Ziel getroffen, macht diese Attacke doppelten Schaden." + }, + "iceShard": { + "name": "Eissplitter", + "effect": "Das Ziel wird mit Eisklumpen beworfen. Diese Attacke hat Erstschlaggarantie." + }, + "shadowClaw": { + "name": "Dunkelklaue", + "effect": "Das Ziel wird mit scharfen Klauen aus der Schattenwelt attackiert. Hohe Volltrefferquote." + }, + "thunderFang": { + "name": "Donnerzahn", + "effect": "Anwender beißt mit elektrifizierten Reißzähnen zu. Das Ziel schreckt eventuell zurück oder wird paralysiert." + }, + "iceFang": { + "name": "Eiszahn", + "effect": "Anwender beißt mit eiskalten Reißzähnen zu. Ziel schreckt eventuell zurück oder friert ein." + }, + "fireFang": { + "name": "Feuerzahn", + "effect": "Anwender beißt mit flammenden Reißzähnen zu. Ziel schreckt eventuell zurück oder verbrennt sich." + }, + "shadowSneak": { + "name": "Schattenstoß", + "effect": "Anwender erweitert Schatten und greift das Ziel von hinten an. Erstschlaggarantie." + }, + "mudBomb": { + "name": "Schlammbombe", + "effect": "Anwender greift mit einem festen Schlammklumpen an. Senkt eventuell Genauigkeit des Zieles." + }, + "psychoCut": { + "name": "Psychoklinge", + "effect": "Das Ziel wird mit Klingen attackiert, die aus Psycho-Energie bestehen. Hohe Volltrefferquote." + }, + "zenHeadbutt": { + "name": "Zen-Kopfstoß", + "effect": "Anwender konzentriert seinen Willen und rammt das Ziel. Dieses schreckt eventuell zurück." + }, + "mirrorShot": { + "name": "Spiegelsalve", + "effect": "Anwender feuert Energiestrahl aus seinem Körper ab. Senkt eventuell Genauigkeit des Zieles." + }, + "flashCannon": { + "name": "Lichtkanone", + "effect": "Anwender sammelt Lichtenergie und feuert sie auf einmal ab. Senkt eventuell Spezial-Verteidigung des Zieles." + }, + "rockClimb": { + "name": "Kraxler", + "effect": "Eine stürmische Attacke, die das Ziel eventuell verwirrt." + }, + "defog": { + "name": "Auflockern", + "effect": "Starker Wind hebt Attacken wie Reflektor und Lichtschild des Zieles auf. Senkt außerdem den Fluchtwert." + }, + "trickRoom": { + "name": "Bizarroraum", + "effect": "Anwender erzeugt einen bizarren Raum, in dem langsame Pokémon fünf Runden lang zuerst agieren." + }, + "dracoMeteor": { + "name": "Draco Meteor", + "effect": "Kometen werden heraufbeschworen. Der Rückstoß reduziert den Spezial-Angriff des Anwenders stark." + }, + "discharge": { + "name": "Ladungsstoß", + "effect": "Anwender greift alle Pokémon im Umkreis mit Elektrizität an. Diese werden eventuell auch paralysiert." + }, + "lavaPlume": { + "name": "Flammensturm", + "effect": "Greift alles in seiner Umgebung mit tiefroten Flammen an. Ziel kann Verbrennungen erleiden." + }, + "leafStorm": { + "name": "Blättersturm", + "effect": "Anwender erzeugt einen Sturm aus scharfen Blättern. Rückstoß senkt Spezial-Angriff des Anwenders stark." + }, + "powerWhip": { + "name": "Blattgeißel", + "effect": "Anwender wirbelt seine Ranken oder Tentakel peitschenartig gegen das Ziel." + }, + "rockWrecker": { + "name": "Felswerfer", + "effect": "Anwender wirft einen riesigen Felsen auf das Ziel. In der nächsten Runde muss der Anwender ruhen." + }, + "crossPoison": { + "name": "Giftstreich", + "effect": "Ein schneidender Hieb, der das Ziel eventuell vergiftet. Hat eine hohe Volltrefferquote." + }, + "gunkShot": { + "name": "Mülltreffer", + "effect": "Anwender schießt mit Müll auf das Ziel. Vergiftet dieses eventuell." + }, + "ironHead": { + "name": "Eisenschädel", + "effect": "Ziel wird durch stahlharten Kopf des Anwenders getroffen und schreckt eventuell zurück." + }, + "magnetBomb": { + "name": "Magnetbombe", + "effect": "Ziel wird durch Haftbomben getroffen. Diese Attacke trifft immer." + }, + "stoneEdge": { + "name": "Steinkante", + "effect": "Anwender sticht das Ziel mit spitzen Steinen. Hohe Volltrefferquote." + }, + "captivate": { + "name": "Liebreiz", + "effect": "Charme-Attacke, die den Spezial-Angriff des Zieles stark senkt, falls es dem anderen Geschlecht angehört." + }, + "stealthRock": { + "name": "Tarnsteine", + "effect": "Falle mit schwebenden Steinen. In den Kampf eingewechselte Ziele nehmen Schaden." + }, + "grassKnot": { + "name": "Strauchler", + "effect": "Ziel wird durch Gras ins Straucheln gebracht. Je schwerer das Ziel, desto mehr Schaden." + }, + "chatter": { + "name": "Geschwätz", + "effect": "Attacke mit Schallwellen. Verwirrt das Ziel." + }, + "judgment": { + "name": "Urteilskraft", + "effect": "Anwender feuert unzählige Lichtstrahlen ab. Deren Typ hängt von der gehaltenen Tafel ab." + }, + "bugBite": { + "name": "Käferbiss", + "effect": "Anwender beißt das Ziel. Trägt dieses eine Beere, isst der Anwender sie und erhält ihren Effekt." + }, + "chargeBeam": { + "name": "Ladestrahl", + "effect": "Ziel wird von einem Elektrostrahl getroffen. Steigert eventuell Spezial-Angriff des Anwenders." + }, + "woodHammer": { + "name": "Holzhammer", + "effect": "Anwender attackiert mit seinem robusten Körper. Er erleidet dabei auch selbst großen Schaden." + }, + "aquaJet": { + "name": "Wasserdüse", + "effect": "Bei dieser Erstschlag-Attacke stürzt sich der Anwender so schnell auf das Ziel, dass er quasi unsichtbar wird." + }, + "attackOrder": { + "name": "Schlagbefehl", + "effect": "Anwender ruft seine Untergebenen zum Angriff. Hat eine hohe Volltrefferquote." + }, + "defendOrder": { + "name": "Blockbefehl", + "effect": "Untergebene bilden einen lebenden Schild um den Anwender. Steigert Verteidigung und Spezial-Verteidigung." + }, + "healOrder": { + "name": "Heilbefehl", + "effect": "Untergebene heilen den Anwender. KP des Anwenders werden um 50 % der maximalen KP aufgefüllt." + }, + "headSmash": { + "name": "Kopfstoß", + "effect": "Anwender greift unter Einsatz seines Lebens mit einem Kopfstoß an und nimmt dabei selbst jede Menge Schaden." + }, + "doubleHit": { + "name": "Doppelschlag", + "effect": "Anwender trifft das Ziel mit dem Schweif oder Ähnlichem. Ziel wird doppelt getroffen." + }, + "roarOfTime": { + "name": "Zeitenlärm", + "effect": "Anwender attackiert mit einer Kraft, die selbst die Zeit verzerrt. In der nächsten Runde muss er ruhen." + }, + "spacialRend": { + "name": "Raumschlag", + "effect": "Schwere, raumgreifende Attacke. Hohe Volltrefferquote." + }, + "lunarDance": { + "name": "Lunartanz", + "effect": "Anwender geht K.O. Das an seine Stelle tretende Pokémon hat dafür volle KP und AP. Statusprobleme werden geheilt." + }, + "crushGrip": { + "name": "Quetschgriff", + "effect": "Ziel wird mit großer Kraft getroffen. Je höher die KP des Zieles, desto stärker die Attacke." + }, + "magmaStorm": { + "name": "Lavasturm", + "effect": "Das Ziel wird in einen Feuersog gezogen, der vier bis fünf Runden aktiv ist." + }, + "darkVoid": { + "name": "Schlummerort", + "effect": "Das Ziel wird in eine Welt der Dunkelheit gezogen und in Schlaf versetzt." + }, + "seedFlare": { + "name": "Schocksamen", + "effect": "Anwender erzeugt eine Schockwelle. Spezial-Verteidigung des Zieles wird stark gesenkt." + }, + "ominousWind": { + "name": "Unheilböen", + "effect": "Das Ziel treffen abscheuliche Winde. Steigert eventuell alle Statuswerte des Anwenders." + }, + "shadowForce": { + "name": "Schemenkraft", + "effect": "Anwender verschwindet in Runde 1 und attackiert in Runde 2. Trifft auch, wenn sich das Ziel selbst schützt." + }, + "honeClaws": { + "name": "Klauenwetzer", + "effect": "Wetzt seine Klauen, um sie zu schärfen. Erhöht Angriff und Genauigkeit des Anwenders." + }, + "wideGuard": { + "name": "Rundumschutz", + "effect": "Schützt eine Runde lang vor Angriffen, die alle Pokémon auf deiner Seite treffen." + }, + "guardSplit": { + "name": "Schutzteiler", + "effect": "Durch Psycho-Kräfte werden Verteidigung und Spezial-Verteidigung des Anwenders und des Zieles addiert und in zwei gleiche Hälften geteilt." + }, + "powerSplit": { + "name": "Kraftteiler", + "effect": "Durch Psycho-Kräfte werden Angriff und Spezial-Angriff des Anwenders und des Zieles addiert und in zwei gleiche Hälften geteilt." + }, + "wonderRoom": { + "name": "Wunderraum", + "effect": "Anwender erzeugt bizarren Raum, in dem über fünf Runden die Verteidigung aller Pokémon mit ihrer Spezial-Verteidigung getauscht wird." + }, + "psyshock": { + "name": "Psychoschock", + "effect": "Anwender erzeugt eine seltsame Energiewelle, die dem Ziel physischen Schaden zufügt." + }, + "venoshock": { + "name": "Giftschock", + "effect": "Überschüttet das Ziel mit einer speziellen toxischen Flüssigkeit. Doppelt so stark gegen vergiftete Ziele." + }, + "autotomize": { + "name": "Autotomie", + "effect": "Anwender trennt sich von überflüssigen Körperteilen und steigert seine Initiative stark. Sein Gewicht nimmt deutlich ab." + }, + "ragePowder": { + "name": "Wutpulver", + "effect": "Anwender zieht gegnerische Aufmerksamkeit und Angriffe auf sich, indem er ein Wut erzeugendes Pulver über sich streut." + }, + "telekinesis": { + "name": "Telekinese", + "effect": "Bringt das Ziel durch Psycho-Kräfte zum Schweben. Dieses lässt sich so über drei Runden hinweg besonders leicht treffen." + }, + "magicRoom": { + "name": "Magieraum", + "effect": "Anwender erzeugt einen bizarren Raum, in dem über fünf Runden die Wirkung aller von Pokémon getragenen Items aufgehoben ist." + }, + "smackDown": { + "name": "Katapult", + "effect": "Greift das Ziel mit Steinen und Wurfgeschossen an. Fliegende Ziele fallen dabei vom Himmel und landen auf dem Boden." + }, + "stormThrow": { + "name": "Bergsturm", + "effect": "Ein Angriff mit voller Wucht und Volltreffergarantie." + }, + "flameBurst": { + "name": "Funkenflug", + "effect": "Bei Erfolg greift der Anwender mit berstenden Feuerblasen an. Die Funken der geplatzten Blasen treffen auch benachbarte Ziele." + }, + "sludgeWave": { + "name": "Schlammwoge", + "effect": "Greift Pokémon in der Nähe des Anwenders mit einer Schlammwelle an. Diese werden eventuell vergiftet." + }, + "quiverDance": { + "name": "Falterreigen", + "effect": "Anwender legt behände einen mystischen, formvollendeten Tanz aufs Parkett. Spezial-Angriff, Spezial-Verteidigung und Initiative steigen." + }, + "heavySlam": { + "name": "Rammboss", + "effect": "Anwender rammt das Ziel mit massivem Körper. Je schwerer er im Vergleich zum Ziel ist, desto stärker die Attacke." + }, + "synchronoise": { + "name": "Synchrolärm", + "effect": "Fügt Pokémon vom selben Typ, die sich in der Nähe des Anwenders aufhalten, mit seltsamen Druckwellen Schaden zu." + }, + "electroBall": { + "name": "Elektroball", + "effect": "Je höher die Initiative des Anwenders im Vergleich zum Ziel ist, desto stärker trifft dieses eine geballte Ladung Strom." + }, + "soak": { + "name": "Überflutung", + "effect": "Überschüttet das Ziel mit Unmengen an Wasser und ändert den Typ damit in Wasser um." + }, + "flameCharge": { + "name": "Nitroladung", + "effect": "Anwender hüllt sich in Flammen und greift das Ziel an. Sammelt seine Energie und erhöht dadurch die eigene Initiative." + }, + "coil": { + "name": "Einrollen", + "effect": "Anwender rollt sich zusammen und sammelt sich. Dabei werden Angriff, Verteidigung und Genauigkeit erhöht." + }, + "lowSweep": { + "name": "Fußtritt", + "effect": "Anwender greift mit blitzschnellen Bewegungen die Beine des Zieles an und senkt dessen Initiative." + }, + "acidSpray": { + "name": "Säurespeier", + "effect": "Anwender greift an, indem er eine ätzende Flüssigkeit auf das Ziel speit. Senkt dessen Spezial-Verteidigung stark." + }, + "foulPlay": { + "name": "Schmarotzer", + "effect": "Anwender macht sich die Kraft des Zieles zunutze. Je höher dessen Angriff, desto mehr Schaden richtet die Attacke an." + }, + "simpleBeam": { + "name": "Wankelstrahl", + "effect": "Bestrahlt das Ziel mit mysteriösen Energiewellen. Bei einem Treffer wird dessen Fähigkeit zu Wankelmut." + }, + "entrainment": { + "name": "Zwango", + "effect": "Anwender tanzt zu einem seltsamem Rhythmus und zwingt das Ziel mitzumachen. Dieses nimmt dabei die Fähigkeit des Anwenders an." + }, + "afterYou": { + "name": "Galanterie", + "effect": "Anwender ermöglicht dem Ziel direkt nach ihm zu handeln, solange der Anwender als Erstes zum Zug kommt." + }, + "round": { + "name": "Kanon", + "effect": "Angriff mit Gesang. Singt der Anwender mit allen im Kanon, steigt die Stärke." + }, + "echoedVoice": { + "name": "Widerhall", + "effect": "Angriff mit widerhallender Stimme. Wenn in jeder Runde ein Teilnehmer wiederholt die Attacke einsetzt, steigt die Stärke." + }, + "chipAway": { + "name": "Zermürben", + "effect": "Eine durchdachte Attacke zu rechter Zeit. Richtet unabhängig von den Statusveränderungen des Zieles Schaden an." + }, + "clearSmog": { + "name": "Klärsmog", + "effect": "Anwender greift das Ziel mit spezialgefertigten Schlammklumpen an. Setzt Statusveränderungen zurück." + }, + "storedPower": { + "name": "Kraftvorrat", + "effect": "Angriff mit angesparter Energie. Je höher die Statuswerte des Anwenders, desto stärker fällt die Attacke aus." + }, + "quickGuard": { + "name": "Rapidschutz", + "effect": "Schützt Anwender und Mitstreiter vor gegnerischen Erstschlag-Attacken." + }, + "allySwitch": { + "name": "Seitentausch", + "effect": "Wundersame Kräfte teleportieren den Anwender an den Platz eines Mitstreiters." + }, + "scald": { + "name": "Siedewasser", + "effect": "Heizt dem Ziel mit einem Schwall siedend heißen Kochwassers ein. Das Ziel erleidet dabei eventuell Verbrennungen." + }, + "shellSmash": { + "name": "Hausbruch", + "effect": "Anwender zerbricht seine Schale und senkt seine Verteidigung und Spezial-Verteidigung, aber dafür steigen Angriff, Spezial-Angriff und Initiative stark." + }, + "healPulse": { + "name": "Heilwoge", + "effect": "Anwender löst eine Schmerzen lindernde Welle aus und heilt dabei das Ziel mit der Hälfte seiner maximalen KP." + }, + "hex": { + "name": "Bürde", + "effect": "Eine Attacke, bei der der Anwender das Ziel bedrängt. Fügt Zielen mit Statusproblemen hohen Schaden zu." + }, + "skyDrop": { + "name": "Freier Fall", + "effect": "Steigt in Runde 1 mit dem Ziel in die Luft auf und lässt es in Runde 2 fallen. Das Ziel kann dabei nicht angreifen." + }, + "shiftGear": { + "name": "Gangwechsel", + "effect": "Durch Drehen der Zahnräder erhöht sich nicht nur der Angriffs-Wert, sondern auch die Initiative des Anwenders stark." + }, + "circleThrow": { + "name": "Überkopfwurf", + "effect": "Schleudert das Ziel davon und bewirkt damit, dass ein anderes Pokémon eingewechselt wird. Beendet Kämpfe gegen wilde Pokémon." + }, + "incinerate": { + "name": "Einäschern", + "effect": "Eine Feuer-Attacke. Trägt das Ziel eine Beere oder ein ähnliches Item bei sich, wird dieses von den Flammen verzehrt und geht verloren." + }, + "quash": { + "name": "Verzögerung", + "effect": "Anwender stemmt sich gegen das Ziel und bewirkt, dass dieses erst als Letztes angreift." + }, + "acrobatics": { + "name": "Akrobatik", + "effect": "Ein graziler Angriff auf das Ziel. Trägt der Anwender kein Item bei sich, richtet die Attacke großen Schaden an." + }, + "reflectType": { + "name": "Typenspiegel", + "effect": "Anwender bildet das Ziel nach und nimmt dabei dessen Typ an." + }, + "retaliate": { + "name": "Heimzahlung", + "effect": "Anwender nimmt Rache für einen besiegten Mitstreiter. Wurde in der vorigen Runde ein Mitstreiter besiegt, steigt die Kraft." + }, + "finalGambit": { + "name": "Wagemut", + "effect": "Ein Angriff, der dem Ziel Schaden in Höhe der aktuellen KP des Anwenders zufügt. Letzterer wird dadurch selbst besiegt." + }, + "bestow": { + "name": "Offerte", + "effect": "Trägt das Ziel gerade kein Item bei sich, erhält es das Item, das sich aktuell im Besitz des Anwenders befindet." + }, + "inferno": { + "name": "Inferno", + "effect": "Anwender greift das Ziel an, indem er es mit dichten Flammen umhüllt. Ziel erleidet Verbrennungen." + }, + "waterPledge": { + "name": "Wassersäulen", + "effect": "Ein Angriff mit Wassersäulen. Mit Feuersäulen kombiniert steigt die Wirkung und ein Regenbogen erscheint." + }, + "firePledge": { + "name": "Feuersäulen", + "effect": "Ein Angriff mit Feuersäulen. Mit Pflanzsäulen kombiniert steigt die Wirkung und die Umgebung wird zu einem Meer aus Feuer." + }, + "grassPledge": { + "name": "Pflanzensäulen", + "effect": "Ein Angriff mit Pflanzsäulen. Mit Wassersäulen kombiniert steigt die Wirkung und die Umgebung wird zu einem Sumpf." + }, + "voltSwitch": { + "name": "Voltwechsel", + "effect": "Anwender kehrt nach dem Angriff mit atemberaubender Geschwindigkeit zurück und tauscht Platz mit einem anderen Pokémon." + }, + "struggleBug": { + "name": "Käfertrutz", + "effect": "Anwender leistet Widerstand und greift an. Der Spezial-Angriff der Ziele sinkt." + }, + "bulldoze": { + "name": "Dampfwalze", + "effect": "Anwender greift an, indem er den Boden um sich herum plattwalzt. Die Initiative aller betroffenen Pokémon sinkt." + }, + "frostBreath": { + "name": "Eisesodem", + "effect": "Anwender greift an, indem er dem Ziel eisigen Atem entgegenhaucht. Volltreffergarantie." + }, + "dragonTail": { + "name": "Drachenrute", + "effect": "Putzt das Ziel vom Feld und wechselt es mit einem anderen Pokémon aus. Beendet Kämpfe gegen wilde Pokémon." + }, + "workUp": { + "name": "Kraftschub", + "effect": "Anwender erhält einen Kraftschub, der seinen Angriff und Spezial-Angriff erhöht." + }, + "electroweb": { + "name": "Elektronetz", + "effect": "Fängt Ziele mit einem elektrischen Netz und senkt deren Initiative." + }, + "wildCharge": { + "name": "Stromstoß", + "effect": "Anwender erzeugt Spannung und greift an, indem er auf Kollisionskurs geht. Er selbst erleidet dabei ebenfalls leichten Schaden." + }, + "drillRun": { + "name": "Schlagbohrer", + "effect": "Anwender rammt das Ziel, während er seinen Körper wie einen Bohrer dreht. Hohe Volltrefferquote." + }, + "dualChop": { + "name": "Doppelhieb", + "effect": "Versetzt dem Ziel mit massiven Extremitäten Hiebe. Angriff erfolgt zweimal hintereinander." + }, + "heartStamp": { + "name": "Herzstempel", + "effect": "Verleitet Ziel durch Kokettieren zu Unachtsamkeit und verpasst ihm dann einen harten Schlag. Ziel schreckt eventuell zurück." + }, + "hornLeech": { + "name": "Holzgeweih", + "effect": "Greift Ziel mit Astgeweih an und zapft diesem Nährstoffe ab. Anwender wird um die Hälfte des zugefügten Schadens geheilt." + }, + "sacredSword": { + "name": "Sanctoklinge", + "effect": "Schneideangriff mit langem Horn. Richtet Schaden unabhängig von Statusveränderungen des Zieles an." + }, + "razorShell": { + "name": "Kalkklinge", + "effect": "Schneideangriff mit einer scharfen Muschelschale. Senkt eventuell die Verteidigung des Zieles." + }, + "heatCrash": { + "name": "Brandstempel", + "effect": "Rempelattacke mit brennendem Körper. Je schwerer der Anwender im Vergleich zum Ziel ist, desto stärker die Attacke." + }, + "leafTornado": { + "name": "Grasmixer", + "effect": "Anwender greift an, indem er das Ziel in scharfes Blattwerk einwickelt. Kann die Genauigkeit senken." + }, + "steamroller": { + "name": "Quetschwalze", + "effect": "Anwender rollt mit rundlichem Körper über das Ziel und drückt es platt. Ziel schreckt eventuell zurück." + }, + "cottonGuard": { + "name": "Watteschild", + "effect": "Anwender schützt sich, indem er sich in einen luftigen Flaum hüllt. Erhöht die Verteidigung drastisch." + }, + "nightDaze": { + "name": "Nachtflut", + "effect": "Anwender greift Ziel mit finsteren Schockwellen an. Senkt eventuell die Genauigkeit." + }, + "psystrike": { + "name": "Psychostoß", + "effect": "Anwender erzeugt seltsame Energiewellen, die dem Ziel physischen Schaden zufügen." + }, + "tailSlap": { + "name": "Kehrschelle", + "effect": "Anwender greift das Ziel mit seiner schlagfesten Rute zwei- bis fünfmal hintereinander an." + }, + "hurricane": { + "name": "Orkan", + "effect": "Anwender greift das Ziel an, indem er es mit heftigen Windböen umgibt. Ziel wird eventuell verwirrt." + }, + "headCharge": { + "name": "Steinschädel", + "effect": "Rempelattacke mit ausgeflippter Retrofrisur. Anwender nimmt selbst leichten Schaden." + }, + "gearGrind": { + "name": "Klikkdiskus", + "effect": "Anwender greift an, indem er stählerne Zahnräder auf das Ziel schleudert. Angriff erfolgt zweimal hintereinander." + }, + "searingShot": { + "name": "Flammenball", + "effect": "Greift alles in seiner Umgebung mit tiefroten Flammen an. Ziel kann Verbrennungen erleiden." + }, + "technoBlast": { + "name": "Techblaster", + "effect": "Anwender feuert ein Lichtgeschoss auf das Ziel ab. Der Typ der Attacke hängt von dem des Moduls ab." + }, + "relicSong": { + "name": "Urgesang", + "effect": "Anwender greift mit Urgesang an, der Ziele in der Nähe im tiefsten Inneren anspricht. Diese schlafen eventuell ein." + }, + "secretSword": { + "name": "Mystoschwert", + "effect": "Schneideangriff mit dem langen Schwert des Anwenders. Die mysteriöse Kraft aus dem Horn erzeugt physischen Schaden." + }, + "glaciate": { + "name": "Eiszeit", + "effect": "Anwender greift an, indem er dem Ziel klirrend kalte Luft entgegenbläst. Senkt die Initiative des Zieles." + }, + "boltStrike": { + "name": "Blitzschlag", + "effect": "Lädt seinen Körper mit einer gewaltigen Menge an Elektrizität auf und rammt damit das Ziel. Ziel wird eventuell paralysiert." + }, + "blueFlare": { + "name": "Blauflammen", + "effect": "Anwender greift an, indem er das Ziel in wunderschöne, intensivblaue Flammen hüllt, die es eventuell verbrennen." + }, + "fieryDance": { + "name": "Feuerreigen", + "effect": "Hüllt das Ziel mit einer Feuerhose in Flammen. Kann den Spezial-Angriff des Anwenders erhöhen." + }, + "freezeShock": { + "name": "Frostvolt", + "effect": "Feuert in der zweiten Runde elektrisch geladene Eisklumpen auf das Ziel ab. Paralysiert das Ziel eventuell." + }, + "iceBurn": { + "name": "Frosthauch", + "effect": "Umgibt das Ziel in der nächsten Runde mit heftigen, alles gefrierenden Eisböen. Fügt dem Ziel eventuell Verbrennungen zu." + }, + "snarl": { + "name": "Standpauke", + "effect": "Wäscht Zielen in der Nähe mit einer ausführlichen Standpauke den Kopf und senkt dabei deren Spezial-Angriff." + }, + "icicleCrash": { + "name": "Eiszapfhagel", + "effect": "Lässt große, schwere Eiszapfen auf das Ziel herabregnen. Ziel schreckt eventuell zurück." + }, + "vCreate": { + "name": "V-Generator", + "effect": "Eine Verzweiflungsattacke. Anwender entfacht glühend heißes Feuer. Senkt dessen Verteidigung, Spezial-Verteidigung und Initiative." + }, + "fusionFlare": { + "name": "Kreuzflamme", + "effect": "Feuert eine monströse Flamme ab. Wird die Attacke durch einen gigantischen Blitz modifiziert, steigt die Stärke." + }, + "fusionBolt": { + "name": "Kreuzdonner", + "effect": "Feuert einen monströsen Blitz ab. Wird die Attacke durch eine gigantische Flamme modifiziert, steigt die Stärke." + }, + "flyingPress": { + "name": "Flying Press", + "effect": "Der Anwender stürzt sich aus der Luft auf das Ziel. Die Attacke gehört sowohl dem Typ Kampf als auch dem Typ Flug an." + }, + "matBlock": { + "name": "Tatami-Schild", + "effect": "Der Anwender richtet eine Tatami-Matte auf, um sich und sein Team vor Schaden zu schützen. Kein Schutz vor Status-Attacken." + }, + "belch": { + "name": "Rülpser", + "effect": "Der Anwender fügt dem Ziel Schaden zu, indem er es anrülpst. Diese Attacke gelingt nur nach dem Konsum einer getragenen Beere." + }, + "rototiller": { + "name": "Pflüger", + "effect": "Der Anwender pflügt den Boden und macht die Erde fruchtbarer. Erhöht den Angriff und den Spezial-Angriff von Pflanzen-Pokémon." + }, + "stickyWeb": { + "name": "Klebenetz", + "effect": "Der Anwender spinnt in der Umgebung des gegnerischen Teams ein klebriges Netz und senkt so die Initiative neu eingewechselter Pokémon." + }, + "fellStinger": { + "name": "Stachelfinale", + "effect": "Gelingt es dem Anwender, das Ziel mit dieser Attacke zu besiegen, steigt sein Angriffs-Wert stark." + }, + "phantomForce": { + "name": "Phantomkraft", + "effect": "Der Anwender verschwindet, um eine Runde lang seine Kraft zu sammeln und in der nächsten Runde anzugreifen. Durchbricht die Defensive des Zieles." + }, + "trickOrTreat": { + "name": "Halloween", + "effect": "Der Anwender lehrt das Ziel das Fürchten. Dieses nimmt dadurch zusätzlich den Typ Geist an." + }, + "nobleRoar": { + "name": "Kampfgebrüll", + "effect": "Der Anwender stößt ein Kampfgebrüll aus, das das Ziel einschüchtert und zugleich seinen Angriffs- und Spezial-Angriffs-Wert senkt." + }, + "ionDeluge": { + "name": "Plasmaschauer", + "effect": "Versprüht elektrisch geladene Partikel und bewirkt, dass Normal-Attacken den Typ Elektro annehmen." + }, + "parabolicCharge": { + "name": "Parabolladung", + "effect": "Fügt allen Pokémon in der Umgebung Schaden zu. Der Anwender wird um die Hälfte des insgesamt angerichteten Schadens geheilt." + }, + "forestsCurse": { + "name": "Waldesfluch", + "effect": "Der Anwender belegt das Ziel mit einem Waldesfluch, durch den dieses zusätzlich den Typ Pflanze annimmt." + }, + "petalBlizzard": { + "name": "Blütenwirbel", + "effect": "Der Anwender erzeugt einen turbulenten Blütenwirbel, der alle Pokémon in der Nähe erfasst und ihnen Schaden zufügt." + }, + "freezeDry": { + "name": "Gefriertrockner", + "effect": "Das Ziel wird stark abgekühlt und manchmal sogar eingefroren. Die Attacke ist sehr effektiv gegen Wasser-Pokémon." + }, + "disarmingVoice": { + "name": "Säuselstimme", + "effect": "Der Anwender stößt einen bezirzenden Ruf aus, mit dem er das Ziel in seinen Bann schlägt und ihm immer mentalen Schaden zufügt." + }, + "partingShot": { + "name": "Abgangstirade", + "effect": "Schüchtert das Ziel mit einer Abgangstirade ein, sodass dessen Angriffs- und Spezial-Angriffs-Wert sinken. Danach wird der Anwender ausgewechselt." + }, + "topsyTurvy": { + "name": "Invertigo", + "effect": "Invertiert alle Statusveränderungen des Zieles." + }, + "drainingKiss": { + "name": "Diebeskuss", + "effect": "Der Anwender stiehlt dem Ziel mit einem Kuss KP. Die Höhe der Heilung beträgt mehr als die Hälfte des beim Ziel angerichteten Schadens." + }, + "craftyShield": { + "name": "Trickschutz", + "effect": "Schützt sich und Mitstreiter mit einer mysteriösen Macht vor Status-Attacken. Es werden jedoch weiterhin KP-Schäden erlitten." + }, + "flowerShield": { + "name": "Floraschutz", + "effect": "Erhöht mit einer mysteriösen Macht die Verteidigung aller am Kampf beteiligten Pflanzen-Pokémon." + }, + "grassyTerrain": { + "name": "Grasfeld", + "effect": "Verwandelt den Untergrund fünf Runden lang in ein Grasfeld und heilt in jeder neuen Runde alle Pokémon, die den Boden berühren." + }, + "mistyTerrain": { + "name": "Nebelfeld", + "effect": "Verwandelt den Untergrund fünf Runden lang in ein Nebelfeld und schützt alle Pokémon, die den Boden berühren, vor Statusproblemen." + }, + "electrify": { + "name": "Elektrifizierung", + "effect": "Kommt die Attacke zum Einsatz, bevor das Ziel seine Attacke ausführt, nimmt diese für die Dauer dieser Runde den Typ Elektro an." + }, + "playRough": { + "name": "Knuddler", + "effect": "Der Anwender knuddelt das Ziel und greift es an. Gelegentlich sinkt dabei auch dessen Angriffs-Wert." + }, + "fairyWind": { + "name": "Feenbrise", + "effect": "Lässt eine Feenbrise aufkommen, die das Ziel erfasst und ihm Schaden zufügt." + }, + "moonblast": { + "name": "Mondgewalt", + "effect": "Der Anwender macht sich die Kraft des Mondes zunutze, um anzugreifen. Gelegentlich wird dabei der Spezial-Angriff des Zieles gesenkt." + }, + "boomburst": { + "name": "Überschallknall", + "effect": "Der Anwender greift alle Pokémon in der Umgebung mit einem gewaltigen Knall an." + }, + "fairyLock": { + "name": "Feenschloss", + "effect": "Der Anwender sperrt alle Pokémon ein und hindert sie damit in der nächsten Runde an der Flucht." + }, + "kingsShield": { + "name": "Königsschild", + "effect": "Der Anwender weicht dem gegnerischen Angriff aus und geht in die Defensive. Berührt ihn nun ein Pokémon, sinkt der Angriffs-Wert dieses Gegners." + }, + "playNice": { + "name": "Kameradschaft", + "effect": "Der Anwender schließt mit dem Ziel Freundschaft und nimmt ihm seine Angriffslust. Der Angriffs-Wert des Zieles sinkt." + }, + "confide": { + "name": "Vertrauenssache", + "effect": "Der Anwender vertraut dem Ziel ein Geheimnis an und stört auf diese Weise seine Konzentration. Der Spezial-Angriff des Zieles sinkt." + }, + "diamondStorm": { + "name": "Diamantsturm", + "effect": "Der Anwender beschwört einen zerstörerischen Diamantsturm herauf. Kann die Verteidigung des Anwenders erhöhen." + }, + "steamEruption": { + "name": "Dampfschwall", + "effect": "Der Anwender feuert einen siedend heißen Dampfschwall auf das Ziel ab. Dieses kann dabei Verbrennungen erleiden." + }, + "hyperspaceHole": { + "name": "Dimensionsloch", + "effect": "Der Anwender positioniert sich mithilfe eines Dimensionslochs direkt neben dem Ziel und durchbricht selbst Schutzschild und Scanner." + }, + "waterShuriken": { + "name": "Wasser-Shuriken", + "effect": "Der Anwender schleudert dem Ziel Wurfsterne aus einem verdickten Sekret entgegen. Eine Serien-Attacke, die zwei- bis fünfmal trifft." + }, + "mysticalFire": { + "name": "Magieflamme", + "effect": "Der Anwender greift das Ziel an, indem er ihm eine besondere, heiße Flamme entgegenbläst. Der Spezial-Angriff des Zieles sinkt." + }, + "spikyShield": { + "name": "Schutzstacheln", + "effect": "Der Anwender weicht gegnerischen Angriffen aus. Gleichzeitig nehmen alle Pokémon, die mit ihm in Berührung kommen, Schaden." + }, + "aromaticMist": { + "name": "Duftwolke", + "effect": "Der Anwender erhöht mithilfe eines mysteriösen Duftes die Spezial-Verteidigung eines Mitstreiters." + }, + "eerieImpulse": { + "name": "Mystowellen", + "effect": "Der Körper des Anwenders erzeugt mysteriöse Wellen und senkt den Spezial-Angriff des Zieles dadurch stark." + }, + "venomDrench": { + "name": "Giftfalle", + "effect": "Anwender bespritzt das Ziel mit einer speziellen Giftflüssigkeit. Senkt den Angriff, den Spezial- Angriff und die Initiative von vergifteten Zielen." + }, + "powder": { + "name": "Pulverschleuder", + "effect": "Setzt das Ziel nach Einsatz von Pulverschleuder in derselben Runde eine Feuer-Attacke ein, kommt es zu einer Explosion, die ihm schadet." + }, + "geomancy": { + "name": "Geokontrolle", + "effect": "Der Anwender saugt in Runde 1 Energie auf. In Runde 2 steigen folgende Statuswerte stark: Spezial-Angriff, Spezial-Verteidigung und Initiative." + }, + "magneticFlux": { + "name": "Magnetregler", + "effect": "Das Magnetfeld wird so manipuliert, dass Spezial- Verteidigung und Verteidigung von Team-Pokémon mit der Fähigkeit Plus oder Minus steigen." + }, + "happyHour": { + "name": "Goldene Zeiten", + "effect": "Nach Einsatz der Attacke Goldene Zeiten verdoppelt sich das Preisgeld, das du im Falle eines Sieges erhältst." + }, + "electricTerrain": { + "name": "Elektrofeld", + "effect": "Verwandelt den Untergrund fünf Runden lang in ein Elektrofeld und hindert alle Pokémon, die den Boden berühren, am Einschlafen." + }, + "dazzlingGleam": { + "name": "Zauberschein", + "effect": "Der Anwender feuert einen mächtigen Lichtblitz ab, der dem Ziel Schaden zufügt." + }, + "celebrate": { + "name": "Ehrentag", + "effect": "Das Pokémon gratuliert dir zu deinem Geburtstag!" + }, + "holdHands": { + "name": "Händchenhalten", + "effect": "Der Anwender und ein Mitstreiter reichen einander die Hände und verfallen in einen Zustand tiefster Zufriedenheit." + }, + "babyDollEyes": { + "name": "Kulleraugen", + "effect": "Der Anwender erobert das Herz des Zieles, indem er es mit Kulleraugen ansieht. Senkt den Angriffs-Wert. Erstschlaggarantie." + }, + "nuzzle": { + "name": "Wangenrubbler", + "effect": "Der Anwender lädt seine Wangen elektrisch auf und greift an, indem er sich damit am Ziel reibt. Das Ziel wird paralysiert." + }, + "holdBack": { + "name": "Zurückhaltung", + "effect": "Der Anwender hält sich beim Angriff zurück und sorgt auf diese Weise dafür, dass dem Ziel danach mindestens 1 KP verbleibt." + }, + "infestation": { + "name": "Plage", + "effect": "Der Anwender fällt vier bis fünf Runden lang wie eine Plage über das Ziel her und greift es an. In diesem Zeitraum kann es nicht fliehen." + }, + "powerUpPunch": { + "name": "Steigerungshieb", + "effect": "Die Fäuste des Anwenders härten durch wiederholtes Zuschlagen ab. Mit jedem Treffer steigt sein Angriffs-Wert." + }, + "oblivionWing": { + "name": "Unheilsschwingen", + "effect": "Der Anwender raubt dem Ziel KP. Die Höhe der Heilung beträgt mehr als die Hälfte des beim Ziel angerichteten Schadens." + }, + "thousandArrows": { + "name": "Tausend Pfeile", + "effect": "Die Attacke erfasst auch schwebende Pokémon. Erfasst sie ein Pokémon im Schwebe-Zustand, fällt es zu Boden." + }, + "thousandWaves": { + "name": "Tausend Wellen", + "effect": "Der Anwender greift mit einer Welle an, die dicht über dem Boden verläuft und alle Pokémon, die sie erfasst, an der Flucht hindert." + }, + "landsWrath": { + "name": "Bodengewalt", + "effect": "Der Anwender sammelt die Kraft des weiten Landes und greift an, indem er sie gebündelt auf das Ziel lenkt." + }, + "lightOfRuin": { + "name": "Lux Calamitatis", + "effect": "Die Attacke basiert auf der Kraft des Ewigblütlers, die als mächtiger Lichtstrahl abgefeuert wird. Der Anwender nimmt dabei selbst großen Schaden." + }, + "originPulse": { + "name": "Ursprungswoge", + "effect": "Der Anwender greift das Ziel mit unzähligen blau leuchtenden Strahlen an." + }, + "precipiceBlades": { + "name": "Abgrundsklinge", + "effect": "Der Anwender wandelt die Kraft des Erdreichs in Klingen um, mit denen er das Ziel angreift." + }, + "dragonAscent": { + "name": "Zenitstürmer", + "effect": "Der Anwender greift das Ziel aus atemberaubender Höhe im Sturzflug an. Senkt Verteidigung und Spezial-Verteidigung des Anwenders." + }, + "hyperspaceFury": { + "name": "Dimensionswahn", + "effect": "Eine Angriffsserie mit vielen Armen, die die Wirkung von Schutzschild und Scanner durchbricht. Dabei sinkt die Verteidigung des Anwenders." + }, + "breakneckBlitzPhysical": { + "name": "Hyper-Sprintangriff", + "effect": "Der durch Z-Kraft energiegeladene Anwender rennt mit ganzer Kraft gegen das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "breakneckBlitzSpecial": { + "name": "Hyper-Sprintangriff", + "effect": "Dummy Data" + }, + "allOutPummelingPhysical": { + "name": "Fulminante Faustschläge", + "effect": "Aus Z-Kraft hergestellte Energiebälle prallen mit voller Wucht auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "allOutPummelingSpecial": { + "name": "Fulminante Faustschläge", + "effect": "Dummy Data" + }, + "supersonicSkystrikePhysical": { + "name": "Finaler Steilflug", + "effect": "Der Anwender schwingt sich durch Z-Kraft in die Lüfte und stürzt sich dann auf das Ziel hinab. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "supersonicSkystrikeSpecial": { + "name": "Finaler Steilflug", + "effect": "Dummy Data" + }, + "acidDownpourPhysical": { + "name": "Vernichtender Säureregen", + "effect": "Der Anwender kreiert mit Z-Kraft ein giftiges Moor, in dem das Ziel versinkt. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "acidDownpourSpecial": { + "name": "Vernichtender Säureregen", + "effect": "Dummy Data" + }, + "tectonicRagePhysical": { + "name": "Seismische Eruption", + "effect": "Der Anwender zerrt das Ziel mit Z-Kraft tief in den Boden und kollidiert dort mit ihm. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "tectonicRageSpecial": { + "name": "Seismische Eruption", + "effect": "Dummy Data" + }, + "continentalCrushPhysical": { + "name": "Apokalyptische Steinpresse", + "effect": "Der Anwender beschwört mit Z-Kraft einen großen Felsen herbei und lässt ihn auf das Ziel fallen. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "continentalCrushSpecial": { + "name": "Apokalyptische Steinpresse", + "effect": "Dummy Data" + }, + "savageSpinOutPhysical": { + "name": "Wirbelnder Insektenhieb", + "effect": "Mithilfe von Z-Kraft umwickelt der Anwender das Ziel mit Fäden. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "savageSpinOutSpecial": { + "name": "Wirbelnder Insektenhieb", + "effect": "Dummy Data" + }, + "neverEndingNightmarePhysical": { + "name": "Ewige Nacht", + "effect": "Der Anwender beschwört mit Z-Kraft tiefen Groll herbei und lässt diesen auf das Ziel los. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "neverEndingNightmareSpecial": { + "name": "Ewige Nacht", + "effect": "Dummy Data" + }, + "corkscrewCrashPhysical": { + "name": "Turbo-Spiralkombo", + "effect": "Der Anwender wirbelt durch Z-Kraft sehr schnell umher und prallt mit dem Ziel zusammen. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "corkscrewCrashSpecial": { + "name": "Turbo-Spiralkombo", + "effect": "Dummy Data" + }, + "infernoOverdrivePhysical": { + "name": "Dynamische Maxiflamme", + "effect": "Der Anwender speit dank Z-Kraft eine gewaltige Kugel aus Flammen auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "infernoOverdriveSpecial": { + "name": "Dynamische Maxiflamme", + "effect": "Dummy Data" + }, + "hydroVortexPhysical": { + "name": "Super-Wassertornado", + "effect": "Der Anwender kreiert mit Z-Kraft einen riesigen Wasserstrudel, der das Ziel verschluckt. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "hydroVortexSpecial": { + "name": "Super-Wassertornado", + "effect": "Dummy Data" + }, + "bloomDoomPhysical": { + "name": "Brillante Blütenpracht", + "effect": "Der Anwender leiht sich durch Z-Kraft die Energie von Wiesenblumen und greift das Ziel damit an. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "bloomDoomSpecial": { + "name": "Brillante Blütenpracht", + "effect": "Dummy Data" + }, + "gigavoltHavocPhysical": { + "name": "Gigavolt-Funkensalve", + "effect": "Der Anwender greift das Ziel mit durch Z-Kraft gesammelter starker Elektrizität an. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "gigavoltHavocSpecial": { + "name": "Gigavolt-Funkensalve", + "effect": "Dummy Data" + }, + "shatteredPsychePhysical": { + "name": "Psycho-Schmetterschlag", + "effect": "Der Anwender kontrolliert das Ziel mit Z-Kraft und macht ihm so das Leben schwer. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "shatteredPsycheSpecial": { + "name": "Psycho-Schmetterschlag", + "effect": "Dummy Data" + }, + "subzeroSlammerPhysical": { + "name": "Tobender Geofrost", + "effect": "Der Anwender senkt mit Z-Kraft die Temperatur drastisch und lässt das Ziel einfrieren. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "subzeroSlammerSpecial": { + "name": "Tobender Geofrost", + "effect": "Dummy Data" + }, + "devastatingDrakePhysical": { + "name": "Drastisches Drachendröhnen", + "effect": "Der Anwender materialisiert durch Z-Kraft seine Aura und greift damit das Ziel an. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "devastatingDrakeSpecial": { + "name": "Drastisches Drachendröhnen", + "effect": "Dummy Data" + }, + "blackHoleEclipsePhysical": { + "name": "Schwarzes Loch des Grauens", + "effect": "Der Anwender sammelt mit Z-Kraft dunkle Energie an, die das Ziel verschlingt. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "blackHoleEclipseSpecial": { + "name": "Black Hole Eclipse", + "effect": "Dummy Data" + }, + "twinkleTacklePhysical": { + "name": "Entzückender Sternenstoß", + "effect": "Der Anwender kreiert mit Z-Kraft eine zauberhafte Dimension und treibt dort sein Spiel mit dem Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." + }, + "twinkleTackleSpecial": { + "name": "Twinkle Tackle", + "effect": "Dummy Data" + }, + "catastropika": { + "name": "Perfektes Pika-Projektil", + "effect": "Pikachu umhüllt sich durch Z-Kraft mit gewaltiger elektrischer Energie und stürzt sich mit voller Kraft auf das Ziel." + }, + "shoreUp": { + "name": "Sandsammler", + "effect": "KP des Anwenders werden um 50 % der maximalen KP aufgefüllt. Tobt ein Sandsturm, werden noch mehr KP aufgefüllt." + }, + "firstImpression": { + "name": "Überrumpler", + "effect": "Eine sehr starke Attacke, die jedoch nur erfolgreich ist, wenn sie sofort eingesetzt wird, nachdem der Anwender das Kampffeld betreten hat." + }, + "banefulBunker": { + "name": "Bunker", + "effect": "Der Anwender wird vor Angriffen geschützt. Gleichzeitig werden alle Pokémon, die mit ihm in Berührung kommen, vergiftet." + }, + "spiritShackle": { + "name": "Schattenfessel", + "effect": "Der Anwender greift das Ziel an und näht zugleich dessen Schatten am Boden fest, sodass es nicht entkommen kann." + }, + "darkestLariat": { + "name": "Dark Lariat", + "effect": "Der Anwender wirbelt mit beiden Armen und prallt so auf das Ziel. Richtet unabhängig von den Statusveränderungen des Zieles Schaden an." + }, + "sparklingAria": { + "name": "Schaumserenade", + "effect": "Durch Gesang erzeugte Blasen werden auf das Ziel geschleudert. Alle Pokémon, die dadurch Schaden erleiden, werden auch von Verbrennungen geheilt." + }, + "iceHammer": { + "name": "Eishammer", + "effect": "Anwender trifft mit einem starken Hieb. Senkt Initiative des Anwenders." + }, + "floralHealing": { + "name": "Florakur", + "effect": "KP des Zieles werden um 50 % der maximalen KP aufgefüllt. Die Wirkung steigt, wenn der Untergrund in ein Grasfeld verwandelt wurde." + }, + "highHorsepower": { + "name": "Pferdestärke", + "effect": "Der Anwender greift das Ziel mit einer heftigen Ganzkörper-Attacke an." + }, + "strengthSap": { + "name": "Kraftabsorber", + "effect": "Ein Angriff, der die KP des Anwenders um die Höhe des Angriffs-Werts des Zieles heilt. Anschließend wird der Angriff des Zieles gesenkt." + }, + "solarBlade": { + "name": "Solarklinge", + "effect": "Der Anwender absorbiert in der 1. Runde Licht, das er in der 2. Runde zu einem Schwert formt, mit dem er angreift." + }, + "leafage": { + "name": "Blattwerk", + "effect": "Der Anwender greift das Ziel mit Blättern an." + }, + "spotlight": { + "name": "Rampenlicht", + "effect": "Der Anwender lenkt die Aufmerksamkeit auf das Ziel, sodass in dieser Runde nur noch dieses Pokémon angegriffen wird." + }, + "toxicThread": { + "name": "Giftfaden", + "effect": "Der Anwender schießt giftige Fäden auf das Ziel, das dadurch vergiftet wird. Außerdem sinkt seine Initiative." + }, + "laserFocus": { + "name": "Konzentration", + "effect": "Der Anwender konzentriert sich, wodurch sein nächster Angriff garantiert ein Volltreffer wird." + }, + "gearUp": { + "name": "Hilfsmechanik", + "effect": "Der Anwender erhöht mithilfe von Zahnrädern Angriff und Spezial-Angriff von Team-Pokémon mit der Fähigkeit Plus oder Minus." + }, + "throatChop": { + "name": "Neck Strike", + "effect": "Das Pokémon, das von dieser Attacke getroffen wird, erleidet starke Schmerzen und kann deswegen zwei Runden lang keine Lärm-Attacken mehr einsetzen." + }, + "pollenPuff": { + "name": "Pollenknödel", + "effect": "Der Anwender greift mit einem Ball aus Pollen an, der beim Ziel explodiert. Mitstreiter werden von einem Ball getroffen, der ihre KP auffüllt." + }, + "anchorShot": { + "name": "Ankerschuss", + "effect": "Der Anwender greift das Ziel an, indem er es mit einer Ankerkette umwickelt. Dadurch wird das Ziel an der Flucht gehindert." + }, + "psychicTerrain": { + "name": "Psychofeld", + "effect": "Verhindert für fünf Runden, dass Pokémon am Boden von Attacken mit hoher Erstschlagquote getroffen werden. Erhöht die Stärke von Psycho-Attacken." + }, + "lunge": { + "name": "Anfallen", + "effect": "Der Anwender greift das Ziel mit ganzer Kraft an, wodurch auch der Angriffs-Wert des Zieles sinkt." + }, + "fireLash": { + "name": "Feuerpeitsche", + "effect": "Der Anwender greift das Ziel mit einer brennenden Peitsche an und senkt dabei zusätzlich dessen Verteidigungs-Wert." + }, + "powerTrip": { + "name": "Überheblichkeit", + "effect": "Der Anwender prahlt mit seiner Stärke und greift das Ziel an. Dieser Angriff ist umso stärker, je weiter die Statuswerte des Anwenders erhöht sind." + }, + "burnUp": { + "name": "Ausbrennen", + "effect": "Der Anwender nutzt das gesamte Feuer in seinem Körper, um großen Schaden auszuteilen. Die restliche Kampfdauer gehört er nicht mehr dem Typ Feuer an." + }, + "speedSwap": { + "name": "Initiativetausch", + "effect": "Der Anwender tauscht seinen Initiative-Wert mit dem des Zieles." + }, + "smartStrike": { + "name": "Schmalhorn", + "effect": "Der Anwender durchbohrt das Ziel mit seinem spitzen Horn. Diese Attacke trifft immer." + }, + "purify": { + "name": "Läuterung", + "effect": "Der Anwender heilt das Statusproblem des Zieles und füllt dadurch seine eigenen KP auf." + }, + "revelationDance": { + "name": "Wecktanz", + "effect": "Der Anwender tanzt und greift dabei das Ziel mit voller Kraft an. Die Attacke hat denselben Typ wie das Pokémon, das sie einsetzt." + }, + "coreEnforcer": { + "name": "Sanktionskern", + "effect": "Hat das Pokémon, das durch diese Attacke Schaden genommen hat, in dieser Runde bereits gehandelt, verliert es seine Fähigkeit." + }, + "tropKick": { + "name": "Tropenkick", + "effect": "Der Anwender greift den Gegner mit einem heftigen Tritt tropischer Herkunft an. Dabei sinkt auch der Angriffs-Wert des Gegners." + }, + "instruct": { + "name": "Kommando", + "effect": "Der Anwender befiehlt dem Ziel, dessen zuletzt ausgeführte Attacke sofort wieder einzusetzen." + }, + "beakBlast": { + "name": "Schnabelkanone", + "effect": "Der Anwender erhitzt zuerst seinen Schnabel und greift dann an. Pokémon, die ihn während des Erhitzens berühren, erleiden Verbrennungen." + }, + "clangingScales": { + "name": "Schuppenrasseln", + "effect": "Der Anwender erzeugt durch das Rasseln mit seinen Schuppen ein lautes Geräusch und greift an. Anschließend sinkt seine Verteidigung." + }, + "dragonHammer": { + "name": "Drachenhammer", + "effect": "Der Anwender nutzt seinen Körper wie einen Hammer und stürzt sich auf das Ziel, wodurch dieses Schaden erleidet." + }, + "brutalSwing": { + "name": "Wirbler", + "effect": "Der Anwender dreht schwungvoll seinen Körper und fügt den Pokémon in seiner Nähe dabei Schaden zu." + }, + "auroraVeil": { + "name": "Auroraschleier", + "effect": "Diese Attacke schwächt fünf Runden lang den durch physische sowie durch Spezial-Attacken erhaltenen Schaden. Kann nur bei Hagel eingesetzt werden." + }, + "sinisterArrowRaid": { + "name": "Schatten-Pfeilregen", + "effect": "Silvarro stellt mit Z-Kraft unzählige Pfeile her und lässt diese auf das Ziel niederprasseln." + }, + "maliciousMoonsault": { + "name": "Hyper Dark Crusher", + "effect": "Mit seinem durch Z-Kraft gestählten Körper stürzt sich Fuegro mit ganzer Kraft auf das Ziel." + }, + "oceanicOperetta": { + "name": "Grandiose Meeressymphonie", + "effect": "Primarene ruft mit Z-Kraft große Mengen an Wasser herbei und greift damit das Ziel an." + }, + "guardianOfAlola": { + "name": "Alolas Wächter", + "effect": "Ein gewaltiger Angriff des Schutzpatrons, der durch Z-Kraft die Kraft Alolas erlangt hat. Reduziert die verbleibenden KP des Zieles stark." + }, + "soulStealing7StarStrike": { + "name": "Sternbild des Seelenraubes", + "effect": "Marshadow schlägt mit durch Z-Kraft gestärkten Schlägen und Tritten in einer Serien-Attacke auf das Ziel ein." + }, + "stokedSparksurfer": { + "name": "Blitz-Wellenritt", + "effect": "Das Alola-Raichu greift das Ziel mithilfe von Z-Kraft mit voller Wucht an und paralysiert es." + }, + "pulverizingPancake": { + "name": "Schluss mit lustig", + "effect": "Relaxo wird von Z-Kraft erfüllt und macht Ernst. Es bringt seinen riesigen Körper in Schwung und stürzt sich mit ganzer Kraft auf das Ziel." + }, + "extremeEvoboost": { + "name": "Macht der Neun", + "effect": "Evoli macht sich durch Z-Kraft die Stärke seiner Weiterentwicklungen zunutze und erhöht seine Statuswerte stark." + }, + "genesisSupernova": { + "name": "Supernova des Ursprungs", + "effect": "Mew greift das Ziel mithilfe von Z-Kraft mit voller Wucht an. Der Untergrund wird dabei in ein Psychofeld verwandelt." + }, + "shellTrap": { + "name": "Panzerfalle", + "effect": "Der Anwender legt eine Panzerfalle. Wird er von einer physischen Attacke getroffen, explodiert die Falle und fügt dem Angreifer Schaden zu." + }, + "fleurCannon": { + "name": "Kanonenbouquet", + "effect": "Der Anwender greift das Ziel mit einem gewaltigen Strahl an. Sein eigener Spezial-Angriff sinkt dadurch stark." + }, + "psychicFangs": { + "name": "Psychobeißer", + "effect": "Der Anwender beißt das Ziel mithilfe von Psycho-Kräften. Die Attacke durchbricht auch Barrieren wie Lichtschild und Reflektor." + }, + "stompingTantrum": { + "name": "Fruststampfer", + "effect": "Von Frust getrieben greift der Anwender an. Wenn seine vorige Attacke fehlgeschlagen ist, verdoppelt sich die Stärke der Attacke." + }, + "shadowBone": { + "name": "Schattenknochen", + "effect": "Der Anwender greift das Ziel mit einem Knochen an, in dem eine Seele haust. Senkt eventuell die Verteidigung des Zieles." + }, + "accelerock": { + "name": "Turbofelsen", + "effect": "Der Anwender prallt mit großer Geschwindigkeit auf das Ziel. Hohe Erstschlagquote." + }, + "liquidation": { + "name": "Aquadurchstoß", + "effect": "Der Anwender greift das Ziel mit der Kraft des Wassers an. Senkt eventuell die Verteidigung des Zieles." + }, + "prismaticLaser": { + "name": "Prisma-Laser", + "effect": "Der Anwender feuert mithilfe von Prisma-Kraft mächtige Lichtstrahlen ab. In der nächsten Runde kann er nicht handeln." + }, + "spectralThief": { + "name": "Diebesschatten", + "effect": "Der Anwender schleicht sich in den Schatten des Zieles, stiehlt dessen erhöhte Statuswerte und fügt ihm Schaden zu." + }, + "sunsteelStrike": { + "name": "Stahlgestirn", + "effect": "Der Anwender stürzt mit der Gewalt eines Meteors auf das Ziel. Die Fähigkeit des Zieles wird dabei ignoriert." + }, + "moongeistBeam": { + "name": "Schattenstrahl", + "effect": "Der Anwender greift mit einem unheimlichen Lichtstrahl an. Diese Attacke ignoriert die Fähigkeit des Zieles." + }, + "tearfulLook": { + "name": "Tränendrüse", + "effect": "Dem Anwender stehen Tränen in den Augen, wodurch das Ziel seinen Kampfeswillen verliert. Angriff und Spezial-Angriff des Zieles sinken." + }, + "zingZap": { + "name": "Elektropikser", + "effect": "Der Anwender rammt das Ziel und schockt es mit starkem Strom. Das Ziel schreckt eventuell zurück." + }, + "naturesMadness": { + "name": "Naturzorn", + "effect": "Das Ziel wird vom Zorn der Natur getroffen und verliert dadurch die Hälfte seiner KP." + }, + "multiAttack": { + "name": "Multi-Angriff", + "effect": "Der Anwender sammelt eine große Menge Energie und greift das Ziel damit an. Der Typ der Attacke hängt von dem der Disc ab." + }, + "tenMillionVoltThunderbolt": { + "name": "Tausendfacher Donnerblitz", + "effect": "Das eine Kappe tragende Pikachu greift das Ziel mit einem durch Z-Kraft verstärkten Elektroschock an. Hohe Volltrefferquote." + }, + "mindBlown": { + "name": "Knallkopf", + "effect": "Der Anwender greift alle Pokémon in der Umgebung an, indem er seinen Kopf explodieren lässt. Dabei verletzt er sich auch selbst." + }, + "plasmaFists": { + "name": "Plasmafäuste", + "effect": "Ein Angriff mit elektrisch geladenen Fäusten, der bewirkt, dass Normal-Attacken den Typ Elektro annehmen." + }, + "photonGeyser": { + "name": "Photonen-Geysir", + "effect": "Ein Angriff mit einer Lichtsäule. Ist der Angriff höher als der Spezial-Angriff, wird die Höhe des Schadens durch den Angriff bestimmt und umgekehrt." + }, + "lightThatBurnsTheSky": { + "name": "Licht des Erlöschens", + "effect": "Ist der Angriff höher als der Spezial-Angriff, wird die Höhe des Schadens durch den Angriff bestimmt und umgekehrt. Ignoriert die Fähigkeit des Zieles." + }, + "searingSunrazeSmash": { + "name": "Schmetternde Sonnenwalze", + "effect": "Solgaleo greift das Ziel mithilfe von Z-Kraft mit voller Wucht an. Ignoriert die Fähigkeit des Zieles." + }, + "menacingMoonrazeMaelstrom": { + "name": "Geballter Mondlaser", + "effect": "Lunala greift das Ziel mithilfe von Z-Kraft mit voller Wucht an. Ignoriert die Fähigkeit des Zieles." + }, + "letsSnuggleForever": { + "name": "Herzliche Knuddelkloppe", + "effect": "Mimigma greift das Ziel mithilfe von Z-Kraft mit voller Wucht und viel Liebe an." + }, + "splinteredStormshards": { + "name": "Fataler Steinregen", + "effect": "Wolwerock greift das Ziel mithilfe von Z-Kraft mit voller Wucht an. Herrschen besondere Feldeffekte, werden diese zusätzlich neutralisiert." + }, + "clangorousSoulblaze": { + "name": "Rasselnder Seelentanz", + "effect": "Grandiras greift Gegner mithilfe von Z-Kraft mit voller Wucht an. Zusätzlich werden seine Statuswerte erhöht." + }, + "zippyZap": { + "name": "Britzelturbo", + "effect": "Ein stürmischer Blitz-Angriff mit garantierter Erstschlag- und Volltrefferquote.\n" + }, + "splishySplash": { + "name": "Plätschersurfer", + "effect": "Pikachu greift das Ziel mit einer großen, elektrisch aufgeladenen Welle an. Das Ziel wird eventuell paralysiert." + }, + "floatyFall": { + "name": "Schwebesturz", + "effect": "Pikachu schwebt nach oben und stürzt dann unvermittelt auf das Ziel herab. Das Ziel schreckt eventuell zurück." + }, + "pikaPapow": { + "name": "Pika-Flash", + "effect": "Je größer Pikachus Vertrauen zu seinem Trainer ist, desto stärker fällt dieser Angriff aus. Diese Attacke trifft immer." + }, + "bouncyBubble": { + "name": "Blubbsauger", + "effect": "Der Anwender greift mit Wasserblasen an. Seine KP werden in Höhe des vom Wasser angerichteten Schadens geheilt." + }, + "buzzyBuzz": { + "name": "Knisterladung", + "effect": "Evoli greift das Ziel mit Elektrizität an, wodurch dieses paralysiert wird." + }, + "sizzlySlide": { + "name": "Flackerbrand", + "effect": "Evoli hüllt sich in Flammen und stürzt sich beherzt auf das Ziel, welches dadurch Verbrennungen erleidet." + }, + "glitzyGlow": { + "name": "Pulsieraura", + "effect": "Evoli greift das Ziel gnadenlos mit telekinetischer Energie an. Dabei wird eine geheimnisvolle Wand erzeugt, die Spezial-Attacken des Ziels abschwächt." + }, + "baddyBad": { + "name": "Quälzone", + "effect": "Evoli zeigt sich von seiner dunklen Seite und greift an. Dabei wird eine geheimnisvolle Wand erzeugt, die physische Attacken des Ziels abschwächt." + }, + "sappySeed": { + "name": "Sprießbomben", + "effect": "Evoli lässt eine riesige Ranke wachsen, von der Samen herabfallen, die dem Ziel schaden und ihm in jeder Runde KP absaugen." + }, + "freezyFrost": { + "name": "Klirrfrost", + "effect": "Evoli greift mit einem schwarzen Kristall aus gefrorenem Nebel an. Die Statusveränderungen aller am Kampf beteiligten Pokémon werden zurückgesetzt." + }, + "sparklySwirl": { + "name": "Glitzersturm", + "effect": "Evoli greift an, indem es das Ziel in einen nahezu erstickend wohlriechenden Wirbelwind hüllt. Das Team des Anwenders wird von Statusproblemen geheilt." + }, + "veeveeVolley": { + "name": "Evo-Crash", + "effect": "Je größer Evolis Vertrauen zu seinem Trainer ist, desto stärker fällt dieser Angriff aus. Diese Attacke trifft immer." + }, + "doubleIronBash": { + "name": "Panzerfäuste", + "effect": "Der Anwender rotiert um die Schraubenmutter in seinem Brustkorb und schlägt zweimal hintereinander mit den Armen zu. Das Ziel schreckt eventuell zurück." + }, + "maxGuard": { + "name": "Dyna-Wall", + "effect": "Anwender wehrt jede Attacke ab. Scheitert eventuell bei Wiederholung." + }, + "dynamaxCannon": { + "name": "Dynamax-Kanone", + "effect": "Der Anwender schießt einen Strahl aus seinem Kern ab. Verursacht bis zu doppelt so viel Schaden, wenn das Level des Gegners höher als die Levelgrenze ist." + }, + "snipeShot": { + "name": "Präzisionsschuss", + "effect": "Die Attacke richtet sich gegen das ausgewählte Ziel, unabhängig von Fähigkeiten oder Attacken, die Angriffe auf sich ziehen." + }, + "jawLock": { + "name": "Fesselbiss", + "effect": "Anwender und Ziel können nicht ausgetauscht werden, bis einer von ihnen kampfunfähig wird. Der Effekt endet, wenn eines der Pokémon das Kampffeld verlässt." + }, + "stuffCheeks": { + "name": "Backenstopfer", + "effect": "Der Anwender frisst die Beere, die er trägt, wodurch seine Verteidigung stark erhöht wird." + }, + "noRetreat": { + "name": "Finalformation", + "effect": "Alle Statuswerte des Anwenders werden erhöht, aber dafür kann er weder ausgewechselt werden noch fliehen." + }, + "tarShot": { + "name": "Teerschuss", + "effect": "Der Anwender übergießt das Ziel mit klebrigem Teer und senkt so dessen Initiative. Dadurch wird es schwach gegenüber Feuer-Attacken." + }, + "magicPowder": { + "name": "Magiepuder", + "effect": "Das Ziel wird mit magischem Puder bestreut und nimmt den Typ Psycho an." + }, + "dragonDarts": { + "name": "Drachenpfeile", + "effect": "Der Anwender greift zweimal mit Grolldra an. Bei zwei Zielen werden beide jeweils einmal angegriffen." + }, + "teatime": { + "name": "Teatime", + "effect": "Der Anwender lädt alle am Kampf beteiligten Pokémon zu einem Teekränzchen ein, woraufhin diese die Beeren essen, die sie bei sich tragen." + }, + "octolock": { + "name": "Octoklammer", + "effect": "Das Ziel wird an der Flucht gehindert und seine Verteidigung und Spezial-Verteidigung sinken jede Runde." + }, + "boltBeak": { + "name": "Schockschnabel", + "effect": "Der Anwender sticht mit einem elektrisch aufgeladenen Schnabel zu. Kommt er vor dem Ziel zum Zug, verdoppelt sich die Stärke der Attacke." + }, + "fishiousRend": { + "name": "Kiemenbiss", + "effect": "Der Anwender beißt mit seinen harten Kiemen zu. Kommt er vor dem Ziel zum Zug, verdoppelt sich die Stärke der Attacke." + }, + "courtChange": { + "name": "Seitenwechsel", + "effect": "Durch eine mysteriöse Macht werden wirksame Effekte auf Mitstreiterseite und gegnerischer Seite getauscht." + }, + "maxFlare": { + "name": "Dyna-Brand", + "effect": "Eine Feuer-Attacke, die nur Dynamax-Pokémon einsetzen können. Die Sonne brennt unbarmherzig fünf Runden lang." + }, + "maxFlutterby": { + "name": "Dyna-Schwarm", + "effect": "Eine Käfer-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt den Spezial-Angriff des Zieles." + }, + "maxLightning": { + "name": "Dyna-Gewitter", + "effect": "Eine Elektro-Attacke, die nur Dynamax-Pokémon einsetzen können. Erzeugt fünf Runden lang ein Elektrofeld." + }, + "maxStrike": { + "name": "Dyna-Angriff", + "effect": "Eine Normal-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt die Initiative des Zieles." + }, + "maxKnuckle": { + "name": "Dyna-Faust", + "effect": "Eine Kampf-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht den Angriff der Mitstreiterseite." + }, + "maxPhantasm": { + "name": "Dyna-Spuk", + "effect": "Eine Geister-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt die Verteidigung des Zieles." + }, + "maxHailstorm": { + "name": "Dyna-Frost", + "effect": "Eine Eis-Attacke, die nur Dynamax-Pokémon einsetzen können. Lässt fünf Runden lang einen Hagelsturm toben." + }, + "maxOoze": { + "name": "Dyna-Giftschwall", + "effect": "Eine Gift-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht den Spezial-Angriff der Mitstreiterseite." + }, + "maxGeyser": { + "name": "Dyna-Flut", + "effect": "Eine Wasser-Attacke, die nur Dynamax-Pokémon einsetzen können. Löst fünf Runden lang strömenden Regen aus." + }, + "maxAirstream": { + "name": "Dyna-Düse", + "effect": "Eine Flug-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht die Initiative der Mitstreiterseite." + }, + "maxStarfall": { + "name": "Dyna-Zauber", + "effect": "Eine Feen-Attacke, die nur Dynamax-Pokémon einsetzen können. Erzeugt fünf Runden lang ein Nebelfeld." + }, + "maxWyrmwind": { + "name": "Dyna-Wyrm", + "effect": "Eine Drachen-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt den Angriff des Zieles." + }, + "maxMindstorm": { + "name": "Dyna-Kinese", + "effect": "Eine Psycho-Attacke, die nur Dynamax-Pokémon einsetzen können. Erzeugt fünf Runden lang ein Psychofeld." + }, + "maxRockfall": { + "name": "Dyna-Brocken", + "effect": "Eine Gesteins-Attacke, die nur Dynamax-Pokémon einsetzen können. Lässt fünf Runden lang einen Sandsturm toben." + }, + "maxQuake": { + "name": "Dyna-Erdstoß", + "effect": "Eine Boden-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht die Spezial-Verteidigung der Mitstreiterseite." + }, + "maxDarkness": { + "name": "Dyna-Dunkel", + "effect": "Eine Unlicht-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt die Spezial-Verteidigung des Zieles." + }, + "maxOvergrowth": { + "name": "Dyna-Flora", + "effect": "Eine Pflanzen-Attacke, die nur Dynamax-Pokémon einsetzen können. Erzeugt fünf Runden lang ein Grasfeld." + }, + "maxSteelspike": { + "name": "Dyna-Stahlzacken", + "effect": "Eine Stahl-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht die Verteidigung der Mitstreiterseite." + }, + "clangorousSoul": { + "name": "Seelentanz", + "effect": "Der Anwender setzt eine kleine Menge an KP ein, um alle seine Statuswerte zu erhöhen." + }, + "bodyPress": { + "name": "Body Press", + "effect": "Der Anwender greift mit seinem ganzen Körper an. Je höher seine Verteidigung ist, desto mehr Schaden richtet er an." + }, + "decorate": { + "name": "Verzierung", + "effect": "Durch Verzierungen werden der Angriff und Spezial-Angriff des Zieles stark erhöht." + }, + "drumBeating": { + "name": "Trommelschläge", + "effect": "Der Anwender kontrolliert durch Trommeln Wurzeln, die das Ziel angreifen und dessen Initiative senken." + }, + "snapTrap": { + "name": "Fangeisen", + "effect": "Das Ziel wird vier bis fünf Runden lang in einem Fangeisen festgehalten und angegriffen." + }, + "pyroBall": { + "name": "Feuerball", + "effect": "Der Anwender greift mit einem Ball aus Feuer an, den er durch Anzünden eines kleinen Steins erzeugt. Fügt dem Ziel eventuell Verbrennungen zu." + }, + "behemothBlade": { + "name": "Gigantenhieb", + "effect": "Der Anwender wird zu einem riesigen Schwert und greift das Ziel an. Dynamaximierte Ziele erleiden doppelten Schaden." + }, + "behemothBash": { + "name": "Gigantenstoß", + "effect": "Der Anwender wird zu einem riesigen Schild und greift das Ziel an. Dynamaximierte Ziele erleiden doppelten Schaden." + }, + "auraWheel": { + "name": "Aura-Rad", + "effect": "Mithilfe der in den Backentaschen gespeicherten Energie greift der Anwender an und erhöht seine Initiative. Der Typ der Attacke hängt von Morpekos Form ab." + }, + "breakingSwipe": { + "name": "Breitseite", + "effect": "Der Anwender schwingt heftig seinen robusten Schweif, um damit gegnerische Pokémon anzugreifen und ihren Angriffs-Wert zu senken." + }, + "branchPoke": { + "name": "Zweigstoß", + "effect": "Der Anwender attackiert das Ziel mit einem spitzen Zweig." + }, + "overdrive": { + "name": "Overdrive", + "effect": "Der Anwender haut in die Saiten seiner Gitarre oder seines Basses und erzeugt dröhnende, kraftvolle Vibrationen, die gegnerischen Pokémon schaden." + }, + "appleAcid": { + "name": "Apfelsäure", + "effect": "Der Anwender greift mit einer aus einem sauren Apfel hergestellten säurehaltigen Flüssigkeit an. Dabei wird die Spezial-Verteidigung des Zieles gesenkt." + }, + "gravApple": { + "name": "Gravitation", + "effect": "Ein Apfel fällt aus großer Höhe herab und richtet Schaden an. Dabei wird die Verteidigung des Zieles gesenkt." + }, + "spiritBreak": { + "name": "Seelenbruch", + "effect": "Die Attacke trifft das Ziel mit so viel Wucht, dass es den Mut verliert. Dabei wird sein Spezial-Angriff gesenkt." + }, + "strangeSteam": { + "name": "Wunderdampf", + "effect": "Der Anwender stößt Dampf aus, mit dem er das Ziel angreift. Dieses wird eventuell verwirrt." + }, + "lifeDew": { + "name": "Lebenstropfen", + "effect": "Wundersames Wasser heilt die KP des Anwenders und seiner am Kampf beteiligten Mitstreiter." + }, + "obstruct": { + "name": "Abblocker", + "effect": "Der Anwender wehrt jede Attacke ab. Berührt ihn währenddessen ein Pokémon, sinkt dessen Verteidigung stark. Scheitert eventuell bei Wiederholung." + }, + "falseSurrender": { + "name": "Kniefalltrick", + "effect": "Der Anwender tut so, als würde er sich verneigen, und sticht dann mit seinem zerzausten Fell zu. Diese Attacke trifft immer." + }, + "meteorAssault": { + "name": "Sternensturm", + "effect": "Der Anwender greift mit seiner Lauchstange an. Von der Wucht der Attacke wird ihm jedoch so schwindelig, dass er in der nächsten Runde nicht handeln kann." + }, + "eternabeam": { + "name": "Unendynastrahlen", + "effect": "Der mächtigste Angriff, über den Endynalos in seiner ursprünglichen Form verfügt. In der nächsten Runde kann der Anwender nicht handeln." + }, + "steelBeam": { + "name": "Stahlstrahl", + "effect": "Der Anwender schießt Stahl, den er in seinem ganzen Körper angesammelt hat, in Form eines mächtigen Strahls ab. Dabei verletzt er sich auch selbst." + }, + "expandingForce": { + "name": "Flächenmacht", + "effect": "Der Anwender greift das Ziel mit Psycho-Kräften an. Wenn ein Psychofeld aktiv ist, steigt die Stärke und es wird allen gegnerischen Pokémon Schaden zugefügt." + }, + "steelRoller": { + "name": "Eisenwalze", + "effect": "Der Anwender greift an und zerstört dabei etwaige Felder. Ist kein Feld aktiv, schlägt die Attacke fehl." + }, + "scaleShot": { + "name": "Schuppenschuss", + "effect": "Der Anwender greift das Ziel zwei- bis fünfmal hintereinander mit Schuppen-Geschossen an. Erhöht die eigene Initiative, aber senkt die Verteidigung." + }, + "meteorBeam": { + "name": "Meteorstrahl", + "effect": "Der Anwender sammelt in Runde 1 kosmische Kräfte und erhöht damit seinen Spezial-Angriff, bevor er in Runde 2 das Ziel angreift." + }, + "shellSideArm": { + "name": "Muschelwaffe", + "effect": "Je nachdem, was höher ausfällt, richtet diese Attacke entweder physischen oder Spezial-Schaden an. Das Ziel wird eventuell vergiftet." + }, + "mistyExplosion": { + "name": "Nebelexplosion", + "effect": "Der Anwender greift alle Pokémon im Umkreis an und wird danach kampfunfähig. Die Stärke dieser Attacke steigt, wenn ein Nebelfeld aktiv ist." + }, + "grassyGlide": { + "name": "Grasrutsche", + "effect": "Der Anwender rutscht über den Boden und greift das Ziel an. Ermöglicht den Erstschlag, wenn ein Grasfeld aktiv ist." + }, + "risingVoltage": { + "name": "Hochspannung", + "effect": "Der Anwender greift mit aus dem Boden aufsteigender Elektrizität an. Die Stärke der Attacke wird verdoppelt, wenn beim Gegner ein Elektrofeld aktiv ist." + }, + "terrainPulse": { + "name": "Feldimpuls", + "effect": "Der Anwender nutzt die Kraft des aktiven Feldes für seinen Angriff. Der Typ und die Stärke der Attacke ändern sich je nach Art des aktiven Feldes." + }, + "skitterSmack": { + "name": "Krabbelkracher", + "effect": "Der Anwender kriecht hinter das Ziel, greift es an und senkt dabei dessen Spezial-Angriff." + }, + "burningJealousy": { + "name": "Neidflammen", + "effect": "Der Anwender greift mit der Energie seines Neids an und fügt allen gegnerischen Pokémon, deren Statuswerte in dieser Runde erhöht wurden, Verbrennungen zu." + }, + "lashOut": { + "name": "Frustventil", + "effect": "Der Anwender entlädt seinen Frust in einem Angriff. Die Stärke der Attacke wird verdoppelt, wenn seine Statuswerte in dieser Runde gesenkt wurden." + }, + "poltergeist": { + "name": "Poltergeist", + "effect": "Der Anwender greift das Ziel mit dessen getragenem Item an. Die Attacke schlägt fehl, wenn das Ziel kein Item trägt." + }, + "corrosiveGas": { + "name": "Korrosionsgas", + "effect": "Der Anwender greift alle Pokémon im Umkreis mit einem ätzenden Gas an. Getragene Items werden dadurch zersetzt." + }, + "coaching": { + "name": "Coaching", + "effect": "Der Anwender sorgt durch geschickte Anweisungen dafür, dass der Angriff und die Verteidigung seiner Mitstreiter steigen." + }, + "flipTurn": { + "name": "Rollwende", + "effect": "Nach der Attacke eilt der Anwender zurück und tauscht den Platz mit einem anderen Pokémon." + }, + "tripleAxel": { + "name": "Dreifach-Axel", + "effect": "Tritt das Ziel ein- bis dreimal nacheinander. Die Härte der Tritte nimmt von Treffer zu Treffer zu." + }, + "dualWingbeat": { + "name": "Doppelflügel", + "effect": "Der Anwender trifft das Ziel zweimal hintereinander mit seinen Flügeln und fügt ihm so Schaden zu." + }, + "scorchingSands": { + "name": "Brandsand", + "effect": "Der Anwender greift das Ziel mit brennend heißem Sand an und fügt ihm eventuell Verbrennungen zu." + }, + "jungleHealing": { + "name": "Dschungelheilung", + "effect": "Der Anwender wird eins mit dem Dschungel und heilt bei sich und seinen am Kampf beteiligten Mitstreitern KP und hebt jegliche Statusprobleme auf." + }, + "wickedBlow": { + "name": "Finstertreffer", + "effect": "Der Anwender hat den Stil des Unlichts gemeistert und führt einen fokussierten, harten Schlag mit Volltreffergarantie aus." + }, + "surgingStrikes": { + "name": "Trefferschwall", + "effect": "Der Anwender hat den Stil des Wassers gemeistert und führt mit fließenden Bewegungen drei Angriffe in Folge mit Volltreffergarantie aus." + }, + "thunderCage": { + "name": "Blitzgefängnis", + "effect": "Das Ziel wird für vier bis fünf Runden in einem elektrischen Käfig gefangen." + }, + "dragonEnergy": { + "name": "Drachenkräfte", + "effect": "Der Anwender wandelt seine Lebenskraft in Energie um und greift gegnerische Pokémon an. Je höher seine KP sind, desto mehr Schaden wird angerichtet." + }, + "freezingGlare": { + "name": "Eisiger Blick", + "effect": "Der Anwender greift das Ziel mit Psycho-Kräften an, die er aus seinen Augen abschießt. Das Ziel friert eventuell ein." + }, + "fieryWrath": { + "name": "Brennender Zorn", + "effect": "Der Anwender wandelt seinen Zorn in eine flammende Aura um und greift damit gegnerische Pokémon an. Diese schrecken eventuell zurück." + }, + "thunderousKick": { + "name": "Donnernder Tritt", + "effect": "Der Anwender bringt das Ziel mit blitzschnellen Bewegungen durcheinander und tritt dann zu. Senkt die Verteidigung des Zieles." + }, + "glacialLance": { + "name": "Blizzardlanze", + "effect": "Der Anwender wirft eine in einen Blizzard gehüllte Lanze aus Eis auf gegnerische Pokémon." + }, + "astralBarrage": { + "name": "Astralfragmente", + "effect": "Der Anwender greift gegnerische Pokémon mit vielen kleinen Spukgestalten an." + }, + "eerieSpell": { + "name": "Schauderspruch", + "effect": "Der Anwender greift mit gewaltigen Psycho-Kräften an. Die AP der letzten Attacke des Zieles werden um 3 Punkte gesenkt." + }, + "direClaw": { + "name": "Unheilsklauen", + "effect": "Der Anwender greift mit zerstörerischen Klauen an. Das Ziel wird eventuell vergiftet, paralysiert oder in Schlaf versetzt." + }, + "psyshieldBash": { + "name": "Barrierenstoß", + "effect": "Der Anwender hüllt sich in Psycho-Energie und rammt das Ziel. Außerdem steigt seine Verteidigung." + }, + "powerShift": { + "name": "Kraftwechsel", + "effect": "Der Anwender tauscht seinen Angriff mit seiner Verteidigung." + }, + "stoneAxe": { + "name": "Felsaxt", + "effect": "Der Anwender greift mit seinen Felsäxten an. Dadurch verstreut er schwebende Felssplitter im Umkreis des Zieles." + }, + "springtideStorm": { + "name": "Frühlingsorkan", + "effect": "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen voller Hassliebe umgibt. Eventuell sinkt ihr Angriff." + }, + "mysticalPower": { + "name": "Mythenkraft", + "effect": "Der Anwender greift mit einer wundersamen Kraft an. Außerdem steigt sein Spezial-Angriff." + }, + "ragingFury": { + "name": "Flammenwut", + "effect": "Der Anwender wütet zwei bis drei Runden lang und speit heftige Flammen aus. Danach wird er verwirrt." + }, + "waveCrash": { + "name": "Wellentackle", + "effect": "Der Anwender hüllt sich in Wasser und stürzt sich mit dem ganzen Körper auf das Ziel, wobei er selbst großen Schaden erleidet." + }, + "chloroblast": { + "name": "Chlorostrahl", + "effect": "Der Anwender greift mit einer hohen Konzentration seines Chlorophylls an, wobei er selbst Schaden erleidet." + }, + "mountainGale": { + "name": "Frostfallwind", + "effect": "Der Anwender wirft gigantische Eisbrocken auf das Ziel. Dieses schreckt eventuell zurück." + }, + "victoryDance": { + "name": "Siegestanz", + "effect": "Der Anwender führt einen wilden Tanz auf, der den Sieg herbeiführen soll. Dies erhöht seinen Angriff, seine Verteidigung und seine Initiative." + }, + "headlongRush": { + "name": "Schmetterramme", + "effect": "Der Anwender rammt das Ziel mit dem ganzen Körper. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders." + }, + "barbBarrage": { + "name": "Giftstachelregen", + "effect": "Der Anwender greift mit unzähligen Giftstacheln an und vergiftet das Ziel eventuell. Doppelt so stark gegen vergiftete Ziele." + }, + "esperWing": { + "name": "Auraschwingen", + "effect": "Ein schneidender Angriff mit durch eine Aura verstärkten Schwingen, der außerdem die Initiative des Anwenders erhöht. Hohe Volltrefferquote." + }, + "bitterMalice": { + "name": "Niedertracht", + "effect": "Der Anwender greift mit eiskaltem, schaudererregendem Hass an und senkt dabei den Angriff des Zieles." + }, + "shelter": { + "name": "Refugium", + "effect": "Der Anwender macht seine Haut so hart wie Eisen und erhöht dadurch seine Verteidigung stark." + }, + "tripleArrows": { + "name": "Drillingspfeile", + "effect": "Der Anwender tritt zu und schießt dann drei Pfeile ab. Senkt eventuell die Verteidigung des Zieles oder lässt es zurückschrecken. Hohe Volltrefferquote." + }, + "infernalParade": { + "name": "Phantomparade", + "effect": "Angriff mit unzähligen Feuerkugeln, der dem Ziel eventuell Verbrennungen zufügt. Doppelt so stark gegen Ziele mit Statusproblemen." + }, + "ceaselessEdge": { + "name": "Klingenschwall", + "effect": "Der Anwender greift mit einer klingengleichen Muschelschale an und verstreut Muschelsplitter, die Stacheln zu Füßen des Zieles werden." + }, + "bleakwindStorm": { + "name": "Polarorkan", + "effect": "Der Anwender greift mit starken, kalten Winden an, die Körper und Geist erzittern lassen. Senkt eventuell die Initiative gegnerischer Pokémon." + }, + "wildboltStorm": { + "name": "Donnerorkan", + "effect": "Der Anwender ruft ein heftiges Unwetter herbei, um mit Wind und Blitzen anzugreifen. Gegnerische Pokémon werden eventuell paralysiert." + }, + "sandsearStorm": { + "name": "Wüstenorkan", + "effect": "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen und brennend heißem Sand umgibt. Eventuell erleiden sie Verbrennungen." + }, + "lunarBlessing": { + "name": "Lunargebet", + "effect": "Der Anwender richtet ein Gebet an den Mond und heilt bei sich und seinen am Kampf beteiligten Mitstreitern KP und hebt jegliche Statusprobleme auf." + }, + "takeHeart": { + "name": "Mutschub", + "effect": "Der Anwender fasst sich ein Herz, befreit sich von Statusproblemen und erhöht außerdem seinen Spezial-Angriff und seine Spezial-Verteidigung." + }, + "gMaxWildfire": { + "name": "Giga-Feuerflug", + "effect": "Eine Feuer-Attacke, die nur Gigadynamax-Glurak einsetzen kann. Fügt vier Runden lang Schaden zu." + }, + "gMaxBefuddle": { + "name": "Giga-Benebelung", + "effect": "Eine Käfer-Attacke, die nur Gigadynamax-Smettbo einsetzen kann. Gegnerische Pokémon werden entweder vergiftet, paralysiert oder in Schlaf versetzt." + }, + "gMaxVoltCrash": { + "name": "Giga-Blitzhagel", + "effect": "Eine Elektro-Attacke, die nur Gigadynamax-Pikachu einsetzen kann. Gegnerische Pokémon werden paralysiert." + }, + "gMaxGoldRush": { + "name": "Giga-Münzregen", + "effect": "Eine Normal-Attacke, die nur Gigadynamax-Mauzi einsetzen kann. Verwirrt Gegner und bringt nach dem Kampf Geld ein." + }, + "gMaxChiStrike": { + "name": "Giga-Fokusschlag", + "effect": "Eine Kampf-Attacke, die nur Gigadynamax-Machomei einsetzen kann. Erhöht die Volltrefferquote auf Mitstreiterseite." + }, + "gMaxTerror": { + "name": "Giga-Spuksperre", + "effect": "Eine Geister-Attacke, die nur Gigadynamax-Gengar einsetzen kann. Hindert gegnerische Pokémon an der Flucht beziehungsweise am Auswechseln." + }, + "gMaxResonance": { + "name": "Giga-Melodie", + "effect": "Eine Eis-Attacke, die nur Gigadynamax-Lapras einsetzen kann. Reduziert fünf Runden lang den erlittenen Schaden." + }, + "gMaxCuddle": { + "name": "Giga-Gekuschel", + "effect": "Eine Normal-Attacke, die nur Gigadynamax-Evoli einsetzen kann. Gegnerische Pokémon verlieben sich in es." + }, + "gMaxReplenish": { + "name": "Giga-Recycling", + "effect": "Eine Normal-Attacke, die nur Gigadynamax-Relaxo einsetzen kann. Stellt bereits verzehrte Beeren wieder her." + }, + "gMaxMalodor": { + "name": "Giga-Gestank", + "effect": "Eine Gift-Attacke, die nur Gigadynamax-Deponitox einsetzen kann. Vergiftet gegnerische Pokémon." + }, + "gMaxStonesurge": { + "name": "Giga-Geröll", + "effect": "Eine Wasser-Attacke, die nur Gigadynamax-Kamalm einsetzen kann. Verstreut viele spitze Steinbrocken auf dem Kampffeld." + }, + "gMaxWindRage": { + "name": "Giga-Sturmstoß", + "effect": "Eine Flug-Attacke, die nur Gigadynamax-Krarmor einsetzen kann. Beseitigt die Effekte von Attacken wie Reflektor und Lichtschild.." + }, + "gMaxStunShock": { + "name": "Giga-Voltschlag", + "effect": "Eine Elektro-Attacke, die nur Gigadynamax-Riffex einsetzen kann. Vergiftet oder paralysiert gegnerische Pokémon." + }, + "gMaxFinale": { + "name": "Giga-Lichtblick", + "effect": "Eine Feen-Attacke, die nur Gigadynamax-Pokusan einsetzen kann. Füllt die KP auf Mitstreiterseite auf." + }, + "gMaxDepletion": { + "name": "Giga-Dämpfer", + "effect": "Eine Drachen-Attacke, die nur Gigadynamax-Duraludon einsetzen kann. AP der letzten Attacke, die gegnerische Pokémon eingesetzt haben, werden gesenkt." + }, + "gMaxGravitas": { + "name": "Giga-Astrowellen", + "effect": "Eine Psycho-Attacke, die nur Gigadynamax-Maritellit einsetzen kann. Ändert die Erdanziehung für fünf Runden." + }, + "gMaxVolcalith": { + "name": "Giga-Schlacke", + "effect": "Eine Gesteins-Attacke, die nur Gigadynamax-Montecarbo einsetzen kann. Fügt vier Runden lang Schaden zu." + }, + "gMaxSandblast": { + "name": "Giga-Sandstoß", + "effect": "Eine Boden-Attacke, die nur Gigadynamax-Sanaconda einsetzen kann. Eine Sandhose wütet für vier bis fünf Runden." + }, + "gMaxSnooze": { + "name": "Giga-Gähnzwang", + "effect": "Eine Unlicht-Attacke, die nur Gigadynamax-Olangaar einsetzen kann. Mit einem großen Gähner wird das Ziel müde gemacht und schläft in der nächsten Runde ein." + }, + "gMaxTartness": { + "name": "Giga-Säureguss", + "effect": "Eine Pflanzen-Attacke, die nur Gigadynamax-Drapfel einsetzen kann. Senkt den Ausweichwert der gegnerischen Pokémon." + }, + "gMaxSweetness": { + "name": "Giga-Nektarflut", + "effect": "Eine Pflanzen-Attacke, die nur Gigadynamax-Schlapfel einsetzen kann. Heilt Statusprobleme auf Mitstreiterseite." + }, + "gMaxSmite": { + "name": "Giga-Sanktion", + "effect": "Eine Feen-Attacke, die nur Gigadynamax-Silembrim einsetzen kann. Verwirrt gegnerische Pokémon." + }, + "gMaxSteelsurge": { + "name": "Giga-Stahlschlag", + "effect": "Eine Stahl-Attacke, die nur Gigadynamax-Patinaraja einsetzen kann. Verstreut viele zackige Stahlsplitter auf dem Kampffeld." + }, + "gMaxMeltdown": { + "name": "Giga-Schmelze", + "effect": "Eine Stahl-Attacke, die nur Gigadynamax-Melmetal einsetzen kann. Hindert Gegner am wiederholten Einsatz derselben Attacke." + }, + "gMaxFoamBurst": { + "name": "Giga-Schaumbad", + "effect": "Eine Wasser-Attacke, die nur Gigadynamax-Kingler einsetzen kann. Senkt die Initiative der gegnerischen Pokémon stark." + }, + "gMaxCentiferno": { + "name": "Giga-Feuerkessel", + "effect": "Eine Feuer-Attacke, die nur Gigadynamax-Infernopod einsetzen kann. Schließt gegnerische Pokémon vier bis fünf Runden in wirbelnden Flammen ein." + }, + "gMaxVineLash": { + "name": "Giga-Geißel", + "effect": "Eine Pflanzen-Attacke, die nur Gigadynamax-Bisaflor einsetzen kann. Geißelt gegnerische Pokémon vier Runden lang mit peitschenartigen Ranken." + }, + "gMaxCannonade": { + "name": "Giga-Beschuss", + "effect": "Eine Wasser-Attacke, die nur Gigadynamax-Turtok einsetzen kann. Schließt gegnerische Pokémon vier Runden lang in einem Wasserwirbel ein." + }, + "gMaxDrumSolo": { + "name": "Giga-Getrommel", + "effect": "Eine Pflanzen-Attacke, die nur Gigadynamax-Gortrom einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." + }, + "gMaxFireball": { + "name": "Giga-Brandball", + "effect": "Eine Feuer-Attacke, die nur Gigadynamax-Liberlo einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." + }, + "gMaxHydrosnipe": { + "name": "Giga-Schütze", + "effect": "Eine Wasser-Attacke, die nur Gigadynamax-Intelleon einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." + }, + "gMaxOneBlow": { + "name": "Giga-Einzelhieb", + "effect": "Eine Unlicht-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Einzelhieb ignoriert die schützende Wirkung von Dyna-Wall." + }, + "gMaxRapidFlow": { + "name": "Giga-Multihieb", + "effect": "Eine Wasser-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Multihieb ignoriert die schützende Wirkung von Dyna-Wall." + }, + "teraBlast": { + "name": "Tera-Ausbruch", + "effect": "Ist der Anwender terakristallisiert, greift er mit Energie seines Tera-Typs an. Der Schaden hängt vom Angriff oder Spezial-Angriff ab, je nachdem, welcher Wert höher ist." + }, + "silkTrap": { + "name": "Fadenfalle", + "effect": "Der Anwender spannt eine Falle aus Fäden und wird so vor Angriffen geschützt. Berührt ihn nun ein Angreifer, sinkt dessen Initiative." + }, + "axeKick": { + "name": "Fersenkick", + "effect": "Der Anwender greift an, indem er seine erhobene Ferse hinunterschnellen lässt. Das Ziel wird eventuell verwirrt. Bei Misserfolg verletzt sich der Anwender selbst." + }, + "lastRespects": { + "name": "Letzte Ehre", + "effect": "Der Anwender rächt gefallene Mitstreiter. Je mehr kampfunfähige Pokémon sich im Team befinden, desto stärker ist die Attacke." + }, + "luminaCrash": { + "name": "Lichteinschlag", + "effect": "Der Anwender greift an, indem er ein sonderbares Licht freisetzt, das sich auch auf die Psyche auswirkt. Zudem wird die Spezial-Verteidigung des Zieles stark gesenkt." + }, + "orderUp": { + "name": "Auftischen", + "effect": "Eine Attacke mit geübten Bewegungen. Trägt der Anwender ein Nigiragi im Maul, erhöht sich je nach dessen Form ein Statuswert des Anwenders." + }, + "jetPunch": { + "name": "Düsenhieb", + "effect": "Bei dieser Erstschlag-Attacke hüllt der Anwender seine Faust in einen Strudel und greift mit einem extrem schnellen Hieb an." + }, + "spicyExtract": { + "name": "Chili-Essenz", + "effect": "Der Anwender setzt eine unglaublich scharfe Essenz frei, die den Angriff des Zieles stark erhöht, aber seine Verteidigung stark senkt." + }, + "spinOut": { + "name": "Reifendrehung", + "effect": "Der Anwender wirbelt wild umher, indem er sein Gewicht auf seine Extremitäten verlagert, und richtet so Schaden an. Seine eigene Initiative sinkt dadurch stark" + }, + "populationBomb": { + "name": "Mäuseplage", + "effect": "Der Anwender versammelt eine Schar von Artgenossen, die dann geschlossen angreift und das Ziel ein- bis zehnmal hintereinander trifft." + }, + "iceSpinner": { + "name": "Eiskreisel", + "effect": "Der Anwender hüllt seine Füße in dünnes Eis, wirbelt herum und greift so das Ziel an. Die Drehung zerstört etwaige Felder" + }, + "glaiveRush": { + "name": "Großklingenstoß", + "effect": "Der Anwender stürzt sich waghalsig auf das Ziel. Bis zum nächsten Zug des Anwenders treffen ihn gegnerische Angriffe garantiert und richten doppelten Schaden an." + }, + "revivalBlessing": { + "name": "Vitalsegen", + "effect": "Der Anwender belebt mit einem Wunsch voller Mitgefühl ein kampfunfähiges Team-Mitglied wieder und stellt die Hälfte dessen maximaler KP wieder her." + }, + "saltCure": { + "name": "Pökelsalz", + "effect": "Der Anwender pökelt das Ziel mit Salz ein, wodurch dieses jede Runde Schaden erleidet. Stahl- und Wasser-Pokémon leiden besonders darunter." + }, + "tripleDive": { + "name": "Tauchtriade", + "effect": "Der Anwender taucht mit perfekt abgestimmtem Timing ab und trifft das Ziel mit Wasserspritzern. Dabei richtet er dreimal hintereinander Schaden an." + }, + "mortalSpin": { + "name": "Letalwirbler", + "effect": "Der Anwender greift mit einer wirbelnden Attacke an, die Gegner auch vergiftet. Befreit den Anwender unter anderem von Wickel, Klammergriff und Egelsamen." + }, + "doodle": { + "name": "Abpausen", + "effect": "Der Anwender kopiert die wahre Essenz des Zieles. Dadurch erhalten alle Pokémon auf der Mitstreiterseite die Fähigkeit des Zieles." + }, + "filletAway": { + "name": "Abspaltung", + "effect": "Der Anwender setzt seine KP ein, um seinen Angriff, seinen Spezial-Angriff und seine Initiative stark zu erhöhen." + }, + "kowtowCleave": { + "name": "Kniefallspalter", + "effect": "Der Anwender fällt auf die Knie und verleitet das Ziel zu Unachtsamkeit, bevor er mit einer Klinge zuschlägt. Diese Attacke trifft garantiert." + }, + "flowerTrick": { + "name": "Blumentrick", + "effect": "Der Anwender greift an, indem er dem Ziel einen Trick-Strauß zuwirft. Diese Attacke trifft immer und hat zudem Volltreffergarantie." + }, + "torchSong": { + "name": "Loderlied", + "effect": "Der Anwender spuckt inbrünstig lodernde Flammen, als würde er singen, und versengt das Ziel. Dadurch steigt auch der Spezial-Angriff des Anwenders." + }, + "aquaStep": { + "name": "Wogentanz", + "effect": "Der Anwender neckt das Ziel mit flinken, fließenden Tanzschritten und greift es dann an. Dadurch steigt auch die Initiative des Anwenders." + }, + "ragingBull": { + "name": "Rasender Stier", + "effect": "Ein rasender Angriff eines wilden Stiers, der auch Barrieren wie Lichtschild und Reflektor durchbricht. Der Attacken-Typ hängt von der Form des Anwenders ab." + }, + "makeItRain": { + "name": "Goldrausch", + "effect": "Der Anwender greift an, indem er Unmengen an Münzen ausschüttet, senkt dabei aber seinen Spezial-Angriff. Das Geld wird nach dem Kampf aufgesammelt." + }, + "psyblade": { + "name": "Psychoschneide", + "effect": "Das Ziel wird mit einer immateriellen Klinge angegriffen. Die Stärke der Attacke steigt um 50 %, wenn beim Anwender ein Elektrofeld aktiv ist." + }, + "hydroSteam": { + "name": "Hydrodampf", + "effect": "Das Ziel wird kraftvoll mit brodelndem Wasser übergossen. Wider Erwarten sinkt die Stärke der Attacke bei starkem Sonnenlicht nicht, sondern steigt um 50 %." + }, + "ruination": { + "name": "Verderben", + "effect": "Der Anwender beschwört Verderben bringendes Unheil herauf und halbiert die KP des Zieles." + }, + "collisionCourse": { + "name": "Kollisionskurs", + "effect": "Der Anwender wechselt seine Form, während er sich gen Boden stürzt, und verursacht eine riesige Ur-Explosion. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr." + }, + "electroDrift": { + "name": "Blitztour", + "effect": "Der Anwender wechselt bei rasantem Tempo seine Form und trifft das Ziel mit einem futuristischen Elektroschlag. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr." + }, + "shedTail": { + "name": "Schwanzabwurf", + "effect": "Der Anwender setzt seine KP ein, um einen Doppelgänger zu erzeugen, und tauscht dann den Platz mit einem anderen Pokémon." + }, + "chillyReception": { + "name": "Eisige Stimmung", + "effect": "Der Anwender sorgt mit einem schlechten Witz für eisige Stimmung und tauscht den Platz mit einem anderen Pokémon. Erzeugt fünf Runden lang Schnee." + }, + "tidyUp": { + "name": "Aufräumen", + "effect": "Die Effekte von Stachler, Tarnsteine, Klebenetz, Giftspitzen und Delegator werden aufgehoben. Zudem steigen der Angriff und die Initiative des Anwenders." + }, + "snowscape": { + "name": "Schneelandschaft", + "effect": "Erzeugt fünf Runden lang Schnee. Dadurch wird die Verteidigung von Eis-Pokémon erhöht." + }, + "pounce": { + "name": "Anspringen", + "effect": "Der Anwender greift an, indem er das Ziel anspringt. Dadurch sinkt auch die Initiative des Zieles." + }, + "trailblaze": { + "name": "Wegbereiter", + "effect": "Der Anwender greift an, als würde er aus hohem Gras hervorspringen. Mit wendigen Schritten erhöht er seine Initiative." + }, + "chillingWater": { + "name": "Kalte Dusche", + "effect": "Der Anwender greift an, indem er das Ziel mit eiskaltem Wasser überschüttet. Das raubt dem Ziel seinen Kampfgeist und senkt so seinen Angriff." + }, + "hyperDrill": { + "name": "Hyperbohrer", + "effect": "Der Anwender lässt einen spitzen Teil seines Körpers rasant rotieren, sticht zu und durchbricht dabei auch die Wirkung von Attacken wie Schutzschild und Scanner." + }, + "twinBeam": { + "name": "Doppelstrahl", + "effect": "Der Anwender greift mit übernatürlichen Lichtstrahlen an, die er aus seinen Augen abfeuert, und trifft das Ziel zweimal hintereinander." + }, + "rageFist": { + "name": "Zornesfaust", + "effect": "Ein Angriff, für den der Anwender seinen Zorn in Energie umwandelt. Je häufiger der Anwender getroffen wurde, desto stärker wird diese Attacke." + }, + "armorCannon": { + "name": "Rüstungskanone", + "effect": "Der Anwender schießt die eigene Rüstung als glühendes Projektil auf das Ziel. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders." + }, + "bitterBlade": { + "name": "Reueschwert", + "effect": "Der Anwender tränkt seine Klinge in Bedauern und Reue und greift damit an. Die Hälfte des zugefügten Schadens wird dem Anwender als KP gutgeschrieben." + }, + "doubleShock": { + "name": "Zweifachladung", + "effect": "Der Anwender nutzt die gesamte Elektrizität in seinem Körper, um großen Schaden auszuteilen. Die restliche Kampfdauer gehört er nicht mehr dem Typ Elektro an." + }, + "gigatonHammer": { + "name": "Riesenhammer", + "effect": "Der Anwender greift mit einem großen Hammer an, den er mit vollem Körpereinsatz um sich schwingt. Diese Attacke kann nicht zweimal in Folge eingesetzt werden." + }, + "comeuppance": { + "name": "Vendetta", + "effect": "Der Anwender rächt sich an dem Gegner, der ihm zuletzt mit einer Attacke Schaden zugefügt hat, indem er ihm den Schaden mit erhöhter Kraft zurückzahlt." + }, + "aquaCutter": { + "name": "Aquaschnitt", + "effect": "Der Anwender stößt Wasser unter Druck aus, um das Ziel wie mit einer Klinge anzugreifen. Hohe Volltrefferquote." + }, + "blazingTorque": { + "name": "Hitzeturbo", + "effect": "Der Anwender rammt seinen glühend heißen Motor in das Ziel. Dieses erleidet eventuell Verbrennungen." + }, + "wickedTorque": { + "name": "Finsterturbo", + "effect": "Der Anwender rammt seinen Motor mit böswilliger Absicht in das Ziel. Dieses schläft eventuell ein." + }, + "noxiousTorque": { + "name": "Toxiturbo", + "effect": "Der Anwender rammt seinen giftigen Motor in das Ziel. Dieses wird eventuell vergiftet." + }, + "combatTorque": { + "name": "Raufturbo", + "effect": "Der Anwender rammt seinen Motor gewaltvoll in das Ziel. Dieses wird eventuell paralysiert." + }, + "magicalTorque": { + "name": "Zauberturbo", + "effect": "Der Anwender rammt seinen feenartigen Motor in das Ziel. Dieses wird eventuell verwirrt." + }, + "bloodMoon": { + "name": "Blutmond", + "effect": "Der Anwender entfesselt eine gewaltige Energieladung aus einem blutroten Vollmond. Diese Attacke kann nicht zweimal in Folge eingesetzt werden." + }, + "matchaGotcha": { + "name": "Quirlschuss", + "effect": "Der Anwender verschießt gequirlten Tee. Die Hälfte des zugefügten Schadens wird ihm als KP gutgeschrieben. Das Ziel erleidet eventuell Verbrennungen." + }, + "syrupBomb": { + "name": "Sirupbombe", + "effect": "Der Anwender feuert eine klebrige Sirupbombe auf das Ziel, wodurch es in Sirup gehüllt und seine Initiative drei Runden in Folge gesenkt wird." + }, + "ivyCudgel": { + "name": "Rankenkeule", + "effect": "Der Anwender schlägt mit einer rankenumschlungenen Keule zu. Der Typ dieser Attacke hängt von der Maske des Anwenders ab. Hohe Volltrefferquote." + }, + "electroShot": { + "name": "Stromstrahl", + "effect": "Sammelt in Runde 1 Elektrizität, um den Spezial-Angriff zu erhöhen, und greift dann in Runde 2 mit Starkstrom an. Bei Regen erfolgt der Angriff sofort in Runde 1." + }, + "teraStarstorm": { + "name": "Tera-Sternhagel", + "effect": "Der Anwender greift das Ziel mit gebündelter Kristallenergie an. Wenn Terapagos diese Attacke in seiner Stellarform einsetzt, erleiden alle Gegner Schaden." + }, + "fickleBeam": { + "name": "Launenlaser", + "effect": "Der Anwender greift mit einem Laserstrahl an. Manchmal feuern mehrere seiner Köpfe Laser ab, wodurch sich die Stärke dieser Attacke verdoppelt." + }, + "burningBulwark": { + "name": "Flammenschild", + "effect": "Das brennend heiße Fell des Anwenders schützt ihn vor Angriffen. Gleichzeitig erleiden alle Pokémon, die mit ihm in Berührung kommen, Verbrennungen." + }, + "thunderclap": { + "name": "Sturmblitz", + "effect": "Bei dieser Erstschlag-Attacke lässt der Anwender einen Blitz auf das Ziel einschlagen. Sie gelingt nur, wenn dieses gerade eine Angriffsattacke vorbereitet." + }, + "mightyCleave": { + "name": "Wuchtklinge", + "effect": "Der Anwender führt mit dem in seinem Kopf gespeicherten Licht einen Schnitt aus. Diese Attacke trifft auch, wenn das Ziel sich selbst schützt." + }, + "tachyonCutter": { + "name": "Tachyon-Schnitt", + "effect": "Der Anwender greift das Ziel zweimal hintereinander mit Partikelklingen an. Der Angriff trifft garantiert." + }, + "hardPress": { + "name": "Stahlpresse", + "effect": "Der Anwender nimmt das Ziel mit Armen oder Scheren in die Mangel. Je höher die KP des Zieles, desto stärker die Attacke." + }, + "dragonCheer": { + "name": "Drachenschrei", + "effect": "Das anspornende Drachengebrüll hebt die Moral aller Mitstreiter und erhöht ihre Volltrefferquote. Der Effekt ist stärker, wenn sie dem Typ Drache angehören." + }, + "alluringVoice": { + "name": "Lockstimme", + "effect": "Der Anwender greift mit engelsgleichem Gesang an. Falls die Statuswerte des Zieles in dieser Runde erhöht wurden, wird es zusätzlich verwirrt." + }, + "temperFlare": { + "name": "Frustflamme", + "effect": "Der Anwender greift das Ziel voller Verzweiflung an. Wenn seine vorige Attacke fehlgeschlagen ist, verdoppelt sich die Stärke der Attacke." + }, + "supercellSlam": { + "name": "Donnerstoß", + "effect": "Der Anwender lädt seinen Körper mit elektrischer Energie auf und stürzt sich auf das Ziel. Bei Misserfolg verletzt sich der Anwender selbst." + }, + "psychicNoise": { + "name": "Psycholärm", + "effect": "Der Anwender greift mit unerträglichen Schallwellen an, wodurch das Ziel zwei Runden lang nicht durch Attacken, Fähigkeiten oder getragene Items geheilt werden kann." + }, + "upperHand": { + "name": "Schnellkonter", + "effect": "Der Anwender reagiert auf Bewegungen des Zieles und lässt es durch einen Schlag zurückschrecken. Gelingt nur, wenn das Ziel gerade eine Erstschlag-Attacke vorbereitet." + }, + "malignantChain": { + "name": "Giftkettung", + "effect": "Der Anwender umwickelt das Ziel mit einer Kette aus Toxinen, die in dessen Körper eindringen und ihm schaden. Das Ziel wird eventuell schwer vergiftet." + } +} diff --git a/src/locales/de/move.ts b/src/locales/de/move.ts deleted file mode 100644 index 430b4f85ec3..00000000000 --- a/src/locales/de/move.ts +++ /dev/null @@ -1,3812 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -export const move: MoveTranslationEntries = { - "pound": { - name: "Klaps", - effect: "Ein Hieb mit den Vorderbeinen oder dem Schweif." - }, - "karateChop": { - name: "Karateschlag", - effect: "Gute Möglichkeit, einen Volltreffer zu landen." - }, - "doubleSlap": { - name: "Duplexhieb", - effect: "Trifft das Ziel zwei- bis fünfmal hintereinander mit einem Duplexhieb." - }, - "cometPunch": { - name: "Kometenhieb", - effect: "Trifft das Ziel zwei- bis fünfmal hintereinander mit kräftigen Hieben." - }, - "megaPunch": { - name: "Megahieb", - effect: "Ein unglaublich kräftiger Hieb." - }, - "payDay": { - name: "Zahltag", - effect: "Das Ziel wird mit Münzen beworfen. Das Geld wird nach dem Kampf aufgesammelt." - }, - "firePunch": { - name: "Feuerschlag", - effect: "Feuriger Schlag, der dem Ziel eventuell Verbrennungen zufügt." - }, - "icePunch": { - name: "Eishieb", - effect: "Ein eisiger Schlag, der das Ziel eventuell einfriert." - }, - "thunderPunch": { - name: "Donnerschlag", - effect: "Ein elektrischer Schlag, der das Ziel eventuell paralysiert." - }, - "scratch": { - name: "Kratzer", - effect: "Das Ziel wird mit scharfen Klauen zerkratzt." - }, - "viseGrip": { - name: "Klammer", - effect: "Das Ziel wird umklammert und zusammengequetscht." - }, - "guillotine": { - name: "Guillotine", - effect: "Kräftige Scheren-Attacke. Führt beim Ziel sofort zum K.O." - }, - "razorWind": { - name: "Klingensturm", - effect: "Eine Attacke, die über zwei Runden geht. Hohe Volltrefferquote." - }, - "swordsDance": { - name: "Schwerttanz", - effect: "Ein wilder Kampftanz, der den eigenen Angriffs-Wert stark erhöht." - }, - "cut": { - name: "Zerschneider", - effect: "Ein Basisangriff mit Schere oder Klaue. Damit können kleine Bäume gefällt werden." - }, - "gust": { - name: "Windstoß", - effect: "Trifft das Ziel mit einem Windstoß durch einen Flügelschlag." - }, - "wingAttack": { - name: "Flügelschlag", - effect: "Trifft das Ziel mit ausgebreiteten Flügeln." - }, - "whirlwind": { - name: "Wirbelwind", - effect: "Weht das Ziel weg und ersetzt es durch ein anderes Pokémon. In der Wildnis endet der Kampf." - }, - "fly": { - name: "Fliegen", - effect: "Steigt in Runde 1 empor und trifft das Ziel in Runde 2." - }, - "bind": { - name: "Klammergriff", - effect: "Umklammert und quetscht das Ziel über vier bis fünf Runden." - }, - "slam": { - name: "Slam", - effect: "Schlag mit einem langen Schweif, einer Ranke oder Ähnlichem." - }, - "vineWhip": { - name: "Rankenhieb", - effect: "Peitschenähnlicher Schlag mit Ranken." - }, - "stomp": { - name: "Stampfer", - effect: "Stampfen mit dem Fuß. Das Ziel schreckt eventuell zurück." - }, - "doubleKick": { - name: "Doppelkick", - effect: "Der Anwender tritt in einer Runde zweimal schnell zu." - }, - "megaKick": { - name: "Megakick", - effect: "Das Ziel wird mit einem extrem heftigen Tritt angegriffen." - }, - "jumpKick": { - name: "Sprungkick", - effect: "Der Angreifer hüpft hoch und tritt zu. Bei Misserfolg schadet er sich selbst." - }, - "rollingKick": { - name: "Fegekick", - effect: "Heftiger Tritt aus einer schnellen Drehbewegung. Lässt das Ziel eventuell zurückschrecken." - }, - "sandAttack": { - name: "Sandwirbel", - effect: "Senkt Genauigkeit des Zieles, indem ihm Sand ins Gesicht geworfen wird." - }, - "headbutt": { - name: "Kopfnuss", - effect: "Rammt das Ziel mit einer Kopfnuss. Ziel schreckt eventuell zurück." - }, - "hornAttack": { - name: "Hornattacke", - effect: "Spießt das Ziel mit einem spitzen Horn auf." - }, - "furyAttack": { - name: "Furienschlag", - effect: "Spießt das Ziel zwei- bis fünfmal mit spitzem Horn oder Schnabel auf." - }, - "hornDrill": { - name: "Hornbohrer", - effect: "K.O.-Attacke, bei der ein Horn als Bohrer eingesetzt wird." - }, - "tackle": { - name: "Tackle", - effect: "Trifft das Ziel mit vollem Körpereinsatz." - }, - "bodySlam": { - name: "Bodyslam", - effect: "Trifft das Ziel mit vollem Körpereinsatz. Bewirkt eventuell Paralyse." - }, - "wrap": { - name: "Wickel", - effect: "Umwickelt das Ziel über vier bis fünf Runden mit Ranken oder Ähnlichem und fügt ihm Schaden zu." - }, - "takeDown": { - name: "Bodycheck", - effect: "Rücksichtslose Attacke, bei der sich der Angreifer selbst leicht verletzt." - }, - "thrash": { - name: "Fuchtler", - effect: "Attacke über zwei bis drei Runden, die den Angreifer verwirrt." - }, - "doubleEdge": { - name: "Risikotackle", - effect: "Lebensgefährlicher Angriff, bei dem sich der Angreifer selbst verletzt." - }, - "tailWhip": { - name: "Rutenschlag", - effect: "Hieb mit dem Schweif. Senkt die Verteidigung des Zieles." - }, - "poisonSting": { - name: "Giftstachel", - effect: "Angriff mit Giftstachel. Das Ziel wird eventuell vergiftet." - }, - "twineedle": { - name: "Duonadel", - effect: "Stacheln treffen das Ziel zweimal. Das Ziel wird eventuell vergiftet." - }, - "pinMissile": { - name: "Nadelrakete", - effect: "Spitze Nadeln treffen das Ziel zwei- bis fünfmal hintereinander." - }, - "leer": { - name: "Silberblick", - effect: "Gegnerischer Verteidigungs-Wert wird durch angsteinflößenden Blick gesenkt." - }, - "bite": { - name: "Biss", - effect: "Beißt zu und lässt das Ziel eventuell zurückschrecken." - }, - "growl": { - name: "Heuler", - effect: "Der Anwender nimmt das Ziel für sich ein und senkt dessen Angriffs-Wert." - }, - "roar": { - name: "Brüller", - effect: "Verjagt das Ziel und ersetzt es durch ein anderes Pokémon. Beendet den Kampf in der Wildnis." - }, - "sing": { - name: "Gesang", - effect: "Ein Lied, das das Ziel in tiefen Schlaf versetzt." - }, - "supersonic": { - name: "Superschall", - effect: "Ausstoß bizarrer Schallwellen. Das Ziel wird verwirrt." - }, - "sonicBoom": { - name: "Ultraschall", - effect: "Das Ziel wird von einer Schockwelle getroffen, die stets 20 KP Schaden anrichtet." - }, - "disable": { - name: "Aussetzer", - effect: "Die zuletzt eingesetzte Attacke des Zieles wird für mehrere Runden blockiert." - }, - "acid": { - name: "Säure", - effect: "Versprüht ätzende Flüssigkeit, die eventuell die Spezial-Verteidigung der Gegner in der Nähe des Anwenders senkt." - }, - "ember": { - name: "Glut", - effect: "Schwache Feuer-Attacke, durch die das Ziel eventuell Verbrennungen erleidet." - }, - "flamethrower": { - name: "Flammenwurf", - effect: "Starke Feuer-Attacke, durch die das Ziel eventuell Verbrennungen erleidet." - }, - "mist": { - name: "Weißnebel", - effect: "Anwender schützt das Team mit einem Nebel. Verhindert Statussenkungen für fünf Runden." - }, - "waterGun": { - name: "Aquaknarre", - effect: "Das Ziel wird mit Wasser bespritzt." - }, - "hydroPump": { - name: "Hydropumpe", - effect: "Spritzt eine Menge Wasser mit Hochdruck auf das Ziel." - }, - "surf": { - name: "Surfer", - effect: "Eine Welle bricht über alle Pokémon in der Nähe des Anwenders herein." - }, - "iceBeam": { - name: "Eisstrahl", - effect: "Das Ziel wird von einem Eisstrahl getroffen und friert eventuell ein." - }, - "blizzard": { - name: "Blizzard", - effect: "Ein Schneesturm wütet, der das Ziel einfrieren kann." - }, - "psybeam": { - name: "Psystrahl", - effect: "Feuert einen Strahl ab, der das Ziel verwirren kann." - }, - "bubbleBeam": { - name: "Blubbstrahl", - effect: "Versprüht Blasen, die eventuell den Initiative-Wert des Zieles senken." - }, - "auroraBeam": { - name: "Aurorastrahl", - effect: "Regenbogenfarbener Strahl, der eventuell den Angriffs-Wert des Zieles senkt." - }, - "hyperBeam": { - name: "Hyperstrahl", - effect: "Starke Attacke, die den Anwender zwingt, eine Runde auszusetzen." - }, - "peck": { - name: "Pikser", - effect: "Greift das Ziel mit dem Schnabel oder Horn an." - }, - "drillPeck": { - name: "Bohrschnabel", - effect: "Korkenzieherangriff, bei dem der Schnabel als Bohrer dient." - }, - "submission": { - name: "Überroller", - effect: "Harte Körperattacke, bei der sich der Angreifer selbst leicht verletzt." - }, - "lowKick": { - name: "Fußkick", - effect: "Ein Tritt, der das Ziel umwirft. Je schwerer das Ziel ist, desto mehr Schaden fügt ihm die Attacke zu." - }, - "counter": { - name: "Konter", - effect: "Kontert physische Treffer und fügt dem Ziel das Doppelte des Schadens zu, den der Anwender erlitten hat." - }, - "seismicToss": { - name: "Geowurf", - effect: "Ziel wird mit der Kraft der Gravitation umgeworfen. Richtet Schaden gemäß Level des Angreifers an." - }, - "strength": { - name: "Stärke", - effect: "Das Ziel wird extrem stark getroffen. Macht Verschieben von Felsen möglich." - }, - "absorb": { - name: "Absorber", - effect: "Attacke, die die Hälfte des Schadens absorbiert." - }, - "megaDrain": { - name: "Megasauger", - effect: "Attacke, die die Hälfte des Schadens absorbiert." - }, - "leechSeed": { - name: "Egelsamen", - effect: "Ziel wird bepflanzt und verliert jede Runde KP, die ein Pokémon aus dem Team des Anwenders heilen." - }, - "growth": { - name: "Wachstum", - effect: "Der Körper wächst. Dadurch steigen Angriff und Spezial-Angriff." - }, - "razorLeaf": { - name: "Rasierblatt", - effect: "Trifft das Ziel mit Blättern. Hohe Volltrefferquote." - }, - "solarBeam": { - name: "Solarstrahl", - effect: "Absorbiert Licht in Runde 1. In Runde 2 erfolgt der Angriff." - }, - "poisonPowder": { - name: "Giftpuder", - effect: "Verstreut giftigen Puder auf das Ziel." - }, - "stunSpore": { - name: "Stachelspore", - effect: "Verstreut lähmenden Puder." - }, - "sleepPowder": { - name: "Schlafpuder", - effect: "Verstreut Schlafpuder, der das Ziel eventuell in Schlaf versetzt." - }, - "petalDance": { - name: "Blättertanz", - effect: "Angriff mit Blütenblättern für zwei bis drei Runden. Angreifer wird verwirrt." - }, - "stringShot": { - name: "Fadenschuss", - effect: "Umwickelt Ziele in der Nähe mit Fäden aus dem Mund und senkt den Initiative-Wert." - }, - "dragonRage": { - name: "Drachenwut", - effect: "Stößt eine wutgeladene Schockwelle aus, die stets 40 KP Schaden anrichtet." - }, - "fireSpin": { - name: "Feuerwirbel", - effect: "Das Ziel wird für vier bis fünf Runden in einem Feuerkreis gefangen." - }, - "thunderShock": { - name: "Donnerschock", - effect: "Eine Elektro-Attacke, die das Ziel eventuell paralysiert." - }, - "thunderbolt": { - name: "Donnerblitz", - effect: "Eine starke Elektro-Attacke, die das Ziel eventuell paralysiert." - }, - "thunderWave": { - name: "Donnerwelle", - effect: "Ein schwacher Stromstoß, der das Ziel paralysiert." - }, - "thunder": { - name: "Donner", - effect: "Eine verheerende Elektro-Attacke, die das Ziel eventuell paralysiert." - }, - "rockThrow": { - name: "Steinwurf", - effect: "Das Ziel wird mit einem kleinen Stein beworfen." - }, - "earthquake": { - name: "Erdbeben", - effect: "Ein mächtiges Beben, das die anderen Pokémon in der Nähe des Anwenders trifft." - }, - "fissure": { - name: "Geofissur", - effect: "Das Ziel wird in eine Erdspalte geworfen. Ist die Attacke erfolgreich, führt sie zu einem K.O." - }, - "dig": { - name: "Schaufler", - effect: "In Runde 1 gräbt sich der Anwender ein und in Runde 2 greift er an. Macht Flucht aus Höhlen möglich." - }, - "toxic": { - name: "Toxin", - effect: "Vergiftet das Ziel mit einem potenten Toxin schwer. Vergiftung wird von Runde zu Runde stärker." - }, - "confusion": { - name: "Konfusion", - effect: "Das Ziel wird von schwacher telekinetischer Energie getroffen und eventuell verwirrt." - }, - "psychic": { - name: "Psychokinese", - effect: "Starke Psycho-Attacke, die eventuell die Spezial-Verteidigung des Zieles senkt." - }, - "hypnosis": { - name: "Hypnose", - effect: "Hypnose-Attacke, die das Ziel in Schlaf versetzt." - }, - "meditate": { - name: "Meditation", - effect: "Anwender aktiviert Kräfte, die tief in seinem Inneren schlummern, und steigert so seinen Angriffs-Wert." - }, - "agility": { - name: "Agilität", - effect: "Entspannt den Körper, um den Initiative-Wert stark zu steigern." - }, - "quickAttack": { - name: "Ruckzuckhieb", - effect: "Sehr schneller Angriff mit Erstschlaggarantie." - }, - "rage": { - name: "Raserei", - effect: "Erhöht Angriff des Anwenders, wenn dieser getroffen wird, solange die Attacke aktiviert ist." - }, - "teleport": { - name: "Teleport", - effect: "Der Anwender tauscht den Platz mit einem anderen Team-Mitglied, sofern vorhanden. Setzen wilde Pokémon die Attacke ein, ergreifen diese die Flucht." - }, - "nightShade": { - name: "Nachtnebel", - effect: "Das Ziel sieht eine Illusion. Richtet Schaden gemäß dem Level des Anwenders an." - }, - "mimic": { - name: "Mimikry", - effect: "Kopiert die zuvor ausgeführte Attacke des Zieles. Kann im Kampf bis zur Auswechslung verwendet werden." - }, - "screech": { - name: "Kreideschrei", - effect: "Stößt einen Schrei aus, um die Verteidigung des Zieles stark zu senken." - }, - "doubleTeam": { - name: "Doppelteam", - effect: "Erzeugt durch schnelle Bewegungen Ebenbilder, um den Fluchtwert zu erhöhen." - }, - "recover": { - name: "Genesung", - effect: "Eine Selbstheilung. KP des Anwenders werden um 50 % des maximalen Wertes aufgefüllt." - }, - "harden": { - name: "Härtner", - effect: "Stärkt die Muskulatur und erhöht den Verteidigungs-Wert." - }, - "minimize": { - name: "Komprimator", - effect: "Anwender schrumpft, um seinen Fluchtwert stark zu erhöhen." - }, - "smokescreen": { - name: "Rauchwolke", - effect: "Senkt Genauigkeit des Zieles mit Rauch, Tinte oder Ähnlichem." - }, - "confuseRay": { - name: "Konfusstrahl", - effect: "Ein fieser Strahl, der das Ziel verwirrt." - }, - "withdraw": { - name: "Panzerschutz", - effect: "Rückzug in den harten Panzer. Erhöht den Verteidigungs-Wert." - }, - "defenseCurl": { - name: "Einigler", - effect: "Verbirgt Schwächen durch Einrollen und hebt gleichzeitig den Verteidigungs-Wert." - }, - "barrier": { - name: "Barriere", - effect: "Erzeugt eine Barriere, die den Verteidigungs-Wert stark erhöht." - }, - "lightScreen": { - name: "Lichtschild", - effect: "Erzeugt eine Lichtwand und senkt den Schaden durch Spezial-Angriffe für fünf Runden." - }, - "haze": { - name: "Dunkelnebel", - effect: "Erzeugt einen dunklen Nebel. Alle Veränderungen der Statuswerte der Kampfteilnehmer werden annulliert." - }, - "reflect": { - name: "Reflektor", - effect: "Eine mysteriöse Wand, die fünf Runden den Schaden von physischen gegnerischen Treffern reduziert." - }, - "focusEnergy": { - name: "Energiefokus", - effect: "Anwender atmet ein und bündelt Kraft. Die Volltrefferquote steigt dadurch." - }, - "bide": { - name: "Geduld", - effect: "Erträgt zwei Runden Angriffe und schlägt dann mit dem doppelten Wert des erlittenen Schadens zurück." - }, - "metronome": { - name: "Metronom", - effect: "Bewegt Finger, um das Gehirn zu stimulieren. Wählt zufällig eine Attacke aus." - }, - "mirrorMove": { - name: "Spiegeltrick", - effect: "Kopiert die letzte Attacke des Zieles und greift es an." - }, - "selfDestruct": { - name: "Finale", - effect: "Anwender sprengt sich, richtet rundum Riesenschaden an und wird dabei besiegt." - }, - "eggBomb": { - name: "Eierbombe", - effect: "Ein großes Ei wird auf das Ziel abgefeuert, um ihm zu schaden." - }, - "lick": { - name: "Schlecker", - effect: "Leck-Attacke mit langer Zunge. Das Ziel wird eventuell paralysiert." - }, - "smog": { - name: "Smog", - effect: "Angriff mit Gas. Das Ziel kann eventuell vergiftet werden." - }, - "sludge": { - name: "Schlammbad", - effect: "Wirft Schlamm auf das Ziel. Dieses wird eventuell vergiftet." - }, - "boneClub": { - name: "Knochenkeule", - effect: "Schlägt das Ziel mit einer Keule und lässt es eventuell zurückschrecken." - }, - "fireBlast": { - name: "Feuersturm", - effect: "Feuersbrunst, die das Ziel versengt und ihm eventuell eine Verbrennung zufügt." - }, - "waterfall": { - name: "Kaskade", - effect: "Eine mächtige Attacke, durch die das Ziel eventuell zurückschreckt." - }, - "clamp": { - name: "Schnapper", - effect: "Fängt und quetscht das Ziel über vier bis fünf Runden durch die harte Schale des Anwenders." - }, - "swift": { - name: "Sternschauer", - effect: "Verschießt sternförmige Strahlen, die stets treffen, auf Ziele in der Umgebung." - }, - "skullBash": { - name: "Schädelwumme", - effect: "Der Anwender erhöht in Runde 1 seine Verteidigung und greift in Runde 2 an." - }, - "spikeCannon": { - name: "Dornkanone", - effect: "Spitze Nadeln treffen das Ziel zwei- bis fünfmal hintereinander." - }, - "constrict": { - name: "Umklammerung", - effect: "Angriff mit langen Tentakeln oder Ranken. Senkt eventuell den Initiative-Wert." - }, - "amnesia": { - name: "Amnesie", - effect: "Gedächtnisverlust, der die Spezial-Verteidigung stark erhöht." - }, - "kinesis": { - name: "Psykraft", - effect: "Lenkt Ziel durch Verbiegen eines Löffels ab. Senkt dessen Genauigkeit." - }, - "softBoiled": { - name: "Weichei", - effect: "KP des Anwenders werden um 50 % der maximalen KP aufgefüllt." - }, - "highJumpKick": { - name: "Turmkick", - effect: "Sprungtritt mit Knie. Bei Misserfolg verletzt sich der Anwender selbst." - }, - "glare": { - name: "Schlangenblick", - effect: "Schüchtert Ziel mit dem Muster auf seinem Bauch ein, sodass dieses paralysiert wird." - }, - "dreamEater": { - name: "Traumfresser", - effect: "Attacke gegen schlafendes Ziel. Die Hälfte des zugefügten Schadens wird dem Anwender gutgeschrieben." - }, - "poisonGas": { - name: "Giftwolke", - effect: "Hüllt Ziele in der Umgebung in Gas ein, das sie eventuell vergiftet." - }, - "barrage": { - name: "Stakkato", - effect: "Wirft zwei- bis fünfmal runde Gegenstände auf das Ziel." - }, - "leechLife": { - name: "Blutsauger", - effect: "Die Hälfte des zugefügten Schadens wird dem Anwender gutgeschrieben." - }, - "lovelyKiss": { - name: "Todeskuss", - effect: "Anwender zwingt dem Ziel einen Kuss auf, der Schlaf verursacht." - }, - "skyAttack": { - name: "Himmelsfeger", - effect: "Anwender greift in der zweiten Runde mit hoher Volltrefferquote an. Ziel schreckt eventuell zurück." - }, - "transform": { - name: "Wandler", - effect: "Anwender verwandelt sich in ein Abbild des Zieles und kann so auf die gleichen Attacken zugreifen." - }, - "bubble": { - name: "Blubber", - effect: "Angriff mit Blasen. Initiative-Wert des Zieles wird eventuell gesenkt." - }, - "dizzyPunch": { - name: "Irrschlag", - effect: "Rhythmische Schläge, die das Ziel verwirren können." - }, - "spore": { - name: "Pilzspore", - effect: "Erzeugt eine Wolke aus einschläfernden Sporen." - }, - "flash": { - name: "Blitz", - effect: "Erzeugt helles Licht, das die Genauigkeit des Zieles senkt." - }, - "psywave": { - name: "Psywelle", - effect: "Anwender erzeugt eine mysteriöse Energiewelle, deren Intensität von Mal zu Mal anders ausfällt." - }, - "splash": { - name: "Platscher", - effect: "Nur ein Platscher, der überhaupt nichts bewirkt." - }, - "acidArmor": { - name: "Säurepanzer", - effect: "Verflüssigt Körperzellen des Anwenders. Erhöht den Verteidigungs-Wert stark." - }, - "crabhammer": { - name: "Krabbhammer", - effect: "Schlägt mit Schere zu. Hohe Volltrefferquote." - }, - "explosion": { - name: "Explosion", - effect: "Anwender explodiert, richtet bei allen Pokémon in seiner Umgebung großen Schaden an und wird selbst kampfunfähig." - }, - "furySwipes": { - name: "Kratzfurie", - effect: "Beharkt das Ziel zwei- bis fünfmal mit scharfen Klauen oder Sicheln." - }, - "bonemerang": { - name: "Knochmerang", - effect: "Ein Bumerang aus Knochen, der zweimal trifft." - }, - "rest": { - name: "Erholung", - effect: "Anwender wird vollkommen geheilt und schläft die folgenden zwei Runden." - }, - "rockSlide": { - name: "Steinhagel", - effect: "Schleudert riesige Felsen auf Ziele in der Umgebung, die eventuell zurückschrecken." - }, - "hyperFang": { - name: "Hyperzahn", - effect: "Angriff mit scharfen Reißzähnen. Ziel schreckt eventuell zurück." - }, - "sharpen": { - name: "Schärfer", - effect: "Anwender senkt die Polygonzahl, um Kanten zu erzeugen, die den Angriffs-Wert erhöhen." - }, - "conversion": { - name: "Umwandlung", - effect: "Wandelt den Typ des Anwenders in den Typ der ersten Attacke des Anwenders um." - }, - "triAttack": { - name: "Triplette", - effect: "Feuert drei Strahlen ab. Verursacht eventuell Paralyse, Verbrennung oder Einfrieren." - }, - "superFang": { - name: "Superzahn", - effect: "Greift mit scharfen Reißzähnen an. KP des Zieles werden halbiert." - }, - "slash": { - name: "Schlitzer", - effect: "Hieb mit Klauen oder Ähnlichem. Hohe Volltrefferquote." - }, - "substitute": { - name: "Delegator", - effect: "Anwender setzt eine kleine Menge an KP ein, um einen Doppelgänger zu erzeugen, der für ihn Schläge einsteckt." - }, - "struggle": { - name: "Verzweifler", - effect: "Angriff nur bei verbrauchten AP. Anwender verletzt sich selbst leicht." - }, - "sketch": { - name: "Nachahmer", - effect: "Anwender lernt die letzte Attacke des Zieles dauerhaft. Nachahmer verschwindet nach Gebrauch." - }, - "tripleKick": { - name: "Dreifachkick", - effect: "Tritt das Ziel ein- bis dreimal nacheinander. Die Härte der Tritte nimmt von Treffer zu Treffer zu." - }, - "thief": { - name: "Raub", - effect: "Erlaubt es, das Item des Zieles zu stehlen, solang der Anwender selbst keins bei sich trägt." - }, - "spiderWeb": { - name: "Spinnennetz", - effect: "Wickelt das Ziel ein. Flucht oder Tausch unmöglich." - }, - "mindReader": { - name: "Willensleser", - effect: "Ahnt Bewegungen des Zieles voraus, um zu gewährleisten, dass die nächste eigene Attacke trifft." - }, - "nightmare": { - name: "Nachtmahr", - effect: "Dem schlafenden Ziel wird durch einen Alptraum in jeder Runde Schaden zugefügt, solang es schläft." - }, - "flameWheel": { - name: "Flammenrad", - effect: "Feuer-Attacke, die das Ziel eventuell verbrennt." - }, - "snore": { - name: "Schnarcher", - effect: "Attacke nur im Schlaf möglich. Ziel schreckt eventuell zurück." - }, - "curse": { - name: "Fluch", - effect: "Attacke, deren Wirkung davon abhängt, ob der Anwender ein Geist-Pokémon ist." - }, - "flail": { - name: "Dreschflegel", - effect: "Attacke richtet mehr Schaden an, wenn eigene KP niedrig sind." - }, - "conversion2": { - name: "Umwandlung2", - effect: "Anwender ändert Typ und wird gegen letzten Angriffstyp resistent." - }, - "aeroblast": { - name: "Luftstoß", - effect: "Erzeugt Luftstrudel gegen das Ziel. Hohe Volltrefferquote." - }, - "cottonSpore": { - name: "Baumwollsaat", - effect: "Wattebäusche heften sich an das Ziel. Der Initiative-Wert sinkt stark." - }, - "reversal": { - name: "Gegenschlag", - effect: "Richtet mehr Schaden an, wenn eigene KP niedrig sind." - }, - "spite": { - name: "Groll", - effect: "AP der letzten Attacke des Zieles werden um 4 gesenkt." - }, - "powderSnow": { - name: "Pulverschnee", - effect: "Angriff mit Schnee. Das Ziel wird eventuell eingefroren." - }, - "protect": { - name: "Schutzschild", - effect: "Anwender weicht jeder Attacke aus. Scheitert eventuell bei Wiederholung." - }, - "machPunch": { - name: "Tempohieb", - effect: "Extrem schneller Hieb, der stets zuerst trifft." - }, - "scaryFace": { - name: "Grimasse", - effect: "Jagt dem Ziel mit einer Grimasse Angst ein. Dessen Initiative-Wert sinkt stark." - }, - "feintAttack": { - name: "Finte", - effect: "Anwender nähert sich mit Unschuldsmiene dem Ziel und schlägt zu, sobald dieses unachtsam wird. Ein Treffer ist gewiss." - }, - "sweetKiss": { - name: "Bitterkuss", - effect: "Anwender küsst das Ziel, das durch diese Niedlichkeit verwirrt wird." - }, - "bellyDrum": { - name: "Bauchtrommel", - effect: "Der Anwender maximiert den Angriffs-Wert auf Kosten der Hälfte seiner maximalen KP." - }, - "sludgeBomb": { - name: "Matschbombe", - effect: "Wirft Schlamm auf das Ziel. Dieses wird eventuell vergiftet." - }, - "mudSlap": { - name: "Lehmschelle", - effect: "Schadet dem Ziel durch Matsch. Dessen Genauigkeit sinkt." - }, - "octazooka": { - name: "Octazooka", - effect: "Schießt mit Tinte, um Schaden anzurichten und die Genauigkeit zu senken." - }, - "spikes": { - name: "Stachler", - effect: "Der Anwender verteilt Stacheln, die gegnerische Pokémon verletzen, die in den Kampf gerufen werden." - }, - "zapCannon": { - name: "Blitzkanone", - effect: "Kanonenähnlicher Elektro-Schuss, der schadet und paralysiert." - }, - "foresight": { - name: "Scharfblick", - effect: "Erlaubt es, Geist-Pokémon mit Normal- und Kampf-Attacken anzugreifen. Ignoriert den Fluchtwert des Zieles." - }, - "destinyBond": { - name: "Abgangsbund", - effect: "Wird der Anwender nach Einsatz dieser Attacke besiegt, führt dies auch beim Ziel zum K.O." - }, - "perishSong": { - name: "Abgesang", - effect: "Wer diese Musik hört, wird nach drei Runden besiegt. Rettung ist durch den Eintausch eines neuen Pokémon möglich." - }, - "icyWind": { - name: "Eissturm", - effect: "Eis-Attacke, die dem Ziel Schaden zufügt und seinen Initiative-Wert senkt." - }, - "detect": { - name: "Scanner", - effect: "Anwender weicht jeder Attacke aus. Scheitert eventuell bei Wiederholung." - }, - "boneRush": { - name: "Knochenhatz", - effect: "Greift Ziel zwei- bis fünfmal in Folge mit einem harten Knochen an." - }, - "lockOn": { - name: "Zielschuss", - effect: "Visiert das Ziel an und trifft in der nächsten Runde garantiert." - }, - "outrage": { - name: "Wutanfall", - effect: "Attacke über zwei bis drei Runden, die den Anwender verwirrt." - }, - "sandstorm": { - name: "Sandsturm", - effect: "Sandsturm für fünf Runden. Fügt Pokémon von jedem Typ außer Gestein, Boden und Stahl Schaden zu." - }, - "gigaDrain": { - name: "Gigasauger", - effect: "Das Ziel wird angegriffen und die Hälfte des zugefügten Schadens dem Angreifer als KP gutgeschrieben." - }, - "endure": { - name: "Ausdauer", - effect: "Nach fatalen Attacken bleibt stets 1 KP übrig. Misserfolg bei Wiederholung möglich." - }, - "charm": { - name: "Charme", - effect: "Betört das Ziel und reduziert dessen Angriffs-Wert stark." - }, - "rollout": { - name: "Walzer", - effect: "Attacke, die fünf Runden dauert. Die Härte nimmt von Mal zu Mal zu." - }, - "falseSwipe": { - name: "Trugschlag", - effect: "Ein Angriff, der dem Ziel zumindest 1 KP lässt." - }, - "swagger": { - name: "Angeberei", - effect: "Verwirrt das Ziel und erhöht dessen Angriffs-Wert stark." - }, - "milkDrink": { - name: "Milchgetränk", - effect: "KP des Anwenders werden um 50 % der maximalen KP aufgefüllt." - }, - "spark": { - name: "Funkensprung", - effect: "Elektro-Hieb, der das Ziel paralysieren kann." - }, - "furyCutter": { - name: "Zornklinge", - effect: "Eine Attacke mit Scheren oder Klauen, deren Härte bei aufeinanderfolgenden Treffern zunimmt." - }, - "steelWing": { - name: "Stahlflügel", - effect: "Trifft das Ziel mit Stahlflügeln. Verteidigungs-Wert des Anwenders steigt eventuell." - }, - "meanLook": { - name: "Horrorblick", - effect: "Böser Blick, der die Flucht des Zieles vereitelt." - }, - "attract": { - name: "Anziehung", - effect: "Angriff auf Anwender vom anderen Geschlecht wird unwahrscheinlich." - }, - "sleepTalk": { - name: "Schlafrede", - effect: "Anwender setzt per Zufall eine ihm bekannte Attacke im Schlaf ein." - }, - "healBell": { - name: "Vitalglocke", - effect: "Läutet beruhigend und heilt alle Statusprobleme im Team." - }, - "return": { - name: "Rückkehr", - effect: "Angriff, dessen Kraft bei Freundschaft zum Trainer größer wird." - }, - "present": { - name: "Geschenk", - effect: "Eine Bombe als Geschenk. Kann auch KP des Zieles wiederherstellen." - }, - "frustration": { - name: "Frustration", - effect: "Die Attacke wird stärker, je weniger der Anwender seinen Trainer mag." - }, - "safeguard": { - name: "Bodyguard", - effect: "Team des Anwenders ist fünf Runden vor Statusproblemen geschützt." - }, - "painSplit": { - name: "Leidteiler", - effect: "Addiert KP von Anwender und Ziel. Teilt sie gerecht auf." - }, - "sacredFire": { - name: "Läuterfeuer", - effect: "Mystische Feuer-Attacke, durch die das Ziel eventuell Verbrennungen erleidet." - }, - "magnitude": { - name: "Intensität", - effect: "Erdbebenartiger Angriff von zufälliger Stärke gegen andere Pokémon in der Umgebung des Anwenders." - }, - "dynamicPunch": { - name: "Wuchtschlag", - effect: "Kräftiger Schlag, der das Ziel bei Erfolg verwirrt." - }, - "megahorn": { - name: "Vielender", - effect: "Brutaler Ramm-Angriff mit spitzem, beeindruckendem Horn." - }, - "dragonBreath": { - name: "Feuerodem", - effect: "Fegt das Ziel mit zerstörerisch heißem Atem weg. Paralysiert das Ziel eventuell." - }, - "batonPass": { - name: "Stafette", - effect: "Tauscht das eigene Pokémon aus. Alle Statusveränderungen bleiben bestehen." - }, - "encore": { - name: "Zugabe", - effect: "Das Ziel wiederholt die letzte Attacke drei Runden lang." - }, - "pursuit": { - name: "Verfolgung", - effect: "Die Attacke richtet beim Ziel doppelten Schaden an, falls es ausgetauscht wird." - }, - "rapidSpin": { - name: "Turbodreher", - effect: "Trifft das Ziel mit einer Dreh-Attacke. Befreit sich unter anderem von Wickel, Klammergriff, Egelsamen und Stachler." - }, - "sweetScent": { - name: "Lockduft", - effect: "Lockt Ziele an und senkt deren Fluchtwert. Lockt im Gras auch wilde Pokémon an." - }, - "ironTail": { - name: "Eisenschweif", - effect: "Attacke mit hartem Eisenschweif. Senkt eventuell den Verteidigungs-Wert des Zieles." - }, - "metalClaw": { - name: "Metallklaue", - effect: "Klauen-Attacke, die eventuell den Angriffs-Wert des Anwenders erhöht." - }, - "vitalThrow": { - name: "Überwurf", - effect: "Anwender greift als Letzter an, hat dafür aber eine Treffergarantie beim eigenen Angriff." - }, - "morningSun": { - name: "Morgengrauen", - effect: "Füllt KP des Anwenders auf. Die Menge hängt vom Wetter ab." - }, - "synthesis": { - name: "Synthese", - effect: "Füllt KP des Anwenders auf. Die Menge hängt vom Wetter ab." - }, - "moonlight": { - name: "Mondschein", - effect: "Füllt KP des Anwenders auf. Die Menge hängt vom Wetter ab." - }, - "hiddenPower": { - name: "Kraftreserve", - effect: "Wirkung und Typ der Attacke hängen vom Anwender ab." - }, - "crossChop": { - name: "Kreuzhieb", - effect: "Doppelter Hieb mit den Unterarmen. Hohe Volltrefferquote." - }, - "twister": { - name: "Windhose", - effect: "Trifft Ziele in der Umgebung mit einem heftigen Wirbelsturm, was diese eventuell zurückschrecken lässt." - }, - "rainDance": { - name: "Regentanz", - effect: "Anwender erzeugt starken Regen. Die Stärke von Wasser-Attacken erhöht sich fünf Runden lang." - }, - "sunnyDay": { - name: "Sonnentag", - effect: "Die Sonne brennt unbarmherzig fünf Runden lang. Dadurch werden Attacken vom Typ Feuer verstärkt." - }, - "crunch": { - name: "Knirscher", - effect: "Beißt mit scharfen Reißzähnen zu und senkt eventuell die Verteidigung." - }, - "mirrorCoat": { - name: "Spiegelcape", - effect: "Kontert den Spezial-Angriff des Gegners mit doppeltem Schaden." - }, - "psychUp": { - name: "Psycho-Plus", - effect: "Der Anwender hypnotisiert sich selbst, um die Statusveränderungen des Zieles zu kopieren." - }, - "extremeSpeed": { - name: "Turbotempo", - effect: "Extrem schnelle und kraftvolle Attacke, die stets zuerst trifft." - }, - "ancientPower": { - name: "Antik-Kraft", - effect: "Angriff mit antiker Kraft, der alle Statuswerte erhöhen kann." - }, - "shadowBall": { - name: "Spukball", - effect: "Bewirft das Ziel mit gruseligem Ball und senkt eventuell die Spezial-Verteidigung." - }, - "futureSight": { - name: "Seher", - effect: "Zwei Runden, nachdem Seher eingesetzt wurde, erfolgt der Angriff." - }, - "rockSmash": { - name: "Zertrümmerer", - effect: "Diese steinbrechende Attacke kann den Verteidigungs-Wert des Zieles senken und außerhalb von Kämpfen rissige Felsen zertrümmern." - }, - "whirlpool": { - name: "Whirlpool", - effect: "Das Ziel wird für vier bis fünf Runden in einer Wasserhose gefangen." - }, - "beatUp": { - name: "Prügler", - effect: "Das gesamte Team nimmt aktiv am Kampf teil. Je mehr Pokémon, desto höher die Anzahl der Angriffe." - }, - "fakeOut": { - name: "Mogelhieb", - effect: "Diese Attacke trifft zuerst. Das Ziel schreckt zurück. Gelingt nur in der ersten Runde eines Kampfes." - }, - "uproar": { - name: "Aufruhr", - effect: "Anwender greift an, indem er über drei Runden hinweg einen Aufruhr erzeugt. Verhindert Schlaf." - }, - "stockpile": { - name: "Horter", - effect: "Lädt Kraft für später auf. Erhöht Verteidigung und Spezial-Verteidigung. Kann bis zu dreimal eingesetzt werden." - }, - "spitUp": { - name: "Entfessler", - effect: "Entlädt die Kraft, die während des Einsatzes von Horter gesammelt wurde." - }, - "swallow": { - name: "Verzehrer", - effect: "Absorbiert die gehortete Kraft, um KP aufzufüllen." - }, - "heatWave": { - name: "Hitzewelle", - effect: "Ziele werden von Sturm aus heißer Luft getroffen und verbrennen sich eventuell." - }, - "hail": { - name: "Hagelsturm", - effect: "Hagelsturm für fünf Runden. Schadet allen, außer Eis-Pokémon." - }, - "torment": { - name: "Folterknecht", - effect: "Erzürnt das Ziel, um wiederholten Einsatz derselben Attacke zu verhindern." - }, - "flatter": { - name: "Schmeichler", - effect: "Schmeichelt dem Ziel, um es zu verwirren. Erhöht dessen Spezial-Angriff." - }, - "willOWisp": { - name: "Irrlicht", - effect: "Angriff mit unheimlicher Flamme, die das Ziel verbrennt." - }, - "memento": { - name: "Memento-Mori", - effect: "Der Anwender wird besiegt und senkt den Angriffs-Wert und den Spezial-Angriff des Zieles stark." - }, - "facade": { - name: "Fassade", - effect: "Doppelte Stärke nach Verbrennung, Paralyse oder Vergiftung." - }, - "focusPunch": { - name: "Power-Punch", - effect: "Anwender konzentriert sich, bevor er angreift. Wird er vorher getroffen, ist die Attacke erfolglos." - }, - "smellingSalts": { - name: "Riechsalz", - effect: "Doppelt wirksam gegen paralysierte Ziele, heilt sie aber auch von der Paralyse." - }, - "followMe": { - name: "Spotlight", - effect: "Zieht Aufmerksamkeit auf sich. Gegner greift nur Anwender an." - }, - "naturePower": { - name: "Natur-Kraft", - effect: "Angriff mit der Kraft der Natur, dessen Typ vom Ort abhängt, wo er durchgeführt wird." - }, - "charge": { - name: "Ladevorgang", - effect: "Lädt Energie für die kommende Elektro-Attacke auf. Erhöht die Spezial-Verteidigung." - }, - "taunt": { - name: "Verhöhner", - effect: "Bringt das Ziel in Rage. Dieses kann über drei Runden hinweg nur noch angreifen." - }, - "helpingHand": { - name: "Rechte Hand", - effect: "Anwender steigert die Kraft eines Angriffes eines Freundes." - }, - "trick": { - name: "Trickbetrug", - effect: "Der Anwender überrumpelt das Ziel und tauscht mit ihm die getragenen Items." - }, - "rolePlay": { - name: "Rollenspiel", - effect: "Parodiert das Ziel und kopiert seine Fähigkeit." - }, - "wish": { - name: "Wunschtraum", - effect: "Ein Wunsch füllt in der nächsten Runde 50 % der KP des Anwenders bei diesem oder einem eingewechselten Pokémon auf." - }, - "assist": { - name: "Zuschuss", - effect: "Greift zufällig mit einer Attacke eines Mitstreiters an." - }, - "ingrain": { - name: "Verwurzler", - effect: "Verwurzelung füllt jede Runde KP auf. Austausch ist unmöglich." - }, - "superpower": { - name: "Kraftkoloss", - effect: "Starke Attacke, die jedoch auch den Angriff und die Verteidigung des Anwenders senkt." - }, - "magicCoat": { - name: "Magiemantel", - effect: "Egelsamen und alle Attacken mit Status verändernden Effekten prallen ab." - }, - "recycle": { - name: "Aufbereitung", - effect: "Recycling eines getragenen Items, das zuvor im Kampf verwendet wurde." - }, - "revenge": { - name: "Vergeltung", - effect: "Schaden verdoppelt sich, wenn der Anwender in der Runde bereits Schaden vom Ziel des Angriffes genommen hat." - }, - "brickBreak": { - name: "Durchbruch", - effect: "Ein beherzter Handkantenschlag. Durchbricht Barrieren wie Lichtschild und Reflektor." - }, - "yawn": { - name: "Gähner", - effect: "Angreifer gähnt und das Ziel schläft in der nächsten Runde ein." - }, - "knockOff": { - name: "Abschlag", - effect: "Schlägt das Item des Zieles weg und vereitelt so dessen Gebrauch während des Kampfes. Mehr Schaden gegen Ziele, die ein Item bei sich tragen." - }, - "endeavor": { - name: "Notsituation", - effect: "Trifft nur, wenn KP des Anwenders geringer als KP des Zieles sind. Senkt dessen KP auf die Höhe der KP des Anwenders." - }, - "eruption": { - name: "Eruption", - effect: "Explosiver Angriff. Je höher die KP des Anwenders sind, desto mehr Schaden wird angerichtet." - }, - "skillSwap": { - name: "Fähigkeitstausch", - effect: "Anwender tauscht Fähigkeit mit dem Ziel." - }, - "imprison": { - name: "Begrenzer", - effect: "Hindert Gegner am Einsatz von Attacken, die der Anwender selbst auch kennt." - }, - "refresh": { - name: "Heilung", - effect: "Selbstheilung bei Vergiftung, Paralyse und Verbrennung." - }, - "grudge": { - name: "Nachspiel", - effect: "Bei K.O. des Anwenders werden die AP der Attacke, durch die er besiegt wurde, auf 0 herabgesetzt." - }, - "snatch": { - name: "Übernahme", - effect: "Raubt den Effekt eingesetzter heilender oder Werte verändernder Attacken." - }, - "secretPower": { - name: "Geheimpower", - effect: "Angriff, der abhängig vom Anwendungsort einen unterschiedlichen Zusatz-Effekt hat." - }, - "dive": { - name: "Taucher", - effect: "Taucht in Runde 1 ab und greift in Runde 2 aus der Tiefe an." - }, - "armThrust": { - name: "Armstoß", - effect: "Schläge mit geradem Arm, die das Ziel zwei- bis fünfmal treffen." - }, - "camouflage": { - name: "Tarnung", - effect: "Der Typ des Anwenders passt sich der Umgebung an, sei es im Wasser, im Gras oder in einer Höhle." - }, - "tailGlow": { - name: "Schweifglanz", - effect: "Ein blinkendes Licht, das den Spezial-Angriff drastisch erhöht." - }, - "lusterPurge": { - name: "Scheinwerfer", - effect: "Angriff mit grellem Licht, der die Spezial-Verteidigung des Zieles eventuell senkt." - }, - "mistBall": { - name: "Nebelball", - effect: "Angriff mit einer Kugel aus Wasser, die Nebel enthält. Senkt eventuell den Spezial-Angriff des Zieles." - }, - "featherDance": { - name: "Daunenreigen", - effect: "Hüllt das Ziel in Daunen und senkt dessen Angriffs-Wert stark." - }, - "teeterDance": { - name: "Taumeltanz", - effect: "Ein Wackeltanz, der andere Pokémon in der Umgebung des Anwenders verwirrt." - }, - "blazeKick": { - name: "Feuerfeger", - effect: "Starker Tritt mit hoher Volltrefferquote. Verursacht eventuell Verbrennung." - }, - "mudSport": { - name: "Lehmsuhler", - effect: "Schwächt Elektro-Attacken, solang der Anwender am Kampf teilnimmt." - }, - "iceBall": { - name: "Frostbeule", - effect: "Attacke, die fünf Runden dauert. Die Härte nimmt von Mal zu Mal zu." - }, - "needleArm": { - name: "Nietenranke", - effect: "Angriff mit dornigen Armen. Das Ziel schreckt eventuell zurück." - }, - "slackOff": { - name: "Tagedieb", - effect: "Durch Müßiggang werden KP des Anwenders um 50 % der maximalen KP aufgefüllt." - }, - "hyperVoice": { - name: "Schallwelle", - effect: "Laute Attacke mit Schallwellen." - }, - "poisonFang": { - name: "Giftzahn", - effect: "Angriff mit giftigen Reißzähnen. Das Ziel wird eventuell schwer vergiftet." - }, - "crushClaw": { - name: "Zermalmklaue", - effect: "Angriff mit scharfen Klauen. Senkt eventuell den Verteidigungs-Wert." - }, - "blastBurn": { - name: "Lohekanonade", - effect: "Das Ziel wird von starker Explosion getroffen. Angreifer setzt eine Runde aus." - }, - "hydroCannon": { - name: "Aquahaubitze", - effect: "Das Ziel wird von Wasserkanone getroffen. Angreifer setzt eine Runde aus." - }, - "meteorMash": { - name: "Sternenhieb", - effect: "Angriff mit einem harten, schnellen Schlag. Erhöht eventuell Angriffs-Wert des Anwenders." - }, - "astonish": { - name: "Erstauner", - effect: "Anwender greift mit einem Schrei an. Ein Angriff, der das Ziel eventuell zurückschrecken lässt." - }, - "weatherBall": { - name: "Meteorologe", - effect: "Typ und Stärke der Attacke sind vom Wetter zum Zeitpunkt der Anwendung abhängig." - }, - "aromatherapy": { - name: "Aromakur", - effect: "Heilt alle Statusprobleme des Teams mit beruhigendem Duft." - }, - "fakeTears": { - name: "Trugträne", - effect: "Täuscht Weinen vor, um die Spezial-Verteidigung des Zieles stark zu senken." - }, - "airCutter": { - name: "Windschnitt", - effect: "Greift mit rasierklingenartigem Wind an. Hohe Volltrefferquote." - }, - "overheat": { - name: "Hitzekoller", - effect: "Angriff mit voller Kraft, der den Spezial-Angriff des Anwenders durch den Rückstoß stark senkt." - }, - "odorSleuth": { - name: "Schnüffler", - effect: "Erlaubt es, Geist-Pokémon mit Normal- und Kampf-Attacken anzugreifen. Ignoriert den Fluchtwert des Zieles." - }, - "rockTomb": { - name: "Felsgrab", - effect: "Angriff mit Felsen. Bei Erfolg wird der Initiative-Wert des Zieles gesenkt." - }, - "silverWind": { - name: "Silberhauch", - effect: "Angriff mit Silberstaub. Eventuell werden alle Statuswerte des Anwenders erhöht." - }, - "metalSound": { - name: "Metallsound", - effect: "Stößt einen spitzen Schrei aus, der die Spezial-Verteidigung des Zieles stark senkt." - }, - "grassWhistle": { - name: "Grasflöte", - effect: "Versetzt das Ziel durch eine schöne Melodie in Tiefschlaf." - }, - "tickle": { - name: "Spaßkanone", - effect: "Bringt das Ziel zum Lachen und senkt dadurch dessen Angriff und Verteidigung." - }, - "cosmicPower": { - name: "Kosmik-Kraft", - effect: "Erhöht Verteidigung und Spezial-Verteidigung durch eine mystische Kraft." - }, - "waterSpout": { - name: "Fontränen", - effect: "Wasser-Attacke, die wirkungsvoller ist, wenn KP des Anwenders hoch sind." - }, - "signalBeam": { - name: "Ampelleuchte", - effect: "Strahlenattacke, die das Ziel eventuell verwirrt." - }, - "shadowPunch": { - name: "Finsterfaust", - effect: "Angriff mit der Faust aus dem Schattenreich. Ausweichen unmöglich." - }, - "extrasensory": { - name: "Sondersensor", - effect: "Besonderer Angriff mit einer unsichtbaren Kraft, die das Ziel eventuell zurückschrecken lässt." - }, - "skyUppercut": { - name: "Himmelhieb", - effect: "Kinnhaken, der das Ziel gen Himmel schickt." - }, - "sandTomb": { - name: "Sandgrab", - effect: "Das Ziel leidet für vier bis fünf Runden in einer Sandhose." - }, - "sheerCold": { - name: "Eiseskälte", - effect: "Angriff mit Kälte, die das Ziel bei Erfolg besiegt." - }, - "muddyWater": { - name: "Lehmbrühe", - effect: "Greift mit Matsch an und senkt eventuell die Genauigkeit des Zieles." - }, - "bulletSeed": { - name: "Kugelsaat", - effect: "Der Anwender wirft zwei- bis fünfmal in rascher Folge Samen auf das Ziel." - }, - "aerialAce": { - name: "Aero-Ass", - effect: "Eine extrem schnelle Attacke, der das Ziel nicht ausweichen kann." - }, - "icicleSpear": { - name: "Eisspeer", - effect: "Feuert zwei bis fünf Eiszapfen auf das Ziel." - }, - "ironDefense": { - name: "Eisenabwehr", - effect: "Anwender stärkt den Körper, um den Verteidigungs-Wert stark zu erhöhen." - }, - "block": { - name: "Rückentzug", - effect: "Anwender versperrt den Fluchtweg des Zieles." - }, - "howl": { - name: "Jauler", - effect: "Anwender jault, um seinen Kampfgeist und seinen Angriffs-Wert zu erhöhen." - }, - "dragonClaw": { - name: "Drachenklaue", - effect: "Das Ziel wird mit riesigen, scharfen Klauen stark verletzt." - }, - "frenzyPlant": { - name: "Flora-Statue", - effect: "Angriff mit dickem Ast. Der Angreifer muss eine Runde aussetzen." - }, - "bulkUp": { - name: "Protzer", - effect: "Pumpt den Körper auf, um den Angriff und die Verteidigung zu erhöhen." - }, - "bounce": { - name: "Sprungfeder", - effect: "Angreifer springt und landet in der nächsten Runde auf dem Ziel. Das Ziel wird eventuell paralysiert." - }, - "mudShot": { - name: "Lehmschuss", - effect: "Angriff mit Lehm, der den Initiative-Wert des Zieles senkt." - }, - "poisonTail": { - name: "Giftschweif", - effect: "Angriff mit hoher Volltrefferquote. Diese Schweifattacke vergiftet das Ziel eventuell." - }, - "covet": { - name: "Bezirzer", - effect: "Bittet charmant um das getragene Item des Zieles und stiehlt es dann." - }, - "voltTackle": { - name: "Volttackle", - effect: "Angriff mit Elektro-Tackle. Der Anwender verletzt sich dabei. Das Ziel wird eventuell paralysiert." - }, - "magicalLeaf": { - name: "Zauberblatt", - effect: "Magischer Blattangriff, dem nicht auszuweichen ist." - }, - "waterSport": { - name: "Nassmacher", - effect: "Der Anwender lässt Wasser herabregnen und schwächt damit fünf Runden lang Feuer-Attacken." - }, - "calmMind": { - name: "Gedankengut", - effect: "Erhöht Spezial-Angriff und Spezial-Verteidigung durch Konzentration." - }, - "leafBlade": { - name: "Laubklinge", - effect: "Hieb mit scharfkantigem Blatt. Hohe Volltrefferquote." - }, - "dragonDance": { - name: "Drachentanz", - effect: "Ein mystischer Tanz, der den Angriffs- und Initiative-Wert erhöht." - }, - "rockBlast": { - name: "Felswurf", - effect: "Wirft zwei- bis fünfmal in Folge Felsblöcke auf das Ziel." - }, - "shockWave": { - name: "Schockwelle", - effect: "Angriff mit schnellem Elektro-Schlag. Ausweichen nicht möglich." - }, - "waterPulse": { - name: "Aquawelle", - effect: "Angriff mit Wasserwelle, die das Ziel eventuell verwirren kann." - }, - "doomDesire": { - name: "Kismetwunsch", - effect: "Angriff mit gebündeltem Licht erfolgt zwei Runden nach Attackeneinsatz." - }, - "psychoBoost": { - name: "Psyschub", - effect: "Angriff mit voller Kraft, der den Spezial-Angriff des Anwenders durch den Rückstoß stark senkt." - }, - "roost": { - name: "Ruheort", - effect: "Anwender landet und ruht sich aus. KP des Anwenders werden um 50 % der maximalen KP aufgefüllt." - }, - "gravity": { - name: "Erdanziehung", - effect: "Die Gravitation wird für fünf Runden erhöht. Macht Fliegen unmöglich und verhindert Schwebe." - }, - "miracleEye": { - name: "Wunderauge", - effect: "Erlaubt es, Unlicht-Pokémon mit Psycho-Attacken anzugreifen. Ignoriert den Fluchtwert des Zieles." - }, - "wakeUpSlap": { - name: "Weckruf", - effect: "Richtet großen Schaden bei einem schlafenden Ziel an, weckt es aber auch auf." - }, - "hammerArm": { - name: "Hammerarm", - effect: "Anwender trifft mit einem starken Hieb. Senkt Initiative des Anwenders." - }, - "gyroBall": { - name: "Gyroball", - effect: "Angriff mit hoher Geschwindigkeit. Je niedriger die Initiative des Anwenders, desto höher der Schaden." - }, - "healingWish": { - name: "Heilopfer", - effect: "Anwender geht K.O. Das an seine Stelle tretende Pokémon hat volle KP. Statusprobleme werden geheilt." - }, - "brine": { - name: "Lake", - effect: "Hat das Ziel die Hälfte oder weniger seiner maximalen KP, trifft diese Attacke mit doppelter Kraft." - }, - "naturalGift": { - name: "Beerenkräfte", - effect: "Anwender zieht aus seiner derzeitigen Beere Kraft. Sie bestimmt Typ und Stärke der Attacke." - }, - "feint": { - name: "Offenlegung", - effect: "Ziele, die Schutzschild oder Scanner verwenden, werden getroffen. Entfernt Effekte dieser Attacken." - }, - "pluck": { - name: "Pflücker", - effect: "Anwender pickt das Ziel, nimmt die Beere, falls das Ziel eine trägt, und erhält ihren Effekt." - }, - "tailwind": { - name: "Rückenwind", - effect: "Anwender erzeugt einen Wirbelwind, der die Initiative aller Pokémon im Team für vier Runden steigert." - }, - "acupressure": { - name: "Akupressur", - effect: "Anwender erhöht Druck auf Stresspunkte und steigert einen Statuswert stark." - }, - "metalBurst": { - name: "Metallstoß", - effect: "Attacke mit großer Kraft gegen das Ziel, das dem Anwender in derselben Runde zuletzt Schaden zufügte." - }, - "uTurn": { - name: "Kehrtwende", - effect: "Nach der Attacke eilt der Anwender zurück und tauscht den Platz mit einem anderen Pokémon." - }, - "closeCombat": { - name: "Nahkampf", - effect: "Nahkampf-Attacke ohne Rücksicht auf Verluste. Senkt Verteidigung und Spezial-Verteidigung des Anwenders." - }, - "payback": { - name: "Gegenstoß", - effect: "Der Anwender lädt die Attacke auf. Handelt das Ziel vor dem Anwender, verdoppelt sich die Kraft der Attacke." - }, - "assurance": { - name: "Gewissheit", - effect: "Hat das Ziel während der Runde schon Schaden genommen, wird die Kraft der Attacke verdoppelt." - }, - "embargo": { - name: "Itemsperre", - effect: "Verhindert, dass auf das Ziel Items verwendet werden." - }, - "fling": { - name: "Schleuder", - effect: "Anwender schleudert sein Item auf das Ziel. Kraft und Effekt der Attacke hängen vom Item ab." - }, - "psychoShift": { - name: "Psybann", - effect: "Anwender nutzt seine Suggestivkräfte, um eigene Statusprobleme auf das Ziel zu transferieren." - }, - "trumpCard": { - name: "Trumpfkarte", - effect: "Je weniger AP diese Attacke hat, desto mehr Angriffskraft besitzt sie." - }, - "healBlock": { - name: "Heilblockade", - effect: "Anwender verhindert für fünf Runden, dass Ziele durch Attacken, Fähigkeiten oder Items KP regenerieren." - }, - "wringOut": { - name: "Auswringen", - effect: "Anwender presst sein Ziel aus. Je höher die KP des Zieles, desto kraftvoller die Attacke." - }, - "powerTrick": { - name: "Krafttrick", - effect: "Anwender setzt Psycho-Kräfte ein, um eigenen Angriffs- mit Verteidigungs-Wert auszutauschen." - }, - "gastroAcid": { - name: "Magensäfte", - effect: "Anwender greift das Ziel mit eigenen Magensäften an. Entfernt Effekte von dessen Fähigkeit." - }, - "luckyChant": { - name: "Beschwörung", - effect: "Anwender singt eine Beschwörungsformel, die Volltreffer gegen ihn verhindert." - }, - "meFirst": { - name: "Egotrip", - effect: "Anwender stiehlt und führt die Attacke eines langsameren Zieles zuerst und mit größerer Kraft aus." - }, - "copycat": { - name: "Imitator", - effect: "Anwender imitiert gerade verwendete Attacke. Dies schlägt fehl, falls zuvor keine Attacke verwendet wurde." - }, - "powerSwap": { - name: "Krafttausch", - effect: "Psychische Kräfte tauschen Änderungen an Angriff und Spezial-Angriff mit denen des Zieles." - }, - "guardSwap": { - name: "Schutztausch", - effect: "Psychische Kräfte tauschen Änderungen an Verteidigung und Spezial-Verteidigung mit denen des Zieles." - }, - "punishment": { - name: "Strafattacke", - effect: "Je stärker das Ziel durch Statusveränderungen ist, desto stärker wirkt diese Attacke." - }, - "lastResort": { - name: "Zuflucht", - effect: "Diese Attacke kann nur eingesetzt werden, nachdem alle verfügbaren Attacken ausgeführt worden sind." - }, - "worrySeed": { - name: "Sorgensamen", - effect: "Ziel wird bepflanzt. Wandelt Fähigkeit in Insomnia um. Verhindert so Schlaf." - }, - "suckerPunch": { - name: "Tiefschlag", - effect: "Ermöglicht den Erstschlag. Gelingt aber nur, wenn das Ziel gerade eine Attacke vorbereitet." - }, - "toxicSpikes": { - name: "Giftspitzen", - effect: "Anwender legt eine Falle mit Giftdornen aus. In den Kampf eingewechselte gegnerische Pokémon werden vergiftet." - }, - "heartSwap": { - name: "Statustausch", - effect: "Anwender setzt Psycho-Kräfte ein, um Statusveränderungen des Zieles mit den eigenen zu tauschen." - }, - "aquaRing": { - name: "Wasserring", - effect: "Anwender umgibt sich mit einem Schleier aus Wasser. Dabei regeneriert er einige KP pro Runde." - }, - "magnetRise": { - name: "Magnetflug", - effect: "Anwender schwebt für fünf Runden durch elektrisch erzeugten Magnetismus." - }, - "flareBlitz": { - name: "Flammenblitz", - effect: "Anwender hüllt sich in Flammen und stürmt auf das Ziel zu, das sich eventuell verbrennt. Anwender nimmt selbst großen Schaden." - }, - "forcePalm": { - name: "Kraftwelle", - effect: "Das Ziel wird mit einer Schockwelle angegriffen, die es eventuell paralysiert." - }, - "auraSphere": { - name: "Aurasphäre", - effect: "Tief aus dem Inneren des Anwenders löst sich ein kraftvoller Stoß Auraenergie. Trifft in jedem Fall." - }, - "rockPolish": { - name: "Steinpolitur", - effect: "Anwender reduziert so gut wie möglich den Luftwiderstand. Kann Initiative-Wert stark steigern." - }, - "poisonJab": { - name: "Gifthieb", - effect: "Ziel wird mit vergiftetem Arm oder Tentakel verletzt. Es wird dabei eventuell vergiftet." - }, - "darkPulse": { - name: "Finsteraura", - effect: "Anwender greift mit fürchterlicher Aura schlechter Gedanken an. Ziel schreckt eventuell zurück." - }, - "nightSlash": { - name: "Nachthieb", - effect: "Anwender greift bei der ersten Gelegenheit mit scharfen Klauen an. Hohe Volltrefferquote." - }, - "aquaTail": { - name: "Nassschweif", - effect: "Anwender attackiert mit dem Schweif, als ob dieser eine brutale Welle in einem tosenden Sturm sei." - }, - "seedBomb": { - name: "Samenbomben", - effect: "Anwender lässt eine Menge Samen mit harter Schale von oben auf das Ziel fallen." - }, - "airSlash": { - name: "Luftschnitt", - effect: "Das Ziel wird mit einer Luftklinge angegriffen. Ziel schreckt eventuell zurück." - }, - "xScissor": { - name: "Kreuzschere", - effect: "Der Anwender führt eine Attacke aus, die einer Scherenbewegung ähnelt." - }, - "bugBuzz": { - name: "Käfergebrumm", - effect: "Anwender schlägt mit den Flügeln und erzeugt eine Schockwelle. Senkt eventuell Spezial-Verteidigung des Zieles." - }, - "dragonPulse": { - name: "Drachenpuls", - effect: "Das Ziel wird mit einer Schockwelle angegriffen, die aus dem offenen Maul des Anwenders kommt." - }, - "dragonRush": { - name: "Drachenstoß", - effect: "Anwender führt einen gefährlichen Angriff aus. Das Ziel schreckt eventuell zurück." - }, - "powerGem": { - name: "Juwelenkraft", - effect: "Anwender attackiert mit einem Lichtstrahl, der funkelt, als sei er aus Juwelen." - }, - "drainPunch": { - name: "Ableithieb", - effect: "Entzieht dem Ziel Energie. Die Hälfte des Schadens wird den KP des Anwenders zugerechnet." - }, - "vacuumWave": { - name: "Vakuumwelle", - effect: "Ein Faustwirbel sendet eine Vakuumwelle auf das Ziel. Erstschlaggarantie." - }, - "focusBlast": { - name: "Fokusstoß", - effect: "Anwender erhöht seinen mentalen Fokus und greift dann an. Senkt eventuell Spezial-Verteidigung des Zieles." - }, - "energyBall": { - name: "Energieball", - effect: "Anwender zieht Kraft aus der Natur und feuert sie auf das Ziel. Senkt eventuell Spezial-Verteidigung des Zieles." - }, - "braveBird": { - name: "Sturzflug", - effect: "Anwender greift aus niedriger Höhe an. Er erleidet bei dieser Attacke selbst großen Schaden." - }, - "earthPower": { - name: "Erdkräfte", - effect: "Der Boden unter dem Ziel erzittert durch die Kraft der Erde. Senkt eventuell Spezial-Verteidigung." - }, - "switcheroo": { - name: "Wechseldich", - effect: "Item wird in Windeseile mit dem Ziel getauscht." - }, - "gigaImpact": { - name: "Gigastoß", - effect: "Anwender rennt mit seiner ganzen Kraft gegen das Ziel an und muss dann eine Runde ruhen." - }, - "nastyPlot": { - name: "Ränkeschmied", - effect: "Anwender stimuliert sein Gehirn und hat finstere Gedanken. Steigert Spezial-Angriff stark." - }, - "bulletPunch": { - name: "Patronenhieb", - effect: "Das Ziel wird von ultraschnellen Hieben getroffen. Erstschlaggarantie." - }, - "avalanche": { - name: "Lawine", - effect: "Wurde der Anwender in dieser Runde vom Ziel getroffen, macht diese Attacke doppelten Schaden." - }, - "iceShard": { - name: "Eissplitter", - effect: "Das Ziel wird mit Eisklumpen beworfen. Diese Attacke hat Erstschlaggarantie." - }, - "shadowClaw": { - name: "Dunkelklaue", - effect: "Das Ziel wird mit scharfen Klauen aus der Schattenwelt attackiert. Hohe Volltrefferquote." - }, - "thunderFang": { - name: "Donnerzahn", - effect: "Anwender beißt mit elektrifizierten Reißzähnen zu. Das Ziel schreckt eventuell zurück oder wird paralysiert." - }, - "iceFang": { - name: "Eiszahn", - effect: "Anwender beißt mit eiskalten Reißzähnen zu. Ziel schreckt eventuell zurück oder friert ein." - }, - "fireFang": { - name: "Feuerzahn", - effect: "Anwender beißt mit flammenden Reißzähnen zu. Ziel schreckt eventuell zurück oder verbrennt sich." - }, - "shadowSneak": { - name: "Schattenstoß", - effect: "Anwender erweitert Schatten und greift das Ziel von hinten an. Erstschlaggarantie." - }, - "mudBomb": { - name: "Schlammbombe", - effect: "Anwender greift mit einem festen Schlammklumpen an. Senkt eventuell Genauigkeit des Zieles." - }, - "psychoCut": { - name: "Psychoklinge", - effect: "Das Ziel wird mit Klingen attackiert, die aus Psycho-Energie bestehen. Hohe Volltrefferquote." - }, - "zenHeadbutt": { - name: "Zen-Kopfstoß", - effect: "Anwender konzentriert seinen Willen und rammt das Ziel. Dieses schreckt eventuell zurück." - }, - "mirrorShot": { - name: "Spiegelsalve", - effect: "Anwender feuert Energiestrahl aus seinem Körper ab. Senkt eventuell Genauigkeit des Zieles." - }, - "flashCannon": { - name: "Lichtkanone", - effect: "Anwender sammelt Lichtenergie und feuert sie auf einmal ab. Senkt eventuell Spezial-Verteidigung des Zieles." - }, - "rockClimb": { - name: "Kraxler", - effect: "Eine stürmische Attacke, die das Ziel eventuell verwirrt." - }, - "defog": { - name: "Auflockern", - effect: "Starker Wind hebt Attacken wie Reflektor und Lichtschild des Zieles auf. Senkt außerdem den Fluchtwert." - }, - "trickRoom": { - name: "Bizarroraum", - effect: "Anwender erzeugt einen bizarren Raum, in dem langsame Pokémon fünf Runden lang zuerst agieren." - }, - "dracoMeteor": { - name: "Draco Meteor", - effect: "Kometen werden heraufbeschworen. Der Rückstoß reduziert den Spezial-Angriff des Anwenders stark." - }, - "discharge": { - name: "Ladungsstoß", - effect: "Anwender greift alle Pokémon im Umkreis mit Elektrizität an. Diese werden eventuell auch paralysiert." - }, - "lavaPlume": { - name: "Flammensturm", - effect: "Greift alles in seiner Umgebung mit tiefroten Flammen an. Ziel kann Verbrennungen erleiden." - }, - "leafStorm": { - name: "Blättersturm", - effect: "Anwender erzeugt einen Sturm aus scharfen Blättern. Rückstoß senkt Spezial-Angriff des Anwenders stark." - }, - "powerWhip": { - name: "Blattgeißel", - effect: "Anwender wirbelt seine Ranken oder Tentakel peitschenartig gegen das Ziel." - }, - "rockWrecker": { - name: "Felswerfer", - effect: "Anwender wirft einen riesigen Felsen auf das Ziel. In der nächsten Runde muss der Anwender ruhen." - }, - "crossPoison": { - name: "Giftstreich", - effect: "Ein schneidender Hieb, der das Ziel eventuell vergiftet. Hat eine hohe Volltrefferquote." - }, - "gunkShot": { - name: "Mülltreffer", - effect: "Anwender schießt mit Müll auf das Ziel. Vergiftet dieses eventuell." - }, - "ironHead": { - name: "Eisenschädel", - effect: "Ziel wird durch stahlharten Kopf des Anwenders getroffen und schreckt eventuell zurück." - }, - "magnetBomb": { - name: "Magnetbombe", - effect: "Ziel wird durch Haftbomben getroffen. Diese Attacke trifft immer." - }, - "stoneEdge": { - name: "Steinkante", - effect: "Anwender sticht das Ziel mit spitzen Steinen. Hohe Volltrefferquote." - }, - "captivate": { - name: "Liebreiz", - effect: "Charme-Attacke, die den Spezial-Angriff des Zieles stark senkt, falls es dem anderen Geschlecht angehört." - }, - "stealthRock": { - name: "Tarnsteine", - effect: "Falle mit schwebenden Steinen. In den Kampf eingewechselte Ziele nehmen Schaden." - }, - "grassKnot": { - name: "Strauchler", - effect: "Ziel wird durch Gras ins Straucheln gebracht. Je schwerer das Ziel, desto mehr Schaden." - }, - "chatter": { - name: "Geschwätz", - effect: "Attacke mit Schallwellen. Verwirrt das Ziel." - }, - "judgment": { - name: "Urteilskraft", - effect: "Anwender feuert unzählige Lichtstrahlen ab. Deren Typ hängt von der gehaltenen Tafel ab." - }, - "bugBite": { - name: "Käferbiss", - effect: "Anwender beißt das Ziel. Trägt dieses eine Beere, isst der Anwender sie und erhält ihren Effekt." - }, - "chargeBeam": { - name: "Ladestrahl", - effect: "Ziel wird von einem Elektrostrahl getroffen. Steigert eventuell Spezial-Angriff des Anwenders." - }, - "woodHammer": { - name: "Holzhammer", - effect: "Anwender attackiert mit seinem robusten Körper. Er erleidet dabei auch selbst großen Schaden." - }, - "aquaJet": { - name: "Wasserdüse", - effect: "Bei dieser Erstschlag-Attacke stürzt sich der Anwender so schnell auf das Ziel, dass er quasi unsichtbar wird." - }, - "attackOrder": { - name: "Schlagbefehl", - effect: "Anwender ruft seine Untergebenen zum Angriff. Hat eine hohe Volltrefferquote." - }, - "defendOrder": { - name: "Blockbefehl", - effect: "Untergebene bilden einen lebenden Schild um den Anwender. Steigert Verteidigung und Spezial-Verteidigung." - }, - "healOrder": { - name: "Heilbefehl", - effect: "Untergebene heilen den Anwender. KP des Anwenders werden um 50 % der maximalen KP aufgefüllt." - }, - "headSmash": { - name: "Kopfstoß", - effect: "Anwender greift unter Einsatz seines Lebens mit einem Kopfstoß an und nimmt dabei selbst jede Menge Schaden." - }, - "doubleHit": { - name: "Doppelschlag", - effect: "Anwender trifft das Ziel mit dem Schweif oder Ähnlichem. Ziel wird doppelt getroffen." - }, - "roarOfTime": { - name: "Zeitenlärm", - effect: "Anwender attackiert mit einer Kraft, die selbst die Zeit verzerrt. In der nächsten Runde muss er ruhen." - }, - "spacialRend": { - name: "Raumschlag", - effect: "Schwere, raumgreifende Attacke. Hohe Volltrefferquote." - }, - "lunarDance": { - name: "Lunartanz", - effect: "Anwender geht K.O. Das an seine Stelle tretende Pokémon hat dafür volle KP und AP. Statusprobleme werden geheilt." - }, - "crushGrip": { - name: "Quetschgriff", - effect: "Ziel wird mit großer Kraft getroffen. Je höher die KP des Zieles, desto stärker die Attacke." - }, - "magmaStorm": { - name: "Lavasturm", - effect: "Das Ziel wird in einen Feuersog gezogen, der vier bis fünf Runden aktiv ist." - }, - "darkVoid": { - name: "Schlummerort", - effect: "Das Ziel wird in eine Welt der Dunkelheit gezogen und in Schlaf versetzt." - }, - "seedFlare": { - name: "Schocksamen", - effect: "Anwender erzeugt eine Schockwelle. Spezial-Verteidigung des Zieles wird stark gesenkt." - }, - "ominousWind": { - name: "Unheilböen", - effect: "Das Ziel treffen abscheuliche Winde. Steigert eventuell alle Statuswerte des Anwenders." - }, - "shadowForce": { - name: "Schemenkraft", - effect: "Anwender verschwindet in Runde 1 und attackiert in Runde 2. Trifft auch, wenn sich das Ziel selbst schützt." - }, - "honeClaws": { - name: "Klauenwetzer", - effect: "Wetzt seine Klauen, um sie zu schärfen. Erhöht Angriff und Genauigkeit des Anwenders." - }, - "wideGuard": { - name: "Rundumschutz", - effect: "Schützt eine Runde lang vor Angriffen, die alle Pokémon auf deiner Seite treffen." - }, - "guardSplit": { - name: "Schutzteiler", - effect: "Durch Psycho-Kräfte werden Verteidigung und Spezial-Verteidigung des Anwenders und des Zieles addiert und in zwei gleiche Hälften geteilt." - }, - "powerSplit": { - name: "Kraftteiler", - effect: "Durch Psycho-Kräfte werden Angriff und Spezial-Angriff des Anwenders und des Zieles addiert und in zwei gleiche Hälften geteilt." - }, - "wonderRoom": { - name: "Wunderraum", - effect: "Anwender erzeugt bizarren Raum, in dem über fünf Runden die Verteidigung aller Pokémon mit ihrer Spezial-Verteidigung getauscht wird." - }, - "psyshock": { - name: "Psychoschock", - effect: "Anwender erzeugt eine seltsame Energiewelle, die dem Ziel physischen Schaden zufügt." - }, - "venoshock": { - name: "Giftschock", - effect: "Überschüttet das Ziel mit einer speziellen toxischen Flüssigkeit. Doppelt so stark gegen vergiftete Ziele." - }, - "autotomize": { - name: "Autotomie", - effect: "Anwender trennt sich von überflüssigen Körperteilen und steigert seine Initiative stark. Sein Gewicht nimmt deutlich ab." - }, - "ragePowder": { - name: "Wutpulver", - effect: "Anwender zieht gegnerische Aufmerksamkeit und Angriffe auf sich, indem er ein Wut erzeugendes Pulver über sich streut." - }, - "telekinesis": { - name: "Telekinese", - effect: "Bringt das Ziel durch Psycho-Kräfte zum Schweben. Dieses lässt sich so über drei Runden hinweg besonders leicht treffen." - }, - "magicRoom": { - name: "Magieraum", - effect: "Anwender erzeugt einen bizarren Raum, in dem über fünf Runden die Wirkung aller von Pokémon getragenen Items aufgehoben ist." - }, - "smackDown": { - name: "Katapult", - effect: "Greift das Ziel mit Steinen und Wurfgeschossen an. Fliegende Ziele fallen dabei vom Himmel und landen auf dem Boden." - }, - "stormThrow": { - name: "Bergsturm", - effect: "Ein Angriff mit voller Wucht und Volltreffergarantie." - }, - "flameBurst": { - name: "Funkenflug", - effect: "Bei Erfolg greift der Anwender mit berstenden Feuerblasen an. Die Funken der geplatzten Blasen treffen auch benachbarte Ziele." - }, - "sludgeWave": { - name: "Schlammwoge", - effect: "Greift Pokémon in der Nähe des Anwenders mit einer Schlammwelle an. Diese werden eventuell vergiftet." - }, - "quiverDance": { - name: "Falterreigen", - effect: "Anwender legt behände einen mystischen, formvollendeten Tanz aufs Parkett. Spezial-Angriff, Spezial-Verteidigung und Initiative steigen." - }, - "heavySlam": { - name: "Rammboss", - effect: "Anwender rammt das Ziel mit massivem Körper. Je schwerer er im Vergleich zum Ziel ist, desto stärker die Attacke." - }, - "synchronoise": { - name: "Synchrolärm", - effect: "Fügt Pokémon vom selben Typ, die sich in der Nähe des Anwenders aufhalten, mit seltsamen Druckwellen Schaden zu." - }, - "electroBall": { - name: "Elektroball", - effect: "Je höher die Initiative des Anwenders im Vergleich zum Ziel ist, desto stärker trifft dieses eine geballte Ladung Strom." - }, - "soak": { - name: "Überflutung", - effect: "Überschüttet das Ziel mit Unmengen an Wasser und ändert den Typ damit in Wasser um." - }, - "flameCharge": { - name: "Nitroladung", - effect: "Anwender hüllt sich in Flammen und greift das Ziel an. Sammelt seine Energie und erhöht dadurch die eigene Initiative." - }, - "coil": { - name: "Einrollen", - effect: "Anwender rollt sich zusammen und sammelt sich. Dabei werden Angriff, Verteidigung und Genauigkeit erhöht." - }, - "lowSweep": { - name: "Fußtritt", - effect: "Anwender greift mit blitzschnellen Bewegungen die Beine des Zieles an und senkt dessen Initiative." - }, - "acidSpray": { - name: "Säurespeier", - effect: "Anwender greift an, indem er eine ätzende Flüssigkeit auf das Ziel speit. Senkt dessen Spezial-Verteidigung stark." - }, - "foulPlay": { - name: "Schmarotzer", - effect: "Anwender macht sich die Kraft des Zieles zunutze. Je höher dessen Angriff, desto mehr Schaden richtet die Attacke an." - }, - "simpleBeam": { - name: "Wankelstrahl", - effect: "Bestrahlt das Ziel mit mysteriösen Energiewellen. Bei einem Treffer wird dessen Fähigkeit zu Wankelmut." - }, - "entrainment": { - name: "Zwango", - effect: "Anwender tanzt zu einem seltsamem Rhythmus und zwingt das Ziel mitzumachen. Dieses nimmt dabei die Fähigkeit des Anwenders an." - }, - "afterYou": { - name: "Galanterie", - effect: "Anwender ermöglicht dem Ziel direkt nach ihm zu handeln, solange der Anwender als Erstes zum Zug kommt." - }, - "round": { - name: "Kanon", - effect: "Angriff mit Gesang. Singt der Anwender mit allen im Kanon, steigt die Stärke." - }, - "echoedVoice": { - name: "Widerhall", - effect: "Angriff mit widerhallender Stimme. Wenn in jeder Runde ein Teilnehmer wiederholt die Attacke einsetzt, steigt die Stärke." - }, - "chipAway": { - name: "Zermürben", - effect: "Eine durchdachte Attacke zu rechter Zeit. Richtet unabhängig von den Statusveränderungen des Zieles Schaden an." - }, - "clearSmog": { - name: "Klärsmog", - effect: "Anwender greift das Ziel mit spezialgefertigten Schlammklumpen an. Setzt Statusveränderungen zurück." - }, - "storedPower": { - name: "Kraftvorrat", - effect: "Angriff mit angesparter Energie. Je höher die Statuswerte des Anwenders, desto stärker fällt die Attacke aus." - }, - "quickGuard": { - name: "Rapidschutz", - effect: "Schützt Anwender und Mitstreiter vor gegnerischen Erstschlag-Attacken." - }, - "allySwitch": { - name: "Seitentausch", - effect: "Wundersame Kräfte teleportieren den Anwender an den Platz eines Mitstreiters." - }, - "scald": { - name: "Siedewasser", - effect: "Heizt dem Ziel mit einem Schwall siedend heißen Kochwassers ein. Das Ziel erleidet dabei eventuell Verbrennungen." - }, - "shellSmash": { - name: "Hausbruch", - effect: "Anwender zerbricht seine Schale und senkt seine Verteidigung und Spezial-Verteidigung, aber dafür steigen Angriff, Spezial-Angriff und Initiative stark." - }, - "healPulse": { - name: "Heilwoge", - effect: "Anwender löst eine Schmerzen lindernde Welle aus und heilt dabei das Ziel mit der Hälfte seiner maximalen KP." - }, - "hex": { - name: "Bürde", - effect: "Eine Attacke, bei der der Anwender das Ziel bedrängt. Fügt Zielen mit Statusproblemen hohen Schaden zu." - }, - "skyDrop": { - name: "Freier Fall", - effect: "Steigt in Runde 1 mit dem Ziel in die Luft auf und lässt es in Runde 2 fallen. Das Ziel kann dabei nicht angreifen." - }, - "shiftGear": { - name: "Gangwechsel", - effect: "Durch Drehen der Zahnräder erhöht sich nicht nur der Angriffs-Wert, sondern auch die Initiative des Anwenders stark." - }, - "circleThrow": { - name: "Überkopfwurf", - effect: "Schleudert das Ziel davon und bewirkt damit, dass ein anderes Pokémon eingewechselt wird. Beendet Kämpfe gegen wilde Pokémon." - }, - "incinerate": { - name: "Einäschern", - effect: "Eine Feuer-Attacke. Trägt das Ziel eine Beere oder ein ähnliches Item bei sich, wird dieses von den Flammen verzehrt und geht verloren." - }, - "quash": { - name: "Verzögerung", - effect: "Anwender stemmt sich gegen das Ziel und bewirkt, dass dieses erst als Letztes angreift." - }, - "acrobatics": { - name: "Akrobatik", - effect: "Ein graziler Angriff auf das Ziel. Trägt der Anwender kein Item bei sich, richtet die Attacke großen Schaden an." - }, - "reflectType": { - name: "Typenspiegel", - effect: "Anwender bildet das Ziel nach und nimmt dabei dessen Typ an." - }, - "retaliate": { - name: "Heimzahlung", - effect: "Anwender nimmt Rache für einen besiegten Mitstreiter. Wurde in der vorigen Runde ein Mitstreiter besiegt, steigt die Kraft." - }, - "finalGambit": { - name: "Wagemut", - effect: "Ein Angriff, der dem Ziel Schaden in Höhe der aktuellen KP des Anwenders zufügt. Letzterer wird dadurch selbst besiegt." - }, - "bestow": { - name: "Offerte", - effect: "Trägt das Ziel gerade kein Item bei sich, erhält es das Item, das sich aktuell im Besitz des Anwenders befindet." - }, - "inferno": { - name: "Inferno", - effect: "Anwender greift das Ziel an, indem er es mit dichten Flammen umhüllt. Ziel erleidet Verbrennungen." - }, - "waterPledge": { - name: "Wassersäulen", - effect: "Ein Angriff mit Wassersäulen. Mit Feuersäulen kombiniert steigt die Wirkung und ein Regenbogen erscheint." - }, - "firePledge": { - name: "Feuersäulen", - effect: "Ein Angriff mit Feuersäulen. Mit Pflanzsäulen kombiniert steigt die Wirkung und die Umgebung wird zu einem Meer aus Feuer." - }, - "grassPledge": { - name: "Pflanzensäulen", - effect: "Ein Angriff mit Pflanzsäulen. Mit Wassersäulen kombiniert steigt die Wirkung und die Umgebung wird zu einem Sumpf." - }, - "voltSwitch": { - name: "Voltwechsel", - effect: "Anwender kehrt nach dem Angriff mit atemberaubender Geschwindigkeit zurück und tauscht Platz mit einem anderen Pokémon." - }, - "struggleBug": { - name: "Käfertrutz", - effect: "Anwender leistet Widerstand und greift an. Der Spezial-Angriff der Ziele sinkt." - }, - "bulldoze": { - name: "Dampfwalze", - effect: "Anwender greift an, indem er den Boden um sich herum plattwalzt. Die Initiative aller betroffenen Pokémon sinkt." - }, - "frostBreath": { - name: "Eisesodem", - effect: "Anwender greift an, indem er dem Ziel eisigen Atem entgegenhaucht. Volltreffergarantie." - }, - "dragonTail": { - name: "Drachenrute", - effect: "Putzt das Ziel vom Feld und wechselt es mit einem anderen Pokémon aus. Beendet Kämpfe gegen wilde Pokémon." - }, - "workUp": { - name: "Kraftschub", - effect: "Anwender erhält einen Kraftschub, der seinen Angriff und Spezial-Angriff erhöht." - }, - "electroweb": { - name: "Elektronetz", - effect: "Fängt Ziele mit einem elektrischen Netz und senkt deren Initiative." - }, - "wildCharge": { - name: "Stromstoß", - effect: "Anwender erzeugt Spannung und greift an, indem er auf Kollisionskurs geht. Er selbst erleidet dabei ebenfalls leichten Schaden." - }, - "drillRun": { - name: "Schlagbohrer", - effect: "Anwender rammt das Ziel, während er seinen Körper wie einen Bohrer dreht. Hohe Volltrefferquote." - }, - "dualChop": { - name: "Doppelhieb", - effect: "Versetzt dem Ziel mit massiven Extremitäten Hiebe. Angriff erfolgt zweimal hintereinander." - }, - "heartStamp": { - name: "Herzstempel", - effect: "Verleitet Ziel durch Kokettieren zu Unachtsamkeit und verpasst ihm dann einen harten Schlag. Ziel schreckt eventuell zurück." - }, - "hornLeech": { - name: "Holzgeweih", - effect: "Greift Ziel mit Astgeweih an und zapft diesem Nährstoffe ab. Anwender wird um die Hälfte des zugefügten Schadens geheilt." - }, - "sacredSword": { - name: "Sanctoklinge", - effect: "Schneideangriff mit langem Horn. Richtet Schaden unabhängig von Statusveränderungen des Zieles an." - }, - "razorShell": { - name: "Kalkklinge", - effect: "Schneideangriff mit einer scharfen Muschelschale. Senkt eventuell die Verteidigung des Zieles." - }, - "heatCrash": { - name: "Brandstempel", - effect: "Rempelattacke mit brennendem Körper. Je schwerer der Anwender im Vergleich zum Ziel ist, desto stärker die Attacke." - }, - "leafTornado": { - name: "Grasmixer", - effect: "Anwender greift an, indem er das Ziel in scharfes Blattwerk einwickelt. Kann die Genauigkeit senken." - }, - "steamroller": { - name: "Quetschwalze", - effect: "Anwender rollt mit rundlichem Körper über das Ziel und drückt es platt. Ziel schreckt eventuell zurück." - }, - "cottonGuard": { - name: "Watteschild", - effect: "Anwender schützt sich, indem er sich in einen luftigen Flaum hüllt. Erhöht die Verteidigung drastisch." - }, - "nightDaze": { - name: "Nachtflut", - effect: "Anwender greift Ziel mit finsteren Schockwellen an. Senkt eventuell die Genauigkeit." - }, - "psystrike": { - name: "Psychostoß", - effect: "Anwender erzeugt seltsame Energiewellen, die dem Ziel physischen Schaden zufügen." - }, - "tailSlap": { - name: "Kehrschelle", - effect: "Anwender greift das Ziel mit seiner schlagfesten Rute zwei- bis fünfmal hintereinander an." - }, - "hurricane": { - name: "Orkan", - effect: "Anwender greift das Ziel an, indem er es mit heftigen Windböen umgibt. Ziel wird eventuell verwirrt." - }, - "headCharge": { - name: "Steinschädel", - effect: "Rempelattacke mit ausgeflippter Retrofrisur. Anwender nimmt selbst leichten Schaden." - }, - "gearGrind": { - name: "Klikkdiskus", - effect: "Anwender greift an, indem er stählerne Zahnräder auf das Ziel schleudert. Angriff erfolgt zweimal hintereinander." - }, - "searingShot": { - name: "Flammenball", - effect: "Greift alles in seiner Umgebung mit tiefroten Flammen an. Ziel kann Verbrennungen erleiden." - }, - "technoBlast": { - name: "Techblaster", - effect: "Anwender feuert ein Lichtgeschoss auf das Ziel ab. Der Typ der Attacke hängt von dem des Moduls ab." - }, - "relicSong": { - name: "Urgesang", - effect: "Anwender greift mit Urgesang an, der Ziele in der Nähe im tiefsten Inneren anspricht. Diese schlafen eventuell ein." - }, - "secretSword": { - name: "Mystoschwert", - effect: "Schneideangriff mit dem langen Schwert des Anwenders. Die mysteriöse Kraft aus dem Horn erzeugt physischen Schaden." - }, - "glaciate": { - name: "Eiszeit", - effect: "Anwender greift an, indem er dem Ziel klirrend kalte Luft entgegenbläst. Senkt die Initiative des Zieles." - }, - "boltStrike": { - name: "Blitzschlag", - effect: "Lädt seinen Körper mit einer gewaltigen Menge an Elektrizität auf und rammt damit das Ziel. Ziel wird eventuell paralysiert." - }, - "blueFlare": { - name: "Blauflammen", - effect: "Anwender greift an, indem er das Ziel in wunderschöne, intensivblaue Flammen hüllt, die es eventuell verbrennen." - }, - "fieryDance": { - name: "Feuerreigen", - effect: "Hüllt das Ziel mit einer Feuerhose in Flammen. Kann den Spezial-Angriff des Anwenders erhöhen." - }, - "freezeShock": { - name: "Frostvolt", - effect: "Feuert in der zweiten Runde elektrisch geladene Eisklumpen auf das Ziel ab. Paralysiert das Ziel eventuell." - }, - "iceBurn": { - name: "Frosthauch", - effect: "Umgibt das Ziel in der nächsten Runde mit heftigen, alles gefrierenden Eisböen. Fügt dem Ziel eventuell Verbrennungen zu." - }, - "snarl": { - name: "Standpauke", - effect: "Wäscht Zielen in der Nähe mit einer ausführlichen Standpauke den Kopf und senkt dabei deren Spezial-Angriff." - }, - "icicleCrash": { - name: "Eiszapfhagel", - effect: "Lässt große, schwere Eiszapfen auf das Ziel herabregnen. Ziel schreckt eventuell zurück." - }, - "vCreate": { - name: "V-Generator", - effect: "Eine Verzweiflungsattacke. Anwender entfacht glühend heißes Feuer. Senkt dessen Verteidigung, Spezial-Verteidigung und Initiative." - }, - "fusionFlare": { - name: "Kreuzflamme", - effect: "Feuert eine monströse Flamme ab. Wird die Attacke durch einen gigantischen Blitz modifiziert, steigt die Stärke." - }, - "fusionBolt": { - name: "Kreuzdonner", - effect: "Feuert einen monströsen Blitz ab. Wird die Attacke durch eine gigantische Flamme modifiziert, steigt die Stärke." - }, - "flyingPress": { - name: "Flying Press", - effect: "Der Anwender stürzt sich aus der Luft auf das Ziel. Die Attacke gehört sowohl dem Typ Kampf als auch dem Typ Flug an." - }, - "matBlock": { - name: "Tatami-Schild", - effect: "Der Anwender richtet eine Tatami-Matte auf, um sich und sein Team vor Schaden zu schützen. Kein Schutz vor Status-Attacken." - }, - "belch": { - name: "Rülpser", - effect: "Der Anwender fügt dem Ziel Schaden zu, indem er es anrülpst. Diese Attacke gelingt nur nach dem Konsum einer getragenen Beere." - }, - "rototiller": { - name: "Pflüger", - effect: "Der Anwender pflügt den Boden und macht die Erde fruchtbarer. Erhöht den Angriff und den Spezial-Angriff von Pflanzen-Pokémon." - }, - "stickyWeb": { - name: "Klebenetz", - effect: "Der Anwender spinnt in der Umgebung des gegnerischen Teams ein klebriges Netz und senkt so die Initiative neu eingewechselter Pokémon." - }, - "fellStinger": { - name: "Stachelfinale", - effect: "Gelingt es dem Anwender, das Ziel mit dieser Attacke zu besiegen, steigt sein Angriffs-Wert stark." - }, - "phantomForce": { - name: "Phantomkraft", - effect: "Der Anwender verschwindet, um eine Runde lang seine Kraft zu sammeln und in der nächsten Runde anzugreifen. Durchbricht die Defensive des Zieles." - }, - "trickOrTreat": { - name: "Halloween", - effect: "Der Anwender lehrt das Ziel das Fürchten. Dieses nimmt dadurch zusätzlich den Typ Geist an." - }, - "nobleRoar": { - name: "Kampfgebrüll", - effect: "Der Anwender stößt ein Kampfgebrüll aus, das das Ziel einschüchtert und zugleich seinen Angriffs- und Spezial-Angriffs-Wert senkt." - }, - "ionDeluge": { - name: "Plasmaschauer", - effect: "Versprüht elektrisch geladene Partikel und bewirkt, dass Normal-Attacken den Typ Elektro annehmen." - }, - "parabolicCharge": { - name: "Parabolladung", - effect: "Fügt allen Pokémon in der Umgebung Schaden zu. Der Anwender wird um die Hälfte des insgesamt angerichteten Schadens geheilt." - }, - "forestsCurse": { - name: "Waldesfluch", - effect: "Der Anwender belegt das Ziel mit einem Waldesfluch, durch den dieses zusätzlich den Typ Pflanze annimmt." - }, - "petalBlizzard": { - name: "Blütenwirbel", - effect: "Der Anwender erzeugt einen turbulenten Blütenwirbel, der alle Pokémon in der Nähe erfasst und ihnen Schaden zufügt." - }, - "freezeDry": { - name: "Gefriertrockner", - effect: "Das Ziel wird stark abgekühlt und manchmal sogar eingefroren. Die Attacke ist sehr effektiv gegen Wasser-Pokémon." - }, - "disarmingVoice": { - name: "Säuselstimme", - effect: "Der Anwender stößt einen bezirzenden Ruf aus, mit dem er das Ziel in seinen Bann schlägt und ihm immer mentalen Schaden zufügt." - }, - "partingShot": { - name: "Abgangstirade", - effect: "Schüchtert das Ziel mit einer Abgangstirade ein, sodass dessen Angriffs- und Spezial-Angriffs-Wert sinken. Danach wird der Anwender ausgewechselt." - }, - "topsyTurvy": { - name: "Invertigo", - effect: "Invertiert alle Statusveränderungen des Zieles." - }, - "drainingKiss": { - name: "Diebeskuss", - effect: "Der Anwender stiehlt dem Ziel mit einem Kuss KP. Die Höhe der Heilung beträgt mehr als die Hälfte des beim Ziel angerichteten Schadens." - }, - "craftyShield": { - name: "Trickschutz", - effect: "Schützt sich und Mitstreiter mit einer mysteriösen Macht vor Status-Attacken. Es werden jedoch weiterhin KP-Schäden erlitten." - }, - "flowerShield": { - name: "Floraschutz", - effect: "Erhöht mit einer mysteriösen Macht die Verteidigung aller am Kampf beteiligten Pflanzen-Pokémon." - }, - "grassyTerrain": { - name: "Grasfeld", - effect: "Verwandelt den Untergrund fünf Runden lang in ein Grasfeld und heilt in jeder neuen Runde alle Pokémon, die den Boden berühren." - }, - "mistyTerrain": { - name: "Nebelfeld", - effect: "Verwandelt den Untergrund fünf Runden lang in ein Nebelfeld und schützt alle Pokémon, die den Boden berühren, vor Statusproblemen." - }, - "electrify": { - name: "Elektrifizierung", - effect: "Kommt die Attacke zum Einsatz, bevor das Ziel seine Attacke ausführt, nimmt diese für die Dauer dieser Runde den Typ Elektro an." - }, - "playRough": { - name: "Knuddler", - effect: "Der Anwender knuddelt das Ziel und greift es an. Gelegentlich sinkt dabei auch dessen Angriffs-Wert." - }, - "fairyWind": { - name: "Feenbrise", - effect: "Lässt eine Feenbrise aufkommen, die das Ziel erfasst und ihm Schaden zufügt." - }, - "moonblast": { - name: "Mondgewalt", - effect: "Der Anwender macht sich die Kraft des Mondes zunutze, um anzugreifen. Gelegentlich wird dabei der Spezial-Angriff des Zieles gesenkt." - }, - "boomburst": { - name: "Überschallknall", - effect: "Der Anwender greift alle Pokémon in der Umgebung mit einem gewaltigen Knall an." - }, - "fairyLock": { - name: "Feenschloss", - effect: "Der Anwender sperrt alle Pokémon ein und hindert sie damit in der nächsten Runde an der Flucht." - }, - "kingsShield": { - name: "Königsschild", - effect: "Der Anwender weicht dem gegnerischen Angriff aus und geht in die Defensive. Berührt ihn nun ein Pokémon, sinkt der Angriffs-Wert dieses Gegners." - }, - "playNice": { - name: "Kameradschaft", - effect: "Der Anwender schließt mit dem Ziel Freundschaft und nimmt ihm seine Angriffslust. Der Angriffs-Wert des Zieles sinkt." - }, - "confide": { - name: "Vertrauenssache", - effect: "Der Anwender vertraut dem Ziel ein Geheimnis an und stört auf diese Weise seine Konzentration. Der Spezial-Angriff des Zieles sinkt." - }, - "diamondStorm": { - name: "Diamantsturm", - effect: "Der Anwender beschwört einen zerstörerischen Diamantsturm herauf. Kann die Verteidigung des Anwenders erhöhen." - }, - "steamEruption": { - name: "Dampfschwall", - effect: "Der Anwender feuert einen siedend heißen Dampfschwall auf das Ziel ab. Dieses kann dabei Verbrennungen erleiden." - }, - "hyperspaceHole": { - name: "Dimensionsloch", - effect: "Der Anwender positioniert sich mithilfe eines Dimensionslochs direkt neben dem Ziel und durchbricht selbst Schutzschild und Scanner." - }, - "waterShuriken": { - name: "Wasser-Shuriken", - effect: "Der Anwender schleudert dem Ziel Wurfsterne aus einem verdickten Sekret entgegen. Eine Serien-Attacke, die zwei- bis fünfmal trifft." - }, - "mysticalFire": { - name: "Magieflamme", - effect: "Der Anwender greift das Ziel an, indem er ihm eine besondere, heiße Flamme entgegenbläst. Der Spezial-Angriff des Zieles sinkt." - }, - "spikyShield": { - name: "Schutzstacheln", - effect: "Der Anwender weicht gegnerischen Angriffen aus. Gleichzeitig nehmen alle Pokémon, die mit ihm in Berührung kommen, Schaden." - }, - "aromaticMist": { - name: "Duftwolke", - effect: "Der Anwender erhöht mithilfe eines mysteriösen Duftes die Spezial-Verteidigung eines Mitstreiters." - }, - "eerieImpulse": { - name: "Mystowellen", - effect: "Der Körper des Anwenders erzeugt mysteriöse Wellen und senkt den Spezial-Angriff des Zieles dadurch stark." - }, - "venomDrench": { - name: "Giftfalle", - effect: "Anwender bespritzt das Ziel mit einer speziellen Giftflüssigkeit. Senkt den Angriff, den Spezial- Angriff und die Initiative von vergifteten Zielen." - }, - "powder": { - name: "Pulverschleuder", - effect: "Setzt das Ziel nach Einsatz von Pulverschleuder in derselben Runde eine Feuer-Attacke ein, kommt es zu einer Explosion, die ihm schadet." - }, - "geomancy": { - name: "Geokontrolle", - effect: "Der Anwender saugt in Runde 1 Energie auf. In Runde 2 steigen folgende Statuswerte stark: Spezial-Angriff, Spezial-Verteidigung und Initiative." - }, - "magneticFlux": { - name: "Magnetregler", - effect: "Das Magnetfeld wird so manipuliert, dass Spezial- Verteidigung und Verteidigung von Team-Pokémon mit der Fähigkeit Plus oder Minus steigen." - }, - "happyHour": { - name: "Goldene Zeiten", - effect: "Nach Einsatz der Attacke Goldene Zeiten verdoppelt sich das Preisgeld, das du im Falle eines Sieges erhältst." - }, - "electricTerrain": { - name: "Elektrofeld", - effect: "Verwandelt den Untergrund fünf Runden lang in ein Elektrofeld und hindert alle Pokémon, die den Boden berühren, am Einschlafen." - }, - "dazzlingGleam": { - name: "Zauberschein", - effect: "Der Anwender feuert einen mächtigen Lichtblitz ab, der dem Ziel Schaden zufügt." - }, - "celebrate": { - name: "Ehrentag", - effect: "Das Pokémon gratuliert dir zu deinem Geburtstag!" - }, - "holdHands": { - name: "Händchenhalten", - effect: "Der Anwender und ein Mitstreiter reichen einander die Hände und verfallen in einen Zustand tiefster Zufriedenheit." - }, - "babyDollEyes": { - name: "Kulleraugen", - effect: "Der Anwender erobert das Herz des Zieles, indem er es mit Kulleraugen ansieht. Senkt den Angriffs-Wert. Erstschlaggarantie." - }, - "nuzzle": { - name: "Wangenrubbler", - effect: "Der Anwender lädt seine Wangen elektrisch auf und greift an, indem er sich damit am Ziel reibt. Das Ziel wird paralysiert." - }, - "holdBack": { - name: "Zurückhaltung", - effect: "Der Anwender hält sich beim Angriff zurück und sorgt auf diese Weise dafür, dass dem Ziel danach mindestens 1 KP verbleibt." - }, - "infestation": { - name: "Plage", - effect: "Der Anwender fällt vier bis fünf Runden lang wie eine Plage über das Ziel her und greift es an. In diesem Zeitraum kann es nicht fliehen." - }, - "powerUpPunch": { - name: "Steigerungshieb", - effect: "Die Fäuste des Anwenders härten durch wiederholtes Zuschlagen ab. Mit jedem Treffer steigt sein Angriffs-Wert." - }, - "oblivionWing": { - name: "Unheilsschwingen", - effect: "Der Anwender raubt dem Ziel KP. Die Höhe der Heilung beträgt mehr als die Hälfte des beim Ziel angerichteten Schadens." - }, - "thousandArrows": { - name: "Tausend Pfeile", - effect: "Die Attacke erfasst auch schwebende Pokémon. Erfasst sie ein Pokémon im Schwebe-Zustand, fällt es zu Boden." - }, - "thousandWaves": { - name: "Tausend Wellen", - effect: "Der Anwender greift mit einer Welle an, die dicht über dem Boden verläuft und alle Pokémon, die sie erfasst, an der Flucht hindert." - }, - "landsWrath": { - name: "Bodengewalt", - effect: "Der Anwender sammelt die Kraft des weiten Landes und greift an, indem er sie gebündelt auf das Ziel lenkt." - }, - "lightOfRuin": { - name: "Lux Calamitatis", - effect: "Die Attacke basiert auf der Kraft des Ewigblütlers, die als mächtiger Lichtstrahl abgefeuert wird. Der Anwender nimmt dabei selbst großen Schaden." - }, - "originPulse": { - name: "Ursprungswoge", - effect: "Der Anwender greift das Ziel mit unzähligen blau leuchtenden Strahlen an." - }, - "precipiceBlades": { - name: "Abgrundsklinge", - effect: "Der Anwender wandelt die Kraft des Erdreichs in Klingen um, mit denen er das Ziel angreift." - }, - "dragonAscent": { - name: "Zenitstürmer", - effect: "Der Anwender greift das Ziel aus atemberaubender Höhe im Sturzflug an. Senkt Verteidigung und Spezial-Verteidigung des Anwenders." - }, - "hyperspaceFury": { - name: "Dimensionswahn", - effect: "Eine Angriffsserie mit vielen Armen, die die Wirkung von Schutzschild und Scanner durchbricht. Dabei sinkt die Verteidigung des Anwenders." - }, - "breakneckBlitzPhysical": { - name: "Hyper-Sprintangriff", - effect: "Der durch Z-Kraft energiegeladene Anwender rennt mit ganzer Kraft gegen das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "breakneckBlitzSpecial": { - name: "Hyper-Sprintangriff", - effect: "Dummy Data" - }, - "allOutPummelingPhysical": { - name: "Fulminante Faustschläge", - effect: "Aus Z-Kraft hergestellte Energiebälle prallen mit voller Wucht auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "allOutPummelingSpecial": { - name: "Fulminante Faustschläge", - effect: "Dummy Data" - }, - "supersonicSkystrikePhysical": { - name: "Finaler Steilflug", - effect: "Der Anwender schwingt sich durch Z-Kraft in die Lüfte und stürzt sich dann auf das Ziel hinab. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "supersonicSkystrikeSpecial": { - name: "Finaler Steilflug", - effect: "Dummy Data" - }, - "acidDownpourPhysical": { - name: "Vernichtender Säureregen", - effect: "Der Anwender kreiert mit Z-Kraft ein giftiges Moor, in dem das Ziel versinkt. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "acidDownpourSpecial": { - name: "Vernichtender Säureregen", - effect: "Dummy Data" - }, - "tectonicRagePhysical": { - name: "Seismische Eruption", - effect: "Der Anwender zerrt das Ziel mit Z-Kraft tief in den Boden und kollidiert dort mit ihm. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "tectonicRageSpecial": { - name: "Seismische Eruption", - effect: "Dummy Data" - }, - "continentalCrushPhysical": { - name: "Apokalyptische Steinpresse", - effect: "Der Anwender beschwört mit Z-Kraft einen großen Felsen herbei und lässt ihn auf das Ziel fallen. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "continentalCrushSpecial": { - name: "Apokalyptische Steinpresse", - effect: "Dummy Data" - }, - "savageSpinOutPhysical": { - name: "Wirbelnder Insektenhieb", - effect: "Mithilfe von Z-Kraft umwickelt der Anwender das Ziel mit Fäden. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "savageSpinOutSpecial": { - name: "Wirbelnder Insektenhieb", - effect: "Dummy Data" - }, - "neverEndingNightmarePhysical": { - name: "Ewige Nacht", - effect: "Der Anwender beschwört mit Z-Kraft tiefen Groll herbei und lässt diesen auf das Ziel los. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "neverEndingNightmareSpecial": { - name: "Ewige Nacht", - effect: "Dummy Data" - }, - "corkscrewCrashPhysical": { - name: "Turbo-Spiralkombo", - effect: "Der Anwender wirbelt durch Z-Kraft sehr schnell umher und prallt mit dem Ziel zusammen. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "corkscrewCrashSpecial": { - name: "Turbo-Spiralkombo", - effect: "Dummy Data" - }, - "infernoOverdrivePhysical": { - name: "Dynamische Maxiflamme", - effect: "Der Anwender speit dank Z-Kraft eine gewaltige Kugel aus Flammen auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "infernoOverdriveSpecial": { - name: "Dynamische Maxiflamme", - effect: "Dummy Data" - }, - "hydroVortexPhysical": { - name: "Super-Wassertornado", - effect: "Der Anwender kreiert mit Z-Kraft einen riesigen Wasserstrudel, der das Ziel verschluckt. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "hydroVortexSpecial": { - name: "Super-Wassertornado", - effect: "Dummy Data" - }, - "bloomDoomPhysical": { - name: "Brillante Blütenpracht", - effect: "Der Anwender leiht sich durch Z-Kraft die Energie von Wiesenblumen und greift das Ziel damit an. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "bloomDoomSpecial": { - name: "Brillante Blütenpracht", - effect: "Dummy Data" - }, - "gigavoltHavocPhysical": { - name: "Gigavolt-Funkensalve", - effect: "Der Anwender greift das Ziel mit durch Z-Kraft gesammelter starker Elektrizität an. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "gigavoltHavocSpecial": { - name: "Gigavolt-Funkensalve", - effect: "Dummy Data" - }, - "shatteredPsychePhysical": { - name: "Psycho-Schmetterschlag", - effect: "Der Anwender kontrolliert das Ziel mit Z-Kraft und macht ihm so das Leben schwer. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "shatteredPsycheSpecial": { - name: "Psycho-Schmetterschlag", - effect: "Dummy Data" - }, - "subzeroSlammerPhysical": { - name: "Tobender Geofrost", - effect: "Der Anwender senkt mit Z-Kraft die Temperatur drastisch und lässt das Ziel einfrieren. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "subzeroSlammerSpecial": { - name: "Tobender Geofrost", - effect: "Dummy Data" - }, - "devastatingDrakePhysical": { - name: "Drastisches Drachendröhnen", - effect: "Der Anwender materialisiert durch Z-Kraft seine Aura und greift damit das Ziel an. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "devastatingDrakeSpecial": { - name: "Drastisches Drachendröhnen", - effect: "Dummy Data" - }, - "blackHoleEclipsePhysical": { - name: "Schwarzes Loch des Grauens", - effect: "Der Anwender sammelt mit Z-Kraft dunkle Energie an, die das Ziel verschlingt. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "blackHoleEclipseSpecial": { - name: "Black Hole Eclipse", - effect: "Dummy Data" - }, - "twinkleTacklePhysical": { - name: "Entzückender Sternenstoß", - effect: "Der Anwender kreiert mit Z-Kraft eine zauberhafte Dimension und treibt dort sein Spiel mit dem Ziel. Die Stärke variiert je nach zugrunde liegender Attacke." - }, - "twinkleTackleSpecial": { - name: "Twinkle Tackle", - effect: "Dummy Data" - }, - "catastropika": { - name: "Perfektes Pika-Projektil", - effect: "Pikachu umhüllt sich durch Z-Kraft mit gewaltiger elektrischer Energie und stürzt sich mit voller Kraft auf das Ziel." - }, - "shoreUp": { - name: "Sandsammler", - effect: "KP des Anwenders werden um 50 % der maximalen KP aufgefüllt. Tobt ein Sandsturm, werden noch mehr KP aufgefüllt." - }, - "firstImpression": { - name: "Überrumpler", - effect: "Eine sehr starke Attacke, die jedoch nur erfolgreich ist, wenn sie sofort eingesetzt wird, nachdem der Anwender das Kampffeld betreten hat." - }, - "banefulBunker": { - name: "Bunker", - effect: "Der Anwender wird vor Angriffen geschützt. Gleichzeitig werden alle Pokémon, die mit ihm in Berührung kommen, vergiftet." - }, - "spiritShackle": { - name: "Schattenfessel", - effect: "Der Anwender greift das Ziel an und näht zugleich dessen Schatten am Boden fest, sodass es nicht entkommen kann." - }, - "darkestLariat": { - name: "Dark Lariat", - effect: "Der Anwender wirbelt mit beiden Armen und prallt so auf das Ziel. Richtet unabhängig von den Statusveränderungen des Zieles Schaden an." - }, - "sparklingAria": { - name: "Schaumserenade", - effect: "Durch Gesang erzeugte Blasen werden auf das Ziel geschleudert. Alle Pokémon, die dadurch Schaden erleiden, werden auch von Verbrennungen geheilt." - }, - "iceHammer": { - name: "Eishammer", - effect: "Anwender trifft mit einem starken Hieb. Senkt Initiative des Anwenders." - }, - "floralHealing": { - name: "Florakur", - effect: "KP des Zieles werden um 50 % der maximalen KP aufgefüllt. Die Wirkung steigt, wenn der Untergrund in ein Grasfeld verwandelt wurde." - }, - "highHorsepower": { - name: "Pferdestärke", - effect: "Der Anwender greift das Ziel mit einer heftigen Ganzkörper-Attacke an." - }, - "strengthSap": { - name: "Kraftabsorber", - effect: "Ein Angriff, der die KP des Anwenders um die Höhe des Angriffs-Werts des Zieles heilt. Anschließend wird der Angriff des Zieles gesenkt." - }, - "solarBlade": { - name: "Solarklinge", - effect: "Der Anwender absorbiert in der 1. Runde Licht, das er in der 2. Runde zu einem Schwert formt, mit dem er angreift." - }, - "leafage": { - name: "Blattwerk", - effect: "Der Anwender greift das Ziel mit Blättern an." - }, - "spotlight": { - name: "Rampenlicht", - effect: "Der Anwender lenkt die Aufmerksamkeit auf das Ziel, sodass in dieser Runde nur noch dieses Pokémon angegriffen wird." - }, - "toxicThread": { - name: "Giftfaden", - effect: "Der Anwender schießt giftige Fäden auf das Ziel, das dadurch vergiftet wird. Außerdem sinkt seine Initiative." - }, - "laserFocus": { - name: "Konzentration", - effect: "Der Anwender konzentriert sich, wodurch sein nächster Angriff garantiert ein Volltreffer wird." - }, - "gearUp": { - name: "Hilfsmechanik", - effect: "Der Anwender erhöht mithilfe von Zahnrädern Angriff und Spezial-Angriff von Team-Pokémon mit der Fähigkeit Plus oder Minus." - }, - "throatChop": { - name: "Neck Strike", - effect: "Das Pokémon, das von dieser Attacke getroffen wird, erleidet starke Schmerzen und kann deswegen zwei Runden lang keine Lärm-Attacken mehr einsetzen." - }, - "pollenPuff": { - name: "Pollenknödel", - effect: "Der Anwender greift mit einem Ball aus Pollen an, der beim Ziel explodiert. Mitstreiter werden von einem Ball getroffen, der ihre KP auffüllt." - }, - "anchorShot": { - name: "Ankerschuss", - effect: "Der Anwender greift das Ziel an, indem er es mit einer Ankerkette umwickelt. Dadurch wird das Ziel an der Flucht gehindert." - }, - "psychicTerrain": { - name: "Psychofeld", - effect: "Verhindert für fünf Runden, dass Pokémon am Boden von Attacken mit hoher Erstschlagquote getroffen werden. Erhöht die Stärke von Psycho-Attacken." - }, - "lunge": { - name: "Anfallen", - effect: "Der Anwender greift das Ziel mit ganzer Kraft an, wodurch auch der Angriffs-Wert des Zieles sinkt." - }, - "fireLash": { - name: "Feuerpeitsche", - effect: "Der Anwender greift das Ziel mit einer brennenden Peitsche an und senkt dabei zusätzlich dessen Verteidigungs-Wert." - }, - "powerTrip": { - name: "Überheblichkeit", - effect: "Der Anwender prahlt mit seiner Stärke und greift das Ziel an. Dieser Angriff ist umso stärker, je weiter die Statuswerte des Anwenders erhöht sind." - }, - "burnUp": { - name: "Ausbrennen", - effect: "Der Anwender nutzt das gesamte Feuer in seinem Körper, um großen Schaden auszuteilen. Die restliche Kampfdauer gehört er nicht mehr dem Typ Feuer an." - }, - "speedSwap": { - name: "Initiativetausch", - effect: "Der Anwender tauscht seinen Initiative-Wert mit dem des Zieles." - }, - "smartStrike": { - name: "Schmalhorn", - effect: "Der Anwender durchbohrt das Ziel mit seinem spitzen Horn. Diese Attacke trifft immer." - }, - "purify": { - name: "Läuterung", - effect: "Der Anwender heilt das Statusproblem des Zieles und füllt dadurch seine eigenen KP auf." - }, - "revelationDance": { - name: "Wecktanz", - effect: "Der Anwender tanzt und greift dabei das Ziel mit voller Kraft an. Die Attacke hat denselben Typ wie das Pokémon, das sie einsetzt." - }, - "coreEnforcer": { - name: "Sanktionskern", - effect: "Hat das Pokémon, das durch diese Attacke Schaden genommen hat, in dieser Runde bereits gehandelt, verliert es seine Fähigkeit." - }, - "tropKick": { - name: "Tropenkick", - effect: "Der Anwender greift den Gegner mit einem heftigen Tritt tropischer Herkunft an. Dabei sinkt auch der Angriffs-Wert des Gegners." - }, - "instruct": { - name: "Kommando", - effect: "Der Anwender befiehlt dem Ziel, dessen zuletzt ausgeführte Attacke sofort wieder einzusetzen." - }, - "beakBlast": { - name: "Schnabelkanone", - effect: "Der Anwender erhitzt zuerst seinen Schnabel und greift dann an. Pokémon, die ihn während des Erhitzens berühren, erleiden Verbrennungen." - }, - "clangingScales": { - name: "Schuppenrasseln", - effect: "Der Anwender erzeugt durch das Rasseln mit seinen Schuppen ein lautes Geräusch und greift an. Anschließend sinkt seine Verteidigung." - }, - "dragonHammer": { - name: "Drachenhammer", - effect: "Der Anwender nutzt seinen Körper wie einen Hammer und stürzt sich auf das Ziel, wodurch dieses Schaden erleidet." - }, - "brutalSwing": { - name: "Wirbler", - effect: "Der Anwender dreht schwungvoll seinen Körper und fügt den Pokémon in seiner Nähe dabei Schaden zu." - }, - "auroraVeil": { - name: "Auroraschleier", - effect: "Diese Attacke schwächt fünf Runden lang den durch physische sowie durch Spezial-Attacken erhaltenen Schaden. Kann nur bei Hagel eingesetzt werden." - }, - "sinisterArrowRaid": { - name: "Schatten-Pfeilregen", - effect: "Silvarro stellt mit Z-Kraft unzählige Pfeile her und lässt diese auf das Ziel niederprasseln." - }, - "maliciousMoonsault": { - name: "Hyper Dark Crusher", - effect: "Mit seinem durch Z-Kraft gestählten Körper stürzt sich Fuegro mit ganzer Kraft auf das Ziel." - }, - "oceanicOperetta": { - name: "Grandiose Meeressymphonie", - effect: "Primarene ruft mit Z-Kraft große Mengen an Wasser herbei und greift damit das Ziel an." - }, - "guardianOfAlola": { - name: "Alolas Wächter", - effect: "Ein gewaltiger Angriff des Schutzpatrons, der durch Z-Kraft die Kraft Alolas erlangt hat. Reduziert die verbleibenden KP des Zieles stark." - }, - "soulStealing7StarStrike": { - name: "Sternbild des Seelenraubes", - effect: "Marshadow schlägt mit durch Z-Kraft gestärkten Schlägen und Tritten in einer Serien-Attacke auf das Ziel ein." - }, - "stokedSparksurfer": { - name: "Blitz-Wellenritt", - effect: "Das Alola-Raichu greift das Ziel mithilfe von Z-Kraft mit voller Wucht an und paralysiert es." - }, - "pulverizingPancake": { - name: "Schluss mit lustig", - effect: "Relaxo wird von Z-Kraft erfüllt und macht Ernst. Es bringt seinen riesigen Körper in Schwung und stürzt sich mit ganzer Kraft auf das Ziel." - }, - "extremeEvoboost": { - name: "Macht der Neun", - effect: "Evoli macht sich durch Z-Kraft die Stärke seiner Weiterentwicklungen zunutze und erhöht seine Statuswerte stark." - }, - "genesisSupernova": { - name: "Supernova des Ursprungs", - effect: "Mew greift das Ziel mithilfe von Z-Kraft mit voller Wucht an. Der Untergrund wird dabei in ein Psychofeld verwandelt." - }, - "shellTrap": { - name: "Panzerfalle", - effect: "Der Anwender legt eine Panzerfalle. Wird er von einer physischen Attacke getroffen, explodiert die Falle und fügt dem Angreifer Schaden zu." - }, - "fleurCannon": { - name: "Kanonenbouquet", - effect: "Der Anwender greift das Ziel mit einem gewaltigen Strahl an. Sein eigener Spezial-Angriff sinkt dadurch stark." - }, - "psychicFangs": { - name: "Psychobeißer", - effect: "Der Anwender beißt das Ziel mithilfe von Psycho-Kräften. Die Attacke durchbricht auch Barrieren wie Lichtschild und Reflektor." - }, - "stompingTantrum": { - name: "Fruststampfer", - effect: "Von Frust getrieben greift der Anwender an. Wenn seine vorige Attacke fehlgeschlagen ist, verdoppelt sich die Stärke der Attacke." - }, - "shadowBone": { - name: "Schattenknochen", - effect: "Der Anwender greift das Ziel mit einem Knochen an, in dem eine Seele haust. Senkt eventuell die Verteidigung des Zieles." - }, - "accelerock": { - name: "Turbofelsen", - effect: "Der Anwender prallt mit großer Geschwindigkeit auf das Ziel. Hohe Erstschlagquote." - }, - "liquidation": { - name: "Aquadurchstoß", - effect: "Der Anwender greift das Ziel mit der Kraft des Wassers an. Senkt eventuell die Verteidigung des Zieles." - }, - "prismaticLaser": { - name: "Prisma-Laser", - effect: "Der Anwender feuert mithilfe von Prisma-Kraft mächtige Lichtstrahlen ab. In der nächsten Runde kann er nicht handeln." - }, - "spectralThief": { - name: "Diebesschatten", - effect: "Der Anwender schleicht sich in den Schatten des Zieles, stiehlt dessen erhöhte Statuswerte und fügt ihm Schaden zu." - }, - "sunsteelStrike": { - name: "Stahlgestirn", - effect: "Der Anwender stürzt mit der Gewalt eines Meteors auf das Ziel. Die Fähigkeit des Zieles wird dabei ignoriert." - }, - "moongeistBeam": { - name: "Schattenstrahl", - effect: "Der Anwender greift mit einem unheimlichen Lichtstrahl an. Diese Attacke ignoriert die Fähigkeit des Zieles." - }, - "tearfulLook": { - name: "Tränendrüse", - effect: "Dem Anwender stehen Tränen in den Augen, wodurch das Ziel seinen Kampfeswillen verliert. Angriff und Spezial-Angriff des Zieles sinken." - }, - "zingZap": { - name: "Elektropikser", - effect: "Der Anwender rammt das Ziel und schockt es mit starkem Strom. Das Ziel schreckt eventuell zurück." - }, - "naturesMadness": { - name: "Naturzorn", - effect: "Das Ziel wird vom Zorn der Natur getroffen und verliert dadurch die Hälfte seiner KP." - }, - "multiAttack": { - name: "Multi-Angriff", - effect: "Der Anwender sammelt eine große Menge Energie und greift das Ziel damit an. Der Typ der Attacke hängt von dem der Disc ab." - }, - "tenMillionVoltThunderbolt": { - name: "Tausendfacher Donnerblitz", - effect: "Das eine Kappe tragende Pikachu greift das Ziel mit einem durch Z-Kraft verstärkten Elektroschock an. Hohe Volltrefferquote." - }, - "mindBlown": { - name: "Knallkopf", - effect: "Der Anwender greift alle Pokémon in der Umgebung an, indem er seinen Kopf explodieren lässt. Dabei verletzt er sich auch selbst." - }, - "plasmaFists": { - name: "Plasmafäuste", - effect: "Ein Angriff mit elektrisch geladenen Fäusten, der bewirkt, dass Normal-Attacken den Typ Elektro annehmen." - }, - "photonGeyser": { - name: "Photonen-Geysir", - effect: "Ein Angriff mit einer Lichtsäule. Ist der Angriff höher als der Spezial-Angriff, wird die Höhe des Schadens durch den Angriff bestimmt und umgekehrt." - }, - "lightThatBurnsTheSky": { - name: "Licht des Erlöschens", - effect: "Ist der Angriff höher als der Spezial-Angriff, wird die Höhe des Schadens durch den Angriff bestimmt und umgekehrt. Ignoriert die Fähigkeit des Zieles." - }, - "searingSunrazeSmash": { - name: "Schmetternde Sonnenwalze", - effect: "Solgaleo greift das Ziel mithilfe von Z-Kraft mit voller Wucht an. Ignoriert die Fähigkeit des Zieles." - }, - "menacingMoonrazeMaelstrom": { - name: "Geballter Mondlaser", - effect: "Lunala greift das Ziel mithilfe von Z-Kraft mit voller Wucht an. Ignoriert die Fähigkeit des Zieles." - }, - "letsSnuggleForever": { - name: "Herzliche Knuddelkloppe", - effect: "Mimigma greift das Ziel mithilfe von Z-Kraft mit voller Wucht und viel Liebe an." - }, - "splinteredStormshards": { - name: "Fataler Steinregen", - effect: "Wolwerock greift das Ziel mithilfe von Z-Kraft mit voller Wucht an. Herrschen besondere Feldeffekte, werden diese zusätzlich neutralisiert." - }, - "clangorousSoulblaze": { - name: "Rasselnder Seelentanz", - effect: "Grandiras greift Gegner mithilfe von Z-Kraft mit voller Wucht an. Zusätzlich werden seine Statuswerte erhöht." - }, - "zippyZap": { - name: "Britzelturbo", - effect: "Ein stürmischer Blitz-Angriff mit hoher Erstschlag- und Volltrefferquote." - }, - "splishySplash": { - name: "Plätschersurfer", - effect: "Pikachu greift das Ziel mit einer großen, elektrisch aufgeladenen Welle an. Das Ziel wird eventuell paralysiert." - }, - "floatyFall": { - name: "Schwebesturz", - effect: "Pikachu schwebt nach oben und stürzt dann unvermittelt auf das Ziel herab. Das Ziel schreckt eventuell zurück." - }, - "pikaPapow": { - name: "Pika-Flash", - effect: "Je größer Pikachus Vertrauen zu seinem Trainer ist, desto stärker fällt dieser Angriff aus. Diese Attacke trifft immer." - }, - "bouncyBubble": { - name: "Blubbsauger", - effect: "Der Anwender greift mit Wasserblasen an. Seine KP werden in Höhe des vom Wasser angerichteten Schadens geheilt." - }, - "buzzyBuzz": { - name: "Knisterladung", - effect: "Evoli greift das Ziel mit Elektrizität an, wodurch dieses paralysiert wird." - }, - "sizzlySlide": { - name: "Flackerbrand", - effect: "Evoli hüllt sich in Flammen und stürzt sich beherzt auf das Ziel, welches dadurch Verbrennungen erleidet." - }, - "glitzyGlow": { - name: "Pulsieraura", - effect: "Evoli greift das Ziel gnadenlos mit telekinetischer Energie an. Dabei wird eine geheimnisvolle Wand erzeugt, die Spezial-Attacken des Ziels abschwächt." - }, - "baddyBad": { - name: "Quälzone", - effect: "Evoli zeigt sich von seiner dunklen Seite und greift an. Dabei wird eine geheimnisvolle Wand erzeugt, die physische Attacken des Ziels abschwächt." - }, - "sappySeed": { - name: "Sprießbomben", - effect: "Evoli lässt eine riesige Ranke wachsen, von der Samen herabfallen, die dem Ziel schaden und ihm in jeder Runde KP absaugen." - }, - "freezyFrost": { - name: "Klirrfrost", - effect: "Evoli greift mit einem schwarzen Kristall aus gefrorenem Nebel an. Die Statusveränderungen aller am Kampf beteiligten Pokémon werden zurückgesetzt." - }, - "sparklySwirl": { - name: "Glitzersturm", - effect: "Evoli greift an, indem es das Ziel in einen nahezu erstickend wohlriechenden Wirbelwind hüllt. Das Team des Anwenders wird von Statusproblemen geheilt." - }, - "veeveeVolley": { - name: "Evo-Crash", - effect: "Je größer Evolis Vertrauen zu seinem Trainer ist, desto stärker fällt dieser Angriff aus. Diese Attacke trifft immer." - }, - "doubleIronBash": { - name: "Panzerfäuste", - effect: "Der Anwender rotiert um die Schraubenmutter in seinem Brustkorb und schlägt zweimal hintereinander mit den Armen zu. Das Ziel schreckt eventuell zurück." - }, - "maxGuard": { - name: "Dyna-Wall", - effect: "Anwender wehrt jede Attacke ab. Scheitert eventuell bei Wiederholung." - }, - "dynamaxCannon": { - name: "Dynamax-Kanone", - effect: "Der Anwender schießt einen Strahl aus seinem Kern ab. Dynamaximierte Ziele erleiden doppelten Schaden." - }, - "snipeShot": { - name: "Präzisionsschuss", - effect: "Die Attacke richtet sich gegen das ausgewählte Ziel, unabhängig von Fähigkeiten oder Attacken, die Angriffe auf sich ziehen." - }, - "jawLock": { - name: "Fesselbiss", - effect: "Anwender und Ziel können nicht ausgetauscht werden, bis einer von ihnen kampfunfähig wird. Der Effekt endet, wenn eines der Pokémon das Kampffeld verlässt." - }, - "stuffCheeks": { - name: "Backenstopfer", - effect: "Der Anwender frisst die Beere, die er trägt, wodurch seine Verteidigung stark erhöht wird." - }, - "noRetreat": { - name: "Finalformation", - effect: "Alle Statuswerte des Anwenders werden erhöht, aber dafür kann er weder ausgewechselt werden noch fliehen." - }, - "tarShot": { - name: "Teerschuss", - effect: "Der Anwender übergießt das Ziel mit klebrigem Teer und senkt so dessen Initiative. Dadurch wird es schwach gegenüber Feuer-Attacken." - }, - "magicPowder": { - name: "Magiepuder", - effect: "Das Ziel wird mit magischem Puder bestreut und nimmt den Typ Psycho an." - }, - "dragonDarts": { - name: "Drachenpfeile", - effect: "Der Anwender greift zweimal mit Grolldra an. Bei zwei Zielen werden beide jeweils einmal angegriffen." - }, - "teatime": { - name: "Teatime", - effect: "Der Anwender lädt alle am Kampf beteiligten Pokémon zu einem Teekränzchen ein, woraufhin diese die Beeren essen, die sie bei sich tragen." - }, - "octolock": { - name: "Octoklammer", - effect: "Das Ziel wird an der Flucht gehindert und seine Verteidigung und Spezial-Verteidigung sinken jede Runde." - }, - "boltBeak": { - name: "Schockschnabel", - effect: "Der Anwender sticht mit einem elektrisch aufgeladenen Schnabel zu. Kommt er vor dem Ziel zum Zug, verdoppelt sich die Stärke der Attacke." - }, - "fishiousRend": { - name: "Kiemenbiss", - effect: "Der Anwender beißt mit seinen harten Kiemen zu. Kommt er vor dem Ziel zum Zug, verdoppelt sich die Stärke der Attacke." - }, - "courtChange": { - name: "Seitenwechsel", - effect: "Durch eine mysteriöse Macht werden wirksame Effekte auf Mitstreiterseite und gegnerischer Seite getauscht." - }, - "maxFlare": { - name: "Dyna-Brand", - effect: "Eine Feuer-Attacke, die nur Dynamax-Pokémon einsetzen können. Die Sonne brennt unbarmherzig fünf Runden lang." - }, - "maxFlutterby": { - name: "Dyna-Schwarm", - effect: "Eine Käfer-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt den Spezial-Angriff des Zieles." - }, - "maxLightning": { - name: "Dyna-Gewitter", - effect: "Eine Elektro-Attacke, die nur Dynamax-Pokémon einsetzen können. Erzeugt fünf Runden lang ein Elektrofeld." - }, - "maxStrike": { - name: "Dyna-Angriff", - effect: "Eine Normal-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt die Initiative des Zieles." - }, - "maxKnuckle": { - name: "Dyna-Faust", - effect: "Eine Kampf-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht den Angriff der Mitstreiterseite." - }, - "maxPhantasm": { - name: "Dyna-Spuk", - effect: "Eine Geister-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt die Verteidigung des Zieles." - }, - "maxHailstorm": { - name: "Dyna-Frost", - effect: "Eine Eis-Attacke, die nur Dynamax-Pokémon einsetzen können. Lässt fünf Runden lang einen Hagelsturm toben." - }, - "maxOoze": { - name: "Dyna-Giftschwall", - effect: "Eine Gift-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht den Spezial-Angriff der Mitstreiterseite." - }, - "maxGeyser": { - name: "Dyna-Flut", - effect: "Eine Wasser-Attacke, die nur Dynamax-Pokémon einsetzen können. Löst fünf Runden lang strömenden Regen aus." - }, - "maxAirstream": { - name: "Dyna-Düse", - effect: "Eine Flug-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht die Initiative der Mitstreiterseite." - }, - "maxStarfall": { - name: "Dyna-Zauber", - effect: "Eine Feen-Attacke, die nur Dynamax-Pokémon einsetzen können. Erzeugt fünf Runden lang ein Nebelfeld." - }, - "maxWyrmwind": { - name: "Dyna-Wyrm", - effect: "Eine Drachen-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt den Angriff des Zieles." - }, - "maxMindstorm": { - name: "Dyna-Kinese", - effect: "Eine Psycho-Attacke, die nur Dynamax-Pokémon einsetzen können. Erzeugt fünf Runden lang ein Psychofeld." - }, - "maxRockfall": { - name: "Dyna-Brocken", - effect: "Eine Gesteins-Attacke, die nur Dynamax-Pokémon einsetzen können. Lässt fünf Runden lang einen Sandsturm toben." - }, - "maxQuake": { - name: "Dyna-Erdstoß", - effect: "Eine Boden-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht die Spezial-Verteidigung der Mitstreiterseite." - }, - "maxDarkness": { - name: "Dyna-Dunkel", - effect: "Eine Unlicht-Attacke, die nur Dynamax-Pokémon einsetzen können. Senkt die Spezial-Verteidigung des Zieles." - }, - "maxOvergrowth": { - name: "Dyna-Flora", - effect: "Eine Pflanzen-Attacke, die nur Dynamax-Pokémon einsetzen können. Erzeugt fünf Runden lang ein Grasfeld." - }, - "maxSteelspike": { - name: "Dyna-Stahlzacken", - effect: "Eine Stahl-Attacke, die nur Dynamax-Pokémon einsetzen können. Erhöht die Verteidigung der Mitstreiterseite." - }, - "clangorousSoul": { - name: "Seelentanz", - effect: "Der Anwender setzt eine kleine Menge an KP ein, um alle seine Statuswerte zu erhöhen." - }, - "bodyPress": { - name: "Body Press", - effect: "Der Anwender greift mit seinem ganzen Körper an. Je höher seine Verteidigung ist, desto mehr Schaden richtet er an." - }, - "decorate": { - name: "Verzierung", - effect: "Durch Verzierungen werden der Angriff und Spezial-Angriff des Zieles stark erhöht." - }, - "drumBeating": { - name: "Trommelschläge", - effect: "Der Anwender kontrolliert durch Trommeln Wurzeln, die das Ziel angreifen und dessen Initiative senken." - }, - "snapTrap": { - name: "Fangeisen", - effect: "Das Ziel wird vier bis fünf Runden lang in einem Fangeisen festgehalten und angegriffen." - }, - "pyroBall": { - name: "Feuerball", - effect: "Der Anwender greift mit einem Ball aus Feuer an, den er durch Anzünden eines kleinen Steins erzeugt. Fügt dem Ziel eventuell Verbrennungen zu." - }, - "behemothBlade": { - name: "Gigantenhieb", - effect: "Der Anwender wird zu einem riesigen Schwert und greift das Ziel an. Dynamaximierte Ziele erleiden doppelten Schaden." - }, - "behemothBash": { - name: "Gigantenstoß", - effect: "Der Anwender wird zu einem riesigen Schild und greift das Ziel an. Dynamaximierte Ziele erleiden doppelten Schaden." - }, - "auraWheel": { - name: "Aura-Rad", - effect: "Mithilfe der in den Backentaschen gespeicherten Energie greift der Anwender an und erhöht seine Initiative. Der Typ der Attacke hängt von Morpekos Form ab." - }, - "breakingSwipe": { - name: "Breitseite", - effect: "Der Anwender schwingt heftig seinen robusten Schweif, um damit gegnerische Pokémon anzugreifen und ihren Angriffs-Wert zu senken." - }, - "branchPoke": { - name: "Zweigstoß", - effect: "Der Anwender attackiert das Ziel mit einem spitzen Zweig." - }, - "overdrive": { - name: "Overdrive", - effect: "Der Anwender haut in die Saiten seiner Gitarre oder seines Basses und erzeugt dröhnende, kraftvolle Vibrationen, die gegnerischen Pokémon schaden." - }, - "appleAcid": { - name: "Apfelsäure", - effect: "Der Anwender greift mit einer aus einem sauren Apfel hergestellten säurehaltigen Flüssigkeit an. Dabei wird die Spezial-Verteidigung des Zieles gesenkt." - }, - "gravApple": { - name: "Gravitation", - effect: "Ein Apfel fällt aus großer Höhe herab und richtet Schaden an. Dabei wird die Verteidigung des Zieles gesenkt." - }, - "spiritBreak": { - name: "Seelenbruch", - effect: "Die Attacke trifft das Ziel mit so viel Wucht, dass es den Mut verliert. Dabei wird sein Spezial-Angriff gesenkt." - }, - "strangeSteam": { - name: "Wunderdampf", - effect: "Der Anwender stößt Dampf aus, mit dem er das Ziel angreift. Dieses wird eventuell verwirrt." - }, - "lifeDew": { - name: "Lebenstropfen", - effect: "Wundersames Wasser heilt die KP des Anwenders und seiner am Kampf beteiligten Mitstreiter." - }, - "obstruct": { - name: "Abblocker", - effect: "Der Anwender wehrt jede Attacke ab. Berührt ihn währenddessen ein Pokémon, sinkt dessen Verteidigung stark. Scheitert eventuell bei Wiederholung." - }, - "falseSurrender": { - name: "Kniefalltrick", - effect: "Der Anwender tut so, als würde er sich verneigen, und sticht dann mit seinem zerzausten Fell zu. Diese Attacke trifft immer." - }, - "meteorAssault": { - name: "Sternensturm", - effect: "Der Anwender greift mit seiner Lauchstange an. Von der Wucht der Attacke wird ihm jedoch so schwindelig, dass er in der nächsten Runde nicht handeln kann." - }, - "eternabeam": { - name: "Unendynastrahlen", - effect: "Der mächtigste Angriff, über den Endynalos in seiner ursprünglichen Form verfügt. In der nächsten Runde kann der Anwender nicht handeln." - }, - "steelBeam": { - name: "Stahlstrahl", - effect: "Der Anwender schießt Stahl, den er in seinem ganzen Körper angesammelt hat, in Form eines mächtigen Strahls ab. Dabei verletzt er sich auch selbst." - }, - "expandingForce": { - name: "Flächenmacht", - effect: "Der Anwender greift das Ziel mit Psycho-Kräften an. Wenn ein Psychofeld aktiv ist, steigt die Stärke und es wird allen gegnerischen Pokémon Schaden zugefügt." - }, - "steelRoller": { - name: "Eisenwalze", - effect: "Der Anwender greift an und zerstört dabei etwaige Felder. Ist kein Feld aktiv, schlägt die Attacke fehl." - }, - "scaleShot": { - name: "Schuppenschuss", - effect: "Der Anwender greift das Ziel zwei- bis fünfmal hintereinander mit Schuppen-Geschossen an. Erhöht die eigene Initiative, aber senkt die Verteidigung." - }, - "meteorBeam": { - name: "Meteorstrahl", - effect: "Der Anwender sammelt in Runde 1 kosmische Kräfte und erhöht damit seinen Spezial-Angriff, bevor er in Runde 2 das Ziel angreift." - }, - "shellSideArm": { - name: "Muschelwaffe", - effect: "Je nachdem, was höher ausfällt, richtet diese Attacke entweder physischen oder Spezial-Schaden an. Das Ziel wird eventuell vergiftet." - }, - "mistyExplosion": { - name: "Nebelexplosion", - effect: "Der Anwender greift alle Pokémon im Umkreis an und wird danach kampfunfähig. Die Stärke dieser Attacke steigt, wenn ein Nebelfeld aktiv ist." - }, - "grassyGlide": { - name: "Grasrutsche", - effect: "Der Anwender rutscht über den Boden und greift das Ziel an. Ermöglicht den Erstschlag, wenn ein Grasfeld aktiv ist." - }, - "risingVoltage": { - name: "Hochspannung", - effect: "Der Anwender greift mit aus dem Boden aufsteigender Elektrizität an. Die Stärke der Attacke wird verdoppelt, wenn beim Gegner ein Elektrofeld aktiv ist." - }, - "terrainPulse": { - name: "Feldimpuls", - effect: "Der Anwender nutzt die Kraft des aktiven Feldes für seinen Angriff. Der Typ und die Stärke der Attacke ändern sich je nach Art des aktiven Feldes." - }, - "skitterSmack": { - name: "Krabbelkracher", - effect: "Der Anwender kriecht hinter das Ziel, greift es an und senkt dabei dessen Spezial-Angriff." - }, - "burningJealousy": { - name: "Neidflammen", - effect: "Der Anwender greift mit der Energie seines Neids an und fügt allen gegnerischen Pokémon, deren Statuswerte in dieser Runde erhöht wurden, Verbrennungen zu." - }, - "lashOut": { - name: "Frustventil", - effect: "Der Anwender entlädt seinen Frust in einem Angriff. Die Stärke der Attacke wird verdoppelt, wenn seine Statuswerte in dieser Runde gesenkt wurden." - }, - "poltergeist": { - name: "Poltergeist", - effect: "Der Anwender greift das Ziel mit dessen getragenem Item an. Die Attacke schlägt fehl, wenn das Ziel kein Item trägt." - }, - "corrosiveGas": { - name: "Korrosionsgas", - effect: "Der Anwender greift alle Pokémon im Umkreis mit einem ätzenden Gas an. Getragene Items werden dadurch zersetzt." - }, - "coaching": { - name: "Coaching", - effect: "Der Anwender sorgt durch geschickte Anweisungen dafür, dass der Angriff und die Verteidigung seiner Mitstreiter steigen." - }, - "flipTurn": { - name: "Rollwende", - effect: "Nach der Attacke eilt der Anwender zurück und tauscht den Platz mit einem anderen Pokémon." - }, - "tripleAxel": { - name: "Dreifach-Axel", - effect: "Tritt das Ziel ein- bis dreimal nacheinander. Die Härte der Tritte nimmt von Treffer zu Treffer zu." - }, - "dualWingbeat": { - name: "Doppelflügel", - effect: "Der Anwender trifft das Ziel zweimal hintereinander mit seinen Flügeln und fügt ihm so Schaden zu." - }, - "scorchingSands": { - name: "Brandsand", - effect: "Der Anwender greift das Ziel mit brennend heißem Sand an und fügt ihm eventuell Verbrennungen zu." - }, - "jungleHealing": { - name: "Dschungelheilung", - effect: "Der Anwender wird eins mit dem Dschungel und heilt bei sich und seinen am Kampf beteiligten Mitstreitern KP und hebt jegliche Statusprobleme auf." - }, - "wickedBlow": { - name: "Finstertreffer", - effect: "Der Anwender hat den Stil des Unlichts gemeistert und führt einen fokussierten, harten Schlag mit Volltreffergarantie aus." - }, - "surgingStrikes": { - name: "Trefferschwall", - effect: "Der Anwender hat den Stil des Wassers gemeistert und führt mit fließenden Bewegungen drei Angriffe in Folge mit Volltreffergarantie aus." - }, - "thunderCage": { - name: "Blitzgefängnis", - effect: "Das Ziel wird für vier bis fünf Runden in einem elektrischen Käfig gefangen." - }, - "dragonEnergy": { - name: "Drachenkräfte", - effect: "Der Anwender wandelt seine Lebenskraft in Energie um und greift gegnerische Pokémon an. Je höher seine KP sind, desto mehr Schaden wird angerichtet." - }, - "freezingGlare": { - name: "Eisiger Blick", - effect: "Der Anwender greift das Ziel mit Psycho-Kräften an, die er aus seinen Augen abschießt. Das Ziel friert eventuell ein." - }, - "fieryWrath": { - name: "Brennender Zorn", - effect: "Der Anwender wandelt seinen Zorn in eine flammende Aura um und greift damit gegnerische Pokémon an. Diese schrecken eventuell zurück." - }, - "thunderousKick": { - name: "Donnernder Tritt", - effect: "Der Anwender bringt das Ziel mit blitzschnellen Bewegungen durcheinander und tritt dann zu. Senkt die Verteidigung des Zieles." - }, - "glacialLance": { - name: "Blizzardlanze", - effect: "Der Anwender wirft eine in einen Blizzard gehüllte Lanze aus Eis auf gegnerische Pokémon." - }, - "astralBarrage": { - name: "Astralfragmente", - effect: "Der Anwender greift gegnerische Pokémon mit vielen kleinen Spukgestalten an." - }, - "eerieSpell": { - name: "Schauderspruch", - effect: "Der Anwender greift mit gewaltigen Psycho-Kräften an. Die AP der letzten Attacke des Zieles werden um 3 Punkte gesenkt." - }, - "direClaw": { - name: "Unheilsklauen", - effect: "Der Anwender greift mit zerstörerischen Klauen an. Das Ziel wird eventuell vergiftet, paralysiert oder in Schlaf versetzt." - }, - "psyshieldBash": { - name: "Barrierenstoß", - effect: "Der Anwender hüllt sich in Psycho-Energie und rammt das Ziel. Außerdem steigt seine Verteidigung." - }, - "powerShift": { - name: "Kraftwechsel", - effect: "Der Anwender tauscht seinen Angriff mit seiner Verteidigung." - }, - "stoneAxe": { - name: "Felsaxt", - effect: "Der Anwender greift mit seinen Felsäxten an. Dadurch verstreut er schwebende Felssplitter im Umkreis des Zieles." - }, - "springtideStorm": { - name: "Frühlingsorkan", - effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen voller Hassliebe umgibt. Eventuell sinkt ihr Angriff." - }, - "mysticalPower": { - name: "Mythenkraft", - effect: "Der Anwender greift mit einer wundersamen Kraft an. Außerdem steigt sein Spezial-Angriff." - }, - "ragingFury": { - name: "Flammenwut", - effect: "Der Anwender wütet zwei bis drei Runden lang und speit heftige Flammen aus. Danach wird er verwirrt." - }, - "waveCrash": { - name: "Wellentackle", - effect: "Der Anwender hüllt sich in Wasser und stürzt sich mit dem ganzen Körper auf das Ziel, wobei er selbst großen Schaden erleidet." - }, - "chloroblast": { - name: "Chlorostrahl", - effect: "Der Anwender greift mit einer hohen Konzentration seines Chlorophylls an, wobei er selbst Schaden erleidet." - }, - "mountainGale": { - name: "Frostfallwind", - effect: "Der Anwender wirft gigantische Eisbrocken auf das Ziel. Dieses schreckt eventuell zurück." - }, - "victoryDance": { - name: "Siegestanz", - effect: "Der Anwender führt einen wilden Tanz auf, der den Sieg herbeiführen soll. Dies erhöht seinen Angriff, seine Verteidigung und seine Initiative." - }, - "headlongRush": { - name: "Schmetterramme", - effect: "Der Anwender rammt das Ziel mit dem ganzen Körper. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders." - }, - "barbBarrage": { - name: "Giftstachelregen", - effect: "Der Anwender greift mit unzähligen Giftstacheln an und vergiftet das Ziel eventuell. Doppelt so stark gegen vergiftete Ziele." - }, - "esperWing": { - name: "Auraschwingen", - effect: "Ein schneidender Angriff mit durch eine Aura verstärkten Schwingen, der außerdem die Initiative des Anwenders erhöht. Hohe Volltrefferquote." - }, - "bitterMalice": { - name: "Niedertracht", - effect: "Der Anwender greift mit eiskaltem, schaudererregendem Hass an und senkt dabei den Angriff des Zieles." - }, - "shelter": { - name: "Refugium", - effect: "Der Anwender macht seine Haut so hart wie Eisen und erhöht dadurch seine Verteidigung stark." - }, - "tripleArrows": { - name: "Drillingspfeile", - effect: "Der Anwender tritt zu und schießt dann drei Pfeile ab. Senkt eventuell die Verteidigung des Zieles oder lässt es zurückschrecken. Hohe Volltrefferquote." - }, - "infernalParade": { - name: "Phantomparade", - effect: "Angriff mit unzähligen Feuerkugeln, der dem Ziel eventuell Verbrennungen zufügt. Doppelt so stark gegen Ziele mit Statusproblemen." - }, - "ceaselessEdge": { - name: "Klingenschwall", - effect: "Der Anwender greift mit einer klingengleichen Muschelschale an und verstreut Muschelsplitter, die Stacheln zu Füßen des Zieles werden." - }, - "bleakwindStorm": { - name: "Polarorkan", - effect: "Der Anwender greift mit starken, kalten Winden an, die Körper und Geist erzittern lassen. Senkt eventuell die Initiative gegnerischer Pokémon." - }, - "wildboltStorm": { - name: "Donnerorkan", - effect: "Der Anwender ruft ein heftiges Unwetter herbei, um mit Wind und Blitzen anzugreifen. Gegnerische Pokémon werden eventuell paralysiert." - }, - "sandsearStorm": { - name: "Wüstenorkan", - effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen und brennend heißem Sand umgibt. Eventuell erleiden sie Verbrennungen." - }, - "lunarBlessing": { - name: "Lunargebet", - effect: "Der Anwender richtet ein Gebet an den Mond und heilt bei sich und seinen am Kampf beteiligten Mitstreitern KP und hebt jegliche Statusprobleme auf." - }, - "takeHeart": { - name: "Mutschub", - effect: "Der Anwender fasst sich ein Herz, befreit sich von Statusproblemen und erhöht außerdem seinen Spezial-Angriff und seine Spezial-Verteidigung." - }, - "gMaxWildfire": { - name: "Giga-Feuerflug", - effect: "Eine Feuer-Attacke, die nur Gigadynamax-Glurak einsetzen kann. Fügt vier Runden lang Schaden zu." - }, - "gMaxBefuddle": { - name: "Giga-Benebelung", - effect: "Eine Käfer-Attacke, die nur Gigadynamax-Smettbo einsetzen kann. Gegnerische Pokémon werden entweder vergiftet, paralysiert oder in Schlaf versetzt." - }, - "gMaxVoltCrash": { - name: "Giga-Blitzhagel", - effect: "Eine Elektro-Attacke, die nur Gigadynamax-Pikachu einsetzen kann. Gegnerische Pokémon werden paralysiert." - }, - "gMaxGoldRush": { - name: "Giga-Münzregen", - effect: "Eine Normal-Attacke, die nur Gigadynamax-Mauzi einsetzen kann. Verwirrt Gegner und bringt nach dem Kampf Geld ein." - }, - "gMaxChiStrike": { - name: "Giga-Fokusschlag", - effect: "Eine Kampf-Attacke, die nur Gigadynamax-Machomei einsetzen kann. Erhöht die Volltrefferquote auf Mitstreiterseite." - }, - "gMaxTerror": { - name: "Giga-Spuksperre", - effect: "Eine Geister-Attacke, die nur Gigadynamax-Gengar einsetzen kann. Hindert gegnerische Pokémon an der Flucht beziehungsweise am Auswechseln." - }, - "gMaxResonance": { - name: "Giga-Melodie", - effect: "Eine Eis-Attacke, die nur Gigadynamax-Lapras einsetzen kann. Reduziert fünf Runden lang den erlittenen Schaden." - }, - "gMaxCuddle": { - name: "Giga-Gekuschel", - effect: "Eine Normal-Attacke, die nur Gigadynamax-Evoli einsetzen kann. Gegnerische Pokémon verlieben sich in es." - }, - "gMaxReplenish": { - name: "Giga-Recycling", - effect: "Eine Normal-Attacke, die nur Gigadynamax-Relaxo einsetzen kann. Stellt bereits verzehrte Beeren wieder her." - }, - "gMaxMalodor": { - name: "Giga-Gestank", - effect: "Eine Gift-Attacke, die nur Gigadynamax-Deponitox einsetzen kann. Vergiftet gegnerische Pokémon." - }, - "gMaxStonesurge": { - name: "Giga-Geröll", - effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kamalm einsetzen kann. Verstreut viele spitze Steinbrocken auf dem Kampffeld." - }, - "gMaxWindRage": { - name: "Giga-Sturmstoß", - effect: "Eine Flug-Attacke, die nur Gigadynamax-Krarmor einsetzen kann. Beseitigt die Effekte von Attacken wie Reflektor und Lichtschild.." - }, - "gMaxStunShock": { - name: "Giga-Voltschlag", - effect: "Eine Elektro-Attacke, die nur Gigadynamax-Riffex einsetzen kann. Vergiftet oder paralysiert gegnerische Pokémon." - }, - "gMaxFinale": { - name: "Giga-Lichtblick", - effect: "Eine Feen-Attacke, die nur Gigadynamax-Pokusan einsetzen kann. Füllt die KP auf Mitstreiterseite auf." - }, - "gMaxDepletion": { - name: "Giga-Dämpfer", - effect: "Eine Drachen-Attacke, die nur Gigadynamax-Duraludon einsetzen kann. AP der letzten Attacke, die gegnerische Pokémon eingesetzt haben, werden gesenkt." - }, - "gMaxGravitas": { - name: "Giga-Astrowellen", - effect: "Eine Psycho-Attacke, die nur Gigadynamax-Maritellit einsetzen kann. Ändert die Erdanziehung für fünf Runden." - }, - "gMaxVolcalith": { - name: "Giga-Schlacke", - effect: "Eine Gesteins-Attacke, die nur Gigadynamax-Montecarbo einsetzen kann. Fügt vier Runden lang Schaden zu." - }, - "gMaxSandblast": { - name: "Giga-Sandstoß", - effect: "Eine Boden-Attacke, die nur Gigadynamax-Sanaconda einsetzen kann. Eine Sandhose wütet für vier bis fünf Runden." - }, - "gMaxSnooze": { - name: "Giga-Gähnzwang", - effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Olangaar einsetzen kann. Mit einem großen Gähner wird das Ziel müde gemacht und schläft in der nächsten Runde ein." - }, - "gMaxTartness": { - name: "Giga-Säureguss", - effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Drapfel einsetzen kann. Senkt den Ausweichwert der gegnerischen Pokémon." - }, - "gMaxSweetness": { - name: "Giga-Nektarflut", - effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Schlapfel einsetzen kann. Heilt Statusprobleme auf Mitstreiterseite." - }, - "gMaxSmite": { - name: "Giga-Sanktion", - effect: "Eine Feen-Attacke, die nur Gigadynamax-Silembrim einsetzen kann. Verwirrt gegnerische Pokémon." - }, - "gMaxSteelsurge": { - name: "Giga-Stahlschlag", - effect: "Eine Stahl-Attacke, die nur Gigadynamax-Patinaraja einsetzen kann. Verstreut viele zackige Stahlsplitter auf dem Kampffeld." - }, - "gMaxMeltdown": { - name: "Giga-Schmelze", - effect: "Eine Stahl-Attacke, die nur Gigadynamax-Melmetal einsetzen kann. Hindert Gegner am wiederholten Einsatz derselben Attacke." - }, - "gMaxFoamBurst": { - name: "Giga-Schaumbad", - effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kingler einsetzen kann. Senkt die Initiative der gegnerischen Pokémon stark." - }, - "gMaxCentiferno": { - name: "Giga-Feuerkessel", - effect: "Eine Feuer-Attacke, die nur Gigadynamax-Infernopod einsetzen kann. Schließt gegnerische Pokémon vier bis fünf Runden in wirbelnden Flammen ein." - }, - "gMaxVineLash": { - name: "Giga-Geißel", - effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Bisaflor einsetzen kann. Geißelt gegnerische Pokémon vier Runden lang mit peitschenartigen Ranken." - }, - "gMaxCannonade": { - name: "Giga-Beschuss", - effect: "Eine Wasser-Attacke, die nur Gigadynamax-Turtok einsetzen kann. Schließt gegnerische Pokémon vier Runden lang in einem Wasserwirbel ein." - }, - "gMaxDrumSolo": { - name: "Giga-Getrommel", - effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Gortrom einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." - }, - "gMaxFireball": { - name: "Giga-Brandball", - effect: "Eine Feuer-Attacke, die nur Gigadynamax-Liberlo einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." - }, - "gMaxHydrosnipe": { - name: "Giga-Schütze", - effect: "Eine Wasser-Attacke, die nur Gigadynamax-Intelleon einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." - }, - "gMaxOneBlow": { - name: "Giga-Einzelhieb", - effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Einzelhieb ignoriert die schützende Wirkung von Dyna-Wall." - }, - "gMaxRapidFlow": { - name: "Giga-Multihieb", - effect: "Eine Wasser-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Multihieb ignoriert die schützende Wirkung von Dyna-Wall." - }, - "teraBlast": { - name: "Tera-Ausbruch", - effect: "Ist der Anwender terakristallisiert, greift er mit Energie seines Tera-Typs an. Der Schaden hängt vom Angriff oder Spezial-Angriff ab, je nachdem, welcher Wert höher ist." - }, - "silkTrap": { - name: "Fadenfalle", - effect: "Der Anwender spannt eine Falle aus Fäden und wird so vor Angriffen geschützt. Berührt ihn nun ein Angreifer, sinkt dessen Initiative." - }, - "axeKick": { - name: "Fersenkick", - effect: "Der Anwender greift an, indem er seine erhobene Ferse hinunterschnellen lässt. Das Ziel wird eventuell verwirrt. Bei Misserfolg verletzt sich der Anwender selbst." - }, - "lastRespects": { - name: "Letzte Ehre", - effect: "Der Anwender rächt gefallene Mitstreiter. Je mehr kampfunfähige Pokémon sich im Team befinden, desto stärker ist die Attacke." - }, - "luminaCrash": { - name: "Lichteinschlag", - effect: "Der Anwender greift an, indem er ein sonderbares Licht freisetzt, das sich auch auf die Psyche auswirkt. Zudem wird die Spezial-Verteidigung des Zieles stark gesenkt." - }, - "orderUp": { - name: "Auftischen", - effect: "Eine Attacke mit geübten Bewegungen. Trägt der Anwender ein Nigiragi im Maul, erhöht sich je nach dessen Form ein Statuswert des Anwenders." - }, - "jetPunch": { - name: "Düsenhieb", - effect: "Bei dieser Erstschlag-Attacke hüllt der Anwender seine Faust in einen Strudel und greift mit einem extrem schnellen Hieb an." - }, - "spicyExtract": { - name: "Chili-Essenz", - effect: "Der Anwender setzt eine unglaublich scharfe Essenz frei, die den Angriff des Zieles stark erhöht, aber seine Verteidigung stark senkt." - }, - "spinOut": { - name: "Reifendrehung", - effect: "Der Anwender wirbelt wild umher, indem er sein Gewicht auf seine Extremitäten verlagert, und richtet so Schaden an. Seine eigene Initiative sinkt dadurch stark" - }, - "populationBomb": { - name: "Mäuseplage", - effect: "Der Anwender versammelt eine Schar von Artgenossen, die dann geschlossen angreift und das Ziel ein- bis zehnmal hintereinander trifft." - }, - "iceSpinner": { - name: "Eiskreisel", - effect: "Der Anwender hüllt seine Füße in dünnes Eis, wirbelt herum und greift so das Ziel an. Die Drehung zerstört etwaige Felder" - }, - "glaiveRush": { - name: "Großklingenstoß", - effect: "Der Anwender stürzt sich waghalsig auf das Ziel. Bis zum nächsten Zug des Anwenders treffen ihn gegnerische Angriffe garantiert und richten doppelten Schaden an." - }, - "revivalBlessing": { - name: "Vitalsegen", - effect: "Der Anwender belebt mit einem Wunsch voller Mitgefühl ein kampfunfähiges Team-Mitglied wieder und stellt die Hälfte dessen maximaler KP wieder her." - }, - "saltCure": { - name: "Pökelsalz", - effect: "Der Anwender pökelt das Ziel mit Salz ein, wodurch dieses jede Runde Schaden erleidet. Stahl- und Wasser-Pokémon leiden besonders darunter." - }, - "tripleDive": { - name: "Tauchtriade", - effect: "Der Anwender taucht mit perfekt abgestimmtem Timing ab und trifft das Ziel mit Wasserspritzern. Dabei richtet er dreimal hintereinander Schaden an." - }, - "mortalSpin": { - name: "Letalwirbler", - effect: "Der Anwender greift mit einer wirbelnden Attacke an, die Gegner auch vergiftet. Befreit den Anwender unter anderem von Wickel, Klammergriff und Egelsamen." - }, - "doodle": { - name: "Abpausen", - effect: "Der Anwender kopiert die wahre Essenz des Zieles. Dadurch erhalten alle Pokémon auf der Mitstreiterseite die Fähigkeit des Zieles." - }, - "filletAway": { - name: "Abspaltung", - effect: "Der Anwender setzt seine KP ein, um seinen Angriff, seinen Spezial-Angriff und seine Initiative stark zu erhöhen." - }, - "kowtowCleave": { - name: "Kniefallspalter", - effect: "Der Anwender fällt auf die Knie und verleitet das Ziel zu Unachtsamkeit, bevor er mit einer Klinge zuschlägt. Diese Attacke trifft garantiert." - }, - "flowerTrick": { - name: "Blumentrick", - effect: "Der Anwender greift an, indem er dem Ziel einen Trick-Strauß zuwirft. Diese Attacke trifft immer und hat zudem Volltreffergarantie." - }, - "torchSong": { - name: "Loderlied", - effect: "Der Anwender spuckt inbrünstig lodernde Flammen, als würde er singen, und versengt das Ziel. Dadurch steigt auch der Spezial-Angriff des Anwenders." - }, - "aquaStep": { - name: "Wogentanz", - effect: "Der Anwender neckt das Ziel mit flinken, fließenden Tanzschritten und greift es dann an. Dadurch steigt auch die Initiative des Anwenders." - }, - "ragingBull": { - name: "Rasender Stier", - effect: "Ein rasender Angriff eines wilden Stiers, der auch Barrieren wie Lichtschild und Reflektor durchbricht. Der Attacken-Typ hängt von der Form des Anwenders ab." - }, - "makeItRain": { - name: "Goldrausch", - effect: "Der Anwender greift an, indem er Unmengen an Münzen ausschüttet, senkt dabei aber seinen Spezial-Angriff. Das Geld wird nach dem Kampf aufgesammelt." - }, - "psyblade": { - name: "Psychoschneide", - effect: "Das Ziel wird mit einer immateriellen Klinge angegriffen. Die Stärke der Attacke steigt um 50 %, wenn beim Anwender ein Elektrofeld aktiv ist." - }, - "hydroSteam": { - name: "Hydrodampf", - effect: "Das Ziel wird kraftvoll mit brodelndem Wasser übergossen. Wider Erwarten sinkt die Stärke der Attacke bei starkem Sonnenlicht nicht, sondern steigt um 50 %." - }, - "ruination": { - name: "Verderben", - effect: "Der Anwender beschwört Verderben bringendes Unheil herauf und halbiert die KP des Zieles." - }, - "collisionCourse": { - name: "Kollisionskurs", - effect: "Der Anwender wechselt seine Form, während er sich gen Boden stürzt, und verursacht eine riesige Ur-Explosion. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr." - }, - "electroDrift": { - name: "Blitztour", - effect: "Der Anwender wechselt bei rasantem Tempo seine Form und trifft das Ziel mit einem futuristischen Elektroschlag. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr." - }, - "shedTail": { - name: "Schwanzabwurf", - effect: "Der Anwender setzt seine KP ein, um einen Doppelgänger zu erzeugen, und tauscht dann den Platz mit einem anderen Pokémon." - }, - "chillyReception": { - name: "Eisige Stimmung", - effect: "Der Anwender sorgt mit einem schlechten Witz für eisige Stimmung und tauscht den Platz mit einem anderen Pokémon. Erzeugt fünf Runden lang Schnee." - }, - "tidyUp": { - name: "Aufräumen", - effect: "Die Effekte von Stachler, Tarnsteine, Klebenetz, Giftspitzen und Delegator werden aufgehoben. Zudem steigen der Angriff und die Initiative des Anwenders." - }, - "snowscape": { - name: "Schneelandschaft", - effect: "Erzeugt fünf Runden lang Schnee. Dadurch wird die Verteidigung von Eis-Pokémon erhöht." - }, - "pounce": { - name: "Anspringen", - effect: "Der Anwender greift an, indem er das Ziel anspringt. Dadurch sinkt auch die Initiative des Zieles." - }, - "trailblaze": { - name: "Wegbereiter", - effect: "Der Anwender greift an, als würde er aus hohem Gras hervorspringen. Mit wendigen Schritten erhöht er seine Initiative." - }, - "chillingWater": { - name: "Kalte Dusche", - effect: "Der Anwender greift an, indem er das Ziel mit eiskaltem Wasser überschüttet. Das raubt dem Ziel seinen Kampfgeist und senkt so seinen Angriff." - }, - "hyperDrill": { - name: "Hyperbohrer", - effect: " Der Anwender lässt einen spitzen Teil seines Körpers rasant rotieren, sticht zu und durchbricht dabei auch die Wirkung von Attacken wie Schutzschild und Scanner." - }, - "twinBeam": { - name: "Doppelstrahl", - effect: "Der Anwender greift mit übernatürlichen Lichtstrahlen an, die er aus seinen Augen abfeuert, und trifft das Ziel zweimal hintereinander." - }, - "rageFist": { - name: "Zornesfaust", - effect: "Ein Angriff, für den der Anwender seinen Zorn in Energie umwandelt. Je häufiger der Anwender getroffen wurde, desto stärker wird diese Attacke." - }, - "armorCannon": { - name: "Rüstungskanone", - effect: "Der Anwender schießt die eigene Rüstung als glühendes Projektil auf das Ziel. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders." - }, - "bitterBlade": { - name: "Reueschwert", - effect: "Der Anwender tränkt seine Klinge in Bedauern und Reue und greift damit an. Die Hälfte des zugefügten Schadens wird dem Anwender als KP gutgeschrieben." - }, - "doubleShock": { - name: "Zweifachladung", - effect: "Der Anwender nutzt die gesamte Elektrizität in seinem Körper, um großen Schaden auszuteilen. Die restliche Kampfdauer gehört er nicht mehr dem Typ Elektro an." - }, - "gigatonHammer": { - name: "Riesenhammer", - effect: "Der Anwender greift mit einem großen Hammer an, den er mit vollem Körpereinsatz um sich schwingt. Diese Attacke kann nicht zweimal in Folge eingesetzt werden." - }, - "comeuppance": { - name: "Vendetta", - effect: "Der Anwender rächt sich an dem Gegner, der ihm zuletzt mit einer Attacke Schaden zugefügt hat, indem er ihm den Schaden mit erhöhter Kraft zurückzahlt." - }, - "aquaCutter": { - name: "Aquaschnitt", - effect: "Der Anwender stößt Wasser unter Druck aus, um das Ziel wie mit einer Klinge anzugreifen. Hohe Volltrefferquote." - }, - "blazingTorque": { - name: "Hitzeturbo", - effect: "Der Anwender rammt seinen glühend heißen Motor in das Ziel. Dieses erleidet eventuell Verbrennungen." - }, - "wickedTorque": { - name: "Finsterturbo", - effect: "Der Anwender rammt seinen Motor mit böswilliger Absicht in das Ziel. Dieses schläft eventuell ein." - }, - "noxiousTorque": { - name: "Toxiturbo", - effect: "Der Anwender rammt seinen giftigen Motor in das Ziel. Dieses wird eventuell vergiftet." - }, - "combatTorque": { - name: "Raufturbo", - effect: "Der Anwender rammt seinen Motor gewaltvoll in das Ziel. Dieses wird eventuell paralysiert." - }, - "magicalTorque": { - name: "Zauberturbo", - effect: "Der Anwender rammt seinen feenartigen Motor in das Ziel. Dieses wird eventuell verwirrt." - }, - "bloodMoon": { - name: "Blutmond", - effect: "Der Anwender entfesselt eine gewaltige Energieladung aus einem blutroten Vollmond. Diese Attacke kann nicht zweimal in Folge eingesetzt werden." - }, - "matchaGotcha": { - name: "Quirlschuss", - effect: "Der Anwender verschießt gequirlten Tee. Die Hälfte des zugefügten Schadens wird ihm als KP gutgeschrieben. Das Ziel erleidet eventuell Verbrennungen." - }, - "syrupBomb": { - name: "Sirupbombe", - effect: "Der Anwender feuert eine klebrige Sirupbombe auf das Ziel, wodurch es in Sirup gehüllt und seine Initiative drei Runden in Folge gesenkt wird." - }, - "ivyCudgel": { - name: "Rankenkeule", - effect: "Der Anwender schlägt mit einer rankenumschlungenen Keule zu. Der Typ dieser Attacke hängt von der Maske des Anwenders ab. Hohe Volltrefferquote." - }, - "electroShot": { - name: "Stromstrahl", - effect: "Sammelt in Runde 1 Elektrizität, um den Spezial-Angriff zu erhöhen, und greift dann in Runde 2 mit Starkstrom an. Bei Regen erfolgt der Angriff sofort in Runde 1." - }, - "teraStarstorm": { - name: "Tera-Sternhagel", - effect: "Der Anwender greift das Ziel mit gebündelter Kristallenergie an. Wenn Terapagos diese Attacke in seiner Stellarform einsetzt, erleiden alle Gegner Schaden." - }, - "fickleBeam": { - name: "Launenlaser", - effect: "Der Anwender greift mit einem Laserstrahl an. Manchmal feuern mehrere seiner Köpfe Laser ab, wodurch sich die Stärke dieser Attacke verdoppelt." - }, - "burningBulwark": { - name: "Flammenschild", - effect: "Das brennend heiße Fell des Anwenders schützt ihn vor Angriffen. Gleichzeitig erleiden alle Pokémon, die mit ihm in Berührung kommen, Verbrennungen." - }, - "thunderclap": { - name: "Sturmblitz", - effect: "Bei dieser Erstschlag-Attacke lässt der Anwender einen Blitz auf das Ziel einschlagen. Sie gelingt nur, wenn dieses gerade eine Angriffsattacke vorbereitet." - }, - "mightyCleave": { - name: "Wuchtklinge", - effect: "Der Anwender führt mit dem in seinem Kopf gespeicherten Licht einen Schnitt aus. Diese Attacke trifft auch, wenn das Ziel sich selbst schützt." - }, - "tachyonCutter": { - name: "Tachyon-Schnitt", - effect: "Der Anwender greift das Ziel zweimal hintereinander mit Partikelklingen an. Der Angriff trifft garantiert." - }, - "hardPress": { - name: "Stahlpresse", - effect: "Der Anwender nimmt das Ziel mit Armen oder Scheren in die Mangel. Je höher die KP des Zieles, desto stärker die Attacke." - }, - "dragonCheer": { - name: "Drachenschrei", - effect: "Das anspornende Drachengebrüll hebt die Moral aller Mitstreiter und erhöht ihre Volltrefferquote. Der Effekt ist stärker, wenn sie dem Typ Drache angehören." - }, - "alluringVoice": { - name: "Lockstimme", - effect: "Der Anwender greift mit engelsgleichem Gesang an. Falls die Statuswerte des Zieles in dieser Runde erhöht wurden, wird es zusätzlich verwirrt." - }, - "temperFlare": { - name: "Frustflamme", - effect: "Der Anwender greift das Ziel voller Verzweiflung an. Wenn seine vorige Attacke fehlgeschlagen ist, verdoppelt sich die Stärke der Attacke." - }, - "supercellSlam": { - name: "Donnerstoß", - effect: "Der Anwender lädt seinen Körper mit elektrischer Energie auf und stürzt sich auf das Ziel. Bei Misserfolg verletzt sich der Anwender selbst." - }, - "psychicNoise": { - name: "Psycholärm", - effect: "Der Anwender greift mit unerträglichen Schallwellen an, wodurch das Ziel zwei Runden lang nicht durch Attacken, Fähigkeiten oder getragene Items geheilt werden kann." - }, - "upperHand": { - name: "Schnellkonter", - effect: "Der Anwender reagiert auf Bewegungen des Zieles und lässt es durch einen Schlag zurückschrecken. Gelingt nur, wenn das Ziel gerade eine Erstschlag-Attacke vorbereitet." - }, - "malignantChain": { - name: "Giftkettung", - effect: "Der Anwender umwickelt das Ziel mit einer Kette aus Toxinen, die in dessen Körper eindringen und ihm schaden. Das Ziel wird eventuell schwer vergiftet." - } -} as const; diff --git a/src/locales/de/nature.ts b/src/locales/de/nature.json similarity index 79% rename from src/locales/de/nature.ts rename to src/locales/de/nature.json index 0156b8515df..d1406f723a9 100644 --- a/src/locales/de/nature.ts +++ b/src/locales/de/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "Robust", "Lonely": "Solo", "Brave": "Mutig", @@ -26,4 +24,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Forsch", "Careful": "Sacht", "Quirky": "Kauzig" -} as const; +} \ No newline at end of file diff --git a/src/locales/de/party-ui-handler.json b/src/locales/de/party-ui-handler.json new file mode 100644 index 00000000000..fb5a5207569 --- /dev/null +++ b/src/locales/de/party-ui-handler.json @@ -0,0 +1,47 @@ +{ + "SEND_OUT": "Einwechseln", + "SUMMARY": "Bericht", + "CANCEL": "Abbrechen", + "RELEASE": "Freilassen", + "APPLY": "Anwenden", + "TEACH": "Erlernen", + "SPLICE": "Fusionieren", + "UNSPLICE": "Defusionieren", + "ACTIVATE": "Aktivieren", + "DEACTIVATE": "Deaktivieren", + "TRANSFER": "Übertragen", + "ALL": "Alle", + "PASS_BATON": "Stafette nutzen", + "UNPAUSE_EVOLUTION": "Entwicklung fortsetzen", + "REVIVE": "Wiederbeleben", + "RENAME": "Umbenennen", + "choosePokemon": "Wähle ein Pokémon.", + "doWhatWithThisPokemon": "Was soll mit diesem Pokémon geschehen?", + "noEnergy": "{{pokemonName}} ist nicht fit genug, um zu kämpfen!", + "hasEnergy": "{{pokemonName}} steckt noch voller Energie", + "cantBeUsed": "{{pokemonName}} kann in dieser Herausforderung nicht verwendet werden!", + "tooManyItems": "{{pokemonName}} trägt bereits zu viele dieser Items!", + "anyEffect": "Das würde keine Wirkung zeigen.", + "unpausedEvolutions": "Entwicklungen für {{pokemonName}} wurden wieder aktiviert.", + "unspliceConfirmation": "Willst du wirklich {{fusionName}} von {{pokemonName}} defusionieren? {{fusionName}} wird freigelassen.", + "wasReverted": "{{fusionName}} verwandelt sich in {{pokemonName}} zurück.", + "releaseConfirmation": "Möchtest du {{pokemonName}} wirklich freilassen?", + "releaseInBattle": "Pokémon, die aktuell im Kampf sind, können nicht freigelassen werden.", + "selectAMove": "Wähle eine Attacke.", + "changeQuantity": "Wähle ein getragenes Item aus, das übertragen werden soll. Nutze < und > um die Anzahl zu ändern.", + "selectAnotherPokemonToSplice": "Wähle ein anderes Pokémon mit dem fusioniert werden soll aus.", + "cancel": "Abbrechen", + "able": "Erlernbar!", + "notAble": "Nicht erlernbar", + "learned": "Bereits erlernt!", + "goodbye": "Auf wiedersehen, {{pokemonName}}!", + "byebye": "Byebye, {{pokemonName}}!", + "farewell": "Mach’s gut, {{pokemonName}}!", + "soLong": "Bis dann, {{pokemonName}}!", + "thisIsWhereWePart": "Nun heißt es Abschied nehmen, {{pokemonName}}!", + "illMissYou": "Ich werde dich vermissen, {{pokemonName}}!", + "illNeverForgetYou": "Ich werde dich niemals vergessen, {{pokemonName}}!", + "untilWeMeetAgain": "Bis wir uns wiedersehen, {{pokemonName}}!", + "sayonara": "Sayonara, {{pokemonName}}!", + "smellYaLater": "Also dann, man riecht sich! Ciao!, {{pokemonName}}!" +} \ No newline at end of file diff --git a/src/locales/de/party-ui-handler.ts b/src/locales/de/party-ui-handler.ts deleted file mode 100644 index da83d2370c3..00000000000 --- a/src/locales/de/party-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Einwechseln", - "SUMMARY": "Bericht", - "CANCEL": "Abbrechen", - "RELEASE": "Freilassen", - "APPLY": "Anwenden", - "TEACH": "Erlernen" -} as const; diff --git a/src/locales/de/pokeball.json b/src/locales/de/pokeball.json new file mode 100644 index 00000000000..83020c072f8 --- /dev/null +++ b/src/locales/de/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "Pokéball", + "greatBall": "Superball", + "ultraBall": "Hyperball", + "rogueBall": "Rogueball", + "masterBall": "Meisterball", + "luxuryBall": "Luxusball" +} \ No newline at end of file diff --git a/src/locales/de/pokeball.ts b/src/locales/de/pokeball.ts deleted file mode 100644 index 395134be844..00000000000 --- a/src/locales/de/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Pokéball", - "greatBall": "Superball", - "ultraBall": "Hyperball", - "rogueBall": "Rogueball", - "masterBall": "Meisterball", - "luxuryBall": "Luxusball", -} as const; diff --git a/src/locales/de/pokemon-form-battle.json b/src/locales/de/pokemon-form-battle.json new file mode 100644 index 00000000000..35060c33d0b --- /dev/null +++ b/src/locales/de/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "Mega-{{pokemonName}}", + "mega-x": "Mega-{{pokemonName}} X", + "mega-y": "Mega-{{pokemonName}} Y", + "primal": "Proto-{{pokemonName}}", + "gigantamax": "G-Dyna-{{pokemonName}}", + "eternamax": "U-Dyna-{{pokemonName}}", + "megaChange": "{{preName}} hat sich zu {{pokemonName}} mega-entwickelt!", + "gigantamaxChange": "{{preName}} hat sich zu {{pokemonName}} gigadynamaximiert!", + "eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!", + "revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!", + "formChange": "{{preName}} hat seine Form geändert!", + "disguiseChange": "Sein Kostüm hat die Attacke absorbiert!" +} \ No newline at end of file diff --git a/src/locales/de/pokemon-form.json b/src/locales/de/pokemon-form.json new file mode 100644 index 00000000000..d621e3165fa --- /dev/null +++ b/src/locales/de/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Rocker-Pikachu", + "pikachuBeautyCosplay": "Damen-Pikachu", + "pikachuCuteCosplay": "Star-Pikachu", + "pikachuSmartCosplay": "Professoren-Pikachu", + "pikachuToughCosplay": "Wrestler-Pikachu", + "pikachuPartner": "Partner-Pikachu", + "eeveePartner": "Partner-Evoli", + "pichuSpiky": "Strubbelohr-Pichu", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "Sonnenform", + "castformRainy": "Regenform", + "castformSnowy": "Schneeform", + "deoxysNormal": "Normalform", + "burmyPlant": "Pflanzenumhang", + "burmySandy": "Sandumhang", + "burmyTrash": "Lumpenumhang", + "shellosEast": "Östliches Meer", + "shellosWest": "Westliches Meer", + "rotomHeat": "Hitze-Rotom", + "rotomWash": "Wasch-Rotom", + "rotomFrost": "Frost-Rotom", + "rotomFan": "Wirbel-Rotom", + "rotomMow": "Schneid-Rotom", + "giratinaAltered": "Wandelform", + "shayminLand": "Landform", + "basculinRedStriped": "Rotlinige Form", + "basculinBlueStriped": "Blaulinige Form", + "basculinWhiteStriped": "Weißlinige Form", + "deerlingSpring": "Frühlingsform", + "deerlingSummer": "Sommerform", + "deerlingAutumn": "Herbstform", + "deerlingWinter": "Winterform", + "tornadusIncarnate": "Inkarnationsform", + "thundurusIncarnate": "Inkarnationsform", + "landorusIncarnate": "Inkarnationsform", + "keldeoOrdinary": "Standardform", + "meloettaAria": "Gesangsform", + "meloettaPirouette": "Tanzform", + "froakieBattleBond": "Ash-Form", + "scatterbugMeadow": "Blumenmeermuster", + "scatterbugIcySnow": "Frostmuster", + "scatterbugPolar": "Schneefeldmuster", + "scatterbugTundra": "Flockenmuster", + "scatterbugContinental": "Kontinentalmuster", + "scatterbugGarden": "Ziergartenmuster", + "scatterbugElegant": "Prunkmuster", + "scatterbugModern": "Innovationsmuster", + "scatterbugMarine": "Aquamarinmuster", + "scatterbugArchipelago": "Archipelmuster", + "scatterbugHighPlains": "Dürrmuster", + "scatterbugSandstorm": "Sandmuster", + "scatterbugRiver": "Flussdeltamuster", + "scatterbugMonsoon": "Monsunmuster", + "scatterbugSavanna": "Savannenmuster", + "scatterbugSun": "Sonnenmuster", + "scatterbugOcean": "Ozeanmuster", + "scatterbugJungle": "Dschungelmuster", + "scatterbugFancy": "Fantasiemuster", + "scatterbugPokeBall": "Pokéball-Muster", + "flabebeRed": "Rotblütler", + "flabebeYellow": "Gelbblütler", + "flabebeOrange": "Orangeblütler", + "flabebeBlue": "Blaublütler", + "flabebeWhite": "Weißblütler", + "furfrouHeart": "Herzchenschnitt", + "furfrouStar": "Sternchenschnitt", + "furfrouDiamond": "Diamantenschitt", + "furfrouDebutante": "Fräuleinschnitt", + "furfrouMatron": "Damenschnitt", + "furfrouDandy": "Kavalierschnitt", + "furfrouLaReine": "Königinnenschnitt", + "furfrouKabuki": "Kabuki-Schnitt", + "furfrouPharaoh": "Herrscherschnitt", + "pumpkabooSmall": "Größe S", + "pumpkabooLarge": "Größe L", + "pumpkabooSuper": "Größe XL", + "xerneasNeutral": "Ruhe-Modus", + "xerneasActive": "Aktiv-Modus", + "zygarde50": "50% Form", + "zygarde10": "10% Form", + "zygarde50Pc": "50% Form Scharwandel", + "zygarde10Pc": "10% Form Scharwandel", + "zygardeComplete": "Optimum-Form", + "oricorioBaile": "Flamenco-Stil", + "oricorioPompom": "Cheerleading-Stil", + "oricorioPau": "Hula-Stil", + "oricorioSensu": "Buyo-Stil", + "rockruffOwnTempo": "Gleichmut", + "miniorRedMeteor": "Rote-Meteorform", + "miniorOrangeMeteor": "Oranger-Meteorform", + "miniorYellowMeteor": "Gelber-Meteorform", + "miniorGreenMeteor": "Grüner-Meteorform", + "miniorBlueMeteor": "Hellblaue-Meteorform", + "miniorIndigoMeteor": "Blaue-Meteorform", + "miniorVioletMeteor": "Violette-Meteorform", + "miniorRed": "Roter Kern", + "miniorOrange": "Oranger Kern", + "miniorYellow": "Gelber Kern", + "miniorGreen": "Grüner Kern", + "miniorBlue": "Hellblauer Kern", + "miniorIndigo": "Blauer Kern", + "miniorViolet": "Violetter Kern", + "mimikyuDisguised": "Verkleidete Form", + "mimikyuBusted": "Entlarvte Form", + "magearnaOriginal": "Originalfarbe", + "marshadowZenith": "Zenitform", + "sinisteaPhony": "Fälschungsform", + "sinisteaAntique": "Originalform", + "eiscueNoIce": "Wohlfühlkopf", + "indeedeeMale": "männlich", + "indeedeeFemale": "weiblich", + "morpekoFullBelly": "Pappsattmuster", + "zacianHeroOfManyBattles": "Heldenhafter Krieger", + "zamazentaHeroOfManyBattles": "Heldenhafter Krieger", + "zarudeDada": "Papa", + "enamorusIncarnate": "Inkarnationsform", + "squawkabillyGreenPlumage": "Grüngefiedert", + "squawkabillyBluePlumage": "Blaugefiedert", + "squawkabillyYellowPlumage": "Gelbgefiedert", + "squawkabillyWhitePlumage": "Weißgefiedert", + "tatsugiriCurly": "Gebogene Form", + "tatsugiriDroopy": "Hängende Form", + "tatsugiriStretchy": "Gestrekte Form", + "gimmighoulChest": "Truhenform", + "gimmighoulRoaming": "Wanderform", + "koraidonApexBuild": "Vollkommene Gestalt", + "koraidonLimitedBuild": "Gehemmte Gestalt", + "koraidonSprintingBuild": "Sprintgestalt", + "koraidonSwimmingBuild": "Schwimmgestalt", + "koraidonGlidingBuild": "Schwingengestalt", + "miraidonUltimateMode": "Kompletter Modus", + "miraidonLowPowerMode": "Begrenzter Modus", + "miraidonDriveMode": "Fahrmodus", + "miraidonAquaticMode": "Wassermodus", + "miraidonGlideMode": "Gleitmodus", + "poltchageistCounterfeit": "Imitationsform", + "poltchageistArtisan": "Kostbarkeitsform", + "paldeaTaurosCombat": "Gefechtsvariante", + "paldeaTaurosBlaze": "Flammenvariante", + "paldeaTaurosAqua": "Flutenvariante" +} \ No newline at end of file diff --git a/src/locales/de/pokemon-info-container.json b/src/locales/de/pokemon-info-container.json new file mode 100644 index 00000000000..1a9bf59afec --- /dev/null +++ b/src/locales/de/pokemon-info-container.json @@ -0,0 +1,7 @@ +{ + "moveset": "Attacken", + "gender": "Geschlecht:", + "ability": "Fähigkeit:", + "nature": "Wesen:", + "form": "Form:" +} \ No newline at end of file diff --git a/src/locales/de/pokemon-info-container.ts b/src/locales/de/pokemon-info-container.ts deleted file mode 100644 index f408dbcff9c..00000000000 --- a/src/locales/de/pokemon-info-container.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Attacken", - "gender": "Geschlecht:", - "ability": "Fähigkeit:", - "nature": "Wesen:", - "epic": "Episch", - "rare": "Selten", - "common": "Gewöhnlich" -} as const; diff --git a/src/locales/de/pokemon-info.ts b/src/locales/de/pokemon-info.json similarity index 77% rename from src/locales/de/pokemon-info.ts rename to src/locales/de/pokemon-info.json index 08a23de2b3a..2d625d52ba7 100644 --- a/src/locales/de/pokemon-info.ts +++ b/src/locales/de/pokemon-info.json @@ -1,7 +1,5 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { +{ + "Stat": { "HP": "KP", "HPshortened": "KP", "ATK": "Angriff", @@ -15,10 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPD": "Initiative", "SPDshortened": "Init", "ACC": "Genauigkeit", - "EVA": "Fluchtwert", + "EVA": "Fluchtwert" }, - - Type: { + "Type": { "UNKNOWN": "Unbekannt", "NORMAL": "Normal", "FIGHTING": "Kampf", @@ -38,6 +35,6 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DRAGON": "Drache", "DARK": "Unlicht", "FAIRY": "Fee", - "STELLAR": "Stellar", - }, -} as const; + "STELLAR": "Stellar" + } +} \ No newline at end of file diff --git a/src/locales/de/pokemon-summary.json b/src/locales/de/pokemon-summary.json new file mode 100644 index 00000000000..1790c6878b9 --- /dev/null +++ b/src/locales/de/pokemon-summary.json @@ -0,0 +1,44 @@ +{ + "pokemonInfo": "Pokémon Info", + "status": "Status", + "powerAccuracyCategory": "Stärke\nGenauigkeit\nKategorie", + "type": "Typ", + "unknownTrainer": "Unbekannt", + "ot": "OT", + "nature": "Wesen", + "expPoints": "Erf. Punkte", + "nextLv": "Nächstes Lvl.", + "cancel": "Abbrechen", + "memoString": "Wesen: {{natureFragment}}\n{{metFragment}}", + "metFragment": { + "normal": "Herkunft: {{biome}}\nMit Lv. {{level}} erhalten.", + "apparently": "Herkunft: {{biome}}\nOffenbar mit Lv. {{level}} erhalten." + }, + "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}}" + } +} diff --git a/src/locales/de/pokemon.ts b/src/locales/de/pokemon.json similarity index 99% rename from src/locales/de/pokemon.ts rename to src/locales/de/pokemon.json index 58a0439f5d5..7024e26f044 100644 --- a/src/locales/de/pokemon.ts +++ b/src/locales/de/pokemon.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { +{ "bulbasaur": "Bisasam", "ivysaur": "Bisaknosp", "venusaur": "Bisaflor", @@ -1082,5 +1080,5 @@ export const pokemon: SimpleTranslationEntries = { "hisui_decidueye": "Silvarro", "paldea_tauros": "Tauros", "paldea_wooper": "Felino", - "bloodmoon_ursaluna": "Ursaluna", -} as const; + "bloodmoon_ursaluna": "Ursaluna" +} \ No newline at end of file diff --git a/src/locales/de/run-history.json b/src/locales/de/run-history.json new file mode 100644 index 00000000000..0a36afe9adc --- /dev/null +++ b/src/locales/de/run-history.json @@ -0,0 +1,38 @@ +{ + "victory": "Sieg!", + "defeatedWild": "Besiegt durch ", + "defeatedTrainer": "Besiegt durch ", + "defeatedTrainerDouble": "Besiegt durch Doppelkampf", + "defeatedRival": "Besiegt durch Rivalin", + "defeated": "Besiegt", + "defeatedWild_female": "Besiegt durch ", + "defeatedTrainer_female": "Besiegt durch ", + "defeatedTrainerDouble_female": "Besiegt durch Doppelkampf", + "defeatedRival_female": "Besiegt durch Rivale", + "defeated_female": "Besiegt", + "luck": "Glück", + "score": "Punkte", + "mode": "Modus", + "challengeRules": "Regeln", + "challengeMonoGen1": "Gen I", + "challengeMonoGen2": "Gen II", + "challengeMonoGen3": "Gen III", + "challengeMonoGen4": "Gen IV", + "challengeMonoGen5": "Gen V", + "challengeMonoGen6": "Gen VI", + "challengeMonoGen7": "Gen VII", + "challengeMonoGen8": "Gen VIII", + "challengeMonoGen9": "Gen IX", + "playerItems": "Spielergegenstände", + "personalBest": "Persönlicher Bestwert!", + "SPDshortened": "Init.", + "runInfo": "Durchlauf Informationen", + "money": "Geld", + "runLength": "Durchlauf Dauer", + "viewHeldItems": "Getragene Items", + "hallofFameText": "Willkommen in der Ruhmeshalle!", + "hallofFameText_female": "Willkommen in der Ruhmeshalle", + "viewHallOfFame": "Ruhmeshalle ansehen!", + "viewEndingSplash": "Endgrafik anzeigen!" +} + diff --git a/src/locales/de/save-slot-select-ui-handler.json b/src/locales/de/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..7b6e493b867 --- /dev/null +++ b/src/locales/de/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "Den ausgewählten Speicherstand überschreiben?", + "loading": "Läd...", + "wave": "Welle", + "lv": "Lv. ", + "empty": "Leer" +} \ No newline at end of file diff --git a/src/locales/de/save-slot-select-ui-handler.ts b/src/locales/de/save-slot-select-ui-handler.ts deleted file mode 100644 index b6577cd574a..00000000000 --- a/src/locales/de/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Den ausgewählten Speicherstand überschreiben?", - "loading": "Läd...", - "wave": "Welle", - "lv": "Lvl", - "empty": "Leer", -} as const; diff --git a/src/locales/de/settings.ts b/src/locales/de/settings.json similarity index 88% rename from src/locales/de/settings.ts rename to src/locales/de/settings.json index 85f8645d69f..31406f28d17 100644 --- a/src/locales/de/settings.ts +++ b/src/locales/de/settings.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { +{ "boy": "Junge", "girl": "Mädchen", "general": "Allgemein", @@ -15,6 +13,7 @@ export const settings: SimpleTranslationEntries = { "skipSeenDialogues": "Gesehenen Dialog überspringen", "battleStyle": "Kampfstil", "enableRetries": "Erneut versuchen aktivieren", + "hideIvs": "IS-Scanner verstecken", "tutorials": "Tutorials", "touchControls": "Touch Steuerung", "vibrations": "Vibration", @@ -62,7 +61,9 @@ export const settings: SimpleTranslationEntries = { "typeHints": "Typhinweise", "masterVolume": "Gesamtlautstärke", "bgmVolume": "Hintergrundmusik", + "fieldVolume": "Rufe & Attacken", "seVolume": "Spezialeffekte", + "uiVolume": "Benutzeroberfläche", "musicPreference": "Musik Präferenz", "mixed": "Gemischt", "gamepadPleasePlug": "Bitte einen Controller anschließen oder eine Taste drücken.", @@ -82,7 +83,7 @@ export const settings: SimpleTranslationEntries = { "buttonMenu": "Menü", "buttonSubmit": "Bestätigen", "buttonCancel": "Abbrechen", - "buttonStats": "Statistiken", + "buttonStats": "Statuswerte", "buttonCycleForm": "Form wechseln", "buttonCycleShiny": "Schillernd wechseln", "buttonCycleGender": "Geschlecht wechseln", @@ -96,4 +97,11 @@ export const settings: SimpleTranslationEntries = { "controller": "Controller", "gamepadSupport": "Controllerunterstützung", "showBgmBar": "Musiknamen anzeigen", -} as const; + "moveTouchControls": "Bewegung Touch Steuerung", + "shopOverlayOpacity": "Shop Overlay Deckkraft", + "shopCursorTarget": "Shop-Cursor Ziel", + "rewards": "Items", + "reroll": "Neu rollen", + "shop": "Shop", + "checkTeam": "Team überprüfen" +} diff --git a/src/locales/de/splash-messages.ts b/src/locales/de/splash-messages.json similarity index 92% rename from src/locales/de/splash-messages.ts rename to src/locales/de/splash-messages.json index f5ab8572b7b..ac3fd345f3f 100644 --- a/src/locales/de/splash-messages.ts +++ b/src/locales/de/splash-messages.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { +{ "battlesWon": "Kämpfe gewonnen!", "joinTheDiscord": "Tritt dem Discord bei!", "infiniteLevels": "Unendliche Level!", @@ -34,4 +32,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Versuche auch Radical Red!", "eeveeExpo": "Evoli-Expo!", "ynoproject": "YNO-Projekt!", -} as const; + "breedersInSpace": "Züchter im Weltall!" +} \ No newline at end of file diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.json similarity index 75% rename from src/locales/de/starter-select-ui-handler.ts rename to src/locales/de/starter-select-ui-handler.json index 92ead61ebe7..e146d1bdcd9 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.json @@ -1,12 +1,7 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { +{ "confirmStartTeam": "Mit diesen Pokémon losziehen?", + "confirmExit": "Willst du zurück?", + "invalidParty": "Das ist kein gültiges Team!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -22,9 +17,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Wesen:", "eggMoves": "Ei-Attacken", "addToParty": "Zum Team hinzufügen", + "removeFromParty": "Aus Team entfernen", "toggleIVs": "DVs anzeigen/verbergen", "manageMoves": "Attacken ändern", "manageNature": "Wesen ändern", + "addToFavorites": "Zu Favoriten hinzufügen", + "removeFromFavorites": "Von Favoriten entfernen", "useCandies": "Bonbons verwenden", "selectNature": "Wähle das neue Wesen.", "selectMoveSwapOut": "Wähle die zu ersetzende Attacke.", @@ -38,9 +36,10 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "cycleAbility": ": Fähigkeit", "cycleNature": ": Wesen", "cycleVariant": ": Seltenheit", + "goFilter": ": Zu den Filtern", "enablePassive": "Passiv-Skill aktivieren", "disablePassive": "Passiv-Skill deaktivieren", "locked": "Gesperrt", "disabled": "Deaktiviert", "uncaught": "Ungefangen" -}; +} \ No newline at end of file diff --git a/src/locales/de/status-effect.json b/src/locales/de/status-effect.json new file mode 100644 index 00000000000..c30d432fe79 --- /dev/null +++ b/src/locales/de/status-effect.json @@ -0,0 +1,65 @@ +{ + "none": { + "name": "None", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + }, + "poison": { + "name": "Gift", + "description": "Vergiftungen", + "obtain": "{{pokemonNameWithAffix}} wurde vergiftet!", + "obtainSource": "{{pokemonNameWithAffix}} wurde durch {{sourceText}} vergiftet!", + "activation": "{{pokemonNameWithAffix}} wird durch Gift verletzt!", + "overlap": "{{pokemonNameWithAffix}} ist bereits vergiftet!", + "heal": "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" + }, + "toxic": { + "name": "Gift", + "description": "Vergiftungen", + "obtain": "{{pokemonNameWithAffix}} wurde schwer vergiftet!", + "obtainSource": "{{pokemonNameWithAffix}} wurde durch {{sourceText}} schwer vergiftet!", + "activation": "{{pokemonNameWithAffix}} wird durch Gift verletzt!", + "overlap": "{{pokemonNameWithAffix}} ist bereits vergiftet!", + "heal": "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" + }, + "paralysis": { + "name": "Paralyse", + "description": "Paralyse", + "obtain": "{{pokemonNameWithAffix}} wurde paralysiert!\nEs kann eventuell nicht handeln!", + "obtainSource": "{{pokemonNameWithAffix}} wurde durch {{sourceText}} paralysiert,\nEs kann eventuell nicht handeln!", + "activation": "{{pokemonNameWithAffix}} ist paralysiert!\nEs kann nicht angreifen!", + "overlap": "{{pokemonNameWithAffix}} ist bereits paralysiert!", + "heal": "Die Paralyse von {{pokemonNameWithAffix}} wurde aufgehoben!" + }, + "sleep": { + "name": "Schlaf", + "description": "Einschlafen", + "obtain": "{{pokemonNameWithAffix}} ist eingeschlafen!", + "obtainSource": "{{pokemonNameWithAffix}} ist durch {{sourceText}} eingeschlafen!", + "activation": "{{pokemonNameWithAffix}} schläft tief und fest!", + "overlap": "{{pokemonNameWithAffix}} schläft bereits!", + "heal": "{{pokemonNameWithAffix}} ist aufgewacht!" + }, + "freeze": { + "name": "Gefroren", + "description": "Einfrieren", + "obtain": "{{pokemonNameWithAffix}} erstarrt zu Eis!", + "obtainSource": "{{pokemonNameWithAffix}} erstarrt durch {{sourceText}} zu Eis!", + "activation": "{{pokemonNameWithAffix}} ist eingefroren und kann nicht handeln!", + "overlap": "{{pokemonNameWithAffix}} ist bereits eingefroren!", + "heal": "{{pokemonNameWithAffix}} wurde aufgetaut!" + }, + "burn": { + "name": "Verbrennung", + "description": "Verbrennungen", + "obtain": "{{pokemonNameWithAffix}} erleidet Verbrennungen!", + "obtainSource": "{{pokemonNameWithAffix}} erleidet durch {{sourceText}} Verbrennungen!", + "activation": "Die Verbrennungen schaden {{pokemonNameWithAffix}}!", + "overlap": "{{pokemonNameWithAffix}} leidet bereits unter Verbrennungen!", + "heal": "Die Verbrennungen von {{pokemonNameWithAffix}} wurden geheilt!" + } +} \ No newline at end of file diff --git a/src/locales/de/status-effect.ts b/src/locales/de/status-effect.ts deleted file mode 100644 index 997d005987e..00000000000 --- a/src/locales/de/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "None", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "Gift", - description: "Vergiftungen", - obtain: "{{pokemonNameWithAffix}} wurde vergiftet!", - obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} vergiftet!", - activation: "{{pokemonNameWithAffix}} wird durch Gift verletzt!", - overlap: "{{pokemonNameWithAffix}} ist bereits vergiftet!", - heal: "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" - }, - toxic: { - name: "Gift", - description: "Vergiftungen", - obtain: "{{pokemonNameWithAffix}} wurde schwer vergiftet!", - obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} schwer vergiftet!", - activation: "{{pokemonNameWithAffix}} wird durch Gift verletzt!", - overlap: "{{pokemonNameWithAffix}} ist bereits vergiftet!", - heal: "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" - }, - paralysis: { - name: "Paralyse", - description: "Paralyse", - obtain: "{{pokemonNameWithAffix}} wurde paralysiert!\nEs kann eventuell nicht handeln!", - obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} paralysiert,\nEs kann eventuell nicht handeln!", - activation: "{{pokemonNameWithAffix}}ist paralysiert!\nEs kann nicht angreifen!", - overlap: "{{pokemonNameWithAffix}} ist bereits paralysiert!", - heal: "Die Paralyse von {{pokemonNameWithAffix}} wurde aufgehoben!" - }, - sleep: { - name: "Schlaf", - description: "Einschlafen", - obtain: "{{pokemonNameWithAffix}} ist eingeschlafen!", - obtainSource: "{{pokemonNameWithAffix}}ist durch {{sourceText}} eingeschlafen!", - activation: "{{pokemonNameWithAffix}} schläft tief und fest!", - overlap: "{{pokemonNameWithAffix}} schläft bereits!", - heal: "{{pokemonNameWithAffix}} ist aufgewacht!" - }, - freeze: { - name: "Gefroren", - description: "Einfrieren", - obtain: "{{pokemonNameWithAffix}} erstarrt zu Eis!", - obtainSource: "{{pokemonNameWithAffix}} erstarrt durch {{sourceText}} zu Eis!", - activation: "{{pokemonNameWithAffix}} ist eingefroren und kann nicht handeln!", - overlap: "{{pokemonNameWithAffix}} ist bereits eingefroren!", - heal: "{{pokemonNameWithAffix}} wurde aufgetaut!" - }, - burn: { - name: "Verbrennung ", - description: "Verbrennungen", - obtain: "{{pokemonNameWithAffix}} erleidet Verbrennungen!", - obtainSource: "{{pokemonNameWithAffix}} erleidet durch {{sourceText}} Verbrennungen!", - activation: "Die Verbrennungen schaden {{pokemonNameWithAffix}}!", - overlap: "{{pokemonNameWithAffix}} leidet bereits unter Verbrennungen!", - heal: "Die Verbrennungen von {{pokemonNameWithAffix}} wurden geheilt!" - }, -} as const; diff --git a/src/locales/de/terrain.json b/src/locales/de/terrain.json new file mode 100644 index 00000000000..4d2ef33752c --- /dev/null +++ b/src/locales/de/terrain.json @@ -0,0 +1,20 @@ +{ + "misty": "Nebelfeld", + "mistyStartMessage": "Am Boden breitet sich dichter Nebel aus!", + "mistyClearMessage": "Das Nebelfeld ist wieder verschwunden!", + "mistyBlockMessage": "{{pokemonNameWithAffix}} wird vom Nebelfeld geschützt!", + + "electric": "Elektrofeld", + "electricStartMessage": "Elektrische Energie fließt durch den Boden!", + "electricClearMessage": "Das Elektrofeld ist wieder verschwunden!", + + "grassy": "Grasfeld", + "grassyStartMessage": "Dichtes Gras schießt aus dem Boden!", + "grassyClearMessage": "Das Grasfeld ist wieder verschwunden!", + + "psychic": "Psychofeld", + "psychicStartMessage": "Der Boden fühlt sich seltsam an!", + "psychicClearMessage": "Das Psychofeld ist wieder verschwunden!", + + "defaultBlockMessage": "{{pokemonNameWithAffix}} wird vom {{terrainName}} geschützt!" +} \ No newline at end of file diff --git a/src/locales/de/trainer-classes.json b/src/locales/de/trainer-classes.json new file mode 100644 index 00000000000..45826fcd310 --- /dev/null +++ b/src/locales/de/trainer-classes.json @@ -0,0 +1,130 @@ +{ + "ace_trainer": "Ass-Trainer", + "ace_trainer_female": "Ass-Trainerin", + "ace_duo": "Ass-Duo", + "artist": "Künstler", + "artist_female": "Künstlerin", + "backers": "Anhänger", + "backpacker": "Backpacker", + "backpacker_female": "Backpackerin", + "backpackers": "Backpacker", + "baker": "Bäckerin", + "battle_girl": "Kämpferin", + "beauty": "Schönheit", + "beginners": "Anfänger", + "biker": "Rowdy", + "black_belt": "Schwarzgurt", + "breeder": "Pokémon Züchter", + "breeder_female": "Pokémon Züchterin", + "breeders": "Pokémon Züchter", + "clerk": "Angestellter", + "clerk_female": "Angestellte", + "colleagues": "Geschäftspartner", + "crush_kin": "Mühlensippe", + "cyclist": "Biker", + "cyclist_female": "Bikerin", + "cyclists": "Biker", + "dancer": "Tänzer", + "dancer_female": "Tänzerin", + "depot_agent": "Bahnangestellter", + "doctor": "Arzt", + "doctor_female": "Ärztin", + "firebreather": "Feuerspucker", + "fisherman": "Angler", + "fisherman_female": "Angler", + "gentleman": "Gentleman", + "guitarist": "Gitarrist", + "guitarist_female": "Gitarristin", + "harlequin": "Kasper", + "hiker": "Wanderer", + "hooligans": "Rabauken", + "hoopster": "Basketballer", + "infielder": "Baseballer", + "janitor": "Hausmeister", + "lady": "Lady", + "lass": "Göre", + "linebacker": "Footballer", + "maid": "Zofe", + "madame": "Madam", + "medical_team": "Mediziner", + "musician": "Musiker", + "hex_maniac": "Hexe", + "nurse": "Pflegerin", + "nursery_aide": "Erzieherin", + "officer": "Polizist", + "parasol_lady": "Schirmdame", + "pilot": "Pilot", + "pokéfan": "Pokéfan", + "pokéfan_female": "Pokéfan", + "pokéfan_family": "Pokéfan-Pärchen", + "preschooler": "Vorschüler", + "preschooler_female": "Vorschülerin", + "preschoolers": "Vorschüler", + "psychic": "Seher", + "psychic_female": "Seherin", + "psychics": "Seher", + "pokémon_ranger": "Pokémon-Ranger", + "pokémon_ranger_female": "Pokémon-Ranger", + "pokémon_rangers": "Pokémon-Ranger", + "ranger": "Ranger", + "restaurant_staff": "Restaurant Angestellte", + "rich": "Gentleman", + "rich_female": "Reiche Dame", + "rich_boy": "Schnösel", + "rich_couple": "Reiches Paar", + "rich_kid": "Schnösel", + "rich_kid_female": "Schnöselin", + "rich_kids": "Schnösel", + "roughneck": "Raufbold", + "sailor": "Matrose", + "scientist": "Forscher", + "scientist_female": "Forscherin", + "scientists": "Forscher", + "smasher": "Tennis-Ass", + "snow_worker": "Schneearbeiter", + "snow_worker_female": "Schneearbeiterin", + "striker": "Fußballer", + "school_kid": "Schulkind", + "school_kid_female": "Schulkind", + "school_kids": "Schüler", + "swimmer": "Schwimmer", + "swimmer_female": "Schwimmerin", + "swimmers": "Schwimmerpaar", + "twins": "Zwillinge", + "veteran": "Veteran", + "veteran_female": "Veteran", + "veteran_duo": "Veteranen", + "waiter": "Servierer", + "waitress": "Serviererin", + "worker": "Arbeiter", + "worker_female": "Arbeiterin", + "workers": "Arbeiter", + "youngster": "Knirps", + "rocket_grunt": "Rüpel von Team Rocket", + "rocket_grunt_female": "Rüpel von Team Rocket", + "rocket_grunts": "Rüpel von Team Rocket", + "magma_grunt": "Rüpel von Team Magma", + "magma_grunt_female": "Rüpel von Team Magma", + "magma_grunts": "Rüpel von Team Magma", + "aqua_grunt": "Rüpel von Team Aqua", + "aqua_grunt_female": "Rüpel von Team Aqua", + "aqua_grunts": "Rüpel von Team Aqua", + "galactic_grunt": "Rüpel von Team Galaktik", + "galactic_grunt_female": "Rüpel von Team Galaktik", + "galactic_grunts": "Rüpel von Team Galaktik", + "plasma_grunt": "Rüpel von Team Plasma", + "plasma_grunt_female": "Rüpel von Team Plasma", + "plasma_grunts": "Rüpel von Team Plasma", + "flare_grunt": "Rüpel von Team Flare", + "flare_grunt_female": "Rüpel von Team Flare", + "flare_grunts": "Rüpel von Team Flare", + "aether_grunt": "Æther Foundation Personal", + "aether_grunt_female": "Æther Foundation Personal", + "aether_grunts": "Æther Foundation Personal", + "skull_grunt": "Rüpel von Team Skull", + "skull_grunt_female": "Rüpel von Team Skull", + "skull_grunts": "Rüpel von Team Skull", + "macro_grunt": "Angestellter von Macro Cosmos", + "macro_grunt_female": "Angestellte von Macro Cosmos", + "macro_grunts": "Angestellte von Macro Cosmos" +} diff --git a/src/locales/de/trainer-names.json b/src/locales/de/trainer-names.json new file mode 100644 index 00000000000..ffbb772234c --- /dev/null +++ b/src/locales/de/trainer-names.json @@ -0,0 +1,165 @@ +{ + "brock": "Rocko", + "misty": "Misty", + "lt_surge": "Major Bob", + "erika": "Erika", + "janine": "Janina", + "sabrina": "Sabrina", + "blaine": "Pyro", + "giovanni": "Giovanni", + "falkner": "Falk", + "bugsy": "Kai", + "whitney": "Bianka", + "morty": "Jens", + "chuck": "Hartwig", + "jasmine": "Jasmin", + "pryce": "Norbert", + "clair": "Sandra", + "roxanne": "Felizia", + "brawly": "Kamillo", + "wattson": "Walter", + "flannery": "Flavia", + "norman": "Norman", + "winona": "Wibke", + "tate": "Ben", + "liza": "Svenja", + "juan": "Juan", + "roark": "Veit", + "gardenia": "Silvana", + "maylene": "Hilda", + "crasher_wake": "Wellenbrecher Marinus", + "fantina": "Lamina", + "byron": "Adam", + "candice": "Frida", + "volkner": "Volkner", + "cilan": "Benny", + "chili": "Maik", + "cress": "Colin", + "cheren": "Cheren", + "lenora": "Aloe", + "roxie": "Mica", + "burgh": "Artie", + "elesa": "Kamilla", + "clay": "Turner", + "skyla": "Géraldine", + "brycen": "Sandro", + "drayden": "Lysander", + "marlon": "Benson", + "viola": "Viola", + "grant": "Lino", + "korrina": "Connie", + "ramos": "Amaro", + "clemont": "Citro", + "valerie": "Valerie", + "olympia": "Astrid", + "wulfric": "Galantho", + "milo": "Yarro", + "nessa": "Kate", + "kabu": "Kabu", + "bea": "Saida", + "allister": "Nio", + "opal": "Papella", + "bede": "Betys", + "gordie": "Mac", + "melony": "Mel", + "piers": "Nezz", + "marnie": "Mary", + "raihan": "Roy", + "katy": "Ronah", + "brassius": "Colzo", + "iono": "Enigmara", + "kofu": "Kombu", + "larry": "Aoki", + "ryme": "Etta", + "tulip": "Tulia", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agathe", + "lance": "Siegfried", + "will": "Willi", + "koga": "Koga", + "karen": "Melanie", + "sidney": "Ulrich", + "phoebe": "Antonia", + "glacia": "Frosina", + "drake": "Dragan", + "aaron": "Herbaro", + "bertha": "Teresa", + "flint": "Ignaz", + "lucian": "Lucian", + "shauntal": "Anissa", + "marshal": "Eugen", + "grimsley": "Astor", + "caitlin": "Kattlea", + "malva": "Pachira", + "siebold": "Narcisse", + "wikstrom": "Thymelot", + "drasna": "Dracena", + "hala": "Hala", + "molayne": "Marlon", + "olivia": "Mayla", + "acerola": "Lola", + "kahili": "Kahili", + "rika": "Cay", + "poppy": "Poppy", + "hassel": "Sinius", + "crispin": "Matt", + "amarys": "Erin", + "lacey": "Tara", + "drayton": "Levy", + "blue": "Blau", + "red": "Rot", + "steven": "Troy", + "wallace": "Wassili", + "cynthia": "Cynthia", + "alder": "Lauro", + "iris": "Lilia", + "diantha": "Diantha", + "hau": "Tali", + "geeta": "Sagaria", + "nemona": "Nemila", + "kieran": "Jo", + "leon": "Delion", + "rival": "Finn", + "rival_female": "Ivy", + + "archer": "Atlas", + "ariana": "Athena", + "proton": "Lance", + "petrel": "Lambda", + "tabitha": "Kalle", + "courtney": "Jördis", + "shelly": "Kordula", + "matt": "Wolfgang", + "mars": "Mars", + "jupiter": "Jupiter", + "saturn": "Saturn", + "zinzolin": "Violaceus", + "rood": "Rubius", + "xerosic": "Xeros", + "bryony": "Begonia", + "faba": "Fabian", + "plumeria": "Fran", + "oleana": "Olivia", + + "maxie": "Marc", + "archie": "Adrian", + "cyrus": "Zyrus", + "ghetsis": "G-Cis", + "lysandre": "Flordelis", + "lusamine": "Samantha", + "guzma": "Bromley", + "rose": "Rose", + + "blue_red_double": "Blau & Rot", + "red_blue_double": "Rot & Blau", + "tate_liza_double": "Ben & Svenja", + "liza_tate_double": "Svenja & Ben", + "steven_wallace_double": "Troy & Wassili", + "wallace_steven_double": "Wassili & Troy", + "alder_iris_double": "Lauro & Lilia", + "iris_alder_double": "Lilia & Lauro", + "piers_marnie_double": "Nezz & Mary", + "marnie_piers_double": "Mary & Nezz" +} diff --git a/src/locales/de/trainer-titles.json b/src/locales/de/trainer-titles.json new file mode 100644 index 00000000000..21a4b2fa7b6 --- /dev/null +++ b/src/locales/de/trainer-titles.json @@ -0,0 +1,38 @@ +{ + "elite_four": "Top Vier", + "elite_four_female": "Top Vier", + "gym_leader": "Arenaleiter", + "gym_leader_female": "Arenaleiterin", + "gym_leader_double": "Arenaleiter-Duo", + "champion": "Champion", + "champion_female": "Champion", + "champion_double": "Champion-Duo", + "rival": "Rivale", + "professor": "Professor", + "frontier_brain": "Kampfkoryphäen", + "rocket_boss": "Rocket-Boss", + "magma_boss": "Magma-Boss", + "aqua_boss": "Aqua-Boss", + "galactic_boss": "Galaktik-Boss", + "plasma_boss": "Weiser von Team Plasma", + "flare_boss": "Flare-Boss", + "aether_boss": "Æther-Präsidentin", + "skull_boss": "Skull-Boss", + "macro_boss": "Geschäftsführer von Macro Cosmos", + "rocket_admin": "Team Rocket Vorstand", + "rocket_admin_female": "Team Rocket Vorstand", + "magma_admin": "Team Magma Vorstand", + "magma_admin_female": "Team Magma Vorstand", + "aqua_admin": "Team Aqua Vorstand", + "aqua_admin_female": "Team Aqua Vorstand", + "galactic_commander": "Team Galaktik Commander", + "galactic_commander_female": "Team Galaktik Commander", + "plasma_sage": "Weiser von Team Plasma", + "plasma_admin": "Team Plasma Vorstand", + "flare_admin": "Team Flare Vorstand", + "flare_admin_female": "Team Flare Vorstand", + "aether_admin": "Æther-Regionalleiter", + "skull_admin": "Team Skull Vorstand", + "macro_admin": "Vizepräsidentin von Macro Cosmos" + +} diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts deleted file mode 100644 index 1390bf410ae..00000000000 --- a/src/locales/de/trainers.ts +++ /dev/null @@ -1,291 +0,0 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "elite_four": "Top Vier", - "elite_four_female": "Top Vier", - "gym_leader": "Arenaleiter", - "gym_leader_female": "Arenaleiterin", - "gym_leader_double": "Arenaleiter-Duo", - "champion": "Champion", - "champion_female": "Champion", - "champion_double": "Champion-Duo", - "rival": "Rivale", - "professor": "Professor", - "frontier_brain": "Kampfkoryphäen", - "rocket_boss": "Rocket-Boss", - "magma_boss": "Magma-Boss", - "aqua_boss": "Aqua-Boss", - "galactic_boss": "Galaktik-Boss", - "plasma_boss": "Weiser von Team Plasma", // This is on purpose, since "Ghetsis" is never mentioned as the boss of team plasma in the game but as "Weiser" - "flare_boss": "Flare-Boss", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Ass-Trainer", - "ace_trainer_female": "Ass-Trainerin", - "ace_duo": "Ass-Duo", - "artist": "Künstler", - "artist_female": "Künstlerin", - "backers": "Anhänger", - "backpacker": "Backpacker", - "backpacker_female": "Backpackerin", - "backpackers": "Backpacker", - "baker": "Bäckerin", - "battle_girl": "Kämpferin", - "beauty": "Schönheit", - "beginners": "Anfänger", - "biker": "Rowdy", - "black_belt": "Schwarzgurt", - "breeder": "Pokémon Züchter", - "breeder_female": "Pokémon Züchterin", - "breeders": "Pokémon Züchter", - "clerk": "Angestellter", - "clerk_female": "Angestellte", - "colleagues": "Geschäftspartner", - "crush_kin": "Mühlensippe", - "cyclist": "Biker", - "cyclist_female": "Bikerin", - "cyclists": "Biker", - "dancer": "Tänzer", - "dancer_female": "Tänzerin", - "depot_agent": "Bahnangestellter", - "doctor": "Arzt", - "doctor_female": "Ärztin", - "firebreather": "Feuerspucker", - "fisherman": "Angler", - "fisherman_female": "Angler", // Seems to be the same in german but exists in other languages like italian - "gentleman": "Gentleman", - "guitarist": "Gitarrist", - "guitarist_female": "Gitarristin", - "harlequin": "Kasper", - "hiker": "Wanderer", - "hooligans": "Rabauken", - "hoopster": "Basketballer", - "infielder": "Baseballer", - "janitor": "Hausmeister", - "lady": "Lady", - "lass": "Göre", - "linebacker": "Footballer", - "maid": "Zofe", - "madame": "Madam", - "medical_team": "Mediziner", - "musician": "Musiker", - "hex_maniac": "Hexe", - "nurse": "Pflegerin", - "nursery_aide": "Erzieherin", - "officer": "Polizist", - "parasol_lady": "Schirmdame", - "pilot": "Pilot", - "pokéfan": "Pokéfan", - "pokéfan_female": "Pokéfan", - "pokéfan_family": "Pokéfan-Pärchen", - "preschooler": "Vorschüler", - "preschooler_female": "Vorschülerin", - "preschoolers": "Vorschüler", - "psychic": "Seher", - "psychic_female": "Seherin", - "psychics": "Seher", - "pokémon_ranger": "Pokémon-Ranger", - "pokémon_ranger_female": "Pokémon-Ranger", - "pokémon_rangers": "Pokémon-Ranger", - "ranger": "Ranger", - "restaurant_staff": "Restaurant Angestellte", - "rich": "Gentleman", - "rich_female": "Reiche Dame", - "rich_boy": "Schnösel", - "rich_couple": "Reiches Paar", - "rich_kid": "Schnösel", - "rich_kid_female": "Schnöselin", - "rich_kids": "Schnösel", - "roughneck": "Raufbold", - "sailor": "Matrose", - "scientist": "Forscher", - "scientist_female": "Forscherin", - "scientists": "Forscher", - "smasher": "Tennis-Ass", - "snow_worker": "Schneearbeiter", // There is a trainer type for this but no actual trainer class? They seem to be just workers but dressed differently - "snow_worker_female": "Schneearbeiterin", - "striker": "Fußballer", - "school_kid": "Schulkind", - "school_kid_female": "Schulkind", // Same in german but different in italian - "school_kids": "Schüler", - "swimmer": "Schwimmer", - "swimmer_female": "Schwimmerin", - "swimmers": "Schwimmerpaar", - "twins": "Zwillinge", - "veteran": "Veteran", - "veteran_female": "Veteran", // same in german, different in other languages - "veteran_duo": "Veteranen", - "waiter": "Servierer", - "waitress": "Serviererin", - "worker": "Arbeiter", - "worker_female": "Arbeiterin", - "workers": "Arbeiter", - "youngster": "Knirps", - "rocket_grunt": "Rüpel von Team Rocket", - "rocket_grunt_female": "Rüpel von Team Rocket", - "rocket_grunts": "Rüpel von Team Rocket", - "magma_grunt": "Rüpel von Team Magma", - "magma_grunt_female": "Rüpel von Team Magma", - "magma_grunts": "Rüpel von Team Magma", - "aqua_grunt": "Rüpel von Team Aqua", - "aqua_grunt_female": "Rüpel von Team Aqua", - "aqua_grunts": "Rüpel von Team Aqua", - "galactic_grunt": "Rüpel von Team Galaktik", - "galactic_grunt_female": "Rüpel von Team Galaktik", - "galactic_grunts": "Rüpel von Team Galaktik", - "plasma_grunt": "Rüpel von Team Plasma", - "plasma_grunt_female": "Rüpel von Team Plasma", - "plasma_grunts": "Rüpel von Team Plasma", - "flare_grunt": "Rüpel von Team Flare", - "flare_grunt_female": "Rüpel von Team Flare", - "flare_grunts": "Rüpel von Team Flare", -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - "brock": "Rocko", - "misty": "Misty", - "lt_surge": "Major Bob", - "erika": "Erika", - "janine": "Janina", - "sabrina": "Sabrina", - "blaine": "Pyro", - "giovanni": "Giovanni", - "falkner": "Falk", - "bugsy": "Kai", - "whitney": "Bianka", - "morty": "Jens", - "chuck": "Hartwig", - "jasmine": "Jasmin", - "pryce": "Norbert", - "clair": "Sandra", - "roxanne": "Felizia", - "brawly": "Kamillo", - "wattson": "Walter", - "flannery": "Flavia", - "norman": "Norman", - "winona": "Wibke", - "tate": "Ben", - "liza": "Svenja", - "juan": "Juan", - "roark": "Veit", - "gardenia": "Silvana", - "maylene": "Hilda", - "crasher_wake": "Wellenbrecher Marinus", - "fantina": "Lamina", - "byron": "Adam", - "candice": "Frida", - "volkner": "Volkner", - "cilan": "Benny", - "chili": "Maik", - "cress": "Colin", - "cheren": "Cheren", - "lenora": "Aloe", - "roxie": "Mica", - "burgh": "Artie", - "elesa": "Kamilla", - "clay": "Turner", - "skyla": "Géraldine", - "brycen": "Sandro", - "drayden": "Lysander", - "marlon": "Benson", - "viola": "Viola", - "grant": "Lino", - "korrina": "Connie", - "ramos": "Amaro", - "clemont": "Citro", - "valerie": "Valerie", - "olympia": "Astrid", - "wulfric": "Galantho", - "milo": "Yarro", - "nessa": "Kate", - "kabu": "Kabu", - "bea": "Saida", - "allister": "Nio", - "opal": "Papella", - "bede": "Betys", - "gordie": "Mac", - "melony": "Mel", - "piers": "Nezz", - "marnie": "Mary", - "raihan": "Roy", - "katy": "Ronah", - "brassius": "Colzo", - "iono": "Enigmara", - "kofu": "Kombu", - "larry": "Aoki", - "ryme": "Etta", - "tulip": "Tulia", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agathe", - "lance": "Siegfried", - "will": "Willi", - "koga": "Koga", - "karen": "Melanie", - "sidney": "Ulrich", - "phoebe": "Antonia", - "glacia": "Frosina", - "drake": "Dragan", - "aaron": "Herbaro", - "bertha": "Teresa", - "flint": "Ignaz", - "lucian": "Lucian", - "shauntal": "Anissa", - "marshal": "Eugen", - "grimsley": "Astor", - "caitlin": "Kattlea", - "malva": "Pachira", - "siebold": "Narcisse", - "wikstrom": "Thymelot", - "drasna": "Dracena", - "hala": "Hala", - "molayne": "Marlon", - "olivia": "Mayla", - "acerola": "Lola", - "kahili": "Kahili", - "rika": "Cay", - "poppy": "Poppy", - "hassel": "Sinius", - "crispin": "Matt", - "amarys": "Erin", - "lacey": "Tara", - "drayton": "Levy", - "blue": "Blau", - "red": "Rot", - "steven": "Troy", - "wallace": "Wassili", - "cynthia": "Cynthia", - "alder": "Lauro", - "iris": "Lilia", - "diantha": "Diantha", - "hau": "Tali", - "geeta": "Sagaria", - "nemona": "Nemila", - "kieran": "Jo", - "leon": "Delion", - "rival": "Finn", - "rival_female": "Ivy", - "maxie": "Marc", - "archie": "Adrian", - "cyrus": "Zyrus", - "ghetsis": "G-Cis", - "lysandre": "Flordelis", - - // Double Names - "blue_red_double": "Blau & Rot", - "red_blue_double": "Rot & Blau", - "tate_liza_double": "Ben & Svenja", - "liza_tate_double": "Svenja & Ben", - "steven_wallace_double": "Troy & Wassili", - "wallace_steven_double": "Wassili & Troy", - "alder_iris_double": "Lauro & Lilia", - "iris_alder_double": "Lilia & Lauro", - "piers_marnie_double": "Nezz & Mary", - "marnie_piers_double": "Mary & Nezz", -} as const; diff --git a/src/locales/de/tutorial.json b/src/locales/de/tutorial.json new file mode 100644 index 00000000000..9cdb94b2cac --- /dev/null +++ b/src/locales/de/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "Willkommen bei PokéRogue! Dies ist ein kampforientiertes Pokémon-Fangame mit Roguelite-Elementen.\n$Dieses Spiel ist nicht monetarisiert.\n$Wir erheben keinen Eigentumsanspruch an Pokémon oder\nverwendeten, urheberrechtlich geschützten Inhalten.\n$Das Spiel befindet sich noch in der Entwicklung, ist aber voll spielbar.\n$Für Fehlerberichte nutze bitte den PokéRogue Discord-Server.\n$Sollte das Spiel langsam laufen, überprüfe, ob in deinem Browser \"Hardwarebeschleunigung\" aktiviert ist.", + "accessMenu": "Nutze M oder Esc, um das Menü zu öffnen. Dort hast du Zugriff auf die Einstellungen und andere Funktionen.", + "menu": "In diesem Menü hast du Zugriff auf die Einstellungen.\n$Dort kannst du u. A. die Spielgeschwin-\ndigkeit und das Fensterdesign ändern.\n$Das Menü verbirgt noch andere Funktionen - probier' sie gerne aus!", + "starterSelect": "In diesem Bildschirm kannst du mit Z oder Leertaste deine\nStarter auswählen.\n$Sie begleiten dich am Anfang deines Abenteuers.\n$Jeder Starter hat einen Preis. Dein Team kann bis zu sechs\nMitglieder haben, solange der Gesamtpreis max. 10 beträgt.\n$Du kannst Geschlecht, Fähigkeit und Form beliebig auswählen,\nsobald du sie mindestens einmal gefangen hast.\n$Die DVs ergeben sich aus den Höchstwerten aller Pokémon,\ndie du bereits gefangen hast. \n$Es lohnt sich also, das selbe Pokémon mehrmals zu fangen!", + "pokerus": "Jeden Tag haben drei zufällige Pokémon einen lila Rahmen.\n$Wenn du eins von ihnen besitzt,\n$nimm es doch mal mit und sieh dir seinen Bericht an!", + "statChange": "Statuswertveränderungen halten solange an, wie dein Pokémon auf dem Feld bleibt.\n$Pokémon werden am Anfang eines Trainerkampfes oder bei einem Arealwechsel automatisch zurückgerufen.\n$Nutze C oder Shift, um aktuelle Statuswertveränderungen anzuzeigen.", + "selectItem": "Nach jedem Kampf kannst du aus 3 zufälligen Items exakt eines auswählen.\n$Es gibt u. A. Heilitems, tragbare Items und Basis-Items, die dir einen permanenten Vorteil verschaffen.\n$Die meisten tragbaren und permanenten Items werden stärker, wenn du sie mehrfach sammelst.\n$Manche Items, wie Entwicklungssteine, tauchen nur auf, wenn du sie auch nutzen kannst.\n$Mithilfe der \"Transfer\"-Option kannst du Items zwischen deinen Pokémon verschieben.\n$Sie erscheint rechts unten, sobald du einem deiner Pokémon dein Item zum Tragen gegeben hast.\n$Du kannst Heilitems auch gegen Geld erwerben. Je weiter du kommst, desto mehr stehen dir zur Auswahl.\n$Erledige deine Einkäufe als erstes, denn sobald du dein zufälliges Item auswählst, beginnt der nächste Kampf.", + "eggGacha": "Hier kannst du deine Gutscheine gegen Pokémon-Eier\ntauschen.\n$Eier schlüpfen, nachdem du eine gewisse Anzahl Kämpfe\nabsolviert hast. Je seltener das Ei, desto länger dauert es.\n$Geschlüpfte Pokémon werden nicht deinem Team hinzugefügt,\nsondern deinen verfügbaren Startern.\n$In der Regel haben sie bessere DVs als in der Wildnis\ngefangene Pokémon.\n$Es gibt sogar Pokémon, die du nur aus Eiern erhalten kannst.\n$Es gibt drei Gacha-Maschinen mit je unterschiedlichen Boni,\nalso such' dir die aus, die dir am besten gefällt!" +} \ No newline at end of file diff --git a/src/locales/de/tutorial.ts b/src/locales/de/tutorial.ts deleted file mode 100644 index 0b02c6c0922..00000000000 --- a/src/locales/de/tutorial.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - "intro": `Willkommen bei PokéRogue! Dies ist ein kampforientiertes Pokémon-Fangame mit Roguelite-Elementen. - $Dieses Spiel ist nicht monetarisiert. - $Wir erheben keinen Eigentumsanspruch an Pokémon oder\nverwendeten, urheberrechtlich geschützten Inhalten. - $Das Spiel befindet sich noch in der Entwicklung, ist aber voll spielbar. - $Für Fehlerberichte nutze bitte den PokéRogue Discord-Server. - $Sollte das Spiel langsam laufen, überprüfe, ob in deinem Browser "Hardwarebeschleunigung" aktiviert ist.`, - - "accessMenu": "Nutze M oder Esc, um das Menü zu öffnen. Dort hast du Zugriff auf die Einstellungen und andere Funktionen.", - - "menu": `In diesem Menü hast du Zugriff auf die Einstellungen. - $Dort kannst du u. A. die Spielgeschwin-\ndigkeit und das Fensterdesign ändern. - $Das Menü verbirgt noch andere Funktionen - probier' sie gerne aus!`, - - "starterSelect": `In diesem Bildschirm kannst du mit Z oder Leertaste deine\nStarter auswählen. - $Sie begleiten dich am Anfang deines Abenteuers. - $Jeder Starter hat einen Preis. Dein Team kann bis zu sechs\nMitglieder haben, solange der Gesamtpreis max. 10 beträgt. - $Du kannst Geschlecht, Fähigkeit und Form beliebig auswählen,\nsobald du sie mindestens einmal gefangen hast. - $Die DVs ergeben sich aus den Höchstwerten aller Pokémon,\ndie du bereits gefangen hast. - $Es lohnt sich also, das selbe Pokémon mehrmals zu fangen!`, - - "pokerus": `Jeden Tag haben drei zufällige Pokémon einen lila Rahmen. - $Wenn du eins von ihnen besitzt, - $nimm es doch mal mit und sieh dir seinen Bericht an!`, - - "statChange": `Statuswertveränderungen halten solange an, wie dein Pokémon auf dem Feld bleibt. - $Pokémon werden am Anfang eines Trainerkampfes oder bei einem Arealwechsel automatisch zurückgerufen. - $Nutze C oder Shift, um aktuelle Statuswertveränderungen anzuzeigen.`, - - "selectItem": `Nach jedem Kampf kannst du aus 3 zufälligen Items exakt eines auswählen. - $Es gibt u. A. Heilitems, tragbare Items und Basis-Items, die dir einen permanenten Vorteil verschaffen. - $Die meisten tragbaren und permanenten Items werden stärker, wenn du sie mehrfach sammelst. - $Manche Items, wie Entwicklungssteine, tauchen nur auf, wenn du sie auch nutzen kannst. - $Mithilfe der "Transfer"-Option kannst du Items zwischen deinen Pokémon verschieben. - $Sie erscheint rechts unten, sobald du einem deiner Pokémon dein Item zum Tragen gegeben hast. - $Du kannst Heilitems auch gegen Geld erwerben. Je weiter du kommst, desto mehr stehen dir zur Auswahl. - $Erledige deine Einkäufe als erstes, denn sobald du dein zufälliges Item auswählst, beginnt der nächste Kampf.`, - - "eggGacha": `Hier kannst du deine Gutscheine gegen Pokémon-Eier\ntauschen. - $Eier schlüpfen, nachdem du eine gewisse Anzahl Kämpfe\nabsolviert hast. Je seltener das Ei, desto länger dauert es. - $Geschlüpfte Pokémon werden nicht deinem Team hinzugefügt,\nsondern deinen verfügbaren Startern. - $In der Regel haben sie bessere DVs als in der Wildnis\ngefangene Pokémon. - $Es gibt sogar Pokémon, die du nur aus Eiern erhalten kannst. - $Es gibt drei Gacha-Maschinen mit je unterschiedlichen Boni,\nalso such' dir die aus, die dir am besten gefällt!`, -} as const; diff --git a/src/locales/de/voucher.ts b/src/locales/de/voucher.json similarity index 64% rename from src/locales/de/voucher.ts rename to src/locales/de/voucher.json index 3ca01689875..8c2804a83d3 100644 --- a/src/locales/de/voucher.ts +++ b/src/locales/de/voucher.json @@ -1,11 +1,9 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { - "vouchers": "Gutscheine", - "eggVoucher": "Ei-Gutschein", - "eggVoucherPlus": "Ei-Gutschein Plus", - "eggVoucherPremium": "Ei-Gutschein Premium", - "eggVoucherGold": "Ei-Gutschein Gold", - "locked": "Gesperrt", - "defeatTrainer": "Besiege {{trainerName}}" -} as const; +{ + "vouchers": "Gutscheine", + "eggVoucher": "Ei-Gutschein", + "eggVoucherPlus": "Ei-Gutschein Plus", + "eggVoucherPremium": "Ei-Gutschein Premium", + "eggVoucherGold": "Ei-Gutschein Gold", + "locked": "Gesperrt", + "defeatTrainer": "Besiege {{trainerName}}" +} \ No newline at end of file diff --git a/src/locales/de/weather.ts b/src/locales/de/weather.json similarity index 87% rename from src/locales/de/weather.ts rename to src/locales/de/weather.json index 1132c35c430..6dc26b2cf8c 100644 --- a/src/locales/de/weather.ts +++ b/src/locales/de/weather.json @@ -1,44 +1,32 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { +{ "sunnyStartMessage": "Die Sonnenlicht wird stärker!", "sunnyLapseMessage": "Die Sonnenlicht ist stark.", "sunnyClearMessage": "Die Sonnenlicht verliert wieder an Intensität.", - "rainStartMessage": "Es fängt an zu regnen!", "rainLapseMessage": "Es regnet weiter.", "rainClearMessage": "Der Regen lässt nach.", - "sandstormStartMessage": "Ein Sandsturm kommt auf!", "sandstormLapseMessage": "Der Sandsturm tobt.", "sandstormClearMessage": "Der Sandsturm legt sich.", "sandstormDamageMessage": " Der Sandsturm fügt {{pokemonNameWithAffix}} Schaden zu!", - "hailStartMessage": "Es fängt an zu hageln!", "hailLapseMessage": "Der Hagelsturm tobt.", "hailClearMessage": "Der Hagelsturm legt sich.", "hailDamageMessage": "{{pokemonNameWithAffix}} wird von Hagelkörnern getroffen!", - "snowStartMessage": "Es fängt an zu schneien!", "snowLapseMessage": "Der Schneesturm tobt.", "snowClearMessage": "Der Schneesturm legt sich.", - "fogStartMessage": "Am Boden breitet sich dichter Nebel aus!", "fogLapseMessage": "Der Nebel bleibt dicht.", "fogClearMessage": "Der Nebel lichtet sich.", - "heavyRainStartMessage": "Es fängt an, in Strömen zu regnen!", "heavyRainLapseMessage": "Der strömende Regen hält an.", "heavyRainClearMessage": "Der strömende Regen lässt nach.", - "harshSunStartMessage": "Das Sonnenlicht wird sehr viel stärker!", "harshSunLapseMessage": "Das Sonnenlicht ist sehr stark.", "harshSunClearMessage": "Das Sonnenlicht verliert an Intensität.", - "strongWindsStartMessage": "Alle Flug-Pokémon werden von rätselhaften Luftströmungen geschützt!", "strongWindsLapseMessage": "Die rätselhafte Luftströmung hält an.", - "strongWindsClearMessage": "Die rätselhafte Luftströmung hat sich wieder geleget.", -}; + "strongWindsEffectMessage": "Rätselhafte Luftströmungen haben den Angriff abgeschwächt!", + "strongWindsClearMessage": "Die rätselhafte Luftströmung hat sich wieder geleget." +} \ No newline at end of file diff --git a/src/locales/en/ability-trigger.json b/src/locales/en/ability-trigger.json new file mode 100644 index 00000000000..da21d80e3c7 --- /dev/null +++ b/src/locales/en/ability-trigger.json @@ -0,0 +1,64 @@ +{ + "blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", + "badDreams": "{{pokemonName}} is tormented!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} avoided\ndamage with {{abilityName}}!", + "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both Pokémon in 3 turns!", + "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}'s disguise was busted!", + "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!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} swapped\nabilities with its target!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} gave its target\n{{abilityName}}!", + "postDefendMoveDisable": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} transformed into the {{moveType}} type!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{defenderName}}'s {{stolenItemType}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{attackerName}}'s {{stolenItemType}}!", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}}'s {{abilityName}} was taken over!", + "intimidateImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}} prevented it from being Intimidated!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} drank down all the\nmatcha that {{pokemonName}} made!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}'s stat changes\nwere removed!", + "postSummonTransform": "{{pokemonNameWithAffix}} transformed\ninto {{targetName}}!", + "protectStat": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents lowering its {{statName}}!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{statusEffectName}}!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents status problems!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}} was forewarned about {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} frisked {{opponentName}}'s {{opponentAbilityName}}!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} is hurt\nby its {{abilityName}}!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} harvested one {{berryName}}!", + "postTurnHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "fetchBall": "{{pokemonNameWithAffix}} found a\n{{pokeballName}}!", + "healFromBerryUse": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP!", + "arenaTrap": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents switching!", + "postBattleLoot": "{{pokemonNameWithAffix}} picked up\n{{itemName}}!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!", + "weatherEffectDisappeared": "The effects of the weather disappeared.", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}} reversed all other Pokémon's auras!", + "postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}'s Vessel of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!" +} diff --git a/src/locales/en/ability-trigger.ts b/src/locales/en/ability-trigger.ts deleted file mode 100644 index b516bc8dde0..00000000000 --- a/src/locales/en/ability-trigger.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", - "badDreams": "{{pokemonName}} is tormented!", - "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!", - "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", - "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", - "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", - "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", - "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", -} as const; diff --git a/src/locales/en/ability.json b/src/locales/en/ability.json new file mode 100644 index 00000000000..de2e063e966 --- /dev/null +++ b/src/locales/en/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "Stench", + "description": "By releasing stench when attacking, this Pokémon may cause the target to flinch." + }, + "drizzle": { + "name": "Drizzle", + "description": "The Pokémon makes it rain when it enters a battle." + }, + "speedBoost": { + "name": "Speed Boost", + "description": "Its Speed stat is boosted every turn." + }, + "battleArmor": { + "name": "Battle Armor", + "description": "Hard armor protects the Pokémon from critical hits." + }, + "sturdy": { + "name": "Sturdy", + "description": "It cannot be knocked out with one hit. One-hit KO moves cannot knock it out, either." + }, + "damp": { + "name": "Damp", + "description": "Prevents the use of explosive moves, such as Self-Destruct, by dampening its surroundings." + }, + "limber": { + "name": "Limber", + "description": "Its limber body protects the Pokémon from paralysis." + }, + "sandVeil": { + "name": "Sand Veil", + "description": "Boosts the Pokémon's evasiveness in a sandstorm." + }, + "static": { + "name": "Static", + "description": "The Pokémon is charged with static electricity, so contact with it may cause paralysis." + }, + "voltAbsorb": { + "name": "Volt Absorb", + "description": "Restores HP if hit by an Electric-type move instead of taking damage." + }, + "waterAbsorb": { + "name": "Water Absorb", + "description": "Restores HP if hit by a Water-type move instead of taking damage." + }, + "oblivious": { + "name": "Oblivious", + "description": "The Pokémon is oblivious, and that keeps it from being infatuated or falling for taunts." + }, + "cloudNine": { + "name": "Cloud Nine", + "description": "Eliminates the effects of weather." + }, + "compoundEyes": { + "name": "Compound Eyes", + "description": "The Pokémon's compound eyes boost its accuracy." + }, + "insomnia": { + "name": "Insomnia", + "description": "The Pokémon is suffering from insomnia and cannot fall asleep." + }, + "colorChange": { + "name": "Color Change", + "description": "The Pokémon's type becomes the type of the move used on it." + }, + "immunity": { + "name": "Immunity", + "description": "The immune system of the Pokémon prevents it from getting poisoned." + }, + "flashFire": { + "name": "Flash Fire", + "description": "Powers up the Pokémon's Fire-type moves if it's hit by one." + }, + "shieldDust": { + "name": "Shield Dust", + "description": "This Pokémon's dust blocks the additional effects of attacks taken." + }, + "ownTempo": { + "name": "Own Tempo", + "description": "This Pokémon has its own tempo, and that prevents it from becoming confused." + }, + "suctionCups": { + "name": "Suction Cups", + "description": "This Pokémon uses suction cups to stay in one spot to negate all moves and items that force switching out." + }, + "intimidate": { + "name": "Intimidate", + "description": "The Pokémon intimidates opposing Pokémon upon entering battle, lowering their Attack stat." + }, + "shadowTag": { + "name": "Shadow Tag", + "description": "This Pokémon steps on the opposing Pokémon's shadow to prevent it from escaping." + }, + "roughSkin": { + "name": "Rough Skin", + "description": "This Pokémon inflicts damage with its rough skin to the attacker on contact." + }, + "wonderGuard": { + "name": "Wonder Guard", + "description": "Its mysterious power only lets supereffective moves hit the Pokémon." + }, + "levitate": { + "name": "Levitate", + "description": "By floating in the air, the Pokémon receives full immunity to all Ground-type moves." + }, + "effectSpore": { + "name": "Effect Spore", + "description": "Contact with the Pokémon may inflict poison, sleep, or paralysis on its attacker." + }, + "synchronize": { + "name": "Synchronize", + "description": "The attacker will receive the same status condition if it inflicts a burn, poison, or paralysis to the Pokémon." + }, + "clearBody": { + "name": "Clear Body", + "description": "Prevents other Pokémon's moves or Abilities from lowering the Pokémon's stats." + }, + "naturalCure": { + "name": "Natural Cure", + "description": "All status conditions heal when the Pokémon switches out." + }, + "lightningRod": { + "name": "Lightning Rod", + "description": "The Pokémon draws in all Electric-type moves. Instead of being hit by Electric-type moves, it boosts its Sp. Atk." + }, + "sereneGrace": { + "name": "Serene Grace", + "description": "Boosts the likelihood of additional effects occurring when attacking." + }, + "swiftSwim": { + "name": "Swift Swim", + "description": "Boosts the Pokémon's Speed stat in rain." + }, + "chlorophyll": { + "name": "Chlorophyll", + "description": "Boosts the Pokémon's Speed stat in harsh sunlight." + }, + "illuminate": { + "name": "Illuminate", + "description": "By illuminating its surroundings, the Pokémon raises the likelihood of meeting wild Pokémon and prevents its accuracy from being lowered." + }, + "trace": { + "name": "Trace", + "description": "When it enters a battle, the Pokémon copies an opposing Pokémon's Ability." + }, + "hugePower": { + "name": "Huge Power", + "description": "Doubles the Pokémon's Attack stat." + }, + "poisonPoint": { + "name": "Poison Point", + "description": "Contact with the Pokémon may poison the attacker." + }, + "innerFocus": { + "name": "Inner Focus", + "description": "The Pokémon's intensely focused, and that protects the Pokémon from flinching." + }, + "magmaArmor": { + "name": "Magma Armor", + "description": "The Pokémon is covered with hot magma, which prevents the Pokémon from becoming frozen." + }, + "waterVeil": { + "name": "Water Veil", + "description": "The Pokémon is covered with a water veil, which prevents the Pokémon from getting a burn." + }, + "magnetPull": { + "name": "Magnet Pull", + "description": "Prevents Steel-type Pokémon from escaping using its magnetic force." + }, + "soundproof": { + "name": "Soundproof", + "description": "Soundproofing gives the Pokémon full immunity to all sound-based moves." + }, + "rainDish": { + "name": "Rain Dish", + "description": "The Pokémon gradually regains HP in rain." + }, + "sandStream": { + "name": "Sand Stream", + "description": "The Pokémon summons a sandstorm when it enters a battle." + }, + "pressure": { + "name": "Pressure", + "description": "By putting pressure on the opposing Pokémon, it raises their PP usage." + }, + "thickFat": { + "name": "Thick Fat", + "description": "The Pokémon is protected by a layer of thick fat, which halves the damage taken from Fire- and Ice-type moves." + }, + "earlyBird": { + "name": "Early Bird", + "description": "The Pokémon awakens from sleep twice as fast as other Pokémon." + }, + "flameBody": { + "name": "Flame Body", + "description": "Contact with the Pokémon may burn the attacker." + }, + "runAway": { + "name": "Run Away", + "description": "Enables a sure getaway from wild Pokémon." + }, + "keenEye": { + "name": "Keen Eye", + "description": "Keen eyes prevent other Pokémon from lowering this Pokémon's accuracy." + }, + "hyperCutter": { + "name": "Hyper Cutter", + "description": "The Pokémon's proud of its powerful pincers. They prevent other Pokémon from lowering its Attack stat." + }, + "pickup": { + "name": "Pickup", + "description": "The Pokémon may pick up the item an opposing Pokémon held during a battle." + }, + "truant": { + "name": "Truant", + "description": "The Pokémon can't use a move if it had used a move on the previous turn." + }, + "hustle": { + "name": "Hustle", + "description": "Boosts the Attack stat, but lowers accuracy." + }, + "cuteCharm": { + "name": "Cute Charm", + "description": "Contact with the Pokémon may cause infatuation." + }, + "plus": { + "name": "Plus", + "description": "Boosts the Sp. Atk stat of the Pokémon if an ally with the Plus or Minus Ability is also in battle." + }, + "minus": { + "name": "Minus", + "description": "Boosts the Sp. Atk stat of the Pokémon if an ally with the Plus or Minus Ability is also in battle." + }, + "forecast": { + "name": "Forecast", + "description": "The Pokémon transforms with the weather to change its type to Water, Fire, or Ice." + }, + "stickyHold": { + "name": "Sticky Hold", + "description": "Items held by the Pokémon are stuck fast and cannot be removed by other Pokémon." + }, + "shedSkin": { + "name": "Shed Skin", + "description": "The Pokémon may heal its own status conditions by shedding its skin." + }, + "guts": { + "name": "Guts", + "description": "It's so gutsy that having a status condition boosts the Pokémon's Attack stat." + }, + "marvelScale": { + "name": "Marvel Scale", + "description": "The Pokémon's marvelous scales boost the Defense stat if it has a status condition." + }, + "liquidOoze": { + "name": "Liquid Ooze", + "description": "The oozed liquid has a strong stench, which damages attackers using any draining move." + }, + "overgrow": { + "name": "Overgrow", + "description": "Powers up Grass-type moves when the Pokémon's HP is low." + }, + "blaze": { + "name": "Blaze", + "description": "Powers up Fire-type moves when the Pokémon's HP is low." + }, + "torrent": { + "name": "Torrent", + "description": "Powers up Water-type moves when the Pokémon's HP is low." + }, + "swarm": { + "name": "Swarm", + "description": "Powers up Bug-type moves when the Pokémon's HP is low." + }, + "rockHead": { + "name": "Rock Head", + "description": "Protects the Pokémon from recoil damage." + }, + "drought": { + "name": "Drought", + "description": "Turns the sunlight harsh when the Pokémon enters a battle." + }, + "arenaTrap": { + "name": "Arena Trap", + "description": "Prevents opposing Pokémon from fleeing." + }, + "vitalSpirit": { + "name": "Vital Spirit", + "description": "The Pokémon is full of vitality, and that prevents it from falling asleep." + }, + "whiteSmoke": { + "name": "White Smoke", + "description": "The Pokémon is protected by its white smoke, which prevents other Pokémon from lowering its stats." + }, + "purePower": { + "name": "Pure Power", + "description": "Using its pure power, the Pokémon doubles its Attack stat." + }, + "shellArmor": { + "name": "Shell Armor", + "description": "A hard shell protects the Pokémon from critical hits." + }, + "airLock": { + "name": "Air Lock", + "description": "Eliminates the effects of weather." + }, + "tangledFeet": { + "name": "Tangled Feet", + "description": "Raises evasiveness if the Pokémon is confused." + }, + "motorDrive": { + "name": "Motor Drive", + "description": "Boosts its Speed stat if hit by an Electric-type move instead of taking damage." + }, + "rivalry": { + "name": "Rivalry", + "description": "Becomes competitive and deals more damage to Pokémon of the same gender, but deals less to Pokémon of the opposite gender." + }, + "steadfast": { + "name": "Steadfast", + "description": "The Pokémon's determination boosts the Speed stat each time the Pokémon flinches." + }, + "snowCloak": { + "name": "Snow Cloak", + "description": "Boosts the Pokémon's evasiveness in snow." + }, + "gluttony": { + "name": "Gluttony", + "description": "Makes the Pokémon eat a held Berry when its HP drops to half or less, which is sooner than usual." + }, + "angerPoint": { + "name": "Anger Point", + "description": "The Pokémon is angered when it takes a critical hit, and that maxes its Attack stat." + }, + "unburden": { + "name": "Unburden", + "description": "Boosts the Speed stat if the Pokémon's held item is used or lost." + }, + "heatproof": { + "name": "Heatproof", + "description": "The heatproof body of the Pokémon halves the damage from Fire-type moves that hit it." + }, + "simple": { + "name": "Simple", + "description": "The stat changes the Pokémon receives are doubled." + }, + "drySkin": { + "name": "Dry Skin", + "description": "Restores HP in rain or when hit by Water-type moves. Reduces HP in harsh sunlight, and increases the damage received from Fire-type moves." + }, + "download": { + "name": "Download", + "description": "Compares an opposing Pokémon's Defense and Sp. Def stats before raising its own Attack or Sp. Atk stat—whichever will be more effective." + }, + "ironFist": { + "name": "Iron Fist", + "description": "Powers up punching moves." + }, + "poisonHeal": { + "name": "Poison Heal", + "description": "Restores HP if the Pokémon is poisoned instead of losing HP." + }, + "adaptability": { + "name": "Adaptability", + "description": "Powers up moves of the same type as the Pokémon." + }, + "skillLink": { + "name": "Skill Link", + "description": "Maximizes the number of times multistrike moves hit." + }, + "hydration": { + "name": "Hydration", + "description": "Heals status conditions if it's raining." + }, + "solarPower": { + "name": "Solar Power", + "description": "Boosts the Sp. Atk stat in harsh sunlight, but HP decreases every turn." + }, + "quickFeet": { + "name": "Quick Feet", + "description": "Boosts the Speed stat if the Pokémon has a status condition." + }, + "normalize": { + "name": "Normalize", + "description": "All the Pokémon's moves become Normal type. The power of those moves is boosted a little." + }, + "sniper": { + "name": "Sniper", + "description": "Powers up moves if they become critical hits when attacking." + }, + "magicGuard": { + "name": "Magic Guard", + "description": "The Pokémon only takes damage from attacks." + }, + "noGuard": { + "name": "No Guard", + "description": "The Pokémon employs no-guard tactics to ensure incoming and outgoing attacks always land." + }, + "stall": { + "name": "Stall", + "description": "The Pokémon moves after all other Pokémon do." + }, + "technician": { + "name": "Technician", + "description": "Powers up the Pokémon's weaker moves." + }, + "leafGuard": { + "name": "Leaf Guard", + "description": "Prevents status conditions in harsh sunlight." + }, + "klutz": { + "name": "Klutz", + "description": "The Pokémon can't use any held items." + }, + "moldBreaker": { + "name": "Mold Breaker", + "description": "Moves can be used on the target regardless of its Abilities." + }, + "superLuck": { + "name": "Super Luck", + "description": "The Pokémon is so lucky that the critical-hit ratios of its moves are boosted." + }, + "aftermath": { + "name": "Aftermath", + "description": "Damages the attacker if it contacts the Pokémon with a finishing hit." + }, + "anticipation": { + "name": "Anticipation", + "description": "The Pokémon can sense an opposing Pokémon's dangerous moves." + }, + "forewarn": { + "name": "Forewarn", + "description": "When it enters a battle, the Pokémon can tell one of the moves an opposing Pokémon has." + }, + "unaware": { + "name": "Unaware", + "description": "When attacking, the Pokémon ignores the target Pokémon's stat changes." + }, + "tintedLens": { + "name": "Tinted Lens", + "description": "The Pokémon can use \"not very effective\" moves to deal regular damage." + }, + "filter": { + "name": "Filter", + "description": "Reduces the power of supereffective attacks taken." + }, + "slowStart": { + "name": "Slow Start", + "description": "For five turns, the Pokémon's Attack and Speed stats are halved." + }, + "scrappy": { + "name": "Scrappy", + "description": "The Pokémon can hit Ghost-type Pokémon with Normal- and Fighting-type moves." + }, + "stormDrain": { + "name": "Storm Drain", + "description": "Draws in all Water-type moves. Instead of being hit by Water-type moves, it boosts its Sp. Atk." + }, + "iceBody": { + "name": "Ice Body", + "description": "The Pokémon gradually regains HP in snow." + }, + "solidRock": { + "name": "Solid Rock", + "description": "Reduces the power of supereffective attacks taken." + }, + "snowWarning": { + "name": "Snow Warning", + "description": "The Pokémon makes it snow when it enters a battle." + }, + "honeyGather": { + "name": "Honey Gather", + "description": "The Pokémon gathers Honey after a battle. The Honey is then sold for money." + }, + "frisk": { + "name": "Frisk", + "description": "When it enters a battle, the Pokémon can check an opposing Pokémon's Ability." + }, + "reckless": { + "name": "Reckless", + "description": "Powers up moves that have recoil damage." + }, + "multitype": { + "name": "Multitype", + "description": "Changes the Pokémon's type to match the Plate or Z-Crystal it holds." + }, + "flowerGift": { + "name": "Flower Gift", + "description": "Boosts the Attack and Sp. Def stats of itself and allies in harsh sunlight." + }, + "badDreams": { + "name": "Bad Dreams", + "description": "Reduces the HP of sleeping opposing Pokémon." + }, + "pickpocket": { + "name": "Pickpocket", + "description": "Steals an item from an attacker that made direct contact." + }, + "sheerForce": { + "name": "Sheer Force", + "description": "Removes additional effects to increase the power of moves when attacking." + }, + "contrary": { + "name": "Contrary", + "description": "Makes stat changes have an opposite effect." + }, + "unnerve": { + "name": "Unnerve", + "description": "Unnerves opposing Pokémon and makes them unable to eat Berries." + }, + "defiant": { + "name": "Defiant", + "description": "Boosts the Pokémon's Attack stat sharply when its stats are lowered." + }, + "defeatist": { + "name": "Defeatist", + "description": "Halves the Pokémon's Attack and Sp. Atk stats when its HP becomes half or less." + }, + "cursedBody": { + "name": "Cursed Body", + "description": "May disable a move used on the Pokémon." + }, + "healer": { + "name": "Healer", + "description": "Sometimes heals an ally's status condition." + }, + "friendGuard": { + "name": "Friend Guard", + "description": "Reduces damage done to allies." + }, + "weakArmor": { + "name": "Weak Armor", + "description": "Physical attacks to the Pokémon lower its Defense stat but sharply raise its Speed stat." + }, + "heavyMetal": { + "name": "Heavy Metal", + "description": "Doubles the Pokémon's weight." + }, + "lightMetal": { + "name": "Light Metal", + "description": "Halves the Pokémon's weight." + }, + "multiscale": { + "name": "Multiscale", + "description": "Reduces the amount of damage the Pokémon takes while its HP is full." + }, + "toxicBoost": { + "name": "Toxic Boost", + "description": "Powers up physical attacks when the Pokémon is poisoned." + }, + "flareBoost": { + "name": "Flare Boost", + "description": "Powers up special attacks when the Pokémon is burned." + }, + "harvest": { + "name": "Harvest", + "description": "May create another Berry after one is used." + }, + "telepathy": { + "name": "Telepathy", + "description": "Anticipates an ally's attack and dodges it." + }, + "moody": { + "name": "Moody", + "description": "Raises one stat sharply and lowers another every turn." + }, + "overcoat": { + "name": "Overcoat", + "description": "Protects the Pokémon from things like sand, hail, and powder." + }, + "poisonTouch": { + "name": "Poison Touch", + "description": "May poison a target when the Pokémon makes contact." + }, + "regenerator": { + "name": "Regenerator", + "description": "Restores a little HP when withdrawn from battle." + }, + "bigPecks": { + "name": "Big Pecks", + "description": "Protects the Pokémon from Defense-lowering effects." + }, + "sandRush": { + "name": "Sand Rush", + "description": "Boosts the Pokémon's Speed stat in a sandstorm." + }, + "wonderSkin": { + "name": "Wonder Skin", + "description": "Makes status moves more likely to miss." + }, + "analytic": { + "name": "Analytic", + "description": "Boosts move power when the Pokémon moves last." + }, + "illusion": { + "name": "Illusion", + "description": "Comes out disguised as the Pokémon in the party's last spot." + }, + "imposter": { + "name": "Imposter", + "description": "The Pokémon transforms itself into the Pokémon it's facing." + }, + "infiltrator": { + "name": "Infiltrator", + "description": "Passes through the opposing Pokémon's barrier, substitute, and the like and strikes." + }, + "mummy": { + "name": "Mummy", + "description": "Contact with the Pokémon changes the attacker's Ability to Mummy." + }, + "moxie": { + "name": "Moxie", + "description": "The Pokémon shows moxie, and that boosts the Attack stat after knocking out any Pokémon." + }, + "justified": { + "name": "Justified", + "description": "Being hit by a Dark-type move boosts the Attack stat of the Pokémon, for justice." + }, + "rattled": { + "name": "Rattled", + "description": "Intimidate or being hit by a Dark-, Ghost-, or Bug-type move will scare the Pokémon and boost its Speed stat." + }, + "magicBounce": { + "name": "Magic Bounce", + "description": "Reflects status moves instead of getting hit by them." + }, + "sapSipper": { + "name": "Sap Sipper", + "description": "Boosts the Attack stat if hit by a Grass-type move instead of taking damage." + }, + "prankster": { + "name": "Prankster", + "description": "Gives priority to a status move." + }, + "sandForce": { + "name": "Sand Force", + "description": "Boosts the power of Rock-, Ground-, and Steel-type moves in a sandstorm." + }, + "ironBarbs": { + "name": "Iron Barbs", + "description": "Inflicts damage on the attacker upon contact with iron barbs." + }, + "zenMode": { + "name": "Zen Mode", + "description": "Changes the Pokémon's shape when HP is half or less." + }, + "victoryStar": { + "name": "Victory Star", + "description": "Boosts the accuracy of its allies and itself." + }, + "turboblaze": { + "name": "Turboblaze", + "description": "Moves can be used on the target regardless of its Abilities." + }, + "teravolt": { + "name": "Teravolt", + "description": "Moves can be used on the target regardless of its Abilities." + }, + "aromaVeil": { + "name": "Aroma Veil", + "description": "Protects itself and its allies from attacks that limit their move choices." + }, + "flowerVeil": { + "name": "Flower Veil", + "description": "Ally Grass-type Pokémon are protected from status conditions and the lowering of their stats." + }, + "cheekPouch": { + "name": "Cheek Pouch", + "description": "Restores HP as well when the Pokémon eats a Berry." + }, + "protean": { + "name": "Protean", + "description": "Changes the Pokémon's type to the type of the move it's about to use." + }, + "furCoat": { + "name": "Fur Coat", + "description": "Halves the damage from physical moves." + }, + "magician": { + "name": "Magician", + "description": "The Pokémon steals the held item of a Pokémon it hits with a move." + }, + "bulletproof": { + "name": "Bulletproof", + "description": "Protects the Pokémon from some ball and bomb moves." + }, + "competitive": { + "name": "Competitive", + "description": "Boosts the Sp. Atk stat sharply when a stat is lowered." + }, + "strongJaw": { + "name": "Strong Jaw", + "description": "The Pokémon's strong jaw boosts the power of its biting moves." + }, + "refrigerate": { + "name": "Refrigerate", + "description": "Normal-type moves become Ice-type moves. The power of those moves is boosted a little." + }, + "sweetVeil": { + "name": "Sweet Veil", + "description": "Prevents itself and ally Pokémon from falling asleep." + }, + "stanceChange": { + "name": "Stance Change", + "description": "The Pokémon changes its form to Blade Forme when it uses an attack move and changes to Shield Forme when it uses King's Shield." + }, + "galeWings": { + "name": "Gale Wings", + "description": "Gives priority to Flying-type moves when the Pokémon's HP is full." + }, + "megaLauncher": { + "name": "Mega Launcher", + "description": "Powers up aura and pulse moves." + }, + "grassPelt": { + "name": "Grass Pelt", + "description": "Boosts the Pokémon's Defense stat on Grassy Terrain." + }, + "symbiosis": { + "name": "Symbiosis", + "description": "The Pokémon passes its item to an ally that has used up an item." + }, + "toughClaws": { + "name": "Tough Claws", + "description": "Powers up moves that make direct contact." + }, + "pixilate": { + "name": "Pixilate", + "description": "Normal-type moves become Fairy-type moves. The power of those moves is boosted a little." + }, + "gooey": { + "name": "Gooey", + "description": "Contact with the Pokémon lowers the attacker's Speed stat." + }, + "aerilate": { + "name": "Aerilate", + "description": "Normal-type moves become Flying-type moves. The power of those moves is boosted a little." + }, + "parentalBond": { + "name": "Parental Bond", + "description": "Parent and child each attacks." + }, + "darkAura": { + "name": "Dark Aura", + "description": "Powers up each Pokémon's Dark-type moves." + }, + "fairyAura": { + "name": "Fairy Aura", + "description": "Powers up each Pokémon's Fairy-type moves." + }, + "auraBreak": { + "name": "Aura Break", + "description": "The effects of \"Aura\" Abilities are reversed to lower the power of affected moves." + }, + "primordialSea": { + "name": "Primordial Sea", + "description": "The Pokémon changes the weather to nullify Fire-type attacks." + }, + "desolateLand": { + "name": "Desolate Land", + "description": "The Pokémon changes the weather to nullify Water-type attacks." + }, + "deltaStream": { + "name": "Delta Stream", + "description": "The Pokémon changes the weather to eliminate all of the Flying type's weaknesses." + }, + "stamina": { + "name": "Stamina", + "description": "Boosts the Defense stat when hit by an attack." + }, + "wimpOut": { + "name": "Wimp Out", + "description": "The Pokémon cowardly switches out when its HP becomes half or less." + }, + "emergencyExit": { + "name": "Emergency Exit", + "description": "The Pokémon, sensing danger, switches out when its HP becomes half or less." + }, + "waterCompaction": { + "name": "Water Compaction", + "description": "Boosts the Pokémon's Defense stat sharply when hit by a Water-type move." + }, + "merciless": { + "name": "Merciless", + "description": "The Pokémon's attacks become critical hits if the target is poisoned." + }, + "shieldsDown": { + "name": "Shields Down", + "description": "When its HP becomes half or less, the Pokémon's shell breaks and it becomes aggressive." + }, + "stakeout": { + "name": "Stakeout", + "description": "Doubles the damage dealt to the target's replacement if the target switches out." + }, + "waterBubble": { + "name": "Water Bubble", + "description": "Lowers the power of Fire-type moves done to the Pokémon and prevents the Pokémon from getting a burn." + }, + "steelworker": { + "name": "Steelworker", + "description": "Powers up Steel-type moves." + }, + "berserk": { + "name": "Berserk", + "description": "Boosts the Pokémon's Sp. Atk stat when it takes a hit that causes its HP to become half or less." + }, + "slushRush": { + "name": "Slush Rush", + "description": "Boosts the Pokémon's Speed stat in snow." + }, + "longReach": { + "name": "Long Reach", + "description": "The Pokémon uses its moves without making contact with the target." + }, + "liquidVoice": { + "name": "Liquid Voice", + "description": "All sound-based moves become Water-type moves." + }, + "triage": { + "name": "Triage", + "description": "Gives priority to a healing move." + }, + "galvanize": { + "name": "Galvanize", + "description": "Normal-type moves become Electric-type moves. The power of those moves is boosted a little." + }, + "surgeSurfer": { + "name": "Surge Surfer", + "description": "Doubles the Pokémon's Speed stat on Electric Terrain." + }, + "schooling": { + "name": "Schooling", + "description": "When it has a lot of HP, the Pokémon forms a powerful school. It stops schooling when its HP is low." + }, + "disguise": { + "name": "Disguise", + "description": "Once per battle, the shroud that covers the Pokémon can protect it from an attack." + }, + "battleBond": { + "name": "Battle Bond", + "description": "Defeating an opposing Pokémon strengthens the Pokémon's bond with its Trainer, and it becomes Ash-Greninja. Water Shuriken gets more powerful." + }, + "powerConstruct": { + "name": "Power Construct", + "description": "Other Cells gather to aid when its HP becomes half or less. Then the Pokémon changes its form to Complete Forme." + }, + "corrosion": { + "name": "Corrosion", + "description": "The Pokémon can poison the target even if it's a Steel or Poison type." + }, + "comatose": { + "name": "Comatose", + "description": "It's always drowsing and will never wake up. It can attack without waking up." + }, + "queenlyMajesty": { + "name": "Queenly Majesty", + "description": "Its majesty pressures the opposing Pokémon, making it unable to attack using priority moves." + }, + "innardsOut": { + "name": "Innards Out", + "description": "Damages the attacker landing the finishing hit by the amount equal to its last HP." + }, + "dancer": { + "name": "Dancer", + "description": "When another Pokémon uses a dance move, it can use a dance move following it regardless of its Speed." + }, + "battery": { + "name": "Battery", + "description": "Powers up ally Pokémon's special moves." + }, + "fluffy": { + "name": "Fluffy", + "description": "Halves the damage taken from moves that make direct contact, but doubles that of Fire-type moves." + }, + "dazzling": { + "name": "Dazzling", + "description": "Surprises the opposing Pokémon, making it unable to attack using priority moves." + }, + "soulHeart": { + "name": "Soul-Heart", + "description": "Boosts its Sp. Atk stat every time a Pokémon faints." + }, + "tanglingHair": { + "name": "Tangling Hair", + "description": "Contact with the Pokémon lowers the attacker's Speed stat." + }, + "receiver": { + "name": "Receiver", + "description": "The Pokémon copies the Ability of a defeated ally." + }, + "powerOfAlchemy": { + "name": "Power of Alchemy", + "description": "The Pokémon copies the Ability of a defeated ally." + }, + "beastBoost": { + "name": "Beast Boost", + "description": "The Pokémon boosts its most proficient stat each time it knocks out a Pokémon." + }, + "rksSystem": { + "name": "RKS System", + "description": "Changes the Pokémon's type to match the memory disc it holds." + }, + "electricSurge": { + "name": "Electric Surge", + "description": "Turns the ground into Electric Terrain when the Pokémon enters a battle." + }, + "psychicSurge": { + "name": "Psychic Surge", + "description": "Turns the ground into Psychic Terrain when the Pokémon enters a battle." + }, + "mistySurge": { + "name": "Misty Surge", + "description": "Turns the ground into Misty Terrain when the Pokémon enters a battle." + }, + "grassySurge": { + "name": "Grassy Surge", + "description": "Turns the ground into Grassy Terrain when the Pokémon enters a battle." + }, + "fullMetalBody": { + "name": "Full Metal Body", + "description": "Prevents other Pokémon's moves or Abilities from lowering the Pokémon's stats." + }, + "shadowShield": { + "name": "Shadow Shield", + "description": "Reduces the amount of damage the Pokémon takes while its HP is full." + }, + "prismArmor": { + "name": "Prism Armor", + "description": "Reduces the power of supereffective attacks taken." + }, + "neuroforce": { + "name": "Neuroforce", + "description": "Powers up moves that are super effective." + }, + "intrepidSword": { + "name": "Intrepid Sword", + "description": "Boosts the Pokémon's Attack stat when the Pokémon enters a battle." + }, + "dauntlessShield": { + "name": "Dauntless Shield", + "description": "Boosts the Pokémon's Defense stat when the Pokémon enters a battle." + }, + "libero": { + "name": "Libero", + "description": "Changes the Pokémon's type to the type of the move it's about to use." + }, + "ballFetch": { + "name": "Ball Fetch", + "description": "The Pokémon will fetch the Poké Ball from the first failed throw of the battle." + }, + "cottonDown": { + "name": "Cotton Down", + "description": "When the Pokémon is hit by an attack, it scatters cotton fluff around and lowers the Speed stat of all Pokémon except itself." + }, + "propellerTail": { + "name": "Propeller Tail", + "description": "Ignores the effects of opposing Pokémon's Abilities and moves that draw in moves." + }, + "mirrorArmor": { + "name": "Mirror Armor", + "description": "Bounces back only the stat-lowering effects that the Pokémon receives." + }, + "gulpMissile": { + "name": "Gulp Missile", + "description": "When the Pokémon uses Surf or Dive, it will come back with prey. When it takes damage, it will spit out the prey to attack." + }, + "stalwart": { + "name": "Stalwart", + "description": "Ignores the effects of opposing Pokémon's Abilities and moves that draw in moves." + }, + "steamEngine": { + "name": "Steam Engine", + "description": "Boosts the Pokémon's Speed stat drastically if hit by a Fire- or Water-type move." + }, + "punkRock": { + "name": "Punk Rock", + "description": "Boosts the power of sound-based moves. The Pokémon also takes half the damage from these kinds of moves." + }, + "sandSpit": { + "name": "Sand Spit", + "description": "The Pokémon creates a sandstorm when it's hit by an attack." + }, + "iceScales": { + "name": "Ice Scales", + "description": "The Pokémon is protected by ice scales, which halve the damage taken from special moves." + }, + "ripen": { + "name": "Ripen", + "description": "Ripens Berries and doubles their effect." + }, + "iceFace": { + "name": "Ice Face", + "description": "The Pokémon's ice head can take a physical attack as a substitute, but the attack also changes the Pokémon's appearance. The ice will be restored when it hails." + }, + "powerSpot": { + "name": "Power Spot", + "description": "Just being next to the Pokémon powers up moves." + }, + "mimicry": { + "name": "Mimicry", + "description": "Changes the Pokémon's type depending on the terrain." + }, + "screenCleaner": { + "name": "Screen Cleaner", + "description": "When the Pokémon enters a battle, the effects of Light Screen, Reflect, and Aurora Veil are nullified for both opposing and ally Pokémon." + }, + "steelySpirit": { + "name": "Steely Spirit", + "description": "Powers up ally Pokémon's Steel-type moves." + }, + "perishBody": { + "name": "Perish Body", + "description": "When hit by a move that makes direct contact, the Pokémon and the attacker will faint after three turns unless they switch out of battle." + }, + "wanderingSpirit": { + "name": "Wandering Spirit", + "description": "The Pokémon exchanges Abilities with a Pokémon that hits it with a move that makes direct contact." + }, + "gorillaTactics": { + "name": "Gorilla Tactics", + "description": "Boosts the Pokémon's Attack stat but only allows the use of the first selected move." + }, + "neutralizingGas": { + "name": "Neutralizing Gas", + "description": "If the Pokémon with Neutralizing Gas is in the battle, the effects of all Pokémon's Abilities will be nullified or will not be triggered." + }, + "pastelVeil": { + "name": "Pastel Veil", + "description": "Protects the Pokémon and its ally Pokémon from being poisoned." + }, + "hungerSwitch": { + "name": "Hunger Switch", + "description": "The Pokémon changes its form, alternating between its Full Belly Mode and Hangry Mode after the end of each turn." + }, + "quickDraw": { + "name": "Quick Draw", + "description": "Enables the Pokémon to move first occasionally." + }, + "unseenFist": { + "name": "Unseen Fist", + "description": "If the Pokémon uses moves that make direct contact, it can attack the target even if the target protects itself." + }, + "curiousMedicine": { + "name": "Curious Medicine", + "description": "When the Pokémon enters a battle, it scatters medicine from its shell, which removes all stat changes from allies." + }, + "transistor": { + "name": "Transistor", + "description": "Powers up Electric-type moves." + }, + "dragonsMaw": { + "name": "Dragon's Maw", + "description": "Powers up Dragon-type moves." + }, + "chillingNeigh": { + "name": "Chilling Neigh", + "description": "When the Pokémon knocks out a target, it utters a chilling neigh, which boosts its Attack stat." + }, + "grimNeigh": { + "name": "Grim Neigh", + "description": "When the Pokémon knocks out a target, it utters a terrifying neigh, which boosts its Sp. Atk stat." + }, + "asOneGlastrier": { + "name": "As One", + "description": "This Ability combines the effects of both Calyrex's Unnerve Ability and Glastrier's Chilling Neigh Ability." + }, + "asOneSpectrier": { + "name": "As One", + "description": "This Ability combines the effects of both Calyrex's Unnerve Ability and Spectrier's Grim Neigh Ability." + }, + "lingeringAroma": { + "name": "Lingering Aroma", + "description": "Contact with the Pokémon changes the attacker's Ability to Lingering Aroma." + }, + "seedSower": { + "name": "Seed Sower", + "description": "Turns the ground into Grassy Terrain when the Pokémon is hit by an attack." + }, + "thermalExchange": { + "name": "Thermal Exchange", + "description": "Boosts the Attack stat when the Pokémon is hit by a Fire-type move. The Pokémon also cannot be burned." + }, + "angerShell": { + "name": "Anger Shell", + "description": "When an attack causes its HP to drop to half or less, the Pokémon gets angry. This lowers its Defense and Sp. Def stats but boosts its Attack, Sp. Atk, and Speed stats." + }, + "purifyingSalt": { + "name": "Purifying Salt", + "description": "The Pokémon's pure salt protects it from status conditions and halves the damage taken from Ghost-type moves." + }, + "wellBakedBody": { + "name": "Well-Baked Body", + "description": "The Pokémon takes no damage when hit by Fire-type moves. Instead, its Defense stat is sharply boosted." + }, + "windRider": { + "name": "Wind Rider", + "description": "Boosts the Pokémon's Attack stat if Tailwind takes effect or if the Pokémon is hit by a wind move. The Pokémon also takes no damage from wind moves." + }, + "guardDog": { + "name": "Guard Dog", + "description": "Boosts the Pokémon's Attack stat if intimidated. Moves and items that would force the Pokémon to switch out also fail to work." + }, + "rockyPayload": { + "name": "Rocky Payload", + "description": "Powers up Rock-type moves." + }, + "windPower": { + "name": "Wind Power", + "description": "The Pokémon becomes charged when it is hit by a wind move, boosting the power of the next Electric-type move the Pokémon uses." + }, + "zeroToHero": { + "name": "Zero to Hero", + "description": "The Pokémon transforms into its Hero Form when it switches out." + }, + "commander": { + "name": "Commander", + "description": "When the Pokémon enters a battle, it goes inside the mouth of an ally Dondozo if one is on the field. The Pokémon then issues commands from there." + }, + "electromorphosis": { + "name": "Electromorphosis", + "description": "The Pokémon becomes charged when it takes damage, boosting the power of the next Electric-type move the Pokémon uses." + }, + "protosynthesis": { + "name": "Protosynthesis", + "description": "Boosts the Pokémon's most proficient stat in harsh sunlight or if the Pokémon is holding Booster Energy." + }, + "quarkDrive": { + "name": "Quark Drive", + "description": "Boosts the Pokémon's most proficient stat on Electric Terrain or if the Pokémon is holding Booster Energy." + }, + "goodAsGold": { + "name": "Good as Gold", + "description": "A body of pure, solid gold gives the Pokémon full immunity to other Pokémon's status moves." + }, + "vesselOfRuin": { + "name": "Vessel of Ruin", + "description": "The power of the Pokémon's ruinous vessel lowers the Sp. Atk stats of all Pokémon except itself." + }, + "swordOfRuin": { + "name": "Sword of Ruin", + "description": "The power of the Pokémon's ruinous sword lowers the Defense stats of all Pokémon except itself." + }, + "tabletsOfRuin": { + "name": "Tablets of Ruin", + "description": "The power of the Pokémon's ruinous wooden tablets lowers the Attack stats of all Pokémon except itself." + }, + "beadsOfRuin": { + "name": "Beads of Ruin", + "description": "The power of the Pokémon's ruinous beads lowers the Sp. Def stats of all Pokémon except itself." + }, + "orichalcumPulse": { + "name": "Orichalcum Pulse", + "description": "Turns the sunlight harsh when the Pokémon enters a battle. The ancient pulse thrumming through the Pokémon also boosts its Attack stat in harsh sunlight." + }, + "hadronEngine": { + "name": "Hadron Engine", + "description": "Turns the ground into Electric Terrain when the Pokémon enters a battle. The futuristic engine within the Pokémon also boosts its Sp. Atk stat on Electric Terrain." + }, + "opportunist": { + "name": "Opportunist", + "description": "If an opponent's stat is boosted, the Pokémon seizes the opportunity to boost the same stat for itself." + }, + "cudChew": { + "name": "Cud Chew", + "description": "When the Pokémon eats a Berry, it will regurgitate that Berry at the end of the next turn and eat it one more time." + }, + "sharpness": { + "name": "Sharpness", + "description": "Powers up slicing moves." + }, + "supremeOverlord": { + "name": "Supreme Overlord", + "description": "When the Pokémon enters a battle, its Attack and Sp. Atk stats are slightly boosted for each of the allies in its party that have already been defeated." + }, + "costar": { + "name": "Costar", + "description": "When the Pokémon enters a battle, it copies an ally's stat changes." + }, + "toxicDebris": { + "name": "Toxic Debris", + "description": "Scatters poison spikes at the feet of the opposing team when the Pokémon takes damage from physical moves." + }, + "armorTail": { + "name": "Armor Tail", + "description": "The mysterious tail covering the Pokémon's head makes opponents unable to use priority moves against the Pokémon or its allies." + }, + "earthEater": { + "name": "Earth Eater", + "description": "If hit by a Ground-type move, the Pokémon has its HP restored instead of taking damage." + }, + "myceliumMight": { + "name": "Mycelium Might", + "description": "The Pokémon will always act more slowly when using status moves, but these moves will be unimpeded by the Ability of the target." + }, + "mindsEye": { + "name": "Mind's Eye", + "description": "The Pokémon ignores changes to opponents' evasiveness, its accuracy can't be lowered, and it can hit Ghost types with Normal- and Fighting-type moves." + }, + "supersweetSyrup": { + "name": "Supersweet Syrup", + "description": "A sickly sweet scent spreads across the field the first time the Pokémon enters a battle, lowering the evasiveness of opposing Pokémon." + }, + "hospitality": { + "name": "Hospitality", + "description": "When the Pokémon enters a battle, it showers its ally with hospitality, restoring a small amount of the ally's HP." + }, + "toxicChain": { + "name": "Toxic Chain", + "description": "The power of the Pokémon's toxic chain may badly poison any target the Pokémon hits with a move." + }, + "embodyAspectTeal": { + "name": "Embody Aspect", + "description": "The Pokémon's heart fills with memories, causing the Teal Mask to shine and the Pokémon's Speed stat to be boosted." + }, + "embodyAspectWellspring": { + "name": "Embody Aspect", + "description": "The Pokémon's heart fills with memories, causing the Wellspring Mask to shine and the Pokémon's Sp. Def stat to be boosted." + }, + "embodyAspectHearthflame": { + "name": "Embody Aspect", + "description": "The Pokémon's heart fills with memories, causing the Hearthflame Mask to shine and the Pokémon's Attack stat to be boosted." + }, + "embodyAspectCornerstone": { + "name": "Embody Aspect", + "description": "The Pokémon's heart fills with memories, causing the Cornerstone Mask to shine and the Pokémon's Defense stat to be boosted." + }, + "teraShift": { + "name": "Tera Shift", + "description": "When the Pokémon enters a battle, it absorbs the energy around itself and transforms into its Terastal Form." + }, + "teraShell": { + "name": "Tera Shell", + "description": "The Pokémon's shell contains the powers of each type. All damage-dealing moves that hit the Pokémon when its HP is full will not be very effective." + }, + "teraformZero": { + "name": "Teraform Zero", + "description": "When Terapagos changes into its Stellar Form, it uses its hidden powers to eliminate all effects of weather and terrain, reducing them to zero." + }, + "poisonPuppeteer": { + "name": "Poison Puppeteer", + "description": "Pokémon poisoned by Pecharunt's moves will also become confused." + } +} \ No newline at end of file diff --git a/src/locales/en/ability.ts b/src/locales/en/ability.ts deleted file mode 100644 index 7e81f90afff..00000000000 --- a/src/locales/en/ability.ts +++ /dev/null @@ -1,1244 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -export const ability: AbilityTranslationEntries = { - stench: { - name: "Stench", - description: "By releasing stench when attacking, this Pokémon may cause the target to flinch.", - }, - drizzle: { - name: "Drizzle", - description: "The Pokémon makes it rain when it enters a battle.", - }, - speedBoost: { - name: "Speed Boost", - description: "Its Speed stat is boosted every turn.", - }, - battleArmor: { - name: "Battle Armor", - description: "Hard armor protects the Pokémon from critical hits.", - }, - sturdy: { - name: "Sturdy", - description: "It cannot be knocked out with one hit. One-hit KO moves cannot knock it out, either.", - }, - damp: { - name: "Damp", - description: "Prevents the use of explosive moves, such as Self-Destruct, by dampening its surroundings.", - }, - limber: { - name: "Limber", - description: "Its limber body protects the Pokémon from paralysis.", - }, - sandVeil: { - name: "Sand Veil", - description: "Boosts the Pokémon's evasiveness in a sandstorm.", - }, - static: { - name: "Static", - description: "The Pokémon is charged with static electricity, so contact with it may cause paralysis.", - }, - voltAbsorb: { - name: "Volt Absorb", - description: "Restores HP if hit by an Electric-type move instead of taking damage.", - }, - waterAbsorb: { - name: "Water Absorb", - description: "Restores HP if hit by a Water-type move instead of taking damage.", - }, - oblivious: { - name: "Oblivious", - description: "The Pokémon is oblivious, and that keeps it from being infatuated or falling for taunts.", - }, - cloudNine: { - name: "Cloud Nine", - description: "Eliminates the effects of weather.", - }, - compoundEyes: { - name: "Compound Eyes", - description: "The Pokémon's compound eyes boost its accuracy.", - }, - insomnia: { - name: "Insomnia", - description: "The Pokémon is suffering from insomnia and cannot fall asleep.", - }, - colorChange: { - name: "Color Change", - description: "The Pokémon's type becomes the type of the move used on it.", - }, - immunity: { - name: "Immunity", - description: "The immune system of the Pokémon prevents it from getting poisoned.", - }, - flashFire: { - name: "Flash Fire", - description: "Powers up the Pokémon's Fire-type moves if it's hit by one.", - }, - shieldDust: { - name: "Shield Dust", - description: "This Pokémon's dust blocks the additional effects of attacks taken.", - }, - ownTempo: { - name: "Own Tempo", - description: "This Pokémon has its own tempo, and that prevents it from becoming confused.", - }, - suctionCups: { - name: "Suction Cups", - description: "This Pokémon uses suction cups to stay in one spot to negate all moves and items that force switching out.", - }, - intimidate: { - name: "Intimidate", - description: "The Pokémon intimidates opposing Pokémon upon entering battle, lowering their Attack stat.", - }, - shadowTag: { - name: "Shadow Tag", - description: "This Pokémon steps on the opposing Pokémon's shadow to prevent it from escaping.", - }, - roughSkin: { - name: "Rough Skin", - description: "This Pokémon inflicts damage with its rough skin to the attacker on contact.", - }, - wonderGuard: { - name: "Wonder Guard", - description: "Its mysterious power only lets supereffective moves hit the Pokémon.", - }, - levitate: { - name: "Levitate", - description: "By floating in the air, the Pokémon receives full immunity to all Ground-type moves.", - }, - effectSpore: { - name: "Effect Spore", - description: "Contact with the Pokémon may inflict poison, sleep, or paralysis on its attacker.", - }, - synchronize: { - name: "Synchronize", - description: "The attacker will receive the same status condition if it inflicts a burn, poison, or paralysis to the Pokémon.", - }, - clearBody: { - name: "Clear Body", - description: "Prevents other Pokémon's moves or Abilities from lowering the Pokémon's stats.", - }, - naturalCure: { - name: "Natural Cure", - description: "All status conditions heal when the Pokémon switches out.", - }, - lightningRod: { - name: "Lightning Rod", - description: "The Pokémon draws in all Electric-type moves. Instead of being hit by Electric-type moves, it boosts its Sp. Atk.", - }, - sereneGrace: { - name: "Serene Grace", - description: "Boosts the likelihood of additional effects occurring when attacking.", - }, - swiftSwim: { - name: "Swift Swim", - description: "Boosts the Pokémon's Speed stat in rain.", - }, - chlorophyll: { - name: "Chlorophyll", - description: "Boosts the Pokémon's Speed stat in harsh sunlight.", - }, - illuminate: { - name: "Illuminate", - description: "By illuminating its surroundings, the Pokémon raises the likelihood of meeting wild Pokémon and prevents its accuracy from being lowered.", - }, - trace: { - name: "Trace", - description: "When it enters a battle, the Pokémon copies an opposing Pokémon's Ability.", - }, - hugePower: { - name: "Huge Power", - description: "Doubles the Pokémon's Attack stat.", - }, - poisonPoint: { - name: "Poison Point", - description: "Contact with the Pokémon may poison the attacker.", - }, - innerFocus: { - name: "Inner Focus", - description: "The Pokémon's intensely focused, and that protects the Pokémon from flinching.", - }, - magmaArmor: { - name: "Magma Armor", - description: "The Pokémon is covered with hot magma, which prevents the Pokémon from becoming frozen.", - }, - waterVeil: { - name: "Water Veil", - description: "The Pokémon is covered with a water veil, which prevents the Pokémon from getting a burn.", - }, - magnetPull: { - name: "Magnet Pull", - description: "Prevents Steel-type Pokémon from escaping using its magnetic force.", - }, - soundproof: { - name: "Soundproof", - description: "Soundproofing gives the Pokémon full immunity to all sound-based moves.", - }, - rainDish: { - name: "Rain Dish", - description: "The Pokémon gradually regains HP in rain.", - }, - sandStream: { - name: "Sand Stream", - description: "The Pokémon summons a sandstorm when it enters a battle.", - }, - pressure: { - name: "Pressure", - description: "By putting pressure on the opposing Pokémon, it raises their PP usage.", - }, - thickFat: { - name: "Thick Fat", - description: "The Pokémon is protected by a layer of thick fat, which halves the damage taken from Fire- and Ice-type moves.", - }, - earlyBird: { - name: "Early Bird", - description: "The Pokémon awakens from sleep twice as fast as other Pokémon.", - }, - flameBody: { - name: "Flame Body", - description: "Contact with the Pokémon may burn the attacker.", - }, - runAway: { - name: "Run Away", - description: "Enables a sure getaway from wild Pokémon.", - }, - keenEye: { - name: "Keen Eye", - description: "Keen eyes prevent other Pokémon from lowering this Pokémon's accuracy.", - }, - hyperCutter: { - name: "Hyper Cutter", - description: "The Pokémon's proud of its powerful pincers. They prevent other Pokémon from lowering its Attack stat.", - }, - pickup: { - name: "Pickup", - description: "The Pokémon may pick up the item an opposing Pokémon held during a battle.", - }, - truant: { - name: "Truant", - description: "The Pokémon can't use a move if it had used a move on the previous turn.", - }, - hustle: { - name: "Hustle", - description: "Boosts the Attack stat, but lowers accuracy.", - }, - cuteCharm: { - name: "Cute Charm", - description: "Contact with the Pokémon may cause infatuation.", - }, - plus: { - name: "Plus", - description: "Boosts the Sp. Atk stat of the Pokémon if an ally with the Plus or Minus Ability is also in battle.", - }, - minus: { - name: "Minus", - description: "Boosts the Sp. Atk stat of the Pokémon if an ally with the Plus or Minus Ability is also in battle.", - }, - forecast: { - name: "Forecast", - description: "The Pokémon transforms with the weather to change its type to Water, Fire, or Ice.", - }, - stickyHold: { - name: "Sticky Hold", - description: "Items held by the Pokémon are stuck fast and cannot be removed by other Pokémon.", - }, - shedSkin: { - name: "Shed Skin", - description: "The Pokémon may heal its own status conditions by shedding its skin.", - }, - guts: { - name: "Guts", - description: "It's so gutsy that having a status condition boosts the Pokémon's Attack stat.", - }, - marvelScale: { - name: "Marvel Scale", - description: "The Pokémon's marvelous scales boost the Defense stat if it has a status condition.", - }, - liquidOoze: { - name: "Liquid Ooze", - description: "The oozed liquid has a strong stench, which damages attackers using any draining move.", - }, - overgrow: { - name: "Overgrow", - description: "Powers up Grass-type moves when the Pokémon's HP is low.", - }, - blaze: { - name: "Blaze", - description: "Powers up Fire-type moves when the Pokémon's HP is low.", - }, - torrent: { - name: "Torrent", - description: "Powers up Water-type moves when the Pokémon's HP is low.", - }, - swarm: { - name: "Swarm", - description: "Powers up Bug-type moves when the Pokémon's HP is low.", - }, - rockHead: { - name: "Rock Head", - description: "Protects the Pokémon from recoil damage.", - }, - drought: { - name: "Drought", - description: "Turns the sunlight harsh when the Pokémon enters a battle.", - }, - arenaTrap: { - name: "Arena Trap", - description: "Prevents opposing Pokémon from fleeing.", - }, - vitalSpirit: { - name: "Vital Spirit", - description: "The Pokémon is full of vitality, and that prevents it from falling asleep.", - }, - whiteSmoke: { - name: "White Smoke", - description: "The Pokémon is protected by its white smoke, which prevents other Pokémon from lowering its stats.", - }, - purePower: { - name: "Pure Power", - description: "Using its pure power, the Pokémon doubles its Attack stat.", - }, - shellArmor: { - name: "Shell Armor", - description: "A hard shell protects the Pokémon from critical hits.", - }, - airLock: { - name: "Air Lock", - description: "Eliminates the effects of weather.", - }, - tangledFeet: { - name: "Tangled Feet", - description: "Raises evasiveness if the Pokémon is confused.", - }, - motorDrive: { - name: "Motor Drive", - description: "Boosts its Speed stat if hit by an Electric-type move instead of taking damage.", - }, - rivalry: { - name: "Rivalry", - description: "Becomes competitive and deals more damage to Pokémon of the same gender, but deals less to Pokémon of the opposite gender.", - }, - steadfast: { - name: "Steadfast", - description: "The Pokémon's determination boosts the Speed stat each time the Pokémon flinches.", - }, - snowCloak: { - name: "Snow Cloak", - description: "Boosts the Pokémon's evasiveness in snow.", - }, - gluttony: { - name: "Gluttony", - description: "Makes the Pokémon eat a held Berry when its HP drops to half or less, which is sooner than usual.", - }, - angerPoint: { - name: "Anger Point", - description: "The Pokémon is angered when it takes a critical hit, and that maxes its Attack stat.", - }, - unburden: { - name: "Unburden", - description: "Boosts the Speed stat if the Pokémon's held item is used or lost.", - }, - heatproof: { - name: "Heatproof", - description: "The heatproof body of the Pokémon halves the damage from Fire-type moves that hit it.", - }, - simple: { - name: "Simple", - description: "The stat changes the Pokémon receives are doubled.", - }, - drySkin: { - name: "Dry Skin", - description: "Restores HP in rain or when hit by Water-type moves. Reduces HP in harsh sunlight, and increases the damage received from Fire-type moves.", - }, - download: { - name: "Download", - description: "Compares an opposing Pokémon's Defense and Sp. Def stats before raising its own Attack or Sp. Atk stat—whichever will be more effective.", - }, - ironFist: { - name: "Iron Fist", - description: "Powers up punching moves.", - }, - poisonHeal: { - name: "Poison Heal", - description: "Restores HP if the Pokémon is poisoned instead of losing HP.", - }, - adaptability: { - name: "Adaptability", - description: "Powers up moves of the same type as the Pokémon.", - }, - skillLink: { - name: "Skill Link", - description: "Maximizes the number of times multistrike moves hit.", - }, - hydration: { - name: "Hydration", - description: "Heals status conditions if it's raining.", - }, - solarPower: { - name: "Solar Power", - description: "Boosts the Sp. Atk stat in harsh sunlight, but HP decreases every turn.", - }, - quickFeet: { - name: "Quick Feet", - description: "Boosts the Speed stat if the Pokémon has a status condition.", - }, - normalize: { - name: "Normalize", - description: "All the Pokémon's moves become Normal type. The power of those moves is boosted a little.", - }, - sniper: { - name: "Sniper", - description: "Powers up moves if they become critical hits when attacking.", - }, - magicGuard: { - name: "Magic Guard", - description: "The Pokémon only takes damage from attacks.", - }, - noGuard: { - name: "No Guard", - description: "The Pokémon employs no-guard tactics to ensure incoming and outgoing attacks always land.", - }, - stall: { - name: "Stall", - description: "The Pokémon moves after all other Pokémon do.", - }, - technician: { - name: "Technician", - description: "Powers up the Pokémon's weaker moves.", - }, - leafGuard: { - name: "Leaf Guard", - description: "Prevents status conditions in harsh sunlight.", - }, - klutz: { - name: "Klutz", - description: "The Pokémon can't use any held items.", - }, - moldBreaker: { - name: "Mold Breaker", - description: "Moves can be used on the target regardless of its Abilities.", - }, - superLuck: { - name: "Super Luck", - description: "The Pokémon is so lucky that the critical-hit ratios of its moves are boosted.", - }, - aftermath: { - name: "Aftermath", - description: "Damages the attacker if it contacts the Pokémon with a finishing hit.", - }, - anticipation: { - name: "Anticipation", - description: "The Pokémon can sense an opposing Pokémon's dangerous moves.", - }, - forewarn: { - name: "Forewarn", - description: "When it enters a battle, the Pokémon can tell one of the moves an opposing Pokémon has.", - }, - unaware: { - name: "Unaware", - description: "When attacking, the Pokémon ignores the target Pokémon's stat changes.", - }, - tintedLens: { - name: "Tinted Lens", - description: "The Pokémon can use \"not very effective\" moves to deal regular damage.", - }, - filter: { - name: "Filter", - description: "Reduces the power of supereffective attacks taken.", - }, - slowStart: { - name: "Slow Start", - description: "For five turns, the Pokémon's Attack and Speed stats are halved.", - }, - scrappy: { - name: "Scrappy", - description: "The Pokémon can hit Ghost-type Pokémon with Normal- and Fighting-type moves.", - }, - stormDrain: { - name: "Storm Drain", - description: "Draws in all Water-type moves. Instead of being hit by Water-type moves, it boosts its Sp. Atk.", - }, - iceBody: { - name: "Ice Body", - description: "The Pokémon gradually regains HP in snow.", - }, - solidRock: { - name: "Solid Rock", - description: "Reduces the power of supereffective attacks taken.", - }, - snowWarning: { - name: "Snow Warning", - description: "The Pokémon makes it snow when it enters a battle.", - }, - honeyGather: { - name: "Honey Gather", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", - }, - frisk: { - name: "Frisk", - description: "When it enters a battle, the Pokémon can check an opposing Pokémon's Ability.", - }, - reckless: { - name: "Reckless", - description: "Powers up moves that have recoil damage.", - }, - multitype: { - name: "Multitype", - description: "Changes the Pokémon's type to match the Plate or Z-Crystal it holds.", - }, - flowerGift: { - name: "Flower Gift", - description: "Boosts the Attack and Sp. Def stats of itself and allies in harsh sunlight.", - }, - badDreams: { - name: "Bad Dreams", - description: "Reduces the HP of sleeping opposing Pokémon.", - }, - pickpocket: { - name: "Pickpocket", - description: "Steals an item from an attacker that made direct contact.", - }, - sheerForce: { - name: "Sheer Force", - description: "Removes additional effects to increase the power of moves when attacking.", - }, - contrary: { - name: "Contrary", - description: "Makes stat changes have an opposite effect.", - }, - unnerve: { - name: "Unnerve", - description: "Unnerves opposing Pokémon and makes them unable to eat Berries.", - }, - defiant: { - name: "Defiant", - description: "Boosts the Pokémon's Attack stat sharply when its stats are lowered.", - }, - defeatist: { - name: "Defeatist", - description: "Halves the Pokémon's Attack and Sp. Atk stats when its HP becomes half or less.", - }, - cursedBody: { - name: "Cursed Body", - description: "May disable a move used on the Pokémon.", - }, - healer: { - name: "Healer", - description: "Sometimes heals an ally's status condition.", - }, - friendGuard: { - name: "Friend Guard", - description: "Reduces damage done to allies.", - }, - weakArmor: { - name: "Weak Armor", - description: "Physical attacks to the Pokémon lower its Defense stat but sharply raise its Speed stat.", - }, - heavyMetal: { - name: "Heavy Metal", - description: "Doubles the Pokémon's weight.", - }, - lightMetal: { - name: "Light Metal", - description: "Halves the Pokémon's weight.", - }, - multiscale: { - name: "Multiscale", - description: "Reduces the amount of damage the Pokémon takes while its HP is full.", - }, - toxicBoost: { - name: "Toxic Boost", - description: "Powers up physical attacks when the Pokémon is poisoned.", - }, - flareBoost: { - name: "Flare Boost", - description: "Powers up special attacks when the Pokémon is burned.", - }, - harvest: { - name: "Harvest", - description: "May create another Berry after one is used.", - }, - telepathy: { - name: "Telepathy", - description: "Anticipates an ally's attack and dodges it.", - }, - moody: { - name: "Moody", - description: "Raises one stat sharply and lowers another every turn.", - }, - overcoat: { - name: "Overcoat", - description: "Protects the Pokémon from things like sand, hail, and powder.", - }, - poisonTouch: { - name: "Poison Touch", - description: "May poison a target when the Pokémon makes contact.", - }, - regenerator: { - name: "Regenerator", - description: "Restores a little HP when withdrawn from battle.", - }, - bigPecks: { - name: "Big Pecks", - description: "Protects the Pokémon from Defense-lowering effects.", - }, - sandRush: { - name: "Sand Rush", - description: "Boosts the Pokémon's Speed stat in a sandstorm.", - }, - wonderSkin: { - name: "Wonder Skin", - description: "Makes status moves more likely to miss.", - }, - analytic: { - name: "Analytic", - description: "Boosts move power when the Pokémon moves last.", - }, - illusion: { - name: "Illusion", - description: "Comes out disguised as the Pokémon in the party's last spot.", - }, - imposter: { - name: "Imposter", - description: "The Pokémon transforms itself into the Pokémon it's facing.", - }, - infiltrator: { - name: "Infiltrator", - description: "Passes through the opposing Pokémon's barrier, substitute, and the like and strikes.", - }, - mummy: { - name: "Mummy", - description: "Contact with the Pokémon changes the attacker's Ability to Mummy.", - }, - moxie: { - name: "Moxie", - description: "The Pokémon shows moxie, and that boosts the Attack stat after knocking out any Pokémon.", - }, - justified: { - name: "Justified", - description: "Being hit by a Dark-type move boosts the Attack stat of the Pokémon, for justice.", - }, - rattled: { - name: "Rattled", - description: "Intimidate or being hit by a Dark-, Ghost-, or Bug-type move will scare the Pokémon and boost its Speed stat.", - }, - magicBounce: { - name: "Magic Bounce", - description: "Reflects status moves instead of getting hit by them.", - }, - sapSipper: { - name: "Sap Sipper", - description: "Boosts the Attack stat if hit by a Grass-type move instead of taking damage.", - }, - prankster: { - name: "Prankster", - description: "Gives priority to a status move.", - }, - sandForce: { - name: "Sand Force", - description: "Boosts the power of Rock-, Ground-, and Steel-type moves in a sandstorm.", - }, - ironBarbs: { - name: "Iron Barbs", - description: "Inflicts damage on the attacker upon contact with iron barbs.", - }, - zenMode: { - name: "Zen Mode", - description: "Changes the Pokémon's shape when HP is half or less.", - }, - victoryStar: { - name: "Victory Star", - description: "Boosts the accuracy of its allies and itself.", - }, - turboblaze: { - name: "Turboblaze", - description: "Moves can be used on the target regardless of its Abilities.", - }, - teravolt: { - name: "Teravolt", - description: "Moves can be used on the target regardless of its Abilities.", - }, - aromaVeil: { - name: "Aroma Veil", - description: "Protects itself and its allies from attacks that limit their move choices.", - }, - flowerVeil: { - name: "Flower Veil", - description: "Ally Grass-type Pokémon are protected from status conditions and the lowering of their stats.", - }, - cheekPouch: { - name: "Cheek Pouch", - description: "Restores HP as well when the Pokémon eats a Berry.", - }, - protean: { - name: "Protean", - description: "Changes the Pokémon's type to the type of the move it's about to use.", - }, - furCoat: { - name: "Fur Coat", - description: "Halves the damage from physical moves.", - }, - magician: { - name: "Magician", - description: "The Pokémon steals the held item of a Pokémon it hits with a move.", - }, - bulletproof: { - name: "Bulletproof", - description: "Protects the Pokémon from some ball and bomb moves.", - }, - competitive: { - name: "Competitive", - description: "Boosts the Sp. Atk stat sharply when a stat is lowered.", - }, - strongJaw: { - name: "Strong Jaw", - description: "The Pokémon's strong jaw boosts the power of its biting moves.", - }, - refrigerate: { - name: "Refrigerate", - description: "Normal-type moves become Ice-type moves. The power of those moves is boosted a little.", - }, - sweetVeil: { - name: "Sweet Veil", - description: "Prevents itself and ally Pokémon from falling asleep.", - }, - stanceChange: { - name: "Stance Change", - description: "The Pokémon changes its form to Blade Forme when it uses an attack move and changes to Shield Forme when it uses King's Shield.", - }, - galeWings: { - name: "Gale Wings", - description: "Gives priority to Flying-type moves when the Pokémon's HP is full.", - }, - megaLauncher: { - name: "Mega Launcher", - description: "Powers up aura and pulse moves.", - }, - grassPelt: { - name: "Grass Pelt", - description: "Boosts the Pokémon's Defense stat on Grassy Terrain.", - }, - symbiosis: { - name: "Symbiosis", - description: "The Pokémon passes its item to an ally that has used up an item.", - }, - toughClaws: { - name: "Tough Claws", - description: "Powers up moves that make direct contact.", - }, - pixilate: { - name: "Pixilate", - description: "Normal-type moves become Fairy-type moves. The power of those moves is boosted a little.", - }, - gooey: { - name: "Gooey", - description: "Contact with the Pokémon lowers the attacker's Speed stat.", - }, - aerilate: { - name: "Aerilate", - description: "Normal-type moves become Flying-type moves. The power of those moves is boosted a little.", - }, - parentalBond: { - name: "Parental Bond", - description: "Parent and child each attacks.", - }, - darkAura: { - name: "Dark Aura", - description: "Powers up each Pokémon's Dark-type moves.", - }, - fairyAura: { - name: "Fairy Aura", - description: "Powers up each Pokémon's Fairy-type moves.", - }, - auraBreak: { - name: "Aura Break", - description: "The effects of \"Aura\" Abilities are reversed to lower the power of affected moves.", - }, - primordialSea: { - name: "Primordial Sea", - description: "The Pokémon changes the weather to nullify Fire-type attacks.", - }, - desolateLand: { - name: "Desolate Land", - description: "The Pokémon changes the weather to nullify Water-type attacks.", - }, - deltaStream: { - name: "Delta Stream", - description: "The Pokémon changes the weather to eliminate all of the Flying type's weaknesses.", - }, - stamina: { - name: "Stamina", - description: "Boosts the Defense stat when hit by an attack.", - }, - wimpOut: { - name: "Wimp Out", - description: "The Pokémon cowardly switches out when its HP becomes half or less.", - }, - emergencyExit: { - name: "Emergency Exit", - description: "The Pokémon, sensing danger, switches out when its HP becomes half or less.", - }, - waterCompaction: { - name: "Water Compaction", - description: "Boosts the Pokémon's Defense stat sharply when hit by a Water-type move.", - }, - merciless: { - name: "Merciless", - description: "The Pokémon's attacks become critical hits if the target is poisoned.", - }, - shieldsDown: { - name: "Shields Down", - description: "When its HP becomes half or less, the Pokémon's shell breaks and it becomes aggressive.", - }, - stakeout: { - name: "Stakeout", - description: "Doubles the damage dealt to the target's replacement if the target switches out.", - }, - waterBubble: { - name: "Water Bubble", - description: "Lowers the power of Fire-type moves done to the Pokémon and prevents the Pokémon from getting a burn.", - }, - steelworker: { - name: "Steelworker", - description: "Powers up Steel-type moves.", - }, - berserk: { - name: "Berserk", - description: "Boosts the Pokémon's Sp. Atk stat when it takes a hit that causes its HP to become half or less.", - }, - slushRush: { - name: "Slush Rush", - description: "Boosts the Pokémon's Speed stat in snow.", - }, - longReach: { - name: "Long Reach", - description: "The Pokémon uses its moves without making contact with the target.", - }, - liquidVoice: { - name: "Liquid Voice", - description: "All sound-based moves become Water-type moves.", - }, - triage: { - name: "Triage", - description: "Gives priority to a healing move.", - }, - galvanize: { - name: "Galvanize", - description: "Normal-type moves become Electric-type moves. The power of those moves is boosted a little.", - }, - surgeSurfer: { - name: "Surge Surfer", - description: "Doubles the Pokémon's Speed stat on Electric Terrain.", - }, - schooling: { - name: "Schooling", - description: "When it has a lot of HP, the Pokémon forms a powerful school. It stops schooling when its HP is low.", - }, - disguise: { - name: "Disguise", - description: "Once per battle, the shroud that covers the Pokémon can protect it from an attack.", - }, - battleBond: { - name: "Battle Bond", - description: "Defeating an opposing Pokémon strengthens the Pokémon's bond with its Trainer, and it becomes Ash-Greninja. Water Shuriken gets more powerful.", - }, - powerConstruct: { - name: "Power Construct", - description: "Other Cells gather to aid when its HP becomes half or less. Then the Pokémon changes its form to Complete Forme.", - }, - corrosion: { - name: "Corrosion", - description: "The Pokémon can poison the target even if it's a Steel or Poison type.", - }, - comatose: { - name: "Comatose", - description: "It's always drowsing and will never wake up. It can attack without waking up.", - }, - queenlyMajesty: { - name: "Queenly Majesty", - description: "Its majesty pressures the opposing Pokémon, making it unable to attack using priority moves.", - }, - innardsOut: { - name: "Innards Out", - description: "Damages the attacker landing the finishing hit by the amount equal to its last HP.", - }, - dancer: { - name: "Dancer", - description: "When another Pokémon uses a dance move, it can use a dance move following it regardless of its Speed.", - }, - battery: { - name: "Battery", - description: "Powers up ally Pokémon's special moves.", - }, - fluffy: { - name: "Fluffy", - description: "Halves the damage taken from moves that make direct contact, but doubles that of Fire-type moves.", - }, - dazzling: { - name: "Dazzling", - description: "Surprises the opposing Pokémon, making it unable to attack using priority moves.", - }, - soulHeart: { - name: "Soul-Heart", - description: "Boosts its Sp. Atk stat every time a Pokémon faints.", - }, - tanglingHair: { - name: "Tangling Hair", - description: "Contact with the Pokémon lowers the attacker's Speed stat.", - }, - receiver: { - name: "Receiver", - description: "The Pokémon copies the Ability of a defeated ally.", - }, - powerOfAlchemy: { - name: "Power of Alchemy", - description: "The Pokémon copies the Ability of a defeated ally.", - }, - beastBoost: { - name: "Beast Boost", - description: "The Pokémon boosts its most proficient stat each time it knocks out a Pokémon.", - }, - rksSystem: { - name: "RKS System", - description: "Changes the Pokémon's type to match the memory disc it holds.", - }, - electricSurge: { - name: "Electric Surge", - description: "Turns the ground into Electric Terrain when the Pokémon enters a battle.", - }, - psychicSurge: { - name: "Psychic Surge", - description: "Turns the ground into Psychic Terrain when the Pokémon enters a battle.", - }, - mistySurge: { - name: "Misty Surge", - description: "Turns the ground into Misty Terrain when the Pokémon enters a battle.", - }, - grassySurge: { - name: "Grassy Surge", - description: "Turns the ground into Grassy Terrain when the Pokémon enters a battle.", - }, - fullMetalBody: { - name: "Full Metal Body", - description: "Prevents other Pokémon's moves or Abilities from lowering the Pokémon's stats.", - }, - shadowShield: { - name: "Shadow Shield", - description: "Reduces the amount of damage the Pokémon takes while its HP is full.", - }, - prismArmor: { - name: "Prism Armor", - description: "Reduces the power of supereffective attacks taken.", - }, - neuroforce: { - name: "Neuroforce", - description: "Powers up moves that are super effective.", - }, - intrepidSword: { - name: "Intrepid Sword", - description: "Boosts the Pokémon's Attack stat when the Pokémon enters a battle.", - }, - dauntlessShield: { - name: "Dauntless Shield", - description: "Boosts the Pokémon's Defense stat when the Pokémon enters a battle.", - }, - libero: { - name: "Libero", - description: "Changes the Pokémon's type to the type of the move it's about to use.", - }, - ballFetch: { - name: "Ball Fetch", - description: "The Pokémon will fetch the Poké Ball from the first failed throw of the battle.", - }, - cottonDown: { - name: "Cotton Down", - description: "When the Pokémon is hit by an attack, it scatters cotton fluff around and lowers the Speed stat of all Pokémon except itself.", - }, - propellerTail: { - name: "Propeller Tail", - description: "Ignores the effects of opposing Pokémon's Abilities and moves that draw in moves.", - }, - mirrorArmor: { - name: "Mirror Armor", - description: "Bounces back only the stat-lowering effects that the Pokémon receives.", - }, - gulpMissile: { - name: "Gulp Missile", - description: "When the Pokémon uses Surf or Dive, it will come back with prey. When it takes damage, it will spit out the prey to attack.", - }, - stalwart: { - name: "Stalwart", - description: "Ignores the effects of opposing Pokémon's Abilities and moves that draw in moves.", - }, - steamEngine: { - name: "Steam Engine", - description: "Boosts the Pokémon's Speed stat drastically if hit by a Fire- or Water-type move.", - }, - punkRock: { - name: "Punk Rock", - description: "Boosts the power of sound-based moves. The Pokémon also takes half the damage from these kinds of moves.", - }, - sandSpit: { - name: "Sand Spit", - description: "The Pokémon creates a sandstorm when it's hit by an attack.", - }, - iceScales: { - name: "Ice Scales", - description: "The Pokémon is protected by ice scales, which halve the damage taken from special moves.", - }, - ripen: { - name: "Ripen", - description: "Ripens Berries and doubles their effect.", - }, - iceFace: { - name: "Ice Face", - description: "The Pokémon's ice head can take a physical attack as a substitute, but the attack also changes the Pokémon's appearance. The ice will be restored when it hails.", - }, - powerSpot: { - name: "Power Spot", - description: "Just being next to the Pokémon powers up moves.", - }, - mimicry: { - name: "Mimicry", - description: "Changes the Pokémon's type depending on the terrain.", - }, - screenCleaner: { - name: "Screen Cleaner", - description: "When the Pokémon enters a battle, the effects of Light Screen, Reflect, and Aurora Veil are nullified for both opposing and ally Pokémon.", - }, - steelySpirit: { - name: "Steely Spirit", - description: "Powers up ally Pokémon's Steel-type moves.", - }, - perishBody: { - name: "Perish Body", - description: "When hit by a move that makes direct contact, the Pokémon and the attacker will faint after three turns unless they switch out of battle.", - }, - wanderingSpirit: { - name: "Wandering Spirit", - description: "The Pokémon exchanges Abilities with a Pokémon that hits it with a move that makes direct contact.", - }, - gorillaTactics: { - name: "Gorilla Tactics", - description: "Boosts the Pokémon's Attack stat but only allows the use of the first selected move.", - }, - neutralizingGas: { - name: "Neutralizing Gas", - description: "If the Pokémon with Neutralizing Gas is in the battle, the effects of all Pokémon's Abilities will be nullified or will not be triggered.", - }, - pastelVeil: { - name: "Pastel Veil", - description: "Protects the Pokémon and its ally Pokémon from being poisoned.", - }, - hungerSwitch: { - name: "Hunger Switch", - description: "The Pokémon changes its form, alternating between its Full Belly Mode and Hangry Mode after the end of each turn.", - }, - quickDraw: { - name: "Quick Draw", - description: "Enables the Pokémon to move first occasionally.", - }, - unseenFist: { - name: "Unseen Fist", - description: "If the Pokémon uses moves that make direct contact, it can attack the target even if the target protects itself.", - }, - curiousMedicine: { - name: "Curious Medicine", - description: "When the Pokémon enters a battle, it scatters medicine from its shell, which removes all stat changes from allies.", - }, - transistor: { - name: "Transistor", - description: "Powers up Electric-type moves.", - }, - dragonsMaw: { - name: "Dragon's Maw", - description: "Powers up Dragon-type moves.", - }, - chillingNeigh: { - name: "Chilling Neigh", - description: "When the Pokémon knocks out a target, it utters a chilling neigh, which boosts its Attack stat.", - }, - grimNeigh: { - name: "Grim Neigh", - description: "When the Pokémon knocks out a target, it utters a terrifying neigh, which boosts its Sp. Atk stat.", - }, - asOneGlastrier: { - name: "As One", - description: "This Ability combines the effects of both Calyrex's Unnerve Ability and Glastrier's Chilling Neigh Ability.", - }, - asOneSpectrier: { - name: "As One", - description: "This Ability combines the effects of both Calyrex's Unnerve Ability and Spectrier's Grim Neigh Ability.", - }, - lingeringAroma: { - name: "Lingering Aroma", - description: "Contact with the Pokémon changes the attacker's Ability to Lingering Aroma.", - }, - seedSower: { - name: "Seed Sower", - description: "Turns the ground into Grassy Terrain when the Pokémon is hit by an attack.", - }, - thermalExchange: { - name: "Thermal Exchange", - description: "Boosts the Attack stat when the Pokémon is hit by a Fire-type move. The Pokémon also cannot be burned.", - }, - angerShell: { - name: "Anger Shell", - description: "When an attack causes its HP to drop to half or less, the Pokémon gets angry. This lowers its Defense and Sp. Def stats but boosts its Attack, Sp. Atk, and Speed stats.", - }, - purifyingSalt: { - name: "Purifying Salt", - description: "The Pokémon's pure salt protects it from status conditions and halves the damage taken from Ghost-type moves.", - }, - wellBakedBody: { - name: "Well-Baked Body", - description: "The Pokémon takes no damage when hit by Fire-type moves. Instead, its Defense stat is sharply boosted.", - }, - windRider: { - name: "Wind Rider", - description: "Boosts the Pokémon's Attack stat if Tailwind takes effect or if the Pokémon is hit by a wind move. The Pokémon also takes no damage from wind moves.", - }, - guardDog: { - name: "Guard Dog", - description: "Boosts the Pokémon's Attack stat if intimidated. Moves and items that would force the Pokémon to switch out also fail to work.", - }, - rockyPayload: { - name: "Rocky Payload", - description: "Powers up Rock-type moves.", - }, - windPower: { - name: "Wind Power", - description: "The Pokémon becomes charged when it is hit by a wind move, boosting the power of the next Electric-type move the Pokémon uses.", - }, - zeroToHero: { - name: "Zero to Hero", - description: "The Pokémon transforms into its Hero Form when it switches out.", - }, - commander: { - name: "Commander", - description: "When the Pokémon enters a battle, it goes inside the mouth of an ally Dondozo if one is on the field. The Pokémon then issues commands from there.", - }, - electromorphosis: { - name: "Electromorphosis", - description: "The Pokémon becomes charged when it takes damage, boosting the power of the next Electric-type move the Pokémon uses.", - }, - protosynthesis: { - name: "Protosynthesis", - description: "Boosts the Pokémon's most proficient stat in harsh sunlight or if the Pokémon is holding Booster Energy.", - }, - quarkDrive: { - name: "Quark Drive", - description: "Boosts the Pokémon's most proficient stat on Electric Terrain or if the Pokémon is holding Booster Energy.", - }, - goodAsGold: { - name: "Good as Gold", - description: "A body of pure, solid gold gives the Pokémon full immunity to other Pokémon's status moves.", - }, - vesselOfRuin: { - name: "Vessel of Ruin", - description: "The power of the Pokémon's ruinous vessel lowers the Sp. Atk stats of all Pokémon except itself.", - }, - swordOfRuin: { - name: "Sword of Ruin", - description: "The power of the Pokémon's ruinous sword lowers the Defense stats of all Pokémon except itself.", - }, - tabletsOfRuin: { - name: "Tablets of Ruin", - description: "The power of the Pokémon's ruinous wooden tablets lowers the Attack stats of all Pokémon except itself.", - }, - beadsOfRuin: { - name: "Beads of Ruin", - description: "The power of the Pokémon's ruinous beads lowers the Sp. Def stats of all Pokémon except itself.", - }, - orichalcumPulse: { - name: "Orichalcum Pulse", - description: "Turns the sunlight harsh when the Pokémon enters a battle. The ancient pulse thrumming through the Pokémon also boosts its Attack stat in harsh sunlight.", - }, - hadronEngine: { - name: "Hadron Engine", - description: "Turns the ground into Electric Terrain when the Pokémon enters a battle. The futuristic engine within the Pokémon also boosts its Sp. Atk stat on Electric Terrain.", - }, - opportunist: { - name: "Opportunist", - description: "If an opponent's stat is boosted, the Pokémon seizes the opportunity to boost the same stat for itself.", - }, - cudChew: { - name: "Cud Chew", - description: "When the Pokémon eats a Berry, it will regurgitate that Berry at the end of the next turn and eat it one more time.", - }, - sharpness: { - name: "Sharpness", - description: "Powers up slicing moves.", - }, - supremeOverlord: { - name: "Supreme Overlord", - description: "When the Pokémon enters a battle, its Attack and Sp. Atk stats are slightly boosted for each of the allies in its party that have already been defeated.", - }, - costar: { - name: "Costar", - description: "When the Pokémon enters a battle, it copies an ally's stat changes.", - }, - toxicDebris: { - name: "Toxic Debris", - description: "Scatters poison spikes at the feet of the opposing team when the Pokémon takes damage from physical moves.", - }, - armorTail: { - name: "Armor Tail", - description: "The mysterious tail covering the Pokémon's head makes opponents unable to use priority moves against the Pokémon or its allies.", - }, - earthEater: { - name: "Earth Eater", - description: "If hit by a Ground-type move, the Pokémon has its HP restored instead of taking damage.", - }, - myceliumMight: { - name: "Mycelium Might", - description: "The Pokémon will always act more slowly when using status moves, but these moves will be unimpeded by the Ability of the target.", - }, - mindsEye: { - name: "Mind's Eye", - description: "The Pokémon ignores changes to opponents' evasiveness, its accuracy can't be lowered, and it can hit Ghost types with Normal- and Fighting-type moves.", - }, - supersweetSyrup: { - name: "Supersweet Syrup", - description: "A sickly sweet scent spreads across the field the first time the Pokémon enters a battle, lowering the evasiveness of opposing Pokémon.", - }, - hospitality: { - name: "Hospitality", - description: "When the Pokémon enters a battle, it showers its ally with hospitality, restoring a small amount of the ally's HP.", - }, - toxicChain: { - name: "Toxic Chain", - description: "The power of the Pokémon's toxic chain may badly poison any target the Pokémon hits with a move.", - }, - embodyAspectTeal: { - name: "Embody Aspect", - description: "The Pokémon's heart fills with memories, causing the Teal Mask to shine and the Pokémon's Speed stat to be boosted.", - }, - embodyAspectWellspring: { - name: "Embody Aspect", - description: "The Pokémon's heart fills with memories, causing the Wellspring Mask to shine and the Pokémon's Sp. Def stat to be boosted.", - }, - embodyAspectHearthflame: { - name: "Embody Aspect", - description: "The Pokémon's heart fills with memories, causing the Hearthflame Mask to shine and the Pokémon's Attack stat to be boosted.", - }, - embodyAspectCornerstone: { - name: "Embody Aspect", - description: "The Pokémon's heart fills with memories, causing the Cornerstone Mask to shine and the Pokémon's Defense stat to be boosted.", - }, - teraShift: { - name: "Tera Shift", - description: "When the Pokémon enters a battle, it absorbs the energy around itself and transforms into its Terastal Form.", - }, - teraShell: { - name: "Tera Shell", - description: "The Pokémon's shell contains the powers of each type. All damage-dealing moves that hit the Pokémon when its HP is full will not be very effective.", - }, - teraformZero: { - name: "Teraform Zero", - description: "When Terapagos changes into its Stellar Form, it uses its hidden powers to eliminate all effects of weather and terrain, reducing them to zero.", - }, - poisonPuppeteer: { - name: "Poison Puppeteer", - description: "Pokémon poisoned by Pecharunt's moves will also become confused.", - }, -} as const; diff --git a/src/locales/en/achv.json b/src/locales/en/achv.json new file mode 100644 index 00000000000..32d519fbf78 --- /dev/null +++ b/src/locales/en/achv.json @@ -0,0 +1,287 @@ +{ + "Achievements": { + "name": "Achievements" + }, + "Locked": { + "name": "Locked" + }, + "MoneyAchv": { + "description": "Accumulate a total of ₽{{moneyAmount}}" + }, + "10K_MONEY": { + "name": "Money Haver", + "name_female": "Money Haver" + }, + "100K_MONEY": { + "name": "Rich", + "name_female": "Rich" + }, + "1M_MONEY": { + "name": "Millionaire", + "name_female": "Millionaire" + }, + "10M_MONEY": { + "name": "One Percenter", + "name_female": "One Percenter" + }, + "DamageAchv": { + "description": "Inflict {{damageAmount}} damage in one hit" + }, + "250_DMG": { + "name": "Hard Hitter" + }, + "1000_DMG": { + "name": "Harder Hitter", + "name_female": "Harder Hitter" + }, + "2500_DMG": { + "name": "That's a Lotta Damage!", + "name_female": "That's a Lotta Damage!" + }, + "10000_DMG": { + "name": "One Punch Man", + "name_female": "One Punch Woman" + }, + "HealAchv": { + "description": "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item" + }, + "250_HEAL": { + "name": "Novice Healer", + "name_female": "Novice Healer" + }, + "1000_HEAL": { + "name": "Big Healer", + "name_female": "Big Healer" + }, + "2500_HEAL": { + "name": "Cleric", + "name_female": "Cleric" + }, + "10000_HEAL": { + "name": "Recovery Master", + "name_female": "Recovery Master" + }, + "LevelAchv": { + "description": "Level up a Pokémon to Lv{{level}}" + }, + "LV_100": { + "name": "But Wait, There's More!" + }, + "LV_250": { + "name": "Elite", + "name_female": "Elite" + }, + "LV_1000": { + "name": "To Go Even Further Beyond" + }, + "RibbonAchv": { + "description": "Accumulate a total of {{ribbonAmount}} Ribbons" + }, + "10_RIBBONS": { + "name": "Pokémon League Champion", + "name_female": "Pokémon League Champion" + }, + "25_RIBBONS": { + "name": "Great League Champion", + "name_female": "Great League Champion" + }, + "50_RIBBONS": { + "name": "Ultra League Champion", + "name_female": "Ultra League Champion" + }, + "75_RIBBONS": { + "name": "Rogue League Champion", + "name_female": "Rogue League Champion" + }, + "100_RIBBONS": { + "name": "Master League Champion", + "name_female": "Master League Champion" + }, + "TRANSFER_MAX_STAT_STAGE": { + "name": "Teamwork", + "description": "Baton pass to another party member with at least one stat stage 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", + "name_female": "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", + "name_female": "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." + }, + "INVERSE_BATTLE": { + "name": "Mirror rorriM", + "description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC" + } +} diff --git a/src/locales/en/achv.ts b/src/locales/en/achv.ts deleted file mode 100644 index bff75344ea5..00000000000 --- a/src/locales/en/achv.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "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", - }, - - "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!", - }, -} as const; - -// Achievement translations for the when the player character is female (it for now uses the same translations as the male version) -export const PGFachv: AchievementTranslationEntries = PGMachv; diff --git a/src/locales/en/arena-flyout.json b/src/locales/en/arena-flyout.json new file mode 100644 index 00000000000..043d4127eb8 --- /dev/null +++ b/src/locales/en/arena-flyout.json @@ -0,0 +1,44 @@ +{ + "activeBattleEffects": "Active Battle Effects", + "player": "Player", + "neutral": "Neutral", + "enemy": "Enemy", + + "sunny": "Sunny", + "rain": "Rain", + "sandstorm": "Sandstorm", + "hail": "Hail", + "snow": "Snow", + "fog": "Fog", + "heavyRain": "Heavy Rain", + "harshSun": "Harsh Sun", + "strongWinds": "Strong Winds", + + "misty": "Misty Terrain", + "electric": "Electric Terrain", + "grassy": "Grassy Terrain", + "psychic": "Psychic Terrain", + + "mudSport": "Mud Sport", + "waterSport": "Water Sport", + "spikes": "Spikes", + "toxicSpikes": "Toxic Spikes", + "mist": "Mist", + "futureSight": "Future Sight", + "doomDesire": "Doom Desire", + "wish": "Wish", + "stealthRock": "Stealth Rock", + "stickyWeb": "Sticky Web", + "trickRoom": "Trick Room", + "gravity": "Gravity", + "reflect": "Reflect", + "lightScreen": "Light Screen", + "auroraVeil": "Aurora Veil", + "quickGuard": "Quick Guard", + "wideGuard": "Wide Guard", + "matBlock": "Mat Block", + "craftyShield": "Crafty Shield", + "tailwind": "Tailwind", + "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 new file mode 100644 index 00000000000..d8fed386b24 --- /dev/null +++ b/src/locales/en/arena-tag.json @@ -0,0 +1,57 @@ +{ + "yourTeam": "your team", + "opposingTeam": "the opposing team", + "arenaOnRemove": "{{moveName}}'s effect wore off.", + "arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.", + "arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.", + "mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!", + "mistApply": "The mist prevented\nthe lowering of stats!", + "reflectOnAdd": "Reflect reduced the damage of physical moves.", + "reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.", + "reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.", + "lightScreenOnAdd": "Light Screen reduced the damage of special moves.", + "lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.", + "lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.", + "auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.", + "auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.", + "auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.", + "conditionalProtectOnAdd": "{{moveName}} protected team!", + "conditionalProtectOnAddPlayer": "{{moveName}} protected your team!", + "conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!", + "conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!", + "noCritOnAddPlayer": "The {{moveName}} shielded your\nteam from critical hits!", + "noCritOnAddEnemy": "The {{moveName}} shielded the opposing\nteam from critical hits!", + "noCritOnRemove": "{{pokemonNameWithAffix}}'s {{moveName}}\nwore off!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!", + "mudSportOnAdd": "Electricity's power was weakened!", + "mudSportOnRemove": "The effects of Mud Sport\nhave faded.", + "waterSportOnAdd": "Fire's power was weakened!", + "waterSportOnRemove": "The effects of Water Sport\nhave faded.", + "spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!", + "toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!", + "stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!", + "stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!", + "stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!", + "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", + "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "gravityOnAdd": "Gravity intensified!", + "gravityOnRemove": "Gravity returned to normal!", + "tailwindOnAdd": "The Tailwind blew from behind team!", + "tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!", + "tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!", + "tailwindOnRemove": "Team's Tailwind petered out!", + "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.", + "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-info.json b/src/locales/en/battle-info.json new file mode 100644 index 00000000000..2c9e87cb1b8 --- /dev/null +++ b/src/locales/en/battle-info.json @@ -0,0 +1,3 @@ + { + "generation": "Generation {{generation}}" + } \ No newline at end of file diff --git a/src/locales/en/battle-message-ui-handler.json b/src/locales/en/battle-message-ui-handler.json new file mode 100644 index 00000000000..0b2e0ba8b13 --- /dev/null +++ b/src/locales/en/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "Best", + "ivFantastic": "Fantastic", + "ivVeryGood": "Very Good", + "ivPrettyGood": "Pretty Good", + "ivDecent": "Decent", + "ivNoGood": "No Good" +} \ No newline at end of file diff --git a/src/locales/en/battle-message-ui-handler.ts b/src/locales/en/battle-message-ui-handler.ts deleted file mode 100644 index c213c666a26..00000000000 --- a/src/locales/en/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "Best", - "ivFantastic": "Fantastic", - "ivVeryGood": "Very Good", - "ivPrettyGood": "Pretty Good", - "ivDecent": "Decent", - "ivNoGood": "No Good", -} as const; diff --git a/src/locales/en/battle-scene.json b/src/locales/en/battle-scene.json new file mode 100644 index 00000000000..a0288475d69 --- /dev/null +++ b/src/locales/en/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/en/battle.json b/src/locales/en/battle.json new file mode 100644 index 00000000000..120ac749acb --- /dev/null +++ b/src/locales/en/battle.json @@ -0,0 +1,100 @@ +{ + "bossAppeared": "{{bossName}} appeared.", + "trainerAppeared": "{{trainerName}}\nwould like to battle!", + "trainerAppearedDouble": "{{trainerName}}\nwould like to battle!", + "trainerSendOut": "{{trainerName}} sent out\n{{pokemonName}}!", + "singleWildAppeared": "A wild {{pokemonName}} appeared!", + "multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!", + "playerComeBack": "Come back, {{pokemonName}}!", + "trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!", + "playerGo": "Go! {{pokemonName}}!", + "trainerGo": "{{trainerName}} sent out {{pokemonName}}!", + "switchQuestion": "Will you switch\n{{pokemonName}}?", + "trainerDefeated": "You defeated\n{{trainerName}}!", + "moneyWon": "You got\n₽{{moneyAmount}} for winning!", + "moneyPickedUp": "You picked up ₽{{moneyAmount}}!", + "pokemonCaught": "{{pokemonName}} was caught!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", + "partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?", + "pokemon": "Pokémon", + "sendOutPokemon": "Go! {{pokemonName}}!", + "hitResultCriticalHit": "A critical hit!", + "hitResultSuperEffective": "It's super effective!", + "hitResultNotVeryEffective": "It's not very effective…", + "hitResultNoEffect": "It doesn't affect {{pokemonName}}!", + "hitResultImmune": "{{pokemonName}} is unaffected!", + "hitResultOneHitKO": "It's a one-hit KO!", + "attackFailed": "But it failed!", + "attackMissed": "{{pokemonNameWithAffix}} avoided the attack!", + "attackHitsCount": "Hit {{count}} time(s)!", + "rewardGain": "You received\n{{modifierName}}!", + "expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!", + "levelUp": "{{pokemonName}} grew to\nLv. {{level}}!", + "learnMove": "{{pokemonName}} learned\n{{moveName}}!", + "learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.", + "learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.", + "learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?", + "learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?", + "learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.", + "learnMoveForgetQuestion": "Which move should be forgotten?", + "learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.", + "countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Poof!", + "learnMoveAnd": "And…", + "levelCapUp": "The level cap\nhas increased to {{levelCap}}!", + "moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.", + "moveNoPP": "There's no PP left for\nthis move!", + "moveDisabled": "{{moveName}} is disabled!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}'s {{moveName}}\nis disabled!", + "noPokeballForce": "An unseen force\nprevents using Poké Balls.", + "noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!", + "noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!", + "noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!", + "noEscapeForce": "An unseen force\nprevents escape.", + "noEscapeTrainer": "You can't run\nfrom a trainer battle!", + "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!", + "runAwaySuccess": "You got away safely!", + "runAwayCannotEscape": "You can't escape!", + "escapeVerbSwitch": "switching", + "escapeVerbFlee": "fleeing", + "notDisabled": "{{pokemonName}}'s {{moveName}} is disabled\nno more!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", + "skipItemQuestion": "Are you sure you want to skip taking an item?", + "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}}", + "useMove": "{{pokemonNameWithAffix}} used {{moveName}}!", + "drainMessage": "{{pokemonName}} had its\nenergy drained!", + "regainHealth": "{{pokemonName}} regained\nhealth!", + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}} restored PP to its move {{moveName}}\nusing its {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} restored its health using\nits {{berryName}}!", + "fainted": "{{pokemonNameWithAffix}} fainted!", + "statsAnd": "and", + "stats": "Stats", + "statRose_one": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose_one": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically_one": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell_one": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statFell_other": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "retryBattle": "Would you like to retry from the start of the battle?", + "unlockedSomething": "{{unlockedThing}}\nhas been unlocked.", + "congratulations": "Congratulations!", + "beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!", + "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!" +} \ No newline at end of file diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts deleted file mode 100644 index d41ffc373dc..00000000000 --- a/src/locales/en/battle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "{{bossName}} appeared.", - "trainerAppeared": "{{trainerName}}\nwould like to battle!", - "trainerAppearedDouble": "{{trainerName}}\nwould like to battle!", - "trainerSendOut": "{{trainerName}} sent out\n{{pokemonName}}!", - "singleWildAppeared": "A wild {{pokemonName}} appeared!", - "multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!", - "playerComeBack": "Come back, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!", - "playerGo": "Go! {{pokemonName}}!", - "trainerGo": "{{trainerName}} sent out {{pokemonName}}!", - "switchQuestion": "Will you switch\n{{pokemonName}}?", - "trainerDefeated": "You defeated\n{{trainerName}}!", - "moneyWon": "You got\n₽{{moneyAmount}} for winning!", - "pokemonCaught": "{{pokemonName}} was caught!", - "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", - "partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?", - "pokemon": "Pokémon", - "sendOutPokemon": "Go! {{pokemonName}}!", - "hitResultCriticalHit": "A critical hit!", - "hitResultSuperEffective": "It's super effective!", - "hitResultNotVeryEffective": "It's not very effective…", - "hitResultNoEffect": "It doesn't affect {{pokemonName}}!", - "hitResultOneHitKO": "It's a one-hit KO!", - "attackFailed": "But it failed!", - "attackHitsCount": "Hit {{count}} time(s)!", - "rewardGain": "You received\n{{modifierName}}!", - "expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!", - "levelUp": "{{pokemonName}} grew to\nLv. {{level}}!", - "learnMove": "{{pokemonName}} learned\n{{moveName}}!", - "learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.", - "learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.", - "learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?", - "learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?", - "learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.", - "learnMoveForgetQuestion": "Which move should be forgotten?", - "learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!", - "learnMoveAnd": "And…", - "levelCapUp": "The level cap\nhas increased to {{levelCap}}!", - "moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.", - "moveNoPP": "There's no PP left for\nthis move!", - "moveDisabled": "{{moveName}} is disabled!", - "noPokeballForce": "An unseen force\nprevents using Poké Balls.", - "noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!", - "noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!", - "noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!", - "noEscapeForce": "An unseen force\nprevents escape.", - "noEscapeTrainer": "You can't run\nfrom a trainer battle!", - "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!", - "runAwaySuccess": "You got away safely!", - "runAwayCannotEscape": "You can't escape!", - "escapeVerbSwitch": "switching", - "escapeVerbFlee": "fleeing", - "notDisabled": "{{pokemonName}}'s {{moveName}} is disabled\nno more!", - "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", - "hpIsFull": "{{pokemonName}}'s\nHP is full!", - "skipItemQuestion": "Are you sure you want to skip taking an item?", - "eggHatching": "Oh?", - "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", - "wildPokemonWithAffix": "Wild {{pokemonName}}", - "foePokemonWithAffix": "Foe {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}} used {{moveName}}!", - "drainMessage": "{{pokemonName}} had its\nenergy drained!", - "regainHealth": "{{pokemonName}} regained\nhealth!", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", - "fainted": "{{pokemonNameWithAffix}} fainted!", - "statRose": "{{pokemonNameWithAffix}}'s {{stats}} rose!", - "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", - "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", - "statFell": "{{pokemonNameWithAffix}}'s {{stats}} fell!", - "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", - "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", - "battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", - "battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" -} as const; diff --git a/src/locales/en/battler-tags.json b/src/locales/en/battler-tags.json new file mode 100644 index 00000000000..222aee4087c --- /dev/null +++ b/src/locales/en/battler-tags.json @@ -0,0 +1,73 @@ +{ + "trappedDesc": "trapping", + "flinchedDesc": "flinching", + "confusedDesc": "confusion", + "infatuatedDesc": "infatuation", + "seedDesc": "seeding", + "nightmareDesc": "nightmares", + "ingrainDesc": "roots", + "drowsyDesc": "drowsiness", + "rechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", + "trappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", + "trappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", + "flinchedLapse": "{{pokemonNameWithAffix}} flinched!", + "confusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", + "confusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", + "confusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", + "confusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", + "confusedLapseHurtItself": "It hurt itself in its\nconfusion!", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", + "destinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", + "infatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", + "infatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", + "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", + "infatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", + "seededOnAdd": "{{pokemonNameWithAffix}} was seeded!", + "seededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", + "seededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", + "nightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", + "nightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", + "nightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", + "encoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!", + "encoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", + "helpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", + "ingrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", + "ingrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", + "aquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", + "aquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", + "drowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", + "damagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", + "bindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", + "wrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", + "vortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", + "clampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", + "sandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", + "magmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", + "snapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", + "thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", + "infestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", + "protectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", + "protectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", + "enduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", + "enduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", + "sturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", + "perishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!", + "truantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", + "slowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", + "slowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", + "highestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", + "highestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!", + "magnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!", + "critBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", + "critBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", + "saltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", + "saltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", + "cursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", + "cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!", + "stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!", + "disabledOnAdd": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!", + "disabledLapse": "{{pokemonNameWithAffix}}'s {{moveName}}\nis no longer disabled." +} diff --git a/src/locales/en/berry.json b/src/locales/en/berry.json new file mode 100644 index 00000000000..a4bec889877 --- /dev/null +++ b/src/locales/en/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "Sitrus Berry", + "effect": "Restores 25% HP if HP is below 50%" + }, + "LUM": { + "name": "Lum Berry", + "effect": "Cures any non-volatile status condition and confusion" + }, + "ENIGMA": { + "name": "Enigma Berry", + "effect": "Restores 25% HP if hit by a super effective move" + }, + "LIECHI": { + "name": "Liechi Berry", + "effect": "Raises Attack if HP is below 25%" + }, + "GANLON": { + "name": "Ganlon Berry", + "effect": "Raises Defense if HP is below 25%" + }, + "PETAYA": { + "name": "Petaya Berry", + "effect": "Raises Sp. Atk if HP is below 25%" + }, + "APICOT": { + "name": "Apicot Berry", + "effect": "Raises Sp. Def if HP is below 25%" + }, + "SALAC": { + "name": "Salac Berry", + "effect": "Raises Speed if HP is below 25%" + }, + "LANSAT": { + "name": "Lansat Berry", + "effect": "Raises critical hit ratio if HP is below 25%" + }, + "STARF": { + "name": "Starf Berry", + "effect": "Sharply raises a random stat if HP is below 25%" + }, + "LEPPA": { + "name": "Leppa Berry", + "effect": "Restores 10 PP to a move if its PP reaches 0" + } +} \ No newline at end of file diff --git a/src/locales/en/berry.ts b/src/locales/en/berry.ts deleted file mode 100644 index 3c4930b1591..00000000000 --- a/src/locales/en/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "Sitrus Berry", - effect: "Restores 25% HP if HP is below 50%", - }, - "LUM": { - name: "Lum Berry", - effect: "Cures any non-volatile status condition and confusion", - }, - "ENIGMA": { - name: "Enigma Berry", - effect: "Restores 25% HP if hit by a super effective move", - }, - "LIECHI": { - name: "Liechi Berry", - effect: "Raises Attack if HP is below 25%", - }, - "GANLON": { - name: "Ganlon Berry", - effect: "Raises Defense if HP is below 25%", - }, - "PETAYA": { - name: "Petaya Berry", - effect: "Raises Sp. Atk if HP is below 25%", - }, - "APICOT": { - name: "Apicot Berry", - effect: "Raises Sp. Def if HP is below 25%", - }, - "SALAC": { - name: "Salac Berry", - effect: "Raises Speed if HP is below 25%", - }, - "LANSAT": { - name: "Lansat Berry", - effect: "Raises critical hit ratio if HP is below 25%", - }, - "STARF": { - name: "Starf Berry", - effect: "Sharply raises a random stat if HP is below 25%", - }, - "LEPPA": { - name: "Leppa Berry", - effect: "Restores 10 PP to a move if its PP reaches 0", - }, -} as const; diff --git a/src/locales/it/bgm-name.ts b/src/locales/en/bgm-name.json similarity index 86% rename from src/locales/it/bgm-name.ts rename to src/locales/en/bgm-name.json index ef15c6c6dcb..8838942c8a6 100644 --- a/src/locales/it/bgm-name.ts +++ b/src/locales/en/bgm-name.json @@ -1,11 +1,10 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "Music", - "missing_entries" : "{{name}}", +{ + "music": "Music: ", + "missing_entries": "{{name}}", "battle_kanto_champion": "B2W2 Kanto Champion Battle", "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_hoenn_champion_g5": "B2W2 Hoenn Champion Battle", + "battle_hoenn_champion_g6": "ORAS Hoenn Champion Battle", "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", "battle_champion_alder": "BW Unova Champion Battle", "battle_champion_iris": "B2W2 Unova Champion Battle", @@ -46,6 +45,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_origin_forme": "LA Origin Dialga & Palkia Battle", "battle_legendary_giratina": "ORAS Giratina Battle", "battle_legendary_arceus": "HGSS Arceus Battle", "battle_legendary_unova": "BW Unova Legendary Battle", @@ -60,6 +60,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_riders": "SWSH Ice & Shadow Rider Calyrex Battle", "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", "battle_legendary_ruinous": "SV Treasures of Ruin Battle", "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", @@ -79,13 +80,21 @@ export const bgmName: SimpleTranslationEntries = { "battle_galactic_grunt": "BDSP Team Galactic Battle", "battle_plasma_grunt": "BW Team Plasma Battle", "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_aether_boss": "SM Lusamine Battle", + "battle_skull_boss": "SM Guzma Battle", + "battle_macro_boss": "SWSH Rose Battle", - // Biome Music "abyss": "PMD EoS Dark Crater", "badlands": "PMD EoS Barren Valley", "beach": "PMD EoS Drenched Bluff", @@ -101,18 +110,18 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PMD EoS Mystifying Forest", "ice_cave": "PMD EoS Vast Ice Mountain", "island": "PMD EoS Craggy Coast", - "jungle": "Lmz - Jungle", // The composer thinks about a more creative name - "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "jungle": "Lmz - Jungle", + "laboratory": "Firel - Laboratory", "lake": "PMD EoS Crystal Cave", "meadow": "PMD EoS Sky Peak Forest", - "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "metropolis": "Firel - Metropolis", "mountain": "PMD EoS Mt. Horn", "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", - "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "sea": "Andr06 - Marine Mystique", + "seabed": "Firel - Seabed", + "slum": "Andr06 - Sneaky Snom", "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", @@ -121,8 +130,6 @@ export const bgmName: SimpleTranslationEntries = { "town": "PMD EoS Random Dungeon Theme 3", "volcano": "PMD EoS Steam Cave", "wasteland": "PMD EoS Hidden Highland", - - // Encounter "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", @@ -137,9 +144,7 @@ export const bgmName: SimpleTranslationEntries = { "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", "encounter_twins": "BW Trainers' Eyes Meet (Twins)", "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", - - // Other "heal": "BW Pokémon Heal", "menu": "PMD EoS Welcome to the World of Pokémon!", - "title": "PMD EoS Top Menu Theme", -} as const; + "title": "PMD EoS Top Menu Theme" +} diff --git a/src/locales/en/bgm-name.ts b/src/locales/en/bgm-name.ts deleted file mode 100644 index ef15c6c6dcb..00000000000 --- a/src/locales/en/bgm-name.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "Music", - "missing_entries" : "{{name}}", - "battle_kanto_champion": "B2W2 Kanto Champion Battle", - "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", - "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", - "battle_champion_alder": "BW Unova Champion Battle", - "battle_champion_iris": "B2W2 Unova Champion Battle", - "battle_kalos_champion": "XY Kalos Champion Battle", - "battle_alola_champion": "USUM Alola Champion Battle", - "battle_galar_champion": "SWSH Galar Champion Battle", - "battle_champion_geeta": "SV Champion Geeta Battle", - "battle_champion_nemona": "SV Champion Nemona Battle", - "battle_champion_kieran": "SV Champion Kieran Battle", - "battle_hoenn_elite": "ORAS Elite Four Battle", - "battle_unova_elite": "BW Elite Four Battle", - "battle_kalos_elite": "XY Elite Four Battle", - "battle_alola_elite": "SM Elite Four Battle", - "battle_galar_elite": "SWSH League Tournament Battle", - "battle_paldea_elite": "SV Elite Four Battle", - "battle_bb_elite": "SV BB League Elite Four Battle", - "battle_final_encounter": "PMD RTDX Rayquaza's Domain", - "battle_final": "BW Ghetsis Battle", - "battle_kanto_gym": "B2W2 Kanto Gym Battle", - "battle_johto_gym": "B2W2 Johto Gym Battle", - "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", - "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", - "battle_unova_gym": "BW Unova Gym Battle", - "battle_kalos_gym": "XY Kalos Gym Battle", - "battle_galar_gym": "SWSH Galar Gym Battle", - "battle_paldea_gym": "SV Paldea Gym Battle", - "battle_legendary_kanto": "XY Kanto Legendary Battle", - "battle_legendary_raikou": "HGSS Raikou Battle", - "battle_legendary_entei": "HGSS Entei Battle", - "battle_legendary_suicune": "HGSS Suicune Battle", - "battle_legendary_lugia": "HGSS Lugia Battle", - "battle_legendary_ho_oh": "HGSS Ho-oh Battle", - "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", - "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", - "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", - "battle_legendary_rayquaza": "ORAS Rayquaza Battle", - "battle_legendary_deoxys": "ORAS Deoxys Battle", - "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", - "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", - "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", - "battle_legendary_giratina": "ORAS Giratina Battle", - "battle_legendary_arceus": "HGSS Arceus Battle", - "battle_legendary_unova": "BW Unova Legendary Battle", - "battle_legendary_kyurem": "BW Kyurem Battle", - "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", - "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", - "battle_legendary_tapu": "SM Tapu Battle", - "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", - "battle_legendary_ub": "SM Ultra Beast Battle", - "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", - "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", - "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", - "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", - "battle_legendary_calyrex": "SWSH Calyrex Battle", - "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", - "battle_legendary_ruinous": "SV Treasures of Ruin Battle", - "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", - "battle_legendary_loyal_three": "SV Loyal Three Battle", - "battle_legendary_ogerpon": "SV Ogerpon Battle", - "battle_legendary_terapagos": "SV Terapagos Battle", - "battle_legendary_pecharunt": "SV Pecharunt Battle", - "battle_rival": "BW Rival Battle", - "battle_rival_2": "BW N Battle", - "battle_rival_3": "BW Final N Battle", - "battle_trainer": "BW Trainer Battle", - "battle_wild": "BW Wild Battle", - "battle_wild_strong": "BW Strong Wild Battle", - "end_summit": "PMD RTDX Sky Tower Summit", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", - "battle_plasma_grunt": "BW Team Plasma Battle", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", - - // Biome Music - "abyss": "PMD EoS Dark Crater", - "badlands": "PMD EoS Barren Valley", - "beach": "PMD EoS Drenched Bluff", - "cave": "PMD EoS Sky Peak Cave", - "construction_site": "PMD EoS Boulder Quarry", - "desert": "PMD EoS Northern Desert", - "dojo": "PMD EoS Marowak Dojo", - "end": "PMD RTDX Sky Tower", - "factory": "PMD EoS Concealed Ruins", - "fairy_cave": "PMD EoS Star Cave", - "forest": "PMD EoS Dusk Forest", - "grass": "PMD EoS Apple Woods", - "graveyard": "PMD EoS Mystifying Forest", - "ice_cave": "PMD EoS Vast Ice Mountain", - "island": "PMD EoS Craggy Coast", - "jungle": "Lmz - Jungle", // The composer thinks about a more creative name - "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name - "lake": "PMD EoS Crystal Cave", - "meadow": "PMD EoS Sky Peak Forest", - "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name - "mountain": "PMD EoS Mt. Horn", - "plains": "PMD EoS Sky Peak Prairie", - "power_plant": "PMD EoS Far Amp Plains", - "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", - "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", - "snowy_forest": "PMD EoS Sky Peak Snowfield", - "space": "Firel - Aether", - "swamp": "PMD EoS Surrounded Sea", - "tall_grass": "PMD EoS Foggy Forest", - "temple": "PMD EoS Aegis Cave", - "town": "PMD EoS Random Dungeon Theme 3", - "volcano": "PMD EoS Steam Cave", - "wasteland": "PMD EoS Hidden Highland", - - // Encounter - "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", - "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", - "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", - "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", - "encounter_lass": "BW Trainers' Eyes Meet (Lass)", - "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", - "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", - "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", - "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", - "encounter_rival": "BW Cheren", - "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", - "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", - "encounter_twins": "BW Trainers' Eyes Meet (Twins)", - "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", - - // Other - "heal": "BW Pokémon Heal", - "menu": "PMD EoS Welcome to the World of Pokémon!", - "title": "PMD EoS Top Menu Theme", -} as const; diff --git a/src/locales/en/biome.ts b/src/locales/en/biome.json similarity index 80% rename from src/locales/en/biome.ts rename to src/locales/en/biome.json index d3f34c021d4..6d79382cf3e 100644 --- a/src/locales/en/biome.ts +++ b/src/locales/en/biome.json @@ -1,7 +1,5 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { - "unknownLocation": "Somewhere you can\'t remember", +{ + "unknownLocation": "Somewhere you can't remember", "TOWN": "Town", "PLAINS": "Plains", "GRASS": "Grassy Field", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "Snowy Forest", "ISLAND": "Island", "LABORATORY": "Laboratory", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/en/challenges.json b/src/locales/en/challenges.json new file mode 100644 index 00000000000..7792755d626 --- /dev/null +++ b/src/locales/en/challenges.json @@ -0,0 +1,37 @@ +{ + "title": "Challenge Modifiers", + "illegalEvolution": "{{pokemon}} changed into an ineligible Pokémon\nfor this challenge!", + "noneSelected": "None Selected", + "singleGeneration": { + "name": "Mono Gen", + "desc": "You can only use Pokémon from Generation {{gen}}.", + "desc_default": "You can only use Pokémon from the chosen generation.", + "gen_1": "one", + "gen_2": "two", + "gen_3": "three", + "gen_4": "four", + "gen_5": "five", + "gen_6": "six", + "gen_7": "seven", + "gen_8": "eight", + "gen_9": "nine" + }, + "singleType": { + "name": "Mono Type", + "desc": "You can only use Pokémon with the {{type}} type.", + "desc_default": "You can only use Pokémon of the chosen type." + }, + "freshStart": { + "name": "Fresh Start", + "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" + } +} diff --git a/src/locales/en/challenges.ts b/src/locales/en/challenges.ts deleted file mode 100644 index a40f05a0843..00000000000 --- a/src/locales/en/challenges.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TranslationEntries } from "#app/interfaces/locales.js"; - -export const challenges: TranslationEntries = { - "title": "Challenge Modifiers", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", - "singleGeneration": { - "name": "Mono Gen", - "desc": "You can only use Pokémon from Generation {{gen}}.", - "desc_default": "You can only use Pokémon from the chosen generation.", - "gen_1": "one", - "gen_2": "two", - "gen_3": "three", - "gen_4": "four", - "gen_5": "five", - "gen_6": "six", - "gen_7": "seven", - "gen_8": "eight", - "gen_9": "nine", - }, - "singleType": { - "name": "Mono Type", - "desc": "You can only use Pokémon with the {{type}} type.", - "desc_default": "You can only use Pokémon of the chosen type." - //types in pokemon-info - }, -} as const; diff --git a/src/locales/en/command-ui-handler.json b/src/locales/en/command-ui-handler.json new file mode 100644 index 00000000000..5ca222234d3 --- /dev/null +++ b/src/locales/en/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "Fight", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Run", + "actionMessage": "What will\n{{pokemonName}} do?" +} \ No newline at end of file diff --git a/src/locales/en/command-ui-handler.ts b/src/locales/en/command-ui-handler.ts deleted file mode 100644 index c4c65db0aa0..00000000000 --- a/src/locales/en/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Fight", - "ball": "Ball", - "pokemon": "Pokémon", - "run": "Run", - "actionMessage": "What will\n{{pokemonName}} do?", -} as const; diff --git a/src/locales/en/common.json b/src/locales/en/common.json new file mode 100644 index 00000000000..e910b7c2e09 --- /dev/null +++ b/src/locales/en/common.json @@ -0,0 +1,8 @@ +{ + "start": "Start", + "luckIndicator": "Luck:", + "shinyOnHover": "Shiny", + "commonShiny": "Common", + "rareShiny": "Rare", + "epicShiny": "Epic" +} \ No newline at end of file diff --git a/src/locales/en/common.ts b/src/locales/en/common.ts deleted file mode 100644 index 82966b4ffeb..00000000000 --- a/src/locales/en/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "Start", -} as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 1d40e61bbad..024f7f10108 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -1,94 +1,113 @@ -import { common } from "./common.js"; -import { settings } from "./settings.js"; -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { partyUiHandler } from "./party-ui-handler"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const enConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - partyUiHandler: partyUiHandler, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - statusEffect: statusEffect, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather, + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory }; diff --git a/src/locales/en/dialogue-double-battle.json b/src/locales/en/dialogue-double-battle.json new file mode 100644 index 00000000000..4190af49d15 --- /dev/null +++ b/src/locales/en/dialogue-double-battle.json @@ -0,0 +1,84 @@ +{ + "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?", + "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!" + } + }, + "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...", + "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..." + } + } +} \ 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.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.json b/src/locales/en/dialogue.json new file mode 100644 index 00000000000..5565d2258c2 --- /dev/null +++ b/src/locales/en/dialogue.json @@ -0,0 +1,2827 @@ +{ + "youngster": { + "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.", + "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…", + "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!", + "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." + }, + "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…" + } + }, + "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.", + "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?" + }, + "victory": { + "1": "Yes… You have good Pokémon…", + "2": "What?! But I'm a battling genius!", + "3": "Of course, you are the main character!", + "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!", + "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!", + "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!", + "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?", + "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.", + "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.", + "2_female": "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!", + "1_female": "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?", + "3_female": "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!\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…" + } + }, + "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...", + "3_female": "Ahya! How could this be? For an Admin like me to lose to some random trainer..." + } + }, + "courtney": { + "encounter": { + "1": "Don't. Get. In. My. Way.", + "2": "You... ...I want to...analyze. Ahahaha", + "3": "... Well then...Deleting..." + }, + "victory": { + "1": "Hah hah... Uhn...hah hah...", + "2": "As anticipated. Unanticipated. You. Target lock...completed.\n$Commencing...experiment. You. Forever. Aha... ♪", + "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_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_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": "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": "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": "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_female": "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!", + "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, 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!", + "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, 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!" + } + }, + "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.", + "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": { + "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!", + "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_female": "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!", + "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?" + } + }, + "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!", + "5_female": "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!", + "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!" + }, + "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!", + "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!" + }, + "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?", + "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." + } + }, + "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!", + "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?", + "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?", + "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.", + "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." + } + }, + "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.", + "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": { + "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..", + "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..." + } + }, + "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.", + "1_female": "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!", + "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." + }, + "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!", + "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?" + }, + "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!", + "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": { + "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.", + "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?" + } + }, + "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!", + "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!", + "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!", + "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!" + }, + "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!", + "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!" + } + }, + "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.", + "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!" + }, + "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?", + "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?" + }, + "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?", + "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?" + }, + "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.", + "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_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…", + "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?", + "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…" + }, + "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'.", + "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!" + }, + "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.", + "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?" + }, + "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!", + "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!" + }, + "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.", + "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.", + "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!", + "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!", + "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_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.", + "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.", + "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": "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?" + }, + "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": "See? These are my rocking Pokémon, my pride and joy!", + "4": "I knew I would win!" + } + }, + "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…", + "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.", + "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?", + "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_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." + }, + "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. ", + "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!", + "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?", + "1_female": "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!", + "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!" + }, + "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!", + "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?" + } + }, + "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.", + "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!" + } + }, + "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_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_female": "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!", + "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_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." + } + }, + "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!", + "1_female": "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.", + "1_female": "Not bad, kiddo." + }, + "defeat": { + "1": "Nahahaha! You really are something else, kiddo!", + "1_female": "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.", + "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!" + } + }, + "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!", + "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_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!" + } + }, + "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!", + "1_female": "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!", + "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!" + }, + "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!", + "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." + }, + "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!", + "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_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_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": { + "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!", + "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_female": "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!", + "1_female": "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!", + "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!" + }, + "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.", + "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…" + }, + "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.", + "1_female": "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!", + "1_female": "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?", + "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?" + }, + "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!", + "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!" + }, + "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!", + "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…" + }, + "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!", + "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!" + }, + "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!", + "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." + }, + "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.", + "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…" + }, + "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.", + "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." + } + }, + "bede": { + "encounter": { + "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." + }, + "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!", + "1_female": "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!", + "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_female": "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!", + "1_female": "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?", + "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!", + "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?", + "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": { + "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!", + "2_female": "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!" + } + }, + "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.ts b/src/locales/en/dialogue.ts deleted file mode 100644 index dda8891b788..00000000000 --- a/src/locales/en/dialogue.ts +++ /dev/null @@ -1,2674 +0,0 @@ -import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/interfaces/locales"; - -// Dialogue of the NPCs in the game when the player character is male (or unset) -export const PGMdialogue: DialogueTranslationEntries = { - "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. - $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..." - }, - }, - "rocket_grunt": { - "encounter": { - 1: "Prepare for trouble!" - }, - "victory": { - 1: "Team Rocket blasting off again!" - }, - }, - "magma_grunt": { - "encounter": { - 1: " If you get in the way of Team Magma, don’t expect any mercy!" - }, - "victory": { - 1: "Huh? I lost?!" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "No one who crosses Team Aqua gets any mercy, not even kids!" - }, - "victory": { - 1: "You're kidding me!" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "Don't mess with Team Galactic!" - }, - "victory": { - 1: "Shut down..." - }, - }, - "plasma_grunt": { - "encounter": { - 1: "We won't tolerate people who have different ideas!" - }, - "victory": { - 1: "Plasmaaaaaaaaa!" - }, - }, - "flare_grunt": { - "encounter": { - 1: "Fashion is most important to us!" - }, - "victory": { - 1: "The future doesn't look bright for me." - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "So! I must say, I am impressed you got here!" - }, - "victory": { - 1: "WHAT! This cannot be!" - }, - "defeat": { - 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "My old associates need me... Are you going to get in my way?" - }, - "victory": { - 1: "How is this possible...? 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. - $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. - $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. - $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." - } - }, - "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. - $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... - $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? - $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… - $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. - $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. - $I believed that tale, so I have secretly trained here all my life. As a result, I can now see what others cannot. - $I see a shadow of the person who will make the Pokémon appear. - $I believe that person is me! You're going to help me reach that level!`, - 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. - $I envy you for that…`, - 3: "How is this possible…", - 4: `I don't think our potentials are so different. - $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. - $… 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. - $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? - $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… - $They're both great subjects for my camera! Fantastic! This'll be just fantastic! - $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… - $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! - $But I should tell you, I'm tough because I know how to focus.`, - 2: `Pokémon, fashion, romance… It's all about focus! - $I'll show you just what I mean. Get ready to lose!` - }, - "victory": { - 1: "I must say, I'm warmed up to you! I might even admire you a little.", - 2: `Wow! You're great! You've earned my respect! - $I think your focus and will bowled us over totally. ` - }, - "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… - $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'. - $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. - $That's good! Looking real good! All right! - $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. - $Yes, the bond I developed with Pokémon is extremely tight. - $So, come on, just try and see if you can even inflict damage on my Pokémon!`, - }, - "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. - $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! - $The all-consuming heat overwhelms. - $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? - $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. - $I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. - $And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!`, - }, - "victory": { - 1: `Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. - $I find much joy in having met you and your Pokémon. You have proven yourself worthy.`, - }, - "defeat": { - 1: "A grand illusion!" - } - }, - "lorelei": { - "encounter": { - 1: `No one can best me when it comes to icy Pokémon! Freezing moves are powerful! - $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. - $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. - $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. - $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. - $Your Pokémon believed in you and did their best to earn you the win. - $Even though I've lost, I find myself with this silly grin!`, - }, - "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. - $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? - $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… - $You look like a Pokémon Trainer with refined strength and deepened kindness. - $What I look for in my opponent is superb strength… - $Please unleash your power to the fullest!`, - }, - "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… - $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! - $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! - $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. - $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. - $This is gonna be a doozy of a battle! - $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… - $The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. - $Since you've made it this far, I'll put that aside and battle you. - $Let me see if you'll achieve as much glory as the hero of my book!` - }, - "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… - $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… - $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? - $What have you felt, meeting so many other Trainers out there? - $Traveling this rich land… Has it awoken something inside you? - $I want you to come at me with all that you've learned. - $My Pokémon and I will respond in turn with all that we know!`, - }, - "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! - $I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! - $And they are battling alongside Pokémon that have been through countless difficult battles! - $If I battle with people like that, not only will I get stronger, my Pokémon will, too! - $And we'll get to know each other even better! OK! Brace yourself! - $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, - }, - "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. - $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. - $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… - $But what a champion time it's been! - $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. - $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. - $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. - $With more young Trainers taking charge, the future of Pokémon is bright! - $So, as a wall for young people, I'll take your challenge!`, - }, - "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… - $I hope you're the Trainer who'll make me remember how fun it is to battle!`, - }, - "victory": { - 1: `You've got me beat… - $Your desire and the noble way your Pokémon battled for you… - $I even felt thrilled during our match. That was a very good battle.`, - }, - "defeat": { - 1: `It was not shocking at all… - $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. - $OK! I can hear my battle muse loud and clear. Let's get straight to it!`, - 2: `Of course, I'm really proud of all of my Pokémon! - $Well now… Let's get right to it!` - }, - "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. - $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! - $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? - $I love being on the summit! 'Cause you can see forever and ever from high places! - $So, how about you and I have some fun?`, - }, - "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. - $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. - $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. - $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. - $That is all there really is to it. - $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. - $Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. - $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, - }, - "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… - $But really, I just do it 'cause it's fun. - $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. - $But that means your opponent is also working hard to win. - $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? - $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! - $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. - $It's a real curse. - $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? - $... - $Let's get this show on the road! How strong is our challenger? - $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... - $What an extraordinary effort!` - } - }, - "kieran": { - "encounter": { - 1: `Through hard work, I become stronger and stronger! - $I don't lose.` - }, - "victory": { - 1: `I don't believe it... - $What a fun and heart-pounding battle!` - }, - "defeat": { - 1: `Wowzers, what a battle! - $Time for you to train even harder.` - } - }, - "rival": { - "encounter": { - 1: `@c{smile}Hey, I was looking for you! I knew you were eager to get going but I expected at least a goodbye… - $@c{smile_eclosed}So you're really pursuing your dream after all?\n 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…\nWho 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? - $@c{smile_ehalf}You're going after your dream, huh?\nThat day is really today isn't it… - $@c{smile}Anyway, I'll forgive you for forgetting me, but on one condition. @c{smile_wave_wink}You have to battle me! - $@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? - $@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. - $@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful! - $@c{smile_wave}Do your best like always! I believe in you!` - }, - }, - "rival_2": { - "encounter": { - 1: `@c{smile}Hey, you're here too?\n@c{smile_eclosed}Still a perfect record, huh…? - $@c{serious_mopen_fists}I know it kind of looks like I followed you here, but that's mostly not true. - $@c{serious_smile_fists}Honestly though, I've been itching for a rematch since you beat me back at home. - $I've been doing a lot of my own training so I'll definitely put up a fight this time. - $@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. - $@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 - $@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n - $@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all. - $@c{smile}Anyway, take care!` - }, - }, - "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! - $@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. - $@c{smile_ehalf}I'm happy for you but I just want to let you know that it's OK to lose sometimes. - $@c{smile}We learn from our mistakes, often more than we would if we kept succeeding. - $@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… - $@c{smile}Aw well. That just means I'll have to train even harder for next time! - $@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~. - $@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this! - $@c{smile_wave}Keep at it!` - }, - "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. - $@c{neutral_eclosed}Things have been kind of… strange.\nIt's not the same back home without you. - $@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. - $@c{serious}Never losing once is just unrealistic.\nWe need to lose sometimes in order to grow. - $@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? - $@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! - $@c{smile_ehalf}But really, don't you miss home by now? Or… me?\nI… I mean, we've really missed you. - $@c{smile_eclosed}I support you in your dream and everything, but the reality is you're going to lose sooner or later. - $@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. - $I won't mince words or pleasantries with you.\n@c{neutral_eclosed}I'm here to win, plain and simple. - $@c{serious_mhalf_fists}I've learned to maximize my potential by putting all my time into training. - $@c{smile}You get a lot of extra time when you cut out the unnecessary sleep and social interaction. - $@c{serious_mopen_fists}None of that matters anymore, not until I win. - $@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. - $@c{angry_mhalf}Losing is for the weak, and I'm not weak anymore. - $@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? - $@c{smile}You should be proud of how far you made it. Congrats!\nBut it looks like it's the end of your journey. - $@c{smile_eclosed}You've awoken something in me I never knew was there.\nIt seems like all I do now is train. - $@c{smile_ehalf}I hardly even eat or sleep now, I just train my Pokémon all day, getting stronger every time. - $@c{neutral}In fact, I… hardly recognize myself. - $And now, I've finally reached peak performance.\nI don't think anyone could beat me now. - $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. - $@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. - $@c{neutral}I've had some time to reflect on all this.\nThere's a reason this all seems so strange. - $@c{neutral_eclosed}Your dream, my drive to beat you…\nIt's all a part of something greater. - $@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. - $@c{neutral_eclosed}Whether I've fulfilled that purpose I can't say, but I've done everything in my power. - $@c{neutral}This place we ended up in is terrifying… Yet somehow I feel unphased, like I've been here before. - $@c{serious_mhalf_fists}You feel the same, don't you? - $@c{serious}…and it's like something here is speaking to me.\nThis is all the world's known for a long time now. - $Those times we cherished together that seem so recent are nothing but a distant memory. - $@c{neutral_eclosed}Who can say whether they were ever even real in the first place. - $@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. - $@c{serious_smile_fists}I hardly know what any of this means, I just know that it's true. - $@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. - $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. - $@c{smile_eclosed}You know, I keep going around and around in my head… - $@c{smile_ehalf}There's something to all this, why everything seems so strange now… - $@c{smile}You have your dream, and I have this ambition in me… - $I just can't help but feel there's a greater purpose to all this, to what we're doing, you and I. - $@c{smile_eclosed}I think I'm supposed to push you… to your limits. - $@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. - $It's something about this strange and dreadful place… Everything seems so clear… - $This… is all the world's known for a long time now. - $@c{smile_eclosed}It's like I can barely remember the memories we cherished together. - $@c{smile_ehalf}Were they even real? They seem so far away now… - $@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. - $@c{smile_ehalf}I… don't know what all this means… but I feel it's true. - $@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… - $@c{smile_eclosed}Promise me… After you heal the world… Please… come home safe. - $@c{smile_ehalf}…Thank you.` - - }, - }, -}; - - -// Dialogue of the NPCs in the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = PGMdialogue; - -// Dialogue of the endboss of the game when the player character is male (Or unset) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `It appears the time has finally come once again.\nYou know why you have come here, do you not? - $You were drawn here, because you have been here before.\nCountless times. - $Though, perhaps it can be counted.\nTo be precise, this is in fact your 5,643,853rd cycle. - $Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain. - $Until now you have yet to succeed, but I sense a different presence in you this time.\n - $You are the only one here, though it is as if there is… another. - $Will you finally prove a formidable challenge to me?\nThe challenge I have longed for for millennia? - $We begin.`, - "firstStageWin": `I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back. - $Do not disappoint me.`, - "secondStageWin": "…Magnificent." -}; - -// Dialogue of the endboss of the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDialogue; - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now. - $@c{smile}It's over.@d{64} You ended the loop. - $@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once. - $@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it? - $@c{serious_smile_fists}Your legend will always live on in our hearts. - $@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home. - $@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. - $@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop. - $@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once. - $I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget! - $@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts. - $@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place. - $Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?`, - "ending_endless": "Congratulations on reaching the current end!\nMore content is coming soon.", - "ending_name": "Devs" -}; -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; - - -// Dialogue of the named double battles in the game. For when the player is male (or unset). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `Blue: Hey Red, let's show them what we're made of! - $Red: ... - $Blue: This is Pallet Town Power!`, - }, - "victory": { - 1: `Blue: That was a great battle! - $Red: ...`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `Red: ...! - $Blue: He never talks much. - $Blue: But dont let that fool you! He is a champ after all!`, - }, - "victory": { - 1: `Red: ...! - $Blue: Next time we will beat you!`, - }, - }, - "tate_liza_double": { - "encounter": { - 1: `Tate: Are you surprised? - $Liza: We are two gym leaders at once! - $Tate: We are twins! - $Liza: We dont need to talk to understand each other! - $Tate: Twice the power... - $Liza: Can you handle it?`, - }, - "victory": { - 1: `Tate: What? Our combination was perfect! - $Liza: Looks like we need to train more...`, - }, - }, - "liza_tate_double": { - "encounter": { - 1: `Liza: Hihihi... Are you surprised? - $Tate: Yes, we are really two gym leaders at once! - $Liza: This is my twin brother Tate! - $Tate: And this is my twin sister Liza! - $Liza: Don't you think we are a perfect combination?` - }, - "victory": { - 1: `Liza: Are we... - $Tate: ...not as strong as we thought?`, - }, - }, - "wallace_steven_double": { - "encounter": { - 1: `Steven: Wallace, let's show them the power of the champions! - $Wallace: We will show you the power of Hoenn! - $Steven: Let's go!`, - }, - "victory": { - 1: `Steven: That was a great battle! - $Wallace: We will win next time!`, - }, - }, - "steven_wallace_double": { - "encounter": { - 1: `Steven: Do you have any rare Pokémon? - $Wallace: Steven... We are here for a battle, not to show off our Pokémon. - $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! - $Wallace: Steven...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `Alder: We are the strongest trainers in Unova! - $Iris: Fights against strong trainers are the best!`, - }, - "victory": { - 1: `Alder: Wow! You are super strong! - $Iris: We will win next time!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `Iris: Welcome Challenger! I am THE Unova Champion! - $Alder: Iris, aren't you a bit too excited?`, - }, - "victory": { - 1: `Iris: A loss like this is not easy to take... - $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! - $Piers: We bring darkness!`, - }, - "victory": { - 1: `Marnie: You brought light to our darkness! - $Piers: Its too bright...`, - }, - }, - "marnie_piers_double": { - "encounter": { - 1: `Piers: Ready for a concert? - $Marnie: Brother... They are here to fight, not to sing...`, - }, - "victory": { - 1: `Piers: Now that was a great concert! - $Marnie: Brother...`, - }, - }, -}; - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = PGMdoubleBattleDialogue; diff --git a/src/locales/en/egg.ts b/src/locales/en/egg.json similarity index 88% rename from src/locales/en/egg.ts rename to src/locales/en/egg.json index b6e13d26213..8a5e061d883 100644 --- a/src/locales/en/egg.ts +++ b/src/locales/en/egg.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { +{ "egg": "Egg", "greatTier": "Rare", "ultraTier": "Epic", @@ -22,4 +20,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} hatched from the egg!", "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", -} as const; + "moveUPGacha": "Move UP!", + "shinyUPGacha": "Shiny UP!", + "legendaryUPGacha": "UP!" +} \ No newline at end of file diff --git a/src/locales/en/fight-ui-handler.json b/src/locales/en/fight-ui-handler.json new file mode 100644 index 00000000000..35b7f42772a --- /dev/null +++ b/src/locales/en/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "Power", + "accuracy": "Accuracy", + "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", + "passive": "Passive " +} \ No newline at end of file diff --git a/src/locales/en/fight-ui-handler.ts b/src/locales/en/fight-ui-handler.ts deleted file mode 100644 index 8ceb503c34a..00000000000 --- a/src/locales/en/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Power", - "accuracy": "Accuracy", - "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", - "passive": "Passive ", // The space at the end is important -} as const; diff --git a/src/locales/en/filter-bar.json b/src/locales/en/filter-bar.json new file mode 100644 index 00000000000..6e940c6886d --- /dev/null +++ b/src/locales/en/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "Gen", + "typeFilter": "Type", + "caughtFilter": "Caught", + "unlocksFilter": "Unlocks", + "miscFilter": "Misc", + "sortFilter": "Sort", + "all": "All", + "normal": "Not Shiny", + "uncaught": "Uncaught", + "passive": "Passive", + "passiveUnlocked": "Passive - Yes", + "passiveLocked": "Passive - No", + "passiveUnlockable": "Passive - Can Unlock", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction - Yes", + "costReductionLocked": "Cost Reduction - No", + "costReductionUnlockable": "Cost Reduction - Can Unlock", + "favorite": "Favorite", + "isFavorite": "Favorite - Yes", + "notFavorite": "Favorite - No", + "ribbon": "Ribbon", + "hasWon": "Ribbon - Yes", + "hasNotWon": "Ribbon - No", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "egg": "Egg", + "eggPurchasable": "Purchasable Egg", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Yes", + "noPokerus": "Pokérus - No", + "sortByNumber": "No.", + "sortByCost": "Cost", + "sortByCandies": "Candy Count", + "sortByIVs": "IVs", + "sortByName": "Name" +} \ No newline at end of file diff --git a/src/locales/en/game-mode.json b/src/locales/en/game-mode.json new file mode 100644 index 00000000000..e5a4975cc40 --- /dev/null +++ b/src/locales/en/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "Classic", + "endless": "Endless", + "endlessSpliced": "Endless (Spliced)", + "dailyRun": "Daily Run", + "unknown": "Unknown", + "challenge": "Challenge" +} \ No newline at end of file diff --git a/src/locales/en/game-mode.ts b/src/locales/en/game-mode.ts deleted file mode 100644 index 903f1a63072..00000000000 --- a/src/locales/en/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "Classic", - "endless": "Endless", - "endlessSpliced": "Endless (Spliced)", - "dailyRun": "Daily Run", - "unknown": "Unknown", - "challenge": "Challenge", -} as const; diff --git a/src/locales/es/game-stats-ui-handler.ts b/src/locales/en/game-stats-ui-handler.json similarity index 86% rename from src/locales/es/game-stats-ui-handler.ts rename to src/locales/en/game-stats-ui-handler.json index 06b2211b0dd..a7beefeabd8 100644 --- a/src/locales/es/game-stats-ui-handler.ts +++ b/src/locales/en/game-stats-ui-handler.json @@ -1,44 +1,42 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Stats", - "playTime": "Play Time", - "totalBattles": "Total Battles", - "starters": "Starters", - "shinyStarters": "Shiny Starters", - "speciesSeen": "Species Seen", - "speciesCaught": "Species Caught", - "ribbonsOwned": "Ribbons Owned", - "classicRuns": "Classic Runs", - "classicWins": "Classic Wins", - "dailyRunAttempts": "Daily Run Attempts", - "dailyRunWins": "Daily Run Wins", - "endlessRuns": "Endless Runs", - "highestWaveEndless": "Highest Wave (Endless)", - "highestMoney": "Highest Money", - "highestDamage": "Highest Damage", - "highestHPHealed": "Highest HP Healed", - "pokemonEncountered": "Pokémon Encountered", - "pokemonDefeated": "Pokémon Defeated", - "pokemonCaught": "Pokémon Caught", - "eggsHatched": "Eggs Hatched", - "subLegendsSeen": "Sub-Legends Seen", - "subLegendsCaught": "Sub-Legends Caught", - "subLegendsHatched": "Sub-Legends Hatched", - "legendsSeen": "Legends Seen", - "legendsCaught": "Legends Caught", - "legendsHatched": "Legends Hatched", - "mythicalsSeen": "Mythicals Seen", - "mythicalsCaught": "Mythicals Caught", - "mythicalsHatched": "Mythicals Hatched", - "shiniesSeen": "Shinies Seen", - "shiniesCaught": "Shinies Caught", - "shiniesHatched": "Shinies Hatched", - "pokemonFused": "Pokémon Fused", - "trainersDefeated": "Trainers Defeated", - "eggsPulled": "Eggs Pulled", - "rareEggsPulled": "Rare Eggs Pulled", - "epicEggsPulled": "Epic Eggs Pulled", - "legendaryEggsPulled": "Legendary Eggs Pulled", - "manaphyEggsPulled": "Manaphy Eggs Pulled", -} as const; +{ + "stats": "Stats", + "playTime": "Play Time", + "totalBattles": "Total Battles", + "starters": "Starters", + "shinyStarters": "Shiny Starters", + "speciesSeen": "Species Seen", + "speciesCaught": "Species Caught", + "ribbonsOwned": "Ribbons Owned", + "classicRuns": "Classic Runs", + "classicWins": "Classic Wins", + "dailyRunAttempts": "Daily Run Attempts", + "dailyRunWins": "Daily Run Wins", + "endlessRuns": "Endless Runs", + "highestWaveEndless": "Highest Wave (Endless)", + "highestMoney": "Highest Money", + "highestDamage": "Highest Damage", + "highestHPHealed": "Highest HP Healed", + "pokemonEncountered": "Pokémon Encountered", + "pokemonDefeated": "Pokémon Defeated", + "pokemonCaught": "Pokémon Caught", + "eggsHatched": "Eggs Hatched", + "subLegendsSeen": "Sub-Legends Seen", + "subLegendsCaught": "Sub-Legends Caught", + "subLegendsHatched": "Sub-Legends Hatched", + "legendsSeen": "Legends Seen", + "legendsCaught": "Legends Caught", + "legendsHatched": "Legends Hatched", + "mythicalsSeen": "Mythicals Seen", + "mythicalsCaught": "Mythicals Caught", + "mythicalsHatched": "Mythicals Hatched", + "shiniesSeen": "Shinies Seen", + "shiniesCaught": "Shinies Caught", + "shiniesHatched": "Shinies Hatched", + "pokemonFused": "Pokémon Fused", + "trainersDefeated": "Trainers Defeated", + "eggsPulled": "Eggs Pulled", + "rareEggsPulled": "Rare Eggs Pulled", + "epicEggsPulled": "Epic Eggs Pulled", + "legendaryEggsPulled": "Legendary Eggs Pulled", + "manaphyEggsPulled": "Manaphy Eggs Pulled" +} diff --git a/src/locales/en/game-stats-ui-handler.ts b/src/locales/en/game-stats-ui-handler.ts deleted file mode 100644 index 06b2211b0dd..00000000000 --- a/src/locales/en/game-stats-ui-handler.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Stats", - "playTime": "Play Time", - "totalBattles": "Total Battles", - "starters": "Starters", - "shinyStarters": "Shiny Starters", - "speciesSeen": "Species Seen", - "speciesCaught": "Species Caught", - "ribbonsOwned": "Ribbons Owned", - "classicRuns": "Classic Runs", - "classicWins": "Classic Wins", - "dailyRunAttempts": "Daily Run Attempts", - "dailyRunWins": "Daily Run Wins", - "endlessRuns": "Endless Runs", - "highestWaveEndless": "Highest Wave (Endless)", - "highestMoney": "Highest Money", - "highestDamage": "Highest Damage", - "highestHPHealed": "Highest HP Healed", - "pokemonEncountered": "Pokémon Encountered", - "pokemonDefeated": "Pokémon Defeated", - "pokemonCaught": "Pokémon Caught", - "eggsHatched": "Eggs Hatched", - "subLegendsSeen": "Sub-Legends Seen", - "subLegendsCaught": "Sub-Legends Caught", - "subLegendsHatched": "Sub-Legends Hatched", - "legendsSeen": "Legends Seen", - "legendsCaught": "Legends Caught", - "legendsHatched": "Legends Hatched", - "mythicalsSeen": "Mythicals Seen", - "mythicalsCaught": "Mythicals Caught", - "mythicalsHatched": "Mythicals Hatched", - "shiniesSeen": "Shinies Seen", - "shiniesCaught": "Shinies Caught", - "shiniesHatched": "Shinies Hatched", - "pokemonFused": "Pokémon Fused", - "trainersDefeated": "Trainers Defeated", - "eggsPulled": "Eggs Pulled", - "rareEggsPulled": "Rare Eggs Pulled", - "epicEggsPulled": "Epic Eggs Pulled", - "legendaryEggsPulled": "Legendary Eggs Pulled", - "manaphyEggsPulled": "Manaphy Eggs Pulled", -} as const; diff --git a/src/locales/en/growth.ts b/src/locales/en/growth.json similarity index 54% rename from src/locales/en/growth.ts rename to src/locales/en/growth.json index 410355b143b..d472343d3eb 100644 --- a/src/locales/en/growth.ts +++ b/src/locales/en/growth.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { +{ "Erratic": "Erratic", "Fast": "Fast", "Medium_Fast": "Medium Fast", "Medium_Slow": "Medium Slow", "Slow": "Slow", "Fluctuating": "Fluctuating" -} as const; +} \ No newline at end of file diff --git a/src/locales/en/menu-ui-handler.ts b/src/locales/en/menu-ui-handler.json similarity index 68% rename from src/locales/en/menu-ui-handler.ts rename to src/locales/en/menu-ui-handler.json index 97d6e38a099..0536fa12c2e 100644 --- a/src/locales/en/menu-ui-handler.ts +++ b/src/locales/en/menu-ui-handler.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { +{ "GAME_SETTINGS": "Game Settings", "ACHIEVEMENTS": "Achievements", "STATS": "Stats", - "VOUCHERS": "Vouchers", + "RUN_HISTORY": "Run History", "EGG_LIST": "Egg List", "EGG_GACHA": "Egg Gacha", "MANAGE_DATA": "Manage Data", @@ -16,9 +14,17 @@ export const menuUiHandler: SimpleTranslationEntries = { "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", "importData": "Import Data", "exportData": "Export Data", + "consentPreferences": "Consent Preferences", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "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!" -} as const; +} \ No newline at end of file diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.json similarity index 87% rename from src/locales/en/menu.ts rename to src/locales/en/menu.json index 47d19bd56b6..91888e9db31 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.json @@ -1,11 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const menu: SimpleTranslationEntries = { +{ "cancel": "Cancel", "continue": "Continue", "dailyRun": "Daily Run (Beta)", @@ -17,6 +10,7 @@ export const menu: SimpleTranslationEntries = { "username": "Username", "password": "Password", "login": "Login", + "orUse": "Or use", "register": "Register", "emptyUsername": "Username must not be empty", "invalidLoginUsername": "The provided username is invalid", @@ -49,10 +43,15 @@ export const menu: SimpleTranslationEntries = { "loading": "Loading…", "loadingAsset": "Loading asset: {{assetName}}", "playersOnline": "Players Online", - "yes":"Yes", - "no":"No", + "yes": "Yes", + "no": "No", "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", "choosePokemon": "Choose a Pokémon.", + "renamePokemon": "Rename Pokémon", + "rename": "Rename", + "nickname": "Nickname", "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", -} as const; + "noSaves": "You don't have any save files on record!", + "tooManySaves": "You have too many save files on record!" +} \ No newline at end of file diff --git a/src/locales/en/modifier-select-ui-handler.json b/src/locales/en/modifier-select-ui-handler.json new file mode 100644 index 00000000000..bc49ce25931 --- /dev/null +++ b/src/locales/en/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "Transfer", + "reroll": "Reroll", + "lockRarities": "Lock Rarities", + "checkTeam": "Check Team", + "transferDesc": "Transfer a held item from one Pokémon to another.", + "rerollDesc": "Spend money to reroll your item options.", + "lockRaritiesDesc": "Lock item rarities on reroll (affects reroll cost).", + "checkTeamDesc": "Check your team or use a form changing item.", + "rerollCost": "₽{{formattedMoney}}", + "itemCost": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/en/modifier-type.json b/src/locales/en/modifier-type.json new file mode 100644 index 00000000000..babad57b81b --- /dev/null +++ b/src/locales/en/modifier-type.json @@ -0,0 +1,446 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{modifierCount}}x {{pokeballName}}", + "description": "Receive {{pokeballName}} x{{modifierCount}} (Inventory: {{pokeballAmount}}) \nCatch Rate: {{catchRate}}" + }, + "AddVoucherModifierType": { + "name": "{{modifierCount}}x {{voucherTypeName}}", + "description": "Receive {{voucherTypeName}} x{{modifierCount}}." + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}} can't take\nthis item!", + "tooMany": "{{pokemonName}} has too many\nof this item!" + } + }, + "PokemonHpRestoreModifierType": { + "description": "Restores {{restorePoints}} HP or {{restorePercent}}% HP for one Pokémon, whichever is higher.", + "extra": { + "fully": "Fully restores HP for one Pokémon.", + "fullyWithStatus": "Fully restores HP for one Pokémon and heals any status ailment." + } + }, + "PokemonReviveModifierType": { + "description": "Revives one Pokémon and restores {{restorePercent}}% HP." + }, + "PokemonStatusHealModifierType": { + "description": "Heals any status ailment for one Pokémon." + }, + "PokemonPpRestoreModifierType": { + "description": "Restores {{restorePoints}} PP for one Pokémon move.", + "extra": { + "fully": "Restores all PP for one Pokémon move." + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "Restores {{restorePoints}} PP for all of one Pokémon's moves.", + "extra": { + "fully": "Restores all PP for all of one Pokémon's moves." + } + }, + "PokemonPpUpModifierType": { + "description": "Permanently increases PP for one Pokémon move by {{upPoints}} for every 5 maximum PP (maximum 3)." + }, + "PokemonNatureChangeModifierType": { + "name": "{{natureName}} Mint", + "description": "Changes a Pokémon's nature to {{natureName}} and permanently unlocks the nature for the starter." + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "Quadruples the chance of an encounter being a double battle for up to {{battleCount}} battles." + }, + "TempStatStageBoosterModifierType": { + "description": "Increases the {{stat}} of all party members by {{amount}} for up to 5 battles.", + "extra": { + "stage": "1 stage", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "Increases the power of a Pokémon's {{moveType}}-type moves by 20%." + }, + "PokemonLevelIncrementModifierType": { + "description": "Increases a Pokémon's level by {{levels}}." + }, + "AllPokemonLevelIncrementModifierType": { + "description": "Increases all party members' level by {{levels}}." + }, + "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." + }, + "AllPokemonFullReviveModifierType": { + "description": "Revives all fainted Pokémon, fully restoring HP." + }, + "MoneyRewardModifierType": { + "description": "Grants a {{moneyMultiplier}} amount of money (₽{{moneyAmount}}).", + "extra": { + "small": "small", + "moderate": "moderate", + "large": "large" + } + }, + "ExpBoosterModifierType": { + "description": "Increases gain of EXP. Points by {{boostPercent}}%." + }, + "PokemonExpBoosterModifierType": { + "description": "Increases the holder's gain of EXP. Points by {{boostPercent}}%." + }, + "PokemonFriendshipBoosterModifierType": { + "description": "Increases friendship gain per victory by 50%." + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "Increases move accuracy by {{accuracyAmount}} (maximum 100)." + }, + "PokemonMultiHitModifierType": { + "description": "Attacks hit one additional time at the cost of a 60/75/82.5% power reduction per stack respectively." + }, + "TmModifierType": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "Teach {{moveName}} to a Pokémon." + }, + "TmModifierTypeWithInfo": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "Teach {{moveName}} to a Pokémon\n(Hold C or Shift for more info)." + }, + "EvolutionItemModifierType": { + "description": "Causes certain Pokémon to evolve." + }, + "FormChangeItemModifierType": { + "description": "Causes certain Pokémon to change form." + }, + "FusePokemonModifierType": { + "description": "Combines two Pokémon (transfers Ability, splits base stats and types, shares move pool)." + }, + "TerastallizeModifierType": { + "name": "{{teraType}} Tera Shard", + "description": "{{teraType}} Terastallizes the holder for up to 10 battles." + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "Upon attacking, there is a {{chancePercent}}% chance the foe's held item will be stolen." + }, + "TurnHeldItemTransferModifierType": { + "description": "Every turn, the holder acquires one held item from the foe." + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "Adds a {{chancePercent}}% chance to inflict {{statusEffect}} with attack moves." + }, + "EnemyEndureChanceModifierType": { + "description": "Adds a {{chancePercent}}% chance of enduring a hit." + }, + + "RARE_CANDY": { "name": "Rare Candy" }, + "RARER_CANDY": { "name": "Rarer Candy" }, + + "MEGA_BRACELET": { "name": "Mega Bracelet", "description": "Mega Stones become available." }, + "DYNAMAX_BAND": { "name": "Dynamax Band", "description": "Max Mushrooms become available." }, + "TERA_ORB": { "name": "Tera Orb", "description": "Tera Shards become available." }, + + "MAP": { "name": "Map", "description": "Allows you to choose your destination at a crossroads." }, + + "POTION": { "name": "Potion" }, + "SUPER_POTION": { "name": "Super Potion" }, + "HYPER_POTION": { "name": "Hyper Potion" }, + "MAX_POTION": { "name": "Max Potion" }, + "FULL_RESTORE": { "name": "Full Restore" }, + + "REVIVE": { "name": "Revive" }, + "MAX_REVIVE": { "name": "Max Revive" }, + + "FULL_HEAL": { "name": "Full Heal" }, + + "SACRED_ASH": { "name": "Sacred Ash" }, + + "REVIVER_SEED": { "name": "Reviver Seed", "description": "Revives the holder for 1/2 HP upon fainting from a direct hit." }, + + "WHITE_HERB": { "name": "White Herb", "description": "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + + "ETHER": { "name": "Ether" }, + "MAX_ETHER": { "name": "Max Ether" }, + + "ELIXIR": { "name": "Elixir" }, + "MAX_ELIXIR": { "name": "Max Elixir" }, + + "PP_UP": { "name": "PP Up" }, + "PP_MAX": { "name": "PP Max" }, + + "LURE": { "name": "Lure" }, + "SUPER_LURE": { "name": "Super Lure" }, + "MAX_LURE": { "name": "Max Lure" }, + + "MEMORY_MUSHROOM": { "name": "Memory Mushroom", "description": "Recall one Pokémon's forgotten move." }, + + "EXP_SHARE": { "name": "EXP. All", "description": "Non-participants receive 20% of a single participant's EXP. Points." }, + "EXP_BALANCE": { "name": "EXP. Balance", "description": "Weighs EXP. Points received from battles towards lower-leveled party members." }, + + "OVAL_CHARM": { "name": "Oval Charm", "description": "When multiple Pokémon participate in a battle, each gets an extra 10% of the total EXP." }, + + "EXP_CHARM": { "name": "EXP. Charm" }, + "SUPER_EXP_CHARM": { "name": "Super EXP. Charm" }, + "GOLDEN_EXP_CHARM": { "name": "Golden EXP. Charm" }, + + "LUCKY_EGG": { "name": "Lucky Egg" }, + "GOLDEN_EGG": { "name": "Golden Egg" }, + + "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." }, + + "SOUL_DEW": { "name": "Soul Dew", "description": "Increases the influence of a Pokémon's nature on its stats by 10% (additive)." }, + + "NUGGET": { "name": "Nugget" }, + "BIG_NUGGET": { "name": "Big Nugget" }, + "RELIC_GOLD": { "name": "Relic Gold" }, + + "AMULET_COIN": { "name": "Amulet Coin", "description": "Increases money rewards by 20%." }, + "GOLDEN_PUNCH": { "name": "Golden Punch", "description": "Grants 50% of direct damage inflicted as money." }, + "COIN_CASE": { "name": "Coin Case", "description": "After every 10th battle, receive 10% of your money in interest." }, + + "LOCK_CAPSULE": { "name": "Lock Capsule", "description": "Allows you to lock item rarities when rerolling items." }, + + "GRIP_CLAW": { "name": "Grip Claw" }, + "WIDE_LENS": { "name": "Wide Lens" }, + + "MULTI_LENS": { "name": "Multi Lens" }, + + "HEALING_CHARM": { "name": "Healing Charm", "description": "Increases the effectiveness of HP restoring moves and items by 10% (excludes Revives)." }, + "CANDY_JAR": { "name": "Candy Jar", "description": "Increases the number of levels added by Rare Candy items by 1." }, + + "BERRY_POUCH": { "name": "Berry Pouch", "description": "Adds a 30% chance that a used berry will not be consumed." }, + + "FOCUS_BAND": { "name": "Focus Band", "description": "Adds a 10% chance to survive with 1 HP after being damaged enough to faint." }, + + "QUICK_CLAW": { "name": "Quick Claw", "description": "Adds a 10% chance to move first regardless of speed (after priority)." }, + + "KINGS_ROCK": { "name": "King's Rock", "description": "Adds a 10% chance an attack move will cause the opponent to flinch." }, + + "LEFTOVERS": { "name": "Leftovers", "description": "Heals 1/16 of a Pokémon's maximum HP every turn." }, + "SHELL_BELL": { "name": "Shell Bell", "description": "Heals 1/8 of a Pokémon's dealt damage." }, + + "TOXIC_ORB": { "name": "Toxic Orb", "description": "It's a bizarre orb that exudes toxins when touched and will badly poison the holder during battle." }, + "FLAME_ORB": { "name": "Flame Orb", "description": "It's a bizarre orb that gives off heat when touched and will affect the holder with a burn during battle." }, + + "BATON": { "name": "Baton", "description": "Allows passing along effects when switching Pokémon, which also bypasses traps." }, + + "SHINY_CHARM": { "name": "Shiny Charm", "description": "Dramatically increases the chance of a wild Pokémon being Shiny." }, + "ABILITY_CHARM": { "name": "Ability Charm", "description": "Dramatically increases the chance of a wild Pokémon having a Hidden Ability." }, + + "IV_SCANNER": { "name": "IV Scanner", "description": "Allows scanning the IVs of wild Pokémon. 2 IVs are revealed per stack. The best IVs are shown first." }, + + "DNA_SPLICERS": { "name": "DNA Splicers" }, + + "MINI_BLACK_HOLE": { "name": "Mini Black Hole" }, + + "GOLDEN_POKEBALL": { "name": "Golden Poké Ball", "description": "Adds 1 extra item option at the end of every battle." }, + + "ENEMY_DAMAGE_BOOSTER": { "name": "Damage Token", "description": "Increases damage by 5%." }, + "ENEMY_DAMAGE_REDUCTION": { "name": "Protection Token", "description": "Reduces incoming damage by 2.5%." }, + "ENEMY_HEAL": { "name": "Recovery Token", "description": "Heals 2% of max HP every turn." }, + "ENEMY_ATTACK_POISON_CHANCE": { "name": "Poison Token" }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { "name": "Paralyze Token" }, + "ENEMY_ATTACK_BURN_CHANCE": { "name": "Burn Token" }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Full Heal Token", "description": "Adds a 2.5% chance every turn to heal a status condition." }, + "ENEMY_ENDURE_CHANCE": { "name": "Endure Token" }, + "ENEMY_FUSED_CHANCE": { "name": "Fusion Token", "description": "Adds a 1% chance that a wild Pokémon will be a fusion." } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { "name": "Light Ball", "description": "It's a mysterious orb that boosts Pikachu's Attack and Sp. Atk stats." }, + "THICK_CLUB": { "name": "Thick Club", "description": "This hard bone of unknown origin boosts Cubone or Marowak's Attack stat." }, + "METAL_POWDER": { "name": "Metal Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." }, + "QUICK_POWDER": { "name": "Quick Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." } + }, + "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" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "Silk Scarf", + "black_belt": "Black Belt", + "sharp_beak": "Sharp Beak", + "poison_barb": "Poison Barb", + "soft_sand": "Soft Sand", + "hard_stone": "Hard Stone", + "silver_powder": "Silver Powder", + "spell_tag": "Spell Tag", + "metal_coat": "Metal Coat", + "charcoal": "Charcoal", + "mystic_water": "Mystic Water", + "miracle_seed": "Miracle Seed", + "magnet": "Magnet", + "twisted_spoon": "Twisted Spoon", + "never_melt_ice": "Never-Melt Ice", + "dragon_fang": "Dragon Fang", + "black_glasses": "Black Glasses", + "fairy_feather": "Fairy Feather" + }, + "BaseStatBoosterItem": { + "hp_up": "HP Up", + "protein": "Protein", + "iron": "Iron", + "calcium": "Calcium", + "zinc": "Zinc", + "carbos": "Carbos" + }, + "EvolutionItem": { + "NONE": "None", + + "LINKING_CORD": "Linking Cord", + "SUN_STONE": "Sun Stone", + "MOON_STONE": "Moon Stone", + "LEAF_STONE": "Leaf Stone", + "FIRE_STONE": "Fire Stone", + "WATER_STONE": "Water Stone", + "THUNDER_STONE": "Thunder Stone", + "ICE_STONE": "Ice Stone", + "DUSK_STONE": "Dusk Stone", + "DAWN_STONE": "Dawn Stone", + "SHINY_STONE": "Shiny Stone", + "CRACKED_POT": "Cracked Pot", + "SWEET_APPLE": "Sweet Apple", + "TART_APPLE": "Tart Apple", + "STRAWBERRY_SWEET": "Strawberry Sweet", + "UNREMARKABLE_TEACUP": "Unremarkable Teacup", + + "CHIPPED_POT": "Chipped Pot", + "BLACK_AUGURITE": "Black Augurite", + "GALARICA_CUFF": "Galarica Cuff", + "GALARICA_WREATH": "Galarica Wreath", + "PEAT_BLOCK": "Peat Block", + "AUSPICIOUS_ARMOR": "Auspicious Armor", + "MALICIOUS_ARMOR": "Malicious Armor", + "MASTERPIECE_TEACUP": "Masterpiece Teacup", + "METAL_ALLOY": "Metal Alloy", + "SCROLL_OF_DARKNESS": "Scroll Of Darkness", + "SCROLL_OF_WATERS": "Scroll Of Waters", + "SYRUPY_APPLE": "Syrupy Apple" + }, + "FormChangeItem": { + "NONE": "None", + + "ABOMASITE": "Abomasite", + "ABSOLITE": "Absolite", + "AERODACTYLITE": "Aerodactylite", + "AGGRONITE": "Aggronite", + "ALAKAZITE": "Alakazite", + "ALTARIANITE": "Altarianite", + "AMPHAROSITE": "Ampharosite", + "AUDINITE": "Audinite", + "BANETTITE": "Banettite", + "BEEDRILLITE": "Beedrillite", + "BLASTOISINITE": "Blastoisinite", + "BLAZIKENITE": "Blazikenite", + "CAMERUPTITE": "Cameruptite", + "CHARIZARDITE_X": "Charizardite X", + "CHARIZARDITE_Y": "Charizardite Y", + "DIANCITE": "Diancite", + "GALLADITE": "Galladite", + "GARCHOMPITE": "Garchompite", + "GARDEVOIRITE": "Gardevoirite", + "GENGARITE": "Gengarite", + "GLALITITE": "Glalitite", + "GYARADOSITE": "Gyaradosite", + "HERACRONITE": "Heracronite", + "HOUNDOOMINITE": "Houndoominite", + "KANGASKHANITE": "Kangaskhanite", + "LATIASITE": "Latiasite", + "LATIOSITE": "Latiosite", + "LOPUNNITE": "Lopunnite", + "LUCARIONITE": "Lucarionite", + "MANECTITE": "Manectite", + "MAWILITE": "Mawilite", + "MEDICHAMITE": "Medichamite", + "METAGROSSITE": "Metagrossite", + "MEWTWONITE_X": "Mewtwonite X", + "MEWTWONITE_Y": "Mewtwonite Y", + "PIDGEOTITE": "Pidgeotite", + "PINSIRITE": "Pinsirite", + "RAYQUAZITE": "Rayquazite", + "SABLENITE": "Sablenite", + "SALAMENCITE": "Salamencite", + "SCEPTILITE": "Sceptilite", + "SCIZORITE": "Scizorite", + "SHARPEDONITE": "Sharpedonite", + "SLOWBRONITE": "Slowbronite", + "STEELIXITE": "Steelixite", + "SWAMPERTITE": "Swampertite", + "TYRANITARITE": "Tyranitarite", + "VENUSAURITE": "Venusaurite", + + "BLUE_ORB": "Blue Orb", + "RED_ORB": "Red Orb", + "SHARP_METEORITE": "Sharp Meteorite", + "HARD_METEORITE": "Hard Meteorite", + "SMOOTH_METEORITE": "Smooth Meteorite", + "ADAMANT_CRYSTAL": "Adamant Crystal", + "LUSTROUS_GLOBE": "Lustrous Globe", + "GRISEOUS_CORE": "Griseous Core", + "REVEAL_GLASS": "Reveal Glass", + "GRACIDEA": "Gracidea", + "MAX_MUSHROOMS": "Max Mushrooms", + "DARK_STONE": "Dark Stone", + "LIGHT_STONE": "Light Stone", + "PRISON_BOTTLE": "Prison Bottle", + "N_LUNARIZER": "N Lunarizer", + "N_SOLARIZER": "N Solarizer", + "RUSTED_SWORD": "Rusted Sword", + "RUSTED_SHIELD": "Rusted Shield", + "ICY_REINS_OF_UNITY": "Icy Reins Of Unity", + "SHADOW_REINS_OF_UNITY": "Shadow Reins Of Unity", + "WELLSPRING_MASK": "Wellspring Mask", + "HEARTHFLAME_MASK": "Hearthflame Mask", + "CORNERSTONE_MASK": "Cornerstone Mask", + "SHOCK_DRIVE": "Shock Drive", + "BURN_DRIVE": "Burn Drive", + "CHILL_DRIVE": "Chill Drive", + "DOUSE_DRIVE": "Douse Drive", + "ULTRANECROZIUM_Z": "Ultranecrozium Z", + + "FIST_PLATE": "Fist Plate", + "SKY_PLATE": "Sky Plate", + "TOXIC_PLATE": "Toxic Plate", + "EARTH_PLATE": "Earth Plate", + "STONE_PLATE": "Stone Plate", + "INSECT_PLATE": "Insect Plate", + "SPOOKY_PLATE": "Spooky Plate", + "IRON_PLATE": "Iron Plate", + "FLAME_PLATE": "Flame Plate", + "SPLASH_PLATE": "Splash Plate", + "MEADOW_PLATE": "Meadow Plate", + "ZAP_PLATE": "Zap Plate", + "MIND_PLATE": "Mind Plate", + "ICICLE_PLATE": "Icicle Plate", + "DRACO_PLATE": "Draco Plate", + "DREAD_PLATE": "Dread Plate", + "PIXIE_PLATE": "Pixie Plate", + "BLANK_PLATE": "Blank Plate", + "LEGEND_PLATE": "Legend Plate", + "FIGHTING_MEMORY": "Fighting Memory", + "FLYING_MEMORY": "Flying Memory", + "POISON_MEMORY": "Poison Memory", + "GROUND_MEMORY": "Ground Memory", + "ROCK_MEMORY": "Rock Memory", + "BUG_MEMORY": "Bug Memory", + "GHOST_MEMORY": "Ghost Memory", + "STEEL_MEMORY": "Steel Memory", + "FIRE_MEMORY": "Fire Memory", + "WATER_MEMORY": "Water Memory", + "GRASS_MEMORY": "Grass Memory", + "ELECTRIC_MEMORY": "Electric Memory", + "PSYCHIC_MEMORY": "Psychic Memory", + "ICE_MEMORY": "Ice Memory", + "DRAGON_MEMORY": "Dragon Memory", + "DARK_MEMORY": "Dark Memory", + "FAIRY_MEMORY": "Fairy Memory", + "NORMAL_MEMORY": "Normal Memory" + } +} diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts deleted file mode 100644 index 09d9baea6fb..00000000000 --- a/src/locales/en/modifier-type.ts +++ /dev/null @@ -1,451 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - "AddPokeballModifierType": { - name: "{{modifierCount}}x {{pokeballName}}", - description: "Receive {{pokeballName}} x{{modifierCount}} (Inventory: {{pokeballAmount}}) \nCatch Rate: {{catchRate}}", - }, - "AddVoucherModifierType": { - name: "{{modifierCount}}x {{voucherTypeName}}", - description: "Receive {{voucherTypeName}} x{{modifierCount}}.", - }, - "PokemonHeldItemModifierType": { - extra: { - "inoperable": "{{pokemonName}} can't take\nthis item!", - "tooMany": "{{pokemonName}} has too many\nof this item!", - } - }, - "PokemonHpRestoreModifierType": { - description: "Restores {{restorePoints}} HP or {{restorePercent}}% HP for one Pokémon, whichever is higher.", - extra: { - "fully": "Fully restores HP for one Pokémon.", - "fullyWithStatus": "Fully restores HP for one Pokémon and heals any status ailment.", - } - }, - "PokemonReviveModifierType": { - description: "Revives one Pokémon and restores {{restorePercent}}% HP.", - }, - "PokemonStatusHealModifierType": { - description: "Heals any status ailment for one Pokémon.", - }, - "PokemonPpRestoreModifierType": { - description: "Restores {{restorePoints}} PP for one Pokémon move.", - extra: { - "fully": "Restores all PP for one Pokémon move.", - } - }, - "PokemonAllMovePpRestoreModifierType": { - description: "Restores {{restorePoints}} PP for all of one Pokémon's moves.", - extra: { - "fully": "Restores all PP for all of one Pokémon's moves.", - } - }, - "PokemonPpUpModifierType": { - description: "Permanently increases PP for one Pokémon move by {{upPoints}} for every 5 maximum PP (maximum 3).", - }, - "PokemonNatureChangeModifierType": { - name: "{{natureName}} Mint", - description: "Changes a Pokémon's nature to {{natureName}} and permanently unlocks the nature for the starter.", - }, - "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.", - }, - "AttackTypeBoosterModifierType": { - description: "Increases the power of a Pokémon's {{moveType}}-type moves by 20%.", - }, - "PokemonLevelIncrementModifierType": { - description: "Increases a Pokémon's level by 1.", - }, - "AllPokemonLevelIncrementModifierType": { - description: "Increases all party members' level by 1.", - }, - "PokemonBaseStatBoosterModifierType": { - description: "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit.", - }, - "AllPokemonFullHpRestoreModifierType": { - description: "Restores 100% HP for all Pokémon.", - }, - "AllPokemonFullReviveModifierType": { - description: "Revives all fainted Pokémon, fully restoring HP.", - }, - "MoneyRewardModifierType": { - description: "Grants a {{moneyMultiplier}} amount of money (₽{{moneyAmount}}).", - extra: { - "small": "small", - "moderate": "moderate", - "large": "large", - }, - }, - "ExpBoosterModifierType": { - description: "Increases gain of EXP. Points by {{boostPercent}}%.", - }, - "PokemonExpBoosterModifierType": { - description: "Increases the holder's gain of EXP. Points by {{boostPercent}}%.", - }, - "PokemonFriendshipBoosterModifierType": { - description: "Increases friendship gain per victory by 50%.", - }, - "PokemonMoveAccuracyBoosterModifierType": { - description: "Increases move accuracy by {{accuracyAmount}} (maximum 100).", - }, - "PokemonMultiHitModifierType": { - description: "Attacks hit one additional time at the cost of a 60/75/82.5% power reduction per stack respectively.", - }, - "TmModifierType": { - name: "TM{{moveId}} - {{moveName}}", - description: "Teach {{moveName}} to a Pokémon.", - }, - "TmModifierTypeWithInfo": { - name: "TM{{moveId}} - {{moveName}}", - description: "Teach {{moveName}} to a Pokémon\n(Hold C or Shift for more info).", - }, - "EvolutionItemModifierType": { - description: "Causes certain Pokémon to evolve.", - }, - "FormChangeItemModifierType": { - description: "Causes certain Pokémon to change form.", - }, - "FusePokemonModifierType": { - description: "Combines two Pokémon (transfers Ability, splits base stats and types, shares move pool).", - }, - "TerastallizeModifierType": { - name: "{{teraType}} Tera Shard", - description: "{{teraType}} Terastallizes the holder for up to 10 battles.", - }, - "ContactHeldItemTransferChanceModifierType": { - description: "Upon attacking, there is a {{chancePercent}}% chance the foe's held item will be stolen.", - }, - "TurnHeldItemTransferModifierType": { - description: "Every turn, the holder acquires one held item from the foe.", - }, - "EnemyAttackStatusEffectChanceModifierType": { - description: "Adds a {{chancePercent}}% chance to inflict {{statusEffect}} with attack moves.", - }, - "EnemyEndureChanceModifierType": { - description: "Adds a {{chancePercent}}% chance of enduring a hit.", - }, - - "RARE_CANDY": { name: "Rare Candy" }, - "RARER_CANDY": { name: "Rarer Candy" }, - - "MEGA_BRACELET": { name: "Mega Bracelet", description: "Mega Stones become available." }, - "DYNAMAX_BAND": { name: "Dynamax Band", description: "Max Mushrooms become available." }, - "TERA_ORB": { name: "Tera Orb", description: "Tera Shards become available." }, - - "MAP": { name: "Map", description: "Allows you to choose your destination at a crossroads." }, - - "POTION": { name: "Potion" }, - "SUPER_POTION": { name: "Super Potion" }, - "HYPER_POTION": { name: "Hyper Potion" }, - "MAX_POTION": { name: "Max Potion" }, - "FULL_RESTORE": { name: "Full Restore" }, - - "REVIVE": { name: "Revive" }, - "MAX_REVIVE": { name: "Max Revive" }, - - "FULL_HEAL": { name: "Full Heal" }, - - "SACRED_ASH": { name: "Sacred Ash" }, - - "REVIVER_SEED": { name: "Reviver Seed", description: "Revives the holder for 1/2 HP upon fainting." }, - - "ETHER": { name: "Ether" }, - "MAX_ETHER": { name: "Max Ether" }, - - "ELIXIR": { name: "Elixir" }, - "MAX_ELIXIR": { name: "Max Elixir" }, - - "PP_UP": { name: "PP Up" }, - "PP_MAX": { name: "PP Max" }, - - "LURE": { name: "Lure" }, - "SUPER_LURE": { name: "Super Lure" }, - "MAX_LURE": { name: "Max Lure" }, - - "MEMORY_MUSHROOM": { name: "Memory Mushroom", description: "Recall one Pokémon's forgotten move." }, - - "EXP_SHARE": { name: "EXP. All", description: "Non-participants receive 20% of a single participant's EXP. Points." }, - "EXP_BALANCE": { name: "EXP. Balance", description: "Weighs EXP. Points received from battles towards lower-leveled party members." }, - - "OVAL_CHARM": { name: "Oval Charm", description: "When multiple Pokémon participate in a battle, each gets an extra 10% of the total EXP." }, - - "EXP_CHARM": { name: "EXP. Charm" }, - "SUPER_EXP_CHARM": { name: "Super EXP. Charm" }, - "GOLDEN_EXP_CHARM": { name: "Golden EXP. Charm" }, - - "LUCKY_EGG": { name: "Lucky Egg" }, - "GOLDEN_EGG": { name: "Golden Egg" }, - - "SOOTHE_BELL": { name: "Soothe Bell" }, - - "EVIOLITE": { name: "Eviolite", description: "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." }, - - "SOUL_DEW": { name: "Soul Dew", description: "Increases the influence of a Pokémon's nature on its stats by 10% (additive)." }, - - "NUGGET": { name: "Nugget" }, - "BIG_NUGGET": { name: "Big Nugget" }, - "RELIC_GOLD": { name: "Relic Gold" }, - - "AMULET_COIN": { name: "Amulet Coin", description: "Increases money rewards by 20%." }, - "GOLDEN_PUNCH": { name: "Golden Punch", description: "Grants 50% of direct damage inflicted as money." }, - "COIN_CASE": { name: "Coin Case", description: "After every 10th battle, receive 10% of your money in interest." }, - - "LOCK_CAPSULE": { name: "Lock Capsule", description: "Allows you to lock item rarities when rerolling items." }, - - "GRIP_CLAW": { name: "Grip Claw" }, - "WIDE_LENS": { name: "Wide Lens" }, - - "MULTI_LENS": { name: "Multi Lens" }, - - "HEALING_CHARM": { name: "Healing Charm", description: "Increases the effectiveness of HP restoring moves and items by 10% (excludes Revives)." }, - "CANDY_JAR": { name: "Candy Jar", description: "Increases the number of levels added by Rare Candy items by 1." }, - - "BERRY_POUCH": { name: "Berry Pouch", description: "Adds a 30% chance that a used berry will not be consumed." }, - - "FOCUS_BAND": { name: "Focus Band", description: "Adds a 10% chance to survive with 1 HP after being damaged enough to faint." }, - - "QUICK_CLAW": { name: "Quick Claw", description: "Adds a 10% chance to move first regardless of speed (after priority)." }, - - "KINGS_ROCK": { name: "King's Rock", description: "Adds a 10% chance an attack move will cause the opponent to flinch." }, - - "LEFTOVERS": { name: "Leftovers", description: "Heals 1/16 of a Pokémon's maximum HP every turn." }, - "SHELL_BELL": { name: "Shell Bell", description: "Heals 1/8 of a Pokémon's dealt damage." }, - - "TOXIC_ORB": { name: "Toxic Orb", description: "It's a bizarre orb that exudes toxins when touched and will badly poison the holder during battle." }, - "FLAME_ORB": { name: "Flame Orb", description: "It's a bizarre orb that gives off heat when touched and will affect the holder with a burn during battle." }, - - "BATON": { name: "Baton", description: "Allows passing along effects when switching Pokémon, which also bypasses traps." }, - - "SHINY_CHARM": { name: "Shiny Charm", description: "Dramatically increases the chance of a wild Pokémon being Shiny." }, - "ABILITY_CHARM": { name: "Ability Charm", description: "Dramatically increases the chance of a wild Pokémon having a Hidden Ability." }, - - "IV_SCANNER": { name: "IV Scanner", description: "Allows scanning the IVs of wild Pokémon. 2 IVs are revealed per stack. The best IVs are shown first." }, - - "DNA_SPLICERS": { name: "DNA Splicers" }, - - "MINI_BLACK_HOLE": { name: "Mini Black Hole" }, - - "GOLDEN_POKEBALL": { name: "Golden Poké Ball", description: "Adds 1 extra item option at the end of every battle." }, - - "ENEMY_DAMAGE_BOOSTER": { name: "Damage Token", description: "Increases damage by 5%." }, - "ENEMY_DAMAGE_REDUCTION": { name: "Protection Token", description: "Reduces incoming damage by 2.5%." }, - "ENEMY_HEAL": { name: "Recovery Token", description: "Heals 2% of max HP every turn." }, - "ENEMY_ATTACK_POISON_CHANCE": { name: "Poison Token" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Paralyze Token" }, - "ENEMY_ATTACK_BURN_CHANCE": { name: "Burn Token" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Full Heal Token", description: "Adds a 2.5% chance every turn to heal a status condition." }, - "ENEMY_ENDURE_CHANCE": { name: "Endure Token" }, - "ENEMY_FUSED_CHANCE": { name: "Fusion Token", description: "Adds a 1% chance that a wild Pokémon will be a fusion." }, - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "Light Ball", description: "It's a mysterious orb that boosts Pikachu's Attack and Sp. Atk stats." }, - "THICK_CLUB": { name: "Thick Club", description: "This hard bone of unknown origin boosts Cubone or Marowak's Attack stat." }, - "METAL_POWDER": { name: "Metal Powder", description: "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." }, - "QUICK_POWDER": { name: "Quick Powder", description: "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." } - }, - TempBattleStatBoosterItem: { - "x_attack": "X Attack", - "x_defense": "X Defense", - "x_sp_atk": "X Sp. Atk", - "x_sp_def": "X Sp. Def", - "x_speed": "X Speed", - "x_accuracy": "X Accuracy", - "dire_hit": "Dire Hit", - }, - - TempBattleStatBoosterStatName: { - "ATK": "Attack", - "DEF": "Defense", - "SPATK": "Sp. Atk", - "SPDEF": "Sp. Def", - "SPD": "Speed", - "ACC": "Accuracy", - "CRIT": "Critical Hit Ratio", - "EVA": "Evasiveness", - "DEFAULT": "???", - }, - - AttackTypeBoosterItem: { - "silk_scarf": "Silk Scarf", - "black_belt": "Black Belt", - "sharp_beak": "Sharp Beak", - "poison_barb": "Poison Barb", - "soft_sand": "Soft Sand", - "hard_stone": "Hard Stone", - "silver_powder": "Silver Powder", - "spell_tag": "Spell Tag", - "metal_coat": "Metal Coat", - "charcoal": "Charcoal", - "mystic_water": "Mystic Water", - "miracle_seed": "Miracle Seed", - "magnet": "Magnet", - "twisted_spoon": "Twisted Spoon", - "never_melt_ice": "Never-Melt Ice", - "dragon_fang": "Dragon Fang", - "black_glasses": "Black Glasses", - "fairy_feather": "Fairy Feather", - }, - BaseStatBoosterItem: { - "hp_up": "HP Up", - "protein": "Protein", - "iron": "Iron", - "calcium": "Calcium", - "zinc": "Zinc", - "carbos": "Carbos", - }, - EvolutionItem: { - "NONE": "None", - - "LINKING_CORD": "Linking Cord", - "SUN_STONE": "Sun Stone", - "MOON_STONE": "Moon Stone", - "LEAF_STONE": "Leaf Stone", - "FIRE_STONE": "Fire Stone", - "WATER_STONE": "Water Stone", - "THUNDER_STONE": "Thunder Stone", - "ICE_STONE": "Ice Stone", - "DUSK_STONE": "Dusk Stone", - "DAWN_STONE": "Dawn Stone", - "SHINY_STONE": "Shiny Stone", - "CRACKED_POT": "Cracked Pot", - "SWEET_APPLE": "Sweet Apple", - "TART_APPLE": "Tart Apple", - "STRAWBERRY_SWEET": "Strawberry Sweet", - "UNREMARKABLE_TEACUP": "Unremarkable Teacup", - - "CHIPPED_POT": "Chipped Pot", - "BLACK_AUGURITE": "Black Augurite", - "GALARICA_CUFF": "Galarica Cuff", - "GALARICA_WREATH": "Galarica Wreath", - "PEAT_BLOCK": "Peat Block", - "AUSPICIOUS_ARMOR": "Auspicious Armor", - "MALICIOUS_ARMOR": "Malicious Armor", - "MASTERPIECE_TEACUP": "Masterpiece Teacup", - "METAL_ALLOY": "Metal Alloy", - "SCROLL_OF_DARKNESS": "Scroll Of Darkness", - "SCROLL_OF_WATERS": "Scroll Of Waters", - "SYRUPY_APPLE": "Syrupy Apple", - }, - FormChangeItem: { - "NONE": "None", - - "ABOMASITE": "Abomasite", - "ABSOLITE": "Absolite", - "AERODACTYLITE": "Aerodactylite", - "AGGRONITE": "Aggronite", - "ALAKAZITE": "Alakazite", - "ALTARIANITE": "Altarianite", - "AMPHAROSITE": "Ampharosite", - "AUDINITE": "Audinite", - "BANETTITE": "Banettite", - "BEEDRILLITE": "Beedrillite", - "BLASTOISINITE": "Blastoisinite", - "BLAZIKENITE": "Blazikenite", - "CAMERUPTITE": "Cameruptite", - "CHARIZARDITE_X": "Charizardite X", - "CHARIZARDITE_Y": "Charizardite Y", - "DIANCITE": "Diancite", - "GALLADITE": "Galladite", - "GARCHOMPITE": "Garchompite", - "GARDEVOIRITE": "Gardevoirite", - "GENGARITE": "Gengarite", - "GLALITITE": "Glalitite", - "GYARADOSITE": "Gyaradosite", - "HERACRONITE": "Heracronite", - "HOUNDOOMINITE": "Houndoominite", - "KANGASKHANITE": "Kangaskhanite", - "LATIASITE": "Latiasite", - "LATIOSITE": "Latiosite", - "LOPUNNITE": "Lopunnite", - "LUCARIONITE": "Lucarionite", - "MANECTITE": "Manectite", - "MAWILITE": "Mawilite", - "MEDICHAMITE": "Medichamite", - "METAGROSSITE": "Metagrossite", - "MEWTWONITE_X": "Mewtwonite X", - "MEWTWONITE_Y": "Mewtwonite Y", - "PIDGEOTITE": "Pidgeotite", - "PINSIRITE": "Pinsirite", - "RAYQUAZITE": "Rayquazite", - "SABLENITE": "Sablenite", - "SALAMENCITE": "Salamencite", - "SCEPTILITE": "Sceptilite", - "SCIZORITE": "Scizorite", - "SHARPEDONITE": "Sharpedonite", - "SLOWBRONITE": "Slowbronite", - "STEELIXITE": "Steelixite", - "SWAMPERTITE": "Swampertite", - "TYRANITARITE": "Tyranitarite", - "VENUSAURITE": "Venusaurite", - - "BLUE_ORB": "Blue Orb", - "RED_ORB": "Red Orb", - "SHARP_METEORITE": "Sharp Meteorite", - "HARD_METEORITE": "Hard Meteorite", - "SMOOTH_METEORITE": "Smooth Meteorite", - "ADAMANT_CRYSTAL": "Adamant Crystal", - "LUSTROUS_GLOBE": "Lustrous Globe", - "GRISEOUS_CORE": "Griseous Core", - "REVEAL_GLASS": "Reveal Glass", - "GRACIDEA": "Gracidea", - "MAX_MUSHROOMS": "Max Mushrooms", - "DARK_STONE": "Dark Stone", - "LIGHT_STONE": "Light Stone", - "PRISON_BOTTLE": "Prison Bottle", - "N_LUNARIZER": "N Lunarizer", - "N_SOLARIZER": "N Solarizer", - "RUSTED_SWORD": "Rusted Sword", - "RUSTED_SHIELD": "Rusted Shield", - "ICY_REINS_OF_UNITY": "Icy Reins Of Unity", - "SHADOW_REINS_OF_UNITY": "Shadow Reins Of Unity", - "WELLSPRING_MASK": "Wellspring Mask", - "HEARTHFLAME_MASK": "Hearthflame Mask", - "CORNERSTONE_MASK": "Cornerstone Mask", - "SHOCK_DRIVE": "Shock Drive", - "BURN_DRIVE": "Burn Drive", - "CHILL_DRIVE": "Chill Drive", - "DOUSE_DRIVE": "Douse Drive", - - "FIST_PLATE": "Fist Plate", - "SKY_PLATE": "Sky Plate", - "TOXIC_PLATE": "Toxic Plate", - "EARTH_PLATE": "Earth Plate", - "STONE_PLATE": "Stone Plate", - "INSECT_PLATE": "Insect Plate", - "SPOOKY_PLATE": "Spooky Plate", - "IRON_PLATE": "Iron Plate", - "FLAME_PLATE": "Flame Plate", - "SPLASH_PLATE": "Splash Plate", - "MEADOW_PLATE": "Meadow Plate", - "ZAP_PLATE": "Zap Plate", - "MIND_PLATE": "Mind Plate", - "ICICLE_PLATE": "Icicle Plate", - "DRACO_PLATE": "Draco Plate", - "DREAD_PLATE": "Dread Plate", - "PIXIE_PLATE": "Pixie Plate", - "BLANK_PLATE": "Blank Plate", - "LEGEND_PLATE": "Legend Plate", - "FIGHTING_MEMORY": "Fighting Memory", - "FLYING_MEMORY": "Flying Memory", - "POISON_MEMORY": "Poison Memory", - "GROUND_MEMORY": "Ground Memory", - "ROCK_MEMORY": "Rock Memory", - "BUG_MEMORY": "Bug Memory", - "GHOST_MEMORY": "Ghost Memory", - "STEEL_MEMORY": "Steel Memory", - "FIRE_MEMORY": "Fire Memory", - "WATER_MEMORY": "Water Memory", - "GRASS_MEMORY": "Grass Memory", - "ELECTRIC_MEMORY": "Electric Memory", - "PSYCHIC_MEMORY": "Psychic Memory", - "ICE_MEMORY": "Ice Memory", - "DRAGON_MEMORY": "Dragon Memory", - "DARK_MEMORY": "Dark Memory", - "FAIRY_MEMORY": "Fairy Memory", - "BLANK_MEMORY": "Blank Memory", - }, -} as const; diff --git a/src/locales/en/modifier.json b/src/locales/en/modifier.json new file mode 100644 index 00000000000..47944c8adb7 --- /dev/null +++ b/src/locales/en/modifier.json @@ -0,0 +1,12 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}} hung on\nusing its {{typeName}}!", + "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}}!", + "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}}!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestored some HP!", + "bypassSpeedChanceApply": "{{pokemonName}} can act faster than normal, thanks to its {{itemName}}!" +} \ No newline at end of file diff --git a/src/locales/en/move-trigger.json b/src/locales/en/move-trigger.json new file mode 100644 index 00000000000..e70fb9dcfb7 --- /dev/null +++ b/src/locales/en/move-trigger.json @@ -0,0 +1,70 @@ +{ + "hitWithRecoil" : "{{pokemonName}} was damaged by the recoil!", + "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!", + "fled": "{{pokemonName}} fled!", + "cannotBeSwitchedOut": "{{pokemonName}} can't be switched out!", + "swappedAbilitiesWithTarget": "{{pokemonName}} swapped\nabilities with its target!", + "coinsScatteredEverywhere": "Coins were scattered everywhere!", + "attackedByItem": "{{pokemonName}} is about to be attacked by its {{itemName}}!", + "whippedUpAWhirlwind": "{{pokemonName}} whipped\nup a whirlwind!", + "flewUpHigh": "{{pokemonName}} flew\nup high!", + "tookInSunlight": "{{pokemonName}} absorbed light!", + "dugAHole": "{{pokemonName}} burrowed its way under the ground!", + "loweredItsHead": "{{pokemonName}} tucked in its head!", + "isGlowing": "{{pokemonName}} became cloaked in a harsh light!", + "bellChimed": "A bell chimed!", + "foresawAnAttack": "{{pokemonName}} foresaw\nan attack!", + "isTighteningFocus": "{{pokemonName}} is\ntightening its focus!", + "hidUnderwater": "{{pokemonName}} hid\nunderwater!", + "soothingAromaWaftedThroughArea": "A soothing aroma wafted through the area!", + "sprangUp": "{{pokemonName}} sprang up!", + "choseDoomDesireAsDestiny": "{{pokemonName}} chose\nDoom Desire as its destiny!", + "vanishedInstantly": "{{pokemonName}} vanished\ninstantly!", + "tookTargetIntoSky": "{{pokemonName}} took {{targetName}}\ninto the sky!", + "becameCloakedInFreezingLight": "{{pokemonName}} became cloaked\nin a freezing light!", + "becameCloakedInFreezingAir": "{{pokemonName}} became cloaked\nin freezing air!", + "isChargingPower": "{{pokemonName}} is absorbing power!", + "burnedItselfOut": "{{pokemonName}} burned itself out!", + "startedHeatingUpBeak": "{{pokemonName}} started\nheating up its beak!", + "setUpShellTrap": "{{pokemonName}} set a shell trap!", + "isOverflowingWithSpacePower": "{{pokemonName}} is overflowing\nwith space power!", + "usedUpAllElectricity": "{{pokemonName}} used up all its electricity!", + "stoleItem": "{{pokemonName}} stole\n{{targetName}}'s {{itemName}}!", + "incineratedItem": "{{pokemonName}} incinerated\n{{targetName}}'s {{itemName}}!", + "knockedOffItem": "{{pokemonName}} knocked off\n{{targetName}}'s {{itemName}}!", + "tookMoveAttack": "{{pokemonName}} took\nthe {{moveName}} attack!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} cut its own HP\nand maximized its {{statName}}!", + "copiedStatChanges": "{{pokemonName}} copied\n{{targetName}}'s stat changes!", + "magnitudeMessage": "Magnitude {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} took aim\nat {{targetName}}!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{typeName}} type!", + "copiedMove": "{{pokemonName}} copied\n{{moveName}}!", + "sketchedMove": "{{pokemonName}} sketched\n{{moveName}}!", + "acquiredAbility": "The {{pokemonName}} acquired\n{{abilityName}}!", + "copiedTargetAbility": "{{pokemonName}} copied the {{targetName}}'s\n{{abilityName}}!", + "transformedIntoTarget": "{{pokemonName}} transformed\ninto {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} is hoping to take its attacker down with it!", + "addType": "{{typeName}} was added to\n{{pokemonName}}!", + "cannotUseMove": "{{pokemonName}} cannot use {{moveName}}!", + "healHp": "{{pokemonName}} had its HP restored.", + "sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!", + "invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!", + "resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!", + "statEliminated": "All stat changes were eliminated!", + "faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.", + "copyType": "{{pokemonName}}'s type became the same as\n{{targetPokemonName}}'s type!", + "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}}!", + "safeguard": "{{targetName}} is protected by Safeguard!" +} \ No newline at end of file diff --git a/src/locales/en/move.json b/src/locales/en/move.json new file mode 100644 index 00000000000..7a10335ed06 --- /dev/null +++ b/src/locales/en/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "Pound", + "effect": "The target is physically pounded with a long tail, a foreleg, or the like." + }, + "karateChop": { + "name": "Karate Chop", + "effect": "The target is attacked with a sharp chop. Critical hits land more easily." + }, + "doubleSlap": { + "name": "Double Slap", + "effect": "The target is slapped repeatedly, back and forth, two to five times in a row." + }, + "cometPunch": { + "name": "Comet Punch", + "effect": "The target is hit with a flurry of punches that strike two to five times in a row." + }, + "megaPunch": { + "name": "Mega Punch", + "effect": "The target is slugged by a punch thrown with muscle-packed power." + }, + "payDay": { + "name": "Pay Day", + "effect": "Numerous coins are hurled at the target to inflict damage. Money is earned after the battle." + }, + "firePunch": { + "name": "Fire Punch", + "effect": "The target is punched with a fiery fist. This may also leave the target with a burn." + }, + "icePunch": { + "name": "Ice Punch", + "effect": "The target is punched with an icy fist. This may also leave the target frozen." + }, + "thunderPunch": { + "name": "Thunder Punch", + "effect": "The target is punched with an electrified fist. This may also leave the target with paralysis." + }, + "scratch": { + "name": "Scratch", + "effect": "Hard, pointed, sharp claws rake the target to inflict damage." + }, + "viseGrip": { + "name": "Vise Grip", + "effect": "The target is gripped and squeezed from both sides to inflict damage." + }, + "guillotine": { + "name": "Guillotine", + "effect": "A vicious, tearing attack with big pincers. The target faints instantly if this attack hits." + }, + "razorWind": { + "name": "Razor Wind", + "effect": "In this two-turn attack, blades of wind hit opposing Pokémon on the second turn. Critical hits land more easily." + }, + "swordsDance": { + "name": "Swords Dance", + "effect": "A frenetic dance to uplift the fighting spirit. This sharply raises the user's Attack stat." + }, + "cut": { + "name": "Cut", + "effect": "The target is cut with a scythe or claw." + }, + "gust": { + "name": "Gust", + "effect": "A gust of wind is whipped up by wings and launched at the target to inflict damage." + }, + "wingAttack": { + "name": "Wing Attack", + "effect": "The target is struck with large, imposing wings spread wide to inflict damage." + }, + "whirlwind": { + "name": "Whirlwind", + "effect": "The target is blown away, and a different Pokémon is dragged out. In the wild, this ends a battle against a single Pokémon." + }, + "fly": { + "name": "Fly", + "effect": "The user flies up into the sky and then strikes its target on the next turn." + }, + "bind": { + "name": "Bind", + "effect": "Things such as long bodies or tentacles are used to bind and squeeze the target for four to five turns." + }, + "slam": { + "name": "Slam", + "effect": "The target is slammed with a long tail, vines, or the like to inflict damage." + }, + "vineWhip": { + "name": "Vine Whip", + "effect": "The target is struck with slender, whiplike vines to inflict damage." + }, + "stomp": { + "name": "Stomp", + "effect": "The target is stomped with a big foot. This may also make the target flinch." + }, + "doubleKick": { + "name": "Double Kick", + "effect": "The target is quickly kicked twice in succession using both feet." + }, + "megaKick": { + "name": "Mega Kick", + "effect": "The target is attacked by a kick launched with muscle-packed power." + }, + "jumpKick": { + "name": "Jump Kick", + "effect": "The user jumps up high, then strikes with a kick. If the kick misses, the user hurts itself." + }, + "rollingKick": { + "name": "Rolling Kick", + "effect": "The user lashes out with a quick, spinning kick. This may also make the target flinch." + }, + "sandAttack": { + "name": "Sand Attack", + "effect": "Sand is hurled in the target's face, reducing the target's accuracy." + }, + "headbutt": { + "name": "Headbutt", + "effect": "The user sticks out its head and attacks by charging straight into the target. This may also make the target flinch." + }, + "hornAttack": { + "name": "Horn Attack", + "effect": "The target is jabbed with a sharply pointed horn to inflict damage." + }, + "furyAttack": { + "name": "Fury Attack", + "effect": "The target is jabbed repeatedly with a horn or beak two to five times in a row." + }, + "hornDrill": { + "name": "Horn Drill", + "effect": "The user stabs the target with a horn that rotates like a drill. The target faints instantly if this attack hits." + }, + "tackle": { + "name": "Tackle", + "effect": "A physical attack in which the user charges and slams into the target with its whole body." + }, + "bodySlam": { + "name": "Body Slam", + "effect": "The user drops onto the target with its full body weight. This may also leave the target with paralysis." + }, + "wrap": { + "name": "Wrap", + "effect": "A long body, vines, or the like are used to wrap and squeeze the target for four to five turns." + }, + "takeDown": { + "name": "Take Down", + "effect": "A reckless, full-body charge attack for slamming into the target. This also damages the user a little." + }, + "thrash": { + "name": "Thrash", + "effect": "The user rampages and attacks for two to three turns. The user then becomes confused." + }, + "doubleEdge": { + "name": "Double-Edge", + "effect": "A reckless, life-risking tackle in which the user rushes the target. This also damages the user quite a lot." + }, + "tailWhip": { + "name": "Tail Whip", + "effect": "The user wags its tail cutely, making opposing Pokémon less wary and lowering their Defense stats." + }, + "poisonSting": { + "name": "Poison Sting", + "effect": "The user stabs the target with a poisonous stinger. This may also poison the target." + }, + "twineedle": { + "name": "Twineedle", + "effect": "The user damages the target twice in succession by jabbing it with two spikes. This may also poison the target." + }, + "pinMissile": { + "name": "Pin Missile", + "effect": "Sharp spikes are shot at the target in rapid succession. They hit two to five times in a row." + }, + "leer": { + "name": "Leer", + "effect": "The user gives opposing Pokémon an intimidating leer that lowers the Defense stat." + }, + "bite": { + "name": "Bite", + "effect": "The target is bitten with viciously sharp fangs. This may also make the target flinch." + }, + "growl": { + "name": "Growl", + "effect": "The user growls in an endearing way, making opposing Pokémon less wary. This lowers their Attack stats." + }, + "roar": { + "name": "Roar", + "effect": "The target is scared off, and a different Pokémon is dragged out. In the wild, this ends a battle against a single Pokémon." + }, + "sing": { + "name": "Sing", + "effect": "A soothing lullaby is sung in a calming voice that puts the target into a deep slumber." + }, + "supersonic": { + "name": "Supersonic", + "effect": "The user generates odd sound waves from its body that confuse the target." + }, + "sonicBoom": { + "name": "Sonic Boom", + "effect": "The target is hit with a destructive shock wave that always inflicts 20 HP damage." + }, + "disable": { + "name": "Disable", + "effect": "For four turns, this move prevents the target from using the move it last used." + }, + "acid": { + "name": "Acid", + "effect": "Opposing Pokémon are attacked with a spray of harsh acid. This may also lower their Sp. Def stats." + }, + "ember": { + "name": "Ember", + "effect": "The target is attacked with small flames. This may also leave the target with a burn." + }, + "flamethrower": { + "name": "Flamethrower", + "effect": "The target is scorched with an intense blast of fire. This may also leave the target with a burn." + }, + "mist": { + "name": "Mist", + "effect": "The user cloaks itself and its allies in a white mist that prevents any of their stats from being lowered for five turns." + }, + "waterGun": { + "name": "Water Gun", + "effect": "The target is blasted with a forceful shot of water." + }, + "hydroPump": { + "name": "Hydro Pump", + "effect": "The target is blasted by a huge volume of water launched under great pressure." + }, + "surf": { + "name": "Surf", + "effect": "The user attacks everything around it by swamping its surroundings with a giant wave." + }, + "iceBeam": { + "name": "Ice Beam", + "effect": "The target is struck with an icy-cold beam of energy. This may also leave the target frozen." + }, + "blizzard": { + "name": "Blizzard", + "effect": "A howling blizzard is summoned to strike opposing Pokémon. This may also leave the opposing Pokémon frozen." + }, + "psybeam": { + "name": "Psybeam", + "effect": "The target is attacked with a peculiar ray. This may also leave the target confused." + }, + "bubbleBeam": { + "name": "Bubble Beam", + "effect": "A spray of bubbles is forcefully ejected at the target. This may also lower the target's Speed stat." + }, + "auroraBeam": { + "name": "Aurora Beam", + "effect": "The target is hit with a rainbow-colored beam. This may also lower the target's Attack stat." + }, + "hyperBeam": { + "name": "Hyper Beam", + "effect": "The target is attacked with a powerful beam. The user can't move on the next turn." + }, + "peck": { + "name": "Peck", + "effect": "The target is jabbed with a sharply pointed beak or horn." + }, + "drillPeck": { + "name": "Drill Peck", + "effect": "A corkscrewing attack that strikes the target with a sharp beak acting as a drill." + }, + "submission": { + "name": "Submission", + "effect": "The user grabs the target and recklessly dives for the ground. This also damages the user a little." + }, + "lowKick": { + "name": "Low Kick", + "effect": "A powerful low kick that makes the target fall over. The heavier the target, the greater the move's power." + }, + "counter": { + "name": "Counter", + "effect": "A retaliation move that counters any physical attack, inflicting double the damage taken." + }, + "seismicToss": { + "name": "Seismic Toss", + "effect": "The target is thrown using the power of gravity. It inflicts damage equal to the user's level." + }, + "strength": { + "name": "Strength", + "effect": "The target is slugged with a punch thrown at maximum power." + }, + "absorb": { + "name": "Absorb", + "effect": "A nutrient-draining attack. The user's HP is restored by half the damage taken by the target." + }, + "megaDrain": { + "name": "Mega Drain", + "effect": "A nutrient-draining attack. The user's HP is restored by half the damage taken by the target." + }, + "leechSeed": { + "name": "Leech Seed", + "effect": "A seed is planted on the target. It steals some HP from the target every turn." + }, + "growth": { + "name": "Growth", + "effect": "The user's body grows all at once, raising the Attack and Sp. Atk stats." + }, + "razorLeaf": { + "name": "Razor Leaf", + "effect": "Sharp-edged leaves are launched to slash at opposing Pokémon. Critical hits land more easily." + }, + "solarBeam": { + "name": "Solar Beam", + "effect": "In this two-turn attack, the user gathers light, then blasts a bundled beam on the next turn." + }, + "poisonPowder": { + "name": "Poison Powder", + "effect": "The user scatters a cloud of poisonous dust that poisons the target." + }, + "stunSpore": { + "name": "Stun Spore", + "effect": "The user scatters a cloud of numbing powder that paralyzes the target." + }, + "sleepPowder": { + "name": "Sleep Powder", + "effect": "The user scatters a big cloud of sleep-inducing dust around the target." + }, + "petalDance": { + "name": "Petal Dance", + "effect": "The user attacks the target by scattering petals for two to three turns. The user then becomes confused." + }, + "stringShot": { + "name": "String Shot", + "effect": "Opposing Pokémon are bound with silk blown from the user's mouth that harshly lowers the Speed stat." + }, + "dragonRage": { + "name": "Dragon Rage", + "effect": "This attack hits the target with a shock wave of pure rage. This attack always inflicts 40 HP damage." + }, + "fireSpin": { + "name": "Fire Spin", + "effect": "The target becomes trapped within a fierce vortex of fire that rages for four to five turns." + }, + "thunderShock": { + "name": "Thunder Shock", + "effect": "A jolt of electricity crashes down on the target to inflict damage. This may also leave the target with paralysis." + }, + "thunderbolt": { + "name": "Thunderbolt", + "effect": "A strong electric blast crashes down on the target. This may also leave the target with paralysis." + }, + "thunderWave": { + "name": "Thunder Wave", + "effect": "The user launches a weak jolt of electricity that paralyzes the target." + }, + "thunder": { + "name": "Thunder", + "effect": "A wicked thunderbolt is dropped on the target to inflict damage. This may also leave the target with paralysis." + }, + "rockThrow": { + "name": "Rock Throw", + "effect": "The user picks up and throws a small rock at the target to attack." + }, + "earthquake": { + "name": "Earthquake", + "effect": "The user sets off an earthquake that strikes every Pokémon around it." + }, + "fissure": { + "name": "Fissure", + "effect": "The user opens up a fissure in the ground and drops the target in. The target faints instantly if this attack hits." + }, + "dig": { + "name": "Dig", + "effect": "The user burrows into the ground, then attacks on the next turn." + }, + "toxic": { + "name": "Toxic", + "effect": "A move that leaves the target badly poisoned. Its poison damage worsens every turn." + }, + "confusion": { + "name": "Confusion", + "effect": "The target is hit by a weak telekinetic force. This may also confuse the target." + }, + "psychic": { + "name": "Psychic", + "effect": "The target is hit by a strong telekinetic force. This may also lower the target's Sp. Def stat." + }, + "hypnosis": { + "name": "Hypnosis", + "effect": "The user employs hypnotic suggestion to make the target fall into a deep sleep." + }, + "meditate": { + "name": "Meditate", + "effect": "The user meditates to awaken the power deep within its body and raise its Attack stat." + }, + "agility": { + "name": "Agility", + "effect": "The user relaxes and lightens its body to move faster. This sharply raises the Speed stat." + }, + "quickAttack": { + "name": "Quick Attack", + "effect": "The user lunges at the target at a speed that makes it almost invisible. This move always goes first." + }, + "rage": { + "name": "Rage", + "effect": "As long as this move is in use, the power of rage raises the Attack stat each time the user is hit in battle." + }, + "teleport": { + "name": "Teleport", + "effect": "The user switches places with a party Pokémon in waiting, if any. If a wild Pokémon uses this move, it flees." + }, + "nightShade": { + "name": "Night Shade", + "effect": "The user makes the target see a frightening mirage. It inflicts damage equal to the user's level." + }, + "mimic": { + "name": "Mimic", + "effect": "The user copies the target's last move. The move can be used during battle until the Pokémon is switched out." + }, + "screech": { + "name": "Screech", + "effect": "An earsplitting screech harshly lowers the target's Defense stat." + }, + "doubleTeam": { + "name": "Double Team", + "effect": "By moving rapidly, the user makes illusory copies of itself to raise its evasiveness." + }, + "recover": { + "name": "Recover", + "effect": "Restoring its own cells, the user restores its own HP by half of its max HP." + }, + "harden": { + "name": "Harden", + "effect": "The user stiffens all the muscles in its body to raise its Defense stat." + }, + "minimize": { + "name": "Minimize", + "effect": "The user compresses its body to make itself look smaller, which sharply raises its evasiveness." + }, + "smokescreen": { + "name": "Smokescreen", + "effect": "The user releases an obscuring cloud of smoke or ink. This lowers the target's accuracy." + }, + "confuseRay": { + "name": "Confuse Ray", + "effect": "The target is exposed to a sinister ray that triggers confusion." + }, + "withdraw": { + "name": "Withdraw", + "effect": "The user withdraws its body into its hard shell, raising its Defense stat." + }, + "defenseCurl": { + "name": "Defense Curl", + "effect": "The user curls up to conceal weak spots and raise its Defense stat." + }, + "barrier": { + "name": "Barrier", + "effect": "The user throws up a sturdy wall that sharply raises its Defense stat." + }, + "lightScreen": { + "name": "Light Screen", + "effect": "A wondrous wall of light is put up to reduce damage from special attacks for five turns." + }, + "haze": { + "name": "Haze", + "effect": "The user creates a haze that eliminates every stat change among all the Pokémon engaged in battle." + }, + "reflect": { + "name": "Reflect", + "effect": "A wondrous wall of light is put up to reduce damage from physical attacks for five turns." + }, + "focusEnergy": { + "name": "Focus Energy", + "effect": "The user takes a deep breath and focuses so that critical hits land more easily." + }, + "bide": { + "name": "Bide", + "effect": "The user endures attacks for two turns, then strikes back to cause double the damage taken." + }, + "metronome": { + "name": "Metronome", + "effect": "The user waggles a finger and stimulates its brain into randomly using nearly any move." + }, + "mirrorMove": { + "name": "Mirror Move", + "effect": "The user counters the target by mimicking the target's last move." + }, + "selfDestruct": { + "name": "Self-Destruct", + "effect": "The user attacks everything around it by causing an explosion. The user faints upon using this move." + }, + "eggBomb": { + "name": "Egg Bomb", + "effect": "A large egg is hurled at the target with maximum force to inflict damage." + }, + "lick": { + "name": "Lick", + "effect": "The target is licked with a long tongue, causing damage. This may also leave the target with paralysis." + }, + "smog": { + "name": "Smog", + "effect": "The target is attacked with a discharge of filthy gases. This may also poison the target." + }, + "sludge": { + "name": "Sludge", + "effect": "Unsanitary sludge is hurled at the target. This may also poison the target." + }, + "boneClub": { + "name": "Bone Club", + "effect": "The user clubs the target with a bone. This may also make the target flinch." + }, + "fireBlast": { + "name": "Fire Blast", + "effect": "The target is attacked with an intense blast of all-consuming fire. This may also leave the target with a burn." + }, + "waterfall": { + "name": "Waterfall", + "effect": "The user charges at the target and may make it flinch." + }, + "clamp": { + "name": "Clamp", + "effect": "The target is clamped and squeezed by the user's very thick and sturdy shell for four to five turns." + }, + "swift": { + "name": "Swift", + "effect": "Star-shaped rays are shot at opposing Pokémon. This attack never misses." + }, + "skullBash": { + "name": "Skull Bash", + "effect": "The user tucks in its head to raise its Defense stat on the first turn, then rams the target on the next turn." + }, + "spikeCannon": { + "name": "Spike Cannon", + "effect": "Sharp spikes are shot at the target in rapid succession. They hit two to five times in a row." + }, + "constrict": { + "name": "Constrict", + "effect": "The target is attacked with long, creeping tentacles, vines, or the like. This may also lower the target's Speed stat." + }, + "amnesia": { + "name": "Amnesia", + "effect": "The user temporarily empties its mind to forget its concerns. This sharply raises the user's Sp. Def stat." + }, + "kinesis": { + "name": "Kinesis", + "effect": "The user distracts the target by bending a spoon. This lowers the target's accuracy." + }, + "softBoiled": { + "name": "Soft-Boiled", + "effect": "The user restores its own HP by up to half of its max HP." + }, + "highJumpKick": { + "name": "High Jump Kick", + "effect": "The target is attacked with a knee kick from a jump. If it misses, the user is hurt instead." + }, + "glare": { + "name": "Glare", + "effect": "The user intimidates the target with the pattern on its belly to cause paralysis." + }, + "dreamEater": { + "name": "Dream Eater", + "effect": "The user eats the dreams of a sleeping target. The user's HP is restored by half the damage taken by the target." + }, + "poisonGas": { + "name": "Poison Gas", + "effect": "A cloud of poison gas is sprayed in the face of opposing Pokémon, poisoning those it hits." + }, + "barrage": { + "name": "Barrage", + "effect": "Round objects are hurled at the target to strike two to five times in a row." + }, + "leechLife": { + "name": "Leech Life", + "effect": "The user drains the target's blood. The user's HP is restored by half the damage taken by the target." + }, + "lovelyKiss": { + "name": "Lovely Kiss", + "effect": "With a scary face, the user tries to force a kiss on the target. If it succeeds, the target falls asleep." + }, + "skyAttack": { + "name": "Sky Attack", + "effect": "A second-turn attack move where critical hits land more easily. This may also make the target flinch." + }, + "transform": { + "name": "Transform", + "effect": "The user transforms into a copy of the target right down to having the same move set." + }, + "bubble": { + "name": "Bubble", + "effect": "A spray of countless bubbles is jetted at the opposing Pokémon. This may also lower their Speed stat." + }, + "dizzyPunch": { + "name": "Dizzy Punch", + "effect": "The target is hit with rhythmically launched punches. This may also leave the target confused." + }, + "spore": { + "name": "Spore", + "effect": "The user scatters bursts of spores that induce sleep." + }, + "flash": { + "name": "Flash", + "effect": "The user flashes a bright light that cuts the target's accuracy." + }, + "psywave": { + "name": "Psywave", + "effect": "The target is attacked with an odd psychic wave. The attack varies in intensity." + }, + "splash": { + "name": "Splash", + "effect": "The user just flops and splashes around to no effect at all..." + }, + "acidArmor": { + "name": "Acid Armor", + "effect": "The user alters its cellular structure to liquefy itself, sharply raising its Defense stat." + }, + "crabhammer": { + "name": "Crabhammer", + "effect": "The target is hammered with a large pincer. Critical hits land more easily." + }, + "explosion": { + "name": "Explosion", + "effect": "The user attacks everything around it by causing a tremendous explosion. The user faints upon using this move." + }, + "furySwipes": { + "name": "Fury Swipes", + "effect": "The target is raked with sharp claws or scythes quickly two to five times in a row." + }, + "bonemerang": { + "name": "Bonemerang", + "effect": "The user throws the bone it holds. The bone loops around to hit the target twice—coming and going." + }, + "rest": { + "name": "Rest", + "effect": "The user goes to sleep for two turns. This fully restores the user's HP and heals any status conditions." + }, + "rockSlide": { + "name": "Rock Slide", + "effect": "Large boulders are hurled at opposing Pokémon to inflict damage. This may also make the opposing Pokémon flinch." + }, + "hyperFang": { + "name": "Hyper Fang", + "effect": "The user bites hard on the target with its sharp front fangs. This may also make the target flinch." + }, + "sharpen": { + "name": "Sharpen", + "effect": "The user makes its edges more jagged, which raises its Attack stat." + }, + "conversion": { + "name": "Conversion", + "effect": "The user changes its type to become the same type as the move at the top of the list of moves it knows." + }, + "triAttack": { + "name": "Tri Attack", + "effect": "The user strikes with a simultaneous three-beam attack. This may also burn, freeze, or paralyze the target." + }, + "superFang": { + "name": "Super Fang", + "effect": "The user chomps hard on the target with its sharp front fangs. This cuts the target's HP in half." + }, + "slash": { + "name": "Slash", + "effect": "The target is attacked with a slash of claws or blades. Critical hits land more easily." + }, + "substitute": { + "name": "Substitute", + "effect": "The user creates a substitute for itself using some of its HP. The substitute serves as the user's decoy." + }, + "struggle": { + "name": "Struggle", + "effect": "This attack is used in desperation only if the user has no PP. It also damages the user a little." + }, + "sketch": { + "name": "Sketch", + "effect": "It enables the user to permanently learn the move last used by the target. Once used, Sketch disappears." + }, + "tripleKick": { + "name": "Triple Kick", + "effect": "A consecutive three-kick attack that becomes more powerful with each successful hit." + }, + "thief": { + "name": "Thief", + "effect": "The user attacks and has a 30% chance to steal the target's held item simultaneously." + }, + "spiderWeb": { + "name": "Spider Web", + "effect": "The user ensnares the target with thin, gooey silk so it can't flee from battle." + }, + "mindReader": { + "name": "Mind Reader", + "effect": "The user senses the target's movements with its mind to ensure its next attack does not miss the target." + }, + "nightmare": { + "name": "Nightmare", + "effect": "A sleeping target sees a nightmare that inflicts some damage every turn." + }, + "flameWheel": { + "name": "Flame Wheel", + "effect": "The user cloaks itself in fire and charges at the target. This may also leave the target with a burn." + }, + "snore": { + "name": "Snore", + "effect": "This attack can be used only if the user is asleep. The harsh noise may also make the target flinch." + }, + "curse": { + "name": "Curse", + "effect": "A move that works differently for the Ghost type than for all other types." + }, + "flail": { + "name": "Flail", + "effect": "The user flails about aimlessly to attack. The less HP the user has, the greater the move's power." + }, + "conversion2": { + "name": "Conversion 2", + "effect": "The user changes its type to make itself resistant to the type of the attack the target used last." + }, + "aeroblast": { + "name": "Aeroblast", + "effect": "A vortex of air is shot at the target to inflict damage. Critical hits land more easily." + }, + "cottonSpore": { + "name": "Cotton Spore", + "effect": "The user releases cotton-like spores that cling to opposing Pokémon, which harshly lowers their Speed stats." + }, + "reversal": { + "name": "Reversal", + "effect": "An all-out attack that becomes more powerful the less HP the user has." + }, + "spite": { + "name": "Spite", + "effect": "The user unleashes its grudge on the move last used by the target by cutting 4 PP from it." + }, + "powderSnow": { + "name": "Powder Snow", + "effect": "The user attacks with a chilling gust of powdery snow. This may also freeze opposing Pokémon." + }, + "protect": { + "name": "Protect", + "effect": "This move enables the user to protect itself from all attacks. Its chance of failing rises if it is used in succession." + }, + "machPunch": { + "name": "Mach Punch", + "effect": "The user throws a punch at blinding speed. This move always goes first." + }, + "scaryFace": { + "name": "Scary Face", + "effect": "The user frightens the target with a scary face to harshly lower its Speed stat." + }, + "feintAttack": { + "name": "Feint Attack", + "effect": "The user approaches the target disarmingly, then throws a sucker punch. This attack never misses." + }, + "sweetKiss": { + "name": "Sweet Kiss", + "effect": "The user kisses the target with a sweet, angelic cuteness that causes confusion." + }, + "bellyDrum": { + "name": "Belly Drum", + "effect": "The user maximizes its Attack stat in exchange for HP equal to half its max HP." + }, + "sludgeBomb": { + "name": "Sludge Bomb", + "effect": "Unsanitary sludge is hurled at the target. This may also poison the target." + }, + "mudSlap": { + "name": "Mud-Slap", + "effect": "The user hurls mud in the target's face to inflict damage and lower its accuracy." + }, + "octazooka": { + "name": "Octazooka", + "effect": "The user attacks by spraying ink in the target's face or eyes. This may also lower the target's accuracy." + }, + "spikes": { + "name": "Spikes", + "effect": "The user lays a trap of spikes at the opposing team's feet. The trap hurts Pokémon that switch into battle." + }, + "zapCannon": { + "name": "Zap Cannon", + "effect": "The user fires an electric blast like a cannon to inflict damage and cause paralysis." + }, + "foresight": { + "name": "Foresight", + "effect": "Enables a Ghost-type target to be hit by Normal- and Fighting-type attacks. This also enables an evasive target to be hit." + }, + "destinyBond": { + "name": "Destiny Bond", + "effect": "After using this move, if the user faints, the Pokémon that landed the knockout hit also faints. Its chance of failing rises if it is used in succession." + }, + "perishSong": { + "name": "Perish Song", + "effect": "Any Pokémon that hears this song faints in three turns, unless it switches out of battle." + }, + "icyWind": { + "name": "Icy Wind", + "effect": "The user attacks with a gust of chilled air. This also lowers opposing Pokémon's Speed stats." + }, + "detect": { + "name": "Detect", + "effect": "This move enables the user to protect itself from all attacks. Its chance of failing rises if it is used in succession." + }, + "boneRush": { + "name": "Bone Rush", + "effect": "The user strikes the target with a hard bone two to five times in a row." + }, + "lockOn": { + "name": "Lock-On", + "effect": "The user takes sure aim at the target. This ensures the next attack does not miss the target." + }, + "outrage": { + "name": "Outrage", + "effect": "The user rampages and attacks for two to three turns. The user then becomes confused." + }, + "sandstorm": { + "name": "Sandstorm", + "effect": "A five-turn sandstorm is summoned to hurt all combatants except Rock, Ground, and Steel types. It raises the Sp. Def stat of Rock types." + }, + "gigaDrain": { + "name": "Giga Drain", + "effect": "A nutrient-draining attack. The user's HP is restored by half the damage taken by the target." + }, + "endure": { + "name": "Endure", + "effect": "The user endures any attack with at least 1 HP. Its chance of failing rises if it is used in succession." + }, + "charm": { + "name": "Charm", + "effect": "The user gazes at the target rather charmingly, making it less wary. This harshly lowers the target's Attack stat." + }, + "rollout": { + "name": "Rollout", + "effect": "The user continually rolls into the target over five turns. It becomes more powerful each time it hits." + }, + "falseSwipe": { + "name": "False Swipe", + "effect": "A restrained attack that prevents the target from fainting. The target is left with at least 1 HP." + }, + "swagger": { + "name": "Swagger", + "effect": "The user enrages and confuses the target. However, this also sharply raises the target's Attack stat." + }, + "milkDrink": { + "name": "Milk Drink", + "effect": "The user restores its own HP by up to half of its max HP." + }, + "spark": { + "name": "Spark", + "effect": "The user throws an electrically charged tackle at the target. This may also leave the target with paralysis." + }, + "furyCutter": { + "name": "Fury Cutter", + "effect": "The target is slashed with scythes or claws. This attack becomes more powerful if it hits in succession." + }, + "steelWing": { + "name": "Steel Wing", + "effect": "The target is hit with wings of steel. This may also raise the user's Defense stat." + }, + "meanLook": { + "name": "Mean Look", + "effect": "The user pins the target with a dark, arresting look. The target becomes unable to flee." + }, + "attract": { + "name": "Attract", + "effect": "If it is the opposite gender of the user, the target becomes infatuated and less likely to attack." + }, + "sleepTalk": { + "name": "Sleep Talk", + "effect": "While it is asleep, the user randomly uses one of the moves it knows." + }, + "healBell": { + "name": "Heal Bell", + "effect": "The user makes a soothing bell chime to heal the status conditions of all the party Pokémon." + }, + "return": { + "name": "Return", + "effect": "This full-power attack grows more powerful the more the user likes its Trainer." + }, + "present": { + "name": "Present", + "effect": "The user attacks by giving the target a gift with a hidden trap. It restores HP sometimes, however." + }, + "frustration": { + "name": "Frustration", + "effect": "This full-power attack grows more powerful the less the user likes its Trainer." + }, + "safeguard": { + "name": "Safeguard", + "effect": "The user creates a protective field that prevents status conditions for five turns." + }, + "painSplit": { + "name": "Pain Split", + "effect": "The user adds its HP to the target's HP, then equally shares the combined HP with the target." + }, + "sacredFire": { + "name": "Sacred Fire", + "effect": "The target is razed with a mystical fire of great intensity. This may also leave the target with a burn." + }, + "magnitude": { + "name": "Magnitude", + "effect": "The user attacks everything around it with a ground-shaking quake. Its power varies." + }, + "dynamicPunch": { + "name": "Dynamic Punch", + "effect": "The user punches the target with full, concentrated power. This confuses the target if it hits." + }, + "megahorn": { + "name": "Megahorn", + "effect": "Using its tough and impressive horn, the user rams into the target with no letup." + }, + "dragonBreath": { + "name": "Dragon Breath", + "effect": "The user exhales a mighty gust that inflicts damage. This may also leave the target with paralysis." + }, + "batonPass": { + "name": "Baton Pass", + "effect": "The user switches places with a party Pokémon in waiting and passes along any stat changes." + }, + "encore": { + "name": "Encore", + "effect": "The user compels the target to keep using the move it encored for three turns." + }, + "pursuit": { + "name": "Pursuit", + "effect": "The power of this attack move is doubled if it's used on a target that's switching out of battle." + }, + "rapidSpin": { + "name": "Rapid Spin", + "effect": "A spin attack that can also eliminate such moves as Bind, Wrap, and Leech Seed. This also raises the user's Speed stat." + }, + "sweetScent": { + "name": "Sweet Scent", + "effect": "A sweet scent that harshly lowers opposing Pokémon's evasiveness." + }, + "ironTail": { + "name": "Iron Tail", + "effect": "The target is slammed with a steel-hard tail. This may also lower the target's Defense stat." + }, + "metalClaw": { + "name": "Metal Claw", + "effect": "The target is raked with steel claws. This may also raise the user's Attack stat." + }, + "vitalThrow": { + "name": "Vital Throw", + "effect": "The user attacks last. In return, this throw move never misses." + }, + "morningSun": { + "name": "Morning Sun", + "effect": "The user restores its own HP. The amount of HP regained varies with the weather." + }, + "synthesis": { + "name": "Synthesis", + "effect": "The user restores its own HP. The amount of HP regained varies with the weather." + }, + "moonlight": { + "name": "Moonlight", + "effect": "The user restores its own HP. The amount of HP regained varies with the weather." + }, + "hiddenPower": { + "name": "Hidden Power", + "effect": "A unique attack that varies in type depending on the Pokémon using it." + }, + "crossChop": { + "name": "Cross Chop", + "effect": "The user delivers a double chop with its forearms crossed. Critical hits land more easily." + }, + "twister": { + "name": "Twister", + "effect": "The user whips up a vicious tornado to tear at opposing Pokémon. This may also make them flinch." + }, + "rainDance": { + "name": "Rain Dance", + "effect": "The user summons a heavy rain that falls for five turns, powering up Water-type moves. It lowers the power of Fire-type moves." + }, + "sunnyDay": { + "name": "Sunny Day", + "effect": "The user intensifies the sun for five turns, powering up Fire-type moves. It lowers the power of Water-type moves." + }, + "crunch": { + "name": "Crunch", + "effect": "The user crunches up the target with sharp fangs. This may also lower the target's Defense stat." + }, + "mirrorCoat": { + "name": "Mirror Coat", + "effect": "A retaliation move that counters any special attack, inflicting double the damage taken." + }, + "psychUp": { + "name": "Psych Up", + "effect": "The user hypnotizes itself into copying any stat change made by the target." + }, + "extremeSpeed": { + "name": "Extreme Speed", + "effect": "The user charges the target at blinding speed. This move always goes first." + }, + "ancientPower": { + "name": "Ancient Power", + "effect": "The user attacks with a prehistoric power. This may also raise all the user's stats at once." + }, + "shadowBall": { + "name": "Shadow Ball", + "effect": "The user hurls a shadowy blob at the target. This may also lower the target's Sp. Def stat." + }, + "futureSight": { + "name": "Future Sight", + "effect": "Two turns after this move is used, a hunk of psychic energy attacks the target." + }, + "rockSmash": { + "name": "Rock Smash", + "effect": "The user attacks with a punch. This may also lower the target's Defense stat." + }, + "whirlpool": { + "name": "Whirlpool", + "effect": "The user traps the target in a violent swirling whirlpool for four to five turns." + }, + "beatUp": { + "name": "Beat Up", + "effect": "The user gets all party Pokémon to attack the target. The more party Pokémon, the greater the number of attacks." + }, + "fakeOut": { + "name": "Fake Out", + "effect": "This attack hits first and makes the target flinch. It only works the first turn each time the user enters battle." + }, + "uproar": { + "name": "Uproar", + "effect": "The user attacks in an uproar for three turns. During that time, no Pokémon can fall asleep." + }, + "stockpile": { + "name": "Stockpile", + "effect": "The user charges up power and raises both its Defense and Sp. Def stats. The move can be used three times." + }, + "spitUp": { + "name": "Spit Up", + "effect": "The power stored using the move Stockpile is released at once in an attack. The more power is stored, the greater the move's power." + }, + "swallow": { + "name": "Swallow", + "effect": "The power stored using the move Stockpile is absorbed by the user to heal its HP. Storing more power heals more HP." + }, + "heatWave": { + "name": "Heat Wave", + "effect": "The user attacks by exhaling hot breath on opposing Pokémon. This may also leave those Pokémon with a burn." + }, + "hail": { + "name": "Hail", + "effect": "The user summons a hailstorm lasting five turns. It damages all Pokémon except Ice types." + }, + "torment": { + "name": "Torment", + "effect": "The user torments and enrages the target, making it incapable of using the same move twice in a row." + }, + "flatter": { + "name": "Flatter", + "effect": "Flattery is used to confuse the target. However, this also raises the target's Sp. Atk stat." + }, + "willOWisp": { + "name": "Will-O-Wisp", + "effect": "The user shoots a sinister flame at the target to inflict a burn." + }, + "memento": { + "name": "Memento", + "effect": "The user faints when using this move. In return, this harshly lowers the target's Attack and Sp. Atk stats." + }, + "facade": { + "name": "Facade", + "effect": "This attack move doubles its power if the user is poisoned, burned, or paralyzed." + }, + "focusPunch": { + "name": "Focus Punch", + "effect": "The user focuses its mind before launching a punch. This move fails if the user is hit before it is used." + }, + "smellingSalts": { + "name": "Smelling Salts", + "effect": "This attack's power is doubled when used on a target with paralysis. This also cures the target's paralysis, however." + }, + "followMe": { + "name": "Follow Me", + "effect": "The user draws attention to itself, making all targets take aim only at the user." + }, + "naturePower": { + "name": "Nature Power", + "effect": "This attack makes use of nature's power. Its effects vary depending on the user's environment." + }, + "charge": { + "name": "Charge", + "effect": "The user boosts the power of the Electric move it uses on the next turn. This also raises the user's Sp. Def stat." + }, + "taunt": { + "name": "Taunt", + "effect": "The target is taunted into a rage that allows it to use only attack moves for three turns." + }, + "helpingHand": { + "name": "Helping Hand", + "effect": "The user assists an ally by boosting the power of that ally's attack." + }, + "trick": { + "name": "Trick", + "effect": "The user catches the target off guard and swaps its held item with its own." + }, + "rolePlay": { + "name": "Role Play", + "effect": "The user mimics the target completely, copying the target's Ability." + }, + "wish": { + "name": "Wish", + "effect": "One turn after this move is used, the user's or its replacement's HP is restored by half the user's max HP." + }, + "assist": { + "name": "Assist", + "effect": "The user hurriedly and randomly uses a move among those known by ally Pokémon." + }, + "ingrain": { + "name": "Ingrain", + "effect": "The user lays roots that restore its HP on every turn. Because it's rooted, it can't switch out." + }, + "superpower": { + "name": "Superpower", + "effect": "The user attacks the target with great power. However, this also lowers the user's Attack and Defense stats." + }, + "magicCoat": { + "name": "Magic Coat", + "effect": "Moves like Leech Seed and moves that inflict status conditions are blocked by a barrier and reflected back to the user of those moves." + }, + "recycle": { + "name": "Recycle", + "effect": "The user recycles a held item that has been used in battle so it can be used again." + }, + "revenge": { + "name": "Revenge", + "effect": "This attack move's power is doubled if the user has been hurt by the opponent in the same turn." + }, + "brickBreak": { + "name": "Brick Break", + "effect": "The user attacks with a swift chop. It can also break barriers, such as Light Screen and Reflect." + }, + "yawn": { + "name": "Yawn", + "effect": "The user lets loose a huge yawn that lulls the target into falling asleep on the next turn." + }, + "knockOff": { + "name": "Knock Off", + "effect": "The user slaps down the target's held item, and that item can't be used in that battle. The move does more damage if the target has a held item." + }, + "endeavor": { + "name": "Endeavor", + "effect": "This attack move cuts down the target's HP to equal the user's HP." + }, + "eruption": { + "name": "Eruption", + "effect": "The user attacks opposing Pokémon with explosive fury. The lower the user's HP, the lower the move's power." + }, + "skillSwap": { + "name": "Skill Swap", + "effect": "The user employs its psychic power to exchange Abilities with the target." + }, + "imprison": { + "name": "Imprison", + "effect": "If opposing Pokémon know any move also known by the user, they are prevented from using it." + }, + "refresh": { + "name": "Refresh", + "effect": "The user rests to cure itself of poisoning, a burn, or paralysis." + }, + "grudge": { + "name": "Grudge", + "effect": "If the user faints, the user's grudge fully depletes the PP of the opponent's move that knocked it out." + }, + "snatch": { + "name": "Snatch", + "effect": "The user steals the effects of any attempts to use a healing or stat-changing move." + }, + "secretPower": { + "name": "Secret Power", + "effect": "The additional effects of this attack depend upon where it was used." + }, + "dive": { + "name": "Dive", + "effect": "Diving on the first turn, the user floats up and attacks on the next turn." + }, + "armThrust": { + "name": "Arm Thrust", + "effect": "The user lets loose a flurry of open-palmed arm thrusts that hit two to five times in a row." + }, + "camouflage": { + "name": "Camouflage", + "effect": "The user's type is changed depending on its environment, such as at water's edge, in grass, or in a cave." + }, + "tailGlow": { + "name": "Tail Glow", + "effect": "The user stares at flashing lights to focus its mind, drastically raising its Sp. Atk stat." + }, + "lusterPurge": { + "name": "Luster Purge", + "effect": "The user lets loose a damaging burst of light. This may also lower the target's Sp. Def stat." + }, + "mistBall": { + "name": "Mist Ball", + "effect": "A mist-like flurry of down envelops and damages the target. This may also lower the target's Sp. Atk stat." + }, + "featherDance": { + "name": "Feather Dance", + "effect": "The user covers the target's body with a mass of down that harshly lowers its Attack stat." + }, + "teeterDance": { + "name": "Teeter Dance", + "effect": "The user performs a wobbly dance that confuses the Pokémon around it." + }, + "blazeKick": { + "name": "Blaze Kick", + "effect": "The user launches a kick that lands a critical hit more easily. This may also leave the target with a burn." + }, + "mudSport": { + "name": "Mud Sport", + "effect": "The user kicks up mud on the battlefield. This weakens Electric-type moves for five turns." + }, + "iceBall": { + "name": "Ice Ball", + "effect": "The user attacks the target for five turns. The move's power increases each time it hits." + }, + "needleArm": { + "name": "Needle Arm", + "effect": "The user attacks by wildly swinging its thorny arms. This may also make the target flinch." + }, + "slackOff": { + "name": "Slack Off", + "effect": "The user slacks off, restoring its own HP by up to half of its max HP." + }, + "hyperVoice": { + "name": "Hyper Voice", + "effect": "The user lets loose a horribly echoing shout with the power to inflict damage." + }, + "poisonFang": { + "name": "Poison Fang", + "effect": "The user bites the target with toxic fangs. This may also leave the target badly poisoned." + }, + "crushClaw": { + "name": "Crush Claw", + "effect": "The user slashes the target with hard and sharp claws. This may also lower the target's Defense stat." + }, + "blastBurn": { + "name": "Blast Burn", + "effect": "The target is razed by a fiery explosion. The user can't move on the next turn." + }, + "hydroCannon": { + "name": "Hydro Cannon", + "effect": "The target is hit with a watery blast. The user can't move on the next turn." + }, + "meteorMash": { + "name": "Meteor Mash", + "effect": "The target is hit with a hard punch fired like a meteor. This may also raise the user's Attack stat." + }, + "astonish": { + "name": "Astonish", + "effect": "The user attacks the target while shouting in a startling fashion. This may also make the target flinch." + }, + "weatherBall": { + "name": "Weather Ball", + "effect": "This attack move varies in power and type depending on the weather." + }, + "aromatherapy": { + "name": "Aromatherapy", + "effect": "The user releases a soothing scent that heals all status conditions affecting the user's party." + }, + "fakeTears": { + "name": "Fake Tears", + "effect": "The user feigns crying to fluster the target, harshly lowering its Sp. Def stat." + }, + "airCutter": { + "name": "Air Cutter", + "effect": "The user launches razor-like wind to slash opposing Pokémon. Critical hits land more easily." + }, + "overheat": { + "name": "Overheat", + "effect": "The user attacks the target at full power. The attack's recoil harshly lowers the user's Sp. Atk stat." + }, + "odorSleuth": { + "name": "Odor Sleuth", + "effect": "Enables a Ghost-type target to be hit by Normal- and Fighting-type attacks. This also enables an evasive target to be hit." + }, + "rockTomb": { + "name": "Rock Tomb", + "effect": "Boulders are hurled at the target. This also lowers the target's Speed stat by preventing its movement." + }, + "silverWind": { + "name": "Silver Wind", + "effect": "The target is attacked with powdery scales blown by the wind. This may also raise all the user's stats." + }, + "metalSound": { + "name": "Metal Sound", + "effect": "A horrible sound like scraping metal harshly lowers the target's Sp. Def stat." + }, + "grassWhistle": { + "name": "Grass Whistle", + "effect": "The user plays a pleasant melody that lulls the target into a deep sleep." + }, + "tickle": { + "name": "Tickle", + "effect": "The user tickles the target into laughing, reducing its Attack and Defense stats." + }, + "cosmicPower": { + "name": "Cosmic Power", + "effect": "The user absorbs a mystical power from space to raise its Defense and Sp. Def stats." + }, + "waterSpout": { + "name": "Water Spout", + "effect": "The user spouts water to damage opposing Pokémon. The lower the user's HP, the lower the move's power." + }, + "signalBeam": { + "name": "Signal Beam", + "effect": "The user attacks with a sinister beam of light. This may also confuse the target." + }, + "shadowPunch": { + "name": "Shadow Punch", + "effect": "The user throws a punch from the shadows. This attack never misses." + }, + "extrasensory": { + "name": "Extrasensory", + "effect": "The user attacks with an odd, unseeable power. This may also make the target flinch." + }, + "skyUppercut": { + "name": "Sky Uppercut", + "effect": "The user attacks the target with an uppercut thrown skyward with force." + }, + "sandTomb": { + "name": "Sand Tomb", + "effect": "The user traps the target inside a harshly raging sandstorm for four to five turns." + }, + "sheerCold": { + "name": "Sheer Cold", + "effect": "The target faints instantly. It's less likely to hit the target if it's used by Pokémon other than Ice types." + }, + "muddyWater": { + "name": "Muddy Water", + "effect": "The user attacks by shooting muddy water at opposing Pokémon. This may also lower their accuracy." + }, + "bulletSeed": { + "name": "Bullet Seed", + "effect": "The user forcefully shoots seeds at the target two to five times in a row." + }, + "aerialAce": { + "name": "Aerial Ace", + "effect": "The user confounds the target with speed, then slashes. This attack never misses." + }, + "icicleSpear": { + "name": "Icicle Spear", + "effect": "The user launches sharp icicles at the target two to five times in a row." + }, + "ironDefense": { + "name": "Iron Defense", + "effect": "The user hardens its body's surface like iron, sharply raising its Defense stat." + }, + "block": { + "name": "Block", + "effect": "The user blocks the target's way with arms spread wide to prevent escape." + }, + "howl": { + "name": "Howl", + "effect": "The user howls loudly to raise the spirit of itself and allies. This raises their Attack stats." + }, + "dragonClaw": { + "name": "Dragon Claw", + "effect": "The user slashes the target with huge sharp claws." + }, + "frenzyPlant": { + "name": "Frenzy Plant", + "effect": "The user slams the target with the roots of an enormous tree. The user can't move on the next turn." + }, + "bulkUp": { + "name": "Bulk Up", + "effect": "The user tenses its muscles to bulk up its body, raising both its Attack and Defense stats." + }, + "bounce": { + "name": "Bounce", + "effect": "The user bounces up high, then drops on the target on the second turn. This may also leave the target with paralysis." + }, + "mudShot": { + "name": "Mud Shot", + "effect": "The user attacks by hurling a blob of mud at the target. This also lowers the target's Speed stat." + }, + "poisonTail": { + "name": "Poison Tail", + "effect": "The user hits the target with its tail. This may also poison the target. Critical hits land more easily." + }, + "covet": { + "name": "Covet", + "effect": "The user endearingly approaches the target, then has a 30% chance to steal the target's held item." + }, + "voltTackle": { + "name": "Volt Tackle", + "effect": "The user electrifies itself and charges the target. This also damages the user quite a lot. This attack may leave the target with paralysis." + }, + "magicalLeaf": { + "name": "Magical Leaf", + "effect": "The user scatters curious leaves that chase the target. This attack never misses." + }, + "waterSport": { + "name": "Water Sport", + "effect": "The user soaks the battlefield with water. This weakens Fire-type moves for five turns." + }, + "calmMind": { + "name": "Calm Mind", + "effect": "The user quietly focuses its mind and calms its spirit to raise its Sp. Atk and Sp. Def stats." + }, + "leafBlade": { + "name": "Leaf Blade", + "effect": "The user handles a sharp leaf like a sword and attacks by cutting its target. Critical hits land more easily." + }, + "dragonDance": { + "name": "Dragon Dance", + "effect": "The user vigorously performs a mystic, powerful dance that raises its Attack and Speed stats." + }, + "rockBlast": { + "name": "Rock Blast", + "effect": "The user hurls hard rocks at the target. Two to five rocks are launched in a row." + }, + "shockWave": { + "name": "Shock Wave", + "effect": "The user strikes the target with a quick jolt of electricity. This attack never misses." + }, + "waterPulse": { + "name": "Water Pulse", + "effect": "The user attacks the target with a pulsing blast of water. This may also confuse the target." + }, + "doomDesire": { + "name": "Doom Desire", + "effect": "Two turns after this move is used, a concentrated bundle of light blasts the target." + }, + "psychoBoost": { + "name": "Psycho Boost", + "effect": "The user attacks the target at full power. The attack's recoil harshly lowers the user's Sp. Atk stat." + }, + "roost": { + "name": "Roost", + "effect": "The user lands and rests its body. This move restores the user's HP by up to half of its max HP." + }, + "gravity": { + "name": "Gravity", + "effect": "This move enables Flying-type Pokémon or Pokémon with the Levitate Ability to be hit by Ground-type moves. Moves that involve flying can't be used." + }, + "miracleEye": { + "name": "Miracle Eye", + "effect": "Enables a Dark-type target to be hit by Psychic-type attacks. This also enables an evasive target to be hit." + }, + "wakeUpSlap": { + "name": "Wake-Up Slap", + "effect": "This attack inflicts big damage on a sleeping target. This also wakes the target up, however." + }, + "hammerArm": { + "name": "Hammer Arm", + "effect": "The user swings and hits with its strong, heavy fist. It lowers the user's Speed, however." + }, + "gyroBall": { + "name": "Gyro Ball", + "effect": "The user tackles the target with a high-speed spin. The slower the user compared to the target, the greater the move's power." + }, + "healingWish": { + "name": "Healing Wish", + "effect": "The user faints. In return, the Pokémon taking its place will have its HP restored and status conditions cured." + }, + "brine": { + "name": "Brine", + "effect": "If the target's HP is half or less, this attack will hit with double the power." + }, + "naturalGift": { + "name": "Natural Gift", + "effect": "The user draws power to attack by using its held Berry. The Berry determines the move's type and power." + }, + "feint": { + "name": "Feint", + "effect": "This attack hits a target using a move such as Protect or Detect. This also lifts the effects of those moves." + }, + "pluck": { + "name": "Pluck", + "effect": "The user pecks the target. If the target is holding a Berry, the user eats it and gains its effect." + }, + "tailwind": { + "name": "Tailwind", + "effect": "The user whips up a turbulent whirlwind that ups the Speed stats of the user and its allies for four turns." + }, + "acupressure": { + "name": "Acupressure", + "effect": "The user applies pressure to stress points, sharply boosting one of its or its allies' stats." + }, + "metalBurst": { + "name": "Metal Burst", + "effect": "The user retaliates with much greater force against the opponent that last inflicted damage on it." + }, + "uTurn": { + "name": "U-turn", + "effect": "After making its attack, the user rushes back to switch places with a party Pokémon in waiting." + }, + "closeCombat": { + "name": "Close Combat", + "effect": "The user fights the target up close without guarding itself. This also lowers the user's Defense and Sp. Def stats." + }, + "payback": { + "name": "Payback", + "effect": "The user stores power, then attacks. If the user moves after the target, this attack's power will be doubled." + }, + "assurance": { + "name": "Assurance", + "effect": "If the target has already taken some damage in the same turn, this attack's power is doubled." + }, + "embargo": { + "name": "Embargo", + "effect": "This move prevents the target from using its held item for five turns. Its Trainer is also prevented from using items on it." + }, + "fling": { + "name": "Fling", + "effect": "The user flings its held item at the target to attack. This move's power and effects depend on the item." + }, + "psychoShift": { + "name": "Psycho Shift", + "effect": "Using its psychic power of suggestion, the user transfers its status conditions to the target." + }, + "trumpCard": { + "name": "Trump Card", + "effect": "The fewer PP this move has, the greater its power." + }, + "healBlock": { + "name": "Heal Block", + "effect": "For five turns, the user prevents the opposing team from using any moves, Abilities, or held items that recover HP." + }, + "wringOut": { + "name": "Wring Out", + "effect": "The user powerfully wrings the target. The more HP the target has, the greater the move's power." + }, + "powerTrick": { + "name": "Power Trick", + "effect": "The user employs its psychic power to switch its Attack stat with its Defense stat." + }, + "gastroAcid": { + "name": "Gastro Acid", + "effect": "The user hurls up its stomach acids on the target. The fluid eliminates the effect of the target's Ability." + }, + "luckyChant": { + "name": "Lucky Chant", + "effect": "The user chants an incantation toward the sky, preventing opposing Pokémon from landing critical hits for five turns." + }, + "meFirst": { + "name": "Me First", + "effect": "The user cuts ahead of the target to copy and use the target's intended move with greater power. This move fails if it isn't used first." + }, + "copycat": { + "name": "Copycat", + "effect": "The user mimics the move used immediately before it. The move fails if no other move has been used yet." + }, + "powerSwap": { + "name": "Power Swap", + "effect": "The user employs its psychic power to switch changes to its Attack and Sp. Atk stats with the target." + }, + "guardSwap": { + "name": "Guard Swap", + "effect": "The user employs its psychic power to switch changes to its Defense and Sp. Def stats with the target." + }, + "punishment": { + "name": "Punishment", + "effect": "The more the target has powered up with stat changes, the greater the move's power." + }, + "lastResort": { + "name": "Last Resort", + "effect": "This move can be used only after the user has used all the other moves it knows in the battle." + }, + "worrySeed": { + "name": "Worry Seed", + "effect": "A seed that causes worry is planted on the target. It prevents sleep by making the target's Ability Insomnia." + }, + "suckerPunch": { + "name": "Sucker Punch", + "effect": "This move enables the user to attack first. This move fails if the target is not readying an attack." + }, + "toxicSpikes": { + "name": "Toxic Spikes", + "effect": "The user lays a trap of poison spikes at the feet of the opposing team. The spikes will poison opposing Pokémon that switch into battle." + }, + "heartSwap": { + "name": "Heart Swap", + "effect": "The user employs its psychic power to switch stat changes with the target." + }, + "aquaRing": { + "name": "Aqua Ring", + "effect": "The user envelops itself in a veil made of water. It regains some HP every turn." + }, + "magnetRise": { + "name": "Magnet Rise", + "effect": "The user levitates using electrically generated magnetism for five turns." + }, + "flareBlitz": { + "name": "Flare Blitz", + "effect": "The user cloaks itself in fire and charges the target. This also damages the user quite a lot. This attack may leave the target with a burn." + }, + "forcePalm": { + "name": "Force Palm", + "effect": "The target is attacked with a shock wave. This may also leave the target with paralysis." + }, + "auraSphere": { + "name": "Aura Sphere", + "effect": "The user lets loose a blast of aura power from deep within its body at the target. This attack never misses." + }, + "rockPolish": { + "name": "Rock Polish", + "effect": "The user polishes its body to reduce drag. This sharply raises the Speed stat." + }, + "poisonJab": { + "name": "Poison Jab", + "effect": "The target is stabbed with a tentacle, arm, or the like steeped in poison. This may also poison the target." + }, + "darkPulse": { + "name": "Dark Pulse", + "effect": "The user releases a horrible aura imbued with dark thoughts. This may also make the target flinch." + }, + "nightSlash": { + "name": "Night Slash", + "effect": "The user slashes the target the instant an opportunity arises. Critical hits land more easily." + }, + "aquaTail": { + "name": "Aqua Tail", + "effect": "The user attacks by swinging its tail as if it were a vicious wave in a raging storm." + }, + "seedBomb": { + "name": "Seed Bomb", + "effect": "The user slams a barrage of hard-shelled seeds down on the target from above." + }, + "airSlash": { + "name": "Air Slash", + "effect": "The user attacks with a blade of air that slices even the sky. This may also make the target flinch." + }, + "xScissor": { + "name": "X-Scissor", + "effect": "The user slashes at the target by crossing its scythes or claws as if they were a pair of scissors." + }, + "bugBuzz": { + "name": "Bug Buzz", + "effect": "The user generates a damaging sound wave by vibration. This may also lower the target's Sp. Def stat." + }, + "dragonPulse": { + "name": "Dragon Pulse", + "effect": "The target is attacked with a shock wave generated by the user's gaping mouth." + }, + "dragonRush": { + "name": "Dragon Rush", + "effect": "The user tackles the target while exhibiting overwhelming menace. This may also make the target flinch." + }, + "powerGem": { + "name": "Power Gem", + "effect": "The user attacks with a ray of light that sparkles as if it were made of gemstones." + }, + "drainPunch": { + "name": "Drain Punch", + "effect": "An energy-draining punch. The user's HP is restored by half the damage taken by the target." + }, + "vacuumWave": { + "name": "Vacuum Wave", + "effect": "The user whirls its fists to send a wave of pure vacuum at the target. This move always goes first." + }, + "focusBlast": { + "name": "Focus Blast", + "effect": "The user heightens its mental focus and unleashes its power. This may also lower the target's Sp. Def stat." + }, + "energyBall": { + "name": "Energy Ball", + "effect": "The user draws power from nature and fires it at the target. This may also lower the target's Sp. Def stat." + }, + "braveBird": { + "name": "Brave Bird", + "effect": "The user tucks in its wings and charges from a low altitude. This also damages the user quite a lot." + }, + "earthPower": { + "name": "Earth Power", + "effect": "The user makes the ground under the target erupt with power. This may also lower the target's Sp. Def stat." + }, + "switcheroo": { + "name": "Switcheroo", + "effect": "The user trades held items with the target faster than the eye can follow." + }, + "gigaImpact": { + "name": "Giga Impact", + "effect": "The user charges at the target using every bit of its power. The user can't move on the next turn." + }, + "nastyPlot": { + "name": "Nasty Plot", + "effect": "The user stimulates its brain by thinking bad thoughts. This sharply raises the user's Sp. Atk stat." + }, + "bulletPunch": { + "name": "Bullet Punch", + "effect": "The user strikes the target with tough punches as fast as bullets. This move always goes first." + }, + "avalanche": { + "name": "Avalanche", + "effect": "The power of this attack move is doubled if the user has been hurt by the target in the same turn." + }, + "iceShard": { + "name": "Ice Shard", + "effect": "The user flash-freezes chunks of ice and hurls them at the target. This move always goes first." + }, + "shadowClaw": { + "name": "Shadow Claw", + "effect": "The user slashes with a sharp claw made from shadows. Critical hits land more easily." + }, + "thunderFang": { + "name": "Thunder Fang", + "effect": "The user bites with electrified fangs. This may also make the target flinch or leave it with paralysis." + }, + "iceFang": { + "name": "Ice Fang", + "effect": "The user bites with cold-infused fangs. This may also make the target flinch or leave it frozen." + }, + "fireFang": { + "name": "Fire Fang", + "effect": "The user bites with flame-cloaked fangs. This may also make the target flinch or leave it with a burn." + }, + "shadowSneak": { + "name": "Shadow Sneak", + "effect": "The user extends its shadow and attacks the target from behind. This move always goes first." + }, + "mudBomb": { + "name": "Mud Bomb", + "effect": "The user launches a hard-packed mud ball to attack. This may also lower the target's accuracy." + }, + "psychoCut": { + "name": "Psycho Cut", + "effect": "The user tears at the target with blades formed by psychic power. Critical hits land more easily." + }, + "zenHeadbutt": { + "name": "Zen Headbutt", + "effect": "The user focuses its willpower to its head and attacks the target. This may also make the target flinch." + }, + "mirrorShot": { + "name": "Mirror Shot", + "effect": "The user lets loose a flash of energy at the target from its polished body. This may also lower the target's accuracy." + }, + "flashCannon": { + "name": "Flash Cannon", + "effect": "The user gathers all its light energy and releases it all at once. This may also lower the target's Sp. Def stat." + }, + "rockClimb": { + "name": "Rock Climb", + "effect": "The user attacks the target by smashing into it with incredible force. This may also confuse the target." + }, + "defog": { + "name": "Defog", + "effect": "A strong wind blows away the target's barriers such as Reflect or Light Screen. This also lowers the target's evasiveness." + }, + "trickRoom": { + "name": "Trick Room", + "effect": "The user creates a bizarre area in which slower Pokémon get to move first for five turns." + }, + "dracoMeteor": { + "name": "Draco Meteor", + "effect": "Comets are summoned down from the sky onto the target. The attack's recoil harshly lowers the user's Sp. Atk stat." + }, + "discharge": { + "name": "Discharge", + "effect": "The user strikes everything around it by letting loose a flare of electricity. This may also cause paralysis." + }, + "lavaPlume": { + "name": "Lava Plume", + "effect": "The user torches everything around it in an inferno of scarlet flames. This may also leave those it hits with a burn." + }, + "leafStorm": { + "name": "Leaf Storm", + "effect": "The user whips up a storm of leaves around the target. The attack's recoil harshly lowers the user's Sp. Atk stat." + }, + "powerWhip": { + "name": "Power Whip", + "effect": "The user violently whirls its vines, tentacles, or the like to harshly lash the target." + }, + "rockWrecker": { + "name": "Rock Wrecker", + "effect": "The user launches a huge boulder at the target to attack. The user can't move on the next turn." + }, + "crossPoison": { + "name": "Cross Poison", + "effect": "A slashing attack with a poisonous blade that may also poison the target. Critical hits land more easily." + }, + "gunkShot": { + "name": "Gunk Shot", + "effect": "The user shoots filthy garbage at the target to attack. This may also poison the target." + }, + "ironHead": { + "name": "Iron Head", + "effect": "The user slams the target with its steel-hard head. This may also make the target flinch." + }, + "magnetBomb": { + "name": "Magnet Bomb", + "effect": "The user launches steel bombs that stick to the target. This attack never misses." + }, + "stoneEdge": { + "name": "Stone Edge", + "effect": "The user stabs the target from below with sharpened stones. Critical hits land more easily." + }, + "captivate": { + "name": "Captivate", + "effect": "If any opposing Pokémon is the opposite gender of the user, it is charmed, which harshly lowers its Sp. Atk stat." + }, + "stealthRock": { + "name": "Stealth Rock", + "effect": "The user lays a trap of levitating stones around the opposing team. The trap hurts opposing Pokémon that switch into battle." + }, + "grassKnot": { + "name": "Grass Knot", + "effect": "The user snares the target with grass and trips it. The heavier the target, the greater the move's power." + }, + "chatter": { + "name": "Chatter", + "effect": "The user attacks the target with sound waves of deafening chatter. This confuses the target." + }, + "judgment": { + "name": "Judgment", + "effect": "The user releases countless shots of light at the target. This move's type varies depending on the kind of Plate the user is holding." + }, + "bugBite": { + "name": "Bug Bite", + "effect": "The user bites the target. If the target is holding a Berry, the user eats it and gains its effect." + }, + "chargeBeam": { + "name": "Charge Beam", + "effect": "The user attacks the target with an electric charge. The user may use any remaining electricity to raise its Sp. Atk stat." + }, + "woodHammer": { + "name": "Wood Hammer", + "effect": "The user slams its rugged body into the target to attack. This also damages the user quite a lot." + }, + "aquaJet": { + "name": "Aqua Jet", + "effect": "The user lunges at the target at a speed that makes it almost invisible. This move always goes first." + }, + "attackOrder": { + "name": "Attack Order", + "effect": "The user calls out its underlings to pummel the target. Critical hits land more easily." + }, + "defendOrder": { + "name": "Defend Order", + "effect": "The user calls out its underlings to shield its body, raising its Defense and Sp. Def stats." + }, + "healOrder": { + "name": "Heal Order", + "effect": "The user calls out its underlings to heal it. The user regains up to half of its max HP." + }, + "headSmash": { + "name": "Head Smash", + "effect": "The user attacks the target with a hazardous, full-power headbutt. This also damages the user terribly." + }, + "doubleHit": { + "name": "Double Hit", + "effect": "The user slams the target with a long tail, vines, or a tentacle. The target is hit twice in a row." + }, + "roarOfTime": { + "name": "Roar of Time", + "effect": "The user blasts the target with power that distorts even time. The user can't move on the next turn." + }, + "spacialRend": { + "name": "Spacial Rend", + "effect": "The user tears the target along with the space around it. Critical hits land more easily." + }, + "lunarDance": { + "name": "Lunar Dance", + "effect": "The user faints. In return, the Pokémon taking its place will have its status and HP fully restored." + }, + "crushGrip": { + "name": "Crush Grip", + "effect": "The target is crushed with great force. The more HP the target has left, the greater this move's power." + }, + "magmaStorm": { + "name": "Magma Storm", + "effect": "The target becomes trapped within a maelstrom of fire that rages for four to five turns." + }, + "darkVoid": { + "name": "Dark Void", + "effect": "Opposing Pokémon are dragged into a world of total darkness that makes them sleep." + }, + "seedFlare": { + "name": "Seed Flare", + "effect": "The user emits a shock wave from its body to attack its target. This may also harshly lower the target's Sp. Def stat." + }, + "ominousWind": { + "name": "Ominous Wind", + "effect": "The user blasts the target with a gust of repulsive wind. This may also raise all the user's stats at once." + }, + "shadowForce": { + "name": "Shadow Force", + "effect": "The user disappears, then strikes the target on the next turn. This move hits even if the target protects itself." + }, + "honeClaws": { + "name": "Hone Claws", + "effect": "The user sharpens its claws to boost its Attack stat and accuracy." + }, + "wideGuard": { + "name": "Wide Guard", + "effect": "The user and its allies are protected from wide-ranging attacks for one turn." + }, + "guardSplit": { + "name": "Guard Split", + "effect": "The user employs its psychic power to average its Defense and Sp. Def stats with those of the target." + }, + "powerSplit": { + "name": "Power Split", + "effect": "The user employs its psychic power to average its Attack and Sp. Atk stats with those of the target." + }, + "wonderRoom": { + "name": "Wonder Room", + "effect": "The user creates a bizarre area in which Pokémon's Defense and Sp. Def stats are swapped for five turns." + }, + "psyshock": { + "name": "Psyshock", + "effect": "The user materializes an odd psychic wave to attack the target. This attack does physical damage." + }, + "venoshock": { + "name": "Venoshock", + "effect": "The user drenches the target in a special poisonous liquid. This move's power is doubled if the target is poisoned." + }, + "autotomize": { + "name": "Autotomize", + "effect": "The user sheds part of its body to make itself lighter and sharply raise its Speed stat." + }, + "ragePowder": { + "name": "Rage Powder", + "effect": "The user scatters a cloud of irritating powder to draw attention to itself. Opposing Pokémon aim only at the user." + }, + "telekinesis": { + "name": "Telekinesis", + "effect": "The user makes the target float with its psychic power. The target is easier to hit for three turns." + }, + "magicRoom": { + "name": "Magic Room", + "effect": "The user creates a bizarre area in which Pokémon's held items lose their effects for five turns." + }, + "smackDown": { + "name": "Smack Down", + "effect": "The user throws a stone or similar projectile to attack the target. A flying Pokémon will fall to the ground when it's hit." + }, + "stormThrow": { + "name": "Storm Throw", + "effect": "The user strikes the target with a fierce blow. This attack always results in a critical hit." + }, + "flameBurst": { + "name": "Flame Burst", + "effect": "The user attacks the target with a bursting flame. The bursting flame damages Pokémon next to the target as well." + }, + "sludgeWave": { + "name": "Sludge Wave", + "effect": "The user strikes everything around it by swamping the area with a giant sludge wave. This may also poison those hit." + }, + "quiverDance": { + "name": "Quiver Dance", + "effect": "The user lightly performs a beautiful, mystic dance. This boosts the user's Sp. Atk, Sp. Def, and Speed stats." + }, + "heavySlam": { + "name": "Heavy Slam", + "effect": "The user slams into the target with its heavy body. The more the user outweighs the target, the greater the move's power." + }, + "synchronoise": { + "name": "Synchronoise", + "effect": "Using an odd shock wave, the user inflicts damage on any Pokémon of the same type in the area around it." + }, + "electroBall": { + "name": "Electro Ball", + "effect": "The user hurls an electric orb at the target. The faster the user is than the target, the greater the move's power." + }, + "soak": { + "name": "Soak", + "effect": "The user shoots a torrent of water at the target and changes the target's type to Water." + }, + "flameCharge": { + "name": "Flame Charge", + "effect": "Cloaking itself in flame, the user attacks the target. Then, building up more power, the user raises its Speed stat." + }, + "coil": { + "name": "Coil", + "effect": "The user coils up and concentrates. This raises its Attack and Defense stats as well as its accuracy." + }, + "lowSweep": { + "name": "Low Sweep", + "effect": "The user makes a swift attack on the target's legs, which lowers the target's Speed stat." + }, + "acidSpray": { + "name": "Acid Spray", + "effect": "The user spits fluid that works to melt the target. This harshly lowers the target's Sp. Def stat." + }, + "foulPlay": { + "name": "Foul Play", + "effect": "The user turns the target's power against it. The higher the target's Attack stat, the greater the damage it deals." + }, + "simpleBeam": { + "name": "Simple Beam", + "effect": "The user's mysterious psychic wave changes the target's Ability to Simple." + }, + "entrainment": { + "name": "Entrainment", + "effect": "The user dances with an odd rhythm that compels the target to mimic it, making the target's Ability the same as the user's." + }, + "afterYou": { + "name": "After You", + "effect": "The user helps the target and makes it use its move right after the user." + }, + "round": { + "name": "Round", + "effect": "The user attacks the target with a song. Others can join in the Round to increase the power of the attack." + }, + "echoedVoice": { + "name": "Echoed Voice", + "effect": "The user attacks the target with an echoing voice. If this move is used every turn, its power is increased." + }, + "chipAway": { + "name": "Chip Away", + "effect": "Looking for an opening, the user strikes consistently. The target's stat changes don't affect this attack's damage." + }, + "clearSmog": { + "name": "Clear Smog", + "effect": "The user attacks the target by throwing a clump of special mud. All stat changes are returned to normal." + }, + "storedPower": { + "name": "Stored Power", + "effect": "The user attacks the target with stored power. The more the user's stats are raised, the greater the move's power." + }, + "quickGuard": { + "name": "Quick Guard", + "effect": "The user protects itself and its allies from priority moves." + }, + "allySwitch": { + "name": "Ally Switch", + "effect": "The user teleports using a strange power and switches places with one of its allies." + }, + "scald": { + "name": "Scald", + "effect": "The user shoots boiling hot water at its target. This may also leave the target with a burn." + }, + "shellSmash": { + "name": "Shell Smash", + "effect": "The user breaks its shell, which lowers Defense and Sp. Def stats but sharply raises its Attack, Sp. Atk, and Speed stats." + }, + "healPulse": { + "name": "Heal Pulse", + "effect": "The user emits a healing pulse that restores the target's HP by up to half of its max HP." + }, + "hex": { + "name": "Hex", + "effect": "This relentless attack does massive damage to a target affected by status conditions." + }, + "skyDrop": { + "name": "Sky Drop", + "effect": "The user takes the target into the sky, then drops it during the next turn. The target cannot attack while in the sky." + }, + "shiftGear": { + "name": "Shift Gear", + "effect": "The user rotates its gears, raising its Attack stat and sharply raising its Speed stat." + }, + "circleThrow": { + "name": "Circle Throw", + "effect": "The target is thrown, and a different Pokémon is dragged out. In the wild, this ends a battle against a single Pokémon." + }, + "incinerate": { + "name": "Incinerate", + "effect": "The user attacks opposing Pokémon with fire. If a Pokémon is holding a certain item, such as a Berry, the item becomes burned up and unusable." + }, + "quash": { + "name": "Quash", + "effect": "The user suppresses the target and makes its move go last." + }, + "acrobatics": { + "name": "Acrobatics", + "effect": "The user nimbly strikes the target. The fewer held items, the higher the damage it inflicts." + }, + "reflectType": { + "name": "Reflect Type", + "effect": "The user reflects the target's type, making the user the same type as the target." + }, + "retaliate": { + "name": "Retaliate", + "effect": "The user gets revenge for a fainted ally. If an ally fainted in the previous turn, this move's power is increased." + }, + "finalGambit": { + "name": "Final Gambit", + "effect": "The user risks everything to attack its target. The user faints but does damage equal to its HP." + }, + "bestow": { + "name": "Bestow", + "effect": "The user passes its held item to the target when the target isn't holding an item." + }, + "inferno": { + "name": "Inferno", + "effect": "The user attacks by engulfing the target in an intense fire. This leaves the target with a burn." + }, + "waterPledge": { + "name": "Water Pledge", + "effect": "A column of water hits the target. When used with its fire equivalent, its power increases and a rainbow appears." + }, + "firePledge": { + "name": "Fire Pledge", + "effect": "A column of fire hits the target. When used with its grass equivalent, its power increases and a vast sea of fire appears." + }, + "grassPledge": { + "name": "Grass Pledge", + "effect": "A column of grass hits the target. When used with its water equivalent, its power increases and a vast swamp appears." + }, + "voltSwitch": { + "name": "Volt Switch", + "effect": "After making its attack, the user rushes back to switch places with a party Pokémon in waiting." + }, + "struggleBug": { + "name": "Struggle Bug", + "effect": "While resisting, the user attacks opposing Pokémon. This lowers the Sp. Atk stats of those hit." + }, + "bulldoze": { + "name": "Bulldoze", + "effect": "The user strikes everything around it by stomping down on the ground. This lowers the Speed stats of those hit." + }, + "frostBreath": { + "name": "Frost Breath", + "effect": "The user blows its cold breath on the target. This attack always results in a critical hit." + }, + "dragonTail": { + "name": "Dragon Tail", + "effect": "The target is knocked away, and a different Pokémon is dragged out. In the wild, this ends a battle against a single Pokémon." + }, + "workUp": { + "name": "Work Up", + "effect": "The user is roused, and its Attack and Sp. Atk stats increase." + }, + "electroweb": { + "name": "Electroweb", + "effect": "The user attacks and captures opposing Pokémon using an electric net. This lowers their Speed stats." + }, + "wildCharge": { + "name": "Wild Charge", + "effect": "The user shrouds itself in electricity and smashes into its target. This also damages the user a little." + }, + "drillRun": { + "name": "Drill Run", + "effect": "The user crashes into its target while rotating its body like a drill. Critical hits land more easily." + }, + "dualChop": { + "name": "Dual Chop", + "effect": "The user attacks its target by hitting it with brutal strikes. The target is hit twice in a row." + }, + "heartStamp": { + "name": "Heart Stamp", + "effect": "The user unleashes a vicious blow after its cute act makes the target less wary. This may also make the target flinch." + }, + "hornLeech": { + "name": "Horn Leech", + "effect": "The user drains the target's energy with its horns. The user's HP is restored by half the damage taken by the target." + }, + "sacredSword": { + "name": "Sacred Sword", + "effect": "The user attacks by slicing with a long horn. The target's stat changes don't affect this attack's damage." + }, + "razorShell": { + "name": "Razor Shell", + "effect": "The user cuts its target with sharp shells. This may also lower the target's Defense stat." + }, + "heatCrash": { + "name": "Heat Crash", + "effect": "The user slams its target with its flame-covered body. The more the user outweighs the target, the greater the move's power." + }, + "leafTornado": { + "name": "Leaf Tornado", + "effect": "The user attacks its target by encircling it in sharp leaves. This attack may also lower the target's accuracy." + }, + "steamroller": { + "name": "Steamroller", + "effect": "The user crushes its target by rolling over the target with its rolled-up body. This may also make the target flinch." + }, + "cottonGuard": { + "name": "Cotton Guard", + "effect": "The user protects itself by wrapping its body in soft cotton, which drastically raises the user's Defense stat." + }, + "nightDaze": { + "name": "Night Daze", + "effect": "The user lets loose a pitch-black shock wave at its target. This may also lower the target's accuracy." + }, + "psystrike": { + "name": "Psystrike", + "effect": "The user materializes an odd psychic wave to attack the target. This attack does physical damage." + }, + "tailSlap": { + "name": "Tail Slap", + "effect": "The user attacks by striking the target with its hard tail. It hits the target two to five times in a row." + }, + "hurricane": { + "name": "Hurricane", + "effect": "The user attacks by wrapping its opponent in a fierce wind that flies up into the sky. This may also confuse the target." + }, + "headCharge": { + "name": "Head Charge", + "effect": "The user charges its head into its target, using its powerful guard hair. This also damages the user a little." + }, + "gearGrind": { + "name": "Gear Grind", + "effect": "The user attacks by throwing steel gears at its target twice." + }, + "searingShot": { + "name": "Searing Shot", + "effect": "The user torches everything around it in an inferno of scarlet flames. This may also leave those it hits with a burn." + }, + "technoBlast": { + "name": "Techno Blast", + "effect": "The user fires a beam of light at its target. The move's type changes depending on the Drive the user holds." + }, + "relicSong": { + "name": "Relic Song", + "effect": "The user sings an ancient song and attacks by appealing to the hearts of the listening opposing Pokémon. This may also induce sleep." + }, + "secretSword": { + "name": "Secret Sword", + "effect": "The user cuts with its long horn. The odd power contained in the horn does physical damage to the target." + }, + "glaciate": { + "name": "Glaciate", + "effect": "The user attacks by blowing freezing cold air at opposing Pokémon. This lowers their Speed stats." + }, + "boltStrike": { + "name": "Bolt Strike", + "effect": "The user surrounds itself with a great amount of electricity and charges its target. This may also leave the target with paralysis." + }, + "blueFlare": { + "name": "Blue Flare", + "effect": "The user attacks by engulfing the target in an intense, yet beautiful, blue flame. This may also leave the target with a burn." + }, + "fieryDance": { + "name": "Fiery Dance", + "effect": "Cloaked in flames, the user attacks the target by dancing and flapping its wings. This may also raise the user's Sp. Atk stat." + }, + "freezeShock": { + "name": "Freeze Shock", + "effect": "On the second turn, the user hits the target with electrically charged ice. This may also leave the target with paralysis." + }, + "iceBurn": { + "name": "Ice Burn", + "effect": "On the second turn, an ultracold, freezing wind surrounds the target. This may leave the target with a burn." + }, + "snarl": { + "name": "Snarl", + "effect": "The user yells as if it's ranting about something, which lowers the Sp. Atk stats of opposing Pokémon." + }, + "icicleCrash": { + "name": "Icicle Crash", + "effect": "The user attacks by harshly dropping large icicles onto the target. This may also make the target flinch." + }, + "vCreate": { + "name": "V-create", + "effect": "With a hot flame on its forehead, the user hurls itself at its target. This lowers the user's Defense, Sp. Def, and Speed stats." + }, + "fusionFlare": { + "name": "Fusion Flare", + "effect": "The user brings down a giant flame. This move's power is increased when influenced by an enormous lightning bolt." + }, + "fusionBolt": { + "name": "Fusion Bolt", + "effect": "The user throws down a giant lightning bolt. This move's power is increased when influenced by an enormous flame." + }, + "flyingPress": { + "name": "Flying Press", + "effect": "The user dives down onto the target from the sky. This move is Fighting and Flying type simultaneously." + }, + "matBlock": { + "name": "Mat Block", + "effect": "Using a pulled-up mat as a shield, the user protects itself and its allies from damaging moves. This does not stop status moves." + }, + "belch": { + "name": "Belch", + "effect": "The user lets out a damaging belch at the target. The user must eat a held Berry to use this move." + }, + "rototiller": { + "name": "Rototiller", + "effect": "Tilling the soil, the user makes it easier for plants to grow. This raises the Attack and Sp. Atk stats of Grass-type Pokémon." + }, + "stickyWeb": { + "name": "Sticky Web", + "effect": "The user weaves a sticky net around the opposing team, which lowers their Speed stats upon switching into battle." + }, + "fellStinger": { + "name": "Fell Stinger", + "effect": "When the user knocks out a target with this move, the user's Attack stat rises drastically." + }, + "phantomForce": { + "name": "Phantom Force", + "effect": "The user vanishes somewhere, then strikes the target on the next turn. This move hits even if the target protects itself." + }, + "trickOrTreat": { + "name": "Trick-or-Treat", + "effect": "The user takes the target trick-or-treating. This adds Ghost type to the target's type." + }, + "nobleRoar": { + "name": "Noble Roar", + "effect": "Letting out a noble roar, the user intimidates the target and lowers its Attack and Sp. Atk stats." + }, + "ionDeluge": { + "name": "Ion Deluge", + "effect": "The user disperses electrically charged particles, which changes Normal-type moves to Electric-type moves." + }, + "parabolicCharge": { + "name": "Parabolic Charge", + "effect": "The user attacks everything around it. The user's HP is restored by half the damage taken by those hit." + }, + "forestsCurse": { + "name": "Forest's Curse", + "effect": "The user puts a forest curse on the target. The target is now Grass type as well." + }, + "petalBlizzard": { + "name": "Petal Blizzard", + "effect": "The user stirs up a violent petal blizzard and attacks everything around it." + }, + "freezeDry": { + "name": "Freeze-Dry", + "effect": "The user rapidly cools the target. This may also leave the target frozen. This move is super effective on Water types." + }, + "disarmingVoice": { + "name": "Disarming Voice", + "effect": "Letting out a charming cry, the user does emotional damage to opposing Pokémon. This attack never misses." + }, + "partingShot": { + "name": "Parting Shot", + "effect": "With a parting threat, the user lowers the target's Attack and Sp. Atk stats. Then it switches with a party Pokémon." + }, + "topsyTurvy": { + "name": "Topsy-Turvy", + "effect": "All stat changes affecting the target turn topsy-turvy and become the opposite of what they were." + }, + "drainingKiss": { + "name": "Draining Kiss", + "effect": "The user steals the target's HP with a kiss. The user's HP is restored by over half of the damage taken by the target." + }, + "craftyShield": { + "name": "Crafty Shield", + "effect": "The user protects itself and its allies from status moves with a mysterious power. This does not stop moves that do damage." + }, + "flowerShield": { + "name": "Flower Shield", + "effect": "The user raises the Defense stats of all Grass-type Pokémon in battle with a mysterious power." + }, + "grassyTerrain": { + "name": "Grassy Terrain", + "effect": "The user turns the ground to grass for five turns. This restores the HP of Pokémon on the ground a little every turn and powers up Grass-type moves." + }, + "mistyTerrain": { + "name": "Misty Terrain", + "effect": "This protects Pokémon on the ground from status conditions and halves damage from Dragon-type moves for five turns." + }, + "electrify": { + "name": "Electrify", + "effect": "If the target is electrified before it uses a move during that turn, the target's move becomes Electric type." + }, + "playRough": { + "name": "Play Rough", + "effect": "The user plays rough with the target and attacks it. This may also lower the target's Attack stat." + }, + "fairyWind": { + "name": "Fairy Wind", + "effect": "The user stirs up a fairy wind and strikes the target with it." + }, + "moonblast": { + "name": "Moonblast", + "effect": "Borrowing the power of the moon, the user attacks the target. This may also lower the target's Sp. Atk stat." + }, + "boomburst": { + "name": "Boomburst", + "effect": "The user attacks everything around it with the destructive power of a terrible, explosive sound." + }, + "fairyLock": { + "name": "Fairy Lock", + "effect": "By locking down the battlefield, the user keeps all Pokémon from fleeing during the next turn." + }, + "kingsShield": { + "name": "King's Shield", + "effect": "The user takes a defensive stance while it protects itself from damage. It also lowers the Attack stat of any attacker that makes direct contact." + }, + "playNice": { + "name": "Play Nice", + "effect": "The user and the target become friends, and the target loses its will to fight. This lowers the target's Attack stat." + }, + "confide": { + "name": "Confide", + "effect": "The user tells the target a secret, and the target loses its ability to concentrate. This lowers the target's Sp. Atk stat." + }, + "diamondStorm": { + "name": "Diamond Storm", + "effect": "The user whips up a storm of diamonds to damage opposing Pokémon. This may also sharply raise the user's Defense stat." + }, + "steamEruption": { + "name": "Steam Eruption", + "effect": "The user immerses the target in superheated steam. This may also leave the target with a burn." + }, + "hyperspaceHole": { + "name": "Hyperspace Hole", + "effect": "Using a hyperspace hole, the user appears right next to the target and strikes. This also hits a target using a move such as Protect or Detect." + }, + "waterShuriken": { + "name": "Water Shuriken", + "effect": "The user hits the target with throwing stars two to five times in a row. This move always goes first." + }, + "mysticalFire": { + "name": "Mystical Fire", + "effect": "The user attacks by breathing a special, hot fire. This also lowers the target's Sp. Atk stat." + }, + "spikyShield": { + "name": "Spiky Shield", + "effect": "In addition to protecting the user from attacks, this move also damages any attacker that makes direct contact." + }, + "aromaticMist": { + "name": "Aromatic Mist", + "effect": "The user raises the Sp. Def stat of an ally Pokémon by using a mysterious aroma." + }, + "eerieImpulse": { + "name": "Eerie Impulse", + "effect": "The user's body generates an eerie impulse. Exposing the target to it harshly lowers the target's Sp. Atk stat." + }, + "venomDrench": { + "name": "Venom Drench", + "effect": "Opposing Pokémon are drenched in an odd poisonous liquid. This lowers the Attack, Sp. Atk, and Speed stats of a poisoned target." + }, + "powder": { + "name": "Powder", + "effect": "The user covers the target in a combustible powder. If the target uses a Fire-type move, the powder explodes and damages the target." + }, + "geomancy": { + "name": "Geomancy", + "effect": "The user absorbs energy and sharply raises its Sp. Atk, Sp. Def, and Speed stats on the next turn." + }, + "magneticFlux": { + "name": "Magnetic Flux", + "effect": "The user manipulates magnetic fields, which raises the Defense and Sp. Def stats of ally Pokémon with the Plus or Minus Ability." + }, + "happyHour": { + "name": "Happy Hour", + "effect": "Using Happy Hour doubles the amount of prize money received after battle." + }, + "electricTerrain": { + "name": "Electric Terrain", + "effect": "The user electrifies the ground for five turns, powering up Electric-type moves. Pokémon on the ground no longer fall asleep." + }, + "dazzlingGleam": { + "name": "Dazzling Gleam", + "effect": "The user damages opposing Pokémon by emitting a powerful flash." + }, + "celebrate": { + "name": "Celebrate", + "effect": "The Pokémon congratulates you on your special day!" + }, + "holdHands": { + "name": "Hold Hands", + "effect": "The user and an ally hold hands. This makes them very happy." + }, + "babyDollEyes": { + "name": "Baby-Doll Eyes", + "effect": "The user stares at the target with its baby-doll eyes, which lowers the target's Attack stat. This move always goes first." + }, + "nuzzle": { + "name": "Nuzzle", + "effect": "The user attacks by nuzzling its electrified cheeks against the target. This also leaves the target with paralysis." + }, + "holdBack": { + "name": "Hold Back", + "effect": "The user holds back when it attacks, and the target is left with at least 1 HP." + }, + "infestation": { + "name": "Infestation", + "effect": "The target is infested and attacked for four to five turns. The target can't flee during this time." + }, + "powerUpPunch": { + "name": "Power-Up Punch", + "effect": "Striking opponents over and over makes the user's fists harder. Hitting a target raises the Attack stat." + }, + "oblivionWing": { + "name": "Oblivion Wing", + "effect": "The user absorbs its target's HP. The user's HP is restored by over half of the damage taken by the target." + }, + "thousandArrows": { + "name": "Thousand Arrows", + "effect": "This move also hits opposing Pokémon that are in the air. Those Pokémon are knocked down to the ground." + }, + "thousandWaves": { + "name": "Thousand Waves", + "effect": "The user attacks with a wave that crawls along the ground. Those it hits can't flee from battle." + }, + "landsWrath": { + "name": "Land's Wrath", + "effect": "The user gathers the energy of the land and focuses that power on opposing Pokémon to damage them." + }, + "lightOfRuin": { + "name": "Light of Ruin", + "effect": "Drawing power from the Eternal Flower, the user fires a powerful beam of light. This also damages the user quite a lot." + }, + "originPulse": { + "name": "Origin Pulse", + "effect": "The user attacks opposing Pokémon with countless beams of light that glow a deep and brilliant blue." + }, + "precipiceBlades": { + "name": "Precipice Blades", + "effect": "The user attacks opposing Pokémon by manifesting the power of the land in fearsome blades of stone." + }, + "dragonAscent": { + "name": "Dragon Ascent", + "effect": "After soaring upward, the user attacks its target by dropping out of the sky at high speeds. But it lowers its own Defense and Sp. Def stats in the process." + }, + "hyperspaceFury": { + "name": "Hyperspace Fury", + "effect": "Using its many arms, the user unleashes a barrage of attacks that ignore the effects of moves like Protect and Detect. But the user's Defense stat falls." + }, + "breakneckBlitzPhysical": { + "name": "Breakneck Blitz", + "effect": "The user builds up its momentum using its Z-Power and crashes into the target at full speed. The power varies, depending on the original move." + }, + "breakneckBlitzSpecial": { + "name": "Breakneck Blitz", + "effect": "Dummy Data" + }, + "allOutPummelingPhysical": { + "name": "All-Out Pummeling", + "effect": "The user rams an energy orb created by its Z-Power into the target with full force. The power varies, depending on the original move." + }, + "allOutPummelingSpecial": { + "name": "All-Out Pummeling", + "effect": "Dummy Data" + }, + "supersonicSkystrikePhysical": { + "name": "Supersonic Skystrike", + "effect": "The user soars up with its Z-Power and plummets toward the target at full speed. The power varies, depending on the original move." + }, + "supersonicSkystrikeSpecial": { + "name": "Supersonic Skystrike", + "effect": "Dummy Data" + }, + "acidDownpourPhysical": { + "name": "Acid Downpour", + "effect": "The user creates a poisonous swamp using its Z-Power and sinks the target into it at full force. The power varies, depending on the original move." + }, + "acidDownpourSpecial": { + "name": "Acid Downpour", + "effect": "Dummy Data" + }, + "tectonicRagePhysical": { + "name": "Tectonic Rage", + "effect": "The user burrows deep into the ground and slams into the target with the full force of its Z-Power. The power varies, depending on the original move." + }, + "tectonicRageSpecial": { + "name": "Tectonic Rage", + "effect": "Dummy Data" + }, + "continentalCrushPhysical": { + "name": "Continental Crush", + "effect": "The user summons a huge rock mountain using its Z-Power and drops it onto the target with full force. The power varies, depending on the original move." + }, + "continentalCrushSpecial": { + "name": "Continental Crush", + "effect": "Dummy Data" + }, + "savageSpinOutPhysical": { + "name": "Savage Spin-Out", + "effect": "The user binds the target with full force with threads of silk that the user spits using its Z-Power. The power varies, depending on the original move." + }, + "savageSpinOutSpecial": { + "name": "Savage Spin-Out", + "effect": "Dummy Data" + }, + "neverEndingNightmarePhysical": { + "name": "Never-Ending Nightmare", + "effect": "Deep-seated grudges summoned by the user's Z-Power trap the target. The power varies, depending on the original move." + }, + "neverEndingNightmareSpecial": { + "name": "Never-Ending Nightmare", + "effect": "Dummy Data" + }, + "corkscrewCrashPhysical": { + "name": "Corkscrew Crash", + "effect": "The user spins very fast and rams into the target with the full force of its Z-Power. The power varies, depending on the original move." + }, + "corkscrewCrashSpecial": { + "name": "Corkscrew Crash", + "effect": "Dummy Data" + }, + "infernoOverdrivePhysical": { + "name": "Inferno Overdrive", + "effect": "The user breathes a stream of intense fire toward the target with the full force of its Z-Power. The power varies depending on the original move." + }, + "infernoOverdriveSpecial": { + "name": "Inferno Overdrive", + "effect": "Dummy Data" + }, + "hydroVortexPhysical": { + "name": "Hydro Vortex", + "effect": "The user creates a huge whirling current using its Z-Power to swallow the target with full force. The power varies, depending on the original move." + }, + "hydroVortexSpecial": { + "name": "Hydro Vortex", + "effect": "Dummy Data" + }, + "bloomDoomPhysical": { + "name": "Bloom Doom", + "effect": "The user collects energy from plants using its Z-Power and attacks the target with full force. The power varies, depending on the original move." + }, + "bloomDoomSpecial": { + "name": "Bloom Doom", + "effect": "Dummy Data" + }, + "gigavoltHavocPhysical": { + "name": "Gigavolt Havoc", + "effect": "The user hits the target with a powerful electric current collected by its Z-Power. The power varies, depending on the original move." + }, + "gigavoltHavocSpecial": { + "name": "Gigavolt Havoc", + "effect": "Dummy Data" + }, + "shatteredPsychePhysical": { + "name": "Shattered Psyche", + "effect": "The user controls the target with its Z-Power and hurts the target with full force. The power varies, depending on the original move." + }, + "shatteredPsycheSpecial": { + "name": "Shattered Psyche", + "effect": "Dummy Data" + }, + "subzeroSlammerPhysical": { + "name": "Subzero Slammer", + "effect": "The user dramatically drops the temperature using its Z-Power and freezes the target with full force. The power varies, depending on the original move." + }, + "subzeroSlammerSpecial": { + "name": "Subzero Slammer", + "effect": "Dummy Data" + }, + "devastatingDrakePhysical": { + "name": "Devastating Drake", + "effect": "The user materializes its aura using its Z-Power and attacks the target with full force. The power varies, depending on the original move." + }, + "devastatingDrakeSpecial": { + "name": "Devastating Drake", + "effect": "Dummy Data" + }, + "blackHoleEclipsePhysical": { + "name": "Black Hole Eclipse", + "effect": "The user gathers dark energy using its Z-Power and sucks the target into it. The power varies, depending on the original move." + }, + "blackHoleEclipseSpecial": { + "name": "Black Hole Eclipse", + "effect": "Dummy Data" + }, + "twinkleTacklePhysical": { + "name": "Twinkle Tackle", + "effect": "The user creates a very charming space using its Z-Power and totally toys with the target. The power varies, depending on the original move." + }, + "twinkleTackleSpecial": { + "name": "Twinkle Tackle", + "effect": "Dummy Data" + }, + "catastropika": { + "name": "Catastropika", + "effect": "The user, Pikachu, surrounds itself with the maximum amount of electricity using its Z-Power and pounces on its target with full force." + }, + "shoreUp": { + "name": "Shore Up", + "effect": "The user regains up to half of its max HP. It restores more HP in a sandstorm." + }, + "firstImpression": { + "name": "First Impression", + "effect": "Although this move has great power, it only works the first turn each time the user enters battle." + }, + "banefulBunker": { + "name": "Baneful Bunker", + "effect": "In addition to protecting the user from attacks, this move also poisons any attacker that makes direct contact." + }, + "spiritShackle": { + "name": "Spirit Shackle", + "effect": "The user attacks while simultaneously stitching the target's shadow to the ground to prevent the target from escaping." + }, + "darkestLariat": { + "name": "Darkest Lariat", + "effect": "The user swings both arms and hits the target. The target's stat changes don't affect this attack's damage." + }, + "sparklingAria": { + "name": "Sparkling Aria", + "effect": "The user bursts into song, emitting many bubbles. Any Pokémon suffering from a burn will be healed by the touch of these bubbles." + }, + "iceHammer": { + "name": "Ice Hammer", + "effect": "The user swings and hits with its strong, heavy fist. It lowers the user's Speed, however." + }, + "floralHealing": { + "name": "Floral Healing", + "effect": "The user restores the target's HP by up to half of its max HP. It restores more HP when the terrain is grass." + }, + "highHorsepower": { + "name": "High Horsepower", + "effect": "The user fiercely attacks the target using its entire body." + }, + "strengthSap": { + "name": "Strength Sap", + "effect": "The user restores its HP by the same amount as the target's Attack stat. It also lowers the target's Attack stat." + }, + "solarBlade": { + "name": "Solar Blade", + "effect": "In this two-turn attack, the user gathers light and fills a blade with the light's energy, attacking the target on the next turn." + }, + "leafage": { + "name": "Leafage", + "effect": "The user attacks by pelting the target with leaves." + }, + "spotlight": { + "name": "Spotlight", + "effect": "The user shines a spotlight on the target so that only the target will be attacked during the turn." + }, + "toxicThread": { + "name": "Toxic Thread", + "effect": "The user shoots poisonous threads to poison the target and lower the target's Speed stat." + }, + "laserFocus": { + "name": "Laser Focus", + "effect": "The user concentrates intensely. The attack on the next turn always results in a critical hit." + }, + "gearUp": { + "name": "Gear Up", + "effect": "The user engages its gears to raise the Attack and Sp. Atk stats of ally Pokémon with the Plus or Minus Ability." + }, + "throatChop": { + "name": "Throat Chop", + "effect": "The user attacks the target's throat, and the resultant suffering prevents the target from using moves that emit sound for two turns." + }, + "pollenPuff": { + "name": "Pollen Puff", + "effect": "The user attacks the enemy with a pollen puff that explodes. If the target is an ally, it gives the ally a pollen puff that restores its HP instead." + }, + "anchorShot": { + "name": "Anchor Shot", + "effect": "The user entangles the target with its anchor chain while attacking. The target becomes unable to flee." + }, + "psychicTerrain": { + "name": "Psychic Terrain", + "effect": "This protects Pokémon on the ground from priority moves and powers up Psychic-type moves for five turns." + }, + "lunge": { + "name": "Lunge", + "effect": "The user makes a lunge at the target, attacking with full force. This also lowers the target's Attack stat." + }, + "fireLash": { + "name": "Fire Lash", + "effect": "The user strikes the target with a burning lash. This also lowers the target's Defense stat." + }, + "powerTrip": { + "name": "Power Trip", + "effect": "The user boasts its strength and attacks the target. The more the user's stats are raised, the greater the move's power." + }, + "burnUp": { + "name": "Burn Up", + "effect": "To inflict massive damage, the user burns itself out. After using this move, the user will no longer be Fire type." + }, + "speedSwap": { + "name": "Speed Swap", + "effect": "The user exchanges Speed stats with the target." + }, + "smartStrike": { + "name": "Smart Strike", + "effect": "The user stabs the target with a sharp horn. This attack never misses." + }, + "purify": { + "name": "Purify", + "effect": "The user heals the target's status condition. If the move succeeds, it also restores the user's own HP." + }, + "revelationDance": { + "name": "Revelation Dance", + "effect": "The user attacks the target by dancing very hard. The user's type determines the type of this move." + }, + "coreEnforcer": { + "name": "Core Enforcer", + "effect": "If the Pokémon the user has inflicted damage on have already used their moves, this move eliminates the effect of the target's Ability." + }, + "tropKick": { + "name": "Trop Kick", + "effect": "The user lands an intense kick of tropical origins on the target. This also lowers the target's Attack stat." + }, + "instruct": { + "name": "Instruct", + "effect": "The user instructs the target to use the target's last move again." + }, + "beakBlast": { + "name": "Beak Blast", + "effect": "The user first heats up its beak, and then it attacks the target. Making direct contact with the Pokémon while it's heating up its beak results in a burn." + }, + "clangingScales": { + "name": "Clanging Scales", + "effect": "The user rubs the scales on its entire body and makes a huge noise to attack opposing Pokémon. The user's Defense stat goes down after the attack." + }, + "dragonHammer": { + "name": "Dragon Hammer", + "effect": "The user uses its body like a hammer to attack the target and inflict damage." + }, + "brutalSwing": { + "name": "Brutal Swing", + "effect": "The user swings its body around violently to inflict damage on everything in its vicinity." + }, + "auroraVeil": { + "name": "Aurora Veil", + "effect": "This move reduces damage from physical and special moves for five turns. This can be used only when it is snowing." + }, + "sinisterArrowRaid": { + "name": "Sinister Arrow Raid", + "effect": "The user, Decidueye, creates countless arrows using its Z-Power and shoots the target with full force." + }, + "maliciousMoonsault": { + "name": "Malicious Moonsault", + "effect": "The user, Incineroar, strengthens its body using its Z-Power and crashes into the target with full force." + }, + "oceanicOperetta": { + "name": "Oceanic Operetta", + "effect": "The user, Primarina, summons a massive amount of water using its Z-Power and attacks the target with full force." + }, + "guardianOfAlola": { + "name": "Guardian of Alola", + "effect": "The user, the Land Spirit Pokémon, obtains Alola's energy using its Z-Power and attacks the target with full force. This reduces the target's HP greatly." + }, + "soulStealing7StarStrike": { + "name": "Soul-Stealing 7-Star Strike", + "effect": "After obtaining Z-Power, the user, Marshadow, punches and kicks the target consecutively with full force." + }, + "stokedSparksurfer": { + "name": "Stoked Sparksurfer", + "effect": "After obtaining Z-Power, the user, Alolan Raichu, attacks the target with full force. This move leaves the target with paralysis." + }, + "pulverizingPancake": { + "name": "Pulverizing Pancake", + "effect": "Z-Power brings out the true capabilities of the user, Snorlax. The Pokémon moves its enormous body energetically and attacks the target with full force." + }, + "extremeEvoboost": { + "name": "Extreme Evoboost", + "effect": "After obtaining Z-Power, the user, Eevee, gets energy from its evolved friends and boosts its stats sharply." + }, + "genesisSupernova": { + "name": "Genesis Supernova", + "effect": "After obtaining Z-Power, the user, Mew, attacks the target with full force. The terrain will be charged with psychic energy." + }, + "shellTrap": { + "name": "Shell Trap", + "effect": "The user sets a shell trap. If the user is hit by a physical move, the trap will explode and inflict damage on opposing Pokémon." + }, + "fleurCannon": { + "name": "Fleur Cannon", + "effect": "The user unleashes a strong beam. The attack's recoil harshly lowers the user's Sp. Atk stat." + }, + "psychicFangs": { + "name": "Psychic Fangs", + "effect": "The user bites the target with its psychic capabilities. This can also destroy Light Screen and Reflect." + }, + "stompingTantrum": { + "name": "Stomping Tantrum", + "effect": "Driven by frustration, the user attacks the target. If the user's previous move has failed, the power of this move doubles." + }, + "shadowBone": { + "name": "Shadow Bone", + "effect": "The user attacks by beating the target with a bone that contains a spirit. This may also lower the target's Defense stat." + }, + "accelerock": { + "name": "Accelerock", + "effect": "The user smashes into the target at high speed. This move always goes first." + }, + "liquidation": { + "name": "Liquidation", + "effect": "The user slams into the target using a full-force blast of water. This may also lower the target's Defense stat." + }, + "prismaticLaser": { + "name": "Prismatic Laser", + "effect": "The user shoots powerful lasers using the power of a prism. The user can't move on the next turn." + }, + "spectralThief": { + "name": "Spectral Thief", + "effect": "The user hides in the target's shadow, steals the target's stat boosts, and then attacks." + }, + "sunsteelStrike": { + "name": "Sunsteel Strike", + "effect": "The user slams into the target with the force of a meteor. This move can be used on the target regardless of its Abilities." + }, + "moongeistBeam": { + "name": "Moongeist Beam", + "effect": "The user emits a sinister ray to attack the target. This move can be used on the target regardless of its Abilities." + }, + "tearfulLook": { + "name": "Tearful Look", + "effect": "The user gets teary eyed to make the target lose its combative spirit. This lowers the target's Attack and Sp. Atk stats." + }, + "zingZap": { + "name": "Zing Zap", + "effect": "A strong electric blast crashes down on the target, giving it an electric shock. This may also make the target flinch." + }, + "naturesMadness": { + "name": "Nature's Madness", + "effect": "The user hits the target with the force of nature. It halves the target's HP." + }, + "multiAttack": { + "name": "Multi-Attack", + "effect": "Cloaking itself in high energy, the user slams into the target. The memory held determines the move's type." + }, + "tenMillionVoltThunderbolt": { + "name": "10,000,000 Volt Thunderbolt", + "effect": "The user, Pikachu wearing a cap, powers up a jolt of electricity using its Z-Power and unleashes it. Critical hits land more easily." + }, + "mindBlown": { + "name": "Mind Blown", + "effect": "The user attacks everything around it by causing its own head to explode. This also damages the user." + }, + "plasmaFists": { + "name": "Plasma Fists", + "effect": "The user attacks with electrically charged fists. This move changes Normal-type moves to Electric-type moves." + }, + "photonGeyser": { + "name": "Photon Geyser", + "effect": "The user attacks a target with a pillar of light. This move inflicts Attack or Sp. Atk damage—whichever stat is higher for the user." + }, + "lightThatBurnsTheSky": { + "name": "Light That Burns the Sky", + "effect": "This attack inflicts Attack or Sp. Atk damage—whichever stat is higher for the user, Necrozma. This move ignores the target's Ability." + }, + "searingSunrazeSmash": { + "name": "Searing Sunraze Smash", + "effect": "After obtaining Z-Power, the user, Solgaleo, attacks the target with full force. This move can ignore the effect of the target's Ability." + }, + "menacingMoonrazeMaelstrom": { + "name": "Menacing Moonraze Maelstrom", + "effect": "After obtaining Z-Power, the user, Lunala, attacks the target with full force. This move can ignore the effect of the target's Ability." + }, + "letsSnuggleForever": { + "name": "Let's Snuggle Forever", + "effect": "After obtaining Z-Power, the user, Mimikyu, punches the target with full force." + }, + "splinteredStormshards": { + "name": "Splintered Stormshards", + "effect": "After obtaining Z-Power, the user, Lycanroc, attacks the target with full force. This move negates the effect on the battlefield." + }, + "clangorousSoulblaze": { + "name": "Clangorous Soulblaze", + "effect": "After obtaining Z-Power, the user, Kommo-o, attacks the opposing Pokémon with full force. This move boosts the user's stats." + }, + "zippyZap": { + "name": "Zippy Zap", + "effect": "The user attacks the target with bursts of electricity at high speed. This move always goes first and results in a critical hit." + }, + "splishySplash": { + "name": "Splishy Splash", + "effect": "The user charges a huge wave with electricity and hits the opposing Pokémon with the wave. This may also leave the opposing Pokémon with paralysis." + }, + "floatyFall": { + "name": "Floaty Fall", + "effect": "The user floats in the air, and then dives at a steep angle to attack the target. This may also make the target flinch." + }, + "pikaPapow": { + "name": "Pika Papow", + "effect": "The more Pikachu loves its Trainer, the greater the move's power. It never misses." + }, + "bouncyBubble": { + "name": "Bouncy Bubble", + "effect": "The user attacks by shooting water bubbles at the target. It then absorbs water and restores its HP by the damage taken by the target." + }, + "buzzyBuzz": { + "name": "Buzzy Buzz", + "effect": "The user shoots a jolt of electricity to attack the target. This also leaves the target with paralysis." + }, + "sizzlySlide": { + "name": "Sizzly Slide", + "effect": "The user cloaks itself in fire and charges at the target. This also leaves the target with a burn." + }, + "glitzyGlow": { + "name": "Glitzy Glow", + "effect": "The user bombards the target with telekinetic force. A wondrous wall of light is put up to weaken the power of the opposing Pokémon's special moves." + }, + "baddyBad": { + "name": "Baddy Bad", + "effect": "The user acts bad and attacks the target. A wondrous wall of light is put up to weaken the power of the opposing Pokémon's physical moves." + }, + "sappySeed": { + "name": "Sappy Seed", + "effect": "The user grows a gigantic stalk that scatters seeds to attack the target. The seeds drain the target's HP every turn." + }, + "freezyFrost": { + "name": "Freezy Frost", + "effect": "The user attacks with a crystal made of cold frozen haze. It eliminates every stat change among all the Pokémon engaged in battle." + }, + "sparklySwirl": { + "name": "Sparkly Swirl", + "effect": "The user attacks the target by wrapping it with a whirlwind of an overpowering scent. This also heals all status conditions of the user's party." + }, + "veeveeVolley": { + "name": "Veevee Volley", + "effect": "The more Eevee loves its Trainer, the greater the move's power. It never misses." + }, + "doubleIronBash": { + "name": "Double Iron Bash", + "effect": "The user rotates, centering the hex nut in its chest, and then strikes with its arms twice in a row. This may also make the target flinch." + }, + "maxGuard": { + "name": "Max Guard", + "effect": "This move enables the user to protect itself from all attacks. Its chance of failing rises if it is used in succession." + }, + "dynamaxCannon": { + "name": "Dynamax Cannon", + "effect": "The user unleashes a strong beam from its core. Deals up to twice the damage if the target is overly leveled." + }, + "snipeShot": { + "name": "Snipe Shot", + "effect": "The user ignores the effects of opposing Pokémon's moves and Abilities that draw in moves, allowing this move to hit the chosen target." + }, + "jawLock": { + "name": "Jaw Lock", + "effect": "This move prevents the user and the target from switching out until either of them faints. The effect goes away if either of the Pokémon leaves the field." + }, + "stuffCheeks": { + "name": "Stuff Cheeks", + "effect": "The user eats its held Berry, then sharply raises its Defense stat." + }, + "noRetreat": { + "name": "No Retreat", + "effect": "This move raises all the user's stats but prevents the user from switching out or fleeing." + }, + "tarShot": { + "name": "Tar Shot", + "effect": "The user pours sticky tar over the target, lowering the target's Speed stat. The target becomes weaker to Fire-type moves." + }, + "magicPowder": { + "name": "Magic Powder", + "effect": "The user scatters a cloud of magic powder that changes the target to Psychic type." + }, + "dragonDarts": { + "name": "Dragon Darts", + "effect": "The user attacks twice using Dreepy. If there are two targets, this move hits each target once." + }, + "teatime": { + "name": "Teatime", + "effect": "The user has teatime with all the Pokémon in the battle. Each Pokémon eats its held Berry." + }, + "octolock": { + "name": "Octolock", + "effect": "The user locks the target in and prevents it from fleeing. This move also lowers the target's Defense and Sp. Def every turn." + }, + "boltBeak": { + "name": "Bolt Beak", + "effect": "The user stabs the target with its electrified beak. If the user attacks before the target, the power of this move is doubled." + }, + "fishiousRend": { + "name": "Fishious Rend", + "effect": "The user rends the target with its hard gills. If the user attacks before the target, the power of this move is doubled." + }, + "courtChange": { + "name": "Court Change", + "effect": "With its mysterious power, the user swaps the effects on either side of the field." + }, + "maxFlare": { + "name": "Max Flare", + "effect": "This is a Fire-type attack Dynamax Pokémon use. The user intensifies the sun for five turns." + }, + "maxFlutterby": { + "name": "Max Flutterby", + "effect": "This is a Bug-type attack Dynamax Pokémon use. This lowers the target's Sp. Atk stat." + }, + "maxLightning": { + "name": "Max Lightning", + "effect": "This is an Electric-type attack Dynamax Pokémon use. The user turns the ground into Electric Terrain for five turns." + }, + "maxStrike": { + "name": "Max Strike", + "effect": "This is a Normal-type attack Dynamax Pokémon use. This lowers the target's Speed stat." + }, + "maxKnuckle": { + "name": "Max Knuckle", + "effect": "This is a Fighting-type attack Dynamax Pokémon use. This raises ally Pokémon's Attack stats." + }, + "maxPhantasm": { + "name": "Max Phantasm", + "effect": "This is a Ghost-type attack Dynamax Pokémon use. This lowers the target's Defense stat." + }, + "maxHailstorm": { + "name": "Max Hailstorm", + "effect": "This is an Ice-type attack Dynamax Pokémon use. The user summons a hailstorm lasting five turns." + }, + "maxOoze": { + "name": "Max Ooze", + "effect": "This is a Poison-type attack Dynamax Pokémon use. This raises ally Pokémon's Sp. Atk stats." + }, + "maxGeyser": { + "name": "Max Geyser", + "effect": "This is a Water-type attack Dynamax Pokémon use. The user summons a heavy rain that falls for five turns." + }, + "maxAirstream": { + "name": "Max Airstream", + "effect": "This is a Flying-type attack Dynamax Pokémon use. This raises ally Pokémon's Speed stats." + }, + "maxStarfall": { + "name": "Max Starfall", + "effect": "This is a Fairy-type attack Dynamax Pokémon use. The user turns the ground into Misty Terrain for five turns." + }, + "maxWyrmwind": { + "name": "Max Wyrmwind", + "effect": "This is a Dragon-type attack Dynamax Pokémon use. This lowers the target's Attack stat." + }, + "maxMindstorm": { + "name": "Max Mindstorm", + "effect": "This is a Psychic-type attack Dynamax Pokémon use. The user turns the ground into Psychic Terrain for five turns." + }, + "maxRockfall": { + "name": "Max Rockfall", + "effect": "This is a Rock-type attack Dynamax Pokémon use. The user summons a sandstorm lasting five turns." + }, + "maxQuake": { + "name": "Max Quake", + "effect": "This is a Ground-type attack Dynamax Pokémon use. This raises ally Pokémon's Sp. Def stats." + }, + "maxDarkness": { + "name": "Max Darkness", + "effect": "This is a Dark-type attack Dynamax Pokémon use. This lowers the target's Sp. Def stat." + }, + "maxOvergrowth": { + "name": "Max Overgrowth", + "effect": "This is a Grass-type attack Dynamax Pokémon use. The user turns the ground into Grassy Terrain for five turns." + }, + "maxSteelspike": { + "name": "Max Steelspike", + "effect": "This is a Steel-type attack Dynamax Pokémon use. This raises ally Pokémon's Defense stats." + }, + "clangorousSoul": { + "name": "Clangorous Soul", + "effect": "The user raises all its stats by using some of its HP." + }, + "bodyPress": { + "name": "Body Press", + "effect": "The user attacks by slamming its body into the target. The higher the user's Defense, the more damage it can inflict on the target." + }, + "decorate": { + "name": "Decorate", + "effect": "The user sharply raises the target's Attack and Sp. Atk stats by decorating the target." + }, + "drumBeating": { + "name": "Drum Beating", + "effect": "The user plays its drum, controlling the drum's roots to attack the target. This also lowers the target's Speed stat." + }, + "snapTrap": { + "name": "Snap Trap", + "effect": "The user snares the target in a snap trap for four to five turns." + }, + "pyroBall": { + "name": "Pyro Ball", + "effect": "The user attacks by igniting a small stone and launching it as a fiery ball at the target. This may also leave the target with a burn." + }, + "behemothBlade": { + "name": "Behemoth Blade", + "effect": "The user wields a large, powerful sword using its whole body and cuts the target in a vigorous attack." + }, + "behemothBash": { + "name": "Behemoth Bash", + "effect": "The user's body becomes a firm shield and slams into the target fiercely." + }, + "auraWheel": { + "name": "Aura Wheel", + "effect": "Morpeko attacks and raises its Speed with the energy stored in its cheeks. This move's type changes depending on the user's form." + }, + "breakingSwipe": { + "name": "Breaking Swipe", + "effect": "The user swings its tough tail wildly and attacks opposing Pokémon. This also lowers their Attack stats." + }, + "branchPoke": { + "name": "Branch Poke", + "effect": "The user attacks the target by poking it with a sharply pointed branch." + }, + "overdrive": { + "name": "Overdrive", + "effect": "The user attacks opposing Pokémon by twanging a guitar or bass guitar, causing a huge echo and strong vibration." + }, + "appleAcid": { + "name": "Apple Acid", + "effect": "The user attacks the target with an acidic liquid created from tart apples. This also lowers the target's Sp. Def stat." + }, + "gravApple": { + "name": "Grav Apple", + "effect": "The user inflicts damage by dropping an apple from high above. This also lowers the target's Defense stat." + }, + "spiritBreak": { + "name": "Spirit Break", + "effect": "The user attacks the target with so much force that it could break the target's spirit. This also lowers the target's Sp. Atk stat." + }, + "strangeSteam": { + "name": "Strange Steam", + "effect": "The user attacks the target by emitting steam. This may also confuse the target." + }, + "lifeDew": { + "name": "Life Dew", + "effect": "The user scatters mysterious water around and restores the HP of itself and its ally Pokémon in the battle." + }, + "obstruct": { + "name": "Obstruct", + "effect": "This move enables the user to protect itself from all attacks. Its chance of failing rises if it is used in succession. Direct contact harshly lowers the attacker's Defense stat." + }, + "falseSurrender": { + "name": "False Surrender", + "effect": "The user pretends to bow its head, but then it stabs the target with its disheveled hair. This attack never misses." + }, + "meteorAssault": { + "name": "Meteor Assault", + "effect": "The user attacks wildly with its thick leek. The user can't move on the next turn, because the force of this move makes it stagger." + }, + "eternabeam": { + "name": "Eternabeam", + "effect": "This is Eternatus's most powerful attack in its original form. The user can't move on the next turn." + }, + "steelBeam": { + "name": "Steel Beam", + "effect": "The user fires a beam of steel that it collected from its entire body. This also damages the user." + }, + "expandingForce": { + "name": "Expanding Force", + "effect": "The user attacks the target with its psychic power. This move's power goes up and damages all opposing Pokémon on Psychic Terrain." + }, + "steelRoller": { + "name": "Steel Roller", + "effect": "The user attacks while destroying the terrain. This move fails when the ground hasn't turned into a terrain." + }, + "scaleShot": { + "name": "Scale Shot", + "effect": "The user attacks by shooting scales two to five times in a row. This move boosts the user's Speed stat but lowers its Defense stat." + }, + "meteorBeam": { + "name": "Meteor Beam", + "effect": "In this two-turn attack, the user gathers space power and boosts its Sp. Atk stat, then attacks the target on the next turn." + }, + "shellSideArm": { + "name": "Shell Side Arm", + "effect": "This move inflicts physical or special damage, whichever will be more effective. This may also poison the target." + }, + "mistyExplosion": { + "name": "Misty Explosion", + "effect": "The user attacks everything around it and faints upon using this move. This move's power is increased on Misty Terrain." + }, + "grassyGlide": { + "name": "Grassy Glide", + "effect": "Gliding on the ground, the user attacks the target. This move always goes first on Grassy Terrain." + }, + "risingVoltage": { + "name": "Rising Voltage", + "effect": "The user attacks with electric voltage rising from the ground. This move's power doubles when the target is on Electric Terrain." + }, + "terrainPulse": { + "name": "Terrain Pulse", + "effect": "The user utilizes the power of the terrain to attack. This move's type and power changes depending on the terrain when it's used." + }, + "skitterSmack": { + "name": "Skitter Smack", + "effect": "The user skitters behind the target to attack. This also lowers the target's Sp. Atk stat." + }, + "burningJealousy": { + "name": "Burning Jealousy", + "effect": "The user attacks with energy from jealousy. This leaves all opposing Pokémon that have had their stats boosted during the turn with a burn." + }, + "lashOut": { + "name": "Lash Out", + "effect": "The user lashes out to vent its frustration toward the target. If the user's stats were lowered during this turn, the power of this move is doubled." + }, + "poltergeist": { + "name": "Poltergeist", + "effect": "The user attacks the target by controlling the target's item. The move fails if the target doesn't have an item." + }, + "corrosiveGas": { + "name": "Corrosive Gas", + "effect": "The user surrounds everything around it with highly acidic gas and melts away items they hold." + }, + "coaching": { + "name": "Coaching", + "effect": "The user properly coaches its ally Pokémon, boosting their Attack and Defense stats." + }, + "flipTurn": { + "name": "Flip Turn", + "effect": "After making its attack, the user rushes back to switch places with a party Pokémon in waiting." + }, + "tripleAxel": { + "name": "Triple Axel", + "effect": "A consecutive three-kick attack that becomes more powerful with each successful hit." + }, + "dualWingbeat": { + "name": "Dual Wingbeat", + "effect": "The user slams the target with its wings. The target is hit twice in a row." + }, + "scorchingSands": { + "name": "Scorching Sands", + "effect": "The user throws scorching sand at the target to attack. This may also leave the target with a burn." + }, + "jungleHealing": { + "name": "Jungle Healing", + "effect": "The user becomes one with the jungle, restoring HP and healing any status conditions of itself and its ally Pokémon in battle." + }, + "wickedBlow": { + "name": "Wicked Blow", + "effect": "The user, having mastered the Dark style, strikes the target with a fierce blow. This attack always results in a critical hit." + }, + "surgingStrikes": { + "name": "Surging Strikes", + "effect": "The user, having mastered the Water style, strikes the target with a flowing motion three times in a row. This attack always results in a critical hit." + }, + "thunderCage": { + "name": "Thunder Cage", + "effect": "The user traps the target in a cage of sparking electricity for four to five turns." + }, + "dragonEnergy": { + "name": "Dragon Energy", + "effect": "Converting its life-force into power, the user attacks opposing Pokémon. The lower the user's HP, the lower the move's power." + }, + "freezingGlare": { + "name": "Freezing Glare", + "effect": "The user shoots its psychic power from its eyes to attack. This may also leave the target frozen." + }, + "fieryWrath": { + "name": "Fiery Wrath", + "effect": "The user transforms its wrath into a fire-like aura to attack. This may also make opposing Pokémon flinch." + }, + "thunderousKick": { + "name": "Thunderous Kick", + "effect": "The user overwhelms the target with lightning-like movement before delivering a kick. This also lowers the target's Defense stat." + }, + "glacialLance": { + "name": "Glacial Lance", + "effect": "The user attacks by hurling a blizzard-cloaked icicle lance at opposing Pokémon." + }, + "astralBarrage": { + "name": "Astral Barrage", + "effect": "The user attacks by sending a frightful amount of small ghosts at opposing Pokémon." + }, + "eerieSpell": { + "name": "Eerie Spell", + "effect": "The user attacks with its tremendous psychic power. This also removes 3 PP from the target's last move." + }, + "direClaw": { + "name": "Dire Claw", + "effect": "The user lashes out at the target with ruinous claws. This may also leave the target poisoned, paralyzed, or asleep." + }, + "psyshieldBash": { + "name": "Psyshield Bash", + "effect": "Cloaking itself in psychic energy, the user slams into the target. This also boosts the user's Defense stat." + }, + "powerShift": { + "name": "Power Shift", + "effect": "The user swaps its Attack and Defense stats." + }, + "stoneAxe": { + "name": "Stone Axe", + "effect": "The user swings its stone axes at the target. Stone splinters left behind by this attack float around the target." + }, + "springtideStorm": { + "name": "Springtide Storm", + "effect": "The user attacks by wrapping opposing Pokémon in fierce winds brimming with love and hate. This may also lower their Attack stats." + }, + "mysticalPower": { + "name": "Mystical Power", + "effect": "The user attacks by emitting a mysterious power. This also boosts the user's Sp. Atk stat." + }, + "ragingFury": { + "name": "Raging Fury", + "effect": "The user rampages around spewing flames for two to three turns. The user then becomes confused." + }, + "waveCrash": { + "name": "Wave Crash", + "effect": "The user shrouds itself in water and slams into the target with its whole body to inflict damage. This also damages the user quite a lot." + }, + "chloroblast": { + "name": "Chloroblast", + "effect": "The user launches its amassed chlorophyll to inflict damage on the target. This also damages the user." + }, + "mountainGale": { + "name": "Mountain Gale", + "effect": "The user hurls giant chunks of ice at the target to inflict damage. This may also make the target flinch." + }, + "victoryDance": { + "name": "Victory Dance", + "effect": "The user performs an intense dance to usher in victory, boosting its Attack, Defense, and Speed stats." + }, + "headlongRush": { + "name": "Headlong Rush", + "effect": "The user smashes into the target in a full-body tackle. This also lowers the user's Defense and Sp. Def stats." + }, + "barbBarrage": { + "name": "Barb Barrage", + "effect": "The user launches countless toxic barbs to inflict damage. This may also poison the target. This move's power is doubled if the target is already poisoned." + }, + "esperWing": { + "name": "Esper Wing", + "effect": "The user slashes the target with aura-enriched wings. This also boosts the user's Speed stat. This move has a heightened chance of landing a critical hit." + }, + "bitterMalice": { + "name": "Bitter Malice", + "effect": "The user attacks the target with spine-chilling resentment. This also lowers the target's Attack stat." + }, + "shelter": { + "name": "Shelter", + "effect": "The user makes its skin as hard as an iron shield, sharply boosting its Defense stat." + }, + "tripleArrows": { + "name": "Triple Arrows", + "effect": "The user kicks, then fires three arrows. This move has a heightened chance of landing a critical hit and may also lower the target's Defense stat or make it flinch." + }, + "infernalParade": { + "name": "Infernal Parade", + "effect": "The user attacks with myriad fireballs. This may also leave the target with a burn. This move's power is doubled if the target has a status condition." + }, + "ceaselessEdge": { + "name": "Ceaseless Edge", + "effect": "The user slashes its shell blade at the target. Shell splinters left behind by this attack remain scattered under the target as spikes." + }, + "bleakwindStorm": { + "name": "Bleakwind Storm", + "effect": "The user attacks with savagely cold winds that cause both body and spirit to tremble. This may also lower the Speed stats of opposing Pokémon." + }, + "wildboltStorm": { + "name": "Wildbolt Storm", + "effect": "The user summons a thunderous tempest and savagely attacks with lightning and wind. This may also leave opposing Pokémon with paralysis." + }, + "sandsearStorm": { + "name": "Sandsear Storm", + "effect": "The user attacks by wrapping opposing Pokémon in fierce winds and searingly hot sand. This may also leave them with a burn." + }, + "lunarBlessing": { + "name": "Lunar Blessing", + "effect": "The user receives a blessing from the crescent moon, restoring HP and curing status conditions for itself and its ally Pokémon currently in the battle." + }, + "takeHeart": { + "name": "Take Heart", + "effect": "The user lifts its spirits, curing its own status conditions and boosting its Sp. Atk and Sp. Def stats." + }, + "gMaxWildfire": { + "name": "G-Max Wildfire", + "effect": "A Fire-type attack that Gigantamax Charizard use. This move continues to deal damage to opponents for four turns." + }, + "gMaxBefuddle": { + "name": "G-Max Befuddle", + "effect": "A Bug-type attack that Gigantamax Butterfree use. This move inflicts the poisoned, paralyzed, or asleep status condition on opponents." + }, + "gMaxVoltCrash": { + "name": "G-Max Volt Crash", + "effect": "An Electric-type attack that Gigantamax Pikachu use. This move paralyzes opponents." + }, + "gMaxGoldRush": { + "name": "G-Max Gold Rush", + "effect": "A Normal-type attack that Gigantamax Meowth use. This move confuses opponents and also earns extra money." + }, + "gMaxChiStrike": { + "name": "G-Max Chi Strike", + "effect": "A Fighting-type attack that Gigantamax Machamp use. This move raises the chance of critical hits." + }, + "gMaxTerror": { + "name": "G-Max Terror", + "effect": "A Ghost-type attack that Gigantamax Gengar use. This Pokémon steps on the opposing Pokémon's shadow to prevent them from escaping." + }, + "gMaxResonance": { + "name": "G-Max Resonance", + "effect": "An Ice-type attack that Gigantamax Lapras use. This move reduces the damage received for five turns." + }, + "gMaxCuddle": { + "name": "G-Max Cuddle", + "effect": "A Normal-type attack that Gigantamax Eevee use. This move infatuates opponents." + }, + "gMaxReplenish": { + "name": "G-Max Replenish", + "effect": "A Normal-type attack that Gigantamax Snorlax use. This move restores Berries that have been eaten." + }, + "gMaxMalodor": { + "name": "G-Max Malodor", + "effect": "A Poison-type attack that Gigantamax Garbodor use. This move poisons opponents." + }, + "gMaxStonesurge": { + "name": "G-Max Stonesurge", + "effect": "A Water-type attack that Gigantamax Drednaw use. This move scatters sharp rocks around the field." + }, + "gMaxWindRage": { + "name": "G-Max Wind Rage", + "effect": "A Flying-type attack that Gigantamax Corviknight use. This move removes the effects of moves like Reflect and Light Screen." + }, + "gMaxStunShock": { + "name": "G-Max Stun Shock", + "effect": "An Electric-type attack that Gigantamax Toxtricity use. This move poisons or paralyzes opponents." + }, + "gMaxFinale": { + "name": "G-Max Finale", + "effect": "A Fairy-type attack that Gigantamax Alcremie use. This move heals the HP of allies." + }, + "gMaxDepletion": { + "name": "G-Max Depletion", + "effect": "A Dragon-type attack that Gigantamax Duraludon use. Reduces the PP of the last move used." + }, + "gMaxGravitas": { + "name": "G-Max Gravitas", + "effect": "A Psychic-type attack that Gigantamax Orbeetle use. This move changes gravity for five turns." + }, + "gMaxVolcalith": { + "name": "G-Max Volcalith", + "effect": "A Rock-type attack that Gigantamax Coalossal use. This move continues to deal damage to opponents for four turns." + }, + "gMaxSandblast": { + "name": "G-Max Sandblast", + "effect": "A Ground-type attack that Gigantamax Sandaconda use. Opponents are trapped in a raging sandstorm for four to five turns." + }, + "gMaxSnooze": { + "name": "G-Max Snooze", + "effect": "A Dark-type attack that Gigantamax Grimmsnarl use. The user lets loose a huge yawn that lulls the targets into falling asleep on the next turn." + }, + "gMaxTartness": { + "name": "G-Max Tartness", + "effect": "A Grass-type attack that Gigantamax Flapple use. This move reduces the opponents' evasiveness." + }, + "gMaxSweetness": { + "name": "G-Max Sweetness", + "effect": "A Grass-type attack that Gigantamax Appletun use. This move heals the status conditions of allies." + }, + "gMaxSmite": { + "name": "G-Max Smite", + "effect": "A Fairy-type attack that Gigantamax Hatterene use. This move confuses opponents." + }, + "gMaxSteelsurge": { + "name": "G-Max Steelsurge", + "effect": "A Steel-type attack that Gigantamax Copperajah use. This move scatters sharp spikes around the field." + }, + "gMaxMeltdown": { + "name": "G-Max Meltdown", + "effect": "A Steel-type attack that Gigantamax Melmetal use. This move makes opponents incapable of using the same move twice in a row." + }, + "gMaxFoamBurst": { + "name": "G-Max Foam Burst", + "effect": "A Water-type attack that Gigantamax Kingler use. This move harshly lowers the Speed of opponents." + }, + "gMaxCentiferno": { + "name": "G-Max Centiferno", + "effect": "A Fire-type attack that Gigantamax Centiskorch use. This move traps opponents in flames for four to five turns." + }, + "gMaxVineLash": { + "name": "G-Max Vine Lash", + "effect": "A Grass-type attack that Gigantamax Venusaur use. This move continues to deal damage to opponents for four turns." + }, + "gMaxCannonade": { + "name": "G-Max Cannonade", + "effect": "A Water-type attack that Gigantamax Blastoise use. This move continues to deal damage to opponents for four turns." + }, + "gMaxDrumSolo": { + "name": "G-Max Drum Solo", + "effect": "A Grass-type attack that Gigantamax Rillaboom use. This move can be used on the target regardless of its Abilities." + }, + "gMaxFireball": { + "name": "G-Max Fireball", + "effect": "A Fire-type attack that Gigantamax Cinderace use. This move can be used on the target regardless of its Abilities." + }, + "gMaxHydrosnipe": { + "name": "G-Max Hydrosnipe", + "effect": "A Water-type attack that Gigantamax Inteleon use. This move can be used on the target regardless of its Abilities." + }, + "gMaxOneBlow": { + "name": "G-Max One Blow", + "effect": "A Dark-type attack that Gigantamax Urshifu use. This single-strike move can ignore Max Guard." + }, + "gMaxRapidFlow": { + "name": "G-Max Rapid Flow", + "effect": "A Water-type attack that Gigantamax Urshifu use. This rapid-strike move can ignore Max Guard." + }, + "teraBlast": { + "name": "Tera Blast", + "effect": "If the user has Terastallized, it unleashes energy of its Tera Type. This move inflicts damage using the Attack or Sp. Atk stat-whichever is higher for the user." + }, + "silkTrap": { + "name": "Silk Trap", + "effect": "The user spins a silken trap, protecting itself from damage while lowering the Speed stat of any attacker that makes direct contact." + }, + "axeKick": { + "name": "Axe Kick", + "effect": "The user attacks by kicking up into the air and slamming its heel down upon the target. This may also confuse the target. If it misses, the user takes damage instead." + }, + "lastRespects": { + "name": "Last Respects", + "effect": "The user attacks to avenge its allies. The more defeated allies there are in the user's party, the greater the move's power." + }, + "luminaCrash": { + "name": "Lumina Crash", + "effect": "The user attacks by unleashing a peculiar light that even affects the mind. This also harshly lowers the target's Sp. Def stat." + }, + "orderUp": { + "name": "Order Up", + "effect": "The user attacks with elegant poise. If the user has a Tatsugiri in its mouth, this move boosts one of the user's stats based on the Tatsugiri's form." + }, + "jetPunch": { + "name": "Jet Punch", + "effect": "The user summons a torrent around its fist and punches at blinding speed. This move always goes first." + }, + "spicyExtract": { + "name": "Spicy Extract", + "effect": "The user emits an incredibly spicy extract, sharply boosting the target's Attack stat and harshly lowering the target's Defense stat." + }, + "spinOut": { + "name": "Spin Out", + "effect": "The user spins furiously by straining its legs, inflicting damage on the target. This also harshly lowers the user's Speed stat." + }, + "populationBomb": { + "name": "Population Bomb", + "effect": "The user's fellows gather in droves to perform a combo attack that hits the target one to ten times in a row." + }, + "iceSpinner": { + "name": "Ice Spinner", + "effect": "The user covers its feet in thin ice and twirls around, slamming into the target. This move's spinning motion also destroys the terrain." + }, + "glaiveRush": { + "name": "Glaive Rush", + "effect": "The user throws its entire body into a reckless charge. After this move is used, attacks on the user cannot miss and will inflict double damage until the user's next turn." + }, + "revivalBlessing": { + "name": "Revival Blessing", + "effect": "The user bestows a loving blessing, reviving a party Pokémon that has fainted and restoring half that Pokémon's max HP." + }, + "saltCure": { + "name": "Salt Cure", + "effect": "The user salt cures the target, inflicting damage every turn. Steel and Water types are more strongly affected by this move." + }, + "tripleDive": { + "name": "Triple Dive", + "effect": "The user performs a perfectly timed triple dive, hitting the target with splashes of water three times in a row." + }, + "mortalSpin": { + "name": "Mortal Spin", + "effect": "The user performs a spin attack that can also eliminate the effects of such moves as Bind, Wrap, and Leech Seed. This also poisons opposing Pokémon." + }, + "doodle": { + "name": "Doodle", + "effect": "The user captures the very essence of the target in a sketch. This changes the Abilities of the user and its ally Pokémon to that of the target." + }, + "filletAway": { + "name": "Fillet Away", + "effect": "The user sharply boosts its Attack, Sp. Atk, and Speed stats by using its own HP." + }, + "kowtowCleave": { + "name": "Kowtow Cleave", + "effect": "The user slashes at the target after kowtowing to make the target let down its guard. This attack never misses." + }, + "flowerTrick": { + "name": "Flower Trick", + "effect": "The user throws a rigged bouquet of flowers at the target. This attack never misses and always lands a critical hit." + }, + "torchSong": { + "name": "Torch Song", + "effect": "The user blows out raging flames as if singing a song, scorching the target. This also boosts the user's Sp. Atk stat." + }, + "aquaStep": { + "name": "Aqua Step", + "effect": "The user toys with the target and attacks it using light and fluid dance steps. This also boosts the user's Speed stat." + }, + "ragingBull": { + "name": "Raging Bull", + "effect": "The user performs a tackle like a raging bull. This move's type depends on the user's form. It can also break barriers, such as Light Screen and Reflect." + }, + "makeItRain": { + "name": "Make It Rain", + "effect": "The user attacks by throwing out a mass of coins. This also lowers the user's Sp. Atk stat. Money is earned after the battle." + }, + "psyblade": { + "name": "Psyblade", + "effect": "The user rends the target with an ethereal blade. This move's power is boosted by 50 percent if the user is on Electric Terrain." + }, + "hydroSteam": { + "name": "Hydro Steam", + "effect": "The user blasts the target with boiling-hot water. This move's power is not lowered in harsh sunlight but rather boosted by 50 percent." + }, + "ruination": { + "name": "Ruination", + "effect": "The user summons a ruinous disaster. This cuts the target's HP in half." + }, + "collisionCourse": { + "name": "Collision Course", + "effect": "The user transforms and crashes to the ground, causing a massive prehistoric explosion. This move's power is boosted more than usual if it's a supereffective hit." + }, + "electroDrift": { + "name": "Electro Drift", + "effect": "The user races forward at ultrafast speeds, piercing its target with futuristic electricity. This move's power is boosted more than usual if it's a supereffective hit." + }, + "shedTail": { + "name": "Shed Tail", + "effect": "The user creates a substitute for itself using its own HP before switching places with a party Pokémon in waiting." + }, + "chillyReception": { + "name": "Chilly Reception", + "effect": "The user tells a chillingly bad joke before switching places with a party Pokémon in waiting. This summons a snowstorm lasting five turns." + }, + "tidyUp": { + "name": "Tidy Up", + "effect": "The user tidies up and removes the effects of Spikes, Stealth Rock, Sticky Web, Toxic Spikes, and Substitute. This also boosts the user's Attack and Speed stats." + }, + "snowscape": { + "name": "Snowscape", + "effect": "The user summons a snowstorm lasting five turns. This boosts the Defense stats of Ice types." + }, + "pounce": { + "name": "Pounce", + "effect": "The user attacks by pouncing on the target. This also lowers the target's Speed stat." + }, + "trailblaze": { + "name": "Trailblaze", + "effect": "The user attacks suddenly as if leaping out from tall grass. The user's nimble footwork boosts its Speed stat." + }, + "chillingWater": { + "name": "Chilling Water", + "effect": "The user attacks the target by showering it with water that's so cold it saps the target's power. This also lowers the target's Attack stat." + }, + "hyperDrill": { + "name": "Hyper Drill", + "effect": "The user spins the pointed part of its body at high speed to pierce the target. This attack can hit a target using a move such as Protect or Detect." + }, + "twinBeam": { + "name": "Twin Beam", + "effect": "The user shoots mystical beams from its eyes to inflict damage. The target is hit twice in a row." + }, + "rageFist": { + "name": "Rage Fist", + "effect": "The user converts its rage into energy to attack. The more times the user has been hit by attacks, the greater the move's power." + }, + "armorCannon": { + "name": "Armor Cannon", + "effect": "The user shoots its own armor out as blazing projectiles. This also lowers the user's Defense and Sp. Def stats." + }, + "bitterBlade": { + "name": "Bitter Blade", + "effect": "The user focuses its bitter feelings toward the world of the living into a slashing attack. The user's HP is restored by up to half the damage taken by the target." + }, + "doubleShock": { + "name": "Double Shock", + "effect": "The user discharges all the electricity from its body to perform a high-damage attack. After using this move, the user will no longer be Electric type." + }, + "gigatonHammer": { + "name": "Gigaton Hammer", + "effect": "The user swings its whole body around to attack with its huge hammer. This move can't be used twice in a row." + }, + "comeuppance": { + "name": "Comeuppance", + "effect": "The user retaliates with much greater force against the opponent that last inflicted damage on it." + }, + "aquaCutter": { + "name": "Aqua Cutter", + "effect": "The user expels pressurized water to cut at the target like a blade. This move has a heightened chance of landing a critical hit." + }, + "blazingTorque": { + "name": "Blazing Torque", + "effect": "The user revs their blazing engine into the target. This may also leave the target with a burn." + }, + "wickedTorque": { + "name": "Wicked Torque", + "effect": "The user revs their engine into the target with malicious intent. This may put the target to sleep." + }, + "noxiousTorque": { + "name": "Noxious Torque", + "effect": "The user revs their poisonous engine into the target. This may also poison the target." + }, + "combatTorque": { + "name": "Combat Torque", + "effect": "The user revs their engine forcefully into the target. This may also leave the target with paralysis." + }, + "magicalTorque": { + "name": "Magical Torque", + "effect": "The user revs their fae-like engine into the target. This may also confuse the target." + }, + "bloodMoon": { + "name": "Blood Moon", + "effect": "The user unleashes the full brunt of its spirit from a full moon that shines as red as blood. This move can't be used twice in a row." + }, + "matchaGotcha": { + "name": "Matcha Gotcha", + "effect": "The user fires a blast of tea that it mixed. The user's HP is restored by up to half the damage taken by the target. This may also leave the target with a burn." + }, + "syrupBomb": { + "name": "Syrup Bomb", + "effect": "The user sets off an explosion of sticky candy syrup, which coats the target and causes the target's Speed stat to drop each turn for three turns." + }, + "ivyCudgel": { + "name": "Ivy Cudgel", + "effect": "The user strikes with an ivy-wrapped cudgel. This move's type changes depending on the mask worn by the user, and it has a heightened chance of landing a critical hit." + }, + "electroShot": { + "name": "Electro Shot", + "effect": "The user gathers electricity on the first turn, boosting its Sp. Atk stat, then fires a high-voltage shot on the next turn. The shot will be fired immediately in rain." + }, + "teraStarstorm": { + "name": "Tera Starstorm", + "effect": "With the power of its crystals, the user bombards and eliminates the target. When used by Terapagos in its Stellar Form, this move damages all opposing Pokémon." + }, + "fickleBeam": { + "name": "Fickle Beam", + "effect": "The user shoots a beam of light to inflict damage. Sometimes all the user's heads shoot beams in unison, doubling the move's power." + }, + "burningBulwark": { + "name": "Burning Bulwark", + "effect": "The user's intensely hot fur protects it from attacks and also burns any attacker that makes direct contact with it." + }, + "thunderclap": { + "name": "Thunderclap", + "effect": "This move enables the user to attack first with a jolt of electricity. This move fails if the target is not readying an attack." + }, + "mightyCleave": { + "name": "Mighty Cleave", + "effect": "The user wields the light that has accumulated atop its head to cleave the target. This move hits even if the target protects itself." + }, + "tachyonCutter": { + "name": "Tachyon Cutter", + "effect": "The user attacks by launching particle blades at the target twice in a row. This attack never misses." + }, + "hardPress": { + "name": "Hard Press", + "effect": "The target is crushed with an arm, a claw, or the like to inflict damage. The more HP the target has left, the greater the move's power." + }, + "dragonCheer": { + "name": "Dragon Cheer", + "effect": "The user raises its allies' morale with a draconic cry so that their future attacks have a heightened chance of landing critical hits. This rouses Dragon types more." + }, + "alluringVoice": { + "name": "Alluring Voice", + "effect": "The user attacks the target using its angelic voice. This also confuses the target if its stats have been boosted during the turn." + }, + "temperFlare": { + "name": "Temper Flare", + "effect": "Spurred by desperation, the user attacks the target. This move's power is doubled if the user's previous move failed." + }, + "supercellSlam": { + "name": "Supercell Slam", + "effect": "The user electrifies its body and drops onto the target to inflict damage. If this move misses, the user takes damage instead." + }, + "psychicNoise": { + "name": "Psychic Noise", + "effect": "The user attacks the target with unpleasant sound waves. For two turns, the target is prevented from recovering HP through moves, Abilities, or held items." + }, + "upperHand": { + "name": "Upper Hand", + "effect": "The user reacts to the target's movement and strikes with the heel of its palm, making the target flinch. This move fails if the target is not readying a priority move." + }, + "malignantChain": { + "name": "Malignant Chain", + "effect": "The user pours toxins into the target by wrapping them in a toxic, corrosive chain. This may also leave the target badly poisoned." + } +} diff --git a/src/locales/en/move.ts b/src/locales/en/move.ts deleted file mode 100644 index b9a8836dfec..00000000000 --- a/src/locales/en/move.ts +++ /dev/null @@ -1,3812 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -export const move: MoveTranslationEntries = { - "pound": { - name: "Pound", - effect: "The target is physically pounded with a long tail, a foreleg, or the like." - }, - "karateChop": { - name: "Karate Chop", - effect: "The target is attacked with a sharp chop. Critical hits land more easily." - }, - "doubleSlap": { - name: "Double Slap", - effect: "The target is slapped repeatedly, back and forth, two to five times in a row." - }, - "cometPunch": { - name: "Comet Punch", - effect: "The target is hit with a flurry of punches that strike two to five times in a row." - }, - "megaPunch": { - name: "Mega Punch", - effect: "The target is slugged by a punch thrown with muscle-packed power." - }, - "payDay": { - name: "Pay Day", - effect: "Numerous coins are hurled at the target to inflict damage. Money is earned after the battle." - }, - "firePunch": { - name: "Fire Punch", - effect: "The target is punched with a fiery fist. This may also leave the target with a burn." - }, - "icePunch": { - name: "Ice Punch", - effect: "The target is punched with an icy fist. This may also leave the target frozen." - }, - "thunderPunch": { - name: "Thunder Punch", - effect: "The target is punched with an electrified fist. This may also leave the target with paralysis." - }, - "scratch": { - name: "Scratch", - effect: "Hard, pointed, sharp claws rake the target to inflict damage." - }, - "viseGrip": { - name: "Vise Grip", - effect: "The target is gripped and squeezed from both sides to inflict damage." - }, - "guillotine": { - name: "Guillotine", - effect: "A vicious, tearing attack with big pincers. The target faints instantly if this attack hits." - }, - "razorWind": { - name: "Razor Wind", - effect: "In this two-turn attack, blades of wind hit opposing Pokémon on the second turn. Critical hits land more easily." - }, - "swordsDance": { - name: "Swords Dance", - effect: "A frenetic dance to uplift the fighting spirit. This sharply raises the user's Attack stat." - }, - "cut": { - name: "Cut", - effect: "The target is cut with a scythe or claw." - }, - "gust": { - name: "Gust", - effect: "A gust of wind is whipped up by wings and launched at the target to inflict damage." - }, - "wingAttack": { - name: "Wing Attack", - effect: "The target is struck with large, imposing wings spread wide to inflict damage." - }, - "whirlwind": { - name: "Whirlwind", - effect: "The target is blown away, and a different Pokémon is dragged out. In the wild, this ends a battle against a single Pokémon." - }, - "fly": { - name: "Fly", - effect: "The user flies up into the sky and then strikes its target on the next turn." - }, - "bind": { - name: "Bind", - effect: "Things such as long bodies or tentacles are used to bind and squeeze the target for four to five turns." - }, - "slam": { - name: "Slam", - effect: "The target is slammed with a long tail, vines, or the like to inflict damage." - }, - "vineWhip": { - name: "Vine Whip", - effect: "The target is struck with slender, whiplike vines to inflict damage." - }, - "stomp": { - name: "Stomp", - effect: "The target is stomped with a big foot. This may also make the target flinch." - }, - "doubleKick": { - name: "Double Kick", - effect: "The target is quickly kicked twice in succession using both feet." - }, - "megaKick": { - name: "Mega Kick", - effect: "The target is attacked by a kick launched with muscle-packed power." - }, - "jumpKick": { - name: "Jump Kick", - effect: "The user jumps up high, then strikes with a kick. If the kick misses, the user hurts itself." - }, - "rollingKick": { - name: "Rolling Kick", - effect: "The user lashes out with a quick, spinning kick. This may also make the target flinch." - }, - "sandAttack": { - name: "Sand Attack", - effect: "Sand is hurled in the target's face, reducing the target's accuracy." - }, - "headbutt": { - name: "Headbutt", - effect: "The user sticks out its head and attacks by charging straight into the target. This may also make the target flinch." - }, - "hornAttack": { - name: "Horn Attack", - effect: "The target is jabbed with a sharply pointed horn to inflict damage." - }, - "furyAttack": { - name: "Fury Attack", - effect: "The target is jabbed repeatedly with a horn or beak two to five times in a row." - }, - "hornDrill": { - name: "Horn Drill", - effect: "The user stabs the target with a horn that rotates like a drill. The target faints instantly if this attack hits." - }, - "tackle": { - name: "Tackle", - effect: "A physical attack in which the user charges and slams into the target with its whole body." - }, - "bodySlam": { - name: "Body Slam", - effect: "The user drops onto the target with its full body weight. This may also leave the target with paralysis." - }, - "wrap": { - name: "Wrap", - effect: "A long body, vines, or the like are used to wrap and squeeze the target for four to five turns." - }, - "takeDown": { - name: "Take Down", - effect: "A reckless, full-body charge attack for slamming into the target. This also damages the user a little." - }, - "thrash": { - name: "Thrash", - effect: "The user rampages and attacks for two to three turns. The user then becomes confused." - }, - "doubleEdge": { - name: "Double-Edge", - effect: "A reckless, life-risking tackle in which the user rushes the target. This also damages the user quite a lot." - }, - "tailWhip": { - name: "Tail Whip", - effect: "The user wags its tail cutely, making opposing Pokémon less wary and lowering their Defense stats." - }, - "poisonSting": { - name: "Poison Sting", - effect: "The user stabs the target with a poisonous stinger. This may also poison the target." - }, - "twineedle": { - name: "Twineedle", - effect: "The user damages the target twice in succession by jabbing it with two spikes. This may also poison the target." - }, - "pinMissile": { - name: "Pin Missile", - effect: "Sharp spikes are shot at the target in rapid succession. They hit two to five times in a row." - }, - "leer": { - name: "Leer", - effect: "The user gives opposing Pokémon an intimidating leer that lowers the Defense stat." - }, - "bite": { - name: "Bite", - effect: "The target is bitten with viciously sharp fangs. This may also make the target flinch." - }, - "growl": { - name: "Growl", - effect: "The user growls in an endearing way, making opposing Pokémon less wary. This lowers their Attack stats." - }, - "roar": { - name: "Roar", - effect: "The target is scared off, and a different Pokémon is dragged out. In the wild, this ends a battle against a single Pokémon." - }, - "sing": { - name: "Sing", - effect: "A soothing lullaby is sung in a calming voice that puts the target into a deep slumber." - }, - "supersonic": { - name: "Supersonic", - effect: "The user generates odd sound waves from its body that confuse the target." - }, - "sonicBoom": { - name: "Sonic Boom", - effect: "The target is hit with a destructive shock wave that always inflicts 20 HP damage." - }, - "disable": { - name: "Disable", - effect: "For four turns, this move prevents the target from using the move it last used." - }, - "acid": { - name: "Acid", - effect: "Opposing Pokémon are attacked with a spray of harsh acid. This may also lower their Sp. Def stats." - }, - "ember": { - name: "Ember", - effect: "The target is attacked with small flames. This may also leave the target with a burn." - }, - "flamethrower": { - name: "Flamethrower", - effect: "The target is scorched with an intense blast of fire. This may also leave the target with a burn." - }, - "mist": { - name: "Mist", - effect: "The user cloaks itself and its allies in a white mist that prevents any of their stats from being lowered for five turns." - }, - "waterGun": { - name: "Water Gun", - effect: "The target is blasted with a forceful shot of water." - }, - "hydroPump": { - name: "Hydro Pump", - effect: "The target is blasted by a huge volume of water launched under great pressure." - }, - "surf": { - name: "Surf", - effect: "The user attacks everything around it by swamping its surroundings with a giant wave." - }, - "iceBeam": { - name: "Ice Beam", - effect: "The target is struck with an icy-cold beam of energy. This may also leave the target frozen." - }, - "blizzard": { - name: "Blizzard", - effect: "A howling blizzard is summoned to strike opposing Pokémon. This may also leave the opposing Pokémon frozen." - }, - "psybeam": { - name: "Psybeam", - effect: "The target is attacked with a peculiar ray. This may also leave the target confused." - }, - "bubbleBeam": { - name: "Bubble Beam", - effect: "A spray of bubbles is forcefully ejected at the target. This may also lower the target's Speed stat." - }, - "auroraBeam": { - name: "Aurora Beam", - effect: "The target is hit with a rainbow-colored beam. This may also lower the target's Attack stat." - }, - "hyperBeam": { - name: "Hyper Beam", - effect: "The target is attacked with a powerful beam. The user can't move on the next turn." - }, - "peck": { - name: "Peck", - effect: "The target is jabbed with a sharply pointed beak or horn." - }, - "drillPeck": { - name: "Drill Peck", - effect: "A corkscrewing attack that strikes the target with a sharp beak acting as a drill." - }, - "submission": { - name: "Submission", - effect: "The user grabs the target and recklessly dives for the ground. This also damages the user a little." - }, - "lowKick": { - name: "Low Kick", - effect: "A powerful low kick that makes the target fall over. The heavier the target, the greater the move's power." - }, - "counter": { - name: "Counter", - effect: "A retaliation move that counters any physical attack, inflicting double the damage taken." - }, - "seismicToss": { - name: "Seismic Toss", - effect: "The target is thrown using the power of gravity. It inflicts damage equal to the user's level." - }, - "strength": { - name: "Strength", - effect: "The target is slugged with a punch thrown at maximum power." - }, - "absorb": { - name: "Absorb", - effect: "A nutrient-draining attack. The user's HP is restored by half the damage taken by the target." - }, - "megaDrain": { - name: "Mega Drain", - effect: "A nutrient-draining attack. The user's HP is restored by half the damage taken by the target." - }, - "leechSeed": { - name: "Leech Seed", - effect: "A seed is planted on the target. It steals some HP from the target every turn." - }, - "growth": { - name: "Growth", - effect: "The user's body grows all at once, raising the Attack and Sp. Atk stats." - }, - "razorLeaf": { - name: "Razor Leaf", - effect: "Sharp-edged leaves are launched to slash at opposing Pokémon. Critical hits land more easily." - }, - "solarBeam": { - name: "Solar Beam", - effect: "In this two-turn attack, the user gathers light, then blasts a bundled beam on the next turn." - }, - "poisonPowder": { - name: "Poison Powder", - effect: "The user scatters a cloud of poisonous dust that poisons the target." - }, - "stunSpore": { - name: "Stun Spore", - effect: "The user scatters a cloud of numbing powder that paralyzes the target." - }, - "sleepPowder": { - name: "Sleep Powder", - effect: "The user scatters a big cloud of sleep-inducing dust around the target." - }, - "petalDance": { - name: "Petal Dance", - effect: "The user attacks the target by scattering petals for two to three turns. The user then becomes confused." - }, - "stringShot": { - name: "String Shot", - effect: "Opposing Pokémon are bound with silk blown from the user's mouth that harshly lowers the Speed stat." - }, - "dragonRage": { - name: "Dragon Rage", - effect: "This attack hits the target with a shock wave of pure rage. This attack always inflicts 40 HP damage." - }, - "fireSpin": { - name: "Fire Spin", - effect: "The target becomes trapped within a fierce vortex of fire that rages for four to five turns." - }, - "thunderShock": { - name: "Thunder Shock", - effect: "A jolt of electricity crashes down on the target to inflict damage. This may also leave the target with paralysis." - }, - "thunderbolt": { - name: "Thunderbolt", - effect: "A strong electric blast crashes down on the target. This may also leave the target with paralysis." - }, - "thunderWave": { - name: "Thunder Wave", - effect: "The user launches a weak jolt of electricity that paralyzes the target." - }, - "thunder": { - name: "Thunder", - effect: "A wicked thunderbolt is dropped on the target to inflict damage. This may also leave the target with paralysis." - }, - "rockThrow": { - name: "Rock Throw", - effect: "The user picks up and throws a small rock at the target to attack." - }, - "earthquake": { - name: "Earthquake", - effect: "The user sets off an earthquake that strikes every Pokémon around it." - }, - "fissure": { - name: "Fissure", - effect: "The user opens up a fissure in the ground and drops the target in. The target faints instantly if this attack hits." - }, - "dig": { - name: "Dig", - effect: "The user burrows into the ground, then attacks on the next turn." - }, - "toxic": { - name: "Toxic", - effect: "A move that leaves the target badly poisoned. Its poison damage worsens every turn." - }, - "confusion": { - name: "Confusion", - effect: "The target is hit by a weak telekinetic force. This may also confuse the target." - }, - "psychic": { - name: "Psychic", - effect: "The target is hit by a strong telekinetic force. This may also lower the target's Sp. Def stat." - }, - "hypnosis": { - name: "Hypnosis", - effect: "The user employs hypnotic suggestion to make the target fall into a deep sleep." - }, - "meditate": { - name: "Meditate", - effect: "The user meditates to awaken the power deep within its body and raise its Attack stat." - }, - "agility": { - name: "Agility", - effect: "The user relaxes and lightens its body to move faster. This sharply raises the Speed stat." - }, - "quickAttack": { - name: "Quick Attack", - effect: "The user lunges at the target at a speed that makes it almost invisible. This move always goes first." - }, - "rage": { - name: "Rage", - effect: "As long as this move is in use, the power of rage raises the Attack stat each time the user is hit in battle." - }, - "teleport": { - name: "Teleport", - effect: "The user switches places with a party Pokémon in waiting, if any. If a wild Pokémon uses this move, it flees." - }, - "nightShade": { - name: "Night Shade", - effect: "The user makes the target see a frightening mirage. It inflicts damage equal to the user's level." - }, - "mimic": { - name: "Mimic", - effect: "The user copies the target's last move. The move can be used during battle until the Pokémon is switched out." - }, - "screech": { - name: "Screech", - effect: "An earsplitting screech harshly lowers the target's Defense stat." - }, - "doubleTeam": { - name: "Double Team", - effect: "By moving rapidly, the user makes illusory copies of itself to raise its evasiveness." - }, - "recover": { - name: "Recover", - effect: "Restoring its own cells, the user restores its own HP by half of its max HP." - }, - "harden": { - name: "Harden", - effect: "The user stiffens all the muscles in its body to raise its Defense stat." - }, - "minimize": { - name: "Minimize", - effect: "The user compresses its body to make itself look smaller, which sharply raises its evasiveness." - }, - "smokescreen": { - name: "Smokescreen", - effect: "The user releases an obscuring cloud of smoke or ink. This lowers the target's accuracy." - }, - "confuseRay": { - name: "Confuse Ray", - effect: "The target is exposed to a sinister ray that triggers confusion." - }, - "withdraw": { - name: "Withdraw", - effect: "The user withdraws its body into its hard shell, raising its Defense stat." - }, - "defenseCurl": { - name: "Defense Curl", - effect: "The user curls up to conceal weak spots and raise its Defense stat." - }, - "barrier": { - name: "Barrier", - effect: "The user throws up a sturdy wall that sharply raises its Defense stat." - }, - "lightScreen": { - name: "Light Screen", - effect: "A wondrous wall of light is put up to reduce damage from special attacks for five turns." - }, - "haze": { - name: "Haze", - effect: "The user creates a haze that eliminates every stat change among all the Pokémon engaged in battle." - }, - "reflect": { - name: "Reflect", - effect: "A wondrous wall of light is put up to reduce damage from physical attacks for five turns." - }, - "focusEnergy": { - name: "Focus Energy", - effect: "The user takes a deep breath and focuses so that critical hits land more easily." - }, - "bide": { - name: "Bide", - effect: "The user endures attacks for two turns, then strikes back to cause double the damage taken." - }, - "metronome": { - name: "Metronome", - effect: "The user waggles a finger and stimulates its brain into randomly using nearly any move." - }, - "mirrorMove": { - name: "Mirror Move", - effect: "The user counters the target by mimicking the target's last move." - }, - "selfDestruct": { - name: "Self-Destruct", - effect: "The user attacks everything around it by causing an explosion. The user faints upon using this move." - }, - "eggBomb": { - name: "Egg Bomb", - effect: "A large egg is hurled at the target with maximum force to inflict damage." - }, - "lick": { - name: "Lick", - effect: "The target is licked with a long tongue, causing damage. This may also leave the target with paralysis." - }, - "smog": { - name: "Smog", - effect: "The target is attacked with a discharge of filthy gases. This may also poison the target." - }, - "sludge": { - name: "Sludge", - effect: "Unsanitary sludge is hurled at the target. This may also poison the target." - }, - "boneClub": { - name: "Bone Club", - effect: "The user clubs the target with a bone. This may also make the target flinch." - }, - "fireBlast": { - name: "Fire Blast", - effect: "The target is attacked with an intense blast of all-consuming fire. This may also leave the target with a burn." - }, - "waterfall": { - name: "Waterfall", - effect: "The user charges at the target and may make it flinch." - }, - "clamp": { - name: "Clamp", - effect: "The target is clamped and squeezed by the user's very thick and sturdy shell for four to five turns." - }, - "swift": { - name: "Swift", - effect: "Star-shaped rays are shot at opposing Pokémon. This attack never misses." - }, - "skullBash": { - name: "Skull Bash", - effect: "The user tucks in its head to raise its Defense stat on the first turn, then rams the target on the next turn." - }, - "spikeCannon": { - name: "Spike Cannon", - effect: "Sharp spikes are shot at the target in rapid succession. They hit two to five times in a row." - }, - "constrict": { - name: "Constrict", - effect: "The target is attacked with long, creeping tentacles, vines, or the like. This may also lower the target's Speed stat." - }, - "amnesia": { - name: "Amnesia", - effect: "The user temporarily empties its mind to forget its concerns. This sharply raises the user's Sp. Def stat." - }, - "kinesis": { - name: "Kinesis", - effect: "The user distracts the target by bending a spoon. This lowers the target's accuracy." - }, - "softBoiled": { - name: "Soft-Boiled", - effect: "The user restores its own HP by up to half of its max HP." - }, - "highJumpKick": { - name: "High Jump Kick", - effect: "The target is attacked with a knee kick from a jump. If it misses, the user is hurt instead." - }, - "glare": { - name: "Glare", - effect: "The user intimidates the target with the pattern on its belly to cause paralysis." - }, - "dreamEater": { - name: "Dream Eater", - effect: "The user eats the dreams of a sleeping target. The user's HP is restored by half the damage taken by the target." - }, - "poisonGas": { - name: "Poison Gas", - effect: "A cloud of poison gas is sprayed in the face of opposing Pokémon, poisoning those it hits." - }, - "barrage": { - name: "Barrage", - effect: "Round objects are hurled at the target to strike two to five times in a row." - }, - "leechLife": { - name: "Leech Life", - effect: "The user drains the target's blood. The user's HP is restored by half the damage taken by the target." - }, - "lovelyKiss": { - name: "Lovely Kiss", - effect: "With a scary face, the user tries to force a kiss on the target. If it succeeds, the target falls asleep." - }, - "skyAttack": { - name: "Sky Attack", - effect: "A second-turn attack move where critical hits land more easily. This may also make the target flinch." - }, - "transform": { - name: "Transform", - effect: "The user transforms into a copy of the target right down to having the same move set." - }, - "bubble": { - name: "Bubble", - effect: "A spray of countless bubbles is jetted at the opposing Pokémon. This may also lower their Speed stat." - }, - "dizzyPunch": { - name: "Dizzy Punch", - effect: "The target is hit with rhythmically launched punches. This may also leave the target confused." - }, - "spore": { - name: "Spore", - effect: "The user scatters bursts of spores that induce sleep." - }, - "flash": { - name: "Flash", - effect: "The user flashes a bright light that cuts the target's accuracy." - }, - "psywave": { - name: "Psywave", - effect: "The target is attacked with an odd psychic wave. The attack varies in intensity." - }, - "splash": { - name: "Splash", - effect: "The user just flops and splashes around to no effect at all..." - }, - "acidArmor": { - name: "Acid Armor", - effect: "The user alters its cellular structure to liquefy itself, sharply raising its Defense stat." - }, - "crabhammer": { - name: "Crabhammer", - effect: "The target is hammered with a large pincer. Critical hits land more easily." - }, - "explosion": { - name: "Explosion", - effect: "The user attacks everything around it by causing a tremendous explosion. The user faints upon using this move." - }, - "furySwipes": { - name: "Fury Swipes", - effect: "The target is raked with sharp claws or scythes quickly two to five times in a row." - }, - "bonemerang": { - name: "Bonemerang", - effect: "The user throws the bone it holds. The bone loops around to hit the target twice—coming and going." - }, - "rest": { - name: "Rest", - effect: "The user goes to sleep for two turns. This fully restores the user's HP and heals any status conditions." - }, - "rockSlide": { - name: "Rock Slide", - effect: "Large boulders are hurled at opposing Pokémon to inflict damage. This may also make the opposing Pokémon flinch." - }, - "hyperFang": { - name: "Hyper Fang", - effect: "The user bites hard on the target with its sharp front fangs. This may also make the target flinch." - }, - "sharpen": { - name: "Sharpen", - effect: "The user makes its edges more jagged, which raises its Attack stat." - }, - "conversion": { - name: "Conversion", - effect: "The user changes its type to become the same type as the move at the top of the list of moves it knows." - }, - "triAttack": { - name: "Tri Attack", - effect: "The user strikes with a simultaneous three-beam attack. This may also burn, freeze, or paralyze the target." - }, - "superFang": { - name: "Super Fang", - effect: "The user chomps hard on the target with its sharp front fangs. This cuts the target's HP in half." - }, - "slash": { - name: "Slash", - effect: "The target is attacked with a slash of claws or blades. Critical hits land more easily." - }, - "substitute": { - name: "Substitute", - effect: "The user creates a substitute for itself using some of its HP. The substitute serves as the user's decoy." - }, - "struggle": { - name: "Struggle", - effect: "This attack is used in desperation only if the user has no PP. It also damages the user a little." - }, - "sketch": { - name: "Sketch", - effect: "It enables the user to permanently learn the move last used by the target. Once used, Sketch disappears." - }, - "tripleKick": { - name: "Triple Kick", - effect: "A consecutive three-kick attack that becomes more powerful with each successful hit." - }, - "thief": { - name: "Thief", - effect: "The user attacks and has a 30% chance to steal the target's held item simultaneously." - }, - "spiderWeb": { - name: "Spider Web", - effect: "The user ensnares the target with thin, gooey silk so it can't flee from battle." - }, - "mindReader": { - name: "Mind Reader", - effect: "The user senses the target's movements with its mind to ensure its next attack does not miss the target." - }, - "nightmare": { - name: "Nightmare", - effect: "A sleeping target sees a nightmare that inflicts some damage every turn." - }, - "flameWheel": { - name: "Flame Wheel", - effect: "The user cloaks itself in fire and charges at the target. This may also leave the target with a burn." - }, - "snore": { - name: "Snore", - effect: "This attack can be used only if the user is asleep. The harsh noise may also make the target flinch." - }, - "curse": { - name: "Curse", - effect: "A move that works differently for the Ghost type than for all other types." - }, - "flail": { - name: "Flail", - effect: "The user flails about aimlessly to attack. The less HP the user has, the greater the move's power." - }, - "conversion2": { - name: "Conversion 2", - effect: "The user changes its type to make itself resistant to the type of the attack the target used last." - }, - "aeroblast": { - name: "Aeroblast", - effect: "A vortex of air is shot at the target to inflict damage. Critical hits land more easily." - }, - "cottonSpore": { - name: "Cotton Spore", - effect: "The user releases cotton-like spores that cling to opposing Pokémon, which harshly lowers their Speed stats." - }, - "reversal": { - name: "Reversal", - effect: "An all-out attack that becomes more powerful the less HP the user has." - }, - "spite": { - name: "Spite", - effect: "The user unleashes its grudge on the move last used by the target by cutting 4 PP from it." - }, - "powderSnow": { - name: "Powder Snow", - effect: "The user attacks with a chilling gust of powdery snow. This may also freeze opposing Pokémon." - }, - "protect": { - name: "Protect", - effect: "This move enables the user to protect itself from all attacks. Its chance of failing rises if it is used in succession." - }, - "machPunch": { - name: "Mach Punch", - effect: "The user throws a punch at blinding speed. This move always goes first." - }, - "scaryFace": { - name: "Scary Face", - effect: "The user frightens the target with a scary face to harshly lower its Speed stat." - }, - "feintAttack": { - name: "Feint Attack", - effect: "The user approaches the target disarmingly, then throws a sucker punch. This attack never misses." - }, - "sweetKiss": { - name: "Sweet Kiss", - effect: "The user kisses the target with a sweet, angelic cuteness that causes confusion." - }, - "bellyDrum": { - name: "Belly Drum", - effect: "The user maximizes its Attack stat in exchange for HP equal to half its max HP." - }, - "sludgeBomb": { - name: "Sludge Bomb", - effect: "Unsanitary sludge is hurled at the target. This may also poison the target." - }, - "mudSlap": { - name: "Mud-Slap", - effect: "The user hurls mud in the target's face to inflict damage and lower its accuracy." - }, - "octazooka": { - name: "Octazooka", - effect: "The user attacks by spraying ink in the target's face or eyes. This may also lower the target's accuracy." - }, - "spikes": { - name: "Spikes", - effect: "The user lays a trap of spikes at the opposing team's feet. The trap hurts Pokémon that switch into battle." - }, - "zapCannon": { - name: "Zap Cannon", - effect: "The user fires an electric blast like a cannon to inflict damage and cause paralysis." - }, - "foresight": { - name: "Foresight", - effect: "Enables a Ghost-type target to be hit by Normal- and Fighting-type attacks. This also enables an evasive target to be hit." - }, - "destinyBond": { - name: "Destiny Bond", - effect: "After using this move, if the user faints, the Pokémon that landed the knockout hit also faints. Its chance of failing rises if it is used in succession." - }, - "perishSong": { - name: "Perish Song", - effect: "Any Pokémon that hears this song faints in three turns, unless it switches out of battle." - }, - "icyWind": { - name: "Icy Wind", - effect: "The user attacks with a gust of chilled air. This also lowers opposing Pokémon's Speed stats." - }, - "detect": { - name: "Detect", - effect: "This move enables the user to protect itself from all attacks. Its chance of failing rises if it is used in succession." - }, - "boneRush": { - name: "Bone Rush", - effect: "The user strikes the target with a hard bone two to five times in a row." - }, - "lockOn": { - name: "Lock-On", - effect: "The user takes sure aim at the target. This ensures the next attack does not miss the target." - }, - "outrage": { - name: "Outrage", - effect: "The user rampages and attacks for two to three turns. The user then becomes confused." - }, - "sandstorm": { - name: "Sandstorm", - effect: "A five-turn sandstorm is summoned to hurt all combatants except Rock, Ground, and Steel types. It raises the Sp. Def stat of Rock types." - }, - "gigaDrain": { - name: "Giga Drain", - effect: "A nutrient-draining attack. The user's HP is restored by half the damage taken by the target." - }, - "endure": { - name: "Endure", - effect: "The user endures any attack with at least 1 HP. Its chance of failing rises if it is used in succession." - }, - "charm": { - name: "Charm", - effect: "The user gazes at the target rather charmingly, making it less wary. This harshly lowers the target's Attack stat." - }, - "rollout": { - name: "Rollout", - effect: "The user continually rolls into the target over five turns. It becomes more powerful each time it hits." - }, - "falseSwipe": { - name: "False Swipe", - effect: "A restrained attack that prevents the target from fainting. The target is left with at least 1 HP." - }, - "swagger": { - name: "Swagger", - effect: "The user enrages and confuses the target. However, this also sharply raises the target's Attack stat." - }, - "milkDrink": { - name: "Milk Drink", - effect: "The user restores its own HP by up to half of its max HP." - }, - "spark": { - name: "Spark", - effect: "The user throws an electrically charged tackle at the target. This may also leave the target with paralysis." - }, - "furyCutter": { - name: "Fury Cutter", - effect: "The target is slashed with scythes or claws. This attack becomes more powerful if it hits in succession." - }, - "steelWing": { - name: "Steel Wing", - effect: "The target is hit with wings of steel. This may also raise the user's Defense stat." - }, - "meanLook": { - name: "Mean Look", - effect: "The user pins the target with a dark, arresting look. The target becomes unable to flee." - }, - "attract": { - name: "Attract", - effect: "If it is the opposite gender of the user, the target becomes infatuated and less likely to attack." - }, - "sleepTalk": { - name: "Sleep Talk", - effect: "While it is asleep, the user randomly uses one of the moves it knows." - }, - "healBell": { - name: "Heal Bell", - effect: "The user makes a soothing bell chime to heal the status conditions of all the party Pokémon." - }, - "return": { - name: "Return", - effect: "This full-power attack grows more powerful the more the user likes its Trainer." - }, - "present": { - name: "Present", - effect: "The user attacks by giving the target a gift with a hidden trap. It restores HP sometimes, however." - }, - "frustration": { - name: "Frustration", - effect: "This full-power attack grows more powerful the less the user likes its Trainer." - }, - "safeguard": { - name: "Safeguard", - effect: "The user creates a protective field that prevents status conditions for five turns." - }, - "painSplit": { - name: "Pain Split", - effect: "The user adds its HP to the target's HP, then equally shares the combined HP with the target." - }, - "sacredFire": { - name: "Sacred Fire", - effect: "The target is razed with a mystical fire of great intensity. This may also leave the target with a burn." - }, - "magnitude": { - name: "Magnitude", - effect: "The user attacks everything around it with a ground-shaking quake. Its power varies." - }, - "dynamicPunch": { - name: "Dynamic Punch", - effect: "The user punches the target with full, concentrated power. This confuses the target if it hits." - }, - "megahorn": { - name: "Megahorn", - effect: "Using its tough and impressive horn, the user rams into the target with no letup." - }, - "dragonBreath": { - name: "Dragon Breath", - effect: "The user exhales a mighty gust that inflicts damage. This may also leave the target with paralysis." - }, - "batonPass": { - name: "Baton Pass", - effect: "The user switches places with a party Pokémon in waiting and passes along any stat changes." - }, - "encore": { - name: "Encore", - effect: "The user compels the target to keep using the move it encored for three turns." - }, - "pursuit": { - name: "Pursuit", - effect: "The power of this attack move is doubled if it's used on a target that's switching out of battle." - }, - "rapidSpin": { - name: "Rapid Spin", - effect: "A spin attack that can also eliminate such moves as Bind, Wrap, and Leech Seed. This also raises the user's Speed stat." - }, - "sweetScent": { - name: "Sweet Scent", - effect: "A sweet scent that harshly lowers opposing Pokémon's evasiveness." - }, - "ironTail": { - name: "Iron Tail", - effect: "The target is slammed with a steel-hard tail. This may also lower the target's Defense stat." - }, - "metalClaw": { - name: "Metal Claw", - effect: "The target is raked with steel claws. This may also raise the user's Attack stat." - }, - "vitalThrow": { - name: "Vital Throw", - effect: "The user attacks last. In return, this throw move never misses." - }, - "morningSun": { - name: "Morning Sun", - effect: "The user restores its own HP. The amount of HP regained varies with the weather." - }, - "synthesis": { - name: "Synthesis", - effect: "The user restores its own HP. The amount of HP regained varies with the weather." - }, - "moonlight": { - name: "Moonlight", - effect: "The user restores its own HP. The amount of HP regained varies with the weather." - }, - "hiddenPower": { - name: "Hidden Power", - effect: "A unique attack that varies in type depending on the Pokémon using it." - }, - "crossChop": { - name: "Cross Chop", - effect: "The user delivers a double chop with its forearms crossed. Critical hits land more easily." - }, - "twister": { - name: "Twister", - effect: "The user whips up a vicious tornado to tear at opposing Pokémon. This may also make them flinch." - }, - "rainDance": { - name: "Rain Dance", - effect: "The user summons a heavy rain that falls for five turns, powering up Water-type moves. It lowers the power of Fire-type moves." - }, - "sunnyDay": { - name: "Sunny Day", - effect: "The user intensifies the sun for five turns, powering up Fire-type moves. It lowers the power of Water-type moves." - }, - "crunch": { - name: "Crunch", - effect: "The user crunches up the target with sharp fangs. This may also lower the target's Defense stat." - }, - "mirrorCoat": { - name: "Mirror Coat", - effect: "A retaliation move that counters any special attack, inflicting double the damage taken." - }, - "psychUp": { - name: "Psych Up", - effect: "The user hypnotizes itself into copying any stat change made by the target." - }, - "extremeSpeed": { - name: "Extreme Speed", - effect: "The user charges the target at blinding speed. This move always goes first." - }, - "ancientPower": { - name: "Ancient Power", - effect: "The user attacks with a prehistoric power. This may also raise all the user's stats at once." - }, - "shadowBall": { - name: "Shadow Ball", - effect: "The user hurls a shadowy blob at the target. This may also lower the target's Sp. Def stat." - }, - "futureSight": { - name: "Future Sight", - effect: "Two turns after this move is used, a hunk of psychic energy attacks the target." - }, - "rockSmash": { - name: "Rock Smash", - effect: "The user attacks with a punch. This may also lower the target's Defense stat." - }, - "whirlpool": { - name: "Whirlpool", - effect: "The user traps the target in a violent swirling whirlpool for four to five turns." - }, - "beatUp": { - name: "Beat Up", - effect: "The user gets all party Pokémon to attack the target. The more party Pokémon, the greater the number of attacks." - }, - "fakeOut": { - name: "Fake Out", - effect: "This attack hits first and makes the target flinch. It only works the first turn each time the user enters battle." - }, - "uproar": { - name: "Uproar", - effect: "The user attacks in an uproar for three turns. During that time, no Pokémon can fall asleep." - }, - "stockpile": { - name: "Stockpile", - effect: "The user charges up power and raises both its Defense and Sp. Def stats. The move can be used three times." - }, - "spitUp": { - name: "Spit Up", - effect: "The power stored using the move Stockpile is released at once in an attack. The more power is stored, the greater the move's power." - }, - "swallow": { - name: "Swallow", - effect: "The power stored using the move Stockpile is absorbed by the user to heal its HP. Storing more power heals more HP." - }, - "heatWave": { - name: "Heat Wave", - effect: "The user attacks by exhaling hot breath on opposing Pokémon. This may also leave those Pokémon with a burn." - }, - "hail": { - name: "Hail", - effect: "The user summons a hailstorm lasting five turns. It damages all Pokémon except Ice types." - }, - "torment": { - name: "Torment", - effect: "The user torments and enrages the target, making it incapable of using the same move twice in a row." - }, - "flatter": { - name: "Flatter", - effect: "Flattery is used to confuse the target. However, this also raises the target's Sp. Atk stat." - }, - "willOWisp": { - name: "Will-O-Wisp", - effect: "The user shoots a sinister flame at the target to inflict a burn." - }, - "memento": { - name: "Memento", - effect: "The user faints when using this move. In return, this harshly lowers the target's Attack and Sp. Atk stats." - }, - "facade": { - name: "Facade", - effect: "This attack move doubles its power if the user is poisoned, burned, or paralyzed." - }, - "focusPunch": { - name: "Focus Punch", - effect: "The user focuses its mind before launching a punch. This move fails if the user is hit before it is used." - }, - "smellingSalts": { - name: "Smelling Salts", - effect: "This attack's power is doubled when used on a target with paralysis. This also cures the target's paralysis, however." - }, - "followMe": { - name: "Follow Me", - effect: "The user draws attention to itself, making all targets take aim only at the user." - }, - "naturePower": { - name: "Nature Power", - effect: "This attack makes use of nature's power. Its effects vary depending on the user's environment." - }, - "charge": { - name: "Charge", - effect: "The user boosts the power of the Electric move it uses on the next turn. This also raises the user's Sp. Def stat." - }, - "taunt": { - name: "Taunt", - effect: "The target is taunted into a rage that allows it to use only attack moves for three turns." - }, - "helpingHand": { - name: "Helping Hand", - effect: "The user assists an ally by boosting the power of that ally's attack." - }, - "trick": { - name: "Trick", - effect: "The user catches the target off guard and swaps its held item with its own." - }, - "rolePlay": { - name: "Role Play", - effect: "The user mimics the target completely, copying the target's Ability." - }, - "wish": { - name: "Wish", - effect: "One turn after this move is used, the user's or its replacement's HP is restored by half the user's max HP." - }, - "assist": { - name: "Assist", - effect: "The user hurriedly and randomly uses a move among those known by ally Pokémon." - }, - "ingrain": { - name: "Ingrain", - effect: "The user lays roots that restore its HP on every turn. Because it's rooted, it can't switch out." - }, - "superpower": { - name: "Superpower", - effect: "The user attacks the target with great power. However, this also lowers the user's Attack and Defense stats." - }, - "magicCoat": { - name: "Magic Coat", - effect: "Moves like Leech Seed and moves that inflict status conditions are blocked by a barrier and reflected back to the user of those moves." - }, - "recycle": { - name: "Recycle", - effect: "The user recycles a held item that has been used in battle so it can be used again." - }, - "revenge": { - name: "Revenge", - effect: "This attack move's power is doubled if the user has been hurt by the opponent in the same turn." - }, - "brickBreak": { - name: "Brick Break", - effect: "The user attacks with a swift chop. It can also break barriers, such as Light Screen and Reflect." - }, - "yawn": { - name: "Yawn", - effect: "The user lets loose a huge yawn that lulls the target into falling asleep on the next turn." - }, - "knockOff": { - name: "Knock Off", - effect: "The user slaps down the target's held item, and that item can't be used in that battle. The move does more damage if the target has a held item." - }, - "endeavor": { - name: "Endeavor", - effect: "This attack move cuts down the target's HP to equal the user's HP." - }, - "eruption": { - name: "Eruption", - effect: "The user attacks opposing Pokémon with explosive fury. The lower the user's HP, the lower the move's power." - }, - "skillSwap": { - name: "Skill Swap", - effect: "The user employs its psychic power to exchange Abilities with the target." - }, - "imprison": { - name: "Imprison", - effect: "If opposing Pokémon know any move also known by the user, they are prevented from using it." - }, - "refresh": { - name: "Refresh", - effect: "The user rests to cure itself of poisoning, a burn, or paralysis." - }, - "grudge": { - name: "Grudge", - effect: "If the user faints, the user's grudge fully depletes the PP of the opponent's move that knocked it out." - }, - "snatch": { - name: "Snatch", - effect: "The user steals the effects of any attempts to use a healing or stat-changing move." - }, - "secretPower": { - name: "Secret Power", - effect: "The additional effects of this attack depend upon where it was used." - }, - "dive": { - name: "Dive", - effect: "Diving on the first turn, the user floats up and attacks on the next turn." - }, - "armThrust": { - name: "Arm Thrust", - effect: "The user lets loose a flurry of open-palmed arm thrusts that hit two to five times in a row." - }, - "camouflage": { - name: "Camouflage", - effect: "The user's type is changed depending on its environment, such as at water's edge, in grass, or in a cave." - }, - "tailGlow": { - name: "Tail Glow", - effect: "The user stares at flashing lights to focus its mind, drastically raising its Sp. Atk stat." - }, - "lusterPurge": { - name: "Luster Purge", - effect: "The user lets loose a damaging burst of light. This may also lower the target's Sp. Def stat." - }, - "mistBall": { - name: "Mist Ball", - effect: "A mist-like flurry of down envelops and damages the target. This may also lower the target's Sp. Atk stat." - }, - "featherDance": { - name: "Feather Dance", - effect: "The user covers the target's body with a mass of down that harshly lowers its Attack stat." - }, - "teeterDance": { - name: "Teeter Dance", - effect: "The user performs a wobbly dance that confuses the Pokémon around it." - }, - "blazeKick": { - name: "Blaze Kick", - effect: "The user launches a kick that lands a critical hit more easily. This may also leave the target with a burn." - }, - "mudSport": { - name: "Mud Sport", - effect: "The user kicks up mud on the battlefield. This weakens Electric-type moves for five turns." - }, - "iceBall": { - name: "Ice Ball", - effect: "The user attacks the target for five turns. The move's power increases each time it hits." - }, - "needleArm": { - name: "Needle Arm", - effect: "The user attacks by wildly swinging its thorny arms. This may also make the target flinch." - }, - "slackOff": { - name: "Slack Off", - effect: "The user slacks off, restoring its own HP by up to half of its max HP." - }, - "hyperVoice": { - name: "Hyper Voice", - effect: "The user lets loose a horribly echoing shout with the power to inflict damage." - }, - "poisonFang": { - name: "Poison Fang", - effect: "The user bites the target with toxic fangs. This may also leave the target badly poisoned." - }, - "crushClaw": { - name: "Crush Claw", - effect: "The user slashes the target with hard and sharp claws. This may also lower the target's Defense stat." - }, - "blastBurn": { - name: "Blast Burn", - effect: "The target is razed by a fiery explosion. The user can't move on the next turn." - }, - "hydroCannon": { - name: "Hydro Cannon", - effect: "The target is hit with a watery blast. The user can't move on the next turn." - }, - "meteorMash": { - name: "Meteor Mash", - effect: "The target is hit with a hard punch fired like a meteor. This may also raise the user's Attack stat." - }, - "astonish": { - name: "Astonish", - effect: "The user attacks the target while shouting in a startling fashion. This may also make the target flinch." - }, - "weatherBall": { - name: "Weather Ball", - effect: "This attack move varies in power and type depending on the weather." - }, - "aromatherapy": { - name: "Aromatherapy", - effect: "The user releases a soothing scent that heals all status conditions affecting the user's party." - }, - "fakeTears": { - name: "Fake Tears", - effect: "The user feigns crying to fluster the target, harshly lowering its Sp. Def stat." - }, - "airCutter": { - name: "Air Cutter", - effect: "The user launches razor-like wind to slash opposing Pokémon. Critical hits land more easily." - }, - "overheat": { - name: "Overheat", - effect: "The user attacks the target at full power. The attack's recoil harshly lowers the user's Sp. Atk stat." - }, - "odorSleuth": { - name: "Odor Sleuth", - effect: "Enables a Ghost-type target to be hit by Normal- and Fighting-type attacks. This also enables an evasive target to be hit." - }, - "rockTomb": { - name: "Rock Tomb", - effect: "Boulders are hurled at the target. This also lowers the target's Speed stat by preventing its movement." - }, - "silverWind": { - name: "Silver Wind", - effect: "The target is attacked with powdery scales blown by the wind. This may also raise all the user's stats." - }, - "metalSound": { - name: "Metal Sound", - effect: "A horrible sound like scraping metal harshly lowers the target's Sp. Def stat." - }, - "grassWhistle": { - name: "Grass Whistle", - effect: "The user plays a pleasant melody that lulls the target into a deep sleep." - }, - "tickle": { - name: "Tickle", - effect: "The user tickles the target into laughing, reducing its Attack and Defense stats." - }, - "cosmicPower": { - name: "Cosmic Power", - effect: "The user absorbs a mystical power from space to raise its Defense and Sp. Def stats." - }, - "waterSpout": { - name: "Water Spout", - effect: "The user spouts water to damage opposing Pokémon. The lower the user's HP, the lower the move's power." - }, - "signalBeam": { - name: "Signal Beam", - effect: "The user attacks with a sinister beam of light. This may also confuse the target." - }, - "shadowPunch": { - name: "Shadow Punch", - effect: "The user throws a punch from the shadows. This attack never misses." - }, - "extrasensory": { - name: "Extrasensory", - effect: "The user attacks with an odd, unseeable power. This may also make the target flinch." - }, - "skyUppercut": { - name: "Sky Uppercut", - effect: "The user attacks the target with an uppercut thrown skyward with force." - }, - "sandTomb": { - name: "Sand Tomb", - effect: "The user traps the target inside a harshly raging sandstorm for four to five turns." - }, - "sheerCold": { - name: "Sheer Cold", - effect: "The target faints instantly. It's less likely to hit the target if it's used by Pokémon other than Ice types." - }, - "muddyWater": { - name: "Muddy Water", - effect: "The user attacks by shooting muddy water at opposing Pokémon. This may also lower their accuracy." - }, - "bulletSeed": { - name: "Bullet Seed", - effect: "The user forcefully shoots seeds at the target two to five times in a row." - }, - "aerialAce": { - name: "Aerial Ace", - effect: "The user confounds the target with speed, then slashes. This attack never misses." - }, - "icicleSpear": { - name: "Icicle Spear", - effect: "The user launches sharp icicles at the target two to five times in a row." - }, - "ironDefense": { - name: "Iron Defense", - effect: "The user hardens its body's surface like iron, sharply raising its Defense stat." - }, - "block": { - name: "Block", - effect: "The user blocks the target's way with arms spread wide to prevent escape." - }, - "howl": { - name: "Howl", - effect: "The user howls loudly to raise the spirit of itself and allies. This raises their Attack stats." - }, - "dragonClaw": { - name: "Dragon Claw", - effect: "The user slashes the target with huge sharp claws." - }, - "frenzyPlant": { - name: "Frenzy Plant", - effect: "The user slams the target with the roots of an enormous tree. The user can't move on the next turn." - }, - "bulkUp": { - name: "Bulk Up", - effect: "The user tenses its muscles to bulk up its body, raising both its Attack and Defense stats." - }, - "bounce": { - name: "Bounce", - effect: "The user bounces up high, then drops on the target on the second turn. This may also leave the target with paralysis." - }, - "mudShot": { - name: "Mud Shot", - effect: "The user attacks by hurling a blob of mud at the target. This also lowers the target's Speed stat." - }, - "poisonTail": { - name: "Poison Tail", - effect: "The user hits the target with its tail. This may also poison the target. Critical hits land more easily." - }, - "covet": { - name: "Covet", - effect: "The user endearingly approaches the target, then has a 30% chance to steal the target's held item." - }, - "voltTackle": { - name: "Volt Tackle", - effect: "The user electrifies itself and charges the target. This also damages the user quite a lot. This attack may leave the target with paralysis." - }, - "magicalLeaf": { - name: "Magical Leaf", - effect: "The user scatters curious leaves that chase the target. This attack never misses." - }, - "waterSport": { - name: "Water Sport", - effect: "The user soaks the battlefield with water. This weakens Fire-type moves for five turns." - }, - "calmMind": { - name: "Calm Mind", - effect: "The user quietly focuses its mind and calms its spirit to raise its Sp. Atk and Sp. Def stats." - }, - "leafBlade": { - name: "Leaf Blade", - effect: "The user handles a sharp leaf like a sword and attacks by cutting its target. Critical hits land more easily." - }, - "dragonDance": { - name: "Dragon Dance", - effect: "The user vigorously performs a mystic, powerful dance that raises its Attack and Speed stats." - }, - "rockBlast": { - name: "Rock Blast", - effect: "The user hurls hard rocks at the target. Two to five rocks are launched in a row." - }, - "shockWave": { - name: "Shock Wave", - effect: "The user strikes the target with a quick jolt of electricity. This attack never misses." - }, - "waterPulse": { - name: "Water Pulse", - effect: "The user attacks the target with a pulsing blast of water. This may also confuse the target." - }, - "doomDesire": { - name: "Doom Desire", - effect: "Two turns after this move is used, a concentrated bundle of light blasts the target." - }, - "psychoBoost": { - name: "Psycho Boost", - effect: "The user attacks the target at full power. The attack's recoil harshly lowers the user's Sp. Atk stat." - }, - "roost": { - name: "Roost", - effect: "The user lands and rests its body. This move restores the user's HP by up to half of its max HP." - }, - "gravity": { - name: "Gravity", - effect: "This move enables Flying-type Pokémon or Pokémon with the Levitate Ability to be hit by Ground-type moves. Moves that involve flying can't be used." - }, - "miracleEye": { - name: "Miracle Eye", - effect: "Enables a Dark-type target to be hit by Psychic-type attacks. This also enables an evasive target to be hit." - }, - "wakeUpSlap": { - name: "Wake-Up Slap", - effect: "This attack inflicts big damage on a sleeping target. This also wakes the target up, however." - }, - "hammerArm": { - name: "Hammer Arm", - effect: "The user swings and hits with its strong, heavy fist. It lowers the user's Speed, however." - }, - "gyroBall": { - name: "Gyro Ball", - effect: "The user tackles the target with a high-speed spin. The slower the user compared to the target, the greater the move's power." - }, - "healingWish": { - name: "Healing Wish", - effect: "The user faints. In return, the Pokémon taking its place will have its HP restored and status conditions cured." - }, - "brine": { - name: "Brine", - effect: "If the target's HP is half or less, this attack will hit with double the power." - }, - "naturalGift": { - name: "Natural Gift", - effect: "The user draws power to attack by using its held Berry. The Berry determines the move's type and power." - }, - "feint": { - name: "Feint", - effect: "This attack hits a target using a move such as Protect or Detect. This also lifts the effects of those moves." - }, - "pluck": { - name: "Pluck", - effect: "The user pecks the target. If the target is holding a Berry, the user eats it and gains its effect." - }, - "tailwind": { - name: "Tailwind", - effect: "The user whips up a turbulent whirlwind that ups the Speed stats of the user and its allies for four turns." - }, - "acupressure": { - name: "Acupressure", - effect: "The user applies pressure to stress points, sharply boosting one of its or its allies' stats." - }, - "metalBurst": { - name: "Metal Burst", - effect: "The user retaliates with much greater force against the opponent that last inflicted damage on it." - }, - "uTurn": { - name: "U-turn", - effect: "After making its attack, the user rushes back to switch places with a party Pokémon in waiting." - }, - "closeCombat": { - name: "Close Combat", - effect: "The user fights the target up close without guarding itself. This also lowers the user's Defense and Sp. Def stats." - }, - "payback": { - name: "Payback", - effect: "The user stores power, then attacks. If the user moves after the target, this attack's power will be doubled." - }, - "assurance": { - name: "Assurance", - effect: "If the target has already taken some damage in the same turn, this attack's power is doubled." - }, - "embargo": { - name: "Embargo", - effect: "This move prevents the target from using its held item for five turns. Its Trainer is also prevented from using items on it." - }, - "fling": { - name: "Fling", - effect: "The user flings its held item at the target to attack. This move's power and effects depend on the item." - }, - "psychoShift": { - name: "Psycho Shift", - effect: "Using its psychic power of suggestion, the user transfers its status conditions to the target." - }, - "trumpCard": { - name: "Trump Card", - effect: "The fewer PP this move has, the greater its power." - }, - "healBlock": { - name: "Heal Block", - effect: "For five turns, the user prevents the opposing team from using any moves, Abilities, or held items that recover HP." - }, - "wringOut": { - name: "Wring Out", - effect: "The user powerfully wrings the target. The more HP the target has, the greater the move's power." - }, - "powerTrick": { - name: "Power Trick", - effect: "The user employs its psychic power to switch its Attack stat with its Defense stat." - }, - "gastroAcid": { - name: "Gastro Acid", - effect: "The user hurls up its stomach acids on the target. The fluid eliminates the effect of the target's Ability." - }, - "luckyChant": { - name: "Lucky Chant", - effect: "The user chants an incantation toward the sky, preventing opposing Pokémon from landing critical hits for five turns." - }, - "meFirst": { - name: "Me First", - effect: "The user cuts ahead of the target to copy and use the target's intended move with greater power. This move fails if it isn't used first." - }, - "copycat": { - name: "Copycat", - effect: "The user mimics the move used immediately before it. The move fails if no other move has been used yet." - }, - "powerSwap": { - name: "Power Swap", - effect: "The user employs its psychic power to switch changes to its Attack and Sp. Atk stats with the target." - }, - "guardSwap": { - name: "Guard Swap", - effect: "The user employs its psychic power to switch changes to its Defense and Sp. Def stats with the target." - }, - "punishment": { - name: "Punishment", - effect: "The more the target has powered up with stat changes, the greater the move's power." - }, - "lastResort": { - name: "Last Resort", - effect: "This move can be used only after the user has used all the other moves it knows in the battle." - }, - "worrySeed": { - name: "Worry Seed", - effect: "A seed that causes worry is planted on the target. It prevents sleep by making the target's Ability Insomnia." - }, - "suckerPunch": { - name: "Sucker Punch", - effect: "This move enables the user to attack first. This move fails if the target is not readying an attack." - }, - "toxicSpikes": { - name: "Toxic Spikes", - effect: "The user lays a trap of poison spikes at the feet of the opposing team. The spikes will poison opposing Pokémon that switch into battle." - }, - "heartSwap": { - name: "Heart Swap", - effect: "The user employs its psychic power to switch stat changes with the target." - }, - "aquaRing": { - name: "Aqua Ring", - effect: "The user envelops itself in a veil made of water. It regains some HP every turn." - }, - "magnetRise": { - name: "Magnet Rise", - effect: "The user levitates using electrically generated magnetism for five turns." - }, - "flareBlitz": { - name: "Flare Blitz", - effect: "The user cloaks itself in fire and charges the target. This also damages the user quite a lot. This attack may leave the target with a burn." - }, - "forcePalm": { - name: "Force Palm", - effect: "The target is attacked with a shock wave. This may also leave the target with paralysis." - }, - "auraSphere": { - name: "Aura Sphere", - effect: "The user lets loose a blast of aura power from deep within its body at the target. This attack never misses." - }, - "rockPolish": { - name: "Rock Polish", - effect: "The user polishes its body to reduce drag. This sharply raises the Speed stat." - }, - "poisonJab": { - name: "Poison Jab", - effect: "The target is stabbed with a tentacle, arm, or the like steeped in poison. This may also poison the target." - }, - "darkPulse": { - name: "Dark Pulse", - effect: "The user releases a horrible aura imbued with dark thoughts. This may also make the target flinch." - }, - "nightSlash": { - name: "Night Slash", - effect: "The user slashes the target the instant an opportunity arises. Critical hits land more easily." - }, - "aquaTail": { - name: "Aqua Tail", - effect: "The user attacks by swinging its tail as if it were a vicious wave in a raging storm." - }, - "seedBomb": { - name: "Seed Bomb", - effect: "The user slams a barrage of hard-shelled seeds down on the target from above." - }, - "airSlash": { - name: "Air Slash", - effect: "The user attacks with a blade of air that slices even the sky. This may also make the target flinch." - }, - "xScissor": { - name: "X-Scissor", - effect: "The user slashes at the target by crossing its scythes or claws as if they were a pair of scissors." - }, - "bugBuzz": { - name: "Bug Buzz", - effect: "The user generates a damaging sound wave by vibration. This may also lower the target's Sp. Def stat." - }, - "dragonPulse": { - name: "Dragon Pulse", - effect: "The target is attacked with a shock wave generated by the user's gaping mouth." - }, - "dragonRush": { - name: "Dragon Rush", - effect: "The user tackles the target while exhibiting overwhelming menace. This may also make the target flinch." - }, - "powerGem": { - name: "Power Gem", - effect: "The user attacks with a ray of light that sparkles as if it were made of gemstones." - }, - "drainPunch": { - name: "Drain Punch", - effect: "An energy-draining punch. The user's HP is restored by half the damage taken by the target." - }, - "vacuumWave": { - name: "Vacuum Wave", - effect: "The user whirls its fists to send a wave of pure vacuum at the target. This move always goes first." - }, - "focusBlast": { - name: "Focus Blast", - effect: "The user heightens its mental focus and unleashes its power. This may also lower the target's Sp. Def stat." - }, - "energyBall": { - name: "Energy Ball", - effect: "The user draws power from nature and fires it at the target. This may also lower the target's Sp. Def stat." - }, - "braveBird": { - name: "Brave Bird", - effect: "The user tucks in its wings and charges from a low altitude. This also damages the user quite a lot." - }, - "earthPower": { - name: "Earth Power", - effect: "The user makes the ground under the target erupt with power. This may also lower the target's Sp. Def stat." - }, - "switcheroo": { - name: "Switcheroo", - effect: "The user trades held items with the target faster than the eye can follow." - }, - "gigaImpact": { - name: "Giga Impact", - effect: "The user charges at the target using every bit of its power. The user can't move on the next turn." - }, - "nastyPlot": { - name: "Nasty Plot", - effect: "The user stimulates its brain by thinking bad thoughts. This sharply raises the user's Sp. Atk stat." - }, - "bulletPunch": { - name: "Bullet Punch", - effect: "The user strikes the target with tough punches as fast as bullets. This move always goes first." - }, - "avalanche": { - name: "Avalanche", - effect: "The power of this attack move is doubled if the user has been hurt by the target in the same turn." - }, - "iceShard": { - name: "Ice Shard", - effect: "The user flash-freezes chunks of ice and hurls them at the target. This move always goes first." - }, - "shadowClaw": { - name: "Shadow Claw", - effect: "The user slashes with a sharp claw made from shadows. Critical hits land more easily." - }, - "thunderFang": { - name: "Thunder Fang", - effect: "The user bites with electrified fangs. This may also make the target flinch or leave it with paralysis." - }, - "iceFang": { - name: "Ice Fang", - effect: "The user bites with cold-infused fangs. This may also make the target flinch or leave it frozen." - }, - "fireFang": { - name: "Fire Fang", - effect: "The user bites with flame-cloaked fangs. This may also make the target flinch or leave it with a burn." - }, - "shadowSneak": { - name: "Shadow Sneak", - effect: "The user extends its shadow and attacks the target from behind. This move always goes first." - }, - "mudBomb": { - name: "Mud Bomb", - effect: "The user launches a hard-packed mud ball to attack. This may also lower the target's accuracy." - }, - "psychoCut": { - name: "Psycho Cut", - effect: "The user tears at the target with blades formed by psychic power. Critical hits land more easily." - }, - "zenHeadbutt": { - name: "Zen Headbutt", - effect: "The user focuses its willpower to its head and attacks the target. This may also make the target flinch." - }, - "mirrorShot": { - name: "Mirror Shot", - effect: "The user lets loose a flash of energy at the target from its polished body. This may also lower the target's accuracy." - }, - "flashCannon": { - name: "Flash Cannon", - effect: "The user gathers all its light energy and releases it all at once. This may also lower the target's Sp. Def stat." - }, - "rockClimb": { - name: "Rock Climb", - effect: "The user attacks the target by smashing into it with incredible force. This may also confuse the target." - }, - "defog": { - name: "Defog", - effect: "A strong wind blows away the target's barriers such as Reflect or Light Screen. This also lowers the target's evasiveness." - }, - "trickRoom": { - name: "Trick Room", - effect: "The user creates a bizarre area in which slower Pokémon get to move first for five turns." - }, - "dracoMeteor": { - name: "Draco Meteor", - effect: "Comets are summoned down from the sky onto the target. The attack's recoil harshly lowers the user's Sp. Atk stat." - }, - "discharge": { - name: "Discharge", - effect: "The user strikes everything around it by letting loose a flare of electricity. This may also cause paralysis." - }, - "lavaPlume": { - name: "Lava Plume", - effect: "The user torches everything around it in an inferno of scarlet flames. This may also leave those it hits with a burn." - }, - "leafStorm": { - name: "Leaf Storm", - effect: "The user whips up a storm of leaves around the target. The attack's recoil harshly lowers the user's Sp. Atk stat." - }, - "powerWhip": { - name: "Power Whip", - effect: "The user violently whirls its vines, tentacles, or the like to harshly lash the target." - }, - "rockWrecker": { - name: "Rock Wrecker", - effect: "The user launches a huge boulder at the target to attack. The user can't move on the next turn." - }, - "crossPoison": { - name: "Cross Poison", - effect: "A slashing attack with a poisonous blade that may also poison the target. Critical hits land more easily." - }, - "gunkShot": { - name: "Gunk Shot", - effect: "The user shoots filthy garbage at the target to attack. This may also poison the target." - }, - "ironHead": { - name: "Iron Head", - effect: "The user slams the target with its steel-hard head. This may also make the target flinch." - }, - "magnetBomb": { - name: "Magnet Bomb", - effect: "The user launches steel bombs that stick to the target. This attack never misses." - }, - "stoneEdge": { - name: "Stone Edge", - effect: "The user stabs the target from below with sharpened stones. Critical hits land more easily." - }, - "captivate": { - name: "Captivate", - effect: "If any opposing Pokémon is the opposite gender of the user, it is charmed, which harshly lowers its Sp. Atk stat." - }, - "stealthRock": { - name: "Stealth Rock", - effect: "The user lays a trap of levitating stones around the opposing team. The trap hurts opposing Pokémon that switch into battle." - }, - "grassKnot": { - name: "Grass Knot", - effect: "The user snares the target with grass and trips it. The heavier the target, the greater the move's power." - }, - "chatter": { - name: "Chatter", - effect: "The user attacks the target with sound waves of deafening chatter. This confuses the target." - }, - "judgment": { - name: "Judgment", - effect: "The user releases countless shots of light at the target. This move's type varies depending on the kind of Plate the user is holding." - }, - "bugBite": { - name: "Bug Bite", - effect: "The user bites the target. If the target is holding a Berry, the user eats it and gains its effect." - }, - "chargeBeam": { - name: "Charge Beam", - effect: "The user attacks the target with an electric charge. The user may use any remaining electricity to raise its Sp. Atk stat." - }, - "woodHammer": { - name: "Wood Hammer", - effect: "The user slams its rugged body into the target to attack. This also damages the user quite a lot." - }, - "aquaJet": { - name: "Aqua Jet", - effect: "The user lunges at the target at a speed that makes it almost invisible. This move always goes first." - }, - "attackOrder": { - name: "Attack Order", - effect: "The user calls out its underlings to pummel the target. Critical hits land more easily." - }, - "defendOrder": { - name: "Defend Order", - effect: "The user calls out its underlings to shield its body, raising its Defense and Sp. Def stats." - }, - "healOrder": { - name: "Heal Order", - effect: "The user calls out its underlings to heal it. The user regains up to half of its max HP." - }, - "headSmash": { - name: "Head Smash", - effect: "The user attacks the target with a hazardous, full-power headbutt. This also damages the user terribly." - }, - "doubleHit": { - name: "Double Hit", - effect: "The user slams the target with a long tail, vines, or a tentacle. The target is hit twice in a row." - }, - "roarOfTime": { - name: "Roar of Time", - effect: "The user blasts the target with power that distorts even time. The user can't move on the next turn." - }, - "spacialRend": { - name: "Spacial Rend", - effect: "The user tears the target along with the space around it. Critical hits land more easily." - }, - "lunarDance": { - name: "Lunar Dance", - effect: "The user faints. In return, the Pokémon taking its place will have its status and HP fully restored." - }, - "crushGrip": { - name: "Crush Grip", - effect: "The target is crushed with great force. The more HP the target has left, the greater this move's power." - }, - "magmaStorm": { - name: "Magma Storm", - effect: "The target becomes trapped within a maelstrom of fire that rages for four to five turns." - }, - "darkVoid": { - name: "Dark Void", - effect: "Opposing Pokémon are dragged into a world of total darkness that makes them sleep." - }, - "seedFlare": { - name: "Seed Flare", - effect: "The user emits a shock wave from its body to attack its target. This may also harshly lower the target's Sp. Def stat." - }, - "ominousWind": { - name: "Ominous Wind", - effect: "The user blasts the target with a gust of repulsive wind. This may also raise all the user's stats at once." - }, - "shadowForce": { - name: "Shadow Force", - effect: "The user disappears, then strikes the target on the next turn. This move hits even if the target protects itself." - }, - "honeClaws": { - name: "Hone Claws", - effect: "The user sharpens its claws to boost its Attack stat and accuracy." - }, - "wideGuard": { - name: "Wide Guard", - effect: "The user and its allies are protected from wide-ranging attacks for one turn." - }, - "guardSplit": { - name: "Guard Split", - effect: "The user employs its psychic power to average its Defense and Sp. Def stats with those of the target." - }, - "powerSplit": { - name: "Power Split", - effect: "The user employs its psychic power to average its Attack and Sp. Atk stats with those of the target." - }, - "wonderRoom": { - name: "Wonder Room", - effect: "The user creates a bizarre area in which Pokémon's Defense and Sp. Def stats are swapped for five turns." - }, - "psyshock": { - name: "Psyshock", - effect: "The user materializes an odd psychic wave to attack the target. This attack does physical damage." - }, - "venoshock": { - name: "Venoshock", - effect: "The user drenches the target in a special poisonous liquid. This move's power is doubled if the target is poisoned." - }, - "autotomize": { - name: "Autotomize", - effect: "The user sheds part of its body to make itself lighter and sharply raise its Speed stat." - }, - "ragePowder": { - name: "Rage Powder", - effect: "The user scatters a cloud of irritating powder to draw attention to itself. Opposing Pokémon aim only at the user." - }, - "telekinesis": { - name: "Telekinesis", - effect: "The user makes the target float with its psychic power. The target is easier to hit for three turns." - }, - "magicRoom": { - name: "Magic Room", - effect: "The user creates a bizarre area in which Pokémon's held items lose their effects for five turns." - }, - "smackDown": { - name: "Smack Down", - effect: "The user throws a stone or similar projectile to attack the target. A flying Pokémon will fall to the ground when it's hit." - }, - "stormThrow": { - name: "Storm Throw", - effect: "The user strikes the target with a fierce blow. This attack always results in a critical hit." - }, - "flameBurst": { - name: "Flame Burst", - effect: "The user attacks the target with a bursting flame. The bursting flame damages Pokémon next to the target as well." - }, - "sludgeWave": { - name: "Sludge Wave", - effect: "The user strikes everything around it by swamping the area with a giant sludge wave. This may also poison those hit." - }, - "quiverDance": { - name: "Quiver Dance", - effect: "The user lightly performs a beautiful, mystic dance. This boosts the user's Sp. Atk, Sp. Def, and Speed stats." - }, - "heavySlam": { - name: "Heavy Slam", - effect: "The user slams into the target with its heavy body. The more the user outweighs the target, the greater the move's power." - }, - "synchronoise": { - name: "Synchronoise", - effect: "Using an odd shock wave, the user inflicts damage on any Pokémon of the same type in the area around it." - }, - "electroBall": { - name: "Electro Ball", - effect: "The user hurls an electric orb at the target. The faster the user is than the target, the greater the move's power." - }, - "soak": { - name: "Soak", - effect: "The user shoots a torrent of water at the target and changes the target's type to Water." - }, - "flameCharge": { - name: "Flame Charge", - effect: "Cloaking itself in flame, the user attacks the target. Then, building up more power, the user raises its Speed stat." - }, - "coil": { - name: "Coil", - effect: "The user coils up and concentrates. This raises its Attack and Defense stats as well as its accuracy." - }, - "lowSweep": { - name: "Low Sweep", - effect: "The user makes a swift attack on the target's legs, which lowers the target's Speed stat." - }, - "acidSpray": { - name: "Acid Spray", - effect: "The user spits fluid that works to melt the target. This harshly lowers the target's Sp. Def stat." - }, - "foulPlay": { - name: "Foul Play", - effect: "The user turns the target's power against it. The higher the target's Attack stat, the greater the damage it deals." - }, - "simpleBeam": { - name: "Simple Beam", - effect: "The user's mysterious psychic wave changes the target's Ability to Simple." - }, - "entrainment": { - name: "Entrainment", - effect: "The user dances with an odd rhythm that compels the target to mimic it, making the target's Ability the same as the user's." - }, - "afterYou": { - name: "After You", - effect: "The user helps the target and makes it use its move right after the user." - }, - "round": { - name: "Round", - effect: "The user attacks the target with a song. Others can join in the Round to increase the power of the attack." - }, - "echoedVoice": { - name: "Echoed Voice", - effect: "The user attacks the target with an echoing voice. If this move is used every turn, its power is increased." - }, - "chipAway": { - name: "Chip Away", - effect: "Looking for an opening, the user strikes consistently. The target's stat changes don't affect this attack's damage." - }, - "clearSmog": { - name: "Clear Smog", - effect: "The user attacks the target by throwing a clump of special mud. All stat changes are returned to normal." - }, - "storedPower": { - name: "Stored Power", - effect: "The user attacks the target with stored power. The more the user's stats are raised, the greater the move's power." - }, - "quickGuard": { - name: "Quick Guard", - effect: "The user protects itself and its allies from priority moves." - }, - "allySwitch": { - name: "Ally Switch", - effect: "The user teleports using a strange power and switches places with one of its allies." - }, - "scald": { - name: "Scald", - effect: "The user shoots boiling hot water at its target. This may also leave the target with a burn." - }, - "shellSmash": { - name: "Shell Smash", - effect: "The user breaks its shell, which lowers Defense and Sp. Def stats but sharply raises its Attack, Sp. Atk, and Speed stats." - }, - "healPulse": { - name: "Heal Pulse", - effect: "The user emits a healing pulse that restores the target's HP by up to half of its max HP." - }, - "hex": { - name: "Hex", - effect: "This relentless attack does massive damage to a target affected by status conditions." - }, - "skyDrop": { - name: "Sky Drop", - effect: "The user takes the target into the sky, then drops it during the next turn. The target cannot attack while in the sky." - }, - "shiftGear": { - name: "Shift Gear", - effect: "The user rotates its gears, raising its Attack stat and sharply raising its Speed stat." - }, - "circleThrow": { - name: "Circle Throw", - effect: "The target is thrown, and a different Pokémon is dragged out. In the wild, this ends a battle against a single Pokémon." - }, - "incinerate": { - name: "Incinerate", - effect: "The user attacks opposing Pokémon with fire. If a Pokémon is holding a certain item, such as a Berry, the item becomes burned up and unusable." - }, - "quash": { - name: "Quash", - effect: "The user suppresses the target and makes its move go last." - }, - "acrobatics": { - name: "Acrobatics", - effect: "The user nimbly strikes the target. The fewer held items, the higher the damage it inflicts." - }, - "reflectType": { - name: "Reflect Type", - effect: "The user reflects the target's type, making the user the same type as the target." - }, - "retaliate": { - name: "Retaliate", - effect: "The user gets revenge for a fainted ally. If an ally fainted in the previous turn, this move's power is increased." - }, - "finalGambit": { - name: "Final Gambit", - effect: "The user risks everything to attack its target. The user faints but does damage equal to its HP." - }, - "bestow": { - name: "Bestow", - effect: "The user passes its held item to the target when the target isn't holding an item." - }, - "inferno": { - name: "Inferno", - effect: "The user attacks by engulfing the target in an intense fire. This leaves the target with a burn." - }, - "waterPledge": { - name: "Water Pledge", - effect: "A column of water hits the target. When used with its fire equivalent, its power increases and a rainbow appears." - }, - "firePledge": { - name: "Fire Pledge", - effect: "A column of fire hits the target. When used with its grass equivalent, its power increases and a vast sea of fire appears." - }, - "grassPledge": { - name: "Grass Pledge", - effect: "A column of grass hits the target. When used with its water equivalent, its power increases and a vast swamp appears." - }, - "voltSwitch": { - name: "Volt Switch", - effect: "After making its attack, the user rushes back to switch places with a party Pokémon in waiting." - }, - "struggleBug": { - name: "Struggle Bug", - effect: "While resisting, the user attacks opposing Pokémon. This lowers the Sp. Atk stats of those hit." - }, - "bulldoze": { - name: "Bulldoze", - effect: "The user strikes everything around it by stomping down on the ground. This lowers the Speed stats of those hit." - }, - "frostBreath": { - name: "Frost Breath", - effect: "The user blows its cold breath on the target. This attack always results in a critical hit." - }, - "dragonTail": { - name: "Dragon Tail", - effect: "The target is knocked away, and a different Pokémon is dragged out. In the wild, this ends a battle against a single Pokémon." - }, - "workUp": { - name: "Work Up", - effect: "The user is roused, and its Attack and Sp. Atk stats increase." - }, - "electroweb": { - name: "Electroweb", - effect: "The user attacks and captures opposing Pokémon using an electric net. This lowers their Speed stats." - }, - "wildCharge": { - name: "Wild Charge", - effect: "The user shrouds itself in electricity and smashes into its target. This also damages the user a little." - }, - "drillRun": { - name: "Drill Run", - effect: "The user crashes into its target while rotating its body like a drill. Critical hits land more easily." - }, - "dualChop": { - name: "Dual Chop", - effect: "The user attacks its target by hitting it with brutal strikes. The target is hit twice in a row." - }, - "heartStamp": { - name: "Heart Stamp", - effect: "The user unleashes a vicious blow after its cute act makes the target less wary. This may also make the target flinch." - }, - "hornLeech": { - name: "Horn Leech", - effect: "The user drains the target's energy with its horns. The user's HP is restored by half the damage taken by the target." - }, - "sacredSword": { - name: "Sacred Sword", - effect: "The user attacks by slicing with a long horn. The target's stat changes don't affect this attack's damage." - }, - "razorShell": { - name: "Razor Shell", - effect: "The user cuts its target with sharp shells. This may also lower the target's Defense stat." - }, - "heatCrash": { - name: "Heat Crash", - effect: "The user slams its target with its flame-covered body. The more the user outweighs the target, the greater the move's power." - }, - "leafTornado": { - name: "Leaf Tornado", - effect: "The user attacks its target by encircling it in sharp leaves. This attack may also lower the target's accuracy." - }, - "steamroller": { - name: "Steamroller", - effect: "The user crushes its target by rolling over the target with its rolled-up body. This may also make the target flinch." - }, - "cottonGuard": { - name: "Cotton Guard", - effect: "The user protects itself by wrapping its body in soft cotton, which drastically raises the user's Defense stat." - }, - "nightDaze": { - name: "Night Daze", - effect: "The user lets loose a pitch-black shock wave at its target. This may also lower the target's accuracy." - }, - "psystrike": { - name: "Psystrike", - effect: "The user materializes an odd psychic wave to attack the target. This attack does physical damage." - }, - "tailSlap": { - name: "Tail Slap", - effect: "The user attacks by striking the target with its hard tail. It hits the target two to five times in a row." - }, - "hurricane": { - name: "Hurricane", - effect: "The user attacks by wrapping its opponent in a fierce wind that flies up into the sky. This may also confuse the target." - }, - "headCharge": { - name: "Head Charge", - effect: "The user charges its head into its target, using its powerful guard hair. This also damages the user a little." - }, - "gearGrind": { - name: "Gear Grind", - effect: "The user attacks by throwing steel gears at its target twice." - }, - "searingShot": { - name: "Searing Shot", - effect: "The user torches everything around it in an inferno of scarlet flames. This may also leave those it hits with a burn." - }, - "technoBlast": { - name: "Techno Blast", - effect: "The user fires a beam of light at its target. The move's type changes depending on the Drive the user holds." - }, - "relicSong": { - name: "Relic Song", - effect: "The user sings an ancient song and attacks by appealing to the hearts of the listening opposing Pokémon. This may also induce sleep." - }, - "secretSword": { - name: "Secret Sword", - effect: "The user cuts with its long horn. The odd power contained in the horn does physical damage to the target." - }, - "glaciate": { - name: "Glaciate", - effect: "The user attacks by blowing freezing cold air at opposing Pokémon. This lowers their Speed stats." - }, - "boltStrike": { - name: "Bolt Strike", - effect: "The user surrounds itself with a great amount of electricity and charges its target. This may also leave the target with paralysis." - }, - "blueFlare": { - name: "Blue Flare", - effect: "The user attacks by engulfing the target in an intense, yet beautiful, blue flame. This may also leave the target with a burn." - }, - "fieryDance": { - name: "Fiery Dance", - effect: "Cloaked in flames, the user attacks the target by dancing and flapping its wings. This may also raise the user's Sp. Atk stat." - }, - "freezeShock": { - name: "Freeze Shock", - effect: "On the second turn, the user hits the target with electrically charged ice. This may also leave the target with paralysis." - }, - "iceBurn": { - name: "Ice Burn", - effect: "On the second turn, an ultracold, freezing wind surrounds the target. This may leave the target with a burn." - }, - "snarl": { - name: "Snarl", - effect: "The user yells as if it's ranting about something, which lowers the Sp. Atk stats of opposing Pokémon." - }, - "icicleCrash": { - name: "Icicle Crash", - effect: "The user attacks by harshly dropping large icicles onto the target. This may also make the target flinch." - }, - "vCreate": { - name: "V-create", - effect: "With a hot flame on its forehead, the user hurls itself at its target. This lowers the user's Defense, Sp. Def, and Speed stats." - }, - "fusionFlare": { - name: "Fusion Flare", - effect: "The user brings down a giant flame. This move's power is increased when influenced by an enormous lightning bolt." - }, - "fusionBolt": { - name: "Fusion Bolt", - effect: "The user throws down a giant lightning bolt. This move's power is increased when influenced by an enormous flame." - }, - "flyingPress": { - name: "Flying Press", - effect: "The user dives down onto the target from the sky. This move is Fighting and Flying type simultaneously." - }, - "matBlock": { - name: "Mat Block", - effect: "Using a pulled-up mat as a shield, the user protects itself and its allies from damaging moves. This does not stop status moves." - }, - "belch": { - name: "Belch", - effect: "The user lets out a damaging belch at the target. The user must eat a held Berry to use this move." - }, - "rototiller": { - name: "Rototiller", - effect: "Tilling the soil, the user makes it easier for plants to grow. This raises the Attack and Sp. Atk stats of Grass-type Pokémon." - }, - "stickyWeb": { - name: "Sticky Web", - effect: "The user weaves a sticky net around the opposing team, which lowers their Speed stats upon switching into battle." - }, - "fellStinger": { - name: "Fell Stinger", - effect: "When the user knocks out a target with this move, the user's Attack stat rises drastically." - }, - "phantomForce": { - name: "Phantom Force", - effect: "The user vanishes somewhere, then strikes the target on the next turn. This move hits even if the target protects itself." - }, - "trickOrTreat": { - name: "Trick-or-Treat", - effect: "The user takes the target trick-or-treating. This adds Ghost type to the target's type." - }, - "nobleRoar": { - name: "Noble Roar", - effect: "Letting out a noble roar, the user intimidates the target and lowers its Attack and Sp. Atk stats." - }, - "ionDeluge": { - name: "Ion Deluge", - effect: "The user disperses electrically charged particles, which changes Normal-type moves to Electric-type moves." - }, - "parabolicCharge": { - name: "Parabolic Charge", - effect: "The user attacks everything around it. The user's HP is restored by half the damage taken by those hit." - }, - "forestsCurse": { - name: "Forest's Curse", - effect: "The user puts a forest curse on the target. The target is now Grass type as well." - }, - "petalBlizzard": { - name: "Petal Blizzard", - effect: "The user stirs up a violent petal blizzard and attacks everything around it." - }, - "freezeDry": { - name: "Freeze-Dry", - effect: "The user rapidly cools the target. This may also leave the target frozen. This move is super effective on Water types." - }, - "disarmingVoice": { - name: "Disarming Voice", - effect: "Letting out a charming cry, the user does emotional damage to opposing Pokémon. This attack never misses." - }, - "partingShot": { - name: "Parting Shot", - effect: "With a parting threat, the user lowers the target's Attack and Sp. Atk stats. Then it switches with a party Pokémon." - }, - "topsyTurvy": { - name: "Topsy-Turvy", - effect: "All stat changes affecting the target turn topsy-turvy and become the opposite of what they were." - }, - "drainingKiss": { - name: "Draining Kiss", - effect: "The user steals the target's HP with a kiss. The user's HP is restored by over half of the damage taken by the target." - }, - "craftyShield": { - name: "Crafty Shield", - effect: "The user protects itself and its allies from status moves with a mysterious power. This does not stop moves that do damage." - }, - "flowerShield": { - name: "Flower Shield", - effect: "The user raises the Defense stats of all Grass-type Pokémon in battle with a mysterious power." - }, - "grassyTerrain": { - name: "Grassy Terrain", - effect: "The user turns the ground to grass for five turns. This restores the HP of Pokémon on the ground a little every turn and powers up Grass-type moves." - }, - "mistyTerrain": { - name: "Misty Terrain", - effect: "This protects Pokémon on the ground from status conditions and halves damage from Dragon-type moves for five turns." - }, - "electrify": { - name: "Electrify", - effect: "If the target is electrified before it uses a move during that turn, the target's move becomes Electric type." - }, - "playRough": { - name: "Play Rough", - effect: "The user plays rough with the target and attacks it. This may also lower the target's Attack stat." - }, - "fairyWind": { - name: "Fairy Wind", - effect: "The user stirs up a fairy wind and strikes the target with it." - }, - "moonblast": { - name: "Moonblast", - effect: "Borrowing the power of the moon, the user attacks the target. This may also lower the target's Sp. Atk stat." - }, - "boomburst": { - name: "Boomburst", - effect: "The user attacks everything around it with the destructive power of a terrible, explosive sound." - }, - "fairyLock": { - name: "Fairy Lock", - effect: "By locking down the battlefield, the user keeps all Pokémon from fleeing during the next turn." - }, - "kingsShield": { - name: "King's Shield", - effect: "The user takes a defensive stance while it protects itself from damage. It also lowers the Attack stat of any attacker that makes direct contact." - }, - "playNice": { - name: "Play Nice", - effect: "The user and the target become friends, and the target loses its will to fight. This lowers the target's Attack stat." - }, - "confide": { - name: "Confide", - effect: "The user tells the target a secret, and the target loses its ability to concentrate. This lowers the target's Sp. Atk stat." - }, - "diamondStorm": { - name: "Diamond Storm", - effect: "The user whips up a storm of diamonds to damage opposing Pokémon. This may also sharply raise the user's Defense stat." - }, - "steamEruption": { - name: "Steam Eruption", - effect: "The user immerses the target in superheated steam. This may also leave the target with a burn." - }, - "hyperspaceHole": { - name: "Hyperspace Hole", - effect: "Using a hyperspace hole, the user appears right next to the target and strikes. This also hits a target using a move such as Protect or Detect." - }, - "waterShuriken": { - name: "Water Shuriken", - effect: "The user hits the target with throwing stars two to five times in a row. This move always goes first." - }, - "mysticalFire": { - name: "Mystical Fire", - effect: "The user attacks by breathing a special, hot fire. This also lowers the target's Sp. Atk stat." - }, - "spikyShield": { - name: "Spiky Shield", - effect: "In addition to protecting the user from attacks, this move also damages any attacker that makes direct contact." - }, - "aromaticMist": { - name: "Aromatic Mist", - effect: "The user raises the Sp. Def stat of an ally Pokémon by using a mysterious aroma." - }, - "eerieImpulse": { - name: "Eerie Impulse", - effect: "The user's body generates an eerie impulse. Exposing the target to it harshly lowers the target's Sp. Atk stat." - }, - "venomDrench": { - name: "Venom Drench", - effect: "Opposing Pokémon are drenched in an odd poisonous liquid. This lowers the Attack, Sp. Atk, and Speed stats of a poisoned target." - }, - "powder": { - name: "Powder", - effect: "The user covers the target in a combustible powder. If the target uses a Fire-type move, the powder explodes and damages the target." - }, - "geomancy": { - name: "Geomancy", - effect: "The user absorbs energy and sharply raises its Sp. Atk, Sp. Def, and Speed stats on the next turn." - }, - "magneticFlux": { - name: "Magnetic Flux", - effect: "The user manipulates magnetic fields, which raises the Defense and Sp. Def stats of ally Pokémon with the Plus or Minus Ability." - }, - "happyHour": { - name: "Happy Hour", - effect: "Using Happy Hour doubles the amount of prize money received after battle." - }, - "electricTerrain": { - name: "Electric Terrain", - effect: "The user electrifies the ground for five turns, powering up Electric-type moves. Pokémon on the ground no longer fall asleep." - }, - "dazzlingGleam": { - name: "Dazzling Gleam", - effect: "The user damages opposing Pokémon by emitting a powerful flash." - }, - "celebrate": { - name: "Celebrate", - effect: "The Pokémon congratulates you on your special day!" - }, - "holdHands": { - name: "Hold Hands", - effect: "The user and an ally hold hands. This makes them very happy." - }, - "babyDollEyes": { - name: "Baby-Doll Eyes", - effect: "The user stares at the target with its baby-doll eyes, which lowers the target's Attack stat. This move always goes first." - }, - "nuzzle": { - name: "Nuzzle", - effect: "The user attacks by nuzzling its electrified cheeks against the target. This also leaves the target with paralysis." - }, - "holdBack": { - name: "Hold Back", - effect: "The user holds back when it attacks, and the target is left with at least 1 HP." - }, - "infestation": { - name: "Infestation", - effect: "The target is infested and attacked for four to five turns. The target can't flee during this time." - }, - "powerUpPunch": { - name: "Power-Up Punch", - effect: "Striking opponents over and over makes the user's fists harder. Hitting a target raises the Attack stat." - }, - "oblivionWing": { - name: "Oblivion Wing", - effect: "The user absorbs its target's HP. The user's HP is restored by over half of the damage taken by the target." - }, - "thousandArrows": { - name: "Thousand Arrows", - effect: "This move also hits opposing Pokémon that are in the air. Those Pokémon are knocked down to the ground." - }, - "thousandWaves": { - name: "Thousand Waves", - effect: "The user attacks with a wave that crawls along the ground. Those it hits can't flee from battle." - }, - "landsWrath": { - name: "Land's Wrath", - effect: "The user gathers the energy of the land and focuses that power on opposing Pokémon to damage them." - }, - "lightOfRuin": { - name: "Light of Ruin", - effect: "Drawing power from the Eternal Flower, the user fires a powerful beam of light. This also damages the user quite a lot." - }, - "originPulse": { - name: "Origin Pulse", - effect: "The user attacks opposing Pokémon with countless beams of light that glow a deep and brilliant blue." - }, - "precipiceBlades": { - name: "Precipice Blades", - effect: "The user attacks opposing Pokémon by manifesting the power of the land in fearsome blades of stone." - }, - "dragonAscent": { - name: "Dragon Ascent", - effect: "After soaring upward, the user attacks its target by dropping out of the sky at high speeds. But it lowers its own Defense and Sp. Def stats in the process." - }, - "hyperspaceFury": { - name: "Hyperspace Fury", - effect: "Using its many arms, the user unleashes a barrage of attacks that ignore the effects of moves like Protect and Detect. But the user's Defense stat falls." - }, - "breakneckBlitzPhysical": { - name: "Breakneck Blitz", - effect: "The user builds up its momentum using its Z-Power and crashes into the target at full speed. The power varies, depending on the original move." - }, - "breakneckBlitzSpecial": { - name: "Breakneck Blitz", - effect: "Dummy Data" - }, - "allOutPummelingPhysical": { - name: "All-Out Pummeling", - effect: "The user rams an energy orb created by its Z-Power into the target with full force. The power varies, depending on the original move." - }, - "allOutPummelingSpecial": { - name: "All-Out Pummeling", - effect: "Dummy Data" - }, - "supersonicSkystrikePhysical": { - name: "Supersonic Skystrike", - effect: "The user soars up with its Z-Power and plummets toward the target at full speed. The power varies, depending on the original move." - }, - "supersonicSkystrikeSpecial": { - name: "Supersonic Skystrike", - effect: "Dummy Data" - }, - "acidDownpourPhysical": { - name: "Acid Downpour", - effect: "The user creates a poisonous swamp using its Z-Power and sinks the target into it at full force. The power varies, depending on the original move." - }, - "acidDownpourSpecial": { - name: "Acid Downpour", - effect: "Dummy Data" - }, - "tectonicRagePhysical": { - name: "Tectonic Rage", - effect: "The user burrows deep into the ground and slams into the target with the full force of its Z-Power. The power varies, depending on the original move." - }, - "tectonicRageSpecial": { - name: "Tectonic Rage", - effect: "Dummy Data" - }, - "continentalCrushPhysical": { - name: "Continental Crush", - effect: "The user summons a huge rock mountain using its Z-Power and drops it onto the target with full force. The power varies, depending on the original move." - }, - "continentalCrushSpecial": { - name: "Continental Crush", - effect: "Dummy Data" - }, - "savageSpinOutPhysical": { - name: "Savage Spin-Out", - effect: "The user binds the target with full force with threads of silk that the user spits using its Z-Power. The power varies, depending on the original move." - }, - "savageSpinOutSpecial": { - name: "Savage Spin-Out", - effect: "Dummy Data" - }, - "neverEndingNightmarePhysical": { - name: "Never-Ending Nightmare", - effect: "Deep-seated grudges summoned by the user's Z-Power trap the target. The power varies, depending on the original move." - }, - "neverEndingNightmareSpecial": { - name: "Never-Ending Nightmare", - effect: "Dummy Data" - }, - "corkscrewCrashPhysical": { - name: "Corkscrew Crash", - effect: "The user spins very fast and rams into the target with the full force of its Z-Power. The power varies, depending on the original move." - }, - "corkscrewCrashSpecial": { - name: "Corkscrew Crash", - effect: "Dummy Data" - }, - "infernoOverdrivePhysical": { - name: "Inferno Overdrive", - effect: "The user breathes a stream of intense fire toward the target with the full force of its Z-Power. The power varies depending on the original move." - }, - "infernoOverdriveSpecial": { - name: "Inferno Overdrive", - effect: "Dummy Data" - }, - "hydroVortexPhysical": { - name: "Hydro Vortex", - effect: "The user creates a huge whirling current using its Z-Power to swallow the target with full force. The power varies, depending on the original move." - }, - "hydroVortexSpecial": { - name: "Hydro Vortex", - effect: "Dummy Data" - }, - "bloomDoomPhysical": { - name: "Bloom Doom", - effect: "The user collects energy from plants using its Z-Power and attacks the target with full force. The power varies, depending on the original move." - }, - "bloomDoomSpecial": { - name: "Bloom Doom", - effect: "Dummy Data" - }, - "gigavoltHavocPhysical": { - name: "Gigavolt Havoc", - effect: "The user hits the target with a powerful electric current collected by its Z-Power. The power varies, depending on the original move." - }, - "gigavoltHavocSpecial": { - name: "Gigavolt Havoc", - effect: "Dummy Data" - }, - "shatteredPsychePhysical": { - name: "Shattered Psyche", - effect: "The user controls the target with its Z-Power and hurts the target with full force. The power varies, depending on the original move." - }, - "shatteredPsycheSpecial": { - name: "Shattered Psyche", - effect: "Dummy Data" - }, - "subzeroSlammerPhysical": { - name: "Subzero Slammer", - effect: "The user dramatically drops the temperature using its Z-Power and freezes the target with full force. The power varies, depending on the original move." - }, - "subzeroSlammerSpecial": { - name: "Subzero Slammer", - effect: "Dummy Data" - }, - "devastatingDrakePhysical": { - name: "Devastating Drake", - effect: "The user materializes its aura using its Z-Power and attacks the target with full force. The power varies, depending on the original move." - }, - "devastatingDrakeSpecial": { - name: "Devastating Drake", - effect: "Dummy Data" - }, - "blackHoleEclipsePhysical": { - name: "Black Hole Eclipse", - effect: "The user gathers dark energy using its Z-Power and sucks the target into it. The power varies, depending on the original move." - }, - "blackHoleEclipseSpecial": { - name: "Black Hole Eclipse", - effect: "Dummy Data" - }, - "twinkleTacklePhysical": { - name: "Twinkle Tackle", - effect: "The user creates a very charming space using its Z-Power and totally toys with the target. The power varies, depending on the original move." - }, - "twinkleTackleSpecial": { - name: "Twinkle Tackle", - effect: "Dummy Data" - }, - "catastropika": { - name: "Catastropika", - effect: "The user, Pikachu, surrounds itself with the maximum amount of electricity using its Z-Power and pounces on its target with full force." - }, - "shoreUp": { - name: "Shore Up", - effect: "The user regains up to half of its max HP. It restores more HP in a sandstorm." - }, - "firstImpression": { - name: "First Impression", - effect: "Although this move has great power, it only works the first turn each time the user enters battle." - }, - "banefulBunker": { - name: "Baneful Bunker", - effect: "In addition to protecting the user from attacks, this move also poisons any attacker that makes direct contact." - }, - "spiritShackle": { - name: "Spirit Shackle", - effect: "The user attacks while simultaneously stitching the target's shadow to the ground to prevent the target from escaping." - }, - "darkestLariat": { - name: "Darkest Lariat", - effect: "The user swings both arms and hits the target. The target's stat changes don't affect this attack's damage." - }, - "sparklingAria": { - name: "Sparkling Aria", - effect: "The user bursts into song, emitting many bubbles. Any Pokémon suffering from a burn will be healed by the touch of these bubbles." - }, - "iceHammer": { - name: "Ice Hammer", - effect: "The user swings and hits with its strong, heavy fist. It lowers the user's Speed, however." - }, - "floralHealing": { - name: "Floral Healing", - effect: "The user restores the target's HP by up to half of its max HP. It restores more HP when the terrain is grass." - }, - "highHorsepower": { - name: "High Horsepower", - effect: "The user fiercely attacks the target using its entire body." - }, - "strengthSap": { - name: "Strength Sap", - effect: "The user restores its HP by the same amount as the target's Attack stat. It also lowers the target's Attack stat." - }, - "solarBlade": { - name: "Solar Blade", - effect: "In this two-turn attack, the user gathers light and fills a blade with the light's energy, attacking the target on the next turn." - }, - "leafage": { - name: "Leafage", - effect: "The user attacks by pelting the target with leaves." - }, - "spotlight": { - name: "Spotlight", - effect: "The user shines a spotlight on the target so that only the target will be attacked during the turn." - }, - "toxicThread": { - name: "Toxic Thread", - effect: "The user shoots poisonous threads to poison the target and lower the target's Speed stat." - }, - "laserFocus": { - name: "Laser Focus", - effect: "The user concentrates intensely. The attack on the next turn always results in a critical hit." - }, - "gearUp": { - name: "Gear Up", - effect: "The user engages its gears to raise the Attack and Sp. Atk stats of ally Pokémon with the Plus or Minus Ability." - }, - "throatChop": { - name: "Throat Chop", - effect: "The user attacks the target's throat, and the resultant suffering prevents the target from using moves that emit sound for two turns." - }, - "pollenPuff": { - name: "Pollen Puff", - effect: "The user attacks the enemy with a pollen puff that explodes. If the target is an ally, it gives the ally a pollen puff that restores its HP instead." - }, - "anchorShot": { - name: "Anchor Shot", - effect: "The user entangles the target with its anchor chain while attacking. The target becomes unable to flee." - }, - "psychicTerrain": { - name: "Psychic Terrain", - effect: "This protects Pokémon on the ground from priority moves and powers up Psychic-type moves for five turns." - }, - "lunge": { - name: "Lunge", - effect: "The user makes a lunge at the target, attacking with full force. This also lowers the target's Attack stat." - }, - "fireLash": { - name: "Fire Lash", - effect: "The user strikes the target with a burning lash. This also lowers the target's Defense stat." - }, - "powerTrip": { - name: "Power Trip", - effect: "The user boasts its strength and attacks the target. The more the user's stats are raised, the greater the move's power." - }, - "burnUp": { - name: "Burn Up", - effect: "To inflict massive damage, the user burns itself out. After using this move, the user will no longer be Fire type." - }, - "speedSwap": { - name: "Speed Swap", - effect: "The user exchanges Speed stats with the target." - }, - "smartStrike": { - name: "Smart Strike", - effect: "The user stabs the target with a sharp horn. This attack never misses." - }, - "purify": { - name: "Purify", - effect: "The user heals the target's status condition. If the move succeeds, it also restores the user's own HP." - }, - "revelationDance": { - name: "Revelation Dance", - effect: "The user attacks the target by dancing very hard. The user's type determines the type of this move." - }, - "coreEnforcer": { - name: "Core Enforcer", - effect: "If the Pokémon the user has inflicted damage on have already used their moves, this move eliminates the effect of the target's Ability." - }, - "tropKick": { - name: "Trop Kick", - effect: "The user lands an intense kick of tropical origins on the target. This also lowers the target's Attack stat." - }, - "instruct": { - name: "Instruct", - effect: "The user instructs the target to use the target's last move again." - }, - "beakBlast": { - name: "Beak Blast", - effect: "The user first heats up its beak, and then it attacks the target. Making direct contact with the Pokémon while it's heating up its beak results in a burn." - }, - "clangingScales": { - name: "Clanging Scales", - effect: "The user rubs the scales on its entire body and makes a huge noise to attack opposing Pokémon. The user's Defense stat goes down after the attack." - }, - "dragonHammer": { - name: "Dragon Hammer", - effect: "The user uses its body like a hammer to attack the target and inflict damage." - }, - "brutalSwing": { - name: "Brutal Swing", - effect: "The user swings its body around violently to inflict damage on everything in its vicinity." - }, - "auroraVeil": { - name: "Aurora Veil", - effect: "This move reduces damage from physical and special moves for five turns. This can be used only when it is snowing." - }, - "sinisterArrowRaid": { - name: "Sinister Arrow Raid", - effect: "The user, Decidueye, creates countless arrows using its Z-Power and shoots the target with full force." - }, - "maliciousMoonsault": { - name: "Malicious Moonsault", - effect: "The user, Incineroar, strengthens its body using its Z-Power and crashes into the target with full force." - }, - "oceanicOperetta": { - name: "Oceanic Operetta", - effect: "The user, Primarina, summons a massive amount of water using its Z-Power and attacks the target with full force." - }, - "guardianOfAlola": { - name: "Guardian of Alola", - effect: "The user, the Land Spirit Pokémon, obtains Alola's energy using its Z-Power and attacks the target with full force. This reduces the target's HP greatly." - }, - "soulStealing7StarStrike": { - name: "Soul-Stealing 7-Star Strike", - effect: "After obtaining Z-Power, the user, Marshadow, punches and kicks the target consecutively with full force." - }, - "stokedSparksurfer": { - name: "Stoked Sparksurfer", - effect: "After obtaining Z-Power, the user, Alolan Raichu, attacks the target with full force. This move leaves the target with paralysis." - }, - "pulverizingPancake": { - name: "Pulverizing Pancake", - effect: "Z-Power brings out the true capabilities of the user, Snorlax. The Pokémon moves its enormous body energetically and attacks the target with full force." - }, - "extremeEvoboost": { - name: "Extreme Evoboost", - effect: "After obtaining Z-Power, the user, Eevee, gets energy from its evolved friends and boosts its stats sharply." - }, - "genesisSupernova": { - name: "Genesis Supernova", - effect: "After obtaining Z-Power, the user, Mew, attacks the target with full force. The terrain will be charged with psychic energy." - }, - "shellTrap": { - name: "Shell Trap", - effect: "The user sets a shell trap. If the user is hit by a physical move, the trap will explode and inflict damage on opposing Pokémon." - }, - "fleurCannon": { - name: "Fleur Cannon", - effect: "The user unleashes a strong beam. The attack's recoil harshly lowers the user's Sp. Atk stat." - }, - "psychicFangs": { - name: "Psychic Fangs", - effect: "The user bites the target with its psychic capabilities. This can also destroy Light Screen and Reflect." - }, - "stompingTantrum": { - name: "Stomping Tantrum", - effect: "Driven by frustration, the user attacks the target. If the user's previous move has failed, the power of this move doubles." - }, - "shadowBone": { - name: "Shadow Bone", - effect: "The user attacks by beating the target with a bone that contains a spirit. This may also lower the target's Defense stat." - }, - "accelerock": { - name: "Accelerock", - effect: "The user smashes into the target at high speed. This move always goes first." - }, - "liquidation": { - name: "Liquidation", - effect: "The user slams into the target using a full-force blast of water. This may also lower the target's Defense stat." - }, - "prismaticLaser": { - name: "Prismatic Laser", - effect: "The user shoots powerful lasers using the power of a prism. The user can't move on the next turn." - }, - "spectralThief": { - name: "Spectral Thief", - effect: "The user hides in the target's shadow, steals the target's stat boosts, and then attacks." - }, - "sunsteelStrike": { - name: "Sunsteel Strike", - effect: "The user slams into the target with the force of a meteor. This move can be used on the target regardless of its Abilities." - }, - "moongeistBeam": { - name: "Moongeist Beam", - effect: "The user emits a sinister ray to attack the target. This move can be used on the target regardless of its Abilities." - }, - "tearfulLook": { - name: "Tearful Look", - effect: "The user gets teary eyed to make the target lose its combative spirit. This lowers the target's Attack and Sp. Atk stats." - }, - "zingZap": { - name: "Zing Zap", - effect: "A strong electric blast crashes down on the target, giving it an electric shock. This may also make the target flinch." - }, - "naturesMadness": { - name: "Nature's Madness", - effect: "The user hits the target with the force of nature. It halves the target's HP." - }, - "multiAttack": { - name: "Multi-Attack", - effect: "Cloaking itself in high energy, the user slams into the target. The memory held determines the move's type." - }, - "tenMillionVoltThunderbolt": { - name: "10,000,000 Volt Thunderbolt", - effect: "The user, Pikachu wearing a cap, powers up a jolt of electricity using its Z-Power and unleashes it. Critical hits land more easily." - }, - "mindBlown": { - name: "Mind Blown", - effect: "The user attacks everything around it by causing its own head to explode. This also damages the user." - }, - "plasmaFists": { - name: "Plasma Fists", - effect: "The user attacks with electrically charged fists. This move changes Normal-type moves to Electric-type moves." - }, - "photonGeyser": { - name: "Photon Geyser", - effect: "The user attacks a target with a pillar of light. This move inflicts Attack or Sp. Atk damage—whichever stat is higher for the user." - }, - "lightThatBurnsTheSky": { - name: "Light That Burns the Sky", - effect: "This attack inflicts Attack or Sp. Atk damage—whichever stat is higher for the user, Necrozma. This move ignores the target's Ability." - }, - "searingSunrazeSmash": { - name: "Searing Sunraze Smash", - effect: "After obtaining Z-Power, the user, Solgaleo, attacks the target with full force. This move can ignore the effect of the target's Ability." - }, - "menacingMoonrazeMaelstrom": { - name: "Menacing Moonraze Maelstrom", - effect: "After obtaining Z-Power, the user, Lunala, attacks the target with full force. This move can ignore the effect of the target's Ability." - }, - "letsSnuggleForever": { - name: "Let's Snuggle Forever", - effect: "After obtaining Z-Power, the user, Mimikyu, punches the target with full force." - }, - "splinteredStormshards": { - name: "Splintered Stormshards", - effect: "After obtaining Z-Power, the user, Lycanroc, attacks the target with full force. This move negates the effect on the battlefield." - }, - "clangorousSoulblaze": { - name: "Clangorous Soulblaze", - effect: "After obtaining Z-Power, the user, Kommo-o, attacks the opposing Pokémon with full force. This move boosts the user's stats." - }, - "zippyZap": { - name: "Zippy Zap", - effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness." - }, - "splishySplash": { - name: "Splishy Splash", - effect: "The user charges a huge wave with electricity and hits the opposing Pokémon with the wave. This may also leave the opposing Pokémon with paralysis." - }, - "floatyFall": { - name: "Floaty Fall", - effect: "The user floats in the air, and then dives at a steep angle to attack the target. This may also make the target flinch." - }, - "pikaPapow": { - name: "Pika Papow", - effect: "The more Pikachu loves its Trainer, the greater the move's power. It never misses." - }, - "bouncyBubble": { - name: "Bouncy Bubble", - effect: "The user attacks by shooting water bubbles at the target. It then absorbs water and restores its HP by the damage taken by the target." - }, - "buzzyBuzz": { - name: "Buzzy Buzz", - effect: "The user shoots a jolt of electricity to attack the target. This also leaves the target with paralysis." - }, - "sizzlySlide": { - name: "Sizzly Slide", - effect: "The user cloaks itself in fire and charges at the target. This also leaves the target with a burn." - }, - "glitzyGlow": { - name: "Glitzy Glow", - effect: "The user bombards the target with telekinetic force. A wondrous wall of light is put up to weaken the power of the opposing Pokémon's special moves." - }, - "baddyBad": { - name: "Baddy Bad", - effect: "The user acts bad and attacks the target. A wondrous wall of light is put up to weaken the power of the opposing Pokémon's physical moves." - }, - "sappySeed": { - name: "Sappy Seed", - effect: "The user grows a gigantic stalk that scatters seeds to attack the target. The seeds drain the target's HP every turn." - }, - "freezyFrost": { - name: "Freezy Frost", - effect: "The user attacks with a crystal made of cold frozen haze. It eliminates every stat change among all the Pokémon engaged in battle." - }, - "sparklySwirl": { - name: "Sparkly Swirl", - effect: "The user attacks the target by wrapping it with a whirlwind of an overpowering scent. This also heals all status conditions of the user's party." - }, - "veeveeVolley": { - name: "Veevee Volley", - effect: "The more Eevee loves its Trainer, the greater the move's power. It never misses." - }, - "doubleIronBash": { - name: "Double Iron Bash", - effect: "The user rotates, centering the hex nut in its chest, and then strikes with its arms twice in a row. This may also make the target flinch." - }, - "maxGuard": { - name: "Max Guard", - effect: "This move enables the user to protect itself from all attacks. Its chance of failing rises if it is used in succession." - }, - "dynamaxCannon": { - name: "Dynamax Cannon", - effect: "The user unleashes a strong beam from its core. This move deals twice the damage if the target is over level 200." - }, - "snipeShot": { - name: "Snipe Shot", - effect: "The user ignores the effects of opposing Pokémon's moves and Abilities that draw in moves, allowing this move to hit the chosen target." - }, - "jawLock": { - name: "Jaw Lock", - effect: "This move prevents the user and the target from switching out until either of them faints. The effect goes away if either of the Pokémon leaves the field." - }, - "stuffCheeks": { - name: "Stuff Cheeks", - effect: "The user eats its held Berry, then sharply raises its Defense stat." - }, - "noRetreat": { - name: "No Retreat", - effect: "This move raises all the user's stats but prevents the user from switching out or fleeing." - }, - "tarShot": { - name: "Tar Shot", - effect: "The user pours sticky tar over the target, lowering the target's Speed stat. The target becomes weaker to Fire-type moves." - }, - "magicPowder": { - name: "Magic Powder", - effect: "The user scatters a cloud of magic powder that changes the target to Psychic type." - }, - "dragonDarts": { - name: "Dragon Darts", - effect: "The user attacks twice using Dreepy. If there are two targets, this move hits each target once." - }, - "teatime": { - name: "Teatime", - effect: "The user has teatime with all the Pokémon in the battle. Each Pokémon eats its held Berry." - }, - "octolock": { - name: "Octolock", - effect: "The user locks the target in and prevents it from fleeing. This move also lowers the target's Defense and Sp. Def every turn." - }, - "boltBeak": { - name: "Bolt Beak", - effect: "The user stabs the target with its electrified beak. If the user attacks before the target, the power of this move is doubled." - }, - "fishiousRend": { - name: "Fishious Rend", - effect: "The user rends the target with its hard gills. If the user attacks before the target, the power of this move is doubled." - }, - "courtChange": { - name: "Court Change", - effect: "With its mysterious power, the user swaps the effects on either side of the field." - }, - "maxFlare": { - name: "Max Flare", - effect: "This is a Fire-type attack Dynamax Pokémon use. The user intensifies the sun for five turns." - }, - "maxFlutterby": { - name: "Max Flutterby", - effect: "This is a Bug-type attack Dynamax Pokémon use. This lowers the target's Sp. Atk stat." - }, - "maxLightning": { - name: "Max Lightning", - effect: "This is an Electric-type attack Dynamax Pokémon use. The user turns the ground into Electric Terrain for five turns." - }, - "maxStrike": { - name: "Max Strike", - effect: "This is a Normal-type attack Dynamax Pokémon use. This lowers the target's Speed stat." - }, - "maxKnuckle": { - name: "Max Knuckle", - effect: "This is a Fighting-type attack Dynamax Pokémon use. This raises ally Pokémon's Attack stats." - }, - "maxPhantasm": { - name: "Max Phantasm", - effect: "This is a Ghost-type attack Dynamax Pokémon use. This lowers the target's Defense stat." - }, - "maxHailstorm": { - name: "Max Hailstorm", - effect: "This is an Ice-type attack Dynamax Pokémon use. The user summons a hailstorm lasting five turns." - }, - "maxOoze": { - name: "Max Ooze", - effect: "This is a Poison-type attack Dynamax Pokémon use. This raises ally Pokémon's Sp. Atk stats." - }, - "maxGeyser": { - name: "Max Geyser", - effect: "This is a Water-type attack Dynamax Pokémon use. The user summons a heavy rain that falls for five turns." - }, - "maxAirstream": { - name: "Max Airstream", - effect: "This is a Flying-type attack Dynamax Pokémon use. This raises ally Pokémon's Speed stats." - }, - "maxStarfall": { - name: "Max Starfall", - effect: "This is a Fairy-type attack Dynamax Pokémon use. The user turns the ground into Misty Terrain for five turns." - }, - "maxWyrmwind": { - name: "Max Wyrmwind", - effect: "This is a Dragon-type attack Dynamax Pokémon use. This lowers the target's Attack stat." - }, - "maxMindstorm": { - name: "Max Mindstorm", - effect: "This is a Psychic-type attack Dynamax Pokémon use. The user turns the ground into Psychic Terrain for five turns." - }, - "maxRockfall": { - name: "Max Rockfall", - effect: "This is a Rock-type attack Dynamax Pokémon use. The user summons a sandstorm lasting five turns." - }, - "maxQuake": { - name: "Max Quake", - effect: "This is a Ground-type attack Dynamax Pokémon use. This raises ally Pokémon's Sp. Def stats." - }, - "maxDarkness": { - name: "Max Darkness", - effect: "This is a Dark-type attack Dynamax Pokémon use. This lowers the target's Sp. Def stat." - }, - "maxOvergrowth": { - name: "Max Overgrowth", - effect: "This is a Grass-type attack Dynamax Pokémon use. The user turns the ground into Grassy Terrain for five turns." - }, - "maxSteelspike": { - name: "Max Steelspike", - effect: "This is a Steel-type attack Dynamax Pokémon use. This raises ally Pokémon's Defense stats." - }, - "clangorousSoul": { - name: "Clangorous Soul", - effect: "The user raises all its stats by using some of its HP." - }, - "bodyPress": { - name: "Body Press", - effect: "The user attacks by slamming its body into the target. The higher the user's Defense, the more damage it can inflict on the target." - }, - "decorate": { - name: "Decorate", - effect: "The user sharply raises the target's Attack and Sp. Atk stats by decorating the target." - }, - "drumBeating": { - name: "Drum Beating", - effect: "The user plays its drum, controlling the drum's roots to attack the target. This also lowers the target's Speed stat." - }, - "snapTrap": { - name: "Snap Trap", - effect: "The user snares the target in a snap trap for four to five turns." - }, - "pyroBall": { - name: "Pyro Ball", - effect: "The user attacks by igniting a small stone and launching it as a fiery ball at the target. This may also leave the target with a burn." - }, - "behemothBlade": { - name: "Behemoth Blade", - effect: "The user wields a large, powerful sword using its whole body and cuts the target in a vigorous attack." - }, - "behemothBash": { - name: "Behemoth Bash", - effect: "The user's body becomes a firm shield and slams into the target fiercely." - }, - "auraWheel": { - name: "Aura Wheel", - effect: "Morpeko attacks and raises its Speed with the energy stored in its cheeks. This move's type changes depending on the user's form." - }, - "breakingSwipe": { - name: "Breaking Swipe", - effect: "The user swings its tough tail wildly and attacks opposing Pokémon. This also lowers their Attack stats." - }, - "branchPoke": { - name: "Branch Poke", - effect: "The user attacks the target by poking it with a sharply pointed branch." - }, - "overdrive": { - name: "Overdrive", - effect: "The user attacks opposing Pokémon by twanging a guitar or bass guitar, causing a huge echo and strong vibration." - }, - "appleAcid": { - name: "Apple Acid", - effect: "The user attacks the target with an acidic liquid created from tart apples. This also lowers the target's Sp. Def stat." - }, - "gravApple": { - name: "Grav Apple", - effect: "The user inflicts damage by dropping an apple from high above. This also lowers the target's Defense stat." - }, - "spiritBreak": { - name: "Spirit Break", - effect: "The user attacks the target with so much force that it could break the target's spirit. This also lowers the target's Sp. Atk stat." - }, - "strangeSteam": { - name: "Strange Steam", - effect: "The user attacks the target by emitting steam. This may also confuse the target." - }, - "lifeDew": { - name: "Life Dew", - effect: "The user scatters mysterious water around and restores the HP of itself and its ally Pokémon in the battle." - }, - "obstruct": { - name: "Obstruct", - effect: "This move enables the user to protect itself from all attacks. Its chance of failing rises if it is used in succession. Direct contact harshly lowers the attacker's Defense stat." - }, - "falseSurrender": { - name: "False Surrender", - effect: "The user pretends to bow its head, but then it stabs the target with its disheveled hair. This attack never misses." - }, - "meteorAssault": { - name: "Meteor Assault", - effect: "The user attacks wildly with its thick leek. The user can't move on the next turn, because the force of this move makes it stagger." - }, - "eternabeam": { - name: "Eternabeam", - effect: "This is Eternatus's most powerful attack in its original form. The user can't move on the next turn." - }, - "steelBeam": { - name: "Steel Beam", - effect: "The user fires a beam of steel that it collected from its entire body. This also damages the user." - }, - "expandingForce": { - name: "Expanding Force", - effect: "The user attacks the target with its psychic power. This move's power goes up and damages all opposing Pokémon on Psychic Terrain." - }, - "steelRoller": { - name: "Steel Roller", - effect: "The user attacks while destroying the terrain. This move fails when the ground hasn't turned into a terrain." - }, - "scaleShot": { - name: "Scale Shot", - effect: "The user attacks by shooting scales two to five times in a row. This move boosts the user's Speed stat but lowers its Defense stat." - }, - "meteorBeam": { - name: "Meteor Beam", - effect: "In this two-turn attack, the user gathers space power and boosts its Sp. Atk stat, then attacks the target on the next turn." - }, - "shellSideArm": { - name: "Shell Side Arm", - effect: "This move inflicts physical or special damage, whichever will be more effective. This may also poison the target." - }, - "mistyExplosion": { - name: "Misty Explosion", - effect: "The user attacks everything around it and faints upon using this move. This move's power is increased on Misty Terrain." - }, - "grassyGlide": { - name: "Grassy Glide", - effect: "Gliding on the ground, the user attacks the target. This move always goes first on Grassy Terrain." - }, - "risingVoltage": { - name: "Rising Voltage", - effect: "The user attacks with electric voltage rising from the ground. This move's power doubles when the target is on Electric Terrain." - }, - "terrainPulse": { - name: "Terrain Pulse", - effect: "The user utilizes the power of the terrain to attack. This move's type and power changes depending on the terrain when it's used." - }, - "skitterSmack": { - name: "Skitter Smack", - effect: "The user skitters behind the target to attack. This also lowers the target's Sp. Atk stat." - }, - "burningJealousy": { - name: "Burning Jealousy", - effect: "The user attacks with energy from jealousy. This leaves all opposing Pokémon that have had their stats boosted during the turn with a burn." - }, - "lashOut": { - name: "Lash Out", - effect: "The user lashes out to vent its frustration toward the target. If the user's stats were lowered during this turn, the power of this move is doubled." - }, - "poltergeist": { - name: "Poltergeist", - effect: "The user attacks the target by controlling the target's item. The move fails if the target doesn't have an item." - }, - "corrosiveGas": { - name: "Corrosive Gas", - effect: "The user surrounds everything around it with highly acidic gas and melts away items they hold." - }, - "coaching": { - name: "Coaching", - effect: "The user properly coaches its ally Pokémon, boosting their Attack and Defense stats." - }, - "flipTurn": { - name: "Flip Turn", - effect: "After making its attack, the user rushes back to switch places with a party Pokémon in waiting." - }, - "tripleAxel": { - name: "Triple Axel", - effect: "A consecutive three-kick attack that becomes more powerful with each successful hit." - }, - "dualWingbeat": { - name: "Dual Wingbeat", - effect: "The user slams the target with its wings. The target is hit twice in a row." - }, - "scorchingSands": { - name: "Scorching Sands", - effect: "The user throws scorching sand at the target to attack. This may also leave the target with a burn." - }, - "jungleHealing": { - name: "Jungle Healing", - effect: "The user becomes one with the jungle, restoring HP and healing any status conditions of itself and its ally Pokémon in battle." - }, - "wickedBlow": { - name: "Wicked Blow", - effect: "The user, having mastered the Dark style, strikes the target with a fierce blow. This attack always results in a critical hit." - }, - "surgingStrikes": { - name: "Surging Strikes", - effect: "The user, having mastered the Water style, strikes the target with a flowing motion three times in a row. This attack always results in a critical hit." - }, - "thunderCage": { - name: "Thunder Cage", - effect: "The user traps the target in a cage of sparking electricity for four to five turns." - }, - "dragonEnergy": { - name: "Dragon Energy", - effect: "Converting its life-force into power, the user attacks opposing Pokémon. The lower the user's HP, the lower the move's power." - }, - "freezingGlare": { - name: "Freezing Glare", - effect: "The user shoots its psychic power from its eyes to attack. This may also leave the target frozen." - }, - "fieryWrath": { - name: "Fiery Wrath", - effect: "The user transforms its wrath into a fire-like aura to attack. This may also make opposing Pokémon flinch." - }, - "thunderousKick": { - name: "Thunderous Kick", - effect: "The user overwhelms the target with lightning-like movement before delivering a kick. This also lowers the target's Defense stat." - }, - "glacialLance": { - name: "Glacial Lance", - effect: "The user attacks by hurling a blizzard-cloaked icicle lance at opposing Pokémon." - }, - "astralBarrage": { - name: "Astral Barrage", - effect: "The user attacks by sending a frightful amount of small ghosts at opposing Pokémon." - }, - "eerieSpell": { - name: "Eerie Spell", - effect: "The user attacks with its tremendous psychic power. This also removes 3 PP from the target's last move." - }, - "direClaw": { - name: "Dire Claw", - effect: "The user lashes out at the target with ruinous claws. This may also leave the target poisoned, paralyzed, or asleep." - }, - "psyshieldBash": { - name: "Psyshield Bash", - effect: "Cloaking itself in psychic energy, the user slams into the target. This also boosts the user's Defense stat." - }, - "powerShift": { - name: "Power Shift", - effect: "The user swaps its Attack and Defense stats." - }, - "stoneAxe": { - name: "Stone Axe", - effect: "The user swings its stone axes at the target. Stone splinters left behind by this attack float around the target." - }, - "springtideStorm": { - name: "Springtide Storm", - effect: "The user attacks by wrapping opposing Pokémon in fierce winds brimming with love and hate. This may also lower their Attack stats." - }, - "mysticalPower": { - name: "Mystical Power", - effect: "The user attacks by emitting a mysterious power. This also boosts the user's Sp. Atk stat." - }, - "ragingFury": { - name: "Raging Fury", - effect: "The user rampages around spewing flames for two to three turns. The user then becomes confused." - }, - "waveCrash": { - name: "Wave Crash", - effect: "The user shrouds itself in water and slams into the target with its whole body to inflict damage. This also damages the user quite a lot." - }, - "chloroblast": { - name: "Chloroblast", - effect: "The user launches its amassed chlorophyll to inflict damage on the target. This also damages the user." - }, - "mountainGale": { - name: "Mountain Gale", - effect: "The user hurls giant chunks of ice at the target to inflict damage. This may also make the target flinch." - }, - "victoryDance": { - name: "Victory Dance", - effect: "The user performs an intense dance to usher in victory, boosting its Attack, Defense, and Speed stats." - }, - "headlongRush": { - name: "Headlong Rush", - effect: "The user smashes into the target in a full-body tackle. This also lowers the user's Defense and Sp. Def stats." - }, - "barbBarrage": { - name: "Barb Barrage", - effect: "The user launches countless toxic barbs to inflict damage. This may also poison the target. This move's power is doubled if the target is already poisoned." - }, - "esperWing": { - name: "Esper Wing", - effect: "The user slashes the target with aura-enriched wings. This also boosts the user's Speed stat. This move has a heightened chance of landing a critical hit." - }, - "bitterMalice": { - name: "Bitter Malice", - effect: "The user attacks the target with spine-chilling resentment. This also lowers the target's Attack stat." - }, - "shelter": { - name: "Shelter", - effect: "The user makes its skin as hard as an iron shield, sharply boosting its Defense stat." - }, - "tripleArrows": { - name: "Triple Arrows", - effect: "The user kicks, then fires three arrows. This move has a heightened chance of landing a critical hit and may also lower the target's Defense stat or make it flinch." - }, - "infernalParade": { - name: "Infernal Parade", - effect: "The user attacks with myriad fireballs. This may also leave the target with a burn. This move's power is doubled if the target has a status condition." - }, - "ceaselessEdge": { - name: "Ceaseless Edge", - effect: "The user slashes its shell blade at the target. Shell splinters left behind by this attack remain scattered under the target as spikes." - }, - "bleakwindStorm": { - name: "Bleakwind Storm", - effect: "The user attacks with savagely cold winds that cause both body and spirit to tremble. This may also lower the Speed stats of opposing Pokémon." - }, - "wildboltStorm": { - name: "Wildbolt Storm", - effect: "The user summons a thunderous tempest and savagely attacks with lightning and wind. This may also leave opposing Pokémon with paralysis." - }, - "sandsearStorm": { - name: "Sandsear Storm", - effect: "The user attacks by wrapping opposing Pokémon in fierce winds and searingly hot sand. This may also leave them with a burn." - }, - "lunarBlessing": { - name: "Lunar Blessing", - effect: "The user receives a blessing from the crescent moon, restoring HP and curing status conditions for itself and its ally Pokémon currently in the battle." - }, - "takeHeart": { - name: "Take Heart", - effect: "The user lifts its spirits, curing its own status conditions and boosting its Sp. Atk and Sp. Def stats." - }, - "gMaxWildfire": { - name: "G-Max Wildfire", - effect: "A Fire-type attack that Gigantamax Charizard use. This move continues to deal damage to opponents for four turns." - }, - "gMaxBefuddle": { - name: "G-Max Befuddle", - effect: "A Bug-type attack that Gigantamax Butterfree use. This move inflicts the poisoned, paralyzed, or asleep status condition on opponents." - }, - "gMaxVoltCrash": { - name: "G-Max Volt Crash", - effect: "An Electric-type attack that Gigantamax Pikachu use. This move paralyzes opponents." - }, - "gMaxGoldRush": { - name: "G-Max Gold Rush", - effect: "A Normal-type attack that Gigantamax Meowth use. This move confuses opponents and also earns extra money." - }, - "gMaxChiStrike": { - name: "G-Max Chi Strike", - effect: "A Fighting-type attack that Gigantamax Machamp use. This move raises the chance of critical hits." - }, - "gMaxTerror": { - name: "G-Max Terror", - effect: "A Ghost-type attack that Gigantamax Gengar use. This Pokémon steps on the opposing Pokémon's shadow to prevent them from escaping." - }, - "gMaxResonance": { - name: "G-Max Resonance", - effect: "An Ice-type attack that Gigantamax Lapras use. This move reduces the damage received for five turns." - }, - "gMaxCuddle": { - name: "G-Max Cuddle", - effect: "A Normal-type attack that Gigantamax Eevee use. This move infatuates opponents." - }, - "gMaxReplenish": { - name: "G-Max Replenish", - effect: "A Normal-type attack that Gigantamax Snorlax use. This move restores Berries that have been eaten." - }, - "gMaxMalodor": { - name: "G-Max Malodor", - effect: "A Poison-type attack that Gigantamax Garbodor use. This move poisons opponents." - }, - "gMaxStonesurge": { - name: "G-Max Stonesurge", - effect: "A Water-type attack that Gigantamax Drednaw use. This move scatters sharp rocks around the field." - }, - "gMaxWindRage": { - name: "G-Max Wind Rage", - effect: "A Flying-type attack that Gigantamax Corviknight use. This move removes the effects of moves like Reflect and Light Screen." - }, - "gMaxStunShock": { - name: "G-Max Stun Shock", - effect: "An Electric-type attack that Gigantamax Toxtricity use. This move poisons or paralyzes opponents." - }, - "gMaxFinale": { - name: "G-Max Finale", - effect: "A Fairy-type attack that Gigantamax Alcremie use. This move heals the HP of allies." - }, - "gMaxDepletion": { - name: "G-Max Depletion", - effect: "A Dragon-type attack that Gigantamax Duraludon use. Reduces the PP of the last move used." - }, - "gMaxGravitas": { - name: "G-Max Gravitas", - effect: "A Psychic-type attack that Gigantamax Orbeetle use. This move changes gravity for five turns." - }, - "gMaxVolcalith": { - name: "G-Max Volcalith", - effect: "A Rock-type attack that Gigantamax Coalossal use. This move continues to deal damage to opponents for four turns." - }, - "gMaxSandblast": { - name: "G-Max Sandblast", - effect: "A Ground-type attack that Gigantamax Sandaconda use. Opponents are trapped in a raging sandstorm for four to five turns." - }, - "gMaxSnooze": { - name: "G-Max Snooze", - effect: "A Dark-type attack that Gigantamax Grimmsnarl use. The user lets loose a huge yawn that lulls the targets into falling asleep on the next turn." - }, - "gMaxTartness": { - name: "G-Max Tartness", - effect: "A Grass-type attack that Gigantamax Flapple use. This move reduces the opponents' evasiveness." - }, - "gMaxSweetness": { - name: "G-Max Sweetness", - effect: "A Grass-type attack that Gigantamax Appletun use. This move heals the status conditions of allies." - }, - "gMaxSmite": { - name: "G-Max Smite", - effect: "A Fairy-type attack that Gigantamax Hatterene use. This move confuses opponents." - }, - "gMaxSteelsurge": { - name: "G-Max Steelsurge", - effect: "A Steel-type attack that Gigantamax Copperajah use. This move scatters sharp spikes around the field." - }, - "gMaxMeltdown": { - name: "G-Max Meltdown", - effect: "A Steel-type attack that Gigantamax Melmetal use. This move makes opponents incapable of using the same move twice in a row." - }, - "gMaxFoamBurst": { - name: "G-Max Foam Burst", - effect: "A Water-type attack that Gigantamax Kingler use. This move harshly lowers the Speed of opponents." - }, - "gMaxCentiferno": { - name: "G-Max Centiferno", - effect: "A Fire-type attack that Gigantamax Centiskorch use. This move traps opponents in flames for four to five turns." - }, - "gMaxVineLash": { - name: "G-Max Vine Lash", - effect: "A Grass-type attack that Gigantamax Venusaur use. This move continues to deal damage to opponents for four turns." - }, - "gMaxCannonade": { - name: "G-Max Cannonade", - effect: "A Water-type attack that Gigantamax Blastoise use. This move continues to deal damage to opponents for four turns." - }, - "gMaxDrumSolo": { - name: "G-Max Drum Solo", - effect: "A Grass-type attack that Gigantamax Rillaboom use. This move can be used on the target regardless of its Abilities." - }, - "gMaxFireball": { - name: "G-Max Fireball", - effect: "A Fire-type attack that Gigantamax Cinderace use. This move can be used on the target regardless of its Abilities." - }, - "gMaxHydrosnipe": { - name: "G-Max Hydrosnipe", - effect: "A Water-type attack that Gigantamax Inteleon use. This move can be used on the target regardless of its Abilities." - }, - "gMaxOneBlow": { - name: "G-Max One Blow", - effect: "A Dark-type attack that Gigantamax Urshifu use. This single-strike move can ignore Max Guard." - }, - "gMaxRapidFlow": { - name: "G-Max Rapid Flow", - effect: "A Water-type attack that Gigantamax Urshifu use. This rapid-strike move can ignore Max Guard." - }, - "teraBlast": { - name: "Tera Blast", - effect: "If the user has Terastallized, it unleashes energy of its Tera Type. This move inflicts damage using the Attack or Sp. Atk stat-whichever is higher for the user." - }, - "silkTrap": { - name: "Silk Trap", - effect: "The user spins a silken trap, protecting itself from damage while lowering the Speed stat of any attacker that makes direct contact." - }, - "axeKick": { - name: "Axe Kick", - effect: "The user attacks by kicking up into the air and slamming its heel down upon the target. This may also confuse the target. If it misses, the user takes damage instead." - }, - "lastRespects": { - name: "Last Respects", - effect: "The user attacks to avenge its allies. The more defeated allies there are in the user's party, the greater the move's power." - }, - "luminaCrash": { - name: "Lumina Crash", - effect: "The user attacks by unleashing a peculiar light that even affects the mind. This also harshly lowers the target's Sp. Def stat." - }, - "orderUp": { - name: "Order Up", - effect: "The user attacks with elegant poise. If the user has a Tatsugiri in its mouth, this move boosts one of the user's stats based on the Tatsugiri's form." - }, - "jetPunch": { - name: "Jet Punch", - effect: "The user summons a torrent around its fist and punches at blinding speed. This move always goes first." - }, - "spicyExtract": { - name: "Spicy Extract", - effect: "The user emits an incredibly spicy extract, sharply boosting the target's Attack stat and harshly lowering the target's Defense stat." - }, - "spinOut": { - name: "Spin Out", - effect: "The user spins furiously by straining its legs, inflicting damage on the target. This also harshly lowers the user's Speed stat." - }, - "populationBomb": { - name: "Population Bomb", - effect: "The user's fellows gather in droves to perform a combo attack that hits the target one to ten times in a row." - }, - "iceSpinner": { - name: "Ice Spinner", - effect: "The user covers its feet in thin ice and twirls around, slamming into the target. This move's spinning motion also destroys the terrain." - }, - "glaiveRush": { - name: "Glaive Rush", - effect: "The user throws its entire body into a reckless charge. After this move is used, attacks on the user cannot miss and will inflict double damage until the user's next turn." - }, - "revivalBlessing": { - name: "Revival Blessing", - effect: "The user bestows a loving blessing, reviving a party Pokémon that has fainted and restoring half that Pokémon's max HP." - }, - "saltCure": { - name: "Salt Cure", - effect: "The user salt cures the target, inflicting damage every turn. Steel and Water types are more strongly affected by this move." - }, - "tripleDive": { - name: "Triple Dive", - effect: "The user performs a perfectly timed triple dive, hitting the target with splashes of water three times in a row." - }, - "mortalSpin": { - name: "Mortal Spin", - effect: "The user performs a spin attack that can also eliminate the effects of such moves as Bind, Wrap, and Leech Seed. This also poisons opposing Pokémon." - }, - "doodle": { - name: "Doodle", - effect: "The user captures the very essence of the target in a sketch. This changes the Abilities of the user and its ally Pokémon to that of the target." - }, - "filletAway": { - name: "Fillet Away", - effect: "The user sharply boosts its Attack, Sp. Atk, and Speed stats by using its own HP." - }, - "kowtowCleave": { - name: "Kowtow Cleave", - effect: "The user slashes at the target after kowtowing to make the target let down its guard. This attack never misses." - }, - "flowerTrick": { - name: "Flower Trick", - effect: "The user throws a rigged bouquet of flowers at the target. This attack never misses and always lands a critical hit." - }, - "torchSong": { - name: "Torch Song", - effect: "The user blows out raging flames as if singing a song, scorching the target. This also boosts the user's Sp. Atk stat." - }, - "aquaStep": { - name: "Aqua Step", - effect: "The user toys with the target and attacks it using light and fluid dance steps. This also boosts the user's Speed stat." - }, - "ragingBull": { - name: "Raging Bull", - effect: "The user performs a tackle like a raging bull. This move's type depends on the user's form. It can also break barriers, such as Light Screen and Reflect." - }, - "makeItRain": { - name: "Make It Rain", - effect: "The user attacks by throwing out a mass of coins. This also lowers the user's Sp. Atk stat. Money is earned after the battle." - }, - "psyblade": { - name: "Psyblade", - effect: "The user rends the target with an ethereal blade. This move's power is boosted by 50 percent if the user is on Electric Terrain." - }, - "hydroSteam": { - name: "Hydro Steam", - effect: "The user blasts the target with boiling-hot water. This move's power is not lowered in harsh sunlight but rather boosted by 50 percent." - }, - "ruination": { - name: "Ruination", - effect: "The user summons a ruinous disaster. This cuts the target's HP in half." - }, - "collisionCourse": { - name: "Collision Course", - effect: "The user transforms and crashes to the ground, causing a massive prehistoric explosion. This move's power is boosted more than usual if it's a supereffective hit." - }, - "electroDrift": { - name: "Electro Drift", - effect: "The user races forward at ultrafast speeds, piercing its target with futuristic electricity. This move's power is boosted more than usual if it's a supereffective hit." - }, - "shedTail": { - name: "Shed Tail", - effect: "The user creates a substitute for itself using its own HP before switching places with a party Pokémon in waiting." - }, - "chillyReception": { - name: "Chilly Reception", - effect: "The user tells a chillingly bad joke before switching places with a party Pokémon in waiting. This summons a snowstorm lasting five turns." - }, - "tidyUp": { - name: "Tidy Up", - effect: "The user tidies up and removes the effects of Spikes, Stealth Rock, Sticky Web, Toxic Spikes, and Substitute. This also boosts the user's Attack and Speed stats." - }, - "snowscape": { - name: "Snowscape", - effect: "The user summons a snowstorm lasting five turns. This boosts the Defense stats of Ice types." - }, - "pounce": { - name: "Pounce", - effect: "The user attacks by pouncing on the target. This also lowers the target's Speed stat." - }, - "trailblaze": { - name: "Trailblaze", - effect: "The user attacks suddenly as if leaping out from tall grass. The user's nimble footwork boosts its Speed stat." - }, - "chillingWater": { - name: "Chilling Water", - effect: "The user attacks the target by showering it with water that's so cold it saps the target's power. This also lowers the target's Attack stat." - }, - "hyperDrill": { - name: "Hyper Drill", - effect: "The user spins the pointed part of its body at high speed to pierce the target. This attack can hit a target using a move such as Protect or Detect." - }, - "twinBeam": { - name: "Twin Beam", - effect: "The user shoots mystical beams from its eyes to inflict damage. The target is hit twice in a row." - }, - "rageFist": { - name: "Rage Fist", - effect: "The user converts its rage into energy to attack. The more times the user has been hit by attacks, the greater the move's power." - }, - "armorCannon": { - name: "Armor Cannon", - effect: "The user shoots its own armor out as blazing projectiles. This also lowers the user's Defense and Sp. Def stats." - }, - "bitterBlade": { - name: "Bitter Blade", - effect: "The user focuses its bitter feelings toward the world of the living into a slashing attack. The user's HP is restored by up to half the damage taken by the target." - }, - "doubleShock": { - name: "Double Shock", - effect: "The user discharges all the electricity from its body to perform a high-damage attack. After using this move, the user will no longer be Electric type." - }, - "gigatonHammer": { - name: "Gigaton Hammer", - effect: "The user swings its whole body around to attack with its huge hammer. This move can't be used twice in a row." - }, - "comeuppance": { - name: "Comeuppance", - effect: "The user retaliates with much greater force against the opponent that last inflicted damage on it." - }, - "aquaCutter": { - name: "Aqua Cutter", - effect: "The user expels pressurized water to cut at the target like a blade. This move has a heightened chance of landing a critical hit." - }, - "blazingTorque": { - name: "Blazing Torque", - effect: "The user revs their blazing engine into the target. This may also leave the target with a burn." - }, - "wickedTorque": { - name: "Wicked Torque", - effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep." - }, - "noxiousTorque": { - name: "Noxious Torque", - effect: "The user revs their poisonous engine into the target. This may also poison the target." - }, - "combatTorque": { - name: "Combat Torque", - effect: "The user revs their engine forcefully into the target. This may also leave the target with paralysis." - }, - "magicalTorque": { - name: "Magical Torque", - effect: "The user revs their fae-like engine into the target. This may also confuse the target." - }, - "bloodMoon": { - name: "Blood Moon", - effect: "The user unleashes the full brunt of its spirit from a full moon that shines as red as blood. This move can't be used twice in a row." - }, - "matchaGotcha": { - name: "Matcha Gotcha", - effect: "The user fires a blast of tea that it mixed. The user's HP is restored by up to half the damage taken by the target. This may also leave the target with a burn." - }, - "syrupBomb": { - name: "Syrup Bomb", - effect: "The user sets off an explosion of sticky candy syrup, which coats the target and causes the target's Speed stat to drop each turn for three turns." - }, - "ivyCudgel": { - name: "Ivy Cudgel", - effect: "The user strikes with an ivy-wrapped cudgel. This move's type changes depending on the mask worn by the user, and it has a heightened chance of landing a critical hit." - }, - "electroShot": { - name: "Electro Shot", - effect: "The user gathers electricity on the first turn, boosting its Sp. Atk stat, then fires a high-voltage shot on the next turn. The shot will be fired immediately in rain." - }, - "teraStarstorm": { - name: "Tera Starstorm", - effect: "With the power of its crystals, the user bombards and eliminates the target. When used by Terapagos in its Stellar Form, this move damages all opposing Pokémon." - }, - "fickleBeam": { - name: "Fickle Beam", - effect: "The user shoots a beam of light to inflict damage. Sometimes all the user's heads shoot beams in unison, doubling the move's power." - }, - "burningBulwark": { - name: "Burning Bulwark", - effect: "The user's intensely hot fur protects it from attacks and also burns any attacker that makes direct contact with it." - }, - "thunderclap": { - name: "Thunderclap", - effect: "This move enables the user to attack first with a jolt of electricity. This move fails if the target is not readying an attack." - }, - "mightyCleave": { - name: "Mighty Cleave", - effect: "The user wields the light that has accumulated atop its head to cleave the target. This move hits even if the target protects itself." - }, - "tachyonCutter": { - name: "Tachyon Cutter", - effect: "The user attacks by launching particle blades at the target twice in a row. This attack never misses." - }, - "hardPress": { - name: "Hard Press", - effect: "The target is crushed with an arm, a claw, or the like to inflict damage. The more HP the target has left, the greater the move's power." - }, - "dragonCheer": { - name: "Dragon Cheer", - effect: "The user raises its allies' morale with a draconic cry so that their future attacks have a heightened chance of landing critical hits. This rouses Dragon types more." - }, - "alluringVoice": { - name: "Alluring Voice", - effect: "The user attacks the target using its angelic voice. This also confuses the target if its stats have been boosted during the turn." - }, - "temperFlare": { - name: "Temper Flare", - effect: "Spurred by desperation, the user attacks the target. This move's power is doubled if the user's previous move failed." - }, - "supercellSlam": { - name: "Supercell Slam", - effect: "The user electrifies its body and drops onto the target to inflict damage. If this move misses, the user takes damage instead." - }, - "psychicNoise": { - name: "Psychic Noise", - effect: "The user attacks the target with unpleasant sound waves. For two turns, the target is prevented from recovering HP through moves, Abilities, or held items." - }, - "upperHand": { - name: "Upper Hand", - effect: "The user reacts to the target's movement and strikes with the heel of its palm, making the target flinch. This move fails if the target is not readying a priority move." - }, - "malignantChain": { - name: "Malignant Chain", - effect: "The user pours toxins into the target by wrapping them in a toxic, corrosive chain. This may also leave the target badly poisoned." - } -} as const; diff --git a/src/locales/en/nature.ts b/src/locales/en/nature.json similarity index 79% rename from src/locales/en/nature.ts rename to src/locales/en/nature.json index 9ab26f3eb2a..ad740557094 100644 --- a/src/locales/en/nature.ts +++ b/src/locales/en/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "Hardy", "Lonely": "Lonely", "Brave": "Brave", @@ -26,4 +24,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Sassy", "Careful": "Careful", "Quirky": "Quirky" -} as const; +} \ No newline at end of file diff --git a/src/locales/en/party-ui-handler.json b/src/locales/en/party-ui-handler.json new file mode 100644 index 00000000000..9c2b3f30e5e --- /dev/null +++ b/src/locales/en/party-ui-handler.json @@ -0,0 +1,47 @@ +{ + "SEND_OUT": "Send Out", + "SUMMARY": "Summary", + "CANCEL": "Cancel", + "RELEASE": "Release", + "APPLY": "Apply", + "TEACH": "Teach", + "SPLICE": "Splice", + "UNSPLICE": "Unsplice", + "ACTIVATE": "Activate", + "DEACTIVATE": "Deactivate", + "TRANSFER": "Transfer", + "ALL": "All", + "PASS_BATON": "Pass Baton", + "UNPAUSE_EVOLUTION": "Unpause Evolution", + "REVIVE": "Revive", + "RENAME": "Rename", + "choosePokemon": "Choose a Pokémon.", + "doWhatWithThisPokemon": "Do what with this Pokémon?", + "noEnergy": "{{pokemonName}} has no energy\nleft to battle!", + "hasEnergy": "{{pokemonName}} still has energy\nto battle!", + "cantBeUsed": "{{pokemonName}} can't be used in\nthis challenge!", + "tooManyItems": "{{pokemonName}} has too many\nof this item!", + "anyEffect": "It won't have any effect.", + "unpausedEvolutions": "Evolutions have been unpaused for {{pokemonName}}.", + "unspliceConfirmation": "Do you really want to unsplice {{fusionName}}\nfrom {{pokemonName}}? {{fusionName}} will be lost.", + "wasReverted": "{{fusionName}} was reverted to {{pokemonName}}.", + "releaseConfirmation": "Do you really want to release {{pokemonName}}?", + "releaseInBattle": "You can't release a Pokémon that's in battle!", + "selectAMove": "Select a move.", + "changeQuantity": "Select a held item to transfer.\nUse < and > to change the quantity.", + "selectAnotherPokemonToSplice": "Select another Pokémon to splice.", + "cancel": "Cancel", + "able": "Able", + "notAble": "Not able", + "learned": "Learned", + "goodbye": "Goodbye, {{pokemonName}}!", + "byebye": "Byebye, {{pokemonName}}!", + "farewell": "Farewell, {{pokemonName}}!", + "soLong": "So long, {{pokemonName}}!", + "thisIsWhereWePart": "This is where we part, {{pokemonName}}!", + "illMissYou": "I'll miss you, {{pokemonName}}!", + "illNeverForgetYou": "I'll never forget you, {{pokemonName}}!", + "untilWeMeetAgain": "Until we meet again, {{pokemonName}}!", + "sayonara": "Sayonara, {{pokemonName}}!", + "smellYaLater": "Smell ya later, {{pokemonName}}!" +} \ No newline at end of file diff --git a/src/locales/en/party-ui-handler.ts b/src/locales/en/party-ui-handler.ts deleted file mode 100644 index b7eac04b4c8..00000000000 --- a/src/locales/en/party-ui-handler.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "ALL": "All", - "SEND_OUT": "Send Out", - "SUMMARY": "Summary", - "CANCEL": "Cancel", - "RELEASE": "Release", - "APPLY": "Apply", - "TEACH": "Teach" -} as const; diff --git a/src/locales/en/pokeball.json b/src/locales/en/pokeball.json new file mode 100644 index 00000000000..8fa7a8d726b --- /dev/null +++ b/src/locales/en/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "Poké Ball", + "greatBall": "Great Ball", + "ultraBall": "Ultra Ball", + "rogueBall": "Rogue Ball", + "masterBall": "Master Ball", + "luxuryBall": "Luxury Ball" +} \ No newline at end of file diff --git a/src/locales/en/pokeball.ts b/src/locales/en/pokeball.ts deleted file mode 100644 index 01017cac46d..00000000000 --- a/src/locales/en/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Ball", - "greatBall": "Great Ball", - "ultraBall": "Ultra Ball", - "rogueBall": "Rogue Ball", - "masterBall": "Master Ball", - "luxuryBall": "Luxury Ball", -} as const; diff --git a/src/locales/en/pokemon-form-battle.json b/src/locales/en/pokemon-form-battle.json new file mode 100644 index 00000000000..63a7fb793bd --- /dev/null +++ b/src/locales/en/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "Primal {{pokemonName}}", + "gigantamax": "G-Max {{pokemonName}}", + "eternamax": "E-Max {{pokemonName}}", + "megaChange": "{{preName}} Mega Evolved\ninto {{pokemonName}}!", + "gigantamaxChange": "{{preName}} Gigantamaxed\ninto {{pokemonName}}!", + "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", + "revertChange": "{{pokemonName}} reverted\nto its original form!", + "formChange": "{{preName}} changed form!", + "disguiseChange": "Its disguise served it as a decoy!" +} \ No newline at end of file diff --git a/src/locales/en/pokemon-form.json b/src/locales/en/pokemon-form.json new file mode 100644 index 00000000000..ea7e0f60c90 --- /dev/null +++ b/src/locales/en/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cool Cosplay", + "pikachuBeautyCosplay": "Beauty Cosplay", + "pikachuCuteCosplay": "Cute Cosplay", + "pikachuSmartCosplay": "Smart Cosplay", + "pikachuToughCosplay": "Tough Cosplay", + "pikachuPartner": "Partner", + "eeveePartner": "Partner", + "pichuSpiky": "Spiky", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "Sunny", + "castformRainy": "Rainy", + "castformSnowy": "Snowy", + "deoxysNormal": "Normal", + "burmyPlant": "Plant", + "burmySandy": "Sandy", + "burmyTrash": "Trash", + "shellosEast": "East", + "shellosWest": "West", + "rotomHeat": "Heat", + "rotomWash": "Wash", + "rotomFrost": "Frost", + "rotomFan": "Fan", + "rotomMow": "Mow", + "giratinaAltered": "Altered", + "shayminLand": "Land", + "basculinRedStriped": "Red Striped", + "basculinBlueStriped": "Blue Striped", + "basculinWhiteStriped": "White Striped", + "deerlingSpring": "Spring", + "deerlingSummer": "Summer", + "deerlingAutumn": "Autumn", + "deerlingWinter": "Winter", + "tornadusIncarnate": "Incarnate", + "thundurusIncarnate": "Incarnate", + "landorusIncarnate": "Incarnate", + "keldeoOrdinary": "Ordinary", + "meloettaAria": "Aria", + "meloettaPirouette": "Pirouette", + "froakieBattleBond": "Battle Bond", + "scatterbugMeadow": "Meadow", + "scatterbugIcySnow": "Icy Snow", + "scatterbugPolar": "Polar", + "scatterbugTundra": "Tundra", + "scatterbugContinental": "Continental", + "scatterbugGarden": "Garden", + "scatterbugElegant": "Elegant", + "scatterbugModern": "Modern", + "scatterbugMarine": "Marine", + "scatterbugArchipelago": "Archipelago", + "scatterbugHighPlains": "High Plains", + "scatterbugSandstorm": "Sandstorm", + "scatterbugRiver": "River", + "scatterbugMonsoon": "Monsoon", + "scatterbugSavanna": "Savanna", + "scatterbugSun": "Sun", + "scatterbugOcean": "Ocean", + "scatterbugJungle": "Jungle", + "scatterbugFancy": "Fancy", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Red", + "flabebeYellow": "Yellow", + "flabebeOrange": "Orange", + "flabebeBlue": "Blue", + "flabebeWhite": "White", + "furfrouHeart": "Heart", + "furfrouStar": "Star", + "furfrouDiamond": "Diamond", + "furfrouDebutante": "Debutante", + "furfrouMatron": "Matron", + "furfrouDandy": "Dandy", + "furfrouLaReine": "La Reine", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Pharaoh", + "pumpkabooSmall": "Small", + "pumpkabooLarge": "Large", + "pumpkabooSuper": "Super", + "xerneasNeutral": "Neutral", + "xerneasActive": "Active", + "zygarde50": "50% Forme", + "zygarde10": "10% Forme", + "zygarde50Pc": "50% Forme Power Construct", + "zygarde10Pc": "10% Forme Power Construct", + "zygardeComplete": "Complete Forme", + "oricorioBaile": "Baile", + "oricorioPompom": "Pom-Pom", + "oricorioPau": "Pau", + "oricorioSensu": "Sensu", + "rockruffOwnTempo": "Own Tempo", + "miniorRedMeteor": "Red Meteor", + "miniorOrangeMeteor": "Orange Meteor", + "miniorYellowMeteor": "Yellow Meteor", + "miniorGreenMeteor": "Green Meteor", + "miniorBlueMeteor": "Blue Meteor", + "miniorIndigoMeteor": "Indigo Meteor", + "miniorVioletMeteor": "Violet Meteor", + "miniorRed": "Red", + "miniorOrange": "Orange", + "miniorYellow": "Yellow", + "miniorGreen": "Green", + "miniorBlue": "Blue", + "miniorIndigo": "Indigo", + "miniorViolet": "Violet", + "mimikyuDisguised": "Disguised", + "mimikyuBusted": "Busted", + "magearnaOriginal": "Original", + "marshadowZenith": "Zenith", + "sinisteaPhony": "Phony", + "sinisteaAntique": "Antique", + "eiscueNoIce": "No Ice", + "indeedeeMale": "Male", + "indeedeeFemale": "Female", + "morpekoFullBelly": "Full Belly", + "zacianHeroOfManyBattles": "Hero Of Many Battles", + "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "zarudeDada": "Dada", + "enamorusIncarnate": "Incarnate", + "squawkabillyGreenPlumage": "Green Plumage", + "squawkabillyBluePlumage": "Blue Plumage", + "squawkabillyYellowPlumage": "Yellow Plumage", + "squawkabillyWhitePlumage": "White Plumage", + "tatsugiriCurly": "Curly", + "tatsugiriDroopy": "Droopy", + "tatsugiriStretchy": "Stretchy", + "gimmighoulChest": "Chest", + "gimmighoulRoaming": "Roaming", + "koraidonApexBuild": "Apex Build", + "koraidonLimitedBuild": "Limited Build", + "koraidonSprintingBuild": "Sprinting Build", + "koraidonSwimmingBuild": "Swimming Build", + "koraidonGlidingBuild": "Gliding Build", + "miraidonUltimateMode": "Ultimate Mode", + "miraidonLowPowerMode": "Low Power Mode", + "miraidonDriveMode": "Drive Mode", + "miraidonAquaticMode": "Aquatic Mode", + "miraidonGlideMode": "Glide Mode", + "poltchageistCounterfeit": "Counterfeit", + "poltchageistArtisan": "Artisan", + "paldeaTaurosCombat": "Combat", + "paldeaTaurosBlaze": "Blaze", + "paldeaTaurosAqua": "Aqua" +} \ No newline at end of file diff --git a/src/locales/en/pokemon-info-container.json b/src/locales/en/pokemon-info-container.json new file mode 100644 index 00000000000..e4574e3cf3f --- /dev/null +++ b/src/locales/en/pokemon-info-container.json @@ -0,0 +1,7 @@ +{ + "moveset": "Moveset", + "gender": "Gender:", + "ability": "Ability:", + "nature": "Nature:", + "form": "Form:" +} \ No newline at end of file diff --git a/src/locales/en/pokemon-info-container.ts b/src/locales/en/pokemon-info-container.ts deleted file mode 100644 index 0d37b2ead62..00000000000 --- a/src/locales/en/pokemon-info-container.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Moveset", - "gender": "Gender:", - "ability": "Ability:", - "nature": "Nature:", - "epic": "Epic", - "rare": "Rare", - "common": "Common", - "form": "Form:" -} as const; diff --git a/src/locales/en/pokemon-info.ts b/src/locales/en/pokemon-info.json similarity index 77% rename from src/locales/en/pokemon-info.ts rename to src/locales/en/pokemon-info.json index f31fdac69ab..b79daaed621 100644 --- a/src/locales/en/pokemon-info.ts +++ b/src/locales/en/pokemon-info.json @@ -1,9 +1,7 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { +{ + "Stat": { "HP": "Max. HP", - "HPshortened": "MaxHP", + "HPshortened": "HP", "ATK": "Attack", "ATKshortened": "Atk", "DEF": "Defense", @@ -17,8 +15,7 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "ACC": "Accuracy", "EVA": "Evasiveness" }, - - Type: { + "Type": { "UNKNOWN": "Unknown", "NORMAL": "Normal", "FIGHTING": "Fighting", @@ -38,6 +35,6 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DRAGON": "Dragon", "DARK": "Dark", "FAIRY": "Fairy", - "STELLAR": "Stellar", - }, -} as const; + "STELLAR": "Stellar" + } +} diff --git a/src/locales/en/pokemon-summary.json b/src/locales/en/pokemon-summary.json new file mode 100644 index 00000000000..80e0cdab010 --- /dev/null +++ b/src/locales/en/pokemon-summary.json @@ -0,0 +1,44 @@ +{ + "pokemonInfo": "Pokémon Info", + "status": "Status", + "powerAccuracyCategory": "Power\nAccuracy\nCategory", + "type": "Type", + "unknownTrainer": "Unknown", + "ot": "OT", + "nature": "nature", + "expPoints": "Exp. Points", + "nextLv": "Next Lv.", + "cancel": "Cancel", + "memoString": "{{natureFragment}} nature,\n{{metFragment}}", + "metFragment": { + "normal": "met at Lv{{level}},\n{{biome}}.", + "apparently": "apparently met at Lv{{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/en/pokemon.ts b/src/locales/en/pokemon.json similarity index 99% rename from src/locales/en/pokemon.ts rename to src/locales/en/pokemon.json index 297bbcc3975..9185f749cfa 100644 --- a/src/locales/en/pokemon.ts +++ b/src/locales/en/pokemon.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { +{ "bulbasaur": "Bulbasaur", "ivysaur": "Ivysaur", "venusaur": "Venusaur", @@ -1082,5 +1080,5 @@ export const pokemon: SimpleTranslationEntries = { "hisui_decidueye": "Decidueye", "paldea_tauros": "Tauros", "paldea_wooper": "Wooper", - "bloodmoon_ursaluna": "Ursaluna", -} as const; + "bloodmoon_ursaluna": "Ursaluna" +} \ No newline at end of file diff --git a/src/locales/en/run-history.json b/src/locales/en/run-history.json new file mode 100644 index 00000000000..53596bdf629 --- /dev/null +++ b/src/locales/en/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "Victory!", + "defeatedWild": "Defeated by ", + "defeatedTrainer": "Defeated by ", + "defeatedTrainerDouble": "Defeated by Duo", + "defeatedRival": "Defeated by Rival", + "defeated": "Defeated", + "defeatedWild_female": "Defeated by ", + "defeatedTrainer_female": "Defeated by ", + "defeatedTrainerDouble_female": "Defeated by Duo", + "defeatedRival_female": "Defeated by Rival", + "defeated_female": "Defeated", + "luck": "Luck", + "score": "Score", + "mode": "Mode", + "challengeRules": "Rule(s)", + "challengeMonoGen1": "Gen I", + "challengeMonoGen2": "Gen II", + "challengeMonoGen3": "Gen III", + "challengeMonoGen4": "Gen IV", + "challengeMonoGen5": "Gen V", + "challengeMonoGen6": "Gen VI", + "challengeMonoGen7": "Gen VII", + "challengeMonoGen8": "Gen VIII", + "challengeMonoGen9": "Gen IX", + "playerItems": "Player Items", + "personalBest": "Personal Best!", + "SPDshortened": "Vel.", + "runInfo": "Run Info", + "money": "Money", + "runLength": "Run Length", + "viewHeldItems": "Held Items", + "hallofFameText": "Welcome to the Hall of Fame!", + "hallofFameText_female": "Welcome to the Hall of Fame!", + "viewHallOfFame": "View Hall of Fame!", + "viewEndingSplash": "View ending art!" +} diff --git a/src/locales/en/save-slot-select-ui-handler.json b/src/locales/en/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..2db02b09783 --- /dev/null +++ b/src/locales/en/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "Overwrite the data in the selected slot?", + "loading": "Loading...", + "wave": "Wave", + "lv": "Lv", + "empty": "Empty" +} \ No newline at end of file diff --git a/src/locales/en/save-slot-select-ui-handler.ts b/src/locales/en/save-slot-select-ui-handler.ts deleted file mode 100644 index f4efa3de734..00000000000 --- a/src/locales/en/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Overwrite the data in the selected slot?", - "loading": "Loading...", - "wave": "Wave", - "lv": "Lv", - "empty": "Empty", -} as const; diff --git a/src/locales/en/settings.ts b/src/locales/en/settings.json similarity index 90% rename from src/locales/en/settings.ts rename to src/locales/en/settings.json index f68a649269f..301ebea9b2b 100644 --- a/src/locales/en/settings.ts +++ b/src/locales/en/settings.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { +{ "boy": "Boy", "girl": "Girl", "general": "General", @@ -15,6 +13,7 @@ export const settings: SimpleTranslationEntries = { "skipSeenDialogues": "Skip Seen Dialogues", "battleStyle": "Battle Style", "enableRetries": "Enable Retries", + "hideIvs": "Hide IV scanner", "tutorials": "Tutorials", "touchControls": "Touch Controls", "vibrations": "Vibrations", @@ -62,7 +61,9 @@ export const settings: SimpleTranslationEntries = { "typeHints": "Type Hints", "masterVolume": "Master Volume", "bgmVolume": "BGM Volume", + "fieldVolume": "Field Volume", "seVolume": "SE Volume", + "uiVolume": "UI Volume", "musicPreference": "Music Preference", "mixed": "Mixed", "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", @@ -96,4 +97,11 @@ export const settings: SimpleTranslationEntries = { "controller": "Controller", "gamepadSupport": "Gamepad Support", "showBgmBar": "Show Music Names", -} as const; + "moveTouchControls": "Move Touch Controls", + "shopOverlayOpacity": "Shop Overlay Opacity", + "shopCursorTarget": "Shop Cursor Target", + "rewards": "Rewards", + "reroll": "Reroll", + "shop": "Shop", + "checkTeam": "Check Team" +} diff --git a/src/locales/en/splash-messages.ts b/src/locales/en/splash-messages.json similarity index 91% rename from src/locales/en/splash-messages.ts rename to src/locales/en/splash-messages.json index 17eafc2d6d6..c0686e6ad75 100644 --- a/src/locales/en/splash-messages.ts +++ b/src/locales/en/splash-messages.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { +{ "battlesWon": "Battles Won!", "joinTheDiscord": "Join the Discord!", "infiniteLevels": "Infinite Levels!", @@ -34,4 +32,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Also Try Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", -} as const; + "breedersInSpace": "Breeders in space!" +} \ No newline at end of file diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.json similarity index 70% rename from src/locales/en/starter-select-ui-handler.ts rename to src/locales/en/starter-select-ui-handler.json index ac59785bab7..f578f128bee 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.json @@ -1,12 +1,7 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"Begin with these Pokémon?", +{ + "confirmStartTeam": "Begin with these Pokémon?", + "confirmExit": "Do you want to exit?", + "invalidParty": "This is not a valid starting party!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -22,9 +17,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Nature:", "eggMoves": "Egg Moves", "addToParty": "Add to Party", + "removeFromParty": "Remove from Party", "toggleIVs": "Toggle IVs", "manageMoves": "Manage Moves", "manageNature": "Manage Nature", + "addToFavorites": "Add to Favorites", + "removeFromFavorites": "Remove from Favorites", "useCandies": "Use Candies", "selectNature": "Select nature.", "selectMoveSwapOut": "Select a move to swap out.", @@ -38,9 +36,10 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "cycleAbility": ": Ability", "cycleNature": ": Nature", "cycleVariant": ": Variant", + "goFilter": ": Go to filters", "enablePassive": "Enable Passive", "disablePassive": "Disable Passive", "locked": "Locked", "disabled": "Disabled", "uncaught": "Uncaught" -}; +} \ No newline at end of file diff --git a/src/locales/en/status-effect.json b/src/locales/en/status-effect.json new file mode 100644 index 00000000000..fdbacfdb9be --- /dev/null +++ b/src/locales/en/status-effect.json @@ -0,0 +1,65 @@ +{ + "none": { + "name": "None", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + }, + "poison": { + "name": "Poison", + "description": "poisoning", + "obtain": "{{pokemonNameWithAffix}}\nwas poisoned!", + "obtainSource": "{{pokemonNameWithAffix}}\nwas poisoned by the {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} is hurt\nby poison!", + "overlap": "{{pokemonNameWithAffix}} is\nalready poisoned!", + "heal": "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + "toxic": { + "name": "Toxic", + "description": "poisoning", + "obtain": "{{pokemonNameWithAffix}}\nwas badly poisoned!", + "obtainSource": "{{pokemonNameWithAffix}}\nwas badly poisoned by the {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} is hurt\nby poison!", + "overlap": "{{pokemonNameWithAffix}} is\nalready poisoned!", + "heal": "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + "paralysis": { + "name": "Paralysis", + "description": "paralysis", + "obtain": "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", + "obtainSource": "{{pokemonNameWithAffix}} was paralyzed by the {{sourceText}}!\nIt may be unable to move!", + "activation": "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", + "overlap": "{{pokemonNameWithAffix}} is\nalready paralyzed!", + "heal": "{{pokemonNameWithAffix}} was\nhealed of paralysis!" + }, + "sleep": { + "name": "Sleep", + "description": "sleep", + "obtain": "{{pokemonNameWithAffix}}\nfell asleep!", + "obtainSource": "{{pokemonNameWithAffix}}\nfell asleep from the {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} is fast asleep.", + "overlap": "{{pokemonNameWithAffix}} is\nalready asleep!", + "heal": "{{pokemonNameWithAffix}} woke up!" + }, + "freeze": { + "name": "Freeze", + "description": "freezing", + "obtain": "{{pokemonNameWithAffix}}\nwas frozen solid!", + "obtainSource": "{{pokemonNameWithAffix}}\nwas frozen solid by the {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} is\nfrozen solid!", + "overlap": "{{pokemonNameWithAffix}} is\nalready frozen!", + "heal": "{{pokemonNameWithAffix}} was\ndefrosted!" + }, + "burn": { + "name": "Burn", + "description": "burn", + "obtain": "{{pokemonNameWithAffix}}\nwas burned!", + "obtainSource": "{{pokemonNameWithAffix}}\nwas burned by the {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} is hurt\nby its burn!", + "overlap": "{{pokemonNameWithAffix}} is\nalready burned!", + "heal": "{{pokemonNameWithAffix}} was\nhealed of its burn!" + } +} diff --git a/src/locales/en/status-effect.ts b/src/locales/en/status-effect.ts deleted file mode 100644 index 162b2ada281..00000000000 --- a/src/locales/en/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "None", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "Poison", - description: "poisoning", - obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", - overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", - heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" - }, - toxic: { - name: "Toxic", - description: "poisoning", - obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", - overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", - heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" - }, - paralysis: { - name: "Paralysis", - description: "paralysis", - obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", - obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}}!\nIt may be unable to move!", - activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", - overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", - heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" - }, - sleep: { - name: "Sleep", - description: "sleep", - obtain: "{{pokemonNameWithAffix}}\nfell asleep!", - obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is fast asleep.", - overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", - heal: "{{pokemonNameWithAffix}} woke up!" - }, - freeze: { - name: "Freeze", - description: "freezing", - obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", - obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", - overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", - heal: "{{pokemonNameWithAffix}} was\ndefrosted!" - }, - burn: { - name: "Burn", - description: "burn", - obtain: "{{pokemonNameWithAffix}}\nwas burned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", - overlap: "{{pokemonNameWithAffix}} is\nalready burned!", - heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" - }, -} as const; diff --git a/src/locales/en/terrain.json b/src/locales/en/terrain.json new file mode 100644 index 00000000000..4619ecdf111 --- /dev/null +++ b/src/locales/en/terrain.json @@ -0,0 +1,16 @@ +{ + "misty": "Misty", + "mistyStartMessage": "Mist swirled around the battlefield!", + "mistyClearMessage": "The mist disappeared from the battlefield.", + "mistyBlockMessage": "{{pokemonNameWithAffix}} surrounds itself with a protective mist!", + "electric": "Electric", + "electricStartMessage": "An electric current ran across the battlefield!", + "electricClearMessage": "The electricity disappeared from the battlefield.", + "grassy": "Grassy", + "grassyStartMessage": "Grass grew to cover the battlefield!", + "grassyClearMessage": "The grass disappeared from the battlefield.", + "psychic": "Psychic", + "psychicStartMessage": "The battlefield got weird!", + "psychicClearMessage": "The weirdness disappeared from the battlefield!", + "defaultBlockMessage": "{{pokemonNameWithAffix}} is protected by the {{terrainName}} Terrain!" +} \ No newline at end of file diff --git a/src/locales/en/trainer-classes.json b/src/locales/en/trainer-classes.json new file mode 100644 index 00000000000..9e30915dee6 --- /dev/null +++ b/src/locales/en/trainer-classes.json @@ -0,0 +1,130 @@ +{ + "ace_trainer": "Ace Trainer", + "ace_trainer_female": "Ace Trainer", + "ace_duo": "Ace Duo", + "artist": "Artist", + "artist_female": "Artist", + "backers": "Backers", + "backpacker": "Backpacker", + "backpacker_female": "Backpacker", + "backpackers": "Backpackers", + "baker": "Baker", + "battle_girl": "Battle Girl", + "beauty": "Beauty", + "beginners": "Beginners", + "biker": "Biker", + "black_belt": "Black Belt", + "breeder": "Breeder", + "breeder_female": "Breeder", + "breeders": "Breeders", + "clerk": "Clerk", + "clerk_female": "Clerk", + "colleagues": "Colleagues", + "crush_kin": "Crush Kin", + "cyclist": "Cyclist", + "cyclist_female": "Cyclist", + "cyclists": "Cyclists", + "dancer": "Dancer", + "dancer_female": "Dancer", + "depot_agent": "Depot Agent", + "doctor": "Doctor", + "doctor_female": "Doctor", + "firebreather": "Firebreather", + "fisherman": "Fisherman", + "fisherman_female": "Fisherman", + "gentleman": "Gentleman", + "guitarist": "Guitarist", + "guitarist_female": "Guitarist", + "harlequin": "Harlequin", + "hiker": "Hiker", + "hooligans": "Hooligans", + "hoopster": "Hoopster", + "infielder": "Infielder", + "janitor": "Janitor", + "lady": "Lady", + "lass": "Lass", + "linebacker": "Linebacker", + "maid": "Maid", + "madame": "Madame", + "medical_team": "Medical Team", + "musician": "Musician", + "hex_maniac": "Hex Maniac", + "nurse": "Nurse", + "nursery_aide": "Nursery Aide", + "officer": "Officer", + "parasol_lady": "Parasol Lady", + "pilot": "Pilot", + "pokéfan": "Poké Fan", + "pokéfan_female": "Poké Fan", + "pokéfan_family": "Poké Fan Family", + "preschooler": "Preschooler", + "preschooler_female": "Preschooler", + "preschoolers": "Preschoolers", + "psychic": "Psychic", + "psychic_female": "Psychic", + "psychics": "Psychics", + "pokémon_ranger": "Pokémon Ranger", + "pokémon_ranger_female": "Pokémon Ranger", + "pokémon_rangers": "Pokémon Ranger", + "ranger": "Ranger", + "restaurant_staff": "Restaurant Staff", + "rich": "Rich", + "rich_female": "Rich", + "rich_boy": "Rich Boy", + "rich_couple": "Rich Couple", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", + "rich_kids": "Rich Kids", + "roughneck": "Roughneck", + "sailor": "Sailor", + "scientist": "Scientist", + "scientist_female": "Scientist", + "scientists": "Scientists", + "smasher": "Smasher", + "snow_worker": "Snow Worker", + "snow_worker_female": "Snow Worker", + "striker": "Striker", + "school_kid": "School Kid", + "school_kid_female": "School Kid", + "school_kids": "School Kids", + "swimmer": "Swimmer", + "swimmer_female": "Swimmer", + "swimmers": "Swimmers", + "twins": "Twins", + "veteran": "Veteran", + "veteran_female": "Veteran", + "veteran_duo": "Veteran Duo", + "waiter": "Waiter", + "waitress": "Waitress", + "worker": "Worker", + "worker_female": "Worker", + "workers": "Workers", + "youngster": "Youngster", + "rocket_grunt": "Rocket Grunt", + "rocket_grunts": "Rocket Grunts", + "rocket_grunt_female": "Rocket Grunt", + "magma_grunt": "Magma Grunt", + "magma_grunt_female": "Magma Grunt", + "magma_grunts": "Magma Grunts", + "aqua_grunt": "Aqua Grunt", + "aqua_grunt_female": "Aqua Grunt", + "aqua_grunts": "Aqua Grunts", + "galactic_grunt": "Galactic Grunt", + "galactic_grunt_female": "Galactic Grunt", + "galactic_grunts": "Galactic Grunts", + "plasma_grunt": "Plasma Grunt", + "plasma_grunt_female": "Plasma Grunt", + "plasma_grunts": "Plasma Grunts", + "flare_grunt": "Flare Grunt", + "flare_grunt_female": "Flare Grunt", + "flare_grunts": "Flare Grunts", + "aether_grunt": "Aether Foundation Employee", + "aether_grunt_female": "Aether Foundation Employee", + "aether_grunts": "Aether Foundation Employees", + "skull_grunt": "Team Skull Grunt", + "skull_grunt_female": "Team Skull Grunt", + "skull_grunts": "Team Skull Grunts", + "macro_grunt": "Macro Cosmos Trainer", + "macro_grunt_female": "Macro Cosmos Trainer", + "macro_grunts": "Macro Cosmos Trainers" +} diff --git a/src/locales/en/trainer-names.json b/src/locales/en/trainer-names.json new file mode 100644 index 00000000000..50a2ce18f34 --- /dev/null +++ b/src/locales/en/trainer-names.json @@ -0,0 +1,164 @@ +{ + "brock": "Brock", + "misty": "Misty", + "lt_surge": "Lt Surge", + "erika": "Erika", + "janine": "Janine", + "sabrina": "Sabrina", + "blaine": "Blaine", + "giovanni": "Giovanni", + "falkner": "Falkner", + "bugsy": "Bugsy", + "whitney": "Whitney", + "morty": "Morty", + "chuck": "Chuck", + "jasmine": "Jasmine", + "pryce": "Pryce", + "clair": "Clair", + "roxanne": "Roxanne", + "brawly": "Brawly", + "wattson": "Wattson", + "flannery": "Flannery", + "norman": "Norman", + "winona": "Winona", + "tate": "Tate", + "liza": "Liza", + "juan": "Juan", + "roark": "Roark", + "gardenia": "Gardenia", + "maylene": "Maylene", + "crasher_wake": "Crasher Wake", + "fantina": "Fantina", + "byron": "Byron", + "candice": "Candice", + "volkner": "Volkner", + "cilan": "Cilan", + "chili": "Chili", + "cress": "Cress", + "cheren": "Cheren", + "lenora": "Lenora", + "roxie": "Roxie", + "burgh": "Burgh", + "elesa": "Elesa", + "clay": "Clay", + "skyla": "Skyla", + "brycen": "Brycen", + "drayden": "Drayden", + "marlon": "Marlon", + "viola": "Viola", + "grant": "Grant", + "korrina": "Korrina", + "ramos": "Ramos", + "clemont": "Clemont", + "valerie": "Valerie", + "olympia": "Olympia", + "wulfric": "Wulfric", + "milo": "Milo", + "nessa": "Nessa", + "kabu": "Kabu", + "bea": "Bea", + "allister": "Allister", + "opal": "Opal", + "bede": "Bede", + "gordie": "Gordie", + "melony": "Melony", + "piers": "Piers", + "marnie": "Marnie", + "raihan": "Raihan", + "katy": "Katy", + "brassius": "Brassius", + "iono": "Iono", + "kofu": "Kofu", + "larry": "Larry", + "ryme": "Ryme", + "tulip": "Tulip", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agatha", + "lance": "Lance", + "will": "Will", + "koga": "Koga", + "karen": "Karen", + "sidney": "Sidney", + "phoebe": "Phoebe", + "glacia": "Glacia", + "drake": "Drake", + "aaron": "Aaron", + "bertha": "Bertha", + "flint": "Flint", + "lucian": "Lucian", + "shauntal": "Shauntal", + "marshal": "Marshal", + "grimsley": "Grimsley", + "caitlin": "Caitlin", + "malva": "Malva", + "siebold": "Siebold", + "wikstrom": "Wikstrom", + "drasna": "Drasna", + "hala": "Hala", + "molayne": "Molayne", + "olivia": "Olivia", + "acerola": "Acerola", + "kahili": "Kahili", + "rika": "Rika", + "poppy": "Poppy", + "hassel": "Hassel", + "crispin": "Crispin", + "amarys": "Amarys", + "lacey": "Lacey", + "drayton": "Drayton", + "blue": "Blue", + "red": "Red", + "steven": "Steven", + "wallace": "Wallace", + "cynthia": "Cynthia", + "alder": "Alder", + "iris": "Iris", + "diantha": "Diantha", + "hau": "Hau", + "geeta": "Geeta", + "nemona": "Nemona", + "kieran": "Kieran", + "leon": "Leon", + "rival": "Finn", + "rival_female": "Ivy", + "archer": "Archer", + "ariana": "Ariana", + "proton": "Proton", + "petrel": "Petrel", + "tabitha": "Tabitha", + "courtney": "Courtney", + "shelly": "Shelly", + "matt": "Matt", + "mars": "Mars", + "jupiter": "Jupiter", + "saturn": "Saturn", + "zinzolin": "Zinzolin", + "rood": "Rood", + "xerosic": "Xerosic", + "bryony": "Bryony", + "faba": "Faba", + "plumeria": "Plumeria", + "oleana": "Oleana", + + "maxie": "Maxie", + "archie": "Archie", + "cyrus": "Cyrus", + "ghetsis": "Ghetsis", + "lysandre": "Lysandre", + "lusamine": "Lusamine", + "guzma": "Guzma", + "rose": "Rose", + + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie" +} diff --git a/src/locales/en/trainer-titles.json b/src/locales/en/trainer-titles.json new file mode 100644 index 00000000000..b9c919022be --- /dev/null +++ b/src/locales/en/trainer-titles.json @@ -0,0 +1,38 @@ +{ + "elite_four": "Elite Four", + "elite_four_female": "Elite Four", + "gym_leader": "Gym Leader", + "gym_leader_female": "Gym Leader", + "gym_leader_double": "Gym Leader Duo", + "champion": "Champion", + "champion_female": "Champion", + "champion_double": "Champion Duo", + "rival": "Rival", + "professor": "Professor", + "frontier_brain": "Frontier Brain", + "rocket_boss": "Team Rocket Boss", + "magma_boss": "Team Magma Boss", + "aqua_boss": "Team Aqua Boss", + "galactic_boss": "Team Galactic Boss", + "plasma_boss": "Team Plasma Boss", + "flare_boss": "Team Flare Boss", + "aether_boss": "Aether President", + "skull_boss": "Team Skull Boss", + "macro_boss": "Macro Cosmos President", + + "rocket_admin": "Team Rocket Admin", + "rocket_admin_female": "Team Rocket Admin", + "magma_admin": "Team Magma Admin", + "magma_admin_female": "Team Magma Admin", + "aqua_admin": "Team Aqua Admin", + "aqua_admin_female": "Team Aqua Admin", + "galactic_commander": "Team Galactic Commander", + "galactic_commander_female": "Team Galactic Commander", + "plasma_sage": "Team Plasma Sage", + "plasma_admin": "Team Plasma Admin", + "flare_admin": "Team Flare Admin", + "flare_admin_female": "Team Flare Admin", + "aether_admin": "Aether Foundation Admin", + "skull_admin": "Team Skull Admin", + "macro_admin": "Macro Cosmos" +} diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts deleted file mode 100644 index b59cfdc4fda..00000000000 --- a/src/locales/en/trainers.ts +++ /dev/null @@ -1,285 +0,0 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "elite_four": "Elite Four", - "elite_four_female": "Elite Four", - "gym_leader": "Gym Leader", - "gym_leader_female": "Gym Leader", - "gym_leader_double": "Gym Leader Duo", - "champion": "Champion", - "champion_female": "Champion", - "champion_double": "Champion Duo", - "rival": "Rival", - "professor": "Professor", - "frontier_brain": "Frontier Brain", - "rocket_boss": "Team Rocket Boss", - "magma_boss": "Team Magma Boss", - "aqua_boss": "Team Aqua Boss", - "galactic_boss": "Team Galactic Boss", - "plasma_boss": "Team Plasma Boss", - "flare_boss": "Team Flare Boss", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Ace Trainer", - "ace_trainer_female": "Ace Trainer", - "ace_duo": "Ace Duo", - "artist": "Artist", - "artist_female": "Artist", - "backers": "Backers", - "backpacker": "Backpacker", - "backpacker_female": "Backpacker", - "backpackers": "Backpackers", - "baker": "Baker", - "battle_girl": "Battle Girl", - "beauty": "Beauty", - "beginners": "Beginners", - "biker": "Biker", - "black_belt": "Black Belt", - "breeder": "Breeder", - "breeder_female": "Breeder", - "breeders": "Breeders", - "clerk": "Clerk", - "clerk_female": "Clerk", - "colleagues": "Colleagues", - "crush_kin": "Crush Kin", - "cyclist": "Cyclist", - "cyclist_female": "Cyclist", - "cyclists": "Cyclists", - "dancer": "Dancer", - "dancer_female": "Dancer", - "depot_agent": "Depot Agent", - "doctor": "Doctor", - "doctor_female": "Doctor", - "firebreather": "Firebreather", - "fisherman": "Fisherman", - "fisherman_female": "Fisherman", - "gentleman": "Gentleman", - "guitarist": "Guitarist", - "guitarist_female": "Guitarist", - "harlequin": "Harlequin", - "hiker": "Hiker", - "hooligans": "Hooligans", - "hoopster": "Hoopster", - "infielder": "Infielder", - "janitor": "Janitor", - "lady": "Lady", - "lass": "Lass", - "linebacker": "Linebacker", - "maid": "Maid", - "madame": "Madame", - "medical_team": "Medical Team", - "musician": "Musician", - "hex_maniac": "Hex Maniac", - "nurse": "Nurse", - "nursery_aide": "Nursery Aide", - "officer": "Officer", - "parasol_lady": "Parasol Lady", - "pilot": "Pilot", - "pokéfan": "Poké Fan", - "pokéfan_female": "Poké Fan", - "pokéfan_family": "Poké Fan Family", - "preschooler": "Preschooler", - "preschooler_female": "Preschooler", - "preschoolers": "Preschoolers", - "psychic": "Psychic", - "psychic_female": "Psychic", - "psychics": "Psychics", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_ranger_female": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Ranger", - "ranger": "Ranger", - "restaurant_staff": "Restaurant Staff", - "rich": "Rich", - "rich_female": "Rich", - "rich_boy": "Rich Boy", - "rich_couple": "Rich Couple", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", - "rich_kids": "Rich Kids", - "roughneck": "Roughneck", - "sailor": "Sailor", - "scientist": "Scientist", - "scientist_female": "Scientist", - "scientists": "Scientists", - "smasher": "Smasher", - "snow_worker": "Snow Worker", - "snow_worker_female": "Snow Worker", - "striker": "Striker", - "school_kid": "School Kid", - "school_kid_female": "School Kid", - "school_kids": "School Kids", - "swimmer": "Swimmer", - "swimmer_female": "Swimmer", - "swimmers": "Swimmers", - "twins": "Twins", - "veteran": "Veteran", - "veteran_female": "Veteran", - "veteran_duo": "Veteran Duo", - "waiter": "Waiter", - "waitress": "Waitress", - "worker": "Worker", - "worker_female": "Worker", - "workers": "Workers", - "youngster": "Youngster", - "rocket_grunt": "Rocket Grunt", - "rocket_grunt_female": "Rocket Grunt", - "magma_grunt": "Magma Grunt", - "magma_grunt_female": "Magma Grunt", - "aqua_grunt": "Aqua Grunt", - "aqua_grunt_female": "Aqua Grunt", - "galactic_grunt": "Galactic Grunt", - "galactic_grunt_female": "Galactic Grunt", - "plasma_grunt": "Plasma Grunt", - "plasma_grunt_female": "Plasma Grunt", - "flare_grunt": "Flare Grunt", - "flare_grunt_female": "Flare Grunt", -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Lt Surge", - "erika": "Erika", - "janine": "Janine", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Falkner", - "bugsy": "Bugsy", - "whitney": "Whitney", - "morty": "Morty", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Pryce", - "clair": "Clair", - "roxanne": "Roxanne", - "brawly": "Brawly", - "wattson": "Wattson", - "flannery": "Flannery", - "norman": "Norman", - "winona": "Winona", - "tate": "Tate", - "liza": "Liza", - "juan": "Juan", - "roark": "Roark", - "gardenia": "Gardenia", - "maylene": "Maylene", - "crasher_wake": "Crasher Wake", - "fantina": "Fantina", - "byron": "Byron", - "candice": "Candice", - "volkner": "Volkner", - "cilan": "Cilan", - "chili": "Chili", - "cress": "Cress", - "cheren": "Cheren", - "lenora": "Lenora", - "roxie": "Roxie", - "burgh": "Burgh", - "elesa": "Elesa", - "clay": "Clay", - "skyla": "Skyla", - "brycen": "Brycen", - "drayden": "Drayden", - "marlon": "Marlon", - "viola": "Viola", - "grant": "Grant", - "korrina": "Korrina", - "ramos": "Ramos", - "clemont": "Clemont", - "valerie": "Valerie", - "olympia": "Olympia", - "wulfric": "Wulfric", - "milo": "Milo", - "nessa": "Nessa", - "kabu": "Kabu", - "bea": "Bea", - "allister": "Allister", - "opal": "Opal", - "bede": "Bede", - "gordie": "Gordie", - "melony": "Melony", - "piers": "Piers", - "marnie": "Marnie", - "raihan": "Raihan", - "katy": "Katy", - "brassius": "Brassius", - "iono": "Iono", - "kofu": "Kofu", - "larry": "Larry", - "ryme": "Ryme", - "tulip": "Tulip", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Will", - "koga": "Koga", - "karen": "Karen", - "sidney": "Sidney", - "phoebe": "Phoebe", - "glacia": "Glacia", - "drake": "Drake", - "aaron": "Aaron", - "bertha": "Bertha", - "flint": "Flint", - "lucian": "Lucian", - "shauntal": "Shauntal", - "marshal": "Marshal", - "grimsley": "Grimsley", - "caitlin": "Caitlin", - "malva": "Malva", - "siebold": "Siebold", - "wikstrom": "Wikstrom", - "drasna": "Drasna", - "hala": "Hala", - "molayne": "Molayne", - "olivia": "Olivia", - "acerola": "Acerola", - "kahili": "Kahili", - "rika": "Rika", - "poppy": "Poppy", - "hassel": "Hassel", - "crispin": "Crispin", - "amarys": "Amarys", - "lacey": "Lacey", - "drayton": "Drayton", - "blue": "Blue", - "red": "Red", - "steven": "Steven", - "wallace": "Wallace", - "cynthia": "Cynthia", - "alder": "Alder", - "iris": "Iris", - "diantha": "Diantha", - "hau": "Hau", - "geeta": "Geeta", - "nemona": "Nemona", - "kieran": "Kieran", - "leon": "Leon", - "rival": "Finn", - "rival_female": "Ivy", - "maxie": "Maxie", - "archie": "Archie", - "cyrus": "Cyrus", - "ghetsis": "Ghetsis", - "lysandre": "Lysandre", - - // Double Names - "blue_red_double": "Blue & Red", - "red_blue_double": "Red & Blue", - "tate_liza_double": "Tate & Liza", - "liza_tate_double": "Liza & Tate", - "steven_wallace_double": "Steven & Wallace", - "wallace_steven_double": "Wallace & Steven", - "alder_iris_double": "Alder & Iris", - "iris_alder_double": "Iris & Alder", - "marnie_piers_double": "Marnie & Piers", - "piers_marnie_double": "Piers & Marnie", -} as const; diff --git a/src/locales/en/tutorial.json b/src/locales/en/tutorial.json new file mode 100644 index 00000000000..4c43f1fd896 --- /dev/null +++ b/src/locales/en/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements.\n$This game is not monetized and we claim no ownership of Pokémon nor of the copyrighted assets used.\n$The game is a work in progress, but fully playable.\nFor bug reports, please use the Discord community.\n$If the game runs slowly, please ensure 'Hardware Acceleration' is turned on in your browser settings.", + "accessMenu": "To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.", + "menu": "From this menu you can access the settings.\n$From the settings you can change game speed, window style, and other options.\n$There are also various other features here, so be sure to check them all!", + "starterSelect": "From this screen, you can select your starters by pressing\nZ or the Space bar. These are your initial party members.\n$Each starter has a value. Your party can have up to\n6 members as long as the total does not exceed 10.\n$You can also select gender, ability, and form depending on\nthe variants you've caught or hatched.\n$The IVs for a species are also the best of every one you've\ncaught or hatched, so try to get lots of the same species!", + "pokerus": "A daily random 3 selectable starters have a purple border.\n$If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!", + "statChange": "Stat changes persist across battles as long as your Pokémon aren't recalled.\n$Your Pokémon are recalled before a trainer battle and before entering a new biome.\n$You can view the stat changes for any Pokémon on the field by holding C or Shift.\n$You can also view the moveset for an enemy Pokémon by holding V.\n$This only reveals moves that you've seen the Pokémon use this battle.", + "selectItem": "After every battle, you are given a choice of 3 random items.\nYou may only pick one.\n$These range from consumables, to Pokémon held items, to passive permanent items.\n$Most non-consumable item effects will stack in various ways.\n$Some items will only show up if they can be used, such as evolution items.\n$You can also transfer held items between Pokémon using the transfer option.\n$The transfer option will appear in the bottom right once you have obtained a held item.\n$You may purchase consumable items with money, and a larger variety will be available the further you get.\n$Be sure to buy these before you pick your random item, as it will progress to the next battle once you do.", + "eggGacha": "From this screen, you can redeem your vouchers for\nPokémon eggs.\n$Eggs have to be hatched and get closer to hatching after\nevery battle. Rarer eggs take longer to hatch.\n$Hatched Pokémon also won't be added to your party, they will\nbe added to your starters.\n$Pokémon hatched from eggs generally have better IVs than\nwild Pokémon.\n$Some Pokémon can only even be obtained from eggs.\n$There are 3 different machines to pull from with different\nbonuses, so pick the one that suits you best!" +} \ No newline at end of file diff --git a/src/locales/en/tutorial.ts b/src/locales/en/tutorial.ts deleted file mode 100644 index 3c4aa2b46f6..00000000000 --- a/src/locales/en/tutorial.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - "intro": `Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements. - $This game is not monetized and we claim no ownership of Pokémon nor of the copyrighted assets used. - $The game is a work in progress, but fully playable.\nFor bug reports, please use the Discord community. - $If the game runs slowly, please ensure 'Hardware Acceleration' is turned on in your browser settings.`, - - "accessMenu": "To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.", - - "menu": `From this menu you can access the settings. - $From the settings you can change game speed, window style, and other options. - $There are also various other features here, so be sure to check them all!`, - - "starterSelect": `From this screen, you can select your starters by pressing\nZ or the Space bar. These are your initial party members. - $Each starter has a value. Your party can have up to\n6 members as long as the total does not exceed 10. - $You can also select gender, ability, and form depending on\nthe variants you've caught or hatched. - $The IVs for a species are also the best of every one you've\ncaught or hatched, so try to get lots of the same species!`, - - "pokerus": `A daily random 3 selectable starters have a purple border. - $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, - - "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. - $Your Pokémon are recalled before a trainer battle and before entering a new biome. - $You can view the stat changes for any Pokémon on the field by holding C or Shift. - $You can also view the moveset for an enemy Pokémon by holding V. - $This only reveals moves that you've seen the Pokémon use this battle.`, - - "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. - $These range from consumables, to Pokémon held items, to passive permanent items. - $Most non-consumable item effects will stack in various ways. - $Some items will only show up if they can be used, such as evolution items. - $You can also transfer held items between Pokémon using the transfer option. - $The transfer option will appear in the bottom right once you have obtained a held item. - $You may purchase consumable items with money, and a larger variety will be available the further you get. - $Be sure to buy these before you pick your random item, as it will progress to the next battle once you do.`, - - "eggGacha": `From this screen, you can redeem your vouchers for\nPokémon eggs. - $Eggs have to be hatched and get closer to hatching after\nevery battle. Rarer eggs take longer to hatch. - $Hatched Pokémon also won't be added to your party, they will\nbe added to your starters. - $Pokémon hatched from eggs generally have better IVs than\nwild Pokémon. - $Some Pokémon can only even be obtained from eggs. - $There are 3 different machines to pull from with different\nbonuses, so pick the one that suits you best!`, -} as const; diff --git a/src/locales/en/voucher.ts b/src/locales/en/voucher.json similarity index 63% rename from src/locales/en/voucher.ts rename to src/locales/en/voucher.json index 57db5fe767f..a92f589870c 100644 --- a/src/locales/en/voucher.ts +++ b/src/locales/en/voucher.json @@ -1,11 +1,9 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { - "vouchers": "Vouchers", - "eggVoucher": "Egg Voucher", - "eggVoucherPlus": "Egg Voucher Plus", - "eggVoucherPremium": "Egg Voucher Premium", - "eggVoucherGold": "Egg Voucher Gold", - "locked": "Locked", - "defeatTrainer": "Defeat {{trainerName}}" -} as const; +{ + "vouchers": "Vouchers", + "eggVoucher": "Egg Voucher", + "eggVoucherPlus": "Egg Voucher Plus", + "eggVoucherPremium": "Egg Voucher Premium", + "eggVoucherGold": "Egg Voucher Gold", + "locked": "Locked", + "defeatTrainer": "Defeat {{trainerName}}" +} \ No newline at end of file diff --git a/src/locales/en/weather.ts b/src/locales/en/weather.json similarity index 87% rename from src/locales/en/weather.ts rename to src/locales/en/weather.json index f50c1ee907e..10b6efe9828 100644 --- a/src/locales/en/weather.ts +++ b/src/locales/en/weather.json @@ -1,44 +1,32 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { +{ "sunnyStartMessage": "The sunlight got bright!", "sunnyLapseMessage": "The sunlight is strong.", "sunnyClearMessage": "The sunlight faded.", - "rainStartMessage": "A downpour started!", "rainLapseMessage": "The downpour continues.", "rainClearMessage": "The rain stopped.", - "sandstormStartMessage": "A sandstorm brewed!", "sandstormLapseMessage": "The sandstorm rages.", "sandstormClearMessage": "The sandstorm subsided.", "sandstormDamageMessage": "{{pokemonNameWithAffix}} is buffeted\nby the sandstorm!", - "hailStartMessage": "It started to hail!", "hailLapseMessage": "Hail continues to fall.", "hailClearMessage": "The hail stopped.", "hailDamageMessage": "{{pokemonNameWithAffix}} is pelted\nby the hail!", - "snowStartMessage": "It started to snow!", "snowLapseMessage": "The snow is falling down.", "snowClearMessage": "The snow stopped.", - "fogStartMessage": "A thick fog emerged!", "fogLapseMessage": "The fog continues.", "fogClearMessage": "The fog disappeared.", - "heavyRainStartMessage": "A heavy downpour started!", "heavyRainLapseMessage": "The heavy downpour continues.", "heavyRainClearMessage": "The heavy rain stopped.", - "harshSunStartMessage": "The sunlight got hot!", "harshSunLapseMessage": "The sun is scorching hot.", "harshSunClearMessage": "The harsh sunlight faded.", - "strongWindsStartMessage": "A heavy wind began!", "strongWindsLapseMessage": "The wind blows intensely.", + "strongWindsEffectMessage": "The mysterious air current weakened the attack!", "strongWindsClearMessage": "The heavy wind stopped." -}; +} \ No newline at end of file diff --git a/src/locales/es/ability-trigger.json b/src/locales/es/ability-trigger.json new file mode 100644 index 00000000000..4380c84b8e9 --- /dev/null +++ b/src/locales/es/ability-trigger.json @@ -0,0 +1,64 @@ +{ + "blockRecoilDamage": "¡{{abilityName}} de {{pokemonName}}\nlo protegió del daño de retroceso!", + "badDreams": "¡{{pokemonName}} está atormentado!", + "costar": "¡{{pokemonName}} copió los cambios de características de {{allyName}}!", + "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", + "perishBody": "¡{{abilityName}} de {{pokemonName}} debilitará a ambos Pokémon en 3 turnos!", + "poisonHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "trace": "¡{{pokemonName}} ha copiado la habilidad {{abilityName}} \nde {{targetName}}!", + "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", + "quickDraw": "¡{{pokemonName}} ataca primero gracias a la habilidad Mano Rápida!", + "disguiseAvoidedDamage": "¡El disfraz de {{pokemonNameWithAffix}} se ha roto!", + "blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!", + "typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!", + "fullHpResistType": "¡{{pokemonNameWithAffix}} ha hecho brillar su caparazón\ny ha alterado su compatibilidad entre tipos!", + "moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!", + "reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!", + "postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!", + "postDefendContactDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} ha herido a su atacante!", + "postDefendAbilitySwap": "¡{{pokemonNameWithAffix}} intercambió su habilidad con su objetivo!", + "postDefendAbilityGive": "¡{{pokemonNameWithAffix}} cambió la habilidad del objetivo por {{abilityName}}!", + "postDefendMoveDisable": "¡{{moveName}} de {{pokemonNameWithAffix}} ha sido anulado!", + "pokemonTypeChange": "¡{{pokemonNameWithAffix}} ha cambiado a tipo {{moveType}}!", + "postAttackStealHeldItem": "¡{{pokemonNameWithAffix}} robó {{stolenItemType}} de {{defenderName}}!", + "postDefendStealHeldItem": "¡{{pokemonNameWithAffix}} robó {{stolenItemType}} de {{attackerName}}!", + "copyFaintedAllyAbility": "¡{{abilityName}} de {{pokemonNameWithAffix}} fue copiada!", + "intimidateImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita que sea intimidado!", + "postSummonAllyHeal": "¡{{pokemonNameWithAffix}} se ha bebido el té que ha preparado {{pokemonName}}!", + "postSummonClearAllyStats": "¡Los cambios de características de {{pokemonNameWithAffix}} fueron eliminados!", + "postSummonTransform": "¡{{pokemonNameWithAffix}} se transformó en {{targetName}}!", + "protectStat": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita que baje su {{statName}}!", + "statusEffectImmunityWithName": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita {{statusEffectName}}!", + "statusEffectImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita los problemas de estado!", + "battlerTagImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} previene {{battlerTagName}}!", + "forewarn": "¡{{pokemonNameWithAffix}} ha detectado el movimiento {{moveName}}!", + "frisk": "¡{{pokemonNameWithAffix}} ha cacheado {{opponentAbilityName}} de {{opponentName}}!", + "postWeatherLapseHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "postWeatherLapseDamage": "¡{{pokemonNameWithAffix}} se hizo daño por su {{abilityName}}!", + "postTurnLootCreateEatenBerry": "¡{{pokemonNameWithAffix}} recogió una {{berryName}}!", + "postTurnHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "fetchBall": "¡{{pokemonNameWithAffix}} encontró {{pokeballName}}!", + "healFromBerryUse": "¡{{pokemonNameWithAffix}} se curó gracias a {{abilityName}}!", + "arenaTrap": "¡{{pokemonNameWithAffix}} impide el cambio con {{abilityName}}!", + "postBattleLoot": "¡{{pokemonNameWithAffix}} recogió {{itemName}}!", + "postFaintContactDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} hizo daño a su atacante!", + "postFaintHpDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} hizo daño a su atacante!", + "postSummonPressure": "¡{{pokemonNameWithAffix}} ejerce Presión!", + "weatherEffectDisappeared": "El tiempo atmosférico ya no ejerce ninguna influencia.", + "postSummonMoldBreaker": "¡{{pokemonNameWithAffix}} rompió el molde!", + "postSummonAnticipation": "¡{{pokemonNameWithAffix}} se anticipó!", + "postSummonTurboblaze": "¡{{pokemonNameWithAffix}} irradia un aura llameante!", + "postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!", + "postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!", + "postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!", + "postSummonAuraBreak": "¡{{pokemonNameWithAffix}} ha invertido todas las auras!", + "postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!", + "postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", + "postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", + "postSummonVesselOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Caldero Debacle!", + "postSummonSwordOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Espada Debacle!", + "postSummonTabletsOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Tablilla Debacle!", + "postSummonBeadsOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Abalorio Debacle!", + "preventBerryUse": "{{pokemonNameWithAffix}} está muy nervioso y no puede comer bayas!" +} diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts deleted file mode 100644 index 5c09c3832c0..00000000000 --- a/src/locales/es/ability-trigger.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "¡{{abilityName}} de {{pokemonName}}\nlo protegió del daño de retroceso!", - "badDreams": "¡{{pokemonName}} está atormentado!", - "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", - "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", - "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", - "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", - "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", -} as const; diff --git a/src/locales/es/ability.json b/src/locales/es/ability.json new file mode 100644 index 00000000000..598694f441e --- /dev/null +++ b/src/locales/es/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "Hedor", + "description": "Puede amedrentar a un Pokémon al atacarlo debido al mal olor que emana." + }, + "drizzle": { + "name": "Llovizna", + "description": "Hace que llueva al entrar en combate." + }, + "speedBoost": { + "name": "Impulso", + "description": "Aumenta su Velocidad en cada turno." + }, + "battleArmor": { + "name": "Armadura Batalla", + "description": "La robusta coraza que lo protege bloquea los golpes críticos." + }, + "sturdy": { + "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", + "description": "Aumenta la humedad del entorno y evita que se puedan utilizar movimientos explosivos, tales como Autodestrucción." + }, + "limber": { + "name": "Flexibilidad", + "description": "Evita ser paralizado gracias a la flexibilidad de su cuerpo." + }, + "sandVeil": { + "name": "Velo Arena", + "description": "Aumenta su Evasión durante las tormentas de arena." + }, + "static": { + "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", + "description": "Si lo alcanza un movimiento de tipo Eléctrico, recupera PS en vez de sufrir daño." + }, + "waterAbsorb": { + "name": "Absorbe Agua", + "description": "Si lo alcanza un movimiento de tipo Agua, recupera PS en vez de sufrir daño." + }, + "oblivious": { + "name": "Despiste", + "description": "Su indiferencia evita que sea provocado, caiga presa del enamoramiento o sufra los efectos de Intimidación." + }, + "cloudNine": { + "name": "Aclimatación", + "description": "Anula todos los efectos del tiempo atmosférico." + }, + "compoundEyes": { + "name": "Ojo Compuesto", + "description": "Aumenta la precisión de sus movimientos." + }, + "insomnia": { + "name": "Insomnio", + "description": "Su resistencia al sueño le impide quedarse dormido." + }, + "colorChange": { + "name": "Cambio Color", + "description": "Adopta el tipo del último movimiento del que es blanco." + }, + "immunity": { + "name": "Inmunidad", + "description": "Su sistema inmunitario evita el envenenamiento." + }, + "flashFire": { + "name": "Absorbe Fuego", + "description": "Si lo alcanza algún movimiento de tipo Fuego, potencia sus propios movimientos de dicho tipo." + }, + "shieldDust": { + "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", + "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", + "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", + "description": "Al entrar en combate, amilana al rival de tal manera que reduce su Ataque." + }, + "shadowTag": { + "name": "Sombra Trampa", + "description": "Pisa la sombra del rival para impedir que huya o lo cambien por otro." + }, + "roughSkin": { + "name": "Piel Tosca", + "description": "Hiere con su piel áspera al Pokémon que lo ataque con un movimiento de contacto." + }, + "wonderGuard": { + "name": "Superguarda", + "description": "Gracias a un poder misterioso, solo le hacen daño los movimientos supereficaces." + }, + "levitate": { + "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", + "description": "Puede dormir, envenenar o paralizar al Pokémon que lo ataque con un movimiento de contacto." + }, + "synchronize": { + "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", + "description": "Evita que se reduzcan sus características a causa de movimientos o habilidades de otros Pokémon." + }, + "naturalCure": { + "name": "Cura Natural", + "description": "Sus problemas de estado desaparecen cuando se retira del combate." + }, + "lightningRod": { + "name": "Pararrayos", + "description": "Atrae y neutraliza los movimientos de tipo Eléctrico, que además le aumentan el Ataque Especial." + }, + "sereneGrace": { + "name": "Dicha", + "description": "Aumenta la probabilidad de que los movimientos causen efectos secundarios." + }, + "swiftSwim": { + "name": "Nado Rápido", + "description": "Aumenta su Velocidad cuando llueve." + }, + "chlorophyll": { + "name": "Clorofila", + "description": "Aumenta su Velocidad cuando hace sol." + }, + "illuminate": { + "name": "Iluminación", + "description": "Al iluminar el entorno, evita que su Precisión se reduzca." + }, + "trace": { + "name": "Calco", + "description": "Copia la habilidad del rival al entrar en combate." + }, + "hugePower": { + "name": "Potencia", + "description": "Duplica la potencia de sus ataques físicos." + }, + "poisonPoint": { + "name": "Punto Tóxico", + "description": "Puede envenenar al Pokémon que lo ataque con un movimiento de contacto." + }, + "innerFocus": { + "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", + "description": "Gracias al magma candente que lo envuelve, no puede ser congelado." + }, + "waterVeil": { + "name": "Velo Agua", + "description": "Evita las quemaduras gracias a la capa de agua que lo envuelve." + }, + "magnetPull": { + "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", + "description": "Su aislamiento acústico lo protege de movimientos que usan sonido." + }, + "rainDish": { + "name": "Cura Lluvia", + "description": "Recupera PS de forma gradual cuando llueve." + }, + "sandStream": { + "name": "Chorro Arena", + "description": "Crea una tormenta de arena al entrar en combate." + }, + "pressure": { + "name": "Presión", + "description": "Presiona al rival de tal manera que este consume más PP al usar sus movimientos." + }, + "thickFat": { + "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", + "description": "Si se duerme, tardará la mitad de tiempo en despertarse." + }, + "flameBody": { + "name": "Cuerpo Llama", + "description": "Puede quemar al Pokémon que lo ataque con un movimiento de contacto." + }, + "runAway": { + "name": "Fuga", + "description": "Puede escapar de cualquier Pokémon salvaje." + }, + "keenEye": { + "name": "Vista Lince", + "description": "Su aguda vista evita que su Precisión se reduzca." + }, + "hyperCutter": { + "name": "Corte Fuerte", + "description": "Evita que otros Pokémon le reduzcan el Ataque." + }, + "pickup": { + "name": "Recogida", + "description": "Puede que recoja un objeto del enemigo tras cada batalla, al azar." + }, + "truant": { + "name": "Pereza", + "description": "Al ejecutar un movimiento, descansará en el turno siguiente." + }, + "hustle": { + "name": "Entusiasmo", + "description": "Aumenta su ataque, pero reduce su precisión." + }, + "cuteCharm": { + "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." + }, + "minus": { + "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", + "description": "Cambia a tipo Agua, Fuego o Hielo en función del tiempo atmosférico." + }, + "stickyHold": { + "name": "Viscosidad", + "description": "Los objetos se quedan pegados a su cuerpo, por lo que no pueden robárselos." + }, + "shedSkin": { + "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." + }, + "marvelScale": { + "name": "Escama Especial", + "description": "Si sufre un problema de estado, sus escamas especiales reaccionan y aumenta su defensa." + }, + "liquidOoze": { + "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", + "description": "Potencia sus movimientos de tipo Planta cuando le quedan pocos PS." + }, + "blaze": { + "name": "Mar Llamas", + "description": "Potencia sus movimientos de tipo Fuego cuando le quedan pocos PS." + }, + "torrent": { + "name": "Torrente", + "description": "Potencia sus movimientos de tipo Agua cuando le quedan pocos PS." + }, + "swarm": { + "name": "Enjambre", + "description": "Potencia sus movimientos de tipo Bicho cuando le quedan pocos PS." + }, + "rockHead": { + "name": "Cabeza Roca", + "description": "No pierde PS al usar movimientos que también hieren al usuario." + }, + "drought": { + "name": "Sequía", + "description": "El tiempo pasa a ser soleado al entrar en combate." + }, + "arenaTrap": { + "name": "Trampa Arena", + "description": "Evita que el rival huya o sea cambiado por otro." + }, + "vitalSpirit": { + "name": "Espíritu Vital", + "description": "Su determinación le impide quedarse dormido." + }, + "whiteSmoke": { + "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", + "description": "Duplica la potencia de sus ataques físicos gracias al yoga." + }, + "shellArmor": { + "name": "Caparazón", + "description": "La robusta coraza que lo protege bloquea los golpes críticos." + }, + "airLock": { + "name": "Esclusa de Aire", + "description": "Neutraliza todos los efectos del tiempo atmosférico." + }, + "tangledFeet": { + "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." + }, + "rivalry": { + "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." + }, + "snowCloak": { + "name": "Manto Níveo", + "description": "Aumenta su evasión cuando nieva." + }, + "gluttony": { + "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." + }, + "unburden": { + "name": "Liviano", + "description": "Aumenta su velocidad si usa o pierde el objeto que lleva." + }, + "heatproof": { + "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", + "description": "Duplica los cambios en las características." + }, + "drySkin": { + "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." + }, + "ironFist": { + "name": "Puño Férreo", + "description": "Aumenta la potencia de los movimientos con los puños." + }, + "poisonHeal": { + "name": "Antídoto", + "description": "Si resulta envenenado, recupera PS en vez de perderlos." + }, + "adaptability": { + "name": "Adaptable", + "description": "Potencia aún más los movimientos cuyo tipo coincida con el suyo." + }, + "skillLink": { + "name": "Encadenado", + "description": "Ejecuta siempre los movimientos de ataque múltiple con el número máximo de golpes." + }, + "hydration": { + "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." + }, + "quickFeet": { + "name": "Pies Rápidos", + "description": "Aumenta su velocidad si sufre problemas de estado." + }, + "normalize": { + "name": "Normalidad", + "description": "Hace que todos sus movimientos se vuelvan de tipo Normal y aumenta ligeramente su potencia." + }, + "sniper": { + "name": "Francotirador", + "description": "Potencia los golpes críticos que asesta aún más de lo normal." + }, + "magicGuard": { + "name": "Muro Mágico", + "description": "Solo recibe daño de ataques." + }, + "noGuard": { + "name": "Indefenso", + "description": "Al quedar ambos expuestos, tanto sus movimientos como los del Pokémon que lo ataque acertarán siempre." + }, + "stall": { + "name": "Rezagado", + "description": "Ejecuta su movimiento tras todos los demás." + }, + "technician": { + "name": "Experto", + "description": "Aumenta la potencia de sus movimientos débiles." + }, + "leafGuard": { + "name": "Defensa Hoja", + "description": "Evita los problemas de estado si hace sol." + }, + "klutz": { + "name": "Zoquete", + "description": "No puede usar objetos equipados." + }, + "moldBreaker": { + "name": "Rompemoldes", + "description": "Sus movimientos no se ven afectados por la habilidad del objetivo." + }, + "superLuck": { + "name": "Afortunado", + "description": "Su buena suerte aumenta la probabilidad de asestar golpes críticos." + }, + "aftermath": { + "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", + "description": "Prevé los movimientos peligrosos del rival." + }, + "forewarn": { + "name": "Alerta", + "description": "Revela uno de los movimientos del rival al entrar en combate." + }, + "unaware": { + "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", + "description": "Potencia los movimientos que no son muy eficaces, que infligen ahora un daño normal." + }, + "filter": { + "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." + }, + "scrappy": { + "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." + }, + "iceBody": { + "name": "Gélido", + "description": "Recupera PS de forma gradual cuando nieva." + }, + "solidRock": { + "name": "Roca Sólida", + "description": "Mitiga el daño que le infligen los movimientos supereficaces." + }, + "snowWarning": { + "name": "Nevada", + "description": "Invoca una nevada al entrar en combate." + }, + "honeyGather": { + "name": "Recogemiel", + "description": "El Pokémon recoge miel tras cada batalla. La miel se vende inmediatamente por ₽." + }, + "frisk": { + "name": "Cacheo", + "description": "Cuando entra en combate, el Pokémon puede comprobar la habilidad de un Pokémon rival." + }, + "reckless": { + "name": "Audaz", + "description": "Potencia los movimientos que también dañan al usuario." + }, + "multitype": { + "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." + }, + "badDreams": { + "name": "Mal Sueño", + "description": "Inflige daño a cualquier rival que esté dormido." + }, + "pickpocket": { + "name": "Hurto", + "description": "Roba el objeto del Pokémon que lo ataque con un movimiento de contacto." + }, + "sheerForce": { + "name": "Potencia Bruta", + "description": "Aumenta la potencia de sus movimientos en detrimento de los efectos secundarios, que se ven anulados." + }, + "contrary": { + "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", + "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." + }, + "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." + }, + "cursedBody": { + "name": "Cuerpo Maldito", + "description": "Puede anular el movimiento usado en su contra." + }, + "healer": { + "name": "Alma Cura", + "description": "A veces cura los problemas de estado de un aliado." + }, + "friendGuard": { + "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." + }, + "heavyMetal": { + "name": "Metal Pesado", + "description": "Duplica su peso." + }, + "lightMetal": { + "name": "Metal Liviano", + "description": "Reduce a la mitad su peso." + }, + "multiscale": { + "name": "Multiescamas", + "description": "Reduce el daño que sufre si sus PS están al máximo." + }, + "toxicBoost": { + "name": "Ímpetu Tóxico", + "description": "Aumenta la potencia de sus ataques físicos cuando está envenenado." + }, + "flareBoost": { + "name": "Ímpetu Ardiente", + "description": "Aumenta la potencia de sus ataques especiales cuando sufre quemaduras." + }, + "harvest": { + "name": "Cosecha", + "description": "Puede reutilizar varias veces una misma baya." + }, + "telepathy": { + "name": "Telepatía", + "description": "Elude los ataques de los aliados durante el combate." + }, + "moody": { + "name": "Veleta", + "description": "Aumenta mucho una característica en cada turno, pero reduce otra." + }, + "overcoat": { + "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", + "description": "Puede envenenar al Pokémon al que ataque con un movimiento de contacto." + }, + "regenerator": { + "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." + }, + "sandRush": { + "name": "Ímpetu Arena", + "description": "Aumenta su velocidad durante las tormentas de arena." + }, + "wonderSkin": { + "name": "Piel Milagro", + "description": "Presenta una mayor resistencia ante los movimientos de estado." + }, + "analytic": { + "name": "Cálculo Final", + "description": "Aumenta la potencia de su movimiento si es el último en atacar." + }, + "illusion": { + "name": "Ilusión", + "description": "Adopta el aspecto del último Pokémon del equipo al entrar en combate para desconcertar al rival." + }, + "imposter": { + "name": "Impostor", + "description": "Se transforma en el Pokémon que tiene enfrente." + }, + "infiltrator": { + "name": "Allanamiento", + "description": "Ataca sorteando las barreras o el sustituto del objetivo." + }, + "mummy": { + "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." + }, + "justified": { + "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." + }, + "magicBounce": { + "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." + }, + "prankster": { + "name": "Bromista", + "description": "Sus movimientos de estado tienen prioridad alta." + }, + "sandForce": { + "name": "Poder Arena", + "description": "Potencia los movimientos de tipo Tierra, Acero y Roca durante las tormentas de arena." + }, + "ironBarbs": { + "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", + "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." + }, + "turboblaze": { + "name": "Turbollama", + "description": "Sus movimientos no se ven afectados por la habilidad del objetivo." + }, + "teravolt": { + "name": "Terravoltaje", + "description": "Sus movimientos no se ven afectados por la habilidad del objetivo." + }, + "aromaVeil": { + "name": "Velo Aroma", + "description": "Se protege a sí mismo y a sus aliados de efectos que impiden usar movimientos." + }, + "flowerVeil": { + "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", + "description": "Recupera PS al comer cualquier baya." + }, + "protean": { + "name": "Mutatipo", + "description": "Al entrar en combate, cambia su tipo al del primer movimiento que va a usar." + }, + "furCoat": { + "name": "Pelaje Recio", + "description": "Reduce a la mitad el daño que recibe de ataques físicos." + }, + "magician": { + "name": "Prestidigitador", + "description": "Roba el objeto del Pokémon al que alcance con un movimiento." + }, + "bulletproof": { + "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." + }, + "strongJaw": { + "name": "Mandíbula Fuerte", + "description": "Su robusta mandíbula le confiere una mordedura mucho más potente." + }, + "refrigerate": { + "name": "Piel Helada", + "description": "Convierte los movimientos de tipo Normal en tipo Hielo y aumenta ligeramente su potencia." + }, + "sweetVeil": { + "name": "Velo Dulce", + "description": "No cae dormido y evita también que sus aliados se duerman." + }, + "stanceChange": { + "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", + "description": "Da prioridad a los movimientos de tipo Volador si sus PS están al máximo." + }, + "megaLauncher": { + "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." + }, + "symbiosis": { + "name": "Simbiosis", + "description": "Pasa su objeto a un aliado cuando este use el suyo." + }, + "toughClaws": { + "name": "Garra Dura", + "description": "Aumenta la potencia de los movimientos de contacto." + }, + "pixilate": { + "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." + }, + "aerilate": { + "name": "Piel Celeste", + "description": "Convierte los movimientos de tipo Normal en tipo Volador y aumenta ligeramente su potencia." + }, + "parentalBond": { + "name": "Amor Filial", + "description": "Une fuerzas con su cría y ataca dos veces." + }, + "darkAura": { + "name": "Aura Oscura", + "description": "Aumenta la potencia de los movimientos de tipo Siniestro de todos los Pokémon." + }, + "fairyAura": { + "name": "Aura Feérica", + "description": "Aumenta la potencia de los movimientos de tipo Hada de todos los Pokémon." + }, + "auraBreak": { + "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", + "description": "Altera el clima para anular los ataques de tipo Fuego." + }, + "desolateLand": { + "name": "Tierra del Ocaso", + "description": "Altera el clima para anular los ataques de tipo Agua." + }, + "deltaStream": { + "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." + }, + "wimpOut": { + "name": "Huida", + "description": "Se asusta y abandona el terreno de combate cuando sus PS se ven reducidos a la mitad." + }, + "emergencyExit": { + "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." + }, + "merciless": { + "name": "Ensañamiento", + "description": "Hace que sus movimientos asesten siempre un golpe crítico si el objetivo está envenenado." + }, + "shieldsDown": { + "name": "Escudo Limitado", + "description": "Rompe su coraza cuando sus PS se ven reducidos a la mitad y adopta una forma ofensiva." + }, + "stakeout": { + "name": "Vigilante", + "description": "Si el objetivo de su ataque es sustituido por otro, duplica el daño que infligirá." + }, + "waterBubble": { + "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", + "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." + }, + "slushRush": { + "name": "Quitanieves", + "description": "Aumenta su velocidad cuando nieva." + }, + "longReach": { + "name": "Remoto", + "description": "Puede usar cualquier movimiento sin entrar en contacto con su objetivo." + }, + "liquidVoice": { + "name": "Voz Fluida", + "description": "Hace que todos sus movimientos que usan sonido pasen a ser de tipo Agua." + }, + "triage": { + "name": "Primer Auxilio", + "description": "Da prioridad a los movimientos que restauran PS." + }, + "galvanize": { + "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." + }, + "schooling": { + "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", + "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." + }, + "powerConstruct": { + "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", + "description": "Puede envenenar incluso a Pokémon de tipo Acero o Veneno." + }, + "comatose": { + "name": "Letargo Perenne", + "description": "No despierta jamás de su profundo letargo e incluso ataca dormido." + }, + "queenlyMajesty": { + "name": "Regia Presencia", + "description": "Intimida al rival y le impide usar movimientos con prioridad contra él y sus aliados." + }, + "innardsOut": { + "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", + "description": "Puede copiar inmediatamente cualquier movimiento de baile que haya usado otro Pokémon presente en el combate." + }, + "battery": { + "name": "Batería", + "description": "Potencia los ataques especiales de los aliados." + }, + "fluffy": { + "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", + "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." + }, + "tanglingHair": { + "name": "Rizos Rebeldes", + "description": "Reduce la velocidad del Pokémon que lo ataque con un movimiento de contacto." + }, + "receiver": { + "name": "Receptor", + "description": "Adquiere la habilidad de un aliado debilitado." + }, + "powerOfAlchemy": { + "name": "Reacción Química", + "description": "Reacciona copiando la habilidad de un aliado debilitado." + }, + "beastBoost": { + "name": "Ultraimpulso", + "description": "Al derrotar a un Pokémon, aumenta su característica más fuerte." + }, + "rksSystem": { + "name": "Sistema Alfa", + "description": "Cambia su tipo según el disco que lleve instalado." + }, + "electricSurge": { + "name": "Electrogénesis", + "description": "Crea un campo eléctrico al entrar en combate." + }, + "psychicSurge": { + "name": "Psicogénesis", + "description": "Crea un campo psíquico al entrar en combate." + }, + "mistySurge": { + "name": "Nebulogénesis", + "description": "Crea un campo de niebla al entrar en combate." + }, + "grassySurge": { + "name": "Herbogénesis", + "description": "Crea un campo de hierba al entrar en combate." + }, + "fullMetalBody": { + "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", + "description": "Reduce el daño que sufre si sus PS están al máximo." + }, + "prismArmor": { + "name": "Armadura Prisma", + "description": "Mitiga el daño que le infligen los movimientos supereficaces." + }, + "neuroforce": { + "name": "Fuerza Cerebral", + "description": "Potencia los ataques supereficaces." + }, + "intrepidSword": { + "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." + }, + "libero": { + "name": "Líbero", + "description": "Al entrar en combate, cambia su tipo al del primer movimiento que va a usar." + }, + "ballFetch": { + "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." + }, + "propellerTail": { + "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", + "description": "Refleja los efectos que reducen las características." + }, + "gulpMissile": { + "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", + "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." + }, + "punkRock": { + "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", + "description": "Provoca una tormenta de arena al recibir un ataque." + }, + "iceScales": { + "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", + "description": "Hace madurar las bayas, por lo que duplica sus efectos." + }, + "iceFace": { + "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", + "description": "Potencia los movimientos de los Pokémon adyacentes." + }, + "mimicry": { + "name": "Mimetismo", + "description": "Cambia su tipo según el campo que haya en el terreno de combate." + }, + "screenCleaner": { + "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", + "description": "Potencia los movimientos de tipo Acero del Pokémon y sus aliados." + }, + "perishBody": { + "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", + "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." + }, + "neutralizingGas": { + "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", + "description": "Se protege a sí mismo y a sus aliados del envenenamiento." + }, + "hungerSwitch": { + "name": "Mutapetito", + "description": "Alterna entre su Forma Saciada y Forma Voraz al final de cada turno." + }, + "quickDraw": { + "name": "Mano Rápida", + "description": "A veces, puede atacar el primero." + }, + "unseenFist": { + "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", + "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", + "description": "Potencia los movimientos de tipo Eléctrico." + }, + "dragonsMaw": { + "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." + }, + "grimNeigh": { + "name": "Relincho Negro", + "description": "Al derrotar a un objetivo, emite un relincho aterrador y aumenta su ataque especial." + }, + "asOneGlastrier": { + "name": "Unidad Ecuestre", + "description": "El Pokémon tiene dos habilidades: Relincho Negro de Spectrier y Nerviosismo de Calyrex." + }, + "asOneSpectrier": { + "name": "Unidad Ecuestre", + "description": "El Pokémon tiene dos habilidades: Relincho Negro de Spectrier y Nerviosismo de Calyrex." + }, + "lingeringAroma": { + "name": "Olor Persistente", + "description": "Contagia la habilidad Olor Persistente al Pokémon que lo ataque con un movimiento de contacto." + }, + "seedSower": { + "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." + }, + "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." + }, + "purifyingSalt": { + "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." + }, + "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." + }, + "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." + }, + "rockyPayload": { + "name": "Transportarrocas", + "description": "Potencia los movimientos de tipo Roca." + }, + "windPower": { + "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", + "description": "Adopta la Forma Heroica cuando se retira del combate." + }, + "commander": { + "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", + "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", + "description": "Si hace sol o lleva un tanque de Energía Potenciadora, aumenta su característica más alta." + }, + "quarkDrive": { + "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", + "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." + }, + "swordOfRuin": { + "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." + }, + "beadsOfRuin": { + "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." + }, + "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." + }, + "opportunist": { + "name": "Oportunista", + "description": "Copia las mejoras en las características del rival, aprovechándose de la situación." + }, + "cudChew": { + "name": "Rumia", + "description": "Cuando ingiere una baya, la regurgita al final del siguiente turno y se la come por segunda vez." + }, + "sharpness": { + "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." + }, + "costar": { + "name": "Unísono", + "description": "Al entrar en combate, copia los cambios en las características de su aliado." + }, + "toxicDebris": { + "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", + "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", + "description": "Si lo alcanza un movimiento de tipo Tierra, recupera PS en vez de sufrir daño." + }, + "myceliumMight": { + "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." + }, + "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." + }, + "hospitality": { + "name": "Hospitalidad", + "description": "Al entrar en combate, restaura algunos PS de su aliado como muestra de hospitalidad." + }, + "toxicChain": { + "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 turquesa y aumenta su velocidad." + }, + "embodyAspectWellspring": { + "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 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." + }, + "teraShift": { + "name": "Teracambio", + "description": "Al entrar en combate, adopta la Forma Teracristal tras absorber la energía de su alrededor." + }, + "teraShell": { + "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", + "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", + "description": "Los rivales que Pecharunt envenene con sus movimientos también sufrirán confusión." + } +} diff --git a/src/locales/es/ability.ts b/src/locales/es/ability.ts deleted file mode 100644 index d89bc6fa3cc..00000000000 --- a/src/locales/es/ability.ts +++ /dev/null @@ -1,1244 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -export const ability: AbilityTranslationEntries = { - "stench": { - name: "Hedor", - description: "Puede amedrentar a un Pokémon al atacarlo debido al mal olor que emana." - }, - "drizzle": { - name: "Llovizna", - description: "Hace que llueva al entrar en combate." - }, - "speedBoost": { - name: "Impulso", - description: "Aumenta su Velocidad en cada turno." - }, - "battleArmor": { - name: "Armadura Batalla", - description: "La robusta coraza que lo protege bloquea los golpes críticos." - }, - "sturdy": { - 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", - description: "Aumenta la humedad del entorno y evita que se puedan utilizar movimientos explosivos, tales como Autodestrucción." - }, - "limber": { - name: "Flexibilidad", - description: "Evita ser paralizado gracias a la flexibilidad de su cuerpo." - }, - "sandVeil": { - name: "Velo Arena", - description: "Aumenta su Evasión durante las tormentas de arena." - }, - "static": { - 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", - description: "Si lo alcanza un movimiento de tipo Eléctrico, recupera PS en vez de sufrir daño." - }, - "waterAbsorb": { - name: "Absorbe Agua", - description: "Si lo alcanza un movimiento de tipo Agua, recupera PS en vez de sufrir daño." - }, - "oblivious": { - name: "Despiste", - description: "Su indiferencia evita que sea provocado, caiga presa del enamoramiento o sufra los efectos de Intimidación." - }, - "cloudNine": { - name: "Aclimatación", - description: "Anula todos los efectos del tiempo atmosférico." - }, - "compoundEyes": { - name: "Ojo Compuesto", - description: "Aumenta la precisión de sus movimientos." - }, - "insomnia": { - name: "Insomnio", - description: "Su resistencia al sueño le impide quedarse dormido." - }, - "colorChange": { - name: "Cambio Color", - description: "Adopta el tipo del último movimiento del que es blanco." - }, - "immunity": { - name: "Inmunidad", - description: "Su sistema inmunitario evita el envenenamiento." - }, - "flashFire": { - name: "Absorbe Fuego", - description: "Si lo alcanza algún movimiento de tipo Fuego, potencia sus propios movimientos de dicho tipo." - }, - "shieldDust": { - 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", - 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", - 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", - description: "Al entrar en combate, amilana al rival de tal manera que reduce su Ataque." - }, - "shadowTag": { - name: "Sombra Trampa", - description: "Pisa la sombra del rival para impedir que huya o lo cambien por otro." - }, - "roughSkin": { - name: "Piel Tosca", - description: "Hiere con su piel áspera al Pokémon que lo ataque con un movimiento de contacto." - }, - "wonderGuard": { - name: "Superguarda", - description: "Gracias a un poder misterioso, solo le hacen daño los movimientos supereficaces." - }, - "levitate": { - 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", - description: "Puede dormir, envenenar o paralizar al Pokémon que lo ataque con un movimiento de contacto." - }, - "synchronize": { - 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", - description: "Evita que se reduzcan sus características a causa de movimientos o habilidades de otros Pokémon." - }, - "naturalCure": { - name: "Cura Natural", - description: "Sus problemas de estado desaparecen cuando se retira del combate." - }, - "lightningRod": { - name: "Pararrayos", - description: "Atrae y neutraliza los movimientos de tipo Eléctrico, que además le aumentan el Ataque Especial." - }, - "sereneGrace": { - name: "Dicha", - description: "Aumenta la probabilidad de que los movimientos causen efectos secundarios." - }, - "swiftSwim": { - name: "Nado Rápido", - description: "Aumenta su Velocidad cuando llueve." - }, - "chlorophyll": { - name: "Clorofila", - description: "Aumenta su Velocidad cuando hace sol." - }, - "illuminate": { - name: "Iluminación", - description: "Al iluminar el entorno, evita que su Precisión se reduzca." - }, - "trace": { - name: "Calco", - description: "Copia la habilidad del rival al entrar en combate." - }, - "hugePower": { - name: "Potencia", - description: "Duplica la potencia de sus ataques físicos." - }, - "poisonPoint": { - name: "Punto Tóxico", - description: "Puede envenenar al Pokémon que lo ataque con un movimiento de contacto." - }, - "innerFocus": { - 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", - description: "Gracias al magma candente que lo envuelve, no puede ser congelado." - }, - "waterVeil": { - name: "Velo Agua", - description: "Evita las quemaduras gracias a la capa de agua que lo envuelve." - }, - "magnetPull": { - 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", - description: "Su aislamiento acústico lo protege de movimientos que usan sonido." - }, - "rainDish": { - name: "Cura Lluvia", - description: "Recupera PS de forma gradual cuando llueve." - }, - "sandStream": { - name: "Chorro Arena", - description: "Crea una tormenta de arena al entrar en combate." - }, - "pressure": { - name: "Presión", - description: "Presiona al rival de tal manera que este consume más PP al usar sus movimientos." - }, - "thickFat": { - 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", - description: "Si se duerme, tardará la mitad de tiempo en despertarse." - }, - "flameBody": { - name: "Cuerpo Llama", - description: "Puede quemar al Pokémon que lo ataque con un movimiento de contacto." - }, - "runAway": { - name: "Fuga", - description: "Puede escapar de cualquier Pokémon salvaje." - }, - "keenEye": { - name: "Vista Lince", - description: "Su aguda vista evita que su Precisión se reduzca." - }, - "hyperCutter": { - 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." - }, - "truant": { - name: "Pereza", - description: "Al ejecutar un movimiento, descansará en el turno siguiente." - }, - "hustle": { - name: "Entusiasmo", - description: "Aumenta su Ataque, pero reduce su Precisión." - }, - "cuteCharm": { - 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." - }, - "minus": { - 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", - description: "Cambia a tipo Agua, Fuego o Hielo en función del tiempo atmosférico." - }, - "stickyHold": { - name: "Viscosidad", - description: "Los objetos se quedan pegados a su cuerpo, por lo que no pueden robárselos." - }, - "shedSkin": { - 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." - }, - "marvelScale": { - name: "Escama Especial", - description: "Si sufre un problema de estado, sus escamas especiales reaccionan y aumenta su Defensa." - }, - "liquidOoze": { - 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", - description: "Potencia sus movimientos de tipo Planta cuando le quedan pocos PS." - }, - "blaze": { - name: "Mar Llamas", - description: "Potencia sus movimientos de tipo Fuego cuando le quedan pocos PS." - }, - "torrent": { - name: "Torrente", - description: "Potencia sus movimientos de tipo Agua cuando le quedan pocos PS." - }, - "swarm": { - name: "Enjambre", - description: "Potencia sus movimientos de tipo Bicho cuando le quedan pocos PS." - }, - "rockHead": { - name: "Cabeza Roca", - description: "No pierde PS al usar movimientos que también hieren al usuario." - }, - "drought": { - name: "Sequía", - description: "El tiempo pasa a ser soleado al entrar en combate." - }, - "arenaTrap": { - name: "Trampa Arena", - description: "Evita que el rival huya o sea cambiado por otro." - }, - "vitalSpirit": { - name: "Espíritu Vital", - description: "Su determinación le impide quedarse dormido." - }, - "whiteSmoke": { - 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", - description: "Duplica la potencia de sus ataques físicos gracias al yoga." - }, - "shellArmor": { - name: "Caparazón", - description: "La robusta coraza que lo protege bloquea los golpes críticos." - }, - "airLock": { - name: "Esclusa de Aire", - description: "Neutraliza todos los efectos del tiempo atmosférico." - }, - "tangledFeet": { - 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." - }, - "rivalry": { - 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." - }, - "snowCloak": { - name: "Manto Níveo", - description: "Aumenta su Evasión cuando nieva." - }, - "gluttony": { - 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." - }, - "unburden": { - name: "Liviano", - description: "Aumenta su Velocidad si usa o pierde el objeto que lleva." - }, - "heatproof": { - 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", - description: "Duplica los cambios en las características." - }, - "drySkin": { - 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." - }, - "ironFist": { - name: "Puño Férreo", - description: "Aumenta la potencia de los movimientos con los puños." - }, - "poisonHeal": { - name: "Antídoto", - description: "Si resulta envenenado, recupera PS en vez de perderlos." - }, - "adaptability": { - name: "Adaptable", - description: "Potencia aún más los movimientos cuyo tipo coincida con el suyo." - }, - "skillLink": { - name: "Encadenado", - description: "Ejecuta siempre los movimientos de ataque múltiple con el número máximo de golpes." - }, - "hydration": { - 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." - }, - "quickFeet": { - name: "Pies Rápidos", - description: "Aumenta su Velocidad si sufre problemas de estado." - }, - "normalize": { - name: "Normalidad", - description: "Hace que todos sus movimientos se vuelvan de tipo Normal y aumenta ligeramente su potencia." - }, - "sniper": { - name: "Francotirador", - description: "Potencia los golpes críticos que asesta aún más de lo normal." - }, - "magicGuard": { - name: "Muro Mágico", - description: "Solo recibe daño de ataques." - }, - "noGuard": { - name: "Indefenso", - description: "Al quedar ambos expuestos, tanto sus movimientos como los del Pokémon que lo ataque acertarán siempre." - }, - "stall": { - name: "Rezagado", - description: "Ejecuta su movimiento tras todos los demás." - }, - "technician": { - name: "Experto", - description: "Aumenta la potencia de sus movimientos débiles." - }, - "leafGuard": { - name: "Defensa Hoja", - description: "Evita los problemas de estado si hace sol." - }, - "klutz": { - name: "Zoquete", - description: "No puede usar objetos equipados." - }, - "moldBreaker": { - name: "Rompemoldes", - description: "Sus movimientos no se ven afectados por la habilidad del objetivo." - }, - "superLuck": { - name: "Afortunado", - description: "Su buena suerte aumenta la probabilidad de asestar golpes críticos." - }, - "aftermath": { - 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", - description: "Prevé los movimientos peligrosos del rival." - }, - "forewarn": { - name: "Alerta", - description: "Revela uno de los movimientos del rival al entrar en combate." - }, - "unaware": { - 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", - description: "Potencia los movimientos que no son muy eficaces, que infligen ahora un daño normal." - }, - "filter": { - 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." - }, - "scrappy": { - 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." - }, - "iceBody": { - name: "Gélido", - description: "Recupera PS de forma gradual cuando nieva." - }, - "solidRock": { - name: "Roca Sólida", - description: "Mitiga el daño que le infligen los movimientos supereficaces." - }, - "snowWarning": { - 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." - }, - "frisk": { - name: "Cacheo", - description: "Cuando entra en combate, el Pokémon puede comprobar la habilidad de un Pokémon rival." - }, - "reckless": { - name: "Audaz", - description: "Potencia los movimientos que también dañan al usuario." - }, - "multitype": { - 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." - }, - "badDreams": { - name: "Mal Sueño", - description: "Inflige daño a cualquier rival que esté dormido." - }, - "pickpocket": { - name: "Hurto", - description: "Roba el objeto del Pokémon que lo ataque con un movimiento de contacto." - }, - "sheerForce": { - name: "Potencia Bruta", - description: "Aumenta la potencia de sus movimientos en detrimento de los efectos secundarios, que se ven anulados." - }, - "contrary": { - 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", - 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." - }, - "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." - }, - "cursedBody": { - name: "Cuerpo Maldito", - description: "Puede anular el movimiento usado en su contra." - }, - "healer": { - name: "Alma Cura", - description: "A veces cura los problemas de estado de un aliado." - }, - "friendGuard": { - 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." - }, - "heavyMetal": { - name: "Metal Pesado", - description: "Duplica su peso." - }, - "lightMetal": { - name: "Metal Liviano", - description: "Reduce a la mitad su peso." - }, - "multiscale": { - name: "Multiescamas", - description: "Reduce el daño que sufre si sus PS están al máximo." - }, - "toxicBoost": { - name: "Ímpetu Tóxico", - description: "Aumenta la potencia de sus ataques físicos cuando está envenenado." - }, - "flareBoost": { - name: "Ímpetu Ardiente", - description: "Aumenta la potencia de sus ataques especiales cuando sufre quemaduras." - }, - "harvest": { - name: "Cosecha", - description: "Puede reutilizar varias veces una misma baya." - }, - "telepathy": { - name: "Telepatía", - description: "Elude los ataques de los aliados durante el combate." - }, - "moody": { - name: "Veleta", - description: "Aumenta mucho una característica en cada turno, pero reduce otra." - }, - "overcoat": { - 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", - description: "Puede envenenar al Pokémon al que ataque con un movimiento de contacto." - }, - "regenerator": { - 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." - }, - "sandRush": { - name: "Ímpetu Arena", - description: "Aumenta su Velocidad durante las tormentas de arena." - }, - "wonderSkin": { - name: "Piel Milagro", - description: "Presenta una mayor resistencia ante los movimientos de estado." - }, - "analytic": { - name: "Cálculo Final", - description: "Aumenta la potencia de su movimiento si es el último en atacar." - }, - "illusion": { - name: "Ilusión", - description: "Adopta el aspecto del último Pokémon del equipo al entrar en combate para desconcertar al rival." - }, - "imposter": { - name: "Impostor", - description: "Se transforma en el Pokémon que tiene enfrente." - }, - "infiltrator": { - name: "Allanamiento", - description: "Ataca sorteando las barreras o el sustituto del objetivo." - }, - "mummy": { - 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." - }, - "justified": { - 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." - }, - "magicBounce": { - 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." - }, - "prankster": { - name: "Bromista", - description: "Sus movimientos de estado tienen prioridad alta." - }, - "sandForce": { - name: "Poder Arena", - description: "Potencia los movimientos de tipo Tierra, Acero y Roca durante las tormentas de arena." - }, - "ironBarbs": { - 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", - 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." - }, - "turboblaze": { - name: "Turbollama", - description: "Sus movimientos no se ven afectados por la habilidad del objetivo." - }, - "teravolt": { - name: "Terravoltaje", - description: "Sus movimientos no se ven afectados por la habilidad del objetivo." - }, - "aromaVeil": { - name: "Velo Aroma", - description: "Se protege a sí mismo y a sus aliados de efectos que impiden usar movimientos." - }, - "flowerVeil": { - 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", - description: "Recupera PS al comer cualquier baya." - }, - "protean": { - name: "Mutatipo", - description: "Al entrar en combate, cambia su tipo al del primer movimiento que va a usar." - }, - "furCoat": { - name: "Pelaje Recio", - description: "Reduce a la mitad el daño que recibe de ataques físicos." - }, - "magician": { - name: "Prestidigitador", - description: "Roba el objeto del Pokémon al que alcance con un movimiento." - }, - "bulletproof": { - 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." - }, - "strongJaw": { - name: "Mandíbula Fuerte", - description: "Su robusta mandíbula le confiere una mordedura mucho más potente." - }, - "refrigerate": { - name: "Piel Helada", - description: "Convierte los movimientos de tipo Normal en tipo Hielo y aumenta ligeramente su potencia." - }, - "sweetVeil": { - name: "Velo Dulce", - description: "No cae dormido y evita también que sus aliados se duerman." - }, - "stanceChange": { - 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", - description: "Da prioridad a los movimientos de tipo Volador si sus PS están al máximo." - }, - "megaLauncher": { - 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." - }, - "symbiosis": { - name: "Simbiosis", - description: "Pasa su objeto a un aliado cuando este use el suyo." - }, - "toughClaws": { - name: "Garra Dura", - description: "Aumenta la potencia de los movimientos de contacto." - }, - "pixilate": { - 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." - }, - "aerilate": { - name: "Piel Celeste", - description: "Convierte los movimientos de tipo Normal en tipo Volador y aumenta ligeramente su potencia." - }, - "parentalBond": { - name: "Amor Filial", - description: "Une fuerzas con su cría y ataca dos veces." - }, - "darkAura": { - name: "Aura Oscura", - description: "Aumenta la potencia de los movimientos de tipo Siniestro de todos los Pokémon." - }, - "fairyAura": { - name: "Aura Feérica", - description: "Aumenta la potencia de los movimientos de tipo Hada de todos los Pokémon." - }, - "auraBreak": { - 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", - description: "Altera el clima para anular los ataques de tipo Fuego." - }, - "desolateLand": { - name: "Tierra del Ocaso", - description: "Altera el clima para anular los ataques de tipo Agua." - }, - "deltaStream": { - 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." - }, - "wimpOut": { - name: "Huida", - description: "Se asusta y abandona el terreno de combate cuando sus PS se ven reducidos a la mitad." - }, - "emergencyExit": { - 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." - }, - "merciless": { - name: "Ensañamiento", - description: "Hace que sus movimientos asesten siempre un golpe crítico si el objetivo está envenenado." - }, - "shieldsDown": { - name: "Escudo Limitado", - description: "Rompe su coraza cuando sus PS se ven reducidos a la mitad y adopta una forma ofensiva." - }, - "stakeout": { - name: "Vigilante", - description: "Si el objetivo de su ataque es sustituido por otro, duplica el daño que infligirá." - }, - "waterBubble": { - 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", - 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." - }, - "slushRush": { - name: "Quitanieves", - description: "Aumenta su Velocidad cuando nieva." - }, - "longReach": { - name: "Remoto", - description: "Puede usar cualquier movimiento sin entrar en contacto con su objetivo." - }, - "liquidVoice": { - name: "Voz Fluida", - description: "Hace que todos sus movimientos que usan sonido pasen a ser de tipo Agua." - }, - "triage": { - name: "Primer Auxilio", - description: "Da prioridad a los movimientos que restauran PS." - }, - "galvanize": { - 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." - }, - "schooling": { - 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", - 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." - }, - "powerConstruct": { - 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", - description: "Puede envenenar incluso a Pokémon de tipo Acero o Veneno." - }, - "comatose": { - name: "Letargo Perenne", - description: "No despierta jamás de su profundo letargo e incluso ataca dormido." - }, - "queenlyMajesty": { - name: "Regia Presencia", - description: "Intimida al rival y le impide usar movimientos con prioridad contra él y sus aliados." - }, - "innardsOut": { - 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", - description: "Puede copiar inmediatamente cualquier movimiento de baile que haya usado otro Pokémon presente en el combate." - }, - "battery": { - name: "Batería", - description: "Potencia los ataques especiales de los aliados." - }, - "fluffy": { - 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", - 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." - }, - "tanglingHair": { - name: "Rizos Rebeldes", - description: "Reduce la Velocidad del Pokémon que lo ataque con un movimiento de contacto." - }, - "receiver": { - name: "Receptor", - description: "Adquiere la habilidad de un aliado debilitado." - }, - "powerOfAlchemy": { - name: "Reacción Química", - description: "Reacciona copiando la habilidad de un aliado debilitado." - }, - "beastBoost": { - name: "Ultraimpulso", - description: "Al derrotar a un Pokémon, aumenta su característica más fuerte." - }, - "rksSystem": { - name: "Sistema Alfa", - description: "Cambia su tipo según el disco que lleve instalado." - }, - "electricSurge": { - name: "Electrogénesis", - description: "Crea un campo eléctrico al entrar en combate." - }, - "psychicSurge": { - name: "Psicogénesis", - description: "Crea un campo psíquico al entrar en combate." - }, - "mistySurge": { - name: "Nebulogénesis", - description: "Crea un campo de niebla al entrar en combate." - }, - "grassySurge": { - name: "Herbogénesis", - description: "Crea un campo de hierba al entrar en combate." - }, - "fullMetalBody": { - 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", - description: "Reduce el daño que sufre si sus PS están al máximo." - }, - "prismArmor": { - name: "Armadura Prisma", - description: "Mitiga el daño que le infligen los movimientos supereficaces." - }, - "neuroforce": { - name: "Fuerza Cerebral", - description: "Potencia los ataques supereficaces." - }, - "intrepidSword": { - 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." - }, - "libero": { - 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." - }, - "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." - }, - "propellerTail": { - 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", - description: "Refleja los efectos que reducen las características." - }, - "gulpMissile": { - 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", - 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." - }, - "punkRock": { - 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", - description: "Provoca una tormenta de arena al recibir un ataque." - }, - "iceScales": { - 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", - description: "Hace madurar las bayas, por lo que duplica sus efectos." - }, - "iceFace": { - 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", - description: "Potencia los movimientos de los Pokémon adyacentes." - }, - "mimicry": { - name: "Mimetismo", - description: "Cambia su tipo según el campo que haya en el terreno de combate." - }, - "screenCleaner": { - 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", - description: "Potencia los movimientos de tipo Acero del Pokémon y sus aliados." - }, - "perishBody": { - 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", - 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." - }, - "neutralizingGas": { - 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", - description: "Se protege a sí mismo y a sus aliados del envenenamiento." - }, - "hungerSwitch": { - name: "Mutapetito", - description: "Alterna entre su Forma Saciada y Forma Voraz al final de cada turno." - }, - "quickDraw": { - name: "Mano Rápida", - description: "A veces, puede atacar el primero." - }, - "unseenFist": { - 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", - 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", - description: "Potencia los movimientos de tipo Eléctrico." - }, - "dragonsMaw": { - 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." - }, - "grimNeigh": { - name: "Relincho Negro", - description: "Al derrotar a un objetivo, emite un relincho aterrador y aumenta su Ataque Especial." - }, - "asOneGlastrier": { - name: "Unidad Ecuestre", - description: "El Pokémon tiene dos habilidades: Relincho Negro de Spectrier y Nerviosismo de Calyrex." - }, - "asOneSpectrier": { - name: "Unidad Ecuestre", - description: "El Pokémon tiene dos habilidades: Relincho Negro de Spectrier y Nerviosismo de Calyrex." - }, - "lingeringAroma": { - name: "Olor Persistente", - description: "Contagia la habilidad Olor Persistente al Pokémon que lo ataque con un movimiento de contacto." - }, - "seedSower": { - 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." - }, - "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." - }, - "purifyingSalt": { - 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." - }, - "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." - }, - "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." - }, - "rockyPayload": { - name: "Transportarrocas", - description: "Potencia los movimientos de tipo Roca." - }, - "windPower": { - 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", - description: "Adopta la Forma Heroica cuando se retira del combate." - }, - "commander": { - 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", - 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", - description: "Si hace sol o lleva un tanque de Energía Potenciadora, aumenta su característica más alta." - }, - "quarkDrive": { - 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", - 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." - }, - "swordOfRuin": { - 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." - }, - "beadsOfRuin": { - 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." - }, - "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." - }, - "opportunist": { - name: "Oportunista", - description: "Copia las mejoras en las características del rival, aprovechándose de la situación." - }, - "cudChew": { - name: "Rumia", - description: "Cuando ingiere una baya, la regurgita al final del siguiente turno y se la come por segunda vez." - }, - "sharpness": { - 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." - }, - "costar": { - name: "Unísono", - description: "Al entrar en combate, copia los cambios en las características de su aliado." - }, - "toxicDebris": { - 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", - 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", - description: "Si lo alcanza un movimiento de tipo Tierra, recupera PS en vez de sufrir daño." - }, - "myceliumMight": { - 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." - }, - "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." - }, - "hospitality": { - name: "Hospitalidad", - description: "Al entrar en combate, restaura algunos PS de su aliado como muestra de hospitalidad." - }, - "toxicChain": { - 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." - }, - "embodyAspectWellspring": { - name: "Evocarrecuerdos", - description: "Al evocar viejos recuerdos, el Pokémon hace brillar la Máscara Cimiento y aumenta su Defensa." - }, - "embodyAspectHearthflame": { - name: "Evocarrecuerdos", - description: "Al evocar viejos recuerdos, el Pokémon hace brillar la Máscara Cimiento y aumenta su Defensa." - }, - "embodyAspectCornerstone": { - name: "Evocarrecuerdos", - description: "Al evocar viejos recuerdos, el Pokémon hace brillar la Máscara Cimiento y aumenta su Defensa." - }, - "teraShift": { - name: "Teracambio", - description: "Al entrar en combate, adopta la Forma Teracristal tras absorber la energía de su alrededor." - }, - "teraShell": { - 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", - 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", - description: "Los rivales que Pecharunt envenene con sus movimientos también sufrirán confusión." - } -} as const; diff --git a/src/locales/es/achv.json b/src/locales/es/achv.json new file mode 100644 index 00000000000..14501dbdb6b --- /dev/null +++ b/src/locales/es/achv.json @@ -0,0 +1,178 @@ +{ + "Achievements": { + "name": "Logros" + }, + "Locked": { + "name": "Bloqueado" + }, + "MoneyAchv": { + "description": "Acumula un total de ₽{{moneyAmount}}." + }, + "10K_MONEY": { + "name": "Ahorrador", + "name_female": "Ahorradora" + }, + "100K_MONEY": { + "name": "Rico", + "name_female": "Rica" + }, + "1M_MONEY": { + "name": "Millonario", + "name_female": "Millonaria" + }, + "10M_MONEY": { + "name": "Elusión Fiscal" + }, + "DamageAchv": { + "description": "Inflige {{damageAmount}} daño en un solo golpe." + }, + "250_DMG": { + "name": "Golpe Maestro" + }, + "1000_DMG": { + "name": "Golpe Devastador" + }, + "2500_DMG": { + "name": "¡Eso es un montón de daño!" + }, + "10000_DMG": { + "name": "One Punch Man" + }, + "HealAchv": { + "description": "Cura {{healAmount}} {{HP}} de una, con un movimiento, habilidad o objeto equipado." + }, + "250_HEAL": { + "name": "Sanador Novato", + "name_female": "Sanadora Novata" + }, + "1000_HEAL": { + "name": "Gran Sanador", + "name_female": "Gran Sanadora" + }, + "2500_HEAL": { + "name": "Clérigo", + "name_female": "Clériga" + }, + "10000_HEAL": { + "name": "Centro Pokémon" + }, + "LevelAchv": { + "description": "Sube a un Pokémon al nivel {{level}}." + }, + "LV_100": { + "name": "¡Pero espera, aún hay mas!" + }, + "LV_250": { + "name": "Élite" + }, + "LV_1000": { + "name": "Supera tus límites" + }, + "RibbonAchv": { + "description": "Acumula un total de {{ribbonAmount}} Cintas." + }, + "10_RIBBONS": { + "name": "Campeón Liga Pokémon", + "name_female": "Campeona Liga Pokémon" + }, + "25_RIBBONS": { + "name": "Campeón Liga Super", + "name_female": "Campeona Liga Super" + }, + "50_RIBBONS": { + "name": "Campeón Liga Ultra", + "name_female": "Campeona Liga Ultra" + }, + "75_RIBBONS": { + "name": "Campeón Liga Rogue", + "name_female": "Campeona Liga Rogue" + }, + "100_RIBBONS": { + "name": "Campeón Liga Master", + "name_female": "Campeona Liga Master" + }, + "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." + }, + "MAX_FRIENDSHIP": { + "name": "Amistad Total", + "description": "Alcanza con un Pokémon la amistad al máximo." + }, + "MEGA_EVOLVE": { + "name": "Megamorfosis", + "description": "Megaevoluciona a un Pokémon." + }, + "GIGANTAMAX": { + "name": "Criatura Colosal", + "description": "Haz Gigantamax a un Pokémon." + }, + "TERASTALLIZE": { + "name": "Entusiasta del STAB", + "description": "Teracristaliza a un Pokémon." + }, + "STELLAR_TERASTALLIZE": { + "name": "El Tipo Oculto", + "description": "Teracristaliza a un Pokémon al tipo Astral." + }, + "SPLICE": { + "name": "Infinite Fusion", + "description": "Fusiona dos Pokémon con la Punta ADN." + }, + "MINI_BLACK_HOLE": { + "name": "Devorador de Objetos", + "description": "Adquiere un Mini Agujero Negro." + }, + "CATCH_MYTHICAL": { + "name": "Singular", + "description": "Captura a un Pokémon Singular." + }, + "CATCH_SUB_LEGENDARY": { + "name": "(Sub)Legendario", + "description": "Captura a un Pokémon Sublegendario." + }, + "CATCH_LEGENDARY": { + "name": "Legendario", + "description": "Captura a un Pokémon Legendario." + }, + "SEE_SHINY": { + "name": "Shiny", + "description": "Encuentra a un Pokémon Shiny salvaje." + }, + "SHINY_PARTY": { + "name": "Eso es dedicación", + "description": "Tener un equipo completo de Pokémon shiny." + }, + "HATCH_MYTHICAL": { + "name": "Huevo Singular", + "description": "Hacer eclosionar un Pokémon Singular de un huevo." + }, + "HATCH_SUB_LEGENDARY": { + "name": "Huevo Sublegendario", + "description": "Hacer eclosionar un Pokémon Sublegendario de un huevo." + }, + "HATCH_LEGENDARY": { + "name": "Huevo Legendario", + "description": "Hacer eclosionar un Pokémon Legendario de un huevo." + }, + "HATCH_SHINY": { + "name": "Huevo Shiny", + "description": "Hacer eclosionar un Pokémon Shiny de un huevo." + }, + "HIDDEN_ABILITY": { + "name": "Potencial Oculto", + "description": "Captura un Pokémon con una habilidad oculta." + }, + "PERFECT_IVS": { + "name": "Certificado de Autenticidad", + "description": "Consigue IVs perfectos en un Pokémon." + }, + "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" + } +} diff --git a/src/locales/es/achv.ts b/src/locales/es/achv.ts deleted file mode 100644 index 47348903b28..00000000000 --- a/src/locales/es/achv.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "Achievements": { - name: "Logros", - }, - "Locked": { - name: "Bloqueado", - }, - - "MoneyAchv": { - description: "Acumula un total de ₽{{moneyAmount}}.", - }, - "10K_MONEY": { - name: "Ahorrador", - }, - "100K_MONEY": { - name: "Rico", - }, - "1M_MONEY": { - name: "Millonario", - }, - "10M_MONEY": { - name: "Elusión Fiscal", - }, - - "DamageAchv": { - description: "Inflige {{damageAmount}} daño en un solo golpe.", - }, - "250_DMG": { - name: "Golpe Maestro", - }, - "1000_DMG": { - name: "Golpe Devastador", - }, - "2500_DMG": { - name: "¡Eso es un montón de daño!", - }, - "10000_DMG": { - name: "One Punch Man", - }, - - "HealAchv": { - description: "Cura {{healAmount}} {{HP}} de una, con un movimiento, habilidad o objeto equipado.", - }, - "250_HEAL": { - name: "Sanador Novato", - }, - "1000_HEAL": { - name: "Gran Sanador", - }, - "2500_HEAL": { - name: "Clérigo", - }, - "10000_HEAL": { - name: "Centro Pokémon", - }, - - "LevelAchv": { - description: "Sube a un Pokémon al nivel {{level}}.", - }, - "LV_100": { - name: "¡Pero espera, aún hay mas!", - }, - "LV_250": { - name: "Élite", - }, - "LV_1000": { - name: "Supera tus límites", - }, - - "RibbonAchv": { - description: "Acumula un total de {{ribbonAmount}} Cintas.", - }, - "10_RIBBONS": { - name: "Campeón Liga Pokémon", - }, - "25_RIBBONS": { - name: "Campeón Liga Super", - }, - "50_RIBBONS": { - name: "Campeón Liga Ultra", - }, - "75_RIBBONS": { - name: "Campeón Liga Rogue", - }, - "100_RIBBONS": { - name: "Campeón Liga Master", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "Trabajo en Equipo", - description: "Haz relevo a otro miembro del equipo con al menos una estadística al máximo.", - }, - "MAX_FRIENDSHIP": { - name: "Amistad Total", - description: "Alcanza con un Pokémon la amistad al máximo.", - }, - "MEGA_EVOLVE": { - name: "Megamorfosis", - description: "Megaevoluciona a un Pokémon.", - }, - "GIGANTAMAX": { - name: "Criatura Colosal", - description: "Haz Gigantamax a un Pokémon.", - }, - "TERASTALLIZE": { - name: "Entusiasta del STAB", - description: "Teracristaliza a un Pokémon.", - }, - "STELLAR_TERASTALLIZE": { - name: "El Tipo Oculto", - description: "Teracristaliza a un Pokémon al tipo Astral.", - }, - "SPLICE": { - name: "Infinite Fusion", - description: "Fusiona dos Pokémon con la Punta ADN.", - }, - "MINI_BLACK_HOLE": { - name: "Devorador de Objetos", - description: "Adquiere un Mini Agujero Negro.", - }, - "CATCH_MYTHICAL": { - name: "Singular", - description: "Captura a un Pokémon Singular.", - }, - "CATCH_SUB_LEGENDARY": { - name: "(Sub)Legendario", - description: "Captura a un Pokémon Sublegendario.", - }, - "CATCH_LEGENDARY": { - name: "Legendario", - description: "Captura a un Pokémon Legendario.", - }, - "SEE_SHINY": { - name: "Shiny", - description: "Encuentra a un Pokémon Shiny salvaje.", - }, - "SHINY_PARTY": { - name: "Eso es dedicación", - description: "Tener un equipo completo de Pokémon shiny.", - }, - "HATCH_MYTHICAL": { - name: "Huevo Singular", - description: "Hacer eclosionar un Pokémon Singular de un huevo.", - }, - "HATCH_SUB_LEGENDARY": { - name: "Huevo Sublegendario", - description: "Hacer eclosionar un Pokémon Sublegendario de un huevo.", - }, - "HATCH_LEGENDARY": { - name: "Huevo Legendario", - description: "Hacer eclosionar un Pokémon Legendario de un huevo.", - }, - "HATCH_SHINY": { - name: "Huevo Shiny", - description: "Hacer eclosionar un Pokémon Shiny de un huevo.", - }, - "HIDDEN_ABILITY": { - name: "Potencial Oculto", - description: "Captura un Pokémon con una habilidad oculta.", - }, - "PERFECT_IVS": { - name: "Certificado de Autenticidad", - description: "Consigue IVs perfectos en un Pokémon.", - }, - "CLASSIC_VICTORY": { - name: "Imbatible", - description: "Completa el juego en modo clásico.", - }, - - "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: "Mono NORMAL", - }, - "MONO_FIGHTING": { - name: "I Know Kung Fu", - }, - "MONO_FLYING": { - name: "Mono FLYING", - }, - "MONO_POISON": { - name: "Kanto's Favourite", - }, - "MONO_GROUND": { - name: "Mono GROUND", - }, - "MONO_ROCK": { - name: "Brock Hard", - }, - "MONO_BUG": { - name: "Sting Like A Beedrill", - }, - "MONO_GHOST": { - name: "Who you gonna call?", - }, - "MONO_STEEL": { - name: "Mono STEEL", - }, - "MONO_FIRE": { - name: "Mono FIRE", - }, - "MONO_WATER": { - name: "When It Rains, It Pours", - }, - "MONO_GRASS": { - name: "Mono GRASS", - }, - "MONO_ELECTRIC": { - name: "Mono ELECTRIC", - }, - "MONO_PSYCHIC": { - name: "Mono PSYCHIC", - }, - "MONO_ICE": { - name: "Mono ICE", - }, - "MONO_DRAGON": { - name: "Mono DRAGON", - }, - "MONO_DARK": { - name: "It's just a phase", - }, - "MONO_FAIRY": { - name: "Mono FAIRY", - }, -} as const; - -// Achievement translations for the when the player character is female (it for now uses the same translations as the male version) -export const PGFachv: AchievementTranslationEntries = PGMachv; diff --git a/src/locales/es/arena-flyout.json b/src/locales/es/arena-flyout.json new file mode 100644 index 00000000000..64c9a489d73 --- /dev/null +++ b/src/locales/es/arena-flyout.json @@ -0,0 +1,41 @@ +{ + "activeBattleEffects": "Efectos de terreno activos", + "player": "Jugador", + "neutral": "Neutral", + "enemy": "Enemigo", + "sunny": "Sol", + "rain": "Lluvia", + "sandstorm": "Tormenta de arena", + "hail": "Granizo", + "snow": "Nieve", + "fog": "Niebla", + "heavyRain": "Diluvio", + "harshSun": "Sol abrasador", + "strongWinds": "Turbulencias", + "misty": "Campo de niebla", + "electric": "Campo eléctrico", + "grassy": "Campo de hierba", + "psychic": "Campo psíquico", + "mudSport": "Chapoteo Lodo", + "waterSport": "Hidrochorro", + "spikes": "Púas", + "toxicSpikes": "Púas Tóxicas", + "mist": "Neblina", + "futureSight": "Premonición", + "doomDesire": "Deseo Oculto", + "wish": "Deseo", + "stealthRock": "Trampa Rocas", + "stickyWeb": "Red Vidcosa", + "trickRoom": "Espacio Raro", + "gravity": "Gravedad", + "reflect": "Reflejo", + "lightScreen": "Pantalla de Luz", + "auroraVeil": "Velo Aurora", + "quickGuard": "Anticipo", + "wideGuard": "Vasta Guardia", + "matBlock": "Escudo Tatami", + "craftyShield": "Truco Defensa", + "tailwind": "Viento Afín", + "happyHour": "Paga Extra", + "safeguard": "Velo Sagrado" +} diff --git a/src/locales/es/arena-tag.json b/src/locales/es/arena-tag.json new file mode 100644 index 00000000000..0f63b62e784 --- /dev/null +++ b/src/locales/es/arena-tag.json @@ -0,0 +1,57 @@ +{ + "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/battle-info.json b/src/locales/es/battle-info.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/es/battle-info.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/es/battle-message-ui-handler.json b/src/locales/es/battle-message-ui-handler.json new file mode 100644 index 00000000000..e1b63313ab6 --- /dev/null +++ b/src/locales/es/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "Inmejorable", + "ivFantastic": "Fantástico", + "ivVeryGood": "Notable", + "ivPrettyGood": "Genial", + "ivDecent": "No está mal", + "ivNoGood": "Cojea un poco" +} \ No newline at end of file diff --git a/src/locales/es/battle-message-ui-handler.ts b/src/locales/es/battle-message-ui-handler.ts deleted file mode 100644 index cfc913f4b50..00000000000 --- a/src/locales/es/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "Inmejorable", - "ivFantastic": "Fantástico", - "ivVeryGood": "Notable", - "ivPrettyGood": "Genial", - "ivDecent": "No está mal", - "ivNoGood": "Cojea un poco", -} as const; diff --git a/src/locales/es/battle-scene.json b/src/locales/es/battle-scene.json new file mode 100644 index 00000000000..ef916edbf08 --- /dev/null +++ b/src/locales/es/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "{{formattedMoney}} ₽" +} \ No newline at end of file diff --git a/src/locales/es/battle.json b/src/locales/es/battle.json new file mode 100644 index 00000000000..c79315f297b --- /dev/null +++ b/src/locales/es/battle.json @@ -0,0 +1,89 @@ +{ + "bossAppeared": "¡{{bossName}} te corta el paso!", + "trainerAppeared": "¡{{trainerName}}\nte desafía!", + "trainerSendOut": "¡{{trainerName}} saca a\n{{pokemonName}}!", + "singleWildAppeared": "¡Un {{pokemonName}} salvaje te corta el paso!", + "multiWildAppeared": "¡Un {{pokemonName1}} y un {{pokemonName2}} salvajes\nte cortan el paso!", + "playerComeBack": "¡{{pokemonName}}, ven aquí!", + "trainerComeBack": "¡{{trainerName}} retira a {{pokemonName}} del combate!", + "playerGo": "¡Adelante, {{pokemonName}}!", + "trainerGo": "¡{{trainerName}} saca a {{pokemonName}}!", + "switchQuestion": "¿Quieres cambiar a\n{{pokemonName}}?", + "trainerDefeated": "¡Has derrotado a\n{{trainerName}}!", + "moneyWon": "¡Has ganado\n₽{{moneyAmount}} por vencer!", + "pokemonCaught": "¡{{pokemonName}} atrapado!", + "addedAsAStarter": "{{pokemonName}} ha sido añadido\na tus iniciales!", + "partyFull": "Tu equipo esta completo.\n¿Quieres liberar un Pokémon para meter a {{pokemonName}}?", + "pokemon": "Pokémon", + "sendOutPokemon": "¡Adelante, {{pokemonName}}!", + "hitResultCriticalHit": "¡Un golpe crítico!", + "hitResultSuperEffective": "¡Es supereficaz!", + "hitResultNotVeryEffective": "No es muy eficaz…", + "hitResultNoEffect": "No afecta a {{pokemonName}}!", + "hitResultImmune": "¡No afecta a {{pokemonName}}!", + "hitResultOneHitKO": "¡KO en 1 golpe!", + "attackFailed": "¡Pero ha fallado!", + "attackMissed": "¡{{pokemonNameWithAffix}}\nha evitado el ataque!", + "attackHitsCount": "N.º de golpes: {{count}}.", + "rewardGain": "¡Has obtenido\n{{modifierName}}!", + "expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.", + "levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!", + "learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!", + "learnMovePrompt": "{{pokemonName}} quiere aprender\n{{moveName}}.", + "learnMoveLimitReached": "Pero, {{pokemonName}} ya conoce\ncuatro movimientos.", + "learnMoveReplaceQuestion": "¿Quieres sustituir uno de sus movimientos por {{moveName}}?", + "learnMoveStopTeaching": "¿Prefieres que no aprenda\n{{moveName}}?", + "learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.", + "learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?", + "learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}y@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}¡Puf!", + "learnMoveAnd": "Y…", + "levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!", + "moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.", + "moveNoPP": "¡No hay suficientes PP\npara este movimiento!", + "moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!", + "disableInterruptedMove": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!", + "noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.", + "noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!", + "noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!", + "noPokeballStrong": "¡Este Pokémon es demasiado fuerte para ser capturado!\nNecesitas bajarle los PS primero!", + "noEscapeForce": "Una fuerza misteriosa\nte impide huir.", + "noEscapeTrainer": "¡No puedes huir de los\ncombates contra Entrenadores!", + "noEscapePokemon": "¡El movimiento {{moveName}} de {{pokemonName}} impide la huida!", + "runAwaySuccess": "¡Escapas sin problemas!", + "runAwayCannotEscape": "¡No has podido escapar!", + "escapeVerbSwitch": "cambiar", + "escapeVerbFlee": "huir", + "notDisabled": "¡El movimiento {{moveName}} de {{pokemonName}}\nya no está anulado!", + "turnEndHpRestore": "Los PS de {{pokemonName}} fueron restaurados.", + "hpIsFull": "¡Los PS de {{pokemonName}}\nestán al máximo!", + "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", + "itemStackFull": "El máximo número de {{fullItemName}} ha sido alcanzado. Recibirás {{itemName}} en su lugar.", + "eggHatching": "¿Y esto?", + "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?", + "wildPokemonWithAffix": "El {{pokemonName}} salvaje", + "foePokemonWithAffix": "El {{pokemonName}} enemigo", + "useMove": "¡{{pokemonNameWithAffix}} usó {{moveName}}!", + "drainMessage": "¡{{pokemonName}} tuvo su\nenergía absorbida!", + "regainHealth": "¡{{pokemonName}} recuperó\nPS!", + "stealEatBerry": "¡{{pokemonName}} robó la {{berryName}}\nde {{targetName}} y se la comió!", + "fainted": "¡{{pokemonNameWithAffix}} se debilitó!", + "statsAnd": "y", + "stats": "Las estadísticas", + "statRose_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido!", + "statRose_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han subido!", + "statSharplyRose_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido mucho!", + "statSharplyRose_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han subido mucho!", + "statRoseDrastically_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido muchísimo!", + "statRoseDrastically_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han subido muchísimo!", + "statWontGoAnyHigher_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede subir más!", + "statWontGoAnyHigher_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden subir más!", + "statFell_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado!", + "statFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado!", + "statHarshlyFell_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado mucho!", + "statHarshlyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado mucho!", + "statSeverelyFell_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!", + "statSeverelyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado muchísimo!", + "statWontGoAnyLower_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", + "statWontGoAnyLower_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden bajar más!" +} diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts deleted file mode 100644 index 7f5832d069d..00000000000 --- a/src/locales/es/battle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "¡{{bossName}} te corta el paso!", - "trainerAppeared": "¡{{trainerName}}\nte desafía!", - "trainerAppearedDouble": "¡{{trainerName}}\nwould te desafían!", - "trainerSendOut": "¡{{trainerName}} saca a\n{{pokemonName}}!", - "singleWildAppeared": "¡Un {{pokemonName}} salvaje te corta el paso!", - "multiWildAppeared": "¡Un {{pokemonName1}} y un {{pokemonName2}} salvajes\nte cortan el paso!", - "playerComeBack": "¡{{pokemonName}}, ven aquí!", - "trainerComeBack": "¡{{trainerName}} retira a {{pokemonName}} del combate!", - "playerGo": "¡Adelante, {{pokemonName}}!", - "trainerGo": "¡{{trainerName}} saca a {{pokemonName}}!", - "switchQuestion": "¿Quieres cambiar a\n{{pokemonName}}?", - "trainerDefeated": "¡Has derrotado a\n{{trainerName}}!", - "moneyWon": "¡Has ganado\n₽{{moneyAmount}} por vencer!", - "pokemonCaught": "¡{{pokemonName}} atrapado!", - "addedAsAStarter": "{{pokemonName}} ha sido añadido\na tus iniciales!", - "partyFull": "Tu equipo esta completo.\n¿Quieres liberar un Pokémon para meter a {{pokemonName}}?", - "pokemon": "Pokémon", - "sendOutPokemon": "¡Adelante, {{pokemonName}}!", - "hitResultCriticalHit": "¡Un golpe crítico!", - "hitResultSuperEffective": "¡Es supereficaz!", - "hitResultNotVeryEffective": "No es muy eficaz…", - "hitResultNoEffect": "No afecta a {{pokemonName}}!", - "hitResultOneHitKO": "¡KO en 1 golpe!", - "attackFailed": "¡Pero ha fallado!", - "attackHitsCount": "N.º de golpes: {{count}}.", - "rewardGain": "¡Has obtenido\n{{modifierName}}!", - "expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.", - "levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!", - "learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!", - "learnMovePrompt": "{{pokemonName}} quiere aprender\n{{moveName}}.", - "learnMoveLimitReached": "Pero, {{pokemonName}} ya conoce\ncuatro movimientos.", - "learnMoveReplaceQuestion": "¿Quieres sustituir uno de sus movimientos por {{moveName}}?", - "learnMoveStopTeaching": "¿Prefieres que no aprenda\n{{moveName}}?", - "learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.", - "learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?", - "learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}y@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}¡Puf!", - "learnMoveAnd": "Y…", - "levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!", - "moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.", - "moveNoPP": "¡No hay suficientes PP\npara este movimiento!", - "moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!", - "noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.", - "noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!", - "noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!", - "noPokeballStrong": "¡Este Pokémon es demasiado fuerte para ser capturado!\nNecesitas bajarle los PS primero!", - "noEscapeForce": "Una fuerza misteriosa\nte impide huir.", - "noEscapeTrainer": "¡No puedes huir de los\ncombates contra Entrenadores!", - "noEscapePokemon": "¡El movimiento {{moveName}} de {{pokemonName}} impide la huida!", - "runAwaySuccess": "¡Escapas sin problemas!", - "runAwayCannotEscape": "¡No has podido escapar!", - "escapeVerbSwitch": "cambiar", - "escapeVerbFlee": "huir", - "notDisabled": "¡El movimiento {{moveName}} de {{pokemonName}}\nya no está anulado!", - "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", - "hpIsFull": "{{pokemonName}}'s\nHP is full!", - "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", - "eggHatching": "¿Y esto?", - "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?", - "wildPokemonWithAffix": "El {{pokemonName}} salvaje", - "foePokemonWithAffix": "El {{pokemonName}} enemigo", - "useMove": "¡{{pokemonNameWithAffix}} usó {{moveName}}!", - "drainMessage": "¡{{pokemonName}} tuvo su\nenergía absorbida!", - "regainHealth": "¡{{pokemonName}} recuperó\nPS!", - "stealEatBerry": "¡{{pokemonName}} robó la {{berryName}}\nde {{targetName}} y se la comió!", - "fainted": "¡{{pokemonNameWithAffix}} se debilitó!", - "statRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido!", - "statSharplyRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido mucho!", - "statRoseDrastically": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido muchísimo!", - "statWontGoAnyHigher": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede subir más!", - "statFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado!", - "statHarshlyFell": "¡El {{stats}} de {{pokemonNameWithAffix}}} ha bajado mucho!", - "statSeverelyFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!", - "statWontGoAnyLower": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", - "battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", - "battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" -} as const; diff --git a/src/locales/es/battler-tags.json b/src/locales/es/battler-tags.json new file mode 100644 index 00000000000..891fda53c5d --- /dev/null +++ b/src/locales/es/battler-tags.json @@ -0,0 +1,73 @@ +{ + "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!", + "disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!", + "disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} \n ya no está anulado!" +} diff --git a/src/locales/es/berry.json b/src/locales/es/berry.json new file mode 100644 index 00000000000..befbb9a892f --- /dev/null +++ b/src/locales/es/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "Baya Zidra", + "effect": "Restaura 25% PS si estos caen por debajo del 50%" + }, + "LUM": { + "name": "Baya Ziuela", + "effect": "Cura cualquier problema de estado" + }, + "ENIGMA": { + "name": "Baya Enigma", + "effect": "Restaura 25% PS si le alcanza un ataque supereficaz" + }, + "LIECHI": { + "name": "Baya Lichi", + "effect": "Aumenta el ataque si los PS están por debajo de 25%" + }, + "GANLON": { + "name": "Baya Gonlan", + "effect": "Aumenta la defensa si los PS están por debajo de 25%" + }, + "PETAYA": { + "name": "Baya Yapati", + "effect": "Aumenta el ataque especial si los PS están por debajo de 25%" + }, + "APICOT": { + "name": "Baya Aricoc", + "effect": "Aumenta la defensa especial si los PS están por debajo de 25%" + }, + "SALAC": { + "name": "Baya Aslac", + "effect": "Aumenta la velocidad si los PS están por debajo de 25%" + }, + "LANSAT": { + "name": "Baya Zonlan", + "effect": "Aumenta el índice de golpe crítico si los PS están por debajo de 25%" + }, + "STARF": { + "name": "Baya Arabol", + "effect": "Aumenta mucho una estadística al azar si los PS están por debajo de 25%" + }, + "LEPPA": { + "name": "Baya Zanama", + "effect": "Restaura 10 PP del primer movimiento cuyos PP bajen a 0" + } +} \ No newline at end of file diff --git a/src/locales/es/berry.ts b/src/locales/es/berry.ts deleted file mode 100644 index 0bebdf43c13..00000000000 --- a/src/locales/es/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "Baya Zidra", - effect: "Restaura 25% PS si estos caen por debajo del 50%", - }, - "LUM": { - name: "Baya Ziuela", - effect: "Cura cualquier problema de estado", - }, - "ENIGMA": { - name: "Baya Enigma", - effect: "Restaura 25% PS si le alcanza un ataque supereficaz", - }, - "LIECHI": { - name: "Baya Lichi", - effect: "Aumenta el ataque si los PS están por debajo de 25%", - }, - "GANLON": { - name: "Baya Gonlan", - effect: "Aumenta la defensa si los PS están por debajo de 25%", - }, - "PETAYA": { - name: "Baya Yapati", - effect: "Aumenta el ataque especial si los PS están por debajo de 25%", - }, - "APICOT": { - name: "Baya Aricoc", - effect: "Aumenta la defensa especial si los PS están por debajo de 25%", - }, - "SALAC": { - name: "Baya Aslac", - effect: "Aumenta la velocidad si los PS están por debajo de 25%", - }, - "LANSAT": { - name: "Baya Zonlan", - effect: "Aumenta el índice de golpe crítico si los PS están por debajo de 25%", - }, - "STARF": { - name: "Baya Arabol", - effect: "Aumenta mucho una estadística al azar si los PS están por debajo de 25%", - }, - "LEPPA": { - name: "Baya Zanama", - effect: "Restaura 10 PP del primer movimiento cuyos PP bajen a 0", - }, -} as const; diff --git a/src/locales/es/bgm-name.json b/src/locales/es/bgm-name.json new file mode 100644 index 00000000000..f0e0ab7e852 --- /dev/null +++ b/src/locales/es/bgm-name.json @@ -0,0 +1,149 @@ +{ + "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_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_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 - ¡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 - ¡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", + "cave": "PMD EoS - Cueva de la Cumbre del Cielo", + "construction_site": "PMD EoS - Roquedal", + "desert": "PMD EoS - Desierto Norte", + "dojo": "PMD EoS - Dojo Marowak", + "end": "PMD RTDX - Torre del Cielo", + "factory": "PMD EoS - Ruinas Camufladas", + "fairy_cave": "PMD EoS - Cueva Estrella", + "forest": "PMD EoS - Bosque Sombrío", + "grass": "PMD EoS - Manzanar", + "graveyard": "PMD EoS - Bosque Misterio", + "ice_cave": "PMD EoS - Gran Iceberg", + "island": "PMD EoS - Costa Escarpada", + "jungle": "Lmz - Jungla", + "laboratory": "Firel - Laboratorio", + "lake": "PMD EoS - Cueva Cristal", + "meadow": "PMD EoS - Bosque de la Cumbre del Cielo", + "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 - Misticismo marino", + "seabed": "Firel - Lecho del mar", + "slum": "Andr06 - Snom sigiloso", + "snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo", + "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 - ¡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/bgm-name.ts b/src/locales/es/bgm-name.ts deleted file mode 100644 index cda6fba84f4..00000000000 --- a/src/locales/es/bgm-name.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "Música", - "missing_entries" : "{{name}}", - "battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!", - "battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!", - "battle_hoenn_champion": "B2W2 - ¡Vs Campeón de Hoenn!", - "battle_sinnoh_champion": "B2W2 - ¡Vs Campeón de Sinnoh!", - "battle_champion_alder": "BW - ¡Vs Campeón de Teselia!", - "battle_champion_iris": "B2W2 - ¡Vs Campeón de Teselia!", - "battle_kalos_champion": "XY - ¡Vs Campeón de Kalos!", - "battle_alola_champion": "USUM - ¡Vs Campeón de Alola!", - "battle_galar_champion": "SWSH - ¡Vs Campeón de Galar!", - "battle_champion_geeta": "SV - ¡Vs Campeona Ságita!", - "battle_champion_nemona": "SV - ¡Vs Campeona Mencía!", - "battle_champion_kieran": "SV - ¡Vs Campeón Cass!", - "battle_hoenn_elite": "ORAS - ¡Vs Alto Mando!", - "battle_unova_elite": "BW - ¡Vs Alto Mando!", - "battle_kalos_elite": "XY - ¡Vs Alto Mando!", - "battle_alola_elite": "SM - ¡Vs Alto Mando!", - "battle_galar_elite": "SWSH - Torneo de Finalistas", - "battle_paldea_elite": "SV - ¡Vs Alto Mando!", - "battle_bb_elite": "SV - ¡Vs Alto Mando de la Academia Arándano!", - "battle_final_encounter": "PMD RTDX - Dominio de Rayquaza", - "battle_final": "BW - ¡Vs Ghechis!", - "battle_kanto_gym": "B2W2 - ¡Vs Líder de Kanto!", - "battle_johto_gym": "B2W2 - ¡Vs Líder de Johto!", - "battle_hoenn_gym": "B2W2 - ¡Vs Líder de Hoenn!", - "battle_sinnoh_gym": "B2W2 - ¡Vs Líder de Sinnoh!", - "battle_unova_gym": "BW - ¡Vs Líder de Teselia!", - "battle_kalos_gym": "XY - ¡Vs Líder de Kalos!", - "battle_galar_gym": "SWSH - ¡Vs Líder de Galar!", - "battle_paldea_gym": "SV - ¡Vs Líder de Paldea!", - "battle_legendary_kanto": "XY - ¡Vs Legendarios de Kanto!", - "battle_legendary_raikou": "HGSS - ¡Vs Raikou!", - "battle_legendary_entei": "HGSS - ¡Vs Entei!", - "battle_legendary_suicune": "HGSS - ¡Vs Suicune!", - "battle_legendary_lugia": "HGSS - ¡Vs Lugia!", - "battle_legendary_ho_oh": "HGSS - ¡Vs Ho-oh!", - "battle_legendary_regis_g5": "B2W2 - ¡Vs Regis!", - "battle_legendary_regis_g6": "ORAS - ¡Vs Regis!", - "battle_legendary_gro_kyo": "ORAS - ¡Vs Groudon/Kyogre!", - "battle_legendary_rayquaza": "ORAS - ¡Vs Rayquaza!", - "battle_legendary_deoxys": "ORAS - ¡Vs Deoxys!", - "battle_legendary_lake_trio": "ORAS - ¡Vs Trío del Lago!", - "battle_legendary_sinnoh": "ORAS - ¡Vs Legendarios de Sinnoh!", - "battle_legendary_dia_pal": "ORAS - ¡Vs Dialga/Palkia!", - "battle_legendary_giratina": "ORAS - ¡Vs Giratina!", - "battle_legendary_arceus": "HGSS - ¡Vs Arceus!", - "battle_legendary_unova": "BW - ¡Vs Legendarios de Teselia!", - "battle_legendary_kyurem": "BW - ¡Vs Kyurem!", - "battle_legendary_res_zek": "BW - ¡Vs Reshiram/Zekrom!", - "battle_legendary_xern_yvel": "XY - ¡Vs Xerneas/Yveltal!", - "battle_legendary_tapu": "SM - ¡Vs Tapus!", - "battle_legendary_sol_lun": "SM - ¡Vs Solgaleo/Lunala!", - "battle_legendary_ub": "SM - ¡Vs Ultraentes!", - "battle_legendary_dusk_dawn": "USUM - ¡Vs Necrozma Melena Crepuscular/Alas del Alba!", - "battle_legendary_ultra_nec": "USUM - ¡Vs Ultra-Necrozma!", - "battle_legendary_zac_zam": "SWSH - ¡Vs Zacian/Zamazenta!", - "battle_legendary_glas_spec": "SWSH - ¡Vs Glastrier/Spectrier!", - "battle_legendary_calyrex": "SWSH - ¡Vs Calyrex!", - "battle_legendary_birds_galar": "SWSH - ¡Vs Aves Legendarias de Galar!", - "battle_legendary_ruinous": "SV - ¡Vs Tesoros Funestos!", - "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", - "battle_legendary_loyal_three": "SV - ¡Vs Compatrones!", - "battle_legendary_ogerpon": "SV - ¡Vs Ogerpon!", - "battle_legendary_terapagos": "SV - ¡Vs Terapagos!", - "battle_legendary_pecharunt": "SV - ¡Vs Pecharunt!", - "battle_rival": "BW - ¡Vs Rival!", - "battle_rival_2": "BW - ¡Vs N!", - "battle_rival_3": "BW - ¡Vs N (Liga Pokémon)!", - "battle_trainer": "BW - ¡Vs Entrenador!", - "battle_wild": "BW - ¡Vs Pokémon Salvaje!", - "battle_wild_strong": "BW - ¡Vs Pokémon Salvaje Raro!", - "end_summit": "PMD RTDX - Techo del Cielo", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", - "battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", - - // Biome Music - "abyss": "PMD EoS - Cráter Oscuro", - "badlands": "PMD EoS - Valle Desolado", - "beach": "PMD EoS - Risco Calado", - "cave": "PMD EoS - Cueva de la Cumbre del Cielo", - "construction_site": "PMD EoS - Roquedal", - "desert": "PMD EoS - Desierto Norte", - "dojo": "PMD EoS - Dojo Marowak", - "end": "PMD RTDX - Torre del Cielo", - "factory": "PMD EoS - Ruinas Camufladas", - "fairy_cave": "PMD EoS - Cueva Estrella", - "forest": "PMD EoS - Bosque Sombrío", - "grass": "PMD EoS - Manzanar", - "graveyard": "PMD EoS - Bosque Misterio", - "ice_cave": "PMD EoS - Gran Iceberg", - "island": "PMD EoS - Costa Escarpada", - "jungle": "Lmz - Jungle", // The composer thinks about a more creative name - "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name - "lake": "PMD EoS - Cueva Cristal", - "meadow": "PMD EoS - Bosque de la Cumbre del Cielo", - "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name - "mountain": "PMD EoS - Monte Cuerno", - "plains": "PMD EoS - Pradera de la Cumbre del Cielo", - "power_plant": "PMD EoS - Pradera Destello", - "ruins": "PMD EoS - Sima Hermética", - "sea": "PMD EoS - Cueva Aguamar", - "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS - Costa de la Cumbre del Cielo", - "snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo", - "space": "Firel - Aether", - "swamp": "PMD EoS - Mar Circundante", - "tall_grass": "PMD EoS - Bosque Niebla", - "temple": "PMD EoS - Cueva Regia", - "town": "PMD EoS - Tema del territorio aleatorio 3", - "volcano": "PMD EoS - Cueva Vapor", - "wasteland": "PMD EoS - Corazón Tierra Oculta", - - // Encounter - "encounter_ace_trainer": "BW - Desafío Combate (Entrenador Guay)", - "encounter_backpacker": "BW - Desafío Combate (Mochilero)", - "encounter_clerk": "BW - Desafío Combate (Empresario)", - "encounter_cyclist": "BW - Desafío Combate (Ciclista)", - "encounter_lass": "BW - Desafío Combate (Chica)", - "encounter_parasol_lady": "BW - Desafío Combate (Dama parasol)", - "encounter_pokefan": "BW - Desafío Combate (Pokéfan)", - "encounter_psychic": "BW - Desafío Combate (Médium)", - "encounter_rich": "BW - Desafío Combate (Aristócrata)", - "encounter_rival": "BW - Desafío Combate (Cheren)", - "encounter_roughneck": "BW - Desafío Combate (Calvo)", - "encounter_scientist": "BW - Desafío Combate (Científico)", - "encounter_twins": "BW - Desafío Combate (Gemelas)", - "encounter_youngster": "BW - Desafío Combate (Joven)", - - // Other - "heal": "BW - Cura Pokémon", - "menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!", - "title": "PMD EoS - Tema del menú principal", -} as const; diff --git a/src/locales/es/biome.ts b/src/locales/es/biome.json similarity index 86% rename from src/locales/es/biome.ts rename to src/locales/es/biome.json index a0b861b57f5..ff67738a074 100644 --- a/src/locales/es/biome.ts +++ b/src/locales/es/biome.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { +{ "unknownLocation": "En algún lugar que no puedes recordar", "TOWN": "Pueblo", "PLAINS": "Valle", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "Bosque nevado", "ISLAND": "Isla", "LABORATORY": "Laboratorio", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/es/challenges.ts b/src/locales/es/challenges.json similarity index 66% rename from src/locales/es/challenges.ts rename to src/locales/es/challenges.json index 711be39b116..6a7db8c10c3 100644 --- a/src/locales/es/challenges.ts +++ b/src/locales/es/challenges.json @@ -1,8 +1,5 @@ -import { TranslationEntries } from "#app/interfaces/locales"; - -export const challenges: TranslationEntries = { +{ "title": "Parámetros de Desafíos", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", "singleGeneration": { "name": "Monogeneración", "desc": "Solo puedes usar Pokémon de {{gen}} generación.", @@ -15,11 +12,18 @@ export const challenges: TranslationEntries = { "gen_6": "sexta", "gen_7": "séptima", "gen_8": "octava", - "gen_9": "novena", + "gen_9": "novena" }, "singleType": { "name": "Monotipo", "desc": "Solo puedes usar Pokémon with the {{type}} type.", - "desc_default": "Solo puedes usar Pokémon del tipo elegido.", + "desc_default": "Solo puedes usar Pokémon del tipo elegido." }, -} as const; + "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/command-ui-handler.json b/src/locales/es/command-ui-handler.json new file mode 100644 index 00000000000..554b9548cca --- /dev/null +++ b/src/locales/es/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "Luchar", + "ball": "Balls", + "pokemon": "Pokémon", + "run": "Huir", + "actionMessage": "¿Qué debería\nhacer {{pokemonName}}?" +} \ No newline at end of file diff --git a/src/locales/es/command-ui-handler.ts b/src/locales/es/command-ui-handler.ts deleted file mode 100644 index 5ddde2c983a..00000000000 --- a/src/locales/es/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Luchar", - "ball": "Balls", - "pokemon": "Pokémon", - "run": "Huir", - "actionMessage": "¿Qué debería\nhacer {{pokemonName}}?", -} as const; diff --git a/src/locales/es/common.json b/src/locales/es/common.json new file mode 100644 index 00000000000..556ebb8454e --- /dev/null +++ b/src/locales/es/common.json @@ -0,0 +1,7 @@ +{ + "luckIndicator": "Suerte:", + "shinyOnHover": "Shiny", + "commonShiny": "Común", + "rareShiny": "Raro", + "epicShiny": "Épico" +} \ No newline at end of file diff --git a/src/locales/es/common.ts b/src/locales/es/common.ts deleted file mode 100644 index 82966b4ffeb..00000000000 --- a/src/locales/es/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "Start", -} as const; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index 551c7a2f6dc..8f75c08f3f6 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -1,94 +1,113 @@ -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const esConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - statusEffect: statusEffect, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather, - partyUiHandler: partyUiHandler + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory }; diff --git a/src/locales/es/dialogue-double-battle.json b/src/locales/es/dialogue-double-battle.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/es/dialogue-double-battle.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/es/dialogue-final-boss.json b/src/locales/es/dialogue-final-boss.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/es/dialogue-final-boss.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/es/dialogue-misc.json b/src/locales/es/dialogue-misc.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/es/dialogue-misc.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/es/dialogue.json b/src/locales/es/dialogue.json new file mode 100644 index 00000000000..cbd7dbf39ad --- /dev/null +++ b/src/locales/es/dialogue.json @@ -0,0 +1,52 @@ +{ + "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/es/dialogue.ts b/src/locales/es/dialogue.ts deleted file mode 100644 index c1b23b57fe0..00000000000 --- a/src/locales/es/dialogue.ts +++ /dev/null @@ -1,2669 +0,0 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Dialogue of the NPCs in the game when the player character is male (or unset) -export const PGMdialogue: DialogueTranslationEntries = { - "youngster": { - "encounter": { - 1: "Hey, ¿quieres luchar?", - 2: "¿También eres un entrenador novato?", - 3: "No te había visto antes. ¡Vamos a luchar!", - 4: "Perdí y estoy intentando buscar nuevos Pokémon.\n¡Espera, pareces débil! ¡Vamos, a luchar!", - 5: "¿Nos conocimos o no? Ni me acuerdo. ¡Supongo que es un gusto conocerte!", - 6: "¡Venga, vamos!", - 7: "¡Allá voy! ¡Te enseñaré mi poder!", - 8: "¡Ja ja ja! ¡Te enseñaré lo jimpresionante que es mi equipo!", - 9: "No pierdas tiempo saludando. ¡Adelante, cuando estés listo!", - 10: "No bajes la guardia o llorarás porque un niño te ganó.", - 11: "He cuidado a mis Pokémon con cariño. ¡Prohibido hacerles daño!", - 12: "¡Encantado de que lo lograses! A partir de aquí no será fácil.", - 13: "¡Las batallas continúan para siempre! ¡Bienvenido al mundo sin fin!" - }, - "victory": { - 1: "¡Guau! ¡Eres fuerte!", - 2: "¿No tuve oportunidad, eh?", - 3: "¡Cuando sea mayor te encontraré y te ganaré!", - 4: "Ay. No tengo más Pokémon.", - 5: "Imposible… ¡IMPOSIBLE! Cómo pude perder de nuevo…", - 6: "¡No! ¡Perdí!", - 7: "¡Guau! ¡Eres increíble! ¡Estoy alucinado y sorprendido!", - 8: "Puede ser… Cómo… Aunque mis Pokémon y yo somos los más fuertes…", - 9: "¡No perderé a la próxima! ¡Luchemos otra vez pronto!", - 10: "¡Oye! ¡No ves que solo soy un niño! ¡No es justo que vayas así conmigo!", - 11: "¡Tus Pokémon molan más! ¡Intercámbiamelos!", - 12: "Me perdí antes pero, ¿de qué tarea estaba hablando antes?", - 13: "¡Jajaja! ¡Esa es! ¡Correcto! ¡Ya te sientes como en casa en este mundo!" - } - }, - "lass": { - "encounter": { - 1: "¿Luchemos, podría ser?", - 2: "Pareces novato. ¡Luchemos!", - 3: "No te reconozco. ¿Un combate?", - 4: "¡Tengamos un combate Pokémon divertido!", - 5: "¡Te enseñaré lo básico de cómo entrenar Pokémon!", - 6: "¡Un combate serio empieza por un comienzo serio! ¿Seguro que estás listo?", - 7: "Solo se es joven una vez. Y solo tienes una oportunidad en una batalla. Pronto, solo serás un recuerdo.", - 8: "Asegúrate de ir fácil conmigo, ¿vale? ¡Pero seré seria luchando!", - 9: "El colegio es aburrido. No hay nada que hacer. Uaa. Solo lucho para pasar el tiempo." - }, - "victory": { - 1: "¡Impresionante! Tengo mucho que aprender.", - 2: "No pensé que me vencerías así…", - 3: "Espero la revancha algún día.", - 4: "¡Fue increíblemente divertido! Me dejaste cansada…", - 5: "¡Me enseñaste una lección! ¡Eres increíble!", - 6: "En serio, he perdido. O sea, es seriamente decepcionante, pero tú eres realmente guay.", - 7: "No necesito estos recuerdos. Borrando recuerdos…", - 8: "¡Te dije que fueses fácil conmigo! Aun así, me gusta cuando eres serio.", - 9: "Me canso de luchar… Habrá algo nuevo que hacer…" - } - }, - "breeder": { - "encounter": { - 1: "Pokémon obedientes, Pokémon egoístas… Los Pokémon tienen características únicas.", - 2: "Aunque tengo descendencia y comportamiento pobre, he cuidado muy bien a mis Pokémon.", - 3: "¿Tienes disciplina con tus Pokémon? Malcriarlos mucho no es bueno.", - }, - "victory": { - 1: "Es importante cuidar y mimar todas las características de los Pokémon.", - 2: "No como mi diabólica personalidad, mis Pokémon son muy buenos.", - 3: "Malcriar puede arruinar a los Pokémon y a los humanos.", - }, - "defeat": { - 1: "No deberías enfadarte con tu Pokémon, aún tras un combate perdido.", - 2: "¿Eh? ¿Buen Pokémon? Me acostumbro a cuidarlos.", - 3: "No importa el cariño que le tengas a tus Pokémon, tienes que ser serio si se portan mal." - } - }, - "breeder_female": { - "encounter": { - 1: "Los Pokémon nunca te traicionan, te devuelven el amor que les diste.", - 2: "¿Puedo darte un consejo para entrenar bien tus Pokémon?", - 3: "Cuidé estos Pokémon con un método especial." - }, - "victory": { - 1: "Ugh… No se supone que acabaría así. ¿Les cuidé de forma errónea?", - 2: "Cómo pudo pasarle esto a mi Pokémon... ¿Qué le das a tu Pokémon?", - 3: "Si pierdo, solo fue un pasatiempo. Mi ego se ve intacto." - }, - "defeat": { - 1: "Esto demuestra que los Pokémon aceptaron mi amor.", - 2: "El truco detrás de atrapar buenos Pokémon es cuidar buenos Pokémon.", - 3: "Los Pokémon serán fuertes o débiles según los cuides." - } - }, - "fisherman": { - "encounter": { - 1: "¡Uy uy uy! ¡Hiciste que huyera un pez!\n¿Qué harás al respecto?", - 2: "¡Vete! ¡Espantas los Pokémon!", - 3: "¡Veamos si pescas una victoria!", - }, - "victory": { - 1: "Olvídalo.", - 2: "A la siguiente, ¡pescaré mi victoria!", - 3: "Infravaloré la corriente esta vez.", - }, - }, - "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. - $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: "¡Amigo, te haré caminar por la borda si pierdes!", - 2: "¡Adelante! ¡Mi orgullo como marinero está en auge!", - 3: "¡Ah del barco! ¿Estás mareado?" - }, - "victory": { - 1: "¡Argh! ¡Derrotado por un niño!", - 2: "¡Tu espíritu me ha hundido!", - 3: "Creo que soy yo quien está mareado..." - }, - }, - "rocket_grunt": { - "encounter": { - 1: "¡Ríndete ahora, o prepárate para luchar!" - }, - "victory": { - 1: "¡El Team Rocket despega de nuevo!" - }, - }, - "magma_grunt": { - "encounter": { - 1: "¡No esperes piedad si te interpones al Team Magma!" - }, - "victory": { - 1: "¿Eh? ¿He perdido?" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "El Team Aqua no muestra piedad, ¡ni siquiera a los niños!" - }, - "victory": { - 1: "¡Bromeas! ¡No me lo creo!" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "¡No desafíes al Equipo Galaxia, te arrepentirás!" - }, - "victory": { - 1: "Me callaste la boca..." - }, - }, - "plasma_grunt": { - "encounter": { - 1: "¡El Equipo Plasma no tolerará otros ideales!" - }, - "victory": { - 1: "Plasmaaaaaaaaa!" - }, - }, - "flare_grunt": { - "encounter": { - 1: "¡La moda es lo más importante para nosotros!" - }, - "victory": { - 1: "Me temo que se me avecina un futuro oscuro..." - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "He de decir... estoy impresionado de que hayas llegado tan lejos." - }, - "victory": { - 1: "¿¡QUÉ?! ¡No puede ser!" - }, - "defeat": { - 1: "Recuerda mis palabras: Que no seas capaz de medir\n tu propia fuerza demuestra que todavía eres un niño" - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "Mis antiguos socios me necesitan... ¿te atreves a imponerte en mi camino?" - }, - "victory": { - 1: "¿Cómo es esto posible?\nEl sueño del Team Rocket, ahora tan solo una mera ilusión..." - }, - "defeat": { - 1: "El Team Rocket renacerá... ¡y gobernaré el mundo!" - } - }, - "magma_boss_maxie_1": { - "encounter": { - 1: "Está bien, tendré que cavar yo mismo tu propia tumba. Siéntete orgulloso." - }, - "victory": { - 1: "Ugh! Eres... muy capaz...\nFue por poco, estuve a esto de ganarte..." - }, - "defeat": { - 1: "¡El Equipo Magma prevalecerá!" - } - }, - "magma_boss_maxie_2": { - "encounter": { - 1: "Eres el obstáculo final entre mi y mis propósitos.\n¡Aquí va mi mejor golpe! ¡MUAJAJAJA!" - }, - "victory": { - 1: "No... no es posib... nnngh..." - }, - "defeat": { - 1: "Y ahora... transformaré este planeta en una tierra ideal para la humanidad." - } - }, - "aqua_boss_archie_1": { - "encounter": { - 1: "Soy el líder del Equipo Aqua, así que me temo que aquí se acaba tu bromita." - }, - "victory": { - 1: "Volvamos a vernos más tarde. Recordaré tu cara." - }, - "defeat": { - 1: "¡Excelente! ¡Nadie se puede oponer a mi equipo!" - } - }, - "aqua_boss_archie_2": { - "encounter": { - 1: "Llevo esperando mucho que llegara este día.\n¡Contempla el poder de mi equipo!" - }, - "victory": { - 1: "Quién me lo iba a decir..." - }, - "defeat": { - 1: "Devolveré todo en este planeta a su estado original.\nSe avecina un nuevo mundo, ¡más puro!" - } - }, - "galactic_boss_cyrus_1": { - "encounter": { - 1: "Tu fútil sentimentalidad te hizo interferir.\n¡Haré que te arrepientas de escuchar a tu corazón!" - }, - "victory": { - 1: "Interesante. Muy... curioso." - }, - "defeat": { - 1: "Crearé un nuevo mundo..." - } - }, - "galactic_boss_cyrus_2": { - "encounter": { - 1: "Nos vemos de nuevo... se ve que nuestros destinos están entrelazados.\nPero, aquí y ahora, ¡sesgaré ese vínculo!" - }, - "victory": { - 1: "¿Cómo? ¿¡Cómo!? ¿¡¡CÓMO!!?" - }, - "defeat": { - 1: "Hasta nunca." - } - }, - "plasma_boss_ghetsis_1": { - "encounter": { - 1: "¡No permitiré que nadie me detenga!" - }, - "victory": { - 1: "¿Cómo puede ser esto? ¡yo creé al Equipo Plasma!\n¡Soy PERFECTO!" - }, - "defeat": { - 1: "Soy el perfecto gobernante para un perfecto nuevo mundo. ¡Muajajajaja!" - } - }, - "plasma_boss_ghetsis_2": { - "encounter": { - 1: "¡Adelante! ¡Quiero ver tu cara cuando la desesperación se apoderede de ti!" - }, - "victory": { - 1: "Mis planes... ¡no! ¡El mundo debería pertenecerme!" - }, - "defeat": { - 1: "¡Kyurem, Absorfusión... ahora!" - } - }, - "flare_boss_lysandre_1": { - "encounter": { - 1: "¿Acaso quieres detenerme? Demuéstramelo." - }, - "victory": { - 1: "Estás aquí para detenerme. Pero tendrás que esperar. " - }, - "defeat": { - 1: "Los Pokémon... su fin ha llegado." - } - }, - "flare_boss_lysandre_2": { - "encounter": { - 1: "El futuro que quieres tú, o el futuro que quiero yo.\nVeamos cuál de los dos se merece existir..." - }, - "victory": { - 1: "¡AARGH!" - }, - "defeat": { - 1: "Los idiotas sin ningún tipo de visión continuarán asediando este mundo." - } - }, - "brock": { - "encounter": { - 1: "My expertise on Rock-type Pokémon will take you down! Come on!", - 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. - $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... - $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? - $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… - $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. - $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. - $I believed that tale, so I have secretly trained here all my life. As a result, I can now see what others cannot. - $I see a shadow of the person who will make the Pokémon appear. - $I believe that person is me! You're going to help me reach that level!`, - 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. - $I envy you for that…`, - 3: "How is this possible…", - 4: `I don't think our potentials are so different. - $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. - $… 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. - $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? - $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… - $They're both great subjects for my camera! Fantastic! This'll be just fantastic! - $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… - $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! - $But I should tell you, I'm tough because I know how to focus.`, - 2: `Pokémon, fashion, romance… It's all about focus! - $I'll show you just what I mean. Get ready to lose!` - }, - "victory": { - 1: "I must say, I'm warmed up to you! I might even admire you a little.", - 2: `Wow! You're great! You've earned my respect! - $I think your focus and will bowled us over totally. ` - }, - "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… - $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'. - $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. - $That's good! Looking real good! All right! - $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. - $Yes, the bond I developed with Pokémon is extremely tight. - $So, come on, just try and see if you can even inflict damage on my Pokémon!`, - }, - "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. - $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! - $The all-consuming heat overwhelms. - $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? - $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. - $I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. - $And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!`, - }, - "victory": { - 1: `Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. - $I find much joy in having met you and your Pokémon. You have proven yourself worthy.`, - }, - "defeat": { - 1: "A grand illusion!" - } - }, - "lorelei": { - "encounter": { - 1: `No one can best me when it comes to icy Pokémon! Freezing moves are powerful! - $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. - $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. - $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. - $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. - $Your Pokémon believed in you and did their best to earn you the win. - $Even though I've lost, I find myself with this silly grin!`, - }, - "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. - $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? - $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… - $You look like a Pokémon Trainer with refined strength and deepened kindness. - $What I look for in my opponent is superb strength… - $Please unleash your power to the fullest!`, - }, - "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… - $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! - $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! - $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. - $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. - $This is gonna be a doozy of a battle! - $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… - $The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. - $Since you've made it this far, I'll put that aside and battle you. - $Let me see if you'll achieve as much glory as the hero of my book!,` - }, - "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… - $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… - $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? - $What have you felt, meeting so many other Trainers out there? - $Traveling this rich land… Has it awoken something inside you? - $I want you to come at me with all that you've learned. - $My Pokémon and I will respond in turn with all that we know!`, - }, - "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! - $I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! - #And they are battling alongside Pokémon that have been through countless difficult battles! - $If I battle with people like that, not only will I get stronger, my Pokémon will, too! - $And we'll get to know each other even better! OK! Brace yourself! - $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, - }, - "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. - $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. - $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… - $But what a champion time it's been! - $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. - $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. - $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. - $With more young Trainers taking charge, the future of Pokémon is bright! - $So, as a wall for young people, I'll take your challenge!`, - }, - "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… - $I hope you're the Trainer who'll make me remember how fun it is to battle!`, - }, - "victory": { - 1: `You've got me beat… - $Your desire and the noble way your Pokémon battled for you… - $I even felt thrilled during our match. That was a very good battle.`, - }, - "defeat": { - 1: `It was not shocking at all… - $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. - $OK! I can hear my battle muse loud and clear. Let's get straight to it!`, - 2: `Of course, I'm really proud of all of my Pokémon! - $Well now… Let's get right to it!` - }, - "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. - $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! - $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? - $I love being on the summit! 'Cause you can see forever and ever from high places! - $So, how about you and I have some fun?`, - }, - "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. - $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. - $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. - $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. - $That is all there really is to it. - $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. - $Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. - $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, - }, - "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… - $But really, I just do it 'cause it's fun. - $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. - $But that means your opponent is also working hard to win. - $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? - $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! - $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. - $It's a real curse. - $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? - $... - $Let's get this show on the road! How strong is our challenger? - $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: "Prepárate para una batalla contra el entrenador más fuerte en Unova!" - }, - "victory": { - 1: "Bien hecho! Tienes ciertamente un talento inigualable" - }, - "defeat": { - 1: `Un viento fresco sopla a través en mi corazón - $Qué esfuerzo extraordinario!` - } - }, - "kieran": { - "encounter": { - 1: `A través del trabajo duro, me he vuelto más y más fuerte! - $No pierdo.` - }, - "victory": { - 1: `No puedo creerlo... - $¡Qué batalla tan divertida y trepidante!` - }, - "defeat": { - 1: `Asombroso, que batalla! - $Es hora de que entrenes aún más duro.` - } - }, - "rival": { - "encounter": { - 1: `@c{smile}Hey, I was looking for you! I knew you were eager to get going but I expected at least a goodbye… - $@c{smile_eclosed}So you're really pursuing your dream after all?\n 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…\nWho 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? - $@c{smile_ehalf}You're going after your dream, huh?\nThat day is really today isn't it… - $@c{smile}Anyway, I'll forgive you for forgetting me, but on one condition. @c{smile_wave_wink}You have to battle me! - $@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? - $@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. - $@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful! - $@c{smile_wave}Do your best like always! I believe in you!` - }, - }, - "rival_2": { - "encounter": { - 1: `@c{smile}Hey, you're here too?\n@c{smile_eclosed}Still a perfect record, huh…? - $@c{serious_mopen_fists}I know it kind of looks like I followed you here, but that's mostly not true. - $@c{serious_smile_fists}Honestly though, I've been itching for a rematch since you beat me back at home. - $I've been doing a lot of my own training so I'll definitely put up a fight this time. - $@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. - $@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 - $@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n - $@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all. - $@c{smile}Anyway, take care!` - }, - }, - "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! - $@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. - $@c{smile_ehalf}I'm happy for you but I just want to let you know that it's OK to lose sometimes. - $@c{smile}We learn from our mistakes, often more than we would if we kept succeeding. - $@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… - $@c{smile}Aw well. That just means I'll have to train even harder for next time! - $@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~. - $@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this! - $@c{smile_wave}Keep at it!` - }, - "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. - $@c{neutral_eclosed}Things have been kind of… strange.\nIt's not the same back home without you. - $@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. - $@c{serious}Never losing once is just unrealistic.\nWe need to lose sometimes in order to grow. - $@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? - $@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! - $@c{smile_ehalf}But really, don't you miss home by now? Or… me?\nI… I mean, we've really missed you. - $@c{smile_eclosed}I support you in your dream and everything, but the reality is you're going to lose sooner or later. - $@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. - $I won't mince words or pleasantries with you.\n@c{neutral_eclosed}I'm here to win, plain and simple. - $@c{serious_mhalf_fists}I've learned to maximize my potential by putting all my time into training. - $@c{smile}You get a lot of extra time when you cut out the unnecessary sleep and social interaction. - $@c{serious_mopen_fists}None of that matters anymore, not until I win. - $@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. - $@c{angry_mhalf}Losing is for the weak, and I'm not weak anymore. - $@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? - $@c{smile}You should be proud of how far you made it. Congrats!\nBut it looks like it's the end of your journey. - $@c{smile_eclosed}You've awoken something in me I never knew was there.\nIt seems like all I do now is train. - $@c{smile_ehalf}I hardly even eat or sleep now, I just train my Pokémon all day, getting stronger every time. - $@c{neutral}In fact, I… hardly recognize myself. - $And now, I've finally reached peak performance.\nI don't think anyone could beat me now. - $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. - $@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. - $@c{neutral}I've had some time to reflect on all this.\nThere's a reason this all seems so strange. - $@c{neutral_eclosed}Your dream, my drive to beat you…\nIt's all a part of something greater. - $@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. - $@c{neutral_eclosed}Whether I've fulfilled that purpose I can't say, but I've done everything in my power. - $@c{neutral}This place we ended up in is terrifying… Yet somehow I feel unphased, like I've been here before. - $@c{serious_mhalf_fists}You feel the same, don't you? - $@c{serious}…and it's like something here is speaking to me.\nThis is all the world's known for a long time now. - $Those times we cherished together that seem so recent are nothing but a distant memory. - $@c{neutral_eclosed}Who can say whether they were ever even real in the first place. - $@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. - $@c{serious_smile_fists}I hardly know what any of this means, I just know that it's true. - $@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. - $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. - $@c{smile_eclosed}You know, I keep going around and around in my head… - $@c{smile_ehalf}There's something to all this, why everything seems so strange now… - $@c{smile}You have your dream, and I have this ambition in me… - $I just can't help but feel there's a greater purpose to all this, to what we're doing, you and I. - $@c{smile_eclosed}I think I'm supposed to push you… to your limits. - $@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. - $It's something about this strange and dreadful place… Everything seems so clear… - $This… is all the world's known for a long time now. - $@c{smile_eclosed}It's like I can barely remember the memories we cherished together. - $@c{smile_ehalf}Were they even real? They seem so far away now… - $@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. - $@c{smile_ehalf}I… don't know what all this means… but I feel it's true. - $@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… - $@c{smile_eclosed}Promise me… After you heal the world… Please… come home safe. - $@c{smile_ehalf}…Thank you.` - - }, - }, -}; - - -// Dialogue of the NPCs in the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = PGMdialogue; - -// Dialogue of the endboss of the game when the player character is male (Or unset) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `It appears the time has finally come once again.\nYou know why you have come here, do you not? - $You were drawn here, because you have been here before.\nCountless times. - $Though, perhaps it can be counted.\nTo be precise, this is in fact your 5,643,853rd cycle. - $Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain. - $Until now you have yet to succeed, but I sense a different presence in you this time.\n - $You are the only one here, though it is as if there is… another. - $Will you finally prove a formidable challenge to me?\nThe challenge I have longed for for millennia? - $We begin.`, - "firstStageWin": `I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back. - $Do not disappoint me.`, - "secondStageWin": "…Magnificent." -}; - -// Dialogue of the endboss of the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDialogue; - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now. - $@c{smile}It's over.@d{64} You ended the loop. - $@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once. - $@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it? - $@c{serious_smile_fists}Your legend will always live on in our hearts. - $@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home. - $@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. - $@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop. - $@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once. - $I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget! - $@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts. - $@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place. - $Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?`, -}; -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; - - -// Dialogue of the named double battles in the game. For when the player is male (or unset). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `Blue: Hey Red, let's show them what we're made of! - $Red: ... - $Blue: This is Pallet Town Power!`, - }, - "victory": { - 1: `Blue: That was a great battle! - $Red: ...`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `Red: ...! - $Blue: He never talks much. - $Blue: But dont let that fool you! He is a champ after all!`, - }, - "victory": { - 1: `Red: ...! - $Blue: Next time we will beat you!`, - }, - }, - "tate_liza_double": { - "encounter": { - 1: `Tate: Are you suprised? - $Liza: We are two gym leaders at once! - $Tate: We are twins! - $Liza: We dont need to talk to understand each other! - $Tate: Twice the power... - $Liza: Can you handle it?`, - }, - "victory": { - 1: `Tate: What? Our combination was perfect! - $Liza: Looks like we need to train more...`, - }, - }, - "liza_tate_double": { - "encounter": { - 1: `Liza: Hihihi... Are you suprised? - $Tate: Yes, we are really two gym leaders at once! - $Liza: This is my twin brother Tate! - $Tate: And this is my twin sister Liza! - $Liza: Don't you think we are a perfect combination?` - }, - "victory": { - 1: `Liza: Are we... - $Tate: ...not as strong as we thought?`, - }, - }, - "wallace_steven_double": { - "encounter": { - 1: `Steven: Wallace, let's show them the power of the champions! - $Wallace: We will show you the power of Hoenn! - $Steven: Let's go!`, - }, - "victory": { - 1: `Steven: That was a great battle! - $Wallace: We will win next time!`, - }, - }, - "steven_wallace_double": { - "encounter": { - 1: `Steven: Do you have any rare pokémon? - $Wallace: Steven... We are here for a battle, not to show off our pokémon. - $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! - $Wallace: Steven...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `Alder: We are the strongest trainers in Unova! - $Iris: Fights against strong trainers are the best!`, - }, - "victory": { - 1: `Alder: Wow! You are super strong! - $Iris: We will win next time!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `Iris: Welcome Challenger! I am THE Unova Champion! - $Alder: Iris, aren't you a bit too excited?`, - }, - "victory": { - 1: `Iris: A loss like this is not easy to take... - $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! - $Piers: We bring darkness!`, - }, - "victory": { - 1: `Marnie: You brought light to our darkness! - $Piers: Its too bright...`, - }, - }, - "marnie_piers_double": { - "encounter": { - 1: `Piers: Ready for a concert? - $Marnie: Brother... They are here to fight, not to sing...`, - }, - "victory": { - 1: `Piers: Now that was a great concert! - $Marnie: Brother...`, - }, - }, -}; - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = PGMdoubleBattleDialogue; diff --git a/src/locales/es/egg.ts b/src/locales/es/egg.json similarity index 89% rename from src/locales/es/egg.ts rename to src/locales/es/egg.json index dea466066f1..2542d577323 100644 --- a/src/locales/es/egg.ts +++ b/src/locales/es/egg.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { +{ "egg": "Huevo", "greatTier": "Raro", "ultraTier": "Épico", @@ -22,4 +20,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "¡Ha salido un {{pokemonName}} del Huevo!", "eggMoveUnlock": "Mov. Huevo desbloqueado:\n{{moveName}}", "rareEggMoveUnlock": "Mov. Huevo Raro desbloqueado:\n{{moveName}}", -} as const; + "moveUPGacha": "¡Más Mov.\nHuevo Raro!", + "shinyUPGacha": "¡Más Shiny!", + "legendaryUPGacha": ", ¡mayor\nprob.!" +} diff --git a/src/locales/es/fight-ui-handler.json b/src/locales/es/fight-ui-handler.json new file mode 100644 index 00000000000..dc8140b61fc --- /dev/null +++ b/src/locales/es/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "Potencia", + "accuracy": "Precisión", + "abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}", + "passive": "Pasiva de " +} diff --git a/src/locales/es/fight-ui-handler.ts b/src/locales/es/fight-ui-handler.ts deleted file mode 100644 index 70526ce4692..00000000000 --- a/src/locales/es/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Potencia", - "accuracy": "Precisión", - "abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}", - "passive": "Pasiva de ", // The space at the end is important -} as const; diff --git a/src/locales/es/filter-bar.json b/src/locales/es/filter-bar.json new file mode 100644 index 00000000000..eac148e211c --- /dev/null +++ b/src/locales/es/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "Gen.", + "typeFilter": "Tipo", + "caughtFilter": "Capturado", + "unlocksFilter": "Otros", + "miscFilter": "Misc.", + "sortFilter": "Orden", + "all": "Todo", + "normal": "Normal", + "uncaught": "No Capt.", + "passive": "Pasiva", + "passiveUnlocked": "Pasiva desbloq.", + "passiveLocked": "Pasiva bloq.", + "passiveUnlockable": "Pasiva - puede desbloq.", + "costReduction": "Reducción de coste", + "costReductionUnlocked": "Reducción de coste desbloq.", + "costReductionLocked": "Reducción de coste bloq.", + "costReductionUnlockable": "Red. de coste - puede desbloq.", + "favorite": "Favoritos", + "isFavorite": "Favoritos - Sí", + "notFavorite": "Favoritos - No", + "ribbon": "Cinta", + "hasWon": "Cinta - Sí", + "hasNotWon": "Cinta - No", + "hiddenAbility": "Habilidad oculta", + "hasHiddenAbility": "Habilidad oculta - Sí", + "noHiddenAbility": "Habilidad oculta - No", + "egg": "Huevo", + "eggPurchasable": "Huevo - puede comprar", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Sí", + "noPokerus": "Pokérus - No", + "sortByNumber": "Núm.", + "sortByCost": "Coste", + "sortByCandies": "# Caramelos", + "sortByIVs": "IVs", + "sortByName": "Nombre" +} \ No newline at end of file diff --git a/src/locales/es/game-mode.json b/src/locales/es/game-mode.json new file mode 100644 index 00000000000..0dbccb45e1f --- /dev/null +++ b/src/locales/es/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "Clásico", + "endless": "Infinito", + "endlessSpliced": "Infinito (Fusión)", + "dailyRun": "Diario", + "unknown": "Desconocido", + "challenge": "Desafío" +} diff --git a/src/locales/es/game-mode.ts b/src/locales/es/game-mode.ts deleted file mode 100644 index bf399b8fc74..00000000000 --- a/src/locales/es/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "Clásica", - "endless": "Infinita", - "endlessSpliced": "Infinita (Fusión)", - "dailyRun": "Diaria", - "unknown": "Desconicido", - "challenge": "Desafío", -} as const; diff --git a/src/locales/es/game-stats-ui-handler.json b/src/locales/es/game-stats-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/es/game-stats-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/es/growth.ts b/src/locales/es/growth.json similarity index 55% rename from src/locales/es/growth.ts rename to src/locales/es/growth.json index c72ea3d76c6..4def68fde74 100644 --- a/src/locales/es/growth.ts +++ b/src/locales/es/growth.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { +{ "Erratic": "Errático", "Fast": "Rápido", "Medium_Fast": "Medio Rápido", "Medium_Slow": "Medio Lento", "Slow": "Lento", "Fluctuating": "Fluctuante" -} as const; +} \ No newline at end of file diff --git a/src/locales/es/menu-ui-handler.ts b/src/locales/es/menu-ui-handler.json similarity index 63% rename from src/locales/es/menu-ui-handler.ts rename to src/locales/es/menu-ui-handler.json index bf71c2b390b..c906324cdbf 100644 --- a/src/locales/es/menu-ui-handler.ts +++ b/src/locales/es/menu-ui-handler.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { +{ "GAME_SETTINGS": "Ajustes", "ACHIEVEMENTS": "Logros", "STATS": "Estadísticas", - "VOUCHERS": "Vales", + "RUN_HISTORY": "Historial de partida", "EGG_LIST": "Lista de Huevos", "EGG_GACHA": "Gacha de Huevos", "MANAGE_DATA": "Gestionar Datos", @@ -16,9 +14,15 @@ export const menuUiHandler: SimpleTranslationEntries = { "importSlotSelect": "Selecciona una ranura para importar.", "exportSession": "Exportar Sesión", "exportSlotSelect": "Selecciona una ranura para exportar.", + "importRunHistory":"Importar Historial de partida", + "exportRunHistory":"Exportar Historial de partida", "importData": "Importar Datos", "exportData": "Exportar Datos", + "consentPreferences": "Consentimiento de datos", + "linkDiscord": "Conectar Discord", + "unlinkDiscord": "Desconectar Discord", + "linkGoogle": "Conectar Google", + "unlinkGoogle": "Desconectar Google", "cancel": "Cancelar", - "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?", - "noEggs": "You are not hatching\nany eggs at the moment!" -} as const; + "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?" +} \ No newline at end of file diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.json similarity index 73% rename from src/locales/es/menu.ts rename to src/locales/es/menu.json index 8176af456e1..ef1ae93dd82 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.json @@ -1,11 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const menu: SimpleTranslationEntries = { +{ "cancel": "Cancelar", "continue": "Continuar", "dailyRun": "Reto diario (Beta)", @@ -17,17 +10,18 @@ export const menu: SimpleTranslationEntries = { "username": "Usuario", "password": "Contraseña", "login": "Iniciar Sesión", + "orUse": "O usa", "register": "Registrarse", "emptyUsername": "El usuario no puede estar vacío", "invalidLoginUsername": "El usuario no es válido", - "invalidRegisterUsername": "El usuario solo puede contener letras, números y guiones bajos", + "invalidRegisterUsername": "El usuario solo puede contener letras, números y guiones bajos.", "invalidLoginPassword": "La contraseña no es válida", - "invalidRegisterPassword": "Contraseña debe tener 6 o más caracter.", + "invalidRegisterPassword": "La contraseña debe tener 6 o más caracteres.", "usernameAlreadyUsed": "El usuario ya está en uso", "accountNonExistent": "El usuario no existe", "unmatchingPassword": "La contraseña no coincide", "passwordNotMatchingConfirmPassword": "Las contraseñas deben coincidir", - "confirmPassword": "Confirmar Contra.", + "confirmPassword": "Confirmar contraseña", "registrationAgeWarning": "Al registrarte, confirmas tener 13 o más años de edad.", "backToLogin": "Volver al Login", "failedToLoadSaveData": "No se han podido cargar los datos guardados. Por favor, recarga la página.\nSi el fallo continúa, por favor comprueba #announcements en nuestro Discord.", @@ -43,16 +37,21 @@ export const menu: SimpleTranslationEntries = { "weeklyRankings": "Rankings Semanales", "noRankings": "Sin Rankings", "positionIcon": "#", - "usernameScoreboard": "Username", - "score": "Score", - "wave": "Wave", + "usernameScoreboard": "Usuario", + "score": "Puntos", + "wave": "Oleada", "loading": "Cargando…", "loadingAsset": "Cargando recurso: {{assetName}}", "playersOnline": "Jugadores en Línea", - "yes":"Sí", - "no":"No", + "yes": "Sí", + "no": "No", "disclaimer": "AVISO", - "disclaimerDescription": "Este juego es un producto inacabado; puede tener problemas de jugabilidad (incluyendo la posible pérdida\n de datos de guardado),cambiar sin avisar, y puede o no puede ser actualizado hasta ser completado.", - "choosePokemon": "Choose a Pokémon.", - "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta,\nel juego se reconectará automáticamente.", -} as const; + "disclaimerDescription": "Este juego es un producto inacabado; puede tener problemas de jugabilidad (incluyendo la posible pérdida\n de datos de guardado), cambiar sin avisar, y puede o no puede ser actualizado hasta ser completado.", + "choosePokemon": "Elige un Pokémon.", + "renamePokemon": "Renombrar Pokémon.", + "rename": "Renombrar", + "nickname": "Apodo", + "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente.", + "noSaves": "No tienes ninguna partida guardada registrada!", + "tooManySaves": "¡Tienes demasiadas partidas guardadas registradas!" +} diff --git a/src/locales/es/modifier-select-ui-handler.json b/src/locales/es/modifier-select-ui-handler.json new file mode 100644 index 00000000000..7adcb885c9e --- /dev/null +++ b/src/locales/es/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "Transferir", + "reroll": "Actualizar", + "lockRarities": "Bloquear rarezas", + "checkTeam": "Ver Equipo", + "transferDesc": "Transfiere un objeto que lleva un Pokémon a otro.", + "rerollDesc": "Gasta dinero para actualizar las opciones de objetos.", + "lockRaritiesDesc": "Bloquea las rarezas de los objetos al actualizar (afecta el costo de actualización).", + "checkTeamDesc": "Revisa tu equipo o usa un objeto que cambia de forma.", + "rerollCost": "{{formattedMoney}} ₽", + "itemCost": "{{formattedMoney}} ₽" +} \ No newline at end of file diff --git a/src/locales/es/modifier-type.json b/src/locales/es/modifier-type.json new file mode 100644 index 00000000000..3ac4d85f793 --- /dev/null +++ b/src/locales/es/modifier-type.json @@ -0,0 +1,607 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{modifierCount}}x {{pokeballName}}", + "description": "Recibes {{modifierCount}}x {{pokeballName}} (En inventario: {{pokeballAmount}}) \nRatio de captura: {{catchRate}}." + }, + "AddVoucherModifierType": { + "name": "{{modifierCount}}x {{voucherTypeName}}", + "description": "Recibes {{modifierCount}}x {{voucherTypeName}}." + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "¡{{pokemonName}} no puede\nrecibir este objeto!", + "tooMany": "¡{{pokemonName}} tiene este objeto\ndemasiadas veces!" + } + }, + "PokemonHpRestoreModifierType": { + "description": "Restaura {{restorePoints}} PS o, al menos, un {{restorePercent}}% PS de un Pokémon.", + "extra": { + "fully": "Restaura todos los PS de un Pokémon.", + "fullyWithStatus": "Restaura todos los PS de un Pokémon y cura todos los problemas de estados." + } + }, + "PokemonReviveModifierType": { + "description": "Revive a un Pokémon y restaura {{restorePercent}}% PS." + }, + "PokemonStatusHealModifierType": { + "description": "Cura todos los problemas de estados de un Pokémon." + }, + "PokemonPpRestoreModifierType": { + "description": "Restaura {{restorePoints}} PP del movimiento que elijas de un Pokémon.", + "extra": { + "fully": "Restaura todos los PP del movimiento que elijas de un Pokémon." + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "Restaura {{restorePoints}} PP de todos los movimientos de un Pokémon.", + "extra": { + "fully": "Restaura todos los PP de todos los movimientos de un Pokémon." + } + }, + "PokemonPpUpModifierType": { + "description": "Aumenta permanentemente los PP para un movimiento de un Pokémon en {{upPoints}} por cada 5 PP máximo (máximo 3)." + }, + "PokemonNatureChangeModifierType": { + "name": "Menta {{natureName}}", + "description": "Cambia la naturaleza de un Pokémon a {{natureName}} y desbloquea permanentemente dicha naturaleza para el inicial." + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "Cuadruplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates." + }, + "TempStatStageBoosterModifierType": { + "description": "Aumenta la est. {{stat}} de todos los miembros del equipo en {{amount}} durante 5 combates.", + "extra": { + "stage": "1 nivel", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%." + }, + "PokemonLevelIncrementModifierType": { + "description": "Aumenta el nivel de un Pokémon en {{levels}}." + }, + "AllPokemonLevelIncrementModifierType": { + "description": "Aumenta el nivel de todos los miembros del equipo en {{levels}}." + }, + "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." + }, + "AllPokemonFullReviveModifierType": { + "description": "Revive a todos los Pokémon debilitados y restaura completamente sus PS." + }, + "MoneyRewardModifierType": { + "description": "Otorga una {{moneyMultiplier}} cantidad de dinero (₽{{moneyAmount}}).", + "extra": { + "small": "pequeña", + "moderate": "moderada", + "large": "gran" + } + }, + "ExpBoosterModifierType": { + "description": "Aumenta la ganancia de EXP en un {{boostPercent}}%." + }, + "PokemonExpBoosterModifierType": { + "description": "Aumenta la ganancia de EXP del portador en un {{boostPercent}}%." + }, + "PokemonFriendshipBoosterModifierType": { + "description": "Aumenta la ganancia de amistad por victoria en un 50%." + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "Aumenta la precisión de los movimiento en un {{accuracyAmount}} (máximo 100)." + }, + "PokemonMultiHitModifierType": { + "description": "Los ataques golpean una vez más a costa de una reducción de poder del 60/75/82,5% por cada objeto." + }, + "TmModifierType": { + "name": "MT{{moveId}} - {{moveName}}", + "description": "Enseña {{moveName}} a un Pokémon." + }, + "TmModifierTypeWithInfo": { + "name": "MT{{moveId}} - {{moveName}}", + "description": "Enseña {{moveName}} a un Pokémon\n(Mantén pulsado C o Shift para más info)." + }, + "EvolutionItemModifierType": { + "description": "Hace que ciertos Pokémon evolucionen." + }, + "FormChangeItemModifierType": { + "description": "Hace que ciertos Pokémon cambien de forma." + }, + "FusePokemonModifierType": { + "description": "Fusiona dos Pokémon (transfiere habilidades, divide estadísticas bases y tipos, comparte movimientos)." + }, + "TerastallizeModifierType": { + "name": "Teralito {{teraType}}", + "description": "Teracristaliza al portador al tipo {{teraType}} durante 10 combates." + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "Al atacar, hay un {{chancePercent}}% de posibilidades de que robes el objeto que tiene el enemigo." + }, + "TurnHeldItemTransferModifierType": { + "description": "Cada turno, el portador roba un objeto del enemigo." + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "Agrega un {{chancePercent}}% de probabilidad de infligir {{statusEffect}} con movimientos de ataque." + }, + "EnemyEndureChanceModifierType": { + "description": "Agrega un {{chancePercent}}% de probabilidad de resistir un ataque que lo debilitaría." + }, + "RARE_CANDY": { + "name": "Carameloraro" + }, + "RARER_CANDY": { + "name": "Caramelorarísimo" + }, + "MEGA_BRACELET": { + "name": "Megapulsera", + "description": "Las megapiedras se vuelven disponibles." + }, + "DYNAMAX_BAND": { + "name": "Maximuñequera", + "description": "Las maxisetas se vuelven disponibles." + }, + "TERA_ORB": { + "name": "Orbe Teracristal", + "description": "Los Teralitos están disponibles." + }, + "MAP": { + "name": "Mapa", + "description": "Te permite elegir tu camino al final del bioma." + }, + "POTION": { + "name": "Poción" + }, + "SUPER_POTION": { + "name": "Superpoción" + }, + "HYPER_POTION": { + "name": "Hiperpoción" + }, + "MAX_POTION": { + "name": "Máx. poción" + }, + "FULL_RESTORE": { + "name": "Restau. todo" + }, + "REVIVE": { + "name": "Revivir" + }, + "MAX_REVIVE": { + "name": "Máx. revivir" + }, + "FULL_HEAL": { + "name": "Cura total" + }, + "SACRED_ASH": { + "name": "Ceniza sagrada" + }, + "REVIVER_SEED": { + "name": "Semilla revivir", + "description": "Revive al portador con la mitad de sus PS al debilitarse por un golpe directo." + }, + "WHITE_HERB": { + "name": "Hierba blanca", + "description": "Un objeto que puede llevar un Pokémon. Restaurará cualquier estadística reducida en combate." + }, + "ETHER": { + "name": "Éter" + }, + "MAX_ETHER": { + "name": "Éter máx." + }, + "ELIXIR": { + "name": "Elixir" + }, + "MAX_ELIXIR": { + "name": "Elixir máx." + }, + "PP_UP": { + "name": "Más PP" + }, + "PP_MAX": { + "name": "Máx PP" + }, + "LURE": { + "name": "Incienso" + }, + "SUPER_LURE": { + "name": "Superincienso" + }, + "MAX_LURE": { + "name": "Incienso máximo" + }, + "MEMORY_MUSHROOM": { + "name": "Seta recuerdo", + "description": "Recuerda un movimiento olvidado de un Pokémon." + }, + "EXP_SHARE": { + "name": "Repartir EXP", + "description": "Los que no combatan reciben el 20% de la EXP." + }, + "EXP_BALANCE": { + "name": "Equilibrador EXP", + "description": "Da una mayor parte de la EXP recibida a los miembros del equipo que tengan menos nivel." + }, + "OVAL_CHARM": { + "name": "Amuleto Oval", + "description": "Cada Pokémon combatiente recibe un 10% adicional de la EXP total." + }, + "EXP_CHARM": { + "name": "Amuleto EXP" + }, + "SUPER_EXP_CHARM": { + "name": "Super Amuleto EXP" + }, + "GOLDEN_EXP_CHARM": { + "name": "Amuleto EXP Dorado" + }, + "LUCKY_EGG": { + "name": "Huevo suerte" + }, + "GOLDEN_EGG": { + "name": "Huevo dorado" + }, + "SOOTHE_BELL": { + "name": "Camp. alivio" + }, + "SCOPE_LENS": { + "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." + }, + "EVIOLITE": { + "name": "Mineral evolutivo", + "description": "Roca misteriosa. El Pokémon portador aumentará su Defensa y su Defensa Especial si aún puede evolucionar." + }, + "SOUL_DEW": { + "name": "Rocío bondad", + "description": "Aumenta la influencia de la naturaleza de un Pokémon en sus estadísticas en un 10% (aditivo)." + }, + "NUGGET": { + "name": "Pepita" + }, + "BIG_NUGGET": { + "name": "Maxipepita" + }, + "RELIC_GOLD": { + "name": "Real de oro" + }, + "AMULET_COIN": { + "name": "Moneda amuleto", + "description": "Aumenta el dinero ganado en un 20%." + }, + "GOLDEN_PUNCH": { + "name": "Puño Dorado", + "description": "Otorga el 50% del daño infligido como dinero." + }, + "COIN_CASE": { + "name": "Monedero", + "description": "Después de cada 10 combates, recibe el 10% de tu dinero en intereses." + }, + "LOCK_CAPSULE": { + "name": "Cápsula candado", + "description": "Permite bloquear las rarezas de los objetos al refrescar objetos." + }, + "GRIP_CLAW": { + "name": "Garra garfio" + }, + "WIDE_LENS": { + "name": "Lupa" + }, + "MULTI_LENS": { + "name": "Multilupa" + }, + "HEALING_CHARM": { + "name": "Amuleto curación", + "description": "Aumenta la efectividad de los movimientos y objetos de curacion de PS en un 10% (excepto revivir)." + }, + "CANDY_JAR": { + "name": "Tarrón de caramelos", + "description": "Aumenta la cantidad de niveles otorgados por los ítems Caramelos Raros en 1." + }, + "BERRY_POUCH": { + "name": "Saco bayas", + "description": "Añade un 30% de posibilidades de que una baya no se gaste al usarla." + }, + "FOCUS_BAND": { + "name": "Banda aguante", + "description": "Agrega un 10% de probabilidad de resistir un ataque que lo debilitaría." + }, + "QUICK_CLAW": { + "name": "Garra rápida", + "description": "Agrega un 10% de probabilidad de atacar primero independientemente de la velocidad (después de la prioridad)." + }, + "KINGS_ROCK": { + "name": "Roca del rey", + "description": "Agrega un 10% de probabilidad de que un ataque haga que el oponente retroceda." + }, + "LEFTOVERS": { + "name": "Restos", + "description": "Cura 1/16 de los PS máximo de un Pokémon cada turno." + }, + "SHELL_BELL": { + "name": "Cascabel concha", + "description": "Cura 1/8 del daño infligido por un Pokémon." + }, + "TOXIC_ORB": { + "name": "Toxiesfera", + "description": "Extraña esfera que envenena gravemente a quien la usa en combate." + }, + "FLAME_ORB": { + "name": "Llamasfera", + "description": "Extraña esfera que causa quemaduras a quien la usa en combate." + }, + "BATON": { + "name": "Testigo", + "description": "Permite pasar los efectos al cambiar de Pokémon, también evita las trampas." + }, + "SHINY_CHARM": { + "name": "Amuleto iris", + "description": "Aumenta drásticamente la posibilidad de que un Pokémon salvaje sea Shiny." + }, + "ABILITY_CHARM": { + "name": "Amuleto habilidad", + "description": "Aumenta drásticamente la posibilidad de que un Pokémon salvaje tenga una habilidad oculta." + }, + "IV_SCANNER": { + "name": "Escáner IV", + "description": "Permite escanear los IVs de Pokémon salvajes. Se revelan 2 IVs por cada objeto.\nLos mejores IVs se muestran primero." + }, + "DNA_SPLICERS": { + "name": "Punta ADN" + }, + "MINI_BLACK_HOLE": { + "name": "Mini agujero negro" + }, + "GOLDEN_POKEBALL": { + "name": "Poké Ball Dorada", + "description": "Agrega 1 opción de objeto extra al final de cada combate." + }, + "ENEMY_DAMAGE_BOOSTER": { + "name": "Ficha de daño", + "description": "Aumenta el daño en un 5%." + }, + "ENEMY_DAMAGE_REDUCTION": { + "name": "Ficha de protección", + "description": "Reduce el daño recibido en un 2,5%." + }, + "ENEMY_HEAL": { + "name": "Ficha de curación", + "description": "Cura el 2% de los PS máximo en cada turno." + }, + "ENEMY_ATTACK_POISON_CHANCE": { + "name": "Ficha veneno" + }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { + "name": "Ficha parálisis" + }, + "ENEMY_ATTACK_BURN_CHANCE": { + "name": "Ficha quemadura" + }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { + "name": "Ficha cura total", + "description": "Agrega un 2.5% de probabilidad cada turno de curar un problema de estado." + }, + "ENEMY_ENDURE_CHANCE": { + "name": "Ficha aguante" + }, + "ENEMY_FUSED_CHANCE": { + "name": "Ficha fusión", + "description": "Agrega un 1% de probabilidad de que un Pokémon salvaje sea una fusión." + } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { + "name": "Bola luminosa", + "description": "Asombrosa esfera que aumenta el Ataque y el Ataque Especial. Debe llevarla Pikachu." + }, + "THICK_CLUB": { + "name": "Hueso grueso", + "description": "Extraño tipo de hueso que potencia los ataques físicos. Debe llevarlo Cubone o Marowak." + }, + "METAL_POWDER": { + "name": "Polvo metálico", + "description": "Polvo muy fino, pero a la vez poderoso, que aumenta la Defensa. Debe llevarlo Ditto." + }, + "QUICK_POWDER": { + "name": "Polvo veloz", + "description": "Polvo muy fino, pero a la vez poderoso, que aumenta la Velocidad. Debe llevarlo Ditto." + } + }, + "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" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "Pañuelo seda", + "black_belt": "Cinturón negro", + "sharp_beak": "Pico afilado", + "poison_barb": "Flecha venenosa", + "soft_sand": "Arena fina", + "hard_stone": "Piedra dura", + "silver_powder": "Polvo plata", + "spell_tag": "Hechizo", + "metal_coat": "Revest. metálico", + "charcoal": "Carbón", + "mystic_water": "Agua mística", + "miracle_seed": "Semilla milagro", + "magnet": "Imán", + "twisted_spoon": "Cuchara torcida", + "never_melt_ice": "Antiderretir", + "dragon_fang": "Colmillo dragón", + "black_glasses": "Gafas de sol", + "fairy_feather": "Pluma feérica" + }, + "BaseStatBoosterItem": { + "hp_up": "Más PS", + "protein": "Proteína", + "iron": "Hierro", + "calcium": "Calcio", + "zinc": "Zinc", + "carbos": "Carburante" + }, + "EvolutionItem": { + "NONE": "Ninguno", + "LINKING_CORD": "Cordón unión", + "SUN_STONE": "Piedra solar", + "MOON_STONE": "Piedra lunar", + "LEAF_STONE": "Piedra hoja", + "FIRE_STONE": "Piedra fuego", + "WATER_STONE": "Piedra agua", + "THUNDER_STONE": "Piedra trueno", + "ICE_STONE": "Piedra hielo", + "DUSK_STONE": "Piedra noche", + "DAWN_STONE": "Piedra alba", + "SHINY_STONE": "Piedra día", + "CRACKED_POT": "Tetera agrietada", + "SWEET_APPLE": "Manzana dulce", + "TART_APPLE": "Manzana ácida", + "STRAWBERRY_SWEET": "Confite fresa", + "UNREMARKABLE_TEACUP": "Cuenco mediocre", + "CHIPPED_POT": "Tetera rota", + "BLACK_AUGURITE": "Mineral negro", + "GALARICA_CUFF": "Brazal galanuez", + "GALARICA_WREATH": "Corona galanuez", + "PEAT_BLOCK": "Bloque de turba", + "AUSPICIOUS_ARMOR": "Armadura auspiciosa", + "MALICIOUS_ARMOR": "Armadura maldita", + "MASTERPIECE_TEACUP": "Cuenco exquisito", + "METAL_ALLOY": "Metal compuesto", + "SCROLL_OF_DARKNESS": "Manuscrito sombras", + "SCROLL_OF_WATERS": "Manuscrito aguas", + "SYRUPY_APPLE": "Manzana melosa" + }, + "FormChangeItem": { + "NONE": "Ninguno", + "ABOMASITE": "Abomasnowita", + "ABSOLITE": "Absolita", + "AERODACTYLITE": "Aerodactylita", + "AGGRONITE": "Aggronita", + "ALAKAZITE": "Alakazamita", + "ALTARIANITE": "Altarianita", + "AMPHAROSITE": "Ampharosita", + "AUDINITE": "Audinita", + "BANETTITE": "Banettita", + "BEEDRILLITE": "Beedrillita", + "BLASTOISINITE": "Blastoisita", + "BLAZIKENITE": "Blazikenita", + "CAMERUPTITE": "Cameruptita", + "CHARIZARDITE_X": "Charizardita X", + "CHARIZARDITE_Y": "Charizardita Y", + "DIANCITE": "Diancita", + "GALLADITE": "Galladita", + "GARCHOMPITE": "Garchompita", + "GARDEVOIRITE": "Gardevoirita", + "GENGARITE": "Gengarita", + "GLALITITE": "Glalita", + "GYARADOSITE": "Gyaradosita", + "HERACRONITE": "Heracrossita", + "HOUNDOOMINITE": "Houndoomita", + "KANGASKHANITE": "Kangaskhanita", + "LATIASITE": "Latiasita", + "LATIOSITE": "Latiosita", + "LOPUNNITE": "Lopunnita", + "LUCARIONITE": "Lucarita", + "MANECTITE": "Manectricita", + "MAWILITE": "Mawilita", + "MEDICHAMITE": "Medichamita", + "METAGROSSITE": "Metagrossita", + "MEWTWONITE_X": "Mewtwoita X", + "MEWTWONITE_Y": "Mewtwoita Y", + "PIDGEOTITE": "Pidgeotita", + "PINSIRITE": "Pinsirita", + "RAYQUAZITE": "Rayquazita", + "SABLENITE": "Sableynita", + "SALAMENCITE": "Salamencita", + "SCEPTILITE": "Sceptilita", + "SCIZORITE": "Scizorita", + "SHARPEDONITE": "Sharpedonita", + "SLOWBRONITE": "Slowbronita", + "STEELIXITE": "Steelixita", + "SWAMPERTITE": "Swampertita", + "TYRANITARITE": "Tyranitarita", + "VENUSAURITE": "Venusaurita", + "BLUE_ORB": "Prisma azul", + "RED_ORB": "Prisma rojo", + "SHARP_METEORITE": "Meteorito afilado", + "HARD_METEORITE": "Meteorito duro", + "SMOOTH_METEORITE": "Meteorito suave", + "ADAMANT_CRYSTAL": "Gran diamansfera", + "LUSTROUS_GLOBE": "Gran lustresfera", + "GRISEOUS_CORE": "Gran griseosfera", + "REVEAL_GLASS": "Espejo veraz", + "GRACIDEA": "Gracídea", + "MAX_MUSHROOMS": "Maxisetas", + "DARK_STONE": "Orbe oscuro", + "LIGHT_STONE": "Orbe claro", + "PRISON_BOTTLE": "Vasija castigo", + "N_LUNARIZER": "Necroluna", + "N_SOLARIZER": "Necrosol", + "RUSTED_SWORD": "Espada oxidada", + "RUSTED_SHIELD": "Escudo oxidado", + "ICY_REINS_OF_UNITY": "Riendas unión heladas", + "SHADOW_REINS_OF_UNITY": "Riendas unión oscuras", + "WELLSPRING_MASK": "Máscara fuente", + "HEARTHFLAME_MASK": "Máscara horno", + "CORNERSTONE_MASK": "Máscara cimiento", + "SHOCK_DRIVE": "FulgoROM", + "BURN_DRIVE": "PiroROM", + "CHILL_DRIVE": "CrioROM", + "DOUSE_DRIVE": "HidroROM", + "ULTRANECROZIUM_Z": "Ultranecrostal Z", + "FIST_PLATE": "Tabla fuerte", + "SKY_PLATE": "Tabla cielo", + "TOXIC_PLATE": "Tabla tóxica", + "EARTH_PLATE": "Tabla terrax", + "STONE_PLATE": "Tabla pétrea", + "INSECT_PLATE": "Tabla bicho", + "SPOOKY_PLATE": "Tabla terror", + "IRON_PLATE": "Tabla acero", + "FLAME_PLATE": "Tabla llama", + "SPLASH_PLATE": "Tabla linfa", + "MEADOW_PLATE": "Tabla pradal", + "ZAP_PLATE": "Tabla trueno", + "MIND_PLATE": "Tabla mental", + "ICICLE_PLATE": "Tabla helada", + "DRACO_PLATE": "Tabla draco", + "DREAD_PLATE": "Tabla oscura", + "PIXIE_PLATE": "Tabla duende", + "BLANK_PLATE": "Tabla neutra", + "LEGEND_PLATE": "Tabla legendaria", + "FIGHTING_MEMORY": "Disco lucha", + "FLYING_MEMORY": "Disco volador", + "POISON_MEMORY": "Disco veneno", + "GROUND_MEMORY": "Disco tierra", + "ROCK_MEMORY": "Disco roca", + "BUG_MEMORY": "Disco bicho", + "GHOST_MEMORY": "Disco fantasma", + "STEEL_MEMORY": "Disco acero", + "FIRE_MEMORY": "Disco fuego", + "WATER_MEMORY": "Disco agua", + "GRASS_MEMORY": "Disco planta", + "ELECTRIC_MEMORY": "Disco eléctrico", + "PSYCHIC_MEMORY": "Disco psíquico", + "ICE_MEMORY": "Disco hielo", + "DRAGON_MEMORY": "Disco dragón", + "DARK_MEMORY": "Disco siniestro", + "FAIRY_MEMORY": "Disco hada", + "NORMAL_MEMORY": "Disco normal" + } +} diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts deleted file mode 100644 index e7d6e8889fe..00000000000 --- a/src/locales/es/modifier-type.ts +++ /dev/null @@ -1,450 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - "AddPokeballModifierType": { - name: "{{modifierCount}}x {{pokeballName}}", - description: "Recibes {{modifierCount}}x {{pokeballName}} (En inventario: {{pokeballAmount}}) \nRatio de captura: {{catchRate}}.", - }, - "AddVoucherModifierType": { - name: "{{modifierCount}}x {{voucherTypeName}}", - description: "Recibes {{modifierCount}}x {{voucherTypeName}}.", - }, - "PokemonHeldItemModifierType": { - extra: { - "inoperable": "¡{{pokemonName}} no puede\nrecibir este objeto!", - "tooMany": "¡{{pokemonName}} tiene este objeto\ndemasiadas veces!", - } - }, - "PokemonHpRestoreModifierType": { - description: "Restaura {{restorePoints}} PS o, al menos, un {{restorePercent}}% PS de un Pokémon.", - extra: { - "fully": "Restaura todos los PS de un Pokémon.", - "fullyWithStatus": "Restaura todos los PS de un Pokémon y cura todos los problemas de estados.", - } - }, - "PokemonReviveModifierType": { - description: "Revive a un Pokémon y restaura {{restorePercent}}% PS.", - }, - "PokemonStatusHealModifierType": { - description: "Cura todos los problemas de estados de un Pokémon.", - }, - "PokemonPpRestoreModifierType": { - description: "Restaura {{restorePoints}} PP del movimiento que elijas de un Pokémon.", - extra: { - "fully": "Restaura todos los PP del movimiento que elijas de un Pokémon.", - } - }, - "PokemonAllMovePpRestoreModifierType": { - description: "Restaura {{restorePoints}} PP de todos los movimientos de un Pokémon.", - extra: { - "fully": "Restaura todos los PP de todos los movimientos de un Pokémon.", - } - }, - "PokemonPpUpModifierType": { - description: "Aumenta permanentemente los PP para un movimiento de un Pokémon en {{upPoints}} por cada 5 PP máximo (máximo 3).", - }, - "PokemonNatureChangeModifierType": { - name: "Menta {{natureName}}", - description: "Cambia la naturaleza de un Pokémon a {{natureName}} y desbloquea permanentemente dicha naturaleza para el inicial.", - }, - "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.", - }, - "AttackTypeBoosterModifierType": { - description: "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%.", - }, - "PokemonLevelIncrementModifierType": { - description: "Aumenta el nivel de un Pokémon en 1.", - }, - "AllPokemonLevelIncrementModifierType": { - description: "Aumenta el nivel de todos los miembros del equipo en 1.", - }, - "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.", - }, - "AllPokemonFullHpRestoreModifierType": { - description: "Restaura el 100% de los PS de todos los Pokémon.", - }, - "AllPokemonFullReviveModifierType": { - description: "Revive a todos los Pokémon debilitados y restaura completamente sus PS.", - }, - "MoneyRewardModifierType": { - description: "Otorga una {{moneyMultiplier}} cantidad de dinero (₽{{moneyAmount}}).", - extra: { - "small": "pequeña", - "moderate": "moderada", - "large": "gran", - }, - }, - "ExpBoosterModifierType": { - description: "Aumenta la ganancia de EXP en un {{boostPercent}}%.", - }, - "PokemonExpBoosterModifierType": { - description: "Aumenta la ganancia de EXP del portador en un {{boostPercent}}%.", - }, - "PokemonFriendshipBoosterModifierType": { - description: "Aumenta la ganancia de amistad por victoria en un 50%.", - }, - "PokemonMoveAccuracyBoosterModifierType": { - description: "Aumenta la precisión de los movimiento en un {{accuracyAmount}} (máximo 100).", - }, - "PokemonMultiHitModifierType": { - description: "Los ataques golpean una vez más a costa de una reducción de poder del 60/75/82,5% por cada objeto.", - }, - "TmModifierType": { - name: "MT{{moveId}} - {{moveName}}", - description: "Enseña {{moveName}} a un Pokémon.", - }, - "TmModifierTypeWithInfo": { - name: "MT{{moveId}} - {{moveName}}", - description: "Enseña {{moveName}} a un Pokémon\n(Hold C or Shift for more info).", - }, - "EvolutionItemModifierType": { - description: "Hace que ciertos Pokémon evolucionen.", - }, - "FormChangeItemModifierType": { - description: "Hace que ciertos Pokémon cambien de forma.", - }, - "FusePokemonModifierType": { - description: "Fusiona dos Pokémon (transfiere habilidades, divide estadísticas bases y tipos, comparte movimientos).", - }, - "TerastallizeModifierType": { - name: "Teralito {{teraType}}", - description: "Teracristaliza al portador al tipo {{teraType}} durante 10 combates.", - }, - "ContactHeldItemTransferChanceModifierType": { - description: "Al atacar, hay un {{chancePercent}}% de posibilidades de que robes el objeto que tiene el enemigo.", - }, - "TurnHeldItemTransferModifierType": { - description: "Cada turno, el portador roba un objeto del enemigo.", - }, - "EnemyAttackStatusEffectChanceModifierType": { - description: "Agrega un {{chancePercent}}% de probabilidad de infligir {{statusEffect}} con movimientos de ataque.", - }, - "EnemyEndureChanceModifierType": { - description: "Agrega un {{chancePercent}}% de probabilidad de resistir un ataque que lo debilitaría.", - }, - - "RARE_CANDY": { name: "Carameloraro" }, - "RARER_CANDY": { name: "Caramelorarísimo" }, - - "MEGA_BRACELET": { name: "Mega-aro", description: "Las Megapiedras están disponibles." }, - "DYNAMAX_BAND": { name: "Maximuñequera", description: "Las Maxisetas están disponibles." }, - "TERA_ORB": { name: "Orbe Teracristal", description: "Los Teralitos están disponibles." }, - - "MAP": { name: "Mapa", description: "Te permite elegir tu camino al final del bioma." }, - - "POTION": { name: "Poción" }, - "SUPER_POTION": { name: "Superpoción" }, - "HYPER_POTION": { name: "Hiperpoción" }, - "MAX_POTION": { name: "Máx. Poción" }, - "FULL_RESTORE": { name: "Restau. Todo" }, - - "REVIVE": { name: "Revivir" }, - "MAX_REVIVE": { name: "Máx. Revivir" }, - - "FULL_HEAL": { name: "Cura Total" }, - - "SACRED_ASH": { name: "Cen. Sagrada" }, - - "REVIVER_SEED": { name: "Semilla Revivir", description: "Revive al portador con la mitad de sus PS al debilitarse." }, - - "ETHER": { name: "Éter" }, - "MAX_ETHER": { name: "Éter Máx." }, - - "ELIXIR": { name: "Elixir" }, - "MAX_ELIXIR": { name: "Elixir Máx." }, - - "PP_UP": { name: "Más PP" }, - "PP_MAX": { name: "Máx PP" }, - - "LURE": { name: "Incienso" }, - "SUPER_LURE": { name: "Superincienso" }, - "MAX_LURE": { name: "Incienso Máximo" }, - - "MEMORY_MUSHROOM": { name: "Seta Recuerdo", description: "Recuerda un movimiento olvidado de un Pokémon." }, - - "EXP_SHARE": { name: "Repartir EXP", description: "Los que no combatan reciben el 20% de la EXP." }, - "EXP_BALANCE": { name: "Equilibrar EXP", description: "Da mayor parte de la EXP recibida a los miembros del equipo que tengan menos nivel." }, - - "OVAL_CHARM": { name: "Amuleto Oval", description: "Cada Pokémon combatiente recibe un 10% adicional de la EXP total." }, - - "EXP_CHARM": { name: "Amuleto EXP" }, - "SUPER_EXP_CHARM": { name: "Super Amuleto EXP" }, - "GOLDEN_EXP_CHARM": { name: "Amuleto EXP Dorado" }, - - "LUCKY_EGG": { name: "Huevo Suerte" }, - "GOLDEN_EGG": { name: "Huevo Dorado" }, - - "SOOTHE_BELL": { name: "Camp. Alivio" }, - - "EVIOLITE": { name: "Mineral Evolutivo", description: "Roca misteriosa. El Pokémon portador aumentará su Defensa y su Defensa Especial si aún puede evolucionar." }, - - "SOUL_DEW": { name: "Rocío bondad", description: "Aumenta la influencia de la naturaleza de un Pokémon en sus estadísticas en un 10% (aditivo)." }, - - "NUGGET": { name: "Pepita" }, - "BIG_NUGGET": { name: "Maxipepita" }, - "RELIC_GOLD": { name: "Real de oro" }, - - "AMULET_COIN": { name: "Moneda Amuleto", description: "Aumenta el dinero ganado en un 20%." }, - "GOLDEN_PUNCH": { name: "Puño Dorado", description: "Otorga el 50% del daño infligido como dinero." }, - "COIN_CASE": { name: "Monedero", description: "Después de cada 10 combates, recibe el 10% de tu dinero en intereses." }, - - "LOCK_CAPSULE": { name: "Cápsula candado", description: "Le permite bloquear las rarezas de los objetos al cambiar de objetos." }, - - "GRIP_CLAW": { name: "Garra Garfio" }, - "WIDE_LENS": { name: "Lupa" }, - - "MULTI_LENS": { name: "Multilupa" }, - - "HEALING_CHARM": { name: "Amuleto curación", description: "Aumenta la efectividad de los movimientos y objetos de curacion de PS en un 10% (excepto revivir)." }, - "CANDY_JAR": { name: "Candy Jar", description: "Aumenta en 1 el número de niveles añadidos por los carameloraros." }, - - "BERRY_POUCH": { name: "Saco Bayas", description: "Agrega un 30% de posibilidades de que una baya usada no se consuma." }, - - "FOCUS_BAND": { name: "Cinta Focus", description: "Agrega un 10% de probabilidad de resistir un ataque que lo debilitaría." }, - - "QUICK_CLAW": { name: "Garra Rápida", description: "Agrega un 10% de probabilidad de atacar primero independientemente de la velocidad (después de la prioridad)." }, - - "KINGS_ROCK": { name: "Roca del Rey", description: "Agrega un 10% de probabilidad de que un ataque haga que el oponente retroceda." }, - - "LEFTOVERS": { name: "Restos", description: "Cura 1/16 de los PS máximo de un Pokémon cada turno." }, - "SHELL_BELL": { name: "Camp Concha", description: "Cura 1/8 del daño infligido por un Pokémon." }, - - "TOXIC_ORB": { name: "Toxiesfera", description: "Extraña esfera que envenena gravemente a quien la usa en combate." }, - "FLAME_ORB": { name: "Llamasfera", description: "Extraña esfera que causa quemaduras a quien la usa en combate." }, - - "BATON": { name: "Relevo", description: "Permite pasar los efectos al cambiar de Pokémon, también evita las trampas." }, - - "SHINY_CHARM": { name: "Amuleto Iris", description: "Aumenta drásticamente la posibilidad de que un Pokémon salvaje sea Shiny." }, - "ABILITY_CHARM": { name: "Amuleto Habilidad", description: "Aumenta drásticamente la posibilidad de que un Pokémon salvaje tenga una habilidad oculta." }, - - "IV_SCANNER": { name: "Escáner IV", description: "Permite escanear los IVs de Pokémon salvajes. Se revelan 2 IVs por cada objeto.\nLos mejores IVs se muestran primero." }, - - "DNA_SPLICERS": { name: "Punta ADN" }, - - "MINI_BLACK_HOLE": { name: "Mini Agujero Negro" }, - - "GOLDEN_POKEBALL": { name: "Poké Ball Dorada", description: "Agrega 1 opción de objeto extra al final de cada combate." }, - - "ENEMY_DAMAGE_BOOSTER": { name: "Ficha Daño", description: "Aumenta el daño en un 5%." }, - "ENEMY_DAMAGE_REDUCTION": { name: "Ficha Protección", description: "Reduce el daño recibido en un 2,5%." }, - "ENEMY_HEAL": { name: "Ficha Curación", description: "Cura el 2% de los PS máximo en cada turno." }, - "ENEMY_ATTACK_POISON_CHANCE": { name: "Ficha Veneno" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Ficha Parálisis" }, - "ENEMY_ATTACK_BURN_CHANCE": { name: "Ficha Quemadura" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Ficha Cura Total", description: "Agrega un 2.5% de probabilidad cada turno de curar un problema de estado." }, - "ENEMY_ENDURE_CHANCE": { name: "Ficha Aguante" }, - "ENEMY_FUSED_CHANCE": { name: "Ficha Fusión", description: "Agrega un 1% de probabilidad de que un Pokémon salvaje sea una fusión." }, - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "Bola Luminosa", description: "Asombrosa esfera que aumenta el Ataque y el Ataque Especial. Debe llevarla Pikachu." }, - "THICK_CLUB": { name: "Hueso Grueso", description: "Extraño tipo de hueso que potencia los ataques físicos. Debe llevarlo Cubone o Marowak." }, - "METAL_POWDER": { name: "Polvo Metálico", description: "Polvo muy fino, pero a la vez poderoso, que aumenta la Defensa. Debe llevarlo Ditto." }, - "QUICK_POWDER": { name: "Polvo Veloz", description: "Polvo muy fino, pero a la vez poderoso, que aumenta la Velocidad. Debe llevarlo Ditto." } - }, - TempBattleStatBoosterItem: { - "x_attack": "Ataque X", - "x_defense": "Defensa X", - "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": "Attack", - "DEF": "Defense", - "SPATK": "Sp. Atk", - "SPDEF": "Sp. Def", - "SPD": "Speed", - "ACC": "Accuracy", - "CRIT": "Critical Hit Ratio", - "EVA": "Evasiveness", - "DEFAULT": "???", - }, - AttackTypeBoosterItem: { - "silk_scarf": "Pañuelo Seda", - "black_belt": "Cinturón Negro", - "sharp_beak": "Pico Afilado", - "poison_barb": "Flecha Venenosa", - "soft_sand": "Arena Fina", - "hard_stone": "Piedra Dura", - "silver_powder": "Polvo Plata", - "spell_tag": "Hechizo", - "metal_coat": "Rev. Metálico", - "charcoal": "Carbón", - "mystic_water": "Agua Mística", - "miracle_seed": "Semilla Milagro", - "magnet": "Imán", - "twisted_spoon": "Cuchara Torcida", - "never_melt_ice": "Antiderretir", - "dragon_fang": "Colmillo Dragón", - "black_glasses": "Gafas de Sol", - "fairy_feather": "Pluma Hada", - }, - BaseStatBoosterItem: { - "hp_up": "Más PS", - "protein": "Proteína", - "iron": "Hierro", - "calcium": "Calcio", - "zinc": "Zinc", - "carbos": "Carburante", - }, - EvolutionItem: { - "NONE": "None", - - "LINKING_CORD": "Cordón Unión", - "SUN_STONE": "Piedra Solar", - "MOON_STONE": "Piedra Lunar", - "LEAF_STONE": "Piedra Hoja", - "FIRE_STONE": "Piedra Fuego", - "WATER_STONE": "Piedra Agua", - "THUNDER_STONE": "Piedra Trueno", - "ICE_STONE": "Piedra Hielo", - "DUSK_STONE": "Piedra Noche", - "DAWN_STONE": "Piedra Alba", - "SHINY_STONE": "Piedra Día", - "CRACKED_POT": "Tetera Agrietada", - "SWEET_APPLE": "Manzana Dulce", - "TART_APPLE": "Manzana Ácida", - "STRAWBERRY_SWEET": "Confite Fresa", - "UNREMARKABLE_TEACUP": "Cuenco Mediocre", - - "CHIPPED_POT": "Tetera Rota", - "BLACK_AUGURITE": "Mineral Negro", - "GALARICA_CUFF": "Brazal Galanuez", - "GALARICA_WREATH": "Corona Galanuez", - "PEAT_BLOCK": "Bloque de Turba", - "AUSPICIOUS_ARMOR": "Armadura Auspiciosa", - "MALICIOUS_ARMOR": "Armadura Maldita", - "MASTERPIECE_TEACUP": "Cuenco Exquisito", - "METAL_ALLOY": "Metal Compuesto", - "SCROLL_OF_DARKNESS": "Manuscrito Sombras", - "SCROLL_OF_WATERS": "Manuscrito Aguas", - "SYRUPY_APPLE": "Manzana Melosa", - }, - FormChangeItem: { - "NONE": "None", - - "ABOMASITE": "Abomasnowita", - "ABSOLITE": "Absolita", - "AERODACTYLITE": "Aerodactylita", - "AGGRONITE": "Aggronita", - "ALAKAZITE": "Alakazamita", - "ALTARIANITE": "Altarianita", - "AMPHAROSITE": "Ampharosita", - "AUDINITE": "Audinita", - "BANETTITE": "Banettita", - "BEEDRILLITE": "Beedrillita", - "BLASTOISINITE": "Blastoisita", - "BLAZIKENITE": "Blazikenita", - "CAMERUPTITE": "Cameruptita", - "CHARIZARDITE_X": "Charizardita X", - "CHARIZARDITE_Y": "Charizardita Y", - "DIANCITE": "Diancita", - "GALLADITE": "Galladita", - "GARCHOMPITE": "Garchompita", - "GARDEVOIRITE": "Gardevoirita", - "GENGARITE": "Gengarita", - "GLALITITE": "Glalita", - "GYARADOSITE": "Gyaradosita", - "HERACRONITE": "Heracrossita", - "HOUNDOOMINITE": "Houndoomita", - "KANGASKHANITE": "Kangaskhanita", - "LATIASITE": "Latiasita", - "LATIOSITE": "Latiosita", - "LOPUNNITE": "Lopunnita", - "LUCARIONITE": "Lucarita", - "MANECTITE": "Manectricita", - "MAWILITE": "Mawilita", - "MEDICHAMITE": "Medichamita", - "METAGROSSITE": "Metagrossita", - "MEWTWONITE_X": "Mewtwoita X", - "MEWTWONITE_Y": "Mewtwoita Y", - "PIDGEOTITE": "Pidgeotita", - "PINSIRITE": "Pinsirita", - "RAYQUAZITE": "Rayquazita", - "SABLENITE": "Sableynita", - "SALAMENCITE": "Salamencita", - "SCEPTILITE": "Sceptilita", - "SCIZORITE": "Scizorita", - "SHARPEDONITE": "Sharpedonita", - "SLOWBRONITE": "Slowbronita", - "STEELIXITE": "Steelixita", - "SWAMPERTITE": "Swampertita", - "TYRANITARITE": "Tyranitarita", - "VENUSAURITE": "Venusaurita", - - "BLUE_ORB": "Prisma Azul", - "RED_ORB": "Prisma Rojo", - "SHARP_METEORITE": "Meteorito Afilado", - "HARD_METEORITE": "Meteorito Duro", - "SMOOTH_METEORITE": "Meteorito Suave", - "ADAMANT_CRYSTAL": "Gran Diamansfera", - "LUSTROUS_GLOBE": "Gran Lustresfera", - "GRISEOUS_CORE": "Gran Griseosfera", - "REVEAL_GLASS": "Espejo Veraz", - "GRACIDEA": "Gracídea", - "MAX_MUSHROOMS": "MaxiSetas", - "DARK_STONE": "Piedra Oscura", - "LIGHT_STONE": "Piedra Luminosa", - "PRISON_BOTTLE": "Vasija Castigo", - "N_LUNARIZER": "Necroluna", - "N_SOLARIZER": "Necrosol", - "RUSTED_SWORD": "Espada Oxidada", - "RUSTED_SHIELD": "Escudo Oxidado", - "ICY_REINS_OF_UNITY": "Riendas Unión Heladas", - "SHADOW_REINS_OF_UNITY": "Riendas Unión Oscuras", - "WELLSPRING_MASK": "Máscara Fuente", - "HEARTHFLAME_MASK": "Máscara Horno", - "CORNERSTONE_MASK": "Máscara Cimiento", - "SHOCK_DRIVE": "FulgoROM", - "BURN_DRIVE": "PiroROM", - "CHILL_DRIVE": "CrioROM", - "DOUSE_DRIVE": "HidroROM", - - "FIST_PLATE": "Tabla Fuerte", - "SKY_PLATE": "Tabla Cielo", - "TOXIC_PLATE": "Tabla Tóxica", - "EARTH_PLATE": "Tabla Terrax", - "STONE_PLATE": "Tabla Pétrea", - "INSECT_PLATE": "Tabla Bicho", - "SPOOKY_PLATE": "Tabla Terror", - "IRON_PLATE": "Tabla Acero", - "FLAME_PLATE": "Tabla Llama", - "SPLASH_PLATE": "Tabla Linfa", - "MEADOW_PLATE": "Tabla Pradal", - "ZAP_PLATE": "Tabla Trueno", - "MIND_PLATE": "Tabla Mental", - "ICICLE_PLATE": "Tabla Helada", - "DRACO_PLATE": "Tabla Draco", - "DREAD_PLATE": "Tabla Oscura", - "PIXIE_PLATE": "Tabla Duende", - "BLANK_PLATE": "Tabla Neutra", - "LEGEND_PLATE": "Tabla Legendaria", - "FIGHTING_MEMORY": "Disco Lucha", - "FLYING_MEMORY": "Disco Volador", - "POISON_MEMORY": "Disco Veneno", - "GROUND_MEMORY": "Disco Tierra", - "ROCK_MEMORY": "Disco Roca", - "BUG_MEMORY": "Disco Bicho", - "GHOST_MEMORY": "Disco Fantasma", - "STEEL_MEMORY": "Disco Acero", - "FIRE_MEMORY": "Disco Fuego", - "WATER_MEMORY": "Disco Agua", - "GRASS_MEMORY": "Disco Planta", - "ELECTRIC_MEMORY": "Disco Eléctrico", - "PSYCHIC_MEMORY": "Disco Psíquico", - "ICE_MEMORY": "Disco Hielo", - "DRAGON_MEMORY": "Disco Dragón", - "DARK_MEMORY": "Disco Siniestro", - "FAIRY_MEMORY": "Disco Hada", - "BLANK_MEMORY": "Disco Blanco", - }, -} as const; diff --git a/src/locales/es/modifier.json b/src/locales/es/modifier.json new file mode 100644 index 00000000000..a94e41a4574 --- /dev/null +++ b/src/locales/es/modifier.json @@ -0,0 +1,12 @@ +{ + "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 new file mode 100644 index 00000000000..f92b7950a07 --- /dev/null +++ b/src/locales/es/move-trigger.json @@ -0,0 +1,16 @@ +{ + "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!", + "setUpShellTrap": "¡{{pokemonName}} ha activado la Coraza Trampa!", + "isOverflowingWithSpacePower": "¡{{pokemonName}} rebosa\nenergía cósmica!", + "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!", + "safeguard": "¡{{targetName}} está protegido por Velo Sagrado!" +} diff --git a/src/locales/es/move.json b/src/locales/es/move.json new file mode 100644 index 00000000000..f4c28dd02e7 --- /dev/null +++ b/src/locales/es/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "Destructor", + "effect": "Golpea al objetivo con las extremidades, la cola o similares." + }, + "karateChop": { + "name": "Golpe Kárate", + "effect": "Da un golpe cortante. Suele ser crítico." + }, + "doubleSlap": { + "name": "Doble Bofetón", + "effect": "Abofetea de dos a cinco veces seguidas." + }, + "cometPunch": { + "name": "Puño Cometa", + "effect": "Pega de dos a cinco veces seguidas." + }, + "megaPunch": { + "name": "Megapuño", + "effect": "Un puñetazo de gran potencia." + }, + "payDay": { + "name": "Día de Pago", + "effect": "Arroja monedas al objetivo y las recupera al final del combate." + }, + "firePunch": { + "name": "Puño Fuego", + "effect": "Puñetazo ardiente que puede causar quemaduras." + }, + "icePunch": { + "name": "Puño Hielo", + "effect": "Puñetazo helado que puede llegar a congelar." + }, + "thunderPunch": { + "name": "Puño Trueno", + "effect": "Puñetazo eléctrico que puede paralizar al adversario." + }, + "scratch": { + "name": "Arañazo", + "effect": "Araña con afiladas garras." + }, + "viseGrip": { + "name": "Agarre", + "effect": "Atenaza al objetivo y le inflige daño." + }, + "guillotine": { + "name": "Guillotina", + "effect": "Ataque cortante que debilita al oponente de un golpe si acierta." + }, + "razorWind": { + "name": "Viento Cortante", + "effect": "Primero se prepara y en el segundo turno ataca al oponente con ráfagas de viento cortante. Alta probabilidad de ser crítico." + }, + "swordsDance": { + "name": "Danza Espada", + "effect": "Baile frenético que aumenta mucho el Ataque." + }, + "cut": { + "name": "Corte", + "effect": "Corta al adversario con garras, guadañas, etc." + }, + "gust": { + "name": "Tornado", + "effect": "Crea un tornado con las alas y lo lanza contra el objetivo." + }, + "wingAttack": { + "name": "Ataque Ala", + "effect": "Extiende totalmente sus majestuosas alas para golpear al objetivo con ellas." + }, + "whirlwind": { + "name": "Remolino", + "effect": "Se lleva al objetivo, que es cambiado por otro Pokémon. Si es un Pokémon salvaje, acaba el combate." + }, + "fly": { + "name": "Vuelo", + "effect": "El usuario vuela en el primer turno y ataca en el segundo." + }, + "bind": { + "name": "Atadura", + "effect": "Ata y oprime de cuatro a cinco turnos." + }, + "slam": { + "name": "Atizar", + "effect": "Golpea con la cola o con lianas, por ejemplo, para causar daño al objetivo." + }, + "vineWhip": { + "name": "Látigo Cepa", + "effect": "Azota al objetivo con lianas delgadas y largas tan flexibles como látigos." + }, + "stomp": { + "name": "Pisotón", + "effect": "Tremendo pisotón que puede hacer que el objetivo se amedrente." + }, + "doubleKick": { + "name": "Doble Patada", + "effect": "Una patada doble. Golpea dos veces." + }, + "megaKick": { + "name": "Megapatada", + "effect": "Patada de extrema fuerza." + }, + "jumpKick": { + "name": "Patada Salto", + "effect": "Da un salto y pega una patada. Si falla, se lesiona." + }, + "rollingKick": { + "name": "Patada Giro", + "effect": "Da una patada rápida y circular. Puede hacer retroceder al objetivo." + }, + "sandAttack": { + "name": "Ataque Arena", + "effect": "Arroja arena a la cara y baja la Precisión." + }, + "headbutt": { + "name": "Golpe Cabeza", + "effect": "Potente cabezazo que puede amedrentar al objetivo." + }, + "hornAttack": { + "name": "Cornada", + "effect": "Ataca al objetivo con una cornada punzante." + }, + "furyAttack": { + "name": "Ataque Furia", + "effect": "Cornea al objetivo de dos a cinco veces." + }, + "hornDrill": { + "name": "Perforador", + "effect": "Ataque con un cuerno giratorio que fulmina al objetivo de un solo golpe si acierta." + }, + "tackle": { + "name": "Placaje", + "effect": "Embestida con todo el cuerpo." + }, + "bodySlam": { + "name": "Golpe Cuerpo", + "effect": "Salta sobre el objetivo con todo su peso y puede llegar a paralizarlo." + }, + "wrap": { + "name": "Constricción", + "effect": "Oprime al objetivo de cuatro a cinco turnos con lianas o con su cuerpo." + }, + "takeDown": { + "name": "Derribo", + "effect": "Carga desmedida que también hiere al agresor." + }, + "thrash": { + "name": "Saña", + "effect": "El usuario ataca enfurecido durante dos o tres turnos y, después, se queda confuso." + }, + "doubleEdge": { + "name": "Doble Filo", + "effect": "Ataque arriesgado que también hiere al agresor." + }, + "tailWhip": { + "name": "Látigo", + "effect": "Agita la cola para bajar la Defensa del equipo rival." + }, + "poisonSting": { + "name": "Picotazo Veneno", + "effect": "Lanza un aguijón tóxico que puede envenenar al objetivo." + }, + "twineedle": { + "name": "Doble Ataque", + "effect": "Pincha dos veces con dos espinas. Puede envenenar." + }, + "pinMissile": { + "name": "Pin Misil", + "effect": "Lanza finas púas que hieren de dos a cinco veces." + }, + "leer": { + "name": "Malicioso", + "effect": "Intimida a los rivales para bajar su Defensa." + }, + "bite": { + "name": "Mordisco", + "effect": "Un voraz bocado con dientes afilados que puede amedrentar al objetivo." + }, + "growl": { + "name": "Gruñido", + "effect": "Dulce gruñido que distrae al objetivo para que baje la guardia y reduce su Ataque." + }, + "roar": { + "name": "Rugido", + "effect": "Se lleva al objetivo, que es cambiado por otro Pokémon. Si es un Pokémon salvaje, acaba el combate." + }, + "sing": { + "name": "Canto", + "effect": "Cancioncilla que hace dormir profundamente al objetivo." + }, + "supersonic": { + "name": "Supersónico", + "effect": "El cuerpo del usuario emite unas ondas sónicas raras que confunden al objetivo." + }, + "sonicBoom": { + "name": "Bomba Sónica", + "effect": "Lanza ondas de choque que restan 20 PS al objetivo." + }, + "disable": { + "name": "Anulación", + "effect": "Desactiva el último movimiento del objetivo durante cuatro turnos." + }, + "acid": { + "name": "Ácido", + "effect": "Rocía al objetivo con un ácido corrosivo. Puede reducir la Defensa Especial." + }, + "ember": { + "name": "Ascuas", + "effect": "Ataca con llamas pequeñas que pueden causar quemaduras." + }, + "flamethrower": { + "name": "Lanzallamas", + "effect": "Ataca con una gran ráfaga de fuego que puede causar quemaduras." + }, + "mist": { + "name": "Neblina", + "effect": "Rodea de una niebla blanquecina al bando del usuario e impide que el rival reduzca sus características durante cinco turnos." + }, + "waterGun": { + "name": "Pistola Agua", + "effect": "Ataca disparando agua con gran potencia." + }, + "hydroPump": { + "name": "Hidrobomba", + "effect": "Lanza una gran masa de agua a presión para atacar." + }, + "surf": { + "name": "Surf", + "effect": "Inunda el terreno de combate con una ola gigante que golpea a los Pokémon adyacentes." + }, + "iceBeam": { + "name": "Rayo Hielo", + "effect": "Rayo de hielo que puede llegar a congelar." + }, + "blizzard": { + "name": "Ventisca", + "effect": "Tormenta de hielo que puede llegar a congelar." + }, + "psybeam": { + "name": "Psicorrayo", + "effect": "Extraño rayo que puede causar confusión." + }, + "bubbleBeam": { + "name": "Rayo Burbuja", + "effect": "Ráfaga de burbujas que puede reducir la Velocidad." + }, + "auroraBeam": { + "name": "Rayo Aurora", + "effect": "Rayo multicolor que puede reducir el Ataque." + }, + "hyperBeam": { + "name": "Hiperrayo", + "effect": "El usuario ataca al objetivo con un potente haz de luz, pero deberá descansar en el siguiente turno." + }, + "peck": { + "name": "Picotazo", + "effect": "Ensarta al objetivo con un cuerno o pico punzante." + }, + "drillPeck": { + "name": "Pico Taladro", + "effect": "Picotazo giratorio y perforador muy potente." + }, + "submission": { + "name": "Sumisión", + "effect": "El usuario se lanza al suelo con el oponente en brazos y también se hace un poco de daño." + }, + "lowKick": { + "name": "Patada Baja", + "effect": "Patada baja que derriba al objetivo. Cuanto más pesa este, más daño le causa." + }, + "counter": { + "name": "Contraataque", + "effect": "Devuelve un golpe físico por duplicado." + }, + "seismicToss": { + "name": "Sísmico", + "effect": "Aprovecha la gravedad para derribar al objetivo. Le resta tantos PS como nivel tenga el usuario." + }, + "strength": { + "name": "Fuerza", + "effect": "Ataca al objetivo golpeándolo con todas sus fuerzas." + }, + "absorb": { + "name": "Absorber", + "effect": "Un ataque que absorbe nutrientes. Quien lo usa recupera la mitad de los PS del daño que produce." + }, + "megaDrain": { + "name": "Megaagotar", + "effect": "Un ataque que absorbe nutrientes. Quien lo usa recupera la mitad de los PS del daño que produce." + }, + "leechSeed": { + "name": "Drenadoras", + "effect": "Planta semillas que absorben PS del objetivo en cada turno y que le sirven para recuperarse." + }, + "growth": { + "name": "Desarrollo", + "effect": "Hace que su cuerpo crezca a marchas forzadas con lo que aumenta su Ataque y Ataque Especial." + }, + "razorLeaf": { + "name": "Hoja Afilada", + "effect": "Corta con hojas afiladas. Un ataque que suele ser crítico." + }, + "solarBeam": { + "name": "Rayo Solar", + "effect": "El usuario absorbe luz en el primer turno y en el segundo lanza un potente rayo de energía." + }, + "poisonPowder": { + "name": "Polvo Veneno", + "effect": "Esparce polvo tóxico que envenena al objetivo." + }, + "stunSpore": { + "name": "Paralizador", + "effect": "Esparce polvo que paraliza al objetivo." + }, + "sleepPowder": { + "name": "Somnífero", + "effect": "Esparce polvo que duerme al objetivo." + }, + "petalDance": { + "name": "Danza Pétalo", + "effect": "Ataca al objetivo lanzando pétalos de dos a tres turnos y, al finalizar, el usuario se queda confuso." + }, + "stringShot": { + "name": "Disparo Demora", + "effect": "Lanza seda a los rivales y reduce mucho su Velocidad." + }, + "dragonRage": { + "name": "Furia Dragón", + "effect": "Ráfaga de furiosas ondas de choque que quitan 40 PS." + }, + "fireSpin": { + "name": "Giro Fuego", + "effect": "Un aro de fuego que atrapa al objetivo de cuatro a cinco turnos." + }, + "thunderShock": { + "name": "Impactrueno", + "effect": "Ataque eléctrico que puede paralizar al objetivo." + }, + "thunderbolt": { + "name": "Rayo", + "effect": "Potente ataque eléctrico que puede paralizar al objetivo." + }, + "thunderWave": { + "name": "Onda Trueno", + "effect": "Una ligera descarga que paraliza al objetivo." + }, + "thunder": { + "name": "Trueno", + "effect": "Un poderoso rayo que daña al objetivo y puede paralizarlo." + }, + "rockThrow": { + "name": "Lanzarrocas", + "effect": "Tira una pequeña roca al objetivo." + }, + "earthquake": { + "name": "Terremoto", + "effect": "Un terremoto que afecta a los Pokémon adyacentes." + }, + "fissure": { + "name": "Fisura", + "effect": "Abre una grieta en el suelo y mete al objetivo en ella. Fulmina al objetivo de un solo golpe si acierta." + }, + "dig": { + "name": "Excavar", + "effect": "El usuario cava durante el primer turno y ataca en el segundo." + }, + "toxic": { + "name": "Tóxico", + "effect": "Envenena gravemente al objetivo y causa un daño mayor en cada turno." + }, + "confusion": { + "name": "Confusión", + "effect": "Débil ataque telequinético que puede causar confusión." + }, + "psychic": { + "name": "Psíquico", + "effect": "Fuerte ataque telequinético que puede bajar la Defensa Especial del objetivo." + }, + "hypnosis": { + "name": "Hipnosis", + "effect": "Ataque hipnótico que hace dormir profundamente al objetivo." + }, + "meditate": { + "name": "Meditación", + "effect": "El usuario reposa y medita para potenciar el Ataque." + }, + "agility": { + "name": "Agilidad", + "effect": "Relaja el cuerpo para ganar mucha Velocidad." + }, + "quickAttack": { + "name": "Ataque Rápido", + "effect": "Ataque de una rapidez espeluznante. Este movimiento tiene prioridad alta." + }, + "rage": { + "name": "Furia", + "effect": "Al usarse, aumenta el Ataque del usuario cada vez que es golpeado." + }, + "teleport": { + "name": "Teletransporte", + "effect": "Permite al usuario cambiarse por otro Pokémon del equipo, si lo hay. Si un Pokémon salvaje usa este movimiento, huye del combate." + }, + "nightShade": { + "name": "Tinieblas", + "effect": "Produce un espejismo ante el objetivo, que pierde tantos PS como nivel tenga el usuario." + }, + "mimic": { + "name": "Mimético", + "effect": "Copia el último movimiento usado por el objetivo, y puede utilizarlo mientras esté en el combate." + }, + "screech": { + "name": "Chirrido", + "effect": "Alarido agudo que reduce mucho la Defensa del objetivo." + }, + "doubleTeam": { + "name": "Doble Equipo", + "effect": "Crea copias de sí mismo para mejorar la Evasión." + }, + "recover": { + "name": "Recuperación", + "effect": "Restaura hasta la mitad de los PS máximos." + }, + "harden": { + "name": "Fortaleza", + "effect": "Tensa la musculatura del usuario para aumentar la Defensa." + }, + "minimize": { + "name": "Reducción", + "effect": "El usuario mengua para aumentar mucho la Evasión." + }, + "smokescreen": { + "name": "Pantalla de Humo", + "effect": "Reduce la Precisión del objetivo con una nube de humo o tinta." + }, + "confuseRay": { + "name": "Rayo Confuso", + "effect": "Rayo siniestro que confunde al objetivo." + }, + "withdraw": { + "name": "Refugio", + "effect": "El usuario se resguarda en su coraza, por lo que le sube la Defensa." + }, + "defenseCurl": { + "name": "Rizo Defensa", + "effect": "Se enrosca para ocultar sus puntos débiles y aumentar la Defensa." + }, + "barrier": { + "name": "Barrera", + "effect": "Crea una barrera que aumenta mucho la Defensa." + }, + "lightScreen": { + "name": "Pantalla de Luz", + "effect": "Pared de luz que reduce durante cinco turnos el daño producido por los ataques especiales." + }, + "haze": { + "name": "Niebla", + "effect": "Neblina oscura que elimina los cambios en las características de todos los Pokémon en combate." + }, + "reflect": { + "name": "Reflejo", + "effect": "Pared de luz que reduce durante cinco turnos el daño producido por los ataques físicos." + }, + "focusEnergy": { + "name": "Foco Energía", + "effect": "Concentra energía para aumentar las posibilidades de asestar un golpe crítico." + }, + "bide": { + "name": "Venganza", + "effect": "Espera dos turnos para atacar con el doble de potencia del daño recibido." + }, + "metronome": { + "name": "Metrónomo", + "effect": "Mueve un dedo y estimula su cerebro para usar al azar casi cualquier movimiento." + }, + "mirrorMove": { + "name": "Espejo", + "effect": "Ataca al objetivo con el último movimiento que este haya usado." + }, + "selfDestruct": { + "name": "Autodestrucción", + "effect": "El atacante explota y hiere a los Pokémon adyacentes. El usuario se debilita de inmediato." + }, + "eggBomb": { + "name": "Bomba Huevo", + "effect": "Arroja un huevo enorme al objetivo con gran fuerza." + }, + "lick": { + "name": "Lengüetazo", + "effect": "Una lengua ataca al objetivo. Puede causar parálisis." + }, + "smog": { + "name": "Polución", + "effect": "Lanza un ataque con gases tóxicos que pueden llegar a envenenar." + }, + "sludge": { + "name": "Residuos", + "effect": "Arroja residuos al objetivo. Puede llegar a envenenar." + }, + "boneClub": { + "name": "Hueso Palo", + "effect": "Aporrea con un hueso. Puede hacer retroceder al objetivo." + }, + "fireBlast": { + "name": "Llamarada", + "effect": "Llama intensa que chamusca y puede causar quemaduras." + }, + "waterfall": { + "name": "Cascada", + "effect": "Embiste con un gran impulso y puede llegar a amedrentar al objetivo." + }, + "clamp": { + "name": "Tenaza", + "effect": "Atrapa y atenaza con fuerza durante cuatro o cinco turnos." + }, + "swift": { + "name": "Meteoros", + "effect": "Lanza rayos en forma de estrella que no fallan nunca." + }, + "skullBash": { + "name": "Cabezazo", + "effect": "El usuario se prepara y sube su Defensa en el primer turno y en el segundo arremete con un cabezazo." + }, + "spikeCannon": { + "name": "Clavo Cañón", + "effect": "Lanza finas púas que hieren de dos a cinco veces." + }, + "constrict": { + "name": "Restricción", + "effect": "Ataca con largos tentáculos o zarcillos que pueden bajar la Velocidad." + }, + "amnesia": { + "name": "Amnesia", + "effect": "El usuario olvida sus preocupaciones y aumenta mucho la Defensa Especial." + }, + "kinesis": { + "name": "Kinético", + "effect": "Dobla una cuchara para distraer al objetivo y reducir su Precisión." + }, + "softBoiled": { + "name": "Ovocuración", + "effect": "Restaura la mitad de los PS máximos del usuario." + }, + "highJumpKick": { + "name": "Pat. Salto Alta", + "effect": "El usuario salta muy alto y da un rodillazo. Si falla, se hará daño." + }, + "glare": { + "name": "Deslumbrar", + "effect": "Intimida y asusta al objetivo con la mirada para dejarlo paralizado." + }, + "dreamEater": { + "name": "Comesueños", + "effect": "Restaura al usuario la mitad del daño causado a un objetivo dormido." + }, + "poisonGas": { + "name": "Gas Venenoso", + "effect": "Lanza una nube de gas tóxico al objetivo. Produce envenenamiento." + }, + "barrage": { + "name": "Bombardeo", + "effect": "Arroja esferas al objetivo entre dos y cinco veces seguidas." + }, + "leechLife": { + "name": "Chupavidas", + "effect": "Restaura al usuario la mitad del daño causado al objetivo." + }, + "lovelyKiss": { + "name": "Beso Amoroso", + "effect": "Intimida al objetivo con una cara que asusta y le da un beso que lo deja dormido." + }, + "skyAttack": { + "name": "Ataque Aéreo", + "effect": "Ataca durante dos turnos y suele asestar un golpe crítico. También puede amedrentar al objetivo." + }, + "transform": { + "name": "Transformación", + "effect": "El usuario se transforma en una copia del objetivo, con los mismos movimientos." + }, + "bubble": { + "name": "Burbuja", + "effect": "Lanza burbujas a los contrincantes y puede reducir su Velocidad." + }, + "dizzyPunch": { + "name": "Puño Mareo", + "effect": "Rítmicos puñetazos que pueden causar confusión." + }, + "spore": { + "name": "Espora", + "effect": "Esparce esporas que inducen el sueño." + }, + "flash": { + "name": "Destello", + "effect": "Luz cegadora que baja la Precisión del objetivo." + }, + "psywave": { + "name": "Psicoonda", + "effect": "Ataque con una onda de energía de intensidad variable." + }, + "splash": { + "name": "Salpicadura", + "effect": "No tiene ningún efecto. Solo salpica." + }, + "acidArmor": { + "name": "Armadura Ácida", + "effect": "Transforma la estructura celular para hacerse líquido y aumenta mucho la Defensa." + }, + "crabhammer": { + "name": "Martillazo", + "effect": "Golpea con fuerza con una pinza enorme. Suele asestar un golpe crítico." + }, + "explosion": { + "name": "Explosión", + "effect": "El atacante causa una grandísima explosión y hiere a los Pokémon adyacentes. El usuario se debilita de inmediato." + }, + "furySwipes": { + "name": "Golpes Furia", + "effect": "Araña rápidamente de dos a cinco veces." + }, + "bonemerang": { + "name": "Huesomerang", + "effect": "Lanza un hueso a modo de bumerán que golpea dos veces." + }, + "rest": { + "name": "Descanso", + "effect": "Restaura todos los PS y cura todos los problemas de estado del usuario, que se duerme los dos turnos siguientes." + }, + "rockSlide": { + "name": "Avalancha", + "effect": "Lanza grandes pedruscos. Puede amedrentar al objetivo." + }, + "hyperFang": { + "name": "Hipercolmillo", + "effect": "Ataca con agudos colmillos. Puede amedrentar al objetivo." + }, + "sharpen": { + "name": "Afilar", + "effect": "El perfil del usuario se hace más afilado y su Ataque mejora." + }, + "conversion": { + "name": "Conversión", + "effect": "Cambia el tipo del usuario por el del primer movimiento en su lista." + }, + "triAttack": { + "name": "Triataque", + "effect": "Ataque con tres rayos de luz que puede paralizar, quemar o congelar al objetivo." + }, + "superFang": { + "name": "Superdiente", + "effect": "Asesta una dentellada con sus afilados incisivos que reduce a la mitad los PS del objetivo." + }, + "slash": { + "name": "Cuchillada", + "effect": "Ataca con cuchillas o con pinzas. Suele asestar un golpe crítico." + }, + "substitute": { + "name": "Sustituto", + "effect": "Utiliza parte de los PS propios para crear un sustituto que actúa como señuelo." + }, + "struggle": { + "name": "Forcejeo", + "effect": "Solo se usa como último recurso al acabarse los PP. Hiere un poco al agresor." + }, + "sketch": { + "name": "Esquema", + "effect": "Aprende de forma permanente el último movimiento utilizado por el objetivo. Es de un solo uso." + }, + "tripleKick": { + "name": "Triple Patada", + "effect": "Propina hasta tres patadas seguidas, la potencia de las cuales aumenta cada vez que acierta." + }, + "thief": { + "name": "Ladrón", + "effect": "El usuario ataca y tiene un 30% de robarle el objeto al objetivo." + }, + "spiderWeb": { + "name": "Telaraña", + "effect": "Enreda al objetivo para evitar que abandone el combate." + }, + "mindReader": { + "name": "Telépata", + "effect": "El usuario adivina los movimientos del objetivo para hacer que su siguiente ataque no falle." + }, + "nightmare": { + "name": "Pesadilla", + "effect": "El objetivo dormido sufre una pesadilla que le hace perder PS en cada turno." + }, + "flameWheel": { + "name": "Rueda Fuego", + "effect": "Ataca envuelto en fuego. Puede causar quemaduras." + }, + "snore": { + "name": "Ronquido", + "effect": "Fuerte ronquido que solo puede usarse dormido. Puede amedrentar al objetivo." + }, + "curse": { + "name": "Maldición", + "effect": "Un movimiento que tiene efectos distintos si el usuario es de tipo Fantasma o no." + }, + "flail": { + "name": "Azote", + "effect": "Ataque frenético. Cuantos menos PS tenga el usuario, más daño producirá." + }, + "conversion2": { + "name": "Conversión2", + "effect": "El usuario cambia de tipo para hacerse resistente al último tipo de movimiento usado por el objetivo." + }, + "aeroblast": { + "name": "Aerochorro", + "effect": "Lanza un chorro de aire que suele asestar un golpe crítico." + }, + "cottonSpore": { + "name": "Esporagodón", + "effect": "Adhiere esporas a los rivales para reducir mucho su Velocidad." + }, + "reversal": { + "name": "Inversión", + "effect": "Ataque desesperado que causa más daño cuantos menos PS tenga el usuario." + }, + "spite": { + "name": "Rencor", + "effect": "Da rienda suelta a su rencor para reducir 4 PP del último movimiento usado por el objetivo." + }, + "powderSnow": { + "name": "Nieve Polvo", + "effect": "Lanza nieve que puede llegar a congelar." + }, + "protect": { + "name": "Protección", + "effect": "Frena todos los ataques, pero puede fallar si se usa repetidamente." + }, + "machPunch": { + "name": "Ultrapuño", + "effect": "Puñetazo de velocidad fulminante. Este movimiento tiene prioridad alta." + }, + "scaryFace": { + "name": "Cara Susto", + "effect": "Asusta al objetivo para reducir mucho su Velocidad." + }, + "feintAttack": { + "name": "Finta", + "effect": "Engaña al objetivo para acercarse y dar un puñetazo que no falla." + }, + "sweetKiss": { + "name": "Beso Dulce", + "effect": "Da un beso con tal dulzura que causa confusión." + }, + "bellyDrum": { + "name": "Tambor", + "effect": "Reduce la mitad de los PS máximos para mejorar al máximo el Ataque." + }, + "sludgeBomb": { + "name": "Bomba Lodo", + "effect": "Arroja residuos al objetivo. Puede llegar a envenenar." + }, + "mudSlap": { + "name": "Bofetón Lodo", + "effect": "Echa lodo en la cara del objetivo para infligirle daño y reducir su Precisión." + }, + "octazooka": { + "name": "Pulpocañón", + "effect": "Dispara tinta a la cara. Puede bajar la Precisión." + }, + "spikes": { + "name": "Púas", + "effect": "Esparce púas alrededor del equipo rival que hieren a los Pokémon rivales que entran en combate." + }, + "zapCannon": { + "name": "Electrocañón", + "effect": "Dispara una descarga eléctrica que causa daño y parálisis." + }, + "foresight": { + "name": "Profecía", + "effect": "Permite atacar con cualquier movimiento a objetivos de tipo Fantasma y golpear a Pokémon evasivos." + }, + "destinyBond": { + "name": "Mismo Destino", + "effect": "Si el usuario se debilita por un ataque rival antes de usar otro movimiento, el Pokémon rival se debilitará también. Puede fallar si se usa repetidamente." + }, + "perishSong": { + "name": "Canto Mortal", + "effect": "Si un Pokémon escucha este canto y no es cambiado por otro en tres turnos, acaba debilitándose." + }, + "icyWind": { + "name": "Viento Hielo", + "effect": "Ataque con aire helado que reduce la Velocidad del objetivo." + }, + "detect": { + "name": "Detección", + "effect": "Frena todos los ataques, pero puede fallar si se usa repetidamente." + }, + "boneRush": { + "name": "Ataque Óseo", + "effect": "Hueso en ristre, aporrea al objetivo de dos a cinco veces." + }, + "lockOn": { + "name": "Fijar Blanco", + "effect": "Fija el blanco para que el siguiente ataque no falle." + }, + "outrage": { + "name": "Enfado", + "effect": "El usuario ataca enfurecido durante dos o tres turnos y, después, se queda confuso." + }, + "sandstorm": { + "name": "Tormenta Arena", + "effect": "Tormenta de arena que dura cinco turnos y hiere a todos, excepto a los de tipo Roca, Tierra y Acero, y aumenta la Defensa Especial de los de tipo Roca." + }, + "gigaDrain": { + "name": "Gigadrenado", + "effect": "Un ataque que absorbe nutrientes. Quien lo usa recupera la mitad de los PS del daño que produce." + }, + "endure": { + "name": "Aguante", + "effect": "Resiste cualquier ataque y deja al menos 1 PS. Puede fallar si se usa repetidamente." + }, + "charm": { + "name": "Encanto", + "effect": "Engatusa al objetivo y reduce mucho su Ataque." + }, + "rollout": { + "name": "Rodar", + "effect": "El atacante rueda contra el objetivo durante cinco turnos, cada vez con mayor fuerza." + }, + "falseSwipe": { + "name": "Falso Tortazo", + "effect": "Ataque moderado que no debilita al objetivo y le deja al menos 1 PS." + }, + "swagger": { + "name": "Contoneo", + "effect": "Provoca confusión en el objetivo, pero también sube mucho su Ataque." + }, + "milkDrink": { + "name": "Batido", + "effect": "Restaura la mitad de los PS máximos del usuario." + }, + "spark": { + "name": "Chispa", + "effect": "Ataque eléctrico que puede llegar a paralizar." + }, + "furyCutter": { + "name": "Corte Furia", + "effect": "Ataque con garras o guadaña que crece en intensidad si se usa repetidas veces." + }, + "steelWing": { + "name": "Ala de Acero", + "effect": "Alas macizas que golpean al objetivo y pueden subir la Defensa del usuario." + }, + "meanLook": { + "name": "Mal de Ojo", + "effect": "Mal de ojo que impide al objetivo huir del combate o ser cambiado por otro." + }, + "attract": { + "name": "Atracción", + "effect": "Si el objetivo es del sexo opuesto, se enamorará y bajará la posibilidad de que ataque." + }, + "sleepTalk": { + "name": "Sonámbulo", + "effect": "Mientras duerme, usa uno de sus movimientos elegido al azar." + }, + "healBell": { + "name": "Cascabel Cura", + "effect": "Tañido que cura los problemas de estado de todos los Pokémon del equipo." + }, + "return": { + "name": "Retribución", + "effect": "Cuanto mayor sea la amistad con el Entrenador, más poderoso será este ataque." + }, + "present": { + "name": "Presente", + "effect": "Quien lo usa ataca al objetivo dándole un regalo con una bomba trampa. Sin embargo, a veces restaura sus PS." + }, + "frustration": { + "name": "Frustración", + "effect": "Cuanto menor sea la amistad con el Entrenador, más poderoso será este ataque." + }, + "safeguard": { + "name": "Velo Sagrado", + "effect": "Un poder misterioso que protege de problemas de estado durante cinco turnos." + }, + "painSplit": { + "name": "Divide Dolor", + "effect": "Suma los PS del usuario a los del objetivo y los reparte a partes iguales." + }, + "sacredFire": { + "name": "Fuego Sagrado", + "effect": "Fuego místico de gran intensidad que puede causar quemaduras." + }, + "magnitude": { + "name": "Magnitud", + "effect": "Sacudida sísmica de intensidad variable que afecta a todos los Pokémon a su alrededor." + }, + "dynamicPunch": { + "name": "Puño Dinámico", + "effect": "Puñetazo con toda la fuerza concentrada. Causa confusión si atina." + }, + "megahorn": { + "name": "Megacuerno", + "effect": "Ensarta al objetivo con su imponente cuerno o cornamenta." + }, + "dragonBreath": { + "name": "Dragoaliento", + "effect": "Poderosa ráfaga de aliento que golpea al objetivo y puede paralizarlo." + }, + "batonPass": { + "name": "Relevo", + "effect": "Cambia el puesto con otro miembro del equipo y le pasa los cambios en las características." + }, + "encore": { + "name": "Otra Vez", + "effect": "El objetivo repite su último movimiento durante tres turnos." + }, + "pursuit": { + "name": "Persecución", + "effect": "Hace el doble de daño al objetivo que pide el relevo." + }, + "rapidSpin": { + "name": "Giro Rápido", + "effect": "Ataque giratorio que puede eliminar movimientos como Atadura, Constricción y Drenadoras. También aumenta la Velocidad del usuario." + }, + "sweetScent": { + "name": "Dulce Aroma", + "effect": "Un dulce aroma engatusa al objetivo, por lo que se reduce mucho su Evasión." + }, + "ironTail": { + "name": "Cola Férrea", + "effect": "Ataca con una cola férrea y puede reducir la Defensa del objetivo." + }, + "metalClaw": { + "name": "Garra Metal", + "effect": "Ataque con garras de acero que puede aumentar el Ataque del usuario." + }, + "vitalThrow": { + "name": "Llave Vital", + "effect": "El usuario ataca el último, pero no falla." + }, + "morningSun": { + "name": "Sol Matinal", + "effect": "Restaura PS del usuario. La cantidad varía según el tiempo que haga." + }, + "synthesis": { + "name": "Síntesis", + "effect": "Restaura PS del usuario. La cantidad varía según el tiempo que haga." + }, + "moonlight": { + "name": "Luz Lunar", + "effect": "Restaura PS del usuario. La cantidad varía según el tiempo que haga." + }, + "hiddenPower": { + "name": "Poder Oculto", + "effect": "Movimiento cuyo tipo varía en función del Pokémon que lo usa." + }, + "crossChop": { + "name": "Tajo Cruzado", + "effect": "Corte doble que suele propinar un golpe crítico." + }, + "twister": { + "name": "Ciclón", + "effect": "Crea un violento tornado para hacer trizas al objetivo. Puede amedrentarlo." + }, + "rainDance": { + "name": "Danza Lluvia", + "effect": "Genera una fuerte lluvia que refuerza los movimientos de tipo Agua durante cinco turnos y debilita los de tipo Fuego." + }, + "sunnyDay": { + "name": "Día Soleado", + "effect": "Hace que se intensifique el efecto del sol durante cinco turnos, lo que potencia los movimientos de tipo Fuego y debilita los de tipo Agua." + }, + "crunch": { + "name": "Triturar", + "effect": "Tritura con afilados colmillos y puede reducir la Defensa del objetivo." + }, + "mirrorCoat": { + "name": "Manto Espejo", + "effect": "Responde a un ataque especial ocasionando el doble del daño recibido." + }, + "psychUp": { + "name": "Autosugestión", + "effect": "El usuario se sume en un trance y copia cualquier cambio que haya en las características de su objetivo." + }, + "extremeSpeed": { + "name": "Veloc. Extrema", + "effect": "Ataque de una velocidad extrema. Este movimiento tiene prioridad alta." + }, + "ancientPower": { + "name": "Poder Pasado", + "effect": "Ataque prehistórico que puede subir todas las características." + }, + "shadowBall": { + "name": "Bola Sombra", + "effect": "Lanza una bola oscura que puede bajar la Defensa Especial del objetivo." + }, + "futureSight": { + "name": "Premonición", + "effect": "Concentra energía psíquica para golpear al objetivo dos turnos después." + }, + "rockSmash": { + "name": "Golpe Roca", + "effect": "Propina un gran puñetazo que puede reducir la Defensa del objetivo." + }, + "whirlpool": { + "name": "Torbellino", + "effect": "Una tromba de agua atrapa al objetivo durante cuatro o cinco turnos." + }, + "beatUp": { + "name": "Paliza", + "effect": "Ataque de todo el equipo Pokémon. Cuantos más haya, más veces se atacará." + }, + "fakeOut": { + "name": "Sorpresa", + "effect": "Amedrenta al objetivo con este movimiento de prioridad alta. Solo sirve en el primer turno." + }, + "uproar": { + "name": "Alboroto", + "effect": "Ataca de forma alborotada durante tres turnos. Mantiene despiertos a todos." + }, + "stockpile": { + "name": "Reserva", + "effect": "Acumula energía y sube la Defensa y la Defensa Especial. Puede utilizarse hasta tres veces." + }, + "spitUp": { + "name": "Escupir", + "effect": "Libera de una vez la energía acumulada con Reserva. La potencia del movimiento será proporcional a la cantidad de energía acumulada." + }, + "swallow": { + "name": "Tragar", + "effect": "Absorbe la energía acumulada con Reserva para recobrar salud. Cuanta más se haya acumulado, mayor será el número de PS que se recuperen." + }, + "heatWave": { + "name": "Onda Ígnea", + "effect": "Provoca un viento abrasador que puede quemar al objetivo." + }, + "hail": { + "name": "Granizo", + "effect": "Tormenta de granizo que dura cinco turnos. Hiere a todos los Pokémon excepto a los de tipo Hielo." + }, + "torment": { + "name": "Tormento", + "effect": "Atormenta y enfurece al objetivo, que no puede usar dos veces seguidas el mismo movimiento." + }, + "flatter": { + "name": "Camelo", + "effect": "Halaga al objetivo y lo confunde, pero también sube su Ataque Especial." + }, + "willOWisp": { + "name": "Fuego Fatuo", + "effect": "Siniestras llamas moradas que producen quemaduras." + }, + "memento": { + "name": "Legado", + "effect": "El usuario se debilita, pero baja mucho tanto el Ataque como el Ataque Especial del objetivo." + }, + "facade": { + "name": "Imagen", + "effect": "Si el usuario está quemado, paralizado o envenenado, ataca con el doble de potencia." + }, + "focusPunch": { + "name": "Puño Certero", + "effect": "Se concentra para dar un puñetazo. Falla si se sufre un golpe antes de su uso." + }, + "smellingSalts": { + "name": "Estímulo", + "effect": "Hace el doble de daño a objetivos paralizados, pero también cura la parálisis." + }, + "followMe": { + "name": "Señuelo", + "effect": "Llama la atención para concentrar todos los ataques de todos los del equipo rival hacia sí mismo." + }, + "naturePower": { + "name": "Adaptación", + "effect": "Usa el poder de la naturaleza para atacar. Su efecto varía según el entorno de combate." + }, + "charge": { + "name": "Carga", + "effect": "Recarga energía para potenciar el siguiente movimiento de tipo Eléctrico. También sube la Defensa Especial." + }, + "taunt": { + "name": "Mofa", + "effect": "Enfurece al objetivo para que solo use movimientos de ataque durante tres turnos." + }, + "helpingHand": { + "name": "Refuerzo", + "effect": "El usuario ayuda a un aliado reforzando la potencia de su ataque." + }, + "trick": { + "name": "Truco", + "effect": "Engaña al objetivo desprevenido e intercambia objetos." + }, + "rolePlay": { + "name": "Imitación", + "effect": "Imita al objetivo por completo y copia su habilidad." + }, + "wish": { + "name": "Deseo", + "effect": "Restaura en el siguiente turno la mitad de los PS máximos del usuario o se los pasa al Pokémon que lo sustituye." + }, + "assist": { + "name": "Ayuda", + "effect": "Usa un movimiento de un miembro del equipo elegido al azar." + }, + "ingrain": { + "name": "Arraigo", + "effect": "Echa raíces para recuperar PS en cada turno, pero impide el relevo." + }, + "superpower": { + "name": "Fuerza Bruta", + "effect": "Ataque de gran potencia, pero que reduce el Ataque y la Defensa del agresor." + }, + "magicCoat": { + "name": "Capa Mágica", + "effect": "Barrera capaz de devolver al agresor movimientos como Drenadoras y otros que alteran el estado o las características." + }, + "recycle": { + "name": "Reciclaje", + "effect": "Recicla y así recupera un objeto equipado de un solo uso que ya haya sido empleado durante el combate." + }, + "revenge": { + "name": "Desquite", + "effect": "Ataque que produce el doble de daño si el usuario resulta herido en el mismo turno." + }, + "brickBreak": { + "name": "Demolición", + "effect": "Potente ataque que también es capaz de destruir barreras como Pantalla de Luz y Reflejo." + }, + "yawn": { + "name": "Bostezo", + "effect": "Gran bostezo que induce el sueño en el objetivo en el siguiente turno." + }, + "knockOff": { + "name": "Desarme", + "effect": "Impide al objetivo usar el objeto que lleva durante el combate. La potencia del movimiento se multiplica si el objetivo lleva un objeto." + }, + "endeavor": { + "name": "Esfuerzo", + "effect": "Reduce los PS del objetivo para que igualen a los del atacante." + }, + "eruption": { + "name": "Estallido", + "effect": "Furia explosiva. Cuanto menor sea el número de PS del usuario, menos potencia tendrá el movimiento." + }, + "skillSwap": { + "name": "Intercambio", + "effect": "Usa el poder psíquico para intercambiar habilidades con el objetivo." + }, + "imprison": { + "name": "Sellar", + "effect": "Impide a los rivales usar movimientos conocidos por el usuario durante el combate." + }, + "refresh": { + "name": "Alivio", + "effect": "Descansa para curar parálisis, envenenamiento o quemaduras." + }, + "grudge": { + "name": "Rabia", + "effect": "Si el usuario se debilita al recibir un ataque, todos los PP de este último ataque serán eliminados." + }, + "snatch": { + "name": "Robo", + "effect": "Roba el efecto de los movimientos de curación o de cambio de características que se usen." + }, + "secretPower": { + "name": "Daño Secreto", + "effect": "Ataque cuyos efectos secundarios varían según el entorno de combate." + }, + "dive": { + "name": "Buceo", + "effect": "El usuario se sumerge en el primer turno y ataca en el segundo." + }, + "armThrust": { + "name": "Empujón", + "effect": "Fuertes empujones que golpean de dos a cinco veces seguidas." + }, + "camouflage": { + "name": "Camuflaje", + "effect": "Modifica el tipo del Pokémon según el terreno de combate donde esté." + }, + "tailGlow": { + "name": "Luminicola", + "effect": "Se concentra en una ráfaga de luz que sube muchísimo el Ataque Especial." + }, + "lusterPurge": { + "name": "Resplandor", + "effect": "Fogonazo de luz que inflige daño al objetivo y puede reducir su Defensa Especial." + }, + "mistBall": { + "name": "Bola Neblina", + "effect": "Bola de plumas neblinosas que inflige daño al objetivo y puede reducir su Ataque Especial." + }, + "featherDance": { + "name": "Danza Pluma", + "effect": "Envuelve al objetivo con un manto de plumas para reducir mucho su Ataque." + }, + "teeterDance": { + "name": "Danza Caos", + "effect": "Danza histérica que confunde a los Pokémon que están alrededor del usuario." + }, + "blazeKick": { + "name": "Patada Ígnea", + "effect": "Patada que suele ser un golpe crítico y puede causar quemaduras." + }, + "mudSport": { + "name": "Chapoteo Lodo", + "effect": "El usuario esparce lodo a su alrededor, lo que debilita los movimientos de tipo Eléctrico durante cinco turnos." + }, + "iceBall": { + "name": "Bola Hielo", + "effect": "El atacante rueda contra el objetivo durante cinco turnos, cada vez con mayor fuerza." + }, + "needleArm": { + "name": "Brazo Pincho", + "effect": "Pega con brazos de pinchos y puede hacer retroceder al objetivo." + }, + "slackOff": { + "name": "Relajo", + "effect": "El usuario se relaja y restaura la mitad de sus PS máximos." + }, + "hyperVoice": { + "name": "Vozarrón", + "effect": "Grito desgarrador que inflige daño al objetivo." + }, + "poisonFang": { + "name": "Colmillo Veneno", + "effect": "Mordedura con colmillos venenosos que inflige daño al objetivo y puede envenenarlo gravemente." + }, + "crushClaw": { + "name": "Garra Brutal", + "effect": "Hace trizas al objetivo con garras afiladas y puede reducir su Defensa." + }, + "blastBurn": { + "name": "Anillo Ígneo", + "effect": "Calcina al objetivo con una explosión de fuego. El usuario deberá descansar en el siguiente turno." + }, + "hydroCannon": { + "name": "Hidrocañón", + "effect": "Ataca al objetivo con un cañonazo de agua. El usuario deberá descansar en el siguiente turno." + }, + "meteorMash": { + "name": "Puño Meteoro", + "effect": "Puñetazo que impacta como un meteorito y puede subir el Ataque del agresor." + }, + "astonish": { + "name": "Impresionar", + "effect": "Lanza un grito tan tremendo que impresiona y puede amedrentar al objetivo." + }, + "weatherBall": { + "name": "Meteorobola", + "effect": "El tipo y fuerza del ataque varían según el tiempo que haga." + }, + "aromatherapy": { + "name": "Aromaterapia", + "effect": "Cura todos los problemas de estado del equipo con un suave aroma." + }, + "fakeTears": { + "name": "Llanto Falso", + "effect": "Lágrimas de cocodrilo que bajan mucho la Defensa Especial del objetivo." + }, + "airCutter": { + "name": "Aire Afilado", + "effect": "Viento cortante que azota. Suele ser un golpe crítico." + }, + "overheat": { + "name": "Sofoco", + "effect": "Ataque en toda regla que baja mucho el Ataque Especial de quien lo usa." + }, + "odorSleuth": { + "name": "Rastreo", + "effect": "Permite atacar con cualquier movimiento a objetivos de tipo Fantasma y golpear a Pokémon evasivos." + }, + "rockTomb": { + "name": "Tumba Rocas", + "effect": "Tira rocas que detienen al objetivo y bajan su Velocidad." + }, + "silverWind": { + "name": "Viento Plata", + "effect": "Fuerte viento con polvo de escamas. Puede subir todas las características de quien lo usa." + }, + "metalSound": { + "name": "Eco Metálico", + "effect": "Horrible chirrido metálico que reduce mucho la Defensa Especial del objetivo." + }, + "grassWhistle": { + "name": "Silbato", + "effect": "Agradable melodía que adormece al objetivo." + }, + "tickle": { + "name": "Cosquillas", + "effect": "Hace reír al objetivo para bajar su Ataque y Defensa." + }, + "cosmicPower": { + "name": "Masa Cósmica", + "effect": "Sube la Defensa y la Defensa Especial propias con energía mística." + }, + "waterSpout": { + "name": "Salpicar", + "effect": "Chorro de agua. Cuantos menos PS tenga el usuario, menos potencia tendrá el movimiento." + }, + "signalBeam": { + "name": "Rayo Señal", + "effect": "Ataca con un rayo de luz siniestro. Puede confundir al objetivo." + }, + "shadowPunch": { + "name": "Puño Sombra", + "effect": "Puñetazo procedente de las sombras que no falla nunca." + }, + "extrasensory": { + "name": "Paranormal", + "effect": "Emite una energía muy extraña que puede amedrentar al objetivo." + }, + "skyUppercut": { + "name": "Gancho Alto", + "effect": "Gancho ascendente de gran ímpetu." + }, + "sandTomb": { + "name": "Bucle Arena", + "effect": "Enreda al objetivo en un remolino de arena de cuatro a cinco turnos." + }, + "sheerCold": { + "name": "Frío Polar", + "effect": "Debilita al objetivo de un solo golpe. Si lo usa un Pokémon que no sea de tipo Hielo, es difícil que acierte." + }, + "muddyWater": { + "name": "Agua Lodosa", + "effect": "Ataque con agua lodosa que puede reducir la Precisión del objetivo." + }, + "bulletSeed": { + "name": "Semilladora", + "effect": "Dispara rápido de dos a cinco ráfagas de semillas de manera consecutiva." + }, + "aerialAce": { + "name": "Golpe Aéreo", + "effect": "Desconcierta al objetivo con movimientos muy rápidos antes de cercenarlo. No falla nunca." + }, + "icicleSpear": { + "name": "Carámbano", + "effect": "Ataca lanzando de dos a cinco ráfagas consecutivas de carámbanos." + }, + "ironDefense": { + "name": "Defensa Férrea", + "effect": "Fortalece el cuerpo como si fuera de hierro y sube mucho la Defensa." + }, + "block": { + "name": "Bloqueo", + "effect": "Le corta el paso al objetivo para que no pueda escapar." + }, + "howl": { + "name": "Aullido", + "effect": "Aullido que sube el ánimo y aumenta el Ataque del equipo." + }, + "dragonClaw": { + "name": "Garra Dragón", + "effect": "Araña al objetivo con garras afiladas." + }, + "frenzyPlant": { + "name": "Planta Feroz", + "effect": "Golpea con una enorme planta. El usuario deberá descansar en el siguiente turno." + }, + "bulkUp": { + "name": "Corpulencia", + "effect": "Robustece el cuerpo para subir el Ataque y la Defensa." + }, + "bounce": { + "name": "Bote", + "effect": "El usuario bota en el primer turno y golpea al objetivo en el segundo y puede llegar a paralizarlo." + }, + "mudShot": { + "name": "Disparo Lodo", + "effect": "El usuario ataca lanzando una bola de lodo al objetivo que también reduce su Velocidad." + }, + "poisonTail": { + "name": "Cola Veneno", + "effect": "Puede envenenar y dar un golpe crítico." + }, + "covet": { + "name": "Antojo", + "effect": "Se acerca con ternura al objetivo y tiene un 30% de posibilidades de robar el objeto que lleve." + }, + "voltTackle": { + "name": "Placaje Eléc", + "effect": "Quien lo usa electrifica su cuerpo para luego atacar. Se hiere mucho a sí mismo, pero puede paralizar al objetivo." + }, + "magicalLeaf": { + "name": "Hoja Mágica", + "effect": "Esparce extrañas hojas que persiguen al objetivo. No falla nunca." + }, + "waterSport": { + "name": "Hidrochorro", + "effect": "El usuario se empapa en agua, lo que debilita los movimientos de tipo Fuego durante cinco turnos." + }, + "calmMind": { + "name": "Paz Mental", + "effect": "Aumenta la concentración y calma el espíritu para subir el Ataque Especial y la Defensa Especial." + }, + "leafBlade": { + "name": "Hoja Aguda", + "effect": "Acuchilla con una hoja fina. Suele dar un golpe crítico." + }, + "dragonDance": { + "name": "Danza Dragón", + "effect": "Danza mística que sube el Ataque y la Velocidad." + }, + "rockBlast": { + "name": "Pedrada", + "effect": "Lanza pedruscos al objetivo de dos a cinco veces consecutivas." + }, + "shockWave": { + "name": "Onda Voltio", + "effect": "Ataque eléctrico muy rápido que no falla nunca." + }, + "waterPulse": { + "name": "Hidropulso", + "effect": "Ataca con una potente onda de agua. Puede confundir al objetivo." + }, + "doomDesire": { + "name": "Deseo Oculto", + "effect": "Ataca al objetivo con innumerables haces de luz dos turnos después de haber usado el movimiento." + }, + "psychoBoost": { + "name": "Psicoataque", + "effect": "Ataque en toda regla que baja mucho el Ataque Especial de quien lo usa." + }, + "roost": { + "name": "Respiro", + "effect": "Aterriza sobre la superficie para descansar. Recupera hasta la mitad del total de sus PS." + }, + "gravity": { + "name": "Gravedad", + "effect": "Durante cinco turnos, se anulan los movimientos que alzan el vuelo y los Pokémon de tipo Volador o que levitan son vulnerables a movimientos de tipo Tierra." + }, + "miracleEye": { + "name": "Gran Ojo", + "effect": "Permite atacar con cualquier movimiento a objetivos de tipo Siniestro y golpear a Pokémon evasivos." + }, + "wakeUpSlap": { + "name": "Espabila", + "effect": "Inflige gran daño a objetivos dormidos. Sin embargo, los bofetones también los despiertan." + }, + "hammerArm": { + "name": "Machada", + "effect": "Un terrible puño golpea al contrincante, pero la Velocidad del usuario se ve reducida." + }, + "gyroBall": { + "name": "Giro Bola", + "effect": "Embiste al objetivo con un potente ataque giratorio. Cuanto más lento es el usuario, más daño causa." + }, + "healingWish": { + "name": "Deseo Cura", + "effect": "El usuario se debilita, pero cura los problemas de estado del Pokémon que lo sustituye y restaura sus PS." + }, + "brine": { + "name": "Salmuera", + "effect": "Si al objetivo le queda la mitad o menos de sus PS, el ataque será el doble de fuerte." + }, + "naturalGift": { + "name": "Don Natural", + "effect": "La baya que lleva presta su fuerza para atacar. El tipo de ataque y su fuerza dependen de la baya." + }, + "feint": { + "name": "Amago", + "effect": "Permite golpear a objetivos que han utilizado movimientos como Protección o Detección y anula sus efectos." + }, + "pluck": { + "name": "Picoteo", + "effect": "Picotea al objetivo. Si este sostiene una baya, la picotea también y obtiene sus efectos." + }, + "tailwind": { + "name": "Viento Afín", + "effect": "Crea un fuerte remolino que aumenta la Velocidad de los Pokémon de tu equipo durante cuatro turnos." + }, + "acupressure": { + "name": "Acupresión", + "effect": "Aplica presión en puntos clave del cuerpo para aumentar mucho una característica al azar." + }, + "metalBurst": { + "name": "Represión Metal", + "effect": "Devuelve al rival el último ataque recibido, pero con mucha más fuerza." + }, + "uTurn": { + "name": "Ida y Vuelta", + "effect": "Tras atacar, el usuario da paso a toda prisa a otro Pokémon del equipo." + }, + "closeCombat": { + "name": "A Bocajarro", + "effect": "Lucha abiertamente contra el objetivo sin protegerse. También reduce la Defensa y la Defensa Especial del usuario." + }, + "payback": { + "name": "Vendetta", + "effect": "El usuario contraataca con el doble de fuerza si el objetivo usa un movimiento antes." + }, + "assurance": { + "name": "Buena Baza", + "effect": "Si el objetivo ya ha sufrido daño en ese turno, la fuerza del ataque se duplica." + }, + "embargo": { + "name": "Embargo", + "effect": "Impide al objetivo usar el objeto que lleva durante cinco turnos. Su Entrenador tampoco puede usar objetos con él." + }, + "fling": { + "name": "Lanzamiento", + "effect": "El usuario lanza contra el objetivo el objeto que lleva. La potencia del movimiento y su efecto varían según el objeto." + }, + "psychoShift": { + "name": "Psicocambio", + "effect": "Usa su poder mental para transferir al objetivo sus problemas de estado." + }, + "trumpCard": { + "name": "As Oculto", + "effect": "Cuantos menos PP tenga el movimiento, mayor será la fuerza para atacar." + }, + "healBlock": { + "name": "Anticura", + "effect": "Impide al objetivo usar movimientos, habilidades y objetos equipados que recuperan PS durante cinco turnos." + }, + "wringOut": { + "name": "Estrujón", + "effect": "Estruja con fuerza al objetivo. Cuantos más PS tenga el objetivo, más fuerza tendrá el ataque." + }, + "powerTrick": { + "name": "Truco Fuerza", + "effect": "El usuario emplea su poder mental para intercambiar su Ataque y su Defensa." + }, + "gastroAcid": { + "name": "Bilis", + "effect": "El usuario arroja sus jugos biliares al objetivo, lo que anula el efecto de la habilidad en uso." + }, + "luckyChant": { + "name": "Conjuro", + "effect": "Lanza al cielo un conjuro que protege a todo su equipo de golpes críticos." + }, + "meFirst": { + "name": "Yo Primero", + "effect": "Se adelanta al movimiento que pretende usar el objetivo y lo lanza antes con más fuerza. Si el usuario es más lento, falla." + }, + "copycat": { + "name": "Copión", + "effect": "Imita el movimiento usado justo antes. El movimiento falla si no se ha usado aún ninguno." + }, + "powerSwap": { + "name": "Cambiafuerza", + "effect": "El usuario emplea su poder mental para intercambiar los cambios en el Ataque y el Ataque Especial con el objetivo." + }, + "guardSwap": { + "name": "Cambiadefensa", + "effect": "El usuario emplea su poder mental para intercambiar los cambios en la Defensa y la Defensa Especial con el objetivo." + }, + "punishment": { + "name": "Castigo", + "effect": "La fuerza del ataque aumenta cuanto más se ha fortalecido el objetivo con cambios de características." + }, + "lastResort": { + "name": "Última Baza", + "effect": "Este movimiento solo puede utilizarse tras haber usado al menos una vez todos los demás conocidos por el Pokémon." + }, + "worrySeed": { + "name": "Abatidoras", + "effect": "Planta una semilla en el objetivo que le causa pesar. Sustituye la habilidad del objetivo por Insomnio y le impide dormirse." + }, + "suckerPunch": { + "name": "Golpe Bajo", + "effect": "Permite atacar con prioridad. Falla si el objetivo no está preparando ningún ataque." + }, + "toxicSpikes": { + "name": "Púas Tóxicas", + "effect": "Lanza una trampa de púas tóxicas a los pies del objetivo que envenena a los rivales que entran en combate." + }, + "heartSwap": { + "name": "Cambiaalmas", + "effect": "Usa la fuerza mental para intercambiar con el objetivo los cambios en las características." + }, + "aquaRing": { + "name": "Acua Aro", + "effect": "El usuario se cubre con un manto de agua. Recupera algunos PS en cada turno." + }, + "magnetRise": { + "name": "Levitón", + "effect": "Levita gracias a un campo magnético generado por electricidad durante cinco turnos." + }, + "flareBlitz": { + "name": "Envite Ígneo", + "effect": "El Pokémon se cubre de llamas y carga contra el objetivo, aunque él también recibe daño. Puede quemar." + }, + "forcePalm": { + "name": "Palmeo", + "effect": "Ataca al objetivo con una onda de choque y puede llegar a paralizarlo." + }, + "auraSphere": { + "name": "Esfera Aural", + "effect": "Libera, desde su interior, una inmensa descarga de aura. Es infalible." + }, + "rockPolish": { + "name": "Pulimento", + "effect": "Reduce la resistencia puliendo su cuerpo. Aumenta mucho la Velocidad." + }, + "poisonJab": { + "name": "Puya Nociva", + "effect": "Pincha al objetivo con un tentáculo o brazo envenenado. Puede llegar a envenenar al objetivo." + }, + "darkPulse": { + "name": "Pulso Umbrío", + "effect": "Libera una horrible aura llena de malos pensamientos que puede amedrentar al objetivo." + }, + "nightSlash": { + "name": "Tajo Umbrío", + "effect": "Ataca al objetivo a la primera oportunidad. Suele ser crítico." + }, + "aquaTail": { + "name": "Acua Cola", + "effect": "Ataca agitando la cola como si fuera una ola rabiosa en una tormenta devastadora." + }, + "seedBomb": { + "name": "Bomba Germen", + "effect": "Lanza al objetivo una descarga de semillas explosivas desde arriba." + }, + "airSlash": { + "name": "Tajo Aéreo", + "effect": "Ataca con un viento afilado que incluso corta el aire. También puede amedrentar al objetivo." + }, + "xScissor": { + "name": "Tijera X", + "effect": "Cruza las guadañas o las garras para atacar al objetivo como si fueran unas tijeras." + }, + "bugBuzz": { + "name": "Zumbido", + "effect": "El usuario crea una onda sónica dañina moviendo su cuerpo que también puede disminuir la Defensa Especial del objetivo." + }, + "dragonPulse": { + "name": "Pulso Dragón", + "effect": "Abre mucho la boca y libera una onda de choque con la que ataca al objetivo." + }, + "dragonRush": { + "name": "Carga Dragón", + "effect": "Ataca de forma brutal mientras intimida al objetivo. Puede amedrentarlo." + }, + "powerGem": { + "name": "Joya de Luz", + "effect": "Ataca con un rayo de luz que centellea como si lo formaran miles de joyas." + }, + "drainPunch": { + "name": "Puño Drenaje", + "effect": "Un golpe que drena energía. El Pokémon recupera la mitad de los PS arrebatados al objetivo." + }, + "vacuumWave": { + "name": "Onda Vacío", + "effect": "Gira los puños y libera una onda de vacío contra el objetivo. Este movimiento tiene prioridad alta." + }, + "focusBlast": { + "name": "Onda Certera", + "effect": "Agudiza la concentración mental y libera su poder. Puede reducir la Defensa Especial del objetivo." + }, + "energyBall": { + "name": "Energibola", + "effect": "Aúna fuerzas de la naturaleza y libera su ataque. Puede reducir la Defensa Especial del objetivo." + }, + "braveBird": { + "name": "Pájaro Osado", + "effect": "Pliega sus alas y ataca con un vuelo rasante. El Pokémon que lo usa también resulta seriamente dañado." + }, + "earthPower": { + "name": "Tierra Viva", + "effect": "La tierra a los pies del objetivo erupciona violentamente. Puede reducir la Defensa Especial del objetivo." + }, + "switcheroo": { + "name": "Trapicheo", + "effect": "Intercambia con el objetivo los objetos que llevan tan rápido que es imposible verlo a simple vista." + }, + "gigaImpact": { + "name": "Gigaimpacto", + "effect": "El usuario carga contra el objetivo con toda la fuerza que tiene y descansa en el siguiente turno." + }, + "nastyPlot": { + "name": "Maquinación", + "effect": "Estimula su cerebro pensando en cosas malas. Aumenta mucho el Ataque Especial." + }, + "bulletPunch": { + "name": "Puño Bala", + "effect": "Ataca con fuertes puñetazos tan rápidos como proyectiles. Este movimiento tiene prioridad alta." + }, + "avalanche": { + "name": "Alud", + "effect": "Este ataque inflige el doble de daño a un objetivo que haya golpeado al usuario en ese mismo turno." + }, + "iceShard": { + "name": "Esquirla Helada", + "effect": "Crea esquirlas de hielo y las lanza a gran velocidad. Este movimiento tiene prioridad alta." + }, + "shadowClaw": { + "name": "Garra Umbría", + "effect": "Ataca con una garra afilada hecha de sombras. Suele ser crítico." + }, + "thunderFang": { + "name": "Colmillo Rayo", + "effect": "El usuario muerde al objetivo con colmillos electrificados y puede hacer que se amedrente o se paralice." + }, + "iceFang": { + "name": "Colmillo Hielo", + "effect": "El usuario muerde al objetivo con colmillos helados y puede hacer que se amedrente o se congele." + }, + "fireFang": { + "name": "Colmillo Ígneo", + "effect": "El usuario muerde al objetivo con colmillos en llamas y puede hacer que se amedrente o sufra quemaduras." + }, + "shadowSneak": { + "name": "Sombra Vil", + "effect": "Extiende su sombra y ataca al objetivo por la espalda. Este movimiento tiene prioridad alta." + }, + "mudBomb": { + "name": "Bomba Fango", + "effect": "Ataca lanzando una compacta bola de fango. Puede bajar la Precisión del objetivo." + }, + "psychoCut": { + "name": "Psicocorte", + "effect": "Ataca al objetivo con cuchillas formadas por energía psíquica. Suele ser crítico." + }, + "zenHeadbutt": { + "name": "Cabezazo Zen", + "effect": "Concentra su energía psíquica en la cabeza para golpear. Puede hacer que el objetivo se amedrente." + }, + "mirrorShot": { + "name": "Disparo Espejo", + "effect": "El usuario libera un haz de energía desde su pulido cuerpo. Puede bajar la Precisión." + }, + "flashCannon": { + "name": "Foco Resplandor", + "effect": "El usuario concentra toda la luz del cuerpo y la libera. Puede bajar la Defensa Especial del objetivo." + }, + "rockClimb": { + "name": "Treparrocas", + "effect": "Ataca con una gran embestida. Puede confundir al objetivo." + }, + "defog": { + "name": "Despejar", + "effect": "Potente viento que barre los efectos de movimientos como Reflejo o Pantalla de Luz usados por el objetivo. También reduce su Evasión." + }, + "trickRoom": { + "name": "Espacio Raro", + "effect": "Crea un espacio misterioso en el que los Pokémon lentos se mueven primero durante cinco turnos." + }, + "dracoMeteor": { + "name": "Cometa Draco", + "effect": "Hace que grandes cometas caigan del cielo sobre el objetivo. Baja mucho el Ataque Especial del que lo usa." + }, + "discharge": { + "name": "Chispazo", + "effect": "Una deslumbradora onda eléctrica afecta a los Pokémon que hay combatiendo alrededor. Puede paralizar." + }, + "lavaPlume": { + "name": "Humareda", + "effect": "Un infierno de llamas daña a los Pokémon adyacentes en combate. Puede causar quemaduras." + }, + "leafStorm": { + "name": "Lluevehojas", + "effect": "Envuelve al objetivo con una lluvia de hojas afiladas, pero reduce mucho su Ataque Especial." + }, + "powerWhip": { + "name": "Latigazo", + "effect": "El usuario agita violentamente sus lianas o tentáculos para golpear al objetivo." + }, + "rockWrecker": { + "name": "Romperrocas", + "effect": "Lanza una piedra enorme contra el objetivo. El usuario deberá descansar en el siguiente turno." + }, + "crossPoison": { + "name": "Veneno X", + "effect": "Tajo que puede envenenar al objetivo. Suele ser crítico." + }, + "gunkShot": { + "name": "Lanzamugre", + "effect": "Lanza contra el objetivo basura asquerosa y puede envenenarlo." + }, + "ironHead": { + "name": "Cabeza de Hierro", + "effect": "Ataca con su cabeza dura como el hierro. Puede hacer que el objetivo se amedrente." + }, + "magnetBomb": { + "name": "Bomba Imán", + "effect": "Lanza unas bombas de hierro que se pegan al adversario. No se puede esquivar." + }, + "stoneEdge": { + "name": "Roca Afilada", + "effect": "Clava piedras muy afiladas al objetivo. Suele ser crítico." + }, + "captivate": { + "name": "Seducción", + "effect": "Si el objetivo es del sexo opuesto, queda embelesado y baja mucho su Ataque Especial." + }, + "stealthRock": { + "name": "Trampa Rocas", + "effect": "Una trampa de rocas que flota en el aire y daña a los objetivos que entran en combate." + }, + "grassKnot": { + "name": "Hierba Lazo", + "effect": "Enreda al objetivo con hierba y lo derriba. Cuanto más pesado es el objetivo, más potencia tiene el movimiento." + }, + "chatter": { + "name": "Cháchara", + "effect": "Ataca con una onda de sonido muy ruidosa compuesta por palabras y confunde al objetivo." + }, + "judgment": { + "name": "Sentencia", + "effect": "Emite incontables haces de luz. El tipo del movimiento varía según la tabla que lleve el usuario." + }, + "bugBite": { + "name": "Picadura", + "effect": "Pica al objetivo. Si el objetivo lleva una baya, el usuario se la come y se beneficia de su efecto." + }, + "chargeBeam": { + "name": "Rayo Carga", + "effect": "Lanza un rayo eléctrico contra el objetivo. Puede subir el Ataque Especial de quien lo usa." + }, + "woodHammer": { + "name": "Mazazo", + "effect": "Arremete contra el objetivo con su robusto cuerpo. El usuario se hiere seriamente a sí mismo." + }, + "aquaJet": { + "name": "Acua Jet", + "effect": "Ataque de una rapidez espeluznante. Este movimiento tiene prioridad alta." + }, + "attackOrder": { + "name": "Al Ataque", + "effect": "El usuario llama a sus súbditos para que ataquen al objetivo. Suele ser crítico." + }, + "defendOrder": { + "name": "A Defender", + "effect": "El usuario llama a sus súbditos para que formen un escudo viviente. Sube la Defensa y la Defensa Especial." + }, + "healOrder": { + "name": "Auxilio", + "effect": "El usuario llama a sus súbditos para que lo curen. Recupera hasta la mitad de los PS máximos." + }, + "headSmash": { + "name": "Testarazo", + "effect": "El usuario arriesga su vida y lanza un cabezazo con toda su fuerza. El agresor resulta seriamente dañado." + }, + "doubleHit": { + "name": "Doble Golpe", + "effect": "Golpea al objetivo dos veces seguidas con la cola u otras partes de su cuerpo." + }, + "roarOfTime": { + "name": "Distorsión", + "effect": "Ataca al objetivo usando tal energía que el tiempo se distorsiona. El usuario deberá descansar en el siguiente turno." + }, + "spacialRend": { + "name": "Corte Vacío", + "effect": "Desgarra al objetivo y el espacio a su alrededor. Suele ser crítico." + }, + "lunarDance": { + "name": "Danza Lunar", + "effect": "El usuario se debilita, pero el Pokémon que lo sustituye recupera su estado, los PS y los PP." + }, + "crushGrip": { + "name": "Agarrón", + "effect": "Estruja al objetivo con gran fuerza. Cuantos más PS le queden al objetivo, más fuerte será el ataque." + }, + "magmaStorm": { + "name": "Lluvia Ígnea", + "effect": "El objetivo queda atrapado en una tormenta de fuego que dura de cuatro a cinco turnos." + }, + "darkVoid": { + "name": "Brecha Negra", + "effect": "El objetivo es enviado a un mundo de tinieblas que lo hace dormir." + }, + "seedFlare": { + "name": "Fulgor Semilla", + "effect": "Una onda de choque se libera del cuerpo. Puede bajar mucho la Defensa Especial del objetivo." + }, + "ominousWind": { + "name": "Viento Aciago", + "effect": "Produce un viento horripilante. Puede subir de golpe todas las características del usuario." + }, + "shadowForce": { + "name": "Golpe Umbrío", + "effect": "En el primer turno, desaparece. En el segundo, golpea al objetivo aunque se esté protegiendo." + }, + "honeClaws": { + "name": "Afilagarras", + "effect": "El usuario se afila las garras para aumentar su Ataque y su Precisión." + }, + "wideGuard": { + "name": "Vasta Guardia", + "effect": "Bloquea los ataques de objetivo múltiple lanzados contra el bando del usuario durante un turno." + }, + "guardSplit": { + "name": "Isoguardia", + "effect": "El usuario emplea sus poderes para hacer la media de su Defensa y su Defensa Especial con las del objetivo y compartirlas." + }, + "powerSplit": { + "name": "Isofuerza", + "effect": "El usuario emplea sus poderes para hacer la media de su Ataque y su Ataque Especial con los del objetivo y compartirlos." + }, + "wonderRoom": { + "name": "Zona Extraña", + "effect": "Crea un espacio misterioso donde se intercambian la Defensa y la Defensa Especial de todos los Pokémon durante cinco turnos." + }, + "psyshock": { + "name": "Psicocarga", + "effect": "Crea una onda psíquica que causa daño físico al objetivo." + }, + "venoshock": { + "name": "Carga Tóxica", + "effect": "Cubre al objetivo con un líquido venenoso. La potencia del movimiento se duplica si este ya está envenenado." + }, + "autotomize": { + "name": "Aligerar", + "effect": "El usuario se desprende de partes prescindibles de su cuerpo para hacerse más ligero y aumentar mucho su Velocidad." + }, + "ragePowder": { + "name": "Polvo Ira", + "effect": "Usa un polvo que enerva a los rivales y hace que centren en el usuario su atención y sus movimientos." + }, + "telekinesis": { + "name": "Telequinesis", + "effect": "El usuario emplea su poder mental para hacer flotar al objetivo, y lo convierte en un blanco fácil durante tres turnos." + }, + "magicRoom": { + "name": "Zona Mágica", + "effect": "Crea un espacio misterioso que inutiliza todos los objetos de los Pokémon durante cinco turnos." + }, + "smackDown": { + "name": "Antiaéreo", + "effect": "Ataca lanzando una piedra o un proyectil. Si el objetivo está en el aire, lo estrella contra el suelo." + }, + "stormThrow": { + "name": "Llave Corsé", + "effect": "Lanza un golpe devastador. Siempre asesta un golpe crítico." + }, + "flameBurst": { + "name": "Pirotecnia", + "effect": "Golpea al objetivo con una llamarada que afecta también a los Pokémon adyacentes." + }, + "sludgeWave": { + "name": "Onda Tóxica", + "effect": "Una onda tóxica que daña a los Pokémon de alrededor. Puede envenenar." + }, + "quiverDance": { + "name": "Danza Aleteo", + "effect": "Danza mística que aumenta el Ataque Especial, la Defensa Especial y la Velocidad." + }, + "heavySlam": { + "name": "Cuerpo Pesado", + "effect": "El usuario golpea con todo su cuerpo. Cuanto mayor sea su peso comparado con el del objetivo, mayor será la potencia del movimiento." + }, + "synchronoise": { + "name": "Sincrorruido", + "effect": "Una extraña onda que daña a todos los Pokémon adyacentes del mismo tipo que el que la ejecuta." + }, + "electroBall": { + "name": "Bola Voltio", + "effect": "Lanza una bola eléctrica. Cuanto mayor sea la Velocidad del usuario en comparación con la del objetivo, mayor será la potencia del movimiento." + }, + "soak": { + "name": "Empapar", + "effect": "Potente lluvia que transforma al objetivo en un Pokémon de tipo Agua." + }, + "flameCharge": { + "name": "Nitrocarga", + "effect": "Llamas que golpean al objetivo y aumentan la Velocidad del atacante." + }, + "coil": { + "name": "Enrosque", + "effect": "El usuario se concentra, lo que le permite aumentar su Ataque, Defensa y Precisión." + }, + "lowSweep": { + "name": "Puntapié", + "effect": "Ataque rápido dirigido a los pies del objetivo que le hace perder Velocidad." + }, + "acidSpray": { + "name": "Bomba Ácida", + "effect": "Ataca con un líquido corrosivo que reduce mucho la Defensa Especial del objetivo." + }, + "foulPlay": { + "name": "Juego Sucio", + "effect": "El usuario emplea la fuerza del objetivo para atacarlo. Cuanto mayor es el Ataque del objetivo, más daño provoca." + }, + "simpleBeam": { + "name": "Onda Simple", + "effect": "Lanza una onda psíquica que hace que la habilidad del objetivo pase a ser Simple." + }, + "entrainment": { + "name": "Danza Amiga", + "effect": "Una extraña danza que induce al objetivo a imitarla y cambia su habilidad por la misma que la del usuario." + }, + "afterYou": { + "name": "Cede Paso", + "effect": "Si el usuario es el más rápido, permite al objetivo usar un movimiento justo tras él, adelantándose a Pokémon más rápidos." + }, + "round": { + "name": "Canon", + "effect": "Un canto que ataca al objetivo. Cuantos más Pokémon lo usan, más aumenta de potencia." + }, + "echoedVoice": { + "name": "Eco Voz", + "effect": "Un susurro que aumenta de potencia conforme el usuario y otros Pokémon lo van utilizando." + }, + "chipAway": { + "name": "Guardia Baja", + "effect": "Un ataque que busca los puntos débiles del objetivo y puede causarle daño aunque cambien sus características." + }, + "clearSmog": { + "name": "Niebla Clara", + "effect": "Ataca al objetivo con una singular bola de lodo que elimina cualquier cambio en sus características." + }, + "storedPower": { + "name": "Poder Reserva", + "effect": "Acumula poder para golpear. Cuanto más suban las características del usuario, mayor será el daño." + }, + "quickGuard": { + "name": "Anticipo", + "effect": "Se protege a sí mismo y a sus aliados de movimientos con prioridad." + }, + "allySwitch": { + "name": "Cambio de Banda", + "effect": "Extraño poder que intercambia la posición del usuario con la de un aliado sobre el terreno de combate." + }, + "scald": { + "name": "Escaldar", + "effect": "Ataca arrojando agua hirviendo al objetivo. Puede causar quemaduras." + }, + "shellSmash": { + "name": "Rompecoraza", + "effect": "El usuario rompe su coraza y baja su Defensa y Defensa Especial, pero aumenta mucho su Ataque, Ataque Especial y Velocidad." + }, + "healPulse": { + "name": "Pulso Cura", + "effect": "Una onda curativa restaura la mitad de los PS máximos del objetivo." + }, + "hex": { + "name": "Infortunio", + "effect": "Ataque que causa un gran daño a los objetivos que sufren problemas de estado." + }, + "skyDrop": { + "name": "Caída Libre", + "effect": "Primer turno: lanza al objetivo al aire. Segundo turno: lo hace caer. Mientras está en el aire, no lo deja moverse." + }, + "shiftGear": { + "name": "Cambio de Marcha", + "effect": "Al hacer girar los engranajes, el usuario mejora su Ataque y aumenta mucho su Velocidad." + }, + "circleThrow": { + "name": "Llave Giro", + "effect": "Lanza por los aires al objetivo y hace que salga otro Pokémon. Si es uno salvaje, acaba el combate." + }, + "incinerate": { + "name": "Calcinación", + "effect": "Llamas que golpean al objetivo. Si este lleva una baya o ciertos objetos, se quemarán y ya no se podrán usar." + }, + "quash": { + "name": "Último Lugar", + "effect": "Consigue que el objetivo sea el último en moverse." + }, + "acrobatics": { + "name": "Acróbata", + "effect": "Golpea ágilmente. Si el usuario no porta ningún objeto, el objetivo resulta seriamente dañado." + }, + "reflectType": { + "name": "Clonatipo", + "effect": "Cambia el tipo del Pokémon al mismo tipo que el del objetivo." + }, + "retaliate": { + "name": "Represalia", + "effect": "Venga a los amigos caídos. Si en el turno anterior han derrotado a alguno, la potencia del ataque aumentará." + }, + "finalGambit": { + "name": "Sacrificio", + "effect": "El usuario se sacrifica causándole un daño al objetivo equivalente a sus propios PS perdidos." + }, + "bestow": { + "name": "Ofrenda", + "effect": "Entrega el objeto que lleva al objetivo en caso de que este no tenga ninguno." + }, + "inferno": { + "name": "Infierno", + "effect": "Ataca con una gran ráfaga de fuego que causa quemaduras." + }, + "waterPledge": { + "name": "Voto Agua", + "effect": "Ataca con columnas de agua. Combinado con Voto Fuego, crea un arcoíris y aumenta su potencia." + }, + "firePledge": { + "name": "Voto Fuego", + "effect": "Ataca con columnas de fuego. Combinado con Voto Planta, crea un mar de llamas y aumenta su potencia." + }, + "grassPledge": { + "name": "Voto Planta", + "effect": "Ataca con columnas de hojas. Combinado con Voto Agua, crea un pantano y aumenta su potencia." + }, + "voltSwitch": { + "name": "Voltiocambio", + "effect": "Tras atacar, el usuario da paso a toda prisa a otro Pokémon del equipo." + }, + "struggleBug": { + "name": "Estoicismo", + "effect": "El usuario opone resistencia y ataca a los oponentes. También reduce su Ataque Especial." + }, + "bulldoze": { + "name": "Terratemblor", + "effect": "Sacudida sísmica que afecta a los Pokémon adyacentes y también reduce su Velocidad." + }, + "frostBreath": { + "name": "Vaho Gélido", + "effect": "Quien lo usa ataca lanzando un aliento gélido. Siempre asesta un golpe crítico." + }, + "dragonTail": { + "name": "Cola Dragón", + "effect": "Ataca al objetivo y lo obliga a cambiarse por otro Pokémon. Si es uno salvaje, acaba el combate." + }, + "workUp": { + "name": "Avivar", + "effect": "Quien lo usa se concentra y potencia su Ataque y su Ataque Especial." + }, + "electroweb": { + "name": "Electrotela", + "effect": "Atrapa y ataca a los objetivos con una telaraña eléctrica. También reduce su Velocidad." + }, + "wildCharge": { + "name": "Voltio Cruel", + "effect": "Carga eléctrica muy potente que también hiere ligeramente a quien la usa." + }, + "drillRun": { + "name": "Taladradora", + "effect": "El usuario golpea usando su cuerpo como un taladro. Suele ser crítico." + }, + "dualChop": { + "name": "Golpe Bis", + "effect": "Golpea dos veces seguidas con las partes más recias de su cuerpo." + }, + "heartStamp": { + "name": "Arrumaco", + "effect": "El usuario despista al objetivo con gestos adorables y aprovecha la ocasión para asestarle un golpe tremendo que puede hacerlo retroceder." + }, + "hornLeech": { + "name": "Asta Drenaje", + "effect": "Un golpe que drena energía. El Pokémon recupera la mitad de los PS arrebatados al objetivo." + }, + "sacredSword": { + "name": "Espada Santa", + "effect": "El usuario ataca con una espada, ignorando cualquier cambio en las características del objetivo." + }, + "razorShell": { + "name": "Concha Filo", + "effect": "Una afilada vieira ataca al objetivo. También puede hacer disminuir su Defensa." + }, + "heatCrash": { + "name": "Golpe Calor", + "effect": "El usuario ataca con su cuerpo ardiente. Cuanto mayor sea su peso comparado con el del objetivo, más daño causará." + }, + "leafTornado": { + "name": "Ciclón de Hojas", + "effect": "Tritura con afiladas hojas y puede bajar la Precisión del objetivo." + }, + "steamroller": { + "name": "Rodillo de Púas", + "effect": "El usuario se hace una bola y arrolla al objetivo con su cuerpo. Puede hacerlo retroceder." + }, + "cottonGuard": { + "name": "Rizo Algodón", + "effect": "Cubre al Pokémon con una madeja protectora. Aumenta muchísimo la Defensa." + }, + "nightDaze": { + "name": "Pulso Noche", + "effect": "Ataca al objetivo con una onda siniestra. Puede bajar su Precisión." + }, + "psystrike": { + "name": "Onda Mental", + "effect": "Crea una onda psíquica que causa daño físico al objetivo." + }, + "tailSlap": { + "name": "Plumerazo", + "effect": "Golpea con la cola de dos a cinco veces seguidas." + }, + "hurricane": { + "name": "Vendaval", + "effect": "Golpea al objetivo con un fuerte torbellino que envuelve al rival y puede confundirlo." + }, + "headCharge": { + "name": "Ariete", + "effect": "Propina un tremendo cabezazo. También daña al usuario un poco." + }, + "gearGrind": { + "name": "Rueda Doble", + "effect": "Rota dos engranajes de hierro sobre el objetivo. Golpea dos veces." + }, + "searingShot": { + "name": "Bomba Ígnea", + "effect": "Un infierno de llamas daña a los Pokémon adyacentes en combate. Puede causar quemaduras." + }, + "technoBlast": { + "name": "Tecno Shock", + "effect": "Ataca al objetivo con un gran láser. El tipo del ataque lo determina el cartucho que porta el usuario." + }, + "relicSong": { + "name": "Canto Arcaico", + "effect": "Ataca conmoviendo al objetivo con un antiguo canto. Puede dormirlo." + }, + "secretSword": { + "name": "Sable Místico", + "effect": "Ensarta al objetivo con un largo cuerno dotado de un poder místico que provoca daño físico." + }, + "glaciate": { + "name": "Mundo Gélido", + "effect": "Ataque con aire helado que baja la Velocidad del objetivo." + }, + "boltStrike": { + "name": "Ataque Fulgor", + "effect": "Ataca envolviéndose de una gran carga eléctrica y embistiendo al objetivo con ella. Puede paralizar." + }, + "blueFlare": { + "name": "Llama Azul", + "effect": "Ataca con una bella pero potente llama azul que rodea al objetivo. Puede causar quemaduras." + }, + "fieryDance": { + "name": "Danza Llama", + "effect": "Envuelve en llamas y daña al objetivo. Puede aumentar el Ataque Especial de quien lo usa." + }, + "freezeShock": { + "name": "Rayo Gélido", + "effect": "El usuario carga un bloque de hielo con electricidad en el primer turno y ataca con él en el segundo. Puede paralizar." + }, + "iceBurn": { + "name": "Llama Gélida", + "effect": "Ataca al objetivo en el segundo turno rodeándolo de un aire gélido. Puede causar quemaduras." + }, + "snarl": { + "name": "Alarido", + "effect": "Chillido desagradable que reduce el Ataque Especial del objetivo." + }, + "icicleCrash": { + "name": "Chuzos", + "effect": "Lanza grandes carámbanos. Puede amedrentar al objetivo." + }, + "vCreate": { + "name": "V de Fuego", + "effect": "Golpea con una V de llamas al objetivo. Baja la Defensa, la Defensa Especial y la Velocidad de quien lo usa." + }, + "fusionFlare": { + "name": "Llama Fusión", + "effect": "Ataca con una llamarada gigantesca. Aumenta su potencia si es influenciada por una gran energía eléctrica." + }, + "fusionBolt": { + "name": "Rayo Fusión", + "effect": "Ataca con una enorme descarga eléctrica. Aumenta su potencia si es influenciada por una gigantesca llamarada." + }, + "flyingPress": { + "name": "Plancha Voladora", + "effect": "El usuario se lanza sobre su objetivo. Este movimiento es de tipo Lucha y tipo Volador al mismo tiempo." + }, + "matBlock": { + "name": "Escudo Tatami", + "effect": "El usuario usa un tatami para escudarse de los ataques enemigos. Protege también a los aliados. No funciona contra movimientos de estado." + }, + "belch": { + "name": "Eructo", + "effect": "El usuario causa daño a su objetivo lanzándole un eructo. Para poder utilizar este movimiento, tiene que haberse comido una baya equipada." + }, + "rototiller": { + "name": "Fertilizante", + "effect": "Labra la tierra haciendo que sea más fácil cultivarla y consigue que aumente el Ataque y el Ataque Especial de los Pokémon de tipo Planta." + }, + "stickyWeb": { + "name": "Red Viscosa", + "effect": "Coloca una red pegajosa alrededor del objetivo que reduce la Velocidad de los rivales que entran en combate." + }, + "fellStinger": { + "name": "Aguijón Letal", + "effect": "Si se derrota al objetivo utilizando este movimiento, aumenta muchísimo el Ataque del usuario." + }, + "phantomForce": { + "name": "Golpe Fantasma", + "effect": "El usuario desaparece en el primer turno y ataca a su objetivo en el segundo. Permite acertar aunque el objetivo esté protegiéndose." + }, + "trickOrTreat": { + "name": "Halloween", + "effect": "Invita al objetivo a celebrar Halloween, lo que añade el tipo Fantasma a los tipos de este." + }, + "nobleRoar": { + "name": "Rugido de Guerra", + "effect": "Intimida a su oponente con un rugido de guerra, lo que hace que disminuyan tanto su Ataque como su Ataque Especial." + }, + "ionDeluge": { + "name": "Cortina Plasma", + "effect": "El Pokémon disemina partículas con carga eléctrica que convierten los movimientos de tipo Normal en tipo Eléctrico." + }, + "parabolicCharge": { + "name": "Carga Parábola", + "effect": "Inflige daño a los Pokémon adyacentes. El usuario absorbe la mitad del daño producido para restaurar sus propios PS." + }, + "forestsCurse": { + "name": "Condena Silvana", + "effect": "El objetivo es presa de la maldición del bosque, por lo que pasa a ser un Pokémon de tipo Planta, además de conservar sus tipos habituales." + }, + "petalBlizzard": { + "name": "Tormenta Floral", + "effect": "El usuario desata un intenso vendaval de pétalos que daña a los Pokémon a su alrededor." + }, + "freezeDry": { + "name": "Liofilización", + "effect": "Enfría súbitamente al objetivo e incluso puede congelarlo. Es supereficaz contra Pokémon de tipo Agua." + }, + "disarmingVoice": { + "name": "Voz Cautivadora", + "effect": "Obnubila al objetivo con su fascinante voz y le provoca daños emocionales. No falla nunca." + }, + "partingShot": { + "name": "Última Palabra", + "effect": "El usuario se cambia por otro Pokémon de su equipo, pero antes amedrenta a su oponente y hace que disminuyan su Ataque y Ataque Especial." + }, + "topsyTurvy": { + "name": "Reversión", + "effect": "Invierte por completo los cambios en las características del objetivo." + }, + "drainingKiss": { + "name": "Beso Drenaje", + "effect": "El usuario absorbe PS del objetivo con un beso y restaura su propia energía en una cantidad igual o superior a la mitad del daño infligido." + }, + "craftyShield": { + "name": "Truco Defensa", + "effect": "Usa unos misteriosos poderes para protegerse a sí mismo y a sus aliados de movimientos de estado, pero no de otro tipo de ataques." + }, + "flowerShield": { + "name": "Defensa Floral", + "effect": "Aumenta la Defensa de todos los Pokémon de tipo Planta que hay en el combate usando unos misteriosos poderes." + }, + "grassyTerrain": { + "name": "Campo de Hierba", + "effect": "Durante cinco turnos, se potencian los movimientos de tipo Planta y los Pokémon que están en contacto con el suelo recuperan PS en cada turno." + }, + "mistyTerrain": { + "name": "Campo de Niebla", + "effect": "Durante cinco turnos, los Pokémon que están en el suelo no sufren problemas de estado y se reduce a la mitad el daño de los movimientos de tipo Dragón." + }, + "electrify": { + "name": "Electrificación", + "effect": "Si el objetivo queda electrificado antes de usar un movimiento, este será de tipo Eléctrico." + }, + "playRough": { + "name": "Carantoña", + "effect": "El Pokémon que lo usa le hace cucamonas al objetivo y lo ataca. Puede disminuir el Ataque del objetivo." + }, + "fairyWind": { + "name": "Viento Feérico", + "effect": "El Pokémon que lo usa desata un vendaval feérico que arremete contra el objetivo." + }, + "moonblast": { + "name": "Fuerza Lunar", + "effect": "Invoca el poder de la luna para atacar al objetivo. Puede reducir su Ataque Especial." + }, + "boomburst": { + "name": "Estruendo", + "effect": "Ataca a todos los Pokémon a su alrededor con una potentísima onda sonora." + }, + "fairyLock": { + "name": "Cerrojo Feérico", + "effect": "Consigue que ningún Pokémon pueda huir ni ser cambiado por otro en el siguiente turno echando un cerrojo." + }, + "kingsShield": { + "name": "Escudo Real", + "effect": "El usuario adopta una postura defensiva y se protege de cualquier daño. Reduce el Ataque de cualquier Pokémon con el que entre en contacto." + }, + "playNice": { + "name": "Camaradería", + "effect": "Se hace amigo de su objetivo y consigue que a este se le quiten las ganas de combatir, lo que reduce su Ataque." + }, + "confide": { + "name": "Confidencia", + "effect": "Hace que el objetivo pierda la concentración contándole un secreto y reduce su Ataque Especial." + }, + "diamondStorm": { + "name": "Torm. Diamantes", + "effect": "Desata un devastador vendaval de diamantes para dañar a los oponentes. Puede aumentar mucho la Defensa del usuario." + }, + "steamEruption": { + "name": "Chorro de Vapor", + "effect": "Envuelve al objetivo con vapor extremadamente caliente que puede causar quemaduras." + }, + "hyperspaceHole": { + "name": "Paso Dimensional", + "effect": "El usuario aparece junto al rival usando un agujero dimensional y le asesta un golpe que movimientos como Protección o Detección no pueden evitar." + }, + "waterShuriken": { + "name": "Shuriken de Agua", + "effect": "Golpea al objetivo de dos a cinco veces seguidas con estrellas arrojadizas hechas de mucosidad. Este movimiento tiene prioridad alta." + }, + "mysticalFire": { + "name": "Llama Embrujada", + "effect": "El usuario lanza por la boca una singular llama a gran temperatura con la que ataca a su objetivo y reduce su Ataque Especial." + }, + "spikyShield": { + "name": "Barrera Espinosa", + "effect": "Protege al usuario de ataques e inflige daño a quien se los lance si entra en contacto con él." + }, + "aromaticMist": { + "name": "Niebla Aromática", + "effect": "Consigue aumentar la Defensa Especial de un Pokémon de su equipo con una fragancia misteriosa." + }, + "eerieImpulse": { + "name": "Onda Anómala", + "effect": "El usuario irradia unas raras ondas que, al alcanzar al objetivo, reducen mucho su Ataque Especial." + }, + "venomDrench": { + "name": "Trampa Venenosa", + "effect": "Impregna a su objetivo con un líquido venenoso que disminuye el Ataque, el Ataque Especial y la Velocidad. Solo afecta a Pokémon ya envenenados." + }, + "powder": { + "name": "Polvo Explosivo", + "effect": "Esparce un polvo sobre el objetivo. Si este usa un movimiento de tipo Fuego en el mismo turno, el polvo explota y le inflige daño." + }, + "geomancy": { + "name": "Geocontrol", + "effect": "Concentra energía durante el primer turno, de forma que su Velocidad, Ataque Especial y Defensa Especial aumenten mucho en el segundo." + }, + "magneticFlux": { + "name": "Aura Magnética", + "effect": "Manipula el campo magnético y logra aumentar la Defensa y la Defensa Especial de los Pokémon aliados que cuenten con las habilidades Más y Menos." + }, + "happyHour": { + "name": "Paga Extra", + "effect": "Al usar este movimiento, se duplica el dinero recibido tras el combate." + }, + "electricTerrain": { + "name": "Campo Eléctrico", + "effect": "Durante cinco turnos, se potencian los movimientos de tipo Eléctrico y los Pokémon que están en contacto con el suelo no pueden quedarse dormidos." + }, + "dazzlingGleam": { + "name": "Brillo Mágico", + "effect": "Inflige daño al objetivo con una potente luz." + }, + "celebrate": { + "name": "Celebración", + "effect": "El Pokémon te felicita en un día muy especial para ti." + }, + "holdHands": { + "name": "Manos Juntas", + "effect": "El usuario le da la mano a un aliado y ambos se sienten muy felices." + }, + "babyDollEyes": { + "name": "Ojitos Tiernos", + "effect": "Lanza una mirada al objetivo con ojos acaramelados, con lo que logra que su Ataque se reduzca. Este movimiento tiene prioridad alta." + }, + "nuzzle": { + "name": "Moflete Estático", + "effect": "El usuario frota sus mofletes cargados de electricidad contra el objetivo y consigue paralizarlo." + }, + "holdBack": { + "name": "Clemencia", + "effect": "El usuario se contiene a la hora de atacar y deja al objetivo con al menos 1 PS." + }, + "infestation": { + "name": "Acoso", + "effect": "Hostiga al objetivo durante cuatro o cinco turnos e impide que pueda huir o ser cambiado por otro mientras tanto." + }, + "powerUpPunch": { + "name": "Puño Incremento", + "effect": "Cada vez que golpea a un oponente se endurecen sus puños. Si acierta al objetivo, el Ataque del usuario aumenta." + }, + "oblivionWing": { + "name": "Ala Mortífera", + "effect": "El usuario absorbe energía del objetivo y aumenta sus PS en una cantidad igual o superior a la mitad del daño infligido." + }, + "thousandArrows": { + "name": "Mil Flechas", + "effect": "Acierta incluso a Pokémon que estén en el aire y los hace caer al suelo." + }, + "thousandWaves": { + "name": "Mil Temblores", + "effect": "El usuario genera ondas sísmicas que se propagan por el suelo y sacuden al objetivo. Los Pokémon alcanzados no podrán huir del combate ni ser cambiados por otros." + }, + "landsWrath": { + "name": "Fuerza Telúrica", + "effect": "Acumula energía de la corteza terrestre y la concentra contra los oponentes, dañándolos." + }, + "lightOfRuin": { + "name": "Luz Aniquiladora", + "effect": "El usuario emplea el poder de la Flor Eterna para lanzar un potente rayo de luz, pero sufre bastante daño al hacerlo." + }, + "originPulse": { + "name": "Pulso Primigenio", + "effect": "Ataca al objetivo con una infinidad de rayos de luz azulada." + }, + "precipiceBlades": { + "name": "Filo del Abismo", + "effect": "Hace que el poder latente de la tierra se manifieste en forma de hojas afiladas y ataca al objetivo con ellas." + }, + "dragonAscent": { + "name": "Ascenso Draco", + "effect": "El usuario se precipita desde el cielo a una velocidad de vértigo para atacar al objetivo, pero hace que bajen la Defensa y la Defensa Especial del usuario." + }, + "hyperspaceFury": { + "name": "Cerco Dimensión", + "effect": "Ataca al objetivo con una ráfaga de golpes que pasan por alto los efectos de movimientos como Protección o Detección. Baja la Defensa del usuario." + }, + "breakneckBlitzPhysical": { + "name": "Carrera Arrolladora", + "effect": "El usuario emplea el Poder Z para coger carrerilla y arremeter contra el objetivo con gran fuerza. Su potencia depende de la del movimiento original." + }, + "breakneckBlitzSpecial": { + "name": "Carrera Arrolladora", + "effect": "Dummy data" + }, + "allOutPummelingPhysical": { + "name": "Ráfaga Demoledora", + "effect": "Emplea el Poder Z para lanzar una sarta de golpes demoledores contra el objetivo. Su potencia depende de la del movimiento original." + }, + "allOutPummelingSpecial": { + "name": "Ráfaga Demoledora", + "effect": "Dummy data" + }, + "supersonicSkystrikePhysical": { + "name": "Picado Supersónico", + "effect": "El usuario emplea el Poder Z para volar muy alto y abalanzarse en picado sobre el objetivo. Su potencia depende de la del movimiento original." + }, + "supersonicSkystrikeSpecial": { + "name": "Picado Supersónico", + "effect": "Dummy data" + }, + "acidDownpourPhysical": { + "name": "Diluvio Corrosivo", + "effect": "El usuario emplea el Poder Z para crear una ciénaga venenosa en la que sumerge al objetivo. Su potencia depende de la del movimiento original." + }, + "acidDownpourSpecial": { + "name": "Diluvio Corrosivo", + "effect": "Dummy data" + }, + "tectonicRagePhysical": { + "name": "Barrena Telúrica", + "effect": "Emplea el Poder Z para abrir una profunda grieta en el suelo que se traga al oponente. Su potencia depende de la del movimiento original." + }, + "tectonicRageSpecial": { + "name": "Barrena Telúrica", + "effect": "Dummy data" + }, + "continentalCrushPhysical": { + "name": "Aplastamiento Gigalítico", + "effect": "El usuario emplea el Poder Z para crear una montaña rocosa con la que aplasta al objetivo. Su potencia depende de la del movimiento original." + }, + "continentalCrushSpecial": { + "name": "Aplastamiento Gigalítico", + "effect": "Dummy data" + }, + "savageSpinOutPhysical": { + "name": "Guadaña Sedosa", + "effect": "Emplea el Poder Z para encerrar a su oponente en un capullo contra el que arremete con fuerza. Su potencia depende de la del movimiento original." + }, + "savageSpinOutSpecial": { + "name": "Guadaña Sedosa", + "effect": "Dummy data" + }, + "neverEndingNightmarePhysical": { + "name": "Presa Espectral", + "effect": "El usuario emplea el Poder Z para invocar a unos espectros encolerizados que apresan al objetivo. Su potencia depende de la del movimiento original." + }, + "neverEndingNightmareSpecial": { + "name": "Presa Espectral", + "effect": "Dummy data" + }, + "corkscrewCrashPhysical": { + "name": "Hélice Trepanadora", + "effect": "El usuario emplea el Poder Z para girar a toda velocidad y perforar al objetivo. Su potencia depende de la del movimiento original." + }, + "corkscrewCrashSpecial": { + "name": "Hélice Trepanadora", + "effect": "Dummy data" + }, + "infernoOverdrivePhysical": { + "name": "Hecatombe Pírica", + "effect": "El usuario emplea el Poder Z para lanzar una enorme llamarada con la que calcina a su objetivo. Su potencia depende de la del movimiento original." + }, + "infernoOverdriveSpecial": { + "name": "Hecatombe Pírica", + "effect": "Dummy data" + }, + "hydroVortexPhysical": { + "name": "Hidrovórtice Abisal", + "effect": "El usuario emplea el Poder Z para crear un potente torbellino de agua que engulle al objetivo. Su potencia depende de la del movimiento original." + }, + "hydroVortexSpecial": { + "name": "Hidrovórtice Abisal", + "effect": "Dummy data" + }, + "bloomDoomPhysical": { + "name": "Megatón Floral", + "effect": "Emplea el Poder Z para concentrar la energía de la vegetación que lo rodea y atacar al objetivo. Su potencia depende de la del movimiento original." + }, + "bloomDoomSpecial": { + "name": "Megatón Floral", + "effect": "Dummy data" + }, + "gigavoltHavocPhysical": { + "name": "Gigavoltio Destructor", + "effect": "El usuario emplea el Poder Z para generar una fuerte descarga eléctrica con la que electrocuta al objetivo. Su potencia depende de la del movimiento original." + }, + "gigavoltHavocSpecial": { + "name": "Gigavoltio Destructor", + "effect": "Dummy data" + }, + "shatteredPsychePhysical": { + "name": "Disruptor Psíquico", + "effect": "Emplea el Poder Z para manipular la mente del objetivo, infligiéndole un daño ingente. Su potencia depende de la del movimiento original." + }, + "shatteredPsycheSpecial": { + "name": "Disruptor Psíquico", + "effect": "Dummy data" + }, + "subzeroSlammerPhysical": { + "name": "Crioaliento Despiadado", + "effect": "Emplea el Poder Z para lanzar un rayo de hielo que baja la temperatura de golpe y congela al objetivo. Su potencia depende de la del movimiento original." + }, + "subzeroSlammerSpecial": { + "name": "Crioaliento Despiadado", + "effect": "Dummy data" + }, + "devastatingDrakePhysical": { + "name": "Dracoaliento Devastador", + "effect": "El usuario emplea el Poder Z para materializar su aura y golpear al objetivo. Su potencia depende de la del movimiento original." + }, + "devastatingDrakeSpecial": { + "name": "Dracoaliento Devastador", + "effect": "Dummy data" + }, + "blackHoleEclipsePhysical": { + "name": "Agujero Negro Aniquilador", + "effect": "El usuario emplea el Poder Z para generar un agujero negro que absorbe al objetivo. Su potencia depende de la del movimiento original." + }, + "blackHoleEclipseSpecial": { + "name": "Agujero Negro Aniquilador", + "effect": "Dummy data" + }, + "twinkleTacklePhysical": { + "name": "Arrumaco Sideral", + "effect": "El usuario emplea el Poder Z para crear una dimensión fascinante que deja al rival a su merced. Su potencia depende de la del movimiento original." + }, + "twinkleTackleSpecial": { + "name": "Arrumaco Sideral", + "effect": "Dummy data" + }, + "catastropika": { + "name": "Pikavoltio Letal", + "effect": "Pikachu emplea el Poder Z para acumular una gran cantidad de electricidad en su cuerpo y arremeter contra el objetivo." + }, + "shoreUp": { + "name": "Recogearena", + "effect": "Restaura la mitad de los PS máximos del usuario. Durante las tormentas de arena, restaura aún más PS." + }, + "firstImpression": { + "name": "Escaramuza", + "effect": "Movimiento de gran potencia que solo puede usarse en el turno en que el usuario sale al combate." + }, + "banefulBunker": { + "name": "Búnker", + "effect": "Protege de los ataques y, al mismo tiempo, envenena al Pokémon que use un movimiento de contacto contra el usuario." + }, + "spiritShackle": { + "name": "Puntada Sombría", + "effect": "Ataca al oponente y, al mismo tiempo, fija su sombra al terreno para impedir su huida." + }, + "darkestLariat": { + "name": "Lariat Oscuro", + "effect": "Gira sobre sí mismo y golpea al oponente con ambos brazos. Ignora los cambios en las características del objetivo." + }, + "sparklingAria": { + "name": "Aria Burbuja", + "effect": "Libera burbujas al cantar. Este movimiento cura las quemaduras de los Pokémon que reciban daño." + }, + "iceHammer": { + "name": "Martillo Hielo", + "effect": "Un terrible puño golpea al contrincante, pero la Velocidad del usuario se ve reducida." + }, + "floralHealing": { + "name": "Cura Floral", + "effect": "Restaura la mitad de los PS máximos del objetivo. Es más efectivo cuando se usa en conjunción con Campo de Hierba." + }, + "highHorsepower": { + "name": "Fuerza Equina", + "effect": "Asesta un golpe devastador usando todo su cuerpo." + }, + "strengthSap": { + "name": "Absorbefuerza", + "effect": "Restaura una cantidad de PS equivalente al valor de Ataque del rival, que además verá reducida esta característica." + }, + "solarBlade": { + "name": "Cuchilla Solar", + "effect": "El usuario dedica un turno a absorber energía lumínica y concentrarla en forma de cuchilla con la que ataca al rival en el siguiente turno." + }, + "leafage": { + "name": "Follaje", + "effect": "Ataca al objetivo lanzando hojas." + }, + "spotlight": { + "name": "Foco", + "effect": "Convierte a uno de los Pokémon que están combatiendo en el foco de atención, de modo que todos los ataques se dirijan hacia él." + }, + "toxicThread": { + "name": "Hilo Venenoso", + "effect": "Ataca al objetivo con hilillos venenosos que reducen su Velocidad y lo envenenan." + }, + "laserFocus": { + "name": "Aguzar", + "effect": "El usuario se concentra para que el siguiente ataque propine un golpe crítico." + }, + "gearUp": { + "name": "Piñón Auxiliar", + "effect": "Cambia de marcha y logra aumentar el Ataque y el Ataque Especial de los Pokémon aliados que cuenten con las habilidades Más y Menos." + }, + "throatChop": { + "name": "Golpe Mordaza", + "effect": "Inflige al rival un dolor tan abrumador que le impide utilizar durante dos turnos ataques que se sirven del sonido." + }, + "pollenPuff": { + "name": "Bola de Polen", + "effect": "Ataca al objetivo con una bola explosiva. Si esta alcanza a un aliado, le hará recuperar PS." + }, + "anchorShot": { + "name": "Anclaje", + "effect": "Ataca lanzando un ancla al objetivo, que queda atrapado y no puede huir ni ser cambiado por otro." + }, + "psychicTerrain": { + "name": "Campo Psíquico", + "effect": "Durante cinco turnos, se potencian los movimientos de tipo Psíquico y los Pokémon que están en el suelo quedan protegidos contra movimientos con prioridad." + }, + "lunge": { + "name": "Plancha", + "effect": "Ataca al objetivo abalanzándose sobre él con todas sus fuerzas y reduce su Ataque." + }, + "fireLash": { + "name": "Látigo Ígneo", + "effect": "Golpea al objetivo con un látigo incandescente y reduce su Defensa." + }, + "powerTrip": { + "name": "Chulería", + "effect": "Ataca al oponente presumiendo de su fuerza. Cuanto más hayan subido las características del usuario, mayor será el daño." + }, + "burnUp": { + "name": "Llama Final", + "effect": "Utiliza hasta el último resquicio de llamas de su cuerpo para infligir un grave daño al objetivo. Tras el ataque, el usuario deja de ser de tipo Fuego." + }, + "speedSwap": { + "name": "Cambiavelocidad", + "effect": "Intercambia su Velocidad por la del objetivo." + }, + "smartStrike": { + "name": "Cuerno Certero", + "effect": "El usuario ensarta al objetivo con su afilada cornamenta. No falla nunca." + }, + "purify": { + "name": "Purificación", + "effect": "Cura los problemas de estado del Pokémon rival y a cambio recupera PS propios." + }, + "revelationDance": { + "name": "Danza Despertar", + "effect": "Ataque que consiste en un baile muy enérgico. El tipo de este ataque se corresponde con el del Pokémon que lo ejecuta." + }, + "coreEnforcer": { + "name": "Núcleo Castigo", + "effect": "Inflige daño al rival, y si este ya ha hecho uso de algún movimiento, pierde su habilidad." + }, + "tropKick": { + "name": "Patada Tropical", + "effect": "Lanza una patada con la fuerza del trópico que golpea al objetivo y reduce su Ataque." + }, + "instruct": { + "name": "Mandato", + "effect": "Fuerza al objetivo a repetir inmediatamente su último movimiento." + }, + "beakBlast": { + "name": "Pico Cañón", + "effect": "Primero aumenta la temperatura de su pico y luego ejecuta un ataque. Quema al rival si este le propina un ataque físico mientras está calentando el pico." + }, + "clangingScales": { + "name": "Fragor Escamas", + "effect": "Frota todas las escamas de su cuerpo para crear un fuerte sonido con el que ataca. Cuando el ataque termina, su Defensa se ve reducida." + }, + "dragonHammer": { + "name": "Martillo Dragón", + "effect": "Usa el cuerpo como un martillo para abalanzarse sobre su rival y causarle daño." + }, + "brutalSwing": { + "name": "Giro Vil", + "effect": "Hace pivotar su cuerpo para causar daño a los Pokémon adyacentes." + }, + "auroraVeil": { + "name": "Velo Aurora", + "effect": "Reduce el daño de los ataques físicos y especiales durante cinco turnos. Solo puede usarse cuando está nevando." + }, + "sinisterArrowRaid": { + "name": "Aluvión de Flechas Sombrías", + "effect": "Decidueye usa el Poder Z para proyectar multitud de flechas potentísimas que atraviesan a su oponente." + }, + "maliciousMoonsault": { + "name": "Hiperplancha Oscura", + "effect": "Incineroar refuerza sus músculos con el Poder Z para golpear con todas sus fuerzas a su oponente." + }, + "oceanicOperetta": { + "name": "Sinfonía de la Diva Marina", + "effect": "Primarina invoca ingentes cantidades de agua con el Poder Z para atacar con gran potencia a su rival." + }, + "guardianOfAlola": { + "name": "Cólera del Guardián", + "effect": "Los Pokémon Dios Nativo canalizan la energía de Alola gracias al Poder Z y atacan con gran fuerza a sus rivales reduciendo un gran porcentaje de sus PS." + }, + "soulStealing7StarStrike": { + "name": "Constelación Robaalmas", + "effect": "Cuando Marshadow obtiene el Poder Z, lanza una potente y continua oleada de puñetazos y patadas con la que castiga a su rival." + }, + "stokedSparksurfer": { + "name": "Surfeo Galvánico", + "effect": "Cuando un Raichu de Alola obtiene el Poder Z, lanza un potente ataque contra su enemigo y lo deja paralizado." + }, + "pulverizingPancake": { + "name": "Arrojo Intempestivo", + "effect": "Gracias al Poder Z, Snorlax puede mover su enorme cuerpo con gran agilidad y determinación, cargando sobre el oponente con todas sus fuerzas." + }, + "extremeEvoboost": { + "name": "Novena Potencia", + "effect": "Cuando Eevee obtiene el Poder Z, toma prestada la energía de sus amigos evolucionados para potenciar enormemente sus características." + }, + "genesisSupernova": { + "name": "Supernova Original", + "effect": "Mew usa el Poder Z para realizar un potente ataque contra su adversario y crear un Campo Psíquico sobre el terreno." + }, + "shellTrap": { + "name": "Coraza Trampa", + "effect": "El caparazón del Pokémon se convierte en una trampa. Si lo alcanza un ataque físico, la trampa estalla y los rivales sufren daño." + }, + "fleurCannon": { + "name": "Cañón Floral", + "effect": "El usuario emite un potente rayo, pero su Ataque Especial se reduce mucho." + }, + "psychicFangs": { + "name": "Psicocolmillo", + "effect": "Ataca a sus rivales con poderes psíquicos que además destruyen barreras como Pantalla de Luz y Reflejo." + }, + "stompingTantrum": { + "name": "Pataleta", + "effect": "Usa la frustración como revulsivo para atacar. La potencia de Pataleta se duplica si el usuario ha fallado el último movimiento usado." + }, + "shadowBone": { + "name": "Hueso Sombrío", + "effect": "Ataca golpeando con un hueso poseído por un espíritu. Puede reducir la Defensa del objetivo." + }, + "accelerock": { + "name": "Roca Veloz", + "effect": "El usuario se lanza contra el objetivo a gran velocidad. Este movimiento tiene prioridad alta." + }, + "liquidation": { + "name": "Hidroariete", + "effect": "Ataca golpeando gracias a la fuerza del agua. También puede reducir la Defensa del objetivo." + }, + "prismaticLaser": { + "name": "Láser Prisma", + "effect": "El usuario utiliza un prisma para emitir un rayo de gran potencia, pero deberá descansar en el siguiente turno." + }, + "spectralThief": { + "name": "Robasombra", + "effect": "El usuario se esconde en la sombra del objetivo y lo ataca tras robarle las mejoras en sus características." + }, + "sunsteelStrike": { + "name": "Meteoimpacto", + "effect": "Ataca al objetivo con la potencia de un meteoro, ignorando su habilidad." + }, + "moongeistBeam": { + "name": "Rayo Umbrío", + "effect": "Ataca con un rayo misterioso que ignora la habilidad del objetivo." + }, + "tearfulLook": { + "name": "Ojos Llorosos", + "effect": "Mira al objetivo con ojos llorosos para hacerle perder su espíritu combativo y reduce su Ataque y Ataque Especial." + }, + "zingZap": { + "name": "Electropunzada", + "effect": "Se lanza contra el objetivo y le suelta una potente descarga eléctrica que puede hacer que se amedrente." + }, + "naturesMadness": { + "name": "Furia Natural", + "effect": "Golpea al objetivo con la furia de la naturaleza y reduce sus PS a la mitad." + }, + "multiAttack": { + "name": "Multiataque", + "effect": "El Pokémon se rodea de una potente energía con la que golpea al rival. El tipo del movimiento depende del disco que lleva el usuario." + }, + "tenMillionVoltThunderbolt": { + "name": "Gigarrayo Fulminante", + "effect": "Los Pikachu con gorra acumulan una carga eléctrica descomunal gracias al Poder Z y la lanzan contra el objetivo. Suele ser crítico." + }, + "mindBlown": { + "name": "Cabeza Sorpresa", + "effect": "El usuario hace explotar su cabeza para atacar a los Pokémon adyacentes, aunque también se hiere a sí mismo." + }, + "plasmaFists": { + "name": "Puños Plasma", + "effect": "El usuario ataca con puños cargados de electricidad. Convierte los movimientos de tipo Normal en movimientos de tipo Eléctrico." + }, + "photonGeyser": { + "name": "Géiser Fotónico", + "effect": "El usuario ataca con una gran columna de luz. Compara sus valores de Ataque y Ataque Especial para infligir daño con el más alto de los dos." + }, + "lightThatBurnsTheSky": { + "name": "Fotodestrucción Apocalíptica", + "effect": "Necrozma escoge la característica que tenga el valor más alto entre el Ataque y el Ataque Especial para infligir daño, ignorando la habilidad del objetivo." + }, + "searingSunrazeSmash": { + "name": "Embestida Solar", + "effect": "Solgaleo ataca con toda su fuerza tras imbuirse del Poder Z. Este movimiento ignora la habilidad del objetivo." + }, + "menacingMoonrazeMaelstrom": { + "name": "Deflagración Lunar", + "effect": "Lunala ataca con toda su fuerza tras imbuirse del Poder Z. Este movimiento ignora la habilidad del objetivo." + }, + "letsSnuggleForever": { + "name": "Somanta Amistosa", + "effect": "Mimikyu ataca con toda su fuerza tras imbuirse del Poder Z y asesta una lluvia de golpes." + }, + "splinteredStormshards": { + "name": "Tempestad Rocosa", + "effect": "Lycanroc ataca con toda su fuerza tras imbuirse del Poder Z y neutraliza el campo que esté activo." + }, + "clangorousSoulblaze": { + "name": "Estruendo Implacable", + "effect": "Kommo-o ataca con toda su fuerza al objetivo tras imbuirse del Poder Z. Además, potencia sus propias características." + }, + "zippyZap": { + "name": "Pikaturbo", + "effect": "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness." + }, + "splishySplash": { + "name": "Salpikasurf", + "effect": "Golpea al adversario con una ola gigante electrificada, que también puede paralizarlo." + }, + "floatyFall": { + "name": "Pikapicado", + "effect": "El usuario se suspende en el aire para, a continuación, abalanzarse súbitamente sobre el rival. Puede hacer retroceder al objetivo." + }, + "pikaPapow": { + "name": "Pikatormenta", + "effect": "Lanza una descarga eléctrica infalible que resulta más potente cuanto mayor es el cariño que siente Pikachu hacia su Entrenador." + }, + "bouncyBubble": { + "name": "Vapodrenaje", + "effect": "Ataca lanzando proyectiles de agua y recupera una cantidad de PS equivalente a la del daño causado." + }, + "buzzyBuzz": { + "name": "Joltioparálisis", + "effect": "Lanza una potente descarga eléctrica sobre el rival y lo deja paralizado." + }, + "sizzlySlide": { + "name": "Flarembestida", + "effect": "Tras envolver su cuerpo en llamas, el usuario arrolla con fuerza al rival y le provoca quemaduras." + }, + "glitzyGlow": { + "name": "Espeaura", + "effect": "Envuelve al rival con ondas psíquicas y alza un extraño muro que debilita los ataques especiales del adversario." + }, + "baddyBad": { + "name": "Umbreozona", + "effect": "Lanza un ataque haciendo gala de su faceta más umbría y alza un extraño muro que mitiga los ataques físicos del adversario." + }, + "sappySeed": { + "name": "Leafitobombas", + "effect": "Hace brotar un tallo gigante que bombardea al rival con unas semillas que le drenan PS en cada turno." + }, + "freezyFrost": { + "name": "Glaceoprisma", + "effect": "Ataca al rival con negros cristales de niebla congelada. Revierte los cambios en las características de todos los Pokémon presentes." + }, + "sparklySwirl": { + "name": "Sylveotornado", + "effect": "Ataca al rival envolviéndolo en un remolino de aroma asfixiante. Cura a los aliados de cualquier problema de estado." + }, + "veeveeVolley": { + "name": "Eevimpacto", + "effect": "Un placaje infalible que resulta más potente cuanto mayor es el cariño que siente Eevee hacia su Entrenador." + }, + "doubleIronBash": { + "name": "Ferropuño Doble", + "effect": "Usando la tuerca del pecho como eje, gira sobre sí mismo y golpea con los brazos dos veces seguidas. Puede amedrentar al rival." + }, + "maxGuard": { + "name": "Maxibarrera", + "effect": "Frena todos los ataques, pero puede fallar si se usa repetidamente." + }, + "dynamaxCannon": { + "name": "Cañón Dinamax", + "effect": "El usuario ataca emitiendo un rayo desde su núcleo. Inflinge hasta el doble de daño si el objetivo tiene más niveles de lo normal." + }, + "snipeShot": { + "name": "Disparo Certero", + "effect": "Permite atacar al objetivo seleccionado ignorando las habilidades o movimientos que permiten a un Pokémon centrar la atención sobre sí." + }, + "jawLock": { + "name": "Presa Maxilar", + "effect": "Impide que tanto el atacante como el defensor puedan huir o ser cambiados por otros hasta que uno de ellos se debilite o abandone el terreno de combate." + }, + "stuffCheeks": { + "name": "Atiborramiento", + "effect": "El usuario ingiere la baya que lleva equipada para aumentar mucho su Defensa." + }, + "noRetreat": { + "name": "Bastión Final", + "effect": "El usuario aumenta todas sus características, pero ya no puede huir ni ser cambiado por otro." + }, + "tarShot": { + "name": "Alquitranazo", + "effect": "Cubre al objetivo de un alquitrán pegajoso que reduce su Velocidad y lo vuelve débil contra el fuego." + }, + "magicPowder": { + "name": "Polvo Mágico", + "effect": "Cubre al objetivo con unos polvos mágicos que le hacen adquirir el tipo Psíquico." + }, + "dragonDarts": { + "name": "Dracoflechas", + "effect": "El usuario ataca propulsando a ambos Dreepy. En caso de haber dos adversarios, cada Dreepy golpea a su propio objetivo por separado." + }, + "teatime": { + "name": "Hora del Té", + "effect": "El usuario invita a tomar el té a todos los presentes en el terreno de combate, lo que hace que ingieran las bayas que lleven equipadas." + }, + "octolock": { + "name": "Octopresa", + "effect": "Retiene al objetivo e impide que pueda huir o ser cambiado por otro, a la vez que reduce su Defensa y su Defensa Especial cada turno." + }, + "boltBeak": { + "name": "Electropico", + "effect": "El usuario ensarta al objetivo con su pico cargado de electricidad. Si ataca en primer lugar, la potencia del movimiento se duplica." + }, + "fishiousRend": { + "name": "Branquibocado", + "effect": "El usuario agarra al objetivo con sus duras branquias. En caso de atacar antes que este último, la potencia del movimiento se duplica." + }, + "courtChange": { + "name": "Cambio de Cancha", + "effect": "Extraño poder que intercambia los efectos en el terreno de combate de ambos bandos." + }, + "maxFlare": { + "name": "Maxignición", + "effect": "Ataque de tipo Fuego ejecutado por un Pokémon Dinamax. Hace que se intensifique el efecto del sol durante cinco turnos." + }, + "maxFlutterby": { + "name": "Maxinsecto", + "effect": "Ataque de tipo Bicho ejecutado por un Pokémon Dinamax. Reduce el Ataque Especial del objetivo." + }, + "maxLightning": { + "name": "Maxitormenta", + "effect": "Ataque de tipo Eléctrico ejecutado por un Pokémon Dinamax. Crea un campo eléctrico durante cinco turnos." + }, + "maxStrike": { + "name": "Maxiataque", + "effect": "Ataque de tipo Normal ejecutado por un Pokémon Dinamax. Reduce la Velocidad del objetivo." + }, + "maxKnuckle": { + "name": "Maxipuño", + "effect": "Ataque de tipo Lucha ejecutado por un Pokémon Dinamax. Aumenta el Ataque de tu bando." + }, + "maxPhantasm": { + "name": "Maxiespectro", + "effect": "Ataque de tipo Fantasma ejecutado por un Pokémon Dinamax. Reduce la Defensa del objetivo." + }, + "maxHailstorm": { + "name": "Maxihelada", + "effect": "Ataque de tipo Hielo ejecutado por un Pokémon Dinamax. Crea una tormenta de granizo que dura cinco turnos." + }, + "maxOoze": { + "name": "Maxiácido", + "effect": "Ataque de tipo Veneno ejecutado por un Pokémon Dinamax. Aumenta el Ataque Especial de tu bando." + }, + "maxGeyser": { + "name": "Maxichorro", + "effect": "Ataque de tipo Agua ejecutado por un Pokémon Dinamax. Desata un aguacero que dura cinco turnos." + }, + "maxAirstream": { + "name": "Maxiciclón", + "effect": "Ataque de tipo Volador ejecutado por un Pokémon Dinamax. Aumenta la Velocidad de tu bando." + }, + "maxStarfall": { + "name": "Maxiestela", + "effect": "Ataque de tipo Hada ejecutado por un Pokémon Dinamax. Crea un campo de niebla durante cinco turnos." + }, + "maxWyrmwind": { + "name": "Maxidraco", + "effect": "Ataque de tipo Dragón ejecutado por un Pokémon Dinamax. Reduce el Ataque del objetivo." + }, + "maxMindstorm": { + "name": "Maxionda", + "effect": "Ataque de tipo Psíquico ejecutado por un Pokémon Dinamax. Crea un campo psíquico durante cinco turnos." + }, + "maxRockfall": { + "name": "Maxilito", + "effect": "Ataque de tipo Roca ejecutado por un Pokémon Dinamax. Levanta una tormenta de arena que dura cinco turnos." + }, + "maxQuake": { + "name": "Maxitemblor", + "effect": "Ataque de tipo Tierra ejecutado por un Pokémon Dinamax. Aumenta la Defensa Especial de tu bando." + }, + "maxDarkness": { + "name": "Maxisombra", + "effect": "Ataque de tipo Siniestro ejecutado por un Pokémon Dinamax. Reduce la Defensa Especial del objetivo." + }, + "maxOvergrowth": { + "name": "Maxiflora", + "effect": "Ataque de tipo Planta ejecutado por un Pokémon Dinamax. Crea un campo de hierba durante cinco turnos." + }, + "maxSteelspike": { + "name": "Maximetal", + "effect": "Ataque de tipo Acero ejecutado por un Pokémon Dinamax. Aumenta la Defensa de tu bando." + }, + "clangorousSoul": { + "name": "Estruendo Escama", + "effect": "Utiliza parte de los PS propios para subir sus características." + }, + "bodyPress": { + "name": "Plancha Corporal", + "effect": "El usuario usa el cuerpo para lanzar su ataque e infligir un daño directamente proporcional a su Defensa." + }, + "decorate": { + "name": "Decoración", + "effect": "Aumenta mucho el Ataque y el Ataque Especial del objetivo al decorarlo." + }, + "drumBeating": { + "name": "Batería Asalto", + "effect": "El usuario controla un tocón mediante la percusión y al atacar reduce la Velocidad del objetivo." + }, + "snapTrap": { + "name": "Cepo", + "effect": "Cepo que atrapa al objetivo durante cuatro o cinco turnos y le causa daño mientras se encuentra preso." + }, + "pyroBall": { + "name": "Balón Ígneo", + "effect": "El usuario prende una pequeña piedra para crear una bola de fuego con la que ataca al objetivo. Puede causar quemaduras." + }, + "behemothBlade": { + "name": "Tajo Supremo", + "effect": "El usuario se convierte en una espada gigante para rebanar con vigor al objetivo." + }, + "behemothBash": { + "name": "Embate Supremo", + "effect": "El usuario se convierte en un escudo gigante para golpear con vigor al objetivo." + }, + "auraWheel": { + "name": "Rueda Aural", + "effect": "La energía que acumula en las mejillas le sirve para atacar y aumentar su Velocidad. Este movimiento cambia de tipo según la forma que adopte Morpeko." + }, + "breakingSwipe": { + "name": "Vasto Impacto", + "effect": "El usuario sacude violentamente su enorme cola para golpear al objetivo y reducir su Ataque a la par." + }, + "branchPoke": { + "name": "Punzada Rama", + "effect": "Ataca pinchando al objetivo con una rama afilada." + }, + "overdrive": { + "name": "Amplificador", + "effect": "El usuario rasguea la guitarra o el bajo para generar enormes vibraciones de intensa reverberación con las que ataca al objetivo." + }, + "appleAcid": { + "name": "Ácido Málico", + "effect": "Ataca al objetivo con el fluido corrosivo que desprende una manzana ácida, lo que también reduce la Defensa Especial de este." + }, + "gravApple": { + "name": "Fuerza G", + "effect": "El usuario ataca haciendo caer una manzana desde gran altura. Reduce la Defensa del objetivo." + }, + "spiritBreak": { + "name": "Choque Anímico", + "effect": "El usuario ataca al objetivo con tal ímpetu que acaba minando su moral y, en consecuencia, reduce su Ataque Especial." + }, + "strangeSteam": { + "name": "Cautivapor", + "effect": "Desprende un humo con el que ataca al objetivo, que puede acabar confundido." + }, + "lifeDew": { + "name": "Gota Vital", + "effect": "Vierte un agua misteriosa y balsámica que restaura tanto sus propios PS como los de aquellos aliados presentes en el terreno de combate." + }, + "obstruct": { + "name": "Obstrucción", + "effect": "Frena todos los ataques, pero puede fallar si se usa repetidamente. Reduce mucho la Defensa de quien ejecute un movimiento de contacto contra el usuario." + }, + "falseSurrender": { + "name": "Irreverencia", + "effect": "El usuario finge hacer una reverencia y aprovecha la ocasión para ensartar al objetivo con su cabello alborotado. No falla nunca." + }, + "meteorAssault": { + "name": "Asalto Estelar", + "effect": "El usuario agita violentamente su grueso puerro para atacar, pero el mareo que le provocan las sacudidas le obliga a descansar en el siguiente turno." + }, + "eternabeam": { + "name": "Rayo Infinito", + "effect": "Este es el mayor ataque de Eternatus una vez adquirida su forma original. No puede moverse en el turno siguiente." + }, + "steelBeam": { + "name": "Metaláser", + "effect": "Utiliza el acero de su cuerpo para disparar un potente rayo. El usuario se hiere a sí mismo." + }, + "expandingForce": { + "name": "Vasta Fuerza", + "effect": "El usuario ataca al objetivo con sus poderes psíquicos. Cuando se usa en conjunción con un campo psíquico, aumenta su potencia e inflige daño a todos los rivales." + }, + "steelRoller": { + "name": "Allanador Férreo", + "effect": "El usuario lanza su ataque y destruye el campo activo en el terreno de combate, y falla si no hay ninguno en ese momento." + }, + "scaleShot": { + "name": "Ráfaga Escamas", + "effect": "Lanza escamas al objetivo de dos a cinco veces seguidas. Aumenta la Velocidad del usuario, pero reduce su Defensa." + }, + "meteorBeam": { + "name": "Rayo Meteórico", + "effect": "El usuario dedica el primer turno a aumentar su Ataque Especial acumulando energía cósmica y lanza su ofensiva contra el objetivo en el segundo." + }, + "shellSideArm": { + "name": "Moluscañón", + "effect": "El usuario lanza un ataque físico o especial en función de cuál inflija más daño. Puede envenenar al objetivo." + }, + "mistyExplosion": { + "name": "Bruma Explosiva", + "effect": "El usuario ataca a todos a su alrededor, pero se debilita de inmediato. La potencia del movimiento aumenta si el terreno está cubierto por un campo de niebla." + }, + "grassyGlide": { + "name": "Fitoimpulso", + "effect": "Ataca al objetivo deslizándose sobre el terreno de combate. Este movimiento tiene prioridad alta cuando el terreno está cubierto por un campo de hierba." + }, + "risingVoltage": { + "name": "Alto Voltaje", + "effect": "Ataca con una descarga eléctrica que surge del terreno de combate. La potencia del movimiento se duplica si el rival se ve afectado por un campo eléctrico." + }, + "terrainPulse": { + "name": "Pulso de Campo", + "effect": "El usuario ataca aprovechando la energía del campo activo, que determina tanto el tipo como la potencia del movimiento." + }, + "skitterSmack": { + "name": "Golpe Rastrero", + "effect": "Ataca al objetivo por la espalda de forma subrepticia y, además, reduce su Ataque Especial." + }, + "burningJealousy": { + "name": "Envidia Ardiente", + "effect": "Ataca al objetivo con la energía generada por la envidia y causa quemaduras a los Pokémon cuyas características hayan aumentado en ese turno." + }, + "lashOut": { + "name": "Desahogo", + "effect": "Ataca al rival presa de la rabia. Si el usuario ha sufrido una reducción de características en ese turno, la potencia del movimiento se duplica." + }, + "poltergeist": { + "name": "Poltergeist", + "effect": "El usuario ataca utilizando el objeto que lleva el rival. Si no tiene ninguno equipado, el movimiento falla." + }, + "corrosiveGas": { + "name": "Gas Corrosivo", + "effect": "El usuario libera un gas cáustico que envuelve a todos los que se encuentren alrededor y derrite por completo los objetos que lleven equipados." + }, + "coaching": { + "name": "Motivación", + "effect": "El usuario imparte indicaciones precisas a sus aliados, que ven aumentados su Ataque y su Defensa." + }, + "flipTurn": { + "name": "Viraje", + "effect": "Tras atacar, el usuario da paso a toda prisa a otro Pokémon del equipo." + }, + "tripleAxel": { + "name": "Triple Axel", + "effect": "Propina hasta tres patadas seguidas, la potencia de las cuales aumenta cada vez que acierta." + }, + "dualWingbeat": { + "name": "Ala Bis", + "effect": "Ataca al adversario golpeándolo dos veces con las alas." + }, + "scorchingSands": { + "name": "Arenas Ardientes", + "effect": "Ataca al objetivo arrojándole arena a temperaturas muy elevadas. Puede causar quemaduras." + }, + "jungleHealing": { + "name": "Cura Selvática", + "effect": "Al entrar en plena armonía con la selva, el usuario cura problemas de estado y restaura PS no solo de sí mismo, sino también de los aliados presentes en el terreno." + }, + "wickedBlow": { + "name": "Golpe Oscuro", + "effect": "Golpe devastador que requiere un absoluto dominio de las artes siniestras. Siempre asesta un golpe crítico." + }, + "surgingStrikes": { + "name": "Azote Torrencial", + "effect": "El usuario, dominador absoluto del líquido elemento, golpea hasta tres veces con movimientos fluidos. Siempre asesta un golpe crítico." + }, + "thunderCage": { + "name": "Electrojaula", + "effect": "El objetivo queda atrapado en una jaula electrificada que permanece en el terreno de cuatro a cinco turnos." + }, + "dragonEnergy": { + "name": "Dracoenergía", + "effect": "El usuario convierte su fuerza vital en una energía con la que ataca al objetivo. Cuantos menos PS tenga el usuario, menor será la potencia del movimiento." + }, + "freezingGlare": { + "name": "Mirada Heladora", + "effect": "A través de sus ojos emite poderes psíquicos con los que ataca al objetivo, al que puede llegar a congelar." + }, + "fieryWrath": { + "name": "Furia Candente", + "effect": "El usuario convierte su ira en un aura flamígera para lanzar su ataque. Puede amedrentar al objetivo." + }, + "thunderousKick": { + "name": "Patada Relámpago", + "effect": "El usuario desconcierta al objetivo con movimientos centelleantes y le propina una patada que, además, reduce su Defensa." + }, + "glacialLance": { + "name": "Lanza Glacial", + "effect": "El usuario ataca al objetivo lanzándole un carámbano de hielo envuelto en una ventisca." + }, + "astralBarrage": { + "name": "Orbes Espectro", + "effect": "El usuario ataca al objetivo lanzándole una ingente cantidad de pequeños fantasmas." + }, + "eerieSpell": { + "name": "Conjuro Funesto", + "effect": "El usuario ataca con un poder psíquico de inmensa potencia y elimina 3 PP del último movimiento que haya usado el objetivo." + }, + "direClaw": { + "name": "Garra Nociva", + "effect": "Ataca al objetivo con unas garras letales que pueden envenenarlo, paralizarlo o dormirlo." + }, + "psyshieldBash": { + "name": "Asalto Barrera", + "effect": "El usuario ataca envuelto en una energía psíquica que además aumenta su Defensa." + }, + "powerShift": { + "name": "Cambiapoder", + "effect": "Intercambia su Ataque por su Defensa." + }, + "stoneAxe": { + "name": "Hachazo Pétreo", + "effect": "Ataca con un hacha de piedra y, al hacerlo, se desprenden fragmentos que rodean al objetivo." + }, + "springtideStorm": { + "name": "Ciclón Primavera", + "effect": "Desata una tormenta de amor y odio con la que envuelve y ataca al objetivo. También puede reducir su Ataque." + }, + "mysticalPower": { + "name": "Poder Místico", + "effect": "Ataca desatando un misterioso poder, que también aumenta su Ataque Especial." + }, + "ragingFury": { + "name": "Erupción de Ira", + "effect": "El usuario ataca con unas violentas llamas de dos a tres turnos seguidos y, después, se queda confuso." + }, + "waveCrash": { + "name": "Envite Acuático", + "effect": "El usuario se envuelve en agua y embiste contra el objetivo, pero también se hiere seriamente a sí mismo." + }, + "chloroblast": { + "name": "Clorofiláser", + "effect": "El usuario concentra clorofila y la dispara en forma de rayo, pero también se hiere a sí mismo." + }, + "mountainGale": { + "name": "Viento Carámbano", + "effect": "Ataca con unos carámbanos grandes como icebergs que pueden amedrentar al objetivo." + }, + "victoryDance": { + "name": "Danza Triunfal", + "effect": "Ejecuta una danza frenética que invoca la victoria y aumenta el Ataque, la Defensa y la Velocidad." + }, + "headlongRush": { + "name": "Arremetida", + "effect": "El usuario arremete con todas sus fuerzas, pero se reducen su Defensa y su Defensa Especial." + }, + "barbBarrage": { + "name": "Mil Púas Tóxicas", + "effect": "Dispara un sinfín de púas tóxicas que pueden envenenar al objetivo. La potencia del movimiento se duplica si este ya está envenenado." + }, + "esperWing": { + "name": "Ala Aural", + "effect": "Corta con unas alas imbuidas de aura. Suele asestar un golpe crítico y aumenta la Velocidad del usuario." + }, + "bitterMalice": { + "name": "Rencor Reprimido", + "effect": "Ataca al objetivo sometiéndolo a su frío rencor y reduce su Ataque." + }, + "shelter": { + "name": "Retracción", + "effect": "La piel del usuario se vuelve dura como un escudo de acero, lo que aumenta mucho su Defensa." + }, + "tripleArrows": { + "name": "Triple Flecha", + "effect": "Propina un talonazo y lanza tres flechas. Suele asestar un golpe crítico y puede reducir la Defensa del objetivo o amedrentarlo." + }, + "infernalParade": { + "name": "Marcha Espectral", + "effect": "Lanza innumerables bolas de fuego al objetivo que pueden causar quemaduras. La potencia del movimiento se duplica si este ya sufre un problema de estado." + }, + "ceaselessEdge": { + "name": "Tajo Metralla", + "effect": "Ataca con una espada de conchas y, al hacerlo, se esparcen fragmentos a modo de metralla a los pies del objetivo." + }, + "bleakwindStorm": { + "name": "Vendaval Gélido", + "effect": "Ataca con un viento muy frío que estremece el cuerpo y la mente y que, además, puede reducir la Velocidad del objetivo." + }, + "wildboltStorm": { + "name": "Electormenta", + "effect": "Invoca una tormenta eléctrica que ataca al objetivo con fuertes vientos y relámpagos y puede paralizarlo." + }, + "sandsearStorm": { + "name": "Simún de Arena", + "effect": "Ataca al objetivo envolviéndolo en unas arenas tórridas y un fuerte vendaval que pueden causar quemaduras." + }, + "lunarBlessing": { + "name": "Plegaria Lunar", + "effect": "Dedica una oración a la luna creciente que restaura los PS y cura los problemas de estado del bando del usuario." + }, + "takeHeart": { + "name": "Bálsamo Osado", + "effect": "El usuario se envalentona y se cura de los problemas de estado. Además, aumenta su Ataque Especial y su Defensa Especial." + }, + "gMaxWildfire": { + "name": "Gigallamarada", + "effect": "Ataque de tipo Fuego ejecutado por un Charizard Gigamax. Inflige daño durante cuatro turnos." + }, + "gMaxBefuddle": { + "name": "Gigaestupor", + "effect": "Ataque de tipo Bicho ejecutado por un Butterfree Gigamax. Envenena, paraliza o duerme al objetivo." + }, + "gMaxVoltCrash": { + "name": "Gigatronada", + "effect": "Ataque de tipo Eléctrico ejecutado por un Pikachu Gigamax. Paraliza al objetivo." + }, + "gMaxGoldRush": { + "name": "Gigamonedas", + "effect": "Ataque de tipo Normal ejecutado por un Meowth Gigamax. Confunde al objetivo y aumenta la recompensa recibida tras el combate." + }, + "gMaxChiStrike": { + "name": "Gigapuñición", + "effect": "Ataque de tipo Lucha ejecutado por un Machamp Gigamax. Aumenta las posibilidades de que el usuario y sus aliados asesten un golpe crítico." + }, + "gMaxTerror": { + "name": "Gigaaparición", + "effect": "Ataque de tipo Fantasma ejecutado por un Gengar Gigamax. Impide que el objetivo sea cambiado por otro." + }, + "gMaxResonance": { + "name": "Gigamelodía", + "effect": "Ataque de tipo Hielo ejecutado por un Lapras Gigamax. Reduce el daño recibido durante cinco turnos." + }, + "gMaxCuddle": { + "name": "Gigaternura", + "effect": "Ataque de tipo Normal ejecutado por un Eevee Gigamax. Hace que el objetivo se enamore." + }, + "gMaxReplenish": { + "name": "Gigarreciclaje", + "effect": "Ataque de tipo Normal ejecutado por un Snorlax Gigamax. Restaura las bayas que se hayan consumido." + }, + "gMaxMalodor": { + "name": "Gigapestilencia", + "effect": "Ataque de tipo Veneno ejecutado por un Garbodor Gigamax. Envenena al objetivo." + }, + "gMaxStonesurge": { + "name": "Gigatrampa Rocas", + "effect": "Ataque de tipo Agua ejecutado por un Drednaw Gigamax. Esparce rocas afiladas por el terreno de combate." + }, + "gMaxWindRage": { + "name": "Gigahuracán", + "effect": "Ataque de tipo Volador ejecutado por un Corviknight Gigamax. Es capaz de destruir barreras como las creadas por Pantalla de Luz y Reflejo." + }, + "gMaxStunShock": { + "name": "Gigadescarga", + "effect": "Ataque de tipo Eléctrico ejecutado por un Toxtricity Gigamax. Envenena o paraliza al objetivo." + }, + "gMaxFinale": { + "name": "Gigacolofón", + "effect": "Ataque de tipo Hada ejecutado por un Alcremie Gigamax. Restaura los PS de tu bando." + }, + "gMaxDepletion": { + "name": "Gigadesgaste", + "effect": "Ataque de tipo Dragón ejecutado por un Duraludon Gigamax. Reduce PP del último movimiento usado por el objetivo." + }, + "gMaxGravitas": { + "name": "Gigabóveda", + "effect": "Ataque de tipo Psíquico ejecutado por un Orbeetle Gigamax. Intensifica la fuerza de gravedad durante cinco turnos." + }, + "gMaxVolcalith": { + "name": "Gigarroca Ígnea", + "effect": "Ataque de tipo Roca ejecutado por un Coalossal Gigamax. Inflige daño durante cuatro turnos." + }, + "gMaxSandblast": { + "name": "Gigapolvareda", + "effect": "Ataque de tipo Tierra ejecutado por un Sandaconda Gigamax. Enreda al objetivo en un remolino de arena de cuatro a cinco turnos." + }, + "gMaxSnooze": { + "name": "Gigasopor", + "effect": "Ataque de tipo Siniestro ejecutado por un Grimmsnarl Gigamax. Induce al sueño al objetivo en el siguiente turno." + }, + "gMaxTartness": { + "name": "Gigacorrosión", + "effect": "Ataque de tipo Planta ejecutado por un Flapple Gigamax. Reduce la Evasión del objetivo." + }, + "gMaxSweetness": { + "name": "Giganéctar", + "effect": "Ataque de tipo Planta ejecutado por un Appletun Gigamax. Cura los problemas de estado de tu bando." + }, + "gMaxSmite": { + "name": "Gigacastigo", + "effect": "Ataque de tipo Hada ejecutado por un Hatterene Gigamax. Confunde al objetivo." + }, + "gMaxSteelsurge": { + "name": "Gigatrampa Acero", + "effect": "Ataque de tipo Acero ejecutado por un Copperajah Gigamax. Esparce púas de acero por el terreno de combate." + }, + "gMaxMeltdown": { + "name": "Gigafundido", + "effect": "Ataque de tipo Acero ejecutado por un Melmetal Gigamax. Impide al objetivo usar el mismo movimiento dos veces seguidas." + }, + "gMaxFoamBurst": { + "name": "Gigaespuma", + "effect": "Ataque de tipo Agua ejecutado por un Kingler Gigamax. Reduce mucho la Velocidad del objetivo." + }, + "gMaxCentiferno": { + "name": "Gigacienfuegos", + "effect": "Ataque de tipo Fuego ejecutado por un Centiskorch Gigamax. Un aro de fuego atrapa al objetivo de cuatro a cinco turnos." + }, + "gMaxVineLash": { + "name": "Gigalianas", + "effect": "Ataque de tipo Planta ejecutado por un Venusaur Gigamax. Inflige daño durante cuatro turnos." + }, + "gMaxCannonade": { + "name": "Gigacañonazo", + "effect": "Ataque de tipo Agua ejecutado por un Blastoise Gigamax. Inflige daño durante cuatro turnos." + }, + "gMaxDrumSolo": { + "name": "Gigarredoble", + "effect": "Ataque de tipo Planta ejecutado por un Rillaboom Gigamax. Ignora la habilidad del objetivo." + }, + "gMaxFireball": { + "name": "Gigaesfera Ígnea", + "effect": "Ataque de tipo Fuego ejecutado por un Cinderace Gigamax. Ignora la habilidad del objetivo." + }, + "gMaxHydrosnipe": { + "name": "Gigadisparo", + "effect": "Ataque de tipo Agua ejecutado por un Inteleon Gigamax. Ignora la habilidad del objetivo." + }, + "gMaxOneBlow": { + "name": "Gigagolpe Brusco", + "effect": "Ataque de tipo Siniestro ejecutado por un Urshifu Gigamax. Propina un único golpe que acierta al objetivo aunque haya usado Maxibarrera." + }, + "gMaxRapidFlow": { + "name": "Gigagolpe Fluido", + "effect": "Ataque de tipo Agua ejecutado por un Urshifu Gigamax. Propina golpes sucesivos que aciertan al objetivo aunque haya usado Maxibarrera." + }, + "teraBlast": { + "name": "Teraexplosión", + "effect": "Si el usuario se ha teracristalizado, ataca con la energía de su teratipo. Compara sus valores de Ataque y Ataque Especial para infligir daño con el más alto de los dos." + }, + "silkTrap": { + "name": "Telatrampa", + "effect": "Tiende una trampa sedosa que protege al usuario de los ataques al tiempo que reduce la Velocidad de cualquier Pokémon con el que entre en contacto." + }, + "axeKick": { + "name": "Patada Hacha", + "effect": "Lanza una patada al aire para, acto seguido, golpear con el talón. Si falla, se hiere a sí mismo. Puede confundir al objetivo." + }, + "lastRespects": { + "name": "Homenaje Póstumo", + "effect": "Ataca para vengar a sus compañeros caídos y aplacar su desazón. Cuantos más miembros del equipo se hayan debilitado, mayor será la potencia del movimiento." + }, + "luminaCrash": { + "name": "Fotocolisión", + "effect": "Ataca proyectando una extraña luz que afecta a la mente. Reduce mucho la Defensa Especial del objetivo." + }, + "orderUp": { + "name": "Oído Cocina", + "effect": "Ataca con porte gallardo. Si lleva un Tatsugiri en la boca, aumenta una de sus características en función de la forma de este último." + }, + "jetPunch": { + "name": "Puño Jet", + "effect": "Se envuelve el puño con un torrente y propina un golpe a tal velocidad que resulta casi imperceptible. Este movimiento tiene prioridad alta." + }, + "spicyExtract": { + "name": "Extracto Picante", + "effect": "Libera un extracto extraordinariamente picante que aumenta mucho el Ataque del objetivo, pero también reduce mucho su Defensa." + }, + "spinOut": { + "name": "Quemarrueda", + "effect": "Inflige daño al objetivo ejerciendo presión sobre sus extremidades y girando violentamente sobre sí. Reduce mucho la Velocidad del usuario." + }, + "populationBomb": { + "name": "Proliferación", + "effect": "Los congéneres del usuario se agrupan y ejecutan un ataque conjunto que golpea al objetivo de una a diez veces seguidas." + }, + "iceSpinner": { + "name": "Pirueta Helada", + "effect": "Se recubre las extremidades con una fina capa de hielo y se abalanza sobre el objetivo girando sobre sí. Destruye el campo activo en el terreno de combate." + }, + "glaiveRush": { + "name": "Asalto Espadón", + "effect": "Embiste de forma temeraria con todo el cuerpo. Los ataques que reciba antes de su siguiente turno no fallarán y causarán el doble de daño." + }, + "revivalBlessing": { + "name": "Plegaria Vital", + "effect": "Pronuncia una benévola oración que revive a un Pokémon del equipo que se haya debilitado y restaura la mitad de sus PS máximos." + }, + "saltCure": { + "name": "Salazón", + "effect": "Deja en salazón al objetivo, que pierde PS cada turno. Afecta especialmente a Pokémon de tipo Acero y tipo Agua." + }, + "tripleDive": { + "name": "Triple Inmersión", + "effect": "Ejecuta una inmersión triple en perfecta sincronía que golpea al objetivo con salpicaduras de agua tres veces seguidas." + }, + "mortalSpin": { + "name": "Giro Mortífero", + "effect": "Ataque giratorio que envenena al objetivo y anula los efectos de movimientos como Atadura, Constricción y Drenadoras." + }, + "doodle": { + "name": "Decalcomanía", + "effect": "Calca la esencia misma del objetivo para atribuir su habilidad a sí mismo y a sus aliados." + }, + "filletAway": { + "name": "Deslome", + "effect": "Aumenta mucho el Ataque, el Ataque Especial y la Velocidad del usuario a costa de parte de sus PS." + }, + "kowtowCleave": { + "name": "Genufendiente", + "effect": "Se postra en ademán de reverencia para hacer que el objetivo baje la guardia y aprovecha el descuido para atacar. No falla nunca." + }, + "flowerTrick": { + "name": "Truco Floral", + "effect": "Ataca al objetivo lanzándole un ramo de flores trucado. No falla nunca y siempre asesta un golpe crítico." + }, + "torchSong": { + "name": "Canto Ardiente", + "effect": "Expele tórridas llamaradas como si entonara una canción y abrasa al objetivo con ellas. Aumenta el Ataque Especial del usuario." + }, + "aquaStep": { + "name": "Danza Acuática", + "effect": "Juguetea con el objetivo mientras ejecuta una elegante y fluida danza y le inflige daño. Aumenta la Velocidad del usuario." + }, + "ragingBull": { + "name": "Furia Taurina", + "effect": "Embiste con tremenda fiereza. Este movimiento cambia de tipo en función de la variedad del usuario y es capaz de destruir barreras como Pantalla de Luz y Reflejo." + }, + "makeItRain": { + "name": "Fiebre Dorada", + "effect": "El usuario ataca arrojando una generosa cantidad de monedas, pero su Ataque Especial se ve reducido. Al finalizar el combate, las recupera en forma de ganancias." + }, + "psyblade": { + "name": "Psicohojas", + "effect": "El usuario rebana al objetivo con una espada inmaterial. Cuando se usa en conjunción con un campo eléctrico, la potencia del movimiento aumenta un 50 %." + }, + "hydroSteam": { + "name": "Hidrovapor", + "effect": "Vierte agua hirviendo sobre el objetivo. Cuando hace sol, la potencia del movimiento aumenta un 50 % en lugar de reducirse." + }, + "ruination": { + "name": "Calamidad", + "effect": "Provoca una catástrofe devastadora que reduce a la mitad los PS del objetivo." + }, + "collisionCourse": { + "name": "Nitrochoque", + "effect": "El usuario choca contra el suelo mientras se transforma y provoca una explosión primigenia. La potencia del movimiento aumenta si el ataque es supereficaz." + }, + "electroDrift": { + "name": "Electroderrape", + "effect": "Se abalanza sobre el objetivo mientras se transforma y lo atraviesa con electricidad futurista. La potencia del movimiento aumenta si el ataque es supereficaz." + }, + "shedTail": { + "name": "Autotomía", + "effect": "El usuario se cambia por otro Pokémon del equipo, pero antes utiliza parte de los PS propios para crear un sustituto para su relevo." + }, + "chillyReception": { + "name": "Fría Acogida", + "effect": "El usuario se cambia por otro Pokémon del equipo, pero antes cuenta un chiste que tiene una acogida tan fría que hace que nieve durante cinco turnos." + }, + "tidyUp": { + "name": "Limpieza General", + "effect": "Efectúa una limpieza a fondo que anula los efectos de Púas, Trampa Rocas, Red Viscosa, Púas Tóxicas y Sustituto. Aumenta el Ataque y la Velocidad del usuario." + }, + "snowscape": { + "name": "Paisaje Nevado", + "effect": "Desata una nevada que dura cinco turnos y aumenta la Defensa de los Pokémon de tipo Hielo." + }, + "pounce": { + "name": "Brinco", + "effect": "Ataca abalanzándose sobre el objetivo y le reduce la Velocidad." + }, + "trailblaze": { + "name": "Abrecaminos", + "effect": "Ataca de pronto como si saltara desde la hierba alta. El usuario se mueve con gran agilidad y aumenta su Velocidad." + }, + "chillingWater": { + "name": "Agua Fría", + "effect": "Ataca al objetivo rociándolo con un agua gélida y desalentadora que reduce su Ataque." + }, + "hyperDrill": { + "name": "Hipertaladro", + "effect": "El usuario hace rotar la parte puntiaguda de su cuerpo a gran velocidad para atacar al objetivo. Pasa por alto los efectos de movimientos como Protección o Detección." + }, + "twinBeam": { + "name": "Láser Doble", + "effect": "Ataca emitiendo dos misteriosos haces lumínicos por los ojos que infligen daño dos veces seguidas." + }, + "rageFist": { + "name": "Puño Furia", + "effect": "Convierte su rabia en energía para atacar. Cuantos más golpes haya recibido el usuario, mayor será la potencia del movimiento." + }, + "armorCannon": { + "name": "Cañón Armadura", + "effect": "Se deshace de su armadura y arroja las partes al objetivo cuales proyectiles ardientes. Reduce la Defensa y la Defensa Especial del usuario." + }, + "bitterBlade": { + "name": "Espada Lamento", + "effect": "Imbuye la punta de su espada con su desazón por el mundo y asesta una estocada llena de rencor. El usuario recupera la mitad de los PS del daño que produce." + }, + "doubleShock": { + "name": "Electropalmas", + "effect": "Libera toda la electricidad de su cuerpo para lanzar un ataque devastador. Tras ejecutar el movimiento, el usuario deja de ser de tipo Eléctrico." + }, + "gigatonHammer": { + "name": "Martillo Colosal", + "effect": "El usuario se ayuda de su propio peso corporal para propinar un golpe con un enorme martillo. Este movimiento no puede usarse dos veces seguidas." + }, + "comeuppance": { + "name": "Resarcimiento", + "effect": "Devuelve al rival el último ataque recibido, pero con mucha más fuerza." + }, + "aquaCutter": { + "name": "Tajo Acuático", + "effect": "Expele agua a presión con la que corta al objetivo como si de una hoja se tratara. Suele asestar un golpe crítico." + }, + "blazingTorque": { + "name": "Pirochoque", + "effect": "The user revs their blazing engine into the target. This may also leave the target with a burn." + }, + "wickedTorque": { + "name": "Ominochoque", + "effect": "The user revs their engine into the target with malicious intent. This may put the target to sleep." + }, + "noxiousTorque": { + "name": "Ponzochoque", + "effect": "The user revs their poisonous engine into the target. This may also poison the target." + }, + "combatTorque": { + "name": "Pugnachoque", + "effect": "The user revs their engine forcefully into the target. This may also leave the target with paralysis." + }, + "magicalTorque": { + "name": "Feerichoque", + "effect": "The user revs their fae-like engine into the target. This may also confuse the target." + }, + "bloodMoon": { + "name": "Luna Roja", + "effect": "Ataca canalizando toda su fuerza y proyectándola a través de una luna llena de color rojo intenso. Este movimiento no puede usarse dos veces seguidas." + }, + "matchaGotcha": { + "name": "Cañón Batidor", + "effect": "Rocía al objetivo con té recién batido y recupera la mitad de los PS del daño que produce. Puede causar quemaduras." + }, + "syrupBomb": { + "name": "Bomba Caramelo", + "effect": "Impregna al objetivo con una explosión de su viscoso néctar y lo carameliza, lo que hace que su Velocidad se reduzca progresivamente durante tres turnos." + }, + "ivyCudgel": { + "name": "Garrote Liana", + "effect": "Golpea con un garrote que forma enrollando su liana. El tipo del movimiento varía según la máscara que lleve puesta el usuario. Suele asestar un golpe crítico." + }, + "electroShot": { + "name": "Electrorrayo", + "effect": "Acumula electricidad y aumenta su Ataque Especial en el primer turno y dispara una descarga de alto voltaje en el segundo. Si llueve, puede atacar en el primer turno." + }, + "teraStarstorm": { + "name": "Teraclúster", + "effect": "Ataca al objetivo irradiando el poder de sus cristales. Si Terapagos usa este movimiento en su Forma Astral, inflige daño a todos los rivales." + }, + "fickleBeam": { + "name": "Láser Veleidoso", + "effect": "Ataca disparando un haz de luz. En ocasiones, el resto de sus cabezas se unen al ataque. Cuando esto sucede, la potencia del movimiento se duplica." + }, + "burningBulwark": { + "name": "Llama Protectora", + "effect": "Emplea su ardiente pelaje para protegerse de los ataques y causarle quemaduras al atacante si este usa un movimiento de contacto." + }, + "thunderclap": { + "name": "Relámpago Súbito", + "effect": "Invoca un rayo que cae sobre el objetivo antes de que este pueda realizar cualquier acción. Falla si el objetivo no está preparando ningún ataque." + }, + "mightyCleave": { + "name": "Filo Potente", + "effect": "Rebana al objetivo con la luz que ha acumulado en la testa. Permite acertar aunque el objetivo esté protegiéndose." + }, + "tachyonCutter": { + "name": "Tajo Taquión", + "effect": "Lanza una ráfaga de cuchillas formadas por partículas contra el objetivo y le inflige daño dos veces seguidas. No falla nunca." + }, + "hardPress": { + "name": "Prensa Metálica", + "effect": "Oprime con los brazos o las pinzas. Cuantos más PS le queden al objetivo, mayor será la potencia del movimiento." + }, + "dragonCheer": { + "name": "Bramido Dragón", + "effect": "Bramido de dragón que sube la moral de los aliados y aumenta sus probabilidades de asestar un golpe crítico. Es especialmente efectivo con aliados de tipo Dragón." + }, + "alluringVoice": { + "name": "Canto Encantador", + "effect": "Ataca con un canto angelical y, si las características del objetivo han aumentado en ese turno, lo deja confuso." + }, + "temperFlare": { + "name": "Cólera Ardiente", + "effect": "Arremete contra el objetivo tras dejarse llevar por la ira. Su potencia se duplica si el movimiento del usuario falló en el turno anterior." + }, + "supercellSlam": { + "name": "Plancha Voltaica", + "effect": "El usuario electrifica su cuerpo y salta en plancha sobre el objetivo. Si falla, se hiere a sí mismo." + }, + "psychicNoise": { + "name": "Psicorruido", + "effect": "Ataca emitiendo una onda sonora desagradable que impide al objetivo usar movimientos, habilidades y objetos equipados que recuperan PS durante dos turnos." + }, + "upperHand": { + "name": "Palma Rauda", + "effect": "Se anticipa al objetivo golpeándolo rápidamente con la palma y lo amedrenta. Falla si el objetivo no está preparando un movimiento de prioridad alta." + }, + "malignantChain": { + "name": "Cadena Virulenta", + "effect": "Apresa al objetivo con una cadena hecha de ponzoña que le inocula toxinas para minarle las fuerzas. Puede envenenar gravemente." + } +} diff --git a/src/locales/es/move.ts b/src/locales/es/move.ts deleted file mode 100644 index 3693e008574..00000000000 --- a/src/locales/es/move.ts +++ /dev/null @@ -1,3812 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -export const move: MoveTranslationEntries = { - pound: { - name: "Destructor", - effect: "Golpea al objetivo con las extremidades, la cola o similares.", - }, - karateChop: { - name: "Golpe Kárate", - effect: "Da un golpe cortante. Suele ser crítico.", - }, - doubleSlap: { - name: "Doble Bofetón", - effect: "Abofetea de dos a cinco veces seguidas.", - }, - cometPunch: { - name: "Puño Cometa", - effect: "Pega de dos a cinco veces seguidas.", - }, - megaPunch: { - name: "Megapuño", - effect: "Un puñetazo de gran potencia.", - }, - payDay: { - name: "Día de Pago", - effect: "Arroja monedas al objetivo y las recupera al final del combate.", - }, - firePunch: { - name: "Puño Fuego", - effect: "Puñetazo ardiente que puede causar quemaduras.", - }, - icePunch: { - name: "Puño Hielo", - effect: "Puñetazo helado que puede llegar a congelar.", - }, - thunderPunch: { - name: "Puño Trueno", - effect: "Puñetazo eléctrico que puede paralizar al adversario.", - }, - scratch: { - name: "Arañazo", - effect: "Araña con afiladas garras.", - }, - viseGrip: { - name: "Agarre", - effect: "Atenaza al objetivo y le inflige daño.", - }, - guillotine: { - name: "Guillotina", - effect: "Ataque cortante que debilita al oponente de un golpe si acierta.", - }, - razorWind: { - name: "Viento Cortante", - effect: "Primero se prepara y en el segundo turno ataca al oponente con ráfagas de viento cortante. Alta probabilidad de ser crítico.", - }, - swordsDance: { - name: "Danza Espada", - effect: "Baile frenético que aumenta mucho el Ataque.", - }, - cut: { - name: "Corte", - effect: "Corta al adversario con garras, guadañas, etc.", - }, - gust: { - name: "Tornado", - effect: "Crea un tornado con las alas y lo lanza contra el objetivo.", - }, - wingAttack: { - name: "Ataque Ala", - effect: "Extiende totalmente sus majestuosas alas para golpear al objetivo con ellas.", - }, - whirlwind: { - name: "Remolino", - effect: "Se lleva al objetivo, que es cambiado por otro Pokémon. Si es un Pokémon salvaje, acaba el combate.", - }, - fly: { - name: "Vuelo", - effect: "El usuario vuela en el primer turno y ataca en el segundo.", - }, - bind: { - name: "Atadura", - effect: "Ata y oprime de cuatro a cinco turnos.", - }, - slam: { - name: "Atizar", - effect: "Golpea con la cola o con lianas, por ejemplo, para causar daño al objetivo.", - }, - vineWhip: { - name: "Látigo Cepa", - effect: "Azota al objetivo con lianas delgadas y largas tan flexibles como látigos.", - }, - stomp: { - name: "Pisotón", - effect: "Tremendo pisotón que puede hacer que el objetivo se amedrente.", - }, - doubleKick: { - name: "Doble Patada", - effect: "Una patada doble. Golpea dos veces.", - }, - megaKick: { - name: "Megapatada", - effect: "Patada de extrema fuerza.", - }, - jumpKick: { - name: "Patada Salto", - effect: "Da un salto y pega una patada. Si falla, se lesiona.", - }, - rollingKick: { - name: "Patada Giro", - effect: "Da una patada rápida y circular. Puede hacer retroceder al objetivo.", - }, - sandAttack: { - name: "Ataque Arena", - effect: "Arroja arena a la cara y baja la Precisión.", - }, - headbutt: { - name: "Golpe Cabeza", - effect: "Potente cabezazo que puede amedrentar al objetivo.", - }, - hornAttack: { - name: "Cornada", - effect: "Ataca al objetivo con una cornada punzante.", - }, - furyAttack: { - name: "Ataque Furia", - effect: "Cornea al objetivo de dos a cinco veces.", - }, - hornDrill: { - name: "Perforador", - effect: "Ataque con un cuerno giratorio que fulmina al objetivo de un solo golpe si acierta.", - }, - tackle: { - name: "Placaje", - effect: "Embestida con todo el cuerpo.", - }, - bodySlam: { - name: "Golpe Cuerpo", - effect: "Salta sobre el objetivo con todo su peso y puede llegar a paralizarlo.", - }, - wrap: { - name: "Constricción", - effect: "Oprime al objetivo de cuatro a cinco turnos con lianas o con su cuerpo.", - }, - takeDown: { - name: "Derribo", - effect: "Carga desmedida que también hiere al agresor.", - }, - thrash: { - name: "Saña", - effect: "El usuario ataca enfurecido durante dos o tres turnos y, después, se queda confuso.", - }, - doubleEdge: { - name: "Doble Filo", - effect: "Ataque arriesgado que también hiere al agresor.", - }, - tailWhip: { - name: "Látigo", - effect: "Agita la cola para bajar la Defensa del equipo rival.", - }, - poisonSting: { - name: "Picotazo Veneno", - effect: "Lanza un aguijón tóxico que puede envenenar al objetivo.", - }, - twineedle: { - name: "Doble Ataque", - effect: "Pincha dos veces con dos espinas. Puede envenenar.", - }, - pinMissile: { - name: "Pin Misil", - effect: "Lanza finas púas que hieren de dos a cinco veces.", - }, - leer: { - name: "Malicioso", - effect: "Intimida a los rivales para bajar su Defensa.", - }, - bite: { - name: "Mordisco", - effect: "Un voraz bocado con dientes afilados que puede amedrentar al objetivo.", - }, - growl: { - name: "Gruñido", - effect: "Dulce gruñido que distrae al objetivo para que baje la guardia y reduce su Ataque.", - }, - roar: { - name: "Rugido", - effect: "Se lleva al objetivo, que es cambiado por otro Pokémon. Si es un Pokémon salvaje, acaba el combate.", - }, - sing: { - name: "Canto", - effect: "Cancioncilla que hace dormir profundamente al objetivo.", - }, - supersonic: { - name: "Supersónico", - effect: "El cuerpo del usuario emite unas ondas sónicas raras que confunden al objetivo.", - }, - sonicBoom: { - name: "Bomba Sónica", - effect: "Lanza ondas de choque que restan 20 PS al objetivo.", - }, - disable: { - name: "Anulación", - effect: "Desactiva el último movimiento del objetivo durante cuatro turnos.", - }, - acid: { - name: "Ácido", - effect: "Rocía al objetivo con un ácido corrosivo. Puede reducir la Defensa Especial.", - }, - ember: { - name: "Ascuas", - effect: "Ataca con llamas pequeñas que pueden causar quemaduras.", - }, - flamethrower: { - name: "Lanzallamas", - effect: "Ataca con una gran ráfaga de fuego que puede causar quemaduras.", - }, - mist: { - name: "Neblina", - effect: "Rodea de una niebla blanquecina al bando del usuario e impide que el rival reduzca sus características durante cinco turnos.", - }, - waterGun: { - name: "Pistola Agua", - effect: "Ataca disparando agua con gran potencia.", - }, - hydroPump: { - name: "Hidrobomba", - effect: "Lanza una gran masa de agua a presión para atacar.", - }, - surf: { - name: "Surf", - effect: "Inunda el terreno de combate con una ola gigante que golpea a los Pokémon adyacentes.", - }, - iceBeam: { - name: "Rayo Hielo", - effect: "Rayo de hielo que puede llegar a congelar.", - }, - blizzard: { - name: "Ventisca", - effect: "Tormenta de hielo que puede llegar a congelar.", - }, - psybeam: { - name: "Psicorrayo", - effect: "Extraño rayo que puede causar confusión.", - }, - bubbleBeam: { - name: "Rayo Burbuja", - effect: "Ráfaga de burbujas que puede reducir la Velocidad.", - }, - auroraBeam: { - name: "Rayo Aurora", - effect: "Rayo multicolor que puede reducir el Ataque.", - }, - hyperBeam: { - name: "Hiperrayo", - effect: "El usuario ataca al objetivo con un potente haz de luz, pero deberá descansar en el siguiente turno.", - }, - peck: { - name: "Picotazo", - effect: "Ensarta al objetivo con un cuerno o pico punzante.", - }, - drillPeck: { - name: "Pico Taladro", - effect: "Picotazo giratorio y perforador muy potente.", - }, - submission: { - name: "Sumisión", - effect: "El usuario se lanza al suelo con el oponente en brazos y también se hace un poco de daño.", - }, - lowKick: { - name: "Patada Baja", - effect: "Patada baja que derriba al objetivo. Cuanto más pesa este, más daño le causa.", - }, - counter: { - name: "Contraataque", - effect: "Devuelve un golpe físico por duplicado.", - }, - seismicToss: { - name: "Sísmico", - effect: "Aprovecha la gravedad para derribar al objetivo. Le resta tantos PS como nivel tenga el usuario.", - }, - strength: { - name: "Fuerza", - effect: "Ataca al objetivo golpeándolo con todas sus fuerzas.", - }, - absorb: { - name: "Absorber", - effect: "Un ataque que absorbe nutrientes. Quien lo usa recupera la mitad de los PS del daño que produce.", - }, - megaDrain: { - name: "Megaagotar", - effect: "Un ataque que absorbe nutrientes. Quien lo usa recupera la mitad de los PS del daño que produce.", - }, - leechSeed: { - name: "Drenadoras", - effect: "Planta semillas que absorben PS del objetivo en cada turno y que le sirven para recuperarse.", - }, - growth: { - name: "Desarrollo", - effect: "Hace que su cuerpo crezca a marchas forzadas con lo que aumenta su Ataque y Ataque Especial.", - }, - razorLeaf: { - name: "Hoja Afilada", - effect: "Corta con hojas afiladas. Un ataque que suele ser crítico.", - }, - solarBeam: { - name: "Rayo Solar", - effect: "El usuario absorbe luz en el primer turno y en el segundo lanza un potente rayo de energía.", - }, - poisonPowder: { - name: "Polvo Veneno", - effect: "Esparce polvo tóxico que envenena al objetivo.", - }, - stunSpore: { - name: "Paralizador", - effect: "Esparce polvo que paraliza al objetivo.", - }, - sleepPowder: { - name: "Somnífero", - effect: "Esparce polvo que duerme al objetivo.", - }, - petalDance: { - name: "Danza Pétalo", - effect: "Ataca al objetivo lanzando pétalos de dos a tres turnos y, al finalizar, el usuario se queda confuso.", - }, - stringShot: { - name: "Disparo Demora", - effect: "Lanza seda a los rivales y reduce mucho su Velocidad.", - }, - dragonRage: { - name: "Furia Dragón", - effect: "Ráfaga de furiosas ondas de choque que quitan 40 PS.", - }, - fireSpin: { - name: "Giro Fuego", - effect: "Un aro de fuego que atrapa al objetivo de cuatro a cinco turnos.", - }, - thunderShock: { - name: "Impactrueno", - effect: "Ataque eléctrico que puede paralizar al objetivo.", - }, - thunderbolt: { - name: "Rayo", - effect: "Potente ataque eléctrico que puede paralizar al objetivo.", - }, - thunderWave: { - name: "Onda Trueno", - effect: "Una ligera descarga que paraliza al objetivo.", - }, - thunder: { - name: "Trueno", - effect: "Un poderoso rayo que daña al objetivo y puede paralizarlo.", - }, - rockThrow: { - name: "Lanzarrocas", - effect: "Tira una pequeña roca al objetivo.", - }, - earthquake: { - name: "Terremoto", - effect: "Un terremoto que afecta a los Pokémon adyacentes.", - }, - fissure: { - name: "Fisura", - effect: "Abre una grieta en el suelo y mete al objetivo en ella. Fulmina al objetivo de un solo golpe si acierta.", - }, - dig: { - name: "Excavar", - effect: "El usuario cava durante el primer turno y ataca en el segundo.", - }, - toxic: { - name: "Tóxico", - effect: "Envenena gravemente al objetivo y causa un daño mayor en cada turno.", - }, - confusion: { - name: "Confusión", - effect: "Débil ataque telequinético que puede causar confusión.", - }, - psychic: { - name: "Psíquico", - effect: "Fuerte ataque telequinético que puede bajar la Defensa Especial del objetivo.", - }, - hypnosis: { - name: "Hipnosis", - effect: "Ataque hipnótico que hace dormir profundamente al objetivo.", - }, - meditate: { - name: "Meditación", - effect: "El usuario reposa y medita para potenciar el Ataque.", - }, - agility: { - name: "Agilidad", - effect: "Relaja el cuerpo para ganar mucha Velocidad.", - }, - quickAttack: { - name: "Ataque Rápido", - effect: "Ataque de una rapidez espeluznante. Este movimiento tiene prioridad alta.", - }, - rage: { - name: "Furia", - effect: "Al usarse, aumenta el Ataque del usuario cada vez que es golpeado.", - }, - teleport: { - name: "Teletransporte", - effect: "Permite al usuario cambiarse por otro Pokémon del equipo, si lo hay. Si un Pokémon salvaje usa este movimiento, huye del combate.", - }, - nightShade: { - name: "Tinieblas", - effect: "Produce un espejismo ante el objetivo, que pierde tantos PS como nivel tenga el usuario.", - }, - mimic: { - name: "Mimético", - effect: "Copia el último movimiento usado por el objetivo, y puede utilizarlo mientras esté en el combate.", - }, - screech: { - name: "Chirrido", - effect: "Alarido agudo que reduce mucho la Defensa del objetivo.", - }, - doubleTeam: { - name: "Doble Equipo", - effect: "Crea copias de sí mismo para mejorar la Evasión.", - }, - recover: { - name: "Recuperación", - effect: "Restaura hasta la mitad de los PS máximos.", - }, - harden: { - name: "Fortaleza", - effect: "Tensa la musculatura del usuario para aumentar la Defensa.", - }, - minimize: { - name: "Reducción", - effect: "El usuario mengua para aumentar mucho la Evasión.", - }, - smokescreen: { - name: "Pantalla de Humo", - effect: "Reduce la Precisión del objetivo con una nube de humo o tinta.", - }, - confuseRay: { - name: "Rayo Confuso", - effect: "Rayo siniestro que confunde al objetivo.", - }, - withdraw: { - name: "Refugio", - effect: "El usuario se resguarda en su coraza, por lo que le sube la Defensa.", - }, - defenseCurl: { - name: "Rizo Defensa", - effect: "Se enrosca para ocultar sus puntos débiles y aumentar la Defensa.", - }, - barrier: { - name: "Barrera", - effect: "Crea una barrera que aumenta mucho la Defensa.", - }, - lightScreen: { - name: "Pantalla de Luz", - effect: "Pared de luz que reduce durante cinco turnos el daño producido por los ataques especiales.", - }, - haze: { - name: "Niebla", - effect: "Neblina oscura que elimina los cambios en las características de todos los Pokémon en combate.", - }, - reflect: { - name: "Reflejo", - effect: "Pared de luz que reduce durante cinco turnos el daño producido por los ataques físicos.", - }, - focusEnergy: { - name: "Foco Energía", - effect: "Concentra energía para aumentar las posibilidades de asestar un golpe crítico.", - }, - bide: { - name: "Venganza", - effect: "Espera dos turnos para atacar con el doble de potencia del daño recibido.", - }, - metronome: { - name: "Metrónomo", - effect: "Mueve un dedo y estimula su cerebro para usar al azar casi cualquier movimiento.", - }, - mirrorMove: { - name: "Espejo", - effect: "Ataca al objetivo con el último movimiento que este haya usado.", - }, - selfDestruct: { - name: "Autodestrucción", - effect: "El atacante explota y hiere a los Pokémon adyacentes. El usuario se debilita de inmediato.", - }, - eggBomb: { - name: "Bomba Huevo", - effect: "Arroja un huevo enorme al objetivo con gran fuerza.", - }, - lick: { - name: "Lengüetazo", - effect: "Una lengua ataca al objetivo. Puede causar parálisis.", - }, - smog: { - name: "Polución", - effect: "Lanza un ataque con gases tóxicos que pueden llegar a envenenar.", - }, - sludge: { - name: "Residuos", - effect: "Arroja residuos al objetivo. Puede llegar a envenenar.", - }, - boneClub: { - name: "Hueso Palo", - effect: "Aporrea con un hueso. Puede hacer retroceder al objetivo.", - }, - fireBlast: { - name: "Llamarada", - effect: "Llama intensa que chamusca y puede causar quemaduras.", - }, - waterfall: { - name: "Cascada", - effect: "Embiste con un gran impulso y puede llegar a amedrentar al objetivo.", - }, - clamp: { - name: "Tenaza", - effect: "Atrapa y atenaza con fuerza durante cuatro o cinco turnos.", - }, - swift: { - name: "Meteoros", - effect: "Lanza rayos en forma de estrella que no fallan nunca.", - }, - skullBash: { - name: "Cabezazo", - effect: "El usuario se prepara y sube su Defensa en el primer turno y en el segundo arremete con un cabezazo.", - }, - spikeCannon: { - name: "Clavo Cañón", - effect: "Lanza finas púas que hieren de dos a cinco veces.", - }, - constrict: { - name: "Restricción", - effect: "Ataca con largos tentáculos o zarcillos que pueden bajar la Velocidad.", - }, - amnesia: { - name: "Amnesia", - effect: "El usuario olvida sus preocupaciones y aumenta mucho la Defensa Especial.", - }, - kinesis: { - name: "Kinético", - effect: "Dobla una cuchara para distraer al objetivo y reducir su Precisión.", - }, - softBoiled: { - name: "Ovocuración", - effect: "Restaura la mitad de los PS máximos del usuario.", - }, - highJumpKick: { - name: "Pat. Salto Alta", - effect: "El usuario salta muy alto y da un rodillazo. Si falla, se hará daño.", - }, - glare: { - name: "Deslumbrar", - effect: "Intimida y asusta al objetivo con la mirada para dejarlo paralizado.", - }, - dreamEater: { - name: "Comesueños", - effect: "Restaura al usuario la mitad del daño causado a un objetivo dormido.", - }, - poisonGas: { - name: "Gas Venenoso", - effect: "Lanza una nube de gas tóxico al objetivo. Produce envenenamiento.", - }, - barrage: { - name: "Bombardeo", - effect: "Arroja esferas al objetivo entre dos y cinco veces seguidas.", - }, - leechLife: { - name: "Chupavidas", - effect: "Restaura al usuario la mitad del daño causado al objetivo.", - }, - lovelyKiss: { - name: "Beso Amoroso", - effect: "Intimida al objetivo con una cara que asusta y le da un beso que lo deja dormido.", - }, - skyAttack: { - name: "Ataque Aéreo", - effect: "Ataca durante dos turnos y suele asestar un golpe crítico. También puede amedrentar al objetivo.", - }, - transform: { - name: "Transformación", - effect: "El usuario se transforma en una copia del objetivo, con los mismos movimientos.", - }, - bubble: { - name: "Burbuja", - effect: "Lanza burbujas a los contrincantes y puede reducir su Velocidad.", - }, - dizzyPunch: { - name: "Puño Mareo", - effect: "Rítmicos puñetazos que pueden causar confusión.", - }, - spore: { - name: "Espora", - effect: "Esparce esporas que inducen el sueño.", - }, - flash: { - name: "Destello", - effect: "Luz cegadora que baja la Precisión del objetivo.", - }, - psywave: { - name: "Psicoonda", - effect: "Ataque con una onda de energía de intensidad variable.", - }, - splash: { - name: "Salpicadura", - effect: "No tiene ningún efecto. Solo salpica.", - }, - acidArmor: { - name: "Armadura Ácida", - effect: "Transforma la estructura celular para hacerse líquido y aumenta mucho la Defensa.", - }, - crabhammer: { - name: "Martillazo", - effect: "Golpea con fuerza con una pinza enorme. Suele asestar un golpe crítico.", - }, - explosion: { - name: "Explosión", - effect: "El atacante causa una grandísima explosión y hiere a los Pokémon adyacentes. El usuario se debilita de inmediato.", - }, - furySwipes: { - name: "Golpes Furia", - effect: "Araña rápidamente de dos a cinco veces.", - }, - bonemerang: { - name: "Huesomerang", - effect: "Lanza un hueso a modo de bumerán que golpea dos veces.", - }, - rest: { - name: "Descanso", - effect: "Restaura todos los PS y cura todos los problemas de estado del usuario, que se duerme los dos turnos siguientes.", - }, - rockSlide: { - name: "Avalancha", - effect: "Lanza grandes pedruscos. Puede amedrentar al objetivo.", - }, - hyperFang: { - name: "Hipercolmillo", - effect: "Ataca con agudos colmillos. Puede amedrentar al objetivo.", - }, - sharpen: { - name: "Afilar", - effect: "El perfil del usuario se hace más afilado y su Ataque mejora.", - }, - conversion: { - name: "Conversión", - effect: "Cambia el tipo del usuario por el del primer movimiento en su lista.", - }, - triAttack: { - name: "Triataque", - effect: "Ataque con tres rayos de luz que puede paralizar, quemar o congelar al objetivo.", - }, - superFang: { - name: "Superdiente", - effect: "Asesta una dentellada con sus afilados incisivos que reduce a la mitad los PS del objetivo.", - }, - slash: { - name: "Cuchillada", - effect: "Ataca con cuchillas o con pinzas. Suele asestar un golpe crítico.", - }, - substitute: { - name: "Sustituto", - effect: "Utiliza parte de los PS propios para crear un sustituto que actúa como señuelo.", - }, - struggle: { - name: "Forcejeo", - effect: "Solo se usa como último recurso al acabarse los PP. Hiere un poco al agresor.", - }, - sketch: { - name: "Esquema", - effect: "Aprende de forma permanente el último movimiento utilizado por el objetivo. Es de un solo uso.", - }, - tripleKick: { - name: "Triple Patada", - effect: "Propina hasta tres patadas seguidas, la potencia de las cuales aumenta cada vez que acierta.", - }, - thief: { - name: "Ladrón", - effect: "El usuario ataca y tiene un 30% de robarle el objeto al objetivo.", - }, - spiderWeb: { - name: "Telaraña", - effect: "Enreda al objetivo para evitar que abandone el combate.", - }, - mindReader: { - name: "Telépata", - effect: "El usuario adivina los movimientos del objetivo para hacer que su siguiente ataque no falle.", - }, - nightmare: { - name: "Pesadilla", - effect: "El objetivo dormido sufre una pesadilla que le hace perder PS en cada turno.", - }, - flameWheel: { - name: "Rueda Fuego", - effect: "Ataca envuelto en fuego. Puede causar quemaduras.", - }, - snore: { - name: "Ronquido", - effect: "Fuerte ronquido que solo puede usarse dormido. Puede amedrentar al objetivo.", - }, - curse: { - name: "Maldición", - effect: "Un movimiento que tiene efectos distintos si el usuario es de tipo Fantasma o no.", - }, - flail: { - name: "Azote", - effect: "Ataque frenético. Cuantos menos PS tenga el usuario, más daño producirá.", - }, - conversion2: { - name: "Conversión2", - effect: "El usuario cambia de tipo para hacerse resistente al último tipo de movimiento usado por el objetivo.", - }, - aeroblast: { - name: "Aerochorro", - effect: "Lanza un chorro de aire que suele asestar un golpe crítico.", - }, - cottonSpore: { - name: "Esporagodón", - effect: "Adhiere esporas a los rivales para reducir mucho su Velocidad.", - }, - reversal: { - name: "Inversión", - effect: "Ataque desesperado que causa más daño cuantos menos PS tenga el usuario.", - }, - spite: { - name: "Rencor", - effect: "Da rienda suelta a su rencor para reducir 4 PP del último movimiento usado por el objetivo.", - }, - powderSnow: { - name: "Nieve Polvo", - effect: "Lanza nieve que puede llegar a congelar.", - }, - protect: { - name: "Protección", - effect: "Frena todos los ataques, pero puede fallar si se usa repetidamente.", - }, - machPunch: { - name: "Ultrapuño", - effect: "Puñetazo de velocidad fulminante. Este movimiento tiene prioridad alta.", - }, - scaryFace: { - name: "Cara Susto", - effect: "Asusta al objetivo para reducir mucho su Velocidad.", - }, - feintAttack: { - name: "Finta", - effect: "Engaña al objetivo para acercarse y dar un puñetazo que no falla.", - }, - sweetKiss: { - name: "Beso Dulce", - effect: "Da un beso con tal dulzura que causa confusión.", - }, - bellyDrum: { - name: "Tambor", - effect: "Reduce la mitad de los PS máximos para mejorar al máximo el Ataque.", - }, - sludgeBomb: { - name: "Bomba Lodo", - effect: "Arroja residuos al objetivo. Puede llegar a envenenar.", - }, - mudSlap: { - name: "Bofetón Lodo", - effect: "Echa lodo en la cara del objetivo para infligirle daño y reducir su Precisión.", - }, - octazooka: { - name: "Pulpocañón", - effect: "Dispara tinta a la cara. Puede bajar la Precisión.", - }, - spikes: { - name: "Púas", - effect: "Esparce púas alrededor del equipo rival que hieren a los Pokémon rivales que entran en combate.", - }, - zapCannon: { - name: "Electrocañón", - effect: "Dispara una descarga eléctrica que causa daño y parálisis.", - }, - foresight: { - name: "Profecía", - effect: "Permite atacar con cualquier movimiento a objetivos de tipo Fantasma y golpear a Pokémon evasivos.", - }, - destinyBond: { - name: "Mismo Destino", - effect: "Si el usuario se debilita por un ataque rival antes de usar otro movimiento, el Pokémon rival se debilitará también. Puede fallar si se usa repetidamente.", - }, - perishSong: { - name: "Canto Mortal", - effect: "Si un Pokémon escucha este canto y no es cambiado por otro en tres turnos, acaba debilitándose.", - }, - icyWind: { - name: "Viento Hielo", - effect: "Ataque con aire helado que reduce la Velocidad del objetivo.", - }, - detect: { - name: "Detección", - effect: "Frena todos los ataques, pero puede fallar si se usa repetidamente.", - }, - boneRush: { - name: "Ataque Óseo", - effect: "Hueso en ristre, aporrea al objetivo de dos a cinco veces.", - }, - lockOn: { - name: "Fijar Blanco", - effect: "Fija el blanco para que el siguiente ataque no falle.", - }, - outrage: { - name: "Enfado", - effect: "El usuario ataca enfurecido durante dos o tres turnos y, después, se queda confuso.", - }, - sandstorm: { - name: "Tormenta Arena", - effect: "Tormenta de arena que dura cinco turnos y hiere a todos, excepto a los de tipo Roca, Tierra y Acero, y aumenta la Defensa Especial de los de tipo Roca.", - }, - gigaDrain: { - name: "Gigadrenado", - effect: "Un ataque que absorbe nutrientes. Quien lo usa recupera la mitad de los PS del daño que produce.", - }, - endure: { - name: "Aguante", - effect: "Resiste cualquier ataque y deja al menos 1 PS. Puede fallar si se usa repetidamente.", - }, - charm: { - name: "Encanto", - effect: "Engatusa al objetivo y reduce mucho su Ataque.", - }, - rollout: { - name: "Rodar", - effect: "El atacante rueda contra el objetivo durante cinco turnos, cada vez con mayor fuerza.", - }, - falseSwipe: { - name: "Falso Tortazo", - effect: "Ataque moderado que no debilita al objetivo y le deja al menos 1 PS.", - }, - swagger: { - name: "Contoneo", - effect: "Provoca confusión en el objetivo, pero también sube mucho su Ataque.", - }, - milkDrink: { - name: "Batido", - effect: "Restaura la mitad de los PS máximos del usuario.", - }, - spark: { - name: "Chispa", - effect: "Ataque eléctrico que puede llegar a paralizar.", - }, - furyCutter: { - name: "Corte Furia", - effect: "Ataque con garras o guadaña que crece en intensidad si se usa repetidas veces.", - }, - steelWing: { - name: "Ala de Acero", - effect: "Alas macizas que golpean al objetivo y pueden subir la Defensa del usuario.", - }, - meanLook: { - name: "Mal de Ojo", - effect: "Mal de ojo que impide al objetivo huir del combate o ser cambiado por otro.", - }, - attract: { - name: "Atracción", - effect: "Si el objetivo es del sexo opuesto, se enamorará y bajará la posibilidad de que ataque.", - }, - sleepTalk: { - name: "Sonámbulo", - effect: "Mientras duerme, usa uno de sus movimientos elegido al azar.", - }, - healBell: { - name: "Cascabel Cura", - effect: "Tañido que cura los problemas de estado de todos los Pokémon del equipo.", - }, - return: { - name: "Retribución", - effect: "Cuanto mayor sea la amistad con el Entrenador, más poderoso será este ataque.", - }, - present: { - name: "Presente", - effect: "Quien lo usa ataca al objetivo dándole un regalo con una bomba trampa. Sin embargo, a veces restaura sus PS.", - }, - frustration: { - name: "Frustración", - effect: "Cuanto menor sea la amistad con el Entrenador, más poderoso será este ataque.", - }, - safeguard: { - name: "Velo Sagrado", - effect: "Un poder misterioso que protege de problemas de estado durante cinco turnos.", - }, - painSplit: { - name: "Divide Dolor", - effect: "Suma los PS del usuario a los del objetivo y los reparte a partes iguales.", - }, - sacredFire: { - name: "Fuego Sagrado", - effect: "Fuego místico de gran intensidad que puede causar quemaduras.", - }, - magnitude: { - name: "Magnitud", - effect: "Sacudida sísmica de intensidad variable que afecta a todos los Pokémon a su alrededor.", - }, - dynamicPunch: { - name: "Puño Dinámico", - effect: "Puñetazo con toda la fuerza concentrada. Causa confusión si atina.", - }, - megahorn: { - name: "Megacuerno", - effect: "Ensarta al objetivo con su imponente cuerno o cornamenta.", - }, - dragonBreath: { - name: "Dragoaliento", - effect: "Poderosa ráfaga de aliento que golpea al objetivo y puede paralizarlo.", - }, - batonPass: { - name: "Relevo", - effect: "Cambia el puesto con otro miembro del equipo y le pasa los cambios en las características.", - }, - encore: { - name: "Otra Vez", - effect: "El objetivo repite su último movimiento durante tres turnos.", - }, - pursuit: { - name: "Persecución", - effect: "Hace el doble de daño al objetivo que pide el relevo.", - }, - rapidSpin: { - name: "Giro Rápido", - effect: "Ataque giratorio que puede eliminar movimientos como Atadura, Constricción y Drenadoras. También aumenta la Velocidad del usuario.", - }, - sweetScent: { - name: "Dulce Aroma", - effect: "Un dulce aroma engatusa al objetivo, por lo que se reduce mucho su Evasión.", - }, - ironTail: { - name: "Cola Férrea", - effect: "Ataca con una cola férrea y puede reducir la Defensa del objetivo.", - }, - metalClaw: { - name: "Garra Metal", - effect: "Ataque con garras de acero que puede aumentar el Ataque del usuario.", - }, - vitalThrow: { - name: "Llave Vital", - effect: "El usuario ataca el último, pero no falla.", - }, - morningSun: { - name: "Sol Matinal", - effect: "Restaura PS del usuario. La cantidad varía según el tiempo que haga.", - }, - synthesis: { - name: "Síntesis", - effect: "Restaura PS del usuario. La cantidad varía según el tiempo que haga.", - }, - moonlight: { - name: "Luz Lunar", - effect: "Restaura PS del usuario. La cantidad varía según el tiempo que haga.", - }, - hiddenPower: { - name: "Poder Oculto", - effect: "Movimiento cuyo tipo varía en función del Pokémon que lo usa.", - }, - crossChop: { - name: "Tajo Cruzado", - effect: "Corte doble que suele propinar un golpe crítico.", - }, - twister: { - name: "Ciclón", - effect: "Crea un violento tornado para hacer trizas al objetivo. Puede amedrentarlo.", - }, - rainDance: { - name: "Danza Lluvia", - effect: "Genera una fuerte lluvia que refuerza los movimientos de tipo Agua durante cinco turnos y debilita los de tipo Fuego.", - }, - sunnyDay: { - name: "Día Soleado", - effect: "Hace que se intensifique el efecto del sol durante cinco turnos, lo que potencia los movimientos de tipo Fuego y debilita los de tipo Agua.", - }, - crunch: { - name: "Triturar", - effect: "Tritura con afilados colmillos y puede reducir la Defensa del objetivo.", - }, - mirrorCoat: { - name: "Manto Espejo", - effect: "Responde a un ataque especial ocasionando el doble del daño recibido.", - }, - psychUp: { - name: "Autosugestión", - effect: "El usuario se sume en un trance y copia cualquier cambio que haya en las características de su objetivo.", - }, - extremeSpeed: { - name: "Veloc. Extrema", - effect: "Ataque de una velocidad extrema. Este movimiento tiene prioridad alta.", - }, - ancientPower: { - name: "Poder Pasado", - effect: "Ataque prehistórico que puede subir todas las características.", - }, - shadowBall: { - name: "Bola Sombra", - effect: "Lanza una bola oscura que puede bajar la Defensa Especial del objetivo.", - }, - futureSight: { - name: "Premonición", - effect: "Concentra energía psíquica para golpear al objetivo dos turnos después.", - }, - rockSmash: { - name: "Golpe Roca", - effect: "Propina un gran puñetazo que puede reducir la Defensa del objetivo.", - }, - whirlpool: { - name: "Torbellino", - effect: "Una tromba de agua atrapa al objetivo durante cuatro o cinco turnos.", - }, - beatUp: { - name: "Paliza", - effect: "Ataque de todo el equipo Pokémon. Cuantos más haya, más veces se atacará.", - }, - fakeOut: { - name: "Sorpresa", - effect: "Amedrenta al objetivo con este movimiento de prioridad alta. Solo sirve en el primer turno.", - }, - uproar: { - name: "Alboroto", - effect: "Ataca de forma alborotada durante tres turnos. Mantiene despiertos a todos.", - }, - stockpile: { - name: "Reserva", - effect: "Acumula energía y sube la Defensa y la Defensa Especial. Puede utilizarse hasta tres veces.", - }, - spitUp: { - name: "Escupir", - effect: "Libera de una vez la energía acumulada con Reserva. La potencia del movimiento será proporcional a la cantidad de energía acumulada.", - }, - swallow: { - name: "Tragar", - effect: "Absorbe la energía acumulada con Reserva para recobrar salud. Cuanta más se haya acumulado, mayor será el número de PS que se recuperen.", - }, - heatWave: { - name: "Onda Ígnea", - effect: "Provoca un viento abrasador que puede quemar al objetivo.", - }, - hail: { - name: "Granizo", - effect: "Tormenta de granizo que dura cinco turnos. Hiere a todos los Pokémon excepto a los de tipo Hielo.", - }, - torment: { - name: "Tormento", - effect: "Atormenta y enfurece al objetivo, que no puede usar dos veces seguidas el mismo movimiento.", - }, - flatter: { - name: "Camelo", - effect: "Halaga al objetivo y lo confunde, pero también sube su Ataque Especial.", - }, - willOWisp: { - name: "Fuego Fatuo", - effect: "Siniestras llamas moradas que producen quemaduras.", - }, - memento: { - name: "Legado", - effect: "El usuario se debilita, pero baja mucho tanto el Ataque como el Ataque Especial del objetivo.", - }, - facade: { - name: "Imagen", - effect: "Si el usuario está quemado, paralizado o envenenado, ataca con el doble de potencia.", - }, - focusPunch: { - name: "Puño Certero", - effect: "Se concentra para dar un puñetazo. Falla si se sufre un golpe antes de su uso.", - }, - smellingSalts: { - name: "Estímulo", - effect: "Hace el doble de daño a objetivos paralizados, pero también cura la parálisis.", - }, - followMe: { - name: "Señuelo", - effect: "Llama la atención para concentrar todos los ataques de todos los del equipo rival hacia sí mismo.", - }, - naturePower: { - name: "Adaptación", - effect: "Usa el poder de la naturaleza para atacar. Su efecto varía según el entorno de combate.", - }, - charge: { - name: "Carga", - effect: "Recarga energía para potenciar el siguiente movimiento de tipo Eléctrico. También sube la Defensa Especial.", - }, - taunt: { - name: "Mofa", - effect: "Enfurece al objetivo para que solo use movimientos de ataque durante tres turnos.", - }, - helpingHand: { - name: "Refuerzo", - effect: "El usuario ayuda a un aliado reforzando la potencia de su ataque.", - }, - trick: { - name: "Truco", - effect: "Engaña al objetivo desprevenido e intercambia objetos.", - }, - rolePlay: { - name: "Imitación", - effect: "Imita al objetivo por completo y copia su habilidad.", - }, - wish: { - name: "Deseo", - effect: "Restaura en el siguiente turno la mitad de los PS máximos del usuario o se los pasa al Pokémon que lo sustituye.", - }, - assist: { - name: "Ayuda", - effect: "Usa un movimiento de un miembro del equipo elegido al azar.", - }, - ingrain: { - name: "Arraigo", - effect: "Echa raíces para recuperar PS en cada turno, pero impide el relevo.", - }, - superpower: { - name: "Fuerza Bruta", - effect: "Ataque de gran potencia, pero que reduce el Ataque y la Defensa del agresor.", - }, - magicCoat: { - name: "Capa Mágica", - effect: "Barrera capaz de devolver al agresor movimientos como Drenadoras y otros que alteran el estado o las características.", - }, - recycle: { - name: "Reciclaje", - effect: "Recicla y así recupera un objeto equipado de un solo uso que ya haya sido empleado durante el combate.", - }, - revenge: { - name: "Desquite", - effect: "Ataque que produce el doble de daño si el usuario resulta herido en el mismo turno.", - }, - brickBreak: { - name: "Demolición", - effect: "Potente ataque que también es capaz de destruir barreras como Pantalla de Luz y Reflejo.", - }, - yawn: { - name: "Bostezo", - effect: "Gran bostezo que induce el sueño en el objetivo en el siguiente turno.", - }, - knockOff: { - name: "Desarme", - effect: "Impide al objetivo usar el objeto que lleva durante el combate. La potencia del movimiento se multiplica si el objetivo lleva un objeto.", - }, - endeavor: { - name: "Esfuerzo", - effect: "Reduce los PS del objetivo para que igualen a los del atacante.", - }, - eruption: { - name: "Estallido", - effect: "Furia explosiva. Cuanto menor sea el número de PS del usuario, menos potencia tendrá el movimiento.", - }, - skillSwap: { - name: "Intercambio", - effect: "Usa el poder psíquico para intercambiar habilidades con el objetivo.", - }, - imprison: { - name: "Sellar", - effect: "Impide a los rivales usar movimientos conocidos por el usuario durante el combate.", - }, - refresh: { - name: "Alivio", - effect: "Descansa para curar parálisis, envenenamiento o quemaduras.", - }, - grudge: { - name: "Rabia", - effect: "Si el usuario se debilita al recibir un ataque, todos los PP de este último ataque serán eliminados.", - }, - snatch: { - name: "Robo", - effect: "Roba el efecto de los movimientos de curación o de cambio de características que se usen.", - }, - secretPower: { - name: "Daño Secreto", - effect: "Ataque cuyos efectos secundarios varían según el entorno de combate.", - }, - dive: { - name: "Buceo", - effect: "El usuario se sumerge en el primer turno y ataca en el segundo.", - }, - armThrust: { - name: "Empujón", - effect: "Fuertes empujones que golpean de dos a cinco veces seguidas.", - }, - camouflage: { - name: "Camuflaje", - effect: "Modifica el tipo del Pokémon según el terreno de combate donde esté.", - }, - tailGlow: { - name: "Luminicola", - effect: "Se concentra en una ráfaga de luz que sube muchísimo el Ataque Especial.", - }, - lusterPurge: { - name: "Resplandor", - effect: "Fogonazo de luz que inflige daño al objetivo y puede reducir su Defensa Especial.", - }, - mistBall: { - name: "Bola Neblina", - effect: "Bola de plumas neblinosas que inflige daño al objetivo y puede reducir su Ataque Especial.", - }, - featherDance: { - name: "Danza Pluma", - effect: "Envuelve al objetivo con un manto de plumas para reducir mucho su Ataque.", - }, - teeterDance: { - name: "Danza Caos", - effect: "Danza histérica que confunde a los Pokémon que están alrededor del usuario.", - }, - blazeKick: { - name: "Patada Ígnea", - effect: "Patada que suele ser un golpe crítico y puede causar quemaduras.", - }, - mudSport: { - name: "Chapoteo Lodo", - effect: "El usuario esparce lodo a su alrededor, lo que debilita los movimientos de tipo Eléctrico durante cinco turnos.", - }, - iceBall: { - name: "Bola Hielo", - effect: "El atacante rueda contra el objetivo durante cinco turnos, cada vez con mayor fuerza.", - }, - needleArm: { - name: "Brazo Pincho", - effect: "Pega con brazos de pinchos y puede hacer retroceder al objetivo.", - }, - slackOff: { - name: "Relajo", - effect: "El usuario se relaja y restaura la mitad de sus PS máximos.", - }, - hyperVoice: { - name: "Vozarrón", - effect: "Grito desgarrador que inflige daño al objetivo.", - }, - poisonFang: { - name: "Colmillo Veneno", - effect: "Mordedura con colmillos venenosos que inflige daño al objetivo y puede envenenarlo gravemente.", - }, - crushClaw: { - name: "Garra Brutal", - effect: "Hace trizas al objetivo con garras afiladas y puede reducir su Defensa.", - }, - blastBurn: { - name: "Anillo Ígneo", - effect: "Calcina al objetivo con una explosión de fuego. El usuario deberá descansar en el siguiente turno.", - }, - hydroCannon: { - name: "Hidrocañón", - effect: "Ataca al objetivo con un cañonazo de agua. El usuario deberá descansar en el siguiente turno.", - }, - meteorMash: { - name: "Puño Meteoro", - effect: "Puñetazo que impacta como un meteorito y puede subir el Ataque del agresor.", - }, - astonish: { - name: "Impresionar", - effect: "Lanza un grito tan tremendo que impresiona y puede amedrentar al objetivo.", - }, - weatherBall: { - name: "Meteorobola", - effect: "El tipo y fuerza del ataque varían según el tiempo que haga.", - }, - aromatherapy: { - name: "Aromaterapia", - effect: "Cura todos los problemas de estado del equipo con un suave aroma.", - }, - fakeTears: { - name: "Llanto Falso", - effect: "Lágrimas de cocodrilo que bajan mucho la Defensa Especial del objetivo.", - }, - airCutter: { - name: "Aire Afilado", - effect: "Viento cortante que azota. Suele ser un golpe crítico.", - }, - overheat: { - name: "Sofoco", - effect: "Ataque en toda regla que baja mucho el Ataque Especial de quien lo usa.", - }, - odorSleuth: { - name: "Rastreo", - effect: "Permite atacar con cualquier movimiento a objetivos de tipo Fantasma y golpear a Pokémon evasivos.", - }, - rockTomb: { - name: "Tumba Rocas", - effect: "Tira rocas que detienen al objetivo y bajan su Velocidad.", - }, - silverWind: { - name: "Viento Plata", - effect: "Fuerte viento con polvo de escamas. Puede subir todas las características de quien lo usa.", - }, - metalSound: { - name: "Eco Metálico", - effect: "Horrible chirrido metálico que reduce mucho la Defensa Especial del objetivo.", - }, - grassWhistle: { - name: "Silbato", - effect: "Agradable melodía que adormece al objetivo.", - }, - tickle: { - name: "Cosquillas", - effect: "Hace reír al objetivo para bajar su Ataque y Defensa.", - }, - cosmicPower: { - name: "Masa Cósmica", - effect: "Sube la Defensa y la Defensa Especial propias con energía mística.", - }, - waterSpout: { - name: "Salpicar", - effect: "Chorro de agua. Cuantos menos PS tenga el usuario, menos potencia tendrá el movimiento.", - }, - signalBeam: { - name: "Rayo Señal", - effect: "Ataca con un rayo de luz siniestro. Puede confundir al objetivo.", - }, - shadowPunch: { - name: "Puño Sombra", - effect: "Puñetazo procedente de las sombras que no falla nunca.", - }, - extrasensory: { - name: "Paranormal", - effect: "Emite una energía muy extraña que puede amedrentar al objetivo.", - }, - skyUppercut: { - name: "Gancho Alto", - effect: "Gancho ascendente de gran ímpetu.", - }, - sandTomb: { - name: "Bucle Arena", - effect: "Enreda al objetivo en un remolino de arena de cuatro a cinco turnos.", - }, - sheerCold: { - name: "Frío Polar", - effect: "Debilita al objetivo de un solo golpe. Si lo usa un Pokémon que no sea de tipo Hielo, es difícil que acierte.", - }, - muddyWater: { - name: "Agua Lodosa", - effect: "Ataque con agua lodosa que puede reducir la Precisión del objetivo.", - }, - bulletSeed: { - name: "Semilladora", - effect: "Dispara rápido de dos a cinco ráfagas de semillas de manera consecutiva.", - }, - aerialAce: { - name: "Golpe Aéreo", - effect: "Desconcierta al objetivo con movimientos muy rápidos antes de cercenarlo. No falla nunca.", - }, - icicleSpear: { - name: "Carámbano", - effect: "Ataca lanzando de dos a cinco ráfagas consecutivas de carámbanos.", - }, - ironDefense: { - name: "Defensa Férrea", - effect: "Fortalece el cuerpo como si fuera de hierro y sube mucho la Defensa.", - }, - block: { - name: "Bloqueo", - effect: "Le corta el paso al objetivo para que no pueda escapar.", - }, - howl: { - name: "Aullido", - effect: "Aullido que sube el ánimo y aumenta el Ataque del equipo.", - }, - dragonClaw: { - name: "Garra Dragón", - effect: "Araña al objetivo con garras afiladas.", - }, - frenzyPlant: { - name: "Planta Feroz", - effect: "Golpea con una enorme planta. El usuario deberá descansar en el siguiente turno.", - }, - bulkUp: { - name: "Corpulencia", - effect: "Robustece el cuerpo para subir el Ataque y la Defensa.", - }, - bounce: { - name: "Bote", - effect: "El usuario bota en el primer turno y golpea al objetivo en el segundo y puede llegar a paralizarlo.", - }, - mudShot: { - name: "Disparo Lodo", - effect: "El usuario ataca lanzando una bola de lodo al objetivo que también reduce su Velocidad.", - }, - poisonTail: { - name: "Cola Veneno", - effect: "Puede envenenar y dar un golpe crítico.", - }, - covet: { - name: "Antojo", - effect: "Se acerca con ternura al objetivo y tiene un 30% de posibilidades de robar el objeto que lleve.", - }, - voltTackle: { - name: "Placaje Eléc", - effect: "Quien lo usa electrifica su cuerpo para luego atacar. Se hiere mucho a sí mismo, pero puede paralizar al objetivo.", - }, - magicalLeaf: { - name: "Hoja Mágica", - effect: "Esparce extrañas hojas que persiguen al objetivo. No falla nunca.", - }, - waterSport: { - name: "Hidrochorro", - effect: "El usuario se empapa en agua, lo que debilita los movimientos de tipo Fuego durante cinco turnos.", - }, - calmMind: { - name: "Paz Mental", - effect: "Aumenta la concentración y calma el espíritu para subir el Ataque Especial y la Defensa Especial.", - }, - leafBlade: { - name: "Hoja Aguda", - effect: "Acuchilla con una hoja fina. Suele dar un golpe crítico.", - }, - dragonDance: { - name: "Danza Dragón", - effect: "Danza mística que sube el Ataque y la Velocidad.", - }, - rockBlast: { - name: "Pedrada", - effect: "Lanza pedruscos al objetivo de dos a cinco veces consecutivas.", - }, - shockWave: { - name: "Onda Voltio", - effect: "Ataque eléctrico muy rápido que no falla nunca.", - }, - waterPulse: { - name: "Hidropulso", - effect: "Ataca con una potente onda de agua. Puede confundir al objetivo.", - }, - doomDesire: { - name: "Deseo Oculto", - effect: "Ataca al objetivo con innumerables haces de luz dos turnos después de haber usado el movimiento.", - }, - psychoBoost: { - name: "Psicoataque", - effect: "Ataque en toda regla que baja mucho el Ataque Especial de quien lo usa.", - }, - roost: { - name: "Respiro", - effect: "Aterriza sobre la superficie para descansar. Recupera hasta la mitad del total de sus PS.", - }, - gravity: { - name: "Gravedad", - effect: "Durante cinco turnos, se anulan los movimientos que alzan el vuelo y los Pokémon de tipo Volador o que levitan son vulnerables a movimientos de tipo Tierra.", - }, - miracleEye: { - name: "Gran Ojo", - effect: "Permite atacar con cualquier movimiento a objetivos de tipo Siniestro y golpear a Pokémon evasivos.", - }, - wakeUpSlap: { - name: "Espabila", - effect: "Inflige gran daño a objetivos dormidos. Sin embargo, los bofetones también los despiertan.", - }, - hammerArm: { - name: "Machada", - effect: "Un terrible puño golpea al contrincante, pero la Velocidad del usuario se ve reducida.", - }, - gyroBall: { - name: "Giro Bola", - effect: "Embiste al objetivo con un potente ataque giratorio. Cuanto más lento es el usuario, más daño causa.", - }, - healingWish: { - name: "Deseo Cura", - effect: "El usuario se debilita, pero cura los problemas de estado del Pokémon que lo sustituye y restaura sus PS.", - }, - brine: { - name: "Salmuera", - effect: "Si al objetivo le queda la mitad o menos de sus PS, el ataque será el doble de fuerte.", - }, - naturalGift: { - name: "Don Natural", - effect: "La baya que lleva presta su fuerza para atacar. El tipo de ataque y su fuerza dependen de la baya.", - }, - feint: { - name: "Amago", - effect: "Permite golpear a objetivos que han utilizado movimientos como Protección o Detección y anula sus efectos.", - }, - pluck: { - name: "Picoteo", - effect: "Picotea al objetivo. Si este sostiene una baya, la picotea también y obtiene sus efectos.", - }, - tailwind: { - name: "Viento Afín", - effect: "Crea un fuerte remolino que aumenta la Velocidad de los Pokémon de tu equipo durante cuatro turnos.", - }, - acupressure: { - name: "Acupresión", - effect: "Aplica presión en puntos clave del cuerpo para aumentar mucho una característica al azar.", - }, - metalBurst: { - name: "Represión Metal", - effect: "Devuelve al rival el último ataque recibido, pero con mucha más fuerza.", - }, - uTurn: { - name: "Ida y Vuelta", - effect: "Tras atacar, el usuario da paso a toda prisa a otro Pokémon del equipo.", - }, - closeCombat: { - name: "A Bocajarro", - effect: "Lucha abiertamente contra el objetivo sin protegerse. También reduce la Defensa y la Defensa Especial del usuario.", - }, - payback: { - name: "Vendetta", - effect: "El usuario contraataca con el doble de fuerza si el objetivo usa un movimiento antes.", - }, - assurance: { - name: "Buena Baza", - effect: "Si el objetivo ya ha sufrido daño en ese turno, la fuerza del ataque se duplica.", - }, - embargo: { - name: "Embargo", - effect: "Impide al objetivo usar el objeto que lleva durante cinco turnos. Su Entrenador tampoco puede usar objetos con él.", - }, - fling: { - name: "Lanzamiento", - effect: "El usuario lanza contra el objetivo el objeto que lleva. La potencia del movimiento y su efecto varían según el objeto.", - }, - psychoShift: { - name: "Psicocambio", - effect: "Usa su poder mental para transferir al objetivo sus problemas de estado.", - }, - trumpCard: { - name: "As Oculto", - effect: "Cuantos menos PP tenga el movimiento, mayor será la fuerza para atacar.", - }, - healBlock: { - name: "Anticura", - effect: "Impide al objetivo usar movimientos, habilidades y objetos equipados que recuperan PS durante cinco turnos.", - }, - wringOut: { - name: "Estrujón", - effect: "Estruja con fuerza al objetivo. Cuantos más PS tenga el objetivo, más fuerza tendrá el ataque.", - }, - powerTrick: { - name: "Truco Fuerza", - effect: "El usuario emplea su poder mental para intercambiar su Ataque y su Defensa.", - }, - gastroAcid: { - name: "Bilis", - effect: "El usuario arroja sus jugos biliares al objetivo, lo que anula el efecto de la habilidad en uso.", - }, - luckyChant: { - name: "Conjuro", - effect: "Lanza al cielo un conjuro que protege a todo su equipo de golpes críticos.", - }, - meFirst: { - name: "Yo Primero", - effect: "Se adelanta al movimiento que pretende usar el objetivo y lo lanza antes con más fuerza. Si el usuario es más lento, falla.", - }, - copycat: { - name: "Copión", - effect: "Imita el movimiento usado justo antes. El movimiento falla si no se ha usado aún ninguno.", - }, - powerSwap: { - name: "Cambiafuerza", - effect: "El usuario emplea su poder mental para intercambiar los cambios en el Ataque y el Ataque Especial con el objetivo.", - }, - guardSwap: { - name: "Cambiadefensa", - effect: "El usuario emplea su poder mental para intercambiar los cambios en la Defensa y la Defensa Especial con el objetivo.", - }, - punishment: { - name: "Castigo", - effect: "La fuerza del ataque aumenta cuanto más se ha fortalecido el objetivo con cambios de características.", - }, - lastResort: { - name: "Última Baza", - effect: "Este movimiento solo puede utilizarse tras haber usado al menos una vez todos los demás conocidos por el Pokémon.", - }, - worrySeed: { - name: "Abatidoras", - effect: "Planta una semilla en el objetivo que le causa pesar. Sustituye la habilidad del objetivo por Insomnio y le impide dormirse.", - }, - suckerPunch: { - name: "Golpe Bajo", - effect: "Permite atacar con prioridad. Falla si el objetivo no está preparando ningún ataque.", - }, - toxicSpikes: { - name: "Púas Tóxicas", - effect: "Lanza una trampa de púas tóxicas a los pies del objetivo que envenena a los rivales que entran en combate.", - }, - heartSwap: { - name: "Cambiaalmas", - effect: "Usa la fuerza mental para intercambiar con el objetivo los cambios en las características.", - }, - aquaRing: { - name: "Acua Aro", - effect: "El usuario se cubre con un manto de agua. Recupera algunos PS en cada turno.", - }, - magnetRise: { - name: "Levitón", - effect: "Levita gracias a un campo magnético generado por electricidad durante cinco turnos.", - }, - flareBlitz: { - name: "Envite Ígneo", - effect: "El Pokémon se cubre de llamas y carga contra el objetivo, aunque él también recibe daño. Puede quemar.", - }, - forcePalm: { - name: "Palmeo", - effect: "Ataca al objetivo con una onda de choque y puede llegar a paralizarlo.", - }, - auraSphere: { - name: "Esfera Aural", - effect: "Libera, desde su interior, una inmensa descarga de aura. Es infalible.", - }, - rockPolish: { - name: "Pulimento", - effect: "Reduce la resistencia puliendo su cuerpo. Aumenta mucho la Velocidad.", - }, - poisonJab: { - name: "Puya Nociva", - effect: "Pincha al objetivo con un tentáculo o brazo envenenado. Puede llegar a envenenar al objetivo.", - }, - darkPulse: { - name: "Pulso Umbrío", - effect: "Libera una horrible aura llena de malos pensamientos que puede amedrentar al objetivo.", - }, - nightSlash: { - name: "Tajo Umbrío", - effect: "Ataca al objetivo a la primera oportunidad. Suele ser crítico.", - }, - aquaTail: { - name: "Acua Cola", - effect: "Ataca agitando la cola como si fuera una ola rabiosa en una tormenta devastadora.", - }, - seedBomb: { - name: "Bomba Germen", - effect: "Lanza al objetivo una descarga de semillas explosivas desde arriba.", - }, - airSlash: { - name: "Tajo Aéreo", - effect: "Ataca con un viento afilado que incluso corta el aire. También puede amedrentar al objetivo.", - }, - xScissor: { - name: "Tijera X", - effect: "Cruza las guadañas o las garras para atacar al objetivo como si fueran unas tijeras.", - }, - bugBuzz: { - name: "Zumbido", - effect: "El usuario crea una onda sónica dañina moviendo su cuerpo que también puede disminuir la Defensa Especial del objetivo.", - }, - dragonPulse: { - name: "Pulso Dragón", - effect: "Abre mucho la boca y libera una onda de choque con la que ataca al objetivo.", - }, - dragonRush: { - name: "Carga Dragón", - effect: "Ataca de forma brutal mientras intimida al objetivo. Puede amedrentarlo.", - }, - powerGem: { - name: "Joya de Luz", - effect: "Ataca con un rayo de luz que centellea como si lo formaran miles de joyas.", - }, - drainPunch: { - name: "Puño Drenaje", - effect: "Un golpe que drena energía. El Pokémon recupera la mitad de los PS arrebatados al objetivo.", - }, - vacuumWave: { - name: "Onda Vacío", - effect: "Gira los puños y libera una onda de vacío contra el objetivo. Este movimiento tiene prioridad alta.", - }, - focusBlast: { - name: "Onda Certera", - effect: "Agudiza la concentración mental y libera su poder. Puede reducir la Defensa Especial del objetivo.", - }, - energyBall: { - name: "Energibola", - effect: "Aúna fuerzas de la naturaleza y libera su ataque. Puede reducir la Defensa Especial del objetivo.", - }, - braveBird: { - name: "Pájaro Osado", - effect: "Pliega sus alas y ataca con un vuelo rasante. El Pokémon que lo usa también resulta seriamente dañado.", - }, - earthPower: { - name: "Tierra Viva", - effect: "La tierra a los pies del objetivo erupciona violentamente. Puede reducir la Defensa Especial del objetivo.", - }, - switcheroo: { - name: "Trapicheo", - effect: "Intercambia con el objetivo los objetos que llevan tan rápido que es imposible verlo a simple vista.", - }, - gigaImpact: { - name: "Gigaimpacto", - effect: "El usuario carga contra el objetivo con toda la fuerza que tiene y descansa en el siguiente turno.", - }, - nastyPlot: { - name: "Maquinación", - effect: "Estimula su cerebro pensando en cosas malas. Aumenta mucho el Ataque Especial.", - }, - bulletPunch: { - name: "Puño Bala", - effect: "Ataca con fuertes puñetazos tan rápidos como proyectiles. Este movimiento tiene prioridad alta.", - }, - avalanche: { - name: "Alud", - effect: "Este ataque inflige el doble de daño a un objetivo que haya golpeado al usuario en ese mismo turno.", - }, - iceShard: { - name: "Esquirla Helada", - effect: "Crea esquirlas de hielo y las lanza a gran velocidad. Este movimiento tiene prioridad alta.", - }, - shadowClaw: { - name: "Garra Umbría", - effect: "Ataca con una garra afilada hecha de sombras. Suele ser crítico.", - }, - thunderFang: { - name: "Colmillo Rayo", - effect: "El usuario muerde al objetivo con colmillos electrificados y puede hacer que se amedrente o se paralice.", - }, - iceFang: { - name: "Colmillo Hielo", - effect: "El usuario muerde al objetivo con colmillos helados y puede hacer que se amedrente o se congele.", - }, - fireFang: { - name: "Colmillo Ígneo", - effect: "El usuario muerde al objetivo con colmillos en llamas y puede hacer que se amedrente o sufra quemaduras.", - }, - shadowSneak: { - name: "Sombra Vil", - effect: "Extiende su sombra y ataca al objetivo por la espalda. Este movimiento tiene prioridad alta.", - }, - mudBomb: { - name: "Bomba Fango", - effect: "Ataca lanzando una compacta bola de fango. Puede bajar la Precisión del objetivo.", - }, - psychoCut: { - name: "Psicocorte", - effect: "Ataca al objetivo con cuchillas formadas por energía psíquica. Suele ser crítico.", - }, - zenHeadbutt: { - name: "Cabezazo Zen", - effect: "Concentra su energía psíquica en la cabeza para golpear. Puede hacer que el objetivo se amedrente.", - }, - mirrorShot: { - name: "Disparo Espejo", - effect: "El usuario libera un haz de energía desde su pulido cuerpo. Puede bajar la Precisión.", - }, - flashCannon: { - name: "Foco Resplandor", - effect: "El usuario concentra toda la luz del cuerpo y la libera. Puede bajar la Defensa Especial del objetivo.", - }, - rockClimb: { - name: "Treparrocas", - effect: "Ataca con una gran embestida. Puede confundir al objetivo.", - }, - defog: { - name: "Despejar", - effect: "Potente viento que barre los efectos de movimientos como Reflejo o Pantalla de Luz usados por el objetivo. También reduce su Evasión.", - }, - trickRoom: { - name: "Espacio Raro", - effect: "Crea un espacio misterioso en el que los Pokémon lentos se mueven primero durante cinco turnos.", - }, - dracoMeteor: { - name: "Cometa Draco", - effect: "Hace que grandes cometas caigan del cielo sobre el objetivo. Baja mucho el Ataque Especial del que lo usa.", - }, - discharge: { - name: "Chispazo", - effect: "Una deslumbradora onda eléctrica afecta a los Pokémon que hay combatiendo alrededor. Puede paralizar.", - }, - lavaPlume: { - name: "Humareda", - effect: "Un infierno de llamas daña a los Pokémon adyacentes en combate. Puede causar quemaduras.", - }, - leafStorm: { - name: "Lluevehojas", - effect: "Envuelve al objetivo con una lluvia de hojas afiladas, pero reduce mucho su Ataque Especial.", - }, - powerWhip: { - name: "Latigazo", - effect: "El usuario agita violentamente sus lianas o tentáculos para golpear al objetivo.", - }, - rockWrecker: { - name: "Romperrocas", - effect: "Lanza una piedra enorme contra el objetivo. El usuario deberá descansar en el siguiente turno.", - }, - crossPoison: { - name: "Veneno X", - effect: "Tajo que puede envenenar al objetivo. Suele ser crítico.", - }, - gunkShot: { - name: "Lanzamugre", - effect: "Lanza contra el objetivo basura asquerosa y puede envenenarlo.", - }, - ironHead: { - name: "Cabeza de Hierro", - effect: "Ataca con su cabeza dura como el hierro. Puede hacer que el objetivo se amedrente.", - }, - magnetBomb: { - name: "Bomba Imán", - effect: "Lanza unas bombas de hierro que se pegan al adversario. No se puede esquivar.", - }, - stoneEdge: { - name: "Roca Afilada", - effect: "Clava piedras muy afiladas al objetivo. Suele ser crítico.", - }, - captivate: { - name: "Seducción", - effect: "Si el objetivo es del sexo opuesto, queda embelesado y baja mucho su Ataque Especial.", - }, - stealthRock: { - name: "Trampa Rocas", - effect: "Una trampa de rocas que flota en el aire y daña a los objetivos que entran en combate.", - }, - grassKnot: { - name: "Hierba Lazo", - effect: "Enreda al objetivo con hierba y lo derriba. Cuanto más pesado es el objetivo, más potencia tiene el movimiento.", - }, - chatter: { - name: "Cháchara", - effect: "Ataca con una onda de sonido muy ruidosa compuesta por palabras y confunde al objetivo.", - }, - judgment: { - name: "Sentencia", - effect: "Emite incontables haces de luz. El tipo del movimiento varía según la tabla que lleve el usuario.", - }, - bugBite: { - name: "Picadura", - effect: "Pica al objetivo. Si el objetivo lleva una baya, el usuario se la come y se beneficia de su efecto.", - }, - chargeBeam: { - name: "Rayo Carga", - effect: "Lanza un rayo eléctrico contra el objetivo. Puede subir el Ataque Especial de quien lo usa.", - }, - woodHammer: { - name: "Mazazo", - effect: "Arremete contra el objetivo con su robusto cuerpo. El usuario se hiere seriamente a sí mismo.", - }, - aquaJet: { - name: "Acua Jet", - effect: "Ataque de una rapidez espeluznante. Este movimiento tiene prioridad alta.", - }, - attackOrder: { - name: "Al Ataque", - effect: "El usuario llama a sus súbditos para que ataquen al objetivo. Suele ser crítico.", - }, - defendOrder: { - name: "A Defender", - effect: "El usuario llama a sus súbditos para que formen un escudo viviente. Sube la Defensa y la Defensa Especial.", - }, - healOrder: { - name: "Auxilio", - effect: "El usuario llama a sus súbditos para que lo curen. Recupera hasta la mitad de los PS máximos.", - }, - headSmash: { - name: "Testarazo", - effect: "El usuario arriesga su vida y lanza un cabezazo con toda su fuerza. El agresor resulta seriamente dañado.", - }, - doubleHit: { - name: "Doble Golpe", - effect: "Golpea al objetivo dos veces seguidas con la cola u otras partes de su cuerpo.", - }, - roarOfTime: { - name: "Distorsión", - effect: "Ataca al objetivo usando tal energía que el tiempo se distorsiona. El usuario deberá descansar en el siguiente turno.", - }, - spacialRend: { - name: "Corte Vacío", - effect: "Desgarra al objetivo y el espacio a su alrededor. Suele ser crítico.", - }, - lunarDance: { - name: "Danza Lunar", - effect: "El usuario se debilita, pero el Pokémon que lo sustituye recupera su estado, los PS y los PP.", - }, - crushGrip: { - name: "Agarrón", - effect: "Estruja al objetivo con gran fuerza. Cuantos más PS le queden al objetivo, más fuerte será el ataque.", - }, - magmaStorm: { - name: "Lluvia Ígnea", - effect: "El objetivo queda atrapado en una tormenta de fuego que dura de cuatro a cinco turnos.", - }, - darkVoid: { - name: "Brecha Negra", - effect: "El objetivo es enviado a un mundo de tinieblas que lo hace dormir.", - }, - seedFlare: { - name: "Fulgor Semilla", - effect: "Una onda de choque se libera del cuerpo. Puede bajar mucho la Defensa Especial del objetivo.", - }, - ominousWind: { - name: "Viento Aciago", - effect: "Produce un viento horripilante. Puede subir de golpe todas las características del usuario.", - }, - shadowForce: { - name: "Golpe Umbrío", - effect: "En el primer turno, desaparece. En el segundo, golpea al objetivo aunque se esté protegiendo.", - }, - honeClaws: { - name: "Afilagarras", - effect: "El usuario se afila las garras para aumentar su Ataque y su Precisión.", - }, - wideGuard: { - name: "Vasta Guardia", - effect: "Bloquea los ataques de objetivo múltiple lanzados contra el bando del usuario durante un turno.", - }, - guardSplit: { - name: "Isoguardia", - effect: "El usuario emplea sus poderes para hacer la media de su Defensa y su Defensa Especial con las del objetivo y compartirlas.", - }, - powerSplit: { - name: "Isofuerza", - effect: "El usuario emplea sus poderes para hacer la media de su Ataque y su Ataque Especial con los del objetivo y compartirlos.", - }, - wonderRoom: { - name: "Zona Extraña", - effect: "Crea un espacio misterioso donde se intercambian la Defensa y la Defensa Especial de todos los Pokémon durante cinco turnos.", - }, - psyshock: { - name: "Psicocarga", - effect: "Crea una onda psíquica que causa daño físico al objetivo.", - }, - venoshock: { - name: "Carga Tóxica", - effect: "Cubre al objetivo con un líquido venenoso. La potencia del movimiento se duplica si este ya está envenenado.", - }, - autotomize: { - name: "Aligerar", - effect: "El usuario se desprende de partes prescindibles de su cuerpo para hacerse más ligero y aumentar mucho su Velocidad.", - }, - ragePowder: { - name: "Polvo Ira", - effect: "Usa un polvo que enerva a los rivales y hace que centren en el usuario su atención y sus movimientos.", - }, - telekinesis: { - name: "Telequinesis", - effect: "El usuario emplea su poder mental para hacer flotar al objetivo, y lo convierte en un blanco fácil durante tres turnos.", - }, - magicRoom: { - name: "Zona Mágica", - effect: "Crea un espacio misterioso que inutiliza todos los objetos de los Pokémon durante cinco turnos.", - }, - smackDown: { - name: "Antiaéreo", - effect: "Ataca lanzando una piedra o un proyectil. Si el objetivo está en el aire, lo estrella contra el suelo.", - }, - stormThrow: { - name: "Llave Corsé", - effect: "Lanza un golpe devastador. Siempre asesta un golpe crítico.", - }, - flameBurst: { - name: "Pirotecnia", - effect: "Golpea al objetivo con una llamarada que afecta también a los Pokémon adyacentes.", - }, - sludgeWave: { - name: "Onda Tóxica", - effect: "Una onda tóxica que daña a los Pokémon de alrededor. Puede envenenar.", - }, - quiverDance: { - name: "Danza Aleteo", - effect: "Danza mística que aumenta el Ataque Especial, la Defensa Especial y la Velocidad.", - }, - heavySlam: { - name: "Cuerpo Pesado", - effect: "El usuario golpea con todo su cuerpo. Cuanto mayor sea su peso comparado con el del objetivo, mayor será la potencia del movimiento.", - }, - synchronoise: { - name: "Sincrorruido", - effect: "Una extraña onda que daña a todos los Pokémon adyacentes del mismo tipo que el que la ejecuta.", - }, - electroBall: { - name: "Bola Voltio", - effect: "Lanza una bola eléctrica. Cuanto mayor sea la Velocidad del usuario en comparación con la del objetivo, mayor será la potencia del movimiento.", - }, - soak: { - name: "Empapar", - effect: "Potente lluvia que transforma al objetivo en un Pokémon de tipo Agua.", - }, - flameCharge: { - name: "Nitrocarga", - effect: "Llamas que golpean al objetivo y aumentan la Velocidad del atacante.", - }, - coil: { - name: "Enrosque", - effect: "El usuario se concentra, lo que le permite aumentar su Ataque, Defensa y Precisión.", - }, - lowSweep: { - name: "Puntapié", - effect: "Ataque rápido dirigido a los pies del objetivo que le hace perder Velocidad.", - }, - acidSpray: { - name: "Bomba Ácida", - effect: "Ataca con un líquido corrosivo que reduce mucho la Defensa Especial del objetivo.", - }, - foulPlay: { - name: "Juego Sucio", - effect: "El usuario emplea la fuerza del objetivo para atacarlo. Cuanto mayor es el Ataque del objetivo, más daño provoca.", - }, - simpleBeam: { - name: "Onda Simple", - effect: "Lanza una onda psíquica que hace que la habilidad del objetivo pase a ser Simple.", - }, - entrainment: { - name: "Danza Amiga", - effect: "Una extraña danza que induce al objetivo a imitarla y cambia su habilidad por la misma que la del usuario.", - }, - afterYou: { - name: "Cede Paso", - effect: "Si el usuario es el más rápido, permite al objetivo usar un movimiento justo tras él, adelantándose a Pokémon más rápidos.", - }, - round: { - name: "Canon", - effect: "Un canto que ataca al objetivo. Cuantos más Pokémon lo usan, más aumenta de potencia.", - }, - echoedVoice: { - name: "Eco Voz", - effect: "Un susurro que aumenta de potencia conforme el usuario y otros Pokémon lo van utilizando.", - }, - chipAway: { - name: "Guardia Baja", - effect: "Un ataque que busca los puntos débiles del objetivo y puede causarle daño aunque cambien sus características.", - }, - clearSmog: { - name: "Niebla Clara", - effect: "Ataca al objetivo con una singular bola de lodo que elimina cualquier cambio en sus características.", - }, - storedPower: { - name: "Poder Reserva", - effect: "Acumula poder para golpear. Cuanto más suban las características del usuario, mayor será el daño.", - }, - quickGuard: { - name: "Anticipo", - effect: "Se protege a sí mismo y a sus aliados de movimientos con prioridad.", - }, - allySwitch: { - name: "Cambio de Banda", - effect: "Extraño poder que intercambia la posición del usuario con la de un aliado sobre el terreno de combate.", - }, - scald: { - name: "Escaldar", - effect: "Ataca arrojando agua hirviendo al objetivo. Puede causar quemaduras.", - }, - shellSmash: { - name: "Rompecoraza", - effect: "El usuario rompe su coraza y baja su Defensa y Defensa Especial, pero aumenta mucho su Ataque, Ataque Especial y Velocidad.", - }, - healPulse: { - name: "Pulso Cura", - effect: "Una onda curativa restaura la mitad de los PS máximos del objetivo.", - }, - hex: { - name: "Infortunio", - effect: "Ataque que causa un gran daño a los objetivos que sufren problemas de estado.", - }, - skyDrop: { - name: "Caída Libre", - effect: "Primer turno: lanza al objetivo al aire. Segundo turno: lo hace caer. Mientras está en el aire, no lo deja moverse.", - }, - shiftGear: { - name: "Cambio de Marcha", - effect: "Al hacer girar los engranajes, el usuario mejora su Ataque y aumenta mucho su Velocidad.", - }, - circleThrow: { - name: "Llave Giro", - effect: "Lanza por los aires al objetivo y hace que salga otro Pokémon. Si es uno salvaje, acaba el combate.", - }, - incinerate: { - name: "Calcinación", - effect: "Llamas que golpean al objetivo. Si este lleva una baya o ciertos objetos, se quemarán y ya no se podrán usar.", - }, - quash: { - name: "Último Lugar", - effect: "Consigue que el objetivo sea el último en moverse.", - }, - acrobatics: { - name: "Acróbata", - effect: "Golpea ágilmente. Si el usuario no porta ningún objeto, el objetivo resulta seriamente dañado.", - }, - reflectType: { - name: "Clonatipo", - effect: "Cambia el tipo del Pokémon al mismo tipo que el del objetivo.", - }, - retaliate: { - name: "Represalia", - effect: "Venga a los amigos caídos. Si en el turno anterior han derrotado a alguno, la potencia del ataque aumentará.", - }, - finalGambit: { - name: "Sacrificio", - effect: "El usuario se sacrifica causándole un daño al objetivo equivalente a sus propios PS perdidos.", - }, - bestow: { - name: "Ofrenda", - effect: "Entrega el objeto que lleva al objetivo en caso de que este no tenga ninguno.", - }, - inferno: { - name: "Infierno", - effect: "Ataca con una gran ráfaga de fuego que causa quemaduras.", - }, - waterPledge: { - name: "Voto Agua", - effect: "Ataca con columnas de agua. Combinado con Voto Fuego, crea un arcoíris y aumenta su potencia.", - }, - firePledge: { - name: "Voto Fuego", - effect: "Ataca con columnas de fuego. Combinado con Voto Planta, crea un mar de llamas y aumenta su potencia.", - }, - grassPledge: { - name: "Voto Planta", - effect: "Ataca con columnas de hojas. Combinado con Voto Agua, crea un pantano y aumenta su potencia.", - }, - voltSwitch: { - name: "Voltiocambio", - effect: "Tras atacar, el usuario da paso a toda prisa a otro Pokémon del equipo.", - }, - struggleBug: { - name: "Estoicismo", - effect: "El usuario opone resistencia y ataca a los oponentes. También reduce su Ataque Especial.", - }, - bulldoze: { - name: "Terratemblor", - effect: "Sacudida sísmica que afecta a los Pokémon adyacentes y también reduce su Velocidad.", - }, - frostBreath: { - name: "Vaho Gélido", - effect: "Quien lo usa ataca lanzando un aliento gélido. Siempre asesta un golpe crítico.", - }, - dragonTail: { - name: "Cola Dragón", - effect: "Ataca al objetivo y lo obliga a cambiarse por otro Pokémon. Si es uno salvaje, acaba el combate.", - }, - workUp: { - name: "Avivar", - effect: "Quien lo usa se concentra y potencia su Ataque y su Ataque Especial.", - }, - electroweb: { - name: "Electrotela", - effect: "Atrapa y ataca a los objetivos con una telaraña eléctrica. También reduce su Velocidad.", - }, - wildCharge: { - name: "Voltio Cruel", - effect: "Carga eléctrica muy potente que también hiere ligeramente a quien la usa.", - }, - drillRun: { - name: "Taladradora", - effect: "El usuario golpea usando su cuerpo como un taladro. Suele ser crítico.", - }, - dualChop: { - name: "Golpe Bis", - effect: "Golpea dos veces seguidas con las partes más recias de su cuerpo.", - }, - heartStamp: { - name: "Arrumaco", - effect: "El usuario despista al objetivo con gestos adorables y aprovecha la ocasión para asestarle un golpe tremendo que puede hacerlo retroceder.", - }, - hornLeech: { - name: "Asta Drenaje", - effect: "Un golpe que drena energía. El Pokémon recupera la mitad de los PS arrebatados al objetivo.", - }, - sacredSword: { - name: "Espada Santa", - effect: "El usuario ataca con una espada, ignorando cualquier cambio en las características del objetivo.", - }, - razorShell: { - name: "Concha Filo", - effect: "Una afilada vieira ataca al objetivo. También puede hacer disminuir su Defensa.", - }, - heatCrash: { - name: "Golpe Calor", - effect: "El usuario ataca con su cuerpo ardiente. Cuanto mayor sea su peso comparado con el del objetivo, más daño causará.", - }, - leafTornado: { - name: "Ciclón de Hojas", - effect: "Tritura con afiladas hojas y puede bajar la Precisión del objetivo.", - }, - steamroller: { - name: "Rodillo de Púas", - effect: "El usuario se hace una bola y arrolla al objetivo con su cuerpo. Puede hacerlo retroceder.", - }, - cottonGuard: { - name: "Rizo Algodón", - effect: "Cubre al Pokémon con una madeja protectora. Aumenta muchísimo la Defensa.", - }, - nightDaze: { - name: "Pulso Noche", - effect: "Ataca al objetivo con una onda siniestra. Puede bajar su Precisión.", - }, - psystrike: { - name: "Onda Mental", - effect: "Crea una onda psíquica que causa daño físico al objetivo.", - }, - tailSlap: { - name: "Plumerazo", - effect: "Golpea con la cola de dos a cinco veces seguidas.", - }, - hurricane: { - name: "Vendaval", - effect: "Golpea al objetivo con un fuerte torbellino que envuelve al rival y puede confundirlo.", - }, - headCharge: { - name: "Ariete", - effect: "Propina un tremendo cabezazo. También daña al usuario un poco.", - }, - gearGrind: { - name: "Rueda Doble", - effect: "Rota dos engranajes de hierro sobre el objetivo. Golpea dos veces.", - }, - searingShot: { - name: "Bomba Ígnea", - effect: "Un infierno de llamas daña a los Pokémon adyacentes en combate. Puede causar quemaduras.", - }, - technoBlast: { - name: "Tecno Shock", - effect: "Ataca al objetivo con un gran láser. El tipo del ataque lo determina el cartucho que porta el usuario.", - }, - relicSong: { - name: "Canto Arcaico", - effect: "Ataca conmoviendo al objetivo con un antiguo canto. Puede dormirlo.", - }, - secretSword: { - name: "Sable Místico", - effect: "Ensarta al objetivo con un largo cuerno dotado de un poder místico que provoca daño físico.", - }, - glaciate: { - name: "Mundo Gélido", - effect: "Ataque con aire helado que baja la Velocidad del objetivo.", - }, - boltStrike: { - name: "Ataque Fulgor", - effect: "Ataca envolviéndose de una gran carga eléctrica y embistiendo al objetivo con ella. Puede paralizar.", - }, - blueFlare: { - name: "Llama Azul", - effect: "Ataca con una bella pero potente llama azul que rodea al objetivo. Puede causar quemaduras.", - }, - fieryDance: { - name: "Danza Llama", - effect: "Envuelve en llamas y daña al objetivo. Puede aumentar el Ataque Especial de quien lo usa.", - }, - freezeShock: { - name: "Rayo Gélido", - effect: "El usuario carga un bloque de hielo con electricidad en el primer turno y ataca con él en el segundo. Puede paralizar.", - }, - iceBurn: { - name: "Llama Gélida", - effect: "Ataca al objetivo en el segundo turno rodeándolo de un aire gélido. Puede causar quemaduras.", - }, - snarl: { - name: "Alarido", - effect: "Chillido desagradable que reduce el Ataque Especial del objetivo.", - }, - icicleCrash: { - name: "Chuzos", - effect: "Lanza grandes carámbanos. Puede amedrentar al objetivo.", - }, - vCreate: { - name: "V de Fuego", - effect: "Golpea con una V de llamas al objetivo. Baja la Defensa, la Defensa Especial y la Velocidad de quien lo usa.", - }, - fusionFlare: { - name: "Llama Fusión", - effect: "Ataca con una llamarada gigantesca. Aumenta su potencia si es influenciada por una gran energía eléctrica.", - }, - fusionBolt: { - name: "Rayo Fusión", - effect: "Ataca con una enorme descarga eléctrica. Aumenta su potencia si es influenciada por una gigantesca llamarada.", - }, - flyingPress: { - name: "Plancha Voladora", - effect: "El usuario se lanza sobre su objetivo. Este movimiento es de tipo Lucha y tipo Volador al mismo tiempo.", - }, - matBlock: { - name: "Escudo Tatami", - effect: "El usuario usa un tatami para escudarse de los ataques enemigos. Protege también a los aliados. No funciona contra movimientos de estado.", - }, - belch: { - name: "Eructo", - effect: "El usuario causa daño a su objetivo lanzándole un eructo. Para poder utilizar este movimiento, tiene que haberse comido una baya equipada.", - }, - rototiller: { - name: "Fertilizante", - effect: "Labra la tierra haciendo que sea más fácil cultivarla y consigue que aumente el Ataque y el Ataque Especial de los Pokémon de tipo Planta.", - }, - stickyWeb: { - name: "Red Viscosa", - effect: "Coloca una red pegajosa alrededor del objetivo que reduce la Velocidad de los rivales que entran en combate.", - }, - fellStinger: { - name: "Aguijón Letal", - effect: "Si se derrota al objetivo utilizando este movimiento, aumenta muchísimo el Ataque del usuario.", - }, - phantomForce: { - name: "Golpe Fantasma", - effect: "El usuario desaparece en el primer turno y ataca a su objetivo en el segundo. Permite acertar aunque el objetivo esté protegiéndose.", - }, - trickOrTreat: { - name: "Halloween", - effect: "Invita al objetivo a celebrar Halloween, lo que añade el tipo Fantasma a los tipos de este.", - }, - nobleRoar: { - name: "Rugido de Guerra", - effect: "Intimida a su oponente con un rugido de guerra, lo que hace que disminuyan tanto su Ataque como su Ataque Especial.", - }, - ionDeluge: { - name: "Cortina Plasma", - effect: "El Pokémon disemina partículas con carga eléctrica que convierten los movimientos de tipo Normal en tipo Eléctrico.", - }, - parabolicCharge: { - name: "Carga Parábola", - effect: "Inflige daño a los Pokémon adyacentes. El usuario absorbe la mitad del daño producido para restaurar sus propios PS.", - }, - forestsCurse: { - name: "Condena Silvana", - effect: "El objetivo es presa de la maldición del bosque, por lo que pasa a ser un Pokémon de tipo Planta, además de conservar sus tipos habituales.", - }, - petalBlizzard: { - name: "Tormenta Floral", - effect: "El usuario desata un intenso vendaval de pétalos que daña a los Pokémon a su alrededor.", - }, - freezeDry: { - name: "Liofilización", - effect: "Enfría súbitamente al objetivo e incluso puede congelarlo. Es supereficaz contra Pokémon de tipo Agua.", - }, - disarmingVoice: { - name: "Voz Cautivadora", - effect: "Obnubila al objetivo con su fascinante voz y le provoca daños emocionales. No falla nunca.", - }, - partingShot: { - name: "Última Palabra", - effect: "El usuario se cambia por otro Pokémon de su equipo, pero antes amedrenta a su oponente y hace que disminuyan su Ataque y Ataque Especial.", - }, - topsyTurvy: { - name: "Reversión", - effect: "Invierte por completo los cambios en las características del objetivo.", - }, - drainingKiss: { - name: "Beso Drenaje", - effect: "El usuario absorbe PS del objetivo con un beso y restaura su propia energía en una cantidad igual o superior a la mitad del daño infligido.", - }, - craftyShield: { - name: "Truco Defensa", - effect: "Usa unos misteriosos poderes para protegerse a sí mismo y a sus aliados de movimientos de estado, pero no de otro tipo de ataques.", - }, - flowerShield: { - name: "Defensa Floral", - effect: "Aumenta la Defensa de todos los Pokémon de tipo Planta que hay en el combate usando unos misteriosos poderes.", - }, - grassyTerrain: { - name: "Campo de Hierba", - effect: "Durante cinco turnos, se potencian los movimientos de tipo Planta y los Pokémon que están en contacto con el suelo recuperan PS en cada turno.", - }, - mistyTerrain: { - name: "Campo de Niebla", - effect: "Durante cinco turnos, los Pokémon que están en el suelo no sufren problemas de estado y se reduce a la mitad el daño de los movimientos de tipo Dragón.", - }, - electrify: { - name: "Electrificación", - effect: "Si el objetivo queda electrificado antes de usar un movimiento, este será de tipo Eléctrico.", - }, - playRough: { - name: "Carantoña", - effect: "El Pokémon que lo usa le hace cucamonas al objetivo y lo ataca. Puede disminuir el Ataque del objetivo.", - }, - fairyWind: { - name: "Viento Feérico", - effect: "El Pokémon que lo usa desata un vendaval feérico que arremete contra el objetivo.", - }, - moonblast: { - name: "Fuerza Lunar", - effect: "Invoca el poder de la luna para atacar al objetivo. Puede reducir su Ataque Especial.", - }, - boomburst: { - name: "Estruendo", - effect: "Ataca a todos los Pokémon a su alrededor con una potentísima onda sonora.", - }, - fairyLock: { - name: "Cerrojo Feérico", - effect: "Consigue que ningún Pokémon pueda huir ni ser cambiado por otro en el siguiente turno echando un cerrojo.", - }, - kingsShield: { - name: "Escudo Real", - effect: "El usuario adopta una postura defensiva y se protege de cualquier daño. Reduce el Ataque de cualquier Pokémon con el que entre en contacto.", - }, - playNice: { - name: "Camaradería", - effect: "Se hace amigo de su objetivo y consigue que a este se le quiten las ganas de combatir, lo que reduce su Ataque.", - }, - confide: { - name: "Confidencia", - effect: "Hace que el objetivo pierda la concentración contándole un secreto y reduce su Ataque Especial.", - }, - diamondStorm: { - name: "Torm. Diamantes", - effect: "Desata un devastador vendaval de diamantes para dañar a los oponentes. Puede aumentar mucho la Defensa del usuario.", - }, - steamEruption: { - name: "Chorro de Vapor", - effect: "Envuelve al objetivo con vapor extremadamente caliente que puede causar quemaduras.", - }, - hyperspaceHole: { - name: "Paso Dimensional", - effect: "El usuario aparece junto al rival usando un agujero dimensional y le asesta un golpe que movimientos como Protección o Detección no pueden evitar.", - }, - waterShuriken: { - name: "Shuriken de Agua", - effect: "Golpea al objetivo de dos a cinco veces seguidas con estrellas arrojadizas hechas de mucosidad. Este movimiento tiene prioridad alta.", - }, - mysticalFire: { - name: "Llama Embrujada", - effect: "El usuario lanza por la boca una singular llama a gran temperatura con la que ataca a su objetivo y reduce su Ataque Especial.", - }, - spikyShield: { - name: "Barrera Espinosa", - effect: "Protege al usuario de ataques e inflige daño a quien se los lance si entra en contacto con él.", - }, - aromaticMist: { - name: "Niebla Aromática", - effect: "Consigue aumentar la Defensa Especial de un Pokémon de su equipo con una fragancia misteriosa.", - }, - eerieImpulse: { - name: "Onda Anómala", - effect: "El usuario irradia unas raras ondas que, al alcanzar al objetivo, reducen mucho su Ataque Especial.", - }, - venomDrench: { - name: "Trampa Venenosa", - effect: "Impregna a su objetivo con un líquido venenoso que disminuye el Ataque, el Ataque Especial y la Velocidad. Solo afecta a Pokémon ya envenenados.", - }, - powder: { - name: "Polvo Explosivo", - effect: "Esparce un polvo sobre el objetivo. Si este usa un movimiento de tipo Fuego en el mismo turno, el polvo explota y le inflige daño.", - }, - geomancy: { - name: "Geocontrol", - effect: "Concentra energía durante el primer turno, de forma que su Velocidad, Ataque Especial y Defensa Especial aumenten mucho en el segundo.", - }, - magneticFlux: { - name: "Aura Magnética", - effect: "Manipula el campo magnético y logra aumentar la Defensa y la Defensa Especial de los Pokémon aliados que cuenten con las habilidades Más y Menos.", - }, - happyHour: { - name: "Paga Extra", - effect: "Al usar este movimiento, se duplica el dinero recibido tras el combate.", - }, - electricTerrain: { - name: "Campo Eléctrico", - effect: "Durante cinco turnos, se potencian los movimientos de tipo Eléctrico y los Pokémon que están en contacto con el suelo no pueden quedarse dormidos.", - }, - dazzlingGleam: { - name: "Brillo Mágico", - effect: "Inflige daño al objetivo con una potente luz.", - }, - celebrate: { - name: "Celebración", - effect: "El Pokémon te felicita en un día muy especial para ti.", - }, - holdHands: { - name: "Manos Juntas", - effect: "El usuario le da la mano a un aliado y ambos se sienten muy felices.", - }, - babyDollEyes: { - name: "Ojitos Tiernos", - effect: "Lanza una mirada al objetivo con ojos acaramelados, con lo que logra que su Ataque se reduzca. Este movimiento tiene prioridad alta.", - }, - nuzzle: { - name: "Moflete Estático", - effect: "El usuario frota sus mofletes cargados de electricidad contra el objetivo y consigue paralizarlo.", - }, - holdBack: { - name: "Clemencia", - effect: "El usuario se contiene a la hora de atacar y deja al objetivo con al menos 1 PS.", - }, - infestation: { - name: "Acoso", - effect: "Hostiga al objetivo durante cuatro o cinco turnos e impide que pueda huir o ser cambiado por otro mientras tanto.", - }, - powerUpPunch: { - name: "Puño Incremento", - effect: "Cada vez que golpea a un oponente se endurecen sus puños. Si acierta al objetivo, el Ataque del usuario aumenta.", - }, - oblivionWing: { - name: "Ala Mortífera", - effect: "El usuario absorbe energía del objetivo y aumenta sus PS en una cantidad igual o superior a la mitad del daño infligido.", - }, - thousandArrows: { - name: "Mil Flechas", - effect: "Acierta incluso a Pokémon que estén en el aire y los hace caer al suelo.", - }, - thousandWaves: { - name: "Mil Temblores", - effect: "El usuario genera ondas sísmicas que se propagan por el suelo y sacuden al objetivo. Los Pokémon alcanzados no podrán huir del combate ni ser cambiados por otros.", - }, - landsWrath: { - name: "Fuerza Telúrica", - effect: "Acumula energía de la corteza terrestre y la concentra contra los oponentes, dañándolos.", - }, - lightOfRuin: { - name: "Luz Aniquiladora", - effect: "El usuario emplea el poder de la Flor Eterna para lanzar un potente rayo de luz, pero sufre bastante daño al hacerlo.", - }, - originPulse: { - name: "Pulso Primigenio", - effect: "Ataca al objetivo con una infinidad de rayos de luz azulada.", - }, - precipiceBlades: { - name: "Filo del Abismo", - effect: "Hace que el poder latente de la tierra se manifieste en forma de hojas afiladas y ataca al objetivo con ellas.", - }, - dragonAscent: { - name: "Ascenso Draco", - effect: "El usuario se precipita desde el cielo a una velocidad de vértigo para atacar al objetivo, pero hace que bajen la Defensa y la Defensa Especial del usuario.", - }, - hyperspaceFury: { - name: "Cerco Dimensión", - effect: "Ataca al objetivo con una ráfaga de golpes que pasan por alto los efectos de movimientos como Protección o Detección. Baja la Defensa del usuario.", - }, - breakneckBlitzPhysical: { - name: "Carrera Arrolladora", - effect: "El usuario emplea el Poder Z para coger carrerilla y arremeter contra el objetivo con gran fuerza. Su potencia depende de la del movimiento original.", - }, - breakneckBlitzSpecial: { - name: "Carrera Arrolladora", - effect: "Dummy data", - }, - allOutPummelingPhysical: { - name: "Ráfaga Demoledora", - effect: "Emplea el Poder Z para lanzar una sarta de golpes demoledores contra el objetivo. Su potencia depende de la del movimiento original.", - }, - allOutPummelingSpecial: { - name: "Ráfaga Demoledora", - effect: "Dummy data", - }, - supersonicSkystrikePhysical: { - name: "Picado Supersónico", - effect: "El usuario emplea el Poder Z para volar muy alto y abalanzarse en picado sobre el objetivo. Su potencia depende de la del movimiento original.", - }, - supersonicSkystrikeSpecial: { - name: "Picado Supersónico", - effect: "Dummy data", - }, - acidDownpourPhysical: { - name: "Diluvio Corrosivo", - effect: "El usuario emplea el Poder Z para crear una ciénaga venenosa en la que sumerge al objetivo. Su potencia depende de la del movimiento original.", - }, - acidDownpourSpecial: { - name: "Diluvio Corrosivo", - effect: "Dummy data", - }, - tectonicRagePhysical: { - name: "Barrena Telúrica", - effect: "Emplea el Poder Z para abrir una profunda grieta en el suelo que se traga al oponente. Su potencia depende de la del movimiento original.", - }, - tectonicRageSpecial: { - name: "Barrena Telúrica", - effect: "Dummy data", - }, - continentalCrushPhysical: { - name: "Aplastamiento Gigalítico", - effect: "El usuario emplea el Poder Z para crear una montaña rocosa con la que aplasta al objetivo. Su potencia depende de la del movimiento original.", - }, - continentalCrushSpecial: { - name: "Aplastamiento Gigalítico", - effect: "Dummy data", - }, - savageSpinOutPhysical: { - name: "Guadaña Sedosa", - effect: "Emplea el Poder Z para encerrar a su oponente en un capullo contra el que arremete con fuerza. Su potencia depende de la del movimiento original.", - }, - savageSpinOutSpecial: { - name: "Guadaña Sedosa", - effect: "Dummy data", - }, - neverEndingNightmarePhysical: { - name: "Presa Espectral", - effect: "El usuario emplea el Poder Z para invocar a unos espectros encolerizados que apresan al objetivo. Su potencia depende de la del movimiento original.", - }, - neverEndingNightmareSpecial: { - name: "Presa Espectral", - effect: "Dummy data", - }, - corkscrewCrashPhysical: { - name: "Hélice Trepanadora", - effect: "El usuario emplea el Poder Z para girar a toda velocidad y perforar al objetivo. Su potencia depende de la del movimiento original.", - }, - corkscrewCrashSpecial: { - name: "Hélice Trepanadora", - effect: "Dummy data", - }, - infernoOverdrivePhysical: { - name: "Hecatombe Pírica", - effect: "El usuario emplea el Poder Z para lanzar una enorme llamarada con la que calcina a su objetivo. Su potencia depende de la del movimiento original.", - }, - infernoOverdriveSpecial: { - name: "Hecatombe Pírica", - effect: "Dummy data", - }, - hydroVortexPhysical: { - name: "Hidrovórtice Abisal", - effect: "El usuario emplea el Poder Z para crear un potente torbellino de agua que engulle al objetivo. Su potencia depende de la del movimiento original.", - }, - hydroVortexSpecial: { - name: "Hidrovórtice Abisal", - effect: "Dummy data", - }, - bloomDoomPhysical: { - name: "Megatón Floral", - effect: "Emplea el Poder Z para concentrar la energía de la vegetación que lo rodea y atacar al objetivo. Su potencia depende de la del movimiento original.", - }, - bloomDoomSpecial: { - name: "Megatón Floral", - effect: "Dummy data", - }, - gigavoltHavocPhysical: { - name: "Gigavoltio Destructor", - effect: "El usuario emplea el Poder Z para generar una fuerte descarga eléctrica con la que electrocuta al objetivo. Su potencia depende de la del movimiento original.", - }, - gigavoltHavocSpecial: { - name: "Gigavoltio Destructor", - effect: "Dummy data", - }, - shatteredPsychePhysical: { - name: "Disruptor Psíquico", - effect: "Emplea el Poder Z para manipular la mente del objetivo, infligiéndole un daño ingente. Su potencia depende de la del movimiento original.", - }, - shatteredPsycheSpecial: { - name: "Disruptor Psíquico", - effect: "Dummy data", - }, - subzeroSlammerPhysical: { - name: "Crioaliento Despiadado", - effect: "Emplea el Poder Z para lanzar un rayo de hielo que baja la temperatura de golpe y congela al objetivo. Su potencia depende de la del movimiento original.", - }, - subzeroSlammerSpecial: { - name: "Crioaliento Despiadado", - effect: "Dummy data", - }, - devastatingDrakePhysical: { - name: "Dracoaliento Devastador", - effect: "El usuario emplea el Poder Z para materializar su aura y golpear al objetivo. Su potencia depende de la del movimiento original.", - }, - devastatingDrakeSpecial: { - name: "Dracoaliento Devastador", - effect: "Dummy data", - }, - blackHoleEclipsePhysical: { - name: "Agujero Negro Aniquilador", - effect: "El usuario emplea el Poder Z para generar un agujero negro que absorbe al objetivo. Su potencia depende de la del movimiento original.", - }, - blackHoleEclipseSpecial: { - name: "Agujero Negro Aniquilador", - effect: "Dummy data", - }, - twinkleTacklePhysical: { - name: "Arrumaco Sideral", - effect: "El usuario emplea el Poder Z para crear una dimensión fascinante que deja al rival a su merced. Su potencia depende de la del movimiento original.", - }, - twinkleTackleSpecial: { - name: "Arrumaco Sideral", - effect: "Dummy data", - }, - catastropika: { - name: "Pikavoltio Letal", - effect: "Pikachu emplea el Poder Z para acumular una gran cantidad de electricidad en su cuerpo y arremeter contra el objetivo.", - }, - shoreUp: { - name: "Recogearena", - effect: "Restaura la mitad de los PS máximos del usuario. Durante las tormentas de arena, restaura aún más PS.", - }, - firstImpression: { - name: "Escaramuza", - effect: "Movimiento de gran potencia que solo puede usarse en el turno en que el usuario sale al combate.", - }, - banefulBunker: { - name: "Búnker", - effect: "Protege de los ataques y, al mismo tiempo, envenena al Pokémon que use un movimiento de contacto contra el usuario.", - }, - spiritShackle: { - name: "Puntada Sombría", - effect: "Ataca al oponente y, al mismo tiempo, fija su sombra al terreno para impedir su huida.", - }, - darkestLariat: { - name: "Lariat Oscuro", - effect: "Gira sobre sí mismo y golpea al oponente con ambos brazos. Ignora los cambios en las características del objetivo.", - }, - sparklingAria: { - name: "Aria Burbuja", - effect: "Libera burbujas al cantar. Este movimiento cura las quemaduras de los Pokémon que reciban daño.", - }, - iceHammer: { - name: "Martillo Hielo", - effect: "Un terrible puño golpea al contrincante, pero la Velocidad del usuario se ve reducida.", - }, - floralHealing: { - name: "Cura Floral", - effect: "Restaura la mitad de los PS máximos del objetivo. Es más efectivo cuando se usa en conjunción con Campo de Hierba.", - }, - highHorsepower: { - name: "Fuerza Equina", - effect: "Asesta un golpe devastador usando todo su cuerpo.", - }, - strengthSap: { - name: "Absorbefuerza", - effect: "Restaura una cantidad de PS equivalente al valor de Ataque del rival, que además verá reducida esta característica.", - }, - solarBlade: { - name: "Cuchilla Solar", - effect: "El usuario dedica un turno a absorber energía lumínica y concentrarla en forma de cuchilla con la que ataca al rival en el siguiente turno.", - }, - leafage: { - name: "Follaje", - effect: "Ataca al objetivo lanzando hojas.", - }, - spotlight: { - name: "Foco", - effect: "Convierte a uno de los Pokémon que están combatiendo en el foco de atención, de modo que todos los ataques se dirijan hacia él.", - }, - toxicThread: { - name: "Hilo Venenoso", - effect: "Ataca al objetivo con hilillos venenosos que reducen su Velocidad y lo envenenan.", - }, - laserFocus: { - name: "Aguzar", - effect: "El usuario se concentra para que el siguiente ataque propine un golpe crítico.", - }, - gearUp: { - name: "Piñón Auxiliar", - effect: "Cambia de marcha y logra aumentar el Ataque y el Ataque Especial de los Pokémon aliados que cuenten con las habilidades Más y Menos.", - }, - throatChop: { - name: "Golpe Mordaza", - effect: "Inflige al rival un dolor tan abrumador que le impide utilizar durante dos turnos ataques que se sirven del sonido.", - }, - pollenPuff: { - name: "Bola de Polen", - effect: "Ataca al objetivo con una bola explosiva. Si esta alcanza a un aliado, le hará recuperar PS.", - }, - anchorShot: { - name: "Anclaje", - effect: "Ataca lanzando un ancla al objetivo, que queda atrapado y no puede huir ni ser cambiado por otro.", - }, - psychicTerrain: { - name: "Campo Psíquico", - effect: "Durante cinco turnos, se potencian los movimientos de tipo Psíquico y los Pokémon que están en el suelo quedan protegidos contra movimientos con prioridad.", - }, - lunge: { - name: "Plancha", - effect: "Ataca al objetivo abalanzándose sobre él con todas sus fuerzas y reduce su Ataque.", - }, - fireLash: { - name: "Látigo Ígneo", - effect: "Golpea al objetivo con un látigo incandescente y reduce su Defensa.", - }, - powerTrip: { - name: "Chulería", - effect: "Ataca al oponente presumiendo de su fuerza. Cuanto más hayan subido las características del usuario, mayor será el daño.", - }, - burnUp: { - name: "Llama Final", - effect: "Utiliza hasta el último resquicio de llamas de su cuerpo para infligir un grave daño al objetivo. Tras el ataque, el usuario deja de ser de tipo Fuego.", - }, - speedSwap: { - name: "Cambiavelocidad", - effect: "Intercambia su Velocidad por la del objetivo.", - }, - smartStrike: { - name: "Cuerno Certero", - effect: "El usuario ensarta al objetivo con su afilada cornamenta. No falla nunca.", - }, - purify: { - name: "Purificación", - effect: "Cura los problemas de estado del Pokémon rival y a cambio recupera PS propios.", - }, - revelationDance: { - name: "Danza Despertar", - effect: "Ataque que consiste en un baile muy enérgico. El tipo de este ataque se corresponde con el del Pokémon que lo ejecuta.", - }, - coreEnforcer: { - name: "Núcleo Castigo", - effect: "Inflige daño al rival, y si este ya ha hecho uso de algún movimiento, pierde su habilidad.", - }, - tropKick: { - name: "Patada Tropical", - effect: "Lanza una patada con la fuerza del trópico que golpea al objetivo y reduce su Ataque.", - }, - instruct: { - name: "Mandato", - effect: "Fuerza al objetivo a repetir inmediatamente su último movimiento.", - }, - beakBlast: { - name: "Pico Cañón", - effect: "Primero aumenta la temperatura de su pico y luego ejecuta un ataque. Quema al rival si este le propina un ataque físico mientras está calentando el pico.", - }, - clangingScales: { - name: "Fragor Escamas", - effect: "Frota todas las escamas de su cuerpo para crear un fuerte sonido con el que ataca. Cuando el ataque termina, su Defensa se ve reducida.", - }, - dragonHammer: { - name: "Martillo Dragón", - effect: "Usa el cuerpo como un martillo para abalanzarse sobre su rival y causarle daño.", - }, - brutalSwing: { - name: "Giro Vil", - effect: "Hace pivotar su cuerpo para causar daño a los Pokémon adyacentes.", - }, - auroraVeil: { - name: "Velo Aurora", - effect: "Reduce el daño de los ataques físicos y especiales durante cinco turnos. Solo puede usarse cuando está nevando.", - }, - sinisterArrowRaid: { - name: "Aluvión de Flechas Sombrías", - effect: "Decidueye usa el Poder Z para proyectar multitud de flechas potentísimas que atraviesan a su oponente.", - }, - maliciousMoonsault: { - name: "Hiperplancha Oscura", - effect: "Incineroar refuerza sus músculos con el Poder Z para golpear con todas sus fuerzas a su oponente.", - }, - oceanicOperetta: { - name: "Sinfonía de la Diva Marina", - effect: "Primarina invoca ingentes cantidades de agua con el Poder Z para atacar con gran potencia a su rival.", - }, - guardianOfAlola: { - name: "Cólera del Guardián", - effect: "Los Pokémon Dios Nativo canalizan la energía de Alola gracias al Poder Z y atacan con gran fuerza a sus rivales reduciendo un gran porcentaje de sus PS.", - }, - soulStealing7StarStrike: { - name: "Constelación Robaalmas", - effect: "Cuando Marshadow obtiene el Poder Z, lanza una potente y continua oleada de puñetazos y patadas con la que castiga a su rival.", - }, - stokedSparksurfer: { - name: "Surfeo Galvánico", - effect: "Cuando un Raichu de Alola obtiene el Poder Z, lanza un potente ataque contra su enemigo y lo deja paralizado.", - }, - pulverizingPancake: { - name: "Arrojo Intempestivo", - effect: "Gracias al Poder Z, Snorlax puede mover su enorme cuerpo con gran agilidad y determinación, cargando sobre el oponente con todas sus fuerzas.", - }, - extremeEvoboost: { - name: "Novena Potencia", - effect: "Cuando Eevee obtiene el Poder Z, toma prestada la energía de sus amigos evolucionados para potenciar enormemente sus características.", - }, - genesisSupernova: { - name: "Supernova Original", - effect: "Mew usa el Poder Z para realizar un potente ataque contra su adversario y crear un Campo Psíquico sobre el terreno.", - }, - shellTrap: { - name: "Coraza Trampa", - effect: "El caparazón del Pokémon se convierte en una trampa. Si lo alcanza un ataque físico, la trampa estalla y los rivales sufren daño.", - }, - fleurCannon: { - name: "Cañón Floral", - effect: "El usuario emite un potente rayo, pero su Ataque Especial se reduce mucho.", - }, - psychicFangs: { - name: "Psicocolmillo", - effect: "Ataca a sus rivales con poderes psíquicos que además destruyen barreras como Pantalla de Luz y Reflejo.", - }, - stompingTantrum: { - name: "Pataleta", - effect: "Usa la frustración como revulsivo para atacar. La potencia de Pataleta se duplica si el usuario ha fallado el último movimiento usado.", - }, - shadowBone: { - name: "Hueso Sombrío", - effect: "Ataca golpeando con un hueso poseído por un espíritu. Puede reducir la Defensa del objetivo.", - }, - accelerock: { - name: "Roca Veloz", - effect: "El usuario se lanza contra el objetivo a gran velocidad. Este movimiento tiene prioridad alta.", - }, - liquidation: { - name: "Hidroariete", - effect: "Ataca golpeando gracias a la fuerza del agua. También puede reducir la Defensa del objetivo.", - }, - prismaticLaser: { - name: "Láser Prisma", - effect: "El usuario utiliza un prisma para emitir un rayo de gran potencia, pero deberá descansar en el siguiente turno.", - }, - spectralThief: { - name: "Robasombra", - effect: "El usuario se esconde en la sombra del objetivo y lo ataca tras robarle las mejoras en sus características.", - }, - sunsteelStrike: { - name: "Meteoimpacto", - effect: "Ataca al objetivo con la potencia de un meteoro, ignorando su habilidad.", - }, - moongeistBeam: { - name: "Rayo Umbrío", - effect: "Ataca con un rayo misterioso que ignora la habilidad del objetivo.", - }, - tearfulLook: { - name: "Ojos Llorosos", - effect: "Mira al objetivo con ojos llorosos para hacerle perder su espíritu combativo y reduce su Ataque y Ataque Especial.", - }, - zingZap: { - name: "Electropunzada", - effect: "Se lanza contra el objetivo y le suelta una potente descarga eléctrica que puede hacer que se amedrente.", - }, - naturesMadness: { - name: "Furia Natural", - effect: "Golpea al objetivo con la furia de la naturaleza y reduce sus PS a la mitad.", - }, - multiAttack: { - name: "Multiataque", - effect: "El Pokémon se rodea de una potente energía con la que golpea al rival. El tipo del movimiento depende del disco que lleva el usuario.", - }, - tenMillionVoltThunderbolt: { - name: "Gigarrayo Fulminante", - effect: "Los Pikachu con gorra acumulan una carga eléctrica descomunal gracias al Poder Z y la lanzan contra el objetivo. Suele ser crítico.", - }, - mindBlown: { - name: "Cabeza Sorpresa", - effect: "El usuario hace explotar su cabeza para atacar a los Pokémon adyacentes, aunque también se hiere a sí mismo.", - }, - plasmaFists: { - name: "Puños Plasma", - effect: "El usuario ataca con puños cargados de electricidad. Convierte los movimientos de tipo Normal en movimientos de tipo Eléctrico.", - }, - photonGeyser: { - name: "Géiser Fotónico", - effect: "El usuario ataca con una gran columna de luz. Compara sus valores de Ataque y Ataque Especial para infligir daño con el más alto de los dos.", - }, - lightThatBurnsTheSky: { - name: "Fotodestrucción Apocalíptica", - effect: "Necrozma escoge la característica que tenga el valor más alto entre el Ataque y el Ataque Especial para infligir daño, ignorando la habilidad del objetivo.", - }, - searingSunrazeSmash: { - name: "Embestida Solar", - effect: "Solgaleo ataca con toda su fuerza tras imbuirse del Poder Z. Este movimiento ignora la habilidad del objetivo.", - }, - menacingMoonrazeMaelstrom: { - name: "Deflagración Lunar", - effect: "Lunala ataca con toda su fuerza tras imbuirse del Poder Z. Este movimiento ignora la habilidad del objetivo.", - }, - letsSnuggleForever: { - name: "Somanta Amistosa", - effect: "Mimikyu ataca con toda su fuerza tras imbuirse del Poder Z y asesta una lluvia de golpes.", - }, - splinteredStormshards: { - name: "Tempestad Rocosa", - effect: "Lycanroc ataca con toda su fuerza tras imbuirse del Poder Z y neutraliza el campo que esté activo.", - }, - clangorousSoulblaze: { - name: "Estruendo Implacable", - effect: "Kommo-o ataca con toda su fuerza al objetivo tras imbuirse del Poder Z. Además, potencia sus propias características.", - }, - zippyZap: { - name: "Pikaturbo", - effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.", - }, - splishySplash: { - name: "Salpikasurf", - effect: "Golpea al adversario con una ola gigante electrificada, que también puede paralizarlo.", - }, - floatyFall: { - name: "Pikapicado", - effect: "El usuario se suspende en el aire para, a continuación, abalanzarse súbitamente sobre el rival. Puede hacer retroceder al objetivo.", - }, - pikaPapow: { - name: "Pikatormenta", - effect: "Lanza una descarga eléctrica infalible que resulta más potente cuanto mayor es el cariño que siente Pikachu hacia su Entrenador.", - }, - bouncyBubble: { - name: "Vapodrenaje", - effect: "Ataca lanzando proyectiles de agua y recupera una cantidad de PS equivalente a la del daño causado.", - }, - buzzyBuzz: { - name: "Joltioparálisis", - effect: "Lanza una potente descarga eléctrica sobre el rival y lo deja paralizado.", - }, - sizzlySlide: { - name: "Flarembestida", - effect: "Tras envolver su cuerpo en llamas, el usuario arrolla con fuerza al rival y le provoca quemaduras.", - }, - glitzyGlow: { - name: "Espeaura", - effect: "Envuelve al rival con ondas psíquicas y alza un extraño muro que debilita los ataques especiales del adversario.", - }, - baddyBad: { - name: "Umbreozona", - effect: "Lanza un ataque haciendo gala de su faceta más umbría y alza un extraño muro que mitiga los ataques físicos del adversario.", - }, - sappySeed: { - name: "Leafitobombas", - effect: "Hace brotar un tallo gigante que bombardea al rival con unas semillas que le drenan PS en cada turno.", - }, - freezyFrost: { - name: "Glaceoprisma", - effect: "Ataca al rival con negros cristales de niebla congelada. Revierte los cambios en las características de todos los Pokémon presentes.", - }, - sparklySwirl: { - name: "Sylveotornado", - effect: "Ataca al rival envolviéndolo en un remolino de aroma asfixiante. Cura a los aliados de cualquier problema de estado.", - }, - veeveeVolley: { - name: "Eevimpacto", - effect: "Un placaje infalible que resulta más potente cuanto mayor es el cariño que siente Eevee hacia su Entrenador.", - }, - doubleIronBash: { - name: "Ferropuño Doble", - effect: "Usando la tuerca del pecho como eje, gira sobre sí mismo y golpea con los brazos dos veces seguidas. Puede amedrentar al rival.", - }, - maxGuard: { - name: "Maxibarrera", - effect: "Frena todos los ataques, pero puede fallar si se usa repetidamente.", - }, - dynamaxCannon: { - name: "Cañón Dinamax", - effect: "El usuario ataca emitiendo un rayo desde su núcleo. El daño infligido se duplica si el objetivo supera el nivel 200.", - }, - snipeShot: { - name: "Disparo Certero", - effect: "Permite atacar al objetivo seleccionado ignorando las habilidades o movimientos que permiten a un Pokémon centrar la atención sobre sí.", - }, - jawLock: { - name: "Presa Maxilar", - effect: "Impide que tanto el atacante como el defensor puedan huir o ser cambiados por otros hasta que uno de ellos se debilite o abandone el terreno de combate.", - }, - stuffCheeks: { - name: "Atiborramiento", - effect: "El usuario ingiere la baya que lleva equipada para aumentar mucho su Defensa.", - }, - noRetreat: { - name: "Bastión Final", - effect: "El usuario aumenta todas sus características, pero ya no puede huir ni ser cambiado por otro.", - }, - tarShot: { - name: "Alquitranazo", - effect: "Cubre al objetivo de un alquitrán pegajoso que reduce su Velocidad y lo vuelve débil contra el fuego.", - }, - magicPowder: { - name: "Polvo Mágico", - effect: "Cubre al objetivo con unos polvos mágicos que le hacen adquirir el tipo Psíquico.", - }, - dragonDarts: { - name: "Dracoflechas", - effect: "El usuario ataca propulsando a ambos Dreepy. En caso de haber dos adversarios, cada Dreepy golpea a su propio objetivo por separado.", - }, - teatime: { - name: "Hora del Té", - effect: "El usuario invita a tomar el té a todos los presentes en el terreno de combate, lo que hace que ingieran las bayas que lleven equipadas.", - }, - octolock: { - name: "Octopresa", - effect: "Retiene al objetivo e impide que pueda huir o ser cambiado por otro, a la vez que reduce su Defensa y su Defensa Especial cada turno.", - }, - boltBeak: { - name: "Electropico", - effect: "El usuario ensarta al objetivo con su pico cargado de electricidad. Si ataca en primer lugar, la potencia del movimiento se duplica.", - }, - fishiousRend: { - name: "Branquibocado", - effect: "El usuario agarra al objetivo con sus duras branquias. En caso de atacar antes que este último, la potencia del movimiento se duplica.", - }, - courtChange: { - name: "Cambio de Cancha", - effect: "Extraño poder que intercambia los efectos en el terreno de combate de ambos bandos.", - }, - maxFlare: { - name: "Maxignición", - effect: "Ataque de tipo Fuego ejecutado por un Pokémon Dinamax. Hace que se intensifique el efecto del sol durante cinco turnos.", - }, - maxFlutterby: { - name: "Maxinsecto", - effect: "Ataque de tipo Bicho ejecutado por un Pokémon Dinamax. Reduce el Ataque Especial del objetivo.", - }, - maxLightning: { - name: "Maxitormenta", - effect: "Ataque de tipo Eléctrico ejecutado por un Pokémon Dinamax. Crea un campo eléctrico durante cinco turnos.", - }, - maxStrike: { - name: "Maxiataque", - effect: "Ataque de tipo Normal ejecutado por un Pokémon Dinamax. Reduce la Velocidad del objetivo.", - }, - maxKnuckle: { - name: "Maxipuño", - effect: "Ataque de tipo Lucha ejecutado por un Pokémon Dinamax. Aumenta el Ataque de tu bando.", - }, - maxPhantasm: { - name: "Maxiespectro", - effect: "Ataque de tipo Fantasma ejecutado por un Pokémon Dinamax. Reduce la Defensa del objetivo.", - }, - maxHailstorm: { - name: "Maxihelada", - effect: "Ataque de tipo Hielo ejecutado por un Pokémon Dinamax. Crea una tormenta de granizo que dura cinco turnos.", - }, - maxOoze: { - name: "Maxiácido", - effect: "Ataque de tipo Veneno ejecutado por un Pokémon Dinamax. Aumenta el Ataque Especial de tu bando.", - }, - maxGeyser: { - name: "Maxichorro", - effect: "Ataque de tipo Agua ejecutado por un Pokémon Dinamax. Desata un aguacero que dura cinco turnos.", - }, - maxAirstream: { - name: "Maxiciclón", - effect: "Ataque de tipo Volador ejecutado por un Pokémon Dinamax. Aumenta la Velocidad de tu bando.", - }, - maxStarfall: { - name: "Maxiestela", - effect: "Ataque de tipo Hada ejecutado por un Pokémon Dinamax. Crea un campo de niebla durante cinco turnos.", - }, - maxWyrmwind: { - name: "Maxidraco", - effect: "Ataque de tipo Dragón ejecutado por un Pokémon Dinamax. Reduce el Ataque del objetivo.", - }, - maxMindstorm: { - name: "Maxionda", - effect: "Ataque de tipo Psíquico ejecutado por un Pokémon Dinamax. Crea un campo psíquico durante cinco turnos.", - }, - maxRockfall: { - name: "Maxilito", - effect: "Ataque de tipo Roca ejecutado por un Pokémon Dinamax. Levanta una tormenta de arena que dura cinco turnos.", - }, - maxQuake: { - name: "Maxitemblor", - effect: "Ataque de tipo Tierra ejecutado por un Pokémon Dinamax. Aumenta la Defensa Especial de tu bando.", - }, - maxDarkness: { - name: "Maxisombra", - effect: "Ataque de tipo Siniestro ejecutado por un Pokémon Dinamax. Reduce la Defensa Especial del objetivo.", - }, - maxOvergrowth: { - name: "Maxiflora", - effect: "Ataque de tipo Planta ejecutado por un Pokémon Dinamax. Crea un campo de hierba durante cinco turnos.", - }, - maxSteelspike: { - name: "Maximetal", - effect: "Ataque de tipo Acero ejecutado por un Pokémon Dinamax. Aumenta la Defensa de tu bando.", - }, - clangorousSoul: { - name: "Estruendo Escama", - effect: "Utiliza parte de los PS propios para subir sus características.", - }, - bodyPress: { - name: "Plancha Corporal", - effect: "El usuario usa el cuerpo para lanzar su ataque e infligir un daño directamente proporcional a su Defensa.", - }, - decorate: { - name: "Decoración", - effect: "Aumenta mucho el Ataque y el Ataque Especial del objetivo al decorarlo.", - }, - drumBeating: { - name: "Batería Asalto", - effect: "El usuario controla un tocón mediante la percusión y al atacar reduce la Velocidad del objetivo.", - }, - snapTrap: { - name: "Cepo", - effect: "Cepo que atrapa al objetivo durante cuatro o cinco turnos y le causa daño mientras se encuentra preso.", - }, - pyroBall: { - name: "Balón Ígneo", - effect: "El usuario prende una pequeña piedra para crear una bola de fuego con la que ataca al objetivo. Puede causar quemaduras.", - }, - behemothBlade: { - name: "Tajo Supremo", - effect: "El usuario se convierte en una espada gigante para rebanar con vigor al objetivo.", - }, - behemothBash: { - name: "Embate Supremo", - effect: "El usuario se convierte en un escudo gigante para golpear con vigor al objetivo.", - }, - auraWheel: { - name: "Rueda Aural", - effect: "La energía que acumula en las mejillas le sirve para atacar y aumentar su Velocidad. Este movimiento cambia de tipo según la forma que adopte Morpeko.", - }, - breakingSwipe: { - name: "Vasto Impacto", - effect: "El usuario sacude violentamente su enorme cola para golpear al objetivo y reducir su Ataque a la par.", - }, - branchPoke: { - name: "Punzada Rama", - effect: "Ataca pinchando al objetivo con una rama afilada.", - }, - overdrive: { - name: "Amplificador", - effect: "El usuario rasguea la guitarra o el bajo para generar enormes vibraciones de intensa reverberación con las que ataca al objetivo.", - }, - appleAcid: { - name: "Ácido Málico", - effect: "Ataca al objetivo con el fluido corrosivo que desprende una manzana ácida, lo que también reduce la Defensa Especial de este.", - }, - gravApple: { - name: "Fuerza G", - effect: "El usuario ataca haciendo caer una manzana desde gran altura. Reduce la Defensa del objetivo.", - }, - spiritBreak: { - name: "Choque Anímico", - effect: "El usuario ataca al objetivo con tal ímpetu que acaba minando su moral y, en consecuencia, reduce su Ataque Especial.", - }, - strangeSteam: { - name: "Cautivapor", - effect: "Desprende un humo con el que ataca al objetivo, que puede acabar confundido.", - }, - lifeDew: { - name: "Gota Vital", - effect: "Vierte un agua misteriosa y balsámica que restaura tanto sus propios PS como los de aquellos aliados presentes en el terreno de combate.", - }, - obstruct: { - name: "Obstrucción", - effect: "Frena todos los ataques, pero puede fallar si se usa repetidamente. Reduce mucho la Defensa de quien ejecute un movimiento de contacto contra el usuario.", - }, - falseSurrender: { - name: "Irreverencia", - effect: "El usuario finge hacer una reverencia y aprovecha la ocasión para ensartar al objetivo con su cabello alborotado. No falla nunca.", - }, - meteorAssault: { - name: "Asalto Estelar", - effect: "El usuario agita violentamente su grueso puerro para atacar, pero el mareo que le provocan las sacudidas le obliga a descansar en el siguiente turno.", - }, - eternabeam: { - name: "Rayo Infinito", - effect: "Este es el mayor ataque de Eternatus una vez adquirida su forma original. No puede moverse en el turno siguiente.", - }, - steelBeam: { - name: "Metaláser", - effect: "Utiliza el acero de su cuerpo para disparar un potente rayo. El usuario se hiere a sí mismo.", - }, - expandingForce: { - name: "Vasta Fuerza", - effect: "El usuario ataca al objetivo con sus poderes psíquicos. Cuando se usa en conjunción con un campo psíquico, aumenta su potencia e inflige daño a todos los rivales.", - }, - steelRoller: { - name: "Allanador Férreo", - effect: "El usuario lanza su ataque y destruye el campo activo en el terreno de combate, y falla si no hay ninguno en ese momento.", - }, - scaleShot: { - name: "Ráfaga Escamas", - effect: "Lanza escamas al objetivo de dos a cinco veces seguidas. Aumenta la Velocidad del usuario, pero reduce su Defensa.", - }, - meteorBeam: { - name: "Rayo Meteórico", - effect: "El usuario dedica el primer turno a aumentar su Ataque Especial acumulando energía cósmica y lanza su ofensiva contra el objetivo en el segundo.", - }, - shellSideArm: { - name: "Moluscañón", - effect: "El usuario lanza un ataque físico o especial en función de cuál inflija más daño. Puede envenenar al objetivo.", - }, - mistyExplosion: { - name: "Bruma Explosiva", - effect: "El usuario ataca a todos a su alrededor, pero se debilita de inmediato. La potencia del movimiento aumenta si el terreno está cubierto por un campo de niebla.", - }, - grassyGlide: { - name: "Fitoimpulso", - effect: "Ataca al objetivo deslizándose sobre el terreno de combate. Este movimiento tiene prioridad alta cuando el terreno está cubierto por un campo de hierba.", - }, - risingVoltage: { - name: "Alto Voltaje", - effect: "Ataca con una descarga eléctrica que surge del terreno de combate. La potencia del movimiento se duplica si el rival se ve afectado por un campo eléctrico.", - }, - terrainPulse: { - name: "Pulso de Campo", - effect: "El usuario ataca aprovechando la energía del campo activo, que determina tanto el tipo como la potencia del movimiento.", - }, - skitterSmack: { - name: "Golpe Rastrero", - effect: "Ataca al objetivo por la espalda de forma subrepticia y, además, reduce su Ataque Especial.", - }, - burningJealousy: { - name: "Envidia Ardiente", - effect: "Ataca al objetivo con la energía generada por la envidia y causa quemaduras a los Pokémon cuyas características hayan aumentado en ese turno.", - }, - lashOut: { - name: "Desahogo", - effect: "Ataca al rival presa de la rabia. Si el usuario ha sufrido una reducción de características en ese turno, la potencia del movimiento se duplica.", - }, - poltergeist: { - name: "Poltergeist", - effect: "El usuario ataca utilizando el objeto que lleva el rival. Si no tiene ninguno equipado, el movimiento falla.", - }, - corrosiveGas: { - name: "Gas Corrosivo", - effect: "El usuario libera un gas cáustico que envuelve a todos los que se encuentren alrededor y derrite por completo los objetos que lleven equipados.", - }, - coaching: { - name: "Motivación", - effect: "El usuario imparte indicaciones precisas a sus aliados, que ven aumentados su Ataque y su Defensa.", - }, - flipTurn: { - name: "Viraje", - effect: "Tras atacar, el usuario da paso a toda prisa a otro Pokémon del equipo.", - }, - tripleAxel: { - name: "Triple Axel", - effect: "Propina hasta tres patadas seguidas, la potencia de las cuales aumenta cada vez que acierta.", - }, - dualWingbeat: { - name: "Ala Bis", - effect: "Ataca al adversario golpeándolo dos veces con las alas.", - }, - scorchingSands: { - name: "Arenas Ardientes", - effect: "Ataca al objetivo arrojándole arena a temperaturas muy elevadas. Puede causar quemaduras.", - }, - jungleHealing: { - name: "Cura Selvática", - effect: "Al entrar en plena armonía con la selva, el usuario cura problemas de estado y restaura PS no solo de sí mismo, sino también de los aliados presentes en el terreno.", - }, - wickedBlow: { - name: "Golpe Oscuro", - effect: "Golpe devastador que requiere un absoluto dominio de las artes siniestras. Siempre asesta un golpe crítico.", - }, - surgingStrikes: { - name: "Azote Torrencial", - effect: "El usuario, dominador absoluto del líquido elemento, golpea hasta tres veces con movimientos fluidos. Siempre asesta un golpe crítico.", - }, - thunderCage: { - name: "Electrojaula", - effect: "El objetivo queda atrapado en una jaula electrificada que permanece en el terreno de cuatro a cinco turnos.", - }, - dragonEnergy: { - name: "Dracoenergía", - effect: "El usuario convierte su fuerza vital en una energía con la que ataca al objetivo. Cuantos menos PS tenga el usuario, menor será la potencia del movimiento.", - }, - freezingGlare: { - name: "Mirada Heladora", - effect: "A través de sus ojos emite poderes psíquicos con los que ataca al objetivo, al que puede llegar a congelar.", - }, - fieryWrath: { - name: "Furia Candente", - effect: "El usuario convierte su ira en un aura flamígera para lanzar su ataque. Puede amedrentar al objetivo.", - }, - thunderousKick: { - name: "Patada Relámpago", - effect: "El usuario desconcierta al objetivo con movimientos centelleantes y le propina una patada que, además, reduce su Defensa.", - }, - glacialLance: { - name: "Lanza Glacial", - effect: "El usuario ataca al objetivo lanzándole un carámbano de hielo envuelto en una ventisca.", - }, - astralBarrage: { - name: "Orbes Espectro", - effect: "El usuario ataca al objetivo lanzándole una ingente cantidad de pequeños fantasmas.", - }, - eerieSpell: { - name: "Conjuro Funesto", - effect: "El usuario ataca con un poder psíquico de inmensa potencia y elimina 3 PP del último movimiento que haya usado el objetivo.", - }, - direClaw: { - name: "Garra Nociva", - effect: "Ataca al objetivo con unas garras letales que pueden envenenarlo, paralizarlo o dormirlo.", - }, - psyshieldBash: { - name: "Asalto Barrera", - effect: "El usuario ataca envuelto en una energía psíquica que además aumenta su Defensa.", - }, - powerShift: { - name: "Cambiapoder", - effect: "Intercambia su Ataque por su Defensa.", - }, - stoneAxe: { - name: "Hachazo Pétreo", - effect: "Ataca con un hacha de piedra y, al hacerlo, se desprenden fragmentos que rodean al objetivo.", - }, - springtideStorm: { - name: "Ciclón Primavera", - effect: "Desata una tormenta de amor y odio con la que envuelve y ataca al objetivo. También puede reducir su Ataque.", - }, - mysticalPower: { - name: "Poder Místico", - effect: "Ataca desatando un misterioso poder, que también aumenta su Ataque Especial.", - }, - ragingFury: { - name: "Erupción de Ira", - effect: "El usuario ataca con unas violentas llamas de dos a tres turnos seguidos y, después, se queda confuso.", - }, - waveCrash: { - name: "Envite Acuático", - effect: "El usuario se envuelve en agua y embiste contra el objetivo, pero también se hiere seriamente a sí mismo.", - }, - chloroblast: { - name: "Clorofiláser", - effect: "El usuario concentra clorofila y la dispara en forma de rayo, pero también se hiere a sí mismo.", - }, - mountainGale: { - name: "Viento Carámbano", - effect: "Ataca con unos carámbanos grandes como icebergs que pueden amedrentar al objetivo.", - }, - victoryDance: { - name: "Danza Triunfal", - effect: "Ejecuta una danza frenética que invoca la victoria y aumenta el Ataque, la Defensa y la Velocidad.", - }, - headlongRush: { - name: "Arremetida", - effect: "El usuario arremete con todas sus fuerzas, pero se reducen su Defensa y su Defensa Especial.", - }, - barbBarrage: { - name: "Mil Púas Tóxicas", - effect: "Dispara un sinfín de púas tóxicas que pueden envenenar al objetivo. La potencia del movimiento se duplica si este ya está envenenado.", - }, - esperWing: { - name: "Ala Aural", - effect: "Corta con unas alas imbuidas de aura. Suele asestar un golpe crítico y aumenta la Velocidad del usuario.", - }, - bitterMalice: { - name: "Rencor Reprimido", - effect: "Ataca al objetivo sometiéndolo a su frío rencor y reduce su Ataque.", - }, - shelter: { - name: "Retracción", - effect: "La piel del usuario se vuelve dura como un escudo de acero, lo que aumenta mucho su Defensa.", - }, - tripleArrows: { - name: "Triple Flecha", - effect: "Propina un talonazo y lanza tres flechas. Suele asestar un golpe crítico y puede reducir la Defensa del objetivo o amedrentarlo.", - }, - infernalParade: { - name: "Marcha Espectral", - effect: "Lanza innumerables bolas de fuego al objetivo que pueden causar quemaduras. La potencia del movimiento se duplica si este ya sufre un problema de estado.", - }, - ceaselessEdge: { - name: "Tajo Metralla", - effect: "Ataca con una espada de conchas y, al hacerlo, se esparcen fragmentos a modo de metralla a los pies del objetivo.", - }, - bleakwindStorm: { - name: "Vendaval Gélido", - effect: "Ataca con un viento muy frío que estremece el cuerpo y la mente y que, además, puede reducir la Velocidad del objetivo.", - }, - wildboltStorm: { - name: "Electormenta", - effect: "Invoca una tormenta eléctrica que ataca al objetivo con fuertes vientos y relámpagos y puede paralizarlo.", - }, - sandsearStorm: { - name: "Simún de Arena", - effect: "Ataca al objetivo envolviéndolo en unas arenas tórridas y un fuerte vendaval que pueden causar quemaduras.", - }, - lunarBlessing: { - name: "Plegaria Lunar", - effect: "Dedica una oración a la luna creciente que restaura los PS y cura los problemas de estado del bando del usuario.", - }, - takeHeart: { - name: "Bálsamo Osado", - effect: "El usuario se envalentona y se cura de los problemas de estado. Además, aumenta su Ataque Especial y su Defensa Especial.", - }, - gMaxWildfire: { - name: "Gigallamarada", - effect: "Ataque de tipo Fuego ejecutado por un Charizard Gigamax. Inflige daño durante cuatro turnos.", - }, - gMaxBefuddle: { - name: "Gigaestupor", - effect: "Ataque de tipo Bicho ejecutado por un Butterfree Gigamax. Envenena, paraliza o duerme al objetivo.", - }, - gMaxVoltCrash: { - name: "Gigatronada", - effect: "Ataque de tipo Eléctrico ejecutado por un Pikachu Gigamax. Paraliza al objetivo.", - }, - gMaxGoldRush: { - name: "Gigamonedas", - effect: "Ataque de tipo Normal ejecutado por un Meowth Gigamax. Confunde al objetivo y aumenta la recompensa recibida tras el combate.", - }, - gMaxChiStrike: { - name: "Gigapuñición", - effect: "Ataque de tipo Lucha ejecutado por un Machamp Gigamax. Aumenta las posibilidades de que el usuario y sus aliados asesten un golpe crítico.", - }, - gMaxTerror: { - name: "Gigaaparición", - effect: "Ataque de tipo Fantasma ejecutado por un Gengar Gigamax. Impide que el objetivo sea cambiado por otro.", - }, - gMaxResonance: { - name: "Gigamelodía", - effect: "Ataque de tipo Hielo ejecutado por un Lapras Gigamax. Reduce el daño recibido durante cinco turnos.", - }, - gMaxCuddle: { - name: "Gigaternura", - effect: "Ataque de tipo Normal ejecutado por un Eevee Gigamax. Hace que el objetivo se enamore.", - }, - gMaxReplenish: { - name: "Gigarreciclaje", - effect: "Ataque de tipo Normal ejecutado por un Snorlax Gigamax. Restaura las bayas que se hayan consumido.", - }, - gMaxMalodor: { - name: "Gigapestilencia", - effect: "Ataque de tipo Veneno ejecutado por un Garbodor Gigamax. Envenena al objetivo.", - }, - gMaxStonesurge: { - name: "Gigatrampa Rocas", - effect: "Ataque de tipo Agua ejecutado por un Drednaw Gigamax. Esparce rocas afiladas por el terreno de combate.", - }, - gMaxWindRage: { - name: "Gigahuracán", - effect: "Ataque de tipo Volador ejecutado por un Corviknight Gigamax. Es capaz de destruir barreras como las creadas por Pantalla de Luz y Reflejo.", - }, - gMaxStunShock: { - name: "Gigadescarga", - effect: "Ataque de tipo Eléctrico ejecutado por un Toxtricity Gigamax. Envenena o paraliza al objetivo.", - }, - gMaxFinale: { - name: "Gigacolofón", - effect: "Ataque de tipo Hada ejecutado por un Alcremie Gigamax. Restaura los PS de tu bando.", - }, - gMaxDepletion: { - name: "Gigadesgaste", - effect: "Ataque de tipo Dragón ejecutado por un Duraludon Gigamax. Reduce PP del último movimiento usado por el objetivo.", - }, - gMaxGravitas: { - name: "Gigabóveda", - effect: "Ataque de tipo Psíquico ejecutado por un Orbeetle Gigamax. Intensifica la fuerza de gravedad durante cinco turnos.", - }, - gMaxVolcalith: { - name: "Gigarroca Ígnea", - effect: "Ataque de tipo Roca ejecutado por un Coalossal Gigamax. Inflige daño durante cuatro turnos.", - }, - gMaxSandblast: { - name: "Gigapolvareda", - effect: "Ataque de tipo Tierra ejecutado por un Sandaconda Gigamax. Enreda al objetivo en un remolino de arena de cuatro a cinco turnos.", - }, - gMaxSnooze: { - name: "Gigasopor", - effect: "Ataque de tipo Siniestro ejecutado por un Grimmsnarl Gigamax. Induce al sueño al objetivo en el siguiente turno.", - }, - gMaxTartness: { - name: "Gigacorrosión", - effect: "Ataque de tipo Planta ejecutado por un Flapple Gigamax. Reduce la Evasión del objetivo.", - }, - gMaxSweetness: { - name: "Giganéctar", - effect: "Ataque de tipo Planta ejecutado por un Appletun Gigamax. Cura los problemas de estado de tu bando.", - }, - gMaxSmite: { - name: "Gigacastigo", - effect: "Ataque de tipo Hada ejecutado por un Hatterene Gigamax. Confunde al objetivo.", - }, - gMaxSteelsurge: { - name: "Gigatrampa Acero", - effect: "Ataque de tipo Acero ejecutado por un Copperajah Gigamax. Esparce púas de acero por el terreno de combate.", - }, - gMaxMeltdown: { - name: "Gigafundido", - effect: "Ataque de tipo Acero ejecutado por un Melmetal Gigamax. Impide al objetivo usar el mismo movimiento dos veces seguidas.", - }, - gMaxFoamBurst: { - name: "Gigaespuma", - effect: "Ataque de tipo Agua ejecutado por un Kingler Gigamax. Reduce mucho la Velocidad del objetivo.", - }, - gMaxCentiferno: { - name: "Gigacienfuegos", - effect: "Ataque de tipo Fuego ejecutado por un Centiskorch Gigamax. Un aro de fuego atrapa al objetivo de cuatro a cinco turnos.", - }, - gMaxVineLash: { - name: "Gigalianas", - effect: "Ataque de tipo Planta ejecutado por un Venusaur Gigamax. Inflige daño durante cuatro turnos.", - }, - gMaxCannonade: { - name: "Gigacañonazo", - effect: "Ataque de tipo Agua ejecutado por un Blastoise Gigamax. Inflige daño durante cuatro turnos.", - }, - gMaxDrumSolo: { - name: "Gigarredoble", - effect: "Ataque de tipo Planta ejecutado por un Rillaboom Gigamax. Ignora la habilidad del objetivo.", - }, - gMaxFireball: { - name: "Gigaesfera Ígnea", - effect: "Ataque de tipo Fuego ejecutado por un Cinderace Gigamax. Ignora la habilidad del objetivo.", - }, - gMaxHydrosnipe: { - name: "Gigadisparo", - effect: "Ataque de tipo Agua ejecutado por un Inteleon Gigamax. Ignora la habilidad del objetivo.", - }, - gMaxOneBlow: { - name: "Gigagolpe Brusco", - effect: "Ataque de tipo Siniestro ejecutado por un Urshifu Gigamax. Propina un único golpe que acierta al objetivo aunque haya usado Maxibarrera.", - }, - gMaxRapidFlow: { - name: "Gigagolpe Fluido", - effect: "Ataque de tipo Agua ejecutado por un Urshifu Gigamax. Propina golpes sucesivos que aciertan al objetivo aunque haya usado Maxibarrera.", - }, - teraBlast: { - name: "Teraexplosión", - effect: "Si el usuario se ha teracristalizado, ataca con la energía de su teratipo. Compara sus valores de Ataque y Ataque Especial para infligir daño con el más alto de los dos.", - }, - silkTrap: { - name: "Telatrampa", - effect: "Tiende una trampa sedosa que protege al usuario de los ataques al tiempo que reduce la Velocidad de cualquier Pokémon con el que entre en contacto.", - }, - axeKick: { - name: "Patada Hacha", - effect: "Lanza una patada al aire para, acto seguido, golpear con el talón. Si falla, se hiere a sí mismo. Puede confundir al objetivo.", - }, - lastRespects: { - name: "Homenaje Póstumo", - effect: "Ataca para vengar a sus compañeros caídos y aplacar su desazón. Cuantos más miembros del equipo se hayan debilitado, mayor será la potencia del movimiento.", - }, - luminaCrash: { - name: "Fotocolisión", - effect: "Ataca proyectando una extraña luz que afecta a la mente. Reduce mucho la Defensa Especial del objetivo.", - }, - orderUp: { - name: "Oído Cocina", - effect: "Ataca con porte gallardo. Si lleva un Tatsugiri en la boca, aumenta una de sus características en función de la forma de este último.", - }, - jetPunch: { - name: "Puño Jet", - effect: "Se envuelve el puño con un torrente y propina un golpe a tal velocidad que resulta casi imperceptible. Este movimiento tiene prioridad alta.", - }, - spicyExtract: { - name: "Extracto Picante", - effect: "Libera un extracto extraordinariamente picante que aumenta mucho el Ataque del objetivo, pero también reduce mucho su Defensa.", - }, - spinOut: { - name: "Quemarrueda", - effect: "Inflige daño al objetivo ejerciendo presión sobre sus extremidades y girando violentamente sobre sí. Reduce mucho la Velocidad del usuario.", - }, - populationBomb: { - name: "Proliferación", - effect: "Los congéneres del usuario se agrupan y ejecutan un ataque conjunto que golpea al objetivo de una a diez veces seguidas.", - }, - iceSpinner: { - name: "Pirueta Helada", - effect: "Se recubre las extremidades con una fina capa de hielo y se abalanza sobre el objetivo girando sobre sí. Destruye el campo activo en el terreno de combate.", - }, - glaiveRush: { - name: "Asalto Espadón", - effect: "Embiste de forma temeraria con todo el cuerpo. Los ataques que reciba antes de su siguiente turno no fallarán y causarán el doble de daño.", - }, - revivalBlessing: { - name: "Plegaria Vital", - effect: "Pronuncia una benévola oración que revive a un Pokémon del equipo que se haya debilitado y restaura la mitad de sus PS máximos.", - }, - saltCure: { - name: "Salazón", - effect: "Deja en salazón al objetivo, que pierde PS cada turno. Afecta especialmente a Pokémon de tipo Acero y tipo Agua.", - }, - tripleDive: { - name: "Triple Inmersión", - effect: "Ejecuta una inmersión triple en perfecta sincronía que golpea al objetivo con salpicaduras de agua tres veces seguidas.", - }, - mortalSpin: { - name: "Giro Mortífero", - effect: "Ataque giratorio que envenena al objetivo y anula los efectos de movimientos como Atadura, Constricción y Drenadoras.", - }, - doodle: { - name: "Decalcomanía", - effect: "Calca la esencia misma del objetivo para atribuir su habilidad a sí mismo y a sus aliados.", - }, - filletAway: { - name: "Deslome", - effect: "Aumenta mucho el Ataque, el Ataque Especial y la Velocidad del usuario a costa de parte de sus PS.", - }, - kowtowCleave: { - name: "Genufendiente", - effect: "Se postra en ademán de reverencia para hacer que el objetivo baje la guardia y aprovecha el descuido para atacar. No falla nunca.", - }, - flowerTrick: { - name: "Truco Floral", - effect: "Ataca al objetivo lanzándole un ramo de flores trucado. No falla nunca y siempre asesta un golpe crítico.", - }, - torchSong: { - name: "Canto Ardiente", - effect: "Expele tórridas llamaradas como si entonara una canción y abrasa al objetivo con ellas. Aumenta el Ataque Especial del usuario.", - }, - aquaStep: { - name: "Danza Acuática", - effect: "Juguetea con el objetivo mientras ejecuta una elegante y fluida danza y le inflige daño. Aumenta la Velocidad del usuario.", - }, - ragingBull: { - name: "Furia Taurina", - effect: "Embiste con tremenda fiereza. Este movimiento cambia de tipo en función de la variedad del usuario y es capaz de destruir barreras como Pantalla de Luz y Reflejo.", - }, - makeItRain: { - name: "Fiebre Dorada", - effect: "El usuario ataca arrojando una generosa cantidad de monedas, pero su Ataque Especial se ve reducido. Al finalizar el combate, las recupera en forma de ganancias.", - }, - psyblade: { - name: "Psicohojas", - effect: "El usuario rebana al objetivo con una espada inmaterial. Cuando se usa en conjunción con un campo eléctrico, la potencia del movimiento aumenta un 50 %.", - }, - hydroSteam: { - name: "Hidrovapor", - effect: "Vierte agua hirviendo sobre el objetivo. Cuando hace sol, la potencia del movimiento aumenta un 50 % en lugar de reducirse.", - }, - ruination: { - name: "Calamidad", - effect: "Provoca una catástrofe devastadora que reduce a la mitad los PS del objetivo.", - }, - collisionCourse: { - name: "Nitrochoque", - effect: "El usuario choca contra el suelo mientras se transforma y provoca una explosión primigenia. La potencia del movimiento aumenta si el ataque es supereficaz.", - }, - electroDrift: { - name: "Electroderrape", - effect: "Se abalanza sobre el objetivo mientras se transforma y lo atraviesa con electricidad futurista. La potencia del movimiento aumenta si el ataque es supereficaz.", - }, - shedTail: { - name: "Autotomía", - effect: "El usuario se cambia por otro Pokémon del equipo, pero antes utiliza parte de los PS propios para crear un sustituto para su relevo.", - }, - chillyReception: { - name: "Fría Acogida", - effect: "El usuario se cambia por otro Pokémon del equipo, pero antes cuenta un chiste que tiene una acogida tan fría que hace que nieve durante cinco turnos.", - }, - tidyUp: { - name: "Limpieza General", - effect: "Efectúa una limpieza a fondo que anula los efectos de Púas, Trampa Rocas, Red Viscosa, Púas Tóxicas y Sustituto. Aumenta el Ataque y la Velocidad del usuario.", - }, - snowscape: { - name: "Paisaje Nevado", - effect: "Desata una nevada que dura cinco turnos y aumenta la Defensa de los Pokémon de tipo Hielo.", - }, - pounce: { - name: "Brinco", - effect: "Ataca abalanzándose sobre el objetivo y le reduce la Velocidad.", - }, - trailblaze: { - name: "Abrecaminos", - effect: "Ataca de pronto como si saltara desde la hierba alta. El usuario se mueve con gran agilidad y aumenta su Velocidad.", - }, - chillingWater: { - name: "Agua Fría", - effect: "Ataca al objetivo rociándolo con un agua gélida y desalentadora que reduce su Ataque.", - }, - hyperDrill: { - name: "Hipertaladro", - effect: "El usuario hace rotar la parte puntiaguda de su cuerpo a gran velocidad para atacar al objetivo. Pasa por alto los efectos de movimientos como Protección o Detección.", - }, - twinBeam: { - name: "Láser Doble", - effect: "Ataca emitiendo dos misteriosos haces lumínicos por los ojos que infligen daño dos veces seguidas.", - }, - rageFist: { - name: "Puño Furia", - effect: "Convierte su rabia en energía para atacar. Cuantos más golpes haya recibido el usuario, mayor será la potencia del movimiento.", - }, - armorCannon: { - name: "Cañón Armadura", - effect: "Se deshace de su armadura y arroja las partes al objetivo cuales proyectiles ardientes. Reduce la Defensa y la Defensa Especial del usuario.", - }, - bitterBlade: { - name: "Espada Lamento", - effect: "Imbuye la punta de su espada con su desazón por el mundo y asesta una estocada llena de rencor. El usuario recupera la mitad de los PS del daño que produce.", - }, - doubleShock: { - name: "Electropalmas", - effect: "Libera toda la electricidad de su cuerpo para lanzar un ataque devastador. Tras ejecutar el movimiento, el usuario deja de ser de tipo Eléctrico.", - }, - gigatonHammer: { - name: "Martillo Colosal", - effect: "El usuario se ayuda de su propio peso corporal para propinar un golpe con un enorme martillo. Este movimiento no puede usarse dos veces seguidas.", - }, - comeuppance: { - name: "Resarcimiento", - effect: "Devuelve al rival el último ataque recibido, pero con mucha más fuerza.", - }, - aquaCutter: { - name: "Tajo Acuático", - effect: "Expele agua a presión con la que corta al objetivo como si de una hoja se tratara. Suele asestar un golpe crítico.", - }, - blazingTorque: { - name: "Pirochoque", - effect: "The user revs their blazing engine into the target. This may also leave the target with a burn.", - }, - wickedTorque: { - name: "Ominochoque", - effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep.", - }, - noxiousTorque: { - name: "Ponzochoque", - effect: "The user revs their poisonous engine into the target. This may also poison the target.", - }, - combatTorque: { - name: "Pugnachoque", - effect: "The user revs their engine forcefully into the target. This may also leave the target with paralysis.", - }, - magicalTorque: { - name: "Feerichoque", - effect: "The user revs their fae-like engine into the target. This may also confuse the target.", - }, - bloodMoon: { - name: "Luna Roja", - effect: "Ataca canalizando toda su fuerza y proyectándola a través de una luna llena de color rojo intenso. Este movimiento no puede usarse dos veces seguidas.", - }, - matchaGotcha: { - name: "Cañón Batidor", - effect: "Rocía al objetivo con té recién batido y recupera la mitad de los PS del daño que produce. Puede causar quemaduras.", - }, - syrupBomb: { - name: "Bomba Caramelo", - effect: "Impregna al objetivo con una explosión de su viscoso néctar y lo carameliza, lo que hace que su Velocidad se reduzca progresivamente durante tres turnos.", - }, - ivyCudgel: { - name: "Garrote Liana", - effect: "Golpea con un garrote que forma enrollando su liana. El tipo del movimiento varía según la máscara que lleve puesta el usuario. Suele asestar un golpe crítico.", - }, - electroShot: { - name: "Electrorrayo", - effect: "Acumula electricidad y aumenta su Ataque Especial en el primer turno y dispara una descarga de alto voltaje en el segundo. Si llueve, puede atacar en el primer turno.", - }, - teraStarstorm: { - name: "Teraclúster", - effect: "Ataca al objetivo irradiando el poder de sus cristales. Si Terapagos usa este movimiento en su Forma Astral, inflige daño a todos los rivales.", - }, - fickleBeam: { - name: "Láser Veleidoso", - effect: "Ataca disparando un haz de luz. En ocasiones, el resto de sus cabezas se unen al ataque. Cuando esto sucede, la potencia del movimiento se duplica.", - }, - burningBulwark: { - name: "Llama Protectora", - effect: "Emplea su ardiente pelaje para protegerse de los ataques y causarle quemaduras al atacante si este usa un movimiento de contacto.", - }, - thunderclap: { - name: "Relámpago Súbito", - effect: "Invoca un rayo que cae sobre el objetivo antes de que este pueda realizar cualquier acción. Falla si el objetivo no está preparando ningún ataque.", - }, - mightyCleave: { - name: "Filo Potente", - effect: "Rebana al objetivo con la luz que ha acumulado en la testa. Permite acertar aunque el objetivo esté protegiéndose.", - }, - tachyonCutter: { - name: "Tajo Taquión", - effect: "Lanza una ráfaga de cuchillas formadas por partículas contra el objetivo y le inflige daño dos veces seguidas. No falla nunca.", - }, - hardPress: { - name: "Prensa Metálica", - effect: "Oprime con los brazos o las pinzas. Cuantos más PS le queden al objetivo, mayor será la potencia del movimiento.", - }, - dragonCheer: { - name: "Bramido Dragón", - effect: "Bramido de dragón que sube la moral de los aliados y aumenta sus probabilidades de asestar un golpe crítico. Es especialmente efectivo con aliados de tipo Dragón.", - }, - alluringVoice: { - name: "Canto Encantador", - effect: "Ataca con un canto angelical y, si las características del objetivo han aumentado en ese turno, lo deja confuso.", - }, - temperFlare: { - name: "Cólera Ardiente", - effect: "Arremete contra el objetivo tras dejarse llevar por la ira. Su potencia se duplica si el movimiento del usuario falló en el turno anterior.", - }, - supercellSlam: { - name: "Plancha Voltaica", - effect: "El usuario electrifica su cuerpo y salta en plancha sobre el objetivo. Si falla, se hiere a sí mismo.", - }, - psychicNoise: { - name: "Psicorruido", - effect: "Ataca emitiendo una onda sonora desagradable que impide al objetivo usar movimientos, habilidades y objetos equipados que recuperan PS durante dos turnos.", - }, - upperHand: { - name: "Palma Rauda", - effect: "Se anticipa al objetivo golpeándolo rápidamente con la palma y lo amedrenta. Falla si el objetivo no está preparando un movimiento de prioridad alta.", - }, - malignantChain: { - name: "Cadena Virulenta", - effect: "Apresa al objetivo con una cadena hecha de ponzoña que le inocula toxinas para minarle las fuerzas. Puede envenenar gravemente.", - }, -} as const; diff --git a/src/locales/es/nature.ts b/src/locales/es/nature.json similarity index 80% rename from src/locales/es/nature.ts rename to src/locales/es/nature.json index ddeff5aa0ab..a21fd327ef5 100644 --- a/src/locales/es/nature.ts +++ b/src/locales/es/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "Fuerte", "Lonely": "Huraña", "Brave": "Audaz", @@ -26,4 +24,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Grosera", "Careful": "Cauta", "Quirky": "Rara" -} as const; +} \ No newline at end of file diff --git a/src/locales/es/party-ui-handler.json b/src/locales/es/party-ui-handler.json new file mode 100644 index 00000000000..0e59aee6fd1 --- /dev/null +++ b/src/locales/es/party-ui-handler.json @@ -0,0 +1,47 @@ +{ + "SEND_OUT": "Enviar", + "SUMMARY": "Resumen", + "CANCEL": "Cancelar", + "RELEASE": "Liberar", + "APPLY": "Aplicar", + "TEACH": "Enseñar", + "SPLICE": "Fusionar", + "UNSPLICE": "Separar", + "ACTIVATE": "Activar", + "DEACTIVATE": "Desactivar", + "TRANSFER": "Transferir", + "ALL": "Todo", + "PASS_BATON": "Relevo", + "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\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 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 ítem para transferir.\nUsa < y > para calibrar.", + "selectAnotherPokemonToSplice": "Selecciona otro Pokémon para fusionar.", + "cancel": "Salir", + "able": "Apto", + "notAble": "No apto", + "learned": "Aprendido", + "goodbye": "¡Adiós, {{pokemonName}}!", + "byebye": "¡Chao, {{pokemonName}}!", + "farewell": "¡Hasta luego, {{pokemonName}}!", + "soLong": "¡Nos vemos, {{pokemonName}}!", + "thisIsWhereWePart": "¡Aquí es donde nos despedimos, {{pokemonName}}!", + "illMissYou": "¡Te echaré de menos, {{pokemonName}}!", + "illNeverForgetYou": "¡Nunca te olvidaré, {{pokemonName}}!", + "untilWeMeetAgain": "¡Hasta que nos volvamos a\nencontrar, {{pokemonName}}!", + "sayonara": "¡Sayonara, {{pokemonName}}!", + "smellYaLater": "¡Nos vemos luego, {{pokemonName}}!" +} diff --git a/src/locales/es/party-ui-handler.ts b/src/locales/es/party-ui-handler.ts deleted file mode 100644 index 894ea14bb12..00000000000 --- a/src/locales/es/party-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Send Out", - "SUMMARY": "Summary", - "CANCEL": "Cancel", - "RELEASE": "Release", - "APPLY": "Apply", - "TEACH": "Teach" -} as const; diff --git a/src/locales/es/pokeball.json b/src/locales/es/pokeball.json new file mode 100644 index 00000000000..9eb2a9f0d44 --- /dev/null +++ b/src/locales/es/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "Poké Ball", + "greatBall": "Super Ball", + "ultraBall": "Ultra Ball", + "rogueBall": "Rogue Ball", + "masterBall": "Master Ball", + "luxuryBall": "Lujo Ball" +} \ No newline at end of file diff --git a/src/locales/es/pokeball.ts b/src/locales/es/pokeball.ts deleted file mode 100644 index c9b62cdd9ea..00000000000 --- a/src/locales/es/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Ball", - "greatBall": "Super Ball", - "ultraBall": "Ultra Ball", - "rogueBall": "Rogue Ball", - "masterBall": "Master Ball", - "luxuryBall": "Lujo Ball", -} as const; diff --git a/src/locales/es/pokemon-form-battle.json b/src/locales/es/pokemon-form-battle.json new file mode 100644 index 00000000000..d6eed9e93cc --- /dev/null +++ b/src/locales/es/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "{{pokemonName}} Primigenio", + "gigantamax": "G-Max {{pokemonName}}", + "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 new file mode 100644 index 00000000000..2f70038ad2d --- /dev/null +++ b/src/locales/es/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "Coqueta", + "pikachuCoolCosplay": "Roquera", + "pikachuBeautyCosplay": "Aristócrata", + "pikachuCuteCosplay": "Superstar", + "pikachuSmartCosplay": "Erudita", + "pikachuToughCosplay": "Enmascarada", + "pikachuPartner": "Compañero", + "eeveePartner": "Compañero", + "pichuSpiky": "Picoreja", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "Sol", + "castformRainy": "Lluvia", + "castformSnowy": "Nieve", + "deoxysNormal": "Normal", + "burmyPlant": "Planta", + "burmySandy": "Arena", + "burmyTrash": "Basura", + "shellosEast": "Este", + "shellosWest": "Oeste", + "rotomHeat": "Calor", + "rotomWash": "Lavado", + "rotomFrost": "Frío", + "rotomFan": "Ventilador", + "rotomMow": "Corte", + "giratinaAltered": "Modificada", + "shayminLand": "Tierra", + "basculinRedStriped": "Raya Roja", + "basculinBlueStriped": "Raya Azul", + "basculinWhiteStriped": "Raya Blanca", + "deerlingSpring": "Primavera", + "deerlingSummer": "Verano", + "deerlingAutumn": "Otoño", + "deerlingWinter": "Invierno", + "tornadusIncarnate": "Avatar", + "thundurusIncarnate": "Avatar", + "landorusIncarnate": "Avatar", + "keldeoOrdinary": "Habitual", + "meloettaAria": "Lírica", + "meloettaPirouette": "Danza", + "froakieBattleBond": "Fuerte Afecto", + "scatterbugMeadow": "Floral", + "scatterbugIcySnow": "Polar", + "scatterbugPolar": "Taiga", + "scatterbugTundra": "Tundra", + "scatterbugContinental": "Continental", + "scatterbugGarden": "Vergel", + "scatterbugElegant": "Oriental", + "scatterbugModern": "Moderno", + "scatterbugMarine": "Marino", + "scatterbugArchipelago": "Isleño", + "scatterbugHighPlains": "Estepa", + "scatterbugSandstorm": "Desierto", + "scatterbugRiver": "Oasis", + "scatterbugMonsoon": "Monzón", + "scatterbugSavanna": "Pantano", + "scatterbugSun": "Solar", + "scatterbugOcean": "Océano", + "scatterbugJungle": "Jungla", + "scatterbugFancy": "Fantasía", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Rojo", + "flabebeYellow": "Amarillo", + "flabebeOrange": "Naranja", + "flabebeBlue": "Azul", + "flabebeWhite": "Blanco", + "furfrouHeart": "Corazón", + "furfrouStar": "Estrella", + "furfrouDiamond": "Diamante", + "furfrouDebutante": "Señorita", + "furfrouMatron": "Dama", + "furfrouDandy": "Caballero", + "furfrouLaReine": "Aristócrata", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Faraónico", + "pumpkabooSmall": "Pequeño", + "pumpkabooLarge": "Grande", + "pumpkabooSuper": "Enorme", + "xerneasNeutral": "Relajado", + "xerneasActive": "Activo", + "zygarde50": "Al 50%", + "zygarde10": "Al 10%", + "zygarde50Pc": "Zygarde al 50%", + "zygarde10Pc": "Zygarde al 10%", + "zygardeComplete": "Zygarde Completo", + "oricorioBaile": "Apasionado", + "oricorioPompom": "Animado", + "oricorioPau": "Plácido", + "oricorioSensu": "Refinado", + "rockruffOwnTempo": "Ritmo Propio", + "miniorRedMeteor": "Núcleo Rojo", + "miniorOrangeMeteor": "Núcleo Naranja", + "miniorYellowMeteor": "Núcleo Amarillo", + "miniorGreenMeteor": "Núcleo Verde", + "miniorBlueMeteor": "Núcleo Azul", + "miniorIndigoMeteor": "Núcleo Añil", + "miniorVioletMeteor": "Núcleo Violeta", + "miniorRed": "Rojo", + "miniorOrange": "Naranja", + "miniorYellow": "Amarillo", + "miniorGreen": "Verde", + "miniorBlue": "Azul", + "miniorIndigo": "Añil", + "miniorViolet": "Violeta", + "mimikyuDisguised": "Encubierta", + "mimikyuBusted": "Descubierta", + "magearnaOriginal": "Vetusto", + "marshadowZenith": "Cénit", + "sinisteaPhony": "Falsificada", + "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", + "squawkabillyWhitePlumage": "Plumaje Blanco", + "tatsugiriCurly": "Curvada", + "tatsugiriDroopy": "Lánguida", + "tatsugiriStretchy": "Estirada", + "gimmighoulChest": "Cofre", + "gimmighoulRoaming": "Andante", + "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" +} diff --git a/src/locales/es/pokemon-info-container.json b/src/locales/es/pokemon-info-container.json new file mode 100644 index 00000000000..7159c7eae71 --- /dev/null +++ b/src/locales/es/pokemon-info-container.json @@ -0,0 +1,6 @@ +{ + "moveset": "Movimientos", + "gender": "Género:", + "ability": "Habilid:", + "nature": "Natur:" +} \ No newline at end of file diff --git a/src/locales/es/pokemon-info-container.ts b/src/locales/es/pokemon-info-container.ts deleted file mode 100644 index ad0f951b984..00000000000 --- a/src/locales/es/pokemon-info-container.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Movimientos", - "gender": "Género:", - "ability": "Habilid:", - "nature": "Natur:", - "epic": "Épico", - "rare": "Raro", - "common": "Común" -} as const; diff --git a/src/locales/es/pokemon-info.ts b/src/locales/es/pokemon-info.json similarity index 61% rename from src/locales/es/pokemon-info.ts rename to src/locales/es/pokemon-info.json index 56fd7130c0a..241f5e7c5d0 100644 --- a/src/locales/es/pokemon-info.ts +++ b/src/locales/es/pokemon-info.json @@ -1,24 +1,22 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { +{ + "Stat": { "HP": "PS", "HPshortened": "PS", "ATK": "Ataque", - "ATKshortened": "Ata", + "ATKshortened": "Atq.", "DEF": "Defensa", - "DEFshortened": "Def", - "SPATK": "At. Esp.", - "SPATKshortened": "AtEsp", + "DEFshortened": "Def.", + "SPATK": "Atq. Esp.", + "SPATKshortened": "AtqEs.", "SPDEF": "Def. Esp.", - "SPDEFshortened": "DefEsp", + "SPDEFshortened": "DefEs.", "SPD": "Velocidad", "SPDshortened": "Veloc.", - "ACC": "Accuracy", - "EVA": "Evasiveness" + "ACC": "Precisión", + "EVA": "Evasión", + "HPStat": "PS" }, - - Type: { + "Type": { "UNKNOWN": "Desconocido", "NORMAL": "Normal", "FIGHTING": "Lucha", @@ -38,6 +36,6 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DRAGON": "Dragón", "DARK": "Siniestro", "FAIRY": "Hada", - "STELLAR": "Astral", - }, -} as const; + "STELLAR": "Astral" + } +} diff --git a/src/locales/es/pokemon-summary.json b/src/locales/es/pokemon-summary.json new file mode 100644 index 00000000000..e47335c8394 --- /dev/null +++ b/src/locales/es/pokemon-summary.json @@ -0,0 +1,17 @@ +{ + "pokemonInfo": "Info. Pokémon", + "status": "Estado", + "powerAccuracyCategory": "Potencia\nPrecisión\nCategoría", + "type": "Tipo", + "unknownTrainer": "Desconocido", + "ot": "EO", + "nature": "Naturaleza", + "expPoints": "Puntos Exp.", + "nextLv": "Nv. siguiente", + "cancel": "Salir", + "memoString": "Naturaleza {{natureFragment}},\n{{metFragment}}", + "metFragment": { + "normal": "encontrado al Nv. {{level}},\n{{biome}}.", + "apparently": "aparentemente encontrado al Nv. {{level}},\n{{biome}}." + } +} \ No newline at end of file diff --git a/src/locales/es/pokemon.ts b/src/locales/es/pokemon.json similarity index 99% rename from src/locales/es/pokemon.ts rename to src/locales/es/pokemon.json index 93f13aed8b0..1c2b2cd97a4 100644 --- a/src/locales/es/pokemon.ts +++ b/src/locales/es/pokemon.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { +{ "bulbasaur": "Bulbasaur", "ivysaur": "Ivysaur", "venusaur": "Venusaur", @@ -1082,5 +1080,5 @@ export const pokemon: SimpleTranslationEntries = { "hisui_decidueye": "Decidueye", "paldea_tauros": "Tauros", "paldea_wooper": "Wooper", - "bloodmoon_ursaluna": "Ursaluna", -} as const; + "bloodmoon_ursaluna": "Ursaluna" +} \ No newline at end of file diff --git a/src/locales/es/run-history.json b/src/locales/es/run-history.json new file mode 100644 index 00000000000..99b30586621 --- /dev/null +++ b/src/locales/es/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "¡Victoria!", + "defeatedWild": "Derrotado por ", + "defeatedTrainer": "Derrotado por ", + "defeatedTrainerDouble": "Derrotado por un dúo", + "defeatedRival": "Derrotado por el rival", + "defeated": "Derrotado", + "defeatedWild_female": "Derrotada por ", + "defeatedTrainer_female": "Derrotada por ", + "defeatedTrainerDouble_female": "Derrotada por un dúo", + "defeatedRival_female": "Derrotada por el rival", + "defeated_female": "Derrotada", + "luck": "Suerte", + "score": "Puntuación", + "mode": "Modo", + "challengeRules": "Regla(s)", + "challengeMonoGen1": "Gen I", + "challengeMonoGen2": "Gen II", + "challengeMonoGen3": "Gen III", + "challengeMonoGen4": "Gen IV", + "challengeMonoGen5": "Gen V", + "challengeMonoGen6": "Gen VI", + "challengeMonoGen7": "Gen VII", + "challengeMonoGen8": "Gen VIII", + "challengeMonoGen9": "Gen IX", + "playerItems": "Objetos del jugador", + "personalBest": "¡Récord personal!", + "SPDshortened": "Vel.", + "runInfo": "Info. de partida", + "money": "Dinero", + "runLength": "Duración de partida", + "viewHeldItems": "Objetos equipados", + "hallofFameText": "¡Bienvenido al Hall de la Fama!", + "hallofFameText_female": "¡Bienvenida al Hall de la Fama!", + "viewHallOfFame": "¡Ver Hall de la Fama!", + "viewEndingSplash": "¡Ver la imagen final!" +} \ No newline at end of file diff --git a/src/locales/es/save-slot-select-ui-handler.json b/src/locales/es/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..bcb93a5c2cc --- /dev/null +++ b/src/locales/es/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "¿Sobrescribir los datos en la ranura seleccionada?", + "loading": "Cargando...", + "wave": "Oleada", + "lv": "Nv", + "empty": "Vacío" +} \ No newline at end of file diff --git a/src/locales/es/save-slot-select-ui-handler.ts b/src/locales/es/save-slot-select-ui-handler.ts deleted file mode 100644 index 645afd453a9..00000000000 --- a/src/locales/es/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "¿Sobrescribir los datos en la ranura seleccionada?", - "loading": "Cargando...", - "wave": "Oleada", - "lv": "Nv", - "empty": "Vacío", -} as const; diff --git a/src/locales/es/settings.json b/src/locales/es/settings.json new file mode 100644 index 00000000000..dc441d48eb8 --- /dev/null +++ b/src/locales/es/settings.json @@ -0,0 +1,107 @@ +{ + "boy": "Chico", + "girl": "Chica", + "general": "General", + "display": "Pantalla", + "audio": "Audio", + "gamepad": "Mando", + "keyboard": "Teclado", + "gameSpeed": "Veloc. del juego", + "hpBarSpeed": "Veloc. barra PS", + "expGainsSpeed": "Veloc. de EXP", + "expPartyDisplay": "Mostrar EXP del Equipo", + "skipSeenDialogues": "Saltar diálogos leídos", + "battleStyle": "Estilo de lucha", + "enableRetries": "Activar reintento", + "hideIvs": "Ocultar escáner de IVs", + "tutorials": "Tutoriales", + "touchControls": "Control táctil", + "vibrations": "Vibración", + "normal": "Normal", + "fast": "+1", + "faster": "+2", + "skip": "Saltar", + "levelUpNotifications": "Aumentos de nivel", + "on": "Sí", + "off": "No", + "switch": "Cambiar", + "set": "Mantener", + "auto": "Auto.", + "disabled": "Desact.", + "language": "Idioma", + "change": "Cambiar", + "uiTheme": "Color UI", + "default": "Predet.", + "legacy": "Clásico", + "windowType": "Ventana", + "moneyFormat": "Formato dinero", + "damageNumbers": "Cifras de daño", + "simple": "Simple", + "fancy": "Elegante", + "abbreviated": "Abreviado", + "moveAnimations": "Animación de movs.", + "showStatsOnLevelUp": "Estadísticas al aum. nivel", + "candyUpgradeNotification": "Aviso de caramelos", + "passivesOnly": "Solo pasivas", + "candyUpgradeDisplay": "Muestra de caramelos", + "icon": "Icono", + "animation": "Animación", + "moveInfo": "Info. de movimientos", + "showMovesetFlyout": "Descripción de movimientos", + "showArenaFlyout": "Descripción de escenarios", + "showTimeOfDayWidget": "Mostrar hora del día", + "timeOfDayAnimation": "Animación hora del día", + "bounce": "Rebote", + "timeOfDay_back": "Vuelta", + "spriteSet": "Set de sprites", + "consistent": "Consistente", + "mixedAnimated": "Mixto", + "fusionPaletteSwaps": "Colores de fusión", + "playerGender": "Género del jugador", + "typeHints": "Pistas de tipos", + "masterVolume": "Volumen total", + "bgmVolume": "Volumen música", + "fieldVolume": "Volumen escenario", + "seVolume": "Volumen efectos", + "uiVolume": "Volumen sistema", + "musicPreference": "Preferencia musical", + "mixed": "Mixta", + "gamepadPleasePlug": "Conecta un mando o pulsa un botón", + "delete": "Eliminar", + "keyboardPleasePress": "Pulsa una tecla de tu teclado", + "reset": "Restablecer", + "requireReload": "Requiere reinicio", + "action": "Acción", + "back": "Atrás", + "pressToBind": "Pulsa para vincular", + "pressButton": "Pulsa un botón...", + "buttonUp": "Arriba", + "buttonDown": "Abajo", + "buttonLeft": "Izquierda", + "buttonRight": "Derecha", + "buttonAction": "Acción", + "buttonMenu": "Menú", + "buttonSubmit": "Confirmar", + "buttonCancel": "Cancelar", + "buttonStats": "Estadísticas", + "buttonCycleForm": "Cambiar forma", + "buttonCycleShiny": "Cambiar shiny", + "buttonCycleGender": "Cambiar género", + "buttonCycleAbility": "Cambiar habilidad", + "buttonCycleNature": "Cambiar naturaleza", + "buttonCycleVariant": "Cambiar variante", + "buttonSpeedUp": "Acelerar", + "buttonSlowDown": "Ralentizar", + "alt": " (Alt.)", + "mute": "Silenciar", + "controller": "Mando", + "gamepadSupport": "Soporte de mando", + "showBgmBar": "Mostrar título de canción", + "moveTouchControls": "Controles táctiles", + "shopOverlayOpacity": "Opacidad de la fase de compra", + "shopCursorTarget": "Cursor de la tienda", + "rewards": "Objetos", + "reroll": "Actualizar", + "shop": "Tienda", + "checkTeam": "Ver equipo" +} diff --git a/src/locales/es/settings.ts b/src/locales/es/settings.ts deleted file mode 100644 index dfd6f097242..00000000000 --- a/src/locales/es/settings.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { - "boy": "Chico", - "girl": "Chica", - "general": "General", - "display": "Display", - "audio": "Audio", - "gamepad": "Gamepad", - "keyboard": "Keyboard", - "gameSpeed": "Game Speed", - "hpBarSpeed": "HP Bar Speed", - "expGainsSpeed": "EXP Gains Speed", - "expPartyDisplay": "Show EXP Party", - "skipSeenDialogues": "Skip Seen Dialogues", - "battleStyle": "Battle Style", - "enableRetries": "Enable Retries", - "tutorials": "Tutorials", - "touchControls": "Touch Controls", - "vibrations": "Vibrations", - "normal": "Normal", - "fast": "Fast", - "faster": "Faster", - "skip": "Skip", - "levelUpNotifications": "Level Up Notifications", - "on": "On", - "off": "Off", - "switch": "Switch", - "set": "Set", - "auto": "Auto", - "disabled": "Disabled", - "language": "Language", - "change": "Change", - "uiTheme": "UI Theme", - "default": "Default", - "legacy": "Legacy", - "windowType": "Window Type", - "moneyFormat": "Money Format", - "damageNumbers": "Damage Numbers", - "simple": "Simple", - "fancy": "Fancy", - "abbreviated": "Abbreviated", - "moveAnimations": "Move Animations", - "showStatsOnLevelUp": "Show Stats on Level Up", - "candyUpgradeNotification": "Candy Upgrade Notification", - "passivesOnly": "Passives Only", - "candyUpgradeDisplay": "Candy Upgrade Display", - "icon": "Icon", - "animation": "Animation", - "moveInfo": "Move Info", - "showMovesetFlyout": "Show Moveset Flyout", - "showArenaFlyout": "Show Arena Flyout", - "showTimeOfDayWidget": "Show Time of Day Widget", - "timeOfDayAnimation": "Time of Day Animation", - "bounce": "Bounce", - "timeOfDay_back": "Back", - "spriteSet": "Sprite Set", - "consistent": "Consistent", - "mixedAnimated": "Mixed Animated", - "fusionPaletteSwaps": "Fusion Palette Swaps", - "playerGender": "Player Gender", - "typeHints": "Type Hints", - "masterVolume": "Master Volume", - "bgmVolume": "BGM Volume", - "seVolume": "SE Volume", - "musicPreference": "Music Preference", - "mixed": "Mixed", - "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", - "delete": "Delete", - "keyboardPleasePress": "Please Press a Key on Your Keyboard", - "reset": "Reset", - "requireReload": "Reload Required", - "action": "Action", - "back": "Back", - "pressToBind": "Press to Bind", - "pressButton": "Press a Button...", - "buttonUp": "Up", - "buttonDown": "Down", - "buttonLeft": "Left", - "buttonRight": "Right", - "buttonAction": "Action", - "buttonMenu": "Menu", - "buttonSubmit": "Submit", - "buttonCancel": "Cancel", - "buttonStats": "Stats", - "buttonCycleForm": "Cycle Form", - "buttonCycleShiny": "Cycle Shiny", - "buttonCycleGender": "Cycle Gender", - "buttonCycleAbility": "Cycle Ability", - "buttonCycleNature": "Cycle Nature", - "buttonCycleVariant": "Cycle Variant", - "buttonSpeedUp": "Speed Up", - "buttonSlowDown": "Slow Down", - "alt": " (Alt)", - "mute": "Mute", - "controller": "Controller", - "gamepadSupport": "Gamepad Support", - "showBgmBar": "Show Music Names", -} as const; diff --git a/src/locales/es/splash-messages.ts b/src/locales/es/splash-messages.json similarity index 71% rename from src/locales/es/splash-messages.ts rename to src/locales/es/splash-messages.json index 0d6f050be94..b1d4820b06e 100644 --- a/src/locales/es/splash-messages.ts +++ b/src/locales/es/splash-messages.json @@ -1,16 +1,14 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { +{ "battlesWon": "¡Batallas ganadas!", "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!", @@ -19,19 +17,20 @@ export const splashMessages: SimpleTranslationEntries = { "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!", "eeveeExpo": "¡Eevee Expo!", "ynoproject": "¡YNOproject!", -} as const; + "breedersInSpace": "Criadores... ¡EN EL ESPACIO!" +} diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.json similarity index 61% rename from src/locales/es/starter-select-ui-handler.ts rename to src/locales/es/starter-select-ui-handler.json index 14c22e22097..69cc937d4e3 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.json @@ -1,12 +1,6 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"¿Comenzar con estos Pokémon?", +{ + "confirmStartTeam": "¿Comenzar con estos Pokémon?", + "invalidParty": "¡Este equipo no es válido!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -21,26 +15,27 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Pasiva:", "nature": "Natur:", "eggMoves": "Mov. Huevo", - "addToParty": "Añadir a Equipo", + "addToParty": "Añadir al Equipo", + "removeFromParty": "Excluir del Equipo", "toggleIVs": "Mostrar IVs", - "manageMoves": "Gestionar Movs.", - "manageNature": "Gestionar Natur", + "manageMoves": "Cambiar movs.", + "manageNature": "Cambiar natur.", "useCandies": "Usar Caramelos", "selectNature": "Elige Natur.", "selectMoveSwapOut": "Elige el movimiento que sustituir.", "selectMoveSwapWith": "Elige el movimiento que sustituirá a", "unlockPassive": "Añadir Pasiva", "reduceCost": "Reducir Coste", - "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": Shiny", "cycleForm": ": Forma", "cycleGender": ": Género", "cycleAbility": ": Habilidad", "cycleNature": ": Naturaleza", "cycleVariant": ": Variante", + "goFilter": ": Ir a filtros", "enablePassive": "Activar Pasiva", "disablePassive": "Desactivar Pasiva", "locked": "Bloqueado", "disabled": "No disponible", "uncaught": "No capturado" -}; +} \ No newline at end of file diff --git a/src/locales/es/status-effect.json b/src/locales/es/status-effect.json new file mode 100644 index 00000000000..eeb8c251e8a --- /dev/null +++ b/src/locales/es/status-effect.json @@ -0,0 +1,65 @@ +{ + "none": { + "name": "Ninguno", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + }, + "poison": { + "name": "Envenenamiento", + "description": "envenenamiento", + "obtain": "¡{{pokemonNameWithAffix}}\nha sido envenenado!", + "obtainSource": "¡{{pokemonNameWithAffix}}\nha sido envenenado por {{sourceText}}!", + "activation": "¡El veneno resta PS a {{pokemonNameWithAffix}}!", + "overlap": "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", + "heal": "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" + }, + "toxic": { + "name": "Envenenamiento grave", + "description": "envenenamiento grave", + "obtain": "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado!", + "obtainSource": "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado por {{sourceText}}!", + "activation": "¡El veneno resta PS a {{pokemonNameWithAffix}}!", + "overlap": "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", + "heal": "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" + }, + "paralysis": { + "name": "Parálisis", + "description": "parálisis", + "obtain": "¡{{pokemonNameWithAffix}} sufre parálisis!\nQuizás no se pueda mover.", + "obtainSource": "¡{{pokemonNameWithAffix}} sufre parálisis por {{sourceText}}!\nQuizás no se pueda mover.", + "activation": "¡{{pokemonNameWithAffix}} está paralizado!\n¡No se puede mover!", + "overlap": "¡{{pokemonNameWithAffix}} ya\nestá paralizado!", + "heal": "¡{{pokemonNameWithAffix}} ya no\nestá paralizado!" + }, + "sleep": { + "name": "Dormir", + "description": "dormir", + "obtain": "¡{{pokemonNameWithAffix}}\nse ha dormido!", + "obtainSource": "¡{{pokemonNameWithAffix}}\nse ha dormido\npor culpa de {{sourceText}}!", + "activation": "¡{{pokemonNameWithAffix}} está/ndormido como un tronco.", + "overlap": "¡{{pokemonNameWithAffix}} ya\nestá dormido!", + "heal": "¡{{pokemonNameWithAffix}} se despertó!" + }, + "freeze": { + "name": "Congelamiento", + "description": "congelamiento", + "obtain": "¡{{pokemonNameWithAffix}}\nha sido congelado!", + "obtainSource": "¡{{pokemonNameWithAffix}}\nha sido congelado por {{sourceText}}!", + "activation": "¡{{pokemonNameWithAffix}} está\ncongelado!", + "overlap": "¡{{pokemonNameWithAffix}} ya\nestá congelado!", + "heal": "¡{{pokemonNameWithAffix}} se\nha descongelado!" + }, + "burn": { + "name": "Quemadura", + "description": "quemadura", + "obtain": "¡{{pokemonNameWithAffix}}\nse ha quemado!", + "obtainSource": "¡{{pokemonNameWithAffix}}\nse ha quemado por {{sourceText}}!", + "activation": "¡{{pokemonNameWithAffix}} se resiente\nde las quemaduras!", + "overlap": "¡{{pokemonNameWithAffix}} ya\nestá quemado!", + "heal": "¡{{pokemonNameWithAffix}} ya no\nestá quemado!" + } +} \ No newline at end of file diff --git a/src/locales/es/status-effect.ts b/src/locales/es/status-effect.ts deleted file mode 100644 index 975288fc451..00000000000 --- a/src/locales/es/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "Ninguno", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "Envenenamiento", - description: "envenenamiento", - obtain: "¡{{pokemonNameWithAffix}}\nha sido envenenado!", - obtainSource: "¡{{pokemonNameWithAffix}}\nha sido envenenado por {{sourceText}}!", - activation: "¡El veneno resta PS a {{pokemonNameWithAffix}}!", - overlap: "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", - heal: "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" - }, - toxic: { - name: "Envenenamiento grave", - description: "envenenamiento grave", - obtain: "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado!", - obtainSource: "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado por {{sourceText}}!", - activation: "¡El veneno resta PS a {{pokemonNameWithAffix}}!", - overlap: "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", - heal: "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" - }, - paralysis: { - name: "Parálisis", - description: "parálisis", - obtain: "¡{{pokemonNameWithAffix}} sufre parálisis!\nQuizás no se pueda mover.", - obtainSource: "¡{{pokemonNameWithAffix}} sufre parálisis por {{sourceText}}!\nQuizás no se pueda mover.", - activation: "¡{{pokemonNameWithAffix}} está paralizado!\n¡No se puede mover!", - overlap: "¡{{pokemonNameWithAffix}} ya\nestá paralizado!", - heal: "¡{{pokemonNameWithAffix}} ya no\nestá paralizado!" - }, - sleep: { - name: "Dormir", - description: "dormir", - obtain: "¡{{pokemonNameWithAffix}}\nse ha dormido!", - obtainSource: "¡{{pokemonNameWithAffix}}\nse ha dormido\npor culpa de {{sourceText}}!", - activation: "¡{{pokemonNameWithAffix}} está/ndormido como un tronco.", - overlap: "¡{{pokemonNameWithAffix}} ya\nestá dormido!", - heal: "¡{{pokemonNameWithAffix}} se despertó!" - }, - freeze: { - name: "Congelamiento", - description: "congelamiento", - obtain: "¡{{pokemonNameWithAffix}}\nha sido congelado!", - obtainSource: "¡{{pokemonNameWithAffix}}\nha sido congelado por {{sourceText}}!", - activation: "¡{{pokemonNameWithAffix}} está\ncongelado!", - overlap: "¡{{pokemonNameWithAffix}} ya\nestá congelado!", - heal: "¡{{pokemonNameWithAffix}} se\nha descongelado!" - }, - burn: { - name: "Quemadura", - description: "quemadura", - obtain: "¡{{pokemonNameWithAffix}}\nse ha quemado!", - obtainSource: "¡{{pokemonNameWithAffix}}\nse ha quemado por {{sourceText}}!", - activation: "¡{{pokemonNameWithAffix}} se resiente\nde las quemaduras!", - overlap: "¡{{pokemonNameWithAffix}} ya\nestá quemado!", - heal: "¡{{pokemonNameWithAffix}} ya no\nestá quemado!" - }, -} as const; diff --git a/src/locales/es/terrain.json b/src/locales/es/terrain.json new file mode 100644 index 00000000000..912f5186180 --- /dev/null +++ b/src/locales/es/terrain.json @@ -0,0 +1,16 @@ +{ + "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-classes.json b/src/locales/es/trainer-classes.json new file mode 100644 index 00000000000..0677193e4f8 --- /dev/null +++ b/src/locales/es/trainer-classes.json @@ -0,0 +1,102 @@ +{ + "ace_trainer": "Entrenador Guay", + "ace_trainer_female": "Entrenadora Guay", + "ace_duo": "Pareja Guay", + "artist": "Artista", + "artist_female": "Artista", + "backers": "Hinchas", + "backpacker": "Mochilero", + "backpacker_female": "Mochilera", + "backpackers": "Mochileros", + "baker": "Pastelera", + "battle_girl": "Luchadora", + "beauty": "Modelo", + "beginners": "Principiantes", + "biker": "Motorista", + "black_belt": "Karateka", + "breeder": "Criapokémon", + "breeder_female": "Criapokémon", + "breeders": "Criadores", + "clerk": "Empresario", + "clerk_female": "Oficinista", + "colleagues": "Colegas Oficina", + "crush_kin": "Luchadores", + "cyclist": "Ciclista", + "cyclist_female": "Ciclista", + "cyclists": "Ciclistas", + "dancer": "Breakdancer", + "dancer_female": "Bailarina", + "depot_agent": "Ferroviario", + "doctor": "Enfermero", + "doctor_female": "Enfermera", + "firebreather": "Comefuegos", + "fisherman": "Pescador", + "fisherman_female": "Pescadora", + "gentleman": "Aristócrata", + "guitarist": "Guitarrista", + "guitarist_female": "Guitarrista", + "harlequin": "Arlequín", + "hiker": "Montañero", + "hooligans": "Pandilleros", + "hoopster": "Pívot", + "infielder": "Pitcher", + "janitor": "Limpiador", + "lady": "Damisela", + "lass": "Chica", + "linebacker": "Quarterback", + "maid": "Criada", + "madame": "Señora", + "medical_team": "Equipo Médico", + "musician": "Cantautor", + "hex_maniac": "Bruja", + "nurse": "Enfermera", + "nursery_aide": "Seño", + "officer": "Policía", + "parasol_lady": "Dama Parasol", + "pilot": "Piloto", + "pokéfan": "Pokéfan", + "pokéfan_female": "Pokéfan", + "pokéfan_family": "Pareja de Pokéfans", + "preschooler": "Preescolar", + "preschooler_female": "Preescolar", + "preschoolers": "Preescolares", + "psychic": "Médium", + "psychic_female": "Mentalista", + "psychics": "Pareja Médium", + "restaurant_staff": "Personal Restaurante", + "rich": "Bien", + "rich_female": "Bien", + "rich_boy": "Niño Bien", + "rich_couple": "Pareja Bien", + "rich_kid": "Niño Bien", + "rich_kid_female": "Niña Bien", + "rich_kids": "Niños Bien", + "roughneck": "Calvo", + "sailor": "Marinero", + "scientist": "Científico", + "scientist_female": "Científica", + "scientists": "Científicos", + "smasher": "Tenista", + "snow_worker": "Operario Nieve", + "snow_worker_female": "Operaria Nieve", + "striker": "Delantero", + "school_kid": "Colegial", + "school_kid_female": "Colegial", + "school_kids": "Colegiales", + "swimmer": "Nadador", + "swimmer_female": "Nadadora", + "swimmers": "Nadadores", + "twins": "Gemelas", + "veteran": "Veterano", + "veteran_female": "Veterana", + "veteran_duo": "Dúo Veterano", + "waiter": "Camarero", + "waitress": "Camarera", + "worker": "Operario", + "worker_female": "Operaria", + "workers": "Operarios", + "youngster": "Joven", + "aether_grunt": "Empleado de la Fundación Æther", + "aether_grunt_female": "Empleada de la Fundación Æther", + "aether_grunts": "Empleados de la Fundación Æther" +} diff --git a/src/locales/es/trainer-names.json b/src/locales/es/trainer-names.json new file mode 100644 index 00000000000..ce09a0c9037 --- /dev/null +++ b/src/locales/es/trainer-names.json @@ -0,0 +1,158 @@ +{ + "brock": "Brock", + "misty": "Misty", + "lt_surge": "Teniente Surge", + "erika": "Erika", + "janine": "Sachiko", + "sabrina": "Sabrina", + "blaine": "Blaine", + "giovanni": "Giovanni", + "falkner": "Pegaso", + "bugsy": "Antón", + "whitney": "Blanca", + "morty": "Morti", + "chuck": "Aníbal", + "jasmine": "Yasmina", + "pryce": "Fredo", + "clair": "Débora", + "roxanne": "Petra", + "brawly": "Marcial", + "wattson": "Erico", + "flannery": "Candela", + "norman": "Norman", + "winona": "Alana", + "tate": "Vito", + "liza": "Leti", + "juan": "Galano", + "roark": "Roco", + "gardenia": "Gardenia", + "maylene": "Brega", + "crasher_wake": "Mananti", + "fantina": "Fantina", + "byron": "Acerón", + "candice": "Inverna", + "volkner": "Lectro", + "cilan": "Millo", + "chili": "Zeo", + "cress": "Maíz", + "cheren": "Cheren", + "lenora": "Aloe", + "roxie": "Hiedra", + "burgh": "Camus", + "elesa": "Camila", + "clay": "Yakón", + "skyla": "Gerania", + "brycen": "Junco", + "drayden": "Lirio", + "marlon": "Ciprián", + "viola": "Violeta", + "grant": "Lino", + "korrina": "Corelia", + "ramos": "Amaro", + "clemont": "Lem", + "valerie": "Valeria", + "olympia": "Ástrid", + "wulfric": "Édel", + "milo": "Percy", + "nessa": "Cathy", + "kabu": "Naboru", + "bea": "Judith", + "allister": "Alistair", + "opal": "Sally", + "bede": "Berto", + "gordie": "Morris", + "melony": "Mel", + "piers": "Nerio", + "marnie": "Roxy", + "raihan": "Roy", + "katy": "Araceli", + "brassius": "Brais", + "iono": "e-Nigma", + "kofu": "Fuco", + "larry": "Laureano", + "ryme": "Lima", + "tulip": "Tuli", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agatha", + "lance": "Lance", + "will": "Mento", + "koga": "Koga", + "karen": "Karen", + "sidney": "Sixto", + "phoebe": "Fátima", + "glacia": "Nívea", + "drake": "Dracón", + "aaron": "Alecrán", + "bertha": "Gaia", + "flint": "Fausto", + "lucian": "Delos", + "shauntal": "Anís", + "marshal": "Lotto", + "grimsley": "Aza", + "caitlin": "Catleya", + "malva": "Malva", + "siebold": "Narciso", + "wikstrom": "Tileo", + "drasna": "Drácena", + "hala": "Kaudan", + "molayne": "Lario", + "olivia": "Mayla", + "acerola": "Zarala", + "kahili": "Kahili", + "rika": "Cayena", + "poppy": "Pola", + "hassel": "Hesperio", + "crispin": "Denis", + "amarys": "Nerina", + "lacey": "Aroa", + "drayton": "Levi", + "blue": "Azul", + "red": "Rojo", + "steven": "Máximo", + "wallace": "Plubio", + "cynthia": "Cintia", + "alder": "Mirto", + "iris": "Iris", + "diantha": "Dianta", + "hau": "Tilo", + "geeta": "Ságita", + "nemona": "Mencía", + "kieran": "Cass", + "leon": "Lionel", + "rival": "Finn", + "rival_female": "Ivy", + "archer": "Atlas", + "ariana": "Atenea", + "proton": "Protón", + "petrel": "Petrel", + "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", + "lusamine": "Samina", + "blue_red_double": "Azul y Rojo", + "red_blue_double": "Rojo y Azul", + "tate_liza_double": "Vito y Leti", + "liza_tate_double": "Leti y Vito", + "steven_wallace_double": "Máximo y Plubio", + "wallace_steven_double": "Plubio y Máximo", + "alder_iris_double": "Mirto e Iris", + "iris_alder_double": "Iris y Mirto", + "marnie_piers_double": "Roxy y Nerio", + "piers_marnie_double": "Nerio y Roxy" +} diff --git a/src/locales/es/trainer-titles.json b/src/locales/es/trainer-titles.json new file mode 100644 index 00000000000..5bee9fc8c51 --- /dev/null +++ b/src/locales/es/trainer-titles.json @@ -0,0 +1,34 @@ +{ + "elite_four": "Alto Mando", + "elite_four_female": "Alto Mando", + "gym_leader": "Líder de gimnasio", + "gym_leader_female": "Líder de gimnasio", + "gym_leader_double": "Líderes de Gimnasio", + "champion": "Campeón", + "champion_female": "Campeona", + "champion_double": "Campeones", + "rival": "Rival", + "professor": "Profesor", + "frontier_brain": "As del Frente Batalla", + "rocket_boss": "Team Rocket Boss", + "magma_boss": "Team Magma Boss", + "aqua_boss": "Team Aqua Boss", + "galactic_boss": "Team Galactic Boss", + "plasma_boss": "Team Plasma Boss", + "flare_boss": "Team Flare Boss", + "aether_boss": "Presidente Æther", + + "rocket_admin": "Team Rocket Admin", + "rocket_admin_female": "Team Rocket Admin", + "magma_admin": "Team Magma Admin", + "magma_admin_female": "Team Magma Admin", + "aqua_admin": "Team Aqua Admin", + "aqua_admin_female": "Team Aqua Admin", + "galactic_commander": "Team Galactic Commander", + "galactic_commander_female": "Team Galactic Commander", + "plasma_sage": "Team Plasma Sage", + "plasma_admin": "Team Plasma Admin", + "flare_admin": "Team Flare Admin", + "flare_admin_female": "Team Flare Admin", + "aether_admin": "Director de la Fundación Æther" +} diff --git a/src/locales/es/trainers.ts b/src/locales/es/trainers.ts deleted file mode 100644 index d5647f83cf6..00000000000 --- a/src/locales/es/trainers.ts +++ /dev/null @@ -1,261 +0,0 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "elite_four": "Alto Mando", - "elite_four_female": "Alto Mando", - "gym_leader": "Líder de gimnasio", - "gym_leader_female": "Líder de gimnasio", - "gym_leader_double": "Líderes de Gimnasio", - "champion": "Campeón", - "champion_female": "Campeona", - "champion_double": "Campeones", - "rival": "Rival", - "professor": "Profesor", - "frontier_brain": "As del Frente Batalla", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Entrenador Guay", - "ace_trainer_female": "Entrenadora Guay", - "ace_duo": "Pareja Guay", - "artist": "Artista", - "artist_female": "Artista", - "backers": "Hinchas", - "backpacker": "Mochilero", - "backpacker_female": "Mochilera", - "backpackers": "Mochileros", - "baker": "Pastelera", - "battle_girl": "Luchadora", - "beauty": "Modelo", - "beginners": "Principiantes", - "biker": "Motorista", - "black_belt": "Karateka", - "breeder": "Criapokémon", - "breeder_female": "Criapokémon", - "breeders": "Criadores", - "clerk": "Empresario", - "clerk_female": "Oficinista", - "colleagues": "Colegas Oficina", - "crush_kin": "Luchadores", - "cyclist": "Ciclista", - "cyclist_female": "Ciclista", - "cyclists": "Ciclistas", - "dancer": "Breakdancer", - "dancer_female": "Bailarina", - "depot_agent": "Ferroviario", - "doctor": "Enfermero", - "doctor_female": "Enfermera", - "firebreather": "Comefuegos", - "fisherman": "Pescador", - "fisherman_female": "Pescadora", - "gentleman": "Aristócrata", - "guitarist": "Guitarrista", - "guitarist_female": "Guitarrista", - "harlequin": "Arlequín", - "hiker": "Montañero", - "hooligans": "Pandilleros", - "hoopster": "Pívot", - "infielder": "Pitcher", - "janitor": "Limpiador", - "lady": "Damisela", - "lass": "Chica", - "linebacker": "Quarterback", - "maid": "Criada", - "madame": "Señora", - "medical_team": "Equipo Médico", - "musician": "Cantautor", - "hex_maniac": "Bruja", - "nurse": "Enfermera", - "nursery_aide": "Seño", - "officer": "Policía", - "parasol_lady": "Dama Parasol", - "pilot": "Piloto", - "pokéfan": "Pokéfan", - "pokéfan_female": "Pokéfan", - "pokéfan_family": "Pareja de Pokéfans", - "preschooler": "Preescolar", - "preschooler_female": "Preescolar", - "preschoolers": "Preescolares", - "psychic": "Médium", - "psychic_female": "Mentalista", - "psychics": "Pareja Médium", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Ranger", - "ranger": "Ranger", - "restaurant_staff": "Personal Restaurante", - "rich": "Bien", - "rich_female": "Bien", - "rich_boy": "Niño Bien", - "rich_couple": "Pareja Bien", - "rich_kid": "Niño Bien", - "rich_kid_female": "Niña Bien", - "rich_kids": "Niños Bien", - "roughneck": "Calvo", - "sailor": "Marinero", - "scientist": "Científico", - "scientist_female": "Científica", - "scientists": "Científicos", - "smasher": "Tenista", - "snow_worker": "Operario Nieve", - "snow_worker_female": "Operaria Nieve", - "striker": "Delantero", - "school_kid": "Colegial", - "school_kid_female": "Colegial", - "school_kids": "Colegiales", - "swimmer": "Nadador", - "swimmer_female": "Nadadora", - "swimmers": "Nadadores", - "twins": "Gemelas", - "veteran": "Veterano", - "veteran_female": "Veterana", - "veteran_duo": "Dúo Veterano", - "waiter": "Camarero", - "waitress": "Camarera", - "worker": "Operario", - "worker_female": "Operaria", - "workers": "Operarios", - "youngster": "Joven" -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Tt. Surge", - "erika": "Erika", - "janine": "Sachiko", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Pegaso", - "bugsy": "Antón", - "whitney": "Blanca", - "morty": "Morti", - "chuck": "Aníbal", - "jasmine": "Yasmina", - "pryce": "Fredo", - "clair": "Débora", - "roxanne": "Petra", - "brawly": "Marcial", - "wattson": "Erico", - "flannery": "Candela", - "norman": "Norman", - "winona": "Alana", - "tate": "Vito", - "liza": "Leti", - "juan": "Galán", - "roark": "Roco", - "gardenia": "Gardenia", - "maylene": "Brega", - "crasher_wake": "Mananti", - "fantina": "Fantina", - "byron": "Acerón", - "candice": "Inverna", - "volkner": "Lectro", - "cilan": "Millo", - "chili": "Zeo", - "cress": "Maiz", - "cheren": "Cheren", - "lenora": "Aloe", - "roxie": "Hiedra", - "burgh": "Camus", - "elesa": "Camila", - "clay": "Yakón", - "skyla": "Gerania", - "brycen": "Junco", - "drayden": "Lirio", - "marlon": "Ciprián", - "viola": "Violeta", - "grant": "Lino", - "korrina": "Corelia", - "ramos": "Amaro", - "clemont": "Lem", - "valerie": "Valeria", - "olympia": "Ástrid", - "wulfric": "Édel", - "milo": "Percy", - "nessa": "Cathy", - "kabu": "Naboru", - "bea": "Judith", - "allister": "Allistair", - "opal": "Sally", - "bede": "Berto", - "gordie": "Morris", - "melony": "Mel", - "piers": "Nerio", - "marnie": "Roxy", - "raihan": "Roy", - "katy": "Araceli", - "brassius": "Brais", - "iono": "e-Nigma", - "kofu": "Fuco", - "larry": "Laureano", - "ryme": "Lima", - "tulip": "Tuli", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Mento", - "koga": "Koga", - "karen": "Karen", - "sidney": "Sixto", - "phoebe": "Fátima", - "glacia": "Nívea", - "drake": "Dracón", - "aaron": "Alecrán", - "bertha": "Gaia", - "flint": "Fausto", - "lucian": "Delos", - "shauntal": "Anís", - "marshal": "Lotto", - "grimsley": "Aza", - "caitlin": "Catleya", - "malva": "Malva", - "siebold": "Narciso", - "wikstrom": "Tileo", - "drasna": "Drácena", - "hala": "Kaudan", - "molayne": "Lario", - "olivia": "Mayla", - "acerola": "Zarala", - "kahili": "Kahili", - "rika": "Cayena", - "poppy": "Pola", - "hassel": "Hesperio", - "crispin": "Denis", - "amarys": "Nerina", - "lacey": "Aroa", - "drayton": "Levi", - "blue": "Azul", - "red": "Rojo", - "steven": "Máximo", - "wallace": "Plubio", - "cynthia": "Cintia", - "alder": "Mirto", - "iris": "Iris", - "diantha": "Dianta", - "hau": "Tilo", - "geeta": "Ságita", - "nemona": "Mencía", - "kieran": "Cass", - "leon": "Lionel", - "rival": "Finn", - "rival_female": "Ivy", - - // Double Names - "blue_red_double": "Azul y Rojo", - "red_blue_double": "Rojo y Azul", - "tate_liza_double": "Vito y Leti", - "liza_tate_double": "Leti y Vito", - "steven_wallace_double": "Máximo y Plubio", - "wallace_steven_double": "Plubio y Máximo", - "alder_iris_double": "Mirto e Iris", - "iris_alder_double": "Iris y Mirto", - "marnie_piers_double": "Roxy y Nerio", - "piers_marnie_double": "Nerio y Roxy", -} as const; diff --git a/src/locales/es/tutorial.json b/src/locales/es/tutorial.json new file mode 100644 index 00000000000..e19dbcf09ad --- /dev/null +++ b/src/locales/es/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "¡Bienvenido/a a PokéRogue! Este es un fangame de Pokémon centrado en el combate con elementos roguelite.\n$Este juego no está monetizado y no reclamamos ningún derecho de propiedad sobre Pokémon ni sobre ninguno de\n$los recursos con copyright utilizados.\n$El juego está en desarrollo, pero es completamente jugable.\nPara reportar bugs, por favor, hazlo en nuestra\n$comunidad de Discord.\n$Si el juego va lento, por favor, asegúrate de que tengas activada la opción 'Aceleración de gráficos' en los\n$ajustes de tu navegador.", + "accessMenu": "Para acceder al menú, pulsa M o Escape cuando\ntengas el control.\n$El menú contiene los ajustes y otras funciones.", + "menu": "Desde este menú podrás acceder a los ajustes.\n$Podrás cambiar la velocidad del juego, el estilo de la ventana y demás.\n$Hay más opciones, ¡así que pruébalas todas!", + "starterSelect": "En esta pantalla, podrás elegir tus iniciales presionando Z\no Espacio. Estos serán tus miembros de equipo al comenzar.\n$Cada inicial tiene un valor. Tu equipo puede contener hasta 6\nmiembros mientras el valor total no pase de 10.\n$También puedes elegir su género, habilidad y forma\ndependiendo de las variantes que hayas conseguido.\n$Los IVs de los iniciales corresponderán al valor más alto de\nlos Pokémon de la misma especie que hayas obtenido.\n$¡Así que intenta conseguir muchos Pokémon de la misma\nespecie!", + "pokerus": "Cada día, 3 iniciales aleatorios tendrán un borde morado.\n$Si ves un inicial que tengas con este borde, prueba a\nañadirlo a tu equipo. ¡No olvides revisar sus datos!", + "statChange": "Los cambios de estadísticas se mantienen entre combates\nmientras que el Pokémon no vuelva a su Poké Ball.\n$Tus Pokémon vuelven a sus Poké Balls antes de combates contra entrenadores y de entrar a un nuevo bioma.\n$También puedes ver los cambios de estadísticas del Pokémon en campo manteniendo pulsado C o Shift.\n$También puedes ver los movimientos de un Pokémon enemigo manteniendo presionada la V.\n$Esto solo revela los movimientos que has visto usar al Pokémon en esta combate.", + "selectItem": "Tras cada combate, tendrás la opción de elegir entre tres objetos aleatorios. Solo podrás escoger uno.\n$Estos objetos pueden ser consumibles, objetos equipables u objetos pasivos permanentes (hasta acabar la partida).\n$La mayoría de los efectos de objetos no consumibles se acumularán de varias maneras.\n$Algunos objetos solo aparecerán si pueden ser utilizados, como las piedras evolutivas.\n$También puedes transferir objetos equipados entre Pokémon, utilizando la opción de transferir.\n$La opción de transferir aparecerá en la parte inferior derecha una vez hayas obtenido un objeto equipable.\n$También puedes comprar objetos consumibles con dinero y su variedad irá aumentando según tu avance.\n$Asegúrate de comprar antes de escoger una recompensa, ya que se avanzará automáticamente al siguiente combate.", + "eggGacha": "En esta pantalla podrás canjear tus vales por huevos\nde Pokémon.\n$Los huevos deben eclosionar y estarán más cerca de\nhacerlo tras cada combate.\n$Los huevos más raros tardarán más en eclosionar.\n$Los Pokémon que hayan salido del huevo no se\nañadirán a tu equipo, pero sí a tus iniciales.\n$Los Pokémon salidos de un huevo suelen tener mejores\nIVs que los Pokémon salvajes.\n$Algunos Pokémon solo pueden ser obtenidos de huevos.\n$Hay 3 máquinas diferentes entre las que elegir, cada\nuna con diferentes bonificaciones.\n$¡Así que escoge la que más te interese!" +} \ No newline at end of file diff --git a/src/locales/es/tutorial.ts b/src/locales/es/tutorial.ts deleted file mode 100644 index 5a33bcd9dd0..00000000000 --- a/src/locales/es/tutorial.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - "intro": `¡Bienvenido/a a PokéRogue! Este es un fangame de Pokémon centrado en el combate con elementos roguelite. - $Este juego no está monetizado y no reclamamos ningún derecho de propiedad sobre Pokémon ni sobre ninguno de - $los recursos con copyright utilizados. - $El juego está en desarrollo, pero es completamente jugable.\nPara reportar bugs, por favor, hazlo en nuestra - $comunidad de Discord. - $Si el juego va lento, por favor, asegúrate de que tengas activada la opción 'Aceleración de gráficos' en los - $ajustes de tu navegador.`, - - "accessMenu": `Para acceder al menú, pulsa M o Escape cuando\ntengas el control. - $El menú contiene los ajustes y otras funciones.`, - - "menu": `Desde este menú podrás acceder a los ajustes. - $Podrás cambiar la velocidad del juego, el estilo de la ventana y demás. - $Hay más opciones, ¡así que pruébalas todas!`, - - "starterSelect": `En esta pantalla, podrás elegir tus iniciales presionando Z\no Espacio. Estos serán tus miembros de equipo al comenzar. - $Cada inicial tiene un valor. Tu equipo puede contener hasta 6\nmiembros mientras el valor total no pase de 10. - $También puedes elegir su género, habilidad y forma\ndependiendo de las variantes que hayas conseguido. - $Los IVs de los iniciales corresponderán al valor más alto de\nlos Pokémon de la misma especie que hayas obtenido. - $¡Así que intenta conseguir muchos Pokémon de la misma\nespecie!`, - - "pokerus": `Cada día, 3 iniciales aleatorios tendrán un borde morado. - $Si ves un inicial que tengas con este borde, prueba a\nañadirlo a tu equipo. ¡No olvides revisar sus datos!`, - - "statChange": `Los cambios de estadísticas se mantienen entre combates\nmientras que el Pokémon no vuelva a su Poké Ball. - $Tus Pokémon vuelven a sus Poké Balls antes de combates contra entrenadores y de entrar a un nuevo bioma. - $También puedes ver los cambios de estadísticas del Pokémon en campo manteniendo pulsado C o Shift. - $También puedes ver los movimientos de un Pokémon enemigo manteniendo presionada la V. - $Esto solo revela los movimientos que has visto usar al Pokémon en esta combate.`, - - "selectItem": `Tras cada combate, tendrás la opción de elegir entre tres objetos aleatorios. Solo podrás escoger uno. - $Estos objetos pueden ser consumibles, objetos equipables u objetos pasivos permanentes (hasta acabar la partida). - $La mayoría de los efectos de objetos no consumibles se acumularán de varias maneras. - $Algunos objetos solo aparecerán si pueden ser utilizados, como las piedras evolutivas. - $También puedes transferir objetos equipados entre Pokémon, utilizando la opción de transferir. - $La opción de transferir aparecerá en la parte inferior derecha una vez hayas obtenido un objeto equipable. - $También puedes comprar objetos consumibles con dinero y su variedad irá aumentando según tu avance. - $Asegúrate de comprar antes de escoger una recompensa, ya que se avanzará automáticamente al siguiente combate.`, - - "eggGacha": `En esta pantalla podrás canjear tus vales por huevos\nde Pokémon. - $Los huevos deben eclosionar y estarán más cerca de\nhacerlo tras cada combate. - $Los huevos más raros tardarán más en eclosionar. - $Los Pokémon que hayan salido del huevo no se\nañadirán a tu equipo, pero sí a tus iniciales. - $Los Pokémon salidos de un huevo suelen tener mejores\nIVs que los Pokémon salvajes. - $Algunos Pokémon solo pueden ser obtenidos de huevos. - $Hay 3 máquinas diferentes entre las que elegir, cada\nuna con diferentes bonificaciones. - $¡Así que escoge la que más te interese!`, -} as const; diff --git a/src/locales/es/voucher.ts b/src/locales/es/voucher.json similarity index 63% rename from src/locales/es/voucher.ts rename to src/locales/es/voucher.json index 60479160efe..e55c791c94a 100644 --- a/src/locales/es/voucher.ts +++ b/src/locales/es/voucher.json @@ -1,11 +1,9 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { - "vouchers": "Vales", - "eggVoucher": "Vale Huevo", - "eggVoucherPlus": "Vale Huevo Plus", - "eggVoucherPremium": "Vale Huevo Premium", - "eggVoucherGold": "Vale Huevo Dorado", - "locked": "Bloqueado", - "defeatTrainer": "Derrota a {{trainerName}}" -} as const; +{ + "vouchers": "Vales", + "eggVoucher": "Vale Huevo", + "eggVoucherPlus": "Vale Huevo Plus", + "eggVoucherPremium": "Vale Huevo Premium", + "eggVoucherGold": "Vale Huevo Dorado", + "locked": "Bloqueado", + "defeatTrainer": "Derrota a {{trainerName}}" +} \ No newline at end of file diff --git a/src/locales/es/weather.ts b/src/locales/es/weather.json similarity index 87% rename from src/locales/es/weather.ts rename to src/locales/es/weather.json index 5565779a7bd..44716a165dd 100644 --- a/src/locales/es/weather.ts +++ b/src/locales/es/weather.json @@ -1,44 +1,32 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { +{ "sunnyStartMessage": "¡El sol esta brillando!", "sunnyLapseMessage": "Hace mucho sol...", "sunnyClearMessage": "Se ha ido el sol.", - "rainStartMessage": "¡Ha empezado a llover!", "rainLapseMessage": "Sigue lloviendo...", "rainClearMessage": "Ha dejado de llover.", - "sandstormStartMessage": "¡Se ha desatado una tormenta de arena!", "sandstormLapseMessage": "La tormenta de arena arrecia...", "sandstormClearMessage": "La tormenta de arena termino.", "sandstormDamageMessage": "¡La tormenta de arena zarandea al\n{{pokemonNameWithAffix}}!", - "hailStartMessage": "¡Ha empezado a granizar!", "hailLapseMessage": "Sigue granizando...", "hailClearMessage": "Had dejado de granizar.", "hailDamageMessage": "El granizo golpea al\n{{pokemonNameWithAffix}}!", - "snowStartMessage": "¡Ha empezado a nevar!", "snowLapseMessage": "Sigue nevando...", "snowClearMessage": "Ha dejado de nevar.", - "fogStartMessage": "La niebla es densa...", "fogLapseMessage": "Sigue la niebla...", "fogClearMessage": "La niebla ha desaparecido.", - "heavyRainStartMessage": "¡Ha empezado a diluviar!", "heavyRainLapseMessage": "Sigue diluviando...", "heavyRainClearMessage": "Ha dejado de diluviar.", - "harshSunStartMessage": "¡El sol que hace ahora es realmente abrasador!", "harshSunLapseMessage": "El sol sigue abrasando.", "harshSunClearMessage": "El sol vuelve a brillar como siempre.", - "strongWindsStartMessage": "¡Comenzó un fuerte viento!", "strongWindsLapseMessage": "El viento sopla intensamente.", + "strongWindsEffectMessage": "¡Las misteriosas turbulencias atenúan el ataque!", "strongWindsClearMessage": "El fuerte viento cesó." -}; +} \ No newline at end of file diff --git a/src/locales/fr/ability-trigger.json b/src/locales/fr/ability-trigger.json new file mode 100644 index 00000000000..761242b3d94 --- /dev/null +++ b/src/locales/fr/ability-trigger.json @@ -0,0 +1,64 @@ +{ + "blockRecoilDamage": "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !", + "badDreams": "{{pokemonName}} a le sommeil agité !", + "costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} évite les dégâts\navec {{abilityName}} !", + "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", + "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", + "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", + "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", + "quickDraw": "Tir Vif permet à {{pokemonName}}\nd’agir plus vite que d’habitude !", + "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet d’être volé !", + "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !", + "fullHpResistType": "{{pokemonNameWithAffix}} fait briller sa carapace\net fausse les affinités de type !", + "disguiseAvoidedDamage": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !", + "moveImmunity": "Ça n’affecte pas {{pokemonNameWithAffix}}…", + "reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !", + "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\nle transforme en type {{typeName}} !", + "postDefendContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} et sa cible\néchangent leurs talents !", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} donne\nle talent {{abilityName}} à sa cible !", + "postDefendMoveDisable": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !", + "pokemonTypeChange": "{{pokemonNameWithAffix}} prend\nle type {{moveType}} !", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} vole\nl’objet {{stolenItemType}} de {{defenderName}} !", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} vole\nl’objet {{stolenItemType}} de {{attackerName}} !", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}} reçoit\nle talent {{abilityName}} !", + "intimidateImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nl’empêche d’être intimidé !", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} boit le thé\npréparé par {{pokemonName}} !", + "postSummonClearAllyStats": "Les stats de {{pokemonNameWithAffix}}\nsont revenues à la normale !", + "postSummonTransform": "{{pokemonNameWithAffix}} prend\nl’apparence de {{targetName}} !", + "protectStat": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{statName}} de baisser !", + "statusEffectImmunityWithName": "{{abilityName}} de {{pokemonNameWithAffix}}\nl’empêche d’être {{statusEffectName}} !", + "statusEffectImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche tout problème de statut !", + "battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{battlerTagName}} !", + "forewarn": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} a été détectée !", + "frisk": "{{pokemonNameWithAffix}} fouille {{opponentName}}\net trouve son talent {{opponentAbilityName}} !", + "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} a récolté\nune {{berryName}} !", + "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "fetchBall": "{{pokemonNameWithAffix}} trouve\nune {{pokeballName}} !", + "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "arenaTrap": "{{pokemonNameWithAffix}} empêche\nles changements grâce à son talent {{abilityName}} !", + "postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nl’objet {{itemName}} !", + "postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", + "postFaintHpDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", + "postSummonPressure": "{{pokemonNameWithAffix}}\naugmente la pression !", + "weatherEffectDisappeared": "Les effets de la météo se dissipent !", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}\nbrise le moule !", + "postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !", + "postSummonTeravolt": "{{pokemonNameWithAffix}} dégage\nune aura électrique instable !", + "postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !", + "postSummonFairyAura": "{{pokemonNameWithAffix}} dégage\nune aura enchanteresse !", + "postSummonAuraBreak": "{{pokemonNameWithAffix}} inverse\ntoutes les auras !", + "postSummonNeutralizingGas": "Le gaz inhibiteur {{pokemonNameWithAffix}}\nenvahit les lieux !", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\na deux talents !", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\na deux talents !", + "postSummonVesselOfRuin": "L’Urne du Fléau de {{pokemonNameWithAffix}}\naffaiblit l’{{statName}} des Pokémon alentour !", + "postSummonSwordOfRuin": "L’Épée du Fléau de {{pokemonNameWithAffix}}\naffaiblit la {{statName}} des Pokémon alentour !", + "postSummonTabletsOfRuin": "Le Bois du Fléau de {{pokemonNameWithAffix}}\naffaiblit l’{{statName}} des Pokémon alentour !", + "postSummonBeadsOfRuin": "Les Perles du Fléau de {{pokemonNameWithAffix}}\naffaiblissent la {{statName}} des Pokémon alentour !", + "preventBerryUse": "{{pokemonNameWithAffix}} est tendu\net ne peut plus manger de Baies !" +} diff --git a/src/locales/fr/ability-trigger.ts b/src/locales/fr/ability-trigger.ts deleted file mode 100644 index f99ff15c26f..00000000000 --- a/src/locales/fr/ability-trigger.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !", - "badDreams": "{{pokemonName}} a le sommeil agité !", - "costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !", - "iceFaceAvoidedDamage": "{{pokemonName}} évite les dégâts\navec {{abilityName}} !", - "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", - "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", - "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", - "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", - "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", -} as const; diff --git a/src/locales/fr/ability.json b/src/locales/fr/ability.json new file mode 100644 index 00000000000..7db44c45fa7 --- /dev/null +++ b/src/locales/fr/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "Puanteur", + "description": "Le Pokémon émet une odeur si nauséabonde qu’il peut effrayer sa cible en l’attaquant." + }, + "drizzle": { + "name": "Crachin", + "description": "Le Pokémon invoque la pluie quand il entre au combat." + }, + "speedBoost": { + "name": "Turbo", + "description": "La Vitesse du Pokémon augmente à chaque tour." + }, + "battleArmor": { + "name": "Armurbaston", + "description": "Le Pokémon est protégé des coups critiques par une solide carapace." + }, + "sturdy": { + "name": "Fermeté", + "description": "Le Pokémon encaisse toujours au moins une attaque s’il a tous ses PV. Il est également immunisé contre les capacités pouvant mettre K.O. en un coup." + }, + "damp": { + "name": "Moiteur", + "description": "Le Pokémon augmente l’humidité de l’air, ce qui empêche tous les Pokémon d’utiliser des capacités explosives telles que Destruction." + }, + "limber": { + "name": "Échauffement", + "description": "Le Pokémon s’est suffisamment échauffé, ce qui l’immunise contre la paralysie." + }, + "sandVeil": { + "name": "Voile Sable", + "description": "Augmente l’Esquive du Pokémon lors des tempêtes de sable." + }, + "static": { + "name": "Statik", + "description": "Le Pokémon charge son corps en électricité statique, et tout contact avec lui peut paralyser." + }, + "voltAbsorb": { + "name": "Absorbe-Volt", + "description": "Si le Pokémon est touché par une capacité Électrik, il ne subit aucun dégât et regagne des PV à la place." + }, + "waterAbsorb": { + "name": "Absorbe-Eau", + "description": "Si le Pokémon est touché par une capacité Eau, il ne subit aucun dégât et regagne des PV à la place." + }, + "oblivious": { + "name": "Benêt", + "description": "Le Pokémon est un grand benêt, ce qui l’immunise contre l’attraction, la provocation ou l’intimidation." + }, + "cloudNine": { + "name": "Ciel Gris", + "description": "Annule tous les effets liés à la météo." + }, + "compoundEyes": { + "name": "Œil Composé", + "description": "Les yeux à facettes du Pokémon augmentent la Précision de ses capacités." + }, + "insomnia": { + "name": "Insomnia", + "description": "Le Pokémon est incapable de dormir." + }, + "colorChange": { + "name": "Homochromie", + "description": "Lorsque le Pokémon est touché par une capacité, il prend le type de celle-ci." + }, + "immunity": { + "name": "Vaccin", + "description": "Le Pokémon est naturellement immunisé contre toute forme de poison." + }, + "flashFire": { + "name": "Torche", + "description": "Lorsque le Pokémon est touché par une capacité de type Feu, il absorbe la chaleur pour renforcer ses propres capacités Feu." + }, + "shieldDust": { + "name": "Écran Poudre", + "description": "Le Pokémon dispose d’un écran naturel qui le protège des effets additionnels des attaques ennemies." + }, + "ownTempo": { + "name": "Tempo Perso", + "description": "Le Pokémon vit sa vie à son propre rythme, ce qui l’immunise contre la confusion et l’intimidation." + }, + "suctionCups": { + "name": "Ventouse", + "description": "Le Pokémon est solidement fixé au sol par des ventouses, ce qui le protège des capacités ou objets qui font changer de Pokémon." + }, + "intimidate": { + "name": "Intimidation", + "description": "Le Pokémon rugit lorsqu’il arrive au combat, ce qui intimide l’ennemi et baisse son Attaque." + }, + "shadowTag": { + "name": "Marque Ombre", + "description": "Empêche les Pokémon ennemis de quitter le terrain." + }, + "roughSkin": { + "name": "Peau Dure", + "description": "Blesse l’attaquant lorsque le Pokémon subit une attaque directe." + }, + "wonderGuard": { + "name": "Garde Mystik", + "description": "Une puissance mystérieuse protège le Pokémon contre toutes les capacités, sauf celles qui sont super efficaces." + }, + "levitate": { + "name": "Lévitation", + "description": "Le Pokémon flotte, ce qui l’immunise contre les capacités de type Sol." + }, + "effectSpore": { + "name": "Pose Spore", + "description": "Peut paralyser, empoisonner ou endormir l’attaquant lorsque le Pokémon subit une attaque directe." + }, + "synchronize": { + "name": "Synchro", + "description": "Quand le Pokémon est brulé, paralysé ou empoisonné par un autre Pokémon, il partage ce statut avec celui-ci." + }, + "clearBody": { + "name": "Corps Sain", + "description": "Empêche les stats du Pokémon de baisser à cause du talent ou d’une capacité de l’adversaire." + }, + "naturalCure": { + "name": "Médic Nature", + "description": "Le Pokémon soigne ses altérations de statut en quittant le combat." + }, + "lightningRod": { + "name": "Paratonnerre", + "description": "Le Pokémon détourne sur lui les capacités de type Électrik et les neutralise, tout en augmentant son Attaque Spéciale." + }, + "sereneGrace": { + "name": "Sérénité", + "description": "Augmente les chances d’infliger des effets additionnels." + }, + "swiftSwim": { + "name": "Glissade", + "description": "Augmente la Vitesse du Pokémon s’il pleut." + }, + "chlorophyll": { + "name": "Chlorophylle", + "description": "Augmente la Vitesse du Pokémon s’il y a du soleil." + }, + "illuminate": { + "name": "Lumiattirance", + "description": "Le Pokémon illumine les alentours, facilitant les rencontres avec les Pokémon sauvages et empêche sa Précision de baisser." + }, + "trace": { + "name": "Calque", + "description": "Lorsque le Pokémon entre au combat, il calque le talent d’un ennemi pour remplacer le sien." + }, + "hugePower": { + "name": "Coloforce", + "description": "Double la puissance des attaques physiques." + }, + "poisonPoint": { + "name": "Point Poison", + "description": "Peut empoisonner l’attaquant lorsque le Pokémon subit une attaque directe." + }, + "innerFocus": { + "name": "Attention", + "description": "Le Pokémon a un mental à toute épreuve qui empêche les attaques ennemies de lui faire peur. Il est aussi immunisé contre le talent Intimidation." + }, + "magmaArmor": { + "name": "Armumagma", + "description": "Le magma qui recouvre le corps du Pokémon le protège contre le gel." + }, + "waterVeil": { + "name": "Ignifu-Voile", + "description": "Le voile qui recouvre le Pokémon le protège des brulures." + }, + "magnetPull": { + "name": "Magnépiège", + "description": "Attire les Pokémon Acier grâce à un champ magnétique, ce qui les empêche de quitter le terrain." + }, + "soundproof": { + "name": "Anti-Bruit", + "description": "Protège le Pokémon de toutes les capacités sonores." + }, + "rainDish": { + "name": "Cuvette", + "description": "Le Pokémon récupère progressivement des PV lorsqu’il pleut." + }, + "sandStream": { + "name": "Sable Volant", + "description": "Le Pokémon invoque une tempête de sable quand il entre au combat." + }, + "pressure": { + "name": "Pression", + "description": "Met la pression à l’adversaire pour le forcer à dépenser plus de PP." + }, + "thickFat": { + "name": "Isograisse", + "description": "Le Pokémon est protégé par une épaisse couche de graisse qui diminue de moitié les dégâts qu’il subit des capacités de types Feu et Glace." + }, + "earlyBird": { + "name": "Matinal", + "description": "Le Pokémon se réveille deux fois plus rapidement que les autres." + }, + "flameBody": { + "name": "Corps Ardent", + "description": "Peut bruler l’attaquant lorsque le Pokémon subit une attaque directe." + }, + "runAway": { + "name": "Fuite", + "description": "Permet de fuir n’importe quel Pokémon sauvage." + }, + "keenEye": { + "name": "Regard Vif", + "description": "Les yeux perçants du Pokémon empêchent sa Précision de baisser." + }, + "hyperCutter": { + "name": "Hyper Cutter", + "description": "Le Pokémon est armé de puissantes pinces qui font sa fierté et empêchent son Attaque d’être baissée par l’adversaire." + }, + "pickup": { + "name": "Ramassage", + "description": "Permet parfois au Pokémon de ramasser les objets que d’autres Pokémon ont utilisés. Il lui arrive aussi d’en trouver hors des combats." + }, + "truant": { + "name": "Absentéisme", + "description": "Lorsque le Pokémon utilise une capacité, il passe le tour suivant à paresser." + }, + "hustle": { + "name": "Agitation", + "description": "Améliore l’Attaque du Pokémon, mais diminue la Précision." + }, + "cuteCharm": { + "name": "Joli Sourire", + "description": "Peut séduire l’attaquant lorsque le Pokémon subit une attaque directe." + }, + "plus": { + "name": "Plus", + "description": "L’Attaque Spéciale du Pokémon augmente si un Pokémon allié a le talent Moins ou Plus." + }, + "minus": { + "name": "Moins", + "description": "L’Attaque Spéciale du Pokémon augmente si un Pokémon allié a le talent Moins ou Plus." + }, + "forecast": { + "name": "Météo", + "description": "Le Pokémon prend le type Eau, Feu ou Glace en fonction de la météo." + }, + "stickyHold": { + "name": "Glu", + "description": "Les objets sont collés au corps gluant du Pokémon, ce qui empêche ses adversaires de les dérober." + }, + "shedSkin": { + "name": "Mue", + "description": "Le Pokémon soigne parfois ses altérations de statut en muant." + }, + "guts": { + "name": "Cran", + "description": "Augmente l’Attaque du Pokémon s’il est affecté par une altération de statut." + }, + "marvelScale": { + "name": "Écaille Spéciale", + "description": "Les écailles mystérieuses du Pokémon réagissent aux altérations de statut en augmentant sa Défense." + }, + "liquidOoze": { + "name": "Suintement", + "description": "Le Pokémon suinte un liquide toxique nauséabond qui blesse tous ceux qui tentent de voler ses PV." + }, + "overgrow": { + "name": "Engrais", + "description": "Augmente la puissance des capacités de type Plante du Pokémon quand il a perdu une certaine quantité de PV." + }, + "blaze": { + "name": "Brasier", + "description": "Augmente la puissance des capacités de type Feu du Pokémon quand il a perdu une certaine quantité de PV." + }, + "torrent": { + "name": "Torrent", + "description": "Augmente la puissance des capacités de type Eau du Pokémon quand il a perdu une certaine quantité de PV." + }, + "swarm": { + "name": "Essaim", + "description": "Augmente la puissance des capacités de type Insecte du Pokémon quand il a perdu une certaine quantité de PV." + }, + "rockHead": { + "name": "Tête de Roc", + "description": "Le Pokémon peut utiliser des capacités occasionnant un contrecoup sans perdre de PV." + }, + "drought": { + "name": "Sécheresse", + "description": "Le Pokémon invoque le soleil quand il entre au combat." + }, + "arenaTrap": { + "name": "Piège Sable", + "description": "Empêche l’adversaire de quitter le terrain." + }, + "vitalSpirit": { + "name": "Esprit Vital", + "description": "Empêche le Pokémon de s’endormir." + }, + "whiteSmoke": { + "name": "Écran Fumée", + "description": "Un écran de fumée empêche l’adversaire de baisser les stats du Pokémon." + }, + "purePower": { + "name": "Force Pure", + "description": "Le Pokémon utilise sa maitrise du yoga pour doubler la puissance de ses attaques physiques." + }, + "shellArmor": { + "name": "Coque Armure", + "description": "Le Pokémon est protégé des coups critiques par sa carapace." + }, + "airLock": { + "name": "Air Lock", + "description": "Annule tous les effets de la météo." + }, + "tangledFeet": { + "name": "Pieds Confus", + "description": "Augmente l’Esquive du Pokémon s’il est confus." + }, + "motorDrive": { + "name": "Motorisé", + "description": "Si le Pokémon est touché par une capacité de type Électrik, il ne subit aucun dégât et sa Vitesse augmente." + }, + "rivalry": { + "name": "Rivalité", + "description": "Le Pokémon déteste la concurrence et inflige plus de dégâts si sa cible est du même sexe. Par contre, il en inflige moins si sa cible est du sexe opposé." + }, + "steadfast": { + "name": "Impassible", + "description": "Augmente la Vitesse du Pokémon quand il a peur." + }, + "snowCloak": { + "name": "Rideau Neige", + "description": "Augmente l’Esquive du Pokémon quand il neige." + }, + "gluttony": { + "name": "Gloutonnerie", + "description": "Si le Pokémon tient une Baie à manger en cas de PV bas, il la mange dès qu’il a perdu la moitié de ses PV." + }, + "angerPoint": { + "name": "Colérique", + "description": "Si le Pokémon subit un coup critique, il entre dans une colère noire qui augmente son Attaque au maximum." + }, + "unburden": { + "name": "Délestage", + "description": "Augmente la Vitesse du Pokémon s’il perd ou utilise l’objet qu’il tenait au début du combat." + }, + "heatproof": { + "name": "Ignifugé", + "description": "Diminue de moitié les dégâts infligés au Pokémon par les capacités de type Feu." + }, + "simple": { + "name": "Simple", + "description": "Les changements de stats sont deux fois plus importants pour le Pokémon." + }, + "drySkin": { + "name": "Peau Sèche", + "description": "Quand le soleil brille, le Pokémon perd des PV et subit plus de dégâts des capacités Feu, mais il regagne des PV lorsqu’il pleut ou s’il est touché par une capacité Eau." + }, + "download": { + "name": "Télécharge", + "description": "Le Pokémon compare la Défense et la Défense Spéciale de l’adversaire et, en fonction de la stat la plus basse, il augmente sa propre Attaque ou Attaque Spéciale." + }, + "ironFist": { + "name": "Poing de Fer", + "description": "Augmente la puissance des capacités coups de poing." + }, + "poisonHeal": { + "name": "Soin Poison", + "description": "Quand le Pokémon est empoisonné, il regagne des PV au lieu d’en perdre." + }, + "adaptability": { + "name": "Adaptabilité", + "description": "Quand le Pokémon utilise une capacité du même type que lui, le bonus de puissance qu’elle reçoit est encore plus important que normalement." + }, + "skillLink": { + "name": "Multi-Coups", + "description": "Les capacités pouvant frapper plusieurs fois frappent toujours le nombre maximal de coups." + }, + "hydration": { + "name": "Hydratation", + "description": "Soigne les altérations de statut du Pokémon quand il pleut." + }, + "solarPower": { + "name": "Force Soleil", + "description": "Quand le soleil brille, l’Attaque Spéciale du Pokémon augmente mais il perd des PV à chaque tour." + }, + "quickFeet": { + "name": "Pied Véloce", + "description": "Augmente la Vitesse du Pokémon en cas d’altération de statut." + }, + "normalize": { + "name": "Normalise", + "description": "Toutes les capacités du Pokémon deviennent de type Normal, quel que soit leur type original. Leur puissance augmente légèrement." + }, + "sniper": { + "name": "Sniper", + "description": "Lorsque le Pokémon porte un coup critique, les dégâts infligés augmentent encore plus que d’habitude." + }, + "magicGuard": { + "name": "Garde Magik", + "description": "Seules les attaques peuvent blesser le Pokémon." + }, + "noGuard": { + "name": "Annule Garde", + "description": "Les capacités du Pokémon touchent leur cible à coup sûr, mais les capacités adverses le touchent aussi à coup sûr." + }, + "stall": { + "name": "Frein", + "description": "Le Pokémon utilise toujours sa capacité en dernier." + }, + "technician": { + "name": "Technicien", + "description": "Augmente la puissance des capacités les plus faibles." + }, + "leafGuard": { + "name": "Feuille Garde", + "description": "Protège le Pokémon contre les altérations de statut quand le soleil brille." + }, + "klutz": { + "name": "Maladresse", + "description": "Le Pokémon ne peut utiliser aucun objet tenu." + }, + "moldBreaker": { + "name": "Brise Moule", + "description": "Le Pokémon ignore les talents adverses qui auraient un effet sur ses capacités." + }, + "superLuck": { + "name": "Chanceux", + "description": "Le Pokémon est tellement chanceux qu’il inflige plus fréquemment des coups critiques." + }, + "aftermath": { + "name": "Boom Final", + "description": "Si le Pokémon est mis K.O. par une attaque directe, il inflige des dégâts à l’attaquant avant de s’évanouir." + }, + "anticipation": { + "name": "Anticipation", + "description": "Le Pokémon devine si l’adversaire connait une capacité dangereuse pour lui." + }, + "forewarn": { + "name": "Prédiction", + "description": "Révèle l’une des capacités de l’adversaire quand le combat commence." + }, + "unaware": { + "name": "Inconscient", + "description": "Le Pokémon ignore les changements de stats des autres Pokémon, qu’il attaque ou soit attaqué." + }, + "tintedLens": { + "name": "Lentiteintée", + "description": "Permet à une capacité qui n’est pas très efficace d’infliger des dégâts comme si elle était efficace normalement." + }, + "filter": { + "name": "Filtre", + "description": "Diminue la puissance des attaques super efficaces subies." + }, + "slowStart": { + "name": "Début Calme", + "description": "Divise la Vitesse et l’Attaque du Pokémon par deux pendant les cinq premiers tours du combat." + }, + "scrappy": { + "name": "Querelleur", + "description": "Permet aux capacités de type Normal ou Combat du Pokémon de toucher les Pokémon de type Spectre. Immunise aussi contre le talent Intimidation." + }, + "stormDrain": { + "name": "Lavabo", + "description": "Le Pokémon détourne sur lui les capacités de type Eau et les neutralise, tout en augmentant son Attaque Spéciale." + }, + "iceBody": { + "name": "Corps Gel", + "description": "Régénère peu à peu les PV du Pokémon quand il neige." + }, + "solidRock": { + "name": "Solide Roc", + "description": "Diminue la puissance des attaques super efficaces subies." + }, + "snowWarning": { + "name": "Alerte Neige", + "description": "Le Pokémon invoque la neige quand il entre au combat." + }, + "honeyGather": { + "name": "Cherche Miel", + "description": "Le Pokémon trouve du Miel après un combat et est directement revendu contre de l’argent." + }, + "frisk": { + "name": "Fouille", + "description": "Lorsqu’il entre en combat, le Pokémon peut vérifier la capacité d’un Pokémon adverse." + }, + "reckless": { + "name": "Téméraire", + "description": "Augmente la puissance des capacités occasionnant un contrecoup." + }, + "multitype": { + "name": "Multi-Type", + "description": "Modifie le type du Pokémon en fonction de la plaque qu’il tient." + }, + "flowerGift": { + "name": "Don Floral", + "description": "Augmente l’Attaque et la Défense Spéciale du Pokémon et de ses alliés lorsque le soleil brille." + }, + "badDreams": { + "name": "Mauvais Rêve", + "description": "Inflige des dégâts aux ennemis endormis." + }, + "pickpocket": { + "name": "Pickpocket", + "description": "Vole l’objet que tient l’attaquant quand le Pokémon subit une attaque directe." + }, + "sheerForce": { + "name": "Sans Limite", + "description": "Les capacités ayant un effet additionnel le perdent, mais leur puissance augmente." + }, + "contrary": { + "name": "Contestation", + "description": "Inverse les changements de stats : les augmentations de stats se transforment en baisses, et vice-versa." + }, + "unnerve": { + "name": "Tension", + "description": "Fait stresser l’adversaire, ce qui l’empêche de manger des Baies." + }, + "defiant": { + "name": "Acharné", + "description": "Augmente beaucoup l’Attaque du Pokémon quand ses stats sont baissées par l’adversaire." + }, + "defeatist": { + "name": "Défaitiste", + "description": "Le Pokémon devient défaitiste quand ses PV tombent à la moitié, et son Attaque et son Attaque Spéciale sont divisées par deux." + }, + "cursedBody": { + "name": "Corps Maudit", + "description": "Quand le Pokémon est touché par une capacité adverse, il inflige parfois Entrave sur celle-ci." + }, + "healer": { + "name": "Cœur Soin", + "description": "Soigne parfois une altération de statut d’un allié proche." + }, + "friendGuard": { + "name": "Garde-Ami", + "description": "Diminue les dégâts subis par les alliés." + }, + "weakArmor": { + "name": "Armurouillée", + "description": "Quand le Pokémon est touché par une capacité physique, sa Défense baisse mais sa Vitesse augmente beaucoup." + }, + "heavyMetal": { + "name": "Heavy Metal", + "description": "Double le poids du Pokémon." + }, + "lightMetal": { + "name": "Light Metal", + "description": "Divise par deux le poids du Pokémon." + }, + "multiscale": { + "name": "Multiécaille", + "description": "Le Pokémon subit moins de dégâts quand ses PV sont au maximum." + }, + "toxicBoost": { + "name": "Rage Poison", + "description": "Augmente la puissance des capacités physiques quand le Pokémon est empoisonné." + }, + "flareBoost": { + "name": "Rage Brûlure", + "description": "Augmente la puissance des capacités spéciales quand le Pokémon est brulé." + }, + "harvest": { + "name": "Récolte", + "description": "Permet de réutiliser une même Baie plusieurs fois." + }, + "telepathy": { + "name": "Télépathe", + "description": "Le Pokémon anticipe et évite les attaques de ses alliés." + }, + "moody": { + "name": "Lunatique", + "description": "Augmente beaucoup une stat du Pokémon et en baisse une autre au hasard à chaque tour." + }, + "overcoat": { + "name": "Envelocape", + "description": "Protège des dégâts occasionnés par les tempêtes de sable, ainsi que des effets des capacités qui libèrent de la poudre et des spores." + }, + "poisonTouch": { + "name": "Toxitouche", + "description": "Peut empoisonner l’ennemi par simple contact." + }, + "regenerator": { + "name": "Régé-Force", + "description": "Restaure un peu de PV si le Pokémon est retiré du combat." + }, + "bigPecks": { + "name": "Cœur de Coq", + "description": "Protège des effets qui baissent la Défense." + }, + "sandRush": { + "name": "Baigne Sable", + "description": "Augmente la Vitesse lors des tempêtes de sable." + }, + "wonderSkin": { + "name": "Peau Miracle", + "description": "Le Pokémon résiste mieux aux capacités de statut." + }, + "analytic": { + "name": "Analyste", + "description": "Augmente la puissance des capacités du Pokémon s’il attaque en dernier." + }, + "illusion": { + "name": "Illusion", + "description": "Le Pokémon prend l’apparence du dernier membre de l’équipe pour tromper l’adversaire." + }, + "imposter": { + "name": "Imposteur", + "description": "Le Pokémon prend l’apparence du Pokémon adverse." + }, + "infiltrator": { + "name": "Infiltration", + "description": "Traverse les barrières et les clones adverses pour attaquer directement." + }, + "mummy": { + "name": "Momie", + "description": "Lorsque le Pokémon subit une attaque directe, le talent de l’attaquant est remplacé par Momie." + }, + "moxie": { + "name": "Impudence", + "description": "Quand le Pokémon met un ennemi K.O., sa confiance en lui ne connait plus de limite et son Attaque augmente." + }, + "justified": { + "name": "Cœur Noble", + "description": "Réveille la noblesse du Pokémon lorsqu’il subit une attaque de type Ténèbres, ce qui augmente son Attaque." + }, + "rattled": { + "name": "Phobique", + "description": "Si le Pokémon est touché par le talent Intimidation ou une attaque de type Ténèbres, Spectre ou Insecte, sa phobie se révèle et sa Vitesse augmente." + }, + "magicBounce": { + "name": "Miroir Magik", + "description": "Annule les effets des capacités de statut subies par le Pokémon et les retourne à l’envoyeur." + }, + "sapSipper": { + "name": "Herbivore", + "description": "Annule les attaques de type Plante subies par le Pokémon et augmente son Attaque." + }, + "prankster": { + "name": "Farceur", + "description": "Rend les capacités de statut du Pokémon prioritaires." + }, + "sandForce": { + "name": "Force Sable", + "description": "Augmente la puissance des capacités de types Roche, Sol et Acier en cas de tempête de sable." + }, + "ironBarbs": { + "name": "Épine de Fer", + "description": "Inflige des dégâts à l’attaquant lorsque le Pokémon subit une attaque directe." + }, + "zenMode": { + "name": "Mode Transe", + "description": "Le Pokémon change de forme quand il lui reste moins de la moitié de ses PV." + }, + "victoryStar": { + "name": "Victorieux", + "description": "Augmente la Précision du Pokémon et de ses alliés." + }, + "turboblaze": { + "name": "Turbo Brasier", + "description": "Le Pokémon ignore les talents adverses qui auraient un effet sur ses capacités." + }, + "teravolt": { + "name": "Téra-Voltage", + "description": "Le Pokémon ignore les talents adverses qui auraient un effet sur ses capacités." + }, + "aromaVeil": { + "name": "Aroma-Voile", + "description": "Protège le Pokémon et ses alliés des effets limitant le libre arbitre." + }, + "flowerVeil": { + "name": "Flora-Voile", + "description": "Empêche les alliés de type Plante de subir des baisses de stats et des altérations de statut." + }, + "cheekPouch": { + "name": "Bajoues", + "description": "Le Pokémon récupère des PV lorsqu’il consomme n’importe quelle Baie en plus de bénéficier de ses effets habituels." + }, + "protean": { + "name": "Protéen", + "description": "Le Pokémon prend le type de la capacité qu’il utilise. Ce talent ne peut se déclencher qu’une fois par entrée au combat du Pokémon." + }, + "furCoat": { + "name": "Toison Épaisse", + "description": "Divise par deux les dégâts des capacités physiques subies par le Pokémon." + }, + "magician": { + "name": "Magicien", + "description": "Les capacités volent aussi l’objet tenu par la cible." + }, + "bulletproof": { + "name": "Pare-Balles", + "description": "Protège de certaines capacités lançant des projectiles comme des bombes et des balles." + }, + "competitive": { + "name": "Battant", + "description": "Augmente beaucoup l’Attaque Spéciale du Pokémon quand ses stats ont été baissées par l’adversaire." + }, + "strongJaw": { + "name": "Prognathe", + "description": "Le Pokémon a une mâchoire robuste qui augmente la puissance de ses capacités de morsure." + }, + "refrigerate": { + "name": "Peau Gelée", + "description": "Les capacités de type Normal deviennent de type Glace. Leur puissance augmente légèrement." + }, + "sweetVeil": { + "name": "Gluco-Voile", + "description": "Le Pokémon et ses alliés ne peuvent pas s’endormir." + }, + "stanceChange": { + "name": "Déclic Tactique", + "description": "Le Pokémon prend la Forme Assaut lorsqu’il utilise une capacité offensive, et la Forme Parade lorsqu’il utilise Bouclier Royal." + }, + "galeWings": { + "name": "Ailes Bourrasque", + "description": "Quand les PV du Pokémon sont au maximum, ses capacités de type Vol sont prioritaires." + }, + "megaLauncher": { + "name": "Méga Blaster", + "description": "Augmente la puissance des capacités qui projettent une aura." + }, + "grassPelt": { + "name": "Toison Herbue", + "description": "Augmente la Défense du Pokémon si un champ herbu est actif." + }, + "symbiosis": { + "name": "Symbiose", + "description": "Quand les alliés utilisent l’objet qu’ils tiennent, le Pokémon leur donne l’objet qu’il tient en remplacement." + }, + "toughClaws": { + "name": "Griffe Dure", + "description": "Augmente la puissance des attaques directes du Pokémon." + }, + "pixilate": { + "name": "Peau Féérique", + "description": "Les capacités de type Normal deviennent de type Fée. Leur puissance augmente légèrement." + }, + "gooey": { + "name": "Poisseux", + "description": "Baisse la Vitesse de l’attaquant lorsque le Pokémon subit une attaque directe." + }, + "aerilate": { + "name": "Peau Céleste", + "description": "Les capacités de type Normal deviennent de type Vol. Leur puissance augmente légèrement." + }, + "parentalBond": { + "name": "Amour Filial", + "description": "La mère et son petit unissent leurs forces pour attaquer deux fois d’affilée." + }, + "darkAura": { + "name": "Aura Ténébreuse", + "description": "Augmente la puissance des capacités de type Ténèbres de tous les Pokémon." + }, + "fairyAura": { + "name": "Aura Féérique", + "description": "Augmente la puissance des capacités de type Fée de tous les Pokémon." + }, + "auraBreak": { + "name": "Aura Inversée", + "description": "Inverse l’effet des talents « Aura » afin que ceux-ci baissent la puissance des capacités affectées au lieu de l’augmenter." + }, + "primordialSea": { + "name": "Mer Primaire", + "description": "Altère les conditions météo pour neutraliser les attaques de type Feu." + }, + "desolateLand": { + "name": "Terre Finale", + "description": "Altère les conditions météo pour neutraliser les attaques de type Eau." + }, + "deltaStream": { + "name": "Souffle Delta", + "description": "Altère les conditions météo pour annuler les faiblesses du type Vol." + }, + "stamina": { + "name": "Endurance", + "description": "Augmente la Défense du Pokémon lorsqu’il subit une attaque." + }, + "wimpOut": { + "name": "Escampette", + "description": "Le Pokémon perd confiance quand ses PV tombent à la moitié et s’enfuit dans sa Poké Ball." + }, + "emergencyExit": { + "name": "Repli Tactique", + "description": "Le Pokémon évite les situations inutilement dangereuses. Quand ses PV tombent à la moitié, il se réfugie dans sa Poké Ball." + }, + "waterCompaction": { + "name": "Sable Humide", + "description": "Augmente beaucoup la Défense du Pokémon quand il subit une capacité de type Eau." + }, + "merciless": { + "name": "Cruauté", + "description": "Lorsque le Pokémon attaque un adversaire empoisonné, le coup est forcément critique." + }, + "shieldsDown": { + "name": "Bouclier-Carcan", + "description": "Lorsque le Pokémon perd la moitié de ses PV, son enveloppe se brise et il adopte une posture offensive." + }, + "stakeout": { + "name": "Filature", + "description": "Lorsque le Pokémon attaque une cible qui vient d’entrer sur le terrain en remplacement d’un autre Pokémon, les dégâts infligés sont doublés." + }, + "waterBubble": { + "name": "Aquabulle", + "description": "Réduit la puissance des capacités de type Feu subies par le Pokémon. Il est également immunisé contre les brulures." + }, + "steelworker": { + "name": "Expert Acier", + "description": "Augmente la puissance des attaques de type Acier." + }, + "berserk": { + "name": "Folle Furie", + "description": "Augmente l’Attaque Spéciale du Pokémon lorsque ses PV tombent à la moitié à cause d’une attaque de l’adversaire." + }, + "slushRush": { + "name": "Chasse-Neige", + "description": "Augmente la Vitesse du Pokémon quand il neige." + }, + "longReach": { + "name": "Longue Portée", + "description": "Le Pokémon est capable d’utiliser toutes ses capacités sans entrer en contact direct avec sa cible." + }, + "liquidVoice": { + "name": "Hydrata-Son", + "description": "Toutes les attaques sonores du Pokémon prennent le type Eau." + }, + "triage": { + "name": "Prioguérison", + "description": "Rend les capacités de soin prioritaires." + }, + "galvanize": { + "name": "Peau Électrique", + "description": "Les capacités de type Normal deviennent de type Électrik. Leur puissance augmente légèrement." + }, + "surgeSurfer": { + "name": "Surf Caudal", + "description": "La Vitesse du Pokémon est doublée sur un champ électrifié." + }, + "schooling": { + "name": "Banc", + "description": "Le Pokémon se rassemble avec ses congénères quand ses PV sont élevés. Quand il ne lui reste plus beaucoup de PV, le banc se disperse." + }, + "disguise": { + "name": "Fantômasque", + "description": "Le déguisement qui recouvre le corps du Pokémon est capable de le protéger d’une attaque." + }, + "battleBond": { + "name": "Synergie", + "description": "En battant un ennemi, ce Pokémon renforce ses liens avec son Dresseur, ce qui augmente son Attaque, son Attaque Spéciale et sa Vitesse." + }, + "powerConstruct": { + "name": "Rassemblement", + "description": "Lorsque le Pokémon perd la moitié de ses PV, ses Cellules se rassemblent pour l’encourager, ce qui lui permet de prendre sa Forme Parfaite." + }, + "corrosion": { + "name": "Corrosion", + "description": "Permet d’empoisonner les Pokémon de type Acier ou Poison." + }, + "comatose": { + "name": "Hypersommeil", + "description": "Le Pokémon rêve en permanence et ne se réveille jamais. Il est capable d’attaquer normalement tout en dormant." + }, + "queenlyMajesty": { + "name": "Prestance Royale", + "description": "L’adversaire est impressionné par la majesté du Pokémon et ne peut pas le viser avec une capacité prioritaire." + }, + "innardsOut": { + "name": "Expuls’Organes", + "description": "Le Pokémon inflige à l’adversaire l’ayant mis K.O. des dégâts égaux au nombre de PV qu’il lui restait avant le coup de grâce." + }, + "dancer": { + "name": "Danseuse", + "description": "Si n’importe quel Pokémon utilise une capacité dansante, le Pokémon utilise immédiatement cette danse lui aussi." + }, + "battery": { + "name": "Batterie", + "description": "Augmente la puissance des capacités spéciales des alliés." + }, + "fluffy": { + "name": "Boule de Poils", + "description": "Divise par deux les dégâts des attaques directes subies par le Pokémon, mais double les dégâts des capacités de type Feu." + }, + "dazzling": { + "name": "Corps Coloré", + "description": "L’adversaire est abasourdi par le Pokémon et ne peut pas le viser avec une capacité prioritaire." + }, + "soulHeart": { + "name": "Animacœur", + "description": "Augmente l’Attaque Spéciale du Pokémon lorsqu’un autre Pokémon est mis K.O." + }, + "tanglingHair": { + "name": "Mèche Rebelle", + "description": "Baisse la Vitesse de l’attaquant lorsque le Pokémon subit une attaque directe." + }, + "receiver": { + "name": "Receveur", + "description": "Le Pokémon reçoit le talent d’un allié mis K.O." + }, + "powerOfAlchemy": { + "name": "Osmose", + "description": "Le Pokémon acquiert le talent d’un allié mis K.O." + }, + "beastBoost": { + "name": "Boost Chimère", + "description": "Augmente la stat la plus élevée du Pokémon quand il met K.O. un autre Pokémon." + }, + "rksSystem": { + "name": "Système Alpha", + "description": "Change le type du Pokémon en fonction de la ROM équipée." + }, + "electricSurge": { + "name": "Créa-Élec", + "description": "Le Pokémon crée un champ électrifié au moment où il entre au combat." + }, + "psychicSurge": { + "name": "Créa-Psy", + "description": "Le Pokémon crée un champ psychique au moment où il entre au combat." + }, + "mistySurge": { + "name": "Créa-Brume", + "description": "Le Pokémon crée un champ brumeux au moment où il entre au combat." + }, + "grassySurge": { + "name": "Créa-Herbe", + "description": "Le Pokémon crée un champ herbu au moment où il entre au combat." + }, + "fullMetalBody": { + "name": "Métallo-Garde", + "description": "Empêche les stats du Pokémon de baisser à cause du talent ou d’une capacité de l’adversaire." + }, + "shadowShield": { + "name": "Spectro-Bouclier", + "description": "Le Pokémon subit moins de dégâts quand ses PV sont au maximum." + }, + "prismArmor": { + "name": "Prisme-Armure", + "description": "Diminue la puissance des attaques super efficaces subies." + }, + "neuroforce": { + "name": "Cérébro-Force", + "description": "Augmente encore plus la puissance des attaques super efficaces." + }, + "intrepidSword": { + "name": "Lame Indomptable", + "description": "Augmente l’Attaque du Pokémon la première fois qu’il entre au combat." + }, + "dauntlessShield": { + "name": "Égide Inflexible", + "description": "Augmente la Défense du Pokémon la première fois qu’il entre au combat." + }, + "libero": { + "name": "Libéro", + "description": "Le Pokémon prend le type de la capacité qu’il utilise. Ce talent ne peut se déclencher qu’une fois par entrée au combat du Pokémon." + }, + "ballFetch": { + "name": "Ramasse Ball", + "description": "Si le Pokémon ne tient aucun objet, il ramassera la Poké Ball lors du premier lancer raté du combat." + }, + "cottonDown": { + "name": "Effilochage", + "description": "Quand le Pokémon est touché par une attaque, il dissémine des aigrettes qui diminuent la Vitesse de tout le monde, sauf la sienne." + }, + "propellerTail": { + "name": "Propulseur", + "description": "Permet d’ignorer l’effet des capacités ou des talents qui attirent les capacités." + }, + "mirrorArmor": { + "name": "Armure Miroir", + "description": "Le Pokémon renvoie les effets réducteurs de stats qu’il reçoit." + }, + "gulpMissile": { + "name": "Dégobage", + "description": "Quand le Pokémon utilise Surf ou Plongée, il revient avec une proie. Lorsqu’il subit des dégâts par la suite, il attaque en recrachant sa proie." + }, + "stalwart": { + "name": "Nerfs d’Acier", + "description": "Permet d’ignorer l’effet des capacités ou des talents qui attirent les capacités." + }, + "steamEngine": { + "name": "Turbine", + "description": "Lorsque le Pokémon est touché par des capacités de type Eau ou Feu, sa Vitesse augmente énormément." + }, + "punkRock": { + "name": "Punk Rock", + "description": "Augmente la puissance des capacités basées sur le son. Le Pokémon ne subit que la moitié des dégâts quand il est touché par ce genre de capacités." + }, + "sandSpit": { + "name": "Expul’Sable", + "description": "Le Pokémon déclenche une tempête de sable quand il subit une attaque." + }, + "iceScales": { + "name": "Écailles Glacées", + "description": "Le Pokémon est protégé par des écailles de glace. Les dégâts qu’il subit par des capacités spéciales sont divisés par deux." + }, + "ripen": { + "name": "Mûrissement", + "description": "Le Pokémon fait murir la Baie qu’il tient et double ainsi son effet." + }, + "iceFace": { + "name": "Tête de Gel", + "description": "Le glaçon sur sa tête encaisse les attaques physiques à la place du Pokémon, mais sa destruction modifie son apparence. Le glaçon se reforme quand il neige." + }, + "powerSpot": { + "name": "Cercle d’Énergie", + "description": "Augmente la puissance des capacités des Pokémon qui se trouvent à proximité." + }, + "mimicry": { + "name": "Mimétisme", + "description": "Le Pokémon adopte le même type que le terrain lorsqu’un champ est actif." + }, + "screenCleaner": { + "name": "Brise-Barrière", + "description": "Quand le Pokémon entre au combat, les effets de Mur Lumière, Protection et Voile Aurore disparaissent pour les alliés comme pour les adversaires." + }, + "steelySpirit": { + "name": "Boost Acier", + "description": "Augmente la puissance des attaques de type Acier du Pokémon et de ses alliés." + }, + "perishBody": { + "name": "Corps Condamné", + "description": "Lorsque le Pokémon est directement touché par une capacité, l’assaillant et lui tomberont K.O. dans trois tours, à moins qu’ils ne soient remplacés entre temps." + }, + "wanderingSpirit": { + "name": "Âme Vagabonde", + "description": "Lorsque le Pokémon est directement touché par une capacité, il échange son talent avec celui de l’assaillant." + }, + "gorillaTactics": { + "name": "Entêtement", + "description": "Augmente l’Attaque, mais empêche d’utiliser toute autre capacité que celle utilisée en premier par le Pokémon." + }, + "neutralizingGas": { + "name": "Gaz Inhibiteur", + "description": "Si un Pokémon avec Gaz Inhibiteur est sur le terrain, les effets des talents de tous les autres Pokémon ne s’activent pas ou sont neutralisés." + }, + "pastelVeil": { + "name": "Voile Pastel", + "description": "Protège le Pokémon et ses alliés contre toutes les altérations de statut liées à l’empoisonnement." + }, + "hungerSwitch": { + "name": "Déclic Fringale", + "description": "À la fin de chaque tour, le Pokémon alterne entre ses formes Mode Rassasié et Mode Affamé." + }, + "quickDraw": { + "name": "Tir Vif", + "description": "Permet parfois au Pokémon d’agir en premier." + }, + "unseenFist": { + "name": "Poing Invisible", + "description": "Si le Pokémon utilise une attaque directe, celle-ci pourra toucher la cible même si elle se protège." + }, + "curiousMedicine": { + "name": "Breuvage Suspect", + "description": "Quand il entre au combat, le Pokémon répand une substance qui annule les changements de stats de ses alliés." + }, + "transistor": { + "name": "Transistor", + "description": "Augmente la puissance des capacités de type Électrik." + }, + "dragonsMaw": { + "name": "Dent de Dragon", + "description": "Augmente la puissance des capacités de type Dragon." + }, + "chillingNeigh": { + "name": "Blanche Ruade", + "description": "Quand le Pokémon met un ennemi K.O., il émet un hennissement glaçant, ce qui augmente son Attaque." + }, + "grimNeigh": { + "name": "Sombre Ruade", + "description": "Quand le Pokémon met un ennemi K.O., il émet un hennissement terrifiant qui augmente son Attaque Spéciale." + }, + "asOneGlastrier": { + "name": "Osmose Équine", + "description": "Les talents Tension de Sylveroy et Blanche Ruade de Blizzeval sont cumulés." + }, + "asOneSpectrier": { + "name": "Osmose Équine", + "description": "Les talents Tension de Sylveroy et Sombre Ruade de Spectreval sont cumulés." + }, + "lingeringAroma": { + "name": "Odeur Tenace", + "description": "Lorsque le Pokémon subit une attaque directe, le talent de l’attaquant est remplacé par Odeur Tenace." + }, + "seedSower": { + "name": "Semencier", + "description": "Le Pokémon crée un champ herbu quand il subit une attaque." + }, + "thermalExchange": { + "name": "Thermodynamique", + "description": "Lorsque le Pokémon est touché par une capacité de type Feu, il ne subit aucun dégât et son Attaque augmente." + }, + "angerShell": { + "name": "Courroupace", + "description": "Le Pokémon enrage s’il a moins de la moitié de ses PV après avoir subi une attaque. Sa Déf. et sa Déf. Spé. baissent, et son Atq., son Atq. Spé. et sa Vit. augmentent." + }, + "purifyingSalt": { + "name": "Sel Purificateur", + "description": "Le sel pur immunise le Pokémon contre les altérations de statut, et diminue de moitié les dégâts des capacités de type Spectre." + }, + "wellBakedBody": { + "name": "Bien Cuit", + "description": "Si le Pokémon est touché par une capacité de type Feu, il ne subit aucun dégât et sa Défense augmente beaucoup." + }, + "windRider": { + "name": "Aéroporté", + "description": "L’Attaque du Pokémon augmente si un vent arrière souffle ou s’il est touché par une capacité faisant appel au vent. Dans ce dernier cas, il ne subit aucun dégât." + }, + "guardDog": { + "name": "Chien de Garde", + "description": "L’Attaque du Pokémon augmente s’il subit l’effet du talent Intimidation. Les capacités ou objets qui font changer de Pokémon n’ont aucun effet sur lui." + }, + "rockyPayload": { + "name": "Porte-Roche", + "description": "Augmente la puissance des capacités de type Roche." + }, + "windPower": { + "name": "Turbine Éolienne", + "description": "Si le Pokémon est touché par une capacité faisant appel au vent, il se charge en électricité." + }, + "zeroToHero": { + "name": "Supermutation", + "description": "Le Pokémon prend sa Forme Super en quittant le combat." + }, + "commander": { + "name": "Commandant", + "description": "Si un Oyacata allié est sur le terrain quand ce Pokémon rejoint le combat, ce dernier entre dans sa bouche et devient son commandant." + }, + "electromorphosis": { + "name": "Grecharge", + "description": "Si le Pokémon subit des dégâts, il se charge en électricité." + }, + "protosynthesis": { + "name": "Paléosynthèse", + "description": "Quand le soleil brille ou que le Pokémon tient une capsule d’Énergie Booster, sa stat la plus élevée augmente." + }, + "quarkDrive": { + "name": "Charge Quantique", + "description": "Quand un champ électrifié est actif ou que le Pokémon tient une capsule d’Énergie Booster, sa stat la plus élevée augmente." + }, + "goodAsGold": { + "name": "Corps en Or", + "description": "Le corps en or pur et robuste du Pokémon l’immunise contre les capacités de statut des autres Pokémon." + }, + "vesselOfRuin": { + "name": "Urne du Fléau", + "description": "Le pouvoir de l’urne qui appelle le fléau affaiblit l’Attaque Spéciale de tous les autres Pokémon." + }, + "swordOfRuin": { + "name": "Épée du Fléau", + "description": "Le pouvoir de l’épée qui appelle le fléau affaiblit la Défense de tous les autres Pokémon." + }, + "tabletsOfRuin": { + "name": "Bois du Fléau", + "description": "Le pouvoir du bois qui appelle le fléau affaiblit l’Attaque de tous les autres Pokémon." + }, + "beadsOfRuin": { + "name": "Perles du Fléau", + "description": "Le pouvoir des perles qui appellent le fléau affaiblit la Défense Spéciale de tous les autres Pokémon." + }, + "orichalcumPulse": { + "name": "Pouls Orichalque", + "description": "Le Pokémon invoque le soleil quand il rejoint le combat. Quand les rayons du soleil sont intenses, une pulsation primitive augmente son Attaque." + }, + "hadronEngine": { + "name": "Moteur à Hadrons", + "description": "Le Pokémon crée un champ électrifié quand il rejoint le combat. Une machine du futur fait monter son Attaque Spéciale si un champ électrifié est actif." + }, + "opportunist": { + "name": "Opportuniste", + "description": "Quand les stats de l’ennemi augmentent, le Pokémon en profite pour augmenter ses stats de la même manière." + }, + "cudChew": { + "name": "Ruminant", + "description": "Quand le Pokémon mange une Baie, il la régurgite à la fin du tour suivant et la mange une nouvelle fois." + }, + "sharpness": { + "name": "Incisif", + "description": "Augmente la puissance des capacités tranchantes." + }, + "supremeOverlord": { + "name": "Général Suprême", + "description": "Quand le Pokémon entre sur le terrain, son Attaque et son Attaque Spéciale augmentent légèrement pour chaque allié mis K.O. auparavant." + }, + "costar": { + "name": "Collab", + "description": "Quand le Pokémon entre sur le terrain, il copie les changements de stats de son allié." + }, + "toxicDebris": { + "name": "Dépôt Toxique", + "description": "Quand le Pokémon est touché par une capacité physique, il répand des pics toxiques dans le camp adverse." + }, + "armorTail": { + "name": "Armure Caudale", + "description": "L’étrange queue qui recouvre la tête du Pokémon empêche ce dernier d’être visé par une capacité prioritaire." + }, + "earthEater": { + "name": "Absorbe-Terre", + "description": "Si le Pokémon est touché par une capacité de type Sol, il regagne des PV au lieu de subir des dégâts." + }, + "myceliumMight": { + "name": "Force Fongique", + "description": "Le Pokémon agit toujours plus lentement quand il utilise une capacité de statut, mais il ignore les talents adverses." + }, + "mindsEye": { + "name": "Œil Révélateur", + "description": "Le Pokémon ignore les changements d’Esquive des cibles et peut toucher les Pokémon Spectre avec des capacités Normal ou Combat. Sa Précision ne peut pas baisser." + }, + "supersweetSyrup": { + "name": "Nectar Mielleux", + "description": "La première fois que le Pokémon entre au combat, une odeur de nectar sucré se répand sur le terrain, ce qui baisse l’Esquive de l’adversaire." + }, + "hospitality": { + "name": "Aux Petits Soins", + "description": "Quand il rejoint le combat, ce Pokémon est aux petits soins avec son allié et restaure quelques PV." + }, + "toxicChain": { + "name": "Chaîne Toxique", + "description": "Grâce aux pouvoirs de sa chaine imprégnée de toxines, le Pokémon peut empoisonner gravement sa cible en la touchant avec une capacité." + }, + "embodyAspectTeal": { + "name": "Force Mémorielle", + "description": "Le Pokémon fait briller le Masque Turquoise en puisant dans ses souvenirs, ce qui augmente sa Vitesse." + }, + "embodyAspectWellspring": { + "name": "Force Mémorielle", + "description": "Le Pokémon fait briller le Masque du Puits en puisant dans ses souvenirs, ce qui augmente sa Défense Spéciale." + }, + "embodyAspectHearthflame": { + "name": "Force Mémorielle", + "description": "Le Pokémon fait briller le Masque du Fourneau en puisant dans ses souvenirs, ce qui augmente son Attaque." + }, + "embodyAspectCornerstone": { + "name": "Force Mémorielle", + "description": "Le Pokémon fait briller le Masque de la Pierre en puisant dans ses souvenirs, ce qui augmente sa Défense." + }, + "teraShift": { + "name": "Téramorphose", + "description": "Quand le Pokémon rejoint le combat, il absorbe l’énergie alentour et prend sa Forme Téracristal." + }, + "teraShell": { + "name": "Téra-Carapace", + "description": "Grâce à sa carapace qui renferme l’énergie de tous les types, les capacités subies par ce Pokémon quand ses PV sont au maximum ne sont pas très efficaces." + }, + "teraformZero": { + "name": "Téraformation 0", + "description": "Lorsque Terapagos prend sa Forme Stellaire, il utilise son pouvoir enfoui pour annuler les effets de la météo et des champs actifs." + }, + "poisonPuppeteer": { + "name": "Emprise Toxique", + "description": "Lorsque Pêchaminus empoisonne un Pokémon grâce à l’une de ses capacités, ce dernier devient également confus." + } +} diff --git a/src/locales/fr/ability.ts b/src/locales/fr/ability.ts deleted file mode 100644 index a69519e187a..00000000000 --- a/src/locales/fr/ability.ts +++ /dev/null @@ -1,1244 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -export const ability: AbilityTranslationEntries = { - stench: { - name: "Puanteur", - description: "Le Pokémon émet une odeur si nauséabonde qu’il peut effrayer sa cible en l’attaquant.", - }, - drizzle: { - name: "Crachin", - description: "Le Pokémon invoque la pluie quand il entre au combat.", - }, - speedBoost: { - name: "Turbo", - description: "La Vitesse du Pokémon augmente à chaque tour.", - }, - battleArmor: { - name: "Armurbaston", - description: "Le Pokémon est protégé des coups critiques par une solide carapace.", - }, - sturdy: { - name: "Fermeté", - description: "Le Pokémon encaisse toujours au moins une attaque s’il a tous ses PV. Il est également immunisé contre les capacités pouvant mettre K.O. en un coup.", - }, - damp: { - name: "Moiteur", - description: "Le Pokémon augmente l’humidité de l’air, ce qui empêche tous les Pokémon d’utiliser des capacités explosives telles que Destruction.", - }, - limber: { - name: "Échauffement", - description: "Le Pokémon s’est suffisamment échauffé, ce qui l’immunise contre la paralysie.", - }, - sandVeil: { - name: "Voile Sable", - description: "Augmente l’Esquive du Pokémon lors des tempêtes de sable.", - }, - static: { - name: "Statik", - description: "Le Pokémon charge son corps en électricité statique, et tout contact avec lui peut paralyser.", - }, - voltAbsorb: { - name: "Absorbe-Volt", - description: "Si le Pokémon est touché par une capacité Électrik, il ne subit aucun dégât et regagne des PV à la place.", - }, - waterAbsorb: { - name: "Absorbe-Eau", - description: "Si le Pokémon est touché par une capacité Eau, il ne subit aucun dégât et regagne des PV à la place.", - }, - oblivious: { - name: "Benêt", - description: "Le Pokémon est un grand benêt, ce qui l’immunise contre l’attraction, la provocation ou l’intimidation.", - }, - cloudNine: { - name: "Ciel Gris", - description: "Annule tous les effets liés à la météo.", - }, - compoundEyes: { - name: "Œil Composé", - description: "Les yeux à facettes du Pokémon augmentent la Précision de ses capacités.", - }, - insomnia: { - name: "Insomnia", - description: "Le Pokémon est incapable de dormir.", - }, - colorChange: { - name: "Homochromie", - description: "Lorsque le Pokémon est touché par une capacité, il prend le type de celle-ci.", - }, - immunity: { - name: "Vaccin", - description: "Le Pokémon est naturellement immunisé contre toute forme de poison.", - }, - flashFire: { - name: "Torche", - description: "Lorsque le Pokémon est touché par une capacité de type Feu, il absorbe la chaleur pour renforcer ses propres capacités Feu.", - }, - shieldDust: { - name: "Écran Poudre", - description: "Le Pokémon dispose d’un écran naturel qui le protège des effets additionnels des attaques ennemies.", - }, - ownTempo: { - name: "Tempo Perso", - description: "Le Pokémon vit sa vie à son propre rythme, ce qui l’immunise contre la confusion et l’intimidation.", - }, - suctionCups: { - name: "Ventouse", - description: "Le Pokémon est solidement fixé au sol par des ventouses, ce qui le protège des capacités ou objets qui font changer de Pokémon.", - }, - intimidate: { - name: "Intimidation", - description: "Le Pokémon rugit lorsqu’il arrive au combat, ce qui intimide l’ennemi et baisse son Attaque.", - }, - shadowTag: { - name: "Marque Ombre", - description: "Empêche les Pokémon ennemis de quitter le terrain.", - }, - roughSkin: { - name: "Peau Dure", - description: "Blesse l’attaquant lorsque le Pokémon subit une attaque directe.", - }, - wonderGuard: { - name: "Garde Mystik", - description: "Une puissance mystérieuse protège le Pokémon contre toutes les capacités, sauf celles qui sont super efficaces.", - }, - levitate: { - name: "Lévitation", - description: "Le Pokémon flotte, ce qui l’immunise contre les capacités de type Sol.", - }, - effectSpore: { - name: "Pose Spore", - description: "Peut paralyser, empoisonner ou endormir l’attaquant lorsque le Pokémon subit une attaque directe.", - }, - synchronize: { - name: "Synchro", - description: "Quand le Pokémon est brulé, paralysé ou empoisonné par un autre Pokémon, il partage ce statut avec celui-ci.", - }, - clearBody: { - name: "Corps Sain", - description: "Empêche les stats du Pokémon de baisser à cause du talent ou d’une capacité de l’adversaire.", - }, - naturalCure: { - name: "Médic Nature", - description: "Le Pokémon soigne ses altérations de statut en quittant le combat.", - }, - lightningRod: { - name: "Paratonnerre", - description: "Le Pokémon détourne sur lui les capacités de type Électrik et les neutralise, tout en augmentant son Attaque Spéciale.", - }, - sereneGrace: { - name: "Sérénité", - description: "Augmente les chances d’infliger des effets additionnels.", - }, - swiftSwim: { - name: "Glissade", - description: "Augmente la Vitesse du Pokémon s’il pleut.", - }, - chlorophyll: { - name: "Chlorophylle", - description: "Augmente la Vitesse du Pokémon s’il y a du soleil.", - }, - illuminate: { - name: "Lumiattirance", - description: "Le Pokémon illumine les alentours, facilitant les rencontres avec les Pokémon sauvages et empêche sa Précision de baisser.", - }, - trace: { - name: "Calque", - description: "Lorsque le Pokémon entre au combat, il calque le talent d’un ennemi pour remplacer le sien.", - }, - hugePower: { - name: "Coloforce", - description: "Double la puissance des attaques physiques.", - }, - poisonPoint: { - name: "Point Poison", - description: "Peut empoisonner l’attaquant lorsque le Pokémon subit une attaque directe.", - }, - innerFocus: { - name: "Attention", - description: "Le Pokémon a un mental à toute épreuve qui empêche les attaques ennemies de lui faire peur. Il est aussi immunisé contre le talent Intimidation.", - }, - magmaArmor: { - name: "Armumagma", - description: "Le magma qui recouvre le corps du Pokémon le protège contre le gel.", - }, - waterVeil: { - name: "Ignifu-Voile", - description: "Le voile qui recouvre le Pokémon le protège des brulures.", - }, - magnetPull: { - name: "Magnépiège", - description: "Attire les Pokémon Acier grâce à un champ magnétique, ce qui les empêche de quitter le terrain.", - }, - soundproof: { - name: "Anti-Bruit", - description: "Protège le Pokémon de toutes les capacités sonores.", - }, - rainDish: { - name: "Cuvette", - description: "Le Pokémon récupère progressivement des PV lorsqu’il pleut.", - }, - sandStream: { - name: "Sable Volant", - description: "Le Pokémon invoque une tempête de sable quand il entre au combat.", - }, - pressure: { - name: "Pression", - description: "Met la pression à l’adversaire pour le forcer à dépenser plus de PP.", - }, - thickFat: { - name: "Isograisse", - description: "Le Pokémon est protégé par une épaisse couche de graisse qui diminue de moitié les dégâts qu’il subit des capacités de types Feu et Glace.", - }, - earlyBird: { - name: "Matinal", - description: "Le Pokémon se réveille deux fois plus rapidement que les autres.", - }, - flameBody: { - name: "Corps Ardent", - description: "Peut bruler l’attaquant lorsque le Pokémon subit une attaque directe.", - }, - runAway: { - name: "Fuite", - description: "Permet de fuir n’importe quel Pokémon sauvage.", - }, - keenEye: { - name: "Regard Vif", - description: "Les yeux perçants du Pokémon empêchent sa Précision de baisser.", - }, - hyperCutter: { - name: "Hyper Cutter", - description: "Le Pokémon est armé de puissantes pinces qui font sa fierté et empêchent son Attaque d’être baissée par l’adversaire.", - }, - pickup: { - name: "Ramassage", - description: "Permet parfois au Pokémon de ramasser les objets que d’autres Pokémon ont utilisés. Il lui arrive aussi d’en trouver hors des combats.", - }, - truant: { - name: "Absentéisme", - description: "Lorsque le Pokémon utilise une capacité, il passe le tour suivant à paresser.", - }, - hustle: { - name: "Agitation", - description: "Améliore l’Attaque du Pokémon, mais diminue la Précision.", - }, - cuteCharm: { - name: "Joli Sourire", - description: "Peut séduire l’attaquant lorsque le Pokémon subit une attaque directe.", - }, - plus: { - name: "Plus", - description: "L’Attaque Spéciale du Pokémon augmente si un Pokémon allié a le talent Moins ou Plus.", - }, - minus: { - name: "Moins", - description: "L’Attaque Spéciale du Pokémon augmente si un Pokémon allié a le talent Moins ou Plus.", - }, - forecast: { - name: "Météo", - description: "Le Pokémon prend le type Eau, Feu ou Glace en fonction de la météo.", - }, - stickyHold: { - name: "Glu", - description: "Les objets sont collés au corps gluant du Pokémon, ce qui empêche ses adversaires de les dérober.", - }, - shedSkin: { - name: "Mue", - description: "Le Pokémon soigne parfois ses altérations de statut en muant.", - }, - guts: { - name: "Cran", - description: "Augmente l’Attaque du Pokémon s’il est affecté par une altération de statut.", - }, - marvelScale: { - name: "Écaille Spéciale", - description: "Les écailles mystérieuses du Pokémon réagissent aux altérations de statut en augmentant sa Défense.", - }, - liquidOoze: { - name: "Suintement", - description: "Le Pokémon suinte un liquide toxique nauséabond qui blesse tous ceux qui tentent de voler ses PV.", - }, - overgrow: { - name: "Engrais", - description: "Augmente la puissance des capacités de type Plante du Pokémon quand il a perdu une certaine quantité de PV.", - }, - blaze: { - name: "Brasier", - description: "Augmente la puissance des capacités de type Feu du Pokémon quand il a perdu une certaine quantité de PV.", - }, - torrent: { - name: "Torrent", - description: "Augmente la puissance des capacités de type Eau du Pokémon quand il a perdu une certaine quantité de PV.", - }, - swarm: { - name: "Essaim", - description: "Augmente la puissance des capacités de type Insecte du Pokémon quand il a perdu une certaine quantité de PV.", - }, - rockHead: { - name: "Tête de Roc", - description: "Le Pokémon peut utiliser des capacités occasionnant un contrecoup sans perdre de PV.", - }, - drought: { - name: "Sécheresse", - description: "Le Pokémon invoque le soleil quand il entre au combat.", - }, - arenaTrap: { - name: "Piège Sable", - description: "Empêche l’adversaire de quitter le terrain.", - }, - vitalSpirit: { - name: "Esprit Vital", - description: "Empêche le Pokémon de s’endormir.", - }, - whiteSmoke: { - name: "Écran Fumée", - description: "Un écran de fumée empêche l’adversaire de baisser les stats du Pokémon.", - }, - purePower: { - name: "Force Pure", - description: "Le Pokémon utilise sa maitrise du yoga pour doubler la puissance de ses attaques physiques.", - }, - shellArmor: { - name: "Coque Armure", - description: "Le Pokémon est protégé des coups critiques par sa carapace.", - }, - airLock: { - name: "Air Lock", - description: "Annule tous les effets de la météo.", - }, - tangledFeet: { - name: "Pieds Confus", - description: "Augmente l’Esquive du Pokémon s’il est confus.", - }, - motorDrive: { - name: "Motorisé", - description: "Si le Pokémon est touché par une capacité de type Électrik, il ne subit aucun dégât et sa Vitesse augmente.", - }, - rivalry: { - name: "Rivalité", - description: "Le Pokémon déteste la concurrence et inflige plus de dégâts si sa cible est du même sexe. Par contre, il en inflige moins si sa cible est du sexe opposé.", - }, - steadfast: { - name: "Impassible", - description: "Augmente la Vitesse du Pokémon quand il a peur.", - }, - snowCloak: { - name: "Rideau Neige", - description: "Augmente l’Esquive du Pokémon quand il neige.", - }, - gluttony: { - name: "Gloutonnerie", - description: "Si le Pokémon tient une Baie à manger en cas de PV bas, il la mange dès qu’il a perdu la moitié de ses PV.", - }, - angerPoint: { - name: "Colérique", - description: "Si le Pokémon subit un coup critique, il entre dans une colère noire qui augmente son Attaque au maximum.", - }, - unburden: { - name: "Délestage", - description: "Augmente la Vitesse du Pokémon s’il perd ou utilise l’objet qu’il tenait au début du combat.", - }, - heatproof: { - name: "Ignifugé", - description: "Diminue de moitié les dégâts infligés au Pokémon par les capacités de type Feu.", - }, - simple: { - name: "Simple", - description: "Les changements de stats sont deux fois plus importants pour le Pokémon.", - }, - drySkin: { - name: "Peau Sèche", - description: "Quand le soleil brille, le Pokémon perd des PV et subit plus de dégâts des capacités Feu, mais il regagne des PV lorsqu’il pleut ou s’il est touché par une capacité Eau.", - }, - download: { - name: "Télécharge", - description: "Le Pokémon compare la Défense et la Défense Spéciale de l’adversaire et, en fonction de la stat la plus basse, il augmente sa propre Attaque ou Attaque Spéciale.", - }, - ironFist: { - name: "Poing de Fer", - description: "Augmente la puissance des capacités coups de poing.", - }, - poisonHeal: { - name: "Soin Poison", - description: "Quand le Pokémon est empoisonné, il regagne des PV au lieu d’en perdre.", - }, - adaptability: { - name: "Adaptabilité", - description: "Quand le Pokémon utilise une capacité du même type que lui, le bonus de puissance qu’elle reçoit est encore plus important que normalement.", - }, - skillLink: { - name: "Multi-Coups", - description: "Les capacités pouvant frapper plusieurs fois frappent toujours le nombre maximal de coups.", - }, - hydration: { - name: "Hydratation", - description: "Soigne les altérations de statut du Pokémon quand il pleut.", - }, - solarPower: { - name: "Force Soleil", - description: "Quand le soleil brille, l’Attaque Spéciale du Pokémon augmente mais il perd des PV à chaque tour.", - }, - quickFeet: { - name: "Pied Véloce", - description: "Augmente la Vitesse du Pokémon en cas d’altération de statut.", - }, - normalize: { - name: "Normalise", - description: "Toutes les capacités du Pokémon deviennent de type Normal, quel que soit leur type original. Leur puissance augmente légèrement.", - }, - sniper: { - name: "Sniper", - description: "Lorsque le Pokémon porte un coup critique, les dégâts infligés augmentent encore plus que d’habitude.", - }, - magicGuard: { - name: "Garde Magik", - description: "Seules les attaques peuvent blesser le Pokémon.", - }, - noGuard: { - name: "Annule Garde", - description: "Les capacités du Pokémon touchent leur cible à coup sûr, mais les capacités adverses le touchent aussi à coup sûr.", - }, - stall: { - name: "Frein", - description: "Le Pokémon utilise toujours sa capacité en dernier.", - }, - technician: { - name: "Technicien", - description: "Augmente la puissance des capacités les plus faibles.", - }, - leafGuard: { - name: "Feuille Garde", - description: "Protège le Pokémon contre les altérations de statut quand le soleil brille.", - }, - klutz: { - name: "Maladresse", - description: "Le Pokémon ne peut utiliser aucun objet tenu.", - }, - moldBreaker: { - name: "Brise Moule", - description: "Le Pokémon ignore les talents adverses qui auraient un effet sur ses capacités.", - }, - superLuck: { - name: "Chanceux", - description: "Le Pokémon est tellement chanceux qu’il inflige plus fréquemment des coups critiques.", - }, - aftermath: { - name: "Boom Final", - description: "Si le Pokémon est mis K.O. par une attaque directe, il inflige des dégâts à l’attaquant avant de s’évanouir.", - }, - anticipation: { - name: "Anticipation", - description: "Le Pokémon devine si l’adversaire connait une capacité dangereuse pour lui.", - }, - forewarn: { - name: "Prédiction", - description: "Révèle l’une des capacités de l’adversaire quand le combat commence.", - }, - unaware: { - name: "Inconscient", - description: "Le Pokémon ignore les changements de stats des autres Pokémon, qu’il attaque ou soit attaqué.", - }, - tintedLens: { - name: "Lentiteintée", - description: "Permet à une capacité qui n’est pas très efficace d’infliger des dégâts comme si elle était efficace normalement.", - }, - filter: { - name: "Filtre", - description: "Diminue la puissance des attaques super efficaces subies.", - }, - slowStart: { - name: "Début Calme", - description: "Divise la Vitesse et l’Attaque du Pokémon par deux pendant les cinq premiers tours du combat.", - }, - scrappy: { - name: "Querelleur", - description: "Permet aux capacités de type Normal ou Combat du Pokémon de toucher les Pokémon de type Spectre. Immunise aussi contre le talent Intimidation.", - }, - stormDrain: { - name: "Lavabo", - description: "Le Pokémon détourne sur lui les capacités de type Eau et les neutralise, tout en augmentant son Attaque Spéciale.", - }, - iceBody: { - name: "Corps Gel", - description: "Régénère peu à peu les PV du Pokémon quand il neige.", - }, - solidRock: { - name: "Solide Roc", - description: "Diminue la puissance des attaques super efficaces subies.", - }, - snowWarning: { - name: "Alerte Neige", - description: "Le Pokémon invoque la neige quand il entre au combat.", - }, - honeyGather: { - name: "Cherche Miel", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", - }, - frisk: { - name: "Fouille", - description: "Lorsqu'il entre en combat, le Pokémon peut vérifier la capacité d'un Pokémon adverse.", - }, - reckless: { - name: "Téméraire", - description: "Augmente la puissance des capacités occasionnant un contrecoup.", - }, - multitype: { - name: "Multi-Type", - description: "Modifie le type du Pokémon en fonction de la plaque qu’il tient.", - }, - flowerGift: { - name: "Don Floral", - description: "Augmente l’Attaque et la Défense Spéciale du Pokémon et de ses alliés lorsque le soleil brille.", - }, - badDreams: { - name: "Mauvais Rêve", - description: "Inflige des dégâts aux ennemis endormis.", - }, - pickpocket: { - name: "Pickpocket", - description: "Vole l’objet que tient l’attaquant quand le Pokémon subit une attaque directe.", - }, - sheerForce: { - name: "Sans Limite", - description: "Les capacités ayant un effet additionnel le perdent, mais leur puissance augmente.", - }, - contrary: { - name: "Contestation", - description: "Inverse les changements de stats : les augmentations de stats se transforment en baisses, et vice-versa.", - }, - unnerve: { - name: "Tension", - description: "Fait stresser l’adversaire, ce qui l’empêche de manger des Baies.", - }, - defiant: { - name: "Acharné", - description: "Augmente beaucoup l’Attaque du Pokémon quand ses stats sont baissées par l’adversaire.", - }, - defeatist: { - name: "Défaitiste", - description: "Le Pokémon devient défaitiste quand ses PV tombent à la moitié, et son Attaque et son Attaque Spéciale sont divisées par deux.", - }, - cursedBody: { - name: "Corps Maudit", - description: "Quand le Pokémon est touché par une capacité adverse, il inflige parfois Entrave sur celle-ci.", - }, - healer: { - name: "Cœur Soin", - description: "Soigne parfois une altération de statut d’un allié proche.", - }, - friendGuard: { - name: "Garde-Ami", - description: "Diminue les dégâts subis par les alliés.", - }, - weakArmor: { - name: "Armurouillée", - description: "Quand le Pokémon est touché par une capacité physique, sa Défense baisse mais sa Vitesse augmente beaucoup.", - }, - heavyMetal: { - name: "Heavy Metal", - description: "Double le poids du Pokémon.", - }, - lightMetal: { - name: "Light Metal", - description: "Divise par deux le poids du Pokémon.", - }, - multiscale: { - name: "Multiécaille", - description: "Le Pokémon subit moins de dégâts quand ses PV sont au maximum.", - }, - toxicBoost: { - name: "Rage Poison", - description: "Augmente la puissance des capacités physiques quand le Pokémon est empoisonné.", - }, - flareBoost: { - name: "Rage Brûlure", - description: "Augmente la puissance des capacités spéciales quand le Pokémon est brulé.", - }, - harvest: { - name: "Récolte", - description: "Permet de réutiliser une même Baie plusieurs fois.", - }, - telepathy: { - name: "Télépathe", - description: "Le Pokémon anticipe et évite les attaques de ses alliés.", - }, - moody: { - name: "Lunatique", - description: "Augmente beaucoup une stat du Pokémon et en baisse une autre au hasard à chaque tour.", - }, - overcoat: { - name: "Envelocape", - description: "Protège des dégâts occasionnés par les tempêtes de sable, ainsi que des effets des capacités qui libèrent de la poudre et des spores.", - }, - poisonTouch: { - name: "Toxitouche", - description: "Peut empoisonner l’ennemi par simple contact.", - }, - regenerator: { - name: "Régé-Force", - description: "Restaure un peu de PV si le Pokémon est retiré du combat.", - }, - bigPecks: { - name: "Cœur de Coq", - description: "Protège des effets qui baissent la Défense.", - }, - sandRush: { - name: "Baigne Sable", - description: "Augmente la Vitesse lors des tempêtes de sable.", - }, - wonderSkin: { - name: "Peau Miracle", - description: "Le Pokémon résiste mieux aux capacités de statut.", - }, - analytic: { - name: "Analyste", - description: "Augmente la puissance des capacités du Pokémon s’il attaque en dernier.", - }, - illusion: { - name: "Illusion", - description: "Le Pokémon prend l’apparence du dernier membre de l’équipe pour tromper l’adversaire.", - }, - imposter: { - name: "Imposteur", - description: "Le Pokémon prend l’apparence du Pokémon adverse.", - }, - infiltrator: { - name: "Infiltration", - description: "Traverse les barrières et les clones adverses pour attaquer directement.", - }, - mummy: { - name: "Momie", - description: "Lorsque le Pokémon subit une attaque directe, le talent de l’attaquant est remplacé par Momie.", - }, - moxie: { - name: "Impudence", - description: "Quand le Pokémon met un ennemi K.O., sa confiance en lui ne connait plus de limite et son Attaque augmente.", - }, - justified: { - name: "Cœur Noble", - description: "Réveille la noblesse du Pokémon lorsqu’il subit une attaque de type Ténèbres, ce qui augmente son Attaque.", - }, - rattled: { - name: "Phobique", - description: "Si le Pokémon est touché par le talent Intimidation ou une attaque de type Ténèbres, Spectre ou Insecte, sa phobie se révèle et sa Vitesse augmente.", - }, - magicBounce: { - name: "Miroir Magik", - description: "Annule les effets des capacités de statut subies par le Pokémon et les retourne à l’envoyeur.", - }, - sapSipper: { - name: "Herbivore", - description: "Annule les attaques de type Plante subies par le Pokémon et augmente son Attaque.", - }, - prankster: { - name: "Farceur", - description: "Rend les capacités de statut du Pokémon prioritaires.", - }, - sandForce: { - name: "Force Sable", - description: "Augmente la puissance des capacités de types Roche, Sol et Acier en cas de tempête de sable.", - }, - ironBarbs: { - name: "Épine de Fer", - description: "Inflige des dégâts à l’attaquant lorsque le Pokémon subit une attaque directe.", - }, - zenMode: { - name: "Mode Transe", - description: "Le Pokémon change de forme quand il lui reste moins de la moitié de ses PV.", - }, - victoryStar: { - name: "Victorieux", - description: "Augmente la Précision du Pokémon et de ses alliés.", - }, - turboblaze: { - name: "Turbo Brasier", - description: "Le Pokémon ignore les talents adverses qui auraient un effet sur ses capacités.", - }, - teravolt: { - name: "Téra-Voltage", - description: "Le Pokémon ignore les talents adverses qui auraient un effet sur ses capacités.", - }, - aromaVeil: { - name: "Aroma-Voile", - description: "Protège le Pokémon et ses alliés des effets limitant le libre arbitre.", - }, - flowerVeil: { - name: "Flora-Voile", - description: "Empêche les alliés de type Plante de subir des baisses de stats et des altérations de statut.", - }, - cheekPouch: { - name: "Bajoues", - description: "Le Pokémon récupère des PV lorsqu’il consomme n’importe quelle Baie en plus de bénéficier de ses effets habituels.", - }, - protean: { - name: "Protéen", - description: "Le Pokémon prend le type de la capacité qu’il utilise. Ce talent ne peut se déclencher qu’une fois par entrée au combat du Pokémon.", - }, - furCoat: { - name: "Toison Épaisse", - description: "Divise par deux les dégâts des capacités physiques subies par le Pokémon.", - }, - magician: { - name: "Magicien", - description: "Les capacités volent aussi l’objet tenu par la cible.", - }, - bulletproof: { - name: "Pare-Balles", - description: "Protège de certaines capacités lançant des projectiles comme des bombes et des balles.", - }, - competitive: { - name: "Battant", - description: "Augmente beaucoup l’Attaque Spéciale du Pokémon quand ses stats ont été baissées par l’adversaire.", - }, - strongJaw: { - name: "Prognathe", - description: "Le Pokémon a une mâchoire robuste qui augmente la puissance de ses capacités de morsure.", - }, - refrigerate: { - name: "Peau Gelée", - description: "Les capacités de type Normal deviennent de type Glace. Leur puissance augmente légèrement.", - }, - sweetVeil: { - name: "Gluco-Voile", - description: "Le Pokémon et ses alliés ne peuvent pas s’endormir.", - }, - stanceChange: { - name: "Déclic Tactique", - description: "Le Pokémon prend la Forme Assaut lorsqu’il utilise une capacité offensive, et la Forme Parade lorsqu’il utilise Bouclier Royal.", - }, - galeWings: { - name: "Ailes Bourrasque", - description: "Quand les PV du Pokémon sont au maximum, ses capacités de type Vol sont prioritaires.", - }, - megaLauncher: { - name: "Méga Blaster", - description: "Augmente la puissance des capacités qui projettent une aura.", - }, - grassPelt: { - name: "Toison Herbue", - description: "Augmente la Défense du Pokémon si un champ herbu est actif.", - }, - symbiosis: { - name: "Symbiose", - description: "Quand les alliés utilisent l’objet qu’ils tiennent, le Pokémon leur donne l’objet qu’il tient en remplacement.", - }, - toughClaws: { - name: "Griffe Dure", - description: "Augmente la puissance des attaques directes du Pokémon.", - }, - pixilate: { - name: "Peau Féérique", - description: "Les capacités de type Normal deviennent de type Fée. Leur puissance augmente légèrement.", - }, - gooey: { - name: "Poisseux", - description: "Baisse la Vitesse de l’attaquant lorsque le Pokémon subit une attaque directe.", - }, - aerilate: { - name: "Peau Céleste", - description: "Les capacités de type Normal deviennent de type Vol. Leur puissance augmente légèrement.", - }, - parentalBond: { - name: "Amour Filial", - description: "La mère et son petit unissent leurs forces pour attaquer deux fois d’affilée.", - }, - darkAura: { - name: "Aura Ténébreuse", - description: "Augmente la puissance des capacités de type Ténèbres de tous les Pokémon.", - }, - fairyAura: { - name: "Aura Féérique", - description: "Augmente la puissance des capacités de type Fée de tous les Pokémon.", - }, - auraBreak: { - name: "Aura Inversée", - description: "Inverse l’effet des talents « Aura » afin que ceux-ci baissent la puissance des capacités affectées au lieu de l’augmenter.", - }, - primordialSea: { - name: "Mer Primaire", - description: "Altère les conditions météo pour neutraliser les attaques de type Feu.", - }, - desolateLand: { - name: "Terre Finale", - description: "Altère les conditions météo pour neutraliser les attaques de type Eau.", - }, - deltaStream: { - name: "Souffle Delta", - description: "Altère les conditions météo pour annuler les faiblesses du type Vol.", - }, - stamina: { - name: "Endurance", - description: "Augmente la Défense du Pokémon lorsqu’il subit une attaque.", - }, - wimpOut: { - name: "Escampette", - description: "Le Pokémon perd confiance quand ses PV tombent à la moitié et s’enfuit dans sa Poké Ball.", - }, - emergencyExit: { - name: "Repli Tactique", - description: "Le Pokémon évite les situations inutilement dangereuses. Quand ses PV tombent à la moitié, il se réfugie dans sa Poké Ball.", - }, - waterCompaction: { - name: "Sable Humide", - description: "Augmente beaucoup la Défense du Pokémon quand il subit une capacité de type Eau.", - }, - merciless: { - name: "Cruauté", - description: "Lorsque le Pokémon attaque un adversaire empoisonné, le coup est forcément critique.", - }, - shieldsDown: { - name: "Bouclier-Carcan", - description: "Lorsque le Pokémon perd la moitié de ses PV, son enveloppe se brise et il adopte une posture offensive.", - }, - stakeout: { - name: "Filature", - description: "Lorsque le Pokémon attaque une cible qui vient d’entrer sur le terrain en remplacement d’un autre Pokémon, les dégâts infligés sont doublés.", - }, - waterBubble: { - name: "Aquabulle", - description: "Réduit la puissance des capacités de type Feu subies par le Pokémon. Il est également immunisé contre les brulures.", - }, - steelworker: { - name: "Expert Acier", - description: "Augmente la puissance des attaques de type Acier.", - }, - berserk: { - name: "Folle Furie", - description: "Augmente l’Attaque Spéciale du Pokémon lorsque ses PV tombent à la moitié à cause d’une attaque de l’adversaire.", - }, - slushRush: { - name: "Chasse-Neige", - description: "Augmente la Vitesse du Pokémon quand il neige.", - }, - longReach: { - name: "Longue Portée", - description: "Le Pokémon est capable d’utiliser toutes ses capacités sans entrer en contact direct avec sa cible.", - }, - liquidVoice: { - name: "Hydrata-Son", - description: "Toutes les attaques sonores du Pokémon prennent le type Eau.", - }, - triage: { - name: "Prioguérison", - description: "Rend les capacités de soin prioritaires.", - }, - galvanize: { - name: "Peau Électrique", - description: "Les capacités de type Normal deviennent de type Électrik. Leur puissance augmente légèrement.", - }, - surgeSurfer: { - name: "Surf Caudal", - description: "La Vitesse du Pokémon est doublée sur un champ électrifié.", - }, - schooling: { - name: "Banc", - description: "Le Pokémon se rassemble avec ses congénères quand ses PV sont élevés. Quand il ne lui reste plus beaucoup de PV, le banc se disperse.", - }, - disguise: { - name: "Fantômasque", - description: "Le déguisement qui recouvre le corps du Pokémon est capable de le protéger d’une attaque.", - }, - battleBond: { - name: "Synergie", - description: "En battant un ennemi, ce Pokémon renforce ses liens avec son Dresseur, ce qui augmente son Attaque, son Attaque Spéciale et sa Vitesse.", - }, - powerConstruct: { - name: "Rassemblement", - description: "Lorsque le Pokémon perd la moitié de ses PV, ses Cellules se rassemblent pour l’encourager, ce qui lui permet de prendre sa Forme Parfaite.", - }, - corrosion: { - name: "Corrosion", - description: "Permet d’empoisonner les Pokémon de type Acier ou Poison.", - }, - comatose: { - name: "Hypersommeil", - description: "Le Pokémon rêve en permanence et ne se réveille jamais. Il est capable d’attaquer normalement tout en dormant.", - }, - queenlyMajesty: { - name: "Prestance Royale", - description: "L’adversaire est impressionné par la majesté du Pokémon et ne peut pas le viser avec une capacité prioritaire.", - }, - innardsOut: { - name: "Expuls’Organes", - description: "Le Pokémon inflige à l’adversaire l’ayant mis K.O. des dégâts égaux au nombre de PV qu’il lui restait avant le coup de grâce.", - }, - dancer: { - name: "Danseuse", - description: "Si n’importe quel Pokémon utilise une capacité dansante, le Pokémon utilise immédiatement cette danse lui aussi.", - }, - battery: { - name: "Batterie", - description: "Augmente la puissance des capacités spéciales des alliés.", - }, - fluffy: { - name: "Boule de Poils", - description: "Divise par deux les dégâts des attaques directes subies par le Pokémon, mais double les dégâts des capacités de type Feu.", - }, - dazzling: { - name: "Corps Coloré", - description: "L’adversaire est abasourdi par le Pokémon et ne peut pas le viser avec une capacité prioritaire.", - }, - soulHeart: { - name: "Animacœur", - description: "Augmente l’Attaque Spéciale du Pokémon lorsqu’un autre Pokémon est mis K.O.", - }, - tanglingHair: { - name: "Mèche Rebelle", - description: "Baisse la Vitesse de l’attaquant lorsque le Pokémon subit une attaque directe.", - }, - receiver: { - name: "Receveur", - description: "Le Pokémon reçoit le talent d’un allié mis K.O.", - }, - powerofAlchemy: { - name: "Osmose", - description: "Le Pokémon acquiert le talent d’un allié mis K.O.", - }, - beastBoost: { - name: "Boost Chimère", - description: "Augmente la stat la plus élevée du Pokémon quand il met K.O. un autre Pokémon.", - }, - rksSystem: { - name: "Système Alpha", - description: "Change le type du Pokémon en fonction de la ROM équipée.", - }, - electricSurge: { - name: "Créa-Élec", - description: "Le Pokémon crée un champ électrifié au moment où il entre au combat.", - }, - psychicSurge: { - name: "Créa-Psy", - description: "Le Pokémon crée un champ psychique au moment où il entre au combat.", - }, - mistySurge: { - name: "Créa-Brume", - description: "Le Pokémon crée un champ brumeux au moment où il entre au combat.", - }, - grassySurge: { - name: "Créa-Herbe", - description: "Le Pokémon crée un champ herbu au moment où il entre au combat.", - }, - fullMetalBody: { - name: "Métallo-Garde", - description: "Empêche les stats du Pokémon de baisser à cause du talent ou d’une capacité de l’adversaire.", - }, - shadowShield: { - name: "Spectro-Bouclier", - description: "Le Pokémon subit moins de dégâts quand ses PV sont au maximum.", - }, - prismArmor: { - name: "Prisme-Armure", - description: "Diminue la puissance des attaques super efficaces subies.", - }, - neuroforce: { - name: "Cérébro-Force", - description: "Augmente encore plus la puissance des attaques super efficaces.", - }, - intrepidSword: { - name: "Lame Indomptable", - description: "Augmente l’Attaque du Pokémon la première fois qu’il entre au combat.", - }, - dauntlessShield: { - name: "Égide Inflexible", - description: "Augmente la Défense du Pokémon la première fois qu’il entre au combat.", - }, - libero: { - name: "Libéro", - description: "Le Pokémon prend le type de la capacité qu’il utilise. Ce talent ne peut se déclencher qu’une fois par entrée au combat du Pokémon.", - }, - ballFetch: { - name: "Ramasse Ball", - description: "Si le Pokémon ne tient aucun objet, il ramassera la Poké Ball lors du premier lancer raté du combat.", - }, - cottonDown: { - name: "Effilochage", - description: "Quand le Pokémon est touché par une attaque, il dissémine des aigrettes qui diminuent la Vitesse de tout le monde, sauf la sienne.", - }, - propellerTail: { - name: "Propulseur", - description: "Permet d’ignorer l’effet des capacités ou des talents qui attirent les capacités.", - }, - mirrorArmor: { - name: "Armure Miroir", - description: "Le Pokémon renvoie les effets réducteurs de stats qu’il reçoit.", - }, - gulpMissile: { - name: "Dégobage", - description: "Quand le Pokémon utilise Surf ou Plongée, il revient avec une proie. Lorsqu’il subit des dégâts par la suite, il attaque en recrachant sa proie.", - }, - stalwart: { - name: "Nerfs d’Acier", - description: "Permet d’ignorer l’effet des capacités ou des talents qui attirent les capacités.", - }, - steamEngine: { - name: "Turbine", - description: "Lorsque le Pokémon est touché par des capacités de type Eau ou Feu, sa Vitesse augmente énormément.", - }, - punkRock: { - name: "Punk Rock", - description: "Augmente la puissance des capacités basées sur le son. Le Pokémon ne subit que la moitié des dégâts quand il est touché par ce genre de capacités.", - }, - sandSpit: { - name: "Expul’Sable", - description: "Le Pokémon déclenche une tempête de sable quand il subit une attaque.", - }, - iceScales: { - name: "Écailles Glacées", - description: "Le Pokémon est protégé par des écailles de glace. Les dégâts qu’il subit par des capacités spéciales sont divisés par deux.", - }, - ripen: { - name: "Mûrissement", - description: "Le Pokémon fait murir la Baie qu’il tient et double ainsi son effet.", - }, - iceFace: { - name: "Tête de Gel", - description: "Le glaçon sur sa tête encaisse les attaques physiques à la place du Pokémon, mais sa destruction modifie son apparence. Le glaçon se reforme quand il neige.", - }, - powerSpot: { - name: "Cercle d’Énergie", - description: "Augmente la puissance des capacités des Pokémon qui se trouvent à proximité.", - }, - mimicry: { - name: "Mimétisme", - description: "Le Pokémon adopte le même type que le terrain lorsqu’un champ est actif.", - }, - screenCleaner: { - name: "Brise-Barrière", - description: "Quand le Pokémon entre au combat, les effets de Mur Lumière, Protection et Voile Aurore disparaissent pour les alliés comme pour les adversaires.", - }, - steelySpirit: { - name: "Boost Acier", - description: "Augmente la puissance des attaques de type Acier du Pokémon et de ses alliés.", - }, - perishBody: { - name: "Corps Condamné", - description: "Lorsque le Pokémon est directement touché par une capacité, l’assaillant et lui tomberont K.O. dans trois tours, à moins qu’ils ne soient remplacés entre temps.", - }, - wanderingSpirit: { - name: "Âme Vagabonde", - description: "Lorsque le Pokémon est directement touché par une capacité, il échange son talent avec celui de l’assaillant.", - }, - gorillaTactics: { - name: "Entêtement", - description: "Augmente l’Attaque, mais empêche d’utiliser toute autre capacité que celle utilisée en premier par le Pokémon.", - }, - neutralizingGas: { - name: "Gaz Inhibiteur", - description: "Si un Pokémon avec Gaz Inhibiteur est sur le terrain, les effets des talents de tous les autres Pokémon ne s’activent pas ou sont neutralisés.", - }, - pastelVeil: { - name: "Voile Pastel", - description: "Protège le Pokémon et ses alliés contre toutes les altérations de statut liées à l’empoisonnement.", - }, - hungerSwitch: { - name: "Déclic Fringale", - description: "À la fin de chaque tour, le Pokémon alterne entre ses formes Mode Rassasié et Mode Affamé.", - }, - quickDraw: { - name: "Tir Vif", - description: "Permet parfois au Pokémon d’agir en premier.", - }, - unseenFist: { - name: "Poing Invisible", - description: "Si le Pokémon utilise une attaque directe, celle-ci pourra toucher la cible même si elle se protège.", - }, - curiousMedicine: { - name: "Breuvage Suspect", - description: "Quand il entre au combat, le Pokémon répand une substance qui annule les changements de stats de ses alliés.", - }, - transistor: { - name: "Transistor", - description: "Augmente la puissance des capacités de type Électrik.", - }, - dragonsMaw: { - name: "Dent de Dragon", - description: "Augmente la puissance des capacités de type Dragon.", - }, - chillingNeigh: { - name: "Blanche Ruade", - description: "Quand le Pokémon met un ennemi K.O., il émet un hennissement glaçant, ce qui augmente son Attaque.", - }, - grimNeigh: { - name: "Sombre Ruade", - description: "Quand le Pokémon met un ennemi K.O., il émet un hennissement terrifiant qui augmente son Attaque Spéciale.", - }, - asOneGlastrier: { - name: "Osmose Équine", - description: "Les talents Tension de Sylveroy et Blanche Ruade de Blizzeval sont cumulés.", - }, - asOneSpectrier: { - name: "Osmose Équine", - description: "Les talents Tension de Sylveroy et Sombre Ruade de Spectreval sont cumulés.", - }, - lingeringAroma: { - name: "Odeur Tenace", - description: "Lorsque le Pokémon subit une attaque directe, le talent de l’attaquant est remplacé par Odeur Tenace.", - }, - seedSower: { - name: "Semencier", - description: "Le Pokémon crée un champ herbu quand il subit une attaque.", - }, - thermalExchange: { - name: "Thermodynamique", - description: "Lorsque le Pokémon est touché par une capacité de type Feu, il ne subit aucun dégât et son Attaque augmente.", - }, - angerShell: { - name: "Courroupace", - description: "Le Pokémon enrage s’il a moins de la moitié de ses PV après avoir subi une attaque. Sa Déf. et sa Déf. Spé. baissent, et son Atq., son Atq. Spé. et sa Vit. augmentent.", - }, - purifyingSalt: { - name: "Sel Purificateur", - description: "Le sel pur immunise le Pokémon contre les altérations de statut, et diminue de moitié les dégâts des capacités de type Spectre.", - }, - wellBakedBody: { - name: "Bien Cuit", - description: "Si le Pokémon est touché par une capacité de type Feu, il ne subit aucun dégât et sa Défense augmente beaucoup.", - }, - windRider: { - name: "Aéroporté", - description: "L’Attaque du Pokémon augmente si un vent arrière souffle ou s’il est touché par une capacité faisant appel au vent. Dans ce dernier cas, il ne subit aucun dégât.", - }, - guardDog: { - name: "Chien de Garde", - description: "L’Attaque du Pokémon augmente s’il subit l’effet du talent Intimidation. Les capacités ou objets qui font changer de Pokémon n’ont aucun effet sur lui.", - }, - rockyPayload: { - name: "Porte-Roche", - description: "Augmente la puissance des capacités de type Roche.", - }, - windPower: { - name: "Turbine Éolienne", - description: "Si le Pokémon est touché par une capacité faisant appel au vent, il se charge en électricité.", - }, - zeroToHero: { - name: "Supermutation", - description: "Le Pokémon prend sa Forme Super en quittant le combat.", - }, - commander: { - name: "Commandant", - description: "Si un Oyacata allié est sur le terrain quand ce Pokémon rejoint le combat, ce dernier entre dans sa bouche et devient son commandant.", - }, - electromorphosis: { - name: "Grecharge", - description: "Si le Pokémon subit des dégâts, il se charge en électricité.", - }, - protosynthesis: { - name: "Paléosynthèse", - description: "Quand le soleil brille ou que le Pokémon tient une capsule d’Énergie Booster, sa stat la plus élevée augmente.", - }, - quarkDrive: { - name: "Charge Quantique", - description: "Quand un champ électrifié est actif ou que le Pokémon tient une capsule d’Énergie Booster, sa stat la plus élevée augmente.", - }, - goodAsGold: { - name: "Corps en Or", - description: "Le corps en or pur et robuste du Pokémon l’immunise contre les capacités de statut des autres Pokémon.", - }, - vesselOfRuin: { - name: "Urne du Fléau", - description: "Le pouvoir de l’urne qui appelle le fléau affaiblit l’Attaque Spéciale de tous les autres Pokémon.", - }, - swordOfRuin: { - name: "Épée du Fléau", - description: "Le pouvoir de l’épée qui appelle le fléau affaiblit la Défense de tous les autres Pokémon.", - }, - tabletsOfRuin: { - name: "Bois du Fléau", - description: "Le pouvoir du bois qui appelle le fléau affaiblit l’Attaque de tous les autres Pokémon.", - }, - beadsOfRuin: { - name: "Perles du Fléau", - description: "Le pouvoir des perles qui appellent le fléau affaiblit la Défense Spéciale de tous les autres Pokémon.", - }, - orichalcumPulse: { - name: "Pouls Orichalque", - description: "Le Pokémon invoque le soleil quand il rejoint le combat. Quand les rayons du soleil sont intenses, une pulsation primitive augmente son Attaque.", - }, - hadronEngine: { - name: "Moteur à Hadrons", - description: "Le Pokémon crée un champ électrifié quand il rejoint le combat. Une machine du futur fait monter son Attaque Spéciale si un champ électrifié est actif.", - }, - opportunist: { - name: "Opportuniste", - description: "Quand les stats de l’ennemi augmentent, le Pokémon en profite pour augmenter ses stats de la même manière.", - }, - cudChew: { - name: "Ruminant", - description: "Quand le Pokémon mange une Baie, il la régurgite à la fin du tour suivant et la mange une nouvelle fois.", - }, - sharpness: { - name: "Incisif", - description: "Augmente la puissance des capacités tranchantes.", - }, - supremeOverlord: { - name: "Général Suprême", - description: "Quand le Pokémon entre sur le terrain, son Attaque et son Attaque Spéciale augmentent légèrement pour chaque allié mis K.O. auparavant.", - }, - costar: { - name: "Collab", - description: "Quand le Pokémon entre sur le terrain, il copie les changements de stats de son allié.", - }, - toxicDebris: { - name: "Dépôt Toxique", - description: "Quand le Pokémon est touché par une capacité physique, il répand des pics toxiques dans le camp adverse.", - }, - armorTail: { - name: "Armure Caudale", - description: "L’étrange queue qui recouvre la tête du Pokémon empêche ce dernier d’être visé par une capacité prioritaire.", - }, - earthEater: { - name: "Absorbe-Terre", - description: "Si le Pokémon est touché par une capacité de type Sol, il regagne des PV au lieu de subir des dégâts.", - }, - myceliumMight: { - name: "Force Fongique", - description: "Le Pokémon agit toujours plus lentement quand il utilise une capacité de statut, mais il ignore les talents adverses.", - }, - mindsEye: { - name: "Œil Révélateur", - description: "Le Pokémon ignore les changements d’Esquive des cibles et peut toucher les Pokémon Spectre avec des capacités Normal ou Combat. Sa Précision ne peut pas baisser.", - }, - supersweetSyrup: { - name: "Nectar Mielleux", - description: "La première fois que le Pokémon entre au combat, une odeur de nectar sucré se répand sur le terrain, ce qui baisse l’Esquive de l’adversaire.", - }, - hospitality: { - name: "Aux Petits Soins", - description: "Quand il rejoint le combat, ce Pokémon est aux petits soins avec son allié et restaure quelques PV.", - }, - toxicChain: { - name: "Chaîne Toxique", - description: "Grâce aux pouvoirs de sa chaine imprégnée de toxines, le Pokémon peut empoisonner gravement sa cible en la touchant avec une capacité.", - }, - embodyAspectTeal: { - name: "Force Mémorielle", - description: "Le Pokémon fait briller le Masque Turquoise en puisant dans ses souvenirs, ce qui augmente sa Vitesse.", - }, - embodyAspectWellspring: { - name: "Force Mémorielle", - description: "Le Pokémon fait briller le Masque du Puits en puisant dans ses souvenirs, ce qui augmente sa Défense Spéciale.", - }, - embodyAspectHearthflame: { - name: "Force Mémorielle", - description: "Le Pokémon fait briller le Masque du Fourneau en puisant dans ses souvenirs, ce qui augmente son Attaque.", - }, - embodyAspectCornerstone: { - name: "Force Mémorielle", - description: "Le Pokémon fait briller le Masque de la Pierre en puisant dans ses souvenirs, ce qui augmente sa Défense.", - }, - teraShift: { - name: "Téramorphose", - description: "Quand le Pokémon rejoint le combat, il absorbe l’énergie alentour et prend sa Forme Téracristal.", - }, - teraShell: { - name: "Téra-Carapace", - description: "Grâce à sa carapace qui renferme l’énergie de tous les types, les capacités subies par ce Pokémon quand ses PV sont au maximum ne sont pas très efficaces.", - }, - teraformZero: { - name: "Téraformation 0", - description: "Lorsque Terapagos prend sa Forme Stellaire, il utilise son pouvoir enfoui pour annuler les effets de la météo et des champs actifs.", - }, - poisonPuppeteer: { - name: "Emprise Toxique", - description: "Lorsque Pêchaminus empoisonne un Pokémon grâce à l’une de ses capacités, ce dernier devient également confus.", - }, -} as const; diff --git a/src/locales/fr/achv.json b/src/locales/fr/achv.json new file mode 100644 index 00000000000..a557a423db7 --- /dev/null +++ b/src/locales/fr/achv.json @@ -0,0 +1,282 @@ +{ + "Achievements": { + "name": "Succès" + }, + "Locked": { + "name": "Verrouillé" + }, + "MoneyAchv": { + "description": "Récolter un total de {{moneyAmount}} ₽." + }, + "10K_MONEY": { + "name": "Épargnant", + "name_female": "Épargnante" + }, + "100K_MONEY": { + "name": "Je possède des thunes" + }, + "1M_MONEY": { + "name": "Banquier", + "name_female": "Banquière" + }, + "10M_MONEY": { + "name": "Évadé fiscal", + "name_female": "Évadée fiscale" + }, + "DamageAchv": { + "description": "Infliger {{damageAmount}} de dégâts en un coup." + }, + "250_DMG": { + "name": "Caïd" + }, + "1000_DMG": { + "name": "Boxeur", + "name_female": "Boxeuse" + }, + "2500_DMG": { + "name": "Distributeur de pains", + "name_female": "Distributrice de pains" + }, + "10000_DMG": { + "name": "One Punch Man", + "name_female": "One Punch Woman" + }, + "HealAchv": { + "description": "Soigner {{healAmount}} {{HP}} en une fois avec une capacité,\nun talent ou un objet tenu." + }, + "250_HEAL": { + "name": "Infirmier", + "name_female": "Infirmière" + }, + "1000_HEAL": { + "name": "Médecin" + }, + "2500_HEAL": { + "name": "Clerc" + }, + "10000_HEAL": { + "name": "Centre Pokémon" + }, + "LevelAchv": { + "description": "Monter un Pokémon au N.{{level}}." + }, + "LV_100": { + "name": "Et c’est pas fini !" + }, + "LV_250": { + "name": "Élite" + }, + "LV_1000": { + "name": "Vers l’infini et au-delà" + }, + "RibbonAchv": { + "description": "Accumuler un total de {{ribbonAmount}} Rubans." + }, + "10_RIBBONS": { + "name": "Maitre de la Ligue", + "name_female": "Maitresse de la Ligue" + }, + "25_RIBBONS": { + "name": "Super Maitre de la Ligue", + "name_female": "Super Maitresse de la Ligue" + }, + "50_RIBBONS": { + "name": "Hyper Maitre de la Ligue", + "name_female": "Hyper Maitresse de la Ligue" + }, + "75_RIBBONS": { + "name": "Rogue Maitre de la Ligue", + "name_female": "Rogue Maitresse de la Ligue" + }, + "100_RIBBONS": { + "name": "Master Maitre de la Ligue", + "name_female": "Master Maitresse de la Ligue" + }, + "TRANSFER_MAX_STAT_STAGE": { + "name": "Travail d’équipe", + "description": "Utiliser Relais avec au moins une statistique montée à fond." + }, + "MAX_FRIENDSHIP": { + "name": "Copinage", + "description": "Atteindre le niveau de bonheur maximal avec un Pokémon." + }, + "MEGA_EVOLVE": { + "name": "Mégamorph", + "description": "Méga-évoluer un Pokémon." + }, + "GIGANTAMAX": { + "name": "Kaijū", + "description": "Gigamaxer un Pokémon." + }, + "TERASTALLIZE": { + "name": "J’aime les STAB", + "description": "Téracristalliser un Pokémon." + }, + "STELLAR_TERASTALLIZE": { + "name": "Le type enfoui", + "description": "Téracristalliser un Pokémon en type Stellaire." + }, + "SPLICE": { + "name": "Infinite Fusion", + "description": "Fusionner deux Pokémon avec le Pointeau ADN." + }, + "MINI_BLACK_HOLE": { + "name": "Item-stellar", + "description": "Obtenir un Mini Trou Noir." + }, + "CATCH_MYTHICAL": { + "name": "Fabuleux", + "description": "Capturer un Pokémon fabuleux." + }, + "CATCH_SUB_LEGENDARY": { + "name": "(Semi-)Légendaire", + "description": "Capturer un Pokémon semi-légendaire." + }, + "CATCH_LEGENDARY": { + "name": "Légendaire", + "description": "Capturer un Pokémon légendaire." + }, + "SEE_SHINY": { + "name": "Chromatique", + "description": "Trouver un Pokémon sauvage chromatique." + }, + "SHINY_PARTY": { + "name": "Shasseur", + "name_female": "Shasseuse", + "description": "Avoir une équipe exclusivement composée de Pokémon chromatiques." + }, + "HATCH_MYTHICAL": { + "name": "Œuf fabuleux", + "description": "Obtenir un Pokémon fabuleux dans un Œuf." + }, + "HATCH_SUB_LEGENDARY": { + "name": "Œuf semi-légendaire", + "description": "Obtenir un Pokémon semi-légendaire dans un Œuf." + }, + "HATCH_LEGENDARY": { + "name": "Œuf légendaire", + "description": "Obtenir un Pokémon légendaire dans un Œuf." + }, + "HATCH_SHINY": { + "name": "Œuf chromatique", + "description": "Obtenir un Pokémon chromatique dans un Œuf." + }, + "HIDDEN_ABILITY": { + "name": "Potentiel enfoui", + "description": "Capturer un Pokémon possédant un talent caché." + }, + "PERFECT_IVS": { + "name": "Certificat d’authenticité", + "description": "Avoir des IV parfaits sur un Pokémon." + }, + "CLASSIC_VICTORY": { + "name": "Invaincu", + "name_female": "Invaincue", + "description": "Terminer le jeu en mode Classique." + }, + "UNEVOLVED_CLASSIC_VICTORY": { + "name": "Le stagiaire de 3e", + "description": "Terminer le mode Classique avec au moins un Pokémon non-évolué dans l’équipe." + }, + "MONO_GEN_ONE": { + "name": "Le rival originel", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 1re génération." + }, + "MONO_GEN_TWO": { + "name": "Entre tradition et modernité", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 2e génération." + }, + "MONO_GEN_THREE": { + "name": "Too much water ?", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 3e génération." + }, + "MONO_GEN_FOUR": { + "name": "Réellement la plus difficile ?", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 4e génération." + }, + "MONO_GEN_FIVE": { + "name": "Recast complet", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 5e génération." + }, + "MONO_GEN_SIX": { + "name": "Aristocrate", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 6e génération." + }, + "MONO_GEN_SEVEN": { + "name": "Seulement techniquement", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 7e génération." + }, + "MONO_GEN_EIGHT": { + "name": "L’heure de gloire", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 8e génération." + }, + "MONO_GEN_NINE": { + "name": "Ça va, c’était EZ", + "description": "Terminer un challenge avec uniquement des Pokémon\nde 9e génération." + }, + "MonoType": { + "description": "Terminer un challenge en monotype {{type}}." + }, + "MONO_NORMAL": { + "name": "Extraordinairement banal" + }, + "MONO_FIGHTING": { + "name": "Je connais le kung-fu" + }, + "MONO_FLYING": { + "name": "Angry Birds" + }, + "MONO_POISON": { + "name": "Touche moi je t’empoisonne !" + }, + "MONO_GROUND": { + "name": "Prévisions : Séisme" + }, + "MONO_ROCK": { + "name": "Comme un roc" + }, + "MONO_BUG": { + "name": "Une chenille !" + }, + "MONO_GHOST": { + "name": "SOS Fantômes" + }, + "MONO_STEEL": { + "name": "De type Acier !" + }, + "MONO_FIRE": { + "name": "Allumer le feu" + }, + "MONO_WATER": { + "name": "Vacances en Bretagne" + }, + "MONO_GRASS": { + "name": "Ne pas toucher !" + }, + "MONO_ELECTRIC": { + "name": "À la masse" + }, + "MONO_PSYCHIC": { + "name": "Grocervo" + }, + "MONO_ICE": { + "name": "Froid comme la glace" + }, + "MONO_DRAGON": { + "name": "Légendes du club, ou presque" + }, + "MONO_DARK": { + "name": "Ça va lui passer" + }, + "MONO_FAIRY": { + "name": "Hey ! Listen !" + }, + "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/achv.ts b/src/locales/fr/achv.ts deleted file mode 100644 index 4ff9bf20f51..00000000000 --- a/src/locales/fr/achv.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "Achievements": { - name: "Succès", - }, - "Locked": { - name: "Verrouillé", - }, - - "MoneyAchv": { - description: "Récolter un total de {{moneyAmount}} ₽", - }, - "10K_MONEY": { - name: "Épargnant", - }, - "100K_MONEY": { - name: "Je possède des thunes", - }, - "1M_MONEY": { - name: "Banquier", - }, - "10M_MONEY": { - name: "Évadé·e fiscal·e", - }, - - "DamageAchv": { - description: "Infliger {{damageAmount}} de dégâts en un coup", - }, - "250_DMG": { - name: "Caïd", - }, - "1000_DMG": { - name: "Boxeur", - }, - "2500_DMG": { - name: "Distributeur de pains", - }, - "10000_DMG": { - name: "One Punch Man", - }, - - "HealAchv": { - description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu", - }, - "250_HEAL": { - name: "Infirmier·ère", - }, - "1000_HEAL": { - name: "Médecin", - }, - "2500_HEAL": { - name: "Clerc", - }, - "10000_HEAL": { - name: "Centre Pokémon", - }, - - "LevelAchv": { - description: "Monter un Pokémon au N.{{level}}", - }, - "LV_100": { - name: "Et c’est pas fini !", - }, - "LV_250": { - name: "Élite", - }, - "LV_1000": { - name: "Vers l’infini et au-delà", - }, - - "RibbonAchv": { - description: "Accumuler un total de {{ribbonAmount}} Rubans", - }, - "10_RIBBONS": { - name: "Maitre·sse de la Ligue", - }, - "25_RIBBONS": { - name: "Super Maitre·sse de la Ligue", - }, - "50_RIBBONS": { - name: "Hyper Maitre·sse de la Ligue", - }, - "75_RIBBONS": { - name: "Rogue Maitre·sse de la Ligue", - }, - "100_RIBBONS": { - name: "Master Maitre·sse de la Ligue", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "Travail d’équipe", - description: "Utiliser Relais avec au moins une statistique montée à fond", - }, - "MAX_FRIENDSHIP": { - name: "Copinage", - description: "Atteindre le niveau de bonheur maximal avec un Pokémon", - }, - "MEGA_EVOLVE": { - name: "Mégamorph", - description: "Méga-évoluer un Pokémon", - }, - "GIGANTAMAX": { - name: "Kaijū", - description: "Gigamaxer un Pokémon", - }, - "TERASTALLIZE": { - name: "J’aime les STAB", - description: "Téracristalliser un Pokémon", - }, - "STELLAR_TERASTALLIZE": { - name: "Le type enfoui", - description: "Téracristalliser un Pokémon en type Stellaire", - }, - "SPLICE": { - name: "Infinite Fusion", - description: "Fusionner deux Pokémon avec le Pointeau ADN", - }, - "MINI_BLACK_HOLE": { - name: "Item-stellar", - description: "Obtenir un Mini Trou Noir", - }, - "CATCH_MYTHICAL": { - name: "Fabuleux", - description: "Capturer un Pokémon fabuleux", - }, - "CATCH_SUB_LEGENDARY": { - name: "(Semi-)Légendaire", - description: "Capturer un Pokémon semi-légendaire", - }, - "CATCH_LEGENDARY": { - name: "Légendaire", - description: "Capturer un Pokémon légendaire", - }, - "SEE_SHINY": { - name: "Chromatique", - description: "Trouver un Pokémon sauvage chromatique", - }, - "SHINY_PARTY": { - name: "Shasseur", - description: "Avoir une équipe exclusivement composée de Pokémon chromatiques", - }, - "HATCH_MYTHICAL": { - name: "Œuf fabuleux", - description: "Obtenir un Pokémon fabuleux dans un Œuf", - }, - "HATCH_SUB_LEGENDARY": { - name: "Œuf semi-légendaire", - description: "Obtenir un Pokémon semi-légendaire dans un Œuf", - }, - "HATCH_LEGENDARY": { - name: "Œuf légendaire", - description: "Obtenir un Pokémon légendaire dans un Œuf", - }, - "HATCH_SHINY": { - name: "Œuf chromatique", - description: "Obtenir un Pokémon chromatique dans un Œuf", - }, - "HIDDEN_ABILITY": { - name: "Potentiel enfoui", - description: "Capturer un Pokémon possédant un talent caché", - }, - "PERFECT_IVS": { - name: "Certificat d’authenticité", - description: "Avoir des IV parfaits sur un Pokémon", - }, - "CLASSIC_VICTORY": { - name: "Invaincu·e", - description: "Terminer le jeu en mode classique", - }, - - "MONO_GEN_ONE": { - name: "Le rival originel", - description: "Terminer un challenge avec uniquement des Pokémon de 1re génération.", - }, - "MONO_GEN_TWO": { - name: "Entre tradition et modernité", - description: "Terminer un challenge avec uniquement des Pokémon de 2e génération.", - }, - "MONO_GEN_THREE": { - name: "Too much water ?", - description: "Terminer un challenge avec uniquement des Pokémon de 3e génération.", - }, - "MONO_GEN_FOUR": { - name: "Réellement la plus difficile ?", - description: "Terminer un challenge avec uniquement des Pokémon de 4e génération.", - }, - "MONO_GEN_FIVE": { - name: "Recast complet", - description: "Terminer un challenge avec uniquement des Pokémon de 5e génération.", - }, - "MONO_GEN_SIX": { - name: "Aristocrate", - description: "Terminer un challenge avec uniquement des Pokémon de 6e génération.", - }, - "MONO_GEN_SEVEN": { - name: "Seulement techniquement", - description: "Terminer un challenge avec uniquement des Pokémon de 7e génération.", - }, - "MONO_GEN_EIGHT": { - name: "L’heure de gloire", - description: "Terminer un challenge avec uniquement des Pokémon de 8e génération.", - }, - "MONO_GEN_NINE": { - name: "Ça va, c’était EZ", - description: "Terminer un challenge avec uniquement des Pokémon de 9e génération.", - }, - - "MonoType": { - description: "Terminer un challenge en monotype {{type}}.", - }, - "MONO_NORMAL": { - name: "Extraordinairement banal", - }, - "MONO_FIGHTING": { - name: "Je connais le kung-fu", - }, - "MONO_FLYING": { - name: "Angry Birds", - }, - "MONO_POISON": { - name: "Touche moi je t’empoisonne !", - }, - "MONO_GROUND": { - name: "Prévisions : Séisme", - }, - "MONO_ROCK": { - name: "Comme un roc", - }, - "MONO_BUG": { - name: "Une chenille !", - }, - "MONO_GHOST": { - name: "SOS Fantômes", - }, - "MONO_STEEL": { - name: "De type Acier !", - }, - "MONO_FIRE": { - name: "Allumer le feu", - }, - "MONO_WATER": { - name: "Vacances en Bretagne", - }, - "MONO_GRASS": { - name: "Ne pas toucher !", - }, - "MONO_ELECTRIC": { - name: "À la masse", - }, - "MONO_PSYCHIC": { - name: "Grocervo", - }, - "MONO_ICE": { - name: "Froid comme la glace", - }, - "MONO_DRAGON": { - name: "Légendes du club, ou presque", - }, - "MONO_DARK": { - name: "Ça va lui passer", - }, - "MONO_FAIRY": { - name: "Hey ! Listen !", - }, -} as const; - -// Achievement translations for the when the player character is female (it for now uses the same translations as the male version) -export const PGFachv: AchievementTranslationEntries = PGMachv; diff --git a/src/locales/fr/arena-flyout.json b/src/locales/fr/arena-flyout.json new file mode 100644 index 00000000000..e90de13b20a --- /dev/null +++ b/src/locales/fr/arena-flyout.json @@ -0,0 +1,41 @@ +{ + "activeBattleEffects": "Effets Actifs", + "player": "Vous", + "neutral": "Neutre", + "enemy": "Ennemi", + "sunny": "Soleil", + "rain": "Pluie", + "sandstorm": "Tempête de Sable", + "hail": "Grêle", + "snow": "Neige", + "fog": "Brouillard", + "heavyRain": "Pluie Battante", + "harshSun": "Soleil Brulant", + "strongWinds": "Vent Mystérieux", + "misty": "Champ Brumeux", + "electric": "Champ Électrifié", + "grassy": "Champ Herbu", + "psychic": "Champ Psychique", + "mudSport": "Lance-Boue", + "waterSport": "Tourniquet", + "spikes": "Picots", + "toxicSpikes": "Pics Toxik", + "mist": "Brume", + "futureSight": "Prescience", + "doomDesire": "Vœu Destructeur", + "wish": "Vœu", + "stealthRock": "Piège de Roc", + "stickyWeb": "Toile Gluante", + "trickRoom": "Distorsion", + "gravity": "Gravité", + "reflect": "Protection", + "lightScreen": "Mur Lumière", + "auroraVeil": "Voile Aurore", + "quickGuard": "Prévention", + "wideGuard": "Garde Large", + "matBlock": "Tatamigaeshi", + "craftyShield": "Vigilance", + "tailwind": "Vent Arrière", + "happyHour": "Étrennes", + "safeguard": "Rune Protect" +} diff --git a/src/locales/fr/arena-tag.json b/src/locales/fr/arena-tag.json new file mode 100644 index 00000000000..9cb2f342068 --- /dev/null +++ b/src/locales/fr/arena-tag.json @@ -0,0 +1,57 @@ +{ + "yourTeam": "votre équipe", + "opposingTeam": "l’équipe adverse", + "arenaOnRemove": "L’effet de la capacité {{moveName}}\ns’est dissipé !", + "arenaOnRemovePlayer": "L’effet de la capacité {{moveName}}\ns’est dissipé sur votre équipe !", + "arenaOnRemoveEnemy": "L’effet de la capacité {{moveName}}\ns’est dissipé sur l’équipe ennemie !", + "mistOnAdd": "La brume enveloppe l’équipe\nde {{pokemonNameWithAffix}} !", + "mistApply": "La brume empêche les stats de baisser !", + "reflectOnAdd": "Protection augmente la résistance\naux capacités physiques !", + "reflectOnAddPlayer": "Protection augmente la résistance\nde l’équipe aux capacités physiques !", + "reflectOnAddEnemy": "Protection augmente la résistance\nde l’équipe ennemie aux capacités physiques !", + "lightScreenOnAdd": "Mur Lumière augmente la résistance\naux capacités spéciales !", + "lightScreenOnAddPlayer": "Mur Lumière augmente la résistance\nde l’équipe aux capacités spéciales !", + "lightScreenOnAddEnemy": "Mur Lumière augmente la résistance\nde l’équipe ennemie aux capacités spéciales !", + "auroraVeilOnAdd": "Voile Aurore augmente la résistance\naux capacités physiques et spéciales !", + "auroraVeilOnAddPlayer": "Voile Aurore augmente la résistance\nde l’équipe aux capacités physiques et spéciales !", + "auroraVeilOnAddEnemy": "Voile Aurore augmente la résistance\nde l’équipe ennemie aux capacités physiques et spéciales !", + "conditionalProtectOnAdd": "La capacité {{moveName}}\nprotège l’équipe !", + "conditionalProtectOnAddPlayer": "La capacité {{moveName}}\nprotège votre équipe !", + "conditionalProtectOnAddEnemy": "La capacité {{moveName}}\nprotège l’équipe ennemie !", + "conditionalProtectApply": "{{pokemonNameWithAffix}} est protégé\npar {{moveName}} !", + "matBlockOnAdd": "{{pokemonNameWithAffix}} se prépare\nà utiliser un tatami pour bloquer les attaques !", + "noCritOnAddPlayer": "{{moveName}} immunise votre équipe\ncontre les coups critiques !", + "noCritOnAddEnemy": "{{moveName}} immunise l’équipe ennemie\ncontre les coups critiques !", + "noCritOnRemove": "Les effets d’{{moveName}}\nsur {{pokemonNameWithAffix}} prennent fin !", + "wishTagOnAdd": "Le vœu de{{pokemonNameWithAffix}}\nse réalise !", + "mudSportOnAdd": "La puissance des capacités\nde type Électrik diminue !", + "mudSportOnRemove": "L’effet de Lance-Boue se dissipe !", + "waterSportOnAdd": "La puissance des capacités\nde type Feu diminue !", + "waterSportOnRemove": "L’effet de Tourniquet se dissipe !", + "spikesOnAdd": "Des {{moveName}} s’éparpillent autour de {{opponentDesc}} !", + "spikesActivateTrap": "{{pokemonNameWithAffix}} est blessé\npar les picots !", + "toxicSpikesOnAdd": "Des {{moveName}} s’éparpillent autour de {{opponentDesc}} !", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbe\n{{moveName}} !", + "stealthRockOnAdd": "Des pierres pointues lévitent\nautour de {{opponentDesc}} !", + "stealthRockActivateTrap": "Des pierres pointues\ntranspercent {{pokemonNameWithAffix}} !", + "stickyWebOnAdd": "Le terrain est couvert d’une {{moveName}}\ndu côté de l’équipe ennemie !", + "stickyWebActivateTrap": "{{pokemonName}} ennemi\nest pris dans la toile gluante !", + "trickRoomOnAdd": "{{pokemonNameWithAffix}}\nfausse les dimensions !", + "trickRoomOnRemove": "Les dimensions faussées\nreviennent à la normale !", + "gravityOnAdd": "La gravité s’intensifie !", + "gravityOnRemove": "La gravité est revenue à la normale !", + "tailwindOnAdd": "Un vent arrière souffle !", + "tailwindOnAddPlayer": "Un vent arrière souffle\nsur votre équipe !", + "tailwindOnAddEnemy": "Un vent arrière souffle\nsur l’équipe ennemie !", + "tailwindOnRemove": "Le vent arrière s’arrête !", + "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 !", + "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 !" +} diff --git a/src/locales/fr/battle-info.json b/src/locales/fr/battle-info.json new file mode 100644 index 00000000000..1408fd4d602 --- /dev/null +++ b/src/locales/fr/battle-info.json @@ -0,0 +1,3 @@ +{ + "generation": "{{generation}}" +} diff --git a/src/locales/fr/battle-message-ui-handler.json b/src/locales/fr/battle-message-ui-handler.json new file mode 100644 index 00000000000..bc5b4c4dbce --- /dev/null +++ b/src/locales/fr/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "Exceptionnel", + "ivFantastic": "Fantastique", + "ivVeryGood": "Très bon", + "ivPrettyGood": "Bon", + "ivDecent": "Passable…", + "ivNoGood": "Pas top…" +} \ No newline at end of file diff --git a/src/locales/fr/battle-message-ui-handler.ts b/src/locales/fr/battle-message-ui-handler.ts deleted file mode 100644 index cb2f745577e..00000000000 --- a/src/locales/fr/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "Exceptionnel", - "ivFantastic": "Fantastique", - "ivVeryGood": "Très bon", - "ivPrettyGood": "Bon", - "ivDecent": "Passable…", - "ivNoGood": "Pas top…", -} as const; diff --git a/src/locales/fr/battle-scene.json b/src/locales/fr/battle-scene.json new file mode 100644 index 00000000000..ef916edbf08 --- /dev/null +++ b/src/locales/fr/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "{{formattedMoney}} ₽" +} \ No newline at end of file diff --git a/src/locales/fr/battle.json b/src/locales/fr/battle.json new file mode 100644 index 00000000000..7b78c963187 --- /dev/null +++ b/src/locales/fr/battle.json @@ -0,0 +1,100 @@ +{ + "bossAppeared": "Un {{bossName}} apparait.", + "trainerAppeared": "Un combat est lancé\npar {{trainerName}} !", + "trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !", + "trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !", + "singleWildAppeared": "Un {{pokemonName}} sauvage apparait !", + "multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !", + "playerComeBack": "{{pokemonName}} !\nReviens !", + "trainerComeBack": "{{trainerName}} retire\n{{pokemonName}} !", + "playerGo": "{{pokemonName}} ! Go !", + "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !", + "switchQuestion": "Voulez-vous changer\n{{pokemonName}} ?", + "trainerDefeated": "Vous avez battu\n{{trainerName}} !", + "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", + "moneyPickedUp": "Vous obtenez {{moneyAmount}} ₽ !", + "pokemonCaught": "Vous avez attrapé\n{{pokemonName}} !", + "addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !", + "partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?", + "pokemon": "de Pokémon", + "sendOutPokemon": "{{pokemonName}} ! Go !", + "hitResultCriticalHit": "Coup critique !", + "hitResultSuperEffective": "C’est super efficace !", + "hitResultNotVeryEffective": "Ce n’est pas très efficace…", + "hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…", + "hitResultImmune": "{{pokemonName}} n’est pas affecté !", + "hitResultOneHitKO": "K.O. en un coup !", + "attackFailed": "Mais cela échoue !", + "attackMissed": "{{pokemonNameWithAffix}}\névite l’attaque !", + "attackHitsCount": "Touché {{count}} fois !", + "rewardGain": "Vous recevez\n{{modifierName}} !", + "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !", + "levelUp": "{{pokemonName}} monte au\nN. {{level}} !", + "learnMove": "{{pokemonName}} apprend\n{{moveName}} !", + "learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.", + "learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.", + "learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?", + "learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?", + "learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.", + "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?", + "learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Tadaaa !", + "learnMoveAnd": "Et…", + "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !", + "moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.", + "moveNoPP": "Il n’y a plus de PP pour\ncette capacité !", + "moveDisabled": "{{moveName}} est sous entrave !", + "disableInterruptedMove": "Il y a une entrave sur la capacité {{moveName}}\nde{{pokemonNameWithAffix}} !", + "noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.", + "noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !", + "noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !", + "noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !", + "noEscapeForce": "Une force mystérieuse\nempêche la fuite.", + "noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !", + "noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !", + "runAwaySuccess": "Vous prenez la fuite !", + "runAwayCannotEscape": "Fuite impossible !", + "escapeVerbSwitch": "le changement", + "escapeVerbFlee": "la fuite", + "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !", + "turnEndHpRestore": "{{pokemonName}} récupère des PV !", + "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", + "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", + "itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.", + "eggHatching": "Hein ?", + "ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?", + "wildPokemonWithAffix": "{{pokemonName}} sauvage", + "foePokemonWithAffix": "{{pokemonName}} ennemi", + "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", + "stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !", + "ppHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure les PP de sa capacité {{moveName}} !", + "hpHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure son énergie !", + "drainMessage": "L’énergie de {{pokemonName}}\nest drainée !", + "regainHealth": "{{pokemonName}} récupère\ndes PV !", + "fainted": "{{pokemonNameWithAffix}}\nest K.O. !", + "statsAnd": "et", + "stats": "Les stats", + "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", + "statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !", + "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", + "statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !", + "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", + "statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !", + "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", + "statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !", + "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", + "statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !", + "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", + "statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !", + "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", + "statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !", + "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", + "statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !", + "transformedIntoType": "{{pokemonName}} prend\nle type {{type}} !", + "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", + "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}} !", + "eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?" +} diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts deleted file mode 100644 index 539b7c99094..00000000000 --- a/src/locales/fr/battle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "Un {{bossName}} apparait.", - "trainerAppeared": "Un combat est lancé\npar {{trainerName}} !", - "trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !", - "trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !", - "singleWildAppeared": "Un {{pokemonName}} sauvage apparait !", - "multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !", - "playerComeBack": "{{pokemonName}} !\nReviens !", - "trainerComeBack": "{{trainerName}} retire {{pokemonName}} !", - "playerGo": "{{pokemonName}} ! Go !", - "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !", - "switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?", - "trainerDefeated": "Vous avez battu\n{{trainerName}} !", - "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", - "pokemonCaught": "Vous avez attrapé {{pokemonName}} !", - "addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !", - "partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?", - "pokemon": "Pokémon", - "sendOutPokemon": "{{pokemonName}} ! Go !", - "hitResultCriticalHit": "Coup critique !", - "hitResultSuperEffective": "C’est super efficace !", - "hitResultNotVeryEffective": "Ce n’est pas très efficace…", - "hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…", - "hitResultOneHitKO": "K.O. en un coup !", - "attackFailed": "Mais cela échoue !", - "attackHitsCount": "Touché {{count}} fois !", - "rewardGain": "Vous recevez\n{{modifierName}} !", - "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !", - "levelUp": "{{pokemonName}} monte au\nN. {{level}} !", - "learnMove": "{{pokemonName}} apprend\n{{moveName}} !", - "learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.", - "learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.", - "learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?", - "learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?", - "learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.", - "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?", - "learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Tadaaa !", - "learnMoveAnd": "Et…", - "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !", - "moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.", - "moveNoPP": "Il n’y a plus de PP pour\ncette capacité !", - "moveDisabled": "{{moveName}} est sous entrave !", - "noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.", - "noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !", - "noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !", - "noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !", - "noEscapeForce": "Une force mystérieuse\nempêche la fuite.", - "noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !", - "noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !", - "runAwaySuccess": "Vous prenez la fuite !", - "runAwayCannotEscape": "Fuite impossible !", - "escapeVerbSwitch": "le changement", - "escapeVerbFlee": "la fuite", - "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !", - "turnEndHpRestore": "{{pokemonName}} récupère des PV !", - "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", - "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", - "eggHatching": "Hein ?", - "ivScannerUseQuestion": "Utiliser le Scanner d’IV sur {{pokemonName}} ?", - "wildPokemonWithAffix": "{{pokemonName}} sauvage", - "foePokemonWithAffix": "{{pokemonName}} ennemi", - "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", - "stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !", - "drainMessage": "L’énergie de {{pokemonName}}\nest drainée !", - "regainHealth": "{{pokemonName}} récupère\ndes PV !", - "fainted": "{{pokemonNameWithAffix}}\nest K.O. !", - "statRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", - "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", - "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", - "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", - "statFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", - "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", - "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", - "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", - "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", - "battlerTagsRechargingLapse": "Le contrecoup empêche {{pokemonNameWithAffix}}\n de bouger !", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}\nne peut plus s’échapper !", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} est libéré\nde la capacité {{moveName}} !", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} a la trouille !\nIl ne peut plus attaquer !", - "battlerTagsConfusedOnAdd": "Ça rend {{pokemonNameWithAffix}}\nconfus !", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}\nn’est plus confus !", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}\nest déjà confus !", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}\nest confus !", - "battlerTagsConfusedLapseHurtItself": "Il se blesse dans sa confusion.", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} n’est pas affecté\nle Lien du Destin !", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} entraine\n{{pokemonNameWithAffix2}} dans sa chute !", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà amoureux !", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !", - "battlerTagsInfatuatedLapseImmobilize": "L’amour empêche {{pokemonNameWithAffix}}\nd’agir !", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\nn’est plus amoureux !", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} est infecté !", - "battlerTagsSeededLapse": "Vampigraine draine l’énergie\nde {{pokemonNameWithAffix}} !", - "battlerTagsSeededLapseShed": "La Vampigraine de {{pokemonNameWithAffix}}\naspire le suintement !", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} s’entoure\nd’un voile d’eau !", - "battlerTagsAquaRingLapse": "{{moveName}} restaure\nles PV de {{pokemonName}} !", - "battlerTagsDrowsyOnAdd": "Ça rend {{pokemonNameWithAffix}} somnolent !", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} est pris dans\nl’étreinte de {{sourcePokemonName}} !", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} est ligoté\npar {{sourcePokemonName}} !", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans le tourbillon !", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} est pris dans le Claquoir\nde {{pokemonName}} !", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} est piégé\npar {{moveName}} !", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans un tourbillon de magma !", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} est tombé\ndans un Troquenard !", - "battlerTagsThunderCageOnTrap": "{{pokemonNameWithAffix}} se fait emprisonner\npar {{sourcePokemonNameWithAffix}} !", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} est harcelé\npar {{sourcePokemonNameWithAffix}} !", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nse protège !", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", - "battlerTagsPerishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} paresse !", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !", - "battlerTagsHighestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !", - "battlerTagsHighestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} se détend.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !" -} as const; diff --git a/src/locales/fr/battler-tags.json b/src/locales/fr/battler-tags.json new file mode 100644 index 00000000000..f523eb7f07d --- /dev/null +++ b/src/locales/fr/battler-tags.json @@ -0,0 +1,73 @@ +{ + "trappedDesc": "le piège", + "flinchedDesc": "la peur", + "confusedDesc": "la confusion", + "infatuatedDesc": "l’amour", + "seedDesc": "l’infection", + "nightmareDesc": "les cauchemars", + "ingrainDesc": "l’enracinement", + "drowsyDesc": "la somnolence", + "rechargingLapse": "Le contrecoup empêche {{pokemonNameWithAffix}}\n de bouger !", + "trappedOnAdd": "{{pokemonNameWithAffix}}\nne peut plus s’échapper !", + "trappedOnRemove": "{{pokemonNameWithAffix}} est libéré\nde la capacité {{moveName}} !", + "flinchedLapse": "{{pokemonNameWithAffix}} a la trouille !\nIl ne peut plus attaquer !", + "confusedOnAdd": "Ça rend {{pokemonNameWithAffix}}\nconfus !", + "confusedOnRemove": "{{pokemonNameWithAffix}}\nn’est plus confus !", + "confusedOnOverlap": "{{pokemonNameWithAffix}}\nest déjà confus !", + "confusedLapse": "{{pokemonNameWithAffix}}\nest confus !", + "confusedLapseHurtItself": "Il se blesse dans sa confusion.", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} n’est pas affecté\nle Lien du Destin !", + "destinyBondLapse": "{{pokemonNameWithAffix}} entraine\n{{pokemonNameWithAffix2}} dans sa chute !", + "infatuatedOnAdd": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà amoureux !", + "infatuatedLapse": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !", + "infatuatedLapseImmobilize": "L’amour empêche {{pokemonNameWithAffix}}\nd’agir !", + "infatuatedOnRemove": "{{pokemonNameWithAffix}}\nn’est plus amoureux !", + "seededOnAdd": "{{pokemonNameWithAffix}} est infecté !", + "seededLapse": "Vampigraine draine l’énergie\nde {{pokemonNameWithAffix}} !", + "seededLapseShed": "La Vampigraine de {{pokemonNameWithAffix}}\naspire le suintement !", + "nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !", + "nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !", + "nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !", + "encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !", + "encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !", + "helpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !", + "ingrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !", + "ingrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !", + "aquaRingOnAdd": "{{pokemonNameWithAffix}} s’entoure\nd’un voile d’eau !", + "aquaRingLapse": "{{moveName}} restaure\nles PV de {{pokemonName}} !", + "drowsyOnAdd": "Ça rend {{pokemonNameWithAffix}} somnolent !", + "damagingTrapLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", + "bindOnTrap": "{{pokemonNameWithAffix}} est pris dans\nl’étreinte de {{sourcePokemonName}} !", + "wrapOnTrap": "{{pokemonNameWithAffix}} est ligoté\npar {{sourcePokemonName}} !", + "vortexOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans le tourbillon !", + "clampOnTrap": "{{sourcePokemonNameWithAffix}} est pris dans le Claquoir\nde {{pokemonName}} !", + "sandTombOnTrap": "{{pokemonNameWithAffix}} est piégé\npar {{moveName}} !", + "magmaStormOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans un tourbillon de magma !", + "snapTrapOnTrap": "{{pokemonNameWithAffix}} est tombé\ndans un Troquenard !", + "thunderCageOnTrap": "{{pokemonNameWithAffix}} se fait emprisonner\npar {{sourcePokemonNameWithAffix}} !", + "infestationOnTrap": "{{pokemonNameWithAffix}} est harcelé\npar {{sourcePokemonNameWithAffix}} !", + "protectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !", + "protectedLapse": "{{pokemonNameWithAffix}}\nse protège !", + "enduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !", + "enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", + "sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", + "perishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !", + "truantLapse": "{{pokemonNameWithAffix}} paresse !", + "slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !", + "slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !", + "highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !", + "highestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !", + "magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !", + "critBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !", + "critBoostOnRemove": "{{pokemonNameWithAffix}} se détend.", + "saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !", + "saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", + "cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !", + "cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !", + "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !", + "disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !", + "disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} n’est plus sous entrave !" +} diff --git a/src/locales/fr/berry.json b/src/locales/fr/berry.json new file mode 100644 index 00000000000..833e1d1d8fd --- /dev/null +++ b/src/locales/fr/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "Baie Sitrus", + "effect": "Restaure 25% des PV s’ils sont inférieurs à 50%." + }, + "LUM": { + "name": "Baie Prine", + "effect": "Soigne tout problème de statut permanant et la confusion." + }, + "ENIGMA": { + "name": "Baie Enigma", + "effect": "Restaure 25% des PV si touché par une capacité super efficace." + }, + "LIECHI": { + "name": "Baie Lichii", + "effect": "Augmente l’Attaque si les PV sont inférieurs à 25%." + }, + "GANLON": { + "name": "Baie Lingan", + "effect": "Augmente la Défense si les PV sont inférieurs à 25%." + }, + "PETAYA": { + "name": "Baie Pitaye", + "effect": "Augmente l’Atq. Spé. si les PV sont inférieurs à 25%." + }, + "APICOT": { + "name": "Baie Abriko", + "effect": "Augmente la Déf. Spé. si les PV sont inférieurs à 25%." + }, + "SALAC": { + "name": "Baie Sailak", + "effect": "Augmente la Vitesse si les PV sont inférieurs à 25%." + }, + "LANSAT": { + "name": "Baie Lansat", + "effect": "Augmente le taux de coups critiques si les PV sont inférieurs à 25%." + }, + "STARF": { + "name": "Baie Frista", + "effect": "Augmente énormément une statistique au hasard si les PV sont inférieurs à 25%." + }, + "LEPPA": { + "name": "Baie Mepo", + "effect": "Restaure 10 PP à une capacité dès que ses PP tombent à 0." + } +} \ No newline at end of file diff --git a/src/locales/fr/berry.ts b/src/locales/fr/berry.ts deleted file mode 100644 index b5048eb02c0..00000000000 --- a/src/locales/fr/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "Baie Sitrus", - effect: "Restaure 25% des PV s’ils sont inférieurs à 50%", - }, - "LUM": { - name: "Baie Prine", - effect: "Soigne tout problème de statut permanant et la confusion", - }, - "ENIGMA": { - name: "Baie Enigma", - effect: "Restaure 25% des PV si touché par une capacité super efficace", - }, - "LIECHI": { - name: "Baie Lichii", - effect: "Augmente l’Attaque si les PV sont inférieurs à 25%", - }, - "GANLON": { - name: "Baie Lingan", - effect: "Augmente la Défense si les PV sont inférieurs à 25%", - }, - "PETAYA": { - name: "Baie Pitaye", - effect: "Augmente l’Atq. Spé. si les PV sont inférieurs à 25%", - }, - "APICOT": { - name: "Baie Abriko", - effect: "Augmente la Déf. Spé. si les PV sont inférieurs à 25%", - }, - "SALAC": { - name: "Baie Sailak", - effect: "Augmente la Vitesse si les PV sont inférieurs à 25%", - }, - "LANSAT": { - name: "Baie Lansat", - effect: "Augmente le taux de coups critiques si les PV sont inférieurs à 25%", - }, - "STARF": { - name: "Baie Frista", - effect: "Augmente énormément une statistique au hasard si les PV sont inférieurs à 25%", - }, - "LEPPA": { - name: "Baie Mepo", - effect: "Restaure 10 PP à une capacité dès que ses PP tombent à 0", - }, -} as const; diff --git a/src/locales/fr/bgm-name.ts b/src/locales/fr/bgm-name.json similarity index 63% rename from src/locales/fr/bgm-name.ts rename to src/locales/fr/bgm-name.json index 025f339ee86..ecf0075e79d 100644 --- a/src/locales/fr/bgm-name.ts +++ b/src/locales/fr/bgm-name.json @@ -1,11 +1,10 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "Musique ", - "missing_entries" : "{{name}}", +{ + "music": "♪ : ", + "missing_entries": "{{name}}", "battle_kanto_champion": "N2B2 - Vs. Maitre de Kanto", "battle_johto_champion": "N2B2 - Vs. Maitre de Johto", - "battle_hoenn_champion": "N2B2 - Vs. Maitre de Hoenn", + "battle_hoenn_champion_g5": "N2B2 - Vs. Maitre de Hoenn", + "battle_hoenn_champion_g6": "ROSA - Vs. Maitre de Hoenn", "battle_sinnoh_champion": "N2B2 - Vs. Maitresse de Sinnoh", "battle_champion_alder": "NB - Vs. Maitre d’Unys", "battle_champion_iris": "N2B2 - Vs. Maitresse d’Unys", @@ -22,7 +21,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_galar_elite": "ÉB - Vs. Tournoi des Champions", "battle_paldea_elite": "ÉV - Vs. Conseil 4", "battle_bb_elite": "ÉV - Vs. Conseil 4 de l’Institut Myrtille", - "battle_final_encounter": "PDM ÉSDX - Vs. Rayquaza", + "battle_final_encounter": "PDM ÉdS DX - Vs. Rayquaza", "battle_final": "NB - Vs. Ghetis", "battle_kanto_gym": "N2B2 - Vs. Champion·ne d’Arène de Kanto", "battle_johto_gym": "N2B2 - Vs. Champion·ne d’Arène de Johto", @@ -46,6 +45,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_lake_trio": "ROSA - Vs. Gardiens des Lacs", "battle_legendary_sinnoh": "ROSA - Vs. Légendaire de Sinnoh", "battle_legendary_dia_pal": "ROSA - Vs. Dialga/Palkia", + "battle_legendary_origin_forme": "LPA - Vs. Dialga/Palkia Originel", "battle_legendary_giratina": "ROSA - Vs. Giratina", "battle_legendary_arceus": "HGSS - Vs. Arceus", "battle_legendary_unova": "NB - Vs. Légendaire d’Unys", @@ -60,6 +60,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_zac_zam": "ÉB - Vs. Zacian/Zamazenta", "battle_legendary_glas_spec": "ÉB - Vs. Blizzeval/Spectreval", "battle_legendary_calyrex": "ÉB - Vs. Sylveroy", + "battle_legendary_riders": "ÉB - Vs. Sylveroy Cavalier du Froid/d’Effroi", "battle_legendary_birds_galar": "ÉB - Vs. Oiseaux Légendaires de Galar", "battle_legendary_ruinous": "ÉV - Vs. Trésors du fléau", "battle_legendary_kor_mir": "ÉV - Profondeurs de la Zone Zéro (Combat)", @@ -73,56 +74,62 @@ export const bgmName: SimpleTranslationEntries = { "battle_trainer": "NB - Vs. Dresseur·euse", "battle_wild": "NB - Vs. Pokémon sauvage", "battle_wild_strong": "NB - Vs. Pokémon puissant sauvage", - "end_summit": "PDM ÉSDX - Tour Céleste", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", + "end_summit": "PDM ÉdS DX - Tour Céleste (Sommet)", + "battle_rocket_grunt": "HGSS Vs. Team Rocket", + "battle_aqua_magma_grunt": "ROSA Vs. Team Aqua/Magma", + "battle_galactic_grunt": "DÉPS Vs. Team Galaxie", "battle_plasma_grunt": "NB - Vs. Team Plasma", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", + "battle_flare_grunt": "XY - Vs. Team Flare", + "battle_aether_grunt": "SL - Vs. Fondation Æther", + "battle_skull_grunt": "SL - Vs. Team Skull", + "battle_macro_grunt": "ÉB - Vs. Macro Cosmos", + "battle_galactic_admin": "DÉPS - Vs. Admin Team Galaxie", + "battle_skull_admin": "SL - Vs. Admin Team Skull", + "battle_oleana": "ÉB - Vs. Liv", + "battle_rocket_boss": "USUL - Vs. Giovanni", + "battle_aqua_magma_boss": "ROSA - Vs. Arthur/Max", + "battle_galactic_boss": "DÉPS - Vs. Hélio", + "battle_plasma_boss": "N2B2 - Vs. Ghetis", + "battle_flare_boss": "XY - Vs. Lysandre", + "battle_aether_boss": "SL - Vs. Elsa-Mina", + "battle_skull_boss": "SL - Vs. Guzma", + "battle_macro_boss": "ÉB - Vs. Shehroz", - // Biome Music - "abyss": "PDM EdS - Cratère Obscur", - "badlands": "PDM EdS - Vallée Stérile", - "beach": "PDM EdS - Falaise Trempée", - "cave": "PDM EdS - Pic Céleste (grotte)", - "construction_site": "PDM EdS - Carrière Rocher", - "desert": "PDM EdS - Désert du Nord", - "dojo": "PDM EdS - Dojo Ossatueur", - "end": "PDM EdS - Tour Céleste", - "factory": "PDM EdS - Ruines Cachées", - "fairy_cave": "PDM EdS - Caverne Étoile", - "forest": "PDM EdS - Forêt Crépuscule", - "grass": "PDM EdS - Bois aux Pommes", - "graveyard": "PDM EdS - Forêt Trompeuse", - "ice_cave": "PDM EdS - Montagne Glacier", - "island": "PDM EdS - Côte Escarpée", - "jungle": "Lmz - Jungle", // The composer thinks about a more creative name - "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name - "lake": "PDM EdS - Caverne Cristal", - "meadow": "PDM EdS - Pic Céleste (forêt)", - "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name - "mountain": "PDM EdS - Mt Corne", - "plains": "PDM EdS - Pic Céleste (prairie)", - "power_plant": "PDM EdS - Plaines Élek", - "ruins": "PDM EdS - Ruine Scellée", - "sea": "PDM EdS - Caverne Saline", - "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PDM EdS - Pic Céleste (côte)", - "snowy_forest": "PDM EdS - Pic Céleste (plaine enneigée)", + "abyss": "PDM EdC - Cratère Obscur", + "badlands": "PDM EdC - Vallée Stérile", + "beach": "PDM EdC - Falaise Trempée", + "cave": "PDM EdC - Pic Céleste (grotte)", + "construction_site": "PDM EdC - Carrière Rocher", + "desert": "PDM EdC - Désert du Nord", + "dojo": "PDM EdC - Dojo Ossatueur", + "end": "PDM EdC - Tour Céleste", + "factory": "PDM EdC - Ruines Cachées", + "fairy_cave": "PDM EdC - Caverne Étoile", + "forest": "PDM EdC - Forêt Crépuscule", + "grass": "PDM EdC - Bois aux Pommes", + "graveyard": "PDM EdC - Forêt Trompeuse", + "ice_cave": "PDM EdC - Montagne Glacier", + "island": "PDM EdC - Côte Escarpée", + "jungle": "Lmz - Jungle", + "laboratory": "Firel - Laboratory", + "lake": "PDM EdC - Caverne Cristal", + "meadow": "PDM EdC - Pic Céleste (forêt)", + "metropolis": "Firel - Metropolis", + "mountain": "PDM EdC - Mont Corne", + "plains": "PDM EdC - Pic Céleste (prairie)", + "power_plant": "PDM EdC - Plaines Élek", + "ruins": "PDM EdC - Ruine Scellée", + "sea": "Andr06 - Marine Mystique", + "seabed": "Firel - Seabed", + "slum": "Andr06 - Sneaky Snom", + "snowy_forest": "PDM EdC - Pic Céleste (plaine enneigée)", "space": "Firel - Aether", - "swamp": "PDM EdS - Mer Fermée", - "tall_grass": "PDM EdS - Forêt Brumeuse", - "temple": "PDM EdS - Grotte Égide", - "town": "PDM EdS - Donjon aléatoire - Thème 3", - "volcano": "PDM EdS - Grotte Étuve", - "wasteland": "PDM EdS - Terres Illusoires", - - // Encounter + "swamp": "PDM EdC - Mer Fermée", + "tall_grass": "PDM EdC - Forêt Brumeuse", + "temple": "PDM EdC - Grotte Égide", + "town": "PDM EdC - Donjon aléatoire - Thème 3", + "volcano": "PDM EdC - Grotte Étuve", + "wasteland": "PDM EdC - Terres Illusoires", "encounter_ace_trainer": "NB - Regards croisés (Topdresseur·euse)", "encounter_backpacker": "NB - Regards croisés (Randonneur·euse)", "encounter_clerk": "NB - Regards croisés (Employé·e)", @@ -137,9 +144,7 @@ export const bgmName: SimpleTranslationEntries = { "encounter_scientist": "NB - Regards croisés (Scientifique)", "encounter_twins": "NB - Regards croisés (Jumelles)", "encounter_youngster": "NB - Regards croisés (Gamin)", - - // Other "heal": "NB - Soin de Pokémon", - "menu": "PDM EdS - Bienvenue dans le monde de Pokémon !", - "title": "PDM EdS - Menu Principal", -} as const; + "menu": "PDM EdC - Bienvenue dans le monde de Pokémon !", + "title": "PDM EdC - Menu Principal" +} diff --git a/src/locales/fr/biome.ts b/src/locales/fr/biome.json similarity index 86% rename from src/locales/fr/biome.ts rename to src/locales/fr/biome.json index 83029b3a8d4..e1012c7ea9e 100644 --- a/src/locales/fr/biome.ts +++ b/src/locales/fr/biome.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { +{ "unknownLocation": "vous avez oublié où", "TOWN": "Ville", "PLAINS": "Plaines", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "Forêt Enneigée", "ISLAND": "Ile", "LABORATORY": "Laboratoire", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/fr/challenges.json b/src/locales/fr/challenges.json new file mode 100644 index 00000000000..a83ec2e0be4 --- /dev/null +++ b/src/locales/fr/challenges.json @@ -0,0 +1,36 @@ +{ + "title": "Paramètres du Challenge", + "illegalEvolution": "{{pokemon}} est devenu\ninéligible pour ce challenge !", + "singleGeneration": { + "name": "Monogénération", + "desc": "Vous ne pouvez choisir que des Pokémon de {{gen}} génération.", + "desc_default": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.", + "gen_1": "1re", + "gen_2": "2e", + "gen_3": "3e", + "gen_4": "4e", + "gen_5": "5e", + "gen_6": "6e", + "gen_7": "7e", + "gen_8": "8e", + "gen_9": "9e" + }, + "singleType": { + "name": "Monotype", + "desc": "Vous ne pouvez choisir que des Pokémon de type {{type}}.", + "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné." + }, + "freshStart": { + "name": "Nouveau départ", + "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/challenges.ts b/src/locales/fr/challenges.ts deleted file mode 100644 index d88960dbe3b..00000000000 --- a/src/locales/fr/challenges.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TranslationEntries } from "#app/interfaces/locales"; - -export const challenges: TranslationEntries = { - "title": "Paramètres du Challenge", - "illegalEvolution": "{{pokemon}} s’est transformé en Pokémon\ninéligible pour ce challenge !", - "singleGeneration": { - "name": "Mono-génération", - "desc": "Vous ne pouvez choisir que des Pokémon de {{gen}} génération.", - "desc_default": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.", - "gen_1": "1re", - "gen_2": "2e", - "gen_3": "3e", - "gen_4": "4e", - "gen_5": "5e", - "gen_6": "6e", - "gen_7": "7e", - "gen_8": "8e", - "gen_9": "9e", - }, - "singleType": { - "name": "Mono-type", - "desc": "Vous ne pouvez choisir que des Pokémon de type {{type}}.", - "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné." - //type in pokemon-info - }, -} as const; diff --git a/src/locales/fr/command-ui-handler.json b/src/locales/fr/command-ui-handler.json new file mode 100644 index 00000000000..82733837375 --- /dev/null +++ b/src/locales/fr/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "Attaque", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Fuite", + "actionMessage": "Que doit faire\n{{pokemonName}} ?" +} diff --git a/src/locales/fr/command-ui-handler.ts b/src/locales/fr/command-ui-handler.ts deleted file mode 100644 index 42180d31276..00000000000 --- a/src/locales/fr/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Attaque", - "ball": "Ball", - "pokemon": "Pokémon", - "run": "Fuite", - "actionMessage": "Que doit faire\n{{pokemonName}} ?", -} as const; diff --git a/src/locales/fr/common.json b/src/locales/fr/common.json new file mode 100644 index 00000000000..623177d1e2b --- /dev/null +++ b/src/locales/fr/common.json @@ -0,0 +1,8 @@ +{ + "start": "Lancer", + "luckIndicator": "Chance :", + "shinyOnHover": "Chromatique", + "commonShiny": "Commun", + "rareShiny": "Rare", + "epicShiny": "Épique" +} diff --git a/src/locales/fr/common.ts b/src/locales/fr/common.ts deleted file mode 100644 index e4ccc627f5e..00000000000 --- a/src/locales/fr/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "Lancer", -} as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index 04af81adf52..f79374cd3b9 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -1,94 +1,113 @@ -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const frConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - statusEffect: statusEffect, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather, - partyUiHandler: partyUiHandler + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory, }; diff --git a/src/locales/fr/dialogue-double-battle.json b/src/locales/fr/dialogue-double-battle.json new file mode 100644 index 00000000000..fbc5d56ed26 --- /dev/null +++ b/src/locales/fr/dialogue-double-battle.json @@ -0,0 +1,83 @@ +{ + "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…", + "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-final-boss.json b/src/locales/fr/dialogue-final-boss.json new file mode 100644 index 00000000000..b7226ebb480 --- /dev/null +++ b/src/locales/fr/dialogue-final-boss.json @@ -0,0 +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." +} diff --git a/src/locales/fr/dialogue-misc.json b/src/locales/fr/dialogue-misc.json new file mode 100644 index 00000000000..864bd53eab5 --- /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.json b/src/locales/fr/dialogue.json new file mode 100644 index 00000000000..dddd0d8e5b7 --- /dev/null +++ b/src/locales/fr/dialogue.json @@ -0,0 +1,704 @@ +{ + "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 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.", + "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’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." + }, + "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…" + } + }, + "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 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." + }, + "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 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 ?" + }, + "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 un Topdresseur !", + "4_female": "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": { + "1": "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é 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 !", + "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’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 ?" + } + }, + "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 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_female": "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 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 !", + "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 é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 !" + }, + "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 !" + } + }, + "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 !" + }, + "victory": { + "1": "QUOI ? IMPOSSIBLE !" + }, + "defeat": { + "1": "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n’es encore qu’un gamin.", + "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": { + "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. Prépare-toi à mon ultime riposte ! Hahahaha !" + }, + "victory": { + "1": "Ce… Ce n’est pas… Gnn…" + }, + "defeat": { + "1": "L’heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + } + }, + "aqua_boss_archie_1": { + "encounter": { + "1": "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." + }, + "victory": { + "1": "Retrouvons-nous.\nJe me souviendrai de ton visage." + }, + "defeat": { + "1": "Magnifique !\nPlus rien ne peut nous retenir !" + } + }, + "aqua_boss_archie_2": { + "encounter": { + "1": "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" + }, + "victory": { + "1": "Comme si j’y avait cru…" + }, + "defeat": { + "1": "Je rendrai à ce monde sa pureté originelle !" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + "1": "Tu t’es senti obligé de venir ici dans un acte vide de sens. Je vais te le faire regretter.", + "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." + }, + "defeat": { + "1": "Je le créerai, mon nouveau monde…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + "1": "Nous y revoilà. Il semblerait que nos destinées soient entremêlées. Il est l’heure d’y mettre un terme." + }, + "victory": { + "1": "Comment. Comment ?\nCOMMENT ?!" + }, + "defeat": { + "1": "Adieu." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + "1": "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" + }, + "victory": { + "1": "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" + }, + "defeat": { + "1": "Je suis le parfait monarque d’un monde parfait !\nHahaha !" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + "1": "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" + }, + "victory": { + "1": "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" + }, + "defeat": { + "1": "Kyurem ! Fusiorption !!!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + "1": "Comptes-tu m’arrêter ? Prouve-le." + }, + "victory": { + "1": "T’es venu m’arrêter. Mais je te demande d’attendre." + }, + "defeat": { + "1": "Les Pokémon… Ne devraient plus exister." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + "1": "Ton 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." + } + }, + "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é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." + }, + "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 ?" + } + }, + "alder": { + "encounter": { + "1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !" + }, + "victory": { + "1": "Bien joué ! Tu as sans aucun doute un talent inégalé." + }, + "defeat": { + "1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !" + } + }, + "kieran": { + "encounter": { + "1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas." + }, + "victory": { + "1": "Je n’y crois pas…\n$Quel combat amusant et palpitant !" + }, + "defeat": { + "1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer encore plus dur." + } + }, + "rival": { + "encounter": { + "1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\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, 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 !" + } + }, + "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 !" + } + }, + "rival_2_female": { + "encounter": { + "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 !" + }, + "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 devenu fort !" + }, + "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 fier d’être arrivé 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êt." + }, + "victory": { + "1": "@c{neutral}Que…@d{64} Qui es-tu ?" + }, + "defeat": { + "1": "$@c{smile}Tu devrais être fier 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 sain et sauf.\n$@c{smile_ehalf}… Merci." + } + } +} diff --git a/src/locales/fr/dialogue.ts b/src/locales/fr/dialogue.ts deleted file mode 100644 index ab192963cad..00000000000 --- a/src/locales/fr/dialogue.ts +++ /dev/null @@ -1,5272 +0,0 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Dialogue of the NPCs in the game when the player character is male (or unset) -export const PGMdialogue: DialogueTranslationEntries = { - "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 parvenu ! 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 !", - 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: "Tu as l'air d'un nouveau dresseur. Battons nous !", - 3: "Je ne te reconnais pas. Que dirais-tu de te battre ?", - 4: "Amusons-nous pendant ce combat Pokémon !", - 5: "Je vais t'apprendre à te battre avec des Pokémon !", - 6: "Un combat doit être pris au sérieux. Es-tu prêt à te battre ?", - 7: "Tu ne seras pas jeune éternellement. Tu n'auras qu'une chance pendant un combat. Bientôt, tu ne 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. Je n'ai rien à faire. *Baille*. Je me bats juste pour passer le temps." - }, - "victory": { - 1: "Wow, c'était impressionnant. J'ai beaucoup à apprendre.", - 2: "Je ne pensais pas que je perdrais comme ça…", - 3: "J'espère que j'aurai ma revanche un jour.", - 4: "C'était super amusant ! Ce combat m'a épuisé…", - 5: "Tu m'as appris une belle leçon ! Tu 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.", - 7: "Je n'ai pas besoin de souvenirs comme ça. *Suppression de la mémoire…*", - 8: "Hé ! Je t'avais dit d'y aller doucement avec moi ! Mais tu es vraiment trop cool quand tu te bats sérieusement.", - 9: "J'en ai marre des combats Pokémon… Il doit y avoir de nouvelles choses à faire…" - } - }, - "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: "C'est l'heure de plonger dans le combat !", - 2: "Je vais 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 j'ai surfé sur les vagues de la défaite...", - 3: "Retour sur la terre ferme je suppose", - }, - }, - "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": { - 2: "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. - $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..." - }, - }, - "rocket_grunt": { - "encounter": { - 1: "Nous sommes de retour !" - }, - "victory": { - 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" - }, - }, - "magma_grunt": { - "encounter": { - 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" - }, - "victory": { - 1: "Je…?\nJ’ai perdu ?!" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour un gamin !" - }, - "victory": { - 1: "Comment ça ?" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "Ne te mets pas en travers de la Team Galaxie !" - }, - "victory": { - 1: "Désactivation…" - }, - }, - "plasma_grunt": { - "encounter": { - 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" - }, - "victory": { - 1: "Plasmaaaaaaaaa !" - }, - }, - "flare_grunt": { - "encounter": { - 1: "Le style et le bon gout, il n’y a que ça qui compte !" - }, - "victory": { - 1: "Mon futur me semble guère radieux." - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" - }, - "victory": { - 1: "QUOI ? IMPOSSIBLE !" - }, - "defeat": { - 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n'es encore qu’un gamin." - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" - }, - "victory": { - 1: "Comment c'est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…" - }, - "defeat": { - 1: "La Team Rocket renaitra, et je dominerai le monde !" - } - }, - "magma_boss_maxie_1": { - "encounter": { - 1: "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !" - }, - "victory": { - 1: "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…" - }, - "defeat": { - 1: "La Team Magma vaincra !" - } - }, - "magma_boss_maxie_2": { - "encounter": { - 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" - }, - "victory": { - 1: "Ce… Ce n'est pas… Gnn…" - }, - "defeat": { - 1: "L'heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." - } - }, - "aqua_boss_archie_1": { - "encounter": { - 1: "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." - }, - "victory": { - 1: "Retrouvons-nous.\nJe me souviendrai de ton visage." - }, - "defeat": { - 1: "Magnifique !\nPlus rien ne peut nous retenir !" - } - }, - "aqua_boss_archie_2": { - "encounter": { - 1: "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" - }, - "victory": { - 1: "Comme si j’y avait cru…" - }, - "defeat": { - 1: "Je rendrai à ce monde sa pureté originelle !" - } - }, - "galactic_boss_cyrus_1": { - "encounter": { - 1: "Tu t’es senti obligé de venir ici dans un acte vide de sens. Je vais te le faire regretter." - }, - "victory": { - 1: "Intéressant. Et plutôt curieux." - }, - "defeat": { - 1: "Je le créerai, mon nouveau monde…" - } - }, - "galactic_boss_cyrus_2": { - "encounter": { - 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées. Il est l’heure d’y mettre un terme." - }, - "victory": { - 1: "Comment. Comment ?\nCOMMENT ?!" - }, - "defeat": { - 1: "Adieu." - } - }, - "plasma_boss_ghetsis_1": { - "encounter": { - 1: "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" - }, - "victory": { - 1: "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" - }, - "defeat": { - 1: "Je suis le parfait monarque d’un monde parfait !\nHahaha !" - } - }, - "plasma_boss_ghetsis_2": { - "encounter": { - 1: "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" - }, - "victory": { - 1: "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" - }, - "defeat": { - 1: "Kyurem ! Fusiorption !!!" - } - }, - "flare_boss_lysandre_1": { - "encounter": { - 1: "Comptes-tu m’arrêter ? Prouve-le." - }, - "victory": { - 1: "T’es venu m’arrêter. Mais je te demande d’attendre." - }, - "defeat": { - 1: "Les Pokémon… Ne devraient plus exister." - } - }, - "flare_boss_lysandre_2": { - "encounter": { - 1: "Ton future ou le mien… Voyons lequel mérite plus." - }, - "victory": { - 1: "Ohhhh… !" - }, - "defeat": { - 1: "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde." - } - }, - "brock": { - "encounter": { - 1: "My expertise on Rock-type Pokémon will take you down! Come on!", - 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. - $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... - $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? - $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… - $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. - $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. - $I believed that tale, so I have secretly trained here all my life. As a result, I can now see what others cannot. - $I see a shadow of the person who will make the Pokémon appear. - $I believe that person is me! You're going to help me reach that level!`, - 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. - $I envy you for that…`, - 3: "How is this possible…", - 4: `I don't think our potentials are so different. - $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. - $… 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. - $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? - $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… - $They're both great subjects for my camera! Fantastic! This'll be just fantastic! - $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… - $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! - $But I should tell you, I'm tough because I know how to focus.`, - 2: `Pokémon, fashion, romance… It's all about focus! - $I'll show you just what I mean. Get ready to lose!` - }, - "victory": { - 1: "I must say, I'm warmed up to you! I might even admire you a little.", - 2: `Wow! You're great! You've earned my respect! - $I think your focus and will bowled us over totally. ` - }, - "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… - $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'. - $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. - $That's good! Looking real good! All right! - $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. - $Yes, the bond I developed with Pokémon is extremely tight. - $So, come on, just try and see if you can even inflict damage on my Pokémon!`, - }, - "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. - $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! - $The all-consuming heat overwhelms. - $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? - $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. - $I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. - $And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!`, - }, - "victory": { - 1: `Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. - $I find much joy in having met you and your Pokémon. You have proven yourself worthy.`, - }, - "defeat": { - 1: "A grand illusion!" - } - }, - "lorelei": { - "encounter": { - 1: `No one can best me when it comes to icy Pokémon! Freezing moves are powerful! - $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. - $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. - $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. - $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. - $Your Pokémon believed in you and did their best to earn you the win. - $Even though I've lost, I find myself with this silly grin!`, - }, - "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. - $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? - $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… - $You look like a Pokémon Trainer with refined strength and deepened kindness. - $What I look for in my opponent is superb strength… - $Please unleash your power to the fullest!`, - }, - "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… - $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! - $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! - $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. - $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. - $This is gonna be a doozy of a battle! - $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… - $The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. - $Since you've made it this far, I'll put that aside and battle you. - $Let me see if you'll achieve as much glory as the hero of my book!,` - }, - "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… - $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… - $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? - $What have you felt, meeting so many other Trainers out there? - $Traveling this rich land… Has it awoken something inside you? - $I want you to come at me with all that you've learned. - $My Pokémon and I will respond in turn with all that we know!`, - }, - "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! - $I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! - #And they are battling alongside Pokémon that have been through countless difficult battles! - $If I battle with people like that, not only will I get stronger, my Pokémon will, too! - $And we'll get to know each other even better! OK! Brace yourself! - $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, - }, - "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. - $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. - $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… - $But what a champion time it's been! - $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. - $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. - $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. - $With more young Trainers taking charge, the future of Pokémon is bright! - $So, as a wall for young people, I'll take your challenge!`, - }, - "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… - $I hope you're the Trainer who'll make me remember how fun it is to battle!`, - }, - "victory": { - 1: `You've got me beat… - $Your desire and the noble way your Pokémon battled for you… - $I even felt thrilled during our match. That was a very good battle.`, - }, - "defeat": { - 1: `It was not shocking at all… - $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. - $OK! I can hear my battle muse loud and clear. Let's get straight to it!`, - 2: `Of course, I'm really proud of all of my Pokémon! - $Well now… Let's get right to it!` - }, - "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. - $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! - $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? - $I love being on the summit! 'Cause you can see forever and ever from high places! - $So, how about you and I have some fun?`, - }, - "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. - $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. - $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. - $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. - $That is all there really is to it. - $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. - $Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. - $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, - }, - "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… - $But really, I just do it 'cause it's fun. - $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. - $But that means your opponent is also working hard to win. - $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? - $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! - $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. - $It's a real curse. - $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? - $... - $Let's get this show on the road! How strong is our challenger? - $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: "Prépare-toi pour un combat contre le meilleur Dresseur d'Unys !", - }, - "victory": { - 1: "Bien joué ! Tu as sans aucun doute un talent inégalé.", - }, - "defeat": { - 1: `Une brise fraîche traverse mon cœur… - $Quel effort extraordinaire !`, - } - }, - "kieran": { - "encounter": { - 1: `Grâce à un travail acharné, je deviens de plus en plus fort ! - $Je ne perdrai pas.`, - }, - "victory": { - 1: `Je n'y crois pas… - $Quel combat amusant et palpitant !` - }, - "defeat": { - 1: `Eh beh, quel combat ! - $Il est temps pour toi de t'entraîner encore plus dur.`, - } - }, - "rival": { - "encounter": { - 1: `@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir… - $@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire. - $@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. - $@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 ? - $@c{smile}T'as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin. - $D'ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas. - $@c{serious_smile_fists}Bonne chance à toi !` - }, - }, - "rival_female": { - "encounter": { - 1: `@c{smile_wave}Ah, je te cherchais ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ? - $@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé… - $@c{smile}Je veux bien te pardonner de m’avoir oubliée, à une conditon. @c{smile_wave_wink}Que tu m’affronte ! - $@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 ! - $@c{smile_wave_wink}J'déconne !@d{64} @c{smile_eclosed}J'ai perdu dans les règles… J’ai le sentiment que tu vas très bien t’en sortir. - $@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr ! - $@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… ? - $@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c'est pas complètement vrai. - $@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m'as battu. - $Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois. - $@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. - $@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 - $@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 - $@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire. - $@c{smile}Bref, prends soin de toi !` - }, - }, - "rival_2_female": { - "encounter": { - 1: `@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal ! - $@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas. @c{smile_eclosed}C’est juste que j’étais aussi dans le coin. - $@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois. - $@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès. - $@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… - $@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer ! - $@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~. - $@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là ! - $@c{smile_wave}Allez, tiens le coup !` - }, - "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. - $@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village. - $@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. - $@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre. - $@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 ? - $@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 ! - $@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup. - $@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. - $@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenu fort !` - }, - "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é. - $Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique. - $@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied. - $@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale. - $@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné. - $@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. - $@c{angry_mhalf}La défaite, c'est pour les faibles, et je ne suis plus un faible. - $@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 ? - $@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure. - $@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l'entrainement. - $@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte. - $@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre. - $Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre. - $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. - $@c{angry_mopen}Tiens-toi prêt.` - }, - "victory": { - 1: "@c{neutral}Que…@d{64} Qui es-tu ?" - - }, - "defeat": { - 1: "$@c{smile}Tu devrais être fier 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à. - $@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange. - $@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand. - $@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. - $@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir. - $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. - $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? - $@c{serious}…et c’est comme si quelque chose ici me parlait. - $Comme si c’était tout ce que ce monde avait toujours connu. - $Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir. - $@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ? - $@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es la seule à en être capable. - $@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité. - $@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 je j'avais à faire. - $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. - $@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens… - $@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange… - $@c{smile}T’as tes rêves, j’ai mes ambitions… - $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. - $@c{smile_eclosed}Je crois que mon but est de… repousser tes limites. - $@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux. - $Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide… - $Comme… si c’était tout ce que ce monde avait toujours connu. - $@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous. - $@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant… - $@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es le seul à en être capable. - $@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité. - $@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance.` - }, - "victory": { - 1: `@c{smile_ehalf}Je… Je crois que j'ai rempli ma mission… - $@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison sain et sauf. - $@c{smile_ehalf}… Merci.` - - }, - }, -}; - - -// Dialogue of the NPCs in the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = { - "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: "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. - $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..." - }, - }, - "rocket_grunt": { - "encounter": { - 1: "Nous sommes de retour !" - }, - "victory": { - 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" - }, - }, - "magma_grunt": { - "encounter": { - 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" - }, - "victory": { - 1: "Je…?\nJ’ai perdu ?!" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour une gamine !" - }, - "victory": { - 1: "Comment ça ?" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "Ne te mets pas en travers de la Team Galaxie !" - }, - "victory": { - 1: "Désactivation…" - }, - }, - "plasma_grunt": { - "encounter": { - 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" - }, - "victory": { - 1: "Plasmaaaaaaaaa !" - }, - }, - "flare_grunt": { - "encounter": { - 1: "Le style et le bon gout, il n’y a que ça qui compte !" - }, - "victory": { - 1: "Mon futur me semble guère radieux." - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" - }, - "victory": { - 1: "QUOI ? IMPOSSIBLE !" - }, - "defeat": { - 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n'es encore qu’une gamine." - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" - }, - "victory": { - 1: "Comment c'est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…" - }, - "defeat": { - 1: "La Team Rocket renaitra, et je dominerai le monde !" - } - }, - "magma_boss_maxie_1": { - "encounter": { - 1: "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !" - }, - "victory": { - 1: "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…" - }, - "defeat": { - 1: "La Team Magma vaincra !" - } - }, - "magma_boss_maxie_2": { - "encounter": { - 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" - }, - "victory": { - 1: "Ce… Ce n'est pas… Gnn…" - }, - "defeat": { - 1: "L'heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." - } - }, - "aqua_boss_archie_1": { - "encounter": { - 1: "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." - }, - "victory": { - 1: "Retrouvons-nous.\nJe me souviendrai de ton visage." - }, - "defeat": { - 1: "Magnifique !\nPlus rien ne peut nous retenir !" - } - }, - "aqua_boss_archie_2": { - "encounter": { - 1: "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" - }, - "victory": { - 1: "Comme si j’y avait cru…" - }, - "defeat": { - 1: "Je rendrai à ce monde sa pureté originelle !" - } - }, - "galactic_boss_cyrus_1": { - "encounter": { - 1: "Tu t’es sentie obligée de venir ici dans un acte vide de sens. Je vais te le faire regretter." - }, - "victory": { - 1: "Intéressant. Et plutôt curieux." - }, - "defeat": { - 1: "Je le créerai, mon nouveau monde…" - } - }, - "galactic_boss_cyrus_2": { - "encounter": { - 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées. Il est l’heure d’y mettre un terme." - }, - "victory": { - 1: "Comment. Comment ?\nCOMMENT ?!" - }, - "defeat": { - 1: "Adieu." - } - }, - "plasma_boss_ghetsis_1": { - "encounter": { - 1: "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" - }, - "victory": { - 1: "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" - }, - "defeat": { - 1: "Je suis le parfait monarque d’un monde parfait !\nHahaha !" - } - }, - "plasma_boss_ghetsis_2": { - "encounter": { - 1: "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" - }, - "victory": { - 1: "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" - }, - "defeat": { - 1: "Kyurem ! Fusiorption !!!" - } - }, - "flare_boss_lysandre_1": { - "encounter": { - 1: "Comptes-tu m’arrêter ? Prouve-le." - }, - "victory": { - 1: "T’es venu m’arrêter. Mais je te demande d’attendre." - }, - "defeat": { - 1: "Les Pokémon… Ne devraient plus exister." - } - }, - "flare_boss_lysandre_2": { - "encounter": { - 1: "Ton future ou le mien… Voyons lequel mérite plus." - }, - "victory": { - 1: "Ohhhh… !" - }, - "defeat": { - 1: "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde." - } - }, - "brock": { - "encounter": { - 1: "My expertise on Rock-type Pokémon will take you down! Come on!", - 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. - $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... - $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? - $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… - $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. - $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. - $I believed that tale, so I have secretly trained here all my life. As a result, I can now see what others cannot. - $I see a shadow of the person who will make the Pokémon appear. - $I believe that person is me! You're going to help me reach that level!`, - 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. - $I envy you for that…`, - 3: "How is this possible…", - 4: `I don't think our potentials are so different. - $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. - $… 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. - $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? - $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… - $They're both great subjects for my camera! Fantastic! This'll be just fantastic! - $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… - $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! - $But I should tell you, I'm tough because I know how to focus.`, - 2: `Pokémon, fashion, romance… It's all about focus! - $I'll show you just what I mean. Get ready to lose!` - }, - "victory": { - 1: "I must say, I'm warmed up to you! I might even admire you a little.", - 2: `Wow! You're great! You've earned my respect! - $I think your focus and will bowled us over totally. ` - }, - "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… - $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'. - $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. - $That's good! Looking real good! All right! - $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. - $Yes, the bond I developed with Pokémon is extremely tight. - $So, come on, just try and see if you can even inflict damage on my Pokémon!`, - }, - "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. - $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! - $The all-consuming heat overwhelms. - $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? - $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. - $I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. - $And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!`, - }, - "victory": { - 1: `Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. - $I find much joy in having met you and your Pokémon. You have proven yourself worthy.`, - }, - "defeat": { - 1: "A grand illusion!" - } - }, - "lorelei": { - "encounter": { - 1: `No one can best me when it comes to icy Pokémon! Freezing moves are powerful! - $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. - $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. - $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. - $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: `Whoa, amazing! You're an expert on Pokémon! - $My research isn't complete yet. OK, you win.`, - }, - "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. - $Your Pokémon believed in you and did their best to earn you the win. - $Even though I've lost, I find myself with this silly grin!`, - }, - "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. - $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? - $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… - $You look like a Pokémon Trainer with refined strength and deepened kindness. - $What I look for in my opponent is superb strength… - $Please unleash your power to the fullest!`, - }, - "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… - $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! - $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! - $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. - $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. - $This is gonna be a doozy of a battle! - $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… - $The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. - $Since you've made it this far, I'll put that aside and battle you. - $Let me see if you'll achieve as much glory as the hero of my book!,` - }, - "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… - $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… - $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? - $What have you felt, meeting so many other Trainers out there? - $Traveling this rich land… Has it awoken something inside you? - $I want you to come at me with all that you've learned. - $My Pokémon and I will respond in turn with all that we know!`, - }, - "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! - $I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! - #And they are battling alongside Pokémon that have been through countless difficult battles! - $If I battle with people like that, not only will I get stronger, my Pokémon will, too! - $And we'll get to know each other even better! OK! Brace yourself! - $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, - }, - "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. - $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. - $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… - $But what a champion time it's been! - $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. - $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. - $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. - $With more young Trainers taking charge, the future of Pokémon is bright! - $So, as a wall for young people, I'll take your challenge!`, - }, - "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… - $I hope you're the Trainer who'll make me remember how fun it is to battle!`, - }, - "victory": { - 1: `You've got me beat… - $Your desire and the noble way your Pokémon battled for you… - $I even felt thrilled during our match. That was a very good battle.`, - }, - "defeat": { - 1: `It was not shocking at all… - $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. - $OK! I can hear my battle muse loud and clear. Let's get straight to it!`, - 2: `Of course, I'm really proud of all of my Pokémon! - $Well now… Let's get right to it!` - }, - "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. - $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! - $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? - $I love being on the summit! 'Cause you can see forever and ever from high places! - $So, how about you and I have some fun?`, - }, - "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. - $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. - $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. - $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. - $That is all there really is to it. - $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. - $Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. - $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, - }, - "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… - $But really, I just do it 'cause it's fun. - $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. - $But that means your opponent is also working hard to win. - $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? - $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! - $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. - $It's a real curse. - $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? - $... - $Let's get this show on the road! How strong is our challenger? - $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!" - } - }, - "rival": { - "encounter": { - 1: `@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir… - $@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire. - $@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. - $@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 ? - $@c{smile}T'as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin. - $D'ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas. - $@c{serious_smile_fists}Bonne chance à toi !` - }, - }, - "rival_female": { - "encounter": { - 1: `@c{smile_wave}Ah, je te cherchais ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ? - $@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé… - $@c{smile}Je veux bien te pardonner de m’avoir oubliée, à une conditon. @c{smile_wave_wink}Que tu m’affronte ! - $@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 ! - $@c{smile_wave_wink}J'déconne !@d{64} @c{smile_eclosed}J'ai perdu dans les règles… J’ai le sentiment que tu vas très bien t’en sortir. - $@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr ! - $@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… ? - $@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c'est pas complètement vrai. - $@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m'as battu. - $Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois. - $@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. - $@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 - $@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 - $@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire. - $@c{smile}Bref, prends soin de toi !` - }, - }, - "rival_2_female": { - "encounter": { - 1: `@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal ! - $@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas. @c{smile_eclosed}C’est juste que j’étais aussi dans le coin. - $@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois. - $@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès. - $@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… - $@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer ! - $@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~. - $@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là ! - $@c{smile_wave}Allez, tiens le coup !` - }, - "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. - $@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village. - $@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. - $@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre. - $@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 ? - $@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 ! - $@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup. - $@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. - $@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenu fort !` - }, - "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é. - $Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique. - $@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied. - $@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale. - $@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné. - $@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. - $@c{angry_mhalf}La défaite, c'est pour les faibles, et je ne suis plus un faible. - $@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 ? - $@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure. - $@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l'entrainement. - $@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte. - $@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre. - $Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre. - $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. - $@c{angry_mopen}Tiens-toi prêt.` - }, - "victory": { - 1: "@c{neutral}Que…@d{64} Qui es-tu ?" - - }, - "defeat": { - 1: "$@c{smile}Tu devrais être fier 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à. - $@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange. - $@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand. - $@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. - $@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir. - $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. - $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? - $@c{serious}…et c’est comme si quelque chose ici me parlait. - $Comme si c’était tout ce que ce monde avait toujours connu. - $Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir. - $@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ? - $@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es la seule à en être capable. - $@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité. - $@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 je j'avais à faire. - $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. - $@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens… - $@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange… - $@c{smile}T’as tes rêves, j’ai mes ambitions… - $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. - $@c{smile_eclosed}Je crois que mon but est de… repousser tes limites. - $@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux. - $Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide… - $Comme… si c’était tout ce que ce monde avait toujours connu. - $@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous. - $@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant… - $@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es le seul à en être capable. - $@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité. - $@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance.` - }, - "victory": { - 1: `@c{smile_ehalf}Je… Je crois que j'ai rempli ma mission… - $@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison sain et sauf. - $@c{smile_ehalf}… Merci.` - - }, - }, -}; - -// Dialogue of the endboss of the game when the player character is male (Or unset) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ? - $Tu a été appelé ici parce que t’y est déjà venu.\nUn nombre inimaginable de fois. - $Mais allons-y, faisons le décompte.\nTu en es très précisément à ton 5 643 853e cycle. - $Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi. - $Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n - $Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre. - $Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ? - $Commençons.`, - "firstStageWin": `Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups. - $Ne me déçoit pas.`, - "secondStageWin": "… Magnifique." -}; - -// Dialogue of the endboss of the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ? - $Tu a été appelée ici parce que t’y est déjà venue.\nUn nombre inimaginable de fois. - $Mais allons-y, faisons le décompte.\nTu en es très précisément à ton 5 643 853e cycle. - $Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi. - $Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n - $Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre. - $Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ? - $Commençons.`, - "firstStageWin": `Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups. - $Ne me déçoit pas.`, - "secondStageWin": "… Magnifique." -}; - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J'aurais dû le savoir.\nMais de voilà de retour. - $@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal. - $@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite. - $@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ? - $@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs. - $@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison. - $@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. - $@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. - $@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite. - $Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier ! - $@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. - $@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici. - $Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?`, -}; -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; - - -// Dialogue of the named double battles in the game. For when the player is male (or unset). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `Blue : Hé Red, montrons-leur de quel bois on se chauffe ! - $Red : … - $Blue : Voilà la puissance du Bourg Palette !`, - }, - "victory": { - 1: `Blue : C’était un magnifique combat ! - $Red : …`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `Red : … ! - $Blue : Il est pas très loquace. - $Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !`, - }, - "victory": { - 1: `Red : … ! - $Blue : La prochaine fois, on va te battre !`, - }, - }, - "tate_liza_double": { - "encounter": { - 1: `Lévy : Are you suprised? - $Tatia : We are two gym leaders at once! - $Lévy : We are twins! - $Tatia : We dont need to talk to understand each other! - $Lévy : Twice the power... - $Tatia : Can you handle it?`, - }, - "victory": { - 1: `Lévy : What? Our combination was perfect! - $Tatia : Looks like we need to train more...`, - }, - }, - "liza_tate_double": { - "encounter": { - 1: `Tatia : Hihihi... Are you suprised? - $Lévy : Yes, we are really two gym leaders at once! - $Tatia : This is my twin brother Tate! - $Lévy : And this is my twin sister Liza! - $Tatia : Don't you think we are a perfect combination?` - }, - "victory": { - 1: `Tatia : Are we... - $Lévy : ...not as strong as we thought?`, - }, - }, - "wallace_steven_double": { - "encounter": { - 1: `Pierre R. : Marc, let's show them the power of the champions! - $Marc : We will show you the power of Hoenn! - $Pierre R. : Let's go!`, - }, - "victory": { - 1: `Pierre R. : That was a great battle! - $Marc : We will win next time!`, - }, - }, - "steven_wallace_double": { - "encounter": { - 1: `Pierre R. : Do you have any rare Pokémon? - $Marc : Pierre... We are here for a battle, not to show off our pokémon. - $Pierre R. : Oh... I see... Let's go then!`, - }, - "victory": { - 1: `Pierre R. : Now that we are done with the battle, let's show off our pokémon! - $Marc : Pierre...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `Goyah : We are the strongest trainers in Unova! - $Iris : Fights against strong trainers are the best!`, - }, - "victory": { - 1: `Goyah : Wow! You are super strong! - $Iris : We will win next time!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `Iris : Welcome Challenger! I am THE Unova Champion! - $Goyah : Iris, aren't you a bit too excited?`, - }, - "victory": { - 1: `Iris : A loss like this is not easy to take... - $Goyah : But we will only get stronger with every loss!`, - }, - }, - "piers_marnie_double": { - "encounter": { - 1: `Rosemary : Frérot, montrons-leur la puissance de Smashings ! - $Peterson : Nous sommes les ténèbres !`, - }, - "victory": { - 1: `Rosemary : T’as amené la lumière dans les ténèbres ! - $Peterson : P’têtre un peu trop…`, - }, - }, - "marnie_piers_double": { - "encounter": { - 1: `Peterson : Chauds pour un concert ? - $Rosemary : Frérot… Ils sont pas là pour chanter, mais se battre…`, - }, - "victory": { - 1: `Peterson : Ça c'est du rock ! - $Rosemary : Frérot…`, - }, - }, -}; - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `Blue : Hé Red, montrons-leur de quel bois on se chauffe ! - $Red : … - $Blue : Voilà la puissance du Bourg Palette !`, - }, - "victory": { - 1: `Blue : C’était un magnifique combat ! - $Red : …`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `Red : … ! - $Blue : Il est pas très loquace. - $Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !`, - }, - "victory": { - 1: `Red : … ! - $Blue : La prochaine fois, on va te battre !`, - }, - }, - "tate_liza_double": { - "encounter": { - 1: `Lévy : Are you suprised? - $Tatia : We are two gym leaders at once! - $Lévy : We are twins! - $Tatia : We dont need to talk to understand each other! - $Lévy : Twice the power... - $Tatia : Can you handle it?`, - }, - "victory": { - 1: `Lévy : What? Our combination was perfect! - $Tatia : Looks like we need to train more...`, - }, - }, - "liza_tate_double": { - "encounter": { - 1: `Tatia : Hihihi... Are you suprised? - $Lévy : Yes, we are really two gym leaders at once! - $Tatia : This is my twin brother Tate! - $Lévy : And this is my twin sister Liza! - $Tatia : Don't you think we are a perfect combination?` - }, - "victory": { - 1: `Tatia : Are we... - $Lévy : ...not as strong as we thought?`, - }, - }, - "wallace_steven_double": { - "encounter": { - 1: `Pierre R. : Marc, let's show them the power of the champions! - $Marc : We will show you the power of Hoenn! - $Pierre R. : Let's go!`, - }, - "victory": { - 1: `Pierre R. : That was a great battle! - $Marc : We will win next time!`, - }, - }, - "steven_wallace_double": { - "encounter": { - 1: `Pierre R. : Do you have any rare Pokémon? - $Marc : Pierre... We are here for a battle, not to show off our pokémon. - $Pierre R. : Oh... I see... Let's go then!`, - }, - "victory": { - 1: `Pierre R. : Now that we are done with the battle, let's show off our pokémon! - $Marc : Pierre...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `Goyah : We are the strongest trainers in Unova! - $Iris : Fights against strong trainers are the best!`, - }, - "victory": { - 1: `Goyah : Wow! You are super strong! - $Iris : We will win next time!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `Iris : Welcome Challenger! I am THE Unova Champion! - $Goyah : Iris, aren't you a bit too excited?`, - }, - "victory": { - 1: `Iris : A loss like this is not easy to take... - $Goyah : But we will only get stronger with every loss!`, - }, - }, - "piers_marnie_double": { - "encounter": { - 1: `Rosemary : Frérot, montrons-leur la puissance de Smashings ! - $Peterson : Nous sommes les ténèbres !`, - }, - "victory": { - 1: `Rosemary : T’as amené la lumière dans les ténèbres ! - $Peterson : P’têtre un peu trop…`, - }, - }, - "marnie_piers_double": { - "encounter": { - 1: `Peterson : Chauds pour un concert ? - $Rosemary : Frérot… Ils sont pas là pour chanter, mais se battre…`, - }, - "victory": { - 1: `Peterson : Ça c'est du rock ! - $Rosemary : Frérot…`, - }, - }, -}; diff --git a/src/locales/fr/egg.ts b/src/locales/fr/egg.json similarity index 57% rename from src/locales/fr/egg.ts rename to src/locales/fr/egg.json index 96fbc4dce15..cbc912e9d50 100644 --- a/src/locales/fr/egg.ts +++ b/src/locales/fr/egg.json @@ -1,25 +1,26 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { +{ "egg": "Œuf", "greatTier": "Rare", "ultraTier": "Épique", "masterTier": "Légendaire", "defaultTier": "Commun", - "hatchWavesMessageSoon": "Il fait du bruit. Il va éclore !", + "hatchWavesMessageSoon": "Il fait du bruit.\nIl va éclore !", "hatchWavesMessageClose": "Il bouge de temps en temps. Il devrait bientôt éclore.", "hatchWavesMessageNotClose": "Qu’est-ce qui va en sortir ? Ça va mettre du temps.", - "hatchWavesMessageLongTime": "Cet Œuf va sûrement mettre du temps à éclore.", + "hatchWavesMessageLongTime": "Cet Œuf va surement mettre du temps à éclore.", "gachaTypeLegendary": "Taux de Légendaires élevé", "gachaTypeMove": "Taux de Capacité Œuf Rare élevé", "gachaTypeShiny": "Taux de Chromatiques élevé", "selectMachine": "Sélectionnez une machine.", - "notEnoughVouchers": "Vous n’avez pas assez de coupons !", - "tooManyEggs": "Vous avez trop d’Œufs !", + "notEnoughVouchers": "Vous n’avez pas assez de coupons !", + "tooManyEggs": "Vous avez trop d’Œufs !", "pull": "Tirage", "pulls": "Tirages", - "sameSpeciesEgg": "{{species}} sortira de cet Œuf !", - "hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !", + "sameSpeciesEgg": "Un {{species}} sortira de cet Œuf !", + "hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !", "eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}", "rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}", -} as const; + "moveUPGacha": "Bonus Capacité\nŒuf Rare !", + "shinyUPGacha": "Bonus\nChromatique !", + "legendaryUPGacha": "Bonus !" +} diff --git a/src/locales/fr/fight-ui-handler.json b/src/locales/fr/fight-ui-handler.json new file mode 100644 index 00000000000..e8b41661995 --- /dev/null +++ b/src/locales/fr/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "Puissance", + "accuracy": "Précision", + "abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}", + "passive": "Passif " +} \ No newline at end of file diff --git a/src/locales/fr/fight-ui-handler.ts b/src/locales/fr/fight-ui-handler.ts deleted file mode 100644 index 8bcf7732626..00000000000 --- a/src/locales/fr/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Puissance", - "accuracy": "Précision", - "abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}", - "passive": "Passif ", // The space at the end is important -} as const; diff --git a/src/locales/fr/filter-bar.json b/src/locales/fr/filter-bar.json new file mode 100644 index 00000000000..9436933ad6d --- /dev/null +++ b/src/locales/fr/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "Gen", + "typeFilter": "Type", + "caughtFilter": "Capturés", + "unlocksFilter": "Amélio.", + "miscFilter": "Divers", + "sortFilter": "Tri", + "all": "Tous", + "normal": "Normal", + "uncaught": "Non-capturé", + "passive": "Passif", + "passiveUnlocked": "Passif débloqué", + "passiveLocked": "Passif verrouillé", + "passiveUnlockable": "Passif déblocable", + "costReduction": "Cout réduit", + "costReductionUnlocked": "Cout réduit débloqué", + "costReductionLocked": "Cout réduit verrouillé", + "costReductionUnlockable": "Cout réduit déblocable", + "favorite": "Favoris", + "isFavorite": "Favoris uniquement", + "notFavorite": "Sans Favoris", + "ribbon": "Ruban", + "hasWon": "Ruban - Avec", + "hasNotWon": "Ruban - Sans", + "hiddenAbility": "Talent caché", + "hasHiddenAbility": "Talent caché - Avec", + "noHiddenAbility": "Talent caché - Sans", + "egg": "Œuf", + "eggPurchasable": "Œuf achetable", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Avec", + "noPokerus": "Pokérus - Sans", + "sortByNumber": "Par N°", + "sortByCost": "Par cout", + "sortByCandies": "Par bonbons", + "sortByIVs": "Par IV", + "sortByName": "Par nom" +} \ No newline at end of file diff --git a/src/locales/fr/game-mode.json b/src/locales/fr/game-mode.json new file mode 100644 index 00000000000..73a8d9c60f9 --- /dev/null +++ b/src/locales/fr/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "Classique", + "endless": "Infini", + "endlessSpliced": "Infini (Fusions)", + "dailyRun": "Défi du jour", + "unknown": "Inconnu", + "challenge": "Challenge" +} diff --git a/src/locales/fr/game-mode.ts b/src/locales/fr/game-mode.ts deleted file mode 100644 index ad4481b4953..00000000000 --- a/src/locales/fr/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "Classique", - "endless": "Infini", - "endlessSpliced": "Infini (Fusions)", - "dailyRun": "Défi du jour", - "unknown": "Inconnu", - "challenge": "Challenge", -} as const; diff --git a/src/locales/fr/game-stats-ui-handler.ts b/src/locales/fr/game-stats-ui-handler.json similarity index 87% rename from src/locales/fr/game-stats-ui-handler.ts rename to src/locales/fr/game-stats-ui-handler.json index 6d6bcd370d2..16221ab7e08 100644 --- a/src/locales/fr/game-stats-ui-handler.ts +++ b/src/locales/fr/game-stats-ui-handler.json @@ -1,44 +1,42 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Statistiques", - "playTime": "Temps de jeu", - "totalBattles": "Total combats", - "shinyStarters": "Starters chroma", - "starters": "Starters", - "speciesSeen": "Espèces vues", - "speciesCaught": "Espèces capt.", - "ribbonsOwned": "Rubans possédés", - "classicRuns": "Parties en Classique", - "classicWins": "Victoires en Classique", - "dailyRunAttempts": "Essais Défi du jour", - "dailyRunWins": "Victoires Défi du jour", - "endlessRuns": "Parties en Infini", - "highestWaveEndless": "Record vagues (Infini)", - "highestMoney": "Record d’argent", - "highestDamage": "Record de dégâts", - "highestHPHealed": "Record PV soignés", - "pokemonEncountered": "Pokémon rencontrés", - "pokemonDefeated": "Pokémon battus", - "pokemonCaught": "Pokémon capturés", - "eggsHatched": "Œufs éclos", - "subLegendsSeen": "Semi-légendaires vus", - "subLegendsCaught": "Semi-légendaires capt.", - "subLegendsHatched": "Semi-légendaires éclos", - "legendsSeen": "Legendaires vus", - "legendsCaught": "Légendaires capt.", - "legendsHatched": "Légendaires éclos", - "mythicalsSeen": "Fabuleux vus", - "mythicalsCaught": "Fabuleux capt.", - "mythicalsHatched": "Fabuleux éclos", - "shiniesSeen": "Chromatiques vus", - "shiniesCaught": "Chromatiques capt.", - "shiniesHatched": "Chromatiques éclos", - "pokemonFused": "Pokémon fusionnés", - "trainersDefeated": "Dresseurs battus", - "eggsPulled": "Œufs obtenus", - "rareEggsPulled": "Œufs Rares", - "epicEggsPulled": "Œufs Épiques", - "legendaryEggsPulled": "Œufs Légendaires", - "manaphyEggsPulled": "Œufs de Manaphy", -} as const; +{ + "stats": "Statistiques", + "playTime": "Temps de jeu", + "totalBattles": "Total combats", + "shinyStarters": "Starters chroma", + "starters": "Starters", + "speciesSeen": "Espèces vues", + "speciesCaught": "Espèces capt.", + "ribbonsOwned": "Rubans possédés", + "classicRuns": "Parties en Classique", + "classicWins": "Victoires en Classique", + "dailyRunAttempts": "Essais Défi du jour", + "dailyRunWins": "Victoires Défi du jour", + "endlessRuns": "Parties en Infini", + "highestWaveEndless": "Record vagues (Infini)", + "highestMoney": "Record d’argent", + "highestDamage": "Record de dégâts", + "highestHPHealed": "Record PV soignés", + "pokemonEncountered": "Pokémon rencontrés", + "pokemonDefeated": "Pokémon battus", + "pokemonCaught": "Pokémon capturés", + "eggsHatched": "Œufs éclos", + "subLegendsSeen": "Semi-légendaires vus", + "subLegendsCaught": "Semi-légendaires capt.", + "subLegendsHatched": "Semi-légendaires éclos", + "legendsSeen": "Legendaires vus", + "legendsCaught": "Légendaires capt.", + "legendsHatched": "Légendaires éclos", + "mythicalsSeen": "Fabuleux vus", + "mythicalsCaught": "Fabuleux capt.", + "mythicalsHatched": "Fabuleux éclos", + "shiniesSeen": "Chromatiques vus", + "shiniesCaught": "Chromatiques capt.", + "shiniesHatched": "Chromatiques éclos", + "pokemonFused": "Pokémon fusionnés", + "trainersDefeated": "Dresseurs battus", + "eggsPulled": "Œufs obtenus", + "rareEggsPulled": "Œufs Rares", + "epicEggsPulled": "Œufs Épiques", + "legendaryEggsPulled": "Œufs Légendaires", + "manaphyEggsPulled": "Œufs de Manaphy" +} \ No newline at end of file diff --git a/src/locales/fr/growth.ts b/src/locales/fr/growth.json similarity index 55% rename from src/locales/fr/growth.ts rename to src/locales/fr/growth.json index f44913b7d60..4688e625cf7 100644 --- a/src/locales/fr/growth.ts +++ b/src/locales/fr/growth.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { +{ "Erratic": "Erratique", "Fast": "Rapide", "Medium_Fast": "Moyenne-Rapide", "Medium_Slow": "Moyenne-Lente", "Slow": "Lente", "Fluctuating": "Fluctuante" -} as const; +} \ No newline at end of file diff --git a/src/locales/fr/menu-ui-handler.ts b/src/locales/fr/menu-ui-handler.json similarity index 66% rename from src/locales/fr/menu-ui-handler.ts rename to src/locales/fr/menu-ui-handler.json index b8446b1aa68..b8627bf91b5 100644 --- a/src/locales/fr/menu-ui-handler.ts +++ b/src/locales/fr/menu-ui-handler.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { +{ "GAME_SETTINGS": "Paramètres", "ACHIEVEMENTS": "Succès", "STATS": "Statistiques", - "VOUCHERS": "Coupons", + "RUN_HISTORY": "Historique", "EGG_LIST": "Liste des Œufs", "EGG_GACHA": "Gacha-Œufs", "MANAGE_DATA": "Mes données", @@ -18,7 +16,15 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Sélectionnez l’emplacement depuis lequel exporter les données.", "importData": "Importer données", "exportData": "Exporter données", + "importRunHistory":"Importer historique", + "exportRunHistory":"Exporter historique", + "consentPreferences": "Gérer les cookies", + "linkDiscord": "Lier à Discord", + "unlinkDiscord": "Délier Discord", + "linkGoogle": "Lier à Google", + "unlinkGoogle": "Délier Google", "cancel": "Retour", "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?", - "noEggs": "You are not hatching\nany eggs at the moment!" -} as const; + "noEggs": "Vous ne faites actuellement\néclore aucun Œuf !", + "donate": "Faire un don" +} diff --git a/src/locales/fr/menu.ts b/src/locales/fr/menu.json similarity index 67% rename from src/locales/fr/menu.ts rename to src/locales/fr/menu.json index 0402bd4bfda..277b0f5fd04 100644 --- a/src/locales/fr/menu.ts +++ b/src/locales/fr/menu.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menu: SimpleTranslationEntries = { +{ "cancel": "Annuler", "continue": "Continuer", "dailyRun": "Défi du jour (Bêta)", @@ -8,10 +6,11 @@ export const menu: SimpleTranslationEntries = { "newGame": "Nouvelle partie", "settings": "Paramètres", "selectGameMode": "Sélectionnez un mode de jeu.", - "logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer. Aucun e-mail requis !", + "logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer.\nAucun e-mail requis !", "username": "Nom d’utilisateur", "password": "Mot de passe", "login": "Connexion", + "orUse": "Ou utilisez", "register": "S’inscrire", "emptyUsername": "Le nom d’utilisateur est manquant", "invalidLoginUsername": "Le nom d’utilisateur n’est pas valide", @@ -20,34 +19,39 @@ export const menu: SimpleTranslationEntries = { "invalidRegisterPassword": "Le mot de passe doit contenir 6 caractères ou plus", "usernameAlreadyUsed": "Le nom d’utilisateur est déjà utilisé", "accountNonExistent": "Le nom d’utilisateur n’existe pas", - "unmatchingPassword": "Le mot de passe n’est pas correct", + "unmatchingPassword": "Le mot de passe est incorrect", "passwordNotMatchingConfirmPassword": "Les mots de passe ne correspondent pas", "confirmPassword": "Confirmer le MDP", - "registrationAgeWarning": "Vous confirmez en vous inscrivant que vous avez 13 ans ou plus.", + "registrationAgeWarning": "En vous inscrivant, vous certifiez que vous avez 13 ans ou plus.", "backToLogin": "Retour", "failedToLoadSaveData": "Échec du chargement des données. Veuillez recharger\nla page. Si cela persiste, contactez l’administrateur.", "sessionSuccess": "Session chargée avec succès.", "failedToLoadSession": "Vos données de session n’ont pas pu être chargées.\nElles pourraient être corrompues.", - "boyOrGirl": "Es-tu un garçon ou une fille ?", + "boyOrGirl": "Es-tu un garçon ou une fille ?", "evolving": "Quoi ?\n{{pokemonName}} évolue !", - "stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !", - "pauseEvolutionsQuestion": "Mettre en pause les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.", - "evolutionsPaused": "Les évolutions ont été mises en pause pour {{pokemonName}}.", + "stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !", + "pauseEvolutionsQuestion": "Interrompre les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.", + "evolutionsPaused": "Les évolutions de {{pokemonName}}\nsont interrompues.", "evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !", - "dailyRankings": "Classement du Jour", - "weeklyRankings": "Classement de la Semaine", - "noRankings": "Pas de Classement", + "dailyRankings": "Classement du jour", + "weeklyRankings": "Classement de la semaine", + "noRankings": "Pas de classement", "positionIcon": "#", "usernameScoreboard": "Utilisateur", "score": "Score", "wave": "Vague", "loading": "Chargement…", - "loadingAsset": "Chargement de la ressource : {{assetName}}", - "playersOnline": "Joueurs Connectés", - "yes":"Oui", - "no":"Non", + "loadingAsset": "Chargement des ressources : {{assetName}}", + "playersOnline": "Joueurs connectés", + "yes": "Oui", + "no": "Non", "disclaimer": "AVERTISSEMENT", "disclaimerDescription": "Ce jeu n’est pas un produit fini et peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait ou non encore être mis à jour ou terminé.", "choosePokemon": "Sélectionnez un Pokémon.", + "renamePokemon": "Renommer le Pokémon", + "rename": "Renommer", + "nickname": "Surnom", "errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement.", -} as const; + "noSaves": "Vous n’avez aucune sauvegarde enregistrée !", + "tooManySaves": "Vous avez trop de sauvegardes enregistrées !" +} diff --git a/src/locales/fr/modifier-select-ui-handler.json b/src/locales/fr/modifier-select-ui-handler.json new file mode 100644 index 00000000000..d1de2d222a8 --- /dev/null +++ b/src/locales/fr/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "Transférer", + "reroll": "Relancer", + "lockRarities": "Bloquer la rareté", + "checkTeam": "Consulter Équipe", + "transferDesc": "Transférer un objet tenu par un Pokémon vers un autre.", + "rerollDesc": "Payer pour relancer les objets gratuits proposés.", + "lockRaritiesDesc": "Assure la relance de proposer des objets gratuits de rareté égale ou supérieure. Affecte le cout de relance.", + "checkTeamDesc": "Consulter votre équipe ou utiliser un objet\nde changement de forme.", + "rerollCost": "{{formattedMoney}} ₽", + "itemCost": "{{formattedMoney}} ₽" +} \ No newline at end of file diff --git a/src/locales/fr/modifier-type.json b/src/locales/fr/modifier-type.json new file mode 100644 index 00000000000..78be62cd88f --- /dev/null +++ b/src/locales/fr/modifier-type.json @@ -0,0 +1,446 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{pokeballName}} x{{modifierCount}}", + "description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}" + }, + "AddVoucherModifierType": { + "name": "{{voucherTypeName}} x{{modifierCount}}", + "description": "Recevez {{modifierCount}} {{voucherTypeName}}." + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !", + "tooMany": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !" + } + }, + "PokemonHpRestoreModifierType": { + "description": "Restaure {{restorePoints}} PV ou {{restorePercent}}% des PV totaux d’un Pokémon, en fonction duquel des deux est le plus élevé.", + "extra": { + "fully": "Restaure tous les PV d’un Pokémon.", + "fullyWithStatus": "Restaure tous les PV d’un Pokémon et soigne tous ses problèmes de statut." + } + }, + "PokemonReviveModifierType": { + "description": "Ranime un Pokémon et restaure {{restorePercent}}% de ses PV." + }, + "PokemonStatusHealModifierType": { + "description": "Soigne tous les problèmes de statut d’un Pokémon." + }, + "PokemonPpRestoreModifierType": { + "description": "Restaure {{restorePoints}} PP à une capacité d’un Pokémon.", + "extra": { + "fully": "Restaure tous les PP à une capacité d’un Pokémon." + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "Restaure {{restorePoints}} PP à toutes les capacités d’un Pokémon.", + "extra": { + "fully": "Restaure tous les PP à toutes les capacités d’un Pokémon." + } + }, + "PokemonPpUpModifierType": { + "description": "Augmente le max de PP de {{upPoints}} à une capacité d’un Pokémon pour chaque 5 PP max (max : 3)." + }, + "PokemonNatureChangeModifierType": { + "name": "Aromate {{natureName}}", + "description": "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié." + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "Quadruple les chances de tomber sur un combat double pendant {{battleCount}} combats." + }, + "TempStatStageBoosterModifierType": { + "description": "Augmente {{amount}} {{stat}} de toute l’équipe pendant 5 combats.", + "extra": { + "stage": "d’un cran", + "percentage": "de 30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon." + }, + "PokemonLevelIncrementModifierType": { + "description": "Fait monter un Pokémon de {{levels}} niveau·x." + }, + "AllPokemonLevelIncrementModifierType": { + "description": "Fait monter toute l’équipe de {{levels}} niveau·x." + }, + "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." + }, + "AllPokemonFullReviveModifierType": { + "description": "Ranime et restaure tous les PV de tous les Pokémon K.O. ." + }, + "MoneyRewardModifierType": { + "description": "Octroie une {{moneyMultiplier}} somme d’argent.\n({{moneyAmount}} ₽)", + "extra": { + "small": "petite", + "moderate": "moyenne", + "large": "grande" + } + }, + "ExpBoosterModifierType": { + "description": "Augmente de {{boostPercent}}% le gain de Points d’Exp." + }, + "PokemonExpBoosterModifierType": { + "description": "Augmente de {{boostPercent}}% le gain de Points d’Exp du porteur." + }, + "PokemonFriendshipBoosterModifierType": { + "description": "Augmente le gain de bonheur de 50% par victoire." + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100)." + }, + "PokemonMultiHitModifierType": { + "description": "Frappe une fois de plus en échange d’une baisse de puissance de respectivement 60/75/82,5% par cumul." + }, + "TmModifierType": { + "name": "CT{{moveId}} - {{moveName}}", + "description": "Apprend la capacité {{moveName}} à un Pokémon." + }, + "TmModifierTypeWithInfo": { + "name": "CT{{moveId}} - {{moveName}}", + "description": "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus d’infos)" + }, + "EvolutionItemModifierType": { + "description": "Permet à certains Pokémon d’évoluer à son contact." + }, + "FormChangeItemModifierType": { + "description": "Permet à certains Pokémon de changer de forme à son contact." + }, + "FusePokemonModifierType": { + "description": "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage les capacités)." + }, + "TerastallizeModifierType": { + "name": "Téra-Éclat {{teraType}}", + "description": "Téracristallise son porteur en type {{teraType}} pendant 10 combats." + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "{{chancePercent}}% de chances de voler un objet de l’adversaire en l’attaquant." + }, + "TurnHeldItemTransferModifierType": { + "description": "À chaque tour, son porteur obtient un objet de son adversaire." + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "Ajoute {{chancePercent}}% de chances d’infliger le statut {{statusEffect}} avec des capacités offensives." + }, + "EnemyEndureChanceModifierType": { + "description": "Ajoute {{chancePercent}}% de chances d’encaisser un coup." + }, + + "RARE_CANDY": { "name": "Super Bonbon" }, + "RARER_CANDY": { "name": "Hyper Bonbon" }, + + "MEGA_BRACELET": { "name": "Méga-Bracelet", "description": "Débloque les Méga-Gemmes dans la boutique." }, + "DYNAMAX_BAND": { "name": "Poignet Dynamax", "description": "Débloque le Dynamax." }, + "TERA_ORB": { "name": "Orbe Téracristal", "description": "Débloque les Téra-Éclats dans la boutique." }, + + "MAP": { "name": "Carte", "description": "Vous permet de choisir votre destination à un croisement." }, + + "POTION": { "name": "Potion" }, + "SUPER_POTION": { "name": "Super Potion" }, + "HYPER_POTION": { "name": "Hyper Potion" }, + "MAX_POTION": { "name": "Potion Max" }, + "FULL_RESTORE": { "name": "Guérison" }, + + "REVIVE": { "name": "Rappel" }, + "MAX_REVIVE": { "name": "Rappel Max" }, + + "FULL_HEAL": { "name": "Total Soin" }, + + "SACRED_ASH": { "name": "Cendre Sacrée" }, + + "REVIVER_SEED": { "name": "Résugraine", "description": "Ranime et restaure la moitié des PV de son porteur s’il est mis K.O. par une capacité directe." }, + + "WHITE_HERB": { "name": "Herbe Blanche", "description": "Restaure toute stat ayant subi une baisse en combat." }, + + "ETHER": { "name": "Huile" }, + "MAX_ETHER": { "name": "Huile Max" }, + + "ELIXIR": { "name": "Élixir" }, + "MAX_ELIXIR": { "name": "Élixir Max" }, + + "PP_UP": { "name": "PP Plus" }, + "PP_MAX": { "name": "PP Max" }, + + "LURE": { "name": "Parfum" }, + "SUPER_LURE": { "name": "Super Parfum" }, + "MAX_LURE": { "name": "Parfum Max" }, + + "MEMORY_MUSHROOM": { "name": "Champi Mémoriel", "description": "Remémore une capacité à un Pokémon." }, + + "EXP_SHARE": { "name": "Multi Exp", "description": "Tous les non-participants reçoivent 20% des Points d’Exp d’un participant." }, + "EXP_BALANCE": { "name": "Équilibr’Exp", "description": "Équilibre les Points d’Exp à l’avantage des membres de l’équipe aux plus bas niveaux." }, + + "OVAL_CHARM": { "name": "Charme Ovale", "description": "Quand plusieurs Pokémon sont en combat, chacun gagne 10% supplémentaires du total d’Exp." }, + + "EXP_CHARM": { "name": "Charme Exp" }, + "SUPER_EXP_CHARM": { "name": "Super Charme Exp" }, + "GOLDEN_EXP_CHARM": { "name": "Charme Exp Doré" }, + + "LUCKY_EGG": { "name": "Œuf Chance" }, + "GOLDEN_EGG": { "name": "Œuf d’Or" }, + + "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." }, + + "SOUL_DEW": { "name": "Rosée Âme", "description": "Augmente de 10% l’influence de la nature d’un Pokémon sur ses statistiques. Effet cumulatif." }, + + "NUGGET": { "name": "Pépite" }, + "BIG_NUGGET": { "name": "Maxi Pépite" }, + "RELIC_GOLD": { "name": "Vieux Ducat" }, + + "AMULET_COIN": { "name": "Pièce Rune", "description": "Augmente de 20% les gains d’argent." }, + "GOLDEN_PUNCH": { "name": "Poing Doré", "description": "La moitié des dégâts infligés sont convertis en argent." }, + "COIN_CASE": { "name": "Boite Jetons", "description": "Tous les 10 combats, recevez 10% de votre argent en intérêts." }, + + "LOCK_CAPSULE": { "name": "Poké Écrin", "description": "Permet de conserver la rareté des objets si vous relancez les objets proposés." }, + + "GRIP_CLAW": { "name": "Accro Griffe" }, + "WIDE_LENS": { "name": "Loupe" }, + + "MULTI_LENS": { "name": "Lentille Multi" }, + + "HEALING_CHARM": { "name": "Charme Soin", "description": "Augmente de 10% l’efficacité des capacités et objets de soin de PV (hors Rappels)." }, + "CANDY_JAR": { "name": "Bonbonnière", "description": "Augmente de 1 le nombre de niveaux gagnés à l’utilisation d’un Super Bonbon ou d’un Hyper Bonbon." }, + + "BERRY_POUCH": { "name": "Sac à Baies", "description": "Ajoute 30% de chances qu’une Baie utilisée ne soit pas consommée." }, + + "FOCUS_BAND": { "name": "Bandeau", "description": "Ajoute 10% de chances de survivre avec 1 PV si les dégâts reçus pouvaient mettre K.O. ." }, + + "QUICK_CLAW": { "name": "Vive Griffe", "description": "Ajoute 10% de chances d’agir en premier, indépendamment de la Vitesse (après la priorité)." }, + + "KINGS_ROCK": { "name": "Roche Royale", "description": "Ajoute 10% de chances qu’une capacité offensive apeure l’adversaire." }, + + "LEFTOVERS": { "name": "Restes", "description": "Soigne à chaque tour 1/16 des PV max d’un Pokémon." }, + "SHELL_BELL": { "name": "Grelot Coque", "description": "Soigne son porteur avec 1/8 des dégâts qu’il inflige à un Pokémon." }, + + "TOXIC_ORB": { "name": "Orbe Toxique", "description": "Empoisonne gravement son porteur à la fin du tour s’il n’a pas déjà de problème de statut." }, + "FLAME_ORB": { "name": "Orbe Flamme", "description": "Brule son porteur à la fin du tour s’il n’a pas déjà de problème de statut." }, + + "BATON": { "name": "Bâton", "description": "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." }, + + "SHINY_CHARM": { "name": "Charme Chroma", "description": "Augmente énormément les chances de rencontrer un Pokémon sauvage chromatique." }, + "ABILITY_CHARM": { "name": "Charme Talent", "description": "Augmente énormément les chances de rencontrer un Pokémon sauvage avec un talent caché." }, + + "IV_SCANNER": { "name": "Scanner d’IV", "description": "Révèle la qualité de deux IV d’un Pokémon sauvage par scanner possédé. Les meilleurs IV sont révélés en priorité." }, + + "DNA_SPLICERS": { "name": "Pointeau ADN" }, + + "MINI_BLACK_HOLE": { "name": "Mini Trou Noir" }, + + "GOLDEN_POKEBALL": { "name": "Poké Ball Dorée", "description": "Ajoute un choix d’objet à la fin de chaque combat" }, + + "ENEMY_DAMAGE_BOOSTER": { "name": "Jeton Dégâts", "description": "Augmente les dégâts de 5%." }, + "ENEMY_DAMAGE_REDUCTION": { "name": "Jeton Protection", "description": "Diminue les dégâts reçus de 2,5%." }, + "ENEMY_HEAL": { "name": "Jeton Soin", "description": "Soigne 2% des PV max à chaque tour." }, + "ENEMY_ATTACK_POISON_CHANCE": { "name": "Jeton Poison" }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { "name": "Jeton Paralysie" }, + "ENEMY_ATTACK_BURN_CHANCE": { "name": "Jeton Brulure" }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Jeton Total Soin", "description": "Ajoute 2,5% de chances à chaque tour de se soigner d’un problème de statut." }, + "ENEMY_ENDURE_CHANCE": { "name": "Jeton Ténacité" }, + "ENEMY_FUSED_CHANCE": { "name": "Jeton Fusion", "description": "Ajoute 1% de chances qu’un Pokémon sauvage soit une fusion." } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { "name": "Balle Lumière", "description": "À faire tenir à Pikachu. Un orbe énigmatique qui double son Attaque et son Atq. Spé. ." }, + "THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou à Ossatueur, formes d’Alola incluses. Un os dur qui double leur Attaque." }, + "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." } + }, + "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 +" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "Mouchoir Soie", + "black_belt": "Ceinture Noire", + "sharp_beak": "Bec Pointu", + "poison_barb": "Pic Venin", + "soft_sand": "Sable Doux", + "hard_stone": "Pierre Dure", + "silver_powder": "Poudre Argentée", + "spell_tag": "Rune Sort", + "metal_coat": "Peau Métal", + "charcoal": "Charbon", + "mystic_water": "Eau Mystique", + "miracle_seed": "Graine Miracle", + "magnet": "Aimant", + "twisted_spoon": "Cuillère Tordue", + "never_melt_ice": "Glace Éternelle", + "dragon_fang": "Croc Dragon", + "black_glasses": "Lunettes Noires", + "fairy_feather": "Plume Enchantée" + }, + "BaseStatBoosterItem": { + "hp_up": "PV Plus", + "protein": "Protéine", + "iron": "Fer", + "calcium": "Calcium", + "zinc": "Zinc", + "carbos": "Carbone" + }, + "EvolutionItem": { + "NONE": "Aucun", + + "LINKING_CORD": "Fil de Liaison", + "SUN_STONE": "Pierre Soleil", + "MOON_STONE": "Pierre Lune", + "LEAF_STONE": "Pierre Plante", + "FIRE_STONE": "Pierre Feu", + "WATER_STONE": "Pierre Eau", + "THUNDER_STONE": "Pierre Foudre", + "ICE_STONE": "Pierre Glace", + "DUSK_STONE": "Pierre Nuit", + "DAWN_STONE": "Pierre Aube", + "SHINY_STONE": "Pierre Éclat", + "CRACKED_POT": "Théière Fêlée", + "SWEET_APPLE": "Pomme Sucrée", + "TART_APPLE": "Pomme Acidulée", + "STRAWBERRY_SWEET": "Fraise en Sucre", + "UNREMARKABLE_TEACUP": "Bol Médiocre", + + "CHIPPED_POT": "Théière Ébréchée", + "BLACK_AUGURITE": "Obsidienne", + "GALARICA_CUFF": "Bracelet Galanoa", + "GALARICA_WREATH": "Couronne Galanoa", + "PEAT_BLOCK": "Bloc de Tourbe", + "AUSPICIOUS_ARMOR": "Armure de la Fortune", + "MALICIOUS_ARMOR": "Armure de la Rancune", + "MASTERPIECE_TEACUP": "Bol Exceptionnel", + "METAL_ALLOY": "Métal Composite", + "SCROLL_OF_DARKNESS": "Rouleau des Ténèbres", + "SCROLL_OF_WATERS": "Rouleau de l’Eau", + "SYRUPY_APPLE": "Pomme Nectar" + }, + "FormChangeItem": { + "NONE": "Aucun", + + "ABOMASITE": "Blizzarite", + "ABSOLITE": "Absolite", + "AERODACTYLITE": "Ptéraïte", + "AGGRONITE": "Galekingite", + "ALAKAZITE": "Alakazamite", + "ALTARIANITE": "Altarite", + "AMPHAROSITE": "Pharampite", + "AUDINITE": "Nanméouïte", + "BANETTITE": "Branettite", + "BEEDRILLITE": "Dardargnite", + "BLASTOISINITE": "Tortankite", + "BLAZIKENITE": "Braségalite", + "CAMERUPTITE": "Caméruptite", + "CHARIZARDITE_X": "Dracaufite X", + "CHARIZARDITE_Y": "Dracaufite Y", + "DIANCITE": "Diancite", + "GALLADITE": "Gallamite", + "GARCHOMPITE": "Carchacrokite", + "GARDEVOIRITE": "Gardevoirite", + "GENGARITE": "Ectoplasmite", + "GLALITITE": "Oniglalite", + "GYARADOSITE": "Léviatorite", + "HERACRONITE": "Scarhinoïte", + "HOUNDOOMINITE": "Démolossite", + "KANGASKHANITE": "Kangourexite", + "LATIASITE": "Latiasite", + "LATIOSITE": "Latiosite", + "LOPUNNITE": "Lockpinite", + "LUCARIONITE": "Lucarite", + "MANECTITE": "Élecsprintite", + "MAWILITE": "Mysdibulite", + "MEDICHAMITE": "Charminite", + "METAGROSSITE": "Métalossite", + "MEWTWONITE_X": "Mewtwoïte X", + "MEWTWONITE_Y": "Mewtwoïte Y", + "PIDGEOTITE": "Roucarnagite", + "PINSIRITE": "Scarabruite", + "RAYQUAZITE": "Rayquazite", + "SABLENITE": "Ténéfixite", + "SALAMENCITE": "Drattakite", + "SCEPTILITE": "Jungkite", + "SCIZORITE": "Cizayoxite", + "SHARPEDONITE": "Sharpedite", + "SLOWBRONITE": "Flagadossite", + "STEELIXITE": "Steelixite", + "SWAMPERTITE": "Laggronite", + "TYRANITARITE": "Tyranocivite", + "VENUSAURITE": "Florizarrite", + + "BLUE_ORB": "Gemme Bleue", + "RED_ORB": "Gemme Rouge", + "SHARP_METEORITE": "Méteorite Aiguisée", + "HARD_METEORITE": "Méteorite Solide", + "SMOOTH_METEORITE": "Méteorite Lisse", + "ADAMANT_CRYSTAL": "Globe Adamant", + "LUSTROUS_GLOBE": "Globe Perlé", + "GRISEOUS_CORE": "Globe Platiné", + "REVEAL_GLASS": "Miroir Sacré", + "GRACIDEA": "Gracidée", + "MAX_MUSHROOMS": "Maxi Champis", + "DARK_STONE": "Galet Noir", + "LIGHT_STONE": "Galet Blanc", + "PRISON_BOTTLE": "Vase Scellé", + "N_LUNARIZER": "Necroluna", + "N_SOLARIZER": "Necrosol", + "RUSTED_SWORD": "Épée Rouillée", + "RUSTED_SHIELD": "Bouclier Rouillé", + "ICY_REINS_OF_UNITY": "Rênes de l’Unité du Froid", + "SHADOW_REINS_OF_UNITY": "Rênes de l’Unité d’Effroi", + "WELLSPRING_MASK": "Masque du Puits", + "HEARTHFLAME_MASK": "Masque du Fourneau", + "CORNERSTONE_MASK": "Masque de la Pierre", + "SHOCK_DRIVE": "Module Choc", + "BURN_DRIVE": "Module Pyro", + "CHILL_DRIVE": "Module Cryo", + "DOUSE_DRIVE": "Module Aqua", + "ULTRANECROZIUM_Z": "Ultranécrozélite", + + "FIST_PLATE": "Plaque Poing", + "SKY_PLATE": "Plaque Ciel", + "TOXIC_PLATE": "Plaque Toxicité", + "EARTH_PLATE": "Plaque Terre", + "STONE_PLATE": "Plaque Roc", + "INSECT_PLATE": "Plaque Insecte", + "SPOOKY_PLATE": "Plaque Fantôme", + "IRON_PLATE": "Plaque Fer", + "FLAME_PLATE": "Plaque Flamme", + "SPLASH_PLATE": "Plaque Hydro", + "MEADOW_PLATE": "Plaque Herbe", + "ZAP_PLATE": "Plaque Volt", + "MIND_PLATE": "Plaque Esprit", + "ICICLE_PLATE": "Plaque Glace", + "DRACO_PLATE": "Plaque Draco", + "DREAD_PLATE": "Plaque Ombre", + "PIXIE_PLATE": "Plaque Pixie", + "BLANK_PLATE": "Plaque Renouveau", + "LEGEND_PLATE": "Plaque Légende", + "FIGHTING_MEMORY": "ROM Combat", + "FLYING_MEMORY": "ROM Vol", + "POISON_MEMORY": "ROM Poison", + "GROUND_MEMORY": "ROM Sol", + "ROCK_MEMORY": "ROM Roche", + "BUG_MEMORY": "ROM Insecte", + "GHOST_MEMORY": "ROM Spectre", + "STEEL_MEMORY": "ROM Acier", + "FIRE_MEMORY": "ROM Feu", + "WATER_MEMORY": "ROM Eau", + "GRASS_MEMORY": "ROM Plante", + "ELECTRIC_MEMORY": "ROM Électrik", + "PSYCHIC_MEMORY": "ROM Psy", + "ICE_MEMORY": "ROM Glace", + "DRAGON_MEMORY": "ROM Dragon", + "DARK_MEMORY": "ROM Ténèbres", + "FAIRY_MEMORY": "ROM Fée", + "NORMAL_MEMORY": "ROM Normal" + } +} diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts deleted file mode 100644 index 0423751e937..00000000000 --- a/src/locales/fr/modifier-type.ts +++ /dev/null @@ -1,451 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - "AddPokeballModifierType": { - name: "{{pokeballName}} x{{modifierCount}}", - description: "Recevez {{modifierCount}} {{pokeballName}}·s (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}.", - }, - "AddVoucherModifierType": { - name: "{{voucherTypeName}} x{{modifierCount}}", - description: "Recevez {{modifierCount}} {{voucherTypeName}}.", - }, - "PokemonHeldItemModifierType": { - extra: { - "inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !", - "tooMany": "{{pokemonName}} possède trop\nd’exemplaires de cet objet !", - } - }, - "PokemonHpRestoreModifierType": { - description: "Restaure {{restorePoints}} PV ou {{restorePercent}}% des PV totaux d’un Pokémon, en fonction duquel des deux est le plus élevé.", - extra: { - "fully": "Restaure tous les PV d’un Pokémon.", - "fullyWithStatus": "Restaure tous les PV d’un Pokémon et soigne tous ses problèmes de statut.", - } - }, - "PokemonReviveModifierType": { - description: "Réanime un Pokémon et restaure {{restorePercent}}% de ses PV.", - }, - "PokemonStatusHealModifierType": { - description: "Soigne tous les problèmes de statut d’un Pokémon.", - }, - "PokemonPpRestoreModifierType": { - description: "Restaure {{restorePoints}} PP à une capacité d’un Pokémon.", - extra: { - "fully": "Restaure tous les PP à une capacité d’un Pokémon.", - } - }, - "PokemonAllMovePpRestoreModifierType": { - description: "Restaure {{restorePoints}} PP à toutes les capacités d’un Pokémon.", - extra: { - "fully": "Restaure tous les PP à toutes les capacités d’un Pokémon.", - } - }, - "PokemonPpUpModifierType": { - description: "Augmente le max de PP de {{upPoints}} à une capacité d’un Pokémon pour chaque 5 PP max (max : 3).", - }, - "PokemonNatureChangeModifierType": { - name: "Aromate {{natureName}}", - description: "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié.", - }, - "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.", - }, - "AttackTypeBoosterModifierType": { - description: "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon.", - }, - "PokemonLevelIncrementModifierType": { - description: "Fait monter un Pokémon d’un niveau.", - }, - "AllPokemonLevelIncrementModifierType": { - description: "Fait monter toute l’équipe d’un niveau.", - }, - "PokemonBaseStatBoosterModifierType": { - description: "Augmente de 10% {{statName}} 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.", - }, - "AllPokemonFullReviveModifierType": { - description: "Réanime et restaure tous les PV de tous les Pokémon K.O.", - }, - "MoneyRewardModifierType": { - description: "Octroie une {{moneyMultiplier}} somme d’argent.\n({{moneyAmount}} ₽)", - extra: { - "small": "petite", - "moderate": "moyenne", - "large": "grande", - }, - }, - "ExpBoosterModifierType": { - description: "Augmente de {{boostPercent}}% le gain de Points d’Exp.", - }, - "PokemonExpBoosterModifierType": { - description: "Augmente de {{boostPercent}}% le gain de Points d’Exp du porteur.", - }, - "PokemonFriendshipBoosterModifierType": { - description: "Augmente le gain d’amitié de 50% par victoire.", - }, - "PokemonMoveAccuracyBoosterModifierType": { - description: "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100).", - }, - "PokemonMultiHitModifierType": { - description: "Frappe une fois de plus en échange d’une baisse de puissance de respectivement 60/75/82,5% par cumul.", - }, - "TmModifierType": { - name: "CT{{moveId}} - {{moveName}}", - description: "Apprend la capacité {{moveName}} à un Pokémon.", - }, - "TmModifierTypeWithInfo": { - name: "CT{{moveId}} - {{moveName}}", - description: "Apprend la capacité {{moveName}} à un Pokémon\n(Maintenez C ou Maj pour plus d’infos).", - }, - "EvolutionItemModifierType": { - description: "Permet à certains Pokémon d’évoluer.", - }, - "FormChangeItemModifierType": { - description: "Permet à certains Pokémon de changer de forme.", - }, - "FusePokemonModifierType": { - description: "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage le movepool).", - }, - "TerastallizeModifierType": { - name: "Téra-Éclat {{teraType}}", - description: "{{teraType}} Téracristallise son porteur pendant 10 combats.", - }, - "ContactHeldItemTransferChanceModifierType": { - description: "{{chancePercent}}% de chances de voler un objet de l’adversaire en l’attaquant.", - }, - "TurnHeldItemTransferModifierType": { - description: "À chaque tour, son porteur obtient un objet de son adversaire.", - }, - "EnemyAttackStatusEffectChanceModifierType": { - description: "Ajoute {{chancePercent}}% de chances d’infliger le statut {{statusEffect}} avec des capacités offensives.", - }, - "EnemyEndureChanceModifierType": { - description: "Ajoute {{chancePercent}}% de chances d’encaisser un coup.", - }, - - "RARE_CANDY": { name: "Super Bonbon" }, - "RARER_CANDY": { name: "Hyper Bonbon" }, - - "MEGA_BRACELET": { name: "Méga-Bracelet", description: "Débloque les Méga-Gemmes." }, - "DYNAMAX_BAND": { name: "Poignet Dynamax", description: "Débloque le Dynamax." }, - "TERA_ORB": { name: "Orbe Téracristal", description: "Débloque les Téra-Éclats." }, - - "MAP": { name: "Carte", description: "Vous permet de choisir votre destination à un croisement." }, - - "POTION": { name: "Potion" }, - "SUPER_POTION": { name: "Super Potion" }, - "HYPER_POTION": { name: "Hyper Potion" }, - "MAX_POTION": { name: "Potion Max" }, - "FULL_RESTORE": { name: "Guérison" }, - - "REVIVE": { name: "Rappel" }, - "MAX_REVIVE": { name: "Rappel Max" }, - - "FULL_HEAL": { name: "Total Soin" }, - - "SACRED_ASH": { name: "Cendre Sacrée" }, - - "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il tombe K.O. ." }, - - "ETHER": { name: "Huile" }, - "MAX_ETHER": { name: "Huile Max" }, - - "ELIXIR": { name: "Élixir" }, - "MAX_ELIXIR": { name: "Élixir Max" }, - - "PP_UP": { name: "PP Plus" }, - "PP_MAX": { name: "PP Max" }, - - "LURE": { name: "Parfum" }, - "SUPER_LURE": { name: "Super Parfum" }, - "MAX_LURE": { name: "Parfum Max" }, - - "MEMORY_MUSHROOM": { name: "Champi Mémoriel", description: "Remémore une capacité à un Pokémon." }, - - "EXP_SHARE": { name: "Multi Exp", description: "Tous les non-participants reçoivent 20% des Points d’Exp d’un participant." }, - "EXP_BALANCE": { name: "Équilibr’Exp", description: "Équilibre les Points d’Exp à l’avantage des membres de l’équipe aux plus bas niveaux." }, - - "OVAL_CHARM": { name: "Charme Ovale", description: "Quand plusieurs Pokémon sont en combat, chacun gagne 10% supplémentaires du total d’Exp." }, - - "EXP_CHARM": { name: "Charme Exp" }, - "SUPER_EXP_CHARM": { name: "Super Charme Exp" }, - "GOLDEN_EXP_CHARM": { name: "Charme Exp Doré" }, - - "LUCKY_EGG": { name: "Œuf Chance" }, - "GOLDEN_EGG": { name: "Œuf d’Or" }, - - "SOOTHE_BELL": { name: "Grelot Zen" }, - - "EVIOLITE": { name: "Évoluroc", description: "Un étrange concentré d’évolution qui augmente la Défense et la Défense Spéciale d’un Pokémon pouvant évoluer." }, - - "SOUL_DEW": { name: "Rosée Âme", description: "Augmente de 10% l’influence de la nature d’un Pokémon sur ses statistiques (cumulatif)." }, - - "NUGGET": { name: "Pépite" }, - "BIG_NUGGET": { name: "Maxi Pépite" }, - "RELIC_GOLD": { name: "Vieux Ducat" }, - - "AMULET_COIN": { name: "Pièce Rune", description: "Augmente de 20% les gains d’argent." }, - "GOLDEN_PUNCH": { name: "Poing Doré", description: "50% des dégâts infligés sont convertis en argent." }, - "COIN_CASE": { name: "Boite Jetons", description: "Tous les 10 combats, recevez 10% de votre argent en intérêts." }, - - "LOCK_CAPSULE": { name: "Poké Écrin", description: "Permet de verrouiller des objets rares si vous relancez les objets proposés." }, - - "GRIP_CLAW": { name: "Accro Griffe" }, - "WIDE_LENS": { name: "Loupe" }, - - "MULTI_LENS": { name: "Lentille Multi" }, - - "HEALING_CHARM": { name: "Charme Soin", description: "Augmente de 10% l’efficacité des capacités et objets de soin de PV (hors Rappels)." }, - "CANDY_JAR": { name: "Bonbonnière", description: "Augmente de 1 le nombre de niveaux gagnés à l’utilisation d’un Super Bonbon." }, - - "BERRY_POUCH": { name: "Sac à Baies", description: "Ajoute 30% de chances qu’une Baie utilisée ne soit pas consommée." }, - - "FOCUS_BAND": { name: "Bandeau", description: "Ajoute 10% de chances de survivre avec 1 PV si les dégâts reçus pouvaient mettre K.O." }, - - "QUICK_CLAW": { name: "Vive Griffe", description: "Ajoute 10% de chances d’agir en premier, indépendamment de la vitesse (après la priorité)." }, - - "KINGS_ROCK": { name: "Roche Royale", description: "Ajoute 10% de chances qu’une capacité offensive apeure l’adversaire." }, - - "LEFTOVERS": { name: "Restes", description: "Soigne à chaque tour 1/16 des PV max d’un Pokémon." }, - "SHELL_BELL": { name: "Grelot Coque", description: "Soigne son porteur avec 1/8 des dégâts qu’il inflige à un Pokémon." }, - - "TOXIC_ORB": { name: "Orbe Toxique", description: "Un orbe bizarre qui empoisonne gravement son porteur durant le combat." }, - "FLAME_ORB": { name: "Orbe Flamme", description: "Un orbe bizarre qui brule son porteur durant le combat." }, - - "BATON": { name: "Bâton", description: "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." }, - - "SHINY_CHARM": { name: "Charme Chroma", description: "Augmente énormément les chances de rencontrer un Pokémon sauvage chromatique." }, - "ABILITY_CHARM": { name: "Charme Talent", description: "Augmente énormément les chances de rencontrer un Pokémon sauvage avec un Talent Caché." }, - - "IV_SCANNER": { name: "Scanner d’IV", description: "Révèle la qualité de deux IV d’un Pokémon sauvage par scanner possédé. Les meilleurs IV sont révélés en priorité." }, - - "DNA_SPLICERS": { name: "Pointeau ADN" }, - - "MINI_BLACK_HOLE": { name: "Mini Trou Noir" }, - - "GOLDEN_POKEBALL": { name: "Poké Ball Dorée", description: "Ajoute un choix d’objet à la fin de chaque combat" }, - - "ENEMY_DAMAGE_BOOSTER": { name: "Jeton Dégâts", description: "Augmente les dégâts de 5%." }, - "ENEMY_DAMAGE_REDUCTION": { name: "Jeton Protection", description: "Diminue les dégâts reçus de 2,5%." }, - "ENEMY_HEAL": { name: "Jeton Soin", description: "Soigne 2% des PV max à chaque tour." }, - "ENEMY_ATTACK_POISON_CHANCE": { name: "Jeton Poison" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Jeton Paralysie" }, - "ENEMY_ATTACK_BURN_CHANCE": { name: "Jeton Brulure" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Jeton Total Soin", description: "Ajoute 2.5% de chances à chaque tour de se soigner d’un problème de statut." }, - "ENEMY_ENDURE_CHANCE": { name: "Jeton Ténacité" }, - "ENEMY_FUSED_CHANCE": { name: "Jeton Fusion", description: "Ajoute 1% de chances qu’un Pokémon sauvage soit une fusion." }, - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "Balle Lumière", description: "Objet à faire tenir à Pikachu. Un orbe énigmatique qui augmente son Attaque et son Attaque Spéciale." }, - "THICK_CLUB": { name: "Masse Os", description: "Objet à faire tenir à Osselait ou Ossatueur. Un os dur qui augmente leur Attaque." }, - "METAL_POWDER": { name: "Poudre Métal", description: "Objet à faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, augmente sa Défense." }, - "QUICK_POWDER": { name: "Poudre Vite", description: "Objet à faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, augmente sa Vitesse." } - }, - TempBattleStatBoosterItem: { - "x_attack": "Attaque +", - "x_defense": "Défense +", - "x_sp_atk": "Atq. Spé. +", - "x_sp_def": "Déf. Spé. +", - "x_speed": "Vitesse +", - "x_accuracy": "Précision +", - "dire_hit": "Muscle +", - }, - - TempBattleStatBoosterStatName: { - "ATK": "Attaque", - "DEF": "Défense", - "SPATK": "Atq. Spé.", - "SPDEF": "Déf. Spé.", - "SPD": "Vitesse", - "ACC": "Précision", - "CRIT": "Taux de critique", - "EVA": "Esquive", - "DEFAULT": "???", - }, - - AttackTypeBoosterItem: { - "silk_scarf": "Mouchoir Soie", - "black_belt": "Ceinture Noire", - "sharp_beak": "Bec Pointu", - "poison_barb": "Pic Venin", - "soft_sand": "Sable Doux", - "hard_stone": "Pierre Dure", - "silver_powder": "Poudre Argentée", - "spell_tag": "Rune Sort", - "metal_coat": "Peau Métal", - "charcoal": "Charbon", - "mystic_water": "Eau Mystique", - "miracle_seed": "Graine Miracle", - "magnet": "Aimant", - "twisted_spoon": "Cuillère Tordue", - "never_melt_ice": "Glace Éternelle", - "dragon_fang": "Croc Dragon", - "black_glasses": "Lunettes Noires", - "fairy_feather": "Plume Enchantée", - }, - BaseStatBoosterItem: { - "hp_up": "PV Plus", - "protein": "Protéine", - "iron": "Fer", - "calcium": "Calcium", - "zinc": "Zinc", - "carbos": "Carbone", - }, - EvolutionItem: { - "NONE": "Aucun", - - "LINKING_CORD": "Fil de Liaison", - "SUN_STONE": "Pierre Soleil", - "MOON_STONE": "Pierre Lune", - "LEAF_STONE": "Pierre Plante", - "FIRE_STONE": "Pierre Feu", - "WATER_STONE": "Pierre Eau", - "THUNDER_STONE": "Pierre Foudre", - "ICE_STONE": "Pierre Glace", - "DUSK_STONE": "Pierre Nuit", - "DAWN_STONE": "Pierre Aube", - "SHINY_STONE": "Pierre Éclat", - "CRACKED_POT": "Théière Fêlée", - "SWEET_APPLE": "Pomme Sucrée", - "TART_APPLE": "Pomme Acidulée", - "STRAWBERRY_SWEET": "Fraise en Sucre", - "UNREMARKABLE_TEACUP": "Bol Médiocre", - - "CHIPPED_POT": "Théière Ébréchée", - "BLACK_AUGURITE": "Obsidienne", - "GALARICA_CUFF": "Bracelet Galanoa", - "GALARICA_WREATH": "Couronne Galanoa", - "PEAT_BLOCK": "Bloc de Tourbe", - "AUSPICIOUS_ARMOR": "Armure de la Fortune", - "MALICIOUS_ARMOR": "Armure de la Rancune", - "MASTERPIECE_TEACUP": "Bol Exceptionnel", - "METAL_ALLOY": "Métal Composite", - "SCROLL_OF_DARKNESS": "Rouleau des Ténèbres", - "SCROLL_OF_WATERS": "Rouleau de l’Eau", - "SYRUPY_APPLE": "Pomme Nectar", - }, - FormChangeItem: { - "NONE": "Aucun", - - "ABOMASITE": "Blizzarite", - "ABSOLITE": "Absolite", - "AERODACTYLITE": "Ptéraïte", - "AGGRONITE": "Galekingite", - "ALAKAZITE": "Alakazamite", - "ALTARIANITE": "Altarite", - "AMPHAROSITE": "Pharampite", - "AUDINITE": "Nanméouïte", - "BANETTITE": "Branettite", - "BEEDRILLITE": "Dardargnite", - "BLASTOISINITE": "Tortankite", - "BLAZIKENITE": "Braségalite", - "CAMERUPTITE": "Caméruptite", - "CHARIZARDITE_X": "Dracaufite X", - "CHARIZARDITE_Y": "Dracaufite Y", - "DIANCITE": "Diancite", - "GALLADITE": "Gallamite", - "GARCHOMPITE": "Carchacrokite", - "GARDEVOIRITE": "Gardevoirite", - "GENGARITE": "Ectoplasmite", - "GLALITITE": "Oniglalite", - "GYARADOSITE": "Léviatorite", - "HERACRONITE": "Scarhinoïte", - "HOUNDOOMINITE": "Démolossite", - "KANGASKHANITE": "Kangourexite", - "LATIASITE": "Latiasite", - "LATIOSITE": "Latiosite", - "LOPUNNITE": "Lockpinite", - "LUCARIONITE": "Lucarite", - "MANECTITE": "Élecsprintite", - "MAWILITE": "Mysdibulite", - "MEDICHAMITE": "Charminite", - "METAGROSSITE": "Métalossite", - "MEWTWONITE_X": "Mewtwoïte X", - "MEWTWONITE_Y": "Mewtwoïte Y", - "PIDGEOTITE": "Roucarnagite", - "PINSIRITE": "Scarabruite", - "RAYQUAZITE": "Rayquazite", - "SABLENITE": "Ténéfixite", - "SALAMENCITE": "Drattakite", - "SCEPTILITE": "Jungkite", - "SCIZORITE": "Cizayoxite", - "SHARPEDONITE": "Sharpedite", - "SLOWBRONITE": "Flagadossite", - "STEELIXITE": "Steelixite", - "SWAMPERTITE": "Laggronite", - "TYRANITARITE": "Tyranocivite", - "VENUSAURITE": "Florizarrite", - - "BLUE_ORB": "Gemme Bleue", - "RED_ORB": "Gemme Rouge", - "SHARP_METEORITE": "Méteorite Aiguisée", - "HARD_METEORITE": "Méteorite Solide", - "SMOOTH_METEORITE": "Méteorite Lisse", - "ADAMANT_CRYSTAL": "Globe Adamant", - "LUSTROUS_GLOBE": "Globe Perlé", - "GRISEOUS_CORE": "Globe Platiné", - "REVEAL_GLASS": "Miroir Sacré", - "GRACIDEA": "Gracidée", - "MAX_MUSHROOMS": "Maxi Champis", - "DARK_STONE": "Galet Noir", - "LIGHT_STONE": "Galet Blanc", - "PRISON_BOTTLE": "Vase Scellé", - "N_LUNARIZER": "Necroluna", - "N_SOLARIZER": "Necrosol", - "RUSTED_SWORD": "Épée Rouillée", - "RUSTED_SHIELD": "Bouclier Rouillé", - "ICY_REINS_OF_UNITY": "Rênes de l’Unité du Froid", - "SHADOW_REINS_OF_UNITY": "Rênes de l’Unité d’Effroi", - "WELLSPRING_MASK": "Masque du Puits", - "HEARTHFLAME_MASK": "Masque du Fourneau", - "CORNERSTONE_MASK": "Masque de la Pierre", - "SHOCK_DRIVE": "Module Choc", - "BURN_DRIVE": "Module Pyro", - "CHILL_DRIVE": "Module Cryo", - "DOUSE_DRIVE": "Module Aqua", - - "FIST_PLATE": "Plaque Poing", - "SKY_PLATE": "Plaque Ciel", - "TOXIC_PLATE": "Plaque Toxicité", - "EARTH_PLATE": "Plaque Terre", - "STONE_PLATE": "Plaque Roc", - "INSECT_PLATE": "Plaque Insecte", - "SPOOKY_PLATE": "Plaque Fantôme", - "IRON_PLATE": "Plaque Fer", - "FLAME_PLATE": "Plaque Flamme", - "SPLASH_PLATE": "Plaque Hydro", - "MEADOW_PLATE": "Plaque Herbe", - "ZAP_PLATE": "Plaque Volt", - "MIND_PLATE": "Plaque Esprit", - "ICICLE_PLATE": "Plaque Glace", - "DRACO_PLATE": "Plaque Draco", - "DREAD_PLATE": "Plaque Ombre", - "PIXIE_PLATE": "Plaque Pixie", - "BLANK_PLATE": "Plaque Renouveau", - "LEGEND_PLATE": "Plaque Légende", - "FIGHTING_MEMORY": "ROM Combat", - "FLYING_MEMORY": "ROM Vol", - "POISON_MEMORY": "ROM Poison", - "GROUND_MEMORY": "ROM Sol", - "ROCK_MEMORY": "ROM Roche", - "BUG_MEMORY": "ROM Insecte", - "GHOST_MEMORY": "ROM Spectre", - "STEEL_MEMORY": "ROM Acier", - "FIRE_MEMORY": "ROM Feu", - "WATER_MEMORY": "ROM Eau", - "GRASS_MEMORY": "ROM Plante", - "ELECTRIC_MEMORY": "ROM Électrik", - "PSYCHIC_MEMORY": "ROM Psy", - "ICE_MEMORY": "ROM Glace", - "DRAGON_MEMORY": "ROM Dragon", - "DARK_MEMORY": "ROM Ténèbres", - "FAIRY_MEMORY": "ROM Fée", - "BLANK_MEMORY": "ROM Vierge", - }, -} as const; diff --git a/src/locales/fr/modifier.json b/src/locales/fr/modifier.json new file mode 100644 index 00000000000..101b1d56164 --- /dev/null +++ b/src/locales/fr/modifier.json @@ -0,0 +1,12 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}} tient bon\ngrâce à son {{typeName}} !", + "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 !", + "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}} !", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "bypassSpeedChanceApply": "{{itemName}} de {{pokemonName}}\nlui permet d’agir plus vite que d’habitude !" +} diff --git a/src/locales/fr/move-trigger.json b/src/locales/fr/move-trigger.json new file mode 100644 index 00000000000..d9d800c52cc --- /dev/null +++ b/src/locales/fr/move-trigger.json @@ -0,0 +1,70 @@ +{ + "hitWithRecoil": "{{pokemonName}} est blessé par le contrecoup !", + "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 !", + "fled": "{{pokemonName}}\nprend la fuite !", + "cannotBeSwitchedOut": "Impossible de rappeler {{pokemonName}}\nau combat.", + "swappedAbilitiesWithTarget": "{{pokemonName}} et sa cible\néchangent leurs talents !", + "coinsScatteredEverywhere": "Il pleut des pièces !", + "attackedByItem": "{{pokemonName}} est attaqué\npar son propre objet {{itemName}} !", + "whippedUpAWhirlwind": "{{pokemonName}}se prépare\nà lancer une bourrasque !", + "flewUpHigh": "{{pokemonName}} s’envole !", + "tookInSunlight": "{{pokemonName}}\nabsorbe la lumière !", + "dugAHole": "{{pokemonName}}\nse cache dans le sol !", + "loweredItsHead": "{{pokemonName}}\nbaisse la tête !", + "isGlowing": "{{pokemonName}} est entouré\nd’une lumière intense !", + "bellChimed": "Un grelot sonne !", + "foresawAnAttack": "{{pokemonName}}\nprévoit une attaque !", + "isTighteningFocus": "{{pokemonName}} se concentre\nau maximum !", + "hidUnderwater": "{{pokemonName}}\nse cache sous l’eau !", + "soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans l’air !", + "sprangUp": "{{pokemonName}}\nse propulse dans les airs !", + "choseDoomDesireAsDestiny": "{{pokemonName}}souhaite\nle déclenchement de la capacité Vœu Destructeur !", + "vanishedInstantly": "{{pokemonName}}\ndisparait instantanément !", + "tookTargetIntoSky": "{{pokemonName}} emporte\n{{targetName}} haut dans le ciel !", + "becameCloakedInFreezingLight": "{{pokemonName}} est baigné\nd’une lumière blafarde !", + "becameCloakedInFreezingAir": "{{pokemonName}} est entouré\nd’un air glacial !", + "isChargingPower": "{{pokemonName}}\nconcentre son énergie !", + "burnedItselfOut": "Le feu intérieur de {{pokemonName}}\ns’est entièrement consumé !", + "startedHeatingUpBeak": "{{pokemonName}}\nfait chauffer son bec !", + "setUpShellTrap": "{{pokemonName}} déclenche\nle Carapiège !", + "isOverflowingWithSpacePower": "La puissance du cosmos afflue dans le corps\nde {{pokemonName}} !", + "usedUpAllElectricity": "{{pokemonName}}a utilisé\ntoute son électricité !", + "stoleItem": "{{pokemonName}} vole\nl’objet {{itemName}} de {{targetName}} !", + "incineratedItem": "{{pokemonName}} brule\nla {{itemName}} de {{targetName}} !", + "knockedOffItem": "{{pokemonName}} fait tomber\nl’objet {{itemName}} de {{targetName}} !", + "tookMoveAttack": "{{pokemonName}}\nsubit l’attaque {{moveName}} !", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} sacrifie des PV\net monte son {{statName}} au maximum !", + "copiedStatChanges": "{{pokemonName}} copie\nles changements de stats de {{targetName}} !", + "magnitudeMessage": "Ampleur {{magnitude}} !", + "tookAimAtTarget": "{{pokemonName}} vise\n{{targetName}} !", + "transformedIntoType": "{{pokemonName}} prend\nle type {{typeName}} !", + "copiedMove": "{{pokemonName}} copie\nla capacité {{moveName}} !", + "sketchedMove": "{{pokemonName}} utilise Gribouille\npour copier {{moveName}} !", + "acquiredAbility": "Le talent de {{pokemonName}}\ndevient {{abilityName}} !", + "copiedTargetAbility": "{{pokemonName}} copie le talent\n{{abilityName}} de {{targetName}} !", + "transformedIntoTarget": "{{pokemonName}} prend\nl’apparence de {{targetName}} !", + "tryingToTakeFoeDown": "{{pokemonName}} veut entrainer\nson assaillant dans sa chute !", + "addType": "{{pokemonName}} gagne\nle type {{typeName}}.", + "cannotUseMove": "{{pokemonName}} ne peut pas\nutiliser la capacité {{moveName}} !", + "healHp": "{{pokemonName}}\nrécupère des PV !", + "sacrificialFullRestore": "Le Vœu Soin est exaucé et profite\nà {{pokemonName}} !", + "invertStats": "Les changements de stats\nde {{pokemonName}} sont inversés !", + "resetStats": "Les changements de stats\nde {{pokemonName}} ont tous été annulés !", + "statEliminated": "Les changements de stats ont tous été annulés !", + "faintCountdown": "{{pokemonName}}\nsera K.O. dans {{turnCount}} tours !", + "copyType": "{{pokemonName}} prend le type\nde {{targetPokemonName}} !", + "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}} !", + "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !" +} diff --git a/src/locales/fr/move.json b/src/locales/fr/move.json new file mode 100644 index 00000000000..a48e17b3fd9 --- /dev/null +++ b/src/locales/fr/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "Écras’Face", + "effect": "Le lanceur écrase la cible avec l’un de ses membres, tels qu’une de ses pattes avant ou sa longue queue." + }, + "karateChop": { + "name": "Poing Karaté", + "effect": "L’ennemi est tranché violemment. Taux de critique élevé." + }, + "doubleSlap": { + "name": "Torgnoles", + "effect": "Gifle rapidement l’ennemi de deux à cinq fois d’affilée." + }, + "cometPunch": { + "name": "Poing Comète", + "effect": "Une tornade de coups de poing qui frappe de deux à cinq fois d’affilée." + }, + "megaPunch": { + "name": "Ultimapoing", + "effect": "La cible reçoit un coup de poing d’une grande puissance." + }, + "payDay": { + "name": "Jackpot", + "effect": "Des pièces sont lancées sur la cible. Permet d’obtenir de l’argent à la fin du combat." + }, + "firePunch": { + "name": "Poing Feu", + "effect": "Un coup de poing enflammé vient frapper la cible, ce qui peut la bruler (10% de chances)." + }, + "icePunch": { + "name": "Poing Glace", + "effect": "Un coup de poing glacé vient frapper la cible, ce qui peut la geler (10% de chances)." + }, + "thunderPunch": { + "name": "Poing Éclair", + "effect": "Un coup de poing électrique vient frapper la cible, ce qui peut la paralyser (10% de chances)." + }, + "scratch": { + "name": "Griffe", + "effect": "Lacère la cible avec des griffes acérées pour lui infliger des dégâts." + }, + "viseGrip": { + "name": "Force Poigne", + "effect": "La cible est attrapée et compressée par les côtés." + }, + "guillotine": { + "name": "Guillotine", + "effect": "Des pinces lacèrent violemment la cible, la mettant K.O. sur le coup si elle est touchée." + }, + "razorWind": { + "name": "Coupe-Vent", + "effect": "Attaque en deux tours. Des lames de vent frappent l’ennemi au second tour. Taux de critique élevé." + }, + "swordsDance": { + "name": "Danse Lames", + "effect": "Une danse frénétique qui exalte l’esprit combatif. Augmente beaucoup l’Attaque du lanceur." + }, + "cut": { + "name": "Coupe", + "effect": "Coupe la cible avec des lames ou des griffes." + }, + "gust": { + "name": "Tornade", + "effect": "Le lanceur bat des ailes pour générer une bourrasque qui blesse la cible." + }, + "wingAttack": { + "name": "Cru-Ailes", + "effect": "Le lanceur déploie largement ses ailes majestueuses pour attaquer la cible." + }, + "whirlwind": { + "name": "Cyclone", + "effect": "Éjecte le Pokémon ennemi et le remplace par un autre. Lors d’un combat contre un Pokémon sauvage seul, met fin au combat." + }, + "fly": { + "name": "Vol", + "effect": "Le lanceur s’envole au premier tour et frappe au second." + }, + "bind": { + "name": "Étreinte", + "effect": "Le lanceur ligote la cible avec son corps allongé ou ses tentacules pour la compresser durant quatre à cinq tours." + }, + "slam": { + "name": "Souplesse", + "effect": "Le lanceur utilise l’un de ses membres, tels qu’une queue ou une liane, pour infliger des dégâts à la cible." + }, + "vineWhip": { + "name": "Fouet Lianes", + "effect": "Fouette la cible avec de fines lianes pour infliger des dégâts." + }, + "stomp": { + "name": "Écrasement", + "effect": "Écrase la cible avec un énorme pied, ce qui peut aussi l’apeurer (30% de chances)." + }, + "doubleKick": { + "name": "Double Pied", + "effect": "Deux coups de pied qui frappent la cible deux fois d’affilée." + }, + "megaKick": { + "name": "Ultimawashi", + "effect": "Un coup de pied surpuissant qui frappe la cible." + }, + "jumpKick": { + "name": "Pied Sauté", + "effect": "Le lanceur s’envole pour décocher un coup de pied sauté. S’il échoue, le lanceur se blesse." + }, + "rollingKick": { + "name": "Mawashi Geri", + "effect": "Le lanceur effectue un coup de pied tournoyant et extrêmement rapide. Peut apeurer l’ennemi (30% de chances)." + }, + "sandAttack": { + "name": "Jet de Sable", + "effect": "Lance du sable au visage de la cible pour baisser sa Précision." + }, + "headbutt": { + "name": "Coup d’Boule", + "effect": "Le lanceur donne un coup de tête à la cible qui peut aussi l’apeurer (30% de chances)." + }, + "hornAttack": { + "name": "Koud’Korne", + "effect": "Frappe la cible d’un coup de corne pointue pour infliger des dégâts." + }, + "furyAttack": { + "name": "Furie", + "effect": "Frappe la cible deux à cinq fois d’affilée avec un membre pointu tel qu’un bec ou une corne." + }, + "hornDrill": { + "name": "Empal’Korne", + "effect": "Un coup de corne en vrille qui empale la cible, la mettant K.O. sur le coup si elle est touchée." + }, + "tackle": { + "name": "Charge", + "effect": "Le lanceur charge la cible et la percute de tout son poids." + }, + "bodySlam": { + "name": "Plaquage", + "effect": "Le lanceur se laisse tomber sur la cible de tout son poids, ce qui peut aussi la paralyser (30% de chances)." + }, + "wrap": { + "name": "Ligotage", + "effect": "Le lanceur ligote la cible avec son corps allongé ou ses tentacules pour la compresser durant quatre à cinq tours." + }, + "takeDown": { + "name": "Bélier", + "effect": "Une charge violente qui blesse aussi légèrement le lanceur." + }, + "thrash": { + "name": "Mania", + "effect": "Une attaque furieuse qui dure de deux à trois tours. Le lanceur devient confus." + }, + "doubleEdge": { + "name": "Damoclès", + "effect": "Une charge dangereuse et imprudente. Blesse aussi gravement le lanceur." + }, + "tailWhip": { + "name": "Mimi-Queue", + "effect": "Le lanceur remue son adorable queue pour tromper la vigilance de la cible et baisser sa Défense." + }, + "poisonSting": { + "name": "Dard-Venin", + "effect": "Un dard toxique transperce la cible et peut aussi l’empoisonner (30% de chances)." + }, + "twineedle": { + "name": "Double Dard", + "effect": "Un double coup de dard qui transperce l’ennemi deux fois d’affilée. Peut aussi l’empoisonner (36% de chances)." + }, + "pinMissile": { + "name": "Dard-Nuée", + "effect": "Envoie une rafale de dards. Peut toucher de deux à cinq fois." + }, + "leer": { + "name": "Groz’Yeux", + "effect": "Le lanceur fait les gros yeux à la cible pour l’intimider et baisser sa Défense." + }, + "bite": { + "name": "Morsure", + "effect": "Le lanceur utilise ses canines tranchantes pour mordre la cible, ce qui peut aussi l’apeurer (30% de chances)." + }, + "growl": { + "name": "Rugissement", + "effect": "Le lanceur pousse un cri tout mimi pour tromper la vigilance de la cible et baisser son Attaque." + }, + "roar": { + "name": "Hurlement", + "effect": "Effraie le Pokémon ennemi et le remplace par un autre. Lors d’un combat contre un Pokémon sauvage seul, met fin au combat." + }, + "sing": { + "name": "Berceuse", + "effect": "Une berceuse plonge la cible dans un profond sommeil." + }, + "supersonic": { + "name": "Ultrason", + "effect": "Le lanceur produit d’étranges ondes sonores qui rendent la cible confuse." + }, + "sonicBoom": { + "name": "Sonic Boom", + "effect": "Une onde de choc destructrice qui inflige toujours 20 PV de dégâts." + }, + "disable": { + "name": "Entrave", + "effect": "Empêche la cible de répéter sa dernière attaque. Dure quatre tours." + }, + "acid": { + "name": "Acide", + "effect": "Le lanceur attaque la cible avec un jet d’acide corrosif qui peut aussi baisser sa Défense Spéciale." + }, + "ember": { + "name": "Flammèche", + "effect": "La cible est attaquée par une faible flamme qui peut aussi la bruler." + }, + "flamethrower": { + "name": "Lance-Flammes", + "effect": "La cible reçoit un torrent de flammes qui peut aussi la bruler (10% de chances)." + }, + "mist": { + "name": "Brume", + "effect": "Une brume blanche enveloppe le lanceur et ses alliés et empêche la réduction des stats pour cinq tours." + }, + "waterGun": { + "name": "Pistolet à O", + "effect": "De l’eau est projetée avec force sur la cible." + }, + "hydroPump": { + "name": "Hydrocanon", + "effect": "Un puissant jet d’eau est dirigé sur la cible." + }, + "surf": { + "name": "Surf", + "effect": "Une énorme vague s’abat sur le champ de bataille et inflige des dégâts à tous les Pokémon autour du lanceur." + }, + "iceBeam": { + "name": "Laser Glace", + "effect": "Un rayon de glace frappe la cible, ce qui peut aussi la geler (10% de chances)." + }, + "blizzard": { + "name": "Blizzard", + "effect": "Une violente tempête de neige s’abat sur la cible, ce qui peut aussi la geler (10% de chances)." + }, + "psybeam": { + "name": "Rafale Psy", + "effect": "Un étrange rayon frappe la cible, ce qui peut aussi la rendre confuse." + }, + "bubbleBeam": { + "name": "Bulles d’O", + "effect": "Des bulles sont envoyées avec puissance sur la cible, ce qui peut aussi baisser sa Vitesse." + }, + "auroraBeam": { + "name": "Onde Boréale", + "effect": "Le lanceur envoie un rayon arc-en-ciel sur la cible, ce qui peut aussi baisser son Attaque." + }, + "hyperBeam": { + "name": "Ultralaser", + "effect": "Le lanceur projette un puissant rayon sur la cible, mais doit se reposer au tour suivant." + }, + "peck": { + "name": "Picpic", + "effect": "Le lanceur frappe la cible d’un bec acéré ou d’une corne pointue pour infliger des dégâts." + }, + "drillPeck": { + "name": "Bec Vrille", + "effect": "Une attaque utilisant le bec comme une perceuse." + }, + "submission": { + "name": "Sacrifice", + "effect": "Le lanceur agrippe l’ennemi et l’écrase au sol. Blesse aussi légèrement le lanceur." + }, + "lowKick": { + "name": "Balayage", + "effect": "Un grand coup de pied bas qui fauche la cible. Plus celle-ci est lourde, plus la puissance de cette capacité augmente." + }, + "counter": { + "name": "Riposte", + "effect": "Une riposte qui répond à toute attaque physique en infligeant le double de dégâts." + }, + "seismicToss": { + "name": "Frappe Atlas", + "effect": "La cible est projetée grâce au pouvoir de la gravité. Cette capacité inflige des dégâts égaux au niveau du lanceur." + }, + "strength": { + "name": "Force", + "effect": "Le lanceur cogne la cible de toutes ses forces." + }, + "absorb": { + "name": "Vole-Vie", + "effect": "Une attaque qui absorbe les nutriments et convertit la moitié des dégâts infligés en PV pour le lanceur." + }, + "megaDrain": { + "name": "Méga-Sangsue", + "effect": "Une attaque qui absorbe les nutriments et convertit la moitié des dégâts infligés en PV pour le lanceur." + }, + "leechSeed": { + "name": "Vampigraine", + "effect": "Une graine est semée sur la cible. À chaque tour, elle lui dérobe des PV que le lanceur récupère." + }, + "growth": { + "name": "Croissance", + "effect": "Le corps du lanceur se développe. Augmente l’Attaque et l’Attaque Spéciale." + }, + "razorLeaf": { + "name": "Tranch’Herbe", + "effect": "Des feuilles aiguisées comme des rasoirs entaillent la cible. Taux de critiques élevé." + }, + "solarBeam": { + "name": "Lance-Soleil", + "effect": "Le lanceur absorbe une grande quantité de lumière au premier tour et envoie un rayon puissant au tour suivant." + }, + "poisonPowder": { + "name": "Poudre Toxik", + "effect": "Une poudre toxique empoisonne la cible." + }, + "stunSpore": { + "name": "Para-Spore", + "effect": "Le lanceur répand sur la cible une poudre qui la paralyse." + }, + "sleepPowder": { + "name": "Poudre Dodo", + "effect": "Le lanceur répand une poudre soporifique qui endort la cible." + }, + "petalDance": { + "name": "Danse Fleurs", + "effect": "Le lanceur attaque en projetant des pétales pendant deux à trois tours avant de céder à la confusion." + }, + "stringShot": { + "name": "Sécrétion", + "effect": "Le lanceur crache de la soie pour ligoter la cible et beaucoup baisser sa Vitesse." + }, + "dragonRage": { + "name": "Draco-Rage", + "effect": "La colère du lanceur déclenche une onde de choc destructrice qui inflige toujours 40 PV de dégâts." + }, + "fireSpin": { + "name": "Danse Flammes", + "effect": "Un tourbillon de flammes emprisonne la cible pendant quatre à cinq tours." + }, + "thunderShock": { + "name": "Éclair", + "effect": "Une décharge électrique tombe sur la cible, ce qui peut aussi la paralyser (10% de chances)." + }, + "thunderbolt": { + "name": "Tonnerre", + "effect": "Une grosse décharge électrique tombe sur la cible, ce qui peut aussi la paralyser (10% de chances)." + }, + "thunderWave": { + "name": "Cage Éclair", + "effect": "Un faible choc électrique paralyse la cible." + }, + "thunder": { + "name": "Fatal-Foudre", + "effect": "La foudre tombe sur la cible pour lui infliger des dégâts, ce qui peut aussi la paralyser (30% de chances)." + }, + "rockThrow": { + "name": "Jet-Pierres", + "effect": "Le lanceur soulève une pierre et la lance sur la cible." + }, + "earthquake": { + "name": "Séisme", + "effect": "Le lanceur provoque un tremblement de terre touchant tous les Pokémon autour de lui." + }, + "fissure": { + "name": "Abime", + "effect": "Le lanceur fait tomber la cible dans une crevasse. Si cette attaque réussit, elle met K.O. sur le coup." + }, + "dig": { + "name": "Tunnel", + "effect": "Le lanceur creuse au premier tour et frappe au second." + }, + "toxic": { + "name": "Fil Toxique", + "effect": "Tisse un fil imprégné de venin. Empoisonne la cible et baisse sa Vitesse." + }, + "confusion": { + "name": "Choc Mental", + "effect": "Une faible vague télékinétique frappe la cible, ce qui peut aussi la plonger dans la confusion." + }, + "psychic": { + "name": "Psyko", + "effect": "Une puissante force télékinétique frappe la cible, ce qui peut aussi faire baisser sa Défense Spéciale." + }, + "hypnosis": { + "name": "Hypnose", + "effect": "Le lanceur hypnotise la cible pour la plonger dans un profond sommeil." + }, + "meditate": { + "name": "Yoga", + "effect": "Le lanceur médite pour éveiller son pouvoir latent et augmenter son Attaque." + }, + "agility": { + "name": "Hâte", + "effect": "Le lanceur se relaxe et allège son corps pour beaucoup augmenter sa Vitesse." + }, + "quickAttack": { + "name": "Vive-Attaque", + "effect": "Le lanceur fonce sur la cible si rapidement qu’on parvient à peine à le discerner. Frappe en priorité." + }, + "rage": { + "name": "Frénésie", + "effect": "Une fois activée, cette capacité augmente l’Attaque du lanceur à mesure que celui-ci subit des attaques." + }, + "teleport": { + "name": "Téléport", + "effect": "Permet de changer de place avec un autre Pokémon de l’équipe s’il y en a. Quand cette capacité est utilisée par un Pokémon sauvage, celui-ci fuit le combat." + }, + "nightShade": { + "name": "Ombre Nocturne", + "effect": "Le lanceur invoque un mirage et inflige des dégâts égaux au niveau du lanceur." + }, + "mimic": { + "name": "Copie", + "effect": "Le lanceur copie la dernière capacité utilisée par la cible et la conserve tant qu’il reste au combat." + }, + "screech": { + "name": "Grincement", + "effect": "Le lanceur émet un son strident qui donne envie de se boucher les oreilles. Baisse beaucoup la Défense de la cible." + }, + "doubleTeam": { + "name": "Reflet", + "effect": "Le lanceur se déplace si vite qu’il crée des copies illusoires de lui-même, augmentant son Esquive." + }, + "recover": { + "name": "Soin", + "effect": "Un soin qui permet au lanceur de récupérer jusqu’à la moitié de ses PV max." + }, + "harden": { + "name": "Armure", + "effect": "Le lanceur contracte tous ses muscles pour augmenter sa Défense." + }, + "minimize": { + "name": "Lilliput", + "effect": "Le lanceur comprime son corps pour se faire tout petit et beaucoup augmenter son Esquive." + }, + "smokescreen": { + "name": "Brouillard", + "effect": "Le lanceur disperse un nuage d’encre ou de fumée qui réduit la Précision de la cible." + }, + "confuseRay": { + "name": "Onde Folie", + "effect": "Une lumière étrange qui plonge la cible dans un état de confusion." + }, + "withdraw": { + "name": "Repli", + "effect": "Le lanceur se recroqueville dans sa carapace, ce qui augmente sa Défense." + }, + "defenseCurl": { + "name": "Boul’Armure", + "effect": "Le lanceur s’enroule pour cacher ses points faibles, ce qui augmente sa Défense." + }, + "barrier": { + "name": "Bouclier", + "effect": "Le lanceur érige un mur solide qui augmente beaucoup sa Défense." + }, + "lightScreen": { + "name": "Mur Lumière", + "effect": "Crée un fabuleux mur de lumière qui réduit les dégâts causés par les capacités spéciales pendant cinq tours." + }, + "haze": { + "name": "Buée Noire", + "effect": "Crée un brouillard qui annule les changements de stats de tous les Pokémon au combat." + }, + "reflect": { + "name": "Protection", + "effect": "Crée un fabuleux mur de lumière qui réduit les dégâts causés par les capacités physiques pendant cinq tours." + }, + "focusEnergy": { + "name": "Puissance", + "effect": "Le lanceur prend une profonde inspiration et se concentre pour augmenter son taux de critiques." + }, + "bide": { + "name": "Patience", + "effect": "Le lanceur encaisse les coups durant deux tours et réplique en infligeant le double des dégâts subis." + }, + "metronome": { + "name": "Métronome", + "effect": "Le lanceur agite un doigt et stimule son cerveau pour utiliser presque n’importe quelle capacité au hasard." + }, + "mirrorMove": { + "name": "Mimique", + "effect": "Le lanceur riposte à l’attaque de l’ennemi avec la même attaque." + }, + "selfDestruct": { + "name": "Destruction", + "effect": "Le lanceur explose en blessant tous les Pokémon autour de lui. Le lanceur tombe K.O." + }, + "eggBomb": { + "name": "Bombe Œuf", + "effect": "De toutes ses forces, le lanceur jette un gros œuf sur l’ennemi pour lui infliger des dégâts." + }, + "lick": { + "name": "Léchouille", + "effect": "Un grand coup de langue qui inflige des dégâts à la cible et peut aussi la paralyser (30% de chances)." + }, + "smog": { + "name": "Purédpois", + "effect": "Le lanceur attaque à l’aide d’une éruption de gaz répugnants qui peuvent aussi empoisonner la cible." + }, + "sludge": { + "name": "Détritus", + "effect": "Des détritus toxiques sont projetés sur la cible, ce qui peut aussi l’empoisonner (30% de chances)." + }, + "boneClub": { + "name": "Massd’Os", + "effect": "Le lanceur frappe l’ennemi à grands coups d’os. Peut aussi l’apeurer (10% de chances)." + }, + "fireBlast": { + "name": "Déflagration", + "effect": "Un déluge de flammes ardentes submerge la cible, ce qui peut aussi la bruler (10% de chances)." + }, + "waterfall": { + "name": "Cascade", + "effect": "Le lanceur charge la cible avec une intensité remarquable, ce qui peut l’apeurer (20% de chances)." + }, + "clamp": { + "name": "Claquoir", + "effect": "Le lanceur piège l’ennemi dans sa dure coquille et l’écrase pendant quatre à cinq tours." + }, + "swift": { + "name": "Météores", + "effect": "Le lanceur envoie des rayons d’étoiles qui touchent toujours la cible." + }, + "skullBash": { + "name": "Coud’Krâne", + "effect": "Le lanceur baisse la tête pour augmenter sa Défense au premier tour et percuter l’ennemi au second." + }, + "spikeCannon": { + "name": "Picanon", + "effect": "Envoie une rafale de dards. Peut toucher de deux à cinq fois." + }, + "constrict": { + "name": "Constriction", + "effect": "De longs tentacules ou lianes attaquent l’ennemi. Peut aussi baisser sa Vitesse." + }, + "amnesia": { + "name": "Amnésie", + "effect": "Le lanceur fait le vide dans son esprit pour oublier ses soucis. Augmente beaucoup sa Défense Spéciale." + }, + "kinesis": { + "name": "Télékinésie", + "effect": "Le lanceur distrait l’ennemi en pliant une cuiller, ce qui baisse sa Précision." + }, + "softBoiled": { + "name": "E-Coque", + "effect": "Le lanceur récupère jusqu’à la moitié de ses PV max." + }, + "highJumpKick": { + "name": "Pied Voltige", + "effect": "Le lanceur s’élance pour effectuer un coup de genou sauté. S’il échoue, le lanceur se blesse." + }, + "glare": { + "name": "Regard Médusant", + "effect": "Le lanceur intimide la cible grâce à son regard terrifiant pour la paralyser." + }, + "dreamEater": { + "name": "Dévorêve", + "effect": "Le lanceur mange le rêve de la cible endormie et récupère en PV la moitié des dégâts infligés." + }, + "poisonGas": { + "name": "Gaz Toxik", + "effect": "Le lanceur empoisonne la cible en lui projetant un nuage de gaz toxique au visage." + }, + "barrage": { + "name": "Pilonnage", + "effect": "Projette de deux à cinq grosses boules sur l’ennemi." + }, + "leechLife": { + "name": "Vampirisme", + "effect": "Une attaque qui aspire le sang de la cible. La moitié des dégâts sont convertis en PV pour le lanceur." + }, + "lovelyKiss": { + "name": "Grobisou", + "effect": "Le lanceur fait un bisou à l’ennemi en prenant une mine effrayante. Endort l’ennemi." + }, + "skyAttack": { + "name": "Piqué", + "effect": "Une attaque en deux tours au taux de critiques élevé, qui peut aussi apeurer la cible (30% de chances)." + }, + "transform": { + "name": "Morphing", + "effect": "Le lanceur devient une copie de sa cible et obtient la même palette de capacités." + }, + "bubble": { + "name": "Écume", + "effect": "Des bulles frappent l’ennemi. Peut réduire sa Vitesse." + }, + "dizzyPunch": { + "name": "Uppercut", + "effect": "Un enchainement de coups de poing cadencés frappe l’ennemi. Peut aussi le rendre confus." + }, + "spore": { + "name": "Spore", + "effect": "Le lanceur répand un nuage de spores qui endort." + }, + "flash": { + "name": "Flash", + "effect": "Explosion lumineuse qui fait baisser la Précision de l’ennemi." + }, + "psywave": { + "name": "Vague Psy", + "effect": "Une étrange onde d’énergie chaude frappe l’ennemi. Cette attaque est d’intensité variable." + }, + "splash": { + "name": "Trempette", + "effect": "Le lanceur barbote et éclabousse les environs. Cette capacité n’a aucun effet." + }, + "acidArmor": { + "name": "Acidarmure", + "effect": "Le lanceur modifie sa structure moléculaire pour se liquéfier et beaucoup augmenter sa Défense." + }, + "crabhammer": { + "name": "Pince-Masse", + "effect": "Une grande pince martèle la cible. Taux de critiques élevé." + }, + "explosion": { + "name": "Explosion", + "effect": "Le lanceur explose et inflige des dégâts à tous les Pokémon autour de lui. Met K.O. le lanceur." + }, + "furySwipes": { + "name": "Combo-Griffe", + "effect": "La cible est lacérée par des faux ou des griffes de deux à cinq fois d’affilée." + }, + "bonemerang": { + "name": "Osmerang", + "effect": "Le lanceur projette son os comme un boomerang. Cette attaque frappe à l’aller et au retour." + }, + "rest": { + "name": "Repos", + "effect": "Le lanceur regagne tous ses PV et ses altérations de statut sont soignées, puis il dort pendant deux tours." + }, + "rockSlide": { + "name": "Éboulement", + "effect": "Le lanceur envoie de gros rochers sur la cible pour lui infliger des dégâts, ce qui peut aussi l’apeurer (30% de chances)." + }, + "hyperFang": { + "name": "Croc de Mort", + "effect": "Le lanceur mord l’ennemi à l’aide de ses incisives aiguisées. Peut aussi l’apeurer (10% de chances)." + }, + "sharpen": { + "name": "Affutage", + "effect": "Le lanceur réduit son nombre de polygones pour accentuer ses angles et augmenter son Attaque." + }, + "conversion": { + "name": "Conversion", + "effect": "Le lanceur change de type pour prendre celui de la première capacité de sa liste." + }, + "triAttack": { + "name": "Triplattaque", + "effect": "Le lanceur envoie trois boules d’énergie simultanément qui peuvent aussi paralyser, bruler ou geler la cible (6.67% de chances)." + }, + "superFang": { + "name": "Croc Fatal", + "effect": "Une vilaine morsure d’incisives qui réduit de moitié les PV de la cible." + }, + "slash": { + "name": "Tranche", + "effect": "Le lanceur donne un coup de griffe ou de faux. Taux de critiques élevé." + }, + "substitute": { + "name": "Clonage", + "effect": "Le lanceur crée un clone en sacrifiant quelques PV. Ce clone sert de leurre." + }, + "struggle": { + "name": "Lutte", + "effect": "Une attaque désespérée, utilisée quand le lanceur n’a plus de PP. Le blesse aussi légèrement." + }, + "sketch": { + "name": "Gribouille", + "effect": "Le lanceur apprend la dernière capacité utilisée par la cible. Gribouille disparait après utilisation." + }, + "tripleKick": { + "name": "Triple Pied", + "effect": "Une salve de un à trois coups de pied dont la puissance augmente à chaque coup porté." + }, + "thief": { + "name": "Larcin", + "effect": "Le lanceur attaque la cible et vole son objet. Le lanceur ne peut rien voler s’il tient déjà un objet." + }, + "spiderWeb": { + "name": "Toile", + "effect": "Le lanceur enserre l’ennemi à l’aide d’une fine soie gluante pour l’empêcher de fuir le combat." + }, + "mindReader": { + "name": "Lire-Esprit", + "effect": "Le lanceur analyse les mouvements de l’ennemi pour être sûr de toucher au coup suivant." + }, + "nightmare": { + "name": "Cauchemar", + "effect": "Un cauchemar qui inflige des dégâts à chaque tour à un ennemi endormi." + }, + "flameWheel": { + "name": "Roue de Feu", + "effect": "Le lanceur s’entoure de feu et charge la cible, ce qui peut aussi la bruler (10% de chances)." + }, + "snore": { + "name": "Ronflement", + "effect": "Une attaque qui ne fonctionne que si le lanceur est endormi. Le boucan peut aussi apeurer la cible (30% de chances)." + }, + "curse": { + "name": "Malédiction", + "effect": "Une capacité à l’effet différent selon que le lanceur est un Pokémon Spectre ou non." + }, + "flail": { + "name": "Gigotage", + "effect": "Le lanceur attaque en gigotant dans tous les sens. Plus ses PV sont bas, plus l’attaque est puissante." + }, + "conversion2": { + "name": "Conversion 2", + "effect": "Le lanceur change de type pour être résistant au type de la dernière attaque lancée par sa cible." + }, + "aeroblast": { + "name": "Aéroblast", + "effect": "Le lanceur projette une tornade sur l’ennemi pour infliger des dégâts. Taux de critique élevé." + }, + "cottonSpore": { + "name": "Spore Coton", + "effect": "Le lanceur libère des spores cotonneuses qui collent à la cible et baissent beaucoup sa Vitesse." + }, + "reversal": { + "name": "Contre", + "effect": "Le lanceur ne retient plus ses coups. Plus ses PV sont bas, plus la puissance de cette capacité augmente." + }, + "spite": { + "name": "Dépit", + "effect": "Le lanceur exprime son ressentiment en retirant 4 PP à la dernière capacité utilisée par la cible." + }, + "powderSnow": { + "name": "Poudreuse", + "effect": "Le lanceur projette de la neige poudreuse qui peut aussi geler la cible (10% de chances)." + }, + "protect": { + "name": "Abri", + "effect": "Le lanceur se protège de toutes les attaques. Peut échouer si utilisée plusieurs fois de suite." + }, + "machPunch": { + "name": "Mach Punch", + "effect": "Coup de poing fulgurant. Frappe en priorité." + }, + "scaryFace": { + "name": "Grimace", + "effect": "Le lanceur fait une grimace qui effraie la cible et réduit beaucoup sa Vitesse." + }, + "feintAttack": { + "name": "Feinte", + "effect": "Le lanceur s’approche l’air de rien avant de frapper par surprise. N’échoue jamais." + }, + "sweetKiss": { + "name": "Doux Baiser", + "effect": "Le lanceur envoie un bisou si mignon et désarmant qu’il plonge la cible dans la confusion." + }, + "bellyDrum": { + "name": "Cognobidon", + "effect": "Améliore l’Attaque au maximum en sacrifiant la moitié des PV max." + }, + "sludgeBomb": { + "name": "Bombe Beurk", + "effect": "Des détritus toxiques sont projetés sur la cible, ce qui peut aussi l’empoisonner (30% de chances)." + }, + "mudSlap": { + "name": "Coud’Boue", + "effect": "Le lanceur envoie de la boue au visage de la cible pour infliger des dégâts et baisser sa Précision." + }, + "octazooka": { + "name": "Octazooka", + "effect": "Le lanceur attaque en projetant de l’encre au visage de l’ennemi. Peut aussi baisser sa Précision." + }, + "spikes": { + "name": "Picots", + "effect": "Le lanceur disperse des picots sur le sol pour blesser tout ennemi qui entre au combat." + }, + "zapCannon": { + "name": "Élecanon", + "effect": "Un boulet de canon électrifié qui inflige des dégâts à la cible et la paralyse." + }, + "foresight": { + "name": "Clairvoyance", + "effect": "Permet de toucher un Pokémon Spectre avec n’importe quelle capacité ou de toucher un ennemi insaisissable." + }, + "destinyBond": { + "name": "Lien du Destin", + "effect": "Si un assaillant porte un coup fatal au lanceur après qu’il a activé cette capacité, ils sont tous les deux mis K.O. La capacité échoue si elle est immédiatement réutilisée." + }, + "perishSong": { + "name": "Requiem", + "effect": "Tout Pokémon qui entend ce requiem est K.O. dans trois tours à moins qu’il ne soit remplacé." + }, + "icyWind": { + "name": "Vent Glace", + "effect": "Une bourrasque de vent froid blesse la cible et réduit sa Vitesse." + }, + "detect": { + "name": "Détection", + "effect": "Le lanceur se protège de toutes les attaques. Peut échouer si utilisée plusieurs fois de suite." + }, + "boneRush": { + "name": "Charge Os", + "effect": "Le lanceur frappe la cible avec un os de deux à cinq fois d’affilée." + }, + "lockOn": { + "name": "Verrouillage", + "effect": "Le lanceur verrouille la cible pour ne pas la rater au tour suivant." + }, + "outrage": { + "name": "Colère", + "effect": "Le lanceur enrage et attaque pendant deux ou trois tours avant de devenir confus." + }, + "sandstorm": { + "name": "Tempête de Sable", + "effect": "Une tempête de sable blesse tous les Pokémon pendant cinq tours, sauf ceux de type Roche, Sol ou Acier. Augmente la Défense Spéciale des Pokémon Roche." + }, + "gigaDrain": { + "name": "Giga-Sangsue", + "effect": "Une attaque qui absorbe les nutriments et convertit la moitié des dégâts infligés en PV pour le lanceur." + }, + "endure": { + "name": "Ténacité", + "effect": "Le lanceur résiste aux attaques avec 1 PV. Peut échouer si utilisée plusieurs fois de suite." + }, + "charm": { + "name": "Charme", + "effect": "Le lanceur fait les yeux doux pour berner la cible et beaucoup réduire son Attaque." + }, + "rollout": { + "name": "Roulade", + "effect": "Un rocher roule sur la cible pendant cinq tours. L’attaque gagne en puissance à chaque coup." + }, + "falseSwipe": { + "name": "Faux-Chage", + "effect": "Le lanceur retient ses coups pour que la cible garde au moins 1 PV et ne tombe pas K.O." + }, + "swagger": { + "name": "Vantardise", + "effect": "Fait enrager la cible et la plonge dans la confusion, mais augmente beaucoup son Attaque." + }, + "milkDrink": { + "name": "Lait à Boire", + "effect": "Le lanceur récupère jusqu’à la moitié de ses PV max." + }, + "spark": { + "name": "Étincelle", + "effect": "Le lanceur envoie une charge électrique sur la cible qui peut aussi la paralyser (30% de chances)." + }, + "furyCutter": { + "name": "Taillade", + "effect": "Un coup de faux ou de griffe dont la puissance augmente quand il touche plusieurs fois d’affilée." + }, + "steelWing": { + "name": "Ailes d’Acier", + "effect": "Le lanceur frappe la cible avec des ailes d’acier, ce qui peut aussi augmenter la Défense du lanceur." + }, + "meanLook": { + "name": "Regard Noir", + "effect": "Le lanceur pétrifie la cible en lui lançant un regard noir qui la rend incapable de quitter le terrain." + }, + "attract": { + "name": "Attraction", + "effect": "Si la cible est du sexe opposé, elle tombe amoureuse et rechigne alors à attaquer." + }, + "sleepTalk": { + "name": "Blabla Dodo", + "effect": "Le lanceur utilise une de ses capacités au hasard. Il ne peut utiliser cette capacité que quand il dort." + }, + "healBell": { + "name": "Glas de Soin", + "effect": "Carillon apaisant qui soigne les altérations de statut de tous les Pokémon de l’équipe." + }, + "return": { + "name": "Retour", + "effect": "Plus le Pokémon apprécie son Dresseur, plus la puissance de cette attaque furieuse augmente." + }, + "present": { + "name": "Cadeau", + "effect": "Le lanceur attaque en offrant un cadeau piégé à la cible, mais le cadeau peut parfois restaurer les PV de celle-ci à la place." + }, + "frustration": { + "name": "Frustration", + "effect": "Moins le Pokémon aime son Dresseur, plus cette attaque est puissante." + }, + "safeguard": { + "name": "Rune Protect", + "effect": "Crée un champ protecteur qui empêche toutes les altérations de statut pendant cinq tours." + }, + "painSplit": { + "name": "Balance", + "effect": "Le lanceur ajoute ses PV à ceux de sa cible et les répartit équitablement." + }, + "sacredFire": { + "name": "Feu Sacré", + "effect": "Le lanceur génère un feu mystique d’une intensité redoutable pour attaquer l’ennemi. Peut aussi le bruler (50% de chances)." + }, + "magnitude": { + "name": "Ampleur", + "effect": "Provoque un tremblement de terre d’intensité variable qui affecte tous les Pokémon alentour. L’efficacité varie." + }, + "dynamicPunch": { + "name": "Dynamo-Poing", + "effect": "Le lanceur rassemble ses forces et envoie un coup de poing à la cible, ce qui la rend confuse à coup sûr." + }, + "megahorn": { + "name": "Mégacorne", + "effect": "Le lanceur inflige un grand coup de corne à la cible." + }, + "dragonBreath": { + "name": "Draco-Souffle", + "effect": "Le lanceur souffle fort sur la cible pour lui infliger des dégâts, ce qui peut aussi la paralyser (30% de chances)." + }, + "batonPass": { + "name": "Relais", + "effect": "Le lanceur échange sa place et tout changement de stats avec un Pokémon de l’équipe." + }, + "encore": { + "name": "Encore", + "effect": "Le lanceur oblige la cible à répéter la dernière capacité utilisée durant trois tours." + }, + "pursuit": { + "name": "Poursuite", + "effect": "Une attaque qui inflige deux fois plus de dégâts à un ennemi qui s’apprête à être remplacé." + }, + "rapidSpin": { + "name": "Tour Rapide", + "effect": "Le lanceur attaque en tournant sur lui-même. Sa Vitesse augmente également. Il se libère également des effets de capacités comme Étreinte, Ligotage ou Vampigraine." + }, + "sweetScent": { + "name": "Doux Parfum", + "effect": "Un doux parfum qui réduit beaucoup l’Esquive de la cible." + }, + "ironTail": { + "name": "Queue de Fer", + "effect": "Le lanceur attaque la cible avec une queue de fer, ce qui peut aussi baisser la Défense de la cible." + }, + "metalClaw": { + "name": "Griffe Acier", + "effect": "Attaque avec des griffes d’acier. Peut aussi augmenter l’Attaque du lanceur." + }, + "vitalThrow": { + "name": "Corps Perdu", + "effect": "Le lanceur porte son coup en dernier. En échange, cette capacité n’échoue jamais." + }, + "morningSun": { + "name": "Aurore", + "effect": "Un soin qui restaure des PV au lanceur. Son efficacité varie en fonction de la météo." + }, + "synthesis": { + "name": "Synthèse", + "effect": "Un soin qui restaure des PV au lanceur. Son efficacité varie en fonction de la météo." + }, + "moonlight": { + "name": "Rayon Lune", + "effect": "Un soin qui restaure des PV au lanceur. Son efficacité varie en fonction de la météo." + }, + "hiddenPower": { + "name": "Puissance Cachée", + "effect": "Attaque dont le type dépend du Pokémon qui l’utilise." + }, + "crossChop": { + "name": "Coup Croix", + "effect": "Le lanceur délivre un coup double en croisant les avant-bras. Taux de critiques élevé." + }, + "twister": { + "name": "Ouragan", + "effect": "Le lanceur déclenche un terrible ouragan sur la cible, ce qui peut aussi apeurer celle-ci (20% de chances)." + }, + "rainDance": { + "name": "Danse Pluie", + "effect": "Invoque de fortes pluies qui durent cinq tours, augmentant la puissance des capacités de type Eau et baissant celle des capacités de type Feu." + }, + "sunnyDay": { + "name": "Zénith", + "effect": "Fait briller le soleil pendant cinq tours, augmentant la puissance des capacités de type Feu et baissant celle des capacités de type Eau." + }, + "crunch": { + "name": "Mâchouille", + "effect": "Le lanceur mord la cible de ses crocs pointus, ce qui peut aussi baisser sa Défense." + }, + "mirrorCoat": { + "name": "Voile Miroir", + "effect": "Une riposte qui contre n’importe quelle capacité spéciale en infligeant le double des dégâts subis." + }, + "psychUp": { + "name": "Boost", + "effect": "Une autohypnose qui permet au lanceur de copier les changements de stats de la cible." + }, + "extremeSpeed": { + "name": "Vitesse Extrême", + "effect": "Le lanceur charge à une vitesse renversante. Frappe en priorité." + }, + "ancientPower": { + "name": "Pouvoir Antique", + "effect": "Une attaque préhistorique qui peut augmenter toutes les stats du lanceur d’un seul coup." + }, + "shadowBall": { + "name": "Ball’Ombre", + "effect": "Le lanceur projette une grande ombre sur la cible qui peut aussi faire baisser la Défense Spéciale de celle-ci." + }, + "futureSight": { + "name": "Prescience", + "effect": "De l’énergie psychique vient frapper la cible deux tours après l’utilisation de cette capacité." + }, + "rockSmash": { + "name": "Éclate-Roc", + "effect": "Le lanceur porte un coup de poing à la cible, ce qui peut baisser la Défense de celle-ci." + }, + "whirlpool": { + "name": "Siphon", + "effect": "Le lanceur piège la cible dans une trombe d’eau pendant quatre à cinq tours." + }, + "beatUp": { + "name": "Baston", + "effect": "Le lanceur appelle tous les Pokémon de son équipe à attaquer. Plus ils sont nombreux, plus il y a d’attaques." + }, + "fakeOut": { + "name": "Bluff", + "effect": "Le lanceur frappe en priorité et apeure la cible. La capacité ne fonctionne que si elle est utilisée immédiatement en entrant au combat." + }, + "uproar": { + "name": "Brouhaha", + "effect": "Le lanceur attaque en rugissant durant trois tours. Pendant ce temps, aucun Pokémon ne peut s’endormir." + }, + "stockpile": { + "name": "Stockage", + "effect": "Le lanceur emmagasine de l’énergie et augmente sa Défense et sa Défense Spéciale. Peut être utilisée trois fois." + }, + "spitUp": { + "name": "Relâche", + "effect": "Libère dans une attaque l’énergie précédemment emmagasinée avec Stockage. La puissance augmente en fonction du nombre de fois où Stockage a été utilisée." + }, + "swallow": { + "name": "Avale", + "effect": "Le lanceur absorbe l’énergie emmagasinée avec Stockage pour restaurer ses PV. Le nombre de PV soignés augmente en fonction du nombre de fois où Stockage a été utilisée." + }, + "heatWave": { + "name": "Canicule", + "effect": "Le lanceur provoque une vague de chaleur qui peut aussi bruler la cible (10% de chances)." + }, + "hail": { + "name": "Grêle", + "effect": "Invoque une tempête de grêle qui dure cinq tours. Ne blesse pas les Pokémon de type Glace." + }, + "torment": { + "name": "Tourmente", + "effect": "Le lanceur irrite la cible pour l’empêcher d’utiliser la même capacité deux fois de suite." + }, + "flatter": { + "name": "Flatterie", + "effect": "Rend la cible confuse, mais augmente son Attaque Spéciale." + }, + "willOWisp": { + "name": "Feu Follet", + "effect": "Le lanceur projette des flammes maléfiques à la cible pour lui infliger une brulure." + }, + "memento": { + "name": "Souvenir", + "effect": "Le lanceur est mis K.O., mais l’Attaque et l’Attaque Spéciale de la cible baissent beaucoup." + }, + "facade": { + "name": "Façade", + "effect": "Une capacité dont la puissance double lorsque le lanceur est empoisonné, paralysé ou brulé." + }, + "focusPunch": { + "name": "Mitra-Poing", + "effect": "Le lanceur se concentre avant d’attaquer. Échoue s’il est touché avant d’avoir frappé." + }, + "smellingSalts": { + "name": "Stimulant", + "effect": "Cette attaque est doublement efficace sur les Pokémon paralysés, mais elle soigne leur paralysie." + }, + "followMe": { + "name": "Par Ici", + "effect": "Le lanceur attire l’attention des cibles présentes pour les forcer à n’attaquer que le lanceur." + }, + "naturePower": { + "name": "Force Nature", + "effect": "Une attaque qui tire sa force de la nature. Son type varie selon le terrain." + }, + "charge": { + "name": "Chargeur", + "effect": "Le lanceur se charge en électricité, ce qui augmente la puissance de la prochaine capacité Électrik qu’il utilisera. Sa Défense Spéciale augmente également." + }, + "taunt": { + "name": "Provoc", + "effect": "Le lanceur provoque la cible, ce qui oblige celle-ci à n’utiliser que des capacités qui infligent des dégâts pendant trois tours." + }, + "helpingHand": { + "name": "Coup d’Main", + "effect": "Le lanceur donne un coup de main à son allié, qui voit la puissance de ses capacités augmenter." + }, + "trick": { + "name": "Tour de Magie", + "effect": "Le lanceur prend la cible au dépourvu et l’oblige à échanger son objet contre le sien." + }, + "rolePlay": { + "name": "Imitation", + "effect": "Imite la cible et copie son talent." + }, + "wish": { + "name": "Vœu", + "effect": "Un vœu qui permet au lanceur ou au Pokémon entrant sur le terrain au tour suivant de récupérer la moitié des PV max du lanceur." + }, + "assist": { + "name": "Assistance", + "effect": "Le lanceur se dépêche d’utiliser une capacité au hasard parmi celles des Pokémon de l’équipe." + }, + "ingrain": { + "name": "Racines", + "effect": "Le lanceur plante ses racines et récupère des PV à chaque tour. Une fois enraciné, il ne peut plus fuir." + }, + "superpower": { + "name": "Surpuissance", + "effect": "Une attaque puissante, mais qui baisse l’Attaque et la Défense du lanceur." + }, + "magicCoat": { + "name": "Reflet Magik", + "effect": "Une barrière qui renvoie les capacités comme Vampigraine et celles affectant le statut et les stats." + }, + "recycle": { + "name": "Recyclage", + "effect": "Recycle un objet tenu à usage unique déjà utilisé lors du combat pour pouvoir l’utiliser à nouveau." + }, + "revenge": { + "name": "Vendetta", + "effect": "Une attaque deux fois plus puissante si le lanceur a été blessé par l’ennemi durant ce tour." + }, + "brickBreak": { + "name": "Casse-Brique", + "effect": "Le lanceur attaque avec le tranchant de la main. Permet aussi de briser les barrières comme Mur Lumière et Protection." + }, + "yawn": { + "name": "Bâillement", + "effect": "Le lanceur fait bâiller la cible, qui s’endort au tour suivant." + }, + "knockOff": { + "name": "Sabotage", + "effect": "Fait plus de dégâts aux cibles qui tiennent un objet. De plus, fait tomber cet objet et empêche la cible de l’utiliser jusqu’à la fin du combat." + }, + "endeavor": { + "name": "Effort", + "effect": "Une attaque qui réduit les PV de la cible au niveau des PV du lanceur." + }, + "eruption": { + "name": "Éruption", + "effect": "Le lanceur laisse exploser sa colère. Plus ses PV sont bas, moins l’attaque est puissante." + }, + "skillSwap": { + "name": "Échange", + "effect": "Le lanceur utilise ses pouvoirs psychiques pour échanger son talent avec la cible." + }, + "imprison": { + "name": "Possessif", + "effect": "Si la cible et le lanceur ont des capacités en commun, la cible ne pourra pas les utiliser." + }, + "refresh": { + "name": "Régénération", + "effect": "Le lanceur se repose pour guérir d’un empoisonnement, d’une brulure ou d’une paralysie." + }, + "grudge": { + "name": "Rancune", + "effect": "Si le lanceur est mis K.O., sa rancune épuise les PP de la capacité utilisée par l’ennemi pour le mettre K.O." + }, + "snatch": { + "name": "Saisie", + "effect": "Lorsqu’une capacité de soin ou de changement de stats est utilisée, le lanceur vole ses effets." + }, + "secretPower": { + "name": "Force Cachée", + "effect": "Les effets de cette attaque varient en fonction de l’environnement." + }, + "dive": { + "name": "Plongée", + "effect": "Le lanceur plonge sous l’eau au premier tour et frappe au second." + }, + "armThrust": { + "name": "Cogne", + "effect": "Un déluge de coups adressés avec la paume qui frappe de deux à cinq fois d’affilée." + }, + "camouflage": { + "name": "Camouflage", + "effect": "Modifie le type du lanceur en fonction du terrain, comme une berge, une grotte, l’herbe, etc." + }, + "tailGlow": { + "name": "Lumi-Queue", + "effect": "Le lanceur regarde un flash lumineux fixement. Augmente énormément son Attaque Spéciale." + }, + "lusterPurge": { + "name": "Lumi-Éclat", + "effect": "Le lanceur libère un éclair lumineux. Peut aussi baisser la Défense Spéciale de l’ennemi." + }, + "mistBall": { + "name": "Ball’Brume", + "effect": "Une bulle de brume inflige des dégâts à l’ennemi. Peut aussi réduire son Attaque Spéciale." + }, + "featherDance": { + "name": "Danse Plumes", + "effect": "Une montagne de plumes ensevelit la cible et réduit beaucoup son Attaque." + }, + "teeterDance": { + "name": "Danse Folle", + "effect": "Danse qui rend confus tous les Pokémon autour du lanceur." + }, + "blazeKick": { + "name": "Pied Bruleur", + "effect": "Le lanceur envoie un coup de pied au taux de critiques élevé. Peut aussi bruler la cible (10% de chances)." + }, + "mudSport": { + "name": "Lance-Boue", + "effect": "Asperge les alentours de boue. Affaiblit les capacités Électrik pendant cinq tours." + }, + "iceBall": { + "name": "Ball’Glace", + "effect": "Frappe l’ennemi pendant cinq tours. L’attaque gagne en puissance à chaque coup." + }, + "needleArm": { + "name": "Poing Dard", + "effect": "Le lanceur attaque en fouettant l’ennemi de ses bras épineux. Peut aussi l’apeurer (30% de chances)." + }, + "slackOff": { + "name": "Paresse", + "effect": "Le lanceur se tourne les pouces et récupère jusqu’à la moitié de ses PV max." + }, + "hyperVoice": { + "name": "Mégaphone", + "effect": "Le lanceur pousse un cri dont l’écho terrifiant a le pouvoir d’infliger des dégâts à la cible." + }, + "poisonFang": { + "name": "Crochet Venin", + "effect": "Le lanceur mord la cible avec ses crocs toxiques, ce qui peut aussi l’empoisonner gravement (50% de chances)." + }, + "crushClaw": { + "name": "Éclate Griffe", + "effect": "Le lanceur lacère la cible avec des griffes solides et aiguisées, ce qui peut aussi baisser la Défense de celle-ci." + }, + "blastBurn": { + "name": "Rafale Feu", + "effect": "Une explosion ardente consume la cible. Le lanceur doit se reposer au tour suivant." + }, + "hydroCannon": { + "name": "Hydroblast", + "effect": "Le lanceur projette un missile d’eau sur la cible, mais il doit se reposer au tour suivant." + }, + "meteorMash": { + "name": "Poing Météore", + "effect": "Un coup de poing lancé à la vitesse d’un météore. Peut aussi augmenter l’Attaque du lanceur." + }, + "astonish": { + "name": "Étonnement", + "effect": "Le lanceur attaque la cible en poussant un cri terrifiant qui peut aussi l’apeurer (30% de chances)." + }, + "weatherBall": { + "name": "Ball’Météo", + "effect": "Une capacité dont la puissance et le type varient en fonction du temps qu’il fait." + }, + "aromatherapy": { + "name": "Aromathérapie", + "effect": "Le lanceur libère un parfum apaisant qui guérit tous les problèmes de statut de l’équipe." + }, + "fakeTears": { + "name": "Croco Larme", + "effect": "Le lanceur fait semblant de pleurer pour troubler la cible et beaucoup baisser sa Défense Spéciale." + }, + "airCutter": { + "name": "Tranch’Air", + "effect": "Le lanceur appelle des vents tranchants qui lacèrent la cible. Taux de critiques élevé." + }, + "overheat": { + "name": "Surchauffe", + "effect": "Le lanceur attaque la cible à pleine puissance, mais le contrecoup baisse beaucoup l’Attaque Spéciale du lanceur." + }, + "odorSleuth": { + "name": "Flair", + "effect": "Permet de toucher un Pokémon Spectre avec n’importe quelle capacité ou de toucher un ennemi insaisissable." + }, + "rockTomb": { + "name": "Tomberoche", + "effect": "Des rochers frappent la cible et baissent sa Vitesse." + }, + "silverWind": { + "name": "Vent Argenté", + "effect": "Vent qui projette des écailles poudreuses sur l’ennemi. Peut aussi monter toutes les stats du lanceur." + }, + "metalSound": { + "name": "Strido-Son", + "effect": "Un cri horrible tel un crissement métallique qui réduit beaucoup la Défense Spéciale de la cible." + }, + "grassWhistle": { + "name": "Siffl’Herbe", + "effect": "Le lanceur joue une douce mélodie qui plonge l’ennemi dans un profond sommeil." + }, + "tickle": { + "name": "Chatouille", + "effect": "Le lanceur chatouille la cible, ce qui baisse son Attaque et sa Défense." + }, + "cosmicPower": { + "name": "Force Cosmique", + "effect": "Le lanceur absorbe un pouvoir mystique spatial qui augmente sa Défense et sa Défense Spéciale." + }, + "waterSpout": { + "name": "Giclédo", + "effect": "Le lanceur attaque avec un jet d’eau. Moins il a de PV et moins l’attaque est puissante." + }, + "signalBeam": { + "name": "Rayon Signal", + "effect": "Le lanceur projette un rayon de lumière sinistre. Peut aussi rendre l’ennemi confus." + }, + "shadowPunch": { + "name": "Poing Ombre", + "effect": "Le lanceur se fond dans les ombres pour porter un coup de poing. N’échoue jamais." + }, + "extrasensory": { + "name": "Extrasenseur", + "effect": "Le lanceur attaque avec un pouvoir étrange et invisible qui peut aussi apeurer la cible (10% de chances)." + }, + "skyUppercut": { + "name": "Stratopercut", + "effect": "Le lanceur attaque avec un uppercut. Il envoie son poing vers le ciel de toutes ses forces." + }, + "sandTomb": { + "name": "Tourbi-Sable", + "effect": "Le lanceur emprisonne la cible dans une tempête de sable terrifiante qui dure de quatre à cinq tours." + }, + "sheerCold": { + "name": "Glaciation", + "effect": "Une vague de froid glacial frappe la cible pour la mettre K.O. en un coup. Cela a peu de chances de réussir si le lanceur ne possède pas le type Glace." + }, + "muddyWater": { + "name": "Ocroupi", + "effect": "Le lanceur attaque en projetant de l’eau boueuse. Peut aussi réduire la Précision de la cible." + }, + "bulletSeed": { + "name": "Balle Graine", + "effect": "Le lanceur mitraille la cible avec une rafale de graines. De deux à cinq rafales sont lancées à la suite." + }, + "aerialAce": { + "name": "Aéropique", + "effect": "Le lanceur prend la cible de vitesse et la lacère. N’échoue jamais." + }, + "icicleSpear": { + "name": "Stalactite", + "effect": "Le lanceur jette des pics de glace sur la cible, de deux à cinq fois de suite." + }, + "ironDefense": { + "name": "Mur de Fer", + "effect": "L’épiderme du lanceur devient dur comme du fer, ce qui augmente beaucoup sa Défense." + }, + "block": { + "name": "Barrage", + "effect": "Le lanceur bloque la route de la cible pour empêcher sa fuite." + }, + "howl": { + "name": "Grondement", + "effect": "Le lanceur pousse un grand cri d’encouragement, ce qui augmente son Attaque et celle de ses alliés." + }, + "dragonClaw": { + "name": "Draco-Griffe", + "effect": "Le lanceur lacère la cible de ses grandes griffes aiguisées." + }, + "frenzyPlant": { + "name": "Végé-Attaque", + "effect": "Un violent coup de racines s’abat sur la cible. Le lanceur doit se reposer au tour suivant." + }, + "bulkUp": { + "name": "Gonflette", + "effect": "Le lanceur tend ses muscles pour se gonfler, ce qui booste son Attaque et sa Défense." + }, + "bounce": { + "name": "Rebond", + "effect": "Le lanceur bondit très haut et plonge sur la cible au second tour, ce qui peut aussi la paralyser (30% de chances)." + }, + "mudShot": { + "name": "Tir de Boue", + "effect": "Le lanceur attaque en projetant de la boue sur la cible, ce qui réduit aussi la Vitesse de celle-ci." + }, + "poisonTail": { + "name": "Queue-Poison", + "effect": "Le lanceur attaque la cible avec sa queue, ce qui peut aussi l’empoisonner (10% de chances). Taux de critiques élevés." + }, + "covet": { + "name": "Implore", + "effect": "Le lanceur s’approche de la cible avec un air angélique afin de dérober l’objet qu’elle tient." + }, + "voltTackle": { + "name": "Électacle", + "effect": "Le lanceur électrifie son corps avant de charger. Le choc blesse aussi gravement le lanceur et peut paralyser la cible (10% de chances)." + }, + "magicalLeaf": { + "name": "Feuille Magik", + "effect": "Le lanceur disperse d’étranges feuilles qui poursuivent la cible. N’échoue jamais." + }, + "waterSport": { + "name": "Tourniquet", + "effect": "Asperge d’eau les alentours. Affaiblit les capacités de type Feu pendant cinq tours." + }, + "calmMind": { + "name": "Plénitude", + "effect": "Le lanceur se concentre et fait le vide dans son esprit pour augmenter son Attaque Spéciale et sa Défense Spéciale." + }, + "leafBlade": { + "name": "Lame Feuille", + "effect": "Une feuille coupante comme une lame entaille la cible. Taux de critiques élevé." + }, + "dragonDance": { + "name": "Danse Draco", + "effect": "Une danse mystique dont le rythme effréné augmente l’Attaque et la Vitesse du lanceur." + }, + "rockBlast": { + "name": "Boule Roc", + "effect": "Le lanceur projette un rocher sur la cible de deux à cinq fois d’affilée." + }, + "shockWave": { + "name": "Onde de Choc", + "effect": "Le lanceur envoie un choc électrique rapide à la cible. N’échoue jamais." + }, + "waterPulse": { + "name": "Vibraqua", + "effect": "Le lanceur projette une aura aquatique sur la cible, et peut la rendre confuse." + }, + "doomDesire": { + "name": "Vœu Destructeur", + "effect": "Le lanceur génère une sphère lumineuse qu’il projette sur l’ennemi deux tours plus tard." + }, + "psychoBoost": { + "name": "Psycho-Boost", + "effect": "Attaque l’ennemi à pleine puissance. Le contrecoup baisse beaucoup l’Attaque Spéciale du lanceur." + }, + "roost": { + "name": "Atterrissage", + "effect": "Le lanceur atterrit et se repose. Restaure jusqu’à la moitié de ses PV max." + }, + "gravity": { + "name": "Gravité", + "effect": "Pendant cinq tours, les Pokémon Vol ou qui ont Lévitation deviennent sensibles aux capacités Sol, et les capacités volantes deviennent inutilisables." + }, + "miracleEye": { + "name": "Œil Miracle", + "effect": "Permet de toucher un Pokémon Ténèbres avec les capacités de type Psy ou de toucher un ennemi ayant beaucoup d’esquive." + }, + "wakeUpSlap": { + "name": "Réveil Forcé", + "effect": "Cette attaque inflige d’importants dégâts à un Pokémon endormi. Mais elle le réveille également." + }, + "hammerArm": { + "name": "Marto-Poing", + "effect": "Le lanceur donne un puissant coup de poing à la cible, ce qui réduit la Vitesse du lanceur." + }, + "gyroBall": { + "name": "Gyroballe", + "effect": "Le lanceur effectue une rotation rapide et frappe la cible. Plus la Vitesse du lanceur est basse par rapport à celle de la cible, plus il inflige de dégâts." + }, + "healingWish": { + "name": "Vœu Soin", + "effect": "Le lanceur tombe K.O. pour soigner les altérations de statut et les PV du Pokémon qui viendra le remplacer sur le terrain." + }, + "brine": { + "name": "Saumure", + "effect": "La puissance de cette capacité est doublée lorsque la cible a moins de la moitié de ses PV." + }, + "naturalGift": { + "name": "Don Naturel", + "effect": "Avant d’attaquer, le lanceur rassemble ses forces grâce à sa Baie. Elle détermine le type et la puissance de l’attaque." + }, + "feint": { + "name": "Ruse", + "effect": "Une attaque capable de toucher une cible qui utilise une capacité similaire à Détection ou Abri, et annule l’effet de cette capacité." + }, + "pluck": { + "name": "Picore", + "effect": "Le lanceur picore la cible. Si cette dernière tient une Baie, le lanceur la mange et profite de ses effets." + }, + "tailwind": { + "name": "Vent Arrière", + "effect": "Génère une rafale de vent qui augmente la Vitesse des Pokémon de l’équipe pendant quatre tours." + }, + "acupressure": { + "name": "Acupression", + "effect": "Le lanceur utilise sa connaissance des points de pression pour beaucoup augmenter une stat." + }, + "metalBurst": { + "name": "Fulmifer", + "effect": "Le lanceur contre-attaque avec un coup infligeant des dégâts supérieurs à ceux de la dernière capacité qui l’a blessé." + }, + "uTurn": { + "name": "Demi-Tour", + "effect": "Après son attaque, le lanceur revient à toute vitesse et change de place avec un Pokémon de l’équipe prêt à combattre." + }, + "closeCombat": { + "name": "Close Combat", + "effect": "Le lanceur ne pense plus à se protéger et frappe sa cible violemment au corps à corps. Cette capacité baisse la Défense et la Défense Spéciale du lanceur." + }, + "payback": { + "name": "Représailles", + "effect": "Le lanceur charge son énergie, puis attaque. La puissance de la capacité est doublée si le lanceur agit après la cible." + }, + "assurance": { + "name": "Assurance", + "effect": "La puissance de cette capacité est deux fois plus élevée si la cible a déjà été blessée durant ce tour." + }, + "embargo": { + "name": "Embargo", + "effect": "Empêche la cible d’utiliser un objet tenu et son Dresseur d’utiliser un objet sur lui pendant cinq tours." + }, + "fling": { + "name": "Dégommage", + "effect": "Le lanceur envoie l’objet qu’il tient sur la cible. La puissance et les effets dépendent de l’objet." + }, + "psychoShift": { + "name": "Échange Psy", + "effect": "Le lanceur transfère ses problèmes de statut à l’ennemi grâce à son pouvoir de suggestion." + }, + "trumpCard": { + "name": "Atout", + "effect": "Moins cette capacité possède de PP, plus elle est puissante." + }, + "healBlock": { + "name": "Anti-Soin", + "effect": "Le lanceur empêche l’ennemi de récupérer des PV à l’aide de capacités, talents ou objets tenus, pendant cinq tours." + }, + "wringOut": { + "name": "Essorage", + "effect": "Le lanceur essore l’ennemi. Plus l’ennemi a de PV, plus cette attaque est puissante." + }, + "powerTrick": { + "name": "Astuce Force", + "effect": "Le lanceur utilise ses pouvoirs psychiques pour échanger sa Défense et son Attaque." + }, + "gastroAcid": { + "name": "Suc Digestif", + "effect": "Le lanceur répand ses sucs digestifs sur la cible. Le fluide neutralise le talent de celle-ci." + }, + "luckyChant": { + "name": "Air Veinard", + "effect": "Le lanceur envoie une incantation vers le ciel et protège l’équipe des coups critiques pendant cinq tours." + }, + "meFirst": { + "name": "Moi d’Abord", + "effect": "Le lanceur vole la capacité prévue par l’ennemi et l’utilise en faisant plus de dégâts. Il doit frapper en premier." + }, + "copycat": { + "name": "Photocopie", + "effect": "Le lanceur imite la dernière capacité employée. Échoue si aucune capacité n’a été utilisée." + }, + "powerSwap": { + "name": "Permuforce", + "effect": "Le lanceur utilise un pouvoir psychique qui échange les changements de son Attaque et de son Attaque Spéciale avec celles de la cible." + }, + "guardSwap": { + "name": "Permugarde", + "effect": "Le lanceur utilise un pouvoir psychique qui échange les changements de sa Défense et de sa Défense Spéciale avec celles de la cible." + }, + "punishment": { + "name": "Punition", + "effect": "Plus l’ennemi a utilisé d’augmentations de stats et plus cette capacité est puissante." + }, + "lastResort": { + "name": "Dernier Recours", + "effect": "Cette capacité ne peut être utilisée qu’après que le lanceur a utilisé toutes les autres." + }, + "worrySeed": { + "name": "Soucigraine", + "effect": "Plante sur la cible une graine qui la rend soucieuse et remplace son talent par Insomnia, l’empêchant ainsi de dormir." + }, + "suckerPunch": { + "name": "Coup Bas", + "effect": "Permet au lanceur de frapper en priorité. Échoue si la cible ne prépare pas une attaque." + }, + "toxicSpikes": { + "name": "Pics Toxik", + "effect": "Le lanceur éparpille des pics autour de la cible, ce qui empoisonne les Pokémon entrant au combat de ce côté." + }, + "heartSwap": { + "name": "Permucœur", + "effect": "Le lanceur utilise un pouvoir psychique pour échanger ses changements de stats avec la cible." + }, + "aquaRing": { + "name": "Anneau Hydro", + "effect": "Un voile d’eau recouvre le lanceur et régénère ses PV à chaque tour." + }, + "magnetRise": { + "name": "Vol Magnétik", + "effect": "Le lanceur utilise l’électricité pour générer un champ magnétique et léviter durant cinq tours." + }, + "flareBlitz": { + "name": "Boutefeu", + "effect": "Le lanceur s’embrase avant de charger la cible, ce qui peut la bruler (10% de chances). Le choc blesse aussi gravement le lanceur." + }, + "forcePalm": { + "name": "Forte-Paume", + "effect": "Une onde de choc frappe la cible, ce qui peut aussi la paralyser (30% de chances)." + }, + "auraSphere": { + "name": "Aurasphère", + "effect": "Le lanceur puise au fond de lui-même pour dégager une aura et projeter de l’énergie sur la cible. N’échoue jamais." + }, + "rockPolish": { + "name": "Poliroche", + "effect": "Le lanceur polit son corps pour diminuer sa résistance au vent. Augmente beaucoup la Vitesse." + }, + "poisonJab": { + "name": "Direct Toxik", + "effect": "Le lanceur attaque la cible avec un tentacule, un bras, ou un autre membre imprégné de poison, ce qui peut aussi empoisonner la cible (30% de chances)." + }, + "darkPulse": { + "name": "Vibrobscur", + "effect": "Le lanceur projette une horrible aura chargée de pensées maléfiques, ce qui peut aussi apeurer la cible." + }, + "nightSlash": { + "name": "Tranche-Nuit", + "effect": "Le lanceur lacère la cible à la première occasion. Taux de critiques élevé." + }, + "aquaTail": { + "name": "Hydro-Queue", + "effect": "Le lanceur attaque en balançant sa queue comme une lame de fond en pleine tempête." + }, + "seedBomb": { + "name": "Canon Graine", + "effect": "Le lanceur déclenche un déluge de grosses graines à la coque solide sur la cible." + }, + "airSlash": { + "name": "Lame d’Air", + "effect": "Le lanceur attaque avec une lame d’air capable de fendre le ciel, ce qui peut aussi apeurer la cible (30% de chances)." + }, + "xScissor": { + "name": "Plaie Croix", + "effect": "Le lanceur taillade la cible en utilisant ses faux ou ses griffes comme une paire de ciseaux." + }, + "bugBuzz": { + "name": "Bourdon", + "effect": "Le lanceur fait vibrer son corps pour lancer une vague sonique, ce qui peut aussi baisser la Défense Spéciale de la cible." + }, + "dragonPulse": { + "name": "Draco-Choc", + "effect": "Le lanceur ouvre la bouche pour projeter une aura qui frappe la cible." + }, + "dragonRush": { + "name": "Draco-Charge", + "effect": "Le lanceur frappe la cible en prenant un air menaçant, ce qui peut aussi l’apeurer (20% de chances)." + }, + "powerGem": { + "name": "Rayon Gemme", + "effect": "Le lanceur attaque avec un rayon de lumière qui scintille comme s’il était composé de gemmes." + }, + "drainPunch": { + "name": "Vampi-Poing", + "effect": "Un coup de poing qui draine l’énergie. Convertit la moitié des dégâts infligés en PV pour le lanceur." + }, + "vacuumWave": { + "name": "Onde Vide", + "effect": "Le lanceur agite son poing pour projeter une onde de vide. Frappe en priorité." + }, + "focusBlast": { + "name": "Exploforce", + "effect": "Le lanceur rassemble ses forces et laisse éclater son pouvoir, ce qui peut aussi baisser la Défense Spéciale de la cible." + }, + "energyBall": { + "name": "Éco-Sphère", + "effect": "Le lanceur utilise les pouvoirs de la nature pour attaquer la cible, ce qui peut aussi baisser la Défense Spéciale de celle-ci." + }, + "braveBird": { + "name": "Rapace", + "effect": "Le lanceur replie ses ailes et charge en rase-mottes. Blesse gravement le lanceur." + }, + "earthPower": { + "name": "Telluriforce", + "effect": "De terribles séismes secouent la cible et peuvent aussi baisser sa Défense Spéciale." + }, + "switcheroo": { + "name": "Passe-Passe", + "effect": "Le lanceur échange son objet avec celui de la cible à une vitesse que l’œil a du mal à suivre." + }, + "gigaImpact": { + "name": "Giga Impact", + "effect": "Le lanceur charge la cible de toute ses forces et doit ensuite se reposer au tour suivant." + }, + "nastyPlot": { + "name": "Machination", + "effect": "Stimule l’esprit par de mauvaises pensées. Augmente beaucoup l’Attaque Spéciale du lanceur." + }, + "bulletPunch": { + "name": "Pisto-Poing", + "effect": "Le lanceur envoie des coups de poing aussi rapides que des balles de revolver. Frappe en priorité." + }, + "avalanche": { + "name": "Avalanche", + "effect": "Une capacité dont la puissance est doublée si le lanceur a été blessé par la cible durant ce tour." + }, + "iceShard": { + "name": "Éclats Glace", + "effect": "Le lanceur crée des éclats de glace qu’il envoie sur la cible. Frappe en priorité." + }, + "shadowClaw": { + "name": "Griffe Ombre", + "effect": "Attaque avec une griffe puissante faite d’ombres. Taux de critiques élevé." + }, + "thunderFang": { + "name": "Crocs Éclair", + "effect": "Le lanceur utilise une morsure électrifiée qui peut aussi paralyser (10% de chances) ou apeurer la cible (10% de chances)." + }, + "iceFang": { + "name": "Crocs Givre", + "effect": "Le lanceur utilise une morsure glaciale qui peut aussi geler (10% de chances) ou apeurer la cible (10% de chances)." + }, + "fireFang": { + "name": "Crocs Feu", + "effect": "Le lanceur utilise une morsure enflammée qui peut aussi bruler (10% de chances) ou apeurer (10% de chances) la cible." + }, + "shadowSneak": { + "name": "Ombre Portée", + "effect": "Le lanceur étend son ombre pour frapper par-derrière. Frappe en priorité." + }, + "mudBomb": { + "name": "Boue-Bombe", + "effect": "Le lanceur attaque à l’aide d’une boule de boue solidifiée. Peut aussi baisser la Précision de l’ennemi." + }, + "psychoCut": { + "name": "Coupe Psycho", + "effect": "Le lanceur entaille la cible grâce à des lames faites d’énergie psychique. Taux de critiques élevé." + }, + "zenHeadbutt": { + "name": "Psykoud’Boul", + "effect": "Le lanceur concentre sa volonté et donne un coup de tête à la cible, ce qui peut aussi apeurer celle-ci (20% de chances)." + }, + "mirrorShot": { + "name": "Miroi-Tir", + "effect": "Le corps poli du lanceur libère un éclair d’énergie. Peut aussi baisser la Précision de l’ennemi." + }, + "flashCannon": { + "name": "Luminocanon", + "effect": "Le lanceur concentre son énergie lumineuse et la fait exploser, ce qui peut aussi baisser la Défense Spéciale de la cible." + }, + "rockClimb": { + "name": "Escalade", + "effect": "Le lanceur se jette violemment sur l’ennemi. Peut aussi le rendre confus." + }, + "defog": { + "name": "Anti-Brume", + "effect": "Un grand coup de vent disperse Protection ou Mur Lumière de la cible et diminue également son Esquive." + }, + "trickRoom": { + "name": "Distorsion", + "effect": "Le lanceur crée une zone mystérieuse où les Pokémon les plus lents frappent en priorité pendant cinq tours." + }, + "dracoMeteor": { + "name": "Draco-Météore", + "effect": "Le lanceur invoque des comètes. Le contrecoup réduit beaucoup son Attaque Spéciale." + }, + "discharge": { + "name": "Coup d’Jus", + "effect": "Un flamboiement d’électricité frappe tous les Pokémon autour du lanceur. Peut aussi les paralyser (30% de chances)." + }, + "lavaPlume": { + "name": "Ébullilave", + "effect": "Des flammes s’abattent sur tous les Pokémon autour du lanceur, ce qui peut aussi les bruler (10% de chances)." + }, + "leafStorm": { + "name": "Tempête Verte", + "effect": "Invoque une tempête de feuilles acérées. Le contrecoup réduit beaucoup l’Attaque Spéciale du lanceur." + }, + "powerWhip": { + "name": "Mégafouet", + "effect": "Le lanceur fait virevolter violemment ses lianes ou ses tentacules pour fouetter la cible." + }, + "rockWrecker": { + "name": "Roc-Boulet", + "effect": "Le lanceur attaque en projetant un gros rocher sur l’ennemi. Il doit se reposer au tour suivant." + }, + "crossPoison": { + "name": "Poison Croix", + "effect": "Un coup tranchant qui peut empoisonner la cible (10% de chances). Taux de critiques élevé." + }, + "gunkShot": { + "name": "Détricanon", + "effect": "Le lanceur envoie des détritus sur la cible, ce qui peut aussi l’empoisonner (30% de chances)." + }, + "ironHead": { + "name": "Tête de Fer", + "effect": "Le lanceur heurte la cible avec sa tête dure comme de l’acier, ce qui peut aussi l’apeurer (30% de chances)." + }, + "magnetBomb": { + "name": "Bombe Aimant", + "effect": "Le lanceur projette des bombes d’acier qui collent à l’ennemi. N’échoue jamais." + }, + "stoneEdge": { + "name": "Lame de Roc", + "effect": "Le lanceur transperce la cible avec des rochers aiguisés. Taux de critiques élevé." + }, + "captivate": { + "name": "Séduction", + "effect": "Si l’ennemi est de sexe opposé au lanceur, il est séduit et son Attaque Spéciale baisse beaucoup." + }, + "stealthRock": { + "name": "Piège de Roc", + "effect": "Le lanceur fait flotter des pierres autour de la cible qui blessent tout adversaire entrant au combat." + }, + "grassKnot": { + "name": "Nœud Herbe", + "effect": "Le lanceur fait des nœuds dans l’herbe pour faire trébucher la cible. Plus la cible est lourde, plus la puissance de cette capacité augmente." + }, + "chatter": { + "name": "Babil", + "effect": "Attaque avec les ondes sonores assourdissantes qu’il émet en bavardant. Rend l’ennemi confus." + }, + "judgment": { + "name": "Jugement", + "effect": "Le lanceur libère une myriade de rayons de lumière. Le type varie selon la plaque que tient le lanceur." + }, + "bugBite": { + "name": "Piqure", + "effect": "Le lanceur pique la cible. Si celle-ci tient une Baie, le lanceur la dévore et obtient son effet." + }, + "chargeBeam": { + "name": "Rayon Chargé", + "effect": "Le lanceur tire un rayon chargé d’électricité. Peut aussi augmenter son Attaque Spéciale." + }, + "woodHammer": { + "name": "Martobois", + "effect": "Le lanceur heurte la cible de son corps robuste, ce qui blesse aussi gravement le lanceur." + }, + "aquaJet": { + "name": "Aqua-Jet", + "effect": "Le lanceur fonce sur la cible si rapidement qu’on parvient à peine à le discerner. Frappe en priorité." + }, + "attackOrder": { + "name": "Appel Attaque", + "effect": "Le lanceur appelle ses subalternes pour frapper la cible. Taux de critiques élevé." + }, + "defendOrder": { + "name": "Appel Défense", + "effect": "Le lanceur appelle ses subalternes pour former un bouclier qui augmente sa Défense et sa Défense Spéciale." + }, + "healOrder": { + "name": "Appel Soins", + "effect": "Le lanceur appelle ses sous-fifres pour le soigner. Il récupère jusqu’à la moitié de ses PV max." + }, + "headSmash": { + "name": "Fracass’Tête", + "effect": "Le lanceur assène un coup de tête désespéré, ce qui le blesse aussi très gravement." + }, + "doubleHit": { + "name": "Coup Double", + "effect": "Le lanceur frappe la cible deux fois d’affilée à l’aide de sa queue ou d’un autre membre." + }, + "roarOfTime": { + "name": "Hurle-Temps", + "effect": "Le lanceur frappe si fort qu’il affecte le cours du temps. Il se repose au tour suivant." + }, + "spacialRend": { + "name": "Spatio-Rift", + "effect": "Le lanceur déchire la cible et l’espace autour de lui. Taux de critiques élevé." + }, + "lunarDance": { + "name": "Danse Lune", + "effect": "Le lanceur tombe K.O. pour soigner totalement le Pokémon qui prendra sa place au combat." + }, + "crushGrip": { + "name": "Presse", + "effect": "Une force puissante écrase l’ennemi. Plus il lui reste de PV et plus l’attaque est puissante." + }, + "magmaStorm": { + "name": "Vortex Magma", + "effect": "La cible est prise dans un tourbillon de feu qui dure de quatre à cinq tours." + }, + "darkVoid": { + "name": "Trou Noir", + "effect": "L’ennemi est plongé dans les ténèbres. Il tombe dans un profond sommeil." + }, + "seedFlare": { + "name": "Fulmigraine", + "effect": "Le corps du lanceur émet une onde de choc. Peut aussi beaucoup baisser la Défense Spéciale de la cible." + }, + "ominousWind": { + "name": "Vent Mauvais", + "effect": "Le lanceur crée une violente bourrasque. Peut aussi augmenter toutes ses stats." + }, + "shadowForce": { + "name": "Revenant", + "effect": "Le lanceur disparait au premier tour et frappe la cible au deuxième. Cette capacité fonctionne même si la cible se protège." + }, + "honeClaws": { + "name": "Aiguisage", + "effect": "Le lanceur s’aiguise les griffes. Augmente l’Attaque et la Précision." + }, + "wideGuard": { + "name": "Garde Large", + "effect": "Bloque les attaques visant tous les alliés pendant un tour." + }, + "guardSplit": { + "name": "Partage Garde", + "effect": "Additionne la Défense et la Défense Spéciale du lanceur et de sa cible et les redistribue équitablement entre les deux." + }, + "powerSplit": { + "name": "Partage Force", + "effect": "Additionne l’Attaque Spéciale et l’Attaque du lanceur et de sa cible et les redistribue équitablement entre les deux." + }, + "wonderRoom": { + "name": "Zone Étrange", + "effect": "Le lanceur crée une zone mystérieuse où la Défense et la Défense Spéciale de tous les Pokémon sont inversées pendant cinq tours." + }, + "psyshock": { + "name": "Choc Psy", + "effect": "Le lanceur matérialise des ondes mystérieuses qu’il projette sur la cible, ce qui inflige des dégâts physiques à celle-ci." + }, + "venoshock": { + "name": "Choc Venin", + "effect": "Le lanceur asperge la cible d’un poison spécial. La puissance de la capacité est doublée si la cible est empoisonnée." + }, + "autotomize": { + "name": "Allègement", + "effect": "Le lanceur se débarrasse des parties inutiles de son corps. Son poids diminue et sa Vitesse augmente beaucoup." + }, + "ragePowder": { + "name": "Poudre Fureur", + "effect": "Le lanceur s’asperge d’une poudre irritante pour attirer l’attention et diriger toutes les attaques ennemies sur lui." + }, + "telekinesis": { + "name": "Lévikinésie", + "effect": "Un pouvoir qui fait flotter l’ennemi dans les airs. Pendant trois tours, il devient plus facile à atteindre." + }, + "magicRoom": { + "name": "Zone Magique", + "effect": "Le lanceur crée une zone mystérieuse où les objets tenus par tous les Pokémon n’ont plus aucun effet pendant cinq tours." + }, + "smackDown": { + "name": "Anti-Air", + "effect": "Le lanceur jette un projectile sur la cible. Si cette dernière vole, elle tombe au sol." + }, + "stormThrow": { + "name": "Yama Arashi", + "effect": "Un coup très puissant dont l’effet est toujours critique." + }, + "flameBurst": { + "name": "Rebondifeu", + "effect": "Quand l’attaque atteint sa cible, elle projette des flammes qui touchent tout ennemi situé à côté." + }, + "sludgeWave": { + "name": "Cradovague", + "effect": "Une vague de détritus attaque tous les Pokémon autour du lanceur. Peut aussi empoisonner (10% de chances)." + }, + "quiverDance": { + "name": "Papillodanse", + "effect": "Une danse mystique dont le rythme parfait augmente l’Attaque Spéciale, la Défense Spéciale et la Vitesse du lanceur." + }, + "heavySlam": { + "name": "Tacle Lourd", + "effect": "Le lanceur se jette sur la cible de tout son poids. Plus il est lourd par rapport à la cible, plus la puissance de cette capacité augmente." + }, + "synchronoise": { + "name": "Synchropeine", + "effect": "Des ondes mystérieuses blessent tous les Pokémon alentour qui sont du même type que le lanceur." + }, + "electroBall": { + "name": "Boule Élek", + "effect": "Le lanceur envoie une boule d’électricité. Plus la Vitesse du lanceur est élevée par rapport à celle de la cible, plus la puissance de la capacité augmente." + }, + "soak": { + "name": "Détrempage", + "effect": "Le lanceur projette beaucoup d’eau sur sa cible, qui devient de type Eau." + }, + "flameCharge": { + "name": "Nitrocharge", + "effect": "Le lanceur s’entoure de flammes pour attaquer la cible. Il se concentre et sa Vitesse augmente." + }, + "coil": { + "name": "Enroulement", + "effect": "Le lanceur s’enroule sur lui-même et se concentre. Son Attaque, sa Défense et sa Précision augmentent." + }, + "lowSweep": { + "name": "Balayette", + "effect": "Un coup rapide qui affecte la mobilité de la cible et diminue sa Vitesse." + }, + "acidSpray": { + "name": "Bombe Acide", + "effect": "Le lanceur projette un liquide acide qui fait fondre la cible, ce qui diminue beaucoup la Défense Spéciale de celle-ci." + }, + "foulPlay": { + "name": "Tricherie", + "effect": "Le lanceur utilise la force de la cible. Plus l’Attaque de celle-ci est élevée, plus le lanceur inflige de dégâts." + }, + "simpleBeam": { + "name": "Rayon Simple", + "effect": "Le lanceur envoie des ondes mystérieuses à la cible, dont le talent est remplacé par le talent Simple." + }, + "entrainment": { + "name": "Ten-Danse", + "effect": "Le lanceur danse sur un rythme étrange. Il force sa cible à l’imiter, ce qui lui fait adopter son talent." + }, + "afterYou": { + "name": "Après Vous", + "effect": "S’il est le premier à agir, le lanceur permet à sa cible d’utiliser une capacité juste après lui." + }, + "round": { + "name": "Chant Canon", + "effect": "Le lanceur attaque la cible en chantant. Si plusieurs Pokémon déclenchent cette attaque à la suite, la puissance augmente." + }, + "echoedVoice": { + "name": "Écho", + "effect": "Un cri retentissant blesse la cible. Si le lanceur ou d’autres Pokémon utilisent cette capacité à chaque tour, la puissance augmente." + }, + "chipAway": { + "name": "Attrition", + "effect": "Une attaque puissante quand l’ennemi baisse sa garde. Inflige des dégâts sans tenir compte des changements de stats." + }, + "clearSmog": { + "name": "Bain de Smog", + "effect": "Le lanceur projette de la boue bizarre sur la cible. Les changements de stats de la cible sont annulés." + }, + "storedPower": { + "name": "Force Ajoutée", + "effect": "Le lanceur attaque la cible avec une force cumulée. Plus les stats du lanceur sont augmentées, plus la puissance de cette capacité augmente." + }, + "quickGuard": { + "name": "Prévention", + "effect": "Protège le lanceur et ses alliés des attaques prioritaires." + }, + "allySwitch": { + "name": "Interversion", + "effect": "Le lanceur se téléporte à l’aide d’un pouvoir mystérieux. Il échange sa place avec celle d’un allié sur le terrain. Peut échouer si utilisée plusieurs fois de suite." + }, + "scald": { + "name": "Ébullition", + "effect": "Le lanceur projette un jet d’eau bouillante sur la cible, ce qui peut aussi la bruler (30% de chances)." + }, + "shellSmash": { + "name": "Exuviation", + "effect": "Le lanceur brise sa carapace. Il baisse sa Défense et sa Défense Spéciale, mais augmente beaucoup son Attaque, son Attaque Spéciale et sa Vitesse." + }, + "healPulse": { + "name": "Vibra Soin", + "effect": "Le lanceur projette une aura de bien-être qui fait récupérer la moitié de ses PV max à la cible." + }, + "hex": { + "name": "Châtiment", + "effect": "Une attaque acharnée qui cause davantage de dégâts à la cible si elle a une altération de statut." + }, + "skyDrop": { + "name": "Chute Libre", + "effect": "Le lanceur emmène l’ennemi dans les airs au premier tour et le lâche dans le vide au second. L’ennemi saisi ne peut pas attaquer." + }, + "shiftGear": { + "name": "Change-Vitesse", + "effect": "Le lanceur fait tourner ses engrenages. Cela augmente son Attaque et augmente beaucoup sa Vitesse." + }, + "circleThrow": { + "name": "Projection", + "effect": "Le lanceur fait une projection sur un Pokémon ennemi et le remplace par un autre. Lors d’un combat contre un Pokémon sauvage seul, cela met fin au combat." + }, + "incinerate": { + "name": "Calcination", + "effect": "Des flammes calcinent la cible. Si elle tient un objet, une Baie par exemple, celui-ci est brulé et devient inutilisable." + }, + "quash": { + "name": "À la Queue", + "effect": "Retient la cible de force, l’obligeant à agir en dernier." + }, + "acrobatics": { + "name": "Acrobatie", + "effect": "Le lanceur frappe la cible avec agilité. S’il ne tient pas d’objet, l’attaque inflige davantage de dégâts." + }, + "reflectType": { + "name": "Copie-Type", + "effect": "Le lanceur adopte le même type que la cible." + }, + "retaliate": { + "name": "Vengeance", + "effect": "Le lanceur venge un allié K.O. Si un Pokémon de l’équipe a été mis K.O. au tour d’avant, la puissance augmente." + }, + "finalGambit": { + "name": "Tout ou Rien", + "effect": "Une attaque très risquée. Le lanceur perd tous ses PV restants et inflige autant de dégâts à la cible." + }, + "bestow": { + "name": "Passe-Cadeau", + "effect": "Si la cible ne tient pas d’objet, le lanceur lui donne l’objet qu’il tient." + }, + "inferno": { + "name": "Feu d’Enfer", + "effect": "La cible est entourée d’un torrent de flammes ardentes qui la brulent." + }, + "waterPledge": { + "name": "Aire d’Eau", + "effect": "Une masse d’eau s’abat sur la cible. Si cette capacité est utilisée en même temps qu’Aire de Feu, la puissance augmente et un arc-en-ciel apparait." + }, + "firePledge": { + "name": "Aire de Feu", + "effect": "Une masse de feu s’abat sur la cible. Si cette capacité est utilisée en même temps qu’Aire d’Herbe, la puissance augmente et une mer de feu apparait." + }, + "grassPledge": { + "name": "Aire d’Herbe", + "effect": "Une masse végétale s’abat sur la cible. Si cette capacité est utilisée en même temps qu’Aire d’Eau, la puissance augmente et un marécage apparait." + }, + "voltSwitch": { + "name": "Change Éclair", + "effect": "Après son attaque, le lanceur revient à toute vitesse et change de place avec un Pokémon de l’équipe prêt au combat." + }, + "struggleBug": { + "name": "Survinsecte", + "effect": "Le lanceur frappe en se débattant de toutes ses forces, et baisse l’Attaque Spéciale de la cible." + }, + "bulldoze": { + "name": "Piétisol", + "effect": "Le lanceur piétine le sol et inflige des dégâts à tous les Pokémon autour de lui. Baisse aussi leur Vitesse." + }, + "frostBreath": { + "name": "Souffle Glacé", + "effect": "Un souffle froid blesse la cible. L’effet est toujours critique." + }, + "dragonTail": { + "name": "Draco-Queue", + "effect": "Un coup puissant qui blesse la cible et l’envoie au loin. Lors d’un combat contre un Pokémon sauvage seul, met fin au combat." + }, + "workUp": { + "name": "Rengorgement", + "effect": "Le lanceur se rengorge et augmente son Attaque et son Attaque Spéciale." + }, + "electroweb": { + "name": "Toile Élek", + "effect": "Le lanceur attaque la cible en l’attrapant dans un filet électrique. Baisse aussi la Vitesse de la cible." + }, + "wildCharge": { + "name": "Éclair Fou", + "effect": "Une charge électrique violente qui blesse aussi légèrement le lanceur." + }, + "drillRun": { + "name": "Tunnelier", + "effect": "Le lanceur tourne sur lui-même comme une perceuse et se jette sur la cible. Taux de critiques élevé." + }, + "dualChop": { + "name": "Double Baffe", + "effect": "Le lanceur frappe l’ennemi deux fois d’affilée avec les parties les plus robustes de son corps." + }, + "heartStamp": { + "name": "Crève-Cœur", + "effect": "Déconcentre l’ennemi avec des mouvements mignons avant de le frapper violemment. Peut aussi l’apeurer (30% de chances)." + }, + "hornLeech": { + "name": "Encornebois", + "effect": "Un coup de cornes qui draine l’énergie de la cible. La capacité convertit la moitié des dégâts infligés en PV pour le lanceur." + }, + "sacredSword": { + "name": "Lame Sainte", + "effect": "Un violent coup d’épée qui lacère la cible et lui inflige des dégâts en ignorant ses changements de stats." + }, + "razorShell": { + "name": "Coqui-Lame", + "effect": "Un coquillage aiguisé lacère la cible et peut aussi baisser sa Défense." + }, + "heatCrash": { + "name": "Tacle Feu", + "effect": "Le lanceur projette son corps enflammé contre la cible. Plus il est lourd par rapport à la cible, plus la puissance de cette capacité augmente." + }, + "leafTornado": { + "name": "Phytomixeur", + "effect": "L’ennemi est pris dans un tourbillon de feuilles acérées. Peut aussi baisser sa Précision." + }, + "steamroller": { + "name": "Bulldoboule", + "effect": "Le lanceur se roule en boule et écrase son ennemi. Peut aussi l’apeurer (30% de chances)." + }, + "cottonGuard": { + "name": "Cotogarde", + "effect": "Le lanceur se protège en s’emmitouflant dans du coton. Sa Défense augmente énormément." + }, + "nightDaze": { + "name": "Explonuit", + "effect": "Le lanceur attaque avec une onde de choc ténébreuse qui peut aussi baisser la Précision de la cible." + }, + "psystrike": { + "name": "Frappe Psy", + "effect": "Le lanceur matérialise des ondes mystérieuses qu’il projette sur la cible, ce qui inflige des dégâts physiques à celle-ci." + }, + "tailSlap": { + "name": "Plumo-Queue", + "effect": "Le lanceur frappe la cible de deux à cinq fois d’affilée avec sa queue robuste." + }, + "hurricane": { + "name": "Vent Violent", + "effect": "Le lanceur déclenche une tempête de vents violents qui s’abat sur la cible, et peut aussi la rendre confuse." + }, + "headCharge": { + "name": "Peignée", + "effect": "Le lanceur donne un coup avec sa tête couronnée d’une fière crinière. Blesse aussi légèrement le lanceur." + }, + "gearGrind": { + "name": "Lancécrou", + "effect": "Le lanceur jette deux écrous d’acier qui frappent l’ennemi deux fois d’affilée." + }, + "searingShot": { + "name": "Incendie", + "effect": "Des boules de feu s’abattent sur tous les Pokémon autour du lanceur. Peut aussi les bruler (30% de chances)." + }, + "technoBlast": { + "name": "Techno-Buster", + "effect": "Le lanceur projette un rayon lumineux sur l’ennemi. Le type varie selon le Module que tient le lanceur." + }, + "relicSong": { + "name": "Chant Antique", + "effect": "Le lanceur attaque la cible en lui chantant une chanson d’un autre temps qui peut aussi l’endormir." + }, + "secretSword": { + "name": "Lame Ointe", + "effect": "L’ennemi est lacéré par une longue corne. Son pouvoir mystérieux inflige des dégâts physiques." + }, + "glaciate": { + "name": "Ère Glaciaire", + "effect": "Un souffle de vent qui congèle tout sur son passage s’abat sur l’ennemi. Réduit aussi sa Vitesse." + }, + "boltStrike": { + "name": "Charge Foudre", + "effect": "Le lanceur s’enveloppe d’une charge électrique surpuissante et se jette sur l’ennemi. Peut aussi le paralyser (20% de chances)." + }, + "blueFlare": { + "name": "Flamme Bleue", + "effect": "De magnifiques et redoutables flammes bleues fondent sur l’ennemi. Peut aussi le bruler (20% de chances)." + }, + "fieryDance": { + "name": "Danse du Feu", + "effect": "Le lanceur s’enveloppe de flammes et attaque la cible, Cela peut aussi augmenter l’Attaque Spéciale du lanceur." + }, + "freezeShock": { + "name": "Éclair Gelé", + "effect": "Projette un bloc de glace électrifié sur l’ennemi au second tour. Peut aussi le paralyser (30% de chances)." + }, + "iceBurn": { + "name": "Feu Glacé", + "effect": "Au second tour, le lanceur projette un souffle de vent glacial dévastateur sur l’ennemi. Peut aussi le bruler (30% de chances)." + }, + "snarl": { + "name": "Aboiement", + "effect": "Le lanceur hurle sur la cible et baisse l’Attaque Spéciale de celle-ci." + }, + "icicleCrash": { + "name": "Chute Glace", + "effect": "Le lanceur envoie de gros blocs de glace sur la cible pour lui infliger des dégâts, ce qui peut aussi l’apeurer (30% de chances)." + }, + "vCreate": { + "name": "Coup Victoire", + "effect": "Le lanceur fait jaillir des flammes ardentes de son front et se jette sur la cible, ce qui baisse la Défense, la Défense Spéciale et la Vitesse du lanceur." + }, + "fusionFlare": { + "name": "Flamme Croix", + "effect": "Projette une boule de feu gigantesque. L’effet augmente sous l’influence d’Éclair Croix." + }, + "fusionBolt": { + "name": "Éclair Croix", + "effect": "Projette un orbe électrique gigantesque. L’effet augmente sous l’influence de Flamme Croix." + }, + "flyingPress": { + "name": "Flying Press", + "effect": "Une attaque en piqué depuis le ciel, à la fois de type Combat et de type Vol." + }, + "matBlock": { + "name": "Tatamigaeshi", + "effect": "Retourne un tatami pour bloquer, comme avec un bouclier, les capacités visant le lanceur ou ses alliés. N’a pas d’effet sur les attaques de statut." + }, + "belch": { + "name": "Éructation", + "effect": "Le lanceur se tourne vers la cible et lui éructe dessus, infligeant des dégâts. Ne fonctionne que si le lanceur consomme une Baie tenue." + }, + "rototiller": { + "name": "Fertilisation", + "effect": "Laboure le sol et le rend plus fertile. Augmente l’Attaque et l’Attaque Spéciale des Pokémon de type Plante." + }, + "stickyWeb": { + "name": "Toile Gluante", + "effect": "Le lanceur déploie une toile visqueuse autour de la cible qui ralentit la Vitesse de tout adversaire entrant au combat." + }, + "fellStinger": { + "name": "Dard Mortel", + "effect": "Le lanceur augmente énormément son Attaque si une cible est mise K.O. par cette capacité." + }, + "phantomForce": { + "name": "Hantise", + "effect": "Le lanceur disparait au premier tour et frappe au second. Cette attaque passe outre les protections." + }, + "trickOrTreat": { + "name": "Halloween", + "effect": "Insuffle à la cible l’esprit d’Halloween, et ajoute le type Spectre à ses types actuels." + }, + "nobleRoar": { + "name": "Râle Mâle", + "effect": "Le lanceur pousse un rugissement qui intimide la cible et diminue l’Attaque et l’Attaque Spéciale de celle-ci." + }, + "ionDeluge": { + "name": "Déluge Plasmique", + "effect": "Diffuse des particules saturées d’électricité qui transforment les capacités de type Normal en capacités de type Électrik." + }, + "parabolicCharge": { + "name": "Parabocharge", + "effect": "Inflige des dégâts à tous les Pokémon autour du lanceur. Il récupère en PV la moitié des dégâts infligés." + }, + "forestsCurse": { + "name": "Maléfice Sylvain", + "effect": "La cible est charmée par l’esprit de la forêt. Le type Plante est ajouté à ses types actuels." + }, + "petalBlizzard": { + "name": "Tempête Florale", + "effect": "Déclenche une violente tempête de fleurs qui inflige des dégâts à tous les Pokémon alentour." + }, + "freezeDry": { + "name": "Lyophilisation", + "effect": "Le lanceur refroidit violemment la cible et peut la geler (10% de chances). Super efficace sur les Pokémon de type Eau." + }, + "disarmingVoice": { + "name": "Voix Enjôleuse", + "effect": "Le lanceur laisse s’échapper une voix enchanteresse qui inflige des dégâts psychiques à la cible. N’échoue jamais." + }, + "partingShot": { + "name": "Dernier Mot", + "effect": "Le lanceur menace la cible dans une ultime tirade avant de changer de place avec un autre Pokémon. Réduit l’Attaque et l’Attaque Spéciale de la cible." + }, + "topsyTurvy": { + "name": "Renversement", + "effect": "Inverse tous les changements de stats de la cible." + }, + "drainingKiss": { + "name": "Vampibaiser", + "effect": "Le lanceur aspire la force vitale de la cible par un baiser qui rend au lanceur un nombre de PV supérieur ou égal à la moitié des dégâts infligés." + }, + "craftyShield": { + "name": "Vigilance", + "effect": "Utilise une force mystérieuse pour protéger l’équipe des capacités de statut. Ne protège pas des autres capacités." + }, + "flowerShield": { + "name": "Garde Florale", + "effect": "Grâce à une force mystérieuse, la Défense de tous les Pokémon Plante au combat augmente." + }, + "grassyTerrain": { + "name": "Champ Herbu", + "effect": "Pendant cinq tours, les Pokémon au sol récupèrent quelques PV à chaque tour et la puissance des capacités de type Plante augmente." + }, + "mistyTerrain": { + "name": "Champ Brumeux", + "effect": "Pendant cinq tours, les Pokémon au sol ne peuvent pas subir d’altération de statut et les dégâts infligés par les capacités de type Dragon sont divisés par deux." + }, + "electrify": { + "name": "Électrisation", + "effect": "Si le lanceur attaque avant la cible, les capacités de celle-ci seront de type Électrik jusqu’à la fin du tour." + }, + "playRough": { + "name": "Câlinerie", + "effect": "Le lanceur attaque la cible en lui faisant des câlineries, ce qui peut aussi diminuer l’Attaque de celle-ci." + }, + "fairyWind": { + "name": "Vent Féérique", + "effect": "Le lanceur déchaine un vent magique qui cingle la cible." + }, + "moonblast": { + "name": "Pouvoir Lunaire", + "effect": "Le lanceur attaque la cible grâce au pouvoir de la lune, ce qui peut diminuer l’Attaque Spéciale de celle-ci." + }, + "boomburst": { + "name": "Bang Sonique", + "effect": "Attaque les Pokémon alentour grâce à une onde sonore assourdissante qui détruit tout sur son passage." + }, + "fairyLock": { + "name": "Verrou Enchanté", + "effect": "Des chaines entourent la zone de combat, empêchant tous les Pokémon de quitter le terrain au tour suivant." + }, + "kingsShield": { + "name": "Bouclier Royal", + "effect": "Prend une posture défensive pour bloquer les dégâts. Diminue beaucoup l’Attaque de tout Pokémon qui entre en contact avec le lanceur." + }, + "playNice": { + "name": "Camaraderie", + "effect": "La cible se lie d’amitié avec le lanceur et perd sa combativité, ce qui diminue son Attaque." + }, + "confide": { + "name": "Confidence", + "effect": "Le lanceur dévoile des secrets à la cible, qui perd alors sa concentration et voit son Attaque Spéciale diminuer." + }, + "diamondStorm": { + "name": "Orage Adamantin", + "effect": "Provoque une tempête de diamants qui inflige des dégâts. Peut beaucoup augmenter la Défense du lanceur." + }, + "steamEruption": { + "name": "Jet de Vapeur", + "effect": "Le lanceur projette de la vapeur extrêmement chaude sur la cible, ce qui peut aussi la bruler (30% de chances)." + }, + "hyperspaceHole": { + "name": "TrouDimensionnel", + "effect": "Le lanceur crée une faille dimensionnelle pour attaquer soudainement la cible de côté. Ignore même les capacités comme Abri ou Détection." + }, + "waterShuriken": { + "name": "Sheauriken", + "effect": "Le lanceur attaque la cible avec des shuriken de mucus. Cette capacité frappe en priorité deux à cinq fois d’affilée en un tour." + }, + "mysticalFire": { + "name": "Feu Ensorcelé", + "effect": "Le lanceur attaque en soufflant des flammes brulantes par la bouche et diminue l’Attaque Spéciale de la cible." + }, + "spikyShield": { + "name": "Pico-Défense", + "effect": "Protège des attaques, et diminue les PV de tout assaillant qui entre en contact avec le lanceur." + }, + "aromaticMist": { + "name": "Brume Capiteuse", + "effect": "Grâce à un parfum mystérieux, augmente la Défense Spéciale d’un allié." + }, + "eerieImpulse": { + "name": "Ondes Étranges", + "effect": "Le corps du lanceur produit des ondes anormales qui enveloppent la cible et diminuent beaucoup son Attaque Spéciale." + }, + "venomDrench": { + "name": "Piège de Venin", + "effect": "Sécrète un liquide empoisonné. Diminue l’Attaque, l’Attaque Spéciale et la Vitesse de l’ennemi empoisonné." + }, + "powder": { + "name": "Nuée de Poudre", + "effect": "L’ennemi est pris dans un nuage de poudre. S’il utilise une capacité de type Feu lors du même tour, le nuage explose et lui inflige des dégâts." + }, + "geomancy": { + "name": "Géo-Contrôle", + "effect": "Le lanceur absorbe de l’énergie au premier tour et augmente beaucoup son Attaque Spéciale, sa Défense Spéciale et sa Vitesse au second." + }, + "magneticFlux": { + "name": "Magné-Contrôle", + "effect": "Manipule les champs magnétiques pour augmenter la Défense et la Défense Spéciale des Pokémon alliés dotés du talent Plus ou du talent Moins." + }, + "happyHour": { + "name": "Étrennes", + "effect": "Utilisée pendant un combat, multiplie par deux l’argent gagné à la fin." + }, + "electricTerrain": { + "name": "Champ Électrifié", + "effect": "Pendant cinq tours, le terrain se charge d’électricité. Les Pokémon au sol ne peuvent pas s’endormir et la puissance des capacités de type Électrik augmente." + }, + "dazzlingGleam": { + "name": "Éclat Magique", + "effect": "Le lanceur libère une puissante décharge lumineuse qui inflige des dégâts à l’ennemi." + }, + "celebrate": { + "name": "Célébration", + "effect": "Le Pokémon vous souhaite plein de bonnes choses pour cet évènement spécial." + }, + "holdHands": { + "name": "Mains Jointes", + "effect": "Le lanceur et un allié se prennent la main, ce qui les rend heureux." + }, + "babyDollEyes": { + "name": "Regard Touchant", + "effect": "Le lanceur fixe la cible d’un air très attendrissant qui la touche et diminue son Attaque. Agit en priorité." + }, + "nuzzle": { + "name": "Frotte-Frimousse", + "effect": "Le lanceur attaque en frottant ses bajoues chargées d’électricité, ce qui paralyse la cible." + }, + "holdBack": { + "name": "Retenue", + "effect": "Le lanceur attaque avec retenue, et laisse au moins 1 PV à la cible." + }, + "infestation": { + "name": "Harcèlement", + "effect": "Cette attaque perdure pendant quatre à cinq tours. La cible ne peut pas quitter le terrain pendant cette période." + }, + "powerUpPunch": { + "name": "Poing Boost", + "effect": "À force de frapper, les poings deviennent plus durs. Augmente l’Attaque du lanceur si l’ennemi est touché." + }, + "oblivionWing": { + "name": "Mort’Ailes", + "effect": "Vole l’énergie de la cible. Rend au lanceur un nombre de PV supérieur ou égal à la moitié des dégâts infligés." + }, + "thousandArrows": { + "name": "Myria-Flèches", + "effect": "Touche même les Pokémon dans les airs. Dans ce cas, la cible retombe au sol." + }, + "thousandWaves": { + "name": "Myria-Vagues", + "effect": "Attaque avec des vagues glissant au sol. L’ennemi pris dedans ne peut pas s’échapper." + }, + "landsWrath": { + "name": "Force Chtonienne", + "effect": "Utilise la puissance du sol et la concentre sur l’ennemi pour infliger des dégâts." + }, + "lightOfRuin": { + "name": "Lumière du Néant", + "effect": "Utilise la puissance de la fleur Éternelle pour lancer un formidable rayon d’énergie. Blesse aussi gravement le lanceur." + }, + "originPulse": { + "name": "Onde Originelle", + "effect": "Le lanceur projette une aura, et d’innombrables rayons lumineux d’un bleu étincelant s’abattent sur la cible." + }, + "precipiceBlades": { + "name": "Lame Pangéenne", + "effect": "Le Pokémon transforme la puissance de la terre et attaque la cible avec une lame acérée." + }, + "dragonAscent": { + "name": "Draco-Ascension", + "effect": "Le Pokémon s’abat à toute vitesse sur la cible depuis les hautes couches de l’atmosphère. Baisse la Défense et la Défense Spéciale du lanceur." + }, + "hyperspaceFury": { + "name": "Furie Dimension", + "effect": "Le Pokémon utilise sa multitude de bras pour infliger une nuée de coups qui ignorent les capacités telles qu’Abri ou Détection. Baisse la Défense du lanceur." + }, + "breakneckBlitzPhysical": { + "name": "Turbo-Charge Bulldozer", + "effect": "Le Pokémon utilise la Force Z pour s’élancer à toute vitesse sur l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "breakneckBlitzSpecial": { + "name": "Turbo-Charge Bulldozer", + "effect": "Dummy Data" + }, + "allOutPummelingPhysical": { + "name": "Combo Hyper-Furie", + "effect": "Le Pokémon utilise la Force Z pour créer une boule d’énergie qu’il projette sur l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "allOutPummelingSpecial": { + "name": "Combo Hyper-Furie", + "effect": "Dummy Data" + }, + "supersonicSkystrikePhysical": { + "name": "Piqué Supersonique", + "effect": "Le Pokémon utilise la Force Z pour s’envoler très haut dans le ciel avant de plonger sur l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "supersonicSkystrikeSpecial": { + "name": "Piqué Supersonique", + "effect": "Dummy Data" + }, + "acidDownpourPhysical": { + "name": "Déluge Causti-Toxique", + "effect": "Le Pokémon utilise la Force Z pour répandre un marécage empoisonné où l’adversaire sombre. La puissance varie selon celle de la capacité originale." + }, + "acidDownpourSpecial": { + "name": "Déluge Causti-Toxique", + "effect": "Dummy Data" + }, + "tectonicRagePhysical": { + "name": "Éruption Géo-Sismique", + "effect": "Le Pokémon utilise la Force Z pour entrainer l’adversaire dans les profondeurs de la terre. La puissance varie selon celle de la capacité originale." + }, + "tectonicRageSpecial": { + "name": "Éruption Géo-Sismique", + "effect": "Dummy Data" + }, + "continentalCrushPhysical": { + "name": "Apocalypse Gigalithique", + "effect": "Le Pokémon utilise la Force Z pour créer un immense rocher et écraser l’adversaire avec. La puissance varie selon celle de la capacité originale." + }, + "continentalCrushSpecial": { + "name": "Apocalypse Gigalithique", + "effect": "Dummy Data" + }, + "savageSpinOutPhysical": { + "name": "Cocon Fatal", + "effect": "Le Pokémon utilise la Force Z pour cracher de longs fils de soie et enserrer l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "savageSpinOutSpecial": { + "name": "Cocon Fatal", + "effect": "Dummy Data" + }, + "neverEndingNightmarePhysical": { + "name": "Appel des Ombres Éternelles", + "effect": "Le Pokémon utilise la Force Z pour invoquer des esprits rancuniers qui s’abattent sur l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "neverEndingNightmareSpecial": { + "name": "Appel des Ombres Éternelles", + "effect": "Dummy Data" + }, + "corkscrewCrashPhysical": { + "name": "Vrille Maximum", + "effect": "Le Pokémon utilise la Force Z pour tourner à toute vitesse et écraser l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "corkscrewCrashSpecial": { + "name": "Vrille Maximum", + "effect": "Dummy Data" + }, + "infernoOverdrivePhysical": { + "name": "Pyro-Explosion Cataclysmique", + "effect": "Le Pokémon utilise la Force Z pour cracher une boule de feu qui réduit l’adversaire en cendres. La puissance varie selon celle de la capacité originale." + }, + "infernoOverdriveSpecial": { + "name": "Pyro-Explosion Cataclysmique", + "effect": "Dummy Data" + }, + "hydroVortexPhysical": { + "name": "Super Tourbillon Abyssal", + "effect": "Le Pokémon utilise la Force Z pour créer un tourbillon gigantesque qui avale l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "hydroVortexSpecial": { + "name": "Super Tourbillon Abyssal", + "effect": "Dummy Data" + }, + "bloomDoomPhysical": { + "name": "Pétalexplosion Éblouissante", + "effect": "Le Pokémon utilise la Force Z pour libérer l’énergie des plantes et attaquer l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "bloomDoomSpecial": { + "name": "Pétalexplosion Éblouissante", + "effect": "Dummu Data" + }, + "gigavoltHavocPhysical": { + "name": "Fulguro-Lance Gigavolt", + "effect": "Le Pokémon utilise la Force Z pour générer un courant électrique puissant qu’il projette sur l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "gigavoltHavocSpecial": { + "name": "Fulguro-Lance Gigavolt", + "effect": "Dummy Data" + }, + "shatteredPsychePhysical": { + "name": "Psycho-Pulvérisation EX", + "effect": "Le Pokémon utilise la Force Z pour manipuler l’adversaire et lui infliger de sérieux dégâts. La puissance varie selon celle de la capacité originale." + }, + "shatteredPsycheSpecial": { + "name": "Psycho-Pulvérisation EX", + "effect": "Dummy Data" + }, + "subzeroSlammerPhysical": { + "name": "Laser Cryogénique", + "effect": "Le Pokémon utilise la Force Z pour baisser la température brutalement et congeler l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "subzeroSlammerSpecial": { + "name": "Laser Cryogénique", + "effect": "Dummy Data" + }, + "devastatingDrakePhysical": { + "name": "Chaos Draconique", + "effect": "Le Pokémon utilise la Force Z pour matérialiser son aura et assaillir l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "devastatingDrakeSpecial": { + "name": "Chaos Draconique", + "effect": "Dummy Data" + }, + "blackHoleEclipsePhysical": { + "name": "Trou Noir des Ombres", + "effect": "Le Pokémon utilise la Force Z pour rassembler l’énergie négative et y aspirer l’adversaire. La puissance varie selon celle de la capacité originale." + }, + "blackHoleEclipseSpecial": { + "name": "Trou Noir des Ombres", + "effect": "Dummy Data" + }, + "twinkleTacklePhysical": { + "name": "Impact Choupinova", + "effect": "Le Pokémon utilise la Force Z pour créer une dimension irréelle où l’adversaire est à sa merci. La puissance varie selon celle de la capacité originale." + }, + "twinkleTackleSpecial": { + "name": "Impact Choupinova", + "effect": "Dummy Data" + }, + "catastropika": { + "name": "Pikachute Foudroyante", + "effect": "Pikachu utilise la Force Z pour concentrer toute son électricité avant de se jeter à toute vitesse sur l’adversaire." + }, + "shoreUp": { + "name": "Amass’Sable", + "effect": "Le lanceur récupère jusqu’à la moitié de ses PV max. Durant une tempête de sable, il en récupère encore plus." + }, + "firstImpression": { + "name": "Escarmouche", + "effect": "Une capacité très puissante, mais qui ne fonctionne que lorsque le lanceur entre au combat." + }, + "banefulBunker": { + "name": "Blockhaus", + "effect": "Le lanceur se protège contre les attaques, et si un assaillant utilise une attaque directe contre lui, il l’empoisonne." + }, + "spiritShackle": { + "name": "Tisse Ombre", + "effect": "Une attaque qui coud la cible à son ombre, ce qui l’empêche de s’enfuir." + }, + "darkestLariat": { + "name": "Dark Lariat", + "effect": "Le lanceur étend les bras et frappe l’adversaire en tournant violemment. Il inflige des dégâts et ignore les changements de stats de la cible." + }, + "sparklingAria": { + "name": "Aria de l’Écume", + "effect": "Le lanceur émet plusieurs bulles en chantant. Soigne les brulures des Pokémon touchés par ces bulles." + }, + "iceHammer": { + "name": "Marteau de Glace", + "effect": "Le lanceur donne un puissant coup de poing à la cible, ce qui réduit la Vitesse du lanceur." + }, + "floralHealing": { + "name": "Soin Floral", + "effect": "Rend la moitié de ses PV max à la cible. Plus efficace sur un Champ Herbu." + }, + "highHorsepower": { + "name": "Cavalerie Lourde", + "effect": "Le lanceur attaque violemment en utilisant tout son poids." + }, + "strengthSap": { + "name": "Vole-Force", + "effect": "Rend au lanceur une quantité de PV équivalente à la stat d’Attaque de la cible, puis baisse celle-ci." + }, + "solarBlade": { + "name": "Lame Solaire", + "effect": "Le lanceur absorbe une grande quantité de lumière au premier tour et attaque au second tour en libérant cette énergie sous la forme d’une lame." + }, + "leafage": { + "name": "Feuillage", + "effect": "Le lanceur attaque la cible avec des feuilles." + }, + "spotlight": { + "name": "Projecteur", + "effect": "Met un Pokémon sous le feu des projecteurs et force tout le monde à le viser." + }, + "toxicThread": { + "name": "Fil Toxique", + "effect": "Tisse un fil imprégné de venin. Empoisonne la cible et baisse sa Vitesse." + }, + "laserFocus": { + "name": "Affilage", + "effect": "Le lanceur se concentre pour être sûr de porter un coup critique au tour suivant." + }, + "gearUp": { + "name": "Engrenage", + "effect": "Change de réglage pour augmenter l’Attaque et l’Attaque Spéciale des alliés ayant les talents Plus ou Minus." + }, + "throatChop": { + "name": "Exécu-Son", + "effect": "Inflige une douleur tellement violente à la cible qu’elle ne peut plus émettre de sons pendant deux tours." + }, + "pollenPuff": { + "name": "Boule Pollen", + "effect": "Sur un ennemi, le lanceur envoie une boule explosive qui fait des dégâts. Sur un allié, il envoie du bon pollen nutritif qui fait récupérer des PV." + }, + "anchorShot": { + "name": "Ancrage", + "effect": "Le lanceur jette son ancre sur la cible pour l’attaquer. Une fois accrochée, elle l’empêche de s’enfuir." + }, + "psychicTerrain": { + "name": "Champ Psychique", + "effect": "Pendant cinq tours, les Pokémon au sol ne peuvent plus subir d’attaques prioritaires et la puissance des capacités de type Psy augmente." + }, + "lunge": { + "name": "Furie-Bond", + "effect": "Le lanceur se jette sur la cible de toutes ses forces pour lui infliger des dégâts et baisser son Attaque." + }, + "fireLash": { + "name": "Fouet de Feu", + "effect": "Frappe la cible avec un fouet incandescent et baisse sa Défense." + }, + "powerTrip": { + "name": "Arrogance", + "effect": "Ivre de puissance, le lanceur attaque de toutes ses forces. Plus ses stats ont été augmentées, plus la puissance de cette capacité augmente." + }, + "burnUp": { + "name": "Flamme Ultime", + "effect": "Le Pokémon se consume et les flammes de son corps infligent des dégâts élevés à la cible. Le lanceur perd le type Feu." + }, + "speedSwap": { + "name": "Permuvitesse", + "effect": "Intervertit la Vitesse du lanceur et celle de la cible." + }, + "smartStrike": { + "name": "Estocorne", + "effect": "Le lanceur transperce la cible avec sa corne effilée. N’échoue jamais." + }, + "purify": { + "name": "Purification", + "effect": "Le lanceur soigne les altérations de statut de la cible, ce qui lui permet de regagner des PV." + }, + "revelationDance": { + "name": "Danse Éveil", + "effect": "Le lanceur attaque en dansant avec enthousiasme. Le type de la capacité est le même que celui du lanceur." + }, + "coreEnforcer": { + "name": "Sanction Suprême", + "effect": "La cible subit des dégâts et, si elle a déjà agi à ce tour, elle perd aussi son talent." + }, + "tropKick": { + "name": "Botte Sucrette", + "effect": "Un coup de pied chaud comme les tropiques qui inflige des dégâts à la cible et baisse son Attaque." + }, + "instruct": { + "name": "Sommation", + "effect": "Force la cible à lancer immédiatement la dernière capacité qu’elle a utilisée." + }, + "beakBlast": { + "name": "Bec-Canon", + "effect": "Le lanceur fait chauffer son bec avant d’attaquer. S’il subit une attaque directe pendant la montée en température, l’attaquant sera brulé." + }, + "clangingScales": { + "name": "Vibrécaille", + "effect": "Le lanceur déclenche un vacarme en frottant ses écailles les unes contre les autres pour attaquer. Baisse la Défense du lanceur." + }, + "dragonHammer": { + "name": "Draco-Marteau", + "effect": "Le lanceur utilise son corps comme un véritable marteau pour écraser la cible." + }, + "brutalSwing": { + "name": "Centrifugifle", + "effect": "Le lanceur pivote pour prendre de l’élan et infliger des dégâts." + }, + "auroraVeil": { + "name": "Voile Aurore", + "effect": "Réduit les dégâts causés par les capacités physiques et spéciales durant cinq tours. Ne peut être utilisée que lorsqu’il neige." + }, + "sinisterArrowRaid": { + "name": "Fureur des Plumes Spectrales", + "effect": "Archéduc utilise la Force Z pour créer un nuage de flèches qui transpercent la cible." + }, + "maliciousMoonsault": { + "name": "Dark Body Press", + "effect": "Félinferno utilise la Force Z pour gonfler ses muscles et écraser la cible de toutes ses forces." + }, + "oceanicOperetta": { + "name": "Symphonie des Ondines", + "effect": "Oratoria utilise la Force Z pour rassembler une grande quantité d’eau et la projeter sur la cible à pleine puissance." + }, + "guardianOfAlola": { + "name": "Colère du Gardien d’Alola", + "effect": "Le Pokémon Tutélaire utilise la Force Z et déchaine toute la puissance d’Alola sur sa cible. Inflige des dégâts en fonction des PV restants de celle-ci." + }, + "soulStealing7StarStrike": { + "name": "Fauche-Âme des Sept Étoiles", + "effect": "Marshadow concentre toute la Force Z dans ses poings et ses pieds pour infliger un déluge de coups à la cible." + }, + "stokedSparksurfer": { + "name": "Électro-Surf Survolté", + "effect": "Le Raichu de la région d’Alola utilise la Force Z pour frapper la cible et la paralyser." + }, + "pulverizingPancake": { + "name": "Gare au Ronflex", + "effect": "Ronflex utilise la Force Z pour montrer ce qu’il a dans le ventre et écraser la cible de tout son poids." + }, + "extremeEvoboost": { + "name": "Neuf pour Un", + "effect": "Évoli utilise la Force Z pour emprunter la puissance de tous ses amis évolués et beaucoup augmenter toutes ses stats." + }, + "genesisSupernova": { + "name": "Supernova Originelle", + "effect": "Mew utilise la Force Z pour attaquer la cible. Le terrain devient un Champ Psychique." + }, + "shellTrap": { + "name": "Carapiège", + "effect": "Pose une carapace piégée. Si l’adversaire utilise une capacité physique, la carapace explose et lui inflige des dégâts." + }, + "fleurCannon": { + "name": "Canon Floral", + "effect": "Envoie un rayon laser dévastateur. Baisse beaucoup l’Attaque Spéciale du lanceur." + }, + "psychicFangs": { + "name": "Psycho-Croc", + "effect": "Le lanceur mord la cible avec ses pouvoirs psychiques. Brise aussi les barrières comme Mur Lumière et Protection." + }, + "stompingTantrum": { + "name": "Trépignement", + "effect": "Le lanceur attaque en utilisant sa frustration. S’il a utilisé une capacité qui a échoué au tour précédent, la puissance de Trépignement est doublée." + }, + "shadowBone": { + "name": "Os Ombre", + "effect": "Le lanceur frappe avec un os possédé par l’âme d’un défunt. Peut aussi baisser la Défense de la cible." + }, + "accelerock": { + "name": "Vif Roc", + "effect": "Le lanceur charge la cible à toute vitesse. Frappe en priorité." + }, + "liquidation": { + "name": "Aqua-Brèche", + "effect": "Le lanceur utilise la force de l’eau pour attaquer. Peut aussi baisser la Défense de la cible." + }, + "prismaticLaser": { + "name": "Laser Prisme", + "effect": "Le lanceur utilise la puissance d’un prisme pour envoyer un laser destructeur, mais il doit se reposer au tour suivant." + }, + "spectralThief": { + "name": "Clepto-Mânes", + "effect": "Le lanceur plonge dans l’ombre de la cible, vole ses augmentations de stats et l’attaque." + }, + "sunsteelStrike": { + "name": "Choc Météore", + "effect": "Le lanceur fonce sur la cible à la vitesse d’une météorite. Ignore le talent de l’ennemi." + }, + "moongeistBeam": { + "name": "Rayon Spectral", + "effect": "Le lanceur attaque avec un rayon de lumière mystérieux. Ignore le talent de la cible." + }, + "tearfulLook": { + "name": "Larme à l’Œil", + "effect": "Le lanceur regarde la cible avec des yeux remplis de larmes. Celle-ci perd toute combativité et voit son Attaque et son Attaque Spéciale baisser." + }, + "zingZap": { + "name": "Électrikipik", + "effect": "Le lanceur fonce sur la cible et lui envoie un puissant choc électrique, ce qui peut aussi l’effrayer." + }, + "naturesMadness": { + "name": "Ire de la Nature", + "effect": "Le lanceur déchaine toute la colère de la nature pour baisser les PV de la cible de moitié." + }, + "multiAttack": { + "name": "Coup Varia-Type", + "effect": "Le Pokémon s’entoure d’une puissante énergie avant de foncer sur sa cible. Le type de la capacité dépend de la ROM installée." + }, + "tenMillionVoltThunderbolt": { + "name": "Giga-Tonnerre", + "effect": "Le Pikachu à casquette utilise la Force Z pour augmenter sa puissance électrique avant de la déchainer sur la cible. Taux de critique élevé." + }, + "mindBlown": { + "name": "Caboche-Kaboum", + "effect": "Le lanceur fait exploser sa tête pour attaquer toutes les cibles autour de lui. Il subit aussi des dégâts." + }, + "plasmaFists": { + "name": "Plasma Punch", + "effect": "Le lanceur attaque en projetant de l’électricité avec ses poings. Convertit les capacités de type Normal en type Électrik." + }, + "photonGeyser": { + "name": "Photo-Geyser", + "effect": "Le lanceur fait jaillir un pilier de lumière. Compare l’Attaque et l’Attaque Spéciale, et utilise celle qui infligera le plus de dégâts." + }, + "lightThatBurnsTheSky": { + "name": "Apocalypsis Luminis", + "effect": "Compare l’Attaque et l’Attaque Spéciale, et utilise celle qui infligera le plus de dégâts. Ignore le talent de la cible." + }, + "searingSunrazeSmash": { + "name": "Hélio-Choc Dévastateur", + "effect": "Baigné dans la Force Z, Solgaleo attaque en déchainant toute sa puissance. Ignore le talent de la cible." + }, + "menacingMoonrazeMaelstrom": { + "name": "Rayons Séléno-Explosifs", + "effect": "Baigné dans la Force Z, Lunala attaque en déchainant toute sa puissance. Ignore le talent de la cible." + }, + "letsSnuggleForever": { + "name": "Patati-Patattrape", + "effect": "Mimiqui concentre toute la Force Z dans son corps, et attaque dans le plus grand fracas !" + }, + "splinteredStormshards": { + "name": "Hurlement des Roches-Lames", + "effect": "Lougaroc utilise la Force Z pour attaquer la cible de toutes ses forces. Efface aussi tout Champ existant." + }, + "clangorousSoulblaze": { + "name": "Dracacophonie Flamboyante", + "effect": "Ékaïser utilise la Force Z pour frapper l’ennemi de toutes ses forces. Augmente aussi ses stats." + }, + "zippyZap": { + "name": "Pika-Sprint", + "effect": "Une attaque électrique rapide comme l’éclair qui inflige un coup critique à coup sûr. Frappe en priorité." + }, + "splishySplash": { + "name": "Pika-Splash", + "effect": "Pikachu frappe l’adversaire avec une vague géante chargée d’électricité. Peut aussi paralyser l’ennemi." + }, + "floatyFall": { + "name": "Pika-Piqué", + "effect": "Pikachu prend de la hauteur avant de fondre sur son adversaire. Peut aussi apeurer l’ennemi." + }, + "pikaPapow": { + "name": "Pika-Fracas", + "effect": "Plus le lanceur est heureux, plus l’attaque est puissante." + }, + "bouncyBubble": { + "name": "Évo-Thalasso", + "effect": "L’adversaire est frappé par des bulles d’eau qui sont ensuite absorbées pour récupérer un nombre de PV égal aux dégâts infligés à l’ennemi." + }, + "buzzyBuzz": { + "name": "Évo-Dynamo", + "effect": "Une attaque qui foudroie et paralyse l’adversaire." + }, + "sizzlySlide": { + "name": "Évo-Flambo", + "effect": "Évoli s’embrase et percure violemment l’adversaire. Brule aussi l’ennemi." + }, + "glitzyGlow": { + "name": "Évo-Psycho", + "effect": "Évoli submerge l’adversaire sous un flot d’ondes psychiques et crée un mur fabuleux qui réduit les dégâts causés par les attaques spéciales de l’ennemi" + }, + "baddyBad": { + "name": "Évo-Ténébro", + "effect": "Évoli fait appel à son côté sombre pour attaquer l’adversaire et créer un mur fabuleux qui réduit les dégâts causés par les attaques physiques de l’ennemi." + }, + "sappySeed": { + "name": "Évo-Écolo", + "effect": "Une liane géante surgit du sol et bombarde l’adversaire de graines qui lui dérobent des PV à chaque tour. Ces PV sont ensuite absorbés par Évoli." + }, + "freezyFrost": { + "name": "Évo-Congélo", + "effect": "Évoli frappe l’adversaire avec un cristal de buée noire gelée. Annule les changements de stats de tous les Pokémon au combat." + }, + "sparklySwirl": { + "name": "Évo-Fabulo", + "effect": "Une attaque qui enserre l’adversaire dans un tourbillon de senteurs oppressantes. Guérit toutes les altérations de statut de l’équipe." + }, + "veeveeVolley": { + "name": "Évo-Chardasso", + "effect": "Le lanceur lance une attaque dès lors qu’un signe apparait sur le terrain. Les dégâts infligés sont proportionnels à l’affection de votre Pokémon" + }, + "doubleIronBash": { + "name": "Écrous d’Poing", + "effect": "Le lanceur fait pivoter l’écrou de sa poitrine deux fois d’affilée pour frapper l’adversaire avec ses bras. Peut apeurer l’ennemi (30% de chances)." + }, + "maxGuard": { + "name": "Gardomax", + "effect": "Le lanceur se protège de toutes les attaques. Peut échouer si utilisée plusieurs fois de suite." + }, + "dynamaxCannon": { + "name": "Canon Dynamax", + "effect": "Le lanceur attaque en libérant l’énergie concentrée dans son noyau. Inflige jusqu’à deux fois plus de dégâts si l’adversaire a un niveau très élevé." + }, + "snipeShot": { + "name": "Tir de Précision", + "effect": "Le lanceur parvient toujours à viser la cible voulue, en ignorant l’effet des talents et des capacités capables de détourner les attaques." + }, + "jawLock": { + "name": "Croque Fort", + "effect": "Le lanceur et sa cible ne peuvent plus être échangés jusqu’à ce que l’un d’entre eux tombe K.O. L’effet est annulé si l’un des deux Pokémon quitte le terrain." + }, + "stuffCheeks": { + "name": "Garde-à-Joues", + "effect": "Le lanceur mange la Baie qu’il tient, ce qui augmente beaucoup sa Défense." + }, + "noRetreat": { + "name": "Ultime Bastion", + "effect": "Le lanceur voit toutes ses stats augmenter, mais en contrepartie, il ne peut plus quitter le terrain." + }, + "tarShot": { + "name": "Goudronnage", + "effect": "Le lanceur recouvre sa cible de goudron liquide pour baisser sa Vitesse et la rendre vulnérable au feu." + }, + "magicPowder": { + "name": "Poudre Magique", + "effect": "Le lanceur recouvre sa cible d’une poudre magique qui change son type en Psy." + }, + "dragonDarts": { + "name": "Draco-Flèches", + "effect": "Le lanceur attaque en propulsant deux Fantyrm. S’il y a deux cibles, chacune d’entre elles est frappée par un Fantyrm." + }, + "teatime": { + "name": "Thérémonie", + "effect": "Le lanceur invite tous les Pokémon sur le terrain à prendre le gouter autour d’une tasse de thé. Ceux qui tiennent une Baie la mangent." + }, + "octolock": { + "name": "Octoprise", + "effect": "Empêche l’ennemi de fuir ou de quitter le terrain. Baisse la Défense et la Défense Spécial de l’ennemi chaque tour." + }, + "boltBeak": { + "name": "Prise de Bec", + "effect": "Inflige des dégâts et les double si le lanceur attaque avant l’ennemi." + }, + "fishiousRend": { + "name": "Branchicrok", + "effect": "Inflige des dégâts et les double si le lanceur attaque avant l’ennemi." + }, + "courtChange": { + "name": "Change-Côté", + "effect": "Une force mystérieuse intervertit les effets affectant chaque côté du terrain." + }, + "maxFlare": { + "name": "Pyromax", + "effect": "Une attaque de type Feu que seuls les Pokémon Dynamax peuvent utiliser. Fait briller le soleil pendant cinq tours." + }, + "maxFlutterby": { + "name": "Insectomax", + "effect": "Une attaque de type Insecte que seuls les Pokémon Dynamax peuvent utiliser. Baisse l’Attaque Spéciale de la cible." + }, + "maxLightning": { + "name": "Fulguromax", + "effect": "Une attaque de type Électrik que seuls les Pokémon Dynamax peuvent utiliser. Crée un Champ Électrifié qui dure cinq tours." + }, + "maxStrike": { + "name": "Normalomax", + "effect": "Une attaque de type Normal que seuls les Pokémon Dynamax peuvent utiliser. Baisse la Vitesse de la cible." + }, + "maxKnuckle": { + "name": "Pugilomax", + "effect": "Une attaque de type Combat que seuls les Pokémon dynamax peuvent utiliser. Augmente l’Attaque des Alliés." + }, + "maxPhantasm": { + "name": "Spectromax", + "effect": "Une attaque de type Spectre que seuls les Pokémon Dynamax peuvent utiliser. Baisse la Défense de la cible." + }, + "maxHailstorm": { + "name": "Cryomax", + "effect": "Une attaque de type Glace que seuls les Pokémon Dynamax peuvent utiliser. Invoque une tempête de grêle qui dure cinq tours." + }, + "maxOoze": { + "name": "Toxinomax", + "effect": "Une attaque de type Poison que seuls les Pokémon Dynamax peuvent utiliser. Augmente l’Attaque Spéciale des alliés." + }, + "maxGeyser": { + "name": "Hydromax", + "effect": "Une attaque de type Eau que seuls les Pokémon Dynamax peuvent utiliser. Invoque de fortes pluies qui durent cinq tours." + }, + "maxAirstream": { + "name": "Aéromax", + "effect": "Une attaque de type Vol que seuls les Pokémon Dynamax peuvent utiliser. Augmente la Vitesse des alliés." + }, + "maxStarfall": { + "name": "Enchantomax", + "effect": "Une attaque de type Fée que seuls les Pokémon Dynamax peuvent utiliser. Crée un Champ Brumeux qui dure cinq tours." + }, + "maxWyrmwind": { + "name": "Dracomax", + "effect": "Une attaque de type Dragon que seuls les Pokémon Dynamax peuvent utiliser. Baisse l’Attaque de la cible." + }, + "maxMindstorm": { + "name": "Psychomax", + "effect": "Une attaque de type Psy que seuls les Pokémon Dynamax peuvent utiliser. Crée un Champ Psychique qui dure cinq tours." + }, + "maxRockfall": { + "name": "Lithomax", + "effect": "Une attaque de type Roche que seuls les Pokémon Dynamax peuvent utiliser. Invoque une tempête de sable qui dure cinq tours." + }, + "maxQuake": { + "name": "Sismomax", + "effect": "Une attaque de type Sol que seuls les Pokémon Dynamax peuvent utiliser. Augmente la Défense Spéciale des alliés." + }, + "maxDarkness": { + "name": "Sinistromax", + "effect": "Une attaque de type Ténèbres que seuls les Pokémon Dynamax peuvent utiliser. Baisse la Défense Spéciale de la cible." + }, + "maxOvergrowth": { + "name": "Phytomax", + "effect": "Une attaque de type Plante que seuls les Pokémon Dynamax peuvent utiliser. Crée un Champ Herbu qui dure cinq tours." + }, + "maxSteelspike": { + "name": "Métallomax", + "effect": "Une attaque de type Acier que seuls les Pokémon Dynamax peuvent utiliser. Augmente la Défense des alliés." + }, + "clangorousSoul": { + "name": "Dracacophonie", + "effect": "Sacrifie une partie de ses PV pour augmenter toutes ses statistiques." + }, + "bodyPress": { + "name": "Big Splash", + "effect": "Le lanceur utilise son corps pour attaquer sa cible. Plus la Défense du lanceur est élevée, plus les dégâts infligés sont importants." + }, + "decorate": { + "name": "Nappage", + "effect": "Augmente fortement l’Attaque et l’Attaque Spéciale de la cible." + }, + "drumBeating": { + "name": "Tambour Battant", + "effect": "Le lanceur bat son tambour pour en diriger les racines sur la cible, l’attaquer, et baisser sa Vitesse." + }, + "snapTrap": { + "name": "Troquenard", + "effect": "Bloque l’ennemi pendant 4 à 5 tours." + }, + "pyroBall": { + "name": "Ballon Brulant", + "effect": "Le lanceur attaque avec un ballon fait à partir d’un caillou enflammé. Peut aussi bruler la cible (10% de chances)." + }, + "behemothBlade": { + "name": "Gladius Maximus", + "effect": "Le lanceur se transforme en une immense épée et pourfend sa cible. Cette capacité inflige le double de dégâts aux Pokémon Dynamax." + }, + "behemothBash": { + "name": "Aegis Maxima", + "effect": "Le lanceur se transforme en un immense bouclier et charge sa cible. Cette capacité inflige le double de dégâts aux Pokémon Dynamax." + }, + "auraWheel": { + "name": "Roue Libre", + "effect": "Inflige et change en type Ténèbres" + }, + "breakingSwipe": { + "name": "Abattage", + "effect": "Le lanceur balaie violemment le camp adverse avec son immense queue. Baisse l’Attaque de la cible." + }, + "branchPoke": { + "name": "Tapotige", + "effect": "Le lanceur attaque sa cible en la piquant avec une branche pointue." + }, + "overdrive": { + "name": "Overdrive", + "effect": "Le lanceur gratte ses cordes de guitare ou de basse pour créer de violentes vibrations sonores qui blessent la cible." + }, + "appleAcid": { + "name": "Acide Malique", + "effect": "Le lanceur projette un liquide corrosif créé à partir d’une pomme acide sur la cible, ce qui baisse la Défense Spéciale de celle-ci." + }, + "gravApple": { + "name": "Force G", + "effect": "Le lanceur fait tomber une pomme de très haut sur la cible, ce qui baisse la Défense de celle-ci." + }, + "spiritBreak": { + "name": "Choc Émotionnel", + "effect": "Le lanceur attaque la cible avec une telle force que celle-ci peut s’en retrouver profondément troublée et voir son Attaque Spéciale baisser." + }, + "strangeSteam": { + "name": "Vapeur Féérique", + "effect": "Inflige des dégâts et peut rendre confus l’ennemi." + }, + "lifeDew": { + "name": "Fontaine de Vie", + "effect": "Le lanceur projette une eau mystérieuse sur le terrain pour restaurer ses PV et ceux de ses alliés au combat." + }, + "obstruct": { + "name": "Blocage", + "effect": "Protège le lanceur des attaques de contact. Baisse la Défense de deux crans si l’ennemi a tenté une attaque de contact." + }, + "falseSurrender": { + "name": "Fourbette", + "effect": "Le lanceur fait semblant de se prosterner et utilise ses cheveux pour transpercer sa cible. N’échoue jamais." + }, + "meteorAssault": { + "name": "Joute Astrale", + "effect": "Inflige de gros dégâts mais oblige le lanceur à se reposer pendant un tour." + }, + "eternabeam": { + "name": "Laser Infinimax", + "effect": "Inflige de gros dégâts mais oblige le lanceur à se reposer pendant un tour." + }, + "steelBeam": { + "name": "Métalaser", + "effect": "Le lanceur concentre du métal issu de tout son corps en un rayon qu’il projette violemment sur sa cible. Il subit aussi des dégâts." + }, + "expandingForce": { + "name": "Vaste Pouvoir", + "effect": "Le lanceur attaque la cible avec ses pouvoirs psychiques. Si un champ psychique est actif, la puissance de cette capacité augmente et elle touche tous les ennemis." + }, + "steelRoller": { + "name": "Métalliroue", + "effect": "Une attaque qui inflige des dégâts et fait disparaitre le champ actif, mais qui échoue s’il n’y en a pas à ce moment." + }, + "scaleShot": { + "name": "Rafale Écailles", + "effect": "Le lanceur projette des écailles sur la cible de deux à cinq fois d’affilée. Augmente la Vitesse, mais diminue la Défense." + }, + "meteorBeam": { + "name": "Laser Météore", + "effect": "Le lanceur concentre l’énergie cosmique au premier tour, ce qui augmente son Attaque Spéciale, et frappe au second." + }, + "shellSideArm": { + "name": "Kokiyarme", + "effect": "Une attaque physique ou spéciale, en fonction de ce qui inflige le plus de dégâts à la cible. Peut aussi empoisonner." + }, + "mistyExplosion": { + "name": "Explo-Brume", + "effect": "Le lanceur frappe tous les Pokémon autour de lui en explosant, ce qui le met K.O. La puissance de cette attaque augmente si un champ brumeux est actif." + }, + "grassyGlide": { + "name": "Gliss’Herbe", + "effect": "Le lanceur attaque la cible en glissant sur le terrain. Frappe toujours en priorité si un champ herbu est actif." + }, + "risingVoltage": { + "name": "Monte-Tension", + "effect": "Des éclairs surgissent du sol et frappent la cible. La puissance de cette attaque est doublée si la cible est sur un champ électrifié." + }, + "terrainPulse": { + "name": "Champlification", + "effect": "Une attaque qui utilise la force des champs pour projeter une aura. Son type et sa puissance varient selon le champ actif." + }, + "skitterSmack": { + "name": "Ravage Rampant", + "effect": "Le lanceur rampe derrière la cible pour l’attaquer, ce qui baisse l’Attaque Spéciale de celle-ci." + }, + "burningJealousy": { + "name": "Feu Envieux", + "effect": "Le lanceur attaque sa cible avec toute sa jalousie. Cette capacité brule tout Pokémon dont les stats ont augmenté pendant ce tour." + }, + "lashOut": { + "name": "Cent Rancunes", + "effect": "Le lanceur frappe la cible avec toute sa rancune. Si les stats du lanceur ont diminué pendant ce tour, la puissance de cette attaque est doublée." + }, + "poltergeist": { + "name": "Esprit Frappeur", + "effect": "Le lanceur manipule l’objet tenu par la cible pour l’attaquer. Cette capacité échoue si celle-ci ne tient rien." + }, + "corrosiveGas": { + "name": "Gaz Corrosif", + "effect": "Un gaz corrosif qui enveloppe tous les Pokémon alentour et qui dissout les objets qu’ils tiennent." + }, + "coaching": { + "name": "Coaching", + "effect": "Le lanceur coache ses alliés, augmentant ainsi leur Attaque et leur Défense." + }, + "flipTurn": { + "name": "Eau Revoir", + "effect": "Après son attaque, le lanceur revient à toute vitesse et change de place avec un Pokémon de l’équipe prêt à combattre." + }, + "tripleAxel": { + "name": "Triple Axel", + "effect": "Une série d’un à trois coups de pied distincts dont la puissance augmente à chaque fois que la capacité touche sa cible." + }, + "dualWingbeat": { + "name": "Double Volée", + "effect": "Le lanceur frappe la cible avec ses ailes deux fois d’affilée." + }, + "scorchingSands": { + "name": "Sable Ardent", + "effect": "Le lanceur projette du sable chauffé à blanc sur la cible, ce qui peut aussi la bruler (30% de chances)." + }, + "jungleHealing": { + "name": "Selve Salvatrice", + "effect": "Le lanceur fait appel au pouvoir de la jungle pour restaurer les PV et soigner les altérations d’état de ses alliés et de lui-même." + }, + "wickedBlow": { + "name": "Poing Obscur", + "effect": "Le lanceur assène un coup puissant à la cible. Cette technique qui inflige toujours un coup critique est réservée à ceux qui maitrisent la puissance des Ténèbres." + }, + "surgingStrikes": { + "name": "Torrent de Coups", + "effect": "Le lanceur assène trois coups fluides à la cible. Cette technique qui inflige toujours un coup critique est réservée à ceux qui maitrisent la puissance de l’Eau." + }, + "thunderCage": { + "name": "Voltageôle", + "effect": "Le lanceur frappe la cible, et le piège dans une prison électrique qui dure de quatre à cinq tours." + }, + "dragonEnergy": { + "name": "Draco-Énergie", + "effect": "Le lanceur utilise son énergie vitale pour attaquer la cible. Moins il a de PV, moins l’attaque est puissante." + }, + "freezingGlare": { + "name": "Regard Glaçant", + "effect": "Les yeux du lanceur tirent des rayons psychiques qui attaquent la cible et peuvent aussi la geler (10% de chances)." + }, + "fieryWrath": { + "name": "Fureur Ardente", + "effect": "Le lanceur canalise sa colère et la transforme en émanation brulante, avec laquelle il attaque la cible, ce qui peut aussi apeurer celle-ci (20% de chances)." + }, + "thunderousKick": { + "name": "Coup Fulgurant", + "effect": "Le lanceur assène un coup de pied à la cible à la vitesse de l’éclair. Baisse aussi la Défense de la cible." + }, + "glacialLance": { + "name": "Lance de Glace", + "effect": "Le lanceur attaque la cible avec une lance de glace entourée d’un blizzard." + }, + "astralBarrage": { + "name": "Éclat Spectral", + "effect": "Le lanceur attaque la cible avec une multitude de petits spectres." + }, + "eerieSpell": { + "name": "Sort Sinistre", + "effect": "Le lanceur attaque avec de puissants pouvoirs psychiques et retire 3 PP de la dernière capacité utilisée par la cible." + }, + "direClaw": { + "name": "Griffes Funestes", + "effect": "Le lanceur attaque avec des griffes destructrices en visant les points faibles. La cible peut aussi être empoisonnée, paralysée, ou endormie." + }, + "psyshieldBash": { + "name": "Sprint Bouclier", + "effect": "Le lanceur s’enveloppe d’énergie psychique et frappe sa cible de plein fouet. Cela augmente également la Défense du lanceur." + }, + "powerShift": { + "name": "Échange Force", + "effect": "Le lanceur échange son Attaque avec sa Défense." + }, + "stoneAxe": { + "name": "Hache de Pierre", + "effect": "Le lanceur attaque le point faible de sa cible avec sa hache de pierre. Les débris de pierre se mettent alors à flotter autour de la cible." + }, + "springtideStorm": { + "name": "Typhon Passionné", + "effect": "Le lanceur déclenche un violent typhon de haine et d’amour qui s’abat sur la cible. Peut baisser l’Attaque de celle-ci." + }, + "mysticalPower": { + "name": "Force Mystique", + "effect": "Le lanceur attaque en libérant un pouvoir mystique. Cela augmente également son Attaque Spéciale." + }, + "ragingFury": { + "name": "Grand Courroux", + "effect": "Le lanceur se déchaine et attaque en projetant de violentes flammes pendant deux ou trois tours. Il devient ensuite confus." + }, + "waveCrash": { + "name": "Aquatacle", + "effect": "Le lanceur se recouvre entièrement d’eau avant de charger sa cible. Cela blesse aussi gravement le lanceur." + }, + "chloroblast": { + "name": "Herblast", + "effect": "Le lanceur tire un concentré de sa propre chlorophylle sur la cible, ce qui le blesse également." + }, + "mountainGale": { + "name": "Bise Glaciaire", + "effect": "Le lanceur envoie un bloc de glace de la taille d’un iceberg sur la cible, ce qui peut aussi l’apeurer (30% de chances)." + }, + "victoryDance": { + "name": "Danse Victoire", + "effect": "Le lanceur danse vigoureusement pour invoquer la victoire, ce qui augmente son Attaque, sa Défense et sa Vitesse." + }, + "headlongRush": { + "name": "Assaut Frontal", + "effect": "Le lanceur charge la cible de toutes ses forces, ce qui baisse la Défense et la Défense Spéciale du lanceur." + }, + "barbBarrage": { + "name": "Multitoxik", + "effect": "Une multitude de pointes toxiques frappent la cible et peuvent l’empoisonner. La puissance est doublée si celle-ci est déjà empoisonnée (30% de chances en Style Normal et 50% de chances en Style Puissant)." + }, + "esperWing": { + "name": "Ailes Psycho", + "effect": "Le lanceur entaille la cible avec ses ailes renforcées par une émanation psychique. Taux de critiques élevé. Cela augmente la Vitesse du lanceur." + }, + "bitterMalice": { + "name": "Cœur de Rancœur", + "effect": "Une rancœur glaciale frappe la cible et baisse son Attaque." + }, + "shelter": { + "name": "Mur Fumigène", + "effect": "Rend la peau du lanceur dure comme un mur de fer, ce qui augmente beaucoup sa Défense." + }, + "tripleArrows": { + "name": "Triple Flèche", + "effect": "Le lanceur donne un coup de pied et tire trois flèches simultanément, ce qui peut baisser la Défense de la cible ou l’apeurer (30% de chances). Taux de critiques élevé." + }, + "infernalParade": { + "name": "Cortège Funèbre", + "effect": "Une multitude de boules de feu frappent la cible, ce qui peut aussi la bruler (30% de chances et 50% en Style Puissant). La puissance est doublée si celle-ci souffre d’une altération de statut." + }, + "ceaselessEdge": { + "name": "Vagues à Lames", + "effect": "Des lames de coquillages entaillent la cible en visant ses points faibles. Les débris de coquillage se répandent sous la forme de picots aux pieds de la cible." + }, + "bleakwindStorm": { + "name": "Typhon Hivernal", + "effect": "Le lanceur déclenche un typhon froid et brutal qui fait trembler le cœur et le corps de la cible, ce qui peut aussi baisser sa Vitesse." + }, + "wildboltStorm": { + "name": "Typhon Fulgurant", + "effect": "Le lanceur déclenche un violent typhon orageux dont les rafales et la foudre frappent la cible, ce qui peut aussi la paralyser (30% de chances en Style Normal et 50% en Style Puissant)." + }, + "sandsearStorm": { + "name": "Typhon Pyrosable", + "effect": "Le lanceur déclenche un violent typhon mêlé à du sable ardent qui s’abat sur la cible, ce qui peut la bruler (30% de chances et 50% en Style Puissant)." + }, + "lunarBlessing": { + "name": "Prière Lunaire", + "effect": "Le lanceur adresse une prière à la lune pour restaurer les PV et soigner ses altérations de statut ainsi que celles de ses alliés." + }, + "takeHeart": { + "name": "Extravaillance", + "effect": "Le lanceur fait preuve de bravoure pour soigner ses altérations de statut et augmenter sa puissance offensive et défensive." + }, + "gMaxWildfire": { + "name": "Fournaise G-Max", + "effect": "Une attaque de type Feu que seul un Dracaufeu Gigamax peut utiliser. Pendant quatre tours, la cible continue de subir des dégâts." + }, + "gMaxBefuddle": { + "name": "Illusion G-Max", + "effect": "Une attaque de type Insecte que seul un Papilusion Gigamax peut utiliser. Empoisonne, paralyse ou endort la cible." + }, + "gMaxVoltCrash": { + "name": "Foudre G-Max", + "effect": "Une attaque de type Électrik que seul un Pikachu Gigamax peut utiliser. Paralyse la cible." + }, + "gMaxGoldRush": { + "name": "Pactole G-Max", + "effect": "Une attaque de type Normal que seul un Miaouss Gigamax peut utiliser. Rend la cible confuse et permet d’obtenir de l’argent à la fin du combat." + }, + "gMaxChiStrike": { + "name": "Frappe G-Max", + "effect": "Une attaque de type Combat que seul un Mackogneur Gigamax peut utiliser. Augmente le taux de critiques du lanceur et de ses alliés." + }, + "gMaxTerror": { + "name": "Hantise G-Max", + "effect": "Une attaque de type Spectre que seul un Ectoplasma Gigamax peut utiliser. Empêche les Pokémon ennemis de quitter le combat." + }, + "gMaxResonance": { + "name": "Résonance G-Max", + "effect": "Une attaque de type Glace que seul un Lokhlass Gigamax peut utiliser. Réduit les dégâts causés par des capacités pendant cinq tours." + }, + "gMaxCuddle": { + "name": "Câlin G-Max", + "effect": "Une attaque de type Normal que seul un Évoli Gigamax peut utiliser. Rend la cible amoureuse." + }, + "gMaxReplenish": { + "name": "Récolte G-Max", + "effect": "Une attaque de type Normal que seul un Ronflex Gigamax peut utiliser. Restaure une Baie tenue qui a déjà été mangée." + }, + "gMaxMalodor": { + "name": "Pestilence G-Max", + "effect": "Une attaque de type Poison que seul un Miasmax Gigamax peut utiliser. Empoisonne la cible." + }, + "gMaxStonesurge": { + "name": "Récif G-Max", + "effect": "Une attaque de type Eau que seul un Torgamord Gigamax peut utiliser. Disperse des pierres aiguisées sur le terrain." + }, + "gMaxWindRage": { + "name": "Rafale G-Max", + "effect": "Une attaque de type Vol que seul un Corvaillus Gigamax peut utiliser. Permet de briser les barrières comme Protection et Mur Lumière." + }, + "gMaxStunShock": { + "name": "Choc G-Max", + "effect": "Une attaque de type Électrik que seul un Salarsen Gigamax peut utiliser. Empoisonne ou paralyse la cible." + }, + "gMaxFinale": { + "name": "Cure G-Max", + "effect": "Une attaque de type Fée que seul un Charmilly Gigamax peut utiliser. Restaure des PV aux alliés." + }, + "gMaxDepletion": { + "name": "Usure G-Max", + "effect": "Une attaque de type Dragon que seul un Duralugon Gigamax peut utiliser. Baisse les PP de la dernière capacité utilisée par la cible." + }, + "gMaxGravitas": { + "name": "Ondes G-Max", + "effect": "Une attaque de type Psy que seul un Astronelle Gigamax peut utiliser. Intensifie la gravité pendant cinq tours." + }, + "gMaxVolcalith": { + "name": "Téphra G-Max", + "effect": "Une attaque de type Roche que seul un Monthracite Gigamax peut utiliser. Pendant quatre tours, la cible continue de subir des dégâts." + }, + "gMaxSandblast": { + "name": "Enlisement G-Max", + "effect": "Une attaque de type Sol que seul un Dunaconda Gigamax peut utiliser. Emprisonne la cible dans une tempête de sable qui dure de quatre à cinq tours." + }, + "gMaxSnooze": { + "name": "Torpeur G-Max", + "effect": "Une attaque de type Ténèbres que seul un Angoliath Gigamax peut utiliser. Fait bâiller la cible qui s’endort au tour suivant." + }, + "gMaxTartness": { + "name": "Corrosion G-Max", + "effect": "Une attaque de type Plante que seul un Pomdrapi Gigamax peut utiliser. Réduit l’Esquive de la cible." + }, + "gMaxSweetness": { + "name": "Nectar G-Max", + "effect": "Une attaque de type Plante que seul un Dratatin Gigamax peut utiliser. Soigne les altérations de statut des alliés." + }, + "gMaxSmite": { + "name": "Sentence G-Max", + "effect": "Une attaque de type Fée que seul un Sorcilence Gigamax peut utiliser. Rend la cible confuse." + }, + "gMaxSteelsurge": { + "name": "Percée G-Max", + "effect": "Une attaque de type Acier que seul un Pachyradjah Gigamax peut utiliser. Disperse des pics aiguisés sur le terrain." + }, + "gMaxMeltdown": { + "name": "Fonte G-Max", + "effect": "Une attaque de type Acier que seul un Melmetal Gigamax peut utiliser. Empêche la cible d’utiliser la même capacité deux fois de suite." + }, + "gMaxFoamBurst": { + "name": "Bulles G-Max", + "effect": "Une attaque de type Eau que seul un Krabboss Gigamax peut utiliser. Réduit beaucoup la Vitesse de la cible." + }, + "gMaxCentiferno": { + "name": "Combustion G-Max", + "effect": "Une attaque de type Feu que seul un Scolocendre Gigamax peut utiliser. Emprisonne la cible dans un tourbillon de flammes qui dure de quatre à cinq tours." + }, + "gMaxVineLash": { + "name": "Fouet G-Max", + "effect": "Une attaque de type Plante que seul un Florizarre Gigamax peut utiliser. Inflige des dégâts à la cible pendant quatre tours." + }, + "gMaxCannonade": { + "name": "Canonnade G-Max", + "effect": "Une attaque de type Eau que seul un Tortank Gigamax peut utiliser. Inflige des dégâts à la cible pendant quatre tours." + }, + "gMaxDrumSolo": { + "name": "Percussion G-Max", + "effect": "Une attaque de type Plante que seul un Gorythmic Gigamax peut utiliser. Ignore le talent de la cible." + }, + "gMaxFireball": { + "name": "Pyroball G-Max", + "effect": "Une attaque de type Feu que seul un Pyrobut Gigamax peut utiliser. Ignore le talent de la cible." + }, + "gMaxHydrosnipe": { + "name": "Gâchette G-Max", + "effect": "Une attaque de type Eau que seul un Lézargus Gigamax peut utiliser. Ignore le talent de la cible." + }, + "gMaxOneBlow": { + "name": "Coup Final G-Max", + "effect": "Une attaque de type Ténèbres que seul un Shifours Gigamax peut utiliser. Cette frappe unique permet d’ignorer la capacité Gardomax." + }, + "gMaxRapidFlow": { + "name": "Multicoup G-Max", + "effect": "Une attaque de type Eau que seul un Shifours Gigamax peut utiliser. Cet enchainement de coups permet d’ignorer la capacité Gardomax." + }, + "teraBlast": { + "name": "Téra Explosion", + "effect": "Si le lanceur est téracristallisé, il libère l’énergie de son type Téracristal. La capacité utilise l’Attaque ou l’Attaque Spéciale, selon ce qui infligera le plus de dégâts." + }, + "silkTrap": { + "name": "Piège de Fil", + "effect": "Le lanceur déploie un piège de fil pour se protéger contre les attaques, et si un assaillant utilise une attaque directe contre lui, la Vitesse de l’assaillant baisse." + }, + "axeKick": { + "name": "Talon-Marteau", + "effect": "Le lanceur donne un coup de talon descendant à la cible, ce qui peut aussi la rendre confuse. S’il échoue, le lanceur se blesse." + }, + "lastRespects": { + "name": "Hommage Posthume", + "effect": "Le lanceur attaque pour venger ses alliés. Plus le nombre de Pokémon alliés mis K.O. est élevé, plus la puissance de cette capacité augmente." + }, + "luminaCrash": { + "name": "Lumino-Impact", + "effect": "Le lanceur attaque en émettant une étrange lumière qui ébranle l’esprit de la cible. Cela baisse beaucoup la Défense Spéciale de la cible." + }, + "orderUp": { + "name": "Plat du Jour", + "effect": "Le lanceur attaque avec adresse et élégance. S’il a un Nigirigon dans la gueule, une de ses stats augmente en fonction de la forme de celui-ci." + }, + "jetPunch": { + "name": "Poing Sonique", + "effect": "Le lanceur enveloppe son poing d’un torrent furieux et attaque si rapidement qu’on peine à le discerner. Frappe en priorité." + }, + "spicyExtract": { + "name": "Habanerage", + "effect": "Le lanceur relâche un concentré extrêmement pimenté sur la cible, ce qui augmente beaucoup l’Attaque de celle-ci, mais baisse aussi beaucoup sa Défense." + }, + "spinOut": { + "name": "Dérapage", + "effect": "Le lanceur met tout son poids sur ses pattes et effectue de violentes rotations, ce qui inflige des dégâts à la cible, mais baisse beaucoup la Vitesse du lanceur." + }, + "populationBomb": { + "name": "Prolifération", + "effect": "Le lanceur et ses congénères prolifèrent en masse et attaquent ensemble d’une à dix fois d’affilée." + }, + "iceSpinner": { + "name": "Cryo-Pirouette", + "effect": "Le lanceur enveloppe ses jambes d’une fine couche de glace et heurte la cible en tournant sur lui-même. Ses rotations détruisent le champ actif sur le terrain." + }, + "glaiveRush": { + "name": "Charge Glaive", + "effect": "Le lanceur se jette dans une charge inconsciente sur la cible. Au tour suivant, l’attaque de la cible inflige le double de dégâts et n’échoue jamais." + }, + "revivalBlessing": { + "name": "Second Souffle", + "effect": "Dans un élan de compassion, le lanceur adresse une prière afin de ranimer un Pokémon de l’équipe K.O. en lui rendant la moitié de ses PV." + }, + "saltCure": { + "name": "Salaison", + "effect": "Le lanceur couvre la cible de sel, ce qui lui inflige des dégâts à chaque tour. Si la cible est de type Acier ou Eau, ces dégâts sont plus élevés." + }, + "tripleDive": { + "name": "Triple Plongeon", + "effect": "Le lanceur effectue des plongeons parfaitement cadencés pour éclabousser la cible et lui infliger des dégâts trois fois d’affilée." + }, + "mortalSpin": { + "name": "Toupie Éclat", + "effect": "Le lanceur attaque en tournant sur lui-même et empoisonne la cible. Il se libère également des effets de capacités comme Étreinte, Ligotage ou Vampigraine." + }, + "doodle": { + "name": "Décalquage", + "effect": "Le lanceur capture l’essence de la cible et la décalque. Le talent du lanceur et de ses alliés devient alors identique à celui de la cible." + }, + "filletAway": { + "name": "Décharnement", + "effect": "Le lanceur sacrifie des PV pour beaucoup augmenter son Attaque, son Attaque Spéciale, et sa Vitesse." + }, + "kowtowCleave": { + "name": "Génusection", + "effect": "Le lanceur se prosterne devant la cible et profite de cette distraction pour l’attaquer avec une lame. N’échoue jamais." + }, + "flowerTrick": { + "name": "Magie Florale", + "effect": "Le lanceur attaque en jetant un bouquet de fleurs piégé sur la cible. N’échoue jamais et inflige toujours un coup critique." + }, + "torchSong": { + "name": "Chant Flamboyant", + "effect": "Le lanceur carbonise la cible en projetant sur elle de vives flammes créées par un chant. Cette capacité augmente l’Attaque Spéciale du lanceur." + }, + "aquaStep": { + "name": "Danse Aquatique", + "effect": "Le lanceur se joue de la cible et lui inflige des dégâts avec ses pas de danse gracieux et légers. Cette capacité augmente la Vitesse du lanceur." + }, + "ragingBull": { + "name": "Taurogne", + "effect": "Le lanceur charge la cible comme un taureau enragé. Le type de cette capacité dépend de la race du lanceur, et brise les barrières comme Mur Lumière et Protection." + }, + "makeItRain": { + "name": "Ruée d’Or", + "effect": "Le lanceur attaque en lançant de nombreuses pièces, ce qui baisse son Attaque Spéciale. Permet d’obtenir plus d’argent à la fin du combat." + }, + "psyblade": { + "name": "Lame Psychique", + "effect": "Le lanceur lacère la cible à l’aide d’une lame intangible. S’il se trouve dans un champ électrifié, la puissance de cette capacité augmente de 50 %." + }, + "hydroSteam": { + "name": "Hydrovapeur", + "effect": "Le lanceur asperge la cible avec un puissant jet d’eau bouillante. Quand le soleil brille, la puissance de cette capacité augmente de 50 % au lieu de baisser." + }, + "ruination": { + "name": "Cataclysme", + "effect": "Le lanceur déclenche un cataclysme qui baisse les PV de la cible de moitié." + }, + "collisionCourse": { + "name": "Nitro Crash", + "effect": "Le lanceur change de forme et s’écrase sur la cible dans une explosion antique. Si la capacité est super efficace, elle inflige encore plus de dégâts que d’ordinaire." + }, + "electroDrift": { + "name": "Turbo Volt", + "effect": "Le lanceur change de forme et fonce sur la cible en la perforant d’électricité futuriste. Si la capacité est super efficace, sa puissance augmente encore plus." + }, + "shedTail": { + "name": "Queulonage", + "effect": "Le lanceur crée un clone en sacrifiant des PV, puis il revient et échange sa place avec un Pokémon de l’équipe prêt à combattre." + }, + "chillyReception": { + "name": "Neigeux de Mots", + "effect": "Le lanceur fait un si mauvais jeu de mots qu’il jette un froid et échange sa place avec un Pokémon de l’équipe prêt à combattre. La neige tombe pendant cinq tours." + }, + "tidyUp": { + "name": "Grand Nettoyage", + "effect": "Le lanceur fait le ménage sur le terrain, ce qui annule les effets de Picots, Piège de Roc, Toile Gluante, Pics Toxik, et Clonage. Augmente l’Attaque et la Vitesse du lanceur." + }, + "snowscape": { + "name": "Chute de Neige", + "effect": "Le lanceur invoque une tempête de neige qui dure cinq tours, ce qui augmente la Défense des Pokémon de type Glace." + }, + "pounce": { + "name": "Bond", + "effect": "Le lanceur attaque en bondissant sur la cible, ce qui baisse la Vitesse de celle-ci." + }, + "trailblaze": { + "name": "Désherbaffe", + "effect": "Le lanceur surgit des hautes herbes pour attaquer la cible. Les mouvements agiles du lanceur augmentent sa Vitesse." + }, + "chillingWater": { + "name": "Douche Froide", + "effect": "Le lanceur attaque la cible en l’arrosant d’une eau si froide qu’elle détériore son esprit combatif. Baisse l’Attaque de la cible." + }, + "hyperDrill": { + "name": "Hyperceuse", + "effect": "Le lanceur fait tourner à toute vitesse la partie pointue de son corps afin de transpercer la cible. Ignore même les capacités comme Abri ou Détection." + }, + "twinBeam": { + "name": "Double Laser", + "effect": "Le lanceur projette d’étranges rayons lumineux avec ses yeux et inflige des dégâts deux fois d’affilée." + }, + "rageFist": { + "name": "Poing de Colère", + "effect": "Le lanceur transforme sa colère en énergie pour attaquer. Plus il a subi d’attaques, plus la puissance de cette capacité augmente." + }, + "armorCannon": { + "name": "Canon Blindé", + "effect": "Le lanceur tire un boulet de canon ardent provenant de sa propre armure sur la cible. Cela baisse la Défense et la Défense Spéciale du lanceur." + }, + "bitterBlade": { + "name": "Lame en Peine", + "effect": "Le lanceur concentre son amertume du monde des vivants dans la pointe de ses épées et tranche la cible. La moitié des dégâts infligés sont convertis en PV pour le lanceur." + }, + "doubleShock": { + "name": "Double Décharge", + "effect": "Le lanceur libère toute l’électricité contenue dans son corps pour infliger des dégâts élevés à la cible. Le lanceur perd le type Électrik." + }, + "gigatonHammer": { + "name": "Marteau Mastoc", + "effect": "Le lanceur met tout son corps à contribution pour attaquer la cible avec un immense marteau. Cette capacité ne peut pas être utilisée deux fois d’affilée." + }, + "comeuppance": { + "name": "Vindicte", + "effect": "Le lanceur contre-attaque avec un coup infligeant des dégâts supérieurs à ceux de la dernière capacité qui l’a blessé." + }, + "aquaCutter": { + "name": "Tranch’Aqua", + "effect": "Le lanceur projette de l’eau pressurisée qui entaille la cible comme une lame. Taux de critiques élevé." + }, + "blazingTorque": { + "name": "Crash Brulant", + "effect": "Crash Brulant inflige des dégâts et possède 30 % de chances de bruler l’adversaire." + }, + "wickedTorque": { + "name": "Crash Obscur", + "effect": "Crash Obscur inflige des dégâts et possède 10 % de chances d’endormir l’adversaire." + }, + "noxiousTorque": { + "name": "Crash Toxique", + "effect": "Crash Toxique inflige des dégâts et possède 30 % de chances d’empoisonner l’adversaire." + }, + "combatTorque": { + "name": "Crash Musclé", + "effect": "Crash Musclé inflige des dégâts et possède 30 % de chances de paralyser l’adversaire." + }, + "magicalTorque": { + "name": "Crash Magique", + "effect": "Crash Magique inflige des dégâts et possède 30 % de chances de rendre l’adversaire confus." + }, + "bloodMoon": { + "name": "Lune Rouge", + "effect": "Le lanceur concentre toute son énergie dans la lune rouge sang sur son front et la projette sur la cible. Cette capacité ne peut pas être utilisée deux fois d’affilée." + }, + "matchaGotcha": { + "name": "Mortier Matcha", + "effect": "Le lanceur remue son thé et en bombarde la cible. La moitié des dégâts infligés sont convertis en PV pour le lanceur. Cette capacité peut aussi bruler la cible." + }, + "syrupBomb": { + "name": "Bombe au Sirop", + "effect": "Le lanceur jette une bombe qui recouvre la cible de sirop gluant et fait progressivement baisser la Vitesse de la cible pendant trois tours." + }, + "ivyCudgel": { + "name": "Massue Liane", + "effect": "Le lanceur frappe la cible à l’aide d’une massue entourée d’une liane. Le type de cette capacité varie en fonction du masque que porte le lanceur. Taux de critiques élevé." + }, + "electroShot": { + "name": "Fulgurayon", + "effect": "Le lanceur absorbe de l’électricité au premier tour, ce qui augmente son Attaque Spéciale, et envoie une puissante décharge au second. S’il pleut, il l’envoie au premier tour." + }, + "teraStarstorm": { + "name": "Pluie Térastrale", + "effect": "Le lanceur bombarde la cible afin de l’éliminer grâce au pouvoir des cristaux. Si le lanceur est Terapagos sous sa Forme Stellaire, la capacité touche tous les ennemis." + }, + "fickleBeam": { + "name": "Laser Hasard", + "effect": "Le lanceur attaque en tirant un rayon lumineux. Il arrive parfois que toutes les têtes agissent ensemble, ce qui double la puissance de la capacité." + }, + "burningBulwark": { + "name": "Rempart Brulant", + "effect": "Le lanceur se protège contre les attaques grâce à son pelage incandescent, et si un assaillant utilise une attaque directe contre lui, il le brule." + }, + "thunderclap": { + "name": "Vif Éclair", + "effect": "Permet au lanceur d’attaquer la cible en priorité avec une décharge électrique. Échoue si la cible ne prépare pas une attaque." + }, + "mightyCleave": { + "name": "Lame Puissante", + "effect": "Le lanceur pourfend la cible avec la lumière accumulée sur sa tête. Cette attaque passe outre les protections." + }, + "tachyonCutter": { + "name": "Lame Tachyonique", + "effect": "Le lanceur concentre des particules élémentaires pour créer une lame qui inflige des dégâts à la cible deux fois d’affilée. N’échoue jamais." + }, + "hardPress": { + "name": "Pression Extrême", + "effect": "Le lanceur écrase la cible avec ses bras ou ses pinces. Plus il reste de PV à la cible, plus la puissance de la capacité augmente." + }, + "dragonCheer": { + "name": "Cri Draconique", + "effect": "Le lanceur galvanise ses alliés avec un encouragement draconique qui augmente leur taux de critiques. L’effet est plus puissant si les alliés ont le type Dragon." + }, + "alluringVoice": { + "name": "Voix Envoutante", + "effect": "Le lanceur attaque la cible avec sa voix angélique. Cette capacité rend la cible confuse si ses stats ont augmenté pendant ce tour." + }, + "temperFlare": { + "name": "Indignition", + "effect": "Le lanceur utilise la force de son dépit pour attaquer. S’il a utilisé une capacité qui a échoué au tour précédent, la puissance d’Indignition est doublée." + }, + "supercellSlam": { + "name": "Volt Assaut", + "effect": "Le lanceur se charge en électricité et fond sur la cible. S’il échoue, le lanceur se blesse." + }, + "psychicNoise": { + "name": "Dissonance Psy", + "effect": "Le lanceur attaque avec des ondes sonores dissonantes. Cela empêche la cible de récupérer des PV à l’aide de capacités, talents ou objets tenus pendant 2 tours." + }, + "upperHand": { + "name": "Prio-Parade", + "effect": "Le lanceur réagit instinctivement au moindre mouvement et donne un coup de paume qui apeure la cible. Échoue si cette dernière n’a pas utilisé une attaque prioritaire." + }, + "malignantChain": { + "name": "Chaine Malsaine", + "effect": "Le lanceur ligote la cible avec une chaine faite de poison et lui injecte un venin corrosif, ce qui peut aussi gravement l’empoisonner." + } +} diff --git a/src/locales/fr/move.ts b/src/locales/fr/move.ts deleted file mode 100644 index 3fea8995694..00000000000 --- a/src/locales/fr/move.ts +++ /dev/null @@ -1,3812 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -export const move: MoveTranslationEntries = { - "pound": { - name: "Écras’Face", - effect: "Le lanceur écrase la cible avec l’un de ses membres, tels qu’une de ses pattes avant ou sa longue queue." - }, - "karateChop": { - name: "Poing Karaté", - effect: "L’ennemi est tranché violemment. Taux de critique élevé." - }, - "doubleSlap": { - name: "Torgnoles", - effect: "Gifle rapidement l’ennemi de deux à cinq fois d’affilée." - }, - "cometPunch": { - name: "Poing Comète", - effect: "Une tornade de coups de poing qui frappe de deux à cinq fois d’affilée." - }, - "megaPunch": { - name: "Ultimapoing", - effect: "La cible reçoit un coup de poing d’une grande puissance." - }, - "payDay": { - name: "Jackpot", - effect: "Des pièces sont lancées sur la cible. Permet d’obtenir de l’argent à la fin du combat." - }, - "firePunch": { - name: "Poing Feu", - effect: "Un coup de poing enflammé vient frapper la cible, ce qui peut la brûler (10% de chances)." - }, - "icePunch": { - name: "Poing Glace", - effect: "Un coup de poing glacé vient frapper la cible, ce qui peut la geler (10% de chances)." - }, - "thunderPunch": { - name: "Poing Éclair", - effect: "Un coup de poing électrique vient frapper la cible, ce qui peut la paralyser (10% de chances)." - }, - "scratch": { - name: "Griffe", - effect: "Lacère la cible avec des griffes acérées pour lui infliger des dégâts." - }, - "viseGrip": { - name: "Force Poigne", - effect: "La cible est attrapée et compressée par les côtés." - }, - "guillotine": { - name: "Guillotine", - effect: "Des pinces lacèrent violemment la cible, la mettant K.O. sur le coup si elle est touchée." - }, - "razorWind": { - name: "Coupe-Vent", - effect: "Attaque en deux tours. Des lames de vent frappent l’ennemi au second tour. Taux de critique élevé." - }, - "swordsDance": { - name: "Danse Lames", - effect: "Une danse frénétique qui exalte l’esprit combatif. Augmente beaucoup l’Attaque du lanceur." - }, - "cut": { - name: "Coupe", - effect: "Coupe la cible avec des lames ou des griffes." - }, - "gust": { - name: "Tornade", - effect: "Le lanceur bat des ailes pour générer une bourrasque qui blesse la cible." - }, - "wingAttack": { - name: "Cru-Ailes", - effect: "Le lanceur déploie largement ses ailes majestueuses pour attaquer la cible." - }, - "whirlwind": { - name: "Cyclone", - effect: "Éjecte le Pokémon ennemi et le remplace par un autre. Lors d’un combat contre un Pokémon sauvage seul, met fin au combat." - }, - "fly": { - name: "Vol", - effect: "Le lanceur s’envole au premier tour et frappe au second." - }, - "bind": { - name: "Étreinte", - effect: "Le lanceur ligote la cible avec son corps allongé ou ses tentacules pour la compresser durant quatre à cinq tours." - }, - "slam": { - name: "Souplesse", - effect: "Le lanceur utilise l’un de ses membres, tels qu’une queue ou une liane, pour infliger des dégâts à la cible." - }, - "vineWhip": { - name: "Fouet Lianes", - effect: "Fouette la cible avec de fines lianes pour infliger des dégâts." - }, - "stomp": { - name: "Écrasement", - effect: "Écrase la cible avec un énorme pied, ce qui peut aussi l’apeurer (30% de chances)." - }, - "doubleKick": { - name: "Double Pied", - effect: "Deux coups de pied qui frappent la cible deux fois d’affilée." - }, - "megaKick": { - name: "Ultimawashi", - effect: "Un coup de pied surpuissant qui frappe la cible." - }, - "jumpKick": { - name: "Pied Sauté", - effect: "Le lanceur s’envole pour décocher un coup de pied sauté. S’il échoue, le lanceur se blesse." - }, - "rollingKick": { - name: "Mawashi Geri", - effect: "Le lanceur effectue un coup de pied tournoyant et extrêmement rapide. Peut apeurer l’ennemi (30% de chances)." - }, - "sandAttack": { - name: "Jet de Sable", - effect: "Lance du sable au visage de la cible pour baisser sa Précision." - }, - "headbutt": { - name: "Coup d’Boule", - effect: "Le lanceur donne un coup de tête à la cible qui peut aussi l’apeurer (30% de chances)." - }, - "hornAttack": { - name: "Koud’Korne", - effect: "Frappe la cible d’un coup de corne pointue pour infliger des dégâts." - }, - "furyAttack": { - name: "Furie", - effect: "Frappe la cible deux à cinq fois d’affilée avec un membre pointu tel qu’un bec ou une corne." - }, - "hornDrill": { - name: "Empal’Korne", - effect: "Un coup de corne en vrille qui empale la cible, la mettant K.O. sur le coup si elle est touchée." - }, - "tackle": { - name: "Charge", - effect: "Le lanceur charge la cible et la percute de tout son poids." - }, - "bodySlam": { - name: "Plaquage", - effect: "Le lanceur se laisse tomber sur la cible de tout son poids, ce qui peut aussi la paralyser (30% de chances)." - }, - "wrap": { - name: "Ligotage", - effect: "Le lanceur ligote la cible avec son corps allongé ou ses tentacules pour la compresser durant quatre à cinq tours." - }, - "takeDown": { - name: "Bélier", - effect: "Une charge violente qui blesse aussi légèrement le lanceur." - }, - "thrash": { - name: "Mania", - effect: "Une attaque furieuse qui dure de deux à trois tours. Le lanceur devient confus." - }, - "doubleEdge": { - name: "Damoclès", - effect: "Une charge dangereuse et imprudente. Blesse aussi gravement le lanceur." - }, - "tailWhip": { - name: "Mimi-Queue", - effect: "Le lanceur remue son adorable queue pour tromper la vigilance de la cible et baisser sa Défense." - }, - "poisonSting": { - name: "Dard-Venin", - effect: "Un dard toxique transperce la cible et peut aussi l’empoisonner (30% de chances)." - }, - "twineedle": { - name: "Double Dard", - effect: "Un double coup de dard qui transperce l’ennemi deux fois d’affilée. Peut aussi l’empoisonner (36% de chances)." - }, - "pinMissile": { - name: "Dard-Nuée", - effect: "Envoie une rafale de dards. Peut toucher de deux à cinq fois." - }, - "leer": { - name: "Groz’Yeux", - effect: "Le lanceur fait les gros yeux à la cible pour l’intimider et baisser sa Défense." - }, - "bite": { - name: "Morsure", - effect: "Le lanceur utilise ses canines tranchantes pour mordre la cible, ce qui peut aussi l’apeurer (30% de chances)." - }, - "growl": { - name: "Rugissement", - effect: "Le lanceur pousse un cri tout mimi pour tromper la vigilance de la cible et baisser son Attaque." - }, - "roar": { - name: "Hurlement", - effect: "Effraie le Pokémon ennemi et le remplace par un autre. Lors d’un combat contre un Pokémon sauvage seul, met fin au combat." - }, - "sing": { - name: "Berceuse", - effect: "Une berceuse plonge la cible dans un profond sommeil." - }, - "supersonic": { - name: "Ultrason", - effect: "Le lanceur produit d’étranges ondes sonores qui rendent la cible confuse." - }, - "sonicBoom": { - name: "Sonic Boom", - effect: "Une onde de choc destructrice qui inflige toujours 20 PV de dégâts." - }, - "disable": { - name: "Entrave", - effect: "Empêche la cible de répéter sa dernière attaque. Dure quatre tours." - }, - "acid": { - name: "Acide", - effect: "Le lanceur attaque la cible avec un jet d’acide corrosif qui peut aussi baisser sa Défense Spéciale." - }, - "ember": { - name: "Flammèche", - effect: "La cible est attaquée par une faible flamme qui peut aussi la brûler." - }, - "flamethrower": { - name: "Lance-Flammes", - effect: "La cible reçoit un torrent de flammes qui peut aussi la brûler (10% de chances)." - }, - "mist": { - name: "Brume", - effect: "Une brume blanche enveloppe le lanceur et ses alliés et empêche la réduction des stats pour cinq tours." - }, - "waterGun": { - name: "Pistolet à O", - effect: "De l’eau est projetée avec force sur la cible." - }, - "hydroPump": { - name: "Hydrocanon", - effect: "Un puissant jet d’eau est dirigé sur la cible." - }, - "surf": { - name: "Surf", - effect: "Une énorme vague s’abat sur le champ de bataille et inflige des dégâts à tous les Pokémon autour du lanceur." - }, - "iceBeam": { - name: "Laser Glace", - effect: "Un rayon de glace frappe la cible, ce qui peut aussi la geler (10% de chances)." - }, - "blizzard": { - name: "Blizzard", - effect: "Une violente tempête de neige s’abat sur la cible, ce qui peut aussi la geler (10% de chances)." - }, - "psybeam": { - name: "Rafale Psy", - effect: "Un étrange rayon frappe la cible, ce qui peut aussi la rendre confuse." - }, - "bubbleBeam": { - name: "Bulles d’O", - effect: "Des bulles sont envoyées avec puissance sur la cible, ce qui peut aussi baisser sa Vitesse." - }, - "auroraBeam": { - name: "Onde Boréale", - effect: "Le lanceur envoie un rayon arc-en-ciel sur la cible, ce qui peut aussi baisser son Attaque." - }, - "hyperBeam": { - name: "Ultralaser", - effect: "Le lanceur projette un puissant rayon sur la cible, mais doit se reposer au tour suivant." - }, - "peck": { - name: "Picpic", - effect: "Le lanceur frappe la cible d’un bec acéré ou d’une corne pointue pour infliger des dégâts." - }, - "drillPeck": { - name: "Bec Vrille", - effect: "Une attaque utilisant le bec comme une perceuse." - }, - "submission": { - name: "Sacrifice", - effect: "Le lanceur agrippe l’ennemi et l’écrase au sol. Blesse aussi légèrement le lanceur." - }, - "lowKick": { - name: "Balayage", - effect: "Un grand coup de pied bas qui fauche la cible. Plus celle-ci est lourde, plus la puissance de cette capacité augmente." - }, - "counter": { - name: "Riposte", - effect: "Une riposte qui répond à toute attaque physique en infligeant le double de dégâts." - }, - "seismicToss": { - name: "Frappe Atlas", - effect: "La cible est projetée grâce au pouvoir de la gravité. Cette capacité inflige des dégâts égaux au niveau du lanceur." - }, - "strength": { - name: "Force", - effect: "Le lanceur cogne la cible de toutes ses forces." - }, - "absorb": { - name: "Vole-Vie", - effect: "Une attaque qui absorbe les nutriments et convertit la moitié des dégâts infligés en PV pour le lanceur." - }, - "megaDrain": { - name: "Méga-Sangsue", - effect: "Une attaque qui absorbe les nutriments et convertit la moitié des dégâts infligés en PV pour le lanceur." - }, - "leechSeed": { - name: "Vampigraine", - effect: "Une graine est semée sur la cible. À chaque tour, elle lui dérobe des PV que le lanceur récupère." - }, - "growth": { - name: "Croissance", - effect: "Le corps du lanceur se développe. Augmente l’Attaque et l’Attaque Spéciale." - }, - "razorLeaf": { - name: "Tranch’Herbe", - effect: "Des feuilles aiguisées comme des rasoirs entaillent la cible. Taux de critiques élevé." - }, - "solarBeam": { - name: "Lance-Soleil", - effect: "Le lanceur absorbe une grande quantité de lumière au premier tour et envoie un rayon puissant au tour suivant." - }, - "poisonPowder": { - name: "Poudre Toxik", - effect: "Une poudre toxique empoisonne la cible." - }, - "stunSpore": { - name: "Para-Spore", - effect: "Le lanceur répand sur la cible une poudre qui la paralyse." - }, - "sleepPowder": { - name: "Poudre Dodo", - effect: "Le lanceur répand une poudre soporifique qui endort la cible." - }, - "petalDance": { - name: "Danse Fleurs", - effect: "Le lanceur attaque en projetant des pétales pendant deux à trois tours avant de céder à la confusion." - }, - "stringShot": { - name: "Sécrétion", - effect: "Le lanceur crache de la soie pour ligoter la cible et beaucoup baisser sa Vitesse." - }, - "dragonRage": { - name: "Draco-Rage", - effect: "La colère du lanceur déclenche une onde de choc destructrice qui inflige toujours 40 PV de dégâts." - }, - "fireSpin": { - name: "Danse Flammes", - effect: "Un tourbillon de flammes emprisonne la cible pendant quatre à cinq tours." - }, - "thunderShock": { - name: "Éclair", - effect: "Une décharge électrique tombe sur la cible, ce qui peut aussi la paralyser (10% de chances)." - }, - "thunderbolt": { - name: "Tonnerre", - effect: "Une grosse décharge électrique tombe sur la cible, ce qui peut aussi la paralyser (10% de chances)." - }, - "thunderWave": { - name: "Cage Éclair", - effect: "Un faible choc électrique paralyse la cible." - }, - "thunder": { - name: "Fatal-Foudre", - effect: "La foudre tombe sur la cible pour lui infliger des dégâts, ce qui peut aussi la paralyser (30% de chances)." - }, - "rockThrow": { - name: "Jet-Pierres", - effect: "Le lanceur soulève une pierre et la lance sur la cible." - }, - "earthquake": { - name: "Séisme", - effect: "Le lanceur provoque un tremblement de terre touchant tous les Pokémon autour de lui." - }, - "fissure": { - name: "Abîme", - effect: "Le lanceur fait tomber la cible dans une crevasse. Si cette attaque réussit, elle met K.O. sur le coup." - }, - "dig": { - name: "Tunnel", - effect: "Le lanceur creuse au premier tour et frappe au second." - }, - "toxic": { - name: "Fil Toxique", - effect: "Tisse un fil imprégné de venin. Empoisonne la cible et baisse sa Vitesse." - }, - "confusion": { - name: "Choc Mental", - effect: "Une faible vague télékinétique frappe la cible, ce qui peut aussi la plonger dans la confusion." - }, - "psychic": { - name: "Psyko", - effect: "Une puissante force télékinétique frappe la cible, ce qui peut aussi faire baisser sa Défense Spéciale." - }, - "hypnosis": { - name: "Hypnose", - effect: "Le lanceur hypnotise la cible pour la plonger dans un profond sommeil." - }, - "meditate": { - name: "Yoga", - effect: "Le lanceur médite pour éveiller son pouvoir latent et augmenter son Attaque." - }, - "agility": { - name: "Hâte", - effect: "Le lanceur se relaxe et allège son corps pour beaucoup augmenter sa Vitesse." - }, - "quickAttack": { - name: "Vive-Attaque", - effect: "Le lanceur fonce sur la cible si rapidement qu’on parvient à peine à le discerner. Frappe en priorité." - }, - "rage": { - name: "Frénésie", - effect: "Une fois activée, cette capacité augmente l’Attaque du lanceur à mesure que celui-ci subit des attaques." - }, - "teleport": { - name: "Téléport", - effect: "Permet de changer de place avec un autre Pokémon de l’équipe s’il y en a. Quand cette capacité est utilisée par un Pokémon sauvage, celui-ci fuit le combat." - }, - "nightShade": { - name: "Ombre Nocturne", - effect: "Le lanceur invoque un mirage et inflige des dégâts égaux au niveau du lanceur." - }, - "mimic": { - name: "Copie", - effect: "Le lanceur copie la dernière capacité utilisée par la cible et la conserve tant qu’il reste au combat." - }, - "screech": { - name: "Grincement", - effect: "Le lanceur émet un son strident qui donne envie de se boucher les oreilles. Baisse beaucoup la Défense de la cible." - }, - "doubleTeam": { - name: "Reflet", - effect: "Le lanceur se déplace si vite qu’il crée des copies illusoires de lui-même, augmentant son Esquive." - }, - "recover": { - name: "Soin", - effect: "Un soin qui permet au lanceur de récupérer jusqu’à la moitié de ses PV max." - }, - "harden": { - name: "Armure", - effect: "Le lanceur contracte tous ses muscles pour augmenter sa Défense." - }, - "minimize": { - name: "Lilliput", - effect: "Le lanceur comprime son corps pour se faire tout petit et beaucoup augmenter son Esquive." - }, - "smokescreen": { - name: "Brouillard", - effect: "Le lanceur disperse un nuage d’encre ou de fumée qui réduit la Précision de la cible." - }, - "confuseRay": { - name: "Onde Folie", - effect: "Une lumière étrange qui plonge la cible dans un état de confusion." - }, - "withdraw": { - name: "Repli", - effect: "Le lanceur se recroqueville dans sa carapace, ce qui augmente sa Défense." - }, - "defenseCurl": { - name: "Boul’Armure", - effect: "Le lanceur s’enroule pour cacher ses points faibles, ce qui augmente sa Défense." - }, - "barrier": { - name: "Bouclier", - effect: "Le lanceur érige un mur solide qui augmente beaucoup sa Défense." - }, - "lightScreen": { - name: "Mur Lumière", - effect: "Crée un fabuleux mur de lumière qui réduit les dégâts causés par les capacités spéciales pendant cinq tours." - }, - "haze": { - name: "Buée Noire", - effect: "Crée un brouillard qui annule les changements de stats de tous les Pokémon au combat." - }, - "reflect": { - name: "Protection", - effect: "Crée un fabuleux mur de lumière qui réduit les dégâts causés par les capacités physiques pendant cinq tours." - }, - "focusEnergy": { - name: "Puissance", - effect: "Le lanceur prend une profonde inspiration et se concentre pour augmenter son taux de critiques." - }, - "bide": { - name: "Patience", - effect: "Le lanceur encaisse les coups durant deux tours et réplique en infligeant le double des dégâts subis." - }, - "metronome": { - name: "Métronome", - effect: "Le lanceur agite un doigt et stimule son cerveau pour utiliser presque n’importe quelle capacité au hasard." - }, - "mirrorMove": { - name: "Mimique", - effect: "Le lanceur riposte à l’attaque de l’ennemi avec la même attaque." - }, - "selfDestruct": { - name: "Destruction", - effect: "Le lanceur explose en blessant tous les Pokémon autour de lui. Le lanceur tombe K.O." - }, - "eggBomb": { - name: "Bombe Œuf", - effect: "De toutes ses forces, le lanceur jette un gros œuf sur l’ennemi pour lui infliger des dégâts." - }, - "lick": { - name: "Léchouille", - effect: "Un grand coup de langue qui inflige des dégâts à la cible et peut aussi la paralyser (30% de chances)." - }, - "smog": { - name: "Purédpois", - effect: "Le lanceur attaque à l'aide d'une éruption de gaz répugnants qui peuvent aussi empoisonner la cible." - }, - "sludge": { - name: "Détritus", - effect: "Des détritus toxiques sont projetés sur la cible, ce qui peut aussi l’empoisonner (30% de chances)." - }, - "boneClub": { - name: "Massd’Os", - effect: "Le lanceur frappe l’ennemi à grands coups d’os. Peut aussi l’apeurer (10% de chances)." - }, - "fireBlast": { - name: "Déflagration", - effect: "Un déluge de flammes ardentes submerge la cible, ce qui peut aussi la brûler (10% de chances)." - }, - "waterfall": { - name: "Cascade", - effect: "Le lanceur charge la cible avec une intensité remarquable, ce qui peut l’apeurer (20% de chances)." - }, - "clamp": { - name: "Claquoir", - effect: "Le lanceur piège l’ennemi dans sa dure coquille et l’écrase pendant quatre à cinq tours." - }, - "swift": { - name: "Météores", - effect: "Le lanceur envoie des rayons d’étoiles qui touchent toujours la cible." - }, - "skullBash": { - name: "Coud’Krâne", - effect: "Le lanceur baisse la tête pour augmenter sa Défense au premier tour et percuter l’ennemi au second." - }, - "spikeCannon": { - name: "Picanon", - effect: "Envoie une rafale de dards. Peut toucher de deux à cinq fois." - }, - "constrict": { - name: "Constriction", - effect: "De longs tentacules ou lianes attaquent l’ennemi. Peut aussi baisser sa Vitesse." - }, - "amnesia": { - name: "Amnésie", - effect: "Le lanceur fait le vide dans son esprit pour oublier ses soucis. Augmente beaucoup sa Défense Spéciale." - }, - "kinesis": { - name: "Télékinésie", - effect: "Le lanceur distrait l’ennemi en pliant une cuiller, ce qui baisse sa Précision." - }, - "softBoiled": { - name: "E-Coque", - effect: "Le lanceur récupère jusqu’à la moitié de ses PV max." - }, - "highJumpKick": { - name: "Pied Voltige", - effect: "Le lanceur s’élance pour effectuer un coup de genou sauté. S’il échoue, le lanceur se blesse." - }, - "glare": { - name: "Regard Médusant", - effect: "Le lanceur intimide la cible grâce à son regard terrifiant pour la paralyser." - }, - "dreamEater": { - name: "Dévorêve", - effect: "Le lanceur mange le rêve de la cible endormie et récupère en PV la moitié des dégâts infligés." - }, - "poisonGas": { - name: "Gaz Toxik", - effect: "Le lanceur empoisonne la cible en lui projetant un nuage de gaz toxique au visage." - }, - "barrage": { - name: "Pilonnage", - effect: "Projette de deux à cinq grosses boules sur l’ennemi." - }, - "leechLife": { - name: "Vampirisme", - effect: "Une attaque qui aspire le sang de la cible. La moitié des dégâts sont convertis en PV pour le lanceur." - }, - "lovelyKiss": { - name: "Grobisou", - effect: "Le lanceur fait un bisou à l’ennemi en prenant une mine effrayante. Endort l’ennemi." - }, - "skyAttack": { - name: "Piqué", - effect: "Une attaque en deux tours au taux de critiques élevé, qui peut aussi apeurer la cible (30% de chances)." - }, - "transform": { - name: "Morphing", - effect: "Le lanceur devient une copie de sa cible et obtient la même palette de capacités." - }, - "bubble": { - name: "Écume", - effect: "Des bulles frappent l’ennemi. Peut réduire sa Vitesse." - }, - "dizzyPunch": { - name: "Uppercut", - effect: "Un enchaînement de coups de poing cadencés frappe l’ennemi. Peut aussi le rendre confus." - }, - "spore": { - name: "Spore", - effect: "Le lanceur répand un nuage de spores qui endort." - }, - "flash": { - name: "Flash", - effect: "Explosion lumineuse qui fait baisser la Précision de l’ennemi." - }, - "psywave": { - name: "Vague Psy", - effect: "Une étrange onde d’énergie chaude frappe l’ennemi. Cette attaque est d’intensité variable." - }, - "splash": { - name: "Trempette", - effect: "Le lanceur barbote et éclabousse les environs. Cette capacité n’a aucun effet." - }, - "acidArmor": { - name: "Acidarmure", - effect: "Le lanceur modifie sa structure moléculaire pour se liquéfier et beaucoup augmenter sa Défense." - }, - "crabhammer": { - name: "Pince-Masse", - effect: "Une grande pince martèle la cible. Taux de critiques élevé." - }, - "explosion": { - name: "Explosion", - effect: "Le lanceur explose et inflige des dégâts à tous les Pokémon autour de lui. Met K.O. le lanceur." - }, - "furySwipes": { - name: "Combo-Griffe", - effect: "La cible est lacérée par des faux ou des griffes de deux à cinq fois d’affilée." - }, - "bonemerang": { - name: "Osmerang", - effect: "Le lanceur projette son os comme un boomerang. Cette attaque frappe à l’aller et au retour." - }, - "rest": { - name: "Repos", - effect: "Le lanceur regagne tous ses PV et ses altérations de statut sont soignées, puis il dort pendant deux tours." - }, - "rockSlide": { - name: "Éboulement", - effect: "Le lanceur envoie de gros rochers sur la cible pour lui infliger des dégâts, ce qui peut aussi l’apeurer (30% de chances)." - }, - "hyperFang": { - name: "Croc de Mort", - effect: "Le lanceur mord l’ennemi à l’aide de ses incisives aiguisées. Peut aussi l’apeurer (10% de chances)." - }, - "sharpen": { - name: "Affûtage", - effect: "Le lanceur réduit son nombre de polygones pour accentuer ses angles et augmenter son Attaque." - }, - "conversion": { - name: "Conversion", - effect: "Le lanceur change de type pour prendre celui de la première capacité de sa liste." - }, - "triAttack": { - name: "Triplattaque", - effect: "Le lanceur envoie trois boules d’énergie simultanément qui peuvent aussi paralyser, brûler ou geler la cible (6.67% de chances)." - }, - "superFang": { - name: "Croc Fatal", - effect: "Une vilaine morsure d’incisives qui réduit de moitié les PV de la cible." - }, - "slash": { - name: "Tranche", - effect: "Le lanceur donne un coup de griffe ou de faux. Taux de critiques élevé." - }, - "substitute": { - name: "Clonage", - effect: "Le lanceur crée un clone en sacrifiant quelques PV. Ce clone sert de leurre." - }, - "struggle": { - name: "Lutte", - effect: "Une attaque désespérée, utilisée quand le lanceur n’a plus de PP. Le blesse aussi légèrement." - }, - "sketch": { - name: "Gribouille", - effect: "Le lanceur apprend la dernière capacité utilisée par la cible. Gribouille disparaît après utilisation." - }, - "tripleKick": { - name: "Triple Pied", - effect: "Une salve de un à trois coups de pied dont la puissance augmente à chaque coup porté." - }, - "thief": { - name: "Larcin", - effect: "Le lanceur attaque la cible et vole son objet. Le lanceur ne peut rien voler s’il tient déjà un objet." - }, - "spiderWeb": { - name: "Toile", - effect: "Le lanceur enserre l’ennemi à l’aide d’une fine soie gluante pour l’empêcher de fuir le combat." - }, - "mindReader": { - name: "Lire-Esprit", - effect: "Le lanceur analyse les mouvements de l’ennemi pour être sûr de toucher au coup suivant." - }, - "nightmare": { - name: "Cauchemar", - effect: "Un cauchemar qui inflige des dégâts à chaque tour à un ennemi endormi." - }, - "flameWheel": { - name: "Roue de Feu", - effect: "Le lanceur s’entoure de feu et charge la cible, ce qui peut aussi la brûler (10% de chances)." - }, - "snore": { - name: "Ronflement", - effect: "Une attaque qui ne fonctionne que si le lanceur est endormi. Le boucan peut aussi apeurer la cible (30% de chances)." - }, - "curse": { - name: "Malédiction", - effect: "Une capacité à l’effet différent selon que le lanceur est un Pokémon Spectre ou non." - }, - "flail": { - name: "Gigotage", - effect: "Le lanceur attaque en gigotant dans tous les sens. Plus ses PV sont bas, plus l’attaque est puissante." - }, - "conversion2": { - name: "Conversion 2", - effect: "Le lanceur change de type pour être résistant au type de la dernière attaque lancée par sa cible." - }, - "aeroblast": { - name: "Aéroblast", - effect: "Le lanceur projette une tornade sur l’ennemi pour infliger des dégâts. Taux de critique élevé." - }, - "cottonSpore": { - name: "Spore Coton", - effect: "Le lanceur libère des spores cotonneuses qui collent à la cible et baissent beaucoup sa Vitesse." - }, - "reversal": { - name: "Contre", - effect: "Le lanceur ne retient plus ses coups. Plus ses PV sont bas, plus la puissance de cette capacité augmente." - }, - "spite": { - name: "Dépit", - effect: "Le lanceur exprime son ressentiment en retirant 4 PP à la dernière capacité utilisée par la cible." - }, - "powderSnow": { - name: "Poudreuse", - effect: "Le lanceur projette de la neige poudreuse qui peut aussi geler la cible (10% de chances)." - }, - "protect": { - name: "Abri", - effect: "Le lanceur se protège de toutes les attaques. Peut échouer si utilisée plusieurs fois de suite." - }, - "machPunch": { - name: "Mach Punch", - effect: "Coup de poing fulgurant. Frappe en priorité." - }, - "scaryFace": { - name: "Grimace", - effect: "Le lanceur fait une grimace qui effraie la cible et réduit beaucoup sa Vitesse." - }, - "feintAttack": { - name: "Feinte", - effect: "Le lanceur s’approche l’air de rien avant de frapper par surprise. N’échoue jamais." - }, - "sweetKiss": { - name: "Doux Baiser", - effect: "Le lanceur envoie un bisou si mignon et désarmant qu’il plonge la cible dans la confusion." - }, - "bellyDrum": { - name: "Cognobidon", - effect: "Améliore l’Attaque au maximum en sacrifiant la moitié des PV max." - }, - "sludgeBomb": { - name: "Bombe Beurk", - effect: "Des détritus toxiques sont projetés sur la cible, ce qui peut aussi l’empoisonner (30% de chances)." - }, - "mudSlap": { - name: "Coud’Boue", - effect: "Le lanceur envoie de la boue au visage de la cible pour infliger des dégâts et baisser sa Précision." - }, - "octazooka": { - name: "Octazooka", - effect: "Le lanceur attaque en projetant de l’encre au visage de l’ennemi. Peut aussi baisser sa Précision." - }, - "spikes": { - name: "Picots", - effect: "Le lanceur disperse des picots sur le sol pour blesser tout ennemi qui entre au combat." - }, - "zapCannon": { - name: "Élecanon", - effect: "Un boulet de canon électrifié qui inflige des dégâts à la cible et la paralyse." - }, - "foresight": { - name: "Clairvoyance", - effect: "Permet de toucher un Pokémon Spectre avec n’importe quelle capacité ou de toucher un ennemi insaisissable." - }, - "destinyBond": { - name: "Lien du Destin", - effect: "Si un assaillant porte un coup fatal au lanceur après qu’il a activé cette capacité, ils sont tous les deux mis K.O. La capacité échoue si elle est immédiatement réutilisée." - }, - "perishSong": { - name: "Requiem", - effect: "Tout Pokémon qui entend ce requiem est K.O. dans trois tours à moins qu’il ne soit remplacé." - }, - "icyWind": { - name: "Vent Glace", - effect: "Une bourrasque de vent froid blesse la cible et réduit sa Vitesse." - }, - "detect": { - name: "Détection", - effect: "Le lanceur se protège de toutes les attaques. Peut échouer si utilisée plusieurs fois de suite." - }, - "boneRush": { - name: "Charge Os", - effect: "Le lanceur frappe la cible avec un os de deux à cinq fois d’affilée." - }, - "lockOn": { - name: "Verrouillage", - effect: "Le lanceur verrouille la cible pour ne pas la rater au tour suivant." - }, - "outrage": { - name: "Colère", - effect: "Le lanceur enrage et attaque pendant deux ou trois tours avant de devenir confus." - }, - "sandstorm": { - name: "Tempête de Sable", - effect: "Une tempête de sable blesse tous les Pokémon pendant cinq tours, sauf ceux de type Roche, Sol ou Acier. Augmente la Défense Spéciale des Pokémon Roche." - }, - "gigaDrain": { - name: "Giga-Sangsue", - effect: "Une attaque qui absorbe les nutriments et convertit la moitié des dégâts infligés en PV pour le lanceur." - }, - "endure": { - name: "Ténacité", - effect: "Le lanceur résiste aux attaques avec 1 PV. Peut échouer si utilisée plusieurs fois de suite." - }, - "charm": { - name: "Charme", - effect: "Le lanceur fait les yeux doux pour berner la cible et beaucoup réduire son Attaque." - }, - "rollout": { - name: "Roulade", - effect: "Un rocher roule sur la cible pendant cinq tours. L’attaque gagne en puissance à chaque coup." - }, - "falseSwipe": { - name: "Faux-Chage", - effect: "Le lanceur retient ses coups pour que la cible garde au moins 1 PV et ne tombe pas K.O." - }, - "swagger": { - name: "Vantardise", - effect: "Fait enrager la cible et la plonge dans la confusion, mais augmente beaucoup son Attaque." - }, - "milkDrink": { - name: "Lait à Boire", - effect: "Le lanceur récupère jusqu’à la moitié de ses PV max." - }, - "spark": { - name: "Étincelle", - effect: "Le lanceur envoie une charge électrique sur la cible qui peut aussi la paralyser (30% de chances)." - }, - "furyCutter": { - name: "Taillade", - effect: "Un coup de faux ou de griffe dont la puissance augmente quand il touche plusieurs fois d’affilée." - }, - "steelWing": { - name: "Ailes d’Acier", - effect: "Le lanceur frappe la cible avec des ailes d’acier, ce qui peut aussi augmenter la Défense du lanceur." - }, - "meanLook": { - name: "Regard Noir", - effect: "Le lanceur pétrifie la cible en lui lançant un regard noir qui la rend incapable de quitter le terrain." - }, - "attract": { - name: "Attraction", - effect: "Si la cible est du sexe opposé, elle tombe amoureuse et rechigne alors à attaquer." - }, - "sleepTalk": { - name: "Blabla Dodo", - effect: "Le lanceur utilise une de ses capacités au hasard. Il ne peut utiliser cette capacité que quand il dort." - }, - "healBell": { - name: "Glas de Soin", - effect: "Carillon apaisant qui soigne les altérations de statut de tous les Pokémon de l’équipe." - }, - "return": { - name: "Retour", - effect: "Plus le Pokémon apprécie son Dresseur, plus la puissance de cette attaque furieuse augmente." - }, - "present": { - name: "Cadeau", - effect: "Le lanceur attaque en offrant un cadeau piégé à la cible, mais le cadeau peut parfois restaurer les PV de celle-ci à la place." - }, - "frustration": { - name: "Frustration", - effect: "Moins le Pokémon aime son Dresseur, plus cette attaque est puissante." - }, - "safeguard": { - name: "Rune Protect", - effect: "Crée un champ protecteur qui empêche toutes les altérations de statut pendant cinq tours." - }, - "painSplit": { - name: "Balance", - effect: "Le lanceur ajoute ses PV à ceux de sa cible et les répartit équitablement." - }, - "sacredFire": { - name: "Feu Sacré", - effect: "Le lanceur génère un feu mystique d’une intensité redoutable pour attaquer l’ennemi. Peut aussi le brûler (50% de chances)." - }, - "magnitude": { - name: "Ampleur", - effect: "Provoque un tremblement de terre d’intensité variable qui affecte tous les Pokémon alentour. L’efficacité varie." - }, - "dynamicPunch": { - name: "Dynamo-Poing", - effect: "Le lanceur rassemble ses forces et envoie un coup de poing à la cible, ce qui la rend confuse à coup sûr." - }, - "megahorn": { - name: "Mégacorne", - effect: "Le lanceur inflige un grand coup de corne à la cible." - }, - "dragonBreath": { - name: "Draco-Souffle", - effect: "Le lanceur souffle fort sur la cible pour lui infliger des dégâts, ce qui peut aussi la paralyser (30% de chances)." - }, - "batonPass": { - name: "Relais", - effect: "Le lanceur échange sa place et tout changement de stats avec un Pokémon de l’équipe." - }, - "encore": { - name: "Encore", - effect: "Le lanceur oblige la cible à répéter la dernière capacité utilisée durant trois tours." - }, - "pursuit": { - name: "Poursuite", - effect: "Une attaque qui inflige deux fois plus de dégâts à un ennemi qui s’apprête à être remplacé." - }, - "rapidSpin": { - name: "Tour Rapide", - effect: "Le lanceur attaque en tournant sur lui-même. Sa Vitesse augmente également. Il se libère également des effets de capacités comme Étreinte, Ligotage ou Vampigraine." - }, - "sweetScent": { - name: "Doux Parfum", - effect: "Un doux parfum qui réduit beaucoup l’Esquive de la cible." - }, - "ironTail": { - name: "Queue de Fer", - effect: "Le lanceur attaque la cible avec une queue de fer, ce qui peut aussi baisser la Défense de la cible." - }, - "metalClaw": { - name: "Griffe Acier", - effect: "Attaque avec des griffes d’acier. Peut aussi augmenter l’Attaque du lanceur." - }, - "vitalThrow": { - name: "Corps Perdu", - effect: "Le lanceur porte son coup en dernier. En échange, cette capacité n’échoue jamais." - }, - "morningSun": { - name: "Aurore", - effect: "Un soin qui restaure des PV au lanceur. Son efficacité varie en fonction de la météo." - }, - "synthesis": { - name: "Synthèse", - effect: "Un soin qui restaure des PV au lanceur. Son efficacité varie en fonction de la météo." - }, - "moonlight": { - name: "Rayon Lune", - effect: "Un soin qui restaure des PV au lanceur. Son efficacité varie en fonction de la météo." - }, - "hiddenPower": { - name: "Puissance Cachée", - effect: "Attaque dont le type dépend du Pokémon qui l’utilise." - }, - "crossChop": { - name: "Coup Croix", - effect: "Le lanceur délivre un coup double en croisant les avant-bras. Taux de critiques élevé." - }, - "twister": { - name: "Ouragan", - effect: "Le lanceur déclenche un terrible ouragan sur la cible, ce qui peut aussi apeurer celle-ci (20% de chances)." - }, - "rainDance": { - name: "Danse Pluie", - effect: "Invoque de fortes pluies qui durent cinq tours, augmentant la puissance des capacités de type Eau et baissant celle des capacités de type Feu." - }, - "sunnyDay": { - name: "Zénith", - effect: "Fait briller le soleil pendant cinq tours, augmentant la puissance des capacités de type Feu et baissant celle des capacités de type Eau." - }, - "crunch": { - name: "Mâchouille", - effect: "Le lanceur mord la cible de ses crocs pointus, ce qui peut aussi baisser sa Défense." - }, - "mirrorCoat": { - name: "Voile Miroir", - effect: "Une riposte qui contre n’importe quelle capacité spéciale en infligeant le double des dégâts subis." - }, - "psychUp": { - name: "Boost", - effect: "Une autohypnose qui permet au lanceur de copier les changements de stats de la cible." - }, - "extremeSpeed": { - name: "Vitesse Extrême", - effect: "Le lanceur charge à une vitesse renversante. Frappe en priorité." - }, - "ancientPower": { - name: "Pouvoir Antique", - effect: "Une attaque préhistorique qui peut augmenter toutes les stats du lanceur d’un seul coup." - }, - "shadowBall": { - name: "Ball’Ombre", - effect: "Le lanceur projette une grande ombre sur la cible qui peut aussi faire baisser la Défense Spéciale de celle-ci." - }, - "futureSight": { - name: "Prescience", - effect: "De l’énergie psychique vient frapper la cible deux tours après l’utilisation de cette capacité." - }, - "rockSmash": { - name: "Éclate-Roc", - effect: "Le lanceur porte un coup de poing à la cible, ce qui peut baisser la Défense de celle-ci." - }, - "whirlpool": { - name: "Siphon", - effect: "Le lanceur piège la cible dans une trombe d’eau pendant quatre à cinq tours." - }, - "beatUp": { - name: "Baston", - effect: "Le lanceur appelle tous les Pokémon de son équipe à attaquer. Plus ils sont nombreux, plus il y a d’attaques." - }, - "fakeOut": { - name: "Bluff", - effect: "Le lanceur frappe en priorité et apeure la cible. La capacité ne fonctionne que si elle est utilisée immédiatement en entrant au combat." - }, - "uproar": { - name: "Brouhaha", - effect: "Le lanceur attaque en rugissant durant trois tours. Pendant ce temps, aucun Pokémon ne peut s’endormir." - }, - "stockpile": { - name: "Stockage", - effect: "Le lanceur emmagasine de l’énergie et augmente sa Défense et sa Défense Spéciale. Peut être utilisée trois fois." - }, - "spitUp": { - name: "Relâche", - effect: "Libère dans une attaque l’énergie précédemment emmagasinée avec Stockage. La puissance augmente en fonction du nombre de fois où Stockage a été utilisée." - }, - "swallow": { - name: "Avale", - effect: "Le lanceur absorbe l’énergie emmagasinée avec Stockage pour restaurer ses PV. Le nombre de PV soignés augmente en fonction du nombre de fois où Stockage a été utilisée." - }, - "heatWave": { - name: "Canicule", - effect: "Le lanceur provoque une vague de chaleur qui peut aussi brûler la cible (10% de chances)." - }, - "hail": { - name: "Grêle", - effect: "Invoque une tempête de grêle qui dure cinq tours. Ne blesse pas les Pokémon de type Glace." - }, - "torment": { - name: "Tourmente", - effect: "Le lanceur irrite la cible pour l’empêcher d’utiliser la même capacité deux fois de suite." - }, - "flatter": { - name: "Flatterie", - effect: "Rend la cible confuse, mais augmente son Attaque Spéciale." - }, - "willOWisp": { - name: "Feu Follet", - effect: "Le lanceur projette des flammes maléfiques à la cible pour lui infliger une brûlure." - }, - "memento": { - name: "Souvenir", - effect: "Le lanceur est mis K.O., mais l’Attaque et l’Attaque Spéciale de la cible baissent beaucoup." - }, - "facade": { - name: "Façade", - effect: "Une capacité dont la puissance double lorsque le lanceur est empoisonné, paralysé ou brûlé." - }, - "focusPunch": { - name: "Mitra-Poing", - effect: "Le lanceur se concentre avant d’attaquer. Échoue s’il est touché avant d’avoir frappé." - }, - "smellingSalts": { - name: "Stimulant", - effect: "Cette attaque est doublement efficace sur les Pokémon paralysés, mais elle soigne leur paralysie." - }, - "followMe": { - name: "Par Ici", - effect: "Le lanceur attire l’attention des cibles présentes pour les forcer à n’attaquer que le lanceur." - }, - "naturePower": { - name: "Force Nature", - effect: "Une attaque qui tire sa force de la nature. Son type varie selon le terrain." - }, - "charge": { - name: "Chargeur", - effect: "Le lanceur se charge en électricité, ce qui augmente la puissance de la prochaine capacité Électrik qu’il utilisera. Sa Défense Spéciale augmente également." - }, - "taunt": { - name: "Provoc", - effect: "Le lanceur provoque la cible, ce qui oblige celle-ci à n’utiliser que des capacités qui infligent des dégâts pendant trois tours." - }, - "helpingHand": { - name: "Coup d’Main", - effect: "Le lanceur donne un coup de main à son allié, qui voit la puissance de ses capacités augmenter." - }, - "trick": { - name: "Tour de Magie", - effect: "Le lanceur prend la cible au dépourvu et l’oblige à échanger son objet contre le sien." - }, - "rolePlay": { - name: "Imitation", - effect: "Imite la cible et copie son talent." - }, - "wish": { - name: "Vœu", - effect: "Un vœu qui permet au lanceur ou au Pokémon entrant sur le terrain au tour suivant de récupérer la moitié des PV max du lanceur." - }, - "assist": { - name: "Assistance", - effect: "Le lanceur se dépêche d’utiliser une capacité au hasard parmi celles des Pokémon de l’équipe." - }, - "ingrain": { - name: "Racines", - effect: "Le lanceur plante ses racines et récupère des PV à chaque tour. Une fois enraciné, il ne peut plus fuir." - }, - "superpower": { - name: "Surpuissance", - effect: "Une attaque puissante, mais qui baisse l’Attaque et la Défense du lanceur." - }, - "magicCoat": { - name: "Reflet Magik", - effect: "Une barrière qui renvoie les capacités comme Vampigraine et celles affectant le statut et les stats." - }, - "recycle": { - name: "Recyclage", - effect: "Recycle un objet tenu à usage unique déjà utilisé lors du combat pour pouvoir l’utiliser à nouveau." - }, - "revenge": { - name: "Vendetta", - effect: "Une attaque deux fois plus puissante si le lanceur a été blessé par l’ennemi durant ce tour." - }, - "brickBreak": { - name: "Casse-Brique", - effect: "Le lanceur attaque avec le tranchant de la main. Permet aussi de briser les barrières comme Mur Lumière et Protection." - }, - "yawn": { - name: "Bâillement", - effect: "Le lanceur fait bâiller la cible, qui s’endort au tour suivant." - }, - "knockOff": { - name: "Sabotage", - effect: "Fait plus de dégâts aux cibles qui tiennent un objet. De plus, fait tomber cet objet et empêche la cible de l’utiliser jusqu’à la fin du combat." - }, - "endeavor": { - name: "Effort", - effect: "Une attaque qui réduit les PV de la cible au niveau des PV du lanceur." - }, - "eruption": { - name: "Éruption", - effect: "Le lanceur laisse exploser sa colère. Plus ses PV sont bas, moins l’attaque est puissante." - }, - "skillSwap": { - name: "Échange", - effect: "Le lanceur utilise ses pouvoirs psychiques pour échanger son talent avec la cible." - }, - "imprison": { - name: "Possessif", - effect: "Si la cible et le lanceur ont des capacités en commun, la cible ne pourra pas les utiliser." - }, - "refresh": { - name: "Régénération", - effect: "Le lanceur se repose pour guérir d’un empoisonnement, d’une brûlure ou d’une paralysie." - }, - "grudge": { - name: "Rancune", - effect: "Si le lanceur est mis K.O., sa rancune épuise les PP de la capacité utilisée par l’ennemi pour le mettre K.O." - }, - "snatch": { - name: "Saisie", - effect: "Lorsqu’une capacité de soin ou de changement de stats est utilisée, le lanceur vole ses effets." - }, - "secretPower": { - name: "Force Cachée", - effect: "Les effets de cette attaque varient en fonction de l’environnement." - }, - "dive": { - name: "Plongée", - effect: "Le lanceur plonge sous l’eau au premier tour et frappe au second." - }, - "armThrust": { - name: "Cogne", - effect: "Un déluge de coups adressés avec la paume qui frappe de deux à cinq fois d’affilée." - }, - "camouflage": { - name: "Camouflage", - effect: "Modifie le type du lanceur en fonction du terrain, comme une berge, une grotte, l’herbe, etc." - }, - "tailGlow": { - name: "Lumi-Queue", - effect: "Le lanceur regarde un flash lumineux fixement. Augmente énormément son Attaque Spéciale." - }, - "lusterPurge": { - name: "Lumi-Éclat", - effect: "Le lanceur libère un éclair lumineux. Peut aussi baisser la Défense Spéciale de l’ennemi." - }, - "mistBall": { - name: "Ball’Brume", - effect: "Une bulle de brume inflige des dégâts à l’ennemi. Peut aussi réduire son Attaque Spéciale." - }, - "featherDance": { - name: "Danse Plumes", - effect: "Une montagne de plumes ensevelit la cible et réduit beaucoup son Attaque." - }, - "teeterDance": { - name: "Danse Folle", - effect: "Danse qui rend confus tous les Pokémon autour du lanceur." - }, - "blazeKick": { - name: "Pied Brûleur", - effect: "Le lanceur envoie un coup de pied au taux de critiques élevé. Peut aussi brûler la cible (10% de chances)." - }, - "mudSport": { - name: "Lance-Boue", - effect: "Asperge les alentours de boue. Affaiblit les capacités Électrik pendant cinq tours." - }, - "iceBall": { - name: "Ball’Glace", - effect: "Frappe l’ennemi pendant cinq tours. L’attaque gagne en puissance à chaque coup." - }, - "needleArm": { - name: "Poing Dard", - effect: "Le lanceur attaque en fouettant l’ennemi de ses bras épineux. Peut aussi l’apeurer (30% de chances)." - }, - "slackOff": { - name: "Paresse", - effect: "Le lanceur se tourne les pouces et récupère jusqu’à la moitié de ses PV max." - }, - "hyperVoice": { - name: "Mégaphone", - effect: "Le lanceur pousse un cri dont l’écho terrifiant a le pouvoir d’infliger des dégâts à la cible." - }, - "poisonFang": { - name: "Crochet Venin", - effect: "Le lanceur mord la cible avec ses crocs toxiques, ce qui peut aussi l’empoisonner gravement (50% de chances)." - }, - "crushClaw": { - name: "Éclate Griffe", - effect: "Le lanceur lacère la cible avec des griffes solides et aiguisées, ce qui peut aussi baisser la Défense de celle-ci." - }, - "blastBurn": { - name: "Rafale Feu", - effect: "Une explosion ardente consume la cible. Le lanceur doit se reposer au tour suivant." - }, - "hydroCannon": { - name: "Hydroblast", - effect: "Le lanceur projette un missile d’eau sur la cible, mais il doit se reposer au tour suivant." - }, - "meteorMash": { - name: "Poing Météore", - effect: "Un coup de poing lancé à la vitesse d’un météore. Peut aussi augmenter l’Attaque du lanceur." - }, - "astonish": { - name: "Étonnement", - effect: "Le lanceur attaque la cible en poussant un cri terrifiant qui peut aussi l’apeurer (30% de chances)." - }, - "weatherBall": { - name: "Ball’Météo", - effect: "Une capacité dont la puissance et le type varient en fonction du temps qu’il fait." - }, - "aromatherapy": { - name: "Aromathérapie", - effect: "Le lanceur libère un parfum apaisant qui guérit tous les problèmes de statut de l’équipe." - }, - "fakeTears": { - name: "Croco Larme", - effect: "Le lanceur fait semblant de pleurer pour troubler la cible et beaucoup baisser sa Défense Spéciale." - }, - "airCutter": { - name: "Tranch’Air", - effect: "Le lanceur appelle des vents tranchants qui lacèrent la cible. Taux de critiques élevé." - }, - "overheat": { - name: "Surchauffe", - effect: "Le lanceur attaque la cible à pleine puissance, mais le contrecoup baisse beaucoup l’Attaque Spéciale du lanceur." - }, - "odorSleuth": { - name: "Flair", - effect: "Permet de toucher un Pokémon Spectre avec n’importe quelle capacité ou de toucher un ennemi insaisissable." - }, - "rockTomb": { - name: "Tomberoche", - effect: "Des rochers frappent la cible et baissent sa Vitesse." - }, - "silverWind": { - name: "Vent Argenté", - effect: "Vent qui projette des écailles poudreuses sur l’ennemi. Peut aussi monter toutes les stats du lanceur." - }, - "metalSound": { - name: "Strido-Son", - effect: "Un cri horrible tel un crissement métallique qui réduit beaucoup la Défense Spéciale de la cible." - }, - "grassWhistle": { - name: "Siffl’Herbe", - effect: "Le lanceur joue une douce mélodie qui plonge l’ennemi dans un profond sommeil." - }, - "tickle": { - name: "Chatouille", - effect: "Le lanceur chatouille la cible, ce qui baisse son Attaque et sa Défense." - }, - "cosmicPower": { - name: "Force Cosmique", - effect: "Le lanceur absorbe un pouvoir mystique spatial qui augmente sa Défense et sa Défense Spéciale." - }, - "waterSpout": { - name: "Giclédo", - effect: "Le lanceur attaque avec un jet d’eau. Moins il a de PV et moins l’attaque est puissante." - }, - "signalBeam": { - name: "Rayon Signal", - effect: "Le lanceur projette un rayon de lumière sinistre. Peut aussi rendre l’ennemi confus." - }, - "shadowPunch": { - name: "Poing Ombre", - effect: "Le lanceur se fond dans les ombres pour porter un coup de poing. N’échoue jamais." - }, - "extrasensory": { - name: "Extrasenseur", - effect: "Le lanceur attaque avec un pouvoir étrange et invisible qui peut aussi apeurer la cible (10% de chances)." - }, - "skyUppercut": { - name: "Stratopercut", - effect: "Le lanceur attaque avec un uppercut. Il envoie son poing vers le ciel de toutes ses forces." - }, - "sandTomb": { - name: "Tourbi-Sable", - effect: "Le lanceur emprisonne la cible dans une tempête de sable terrifiante qui dure de quatre à cinq tours." - }, - "sheerCold": { - name: "Glaciation", - effect: "Une vague de froid glacial frappe la cible pour la mettre K.O. en un coup. Cela a peu de chances de réussir si le lanceur ne possède pas le type Glace." - }, - "muddyWater": { - name: "Ocroupi", - effect: "Le lanceur attaque en projetant de l’eau boueuse. Peut aussi réduire la Précision de la cible." - }, - "bulletSeed": { - name: "Balle Graine", - effect: "Le lanceur mitraille la cible avec une rafale de graines. De deux à cinq rafales sont lancées à la suite." - }, - "aerialAce": { - name: "Aéropique", - effect: "Le lanceur prend la cible de vitesse et la lacère. N’échoue jamais." - }, - "icicleSpear": { - name: "Stalactite", - effect: "Le lanceur jette des pics de glace sur la cible, de deux à cinq fois de suite." - }, - "ironDefense": { - name: "Mur de Fer", - effect: "L’épiderme du lanceur devient dur comme du fer, ce qui augmente beaucoup sa Défense." - }, - "block": { - name: "Barrage", - effect: "Le lanceur bloque la route de la cible pour empêcher sa fuite." - }, - "howl": { - name: "Grondement", - effect: "Le lanceur pousse un grand cri d’encouragement, ce qui augmente son Attaque et celle de ses alliés." - }, - "dragonClaw": { - name: "Draco-Griffe", - effect: "Le lanceur lacère la cible de ses grandes griffes aiguisées." - }, - "frenzyPlant": { - name: "Végé-Attaque", - effect: "Un violent coup de racines s’abat sur la cible. Le lanceur doit se reposer au tour suivant." - }, - "bulkUp": { - name: "Gonflette", - effect: "Le lanceur tend ses muscles pour se gonfler, ce qui booste son Attaque et sa Défense." - }, - "bounce": { - name: "Rebond", - effect: "Le lanceur bondit très haut et plonge sur la cible au second tour, ce qui peut aussi la paralyser (30% de chances)." - }, - "mudShot": { - name: "Tir de Boue", - effect: "Le lanceur attaque en projetant de la boue sur la cible, ce qui réduit aussi la Vitesse de celle-ci." - }, - "poisonTail": { - name: "Queue-Poison", - effect: "Le lanceur attaque la cible avec sa queue, ce qui peut aussi l’empoisonner (10% de chances). Taux de critiques élevés." - }, - "covet": { - name: "Implore", - effect: "Le lanceur s’approche de la cible avec un air angélique afin de dérober l’objet qu’elle tient." - }, - "voltTackle": { - name: "Électacle", - effect: "Le lanceur électrifie son corps avant de charger. Le choc blesse aussi gravement le lanceur et peut paralyser la cible (10% de chances)." - }, - "magicalLeaf": { - name: "Feuille Magik", - effect: "Le lanceur disperse d’étranges feuilles qui poursuivent la cible. N’échoue jamais." - }, - "waterSport": { - name: "Tourniquet", - effect: "Asperge d’eau les alentours. Affaiblit les capacités de type Feu pendant cinq tours." - }, - "calmMind": { - name: "Plénitude", - effect: "Le lanceur se concentre et fait le vide dans son esprit pour augmenter son Attaque Spéciale et sa Défense Spéciale." - }, - "leafBlade": { - name: "Lame Feuille", - effect: "Une feuille coupante comme une lame entaille la cible. Taux de critiques élevé." - }, - "dragonDance": { - name: "Danse Draco", - effect: "Une danse mystique dont le rythme effréné augmente l’Attaque et la Vitesse du lanceur." - }, - "rockBlast": { - name: "Boule Roc", - effect: "Le lanceur projette un rocher sur la cible de deux à cinq fois d’affilée." - }, - "shockWave": { - name: "Onde de Choc", - effect: "Le lanceur envoie un choc électrique rapide à la cible. N’échoue jamais." - }, - "waterPulse": { - name: "Vibraqua", - effect: "Le lanceur projette une aura aquatique sur la cible, et peut la rendre confuse." - }, - "doomDesire": { - name: "Vœu Destructeur", - effect: "Le lanceur génère une sphère lumineuse qu’il projette sur l’ennemi deux tours plus tard." - }, - "psychoBoost": { - name: "Psycho-Boost", - effect: "Attaque l’ennemi à pleine puissance. Le contrecoup baisse beaucoup l’Attaque Spéciale du lanceur." - }, - "roost": { - name: "Atterrissage", - effect: "Le lanceur atterrit et se repose. Restaure jusqu’à la moitié de ses PV max." - }, - "gravity": { - name: "Gravité", - effect: "Pendant cinq tours, les Pokémon Vol ou qui ont Lévitation deviennent sensibles aux capacités Sol, et les capacités volantes deviennent inutilisables." - }, - "miracleEye": { - name: "Œil Miracle", - effect: "Permet de toucher un Pokémon Ténèbres avec les capacités de type Psy ou de toucher un ennemi ayant beaucoup d’esquive." - }, - "wakeUpSlap": { - name: "Réveil Forcé", - effect: "Cette attaque inflige d’importants dégâts à un Pokémon endormi. Mais elle le réveille également." - }, - "hammerArm": { - name: "Marto-Poing", - effect: "Le lanceur donne un puissant coup de poing à la cible, ce qui réduit la Vitesse du lanceur." - }, - "gyroBall": { - name: "Gyroballe", - effect: "Le lanceur effectue une rotation rapide et frappe la cible. Plus la Vitesse du lanceur est basse par rapport à celle de la cible, plus il inflige de dégâts." - }, - "healingWish": { - name: "Vœu Soin", - effect: "Le lanceur tombe K.O. pour soigner les altérations de statut et les PV du Pokémon qui viendra le remplacer sur le terrain." - }, - "brine": { - name: "Saumure", - effect: "La puissance de cette capacité est doublée lorsque la cible a moins de la moitié de ses PV." - }, - "naturalGift": { - name: "Don Naturel", - effect: "Avant d’attaquer, le lanceur rassemble ses forces grâce à sa Baie. Elle détermine le type et la puissance de l’attaque." - }, - "feint": { - name: "Ruse", - effect: "Une attaque capable de toucher une cible qui utilise une capacité similaire à Détection ou Abri, et annule l’effet de cette capacité." - }, - "pluck": { - name: "Picore", - effect: "Le lanceur picore la cible. Si cette dernière tient une Baie, le lanceur la mange et profite de ses effets." - }, - "tailwind": { - name: "Vent Arrière", - effect: "Génère une rafale de vent qui augmente la Vitesse des Pokémon de l’équipe pendant quatre tours." - }, - "acupressure": { - name: "Acupression", - effect: "Le lanceur utilise sa connaissance des points de pression pour beaucoup augmenter une stat." - }, - "metalBurst": { - name: "Fulmifer", - effect: "Le lanceur contre-attaque avec un coup infligeant des dégâts supérieurs à ceux de la dernière capacité qui l’a blessé." - }, - "uTurn": { - name: "Demi-Tour", - effect: "Après son attaque, le lanceur revient à toute vitesse et change de place avec un Pokémon de l’équipe prêt à combattre." - }, - "closeCombat": { - name: "Close Combat", - effect: "Le lanceur ne pense plus à se protéger et frappe sa cible violemment au corps à corps. Cette capacité baisse la Défense et la Défense Spéciale du lanceur." - }, - "payback": { - name: "Représailles", - effect: "Le lanceur charge son énergie, puis attaque. La puissance de la capacité est doublée si le lanceur agit après la cible." - }, - "assurance": { - name: "Assurance", - effect: "La puissance de cette capacité est deux fois plus élevée si la cible a déjà été blessée durant ce tour." - }, - "embargo": { - name: "Embargo", - effect: "Empêche la cible d’utiliser un objet tenu et son Dresseur d’utiliser un objet sur lui pendant cinq tours." - }, - "fling": { - name: "Dégommage", - effect: "Le lanceur envoie l’objet qu’il tient sur la cible. La puissance et les effets dépendent de l’objet." - }, - "psychoShift": { - name: "Échange Psy", - effect: "Le lanceur transfère ses problèmes de statut à l’ennemi grâce à son pouvoir de suggestion." - }, - "trumpCard": { - name: "Atout", - effect: "Moins cette capacité possède de PP, plus elle est puissante." - }, - "healBlock": { - name: "Anti-Soin", - effect: "Le lanceur empêche l’ennemi de récupérer des PV à l’aide de capacités, talents ou objets tenus, pendant cinq tours." - }, - "wringOut": { - name: "Essorage", - effect: "Le lanceur essore l’ennemi. Plus l’ennemi a de PV, plus cette attaque est puissante." - }, - "powerTrick": { - name: "Astuce Force", - effect: "Le lanceur utilise ses pouvoirs psychiques pour échanger sa Défense et son Attaque." - }, - "gastroAcid": { - name: "Suc Digestif", - effect: "Le lanceur répand ses sucs digestifs sur la cible. Le fluide neutralise le talent de celle-ci." - }, - "luckyChant": { - name: "Air Veinard", - effect: "Le lanceur envoie une incantation vers le ciel et protège l’équipe des coups critiques pendant cinq tours." - }, - "meFirst": { - name: "Moi d’Abord", - effect: "Le lanceur vole la capacité prévue par l’ennemi et l’utilise en faisant plus de dégâts. Il doit frapper en premier." - }, - "copycat": { - name: "Photocopie", - effect: "Le lanceur imite la dernière capacité employée. Échoue si aucune capacité n’a été utilisée." - }, - "powerSwap": { - name: "Permuforce", - effect: "Le lanceur utilise un pouvoir psychique qui échange les changements de son Attaque et de son Attaque Spéciale avec celles de la cible." - }, - "guardSwap": { - name: "Permugarde", - effect: "Le lanceur utilise un pouvoir psychique qui échange les changements de sa Défense et de sa Défense Spéciale avec celles de la cible." - }, - "punishment": { - name: "Punition", - effect: "Plus l’ennemi a utilisé d’augmentations de stats et plus cette capacité est puissante." - }, - "lastResort": { - name: "Dernier Recours", - effect: "Cette capacité ne peut être utilisée qu’après que le lanceur a utilisé toutes les autres." - }, - "worrySeed": { - name: "Soucigraine", - effect: "Plante sur la cible une graine qui la rend soucieuse et remplace son talent par Insomnia, l’empêchant ainsi de dormir." - }, - "suckerPunch": { - name: "Coup Bas", - effect: "Permet au lanceur de frapper en priorité. Échoue si la cible ne prépare pas une attaque." - }, - "toxicSpikes": { - name: "Pics Toxik", - effect: "Le lanceur éparpille des pics autour de la cible, ce qui empoisonne les Pokémon entrant au combat de ce côté." - }, - "heartSwap": { - name: "Permucœur", - effect: "Le lanceur utilise un pouvoir psychique pour échanger ses changements de stats avec la cible." - }, - "aquaRing": { - name: "Anneau Hydro", - effect: "Un voile d’eau recouvre le lanceur et régénère ses PV à chaque tour." - }, - "magnetRise": { - name: "Vol Magnétik", - effect: "Le lanceur utilise l’électricité pour générer un champ magnétique et léviter durant cinq tours." - }, - "flareBlitz": { - name: "Boutefeu", - effect: "Le lanceur s’embrase avant de charger la cible, ce qui peut la brûler (10% de chances). Le choc blesse aussi gravement le lanceur." - }, - "forcePalm": { - name: "Forte-Paume", - effect: "Une onde de choc frappe la cible, ce qui peut aussi la paralyser (30% de chances)." - }, - "auraSphere": { - name: "Aurasphère", - effect: "Le lanceur puise au fond de lui-même pour dégager une aura et projeter de l’énergie sur la cible. N’échoue jamais." - }, - "rockPolish": { - name: "Poliroche", - effect: "Le lanceur polit son corps pour diminuer sa résistance au vent. Augmente beaucoup la Vitesse." - }, - "poisonJab": { - name: "Direct Toxik", - effect: "Le lanceur attaque la cible avec un tentacule, un bras, ou un autre membre imprégné de poison, ce qui peut aussi empoisonner la cible (30% de chances)." - }, - "darkPulse": { - name: "Vibrobscur", - effect: "Le lanceur projette une horrible aura chargée de pensées maléfiques, ce qui peut aussi apeurer la cible." - }, - "nightSlash": { - name: "Tranche-Nuit", - effect: "Le lanceur lacère la cible à la première occasion. Taux de critiques élevé." - }, - "aquaTail": { - name: "Hydro-Queue", - effect: "Le lanceur attaque en balançant sa queue comme une lame de fond en pleine tempête." - }, - "seedBomb": { - name: "Canon Graine", - effect: "Le lanceur déclenche un déluge de grosses graines à la coque solide sur la cible." - }, - "airSlash": { - name: "Lame d’Air", - effect: "Le lanceur attaque avec une lame d’air capable de fendre le ciel, ce qui peut aussi apeurer la cible (30% de chances)." - }, - "xScissor": { - name: "Plaie Croix", - effect: "Le lanceur taillade la cible en utilisant ses faux ou ses griffes comme une paire de ciseaux." - }, - "bugBuzz": { - name: "Bourdon", - effect: "Le lanceur fait vibrer son corps pour lancer une vague sonique, ce qui peut aussi baisser la Défense Spéciale de la cible." - }, - "dragonPulse": { - name: "Draco-Choc", - effect: "Le lanceur ouvre la bouche pour projeter une aura qui frappe la cible." - }, - "dragonRush": { - name: "Draco-Charge", - effect: "Le lanceur frappe la cible en prenant un air menaçant, ce qui peut aussi l’apeurer (20% de chances)." - }, - "powerGem": { - name: "Rayon Gemme", - effect: "Le lanceur attaque avec un rayon de lumière qui scintille comme s’il était composé de gemmes." - }, - "drainPunch": { - name: "Vampi-Poing", - effect: "Un coup de poing qui draine l’énergie. Convertit la moitié des dégâts infligés en PV pour le lanceur." - }, - "vacuumWave": { - name: "Onde Vide", - effect: "Le lanceur agite son poing pour projeter une onde de vide. Frappe en priorité." - }, - "focusBlast": { - name: "Exploforce", - effect: "Le lanceur rassemble ses forces et laisse éclater son pouvoir, ce qui peut aussi baisser la Défense Spéciale de la cible." - }, - "energyBall": { - name: "Éco-Sphère", - effect: "Le lanceur utilise les pouvoirs de la nature pour attaquer la cible, ce qui peut aussi baisser la Défense Spéciale de celle-ci." - }, - "braveBird": { - name: "Rapace", - effect: "Le lanceur replie ses ailes et charge en rase-mottes. Blesse gravement le lanceur." - }, - "earthPower": { - name: "Telluriforce", - effect: "De terribles séismes secouent la cible et peuvent aussi baisser sa Défense Spéciale." - }, - "switcheroo": { - name: "Passe-Passe", - effect: "Le lanceur échange son objet avec celui de la cible à une vitesse que l’œil a du mal à suivre." - }, - "gigaImpact": { - name: "Giga Impact", - effect: "Le lanceur charge la cible de toute ses forces et doit ensuite se reposer au tour suivant." - }, - "nastyPlot": { - name: "Machination", - effect: "Stimule l’esprit par de mauvaises pensées. Augmente beaucoup l’Attaque Spéciale du lanceur." - }, - "bulletPunch": { - name: "Pisto-Poing", - effect: "Le lanceur envoie des coups de poing aussi rapides que des balles de revolver. Frappe en priorité." - }, - "avalanche": { - name: "Avalanche", - effect: "Une capacité dont la puissance est doublée si le lanceur a été blessé par la cible durant ce tour." - }, - "iceShard": { - name: "Éclats Glace", - effect: "Le lanceur crée des éclats de glace qu’il envoie sur la cible. Frappe en priorité." - }, - "shadowClaw": { - name: "Griffe Ombre", - effect: "Attaque avec une griffe puissante faite d’ombres. Taux de critiques élevé." - }, - "thunderFang": { - name: "Crocs Éclair", - effect: "Le lanceur utilise une morsure électrifiée qui peut aussi paralyser (10% de chances) ou apeurer la cible (10% de chances)." - }, - "iceFang": { - name: "Crocs Givre", - effect: "Le lanceur utilise une morsure glaciale qui peut aussi geler (10% de chances) ou apeurer la cible (10% de chances)." - }, - "fireFang": { - name: "Crocs Feu", - effect: "Le lanceur utilise une morsure enflammée qui peut aussi brûler (10% de chances) ou apeurer (10% de chances) la cible." - }, - "shadowSneak": { - name: "Ombre Portée", - effect: "Le lanceur étend son ombre pour frapper par-derrière. Frappe en priorité." - }, - "mudBomb": { - name: "Boue-Bombe", - effect: "Le lanceur attaque à l’aide d’une boule de boue solidifiée. Peut aussi baisser la Précision de l’ennemi." - }, - "psychoCut": { - name: "Coupe Psycho", - effect: "Le lanceur entaille la cible grâce à des lames faites d’énergie psychique. Taux de critiques élevé." - }, - "zenHeadbutt": { - name: "Psykoud’Boul", - effect: "Le lanceur concentre sa volonté et donne un coup de tête à la cible, ce qui peut aussi apeurer celle-ci (20% de chances)." - }, - "mirrorShot": { - name: "Miroi-Tir", - effect: "Le corps poli du lanceur libère un éclair d’énergie. Peut aussi baisser la Précision de l’ennemi." - }, - "flashCannon": { - name: "Luminocanon", - effect: "Le lanceur concentre son énergie lumineuse et la fait exploser, ce qui peut aussi baisser la Défense Spéciale de la cible." - }, - "rockClimb": { - name: "Escalade", - effect: "Le lanceur se jette violemment sur l’ennemi. Peut aussi le rendre confus." - }, - "defog": { - name: "Anti-Brume", - effect: "Un grand coup de vent disperse Protection ou Mur Lumière de la cible et diminue également son Esquive." - }, - "trickRoom": { - name: "Distorsion", - effect: "Le lanceur crée une zone mystérieuse où les Pokémon les plus lents frappent en priorité pendant cinq tours." - }, - "dracoMeteor": { - name: "Draco-Météore", - effect: "Le lanceur invoque des comètes. Le contrecoup réduit beaucoup son Attaque Spéciale." - }, - "discharge": { - name: "Coup d’Jus", - effect: "Un flamboiement d’électricité frappe tous les Pokémon autour du lanceur. Peut aussi les paralyser (30% de chances)." - }, - "lavaPlume": { - name: "Ébullilave", - effect: "Des flammes s’abattent sur tous les Pokémon autour du lanceur, ce qui peut aussi les brûler (10% de chances)." - }, - "leafStorm": { - name: "Tempête Verte", - effect: "Invoque une tempête de feuilles acérées. Le contrecoup réduit beaucoup l’Attaque Spéciale du lanceur." - }, - "powerWhip": { - name: "Mégafouet", - effect: "Le lanceur fait virevolter violemment ses lianes ou ses tentacules pour fouetter la cible." - }, - "rockWrecker": { - name: "Roc-Boulet", - effect: "Le lanceur attaque en projetant un gros rocher sur l’ennemi. Il doit se reposer au tour suivant." - }, - "crossPoison": { - name: "Poison Croix", - effect: "Un coup tranchant qui peut empoisonner la cible (10% de chances). Taux de critiques élevé." - }, - "gunkShot": { - name: "Détricanon", - effect: "Le lanceur envoie des détritus sur la cible, ce qui peut aussi l’empoisonner (30% de chances)." - }, - "ironHead": { - name: "Tête de Fer", - effect: "Le lanceur heurte la cible avec sa tête dure comme de l’acier, ce qui peut aussi l’apeurer (30% de chances)." - }, - "magnetBomb": { - name: "Bombe Aimant", - effect: "Le lanceur projette des bombes d’acier qui collent à l’ennemi. N’échoue jamais." - }, - "stoneEdge": { - name: "Lame de Roc", - effect: "Le lanceur transperce la cible avec des rochers aiguisés. Taux de critiques élevé." - }, - "captivate": { - name: "Séduction", - effect: "Si l’ennemi est de sexe opposé au lanceur, il est séduit et son Attaque Spéciale baisse beaucoup." - }, - "stealthRock": { - name: "Piège de Roc", - effect: "Le lanceur fait flotter des pierres autour de la cible qui blessent tout adversaire entrant au combat." - }, - "grassKnot": { - name: "Nœud Herbe", - effect: "Le lanceur fait des nœuds dans l’herbe pour faire trébucher la cible. Plus la cible est lourde, plus la puissance de cette capacité augmente." - }, - "chatter": { - name: "Babil", - effect: "Attaque avec les ondes sonores assourdissantes qu’il émet en bavardant. Rend l’ennemi confus." - }, - "judgment": { - name: "Jugement", - effect: "Le lanceur libère une myriade de rayons de lumière. Le type varie selon la plaque que tient le lanceur." - }, - "bugBite": { - name: "Piqûre", - effect: "Le lanceur pique la cible. Si celle-ci tient une Baie, le lanceur la dévore et obtient son effet." - }, - "chargeBeam": { - name: "Rayon Chargé", - effect: "Le lanceur tire un rayon chargé d’électricité. Peut aussi augmenter son Attaque Spéciale." - }, - "woodHammer": { - name: "Martobois", - effect: "Le lanceur heurte la cible de son corps robuste, ce qui blesse aussi gravement le lanceur." - }, - "aquaJet": { - name: "Aqua-Jet", - effect: "Le lanceur fonce sur la cible si rapidement qu’on parvient à peine à le discerner. Frappe en priorité." - }, - "attackOrder": { - name: "Appel Attaque", - effect: "Le lanceur appelle ses subalternes pour frapper la cible. Taux de critiques élevé." - }, - "defendOrder": { - name: "Appel Défense", - effect: "Le lanceur appelle ses subalternes pour former un bouclier qui augmente sa Défense et sa Défense Spéciale." - }, - "healOrder": { - name: "Appel Soins", - effect: "Le lanceur appelle ses sous-fifres pour le soigner. Il récupère jusqu’à la moitié de ses PV max." - }, - "headSmash": { - name: "Fracass’Tête", - effect: "Le lanceur assène un coup de tête désespéré, ce qui le blesse aussi très gravement." - }, - "doubleHit": { - name: "Coup Double", - effect: "Le lanceur frappe la cible deux fois d’affilée à l’aide de sa queue ou d’un autre membre." - }, - "roarOfTime": { - name: "Hurle-Temps", - effect: "Le lanceur frappe si fort qu’il affecte le cours du temps. Il se repose au tour suivant." - }, - "spacialRend": { - name: "Spatio-Rift", - effect: "Le lanceur déchire la cible et l’espace autour de lui. Taux de critiques élevé." - }, - "lunarDance": { - name: "Danse Lune", - effect: "Le lanceur tombe K.O. pour soigner totalement le Pokémon qui prendra sa place au combat." - }, - "crushGrip": { - name: "Presse", - effect: "Une force puissante écrase l’ennemi. Plus il lui reste de PV et plus l’attaque est puissante." - }, - "magmaStorm": { - name: "Vortex Magma", - effect: "La cible est prise dans un tourbillon de feu qui dure de quatre à cinq tours." - }, - "darkVoid": { - name: "Trou Noir", - effect: "L’ennemi est plongé dans les ténèbres. Il tombe dans un profond sommeil." - }, - "seedFlare": { - name: "Fulmigraine", - effect: "Le corps du lanceur émet une onde de choc. Peut aussi beaucoup baisser la Défense Spéciale de la cible." - }, - "ominousWind": { - name: "Vent Mauvais", - effect: "Le lanceur crée une violente bourrasque. Peut aussi augmenter toutes ses stats." - }, - "shadowForce": { - name: "Revenant", - effect: "Le lanceur disparaît au premier tour et frappe la cible au deuxième. Cette capacité fonctionne même si la cible se protège." - }, - "honeClaws": { - name: "Aiguisage", - effect: "Le lanceur s’aiguise les griffes. Augmente l’Attaque et la Précision." - }, - "wideGuard": { - name: "Garde Large", - effect: "Bloque les attaques visant tous les alliés pendant un tour." - }, - "guardSplit": { - name: "Partage Garde", - effect: "Additionne la Défense et la Défense Spéciale du lanceur et de sa cible et les redistribue équitablement entre les deux." - }, - "powerSplit": { - name: "Partage Force", - effect: "Additionne l’Attaque Spéciale et l’Attaque du lanceur et de sa cible et les redistribue équitablement entre les deux." - }, - "wonderRoom": { - name: "Zone Étrange", - effect: "Le lanceur crée une zone mystérieuse où la Défense et la Défense Spéciale de tous les Pokémon sont inversées pendant cinq tours." - }, - "psyshock": { - name: "Choc Psy", - effect: "Le lanceur matérialise des ondes mystérieuses qu’il projette sur la cible, ce qui inflige des dégâts physiques à celle-ci." - }, - "venoshock": { - name: "Choc Venin", - effect: "Le lanceur asperge la cible d’un poison spécial. La puissance de la capacité est doublée si la cible est empoisonnée." - }, - "autotomize": { - name: "Allègement", - effect: "Le lanceur se débarrasse des parties inutiles de son corps. Son poids diminue et sa Vitesse augmente beaucoup." - }, - "ragePowder": { - name: "Poudre Fureur", - effect: "Le lanceur s’asperge d’une poudre irritante pour attirer l’attention et diriger toutes les attaques ennemies sur lui." - }, - "telekinesis": { - name: "Lévikinésie", - effect: "Un pouvoir qui fait flotter l’ennemi dans les airs. Pendant trois tours, il devient plus facile à atteindre." - }, - "magicRoom": { - name: "Zone Magique", - effect: "Le lanceur crée une zone mystérieuse où les objets tenus par tous les Pokémon n’ont plus aucun effet pendant cinq tours." - }, - "smackDown": { - name: "Anti-Air", - effect: "Le lanceur jette un projectile sur la cible. Si cette dernière vole, elle tombe au sol." - }, - "stormThrow": { - name: "Yama Arashi", - effect: "Un coup très puissant dont l’effet est toujours critique." - }, - "flameBurst": { - name: "Rebondifeu", - effect: "Quand l’attaque atteint sa cible, elle projette des flammes qui touchent tout ennemi situé à côté." - }, - "sludgeWave": { - name: "Cradovague", - effect: "Une vague de détritus attaque tous les Pokémon autour du lanceur. Peut aussi empoisonner (10% de chances)." - }, - "quiverDance": { - name: "Papillodanse", - effect: "Une danse mystique dont le rythme parfait augmente l’Attaque Spéciale, la Défense Spéciale et la Vitesse du lanceur." - }, - "heavySlam": { - name: "Tacle Lourd", - effect: "Le lanceur se jette sur la cible de tout son poids. Plus il est lourd par rapport à la cible, plus la puissance de cette capacité augmente." - }, - "synchronoise": { - name: "Synchropeine", - effect: "Des ondes mystérieuses blessent tous les Pokémon alentour qui sont du même type que le lanceur." - }, - "electroBall": { - name: "Boule Élek", - effect: "Le lanceur envoie une boule d’électricité. Plus la Vitesse du lanceur est élevée par rapport à celle de la cible, plus la puissance de la capacité augmente." - }, - "soak": { - name: "Détrempage", - effect: "Le lanceur projette beaucoup d’eau sur sa cible, qui devient de type Eau." - }, - "flameCharge": { - name: "Nitrocharge", - effect: "Le lanceur s’entoure de flammes pour attaquer la cible. Il se concentre et sa Vitesse augmente." - }, - "coil": { - name: "Enroulement", - effect: "Le lanceur s’enroule sur lui-même et se concentre. Son Attaque, sa Défense et sa Précision augmentent." - }, - "lowSweep": { - name: "Balayette", - effect: "Un coup rapide qui affecte la mobilité de la cible et diminue sa Vitesse." - }, - "acidSpray": { - name: "Bombe Acide", - effect: "Le lanceur projette un liquide acide qui fait fondre la cible, ce qui diminue beaucoup la Défense Spéciale de celle-ci." - }, - "foulPlay": { - name: "Tricherie", - effect: "Le lanceur utilise la force de la cible. Plus l’Attaque de celle-ci est élevée, plus le lanceur inflige de dégâts." - }, - "simpleBeam": { - name: "Rayon Simple", - effect: "Le lanceur envoie des ondes mystérieuses à la cible, dont le talent est remplacé par le talent Simple." - }, - "entrainment": { - name: "Ten-Danse", - effect: "Le lanceur danse sur un rythme étrange. Il force sa cible à l’imiter, ce qui lui fait adopter son talent." - }, - "afterYou": { - name: "Après Vous", - effect: "S’il est le premier à agir, le lanceur permet à sa cible d’utiliser une capacité juste après lui." - }, - "round": { - name: "Chant Canon", - effect: "Le lanceur attaque la cible en chantant. Si plusieurs Pokémon déclenchent cette attaque à la suite, la puissance augmente." - }, - "echoedVoice": { - name: "Écho", - effect: "Un cri retentissant blesse la cible. Si le lanceur ou d’autres Pokémon utilisent cette capacité à chaque tour, la puissance augmente." - }, - "chipAway": { - name: "Attrition", - effect: "Une attaque puissante quand l’ennemi baisse sa garde. Inflige des dégâts sans tenir compte des changements de stats." - }, - "clearSmog": { - name: "Bain de Smog", - effect: "Le lanceur projette de la boue bizarre sur la cible. Les changements de stats de la cible sont annulés." - }, - "storedPower": { - name: "Force Ajoutée", - effect: "Le lanceur attaque la cible avec une force cumulée. Plus les stats du lanceur sont augmentées, plus la puissance de cette capacité augmente." - }, - "quickGuard": { - name: "Prévention", - effect: "Protège le lanceur et ses alliés des attaques prioritaires." - }, - "allySwitch": { - name: "Interversion", - effect: "Le lanceur se téléporte à l’aide d’un pouvoir mystérieux. Il échange sa place avec celle d’un allié sur le terrain. Peut échouer si utilisée plusieurs fois de suite." - }, - "scald": { - name: "Ébullition", - effect: "Le lanceur projette un jet d’eau bouillante sur la cible, ce qui peut aussi la brûler (30% de chances)." - }, - "shellSmash": { - name: "Exuviation", - effect: "Le lanceur brise sa carapace. Il baisse sa Défense et sa Défense Spéciale, mais augmente beaucoup son Attaque, son Attaque Spéciale et sa Vitesse." - }, - "healPulse": { - name: "Vibra Soin", - effect: "Le lanceur projette une aura de bien-être qui fait récupérer la moitié de ses PV max à la cible." - }, - "hex": { - name: "Châtiment", - effect: "Une attaque acharnée qui cause davantage de dégâts à la cible si elle a une altération de statut." - }, - "skyDrop": { - name: "Chute Libre", - effect: "Le lanceur emmène l’ennemi dans les airs au premier tour et le lâche dans le vide au second. L’ennemi saisi ne peut pas attaquer." - }, - "shiftGear": { - name: "Change-Vitesse", - effect: "Le lanceur fait tourner ses engrenages. Cela augmente son Attaque et augmente beaucoup sa Vitesse." - }, - "circleThrow": { - name: "Projection", - effect: "Le lanceur fait une projection sur un Pokémon ennemi et le remplace par un autre. Lors d’un combat contre un Pokémon sauvage seul, cela met fin au combat." - }, - "incinerate": { - name: "Calcination", - effect: "Des flammes calcinent la cible. Si elle tient un objet, une Baie par exemple, celui-ci est brûlé et devient inutilisable." - }, - "quash": { - name: "À la Queue", - effect: "Retient la cible de force, l’obligeant à agir en dernier." - }, - "acrobatics": { - name: "Acrobatie", - effect: "Le lanceur frappe la cible avec agilité. S’il ne tient pas d’objet, l’attaque inflige davantage de dégâts." - }, - "reflectType": { - name: "Copie-Type", - effect: "Le lanceur adopte le même type que la cible." - }, - "retaliate": { - name: "Vengeance", - effect: "Le lanceur venge un allié K.O. Si un Pokémon de l’équipe a été mis K.O. au tour d’avant, la puissance augmente." - }, - "finalGambit": { - name: "Tout ou Rien", - effect: "Une attaque très risquée. Le lanceur perd tous ses PV restants et inflige autant de dégâts à la cible." - }, - "bestow": { - name: "Passe-Cadeau", - effect: "Si la cible ne tient pas d’objet, le lanceur lui donne l’objet qu’il tient." - }, - "inferno": { - name: "Feu d’Enfer", - effect: "La cible est entourée d’un torrent de flammes ardentes qui la brûlent." - }, - "waterPledge": { - name: "Aire d’Eau", - effect: "Une masse d’eau s’abat sur la cible. Si cette capacité est utilisée en même temps qu’Aire de Feu, la puissance augmente et un arc-en-ciel apparaît." - }, - "firePledge": { - name: "Aire de Feu", - effect: "Une masse de feu s’abat sur la cible. Si cette capacité est utilisée en même temps qu’Aire d’Herbe, la puissance augmente et une mer de feu apparaît." - }, - "grassPledge": { - name: "Aire d’Herbe", - effect: "Une masse végétale s’abat sur la cible. Si cette capacité est utilisée en même temps qu’Aire d’Eau, la puissance augmente et un marécage apparaît." - }, - "voltSwitch": { - name: "Change Éclair", - effect: "Après son attaque, le lanceur revient à toute vitesse et change de place avec un Pokémon de l’équipe prêt au combat." - }, - "struggleBug": { - name: "Survinsecte", - effect: "Le lanceur frappe en se débattant de toutes ses forces, et baisse l’Attaque Spéciale de la cible." - }, - "bulldoze": { - name: "Piétisol", - effect: "Le lanceur piétine le sol et inflige des dégâts à tous les Pokémon autour de lui. Baisse aussi leur Vitesse." - }, - "frostBreath": { - name: "Souffle Glacé", - effect: "Un souffle froid blesse la cible. L’effet est toujours critique." - }, - "dragonTail": { - name: "Draco-Queue", - effect: "Un coup puissant qui blesse la cible et l’envoie au loin. Lors d’un combat contre un Pokémon sauvage seul, met fin au combat." - }, - "workUp": { - name: "Rengorgement", - effect: "Le lanceur se rengorge et augmente son Attaque et son Attaque Spéciale." - }, - "electroweb": { - name: "Toile Élek", - effect: "Le lanceur attaque la cible en l’attrapant dans un filet électrique. Baisse aussi la Vitesse de la cible." - }, - "wildCharge": { - name: "Éclair Fou", - effect: "Une charge électrique violente qui blesse aussi légèrement le lanceur." - }, - "drillRun": { - name: "Tunnelier", - effect: "Le lanceur tourne sur lui-même comme une perceuse et se jette sur la cible. Taux de critiques élevé." - }, - "dualChop": { - name: "Double Baffe", - effect: "Le lanceur frappe l’ennemi deux fois d’affilée avec les parties les plus robustes de son corps." - }, - "heartStamp": { - name: "Crève-Cœur", - effect: "Déconcentre l’ennemi avec des mouvements mignons avant de le frapper violemment. Peut aussi l’apeurer (30% de chances)." - }, - "hornLeech": { - name: "Encornebois", - effect: "Un coup de cornes qui draine l’énergie de la cible. La capacité convertit la moitié des dégâts infligés en PV pour le lanceur." - }, - "sacredSword": { - name: "Lame Sainte", - effect: "Un violent coup d’épée qui lacère la cible et lui inflige des dégâts en ignorant ses changements de stats." - }, - "razorShell": { - name: "Coqui-Lame", - effect: "Un coquillage aiguisé lacère la cible et peut aussi baisser sa Défense." - }, - "heatCrash": { - name: "Tacle Feu", - effect: "Le lanceur projette son corps enflammé contre la cible. Plus il est lourd par rapport à la cible, plus la puissance de cette capacité augmente." - }, - "leafTornado": { - name: "Phytomixeur", - effect: "L’ennemi est pris dans un tourbillon de feuilles acérées. Peut aussi baisser sa Précision." - }, - "steamroller": { - name: "Bulldoboule", - effect: "Le lanceur se roule en boule et écrase son ennemi. Peut aussi l’apeurer (30% de chances)." - }, - "cottonGuard": { - name: "Cotogarde", - effect: "Le lanceur se protège en s’emmitouflant dans du coton. Sa Défense augmente énormément." - }, - "nightDaze": { - name: "Explonuit", - effect: "Le lanceur attaque avec une onde de choc ténébreuse qui peut aussi baisser la Précision de la cible." - }, - "psystrike": { - name: "Frappe Psy", - effect: "Le lanceur matérialise des ondes mystérieuses qu’il projette sur la cible, ce qui inflige des dégâts physiques à celle-ci." - }, - "tailSlap": { - name: "Plumo-Queue", - effect: "Le lanceur frappe la cible de deux à cinq fois d’affilée avec sa queue robuste." - }, - "hurricane": { - name: "Vent Violent", - effect: "Le lanceur déclenche une tempête de vents violents qui s’abat sur la cible, et peut aussi la rendre confuse." - }, - "headCharge": { - name: "Peignée", - effect: "Le lanceur donne un coup avec sa tête couronnée d’une fière crinière. Blesse aussi légèrement le lanceur." - }, - "gearGrind": { - name: "Lancécrou", - effect: "Le lanceur jette deux écrous d’acier qui frappent l’ennemi deux fois d’affilée." - }, - "searingShot": { - name: "Incendie", - effect: "Des boules de feu s’abattent sur tous les Pokémon autour du lanceur. Peut aussi les brûler (30% de chances)." - }, - "technoBlast": { - name: "Techno-Buster", - effect: "Le lanceur projette un rayon lumineux sur l’ennemi. Le type varie selon le Module que tient le lanceur." - }, - "relicSong": { - name: "Chant Antique", - effect: "Le lanceur attaque la cible en lui chantant une chanson d’un autre temps qui peut aussi l’endormir." - }, - "secretSword": { - name: "Lame Ointe", - effect: "L’ennemi est lacéré par une longue corne. Son pouvoir mystérieux inflige des dégâts physiques." - }, - "glaciate": { - name: "Ère Glaciaire", - effect: "Un souffle de vent qui congèle tout sur son passage s’abat sur l’ennemi. Réduit aussi sa Vitesse." - }, - "boltStrike": { - name: "Charge Foudre", - effect: "Le lanceur s’enveloppe d’une charge électrique surpuissante et se jette sur l’ennemi. Peut aussi le paralyser (20% de chances)." - }, - "blueFlare": { - name: "Flamme Bleue", - effect: "De magnifiques et redoutables flammes bleues fondent sur l’ennemi. Peut aussi le brûler (20% de chances)." - }, - "fieryDance": { - name: "Danse du Feu", - effect: "Le lanceur s’enveloppe de flammes et attaque la cible, Cela peut aussi augmenter l’Attaque Spéciale du lanceur." - }, - "freezeShock": { - name: "Éclair Gelé", - effect: "Projette un bloc de glace électrifié sur l’ennemi au second tour. Peut aussi le paralyser (30% de chances)." - }, - "iceBurn": { - name: "Feu Glacé", - effect: "Au second tour, le lanceur projette un souffle de vent glacial dévastateur sur l’ennemi. Peut aussi le brûler (30% de chances)." - }, - "snarl": { - name: "Aboiement", - effect: "Le lanceur hurle sur la cible et baisse l’Attaque Spéciale de celle-ci." - }, - "icicleCrash": { - name: "Chute Glace", - effect: "Le lanceur envoie de gros blocs de glace sur la cible pour lui infliger des dégâts, ce qui peut aussi l’apeurer (30% de chances)." - }, - "vCreate": { - name: "Coup Victoire", - effect: "Le lanceur fait jaillir des flammes ardentes de son front et se jette sur la cible, ce qui baisse la Défense, la Défense Spéciale et la Vitesse du lanceur." - }, - "fusionFlare": { - name: "Flamme Croix", - effect: "Projette une boule de feu gigantesque. L’effet augmente sous l’influence d’Éclair Croix." - }, - "fusionBolt": { - name: "Éclair Croix", - effect: "Projette un orbe électrique gigantesque. L’effet augmente sous l’influence de Flamme Croix." - }, - "flyingPress": { - name: "Flying Press", - effect: "Une attaque en piqué depuis le ciel, à la fois de type Combat et de type Vol." - }, - "matBlock": { - name: "Tatamigaeshi", - effect: "Retourne un tatami pour bloquer, comme avec un bouclier, les capacités visant le lanceur ou ses alliés. N’a pas d’effet sur les attaques de statut." - }, - "belch": { - name: "Éructation", - effect: "Le lanceur se tourne vers la cible et lui éructe dessus, infligeant des dégâts. Ne fonctionne que si le lanceur consomme une Baie tenue." - }, - "rototiller": { - name: "Fertilisation", - effect: "Laboure le sol et le rend plus fertile. Augmente l’Attaque et l’Attaque Spéciale des Pokémon de type Plante." - }, - "stickyWeb": { - name: "Toile Gluante", - effect: "Le lanceur déploie une toile visqueuse autour de la cible qui ralentit la Vitesse de tout adversaire entrant au combat." - }, - "fellStinger": { - name: "Dard Mortel", - effect: "Le lanceur augmente énormément son Attaque si une cible est mise K.O. par cette capacité." - }, - "phantomForce": { - name: "Hantise", - effect: "Le lanceur disparaît au premier tour et frappe au second. Cette attaque passe outre les protections." - }, - "trickOrTreat": { - name: "Halloween", - effect: "Insuffle à la cible l’esprit d’Halloween, et ajoute le type Spectre à ses types actuels." - }, - "nobleRoar": { - name: "Râle Mâle", - effect: "Le lanceur pousse un rugissement qui intimide la cible et diminue l’Attaque et l’Attaque Spéciale de celle-ci." - }, - "ionDeluge": { - name: "Déluge Plasmique", - effect: "Diffuse des particules saturées d’électricité qui transforment les capacités de type Normal en capacités de type Électrik." - }, - "parabolicCharge": { - name: "Parabocharge", - effect: "Inflige des dégâts à tous les Pokémon autour du lanceur. Il récupère en PV la moitié des dégâts infligés." - }, - "forestsCurse": { - name: "Maléfice Sylvain", - effect: "La cible est charmée par l’esprit de la forêt. Le type Plante est ajouté à ses types actuels." - }, - "petalBlizzard": { - name: "Tempête Florale", - effect: "Déclenche une violente tempête de fleurs qui inflige des dégâts à tous les Pokémon alentour." - }, - "freezeDry": { - name: "Lyophilisation", - effect: "Le lanceur refroidit violemment la cible et peut la geler (10% de chances). Super efficace sur les Pokémon de type Eau." - }, - "disarmingVoice": { - name: "Voix Enjôleuse", - effect: "Le lanceur laisse s’échapper une voix enchanteresse qui inflige des dégâts psychiques à la cible. N’échoue jamais." - }, - "partingShot": { - name: "Dernier Mot", - effect: "Le lanceur menace la cible dans une ultime tirade avant de changer de place avec un autre Pokémon. Réduit l’Attaque et l’Attaque Spéciale de la cible." - }, - "topsyTurvy": { - name: "Renversement", - effect: "Inverse tous les changements de stats de la cible." - }, - "drainingKiss": { - name: "Vampibaiser", - effect: "Le lanceur aspire la force vitale de la cible par un baiser qui rend au lanceur un nombre de PV supérieur ou égal à la moitié des dégâts infligés." - }, - "craftyShield": { - name: "Vigilance", - effect: "Utilise une force mystérieuse pour protéger l’équipe des capacités de statut. Ne protège pas des autres capacités." - }, - "flowerShield": { - name: "Garde Florale", - effect: "Grâce à une force mystérieuse, la Défense de tous les Pokémon Plante au combat augmente." - }, - "grassyTerrain": { - name: "Champ Herbu", - effect: "Pendant cinq tours, les Pokémon au sol récupèrent quelques PV à chaque tour et la puissance des capacités de type Plante augmente." - }, - "mistyTerrain": { - name: "Champ Brumeux", - effect: "Pendant cinq tours, les Pokémon au sol ne peuvent pas subir d’altération de statut et les dégâts infligés par les capacités de type Dragon sont divisés par deux." - }, - "electrify": { - name: "Électrisation", - effect: "Si le lanceur attaque avant la cible, les capacités de celle-ci seront de type Électrik jusqu’à la fin du tour." - }, - "playRough": { - name: "Câlinerie", - effect: "Le lanceur attaque la cible en lui faisant des câlineries, ce qui peut aussi diminuer l’Attaque de celle-ci." - }, - "fairyWind": { - name: "Vent Féérique", - effect: "Le lanceur déchaîne un vent magique qui cingle la cible." - }, - "moonblast": { - name: "Pouvoir Lunaire", - effect: "Le lanceur attaque la cible grâce au pouvoir de la lune, ce qui peut diminuer l’Attaque Spéciale de celle-ci." - }, - "boomburst": { - name: "Bang Sonique", - effect: "Attaque les Pokémon alentour grâce à une onde sonore assourdissante qui détruit tout sur son passage." - }, - "fairyLock": { - name: "Verrou Enchanté", - effect: "Des chaînes entourent la zone de combat, empêchant tous les Pokémon de quitter le terrain au tour suivant." - }, - "kingsShield": { - name: "Bouclier Royal", - effect: "Prend une posture défensive pour bloquer les dégâts. Diminue beaucoup l’Attaque de tout Pokémon qui entre en contact avec le lanceur." - }, - "playNice": { - name: "Camaraderie", - effect: "La cible se lie d’amitié avec le lanceur et perd sa combativité, ce qui diminue son Attaque." - }, - "confide": { - name: "Confidence", - effect: "Le lanceur dévoile des secrets à la cible, qui perd alors sa concentration et voit son Attaque Spéciale diminuer." - }, - "diamondStorm": { - name: "Orage Adamantin", - effect: "Provoque une tempête de diamants qui inflige des dégâts. Peut beaucoup augmenter la Défense du lanceur." - }, - "steamEruption": { - name: "Jet de Vapeur", - effect: "Le lanceur projette de la vapeur extrêmement chaude sur la cible, ce qui peut aussi la brûler (30% de chances)." - }, - "hyperspaceHole": { - name: "TrouDimensionnel", - effect: "Le lanceur crée une faille dimensionnelle pour attaquer soudainement la cible de côté. Ignore même les capacités comme Abri ou Détection." - }, - "waterShuriken": { - name: "Sheauriken", - effect: "Le lanceur attaque la cible avec des shuriken de mucus. Cette capacité frappe en priorité deux à cinq fois d’affilée en un tour." - }, - "mysticalFire": { - name: "Feu Ensorcelé", - effect: "Le lanceur attaque en soufflant des flammes brûlantes par la bouche et diminue l’Attaque Spéciale de la cible." - }, - "spikyShield": { - name: "Pico-Défense", - effect: "Protège des attaques, et diminue les PV de tout assaillant qui entre en contact avec le lanceur." - }, - "aromaticMist": { - name: "Brume Capiteuse", - effect: "Grâce à un parfum mystérieux, augmente la Défense Spéciale d’un allié." - }, - "eerieImpulse": { - name: "Ondes Étranges", - effect: "Le corps du lanceur produit des ondes anormales qui enveloppent la cible et diminuent beaucoup son Attaque Spéciale." - }, - "venomDrench": { - name: "Piège de Venin", - effect: "Sécrète un liquide empoisonné. Diminue l’Attaque, l’Attaque Spéciale et la Vitesse de l’ennemi empoisonné." - }, - "powder": { - name: "Nuée de Poudre", - effect: "L’ennemi est pris dans un nuage de poudre. S’il utilise une capacité de type Feu lors du même tour, le nuage explose et lui inflige des dégâts." - }, - "geomancy": { - name: "Géo-Contrôle", - effect: "Le lanceur absorbe de l’énergie au premier tour et augmente beaucoup son Attaque Spéciale, sa Défense Spéciale et sa Vitesse au second." - }, - "magneticFlux": { - name: "Magné-Contrôle", - effect: "Manipule les champs magnétiques pour augmenter la Défense et la Défense Spéciale des Pokémon alliés dotés du talent Plus ou du talent Moins." - }, - "happyHour": { - name: "Étrennes", - effect: "Utilisée pendant un combat, multiplie par deux l’argent gagné à la fin." - }, - "electricTerrain": { - name: "Champ Électrifié", - effect: "Pendant cinq tours, le terrain se charge d’électricité. Les Pokémon au sol ne peuvent pas s’endormir et la puissance des capacités de type Électrik augmente." - }, - "dazzlingGleam": { - name: "Éclat Magique", - effect: "Le lanceur libère une puissante décharge lumineuse qui inflige des dégâts à l’ennemi." - }, - "celebrate": { - name: "Célébration", - effect: "Le Pokémon vous souhaite plein de bonnes choses pour cet évènement spécial." - }, - "holdHands": { - name: "Mains Jointes", - effect: "Le lanceur et un allié se prennent la main, ce qui les rend heureux." - }, - "babyDollEyes": { - name: "Regard Touchant", - effect: "Le lanceur fixe la cible d’un air très attendrissant qui la touche et diminue son Attaque. Agit en priorité." - }, - "nuzzle": { - name: "Frotte-Frimousse", - effect: "Le lanceur attaque en frottant ses bajoues chargées d’électricité, ce qui paralyse la cible." - }, - "holdBack": { - name: "Retenue", - effect: "Le lanceur attaque avec retenue, et laisse au moins 1 PV à la cible." - }, - "infestation": { - name: "Harcèlement", - effect: "Cette attaque perdure pendant quatre à cinq tours. La cible ne peut pas quitter le terrain pendant cette période." - }, - "powerUpPunch": { - name: "Poing Boost", - effect: "À force de frapper, les poings deviennent plus durs. Augmente l’Attaque du lanceur si l’ennemi est touché." - }, - "oblivionWing": { - name: "Mort’Ailes", - effect: "Vole l’énergie de la cible. Rend au lanceur un nombre de PV supérieur ou égal à la moitié des dégâts infligés." - }, - "thousandArrows": { - name: "Myria-Flèches", - effect: "Touche même les Pokémon dans les airs. Dans ce cas, la cible retombe au sol." - }, - "thousandWaves": { - name: "Myria-Vagues", - effect: "Attaque avec des vagues glissant au sol. L’ennemi pris dedans ne peut pas s’échapper." - }, - "landsWrath": { - name: "Force Chtonienne", - effect: "Utilise la puissance du sol et la concentre sur l’ennemi pour infliger des dégâts." - }, - "lightOfRuin": { - name: "Lumière du Néant", - effect: "Utilise la puissance de la fleur Éternelle pour lancer un formidable rayon d’énergie. Blesse aussi gravement le lanceur." - }, - "originPulse": { - name: "Onde Originelle", - effect: "Le lanceur projette une aura, et d’innombrables rayons lumineux d’un bleu étincelant s’abattent sur la cible." - }, - "precipiceBlades": { - name: "Lame Pangéenne", - effect: "Le Pokémon transforme la puissance de la terre et attaque la cible avec une lame acérée." - }, - "dragonAscent": { - name: "Draco-Ascension", - effect: "Le Pokémon s’abat à toute vitesse sur la cible depuis les hautes couches de l’atmosphère. Baisse la Défense et la Défense Spéciale du lanceur." - }, - "hyperspaceFury": { - name: "Furie Dimension", - effect: "Le Pokémon utilise sa multitude de bras pour infliger une nuée de coups qui ignorent les capacités telles qu’Abri ou Détection. Baisse la Défense du lanceur." - }, - "breakneckBlitzPhysical": { - name: "Turbo-Charge Bulldozer", - effect: "Le Pokémon utilise la Force Z pour s’élancer à toute vitesse sur l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "breakneckBlitzSpecial": { - name: "Turbo-Charge Bulldozer", - effect: "Dummy Data" - }, - "allOutPummelingPhysical": { - name: "Combo Hyper-Furie", - effect: "Le Pokémon utilise la Force Z pour créer une boule d’énergie qu’il projette sur l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "allOutPummelingSpecial": { - name: "Combo Hyper-Furie", - effect: "Dummy Data" - }, - "supersonicSkystrikePhysical": { - name: "Piqué Supersonique", - effect: "Le Pokémon utilise la Force Z pour s’envoler très haut dans le ciel avant de plonger sur l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "supersonicSkystrikeSpecial": { - name: "Piqué Supersonique", - effect: "Dummy Data" - }, - "acidDownpourPhysical": { - name: "Déluge Causti-Toxique", - effect: "Le Pokémon utilise la Force Z pour répandre un marécage empoisonné où l’adversaire sombre. La puissance varie selon celle de la capacité originale." - }, - "acidDownpourSpecial": { - name: "Déluge Causti-Toxique", - effect: "Dummy Data" - }, - "tectonicRagePhysical": { - name: "Éruption Géo-Sismique", - effect: "Le Pokémon utilise la Force Z pour entraîner l’adversaire dans les profondeurs de la terre. La puissance varie selon celle de la capacité originale." - }, - "tectonicRageSpecial": { - name: "Éruption Géo-Sismique", - effect: "Dummy Data" - }, - "continentalCrushPhysical": { - name: "Apocalypse Gigalithique", - effect: "Le Pokémon utilise la Force Z pour créer un immense rocher et écraser l’adversaire avec. La puissance varie selon celle de la capacité originale." - }, - "continentalCrushSpecial": { - name: "Apocalypse Gigalithique", - effect: "Dummy Data" - }, - "savageSpinOutPhysical": { - name: "Cocon Fatal", - effect: "Le Pokémon utilise la Force Z pour cracher de longs fils de soie et enserrer l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "savageSpinOutSpecial": { - name: "Cocon Fatal", - effect: "Dummy Data" - }, - "neverEndingNightmarePhysical": { - name: "Appel des Ombres Éternelles", - effect: "Le Pokémon utilise la Force Z pour invoquer des esprits rancuniers qui s’abattent sur l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "neverEndingNightmareSpecial": { - name: "Appel des Ombres Éternelles", - effect: "Dummy Data" - }, - "corkscrewCrashPhysical": { - name: "Vrille Maximum", - effect: "Le Pokémon utilise la Force Z pour tourner à toute vitesse et écraser l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "corkscrewCrashSpecial": { - name: "Vrille Maximum", - effect: "Dummy Data" - }, - "infernoOverdrivePhysical": { - name: "Pyro-Explosion Cataclysmique", - effect: "Le Pokémon utilise la Force Z pour cracher une boule de feu qui réduit l’adversaire en cendres. La puissance varie selon celle de la capacité originale." - }, - "infernoOverdriveSpecial": { - name: "Pyro-Explosion Cataclysmique", - effect: "Dummy Data" - }, - "hydroVortexPhysical": { - name: "Super Tourbillon Abyssal", - effect: "Le Pokémon utilise la Force Z pour créer un tourbillon gigantesque qui avale l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "hydroVortexSpecial": { - name: "Super Tourbillon Abyssal", - effect: "Dummy Data" - }, - "bloomDoomPhysical": { - name: "Pétalexplosion Éblouissante", - effect: "Le Pokémon utilise la Force Z pour libérer l’énergie des plantes et attaquer l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "bloomDoomSpecial": { - name: "Pétalexplosion Éblouissante", - effect: "Dummu Data" - }, - "gigavoltHavocPhysical": { - name: "Fulguro-Lance Gigavolt", - effect: "Le Pokémon utilise la Force Z pour générer un courant électrique puissant qu’il projette sur l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "gigavoltHavocSpecial": { - name: "Fulguro-Lance Gigavolt", - effect: "Dummy Data" - }, - "shatteredPsychePhysical": { - name: "Psycho-Pulvérisation EX", - effect: "Le Pokémon utilise la Force Z pour manipuler l’adversaire et lui infliger de sérieux dégâts. La puissance varie selon celle de la capacité originale." - }, - "shatteredPsycheSpecial": { - name: "Psycho-Pulvérisation EX", - effect: "Dummy Data" - }, - "subzeroSlammerPhysical": { - name: "Laser Cryogénique", - effect: "Le Pokémon utilise la Force Z pour baisser la température brutalement et congeler l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "subzeroSlammerSpecial": { - name: "Laser Cryogénique", - effect: "Dummy Data" - }, - "devastatingDrakePhysical": { - name: "Chaos Draconique", - effect: "Le Pokémon utilise la Force Z pour matérialiser son aura et assaillir l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "devastatingDrakeSpecial": { - name: "Chaos Draconique", - effect: "Dummy Data" - }, - "blackHoleEclipsePhysical": { - name: "Trou Noir des Ombres", - effect: "Le Pokémon utilise la Force Z pour rassembler l’énergie négative et y aspirer l’adversaire. La puissance varie selon celle de la capacité originale." - }, - "blackHoleEclipseSpecial": { - name: "Trou Noir des Ombres", - effect: "Dummy Data" - }, - "twinkleTacklePhysical": { - name: "Impact Choupinova", - effect: "Le Pokémon utilise la Force Z pour créer une dimension irréelle où l’adversaire est à sa merci. La puissance varie selon celle de la capacité originale." - }, - "twinkleTackleSpecial": { - name: "Impact Choupinova", - effect: "Dummy Data" - }, - "catastropika": { - name: "Pikachute Foudroyante", - effect: "Pikachu utilise la Force Z pour concentrer toute son électricité avant de se jeter à toute vitesse sur l’adversaire." - }, - "shoreUp": { - name: "Amass’Sable", - effect: "Le lanceur récupère jusqu’à la moitié de ses PV max. Durant une tempête de sable, il en récupère encore plus." - }, - "firstImpression": { - name: "Escarmouche", - effect: "Une capacité très puissante, mais qui ne fonctionne que lorsque le lanceur entre au combat." - }, - "banefulBunker": { - name: "Blockhaus", - effect: "Le lanceur se protège contre les attaques, et si un assaillant utilise une attaque directe contre lui, il l’empoisonne." - }, - "spiritShackle": { - name: "Tisse Ombre", - effect: "Une attaque qui coud la cible à son ombre, ce qui l’empêche de s’enfuir." - }, - "darkestLariat": { - name: "Dark Lariat", - effect: "Le lanceur étend les bras et frappe l’adversaire en tournant violemment. Il inflige des dégâts et ignore les changements de stats de la cible." - }, - "sparklingAria": { - name: "Aria de l’Écume", - effect: "Le lanceur émet plusieurs bulles en chantant. Soigne les brûlures des Pokémon touchés par ces bulles." - }, - "iceHammer": { - name: "Marteau de Glace", - effect: "Le lanceur donne un puissant coup de poing à la cible, ce qui réduit la Vitesse du lanceur." - }, - "floralHealing": { - name: "Soin Floral", - effect: "Rend la moitié de ses PV max à la cible. Plus efficace sur un Champ Herbu." - }, - "highHorsepower": { - name: "Cavalerie Lourde", - effect: "Le lanceur attaque violemment en utilisant tout son poids." - }, - "strengthSap": { - name: "Vole-Force", - effect: "Rend au lanceur une quantité de PV équivalente à la stat d’Attaque de la cible, puis baisse celle-ci." - }, - "solarBlade": { - name: "Lame Solaire", - effect: "Le lanceur absorbe une grande quantité de lumière au premier tour et attaque au second tour en libérant cette énergie sous la forme d’une lame." - }, - "leafage": { - name: "Feuillage", - effect: "Le lanceur attaque la cible avec des feuilles." - }, - "spotlight": { - name: "Projecteur", - effect: "Met un Pokémon sous le feu des projecteurs et force tout le monde à le viser." - }, - "toxicThread": { - name: "Fil Toxique", - effect: "Tisse un fil imprégné de venin. Empoisonne la cible et baisse sa Vitesse." - }, - "laserFocus": { - name: "Affilage", - effect: "Le lanceur se concentre pour être sûr de porter un coup critique au tour suivant." - }, - "gearUp": { - name: "Engrenage", - effect: "Change de réglage pour augmenter l’Attaque et l’Attaque Spéciale des alliés ayant les talents Plus ou Minus." - }, - "throatChop": { - name: "Exécu-Son", - effect: "Inflige une douleur tellement violente à la cible qu’elle ne peut plus émettre de sons pendant deux tours." - }, - "pollenPuff": { - name: "Boule Pollen", - effect: "Sur un ennemi, le lanceur envoie une boule explosive qui fait des dégâts. Sur un allié, il envoie du bon pollen nutritif qui fait récupérer des PV." - }, - "anchorShot": { - name: "Ancrage", - effect: "Le lanceur jette son ancre sur la cible pour l’attaquer. Une fois accrochée, elle l’empêche de s’enfuir." - }, - "psychicTerrain": { - name: "Champ Psychique", - effect: "Pendant cinq tours, les Pokémon au sol ne peuvent plus subir d’attaques prioritaires et la puissance des capacités de type Psy augmente." - }, - "lunge": { - name: "Furie-Bond", - effect: "Le lanceur se jette sur la cible de toutes ses forces pour lui infliger des dégâts et baisser son Attaque." - }, - "fireLash": { - name: "Fouet de Feu", - effect: "Frappe la cible avec un fouet incandescent et baisse sa Défense." - }, - "powerTrip": { - name: "Arrogance", - effect: "Ivre de puissance, le lanceur attaque de toutes ses forces. Plus ses stats ont été augmentées, plus la puissance de cette capacité augmente." - }, - "burnUp": { - name: "Flamme Ultime", - effect: "Le Pokémon se consume et les flammes de son corps infligent des dégâts élevés à la cible. Le lanceur perd le type Feu." - }, - "speedSwap": { - name: "Permuvitesse", - effect: "Intervertit la Vitesse du lanceur et celle de la cible." - }, - "smartStrike": { - name: "Estocorne", - effect: "Le lanceur transperce la cible avec sa corne effilée. N’échoue jamais." - }, - "purify": { - name: "Purification", - effect: "Le lanceur soigne les altérations de statut de la cible, ce qui lui permet de regagner des PV." - }, - "revelationDance": { - name: "Danse Éveil", - effect: "Le lanceur attaque en dansant avec enthousiasme. Le type de la capacité est le même que celui du lanceur." - }, - "coreEnforcer": { - name: "Sanction Suprême", - effect: "La cible subit des dégâts et, si elle a déjà agi à ce tour, elle perd aussi son talent." - }, - "tropKick": { - name: "Botte Sucrette", - effect: "Un coup de pied chaud comme les tropiques qui inflige des dégâts à la cible et baisse son Attaque." - }, - "instruct": { - name: "Sommation", - effect: "Force la cible à lancer immédiatement la dernière capacité qu’elle a utilisée." - }, - "beakBlast": { - name: "Bec-Canon", - effect: "Le lanceur fait chauffer son bec avant d’attaquer. S’il subit une attaque directe pendant la montée en température, l’attaquant sera brûlé." - }, - "clangingScales": { - name: "Vibrécaille", - effect: "Le lanceur déclenche un vacarme en frottant ses écailles les unes contre les autres pour attaquer. Baisse la Défense du lanceur." - }, - "dragonHammer": { - name: "Draco-Marteau", - effect: "Le lanceur utilise son corps comme un véritable marteau pour écraser la cible." - }, - "brutalSwing": { - name: "Centrifugifle", - effect: "Le lanceur pivote pour prendre de l’élan et infliger des dégâts." - }, - "auroraVeil": { - name: "Voile Aurore", - effect: "Réduit les dégâts causés par les capacités physiques et spéciales durant cinq tours. Ne peut être utilisée que lorsqu’il neige." - }, - "sinisterArrowRaid": { - name: "Fureur des Plumes Spectrales", - effect: "Archéduc utilise la Force Z pour créer un nuage de flèches qui transpercent la cible." - }, - "maliciousMoonsault": { - name: "Dark Body Press", - effect: "Félinferno utilise la Force Z pour gonfler ses muscles et écraser la cible de toutes ses forces." - }, - "oceanicOperetta": { - name: "Symphonie des Ondines", - effect: "Oratoria utilise la Force Z pour rassembler une grande quantité d’eau et la projeter sur la cible à pleine puissance." - }, - "guardianOfAlola": { - name: "Colère du Gardien d’Alola", - effect: "Le Pokémon Tutélaire utilise la Force Z et déchaîne toute la puissance d’Alola sur sa cible. Inflige des dégâts en fonction des PV restants de celle-ci." - }, - "soulStealing7StarStrike": { - name: "Fauche-Âme des Sept Étoiles", - effect: "Marshadow concentre toute la Force Z dans ses poings et ses pieds pour infliger un déluge de coups à la cible." - }, - "stokedSparksurfer": { - name: "Électro-Surf Survolté", - effect: "Le Raichu de la région d’Alola utilise la Force Z pour frapper la cible et la paralyser." - }, - "pulverizingPancake": { - name: "Gare au Ronflex", - effect: "Ronflex utilise la Force Z pour montrer ce qu’il a dans le ventre et écraser la cible de tout son poids." - }, - "extremeEvoboost": { - name: "Neuf pour Un", - effect: "Évoli utilise la Force Z pour emprunter la puissance de tous ses amis évolués et beaucoup augmenter toutes ses stats." - }, - "genesisSupernova": { - name: "Supernova Originelle", - effect: "Mew utilise la Force Z pour attaquer la cible. Le terrain devient un Champ Psychique." - }, - "shellTrap": { - name: "Carapiège", - effect: "Pose une carapace piégée. Si l’adversaire utilise une capacité physique, la carapace explose et lui inflige des dégâts." - }, - "fleurCannon": { - name: "Canon Floral", - effect: "Envoie un rayon laser dévastateur. Baisse beaucoup l’Attaque Spéciale du lanceur." - }, - "psychicFangs": { - name: "Psycho-Croc", - effect: "Le lanceur mord la cible avec ses pouvoirs psychiques. Brise aussi les barrières comme Mur Lumière et Protection." - }, - "stompingTantrum": { - name: "Trépignement", - effect: "Le lanceur attaque en utilisant sa frustration. S’il a utilisé une capacité qui a échoué au tour précédent, la puissance de Trépignement est doublée." - }, - "shadowBone": { - name: "Os Ombre", - effect: "Le lanceur frappe avec un os possédé par l’âme d’un défunt. Peut aussi baisser la Défense de la cible." - }, - "accelerock": { - name: "Vif Roc", - effect: "Le lanceur charge la cible à toute vitesse. Frappe en priorité." - }, - "liquidation": { - name: "Aqua-Brèche", - effect: "Le lanceur utilise la force de l’eau pour attaquer. Peut aussi baisser la Défense de la cible." - }, - "prismaticLaser": { - name: "Laser Prisme", - effect: "Le lanceur utilise la puissance d’un prisme pour envoyer un laser destructeur, mais il doit se reposer au tour suivant." - }, - "spectralThief": { - name: "Clepto-Mânes", - effect: "Le lanceur plonge dans l’ombre de la cible, vole ses augmentations de stats et l’attaque." - }, - "sunsteelStrike": { - name: "Choc Météore", - effect: "Le lanceur fonce sur la cible à la vitesse d’une météorite. Ignore le talent de l’ennemi." - }, - "moongeistBeam": { - name: "Rayon Spectral", - effect: "Le lanceur attaque avec un rayon de lumière mystérieux. Ignore le talent de la cible." - }, - "tearfulLook": { - name: "Larme à l’Œil", - effect: "Le lanceur regarde la cible avec des yeux remplis de larmes. Celle-ci perd toute combativité et voit son Attaque et son Attaque Spéciale baisser." - }, - "zingZap": { - name: "Électrikipik", - effect: "Le lanceur fonce sur la cible et lui envoie un puissant choc électrique, ce qui peut aussi l’effrayer." - }, - "naturesMadness": { - name: "Ire de la Nature", - effect: "Le lanceur déchaîne toute la colère de la nature pour baisser les PV de la cible de moitié." - }, - "multiAttack": { - name: "Coup Varia-Type", - effect: "Le Pokémon s’entoure d’une puissante énergie avant de foncer sur sa cible. Le type de la capacité dépend de la ROM installée." - }, - "tenMillionVoltThunderbolt": { - name: "Giga-Tonnerre", - effect: "Le Pikachu à casquette utilise la Force Z pour augmenter sa puissance électrique avant de la déchaîner sur la cible. Taux de critique élevé." - }, - "mindBlown": { - name: "Caboche-Kaboum", - effect: "Le lanceur fait exploser sa tête pour attaquer toutes les cibles autour de lui. Il subit aussi des dégâts." - }, - "plasmaFists": { - name: "Plasma Punch", - effect: "Le lanceur attaque en projetant de l’électricité avec ses poings. Convertit les capacités de type Normal en type Électrik." - }, - "photonGeyser": { - name: "Photo-Geyser", - effect: "Le lanceur fait jaillir un pilier de lumière. Compare l’Attaque et l’Attaque Spéciale, et utilise celle qui infligera le plus de dégâts." - }, - "lightThatBurnsTheSky": { - name: "Apocalypsis Luminis", - effect: "Compare l’Attaque et l’Attaque Spéciale, et utilise celle qui infligera le plus de dégâts. Ignore le talent de la cible." - }, - "searingSunrazeSmash": { - name: "Hélio-Choc Dévastateur", - effect: "Baigné dans la Force Z, Solgaleo attaque en déchaînant toute sa puissance. Ignore le talent de la cible." - }, - "menacingMoonrazeMaelstrom": { - name: "Rayons Séléno-Explosifs", - effect: "Baigné dans la Force Z, Lunala attaque en déchaînant toute sa puissance. Ignore le talent de la cible." - }, - "letsSnuggleForever": { - name: "Patati-Patattrape", - effect: "Mimiqui concentre toute la Force Z dans son corps, et attaque dans le plus grand fracas !" - }, - "splinteredStormshards": { - name: "Hurlement des Roches-Lames", - effect: "Lougaroc utilise la Force Z pour attaquer la cible de toutes ses forces. Efface aussi tout Champ existant." - }, - "clangorousSoulblaze": { - name: "Dracacophonie Flamboyante", - effect: "Ékaïser utilise la Force Z pour frapper l’ennemi de toutes ses forces. Augmente aussi ses stats." - }, - "zippyZap": { - name: "Pika-Sprint", - effect: "Une attaque électrique rapide comme l’éclair qui augmente l’esquive. Frappe en priorité." - }, - "splishySplash": { - name: "Pika-Splash", - effect: "Pikachu frappe l’adversaire avec une vague géante chargée d’électricité. Peut aussi paralyser l’ennemi." - }, - "floatyFall": { - name: "Pika-Piqué", - effect: "Pikachu prend de la hauteur avant de fondre sur son adversaire. Peut aussi apeurer l’ennemi." - }, - "pikaPapow": { - name: "Pika-Fracas", - effect: "Plus le lanceur est heureux, plus l’attaque est puissante." - }, - "bouncyBubble": { - name: "Évo-Thalasso", - effect: "L’adversaire est frappé par des bulles d’eau qui sont ensuite absorbées pour récupérer un nombre de PV égal aux dégâts infligés à l’ennemi." - }, - "buzzyBuzz": { - name: "Évo-Dynamo", - effect: "Une attaque qui foudroie et paralyse l’adversaire." - }, - "sizzlySlide": { - name: "Évo-Flambo", - effect: "Évoli s’embrase et percure violemment l’adversaire. Brûle aussi l’ennemi." - }, - "glitzyGlow": { - name: "Évo-Psycho", - effect: "Évoli submerge l’adversaire sous un flot d’ondes psychiques et crée un mur fabuleux qui réduit les dégâts causés par les attaques spéciales de l’ennemi" - }, - "baddyBad": { - name: "Évo-Ténébro", - effect: "Évoli fait appel à son côté sombre pour attaquer l’adversaire et créer un mur fabuleux qui réduit les dégâts causés par les attaques physiques de l’ennemi." - }, - "sappySeed": { - name: "Évo-Écolo", - effect: "Une liane géante surgit du sol et bombarde l’adversaire de graines qui lui dérobent des PV à chaque tour. Ces PV sont ensuite absorbés par Évoli." - }, - "freezyFrost": { - name: "Évo-Congélo", - effect: "Évoli frappe l’adversaire avec un cristal de buée noire gelée. Annule les changements de stats de tous les Pokémon au combat." - }, - "sparklySwirl": { - name: "Évo-Fabulo", - effect: "Une attaque qui enserre l’adversaire dans un tourbillon de senteurs oppressantes. Guérit toutes les altérations de statut de l’équipe." - }, - "veeveeVolley": { - name: "Évo-Chardasso", - effect: "Le lanceur lance une attaque dès lors qu’un signe apparaît sur le terrain. Les dégâts infligés sont proportionnels à l’affection de votre Pokémon" - }, - "doubleIronBash": { - name: "Écrous d’Poing", - effect: "Le lanceur fait pivoter l’écrou de sa poitrine deux fois d’affilée pour frapper l’adversaire avec ses bras. Peut apeurer l’ennemi (30% de chances)." - }, - "maxGuard": { - name: "Gardomax", - effect: "Le lanceur se protège de toutes les attaques. Peut échouer si utilisée plusieurs fois de suite." - }, - "dynamaxCannon": { - name: "Canon Dynamax", - effect: "Le lanceur attaque en émettant un laser depuis son noyau. Cette capacité inflige deux fois plus de dégâts si l’adversaire est level 200." - }, - "snipeShot": { - name: "Tir de Précision", - effect: "Le lanceur parvient toujours à viser la cible voulue, en ignorant l’effet des talents et des capacités capables de détourner les attaques." - }, - "jawLock": { - name: "Croque Fort", - effect: "Le lanceur et sa cible ne peuvent plus être échangés jusqu’à ce que l’un d’entre eux tombe K.O. L’effet est annulé si l’un des deux Pokémon quitte le terrain." - }, - "stuffCheeks": { - name: "Garde-à-Joues", - effect: "Le lanceur mange la Baie qu’il tient, ce qui augmente beaucoup sa Défense." - }, - "noRetreat": { - name: "Ultime Bastion", - effect: "Le lanceur voit toutes ses stats augmenter, mais en contrepartie, il ne peut plus quitter le terrain." - }, - "tarShot": { - name: "Goudronnage", - effect: "Le lanceur recouvre sa cible de goudron liquide pour baisser sa Vitesse et la rendre vulnérable au feu." - }, - "magicPowder": { - name: "Poudre Magique", - effect: "Le lanceur recouvre sa cible d’une poudre magique qui change son type en Psy." - }, - "dragonDarts": { - name: "Draco-Flèches", - effect: "Le lanceur attaque en propulsant deux Fantyrm. S’il y a deux cibles, chacune d’entre elles est frappée par un Fantyrm." - }, - "teatime": { - name: "Thérémonie", - effect: "Le lanceur invite tous les Pokémon sur le terrain à prendre le goûter autour d’une tasse de thé. Ceux qui tiennent une Baie la mangent." - }, - "octolock": { - name: "Octoprise", - effect: "Empêche l’ennemi de fuir ou de quitter le terrain. Baisse la Défense et la Défense Spécial de l’ennemi chaque tour." - }, - "boltBeak": { - name: "Prise de Bec", - effect: "Inflige des dégâts et les double si le lanceur attaque avant l’ennemi." - }, - "fishiousRend": { - name: "Branchicrok", - effect: "Inflige des dégâts et les double si le lanceur attaque avant l’ennemi." - }, - "courtChange": { - name: "Change-Côté", - effect: "Une force mystérieuse intervertit les effets affectant chaque côté du terrain." - }, - "maxFlare": { - name: "Pyromax", - effect: "Une attaque de type Feu que seuls les Pokémon Dynamax peuvent utiliser. Fait briller le soleil pendant cinq tours." - }, - "maxFlutterby": { - name: "Insectomax", - effect: "Une attaque de type Insecte que seuls les Pokémon Dynamax peuvent utiliser. Baisse l’Attaque Spéciale de la cible." - }, - "maxLightning": { - name: "Fulguromax", - effect: "Une attaque de type Électrik que seuls les Pokémon Dynamax peuvent utiliser. Crée un Champ Électrifié qui dure cinq tours." - }, - "maxStrike": { - name: "Normalomax", - effect: "Une attaque de type Normal que seuls les Pokémon Dynamax peuvent utiliser. Baisse la Vitesse de la cible." - }, - "maxKnuckle": { - name: "Pugilomax", - effect: "Une attaque de type Combat que seuls les Pokémon dynamax peuvent utiliser. Augmente l’Attaque des Alliés." - }, - "maxPhantasm": { - name: "Spectromax", - effect: "Une attaque de type Spectre que seuls les Pokémon Dynamax peuvent utiliser. Baisse la Défense de la cible." - }, - "maxHailstorm": { - name: "Cryomax", - effect: "Une attaque de type Glace que seuls les Pokémon Dynamax peuvent utiliser. Invoque une tempête de grêle qui dure cinq tours." - }, - "maxOoze": { - name: "Toxinomax", - effect: "Une attaque de type Poison que seuls les Pokémon Dynamax peuvent utiliser. Augmente l’Attaque Spéciale des alliés." - }, - "maxGeyser": { - name: "Hydromax", - effect: "Une attaque de type Eau que seuls les Pokémon Dynamax peuvent utiliser. Invoque de fortes pluies qui durent cinq tours." - }, - "maxAirstream": { - name: "Aéromax", - effect: "Une attaque de type Vol que seuls les Pokémon Dynamax peuvent utiliser. Augmente la Vitesse des alliés." - }, - "maxStarfall": { - name: "Enchantomax", - effect: "Une attaque de type Fée que seuls les Pokémon Dynamax peuvent utiliser. Crée un Champ Brumeux qui dure cinq tours." - }, - "maxWyrmwind": { - name: "Dracomax", - effect: "Une attaque de type Dragon que seuls les Pokémon Dynamax peuvent utiliser. Baisse l’Attaque de la cible." - }, - "maxMindstorm": { - name: "Psychomax", - effect: "Une attaque de type Psy que seuls les Pokémon Dynamax peuvent utiliser. Crée un Champ Psychique qui dure cinq tours." - }, - "maxRockfall": { - name: "Lithomax", - effect: "Une attaque de type Roche que seuls les Pokémon Dynamax peuvent utiliser. Invoque une tempête de sable qui dure cinq tours." - }, - "maxQuake": { - name: "Sismomax", - effect: "Une attaque de type Sol que seuls les Pokémon Dynamax peuvent utiliser. Augmente la Défense Spéciale des alliés." - }, - "maxDarkness": { - name: "Sinistromax", - effect: "Une attaque de type Ténèbres que seuls les Pokémon Dynamax peuvent utiliser. Baisse la Défense Spéciale de la cible." - }, - "maxOvergrowth": { - name: "Phytomax", - effect: "Une attaque de type Plante que seuls les Pokémon Dynamax peuvent utiliser. Crée un Champ Herbu qui dure cinq tours." - }, - "maxSteelspike": { - name: "Métallomax", - effect: "Une attaque de type Acier que seuls les Pokémon Dynamax peuvent utiliser. Augmente la Défense des alliés." - }, - "clangorousSoul": { - name: "Dracacophonie", - effect: "Sacrifie une partie de ses PV pour augmenter toutes ses statistiques." - }, - "bodyPress": { - name: "Big Splash", - effect: "Le lanceur utilise son corps pour attaquer sa cible. Plus la Défense du lanceur est élevée, plus les dégâts infligés sont importants." - }, - "decorate": { - name: "Nappage", - effect: "Augmente fortement l’Attaque et l’Attaque Spéciale du lanceur." - }, - "drumBeating": { - name: "Tambour Battant", - effect: "Le lanceur bat son tambour pour en diriger les racines sur la cible, l’attaquer, et baisser sa Vitesse." - }, - "snapTrap": { - name: "Troquenard", - effect: "Bloque l’ennemi pendant 4 à 5 tours." - }, - "pyroBall": { - name: "Ballon Brûlant", - effect: "Le lanceur attaque avec un ballon fait à partir d’un caillou enflammé. Peut aussi brûler la cible (10% de chances)." - }, - "behemothBlade": { - name: "Gladius Maximus", - effect: "Le lanceur se transforme en une immense épée et pourfend sa cible. Cette capacité inflige le double de dégâts aux Pokémon Dynamax." - }, - "behemothBash": { - name: "Aegis Maxima", - effect: "Le lanceur se transforme en un immense bouclier et charge sa cible. Cette capacité inflige le double de dégâts aux Pokémon Dynamax." - }, - "auraWheel": { - name: "Roue Libre", - effect: "Inflige et change en type Ténèbres" - }, - "breakingSwipe": { - name: "Abattage", - effect: "Le lanceur balaie violemment le camp adverse avec son immense queue. Baisse l’Attaque de la cible." - }, - "branchPoke": { - name: "Tapotige", - effect: "Le lanceur attaque sa cible en la piquant avec une branche pointue." - }, - "overdrive": { - name: "Overdrive", - effect: "Le lanceur gratte ses cordes de guitare ou de basse pour créer de violentes vibrations sonores qui blessent la cible." - }, - "appleAcid": { - name: "Acide Malique", - effect: "Le lanceur projette un liquide corrosif créé à partir d’une pomme acide sur la cible, ce qui baisse la Défense Spéciale de celle-ci." - }, - "gravApple": { - name: "Force G", - effect: "Le lanceur fait tomber une pomme de très haut sur la cible, ce qui baisse la Défense de celle-ci." - }, - "spiritBreak": { - name: "Choc Émotionnel", - effect: "Le lanceur attaque la cible avec une telle force que celle-ci peut s’en retrouver profondément troublée et voir son Attaque Spéciale baisser." - }, - "strangeSteam": { - name: "Vapeur Féérique", - effect: "Inflige des dégâts et peut rendre confus l’ennemi." - }, - "lifeDew": { - name: "Fontaine de Vie", - effect: "Le lanceur projette une eau mystérieuse sur le terrain pour restaurer ses PV et ceux de ses alliés au combat." - }, - "obstruct": { - name: "Blocage", - effect: "Protège le lanceur des attaques de contact. Baisse la Défense de deux crans si l’ennemi a tenté une attaque de contact." - }, - "falseSurrender": { - name: "Fourbette", - effect: "Le lanceur fait semblant de se prosterner et utilise ses cheveux pour transpercer sa cible. N’échoue jamais." - }, - "meteorAssault": { - name: "Joute Astrale", - effect: "Inflige de gros dégâts mais oblige le lanceur à se reposer pendant un tour." - }, - "eternabeam": { - name: "Laser Infinimax", - effect: "Inflige de gros dégâts mais oblige le lanceur à se reposer pendant un tour." - }, - "steelBeam": { - name: "Métalaser", - effect: "Le lanceur concentre du métal issu de tout son corps en un rayon qu’il projette violemment sur sa cible. Il subit aussi des dégâts." - }, - "expandingForce": { - name: "Vaste Pouvoir", - effect: "Le lanceur attaque la cible avec ses pouvoirs psychiques. Si un champ psychique est actif, la puissance de cette capacité augmente et elle touche tous les ennemis." - }, - "steelRoller": { - name: "Métalliroue", - effect: "Une attaque qui inflige des dégâts et fait disparaître le champ actif, mais qui échoue s’il n’y en a pas à ce moment." - }, - "scaleShot": { - name: "Rafale Écailles", - effect: "Le lanceur projette des écailles sur la cible de deux à cinq fois d’affilée. Augmente la Vitesse, mais diminue la Défense." - }, - "meteorBeam": { - name: "Laser Météore", - effect: "Le lanceur concentre l’énergie cosmique au premier tour, ce qui augmente son Attaque Spéciale, et frappe au second." - }, - "shellSideArm": { - name: "Kokiyarme", - effect: "Une attaque physique ou spéciale, en fonction de ce qui inflige le plus de dégâts à la cible. Peut aussi empoisonner." - }, - "mistyExplosion": { - name: "Explo-Brume", - effect: "Le lanceur frappe tous les Pokémon autour de lui en explosant, ce qui le met K.O. La puissance de cette attaque augmente si un champ brumeux est actif." - }, - "grassyGlide": { - name: "Gliss’Herbe", - effect: "Le lanceur attaque la cible en glissant sur le terrain. Frappe toujours en priorité si un champ herbu est actif." - }, - "risingVoltage": { - name: "Monte-Tension", - effect: "Des éclairs surgissent du sol et frappent la cible. La puissance de cette attaque est doublée si la cible est sur un champ électrifié." - }, - "terrainPulse": { - name: "Champlification", - effect: "Une attaque qui utilise la force des champs pour projeter une aura. Son type et sa puissance varient selon le champ actif." - }, - "skitterSmack": { - name: "Ravage Rampant", - effect: "Le lanceur rampe derrière la cible pour l’attaquer, ce qui baisse l’Attaque Spéciale de celle-ci." - }, - "burningJealousy": { - name: "Feu Envieux", - effect: "Le lanceur attaque sa cible avec toute sa jalousie. Cette capacité brûle tout Pokémon dont les stats ont augmenté pendant ce tour." - }, - "lashOut": { - name: "Cent Rancunes", - effect: "Le lanceur frappe la cible avec toute sa rancune. Si les stats du lanceur ont diminué pendant ce tour, la puissance de cette attaque est doublée." - }, - "poltergeist": { - name: "Esprit Frappeur", - effect: "Le lanceur manipule l’objet tenu par la cible pour l’attaquer. Cette capacité échoue si celle-ci ne tient rien." - }, - "corrosiveGas": { - name: "Gaz Corrosif", - effect: "Un gaz corrosif qui enveloppe tous les Pokémon alentour et qui dissout les objets qu’ils tiennent." - }, - "coaching": { - name: "Coaching", - effect: "Le lanceur coache ses alliés, augmentant ainsi leur Attaque et leur Défense." - }, - "flipTurn": { - name: "Eau Revoir", - effect: "Après son attaque, le lanceur revient à toute vitesse et change de place avec un Pokémon de l’équipe prêt à combattre." - }, - "tripleAxel": { - name: "Triple Axel", - effect: "Une série d’un à trois coups de pied distincts dont la puissance augmente à chaque fois que la capacité touche sa cible." - }, - "dualWingbeat": { - name: "Double Volée", - effect: "Le lanceur frappe la cible avec ses ailes deux fois d’affilée." - }, - "scorchingSands": { - name: "Sable Ardent", - effect: "Le lanceur projette du sable chauffé à blanc sur la cible, ce qui peut aussi la brûler (30% de chances)." - }, - "jungleHealing": { - name: "Selve Salvatrice", - effect: "Le lanceur fait appel au pouvoir de la jungle pour restaurer les PV et soigner les altérations d’état de ses alliés et de lui-même." - }, - "wickedBlow": { - name: "Poing Obscur", - effect: "Le lanceur assène un coup puissant à la cible. Cette technique qui inflige toujours un coup critique est réservée à ceux qui maîtrisent la puissance des Ténèbres." - }, - "surgingStrikes": { - name: "Torrent de Coups", - effect: "Le lanceur assène trois coups fluides à la cible. Cette technique qui inflige toujours un coup critique est réservée à ceux qui maîtrisent la puissance de l’Eau." - }, - "thunderCage": { - name: "Voltageôle", - effect: "Le lanceur frappe la cible, et le piège dans une prison électrique qui dure de quatre à cinq tours." - }, - "dragonEnergy": { - name: "Draco-Énergie", - effect: "Le lanceur utilise son énergie vitale pour attaquer la cible. Moins il a de PV, moins l’attaque est puissante." - }, - "freezingGlare": { - name: "Regard Glaçant", - effect: "Les yeux du lanceur tirent des rayons psychiques qui attaquent la cible et peuvent aussi la geler (10% de chances)." - }, - "fieryWrath": { - name: "Fureur Ardente", - effect: "Le lanceur canalise sa colère et la transforme en émanation brûlante, avec laquelle il attaque la cible, ce qui peut aussi apeurer celle-ci (20% de chances)." - }, - "thunderousKick": { - name: "Coup Fulgurant", - effect: "Le lanceur assène un coup de pied à la cible à la vitesse de l’éclair. Baisse aussi la Défense de la cible." - }, - "glacialLance": { - name: "Lance de Glace", - effect: "Le lanceur attaque la cible avec une lance de glace entourée d’un blizzard." - }, - "astralBarrage": { - name: "Éclat Spectral", - effect: "Le lanceur attaque la cible avec une multitude de petits spectres." - }, - "eerieSpell": { - name: "Sort Sinistre", - effect: "Le lanceur attaque avec de puissants pouvoirs psychiques et retire 3 PP de la dernière capacité utilisée par la cible." - }, - "direClaw": { - name: "Griffes Funestes", - effect: "Le lanceur attaque avec des griffes destructrices en visant les points faibles. La cible peut aussi être empoisonnée, paralysée, ou endormie." - }, - "psyshieldBash": { - name: "Sprint Bouclier", - effect: "Le lanceur s’enveloppe d’énergie psychique et frappe sa cible de plein fouet. Cela augmente également la Défense du lanceur." - }, - "powerShift": { - name: "Échange Force", - effect: "Le lanceur échange son Attaque avec sa Défense." - }, - "stoneAxe": { - name: "Hache de Pierre", - effect: "Le lanceur attaque le point faible de sa cible avec sa hache de pierre. Les débris de pierre se mettent alors à flotter autour de la cible." - }, - "springtideStorm": { - name: "Typhon Passionné", - effect: "Le lanceur déclenche un violent typhon de haine et d’amour qui s’abat sur la cible. Peut baisser l’Attaque de celle-ci." - }, - "mysticalPower": { - name: "Force Mystique", - effect: "Le lanceur attaque en libérant un pouvoir mystique. Cela augmente également son Attaque Spéciale." - }, - "ragingFury": { - name: "Grand Courroux", - effect: "Le lanceur se déchaîne et attaque en projetant de violentes flammes pendant deux ou trois tours. Il devient ensuite confus." - }, - "waveCrash": { - name: "Aquatacle", - effect: "Le lanceur se recouvre entièrement d’eau avant de charger sa cible. Cela blesse aussi gravement le lanceur." - }, - "chloroblast": { - name: "Herblast", - effect: "Le lanceur tire un concentré de sa propre chlorophylle sur la cible, ce qui le blesse également." - }, - "mountainGale": { - name: "Bise Glaciaire", - effect: "Le lanceur envoie un bloc de glace de la taille d’un iceberg sur la cible, ce qui peut aussi l’apeurer (30% de chances)." - }, - "victoryDance": { - name: "Danse Victoire", - effect: "Le lanceur danse vigoureusement pour invoquer la victoire, ce qui augmente son Attaque, sa Défense et sa Vitesse." - }, - "headlongRush": { - name: "Assaut Frontal", - effect: "Le lanceur charge la cible de toutes ses forces, ce qui baisse la Défense et la Défense Spéciale du lanceur." - }, - "barbBarrage": { - name: "Multitoxik", - effect: "Une multitude de pointes toxiques frappent la cible et peuvent l’empoisonner. La puissance est doublée si celle-ci est déjà empoisonnée (30% de chances en Style Normal et 50% de chances en Style Puissant)." - }, - "esperWing": { - name: "Ailes Psycho", - effect: "Le lanceur entaille la cible avec ses ailes renforcées par une émanation psychique. Taux de critiques élevé. Cela augmente la Vitesse du lanceur." - }, - "bitterMalice": { - name: "Cœur de Rancœur", - effect: "Une rancœur glaciale frappe la cible et baisse son Attaque." - }, - "shelter": { - name: "Mur Fumigène", - effect: "Rend la peau du lanceur dure comme un mur de fer, ce qui augmente beaucoup sa Défense." - }, - "tripleArrows": { - name: "Triple Flèche", - effect: "Le lanceur donne un coup de pied et tire trois flèches simultanément, ce qui peut baisser la Défense de la cible ou l’apeurer (30% de chances). Taux de critiques élevé." - }, - "infernalParade": { - name: "Cortège Funèbre", - effect: "Une multitude de boules de feu frappent la cible, ce qui peut aussi la brûler (30% de chances et 50% en Style Puissant). La puissance est doublée si celle-ci souffre d’une altération de statut." - }, - "ceaselessEdge": { - name: "Vagues à Lames", - effect: "Des lames de coquillages entaillent la cible en visant ses points faibles. Les débris de coquillage se répandent sous la forme de picots aux pieds de la cible." - }, - "bleakwindStorm": { - name: "Typhon Hivernal", - effect: "Le lanceur déclenche un typhon froid et brutal qui fait trembler le cœur et le corps de la cible, ce qui peut aussi baisser sa Vitesse." - }, - "wildboltStorm": { - name: "Typhon Fulgurant", - effect: "Le lanceur déclenche un violent typhon orageux dont les rafales et la foudre frappent la cible, ce qui peut aussi la paralyser (30% de chances en Style Normal et 50% en Style Puissant)." - }, - "sandsearStorm": { - name: "Typhon Pyrosable", - effect: "Le lanceur déclenche un violent typhon mêlé à du sable ardent qui s’abat sur la cible, ce qui peut la brûler (30% de chances et 50% en Style Puissant)." - }, - "lunarBlessing": { - name: "Prière Lunaire", - effect: "Le lanceur adresse une prière à la lune pour restaurer les PV et soigner ses altérations de statut ainsi que celles de ses alliés." - }, - "takeHeart": { - name: "Extravaillance", - effect: "Le lanceur fait preuve de bravoure pour soigner ses altérations de statut et augmenter sa puissance offensive et défensive." - }, - "gMaxWildfire": { - name: "Fournaise G-Max", - effect: "Une attaque de type Feu que seul un Dracaufeu Gigamax peut utiliser. Pendant quatre tours, la cible continue de subir des dégâts." - }, - "gMaxBefuddle": { - name: "Illusion G-Max", - effect: "Une attaque de type Insecte que seul un Papilusion Gigamax peut utiliser. Empoisonne, paralyse ou endort la cible." - }, - "gMaxVoltCrash": { - name: "Foudre G-Max", - effect: "Une attaque de type Électrik que seul un Pikachu Gigamax peut utiliser. Paralyse la cible." - }, - "gMaxGoldRush": { - name: "Pactole G-Max", - effect: "Une attaque de type Normal que seul un Miaouss Gigamax peut utiliser. Rend la cible confuse et permet d’obtenir de l’argent à la fin du combat." - }, - "gMaxChiStrike": { - name: "Frappe G-Max", - effect: "Une attaque de type Combat que seul un Mackogneur Gigamax peut utiliser. Augmente le taux de critiques du lanceur et de ses alliés." - }, - "gMaxTerror": { - name: "Hantise G-Max", - effect: "Une attaque de type Spectre que seul un Ectoplasma Gigamax peut utiliser. Empêche les Pokémon ennemis de quitter le combat." - }, - "gMaxResonance": { - name: "Résonance G-Max", - effect: "Une attaque de type Glace que seul un Lokhlass Gigamax peut utiliser. Réduit les dégâts causés par des capacités pendant cinq tours." - }, - "gMaxCuddle": { - name: "Câlin G-Max", - effect: "Une attaque de type Normal que seul un Évoli Gigamax peut utiliser. Rend la cible amoureuse." - }, - "gMaxReplenish": { - name: "Récolte G-Max", - effect: "Une attaque de type Normal que seul un Ronflex Gigamax peut utiliser. Restaure une Baie tenue qui a déjà été mangée." - }, - "gMaxMalodor": { - name: "Pestilence G-Max", - effect: "Une attaque de type Poison que seul un Miasmax Gigamax peut utiliser. Empoisonne la cible." - }, - "gMaxStonesurge": { - name: "Récif G-Max", - effect: "Une attaque de type Eau que seul un Torgamord Gigamax peut utiliser. Disperse des pierres aiguisées sur le terrain." - }, - "gMaxWindRage": { - name: "Rafale G-Max", - effect: "Une attaque de type Vol que seul un Corvaillus Gigamax peut utiliser. Permet de briser les barrières comme Protection et Mur Lumière." - }, - "gMaxStunShock": { - name: "Choc G-Max", - effect: "Une attaque de type Électrik que seul un Salarsen Gigamax peut utiliser. Empoisonne ou paralyse la cible." - }, - "gMaxFinale": { - name: "Cure G-Max", - effect: "Une attaque de type Fée que seul un Charmilly Gigamax peut utiliser. Restaure des PV aux alliés." - }, - "gMaxDepletion": { - name: "Usure G-Max", - effect: "Une attaque de type Dragon que seul un Duralugon Gigamax peut utiliser. Baisse les PP de la dernière capacité utilisée par la cible." - }, - "gMaxGravitas": { - name: "Ondes G-Max", - effect: "Une attaque de type Psy que seul un Astronelle Gigamax peut utiliser. Intensifie la gravité pendant cinq tours." - }, - "gMaxVolcalith": { - name: "Téphra G-Max", - effect: "Une attaque de type Roche que seul un Monthracite Gigamax peut utiliser. Pendant quatre tours, la cible continue de subir des dégâts." - }, - "gMaxSandblast": { - name: "Enlisement G-Max", - effect: "Une attaque de type Sol que seul un Dunaconda Gigamax peut utiliser. Emprisonne la cible dans une tempête de sable qui dure de quatre à cinq tours." - }, - "gMaxSnooze": { - name: "Torpeur G-Max", - effect: "Une attaque de type Ténèbres que seul un Angoliath Gigamax peut utiliser. Fait bâiller la cible qui s’endort au tour suivant." - }, - "gMaxTartness": { - name: "Corrosion G-Max", - effect: "Une attaque de type Plante que seul un Pomdrapi Gigamax peut utiliser. Réduit l’Esquive de la cible." - }, - "gMaxSweetness": { - name: "Nectar G-Max", - effect: "Une attaque de type Plante que seul un Dratatin Gigamax peut utiliser. Soigne les altérations de statut des alliés." - }, - "gMaxSmite": { - name: "Sentence G-Max", - effect: "Une attaque de type Fée que seul un Sorcilence Gigamax peut utiliser. Rend la cible confuse." - }, - "gMaxSteelsurge": { - name: "Percée G-Max", - effect: "Une attaque de type Acier que seul un Pachyradjah Gigamax peut utiliser. Disperse des pics aiguisés sur le terrain." - }, - "gMaxMeltdown": { - name: "Fonte G-Max", - effect: "Une attaque de type Acier que seul un Melmetal Gigamax peut utiliser. Empêche la cible d’utiliser la même capacité deux fois de suite." - }, - "gMaxFoamBurst": { - name: "Bulles G-Max", - effect: "Une attaque de type Eau que seul un Krabboss Gigamax peut utiliser. Réduit beaucoup la Vitesse de la cible." - }, - "gMaxCentiferno": { - name: "Combustion G-Max", - effect: "Une attaque de type Feu que seul un Scolocendre Gigamax peut utiliser. Emprisonne la cible dans un tourbillon de flammes qui dure de quatre à cinq tours." - }, - "gMaxVineLash": { - name: "Fouet G-Max", - effect: "Une attaque de type Plante que seul un Florizarre Gigamax peut utiliser. Inflige des dégâts à la cible pendant quatre tours." - }, - "gMaxCannonade": { - name: "Canonnade G-Max", - effect: "Une attaque de type Eau que seul un Tortank Gigamax peut utiliser. Inflige des dégâts à la cible pendant quatre tours." - }, - "gMaxDrumSolo": { - name: "Percussion G-Max", - effect: "Une attaque de type Plante que seul un Gorythmic Gigamax peut utiliser. Ignore le talent de la cible." - }, - "gMaxFireball": { - name: "Pyroball G-Max", - effect: "Une attaque de type Feu que seul un Pyrobut Gigamax peut utiliser. Ignore le talent de la cible." - }, - "gMaxHydrosnipe": { - name: "Gâchette G-Max", - effect: "Une attaque de type Eau que seul un Lézargus Gigamax peut utiliser. Ignore le talent de la cible." - }, - "gMaxOneBlow": { - name: "Coup Final G-Max", - effect: "Une attaque de type Ténèbres que seul un Shifours Gigamax peut utiliser. Cette frappe unique permet d’ignorer la capacité Gardomax." - }, - "gMaxRapidFlow": { - name: "Multicoup G-Max", - effect: "Une attaque de type Eau que seul un Shifours Gigamax peut utiliser. Cet enchaînement de coups permet d’ignorer la capacité Gardomax." - }, - "teraBlast": { - name: "Téra Explosion", - effect: "Si le lanceur est téracristallisé, il libère l’énergie de son type Téracristal. La capacité utilise l’Attaque ou l’Attaque Spéciale, selon ce qui infligera le plus de dégâts." - }, - "silkTrap": { - name: "Piège de Fil", - effect: "Le lanceur déploie un piège de fil pour se protéger contre les attaques, et si un assaillant utilise une attaque directe contre lui, la Vitesse de l’assaillant baisse." - }, - "axeKick": { - name: "Talon-Marteau", - effect: "Le lanceur donne un coup de talon descendant à la cible, ce qui peut aussi la rendre confuse. S’il échoue, le lanceur se blesse." - }, - "lastRespects": { - name: "Hommage Posthume", - effect: "Le lanceur attaque pour venger ses alliés. Plus le nombre de Pokémon alliés mis K.O. est élevé, plus la puissance de cette capacité augmente." - }, - "luminaCrash": { - name: "Lumino-Impact", - effect: "Le lanceur attaque en émettant une étrange lumière qui ébranle l’esprit de la cible. Cela baisse beaucoup la Défense Spéciale de la cible." - }, - "orderUp": { - name: "Plat du Jour", - effect: "Le lanceur attaque avec adresse et élégance. S’il a un Nigirigon dans la gueule, une de ses stats augmente en fonction de la forme de celui-ci." - }, - "jetPunch": { - name: "Poing Sonique", - effect: "Le lanceur enveloppe son poing d’un torrent furieux et attaque si rapidement qu’on peine à le discerner. Frappe en priorité." - }, - "spicyExtract": { - name: "Habanerage", - effect: "Le lanceur relâche un concentré extrêmement pimenté sur la cible, ce qui augmente beaucoup l’Attaque de celle-ci, mais baisse aussi beaucoup sa Défense." - }, - "spinOut": { - name: "Dérapage", - effect: "Le lanceur met tout son poids sur ses pattes et effectue de violentes rotations, ce qui inflige des dégâts à la cible, mais baisse beaucoup la Vitesse du lanceur." - }, - "populationBomb": { - name: "Prolifération", - effect: "Le lanceur et ses congénères prolifèrent en masse et attaquent ensemble d’une à dix fois d’affilée." - }, - "iceSpinner": { - name: "Cryo-Pirouette", - effect: "Le lanceur enveloppe ses jambes d’une fine couche de glace et heurte la cible en tournant sur lui-même. Ses rotations détruisent le champ actif sur le terrain." - }, - "glaiveRush": { - name: "Charge Glaive", - effect: "Le lanceur se jette dans une charge inconsciente sur la cible. Au tour suivant, l’attaque de la cible inflige le double de dégâts et n’échoue jamais." - }, - "revivalBlessing": { - name: "Second Souffle", - effect: "Dans un élan de compassion, le lanceur adresse une prière afin de ranimer un Pokémon de l’équipe K.O. en lui rendant la moitié de ses PV." - }, - "saltCure": { - name: "Salaison", - effect: "Le lanceur couvre la cible de sel, ce qui lui inflige des dégâts à chaque tour. Si la cible est de type Acier ou Eau, ces dégâts sont plus élevés." - }, - "tripleDive": { - name: "Triple Plongeon", - effect: "Le lanceur effectue des plongeons parfaitement cadencés pour éclabousser la cible et lui infliger des dégâts trois fois d’affilée." - }, - "mortalSpin": { - name: "Toupie Éclat", - effect: "Le lanceur attaque en tournant sur lui-même et empoisonne la cible. Il se libère également des effets de capacités comme Étreinte, Ligotage ou Vampigraine." - }, - "doodle": { - name: "Décalquage", - effect: "Le lanceur capture l’essence de la cible et la décalque. Le talent du lanceur et de ses alliés devient alors identique à celui de la cible." - }, - "filletAway": { - name: "Décharnement", - effect: "Le lanceur sacrifie des PV pour beaucoup augmenter son Attaque, son Attaque Spéciale, et sa Vitesse." - }, - "kowtowCleave": { - name: "Génusection", - effect: "Le lanceur se prosterne devant la cible et profite de cette distraction pour l’attaquer avec une lame. N’échoue jamais." - }, - "flowerTrick": { - name: "Magie Florale", - effect: "Le lanceur attaque en jetant un bouquet de fleurs piégé sur la cible. N’échoue jamais et inflige toujours un coup critique." - }, - "torchSong": { - name: "Chant Flamboyant", - effect: "Le lanceur carbonise la cible en projetant sur elle de vives flammes créées par un chant. Cette capacité augmente l’Attaque Spéciale du lanceur." - }, - "aquaStep": { - name: "Danse Aquatique", - effect: "Le lanceur se joue de la cible et lui inflige des dégâts avec ses pas de danse gracieux et légers. Cette capacité augmente la Vitesse du lanceur." - }, - "ragingBull": { - name: "Taurogne", - effect: "Le lanceur charge la cible comme un taureau enragé. Le type de cette capacité dépend de la race du lanceur, et brise les barrières comme Mur Lumière et Protection." - }, - "makeItRain": { - name: "Ruée d’Or", - effect: "Le lanceur attaque en lançant de nombreuses pièces, ce qui baisse son Attaque Spéciale. Permet d’obtenir plus d’argent à la fin du combat." - }, - "psyblade": { - name: "Lame Psychique", - effect: "Le lanceur lacère la cible à l’aide d’une lame intangible. S’il se trouve dans un champ électrifié, la puissance de cette capacité augmente de 50 %." - }, - "hydroSteam": { - name: "Hydrovapeur", - effect: "Le lanceur asperge la cible avec un puissant jet d’eau bouillante. Quand le soleil brille, la puissance de cette capacité augmente de 50 % au lieu de baisser." - }, - "ruination": { - name: "Cataclysme", - effect: "Le lanceur déclenche un cataclysme qui baisse les PV de la cible de moitié." - }, - "collisionCourse": { - name: "Nitro Crash", - effect: "Le lanceur change de forme et s’écrase sur la cible dans une explosion antique. Si la capacité est super efficace, elle inflige encore plus de dégâts que d’ordinaire." - }, - "electroDrift": { - name: "Turbo Volt", - effect: "Le lanceur change de forme et fonce sur la cible en la perforant d’électricité futuriste. Si la capacité est super efficace, sa puissance augmente encore plus." - }, - "shedTail": { - name: "Queulonage", - effect: "Le lanceur crée un clone en sacrifiant des PV, puis il revient et échange sa place avec un Pokémon de l’équipe prêt à combattre." - }, - "chillyReception": { - name: "Neigeux de Mots", - effect: "Le lanceur fait un si mauvais jeu de mots qu’il jette un froid et échange sa place avec un Pokémon de l’équipe prêt à combattre. La neige tombe pendant cinq tours." - }, - "tidyUp": { - name: "Grand Nettoyage", - effect: "Le lanceur fait le ménage sur le terrain, ce qui annule les effets de Picots, Piège de Roc, Toile Gluante, Pics Toxik, et Clonage. Augmente l’Attaque et la Vitesse du lanceur." - }, - "snowscape": { - name: "Chute de Neige", - effect: "Le lanceur invoque une tempête de neige qui dure cinq tours, ce qui augmente la Défense des Pokémon de type Glace." - }, - "pounce": { - name: "Bond", - effect: "Le lanceur attaque en bondissant sur la cible, ce qui baisse la Vitesse de celle-ci." - }, - "trailblaze": { - name: "Désherbaffe", - effect: "Le lanceur surgit des hautes herbes pour attaquer la cible. Les mouvements agiles du lanceur augmentent sa Vitesse." - }, - "chillingWater": { - name: "Douche Froide", - effect: "Le lanceur attaque la cible en l’arrosant d’une eau si froide qu’elle détériore son esprit combatif. Baisse l’Attaque de la cible." - }, - "hyperDrill": { - name: "Hyperceuse", - effect: "Le lanceur fait tourner à toute vitesse la partie pointue de son corps afin de transpercer la cible. Ignore même les capacités comme Abri ou Détection." - }, - "twinBeam": { - name: "Double Laser", - effect: "Le lanceur projette d’étranges rayons lumineux avec ses yeux et inflige des dégâts deux fois d’affilée." - }, - "rageFist": { - name: "Poing de Colère", - effect: "Le lanceur transforme sa colère en énergie pour attaquer. Plus il a subi d’attaques, plus la puissance de cette capacité augmente." - }, - "armorCannon": { - name: "Canon Blindé", - effect: "Le lanceur tire un boulet de canon ardent provenant de sa propre armure sur la cible. Cela baisse la Défense et la Défense Spéciale du lanceur." - }, - "bitterBlade": { - name: "Lame en Peine", - effect: "Le lanceur concentre son amertume du monde des vivants dans la pointe de ses épées et tranche la cible. La moitié des dégâts infligés sont convertis en PV pour le lanceur." - }, - "doubleShock": { - name: "Double Décharge", - effect: "Le lanceur libère toute l’électricité contenue dans son corps pour infliger des dégâts élevés à la cible. Le lanceur perd le type Électrik." - }, - "gigatonHammer": { - name: "Marteau Mastoc", - effect: "Le lanceur met tout son corps à contribution pour attaquer la cible avec un immense marteau. Cette capacité ne peut pas être utilisée deux fois d’affilée." - }, - "comeuppance": { - name: "Vindicte", - effect: "Le lanceur contre-attaque avec un coup infligeant des dégâts supérieurs à ceux de la dernière capacité qui l’a blessé." - }, - "aquaCutter": { - name: "Tranch’Aqua", - effect: "Le lanceur projette de l’eau pressurisée qui entaille la cible comme une lame. Taux de critiques élevé." - }, - "blazingTorque": { - name: "Crash Brûlant", - effect: "Crash Brûlant inflige des dégâts et possède 30 % de chances de brûler l’adversaire." - }, - "wickedTorque": { - name: "Crash Obscur", - effect: "Crash Obscur inflige des dégâts et possède 10 % de chances d’endormir l’adversaire." - }, - "noxiousTorque": { - name: "Crash Toxique", - effect: "Crash Toxique inflige des dégâts et possède 30 % de chances d’empoisonner l’adversaire." - }, - "combatTorque": { - name: "Crash Musclé", - effect: "Crash Musclé inflige des dégâts et possède 30 % de chances de paralyser l’adversaire." - }, - "magicalTorque": { - name: "Crash Magique", - effect: "Crash Magique inflige des dégâts et possède 30 % de chances de rendre l’adversaire confus." - }, - "bloodMoon": { - name: "Lune Rouge", - effect: "Le lanceur concentre toute son énergie dans la lune rouge sang sur son front et la projette sur la cible. Cette capacité ne peut pas être utilisée deux fois d’affilée." - }, - "matchaGotcha": { - name: "Mortier Matcha", - effect: "Le lanceur remue son thé et en bombarde la cible. La moitié des dégâts infligés sont convertis en PV pour le lanceur. Cette capacité peut aussi brûler la cible." - }, - "syrupBomb": { - name: "Bombe au Sirop", - effect: "Le lanceur jette une bombe qui recouvre la cible de sirop gluant et fait progressivement baisser la Vitesse de la cible pendant trois tours." - }, - "ivyCudgel": { - name: "Massue Liane", - effect: "Le lanceur frappe la cible à l’aide d’une massue entourée d’une liane. Le type de cette capacité varie en fonction du masque que porte le lanceur. Taux de critiques élevé." - }, - "electroShot": { - name: "Fulgurayon", - effect: "Le lanceur absorbe de l’électricité au premier tour, ce qui augmente son Attaque Spéciale, et envoie une puissante décharge au second. S’il pleut, il l’envoie au premier tour." - }, - "teraStarstorm": { - name: "Pluie Térastrale", - effect: "Le lanceur bombarde la cible afin de l’éliminer grâce au pouvoir des cristaux. Si le lanceur est Terapagos sous sa Forme Stellaire, la capacité touche tous les ennemis." - }, - "fickleBeam": { - name: "Laser Hasard", - effect: "Le lanceur attaque en tirant un rayon lumineux. Il arrive parfois que toutes les têtes agissent ensemble, ce qui double la puissance de la capacité." - }, - "burningBulwark": { - name: "Rempart Brûlant", - effect: "Le lanceur se protège contre les attaques grâce à son pelage incandescent, et si un assaillant utilise une attaque directe contre lui, il le brûle." - }, - "thunderclap": { - name: "Vif Éclair", - effect: "Permet au lanceur d’attaquer la cible en priorité avec une décharge électrique. Échoue si la cible ne prépare pas une attaque." - }, - "mightyCleave": { - name: "Lame Puissante", - effect: "Le lanceur pourfend la cible avec la lumière accumulée sur sa tête. Cette attaque passe outre les protections." - }, - "tachyonCutter": { - name: "Lame Tachyonique", - effect: "Le lanceur concentre des particules élémentaires pour créer une lame qui inflige des dégâts à la cible deux fois d’affilée. N’échoue jamais." - }, - "hardPress": { - name: "Pression Extrême", - effect: "Le lanceur écrase la cible avec ses bras ou ses pinces. Plus il reste de PV à la cible, plus la puissance de la capacité augmente." - }, - "dragonCheer": { - name: "Cri Draconique", - effect: "Le lanceur galvanise ses alliés avec un encouragement draconique qui augmente leur taux de critiques. L’effet est plus puissant si les alliés ont le type Dragon." - }, - "alluringVoice": { - name: "Voix Envoûtante", - effect: "Le lanceur attaque la cible avec sa voix angélique. Cette capacité rend la cible confuse si ses stats ont augmenté pendant ce tour." - }, - "temperFlare": { - name: "Indignition", - effect: "Le lanceur utilise la force de son dépit pour attaquer. S’il a utilisé une capacité qui a échoué au tour précédent, la puissance d’Indignition est doublée." - }, - "supercellSlam": { - name: "Volt Assaut", - effect: "Le lanceur se charge en électricité et fond sur la cible. S’il échoue, le lanceur se blesse." - }, - "psychicNoise": { - name: "Dissonance Psy", - effect: "Le lanceur attaque avec des ondes sonores dissonantes. Cela empêche la cible de récupérer des PV à l’aide de capacités, talents ou objets tenus pendant 2 tours." - }, - "upperHand": { - name: "Prio-Parade", - effect: "Le lanceur réagit instinctivement au moindre mouvement et donne un coup de paume qui apeure la cible. Échoue si cette dernière n’a pas utilisé une attaque prioritaire." - }, - "malignantChain": { - name: "Chaîne Malsaine", - effect: "Le lanceur ligote la cible avec une chaîne faite de poison et lui injecte un venin corrosif, ce qui peut aussi gravement l’empoisonner." - } -} as const; diff --git a/src/locales/fr/nature.ts b/src/locales/fr/nature.json similarity index 80% rename from src/locales/fr/nature.ts rename to src/locales/fr/nature.json index 6f2e3985d8f..95f2ef64142 100644 --- a/src/locales/fr/nature.ts +++ b/src/locales/fr/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "Hardi", "Lonely": "Solo", "Brave": "Brave", @@ -26,4 +24,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Malpoli", "Careful": "Prudent", "Quirky": "Bizarre" -} as const; +} \ No newline at end of file diff --git a/src/locales/fr/party-ui-handler.json b/src/locales/fr/party-ui-handler.json new file mode 100644 index 00000000000..6adba2c8309 --- /dev/null +++ b/src/locales/fr/party-ui-handler.json @@ -0,0 +1,47 @@ +{ + "SEND_OUT": "Envoyer", + "SUMMARY": "Résumé", + "CANCEL": "Annuler", + "RELEASE": "Relâcher", + "APPLY": "Appliquer", + "TEACH": "Apprendre", + "SPLICE": "Fusionner", + "UNSPLICE": "Séparer", + "ACTIVATE": "Activer", + "DEACTIVATE": "Désactiver", + "TRANSFER": "Transférer", + "ALL": "Tout", + "PASS_BATON": "Relais", + "UNPAUSE_EVOLUTION": "Réactiver Évolution", + "REVIVE": "Ranimer", + "RENAME": "Renommer", + "choosePokemon": "Sélectionnez un Pokémon.", + "doWhatWithThisPokemon": "Que faire avec ce Pokémon ?", + "noEnergy": "{{pokemonName}} n’a plus l’énergie\nde se battre !", + "hasEnergy": "{{pokemonName}} peut toujours\nse battre !", + "cantBeUsed": "{{pokemonName}} ne peut pas\nse battre pour ce challenge !", + "tooManyItems": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !", + "anyEffect": "Cela n’aura aucun effet.", + "unpausedEvolutions": "{{pokemonName}} peut de nouveau évoluer.", + "unspliceConfirmation": "Voulez-vous vraiment séparer {{fusionName}}\nde {{pokemonName}} ? {{fusionName}} sera perdu.", + "wasReverted": "{{fusionName}} est redevenu {{pokemonName}}.", + "releaseConfirmation": "Voulez-vous relâcher {{pokemonName}} ?", + "releaseInBattle": "Vous ne pouvez pas relâcher un Pokémon en combat !", + "selectAMove": "Sélectionnez une capacité.", + "changeQuantity": "Sélect. un objet à transférer.\nChangez la quantité avec < et >.", + "selectAnotherPokemonToSplice": "Sélectionnez un autre Pokémon à séparer.", + "cancel": "Sortir", + "able": "Apte", + "notAble": "Pas Apte", + "learned": "Appris", + "goodbye": "Au revoir, {{pokemonName}} !", + "byebye": "Bye-bye, {{pokemonName}} !", + "farewell": "Adieu, {{pokemonName}} !", + "soLong": "Salut, {{pokemonName}} !", + "thisIsWhereWePart": "C’est là qu’on se sépare, {{pokemonName}} !", + "illMissYou": "Tu vas me manquer, {{pokemonName}} !", + "illNeverForgetYou": "Je ne t’oublierai pas, {{pokemonName}} !", + "untilWeMeetAgain": "À la prochaine, {{pokemonName}} !", + "sayonara": "Sayonara, {{pokemonName}} !", + "smellYaLater": "À la revoyure, {{pokemonName}} !" +} \ No newline at end of file diff --git a/src/locales/fr/party-ui-handler.ts b/src/locales/fr/party-ui-handler.ts deleted file mode 100644 index 369f7b65bb9..00000000000 --- a/src/locales/fr/party-ui-handler.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "ALL": "Tout", - "SEND_OUT": "Envoyer", - "SUMMARY": "Résumé", - "CANCEL": "Annuler", - "RELEASE": "Relâcher", - "APPLY": "Appliquer", - "TEACH": "Apprendre" -} as const; diff --git a/src/locales/fr/pokeball.json b/src/locales/fr/pokeball.json new file mode 100644 index 00000000000..a2589141907 --- /dev/null +++ b/src/locales/fr/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "Poké Ball", + "greatBall": "Super Ball", + "ultraBall": "Hyper Ball", + "rogueBall": "Rogue Ball", + "masterBall": "Master Ball", + "luxuryBall": "Luxe Ball" +} \ No newline at end of file diff --git a/src/locales/fr/pokeball.ts b/src/locales/fr/pokeball.ts deleted file mode 100644 index 910002e41e1..00000000000 --- a/src/locales/fr/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Ball", - "greatBall": "Super Ball", - "ultraBall": "Hyper Ball", - "rogueBall": "Rogue Ball", - "masterBall": "Master Ball", - "luxuryBall": "Luxe Ball", -} as const; diff --git a/src/locales/fr/pokemon-form-battle.json b/src/locales/fr/pokemon-form-battle.json new file mode 100644 index 00000000000..b100622f03f --- /dev/null +++ b/src/locales/fr/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "Méga-{{pokemonName}}", + "mega-x": "Méga-{{pokemonName}} X", + "mega-y": "Méga-{{pokemonName}} Y", + "primal": "Primo-{{pokemonName}}", + "gigantamax": "{{pokemonName}} Gigamax", + "eternamax": "{{pokemonName}} Infinimax", + "megaChange": "{{preName}} méga-évolue\nen {{pokemonName}} !", + "gigantamaxChange": "{{preName}} se gigamaxe\nen {{pokemonName}} !", + "eternamaxChange": "{{preName}} devient\n{{pokemonName}} !", + "revertChange": "{{pokemonName}} retourne\nà sa forme initiale !", + "formChange": "{{preName}} change de forme !", + "disguiseChange": "Le déguisement absorbe l’attaque !" +} \ No newline at end of file diff --git a/src/locales/fr/pokemon-form.json b/src/locales/fr/pokemon-form.json new file mode 100644 index 00000000000..44f2bcecf2c --- /dev/null +++ b/src/locales/fr/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "Cosplayeur", + "pikachuCoolCosplay": "Cosplay Rockeur", + "pikachuBeautyCosplay": "Cosplay Lady", + "pikachuCuteCosplay": "Cosplay Star", + "pikachuSmartCosplay": "Cosplay Docteur", + "pikachuToughCosplay": "Cosplay Catcheur", + "pikachuPartner": "Partenaire", + "eeveePartner": "Partenaire", + "pichuSpiky": "Troizépi", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "Solaire", + "castformRainy": "Eau de Pluie", + "castformSnowy": "Blizzard", + "deoxysNormal": "Normal", + "burmyPlant": "Plante", + "burmySandy": "Sable", + "burmyTrash": "Déchet", + "shellosEast": "Orient", + "shellosWest": "Occident", + "rotomHeat": "Chaleur", + "rotomWash": "Lavage", + "rotomFrost": "Froid", + "rotomFan": "Hélice", + "rotomMow": "Tonte", + "giratinaAltered": "Alternatif", + "shayminLand": "Terrestre", + "basculinRedStriped": "Motif Rouge", + "basculinBlueStriped": "Motif Bleu", + "basculinWhiteStriped": "Motif Blanc", + "deerlingSpring": "Printemps", + "deerlingSummer": "Été", + "deerlingAutumn": "Automne", + "deerlingWinter": "Hiver", + "tornadusIncarnate": "Avatar", + "thundurusIncarnate": "Avatar", + "landorusIncarnate": "Avatar", + "keldeoOrdinary": "Normal", + "meloettaAria": "Chant", + "meloettaPirouette": "Danse", + "froakieBattleBond": "Synergie", + "scatterbugMeadow": "Floraison", + "scatterbugIcySnow": "Blizzard", + "scatterbugPolar": "Banquise", + "scatterbugTundra": "Glace", + "scatterbugContinental": "Continent", + "scatterbugGarden": "Verdure", + "scatterbugElegant": "Monarchie", + "scatterbugModern": "Métropole", + "scatterbugMarine": "Rivage", + "scatterbugArchipelago": "Archipel", + "scatterbugHighPlains": "Sécheresse", + "scatterbugSandstorm": "Sable", + "scatterbugRiver": "Delta", + "scatterbugMonsoon": "Cyclone", + "scatterbugSavanna": "Mangrove", + "scatterbugSun": "Zénith", + "scatterbugOcean": "Levant", + "scatterbugJungle": "Jungle", + "scatterbugFancy": "Fantaisie", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Rouge", + "flabebeYellow": "Jaune", + "flabebeOrange": "Orange", + "flabebeBlue": "Bleu", + "flabebeWhite": "Blanc", + "furfrouHeart": "Cœur", + "furfrouStar": "Étoile", + "furfrouDiamond": "Diamant", + "furfrouDebutante": "Demoiselle", + "furfrouMatron": "Madame", + "furfrouDandy": "Monsieur", + "furfrouLaReine": "Reine", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Pharaon", + "pumpkabooSmall": "Mini", + "pumpkabooLarge": "Maxi", + "pumpkabooSuper": "Ultra", + "xerneasNeutral": "Paisible", + "xerneasActive": "Déchaîné", + "zygarde50": "Forme 50%", + "zygarde10": "Forme 10%", + "zygarde50Pc": "Rassemblement Forme 50%", + "zygarde10Pc": "Rassemblement Forme 10%", + "zygardeComplete": "Parfait", + "oricorioBaile": "Flamenco", + "oricorioPompom": "Pom-Pom", + "oricorioPau": "Hula", + "oricorioSensu": "Buyō", + "rockruffOwnTempo": "Tempo Perso", + "miniorRedMeteor": "Météore Rouge", + "miniorOrangeMeteor": "Météore Orange", + "miniorYellowMeteor": "Météore Jaune", + "miniorGreenMeteor": "Météore Vert", + "miniorBlueMeteor": "Météore Bleu", + "miniorIndigoMeteor": "Météore Indigo", + "miniorVioletMeteor": "Météore Violet", + "miniorRed": "Rouge", + "miniorOrange": "Orange", + "miniorYellow": "Jaune", + "miniorGreen": "Vert", + "miniorBlue": "Bleu", + "miniorIndigo": "Indigo", + "miniorViolet": "Violet", + "mimikyuDisguised": "Déguisé", + "mimikyuBusted": "Démasqué", + "magearnaOriginal": "Couleur du Passé", + "marshadowZenith": "Zénith", + "sinisteaPhony": "Contrefaçon", + "sinisteaAntique": "Authentique", + "eiscueNoIce": "Tête Dégel", + "indeedeeMale": "Mâle", + "indeedeeFemale": "Femelle", + "morpekoFullBelly": "Rassasié", + "zacianHeroOfManyBattles": "Héros Aguerri", + "zamazentaHeroOfManyBattles": "Héros Aguerri", + "zarudeDada": "Papa", + "enamorusIncarnate": "Avatar", + "squawkabillyGreenPlumage": "Plumage Vert", + "squawkabillyBluePlumage": "Plumage Bleu", + "squawkabillyYellowPlumage": "Plumage Jaune", + "squawkabillyWhitePlumage": "Plumage Blanc", + "tatsugiriCurly": "Courbé", + "tatsugiriDroopy": "Affalé", + "tatsugiriStretchy": "Raide", + "gimmighoulChest": "Coffre", + "gimmighoulRoaming": "Marche", + "koraidonApexBuild": "Final", + "koraidonLimitedBuild": "Limité", + "koraidonSprintingBuild": "Course", + "koraidonSwimmingBuild": "Nage", + "koraidonGlidingBuild": "Vol", + "miraidonUltimateMode": "Ultime", + "miraidonLowPowerMode": "Bridé", + "miraidonDriveMode": "Terrestre", + "miraidonAquaticMode": "Aquatique", + "miraidonGlideMode": "Aérien", + "poltchageistCounterfeit": "Imitation", + "poltchageistArtisan": "Onéreux", + "paldeaTaurosCombat": "Combatif", + "paldeaTaurosBlaze": "Flamboyant", + "paldeaTaurosAqua": "Aquatique" +} \ No newline at end of file diff --git a/src/locales/fr/pokemon-info-container.json b/src/locales/fr/pokemon-info-container.json new file mode 100644 index 00000000000..084310f7c94 --- /dev/null +++ b/src/locales/fr/pokemon-info-container.json @@ -0,0 +1,7 @@ +{ + "moveset": "Capacités", + "gender": "Sexe :", + "ability": "Talent :", + "nature": "Nature :", + "form": "Forme :" +} diff --git a/src/locales/fr/pokemon-info-container.ts b/src/locales/fr/pokemon-info-container.ts deleted file mode 100644 index c61c23b0970..00000000000 --- a/src/locales/fr/pokemon-info-container.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Capacités", - "gender": "Sexe :", - "ability": "Talent :", - "nature": "Nature :", - "epic": "Épique", - "rare": "Rare", - "common": "Commun", - "form": "Forme :" -} as const; diff --git a/src/locales/fr/pokemon-info.ts b/src/locales/fr/pokemon-info.json similarity index 69% rename from src/locales/fr/pokemon-info.ts rename to src/locales/fr/pokemon-info.json index 641b372f3d3..a23b320ea3e 100644 --- a/src/locales/fr/pokemon-info.ts +++ b/src/locales/fr/pokemon-info.json @@ -1,24 +1,22 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { +{ + "Stat": { "HP": "PV", "HPshortened": "PV", "ATK": "Attaque", "ATKshortened": "Atq", "DEF": "Défense", "DEFshortened": "Déf", - "SPATK": "Atq. Spé.", + "SPATK": "Atq. Spé.", "SPATKshortened": "AtqSp", - "SPDEF": "Déf. Spé.", + "SPDEF": "Déf. Spé.", "SPDEFshortened": "DéfSp", "SPD": "Vitesse", "SPDshortened": "Vit", - "ACC": "Accuracy", - "EVA": "Evasiveness" + "ACC": "Précison", + "EVA": "Esquive", + "HPStat": "PV" }, - - Type: { + "Type": { "UNKNOWN": "Inconnu", "NORMAL": "Normal", "FIGHTING": "Combat", @@ -38,6 +36,6 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DRAGON": "Dragon", "DARK": "Ténèbres", "FAIRY": "Fée", - "STELLAR": "Stellaire", - }, -} as const; + "STELLAR": "Stellaire" + } +} diff --git a/src/locales/fr/pokemon-summary.json b/src/locales/fr/pokemon-summary.json new file mode 100644 index 00000000000..01e712c8468 --- /dev/null +++ b/src/locales/fr/pokemon-summary.json @@ -0,0 +1,44 @@ +{ + "pokemonInfo": "Info Pokémon", + "status": "Statut", + "powerAccuracyCategory": "Puissance\nPrécision\nCatégorie", + "type": "Type", + "unknownTrainer": "Inconnu", + "ot": "D.O.", + "nature": "de nature", + "expPoints": "Points Exp.", + "nextLv": "N. suivant", + "cancel": "Annuler", + "memoString": "{{natureFragment}} de nature,\n{{metFragment}}", + "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}}" + } +} diff --git a/src/locales/fr/pokemon.ts b/src/locales/fr/pokemon.json similarity index 99% rename from src/locales/fr/pokemon.ts rename to src/locales/fr/pokemon.json index d731fd148ad..3d6636c538a 100644 --- a/src/locales/fr/pokemon.ts +++ b/src/locales/fr/pokemon.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { +{ "bulbasaur": "Bulbizarre", "ivysaur": "Herbizarre", "venusaur": "Florizarre", @@ -1082,5 +1080,5 @@ export const pokemon: SimpleTranslationEntries = { "hisui_decidueye": "Archéduc", "paldea_tauros": "Tauros", "paldea_wooper": "Axoloto", - "bloodmoon_ursaluna": "Ursaking", -} as const; + "bloodmoon_ursaluna": "Ursaking" +} \ No newline at end of file diff --git a/src/locales/fr/run-history.json b/src/locales/fr/run-history.json new file mode 100644 index 00000000000..1def265acf1 --- /dev/null +++ b/src/locales/fr/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "Victoire !", + "defeatedWild": "Battu par ", + "defeatedTrainer": "Battu par ", + "defeatedTrainerDouble": "Battu par Duo", + "defeatedRival": "Battu par Rivale", + "defeated": "Vaincu", + "defeatedWild_female": "Battue par ", + "defeatedTrainer_female": "Battue par ", + "defeatedTrainerDouble_female": "Battue par Duo", + "defeatedRival_female": "Battue par Rival", + "defeated_female": "Vaincue", + "luck": "Chance ", + "score": "Score", + "mode": "Mode ", + "challengeRules": "Règles ", + "challengeMonoGen1": "1G", + "challengeMonoGen2": "2G", + "challengeMonoGen3": "3G", + "challengeMonoGen4": "4G", + "challengeMonoGen5": "5G", + "challengeMonoGen6": "6G", + "challengeMonoGen7": "7G", + "challengeMonoGen8": "8G", + "challengeMonoGen9": "9G", + "playerItems": "Objets Dresseur", + "personalBest": "Record personnel !", + "SPDshortened": "Vit.", + "runInfo": "Infos session", + "money": "Argent", + "runLength": "Durée session ", + "viewHeldItems": "Objets tenus", + "hallofFameText": "Bienvenue au Panthéon !", + "hallofFameText_female": "Bienvenue au Panthéon !", + "viewHallOfFame": "Voir le Panthéon", + "viewEndingSplash": "Voir l’illustration\nde fin" +} \ No newline at end of file diff --git a/src/locales/fr/save-slot-select-ui-handler.json b/src/locales/fr/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..4fe6b791a49 --- /dev/null +++ b/src/locales/fr/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "Effacer les données de l’emplacement sélectionné ?", + "loading": "Chargement…", + "wave": "Vague", + "lv": "N.", + "empty": "Vide" +} \ No newline at end of file diff --git a/src/locales/fr/save-slot-select-ui-handler.ts b/src/locales/fr/save-slot-select-ui-handler.ts deleted file mode 100644 index 64f6da7017c..00000000000 --- a/src/locales/fr/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Effacer les données de l’emplacement sélectionné ?", - "loading": "Chargement…", - "wave": "Vague", - "lv": "N.", - "empty": "Vide", -} as const; diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.json similarity index 82% rename from src/locales/fr/settings.ts rename to src/locales/fr/settings.json index cd85b0f8cb9..c752b336b6e 100644 --- a/src/locales/fr/settings.ts +++ b/src/locales/fr/settings.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { +{ "boy": "Garçon", "girl": "Fille", "general": "Général", @@ -15,6 +13,7 @@ export const settings: SimpleTranslationEntries = { "skipSeenDialogues": "Passer dialogues connus", "battleStyle": "Style de combat", "enableRetries": "Activer les réessais", + "hideIvs": "Masquer Scanner d’IV", "tutorials": "Tutoriels", "touchControls": "Contrôles tactiles", "vibrations": "Vibrations", @@ -36,7 +35,7 @@ export const settings: SimpleTranslationEntries = { "legacy": "Ancienne", "windowType": "Type de fenêtre", "moneyFormat": "Format de l’argent", - "damageNumbers": "Nombres de dégâts", + "damageNumbers": "Affichage dégâts", "simple": "Simple", "fancy": "Amélioré", "abbreviated": "Abrégé", @@ -48,10 +47,10 @@ export const settings: SimpleTranslationEntries = { "icon": "Icône", "animation": "Animation", "moveInfo": "Infos de capacité", - "showMovesetFlyout": "Afficher le volet de capacités", - "showArenaFlyout": "Afficher le volet d’arène", - "showTimeOfDayWidget": "Widget de l’heure", - "timeOfDayAnimation": "Animation de l’heure", + "showMovesetFlyout": "Afficher volet de capacités", + "showArenaFlyout": "Afficher volet d’arène", + "showTimeOfDayWidget": "Widget d’heure", + "timeOfDayAnimation": "Animation d’heure", "bounce": "Sauter", "timeOfDay_back": "Retour", "spriteSet": "Ensemble de sprites", @@ -62,7 +61,9 @@ export const settings: SimpleTranslationEntries = { "typeHints": "Indications de type", "masterVolume": "Vol. principal", "bgmVolume": "Vol. musique", + "fieldVolume": "Vol. combats", "seVolume": "Vol. effets", + "uiVolume": "Vol. menus", "musicPreference": "Préf. musicale", "mixed": "Mixte", "gamepadPleasePlug": "Veuillez brancher une manette ou appuyer sur un bouton.", @@ -95,5 +96,12 @@ export const settings: SimpleTranslationEntries = { "mute": "Muet", "controller": "Controller", "gamepadSupport": "Gamepad Support", - "showBgmBar": "Montrer titre de la musique", -} as const; + "showBgmBar": "Titre de la musique", + "moveTouchControls": "Déplacer les contrôles tactiles", + "shopOverlayOpacity": "Opacité boutique", + "shopCursorTarget": "Choix après relance", + "rewards": "Obj. gratuits", + "reroll": "Relance", + "shop": "Boutique", + "checkTeam": "Équipe" +} diff --git a/src/locales/fr/splash-messages.json b/src/locales/fr/splash-messages.json new file mode 100644 index 00000000000..9dd3e86fb32 --- /dev/null +++ b/src/locales/fr/splash-messages.json @@ -0,0 +1,36 @@ +{ + "battlesWon": "combats gagnés !", + "joinTheDiscord": "Rejoins le Discord !", + "infiniteLevels": "Niveaux infinis !", + "everythingStacks": "Tout se cumule !", + "optionalSaveScumming": "Optional Save Scumming !", + "biomes": "35 biomes !", + "openSource": "Open Source !", + "playWithSpeed": "Joue en vitesse x5 !", + "liveBugTesting": "Tests de bugs en direct !", + "heavyInfluence": "Grosse influence de RoR2 !", + "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !", + "nowWithMoreSalt": "Désormais avec 33% de sel en plus !", + "infiniteFusionAtHome": "Infinite Fusion, chez vous !", + "brokenEggMoves": "Des Capacités Œuf craquées !", + "magnificent": "Magnifique !", + "mubstitute": "Mubstitute !", + "thatsCrazy": "C’est une dinguerie !", + "oranceJuice": "Jus d’orange !", + "questionableBalancing": "Équilibrage douteux !", + "coolShaders": "Cool shaders !", + "aiFree": "Garanti sans IA !", + "suddenDifficultySpikes": "De soudains pics de difficultés !", + "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !", + "moreAddictiveThanIntended": "Plus addictif que prévu !", + "mostlyConsistentSeeds": "Des seeds à peu près stables !", + "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !", + "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !", + "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l’incident de l’Œuf de Manaphy !", + "alsoTryPokengine": "Essaye aussi Pokéngine !", + "alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!", + "alsoTryRadicalRed": "Essaye aussi Radical Red !", + "eeveeExpo": "Eevee Expo !", + "ynoproject": "YNOproject !", + "breedersInSpace": "Des Éleveurs dans l’espace !" +} diff --git a/src/locales/fr/splash-messages.ts b/src/locales/fr/splash-messages.ts deleted file mode 100644 index 13de7f28116..00000000000 --- a/src/locales/fr/splash-messages.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "combats gagnés !", - "joinTheDiscord": "Rejoins le Discord !", - "infiniteLevels": "Niveaux infinis !", - "everythingStacks": "Tout se cumule !", - "optionalSaveScumming": "Optional Save Scumming!", - "biomes": "35 biomes !", - "openSource": "Open Source !", - "playWithSpeed": "Joue en vitesse x5 !", - "liveBugTesting": "Tests de bugs en direct !", - "heavyInfluence": "Grosse influence de RoR2 !", - "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !", - "nowWithMoreSalt": "Désormais avec 33% de sel en plus !", - "infiniteFusionAtHome": "Infinite Fusion, chez vous !", - "brokenEggMoves": "Des Capacités Œuf craquées !", - "magnificent": "Magnifique !", - "mubstitute": "Mubstitute !", - "thatsCrazy": "C’est une dinguerie !", - "oranceJuice": "Jus d’orange !", - "questionableBalancing": "Équilibrage douteux !", - "coolShaders": "Cool shaders !", - "aiFree": "Garanti sans IA !", - "suddenDifficultySpikes": "De soudains pics de difficultés !", - "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !", - "moreAddictiveThanIntended": "Plus addictif que prévu !", - "mostlyConsistentSeeds": "Des seeds à peu près stables !", - "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !", - "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !", - "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l’incident de l’Œuf de Manaphy !", - "alsoTryPokengine": "Essaye aussi Pokéngine !", - "alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!", - "alsoTryRadicalRed": "Essaye aussi Radical Red !", - "eeveeExpo": "Eevee Expo !", - "ynoproject": "YNOproject !", -} as const; diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.json similarity index 57% rename from src/locales/fr/starter-select-ui-handler.ts rename to src/locales/fr/starter-select-ui-handler.json index 84fb56c9ccc..518329607bb 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.json @@ -1,12 +1,7 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"Commencer avec ces Pokémon ?", +{ + "confirmStartTeam": "Commencer avec ces Pokémon ?", + "confirmExit": "Êtes-vous sûr·e de vouloir quitter ?", + "invalidParty": "Cette équipe de départ est invalide !", "gen1": "1G", "gen2": "2G", "gen3": "3G", @@ -22,25 +17,29 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Nature :", "eggMoves": "Capacités Œuf", "addToParty": "Ajouter à l’équipe", + "removeFromParty": "Retirer de l’équipe", "toggleIVs": "Voir les IV", "manageMoves": "Modifier les Capacités", "manageNature": "Modifier la Nature", + "addToFavorites": "Ajouter aux Favoris", + "removeFromFavorites": "Retirer des Favoris", "useCandies": "Utiliser des Bonbons", "selectNature": "Sélectionnez une nature.", "selectMoveSwapOut": "Sélectionnez la capacité à échanger.", "selectMoveSwapWith": "Sélectionnez laquelle échanger avec", "unlockPassive": "Débloquer Passif", "reduceCost": "Diminuer le cout", - "sameSpeciesEgg": "Buy an Egg", - "cycleShiny": ": » Chromatiques", - "cycleForm": ": » Formes", - "cycleGender": ": » Sexes", - "cycleAbility": ": » Talents", - "cycleNature": ": » Natures", - "cycleVariant": ": » Variants", + "sameSpeciesEgg": "Acheter un Œuf", + "cycleShiny": ": Chromatique", + "cycleForm": ": Forme", + "cycleGender": ": Sexe", + "cycleAbility": ": Talent", + "cycleNature": ": Nature", + "cycleVariant": ": Variant", + "goFilter": ": Aller aux filtres", "enablePassive": "Activer Passif", "disablePassive": "Désactiver Passif", "locked": "Verrouillé", "disabled": "Désactivé", "uncaught": "Non-capturé" -}; +} \ No newline at end of file diff --git a/src/locales/fr/status-effect.json b/src/locales/fr/status-effect.json new file mode 100644 index 00000000000..bfb7121f522 --- /dev/null +++ b/src/locales/fr/status-effect.json @@ -0,0 +1,65 @@ +{ + "none": { + "name": "Aucun", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + }, + "poison": { + "name": "Empoisonnement", + "description": "empoisonné", + "obtain": "{{pokemonNameWithAffix}} est\nempoisonné !", + "obtainSource": "{{pokemonNameWithAffix}} est\nempoisonné par {{sourceText}} !", + "activation": "{{pokemonNameWithAffix}}\nsouffre du poison !", + "overlap": "{{pokemonNameWithAffix}} est\ndéjà empoisonné.", + "heal": "{{pokemonNameWithAffix}} n’est\nplus empoisonné !" + }, + "toxic": { + "name": "Empoisonnement grave", + "description": "gravement empoisonné", + "obtain": "{{pokemonNameWithAffix}} est\ngravement empoisonné !", + "obtainSource": "{{pokemonNameWithAffix}} est\ngravement empoisonné par {{sourceText}} !", + "activation": "{{pokemonNameWithAffix}}\nsouffre du poison !", + "overlap": "{{pokemonNameWithAffix}} est\ndéjà empoisonné.", + "heal": "{{pokemonNameWithAffix}} n’est\nplus empoisonné !" + }, + "paralysis": { + "name": "Paralysie", + "description": "paralysé", + "obtain": "{{pokemonNameWithAffix}} est paralysé !\nIl aura du mal à attaquer !", + "obtainSource": "{{pokemonNameWithAffix}} est paralysé\npar {{sourceText}} ! Il aura du mal à attaquer !", + "activation": "{{pokemonNameWithAffix}} est paralysé !\nIl n’a pas pu attaquer !", + "overlap": "{{pokemonNameWithAffix}} est\ndéjà paralysé.", + "heal": "{{pokemonNameWithAffix}} n’est\nplus paralysé !" + }, + "sleep": { + "name": "Sommeil", + "description": "endormi", + "obtain": "{{pokemonNameWithAffix}}\ns’est endormi !", + "obtainSource": "{{pokemonNameWithAffix}} est\nendormi par {{sourceText}} !", + "activation": "{{pokemonNameWithAffix}}\ndort profondément.", + "overlap": "{{pokemonNameWithAffix}}\ndort déjà.", + "heal": "{{pokemonNameWithAffix}}\nse réveille !" + }, + "freeze": { + "name": "Gelé", + "description": "gelé", + "obtain": "{{pokemonNameWithAffix}} est\ngelé !", + "obtainSource": "{{pokemonNameWithAffix}} est\ngelé par {{sourceText}} !", + "activation": "{{pokemonNameWithAffix}} est gelé !\nIl ne peut plus attaquer !", + "overlap": "{{pokemonNameWithAffix}} est\ndéjà gelé.", + "heal": "{{pokemonNameWithAffix}} n’est\nplus gelé !" + }, + "burn": { + "name": "Brulure", + "description": "brulé", + "obtain": "{{pokemonNameWithAffix}} est\nbrulé !", + "obtainSource": "{{pokemonNameWithAffix}} est\nbrulé par {{sourceText}} !", + "activation": "{{pokemonNameWithAffix}}\nsouffre de sa brulure !", + "overlap": "{{pokemonNameWithAffix}} est\ndéjà brulé.", + "heal": "{{pokemonNameWithAffix}} n’est\nplus brulé !" + } +} diff --git a/src/locales/fr/status-effect.ts b/src/locales/fr/status-effect.ts deleted file mode 100644 index f4f210406c6..00000000000 --- a/src/locales/fr/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "Aucun", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "Empoisonnement", - description: "empoisonné", - obtain: "{{pokemonNameWithAffix}} est\nempoisonné !", - obtainSource: "{{pokemonNameWithAffix}} est\nempoisonné par {{sourceText}} !", - activation: "{{pokemonNameWithAffix}}\nsouffre du poison !", - overlap: "{{pokemonNameWithAffix}} est\ndéjà empoisonné.", - heal: "{{pokemonNameWithAffix}} n’est\nplus empoisonné !" - }, - toxic: { - name: "Empoisonnement grave", - description: "gravement empoisonné", - obtain: "{{pokemonNameWithAffix}} est\ngravement empoisonné !", - obtainSource: "{{pokemonNameWithAffix}} est\ngravement empoisonné par {{sourceText}} !", - activation: "{{pokemonNameWithAffix}}\nsouffre du poison !", - overlap: "{{pokemonNameWithAffix}} est\ndéjà empoisonné.", - heal: "{{pokemonNameWithAffix}} n’est\nplus empoisonné !" - }, - paralysis: { - name: "Paralysie", - description: "paralysé", - obtain: "{{pokemonNameWithAffix}} est paralysé !\nIl aura du mal à attaquer !", - obtainSource: "{{pokemonNameWithAffix}} est paralysé\npar {{sourceText}} ! Il aura du mal à attaquer !", - activation: "{{pokemonNameWithAffix}} est paralysé !\nIl n’a pas pu attaquer !", - overlap: "{{pokemonNameWithAffix}} est\ndéjà paralysé.", - heal: "{{pokemonNameWithAffix}} n’est\nplus paralysé !" - }, - sleep: { - name: "Sommeil", - description: "endormi", - obtain: "{{pokemonNameWithAffix}}\ns’est endormi !", - obtainSource: "{{pokemonNameWithAffix}} est\nendormi par {{sourceText}} !", - activation: "{{pokemonNameWithAffix}}\ndort profondément.", - overlap: "{{pokemonNameWithAffix}}\ndort déjà.", - heal: "{{pokemonNameWithAffix}}\nse réveille !" - }, - freeze: { - name: "Gelé", - description: "gelé", - obtain: "{{pokemonNameWithAffix}} est\ngelé !", - obtainSource: "{{pokemonNameWithAffix}} est\ngelé par {{sourceText}} !", - activation: "{{pokemonNameWithAffix}}est gelé !\nIl ne peut plus attaquer !", - overlap: "{{pokemonNameWithAffix}} est\ndéjà gelé.", - heal: "{{pokemonNameWithAffix}} n’est\nplus gelé !" - }, - burn: { - name: "Brulure", - description: "brulé", - obtain: "{{pokemonNameWithAffix}} est\nbrulé !", - obtainSource: "{{pokemonNameWithAffix}} est\nbrulé par {{sourceText}} !", - activation: "{{pokemonNameWithAffix}}\nsouffre de sa brulure !", - overlap: "{{pokemonNameWithAffix}} est\ndéjà brulé.", - heal: "{{pokemonNameWithAffix}} n’est\nplus brulé !" - }, -} as const; diff --git a/src/locales/fr/terrain.json b/src/locales/fr/terrain.json new file mode 100644 index 00000000000..217db57075c --- /dev/null +++ b/src/locales/fr/terrain.json @@ -0,0 +1,16 @@ +{ + "misty": "Brumeux", + "mistyStartMessage": "La brume recouvre le terrain !", + "mistyClearMessage": "La brume qui recouvrait le terrain se dissipe…", + "mistyBlockMessage": "La brume enveloppe {{pokemonNameWithAffix}} !", + "electric": "Électrifié", + "electricStartMessage": "De l’électricité parcourt le terrain !", + "electricClearMessage": "L’électricité parcourant le terrain s’est dissipée…", + "grassy": "Herbu", + "grassyStartMessage": "Un beau gazon pousse sur le terrain !", + "grassyClearMessage": "Le gazon disparait…", + "psychic": "Psychique", + "psychicStartMessage": "Le sol se met à réagir de façon bizarre…", + "psychicClearMessage": "Le sol redevient normal !", + "defaultBlockMessage": "{{pokemonNameWithAffix}} est protégé\npar le Champ {{terrainName}} !" +} \ No newline at end of file diff --git a/src/locales/fr/trainer-classes.json b/src/locales/fr/trainer-classes.json new file mode 100644 index 00000000000..b7027cf544f --- /dev/null +++ b/src/locales/fr/trainer-classes.json @@ -0,0 +1,130 @@ +{ + "ace_trainer": "Topdresseur", + "ace_trainer_female": "Topdresseuse", + "ace_duo": "Topdresseurs", + "artist": "Artiste", + "artist_female": "Artiste", + "backers": "Pompom Girls", + "backpacker": "Randonneur", + "backpacker_female": "Randonneuse", + "backpackers": "Randonneurs", + "baker": "Boulangère", + "battle_girl": "Combattante", + "beauty": "Canon", + "beginners": "Débutants", + "biker": "Motard", + "black_belt": "Karatéka", + "breeder": "Éleveur", + "breeder_female": "Éleveuse", + "breeders": "Éleveurs", + "clerk": "Employé", + "clerk_female": "Employée", + "colleagues": "Collègues de Bureau", + "crush_kin": "Duo Baston", + "cyclist": "Cycliste", + "cyclist_female": "Cycliste", + "cyclists": "Cyclistes", + "dancer": "Danseur", + "dancer_female": "Danseuse", + "depot_agent": "Cheminot", + "doctor": "Docteur", + "doctor_female": "Docteure", + "firebreather": "Crache-Feu", + "fisherman": "Pêcheur", + "fisherman_female": "Pêcheuse", + "gentleman": "Gentleman", + "guitarist": "Guitariste", + "guitarist_female": "Guitariste", + "harlequin": "Clown", + "hiker": "Montagnard", + "hooligans": "Loubards", + "hoopster": "Basketteur", + "infielder": "Baseballeur", + "janitor": "Nettoyeur", + "lady": "Mademoiselle", + "lass": "Fillette", + "linebacker": "Quaterback", + "maid": "Gouvernante", + "madame": "Mondaine", + "medical_team": "Médecins", + "musician": "Musicien", + "hex_maniac": "Mystimaniac", + "nurse": "Infirmière", + "nursery_aide": "Institutrice", + "officer": "Policier", + "parasol_lady": "Sœur Parasol", + "pilot": "Pilote", + "pokéfan": "Poké Fan", + "pokéfan_female": "Poké Fan", + "pokéfan_family": "Couple de Pokéfans", + "preschooler": "Petit", + "preschooler_female": "Petite", + "preschoolers": "Petits", + "psychic": "Kinésiste", + "psychic_female": "Kinésiste", + "psychics": "Kinésistes", + "pokémon_ranger": "Pokémon Ranger", + "pokémon_ranger_female": "Pokémon Ranger", + "pokémon_rangers": "Pokémon Rangers", + "ranger": "Ranger", + "restaurant_staff": "Serveurs", + "rich": "Gentleman", + "rich_female": "Mondaine", + "rich_boy": "Gentleman", + "rich_couple": "Couple de Bourgeois", + "rich_kid": "Richard", + "rich_kid_female": "Mademoiselle", + "rich_kids": "Richards", + "roughneck": "Loubard", + "sailor": "Marin", + "scientist": "Scientifique", + "scientist_female": "Scientifique", + "scientists": "Scientifiques", + "smasher": "Tenniswoman", + "snow_worker": "Ouvrier Alpin", + "snow_worker_female": "Ouvrière Alpine", + "striker": "Footballeur", + "school_kid": "Élève", + "school_kid_female": "Élève", + "school_kids": "Élèves", + "swimmer": "Nageur", + "swimmer_female": "Nageuse", + "swimmers": "Nageurs", + "twins": "Jumelles", + "veteran": "Vénérable", + "veteran_female": "Vénérable", + "veteran_duo": "Vénérables", + "waiter": "Serveur", + "waitress": "Serveuse", + "worker": "Ouvrier", + "worker_female": "Ouvrière", + "workers": "Ouvriers", + "youngster": "Gamin", + "rocket_grunt": "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", + "aqua_grunt": "Sbire de la Team Aqua", + "aqua_grunt_female": "Sbire de la Team Aqua", + "aqua_grunts": "Sbires de la Team Aqua", + "galactic_grunt": "Sbire de la Team Galaxie", + "galactic_grunt_female": "Sbire de la Team Galaxie", + "galactic_grunts": "Sbires de la Team Galaxie", + "plasma_grunt": "Sbire de la Team Plasma", + "plasma_grunt_female": "Sbire de la Team Plasma", + "plasma_grunts": "Sbires de la Team Plasma", + "flare_grunt": "Sbire de la Team Flare", + "flare_grunt_female": "Sbire de la Team Flare", + "flare_grunts": "Sbires de la Team Flare", + "aether_grunt": "Employé de la Fondation Æther", + "aether_grunt_female": "Employée de la Fondation Æther", + "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/fr/trainer-names.json b/src/locales/fr/trainer-names.json new file mode 100644 index 00000000000..5864976cc34 --- /dev/null +++ b/src/locales/fr/trainer-names.json @@ -0,0 +1,164 @@ +{ + "brock": "Pierre", + "misty": "Ondine", + "lt_surge": "Major Bob", + "erika": "Erika", + "janine": "Jeannine", + "sabrina": "Morgane", + "blaine": "Auguste", + "giovanni": "Giovanni", + "falkner": "Albert", + "bugsy": "Hector", + "whitney": "Blanche", + "morty": "Mortimer", + "chuck": "Chuck", + "jasmine": "Jasmine", + "pryce": "Frédo", + "clair": "Sandra", + "roxanne": "Roxanne", + "brawly": "Bastien", + "wattson": "Voltère", + "flannery": "Adriane", + "norman": "Norman", + "winona": "Alizée", + "tate": "Lévy", + "liza": "Tatia", + "juan": "Juan", + "roark": "Pierrick", + "gardenia": "Flo", + "maylene": "Mélina", + "crasher_wake": "Lovis", + "fantina": "Kiméra", + "byron": "Charles", + "candice": "Gladys", + "volkner": "Tanguy", + "cilan": "Rachid", + "chili": "Armando", + "cress": "Noa", + "cheren": "Tcheren", + "lenora": "Aloé", + "roxie": "Strykna", + "burgh": "Artie", + "elesa": "Inezia", + "clay": "Bardane", + "skyla": "Carolina", + "brycen": "Zhu", + "drayden": "Watson", + "marlon": "Amana", + "viola": "Violette", + "grant": "Lino", + "korrina": "Cornélia", + "ramos": "Amaro", + "clemont": "Lem", + "valerie": "Valériane", + "olympia": "Astera", + "wulfric": "Urup", + "milo": "Percy", + "nessa": "Donna", + "kabu": "Kabu", + "bea": "Faïza", + "allister": "Alistair", + "opal": "Sally", + "bede": "Travis", + "gordie": "Chaz", + "melony": "Lona", + "piers": "Peterson", + "marnie": "Rosemary", + "raihan": "Roy", + "katy": "Éra", + "brassius": "Colza", + "iono": "Mashynn", + "kofu": "Kombu", + "larry": "Okuba", + "ryme": "Laïm", + "tulip": "Tully", + "grusha": "Grusha", + "lorelei": "Olga", + "bruno": "Aldo", + "agatha": "Agatha", + "lance": "Peter", + "will": "Clément", + "koga": "Koga", + "karen": "Marion", + "sidney": "Damien", + "phoebe": "Spectra", + "glacia": "Glacia", + "drake": "Aragon", + "aaron": "Aaron", + "bertha": "Terry", + "flint": "Adrien", + "lucian": "Lucio", + "shauntal": "Anis", + "marshal": "Kunz", + "grimsley": "Pieris", + "caitlin": "Percila", + "malva": "Malva", + "siebold": "Narcisse", + "wikstrom": "Tileo", + "drasna": "Dracéna", + "hala": "Pectorius", + "molayne": "Molène", + "olivia": "Alyxia", + "acerola": "Margie", + "kahili": "Kahili", + "rika": "Cayenn", + "poppy": "Popi", + "hassel": "Hassa", + "crispin": "Rubépin", + "amarys": "Nérine", + "lacey": "Taro", + "drayton": "Irido", + "blue": "Blue", + "red": "Red", + "steven": "Pierre Rochard", + "wallace": "Marc", + "cynthia": "Cynthia", + "alder": "Goyah", + "iris": "Iris", + "diantha": "Dianthéa", + "hau": "Tili", + "geeta": "Alisma", + "nemona": "Menzi", + "kieran": "Kass", + "leon": "Tarak", + "rival": "Gwenaël", + "rival_female": "Papina", + "archer": "Amos", + "ariana": "Ariane", + "proton": "Lance", + "petrel": "Lambda", + "tabitha": "Kelvin", + "courtney": "Courtney", + "shelly": "Sarah", + "matt": "Matthieu", + "mars": "Mars", + "jupiter": "Jupiter", + "saturn": "Saturne", + "zinzolin": "Lilien", + "rood": "Carmine", + "xerosic": "Xanthin", + "bryony": "Brasénie", + "faba": "Saubohne", + "plumeria": "Apocyne", + "oleana": "Liv", + + "maxie": "Max", + "archie": "Arthur", + "cyrus": "Hélio", + "ghetsis": "Ghetis", + "lysandre": "Lysandre", + "lusamine": "Elsa-Mina", + "guzma": "Guzma", + "rose": "Shehroz", + + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Lévy & Tatia", + "liza_tate_double": "Tatia & Lévy", + "steven_wallace_double": "Pierre R. & Marc", + "wallace_steven_double": "Marc & Pierre R.", + "alder_iris_double": "Goyah & Iris", + "iris_alder_double": "Iris & Goyah", + "marnie_piers_double": "Rosemary & Peterson", + "piers_marnie_double": "Peterson & Rosemary" +} diff --git a/src/locales/fr/trainer-titles.json b/src/locales/fr/trainer-titles.json new file mode 100644 index 00000000000..6d966bbd9ec --- /dev/null +++ b/src/locales/fr/trainer-titles.json @@ -0,0 +1,38 @@ +{ + "elite_four": "Conseil 4", + "elite_four_female": "Conseil 4", + "gym_leader": "Champion d’Arène", + "gym_leader_female": "Championne d’Arène", + "gym_leader_double": "Duo de Champions", + "champion": "Maitre", + "champion_female": "Maitresse", + "champion_double": "Duo de Maitres", + "rival": "Rival·e", + "professor": "Professeur·e", + "frontier_brain": "Meneur·euse de Zone", + "rocket_boss": "Leader de la Team Rocket", + "magma_boss": "Leader de la Team Magma", + "aqua_boss": "Leader de la Team Aqua", + "galactic_boss": "Leader de la Team Galaxie", + "plasma_boss": "Leader de la Team Plasma", + "flare_boss": "Leader de la Team Flare", + "aether_boss": "Présidente d’Æther", + "skull_boss": "Boss de la Team Skull", + "macro_boss": "Président de Macro Cosmos", + + "rocket_admin": "Admin Team Rocket", + "rocket_admin_female": "Admin Team Rocket", + "magma_admin": "Admin Team Magma", + "magma_admin_female": "Admin Team Magma", + "aqua_admin": "Admin Team Aqua", + "aqua_admin_female": "Admin Team Aqua", + "galactic_commander": "Admin Team Galaxie", + "galactic_commander_female": "Admin Team Galaxie", + "plasma_sage": "Sage Plasma", + "plasma_admin": "Admin Team Plasma", + "flare_admin": "Manager de la Team Flare", + "flare_admin_female": "Manageuse de la Team Flare", + "aether_admin": "Directeur d’Æther", + "skull_admin": "Admin Team Skull", + "macro_admin": "Macro Cosmos" +} diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts deleted file mode 100644 index fc0639d47b9..00000000000 --- a/src/locales/fr/trainers.ts +++ /dev/null @@ -1,281 +0,0 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "elite_four": "Conseil 4", - "elite_four_female": "Conseil 4", - "gym_leader": "Champion d’Arène", - "gym_leader_female": "Championne d’Arène", - "gym_leader_double": "Duo de Champions", - "champion": "Maitre", - "champion_female": "Maitresse", - "champion_double": "Duo de Maitres", - "rival": "Rival·e", //Written in gender-inclusive language in wait of a potential split of the entry - "professor": "Professeur·e", //Written in gender-inclusive language in wait of a potential split of the entry - "frontier_brain": "Meneur·euse de Zone", //Written in gender-inclusive language in wait of a potential split of the entry - "rocket_boss": "Leader de la Team Rocket", - "magma_boss": "Leader de la Team Magma", - "aqua_boss": "Leader de la Team Aqua", - "galactic_boss": "Leader de la Team Galaxie", - "plasma_boss": "Leader de la Team Plasma", - "flare_boss": "Leader de la Team Flare", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Topdresseur", - "ace_trainer_female": "Topdresseuse", - "ace_duo": "Topdresseurs", - "artist": "Artiste", - "artist_female": "Artiste", - "backers": "Pompom Girls", - "backpacker": "Randonneur", - "backpacker_female": "Randonneuse", - "backpackers": "Randonneurs", - "baker": "Boulangère", - "battle_girl": "Combattante", - "beauty": "Canon", - "beginners": "Beginners", - "biker": "Motard", - "black_belt": "Karatéka", - "breeder": "Éleveur", - "breeder_female": "Éleveuse", - "breeders": "Éleveurs", - "clerk": "Employé", - "clerk_female": "Employée", - "colleagues": "Collègues de Bureau", - "crush_kin": "Duo Baston", - "cyclist": "Cycliste", - "cyclist_female": "Cycliste", - "cyclists": "Cyclistes", - "dancer": "Danseur", - "dancer_female": "Danseuse", - "depot_agent": "Cheminot", - "doctor": "Docteur", - "doctor_female": "Docteure", - "firebreather": "Firebreather", - "fisherman": "Pêcheur", - "fisherman_female": "Pêcheuse", - "gentleman": "Gentleman", - "guitarist": "Guitariste", - "guitarist_female": "Guitariste", - "harlequin": "Clown", - "hiker": "Montagnard", - "hooligans": "Loubards", - "hoopster": "Basketteur", - "infielder": "Baseballeur", - "janitor": "Nettoyeur", - "lady": "Mademoiselle", - "lass": "Fillette", - "linebacker": "Quaterback", - "maid": "Gouvernante", - "madame": "Mondaine", - "medical_team": "Médecins", - "musician": "Musicien", - "hex_maniac": "Mystimaniac", - "nurse": "Infirmière", - "nursery_aide": "Institutrice", - "officer": "Policier", - "parasol_lady": "Sœur Parasol", - "pilot": "Pilote", - "pokéfan": "Poké Fan", - "pokéfan_female": "Poké Fan", - "pokéfan_family": "Couple de Pokéfans", - "preschooler": "Petit", - "preschooler_female": "Petite", - "preschoolers": "Petits", - "psychic": "Kinésiste", - "psychic_female": "Kinésiste", - "psychics": "Kinésistes", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_ranger_female": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Rangers", - "ranger": "Ranger", - "restaurant_staff": "Serveurs", - "rich": "Rich", - "rich_female": "Mondaine", - "rich_boy": "Gentleman", - "rich_couple": "Couple de Bourgeois", - "rich_kid": "Richard", - "rich_kid_female": "Mademoiselle", - "rich_kids": "Richards", - "roughneck": "Loubard", - "sailor": "Marin", - "scientist": "Scientifique", - "scientist_female": "Scientifique", - "scientists": "Scientifiques", - "smasher": "Tenniswoman", - "snow_worker": "Ouvrier Alpin", - "snow_worker_female": "Ouvrière Alpine", - "striker": "Footballeur", - "school_kid": "Élève", - "school_kid_female": "Élève", - "school_kids": "Élèves", - "swimmer": "Nageur", - "swimmer_female": "Nageuse", - "swimmers": "Nageurs", - "twins": "Jumelles", - "veteran": "Vénérable", - "veteran_female": "Vénérable", - "veteran_duo": "Vénérables", - "waiter": "Serveur", - "waitress": "Serveuse", - "worker": "Ouvrier", - "worker_female": "Ouvrière", - "workers": "Ouvriers", - "youngster": "Gamin", - "rocket_grunt": "Sbire de la Team Rocket", - "rocket_grunt_female": "Sbire de la Team Rocket", - "magma_grunt": "Sbire de la Team Magma", - "magma_grunt_female": "Sbire de la Team Magma", - "aqua_grunt": "Sbire de la Team Aqua", - "aqua_grunt_female": "Sbire de la Team Aqua", - "galactic_grunt": "Sbire de la Team Galaxie", - "galactic_grunt_female": "Sbire Team Galaxie", - "plasma_grunt": "Sbire de la Team Plasma", - "plasma_grunt_female": "Sbire de la Team Plasma", - "flare_grunt": "Sbire de la Team Flare", - "flare_grunt_female": "Sbire de la Team Flare", -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - "brock": "Pierre", - "misty": "Ondine", - "lt_surge": "Major Bob", - "erika": "Erika", - "janine": "Jeannine", - "sabrina": "Morgane", - "blaine": "Auguste", - "giovanni": "Giovanni", - "falkner": "Albert", - "bugsy": "Hector", - "whitney": "Blanche", - "morty": "Mortimer", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Frédo", - "clair": "Sandra", - "roxanne": "Roxanne", - "brawly": "Bastien", - "wattson": "Voltère", - "flannery": "Adriane", - "norman": "Norman", - "winona": "Alizée", - "tate": "Lévy", - "liza": "Tatia", - "juan": "Juan", - "roark": "Pierrick", - "gardenia": "Flo", - "maylene": "Mélina", - "crasher_wake": "Lovis", - "fantina": "Kiméra", - "byron": "Charles", - "candice": "Gladys", - "volkner": "Tanguy", - "cilan": "Rachid", - "chili": "Armando", - "cress": "Noa", - "cheren": "Tcheren", - "lenora": "Aloé", - "roxie": "Strykna", - "burgh": "Artie", - "elesa": "Inezia", - "clay": "Bardane", - "skyla": "Carolina", - "brycen": "Zhu", - "drayden": "Watson", - "marlon": "Amana", - "viola": "Violette", - "grant": "Lino", - "korrina": "Cornélia", - "ramos": "Amaro", - "clemont": "Lem", - "valerie": "Valériane", - "olympia": "Astera", - "wulfric": "Urup", - "milo": "Percy", - "nessa": "Donna", - "kabu": "Kabu", - "bea": "Faïza", - "allister": "Alistair", - "opal": "Sally", - "bede": "Travis", - "gordie": "Chaz", - "melony": "Lona", - "piers": "Peterson", - "marnie": "Rosemary", - "raihan": "Roy", - "katy": "Éra", - "brassius": "Colza", - "iono": "Mashynn", - "kofu": "Kombu", - "larry": "Okuba", - "ryme": "Laïm", - "tulip": "Tully", - "grusha": "Grusha", - "lorelei": "Olga", - "bruno": "Aldo", - "agatha": "Agatha", - "lance": "Peter", - "will": "Clément", - "koga": "Koga", - "karen": "Marion", - "sidney": "Damien", - "phoebe": "Spectra", - "glacia": "Glacia", - "drake": "Aragon", - "aaron": "Aaron", - "bertha": "Terry", - "flint": "Adrien", - "lucian": "Lucio", - "shauntal": "Anis", - "marshal": "Kunz", - "grimsley": "Pieris", - "caitlin": "Percila", - "malva": "Malva", - "siebold": "Narcisse", - "wikstrom": "Tileo", - "drasna": "Dracéna", - "hala": "Pectorius", - "molayne": "Molène", - "olivia": "Alyxia", - "acerola": "Margie", - "kahili": "Kahili", - "rika": "Cayenn", - "poppy": "Popi", - "hassel": "Hassa", - "crispin": "Rubépin", - "amarys": "Nérine", - "lacey": "Taro", - "drayton": "Irido", - "blue": "Blue", - "red": "Red", - "steven": "Pierre Rochard", - "wallace": "Marc", - "cynthia": "Cynthia", - "alder": "Goyah", - "iris": "Iris", - "diantha": "Dianthéa", - "hau": "Tili", - "geeta": "Alisma", - "nemona": "Menzi", - "kieran": "Kass", - "leon": "Tarak", - "rival": "Gwenaël", //Male breton name, a celtic language spoken in Brittany (France) and related to the word for "white" (gwenn). Finn meaning is also "white" in irish/goidelic which are also celtic languages. - "rival_female": "Papina", //Litteral translation of ivy, also used as Female name in a North-American indigenous language - - - // Double Names - "blue_red_double": "Blue & Red", - "red_blue_double": "Red & Blue", - "tate_liza_double": "Lévy & Tatia", - "liza_tate_double": "Tatia & Lévy", - "steven_wallace_double": "Pierre R. & Marc", - "wallace_steven_double": "Marc & Pierre R.", - "alder_iris_double": "Goyah & Iris", - "iris_alder_double": "Iris & Goyah", - "marnie_piers_double": "Rosemary & Peterson", - "piers_marnie_double": "Peterson & Rosemary", -} as const; diff --git a/src/locales/fr/tutorial.json b/src/locales/fr/tutorial.json new file mode 100644 index 00000000000..f15a7c7c6d4 --- /dev/null +++ b/src/locales/fr/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite !\n$Ce jeu n’est pas monétisé et nous ne prétendons à la propriété d’aucun élément sous copyright utilisé.\n$Bien qu’en développement permanent, PokéRogue reste entièrement jouable.\n$Tout signalement de bugs et d’erreurs quelconques passe par le serveur Discord.\n$Si le jeu est lent, vérifiez que l’Accélération Matérielle est activée dans les paramètres du navigateur.", + "accessMenu": "Accédez au menu avec M ou Échap lors de l’attente d’une\naction.\n$Il contient les paramètres et diverses fonctionnalités.", + "menu": "Vous pouvez accéder aux paramètres depuis ce menu.\n$Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre…\n$Mais également des tonnes d’autres fonctionnalités, jetez-y un œil !", + "starterSelect": "Choisissez vos starters depuis cet écran avec Z ou Espace.\nIls formeront votre équipe de départ.\n$Chacun possède une valeur. Votre équipe peut avoir jusqu’à 6 membres, sans dépasser un cout de 10.\n$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.\n$Les IV d’un starter sont les meilleurs de tous ceux de son espèce déjà possédés. Obtenez-en plusieurs !", + "pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour violet.\n$Si un starter que vous possédez l’a, essayez de l’ajouter à votre équipe. Vérifiez bien son résumé !", + "statChange": "Les changements de stats persistent à travers les combats tant que le Pokémon n’est pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de l’adversaire en maintenant V.\n$Seules les capacités que le Pokémon a utilisées dans ce combat sont consultables.", + "selectItem": "Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un.\n$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.\n$La plupart des effets des objets non-consommables se cumuleront de diverses manières.\n$Certains objets n’apparaitront que s’ils ont une utilité immédiate, comme les objets d’évolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert.\n$L’option de transfert apparait en bas à droite dès qu’un Pokémon de l’équipe porte un objet.\n$Vous pouvez acheter des consommables avec de l’argent.\nPlus vous progressez, plus le choix sera large.\n$Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.", + "eggGacha": "Depuis cet écran, vous pouvez utiliser vos coupons\npour recevoir Œufs de Pokémon au hasard.\n$Les Œufs éclosent après avoir remporté un certain nombre de combats. Plus ils sont rares, plus ils mettent de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe, mais seront ajoutés à vos starters.\n$Les Pokémon issus d’Œufs ont généralement de meilleurs IV que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus que dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !" +} diff --git a/src/locales/fr/tutorial.ts b/src/locales/fr/tutorial.ts deleted file mode 100644 index d8940dadd56..00000000000 --- a/src/locales/fr/tutorial.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - "intro": `Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite ! - $Ce jeu n’est pas monétisé et nous ne prétendons pas à la propriété de Pokémon, ni des éléments sous copyright - $utilisés. - $Ce jeu est toujours en développement, mais entièrement jouable. - $Tout signalement de bugs passe par le serveur Discord. - $Si le jeu est lent, vérifiez que l’Accélération Matérielle est activée dans les paramètres du navigateur.`, - - "accessMenu": `Accédez au menu avec M ou Échap lors de l’attente d’une\naction. - $Il contient les paramètres et diverses fonctionnalités`, - - "menu": `Vous pouvez accéder aux paramètres depuis ce menu. - $Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre. - $Il y a également toute une variété d’autres fonctionnalités, - $jetez-y un œil !`, - - "starterSelect": `Choisissez vos starters depuis cet écran avec Z ou Espace.\nIls formeront votre équipe de départ. - $Chacun possède une valeur. Votre équipe peut avoir jusqu’à\n6 membres, tant que vous ne dépassez pas un cout de 10. - $Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos. - $Les IVs d’un starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc d’en obtenir plusieurs !`, - - "pokerus": `Chaque jour, 3 starters tirés aléatoirement ont un contour - $violet. Si un starter que vous possédez l’a, essayez de - $l’ajouter à votre équipe. Vérifiez bien son résumé !`, - - "statChange": `Les changements de stats restent à travers les combats tant que le Pokémon n’est pas rappelé. - $Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome. - $Vous pouvez voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj. - $Vous pouvez également voir les capacités de l’adversaire en maintenant V. - $Seules les capacités que le Pokémon a utilisées dans ce combat sont consultables.`, - - "selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un. - $Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents. - $La plupart des effets des objets non-consommables se cumuleront de diverses manières. - $Certains objets apparaîtront s’ils peuvent être utilisés, comme les objets d’évolution. - $Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert. - $L’option de transfert apparaît en bas à droite dès que vous avez obtenu un objet à faire tenir. - $Vous pouvez acheter des consommables avec de l’argent.\nPlus vous progressez, plus le choix sera varié. - $Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.`, - - "eggGacha": `Depuis cet écran, vous pouvez échanger vos coupons\ncontre des Œufs de Pokémon. - $Les Œufs éclosent après avoir remporté un certain nombre\nde combats. Les plus rares mettent plus de temps. - $Les Pokémon éclos ne rejoindront pas votre équipe,\nmais seront ajoutés à vos starters. - $Les Pokémon issus d’Œufs ont généralement de\nmeilleurs IVs que les Pokémon sauvages. - $Certains Pokémon ne peuvent être obtenus\nque dans des Œufs. - $Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !`, -} as const; diff --git a/src/locales/fr/voucher.json b/src/locales/fr/voucher.json new file mode 100644 index 00000000000..ef6126b4435 --- /dev/null +++ b/src/locales/fr/voucher.json @@ -0,0 +1,9 @@ +{ + "vouchers": "Coupons", + "eggVoucher": "Coupon Œuf", + "eggVoucherPlus": "Coupon Œuf +", + "eggVoucherPremium": "Coupon Œuf Premium", + "eggVoucherGold": "Coupon Œuf Or", + "locked": "Verrouillé", + "defeatTrainer": "Vaincre {{trainerName}}" +} diff --git a/src/locales/fr/voucher.ts b/src/locales/fr/voucher.ts deleted file mode 100644 index 7cab3f90878..00000000000 --- a/src/locales/fr/voucher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { - "vouchers": "Coupons", - "eggVoucher": "Coupon Œuf", - "eggVoucherPlus": "Coupon Œuf +", - "eggVoucherPremium": "Coupon Œuf Premium", - "eggVoucherGold": "Coupon Œuf Or", - "locked": "Verrouillé", - "defeatTrainer": "Vaincre {{trainerName}}" -} as const; diff --git a/src/locales/fr/weather.json b/src/locales/fr/weather.json new file mode 100644 index 00000000000..7afe538b064 --- /dev/null +++ b/src/locales/fr/weather.json @@ -0,0 +1,32 @@ +{ + "sunnyStartMessage": "Les rayons du soleil brillent !", + "sunnyLapseMessage": "Les rayons du soleil brillent fort !", + "sunnyClearMessage": "Les rayons du soleil s’affaiblissent !", + "rainStartMessage": "Il commence à pleuvoir !", + "rainLapseMessage": "La pluie continue de tomber !", + "rainClearMessage": "La pluie s’est arrêtée !", + "sandstormStartMessage": "Une tempête de sable se prépare !", + "sandstormLapseMessage": "La tempête de sable fait rage !", + "sandstormClearMessage": "La tempête de sable se calme !", + "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !", + "hailStartMessage": "Il commence à grêler !", + "hailLapseMessage": "La grêle continue de tomber !", + "hailClearMessage": "La grêle s’est arrêtée !", + "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !", + "snowStartMessage": "Il commence à neiger !", + "snowLapseMessage": "Il y a une tempête de neige !", + "snowClearMessage": "La neige s’est arrêtée !", + "fogStartMessage": "Le brouillard devient épais…", + "fogLapseMessage": "Le brouillard continue !", + "fogClearMessage": "Le brouillard s’est dissipé !", + "heavyRainStartMessage": "Une pluie battante s’abat soudainement !", + "heavyRainLapseMessage": "La pluie battante continue.", + "heavyRainClearMessage": "La pluie battante s’est arrêtée…", + "harshSunStartMessage": "Les rayons du soleil s’intensifient !", + "harshSunLapseMessage": "Les rayons du soleil sont brulants !", + "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !", + "strongWindsStartMessage": "Un vent mystérieux se lève !", + "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !", + "strongWindsEffectMessage": "Le courant aérien mystérieux affaiblit l’attaque !", + "strongWindsClearMessage": "Le vent mystérieux s’est dissipé…" +} diff --git a/src/locales/fr/weather.ts b/src/locales/fr/weather.ts deleted file mode 100644 index fa6090a3ad5..00000000000 --- a/src/locales/fr/weather.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "Les rayons du soleil brillent !", - "sunnyLapseMessage": "Les rayons du soleil brillent fort !", - "sunnyClearMessage": "Les rayons du soleil s’affaiblissent !", - - "rainStartMessage": "Il commence à pleuvoir !", - "rainLapseMessage": "La pluie continue de tomber !", - "rainClearMessage": "La pluie s’est arrêtée !", - - "sandstormStartMessage": "Une tempête de sable se prépare !", - "sandstormLapseMessage": "La tempête de sable fait rage !", - "sandstormClearMessage": "La tempête de sable se calme !", - "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !", - - "hailStartMessage": "Il commence à grêler !", - "hailLapseMessage": "La grêle continue de tomber !", - "hailClearMessage": "La grêle s’est arrêtée !", - "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !", - - "snowStartMessage": "Il commence à neiger !", - "snowLapseMessage": "Il y a une tempête de neige !", - "snowClearMessage": "La neige s’est arrêtée !", - - "fogStartMessage": "Le brouillard devient épais…", - "fogLapseMessage": "Le brouillard continue !", - "fogClearMessage": "Le brouillard s’est dissipé !", - - "heavyRainStartMessage": "Une pluie battante s’abat soudainement !", - "heavyRainLapseMessage": "La pluie battante continue.", - "heavyRainClearMessage": "La pluie battante s’est arrêtée…", - - "harshSunStartMessage": "Les rayons du soleil s’intensifient !", - "harshSunLapseMessage": "Les rayons du soleil sont brulants !", - "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !", - - "strongWindsStartMessage": "Un vent mystérieux se lève !", - "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !", - "strongWindsClearMessage": "Le vent mystérieux s’est dissipé…" -}; diff --git a/src/locales/it/ability-trigger.json b/src/locales/it/ability-trigger.json new file mode 100644 index 00000000000..333cb5719d8 --- /dev/null +++ b/src/locales/it/ability-trigger.json @@ -0,0 +1,64 @@ +{ + "blockRecoilDamage": "{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!", + "badDreams": "{{pokemonName}} è tormentato dagli incubi!", + "costar": "{{pokemonName}} ha copiato le modifiche alle statistiche\ndel suo alleato {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} ha evitato\ni danni grazie a {{abilityName}}!", + "perishBody": "{{abilityName}} di {{pokemonName}}\nmanderà KO entrambi i Pokémon dopo 3 turni!", + "poisonHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", + "trace": "L'abilità {{abilityName}} di {{targetName}}\nviene copiata da {{pokemonName}} con Traccia!", + "windPowerCharged": "Venire colpito da {{moveName}} ha caricato {{pokemonName}}!", + "quickDraw": "{{pokemonName}} agisce più rapidamente del normale grazie a Colpolesto!", + "blockItemTheft": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo rende immune ai furti!", + "typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!", + "fullHpResistType": "{{pokemonNameWithAffix}} fa risplendere la sua corazza\ne altera i rapporti tra i tipi!", + "disguiseAvoidedDamage": "{{pokemonNameWithAffix}} è stato smascherato!", + "moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!", + "reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!", + "postDefendTypeChange": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo ha reso di tipo {{typeName}}!", + "postDefendContactDamage": "{{abilityName}} di {{pokemonNameWithAffix}} ha\ndanneggiato il Pokémon che l'ha attaccato!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} scambia\nla sua abilità con il bersaglio", + "postDefendAbilityGive": "{{abilityName}} di {{pokemonNameWithAffix}}\nviene ceduta al bersaglio!", + "postDefendMoveDisable": "La mossa {{moveName}} di {{pokemonNameWithAffix}}\nè stata bloccata!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} è diventato di tipo {{moveType}}!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} ruba\n{{stolenItemType}} di {{defenderName}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} ruba\n{{stolenItemType}} di {{attackerName}}!", + "copyFaintedAllyAbility": "L'abilità {{abilityName}} di {{pokemonNameWithAffix}} è passata all'alleato!", + "intimidateImmunity": "{{abilityName}} impedisce a {{pokemonNameWithAffix}} di\nessere intimidito!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} beve il\ntè che {{pokemonName}} gli ha preparato!", + "postSummonClearAllyStats": "Le statistiche di {{pokemonNameWithAffix}}\ntornano alla normalità!", + "postSummonTransform": "{{pokemonNameWithAffix}} assume le sembianze\ndi {{targetName}}!", + "protectStat": "{{abilityName}} di {{pokemonNameWithAffix}}\npreviene la riduzione del/della suo/a {{statName}}!", + "statusEffectImmunityWithName": "{{abilityName}} di {{pokemonNameWithAffix}}\nnon gli fa subire il/lo/la {{statusEffectName}}!", + "statusEffectImmunity": "{{abilityName}} di {{pokemonNameWithAffix}}\npreviene i problemi di stato!", + "battlerTagImmunity": "{{abilityName}} di {{pokemonNameWithAffix}}\npreviene {{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}} è stato messo in guardia da {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} perquisice {{opponentName}}\ne trova la sua abilità, {{opponentAbilityName}}!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}} recupera alcuni PS\ncon {{abilityName}}!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} subisce danni\na causa della sua abilità, {{abilityName}}!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} raccoglie una {{berryName}}!", + "postTurnHeal": "{{pokemonNameWithAffix}} recupera alcuni PS\ncon {{abilityName}}!", + "fetchBall": "{{pokemonNameWithAffix}} ha trovato una\n{{pokeballName}}!", + "healFromBerryUse": "{{abilityName}} di {{pokemonNameWithAffix}}\nristabilisce parte dei PS!", + "arenaTrap": "L’abilità {{abilityName}} di {{pokemonNameWithAffix}}\nimpedisce la sostituzione!", + "postBattleLoot": "{{pokemonNameWithAffix}} ha raccolto\nil/l'/lo/la {{itemName}}!", + "postFaintContactDamage": "{{abilityName}} di {{pokemonNameWithAffix}}\nferisce il Pokémon che lo ha attaccato!", + "postFaintHpDamage": "{{abilityName}} di {{pokemonNameWithAffix}}\nferisce il Pokémon che lo ha attaccato!", + "postSummonPressure": "{{pokemonNameWithAffix}} fa pressione!", + "weatherEffectDisappeared": "Le condizioni atmosferiche non hanno alcun effetto.", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} ha l’abilità Rompiforma!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} rabbrividisce!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} emana un’aura infuocata!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} emana un’aura repulsiva!", + "postSummonDarkAura": "L’abilità Auratetra di {{pokemonNameWithAffix}} è attiva.", + "postSummonFairyAura": "L’abilità Aurafolletto di {{pokemonNameWithAffix}} è attiva.", + "postSummonAuraBreak": "{{pokemonNameWithAffix}} inverte gli effetti di tutte le aure!", + "postSummonNeutralizingGas": "Il Gas Reagente di {{pokemonNameWithAffix}}\nsi diffonde tutt’intorno!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} ha due abilità!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} ha due abilità!", + "postSummonVesselOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Vaso Nefasto di {{pokemonNameWithAffix}}!", + "postSummonSwordOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Spada Nefasta di {{pokemonNameWithAffix}}!", + "postSummonTabletsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Amuleto Nefasto di {{pokemonNameWithAffix}}!", + "postSummonBeadsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Monile Nefasto di {{pokemonNameWithAffix}}!", + "preventBerryUse": "{{pokemonNameWithAffix}} non riesce a\nmangiare le bacche per l'agitazione!" +} diff --git a/src/locales/it/ability-trigger.ts b/src/locales/it/ability-trigger.ts deleted file mode 100644 index 1f6fcfb1258..00000000000 --- a/src/locales/it/ability-trigger.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!", - "badDreams": "{{pokemonName}} è tormentato dagli incubi!", - "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", - "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!", - "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", - "windPowerCharged": "Venire colpito da {{moveName}} ha caricato {{pokemonName}}!", - "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", -} as const; diff --git a/src/locales/it/ability.json b/src/locales/it/ability.json new file mode 100644 index 00000000000..18eb133d824 --- /dev/null +++ b/src/locales/it/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "Tanfo", + "description": "Quando il Pokémon attacca il bersaglio, può farlo tentennare grazie al cattivo odore che emana." + }, + "drizzle": { + "name": "Piovischio", + "description": "Quando il Pokémon entra in campo, attira la pioggia." + }, + "speedBoost": { + "name": "Acceleratore", + "description": "La Velocità aumenta a ogni turno." + }, + "battleArmor": { + "name": "Lottascudo", + "description": "Il Pokémon è protetto da una dura corazza che gli evita di subire brutti colpi." + }, + "sturdy": { + "name": "Vigore", + "description": "Evita che il Pokémon vada KO in un sol colpo se ha tutti i PS, e lo rende immune alle mosse che causano KO immediato." + }, + "damp": { + "name": "Umidità", + "description": "Aumenta l'umidità circostante, impedendo l'uso di Autodistruzione e di altre mosse esplosive." + }, + "limber": { + "name": "Scioltezza", + "description": "Il corpo flessibile del Pokémon gli impedisce di subire gli effetti della paralisi." + }, + "sandVeil": { + "name": "Sabbiavelo", + "description": "L'elusione aumenta durante le tempeste di sabbia." + }, + "static": { + "name": "Statico", + "description": "Il Pokémon si ricopre di elettricità statica e può causare paralisi a chi è entrato in contatto con lui." + }, + "voltAbsorb": { + "name": "Assorbivolt", + "description": "Se il Pokémon viene colpito da una mossa di tipo Elettro, recupera PS anziché subire danni." + }, + "waterAbsorb": { + "name": "Assorbacqua", + "description": "Se il Pokémon viene colpito da una mossa di tipo Acqua, recupera PS anziché subire danni." + }, + "oblivious": { + "name": "Indifferenza", + "description": "L'imperturbabilità del Pokémon lo protegge da infatuazioni, provocazioni e dall'effetto di Prepotenza." + }, + "cloudNine": { + "name": "Antimeteo", + "description": "Neutralizza gli effetti di tutte le condizioni atmosferiche." + }, + "compoundEyes": { + "name": "Insettocchi", + "description": "La precisione del Pokémon aumenta grazie ai suoi occhi composti." + }, + "insomnia": { + "name": "Insonnia", + "description": "Il Pokémon soffre d'insonnia e non può addormentarsi." + }, + "colorChange": { + "name": "Cambiacolore", + "description": "Il Pokémon acquisisce il tipo della mossa subita." + }, + "immunity": { + "name": "Immunità", + "description": "L'immunità naturale del Pokémon gli impedisce di essere avvelenato." + }, + "flashFire": { + "name": "Fuocardore", + "description": "Se il Pokémon subisce una mossa di tipo Fuoco, ne sfrutta il calore per potenziare le proprie mosse di tipo Fuoco." + }, + "shieldDust": { + "name": "Polvoscudo", + "description": "Il Pokémon è protetto da uno strato di scaglie che annulla gli effetti aggiuntivi delle mosse subite." + }, + "ownTempo": { + "name": "Mente Locale", + "description": "Il Pokémon affronta la vita al proprio ritmo e per questo non può essere confuso o subire l'effetto di Prepotenza." + }, + "suctionCups": { + "name": "Ventose", + "description": "Il Pokémon resiste a strumenti e mosse che causano la sostituzione appiccicandosi al terreno con le ventose." + }, + "intimidate": { + "name": "Prepotenza", + "description": "Quando il Pokémon entra in campo, la sua prepotenza crea soggezione, riducendo l'Attacco degli avversari intimiditi." + }, + "shadowTag": { + "name": "Pedinombra", + "description": "Il Pokémon impedisce la fuga o la sostituzione degli avversari di cui calpesta l'ombra." + }, + "roughSkin": { + "name": "Cartavetro", + "description": "Quando il Pokémon subisce un attacco, grazie alla sua pelle ruvida infligge a sua volta danni al Pokémon con cui è entrato in contatto." + }, + "wonderGuard": { + "name": "Magidifesa", + "description": "Un potere misterioso protegge il Pokémon e lo rende vulnerabile solo alle mosse superefficaci." + }, + "levitate": { + "name": "Levitazione", + "description": "La capacità di levitare conferisce al Pokémon immunità agli attacchi di tipo Terra." + }, + "effectSpore": { + "name": "Spargispora", + "description": "Può causare avvelenamento, paralisi o sonno a chi attacca il Pokémon entrando in contatto con lui." + }, + "synchronize": { + "name": "Sincronismo", + "description": "Se un Pokémon con questa abilità viene avvelenato, paralizzato o scottato, contagia con lo stesso problema di stato chi lo ha causato." + }, + "clearBody": { + "name": "Corpochiaro", + "description": "Impedisce la diminuzione delle statistiche causata da abilità o mosse di altri Pokémon." + }, + "naturalCure": { + "name": "Alternacura", + "description": "Quando il Pokémon lascia il campo, guarisce dai problemi di stato." + }, + "lightningRod": { + "name": "Parafulmine", + "description": "Il Pokémon attira e neutralizza le mosse di tipo Elettro, facendo aumentare il suo Attacco Speciale." + }, + "sereneGrace": { + "name": "Leggiadro", + "description": "Rende più probabili gli effetti aggiuntivi delle mosse." + }, + "swiftSwim": { + "name": "Nuotovelox", + "description": "Se piove, la Velocità aumenta." + }, + "chlorophyll": { + "name": "Clorofilla", + "description": "Se la luce del sole è intensa, la Velocità aumenta." + }, + "illuminate": { + "name": "Risplendi", + "description": "Illuminando l'ambiente circostante, impedisce che la precisione del pokémon sia diminuita." + }, + "trace": { + "name": "Traccia", + "description": "Quando il Pokémon entra in campo, copia l'abilità di un avversario." + }, + "hugePower": { + "name": "Macroforza", + "description": "Raddoppia la potenza degli attacchi fisici del Pokémon." + }, + "poisonPoint": { + "name": "Velenopunto", + "description": "Può avvelenare chi entra in contatto con il Pokémon." + }, + "innerFocus": { + "name": "Forza Interiore", + "description": "La capacità di concentrazione del Pokémon evita che tentenni per gli attacchi subiti e lo protegge dall'effetto di Prepotenza." + }, + "magmaArmor": { + "name": "Magmascudo", + "description": "Il magma riveste il corpo del Pokémon impedendogli di venire congelato." + }, + "waterVeil": { + "name": "Idrovelo", + "description": "Un velo d'acqua riveste il corpo del Pokémon impedendogli di venire scottato." + }, + "magnetPull": { + "name": "Magnetismo", + "description": "La carica magnetica attrae i Pokémon di tipo Acciaio impedendogli la fuga o la sostituzione." + }, + "soundproof": { + "name": "Antisuono", + "description": "Il Pokémon è dotato di una sorta di isolamento acustico che lo rende immune alle mosse basate sul suono." + }, + "rainDish": { + "name": "Copripioggia", + "description": "Il Pokémon recupera PS quando piove." + }, + "sandStream": { + "name": "Sabbiafiume", + "description": "Quando il Pokémon entra in campo, scatena una tempesta di sabbia." + }, + "pressure": { + "name": "Pressione", + "description": "Il Pokémon mette pressione agli avversari, facendogli consumare più PP." + }, + "thickFat": { + "name": "Grassospesso", + "description": "Il Pokémon è protetto da uno spesso strato di grasso che dimezza il danno causato da mosse di tipo Fuoco e Ghiaccio." + }, + "earlyBird": { + "name": "Sveglialampo", + "description": "Anche se il Pokémon si addormenta, può risvegliarsi due volte più velocemente." + }, + "flameBody": { + "name": "Corpodifuoco", + "description": "Può scottare chi entra in contatto con il Pokémon." + }, + "runAway": { + "name": "Fugafacile", + "description": "Garantisce la fuga dai Pokémon selvatici." + }, + "keenEye": { + "name": "Sguardofermo", + "description": "La vista acuta del Pokémon impedisce che la sua precisione diminuisca." + }, + "hyperCutter": { + "name": "Ipertaglio", + "description": "Le possenti chele o tenaglie di cui è dotato il Pokémon fanno sì che il suo Attacco non possa essere diminuito da altri." + }, + "pickup": { + "name": "Raccolta", + "description": "Il Pokémon può raccogliere strumenti usati da altri durante la lotta. Potrebbe raccogliere strumenti anche fuori dalla lotta." + }, + "truant": { + "name": "Pigrone", + "description": "Quando il Pokémon usa una mossa, nel turno successivo si riposerà." + }, + "hustle": { + "name": "Tuttafretta", + "description": "L'Attacco aumenta, ma la precisione diminuisce." + }, + "cuteCharm": { + "name": "Incantevole", + "description": "Può causare infatuazione a chi entra in contatto con il Pokémon." + }, + "plus": { + "name": "Più", + "description": "L'Attacco Speciale aumenta se ci sono alleati con l'abilità Meno o Più." + }, + "minus": { + "name": "Meno", + "description": "L'Attacco Speciale aumenta se ci sono alleati con l'abilità Meno o Più." + }, + "forecast": { + "name": "Previsioni", + "description": "Cambia il tipo del Pokémon in Acqua, Fuoco o Ghiaccio in base alle condizioni atmosferiche." + }, + "stickyHold": { + "name": "Antifurto", + "description": "Gli strumenti restano appiccicati al corpo adesivo del Pokémon e non possono essere rubati." + }, + "shedSkin": { + "name": "Muta", + "description": "Il Pokémon può guarire dai problemi di stato facendo la muta completa della pelle." + }, + "guts": { + "name": "Dentistretti", + "description": "Se il Pokémon è affetto da un problema di stato, tira fuori la grinta e aumenta il proprio Attacco." + }, + "marvelScale": { + "name": "Pelledura", + "description": "Se il Pokémon è affetto da un problema di stato, le squame sulla sua pelle si induriscono aumentando la sua Difesa." + }, + "liquidOoze": { + "name": "Melma", + "description": "La melma del Pokémon infligge danni a chi la assorbe, facendogli perdere PS a causa del fortissimo tanfo." + }, + "overgrow": { + "name": "Erbaiuto", + "description": "Quando al Pokémon rimangono pochi PS, la potenza delle sue mosse di tipo Erba aumenta." + }, + "blaze": { + "name": "Aiutofuoco", + "description": "Quando al Pokémon rimangono pochi PS, la potenza delle sue mosse di tipo Fuoco aumenta." + }, + "torrent": { + "name": "Acquaiuto", + "description": "Quando al Pokémon rimangono pochi PS, la potenza delle sue mosse di tipo Acqua aumenta." + }, + "swarm": { + "name": "Aiutinsetto", + "description": "Quando al Pokémon rimangono pochi PS, la potenza delle sue mosse di tipo Coleottero aumenta." + }, + "rockHead": { + "name": "Testadura", + "description": "Anche se il Pokémon usa delle mosse che causano un contraccolpo, non perde PS." + }, + "drought": { + "name": "Siccità", + "description": "Quando il Pokémon entra in campo, la luce solare diventa intensa." + }, + "arenaTrap": { + "name": "Trappoarena", + "description": "Impedisce la fuga agli avversari." + }, + "vitalSpirit": { + "name": "Spiritovivo", + "description": "Il Pokémon è talmente vivace che non può addormentarsi." + }, + "whiteSmoke": { + "name": "Fumochiaro", + "description": "Il Pokémon è protetto da un fumo chiaro che impedisce ai nemici di diminuire le sue statistiche." + }, + "purePower": { + "name": "Forzapura", + "description": "L'Attacco del Pokémon raddoppia grazie alla sua padronanza delle tecniche yoga." + }, + "shellArmor": { + "name": "Guscioscudo", + "description": "Il Pokémon è protetto da un guscio robusto che gli evita di subire brutti colpi." + }, + "airLock": { + "name": "Riparo", + "description": "Neutralizza gli effetti di tutte le condizioni atmosferiche." + }, + "tangledFeet": { + "name": "Intricopiedi", + "description": "Se il Pokémon è confuso, la sua elusione aumenta." + }, + "motorDrive": { + "name": "Elettrorapid", + "description": "Se il Pokémon viene colpito da una mossa di tipo Elettro, la neutralizza e sfrutta la carica elettrica per aumentare la propria Velocità." + }, + "rivalry": { + "name": "Antagonismo", + "description": "Rende più forti contro nemici dello stesso sesso, ma più deboli contro nemici di sesso opposto." + }, + "steadfast": { + "name": "Cuordeciso", + "description": "Se il Pokémon tentenna, il suo animo indomito si risveglia e la sua Velocità aumenta." + }, + "snowCloak": { + "name": "Mantelneve", + "description": "Se grandina, l'elusione aumenta." + }, + "gluttony": { + "name": "Voracità", + "description": "Il Pokémon non attende di aver perso molti PS per mangiare certe bacche, ma lo fa non appena i suoi PS scendono a metà o meno." + }, + "angerPoint": { + "name": "Grancollera", + "description": "Se il Pokémon subisce un brutto colpo, monta su tutte le furie e il suo Attacco aumenta al massimo." + }, + "unburden": { + "name": "Agiltecnica", + "description": "Se il Pokémon usa o perde uno strumento, la sua Velocità aumenta." + }, + "heatproof": { + "name": "Antifuoco", + "description": "Il corpo termoresistente del Pokémon dimezza i danni che subisce dalle mosse di tipo Fuoco." + }, + "simple": { + "name": "Disinvoltura", + "description": "Raddoppia le modifiche alle statistiche." + }, + "drySkin": { + "name": "Pellearsa", + "description": "Il Pokémon recupera PS se piove o se subisce mosse di tipo Acqua, ma perde PS con la luce solare intensa. Subisce più danni da mosse di tipo Fuoco." + }, + "download": { + "name": "Download", + "description": "Il Pokémon analizza Difesa e Difesa Speciale del nemico e, a seconda di qual è più bassa, aumenta il proprio Attacco o Attacco Speciale." + }, + "ironFist": { + "name": "Ferropugno", + "description": "Potenzia le mosse che utilizzano pugni." + }, + "poisonHeal": { + "name": "Velencura", + "description": "Se il Pokémon è avvelenato, recupera PS anziché perderli." + }, + "adaptability": { + "name": "Adattabilità", + "description": "Potenzia di molto le mosse dello stesso tipo del Pokémon." + }, + "skillLink": { + "name": "Abillegame", + "description": "Le mosse multicolpo mandano a segno sempre il massimo dei colpi possibili." + }, + "hydration": { + "name": "Idratazione", + "description": "Se piove, il Pokémon guarisce dai problemi di stato." + }, + "solarPower": { + "name": "Solarpotere", + "description": "Se la luce del sole è intensa, l'Attacco Speciale aumenta, ma il Pokémon perde PS a ogni turno." + }, + "quickFeet": { + "name": "Piedisvelti", + "description": "Se il Pokémon è affetto da un problema di stato, la Velocità aumenta." + }, + "normalize": { + "name": "Normalità", + "description": "Tutte le mosse del Pokémon diventano di tipo Normale e la loro potenza aumenta un po'." + }, + "sniper": { + "name": "Cecchino", + "description": "Aumenta ulteriormente i danni inflitti dai brutti colpi." + }, + "magicGuard": { + "name": "Magicscudo", + "description": "Il Pokémon subisce danni solo dagli attacchi." + }, + "noGuard": { + "name": "Nullodifesa", + "description": "Il Pokémon e chiunque lo attacchi abbassano la guardia e le loro mosse vanno sempre a segno." + }, + "stall": { + "name": "Rallentatore", + "description": "Il Pokémon agisce sempre per ultimo." + }, + "technician": { + "name": "Tecnico", + "description": "Potenzia le mosse più deboli del Pokémon." + }, + "leafGuard": { + "name": "Fogliamanto", + "description": "Se la luce del sole è intensa, evita i problemi di stato." + }, + "klutz": { + "name": "Impaccio", + "description": "Il Pokémon non può usare lo strumento che ha con sé." + }, + "moldBreaker": { + "name": "Rompiforma", + "description": "Quando il Pokémon attacca, ignora l'abilità del bersaglio se questa ha effetto sulle mosse." + }, + "superLuck": { + "name": "Supersorte", + "description": "L'incredibile fortuna del Pokémon aumenta la sua probabilità di infliggere brutti colpi." + }, + "aftermath": { + "name": "Scoppio", + "description": "Chi manda KO questo Pokémon con un attacco diretto subisce dei danni." + }, + "anticipation": { + "name": "Presagio", + "description": "Rivela se il nemico ha mosse pericolose." + }, + "forewarn": { + "name": "Premonizione", + "description": "Quando il Pokémon entra in campo, rivela una delle mosse del nemico." + }, + "unaware": { + "name": "Imprudenza", + "description": "Quando il Pokémon attacca, ignora le modifiche alle statistiche del nemico." + }, + "tintedLens": { + "name": "Lentifumé", + "description": "Permette alle mosse non molto efficaci di infliggere danni normalmente." + }, + "filter": { + "name": "Filtro", + "description": "Riduce i danni subiti dalle mosse superefficaci." + }, + "slowStart": { + "name": "Lentoinizio", + "description": "Dimezza per cinque turni l'Attacco e la Velocità." + }, + "scrappy": { + "name": "Nervisaldi", + "description": "Permette di colpire Pokémon di tipo Spettro con mosse di tipo Normale e Lotta." + }, + "stormDrain": { + "name": "Acquascolo", + "description": "Il Pokémon attira e neutralizza le mosse di tipo Acqua e fa aumentare il proprio Attacco Speciale." + }, + "iceBody": { + "name": "Corpogelo", + "description": "Se grandina, il Pokémon recupera PS." + }, + "solidRock": { + "name": "Solidroccia", + "description": "Riduce i danni subiti dalle mosse superefficaci." + }, + "snowWarning": { + "name": "Scendineve", + "description": "Quando il Pokémon entra in campo, causa l'inizio di una nevicata." + }, + "honeyGather": { + "name": "Mielincetta", + "description": "Il Pokémon raccoglie del miele dopo ogni battaglia. Esso viene poi venduto." + }, + "frisk": { + "name": "Indagine", + "description": "Quando entra in battaglia, il Pokémon può controllare il Potere di un Pokémon avversario." + }, + "reckless": { + "name": "Temerarietà", + "description": "Potenzia le mosse che causano contraccolpo." + }, + "multitype": { + "name": "Multitipo", + "description": "Cambia il tipo del Pokémon a seconda della lastra o del Cristallo Z che ha con sé." + }, + "flowerGift": { + "name": "Regalfiore", + "description": "Se la luce del sole è intensa, aumenta l'Attacco e la Difesa Speciale del Pokémon e dei suoi alleati." + }, + "badDreams": { + "name": "Sogniamari", + "description": "Infligge danni ai nemici addormentati." + }, + "pickpocket": { + "name": "Arraffalesto", + "description": "Se il Pokémon viene colpito da un attacco diretto, ruba lo strumento di chi lo ha attaccato." + }, + "sheerForce": { + "name": "Forzabruta", + "description": "Aumenta la potenza delle mosse, ma ne annulla gli effetti aggiuntivi." + }, + "contrary": { + "name": "Inversione", + "description": "Le modifiche alle statistiche hanno effetto inverso: le statistiche aumentano quando dovrebbero diminuire e viceversa." + }, + "unnerve": { + "name": "Agitazione", + "description": "Il nemico viene intimidito e non può mangiare bacche." + }, + "defiant": { + "name": "Agonismo", + "description": "L'Attacco aumenta di molto quando le statistiche diminuiscono a causa di un nemico." + }, + "defeatist": { + "name": "Sconforto", + "description": "Quando i PS scendono a metà o meno, il Pokémon si scoraggia e l'Attacco e l'Attacco Speciale vengono dimezzati." + }, + "cursedBody": { + "name": "Corpofunesto", + "description": "Può bloccare la mossa subita dal Pokémon." + }, + "healer": { + "name": "Curacuore", + "description": "A volte cura i problemi di stato degli alleati." + }, + "friendGuard": { + "name": "Amicoscudo", + "description": "I danni inflitti agli alleati del Pokémon vengono ridotti." + }, + "weakArmor": { + "name": "Sottilguscio", + "description": "Se il Pokémon subisce danni da mosse fisiche, la Difesa diminuisce e la Velocità aumenta di molto." + }, + "heavyMetal": { + "name": "Metalpesante", + "description": "Raddoppia il peso del Pokémon." + }, + "lightMetal": { + "name": "Metalleggero", + "description": "Dimezza il peso del Pokémon." + }, + "multiscale": { + "name": "Multisquame", + "description": "Se i PS sono al massimo, riduce il danno subito." + }, + "toxicBoost": { + "name": "Velenimpeto", + "description": "Se il Pokémon è avvelenato, la potenza delle sue mosse fisiche aumenta." + }, + "flareBoost": { + "name": "Bruciaimpeto", + "description": "Se il Pokémon è scottato, la potenza delle sue mosse speciali aumenta." + }, + "harvest": { + "name": "Coglibacche", + "description": "Può ricreare una bacca utilizzata." + }, + "telepathy": { + "name": "Telepatia", + "description": "Il Pokémon prevede ed evita gli attacchi degli alleati." + }, + "moody": { + "name": "Altalena", + "description": "A ogni turno, aumenta di molto una statistica e ne riduce un'altra." + }, + "overcoat": { + "name": "Copricapo", + "description": "Rende immuni ai danni da grandine e tempesta di sabbia, alle mosse Spora, Cottonspora, Sonnifero, Paralizzante e alle mosse “polvere”." + }, + "poisonTouch": { + "name": "Velentocco", + "description": "Il Pokémon può avvelenare il nemico al solo contatto." + }, + "regenerator": { + "name": "Rigenergia", + "description": "Il Pokémon recupera un po' di PS quando lascia il campo." + }, + "bigPecks": { + "name": "Pettinfuori", + "description": "Evita che la Difesa diminuisca." + }, + "sandRush": { + "name": "Remasabbia", + "description": "Se c'è una tempesta di sabbia, la Velocità aumenta." + }, + "wonderSkin": { + "name": "Splendicute", + "description": "Il Pokémon resiste più facilmente alle mosse di stato." + }, + "analytic": { + "name": "Ponderazione", + "description": "Se il Pokémon agisce per ultimo, la potenza della mossa aumenta." + }, + "illusion": { + "name": "Illusione", + "description": "Il Pokémon entra in campo con le sembianze dell'ultimo Pokémon della squadra." + }, + "imposter": { + "name": "Sosia", + "description": "Il Pokémon si trasforma nel nemico che ha davanti." + }, + "infiltrator": { + "name": "Intrapasso", + "description": "Il Pokémon attacca evitando le barriere e il sostituto del nemico." + }, + "mummy": { + "name": "Mummia", + "description": "Al contatto con il Pokémon, l'abilità del nemico diventa Mummia." + }, + "moxie": { + "name": "Arroganza", + "description": "Quando manda un nemico KO, il Pokémon si fa sicuro di sé e aumenta il proprio Attacco." + }, + "justified": { + "name": "Giustizia", + "description": "Quando il Pokémon viene colpito da una mossa di tipo Buio, il suo forte senso di giustizia fa sì che l'Attacco aumenti." + }, + "rattled": { + "name": "Paura", + "description": "Le mosse di tipo Buio, Spettro e Coleottero spaventano il Pokémon aumentandone la Velocità." + }, + "magicBounce": { + "name": "Magispecchio", + "description": "Il Pokémon respinge al mittente le mosse di stato senza subirne gli effetti." + }, + "sapSipper": { + "name": "Mangiaerba", + "description": "Se il Pokémon viene colpito da una mossa di tipo Erba, la neutralizza e aumenta il proprio Attacco." + }, + "prankster": { + "name": "Burla", + "description": "Le mosse di stato del Pokémon acquistano priorità alta." + }, + "sandForce": { + "name": "Silicoforza", + "description": "Potenzia le mosse di tipo Roccia, Terra e Acciaio durante le tempeste di sabbia." + }, + "ironBarbs": { + "name": "Spineferrate", + "description": "Se il Pokémon viene colpito da un attacco diretto, infligge danni a sua volta con le sue spine di ferro." + }, + "zenMode": { + "name": "Stato Zen", + "description": "Cambia la forma del Pokémon se i PS scendono a metà o meno." + }, + "victoryStar": { + "name": "Vittorstella", + "description": "Aumenta la precisione di tutta la squadra." + }, + "turboblaze": { + "name": "Piroturbina", + "description": "Quando il Pokémon attacca, ignora l'abilità del bersaglio se questa ha effetto sulle mosse." + }, + "teravolt": { + "name": "Teravolt", + "description": "Quando il Pokémon attacca, ignora l'abilità del bersaglio se questa ha effetto sulle mosse." + }, + "aromaVeil": { + "name": "Aromavelo", + "description": "Protegge tutta la squadra da effetti che ne limitano la libertà di scelta delle mosse." + }, + "flowerVeil": { + "name": "Fiorvelo", + "description": "Rende gli alleati di tipo Erba immuni alla diminuzione delle statistiche e ai problemi di stato." + }, + "cheekPouch": { + "name": "Guancegonfie", + "description": "Quando il Pokémon mangia una bacca, recupera anche dei PS." + }, + "protean": { + "name": "Mutatipo", + "description": "Cambia il tipo del Pokémon in quello della mossa che usa." + }, + "furCoat": { + "name": "Foltopelo", + "description": "Dimezza il danno subito dalle mosse fisiche." + }, + "magician": { + "name": "Prestigiatore", + "description": "Quando chi la usa colpisce un Pokémon con una mossa, gli ruba lo strumento." + }, + "bulletproof": { + "name": "Antiproiettile", + "description": "Protegge da alcune mosse a base di proiettili e bombe." + }, + "competitive": { + "name": "Tenacia", + "description": "L'Attacco Speciale aumenta di molto quando le statistiche diminuiscono a causa di un nemico." + }, + "strongJaw": { + "name": "Ferromascella", + "description": "La robusta mascella del Pokémon permette morsi molto potenti." + }, + "refrigerate": { + "name": "Pellegelo", + "description": "Le mosse di tipo Normale diventano di tipo Ghiaccio e la loro potenza aumenta un po'." + }, + "sweetVeil": { + "name": "Dolcevelo", + "description": "Rende il Pokémon e i suoi alleati immuni al sonno." + }, + "stanceChange": { + "name": "Accendilotta", + "description": "Assume la Forma Spada se usa una mossa d'attacco e la Forma Scudo se usa Scudo Reale." + }, + "galeWings": { + "name": "Aliraffica", + "description": "Se il Pokémon ha tutti i PS, le sue mosse di tipo Volante acquistano priorità alta." + }, + "megaLauncher": { + "name": "Megalancio", + "description": "Potenzia le mosse \"pulsar\", Forzasfera e Ondasana." + }, + "grassPelt": { + "name": "Peloderba", + "description": "In presenza di un Campo Erboso, la Difesa aumenta." + }, + "symbiosis": { + "name": "Simbiosi", + "description": "Se un alleato usa uno strumento, il Pokémon gli passa il proprio." + }, + "toughClaws": { + "name": "Unghiedure", + "description": "Potenzia le mosse che causano un contatto fisico." + }, + "pixilate": { + "name": "Pellefolletto", + "description": "Le mosse di tipo Normale diventano di tipo Folletto e la loro potenza aumenta un po'." + }, + "gooey": { + "name": "Viscosità", + "description": "Se il Pokémon viene colpito da un attacco diretto, la Velocità di chi l'ha colpito diminuisce." + }, + "aerilate": { + "name": "Pellecielo", + "description": "Le mosse di tipo Normale diventano di tipo Volante e la loro potenza aumenta un po'." + }, + "parentalBond": { + "name": "Amorefiliale", + "description": "Il Pokémon e il suo piccolo attaccano insieme." + }, + "darkAura": { + "name": "Auratetra", + "description": "Potenzia le mosse di tipo Buio di tutti i Pokémon." + }, + "fairyAura": { + "name": "Aurafolletto", + "description": "Potenzia le mosse di tipo Folletto di tutti i Pokémon." + }, + "auraBreak": { + "name": "Frangiaura", + "description": "Inverte gli effetti di tutte le aure riducendone la potenza." + }, + "primordialSea": { + "name": "Mare Primordiale", + "description": "Crea un clima che rende inefficaci gli attacchi di tipo Fuoco." + }, + "desolateLand": { + "name": "Terra Estrema", + "description": "Crea un clima che rende inefficaci gli attacchi di tipo Acqua." + }, + "deltaStream": { + "name": "Flusso Delta", + "description": "Crea un clima che annulla i punti deboli del tipo Volante." + }, + "stamina": { + "name": "Sopportazione", + "description": "Se il Pokémon subisce un attacco, la sua Difesa aumenta." + }, + "wimpOut": { + "name": "Fuggifuggi", + "description": "Se i PS scendono a metà o meno, il Pokémon si fa prendere dalla paura e abbandona la lotta in tutta fretta." + }, + "emergencyExit": { + "name": "Passoindietro", + "description": "Se i PS scendono a metà o meno, il Pokémon abbandona la lotta per sfuggire al pericolo." + }, + "waterCompaction": { + "name": "Idrorinforzo", + "description": "Se il Pokémon subisce una mossa di tipo Acqua, la sua Difesa aumenta di molto." + }, + "merciless": { + "name": "Spietatezza", + "description": "Gli attacchi sferrati su un bersaglio avvelenato producono sempre brutti colpi." + }, + "shieldsDown": { + "name": "Scudosoglia", + "description": "Se i PS scendono a metà o meno, il guscio si rompe e il Pokémon si prepara all'offensiva." + }, + "stakeout": { + "name": "Sorveglianza", + "description": "Raddoppia i danni inflitti a un bersaglio che è appena entrato in campo per sostituire un altro Pokémon." + }, + "waterBubble": { + "name": "Bolladacqua", + "description": "Riduce i danni subiti dalle mosse di tipo Fuoco e rende immuni alle scottature." + }, + "steelworker": { + "name": "Tempracciaio", + "description": "Aumenta la potenza delle mosse di tipo Acciaio." + }, + "berserk": { + "name": "Furore", + "description": "Se i PS scendono a metà o meno a causa di un attacco, l'Attacco Speciale aumenta." + }, + "slushRush": { + "name": "Spalaneve", + "description": "Se grandina, la Velocità aumenta." + }, + "longReach": { + "name": "Distacco", + "description": "Il Pokémon è in grado di usare tutte le sue mosse senza entrare in contatto diretto con il bersaglio." + }, + "liquidVoice": { + "name": "Idrovoce", + "description": "Le mosse del Pokémon basate sul suono diventano di tipo Acqua." + }, + "triage": { + "name": "Primacura", + "description": "Le mosse che ripristinano direttamente i PS del Pokémon acquistano priorità alta." + }, + "galvanize": { + "name": "Pellelettro", + "description": "Le mosse di tipo Normale diventano di tipo Elettro e la loro potenza aumenta un po'." + }, + "surgeSurfer": { + "name": "Codasurf", + "description": "In presenza di un Campo Elettrico, la Velocità raddoppia." + }, + "schooling": { + "name": "Banco", + "description": "Quando ha molti PS, il Pokémon forma un banco con i propri simili e si rafforza. Quando ne ha pochi, il banco si disperde." + }, + "disguise": { + "name": "Fantasmanto", + "description": "Il panno che ricopre il Pokémon lo protegge da un singolo attacco." + }, + "battleBond": { + "name": "Morfosintonia", + "description": "Se il Pokémon manda KO un nemico, il legame con l'Allenatore si rafforza, attivando la trasformazione in Greninja Forma Ash. Acqualame si potenzia." + }, + "powerConstruct": { + "name": "Sciamefusione", + "description": "Se i PS del Pokémon scendono a metà o meno, le cellule si raggruppano e gli permettono di assumere la Forma Perfetta." + }, + "corrosion": { + "name": "Corrosione", + "description": "Il Pokémon è in grado di avvelenare il bersaglio anche se questo è di tipo Acciaio o Veleno." + }, + "comatose": { + "name": "Sonno Assoluto", + "description": "Il Pokémon si trova in un costante stato di dormiveglia che gli impedisce di svegliarsi. Può attaccare anche da addormentato." + }, + "queenlyMajesty": { + "name": "Regalità", + "description": "L'aura di regalità del Pokémon impedisce al nemico di attaccarlo con mosse che hanno priorità alta." + }, + "innardsOut": { + "name": "Espellinterno", + "description": "Se il Pokémon viene mandato KO da un attacco, infligge a chi lo ha sferrato tanti danni quanti erano i suoi PS prima di ricevere il colpo." + }, + "dancer": { + "name": "Sincrodanza", + "description": "Permette al Pokémon di copiare immediatamente qualsiasi mossa basata sulla danza usata da un altro Pokémon in campo." + }, + "battery": { + "name": "Batteria", + "description": "Aumenta la potenza delle mosse speciali degli alleati." + }, + "fluffy": { + "name": "Morbidone", + "description": "Dimezza il danno causato dagli attacchi diretti di un nemico, ma raddoppia quello subito dalle mosse di tipo Fuoco." + }, + "dazzling": { + "name": "Corposgargiante", + "description": "Il Pokémon sbalordisce il nemico e non gli permette di attaccarlo con mosse che hanno priorità alta." + }, + "soulHeart": { + "name": "Cuoreanima", + "description": "Aumenta l'Attacco Speciale ogni volta che un Pokémon va KO." + }, + "tanglingHair": { + "name": "Boccolidoro", + "description": "Se il Pokémon viene colpito da un attacco diretto, la Velocità di chi l'ha colpito diminuisce." + }, + "receiver": { + "name": "Ricezione", + "description": "Il Pokémon acquisisce l'abilità di un alleato andato KO." + }, + "powerOfAlchemy": { + "name": "Forza Chimica", + "description": "Il Pokémon trasforma la propria abilità in quella di un alleato andato KO." + }, + "beastBoost": { + "name": "Ultraboost", + "description": "Quando il Pokémon manda KO un altro Pokémon, aumenta la propria statistica di punta." + }, + "rksSystem": { + "name": "Sistema Primevo", + "description": "Il tipo del Pokémon cambia in base alla ROM installata." + }, + "electricSurge": { + "name": "Elettrogenesi", + "description": "Quando il Pokémon entra in campo, lo trasforma in un Campo Elettrico." + }, + "psychicSurge": { + "name": "Psicogenesi", + "description": "Quando il Pokémon entra in campo, lo trasforma in un Campo Psichico." + }, + "mistySurge": { + "name": "Nebbiogenesi", + "description": "Quando il Pokémon entra in campo, lo trasforma in un Campo Nebbioso." + }, + "grassySurge": { + "name": "Erbogenesi", + "description": "Quando il Pokémon entra in campo, lo trasforma in un Campo Erboso." + }, + "fullMetalBody": { + "name": "Metalprotezione", + "description": "Impedisce la diminuzione delle statistiche causata da abilità o mosse di altri Pokémon." + }, + "shadowShield": { + "name": "Spettroguardia", + "description": "Se i PS sono al massimo, riduce il danno subito." + }, + "prismArmor": { + "name": "Scudoprisma", + "description": "Riduce i danni subiti dalle mosse superefficaci." + }, + "neuroforce": { + "name": "Cerebroforza", + "description": "Potenzia le mosse superefficaci." + }, + "intrepidSword": { + "name": "Spada Indomita", + "description": "Quando il Pokémon entra in campo, il suo Attacco aumenta." + }, + "dauntlessShield": { + "name": "Scudo Saldo", + "description": "Quando il Pokémon entra in campo, la sua Difesa aumenta." + }, + "libero": { + "name": "Libero", + "description": "Cambia il tipo del Pokémon in quello della mossa che usa." + }, + "ballFetch": { + "name": "Raccattapalle", + "description": "Se il Pokémon non ha uno strumento con sé, raccoglie la Poké Ball del primo tentativo di cattura fallito." + }, + "cottonDown": { + "name": "Lanugine", + "description": "Se il Pokémon subisce un attacco, sparge della lanugine che diminuisce la Velocità di tutti i Pokémon in campo tranne la sua." + }, + "propellerTail": { + "name": "Elicopinna", + "description": "Permette di ignorare gli effetti di mosse e abilità che attirano altre mosse." + }, + "mirrorArmor": { + "name": "Blindospecchio", + "description": "Rimanda al mittente le diminuzioni alle statistiche subite." + }, + "gulpMissile": { + "name": "Inghiottimissile", + "description": "Quando usa Surf o Sub, il Pokémon cattura una preda. Se subisce dei danni, la sputa fuori per attaccare." + }, + "stalwart": { + "name": "Volontà di Ferro", + "description": "Permette di ignorare gli effetti di mosse e abilità che attirano altre mosse." + }, + "steamEngine": { + "name": "Vapormacchina", + "description": "Se il Pokémon viene colpito da una mossa di tipo Acqua o Fuoco, la sua Velocità aumenta moltissimo." + }, + "punkRock": { + "name": "Punk Rock", + "description": "Aumenta la potenza delle mosse basate sul suono. Inoltre, dimezza i danni subiti dal Pokémon se viene colpito da tali mosse." + }, + "sandSpit": { + "name": "Sputasabbia", + "description": "Quando il Pokémon viene colpito da un attacco, scatena una tempesta di sabbia." + }, + "iceScales": { + "name": "Geloscaglie", + "description": "Scaglie di ghiaccio proteggono il Pokémon dalle mosse speciali, dimezzandone i danni subiti." + }, + "ripen": { + "name": "Maturazione", + "description": "Fa maturare le bacche raddoppiandone gli effetti." + }, + "iceFace": { + "name": "Gelofaccia", + "description": "Grazie al ghiaccio sulla testa, il Pokémon può incassare i danni causati da mosse fisiche, ma cambia forma. Torna al suo stato originale quando grandina." + }, + "powerSpot": { + "name": "Fonte Energetica", + "description": "Potenzia le mosse di chi si trova nelle immediate vicinanze." + }, + "mimicry": { + "name": "Mimetismo", + "description": "Il tipo del Pokémon cambia a seconda dello stato del campo." + }, + "screenCleaner": { + "name": "Annullabarriere", + "description": "Quando il Pokémon entra in campo, annulla l'effetto di Schermoluce, Riflesso e Velaurora sia per i nemici che per gli alleati." + }, + "steelySpirit": { + "name": "Spiritoferreo", + "description": "Potenzia gli attacchi di tipo Acciaio degli alleati." + }, + "perishBody": { + "name": "Ultimotocco", + "description": "Se il Pokémon viene colpito da un attacco diretto, dopo tre turni va KO assieme a chi lo ha attaccato. Se uno dei due viene sostituito, non va KO." + }, + "wanderingSpirit": { + "name": "Anima Errante", + "description": "Se il Pokémon subisce un attacco diretto, scambia la sua abilità con quella di chi lo ha colpito." + }, + "gorillaTactics": { + "name": "Vigorilla", + "description": "Aumenta l'Attacco ma costringe il Pokémon a usare solo la prima mossa selezionata." + }, + "neutralizingGas": { + "name": "Gas Reagente", + "description": "Se in campo c'è un Pokémon con Gas Reagente, gli effetti delle abilità di tutti gli altri Pokémon vengono annullati o non si attivano." + }, + "pastelVeil": { + "name": "Pastelvelo", + "description": "Protegge il Pokémon e gli alleati dai problemi di stato causati dal veleno." + }, + "hungerSwitch": { + "name": "Pancialterna", + "description": "Alla fine di ogni turno cambia forma, alternando tra Motivo Panciapiena e Motivo Panciavuota." + }, + "quickDraw": { + "name": "Pugni Invisibili", + "description": "Quando il Pokémon utilizza un attacco diretto, gli effetti di mosse protettive vengono ignorati." + }, + "unseenFist": { + "name": "Colpolesto", + "description": "A volte permette al Pokémon di agire per primo." + }, + "curiousMedicine": { + "name": "Stranofarmaco", + "description": "Quando il Pokémon entra in campo, sparge un farmaco dalla conchiglia che annulla le modifiche alle statistiche degli alleati." + }, + "transistor": { + "name": "Transistor", + "description": "Potenzia le mosse di tipo Elettro." + }, + "dragonsMaw": { + "name": "Dragomascelle", + "description": "Potenzia le mosse di tipo Drago." + }, + "chillingNeigh": { + "name": "Nitrito Bianco", + "description": "Quando manda KO il nemico, emette un nitrito agghiacciante, aumentando il proprio Attacco." + }, + "grimNeigh": { + "name": "Nitrito Nero", + "description": "Quando manda KO il nemico, emette un nitrito spettrale, aumentando il proprio Attacco Speciale." + }, + "asOneGlastrier": { + "name": "Sintonia Equina", + "description": "Il Pokémon ha una doppia abilità: Agitazione di Calyrex e Nitrito Bianco di Glastrier" + }, + "asOneSpectrier": { + "name": "Sintonia Equina", + "description": "Il Pokémon ha una doppia abilità: Agitazione di Calyrex e Nitrito Nero di Spectrier." + }, + "lingeringAroma": { + "name": "Odore Tenace", + "description": "L'abilità di chi entra in contatto con il Pokémon diventa Odore Tenace." + }, + "seedSower": { + "name": "Spargisemi", + "description": "Se il Pokémon subisce un attacco, il terreno entra nello stato di Campo Erboso." + }, + "thermalExchange": { + "name": "Termoscambio", + "description": "Impedisce al Pokémon di venire scottato e aumenta il suo Attacco se subisce una mossa di tipo Fuoco." + }, + "angerShell": { + "name": "Iraguscio", + "description": "Se un attacco subìto porta i PS a metà o meno, la rabbia del Pokémon ne riduce la Difesa e la Difesa Speciale ma ne aumenta l'Attacco, l'Attacco Speciale e la Velocità." + }, + "purifyingSalt": { + "name": "Sale Purificante", + "description": "Protegge il Pokémon dai problemi di stato e dimezza il danno causato dalle mosse di tipo Spettro." + }, + "wellBakedBody": { + "name": "Bentostato", + "description": "Se il Pokémon viene colpito da una mossa di tipo Fuoco, la neutralizza e aumenta di molto la propria Difesa." + }, + "windRider": { + "name": "Vento Propizio", + "description": "L'Attacco aumenta se vengono usate mosse come Ventoincoda o se il Pokémon è colpito da una mossa basata sul vento, che viene inoltre neutralizzata." + }, + "guardDog": { + "name": "Cane da Guardia", + "description": "Il Pokémon resiste a strumenti e mosse che causano la sostituzione. Se subisce l'effetto di Prepotenza, il suo Attacco aumenta." + }, + "rockyPayload": { + "name": "Portamassi", + "description": "Aumenta la potenza delle mosse di tipo Roccia." + }, + "windPower": { + "name": "Energia Eolica", + "description": "Se il Pokémon è esposto a una mossa basata sul vento, si carica di elettricità." + }, + "zeroToHero": { + "name": "Supercambio", + "description": "Se il Pokémon lascia il campo, assume la Forma Possente." + }, + "commander": { + "name": "Torre di Comando", + "description": "Quando il Pokémon entra in campo ed è presente un Dondozo alleato, si ficca nella bocca di quest'ultimo e da lì impartisce ordini." + }, + "electromorphosis": { + "name": "Convertivolt", + "description": "Se il Pokémon subisce danni, si carica di elettricità." + }, + "protosynthesis": { + "name": "Paleoattivazione", + "description": "Quando il Pokémon ha con sé una Capsula energetica o la luce solare è intensa, la sua statistica più alta aumenta." + }, + "quarkDrive": { + "name": "Carica Quark", + "description": "Quando il Pokémon ha con sé una Capsula energetica o è in presenza di un Campo Elettrico, la sua statistica più alta aumenta." + }, + "goodAsGold": { + "name": "Corpo Aureo", + "description": "Grazie al robusto e inossidabile corpo d'oro, il Pokémon è immune alle mosse di stato sferrate da altri." + }, + "vesselOfRuin": { + "name": "Vaso Nefasto", + "description": "L'Attacco Speciale degli altri Pokémon viene indebolito dal potere del vaso che richiama le disgrazie." + }, + "swordOfRuin": { + "name": "Spada Nefasta", + "description": "La Difesa degli altri Pokémon viene indebolita dal potere della spada che richiama le disgrazie." + }, + "tabletsOfRuin": { + "name": "Amuleto Nefasto", + "description": "L'Attacco degli altri Pokémon viene indebolito dal potere delle tavolette che richiamano le disgrazie." + }, + "beadsOfRuin": { + "name": "Monile Nefasto", + "description": "La Difesa Speciale degli altri Pokémon viene indebolita dal potere dei gioielli che richiamano le disgrazie." + }, + "orichalcumPulse": { + "name": "Ritmo d'Oricalco", + "description": "Quando il Pokémon entra in campo, la luce solare diventa intensa. Con la luce solare intensa l'Attacco del Pokémon aumenta grazie al battito dell'antichità." + }, + "hadronEngine": { + "name": "Motore Adronico", + "description": "Quando il Pokémon entra in campo, il terreno entra nello stato di Campo Elettrico. In presenza di Campo Elettrico l'Attacco Speciale aumenta grazie al motore del futuro." + }, + "opportunist": { + "name": "Scrocco", + "description": "Quando la statistica di un avversario viene aumentata, il Pokémon se ne approfitta e aumenta anche la propria." + }, + "cudChew": { + "name": "Ruminante", + "description": "Se il Pokémon mangia una bacca, alla fine del turno successivo questa risale dal suo stomaco per essere mangiata una seconda volta." + }, + "sharpness": { + "name": "Affilama", + "description": "Aumenta la potenza delle mosse che tagliano il bersaglio." + }, + "supremeOverlord": { + "name": "Generale Supremo", + "description": "Quando il Pokémon entra in campo, il suo Attacco e il suo Attacco Speciale aumentano un po' per ciascuno dei suoi compagni di squadra andati KO." + }, + "costar": { + "name": "Coprotagonismo", + "description": "Quando il Pokémon entra in campo, copia le modifiche alle statistiche dell'alleato." + }, + "toxicDebris": { + "name": "Mantossina", + "description": "Se il Pokémon subisce danni da mosse fisiche, piazza ai piedi degli avversari una trappola di punte velenose." + }, + "armorTail": { + "name": "Codarmatura", + "description": "La misteriosa coda che avvolge la testa del Pokémon impedisce agli avversari di usare mosse che hanno priorità alta contro di lui o i suoi alleati." + }, + "earthEater": { + "name": "Mangiaterra", + "description": "Se il Pokémon viene colpito da una mossa di tipo Terra, recupera PS anziché subire danni." + }, + "myceliumMight": { + "name": "Micoforza", + "description": "Quando usa mosse di stato, il Pokémon agisce più lentamente, ma ignora l'abilità del bersaglio se questa ha effetto su tali mosse." + }, + "mindsEye": { + "name": "Occhio Interiore", + "description": "Permette di colpire bersagli di tipo Spettro con mosse di tipo Normale e Lotta, di ignorare modifiche alla loro elusione e di non veder ridotta la propria precisione." + }, + "supersweetSyrup": { + "name": "Sciroppo Sublime", + "description": "La prima volta che il Pokémon entra in campo, spande un odore dolciastro che diminuisce l'elusione degli avversari." + }, + "hospitality": { + "name": "Ospitalità", + "description": "Quando un Pokémon con questa abilità entra in campo ricopre di attenzioni l'alleato, restituendogli un po' dei suoi PS." + }, + "toxicChain": { + "name": "Catena Tossica", + "description": "Quando il Pokémon colpisce il bersaglio con una mossa, può iperavvelenarlo grazie al potere della catena intrisa di tossine." + }, + "embodyAspectTeal": { + "name": "Albergamemorie", + "description": "Il Pokémon riporta alla mente vecchi ricordi, facendo risplendere la Maschera Focolare e aumentando il proprio Velocità." + }, + "embodyAspectWellspring": { + "name": "Albergamemorie", + "description": "Il Pokémon riporta alla mente vecchi ricordi, facendo risplendere la Maschera Fondamenta e aumentando la propria Difesa Speciale." + }, + "embodyAspectHearthflame": { + "name": "Albergamemorie", + "description": "Il Pokémon riporta alla mente vecchi ricordi, facendo risplendere la Maschera Fondamenta e aumentando la propria Attacco." + }, + "embodyAspectCornerstone": { + "name": "Albergamemorie", + "description": "Il Pokémon riporta alla mente vecchi ricordi, facendo risplendere la Maschera Fondamenta e aumentando la propria Difesa." + }, + "teraShift": { + "name": "Teramorfosi", + "description": "Quando il Pokémon entra in campo, assorbe l'energia circostante e assume la Forma Teracristal." + }, + "teraShell": { + "name": "Teraguscio", + "description": "Grazie al suo guscio che racchiude il potere di tutti i tipi, se il Pokémon ha tutti i PS, le mosse che subisce non saranno molto efficaci." + }, + "teraformZero": { + "name": "Zeroformazione", + "description": "Quando assume la Forma Astrale, Terapagos azzera tutti gli effetti delle condizioni atmosferiche e lo stato del terreno di lotta grazie al suo potere occulto." + }, + "poisonPuppeteer": { + "name": "\tMalia Tossica", + "description": "I Pokémon avvelenati dalle mosse di Pecharunt entreranno anche in stato di confusione." + } +} \ No newline at end of file diff --git a/src/locales/it/ability.ts b/src/locales/it/ability.ts deleted file mode 100644 index 5e01e02a718..00000000000 --- a/src/locales/it/ability.ts +++ /dev/null @@ -1,1244 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -export const ability: AbilityTranslationEntries = { - stench: { - name: "Tanfo", - description: "Quando il Pokémon attacca il bersaglio, può farlo tentennare grazie al cattivo odore che emana.", - }, - drizzle: { - name: "Piovischio", - description: "Quando il Pokémon entra in campo, attira la pioggia.", - }, - speedBoost: { - name: "Acceleratore", - description: "La Velocità aumenta a ogni turno.", - }, - battleArmor: { - name: "Lottascudo", - description: "Il Pokémon è protetto da una dura corazza che gli evita di subire brutti colpi.", - }, - sturdy: { - name: "Vigore", - description: "Evita che il Pokémon vada KO in un sol colpo se ha tutti i PS, e lo rende immune alle mosse che causano KO immediato.", - }, - damp: { - name: "Umidità", - description: "Aumenta l'umidità circostante, impedendo l'uso di Autodistruzione e di altre mosse esplosive.", - }, - limber: { - name: "Scioltezza", - description: "Il corpo flessibile del Pokémon gli impedisce di subire gli effetti della paralisi.", - }, - sandVeil: { - name: "Sabbiavelo", - description: "L'elusione aumenta durante le tempeste di sabbia.", - }, - static: { - name: "Statico", - description: "Il Pokémon si ricopre di elettricità statica e può causare paralisi a chi è entrato in contatto con lui.", - }, - voltAbsorb: { - name: "Assorbivolt", - description: "Se il Pokémon viene colpito da una mossa di tipo Elettro, recupera PS anziché subire danni.", - }, - waterAbsorb: { - name: "Assorbacqua", - description: "Se il Pokémon viene colpito da una mossa di tipo Acqua, recupera PS anziché subire danni.", - }, - oblivious: { - name: "Indifferenza", - description: "L'imperturbabilità del Pokémon lo protegge da infatuazioni, provocazioni e dall'effetto di Prepotenza.", - }, - cloudNine: { - name: "Antimeteo", - description: "Neutralizza gli effetti di tutte le condizioni atmosferiche.", - }, - compoundEyes: { - name: "Insettocchi", - description: "La precisione del Pokémon aumenta grazie ai suoi occhi composti.", - }, - insomnia: { - name: "Insonnia", - description: "Il Pokémon soffre d'insonnia e non può addormentarsi.", - }, - colorChange: { - name: "Cambiacolore", - description: "Il Pokémon acquisisce il tipo della mossa subita.", - }, - immunity: { - name: "Immunità", - description: "L'immunità naturale del Pokémon gli impedisce di essere avvelenato.", - }, - flashFire: { - name: "Fuocardore", - description: "Se il Pokémon subisce una mossa di tipo Fuoco, ne sfrutta il calore per potenziare le proprie mosse di tipo Fuoco.", - }, - shieldDust: { - name: "Polvoscudo", - description: "Il Pokémon è protetto da uno strato di scaglie che annulla gli effetti aggiuntivi delle mosse subite.", - }, - ownTempo: { - name: "Mente Locale", - description: "Il Pokémon affronta la vita al proprio ritmo e per questo non può essere confuso o subire l'effetto di Prepotenza.", - }, - suctionCups: { - name: "Ventose", - description: "Il Pokémon resiste a strumenti e mosse che causano la sostituzione appiccicandosi al terreno con le ventose.", - }, - intimidate: { - name: "Prepotenza", - description: "Quando il Pokémon entra in campo, la sua prepotenza crea soggezione, riducendo l'Attacco degli avversari intimiditi.", - }, - shadowTag: { - name: "Pedinombra", - description: "Il Pokémon impedisce la fuga o la sostituzione degli avversari di cui calpesta l'ombra.", - }, - roughSkin: { - name: "Cartavetro", - description: "Quando il Pokémon subisce un attacco, grazie alla sua pelle ruvida infligge a sua volta danni al Pokémon con cui è entrato in contatto.", - }, - wonderGuard: { - name: "Magidifesa", - description: "Un potere misterioso protegge il Pokémon e lo rende vulnerabile solo alle mosse superefficaci.", - }, - levitate: { - name: "Levitazione", - description: "La capacità di levitare conferisce al Pokémon immunità agli attacchi di tipo Terra.", - }, - effectSpore: { - name: "Spargispora", - description: "Può causare avvelenamento, paralisi o sonno a chi attacca il Pokémon entrando in contatto con lui.", - }, - synchronize: { - name: "Sincronismo", - description: "Se un Pokémon con questa abilità viene avvelenato, paralizzato o scottato, contagia con lo stesso problema di stato chi lo ha causato.", - }, - clearBody: { - name: "Corpochiaro", - description: "Impedisce la diminuzione delle statistiche causata da abilità o mosse di altri Pokémon.", - }, - naturalCure: { - name: "Alternacura", - description: "Quando il Pokémon lascia il campo, guarisce dai problemi di stato.", - }, - lightningRod: { - name: "Parafulmine", - description: "Il Pokémon attira e neutralizza le mosse di tipo Elettro, facendo aumentare il suo Attacco Speciale.", - }, - sereneGrace: { - name: "Leggiadro", - description: "Rende più probabili gli effetti aggiuntivi delle mosse.", - }, - swiftSwim: { - name: "Nuotovelox", - description: "Se piove, la Velocità aumenta.", - }, - chlorophyll: { - name: "Clorofilla", - description: "Se la luce del sole è intensa, la Velocità aumenta.", - }, - illuminate: { - name: "Risplendi", - description: "Illuminando l'ambiente circostante, impedisce che la precisione del pokémon sia diminuita.", - }, - trace: { - name: "Traccia", - description: "Quando il Pokémon entra in campo, copia l'abilità di un avversario.", - }, - hugePower: { - name: "Macroforza", - description: "Raddoppia la potenza degli attacchi fisici del Pokémon.", - }, - poisonPoint: { - name: "Velenopunto", - description: "Può avvelenare chi entra in contatto con il Pokémon.", - }, - innerFocus: { - name: "Forza Interiore", - description: "La capacità di concentrazione del Pokémon evita che tentenni per gli attacchi subiti e lo protegge dall'effetto di Prepotenza.", - }, - magmaArmor: { - name: "Magmascudo", - description: "Il magma riveste il corpo del Pokémon impedendogli di venire congelato.", - }, - waterVeil: { - name: "Idrovelo", - description: "Un velo d'acqua riveste il corpo del Pokémon impedendogli di venire scottato.", - }, - magnetPull: { - name: "Magnetismo", - description: "La carica magnetica attrae i Pokémon di tipo Acciaio impedendogli la fuga o la sostituzione.", - }, - soundproof: { - name: "Antisuono", - description: "Il Pokémon è dotato di una sorta di isolamento acustico che lo rende immune alle mosse basate sul suono.", - }, - rainDish: { - name: "Copripioggia", - description: "Il Pokémon recupera PS quando piove.", - }, - sandStream: { - name: "Sabbiafiume", - description: "Quando il Pokémon entra in campo, scatena una tempesta di sabbia.", - }, - pressure: { - name: "Pressione", - description: "Il Pokémon mette pressione agli avversari, facendogli consumare più PP.", - }, - thickFat: { - name: "Grassospesso", - description: "Il Pokémon è protetto da uno spesso strato di grasso che dimezza il danno causato da mosse di tipo Fuoco e Ghiaccio.", - }, - earlyBird: { - name: "Sveglialampo", - description: "Anche se il Pokémon si addormenta, può risvegliarsi due volte più velocemente.", - }, - flameBody: { - name: "Corpodifuoco", - description: "Può scottare chi entra in contatto con il Pokémon.", - }, - runAway: { - name: "Fugafacile", - description: "Garantisce la fuga dai Pokémon selvatici.", - }, - keenEye: { - name: "Sguardofermo", - description: "La vista acuta del Pokémon impedisce che la sua precisione diminuisca.", - }, - hyperCutter: { - name: "Ipertaglio", - description: "Le possenti chele o tenaglie di cui è dotato il Pokémon fanno sì che il suo Attacco non possa essere diminuito da altri.", - }, - pickup: { - name: "Raccolta", - description: "Il Pokémon può raccogliere strumenti usati da altri durante la lotta. Potrebbe raccogliere strumenti anche fuori dalla lotta.", - }, - truant: { - name: "Pigrone", - description: "Quando il Pokémon usa una mossa, nel turno successivo si riposerà.", - }, - hustle: { - name: "Tuttafretta", - description: "L'Attacco aumenta, ma la precisione diminuisce.", - }, - cuteCharm: { - name: "Incantevole", - description: "Può causare infatuazione a chi entra in contatto con il Pokémon.", - }, - plus: { - name: "Più", - description: "L'Attacco Speciale aumenta se ci sono alleati con l'abilità Meno o Più.", - }, - minus: { - name: "Meno", - description: "L'Attacco Speciale aumenta se ci sono alleati con l'abilità Meno o Più.", - }, - forecast: { - name: "Previsioni", - description: "Cambia il tipo del Pokémon in Acqua, Fuoco o Ghiaccio in base alle condizioni atmosferiche.", - }, - stickyHold: { - name: "Antifurto", - description: "Gli strumenti restano appiccicati al corpo adesivo del Pokémon e non possono essere rubati.", - }, - shedSkin: { - name: "Muta", - description: "Il Pokémon può guarire dai problemi di stato facendo la muta completa della pelle.", - }, - guts: { - name: "Dentistretti", - description: "Se il Pokémon è affetto da un problema di stato, tira fuori la grinta e aumenta il proprio Attacco.", - }, - marvelScale: { - name: "Pelledura", - description: "Se il Pokémon è affetto da un problema di stato, le squame sulla sua pelle si induriscono aumentando la sua Difesa.", - }, - liquidOoze: { - name: "Melma", - description: "La melma del Pokémon infligge danni a chi la assorbe, facendogli perdere PS a causa del fortissimo tanfo.", - }, - overgrow: { - name: "Erbaiuto", - description: "Quando al Pokémon rimangono pochi PS, la potenza delle sue mosse di tipo Erba aumenta.", - }, - blaze: { - name: "Aiutofuoco", - description: "Quando al Pokémon rimangono pochi PS, la potenza delle sue mosse di tipo Fuoco aumenta.", - }, - torrent: { - name: "Acquaiuto", - description: "Quando al Pokémon rimangono pochi PS, la potenza delle sue mosse di tipo Acqua aumenta.", - }, - swarm: { - name: "Aiutinsetto", - description: "Quando al Pokémon rimangono pochi PS, la potenza delle sue mosse di tipo Coleottero aumenta.", - }, - rockHead: { - name: "Testadura", - description: "Anche se il Pokémon usa delle mosse che causano un contraccolpo, non perde PS.", - }, - drought: { - name: "Siccità", - description: "Quando il Pokémon entra in campo, la luce solare diventa intensa.", - }, - arenaTrap: { - name: "Trappoarena", - description: "Impedisce la fuga agli avversari.", - }, - vitalSpirit: { - name: "Spiritovivo", - description: "Il Pokémon è talmente vivace che non può addormentarsi.", - }, - whiteSmoke: { - name: "Fumochiaro", - description: "Il Pokémon è protetto da un fumo chiaro che impedisce ai nemici di diminuire le sue statistiche.", - }, - purePower: { - name: "Forzapura", - description: "L'Attacco del Pokémon raddoppia grazie alla sua padronanza delle tecniche yoga.", - }, - shellArmor: { - name: "Guscioscudo", - description: "Il Pokémon è protetto da un guscio robusto che gli evita di subire brutti colpi.", - }, - airLock: { - name: "Riparo", - description: "Neutralizza gli effetti di tutte le condizioni atmosferiche.", - }, - tangledFeet: { - name: "Intricopiedi", - description: "Se il Pokémon è confuso, la sua elusione aumenta.", - }, - motorDrive: { - name: "Elettrorapid", - description: "Se il Pokémon viene colpito da una mossa di tipo Elettro, la neutralizza e sfrutta la carica elettrica per aumentare la propria Velocità.", - }, - rivalry: { - name: "Antagonismo", - description: "Rende più forti contro nemici dello stesso sesso, ma più deboli contro nemici di sesso opposto.", - }, - steadfast: { - name: "Cuordeciso", - description: "Se il Pokémon tentenna, il suo animo indomito si risveglia e la sua Velocità aumenta.", - }, - snowCloak: { - name: "Mantelneve", - description: "Se grandina, l'elusione aumenta.", - }, - gluttony: { - name: "Voracità", - description: "Il Pokémon non attende di aver perso molti PS per mangiare certe bacche, ma lo fa non appena i suoi PS scendono a metà o meno.", - }, - angerPoint: { - name: "Grancollera", - description: "Se il Pokémon subisce un brutto colpo, monta su tutte le furie e il suo Attacco aumenta al massimo.", - }, - unburden: { - name: "Agiltecnica", - description: "Se il Pokémon usa o perde uno strumento, la sua Velocità aumenta.", - }, - heatproof: { - name: "Antifuoco", - description: "Il corpo termoresistente del Pokémon dimezza i danni che subisce dalle mosse di tipo Fuoco.", - }, - simple: { - name: "Disinvoltura", - description: "Raddoppia le modifiche alle statistiche.", - }, - drySkin: { - name: "Pellearsa", - description: "Il Pokémon recupera PS se piove o se subisce mosse di tipo Acqua, ma perde PS con la luce solare intensa. Subisce più danni da mosse di tipo Fuoco.", - }, - download: { - name: "Download", - description: "Il Pokémon analizza Difesa e Difesa Speciale del nemico e, a seconda di qual è più bassa, aumenta il proprio Attacco o Attacco Speciale.", - }, - ironFist: { - name: "Ferropugno", - description: "Potenzia le mosse che utilizzano pugni.", - }, - poisonHeal: { - name: "Velencura", - description: "Se il Pokémon è avvelenato, recupera PS anziché perderli.", - }, - adaptability: { - name: "Adattabilità", - description: "Potenzia di molto le mosse dello stesso tipo del Pokémon.", - }, - skillLink: { - name: "Abillegame", - description: "Le mosse multicolpo mandano a segno sempre il massimo dei colpi possibili.", - }, - hydration: { - name: "Idratazione", - description: "Se piove, il Pokémon guarisce dai problemi di stato.", - }, - solarPower: { - name: "Solarpotere", - description: "Se la luce del sole è intensa, l'Attacco Speciale aumenta, ma il Pokémon perde PS a ogni turno.", - }, - quickFeet: { - name: "Piedisvelti", - description: "Se il Pokémon è affetto da un problema di stato, la Velocità aumenta.", - }, - normalize: { - name: "Normalità", - description: "Tutte le mosse del Pokémon diventano di tipo Normale e la loro potenza aumenta un po'.", - }, - sniper: { - name: "Cecchino", - description: "Aumenta ulteriormente i danni inflitti dai brutti colpi.", - }, - magicGuard: { - name: "Magicscudo", - description: "Il Pokémon subisce danni solo dagli attacchi.", - }, - noGuard: { - name: "Nullodifesa", - description: "Il Pokémon e chiunque lo attacchi abbassano la guardia e le loro mosse vanno sempre a segno.", - }, - stall: { - name: "Rallentatore", - description: "Il Pokémon agisce sempre per ultimo.", - }, - technician: { - name: "Tecnico", - description: "Potenzia le mosse più deboli del Pokémon.", - }, - leafGuard: { - name: "Fogliamanto", - description: "Se la luce del sole è intensa, evita i problemi di stato.", - }, - klutz: { - name: "Impaccio", - description: "Il Pokémon non può usare lo strumento che ha con sé.", - }, - moldBreaker: { - name: "Rompiforma", - description: "Quando il Pokémon attacca, ignora l'abilità del bersaglio se questa ha effetto sulle mosse.", - }, - superLuck: { - name: "Supersorte", - description: "L'incredibile fortuna del Pokémon aumenta la sua probabilità di infliggere brutti colpi.", - }, - aftermath: { - name: "Scoppio", - description: "Chi manda KO questo Pokémon con un attacco diretto subisce dei danni.", - }, - anticipation: { - name: "Presagio", - description: "Rivela se il nemico ha mosse pericolose.", - }, - forewarn: { - name: "Premonizione", - description: "Quando il Pokémon entra in campo, rivela una delle mosse del nemico.", - }, - unaware: { - name: "Imprudenza", - description: "Quando il Pokémon attacca, ignora le modifiche alle statistiche del nemico.", - }, - tintedLens: { - name: "Lentifumé", - description: "Permette alle mosse non molto efficaci di infliggere danni normalmente.", - }, - filter: { - name: "Filtro", - description: "Riduce i danni subiti dalle mosse superefficaci.", - }, - slowStart: { - name: "Lentoinizio", - description: "Dimezza per cinque turni l'Attacco e la Velocità.", - }, - scrappy: { - name: "Nervisaldi", - description: "Permette di colpire Pokémon di tipo Spettro con mosse di tipo Normale e Lotta.", - }, - stormDrain: { - name: "Acquascolo", - description: "Il Pokémon attira e neutralizza le mosse di tipo Acqua e fa aumentare il proprio Attacco Speciale.", - }, - iceBody: { - name: "Corpogelo", - description: "Se grandina, il Pokémon recupera PS.", - }, - solidRock: { - name: "Solidroccia", - description: "Riduce i danni subiti dalle mosse superefficaci.", - }, - snowWarning: { - name: "Scendineve", - description: "Quando il Pokémon entra in campo, causa l'inizio di una nevicata.", - }, - honeyGather: { - name: "Mielincetta", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", - }, - frisk: { - name: "Indagine", - description: "Quando entra in battaglia, il Pokémon può controllare il Potere di un Pokémon avversario.", - }, - reckless: { - name: "Temerarietà", - description: "Potenzia le mosse che causano contraccolpo.", - }, - multitype: { - name: "Multitipo", - description: "Cambia il tipo del Pokémon a seconda della lastra o del Cristallo Z che ha con sé.", - }, - flowerGift: { - name: "Regalfiore", - description: "Se la luce del sole è intensa, aumenta l'Attacco e la Difesa Speciale del Pokémon e dei suoi alleati.", - }, - badDreams: { - name: "Sogniamari", - description: "Infligge danni ai nemici addormentati.", - }, - pickpocket: { - name: "Arraffalesto", - description: "Se il Pokémon viene colpito da un attacco diretto, ruba lo strumento di chi lo ha attaccato.", - }, - sheerForce: { - name: "Forzabruta", - description: "Aumenta la potenza delle mosse, ma ne annulla gli effetti aggiuntivi.", - }, - contrary: { - name: "Inversione", - description: "Le modifiche alle statistiche hanno effetto inverso: le statistiche aumentano quando dovrebbero diminuire e viceversa.", - }, - unnerve: { - name: "Agitazione", - description: "Il nemico viene intimidito e non può mangiare bacche.", - }, - defiant: { - name: "Agonismo", - description: "L'Attacco aumenta di molto quando le statistiche diminuiscono a causa di un nemico.", - }, - defeatist: { - name: "Sconforto", - description: "Quando i PS scendono a metà o meno, il Pokémon si scoraggia e l'Attacco e l'Attacco Speciale vengono dimezzati.", - }, - cursedBody: { - name: "Corpofunesto", - description: "Può bloccare la mossa subita dal Pokémon.", - }, - healer: { - name: "Curacuore", - description: "A volte cura i problemi di stato degli alleati.", - }, - friendGuard: { - name: "Amicoscudo", - description: "I danni inflitti agli alleati del Pokémon vengono ridotti.", - }, - weakArmor: { - name: "Sottilguscio", - description: "Se il Pokémon subisce danni da mosse fisiche, la Difesa diminuisce e la Velocità aumenta di molto.", - }, - heavyMetal: { - name: "Metalpesante", - description: "Raddoppia il peso del Pokémon.", - }, - lightMetal: { - name: "Metalleggero", - description: "Dimezza il peso del Pokémon.", - }, - multiscale: { - name: "Multisquame", - description: "Se i PS sono al massimo, riduce il danno subito.", - }, - toxicBoost: { - name: "Velenimpeto", - description: "Se il Pokémon è avvelenato, la potenza delle sue mosse fisiche aumenta.", - }, - flareBoost: { - name: "Bruciaimpeto", - description: "Se il Pokémon è scottato, la potenza delle sue mosse speciali aumenta.", - }, - harvest: { - name: "Coglibacche", - description: "Può ricreare una bacca utilizzata.", - }, - telepathy: { - name: "Telepatia", - description: "Il Pokémon prevede ed evita gli attacchi degli alleati.", - }, - moody: { - name: "Altalena", - description: "A ogni turno, aumenta di molto una statistica e ne riduce un'altra.", - }, - overcoat: { - name: "Copricapo", - description: "Rende immuni ai danni da grandine e tempesta di sabbia, alle mosse Spora, Cottonspora, Sonnifero, Paralizzante e alle mosse “polvere”.", - }, - poisonTouch: { - name: "Velentocco", - description: "Il Pokémon può avvelenare il nemico al solo contatto.", - }, - regenerator: { - name: "Rigenergia", - description: "Il Pokémon recupera un po' di PS quando lascia il campo.", - }, - bigPecks: { - name: "Pettinfuori", - description: "Evita che la Difesa diminuisca.", - }, - sandRush: { - name: "Remasabbia", - description: "Se c'è una tempesta di sabbia, la Velocità aumenta.", - }, - wonderSkin: { - name: "Splendicute", - description: "Il Pokémon resiste più facilmente alle mosse di stato.", - }, - analytic: { - name: "Ponderazione", - description: "Se il Pokémon agisce per ultimo, la potenza della mossa aumenta.", - }, - illusion: { - name: "Illusione", - description: "Il Pokémon entra in campo con le sembianze dell'ultimo Pokémon della squadra.", - }, - imposter: { - name: "Sosia", - description: "Il Pokémon si trasforma nel nemico che ha davanti.", - }, - infiltrator: { - name: "Intrapasso", - description: "Il Pokémon attacca evitando le barriere e il sostituto del nemico.", - }, - mummy: { - name: "Mummia", - description: "Al contatto con il Pokémon, l'abilità del nemico diventa Mummia.", - }, - moxie: { - name: "Arroganza", - description: "Quando manda un nemico KO, il Pokémon si fa sicuro di sé e aumenta il proprio Attacco.", - }, - justified: { - name: "Giustizia", - description: "Quando il Pokémon viene colpito da una mossa di tipo Buio, il suo forte senso di giustizia fa sì che l'Attacco aumenti.", - }, - rattled: { - name: "Paura", - description: "Le mosse di tipo Buio, Spettro e Coleottero spaventano il Pokémon aumentandone la Velocità.", - }, - magicBounce: { - name: "Magispecchio", - description: "Il Pokémon respinge al mittente le mosse di stato senza subirne gli effetti.", - }, - sapSipper: { - name: "Mangiaerba", - description: "Se il Pokémon viene colpito da una mossa di tipo Erba, la neutralizza e aumenta il proprio Attacco.", - }, - prankster: { - name: "Burla", - description: "Le mosse di stato del Pokémon acquistano priorità alta.", - }, - sandForce: { - name: "Silicoforza", - description: "Potenzia le mosse di tipo Roccia, Terra e Acciaio durante le tempeste di sabbia.", - }, - ironBarbs: { - name: "Spineferrate", - description: "Se il Pokémon viene colpito da un attacco diretto, infligge danni a sua volta con le sue spine di ferro.", - }, - zenMode: { - name: "Stato Zen", - description: "Cambia la forma del Pokémon se i PS scendono a metà o meno.", - }, - victoryStar: { - name: "Vittorstella", - description: "Aumenta la precisione di tutta la squadra.", - }, - turboblaze: { - name: "Piroturbina", - description: "Quando il Pokémon attacca, ignora l'abilità del bersaglio se questa ha effetto sulle mosse.", - }, - teravolt: { - name: "Teravolt", - description: "Quando il Pokémon attacca, ignora l'abilità del bersaglio se questa ha effetto sulle mosse.", - }, - aromaVeil: { - name: "Aromavelo", - description: "Protegge tutta la squadra da effetti che ne limitano la libertà di scelta delle mosse.", - }, - flowerVeil: { - name: "Fiorvelo", - description: "Rende gli alleati di tipo Erba immuni alla diminuzione delle statistiche e ai problemi di stato.", - }, - cheekPouch: { - name: "Guancegonfie", - description: "Quando il Pokémon mangia una bacca, recupera anche dei PS.", - }, - protean: { - name: "Mutatipo", - description: "Cambia il tipo del Pokémon in quello della mossa che usa.", - }, - furCoat: { - name: "Foltopelo", - description: "Dimezza il danno subito dalle mosse fisiche.", - }, - magician: { - name: "Prestigiatore", - description: "Quando chi la usa colpisce un Pokémon con una mossa, gli ruba lo strumento.", - }, - bulletproof: { - name: "Antiproiettile", - description: "Protegge da alcune mosse a base di proiettili e bombe.", - }, - competitive: { - name: "Tenacia", - description: "L'Attacco Speciale aumenta di molto quando le statistiche diminuiscono a causa di un nemico.", - }, - strongJaw: { - name: "Ferromascella", - description: "La robusta mascella del Pokémon permette morsi molto potenti.", - }, - refrigerate: { - name: "Pellegelo", - description: "Le mosse di tipo Normale diventano di tipo Ghiaccio e la loro potenza aumenta un po'.", - }, - sweetVeil: { - name: "Dolcevelo", - description: "Rende il Pokémon e i suoi alleati immuni al sonno.", - }, - stanceChange: { - name: "Accendilotta", - description: "Assume la Forma Spada se usa una mossa d'attacco e la Forma Scudo se usa Scudo Reale.", - }, - galeWings: { - name: "Aliraffica", - description: "Se il Pokémon ha tutti i PS, le sue mosse di tipo Volante acquistano priorità alta.", - }, - megaLauncher: { - name: "Megalancio", - description: "Potenzia le mosse \"pulsar\", Forzasfera e Ondasana.", - }, - grassPelt: { - name: "Peloderba", - description: "In presenza di un Campo Erboso, la Difesa aumenta.", - }, - symbiosis: { - name: "Simbiosi", - description: "Se un alleato usa uno strumento, il Pokémon gli passa il proprio.", - }, - toughClaws: { - name: "Unghiedure", - description: "Potenzia le mosse che causano un contatto fisico.", - }, - pixilate: { - name: "Pellefolletto", - description: "Le mosse di tipo Normale diventano di tipo Folletto e la loro potenza aumenta un po'.", - }, - gooey: { - name: "Viscosità", - description: "Se il Pokémon viene colpito da un attacco diretto, la Velocità di chi l'ha colpito diminuisce.", - }, - aerilate: { - name: "Pellecielo", - description: "Le mosse di tipo Normale diventano di tipo Volante e la loro potenza aumenta un po'.", - }, - parentalBond: { - name: "Amorefiliale", - description: "Il Pokémon e il suo piccolo attaccano insieme.", - }, - darkAura: { - name: "Auratetra", - description: "Potenzia le mosse di tipo Buio di tutti i Pokémon.", - }, - fairyAura: { - name: "Aurafolletto", - description: "Potenzia le mosse di tipo Folletto di tutti i Pokémon.", - }, - auraBreak: { - name: "Frangiaura", - description: "Inverte gli effetti di tutte le aure riducendone la potenza.", - }, - primordialSea: { - name: "Mare Primordiale", - description: "Crea un clima che rende inefficaci gli attacchi di tipo Fuoco.", - }, - desolateLand: { - name: "Terra Estrema", - description: "Crea un clima che rende inefficaci gli attacchi di tipo Acqua.", - }, - deltaStream: { - name: "Flusso Delta", - description: "Crea un clima che annulla i punti deboli del tipo Volante.", - }, - stamina: { - name: "Sopportazione", - description: "Se il Pokémon subisce un attacco, la sua Difesa aumenta.", - }, - wimpOut: { - name: "Fuggifuggi", - description: "Se i PS scendono a metà o meno, il Pokémon si fa prendere dalla paura e abbandona la lotta in tutta fretta.", - }, - emergencyExit: { - name: "Passoindietro", - description: "Se i PS scendono a metà o meno, il Pokémon abbandona la lotta per sfuggire al pericolo.", - }, - waterCompaction: { - name: "Idrorinforzo", - description: "Se il Pokémon subisce una mossa di tipo Acqua, la sua Difesa aumenta di molto.", - }, - merciless: { - name: "Spietatezza", - description: "Gli attacchi sferrati su un bersaglio avvelenato producono sempre brutti colpi.", - }, - shieldsDown: { - name: "Scudosoglia", - description: "Se i PS scendono a metà o meno, il guscio si rompe e il Pokémon si prepara all'offensiva.", - }, - stakeout: { - name: "Sorveglianza", - description: "Raddoppia i danni inflitti a un bersaglio che è appena entrato in campo per sostituire un altro Pokémon.", - }, - waterBubble: { - name: "Bolladacqua", - description: "Riduce i danni subiti dalle mosse di tipo Fuoco e rende immuni alle scottature.", - }, - steelworker: { - name: "Tempracciaio", - description: "Aumenta la potenza delle mosse di tipo Acciaio.", - }, - berserk: { - name: "Furore", - description: "Se i PS scendono a metà o meno a causa di un attacco, l'Attacco Speciale aumenta.", - }, - slushRush: { - name: "Spalaneve", - description: "Se grandina, la Velocità aumenta.", - }, - longReach: { - name: "Distacco", - description: "Il Pokémon è in grado di usare tutte le sue mosse senza entrare in contatto diretto con il bersaglio.", - }, - liquidVoice: { - name: "Idrovoce", - description: "Le mosse del Pokémon basate sul suono diventano di tipo Acqua.", - }, - triage: { - name: "Primacura", - description: "Le mosse che ripristinano direttamente i PS del Pokémon acquistano priorità alta.", - }, - galvanize: { - name: "Pellelettro", - description: "Le mosse di tipo Normale diventano di tipo Elettro e la loro potenza aumenta un po'.", - }, - surgeSurfer: { - name: "Codasurf", - description: "In presenza di un Campo Elettrico, la Velocità raddoppia.", - }, - schooling: { - name: "Banco", - description: "Quando ha molti PS, il Pokémon forma un banco con i propri simili e si rafforza. Quando ne ha pochi, il banco si disperde.", - }, - disguise: { - name: "Fantasmanto", - description: "Il panno che ricopre il Pokémon lo protegge da un singolo attacco.", - }, - battleBond: { - name: "Morfosintonia", - description: "Se il Pokémon manda KO un nemico, il legame con l'Allenatore si rafforza, attivando la trasformazione in Greninja Forma Ash. Acqualame si potenzia.", - }, - powerConstruct: { - name: "Sciamefusione", - description: "Se i PS del Pokémon scendono a metà o meno, le cellule si raggruppano e gli permettono di assumere la Forma Perfetta.", - }, - corrosion: { - name: "Corrosione", - description: "Il Pokémon è in grado di avvelenare il bersaglio anche se questo è di tipo Acciaio o Veleno.", - }, - comatose: { - name: "Sonno Assoluto", - description: "Il Pokémon si trova in un costante stato di dormiveglia che gli impedisce di svegliarsi. Può attaccare anche da addormentato.", - }, - queenlyMajesty: { - name: "Regalità", - description: "L'aura di regalità del Pokémon impedisce al nemico di attaccarlo con mosse che hanno priorità alta.", - }, - innardsOut: { - name: "Espellinterno", - description: "Se il Pokémon viene mandato KO da un attacco, infligge a chi lo ha sferrato tanti danni quanti erano i suoi PS prima di ricevere il colpo.", - }, - dancer: { - name: "Sincrodanza", - description: "Permette al Pokémon di copiare immediatamente qualsiasi mossa basata sulla danza usata da un altro Pokémon in campo.", - }, - battery: { - name: "Batteria", - description: "Aumenta la potenza delle mosse speciali degli alleati.", - }, - fluffy: { - name: "Morbidone", - description: "Dimezza il danno causato dagli attacchi diretti di un nemico, ma raddoppia quello subito dalle mosse di tipo Fuoco.", - }, - dazzling: { - name: "Corposgargiante", - description: "Il Pokémon sbalordisce il nemico e non gli permette di attaccarlo con mosse che hanno priorità alta.", - }, - soulHeart: { - name: "Cuoreanima", - description: "Aumenta l'Attacco Speciale ogni volta che un Pokémon va KO.", - }, - tanglingHair: { - name: "Boccolidoro", - description: "Se il Pokémon viene colpito da un attacco diretto, la Velocità di chi l'ha colpito diminuisce.", - }, - receiver: { - name: "Ricezione", - description: "Il Pokémon acquisisce l'abilità di un alleato andato KO.", - }, - powerOfAlchemy: { - name: "Forza Chimica", - description: "Il Pokémon trasforma la propria abilità in quella di un alleato andato KO.", - }, - beastBoost: { - name: "Ultraboost", - description: "Quando il Pokémon manda KO un altro Pokémon, aumenta la propria statistica di punta.", - }, - rksSystem: { - name: "Sistema Primevo", - description: "Il tipo del Pokémon cambia in base alla ROM installata.", - }, - electricSurge: { - name: "Elettrogenesi", - description: "Quando il Pokémon entra in campo, lo trasforma in un Campo Elettrico.", - }, - psychicSurge: { - name: "Psicogenesi", - description: "Quando il Pokémon entra in campo, lo trasforma in un Campo Psichico.", - }, - mistySurge: { - name: "Nebbiogenesi", - description: "Quando il Pokémon entra in campo, lo trasforma in un Campo Nebbioso.", - }, - grassySurge: { - name: "Erbogenesi", - description: "Quando il Pokémon entra in campo, lo trasforma in un Campo Erboso.", - }, - fullMetalBody: { - name: "Metalprotezione", - description: "Impedisce la diminuzione delle statistiche causata da abilità o mosse di altri Pokémon.", - }, - shadowShield: { - name: "Spettroguardia", - description: "Se i PS sono al massimo, riduce il danno subito.", - }, - prismArmor: { - name: "Scudoprisma", - description: "Riduce i danni subiti dalle mosse superefficaci.", - }, - neuroforce: { - name: "Cerebroforza", - description: "Potenzia le mosse superefficaci.", - }, - intrepidSword: { - name: "Spada Indomita", - description: "Quando il Pokémon entra in campo, il suo Attacco aumenta.", - }, - dauntlessShield: { - name: "Scudo Saldo", - description: "Quando il Pokémon entra in campo, la sua Difesa aumenta.", - }, - libero: { - name: "Libero", - description: "Cambia il tipo del Pokémon in quello della mossa che usa.", - }, - ballFetch: { - name: "Raccattapalle", - description: "Se il Pokémon non ha uno strumento con sé, raccoglie la Poké Ball del primo tentativo di cattura fallito.", - }, - cottonDown: { - name: "Lanugine", - description: "Se il Pokémon subisce un attacco, sparge della lanugine che diminuisce la Velocità di tutti i Pokémon in campo tranne la sua.", - }, - propellerTail: { - name: "Elicopinna", - description: "Permette di ignorare gli effetti di mosse e abilità che attirano altre mosse.", - }, - mirrorArmor: { - name: "Blindospecchio", - description: "Rimanda al mittente le diminuzioni alle statistiche subite.", - }, - gulpMissile: { - name: "Inghiottimissile", - description: "Quando usa Surf o Sub, il Pokémon cattura una preda. Se subisce dei danni, la sputa fuori per attaccare.", - }, - stalwart: { - name: "Volontà di Ferro", - description: "Permette di ignorare gli effetti di mosse e abilità che attirano altre mosse.", - }, - steamEngine: { - name: "Vapormacchina", - description: "Se il Pokémon viene colpito da una mossa di tipo Acqua o Fuoco, la sua Velocità aumenta moltissimo.", - }, - punkRock: { - name: "Punk Rock", - description: "Aumenta la potenza delle mosse basate sul suono. Inoltre, dimezza i danni subiti dal Pokémon se viene colpito da tali mosse.", - }, - sandSpit: { - name: "Sputasabbia", - description: "Quando il Pokémon viene colpito da un attacco, scatena una tempesta di sabbia.", - }, - iceScales: { - name: "Geloscaglie", - description: "Scaglie di ghiaccio proteggono il Pokémon dalle mosse speciali, dimezzandone i danni subiti.", - }, - ripen: { - name: "Maturazione", - description: "Fa maturare le bacche raddoppiandone gli effetti.", - }, - iceFace: { - name: "Gelofaccia", - description: "Grazie al ghiaccio sulla testa, il Pokémon può incassare i danni causati da mosse fisiche, ma cambia forma. Torna al suo stato originale quando grandina.", - }, - powerSpot: { - name: "Fonte Energetica", - description: "Potenzia le mosse di chi si trova nelle immediate vicinanze.", - }, - mimicry: { - name: "Mimetismo", - description: "Il tipo del Pokémon cambia a seconda dello stato del campo.", - }, - screenCleaner: { - name: "Annullabarriere", - description: "Quando il Pokémon entra in campo, annulla l'effetto di Schermoluce, Riflesso e Velaurora sia per i nemici che per gli alleati.", - }, - steelySpirit: { - name: "Spiritoferreo", - description: "Potenzia gli attacchi di tipo Acciaio degli alleati.", - }, - perishBody: { - name: "Ultimotocco", - description: "Se il Pokémon viene colpito da un attacco diretto, dopo tre turni va KO assieme a chi lo ha attaccato. Se uno dei due viene sostituito, non va KO.", - }, - wanderingSpirit: { - name: "Anima Errante", - description: "Se il Pokémon subisce un attacco diretto, scambia la sua abilità con quella di chi lo ha colpito.", - }, - gorillaTactics: { - name: "Vigorilla", - description: "Aumenta l'Attacco ma costringe il Pokémon a usare solo la prima mossa selezionata.", - }, - neutralizingGas: { - name: "Gas Reagente", - description: "Se in campo c'è un Pokémon con Gas Reagente, gli effetti delle abilità di tutti gli altri Pokémon vengono annullati o non si attivano.", - }, - pastelVeil: { - name: "Pastelvelo", - description: "Protegge il Pokémon e gli alleati dai problemi di stato causati dal veleno.", - }, - hungerSwitch: { - name: "Pancialterna", - description: "Alla fine di ogni turno cambia forma, alternando tra Motivo Panciapiena e Motivo Panciavuota.", - }, - quickDraw: { - name: "Pugni Invisibili", - description: "Quando il Pokémon utilizza un attacco diretto, gli effetti di mosse protettive vengono ignorati.", - }, - unseenFist: { - name: "Colpolesto", - description: "A volte permette al Pokémon di agire per primo.", - }, - curiousMedicine: { - name: "Stranofarmaco", - description: "Quando il Pokémon entra in campo, sparge un farmaco dalla conchiglia che annulla le modifiche alle statistiche degli alleati.", - }, - transistor: { - name: "Transistor", - description: "Potenzia le mosse di tipo Elettro.", - }, - dragonsMaw: { - name: "Dragomascelle", - description: "Potenzia le mosse di tipo Drago.", - }, - chillingNeigh: { - name: "Nitrito Bianco", - description: "Quando manda KO il nemico, emette un nitrito agghiacciante, aumentando il proprio Attacco.", - }, - grimNeigh: { - name: "Nitrito Nero", - description: "Quando manda KO il nemico, emette un nitrito spettrale, aumentando il proprio Attacco Speciale.", - }, - asOneGlastrier: { - name: "Sintonia Equina", - description: "Il Pokémon ha una doppia abilità: Agitazione di Calyrex e Nitrito Bianco di Glastrier", - }, - asOneSpectrier: { - name: "Sintonia Equina", - description: "Il Pokémon ha una doppia abilità: Agitazione di Calyrex e Nitrito Nero di Spectrier.", - }, - lingeringAroma: { - name: "Odore Tenace", - description: "L'abilità di chi entra in contatto con il Pokémon diventa Odore Tenace.", - }, - seedSower: { - name: "Spargisemi", - description: "Se il Pokémon subisce un attacco, il terreno entra nello stato di Campo Erboso.", - }, - thermalExchange: { - name: "Termoscambio", - description: "Impedisce al Pokémon di venire scottato e aumenta il suo Attacco se subisce una mossa di tipo Fuoco.", - }, - angerShell: { - name: "Iraguscio", - description: "Se un attacco subìto porta i PS a metà o meno, la rabbia del Pokémon ne riduce la Difesa e la Difesa Speciale ma ne aumenta l'Attacco, l'Attacco Speciale e la Velocità.", - }, - purifyingSalt: { - name: "Sale Purificante", - description: "Protegge il Pokémon dai problemi di stato e dimezza il danno causato dalle mosse di tipo Spettro.", - }, - wellBakedBody: { - name: "Bentostato", - description: "Se il Pokémon viene colpito da una mossa di tipo Fuoco, la neutralizza e aumenta di molto la propria Difesa.", - }, - windRider: { - name: "Vento Propizio", - description: "L'Attacco aumenta se vengono usate mosse come Ventoincoda o se il Pokémon è colpito da una mossa basata sul vento, che viene inoltre neutralizzata.", - }, - guardDog: { - name: "Cane da Guardia", - description: "Il Pokémon resiste a strumenti e mosse che causano la sostituzione. Se subisce l'effetto di Prepotenza, il suo Attacco aumenta.", - }, - rockyPayload: { - name: "Portamassi", - description: "Aumenta la potenza delle mosse di tipo Roccia.", - }, - windPower: { - name: "Energia Eolica", - description: "Se il Pokémon è esposto a una mossa basata sul vento, si carica di elettricità.", - }, - zeroToHero: { - name: "Supercambio", - description: "Se il Pokémon lascia il campo, assume la Forma Possente.", - }, - commander: { - name: "Torre di Comando", - description: "Quando il Pokémon entra in campo ed è presente un Dondozo alleato, si ficca nella bocca di quest'ultimo e da lì impartisce ordini.", - }, - electromorphosis: { - name: "Convertivolt", - description: "Se il Pokémon subisce danni, si carica di elettricità.", - }, - protosynthesis: { - name: "Paleoattivazione", - description: "Quando il Pokémon ha con sé una Capsula energetica o la luce solare è intensa, la sua statistica più alta aumenta.", - }, - quarkDrive: { - name: "Carica Quark", - description: "Quando il Pokémon ha con sé una Capsula energetica o è in presenza di un Campo Elettrico, la sua statistica più alta aumenta.", - }, - goodAsGold: { - name: "Corpo Aureo", - description: "Grazie al robusto e inossidabile corpo d'oro, il Pokémon è immune alle mosse di stato sferrate da altri.", - }, - vesselOfRuin: { - name: "Vaso Nefasto", - description: "L'Attacco Speciale degli altri Pokémon viene indebolito dal potere del vaso che richiama le disgrazie.", - }, - swordOfRuin: { - name: "Spada Nefasta", - description: "La Difesa degli altri Pokémon viene indebolita dal potere della spada che richiama le disgrazie.", - }, - tabletsOfRuin: { - name: "Amuleto Nefasto", - description: "L'Attacco degli altri Pokémon viene indebolito dal potere delle tavolette che richiamano le disgrazie.", - }, - beadsOfRuin: { - name: "Monile Nefasto", - description: "La Difesa Speciale degli altri Pokémon viene indebolita dal potere dei gioielli che richiamano le disgrazie.", - }, - orichalcumPulse: { - name: "Ritmo d'Oricalco", - description: "Quando il Pokémon entra in campo, la luce solare diventa intensa. Con la luce solare intensa l'Attacco del Pokémon aumenta grazie al battito dell'antichità.", - }, - hadronEngine: { - name: "Motore Adronico", - description: "Quando il Pokémon entra in campo, il terreno entra nello stato di Campo Elettrico. In presenza di Campo Elettrico l'Attacco Speciale aumenta grazie al motore del futuro.", - }, - opportunist: { - name: "Scrocco", - description: "Quando la statistica di un avversario viene aumentata, il Pokémon se ne approfitta e aumenta anche la propria.", - }, - cudChew: { - name: "Ruminante", - description: "Se il Pokémon mangia una bacca, alla fine del turno successivo questa risale dal suo stomaco per essere mangiata una seconda volta.", - }, - sharpness: { - name: "Affilama", - description: "Aumenta la potenza delle mosse che tagliano il bersaglio.", - }, - supremeOverlord: { - name: "Generale Supremo", - description: "Quando il Pokémon entra in campo, il suo Attacco e il suo Attacco Speciale aumentano un po' per ciascuno dei suoi compagni di squadra andati KO.", - }, - costar: { - name: "Coprotagonismo", - description: "Quando il Pokémon entra in campo, copia le modifiche alle statistiche dell'alleato.", - }, - toxicDebris: { - name: "Mantossina", - description: "Se il Pokémon subisce danni da mosse fisiche, piazza ai piedi degli avversari una trappola di punte velenose.", - }, - armorTail: { - name: "Codarmatura", - description: "La misteriosa coda che avvolge la testa del Pokémon impedisce agli avversari di usare mosse che hanno priorità alta contro di lui o i suoi alleati.", - }, - earthEater: { - name: "Mangiaterra", - description: "Se il Pokémon viene colpito da una mossa di tipo Terra, recupera PS anziché subire danni.", - }, - myceliumMight: { - name: "Micoforza", - description: "Quando usa mosse di stato, il Pokémon agisce più lentamente, ma ignora l'abilità del bersaglio se questa ha effetto su tali mosse.", - }, - mindsEye: { - name: "Occhio Interiore", - description: "Permette di colpire bersagli di tipo Spettro con mosse di tipo Normale e Lotta, di ignorare modifiche alla loro elusione e di non veder ridotta la propria precisione.", - }, - supersweetSyrup: { - name: "Sciroppo Sublime", - description: "La prima volta che il Pokémon entra in campo, spande un odore dolciastro che diminuisce l'elusione degli avversari.", - }, - hospitality: { - name: "Ospitalità", - description: "Quando un Pokémon con questa abilità entra in campo ricopre di attenzioni l'alleato, restituendogli un po' dei suoi PS.", - }, - toxicChain: { - name: "Catena Tossica", - description: "Quando il Pokémon colpisce il bersaglio con una mossa, può iperavvelenarlo grazie al potere della catena intrisa di tossine.", - }, - embodyAspectTeal: { - name: "Albergamemorie", - description: "Il Pokémon riporta alla mente vecchi ricordi, facendo risplendere la Maschera Focolare e aumentando il proprio Velocità.", - }, - embodyAspectWellspring: { - name: "Albergamemorie", - description: "Il Pokémon riporta alla mente vecchi ricordi, facendo risplendere la Maschera Fondamenta e aumentando la propria Difesa Speciale.", - }, - embodyAspectHearthflame: { - name: "Albergamemorie", - description: "Il Pokémon riporta alla mente vecchi ricordi, facendo risplendere la Maschera Fondamenta e aumentando la propria Attacco.", - }, - embodyAspectCornerstone: { - name: "Albergamemorie", - description: "Il Pokémon riporta alla mente vecchi ricordi, facendo risplendere la Maschera Fondamenta e aumentando la propria Difesa.", - }, - teraShift: { - name: "Teramorfosi", - description: "Quando il Pokémon entra in campo, assorbe l'energia circostante e assume la Forma Teracristal.", - }, - teraShell: { - name: "Teraguscio", - description: "Grazie al suo guscio che racchiude il potere di tutti i tipi, se il Pokémon ha tutti i PS, le mosse che subisce non saranno molto efficaci.", - }, - teraformZero: { - name: "Zeroformazione", - description: "Quando assume la Forma Astrale, Terapagos azzera tutti gli effetti delle condizioni atmosferiche e lo stato del terreno di lotta grazie al suo potere occulto.", - }, - poisonPuppeteer: { - name: " Malia Tossica", - description: "I Pokémon avvelenati dalle mosse di Pecharunt entreranno anche in stato di confusione.", - }, -} as const; diff --git a/src/locales/it/achv.json b/src/locales/it/achv.json new file mode 100644 index 00000000000..d1607f6c548 --- /dev/null +++ b/src/locales/it/achv.json @@ -0,0 +1,264 @@ +{ + "Achievements": { + "name": "Obiettivi" + }, + "Locked": { + "name": "Bloccato" + }, + "MoneyAchv": { + "description": "Accumula {{moneyAmount}} PokéDollari" + }, + "10K_MONEY": { + "name": "Benestante" + }, + "100K_MONEY": { + "name": "Ricco" + }, + "1M_MONEY": { + "name": "Milionario" + }, + "10M_MONEY": { + "name": "La numero uno" + }, + "DamageAchv": { + "description": "Infliggi {{damageAmount}} danni in un colpo" + }, + "250_DMG": { + "name": "Grandi danni!" + }, + "1000_DMG": { + "name": "Incredibili danni" + }, + "2500_DMG": { + "name": "Danni a palate!" + }, + "10000_DMG": { + "name": "One Punch Man" + }, + "HealAchv": { + "description": "Cura {{healAmount}} {{HP}} tramite mossa, abilità, o oggetto" + }, + "250_HEAL": { + "name": "Paramedico" + }, + "1000_HEAL": { + "name": "Dottore" + }, + "2500_HEAL": { + "name": "Chierico" + }, + "10000_HEAL": { + "name": "Mastro Curatore" + }, + "LevelAchv": { + "description": "Porta un pokémon a Lv{{level}}" + }, + "LV_100": { + "name": "E Non Finisce Qui!" + }, + "LV_250": { + "name": "Elite" + }, + "LV_1000": { + "name": "Verso l'Infinito ed Oltre!" + }, + "RibbonAchv": { + "description": "Accumula un Totale di {{ribbonAmount}} Nastri" + }, + "10_RIBBONS": { + "name": "Campione Lega Pokémon" + }, + "25_RIBBONS": { + "name": "Campione Lega Estesa" + }, + "50_RIBBONS": { + "name": "Campione Lega Ultra" + }, + "75_RIBBONS": { + "name": "Campione Lega Rogue" + }, + "100_RIBBONS": { + "name": "Campione Lega Assoluta" + }, + "TRANSFER_MAX_STAT_STAGE": { + "name": "Lavoro di Squadra", + "description": "Trasferisci almeno sei bonus statistiche tramite staffetta" + }, + "MAX_FRIENDSHIP": { + "name": "Amiconi", + "description": "Raggiungi amicizia massima con un Pokémon" + }, + "MEGA_EVOLVE": { + "name": "Megamorfosi", + "description": "Megaevolvi un Pokémon" + }, + "GIGANTAMAX": { + "name": "Grosso e Cattivo", + "description": "Ottieni una gigamax" + }, + "TERASTALLIZE": { + "name": "STAB Per Tutti", + "description": "Teracristallizza un Pokémon" + }, + "STELLAR_TERASTALLIZE": { + "name": "Tipo Segreto", + "description": "Teracristallizza un Pokémon stellare" + }, + "SPLICE": { + "name": "Fusione Infinita", + "description": "Fondi due Pokémon insieme tramite cuneo DNA" + }, + "MINI_BLACK_HOLE": { + "name": "Universo di Oggetti", + "description": "Ottieni un Mini Buco Nero" + }, + "CATCH_MYTHICAL": { + "name": "Mitico", + "description": "Cattura un Pokémon mitico" + }, + "CATCH_SUB_LEGENDARY": { + "name": "(Semi)Leggendario", + "description": "Cattura un Pokémon semileggendario" + }, + "CATCH_LEGENDARY": { + "name": "Leggendario", + "description": "Cattura un Pokémon leggendario" + }, + "SEE_SHINY": { + "name": "Cromatico", + "description": "Trova un Pokémon shiny in natura" + }, + "SHINY_PARTY": { + "name": "Dedizione Totale", + "description": "Riempi la squadra di Pokémon shiny" + }, + "HATCH_MYTHICAL": { + "name": "Uovo Mitico", + "description": "Schiudi l'uovo di un Pokémon mitico" + }, + "HATCH_SUB_LEGENDARY": { + "name": "Uovo (Semi)Leggendario", + "description": "Schiudi l'uovo di un Pokémon semileggendario" + }, + "HATCH_LEGENDARY": { + "name": "Uovo Leggendario", + "description": "Schiudi l'uovo di un Pokémon leggendario" + }, + "HATCH_SHINY": { + "name": "Uovo Cromatico", + "description": "Schiudi l'uovo di un Pokémon shiny" + }, + "HIDDEN_ABILITY": { + "name": "Potenziale Nascosto", + "description": "Cattura un Pokémon con abilità nascosta" + }, + "PERFECT_IVS": { + "name": "Certificato di Autenticità", + "description": "Ottieni un Pokémon con IV perfetti" + }, + "CLASSIC_VICTORY": { + "name": "Imbattuto", + "description": "Vinci in modalità classica" + }, + "UNEVOLVED_CLASSIC_VICTORY": { + "name": "Alternanza scuola-lavoro", + "description": "Completa la modalità classica con almeno un membro della squadra non evoluto completamente." + }, + "MONO_GEN_ONE": { + "name": "Rivale Originale", + "description": "Completa la modalità sfida di prima generazione." + }, + "MONO_GEN_TWO": { + "name": "Generazione 1.5", + "description": "Completa la modalità sfida di seconda generazione." + }, + "MONO_GEN_THREE": { + "name": "Troppa Acqua?", + "description": "Completa la modalità sfida di terza generazione." + }, + "MONO_GEN_FOUR": { + "name": "È Davvero La Più Forte?", + "description": "Completa la modalità sfida di quarta generazione." + }, + "MONO_GEN_FIVE": { + "name": "Tutti Originali", + "description": "Completa la modalità sfida di quinta generazione." + }, + "MONO_GEN_SIX": { + "name": "Vita e Morte", + "description": "Completa la modalità sfida di sesta generazione." + }, + "MONO_GEN_SEVEN": { + "name": "Troppo amichevoli?", + "description": "Completa la modalità sfida di settima generazione." + }, + "MONO_GEN_EIGHT": { + "name": "It's champion time!", + "description": "Completa la modalità sfida di ottava generazione." + }, + "MONO_GEN_NINE": { + "name": "Paradossalmente sbalorditivi", + "description": "Completa la modalità sfida di nona generazione." + }, + "MonoType": { + "description": "Completa la modalità sfida monotipo {{type}}" + }, + "MONO_NORMAL": { + "name": "Un tipo semplice" + }, + "MONO_FIGHTING": { + "name": "Conosco il Kung-fu" + }, + "MONO_FLYING": { + "name": "È un uccello? È un aereo?" + }, + "MONO_POISON": { + "name": "I migliori di Kanto" + }, + "MONO_GROUND": { + "name": "Con i piedi per terra" + }, + "MONO_ROCK": { + "name": "Forte come una roccia!" + }, + "MONO_BUG": { + "name": "Metodo Guzma" + }, + "MONO_GHOST": { + "name": "Sono fantasmi, caro Watson" + }, + "MONO_STEEL": { + "name": "Pugno di ferro" + }, + "MONO_FIRE": { + "name": "Giocare col fuoco" + }, + "MONO_WATER": { + "name": "Piove sul bagnato" + }, + "MONO_GRASS": { + "name": "L'erba del vicino è sempre più verde" + }, + "MONO_ELECTRIC": { + "name": "Elettrizzante" + }, + "MONO_PSYCHIC": { + "name": "Mentalista" + }, + "MONO_ICE": { + "name": "Rompere il ghiaccio" + }, + "MONO_DRAGON": { + "name": "Sangue di drago" + }, + "MONO_DARK": { + "name": "Solo una fase" + }, + "MONO_FAIRY": { + "name": "Follettini e follettine" + }, + "FRESH_START": { + "name": "Buona la prima!", + "description": "Completa la modalità sfida 'Un nuovo inizio'." + } +} diff --git a/src/locales/it/achv.ts b/src/locales/it/achv.ts deleted file mode 100644 index 0ec9ad3f98a..00000000000 --- a/src/locales/it/achv.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "Achievements": { - name: "Obiettivi", - }, - "Locked": { - name: "Bloccato", - }, - - "MoneyAchv": { - description: "Accumula ₽{{moneyAmount}} PokéDollari", - }, - "10K_MONEY": { - name: "Benestante", - }, - "100K_MONEY": { - name: "Ricco", - }, - "1M_MONEY": { - name: "Milionario", - }, - "10M_MONEY": { - name: "La numero uno", - }, - - "DamageAchv": { - description: "Infliggi {{damageAmount}} danni in un colpo", - }, - "250_DMG": { - name: "Grandi danni!", - }, - "1000_DMG": { - name: "Incredibili danni", - }, - "2500_DMG": { - name: "Danni a palate!", - }, - "10000_DMG": { - name: "One Punch Man", - }, - - "HealAchv": { - description: "Cura {{healAmount}} {{HP}} tramite mossa, abilità, o oggetto", - }, - "250_HEAL": { - name: "Paramedico", - }, - "1000_HEAL": { - name: "Dottore", - }, - "2500_HEAL": { - name: "Chierico", - }, - "10000_HEAL": { - name: "Mastro Curatore", - }, - - "LevelAchv": { - description: "Porta un pokémon a Lv{{level}}", - }, - "LV_100": { - name: "E Non Finisce Qui!", - }, - "LV_250": { - name: "Elite", - }, - "LV_1000": { - name: "Verso l'Infinito ed Oltre!", - }, - - "RibbonAchv": { - description: "Accumula un Totale di {{ribbonAmount}} Nastri", - }, - "10_RIBBONS": { - name: "Campione Lega Pokémon", - }, - "25_RIBBONS": { - name: "Campione Lega Estesa", - }, - "50_RIBBONS": { - name: "Campione Lega Ultra", - }, - "75_RIBBONS": { - name: "Campione Lega Rogue", - }, - "100_RIBBONS": { - name: "Campione Lega Assoluta", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "Lavoro di Squadra", - description: "Trasferisci almeno sei bonus statistiche tramite staffetta", - }, - "MAX_FRIENDSHIP": { - name: "Amiconi", - description: "Raggiungi amicizia massima con un Pokémon", - }, - "MEGA_EVOLVE": { - name: "Megamorfosi", - description: "Megaevolvi un pokémon", - }, - "GIGANTAMAX": { - name: "Grosso e Cattivo", - description: "Ottieni una gigamax", - }, - "TERASTALLIZE": { - name: "STAB Per Tutti", - description: "Teracristallizza un Pokémon", - }, - "STELLAR_TERASTALLIZE": { - name: "Tipo Segreto", - description: "Teracristallizza un Pokémon stellare", - }, - "SPLICE": { - name: "Fusione Infinita", - description: "Fondi due Pokémon insieme tramite cuneo DNA", - }, - "MINI_BLACK_HOLE": { - name: "Universo di Oggetti", - description: "Ottieni un Mini Buco Nero", - }, - "CATCH_MYTHICAL": { - name: "Mitico", - description: "Cattura un Pokémon mitico", - }, - "CATCH_SUB_LEGENDARY": { - name: "(Semi)Leggendario", - description: "Cattura un Pokémon semileggendario", - }, - "CATCH_LEGENDARY": { - name: "Leggendario", - description: "Cattura un Pokémon leggendario", - }, - "SEE_SHINY": { - name: "Cromatico", - description: "Trova un Pokémon shiny in natura", - }, - "SHINY_PARTY": { - name: "Dedizione Totale", - description: "Riempi la squadra di Pokémon shiny", - }, - "HATCH_MYTHICAL": { - name: "Uovo Mitico", - description: "Schiudi l'uovo di un Pokémon mitico", - }, - "HATCH_SUB_LEGENDARY": { - name: "Uovo (Semi)Leggendario", - description: "Schiudi l'uovo di un Pokémon semileggendario", - }, - "HATCH_LEGENDARY": { - name: "Uovo Leggendario", - description: "Schiudi l'uovo di un Pokémon leggendario", - }, - "HATCH_SHINY": { - name: "Uovo Cromatico", - description: "Schiudi l'uovo di un Pokémon shiny", - }, - "HIDDEN_ABILITY": { - name: "Potenziale Nascosto", - description: "Cattura un Pokémon con abilità nascosta", - }, - "PERFECT_IVS": { - name: "Certificato di Autenticità", - description: "Ottieni un Pokémon con IV perfetti", - }, - "CLASSIC_VICTORY": { - name: "Imbattuto", - description: "Vinci in modalità classica", - }, - - "MONO_GEN_ONE": { - name: "Rivale Originale", - description: "Completa la modalità sfida di prima generazione.", - }, - "MONO_GEN_TWO": { - name: "Generazione 1.5", - description: "Completa la modalità sfida di seconda generazione.", - }, - "MONO_GEN_THREE": { - name: "Troppa Acqua?", - description: "Completa la modalità sfida di terza generazione.", - }, - "MONO_GEN_FOUR": { - name: "È Davvero La Più Forte?", - description: "Completa la modalità sfida di quarta generazione.", - }, - "MONO_GEN_FIVE": { - name: "Tutti Originali", - description: "Completa la modalità sfida di quinta generazione.", - }, - "MONO_GEN_SIX": { - name: "Quasi Reali", - description: "Completa la modalità sfida di sesta generazione.", - }, - "MONO_GEN_SEVEN": { - name: "Solo In Teoria", - description: "Completa la modalità sfida di settima generazione.", - }, - "MONO_GEN_EIGHT": { - name: "È Champion-time!", - description: "Completa la modalità sfida di ottava generazione.", - }, - "MONO_GEN_NINE": { - name: "Non si Stava Impegnando...", - description: "Completa la modalità sfida di nona generazione.", - }, - - "MonoType": { - description: "Completa la modalità sfida monotipo {{type}}", - }, - "MONO_NORMAL": { - name: "Un tipo semplice", - }, - "MONO_FIGHTING": { - name: "Conosco il Kung-fu", - }, - "MONO_FLYING": { - name: "È un uccello? È un aereo?", - }, - "MONO_POISON": { - name: "I migliori di Kanto", - }, - "MONO_GROUND": { - name: "Con i piedi per terra", - }, - "MONO_ROCK": { - name: "Forte come una roccia!", - }, - "MONO_BUG": { - name: "Metodo Guzma", - }, - "MONO_GHOST": { - name: "Sono fantasmi, caro Watson", - }, - "MONO_STEEL": { - name: "Pugno di ferro", - }, - "MONO_FIRE": { - name: "Giocare col fuoco", - }, - "MONO_WATER": { - name: "Piove sul bagnato", - }, - "MONO_GRASS": { - name: "L'erba del vicino è sempre più verde", - }, - "MONO_ELECTRIC": { - name: "Elettrizzante", - }, - "MONO_PSYCHIC": { - name: "Mentalista", - }, - "MONO_ICE": { - name: "Rompere il ghiaccio", - }, - "MONO_DRAGON": { - name: "Sangue di drago", - }, - "MONO_DARK": { - name: "Solo una fase", - }, - "MONO_FAIRY": { - name: "Follettini e follettine", - }, -} as const; - -// Achievement translations for the when the player character is female (it for now uses the same translations as the male version) -export const PGFachv: AchievementTranslationEntries = PGMachv; diff --git a/src/locales/it/arena-flyout.json b/src/locales/it/arena-flyout.json new file mode 100644 index 00000000000..31c2a4c0015 --- /dev/null +++ b/src/locales/it/arena-flyout.json @@ -0,0 +1,41 @@ +{ + "activeBattleEffects": "Effetti attivi in campo", + "player": "Giocatore", + "neutral": "Neutrali", + "enemy": "Nemico", + "sunny": "Sole", + "rain": "Pioggia", + "sandstorm": "Tempesta di sabbia", + "hail": "Grandine", + "snow": "Neve", + "fog": "Nebbia", + "heavyRain": "Acquazzone", + "harshSun": "Luce accecante", + "strongWinds": "Corrente d'aria misteriosa", + "misty": "Campo Nebbioso", + "electric": "Campo Elettrico", + "grassy": "Campo Erboso", + "psychic": "Campo Psichico", + "mudSport": "Fangata", + "waterSport": "Docciascudo", + "spikes": "Punte", + "toxicSpikes": "Fielepunte", + "mist": "Nebbia", + "futureSight": "Divinazione", + "doomDesire": "Desiderio Fatale", + "wish": "Desiderio", + "stealthRock": "Levitoroccia", + "stickyWeb": "Rete Vischiosa", + "trickRoom": "Distortozona", + "gravity": "Gravità", + "reflect": "Riflesso", + "lightScreen": "Schermoluce", + "auroraVeil": "Velaurora", + "quickGuard": "Anticipo", + "wideGuard": "Bodyguard", + "matBlock": "Ribaltappeto", + "craftyShield": "Truccodifesa", + "tailwind": "Ventoincoda", + "happyHour": "Cuccagna", + "safeguard": "Salvaguardia" +} diff --git a/src/locales/it/arena-tag.json b/src/locales/it/arena-tag.json new file mode 100644 index 00000000000..a1c5ee5b3c9 --- /dev/null +++ b/src/locales/it/arena-tag.json @@ -0,0 +1,8 @@ +{ + "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/battle-info.json b/src/locales/it/battle-info.json new file mode 100644 index 00000000000..57bfa03f2f3 --- /dev/null +++ b/src/locales/it/battle-info.json @@ -0,0 +1,3 @@ +{ + "generation": "{{generation}} generazione" +} \ No newline at end of file diff --git a/src/locales/it/battle-message-ui-handler.json b/src/locales/it/battle-message-ui-handler.json new file mode 100644 index 00000000000..06449cb3029 --- /dev/null +++ b/src/locales/it/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "Stellare", + "ivFantastic": "Eccellente", + "ivVeryGood": "Notevole", + "ivPrettyGood": "Normale", + "ivDecent": "Sufficiente", + "ivNoGood": "Mediocre" +} \ No newline at end of file diff --git a/src/locales/it/battle-message-ui-handler.ts b/src/locales/it/battle-message-ui-handler.ts deleted file mode 100644 index d70ab400e39..00000000000 --- a/src/locales/it/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "Stellare", - "ivFantastic": "Eccellente", - "ivVeryGood": "Notevole", - "ivPrettyGood": "Normale", - "ivDecent": "Sufficiente", - "ivNoGood": "Mediocre", -} as const; diff --git a/src/locales/it/battle-scene.json b/src/locales/it/battle-scene.json new file mode 100644 index 00000000000..ef916edbf08 --- /dev/null +++ b/src/locales/it/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "{{formattedMoney}} ₽" +} \ No newline at end of file diff --git a/src/locales/it/battle.json b/src/locales/it/battle.json new file mode 100644 index 00000000000..9b187756025 --- /dev/null +++ b/src/locales/it/battle.json @@ -0,0 +1,99 @@ +{ + "bossAppeared": "{{bossName}} è apparso.", + "trainerAppeared": "{{trainerName}}\nvuole combattere!", + "trainerAppearedDouble": "{{trainerName}}\nvogliono combattere!", + "trainerSendOut": "{{trainerName}} manda in campo\n{{pokemonName}}!", + "singleWildAppeared": "È apparso {{pokemonName}} selvatico!", + "multiWildAppeared": "Sono apparsi {{pokemonName1}}\ne {{pokemonName2}} salvatici!", + "playerComeBack": "Rientra, {{pokemonName}}!", + "trainerComeBack": "{{trainerName}} ha ritirato {{pokemonName}}!", + "playerGo": "Vai! {{pokemonName}}!", + "trainerGo": "{{trainerName}} manda in campo {{pokemonName}}!", + "switchQuestion": "Vuoi cambiare\n{{pokemonName}}?", + "trainerDefeated": "Hai sconfitto\n{{trainerName}}!", + "moneyWon": "Hai vinto {{moneyAmount}}₽", + "moneyPickedUp": "Hai raccolto ₽{{moneyAmount}}!", + "pokemonCaught": "Preso! {{pokemonName}} è stato catturato!", + "addedAsAStarter": "{{pokemonName}} è stato\naggiunto agli starter!", + "partyFull": "La tua squadra è al completo.\nVuoi liberare un Pokémon per far spazio a {{pokemonName}}?", + "pokemon": "Pokémon", + "sendOutPokemon": "Vai! {{pokemonName}}!", + "hitResultCriticalHit": "Brutto colpo!", + "hitResultSuperEffective": "È superefficace!", + "hitResultNotVeryEffective": "Non è molto efficace…", + "hitResultNoEffect": "Non ha effetto su {{pokemonName}}!", + "hitResultImmune": "{{pokemonName}} è incolume!", + "hitResultOneHitKO": "KO con un colpo!", + "attackFailed": "Ma ha fallito!", + "attackMissed": "{{pokemonNameWithAffix}}\nevita l’attacco!", + "attackHitsCount": "Colpito {{count}} volta/e!", + "rewardGain": "Ricevi\n{{modifierName}}!", + "expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!", + "levelUp": "{{pokemonName}} è salito al\nlivello {{level}}!", + "learnMove": "{{pokemonName}} impara\n{{moveName}}!", + "learnMovePrompt": "{{pokemonName}} vorrebbe imparare\n{{moveName}}.", + "learnMoveLimitReached": "Tuttavia, {{pokemonName}}\nconosce già quattro mosse.", + "learnMoveReplaceQuestion": "Vuoi che ne dimentichi una e al suo\nposto apprenda {{moveName}}?", + "learnMoveStopTeaching": "Vuoi smettere di fargli imparare\n{{moveName}}?", + "learnMoveNotLearned": "{{pokemonName}} non ha imparato\n{{moveName}}.", + "learnMoveForgetQuestion": "Quale mossa deve dimenticare?", + "learnMoveForgetSuccess": "{{pokemonName}} ha dimenticato la mossa\n{{moveName}}.", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}ta-daaaa!", + "learnMoveAnd": "E…", + "levelCapUp": "Il livello massimo\nè aumentato a {{levelCap}}!", + "moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.", + "moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!", + "moveDisabled": "{{moveName}} è disabilitata!", + "disableInterruptedMove": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è bloccata!", + "noPokeballForce": "Una forza misteriosa\nimpedisce l'uso delle Poké Ball.", + "noPokeballTrainer": "Non puoi catturare\nPokémon di altri allenatori!", + "noPokeballMulti": "Puoi lanciare una Poké Ball\nsolo quando rimane un singolo Pokémon!", + "noPokeballStrong": "Il Pokémon avversario è troppo forte per essere catturato!\nDevi prima indebolirlo.", + "noEscapeForce": "Una forza misteriosa\nimpedisce la fuga.", + "noEscapeTrainer": "Non puoi sottrarti\nalla lotta con un'allenatore!", + "noEscapePokemon": "{{moveName}} di {{pokemonName}}\npreviene la {{escapeVerb}}!", + "runAwaySuccess": "Scampato pericolo!", + "runAwayCannotEscape": "Non puoi fuggire!", + "escapeVerbSwitch": "cambiando", + "escapeVerbFlee": "fuggendo", + "notDisabled": "{{moveName}} di {{pokemonName}} non è più\ndisabilitata!", + "turnEndHpRestore": "{{pokemonName}} ha recuperato dei PS.", + "hpIsFull": "{{pokemonName}} ha già\ntutti i PS!", + "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", + "itemStackFull": "The stack for {{fullItemName}} is full.\nYou will receive {{itemName}} instead.", + "eggHatching": "Oh?", + "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?", + "stealEatBerry": "{{pokemonName}} ha rubato e mangiato\nla {{berryName}} di {{targetName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}} recupera i PP della mossa {{moveName}}\ncon la sua {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} ristabilisce la sua salute\ncon la sua {{berryName}}!", + "wildPokemonWithAffix": "{{pokemonName}} selvatico", + "foePokemonWithAffix": "{{pokemonName}} avversario", + "useMove": "{{pokemonNameWithAffix}} usa {{moveName}}!", + "drainMessage": "Viene prelevata energia\n da{{pokemonName}}!", + "regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!", + "fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!", + "statsAnd": "e", + "stats": "statistiche", + "statRose_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è aumentata!", + "statRose_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono aumentate!", + "statSharplyRose_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è aumentata molto!", + "statSharplyRose_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono aumentate molto!", + "statRoseDrastically_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è aumentata drasticamente!", + "statRoseDrastically_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono aumentate drasticamente!", + "statWontGoAnyHigher_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} non può aumentare di più!", + "statWontGoAnyHigher_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} non possono aumentare di più!", + "statFell_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è diminuita!", + "statFell_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono diminuite!", + "statHarshlyFell_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è diminuita molto!", + "statHarshlyFell_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono diminuite molto!", + "statSeverelyFell_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è diminuita drasticamente!", + "statSeverelyFell_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono diminuite drasticamente!", + "statWontGoAnyLower_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} non può diminuire di più!", + "statWontGoAnyLower_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} non possono diminuire di più!", + "transformedIntoType": "{{pokemonName}} diventa\ndi tipo {{type}} type!", + "retryBattle": "Vuoi riprovare dall'inizio della lotta?", + "unlockedSomething": "{{unlockedThing}}\nè stato/a sbloccato/a.", + "congratulations": "Congratulazioni!", + "beatModeFirstTime": "{{speciesName}} ha completato la modalità {{gameMode}} per la prima volta!\nHai ricevuto {{newModifier}}!", + "ppReduced": "I PP della mossa {{moveName}} di\n{{targetName}} sono stati ridotti di {{reduction}}!" +} diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts deleted file mode 100644 index d9af58893e5..00000000000 --- a/src/locales/it/battle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "{{bossName}} è apparso.", - "trainerAppeared": "{{trainerName}}\nvuole combattere!", - "trainerAppearedDouble": "{{trainerName}}\nvogliono combattere!", - "trainerSendOut": "{{trainerName}} manda in campo\n{{pokemonName}}!", - "singleWildAppeared": "Appare {{pokemonName}} selvatico!", - "multiWildAppeared": "Appaiono {{pokemonName1}}\ne {{pokemonName2}} salvatici!", - "playerComeBack": "Rientra, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} ha ritirato {{pokemonName}}!", - "playerGo": "Vai! {{pokemonName}}!", - "trainerGo": "{{trainerName}} manda in campo {{pokemonName}}!", - "switchQuestion": "Vuoi cambiare\n{{pokemonName}}?", - "trainerDefeated": "Hai sconfitto\n{{trainerName}}!", - "moneyWon": "Hai vinto {{moneyAmount}}₽", - "pokemonCaught": "Preso! {{pokemonName}} è stato catturato!", - "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", - "partyFull": "La tua squadra è al completo.\nVuoi liberare un Pokémon per far spazio a {{pokemonName}}?", - "pokemon": "Pokémon", - "sendOutPokemon": "Vai! {{pokemonName}}!", - "hitResultCriticalHit": "Brutto colpo!", - "hitResultSuperEffective": "È superefficace!", - "hitResultNotVeryEffective": "Non è molto efficace…", - "hitResultNoEffect": "Non ha effetto su {{pokemonName}}!", - "hitResultOneHitKO": "KO con un colpo!", - "attackFailed": "Ma ha fallito!", - "attackHitsCount": "Colpito {{count}} volta/e!", - "rewardGain": "You received\n{{modifierName}}!", - "expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!", - "levelUp": "{{pokemonName}} è salito al\nlivello {{level}}!", - "learnMove": "{{pokemonName}} impara\n{{moveName}}!", - "learnMovePrompt": "{{pokemonName}} vorrebbe imparare\n{{moveName}}.", - "learnMoveLimitReached": "Tuttavia, {{pokemonName}}\nconosce già quattro mosse.", - "learnMoveReplaceQuestion": "Vuoi che ne dimentichi una e al suo\nposto apprenda {{moveName}}?", - "learnMoveStopTeaching": "Vuoi smettere di fargli imparare\n{{moveName}}?", - "learnMoveNotLearned": "{{pokemonName}} non ha imparato\n{{moveName}}.", - "learnMoveForgetQuestion": "Quale mossa deve dimenticare?", - "learnMoveForgetSuccess": "{{pokemonName}} ha dimenticato la mossa\n{{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}ta-daaaa!", - "learnMoveAnd": "E…", - "levelCapUp": "Il livello massimo\nè aumentato a {{levelCap}}!", - "moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.", - "moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!", - "moveDisabled": "{{moveName}} è disabilitata!", - "noPokeballForce": "Una forza misteriosa\nimpedisce l'uso dell Poké Ball.", - "noPokeballTrainer": "Non puoi catturare\nPokémon di altri allenatori!", - "noPokeballMulti": "Puoi lanciare una Poké Ball\nquando rimane un solo Pokémon!", - "noPokeballStrong": "Il Pokémon avversario è troppo forte per essere catturato!\nDevi prima indebolirlo!", - "noEscapeForce": "Una forza misteriosa\nimpedisce la fuga.", - "noEscapeTrainer": "Non puoi sottrarti\nalla lotta con un'allenatore!", - "noEscapePokemon": "{{moveName}} di {{pokemonName}}\npreviene la {{escapeVerb}}!", - "runAwaySuccess": "Scampato pericolo!", - "runAwayCannotEscape": "Non puoi fuggire!", - "escapeVerbSwitch": "cambiando", - "escapeVerbFlee": "fuggendo", - "notDisabled": "{{pokemonName}}'s {{moveName}} non è più\ndisabilitata!", - "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", - "hpIsFull": "{{pokemonName}}'s\nHP is full!", - "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", - "eggHatching": "Oh!", - "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", - "wildPokemonWithAffix": "{{pokemonName}} selvatico", - "foePokemonWithAffix": "{{pokemonName}} avversario", - "useMove": "{{pokemonNameWithAffix}} usa {{moveName}}!", - "drainMessage": "Viene prelevata energia\n da{{pokemonName}}!", - "regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!", - "fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!", - "statRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!", - "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!", - "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a drasticamente!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} non può aumentare più di così!", - "statFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a!", - "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a molto!", - "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a drasticamente!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} è stato liberato\nda {{moveName}}", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} tentenna!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} è\nconfuso!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} non\nè più confuso!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} è\ngià confuso!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} è\nconfuso!", - "battlerTagsConfusedLapseHurtItself": "Si colpisce da solo per via della\nconfusione!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} è immune\na Destinobbligato.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} trascina\ncon sé{{pokemonNameWithAffix2}}!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} si è infatuato\ndi {{sourcePokemonName}}!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} è\ngià infatuato!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} è infatuato\ndi {{sourcePokemonName}}!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} è\nimmobilizzato dall'infatuazione!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} non è\npiù infatuato.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} è pieno di semi!", - "battlerTagsSeededLapse": "La salute di {{pokemonNameWithAffix}}\nviene prelevata da Parassiseme!", - "battlerTagsSeededLapseShed": "Parassiseme di {{pokemonNameWithAffix}}\nha risucchiato la melma!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} sta\navendo un Incubo!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} sta\ngià avendo un Incubo!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} è bloccato\nin un Incubo!", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} ha\nsubito Ripeti!", - "battlerTagsEncoreOnRemove": "L'effetto di Ripeti su {{pokemonNameWithAffix}}\n è terminato!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} è pronto ad\naiutare {{pokemonName}}!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} assorbe\nnutrienti dalle sue radici!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} ha messo le radici!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} si è circondato\ncon un velo d'acqua!", - "battlerTagsAquaRingLapse": "{{moveName}} ha ripristinato\ni PS di {{pokemonName}}!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} sta per addormentarsi!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} subisce danni\nper via di {{moveName}}!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} viene schiacciato da\n{{moveName}} di {{sourcePokemonName}}!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} è stato avvinghiato\nda {{sourcePokemonName}}!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel vortice!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} sta intenagliando\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nda {{moveName}}!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel magma vorticoso!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nin una tagliola!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} ha intrappolato\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} ha subito un\ninfestazione da parte di {{sourcePokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nsi è protetto!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nsi è protetto!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} si prepara a\nsubire il colpo!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} resiste\nal colpo!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} ha resistito\ngrazie a Vigore!", - "battlerTagsPerishSongLapse": "Il conto alla rovescia di Ultimocanto per {{pokemonNameWithAffix}} scende a {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} sta\nciondolando!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} non\ningrana!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} ritrova\nlo slancio!", - "battlerTagsHighestStatBoostOnAdd": "{{statName}} di {{pokemonNameWithAffix}}\nviene aumentato/a!", - "battlerTagsHighestStatBoostOnRemove": "Gli effetti di {{abilityName}}\ndi {{pokemonNameWithAffix}} sono cessati!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} si prepara\nalla lotta!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} si è rilassato.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} è stato messo sotto sale!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!" -} as const; diff --git a/src/locales/it/battler-tags.json b/src/locales/it/battler-tags.json new file mode 100644 index 00000000000..e8bda9cfd1e --- /dev/null +++ b/src/locales/it/battler-tags.json @@ -0,0 +1,73 @@ +{ + "trappedDesc": "intrappolando", + "flinchedDesc": "tentennando", + "confusedDesc": "confuso", + "infatuatedDesc": "infatuato", + "seedDesc": "pieno di semi", + "nightmareDesc": "incubi", + "ingrainDesc": "radici", + "drowsyDesc": "assonnato", + "rechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!", + "trappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!", + "trappedOnRemove": "{{pokemonNameWithAffix}} è stato liberato\nda {{moveName}}", + "flinchedLapse": "{{pokemonNameWithAffix}} tentenna!", + "confusedOnAdd": "{{pokemonNameWithAffix}} è\nconfuso!", + "confusedOnRemove": "{{pokemonNameWithAffix}} non\nè più confuso!", + "confusedOnOverlap": "{{pokemonNameWithAffix}} è\ngià confuso!", + "confusedLapse": "{{pokemonNameWithAffix}} è\nconfuso!", + "confusedLapseHurtItself": "Si colpisce da solo per via della\nconfusione!", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} è immune\na Destinobbligato.", + "destinyBondLapse": "{{pokemonNameWithAffix}} trascina\ncon sé{{pokemonNameWithAffix2}}!", + "infatuatedOnAdd": "{{pokemonNameWithAffix}} si è infatuato\ndi {{sourcePokemonName}}!", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}} è\ngià infatuato!", + "infatuatedLapse": "{{pokemonNameWithAffix}} è infatuato\ndi {{sourcePokemonName}}!", + "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} è\nimmobilizzato dall'infatuazione!", + "infatuatedOnRemove": "{{pokemonNameWithAffix}} non è\npiù infatuato.", + "seededOnAdd": "{{pokemonNameWithAffix}} è pieno di semi!", + "seededLapse": "La salute di {{pokemonNameWithAffix}}\nviene prelevata da Parassiseme!", + "seededLapseShed": "Parassiseme di {{pokemonNameWithAffix}}\nha risucchiato la melma!", + "nightmareOnAdd": "{{pokemonNameWithAffix}} sta\navendo un Incubo!", + "nightmareOnOverlap": "{{pokemonNameWithAffix}} sta\ngià avendo un Incubo!", + "nightmareLapse": "{{pokemonNameWithAffix}} è bloccato\nin un Incubo!", + "encoreOnAdd": "{{pokemonNameWithAffix}} ha\nsubito Ripeti!", + "encoreOnRemove": "L'effetto di Ripeti su {{pokemonNameWithAffix}}\n è terminato!", + "helpingHandOnAdd": "{{pokemonNameWithAffix}} è pronto ad\naiutare {{pokemonName}}!", + "ingrainLapse": "{{pokemonNameWithAffix}} assorbe\nnutrienti dalle sue radici!", + "ingrainOnTrap": "{{pokemonNameWithAffix}} ha messo le radici!", + "aquaRingOnAdd": "{{pokemonNameWithAffix}} si è circondato\ncon un velo d'acqua!", + "aquaRingLapse": "{{moveName}} ha ripristinato\ni PS di {{pokemonName}}!", + "drowsyOnAdd": "{{pokemonNameWithAffix}} sta per addormentarsi!", + "damagingTrapLapse": "{{pokemonNameWithAffix}} subisce danni\nper via di {{moveName}}!", + "bindOnTrap": "{{pokemonNameWithAffix}} viene schiacciato da\n{{moveName}} di {{sourcePokemonName}}!", + "wrapOnTrap": "{{pokemonNameWithAffix}} è stato avvinghiato\nda {{sourcePokemonName}}!", + "vortexOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel vortice!", + "clampOnTrap": "{{sourcePokemonNameWithAffix}} sta intenagliando\n{{pokemonName}}!", + "sandTombOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nda {{moveName}}!", + "magmaStormOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel magma vorticoso!", + "snapTrapOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nin una tagliola!", + "thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} ha intrappolato\n{{pokemonNameWithAffix}}!", + "infestationOnTrap": "{{pokemonNameWithAffix}} ha subito un\ninfestazione da parte di {{sourcePokemonNameWithAffix}}!", + "protectedOnAdd": "{{pokemonNameWithAffix}}\nsi è protetto!", + "protectedLapse": "{{pokemonNameWithAffix}}\nsi è protetto!", + "enduringOnAdd": "{{pokemonNameWithAffix}} si prepara a\nsubire il colpo!", + "enduringLapse": "{{pokemonNameWithAffix}} resiste\nal colpo!", + "sturdyLapse": "{{pokemonNameWithAffix}} ha resistito\ngrazie a Vigore!", + "perishSongLapse": "Il conto alla rovescia di Ultimocanto per {{pokemonNameWithAffix}} scende a {{turnCount}}.", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} è al centro\ndell’attenzione!", + "truantLapse": "{{pokemonNameWithAffix}} sta\nciondolando!", + "slowStartOnAdd": "{{pokemonNameWithAffix}} non\ningrana!", + "slowStartOnRemove": "{{pokemonNameWithAffix}} ritrova\nlo slancio!", + "highestStatBoostOnAdd": "{{statName}} di {{pokemonNameWithAffix}}\nviene aumentato/a!", + "highestStatBoostOnRemove": "Gli effetti di {{abilityName}}\ndi {{pokemonNameWithAffix}} sono cessati!", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}} si solleva in aria\na causa dell’elettromagnetismo!", + "magnetRisenOnRemove": "L’effetto dell’elettromagnetismo di {{pokemonNameWithAffix}}\nè terminato!", + "critBoostOnAdd": "{{pokemonNameWithAffix}} si prepara\nalla lotta!", + "critBoostOnRemove": "{{pokemonNameWithAffix}} si è rilassato.", + "saltCuredOnAdd": "{{pokemonNameWithAffix}} è stato messo sotto sale!", + "saltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!", + "cursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!", + "cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!", + "stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!", + "disabledOnAdd": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è stata bloccata!", + "disabledLapse": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} non è più bloccata!" +} diff --git a/src/locales/it/berry.json b/src/locales/it/berry.json new file mode 100644 index 00000000000..bb0ea99affd --- /dev/null +++ b/src/locales/it/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "Baccacedro", + "effect": "Restituisce il 25% dei PS se i PS sono sotto il 50%" + }, + "LUM": { + "name": "Baccaprugna", + "effect": "Se tenuta da un Pokémon risolve qualsiasi problema di stato" + }, + "ENIGMA": { + "name": "Baccaenigma", + "effect": "Restituisce il 25% dei PS se viene colpito da una mossa superefficace" + }, + "LIECHI": { + "name": "Baccalici", + "effect": "Aumenta l'Attacco se i PS sono sotto il 25%" + }, + "GANLON": { + "name": "Baccalongan", + "effect": "Aumenta la Difesa se i PS sono sotto il 25%" + }, + "PETAYA": { + "name": "Baccapitaya", + "effect": "Aumenta l'Attacco Speciale se i PS sono sotto il 25%" + }, + "APICOT": { + "name": "Baccacocca", + "effect": "Aumenta la Difesa Speciale se i PS sono sotto il 25%" + }, + "SALAC": { + "name": "Baccasalak", + "effect": "Aumenta la Velocità se i PS sono sotto il 25%" + }, + "LANSAT": { + "name": "Baccalangsa", + "effect": "Aumenta la probabilità di Colpo Critico se i PS sono sotto il 25%" + }, + "STARF": { + "name": "Baccambola", + "effect": "Aumenta drasticamente una statistica casuale se i PS sono sotto il 25%" + }, + "LEPPA": { + "name": "Baccamela", + "effect": "Ripristina 10 PP a una mossa se i suoi PP raggiungono lo 0" + } +} \ No newline at end of file diff --git a/src/locales/it/berry.ts b/src/locales/it/berry.ts deleted file mode 100644 index 7be40b43c32..00000000000 --- a/src/locales/it/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "Baccacedro", - effect: "Restituisce il 25% dei PS se i PS sono sotto il 50%", - }, - "LUM": { - name: "Baccaprugna", - effect: "Se tenuta da un Pokémon risolve qualsiasi problema di stato", - }, - "ENIGMA": { - name: "Baccaenigma", - effect: "Restituisce il 25% dei PS se viene colpito da una mossa superefficace", - }, - "LIECHI": { - name: "Baccalici", - effect: "Aumenta l'Attacco se i PS sono sotto il 25%", - }, - "GANLON": { - name: "Baccalongan", - effect: "Aumenta la Difesa se i PS sono sotto il 25%", - }, - "PETAYA": { - name: "Baccapitaya", - effect: "Aumenta l'Attacco Speciale se i PS sono sotto il 25%", - }, - "APICOT": { - name: "Baccacocca", - effect: "Aumenta la Difesa Speciale se i PS sono sotto il 25%", - }, - "SALAC": { - name: "Baccasalak", - effect: "Aumenta la Velocità se i PS sono sotto il 25%", - }, - "LANSAT": { - name: "Baccalangsa", - effect: "Aumenta la probabilità di Colpo Critico se i PS sono sotto il 25%", - }, - "STARF": { - name: "Baccambola", - effect: "Aumenta drasticamente una statistica casuale se i PS sono sotto il 25%", - }, - "LEPPA": { - name: "Baccamela", - effect: "Ripristina 10 PP a una mossa se i suoi PP raggiungono lo 0", - }, -} as const; diff --git a/src/locales/it/bgm-name.json b/src/locales/it/bgm-name.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/it/bgm-name.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/it/biome.ts b/src/locales/it/biome.json similarity index 86% rename from src/locales/it/biome.ts rename to src/locales/it/biome.json index 602218fa852..e2613e29b25 100644 --- a/src/locales/it/biome.ts +++ b/src/locales/it/biome.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { +{ "unknownLocation": "Da qualche parte che non ricordi", "TOWN": "Città", "PLAINS": "Pianure", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "Foresta innevata", "ISLAND": "Isola", "LABORATORY": "Laboratorio", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/it/challenges.ts b/src/locales/it/challenges.json similarity index 64% rename from src/locales/it/challenges.ts rename to src/locales/it/challenges.json index 2643b16d0f7..6e7701ef7d0 100644 --- a/src/locales/it/challenges.ts +++ b/src/locales/it/challenges.json @@ -1,8 +1,6 @@ -import { TranslationEntries } from "#app/interfaces/locales"; - -export const challenges: TranslationEntries = { +{ "title": "Modificatori delle sfide", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "illegalEvolution": "{{pokemon}} non è più utilizzabile\nsecondo le regole della sfida!", "singleGeneration": { "name": "Mono gen", "desc": "Puoi usare solo Pokémon di {{gen}} generazione.", @@ -15,11 +13,17 @@ export const challenges: TranslationEntries = { "gen_6": "6ª", "gen_7": "7ª", "gen_8": "8ª", - "gen_9": "9ª", + "gen_9": "9ª" }, "singleType": { "name": "Mono tipo", "desc": "Puoi usare solo Pokémon di tipo {{type}}.", "desc_default": "Puoi usare solo Pokémon del tipo selezionato." }, -} as const; + "freshStart": { + "name": "Un nuovo inizio", + "desc": "Puoi usare solo gli starter originali, e come se avessi appena cominciato Pokérogue.", + "value.0": "Off", + "value.1": "On" + } +} \ No newline at end of file diff --git a/src/locales/it/command-ui-handler.json b/src/locales/it/command-ui-handler.json new file mode 100644 index 00000000000..9446f3304b1 --- /dev/null +++ b/src/locales/it/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "Lotta", + "ball": "Borsa", + "pokemon": "Pokémon", + "run": "Fuga", + "actionMessage": "Cosa deve fare {{pokemonName}}?" +} \ No newline at end of file diff --git a/src/locales/it/command-ui-handler.ts b/src/locales/it/command-ui-handler.ts deleted file mode 100644 index acd0370ba05..00000000000 --- a/src/locales/it/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Lotta", - "ball": "Borsa", - "pokemon": "Pokémon", - "run": "Fuga", - "actionMessage": "Cosa deve fare {{pokemonName}}?", -} as const; diff --git a/src/locales/it/common.json b/src/locales/it/common.json new file mode 100644 index 00000000000..1b89d057a94 --- /dev/null +++ b/src/locales/it/common.json @@ -0,0 +1,8 @@ +{ + "start": "Inizia", + "luckIndicator": "Fortuna:", + "shinyOnHover": "Shiny", + "commonShiny": "Comune", + "rareShiny": "Raro", + "epicShiny": "Epico" +} \ No newline at end of file diff --git a/src/locales/it/common.ts b/src/locales/it/common.ts deleted file mode 100644 index f42fa311472..00000000000 --- a/src/locales/it/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "Inizia", -} as const; diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index ac2e37c2df5..a8cd1e4e0bd 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -1,94 +1,113 @@ -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const itConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - statusEffect: statusEffect, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather, - partyUiHandler: partyUiHandler + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory, }; diff --git a/src/locales/it/dialogue-double-battle.json b/src/locales/it/dialogue-double-battle.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/it/dialogue-double-battle.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/it/dialogue-final-boss.json b/src/locales/it/dialogue-final-boss.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/it/dialogue-final-boss.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/it/dialogue-misc.json b/src/locales/it/dialogue-misc.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/it/dialogue-misc.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/it/dialogue.json b/src/locales/it/dialogue.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/it/dialogue.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/it/dialogue.ts b/src/locales/it/dialogue.ts deleted file mode 100644 index 702b550c45a..00000000000 --- a/src/locales/it/dialogue.ts +++ /dev/null @@ -1,2669 +0,0 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Dialogue of the NPCs in the game when the player character is male (or unset) -export const PGMdialogue: DialogueTranslationEntries = { - "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. - $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..." - }, - }, - "rocket_grunt": { - "encounter": { - 1: "Prepare for trouble!" - }, - "victory": { - 1: "Team Rocket blasting off again!" - }, - }, - "magma_grunt": { - "encounter": { - 1: " If you get in the way of Team Magma, don’t expect any mercy!" - }, - "victory": { - 1: "Huh? I lost?!" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "No one who crosses Team Aqua gets any mercy, not even kids!" - }, - "victory": { - 1: "You're kidding me!" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "Don't mess with Team Galactic!" - }, - "victory": { - 1: "Shut down..." - }, - }, - "plasma_grunt": { - "encounter": { - 1: "We won't tolerate people who have different ideas!" - }, - "victory": { - 1: "Plasmaaaaaaaaa!" - }, - }, - "flare_grunt": { - "encounter": { - 1: "Fashion is most important to us!" - }, - "victory": { - 1: "The future doesn't look bright for me." - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "So! I must say, I am impressed you got here!" - }, - "victory": { - 1: "WHAT! This cannot be!" - }, - "defeat": { - 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "My old associates need me... Are you going to get in my way?" - }, - "victory": { - 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." - }, - "defeat": { - 1: "Team Rocket will be reborn again, and I will rule the world!" - } - }, - "magma_boss_maxie_1": { - "encounter": { - 1: "I will bury you by my own hand. I hope you appreciate this honor!" - }, - "victory": { - 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." - }, - "defeat": { - 1: "Team Magma will prevail!" - } - }, - "magma_boss_maxie_2": { - "encounter": { - 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" - }, - "victory": { - 1: "This... This is not.. Ngh..." - }, - "defeat": { - 1: "And now... I will transform this planet to a land ideal for humanity." - } - }, - "aqua_boss_archie_1": { - "encounter": { - 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." - }, - "victory": { - 1: "Let's meet again somewhere. I'll be sure to remember that face." - }, - "defeat": { - 1: "Brilliant! My team won't hold back now!" - } - }, - "aqua_boss_archie_2": { - "encounter": { - 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" - }, - "victory": { - 1: "Like I figured..." - }, - "defeat": { - 1: "I'll return everything in this world to its original, pure state!!" - } - }, - "galactic_boss_cyrus_1": { - "encounter": { - 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" - }, - "victory": { - 1: "Interesting. And quite curious." - }, - "defeat": { - 1: "I will create my new world..." - } - }, - "galactic_boss_cyrus_2": { - "encounter": { - 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" - }, - "victory": { - 1: "How? How? HOW?!" - }, - "defeat": { - 1: "Farewell." - } - }, - "plasma_boss_ghetsis_1": { - "encounter": { - 1: "I won't allow anyone to stop me! No matter who does what!" - }, - "victory": { - 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" - }, - "defeat": { - 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" - } - }, - "plasma_boss_ghetsis_2": { - "encounter": { - 1: "Come now! I want to see your face at the moment you lose all hope!" - }, - "victory": { - 1: "My calculations... No! My careful schemes! The world should be mine!" - }, - "defeat": { - 1: "Kyurem! Use Absofusion!" - } - }, - "flare_boss_lysandre_1": { - "encounter": { - 1: "Do you want to stop me? Show me in battle." - }, - "victory": { - 1: "You are here to stop me. But I ask you to wait. " - }, - "defeat": { - 1: "Pokemon...Shall no longer exist." - } - }, - "flare_boss_lysandre_2": { - "encounter": { - 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" - }, - "victory": { - 1: "Whaugh!" - }, - "defeat": { - 1: "Fools with no vision will continue to befoul this beautiful world." - } - }, - "brock": { - "encounter": { - 1: "My expertise on Rock-type Pokémon will take you down! Come on!", - 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. - $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... - $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? - $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… - $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. - $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. - $I believed that tale, so I have secretly trained here all my life. As a result, I can now see what others cannot. - $I see a shadow of the person who will make the Pokémon appear. - $I believe that person is me! You're going to help me reach that level!`, - 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. - $I envy you for that…`, - 3: "How is this possible…", - 4: `I don't think our potentials are so different. - $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. - $… 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. - $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? - $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… - $They're both great subjects for my camera! Fantastic! This'll be just fantastic! - $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… - $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! - $But I should tell you, I'm tough because I know how to focus.`, - 2: `Pokémon, fashion, romance… It's all about focus! - $I'll show you just what I mean. Get ready to lose!` - }, - "victory": { - 1: "I must say, I'm warmed up to you! I might even admire you a little.", - 2: `Wow! You're great! You've earned my respect! - $I think your focus and will bowled us over totally. ` - }, - "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… - $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'. - $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. - $That's good! Looking real good! All right! - $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. - $Yes, the bond I developed with Pokémon is extremely tight. - $So, come on, just try and see if you can even inflict damage on my Pokémon!`, - }, - "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. - $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! - $The all-consuming heat overwhelms. - $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? - $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. - $I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. - $And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!`, - }, - "victory": { - 1: `Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. - $I find much joy in having met you and your Pokémon. You have proven yourself worthy.`, - }, - "defeat": { - 1: "A grand illusion!" - } - }, - "lorelei": { - "encounter": { - 1: `No one can best me when it comes to icy Pokémon! Freezing moves are powerful! - $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. - $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. - $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. - $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. - $Your Pokémon believed in you and did their best to earn you the win. - $Even though I've lost, I find myself with this silly grin!`, - }, - "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. - $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? - $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… - $You look like a Pokémon Trainer with refined strength and deepened kindness. - $What I look for in my opponent is superb strength… - $Please unleash your power to the fullest!`, - }, - "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… - $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! - $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! - $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. - $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. - $This is gonna be a doozy of a battle! - $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… - $The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. - $Since you've made it this far, I'll put that aside and battle you. - $Let me see if you'll achieve as much glory as the hero of my book!,` - }, - "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… - $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… - $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? - $What have you felt, meeting so many other Trainers out there? - $Traveling this rich land… Has it awoken something inside you? - $I want you to come at me with all that you've learned. - $My Pokémon and I will respond in turn with all that we know!`, - }, - "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! - $I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! - #And they are battling alongside Pokémon that have been through countless difficult battles! - $If I battle with people like that, not only will I get stronger, my Pokémon will, too! - $And we'll get to know each other even better! OK! Brace yourself! - $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, - }, - "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. - $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. - $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… - $But what a champion time it's been! - $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. - $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. - $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. - $With more young Trainers taking charge, the future of Pokémon is bright! - $So, as a wall for young people, I'll take your challenge!`, - }, - "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… - $I hope you're the Trainer who'll make me remember how fun it is to battle!`, - }, - "victory": { - 1: `You've got me beat… - $Your desire and the noble way your Pokémon battled for you… - $I even felt thrilled during our match. That was a very good battle.`, - }, - "defeat": { - 1: `It was not shocking at all… - $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. - $OK! I can hear my battle muse loud and clear. Let's get straight to it!`, - 2: `Of course, I'm really proud of all of my Pokémon! - $Well now… Let's get right to it!` - }, - "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. - $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! - $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? - $I love being on the summit! 'Cause you can see forever and ever from high places! - $So, how about you and I have some fun?`, - }, - "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. - $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. - $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. - $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. - $That is all there really is to it. - $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. - $Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. - $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, - }, - "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… - $But really, I just do it 'cause it's fun. - $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. - $But that means your opponent is also working hard to win. - $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? - $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! - $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. - $It's a real curse. - $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? - $... - $Let's get this show on the road! How strong is our challenger? - $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: "Preparati ad affrontare l’allenatore più in gamba di Unima!" - }, - "victory": { - 1: "Ben fatto! Hai un talento invidiabile." - }, - "defeat": { - 1: `Un freddo vento attraversa il mio cuore... - $Che battaglia!` - } - }, - "kieran": { - "encounter": { - 1: `Attraverso il duro lavoro, divento sempre più forte! - $Non perdo mai.` - }, - "victory": { - 1: `Non posso crederci… - $Che battaglia mozzafiato!` - }, - "defeat": { - 1: `Cavoli, che scontro! - $È ora che tu ti alleni ancora più duramente.` - } - }, - "rival": { - "encounter": { - 1: `@c{smile}Hey, I was looking for you! I knew you were eager to get going but I expected at least a goodbye… - $@c{smile_eclosed}So you're really pursuing your dream after all?\n 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…\nWho 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? - $@c{smile_ehalf}You're going after your dream, huh?\nThat day is really today isn't it… - $@c{smile}Anyway, I'll forgive you for forgetting me, but on one condition. @c{smile_wave_wink}You have to battle me! - $@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? - $@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. - $@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful! - $@c{smile_wave}Do your best like always! I believe in you!` - }, - }, - "rival_2": { - "encounter": { - 1: `@c{smile}Hey, you're here too?\n@c{smile_eclosed}Still a perfect record, huh…? - $@c{serious_mopen_fists}I know it kind of looks like I followed you here, but that's mostly not true. - $@c{serious_smile_fists}Honestly though, I've been itching for a rematch since you beat me back at home. - $I've been doing a lot of my own training so I'll definitely put up a fight this time. - $@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. - $@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 - $@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n - $@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all. - $@c{smile}Anyway, take care!` - }, - }, - "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! - $@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. - $@c{smile_ehalf}I'm happy for you but I just want to let you know that it's OK to lose sometimes. - $@c{smile}We learn from our mistakes, often more than we would if we kept succeeding. - $@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… - $@c{smile}Aw well. That just means I'll have to train even harder for next time! - $@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~. - $@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this! - $@c{smile_wave}Keep at it!` - }, - "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. - $@c{neutral_eclosed}Things have been kind of… strange.\nIt's not the same back home without you. - $@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. - $@c{serious}Never losing once is just unrealistic.\nWe need to lose sometimes in order to grow. - $@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? - $@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! - $@c{smile_ehalf}But really, don't you miss home by now? Or… me?\nI… I mean, we've really missed you. - $@c{smile_eclosed}I support you in your dream and everything, but the reality is you're going to lose sooner or later. - $@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. - $I won't mince words or pleasantries with you.\n@c{neutral_eclosed}I'm here to win, plain and simple. - $@c{serious_mhalf_fists}I've learned to maximize my potential by putting all my time into training. - $@c{smile}You get a lot of extra time when you cut out the unnecessary sleep and social interaction. - $@c{serious_mopen_fists}None of that matters anymore, not until I win. - $@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. - $@c{angry_mhalf}Losing is for the weak, and I'm not weak anymore. - $@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? - $@c{smile}You should be proud of how far you made it. Congrats!\nBut it looks like it's the end of your journey. - $@c{smile_eclosed}You've awoken something in me I never knew was there.\nIt seems like all I do now is train. - $@c{smile_ehalf}I hardly even eat or sleep now, I just train my Pokémon all day, getting stronger every time. - $@c{neutral}In fact, I… hardly recognize myself. - $And now, I've finally reached peak performance.\nI don't think anyone could beat me now. - $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. - $@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. - $@c{neutral}I've had some time to reflect on all this.\nThere's a reason this all seems so strange. - $@c{neutral_eclosed}Your dream, my drive to beat you…\nIt's all a part of something greater. - $@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. - $@c{neutral_eclosed}Whether I've fulfilled that purpose I can't say, but I've done everything in my power. - $@c{neutral}This place we ended up in is terrifying… Yet somehow I feel unphased, like I've been here before. - $@c{serious_mhalf_fists}You feel the same, don't you? - $@c{serious}…and it's like something here is speaking to me.\nThis is all the world's known for a long time now. - $Those times we cherished together that seem so recent are nothing but a distant memory. - $@c{neutral_eclosed}Who can say whether they were ever even real in the first place. - $@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. - $@c{serious_smile_fists}I hardly know what any of this means, I just know that it's true. - $@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. - $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. - $@c{smile_eclosed}You know, I keep going around and around in my head… - $@c{smile_ehalf}There's something to all this, why everything seems so strange now… - $@c{smile}You have your dream, and I have this ambition in me… - $I just can't help but feel there's a greater purpose to all this, to what we're doing, you and I. - $@c{smile_eclosed}I think I'm supposed to push you… to your limits. - $@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. - $It's something about this strange and dreadful place… Everything seems so clear… - $This… is all the world's known for a long time now. - $@c{smile_eclosed}It's like I can barely remember the memories we cherished together. - $@c{smile_ehalf}Were they even real? They seem so far away now… - $@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. - $@c{smile_ehalf}I… don't know what all this means… but I feel it's true. - $@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… - $@c{smile_eclosed}Promise me… After you heal the world… Please… come home safe. - $@c{smile_ehalf}…Thank you.` - - }, - }, -}; - - -// Dialogue of the NPCs in the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = PGMdialogue; - -// Dialogue of the endboss of the game when the player character is male (Or unset) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `It appears the time has finally come once again.\nYou know why you have come here, do you not? - $You were drawn here, because you have been here before.\nCountless times. - $Though, perhaps it can be counted.\nTo be precise, this is in fact your 5,643,853rd cycle. - $Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain. - $Until now you have yet to succeed, but I sense a different presence in you this time.\n - $You are the only one here, though it is as if there is… another. - $Will you finally prove a formidable challenge to me?\nThe challenge I have longed for for millennia? - $We begin.`, - "firstStageWin": `I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back. - $Do not disappoint me.`, - "secondStageWin": "…Magnificent." -}; - -// Dialogue of the endboss of the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDialogue; - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now. - $@c{smile}It's over.@d{64} You ended the loop. - $@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once. - $@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it? - $@c{serious_smile_fists}Your legend will always live on in our hearts. - $@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home. - $@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. - $@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop. - $@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once. - $I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget! - $@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts. - $@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place. - $Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?`, -}; -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; - - -// Dialogue of the named double battles in the game. For when the player is male (or unset). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `Blue: Hey Red, let's show them what we're made of! - $Red: ... - $Blue: This is Pallet Town Power!`, - }, - "victory": { - 1: `Blue: That was a great battle! - $Red: ...`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `Red: ...! - $Blue: He never talks much. - $Blue: But dont let that fool you! He is a champ after all!`, - }, - "victory": { - 1: `Red: ...! - $Blue: Next time we will beat you!`, - }, - }, - "tate_liza_double": { - "encounter": { - 1: `Tate: Are you suprised? - $Liza: We are two gym leaders at once! - $Tate: We are twins! - $Liza: We dont need to talk to understand each other! - $Tate: Twice the power... - $Liza: Can you handle it?`, - }, - "victory": { - 1: `Tate: What? Our combination was perfect! - $Liza: Looks like we need to train more...`, - }, - }, - "liza_tate_double": { - "encounter": { - 1: `Liza: Hihihi... Are you suprised? - $Tate: Yes, we are really two gym leaders at once! - $Liza: This is my twin brother Tate! - $Tate: And this is my twin sister Liza! - $Liza: Don't you think we are a perfect combination?` - }, - "victory": { - 1: `Liza: Are we... - $Tate: ...not as strong as we thought?`, - }, - }, - "wallace_steven_double": { - "encounter": { - 1: `Steven: Wallace, let's show them the power of the champions! - $Wallace: We will show you the power of Hoenn! - $Steven: Let's go!`, - }, - "victory": { - 1: `Steven: That was a great battle! - $Wallace: We will win next time!`, - }, - }, - "steven_wallace_double": { - "encounter": { - 1: `Steven: Do you have any rare pokémon? - $Wallace: Steven... We are here for a battle, not to show off our pokémon. - $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! - $Wallace: Steven...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `Alder: We are the strongest trainers in Unova! - $Iris: Fights against strong trainers are the best!`, - }, - "victory": { - 1: `Alder: Wow! You are super strong! - $Iris: We will win next time!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `Iris: Welcome Challenger! I am THE Unova Champion! - $Alder: Iris, aren't you a bit too excited?`, - }, - "victory": { - 1: `Iris: A loss like this is not easy to take... - $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! - $Piers: We bring darkness!`, - }, - "victory": { - 1: `Marnie: You brought light to our darkness! - $Piers: Its too bright...`, - }, - }, - "marnie_piers_double": { - "encounter": { - 1: `Piers: Ready for a concert? - $Marnie: Brother... They are here to fight, not to sing...`, - }, - "victory": { - 1: `Piers: Now that was a great concert! - $Marnie: Brother...`, - }, - }, -}; - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = PGMdoubleBattleDialogue; diff --git a/src/locales/it/egg.json b/src/locales/it/egg.json new file mode 100644 index 00000000000..9f3baddf975 --- /dev/null +++ b/src/locales/it/egg.json @@ -0,0 +1,26 @@ +{ + "egg": "Uovo", + "defaultTier": "Comune", + "greatTier": "Raro", + "ultraTier": "Epico", + "masterTier": "Leggendario", + "hatchWavesMessageSoon": "Si sentono dei rumori provenienti dall'interno. Si schiuderà presto!", + "hatchWavesMessageClose": "Sembra muoversi di tanto in tanto. Potrebbe essere prossimo alla schiusa.", + "hatchWavesMessageNotClose": "Cosa uscirà da qui? Pare che non si schiuderà presto.", + "hatchWavesMessageLongTime": "Sembra che questo uovo impiegherà ancora molto tempo per schiudersi.", + "gachaTypeLegendary": "Tasso dei leggendari aumentato", + "gachaTypeMove": "Tasso delle mosse rare da uova aumentato", + "gachaTypeShiny": "Tasso degli shiny aumentato", + "selectMachine": "Seleziona un macchinario.", + "notEnoughVouchers": "Non hai abbastanza biglietti!", + "tooManyEggs": "Hai troppe uova!", + "pull": "tiro", + "pulls": "tiri", + "sameSpeciesEgg": "{{species}} si schiuderà da quest'uovo!", + "hatchFromTheEgg": "Dall’Uovo è nato {{pokemonName}}!", + "eggMoveUnlock": "Mossa da uovo sbloccata: {{moveName}}", + "rareEggMoveUnlock": "Mossa da uovo rara sbloccata: {{moveName}}", + "moveUPGacha": "Mossa +", + "shinyUPGacha": "Shiny +", + "legendaryUPGacha": "+" +} \ No newline at end of file diff --git a/src/locales/it/egg.ts b/src/locales/it/egg.ts deleted file mode 100644 index 9b60b2f1835..00000000000 --- a/src/locales/it/egg.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { - "egg": "Uovo", - "defaultTier": "Comune", - "greatTier": "Raro", - "ultraTier": "Epico", - "masterTier": "Leggendario", - "hatchWavesMessageSoon": "Si sentono dei suoni provenienti dall'interno! Si schiuderà presto!", - "hatchWavesMessageClose": "Sembra muoversi di tanto in tanto. Potrebbe essere prossimo alla schiusa.", - "hatchWavesMessageNotClose": "Cosa uscirà da qui? Non sembra si schiuderà presto.", - "hatchWavesMessageLongTime": "Sembra che questo uovo impiegherà molto tempo per schiudersi.", - "gachaTypeLegendary": "Tasso dei Leggendari Aumentato", - "gachaTypeMove": "Tasso delle Mosse Rare delle Uova Aumentato", - "gachaTypeShiny": "Tasso degli Shiny Aumentato", - "selectMachine": "Seleziona un distributore.", - "notEnoughVouchers": "Non hai abbastanza Biglietti!", - "tooManyEggs": "Hai troppe Uova!", - "pull": "Tiro", - "pulls": "Tiri", - "sameSpeciesEgg": "{{species}} will hatch from this egg!", - "hatchFromTheEgg": "Dall’Uovo è nato {{pokemonName}}!", - "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", - "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", -} as const; diff --git a/src/locales/it/fight-ui-handler.json b/src/locales/it/fight-ui-handler.json new file mode 100644 index 00000000000..969d8dad370 --- /dev/null +++ b/src/locales/it/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "Potenza", + "accuracy": "Precisione", + "abilityFlyInText": "{{passive}} {{pokemonName}} {{abilityName}}", + "passive": "Passiva di " +} \ No newline at end of file diff --git a/src/locales/it/fight-ui-handler.ts b/src/locales/it/fight-ui-handler.ts deleted file mode 100644 index 91f1c3c19f4..00000000000 --- a/src/locales/it/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Potenza", - "accuracy": "Precisione", - "abilityFlyInText": "{{passive}} {{pokemonName}} {{abilityName}}", - "passive": "Passiva di ", // The space at the end is important -} as const; diff --git a/src/locales/it/filter-bar.json b/src/locales/it/filter-bar.json new file mode 100644 index 00000000000..d2346d8d3b1 --- /dev/null +++ b/src/locales/it/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "Gen", + "typeFilter": "Tipo", + "caughtFilter": "Catturati", + "unlocksFilter": "Altro", + "miscFilter": "Misc", + "sortFilter": "Ordina", + "all": "Tutto", + "normal": "Non shiny", + "uncaught": "Mancante", + "passive": "Passiva", + "passiveUnlocked": "Passiva sbloccata", + "passiveLocked": "Passiva bloccata", + "passiveUnlockable": "Passiva sbloccabile", + "costReduction": "Riduzione costo", + "costReductionUnlocked": "Costo ridotto", + "costReductionLocked": "Costo non ridotto", + "costReductionUnlockable": "Costo riducibile", + "favorite": "Preferiti", + "isFavorite": "Preferiti - Sì", + "notFavorite": "Preferiti - No", + "ribbon": "Fiocco", + "hasWon": "Fiocco - Sì", + "hasNotWon": "Fiocco - No", + "hiddenAbility": "Abilità speciale", + "hasHiddenAbility": "Abilità speciale - Sì", + "noHiddenAbility": "Abilità speciale - No", + "egg": "Uova", + "eggPurchasable": "Uovo acquistabile", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Sì", + "noPokerus": "Pokérus - No", + "sortByNumber": "Num. Dex", + "sortByCost": "Costo", + "sortByCandies": "Caramelle", + "sortByIVs": "IVs", + "sortByName": "Nome" +} \ No newline at end of file diff --git a/src/locales/it/game-mode.json b/src/locales/it/game-mode.json new file mode 100644 index 00000000000..4b0f0448bef --- /dev/null +++ b/src/locales/it/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "Classica", + "endless": "Infinita", + "endlessSpliced": "Infinita (fusioni)", + "dailyRun": "Run giornaliera", + "unknown": "Sconosciuta", + "challenge": "Sfida" +} \ No newline at end of file diff --git a/src/locales/it/game-mode.ts b/src/locales/it/game-mode.ts deleted file mode 100644 index 88bc39e4a76..00000000000 --- a/src/locales/it/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "Classica", - "endless": "Infinita", - "endlessSpliced": "Infinita (fusioni)", - "dailyRun": "Run giornaliera", - "unknown": "Sconosciuta", - "challenge": "Sfida", -} as const; diff --git a/src/locales/it/game-stats-ui-handler.ts b/src/locales/it/game-stats-ui-handler.json similarity index 75% rename from src/locales/it/game-stats-ui-handler.ts rename to src/locales/it/game-stats-ui-handler.json index f4b5f80e23b..605b759b69e 100644 --- a/src/locales/it/game-stats-ui-handler.ts +++ b/src/locales/it/game-stats-ui-handler.json @@ -1,44 +1,42 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Statistiche", - "playTime": "Tempo di gioco", - "totalBattles": "Battaglie totali", - "starters": "Starters", - "shinyStarters": "Starters shiny", - "speciesSeen": "Specie viste", - "speciesCaught": "Specie catturate", - "ribbonsOwned": "Fiocchi ottenuti", - "classicRuns": "Run in modalità classica", - "classicWins": "Vittorie in modalità classica", - "dailyRunAttempts": "Tentativi di run giornaliere", - "dailyRunWins": "Run giornaliere vinte", - "endlessRuns": "Run in modalità infinita", - "highestWaveEndless": "Orda più alta raggiunta (Infinita)", - "highestMoney": "Patrimonio maggiore posseduto", - "highestDamage": "Danni maggiori inflitti", - "highestHPHealed": "PS maggiori rigenerati", - "pokemonEncountered": "Pokémon incontrati", - "pokemonDefeated": "Pokémon sconfitti", - "pokemonCaught": "Pokémon catturati", - "eggsHatched": "Uova schiuse", - "subLegendsSeen": "Semi-leggendari visti", - "subLegendsCaught": "Semi-leggendari catturati", - "subLegendsHatched": "Semi-leggendari schiusi", - "legendsSeen": "Leggendari visti", - "legendsCaught": "Leggendari catturati", - "legendsHatched": "Leggendari schiusi", - "mythicalsSeen": "Mitici visti", - "mythicalsCaught": "Mitici catturati", - "mythicalsHatched": "Mitici schiusi", - "shiniesSeen": "Shiny visti", - "shiniesCaught": "Shiny catturati", - "shiniesHatched": "Shiny schiusi", - "pokemonFused": "Pokémon fusi", - "trainersDefeated": "Allenatori sconfitti", - "eggsPulled": "Uova ottenute", - "rareEggsPulled": "Uova rare ottenute", - "epicEggsPulled": "Uova epiche ottenute", - "legendaryEggsPulled": "Uova leggendarie ottenute", - "manaphyEggsPulled": "Uova di Manaphy ottenute", -} as const; +{ + "stats": "Statistiche", + "playTime": "Tempo di gioco", + "totalBattles": "Battaglie totali", + "starters": "Starters", + "shinyStarters": "Starters shiny", + "speciesSeen": "Specie viste", + "speciesCaught": "Specie catturate", + "ribbonsOwned": "Fiocchi ottenuti", + "classicRuns": "Totale run (classica)", + "classicWins": "Totale Vittorie (classica)", + "dailyRunAttempts": "Tentativi di run giornaliere", + "dailyRunWins": "Run giornaliere vinte", + "endlessRuns": "Run in modalità infinita", + "highestWaveEndless": "Orda più alta (Infinita)", + "highestMoney": "Miglior patrimonio", + "highestDamage": "Danni maggiori inflitti", + "highestHPHealed": "PS maggiori rigenerati", + "pokemonEncountered": "Pokémon incontrati", + "pokemonDefeated": "Pokémon sconfitti", + "pokemonCaught": "Pokémon catturati", + "eggsHatched": "Uova schiuse", + "subLegendsSeen": "Semi-leggendari visti", + "subLegendsCaught": "Semi-leggendari catturati", + "subLegendsHatched": "Semi-leggendari schiusi", + "legendsSeen": "Leggendari visti", + "legendsCaught": "Leggendari catturati", + "legendsHatched": "Leggendari schiusi", + "mythicalsSeen": "Mitici visti", + "mythicalsCaught": "Mitici catturati", + "mythicalsHatched": "Mitici schiusi", + "shiniesSeen": "Shiny visti", + "shiniesCaught": "Shiny catturati", + "shiniesHatched": "Shiny schiusi", + "pokemonFused": "Pokémon fusi", + "trainersDefeated": "Allenatori sconfitti", + "eggsPulled": "Uova ottenute", + "rareEggsPulled": "Uova rare ottenute", + "epicEggsPulled": "Uova epiche ottenute", + "legendaryEggsPulled": "Uova leggendarie ottenute", + "manaphyEggsPulled": "Uova di Manaphy ottenute" +} \ No newline at end of file diff --git a/src/locales/it/growth.ts b/src/locales/it/growth.json similarity index 55% rename from src/locales/it/growth.ts rename to src/locales/it/growth.json index 8132137d9fe..c7dd0507eeb 100644 --- a/src/locales/it/growth.ts +++ b/src/locales/it/growth.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { +{ "Erratic": "Irregolare", "Fast": "Veloce", "Medium_Fast": "Medio-Veloce", "Medium_Slow": "Medio-Lenta", "Slow": "Lenta", "Fluctuating": "Fluttuante" -} as const; +} \ No newline at end of file diff --git a/src/locales/it/menu-ui-handler.json b/src/locales/it/menu-ui-handler.json new file mode 100644 index 00000000000..7776825f1fe --- /dev/null +++ b/src/locales/it/menu-ui-handler.json @@ -0,0 +1,29 @@ +{ + "GAME_SETTINGS": "Impostazioni", + "ACHIEVEMENTS": "Obiettivi", + "STATS": "Statistiche", + "RUN_HISTORY": "Run precedenti", + "EGG_LIST": "Lista uova", + "EGG_GACHA": "Macchine uova", + "MANAGE_DATA": "Gestisci dati", + "COMMUNITY": "Community", + "SAVE_AND_QUIT": "Salva ed esci", + "LOG_OUT": "Disconnettiti", + "slot": "Slot {{slotNumber}}", + "importSession": "Importa sessione", + "importSlotSelect": "Seleziona uno slot in cui importare.", + "exportSession": "Esporta sessione", + "exportSlotSelect": "Seleziona uno slot da cui esportare.", + "importRunHistory":"Importa run precedenti", + "exportRunHistory":"Esporta run precedenti", + "importData": "Importa dati", + "exportData": "Esporta dati", + "consentPreferences": "Consenti preferenze", + "linkDiscord": "Collega Discord", + "unlinkDiscord": "Scollega Discord", + "linkGoogle": "Collega Google", + "unlinkGoogle": "Scollega Google", + "cancel": "Annulla", + "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Confermi?", + "noEggs": "Non stai schiudendo\nuova al momento!" +} \ No newline at end of file diff --git a/src/locales/it/menu-ui-handler.ts b/src/locales/it/menu-ui-handler.ts deleted file mode 100644 index 7aae9e26f6d..00000000000 --- a/src/locales/it/menu-ui-handler.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": "Impostazioni", - "ACHIEVEMENTS": "Trofei", - "STATS": "Statistiche", - "VOUCHERS": "Biglietti", - "EGG_LIST": "Lista Uova", - "EGG_GACHA": "Gacha Uova", - "MANAGE_DATA": "Gestisci Dati", - "COMMUNITY": "Community", - "SAVE_AND_QUIT": "Salva ed Esci", - "LOG_OUT": "Disconnettiti", - "slot": "Slot {{slotNumber}}", - "importSession": "Importa Sessione", - "importSlotSelect": "Seleziona uno slot in cui importare.", - "exportSession": "Esporta Sessione", - "exportSlotSelect": "Seleziona uno slot da cui esportare.", - "importData": "Importa Dati", - "exportData": "Esporta Dati", - "cancel": "Annulla", - "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Procedere?", - "noEggs": "You are not hatching\nany eggs at the moment!" -} as const; diff --git a/src/locales/it/menu.ts b/src/locales/it/menu.json similarity index 79% rename from src/locales/it/menu.ts rename to src/locales/it/menu.json index 3336373a6c3..5a40ae05087 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.json @@ -1,11 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const menu: SimpleTranslationEntries = { +{ "cancel": "Annulla", "continue": "Continua", "newGame": "Nuova partita", @@ -17,6 +10,7 @@ export const menu: SimpleTranslationEntries = { "username": "Nome utente", "password": "Password", "login": "Accedi", + "orUse": "O usa", "register": "Registrati", "emptyUsername": "Nome utente mancante!", "invalidLoginUsername": "Nome utente non valido!", @@ -38,9 +32,9 @@ export const menu: SimpleTranslationEntries = { "weeklyRankings": "Classifica settimanale", "noRankings": "Nessuna classifica", "positionIcon": "#", - "usernameScoreboard": "Username", - "score": "Score", - "wave": "Wave", + "usernameScoreboard": "Nome utente", + "score": "Punteggio", + "wave": "Onda", "loading": "Caricamento…", "loadingAsset": "Caricamento asset: {{assetName}}", "playersOnline": "Giocatori online", @@ -49,10 +43,15 @@ export const menu: SimpleTranslationEntries = { "pauseEvolutionsQuestion": "Vuoi sospendere le evoluzioni per {{pokemonName}}?\nPossono essere riattivate dalla schermata del party.", "evolutionsPaused": "Le evoluzioni sono state sospese per {{pokemonName}}.", "evolutionDone": "Congratulazioni!\n{{pokemonName}} si è evoluto in {{evolvedPokemonName}}!", - "yes":"Si", - "no":"No", + "yes": "Si", + "no": "No", "disclaimer": "DISCLAIMER", "disclaimerDescription": "Questo gioco è un prodotto incompleto; si potrebbero riscontrare errori (inclusa la perdita dei dati di salvataggio),\ncambiamenti impercettibili, e non è detto che venga aggiornato nel tempo o mai completato del tutto.", - "choosePokemon": "Choose a Pokémon.", - "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", -} as const; + "choosePokemon": "Scegli un Pokémon.", + "renamePokemon": "Rinomina un Pokémon", + "rename": "Rinomina", + "nickname": "Nickname", + "errorServerDown": "Poffarbacco! C'è stato un errore nella comunicazione col server.\n\nPuoi lasciare questa finestra aperta,\nil gioco si riconnetterà automaticamente.", + "noSaves": "Non ci sono file di salvataggio registrati!", + "tooManySaves": "Ci sono troppi file di salvataggio registrati!" +} diff --git a/src/locales/it/modifier-select-ui-handler.json b/src/locales/it/modifier-select-ui-handler.json new file mode 100644 index 00000000000..f07d8dd2680 --- /dev/null +++ b/src/locales/it/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "Trasferisci", + "reroll": "Rerolla", + "lockRarities": "Blocca le rarità", + "checkTeam": "Stato squadra", + "transferDesc": "Trasferisci un oggetto da un Pokémon ad un altro.", + "rerollDesc": "Spendi soldi per rerollare le ricompense.", + "lockRaritiesDesc": "Blocca le rarità al reroll (influisce sui costi).", + "checkTeamDesc": "Controlla la squadra Pokémon.", + "rerollCost": "{{formattedMoney}}₽", + "itemCost": "{{formattedMoney}}₽" +} \ No newline at end of file diff --git a/src/locales/it/modifier-type.json b/src/locales/it/modifier-type.json new file mode 100644 index 00000000000..f06755bdfa0 --- /dev/null +++ b/src/locales/it/modifier-type.json @@ -0,0 +1,607 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{modifierCount}}x {{pokeballName}}", + "description": "Ricevi {{pokeballName}} x{{modifierCount}} (Inventario: {{pokeballAmount}}) \nTasso di cattura: {{catchRate}}." + }, + "AddVoucherModifierType": { + "name": "{{modifierCount}}x {{voucherTypeName}}.", + "description": "Ricevi {{voucherTypeName}} x{{modifierCount}}." + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}} non può prendere\nquesto oggetto!", + "tooMany": "{{pokemonName}} possiede già\nquesto oggetto in abbondanza." + } + }, + "PokemonHpRestoreModifierType": { + "description": "Restituisce {{restorePoints}} PS o {{restorePercent}}% PS ad un Pokémon, a seconda del valore più alto.", + "extra": { + "fully": "Restituisce tutti i PS ad un Pokémon.", + "fullyWithStatus": "Restituisce tutti i PS ad un Pokémon e lo cura da ogni problema di stato." + } + }, + "PokemonReviveModifierType": { + "description": "Rianima un Pokémon esausto e gli restituisce il {{restorePercent}}% dei PS totali." + }, + "PokemonStatusHealModifierType": { + "description": "Cura tutti i problemi di stato di un Pokémon." + }, + "PokemonPpRestoreModifierType": { + "description": "Restituisce {{restorePoints}} PP per una mossa di un Pokémon.", + "extra": { + "fully": "Restituisce tutti i PP di una mossa." + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "Restituisce {{restorePoints}} PP a tutte le mosse di un Pokémon.", + "extra": { + "fully": "Restituisce tutti i PP a tutte le mosse di un Pokémon." + } + }, + "PokemonPpUpModifierType": { + "description": "Aumenta i PP di una mossa di {{upPoints}} per ogni 5 PP (massimo 3)." + }, + "PokemonNatureChangeModifierType": { + "name": "Menta {{natureName}}.", + "description": "Cambia la natura del Pokémon in {{natureName}} e sblocca la natura nel menu degli starter." + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "Quadruplica la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie." + }, + "TempStatStageBoosterModifierType": { + "description": "Aumenta la statistica {{stat}} di {{amount}}\na tutti i Pokémon nel gruppo per 5 battaglie", + "extra": { + "stage": "un livello", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon." + }, + "PokemonLevelIncrementModifierType": { + "description": "Aumenta il livello di un Pokémon di {{levels}}." + }, + "AllPokemonLevelIncrementModifierType": { + "description": "Aumenta il livello di tutti i Pokémon della squadra di {{levels}}." + }, + "BaseStatBoosterModifierType": { + "description": "Aumenta l'/la {{stat}} di base del possessore del 10%." + }, + "AllPokemonFullHpRestoreModifierType": { + "description": "Restituisce il 100% dei PS a tutti i Pokémon." + }, + "AllPokemonFullReviveModifierType": { + "description": "Rianima tutti i Pokémon esausti restituendogli tutti i PS." + }, + "MoneyRewardModifierType": { + "description": "Garantisce una {{moneyMultiplier}} quantità di soldi (₽{{moneyAmount}}).", + "extra": { + "small": "contenuta", + "moderate": "moderata", + "large": "grande" + } + }, + "ExpBoosterModifierType": { + "description": "Aumenta il guadagno di Punti Esperienza del {{boostPercent}}%." + }, + "PokemonExpBoosterModifierType": { + "description": "Aumenta il guadagno di Punti Esperienza del possessore del {{boostPercent}}%." + }, + "PokemonFriendshipBoosterModifierType": { + "description": "Aumenta del 50% il guadagno di amicizia per vittoria." + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "Aumenta la precisione delle mosse di {{accuracyAmount}} (massimo 100)." + }, + "PokemonMultiHitModifierType": { + "description": "Gli attacchi colpiscono una volta in più al costo di una riduzione di potenza del 60/75/82,5% per mossa." + }, + "TmModifierType": { + "name": "MT{{moveId}} - {{moveName}}.", + "description": "Insegna {{moveName}} a un Pokémon." + }, + "TmModifierTypeWithInfo": { + "name": "MT{{moveId}} - {{moveName}}", + "description": "Insegna {{moveName}} a un Pokémon\n(Tieni premuto C o Shift per maggiori informazioni)." + }, + "EvolutionItemModifierType": { + "description": "Fa evolvere determinate specie di Pokémon." + }, + "FormChangeItemModifierType": { + "description": "Fa cambiare forma a determinati Pokémon." + }, + "FusePokemonModifierType": { + "description": "Combina due Pokémon (trasferisce i poteri, divide le statistiche e i tipi base, condivide il pool di mosse)." + }, + "TerastallizeModifierType": { + "name": "Teralite {{teraType}}", + "description": "Teracristallizza in {{teraType}} il possessore per massimo 10 battaglie." + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "Quando il possessore attacca, c'è una probabilità del {{chancePercent}}% che l'oggetto in possesso del nemico gli venga rubato." + }, + "TurnHeldItemTransferModifierType": { + "description": "Ogni turno, il possessore acquisisce un oggetto posseduto dal nemico." + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "Aggiunge una probabilità del {{chancePercent}}% di infliggere {{statusEffect}} con le mosse d'attacco." + }, + "EnemyEndureChanceModifierType": { + "description": "Aggiunge una probabilità del {{probabilitàPercent}}% di resistere ad un colpo." + }, + "RARE_CANDY": { + "name": "Caramella rara" + }, + "RARER_CANDY": { + "name": "Caramella molto rara" + }, + "MEGA_BRACELET": { + "name": "Megapolsiera", + "description": "Le megapietre diventano disponibili." + }, + "DYNAMAX_BAND": { + "name": "Polsino Dynamax", + "description": "I fungomax diventano disponibili." + }, + "TERA_ORB": { + "name": "Terasfera", + "description": "I teraliti diventano disponibili." + }, + "MAP": { + "name": "Mappa", + "description": "Permette di scegliere la propria strada a un bivio." + }, + "POTION": { + "name": "Pozione" + }, + "SUPER_POTION": { + "name": "Superpozione" + }, + "HYPER_POTION": { + "name": "Iperpozione" + }, + "MAX_POTION": { + "name": "Pozione max" + }, + "FULL_RESTORE": { + "name": "Ricarica totale" + }, + "REVIVE": { + "name": "Revitalizzante" + }, + "MAX_REVIVE": { + "name": "Revitalizzante max" + }, + "FULL_HEAL": { + "name": "Cura totale" + }, + "SACRED_ASH": { + "name": "Cenere magica" + }, + "REVIVER_SEED": { + "name": "Revitalseme", + "description": "Il possessore recupera 1/2 di PS in caso di KO causato da un colpo diretto." + }, + "WHITE_HERB": { + "name": "Erbachiara", + "description": "Strumento da dare a un Pokémon. Ripristina le statistiche ridotte in lotta." + }, + "ETHER": { + "name": "Etere" + }, + "MAX_ETHER": { + "name": "Etere max" + }, + "ELIXIR": { + "name": "Elisir" + }, + "MAX_ELIXIR": { + "name": "Elisir max" + }, + "PP_UP": { + "name": "PP-su" + }, + "PP_MAX": { + "name": "PP-max" + }, + "LURE": { + "name": "Esca" + }, + "SUPER_LURE": { + "name": "Super esca" + }, + "MAX_LURE": { + "name": "Esca max" + }, + "MEMORY_MUSHROOM": { + "name": "Fungo della memoria", + "description": "Permette di insegnare nuovamente una mossa dimenticata ad un Pokémon." + }, + "EXP_SHARE": { + "name": "Condividi esperienza", + "description": "Tutti i Pokémon della squadra ricevono il 20% dei Punti Esperienza dalla lotta, anche se non vi hanno partecipato." + }, + "EXP_BALANCE": { + "name": "Bilancia esperienza", + "description": "Bilancia i Punti Esperienza ricevuti verso i Pokémon della squadra di livello inferiore." + }, + "OVAL_CHARM": { + "name": "Ovamuleto", + "description": "Quando più Pokémon partecipano a una battaglia, ognuno di essi riceve il 10% in più dell'esperienza totale." + }, + "EXP_CHARM": { + "name": "Esperienzamuleto" + }, + "SUPER_EXP_CHARM": { + "name": "Esperienzamuleto super" + }, + "GOLDEN_EXP_CHARM": { + "name": "Esperienzamuleto dorato" + }, + "LUCKY_EGG": { + "name": "Fortunuovo" + }, + "GOLDEN_EGG": { + "name": "Uovo dorato" + }, + "SOOTHE_BELL": { + "name": "Calmanella" + }, + "SCOPE_LENS": { + "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." + }, + "EVIOLITE": { + "name": "Evolcondensa", + "description": "Misteriosa materia evolutiva. Aumenta la Difesa e la Difesa Speciale di un Pokémon che può ancora evolversi." + }, + "SOUL_DEW": { + "name": "Cuorugiada", + "description": "Aumenta del 10% l'influenza della natura di un Pokémon sulle sue statistiche (cumulativo)." + }, + "NUGGET": { + "name": "Pepita" + }, + "BIG_NUGGET": { + "name": "Granpepita" + }, + "RELIC_GOLD": { + "name": "Dobloantico" + }, + "AMULET_COIN": { + "name": "Monetamuleto", + "description": "Aumenta le ricompense in denaro del 20%." + }, + "GOLDEN_PUNCH": { + "name": "Pugno dorato", + "description": "Fornisce il 50% dei danni inflitti sottoforma di denaro." + }, + "COIN_CASE": { + "name": "Salvadanaio", + "description": "Dopo ogni 10° battaglia, fornisce il 10% del proprio denaro in interessi." + }, + "LOCK_CAPSULE": { + "name": "Capsula scrigno", + "description": "Permette di bloccare le rarità degli oggetti quando si fa un reroll (i costi variano in base alle rarità)." + }, + "GRIP_CLAW": { + "name": "Presartigli" + }, + "WIDE_LENS": { + "name": "Grandelente" + }, + "MULTI_LENS": { + "name": "Multilente" + }, + "HEALING_CHARM": { + "name": "Curamuleto", + "description": "Aumenta del 10% l'efficacia delle mosse e degli oggetti che ripristinano i PS (escluse le rianimazioni)." + }, + "CANDY_JAR": { + "name": "Barattolo di caramelle", + "description": "Aumenta di 1 il numero di livelli aggiunti dalle caramelle rare." + }, + "BERRY_POUCH": { + "name": "Porta bacche", + "description": "Aggiunge il 30% di possibilità che una bacca usata non venga consumata." + }, + "FOCUS_BAND": { + "name": "Bandana", + "description": "Il possessore ottiene il 10% di possibilità aggiuntivo di evitare un potenziale KO e rimanere con un solo PS." + }, + "QUICK_CLAW": { + "name": "Rapidartigli", + "description": "Aggiunge una probabilità del 10% di muoversi per primi, indipendentemente dalla velocità (priorità escluse)." + }, + "KINGS_ROCK": { + "name": "Roccia di re", + "description": "Aggiunge il 10% di possibilità che una mossa d'attacco faccia tentennare l'avversario." + }, + "LEFTOVERS": { + "name": "Avanzi", + "description": "Ripristina 1/16 dei PS massimi di un Pokémon ogni turno." + }, + "SHELL_BELL": { + "name": "Conchinella", + "description": "Cura il possessore di 1/8 del danno inflitto ad un Pokémon." + }, + "TOXIC_ORB": { + "name": "Tossicsfera", + "description": "Sfera bizzarra che iperavvelena chi l’ha con sé in una lotta." + }, + "FLAME_ORB": { + "name": "Fiammosfera", + "description": "Sfera bizzarra che procura una scottatura a chi l’ha con sé in una lotta." + }, + "BATON": { + "name": "Staffetta", + "description": "Permette di trasmettere gli effetti quando si cambia Pokémon, aggirando anche le trappole." + }, + "SHINY_CHARM": { + "name": "Cromamuleto", + "description": "Misterioso amuleto luminoso che aumenta la probabilità di incontrare Pokémon cromatici." + }, + "ABILITY_CHARM": { + "name": "Abilitamuleto", + "description": "Aumenta drasticamente la possibilità che un Pokémon selvatico abbia un'abilità nascosta." + }, + "IV_SCANNER": { + "name": "Scanner IV", + "description": "Permette di scansionare gli IV dei Pokémon selvatici. Vengono rivelati 2 IV per ogni scanner. I migliori IV vengono mostrati per primi." + }, + "DNA_SPLICERS": { + "name": "Cuneo DNA" + }, + "MINI_BLACK_HOLE": { + "name": "Piccolo buco nero" + }, + "GOLDEN_POKEBALL": { + "name": "Poké Ball dorata", + "description": "Aggiunge 1 opzione di oggetto extra alla fine di ogni battaglia." + }, + "ENEMY_DAMAGE_BOOSTER": { + "name": "Gettone del danno", + "description": "Aumenta i danni inflitti del 5%." + }, + "ENEMY_DAMAGE_REDUCTION": { + "name": "Gettone della protezione", + "description": "Riduce i danni ricevuti del 2.5%." + }, + "ENEMY_HEAL": { + "name": "Gettone del recupero", + "description": "Cura il 2% dei PS massimi ogni turno." + }, + "ENEMY_ATTACK_POISON_CHANCE": { + "name": "Gettone del veleno" + }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { + "name": "Gettone della paralisi" + }, + "ENEMY_ATTACK_BURN_CHANCE": { + "name": "Gettone della bruciatura" + }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { + "name": "Gettone guarigione completa", + "description": "Aggiunge una probabilità del 2.5% a ogni turno di guarire da un problema di stato." + }, + "ENEMY_ENDURE_CHANCE": { + "name": "Gettone di resistenza" + }, + "ENEMY_FUSED_CHANCE": { + "name": "Gettone della fusione", + "description": "Aggiunge l'1% di possibilità che un Pokémon selvatico sia una fusione." + } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { + "name": "Elettropalla", + "description": "Strumento da dare a Pikachu. Sfera insolita che aumenta l’Attacco e l’Attacco Speciale." + }, + "THICK_CLUB": { + "name": "Osso spesso", + "description": "Strumento da dare a Cubone o Marowak. Osso duro che aumenta l’Attacco." + }, + "METAL_POWDER": { + "name": "Metalpolvere", + "description": "Strumento da dare a Ditto. Strana polvere finissima e al tempo stesso dura che migliora la Difesa." + }, + "QUICK_POWDER": { + "name": "Velopolvere", + "description": "Strumento da dare a Ditto. Questa strana polvere, fine e al contempo dura, aumenta la Velocità." + } + }, + "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" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "Sciarpa seta", + "black_belt": "Cinturanera", + "sharp_beak": "Beccaffilato", + "poison_barb": "Velenaculeo", + "soft_sand": "Sabbia soffice", + "hard_stone": "Pietradura", + "silver_powder": "Argenpolvere", + "spell_tag": "Spettrotarga", + "metal_coat": "Metalcopertura", + "charcoal": "Carbonella", + "mystic_water": "Acqua magica", + "miracle_seed": "Miracolseme", + "magnet": "Magnete", + "twisted_spoon": "Cucchiaio torto", + "never_melt_ice": "Gelomai", + "dragon_fang": "Dente di drago", + "black_glasses": "Occhialineri", + "fairy_feather": "Piuma fatata" + }, + "BaseStatBoosterItem": { + "hp_up": "PS-su", + "protein": "Proteina", + "iron": "Ferro", + "calcium": "Calcio", + "zinc": "Zinco", + "carbos": "Carburante" + }, + "EvolutionItem": { + "NONE": "Nessuno", + "LINKING_CORD": "Filo dell'unione", + "SUN_STONE": "Pietrasolare", + "MOON_STONE": "Pietralunare", + "LEAF_STONE": "Pietrafoglia", + "FIRE_STONE": "Pietrafocaia", + "WATER_STONE": "Pietraidrica", + "THUNDER_STONE": "Pietratuono", + "ICE_STONE": "Pietragelo", + "DUSK_STONE": "Neropietra", + "DAWN_STONE": "Pietralbore", + "SHINY_STONE": "Pietrabrillo", + "CRACKED_POT": "Teiera rotta", + "SWEET_APPLE": "Dolcepomo", + "TART_APPLE": "Aspropomo", + "STRAWBERRY_SWEET": "Bonbonfragola", + "UNREMARKABLE_TEACUP": "Tazza dozzinale", + "CHIPPED_POT": "Teiera crepata", + "BLACK_AUGURITE": "Augite nera", + "GALARICA_CUFF": "Fascia Galarnoce", + "GALARICA_WREATH": "Corona Galarnoce", + "PEAT_BLOCK": "Blocco di torba", + "AUSPICIOUS_ARMOR": "Armatura fausta", + "MALICIOUS_ARMOR": "Armatura infausta", + "MASTERPIECE_TEACUP": "Tazza eccezionale", + "METAL_ALLOY": "Metallo composito", + "SCROLL_OF_DARKNESS": "Rotolo del Buio", + "SCROLL_OF_WATERS": "Rotolo dell'Acqua", + "SYRUPY_APPLE": "Sciroppomo" + }, + "FormChangeItem": { + "NONE": "Nessuno", + "ABOMASITE": "Abomasnowite", + "ABSOLITE": "Absolite", + "AERODACTYLITE": "Aerodactylite", + "AGGRONITE": "Aggronite", + "ALAKAZITE": "Alakazamite", + "ALTARIANITE": "Altarite", + "AMPHAROSITE": "Ampharosite", + "AUDINITE": "Audinite", + "BANETTITE": "Banettite", + "BEEDRILLITE": "Beedrillite", + "BLASTOISINITE": "Blastoisite", + "BLAZIKENITE": "Blazikenite", + "CAMERUPTITE": "Cameruptite", + "CHARIZARDITE_X": "Charizardite X", + "CHARIZARDITE_Y": "Charizardite Y", + "DIANCITE": "Diancite", + "GALLADITE": "Galladite", + "GARCHOMPITE": "Garchompite", + "GARDEVOIRITE": "Gardevoirite", + "GENGARITE": "Gengarite", + "GLALITITE": "Glalite", + "GYARADOSITE": "Gyaradosite", + "HERACRONITE": "Heracronite", + "HOUNDOOMINITE": "Houndoomite", + "KANGASKHANITE": "Kangaskhanite", + "LATIASITE": "Latiasite", + "LATIOSITE": "Latiosite", + "LOPUNNITE": "Lopunnite", + "LUCARIONITE": "Lucarite", + "MANECTITE": "Manectricite", + "MAWILITE": "Mawilite", + "MEDICHAMITE": "Medichamite", + "METAGROSSITE": "Metagrossite", + "MEWTWONITE_X": "Mewtwoite X", + "MEWTWONITE_Y": "Mewtwoite Y", + "PIDGEOTITE": "Pidgeotite", + "PINSIRITE": "Pinsirite", + "RAYQUAZITE": "Rayquazite", + "SABLENITE": "Sableyite", + "SALAMENCITE": "Salamencite", + "SCEPTILITE": "Sceptilite", + "SCIZORITE": "Scizorite", + "SHARPEDONITE": "Sharpedite", + "SLOWBRONITE": "Slowbroite", + "STEELIXITE": "Steelixite", + "SWAMPERTITE": "Swampertite", + "TYRANITARITE": "Tyranitarite", + "VENUSAURITE": "Venusaurite", + "BLUE_ORB": "Gemma Blu", + "RED_ORB": "Gemma Rossa", + "SHARP_METEORITE": "Meteorite Tagliente", + "HARD_METEORITE": "Meteorite Dura", + "SMOOTH_METEORITE": "Meteorite Liscia", + "ADAMANT_CRYSTAL": "Adamasferoide", + "LUSTROUS_GLOBE": "Splendisferoide", + "GRISEOUS_CORE": "Grigiosferoide", + "REVEAL_GLASS": "Verispecchio", + "GRACIDEA": "Gracidea", + "MAX_MUSHROOMS": "Fungomax", + "DARK_STONE": "Scurolite", + "LIGHT_STONE": "Chiarolite", + "PRISON_BOTTLE": "Vaso del Vincolo", + "N_LUNARIZER": "Necrolunix", + "N_SOLARIZER": "Necrosolix", + "RUSTED_SWORD": "Spada Rovinata", + "RUSTED_SHIELD": "Scudo Rovinato", + "ICY_REINS_OF_UNITY": "Briglie Legame Giaccio", + "SHADOW_REINS_OF_UNITY": "Briglie legame Ombra", + "WELLSPRING_MASK": "Maschera Pozzo", + "HEARTHFLAME_MASK": "Maschera Focolare", + "CORNERSTONE_MASK": "Maschera Fondamenta", + "SHOCK_DRIVE": "Voltmodulo", + "BURN_DRIVE": "Piromodulo", + "CHILL_DRIVE": "Gelomodulo", + "DOUSE_DRIVE": "Idromodulo", + "ULTRANECROZIUM_Z": "Ultranecrozium Z", + "FIST_PLATE": "Lastrapugno", + "SKY_PLATE": "Lastracielo", + "TOXIC_PLATE": "Lastrafiele", + "EARTH_PLATE": "Lastrageo", + "STONE_PLATE": "Lastrapietra", + "INSECT_PLATE": "Lastrabaco", + "SPOOKY_PLATE": "Lastratetra", + "IRON_PLATE": "Lastraferro", + "FLAME_PLATE": "Lastrarogo", + "SPLASH_PLATE": "Lastraidro", + "MEADOW_PLATE": "Lastraprato", + "ZAP_PLATE": "Lastrasaetta", + "MIND_PLATE": "Lastramente", + "ICICLE_PLATE": "Lastragelo", + "DRACO_PLATE": "Lastradrakon", + "DREAD_PLATE": "Lastratimore", + "PIXIE_PLATE": "Lastraspiritello", + "BLANK_PLATE": "Lastraripristino", + "LEGEND_PLATE": "Lastraleggenda", + "FIGHTING_MEMORY": "ROM Lotta", + "FLYING_MEMORY": "ROM Volante", + "POISON_MEMORY": "ROM Veleno", + "GROUND_MEMORY": "ROM Terra", + "ROCK_MEMORY": "ROM Roccia", + "BUG_MEMORY": "ROM Coleottero", + "GHOST_MEMORY": "ROM Spettro", + "STEEL_MEMORY": "ROM Acciaio", + "FIRE_MEMORY": "ROM Fuoco", + "WATER_MEMORY": "ROM Acqua", + "GRASS_MEMORY": "ROM Erba", + "ELECTRIC_MEMORY": "ROM Elettro", + "PSYCHIC_MEMORY": "ROM Psico", + "ICE_MEMORY": "ROM Ghiaccio", + "DRAGON_MEMORY": "ROM Drago", + "DARK_MEMORY": "ROM Buio", + "FAIRY_MEMORY": "ROM Folletto", + "NORMAL_MEMORY": "ROM Normale" + } +} diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts deleted file mode 100644 index 2b7147133e1..00000000000 --- a/src/locales/it/modifier-type.ts +++ /dev/null @@ -1,451 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - "AddPokeballModifierType": { - name: "{{modifierCount}}x {{pokeballName}}", - description: "Ricevi {{pokeballName}} x{{modifierCount}} (Inventario: {{pokeballAmount}}) \nTasso di cattura: {{catchRate}}.", - }, - "AddVoucherModifierType": { - name: "{{modifierCount}}x {{voucherTypeName}}.", - description: "Ricevi {{voucherTypeName}} x{{modifierCount}}.", - }, - "PokemonHeldItemModifierType": { - extra: { - "inoperable": "{{pokemonName}} non può prendere\nquesto oggetto!", - "tooMany": "{{pokemonName}} ne ha troppi\ndi questo oggetto!", - } - }, - "PokemonHpRestoreModifierType": { - description: "Restituisce {{restorePoints}} PS o {{restorePercent}}% PS ad un Pokémon, a seconda del valore più alto.", - extra: { - "fully": "Restituisce tutti i PS ad un Pokémon.", - "fullyWithStatus": "Restituisce tutti i PS ad un Pokémon e lo cura da ogni stato.", - } - }, - "PokemonReviveModifierType": { - description: "Rianima un Pokémon esausto e gli restituisce il {{restorePercent}}% PS.", - }, - "PokemonStatusHealModifierType": { - description: "Cura tutti i problemi di stato di un Pokémon.", - }, - "PokemonPpRestoreModifierType": { - description: "Restituisce {{restorePoints}} PP per una mossa di un Pokémon.", - extra: { - "fully": "Restituisce tutti i PP di una mossa.", - } - }, - "PokemonAllMovePpRestoreModifierType": { - description: "Restituisce {{restorePoints}} PP a tutte le mosse di un Pokémon.", - extra: { - "fully": "Restituisce tutti i PP a tutte le mosse di un Pokémon.", - } - }, - "PokemonPpUpModifierType": { - description: "Aumenta i PP di una mossa di {{upPoints}} per ogni 5 PP (massimo 3).", - }, - "PokemonNatureChangeModifierType": { - name: "Menta {{natureName}}.", - description: "Cambia la natura del Pokémon in {{natureName}} e sblocca la natura per il Pokémon iniziale.", - }, - "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.", - }, - "AttackTypeBoosterModifierType": { - description: "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon.", - }, - "PokemonLevelIncrementModifierType": { - description: "Fa salire un Pokémon di un livello.", - }, - "AllPokemonLevelIncrementModifierType": { - description: "Aumenta il livello di tutti i Pokémon nel gruppo di 1.", - }, - "PokemonBaseStatBoosterModifierType": { - description: "Aumenta {{statName}} di base del possessore del 10%.", - }, - "AllPokemonFullHpRestoreModifierType": { - description: "Recupera il 100% dei PS per tutti i Pokémon.", - }, - "AllPokemonFullReviveModifierType": { - description: "Rianima tutti i Pokémon esausti restituendogli tutti i PS.", - }, - "MoneyRewardModifierType": { - description: "Garantisce una {{moneyMultiplier}} quantità di soldi (₽{{moneyAmount}}).", - extra: { - "small": "poca", - "moderate": "moderata", - "large": "grande", - }, - }, - "ExpBoosterModifierType": { - description: "Aumenta il guadagno di Punti Esperienza del {{boostPercent}}%.", - }, - "PokemonExpBoosterModifierType": { - description: "Aumenta il guadagno di Punti Esperienza del possessore del {{boostPercent}}%.", - }, - "PokemonFriendshipBoosterModifierType": { - description: "Aumenta del 50% il guadagno di amicizia per vittoria.", - }, - "PokemonMoveAccuracyBoosterModifierType": { - description: "Aumenta l'accuratezza delle mosse di {{accuracyAmount}} (massimo 100).", - }, - "PokemonMultiHitModifierType": { - description: "Gli attacchi colpiscono una volta in più al costo di una riduzione di potenza del 60/75/82,5% per mossa.", - }, - "TmModifierType": { - name: "MT{{moveId}} - {{moveName}}.", - description: "Insegna {{moveName}} a un Pokémon.", - }, - "TmModifierTypeWithInfo": { - name: "MT{{moveId}} - {{moveName}}", - description: "Insegna {{moveName}} a un Pokémon\n(Hold C or Shift for more info).", - }, - "EvolutionItemModifierType": { - description: "Fa evolvere determinate specie di Pokémon.", - }, - "FormChangeItemModifierType": { - description: "Fa cambiare forma a determinati Pokémon.", - }, - "FusePokemonModifierType": { - description: "Combina due Pokémon (trasferisce i poteri, divide le statistiche e i tipi base, condivide il pool di mosse).", - }, - "TerastallizeModifierType": { - name: "Teralite {{teraType}}", - description: "Teracristallizza in {{teraType}} il possessore per massimo 10 battaglie.", - }, - "ContactHeldItemTransferChanceModifierType": { - description: "Quando si attacca, c'è una probabilità del {{chancePercent}}% che l'oggetto in possesso del nemico venga rubato.", - }, - "TurnHeldItemTransferModifierType": { - description: "Ogni turno, il possessore acquisisce un oggetto posseduto dal nemico.", - }, - "EnemyAttackStatusEffectChanceModifierType": { - description: "Aggiunge una probabilità del {{chancePercent}}% di infliggere {{statusEffect}} con le mosse d'attacco.", - }, - "EnemyEndureChanceModifierType": { - description: "Aggiunge una probabilità del {{probabilitàPercent}}% di resistere ad un colpo.", - }, - - "RARE_CANDY": { name: "Caramella Rara" }, - "RARER_CANDY": { name: "Caramella Molto Rara" }, - - "MEGA_BRACELET": { name: "Megapolsiera", description: "Le Megapietre sono disponibili." }, - "DYNAMAX_BAND": { name: "Polsino Dynamax", description: "I Fungomax sono disponibili." }, - "TERA_ORB": { name: "Terasfera", description: "I Teraliti sono disponibili." }, - - "MAP": { name: "Mappa", description: "Permette di scegliere la propria strada a un bivio." }, - - "POTION": { name: "Pozione" }, - "SUPER_POTION": { name: "Superpozione" }, - "HYPER_POTION": { name: "Iperpozione" }, - "MAX_POTION": { name: "Pozione Max" }, - "FULL_RESTORE": { name: "Ricarica Totale" }, - - "REVIVE": { name: "Revitalizzante" }, - "MAX_REVIVE": { name: "Revitalizzante Max" }, - - "FULL_HEAL": { name: "Cura Totale" }, - - "SACRED_ASH": { name: "Cenere Magica" }, - - "REVIVER_SEED": { name: "Revitalseme", description: "Il possessore recupera 1/2 di PS in caso di svenimento." }, - - "ETHER": { name: "Etere" }, - "MAX_ETHER": { name: "Etere Max" }, - - "ELIXIR": { name: "Elisir" }, - "MAX_ELIXIR": { name: "Elisir Max" }, - - "PP_UP": { name: "PP-su" }, - "PP_MAX": { name: "PP-max" }, - - "LURE": { name: "Profumo Invito" }, - "SUPER_LURE": { name: "Profumo Invito Super" }, - "MAX_LURE": { name: "Profumo Invito Max" }, - - "MEMORY_MUSHROOM": { name: "Fungo della Memoria", description: "Ricorda la mossa dimenticata di un Pokémon." }, - - "EXP_SHARE": { name: "Condividi Esperienza", description: "Tutti i Pokémon della squadra ricevono il 20% dei Punti Esperienza dalla lotta anche se non vi hanno partecipato." }, - "EXP_BALANCE": { name: "Bilancia Esperienza", description: "Bilancia i Punti Esperienza ricevuti verso i Pokémon del gruppo di livello inferiore." }, - - "OVAL_CHARM": { name: "Ovamuleto", description: "Quando più Pokémon partecipano a una battaglia, ognuno di essi riceve il 10% in più dell'esperienza totale." }, - - "EXP_CHARM": { name: "Esperienzamuleto" }, - "SUPER_EXP_CHARM": { name: "Esperienzamuleto Super" }, - "GOLDEN_EXP_CHARM": { name: "Esperienzamuleto Oro" }, - - "LUCKY_EGG": { name: "Uovo Fortunato" }, - "GOLDEN_EGG": { name: "Uovo d'Oro" }, - - "SOOTHE_BELL": { name: "Calmanella" }, - - "EVIOLITE": { name: "Evolcondensa", description: "Misteriosa materia evolutiva. Aumenta la Difesa e la Difesa Speciale di un Pokémon che può ancora evolversi." }, - - "SOUL_DEW": { name: "Cuorugiada", description: "Aumenta del 10% l'influenza della natura di un Pokémon sulle sue statistiche (Aggiuntivo)." }, - - "NUGGET": { name: "Pepita" }, - "BIG_NUGGET": { name: "Granpepita" }, - "RELIC_GOLD": { name: " Dobloantico" }, - - "AMULET_COIN": { name: "Monetamuleto", description: "Aumenta le ricompense in denaro del 20%." }, - "GOLDEN_PUNCH": { name: "Pugno Dorato", description: "Garantisce il 50% dei danni inflitti come denaro." }, - "COIN_CASE": { name: " Salvadanaio", description: "Dopo ogni 10° battaglia, riceverete il 10% del vostro denaro in interessi." }, - - "LOCK_CAPSULE": { name: "Capsula Scrigno", description: "Permette di bloccare le rarità degli oggetti quando si fa un reroll degli oggetti." }, - - "GRIP_CLAW": { name: "Presartigli" }, - "WIDE_LENS": { name: "Grandelente" }, - - "MULTI_LENS": { name: "Multilente" }, - - "HEALING_CHARM": { name: "Curamuleto", description: "Aumenta del 10% l'efficacia delle mosse e degli oggetti che ripristinano i PS (escluse le rianimazioni)." }, - "CANDY_JAR": { name: "Barattolo di caramelle", description: "Aumenta di 1 il numero di livelli aggiunti dalle Caramelle Rare." }, - - "BERRY_POUCH": { name: "Porta Bacche", description: "Aggiunge il 30% di possibilità che una bacca usata non venga consumata." }, - - "FOCUS_BAND": { name: "Bandana", description: "Chi ce l'ha ottiene il 10% di possibilità aggiuntivo di evitare un potenziale KO e rimanere con un solo PS." }, - - "QUICK_CLAW": { name: "Rapidartigli", description: "Aggiunge una probabilità del 10% di muoversi per primi, indipendentemente dalla velocità (dopo la priorità)." }, - - "KINGS_ROCK": { name: "Roccia di re", description: "Aggiunge il 10% di possibilità che una mossa d'attacco faccia tentennare l'avversario." }, - - "LEFTOVERS": { name: "Avanzi", description: "Ripristina 1/16 dei PS massimi di un Pokémon ogni turno." }, - "SHELL_BELL": { name: "Conchinella", description: "Guarisce 1/8 del danno inflitto a un Pokémon." }, - - "TOXIC_ORB": { name: "Tossicsfera", description: "Sfera bizzarra che iperavvelena chi l’ha con sé in una lotta." }, - "FLAME_ORB": { name: "Fiammosfera", description: "Sfera bizzarra che procura una scottatura a chi l’ha con sé in una lotta." }, - - "BATON": { name: "Staffetta", description: "Permette di trasmettere gli effetti quando si cambia Pokémon, aggirando anche le trappole." }, - - "SHINY_CHARM": { name: "Cromamuleto", description: "Misterioso amuleto luminoso che aumenta la probabilità di incontrare Pokémon cromatici." }, - "ABILITY_CHARM": { name: "Abilitamuleto", description: "Aumenta drasticamente la possibilità che un Pokémon selvatico abbia un'abilità nascosta." }, - - "IV_SCANNER": { name: "Scanner IV", description: "Permette di scansionare gli IV dei Pokémon selvatici. Vengono rivelati 2 IV per pila. I migliori IV vengono mostrati per primi." }, - - "DNA_SPLICERS": { name: " Cuneo DNA" }, - - "MINI_BLACK_HOLE": { name: "Piccolo Buco Nero" }, - - "GOLDEN_POKEBALL": { name: "Poké Ball Oro", description: "Aggiunge 1 opzione di oggetto extra alla fine di ogni battaglia." }, - - "ENEMY_DAMAGE_BOOSTER": { name: "Gettone del Danno", description: "Aumenta il danno del 5%." }, - "ENEMY_DAMAGE_REDUCTION": { name: "Gettone della Protezione", description: "Riduce i danni ricevuti del 2.5%." }, - "ENEMY_HEAL": { name: "Gettone del Recupero", description: "Cura il 2% dei PS massimi ogni turno." }, - "ENEMY_ATTACK_POISON_CHANCE": { name: "Gettone del Veleno" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Gettone della Paralisi" }, - "ENEMY_ATTACK_BURN_CHANCE": { name: "Gettone della Bruciatura" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Gettone Guarigione Completa", description: "Aggiunge una probabilità del 2.5% a ogni turno di curare una condizione di stato." }, - "ENEMY_ENDURE_CHANCE": { name: "Gettone di Resistenza" }, - "ENEMY_FUSED_CHANCE": { name: "Gettone della fusione", description: "Aggiunge l'1% di possibilità che un Pokémon selvatico sia una fusione." }, - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "Elettropalla", description: "Strumento da dare a Pikachu. Sfera insolita che aumenta l’Attacco e l’Attacco Speciale." }, - "THICK_CLUB": { name: "Osso spesso", description: "Strumento da dare a Cubone o Marowak. Osso duro che aumenta l’Attacco." }, - "METAL_POWDER": { name: "Metalpolvere", description: "Strumento da dare a Ditto. Strana polvere finissima e al tempo stesso dura che migliora la Difesa." }, - "QUICK_POWDER": { name: "Velopolvere", description: "Strumento da dare a Ditto. Questa strana polvere, fine e al contempo dura, aumenta la Velocità." } - }, - TempBattleStatBoosterItem: { - "x_attack": "Attacco X", - "x_defense": "Difesa X", - "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": "Attack", - "DEF": "Defense", - "SPATK": "Sp. Atk", - "SPDEF": "Sp. Def", - "SPD": "Speed", - "ACC": "Accuracy", - "CRIT": "Critical Hit Ratio", - "EVA": "Evasiveness", - "DEFAULT": "???", - }, - - AttackTypeBoosterItem: { - "silk_scarf": "Sciarpa seta", - "black_belt": "Cinturanera", - "sharp_beak": "Beccaffilato", - "poison_barb": "Velenaculeo", - "soft_sand": "Sabbia soffice", - "hard_stone": "Pietradura", - "silver_powder": "Argenpolvere", - "spell_tag": "Spettrotarga", - "metal_coat": "Metalcopertura", - "charcoal": "Carbonella", - "mystic_water": "Acqua magica", - "miracle_seed": "Miracolseme", - "magnet": "Magnete", - "twisted_spoon": "Cucchiaio torto", - "never_melt_ice": "Gelomai", - "dragon_fang": "Dente di drago", - "black_glasses": "Occhialineri", - "fairy_feather": "Piuma fatata", - }, - BaseStatBoosterItem: { - "hp_up": "PS-su", - "protein": "Proteina", - "iron": "Ferro", - "calcium": "Calcio", - "zinc": "Zinco", - "carbos": "Carburante", - }, - EvolutionItem: { - "NONE": "Nessuno", - - "LINKING_CORD": "Filo dell'unione", - "SUN_STONE": "Pietrasolare", - "MOON_STONE": "Pietralunare", - "LEAF_STONE": "Pietrafoglia", - "FIRE_STONE": "Pietrafocaia", - "WATER_STONE": "Pietraidrica", - "THUNDER_STONE": "Pietratuono", - "ICE_STONE": "Pietragelo", - "DUSK_STONE": "Neropietra", - "DAWN_STONE": "Pietralbore", - "SHINY_STONE": "Pietrabrillo", - "CRACKED_POT": "Teiera rotta", - "SWEET_APPLE": "Dolcepomo", - "TART_APPLE": "Aspropomo", - "STRAWBERRY_SWEET": "Bonbonfragola", - "UNREMARKABLE_TEACUP": "Tazza dozzinale", - - "CHIPPED_POT": "Teiera crepata", - "BLACK_AUGURITE": "Augite nera", - "GALARICA_CUFF": "Fascia Galarnoce", - "GALARICA_WREATH": "Corona Galarnoce", - "PEAT_BLOCK": "Blocco di torba", - "AUSPICIOUS_ARMOR": "Armatura fausta", - "MALICIOUS_ARMOR": "Armatura infausta", - "MASTERPIECE_TEACUP": "Tazza eccezionale", - "METAL_ALLOY": "Metallo composito", - "SCROLL_OF_DARKNESS": "Rotolo del Buio", - "SCROLL_OF_WATERS": "Rotolo dell'Acqua", - "SYRUPY_APPLE": "Sciroppomo", - }, - FormChangeItem: { - "NONE": "Nessuno", - - "ABOMASITE": "Abomasnowite", - "ABSOLITE": "Absolite", - "AERODACTYLITE": "Aerodactylite", - "AGGRONITE": "Aggronite", - "ALAKAZITE": "Alakazamite", - "ALTARIANITE": "Altarite", - "AMPHAROSITE": "Ampharosite", - "AUDINITE": "Audinite", - "BANETTITE": "Banettite", - "BEEDRILLITE": "Beedrillite", - "BLASTOISINITE": "Blastoisite", - "BLAZIKENITE": "Blazikenite", - "CAMERUPTITE": "Cameruptite", - "CHARIZARDITE_X": "Charizardite X", - "CHARIZARDITE_Y": "Charizardite Y", - "DIANCITE": "Diancite", - "GALLADITE": "Galladite", - "GARCHOMPITE": "Garchompite", - "GARDEVOIRITE": "Gardevoirite", - "GENGARITE": "Gengarite", - "GLALITITE": "Glalite", - "GYARADOSITE": "Gyaradosite", - "HERACRONITE": "Heracronite", - "HOUNDOOMINITE": "Houndoomite", - "KANGASKHANITE": "Kangaskhanite", - "LATIASITE": "Latiasite", - "LATIOSITE": "Latiosite", - "LOPUNNITE": "Lopunnite", - "LUCARIONITE": "Lucarite", - "MANECTITE": "Manectricite", - "MAWILITE": "Mawilite", - "MEDICHAMITE": "Medichamite", - "METAGROSSITE": "Metagrossite", - "MEWTWONITE_X": "Mewtwoite X", - "MEWTWONITE_Y": "Mewtwoite Y", - "PIDGEOTITE": "Pidgeotite", - "PINSIRITE": "Pinsirite", - "RAYQUAZITE": "Rayquazite", - "SABLENITE": "Sableyite", - "SALAMENCITE": "Salamencite", - "SCEPTILITE": "Sceptilite", - "SCIZORITE": "Scizorite", - "SHARPEDONITE": "Sharpedite", - "SLOWBRONITE": "Slowbroite", - "STEELIXITE": "Steelixite", - "SWAMPERTITE": "Swampertite", - "TYRANITARITE": "Tyranitarite", - "VENUSAURITE": "Venusaurite", - - "BLUE_ORB": "Gemma Blu", - "RED_ORB": "Gemma Rossa", - "SHARP_METEORITE": "Meteorite Tagliente", - "HARD_METEORITE": "Meteorite Dura", - "SMOOTH_METEORITE": "Meteorite Liscia", - "ADAMANT_CRYSTAL": "Adamasferoide", - "LUSTROUS_GLOBE": "Splendisferoide", - "GRISEOUS_CORE": "Grigiosferoide", - "REVEAL_GLASS": "Verispecchio", - "GRACIDEA": "Gracidea", - "MAX_MUSHROOMS": "Fungomax", - "DARK_STONE": "Scurolite", - "LIGHT_STONE": "Chiarolite", - "PRISON_BOTTLE": "Vaso del Vincolo", - "N_LUNARIZER": "Necrolunix", - "N_SOLARIZER": "Necrosolix", - "RUSTED_SWORD": "Spada Rovinata", - "RUSTED_SHIELD": "Scudo Rovinato", - "ICY_REINS_OF_UNITY": "Briglie Legame Giaccio", - "SHADOW_REINS_OF_UNITY": "Briglie legame Ombra", - "WELLSPRING_MASK": "Maschera Pozzo", - "HEARTHFLAME_MASK": "Maschera Focolare", - "CORNERSTONE_MASK": "Maschera Fondamenta", - "SHOCK_DRIVE": "Voltmodulo", - "BURN_DRIVE": "Piromodulo", - "CHILL_DRIVE": "Gelomodulo", - "DOUSE_DRIVE": "Idromodulo", - - "FIST_PLATE": "Lastrapugno", - "SKY_PLATE": "Lastracielo", - "TOXIC_PLATE": "Lastrafiele", - "EARTH_PLATE": "Lastrageo", - "STONE_PLATE": "Lastrapietra", - "INSECT_PLATE": "Lastrabaco", - "SPOOKY_PLATE": "Lastratetra", - "IRON_PLATE": "Lastraferro", - "FLAME_PLATE": "Lastrarogo", - "SPLASH_PLATE": "Lastraidro", - "MEADOW_PLATE": "Lastraprato", - "ZAP_PLATE": "Lastrasaetta", - "MIND_PLATE": "Lastramente", - "ICICLE_PLATE": "Lastragelo", - "DRACO_PLATE": "Lastradrakon", - "DREAD_PLATE": "Lastratimore", - "PIXIE_PLATE": "Lastraspiritello", - "BLANK_PLATE": "Lastraripristino", - "LEGEND_PLATE": "Lastraleggenda", - "FIGHTING_MEMORY": "ROM Lotta", - "FLYING_MEMORY": "ROM Volante", - "POISON_MEMORY": "ROM Veleno", - "GROUND_MEMORY": "ROM Terra", - "ROCK_MEMORY": "ROM Roccia", - "BUG_MEMORY": "ROM Coleottero", - "GHOST_MEMORY": "ROM Spettro", - "STEEL_MEMORY": "ROM Acciaio", - "FIRE_MEMORY": "ROM Fuoco", - "WATER_MEMORY": "ROM Acqua", - "GRASS_MEMORY": "ROM Erba", - "ELECTRIC_MEMORY": "ROM Elettro", - "PSYCHIC_MEMORY": "ROM Psico", - "ICE_MEMORY": "ROM Ghiaccio", - "DRAGON_MEMORY": "ROM Drago", - "DARK_MEMORY": "ROM Buio", - "FAIRY_MEMORY": "ROM Folletto", - "BLANK_MEMORY": "ROM Vuota", - }, -} as const; diff --git a/src/locales/it/modifier.json b/src/locales/it/modifier.json new file mode 100644 index 00000000000..c42bf04bc8a --- /dev/null +++ b/src/locales/it/modifier.json @@ -0,0 +1,12 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}} resiste\ngrazie al/alla suo/a {{typeName}}!", + "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}}!", + "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}}!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nristabilisce parte dei PS!", + "bypassSpeedChanceApply": "{{pokemonName}} agisce più rapidamente del normale grazie al suo {{itemName}}!" +} \ No newline at end of file diff --git a/src/locales/it/move-trigger.json b/src/locales/it/move-trigger.json new file mode 100644 index 00000000000..785972b90f9 --- /dev/null +++ b/src/locales/it/move-trigger.json @@ -0,0 +1,70 @@ +{ + "hitWithRecoil": "{{pokemonName}} ha subito il contraccolpo!", + "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!", + "fled": "{{pokemonName}} è fuggito!", + "cannotBeSwitchedOut": "{{pokemonName}} non può essere sostituito!", + "swappedAbilitiesWithTarget": "{{pokemonName}} scambia la sua\nabilità con il bersaglio!", + "coinsScatteredEverywhere": "Ci sono monete sparse ovunque!", + "attackedByItem": "{{itemName}} attacca {{pokemonName}}!", + "whippedUpAWhirlwind": "{{pokemonName}} genera un\nuragano!", + "flewUpHigh": "{{pokemonName}} vola\nin alto!", + "tookInSunlight": "{{pokemonName}} assorbe la luce!", + "dugAHole": "{{pokemonName}} si nasconde sottoterra!", + "loweredItsHead": "{{pokemonName}} abbassa la testa!", + "isGlowing": "{{pokemonName}} è avvolto da una luce intensa!", + "bellChimed": "\tSi sente suonare una campanella!", + "foresawAnAttack": "{{pokemonName}} presagisce\nl’attacco imminente!", + "isTighteningFocus": "{{pokemonName}} si concentra al massimo!", + "hidUnderwater": "{{pokemonName}} sparisce\nsott’acqua!", + "soothingAromaWaftedThroughArea": "Un gradevole profumo si diffonde nell’aria!", + "sprangUp": "{{pokemonName}} spicca un gran balzo!", + "choseDoomDesireAsDestiny": "{{pokemonName}} ipoteca\nil futuro con Desiderio Fatale!", + "vanishedInstantly": "{{pokemonName}} sparisce\nimprovvisamente!", + "tookTargetIntoSky": "{{pokemonName}} trascina\nin aria {{targetName}}!", + "becameCloakedInFreezingLight": "{{pokemonName}} è avvolto da\nuna luce fredda!", + "becameCloakedInFreezingAir": "{{pokemonName}} è avvolto da\nun’atmosfera gelida!", + "isChargingPower": "{{pokemonName}} accumula energia!", + "burnedItselfOut": "Le fiamme di {{pokemonName}} si sono spente!", + "startedHeatingUpBeak": "{{pokemonName}} inizia a\nscaldare il becco!", + "setUpShellTrap": "{{pokemonName}} ha preparato\nla Gusciotrappola!", + "isOverflowingWithSpacePower": "La forza dell’universo pervade {{pokemonName}}!", + "usedUpAllElectricity": "{{pokemonName}} ha usato tutta la sua elettricità!", + "stoleItem": "{{pokemonName}} ruba\nil/lo/la {{itemName}} di {{targetName}}!", + "incineratedItem": "{{pokemonName}} incenerisce\nil/lo/la {{itemName}} di {{targetName}}!", + "knockedOffItem": "{{pokemonName}} fa cadere\nil/lo/la {{itemName}} di {{targetName}}!", + "tookMoveAttack": "{{pokemonName}} attira\nl'attacco {{moveName}} su di sé!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} riduce i suoi PS\ne aumenta al massimo il/la suo/a {{statName}}!", + "copiedStatChanges": "{{pokemonName}} copia\nle modifiche alle statistiche di {{targetName}}!", + "magnitudeMessage": "Magnitudo {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} prende la mira\nsu {{targetName}}!", + "transformedIntoType": "{{pokemonName}} è diventato\ndi tipo {{typeName}}!", + "copiedMove": "{{pokemonName}} copia\n{{moveName}}!", + "sketchedMove": "{{pokemonName}} disegna uno schizzo\ndella mossa {{moveName}}!", + "acquiredAbility": "L’abilità di {{pokemonName}}\nè ora {{abilityName}}!", + "copiedTargetAbility": "{{pokemonName}} copia l’abilità {{abilityName}}\ndi {{targetName}}!", + "transformedIntoTarget": "{{pokemonName}} assume le sembianze\ndi {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} tenta di far subire a chi lo manda KO la sua stessa sorte!", + "addType": "Adesso {{pokemonName}} è anche\ndi tipo {{typeName}}!", + "cannotUseMove": "{{pokemonName}} non può usare {{moveName}}!", + "healHp": "{{pokemonName}} ha recuperato dei PS.", + "sacrificialFullRestore": "{{pokemonName}} riceve i benefici\neffetti di Curardore!", + "invertStats": "Le modifiche alle statistiche di {{pokemonName}}\nvengono invertite!", + "resetStats": "Tutte le modifiche alle statistiche sono state annullate!", + "statEliminated": "Tutte le modifiche alle statistiche sono state annullate!", + "faintCountdown": "{{pokemonName}}\nandrà KO dopo {{turnCount}} turni.", + "copyType": "{{pokemonName}} assume il tipo\ndi {{targetPokemonName}}!", + "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}}!", + "safeguard": "Salvaguardia protegge {{targetName}}!" +} \ No newline at end of file diff --git a/src/locales/it/move.json b/src/locales/it/move.json new file mode 100644 index 00000000000..f5bb1954278 --- /dev/null +++ b/src/locales/it/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "Botta", + "effect": "Colpisce il nemico con la coda o le zampe anteriori." + }, + "karateChop": { + "name": "Colpokarate", + "effect": "Colpisce il nemico con un colpo netto. Probabile brutto colpo." + }, + "doubleSlap": { + "name": "Doppiasberla", + "effect": "Schiaffeggia il nemico da due a cinque volte di fila." + }, + "cometPunch": { + "name": "Cometapugno", + "effect": "Colpisce il nemico con una scarica di pugni da due a cinque volte di fila." + }, + "megaPunch": { + "name": "Megapugno", + "effect": "Colpisce il nemico con un pugno poderoso." + }, + "payDay": { + "name": "Giornopaga", + "effect": "Colpisce il nemico con una gran quantità di monete recuperabili dopo la lotta." + }, + "firePunch": { + "name": "Fuocopugno", + "effect": "Colpisce il nemico con un pugno ardente che può scottarlo." + }, + "icePunch": { + "name": "Gelopugno", + "effect": "Colpisce il nemico con un pugno di ghiaccio che può congelarlo." + }, + "thunderPunch": { + "name": "Tuonopugno", + "effect": "Colpisce il nemico con un pugno elettrico che può paralizzarlo." + }, + "scratch": { + "name": "Graffio", + "effect": "Infligge danni al nemico con artigli acuminati, duri e affilati." + }, + "viseGrip": { + "name": "Presa", + "effect": "Stringe il nemico in una morsa usando enormi e possenti tenaglie." + }, + "guillotine": { + "name": "Ghigliottina", + "effect": "Attacca il nemico con pericolose tenaglie. Se l'attacco va a segno, il nemico va subito KO." + }, + "razorWind": { + "name": "Ventagliente", + "effect": "Chi la usa genera un turbine al primo turno e attacca al secondo. Probabile brutto colpo." + }, + "swordsDance": { + "name": "Danzaspada", + "effect": "Danza frenetica che incrementa lo spirito combattivo. Chi la usa aumenta di molto il suo Attacco." + }, + "cut": { + "name": "Taglio", + "effect": "Attacca il nemico con artigli o falci affilate. Fuori dalla lotta si usa per tagliare piccoli alberi." + }, + "gust": { + "name": "Raffica", + "effect": "Infligge danni al nemico con una folata di vento sollevata dalle ali." + }, + "wingAttack": { + "name": "Attacco d'Ala", + "effect": "Infligge danni al nemico spiegando delle grandi ali possenti." + }, + "whirlwind": { + "name": "Turbine", + "effect": "Il bersaglio è spazzato via ed è costretto a lasciare il posto ad un altro. Se è selvatico, la lotta finisce." + }, + "fly": { + "name": "Volo", + "effect": "Chi la usa si alza in volo per attaccare al turno seguente. Fuori dalla lotta permette di volare in città già visitate." + }, + "bind": { + "name": "Legatutto", + "effect": "Lega e stritola il nemico per quattro o cinque turni con tentacoli o con un corpo lungo." + }, + "slam": { + "name": "Schianto", + "effect": "Infligge danni al nemico con una coda, una liana o simili." + }, + "vineWhip": { + "name": "Frustata", + "effect": "Infligge danni al nemico con liane sottili simili a fruste." + }, + "stomp": { + "name": "Pestone", + "effect": "Colpisce il nemico con un grosso piede e può anche farlo tentennare." + }, + "doubleKick": { + "name": "Doppiocalcio", + "effect": "Colpisce il nemico due volte con un paio di rapidi calci inferti con entrambi i piedi." + }, + "megaKick": { + "name": "Megacalcio", + "effect": "Colpisce il nemico con un calcio sferrato con la forza di muscoli poderosi." + }, + "jumpKick": { + "name": "Calciosalto", + "effect": "Permette di saltare in alto per attaccare con un calcio. Se non va a buon fine, chi la usa si ferisce." + }, + "rollingKick": { + "name": "Calciorullo", + "effect": "Chi la usa infierisce sul nemico con un calcio rotante. Può anche farlo tentennare." + }, + "sandAttack": { + "name": "Turbosabbia", + "effect": "Getta sabbia in faccia al nemico e ne riduce la precisione." + }, + "headbutt": { + "name": "Bottintesta", + "effect": "Chi la usa si lancia diritto di testa contro il nemico. Può anche far tentennare." + }, + "hornAttack": { + "name": "Incornata", + "effect": "Danneggia il nemico infilzandolo con un corno affilato." + }, + "furyAttack": { + "name": "Furia", + "effect": "Infilza il nemico con corna affilate o un becco da due a cinque volte di fila." + }, + "hornDrill": { + "name": "Perforcorno", + "effect": "Colpisce il nemico con un corno perforante come un trapano. Se il colpo va a segno, il nemico va KO." + }, + "tackle": { + "name": "Azione", + "effect": "Attacco fisico che colpisce il nemico investendolo con tutto il corpo." + }, + "bodySlam": { + "name": "Corposcontro", + "effect": "Chi la usa carica il nemico con tutto il corpo. Può causarne anche la paralisi." + }, + "wrap": { + "name": "Avvolgibotta", + "effect": "Avvolge e stritola il nemico con un corpo lungo o con piante rampicanti per quattro o cinque turni." + }, + "takeDown": { + "name": "Riduttore", + "effect": "Carica spericolata con tutto il corpo contro il nemico. Danneggia un po' anche chi la usa." + }, + "thrash": { + "name": "Colpo", + "effect": "Assale e attacca il nemico per due o tre turni, ma confonde chi la usa." + }, + "doubleEdge": { + "name": "Sdoppiatore", + "effect": "Carica spietata e pericolosa che danneggia molto anche chi la usa." + }, + "tailWhip": { + "name": "Colpocoda", + "effect": "Chi la usa agita la coda per distrarre i nemici, riducendone la Difesa." + }, + "poisonSting": { + "name": "Velenospina", + "effect": "Colpisce il nemico con un aculeo tossico che può anche avvelenarlo." + }, + "twineedle": { + "name": "Doppio Ago", + "effect": "Colpisce il nemico due volte di seguito con un paio di aghi. Può anche avvelenarlo." + }, + "pinMissile": { + "name": "Missilspillo", + "effect": "Il nemico viene colpito da due a cinque volte con spilli appuntiti in rapida successione." + }, + "leer": { + "name": "Fulmisguardo", + "effect": "Il nemico viene guardato con sguardo intimidatorio da occhi acuti. Viene ridotta la difesa dell'avversario." + }, + "bite": { + "name": "Morso", + "effect": "Il nemico viene morso da denti affilatissimi che possono farlo tentennare." + }, + "growl": { + "name": "Ruggito", + "effect": "Il Pokémon ruggisce con cattiveria. Viene ridotto l'attacco dell'avversario." + }, + "roar": { + "name": "Boato", + "effect": "Il bersaglio è costretto a lasciare il campo e viene sostituito. Mette fine alle lotte contro Pokémon selvatici." + }, + "sing": { + "name": "Canto", + "effect": "Una ninna nanna è cantata con voce calma per far addormentare il nemico." + }, + "supersonic": { + "name": "Supersuono", + "effect": "Chi la usa genera dal proprio corpo strane onde acustiche che possono confondere il nemico." + }, + "sonicBoom": { + "name": "Sonicboom", + "effect": "Il nemico viene colpito con un suono distruttivo che infligge un danno sempre 20 PS." + }, + "disable": { + "name": "Inibitore", + "effect": "Per quattro turni impedisce al bersaglio di riutilizzare l'ultima mossa usata." + }, + "acid": { + "name": "Acido", + "effect": "Colpisce i nemici intorno spruzzando un acido corrosivo. Può anche ridurne la Difesa Speciale." + }, + "ember": { + "name": "Braciere", + "effect": "Il Pokémon attacca con piccole fiamme. Possono scottare il nemico." + }, + "flamethrower": { + "name": "Lanciafiamme", + "effect": "Il nemico viene colpito da intense fiammate che possono anche scottarlo." + }, + "mist": { + "name": "Nebbia", + "effect": "Chi la usa attira una nebbia che blocca la riduzione alle statistiche della sua squadra per cinque turni." + }, + "waterGun": { + "name": "Pistolacqua", + "effect": "Il nemico è colpito da un potente getto d'acqua." + }, + "hydroPump": { + "name": "Idropompa", + "effect": "Il nemico è travolto da un potente getto d'acqua spruzzato ad altissima pressione." + }, + "surf": { + "name": "Surf", + "effect": "Un'onda enorme sommerge il campo di lotta. Fuori dalla lotta si usa per spostarsi sull'acqua." + }, + "iceBeam": { + "name": "Geloraggio", + "effect": "Il nemico è colpito da un raggio di energia gelida che può anche congelarlo." + }, + "blizzard": { + "name": "Bora", + "effect": "Colpisce i bersagli con una tremenda tempesta di ghiaccio che può anche congelarli." + }, + "psybeam": { + "name": "Psicoraggio", + "effect": "Il nemico è attaccato con un raggio psichico. Può anche lasciare il nemico confuso." + }, + "bubbleBeam": { + "name": "Bollaraggio", + "effect": "Colpisce il nemico con una forte scarica di bolle. Può anche ridurne la Velocità." + }, + "auroraBeam": { + "name": "Raggiaurora", + "effect": "Il nemico viene colpito da un fascio color arcobaleno. Può ridurre l'attacco dell'avversario." + }, + "hyperBeam": { + "name": "Iper Raggio", + "effect": "Colpisce il nemico con un potente raggio. Chi la usa salta il turno successivo per recuperare energia." + }, + "peck": { + "name": "Beccata", + "effect": "Colpisce il nemico con un becco appuntito o un corno." + }, + "drillPeck": { + "name": "Perforbecco", + "effect": "Attacco a spirale con un becco aguzzo che fa da trapano." + }, + "submission": { + "name": "Sottomissione", + "effect": "Chi la usa carica il nemico in modo spericolato, ma danneggia anche se stesso." + }, + "lowKick": { + "name": "Colpo Basso", + "effect": "Un calcio basso e potente che fa cadere il nemico. Danneggia maggiormente i nemici più pesanti." + }, + "counter": { + "name": "Contrattacco", + "effect": "Una mossa di ritorsione che contrasta qualsiasi attacco fisico, infliggendo il doppio dei danni subiti." + }, + "seismicToss": { + "name": "Movimento Sismico", + "effect": "Colpisce il bersaglio con la forza di gravità. Infligge un danno pari al livello di chi la usa." + }, + "strength": { + "name": "Forza", + "effect": "Colpisce il nemico con un'enorme energia. Fuori dalla lotta si usa per spostare i massi." + }, + "absorb": { + "name": "Assorbimento", + "effect": "Mossa che assorbe PS. Chi la usa recupera una quantità di PS pari alla metà del danno inferto." + }, + "megaDrain": { + "name": "Megassorbimento", + "effect": "Mossa che assorbe PS. Chi la usa recupera un quantità di PS pari alla metà del danno inferto." + }, + "leechSeed": { + "name": "Parassiseme", + "effect": "Vengono piantati semi sul bersaglio. Questi sottraggono PS a ogni turno permettendo a chi la usa di curarsi." + }, + "growth": { + "name": "Crescita", + "effect": "Provoca la crescita immediata del corpo e l'aumento dell'Attacco e dell'Attacco Speciale di chi la usa." + }, + "razorLeaf": { + "name": "Foglielama", + "effect": "Foglie taglienti sferzano i nemici intorno. Probabile brutto colpo." + }, + "solarBeam": { + "name": "Solarraggio", + "effect": "Chi la usa assorbe luce al primo turno per proiettare un raggio intenso al turno successivo." + }, + "poisonPowder": { + "name": "Velenpolvere", + "effect": "Una nube di polvere velenosa è sparsa sul nemico. Può avvelenare il bersaglio." + }, + "stunSpore": { + "name": "Paralizzante", + "effect": "Investe il bersaglio con una nuvola di polvere che paralizza." + }, + "sleepPowder": { + "name": "Sonnifero", + "effect": "Investe il bersaglio con una grande nuvola di polvere soporifera che lo fa addormentare." + }, + "petalDance": { + "name": "Petalodanza", + "effect": "Attacca il nemico cospargendolo di petali per due o tre turni, ma chi la usa rimane confuso." + }, + "stringShot": { + "name": "Millebave", + "effect": "Chi la usa produce della seta che avvolge i nemici e ne riduce la Velocità." + }, + "dragonRage": { + "name": "Ira di Drago", + "effect": "Colpisce il nemico con un'onda d'urto generata dall'ira. Questo attacco provoca sempre un danno di 40 PS." + }, + "fireSpin": { + "name": "Turbofuoco", + "effect": "Intrappola il bersaglio in un turbine di fuoco che dura per quattro o cinque turni." + }, + "thunderShock": { + "name": "Tuonoshock", + "effect": "Danneggia il bersaglio con una scarica elettrica che può anche paralizzarlo." + }, + "thunderbolt": { + "name": "Fulmine", + "effect": "Il bersaglio viene colpito da una potente scarica elettrica che può anche paralizzarlo." + }, + "thunderWave": { + "name": "Tuononda", + "effect": "Il nemico viene colpito da una debole scarica elettrica che, se va a segno, ne causa la paralisi." + }, + "thunder": { + "name": "Tuono", + "effect": "Il nemico è colpito da un lampo molto violento che può anche paralizzarlo." + }, + "rockThrow": { + "name": "Sassata", + "effect": "Chi la usa solleva una roccia e la lancia contro il nemico." + }, + "earthquake": { + "name": "Terremoto", + "effect": "Chi la usa provoca un potente sisma che colpisce gli altri Pokémon in campo." + }, + "fissure": { + "name": "Abisso", + "effect": "Chi la usa crea una spaccatura nel terreno e cerca di gettarvici dentro il nemico. Se va a segno, il nemico va KO." + }, + "dig": { + "name": "Fossa", + "effect": "Chi la usa scava al primo turno e attacca al successivo. Fuori dalla lotta fa uscire da alcuni luoghi." + }, + "toxic": { + "name": "Tossina", + "effect": "Una mossa che lascia l'obiettivo gravemente avvelenato. Il danno da veleno peggiora ad ogni turno." + }, + "confusion": { + "name": "Confusione", + "effect": "Colpisce il nemico con una leggera forza telecinetica e può anche confonderlo." + }, + "psychic": { + "name": "Psichico", + "effect": "Il nemico viene colpito da una potente forza telecinetica che può anche ridurne la Difesa Speciale." + }, + "hypnosis": { + "name": "Ipnosi", + "effect": "Chi la usa si avvale della suggestione ipnotica per far addormentare il nemico." + }, + "meditate": { + "name": "Meditazione", + "effect": "Il Pokémon medita risvegliando il potere nel profondo del suo corpo ed aumentando il suo Attacco." + }, + "agility": { + "name": "Agilità", + "effect": "Chi la usa rilassa e alleggerisce il proprio corpo per far salire di molto la Velocità." + }, + "quickAttack": { + "name": "Attacco Rapido", + "effect": "Chi la usa colpisce sempre per primo e ad una tale velocità da rendersi quasi invisibile." + }, + "rage": { + "name": "Ira", + "effect": "Questa mossa ha il potere di aumentare la statistica Attacco ogni volta che chi la usa viene colpito durante una lotta." + }, + "teleport": { + "name": "Teletrasporto", + "effect": "Fa fuggire dai Pokémon selvatici. Fuori dalla lotta porta all'ultimo Centro Pokémon visitato." + }, + "nightShade": { + "name": "Ombra Notturna", + "effect": "Fa apparire un orribile miraggio al nemico e infligge un danno pari al livello di chi la usa." + }, + "mimic": { + "name": "Mimica", + "effect": "Copia l'ultima mossa usata dal bersaglio. La mossa copiata si può utilizzare fino alla sostituzione del Pokémon." + }, + "screech": { + "name": "Stridio", + "effect": "Stridio assordante che riduce di molto la Difesa del nemico." + }, + "doubleTeam": { + "name": "Doppioteam", + "effect": "Chi la usa si muove in fretta e crea copie illusorie di se stesso che aumentano la capacità di elusione." + }, + "recover": { + "name": "Ripresa", + "effect": "Una mossa di auto-guarigione. Il Pokémon ripristina i suoi PS fino a metà dei suoi PS massimi." + }, + "harden": { + "name": "Rafforzatore", + "effect": "Tutti i muscoli del corpo si tonificano per aumentare la Difesa." + }, + "minimize": { + "name": "Minimizzato", + "effect": "Il corpo di chi la usa si comprime e diventa più piccolo. La sua capacità di elusione aumenta di molto." + }, + "smokescreen": { + "name": "Muro di Fumo", + "effect": "Il Pokémon rilascia un'oscura cortina di fumo che riduce la precisione del nemico." + }, + "confuseRay": { + "name": "Stordiraggio", + "effect": "Il nemico è colpito da un raggio sinistro che lo confonde." + }, + "withdraw": { + "name": "Ritirata", + "effect": "Il corpo si ritira nel suo duro guscio per aumentare la Difesa." + }, + "defenseCurl": { + "name": "Ricciolscudo", + "effect": "Chi la usa si raggomitola per nascondere i punti deboli e aumentare la propria Difesa." + }, + "barrier": { + "name": "Barriera", + "effect": "Innalza una barriera resistente che aumenta molto la Difesa." + }, + "lightScreen": { + "name": "Schermoluce", + "effect": "Innalza una barriera di luce fantastica per ridurre i danni degli attacchi speciali alla squadra per cinque turni." + }, + "haze": { + "name": "Nube", + "effect": "Chi la usa crea una nube nera che annulla ogni modifica delle statistiche di tutti i Pokémon in campo." + }, + "reflect": { + "name": "Riflesso", + "effect": "Innalza una barriera di luce fantastica per ridurre i danni degli attacchi fisici alla squadra per cinque turni." + }, + "focusEnergy": { + "name": "Focalenergia", + "effect": "Chi la usa fa un profondo respiro e si concentra per rendere più probabili i brutti colpi." + }, + "bide": { + "name": "Pazienza", + "effect": "Chi la usa subisce attacchi per due turni e poi restituisce il danno moltiplicato per due." + }, + "metronome": { + "name": "Metronomo", + "effect": "Il Pokémon fa di no con il dito e stimola il cervello a usare a caso una delle tante mosse esistenti." + }, + "mirrorMove": { + "name": "Speculmossa", + "effect": "Chi la usa colpisce il bersaglio copiandone l'ultima mossa usata." + }, + "selfDestruct": { + "name": "Autodistruzione", + "effect": "Chi la usa esplode e infligge danni agli altri Pokémon in campo, ma poi va KO." + }, + "eggBomb": { + "name": "Uovobomba", + "effect": "Colpisce il nemico con un grande uovo scaraventato con enorme forza." + }, + "lick": { + "name": "Leccata", + "effect": "Una lingua lunga infligge danni al nemico e può anche paralizzarlo." + }, + "smog": { + "name": "Smog", + "effect": "Colpisce il nemico con una scarica di gas maleodoranti. Può anche avvelenarlo." + }, + "sludge": { + "name": "Fango", + "effect": "Lancio di fango malsano che arreca danno al nemico. Può anche avvelenarlo." + }, + "boneClub": { + "name": "Ossoclava", + "effect": "Il Pokémon colpisce il nemico con un bastone d'osso. Può anche fare tentennare l'obiettivo." + }, + "fireBlast": { + "name": "Fuocobomba", + "effect": "Investe il nemico con un'intensa fiammata che fa terra bruciata. Può anche scottarlo." + }, + "waterfall": { + "name": "Cascata", + "effect": "Carica il nemico a grande velocità e può farlo tentennare. Fuori dalla lotta fa risalire le cascate." + }, + "clamp": { + "name": "Tenaglia", + "effect": "Chi la usa intrappola e stritola il nemico con la sua corazza spessa e forte per quattro o cinque turni." + }, + "swift": { + "name": "Comete", + "effect": "Colpisce i nemici con raggi a forma di stella. Questo attacco è infallibile." + }, + "skullBash": { + "name": "Capocciata", + "effect": "Chi la usa ritira la testa per aumentare la Difesa e poi attacca al turno successivo." + }, + "spikeCannon": { + "name": "Sparalance", + "effect": "Il nemico viene colpito da due a cinque volte in rapida successione da spilli appuntiti." + }, + "constrict": { + "name": "Limitazione", + "effect": "Colpisce il nemico con lunghi tentacoli o piante rampicanti. Può anche ridurne la Velocità." + }, + "amnesia": { + "name": "Amnesia", + "effect": "Vuoto di memoria che aumenta esponenzialmente la difesa speciale." + }, + "kinesis": { + "name": "Cinèsi", + "effect": "Chi la usa distrae il bersaglio piegando un cucchiaio e ne riduce la precisione." + }, + "softBoiled": { + "name": "Covauova", + "effect": "Chi la usa recupera metà dei propri PS massimi. Fuori dalla lotta può anche far trasferire PS ai propri compagni." + }, + "highJumpKick": { + "name": "Calcinvolo", + "effect": "Chi la usa colpisce il nemico con una ginocchiata in volo: se fallisce, subisce danni." + }, + "glare": { + "name": "Sguardo Feroce", + "effect": "Chi la usa spaventa il nemico con uno sguardo terrificante e ne causa la paralisi." + }, + "dreamEater": { + "name": "Mangiasogni", + "effect": "Attacco che funziona solo su un nemico che dorme. Chi lo usa riceve metà dei PS persi dal nemico." + }, + "poisonGas": { + "name": "Velenogas", + "effect": "Spruzza in faccia al nemico una nuvola di gas tossico che avvelena." + }, + "barrage": { + "name": "Attacco Pioggia", + "effect": "Piovono enormi sfere sulla testa del nemico da due a cinque volte di fila." + }, + "leechLife": { + "name": "Sanguisuga", + "effect": "Mossa succhiasangue. Chi la usa recupera una quantità di PS pari alla metà del danno inferto." + }, + "lovelyKiss": { + "name": "Demonbacio", + "effect": "Chi la usa intimidisce il bersaglio con una faccia paurosa e gli schiocca un bacio che lo fa addormentare." + }, + "skyAttack": { + "name": "Aeroattacco", + "effect": "Un attacco in due turni e probabile brutto colpo. Può anche far tentennare il nemico." + }, + "transform": { + "name": "Trasformazione", + "effect": "Chi la usa si trasforma in una copia esatta del bersaglio per sfruttarne le caratteristiche." + }, + "bubble": { + "name": "Bolla", + "effect": "Uno spruzzo di bolle viene lanciato sul nemico. Può ridurne la velocità." + }, + "dizzyPunch": { + "name": "Stordipugno", + "effect": "Colpisce il bersaglio con una sequenza di pugni che può anche confonderlo." + }, + "spore": { + "name": "Spora", + "effect": "Nube di spore che fa sempre addormentare il bersaglio." + }, + "flash": { + "name": "Flash", + "effect": "Il Pokémon usa un lampo di luce contro il nemico riducendone la precisione. Può essere usata per illuminare luoghi oscuri." + }, + "psywave": { + "name": "Psiconda", + "effect": "Il nemico è attaccato con una strana onda di energia. L'intensità dell'attacco è variabile." + }, + "splash": { + "name": "Splash", + "effect": "Chi la usa sguazza nell'acqua, senza ottenere alcun effetto." + }, + "acidArmor": { + "name": "Scudo Acido", + "effect": "Il Pokémon modifica la sua struttura cellulare liquefandosi, per aumentare esponenzialmente la sua difesa." + }, + "crabhammer": { + "name": "Martellata", + "effect": "Colpisce il nemico con una grande tenaglia. Probabile brutto colpo." + }, + "explosion": { + "name": "Esplosione", + "effect": "Chi la usa esplode per infliggere danni agli altri Pokémon attorno, ma va KO." + }, + "furySwipes": { + "name": "Sfuriate", + "effect": "Colpisce il nemico con artigli o falci affilate da due a cinque volte in rapida successione." + }, + "bonemerang": { + "name": "Ossomerang", + "effect": "Chi la usa lancia l'osso che tiene. L'osso colpisce due volte e ritorna come un vero e proprio boomerang." + }, + "rest": { + "name": "Riposo", + "effect": "Il Pokémon si addormenta per due turni per curare tutti i PS e qualsiasi problema di stato." + }, + "rockSlide": { + "name": "Frana", + "effect": "I nemici vengono colpiti da grandi massi che possono anche farli tentennare." + }, + "hyperFang": { + "name": "Iperzanna", + "effect": "Il Pokémon morde il nemico con zanne taglienti. Può anche farlo tentennare." + }, + "sharpen": { + "name": "Affilatore", + "effect": "Chi la usa riduce il numero di poligoni sul proprio corpo per accentuarne gli spigoli e aumentare l'Attacco." + }, + "conversion": { + "name": "Conversione", + "effect": "Il tipo di chi la usa muta in quello di una sua mossa a caso." + }, + "triAttack": { + "name": "Tripletta", + "effect": "Colpisce il nemico con tre sfere simultanee che possono anche paralizzarlo, scottarlo o congelarlo." + }, + "superFang": { + "name": "Superzanna", + "effect": "Chi la usa salta sul nemico azzannandolo con i suoi incisivi affilati e facendogli perdere metà dei PS." + }, + "slash": { + "name": "Lacerazione", + "effect": "Attacca il nemico con artigli, falci o altro. Probabile brutto colpo." + }, + "substitute": { + "name": "Sostituto", + "effect": "Chi la usa crea una copia di se stesso usando alcuni PS. La copia serve come esca per il nemico." + }, + "struggle": { + "name": "Scontro", + "effect": "Mossa da usare solo in caso estremo, quando non si hanno più PP. Danneggia anche chi la usa." + }, + "sketch": { + "name": "Schizzo", + "effect": "Permette a chi la usa di imparare l'ultima mossa usata dal bersaglio. La nuova mossa appresa sostituisce Schizzo." + }, + "tripleKick": { + "name": "Triplocalcio", + "effect": "Chi la usa esegue fino a tre calci consecutivi la cui potenza aumenta ad ogni colpo." + }, + "thief": { + "name": "Furto", + "effect": "Il Pokémon attacca e contemporaneamente ruba lo strumento tenuto dal nemico. Non ruberà nulla, se si possiede già uno strumento." + }, + "spiderWeb": { + "name": "Ragnatela", + "effect": "Copre il nemico con un filo di seta sottile e appiccicoso. Il nemico non può fuggire." + }, + "mindReader": { + "name": "Leggimente", + "effect": "Il Pokémon percepisce i movimenti del nemico con la mente per garantire il successo della mossa successiva." + }, + "nightmare": { + "name": "Incubo", + "effect": "Il nemico addormentato ha un incubo e perde PS ad ogni turno." + }, + "flameWheel": { + "name": "Ruotafuoco", + "effect": "Il Pokémon si avvolge nel fuoco e carica il nemico. Può scottare." + }, + "snore": { + "name": "Russare", + "effect": "Mossa da usare solo mentre si dorme. Il chiasso assordante può anche far tentennare il nemico." + }, + "curse": { + "name": "Maledizione", + "effect": "Una mossa che agisce in modo diverso se chi la usa è di tipo Spettro." + }, + "flail": { + "name": "Flagello", + "effect": "Chi la usa si dimena per attaccare. È più efficace se i suoi PS sono bassi." + }, + "conversion2": { + "name": "Conversione2", + "effect": "Chi la usa cambia tipo per rendersi resistente al tipo dell'ultima mossa usata dal bersaglio." + }, + "aeroblast": { + "name": "Aerocolpo", + "effect": "Colpisce il nemico con un vortice d'aria per danneggiarlo. Probabile brutto colpo." + }, + "cottonSpore": { + "name": "Cottonspora", + "effect": "Rilascia spore simili al cotone che si attaccano ai nemici nei paraggi e ne riducono di molto la Velocità." + }, + "reversal": { + "name": "Contropiede", + "effect": "Chi la usa attacca con tutte le sue forze. Più i PS sono bassi, maggiore è la potenza di questa mossa." + }, + "spite": { + "name": "Dispetto", + "effect": "Chi la usa sfoga la propria rabbia sull'ultima mossa usata dal bersaglio e le sottrae quattro PP." + }, + "powderSnow": { + "name": "Polneve", + "effect": "Attacca il nemico con una raffica di neve farinosa e può anche congelarlo." + }, + "protect": { + "name": "Protezione", + "effect": "Permette di eludere tutti gli attacchi. Se usata in successione può fallire." + }, + "machPunch": { + "name": "Pugnorapido", + "effect": "Chi la usa tira un pugno a velocità impressionante e colpisce di sicuro per primo." + }, + "scaryFace": { + "name": "Visotruce", + "effect": "Chi la usa spaventa il nemico con una faccia terribile e ne riduce di molto la Velocità." + }, + "feintAttack": { + "name": "Finta", + "effect": "Chi la usa si avvicina al nemico facendo finta di niente, per poi scagliare un pugno infallibile a tradimento." + }, + "sweetKiss": { + "name": "Dolcebacio", + "effect": "Chi la usa bacia il nemico con una dolcezza angelica, confondendolo." + }, + "bellyDrum": { + "name": "Panciamburo", + "effect": "Chi la usa massimizza l'Attacco in cambio di metà dei PS massimi." + }, + "sludgeBomb": { + "name": "Fangobomba", + "effect": "Chi la usa attacca lanciando fango sul bersaglio. Può anche avvelenarlo." + }, + "mudSlap": { + "name": "Fangosberla", + "effect": "Chi la usa butta fango in faccia al nemico per arrecargli danni e ridurne la precisione." + }, + "octazooka": { + "name": "Octazooka", + "effect": "Chi la usa spruzza del'inchiostro in faccia al nemico. Può anche ridurne la precisione." + }, + "spikes": { + "name": "Punte", + "effect": "Chi la usa piazza sul terreno una trappola di punte che danneggia i nemici quando scendono in campo." + }, + "zapCannon": { + "name": "Falcecannone", + "effect": "Chi la usa provoca un'esplosione elettrica che infligge danni e paralizza il nemico." + }, + "foresight": { + "name": "Preveggenza", + "effect": "Chi la usa rende i Pokémon di tipo Spettro vulnerabili a qualsiasi tipo di mossa e può, inoltre, colpire i nemici sfuggenti." + }, + "destinyBond": { + "name": "Destinobbligato", + "effect": "Se chi la usa va KO prima del proprio turno, chi ha sferrato il colpo da KO fa la stessa fine." + }, + "perishSong": { + "name": "Ultimocanto", + "effect": "Ogni Pokémon che sente questo canto va KO in tre turni, se non lo si sostituisce." + }, + "icyWind": { + "name": "Ventogelato", + "effect": "Chi la usa attacca i nemici con una folata di aria gelida e ne riduce anche la Velocità." + }, + "detect": { + "name": "Individua", + "effect": "Consente al Pokémon di evitare tutti gli attacchi. Può fallire se usato in successione." + }, + "boneRush": { + "name": "Ossoraffica", + "effect": "Chi la usa colpisce il nemico con un osso duro, da 2 a 5 volte di fila." + }, + "lockOn": { + "name": "Localizza", + "effect": "Chi la usa punta il nemico con precisione. La mossa successiva andrà a segno." + }, + "outrage": { + "name": "Oltraggio", + "effect": "Chi la usa sfoga la sua ira e attacca il nemico per due o tre turni prima di essere lasciato in preda alla confusione." + }, + "sandstorm": { + "name": "Terrempesta", + "effect": "Causa una tempesta di sabbia per cinque turni che danneggia tutti i tipi in campo esclusi Terra, Roccia e Acciaio." + }, + "gigaDrain": { + "name": "Gigassorbimento", + "effect": "Mossa che assorbe PS. Chi la usa recupera un quantità di PS pari alla metà del danno inferto." + }, + "endure": { + "name": "Resistenza", + "effect": "Chi la usa resta con un PS anche se subisce un colpo da KO in quel turno. Usata in successione può fallire." + }, + "charm": { + "name": "Fascino", + "effect": "Ammalia il nemico con lo sguardo per renderlo meno cauto. Riduce molto l'Attacco del nemico." + }, + "rollout": { + "name": "Rotolamento", + "effect": "Chi la usa colpisce il nemico rotolando per cinque turni, con aumento progressivo della potenza ogni volta che va a segno." + }, + "falseSwipe": { + "name": "Falsofinale", + "effect": "Chi la usa trattiene il colpo per impedire al nemico di andare KO, lasciandolo con almeno un PS." + }, + "swagger": { + "name": "Bullo", + "effect": "Chi la usa provoca il bersaglio e lo confonde, facendo aumentare però di molto il suo Attacco." + }, + "milkDrink": { + "name": "Buonlatte", + "effect": "Chi la usa recupera metà dei propri PS massimi. Fuori dalla lotta può anche far trasferire PS ai propri compagni." + }, + "spark": { + "name": "Scintilla", + "effect": "Colpisce il nemico con una carica elettrica e può anche paralizzarlo." + }, + "furyCutter": { + "name": "Tagliofuria", + "effect": "Colpisce il nemico con falci o artigli. Se usata in successione aumenta di potenza ogni volta che va a segno." + }, + "steelWing": { + "name": "Alacciaio", + "effect": "Colpisce il nemico con ali d'acciaio. Può anche aumentare la Difesa di chi la usa." + }, + "meanLook": { + "name": "Malosguardo", + "effect": "Chi la usa blocca il nemico con uno sguardo oscuro e ammaliante, impedendogli la fuga." + }, + "attract": { + "name": "Attrazione", + "effect": "Se il nemico è del sesso opposto, s'infatua e attacca con meno probabilità." + }, + "sleepTalk": { + "name": "Sonnolalia", + "effect": "Chi la usa sfodera a caso una delle proprie mosse mentre sta dormendo." + }, + "healBell": { + "name": "Rintoccasana", + "effect": "Chi la usa fa suonare le campane per curare completamente tutta la squadra." + }, + "return": { + "name": "Ritorno", + "effect": "Mossa che diventa tanto più potente quanto maggiore è il grado di affezione del Pokémon per il proprio Allenatore." + }, + "present": { + "name": "Regalino", + "effect": "Chi la usa dà un regalo bomba al bersaglio. A volte, però, può fargli recuperare PS." + }, + "frustration": { + "name": "Frustrazione", + "effect": "Mossa che diventa tanto più potente quanto minore è il grado di affezione del Pokémon per il proprio Allenatore." + }, + "safeguard": { + "name": "Salvaguardia", + "effect": "Chi la usa crea un campo protettivo che difende tutta la squadra dai problemi di stato per cinque turni." + }, + "painSplit": { + "name": "Malcomune", + "effect": "Chi la usa somma i propri PS a quelli di un altro Pokémon per poi dividerli in parti uguali." + }, + "sacredFire": { + "name": "Magifuoco", + "effect": "Colpisce il nemico con un fuoco mistico di enorme intensità che può anche causargli una scottatura." + }, + "magnitude": { + "name": "Magnitudo", + "effect": "Chi la usa scatena un terremoto d'intensità variabile che danneggia gli altri Pokémon in campo." + }, + "dynamicPunch": { + "name": "Dinamipugno", + "effect": "Colpisce il nemico con un pugno davvero forte. Se va a segno, lo confonde." + }, + "megahorn": { + "name": "Megacorno", + "effect": "Chi la usa utilizza il suo corno per montare con grande forza il nemico." + }, + "dragonBreath": { + "name": "Dragospiro", + "effect": "Investe il nemico con una raffica potentissima che arreca danni. Può anche paralizzarlo." + }, + "batonPass": { + "name": "Staffetta", + "effect": "Chi la usa è sostituito da un Pokémon della squadra, che eredita anche ogni modifica alle statistiche." + }, + "encore": { + "name": "Ripeti", + "effect": "Chi la usa costringe il nemico a continuare ad utilizzare solo l'ultima mossa utilizzata da 2 a 6 turni." + }, + "pursuit": { + "name": "Inseguimento", + "effect": "Una mossa d'attacco che infligge un danno doppio se il nemico è in fase di sostituzione." + }, + "rapidSpin": { + "name": "Rapigiro", + "effect": "Un attacco roteante che elimina gli effetti delle mosse Legatutto, Avvolgibotta, Parassiseme e Punte." + }, + "sweetScent": { + "name": "Profumino", + "effect": "Un dolce profumo che alletta il nemico per ridurne l'elusione. Attira anche Pokémon selvatici." + }, + "ironTail": { + "name": "Codacciaio", + "effect": "Il nemico viene colpito da una robusta coda d'acciaio. Può anche ridurne la Difesa." + }, + "metalClaw": { + "name": "Ferrartigli", + "effect": "Colpisce il nemico con artigli d'acciaio. Può anche aumentare l'Attacco di chi la usa." + }, + "vitalThrow": { + "name": "Vitaltiro", + "effect": "Chi la usa attacca per ultimo, ma il colpo è sempre infallibile." + }, + "morningSun": { + "name": "Mattindoro", + "effect": "Chi la usa recupera PS. Il numero di PS recuperati dipende dalle condizioni atmosferiche." + }, + "synthesis": { + "name": "Sintesi", + "effect": "Chi la usa recupera PS. Il numero di PS recuperati dipende dalle condizioni atmosferiche." + }, + "moonlight": { + "name": "Lucelunare", + "effect": "Chi la usa recupera PS. Il numero di PS recuperati dipende dalle condizioni atmosferiche." + }, + "hiddenPower": { + "name": "Introforza", + "effect": "Mossa singolare che cambia tipo e potenza a seconda del Pokémon che la usa." + }, + "crossChop": { + "name": "Incrocolpo", + "effect": "Investe il nemico con un colpo sferrato con entrambe le braccia incrociate. Probabile brutto colpo." + }, + "twister": { + "name": "Tornado", + "effect": "Un potente tornado si abbatte sul nemico. Può anche far tentennare." + }, + "rainDance": { + "name": "Pioggiadanza", + "effect": "Chi la usa provoca una forte pioggia per cinque turni, potenziando le mosse di tipo Acqua." + }, + "sunnyDay": { + "name": "Giornodisole", + "effect": "Chi la usa intensifica i raggi solari per cinque turni, potenziando le mosse di tipo Fuoco." + }, + "crunch": { + "name": "Sgranocchio", + "effect": "Il nemico viene morso con denti affilati. Può anche ridurne la Difesa." + }, + "mirrorCoat": { + "name": "Specchiovelo", + "effect": "Mossa che replica ogni attacco speciale, arrecando il doppio del danno ricevuto." + }, + "psychUp": { + "name": "Psicamisù", + "effect": "Chi la usa s'ipnotizza per copiare ogni modifica alle statistiche del bersaglio." + }, + "extremeSpeed": { + "name": "Extrarapido", + "effect": "Chi la usa carica il nemico a velocità impressionante ed attacca sempre per primo." + }, + "ancientPower": { + "name": "Forzantica", + "effect": "Colpisce il nemico con una forza primordiale. Può aumentare tutte le statistiche." + }, + "shadowBall": { + "name": "Palla Ombra", + "effect": "Lancia sul nemico una sfera nera. Può anche ridurne la Difesa Speciale." + }, + "futureSight": { + "name": "Divinazione", + "effect": "Due turni dopo l'utilizzo di questa mossa, il nemico viene attaccato con energia psichica." + }, + "rockSmash": { + "name": "Spaccaroccia", + "effect": "Il nemico viene colpito da un pugno in grado di frantumare anche la roccia. Può anche ridurne la Difesa." + }, + "whirlpool": { + "name": "Mulinello", + "effect": "Intrappola il nemico in un turbine d'acqua che dura per quattro o cinque turni infliggendogli dei danni ogni turno." + }, + "beatUp": { + "name": "Picchiaduro", + "effect": "Chi la usa chiama in aiuto i Pokémon della squadra: più ce ne sono, maggiore è il numero di attacchi." + }, + "fakeOut": { + "name": "Bruciapelo", + "effect": "Mossa che fa agire per primo e fa tentennare il nemico. Funziona solo appena sceso in campo." + }, + "uproar": { + "name": "Baraonda", + "effect": "Chi la usa attacca per tre turni con un frastuono che non fa dormire nessuno." + }, + "stockpile": { + "name": "Accumulo", + "effect": "Chi la usa accumula energia aumentando la Difesa e la Difesa Speciale. Si può utilizzare tre volte." + }, + "spitUp": { + "name": "Sfoghenergia", + "effect": "Tutta l'energia accumulata in precedenza con Accumulo è rilasciata nell'attacco. Maggiore è l'energia, più danni si arrecano." + }, + "swallow": { + "name": "Introenergia", + "effect": "Chi la usa assorbe l'energia raccolta con la mossa Accumulo e recupera PS. Maggiore è l'energia, più PS si recuperano." + }, + "heatWave": { + "name": "Ondacalda", + "effect": "Chi la usa investe i nemici con una folata di vento caldo. Può anche scottare." + }, + "hail": { + "name": "Grandine", + "effect": "Chi la usa causa una grandinata che dura cinque turni. Danneggia tutti i Pokémon tranne quelli di tipo Ghiaccio." + }, + "torment": { + "name": "Attaccalite", + "effect": "Chi la usa tormenta e fa infuriare il nemico, impedendogli di usare la stessa mossa due volte di seguito." + }, + "flatter": { + "name": "Adulazione", + "effect": "Adula il bersaglio e lo confonde, ma ne aumenta l'Attacco Speciale." + }, + "willOWisp": { + "name": "Fuocofatuo", + "effect": "Fiamme intense di colore viola causano una scottatura al nemico." + }, + "memento": { + "name": "Memento", + "effect": "Chi la usa va KO. Tuttavia, riduce di molto l'Attacco e l'Attacco Speciale del nemico." + }, + "facade": { + "name": "Facciata", + "effect": "Mossa d'attacco che raddoppia la potenza se chi la usa è scottato, avvelenato o paralizzato." + }, + "focusPunch": { + "name": "Centripugno", + "effect": "Chi la usa prende la mira prima di sferrare un pugno. Fallirà se verrà colpito prima di eseguire la mossa." + }, + "smellingSalts": { + "name": "Maniereforti", + "effect": "Infligge un danno doppio ad un bersaglio paralizzato, ma ne cura anche la paralisi." + }, + "followMe": { + "name": "Sonoqui", + "effect": "Chi la usa attrae l'attenzione su di sé, costringendo i nemici a sceglierlo sempre come bersaglio." + }, + "naturePower": { + "name": "Naturforza", + "effect": "Mossa che fa uso della forza della natura. Il suo effetto varia in base all'ambiente." + }, + "charge": { + "name": "Sottocarica", + "effect": "Potenzia la mossa di tipo Elettro usata subito dopo. Aumenta anche la Difesa Speciale di chi la usa." + }, + "taunt": { + "name": "Provocazione", + "effect": "Provoca il nemico, inducendolo ad usare solo mosse d'attacco per tre turni." + }, + "helpingHand": { + "name": "Altruismo", + "effect": "Mossa che aumenta la potenza dell'attacco di un alleato." + }, + "trick": { + "name": "Raggiro", + "effect": "Chi la usa coglie il bersaglio in contropiede e l'obbliga a cambiare il suo strumento con il proprio." + }, + "rolePlay": { + "name": "Giocodiruolo", + "effect": "Chi la usa mima in tutto il bersaglio, copiandone l'abilità." + }, + "wish": { + "name": "Desiderio", + "effect": "Permette di recuperare metà dei PS massimi al turno successivo." + }, + "assist": { + "name": "Assistente", + "effect": "Chi la usa utilizza in fretta e a caso una delle mosse degli altri Pokémon della squadra." + }, + "ingrain": { + "name": "Radicamento", + "effect": "Chi la usa mette delle radici che gli fanno recuperare PS a ogni turno. Non può essere sostituito." + }, + "superpower": { + "name": "Troppoforte", + "effect": "Chi la usa attacca il nemico con grande forza, ma il suo Attacco e la sua Difesa diminuiscono." + }, + "magicCoat": { + "name": "Magivelo", + "effect": "Una barriera rimanda al mittente l'effetto di mosse come Parassiseme e di mosse che influenzano lo stato." + }, + "recycle": { + "name": "Riciclo", + "effect": "Chi la usa ricicla uno strumento tenuto, già usato nella lotta, e lo può riutilizzare." + }, + "revenge": { + "name": "Vendetta", + "effect": "Mossa d'attacco che infligge un danno doppio se si è stati colpiti dal nemico nello stesso turno." + }, + "brickBreak": { + "name": "Breccia", + "effect": "Colpisce il nemico con una mano e rompe barriere come Riflesso e Schermoluce." + }, + "yawn": { + "name": "Sbadiglio", + "effect": "Chi la usa fa un grande sbadiglio che addormenta il nemico al turno seguente." + }, + "knockOff": { + "name": "Privazione", + "effect": "Attacco che blocca anche lo strumento tenuto dal nemico, impedendone l'uso nella lotta." + }, + "endeavor": { + "name": "Rimonta", + "effect": "Attacco che riduce i PS del nemico a una quantità pari ai PS di chi la usa." + }, + "eruption": { + "name": "Eruzione", + "effect": "Attacco impetuoso ed esplosivo la cui potenza è proporzionale ai PS di chi lo usa." + }, + "skillSwap": { + "name": "Baratto", + "effect": "Chi la usa sfrutta le sue facoltà mentali per scambiare l'abilità con il bersaglio." + }, + "imprison": { + "name": "Esclusiva", + "effect": "Chi la usa impedisce al nemico di usare mosse che conoscono entrambi." + }, + "refresh": { + "name": "Rinfrescata", + "effect": "Chi la usa riposa per curarsi da avvelenamento, paralisi e scottatura." + }, + "grudge": { + "name": "Rancore", + "effect": "Se chi la usa va KO, i PP della mossa nemica che lo ha messo fuori gioco si azzerano." + }, + "snatch": { + "name": "Scippo", + "effect": "Chi la usa ruba e utilizza la mossa curativa o modifica-statistiche che il bersaglio stava per usare." + }, + "secretPower": { + "name": "Forzasegreta", + "effect": "Attacco che può avere un effetto aggiuntivo a seconda del luogo in cui si trova chi lo usa." + }, + "dive": { + "name": "Sub", + "effect": "Chi la usa si tuffa in acqua per emergere e attaccare al turno seguente. Fuori dalla lotta permette di immergersi sott'acqua." + }, + "armThrust": { + "name": "Sberletese", + "effect": "Raffica di ceffoni che colpisce da due a cinque volte di fila." + }, + "camouflage": { + "name": "Camuffamento", + "effect": "Modifica il tipo di chi la usa a seconda del luogo, ad esempio sull'acqua, nell'erba o in una grotta." + }, + "tailGlow": { + "name": "Codadiluce", + "effect": "Chi la usa fissa una luce forte per concentrarsi e aumentare moltissimo l'Attacco Speciale." + }, + "lusterPurge": { + "name": "Abbagliante", + "effect": "Chi la usa scatena un'esplosione abbagliante che può anche ridurre la Difesa Speciale del Pokémon colpito." + }, + "mistBall": { + "name": "Foschisfera", + "effect": "Una sfera coperta di nebbia danneggia il nemico. Può anche ridurre l'Attacco Speciale." + }, + "featherDance": { + "name": "Danzadipiume", + "effect": "Chi la usa copre il nemico con un manto di piume che riduce di molto il suo Attacco." + }, + "teeterDance": { + "name": "Strampadanza", + "effect": "Chi la usa esegue una danza goffa che confonde tutti i Pokémon attorno." + }, + "blazeKick": { + "name": "Calciardente", + "effect": "Chi la usa tira un calcio. Probabile brutto colpo. Può anche causare una scottatura." + }, + "mudSport": { + "name": "Fangata", + "effect": "Chi la usa si ricopre di fango indebolendo le mosse di tipo Elettro finché resta in campo." + }, + "iceBall": { + "name": "Palla Gelo", + "effect": "Chi la usa attacca il nemico rotolando per cinque turni, con aumento progressivo della potenza ogni volta che va a segno." + }, + "needleArm": { + "name": "Pugnospine", + "effect": "Chi la usa attacca colpendo il bersaglio con i suoi arti pieni di spine. Può far tentennare il Pokémon colpito." + }, + "slackOff": { + "name": "Pigro", + "effect": "Chi la usa si rilassa recuperando metà dei propri PS massimi." + }, + "hyperVoice": { + "name": "Granvoce", + "effect": "Chi la usa lancia un urlo straziante che danneggia i nemici." + }, + "poisonFang": { + "name": "Velenodenti", + "effect": "Chi la usa morde il nemico con denti avvelenati che possono anche iperavvelenarlo." + }, + "crushClaw": { + "name": "Tritartigli", + "effect": "Colpisce il nemico con artigli robusti e affilati che possono ridurne la Difesa." + }, + "blastBurn": { + "name": "Incendio", + "effect": "Potente esplosione che danneggia il nemico, ma fa saltare il turno successivo a chi la provoca." + }, + "hydroCannon": { + "name": "Idrocannone", + "effect": "Colpisce il nemico con un potente getto d'acqua. Chi la usa salta il turno successivo." + }, + "meteorMash": { + "name": "Meteorpugno", + "effect": "Colpisce il nemico con un pugno veloce come una meteora. Può far pure salire l'Attacco di chi la usa." + }, + "astonish": { + "name": "Sgomento", + "effect": "Chi la usa attacca il bersaglio emettendo un verso terrificante. Può anche farlo tentennare." + }, + "weatherBall": { + "name": "Palla Clima", + "effect": "Mossa d'attacco che varia tipo e forza in base alle condizioni atmosferiche." + }, + "aromatherapy": { + "name": "Aromaterapia", + "effect": "Chi la usa rilascia un dolce profumo che cura tutti problemi di stato propri e degli alleati." + }, + "fakeTears": { + "name": "Falselacrime", + "effect": "Chi la usa inscena un pianto teatrale per commuovere il nemico. Ne riduce di molto la Difesa Speciale." + }, + "airCutter": { + "name": "Aerasoio", + "effect": "Chi la usa provoca un vento tagliente che sferza i nemici. Probabile brutto colpo." + }, + "overheat": { + "name": "Vampata", + "effect": "Chi la usa sferra un potente attacco, ma il contraccolpo riduce di molto il suo Attacco Speciale." + }, + "odorSleuth": { + "name": "Segugio", + "effect": "Chi la usa rende i Pokémon di tipo Spettro vulnerabili a qualsiasi tipo di mossa e può, inoltre, colpire i nemici sfuggenti." + }, + "rockTomb": { + "name": "Rocciotomba", + "effect": "Colpisce il nemico con rocce. Inoltre, lo rallenta riducendone la Velocità." + }, + "silverWind": { + "name": "Ventargenteo", + "effect": "Attacca con un forte vento di polvere di squame. Tutte le statistiche di chi la usa possono salire." + }, + "metalSound": { + "name": "Ferrostrido", + "effect": "Orribile stridio, simile a quello prodotto dal metallo, che riduce di molto la Difesa Speciale del nemico." + }, + "grassWhistle": { + "name": "Meloderba", + "effect": "Una dolce melodia culla il bersaglio e lo costringe ad addormentarsi." + }, + "tickle": { + "name": "Solletico", + "effect": "Chi la usa solletica il nemico e lo fa ridere, riducendo il suo Attacco e la sua Difesa." + }, + "cosmicPower": { + "name": "Cosmoforza", + "effect": "Chi la usa assorbe una forza mistica dallo spazio che aumenta la Difesa e la Difesa Speciale." + }, + "waterSpout": { + "name": "Zampillo", + "effect": "Lancia un getto d'acqua contro il nemico che ha davanti e quelli adiacenti. La potenza è proporzionale al numero di PS di chi la usa." + }, + "signalBeam": { + "name": "Segnoraggio", + "effect": "Chi la usa attacca con uno strano raggio di luce che può anche confondere il Pokémon colpito." + }, + "shadowPunch": { + "name": "Pugnodombra", + "effect": "Il nemico riceve un pugno proveniente dalle tenebre. Questa mossa è infallibile." + }, + "extrasensory": { + "name": "Extrasenso", + "effect": "Chi la usa attacca con una misteriosa forza invisibile. Può far tentennare il nemico." + }, + "skyUppercut": { + "name": "Stramontante", + "effect": "Chi la usa attacca il nemico con un montante che può arrivare fino in cielo." + }, + "sandTomb": { + "name": "Sabbiotomba", + "effect": "Chi la usa intrappola il nemico in un turbine di sabbia per quattro o cinque turni." + }, + "sheerCold": { + "name": "Purogelo", + "effect": "Ondata di freddo penetrante che, se va a segno, fa andare KO il nemico." + }, + "muddyWater": { + "name": "Fanghiglia", + "effect": "Chi la usa attacca con un getto di fango che può anche ridurre la precisione dei nemici." + }, + "bulletSeed": { + "name": "Semitraglia", + "effect": "Chi la usa spara da due a cinque raffiche di semi contro il bersaglio in successione." + }, + "aerialAce": { + "name": "Aeroassalto", + "effect": "Chi la usa attacca il nemico a grande velocità. Questa mossa è infallibile." + }, + "icicleSpear": { + "name": "Gelolancia", + "effect": "Chi la usa spara ghiaccioli affilati contro il nemico da due a cinque volte di fila." + }, + "ironDefense": { + "name": "Ferroscudo", + "effect": "Il corpo di chi la usa si indurisce come il ferro, facendone salire di molto la Difesa." + }, + "block": { + "name": "Blocco", + "effect": "Chi la usa sbarra la strada al nemico impedendone la fuga o la sostituzione." + }, + "howl": { + "name": "Gridodilotta", + "effect": "Chi la usa emette un verso molto forte per darsi coraggio e aumentare l'Attacco." + }, + "dragonClaw": { + "name": "Dragartigli", + "effect": "Chi la usa attacca con artigli affilati che graffiano il nemico rapidamente e con grande forza." + }, + "frenzyPlant": { + "name": "Radicalbero", + "effect": "Un groviglio di radici colpisce il nemico. Chi la usa salta il turno successivo." + }, + "bulkUp": { + "name": "Granfisico", + "effect": "Chi la usa tende i muscoli per gonfiare il corpo, aumentando Difesa e Attacco." + }, + "bounce": { + "name": "Rimbalzo", + "effect": "Chi la usa balza in alto e ricade sul nemico dopo un turno. Può anche paralizzare." + }, + "mudShot": { + "name": "Colpodifango", + "effect": "Chi la usa attacca lanciando fango sul nemico. Riduce anche la Velocità." + }, + "poisonTail": { + "name": "Velenocoda", + "effect": "Chi la usa colpisce con la coda e può avvelenare il nemico. Probabile brutto colpo." + }, + "covet": { + "name": "Supplica", + "effect": "Chi la usa attacca il bersaglio sorridendo e gli ruba lo strumento che tiene." + }, + "voltTackle": { + "name": "Locomovolt", + "effect": "Chi la usa si carica di elettricità e poi attacca. Può paralizzare il nemico. Il contraccolpo causa seri danni." + }, + "magicalLeaf": { + "name": "Fogliamagica", + "effect": "Chi la usa sparpaglia strane foglie che inseguono il bersaglio. Questa mossa è infallibile." + }, + "waterSport": { + "name": "Docciascudo", + "effect": "Chi la usa s'impregna d'acqua indebolendo le mosse di tipo Fuoco finché resta in campo." + }, + "calmMind": { + "name": "Calmamente", + "effect": "Chi la usa, meditando, placa il proprio spirito per aumentare l'Attacco Speciale e la Difesa Speciale." + }, + "leafBlade": { + "name": "Fendifoglia", + "effect": "Colpisce il nemico usando una foglia affilata come una spada. Probabile brutto colpo." + }, + "dragonDance": { + "name": "Dragodanza", + "effect": "Danza mistica e vigorosa che aumenta l'Attacco e la Velocità di chi la usa." + }, + "rockBlast": { + "name": "Cadutamassi", + "effect": "Colpisce il nemico con dei massi pesanti lanciati in rapida successione. Il numero di massi varia da due a cinque." + }, + "shockWave": { + "name": "Ondashock", + "effect": "Chi la usa colpisce il nemico con una scossa di elettricità. È impossibile eludere questa mossa." + }, + "waterPulse": { + "name": "Idropulsar", + "effect": "Il nemico viene colpito da un getto d'acqua potentissimo che può anche confonderlo." + }, + "doomDesire": { + "name": "Desiderio Fatale", + "effect": "Intensa luce solare che colpisce il nemico dopo due turni dall'uso della mossa." + }, + "psychoBoost": { + "name": "Psicoslancio", + "effect": "Chi la usa sferra un potente attacco, ma il contraccolpo riduce di molto il suo Attacco Speciale." + }, + "roost": { + "name": "Trespolo", + "effect": "Chi la usa sta fermo e riposa, recuperando metà dei propri PS massimi." + }, + "gravity": { + "name": "Gravità", + "effect": "Intensifica la gravità per cinque turni. Le mosse che fanno volare e Levitazione sono inutilizzabili." + }, + "miracleEye": { + "name": "Miracolvista", + "effect": "Chi la usa rende i Pokémon di tipo Buio vulnerabili a qualsiasi tipo di mossa e può, inoltre, colpire i nemici sfuggenti." + }, + "wakeUpSlap": { + "name": "Svegliopacca", + "effect": "Un attacco che infligge doppi danni se il nemico è Addormentato. Inoltre, lo sveglierà dal sonno." + }, + "hammerArm": { + "name": "Martelpugno", + "effect": "Chi la usa colpisce il nemico con il suo pugno forte e pesante, ma perde Velocità." + }, + "gyroBall": { + "name": "Vortexpalla", + "effect": "Chi la usa colpisce il nemico con un vortice rapidissimo. Più lento è chi la usa, maggiore è il danno." + }, + "healingWish": { + "name": "Curardore", + "effect": "Chi la usa va KO, ma il Pokémon che lo sostituisce recupera tutti i PS e risolve i problemi di stato." + }, + "brine": { + "name": "Acquadisale", + "effect": "Se i PS del nemico sono scesi a metà o meno, questa mossa colpirà con il doppio della potenza." + }, + "naturalGift": { + "name": "Dononaturale", + "effect": "Chi la usa trae forza dalla Bacca che tiene. Da questa dipendono il tipo e la forza dell'attacco." + }, + "feint": { + "name": "Fintoattacco", + "effect": "Un attacco che colpisce un nemico che ha usato Protezione od Individua. Ne rimuoverà inoltre gli effetti." + }, + "pluck": { + "name": "Spennata", + "effect": "Chi la usa becca il bersaglio. Inoltre, se questi tiene una Bacca, gliela ruba e ne sfrutta gli effetti." + }, + "tailwind": { + "name": "Ventoincoda", + "effect": "Chi la usa crea turbolente raffiche di vento che aumentano la sua Velocità e quella di tutti i Pokémon della squadra." + }, + "acupressure": { + "name": "Acupressione", + "effect": "Chi la usa esercita pressione su alcuni punti nevralgici e aumenta di molto una statistica a caso." + }, + "metalBurst": { + "name": "Metalscoppio", + "effect": "Chi la usa si vendica sul nemico che l'ha appena ferito con una mossa anche più potente." + }, + "uTurn": { + "name": "Retromarcia", + "effect": "Dopo aver selezionato questo attacco, chi la usa colpisce il nemico per poi essere sostituito con un altro Pokémon della squadra." + }, + "closeCombat": { + "name": "Zuffa", + "effect": "Chi la usa attacca abbassando la guardia. La propria Difesa e la Difesa Speciale si riducono." + }, + "payback": { + "name": "Rivincita", + "effect": "Chi la usa accumula forza, poi attacca. La potenza raddoppia se agisce dopo il Pokémon nemico." + }, + "assurance": { + "name": "Garanzia", + "effect": "Se il nemico ha già subito dei danni nello stesso turno, la potenza di questa mossa raddoppia." + }, + "embargo": { + "name": "Divieto", + "effect": "Impedisce al nemico di usare lo strumento che tiene e al suo Allenatore di usarne altri sul Pokémon." + }, + "fling": { + "name": "Lancio", + "effect": "Chi la usa lancia sul nemico lo strumento che tiene. La forza e l'effetto dipendono dallo strumento." + }, + "psychoShift": { + "name": "Psicotrasfer", + "effect": "Con la forza psichica e la suggestione, chi la usa può trasferire i suoi problemi di stato al Pokémon colpito." + }, + "trumpCard": { + "name": "Asso", + "effect": "Minori PP rimangono a questa mossa, e maggiori danni apporterà al nemico." + }, + "healBlock": { + "name": "Anticura", + "effect": "Chi la usa impedisce al nemico di utilizzare mosse o abilità recupera-PS per cinque turni." + }, + "wringOut": { + "name": "Strizzata", + "effect": "Chi la usa stritola con forza il nemico. Più PS ha il nemico, maggiore è la potenza della mossa." + }, + "powerTrick": { + "name": "Ingannoforza", + "effect": "Mossa psichica che permette a chi la usa di scambiare i valori delle sue statistiche di Attacco e Difesa." + }, + "gastroAcid": { + "name": "Gastroacido", + "effect": "Chi la usa lancia acidi gastrici sul nemico. Il fluido annulla l'abilità del nemico." + }, + "luckyChant": { + "name": "Fortuncanto", + "effect": "Chi la usa rivolge un incantesimo al cielo, impedendo al nemico di sferrare brutti colpi alla squadra." + }, + "meFirst": { + "name": "Precedenza", + "effect": "Se chi la usa è più veloce del nemico, gli ruba la mossa e gliela ritorce contro con potenza persino maggiore." + }, + "copycat": { + "name": "Copione", + "effect": "Chi la usa imita l'ultima mossa usata dal nemico. La mossa fallisce se questo non ha selezionato alcuna mossa." + }, + "powerSwap": { + "name": "Barattoforza", + "effect": "Chi la usa sfrutta la sua forza psichica per scambiare le modifiche ad Attacco e Attacco Speciale con il bersaglio." + }, + "guardSwap": { + "name": "Barattoscudo", + "effect": "Chi la usa sfrutta la sua forza psichica per scambiare le modifiche a Difesa e a Difesa Speciale con il bersaglio." + }, + "punishment": { + "name": "Punizione", + "effect": "Questa mossa diventa più potente ogni volta che il nemico aumenta le proprie statistiche." + }, + "lastResort": { + "name": "Ultimascelta", + "effect": "Per usare questa mossa, bisogna prima avvalersi in lotta di tutte le altre mosse conosciute." + }, + "worrySeed": { + "name": "Affannoseme", + "effect": "Un seme che causa ansia viene piantato sul bersaglio. Ne muta l'abilità in Insonnia e ne previene o rimuove il sonno." + }, + "suckerPunch": { + "name": "Sbigoattacco", + "effect": "Chi la usa può attaccare per primo. Fallisce se il nemico non sta preparando un attacco." + }, + "toxicSpikes": { + "name": "Fielepunte", + "effect": "Chi la usa piazza ai piedi del nemico delle punte avvelenate. Avvelena ogni nemico che entra in lotta." + }, + "heartSwap": { + "name": "Cuorbaratto", + "effect": "Chi la usa sfrutta la sua forza psichica per scambiare le modifiche alle statistiche con il bersaglio." + }, + "aquaRing": { + "name": "Acquanello", + "effect": "Chi la usa si avvolge in un velo d'acqua. Recupera alcuni PS ad ogni turno." + }, + "magnetRise": { + "name": "Magnetascesa", + "effect": "Chi la usa si solleva in aria per cinque turni grazie a un campo elettromagnetico." + }, + "flareBlitz": { + "name": "Fuococarica", + "effect": "Chi la usa si ricopre di fuoco e carica il bersaglio, ma subisce il contraccolpo. Può anche scottare." + }, + "forcePalm": { + "name": "Palmoforza", + "effect": "Chi la usa attacca con un'onda d'urto che può anche paralizzare il bersaglio." + }, + "auraSphere": { + "name": "Sferapulsar", + "effect": "Chi la usa rilascia una forza eterea dal profondo del corpo. La mossa è infallibile." + }, + "rockPolish": { + "name": "Lucidatura", + "effect": "Chi la usa leviga il proprio corpo per ridurne l'attrito. Aumenta di molto la Velocità." + }, + "poisonJab": { + "name": "Velenpuntura", + "effect": "Il nemico viene colpito con un tentacolo od un braccio intriso di veleno. Può anche avvelenarlo." + }, + "darkPulse": { + "name": "Neropulsar", + "effect": "Chi la usa emana un'aura impregnata di oscuri pensieri. Può anche far tentennare il Pokémon colpito." + }, + "nightSlash": { + "name": "Nottesferza", + "effect": "Chi la usa colpisce il nemico appena si presenta l'occasione. Probabile brutto colpo." + }, + "aquaTail": { + "name": "Idrondata", + "effect": "Chi la usa attacca agitando la coda come se fosse una violenta ondata in una tempesta furiosa." + }, + "seedBomb": { + "name": "Semebomba", + "effect": "Chi la usa emette una raffica di semi dal guscio duro che colpiscono il bersaglio dall'alto." + }, + "airSlash": { + "name": "Eterelama", + "effect": "Chi la usa attacca con un vento tagliente che squarcia il cielo. Può anche far tentennare il Pokémon colpito." + }, + "xScissor": { + "name": "Forbice X", + "effect": "Chi la usa colpisce il nemico usando le sue falci o artigli come se fossero un paio di forbici." + }, + "bugBuzz": { + "name": "Ronzio", + "effect": "Chi la usa muove le ali per creare un suono che danneggia il nemico. Può anche ridurne la Difesa Speciale." + }, + "dragonPulse": { + "name": "Dragopulsar", + "effect": "Chi la usa attacca un'onda d'urto generata spalancando la bocca." + }, + "dragonRush": { + "name": "Dragofuria", + "effect": "Chi la usa attacca con fare minaccioso e in questo modo può anche far tentennare il nemico." + }, + "powerGem": { + "name": "Gemmoforza", + "effect": "Chi la usa attacca con un raggio di luce che brilla come se fosse fatto di pietre preziose." + }, + "drainPunch": { + "name": "Assorbipugno", + "effect": "Pugno che assorbe energia. Fa recuperare una quantità di PS pari alla metà del danno inferto." + }, + "vacuumWave": { + "name": "Vuotonda", + "effect": "Chi la usa rotea i pugni per lanciare un'onda di vuoto assoluto verso il nemico. Attacca per primo." + }, + "focusBlast": { + "name": "Focalcolpo", + "effect": "Chi la usa incrementa la sua concentrazione mentale per scatenare il suo potere. Può ridurre la Difesa Speciale del nemico." + }, + "energyBall": { + "name": "Energipalla", + "effect": "Chi la usa attinge energia dalla natura e la scaglia contro il bersaglio. Può anche ridurne la Difesa Speciale." + }, + "braveBird": { + "name": "Baldeali", + "effect": "Chi la usa si nasconde sotto le ali e carica da bassa quota. Tuttavia, subisce considerevoli danni." + }, + "earthPower": { + "name": "Geoforza", + "effect": "Dal terreno sotto il nemico si sprigiona una forza devastante. Può anche ridurne la Difesa Speciale." + }, + "switcheroo": { + "name": "Rapidscambio", + "effect": "Chi la usa scambia in maniera fulminea il proprio oggetto con quello del nemico." + }, + "gigaImpact": { + "name": "Gigaimpatto", + "effect": "Chi la usa carica il nemico usando tutta la sua forza, ma al turno successivo deve riposare." + }, + "nastyPlot": { + "name": "Congiura", + "effect": "Chi la usa stimola il cervello pensando a cose cattive. Aumenta di molto l'Attacco Speciale." + }, + "bulletPunch": { + "name": "Pugnoscarica", + "effect": "Chi la usa attacca con una scarica di pugni veloci come proiettili. Con questa mossa si colpisce per primi." + }, + "avalanche": { + "name": "Slavina", + "effect": "Un attacco che infligge doppi danni se l'utilizzatore ha subito un attacco nello stesso turno." + }, + "iceShard": { + "name": "Geloscheggia", + "effect": "Chi la usa crea dei pezzi di ghiaccio e li lancia. Con questa mossa si colpisce per primi." + }, + "shadowClaw": { + "name": "Ombrartigli", + "effect": "Chi la usa attacca con artigli d'ombra che colpiscono con gran forza. Probabile brutto colpo." + }, + "thunderFang": { + "name": "Fulmindenti", + "effect": "Chi la usa morde con denti elettrificati che possono anche paralizzare o far tentennare il nemico." + }, + "iceFang": { + "name": "Gelodenti", + "effect": "Chi la usa morde il nemico con denti di ghiaccio. Può causare congelamento e tentennamento." + }, + "fireFang": { + "name": "Rogodenti", + "effect": "Chi la usa morde il nemico con denti infuocati. Può causare scottatura e tentennamento." + }, + "shadowSneak": { + "name": "Furtivombra", + "effect": "Chi la usa estende la sua ombra e attacca il nemico alle spalle. Con questa mossa si colpisce per primi." + }, + "mudBomb": { + "name": "Pantanobomba", + "effect": "Chi la usa lancia dure palle di fango sul nemico. Può anche ridurne la Precisione." + }, + "psychoCut": { + "name": "Psicotaglio", + "effect": "Chi la usa colpisce il nemico con lame fatte di forza psichica. Probabile brutto colpo." + }, + "zenHeadbutt": { + "name": "Cozzata Zen", + "effect": "Chi la usa concentra la forza nella testa e si lancia contro il nemico. Può anche farlo tentennare." + }, + "mirrorShot": { + "name": "Cristalcolpo", + "effect": "Chi la usa colpisce il nemico lanciando fasci d'energia dal suo corpo. Può ridurne la precisione." + }, + "flashCannon": { + "name": "Cannonflash", + "effect": "Chi la usa attacca raccogliendo e rilasciando energia luminosa. Può ridurre la Difesa Speciale del nemico." + }, + "rockClimb": { + "name": "Scalaroccia", + "effect": "Chi la usa carica con impeto incredibile. Il colpo può confondere il nemico." + }, + "defog": { + "name": "Scacciabruma", + "effect": "Chi la usa spazza via barriere come Riflesso e Schermoluce con un forte vento e riduce la capacità d'elusione del nemico." + }, + "trickRoom": { + "name": "Distortozona", + "effect": "Chi la usa crea una dimensione in cui i Pokémon più lenti si muovono per primi per cinque turni." + }, + "dracoMeteor": { + "name": "Dragobolide", + "effect": "Attacca con meteore che cadono dal cielo. Il contraccolpo fa calare di molto l'Attacco Speciale di chi la usa." + }, + "discharge": { + "name": "Scarica", + "effect": "Chi la usa colpisce i Pokémon che ha intorno con un bagliore elettrico. Può anche causare paralisi." + }, + "lavaPlume": { + "name": "Lavasbuffo", + "effect": "Chi la usa lancia fiamme scarlatte sugli altri Pokémon in campo. Può anche scottare." + }, + "leafStorm": { + "name": "Verdebufera", + "effect": "Si forma una tempesta di foglie affilate. Il contraccolpo riduce di molto l'Attacco Speciale di chi la usa." + }, + "powerWhip": { + "name": "Vigorcolpo", + "effect": "Chi la usa agita violentemente liane o tentacoli per sferzare il bersaglio." + }, + "rockWrecker": { + "name": "Devastomasso", + "effect": "Chi la usa attacca il nemico con un enorme masso, ma si deve riposare al turno successivo." + }, + "crossPoison": { + "name": "Velenocroce", + "effect": "Attacco con zanne avvelenate che può anche avvelenare il Pokémon colpito. Probabile brutto colpo." + }, + "gunkShot": { + "name": "Sporcolancio", + "effect": "Chi la usa attacca il nemico con rifiuti sudici che possono anche avvelenarlo." + }, + "ironHead": { + "name": "Metaltestata", + "effect": "Chi la usa colpisce il nemico con la sua testa dura come l'acciaio. Può anche farlo tentennare." + }, + "magnetBomb": { + "name": "Bombagnete", + "effect": "Chi la usa lancia bombe d'acciaio che si attaccano al nemico. Una mossa infallibile." + }, + "stoneEdge": { + "name": "Pietrataglio", + "effect": "Chi la usa colpisce il nemico dal basso con pietre affilate. Probabile brutto colpo." + }, + "captivate": { + "name": "Incanto", + "effect": "Se il nemico è del sesso opposto di chi la usa, sarà ammaliato e il suo Attacco Speciale diminuirà di molto." + }, + "stealthRock": { + "name": "Levitoroccia", + "effect": "Chi la usa piazza una trappola di rocce sospese che danneggia i nemici che entrano in lotta." + }, + "grassKnot": { + "name": "Laccioerboso", + "effect": "Chi la usa intrappola il bersaglio con l'erba e lo fa cadere. Danneggia maggiormente i Pokémon più pesanti." + }, + "chatter": { + "name": "Schiamazzo", + "effect": "Chi la usa attacca creando un'onda sonora con le parole imparate. Può anche confondere il nemico." + }, + "judgment": { + "name": "Giudizio", + "effect": "Chi la usa rilascia numerosi colpi di luce. Il tipo varia a seconda della Lastra tenuta." + }, + "bugBite": { + "name": "Coleomorso", + "effect": "Chi la usa morde il nemico. Inoltre, se questi tiene una Bacca, gliela ruba e ne sfrutta gli effetti." + }, + "chargeBeam": { + "name": "Raggioscossa", + "effect": "Chi la usa lancia un fascio di elettricità molto intensa. Può anche aumentare il suo Attacco Speciale." + }, + "woodHammer": { + "name": "Mazzuolegno", + "effect": "Chi la usa si lancia con tutto il corpo contro il bersaglio, ma subisce anche considerevoli danni." + }, + "aquaJet": { + "name": "Acquagetto", + "effect": "Chi la usa colpisce sempre per primo e a una tale velocità da rendersi quasi invisibile." + }, + "attackOrder": { + "name": "Comandourto", + "effect": "Chi la usa raduna i suoi sgherri per colpire il nemico. Probabile brutto colpo." + }, + "defendOrder": { + "name": "Comandoscudo", + "effect": "Chi la usa raduna i suoi sgherri per creare uno scudo, aumentando Difesa e Difesa Speciale." + }, + "healOrder": { + "name": "Comandocura", + "effect": "Chi la usa raduna i propri sgherri per farsi curare. Recupera metà dei PS massimi." + }, + "headSmash": { + "name": "Zuccata", + "effect": "Chi la usa attacca con tutta la potenza di cui dispone, ma subisce danni considerevoli." + }, + "doubleHit": { + "name": "Doppiosmash", + "effect": "Chi la usa colpisce il nemico con la coda due volte di fila." + }, + "roarOfTime": { + "name": "Fragortempo", + "effect": "Chi la usa colpisce il nemico con una forza capace di alterare il tempo, ma deve stare fermo il turno dopo." + }, + "spacialRend": { + "name": "Fendispazio", + "effect": "Chi la usa lacera il nemico e lo spazio che lo circonda. Probabile brutto colpo." + }, + "lunarDance": { + "name": "Lunardanza", + "effect": "Chi la usa va KO. Il Pokémon che lo sostituisce risolve i propri problemi di stato e recupera PS e PP." + }, + "crushGrip": { + "name": "Sbriciolmano", + "effect": "Colpisce il nemico con grande forza. Più PS ha il nemico, maggiore è la potenza della mossa." + }, + "magmaStorm": { + "name": "Magmaclisma", + "effect": "Intrappola il nemico in un turbine di fuoco che dura per quattro o cinque turni." + }, + "darkVoid": { + "name": "Vuototetro", + "effect": "Trascina i nemici in un mondo di totale oscurità e li fa addormentare." + }, + "seedFlare": { + "name": "Infuriaseme", + "effect": "Chi la usa genera un'onda d'urto dal suo corpo. Può anche ridurre di molto la Difesa Speciale del bersaglio." + }, + "ominousWind": { + "name": "Funestovento", + "effect": "Chi la usa crea una raffica di vento ripugnante. Può aumentare tutte le statistiche di chi la usa." + }, + "shadowForce": { + "name": "Oscurotuffo", + "effect": "Chi la usa sparisce e poi colpisce il nemico al turno successivo. Evita pure Protezione o Individua." + }, + "honeClaws": { + "name": "Unghiaguzze", + "effect": "Chi la usa affila i propri artigli, aumentando Attacco e precisione." + }, + "wideGuard": { + "name": "Bodyguard", + "effect": "Chi la usa para tutti i colpi diretti alla intera squadra per un turno. Se usata in successione può fallire." + }, + "guardSplit": { + "name": "Paridifesa", + "effect": "Chi la usa sfrutta la sua forza psichica per sommare Difesa e Difesa Speciale a quelle del bersaglio e dividerle equamente." + }, + "powerSplit": { + "name": "Pariattacco", + "effect": "Chi la usa sfrutta la sua forza psichica per sommare Attacco e Attacco Speciale a quelli del bersaglio e dividerli equamente." + }, + "wonderRoom": { + "name": "Mirabilzona", + "effect": "Chi la usa crea una dimensione in cui Difesa e Difesa Speciale di tutti i Pokémon vengono scambiate per cinque turni." + }, + "psyshock": { + "name": "Psicoshock", + "effect": "Chi la usa attacca il bersaglio facendo materializzare un misterioso raggio psichico che provoca danni fisici." + }, + "venoshock": { + "name": "Velenoshock", + "effect": "Lancia uno speciale liquido tossico sul bersaglio. Se questi è avvelenato, il danno provocato raddoppia." + }, + "autotomize": { + "name": "Sganciapesi", + "effect": "Chi la usa si libera di tutti i pesi in eccesso, alleggerendosi e aumentando di molto la propria Velocità." + }, + "ragePowder": { + "name": "Polverabbia", + "effect": "Chi la usa attira l'attenzione dei nemici cospargendosi di una polvere irritante e diventando bersaglio di tutti gli attacchi." + }, + "telekinesis": { + "name": "Telecinesi", + "effect": "Chi la usa fa fluttuare in aria il bersaglio, rendendolo facile da colpire per tre turni." + }, + "magicRoom": { + "name": "Magicozona", + "effect": "Chi la usa crea una dimensione in cui l'effetto degli strumenti tenuti da tutti i Pokémon è annullato per cinque turni." + }, + "smackDown": { + "name": "Abbattimento", + "effect": "Chi la usa lancia una pietra o un proiettile. Può colpire anche un bersaglio in volo e farlo cadere." + }, + "stormThrow": { + "name": "Tempestretta", + "effect": "Chi la usa sferra un colpo micidiale al bersaglio, stritolandolo. Brutto colpo assicurato." + }, + "flameBurst": { + "name": "Pirolancio", + "effect": "Chi la usa emana una fiammata che colpisce il bersaglio e si propaga fino a raggiungere i Pokémon accanto." + }, + "sludgeWave": { + "name": "Fangonda", + "effect": "Lancia un'onda di fango che attacca tutti i Pokémon nelle vicinanze. Può anche avvelenare." + }, + "quiverDance": { + "name": "Eledanza", + "effect": "Danza leggiadra ed elegante che aumenta l'Attacco Speciale, la Difesa Speciale e la Velocità di chi la usa." + }, + "heavySlam": { + "name": "Pesobomba", + "effect": "Chi la usa si lancia contro il bersaglio con tutto il proprio peso. Più è pesante rispetto ad esso e più danni causa." + }, + "synchronoise": { + "name": "Sincrumore", + "effect": "Chi la usa infligge danni a tutti i Pokémon del suo stesso tipo che ha vicino usando misteriose onde elettromagnetiche." + }, + "electroBall": { + "name": "Energisfera", + "effect": "Chi la usa attacca con una sfera d'energia elettrica. Più è rapido rispetto al bersaglio e più danni arreca." + }, + "soak": { + "name": "Inondazione", + "effect": "Chi la usa proietta un lungo getto d'acqua contro il bersaglio e lo rende un Pokémon di tipo Acqua." + }, + "flameCharge": { + "name": "Nitrocarica", + "effect": "Chi la usa si copre di fuoco e attacca il bersaglio. Concentrandosi aumenta, inoltre, la propria Velocità." + }, + "coil": { + "name": "Arrotola", + "effect": "Chi la usa si concentra, aumentando Attacco, Difesa e precisione." + }, + "lowSweep": { + "name": "Calciobasso", + "effect": "Chi la usa colpisce con un attacco fulmineo la parte inferiore del corpo del bersaglio, riducendone la Velocità." + }, + "acidSpray": { + "name": "Acidobomba", + "effect": "Chi la usa attacca il bersaglio con un acido altamente corrosivo. Il fluido riduce di molto la Difesa Speciale del bersaglio." + }, + "foulPlay": { + "name": "Ripicca", + "effect": "Chi la usa sfrutta la forza del bersaglio. Il danno inflitto è proporzionale all'Attacco dell'avversario." + }, + "simpleBeam": { + "name": "Ondisinvolta", + "effect": "Chi la usa emette un misterioso raggio psichico che trasforma l'abilità del Pokémon colpito in Disinvoltura." + }, + "entrainment": { + "name": "Saltamicizia", + "effect": "Chi la usa saltella con un buffo ritmo, invitando il bersaglio a imitarlo e rendendo la sua abilità identica alla propria." + }, + "afterYou": { + "name": "Cortesia", + "effect": "Chi la usa aiuta un bersaglio più lento permettendogli di agire subito dopo." + }, + "round": { + "name": "Coro", + "effect": "Attacca il bersaglio con una melodia. Se usata ripetutamente da uno o più Pokémon i danni inflitti aumentano." + }, + "echoedVoice": { + "name": "Echeggiavoce", + "effect": "Attacca il bersaglio con la propria voce echeggiante. Se usata a ripetizione da uno o più Pokémon il danno aumenta." + }, + "chipAway": { + "name": "Insidia", + "effect": "Chi la usa attacca non appena il bersaglio abbassa la guardia. Il danno inflitto prescinde dalle modifiche alle statistiche." + }, + "clearSmog": { + "name": "Pulifumo", + "effect": "Attacca il bersaglio lanciandogli contro una nuvola di fumo speciale, che annulla ogni modifica alle statistiche." + }, + "storedPower": { + "name": "Veicolaforza", + "effect": "Attacca il bersaglio con l'energia accumulata. Più sono state aumentate le statistiche, maggiore è il danno inflitto." + }, + "quickGuard": { + "name": "Anticipo", + "effect": "Chi la usa protegge tutta la squadra dalle mosse dei nemici che fanno colpire per primi. Se usata in successione può fallire." + }, + "allySwitch": { + "name": "Cambiaposto", + "effect": "Chi la usa si teletrasporta al posto di un compagno in campo, grazie ad un misterioso potere." + }, + "scald": { + "name": "Idrovampata", + "effect": "Chi la usa attacca il bersaglio con un getto d'acqua bollente che può anche scottarlo." + }, + "shellSmash": { + "name": "Gettaguscio", + "effect": "Chi la usa si disfa del guscio. Difesa e Dif. Sp. calano, ma aumentano di molto Attacco, Att. Sp. e Velocità." + }, + "healPulse": { + "name": "Curapulsar", + "effect": "Chi la usa lancia un'onda rilassante che fa recuperare al bersaglio metà dei suoi PS massimi." + }, + "hex": { + "name": "Sciagura", + "effect": "Attacco che causa un danno enorme se il bersaglio ha problemi di stato." + }, + "skyDrop": { + "name": "Cadutalibera", + "effect": "Porta il bersaglio in cielo e lo scaglia a terra al turno successivo. Il bersaglio catturato non può muoversi." + }, + "shiftGear": { + "name": "Cambiomarcia", + "effect": "Facendo ruotare gli ingranaggi, chi la usa aumenta non solo il proprio Attacco, ma anche di molto la propria Velocità." + }, + "circleThrow": { + "name": "Ribaltiro", + "effect": "Il bersaglio è scaraventato via ed è costretto a lasciare il posto a un altro. Se è selvatico, la lotta finisce." + }, + "incinerate": { + "name": "Bruciatutto", + "effect": "Attacca il nemico con una fiammata. Se il nemico ha una Bacca, viene divorata dalle fiamme." + }, + "quash": { + "name": "Spintone", + "effect": "Chi la usa trattiene il bersaglio, costringendolo ad agire per ultimo." + }, + "acrobatics": { + "name": "Acrobazia", + "effect": "Attacca rapidamente il bersaglio. Se chi la usa non ha uno strumento, infligge al nemico grossi danni." + }, + "reflectType": { + "name": "Riflettipo", + "effect": "Chi la usa cambia il proprio tipo in quello del bersaglio." + }, + "retaliate": { + "name": "Nemesi", + "effect": "Vendica un compagno messo KO. Se ciò è accaduto al turno precedente, il danno è maggiore." + }, + "finalGambit": { + "name": "Azzardo", + "effect": "Chi la usa attacca con tutta la potenza di cui dispone e va KO, ma infligge al bersaglio un danno pari ai PS che ha perso." + }, + "bestow": { + "name": "Cediregalo", + "effect": "Chi la usa consegna il proprio strumento al bersaglio se ne è sprovvisto." + }, + "inferno": { + "name": "Marchiatura", + "effect": "Il bersaglio viene avvolto da intense fiammate che causano scottature." + }, + "waterPledge": { + "name": "Acquapatto", + "effect": "Attacca il nemico con una colonna d'acqua. Se usata con Fiammapatto, aumentano gli effetti e un arcobaleno appare in cielo." + }, + "firePledge": { + "name": "Fiammapatto", + "effect": "Attacca il nemico con una colonna di fuoco. Se usata con Erbapatto, aumentano gli effetti e il campo diventa un mare di fuoco." + }, + "grassPledge": { + "name": "Erbapatto", + "effect": "Attacca il bersaglio con una colonna d'erba. Se usata con Acquapatto, gli effetti aumentano e il campo diventa una palude." + }, + "voltSwitch": { + "name": "Invertivolt", + "effect": "Chi usa questa mossa fa marcia indietro per farsi sostituire dopo aver sferrato l'attacco." + }, + "struggleBug": { + "name": "Entomoblocco", + "effect": "Colpisce i nemici opponendo resistenza e riducendo il loro Attacco Speciale." + }, + "bulldoze": { + "name": "Battiterra", + "effect": "Chi la usa calpesta il terreno e scatena un terremoto che danneggia tutti i Pokémon nei paraggi e ne riduce anche la Velocità." + }, + "frostBreath": { + "name": "Alitogelido", + "effect": "Chi la usa attacca il bersaglio con un soffio d'aria gelida. Brutto colpo assicurato." + }, + "dragonTail": { + "name": "Codadrago", + "effect": "Chi la usa fa volar via il bersaglio in modo che venga sostituito. Se il bersaglio è un Pokémon selvatico, la lotta finisce." + }, + "workUp": { + "name": "Cuordileone", + "effect": "Chi la usa si tira su di morale, aumentando il proprio Attacco e l'Attacco Speciale." + }, + "electroweb": { + "name": "Elettrotela", + "effect": "Chi la usa attacca i nemici catturandoli con una ragnatela elettrica e riducendone la Velocità." + }, + "wildCharge": { + "name": "Sprizzalampo", + "effect": "Chi la usa si carica di elettricità per poi scagliarsi sul bersaglio, ma subisce dei danni per il contraccolpo." + }, + "drillRun": { + "name": "Giravvita", + "effect": "Chi la usa si scaglia sul bersaglio ruotando su se stesso come un trapano perforante. Probabile brutto colpo." + }, + "dualChop": { + "name": "Doppiocolpo", + "effect": "Chi la usa attacca due volte il bersaglio con dei colpi estremamente forti." + }, + "heartStamp": { + "name": "Cuorestampo", + "effect": "Chi la usa distrae il nemico con un faccino innocente per poi sferrargli un colpo devastante che può farlo tentennare." + }, + "hornLeech": { + "name": "Legnicorno", + "effect": "Chi la usa infilza il bersaglio con le corna e assorbe una quantità di PS pari a metà del danno inferto." + }, + "sacredSword": { + "name": "Spadasolenne", + "effect": "Chi la usa taglia il nemico con una spada magica. Il danno inflitto ignora le modifiche alle statistiche del bersaglio." + }, + "razorShell": { + "name": "Conchilama", + "effect": "Chi la usa colpisce il bersaglio con il suo guscio affilato. Il colpo può anche ridurre la Difesa del bersaglio." + }, + "heatCrash": { + "name": "Marchiafuoco", + "effect": "Chi la usa carica con il suo corpo rovente. Più è pesante rispetto al bersaglio e più danni causa." + }, + "leafTornado": { + "name": "Vorticerba", + "effect": "Chi la usa avvolge e attacca il bersaglio con foglie affilate che possono anche ridurne la precisione." + }, + "steamroller": { + "name": "Rulloduro", + "effect": "Chi la usa ruota su se stesso ad alta velocità e schiaccia il bersaglio. Può anche farlo tentennare." + }, + "cottonGuard": { + "name": "Cotonscudo", + "effect": "Chi la usa avvolge il proprio corpo con del cotone molto morbido, proteggendosi e aumentando moltissimo la propria Difesa." + }, + "nightDaze": { + "name": "Urtoscuro", + "effect": "Chi la usa attacca il bersaglio con un'onda d'urto oscura che può ridurne la precisione." + }, + "psystrike": { + "name": "Psicobotta", + "effect": "Chi la usa attacca il bersaglio facendo materializzare un misterioso raggio psichico che provoca danni fisici." + }, + "tailSlap": { + "name": "Spazzasberla", + "effect": "Chi la usa colpisce il bersaglio con la sua coda dura da due a cinque volte di fila." + }, + "hurricane": { + "name": "Tifone", + "effect": "Chi la usa attacca il bersaglio avvolgendolo con un vento fortissimo. Può anche confonderlo." + }, + "headCharge": { + "name": "Ricciolata", + "effect": "Chi la usa carica il bersaglio con la sua testa in stile afro, ma subisce un po' di danni per il contraccolpo." + }, + "gearGrind": { + "name": "Ingracolpo", + "effect": "Chi la usa colpisce il bersaglio due volte di fila lanciandogli contro dei dischi d'acciaio." + }, + "searingShot": { + "name": "Sparafuoco", + "effect": "Chi la usa lancia fiamme scarlatte sui Pokémon intorno a sé. Può anche scottare." + }, + "technoBlast": { + "name": "Tecnobotto", + "effect": "Chi la usa rilascia un colpo di luce contro il bersaglio. Il tipo varia a seconda del modulo che ha." + }, + "relicSong": { + "name": "Cantoantico", + "effect": "Chi la usa attacca i nemici intonando un'antica melodia che colpisce il loro spirito. Può anche farli addormentare." + }, + "secretSword": { + "name": "Spadamistica", + "effect": "Chi la usa attacca il bersaglio tagliandolo con una spada mistica. La misteriosa energia sprigionata provoca danni fisici." + }, + "glaciate": { + "name": "Gelamondo", + "effect": "Chi la usa attacca i nemici con una folata d'aria gelida e ne riduce anche la Velocità." + }, + "boltStrike": { + "name": "Lucesiluro", + "effect": "Colpisce il bersaglio con una possente carica elettrica e può anche paralizzarlo." + }, + "blueFlare": { + "name": "Fuocoblu", + "effect": "Chi la usa attacca il bersaglio avvolgendolo con magnifiche e intense fiamme blu che possono anche scottarlo." + }, + "fieryDance": { + "name": "Voldifuoco", + "effect": "Chi la usa avvolge il bersaglio tra le fiamme. Può anche aumentare l'Attacco Speciale." + }, + "freezeShock": { + "name": "Elettrogelo", + "effect": "Chi la usa lancia contro il nemico al turno successivo una sfera di ghiaccio ricoperta di elettricità. Può anche paralizzarlo." + }, + "iceBurn": { + "name": "Vampagelida", + "effect": "Chi la usa attacca il bersaglio al turno successivo e lo avvolge in un soffio d'aria congelata. Può anche scottarlo." + }, + "snarl": { + "name": "Urlorabbia", + "effect": "Chi la usa si mette a urlare per un po', riducendo l'Attacco Speciale dei nemici." + }, + "icicleCrash": { + "name": "Scagliagelo", + "effect": "Chi la usa attacca violentemente il nemico con grosse stalattiti di ghiaccio che possono anche farlo tentennare." + }, + "vCreate": { + "name": "Generatore V", + "effect": "Chi la usa carica emettendo fiamme ardenti dalla fronte, a costo di una riduzione di Difesa, Difesa Speciale e Velocità." + }, + "fusionFlare": { + "name": "Incrofiamma", + "effect": "Chi la usa lancia una fiammata enorme. Se usata in combinazione con Incrotuono, il danno provocato dalla mossa aumenta." + }, + "fusionBolt": { + "name": "Incrotuono", + "effect": "Chi la usa lancia un fulmine enorme. Se usata in combinazione con Incrofiamma, il danno provocato dalla mossa aumenta." + }, + "flyingPress": { + "name": "Schiacciatuffo", + "effect": "Chi la usa si tuffa sul bersaglio dall'alto. È una mossa di tipo Lotta e Volante allo stesso tempo." + }, + "matBlock": { + "name": "Ribaltappeto", + "effect": "Chi la usa protegge se stesso e i propri alleati dai danni di mosse nemiche, adoperando un tappetino come scudo. Non è efficace contro mosse di stato." + }, + "belch": { + "name": "Rutto", + "effect": "Chi la usa attacca il bersaglio con un rutto potente. Per utilizzare questa mossa, il Pokémon deve mangiare la bacca che possiede." + }, + "rototiller": { + "name": "Aracampo", + "effect": "Chi la usa dissoda la terra per far crescere meglio l'erba. Questa mossa aumenta l'attacco e l'attacco speciale dei Pokémon di tipo Erba." + }, + "stickyWeb": { + "name": "Rete Vischiosa", + "effect": "Chi la usa intreccia una rete appiccicosa attorno alla squadra avversaria, diminuendo la Velocità dei Pokémon nemici che entreranno in campo." + }, + "fellStinger": { + "name": "Pungiglione", + "effect": "L'Attacco di chi la usa aumenta notevolmente se grazie alla mossa il bersaglio va KO." + }, + "phantomForce": { + "name": "Spettrotuffo", + "effect": "Chi la usa scompare improvvisamente per attaccare poi nel turno seguente. Questa mossa neutralizza le difese del bersaglio." + }, + "trickOrTreat": { + "name": "Halloween", + "effect": "Il bersaglio viene invitato a festeggiare Halloween e aggiunge così al proprio tipo anche il tipo Spettro." + }, + "nobleRoar": { + "name": "Urlo", + "effect": "Chi la usa emette un urlo potente che intimidisce il bersaglio, riducendone l'Attacco e l'Attacco Speciale." + }, + "ionDeluge": { + "name": "Pioggiaplasma", + "effect": "Chi la usa disperde delle particelle elettrizzate che trasformano le mosse di tipo Normale in mosse di tipo Elettro." + }, + "parabolicCharge": { + "name": "Caricaparabola", + "effect": "Chi la usa attacca tutto ciò che lo circonda e recupera PS pari alla metà del danno inflitto." + }, + "forestsCurse": { + "name": "Boscomalocchio", + "effect": "Il Pokémon invoca la maledizione del bosco sul bersaglio, che acquisisce così anche il tipo Erba." + }, + "petalBlizzard": { + "name": "Fiortempesta", + "effect": "Infligge danni ai Pokémon che ha intorno attaccandoli con una tempesta di fiori." + }, + "freezeDry": { + "name": "Liofilizzazione", + "effect": "Chi la usa raffredda rapidamente il bersaglio. Può anche congelarlo. Questa mossa è superefficace contro i Pokémon Acqua." + }, + "disarmingVoice": { + "name": "Incantavoce", + "effect": "Chi la usa infligge un danno spirituale ai nemici nei paraggi con una voce suadente. L'attacco andrà immancabilmente a segno." + }, + "partingShot": { + "name": "Monito", + "effect": "Nessuna descrizione disponibile." + }, + "topsyTurvy": { + "name": "Sottosopra", + "effect": "Inverte tutte le modifiche alle statistiche del Pokémon bersaglio." + }, + "drainingKiss": { + "name": "Assorbibacio", + "effect": "Un bacio fatato che assorbe le energie al nemico." + }, + "craftyShield": { + "name": "Truccodifesa", + "effect": "Chi la usa protegge se stesso e i suoi alleati usando un potere misterioso. Non blocca le mosse che infliggono danno." + }, + "flowerShield": { + "name": "Fiordifesa", + "effect": "Grazie a un misterioso potere, aumenta la Difesa di tutti i Pokémon di tipo Erba presenti in campo." + }, + "grassyTerrain": { + "name": "Campo Erboso", + "effect": "Per cinque turni trasforma il terreno di lotta in un campo erboso, facendo recuperare PS ai Pokémon a terra in ogni turno." + }, + "mistyTerrain": { + "name": "Campo Nebbioso", + "effect": "Per cinque turni trasforma il terreno di lotta in un campo nebbioso, impedendo ai Pokémon a terra di essere colpiti da problemi di stato." + }, + "electrify": { + "name": "Elettrocontagio", + "effect": "Se si contagia il bersaglio prima che usi la sua mossa, per quel turno le sue mosse saranno di tipo Elettro." + }, + "playRough": { + "name": "Carineria", + "effect": "Chi la usa attacca il bersaglio con delle carinerie. Può anche ridurne l'attacco." + }, + "fairyWind": { + "name": "Vento di Fata", + "effect": "Attacca con un forte vento fatato." + }, + "moonblast": { + "name": "Forza Lunare", + "effect": "Accumula la forza proveniente dalla luna e la libera sul nemico. Può ridurre l'Attacco Speciale." + }, + "boomburst": { + "name": "Ondaboato", + "effect": "Colpisce i Pokémon che ha intorno con la forza di un boato distruttivo." + }, + "fairyLock": { + "name": "Blocco Fatato", + "effect": "Bloccando il campo di battaglia, chi la usa impedisce a tutti i Pokémon di fuggire durante il prossimo turno." + }, + "kingsShield": { + "name": "Scudo Reale", + "effect": "L'utilizzatore assume una posizione difensiva mentre si difende. Riduce inoltre l'Attacco di ogni utilizzatore di mosse da contatto." + }, + "playNice": { + "name": "Simpatia", + "effect": "Chi la usa diventa amico del bersaglio, rabbonendolo e riducendone così l'Attacco." + }, + "confide": { + "name": "Confidenza", + "effect": "Chi la usa svela dei segreti al bersaglio, distraendolo e riducendone l'Attacco Speciale." + }, + "diamondStorm": { + "name": "Diamantempesta", + "effect": "Colpisce i nemici che ha intorno con una tempesta di diamanti. Può anche aumentare la Difesa di chi la usa." + }, + "steamEruption": { + "name": "Vaporscoppio", + "effect": "Travolge il bersaglio con un'ondata di vapore rovente che può anche scottarlo." + }, + "hyperspaceHole": { + "name": "Forodimensionale", + "effect": "Chi la usa, sfrutta un passaggio interdimensionale per comparire a fianco del bersaglio e colpirlo, eludendo mosse come Protezione e Individua." + }, + "waterShuriken": { + "name": "Acqualame", + "effect": "Chi la usa attacca sempre per primo, colpendo il bersaglio con uno shuriken di muco da due a cinque volte di fila." + }, + "mysticalFire": { + "name": "Magifiamma", + "effect": "Colpisce il bersaglio soffiandogli contro delle fiammate incredibilmente roventi, riducendone l'Attacco Speciale." + }, + "spikyShield": { + "name": "Agodifesa", + "effect": "Protegge dagli attacchi, riducendo inoltre i PS dei Pokémon che entrano in contatto con chi la usa." + }, + "aromaticMist": { + "name": "Nebularoma", + "effect": "Aumenta la Difesa Speciale di un alleato tramite un misterioso aroma." + }, + "eerieImpulse": { + "name": "Elettromistero", + "effect": "Il corpo dell'utilizzatore genera un impulso misterioso. Esponendovi il bersaglio, ne riduce di molto l'Attacco Speciale." + }, + "venomDrench": { + "name": "Velenotrappola", + "effect": "Emette un liquido particolare che riduce l'Attacco, l'Attacco Speciale e la Velocità dei nemici avvelenati intorno a chi la usa." + }, + "powder": { + "name": "Pulviscoppio", + "effect": "Il bersaglio viene coperto da un pulviscolo che esplode danneggiandolo se questi utilizza una mossa di tipo Fuoco nello stesso turno." + }, + "geomancy": { + "name": "Geocontrollo", + "effect": "Un'energia pura forza della natura si sprigiona per tutto il campo." + }, + "magneticFlux": { + "name": "Controllo Polare", + "effect": "Tramite il controllo dei campi magnetici, aumenta la Difesa e la Difesa Speciale dei Pokémon alleati dotati dell'abilità Più o Meno." + }, + "happyHour": { + "name": "Cuccagna", + "effect": "Questa mossa raddoppia la ricompensa ricevuta dopo aver vinto una lotta." + }, + "electricTerrain": { + "name": "Campo Elettrico", + "effect": "Per cinque turni trasforma il terreno di lotta in un campo elettrico, impedendo ai Pokémon a terra di addormentarsi." + }, + "dazzlingGleam": { + "name": "Magibrillio", + "effect": "Emette una luce potentissima che infligge danni al bersaglio." + }, + "celebrate": { + "name": "Auguri", + "effect": "Il Pokémon ti fa gli auguri nel tuo giorno speciale" + }, + "holdHands": { + "name": "Mano nella mano", + "effect": "Il Pokémon che la usa e un alleato si prendono per mano e fanno salti di gioia." + }, + "babyDollEyes": { + "name": "Occhioni Teneri", + "effect": "Chi la usa rivolge i propri occhioni languidi al bersaglio, riducendone l'Attacco. Colpisce sempre per primo." + }, + "nuzzle": { + "name": "Elettrococcola", + "effect": "Nonostante il tenero nome è una mossa piuttosto pericolosa." + }, + "holdBack": { + "name": "Riguardo", + "effect": "Chi la usa attacca il bersaglio, modulando il colpo in modo da lasciargli almeno un PS." + }, + "infestation": { + "name": "Assillo", + "effect": "Chi la usa lancia un attacco che tormenta il bersaglio per quattro o cinque turni, durante i quali gli impedisce di fuggire." + }, + "powerUpPunch": { + "name": "Crescipugno", + "effect": "Rende i pugni più duri a ogni colpo inferto. Se i pugni vanno a segno, aumenta l'Attacco." + }, + "oblivionWing": { + "name": "Ali del Fato", + "effect": "Chi la usa assorbe energia dal bersaglio recuperando una quantità di PS pari a più della metà del danno inferto." + }, + "thousandArrows": { + "name": "Mille Frecce", + "effect": "Colpisce anche i Pokémon che fluttuano in aria. I nemici nei paraggi vengono scaraventati a terra." + }, + "thousandWaves": { + "name": "Mille Onde", + "effect": "Un’onda strisciante investe i nemici intorno impedendo loro di fuggire." + }, + "landsWrath": { + "name": "Forza Tellurica", + "effect": "Chi la usa raccoglie energia tellurica e ne concentra il potere sui nemici che ha intorno danneggiandoli." + }, + "lightOfRuin": { + "name": "Luce Nefasta", + "effect": "Traendo potere dal Fiore Eterno, chi lo utilizza spara un potente raggio di luce. Ciò danneggia parecchio anche chi la usa." + }, + "originPulse": { + "name": "Primopulsar", + "effect": "Attacca i nemici intorno colpendoli con miriadi di raggi di luce blu." + }, + "precipiceBlades": { + "name": "Spade Telluriche", + "effect": "Attacca i nemici intorno trasformando la potenza della terra in lame affilate." + }, + "dragonAscent": { + "name": "Ascesa del Drago", + "effect": "Permette di proiettarsi in aria e fiondarsi sul bersaglio attaccando ad altissima velocità. Riduce la Difesa e la Difesa Speciale di chi la usa." + }, + "hyperspaceFury": { + "name": "Urtodimensionale", + "effect": "Permette di attaccare ripetutamente grazie ai molti arti, ignorando mosse come Protezione o Individua. Riduce la Difesa di chi la usa." + }, + "breakneckBlitzPhysical": { + "name": "Carica Travolgente", + "effect": "Grazie al Potere Z, chi la usa accumula energia e si lancia a tutta forza contro il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "breakneckBlitzSpecial": { + "name": "Carica Travolgente", + "effect": "Dati Mancanti" + }, + "allOutPummelingPhysical": { + "name": "Iperscarica Furiosa", + "effect": "Chi la usa scaglia sul bersaglio una scarica di colpi carichi di Potere Z. La potenza varia a seconda della mossa su cui si basa." + }, + "allOutPummelingSpecial": { + "name": "Iperscarica Furiosa", + "effect": "Dati Mancanti" + }, + "supersonicSkystrikePhysical": { + "name": "Picchiata Devastante", + "effect": "Chi la usa si serve del Potere Z per alzarsi in volo e attaccare il bersaglio piombandogli addosso. La potenza varia a seconda della mossa su cui si basa." + }, + "supersonicSkystrikeSpecial": { + "name": "Picchiata Devastante", + "effect": "Dati Mancanti" + }, + "acidDownpourPhysical": { + "name": "Acidiluvio Corrosivo", + "effect": "Chi la usa sfrutta il Potere Z per creare una palude velenosa che sommerge il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "acidDownpourSpecial": { + "name": "Acidiluvio Corrosivo", + "effect": "Dati Mancanti" + }, + "tectonicRagePhysical": { + "name": "Furore della Terra", + "effect": "Grazie al Potere Z, chi la usa si tuffa nelle viscere della terra e colpisce con violenza il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "tectonicRageSpecial": { + "name": "Furore della Terra", + "effect": "Dati Mancanti" + }, + "continentalCrushPhysical": { + "name": "Gigamacigno Polverizzante", + "effect": "Grazie al Potere Z, chi la usa crea un masso enorme e lo lancia sul bersaglio schiacciandolo. La potenza varia a seconda della mossa su cui si basa." + }, + "continentalCrushSpecial": { + "name": "Gigamacigno Polverizzante", + "effect": "Dati Mancanti" + }, + "savageSpinOutPhysical": { + "name": "Bozzolo Fatale", + "effect": "Chi la usa sfrutta il potere Z per creare dei filamenti che intrappolano il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "savageSpinOutSpecial": { + "name": "Bozzolo Fatale", + "effect": "Dati Mancanti" + }, + "neverEndingNightmarePhysical": { + "name": "Abbraccio Spettrale", + "effect": "Grazie al Potere Z, chi la usa intrappola il bersaglio in una morsa generata dal proprio rancore. La potenza varia a seconda della mossa su cui si basa." + }, + "neverEndingNightmareSpecial": { + "name": "Abbraccio Spettrale", + "effect": "Dati Mancanti" + }, + "corkscrewCrashPhysical": { + "name": "Spirale Perforante", + "effect": "Grazie al Potere Z, chi la usa vortica su se stesso e si scaglia sul bersaglio con tutte le sue forze. La potenza varia a seconda della mossa su cui si basa" + }, + "corkscrewCrashSpecial": { + "name": "Spirale Perforante", + "effect": "Dati Mancanti" + }, + "infernoOverdrivePhysical": { + "name": "Fiammobomba Detonante", + "effect": "Chi la usa sfrutta il Potere Z per emettere fiamme incandescenti che inceneriscono il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "infernoOverdriveSpecial": { + "name": "Fiammobomba Detonante", + "effect": "Dati Mancanti" + }, + "hydroVortexPhysical": { + "name": "Idrovortice Abissale", + "effect": "Grazie al Potere Z, chi la usa crea un enorme vortice che inghiotte il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "hydroVortexSpecial": { + "name": "Idrovortice Abissale", + "effect": "Dati Mancanti" + }, + "bloomDoomPhysical": { + "name": "Floriscoppio Sfolgorante", + "effect": "Grazie al Potere Z, chi la usa concentra l'energia delle piante per scatenare un potente attacco. La potenza varia a seconda della mossa su cui si basa." + }, + "bloomDoomSpecial": { + "name": "Floriscoppio Sfolgorante", + "effect": "Dati Mancanti" + }, + "gigavoltHavocPhysical": { + "name": "Gigascarica Folgorante", + "effect": "Grazie al Potere Z, chi la usa genera una fortissima scarica elettrica che colpisce il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "gigavoltHavocSpecial": { + "name": "Gigascarica Folgorante", + "effect": "Dati Mancanti" + }, + "shatteredPsychePhysical": { + "name": "Impatto Psicocinetico", + "effect": "Chi la usa si serve del Potere Z per manipolare la mente del bersaglio causando ingenti danni. La potenza varia a seconda della mossa su cui si basa." + }, + "shatteredPsycheSpecial": { + "name": "Impatto Psicocinetico", + "effect": "Dati Mancanti" + }, + "subzeroSlammerPhysical": { + "name": "Criodistruzione Polare", + "effect": "Chi la usa sfrutta il Potere Z per far calare di colpo la temperatura e congelare il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "subzeroSlammerSpecial": { + "name": "Criodistruzione Polare", + "effect": "Dati Mancanti" + }, + "devastatingDrakePhysical": { + "name": "Dragoschianto Finale", + "effect": "Grazie al Potere Z, chi la usa materializza la propria aura per colpire con forza il nemico. La potenza varia a seconda della mossa su cui si basa." + }, + "devastatingDrakeSpecial": { + "name": "Dragoschianto Finale", + "effect": "Dati Mancanti" + }, + "blackHoleEclipsePhysical": { + "name": "Buco Nero del Non Ritorno", + "effect": "Chi la usa si serve del Potere Z per concentrare energia negativa con cui inghiotte il bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "blackHoleEclipseSpecial": { + "name": "Buco Nero del Non Ritorno", + "effect": "Dati Mancanti" + }, + "twinkleTacklePhysical": { + "name": "Astroimpatto Fatato", + "effect": "Grazie al Potere Z, chi la usa crea una dimensione fatata in cui fa ciò che vuole del proprio bersaglio. La potenza varia a seconda della mossa su cui si basa." + }, + "twinkleTackleSpecial": { + "name": "Astroimpatto Fatato", + "effect": "Dati Mancanti" + }, + "catastropika": { + "name": "Super Pikaboom", + "effect": "Grazie al Potere Z, Pikachu accumula un'enorme quantità di energia elettrica e si lancia contro il bersaglio a tutta forza." + }, + "shoreUp": { + "name": "Sabbiaccumulo", + "effect": "Chi la usa recupera metà dei propri PS massimi. Durante le tempeste di sabbia ne recupera di più." + }, + "firstImpression": { + "name": "Schermaglia", + "effect": "È una mossa molto potente, ma funziona solo appena scesi in campo." + }, + "banefulBunker": { + "name": "Fortino", + "effect": "L'utilizzatore si protegge e se l'avversario attacca con una mossa da contatto viene avvelenato." + }, + "spiritShackle": { + "name": "Cucitura d'Ombra", + "effect": "Chi la usa attacca il bersaglio e fissa la sua ombra a terra impedendogli di fuggire." + }, + "darkestLariat": { + "name": "Braccioteso", + "effect": "Chi la usa attacca il bersaglio mulinando gli arti. Il danno inflitto ignora le modifiche alle statistiche del bersaglio." + }, + "sparklingAria": { + "name": "Canto Effimero", + "effect": "Chi la usa si mette a cantare emettendo tanti palloncini d’acqua. I Pokémon che subiscono danni da questa mossa guariscono dalle scottature." + }, + "iceHammer": { + "name": "Martelgelo", + "effect": "Infligge danni al bersaglio colpendolo con un pugno molto potente. Riduce la velocità di chi la usa." + }, + "floralHealing": { + "name": "Cura Floreale", + "effect": "Fa recuperare metà dei PS massimi al bersaglio. È più efficace quando il terreno di lotta è nello stato di Campo Erboso." + }, + "highHorsepower": { + "name": "Forza Equina", + "effect": "Il Pokémon travolge il bersaglio con un attacco possente." + }, + "strengthSap": { + "name": "Assorbiforza", + "effect": "Fa recuperare una quantità di PS pari all'Attacco del bersaglio, che vedrà diminuire questa statistica." + }, + "solarBlade": { + "name": "Lama Solare", + "effect": "Il Pokémon assorbe la luce al primo turno per poi condensarla in una lama e attaccare al turno successivo." + }, + "leafage": { + "name": "Fogliame", + "effect": "Attacca il bersaglio con delle foglie." + }, + "spotlight": { + "name": "Riflettore", + "effect": "Nessuna descrizione disponibile." + }, + "toxicThread": { + "name": "Velenotela", + "effect": "Avvelena il bersaglio avvolgendolo con filamenti tossici e ne riduce la Velocità." + }, + "laserFocus": { + "name": "Concentrazione", + "effect": "Chi la usa si concentra e nel turno successivo metterà sicuramente a segno un brutto colpo." + }, + "gearUp": { + "name": "Marciainpiù", + "effect": "Dà una marcia in più agli alleati con le abilità Meno o Più aumentandone l’Attacco e l’Attacco Speciale." + }, + "throatChop": { + "name": "Colpo Infernale", + "effect": "Chi viene colpito da questa mossa prova un dolore lancinante e non può più usare mosse basate sul suono per due turni." + }, + "pollenPuff": { + "name": "Sferapolline", + "effect": "Chi la usa attacca il nemico con una sfera esplosiva. Se colpisce degli alleati, fa recuperare loro dei PS." + }, + "anchorShot": { + "name": "Colpo d'Ancora", + "effect": "Chi la usa colpisce il nemico con un'ancora e lo intrappola nella catena impedendogli di fuggire." + }, + "psychicTerrain": { + "name": "Campo Psichico", + "effect": "Per cinque turni il terreno entra nello stato di Campo Psichico: i Pokémon a terra non subiscono mosse ad alta priorità e la potenza delle mosse di tipo Psico aumenta." + }, + "lunge": { + "name": "Assalto", + "effect": "Chi la usa si lancia con tutte le sue forze sul bersaglio e ne riduce l'Attacco." + }, + "fireLash": { + "name": "Frusta di Fuoco", + "effect": "Colpisce il bersaglio con una frusta infuocata e ne riduce la Difesa." + }, + "powerTrip": { + "name": "Tracotanza", + "effect": "Chi la usa attacca il bersaglio sfoggiando la propria forza. Più le sue statistiche sono state aumentate, più la mossa è potente." + }, + "burnUp": { + "name": "Ultima Fiamma", + "effect": "Chi la usa attacca sfruttando tutta la sua potenza incendiaria per infliggere gravi danni al bersaglio, ma come conseguenza perde il tipo Fuoco." + }, + "speedSwap": { + "name": "Velociscambio", + "effect": "Chi la usa scambia la propria Velocità con quella del bersaglio." + }, + "smartStrike": { + "name": "Sottilcorno", + "effect": "Chi la usa colpisce il bersaglio con un corno appuntito. Questa mossa va sempre a segno." + }, + "purify": { + "name": "Purificazione", + "effect": "Il bersaglio della mossa viene curato dalle alterazioni di stato inoltre l'utilizzatore ripristina i propri PS se la mossa va a segno." + }, + "revelationDance": { + "name": "Mutadanza", + "effect": "Chi la usa si lancia in una danza e attacca il nemico con tutte le sue forze. Il tipo della mossa corrisponde al tipo del Pokémon che la usa." + }, + "coreEnforcer": { + "name": "Nucleocastigo", + "effect": "Il bersaglio subisce dei danni e, se ha già agito nel turno, perde la sua abilità." + }, + "tropKick": { + "name": "Tropicalcio", + "effect": "Chi la usa colpisce il bersaglio con un potente calcio sfruttando una tecnica originaria dei paesi tropicali e ne riduce l'Attacco." + }, + "instruct": { + "name": "Imposizione", + "effect": "Nessuna descrizione disponibile." + }, + "beakBlast": { + "name": "Cannonbecco", + "effect": "Chi la usa arroventa il proprio becco e poi attacca. Se un Pokémon lo colpisce con un attacco diretto mentre sta accumulando calore, resta scottato." + }, + "clangingScales": { + "name": "Clamorsquame", + "effect": "Chi la usa attacca il bersaglio con un suono fortissimo che genera sfregando le scaglie del corpo. Dopo aver attaccato, la sua Difesa diminuisce." + }, + "dragonHammer": { + "name": "Marteldrago", + "effect": "Chi la usa infligge danni al bersaglio usando il proprio corpo come se fosse un martello." + }, + "brutalSwing": { + "name": "Vorticolpo", + "effect": "Chi la usa infligge danni intorno a sé facendo ruotare una parte del suo corpo." + }, + "auroraVeil": { + "name": "Velaurora", + "effect": "Questa mossa riduce i danni provocati dalle mosse fisiche e speciali per 5 turni. Può essere usata solo mentre grandina." + }, + "sinisterArrowRaid": { + "name": "Dardoassalto Spettrale", + "effect": "Grazie al Potere Z, Decidueye crea una formazione di frecce che colpisce il bersaglio a gran velocità." + }, + "maliciousMoonsault": { + "name": "Iperschianto delle Tenebre", + "effect": "Grazie al Potere Z, Incineroar richiama tutta la sua forza e si lancia impetuosamente sul bersaglio." + }, + "oceanicOperetta": { + "name": "Sinfonia del Mare", + "effect": "Grazie al Potere Z, Primarina concentra un’enorme quantità d’acqua e attacca il bersaglio con una potenza smisurata." + }, + "guardianOfAlola": { + "name": "Collera del Guardiano", + "effect": "Grazie al Potere Z, il Nume Locale evoca l’energia di Alola e attacca con grande potenza, facendo perdere al bersaglio la maggior parte dei suoi PS." + }, + "soulStealing7StarStrike": { + "name": "Colpo Eptastellare Rubanima", + "effect": "Grazie al Potere Z, Marshadow fa appello a tutte le sue forze e colpisce il bersaglio con una scarica di calci e pugni potentissimi." + }, + "stokedSparksurfer": { + "name": "Elettrosurf Folgorante", + "effect": "Grazie al Potere Z, il Raichu di Alola attacca con tutta la sua potenza e paralizza il bersaglio." + }, + "pulverizingPancake": { + "name": "Adesso Faccio sul Serio", + "effect": "Grazie al Potere Z, Snorlax tira fuori la grinta e, muovendo energicamente il suo enorme corpo, attacca il bersaglio con tutta la sua forza." + }, + "extremeEvoboost": { + "name": "Potenziamento Eevolutivo", + "effect": "Grazie al Potere Z, Eevee evoca a sé tutta l’energia delle sue possibili evoluzioni e aumenta di molto le sue statistiche" + }, + "genesisSupernova": { + "name": "Supernova delle Origini", + "effect": "Grazie al Potere Z, Mew attacca il bersaglio con tutta la sua forza e genera un Campo Psichico a terra." + }, + "shellTrap": { + "name": "Gusciotrappola", + "effect": "Il guscio del Pokémon diventa una trappola. Se un nemico lo colpisce con una mossa fisica, innesca un'esplosione e subisce dei danni." + }, + "fleurCannon": { + "name": "Cannonfiore", + "effect": "Colpisce il bersaglio con un potente raggio, ma riduce di molto l'Attacco Speciale di chi la usa." + }, + "psychicFangs": { + "name": "Psicozanna", + "effect": "L'utilizzatore morde il bersaglio, rompendo barriere come Schermoluce e Riflesso." + }, + "stompingTantrum": { + "name": "Battipiedi", + "effect": "Chi la usa attacca battendo i piedi per la rabbia. Se la mossa usata al turno precedente non è andata a segno, la potenza raddoppia." + }, + "shadowBone": { + "name": "Ossotetro", + "effect": "Chi la usa colpisce il bersaglio con un osso in cui alberga uno spirito. Può anche ridurne la Difesa." + }, + "accelerock": { + "name": "Rocciarapida", + "effect": "Chi la usa attacca il bersaglio colpendolo a tutta velocità. Questa mossa ha priorità alta." + }, + "liquidation": { + "name": "Idrobreccia", + "effect": "Chi la usa colpisce il bersaglio con la forza dell'acqua. Può anche ridurne la Difesa." + }, + "prismaticLaser": { + "name": "Prismalaser", + "effect": "Chi la usa proietta dei potenti raggi di luce grazie alla potenza del suo prisma, ma non può agire nel turno successivo." + }, + "spectralThief": { + "name": "Ombrafurto", + "effect": "Chi la usa ruba gli aumenti delle statistiche del bersaglio, poi si nasconde nella sua ombra e lo attacca." + }, + "sunsteelStrike": { + "name": "Astrocarica", + "effect": "Chi la usa travolge il bersaglio con la potenza di una meteora. Questo attacco ignora l'abilità del bersaglio." + }, + "moongeistBeam": { + "name": "Raggio d'Ombra", + "effect": "Chi la usa proietta sul bersaglio un misterioso raggio di luce. Questo attacco ignora l'abilità del bersaglio." + }, + "tearfulLook": { + "name": "Occhionilucidi", + "effect": "Chi la usa guarda il bersaglio con gli occhi pieni di lacrime e gli fa perdere lo spirito combattivo, riducendone l'Attacco e l'Attacco Speciale" + }, + "zingZap": { + "name": "Elettropizzico", + "effect": "Chi la usa colpisce il bersaglio investendolo con una potente scarica elettrica che può anche farlo tentennare." + }, + "naturesMadness": { + "name": "Ira della Natura", + "effect": "Scatena l’ira della natura sul bersaglio e ne dimezza i PS." + }, + "multiAttack": { + "name": "Multiattacco", + "effect": "Chi la usa si avvolge in un potente campo energetico e colpisce il bersaglio. Il tipo della mossa varia in base alla ROM installata." + }, + "tenMillionVoltThunderbolt": { + "name": "Iperfulmine", + "effect": "Grazie al Potere Z, Pikachu con il berretto scatena una potentissima scarica elettrica. Probabile brutto colpo." + }, + "mindBlown": { + "name": "Sbalorditesta", + "effect": "Chi la usa fa esplodere la propria testa per attaccare tutti i Pokémon che ha intorno, ma subisce danni." + }, + "plasmaFists": { + "name": "Pugni Plasma", + "effect": "Chi la usa attacca con pugni carichi di elettricità. Trasforma le mosse di tipo Normale in mosse di tipo Elettro." + }, + "photonGeyser": { + "name": "Geyser Fotonico", + "effect": "Infligge danni in base all’Attacco o all’Attacco Speciale scegliendo il più alto tra i due. Questo attacco ignora l’abilità del bersaglio." + }, + "lightThatBurnsTheSky": { + "name": "Fotodistruzione Apocalittica", + "effect": "Infligge danni in base all’Attacco o all’Attacco Speciale scegliendo il più alto tra i due. Questo attacco ignora l’abilità del bersaglio." + }, + "searingSunrazeSmash": { + "name": "Supercollisione Solare", + "effect": "Grazie al Potere Z, Solgaleo attacca il bersaglio con tutta la sua forza. Questo attacco ignora l’abilità del bersaglio se questa ha effetto sulle mosse." + }, + "menacingMoonrazeMaelstrom": { + "name": "Deflagrazione Lunare", + "effect": "Grazie al Potere Z, Lunala attacca il bersaglio con tutta la sua forza. Questo attacco ignora l’abilità del bersaglio se questa ha effetto sulle mosse." + }, + "letsSnuggleForever": { + "name": "Dolcesacco di Botte", + "effect": "Grazie al Potere Z, Mimikyu fa appello a tutte le sue forze e attacca il bersaglio tempestandolo di colpi." + }, + "splinteredStormshards": { + "name": "Litotempesta Radiale", + "effect": "Grazie al Potere Z, Lycanroc attacca il bersaglio con tutta la sua forza. Questa mossa annulla anche gli eventuali campi attivi." + }, + "clangorousSoulblaze": { + "name": "Dracofonia Divampante", + "effect": "Grazie al Potere Z, Kommo-o attacca i nemici con tutta la sua forza. Inoltre, aumenta le proprie statistiche." + }, + "zippyZap": { + "name": "Sprintaboom", + "effect": "Un attacco elettrico ad altissima velocità. Questa mossa ha priorità alta e infligge sicuramente un brutto colpo." + }, + "splishySplash": { + "name": "Surfasplash", + "effect": "Colpisce il bersaglio con un'enorme onda caricata di elettricità che può anche paralizzarlo." + }, + "floatyFall": { + "name": "Piombaflap", + "effect": "Chi la usa si libra in aria per poi piombare addosso al bersaglio. Può anche far tentennare il Pokémon colpito." + }, + "pikaPapow": { + "name": "Pikasaetta", + "effect": "Questa mossa infallibile diventa più potente con il rafforzarsi del rapporto tra Pikachu e l'Allenatore." + }, + "bouncyBubble": { + "name": "Bollaslurp", + "effect": "Chi la usa colpisce il bersaglio con una raffica di bolle, per poi assorbirle e recuperare una quantità di PS pari alla del danno inferto." + }, + "buzzyBuzz": { + "name": "Elettrozap", + "effect": "Colpisce il bersaglio con una scarica elettrica che lo paralizza." + }, + "sizzlySlide": { + "name": "Fiammabam", + "effect": "Chi la usa viene avvolto dalle fiamme e colpisce il bersaglio con forza, scottandolo." + }, + "glitzyGlow": { + "name": "Auraswoosh", + "effect": "Colpisce il bersaglio ripetutamente con onde di forza psicocinetica e innalza una barriera fantastica che riduce i danni degli attacchi speciali nemici." + }, + "baddyBad": { + "name": "Zona Buiabuia", + "effect": "Chi la usa scatena l’oscurità che ha dentro, colpendo il bersaglio e innalzando una barriera fantastica che riduce i danni degli attacchi fisici nemici." + }, + "sappySeed": { + "name": "Bombafrush", + "effect": "Fa crescere un'enorme pianta che colpisce il bersaglio con una pioggia di semi. Questi sottraggono PS a ogni turno permettendo a chi la usa di curarsi." + }, + "freezyFrost": { + "name": "Scricchiagelo", + "effect": "Chi la usa attacca il bersaglio con un cristallo formato da una nube nera congelata, che annulla ogni modifica alle statistiche di tutti i Pokémon." + }, + "sparklySwirl": { + "name": "Sbrilluccibufera", + "effect": "Chi la usa attacca il bersaglio avvolgendolo in un turbine di profumi soffocanti e cura i problemi di stato propri e degli alleati." + }, + "veeveeVolley": { + "name": "Eeveempatto", + "effect": "Questa mossa infallibile diventa più potente con il rafforzarsi del rapporto tra Eevee e l'Allenatore." + }, + "doubleIronBash": { + "name": "Pugni Corazzati", + "effect": "L'utilizzatore ruota, centrando il dado esagonale nel petto, quindi colpisce con le braccia due volte di seguito. Ciò potrebbe anche far tentennare il bersaglio." + }, + "maxGuard": { + "name": "Dynabarriera", + "effect": "Questa mossa permette di eludere tutti gli attacchi. Se usata in successione può fallire." + }, + "dynamaxCannon": { + "name": "Cannone Dynamax", + "effect": "Il Pokémon attacca emettendo dal suo nucleo l'energia concentrata nel corpo. Se il bersaglio è overlivellato, i danni inflitti aumentano." + }, + "snipeShot": { + "name": "Tiromirato", + "effect": "Permette di attaccare il bersaglio ignorando gli effetti di mosse e abilità che alterano le mosse" + }, + "jawLock": { + "name": "Morsostretto", + "effect": "Impedisce a chi la usa e al bersaglio di essere sostituiti finché non vanno KO. L'effetto svanisce se uno dei due lascia il campo." + }, + "stuffCheeks": { + "name": "Riempiguance", + "effect": "Se chi la usa ha con sé una bacca, la mangia e la sua Difesa aumenta di molto." + }, + "noRetreat": { + "name": "Spalle al Muro", + "effect": "Il Pokémon aumenta tutte le sue statistiche ma non può più fuggire o essere sostituito." + }, + "tarShot": { + "name": "Colpocatrame", + "effect": "Chi la usa getta catrame appiccicoso sul bersaglio abbassandone la Velocità e rendendolo vulnerabile al tipo Fuoco." + }, + "magicPowder": { + "name": "Magipolvere", + "effect": "Chi la usa getta addosso al bersaglio una polvere magica che lo rende di tipo Psico." + }, + "dragonDarts": { + "name": "Dragofrecce", + "effect": "L'utilizzatore attacca due volte usando Dreepy. Se ci sono due obiettivi, questa mossa colpisce una volta ogni obiettivo." + }, + "teatime": { + "name": "Ora del Tè", + "effect": "Chi la usa invita tutti i Pokémon in campo a prendere il tè. Quelli che hanno con sé una bacca la mangiano." + }, + "octolock": { + "name": "Tentacolock", + "effect": "Chi la usa immobilizza il bersaglio impedendogli di fuggire e ne diminuisce la Difesa e la Difesa Speciale a ogni turno." + }, + "boltBeak": { + "name": "Beccoshock", + "effect": "Chi la usa attacca il bersaglio con il becco appuntito carico d'elettricità. Se attacca per primo, la potenza della mossa raddoppia." + }, + "fishiousRend": { + "name": "Branchiomorso", + "effect": "Chi la usa morde il bersaglio con le dure branchie. Se attacca per primo, la potenza della mossa raddoppia." + }, + "courtChange": { + "name": "Cambiocampo", + "effect": "Una forza misteriosa inverte gli effetti attivi sul campo alleato e sul campo avversario." + }, + "maxFlare": { + "name": "Dynafiammata", + "effect": "Un attacco di tipo Fuoco che può essere eseguito dai Pokémon dynamaxizzati. Intensifica i raggi solari per cinque turni." + }, + "maxFlutterby": { + "name": "Dynainsetto", + "effect": "Un attacco di tipo Coleottero che può essere eseguito dai Pokémon dynamaxizzati. Riduce l'Attacco Speciale degli avversari." + }, + "maxLightning": { + "name": "Dynasaetta", + "effect": "Un attacco di tipo Elettro che può essere eseguito dai Pokémon dynamaxizzati. Per cinque turni il terreno entra nello stato di Campo Elettrico." + }, + "maxStrike": { + "name": "Dynattacco", + "effect": "Un attacco di tipo Normale che può essere eseguito dai Pokémon dynamaxizzati. Riduce la Velocità degli avversari." + }, + "maxKnuckle": { + "name": "Dynapugno", + "effect": "Un attacco di tipo Lotta che può essere eseguito dai Pokémon dynamaxizzati. Aumenta l'Attacco degli alleati." + }, + "maxPhantasm": { + "name": "Dynavuoto", + "effect": "Un attacco di tipo Spettro che può essere eseguito dai Pokémon dynamaxizzati. Riduce la Difesa degli avversari." + }, + "maxHailstorm": { + "name": "Dynagelo", + "effect": "Un attacco di tipo Ghiaccio che può essere eseguito dai Pokémon dynamaxizzati. Causa una nevicata che dura per cinque turni." + }, + "maxOoze": { + "name": "Dynacorrosione", + "effect": "Un attacco di tipo Veleno che può essere eseguito dai Pokémon dynamaxizzati. Aumenta l'Attacco Speciale degli alleati." + }, + "maxGeyser": { + "name": "Dynaflusso", + "effect": "Un attacco di tipo Acqua che può essere eseguito dai Pokémon dynamaxizzati. Provoca una forte pioggia per cinque turni." + }, + "maxAirstream": { + "name": "Dynajet", + "effect": "Un attacco di tipo Volante che può essere eseguito dai Pokémon dynamaxizzati. Aumenta la Velocità degli alleati." + }, + "maxStarfall": { + "name": "Dynafata", + "effect": "Un attacco di tipo Folletto che può essere eseguito dai Pokémon dynamaxizzati. Per cinque turni il terreno entra nello stato di Campo Nebbioso." + }, + "maxWyrmwind": { + "name": "Dynadragone", + "effect": "Un attacco di tipo Drago che può essere eseguito dai Pokémon dynamaxizzati. Riduce l'Attacco degli avversari." + }, + "maxMindstorm": { + "name": "Dynapsiche", + "effect": "Un attacco di tipo Psico che può essere eseguito dai Pokémon dynamaxizzati. Per cinque turni il terreno entra nello stato di Campo Psichico." + }, + "maxRockfall": { + "name": "Dynamacigno", + "effect": "Un attacco di tipo Roccia che può essere eseguito dai Pokémon dynamaxizzati. Causa una tempesta di sabbia per cinque turni." + }, + "maxQuake": { + "name": "Dynasisma", + "effect": "Un attacco di tipo Terra che può essere eseguito dai Pokémon dynamaxizzati. Aumenta la Difesa Speciale degli alleati." + }, + "maxDarkness": { + "name": "Dynatenebre", + "effect": "Un attacco di tipo Buio che può essere eseguito dai Pokémon dynamaxizzati. Riduce la Difesa Speciale degli avversari." + }, + "maxOvergrowth": { + "name": "Dynaflora", + "effect": "Un attacco di tipo Erba che può essere eseguito dai Pokémon dynamaxizzati. Per cinque turni il terreno entra nello stato di Campo Erboso." + }, + "maxSteelspike": { + "name": "Dynametallo", + "effect": "Un attacco di tipo Acciaio che può essere eseguito dai Pokémon dynamaxizzati. Aumenta la Difesa degli alleati." + }, + "clangorousSoul": { + "name": "Dracofonia", + "effect": "Chi la usa sacrifica un po' dei suoi PS per aumentare tutte le sue statistiche." + }, + "bodyPress": { + "name": "Schiacciacorpo", + "effect": "Chi la usa schiaccia il bersaglio con il suo corpo. Più la sua Difesa è alta, maggiori sono i danni inflitti." + }, + "decorate": { + "name": "Decorazione", + "effect": "Chi la usa agghinda il bersaglio con delle decorazioni aumentandone di molto l'Attacco e l'Attacco Speciale." + }, + "drumBeating": { + "name": "Tamburattacco", + "effect": "Chi la usa percuote il proprio tamburo per controllarne le radici e attaccare il bersaglio, riducendone la Velocità." + }, + "snapTrap": { + "name": "Tagliola", + "effect": "Chi la usa intrappola il bersaglio in una tagliola e lo attacca per quattro o cinque turni." + }, + "pyroBall": { + "name": "Palla Infuocata", + "effect": "l Pokémon attacca con una palla creata incendiando una piccola pietra. Può anche scottare il bersaglio." + }, + "behemothBlade": { + "name": "Taglio Maestoso", + "effect": "Il Pokémon brandisce un'enorme spada e attacca vibrando un poderoso fendente." + }, + "behemothBash": { + "name": "Colpo Maestoso", + "effect": "Il Pokémon trasforma il suo corpo in un robusto scudo e attacca caricando con forza." + }, + "auraWheel": { + "name": "Ruota d'Aura", + "effect": "Il Pokémon emette l'energia accumulata nelle guance per attaccare e aumentare la Velocità. Il tipo della mossa cambia in base alla forma assunta da Morpeko." + }, + "breakingSwipe": { + "name": "Vastoimpatto", + "effect": "Chi la usa attacca i nemici intorno con la sua robusta coda riducendone l'Attacco." + }, + "branchPoke": { + "name": "Ramostoccata", + "effect": "Chi la usa attacca il bersaglio con un ramo incredibilmente appuntito." + }, + "overdrive": { + "name": "Overdrive", + "effect": "Chi la usa suona la chitarra o il basso creando un'onda sonora potentissima con cui attacca il bersaglio." + }, + "appleAcid": { + "name": "Acido Malico", + "effect": "Il Pokémon attacca il bersaglio con un liquido acido ricavato da mele aspre riducendone la Difesa Speciale." + }, + "gravApple": { + "name": "Forza G", + "effect": "Il Pokémon fa cadere una mela sul bersaglio da una grande altezza, infliggendogli danni e riducendone la Difesa." + }, + "spiritBreak": { + "name": "Frantumanima", + "effect": "Chi la usa attacca il bersaglio con un tale impeto da fargli perdere la voglia di lottare e ne riduce l'Attacco Speciale" + }, + "strangeSteam": { + "name": "Vapore Incantato", + "effect": "Il Pokémon attacca il bersaglio con getti di vapore che possono anche confonderlo." + }, + "lifeDew": { + "name": "Goccia Vitale", + "effect": "Il Pokémon sparge tutt'intorno dell'acqua misteriosa che fa recuperare PS a sé e agli alleati in campo." + }, + "obstruct": { + "name": "Sbarramento", + "effect": "Permette di eludere tutti gli attacchi. Se usata in successione può fallire. Se un Pokémon tocca chi la usa, la sua Difesa diminuisce di molto." + }, + "falseSurrender": { + "name": "Supplicolpo", + "effect": "Chi la usa finge di abbassare la testa a mo' di supplica e attacca il bersaglio con i suoi capelli scarmigliati. Questa mossa va sempre a segno." + }, + "meteorAssault": { + "name": "Sfolgorassalto", + "effect": "Chi la usa attacca il bersaglio brandendo un grosso gambo, ma perde l'equilibrio e nel turno successivo non può agire." + }, + "eternabeam": { + "name": "Raggio Infinito", + "effect": "È l'attacco più potente di Eternatus quando assume la sua forma originale. Nel turno successivo non può agire." + }, + "steelBeam": { + "name": "Raggio d'Acciaio", + "effect": "Il Pokémon utilizza l'acciaio del proprio corpo per sparare un violento raggio, ma subisce danni." + }, + "expandingForce": { + "name": "Vastenergia", + "effect": "Chi la usa attacca il bersaglio con energia psichica. Se utilizzata quando è attivo un Campo Psichico, la mossa aumenta di potenza e danneggia tutti i nemici." + }, + "steelRoller": { + "name": "Ferrorullo", + "effect": "Chi la usa attacca eliminando lo stato del terreno di lotta. La mossa fallisce se nel terreno non è attivo alcuno stato." + }, + "scaleShot": { + "name": "Squamacolpo", + "effect": "Il Pokémon attacca lanciando delle squame da due a cinque volte di fila. Aumenta la Velocità di chi la usa, ma ne riduce la Difesa." + }, + "meteorBeam": { + "name": "Raggiometeora", + "effect": "Chi la usa accumula l'energia dello spazio nel primo turno per aumentare l'Attacco Speciale, quindi attacca nel turno successivo." + }, + "shellSideArm": { + "name": "Armaguscio", + "effect": "Il Pokémon esegue un attacco fisico o speciale, in base a quale causa danni maggiori. Può anche avvelenare il bersaglio." + }, + "mistyExplosion": { + "name": "Nebbioscoppio", + "effect": "Chi la usa attacca tutti i Pokémon che ha intorno, ma poi va KO. La potenza delle mosse aumenta quando è attivo un Campo Nebbioso." + }, + "grassyGlide": { + "name": "Erboscivolata", + "effect": "Chi la usa attacca il bersaglio scivolando sul terreno. Se utilizzata quando è attivo un Campo Erboso, ha priorità alta." + }, + "risingVoltage": { + "name": "Elettroimpennata", + "effect": "Chi la usa attacca con dell'elettricità che si alza dal suolo. La potenza della mossa raddoppia quando l'avversario si trova in un Campo Elettrico." + }, + "terrainPulse": { + "name": "Campopulsar", + "effect": "Chi la usa attacca sfruttando l'energia del terreno di lotta. Il tipo e la potenza della mossa variano a seconda dello stato del terreno stesso." + }, + "skitterSmack": { + "name": "Strisciacolpo", + "effect": "Chi la usa attacca il bersaglio strisciandogli alle spalle e riducendo il suo Attacco Speciale." + }, + "burningJealousy": { + "name": "Fiamminvidia", + "effect": "Chi la usa attacca con la forza dell'invidia, causando una scottatura a tutti i Pokémon le cui statistiche sono aumentate durante quel turno." + }, + "lashOut": { + "name": "Sfogarabbia", + "effect": "Chi la usa attacca il bersaglio con tutta la propria ira. Se ha subito riduzioni delle statistiche durante quel turno, la potenza della mossa raddoppia." + }, + "poltergeist": { + "name": "Poltergeist", + "effect": "Chi la usa attacca utilizzando lo strumento del bersaglio. La mossa fallisce se quest'ultimo non ha uno strumento." + }, + "corrosiveGas": { + "name": "Gas Corrosivo", + "effect": "Chi la usa avvolge gli altri Pokémon attorno in un gas altamente acido, dissolvendo i loro strumenti." + }, + "coaching": { + "name": "Coaching", + "effect": "Chi la usa aumenta l'Attacco e la Difesa di tutti gli alleati dando loro indicazioni precise." + }, + "flipTurn": { + "name": "Virata", + "effect": "Chi usa questa mossa fa marcia indietro per farsi sostituire dopo aver sferrato l'attacco." + }, + "tripleAxel": { + "name": "Triplo Axel", + "effect": "Il Pokémon attacca sferrando fino a tre calci consecutivi. Ogni volta che la mossa va a segno, la sua potenza aumenta." + }, + "dualWingbeat": { + "name": "Doppia Ala", + "effect": "Il Pokémon attacca il bersaglio urtandolo con le ali e infliggendogli danni due volte di fila." + }, + "scorchingSands": { + "name": "Sabbiardente", + "effect": "Chi la usa attacca il bersaglio scagliandogli addosso della sabbia incandescente. Può anche scottarlo." + }, + "jungleHealing": { + "name": "Giunglacura", + "effect": "Il Pokémon diventa tutt'uno con la giungla, ripristinando i PS e curando i problemi di stato per sé e per gli alleati in campo." + }, + "wickedBlow": { + "name": "Pugnotenebra", + "effect": "Il Pokémon sferra un singolo colpo potentissimo, massima espressione dello stile di tipo Buio. Brutto colpo assicurato." + }, + "surgingStrikes": { + "name": "Idroraffica", + "effect": "Il Pokémon sferra una fluida serie di tre attacchi, massima espressione dello stile di tipo Acqua. Brutto colpo assicurato." + }, + "thunderCage": { + "name": "Elettrogabbia", + "effect": "Il Pokémon attacca il bersaglio imprigionandolo in una gabbia di elettricità, che sprigiona corrente per quattro o cinque turni." + }, + "dragonEnergy": { + "name": "Dragoenergia", + "effect": "\tIl Pokémon attacca il bersaglio convertendo la propria forza vitale in energia. Più i suoi PS sono bassi, più la potenza della mossa diminuisce." + }, + "freezingGlare": { + "name": "Sguardo Gelido", + "effect": "Il Pokémon attacca rilasciando energia psichica dagli occhi. Può congelare il bersaglio." + }, + "fieryWrath": { + "name": "Furia Ardente", + "effect": "ERR\tIl Pokémon attacca trasformando la sua rabbia in un'aura simile a fiamme. Può anche far tentennare il bersaglio.ORE" + }, + "thunderousKick": { + "name": "Calcio Tonante", + "effect": "Il Pokémon sferra calci al bersaglio dopo averlo distratto con movimenti fulminei, riducendone la Difesa." + }, + "glacialLance": { + "name": "Lancia Glaciale", + "effect": "Il Pokémon attacca il bersaglio scagliando una lancia di ghiaccio accompagnata da una tormenta di neve." + }, + "astralBarrage": { + "name": "Schegge Astrali", + "effect": "Il Pokémon attacca il bersaglio scatenandogli contro una miriade di piccoli spettri." + }, + "eerieSpell": { + "name": "Inquietantesimo", + "effect": "Il Pokémon attacca con i suoi potenti poteri psichici. Sottrae 3 PP all'ultima mossa usata dall'avversario." + }, + "direClaw": { + "name": "Artigli Fatali", + "effect": "Il Pokémon attacca il bersaglio con artigli distruttori. Può anche causargli avvelenamento, paralisi o sonno." + }, + "psyshieldBash": { + "name": "Barrierassalto", + "effect": "Il Pokémon si carica di energia psichica per poi schiantarsi sul bersaglio. Inoltre, aumenta la propria Difesa." + }, + "powerShift": { + "name": "Scambioforza", + "effect": "Il Pokémon scambia il suo Attacco con la Difesa." + }, + "stoneAxe": { + "name": "Rocciascure", + "effect": "Il Pokémon attacca il bersaglio con delle scuri di roccia. I frammenti rocciosi dispersi dall'attacco restano sospesi intorno al bersaglio." + }, + "springtideStorm": { + "name": "Tempesta Zefirea", + "effect": "Il Pokémon attacca il bersaglio avvolgendolo con un vento fortissimo di odio e amore. Può anche ridurne l'Attacco." + }, + "mysticalPower": { + "name": "Forza Mistica", + "effect": "Il Pokémon attacca emettendo un misterioso potere. Inoltre, aumenta il proprio Attacco Speciale." + }, + "ragingFury": { + "name": "Ira Furente", + "effect": "Il Pokémon s'infuria e sputa fiammate per due o tre turni, ma rimane confuso." + }, + "waveCrash": { + "name": "Ondaschianto", + "effect": "Il Pokémon si avvolge in uno strato d'acqua e si lancia sul bersaglio, ma subisce seri danni." + }, + "chloroblast": { + "name": "Clorofillaser", + "effect": "Il Pokémon attacca concentrando la clorofilla nel proprio corpo per poi lanciarla, ma subisce danni." + }, + "mountainGale": { + "name": "Soffio d'Iceberg", + "effect": "\tIl Pokémon attacca colpendo il bersaglio con un blocco di ghiaccio grande come un iceberg. Può anche far tentennare il bersaglio." + }, + "victoryDance": { + "name": "Danzavittoria", + "effect": "Il Pokémon si lancia in una danza sfrenata per invocare la vittoria e aumenta l'Attacco, la Difesa e la Velocità." + }, + "headlongRush": { + "name": "Scontro Frontale", + "effect": "Il Pokémon si schianta sul bersaglio con tutte le forze. La sua Difesa e la sua Difesa Speciale diminuiscono." + }, + "barbBarrage": { + "name": "Mille Fielespine", + "effect": "Il bersaglio viene colpito da una miriade di spine tossiche che possono anche avvelenarlo. Se il bersaglio è già avvelenato, la potenza della mossa raddoppia." + }, + "esperWing": { + "name": "Ali d'Aura", + "effect": "Il Pokémon falcia il bersaglio con ali rafforzate da un'aura. Probabile brutto colpo. Inoltre, la Velocità aumenta." + }, + "bitterMalice": { + "name": "Livore", + "effect": "Il Pokémon attacca con una furia che fa raggelare il sangue nelle vene del bersaglio, riducendone l'Attacco." + }, + "shelter": { + "name": "Barricata", + "effect": "Il Pokémon indurisce la propria pelle come uno scudo di ferro, aumentando di molto la Difesa." + }, + "tripleArrows": { + "name": "Triplodardo", + "effect": "Il Pokémon sferra un calcio per poi scoccare tre dardi insieme. Può ridurre la Difesa del bersaglio o farlo tentennare. Probabile brutto colpo." + }, + "infernalParade": { + "name": "Corteo Spettrale", + "effect": "Il Pokémon attacca con innumerevoli sfere di fuoco che possono anche scottare il bersaglio. Se questo è affetto da problemi di stato, la potenza della mossa raddoppia." + }, + "ceaselessEdge": { + "name": "Lama Milleflutti", + "effect": "Il Pokémon attacca il bersaglio con la spada conchiglia. I frammenti di conchiglie formano una trappola di punte ai piedi del bersaglio." + }, + "bleakwindStorm": { + "name": "Tempesta Boreale", + "effect": "Il Pokémon attacca il bersaglio con venti gelidi e sferzanti che lo fanno tremare anima e corpo. Può anche ridurne la Velocità." + }, + "wildboltStorm": { + "name": "Tempesta Tonante", + "effect": "Il Pokémon chiama a sé una tempesta di fulmini e raffiche di vento con cui attacca violentemente il bersaglio. Può anche paralizzarlo." + }, + "sandsearStorm": { + "name": "Tempesta Ardente", + "effect": "Il Pokémon attacca il bersaglio avvolgendolo con sabbia ardente e un vento fortissimo che possono scottarlo." + }, + "lunarBlessing": { + "name": "Invocaluna", + "effect": "\tIl Pokémon rivolge una preghiera alla luna crescente, ripristinando i PS e curando i problemi di stato per sé e per gli alleati in campo." + }, + "takeHeart": { + "name": "Baldimpulso", + "effect": "Il Pokémon prende coraggio e guarisce dai problemi di stato. Inoltre, aumenta l'Attacco Speciale e la Difesa Speciale." + }, + "gMaxWildfire": { + "name": "Gigavampa", + "effect": "Attacco di tipo Fuoco eseguito da Charizard Gigamax. Infligge danni per quattro turni." + }, + "gMaxBefuddle": { + "name": "Gigastupore", + "effect": "Attacco di tipo Coleottero eseguito da Butterfree Gigamax. Avvelena, paralizza o addormenta i nemici." + }, + "gMaxVoltCrash": { + "name": "Gigapikafolgori", + "effect": "Attacco di tipo Elettro eseguito da Pikachu Gigamax. Paralizza i nemici." + }, + "gMaxGoldRush": { + "name": "Gigamonete", + "effect": "Attacco di tipo Normale eseguito da Meowth Gigamax. Confonde i nemici e permette anche di ricevere una ricompensa maggiore." + }, + "gMaxChiStrike": { + "name": "Gigapugnointuito", + "effect": "Attacco di tipo Lotta eseguito da Machamp Gigamax. Aumenta la probabilità di sferrare brutti colpi." + }, + "gMaxTerror": { + "name": "Gigaillusione", + "effect": "Attacco di tipo Spettro eseguito da Gengar Gigamax. Il Pokémon calpesta l'ombra del nemico impedendogli la fuga o la sostituzione." + }, + "gMaxResonance": { + "name": "Gigamelodia", + "effect": "Attacco di tipo Ghiaccio eseguito da Lapras Gigamax. Riduce i danni subiti per cinque turni." + }, + "gMaxCuddle": { + "name": "Gigabbraccio", + "effect": "Attacco di tipo Normale eseguito da Eevee Gigamax. Fa infatuare i nemici." + }, + "gMaxReplenish": { + "name": "Gigarinnovamento", + "effect": "Attacco di tipo Normale eseguito da Snorlax Gigamax. Rigenera le bacche mangiate." + }, + "gMaxMalodor": { + "name": "Gigafetore", + "effect": "Attacco di tipo Veleno eseguito da Garbodor Gigamax. Avvelena i nemici." + }, + "gMaxStonesurge": { + "name": "Gigarocciagetto", + "effect": "Attacco di tipo Acqua eseguito da Drednaw Gigamax. Sparge rocce aguzze sul campo di lotta." + }, + "gMaxWindRage": { + "name": "Gigaciclone", + "effect": "Attacco di tipo Volante eseguito da Corviknight Gigamax. Annulla l'effetto di mosse come Riflesso e Schermoluce." + }, + "gMaxStunShock": { + "name": "Gigatoxiscossa", + "effect": "Attacco di tipo Elettro eseguito da Toxtricity Gigamax. Avvelena o paralizza i nemici." + }, + "gMaxFinale": { + "name": "Gigagranfinale", + "effect": "Attacco di tipo Folletto eseguito da Alcremie Gigamax. Fa recuperare PS agli alleati." + }, + "gMaxDepletion": { + "name": "Gigalogoramento", + "effect": "Attacco di tipo Drago eseguito da Duraludon Gigamax. Toglie PP all'ultima mossa usata dai nemici." + }, + "gMaxGravitas": { + "name": "Gigagravitoforza", + "effect": "Attacco di tipo Psico eseguito da Orbeetle Gigamax. Cambia la gravità per cinque turni." + }, + "gMaxVolcalith": { + "name": "Gigalapilli", + "effect": "Attacco di tipo Roccia eseguito da Coalossal Gigamax. Infligge danni per quattro turni." + }, + "gMaxSandblast": { + "name": "Gigavortisabbia", + "effect": "Attacco di tipo Terra eseguito da Sandaconda Gigamax. Scatena un turbine di sabbia per quattro o cinque turni." + }, + "gMaxSnooze": { + "name": "Gigatorpore", + "effect": "Attacco di tipo Buio eseguito da Grimmsnarl Gigamax. Chi la usa fa un grande sbadiglio che fa addormentare il nemico al turno successivo." + }, + "gMaxTartness": { + "name": "Gigattaccoacido", + "effect": "Attacco di tipo Erba eseguito da Flapple Gigamax. Riduce l’elusione dei nemici." + }, + "gMaxSweetness": { + "name": "Gigambrosia", + "effect": "Attacco di tipo Erba eseguito da Appletun Gigamax. Cura i problemi di stato degli alleati." + }, + "gMaxSmite": { + "name": "Gigacastigo", + "effect": "Attacco di tipo Folletto eseguito da Hatterene Gigamax. Confonde i nemici." + }, + "gMaxSteelsurge": { + "name": "Gigaferroaculei", + "effect": "Attacco di tipo Acciaio eseguito da Copperajah Gigamax. Sparge pezzi di metallo acuminati sul campo di lotta." + }, + "gMaxMeltdown": { + "name": "Gigaliquefazione", + "effect": "ERAttacco di tipo Acciaio eseguito da Melmetal Gigamax. Impedisce ai nemici di usare la stessa mossa due volte di seguito.RORE" + }, + "gMaxFoamBurst": { + "name": "Gigaschiuma", + "effect": "Attacco di tipo Acqua eseguito da Kingler Gigamax. Riduce di molto la Velocità dei nemici." + }, + "gMaxCentiferno": { + "name": "Gigamillefiamme", + "effect": "Attacco di tipo Fuoco eseguito da Centiskorch Gigamax. Intrappola i nemici nelle fiamme per quattro o cinque turni." + }, + "gMaxVineLash": { + "name": "Gigasferzata", + "effect": "Attacco di tipo Erba eseguito da Venusaur Gigamax. Infligge danni per quattro turni." + }, + "gMaxCannonade": { + "name": "Gigacannonata", + "effect": "Attacco di tipo Acqua eseguito da Blastoise Gigamax. Infligge danni per quattro turni." + }, + "gMaxDrumSolo": { + "name": "Gigarullio", + "effect": "Attacco di tipo Erba eseguito da Rillaboom Gigamax. Ignora le abilità dei nemici." + }, + "gMaxFireball": { + "name": "Gigafiammopalla", + "effect": "Attacco di tipo Fuoco eseguito da Cinderace Gigamax. Ignora le abilità dei nemici." + }, + "gMaxHydrosnipe": { + "name": "Gigasparomirato", + "effect": "Attacco di tipo Acqua eseguito da Inteleon Gigamax. Ignora le abilità dei nemici." + }, + "gMaxOneBlow": { + "name": "Gigasingolcolpo", + "effect": "Attacco di tipo Buio eseguito da Urshifu Gigamax che ignora gli effetti della Dynabarriera." + }, + "gMaxRapidFlow": { + "name": "Gigapluricolpo", + "effect": "\tAttacco di tipo Acqua eseguito da Urshifu Gigamax che ignora gli effetti della Dynabarriera." + }, + "teraBlast": { + "name": "Terascoppio", + "effect": "Se il Pokémon è teracristallizzato, attacca con l'energia del suo teratipo. Infligge danni in base all'Attacco o all'Attacco Speciale scegliendo il più alto tra i due." + }, + "silkTrap": { + "name": "Telatrappola", + "effect": "Il Pokémon tesse una trappola di tela che lo protegge dagli attacchi e riduce la Velocità di chi entra in contatto con lui." + }, + "axeKick": { + "name": "Calcio ad Ascia", + "effect": "Il Pokémon attacca sferrando un calcio dall'alto verso il basso che può confondere il bersaglio. Se la mossa fallisce, il Pokémon subisce dei danni." + }, + "lastRespects": { + "name": "Omaggio ai KO", + "effect": "Il Pokémon attacca per placare il risentimento dei suoi compagni di squadra. Più sono quelli andati KO, più la potenza della mossa aumenta." + }, + "luminaCrash": { + "name": "Fotocollisione", + "effect": "Il Pokémon attacca sparando una luce bizzarra che agisce anche sulla psiche. Riduce di molto la Difesa Speciale del bersaglio." + }, + "orderUp": { + "name": "Alta Cucina", + "effect": "Il Pokémon attacca con deliziose movenze. Se ha in bocca un Tatsugiri, una sua statistica aumenta in base alla forma di quest'ultimo." + }, + "jetPunch": { + "name": "Pugnojet", + "effect": "Il Pokémon avvolge il pugno in una corrente impetuosa e sferra un colpo a una tale velocità da rendersi quasi invisibile. Questo attacco ha priorità alta." + }, + "spicyExtract": { + "name": "Essenza Piccante", + "effect": "Il Pokémon secerne un'essenza straordinariamente piccante. Aumenta di molto l'Attacco del bersaglio ma ne diminuisce di molto la Difesa." + }, + "spinOut": { + "name": "Slittaruote", + "effect": "Il Pokémon infligge danni caricando le estremità e ruotandole vorticosamente. La sua Velocità diminuisce di molto." + }, + "populationBomb": { + "name": "Infestazione", + "effect": "Il Pokémon si riunisce con i suoi simili in un gruppo brulicante che collabora per attaccare e colpisce da una a dieci volte di fila." + }, + "iceSpinner": { + "name": "Vortighiaccio", + "effect": "Il Pokémon avvolge gli arti inferiori in un sottile strato di ghiaccio e si scontra con il bersaglio piroettando. Il movimento rotatorio distrugge il terreno di lotta." + }, + "glaiveRush": { + "name": "Spadoncarica", + "effect": "Il Pokémon si lancia in una carica avventata. Fino al suo prossimo turno, il Pokémon riceverà il doppio dei danni dagli attacchi altrui, che andranno sempre a segno." + }, + "revivalBlessing": { + "name": "Preghiera Vitale", + "effect": "Il Pokémon intona una preghiera compassionevole, rianimando un Pokémon della squadra esausto e restituendogli metà dei suoi PS." + }, + "saltCure": { + "name": "Sotto Sale", + "effect": "Il Pokémon mette sotto sale il bersaglio, infliggendogli danni a ogni turno. I Pokémon di tipo Acciaio e di tipo Acqua sono particolarmente vulnerabili a questa mossa." + }, + "tripleDive": { + "name": "Triplo Tuffo", + "effect": "Il Pokémon si lancia in un triplo tuffo perfettamente coordinato, colpendo il bersaglio con degli schizzi d'acqua e infliggendogli danni tre volte di fila." + }, + "mortalSpin": { + "name": "Glitturbine", + "effect": "Attacco rotante che elimina gli effetti di mosse come Legatutto, Avvolgibotta e Parassiseme. Aumenta anche la Velocità di chi la usa." + }, + "doodle": { + "name": "Ricalco", + "effect": "Il Pokémon cattura l'essenza del bersaglio con un ricalco, copiandone l'abilità e applicandola a se stesso e ai suoi alleati." + }, + "filletAway": { + "name": "Alleggerimento", + "effect": "Il Pokémon sacrifica dei PS per far aumentare di molto l'Attacco, l'Attacco Speciale e la Velocità." + }, + "kowtowCleave": { + "name": "Genufendente", + "effect": "Il Pokémon si genuflette per far abbassare la guardia al bersaglio e poi fenderlo. Questo attacco va sempre a segno." + }, + "flowerTrick": { + "name": "Prestigiafiore", + "effect": "\tIl Pokémon attacca il bersaglio lanciandogli addosso un mazzo di fiori truccato. Questo attacco va sempre a segno, infliggendo anche un brutto colpo." + }, + "torchSong": { + "name": "Canzone Ardente", + "effect": "Il Pokémon abbrustolisce il bersaglio soffiandogli addosso fiamme ardenti come se intonasse una canzone. Inoltre, il suo Attacco Speciale aumenta." + }, + "aquaStep": { + "name": "Idroballetto", + "effect": "Il Pokémon si prende gioco del bersaglio con passi di danza leggiadri e fluidi come l’acqua, infliggendogli danni. Inoltre, la sua Velocità aumenta." + }, + "ragingBull": { + "name": "Scatenatoro", + "effect": "Il Pokémon carica il bersaglio con furia cieca, rompendo barriere come Schermoluce e Riflesso. Il tipo di questa mossa dipende dalla forma di chi la usa." + }, + "makeItRain": { + "name": "Corsa all'Oro", + "effect": "Il Pokémon attacca lanciando una gran quantità di monete recuperabili dopo la lotta, ma riduce il proprio Attacco Speciale." + }, + "psyblade": { + "name": "Psicolama", + "effect": "Il Pokémon falcia il bersaglio con una lama eterea. La potenza della mossa aumenta del 50% quando è attivo un Campo Elettrico." + }, + "hydroSteam": { + "name": "Idrovapore", + "effect": "Il Pokémon ricopre con forza il bersaglio di acqua bollente. Con la luce solare intensa, la potenza di questa mossa aumenta del 50% anziché diminuire." + }, + "ruination": { + "name": "Catastrofe", + "effect": "Il Pokémon invoca una terribile disgrazia, dimezzando i PS del bersaglio." + }, + "collisionCourse": { + "name": "Turboschianto", + "effect": "Il Pokémon si schianta al suolo mentre si trasforma, causando un'esplosione primordiale. La potenza della mossa aumenta se questa è superefficace sul bersaglio." + }, + "electroDrift": { + "name": "Fulmiscatto", + "effect": "Il Pokémon saetta mentre si trasforma, trafiggendo il bersaglio con una scossa futuristica. La potenza della mossa aumenta se questa è superefficace sul bersaglio." + }, + "shedTail": { + "name": "Tagliacoda", + "effect": "Chi la usa crea una copia di se stesso usando parte dei suoi PS e si fa sostituire da un altro Pokémon della squadra." + }, + "chillyReception": { + "name": "Freddura", + "effect": "Chi la usa dice una freddura che fa raggelare i presenti per poi farsi sostituire da un altro Pokémon della squadra. Causa una nevicata che dura per cinque turni." + }, + "tidyUp": { + "name": "Pulizie", + "effect": "Il Pokémon fa le pulizie, annullando gli effetti di Punte, Levitoroccia, Rete Vischiosa, Fielepunte e Sostituto. Inoltre, aumenta il suo Attacco e la sua Velocità." + }, + "snowscape": { + "name": "Vista Innevata", + "effect": "Il Pokémon causa una nevicata che dura per cinque turni e aumenta la Difesa dei Pokémon di tipo Ghiaccio." + }, + "pounce": { + "name": "Balzo", + "effect": "Il Pokémon fa un balzo e attacca il bersaglio, riducendone inoltre la Velocità." + }, + "trailblaze": { + "name": "Apripista", + "effect": "Il Pokémon attacca come se saltasse fuori dall'erba alta e si muove con passo leggiadro, aumentando la propria Velocità." + }, + "chillingWater": { + "name": "Doccia Fredda", + "effect": "Il Pokémon attacca il bersaglio con una doccia d'acqua talmente fredda da farlo demoralizzare, riducendone l'Attacco." + }, + "hyperDrill": { + "name": "Ipertrapano", + "effect": "Il Pokémon fa roteare rapidamente la parte appuntita del suo corpo, perforando il bersaglio ed eludendo mosse come Protezione e Individua." + }, + "twinBeam": { + "name": "Doppioraggio", + "effect": "Il Pokémon attacca il bersaglio con misteriosi raggi di luce emessi dagli occhi che infliggono danni due volte di fila." + }, + "rageFist": { + "name": "Pugno Furibondo", + "effect": "Il Pokémon trasforma la sua furia in energia e la utilizza per attaccare. Più attacchi ha subito il Pokémon, più la potenza della mossa aumenta." + }, + "armorCannon": { + "name": "Corazza Cannone", + "effect": "Il Pokémon si libera della sua corazza, scagliandola sul bersaglio come una raffica di proiettili incandescenti. La sua Difesa e la sua Difesa Speciale diminuiscono." + }, + "bitterBlade": { + "name": "Lama del Rimorso", + "effect": "Il Pokémon concentra nelle lame tutti i rimorsi accumulati nel mondo dei vivi e assale il bersaglio, recuperando una quantità di PS pari a metà del danno inflitto." + }, + "doubleShock": { + "name": "Doppiolampo", + "effect": "Il Pokémon libera tutta la sua potenza elettrica per infliggere gravi danni al bersaglio, ma come conseguenza perde il tipo Elettro." + }, + "gigatonHammer": { + "name": "Granmartello", + "effect": "Chi la usa attacca il bersaglio brandendo un enorme martello. La mossa non può essere usata per due volte di fila." + }, + "comeuppance": { + "name": "Ritorsione", + "effect": "Il Pokémon restituisce con gli interessi i danni subiti all'ultimo avversario che l'ha colpito." + }, + "aquaCutter": { + "name": "Idrotaglio", + "effect": "\tIl Pokémon espelle acqua ad alta pressione e falcia il bersaglio con un fendente tagliente quanto una lama. Probabile brutto colpo." + }, + "blazingTorque": { + "name": "Turboustione", + "effect": "L'utilizzatore accende il suo motore ardente verso il bersaglio. Ciò potrebbe anche lasciare il bersaglio con una bruciatura." + }, + "wickedTorque": { + "name": "Turbotenebra", + "effect": "L'utente accende il proprio motore nel bersaglio con intenti dannosi. Ciò potrebbe addormentare il bersaglio." + }, + "noxiousTorque": { + "name": "Turbotossina", + "effect": "L'utilizzatore fa girare il suo motore velenoso verso il bersaglio. Ciò potrebbe anche avvelenare il bersaglio." + }, + "combatTorque": { + "name": "Turborissa", + "effect": "L'utente accelera con forza il proprio motore verso il bersaglio. Ciò potrebbe anche lasciare il bersaglio paralizzato." + }, + "magicalTorque": { + "name": "Turboincanto", + "effect": "L'utilizzatore fa girare il proprio motore fatato verso il bersaglio. Ciò potrebbe anche confondere l'obiettivo." + }, + "bloodMoon": { + "name": "Luna Rossa", + "effect": "Il Pokémon attacca rilasciando tutta la sua energia, confluita in una luna piena rossa come il sangue. Questa mossa non può essere usata due volte di fila." + }, + "matchaGotcha": { + "name": "Spruzzatè", + "effect": "Il Pokémon attacca mescolando del tè e spruzzandolo, recuperando una quantità di PS pari alla metà del danno inflitto. Può anche scottare il bersaglio." + }, + "syrupBomb": { + "name": "Bomba Sciroppata", + "effect": "\tIl Pokémon fa esplodere dello sciroppo viscoso sul bersaglio, ricoprendolo e facendogli diminuire la Velocità per tre turni." + }, + "ivyCudgel": { + "name": "Clava di Liane", + "effect": "Il Pokémon colpisce con una clava avvolta da liane. Il tipo della mossa varia in base alla maschera indossata. Probabile brutto colpo." + }, + "electroShot": { + "name": "Elettroraggio", + "effect": "Il Pokémon accumula elettricità e aumenta l'Attacco Speciale al primo turno, per poi rilasciare una potente scarica al turno successivo o, se piove, immediatamente." + }, + "teraStarstorm": { + "name": "Teracluster", + "effect": "Il Pokémon elimina il bersaglio irradiando il potere dei cristalli. Se Terapagos assume la Forma Astrale, la mossa infligge danni a tutti gli avversari." + }, + "fickleBeam": { + "name": "Irregolaser", + "effect": "Il Pokémon attacca rilasciando raggi di luce. Talvolta i laser vengono emessi da tutte le teste, contribuendo a raddoppiare la potenza della mossa." + }, + "burningBulwark": { + "name": "Egida Ignea", + "effect": "Il Pokémon blocca gli attacchi avversari con la pelliccia incandescente che scotta chi entra in contatto con lui." + }, + "thunderclap": { + "name": "Saetta", + "effect": "Il Pokémon abbatte una scarica elettrica sul bersaglio prima che questi possa attaccare. La mossa fallisce se il bersaglio sferra una mossa che non è di attacco." + }, + "mightyCleave": { + "name": "Taglio Poderoso", + "effect": "Il Pokémon fende il bersaglio con la luce immagazzinata nella testa, ignorando gli effetti delle mosse protettive." + }, + "tachyonCutter": { + "name": "Tachiontaglio", + "effect": "Il Pokémon emette delle lame particellari in successione, infliggendo danni due volte di fila. Questo attacco va sempre a segno." + }, + "hardPress": { + "name": "Pressa d'Acciaio", + "effect": "Il Pokémon schiaccia il bersaglio usando i propri arti. Più PS rimangono al bersaglio, maggiore è la potenza della mossa." + }, + "dragonCheer": { + "name": "Grido del Drago", + "effect": "Il Pokémon incita gli alleati con un inno ai draghi, aumentando la probabilità che sferrino brutti colpi. Particolarmente efficace con alleati di tipo Drago." + }, + "alluringVoice": { + "name": "Ammaliavoce", + "effect": "Il Pokémon attacca sfruttando il suo canto angelico, confondendo il bersaglio se le sue statistiche sono aumentate nello stesso turno." + }, + "temperFlare": { + "name": "Rabbia Bruciante", + "effect": "Il Pokémon attacca con l'impeto di chi è pronto a tutto. Se la mossa usata al turno precedente non è andata a segno, la potenza raddoppia." + }, + "supercellSlam": { + "name": "Elettrotuffo", + "effect": "Il Pokémon si schianta sul bersaglio dopo essersi elettrificato. Se la mossa fallisce, il Pokémon subisce dei danni." + }, + "psychicNoise": { + "name": "Psicorumore", + "effect": "\tl Pokémon investe il bersaglio con insopportabili onde sonore che gli impediscono di recuperare PS con mosse, abilità o strumenti che ha con sé per due turni." + }, + "upperHand": { + "name": "Colpo di Mano", + "effect": "Il Pokémon reagisce al movimento del bersaglio e, colpendo con il palmo, lo fa tentennare. Se il bersaglio non sferra un attacco ad alta priorità, la mossa fallisce." + }, + "malignantChain": { + "name": "Intossicatena", + "effect": "Il Pokémon logora il bersaglio avvolgendolo con le sue catene fatte di veleno e iniettandogli delle tossine che possono anche iperavvelenarlo." + } +} diff --git a/src/locales/it/move.ts b/src/locales/it/move.ts deleted file mode 100644 index a7ebd605f18..00000000000 --- a/src/locales/it/move.ts +++ /dev/null @@ -1,3812 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -export const move: MoveTranslationEntries = { - pound: { - name: "Botta", - effect: "Colpisce il nemico con la coda o le zampe anteriori.", - }, - karateChop: { - name: "Colpokarate", - effect: "Colpisce il nemico con un colpo netto. Probabile brutto colpo.", - }, - doubleSlap: { - name: "Doppiasberla", - effect: "Schiaffeggia il nemico da due a cinque volte di fila.", - }, - cometPunch: { - name: "Cometapugno", - effect: "Colpisce il nemico con una scarica di pugni da due a cinque volte di fila.", - }, - megaPunch: { - name: "Megapugno", - effect: "Colpisce il nemico con un pugno poderoso.", - }, - payDay: { - name: "Giornopaga", - effect: "Colpisce il nemico con una gran quantità di monete recuperabili dopo la lotta.", - }, - firePunch: { - name: "Fuocopugno", - effect: "Colpisce il nemico con un pugno ardente che può scottarlo.", - }, - icePunch: { - name: "Gelopugno", - effect: "Colpisce il nemico con un pugno di ghiaccio che può congelarlo.", - }, - thunderPunch: { - name: "Tuonopugno", - effect: "Colpisce il nemico con un pugno elettrico che può paralizzarlo.", - }, - scratch: { - name: "Graffio", - effect: "Infligge danni al nemico con artigli acuminati, duri e affilati.", - }, - viseGrip: { - name: "Presa", - effect: "Stringe il nemico in una morsa usando enormi e possenti tenaglie.", - }, - guillotine: { - name: "Ghigliottina", - effect: "Attacca il nemico con pericolose tenaglie. Se l'attacco va a segno, il nemico va subito KO.", - }, - razorWind: { - name: "Ventagliente", - effect: "Chi la usa genera un turbine al primo turno e attacca al secondo. Probabile brutto colpo.", - }, - swordsDance: { - name: "Danzaspada", - effect: "Danza frenetica che incrementa lo spirito combattivo. Chi la usa aumenta di molto il suo Attacco.", - }, - cut: { - name: "Taglio", - effect: "Attacca il nemico con artigli o falci affilate. Fuori dalla lotta si usa per tagliare piccoli alberi.", - }, - gust: { - name: "Raffica", - effect: "Infligge danni al nemico con una folata di vento sollevata dalle ali.", - }, - wingAttack: { - name: "Attacco d'Ala", - effect: "Infligge danni al nemico spiegando delle grandi ali possenti.", - }, - whirlwind: { - name: "Turbine", - effect: "Il bersaglio è spazzato via ed è costretto a lasciare il posto ad un altro. Se è selvatico, la lotta finisce.", - }, - fly: { - name: "Volo", - effect: "Chi la usa si alza in volo per attaccare al turno seguente. Fuori dalla lotta permette di volare in città già visitate.", - }, - bind: { - name: "Legatutto", - effect: "Lega e stritola il nemico per quattro o cinque turni con tentacoli o con un corpo lungo.", - }, - slam: { - name: "Schianto", - effect: "Infligge danni al nemico con una coda, una liana o simili.", - }, - vineWhip: { - name: "Frustata", - effect: "Infligge danni al nemico con liane sottili simili a fruste.", - }, - stomp: { - name: "Pestone", - effect: "Colpisce il nemico con un grosso piede e può anche farlo tentennare.", - }, - doubleKick: { - name: "Doppiocalcio", - effect: "Colpisce il nemico due volte con un paio di rapidi calci inferti con entrambi i piedi.", - }, - megaKick: { - name: "Megacalcio", - effect: "Colpisce il nemico con un calcio sferrato con la forza di muscoli poderosi.", - }, - jumpKick: { - name: "Calciosalto", - effect: "Permette di saltare in alto per attaccare con un calcio. Se non va a buon fine, chi la usa si ferisce.", - }, - rollingKick: { - name: "Calciorullo", - effect: "Chi la usa infierisce sul nemico con un calcio rotante. Può anche farlo tentennare.", - }, - sandAttack: { - name: "Turbosabbia", - effect: "Getta sabbia in faccia al nemico e ne riduce la precisione.", - }, - headbutt: { - name: "Bottintesta", - effect: "Chi la usa si lancia diritto di testa contro il nemico. Può anche far tentennare.", - }, - hornAttack: { - name: "Incornata", - effect: "Danneggia il nemico infilzandolo con un corno affilato.", - }, - furyAttack: { - name: "Furia", - effect: "Infilza il nemico con corna affilate o un becco da due a cinque volte di fila.", - }, - hornDrill: { - name: "Perforcorno", - effect: "Colpisce il nemico con un corno perforante come un trapano. Se il colpo va a segno, il nemico va KO.", - }, - tackle: { - name: "Azione", - effect: "Attacco fisico che colpisce il nemico investendolo con tutto il corpo.", - }, - bodySlam: { - name: "Corposcontro", - effect: "Chi la usa carica il nemico con tutto il corpo. Può causarne anche la paralisi.", - }, - wrap: { - name: "Avvolgibotta", - effect: "Avvolge e stritola il nemico con un corpo lungo o con piante rampicanti per quattro o cinque turni.", - }, - takeDown: { - name: "Riduttore", - effect: "Carica spericolata con tutto il corpo contro il nemico. Danneggia un po' anche chi la usa.", - }, - thrash: { - name: "Colpo", - effect: "Assale e attacca il nemico per due o tre turni, ma confonde chi la usa.", - }, - doubleEdge: { - name: "Sdoppiatore", - effect: "Carica spietata e pericolosa che danneggia molto anche chi la usa.", - }, - tailWhip: { - name: "Colpocoda", - effect: "Chi la usa agita la coda per distrarre i nemici, riducendone la Difesa.", - }, - poisonSting: { - name: "Velenospina", - effect: "Colpisce il nemico con un aculeo tossico che può anche avvelenarlo.", - }, - twineedle: { - name: "Doppio Ago", - effect: "Colpisce il nemico due volte di seguito con un paio di aghi. Può anche avvelenarlo.", - }, - pinMissile: { - name: "Missilspillo", - effect: "Il nemico viene colpito da due a cinque volte con spilli appuntiti in rapida successione.", - }, - leer: { - name: "Fulmisguardo", - effect: "Il nemico viene guardato con sguardo intimidatorio da occhi acuti. Viene ridotta la difesa dell'avversario.", - }, - bite: { - name: "Morso", - effect: "Il nemico viene morso da denti affilatissimi che possono farlo tentennare.", - }, - growl: { - name: "Ruggito", - effect: "Il Pokémon ruggisce con cattiveria. Viene ridotto l'attacco dell'avversario.", - }, - roar: { - name: "Boato", - effect: "Il bersaglio è costretto a lasciare il campo e viene sostituito. Mette fine alle lotte contro Pokémon selvatici.", - }, - sing: { - name: "Canto", - effect: "Una ninna nanna è cantata con voce calma per far addormentare il nemico.", - }, - supersonic: { - name: "Supersuono", - effect: "Chi la usa genera dal proprio corpo strane onde acustiche che possono confondere il nemico.", - }, - sonicBoom: { - name: "Sonicboom", - effect: "Il nemico viene colpito con un suono distruttivo che infligge un danno sempre 20 PS.", - }, - disable: { - name: "Inibitore", - effect: "Per quattro turni impedisce al bersaglio di riutilizzare l'ultima mossa usata.", - }, - acid: { - name: "Acido", - effect: "Colpisce i nemici intorno spruzzando un acido corrosivo. Può anche ridurne la Difesa Speciale.", - }, - ember: { - name: "Braciere", - effect: "Il Pokémon attacca con piccole fiamme. Possono scottare il nemico.", - }, - flamethrower: { - name: "Lanciafiamme", - effect: "Il nemico viene colpito da intense fiammate che possono anche scottarlo.", - }, - mist: { - name: "Nebbia", - effect: "Chi la usa attira una nebbia che blocca la riduzione alle statistiche della sua squadra per cinque turni.", - }, - waterGun: { - name: "Pistolacqua", - effect: "Il nemico è colpito da un potente getto d'acqua.", - }, - hydroPump: { - name: "Idropompa", - effect: "Il nemico è travolto da un potente getto d'acqua spruzzato ad altissima pressione.", - }, - surf: { - name: "Surf", - effect: "Un'onda enorme sommerge il campo di lotta. Fuori dalla lotta si usa per spostarsi sull'acqua.", - }, - iceBeam: { - name: "Geloraggio", - effect: "Il nemico è colpito da un raggio di energia gelida che può anche congelarlo.", - }, - blizzard: { - name: "Bora", - effect: "Colpisce i bersagli con una tremenda tempesta di ghiaccio che può anche congelarli.", - }, - psybeam: { - name: "Psicoraggio", - effect: "Il nemico è attaccato con un raggio psichico. Può anche lasciare il nemico confuso.", - }, - bubbleBeam: { - name: "Bollaraggio", - effect: "Colpisce il nemico con una forte scarica di bolle. Può anche ridurne la Velocità.", - }, - auroraBeam: { - name: "Raggiaurora", - effect: "Il nemico viene colpito da un fascio color arcobaleno. Può ridurre l'attacco dell'avversario.", - }, - hyperBeam: { - name: "Iper Raggio", - effect: "Colpisce il nemico con un potente raggio. Chi la usa salta il turno successivo per recuperare energia.", - }, - peck: { - name: "Beccata", - effect: "Colpisce il nemico con un becco appuntito o un corno.", - }, - drillPeck: { - name: "Perforbecco", - effect: "Attacco a spirale con un becco aguzzo che fa da trapano.", - }, - submission: { - name: "Sottomissione", - effect: "Chi la usa carica il nemico in modo spericolato, ma danneggia anche se stesso.", - }, - lowKick: { - name: "Colpo Basso", - effect: "Un calcio basso e potente che fa cadere il nemico. Danneggia maggiormente i nemici più pesanti.", - }, - counter: { - name: "Contrattacco", - effect: "Una mossa di ritorsione che contrasta qualsiasi attacco fisico, infliggendo il doppio dei danni subiti.", - }, - seismicToss: { - name: "Movimento Sismico", - effect: "Colpisce il bersaglio con la forza di gravità. Infligge un danno pari al livello di chi la usa.", - }, - strength: { - name: "Forza", - effect: "Colpisce il nemico con un'enorme energia. Fuori dalla lotta si usa per spostare i massi.", - }, - absorb: { - name: "Assorbimento", - effect: "Mossa che assorbe PS. Chi la usa recupera una quantità di PS pari alla metà del danno inferto.", - }, - megaDrain: { - name: "Megassorbimento", - effect: "Mossa che assorbe PS. Chi la usa recupera un quantità di PS pari alla metà del danno inferto.", - }, - leechSeed: { - name: "Parassiseme", - effect: "Vengono piantati semi sul bersaglio. Questi sottraggono PS a ogni turno permettendo a chi la usa di curarsi.", - }, - growth: { - name: "Crescita", - effect: "Provoca la crescita immediata del corpo e l'aumento dell'Attacco e dell'Attacco Speciale di chi la usa.", - }, - razorLeaf: { - name: "Foglielama", - effect: "Foglie taglienti sferzano i nemici intorno. Probabile brutto colpo.", - }, - solarBeam: { - name: "Solarraggio", - effect: "Chi la usa assorbe luce al primo turno per proiettare un raggio intenso al turno successivo.", - }, - poisonPowder: { - name: "Velenpolvere", - effect: "Una nube di polvere velenosa è sparsa sul nemico. Può avvelenare il bersaglio.", - }, - stunSpore: { - name: "Paralizzante", - effect: "Investe il bersaglio con una nuvola di polvere che paralizza.", - }, - sleepPowder: { - name: "Sonnifero", - effect: "Investe il bersaglio con una grande nuvola di polvere soporifera che lo fa addormentare.", - }, - petalDance: { - name: "Petalodanza", - effect: "Attacca il nemico cospargendolo di petali per due o tre turni, ma chi la usa rimane confuso.", - }, - stringShot: { - name: "Millebave", - effect: "Chi la usa produce della seta che avvolge i nemici e ne riduce la Velocità.", - }, - dragonRage: { - name: "Ira di Drago", - effect: "Colpisce il nemico con un'onda d'urto generata dall'ira. Questo attacco provoca sempre un danno di 40 PS.", - }, - fireSpin: { - name: "Turbofuoco", - effect: "Intrappola il bersaglio in un turbine di fuoco che dura per quattro o cinque turni.", - }, - thunderShock: { - name: "Tuonoshock", - effect: "Danneggia il bersaglio con una scarica elettrica che può anche paralizzarlo.", - }, - thunderbolt: { - name: "Fulmine", - effect: "Il bersaglio viene colpito da una potente scarica elettrica che può anche paralizzarlo.", - }, - thunderWave: { - name: "Tuononda", - effect: "Il nemico viene colpito da una debole scarica elettrica che, se va a segno, ne causa la paralisi.", - }, - thunder: { - name: "Tuono", - effect: "Il nemico è colpito da un lampo molto violento che può anche paralizzarlo.", - }, - rockThrow: { - name: "Sassata", - effect: "Chi la usa solleva una roccia e la lancia contro il nemico.", - }, - earthquake: { - name: "Terremoto", - effect: "Chi la usa provoca un potente sisma che colpisce gli altri Pokémon in campo.", - }, - fissure: { - name: "Abisso", - effect: "Chi la usa crea una spaccatura nel terreno e cerca di gettarvici dentro il nemico. Se va a segno, il nemico va KO.", - }, - dig: { - name: "Fossa", - effect: "Chi la usa scava al primo turno e attacca al successivo. Fuori dalla lotta fa uscire da alcuni luoghi.", - }, - toxic: { - name: "Tossina", - effect: "Una mossa che lascia l'obiettivo gravemente avvelenato. Il danno da veleno peggiora ad ogni turno.", - }, - confusion: { - name: "Confusione", - effect: "Colpisce il nemico con una leggera forza telecinetica e può anche confonderlo.", - }, - psychic: { - name: "Psichico", - effect: "Il nemico viene colpito da una potente forza telecinetica che può anche ridurne la Difesa Speciale.", - }, - hypnosis: { - name: "Ipnosi", - effect: "Chi la usa si avvale della suggestione ipnotica per far addormentare il nemico.", - }, - meditate: { - name: "Meditazione", - effect: "Il Pokémon medita risvegliando il potere nel profondo del suo corpo ed aumentando il suo Attacco.", - }, - agility: { - name: "Agilità", - effect: "Chi la usa rilassa e alleggerisce il proprio corpo per far salire di molto la Velocità.", - }, - quickAttack: { - name: "Attacco Rapido", - effect: "Chi la usa colpisce sempre per primo e ad una tale velocità da rendersi quasi invisibile.", - }, - rage: { - name: "Ira", - effect: "Questa mossa ha il potere di aumentare la statistica Attacco ogni volta che chi la usa viene colpito durante una lotta.", - }, - teleport: { - name: "Teletrasporto", - effect: "Fa fuggire dai Pokémon selvatici. Fuori dalla lotta porta all'ultimo Centro Pokémon visitato.", - }, - nightShade: { - name: "Ombra Notturna", - effect: "Fa apparire un orribile miraggio al nemico e infligge un danno pari al livello di chi la usa.", - }, - mimic: { - name: "Mimica", - effect: "Copia l'ultima mossa usata dal bersaglio. La mossa copiata si può utilizzare fino alla sostituzione del Pokémon.", - }, - screech: { - name: "Stridio", - effect: "Stridio assordante che riduce di molto la Difesa del nemico.", - }, - doubleTeam: { - name: "Doppioteam", - effect: "Chi la usa si muove in fretta e crea copie illusorie di se stesso che aumentano la capacità di elusione.", - }, - recover: { - name: "Ripresa", - effect: "Una mossa di auto-guarigione. Il Pokémon ripristina i suoi PS fino a metà dei suoi PS massimi.", - }, - harden: { - name: "Rafforzatore", - effect: "Tutti i muscoli del corpo si tonificano per aumentare la Difesa.", - }, - minimize: { - name: "Minimizzato", - effect: "Il corpo di chi la usa si comprime e diventa più piccolo. La sua capacità di elusione aumenta di molto.", - }, - smokescreen: { - name: "Muro di Fumo", - effect: "Il Pokémon rilascia un'oscura cortina di fumo che riduce la precisione del nemico.", - }, - confuseRay: { - name: "Stordiraggio", - effect: "Il nemico è colpito da un raggio sinistro che lo confonde.", - }, - withdraw: { - name: "Ritirata", - effect: "Il corpo si ritira nel suo duro guscio per aumentare la Difesa.", - }, - defenseCurl: { - name: "Ricciolscudo", - effect: "Chi la usa si raggomitola per nascondere i punti deboli e aumentare la propria Difesa.", - }, - barrier: { - name: "Barriera", - effect: "Innalza una barriera resistente che aumenta molto la Difesa.", - }, - lightScreen: { - name: "Schermoluce", - effect: "Innalza una barriera di luce fantastica per ridurre i danni degli attacchi speciali alla squadra per cinque turni.", - }, - haze: { - name: "Nube", - effect: "Chi la usa crea una nube nera che annulla ogni modifica delle statistiche di tutti i Pokémon in campo.", - }, - reflect: { - name: "Riflesso", - effect: "Innalza una barriera di luce fantastica per ridurre i danni degli attacchi fisici alla squadra per cinque turni.", - }, - focusEnergy: { - name: "Focalenergia", - effect: "Chi la usa fa un profondo respiro e si concentra per rendere più probabili i brutti colpi.", - }, - bide: { - name: "Pazienza", - effect: "Chi la usa subisce attacchi per due turni e poi restituisce il danno moltiplicato per due.", - }, - metronome: { - name: "Metronomo", - effect: "Il Pokémon fa di no con il dito e stimola il cervello a usare a caso una delle tante mosse esistenti.", - }, - mirrorMove: { - name: "Speculmossa", - effect: "Chi la usa colpisce il bersaglio copiandone l'ultima mossa usata.", - }, - selfDestruct: { - name: "Autodistruzione", - effect: "Chi la usa esplode e infligge danni agli altri Pokémon in campo, ma poi va KO.", - }, - eggBomb: { - name: "Uovobomba", - effect: "Colpisce il nemico con un grande uovo scaraventato con enorme forza.", - }, - lick: { - name: "Leccata", - effect: "Una lingua lunga infligge danni al nemico e può anche paralizzarlo.", - }, - smog: { - name: "Smog", - effect: "Colpisce il nemico con una scarica di gas maleodoranti. Può anche avvelenarlo.", - }, - sludge: { - name: "Fango", - effect: "Lancio di fango malsano che arreca danno al nemico. Può anche avvelenarlo.", - }, - boneClub: { - name: "Ossoclava", - effect: "Il Pokémon colpisce il nemico con un bastone d'osso. Può anche fare tentennare l'obiettivo.", - }, - fireBlast: { - name: "Fuocobomba", - effect: "Investe il nemico con un'intensa fiammata che fa terra bruciata. Può anche scottarlo.", - }, - waterfall: { - name: "Cascata", - effect: "Carica il nemico a grande velocità e può farlo tentennare. Fuori dalla lotta fa risalire le cascate.", - }, - clamp: { - name: "Tenaglia", - effect: "Chi la usa intrappola e stritola il nemico con la sua corazza spessa e forte per quattro o cinque turni.", - }, - swift: { - name: "Comete", - effect: "Colpisce i nemici con raggi a forma di stella. Questo attacco è infallibile.", - }, - skullBash: { - name: "Capocciata", - effect: "Chi la usa ritira la testa per aumentare la Difesa e poi attacca al turno successivo.", - }, - spikeCannon: { - name: "Sparalance", - effect: "Il nemico viene colpito da due a cinque volte in rapida successione da spilli appuntiti.", - }, - constrict: { - name: "Limitazione", - effect: "Colpisce il nemico con lunghi tentacoli o piante rampicanti. Può anche ridurne la Velocità.", - }, - amnesia: { - name: "Amnesia", - effect: "Vuoto di memoria che aumenta esponenzialmente la difesa speciale.", - }, - kinesis: { - name: "Cinèsi", - effect: "Chi la usa distrae il bersaglio piegando un cucchiaio e ne riduce la precisione.", - }, - softBoiled: { - name: "Covauova", - effect: "Chi la usa recupera metà dei propri PS massimi. Fuori dalla lotta può anche far trasferire PS ai propri compagni.", - }, - highJumpKick: { - name: "Calcinvolo", - effect: "Chi la usa colpisce il nemico con una ginocchiata in volo: se fallisce, subisce danni.", - }, - glare: { - name: "Sguardo Feroce", - effect: "Chi la usa spaventa il nemico con uno sguardo terrificante e ne causa la paralisi.", - }, - dreamEater: { - name: "Mangiasogni", - effect: "Attacco che funziona solo su un nemico che dorme. Chi lo usa riceve metà dei PS persi dal nemico.", - }, - poisonGas: { - name: "Velenogas", - effect: "Spruzza in faccia al nemico una nuvola di gas tossico che avvelena.", - }, - barrage: { - name: "Attacco Pioggia", - effect: "Piovono enormi sfere sulla testa del nemico da due a cinque volte di fila.", - }, - leechLife: { - name: "Sanguisuga", - effect: "Mossa succhiasangue. Chi la usa recupera una quantità di PS pari alla metà del danno inferto.", - }, - lovelyKiss: { - name: "Demonbacio", - effect: "Chi la usa intimidisce il bersaglio con una faccia paurosa e gli schiocca un bacio che lo fa addormentare.", - }, - skyAttack: { - name: "Aeroattacco", - effect: "Un attacco in due turni e probabile brutto colpo. Può anche far tentennare il nemico.", - }, - transform: { - name: "Trasformazione", - effect: "Chi la usa si trasforma in una copia esatta del bersaglio per sfruttarne le caratteristiche.", - }, - bubble: { - name: "Bolla", - effect: "Uno spruzzo di bolle viene lanciato sul nemico. Può ridurne la velocità.", - }, - dizzyPunch: { - name: "Stordipugno", - effect: "Colpisce il bersaglio con una sequenza di pugni che può anche confonderlo.", - }, - spore: { - name: "Spora", - effect: "Nube di spore che fa sempre addormentare il bersaglio.", - }, - flash: { - name: "Flash", - effect: "Il Pokémon usa un lampo di luce contro il nemico riducendone la precisione. Può essere usata per illuminare luoghi oscuri.", - }, - psywave: { - name: "Psiconda", - effect: "Il nemico è attaccato con una strana onda di energia. L'intensità dell'attacco è variabile.", - }, - splash: { - name: "Splash", - effect: "Chi la usa sguazza nell'acqua, senza ottenere alcun effetto.", - }, - acidArmor: { - name: "Scudo Acido", - effect: "Il Pokémon modifica la sua struttura cellulare liquefandosi, per aumentare esponenzialmente la sua difesa.", - }, - crabhammer: { - name: "Martellata", - effect: "Colpisce il nemico con una grande tenaglia. Probabile brutto colpo.", - }, - explosion: { - name: "Esplosione", - effect: "Chi la usa esplode per infliggere danni agli altri Pokémon attorno, ma va KO.", - }, - furySwipes: { - name: "Sfuriate", - effect: "Colpisce il nemico con artigli o falci affilate da due a cinque volte in rapida successione.", - }, - bonemerang: { - name: "Ossomerang", - effect: "Chi la usa lancia l'osso che tiene. L'osso colpisce due volte e ritorna come un vero e proprio boomerang.", - }, - rest: { - name: "Riposo", - effect: "Il Pokémon si addormenta per due turni per curare tutti i PS e qualsiasi problema di stato.", - }, - rockSlide: { - name: "Frana", - effect: "I nemici vengono colpiti da grandi massi che possono anche farli tentennare.", - }, - hyperFang: { - name: "Iperzanna", - effect: "Il Pokémon morde il nemico con zanne taglienti. Può anche farlo tentennare.", - }, - sharpen: { - name: "Affilatore", - effect: "Chi la usa riduce il numero di poligoni sul proprio corpo per accentuarne gli spigoli e aumentare l'Attacco.", - }, - conversion: { - name: "Conversione", - effect: "Il tipo di chi la usa muta in quello di una sua mossa a caso.", - }, - triAttack: { - name: "Tripletta", - effect: "Colpisce il nemico con tre sfere simultanee che possono anche paralizzarlo, scottarlo o congelarlo.", - }, - superFang: { - name: "Superzanna", - effect: "Chi la usa salta sul nemico azzannandolo con i suoi incisivi affilati e facendogli perdere metà dei PS.", - }, - slash: { - name: "Lacerazione", - effect: "Attacca il nemico con artigli, falci o altro. Probabile brutto colpo.", - }, - substitute: { - name: "Sostituto", - effect: "Chi la usa crea una copia di se stesso usando alcuni PS. La copia serve come esca per il nemico.", - }, - struggle: { - name: "Scontro", - effect: "Mossa da usare solo in caso estremo, quando non si hanno più PP. Danneggia anche chi la usa.", - }, - sketch: { - name: "Schizzo", - effect: "Permette a chi la usa di imparare l'ultima mossa usata dal bersaglio. La nuova mossa appresa sostituisce Schizzo.", - }, - tripleKick: { - name: "Triplocalcio", - effect: "Chi la usa esegue fino a tre calci consecutivi la cui potenza aumenta ad ogni colpo.", - }, - thief: { - name: "Furto", - effect: "Il Pokémon attacca e contemporaneamente ruba lo strumento tenuto dal nemico. Non ruberà nulla, se si possiede già uno strumento.", - }, - spiderWeb: { - name: "Ragnatela", - effect: "Copre il nemico con un filo di seta sottile e appiccicoso. Il nemico non può fuggire.", - }, - mindReader: { - name: "Leggimente", - effect: "Il Pokémon percepisce i movimenti del nemico con la mente per garantire il successo della mossa successiva.", - }, - nightmare: { - name: "Incubo", - effect: "Il nemico addormentato ha un incubo e perde PS ad ogni turno.", - }, - flameWheel: { - name: "Ruotafuoco", - effect: "Il Pokémon si avvolge nel fuoco e carica il nemico. Può scottare.", - }, - snore: { - name: "Russare", - effect: "Mossa da usare solo mentre si dorme. Il chiasso assordante può anche far tentennare il nemico.", - }, - curse: { - name: "Maledizione", - effect: "Una mossa che agisce in modo diverso se chi la usa è di tipo Spettro.", - }, - flail: { - name: "Flagello", - effect: "Chi la usa si dimena per attaccare. È più efficace se i suoi PS sono bassi.", - }, - conversion2: { - name: "Conversione2", - effect: "Chi la usa cambia tipo per rendersi resistente al tipo dell'ultima mossa usata dal bersaglio.", - }, - aeroblast: { - name: "Aerocolpo", - effect: "Colpisce il nemico con un vortice d'aria per danneggiarlo. Probabile brutto colpo.", - }, - cottonSpore: { - name: "Cottonspora", - effect: "Rilascia spore simili al cotone che si attaccano ai nemici nei paraggi e ne riducono di molto la Velocità.", - }, - reversal: { - name: "Contropiede", - effect: "Chi la usa attacca con tutte le sue forze. Più i PS sono bassi, maggiore è la potenza di questa mossa.", - }, - spite: { - name: "Dispetto", - effect: "Chi la usa sfoga la propria rabbia sull'ultima mossa usata dal bersaglio e le sottrae quattro PP.", - }, - powderSnow: { - name: "Polneve", - effect: "Attacca il nemico con una raffica di neve farinosa e può anche congelarlo.", - }, - protect: { - name: "Protezione", - effect: "Permette di eludere tutti gli attacchi. Se usata in successione può fallire.", - }, - machPunch: { - name: "Pugnorapido", - effect: "Chi la usa tira un pugno a velocità impressionante e colpisce di sicuro per primo.", - }, - scaryFace: { - name: "Visotruce", - effect: "Chi la usa spaventa il nemico con una faccia terribile e ne riduce di molto la Velocità.", - }, - feintAttack: { - name: "Finta", - effect: "Chi la usa si avvicina al nemico facendo finta di niente, per poi scagliare un pugno infallibile a tradimento.", - }, - sweetKiss: { - name: "Dolcebacio", - effect: "Chi la usa bacia il nemico con una dolcezza angelica, confondendolo.", - }, - bellyDrum: { - name: "Panciamburo", - effect: "Chi la usa massimizza l'Attacco in cambio di metà dei PS massimi.", - }, - sludgeBomb: { - name: "Fangobomba", - effect: "Chi la usa attacca lanciando fango sul bersaglio. Può anche avvelenarlo.", - }, - mudSlap: { - name: "Fangosberla", - effect: "Chi la usa butta fango in faccia al nemico per arrecargli danni e ridurne la precisione.", - }, - octazooka: { - name: "Octazooka", - effect: "Chi la usa spruzza del'inchiostro in faccia al nemico. Può anche ridurne la precisione.", - }, - spikes: { - name: "Punte", - effect: "Chi la usa piazza sul terreno una trappola di punte che danneggia i nemici quando scendono in campo.", - }, - zapCannon: { - name: "Falcecannone", - effect: "Chi la usa provoca un'esplosione elettrica che infligge danni e paralizza il nemico.", - }, - foresight: { - name: "Preveggenza", - effect: "Chi la usa rende i Pokémon di tipo Spettro vulnerabili a qualsiasi tipo di mossa e può, inoltre, colpire i nemici sfuggenti.", - }, - destinyBond: { - name: "Destinobbligato", - effect: "Se chi la usa va KO prima del proprio turno, chi ha sferrato il colpo da KO fa la stessa fine.", - }, - perishSong: { - name: "Ultimocanto", - effect: "Ogni Pokémon che sente questo canto va KO in tre turni, se non lo si sostituisce.", - }, - icyWind: { - name: "Ventogelato", - effect: "Chi la usa attacca i nemici con una folata di aria gelida e ne riduce anche la Velocità.", - }, - detect: { - name: "Individua", - effect: "Consente al Pokémon di evitare tutti gli attacchi. Può fallire se usato in successione.", - }, - boneRush: { - name: "Ossoraffica", - effect: "Chi la usa colpisce il nemico con un osso duro, da 2 a 5 volte di fila.", - }, - lockOn: { - name: "Localizza", - effect: "Chi la usa punta il nemico con precisione. La mossa successiva andrà a segno.", - }, - outrage: { - name: "Oltraggio", - effect: "Chi la usa sfoga la sua ira e attacca il nemico per due o tre turni prima di essere lasciato in preda alla confusione.", - }, - sandstorm: { - name: "Terrempesta", - effect: "Causa una tempesta di sabbia per cinque turni che danneggia tutti i tipi in campo esclusi Terra, Roccia e Acciaio.", - }, - gigaDrain: { - name: "Gigassorbimento", - effect: "Mossa che assorbe PS. Chi la usa recupera un quantità di PS pari alla metà del danno inferto.", - }, - endure: { - name: "Resistenza", - effect: "Chi la usa resta con un PS anche se subisce un colpo da KO in quel turno. Usata in successione può fallire.", - }, - charm: { - name: "Fascino", - effect: "Ammalia il nemico con lo sguardo per renderlo meno cauto. Riduce molto l'Attacco del nemico.", - }, - rollout: { - name: "Rotolamento", - effect: "Chi la usa colpisce il nemico rotolando per cinque turni, con aumento progressivo della potenza ogni volta che va a segno.", - }, - falseSwipe: { - name: "Falsofinale", - effect: "Chi la usa trattiene il colpo per impedire al nemico di andare KO, lasciandolo con almeno un PS.", - }, - swagger: { - name: "Bullo", - effect: "Chi la usa provoca il bersaglio e lo confonde, facendo aumentare però di molto il suo Attacco.", - }, - milkDrink: { - name: "Buonlatte", - effect: "Chi la usa recupera metà dei propri PS massimi. Fuori dalla lotta può anche far trasferire PS ai propri compagni.", - }, - spark: { - name: "Scintilla", - effect: "Colpisce il nemico con una carica elettrica e può anche paralizzarlo.", - }, - furyCutter: { - name: "Tagliofuria", - effect: "Colpisce il nemico con falci o artigli. Se usata in successione aumenta di potenza ogni volta che va a segno.", - }, - steelWing: { - name: "Alacciaio", - effect: "Colpisce il nemico con ali d'acciaio. Può anche aumentare la Difesa di chi la usa.", - }, - meanLook: { - name: "Malosguardo", - effect: "Chi la usa blocca il nemico con uno sguardo oscuro e ammaliante, impedendogli la fuga.", - }, - attract: { - name: "Attrazione", - effect: "Se il nemico è del sesso opposto, s'infatua e attacca con meno probabilità.", - }, - sleepTalk: { - name: "Sonnolalia", - effect: "Chi la usa sfodera a caso una delle proprie mosse mentre sta dormendo.", - }, - healBell: { - name: "Rintoccasana", - effect: "Chi la usa fa suonare le campane per curare completamente tutta la squadra.", - }, - return: { - name: "Ritorno", - effect: "Mossa che diventa tanto più potente quanto maggiore è il grado di affezione del Pokémon per il proprio Allenatore.", - }, - present: { - name: "Regalino", - effect: "Chi la usa dà un regalo bomba al bersaglio. A volte, però, può fargli recuperare PS.", - }, - frustration: { - name: "Frustrazione", - effect: "Mossa che diventa tanto più potente quanto minore è il grado di affezione del Pokémon per il proprio Allenatore.", - }, - safeguard: { - name: "Salvaguardia", - effect: "Chi la usa crea un campo protettivo che difende tutta la squadra dai problemi di stato per cinque turni.", - }, - painSplit: { - name: "Malcomune", - effect: "Chi la usa somma i propri PS a quelli di un altro Pokémon per poi dividerli in parti uguali.", - }, - sacredFire: { - name: "Magifuoco", - effect: "Colpisce il nemico con un fuoco mistico di enorme intensità che può anche causargli una scottatura.", - }, - magnitude: { - name: "Magnitudo", - effect: "Chi la usa scatena un terremoto d'intensità variabile che danneggia gli altri Pokémon in campo.", - }, - dynamicPunch: { - name: "Dinamipugno", - effect: "Colpisce il nemico con un pugno davvero forte. Se va a segno, lo confonde.", - }, - megahorn: { - name: "Megacorno", - effect: "Chi la usa utilizza il suo corno per montare con grande forza il nemico.", - }, - dragonBreath: { - name: "Dragospiro", - effect: "Investe il nemico con una raffica potentissima che arreca danni. Può anche paralizzarlo.", - }, - batonPass: { - name: "Staffetta", - effect: "Chi la usa è sostituito da un Pokémon della squadra, che eredita anche ogni modifica alle statistiche.", - }, - encore: { - name: "Ripeti", - effect: "Chi la usa costringe il nemico a continuare ad utilizzare solo l'ultima mossa utilizzata da 2 a 6 turni.", - }, - pursuit: { - name: "Inseguimento", - effect: "Una mossa d'attacco che infligge un danno doppio se il nemico è in fase di sostituzione.", - }, - rapidSpin: { - name: "Rapigiro", - effect: "Un attacco roteante che elimina gli effetti delle mosse Legatutto, Avvolgibotta, Parassiseme e Punte.", - }, - sweetScent: { - name: "Profumino", - effect: "Un dolce profumo che alletta il nemico per ridurne l'elusione. Attira anche Pokémon selvatici.", - }, - ironTail: { - name: "Codacciaio", - effect: "Il nemico viene colpito da una robusta coda d'acciaio. Può anche ridurne la Difesa.", - }, - metalClaw: { - name: "Ferrartigli", - effect: "Colpisce il nemico con artigli d'acciaio. Può anche aumentare l'Attacco di chi la usa.", - }, - vitalThrow: { - name: "Vitaltiro", - effect: "Chi la usa attacca per ultimo, ma il colpo è sempre infallibile.", - }, - morningSun: { - name: "Mattindoro", - effect: "Chi la usa recupera PS. Il numero di PS recuperati dipende dalle condizioni atmosferiche.", - }, - synthesis: { - name: "Sintesi", - effect: "Chi la usa recupera PS. Il numero di PS recuperati dipende dalle condizioni atmosferiche.", - }, - moonlight: { - name: "Lucelunare", - effect: "Chi la usa recupera PS. Il numero di PS recuperati dipende dalle condizioni atmosferiche.", - }, - hiddenPower: { - name: "Introforza", - effect: "Mossa singolare che cambia tipo e potenza a seconda del Pokémon che la usa.", - }, - crossChop: { - name: "Incrocolpo", - effect: "Investe il nemico con un colpo sferrato con entrambe le braccia incrociate. Probabile brutto colpo.", - }, - twister: { - name: "Tornado", - effect: "Un potente tornado si abbatte sul nemico. Può anche far tentennare.", - }, - rainDance: { - name: "Pioggiadanza", - effect: "Chi la usa provoca una forte pioggia per cinque turni, potenziando le mosse di tipo Acqua.", - }, - sunnyDay: { - name: "Giornodisole", - effect: "Chi la usa intensifica i raggi solari per cinque turni, potenziando le mosse di tipo Fuoco.", - }, - crunch: { - name: "Sgranocchio", - effect: "Il nemico viene morso con denti affilati. Può anche ridurne la Difesa.", - }, - mirrorCoat: { - name: "Specchiovelo", - effect: "Mossa che replica ogni attacco speciale, arrecando il doppio del danno ricevuto.", - }, - psychUp: { - name: "Psicamisù", - effect: "Chi la usa s'ipnotizza per copiare ogni modifica alle statistiche del bersaglio.", - }, - extremeSpeed: { - name: "Extrarapido", - effect: "Chi la usa carica il nemico a velocità impressionante ed attacca sempre per primo.", - }, - ancientPower: { - name: "Forzantica", - effect: "Colpisce il nemico con una forza primordiale. Può aumentare tutte le statistiche.", - }, - shadowBall: { - name: "Palla Ombra", - effect: "Lancia sul nemico una sfera nera. Può anche ridurne la Difesa Speciale.", - }, - futureSight: { - name: "Divinazione", - effect: "Due turni dopo l'utilizzo di questa mossa, il nemico viene attaccato con energia psichica.", - }, - rockSmash: { - name: "Spaccaroccia", - effect: "Il nemico viene colpito da un pugno in grado di frantumare anche la roccia. Può anche ridurne la Difesa.", - }, - whirlpool: { - name: "Mulinello", - effect: "Intrappola il nemico in un turbine d'acqua che dura per quattro o cinque turni infliggendogli dei danni ogni turno.", - }, - beatUp: { - name: "Picchiaduro", - effect: "Chi la usa chiama in aiuto i Pokémon della squadra: più ce ne sono, maggiore è il numero di attacchi.", - }, - fakeOut: { - name: "Bruciapelo", - effect: "Mossa che fa agire per primo e fa tentennare il nemico. Funziona solo appena sceso in campo.", - }, - uproar: { - name: "Baraonda", - effect: "Chi la usa attacca per tre turni con un frastuono che non fa dormire nessuno.", - }, - stockpile: { - name: "Accumulo", - effect: "Chi la usa accumula energia aumentando la Difesa e la Difesa Speciale. Si può utilizzare tre volte.", - }, - spitUp: { - name: "Sfoghenergia", - effect: "Tutta l'energia accumulata in precedenza con Accumulo è rilasciata nell'attacco. Maggiore è l'energia, più danni si arrecano.", - }, - swallow: { - name: "Introenergia", - effect: "Chi la usa assorbe l'energia raccolta con la mossa Accumulo e recupera PS. Maggiore è l'energia, più PS si recuperano.", - }, - heatWave: { - name: "Ondacalda", - effect: "Chi la usa investe i nemici con una folata di vento caldo. Può anche scottare.", - }, - hail: { - name: "Grandine", - effect: "Chi la usa causa una grandinata che dura cinque turni. Danneggia tutti i Pokémon tranne quelli di tipo Ghiaccio.", - }, - torment: { - name: "Attaccalite", - effect: "Chi la usa tormenta e fa infuriare il nemico, impedendogli di usare la stessa mossa due volte di seguito.", - }, - flatter: { - name: "Adulazione", - effect: "Adula il bersaglio e lo confonde, ma ne aumenta l'Attacco Speciale.", - }, - willOWisp: { - name: "Fuocofatuo", - effect: "Fiamme intense di colore viola causano una scottatura al nemico.", - }, - memento: { - name: "Memento", - effect: "Chi la usa va KO. Tuttavia, riduce di molto l'Attacco e l'Attacco Speciale del nemico.", - }, - facade: { - name: "Facciata", - effect: "Mossa d'attacco che raddoppia la potenza se chi la usa è scottato, avvelenato o paralizzato.", - }, - focusPunch: { - name: "Centripugno", - effect: "Chi la usa prende la mira prima di sferrare un pugno. Fallirà se verrà colpito prima di eseguire la mossa.", - }, - smellingSalts: { - name: "Maniereforti", - effect: "Infligge un danno doppio ad un bersaglio paralizzato, ma ne cura anche la paralisi.", - }, - followMe: { - name: "Sonoqui", - effect: "Chi la usa attrae l'attenzione su di sé, costringendo i nemici a sceglierlo sempre come bersaglio.", - }, - naturePower: { - name: "Naturforza", - effect: "Mossa che fa uso della forza della natura. Il suo effetto varia in base all'ambiente.", - }, - charge: { - name: "Sottocarica", - effect: "Potenzia la mossa di tipo Elettro usata subito dopo. Aumenta anche la Difesa Speciale di chi la usa.", - }, - taunt: { - name: "Provocazione", - effect: "Provoca il nemico, inducendolo ad usare solo mosse d'attacco per tre turni.", - }, - helpingHand: { - name: "Altruismo", - effect: "Mossa che aumenta la potenza dell'attacco di un alleato.", - }, - trick: { - name: "Raggiro", - effect: "Chi la usa coglie il bersaglio in contropiede e l'obbliga a cambiare il suo strumento con il proprio.", - }, - rolePlay: { - name: "Giocodiruolo", - effect: "Chi la usa mima in tutto il bersaglio, copiandone l'abilità.", - }, - wish: { - name: "Desiderio", - effect: "Permette di recuperare metà dei PS massimi al turno successivo.", - }, - assist: { - name: "Assistente", - effect: "Chi la usa utilizza in fretta e a caso una delle mosse degli altri Pokémon della squadra.", - }, - ingrain: { - name: "Radicamento", - effect: "Chi la usa mette delle radici che gli fanno recuperare PS a ogni turno. Non può essere sostituito.", - }, - superpower: { - name: "Troppoforte", - effect: "Chi la usa attacca il nemico con grande forza, ma il suo Attacco e la sua Difesa diminuiscono.", - }, - magicCoat: { - name: "Magivelo", - effect: "Una barriera rimanda al mittente l'effetto di mosse come Parassiseme e di mosse che influenzano lo stato.", - }, - recycle: { - name: "Riciclo", - effect: "Chi la usa ricicla uno strumento tenuto, già usato nella lotta, e lo può riutilizzare.", - }, - revenge: { - name: "Vendetta", - effect: "Mossa d'attacco che infligge un danno doppio se si è stati colpiti dal nemico nello stesso turno.", - }, - brickBreak: { - name: "Breccia", - effect: "Colpisce il nemico con una mano e rompe barriere come Riflesso e Schermoluce.", - }, - yawn: { - name: "Sbadiglio", - effect: "Chi la usa fa un grande sbadiglio che addormenta il nemico al turno seguente.", - }, - knockOff: { - name: "Privazione", - effect: "Attacco che blocca anche lo strumento tenuto dal nemico, impedendone l'uso nella lotta.", - }, - endeavor: { - name: "Rimonta", - effect: "Attacco che riduce i PS del nemico a una quantità pari ai PS di chi la usa.", - }, - eruption: { - name: "Eruzione", - effect: "Attacco impetuoso ed esplosivo la cui potenza è proporzionale ai PS di chi lo usa.", - }, - skillSwap: { - name: "Baratto", - effect: "Chi la usa sfrutta le sue facoltà mentali per scambiare l'abilità con il bersaglio.", - }, - imprison: { - name: "Esclusiva", - effect: "Chi la usa impedisce al nemico di usare mosse che conoscono entrambi.", - }, - refresh: { - name: "Rinfrescata", - effect: "Chi la usa riposa per curarsi da avvelenamento, paralisi e scottatura.", - }, - grudge: { - name: "Rancore", - effect: "Se chi la usa va KO, i PP della mossa nemica che lo ha messo fuori gioco si azzerano.", - }, - snatch: { - name: "Scippo", - effect: "Chi la usa ruba e utilizza la mossa curativa o modifica-statistiche che il bersaglio stava per usare.", - }, - secretPower: { - name: "Forzasegreta", - effect: "Attacco che può avere un effetto aggiuntivo a seconda del luogo in cui si trova chi lo usa.", - }, - dive: { - name: "Sub", - effect: "Chi la usa si tuffa in acqua per emergere e attaccare al turno seguente. Fuori dalla lotta permette di immergersi sott'acqua.", - }, - armThrust: { - name: "Sberletese", - effect: "Raffica di ceffoni che colpisce da due a cinque volte di fila.", - }, - camouflage: { - name: "Camuffamento", - effect: "Modifica il tipo di chi la usa a seconda del luogo, ad esempio sull'acqua, nell'erba o in una grotta.", - }, - tailGlow: { - name: "Codadiluce", - effect: "Chi la usa fissa una luce forte per concentrarsi e aumentare moltissimo l'Attacco Speciale.", - }, - lusterPurge: { - name: "Abbagliante", - effect: "Chi la usa scatena un'esplosione abbagliante che può anche ridurre la Difesa Speciale del Pokémon colpito.", - }, - mistBall: { - name: "Foschisfera", - effect: "Una sfera coperta di nebbia danneggia il nemico. Può anche ridurre l'Attacco Speciale.", - }, - featherDance: { - name: "Danzadipiume", - effect: "Chi la usa copre il nemico con un manto di piume che riduce di molto il suo Attacco.", - }, - teeterDance: { - name: "Strampadanza", - effect: "Chi la usa esegue una danza goffa che confonde tutti i Pokémon attorno.", - }, - blazeKick: { - name: "Calciardente", - effect: "Chi la usa tira un calcio. Probabile brutto colpo. Può anche causare una scottatura.", - }, - mudSport: { - name: "Fangata", - effect: "Chi la usa si ricopre di fango indebolendo le mosse di tipo Elettro finché resta in campo.", - }, - iceBall: { - name: "Palla Gelo", - effect: "Chi la usa attacca il nemico rotolando per cinque turni, con aumento progressivo della potenza ogni volta che va a segno.", - }, - needleArm: { - name: "Pugnospine", - effect: "Chi la usa attacca colpendo il bersaglio con i suoi arti pieni di spine. Può far tentennare il Pokémon colpito.", - }, - slackOff: { - name: "Pigro", - effect: "Chi la usa si rilassa recuperando metà dei propri PS massimi.", - }, - hyperVoice: { - name: "Granvoce", - effect: "Chi la usa lancia un urlo straziante che danneggia i nemici.", - }, - poisonFang: { - name: "Velenodenti", - effect: "Chi la usa morde il nemico con denti avvelenati che possono anche iperavvelenarlo.", - }, - crushClaw: { - name: "Tritartigli", - effect: "Colpisce il nemico con artigli robusti e affilati che possono ridurne la Difesa.", - }, - blastBurn: { - name: "Incendio", - effect: "Potente esplosione che danneggia il nemico, ma fa saltare il turno successivo a chi la provoca.", - }, - hydroCannon: { - name: "Idrocannone", - effect: "Colpisce il nemico con un potente getto d'acqua. Chi la usa salta il turno successivo.", - }, - meteorMash: { - name: "Meteorpugno", - effect: "Colpisce il nemico con un pugno veloce come una meteora. Può far pure salire l'Attacco di chi la usa.", - }, - astonish: { - name: "Sgomento", - effect: "Chi la usa attacca il bersaglio emettendo un verso terrificante. Può anche farlo tentennare.", - }, - weatherBall: { - name: "Palla Clima", - effect: "Mossa d'attacco che varia tipo e forza in base alle condizioni atmosferiche.", - }, - aromatherapy: { - name: "Aromaterapia", - effect: "Chi la usa rilascia un dolce profumo che cura tutti problemi di stato propri e degli alleati.", - }, - fakeTears: { - name: "Falselacrime", - effect: "Chi la usa inscena un pianto teatrale per commuovere il nemico. Ne riduce di molto la Difesa Speciale.", - }, - airCutter: { - name: "Aerasoio", - effect: "Chi la usa provoca un vento tagliente che sferza i nemici. Probabile brutto colpo.", - }, - overheat: { - name: "Vampata", - effect: "Chi la usa sferra un potente attacco, ma il contraccolpo riduce di molto il suo Attacco Speciale.", - }, - odorSleuth: { - name: "Segugio", - effect: "Chi la usa rende i Pokémon di tipo Spettro vulnerabili a qualsiasi tipo di mossa e può, inoltre, colpire i nemici sfuggenti.", - }, - rockTomb: { - name: "Rocciotomba", - effect: "Colpisce il nemico con rocce. Inoltre, lo rallenta riducendone la Velocità.", - }, - silverWind: { - name: "Ventargenteo", - effect: "Attacca con un forte vento di polvere di squame. Tutte le statistiche di chi la usa possono salire.", - }, - metalSound: { - name: "Ferrostrido", - effect: "Orribile stridio, simile a quello prodotto dal metallo, che riduce di molto la Difesa Speciale del nemico.", - }, - grassWhistle: { - name: "Meloderba", - effect: "Una dolce melodia culla il bersaglio e lo costringe ad addormentarsi.", - }, - tickle: { - name: "Solletico", - effect: "Chi la usa solletica il nemico e lo fa ridere, riducendo il suo Attacco e la sua Difesa.", - }, - cosmicPower: { - name: "Cosmoforza", - effect: "Chi la usa assorbe una forza mistica dallo spazio che aumenta la Difesa e la Difesa Speciale.", - }, - waterSpout: { - name: "Zampillo", - effect: "Lancia un getto d'acqua contro il nemico che ha davanti e quelli adiacenti. La potenza è proporzionale al numero di PS di chi la usa.", - }, - signalBeam: { - name: "Segnoraggio", - effect: "Chi la usa attacca con uno strano raggio di luce che può anche confondere il Pokémon colpito.", - }, - shadowPunch: { - name: "Pugnodombra", - effect: "Il nemico riceve un pugno proveniente dalle tenebre. Questa mossa è infallibile.", - }, - extrasensory: { - name: "Extrasenso", - effect: "Chi la usa attacca con una misteriosa forza invisibile. Può far tentennare il nemico.", - }, - skyUppercut: { - name: "Stramontante", - effect: "Chi la usa attacca il nemico con un montante che può arrivare fino in cielo.", - }, - sandTomb: { - name: "Sabbiotomba", - effect: "Chi la usa intrappola il nemico in un turbine di sabbia per quattro o cinque turni.", - }, - sheerCold: { - name: "Purogelo", - effect: "Ondata di freddo penetrante che, se va a segno, fa andare KO il nemico.", - }, - muddyWater: { - name: "Fanghiglia", - effect: "Chi la usa attacca con un getto di fango che può anche ridurre la precisione dei nemici.", - }, - bulletSeed: { - name: "Semitraglia", - effect: "Chi la usa spara da due a cinque raffiche di semi contro il bersaglio in successione.", - }, - aerialAce: { - name: "Aeroassalto", - effect: "Chi la usa attacca il nemico a grande velocità. Questa mossa è infallibile.", - }, - icicleSpear: { - name: "Gelolancia", - effect: "Chi la usa spara ghiaccioli affilati contro il nemico da due a cinque volte di fila.", - }, - ironDefense: { - name: "Ferroscudo", - effect: "Il corpo di chi la usa si indurisce come il ferro, facendone salire di molto la Difesa.", - }, - block: { - name: "Blocco", - effect: "Chi la usa sbarra la strada al nemico impedendone la fuga o la sostituzione.", - }, - howl: { - name: "Gridodilotta", - effect: "Chi la usa emette un verso molto forte per darsi coraggio e aumentare l'Attacco.", - }, - dragonClaw: { - name: "Dragartigli", - effect: "Chi la usa attacca con artigli affilati che graffiano il nemico rapidamente e con grande forza.", - }, - frenzyPlant: { - name: "Radicalbero", - effect: "Un groviglio di radici colpisce il nemico. Chi la usa salta il turno successivo.", - }, - bulkUp: { - name: "Granfisico", - effect: "Chi la usa tende i muscoli per gonfiare il corpo, aumentando Difesa e Attacco.", - }, - bounce: { - name: "Rimbalzo", - effect: "Chi la usa balza in alto e ricade sul nemico dopo un turno. Può anche paralizzare.", - }, - mudShot: { - name: "Colpodifango", - effect: "Chi la usa attacca lanciando fango sul nemico. Riduce anche la Velocità.", - }, - poisonTail: { - name: "Velenocoda", - effect: "Chi la usa colpisce con la coda e può avvelenare il nemico. Probabile brutto colpo.", - }, - covet: { - name: "Supplica", - effect: "Chi la usa attacca il bersaglio sorridendo e gli ruba lo strumento che tiene.", - }, - voltTackle: { - name: "Locomovolt", - effect: "Chi la usa si carica di elettricità e poi attacca. Può paralizzare il nemico. Il contraccolpo causa seri danni.", - }, - magicalLeaf: { - name: "Fogliamagica", - effect: "Chi la usa sparpaglia strane foglie che inseguono il bersaglio. Questa mossa è infallibile.", - }, - waterSport: { - name: "Docciascudo", - effect: "Chi la usa s'impregna d'acqua indebolendo le mosse di tipo Fuoco finché resta in campo.", - }, - calmMind: { - name: "Calmamente", - effect: "Chi la usa, meditando, placa il proprio spirito per aumentare l'Attacco Speciale e la Difesa Speciale.", - }, - leafBlade: { - name: "Fendifoglia", - effect: "Colpisce il nemico usando una foglia affilata come una spada. Probabile brutto colpo.", - }, - dragonDance: { - name: "Dragodanza", - effect: "Danza mistica e vigorosa che aumenta l'Attacco e la Velocità di chi la usa.", - }, - rockBlast: { - name: "Cadutamassi", - effect: "Colpisce il nemico con dei massi pesanti lanciati in rapida successione. Il numero di massi varia da due a cinque.", - }, - shockWave: { - name: "Ondashock", - effect: "Chi la usa colpisce il nemico con una scossa di elettricità. È impossibile eludere questa mossa.", - }, - waterPulse: { - name: "Idropulsar", - effect: "Il nemico viene colpito da un getto d'acqua potentissimo che può anche confonderlo.", - }, - doomDesire: { - name: "Desiderio Fatale", - effect: "Intensa luce solare che colpisce il nemico dopo due turni dall'uso della mossa.", - }, - psychoBoost: { - name: "Psicoslancio", - effect: "Chi la usa sferra un potente attacco, ma il contraccolpo riduce di molto il suo Attacco Speciale.", - }, - roost: { - name: "Trespolo", - effect: "Chi la usa sta fermo e riposa, recuperando metà dei propri PS massimi.", - }, - gravity: { - name: "Gravità", - effect: "Intensifica la gravità per cinque turni. Le mosse che fanno volare e Levitazione sono inutilizzabili.", - }, - miracleEye: { - name: "Miracolvista", - effect: "Chi la usa rende i Pokémon di tipo Buio vulnerabili a qualsiasi tipo di mossa e può, inoltre, colpire i nemici sfuggenti.", - }, - wakeUpSlap: { - name: "Svegliopacca", - effect: "Un attacco che infligge doppi danni se il nemico è Addormentato. Inoltre, lo sveglierà dal sonno.", - }, - hammerArm: { - name: "Martelpugno", - effect: "Chi la usa colpisce il nemico con il suo pugno forte e pesante, ma perde Velocità.", - }, - gyroBall: { - name: "Vortexpalla", - effect: "Chi la usa colpisce il nemico con un vortice rapidissimo. Più lento è chi la usa, maggiore è il danno.", - }, - healingWish: { - name: "Curardore", - effect: "Chi la usa va KO, ma il Pokémon che lo sostituisce recupera tutti i PS e risolve i problemi di stato.", - }, - brine: { - name: "Acquadisale", - effect: "Se i PS del nemico sono scesi a metà o meno, questa mossa colpirà con il doppio della potenza.", - }, - naturalGift: { - name: "Dononaturale", - effect: "Chi la usa trae forza dalla Bacca che tiene. Da questa dipendono il tipo e la forza dell'attacco.", - }, - feint: { - name: "Fintoattacco", - effect: "Un attacco che colpisce un nemico che ha usato Protezione od Individua. Ne rimuoverà inoltre gli effetti.", - }, - pluck: { - name: "Spennata", - effect: "Chi la usa becca il bersaglio. Inoltre, se questi tiene una Bacca, gliela ruba e ne sfrutta gli effetti.", - }, - tailwind: { - name: "Ventoincoda", - effect: "Chi la usa crea turbolente raffiche di vento che aumentano la sua Velocità e quella di tutti i Pokémon della squadra.", - }, - acupressure: { - name: "Acupressione", - effect: "Chi la usa esercita pressione su alcuni punti nevralgici e aumenta di molto una statistica a caso.", - }, - metalBurst: { - name: "Metalscoppio", - effect: "Chi la usa si vendica sul nemico che l'ha appena ferito con una mossa anche più potente.", - }, - uTurn: { - name: "Retromarcia", - effect: "Dopo aver selezionato questo attacco, chi la usa colpisce il nemico per poi essere sostituito con un altro Pokémon della squadra.", - }, - closeCombat: { - name: "Zuffa", - effect: "Chi la usa attacca abbassando la guardia. La propria Difesa e la Difesa Speciale si riducono.", - }, - payback: { - name: "Rivincita", - effect: "Chi la usa accumula forza, poi attacca. La potenza raddoppia se agisce dopo il Pokémon nemico.", - }, - assurance: { - name: "Garanzia", - effect: "Se il nemico ha già subito dei danni nello stesso turno, la potenza di questa mossa raddoppia.", - }, - embargo: { - name: "Divieto", - effect: "Impedisce al nemico di usare lo strumento che tiene e al suo Allenatore di usarne altri sul Pokémon.", - }, - fling: { - name: "Lancio", - effect: "Chi la usa lancia sul nemico lo strumento che tiene. La forza e l'effetto dipendono dallo strumento.", - }, - psychoShift: { - name: "Psicotrasfer", - effect: "Con la forza psichica e la suggestione, chi la usa può trasferire i suoi problemi di stato al Pokémon colpito.", - }, - trumpCard: { - name: "Asso", - effect: "Minori PP rimangono a questa mossa, e maggiori danni apporterà al nemico.", - }, - healBlock: { - name: "Anticura", - effect: "Chi la usa impedisce al nemico di utilizzare mosse o abilità recupera-PS per cinque turni.", - }, - wringOut: { - name: "Strizzata", - effect: "Chi la usa stritola con forza il nemico. Più PS ha il nemico, maggiore è la potenza della mossa.", - }, - powerTrick: { - name: "Ingannoforza", - effect: "Mossa psichica che permette a chi la usa di scambiare i valori delle sue statistiche di Attacco e Difesa.", - }, - gastroAcid: { - name: "Gastroacido", - effect: "Chi la usa lancia acidi gastrici sul nemico. Il fluido annulla l'abilità del nemico.", - }, - luckyChant: { - name: "Fortuncanto", - effect: "Chi la usa rivolge un incantesimo al cielo, impedendo al nemico di sferrare brutti colpi alla squadra.", - }, - meFirst: { - name: "Precedenza", - effect: "Se chi la usa è più veloce del nemico, gli ruba la mossa e gliela ritorce contro con potenza persino maggiore.", - }, - copycat: { - name: "Copione", - effect: "Chi la usa imita l'ultima mossa usata dal nemico. La mossa fallisce se questo non ha selezionato alcuna mossa.", - }, - powerSwap: { - name: "Barattoforza", - effect: "Chi la usa sfrutta la sua forza psichica per scambiare le modifiche ad Attacco e Attacco Speciale con il bersaglio.", - }, - guardSwap: { - name: "Barattoscudo", - effect: "Chi la usa sfrutta la sua forza psichica per scambiare le modifiche a Difesa e a Difesa Speciale con il bersaglio.", - }, - punishment: { - name: "Punizione", - effect: "Questa mossa diventa più potente ogni volta che il nemico aumenta le proprie statistiche.", - }, - lastResort: { - name: "Ultimascelta", - effect: "Per usare questa mossa, bisogna prima avvalersi in lotta di tutte le altre mosse conosciute.", - }, - worrySeed: { - name: "Affannoseme", - effect: "Un seme che causa ansia viene piantato sul bersaglio. Ne muta l'abilità in Insonnia e ne previene o rimuove il sonno.", - }, - suckerPunch: { - name: "Sbigoattacco", - effect: "Chi la usa può attaccare per primo. Fallisce se il nemico non sta preparando un attacco.", - }, - toxicSpikes: { - name: "Fielepunte", - effect: "Chi la usa piazza ai piedi del nemico delle punte avvelenate. Avvelena ogni nemico che entra in lotta.", - }, - heartSwap: { - name: "Cuorbaratto", - effect: "Chi la usa sfrutta la sua forza psichica per scambiare le modifiche alle statistiche con il bersaglio.", - }, - aquaRing: { - name: "Acquanello", - effect: "Chi la usa si avvolge in un velo d'acqua. Recupera alcuni PS ad ogni turno.", - }, - magnetRise: { - name: "Magnetascesa", - effect: "Chi la usa si solleva in aria per cinque turni grazie a un campo elettromagnetico.", - }, - flareBlitz: { - name: "Fuococarica", - effect: "Chi la usa si ricopre di fuoco e carica il bersaglio, ma subisce il contraccolpo. Può anche scottare.", - }, - forcePalm: { - name: "Palmoforza", - effect: "Chi la usa attacca con un'onda d'urto che può anche paralizzare il bersaglio.", - }, - auraSphere: { - name: "Sferapulsar", - effect: "Chi la usa rilascia una forza eterea dal profondo del corpo. La mossa è infallibile.", - }, - rockPolish: { - name: "Lucidatura", - effect: "Chi la usa leviga il proprio corpo per ridurne l'attrito. Aumenta di molto la Velocità.", - }, - poisonJab: { - name: "Velenpuntura", - effect: "Il nemico viene colpito con un tentacolo od un braccio intriso di veleno. Può anche avvelenarlo.", - }, - darkPulse: { - name: "Neropulsar", - effect: "Chi la usa emana un'aura impregnata di oscuri pensieri. Può anche far tentennare il Pokémon colpito.", - }, - nightSlash: { - name: "Nottesferza", - effect: "Chi la usa colpisce il nemico appena si presenta l'occasione. Probabile brutto colpo.", - }, - aquaTail: { - name: "Idrondata", - effect: "Chi la usa attacca agitando la coda come se fosse una violenta ondata in una tempesta furiosa.", - }, - seedBomb: { - name: "Semebomba", - effect: "Chi la usa emette una raffica di semi dal guscio duro che colpiscono il bersaglio dall'alto.", - }, - airSlash: { - name: "Eterelama", - effect: "Chi la usa attacca con un vento tagliente che squarcia il cielo. Può anche far tentennare il Pokémon colpito.", - }, - xScissor: { - name: "Forbice X", - effect: "Chi la usa colpisce il nemico usando le sue falci o artigli come se fossero un paio di forbici.", - }, - bugBuzz: { - name: "Ronzio", - effect: "Chi la usa muove le ali per creare un suono che danneggia il nemico. Può anche ridurne la Difesa Speciale.", - }, - dragonPulse: { - name: "Dragopulsar", - effect: "Chi la usa attacca un'onda d'urto generata spalancando la bocca.", - }, - dragonRush: { - name: "Dragofuria", - effect: "Chi la usa attacca con fare minaccioso e in questo modo può anche far tentennare il nemico.", - }, - powerGem: { - name: "Gemmoforza", - effect: "Chi la usa attacca con un raggio di luce che brilla come se fosse fatto di pietre preziose.", - }, - drainPunch: { - name: "Assorbipugno", - effect: "Pugno che assorbe energia. Fa recuperare una quantità di PS pari alla metà del danno inferto.", - }, - vacuumWave: { - name: "Vuotonda", - effect: "Chi la usa rotea i pugni per lanciare un'onda di vuoto assoluto verso il nemico. Attacca per primo.", - }, - focusBlast: { - name: "Focalcolpo", - effect: "Chi la usa incrementa la sua concentrazione mentale per scatenare il suo potere. Può ridurre la Difesa Speciale del nemico.", - }, - energyBall: { - name: "Energipalla", - effect: "Chi la usa attinge energia dalla natura e la scaglia contro il bersaglio. Può anche ridurne la Difesa Speciale.", - }, - braveBird: { - name: "Baldeali", - effect: "Chi la usa si nasconde sotto le ali e carica da bassa quota. Tuttavia, subisce considerevoli danni.", - }, - earthPower: { - name: "Geoforza", - effect: "Dal terreno sotto il nemico si sprigiona una forza devastante. Può anche ridurne la Difesa Speciale.", - }, - switcheroo: { - name: "Rapidscambio", - effect: "Chi la usa scambia in maniera fulminea il proprio oggetto con quello del nemico.", - }, - gigaImpact: { - name: "Gigaimpatto", - effect: "Chi la usa carica il nemico usando tutta la sua forza, ma al turno successivo deve riposare.", - }, - nastyPlot: { - name: "Congiura", - effect: "Chi la usa stimola il cervello pensando a cose cattive. Aumenta di molto l'Attacco Speciale.", - }, - bulletPunch: { - name: "Pugnoscarica", - effect: "Chi la usa attacca con una scarica di pugni veloci come proiettili. Con questa mossa si colpisce per primi.", - }, - avalanche: { - name: "Slavina", - effect: "Un attacco che infligge doppi danni se l'utilizzatore ha subito un attacco nello stesso turno.", - }, - iceShard: { - name: "Geloscheggia", - effect: "Chi la usa crea dei pezzi di ghiaccio e li lancia. Con questa mossa si colpisce per primi.", - }, - shadowClaw: { - name: "Ombrartigli", - effect: "Chi la usa attacca con artigli d'ombra che colpiscono con gran forza. Probabile brutto colpo.", - }, - thunderFang: { - name: "Fulmindenti", - effect: "Chi la usa morde con denti elettrificati che possono anche paralizzare o far tentennare il nemico.", - }, - iceFang: { - name: "Gelodenti", - effect: "Chi la usa morde il nemico con denti di ghiaccio. Può causare congelamento e tentennamento.", - }, - fireFang: { - name: "Rogodenti", - effect: "Chi la usa morde il nemico con denti infuocati. Può causare scottatura e tentennamento.", - }, - shadowSneak: { - name: "Furtivombra", - effect: "Chi la usa estende la sua ombra e attacca il nemico alle spalle. Con questa mossa si colpisce per primi.", - }, - mudBomb: { - name: "Pantanobomba", - effect: "Chi la usa lancia dure palle di fango sul nemico. Può anche ridurne la Precisione.", - }, - psychoCut: { - name: "Psicotaglio", - effect: "Chi la usa colpisce il nemico con lame fatte di forza psichica. Probabile brutto colpo.", - }, - zenHeadbutt: { - name: "Cozzata Zen", - effect: "Chi la usa concentra la forza nella testa e si lancia contro il nemico. Può anche farlo tentennare.", - }, - mirrorShot: { - name: "Cristalcolpo", - effect: "Chi la usa colpisce il nemico lanciando fasci d'energia dal suo corpo. Può ridurne la precisione.", - }, - flashCannon: { - name: "Cannonflash", - effect: "Chi la usa attacca raccogliendo e rilasciando energia luminosa. Può ridurre la Difesa Speciale del nemico.", - }, - rockClimb: { - name: "Scalaroccia", - effect: "Chi la usa carica con impeto incredibile. Il colpo può confondere il nemico.", - }, - defog: { - name: "Scacciabruma", - effect: "Chi la usa spazza via barriere come Riflesso e Schermoluce con un forte vento e riduce la capacità d'elusione del nemico.", - }, - trickRoom: { - name: "Distortozona", - effect: "Chi la usa crea una dimensione in cui i Pokémon più lenti si muovono per primi per cinque turni.", - }, - dracoMeteor: { - name: "Dragobolide", - effect: "Attacca con meteore che cadono dal cielo. Il contraccolpo fa calare di molto l'Attacco Speciale di chi la usa.", - }, - discharge: { - name: "Scarica", - effect: "Chi la usa colpisce i Pokémon che ha intorno con un bagliore elettrico. Può anche causare paralisi.", - }, - lavaPlume: { - name: "Lavasbuffo", - effect: "Chi la usa lancia fiamme scarlatte sugli altri Pokémon in campo. Può anche scottare.", - }, - leafStorm: { - name: "Verdebufera", - effect: "Si forma una tempesta di foglie affilate. Il contraccolpo riduce di molto l'Attacco Speciale di chi la usa.", - }, - powerWhip: { - name: "Vigorcolpo", - effect: "Chi la usa agita violentemente liane o tentacoli per sferzare il bersaglio.", - }, - rockWrecker: { - name: "Devastomasso", - effect: "Chi la usa attacca il nemico con un enorme masso, ma si deve riposare al turno successivo.", - }, - crossPoison: { - name: "Velenocroce", - effect: "Attacco con zanne avvelenate che può anche avvelenare il Pokémon colpito. Probabile brutto colpo.", - }, - gunkShot: { - name: "Sporcolancio", - effect: "Chi la usa attacca il nemico con rifiuti sudici che possono anche avvelenarlo.", - }, - ironHead: { - name: "Metaltestata", - effect: "Chi la usa colpisce il nemico con la sua testa dura come l'acciaio. Può anche farlo tentennare.", - }, - magnetBomb: { - name: "Bombagnete", - effect: "Chi la usa lancia bombe d'acciaio che si attaccano al nemico. Una mossa infallibile.", - }, - stoneEdge: { - name: "Pietrataglio", - effect: "Chi la usa colpisce il nemico dal basso con pietre affilate. Probabile brutto colpo.", - }, - captivate: { - name: "Incanto", - effect: "Se il nemico è del sesso opposto di chi la usa, sarà ammaliato e il suo Attacco Speciale diminuirà di molto.", - }, - stealthRock: { - name: "Levitoroccia", - effect: "Chi la usa piazza una trappola di rocce sospese che danneggia i nemici che entrano in lotta.", - }, - grassKnot: { - name: "Laccioerboso", - effect: "Chi la usa intrappola il bersaglio con l'erba e lo fa cadere. Danneggia maggiormente i Pokémon più pesanti.", - }, - chatter: { - name: "Schiamazzo", - effect: "Chi la usa attacca creando un'onda sonora con le parole imparate. Può anche confondere il nemico.", - }, - judgment: { - name: "Giudizio", - effect: "Chi la usa rilascia numerosi colpi di luce. Il tipo varia a seconda della Lastra tenuta.", - }, - bugBite: { - name: "Coleomorso", - effect: "Chi la usa morde il nemico. Inoltre, se questi tiene una Bacca, gliela ruba e ne sfrutta gli effetti.", - }, - chargeBeam: { - name: "Raggioscossa", - effect: "Chi la usa lancia un fascio di elettricità molto intensa. Può anche aumentare il suo Attacco Speciale.", - }, - woodHammer: { - name: "Mazzuolegno", - effect: "Chi la usa si lancia con tutto il corpo contro il bersaglio, ma subisce anche considerevoli danni.", - }, - aquaJet: { - name: "Acquagetto", - effect: "Chi la usa colpisce sempre per primo e a una tale velocità da rendersi quasi invisibile.", - }, - attackOrder: { - name: "Comandourto", - effect: "Chi la usa raduna i suoi sgherri per colpire il nemico. Probabile brutto colpo.", - }, - defendOrder: { - name: "Comandoscudo", - effect: "Chi la usa raduna i suoi sgherri per creare uno scudo, aumentando Difesa e Difesa Speciale.", - }, - healOrder: { - name: "Comandocura", - effect: "Chi la usa raduna i propri sgherri per farsi curare. Recupera metà dei PS massimi.", - }, - headSmash: { - name: "Zuccata", - effect: "Chi la usa attacca con tutta la potenza di cui dispone, ma subisce danni considerevoli.", - }, - doubleHit: { - name: "Doppiosmash", - effect: "Chi la usa colpisce il nemico con la coda due volte di fila.", - }, - roarOfTime: { - name: "Fragortempo", - effect: "Chi la usa colpisce il nemico con una forza capace di alterare il tempo, ma deve stare fermo il turno dopo.", - }, - spacialRend: { - name: "Fendispazio", - effect: "Chi la usa lacera il nemico e lo spazio che lo circonda. Probabile brutto colpo.", - }, - lunarDance: { - name: "Lunardanza", - effect: "Chi la usa va KO. Il Pokémon che lo sostituisce risolve i propri problemi di stato e recupera PS e PP.", - }, - crushGrip: { - name: "Sbriciolmano", - effect: "Colpisce il nemico con grande forza. Più PS ha il nemico, maggiore è la potenza della mossa.", - }, - magmaStorm: { - name: "Magmaclisma", - effect: "Intrappola il nemico in un turbine di fuoco che dura per quattro o cinque turni.", - }, - darkVoid: { - name: "Vuototetro", - effect: "Trascina i nemici in un mondo di totale oscurità e li fa addormentare.", - }, - seedFlare: { - name: "Infuriaseme", - effect: "Chi la usa genera un'onda d'urto dal suo corpo. Può anche ridurre di molto la Difesa Speciale del bersaglio.", - }, - ominousWind: { - name: "Funestovento", - effect: "Chi la usa crea una raffica di vento ripugnante. Può aumentare tutte le statistiche di chi la usa.", - }, - shadowForce: { - name: "Oscurotuffo", - effect: "Chi la usa sparisce e poi colpisce il nemico al turno successivo. Evita pure Protezione o Individua.", - }, - honeClaws: { - name: "Unghiaguzze", - effect: "Chi la usa affila i propri artigli, aumentando Attacco e precisione.", - }, - wideGuard: { - name: "Bodyguard", - effect: "Chi la usa para tutti i colpi diretti alla intera squadra per un turno. Se usata in successione può fallire.", - }, - guardSplit: { - name: "Paridifesa", - effect: "Chi la usa sfrutta la sua forza psichica per sommare Difesa e Difesa Speciale a quelle del bersaglio e dividerle equamente.", - }, - powerSplit: { - name: "Pariattacco", - effect: "Chi la usa sfrutta la sua forza psichica per sommare Attacco e Attacco Speciale a quelli del bersaglio e dividerli equamente.", - }, - wonderRoom: { - name: "Mirabilzona", - effect: "Chi la usa crea una dimensione in cui Difesa e Difesa Speciale di tutti i Pokémon vengono scambiate per cinque turni.", - }, - psyshock: { - name: "Psicoshock", - effect: "Chi la usa attacca il bersaglio facendo materializzare un misterioso raggio psichico che provoca danni fisici.", - }, - venoshock: { - name: "Velenoshock", - effect: "Lancia uno speciale liquido tossico sul bersaglio. Se questi è avvelenato, il danno provocato raddoppia.", - }, - autotomize: { - name: "Sganciapesi", - effect: "Chi la usa si libera di tutti i pesi in eccesso, alleggerendosi e aumentando di molto la propria Velocità.", - }, - ragePowder: { - name: "Polverabbia", - effect: "Chi la usa attira l'attenzione dei nemici cospargendosi di una polvere irritante e diventando bersaglio di tutti gli attacchi.", - }, - telekinesis: { - name: "Telecinesi", - effect: "Chi la usa fa fluttuare in aria il bersaglio, rendendolo facile da colpire per tre turni.", - }, - magicRoom: { - name: "Magicozona", - effect: "Chi la usa crea una dimensione in cui l'effetto degli strumenti tenuti da tutti i Pokémon è annullato per cinque turni.", - }, - smackDown: { - name: "Abbattimento", - effect: "Chi la usa lancia una pietra o un proiettile. Può colpire anche un bersaglio in volo e farlo cadere.", - }, - stormThrow: { - name: "Tempestretta", - effect: "Chi la usa sferra un colpo micidiale al bersaglio, stritolandolo. Brutto colpo assicurato.", - }, - flameBurst: { - name: "Pirolancio", - effect: "Chi la usa emana una fiammata che colpisce il bersaglio e si propaga fino a raggiungere i Pokémon accanto.", - }, - sludgeWave: { - name: "Fangonda", - effect: "Lancia un'onda di fango che attacca tutti i Pokémon nelle vicinanze. Può anche avvelenare.", - }, - quiverDance: { - name: "Eledanza", - effect: "Danza leggiadra ed elegante che aumenta l'Attacco Speciale, la Difesa Speciale e la Velocità di chi la usa.", - }, - heavySlam: { - name: "Pesobomba", - effect: "Chi la usa si lancia contro il bersaglio con tutto il proprio peso. Più è pesante rispetto ad esso e più danni causa.", - }, - synchronoise: { - name: "Sincrumore", - effect: "Chi la usa infligge danni a tutti i Pokémon del suo stesso tipo che ha vicino usando misteriose onde elettromagnetiche.", - }, - electroBall: { - name: "Energisfera", - effect: "Chi la usa attacca con una sfera d'energia elettrica. Più è rapido rispetto al bersaglio e più danni arreca.", - }, - soak: { - name: "Inondazione", - effect: "Chi la usa proietta un lungo getto d'acqua contro il bersaglio e lo rende un Pokémon di tipo Acqua.", - }, - flameCharge: { - name: "Nitrocarica", - effect: "Chi la usa si copre di fuoco e attacca il bersaglio. Concentrandosi aumenta, inoltre, la propria Velocità.", - }, - coil: { - name: "Arrotola", - effect: "Chi la usa si concentra, aumentando Attacco, Difesa e precisione.", - }, - lowSweep: { - name: "Calciobasso", - effect: "Chi la usa colpisce con un attacco fulmineo la parte inferiore del corpo del bersaglio, riducendone la Velocità.", - }, - acidSpray: { - name: "Acidobomba", - effect: "Chi la usa attacca il bersaglio con un acido altamente corrosivo. Il fluido riduce di molto la Difesa Speciale del bersaglio.", - }, - foulPlay: { - name: "Ripicca", - effect: "Chi la usa sfrutta la forza del bersaglio. Il danno inflitto è proporzionale all'Attacco dell'avversario.", - }, - simpleBeam: { - name: "Ondisinvolta", - effect: "Chi la usa emette un misterioso raggio psichico che trasforma l'abilità del Pokémon colpito in Disinvoltura.", - }, - entrainment: { - name: "Saltamicizia", - effect: "Chi la usa saltella con un buffo ritmo, invitando il bersaglio a imitarlo e rendendo la sua abilità identica alla propria.", - }, - afterYou: { - name: "Cortesia", - effect: "Chi la usa aiuta un bersaglio più lento permettendogli di agire subito dopo.", - }, - round: { - name: "Coro", - effect: "Attacca il bersaglio con una melodia. Se usata ripetutamente da uno o più Pokémon i danni inflitti aumentano.", - }, - echoedVoice: { - name: "Echeggiavoce", - effect: "Attacca il bersaglio con la propria voce echeggiante. Se usata a ripetizione da uno o più Pokémon il danno aumenta.", - }, - chipAway: { - name: "Insidia", - effect: "Chi la usa attacca non appena il bersaglio abbassa la guardia. Il danno inflitto prescinde dalle modifiche alle statistiche.", - }, - clearSmog: { - name: "Pulifumo", - effect: "Attacca il bersaglio lanciandogli contro una nuvola di fumo speciale, che annulla ogni modifica alle statistiche.", - }, - storedPower: { - name: "Veicolaforza", - effect: "Attacca il bersaglio con l'energia accumulata. Più sono state aumentate le statistiche, maggiore è il danno inflitto.", - }, - quickGuard: { - name: "Anticipo", - effect: "Chi la usa protegge tutta la squadra dalle mosse dei nemici che fanno colpire per primi. Se usata in successione può fallire.", - }, - allySwitch: { - name: "Cambiaposto", - effect: "Chi la usa si teletrasporta al posto di un compagno in campo, grazie ad un misterioso potere.", - }, - scald: { - name: "Idrovampata", - effect: "Chi la usa attacca il bersaglio con un getto d'acqua bollente che può anche scottarlo.", - }, - shellSmash: { - name: "Gettaguscio", - effect: "Chi la usa si disfa del guscio. Difesa e Dif. Sp. calano, ma aumentano di molto Attacco, Att. Sp. e Velocità.", - }, - healPulse: { - name: "Curapulsar", - effect: "Chi la usa lancia un'onda rilassante che fa recuperare al bersaglio metà dei suoi PS massimi.", - }, - hex: { - name: "Sciagura", - effect: "Attacco che causa un danno enorme se il bersaglio ha problemi di stato.", - }, - skyDrop: { - name: "Cadutalibera", - effect: "Porta il bersaglio in cielo e lo scaglia a terra al turno successivo. Il bersaglio catturato non può muoversi.", - }, - shiftGear: { - name: "Cambiomarcia", - effect: "Facendo ruotare gli ingranaggi, chi la usa aumenta non solo il proprio Attacco, ma anche di molto la propria Velocità.", - }, - circleThrow: { - name: "Ribaltiro", - effect: "Il bersaglio è scaraventato via ed è costretto a lasciare il posto a un altro. Se è selvatico, la lotta finisce.", - }, - incinerate: { - name: "Bruciatutto", - effect: "Attacca il nemico con una fiammata. Se il nemico ha una Bacca, viene divorata dalle fiamme.", - }, - quash: { - name: "Spintone", - effect: "Chi la usa trattiene il bersaglio, costringendolo ad agire per ultimo.", - }, - acrobatics: { - name: "Acrobazia", - effect: "Attacca rapidamente il bersaglio. Se chi la usa non ha uno strumento, infligge al nemico grossi danni.", - }, - reflectType: { - name: "Riflettipo", - effect: "Chi la usa cambia il proprio tipo in quello del bersaglio.", - }, - retaliate: { - name: "Nemesi", - effect: "Vendica un compagno messo KO. Se ciò è accaduto al turno precedente, il danno è maggiore.", - }, - finalGambit: { - name: "Azzardo", - effect: "Chi la usa attacca con tutta la potenza di cui dispone e va KO, ma infligge al bersaglio un danno pari ai PS che ha perso.", - }, - bestow: { - name: "Cediregalo", - effect: "Chi la usa consegna il proprio strumento al bersaglio se ne è sprovvisto.", - }, - inferno: { - name: "Marchiatura", - effect: "Il bersaglio viene avvolto da intense fiammate che causano scottature.", - }, - waterPledge: { - name: "Acquapatto", - effect: "Attacca il nemico con una colonna d'acqua. Se usata con Fiammapatto, aumentano gli effetti e un arcobaleno appare in cielo.", - }, - firePledge: { - name: "Fiammapatto", - effect: "Attacca il nemico con una colonna di fuoco. Se usata con Erbapatto, aumentano gli effetti e il campo diventa un mare di fuoco.", - }, - grassPledge: { - name: "Erbapatto", - effect: "Attacca il bersaglio con una colonna d'erba. Se usata con Acquapatto, gli effetti aumentano e il campo diventa una palude.", - }, - voltSwitch: { - name: "Invertivolt", - effect: "Chi usa questa mossa fa marcia indietro per farsi sostituire dopo aver sferrato l'attacco.", - }, - struggleBug: { - name: "Entomoblocco", - effect: "Colpisce i nemici opponendo resistenza e riducendo il loro Attacco Speciale.", - }, - bulldoze: { - name: "Battiterra", - effect: "Chi la usa calpesta il terreno e scatena un terremoto che danneggia tutti i Pokémon nei paraggi e ne riduce anche la Velocità.", - }, - frostBreath: { - name: "Alitogelido", - effect: "Chi la usa attacca il bersaglio con un soffio d'aria gelida. Brutto colpo assicurato.", - }, - dragonTail: { - name: "Codadrago", - effect: "Chi la usa fa volar via il bersaglio in modo che venga sostituito. Se il bersaglio è un Pokémon selvatico, la lotta finisce.", - }, - workUp: { - name: "Cuordileone", - effect: "Chi la usa si tira su di morale, aumentando il proprio Attacco e l'Attacco Speciale.", - }, - electroweb: { - name: "Elettrotela", - effect: "Chi la usa attacca i nemici catturandoli con una ragnatela elettrica e riducendone la Velocità.", - }, - wildCharge: { - name: "Sprizzalampo", - effect: "Chi la usa si carica di elettricità per poi scagliarsi sul bersaglio, ma subisce dei danni per il contraccolpo.", - }, - drillRun: { - name: "Giravvita", - effect: "Chi la usa si scaglia sul bersaglio ruotando su se stesso come un trapano perforante. Probabile brutto colpo.", - }, - dualChop: { - name: "Doppiocolpo", - effect: "Chi la usa attacca due volte il bersaglio con dei colpi estremamente forti.", - }, - heartStamp: { - name: "Cuorestampo", - effect: "Chi la usa distrae il nemico con un faccino innocente per poi sferrargli un colpo devastante che può farlo tentennare.", - }, - hornLeech: { - name: "Legnicorno", - effect: "Chi la usa infilza il bersaglio con le corna e assorbe una quantità di PS pari a metà del danno inferto.", - }, - sacredSword: { - name: "Spadasolenne", - effect: "Chi la usa taglia il nemico con una spada magica. Il danno inflitto ignora le modifiche alle statistiche del bersaglio.", - }, - razorShell: { - name: "Conchilama", - effect: "Chi la usa colpisce il bersaglio con il suo guscio affilato. Il colpo può anche ridurre la Difesa del bersaglio.", - }, - heatCrash: { - name: "Marchiafuoco", - effect: "Chi la usa carica con il suo corpo rovente. Più è pesante rispetto al bersaglio e più danni causa.", - }, - leafTornado: { - name: "Vorticerba", - effect: "Chi la usa avvolge e attacca il bersaglio con foglie affilate che possono anche ridurne la precisione.", - }, - steamroller: { - name: "Rulloduro", - effect: "Chi la usa ruota su se stesso ad alta velocità e schiaccia il bersaglio. Può anche farlo tentennare.", - }, - cottonGuard: { - name: "Cotonscudo", - effect: "Chi la usa avvolge il proprio corpo con del cotone molto morbido, proteggendosi e aumentando moltissimo la propria Difesa.", - }, - nightDaze: { - name: "Urtoscuro", - effect: "Chi la usa attacca il bersaglio con un'onda d'urto oscura che può ridurne la precisione.", - }, - psystrike: { - name: "Psicobotta", - effect: "Chi la usa attacca il bersaglio facendo materializzare un misterioso raggio psichico che provoca danni fisici.", - }, - tailSlap: { - name: "Spazzasberla", - effect: "Chi la usa colpisce il bersaglio con la sua coda dura da due a cinque volte di fila.", - }, - hurricane: { - name: "Tifone", - effect: "Chi la usa attacca il bersaglio avvolgendolo con un vento fortissimo. Può anche confonderlo.", - }, - headCharge: { - name: "Ricciolata", - effect: "Chi la usa carica il bersaglio con la sua testa in stile afro, ma subisce un po' di danni per il contraccolpo.", - }, - gearGrind: { - name: "Ingracolpo", - effect: "Chi la usa colpisce il bersaglio due volte di fila lanciandogli contro dei dischi d'acciaio.", - }, - searingShot: { - name: "Sparafuoco", - effect: "Chi la usa lancia fiamme scarlatte sui Pokémon intorno a sé. Può anche scottare.", - }, - technoBlast: { - name: "Tecnobotto", - effect: "Chi la usa rilascia un colpo di luce contro il bersaglio. Il tipo varia a seconda del modulo che ha.", - }, - relicSong: { - name: "Cantoantico", - effect: "Chi la usa attacca i nemici intonando un'antica melodia che colpisce il loro spirito. Può anche farli addormentare.", - }, - secretSword: { - name: "Spadamistica", - effect: "Chi la usa attacca il bersaglio tagliandolo con una spada mistica. La misteriosa energia sprigionata provoca danni fisici.", - }, - glaciate: { - name: "Gelamondo", - effect: "Chi la usa attacca i nemici con una folata d'aria gelida e ne riduce anche la Velocità.", - }, - boltStrike: { - name: "Lucesiluro", - effect: "Colpisce il bersaglio con una possente carica elettrica e può anche paralizzarlo.", - }, - blueFlare: { - name: "Fuocoblu", - effect: "Chi la usa attacca il bersaglio avvolgendolo con magnifiche e intense fiamme blu che possono anche scottarlo.", - }, - fieryDance: { - name: "Voldifuoco", - effect: "Chi la usa avvolge il bersaglio tra le fiamme. Può anche aumentare l'Attacco Speciale.", - }, - freezeShock: { - name: "Elettrogelo", - effect: "Chi la usa lancia contro il nemico al turno successivo una sfera di ghiaccio ricoperta di elettricità. Può anche paralizzarlo.", - }, - iceBurn: { - name: "Vampagelida", - effect: "Chi la usa attacca il bersaglio al turno successivo e lo avvolge in un soffio d'aria congelata. Può anche scottarlo.", - }, - snarl: { - name: "Urlorabbia", - effect: "Chi la usa si mette a urlare per un po', riducendo l'Attacco Speciale dei nemici.", - }, - icicleCrash: { - name: "Scagliagelo", - effect: "Chi la usa attacca violentemente il nemico con grosse stalattiti di ghiaccio che possono anche farlo tentennare.", - }, - vCreate: { - name: "Generatore V", - effect: "Chi la usa carica emettendo fiamme ardenti dalla fronte, a costo di una riduzione di Difesa, Difesa Speciale e Velocità.", - }, - fusionFlare: { - name: "Incrofiamma", - effect: "Chi la usa lancia una fiammata enorme. Se usata in combinazione con Incrotuono, il danno provocato dalla mossa aumenta.", - }, - fusionBolt: { - name: "Incrotuono", - effect: "Chi la usa lancia un fulmine enorme. Se usata in combinazione con Incrofiamma, il danno provocato dalla mossa aumenta.", - }, - flyingPress: { - name: "Schiacciatuffo", - effect: "Chi la usa si tuffa sul bersaglio dall'alto. È una mossa di tipo Lotta e Volante allo stesso tempo.", - }, - matBlock: { - name: "Ribaltappeto", - effect: "Chi la usa protegge se stesso e i propri alleati dai danni di mosse nemiche, adoperando un tappetino come scudo. Non è efficace contro mosse di stato.", - }, - belch: { - name: "Rutto", - effect: "Chi la usa attacca il bersaglio con un rutto potente. Per utilizzare questa mossa, il Pokémon deve mangiare la bacca che possiede.", - }, - rototiller: { - name: "Aracampo", - effect: "Chi la usa dissoda la terra per far crescere meglio l'erba. Questa mossa aumenta l'attacco e l'attacco speciale dei Pokémon di tipo Erba.", - }, - stickyWeb: { - name: "Rete Vischiosa", - effect: "Chi la usa intreccia una rete appiccicosa attorno alla squadra avversaria, diminuendo la Velocità dei Pokémon nemici che entreranno in campo.", - }, - fellStinger: { - name: "Pungiglione", - effect: "L'Attacco di chi la usa aumenta notevolmente se grazie alla mossa il bersaglio va KO.", - }, - phantomForce: { - name: "Spettrotuffo", - effect: "Chi la usa scompare improvvisamente per attaccare poi nel turno seguente. Questa mossa neutralizza le difese del bersaglio.", - }, - trickOrTreat: { - name: "Halloween", - effect: "Il bersaglio viene invitato a festeggiare Halloween e aggiunge così al proprio tipo anche il tipo Spettro.", - }, - nobleRoar: { - name: "Urlo", - effect: "Chi la usa emette un urlo potente che intimidisce il bersaglio, riducendone l'Attacco e l'Attacco Speciale.", - }, - ionDeluge: { - name: "Pioggiaplasma", - effect: "Chi la usa disperde delle particelle elettrizzate che trasformano le mosse di tipo Normale in mosse di tipo Elettro.", - }, - parabolicCharge: { - name: "Caricaparabola", - effect: "Chi la usa attacca tutto ciò che lo circonda e recupera PS pari alla metà del danno inflitto.", - }, - forestsCurse: { - name: "Boscomalocchio", - effect: "Il Pokémon invoca la maledizione del bosco sul bersaglio, che acquisisce così anche il tipo Erba.", - }, - petalBlizzard: { - name: "Fiortempesta", - effect: "Infligge danni ai Pokémon che ha intorno attaccandoli con una tempesta di fiori.", - }, - freezeDry: { - name: "Liofilizzazione", - effect: "Chi la usa raffredda rapidamente il bersaglio. Può anche congelarlo. Questa mossa è superefficace contro i Pokémon Acqua.", - }, - disarmingVoice: { - name: "Incantavoce", - effect: "Chi la usa infligge un danno spirituale ai nemici nei paraggi con una voce suadente. L'attacco andrà immancabilmente a segno.", - }, - partingShot: { - name: "Monito", - effect: "Nessuna descrizione disponibile.", - }, - topsyTurvy: { - name: "Sottosopra", - effect: "Inverte tutte le modifiche alle statistiche del Pokémon bersaglio.", - }, - drainingKiss: { - name: "Assorbibacio", - effect: "Un bacio fatato che assorbe le energie al nemico.", - }, - craftyShield: { - name: "Truccodifesa", - effect: "Chi la usa protegge se stesso e i suoi alleati usando un potere misterioso. Non blocca le mosse che infliggono danno.", - }, - flowerShield: { - name: "Fiordifesa", - effect: "Grazie a un misterioso potere, aumenta la Difesa di tutti i Pokémon di tipo Erba presenti in campo.", - }, - grassyTerrain: { - name: "Campo Erboso", - effect: "Per cinque turni trasforma il terreno di lotta in un campo erboso, facendo recuperare PS ai Pokémon a terra in ogni turno.", - }, - mistyTerrain: { - name: "Campo Nebbioso", - effect: "Per cinque turni trasforma il terreno di lotta in un campo nebbioso, impedendo ai Pokémon a terra di essere colpiti da problemi di stato.", - }, - electrify: { - name: "Elettrocontagio", - effect: "Se si contagia il bersaglio prima che usi la sua mossa, per quel turno le sue mosse saranno di tipo Elettro.", - }, - playRough: { - name: "Carineria", - effect: "Chi la usa attacca il bersaglio con delle carinerie. Può anche ridurne l'attacco.", - }, - fairyWind: { - name: "Vento di Fata", - effect: "Attacca con un forte vento fatato.", - }, - moonblast: { - name: "Forza Lunare", - effect: "Accumula la forza proveniente dalla luna e la libera sul nemico. Può ridurre l'Attacco Speciale.", - }, - boomburst: { - name: "Ondaboato", - effect: "Colpisce i Pokémon che ha intorno con la forza di un boato distruttivo.", - }, - fairyLock: { - name: "Blocco Fatato", - effect: "Bloccando il campo di battaglia, chi la usa impedisce a tutti i Pokémon di fuggire durante il prossimo turno.", - }, - kingsShield: { - name: "Scudo Reale", - effect: "L'utilizzatore assume una posizione difensiva mentre si difende. Riduce inoltre l'Attacco di ogni utilizzatore di mosse da contatto.", - }, - playNice: { - name: "Simpatia", - effect: "Chi la usa diventa amico del bersaglio, rabbonendolo e riducendone così l'Attacco.", - }, - confide: { - name: "Confidenza", - effect: "Chi la usa svela dei segreti al bersaglio, distraendolo e riducendone l'Attacco Speciale.", - }, - diamondStorm: { - name: "Diamantempesta", - effect: "Colpisce i nemici che ha intorno con una tempesta di diamanti. Può anche aumentare la Difesa di chi la usa.", - }, - steamEruption: { - name: "Vaporscoppio", - effect: "Travolge il bersaglio con un'ondata di vapore rovente che può anche scottarlo.", - }, - hyperspaceHole: { - name: "Forodimensionale", - effect: "Chi la usa, sfrutta un passaggio interdimensionale per comparire a fianco del bersaglio e colpirlo, eludendo mosse come Protezione e Individua.", - }, - waterShuriken: { - name: "Acqualame", - effect: "Chi la usa attacca sempre per primo, colpendo il bersaglio con uno shuriken di muco da due a cinque volte di fila.", - }, - mysticalFire: { - name: "Magifiamma", - effect: "Colpisce il bersaglio soffiandogli contro delle fiammate incredibilmente roventi, riducendone l'Attacco Speciale.", - }, - spikyShield: { - name: "Agodifesa", - effect: "Protegge dagli attacchi, riducendo inoltre i PS dei Pokémon che entrano in contatto con chi la usa.", - }, - aromaticMist: { - name: "Nebularoma", - effect: "Aumenta la Difesa Speciale di un alleato tramite un misterioso aroma.", - }, - eerieImpulse: { - name: "Elettromistero", - effect: "Il corpo dell'utilizzatore genera un impulso misterioso. Esponendovi il bersaglio, ne riduce di molto l'Attacco Speciale.", - }, - venomDrench: { - name: "Velenotrappola", - effect: "Emette un liquido particolare che riduce l'Attacco, l'Attacco Speciale e la Velocità dei nemici avvelenati intorno a chi la usa.", - }, - powder: { - name: "Pulviscoppio", - effect: "Il bersaglio viene coperto da un pulviscolo che esplode danneggiandolo se questi utilizza una mossa di tipo Fuoco nello stesso turno.", - }, - geomancy: { - name: "Geocontrollo", - effect: "Un'energia pura forza della natura si sprigiona per tutto il campo.", - }, - magneticFlux: { - name: "Controllo Polare", - effect: "Tramite il controllo dei campi magnetici, aumenta la Difesa e la Difesa Speciale dei Pokémon alleati dotati dell'abilità Più o Meno.", - }, - happyHour: { - name: "Cuccagna", - effect: "Questa mossa raddoppia la ricompensa ricevuta dopo aver vinto una lotta.", - }, - electricTerrain: { - name: "Campo Elettrico", - effect: "Per cinque turni trasforma il terreno di lotta in un campo elettrico, impedendo ai Pokémon a terra di addormentarsi.", - }, - dazzlingGleam: { - name: "Magibrillio", - effect: "Emette una luce potentissima che infligge danni al bersaglio.", - }, - celebrate: { - name: "Auguri", - effect: "Il Pokémon ti fa gli auguri nel tuo giorno speciale", - }, - holdHands: { - name: "Mano nella mano", - effect: "Il Pokémon che la usa e un alleato si prendono per mano e fanno salti di gioia.", - }, - babyDollEyes: { - name: "Occhioni Teneri", - effect: "Chi la usa rivolge i propri occhioni languidi al bersaglio, riducendone l'Attacco. Colpisce sempre per primo.", - }, - nuzzle: { - name: "Elettrococcola", - effect: "Nonostante il tenero nome è una mossa piuttosto pericolosa.", - }, - holdBack: { - name: "Riguardo", - effect: "Chi la usa attacca il bersaglio, modulando il colpo in modo da lasciargli almeno un PS.", - }, - infestation: { - name: "Assillo", - effect: "Chi la usa lancia un attacco che tormenta il bersaglio per quattro o cinque turni, durante i quali gli impedisce di fuggire.", - }, - powerUpPunch: { - name: "Crescipugno", - effect: "Rende i pugni più duri a ogni colpo inferto. Se i pugni vanno a segno, aumenta l'Attacco.", - }, - oblivionWing: { - name: "Ali del Fato", - effect: "Chi la usa assorbe energia dal bersaglio recuperando una quantità di PS pari a più della metà del danno inferto.", - }, - thousandArrows: { - name: "Mille Frecce", - effect: "Colpisce anche i Pokémon che fluttuano in aria. I nemici nei paraggi vengono scaraventati a terra.", - }, - thousandWaves: { - name: "Mille Onde", - effect: "Un’onda strisciante investe i nemici intorno impedendo loro di fuggire.", - }, - landsWrath: { - name: "Forza Tellurica", - effect: "Chi la usa raccoglie energia tellurica e ne concentra il potere sui nemici che ha intorno danneggiandoli.", - }, - lightOfRuin: { - name: "Luce Nefasta", - effect: "Traendo potere dal Fiore Eterno, chi lo utilizza spara un potente raggio di luce. Ciò danneggia parecchio anche chi la usa.", - }, - originPulse: { - name: "Primopulsar", - effect: "Attacca i nemici intorno colpendoli con miriadi di raggi di luce blu.", - }, - precipiceBlades: { - name: "Spade Telluriche", - effect: "Attacca i nemici intorno trasformando la potenza della terra in lame affilate.", - }, - dragonAscent: { - name: "Ascesa del Drago", - effect: "Permette di proiettarsi in aria e fiondarsi sul bersaglio attaccando ad altissima velocità. Riduce la Difesa e la Difesa Speciale di chi la usa.", - }, - hyperspaceFury: { - name: "Urtodimensionale", - effect: "Permette di attaccare ripetutamente grazie ai molti arti, ignorando mosse come Protezione o Individua. Riduce la Difesa di chi la usa.", - }, - breakneckBlitzPhysical: { - name: "Carica Travolgente", - effect: "Grazie al Potere Z, chi la usa accumula energia e si lancia a tutta forza contro il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - breakneckBlitzSpecial: { - name: "Carica Travolgente", - effect: "Dati Mancanti", - }, - allOutPummelingPhysical: { - name: "Iperscarica Furiosa", - effect: "Chi la usa scaglia sul bersaglio una scarica di colpi carichi di Potere Z. La potenza varia a seconda della mossa su cui si basa.", - }, - allOutPummelingSpecial: { - name: "Iperscarica Furiosa", - effect: "Dati Mancanti", - }, - supersonicSkystrikePhysical: { - name: "Picchiata Devastante", - effect: "Chi la usa si serve del Potere Z per alzarsi in volo e attaccare il bersaglio piombandogli addosso. La potenza varia a seconda della mossa su cui si basa.", - }, - supersonicSkystrikeSpecial: { - name: "Picchiata Devastante", - effect: "Dati Mancanti", - }, - acidDownpourPhysical: { - name: "Acidiluvio Corrosivo", - effect: "Chi la usa sfrutta il Potere Z per creare una palude velenosa che sommerge il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - acidDownpourSpecial: { - name: "Acidiluvio Corrosivo", - effect: "Dati Mancanti", - }, - tectonicRagePhysical: { - name: "Furore della Terra", - effect: "Grazie al Potere Z, chi la usa si tuffa nelle viscere della terra e colpisce con violenza il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - tectonicRageSpecial: { - name: "Furore della Terra", - effect: "Dati Mancanti", - }, - continentalCrushPhysical: { - name: "Gigamacigno Polverizzante", - effect: "Grazie al Potere Z, chi la usa crea un masso enorme e lo lancia sul bersaglio schiacciandolo. La potenza varia a seconda della mossa su cui si basa.", - }, - continentalCrushSpecial: { - name: "Gigamacigno Polverizzante", - effect: "Dati Mancanti", - }, - savageSpinOutPhysical: { - name: "Bozzolo Fatale", - effect: "Chi la usa sfrutta il potere Z per creare dei filamenti che intrappolano il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - savageSpinOutSpecial: { - name: "Bozzolo Fatale", - effect: "Dati Mancanti", - }, - neverEndingNightmarePhysical: { - name: "Abbraccio Spettrale", - effect: "Grazie al Potere Z, chi la usa intrappola il bersaglio in una morsa generata dal proprio rancore. La potenza varia a seconda della mossa su cui si basa.", - }, - neverEndingNightmareSpecial: { - name: "Abbraccio Spettrale", - effect: "Dati Mancanti", - }, - corkscrewCrashPhysical: { - name: "Spirale Perforante", - effect: "Grazie al Potere Z, chi la usa vortica su se stesso e si scaglia sul bersaglio con tutte le sue forze. La potenza varia a seconda della mossa su cui si basa", - }, - corkscrewCrashSpecial: { - name: "Spirale Perforante", - effect: "Dati Mancanti", - }, - infernoOverdrivePhysical: { - name: "Fiammobomba Detonante", - effect: "Chi la usa sfrutta il Potere Z per emettere fiamme incandescenti che inceneriscono il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - infernoOverdriveSpecial: { - name: "Fiammobomba Detonante", - effect: "Dati Mancanti", - }, - hydroVortexPhysical: { - name: "Idrovortice Abissale", - effect: "Grazie al Potere Z, chi la usa crea un enorme vortice che inghiotte il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - hydroVortexSpecial: { - name: "Idrovortice Abissale", - effect: "Dati Mancanti", - }, - bloomDoomPhysical: { - name: "Floriscoppio Sfolgorante", - effect: "Grazie al Potere Z, chi la usa concentra l'energia delle piante per scatenare un potente attacco. La potenza varia a seconda della mossa su cui si basa.", - }, - bloomDoomSpecial: { - name: "Floriscoppio Sfolgorante", - effect: "Dati Mancanti", - }, - gigavoltHavocPhysical: { - name: "Gigascarica Folgorante", - effect: "Grazie al Potere Z, chi la usa genera una fortissima scarica elettrica che colpisce il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - gigavoltHavocSpecial: { - name: "Gigascarica Folgorante", - effect: "Dati Mancanti", - }, - shatteredPsychePhysical: { - name: "Impatto Psicocinetico", - effect: "Chi la usa si serve del Potere Z per manipolare la mente del bersaglio causando ingenti danni. La potenza varia a seconda della mossa su cui si basa.", - }, - shatteredPsycheSpecial: { - name: "Impatto Psicocinetico", - effect: "Dati Mancanti", - }, - subzeroSlammerPhysical: { - name: "Criodistruzione Polare", - effect: "Chi la usa sfrutta il Potere Z per far calare di colpo la temperatura e congelare il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - subzeroSlammerSpecial: { - name: "Criodistruzione Polare", - effect: "Dati Mancanti", - }, - devastatingDrakePhysical: { - name: "Dragoschianto Finale", - effect: "Grazie al Potere Z, chi la usa materializza la propria aura per colpire con forza il nemico. La potenza varia a seconda della mossa su cui si basa.", - }, - devastatingDrakeSpecial: { - name: "Dragoschianto Finale", - effect: "Dati Mancanti", - }, - blackHoleEclipsePhysical: { - name: "Buco Nero del Non Ritorno", - effect: "Chi la usa si serve del Potere Z per concentrare energia negativa con cui inghiotte il bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - blackHoleEclipseSpecial: { - name: "Buco Nero del Non Ritorno", - effect: "Dati Mancanti", - }, - twinkleTacklePhysical: { - name: "Astroimpatto Fatato", - effect: "Grazie al Potere Z, chi la usa crea una dimensione fatata in cui fa ciò che vuole del proprio bersaglio. La potenza varia a seconda della mossa su cui si basa.", - }, - twinkleTackleSpecial: { - name: "Astroimpatto Fatato", - effect: "Dati Mancanti", - }, - catastropika: { - name: "Super Pikaboom", - effect: "Grazie al Potere Z, Pikachu accumula un'enorme quantità di energia elettrica e si lancia contro il bersaglio a tutta forza.", - }, - shoreUp: { - name: "Sabbiaccumulo", - effect: "Chi la usa recupera metà dei propri PS massimi. Durante le tempeste di sabbia ne recupera di più.", - }, - firstImpression: { - name: "Schermaglia", - effect: "È una mossa molto potente, ma funziona solo appena scesi in campo.", - }, - banefulBunker: { - name: "Fortino", - effect: "L'utilizzatore si protegge e se l'avversario attacca con una mossa da contatto viene avvelenato.", - }, - spiritShackle: { - name: "Cucitura d'Ombra", - effect: "Chi la usa attacca il bersaglio e fissa la sua ombra a terra impedendogli di fuggire.", - }, - darkestLariat: { - name: "Braccioteso", - effect: "Chi la usa attacca il bersaglio mulinando gli arti. Il danno inflitto ignora le modifiche alle statistiche del bersaglio.", - }, - sparklingAria: { - name: "Canto Effimero", - effect: "Chi la usa si mette a cantare emettendo tanti palloncini d’acqua. I Pokémon che subiscono danni da questa mossa guariscono dalle scottature.", - }, - iceHammer: { - name: "Martelgelo", - effect: "Infligge danni al bersaglio colpendolo con un pugno molto potente. Riduce la velocità di chi la usa.", - }, - floralHealing: { - name: "Cura Floreale", - effect: "Fa recuperare metà dei PS massimi al bersaglio. È più efficace quando il terreno di lotta è nello stato di Campo Erboso.", - }, - highHorsepower: { - name: "Forza Equina", - effect: "Il Pokémon travolge il bersaglio con un attacco possente.", - }, - strengthSap: { - name: "Assorbiforza", - effect: "Fa recuperare una quantità di PS pari all'Attacco del bersaglio, che vedrà diminuire questa statistica.", - }, - solarBlade: { - name: "Lama Solare", - effect: "Il Pokémon assorbe la luce al primo turno per poi condensarla in una lama e attaccare al turno successivo.", - }, - leafage: { - name: "Fogliame", - effect: "Attacca il bersaglio con delle foglie.", - }, - spotlight: { - name: "Riflettore", - effect: "Nessuna descrizione disponibile.", - }, - toxicThread: { - name: "Velenotela", - effect: "Avvelena il bersaglio avvolgendolo con filamenti tossici e ne riduce la Velocità.", - }, - laserFocus: { - name: "Concentrazione", - effect: "Chi la usa si concentra e nel turno successivo metterà sicuramente a segno un brutto colpo.", - }, - gearUp: { - name: "Marciainpiù", - effect: "Dà una marcia in più agli alleati con le abilità Meno o Più aumentandone l’Attacco e l’Attacco Speciale.", - }, - throatChop: { - name: "Colpo Infernale", - effect: "Chi viene colpito da questa mossa prova un dolore lancinante e non può più usare mosse basate sul suono per due turni.", - }, - pollenPuff: { - name: "Sferapolline", - effect: "Chi la usa attacca il nemico con una sfera esplosiva. Se colpisce degli alleati, fa recuperare loro dei PS.", - }, - anchorShot: { - name: "Colpo d'Ancora", - effect: "Chi la usa colpisce il nemico con un'ancora e lo intrappola nella catena impedendogli di fuggire.", - }, - psychicTerrain: { - name: "Campo Psichico", - effect: "Per cinque turni il terreno entra nello stato di Campo Psichico: i Pokémon a terra non subiscono mosse ad alta priorità e la potenza delle mosse di tipo Psico aumenta.", - }, - lunge: { - name: "Assalto", - effect: "Chi la usa si lancia con tutte le sue forze sul bersaglio e ne riduce l'Attacco.", - }, - fireLash: { - name: "Frusta di Fuoco", - effect: "Colpisce il bersaglio con una frusta infuocata e ne riduce la Difesa.", - }, - powerTrip: { - name: "Tracotanza", - effect: "Chi la usa attacca il bersaglio sfoggiando la propria forza. Più le sue statistiche sono state aumentate, più la mossa è potente.", - }, - burnUp: { - name: "Ultima Fiamma", - effect: "Chi la usa attacca sfruttando tutta la sua potenza incendiaria per infliggere gravi danni al bersaglio, ma come conseguenza perde il tipo Fuoco.", - }, - speedSwap: { - name: "Velociscambio", - effect: "Chi la usa scambia la propria Velocità con quella del bersaglio.", - }, - smartStrike: { - name: "Sottilcorno", - effect: "Chi la usa colpisce il bersaglio con un corno appuntito. Questa mossa va sempre a segno.", - }, - purify: { - name: "Purificazione", - effect: "Il bersaglio della mossa viene curato dalle alterazioni di stato inoltre l'utilizzatore ripristina i propri PS se la mossa va a segno.", - }, - revelationDance: { - name: "Mutadanza", - effect: "Chi la usa si lancia in una danza e attacca il nemico con tutte le sue forze. Il tipo della mossa corrisponde al tipo del Pokémon che la usa.", - }, - coreEnforcer: { - name: "Nucleocastigo", - effect: "Il bersaglio subisce dei danni e, se ha già agito nel turno, perde la sua abilità.", - }, - tropKick: { - name: "Tropicalcio", - effect: "Chi la usa colpisce il bersaglio con un potente calcio sfruttando una tecnica originaria dei paesi tropicali e ne riduce l'Attacco.", - }, - instruct: { - name: "Imposizione", - effect: "Nessuna descrizione disponibile.", - }, - beakBlast: { - name: "Cannonbecco", - effect: "Chi la usa arroventa il proprio becco e poi attacca. Se un Pokémon lo colpisce con un attacco diretto mentre sta accumulando calore, resta scottato.", - }, - clangingScales: { - name: "Clamorsquame", - effect: "Chi la usa attacca il bersaglio con un suono fortissimo che genera sfregando le scaglie del corpo. Dopo aver attaccato, la sua Difesa diminuisce.", - }, - dragonHammer: { - name: "Marteldrago", - effect: "Chi la usa infligge danni al bersaglio usando il proprio corpo come se fosse un martello.", - }, - brutalSwing: { - name: "Vorticolpo", - effect: "Chi la usa infligge danni intorno a sé facendo ruotare una parte del suo corpo.", - }, - auroraVeil: { - name: "Velaurora", - effect: "Questa mossa riduce i danni provocati dalle mosse fisiche e speciali per 5 turni. Può essere usata solo mentre grandina.", - }, - sinisterArrowRaid: { - name: "Dardoassalto Spettrale", - effect: "Grazie al Potere Z, Decidueye crea una formazione di frecce che colpisce il bersaglio a gran velocità.", - }, - maliciousMoonsault: { - name: "Iperschianto delle Tenebre", - effect: "Grazie al Potere Z, Incineroar richiama tutta la sua forza e si lancia impetuosamente sul bersaglio.", - }, - oceanicOperetta: { - name: "Sinfonia del Mare", - effect: "Grazie al Potere Z, Primarina concentra un’enorme quantità d’acqua e attacca il bersaglio con una potenza smisurata.", - }, - guardianOfAlola: { - name: "Collera del Guardiano", - effect: "Grazie al Potere Z, il Nume Locale evoca l’energia di Alola e attacca con grande potenza, facendo perdere al bersaglio la maggior parte dei suoi PS.", - }, - soulStealing7StarStrike: { - name: "Colpo Eptastellare Rubanima", - effect: "Grazie al Potere Z, Marshadow fa appello a tutte le sue forze e colpisce il bersaglio con una scarica di calci e pugni potentissimi.", - }, - stokedSparksurfer: { - name: "Elettrosurf Folgorante", - effect: "Grazie al Potere Z, il Raichu di Alola attacca con tutta la sua potenza e paralizza il bersaglio.", - }, - pulverizingPancake: { - name: "Adesso Faccio sul Serio", - effect: "Grazie al Potere Z, Snorlax tira fuori la grinta e, muovendo energicamente il suo enorme corpo, attacca il bersaglio con tutta la sua forza.", - }, - extremeEvoboost: { - name: "Potenziamento Eevolutivo", - effect: "Grazie al Potere Z, Eevee evoca a sé tutta l’energia delle sue possibili evoluzioni e aumenta di molto le sue statistiche", - }, - genesisSupernova: { - name: "Supernova delle Origini", - effect: "Grazie al Potere Z, Mew attacca il bersaglio con tutta la sua forza e genera un Campo Psichico a terra.", - }, - shellTrap: { - name: "Gusciotrappola", - effect: "Il guscio del Pokémon diventa una trappola. Se un nemico lo colpisce con una mossa fisica, innesca un'esplosione e subisce dei danni.", - }, - fleurCannon: { - name: "Cannonfiore", - effect: "Colpisce il bersaglio con un potente raggio, ma riduce di molto l'Attacco Speciale di chi la usa.", - }, - psychicFangs: { - name: "Psicozanna", - effect: "L'utilizzatore morde il bersaglio, rompendo barriere come Schermoluce e Riflesso.", - }, - stompingTantrum: { - name: "Battipiedi", - effect: "Chi la usa attacca battendo i piedi per la rabbia. Se la mossa usata al turno precedente non è andata a segno, la potenza raddoppia.", - }, - shadowBone: { - name: "Ossotetro", - effect: "Chi la usa colpisce il bersaglio con un osso in cui alberga uno spirito. Può anche ridurne la Difesa.", - }, - accelerock: { - name: "Rocciarapida", - effect: "Chi la usa attacca il bersaglio colpendolo a tutta velocità. Questa mossa ha priorità alta.", - }, - liquidation: { - name: "Idrobreccia", - effect: "Chi la usa colpisce il bersaglio con la forza dell'acqua. Può anche ridurne la Difesa.", - }, - prismaticLaser: { - name: "Prismalaser", - effect: "Chi la usa proietta dei potenti raggi di luce grazie alla potenza del suo prisma, ma non può agire nel turno successivo.", - }, - spectralThief: { - name: "Ombrafurto", - effect: "Chi la usa ruba gli aumenti delle statistiche del bersaglio, poi si nasconde nella sua ombra e lo attacca.", - }, - sunsteelStrike: { - name: "Astrocarica", - effect: "Chi la usa travolge il bersaglio con la potenza di una meteora. Questo attacco ignora l'abilità del bersaglio.", - }, - moongeistBeam: { - name: "Raggio d'Ombra", - effect: "Chi la usa proietta sul bersaglio un misterioso raggio di luce. Questo attacco ignora l'abilità del bersaglio.", - }, - tearfulLook: { - name: "Occhionilucidi", - effect: "Chi la usa guarda il bersaglio con gli occhi pieni di lacrime e gli fa perdere lo spirito combattivo, riducendone l'Attacco e l'Attacco Speciale", - }, - zingZap: { - name: "Elettropizzico", - effect: "Chi la usa colpisce il bersaglio investendolo con una potente scarica elettrica che può anche farlo tentennare.", - }, - naturesMadness: { - name: "Ira della Natura", - effect: "Scatena l’ira della natura sul bersaglio e ne dimezza i PS.", - }, - multiAttack: { - name: "Multiattacco", - effect: "Chi la usa si avvolge in un potente campo energetico e colpisce il bersaglio. Il tipo della mossa varia in base alla ROM installata.", - }, - tenMillionVoltThunderbolt: { - name: "Iperfulmine", - effect: "Grazie al Potere Z, Pikachu con il berretto scatena una potentissima scarica elettrica. Probabile brutto colpo.", - }, - mindBlown: { - name: "Sbalorditesta", - effect: "Chi la usa fa esplodere la propria testa per attaccare tutti i Pokémon che ha intorno, ma subisce danni.", - }, - plasmaFists: { - name: "Pugni Plasma", - effect: "Chi la usa attacca con pugni carichi di elettricità. Trasforma le mosse di tipo Normale in mosse di tipo Elettro.", - }, - photonGeyser: { - name: "Geyser Fotonico", - effect: "Infligge danni in base all’Attacco o all’Attacco Speciale scegliendo il più alto tra i due. Questo attacco ignora l’abilità del bersaglio.", - }, - lightThatBurnsTheSky: { - name: "Fotodistruzione Apocalittica", - effect: "Infligge danni in base all’Attacco o all’Attacco Speciale scegliendo il più alto tra i due. Questo attacco ignora l’abilità del bersaglio.", - }, - searingSunrazeSmash: { - name: "Supercollisione Solare", - effect: "Grazie al Potere Z, Solgaleo attacca il bersaglio con tutta la sua forza. Questo attacco ignora l’abilità del bersaglio se questa ha effetto sulle mosse.", - }, - menacingMoonrazeMaelstrom: { - name: "Deflagrazione Lunare", - effect: "Grazie al Potere Z, Lunala attacca il bersaglio con tutta la sua forza. Questo attacco ignora l’abilità del bersaglio se questa ha effetto sulle mosse.", - }, - letsSnuggleForever: { - name: "Dolcesacco di Botte", - effect: "Grazie al Potere Z, Mimikyu fa appello a tutte le sue forze e attacca il bersaglio tempestandolo di colpi.", - }, - splinteredStormshards: { - name: "Litotempesta Radiale", - effect: "Grazie al Potere Z, Lycanroc attacca il bersaglio con tutta la sua forza. Questa mossa annulla anche gli eventuali campi attivi.", - }, - clangorousSoulblaze: { - name: "Dracofonia Divampante", - effect: "Grazie al Potere Z, Kommo-o attacca i nemici con tutta la sua forza. Inoltre, aumenta le proprie statistiche.", - }, - zippyZap: { - name: "Sprintaboom", - effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.", - }, - splishySplash: { - name: "Surfasplash", - effect: "Colpisce il bersaglio con un'enorme onda caricata di elettricità che può anche paralizzarlo.", - }, - floatyFall: { - name: "Piombaflap", - effect: "Chi la usa si libra in aria per poi piombare addosso al bersaglio. Può anche far tentennare il Pokémon colpito.", - }, - pikaPapow: { - name: "Pikasaetta", - effect: "Questa mossa infallibile diventa più potente con il rafforzarsi del rapporto tra Pikachu e l'Allenatore.", - }, - bouncyBubble: { - name: "Bollaslurp", - effect: "Chi la usa colpisce il bersaglio con una raffica di bolle, per poi assorbirle e recuperare una quantità di PS pari alla del danno inferto.", - }, - buzzyBuzz: { - name: "Elettrozap", - effect: "Colpisce il bersaglio con una scarica elettrica che lo paralizza.", - }, - sizzlySlide: { - name: "Fiammabam", - effect: "Chi la usa viene avvolto dalle fiamme e colpisce il bersaglio con forza, scottandolo.", - }, - glitzyGlow: { - name: "Auraswoosh", - effect: "Colpisce il bersaglio ripetutamente con onde di forza psicocinetica e innalza una barriera fantastica che riduce i danni degli attacchi speciali nemici.", - }, - baddyBad: { - name: "Zona Buiabuia", - effect: "Chi la usa scatena l’oscurità che ha dentro, colpendo il bersaglio e innalzando una barriera fantastica che riduce i danni degli attacchi fisici nemici.", - }, - sappySeed: { - name: "Bombafrush", - effect: "Fa crescere un'enorme pianta che colpisce il bersaglio con una pioggia di semi. Questi sottraggono PS a ogni turno permettendo a chi la usa di curarsi.", - }, - freezyFrost: { - name: "Scricchiagelo", - effect: "Chi la usa attacca il bersaglio con un cristallo formato da una nube nera congelata, che annulla ogni modifica alle statistiche di tutti i Pokémon.", - }, - sparklySwirl: { - name: "Sbrilluccibufera", - effect: "Chi la usa attacca il bersaglio avvolgendolo in un turbine di profumi soffocanti e cura i problemi di stato propri e degli alleati.", - }, - veeveeVolley: { - name: "Eeveempatto", - effect: "Questa mossa infallibile diventa più potente con il rafforzarsi del rapporto tra Eevee e l'Allenatore.", - }, - doubleIronBash: { - name: "Pugni Corazzati", - effect: "L'utilizzatore ruota, centrando il dado esagonale nel petto, quindi colpisce con le braccia due volte di seguito. Ciò potrebbe anche far tentennare il bersaglio.", - }, - maxGuard: { - name: "Dynabarriera", - effect: "Questa mossa permette di eludere tutti gli attacchi. Se usata in successione può fallire.", - }, - dynamaxCannon: { - name: "Cannone Dynamax", - effect: "Il Pokémon attacca emettendo dal suo nucleo l'energia concentrata nel corpo.", - }, - snipeShot: { - name: "Tiromirato", - effect: "Permette di attaccare il bersaglio ignorando gli effetti di mosse e abilità che alterano le mosse", - }, - jawLock: { - name: "Morsostretto", - effect: "Impedisce a chi la usa e al bersaglio di essere sostituiti finché non vanno KO. L'effetto svanisce se uno dei due lascia il campo.", - }, - stuffCheeks: { - name: "Riempiguance", - effect: "Se chi la usa ha con sé una bacca, la mangia e la sua Difesa aumenta di molto.", - }, - noRetreat: { - name: "Spalle al Muro", - effect: "Il Pokémon aumenta tutte le sue statistiche ma non può più fuggire o essere sostituito.", - }, - tarShot: { - name: "Colpocatrame", - effect: "Chi la usa getta catrame appiccicoso sul bersaglio abbassandone la Velocità e rendendolo vulnerabile al tipo Fuoco.", - }, - magicPowder: { - name: "Magipolvere", - effect: "Chi la usa getta addosso al bersaglio una polvere magica che lo rende di tipo Psico.", - }, - dragonDarts: { - name: "Dragofrecce", - effect: "L'utilizzatore attacca due volte usando Dreepy. Se ci sono due obiettivi, questa mossa colpisce una volta ogni obiettivo.", - }, - teatime: { - name: "Ora del Tè", - effect: "Chi la usa invita tutti i Pokémon in campo a prendere il tè. Quelli che hanno con sé una bacca la mangiano.", - }, - octolock: { - name: "Tentacolock", - effect: "Chi la usa immobilizza il bersaglio impedendogli di fuggire e ne diminuisce la Difesa e la Difesa Speciale a ogni turno.", - }, - boltBeak: { - name: "Beccoshock", - effect: "Chi la usa attacca il bersaglio con il becco appuntito carico d'elettricità. Se attacca per primo, la potenza della mossa raddoppia.", - }, - fishiousRend: { - name: "Branchiomorso", - effect: "Chi la usa morde il bersaglio con le dure branchie. Se attacca per primo, la potenza della mossa raddoppia.", - }, - courtChange: { - name: "Cambiocampo", - effect: "Una forza misteriosa inverte gli effetti attivi sul campo alleato e sul campo avversario.", - }, - maxFlare: { - name: "Dynafiammata", - effect: "Un attacco di tipo Fuoco che può essere eseguito dai Pokémon dynamaxizzati. Intensifica i raggi solari per cinque turni.", - }, - maxFlutterby: { - name: "Dynainsetto", - effect: "Un attacco di tipo Coleottero che può essere eseguito dai Pokémon dynamaxizzati. Riduce l'Attacco Speciale degli avversari.", - }, - maxLightning: { - name: "Dynasaetta", - effect: "Un attacco di tipo Elettro che può essere eseguito dai Pokémon dynamaxizzati. Per cinque turni il terreno entra nello stato di Campo Elettrico.", - }, - maxStrike: { - name: "Dynattacco", - effect: "Un attacco di tipo Normale che può essere eseguito dai Pokémon dynamaxizzati. Riduce la Velocità degli avversari.", - }, - maxKnuckle: { - name: "Dynapugno", - effect: "Un attacco di tipo Lotta che può essere eseguito dai Pokémon dynamaxizzati. Aumenta l'Attacco degli alleati.", - }, - maxPhantasm: { - name: "Dynavuoto", - effect: "Un attacco di tipo Spettro che può essere eseguito dai Pokémon dynamaxizzati. Riduce la Difesa degli avversari.", - }, - maxHailstorm: { - name: "Dynagelo", - effect: "Un attacco di tipo Ghiaccio che può essere eseguito dai Pokémon dynamaxizzati. Causa una nevicata che dura per cinque turni.", - }, - maxOoze: { - name: "Dynacorrosione", - effect: "Un attacco di tipo Veleno che può essere eseguito dai Pokémon dynamaxizzati. Aumenta l'Attacco Speciale degli alleati.", - }, - maxGeyser: { - name: "Dynaflusso", - effect: "Un attacco di tipo Acqua che può essere eseguito dai Pokémon dynamaxizzati. Provoca una forte pioggia per cinque turni.", - }, - maxAirstream: { - name: "Dynajet", - effect: "Un attacco di tipo Volante che può essere eseguito dai Pokémon dynamaxizzati. Aumenta la Velocità degli alleati.", - }, - maxStarfall: { - name: "Dynafata", - effect: "Un attacco di tipo Folletto che può essere eseguito dai Pokémon dynamaxizzati. Per cinque turni il terreno entra nello stato di Campo Nebbioso.", - }, - maxWyrmwind: { - name: "Dynadragone", - effect: "Un attacco di tipo Drago che può essere eseguito dai Pokémon dynamaxizzati. Riduce l'Attacco degli avversari.", - }, - maxMindstorm: { - name: "Dynapsiche", - effect: "Un attacco di tipo Psico che può essere eseguito dai Pokémon dynamaxizzati. Per cinque turni il terreno entra nello stato di Campo Psichico.", - }, - maxRockfall: { - name: "Dynamacigno", - effect: "Un attacco di tipo Roccia che può essere eseguito dai Pokémon dynamaxizzati. Causa una tempesta di sabbia per cinque turni.", - }, - maxQuake: { - name: "Dynasisma", - effect: "Un attacco di tipo Terra che può essere eseguito dai Pokémon dynamaxizzati. Aumenta la Difesa Speciale degli alleati.", - }, - maxDarkness: { - name: "Dynatenebre", - effect: "Un attacco di tipo Buio che può essere eseguito dai Pokémon dynamaxizzati. Riduce la Difesa Speciale degli avversari.", - }, - maxOvergrowth: { - name: "Dynaflora", - effect: "Un attacco di tipo Erba che può essere eseguito dai Pokémon dynamaxizzati. Per cinque turni il terreno entra nello stato di Campo Erboso.", - }, - maxSteelspike: { - name: "Dynametallo", - effect: "Un attacco di tipo Acciaio che può essere eseguito dai Pokémon dynamaxizzati. Aumenta la Difesa degli alleati.", - }, - clangorousSoul: { - name: "Dracofonia", - effect: "Chi la usa sacrifica un po' dei suoi PS per aumentare tutte le sue statistiche.", - }, - bodyPress: { - name: "Schiacciacorpo", - effect: "Chi la usa schiaccia il bersaglio con il suo corpo. Più la sua Difesa è alta, maggiori sono i danni inflitti.", - }, - decorate: { - name: "Decorazione", - effect: "Chi la usa agghinda il bersaglio con delle decorazioni aumentandone di molto l'Attacco e l'Attacco Speciale.", - }, - drumBeating: { - name: "Tamburattacco", - effect: "Chi la usa percuote il proprio tamburo per controllarne le radici e attaccare il bersaglio, riducendone la Velocità.", - }, - snapTrap: { - name: "Tagliola", - effect: "Chi la usa intrappola il bersaglio in una tagliola e lo attacca per quattro o cinque turni.", - }, - pyroBall: { - name: "Palla Infuocata", - effect: "l Pokémon attacca con una palla creata incendiando una piccola pietra. Può anche scottare il bersaglio.", - }, - behemothBlade: { - name: "Taglio Maestoso", - effect: "Il Pokémon brandisce un'enorme spada e attacca vibrando un poderoso fendente.", - }, - behemothBash: { - name: "Colpo Maestoso", - effect: "Il Pokémon trasforma il suo corpo in un robusto scudo e attacca caricando con forza.", - }, - auraWheel: { - name: "Ruota d'Aura", - effect: "Il Pokémon emette l'energia accumulata nelle guance per attaccare e aumentare la Velocità. Il tipo della mossa cambia in base alla forma assunta da Morpeko.", - }, - breakingSwipe: { - name: "Vastoimpatto", - effect: "Chi la usa attacca i nemici intorno con la sua robusta coda riducendone l'Attacco.", - }, - branchPoke: { - name: "Ramostoccata", - effect: "Chi la usa attacca il bersaglio con un ramo incredibilmente appuntito.", - }, - overdrive: { - name: "Overdrive", - effect: "Chi la usa suona la chitarra o il basso creando un'onda sonora potentissima con cui attacca il bersaglio.", - }, - appleAcid: { - name: "Acido Malico", - effect: "Il Pokémon attacca il bersaglio con un liquido acido ricavato da mele aspre riducendone la Difesa Speciale.", - }, - gravApple: { - name: "Forza G", - effect: "Il Pokémon fa cadere una mela sul bersaglio da una grande altezza, infliggendogli danni e riducendone la Difesa.", - }, - spiritBreak: { - name: "Frantumanima", - effect: "Chi la usa attacca il bersaglio con un tale impeto da fargli perdere la voglia di lottare e ne riduce l'Attacco Speciale", - }, - strangeSteam: { - name: "Vapore Incantato", - effect: "Il Pokémon attacca il bersaglio con getti di vapore che possono anche confonderlo.", - }, - lifeDew: { - name: "Goccia Vitale", - effect: "Il Pokémon sparge tutt'intorno dell'acqua misteriosa che fa recuperare PS a sé e agli alleati in campo.", - }, - obstruct: { - name: "Sbarramento", - effect: "Permette di eludere tutti gli attacchi. Se usata in successione può fallire. Se un Pokémon tocca chi la usa, la sua Difesa diminuisce di molto.", - }, - falseSurrender: { - name: "Supplicolpo", - effect: "Chi la usa finge di abbassare la testa a mo' di supplica e attacca il bersaglio con i suoi capelli scarmigliati. Questa mossa va sempre a segno.", - }, - meteorAssault: { - name: "Sfolgorassalto", - effect: "Chi la usa attacca il bersaglio brandendo un grosso gambo, ma perde l'equilibrio e nel turno successivo non può agire.", - }, - eternabeam: { - name: "Raggio Infinito", - effect: "È l'attacco più potente di Eternatus quando assume la sua forma originale. Nel turno successivo non può agire.", - }, - steelBeam: { - name: "Raggio d'Acciaio", - effect: "Il Pokémon utilizza l'acciaio del proprio corpo per sparare un violento raggio, ma subisce danni.", - }, - expandingForce: { - name: "Vastenergia", - effect: "Chi la usa attacca il bersaglio con energia psichica. Se utilizzata quando è attivo un Campo Psichico, la mossa aumenta di potenza e danneggia tutti i nemici.", - }, - steelRoller: { - name: "Ferrorullo", - effect: "Chi la usa attacca eliminando lo stato del terreno di lotta. La mossa fallisce se nel terreno non è attivo alcuno stato.", - }, - scaleShot: { - name: "Squamacolpo", - effect: "Il Pokémon attacca lanciando delle squame da due a cinque volte di fila. Aumenta la Velocità di chi la usa, ma ne riduce la Difesa.", - }, - meteorBeam: { - name: "Raggiometeora", - effect: "Chi la usa accumula l'energia dello spazio nel primo turno per aumentare l'Attacco Speciale, quindi attacca nel turno successivo.", - }, - shellSideArm: { - name: "Armaguscio", - effect: "Il Pokémon esegue un attacco fisico o speciale, in base a quale causa danni maggiori. Può anche avvelenare il bersaglio.", - }, - mistyExplosion: { - name: "Nebbioscoppio", - effect: "Chi la usa attacca tutti i Pokémon che ha intorno, ma poi va KO. La potenza delle mosse aumenta quando è attivo un Campo Nebbioso.", - }, - grassyGlide: { - name: "Erboscivolata", - effect: "Chi la usa attacca il bersaglio scivolando sul terreno. Se utilizzata quando è attivo un Campo Erboso, ha priorità alta.", - }, - risingVoltage: { - name: "Elettroimpennata", - effect: "Chi la usa attacca con dell'elettricità che si alza dal suolo. La potenza della mossa raddoppia quando l'avversario si trova in un Campo Elettrico.", - }, - terrainPulse: { - name: "Campopulsar", - effect: "Chi la usa attacca sfruttando l'energia del terreno di lotta. Il tipo e la potenza della mossa variano a seconda dello stato del terreno stesso.", - }, - skitterSmack: { - name: "Strisciacolpo", - effect: "Chi la usa attacca il bersaglio strisciandogli alle spalle e riducendo il suo Attacco Speciale.", - }, - burningJealousy: { - name: "Fiamminvidia", - effect: "Chi la usa attacca con la forza dell'invidia, causando una scottatura a tutti i Pokémon le cui statistiche sono aumentate durante quel turno.", - }, - lashOut: { - name: "Sfogarabbia", - effect: "Chi la usa attacca il bersaglio con tutta la propria ira. Se ha subito riduzioni delle statistiche durante quel turno, la potenza della mossa raddoppia.", - }, - poltergeist: { - name: "Poltergeist", - effect: "Chi la usa attacca utilizzando lo strumento del bersaglio. La mossa fallisce se quest'ultimo non ha uno strumento.", - }, - corrosiveGas: { - name: "Gas Corrosivo", - effect: "Chi la usa avvolge gli altri Pokémon attorno in un gas altamente acido, dissolvendo i loro strumenti.", - }, - coaching: { - name: "Coaching", - effect: "Chi la usa aumenta l'Attacco e la Difesa di tutti gli alleati dando loro indicazioni precise.", - }, - flipTurn: { - name: "Virata", - effect: "Chi usa questa mossa fa marcia indietro per farsi sostituire dopo aver sferrato l'attacco.", - }, - tripleAxel: { - name: "Triplo Axel", - effect: "Il Pokémon attacca sferrando fino a tre calci consecutivi. Ogni volta che la mossa va a segno, la sua potenza aumenta.", - }, - dualWingbeat: { - name: "Doppia Ala", - effect: "Il Pokémon attacca il bersaglio urtandolo con le ali e infliggendogli danni due volte di fila.", - }, - scorchingSands: { - name: "Sabbiardente", - effect: "Chi la usa attacca il bersaglio scagliandogli addosso della sabbia incandescente. Può anche scottarlo.", - }, - jungleHealing: { - name: "Giunglacura", - effect: "Il Pokémon diventa tutt'uno con la giungla, ripristinando i PS e curando i problemi di stato per sé e per gli alleati in campo.", - }, - wickedBlow: { - name: "Pugnotenebra", - effect: "Il Pokémon sferra un singolo colpo potentissimo, massima espressione dello stile di tipo Buio. Brutto colpo assicurato.", - }, - surgingStrikes: { - name: "Idroraffica", - effect: "Il Pokémon sferra una fluida serie di tre attacchi, massima espressione dello stile di tipo Acqua. Brutto colpo assicurato.", - }, - thunderCage: { - name: "Elettrogabbia", - effect: "Il Pokémon attacca il bersaglio imprigionandolo in una gabbia di elettricità, che sprigiona corrente per quattro o cinque turni.", - }, - dragonEnergy: { - name: "Dragoenergia", - effect: " Il Pokémon attacca il bersaglio convertendo la propria forza vitale in energia. Più i suoi PS sono bassi, più la potenza della mossa diminuisce.", - }, - freezingGlare: { - name: "Sguardo Gelido", - effect: "Il Pokémon attacca rilasciando energia psichica dagli occhi. Può congelare il bersaglio.", - }, - fieryWrath: { - name: "Furia Ardente", - effect: "ERR Il Pokémon attacca trasformando la sua rabbia in un'aura simile a fiamme. Può anche far tentennare il bersaglio.ORE", - }, - thunderousKick: { - name: "Calcio Tonante", - effect: "Il Pokémon sferra calci al bersaglio dopo averlo distratto con movimenti fulminei, riducendone la Difesa.", - }, - glacialLance: { - name: "Lancia Glaciale", - effect: "Il Pokémon attacca il bersaglio scagliando una lancia di ghiaccio accompagnata da una tormenta di neve.", - }, - astralBarrage: { - name: "Schegge Astrali", - effect: "Il Pokémon attacca il bersaglio scatenandogli contro una miriade di piccoli spettri.", - }, - eerieSpell: { - name: "Inquietantesimo", - effect: "Il Pokémon attacca con i suoi potenti poteri psichici. Sottrae 3 PP all'ultima mossa usata dall'avversario.", - }, - direClaw: { - name: "Artigli Fatali", - effect: "Il Pokémon attacca il bersaglio con artigli distruttori. Può anche causargli avvelenamento, paralisi o sonno.", - }, - psyshieldBash: { - name: "Barrierassalto", - effect: "Il Pokémon si carica di energia psichica per poi schiantarsi sul bersaglio. Inoltre, aumenta la propria Difesa.", - }, - powerShift: { - name: "Scambioforza", - effect: "Il Pokémon scambia il suo Attacco con la Difesa.", - }, - stoneAxe: { - name: "Rocciascure", - effect: "Il Pokémon attacca il bersaglio con delle scuri di roccia. I frammenti rocciosi dispersi dall'attacco restano sospesi intorno al bersaglio.", - }, - springtideStorm: { - name: "Tempesta Zefirea", - effect: "Il Pokémon attacca il bersaglio avvolgendolo con un vento fortissimo di odio e amore. Può anche ridurne l'Attacco.", - }, - mysticalPower: { - name: "Forza Mistica", - effect: "Il Pokémon attacca emettendo un misterioso potere. Inoltre, aumenta il proprio Attacco Speciale.", - }, - ragingFury: { - name: "Ira Furente", - effect: "Il Pokémon s'infuria e sputa fiammate per due o tre turni, ma rimane confuso.", - }, - waveCrash: { - name: "Ondaschianto", - effect: "Il Pokémon si avvolge in uno strato d'acqua e si lancia sul bersaglio, ma subisce seri danni.", - }, - chloroblast: { - name: "Clorofillaser", - effect: "Il Pokémon attacca concentrando la clorofilla nel proprio corpo per poi lanciarla, ma subisce danni.", - }, - mountainGale: { - name: "Soffio d'Iceberg", - effect: " Il Pokémon attacca colpendo il bersaglio con un blocco di ghiaccio grande come un iceberg. Può anche far tentennare il bersaglio.", - }, - victoryDance: { - name: "Danzavittoria", - effect: "Il Pokémon si lancia in una danza sfrenata per invocare la vittoria e aumenta l'Attacco, la Difesa e la Velocità.", - }, - headlongRush: { - name: "Scontro Frontale", - effect: "Il Pokémon si schianta sul bersaglio con tutte le forze. La sua Difesa e la sua Difesa Speciale diminuiscono.", - }, - barbBarrage: { - name: "Mille Fielespine", - effect: "Il bersaglio viene colpito da una miriade di spine tossiche che possono anche avvelenarlo. Se il bersaglio è già avvelenato, la potenza della mossa raddoppia.", - }, - esperWing: { - name: "Ali d'Aura", - effect: "Il Pokémon falcia il bersaglio con ali rafforzate da un'aura. Probabile brutto colpo. Inoltre, la Velocità aumenta.", - }, - bitterMalice: { - name: "Livore", - effect: "Il Pokémon attacca con una furia che fa raggelare il sangue nelle vene del bersaglio, riducendone l'Attacco.", - }, - shelter: { - name: "Barricata", - effect: "Il Pokémon indurisce la propria pelle come uno scudo di ferro, aumentando di molto la Difesa.", - }, - tripleArrows: { - name: "Triplodardo", - effect: "Il Pokémon sferra un calcio per poi scoccare tre dardi insieme. Può ridurre la Difesa del bersaglio o farlo tentennare. Probabile brutto colpo.", - }, - infernalParade: { - name: "Corteo Spettrale", - effect: "Il Pokémon attacca con innumerevoli sfere di fuoco che possono anche scottare il bersaglio. Se questo è affetto da problemi di stato, la potenza della mossa raddoppia.", - }, - ceaselessEdge: { - name: "Lama Milleflutti", - effect: "Il Pokémon attacca il bersaglio con la spada conchiglia. I frammenti di conchiglie formano una trappola di punte ai piedi del bersaglio.", - }, - bleakwindStorm: { - name: "Tempesta Boreale", - effect: "Il Pokémon attacca il bersaglio con venti gelidi e sferzanti che lo fanno tremare anima e corpo. Può anche ridurne la Velocità.", - }, - wildboltStorm: { - name: "Tempesta Tonante", - effect: "Il Pokémon chiama a sé una tempesta di fulmini e raffiche di vento con cui attacca violentemente il bersaglio. Può anche paralizzarlo.", - }, - sandsearStorm: { - name: "Tempesta Ardente", - effect: "Il Pokémon attacca il bersaglio avvolgendolo con sabbia ardente e un vento fortissimo che possono scottarlo.", - }, - lunarBlessing: { - name: "Invocaluna", - effect: " Il Pokémon rivolge una preghiera alla luna crescente, ripristinando i PS e curando i problemi di stato per sé e per gli alleati in campo.", - }, - takeHeart: { - name: "Baldimpulso", - effect: "Il Pokémon prende coraggio e guarisce dai problemi di stato. Inoltre, aumenta l'Attacco Speciale e la Difesa Speciale.", - }, - gMaxWildfire: { - name: "Gigavampa", - effect: "Attacco di tipo Fuoco eseguito da Charizard Gigamax. Infligge danni per quattro turni.", - }, - gMaxBefuddle: { - name: "Gigastupore", - effect: "Attacco di tipo Coleottero eseguito da Butterfree Gigamax. Avvelena, paralizza o addormenta i nemici.", - }, - gMaxVoltCrash: { - name: "Gigapikafolgori", - effect: "Attacco di tipo Elettro eseguito da Pikachu Gigamax. Paralizza i nemici.", - }, - gMaxGoldRush: { - name: "Gigamonete", - effect: "Attacco di tipo Normale eseguito da Meowth Gigamax. Confonde i nemici e permette anche di ricevere una ricompensa maggiore.", - }, - gMaxChiStrike: { - name: "Gigapugnointuito", - effect: "Attacco di tipo Lotta eseguito da Machamp Gigamax. Aumenta la probabilità di sferrare brutti colpi.", - }, - gMaxTerror: { - name: "Gigaillusione", - effect: "Attacco di tipo Spettro eseguito da Gengar Gigamax. Il Pokémon calpesta l'ombra del nemico impedendogli la fuga o la sostituzione.", - }, - gMaxResonance: { - name: "Gigamelodia", - effect: "Attacco di tipo Ghiaccio eseguito da Lapras Gigamax. Riduce i danni subiti per cinque turni.", - }, - gMaxCuddle: { - name: "Gigabbraccio", - effect: "Attacco di tipo Normale eseguito da Eevee Gigamax. Fa infatuare i nemici.", - }, - gMaxReplenish: { - name: "Gigarinnovamento", - effect: "Attacco di tipo Normale eseguito da Snorlax Gigamax. Rigenera le bacche mangiate.", - }, - gMaxMalodor: { - name: "Gigafetore", - effect: "Attacco di tipo Veleno eseguito da Garbodor Gigamax. Avvelena i nemici.", - }, - gMaxStonesurge: { - name: "Gigarocciagetto", - effect: "Attacco di tipo Acqua eseguito da Drednaw Gigamax. Sparge rocce aguzze sul campo di lotta.", - }, - gMaxWindRage: { - name: "Gigaciclone", - effect: "Attacco di tipo Volante eseguito da Corviknight Gigamax. Annulla l'effetto di mosse come Riflesso e Schermoluce.", - }, - gMaxStunShock: { - name: "Gigatoxiscossa", - effect: "Attacco di tipo Elettro eseguito da Toxtricity Gigamax. Avvelena o paralizza i nemici.", - }, - gMaxFinale: { - name: "Gigagranfinale", - effect: "Attacco di tipo Folletto eseguito da Alcremie Gigamax. Fa recuperare PS agli alleati.", - }, - gMaxDepletion: { - name: "Gigalogoramento", - effect: "Attacco di tipo Drago eseguito da Duraludon Gigamax. Toglie PP all'ultima mossa usata dai nemici.", - }, - gMaxGravitas: { - name: "Gigagravitoforza", - effect: "Attacco di tipo Psico eseguito da Orbeetle Gigamax. Cambia la gravità per cinque turni.", - }, - gMaxVolcalith: { - name: "Gigalapilli", - effect: "Attacco di tipo Roccia eseguito da Coalossal Gigamax. Infligge danni per quattro turni.", - }, - gMaxSandblast: { - name: "Gigavortisabbia", - effect: "Attacco di tipo Terra eseguito da Sandaconda Gigamax. Scatena un turbine di sabbia per quattro o cinque turni.", - }, - gMaxSnooze: { - name: "Gigatorpore", - effect: "Attacco di tipo Buio eseguito da Grimmsnarl Gigamax. Chi la usa fa un grande sbadiglio che fa addormentare il nemico al turno successivo.", - }, - gMaxTartness: { - name: "Gigattaccoacido", - effect: "Attacco di tipo Erba eseguito da Flapple Gigamax. Riduce l’elusione dei nemici.", - }, - gMaxSweetness: { - name: "Gigambrosia", - effect: "Attacco di tipo Erba eseguito da Appletun Gigamax. Cura i problemi di stato degli alleati.", - }, - gMaxSmite: { - name: "Gigacastigo", - effect: "Attacco di tipo Folletto eseguito da Hatterene Gigamax. Confonde i nemici.", - }, - gMaxSteelsurge: { - name: "Gigaferroaculei", - effect: "Attacco di tipo Acciaio eseguito da Copperajah Gigamax. Sparge pezzi di metallo acuminati sul campo di lotta.", - }, - gMaxMeltdown: { - name: "Gigaliquefazione", - effect: "ERAttacco di tipo Acciaio eseguito da Melmetal Gigamax. Impedisce ai nemici di usare la stessa mossa due volte di seguito.RORE", - }, - gMaxFoamBurst: { - name: "Gigaschiuma", - effect: "Attacco di tipo Acqua eseguito da Kingler Gigamax. Riduce di molto la Velocità dei nemici.", - }, - gMaxCentiferno: { - name: "Gigamillefiamme", - effect: "Attacco di tipo Fuoco eseguito da Centiskorch Gigamax. Intrappola i nemici nelle fiamme per quattro o cinque turni.", - }, - gMaxVineLash: { - name: "Gigasferzata", - effect: "Attacco di tipo Erba eseguito da Venusaur Gigamax. Infligge danni per quattro turni.", - }, - gMaxCannonade: { - name: "Gigacannonata", - effect: "Attacco di tipo Acqua eseguito da Blastoise Gigamax. Infligge danni per quattro turni.", - }, - gMaxDrumSolo: { - name: "Gigarullio", - effect: "Attacco di tipo Erba eseguito da Rillaboom Gigamax. Ignora le abilità dei nemici.", - }, - gMaxFireball: { - name: "Gigafiammopalla", - effect: "Attacco di tipo Fuoco eseguito da Cinderace Gigamax. Ignora le abilità dei nemici.", - }, - gMaxHydrosnipe: { - name: "Gigasparomirato", - effect: "Attacco di tipo Acqua eseguito da Inteleon Gigamax. Ignora le abilità dei nemici.", - }, - gMaxOneBlow: { - name: "Gigasingolcolpo", - effect: "Attacco di tipo Buio eseguito da Urshifu Gigamax che ignora gli effetti della Dynabarriera.", - }, - gMaxRapidFlow: { - name: "Gigapluricolpo", - effect: " Attacco di tipo Acqua eseguito da Urshifu Gigamax che ignora gli effetti della Dynabarriera.", - }, - teraBlast: { - name: "Terascoppio", - effect: "Se il Pokémon è teracristallizzato, attacca con l'energia del suo teratipo. Infligge danni in base all'Attacco o all'Attacco Speciale scegliendo il più alto tra i due.", - }, - silkTrap: { - name: "Telatrappola", - effect: "Il Pokémon tesse una trappola di tela che lo protegge dagli attacchi e riduce la Velocità di chi entra in contatto con lui.", - }, - axeKick: { - name: "Calcio ad Ascia", - effect: "Il Pokémon attacca sferrando un calcio dall'alto verso il basso che può confondere il bersaglio. Se la mossa fallisce, il Pokémon subisce dei danni.", - }, - lastRespects: { - name: "Omaggio ai KO", - effect: "Il Pokémon attacca per placare il risentimento dei suoi compagni di squadra. Più sono quelli andati KO, più la potenza della mossa aumenta.", - }, - luminaCrash: { - name: "Fotocollisione", - effect: "Il Pokémon attacca sparando una luce bizzarra che agisce anche sulla psiche. Riduce di molto la Difesa Speciale del bersaglio.", - }, - orderUp: { - name: "Alta Cucina", - effect: "Il Pokémon attacca con deliziose movenze. Se ha in bocca un Tatsugiri, una sua statistica aumenta in base alla forma di quest'ultimo.", - }, - jetPunch: { - name: "Pugnojet", - effect: "Il Pokémon avvolge il pugno in una corrente impetuosa e sferra un colpo a una tale velocità da rendersi quasi invisibile. Questo attacco ha priorità alta.", - }, - spicyExtract: { - name: "Essenza Piccante", - effect: "Il Pokémon secerne un'essenza straordinariamente piccante. Aumenta di molto l'Attacco del bersaglio ma ne diminuisce di molto la Difesa.", - }, - spinOut: { - name: "Slittaruote", - effect: "Il Pokémon infligge danni caricando le estremità e ruotandole vorticosamente. La sua Velocità diminuisce di molto.", - }, - populationBomb: { - name: "Infestazione", - effect: "Il Pokémon si riunisce con i suoi simili in un gruppo brulicante che collabora per attaccare e colpisce da una a dieci volte di fila.", - }, - iceSpinner: { - name: "Vortighiaccio", - effect: "Il Pokémon avvolge gli arti inferiori in un sottile strato di ghiaccio e si scontra con il bersaglio piroettando. Il movimento rotatorio distrugge il terreno di lotta.", - }, - glaiveRush: { - name: "Spadoncarica", - effect: "Il Pokémon si lancia in una carica avventata. Fino al suo prossimo turno, il Pokémon riceverà il doppio dei danni dagli attacchi altrui, che andranno sempre a segno.", - }, - revivalBlessing: { - name: "Preghiera Vitale", - effect: "Il Pokémon intona una preghiera compassionevole, rianimando un Pokémon della squadra esausto e restituendogli metà dei suoi PS.", - }, - saltCure: { - name: "Sotto Sale", - effect: "Il Pokémon mette sotto sale il bersaglio, infliggendogli danni a ogni turno. I Pokémon di tipo Acciaio e di tipo Acqua sono particolarmente vulnerabili a questa mossa.", - }, - tripleDive: { - name: "Triplo Tuffo", - effect: "Il Pokémon si lancia in un triplo tuffo perfettamente coordinato, colpendo il bersaglio con degli schizzi d'acqua e infliggendogli danni tre volte di fila.", - }, - mortalSpin: { - name: "Glitturbine", - effect: "Attacco rotante che elimina gli effetti di mosse come Legatutto, Avvolgibotta e Parassiseme. Aumenta anche la Velocità di chi la usa.", - }, - doodle: { - name: "Ricalco", - effect: "Il Pokémon cattura l'essenza del bersaglio con un ricalco, copiandone l'abilità e applicandola a se stesso e ai suoi alleati.", - }, - filletAway: { - name: "Alleggerimento", - effect: "Il Pokémon sacrifica dei PS per far aumentare di molto l'Attacco, l'Attacco Speciale e la Velocità.", - }, - kowtowCleave: { - name: "Genufendente", - effect: "Il Pokémon si genuflette per far abbassare la guardia al bersaglio e poi fenderlo. Questo attacco va sempre a segno.", - }, - flowerTrick: { - name: "Prestigiafiore", - effect: " Il Pokémon attacca il bersaglio lanciandogli addosso un mazzo di fiori truccato. Questo attacco va sempre a segno, infliggendo anche un brutto colpo.", - }, - torchSong: { - name: "Canzone Ardente", - effect: "Il Pokémon abbrustolisce il bersaglio soffiandogli addosso fiamme ardenti come se intonasse una canzone. Inoltre, il suo Attacco Speciale aumenta.", - }, - aquaStep: { - name: "Idroballetto", - effect: "Il Pokémon si prende gioco del bersaglio con passi di danza leggiadri e fluidi come l’acqua, infliggendogli danni. Inoltre, la sua Velocità aumenta.", - }, - ragingBull: { - name: "Scatenatoro", - effect: "Il Pokémon carica il bersaglio con furia cieca, rompendo barriere come Schermoluce e Riflesso. Il tipo di questa mossa dipende dalla forma di chi la usa.", - }, - makeItRain: { - name: "Corsa all'Oro", - effect: "Il Pokémon attacca lanciando una gran quantità di monete recuperabili dopo la lotta, ma riduce il proprio Attacco Speciale.", - }, - psyblade: { - name: "Psicolama", - effect: "Il Pokémon falcia il bersaglio con una lama eterea. La potenza della mossa aumenta del 50% quando è attivo un Campo Elettrico.", - }, - hydroSteam: { - name: "Idrovapore", - effect: "Il Pokémon ricopre con forza il bersaglio di acqua bollente. Con la luce solare intensa, la potenza di questa mossa aumenta del 50% anziché diminuire.", - }, - ruination: { - name: "Catastrofe", - effect: "Il Pokémon invoca una terribile disgrazia, dimezzando i PS del bersaglio.", - }, - collisionCourse: { - name: "Turboschianto", - effect: "Il Pokémon si schianta al suolo mentre si trasforma, causando un'esplosione primordiale. La potenza della mossa aumenta se questa è superefficace sul bersaglio.", - }, - electroDrift: { - name: "Fulmiscatto", - effect: "Il Pokémon saetta mentre si trasforma, trafiggendo il bersaglio con una scossa futuristica. La potenza della mossa aumenta se questa è superefficace sul bersaglio.", - }, - shedTail: { - name: "Tagliacoda", - effect: "Chi la usa crea una copia di se stesso usando parte dei suoi PS e si fa sostituire da un altro Pokémon della squadra.", - }, - chillyReception: { - name: "Freddura", - effect: "Chi la usa dice una freddura che fa raggelare i presenti per poi farsi sostituire da un altro Pokémon della squadra. Causa una nevicata che dura per cinque turni.", - }, - tidyUp: { - name: "Pulizie", - effect: "Il Pokémon fa le pulizie, annullando gli effetti di Punte, Levitoroccia, Rete Vischiosa, Fielepunte e Sostituto. Inoltre, aumenta il suo Attacco e la sua Velocità.", - }, - snowscape: { - name: "Vista Innevata", - effect: "Il Pokémon causa una nevicata che dura per cinque turni e aumenta la Difesa dei Pokémon di tipo Ghiaccio.", - }, - pounce: { - name: "Balzo", - effect: "Il Pokémon fa un balzo e attacca il bersaglio, riducendone inoltre la Velocità.", - }, - trailblaze: { - name: "Apripista", - effect: "Il Pokémon attacca come se saltasse fuori dall'erba alta e si muove con passo leggiadro, aumentando la propria Velocità.", - }, - chillingWater: { - name: "Doccia Fredda", - effect: "Il Pokémon attacca il bersaglio con una doccia d'acqua talmente fredda da farlo demoralizzare, riducendone l'Attacco.", - }, - hyperDrill: { - name: "Ipertrapano", - effect: "Il Pokémon fa roteare rapidamente la parte appuntita del suo corpo, perforando il bersaglio ed eludendo mosse come Protezione e Individua.", - }, - twinBeam: { - name: "Doppioraggio", - effect: "Il Pokémon attacca il bersaglio con misteriosi raggi di luce emessi dagli occhi che infliggono danni due volte di fila.", - }, - rageFist: { - name: "Pugno Furibondo", - effect: "Il Pokémon trasforma la sua furia in energia e la utilizza per attaccare. Più attacchi ha subito il Pokémon, più la potenza della mossa aumenta.", - }, - armorCannon: { - name: "Corazza Cannone", - effect: "Il Pokémon si libera della sua corazza, scagliandola sul bersaglio come una raffica di proiettili incandescenti. La sua Difesa e la sua Difesa Speciale diminuiscono.", - }, - bitterBlade: { - name: "Lama del Rimorso", - effect: "Il Pokémon concentra nelle lame tutti i rimorsi accumulati nel mondo dei vivi e assale il bersaglio, recuperando una quantità di PS pari a metà del danno inflitto.", - }, - doubleShock: { - name: "Doppiolampo", - effect: "Il Pokémon libera tutta la sua potenza elettrica per infliggere gravi danni al bersaglio, ma come conseguenza perde il tipo Elettro.", - }, - gigatonHammer: { - name: "Granmartello", - effect: "Chi la usa attacca il bersaglio brandendo un enorme martello. La mossa non può essere usata per due volte di fila.", - }, - comeuppance: { - name: "Ritorsione", - effect: "Il Pokémon restituisce con gli interessi i danni subiti all'ultimo avversario che l'ha colpito.", - }, - aquaCutter: { - name: "Idrotaglio", - effect: " Il Pokémon espelle acqua ad alta pressione e falcia il bersaglio con un fendente tagliente quanto una lama. Probabile brutto colpo.", - }, - blazingTorque: { - name: "Turboustione", - effect: "L'utilizzatore accende il suo motore ardente verso il bersaglio. Ciò potrebbe anche lasciare il bersaglio con una bruciatura.", - }, - wickedTorque: { - name: "Turbotenebra", - effect: "L'utente accende il proprio motore nel bersaglio con intenti dannosi. Ciò potrebbe addormentare il bersaglio.", - }, - noxiousTorque: { - name: "Turbotossina", - effect: "L'utilizzatore fa girare il suo motore velenoso verso il bersaglio. Ciò potrebbe anche avvelenare il bersaglio.", - }, - combatTorque: { - name: "Turborissa", - effect: "L'utente accelera con forza il proprio motore verso il bersaglio. Ciò potrebbe anche lasciare il bersaglio paralizzato.", - }, - magicalTorque: { - name: "Turboincanto", - effect: "L'utilizzatore fa girare il proprio motore fatato verso il bersaglio. Ciò potrebbe anche confondere l'obiettivo.", - }, - bloodMoon: { - name: "Luna Rossa", - effect: "Il Pokémon attacca rilasciando tutta la sua energia, confluita in una luna piena rossa come il sangue. Questa mossa non può essere usata due volte di fila.", - }, - matchaGotcha: { - name: "Spruzzatè", - effect: "Il Pokémon attacca mescolando del tè e spruzzandolo, recuperando una quantità di PS pari alla metà del danno inflitto. Può anche scottare il bersaglio.", - }, - syrupBomb: { - name: "Bomba Sciroppata", - effect: " Il Pokémon fa esplodere dello sciroppo viscoso sul bersaglio, ricoprendolo e facendogli diminuire la Velocità per tre turni.", - }, - ivyCudgel: { - name: "Clava di Liane", - effect: "Il Pokémon colpisce con una clava avvolta da liane. Il tipo della mossa varia in base alla maschera indossata. Probabile brutto colpo.", - }, - electroShot: { - name: "Elettroraggio", - effect: "Il Pokémon accumula elettricità e aumenta l'Attacco Speciale al primo turno, per poi rilasciare una potente scarica al turno successivo o, se piove, immediatamente.", - }, - teraStarstorm: { - name: "Teracluster", - effect: "Il Pokémon elimina il bersaglio irradiando il potere dei cristalli. Se Terapagos assume la Forma Astrale, la mossa infligge danni a tutti gli avversari.", - }, - fickleBeam: { - name: "Irregolaser", - effect: "Il Pokémon attacca rilasciando raggi di luce. Talvolta i laser vengono emessi da tutte le teste, contribuendo a raddoppiare la potenza della mossa.", - }, - burningBulwark: { - name: "Egida Ignea", - effect: "Il Pokémon blocca gli attacchi avversari con la pelliccia incandescente che scotta chi entra in contatto con lui.", - }, - thunderclap: { - name: "Saetta", - effect: "Il Pokémon abbatte una scarica elettrica sul bersaglio prima che questi possa attaccare. La mossa fallisce se il bersaglio sferra una mossa che non è di attacco.", - }, - mightyCleave: { - name: "Taglio Poderoso", - effect: "Il Pokémon fende il bersaglio con la luce immagazzinata nella testa, ignorando gli effetti delle mosse protettive.", - }, - tachyonCutter: { - name: "Tachiontaglio", - effect: "Il Pokémon emette delle lame particellari in successione, infliggendo danni due volte di fila. Questo attacco va sempre a segno.", - }, - hardPress: { - name: "Pressa d'Acciaio", - effect: "Il Pokémon schiaccia il bersaglio usando i propri arti. Più PS rimangono al bersaglio, maggiore è la potenza della mossa.", - }, - dragonCheer: { - name: "Grido del Drago", - effect: "Il Pokémon incita gli alleati con un inno ai draghi, aumentando la probabilità che sferrino brutti colpi. Particolarmente efficace con alleati di tipo Drago.", - }, - alluringVoice: { - name: "Ammaliavoce", - effect: "Il Pokémon attacca sfruttando il suo canto angelico, confondendo il bersaglio se le sue statistiche sono aumentate nello stesso turno.", - }, - temperFlare: { - name: "Rabbia Bruciante", - effect: "Il Pokémon attacca con l'impeto di chi è pronto a tutto. Se la mossa usata al turno precedente non è andata a segno, la potenza raddoppia.", - }, - supercellSlam: { - name: "Elettrotuffo", - effect: "Il Pokémon si schianta sul bersaglio dopo essersi elettrificato. Se la mossa fallisce, il Pokémon subisce dei danni.", - }, - psychicNoise: { - name: "Psicorumore", - effect: " l Pokémon investe il bersaglio con insopportabili onde sonore che gli impediscono di recuperare PS con mosse, abilità o strumenti che ha con sé per due turni.", - }, - upperHand: { - name: "Colpo di Mano", - effect: "Il Pokémon reagisce al movimento del bersaglio e, colpendo con il palmo, lo fa tentennare. Se il bersaglio non sferra un attacco ad alta priorità, la mossa fallisce.", - }, - malignantChain: { - name: "Intossicatena", - effect: "Il Pokémon logora il bersaglio avvolgendolo con le sue catene fatte di veleno e iniettandogli delle tossine che possono anche iperavvelenarlo.", - }, -} as const; diff --git a/src/locales/it/nature.ts b/src/locales/it/nature.json similarity index 80% rename from src/locales/it/nature.ts rename to src/locales/it/nature.json index 3c6e8b4d29f..92b64acb3ab 100644 --- a/src/locales/it/nature.ts +++ b/src/locales/it/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "Ardita", "Lonely": "Schiva", "Brave": "Audace", @@ -26,4 +24,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Vivace", "Careful": "Cauta", "Quirky": "Furba" -} as const; +} \ No newline at end of file diff --git a/src/locales/it/party-ui-handler.json b/src/locales/it/party-ui-handler.json new file mode 100644 index 00000000000..95466779727 --- /dev/null +++ b/src/locales/it/party-ui-handler.json @@ -0,0 +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", + "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/party-ui-handler.ts b/src/locales/it/party-ui-handler.ts deleted file mode 100644 index c174df03d1f..00000000000 --- a/src/locales/it/party-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Manda in campo", - "SUMMARY": "Sommario", - "CANCEL": "Annulla", - "RELEASE": "Rilascia", - "APPLY": "Applica", - "TEACH": "Insegna" -} as const; diff --git a/src/locales/it/pokeball.json b/src/locales/it/pokeball.json new file mode 100644 index 00000000000..d63f0671906 --- /dev/null +++ b/src/locales/it/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "Poké Ball", + "greatBall": "Mega Ball", + "ultraBall": "Ultra Ball", + "rogueBall": "Rogue Ball", + "masterBall": "Master Ball", + "luxuryBall": "Chic Ball" +} \ No newline at end of file diff --git a/src/locales/it/pokeball.ts b/src/locales/it/pokeball.ts deleted file mode 100644 index df556415670..00000000000 --- a/src/locales/it/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Ball", - "greatBall": "Mega Ball", - "ultraBall": "Ultra Ball", - "rogueBall": "Rogue Ball", - "masterBall": "Master Ball", - "luxuryBall": "Chic Ball", -} as const; diff --git a/src/locales/it/pokemon-form-battle.json b/src/locales/it/pokemon-form-battle.json new file mode 100644 index 00000000000..3c9b36f8150 --- /dev/null +++ b/src/locales/it/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "Archeo {{pokemonName}}", + "gigantamax": "GigaMax {{pokemonName}}", + "eternamax": "EternaMax {{pokemonName}}", + "megaChange": "{{preName}} si evolve\nin {{pokemonName}}!", + "gigantamaxChange": "{{preName}} si Gigamaxxizza\nin {{pokemonName}}!", + "eternamaxChange": "{{preName}} si Dynamaxxa infinitamente\nin {{pokemonName}}!", + "revertChange": "{{pokemonName}} è tornato\nalla sua forma originaria!", + "formChange": "{{preName}} ha cambiato forma!", + "disguiseChange": "Il costume ha assorbito l’attacco!" +} \ No newline at end of file diff --git a/src/locales/it/pokemon-form.json b/src/locales/it/pokemon-form.json new file mode 100644 index 00000000000..505173e4c8a --- /dev/null +++ b/src/locales/it/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cosplay classe", + "pikachuBeautyCosplay": "Cosplay bellezza", + "pikachuCuteCosplay": "Cosplay grazie", + "pikachuSmartCosplay": "Cosplay acume", + "pikachuToughCosplay": "Cosplay grinta", + "pikachuPartner": "Compagno", + "eeveePartner": "Compagno", + "pichuSpiky": "Spunzorek", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "Sole", + "castformRainy": "Pioggia", + "castformSnowy": "Nuvola di neve", + "deoxysNormal": "Normale", + "burmyPlant": "Pianta", + "burmySandy": "Sabbia", + "burmyTrash": "Scarti", + "shellosEast": "Est", + "shellosWest": "Ovest", + "rotomHeat": "Calore", + "rotomWash": "Lavaggio", + "rotomFrost": "Gelo", + "rotomFan": "Vortice", + "rotomMow": "Taglio", + "giratinaAltered": "Alterata", + "shayminLand": "Terra", + "basculinRedStriped": "Linearossa", + "basculinBlueStriped": "Lineablu", + "basculinWhiteStriped": "Lineabianca", + "deerlingSpring": "Primavera", + "deerlingSummer": "Estate", + "deerlingAutumn": "Autunno", + "deerlingWinter": "Inverno", + "tornadusIncarnate": "Incarnazione", + "thundurusIncarnate": "Incarnazione", + "landorusIncarnate": "Incarnazione", + "keldeoOrdinary": "Normale", + "meloettaAria": "Canto", + "meloettaPirouette": "Danza", + "froakieBattleBond": "Morfosintonia", + "scatterbugMeadow": "Giardinfiore", + "scatterbugIcySnow": "Nevi perenni", + "scatterbugPolar": "Nordico", + "scatterbugTundra": "Manto di neve", + "scatterbugContinental": "Continentale", + "scatterbugGarden": "Prato", + "scatterbugElegant": "Eleganza", + "scatterbugModern": "Trendy", + "scatterbugMarine": "Marino", + "scatterbugArchipelago": "Arcipelago", + "scatterbugHighPlains": "Deserto", + "scatterbugSandstorm": "Sabbia", + "scatterbugRiver": "Fluviale", + "scatterbugMonsoon": "Pluviale", + "scatterbugSavanna": "Savana", + "scatterbugSun": "Solare", + "scatterbugOcean": "Oceanico", + "scatterbugJungle": "Giungla", + "scatterbugFancy": "Sbarazzino", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Rosso", + "flabebeYellow": "Giallo", + "flabebeOrange": "Arancione", + "flabebeBlue": "Blu", + "flabebeWhite": "Bianco", + "furfrouHeart": "Cuore", + "furfrouStar": "Stella", + "furfrouDiamond": "Diamante", + "furfrouDebutante": "Signorina", + "furfrouMatron": "Gentildonna", + "furfrouDandy": "Gentiluomo", + "furfrouLaReine": "Regina", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Faraone", + "pumpkabooSmall": "Mini", + "pumpkabooLarge": "Grande", + "pumpkabooSuper": "Maxi", + "xerneasNeutral": "Relax", + "xerneasActive": "Attivo", + "zygarde50": "Forma 50%", + "zygarde10": "Forma 10%", + "zygarde50Pc": "Forma 50% Sciamefusione", + "zygarde10Pc": "Forma 10% Sciamefusione", + "zygardeComplete": "Forma perfetta", + "oricorioBaile": "Flamenco", + "oricorioPompom": "Cheerdance", + "oricorioPau": "Hula", + "oricorioSensu": "Buyō", + "rockruffOwnTempo": "Mentelocale", + "miniorRedMeteor": "Nucleo Rosso", + "miniorOrangeMeteor": "Nucleo Arancione", + "miniorYellowMeteor": "Nucleo Giallo", + "miniorGreenMeteor": "Nucleo Verde", + "miniorBlueMeteor": "Nucleo Azzurro", + "miniorIndigoMeteor": "Nucleo Indaco", + "miniorVioletMeteor": "Nucleo Violetto", + "miniorRed": "Rosso", + "miniorOrange": "Arancione", + "miniorYellow": "Giallo", + "miniorGreen": "Verde", + "miniorBlue": "Azzurro", + "miniorIndigo": "Indaco", + "miniorViolet": "Violetto", + "mimikyuDisguised": "Mascherata", + "mimikyuBusted": "Smascherata", + "magearnaOriginal": "Colore Antico", + "marshadowZenith": "Zenith", + "sinisteaPhony": "Contraffatta", + "sinisteaAntique": "Autentica", + "eiscueNoIce": "Liquefaccia", + "indeedeeMale": "Maschio", + "indeedeeFemale": "Femmina", + "morpekoFullBelly": "Panciapiena", + "zacianHeroOfManyBattles": "Eroe di Mille Lotte", + "zamazentaHeroOfManyBattles": "Eroe di Mille Lotte", + "zarudeDada": "Papà", + "enamorusIncarnate": "Incarnazione", + "squawkabillyGreenPlumage": "Piume Verdi", + "squawkabillyBluePlumage": "Piume Azzurre", + "squawkabillyYellowPlumage": "Piume Gialle", + "squawkabillyWhitePlumage": "Piume Bianche", + "tatsugiriCurly": "Arcuata", + "tatsugiriDroopy": "Adagiata", + "tatsugiriStretchy": "Tesa", + "gimmighoulChest": "Scrigno", + "gimmighoulRoaming": "Ambulante", + "koraidonApexBuild": "Foggia Integrale", + "koraidonLimitedBuild": "Foggia Parziale", + "koraidonSprintingBuild": "Foggia Scattante", + "koraidonSwimmingBuild": "Foggia Nautica", + "koraidonGlidingBuild": "Foggia Librata", + "miraidonUltimateMode": "Assetto Completo", + "miraidonLowPowerMode": "Assetto Limitato", + "miraidonDriveMode": "Assetto Sprint", + "miraidonAquaticMode": "Assetto Nuoto", + "miraidonGlideMode": "Assetto Planata", + "poltchageistCounterfeit": "Taroccata", + "poltchageistArtisan": "Pregiata", + "paldeaTaurosCombat": "Combattiva", + "paldeaTaurosBlaze": "Infuocata", + "paldeaTaurosAqua": "Acquatica" +} \ No newline at end of file diff --git a/src/locales/it/pokemon-info-container.json b/src/locales/it/pokemon-info-container.json new file mode 100644 index 00000000000..f3de9081ebc --- /dev/null +++ b/src/locales/it/pokemon-info-container.json @@ -0,0 +1,7 @@ +{ + "moveset": "Set di mosse", + "gender": "Genere:", + "ability": "Abilità:", + "nature": "Natura:", + "form": "Forma:" +} diff --git a/src/locales/it/pokemon-info-container.ts b/src/locales/it/pokemon-info-container.ts deleted file mode 100644 index 2d80763abc3..00000000000 --- a/src/locales/it/pokemon-info-container.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Set di mosse", - "gender": "Genere:", - "ability": "Abilità:", - "nature": "Natura:", - "epic": "Epico", - "rare": "Raro", - "common": "Comune" -} as const; diff --git a/src/locales/it/pokemon-info.ts b/src/locales/it/pokemon-info.json similarity index 78% rename from src/locales/it/pokemon-info.ts rename to src/locales/it/pokemon-info.json index 9d8780e656b..4b655dbe1ce 100644 --- a/src/locales/it/pokemon-info.ts +++ b/src/locales/it/pokemon-info.json @@ -1,7 +1,5 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { +{ + "Stat": { "HP": "PS Max", "HPshortened": "PS", "ATK": "Attacco", @@ -15,10 +13,10 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPD": "Velocità", "SPDshortened": "Vel", "ACC": "Precisione", - "EVA": "Elusione" + "EVA": "Elusione", + "HPStat": "PS" }, - - Type: { + "Type": { "UNKNOWN": "Sconosciuto", "NORMAL": "Normale", "FIGHTING": "Lotta", @@ -38,6 +36,6 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DRAGON": "Drago", "DARK": "Buio", "FAIRY": "Folletto", - "STELLAR": "Astrale", - }, -} as const; + "STELLAR": "Astrale" + } +} diff --git a/src/locales/it/pokemon-summary.json b/src/locales/it/pokemon-summary.json new file mode 100644 index 00000000000..f6c9290f783 --- /dev/null +++ b/src/locales/it/pokemon-summary.json @@ -0,0 +1,17 @@ +{ + "pokemonInfo": "Info Pokémon", + "status": "Stato", + "powerAccuracyCategory": "Potenza\nPrecisione\nCategoria", + "type": "Tipo", + "unknownTrainer": "Sconosciuto", + "ot": "AO", + "nature": "natura", + "expPoints": "Punti Esp.", + "nextLv": "Prossimo Lv.", + "cancel": "Annulla", + "memoString": "Natura {{natureFragment}},\n{{metFragment}}", + "metFragment": { + "normal": "incontrato al Lv.{{level}},\n{{biome}}.", + "apparently": "apparentemente incontrato al Lv.{{level}},\n{{biome}}." + } +} \ No newline at end of file diff --git a/src/locales/it/pokemon.json b/src/locales/it/pokemon.json new file mode 100644 index 00000000000..dcc4cc7f310 --- /dev/null +++ b/src/locales/it/pokemon.json @@ -0,0 +1,23 @@ +{ + "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/pokemon.ts b/src/locales/it/pokemon.ts deleted file mode 100644 index 8d0830aeb79..00000000000 --- a/src/locales/it/pokemon.ts +++ /dev/null @@ -1,1086 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "Bulbasaur", - "ivysaur": "Ivysaur", - "venusaur": "Venusaur", - "charmander": "Charmander", - "charmeleon": "Charmeleon", - "charizard": "Charizard", - "squirtle": "Squirtle", - "wartortle": "Wartortle", - "blastoise": "Blastoise", - "caterpie": "Caterpie", - "metapod": "Metapod", - "butterfree": "Butterfree", - "weedle": "Weedle", - "kakuna": "Kakuna", - "beedrill": "Beedrill", - "pidgey": "Pidgey", - "pidgeotto": "Pidgeotto", - "pidgeot": "Pidgeot", - "rattata": "Rattata", - "raticate": "Raticate", - "spearow": "Spearow", - "fearow": "Fearow", - "ekans": "Ekans", - "arbok": "Arbok", - "pikachu": "Pikachu", - "raichu": "Raichu", - "sandshrew": "Sandshrew", - "sandslash": "Sandslash", - "nidoran_f": "Nidoran♀", - "nidorina": "Nidorina", - "nidoqueen": "Nidoqueen", - "nidoran_m": "Nidoran♂", - "nidorino": "Nidorino", - "nidoking": "Nidoking", - "clefairy": "Clefairy", - "clefable": "Clefable", - "vulpix": "Vulpix", - "ninetales": "Ninetales", - "jigglypuff": "Jigglypuff", - "wigglytuff": "Wigglytuff", - "zubat": "Zubat", - "golbat": "Golbat", - "oddish": "Oddish", - "gloom": "Gloom", - "vileplume": "Vileplume", - "paras": "Paras", - "parasect": "Parasect", - "venonat": "Venonat", - "venomoth": "Venomoth", - "diglett": "Diglett", - "dugtrio": "Dugtrio", - "meowth": "Meowth", - "persian": "Persian", - "psyduck": "Psyduck", - "golduck": "Golduck", - "mankey": "Mankey", - "primeape": "Primeape", - "growlithe": "Growlithe", - "arcanine": "Arcanine", - "poliwag": "Poliwag", - "poliwhirl": "Poliwhirl", - "poliwrath": "Poliwrath", - "abra": "Abra", - "kadabra": "Kadabra", - "alakazam": "Alakazam", - "machop": "Machop", - "machoke": "Machoke", - "machamp": "Machamp", - "bellsprout": "Bellsprout", - "weepinbell": "Weepinbell", - "victreebel": "Victreebel", - "tentacool": "Tentacool", - "tentacruel": "Tentacruel", - "geodude": "Geodude", - "graveler": "Graveler", - "golem": "Golem", - "ponyta": "Ponyta", - "rapidash": "Rapidash", - "slowpoke": "Slowpoke", - "slowbro": "Slowbro", - "magnemite": "Magnemite", - "magneton": "Magneton", - "farfetchd": "Farfetch'd", - "doduo": "Doduo", - "dodrio": "Dodrio", - "seel": "Seel", - "dewgong": "Dewgong", - "grimer": "Grimer", - "muk": "Muk", - "shellder": "Shellder", - "cloyster": "Cloyster", - "gastly": "Gastly", - "haunter": "Haunter", - "gengar": "Gengar", - "onix": "Onix", - "drowzee": "Drowzee", - "hypno": "Hypno", - "krabby": "Krabby", - "kingler": "Kingler", - "voltorb": "Voltorb", - "electrode": "Electrode", - "exeggcute": "Exeggcute", - "exeggutor": "Exeggutor", - "cubone": "Cubone", - "marowak": "Marowak", - "hitmonlee": "Hitmonlee", - "hitmonchan": "Hitmonchan", - "lickitung": "Lickitung", - "koffing": "Koffing", - "weezing": "Weezing", - "rhyhorn": "Rhyhorn", - "rhydon": "Rhydon", - "chansey": "Chansey", - "tangela": "Tangela", - "kangaskhan": "Kangaskhan", - "horsea": "Horsea", - "seadra": "Seadra", - "goldeen": "Goldeen", - "seaking": "Seaking", - "staryu": "Staryu", - "starmie": "Starmie", - "mr_mime": "Mr. Mime", - "scyther": "Scyther", - "jynx": "Jynx", - "electabuzz": "Electabuzz", - "magmar": "Magmar", - "pinsir": "Pinsir", - "tauros": "Tauros", - "magikarp": "Magikarp", - "gyarados": "Gyarados", - "lapras": "Lapras", - "ditto": "Ditto", - "eevee": "Eevee", - "vaporeon": "Vaporeon", - "jolteon": "Jolteon", - "flareon": "Flareon", - "porygon": "Porygon", - "omanyte": "Omanyte", - "omastar": "Omastar", - "kabuto": "Kabuto", - "kabutops": "Kabutops", - "aerodactyl": "Aerodactyl", - "snorlax": "Snorlax", - "articuno": "Articuno", - "zapdos": "Zapdos", - "moltres": "Moltres", - "dratini": "Dratini", - "dragonair": "Dragonair", - "dragonite": "Dragonite", - "mewtwo": "Mewtwo", - "mew": "Mew", - "chikorita": "Chikorita", - "bayleef": "Bayleef", - "meganium": "Meganium", - "cyndaquil": "Cyndaquil", - "quilava": "Quilava", - "typhlosion": "Typhlosion", - "totodile": "Totodile", - "croconaw": "Croconaw", - "feraligatr": "Feraligatr", - "sentret": "Sentret", - "furret": "Furret", - "hoothoot": "Hoothoot", - "noctowl": "Noctowl", - "ledyba": "Ledyba", - "ledian": "Ledian", - "spinarak": "Spinarak", - "ariados": "Ariados", - "crobat": "Crobat", - "chinchou": "Chinchou", - "lanturn": "Lanturn", - "pichu": "Pichu", - "cleffa": "Cleffa", - "igglybuff": "Igglybuff", - "togepi": "Togepi", - "togetic": "Togetic", - "natu": "Natu", - "xatu": "Xatu", - "mareep": "Mareep", - "flaaffy": "Flaaffy", - "ampharos": "Ampharos", - "bellossom": "Bellossom", - "marill": "Marill", - "azumarill": "Azumarill", - "sudowoodo": "Sudowoodo", - "politoed": "Politoed", - "hoppip": "Hoppip", - "skiploom": "Skiploom", - "jumpluff": "Jumpluff", - "aipom": "Aipom", - "sunkern": "Sunkern", - "sunflora": "Sunflora", - "yanma": "Yanma", - "wooper": "Wooper", - "quagsire": "Quagsire", - "espeon": "Espeon", - "umbreon": "Umbreon", - "murkrow": "Murkrow", - "slowking": "Slowking", - "misdreavus": "Misdreavus", - "unown": "Unown", - "wobbuffet": "Wobbuffet", - "girafarig": "Girafarig", - "pineco": "Pineco", - "forretress": "Forretress", - "dunsparce": "Dunsparce", - "gligar": "Gligar", - "steelix": "Steelix", - "snubbull": "Snubbull", - "granbull": "Granbull", - "qwilfish": "Qwilfish", - "scizor": "Scizor", - "shuckle": "Shuckle", - "heracross": "Heracross", - "sneasel": "Sneasel", - "teddiursa": "Teddiursa", - "ursaring": "Ursaring", - "slugma": "Slugma", - "magcargo": "Magcargo", - "swinub": "Swinub", - "piloswine": "Piloswine", - "corsola": "Corsola", - "remoraid": "Remoraid", - "octillery": "Octillery", - "delibird": "Delibird", - "mantine": "Mantine", - "skarmory": "Skarmory", - "houndour": "Houndour", - "houndoom": "Houndoom", - "kingdra": "Kingdra", - "phanpy": "Phanpy", - "donphan": "Donphan", - "porygon2": "Porygon2", - "stantler": "Stantler", - "smeargle": "Smeargle", - "tyrogue": "Tyrogue", - "hitmontop": "Hitmontop", - "smoochum": "Smoochum", - "elekid": "Elekid", - "magby": "Magby", - "miltank": "Miltank", - "blissey": "Blissey", - "raikou": "Raikou", - "entei": "Entei", - "suicune": "Suicune", - "larvitar": "Larvitar", - "pupitar": "Pupitar", - "tyranitar": "Tyranitar", - "lugia": "Lugia", - "ho_oh": "Ho-Oh", - "celebi": "Celebi", - "treecko": "Treecko", - "grovyle": "Grovyle", - "sceptile": "Sceptile", - "torchic": "Torchic", - "combusken": "Combusken", - "blaziken": "Blaziken", - "mudkip": "Mudkip", - "marshtomp": "Marshtomp", - "swampert": "Swampert", - "poochyena": "Poochyena", - "mightyena": "Mightyena", - "zigzagoon": "Zigzagoon", - "linoone": "Linoone", - "wurmple": "Wurmple", - "silcoon": "Silcoon", - "beautifly": "Beautifly", - "cascoon": "Cascoon", - "dustox": "Dustox", - "lotad": "Lotad", - "lombre": "Lombre", - "ludicolo": "Ludicolo", - "seedot": "Seedot", - "nuzleaf": "Nuzleaf", - "shiftry": "Shiftry", - "taillow": "Taillow", - "swellow": "Swellow", - "wingull": "Wingull", - "pelipper": "Pelipper", - "ralts": "Ralts", - "kirlia": "Kirlia", - "gardevoir": "Gardevoir", - "surskit": "Surskit", - "masquerain": "Masquerain", - "shroomish": "Shroomish", - "breloom": "Breloom", - "slakoth": "Slakoth", - "vigoroth": "Vigoroth", - "slaking": "Slaking", - "nincada": "Nincada", - "ninjask": "Ninjask", - "shedinja": "Shedinja", - "whismur": "Whismur", - "loudred": "Loudred", - "exploud": "Exploud", - "makuhita": "Makuhita", - "hariyama": "Hariyama", - "azurill": "Azurill", - "nosepass": "Nosepass", - "skitty": "Skitty", - "delcatty": "Delcatty", - "sableye": "Sableye", - "mawile": "Mawile", - "aron": "Aron", - "lairon": "Lairon", - "aggron": "Aggron", - "meditite": "Meditite", - "medicham": "Medicham", - "electrike": "Electrike", - "manectric": "Manectric", - "plusle": "Plusle", - "minun": "Minun", - "volbeat": "Volbeat", - "illumise": "Illumise", - "roselia": "Roselia", - "gulpin": "Gulpin", - "swalot": "Swalot", - "carvanha": "Carvanha", - "sharpedo": "Sharpedo", - "wailmer": "Wailmer", - "wailord": "Wailord", - "numel": "Numel", - "camerupt": "Camerupt", - "torkoal": "Torkoal", - "spoink": "Spoink", - "grumpig": "Grumpig", - "spinda": "Spinda", - "trapinch": "Trapinch", - "vibrava": "Vibrava", - "flygon": "Flygon", - "cacnea": "Cacnea", - "cacturne": "Cacturne", - "swablu": "Swablu", - "altaria": "Altaria", - "zangoose": "Zangoose", - "seviper": "Seviper", - "lunatone": "Lunatone", - "solrock": "Solrock", - "barboach": "Barboach", - "whiscash": "Whiscash", - "corphish": "Corphish", - "crawdaunt": "Crawdaunt", - "baltoy": "Baltoy", - "claydol": "Claydol", - "lileep": "Lileep", - "cradily": "Cradily", - "anorith": "Anorith", - "armaldo": "Armaldo", - "feebas": "Feebas", - "milotic": "Milotic", - "castform": "Castform", - "kecleon": "Kecleon", - "shuppet": "Shuppet", - "banette": "Banette", - "duskull": "Duskull", - "dusclops": "Dusclops", - "tropius": "Tropius", - "chimecho": "Chimecho", - "absol": "Absol", - "wynaut": "Wynaut", - "snorunt": "Snorunt", - "glalie": "Glalie", - "spheal": "Spheal", - "sealeo": "Sealeo", - "walrein": "Walrein", - "clamperl": "Clamperl", - "huntail": "Huntail", - "gorebyss": "Gorebyss", - "relicanth": "Relicanth", - "luvdisc": "Luvdisc", - "bagon": "Bagon", - "shelgon": "Shelgon", - "salamence": "Salamence", - "beldum": "Beldum", - "metang": "Metang", - "metagross": "Metagross", - "regirock": "Regirock", - "regice": "Regice", - "registeel": "Registeel", - "latias": "Latias", - "latios": "Latios", - "kyogre": "Kyogre", - "groudon": "Groudon", - "rayquaza": "Rayquaza", - "jirachi": "Jirachi", - "deoxys": "Deoxys", - "turtwig": "Turtwig", - "grotle": "Grotle", - "torterra": "Torterra", - "chimchar": "Chimchar", - "monferno": "Monferno", - "infernape": "Infernape", - "piplup": "Piplup", - "prinplup": "Prinplup", - "empoleon": "Empoleon", - "starly": "Starly", - "staravia": "Staravia", - "staraptor": "Staraptor", - "bidoof": "Bidoof", - "bibarel": "Bibarel", - "kricketot": "Kricketot", - "kricketune": "Kricketune", - "shinx": "Shinx", - "luxio": "Luxio", - "luxray": "Luxray", - "budew": "Budew", - "roserade": "Roserade", - "cranidos": "Cranidos", - "rampardos": "Rampardos", - "shieldon": "Shieldon", - "bastiodon": "Bastiodon", - "burmy": "Burmy", - "wormadam": "Wormadam", - "mothim": "Mothim", - "combee": "Combee", - "vespiquen": "Vespiquen", - "pachirisu": "Pachirisu", - "buizel": "Buizel", - "floatzel": "Floatzel", - "cherubi": "Cherubi", - "cherrim": "Cherrim", - "shellos": "Shellos", - "gastrodon": "Gastrodon", - "ambipom": "Ambipom", - "drifloon": "Drifloon", - "drifblim": "Drifblim", - "buneary": "Buneary", - "lopunny": "Lopunny", - "mismagius": "Mismagius", - "honchkrow": "Honchkrow", - "glameow": "Glameow", - "purugly": "Purugly", - "chingling": "Chingling", - "stunky": "Stunky", - "skuntank": "Skuntank", - "bronzor": "Bronzor", - "bronzong": "Bronzong", - "bonsly": "Bonsly", - "mime_jr": "Mime Jr.", - "happiny": "Happiny", - "chatot": "Chatot", - "spiritomb": "Spiritomb", - "gible": "Gible", - "gabite": "Gabite", - "garchomp": "Garchomp", - "munchlax": "Munchlax", - "riolu": "Riolu", - "lucario": "Lucario", - "hippopotas": "Hippopotas", - "hippowdon": "Hippowdon", - "skorupi": "Skorupi", - "drapion": "Drapion", - "croagunk": "Croagunk", - "toxicroak": "Toxicroak", - "carnivine": "Carnivine", - "finneon": "Finneon", - "lumineon": "Lumineon", - "mantyke": "Mantyke", - "snover": "Snover", - "abomasnow": "Abomasnow", - "weavile": "Weavile", - "magnezone": "Magnezone", - "lickilicky": "Lickilicky", - "rhyperior": "Rhyperior", - "tangrowth": "Tangrowth", - "electivire": "Electivire", - "magmortar": "Magmortar", - "togekiss": "Togekiss", - "yanmega": "Yanmega", - "leafeon": "Leafeon", - "glaceon": "Glaceon", - "gliscor": "Gliscor", - "mamoswine": "Mamoswine", - "porygon_z": "Porygon-Z", - "gallade": "Gallade", - "probopass": "Probopass", - "dusknoir": "Dusknoir", - "froslass": "Froslass", - "rotom": "Rotom", - "uxie": "Uxie", - "mesprit": "Mesprit", - "azelf": "Azelf", - "dialga": "Dialga", - "palkia": "Palkia", - "heatran": "Heatran", - "regigigas": "Regigigas", - "giratina": "Giratina", - "cresselia": "Cresselia", - "phione": "Phione", - "manaphy": "Manaphy", - "darkrai": "Darkrai", - "shaymin": "Shaymin", - "arceus": "Arceus", - "victini": "Victini", - "snivy": "Snivy", - "servine": "Servine", - "serperior": "Serperior", - "tepig": "Tepig", - "pignite": "Pignite", - "emboar": "Emboar", - "oshawott": "Oshawott", - "dewott": "Dewott", - "samurott": "Samurott", - "patrat": "Patrat", - "watchog": "Watchog", - "lillipup": "Lillipup", - "herdier": "Herdier", - "stoutland": "Stoutland", - "purrloin": "Purrloin", - "liepard": "Liepard", - "pansage": "Pansage", - "simisage": "Simisage", - "pansear": "Pansear", - "simisear": "Simisear", - "panpour": "Panpour", - "simipour": "Simipour", - "munna": "Munna", - "musharna": "Musharna", - "pidove": "Pidove", - "tranquill": "Tranquill", - "unfezant": "Unfezant", - "blitzle": "Blitzle", - "zebstrika": "Zebstrika", - "roggenrola": "Roggenrola", - "boldore": "Boldore", - "gigalith": "Gigalith", - "woobat": "Woobat", - "swoobat": "Swoobat", - "drilbur": "Drilbur", - "excadrill": "Excadrill", - "audino": "Audino", - "timburr": "Timburr", - "gurdurr": "Gurdurr", - "conkeldurr": "Conkeldurr", - "tympole": "Tympole", - "palpitoad": "Palpitoad", - "seismitoad": "Seismitoad", - "throh": "Throh", - "sawk": "Sawk", - "sewaddle": "Sewaddle", - "swadloon": "Swadloon", - "leavanny": "Leavanny", - "venipede": "Venipede", - "whirlipede": "Whirlipede", - "scolipede": "Scolipede", - "cottonee": "Cottonee", - "whimsicott": "Whimsicott", - "petilil": "Petilil", - "lilligant": "Lilligant", - "basculin": "Basculin", - "sandile": "Sandile", - "krokorok": "Krokorok", - "krookodile": "Krookodile", - "darumaka": "Darumaka", - "darmanitan": "Darmanitan", - "maractus": "Maractus", - "dwebble": "Dwebble", - "crustle": "Crustle", - "scraggy": "Scraggy", - "scrafty": "Scrafty", - "sigilyph": "Sigilyph", - "yamask": "Yamask", - "cofagrigus": "Cofagrigus", - "tirtouga": "Tirtouga", - "carracosta": "Carracosta", - "archen": "Archen", - "archeops": "Archeops", - "trubbish": "Trubbish", - "garbodor": "Garbodor", - "zorua": "Zorua", - "zoroark": "Zoroark", - "minccino": "Minccino", - "cinccino": "Cinccino", - "gothita": "Gothita", - "gothorita": "Gothorita", - "gothitelle": "Gothitelle", - "solosis": "Solosis", - "duosion": "Duosion", - "reuniclus": "Reuniclus", - "ducklett": "Ducklett", - "swanna": "Swanna", - "vanillite": "Vanillite", - "vanillish": "Vanillish", - "vanilluxe": "Vanilluxe", - "deerling": "Deerling", - "sawsbuck": "Sawsbuck", - "emolga": "Emolga", - "karrablast": "Karrablast", - "escavalier": "Escavalier", - "foongus": "Foongus", - "amoonguss": "Amoonguss", - "frillish": "Frillish", - "jellicent": "Jellicent", - "alomomola": "Alomomola", - "joltik": "Joltik", - "galvantula": "Galvantula", - "ferroseed": "Ferroseed", - "ferrothorn": "Ferrothorn", - "klink": "Klink", - "klang": "Klang", - "klinklang": "Klinklang", - "tynamo": "Tynamo", - "eelektrik": "Eelektrik", - "eelektross": "Eelektross", - "elgyem": "Elgyem", - "beheeyem": "Beheeyem", - "litwick": "Litwick", - "lampent": "Lampent", - "chandelure": "Chandelure", - "axew": "Axew", - "fraxure": "Fraxure", - "haxorus": "Haxorus", - "cubchoo": "Cubchoo", - "beartic": "Beartic", - "cryogonal": "Cryogonal", - "shelmet": "Shelmet", - "accelgor": "Accelgor", - "stunfisk": "Stunfisk", - "mienfoo": "Mienfoo", - "mienshao": "Mienshao", - "druddigon": "Druddigon", - "golett": "Golett", - "golurk": "Golurk", - "pawniard": "Pawniard", - "bisharp": "Bisharp", - "bouffalant": "Bouffalant", - "rufflet": "Rufflet", - "braviary": "Braviary", - "vullaby": "Vullaby", - "mandibuzz": "Mandibuzz", - "heatmor": "Heatmor", - "durant": "Durant", - "deino": "Deino", - "zweilous": "Zweilous", - "hydreigon": "Hydreigon", - "larvesta": "Larvesta", - "volcarona": "Volcarona", - "cobalion": "Cobalion", - "terrakion": "Terrakion", - "virizion": "Virizion", - "tornadus": "Tornadus", - "thundurus": "Thundurus", - "reshiram": "Reshiram", - "zekrom": "Zekrom", - "landorus": "Landorus", - "kyurem": "Kyurem", - "keldeo": "Keldeo", - "meloetta": "Meloetta", - "genesect": "Genesect", - "chespin": "Chespin", - "quilladin": "Quilladin", - "chesnaught": "Chesnaught", - "fennekin": "Fennekin", - "braixen": "Braixen", - "delphox": "Delphox", - "froakie": "Froakie", - "frogadier": "Frogadier", - "greninja": "Greninja", - "bunnelby": "Bunnelby", - "diggersby": "Diggersby", - "fletchling": "Fletchling", - "fletchinder": "Fletchinder", - "talonflame": "Talonflame", - "scatterbug": "Scatterbug", - "spewpa": "Spewpa", - "vivillon": "Vivillon", - "litleo": "Litleo", - "pyroar": "Pyroar", - "flabebe": "Flabébé", - "floette": "Floette", - "florges": "Florges", - "skiddo": "Skiddo", - "gogoat": "Gogoat", - "pancham": "Pancham", - "pangoro": "Pangoro", - "furfrou": "Furfrou", - "espurr": "Espurr", - "meowstic": "Meowstic", - "honedge": "Honedge", - "doublade": "Doublade", - "aegislash": "Aegislash", - "spritzee": "Spritzee", - "aromatisse": "Aromatisse", - "swirlix": "Swirlix", - "slurpuff": "Slurpuff", - "inkay": "Inkay", - "malamar": "Malamar", - "binacle": "Binacle", - "barbaracle": "Barbaracle", - "skrelp": "Skrelp", - "dragalge": "Dragalge", - "clauncher": "Clauncher", - "clawitzer": "Clawitzer", - "helioptile": "Helioptile", - "heliolisk": "Heliolisk", - "tyrunt": "Tyrunt", - "tyrantrum": "Tyrantrum", - "amaura": "Amaura", - "aurorus": "Aurorus", - "sylveon": "Sylveon", - "hawlucha": "Hawlucha", - "dedenne": "Dedenne", - "carbink": "Carbink", - "goomy": "Goomy", - "sliggoo": "Sliggoo", - "goodra": "Goodra", - "klefki": "Klefki", - "phantump": "Phantump", - "trevenant": "Trevenant", - "pumpkaboo": "Pumpkaboo", - "gourgeist": "Gourgeist", - "bergmite": "Bergmite", - "avalugg": "Avalugg", - "noibat": "Noibat", - "noivern": "Noivern", - "xerneas": "Xerneas", - "yveltal": "Yveltal", - "zygarde": "Zygarde", - "diancie": "Diancie", - "hoopa": "Hoopa", - "volcanion": "Volcanion", - "rowlet": "Rowlet", - "dartrix": "Dartrix", - "decidueye": "Decidueye", - "litten": "Litten", - "torracat": "Torracat", - "incineroar": "Incineroar", - "popplio": "Popplio", - "brionne": "Brionne", - "primarina": "Primarina", - "pikipek": "Pikipek", - "trumbeak": "Trumbeak", - "toucannon": "Toucannon", - "yungoos": "Yungoos", - "gumshoos": "Gumshoos", - "grubbin": "Grubbin", - "charjabug": "Charjabug", - "vikavolt": "Vikavolt", - "crabrawler": "Crabrawler", - "crabominable": "Crabominable", - "oricorio": "Oricorio", - "cutiefly": "Cutiefly", - "ribombee": "Ribombee", - "rockruff": "Rockruff", - "lycanroc": "Lycanroc", - "wishiwashi": "Wishiwashi", - "mareanie": "Mareanie", - "toxapex": "Toxapex", - "mudbray": "Mudbray", - "mudsdale": "Mudsdale", - "dewpider": "Dewpider", - "araquanid": "Araquanid", - "fomantis": "Fomantis", - "lurantis": "Lurantis", - "morelull": "Morelull", - "shiinotic": "Shiinotic", - "salandit": "Salandit", - "salazzle": "Salazzle", - "stufful": "Stufful", - "bewear": "Bewear", - "bounsweet": "Bounsweet", - "steenee": "Steenee", - "tsareena": "Tsareena", - "comfey": "Comfey", - "oranguru": "Oranguru", - "passimian": "Passimian", - "wimpod": "Wimpod", - "golisopod": "Golisopod", - "sandygast": "Sandygast", - "palossand": "Palossand", - "pyukumuku": "Pyukumuku", - "type_null": "Tipo Zero", - "silvally": "Silvally", - "minior": "Minior", - "komala": "Komala", - "turtonator": "Turtonator", - "togedemaru": "Togedemaru", - "mimikyu": "Mimikyu", - "bruxish": "Bruxish", - "drampa": "Drampa", - "dhelmise": "Dhelmise", - "jangmo_o": "Jangmo-o", - "hakamo_o": "Hakamo-o", - "kommo_o": "Kommo-o", - "tapu_koko": "Tapu Koko", - "tapu_lele": "Tapu Lele", - "tapu_bulu": "Tapu Bulu", - "tapu_fini": "Tapu Fini", - "cosmog": "Cosmog", - "cosmoem": "Cosmoem", - "solgaleo": "Solgaleo", - "lunala": "Lunala", - "nihilego": "Nihilego", - "buzzwole": "Buzzwole", - "pheromosa": "Pheromosa", - "xurkitree": "Xurkitree", - "celesteela": "Celesteela", - "kartana": "Kartana", - "guzzlord": "Guzzlord", - "necrozma": "Necrozma", - "magearna": "Magearna", - "marshadow": "Marshadow", - "poipole": "Poipole", - "naganadel": "Naganadel", - "stakataka": "Stakataka", - "blacephalon": "Blacephalon", - "zeraora": "Zeraora", - "meltan": "Meltan", - "melmetal": "Melmetal", - "grookey": "Grookey", - "thwackey": "Thwackey", - "rillaboom": "Rillaboom", - "scorbunny": "Scorbunny", - "raboot": "Raboot", - "cinderace": "Cinderace", - "sobble": "Sobble", - "drizzile": "Drizzile", - "inteleon": "Inteleon", - "skwovet": "Skwovet", - "greedent": "Greedent", - "rookidee": "Rookidee", - "corvisquire": "Corvisquire", - "corviknight": "Corviknight", - "blipbug": "Blipbug", - "dottler": "Dottler", - "orbeetle": "Orbeetle", - "nickit": "Nickit", - "thievul": "Thievul", - "gossifleur": "Gossifleur", - "eldegoss": "Eldegoss", - "wooloo": "Wooloo", - "dubwool": "Dubwool", - "chewtle": "Chewtle", - "drednaw": "Drednaw", - "yamper": "Yamper", - "boltund": "Boltund", - "rolycoly": "Rolycoly", - "carkol": "Carkol", - "coalossal": "Coalossal", - "applin": "Applin", - "flapple": "Flapple", - "appletun": "Appletun", - "silicobra": "Silicobra", - "sandaconda": "Sandaconda", - "cramorant": "Cramorant", - "arrokuda": "Arrokuda", - "barraskewda": "Barraskewda", - "toxel": "Toxel", - "toxtricity": "Toxtricity", - "sizzlipede": "Sizzlipede", - "centiskorch": "Centiskorch", - "clobbopus": "Clobbopus", - "grapploct": "Grapploct", - "sinistea": "Sinistea", - "polteageist": "Polteageist", - "hatenna": "Hatenna", - "hattrem": "Hattrem", - "hatterene": "Hatterene", - "impidimp": "Impidimp", - "morgrem": "Morgrem", - "grimmsnarl": "Grimmsnarl", - "obstagoon": "Obstagoon", - "perrserker": "Perrserker", - "cursola": "Cursola", - "sirfetchd": "Sirfetch'd", - "mr_rime": "Mr. Rime", - "runerigus": "Runerigus", - "milcery": "Milcery", - "alcremie": "Alcremie", - "falinks": "Falinks", - "pincurchin": "Pincurchin", - "snom": "Snom", - "frosmoth": "Frosmoth", - "stonjourner": "Stonjourner", - "eiscue": "Eiscue", - "indeedee": "Indeedee", - "morpeko": "Morpeko", - "cufant": "Cufant", - "copperajah": "Copperajah", - "dracozolt": "Dracozolt", - "arctozolt": "Arctozolt", - "dracovish": "Dracovish", - "arctovish": "Arctovish", - "duraludon": "Duraludon", - "dreepy": "Dreepy", - "drakloak": "Drakloak", - "dragapult": "Dragapult", - "zacian": "Zacian", - "zamazenta": "Zamazenta", - "eternatus": "Eternatus", - "kubfu": "Kubfu", - "urshifu": "Urshifu", - "zarude": "Zarude", - "regieleki": "Regieleki", - "regidrago": "Regidrago", - "glastrier": "Glastrier", - "spectrier": "Spectrier", - "calyrex": "Calyrex", - "wyrdeer": "Wyrdeer", - "kleavor": "Kleavor", - "ursaluna": "Ursaluna", - "basculegion": "Basculegion", - "sneasler": "Sneasler", - "overqwil": "Overqwil", - "enamorus": "Enamorus", - "sprigatito": "Sprigatito", - "floragato": "Floragato", - "meowscarada": "Meowscarada", - "fuecoco": "Fuecoco", - "crocalor": "Crocalor", - "skeledirge": "Skeledirge", - "quaxly": "Quaxly", - "quaxwell": "Quaxwell", - "quaquaval": "Quaquaval", - "lechonk": "Lechonk", - "oinkologne": "Oinkologne", - "tarountula": "Tarountula", - "spidops": "Spidops", - "nymble": "Nymble", - "lokix": "Lokix", - "pawmi": "Pawmi", - "pawmo": "Pawmo", - "pawmot": "Pawmot", - "tandemaus": "Tandemaus", - "maushold": "Maushold", - "fidough": "Fidough", - "dachsbun": "Dachsbun", - "smoliv": "Smoliv", - "dolliv": "Dolliv", - "arboliva": "Arboliva", - "squawkabilly": "Squawkabilly", - "nacli": "Nacli", - "naclstack": "Naclstack", - "garganacl": "Garganacl", - "charcadet": "Charcadet", - "armarouge": "Armarouge", - "ceruledge": "Ceruledge", - "tadbulb": "Tadbulb", - "bellibolt": "Bellibolt", - "wattrel": "Wattrel", - "kilowattrel": "Kilowattrel", - "maschiff": "Maschiff", - "mabosstiff": "Mabosstiff", - "shroodle": "Shroodle", - "grafaiai": "Grafaiai", - "bramblin": "Bramblin", - "brambleghast": "Brambleghast", - "toedscool": "Toedscool", - "toedscruel": "Toedscruel", - "klawf": "Klawf", - "capsakid": "Capsakid", - "scovillain": "Scovillain", - "rellor": "Rellor", - "rabsca": "Rabsca", - "flittle": "Flittle", - "espathra": "Espathra", - "tinkatink": "Tinkatink", - "tinkatuff": "Tinkatuff", - "tinkaton": "Tinkaton", - "wiglett": "Wiglett", - "wugtrio": "Wugtrio", - "bombirdier": "Bombirdier", - "finizen": "Finizen", - "palafin": "Palafin", - "varoom": "Varoom", - "revavroom": "Revavroom", - "cyclizar": "Cyclizar", - "orthworm": "Orthworm", - "glimmet": "Glimmet", - "glimmora": "Glimmora", - "greavard": "Greavard", - "houndstone": "Houndstone", - "flamigo": "Flamigo", - "cetoddle": "Cetoddle", - "cetitan": "Cetitan", - "veluza": "Veluza", - "dondozo": "Dondozo", - "tatsugiri": "Tatsugiri", - "annihilape": "Annihilape", - "clodsire": "Clodsire", - "farigiraf": "Farigiraf", - "dudunsparce": "Dudunsparce", - "kingambit": "Kingambit", - "great_tusk": "Grandizanne", - "scream_tail": "Codaurlante", - "brute_bonnet": "Fungofurioso", - "flutter_mane": "Crinealato", - "slither_wing": "Alirasenti", - "sandy_shocks": "Peldisabbia", - "iron_treads": "Solcoferreo", - "iron_bundle": "Saccoferreo", - "iron_hands": "Manoferrea", - "iron_jugulis": "Colloferreo", - "iron_moth": "Falenaferrea", - "iron_thorns": "Spineferree", - "frigibax": "Frigibax", - "arctibax": "Arctibax", - "baxcalibur": "Baxcalibur", - "gimmighoul": "Gimmighoul", - "gholdengo": "Gholdengo", - "wo_chien": "Wo-Chien", - "chien_pao": "Chien-Pao", - "ting_lu": "Ting-Lu", - "chi_yu": "Chi-Yu", - "roaring_moon": "Lunaruggente", - "iron_valiant": "Eroeferreo", - "koraidon": "Koraidon", - "miraidon": "Miraidon", - "walking_wake": "Acquecrespe", - "iron_leaves": "Fogliaferrea", - "dipplin": "Dipplin", - "poltchageist": "Poltchageist", - "sinistcha": "Sinistcha", - "okidogi": "Okidogi", - "munkidori": "Munkidori", - "fezandipiti": "Fezandipiti", - "ogerpon": "Ogerpon", - "archaludon": "Archaludon", - "hydrapple": "Hydrapple", - "gouging_fire": "Vampeaguzze", - "raging_bolt": "Furiatonante", - "iron_boulder": "Massoferreo", - "iron_crown": "Capoferreo", - "terapagos": "Terapagos", - "pecharunt": "Pecharunt", - "alola_rattata": "Rattata", - "alola_raticate": "Raticate", - "alola_raichu": "Raichu", - "alola_sandshrew": "Sandshrew", - "alola_sandslash": "Sandslash", - "alola_vulpix": "Vulpix", - "alola_ninetales": "Ninetales", - "alola_diglett": "Diglett", - "alola_dugtrio": "Dugtrio", - "alola_meowth": "Meowth", - "alola_persian": "Persian", - "alola_geodude": "Geodude", - "alola_graveler": "Graveler", - "alola_golem": "Golem", - "alola_grimer": "Grimer", - "alola_muk": "Muk", - "alola_exeggutor": "Exeggutor", - "alola_marowak": "Marowak", - "eternal_floette": "Floette", - "galar_meowth": "Meowth", - "galar_ponyta": "Ponyta", - "galar_rapidash": "Rapidash", - "galar_slowpoke": "Slowpoke", - "galar_slowbro": "Slowbro", - "galar_farfetchd": "Farfetch'd", - "galar_weezing": "Weezing", - "galar_mr_mime": "Mr. Mime", - "galar_articuno": "Articuno", - "galar_zapdos": "Zapdos", - "galar_moltres": "Moltres", - "galar_slowking": "Slowking", - "galar_corsola": "Corsola", - "galar_zigzagoon": "Zigzagoon", - "galar_linoone": "Linoone", - "galar_darumaka": "Darumaka", - "galar_darmanitan": "Darmanitan", - "galar_yamask": "Yamask", - "galar_stunfisk": "Stunfisk", - "hisui_growlithe": "Growlithe", - "hisui_arcanine": "Arcanine", - "hisui_voltorb": "Voltorb", - "hisui_electrode": "Electrode", - "hisui_typhlosion": "Typhlosion", - "hisui_qwilfish": "Qwilfish", - "hisui_sneasel": "Sneasel", - "hisui_samurott": "Samurott", - "hisui_lilligant": "Lilligant", - "hisui_zorua": "Zorua", - "hisui_zoroark": "Zoroark", - "hisui_braviary": "Braviary", - "hisui_sliggoo": "Sliggoo", - "hisui_goodra": "Goodra", - "hisui_avalugg": "Avalugg", - "hisui_decidueye": "Decidueye", - "paldea_tauros": "Tauros", - "paldea_wooper": "Wooper", - "bloodmoon_ursaluna": "Ursaluna", -} as const; diff --git a/src/locales/it/run-history.json b/src/locales/it/run-history.json new file mode 100644 index 00000000000..87f5a746303 --- /dev/null +++ b/src/locales/it/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "Vittoria!", + "defeatedWild": "Sconfitto da ", + "defeatedTrainer": "Sconfitto da ", + "defeatedTrainerDouble": "Sconfitto dalla coppia ", + "defeatedRival": "Sconfitto dalla rivale", + "defeated": "Sconfitto", + "defeatedWild_female": "Sconfitta da ", + "defeatedTrainer_female": "Sconfitta da ", + "defeatedTrainerDouble_female": "Sconfitta dalla coppia ", + "defeatedRival_female": "Sconfitta dal rivale", + "defeated_female": "Sconfitta", + "luck": "Fortuna", + "score": "Punteggio", + "mode": "Modalità", + "challengeRules": "Regola/e", + "challengeMonoGen1": "1ª gen", + "challengeMonoGen2": "2ª gen", + "challengeMonoGen3": "3ª gen", + "challengeMonoGen4": "4ª gen", + "challengeMonoGen5": "5ª gen", + "challengeMonoGen6": "6ª gen", + "challengeMonoGen7": "7ª gen", + "challengeMonoGen8": "8ª gen", + "challengeMonoGen9": "9ª gen", + "playerItems": "Oggetti giocatore", + "personalBest": "Record personale!", + "SPDshortened": "Vel.", + "runInfo": "Info Run", + "money": "Patrimonio", + "runLength": "Durata Run", + "viewHeldItems": "Oggetti equip.", + "hallofFameText": "Benvenuto alla Sala d'Onore!", + "hallofFameText_female": "Benvenuto alla Sala d'Onore!", + "viewHallOfFame": "Vai alla Sala d'Onore!", + "viewEndingSplash": "Vai all'arte finale!" +} \ No newline at end of file diff --git a/src/locales/it/save-slot-select-ui-handler.json b/src/locales/it/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..bd2f12003de --- /dev/null +++ b/src/locales/it/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "Sovrascrivere i dati nello slot selezionato?", + "loading": "Caricamento...", + "wave": "Onda", + "lv": "Lv", + "empty": "Vuoto" +} \ No newline at end of file diff --git a/src/locales/it/save-slot-select-ui-handler.ts b/src/locales/it/save-slot-select-ui-handler.ts deleted file mode 100644 index d1825daeb1f..00000000000 --- a/src/locales/it/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Sovrascrivere i dati nello slot selezionato?", - "loading": "Caricamento...", - "wave": "Onda", - "lv": "Lv", - "empty": "Vuoto", -} as const; diff --git a/src/locales/it/settings.json b/src/locales/it/settings.json new file mode 100644 index 00000000000..c09f5e22d4d --- /dev/null +++ b/src/locales/it/settings.json @@ -0,0 +1,15 @@ +{ + "boy": "Ragazzo", + "girl": "Ragazza", + "general": "Generale", + "uiVolume": "Volume UI ", + "gamepadSupport": "Supporto Gamepad", + "showBgmBar": "Mostra Nomi Musica", + "moveTouchControls": "Move Touch Controls", + "shopOverlayOpacity": "Opacità Finestra Negozio", + "shopCursorTarget": "Target Cursore Negozio", + "rewards": "Oggetti", + "reroll": "Rerolla", + "shop": "Negozio", + "checkTeam": "Squadra" +} diff --git a/src/locales/it/settings.ts b/src/locales/it/settings.ts deleted file mode 100644 index af48368aeeb..00000000000 --- a/src/locales/it/settings.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { - "boy": "Ragazzo", - "girl": "Ragazza", - "general": "General", - "display": "Display", - "audio": "Audio", - "gamepad": "Gamepad", - "keyboard": "Keyboard", - "gameSpeed": "Game Speed", - "hpBarSpeed": "HP Bar Speed", - "expGainsSpeed": "EXP Gains Speed", - "expPartyDisplay": "Show EXP Party", - "skipSeenDialogues": "Skip Seen Dialogues", - "battleStyle": "Battle Style", - "enableRetries": "Enable Retries", - "tutorials": "Tutorials", - "touchControls": "Touch Controls", - "vibrations": "Vibrations", - "normal": "Normal", - "fast": "Fast", - "faster": "Faster", - "skip": "Skip", - "levelUpNotifications": "Level Up Notifications", - "on": "On", - "off": "Off", - "switch": "Switch", - "set": "Set", - "auto": "Auto", - "disabled": "Disabled", - "language": "Language", - "change": "Change", - "uiTheme": "UI Theme", - "default": "Default", - "legacy": "Legacy", - "windowType": "Window Type", - "moneyFormat": "Money Format", - "damageNumbers": "Damage Numbers", - "simple": "Simple", - "fancy": "Fancy", - "abbreviated": "Abbreviated", - "moveAnimations": "Move Animations", - "showStatsOnLevelUp": "Show Stats on Level Up", - "candyUpgradeNotification": "Candy Upgrade Notification", - "passivesOnly": "Passives Only", - "candyUpgradeDisplay": "Candy Upgrade Display", - "icon": "Icon", - "animation": "Animation", - "moveInfo": "Move Info", - "showMovesetFlyout": "Show Moveset Flyout", - "showArenaFlyout": "Show Arena Flyout", - "showTimeOfDayWidget": "Show Time of Day Widget", - "timeOfDayAnimation": "Time of Day Animation", - "bounce": "Bounce", - "timeOfDay_back": "Back", - "spriteSet": "Sprite Set", - "consistent": "Consistent", - "mixedAnimated": "Mixed Animated", - "fusionPaletteSwaps": "Fusion Palette Swaps", - "playerGender": "Player Gender", - "typeHints": "Type Hints", - "masterVolume": "Master Volume", - "bgmVolume": "BGM Volume", - "seVolume": "SE Volume", - "musicPreference": "Music Preference", - "mixed": "Mixed", - "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", - "delete": "Delete", - "keyboardPleasePress": "Please Press a Key on Your Keyboard", - "reset": "Reset", - "requireReload": "Reload Required", - "action": "Action", - "back": "Back", - "pressToBind": "Press to Bind", - "pressButton": "Press a Button...", - "buttonUp": "Up", - "buttonDown": "Down", - "buttonLeft": "Left", - "buttonRight": "Right", - "buttonAction": "Action", - "buttonMenu": "Menu", - "buttonSubmit": "Submit", - "buttonCancel": "Cancel", - "buttonStats": "Stats", - "buttonCycleForm": "Cycle Form", - "buttonCycleShiny": "Cycle Shiny", - "buttonCycleGender": "Cycle Gender", - "buttonCycleAbility": "Cycle Ability", - "buttonCycleNature": "Cycle Nature", - "buttonCycleVariant": "Cycle Variant", - "buttonSpeedUp": "Speed Up", - "buttonSlowDown": "Slow Down", - "alt": " (Alt)", - "mute": "Mute", - "controller": "Controller", - "gamepadSupport": "Gamepad Support", - "showBgmBar": "Show Music Names", -} as const; diff --git a/src/locales/it/splash-messages.ts b/src/locales/it/splash-messages.json similarity index 92% rename from src/locales/it/splash-messages.ts rename to src/locales/it/splash-messages.json index eeb71842094..55018d0ada0 100644 --- a/src/locales/it/splash-messages.ts +++ b/src/locales/it/splash-messages.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { +{ "battlesWon": "Battaglie Vinte!", "joinTheDiscord": "Entra nel Discord!", "infiniteLevels": "Livelli Infiniti!", @@ -34,4 +32,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Prova anche Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", -} as const; + "breedersInSpace": "Allevapokémon nello spazio!" +} \ No newline at end of file diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.json similarity index 69% rename from src/locales/it/starter-select-ui-handler.ts rename to src/locales/it/starter-select-ui-handler.json index c84334fcd6a..04137993d33 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.json @@ -1,12 +1,7 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"Vuoi iniziare con questi Pokémon?", +{ + "confirmStartTeam": "Vuoi iniziare con questi Pokémon?", + "confirmExit": "Vuoi tornare alla schermata principale?", + "invalidParty": "Questo squadra iniziale non è valida!", "gen1": "1ª", "gen2": "2ª", "gen3": "3ª", @@ -22,14 +17,17 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Natura:", "eggMoves": "Mosse da uova", "addToParty": "Aggiungi al gruppo", + "removeFromParty": "Rimuovi dal gruppo", "toggleIVs": "Vedi/Nascondi IV", "manageMoves": "Gestisci mosse", "manageNature": "Gestisci natura", + "addToFavorites": "Aggiungi ai preferiti", + "removeFromFavorites": "Rimuovi dai preferiti", "useCandies": "Usa caramelle", "selectNature": "Seleziona natura.", "selectMoveSwapOut": "Seleziona una mossa da scambiare.", "selectMoveSwapWith": "Seleziona una mossa da scambiare con", - "sameSpeciesEgg": "Buy an Egg", + "sameSpeciesEgg": "Compra un uovo", "unlockPassive": "Sblocca passiva", "reduceCost": "Riduci costo", "cycleShiny": ": Shiny", @@ -38,9 +36,10 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "cycleAbility": ": Abilità", "cycleNature": ": Natura", "cycleVariant": ": Variante", + "goFilter": ": Vai ai filtri", "enablePassive": "Attiva passiva", "disablePassive": "Disattiva passiva", "locked": "Bloccato", "disabled": "Disabilitato", "uncaught": "Non catturato" -}; +} \ No newline at end of file diff --git a/src/locales/it/status-effect.json b/src/locales/it/status-effect.json new file mode 100644 index 00000000000..6270bbb10a5 --- /dev/null +++ b/src/locales/it/status-effect.json @@ -0,0 +1,11 @@ +{ + "none": { + "name": "None", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + } +} \ No newline at end of file diff --git a/src/locales/it/status-effect.ts b/src/locales/it/status-effect.ts deleted file mode 100644 index 1a402ac30fd..00000000000 --- a/src/locales/it/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "None", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "Poison", - description: "poisoning", - obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", - overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", - heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" - }, - toxic: { - name: "Toxic", - description: "poisoning", - obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", - overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", - heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" - }, - paralysis: { - name: "Paralysis", - description: "paralysis", - obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", - obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}},\nIt may be unable to move!", - activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", - overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", - heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" - }, - sleep: { - name: "Sleep", - description: "sleep", - obtain: "{{pokemonNameWithAffix}}\nfell asleep!", - obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is fast asleep.", - overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", - heal: "{{pokemonNameWithAffix}} woke up!" - }, - freeze: { - name: "Freeze", - description: "freezing", - obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", - obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", - overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", - heal: "{{pokemonNameWithAffix}} was\ndefrosted!" - }, - burn: { - name: "Burn", - description: "burn", - obtain: "{{pokemonNameWithAffix}}\nwas burned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", - overlap: "{{pokemonNameWithAffix}} is\nalready burned!", - heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" - }, -} as const; diff --git a/src/locales/it/terrain.json b/src/locales/it/terrain.json new file mode 100644 index 00000000000..d0a584d74ab --- /dev/null +++ b/src/locales/it/terrain.json @@ -0,0 +1,16 @@ +{ + "misty": "Nebbioso", + "mistyStartMessage": "Ai piedi dei Pokémon si addensa la nebbia.", + "mistyClearMessage": "La nebbia si dissolve.", + "mistyBlockMessage": "Il Campo Nebbioso protegge {{pokemonNameWithAffix}}!", + "electric": "Elettrico", + "electricStartMessage": "Ai piedi dei Pokémon si accumula dell’elettricità.", + "electricClearMessage": "L’elettricità svanisce.", + "grassy": "Erboso", + "grassyStartMessage": "Ai piedi dei Pokémon cresce rigogliosa l’erba.", + "grassyClearMessage": "L’erba sparisce.", + "psychic": "Psichico", + "psychicStartMessage": "Nel campo si avverte una strana sensazione...", + "psychicClearMessage": "La strana sensazione nel campo è svanita!", + "defaultBlockMessage": "Il Campo {{terrainName}} protegge {{pokemonNameWithAffix}}!" +} diff --git a/src/locales/it/trainer-classes.json b/src/locales/it/trainer-classes.json new file mode 100644 index 00000000000..205a7c59d42 --- /dev/null +++ b/src/locales/it/trainer-classes.json @@ -0,0 +1,130 @@ +{ + "ace_trainer": "Fantallenatore", + "ace_trainer_female": "Fantallenatrice", + "ace_duo": "Fantallenatori", + "artist": "Artista", + "artist_female": "Artista", + "backers": "Fan", + "backpacker": "Giramondo", + "backpacker_female": "Giramondo", + "backpackers": "Giramondo", + "baker": "Panettiera", + "battle_girl": "Combat Girl", + "beauty": "Bellezza", + "beginners": "Novellini", + "biker": "Centauro", + "black_belt": "Cinturanera", + "breeder": "Allevapokémon", + "breeder_female": "Allevapokémon", + "breeders": "Allevapokémon", + "clerk": "Affarista", + "clerk_female": "Donna in carriera", + "colleagues": "Soci in affari", + "crush_kin": "Duo Lotta", + "cyclist": "Ciclista", + "cyclist_female": "Ciclista", + "cyclists": "Ciclisti", + "dancer": "Ballerino", + "dancer_female": "Ballerina", + "depot_agent": "Ferroviario", + "doctor": "Medico", + "doctor_female": "Medica", + "firebreather": "Mangiafuoco", + "fisherman": "Pescatore", + "fisherman_female": "Pescatrice", + "gentleman": "Gentiluomo", + "guitarist": "Chitarrista", + "guitarist_female": "Chitarrista", + "harlequin": "Buffone", + "hiker": "Montanaro", + "hooligans": "Teppisti", + "hoopster": "Cestista", + "infielder": "Battitore", + "janitor": "Netturbino", + "lady": "Lady", + "lass": "Pupa", + "linebacker": "Quarterback", + "maid": "Domestica", + "madame": "Madame", + "medical_team": "Équipe medica", + "musician": "Musicista", + "hex_maniac": "Streghetta", + "nurse": "Infermiera", + "nursery_aide": "Maestrina", + "officer": "Guardia", + "parasol_lady": "Ombrellina", + "pilot": "Pilota", + "pokéfan": "PokéFan", + "pokéfan_female": "PokéFan", + "pokéfan_family": "Famiglia PokéFan", + "preschooler": "Bimbo", + "preschooler_female": "Bimba", + "preschoolers": "Bimbi", + "psychic": "Sensitivo", + "psychic_female": "Sensitiva", + "psychics": "Sensitivi", + "pokémon_ranger": "Pokémon Ranger", + "pokémon_ranger_female": "Pokémon Ranger", + "pokémon_rangers": "Duo Ranger", + "ranger": "Ranger", + "restaurant_staff": "Personale del ristorante", + "rich": "Ricco", + "rich_female": "Ricca", + "rich_boy": "Elegantone", + "rich_couple": "Ricchi", + "rich_kid": "Bimbo ricco", + "rich_kid_female": "Bimba ricca", + "rich_kids": "Bimbi ricchi", + "roughneck": "Zuccapelata", + "sailor": "Marinaio", + "scientist": "Scienziato", + "scientist_female": "Scienziata", + "scientists": "Scienziati", + "smasher": "Tennista", + "snow_worker": "Lavoratore", + "snow_worker_female": "Lavoratrice", + "striker": "Calciatore", + "school_kid": "Alunno", + "school_kid_female": "Alunna", + "school_kids": "Alunni", + "swimmer": "Nuotatore", + "swimmer_female": "Nuotatrice", + "swimmers": "Nuotatori", + "twins": "Gemelli", + "veteran": "Veterano", + "veteran_female": "Veterana", + "veteran_duo": "Veterani", + "waiter": "Cameriere", + "waitress": "Cameriera", + "worker": "Operaio", + "worker_female": "Lavoratrice", + "workers": "Lavoratori", + "youngster": "Bullo", + "rocket_grunt": "Recluta Team Rocket", + "rocket_grunt_female": "Recluta Team Rocket", + "rocket_grunts": "Reclute Team Rocket", + "magma_grunt": "Recluta Team Magma", + "magma_grunt_female": "Recluta Team Magma", + "magma_grunts": "Reclute Team Magma", + "aqua_grunt": "Recluta Team Idro", + "aqua_grunt_female": "Recluta Team Idro", + "aqua_grunts": "Recluta Team Idro", + "galactic_grunt": "Recluta Team Galassia", + "galactic_grunt_female": "Recluta Team Galassia", + "galactic_grunts": "Reclute Team Galassia", + "plasma_grunt": "Seguace Plasma", + "plasma_grunt_female": "Seguace Plasma", + "plasma_grunts": "Seguaci Plasma", + "flare_grunt": "Recluta Team Flare", + "flare_grunt_female": "Recluta Team Flare", + "flare_grunts": "Reclute Team Flare", + "aether_grunt": "Dipendente (Fondazione Æther)", + "aether_grunt_female": "Dipendente (Fondazione Æther)", + "aether_grunts": "Dipendenti (Fondazione Æther)", + "skull_grunt": "Recluta Team Skull", + "skull_grunt_female": "Recluta Team Skull", + "skull_grunts": "Reclute Team Skull", + "macro_grunt": "Impiegato Macro Cosmos", + "macro_grunt_female": "Impiegata Macro Cosmos", + "macro_grunts": "Impiegati Macro Cosmos" +} diff --git a/src/locales/it/trainer-names.json b/src/locales/it/trainer-names.json new file mode 100644 index 00000000000..6d1373c0bb3 --- /dev/null +++ b/src/locales/it/trainer-names.json @@ -0,0 +1,160 @@ +{ + "brock": "Brock", + "misty": "Misty", + "lt_surge": "Lt. Surge", + "erika": "Erika", + "janine": "Nina", + "sabrina": "Sabrina", + "blaine": "Blaine", + "giovanni": "Giovanni", + "falkner": "Valerio", + "bugsy": "Raffaello", + "whitney": "Chiara", + "morty": "Angelo", + "chuck": "Furio", + "jasmine": "Jasmine", + "pryce": "Alfredo", + "clair": "Sandra", + "roxanne": "Petra", + "brawly": "Rudi", + "wattson": "Walter", + "flannery": "Fiammetta", + "norman": "Norman", + "winona": "Alice", + "tate": "Tell", + "liza": "Pat", + "juan": "Rodolfo", + "roark": "Pedro", + "gardenia": "Gardenia", + "maylene": "Marzia", + "crasher_wake": "Omar", + "fantina": "Fannie", + "byron": "Ferruccio", + "candice": "Bianca", + "volkner": "Corrado", + "cilan": "Spighetto", + "chili": "Chicco", + "cress": "Maisello", + "cheren": "Komor", + "lenora": "Aloé", + "roxie": "Velia", + "burgh": "Artemisio", + "elesa": "Camelia", + "clay": "Rafan", + "skyla": "Anemone", + "brycen": "Silvestro", + "drayden": "Aristide", + "marlon": "Ciprian", + "viola": "Violetta", + "grant": "Lino", + "korrina": "Ornella", + "ramos": "Amur", + "clemont": "Lem", + "valerie": "Valérie", + "olympia": "Astra", + "wulfric": "Edel", + "milo": "Yarrow", + "nessa": "Azzurra", + "kabu": "Kabu", + "bea": "Fabia", + "allister": "Onion", + "opal": "Poppy", + "bede": "Beet", + "gordie": "Milo", + "melony": "Melania", + "piers": "Ginepro", + "marnie": "Mary", + "raihan": "Raihan", + "katy": "Aceria", + "brassius": "Brassius", + "iono": "Kissara", + "kofu": "Algaro", + "larry": "Ubaldo", + "ryme": "Ryme", + "tulip": "Tulipa", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agatha", + "lance": "Lance", + "will": "Pino", + "koga": "Koga", + "karen": "Karen", + "sidney": "Fosco", + "phoebe": "Ester", + "glacia": "Frida", + "drake": "Drake", + "aaron": "Aaron", + "bertha": "Terrie", + "flint": "Vulcano", + "lucian": "Luciano", + "shauntal": "Antemia", + "marshal": "Marzio", + "grimsley": "Mirton", + "caitlin": "Catlina", + "malva": "Malva", + "siebold": "Narciso", + "wikstrom": "Timeos", + "drasna": "Lila", + "hala": "Hala", + "molayne": "Tapso", + "olivia": "Olive", + "acerola": "Mapli", + "kahili": "Kahili", + "rika": "Rika", + "poppy": "Poppy", + "hassel": "Oranzio", + "crispin": "Piros", + "amarys": "Erin", + "lacey": "Rupi", + "drayton": "Aris", + "blue": "Blu", + "red": "Rosso", + "steven": "Rocco", + "wallace": "Adriano", + "cynthia": "Camilla", + "alder": "Nardo", + "iris": "Iris", + "diantha": "Diantha", + "hau": "Hau", + "geeta": "Alisma", + "nemona": "Nemi", + "kieran": "Riben", + "leon": "Dandel", + "rival": "Finn", + "rival_female": "Ivy", + "archer": "Archer", + "ariana": "Atena", + "proton": "Milas", + "petrel": "Maxus", + "tabitha": "Ottavio", + "courtney": "Rossella", + "shelly": "Ada", + "matt": "Alan", + "mars": "Martes", + "jupiter": "Giovia", + "saturn": "Saturno", + "zinzolin": "Violante", + "rood": "Ross", + "xerosic": "Xante", + "bryony": "Bromelia", + "faba": "Vicio", + + "maxie": "Max", + "archie": "Ivan", + "cyrus": "Cyrus", + "ghetsis": "Ghecis", + "lysandre": "Elisio", + "lusamine": "Samina", + "guzma": "Guzman", + "blue_red_double": "Blu & Rosso", + "red_blue_double": "Rosso & Blu", + "tate_liza_double": "Tell & Pat", + "liza_tate_double": "Pat & Tell", + "steven_wallace_double": "Rocco & Adriano", + "wallace_steven_double": "Adriano & Rocco", + "alder_iris_double": "Nardo & Iris", + "iris_alder_double": "Iris & Nardo", + "marnie_piers_double": "Mary & Ginepro", + "piers_marnie_double": "Ginepro & Mary" +} diff --git a/src/locales/it/trainer-titles.json b/src/locales/it/trainer-titles.json new file mode 100644 index 00000000000..eff152795cd --- /dev/null +++ b/src/locales/it/trainer-titles.json @@ -0,0 +1,39 @@ +{ + "elite_four": "Superquattro", + "elite_four_female": "Superquattro", + "gym_leader": "Capopalestra", + "gym_leader_female": "Capopalestra", + "gym_leader_double": "Duo Capopalestra", + "champion": "Campione", + "champion_female": "Campionessa", + "champion_double": "Duo Campioni", + "rival": "Rivale", + "professor": "Professore", + "frontier_brain": "Asso lotta", + "rocket_boss": "Capo Rocket", + "magma_boss": "Capo Magma", + "aqua_boss": "Capo Idro", + "galactic_boss": "Capo Galassia", + "plasma_boss": "Capo Plasma", + "flare_boss": "Capo Flare", + "aether_boss": "Direttrice Æther", + "skull_boss": "Capo Team Skull", + "macro_boss": "Presidente Macro Cosmos", + + "rocket_admin": "Tenente Team Rocket", + "rocket_admin_female": "Tenente Team Rocket", + "magma_admin": "Magmatenente", + "magma_admin_female": "Magmatenente", + "aqua_admin": "Idrotenente", + "aqua_admin_female": "Idrotenente", + "galactic_commander": "Comandante Galassia", + "galactic_commander_female": "Comandante Galassia", + "plasma_sage": "Saggio Team Plasma", + "plasma_admin": "Tenente Team Plasma", + "flare_admin": "Ufficiale Team Flare", + "flare_admin_female": "Ufficiale Team Flare", + "aether_admin": "Capo Filiale Æther", + "skull_admin": "Ufficiale Team Skull", + "macro_admin": "Vicepresidente Macro Cosmos" +} + diff --git a/src/locales/it/trainers.ts b/src/locales/it/trainers.ts deleted file mode 100644 index 420b9bf9f24..00000000000 --- a/src/locales/it/trainers.ts +++ /dev/null @@ -1,263 +0,0 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "elite_four": "Superquattro", - "elite_four_female": "Superquattro", - "gym_leader": "Capopalestra", - "gym_leader_female": "Capopalestra", - "gym_leader_double": "Duo Capopalestra", - "champion": "Campione", - "champion_female": "Campionessa", - "champion_double": "Duo Campioni", - "rival": "Rivale", - "professor": "Professore", - "frontier_brain": "Asso lotta", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Fantallenatore", - "ace_trainer_female": "Fantallenatrice", - "ace_duo": "Fantallenatori", - "artist": "Artista", - "artist_female": "Artista", - "backers": "Fan", - "backpacker": "Giramondo", - "backpacker_female": "Giramondo", - "backpackers": "Giramondo", - "baker": "Panettiera", - "battle_girl": "Combat Girl", - "beauty": "Bellezza", - "beginners": "Novellini", - "biker": "Centauro", - "black_belt": "Cinturanera", - "breeder": "Allevapokémon", - "breeder_female": "Allevapokémon", - "breeders": "Allevapokémon", - "clerk": "Affarista", - "clerk_female": "Donna in carriera", - "colleagues": "Soci in affari", - "crush_kin": "Duo Lotta", - "cyclist": "Ciclista", - "cyclist_female": "Ciclista", - "cyclists": "Ciclisti", - "dancer": "Ballerino", - "dancer_female": "Ballerina", - "depot_agent": "Ferroviario", - "doctor": "Medico", - "doctor_female": "Medica", - "firebreather": "Mangiafuoco", - "fisherman": "Pescatore", - "fisherman_female": "Pescatrice", - "gentleman": "Gentiluomo", - "guitarist": "Chitarrista", - "guitarist_female": "Chitarrista", - "harlequin": "Buffone", - "hiker": "Montanaro", - "hooligans": "Teppisti", - "hoopster": "Cestista", - "infielder": "Battitore", - "janitor": "Netturbino", - "lady": "Lady", - "lass": "Pupa", - "linebacker": "Quarterback", - "maid": "Domestica", - "madame": "Madame", - "medical_team": "Équipe medica", - "musician": "Musicista", - "hex_maniac": "Streghetta", - "nurse": "Infermiera", - "nursery_aide": "Maestrina", - "officer": "Guardia", - "parasol_lady": "Ombrellina", - "pilot": "Pilota", - "pokéfan": "PokéFan", - "pokéfan_female": "PokéFan", - "pokéfan_family": "Famiglia PokéFan", - "preschooler": "Bimbo", - "preschooler_female": "Bimba", - "preschoolers": "Bimbi", - "psychic": "Sensitivo", - "psychic_female": "Sensitiva", - "psychics": "Sensitivi", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_ranger_female": "Pokémon Ranger", - "pokémon_rangers": "Duo Ranger", - "ranger": "Ranger", - "restaurant_staff": "Personale del ristorante", - "rich": "Ricco", - "rich_female": "Ricca", - "rich_boy": "Elegantone", - "rich_couple": "Ricchi", - "rich_kid": "Bimbo ricco", - "rich_kid_female": "Bimba ricca", - "rich_kids": "Bimbi ricchi", - "roughneck": "Zuccapelata", - "sailor": "Marinaio", - "scientist": "Scienziato", - "scientist_female": "Scienziata", - "scientists": "Scienziati", - "smasher": "Tennista", - "snow_worker": "Lavoratore", - "snow_worker_female": "Lavoratrice", - "striker": "Calciatore", - "school_kid": "Alunno", - "school_kid_female": "Alunna", - "school_kids": "Alunni", - "swimmer": "Nuotatore", - "swimmer_female": "Nuotatrice", - "swimmers": "Nuotatori", - "twins": "Gemelli", - "veteran": "Veterano", - "veteran_female": "Veterana", - "veteran_duo": "Veterani", - "waiter": "Cameriere", - "waitress": "Cameriera", - "worker": "Operaio", - "worker_female": "Lavoratrice", - "workers": "Lavoratori", - "youngster": "Bullo" -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Lt. Surge", - "erika": "Erika", - "janine": "Nina", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Valerio", - "bugsy": "Raffaello", - "whitney": "Chiara", - "morty": "Angelo", - "chuck": "Furio", - "jasmine": "Jasmine", - "pryce": "Alfredo", - "clair": "Sandra", - "roxanne": "Petra", - "brawly": "Rudi", - "wattson": "Walter", - "flannery": "Fiammetta", - "norman": "Norman", - "winona": "Alice", - "tate": "Tell", - "liza": "Pat", - "juan": "Rodolfo", - "roark": "Pedro", - "gardenia": "Gardenia", - "maylene": "Marzia", - "crasher_wake": "Omar", - "fantina": "Fannie", - "byron": "Ferruccio", - "candice": "Bianca", - "volkner": "Corrado", - "cilan": "Spighetto", - "chili": "Chicco", - "cress": "Maisello", - "cheren": "Komor", - "lenora": "Aloé", - "roxie": "Velia", - "burgh": "Artemisio", - "elesa": "Camelia", - "clay": "Rafan", - "skyla": "Anemone", - "brycen": "Silvestro", - "drayden": "Aristide", - "marlon": "Ciprian", - "viola": "Violetta", - "grant": "Lino", - "korrina": "Ornella", - "ramos": "Amur", - "clemont": "Lem", - "valerie": "Valérie", - "olympia": "Astra", - "wulfric": "Edel", - "milo": "Yarrow", - "nessa": "Azzurra", - "kabu": "Kabu", - "bea": "Fabia", - "allister": "Onion", - "opal": "Poppy", - "bede": "Beet", - "gordie": "Milo", - "melony": "Melania", - "piers": "Ginepro", - "marnie": "Mary", - "raihan": "Raihan", - "katy": "Aceria", - "brassius": "Brassius", - "iono": "Kissara", - "kofu": "Algaro", - "larry": "Ubaldo", - "ryme": "Ryme", - "tulip": "Tulipa", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Pino", - "koga": "Koga", - "karen": "Karen", - "sidney": "Fosco", - "phoebe": "Ester", - "glacia": "Frida", - "drake": "Drake", - "aaron": "Aaron", - "bertha": "Terrie", - "flint": "Vulcano", - "lucian": "Luciano", - "shauntal": "Antemia", - "marshal": "Marzio", - "grimsley": "Mirton", - "caitlin": "Catlina", - "malva": "Malva", - "siebold": "Narciso", - "wikstrom": "Timeos", - "drasna": "Lila", - "hala": "Hala", - "molayne": "Tapso", - "olivia": "Olive", - "acerola": "Mapli", - "kahili": "Kahili", - "rika": "Rika", - "poppy": "Poppy", - "hassel": "Oranzio", - "crispin": "Piros", - "amarys": "Erin", - "lacey": "Rupi", - "drayton": "Aris", - "blue": "Blu", - "red": "Rosso", - "steven": "Rocco", - "wallace": "Adriano", - "cynthia": "Camilla", - "alder": "Nardo", - "iris": "Iris", - "diantha": "Diantha", - "hau": "Hau", - "geeta": "Alisma", - "nemona": "Nemi", - "kieran": "Riben", - "leon": "Dandel", - "rival": "Finn", - "rival_female": "Ivy", - - - // Double Names - "blue_red_double": "Blu & Rosso", - "red_blue_double": "Rosso & Blu", - "tate_liza_double": "Tell & Pat", - "liza_tate_double": "Pat & Tell", - "steven_wallace_double": "Rocco & Adriano", - "wallace_steven_double": "Adriano & Rocco", - "alder_iris_double": "Nardo & Iris", - "iris_alder_double": "Iris & Nardo", - "marnie_piers_double": "Mary & Ginepro", - "piers_marnie_double": "Ginepro & Mary", -} as const; diff --git a/src/locales/it/tutorial.json b/src/locales/it/tutorial.json new file mode 100644 index 00000000000..6937d59408e --- /dev/null +++ b/src/locales/it/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "Benvenuto in PokéRogue! Questo gioco si concentra sulle battaglie, con elementi roguelite.\n$Questo gioco non è monetizzato e non siamo proprietari di Pokémon ed assets presenti nel gioco.\n$Il progetto è work-in-progress, ma giocabile al 100%.\nPer segnalare eventuali bug è possibile contattarci al nostro apposito Discord.\n$Se il gioco risulta 'lento', assicurati di aver abilitato l'accelerazione hardware nelle impostazioni del tuo browser", + "accessMenu": "Per accedere al menu, premi M o esc.\nDal menu puoi modificare le impostazioni, controllare la wiki ed accedere a varie features.", + "menu": "Da questo menu puoi accedere alle impostazioni.\n$Esse ti permettono di cambiare velocità di gioco, stile delle finestre ed altre opzioni.\n$Ci sono varie funzionalità: controlla bene e non perderti nulla!", + "starterSelect": "Da questa schermata puoi selezionare il tuo starter.\nQuesti sono i membri iniziali della tua squadra.\n$Ogni starter ha un valore. Puoi avere fino a \n6 Pokèmon, avendo a disposizione un massimo di 10 punti.\n$Puoi anche selezionare genere, abilità, e forma a seconda delle\nvarianti che hai catturato o schiuso.\n$Le IVs di una specie sono le migliori rispetto a tutte quelle che hai\ncatturato o schiuso, quindi prova a catturarne il piu possibile!", + "pokerus": "Giornalmente 3 starter casuali disponibili avranno il bordo viola.\n$Se possiedi uno di questi starter,\nprova ad aggiungerlo alla squadra. Ricorda di controllarne le info!", + "statChange": "I cambiamenti alle statistiche persistono fintanto che i tuoi pokèmon restano in campo.\n$I tuoi pokemon verranno richiamati quando incontrerai un allenatore o al cambiamento di bioma.\n$Puoi anche vedere i cambiamenti alle statistiche in corso tenendo premuto C o Shift", + "selectItem": "Dopo ogni battaglia potrai scegliere tra 3 oggetti.\nPotrai prenderne solo uno.\n$Questi spaziano tra consumabili, oggetti tenuti da Pokèmon o con un effetto passivo permanente.\n$La maggior parte degli oggetti non consumabili possono accumulare i loro effetti in diversi modi.\n$Alcuni risulteranno inoltre disponibili solo se possono essere usati, come ad esempio gli oggetti evolutivi.\n$Puoi anche passare un oggetto tenuto da un Pokèmon a un altro attraverso l'opzione 'trasferisci strumento'.\n$Quest'ultima sarà disponibile solo dopo aver assegnato uno strumento ad un Pokèmon.\n$Puoi acquistare consumabili con le monete; progredendo saranno poi disponibili ulteriori oggetti.\n$Assicurati di fare un acquisto prima di selezionare un item casuale, poichè dopo aver fatto ciò passerai subito alla lotta successiva.", + "eggGacha": "Da questa schermata puoi riscattare i tuoi vouchers in cambio di\nuova Pokèmon.\n$Le uova vanno schiuse, e saranno sempre più vicine alla schiusura dopo\nogni battaglia. Le uova più rare impiegheranno più battaglie per la schiusura.\n$I Pokémon schiusi non verranno aggiunti alla tua squadra, ma saranno\ninvece aggiunti ai tuoi starters.\n$I Pokémon schiusi hanno (generalmente) IVs migliori rispetto ai\n Pokémon selvatici.\n$Inoltre, alcuni Pokémon possono essere ottenuti solo tramite uova.\n$Ci sono 3 diversi macchinari con differenti\nbonus, scegli quello che preferisci!" +} \ No newline at end of file diff --git a/src/locales/it/tutorial.ts b/src/locales/it/tutorial.ts deleted file mode 100644 index 1a746cf0db7..00000000000 --- a/src/locales/it/tutorial.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - "intro": `Benvenuto in PokéRogue! Questo gioco si concentra sulle battaglie, con elementi roguelite. - $Questo gioco non è monetizzato e non siamo proprietari di Pokémon ed assets presenti nel gioco. - $Il progetto è work-in-progress, ma giocabile al 100%.\nPer segnalare eventuali bug è possibile contattarci al nostro apposito Discord. - $Se il gioco risulta 'lento', assicurati di aver abilitato l'accelerazione hardware nelle impostazioni del tuo browser`, - - "accessMenu": "Per accedere al menu, premi M o esc.\nDal menu puoi modificare le impostazioni, controllare la wiki ed accedere a varie features.", - - "menu": `Da questo menu puoi accedere alle impostazioni. - $Esse ti permettono di cambiare velocità di gioco, stile delle finestre ed altre opzioni. - $Ci sono varie funzionalità: controlla bene e non perderti nulla!`, - - "starterSelect": `Da questa schermata puoi selezionare il tuo starter.\nQuesti sono i membri iniziali della tua squadra. - $Ogni starter ha un valore. Puoi avere fino a \n6 Pokèmon, avendo a disposizione un massimo di 10 punti. - $Puoi anche selezionare genere, abilità, e forma a seconda delle\nvarianti che hai catturato o schiuso. - $Le IVs di una specie sono le migliori rispetto a tutte quelle che hai\ncatturato o schiuso, quindi prova a catturarne il piu possibile!`, - - "pokerus": `Giornalmente 3 starter casuali disponibili avranno il bordo viola. - $Se possiedi uno di questi starter,\nprova ad aggiungerlo alla squadra. Ricorda di controllarne le info!`, - - "statChange": `I cambiamenti alle statistiche persistono fintanto che i tuoi pokèmon restano in campo. - $I tuoi pokemon verranno richiamati quando incontrerai un allenatore o al cambiamento di bioma. - $Puoi anche vedere i cambiamenti alle statistiche in corso tenendo premuto C o Shift`, - - "selectItem": `Dopo ogni battaglia potrai scegliere tra 3 oggetti.\nPotrai prenderne solo uno. - $Questi spaziano tra consumabili, oggetti tenuti da Pokèmon o con un effetto passivo permanente. - $La maggior parte degli oggetti non consumabili possono accumulare i loro effetti in diversi modi. - $Alcuni risulteranno inoltre disponibili solo se possono essere usati, come ad esempio gli oggetti evolutivi. - $Puoi anche passare un oggetto tenuto da un Pokèmon a un altro attraverso l'opzione 'trasferisci strumento'. - $Quest'ultima sarà disponibile solo dopo aver assegnato uno strumento ad un Pokèmon. - $Puoi acquistare consumabili con le monete; progredendo saranno poi disponibili ulteriori oggetti. - $Assicurati di fare un acquisto prima di selezionare un item casuale, poichè dopo aver fatto ciò passerai subito alla lotta successiva.`, - - "eggGacha": `Da questa schermata puoi riscattare i tuoi vouchers in cambio di\nuova Pokèmon. - $Le uova vanno schiuse, e saranno sempre più vicine alla schiusura dopo\nogni battaglia. Le uova più rare impiegheranno più battaglie per la schiusura. - $I Pokémon schiusi non verranno aggiunti alla tua squadra, ma saranno\ninvece aggiunti ai tuoi starters. - $I Pokémon schiusi hanno (generalmente) IVs migliori rispetto ai\n Pokémon selvatici. - $Inoltre, alcuni Pokémon possono essere ottenuti solo tramite uova. - $Ci sono 3 diversi macchinari con differenti\nbonus, scegli quello che preferisci!`, -} as const; diff --git a/src/locales/it/voucher.ts b/src/locales/it/voucher.json similarity index 64% rename from src/locales/it/voucher.ts rename to src/locales/it/voucher.json index 54e81dbc9d4..296be55d223 100644 --- a/src/locales/it/voucher.ts +++ b/src/locales/it/voucher.json @@ -1,11 +1,9 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { - "vouchers": "Vouchers", - "eggVoucher": "Voucher uovo", - "eggVoucherPlus": "Voucher uovo plus", - "eggVoucherPremium": "Voucher uovo premium", - "eggVoucherGold": "Voucher uovo dorato", - "locked": "Bloccato", - "defeatTrainer": "Sconfiggi {{trainerName}}" -} as const; +{ + "vouchers": "Vouchers", + "eggVoucher": "Voucher uovo", + "eggVoucherPlus": "Voucher uovo plus", + "eggVoucherPremium": "Voucher uovo premium", + "eggVoucherGold": "Voucher uovo dorato", + "locked": "Bloccato", + "defeatTrainer": "Sconfiggi {{trainerName}}" +} \ No newline at end of file diff --git a/src/locales/it/weather.ts b/src/locales/it/weather.json similarity index 88% rename from src/locales/it/weather.ts rename to src/locales/it/weather.json index 2d169421a38..63e3c420917 100644 --- a/src/locales/it/weather.ts +++ b/src/locales/it/weather.json @@ -1,44 +1,32 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { +{ "sunnyStartMessage": "La luce solare è intensa!", "sunnyLapseMessage": "La luce solare è forte.", "sunnyClearMessage": "La luce solare si sta attenuando.", - "rainStartMessage": "Ha iniziato a piovere!", "rainLapseMessage": "La pioggia continua.", "rainClearMessage": "Ha smesso di piovere.", - "sandstormStartMessage": "Si è scatenata una tempesta di sabbia!", "sandstormLapseMessage": "La tempesta di sabbia infuria.", "sandstormClearMessage": "La tempesta di sabbia si è placata.", "sandstormDamageMessage": "{{pokemonNameWithAffix}} è stato colpito\ndalla tempesta di sabbia!", - "hailStartMessage": "Ha iniziato a grandinare!", "hailLapseMessage": "La grandine continua a cadere.", "hailClearMessage": "Ha smesso di grandinare.", "hailDamageMessage": "{{pokemonNameWithAffix}} è stato colpito\ndalla grandine!", - "snowStartMessage": "Ha iniziato a nevicare!", "snowLapseMessage": "La neve sta continuando a cadere.", "snowClearMessage": "Ha smesso di nevicare!.", - "fogStartMessage": "È emersa una fitta nebbia!", "fogLapseMessage": "La nebbia continua.", "fogClearMessage": "La nebbia è scomparsa.", - "heavyRainStartMessage": "Ha iniziato a piovere forte!", "heavyRainLapseMessage": "La pioggia battente continua.", "heavyRainClearMessage": "La pioggia battente è cessata.", - "harshSunStartMessage": "La luce solare è molto intensa!", "harshSunLapseMessage": "La luce solare è estremamente calda.", "harshSunClearMessage": "La luce solare si sta attenuando.", - "strongWindsStartMessage": "È apparsa una corrente d'aria misteriosa!", "strongWindsLapseMessage": "La corrente d'aria soffia intensamente.", + "strongWindsEffectMessage": "La corrente misteriosa indebolisce l’attacco!", "strongWindsClearMessage": "La corrente d'aria è cessata." -}; +} \ No newline at end of file diff --git a/src/locales/ja/ability-trigger.json b/src/locales/ja/ability-trigger.json new file mode 100644 index 00000000000..1b30e52c490 --- /dev/null +++ b/src/locales/ja/ability-trigger.json @@ -0,0 +1,64 @@ +{ + "blockRecoilDamage": "{{pokemonName}}は {{abilityName}}で 反動ダメージを 受けない!", + "badDreams": "{{pokemonName}}は ナイトメアに うなされている!", + "costar": "{{pokemonName}}は {{allyName}}の\n能力変化を コピーした!", + "iceFaceAvoidedDamage": "{{pokemonName}}は\n{{abilityName}}で ダメージを 受けない!", + "perishBody": "{{pokemonName}}の {{abilityName}}で\nおたがいは 3ターン後に ほろびいてしまう!", + "poisonHeal": "{{pokemonName}}は {{abilityName}}で 回復した!", + "trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!", + "windPowerCharged": "{{pokemonName}}は\n{{moveName}}を 受けて じゅうでんした!", + "quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった!", + "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}の\nばけのかわが はがれた!", + "blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。", + "fullHpResistType": "{{pokemonNameWithAffix}}は\n甲羅を かがやかせ タイプ相性を 歪める!", + "moveImmunity": "{{pokemonNameWithAffix}}には\n効果が ないようだ…", + "reverseDrain": "{{pokemonNameWithAffix}}は\nヘドロえきを 吸い取った!", + "postDefendTypeChange": "{{pokemonNameWithAffix}}は {{abilityName}}で\n{{typeName}}タイプに なった!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}は {{abilityName}}で\n相手を キズつけた!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}}は\nおたがいの 特性を 入れ替えた!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}}は\n特性が {{abilityName}}に なっちゃった!", + "postDefendMoveDisable": "{{pokemonNameWithAffix}}の\n{{moveName}}を 封じこめた!", + "pokemonTypeChange": "{{pokemonNameWithAffix}}は\n{{moveType}}タイプに なった!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}}は {{defenderName}}から\n{{stolenItemType}}を うばいとった!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}}は {{attackerName}}から\n{{stolenItemType}}を うばいとった!", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}}の\n{{abilityName}}を 引き継いだ!", + "intimidateImmunity": "{{pokemonNameWithAffix}}は\n{{abilityName}}の 効果で 能力が 下がらない!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}}が たてた お茶を\n{{pokemonName}}は 飲みほした!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}の\n能力変化が 元に戻った!", + "postSummonTransform": "{{pokemonNameWithAffix}}は\n{{targetName}}に 変身した!", + "protectStat": "{{pokemonNameWithAffix}}は {{abilityName}}の 効果で\n{{statName}}が 下がらない!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}は {{abilityName}}で\n{{statusEffectName}}に ならない!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\n状態異常に ならない!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で]\n{{battlerTagName}}を 無視した!", + "forewarn": "{{pokemonNameWithAffix}}の\n{{moveName}}を 読み取った!", + "frisk": "{{pokemonNameWithAffix}}は {{opponentName}}の\n{{opponentAbilityName}}を お見通しだ!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}}は\n{{abilityName}}の ダメージを 受けた!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}は\n{{berryName}}を 収穫した!", + "postTurnHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した!", + "fetchBall": "{{pokemonNameWithAffix}}は\n{{pokeballName}}を 拾ってきた!", + "healFromBerryUse": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した!", + "arenaTrap": "{{pokemonNameWithAffix}}の {{abilityName}}で\n入れ替えることが できない!", + "postBattleLoot": "{{pokemonNameWithAffix}}は\n{{itemName}}を 拾った!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}は {{abilityName}}で\n相手に ダメージを 与えた!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}は {{abilityName}}で\n相手に ダメージを 与えた!", + "postSummonPressure": "{{pokemonNameWithAffix}}は\nプレッシャーを 放っている!", + "weatherEffectDisappeared": "天候の影響が なくなった!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}は\nかたやぶりだ!", + "postSummonAnticipation": "{{pokemonNameWithAffix}}は\nみぶるいした!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}}は\n燃え盛(もえさか)る オーラを 放っている!", + "postSummonTeravolt": "{{pokemonNameWithAffix}}は\n弾(はじ)ける オーラを 放っている!", + "postSummonDarkAura": "{{pokemonNameWithAffix}}は\nダークオーラを 放っている!", + "postSummonFairyAura": "{{pokemonNameWithAffix}}は\nフェアリーオーラを 放っている!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}}は\nすべての オーラを 制圧する!", + "postSummonNeutralizingGas": "あたりに かがくへんかガスが 充満した!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}の わざわいのうつわで\nまわりの {{statName}}が 弱まった!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}の わざわいのつるぎで\nまわりの {{statName}}が 弱まった!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}の わざわいのおふだ\nまわりの {{statName}}が 弱まった!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}の わざわいのたまで\nまわりの {{statName}}が 弱まった!", + "preventBerryUse": "{{pokemonNameWithAffix}}は 緊張して\nきのみが 食べられなくなった!" +} diff --git a/src/locales/ja/ability.json b/src/locales/ja/ability.json new file mode 100644 index 00000000000..bfbf5d3a3c8 --- /dev/null +++ b/src/locales/ja/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "あくしゅう", + "description": "臭い においを 放つことによって 攻撃した ときに 相手を ひるませることが ある。" + }, + "drizzle": { + "name": "あめふらし", + "description": "登場 したときに 天気を 雨に する。" + }, + "speedBoost": { + "name": "かそく", + "description": "毎ターン 素早さが 上がる。" + }, + "battleArmor": { + "name": "カブトアーマー", + "description": "硬い 甲羅に 守られて 相手の 攻撃が 急所に 当たらない。" + }, + "sturdy": { + "name": "がんじょう", + "description": "相手の 技を 受けても 一撃で 倒されることが ない。 一撃必殺技も 効かない。" + }, + "damp": { + "name": "しめりけ", + "description": "あたりを 湿らせることに よって じばく などの 爆発する 技を だれも 使えなくなる。" + }, + "limber": { + "name": "じゅうなん", + "description": "柔軟な 体によって まひ状態に ならない。" + }, + "sandVeil": { + "name": "すながくれ", + "description": "砂あらしの とき 回避率が 上がる。" + }, + "static": { + "name": "せいでんき", + "description": "静電気を 体に まとい 触った 相手を まひさせる ことがある。" + }, + "voltAbsorb": { + "name": "ちくでん", + "description": "でんきタイプの 技を 受けると ダメージを 受けずに 回復する。" + }, + "waterAbsorb": { + "name": "ちょすい", + "description": "みずタイプの 技を 受けると ダメージを 受けずに 回復する。" + }, + "oblivious": { + "name": "どんかん", + "description": "鈍感なので メロメロや ちょうはつ状態に ならない。" + }, + "cloudNine": { + "name": "ノーてんき", + "description": "あらゆる 天気の 影響が なくなって しまう。" + }, + "compoundEyes": { + "name": "ふくがん", + "description": "複眼を 持っているため 技の 命中率が 上がる。" + }, + "insomnia": { + "name": "ふみん", + "description": "眠れない 体質 なので ねむり状態に ならない。" + }, + "colorChange": { + "name": "へんしょく", + "description": "相手から 受けた 技の タイプに 自分の タイプが 変化 する。" + }, + "immunity": { + "name": "めんえき", + "description": "体内に 免疫を 持っているため どく状態に ならない。" + }, + "flashFire": { + "name": "もらいび", + "description": "ほのおタイプの 技を 受けると 炎を もらい 自分が 出す ほのおタイプの 技が 強くなる。" + }, + "shieldDust": { + "name": "りんぷん", + "description": "りんぷんに 守られて 技の 追加効果を 受けなくなる。" + }, + "ownTempo": { + "name": "マイペース", + "description": "マイペースなので こんらん状態に ならない。" + }, + "suctionCups": { + "name": "きゅうばん", + "description": "吸盤で 地面に 張り付き ポケモンを 入れ替えさせる 技や 道具が 効かなくなる。" + }, + "intimidate": { + "name": "いかく", + "description": "登場 したとき 威嚇して 相手を 萎縮させ 相手の 攻撃を 下げて しまう。" + }, + "shadowTag": { + "name": "かげふみ", + "description": "相手の 影を 踏み 逃げたり 交代 できなくする。" + }, + "roughSkin": { + "name": "さめはだ", + "description": "攻撃を 受けたとき 自分に 触れた 相手を ざらざらの 肌で キズつける。" + }, + "wonderGuard": { + "name": "ふしぎなまもり", + "description": "効果バツグンの 技しか 当たらない 不思議な 力。" + }, + "levitate": { + "name": "ふゆう", + "description": "地面から 浮くことによって じめんタイプの 技を 受けない。" + }, + "effectSpore": { + "name": "ほうし", + "description": "攻撃で 自分に 触れた 相手を どくや まひや ねむり状態に する ことがある。" + }, + "synchronize": { + "name": "シンクロ", + "description": "自分が なってしまった どくや まひや やけどを 相手に うつす。" + }, + "clearBody": { + "name": "クリアボディ", + "description": "相手の 技や 特性で 能力を 下げられない。" + }, + "naturalCure": { + "name": "しぜんかいふく", + "description": "手持ちに ひっこむと 状態異常が 治る。" + }, + "lightningRod": { + "name": "ひらいしん", + "description": "でんきタイプの 技を 自分に 寄せつけ ダメージを 受けずに 特攻が 上がる。" + }, + "sereneGrace": { + "name": "てんのめぐみ", + "description": "天の恵みの おかげで 技の 追加効果が でやすい。" + }, + "swiftSwim": { + "name": "すいすい", + "description": "天気が 雨のとき 素早さが 上がる。" + }, + "chlorophyll": { + "name": "ようりょくそ", + "description": "天気が 晴れのとき 素早さが 上がる。" + }, + "illuminate": { + "name": "はっこう", + "description": "あたりを 明るくすることで 命中率を 下げられない。" + }, + "trace": { + "name": "トレース", + "description": "登場 したとき 相手の 特性を トレースして 同じ 特性に なる。" + }, + "hugePower": { + "name": "ちからもち", + "description": "物理攻撃の 威力が 2倍になる。" + }, + "poisonPoint": { + "name": "どくのトゲ", + "description": "自分に 触った 相手を どく状態に することがある。" + }, + "innerFocus": { + "name": "せいしんりょく", + "description": "鍛えられた 精神に よって 相手の 攻撃に ひるまない。" + }, + "magmaArmor": { + "name": "マグマのよろい", + "description": "熱い マグマを 身にまとい こおり状態に ならない。" + }, + "waterVeil": { + "name": "みずのベール", + "description": "水のベールを 身にまとい やけど状態に ならない。" + }, + "magnetPull": { + "name": "じりょく", + "description": "はがねタイプの ポケモンを 磁力で 引きつけて 逃げられなくする。" + }, + "soundproof": { + "name": "ぼうおん", + "description": "音を 遮断 することに よって 音の 攻撃を 受けない。" + }, + "rainDish": { + "name": "あめうけざら", + "description": "天気が 雨のとき 少しずつ HPを 回復する。" + }, + "sandStream": { + "name": "すなおこし", + "description": "登場 したとき 天気を 砂あらしにする。" + }, + "pressure": { + "name": "プレッシャー", + "description": "プレッシャーを あたえて 相手の 使う 技の PPを 多く 減らす。" + }, + "thickFat": { + "name": "あついしぼう", + "description": "厚い 脂肪で 守られているので ほのおタイプと こおりタイプの 技の ダメージを 半減させる。" + }, + "earlyBird": { + "name": "はやおき", + "description": "ねむり状態に なっても 2倍の 早さで 目覚める ことが できる。" + }, + "flameBody": { + "name": "ほのおのからだ", + "description": "自分に 触った 相手を やけど状態に する ことがある。" + }, + "runAway": { + "name": "にげあし", + "description": "野生の ポケモンから 必ず 逃げられる。" + }, + "keenEye": { + "name": "するどいめ", + "description": "鋭い 目の おかげで 命中率を 下げられない。" + }, + "hyperCutter": { + "name": "かいりきバサミ", + "description": "力自慢の ハサミを 持っているので 相手に 攻撃を 下げられない。" + }, + "pickup": { + "name": "ものひろい", + "description": "戦闘が 終わったとき 相手の 持った 道具を 一つ 拾ってくることが ある。" + }, + "truant": { + "name": "なまけ", + "description": "技を 出すと 次の ターンは 休んでしまう。" + }, + "hustle": { + "name": "はりきり", + "description": "自分の 攻撃が 高くなるが 命中率が 下がる。" + }, + "cuteCharm": { + "name": "メロメロボディ", + "description": "自分に 触った 相手を メロメロに することが ある。" + }, + "plus": { + "name": "プラス", + "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。" + }, + "minus": { + "name": "マイナス", + "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。" + }, + "forecast": { + "name": "てんきや", + "description": "天気の 影響を 受けて みずタイプ ほのおタイプ こおりタイプの どれかに 変化する。" + }, + "stickyHold": { + "name": "ねんちゃく", + "description": "粘着質の 体に 道具が くっついているため 相手に 道具を 奪われない。" + }, + "shedSkin": { + "name": "だっぴ", + "description": "体の 皮を 脱ぎ捨てることで 状態異常を 治すことが ある。" + }, + "guts": { + "name": "こんじょう", + "description": "状態異常に なると 根性を だして 攻撃が 上がる。" + }, + "marvelScale": { + "name": "ふしぎなうろこ", + "description": "状態異常に なると 不思議なウロコが 反応して 防御が 上がる。" + }, + "liquidOoze": { + "name": "ヘドロえき", + "description": "ヘドロ液を 吸い取った 相手は 強烈な 悪臭で ダメージを 受けて HPを 減らす。" + }, + "overgrow": { + "name": "しんりょく", + "description": "HPが 減ったとき くさタイプの 技の 威力が 上がる。" + }, + "blaze": { + "name": "もうか", + "description": "HPが 減ったとき ほのおタイプの 技の 威力が 上がる。" + }, + "torrent": { + "name": "げきりゅう", + "description": "HPが 減ったとき みずタイプの 技の 威力が 上がる。" + }, + "swarm": { + "name": "むしのしらせ", + "description": "HPが 減ったとき むしタイプの 技の 威力が 上がる。" + }, + "rockHead": { + "name": "いしあたま", + "description": "反動を 受ける 技を 出しても HPが 減らない。" + }, + "drought": { + "name": "ひでり", + "description": "登場 したときに 天気を 晴れに する。" + }, + "arenaTrap": { + "name": "ありじごく", + "description": "戦闘で 相手を 逃げられなくする。" + }, + "vitalSpirit": { + "name": "やるき", + "description": "やる気を だすことに よって ねむり状態に ならない。" + }, + "whiteSmoke": { + "name": "しろいけむり", + "description": "白い煙に 守られて 相手に 能力を 下げられない。" + }, + "purePower": { + "name": "ヨガパワー", + "description": "ヨガの 力で 物理攻撃の 威力が 2倍に なる。" + }, + "shellArmor": { + "name": "シェルアーマー", + "description": "硬い 殻に 守られ 相手の 攻撃が 急所に 当たらない。" + }, + "airLock": { + "name": "エアロック", + "description": "あらゆる 天気の 影響が なくなって しまう。" + }, + "tangledFeet": { + "name": "ちどりあし", + "description": "こんらん状態の ときは 回避率が アップする。" + }, + "motorDrive": { + "name": "でんきエンジン", + "description": "でんきタイプの 技を 受けると ダメージを 受けずに 素早さが 上がる。" + }, + "rivalry": { + "name": "とうそうしん", + "description": "性別が 同じだと 闘争心を 燃やして 強くなる。 性別が 違うと 弱くなる。" + }, + "steadfast": { + "name": "ふくつのこころ", + "description": "ひるむ たびに 不屈の心を 燃やして 素早さが 上がる。" + }, + "snowCloak": { + "name": "ゆきがくれ", + "description": "天気が ゆきのとき 回避率が 上がる。" + }, + "gluttony": { + "name": "くいしんぼう", + "description": "HPが 少なくなったら 食べる きのみを HP 半分の 時に 食べてしまう。" + }, + "angerPoint": { + "name": "いかりのつぼ", + "description": "急所に 攻撃が 当たると 怒りくるって 攻撃力が 最大に なる。" + }, + "unburden": { + "name": "かるわざ", + "description": "持っていた 道具が なくなると 素早さが 上がる。" + }, + "heatproof": { + "name": "たいねつ", + "description": "耐熱の 体に よって ほのおタイプの 技の 威力を 半減させる。" + }, + "simple": { + "name": "たんじゅん", + "description": "能力 変化が いつもの 2倍に なる。" + }, + "drySkin": { + "name": "かんそうはだ", + "description": "天気が 雨の時や みずタイプの 技で HPが 回復し はれの時や ほのおタイプの 技で 減ってしまう。" + }, + "download": { + "name": "ダウンロード", + "description": "相手の 防御と 特防を くらべて 低い ほうの 能力に あわせて 自分の 攻撃か 特攻を 上げる。" + }, + "ironFist": { + "name": "てつのこぶし", + "description": "パンチを 使う 技の 威力が 上がる。" + }, + "poisonHeal": { + "name": "ポイズンヒール", + "description": "どく状態に なると HPが 減らずに 増えていく。" + }, + "adaptability": { + "name": "てきおうりょく", + "description": "自分と おなじ タイプの 技の 威力が 上がる。" + }, + "skillLink": { + "name": "スキルリンク", + "description": "連続技を 使うと いつも 最高回数 出すことが できる。" + }, + "hydration": { + "name": "うるおいボディ", + "description": "天気が 雨のとき 状態異常が 治る。" + }, + "solarPower": { + "name": "サンパワー", + "description": "天気が 晴れると 特攻が 上がるが 毎ターン HPが 減る。" + }, + "quickFeet": { + "name": "はやあし", + "description": "状態異常に なると 素早さが 上がる。" + }, + "normalize": { + "name": "ノーマルスキン", + "description": "どんな タイプの 技でも すべて ノーマルタイプに なる。 威力が 少し 上がる。" + }, + "sniper": { + "name": "スナイパー", + "description": "攻撃を 急所に 当てると 威力が さらに 上がる。" + }, + "magicGuard": { + "name": "マジックガード", + "description": "攻撃 以外では ダメージを 受けない。" + }, + "noGuard": { + "name": "ノーガード", + "description": "ノーガード戦法に よって お互いの 出す 技が かならず 当たる ようになる。" + }, + "stall": { + "name": "あとだし", + "description": "技を 出す 順番が かならず 最後に なる。" + }, + "technician": { + "name": "テクニシャン", + "description": "威力が 低い 技の 威力を 高くして 攻撃できる。" + }, + "leafGuard": { + "name": "リーフガード", + "description": "天気が 晴れのときは 状態異常に ならない。" + }, + "klutz": { + "name": "ぶきよう", + "description": "持っている 道具を 使うことが できない。" + }, + "moldBreaker": { + "name": "かたやぶり", + "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" + }, + "superLuck": { + "name": "きょううん", + "description": "強運を 持っているため 相手の 急所に 攻撃が 当たりやすい。" + }, + "aftermath": { + "name": "ゆうばく", + "description": "ひんしに なったとき 触った 相手に ダメージを あたえる。" + }, + "anticipation": { + "name": "きけんよち", + "description": "相手の 持つ 危険な 技を 察知する ことができる。" + }, + "forewarn": { + "name": "よちむ", + "description": "登場 したとき 相手の 持つ 技を ひとつだけ 読み取る。" + }, + "unaware": { + "name": "てんねん", + "description": "相手の 能力の 変化を 無視して 攻撃が できる。" + }, + "tintedLens": { + "name": "いろめがね", + "description": "効果が いまひとつの 技を 通常の 威力で 出すことが できる。" + }, + "filter": { + "name": "フィルター", + "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" + }, + "slowStart": { + "name": "スロースタート", + "description": "5ターンの あいだ 攻撃と 素早さが 半分に なる。" + }, + "scrappy": { + "name": "きもったま", + "description": "ゴーストタイプの ポケモンに ノーマルタイプと かくとうタイプの 技を 当てることが できる。" + }, + "stormDrain": { + "name": "よびみず", + "description": "みずタイプの 技を 自分に よせつけ ダメージは 受けずに 特攻が 上がる。" + }, + "iceBody": { + "name": "アイスボディ", + "description": "天気が ゆきのとき HPを 少しずつ 回復 する。" + }, + "solidRock": { + "name": "ハードロック", + "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" + }, + "snowWarning": { + "name": "ゆきふらし", + "description": "登場 したときに 天気を ゆきに する。" + }, + "honeyGather": { + "name": "みつあつめ", + "description": "戦闘が 終わったとき あまいミツを 拾う。そのあまいミツが 売られて お金を もらう。" + }, + "frisk": { + "name": "おみとおし", + "description": "登場 したとき 相手の 持ち物を 見通すことが できる。" + }, + "reckless": { + "name": "すてみ", + "description": "反動で ダメージを 受ける 技の 威力が 上がる。" + }, + "multitype": { + "name": "マルチタイプ", + "description": "持っている プレートや Zクリスタルの タイプによって 自分の タイプが 変わる。" + }, + "flowerGift": { + "name": "フラワーギフト", + "description": "天気が 晴れのとき 自分と 味方の 攻撃と 特防の 能力が 上がる。" + }, + "badDreams": { + "name": "ナイトメア", + "description": "ねむり状態の 相手に ダメージを あたえる。" + }, + "pickpocket": { + "name": "わるいてぐせ", + "description": "触られた 相手の 道具を 盗んで しまう。" + }, + "sheerForce": { + "name": "ちからずく", + "description": "技の 追加効果は なくなるが そのぶん 高い 威力で 技を 出すことが できる。" + }, + "contrary": { + "name": "あまのじゃく", + "description": "能力の 変化が 逆転して 上がるときに 下がり 下がるときに 上がる。" + }, + "unnerve": { + "name": "きんちょうかん", + "description": "相手を 緊張させて きのみを 食べられなく させる。" + }, + "defiant": { + "name": "まけんき", + "description": "能力を 下げられると 攻撃が ぐーんと 上がる。" + }, + "defeatist": { + "name": "よわき", + "description": "HPが 半分に なると 弱気に なって 攻撃と 特攻が 半減する。" + }, + "cursedBody": { + "name": "のろわれボディ", + "description": "攻撃を 受けると 相手の 技を かなしばり状態に することが ある。" + }, + "healer": { + "name": "いやしのこころ", + "description": "状態異常の 味方を たまに 治してあげる。" + }, + "friendGuard": { + "name": "フレンドガード", + "description": "味方の ダメージを 減らすことが できる。" + }, + "weakArmor": { + "name": "くだけるよろい", + "description": "物理技で ダメージを 受けると 防御が 下がり 素早さが ぐーんと 上がる。" + }, + "heavyMetal": { + "name": "ヘヴィメタル", + "description": "自分の 重さが 2倍に なる。" + }, + "lightMetal": { + "name": "ライトメタル", + "description": "自分の 重さが 半分に なる。" + }, + "multiscale": { + "name": "マルチスケイル", + "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。" + }, + "toxicBoost": { + "name": "どくぼうそう", + "description": "どく状態に なったとき 物理技の 威力が 上がる。" + }, + "flareBoost": { + "name": "ねつぼうそう", + "description": "やけど状態に なったとき 特殊技の 威力が 上がる。" + }, + "harvest": { + "name": "しゅうかく", + "description": "使った きのみを 何回も 作りだす。" + }, + "telepathy": { + "name": "テレパシー", + "description": "味方の 攻撃を 読み取って 技を 回避する。" + }, + "moody": { + "name": "ムラっけ", + "description": "毎ターン 能力の どれかが ぐーんと 上がって どれかが 下がる。" + }, + "overcoat": { + "name": "ぼうじん", + "description": "すなあらしや あられなどの ダメージを 受けない。 粉の 技を 受けない。" + }, + "poisonTouch": { + "name": "どくしゅ", + "description": "触る だけで 相手を どく 状態に することがある。" + }, + "regenerator": { + "name": "さいせいりょく", + "description": "手持ちに 引っ込むと HPが 少し 回復する。" + }, + "bigPecks": { + "name": "はとむね", + "description": "防御を 下げる 効果を 受けない。" + }, + "sandRush": { + "name": "すなかき", + "description": "天気が すなあらし のとき 素早さが 上がる。" + }, + "wonderSkin": { + "name": "ミラクルスキン", + "description": "変化技を 受けにくい 体に なっている。" + }, + "analytic": { + "name": "アナライズ", + "description": "いちばん 最後に 技を 出すと 技の 威力が 上がる。" + }, + "illusion": { + "name": "イリュージョン", + "description": "手持ちの いちばん うしろに いる ポケモンに なりきって 登場して 相手を 化かす。" + }, + "imposter": { + "name": "かわりもの", + "description": "目の前の ポケモンに 変身 してしまう。" + }, + "infiltrator": { + "name": "すりぬけ", + "description": "相手の 壁や 身代わりを すりぬけて 攻撃 できる" + }, + "mummy": { + "name": "ミイラ", + "description": "相手に 触られると 相手を ミイラに してしまう。" + }, + "moxie": { + "name": "じしんかじょう", + "description": "相手を 倒すと 自信が ついて 攻撃が 上がる。" + }, + "justified": { + "name": "せいぎのこころ", + "description": "あくタイプの 攻撃を 受けると 正義感で 攻撃が 上がる。" + }, + "rattled": { + "name": "びびり", + "description": "あく ゴースト むしタイプの 攻撃を 受けたり いかくを されると びびって 素早さが 上がる。" + }, + "magicBounce": { + "name": "マジックミラー", + "description": "相手に だされた 変化技を 受けずに そのまま 返す ことが できる。" + }, + "sapSipper": { + "name": "そうしょく", + "description": "くさタイプの 技を 受けると ダメージを 受けずに 攻撃が 上がる。" + }, + "prankster": { + "name": "いたずらごころ", + "description": "変化技を 先制で 出すことが できる。" + }, + "sandForce": { + "name": "すなのちから", + "description": "天気が すなあらしの とき いわタイプと じめんタイプと はがねタイプの 威力が 上がる。" + }, + "ironBarbs": { + "name": "てつのトゲ", + "description": "自分に 触った 相手に 鉄のトゲで ダメージを あたえる。" + }, + "zenMode": { + "name": "ダルマモード", + "description": "HPが 半分 以下に なると 姿が 変化する。" + }, + "victoryStar": { + "name": "しょうりのほし", + "description": "自分や 味方の 命中率が 上がる。" + }, + "turboblaze": { + "name": "ターボブレイズ", + "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" + }, + "teravolt": { + "name": "テラボルテージ", + "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" + }, + "aromaVeil": { + "name": "アロマベール", + "description": "自分と 味方への メンタル 攻撃を 防ぐことが できる。" + }, + "flowerVeil": { + "name": "フラワーベール", + "description": "味方の 草ポケモンは 能力が 下がらず 状態異常にも ならない。" + }, + "cheekPouch": { + "name": "ほおぶくろ", + "description": "どんな きのみでも 食べると HPも 回復する。" + }, + "protean": { + "name": "へんげんじざい", + "description": "自分が 出す 技と 同じ タイプに 変化する。" + }, + "furCoat": { + "name": "ファーコート", + "description": "相手から 受ける 物理技の ダメージが 半分に なる。" + }, + "magician": { + "name": "マジシャン", + "description": "技を 当てた 相手の 道具を 奪ってしまう。" + }, + "bulletproof": { + "name": "ぼうだん", + "description": "相手の 弾や 爆弾などの 技を 防ぐことが できる。" + }, + "competitive": { + "name": "かちき", + "description": "能力を 下げられると 特攻が ぐーんと 上がる。" + }, + "strongJaw": { + "name": "がんじょうあご", + "description": "あごが 頑丈で 噛む 技の 威力が 高くなる。" + }, + "refrigerate": { + "name": "フリーズスキン", + "description": "ノーマルタイプの 技が こおりタイプに なる。 威力が 少し 上がる。" + }, + "sweetVeil": { + "name": "スイートベール", + "description": "味方の ポケモンは 眠らなくなる。" + }, + "stanceChange": { + "name": "バトルスイッチ", + "description": "攻撃技を 出すと ブレードフォルムに 技 キングシールドを 出すと シールドフォルムに 変化する。" + }, + "galeWings": { + "name": "はやてのつばさ", + "description": "HPが 満タン だと ひこうタイプの 技を 先制で 出すことが できる。" + }, + "megaLauncher": { + "name": "メガランチャー", + "description": "波動の 技の 威力が 高くなる。" + }, + "grassPelt": { + "name": "くさのけがわ", + "description": "グラスフィールドのとき 防御が 上がる。" + }, + "symbiosis": { + "name": "きょうせい", + "description": "味方が 道具を 使うと 自分の 持っている 道具を 味方に 渡す。" + }, + "toughClaws": { + "name": "かたいツメ", + "description": "相手に 接触する 技の 威力が 高くなる。" + }, + "pixilate": { + "name": "フェアリースキン", + "description": "ノーマルタイプの 技が フェアリータイプになる。 威力が 少し 上がる。" + }, + "gooey": { + "name": "ぬめぬめ", + "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。" + }, + "aerilate": { + "name": "スカイスキン", + "description": "ノーマルタイプの 技が ひこうタイプになる。 威力が 少し 上がる。" + }, + "parentalBond": { + "name": "おやこあい", + "description": "親子 2匹で 2回 攻撃することが できる。" + }, + "darkAura": { + "name": "ダークオーラ", + "description": "全員の あくタイプの 技が 強くなる。" + }, + "fairyAura": { + "name": "フェアリーオーラ", + "description": "全員の フェアリータイプの 技が 強くなる。" + }, + "auraBreak": { + "name": "オーラブレイク", + "description": "オーラの 効果を 逆転させて 威力を 下げる。" + }, + "primordialSea": { + "name": "はじまりのうみ", + "description": "ほのおタイプの 攻撃を 受けない 天気にする。" + }, + "desolateLand": { + "name": "おわりのだいち", + "description": "みずタイプの 攻撃を 受けない 天気にする。" + }, + "deltaStream": { + "name": "デルタストリーム", + "description": "ひこうタイプの 弱点が なくなる 天気にする。" + }, + "stamina": { + "name": "じきゅうりょく", + "description": "攻撃を 受けると 防御が 上がる。" + }, + "wimpOut": { + "name": "にげごし", + "description": "HPが 半分に なると あわてて 逃げ出して 手持ちに 引っ込んで しまう。" + }, + "emergencyExit": { + "name": "ききかいひ", + "description": "HPが 半分に なると 危険を 回避するため 手持ちに 引っ込んで しまう。" + }, + "waterCompaction": { + "name": "みずがため", + "description": "みずタイプの 技を 受けると 防御が ぐーんと 上がる。" + }, + "merciless": { + "name": "ひとでなし", + "description": "どく状態の 相手を 攻撃すると かならず 急所に 当たる。" + }, + "shieldsDown": { + "name": "リミットシールド", + "description": "HPが 半分に なると 殻が 壊れて 攻撃的に なる。" + }, + "stakeout": { + "name": "はりこみ", + "description": "交代で 出てきた 相手に 2倍の ダメージで 攻撃 できる。" + }, + "waterBubble": { + "name": "すいほう", + "description": "自分に 対する ほのおタイプの 技の 威力を 下げる。 やけど しない。" + }, + "steelworker": { + "name": "はがねつかい", + "description": "はがねタイプの 技の 威力が 上がる。" + }, + "berserk": { + "name": "ぎゃくじょう", + "description": "相手の 攻撃で HPが 半分に なると 特攻が 上がる。" + }, + "slushRush": { + "name": "ゆきかき", + "description": "天気が ゆき のとき 素早さが 上がる。" + }, + "longReach": { + "name": "えんかく", + "description": "すべての 技を 相手に 接触 しないで 出すことが できる。" + }, + "liquidVoice": { + "name": "うるおいボイス", + "description": "すべての 音技が みずタイプに なる。" + }, + "triage": { + "name": "ヒーリングシフト", + "description": "回復技を 先制で 出すことが できる。" + }, + "galvanize": { + "name": "エレキスキン", + "description": "ノーマルタイプの 技が でんきタイプになる。 威力が 少し 上がる。" + }, + "surgeSurfer": { + "name": "サーフテール", + "description": "エレキフィールド のとき 素早さが 2倍に なる。" + }, + "schooling": { + "name": "ぎょぐん", + "description": "HPが 多いときは 群れて 強くなる。 HPの 残りが 少なくなると 群れは 散り散りに なってしまう。" + }, + "disguise": { + "name": "ばけのかわ", + "description": "体を 被う 化けの皮で 1回 攻撃を 防ぐことが できる。" + }, + "battleBond": { + "name": "きずなへんげ", + "description": "相手を 倒すと トレーナーとの キズナが 深まり サトシゲッコウガに 変化する。みずしゅりけんが 強くなる。" + }, + "powerConstruct": { + "name": "スワームチェンジ", + "description": "HPが 半分に なると セルたちが 応援に 駆けつけ パーフェクトフォルムに 姿を 変える。" + }, + "corrosion": { + "name": "ふしょく", + "description": "はがねタイプや どくタイプも どく状態に することが できる。" + }, + "comatose": { + "name": "ぜったいねむり", + "description": "つねに 夢うつつの 状態で 絶対に 目覚めない。 眠ったまま 攻撃が できる。" + }, + "queenlyMajesty": { + "name": "じょおうのいげん", + "description": "相手に 威圧感を あたえ こちらに むかって 先制技を 出せない ようにする。" + }, + "innardsOut": { + "name": "とびだすなかみ", + "description": "相手に 倒されたとき HPの 残りの ぶんだけ 相手に ダメージを あたえる。" + }, + "dancer": { + "name": "おどりこ", + "description": "だれかが 踊り技を 使うと 自分も それに 続いて 踊り技を 出すことが できる。" + }, + "battery": { + "name": "バッテリー", + "description": "味方の 特殊技の 威力を 上げる。" + }, + "fluffy": { + "name": "もふもふ", + "description": "相手から 受けた 接触する 技の ダメージを 半減するが ほのおタイプの 技の ダメージは 2倍になる。" + }, + "dazzling": { + "name": "ビビッドボディ", + "description": "相手を びっくり させて こちらに むかって 先制技を 出せない ようにする。" + }, + "soulHeart": { + "name": "ソウルハート", + "description": "ポケモンが ひんしに なるたびに 特攻が 上がる。" + }, + "tanglingHair": { + "name": "カーリーヘアー", + "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。" + }, + "receiver": { + "name": "レシーバー", + "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。" + }, + "powerOfAlchemy": { + "name": "かがくのちから", + "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。" + }, + "beastBoost": { + "name": "ビーストブースト", + "description": "相手を 倒したとき 自分の いちばん 高い 能力が 上がる。" + }, + "rksSystem": { + "name": "ARシステム", + "description": "持っている メモリで 自分の タイプが 変わる。" + }, + "electricSurge": { + "name": "エレキメイカー", + "description": "登場 したときに エレキフィールドを はりめぐらせる。" + }, + "psychicSurge": { + "name": "サイコメイカー", + "description": "登場 したときに サイコフィールドを はりめぐらせる。" + }, + "mistySurge": { + "name": "ミストメイカー", + "description": "登場 したときに ミストフィールドを はりめぐらせる。" + }, + "grassySurge": { + "name": "グラスメイカー", + "description": "登場 したときに グラスフィールドを はりめぐらせる。" + }, + "fullMetalBody": { + "name": "メタルプロテクト", + "description": "相手の 技や 特性で 能力を 下げられない。" + }, + "shadowShield": { + "name": "ファントムガード", + "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。" + }, + "prismArmor": { + "name": "プリズムアーマー", + "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" + }, + "neuroforce": { + "name": "ブレインフォース", + "description": "効果バツグンの 攻撃で 威力が さらに 上がる。" + }, + "intrepidSword": { + "name": "ふとうのけん", + "description": "登場 したときに 攻撃が 上がる。" + }, + "dauntlessShield": { + "name": "ふくつのたて", + "description": "登場 したときに 防御が 上がる。" + }, + "libero": { + "name": "リベロ", + "description": "自分が 出す 技と 同じ タイプに 変化する。" + }, + "ballFetch": { + "name": "たまひろい", + "description": "1回目に 投げて 失敗 した モンスターボールを 拾ってくる。" + }, + "cottonDown": { + "name": "わたげ", + "description": "攻撃を 受けると わたげを ばらまいて 自分以外の ポケモン すべての 素早さを 下げる。" + }, + "propellerTail": { + "name": "スクリューおびれ", + "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。" + }, + "mirrorArmor": { + "name": "ミラーアーマー", + "description": "自分が 受けた 能力 ダウンの 効果 だけを 跳ね返す。" + }, + "gulpMissile": { + "name": "うのミサイル", + "description": "なみのりか ダイビングを すると 獲物を くわえてくる。 ダメージを 受けると 獲物を 吐きだして 攻撃。" + }, + "stalwart": { + "name": "すじがねいり", + "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。" + }, + "steamEngine": { + "name": "じょうききかん", + "description": "みずタイプ ほのおタイプの 技を 受けると 素早さが ぐぐーんと 上がる。" + }, + "punkRock": { + "name": "パンクロック", + "description": "音技の 威力が 上がる。 受けた 音技の ダメージは 半分に なる。" + }, + "sandSpit": { + "name": "すなはき", + "description": "攻撃を 受けると 砂あらしを 起こす。" + }, + "iceScales": { + "name": "こおりのりんぷん", + "description": "こおりのりんぷんに 守られて 特殊攻撃で 受ける ダメージが 半減 する。" + }, + "ripen": { + "name": "じゅくせい", + "description": "熟成 させることで きのみの 効果が 倍に なる。" + }, + "iceFace": { + "name": "アイスフェイス", + "description": "物理攻撃は 頭の 氷が みがわりに なるが 姿も 変わる。 氷は あられが 降ると 元に戻る。" + }, + "powerSpot": { + "name": "パワースポット", + "description": "隣に いるだけで 技の 威力が 上がる。" + }, + "mimicry": { + "name": "ぎたい", + "description": "フィールドの 状態に あわせて ポケモンの タイプが 変わる。" + }, + "screenCleaner": { + "name": "バリアフリー", + "description": "登場 したときに 敵と 味方の ひかりのかべ リフレクター オーロラベールの 効果が 消える。" + }, + "steelySpirit": { + "name": "はがねのせいしん", + "description": "味方の はがねタイプの 攻撃の 威力が 上がる。" + }, + "perishBody": { + "name": "ほろびのボディ", + "description": "接触する 技を 受けると お互い 3ターン たつと ひんしになる。 交代すると 効果は なくなる。" + }, + "wanderingSpirit": { + "name": "さまようたましい", + "description": "接触する 技で 攻撃 してきた ポケモンと 特性を 入れ替える。" + }, + "gorillaTactics": { + "name": "ごりむちゅう", + "description": "攻撃は 上がるが 最初に 選んだ 技しか 出せなくなる。" + }, + "neutralizingGas": { + "name": "かがくへんかガス", + "description": "かがくへんかガスの ポケモンが 場にいると すべての ポケモンの 特性の 効果が 消えたり 発動 しなくなる。" + }, + "pastelVeil": { + "name": "パステルベール", + "description": "自分も 味方も どくの 状態異常を 受けなくなる。" + }, + "hungerSwitch": { + "name": "はらぺこスイッチ", + "description": "ターンの 終わりに まんぷくもよう はらぺこもよう まんぷくもよう……と 交互に 姿を 変える。" + }, + "quickDraw": { + "name": "クイックドロウ", + "description": "相手より 先に 行動できることが ある。" + }, + "unseenFist": { + "name": "ふかしのこぶし", + "description": "相手に 接触する 技なら 守りの 効果を 無視して 攻撃することが できる。" + }, + "curiousMedicine": { + "name": "きみょうなくすり", + "description": "登場 したときに 貝がらから 薬を 振りまいて 味方の 能力変化を 元に戻す。" + }, + "transistor": { + "name": "トランジスタ", + "description": "でんきタイプの 技の 威力が 上がる。" + }, + "dragonsMaw": { + "name": "りゅうのあぎと", + "description": "ドラゴンタイプの 技の 威力が 上がる。" + }, + "chillingNeigh": { + "name": "しろのいななき", + "description": "相手を 倒すと 冷たい 声で いなないて 攻撃が 上がる。" + }, + "grimNeigh": { + "name": "くろのいななき", + "description": "相手を 倒すと 恐ろしい 声で いなないて 特攻が 上がる。" + }, + "asOneGlastrier": { + "name": "じんばいったい", + "description": "バドレックスの きんちょうかんと ブリザポスの しろのいななきの 二つの 特性を あわせ持つ。" + }, + "asOneSpectrier": { + "name": "じんばいったい", + "description": "バドレックスの きんちょうかんと レイスポスの くろのいななきの 二つの 特性を あわせ持つ。" + }, + "lingeringAroma": { + "name": "とれないにおい", + "description": "直接攻撃を受けたとき、相手の特性もとれないにおいにする。" + }, + "seedSower": { + "name": "こぼれダネ", + "description": "攻撃を 受けると グラスフィールドに する。" + }, + "thermalExchange": { + "name": "ねつこうかん", + "description": "ほのおタイプの 技を 受けると 攻撃が 上がる。 やけど状態に ならない。" + }, + "angerShell": { + "name": "いかりのこうら", + "description": "相手の攻撃で HPが 半分に なると 怒りで 防御と 特防が 下がるが 攻撃 特攻 素早さが 上がる。" + }, + "purifyingSalt": { + "name": "きよめのしお", + "description": "清らかな塩で 状態異常に ならない。 ゴーストタイプの 技の ダメージを 半減させる。" + }, + "wellBakedBody": { + "name": "こんがりボディ", + "description": "ほのおタイプの 技を 受けると ダメージを 受けずに 防御が ぐーんと 上がる。" + }, + "windRider": { + "name": "かぜのり", + "description": "おいかぜが 吹いたり 風技を 受けると ダメージを 受けずに 攻撃が 上がる。" + }, + "guardDog": { + "name": "ばんけん", + "description": "いかく されると 攻撃が 上がる。 ポケモンを 入れ替えさせる 技や 道具が 効かない。" + }, + "rockyPayload": { + "name": "いわはこび", + "description": "いわタイプの 技の 威力が 上がる。" + }, + "windPower": { + "name": "ふうりょくでんき", + "description": "風技を 受けると じゅうでん 状態に なる。" + }, + "zeroToHero": { + "name": "マイティチェンジ", + "description": "手持ちに ひっこむと マイティフォルムに 変化する。" + }, + "commander": { + "name": "しれいとう", + "description": "登場したとき 味方に ヘイラッシャが いると 口の中に 入って そこから 指令を だす。" + }, + "electromorphosis": { + "name": "でんきにかえる", + "description": "ダメージを 受けると じゅうでん 状態に なる。" + }, + "protosynthesis": { + "name": "こだいかっせい", + "description": "ブーストエナジーを 持たせるか 天気が 晴れのとき いちばん 高い能力が 上がる。" + }, + "quarkDrive": { + "name": "クォークチャージ", + "description": "ブーストエナジーを 持たせるか エレキフィールドのとき いちばん 高い能力が 上がる。" + }, + "goodAsGold": { + "name": "おうごんのからだ", + "description": "酸化せず 丈夫な 黄金の体は 相手からの 変化技を 受けない。" + }, + "vesselOfRuin": { + "name": "わざわいのうつわ", + "description": "災厄を 呼ぶ 器の力で 自分以外の 特攻が 弱くなる。" + }, + "swordOfRuin": { + "name": "わざわいのつるぎ", + "description": "災厄を 呼ぶ 剣の力で 自分以外の 防御が 弱くなる。" + }, + "tabletsOfRuin": { + "name": "わざわいのおふだ", + "description": "災厄を 呼ぶ 木札の力で 自分以外の 攻撃が 弱くなる。" + }, + "beadsOfRuin": { + "name": "わざわいのたま", + "description": "災厄を 呼ぶ 勾玉の力で 自分以外の 特防が 弱くなる。" + }, + "orichalcumPulse": { + "name": "ひひいろのこどう", + "description": "登場したとき 天気を 晴れにする。 日差しが 強いと 古代の 鼓動により 攻撃が 高まる。" + }, + "hadronEngine": { + "name": "ハドロンエンジン", + "description": "登場したとき エレキフィールドを はる。 エレキフィールドだと 未来の 機関により 特攻が 高まる。" + }, + "opportunist": { + "name": "びんじょう", + "description": "相手の 能力が 上がったとき 自分も 便乗して 同じように 能力を 上げる。" + }, + "cudChew": { + "name": "はんすう", + "description": "きのみを 食べると 次のターンの 終わりに 胃から 出して もう1回だけ 食べる。" + }, + "sharpness": { + "name": "きれあじ", + "description": "相手を 切る技の 威力が 上がる。" + }, + "supremeOverlord": { + "name": "そうだいしょう", + "description": "登場したとき 今まで 倒された 味方の 数が 多いほど 少しずつ 攻撃と 特攻が 上がる。" + }, + "costar": { + "name": "きょうえん", + "description": "登場 したときに 味方の 能力変化を コピーする。" + }, + "toxicDebris": { + "name": "どくげしょう", + "description": "物理技で ダメージを 受けると 相手の 足下に どくびしが ちらばる。" + }, + "armorTail": { + "name": "テイルアーマー", + "description": "頭を包む 謎のしっぽが こちらに むかって 先制技を 出せない ようにする。" + }, + "earthEater": { + "name": "どしょく", + "description": "じめんタイプの 技を 受けると ダメージを 受けずに 回復する。" + }, + "myceliumMight": { + "name": "きんしのちから", + "description": "変化技を 出すとき 必ず 行動が 遅くなるが 相手の 特性に ジャマされない。" + }, + "mindsEye": { + "name": "しんがん", + "description": "ノーマル かくとうタイプの技を ゴーストタイプに 当てることが できる。 相手の 回避率の 変化を 無視し 命中率も 下げられない。" + }, + "supersweetSyrup": { + "name": "かんろなミツ", + "description": "最初に 登場 したとき 甘ったるい 蜜の香りを ふりまいて 相手の 回避率を 下げる。" + }, + "hospitality": { + "name": "おもてなし", + "description": "登場したとき 味方を もてなして HPを 少しだけ 回復してあげる。" + }, + "toxicChain": { + "name": "どくのくさり", + "description": "毒素を ふくんだ 鎖の力で 技を 当てた 相手を 猛毒の状態に することが ある。" + }, + "embodyAspectTeal": { + "name": "おもかげやどし", + "description": "思い出を 心に 宿すことで みどりのめんを かがやかせ 自分の 素早さを 上げる。" + }, + "embodyAspectWellspring": { + "name": "おもかげやどし", + "description": "思い出を 心に 宿すことで いどのめんを かがやかせ 自分の 特防を 上げる。" + }, + "embodyAspectHearthflame": { + "name": "おもかげやどし", + "description": "思い出を 心に 宿すことで かまどのめんを かがやかせ 自分の 攻撃を 上げる。" + }, + "embodyAspectCornerstone": { + "name": "おもかげやどし", + "description": "思い出を 心に 宿すことで いしずえのめんを かがやかせ 自分の 防御を 上げる。" + }, + "teraShift": { + "name": "テラスチェンジ", + "description": "登場したとき 周囲の エネルギーを 吸収し テラスタルフォルムに 変化する。" + }, + "teraShell": { + "name": "テラスシェル", + "description": "全タイプの力を 秘めた甲羅は HPが 満タンの ときに 受ける ダメージを すべて 今ひとつに する。" + }, + "teraformZero": { + "name": "ゼロフォーミング", + "description": "テラパゴスが ステラフォルムに なったとき 秘められた力で 天気と フィールドの 影響を すべて ゼロにする。" + }, + "poisonPuppeteer": { + "name": "どくくぐつ", + "description": "モモワロウの 技によって どく状態に なった 相手は こんらん状態にも なってしまう。" + } +} \ No newline at end of file diff --git a/src/locales/ja/achv.json b/src/locales/ja/achv.json new file mode 100644 index 00000000000..fd5e4b9e6c4 --- /dev/null +++ b/src/locales/ja/achv.json @@ -0,0 +1,269 @@ +{ + "Achievements": { + "name": "実績" + }, + "Locked": { + "name": "なし" + }, + "MoneyAchv": { + "description": "一回の ランで {{moneyAmount}}円を 稼ぐ" + }, + "10K_MONEY": { + "name": "お金を持つ人" + }, + "100K_MONEY": { + "name": "富豪" + }, + "1M_MONEY": { + "name": "百万長者" + }, + "10M_MONEY": { + "name": "超富裕層" + }, + "DamageAchv": { + "description": "一撃で HP{{damageAmount}}の ダメージを 与える" + }, + "250_DMG": { + "name": "力持ち" + }, + "1000_DMG": { + "name": "強者" + }, + "2500_DMG": { + "name": "カカロット" + }, + "10000_DMG": { + "name": "ワンパンマン", + "name_female": "ワンパンウーマン" + }, + "HealAchv": { + "description": "一つの 技や 特性や 持たせたアイテムで\n{{HP}}{{healAmount}}を 一気に 回復する" + }, + "250_HEAL": { + "name": "回復発見者" + }, + "1000_HEAL": { + "name": "大いなる治療者" + }, + "2500_HEAL": { + "name": "回復達人" + }, + "10000_HEAL": { + "name": "ジョーイさん" + }, + "LevelAchv": { + "description": "一つの ポケモンを Lv.{{level}}まで 上げる" + }, + "LV_100": { + "name": "まだまだだよ" + }, + "LV_250": { + "name": "天王" + }, + "LV_1000": { + "name": "向こうの向こうを超え" + }, + "RibbonAchv": { + "description": "{{ribbonAmount}}巻の リボンを 積もる" + }, + "10_RIBBONS": { + "name": "ポケモンリーグチャンピオン" + }, + "25_RIBBONS": { + "name": "スーパーリーグチャンピオン" + }, + "50_RIBBONS": { + "name": "ハイパーリーグチャンピオン" + }, + "75_RIBBONS": { + "name": "ローグリーグチャンピオン" + }, + "100_RIBBONS": { + "name": "マスターリーグチャンピオン" + }, + "TRANSFER_MAX_STAT_STAGE": { + "name": "連係プレー", + "description": "少なくとも 一つの 能力を 最大まで あげて\n他の 手持ちポケモンに バトンタッチする" + }, + "MAX_FRIENDSHIP": { + "name": "マブ達", + "description": "一つの 手持ちポケモンの 仲良し度を 最大に 上げる" + }, + "MEGA_EVOLVE": { + "name": "ザ・アブソリュート", + "description": "一つの 手持ちポケモンを メガシンカさせる" + }, + "GIGANTAMAX": { + "name": "太ーくて堪らない", + "description": "一つの 手持ちポケモンを キョダイマックスさせる" + }, + "TERASTALLIZE": { + "name": "一致好き", + "description": "一つの 手持ちポケモンを テラスタルさせる" + }, + "STELLAR_TERASTALLIZE": { + "name": "隠れたタイプ", + "description": "一つの 手持ちポケモンを ステラ・テラスタルさせる" + }, + "SPLICE": { + "name": "インフィニット・フュージョン", + "description": "遺伝子のくさびで 二つの ポケモンを 吸収合体させる" + }, + "MINI_BLACK_HOLE": { + "name": "アイテムホーリック", + "description": "ミニブラックホールを 手に入れる" + }, + "CATCH_MYTHICAL": { + "name": "幻", + "description": "幻の ポケモンを 捕まえる" + }, + "CATCH_SUB_LEGENDARY": { + "name": "準・伝説", + "description": "準伝説の ポケモンを 捕まえる" + }, + "CATCH_LEGENDARY": { + "name": "ザ・伝説", + "description": "伝説の ポケモンを 捕まえる" + }, + "SEE_SHINY": { + "name": "色とりどりに光る", + "description": "野生の 色違いポケモンを みつける" + }, + "SHINY_PARTY": { + "name": "きらきら努力家", + "description": "手持ちポケモンは 全員 色違いポケモンに する" + }, + "HATCH_MYTHICAL": { + "name": "幻のタマゴ", + "description": "幻の ポケモンを タマゴから 生まれる" + }, + "HATCH_SUB_LEGENDARY": { + "name": "準伝説のタマゴ", + "description": "準伝説の ポケモンを タマゴから 生まれる" + }, + "HATCH_LEGENDARY": { + "name": "伝説のタマゴ", + "description": "伝説の ポケモンを タマゴから 生まれる" + }, + "HATCH_SHINY": { + "name": "色違いタマゴ", + "description": "色違いポケモンを タマゴから 生まれる" + }, + "HIDDEN_ABILITY": { + "name": "底力", + "description": "隠れ特性がある ポケモンを 捕まえる" + }, + "PERFECT_IVS": { + "name": "個体値の賞状", + "description": "一つの ポケモンの 個体値を すべて 最大に する" + }, + "CLASSIC_VICTORY": { + "name": "無双", + "description": "クラシックモードを クリアする" + }, + "UNEVOLVED_CLASSIC_VICTORY": { + "name": "はじめてのおつかい", + "description": "少なくとも 一つの 進化していない 手持ちポケモンで\nクラシックモードを クリアする" + }, + "MONO_GEN_ONE": { + "name": "原始", + "description": "1世代の 単一世代チャレンジを クリアする" + }, + "MONO_GEN_TWO": { + "name": "懐かしいカンジョウ", + "description": "2世代の 単一世代チャレンジを クリアする" + }, + "MONO_GEN_THREE": { + "name": "水浸し", + "description": "3世代の 単一世代チャレンジを クリアする" + }, + "MONO_GEN_FOUR": { + "name": "神々の地", + "description": "4世代の 単一世代チャレンジを クリアする" + }, + "MONO_GEN_FIVE": { + "name": "ニューヨーカー", + "description": "5世代の 単一世代チャレンジを クリアする" + }, + "MONO_GEN_SIX": { + "name": "サヴァ・サヴァ", + "description": "6世代の 単一世代チャレンジを クリアする" + }, + "MONO_GEN_SEVEN": { + "name": "アローラ・オエ", + "description": "7世代の 単一世代チャレンジを クリアする" + }, + "MONO_GEN_EIGHT": { + "name": "チャンピオン タイムを 楽しめ!", + "description": "8世代の 単一世代チャレンジを クリアする" + }, + "MONO_GEN_NINE": { + "name": "ネモに甘えたでしょう", + "description": "9世代の 単一世代チャレンジを クリアする" + }, + "MonoType": { + "description": "{{type}}タイプの 単一タイプチャレンジを クリアする" + }, + "MONO_NORMAL": { + "name": "超凡人" + }, + "MONO_FIGHTING": { + "name": "八千以上だ!!" + }, + "MONO_FLYING": { + "name": "翼をください" + }, + "MONO_POISON": { + "name": "カントーの名物" + }, + "MONO_GROUND": { + "name": "自信でユラユラ" + }, + "MONO_ROCK": { + "name": "タケシの挑戦状" + }, + "MONO_BUG": { + "name": "チョウチョウ戦者" + }, + "MONO_GHOST": { + "name": "貞子ちゃん" + }, + "MONO_STEEL": { + "name": "ハガネーター" + }, + "MONO_FIRE": { + "name": "NIGHT OF FIRE" + }, + "MONO_WATER": { + "name": "土砂降リスト" + }, + "MONO_GRASS": { + "name": "www" + }, + "MONO_ELECTRIC": { + "name": "パチピカペコ" + }, + "MONO_PSYCHIC": { + "name": "陽キャ" + }, + "MONO_ICE": { + "name": "ありのまま" + }, + "MONO_DRAGON": { + "name": "龍が如く" + }, + "MONO_DARK": { + "name": "陰キャ" + }, + "MONO_FAIRY": { + "name": "あらハート満タンになった" + }, + "FRESH_START": { + "name": "一発で!", + "description": "出直しチャレンジを クリアする" + }, + "INVERSE_BATTLE": { + "name": "カガミよミガカ", + "description": "反転バトルチャレンジを クリアする\nるすアリク をジンレャチルトバ転反" + } +} diff --git a/src/locales/ja/arena-flyout.json b/src/locales/ja/arena-flyout.json new file mode 100644 index 00000000000..fa29b4567c5 --- /dev/null +++ b/src/locales/ja/arena-flyout.json @@ -0,0 +1,43 @@ +{ + "activeBattleEffects": "場の効果", + "player": "味方", + "neutral": "場の全員", + "enemy": "相手", + + "sunny": "晴れ", + "rain": "雨", + "sandstorm": "砂あらし", + "hail": "あられ", + "snow": "雪", + "fog": "きり", + "heavyRain": "強い雨", + "harshSun": "大日照り", + "strongWinds": "乱気流", + + "misty": "ミストフィールド", + "electric": "エレキフィールド", + "grassy": "グラスフィールド", + "psychic": "サイコフィールド", + + "mudSport": "どろあそび", + "waterSport": "みずあそび", + "spikes": "まきびし", + "toxicSpikes": "どくびし", + "mist": "しろいきり", + "futureSight": "みらいよち", + "doomDesire": "はめつのねがい", + "wish": "ねがいごと", + "stealthRock": "ステルスロック", + "stickyWeb": "ねばねばネット", + "trickRoom": "トリックルーム", + "gravity": "じゅうりょく", + "reflect": "リフレクター", + "lightScreen": "ひかりのかべ", + "auroraVeil": "オーロラベール", + "quickGuard": "ファストガード", + "wideGuard": "ワイドガード", + "matBlock": "たたみがえし", + "craftyShield": "トリックガード", + "tailwind": "おいかぜ", + "happyHour": "ハッピータイム" +} diff --git a/src/locales/ja/arena-tag.json b/src/locales/ja/arena-tag.json new file mode 100644 index 00000000000..56be30d8d55 --- /dev/null +++ b/src/locales/ja/arena-tag.json @@ -0,0 +1,51 @@ +{ + "yourTeam": "味方", + "opposingTeam": "相手", + "arenaOnRemove": "{{moveName}}の 効果が 切れた", + "arenaOnRemovePlayer": "{{moveName}}の 効果が\n味方から 切れた", + "arenaOnRemoveEnemy": "{{moveName}}の 効果が\n相手から 切れた", + "mistOnAdd": "{{pokemonNameWithAffix}}の 味方は\n白い霧に 包まれた!", + "mistApply": "白い霧が\n能力変化の 削減から 守った!", + "reflectOnAdd": "リフレクターで 物理ダメージを さげた", + "reflectOnAddPlayer": "味方の リフレクターで\n物理ダメージを さげた", + "reflectOnAddEnemy": "相手の リフレクターで\n物理ダメージを さげた", + "lightScreenOnAdd": "ひかりのかべで\n特殊ダメージを さげた", + "lightScreenOnAddPlayer": "味方の ひかりのかべで\n特殊ダメージを さげた", + "lightScreenOnAddEnemy": "相手の ひかりのかべで\n特殊ダメージを さげた", + "auroraVeilOnAdd": "オーロラベールで\n攻撃の ダメージを さげた", + "auroraVeilOnAddPlayer": "味方の オーロラベールで\n攻撃ダメージを さげた", + "auroraVeilOnAddEnemy": "相手の オーロラベールで\n攻撃ダメージを さげた", + "conditionalProtectOnAdd": "{{moveName}}に 守られた!", + "conditionalProtectOnAddPlayer": "見方が {{moveName}}に 守られた!", + "conditionalProtectOnAddEnemy": "相手が {{moveName}}に 守られた!", + "conditionalProtectApply": "{{pokemonNameWithAffix}}が\n{{moveName}}に 守られた!", + "matBlockOnAdd": "{{pokemonNameWithAffix}}は\nたたみがえしを ねらっている!", + "noCritOnAddPlayer": "{{moveName}}の 力で 味方の急所が 隠れた!", + "noCritOnAddEnemy": "{{moveName}}の 力で 相手の急所が 隠れた!", + "noCritOnRemove": "{{pokemonNameWithAffix}}の {{moveName}}の\n効果が なくなった!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}の\nねがいごとが かなった!", + "mudSportOnAdd": "電気の威力が 弱まった!", + "mudSportOnRemove": "どろあそびの 効果が なくなった!", + "waterSportOnAdd": "炎の威力が 弱まった!", + "waterSportOnRemove": "みずあそびの 効果が なくなった!", + "spikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!", + "spikesActivateTrap": "{{pokemonNameWithAffix}}は\nまきびしの ダメージを 受けた!", + "toxicSpikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}は {{moveName}}で 毒を あびた!", + "stealthRockOnAdd": "{{opponentDesc}}の 周りに\nとがった岩が ただよい始めた!", + "stealthRockActivateTrap": "{{pokemonNameWithAffix}}に\nとがった岩が 食い込んだ!", + "stickyWebOnAdd": "相手の 足下に\n{{moveName}}が 広がった!", + "stickyWebActivateTrap": "相手の {{pokemonName}}は\nねばねばネットに ひっかかった!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}}は\n時空を ゆがめた!", + "trickRoomOnRemove": "ゆがんだ 時空が 元に戻った!", + "gravityOnAdd": "じゅうりょくが 強くなった!", + "gravityOnRemove": "じゅうりょくが 元に戻った!", + "tailwindOnAdd": "追い風が 吹き始めた!", + "tailwindOnAddPlayer": "味方に\n追い風が 吹き始めた!", + "tailwindOnAddEnemy": "相手に\n追い風が 吹き始めた!", + "tailwindOnRemove": "追い風が 止んだ!", + "tailwindOnRemovePlayer": "味方の 追い風が 止んだ!", + "tailwindOnRemoveEnemy": "相手の 追い風が 止んだ!", + "happyHourOnAdd": "みんなが ハッピーな気分に\n包まれた!", + "happyHourOnRemove": "みんなの 気分が 元に戻った" +} \ No newline at end of file diff --git a/src/locales/ja/battle-info.json b/src/locales/ja/battle-info.json new file mode 100644 index 00000000000..2959cdda332 --- /dev/null +++ b/src/locales/ja/battle-info.json @@ -0,0 +1,3 @@ +{ + "generation": "{{generation}}世代" +} diff --git a/src/locales/ja/battle-message-ui-handler.json b/src/locales/ja/battle-message-ui-handler.json new file mode 100644 index 00000000000..126d1abf26e --- /dev/null +++ b/src/locales/ja/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "さいこう", + "ivFantastic": "すばらしい", + "ivVeryGood": "すごくいい", + "ivPrettyGood": "かなりいい", + "ivDecent": "まぁまぁ", + "ivNoGood": "ダメかも" +} \ No newline at end of file diff --git a/src/locales/ja/battle-scene.json b/src/locales/ja/battle-scene.json new file mode 100644 index 00000000000..426b6910564 --- /dev/null +++ b/src/locales/ja/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "{{formattedMoney}}円" +} \ No newline at end of file diff --git a/src/locales/ja/battle.json b/src/locales/ja/battle.json new file mode 100644 index 00000000000..636d17f23d6 --- /dev/null +++ b/src/locales/ja/battle.json @@ -0,0 +1,99 @@ +{ + "bossAppeared": "{{bossName}}が 現れた!", + "trainerAppeared": "{{trainerName}}が\n勝負を しかけてきた!", + "trainerAppearedDouble": "{{trainerName}}が\n勝負を しかけてきた!", + "trainerSendOut": "{{trainerName}}は\n{{pokemonName}}を 繰り出した!", + "singleWildAppeared": "あっ! 野生の {{pokemonName}}が 飛び出してきた!", + "multiWildAppeared": "あっ! 野生の {{pokemonName1}}と\n{{pokemonName2}}が 飛び出してきた!", + "playerComeBack": "{{pokemonName}}! 戻れ!", + "trainerComeBack": "{{trainerName}}は\n{{pokemonName}}を 引っ込めた!", + "playerGo": "ゆけっ! {{pokemonName}}!", + "trainerGo": "{{trainerName}}は\n{{pokemonName}}を 繰り出した!", + "switchQuestion": "{{pokemonName}}を\n入れ替えますか?", + "trainerDefeated": "{{trainerName}} との 勝負に 勝った!", + "moneyWon": "賞金として ₽{{moneyAmount}}を 手に入れた!", + "moneyPickedUp": "₽{{moneyAmount}}を 拾った!", + "pokemonCaught": "{{pokemonName}}を 捕まえたぞ!", + "addedAsAStarter": "今から {{pokemonName}}は 最初のパートナーとして 選べられる!", + "partyFull": "手持ちが いっぱいです。\n{{pokemonName}}を入れる ために ポケモンを 一つ 逃がすか?", + "pokemon": "ポケモン", + "sendOutPokemon": "頑張れ! {{pokemonName}}!", + "hitResultCriticalHit": "急所に 当たった!", + "hitResultSuperEffective": "効果は バツグンだ!", + "hitResultNotVeryEffective": "効果は 今ひとつの ようだ……", + "hitResultNoEffect": "{{pokemonName}}には 効果が ないようだ…", + "hitResultImmune": "{{pokemonName}}には\n全然 効いてない!", + "hitResultOneHitKO": "一撃必殺!", + "attackFailed": "しかし うまく 決まらなかった!!", + "attackMissed": "{{pokemonNameWithAffix}}には 当たらなかった!", + "attackHitsCount": "{{count}}かい 当たった!", + "rewardGain": "{{modifierName}}を 手に入れた!", + "expGain": "{{pokemonName}}は\n{{exp}}経験値を もらった!", + "levelUp": "{{pokemonName}}は\nレベル{{level}}に 上がった!", + "learnMove": "{{pokemonName}}は 新しく\n{{moveName}}を 覚えた!", + "learnMovePrompt": "{{pokemonName}}は 新しく\n{{moveName}}を 覚えたい……", + "learnMoveLimitReached": "しかし {{pokemonName}}は 技を 4つ\n覚えるので せいいっぱいだ!", + "learnMoveReplaceQuestion": "{{moveName}}の 代わりに\n他の 技を 忘れさせますか?", + "learnMoveStopTeaching": "それでは {{moveName}}を\n覚えるのを 諦めますか?", + "learnMoveNotLearned": "{{pokemonName}}は {{moveName}}を\n覚えずに 終わった!", + "learnMoveForgetQuestion": "どの 技を\n忘れさせたい?", + "learnMoveForgetSuccess": "{{pokemonName}}は {{moveName}}の\n使い方を きれいに 忘れた!", + "countdownPoof": "@d{32}1 @d{15}2の @d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}ポカン!", + "learnMoveAnd": "そして…", + "levelCapUp": "レベルキャップの\n{{levelCap}}に 上がった!", + "moveNotImplemented": "{{moveName}}は まだ 実装されておらず 選択できません。", + "moveNoPP": "しかし 技の\n残りポイントが なかった!", + "moveDisabled": "かなしばりで\n{{moveName}}が 出せない!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}は かなしばりで\n{{moveName}}が 出せない!", + "noPokeballForce": "見えない 力の せいで\nボールが 投げられない!", + "noPokeballTrainer": "人の ものを 取ったら 泥棒!", + "noPokeballMulti": "相手の ポケモンが 一つしか\nいない 前に ボールが 使えない!", + "noPokeballStrong": "相手の ポケモンが 強すぎて 捕まえられない!\nまずは 弱めよう!", + "noEscapeForce": "見えない 力の せいで\n逃げることが できない!", + "noEscapeTrainer": "ダメだ! 勝負の最中に\n相手に 背中を 見せられない!", + "noEscapePokemon": "{{pokemonName}}の {{moveName}}で {{escapeVerb}}!", + "runAwaySuccess": " うまく 逃げ切れた!", + "runAwayCannotEscape": "逃げることが できない!", + "escapeVerbSwitch": "入れ替えることが できない", + "escapeVerbFlee": "逃げることが できない", + "notDisabled": "{{pokemonName}}の かなしばりが 溶けた!\nまた {{moveName}}が 使えられる!", + "turnEndHpRestore": "{{pokemonName}}の 体力が 回復した!", + "hpIsFull": "{{pokemonName}}の\n体力が 満タンだ!", + "skipItemQuestion": "本当に アイテムを 取らずに 進みますか?", + "itemStackFull": "{{fullItemName}}の スタックが いっぱいです。\n代わりに {{itemName}}を 取得します。", + "eggHatching": "おや?", + "ivScannerUseQuestion": "{{pokemonName}}を\n個体値スキャナーで 操作しますか?", + "wildPokemonWithAffix": "野生の {{pokemonName}}", + "foePokemonWithAffix": "相手の {{pokemonName}}", + "useMove": "{{pokemonNameWithAffix}}の {{moveName}}!", + "drainMessage": "{{pokemonName}}から\n体力を 吸い取った!", + "regainHealth": "{{pokemonName}}は\n体力を 回復した!", + "stealEatBerry": "{{pokemonName}}は {{targetName}}の\n{{berryName}}を うばって 食べた!", + "ppHealBerry": "{{pokemonNameWithAffix}}は {{berryName}}で {{moveName}}のPPを 回復した!", + "hpHealBerry": "{{pokemonNameWithAffix}}は {{berryName}}で 体力を 回復した!", + "fainted": "{{pokemonNameWithAffix}}は 倒れた!", + "statsAnd": "と ", + "stats": "能力", + "statRose_one": "{{pokemonNameWithAffix}}の {{stats}}が 上がった!", + "statRose_other": "{{pokemonNameWithAffix}}の {{stats}}が 上がった!", + "statSharplyRose_one": "{{pokemonNameWithAffix}}の {{stats}}が ぐーんと 上がった!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}の {{stats}}が ぐーんと 上がった!", + "statRoseDrastically_one": "{{pokemonNameWithAffix}}の {{stats}}が ぐぐーんと 上がった!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}の {{stats}}が ぐぐーんと 上がった!", + "statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}の {{stats}}が もう 上がらない!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}の {{stats}}が もう 上がらない!", + "statFell_one": "{{pokemonNameWithAffix}}の {{stats}}が 下がった!", + "statFell_other": "{{pokemonNameWithAffix}}の {{stats}}が 下がった!", + "statHarshlyFell_one": "{{pokemonNameWithAffix}}の {{stats}}が がくっと 下がった!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}の {{stats}}が がくっと 下がった!", + "statSeverelyFell_one": "{{pokemonNameWithAffix}}の {{stats}}が がくーんと 下がった!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}の {{stats}}が がくーんと 下がった!", + "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}の {{stats}}が もう 下がらない!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}の {{stats}}が もう 下がらない!", + "transformedIntoType": "{{pokemonName}}は\n{{type}}タイプに 変身した!", + "retryBattle": "このバトルの 始まりから やり直しますか?", + "unlockedSomething": "{{unlockedThing}}\nを アンロックした!", + "congratulations": "おめでとうございます!!", + "beatModeFirstTime": "初めて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を 手に入れた!", + "ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}削った!" +} diff --git a/src/locales/ja/battler-tags.json b/src/locales/ja/battler-tags.json new file mode 100644 index 00000000000..2b6382a3a9f --- /dev/null +++ b/src/locales/ja/battler-tags.json @@ -0,0 +1,73 @@ +{ + "trappedDesc": "捕らわれること", + "flinchedDesc": "ひるむこと", + "confusedDesc": "混乱", + "infatuatedDesc": "メロメロ", + "seedDesc": "種を植えつくこと", + "nightmareDesc": "あくむ", + "ingrainDesc": "根", + "drowsyDesc": "ねむけ", + "rechargingLapse": "{{pokemonNameWithAffix}}は 攻撃の 反動で 動けない!", + "trappedOnAdd": "{{pokemonNameWithAffix}}は もう 逃げられない!", + "trappedOnRemove": "{{pokemonNameWithAffix}}は\n{{moveName}}の 効果が 解けた!", + "flinchedLapse": "{{pokemonNameWithAffix}}は ひるんで 技が出せない!", + "confusedOnAdd": "{{pokemonNameWithAffix}}は 混乱 した!", + "confusedOnRemove": "{{pokemonNameWithAffix}}の 混乱が 解けた!", + "confusedOnOverlap": "{{pokemonNameWithAffix}}は すでに 混乱している!", + "confusedLapse": "{{pokemonNameWithAffix}}は 混乱している!", + "confusedLapseHurtItself": "わけも わからず 自分を 攻撃した!", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}}を みちづれに できない!", + "destinyBondLapse": "{{pokemonNameWithAffix}}は 相手を みちづれに した!", + "infatuatedOnAdd": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロに なった!", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}}は すでに メロメロだ!", + "infatuatedLapse": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロだ!", + "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}}は メロメロで 技が出せなかった!", + "infatuatedOnRemove": "{{pokemonNameWithAffix}}は メロメロ状態が 治った!", + "seededOnAdd": "{{pokemonNameWithAffix}}に 種を 植えつけた!", + "seededLapse": "やどりぎが {{pokemonNameWithAffix}}の 体力を うばう!", + "seededLapseShed": "{{pokemonNameWithAffix}}は ヘドロえきを 吸い取った!", + "nightmareOnAdd": "{{pokemonNameWithAffix}}は あくむを 見始めた!", + "nightmareOnOverlap": "{{pokemonNameWithAffix}}は すでに うなされている!", + "nightmareLapse": "{{pokemonNameWithAffix}}は あくむに うなされている!", + "encoreOnAdd": "{{pokemonNameWithAffix}}は アンコールを 受けた!", + "encoreOnRemove": "{{pokemonNameWithAffix}}の アンコール状態が 解けた!", + "helpingHandOnAdd": "{{pokemonNameWithAffix}}は {{pokemonName}}を\nてだすけする 体制に 入った!", + "ingrainLapse": "{{pokemonNameWithAffix}}は 根から\n養分(ようぶん)を 吸い取った!", + "ingrainOnTrap": "{{pokemonNameWithAffix}}は 根を 張った!", + "aquaRingOnAdd": "{{pokemonNameWithAffix}}は 水のリングを まとった!", + "aquaRingLapse": "{{pokemonName}}は {{moveName}}で\n体力を 回復した!", + "drowsyOnAdd": "{{pokemonNameWithAffix}} の ねむけを 誘(さそ)った!", + "damagingTrapLapse": "{{pokemonNameWithAffix}}は {{moveName}}の ダメージを 受けた!", + "bindOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に 締め付けられた!", + "wrapOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に 巻き付かれた!", + "vortexOnTrap": "{{pokemonNameWithAffix}}は 渦(うず)の中に 閉じ込められた!", + "clampOnTrap": "{{pokemonName}}は {{sourcePokemonNameWithAffix}}の\nからに 挟まれた!", + "sandTombOnTrap": "{{pokemonNameWithAffix}}は {{moveName}}に 捕らわれた!", + "magmaStormOnTrap": "{{pokemonNameWithAffix}}は マグマの\n 渦(うず)に 閉じ込められた!", + "snapTrapOnTrap": "{{pokemonNameWithAffix}}は トラバサミに 捕らわれた!", + "thunderCageOnTrap": "{{sourcePokemonNameWithAffix}}は {{pokemonNameWithAffix}}に 閉じ込められた!", + "infestationOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonNameWithAffix}}に まとわりつかれた!", + "protectedOnAdd": "{{pokemonNameWithAffix}}は\nまもりの 体制に 入った!", + "protectedLapse": "{{pokemonNameWithAffix}}は\n攻撃から 身を守った!", + "enduringOnAdd": "{{pokemonNameWithAffix}}は\nこらえる 体制に 入った!", + "enduringLapse": "{{pokemonNameWithAffix}}は\n攻撃を こらえた!", + "sturdyLapse": "{{pokemonNameWithAffix}}は\n攻撃を こらえた!", + "perishSongLapse": "{{pokemonNameWithAffix}}の ほろびのカウントが {{turnCount}}になった!", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}}は 注目の 的になった!", + "truantLapse": "{{pokemonNameWithAffix}}は 怠(なま)けている!", + "slowStartOnAdd": "{{pokemonNameWithAffix}}は 調子が 上がらない!", + "slowStartOnRemove": "{{pokemonNameWithAffix}}は 調子を 取り戻した!", + "highestStatBoostOnAdd": "{{pokemonNameWithAffix}}の {{statName}}が\n上がっている 状態に なった!", + "highestStatBoostOnRemove": "{{pokemonNameWithAffix}}の {{abilityName}}の 効果が なくなった!", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}}は 電磁力(でんじりょく)で 浮かび上がった!", + "magnetRisenOnRemove": "{{pokemonNameWithAffix}}は 電磁力(でんじりょく)が なくなった!", + "critBoostOnAdd": "{{pokemonNameWithAffix}}は 張り切っている!", + "critBoostOnRemove": "{{pokemonNameWithAffix}}は 落ち着いた。", + "saltCuredOnAdd": "{{pokemonNameWithAffix}}は しおづけに なった!", + "saltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを 受けている", + "cursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!", + "cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!", + "stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!", + "disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた!", + "disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた!" +} diff --git a/src/locales/ja/berry.json b/src/locales/ja/berry.json new file mode 100644 index 00000000000..73d13d5e8f0 --- /dev/null +++ b/src/locales/ja/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "オボンのみ", + "effect": "持たせると HPが 50%以下になるとき HPを 25% 回復する" + }, + "LUM": { + "name": "ラムのみ", + "effect": "持たせると 状態異常や 混乱になるとき 回復する\n" + }, + "ENIGMA": { + "name": "ナゾのみ", + "effect": "持たせると 効果バツグンの 技を 受けたとき HPを 25%回復する" + }, + "LIECHI": { + "name": "チイラのみ", + "effect": "持たせると HPが 25%以下に なるとき 攻撃が あがる" + }, + "GANLON": { + "name": "リュガのみ", + "effect": "持たせると HPが 25%以下に なるとき 防御が あがる\n" + }, + "PETAYA": { + "name": "ヤタピのみ", + "effect": "持たせると HPが 25%以下に なるとき 特攻が あがる\n" + }, + "APICOT": { + "name": "ズアのみ", + "effect": "持たせると HPが 25%以下に なるとき 特防が あがる\n" + }, + "SALAC": { + "name": "カムラのみ", + "effect": "持たせると HPが 25%以下に なるとき 素早さが あがる" + }, + "LANSAT": { + "name": "サンのみ", + "effect": "持たせると HPが 25%以下に なるとき 攻撃が 急所に 当たりやすくなる" + }, + "STARF": { + "name": "スターのみ", + "effect": "持たせると HPが 25%以下に なるとき どれか 1つの 能力が ぐーんと あがる" + }, + "LEPPA": { + "name": "ヒメリのみ", + "effect": "持たせると PPが 0になる 技のPPを 10回復する" + } +} diff --git a/src/locales/ja/bgm-name.json b/src/locales/ja/bgm-name.json new file mode 100644 index 00000000000..fc3d4c0fdd2 --- /dev/null +++ b/src/locales/ja/bgm-name.json @@ -0,0 +1,150 @@ +{ + "music": "BGM: ", + "missing_entries": "{{name}}", + "battle_kanto_champion": "B2W2 戦闘!チャンピオン(カントー)", + "battle_johto_champion": "B2W2 戦闘!チャンピオン(ジョウト)", + "battle_hoenn_champion_g5": "B2W2 戦闘!チャンピオン(ホウエン)", + "battle_hoenn_champion_g6": "ORAS 決戦!ダイゴ", + "battle_sinnoh_champion": "B2W2 戦闘!チャンピオン(シンオウ)", + "battle_champion_alder": "BW チャンピオン アデク", + "battle_champion_iris": "B2W2 戦闘!チャンピオンアイリス", + "battle_kalos_champion": "XY 戦闘!チャンピオン", + "battle_alola_champion": "USUM 頂上決戦!ハウ", + "battle_galar_champion": "SWSH 決戦!チャンピオンダンデ", + "battle_champion_geeta": "SV 戦闘!トップチャンピオン", + "battle_champion_nemona": "SV 戦闘!チャンピオンネモ", + "battle_champion_kieran": "SV 戦闘!チャンピオンスグリ", + "battle_hoenn_elite": "ORAS 戦闘!四天王", + "battle_unova_elite": "BW 戦闘!四天王", + "battle_kalos_elite": "XY 戦闘!四天王", + "battle_alola_elite": "SM 戦闘!四天王", + "battle_galar_elite": "SWSH 戦闘!ファイナルトーナメント!", + "battle_paldea_elite": "SV 戦闘!四天王", + "battle_bb_elite": "SV 戦闘!ブルベリーグ四天王", + "battle_final_encounter": "ポケダンDX レックウザ登場", + "battle_final": "BW 戦闘!ゲーチス", + "battle_kanto_gym": "B2W2 戦闘!ジムリーダー(カントー)", + "battle_johto_gym": "B2W2 戦闘!ジムリーダー(ジョウト)", + "battle_hoenn_gym": "B2W2 戦闘!ジムリーダー(ホウエン)", + "battle_sinnoh_gym": "B2W2 戦闘!ジムリーダー(シンオウ)", + "battle_unova_gym": "BW 戦闘!ジムリーダー", + "battle_kalos_gym": "XY 戦闘!ジムリーダー", + "battle_galar_gym": "SWSH 戦闘!ジムリーダー", + "battle_paldea_gym": "SV 戦闘!ジムリーダー", + "battle_legendary_kanto": "XY 戦闘!ミュウツー", + "battle_legendary_raikou": "HGSS 戦闘!ライコウ", + "battle_legendary_entei": "HGSS 戦闘!エンテイ", + "battle_legendary_suicune": "HGSS 戦闘!スイクン", + "battle_legendary_lugia": "HGSS 戦闘!ルギア", + "battle_legendary_ho_oh": "HGSS 戦闘!ホウオウ", + "battle_legendary_regis_g5": "B2W2 戦闘!レジロック・レジアイス・レジスチル", + "battle_legendary_regis_g6": "ORAS 戦闘!レジロック・レジアイス・レジスチル", + "battle_legendary_gro_kyo": "ORAS 戦闘!ゲンシカイキ", + "battle_legendary_rayquaza": "ORAS 戦闘!超古代ポケモン", + "battle_legendary_deoxys": "ORAS 戦闘!デオキシス", + "battle_legendary_lake_trio": "ORAS 戦闘!ユクシー・エムリット・アグノム", + "battle_legendary_sinnoh": "ORAS 戦闘!伝説のポケモン(シンオウ)", + "battle_legendary_dia_pal": "ORAS 戦闘!ディアルガ・パルキア", + "battle_legendary_origin_forme": "LA 戦い:ディアルガ・パルキア(オリジンフォルム)", + "battle_legendary_giratina": "ORAS 戦闘!ギラティナ", + "battle_legendary_arceus": "HGSS アルセウス", + "battle_legendary_unova": "BW 戦闘!伝説のポケモン", + "battle_legendary_kyurem": "BW 戦闘!キュレム", + "battle_legendary_res_zek": "BW 戦闘!ゼクロム・レシラム", + "battle_legendary_xern_yvel": "XY 戦闘!ゼルネアス・イベルタル・ジガルデ", + "battle_legendary_tapu": "SM 戦闘!カプ", + "battle_legendary_sol_lun": "SM 戦闘!ソルガレオ・ルナアーラ", + "battle_legendary_ub": "SM 戦闘!ウルトラビースト", + "battle_legendary_dusk_dawn": "USUM 戦闘!日食・月食ネクロズマ", + "battle_legendary_ultra_nec": "USUM 戦闘!ウルトラネクロズマ", + "battle_legendary_zac_zam": "SWSH 戦闘!ザシアン・ザマゼンタ", + "battle_legendary_glas_spec": "SWSH 戦闘!ブリザポス・レイスポス", + "battle_legendary_calyrex": "SWSH 戦闘!バドレックス", + "battle_legendary_riders": "SWSH 戦闘!豊穣の王", + "battle_legendary_birds_galar": "SWSH 戦闘!伝説のとりポケモン", + "battle_legendary_ruinous": "SV 戦闘!災厄ポケモン", + "battle_legendary_kor_mir": "SV 戦闘!エリアゼロのポケモン", + "battle_legendary_loyal_three": "SV 戦闘!ともっこ", + "battle_legendary_ogerpon": "SV 戦闘!オーガポン", + "battle_legendary_terapagos": "SV 戦闘!テラパゴス", + "battle_legendary_pecharunt": "SV 戦闘!モモワロウ", + "battle_rival": "BW 戦闘!チェレン・ベル", + "battle_rival_2": "BW 戦闘!N", + "battle_rival_3": "BW 決戦!N", + "battle_trainer": "BW 戦闘!トレーナー", + "battle_wild": "BW 戦闘!野生ポケモン", + "battle_wild_strong": "BW 戦闘!強い野生ポケモン", + "end_summit": "ポケダンDX 天空の塔 最上階", + "battle_rocket_grunt": "HGSS 戦闘!ロケット団", + "battle_aqua_magma_grunt": "ORAS 戦闘!アクア団・マグマ団", + "battle_galactic_grunt": "BDSP 戦闘!ギンガ団", + "battle_plasma_grunt": "BW 戦闘!プラズマ団", + "battle_flare_grunt": "XY 戦闘!フレア団", + "battle_aether_grunt": "SM 戦闘!エーテル財団トレーナー", + "battle_skull_grunt": "SM 戦闘!スカル団", + "battle_macro_grunt": "SWSH 戦闘!トレーナー", + "battle_galactic_admin": "BDSP 戦闘!ギンガ団幹部", + "battle_skull_admin": "SM 戦闘!スカル団幹部", + "battle_oleana": "SWSH 戦闘!オリーヴ", + "battle_rocket_boss": "USUM 戦闘!レインボーロケット団ボス", + "battle_aqua_magma_boss": "ORAS 戦闘!アクア団・マグマ団のリーダー", + "battle_galactic_boss": "BDSP 戦闘!ギンガ団ボス", + "battle_plasma_boss": "B2W2 戦闘!ゲーチス", + "battle_flare_boss": "XY 戦闘!フラダリ", + "battle_aether_boss": "SM 戦闘!ルザミーネ", + "battle_skull_boss": "SM 戦闘!スカル団ボス", + "battle_macro_boss": "SWSH 戦闘!ローズ", + + "abyss": "ポケダン空 やみのかこう", + "badlands": "ポケダン空 こかつのたに", + "beach": "ポケダン空 しめったいわば", + "cave": "ポケダン空 そらのいただき(どうくつ)", + "construction_site": "ポケダン空 きょだいがんせきぐん", + "desert": "ポケダン空 きたのさばく", + "dojo": "ポケダン空 ガラガラどうじょう", + "end": "ポケダンDX 天空の塔", + "factory": "ポケダン空 かくされたいせき", + "fairy_cave": "ポケダン空 ほしのどうくつ", + "forest": "ポケダン空 くろのもり", + "grass": "ポケダン空 リンゴのもり", + "graveyard": "ポケダン空 しんぴのもり", + "ice_cave": "ポケダン空 だいひょうざん", + "island": "ポケダン空 えんがんのいわば", + "jungle": "Lmz - Jungle(ジャングル)", + "laboratory": "Firel - Laboratory(ラボラトリー)", + "lake": "ポケダン空 すいしょうのどうくつ", + "meadow": "ポケダン空 そらのいただき(もり)", + "metropolis": "Firel - Metropolis(大都市)", + "mountain": "ポケダン空 ツノやま", + "plains": "ポケダン空 そらのいただき(そうげん)", + "power_plant": "ポケダン空 エレキへいげん", + "ruins": "ポケダン空 ふういんのいわば", + "sea": "Andr06 - Marine Mystique(海の神秘性)", + "seabed": "Firel - Seabed(海底)", + "slum": "Andr06 - Sneaky Snom(ずるいユキハミ)", + "snowy_forest": "ポケダン空 そらのいただき(ゆきやま)", + "space": "Firel - Aether(エーテル)", + "swamp": "ポケダン空 とざされたうみ", + "tall_grass": "ポケダン空 のうむのもり", + "temple": "ポケダン空 ばんにんのどうくつ", + "town": "ポケダン空 ランダムダンジョン3", + "volcano": "ポケダン空 ねっすいのどうくつ", + "wasteland": "ポケダン空 まぼろしのだいち", + "encounter_ace_trainer": "BW 視線!エリートトレーナー", + "encounter_backpacker": "BW 視線!バックパッカー", + "encounter_clerk": "BW 視線!ビジネスマン", + "encounter_cyclist": "BW 視線!サイクリング", + "encounter_lass": "BW 視線!ミニスカート", + "encounter_parasol_lady": "BW 視線!パラソルおねえさん", + "encounter_pokefan": "BW 視線!だいすきクラブ", + "encounter_psychic": "BW 視線!サイキッカー", + "encounter_rich": "BW 視線!ジェントルマン", + "encounter_rival": "BW チェレンのテーマ", + "encounter_roughneck": "BW 視線!スキンヘッズ", + "encounter_scientist": "BW 視線!けんきゅういん", + "encounter_twins": "BW 視線!ふたごちゃん", + "encounter_youngster": "BW 視線!たんぱんこぞう", + "heal": "BW 回復", + "menu": "ポケダン空 ようこそ! ポケモンたちのせかいへ!", + "title": "ポケダン空 トップメニュー" +} diff --git a/src/locales/ja/biome.json b/src/locales/ja/biome.json new file mode 100644 index 00000000000..b94810649d4 --- /dev/null +++ b/src/locales/ja/biome.json @@ -0,0 +1,38 @@ +{ + "unknownLocation": "覚えていない場所", + "TOWN": "タウン", + "PLAINS": "平原", + "GRASS": "草原", + "TALL_GRASS": "長い草むら", + "METROPOLIS": "シティ", + "FOREST": "森", + "SEA": "海", + "SWAMP": "沼", + "BEACH": "海辺", + "LAKE": "湖", + "SEABED": "海底", + "MOUNTAIN": "山", + "BADLANDS": "悪地", + "CAVE": "洞窟", + "DESERT": "砂漠", + "ICE_CAVE": "氷の洞窟", + "MEADOW": "花畑", + "POWER_PLANT": "発電所", + "VOLCANO": "火山", + "GRAVEYARD": "墓場", + "DOJO": "道場", + "FACTORY": "工場", + "RUINS": "古の遺跡", + "WASTELAND": "荒地", + "ABYSS": "深淵", + "SPACE": "宇宙", + "CONSTRUCTION_SITE": "工事現場", + "JUNGLE": "ジャングル", + "FAIRY_CAVE": "フェアリーの洞窟", + "TEMPLE": "神殿", + "SLUM": "スラム", + "SNOWY_FOREST": "雪の森", + "ISLAND": "島", + "LABORATORY": "ラボ", + "END": "???" +} diff --git a/src/locales/ja/challenges.json b/src/locales/ja/challenges.json new file mode 100644 index 00000000000..d137df14086 --- /dev/null +++ b/src/locales/ja/challenges.json @@ -0,0 +1,36 @@ +{ + "title": "チャレンジの設定", + "illegalEvolution": "{{pokemon}}は このチャレンジで\n対象外の ポケモンに なってしまった!", + "singleGeneration": { + "name": "単一世代", + "desc": "{{gen}}世代からの ポケモンしか 使えません", + "desc_default": "選んだ 世代からの ポケモンしか 使えません", + "gen_1": "1", + "gen_2": "2", + "gen_3": "3", + "gen_4": "4", + "gen_5": "5", + "gen_6": "6", + "gen_7": "7", + "gen_8": "8", + "gen_9": "9" + }, + "singleType": { + "name": "単一タイプ", + "desc": "{{type}}タイプの ポケモンしか 使えません", + "desc_default": "選んだ タイプの ポケモンしか 使えません" + }, + "freshStart": { + "name": "出直し", + "desc": "ポケローグを 始めた ばかりの ような ままで ゲーム開始の スターターしか 使えません", + "value.0": "オフ", + "value.1": "オン" + }, + "inverseBattle": { + "name": "反転バトル", + "shortName": "反バ", + "desc": "タイプ相性が 反転で、なんの タイプも 「効果はなし」が ありません\n他の チャレンジの 実績が 無効に されます", + "value.0": "オフ", + "value.1": "オン" + } +} diff --git a/src/locales/ja/command-ui-handler.json b/src/locales/ja/command-ui-handler.json new file mode 100644 index 00000000000..6248a19785f --- /dev/null +++ b/src/locales/ja/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "たたかう", + "ball": "ボール", + "pokemon": "ポケモン", + "run": "にげる", + "actionMessage": "{{pokemonName}}は どうする?" +} diff --git a/src/locales/ja/common.json b/src/locales/ja/common.json new file mode 100644 index 00000000000..d10e3e42c70 --- /dev/null +++ b/src/locales/ja/common.json @@ -0,0 +1,8 @@ +{ + "start": "スタート", + "luckIndicator": "運:", + "shinyOnHover": "色違い", + "commonShiny": "ふつう", + "rareShiny": "レア", + "epicShiny": "超レア" +} diff --git a/src/locales/ja/config.ts b/src/locales/ja/config.ts new file mode 100644 index 00000000000..f8afd6eb167 --- /dev/null +++ b/src/locales/ja/config.ts @@ -0,0 +1,113 @@ +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; + +export const jaConfig = { + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory, +}; diff --git a/src/locales/ja/dialogue-double-battle.json b/src/locales/ja/dialogue-double-battle.json new file mode 100644 index 00000000000..b2632f3b990 --- /dev/null +++ b/src/locales/ja/dialogue-double-battle.json @@ -0,0 +1,84 @@ +{ + "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?", + "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!" + } + }, + "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...", + "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/ja/dialogue-final-boss.json b/src/locales/ja/dialogue-final-boss.json new file mode 100644 index 00000000000..f20d0f013d1 --- /dev/null +++ b/src/locales/ja/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" +} diff --git a/src/locales/ja/dialogue-misc.json b/src/locales/ja/dialogue-misc.json new file mode 100644 index 00000000000..2f333b5f383 --- /dev/null +++ b/src/locales/ja/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/ja/dialogue.json b/src/locales/ja/dialogue.json new file mode 100644 index 00000000000..6130ade1cb4 --- /dev/null +++ b/src/locales/ja/dialogue.json @@ -0,0 +1,2827 @@ +{ + "youngster": { + "encounter": { + "1": "よっ 勝負する?", + "2": "あっ 君も 駆け出し トレーナーだね?", + "2_female": "あっ きみも 駆け出し トレーナーだね?", + "3": "あっ 初めてみる 人! 勝負だ!", + "4": "さっき 負けて 悔しいから ポケモン 探してるんだよ。\nでも 君 弱そうだな…… よしっ! 勝負 しようぜ!", + "4_female": "さっき 負けて 悔しいから ポケモン 探してるんだよ。\nでも 君 弱そうだな…… よしっ! 勝負 しようぜ!", + "5": "お久しぶりかな? 初めましてかな?\n覚えてないけど ヨロシクね!", + "6": "よーし 行くぞー!", + "7": "よっしゃ 行っくぜー!\n僕の パワー 見せてやる!", + "8": "へへへ…… 見せて あげるね!\n僕の ポケモンの すごさを!", + "9": "挨拶 なんて よかよか! いつでも かかってきんしゃい!", + "9_female": "挨拶 なんて よかよか! いつでも かかってきんしゃい!", + "10": "小僧  だからって 油断してると\n君 泣いちゃう かもしれないよー.", + "11": "大事に 育てた ポケモンだぞー!\n絶対 倒しちゃ ダメなんだぞ!", + "12": "よく来たな!\nこっから 先は 一筋縄じゃ いかないぞ!", + "12_female": "よく来たな!\nこっから 先は 一筋縄じゃ いかないぞ!", + "13": "勝負は 続くよ! いつまでも!\n終わりなき 世界へ ようこそ!", + "13_female": "勝負は 続くよ!\nいつまでも! 終わりなき 世界へ ようこそ!" + }, + "victory": { + "1": "スゴッ! 君 強いんだ!", + "1_femal1e": "スゴッ! 君 強いんだ!", + "2": "敵わなかったね?", + "3": "僕 大きくなったら 絶対 君を 倒すよ!", + "4": "ゲッ 戦えるポケモン もう いない…", + "5": "トホ…… トホホーイ……\nまた 負けちゃったよ……", + "5_female": "トホ…… トホホーイ……\nまた 負けちゃったよ……", + "6": "うわー! 負けたー!!", + "7": "すごいな 君の パワーは!\nビックリで ドッキリだよ!", + "8": "そんな…… どうして……\n僕の ポケモンは サイキョー なのに……", + "9": "また バトルして くれよな!\n次は 負けないからな!", + "10": "も~! 僕は 小僧だけ だよ!\nそんな全力で 戦っちゃ ひどいぞ!", + "11": "君の ポケモンの 方が すごい!\n僕のと 交換しておくれよ!", + "12": "さっきは 勢いで 言ったけど\n一筋縄って どんな縄?", + "13": "あはは さすが! さすがだね!\nもう 君も この世界の 住人だ!" + } + }, + "lass": { + "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." + }, + "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…" + } + }, + "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.", + "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?" + }, + "victory": { + "1": "Yes… You have good Pokémon…", + "2": "What?! But I'm a battling genius!", + "3": "Of course, you are the main character!", + "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!", + "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!", + "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!", + "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?", + "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.", + "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.", + "2_female": "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!", + "1_female": "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?", + "3_female": "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.", + "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…" + } + }, + "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...", + "3_female": "Ahya! How could this be? For an Admin like me to lose to some random trainer..." + } + }, + "courtney": { + "encounter": { + "1": "Don't. Get. In. My. Way.", + "2": "You... ...I want to...analyze. Ahahaha", + "3": "... Well then...Deleting..." + }, + "victory": { + "1": "Hah hah... Uhn...hah hah...", + "2": "As anticipated. Unanticipated. You. Target lock...completed.\n$Commencing...experiment. You. Forever. Aha... ♪", + "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_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_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": "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": "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": "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_female": "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!", + "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, 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!", + "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, 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!" + } + }, + "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.", + "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": { + "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!", + "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_female": "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!", + "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?" + } + }, + "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!", + "5_female": "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!", + "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!" + }, + "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!", + "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!" + }, + "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?", + "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." + } + }, + "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!", + "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?", + "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?", + "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.", + "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." + } + }, + "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.", + "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": { + "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..", + "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..." + } + }, + "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.", + "1_female": "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!", + "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." + }, + "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!", + "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?" + }, + "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!", + "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": { + "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.", + "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?" + } + }, + "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!", + "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!", + "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!", + "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!" + }, + "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!", + "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!" + } + }, + "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.", + "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!" + }, + "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?", + "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?" + }, + "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?", + "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?" + }, + "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.", + "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_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…", + "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?", + "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…" + }, + "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'.", + "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!" + }, + "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.", + "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?" + }, + "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!", + "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!" + }, + "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.", + "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.", + "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!", + "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!", + "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_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.", + "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.", + "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": "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?" + }, + "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": "See? These are my rocking Pokémon, my pride and joy!", + "4": "I knew I would win!" + } + }, + "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…", + "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.", + "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?", + "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_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." + }, + "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. ", + "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!", + "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?", + "1_female": "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!", + "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!" + }, + "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!", + "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?" + } + }, + "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.", + "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!" + } + }, + "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_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_female": "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!", + "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_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." + } + }, + "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!", + "1_female": "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.", + "1_female": "Not bad, kiddo." + }, + "defeat": { + "1": "Nahahaha! You really are something else, kiddo!", + "1_female": "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.", + "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!" + } + }, + "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!", + "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_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!" + } + }, + "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!", + "1_female": "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!", + "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!" + }, + "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!", + "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." + }, + "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!", + "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_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_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": { + "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!", + "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_female": "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!", + "1_female": "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!", + "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!" + }, + "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.", + "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…" + }, + "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.", + "1_female": "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!", + "1_female": "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?", + "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?" + }, + "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!", + "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!" + }, + "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!", + "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…" + }, + "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!", + "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!" + }, + "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!", + "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." + }, + "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.", + "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…" + }, + "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.", + "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." + } + }, + "bede": { + "encounter": { + "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." + }, + "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!", + "1_female": "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!", + "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_female": "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!", + "1_female": "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?", + "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!", + "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?", + "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": { + "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!", + "2_female": "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}あっ、ここに いたんだ! 旅に 出る前に 「じゃ またね!」って くらい 聞きたかったよ……$@c{smile_eclosed}やっぱり 夢を 追ってこうと しているんだ? 信じられない ほどね……$@c{serious_smile_fists}じゃあ、 ここまで 来たから バトルしよっか? 覚悟してるかを 確かめたい から!$@c{serious_mopen_fists}遠慮せずに 全力で かかってこいぜ!" + }, + "victory": { + "1": "@c{shock}ウワッ、カンゼンに ぶっ壊したぜ。\n初心者だとは 思えないほど……$@c{smile}たぶん 運が良っかった だけが……\n最後まで 行ける素質が あるかもな!$こっちの アイテムを あげよう、 博士に そう言いつけたから。 結構 スゴそうな もんだ!$@c{serious_smile_fists}ここからも ガンバレ!" + } + }, + "rival_female": { + "encounter": { + "1": "@c{smile_wave}あ、ついに 見つけた! あちこち 探したのよ! \n@c{angry_mopen}だーい親友に お別れを 言うまでも 忘れちゃった?$@c{smile_ehalf}大切な 夢を 追っていくのね?\n やっぱり、この日が 来たのね……$@c{smile}とにかく! アタシを 忘れちゃったのを 許せる 条件は 一つ: \n@c{smile_wave_wink}アタシと バトルだ!$@c{angry_mopen}全力で かかってきなさい!\n冒険が 第一歩で 終わっちゃうと もったいない でしょう?" + }, + "victory": { + "1": "@c{shock}始まった バッカリなのに そんなに強い?!@d{96}\n@c{angry}完全に チートだろう?\n$@c{smile_wave_wink}なんちゃって!@d{64} @c{smile_eclosed}正々堂々と 負けたよ。 冒険 上手く行ける 気がするね!\n$@c{smile}ところで、こっち! 博士からの アイテムを あげるわ。きっと 便利だと 思うよ!\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相手に 利点を あげ続けると 行けないんだろう!" + } + }, + "rival_2_female": { + "encounter": { + "1": "@c{smile_wave}あっ、 こんなとこで 偶然だね! まだ 倒れないようだ。@c{angry_mopen}フム、えらいえらい!\n$@c{angry_mopen}考えてるのは 分かる、 つきまとってるワケ じゃないから!@c{smile_eclosed}この辺に いただけよ。\n$@c{smile_ehalf}ここまで 頑張っていて 良かったけど、 時々 負けることも 大丈夫だと 知ってるよね?\n$@c{smile}みんなは 失敗から 学ぶ… いつまでも 成功し続ける よりもね。\n$@c{angry_mopen}とにかく! 再戦の ために 大変 トレーニングしてたから 全・勢・力で 戦おう!" + }, + "victory": { + "1": "@c{neutral}…今回は 負ける はずじゃなかった…\n$@c{smile}しょうがないね。 次回まで もっともっと トレーニングしなくちゃ ってこと!\n$@c{smile_wave}そして! もう二つの アイテム、 どうぞ!\n@c{smile_wave_wink}「ありがと」なんて 必要ない!\n$@c{angry_mopen}でもね、 これで 最後! 今から サービス 一つも あげないよ~" + }, + "defeat": { + "1": "時々 負けることも いいんだよ…" + } + }, + "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}ヒサブリ~! まだ 負けてないね。\n@c{angry}だんだん イラッと来る。@c{smile_wave_wink}なんちゃって!\n$@c{smile_ehalf}でもよ、 本当に ふるさとが 恋しくないの? それとも… アタシ…?\nずっと会いたいよ… あの、みんなはね!\n$@c{smile_eclosed}夢を 叶ってるのを 応援してるけど、 実際は やがて 負ける。\n$@c{smile}その時が 来たら アタシは いつも通り そばにいるよ。\n@c{angry_mopen}さあ、 ここまで 頑張ってきた アタシの 力を 見せさせて!" + }, + "victory": { + "1": "@c{shock}もう… 足りなかった…?\nこのままで 決して 帰らない だろう……" + }, + "defeat": { + "1": "ベストを 尽くした。 じゃ、 帰りましょう。" + } + }, + "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}アタシよ! また 忘れちゃった… のね?\n$@c{smile}こんな 遠くまで 来たのは 鼻が高いことだよ! おめでと~\nしかし、 ここは 終着点だね。\n$@c{smile_eclosed}アタシの 中にある 全然 知らなかった 部分を 目覚めたよ。\n今は、 トレーニングしか してないみたい。\n$@c{smile_ehalf}食べたり 寝たりも しなくて 朝から晩まで ポケモンを 育って、 毎日 昨日より 強くなってる。\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}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}また アタシたちだけに なった。\n$@c{smile_eclosed}ねえ、 頭の中に グルグル 巡ることが あってよ。\n$@c{smile_ehalf}アタシとアナタの 間に 起こしたことも, この変な感情も……\n$@c{smile}アナタの夢、 アタシの野心…\n$アタシたちが し続けることも 全ては… より高い 目的が あると思うよ。\n$@c{smile_eclosed}最果ての 限界まで 押すこと… それは アタシの 役割だと思う。\n$@c{smile_ehalf}今まで 役割を 上手く果たせたかは 分からないけど…… 一生懸命 頑張った。\n$こんな奇妙な 恐ろしい場所で なんか… 全てが 明らかに 見られるみたい。\n$昔から… これだけしかは この世界こそ そのもの。\n$@c{smile_eclosed}アタシたちが 大切にした 心にギュッと 抱いた思い出… もう 思い出せない。\n$@c{smile_ehalf}本当は 全部 ウソだったの? 今は 遠い彼方に あるみたい。\n$@c{angry_mopen}アナタは 最後まで 戦い続けなければ 決して 終わらない。 アナタしか できないのよ。\n$@c{smile_ehalf}この全ての 意味、 全然 分からないけど… 真実だと 感じてる。\n$@c{neutral}今ここで アタシを 倒せないと 最後に 勝ち目は ナイ。" + }, + "victory": { + "1": "@c{smile_ehalf}役割… 果たせたと思う。\n$@c{smile_eclosed}ね、 約束して。 この世界を 癒やしたら… お願い 無事に 帰って。\n$@c{smile_ehalf}……ありがとう。" + } + } +} diff --git a/src/locales/ja/egg.json b/src/locales/ja/egg.json new file mode 100644 index 00000000000..91b1442c56c --- /dev/null +++ b/src/locales/ja/egg.json @@ -0,0 +1,26 @@ +{ + "egg": "タマゴ", + "greatTier": "レア", + "ultraTier": "超レア", + "masterTier": "伝説", + "defaultTier": "ふつう", + "hatchWavesMessageSoon": "中から 音が 聞こえてくる! もうすぐ 生まれそう!", + "hatchWavesMessageClose": "時々 動いている みたい。生まれるまで もう ちょっとかな?", + "hatchWavesMessageNotClose": "なにが 生まれてくるのかな? 生まれるまで まだまだ 時間が かかりそう。", + "hatchWavesMessageLongTime": "この タマゴは 生まれるまで かなり 時間が かかりそう。", + "gachaTypeLegendary": "伝説確率アップ", + "gachaTypeMove": "レアなタマゴ技確率アップ", + "gachaTypeShiny": "色違い確率アップ", + "selectMachine": "ガチャマシンを選択", + "notEnoughVouchers": "タマゴクーポンが足りません!", + "tooManyEggs": "タマゴが一杯です!", + "pull": "回引く", + "pulls": "回引く", + "sameSpeciesEgg": "{{species}}は このタマゴから 生まれる!", + "hatchFromTheEgg": "{{pokemonName}}は タマゴから 生まれた!", + "eggMoveUnlock": "タマゴ技: {{moveName}}を 覚えた!", + "rareEggMoveUnlock": "レアなタマゴ技: {{moveName}}を 覚えた!!", + "moveUPGacha": "技 UP!", + "shinyUPGacha": "色違い UP!", + "legendaryUPGacha": "UP!" +} diff --git a/src/locales/ja/fight-ui-handler.json b/src/locales/ja/fight-ui-handler.json new file mode 100644 index 00000000000..41ec140c2ca --- /dev/null +++ b/src/locales/ja/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "威力", + "accuracy": "命中", + "abilityFlyInText": " {{pokemonName}}の\n{{passive}}:{{abilityName}}", + "passive": "パッシブ " +} diff --git a/src/locales/ja/filter-bar.json b/src/locales/ja/filter-bar.json new file mode 100644 index 00000000000..891b7d87674 --- /dev/null +++ b/src/locales/ja/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "世代", + "typeFilter": "タイプ", + "caughtFilter": "捕獲", + "unlocksFilter": "解放", + "miscFilter": "その他", + "sortFilter": "並べ替え", + "all": "すべて", + "normal": "非色違い", + "uncaught": "未捕獲", + "passive": "パッシブ", + "passiveUnlocked": "パッシブ - 解放済み", + "passiveLocked": "パッシブ - 未解放", + "passiveUnlockable": "パッシブ - 解放可能", + "costReduction": "ポイント削減", + "costReductionUnlocked": "ポイント削減 - 解放済み", + "costReductionLocked": "ポイント削減 - 未解放", + "costReductionUnlockable": "ポイント削減 - 解放可能", + "favorite": "お気に入り", + "isFavorite": "お気に入り - あり", + "notFavorite": "お気に入り - なし", + "ribbon": "リボン", + "hasWon": "リボン - あり", + "hasNotWon": "リボン - なし", + "hiddenAbility": "隠れ特性", + "hasHiddenAbility": "隠れ特性 - あり", + "noHiddenAbility": "隠れ特性 - なし", + "egg": "タマゴ", + "eggPurchasable": "タマゴ - 購入可能", + "pokerus": "ポケルス", + "hasPokerus": "ポケルス - あり", + "noPokerus": "ポケルス - なし", + "sortByNumber": "No.", + "sortByCost": "ポイント", + "sortByCandies": "アメの数", + "sortByIVs": "個体値", + "sortByName": "名前" +} diff --git a/src/locales/ja/game-mode.json b/src/locales/ja/game-mode.json new file mode 100644 index 00000000000..dc04b36932f --- /dev/null +++ b/src/locales/ja/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "クラシック", + "endless": "エンドレス", + "endlessSpliced": "エンドレス(吸収合体)", + "dailyRun": "デイリーラン", + "unknown": "???", + "challenge": "チャレンジ" +} diff --git a/src/locales/ja/game-stats-ui-handler.json b/src/locales/ja/game-stats-ui-handler.json new file mode 100644 index 00000000000..25301aa4297 --- /dev/null +++ b/src/locales/ja/game-stats-ui-handler.json @@ -0,0 +1,42 @@ +{ + "stats": "統計", + "playTime": "プレイ時間", + "totalBattles": "合計バトル数", + "starters": "スターター数", + "shinyStarters": "色違いスターター数", + "speciesSeen": "合計発見数", + "speciesCaught": "合計捕獲数", + "ribbonsOwned": "リボン数", + "classicRuns": "クラシックラン", + "classicWins": "クラシック勝利", + "dailyRunAttempts": "デイリーラン", + "dailyRunWins": "デイリーラン勝利", + "endlessRuns": "エンドレスラン", + "highestWaveEndless": "エンドレス最高ラウンド", + "highestMoney": "最大貯金", + "highestDamage": "最大ダメージ", + "highestHPHealed": "最大HP回復", + "pokemonEncountered": "遭遇したポケモン", + "pokemonDefeated": "倒したポケモン", + "pokemonCaught": "捕まえたポケモン", + "eggsHatched": "ふかしたタマゴ", + "subLegendsSeen": "見つけた順伝説ポケモン", + "subLegendsCaught": "捕まえた準伝説ポケモン", + "subLegendsHatched": "ふかした準伝説ポケモン", + "legendsSeen": "見つけた伝説ポケモン", + "legendsCaught": "捕まえた伝説ポケモン", + "legendsHatched": "ふかした伝説ポケモン", + "mythicalsSeen": "見つけた幻ポケモン", + "mythicalsCaught": "捕まえた幻ポケモン", + "mythicalsHatched": "ふかした幻ポケモン", + "shiniesSeen": "見つけた色違いポケモン", + "shiniesCaught": "捕まえた色違いポケモン", + "shiniesHatched": "ふかした色違いポケモン", + "pokemonFused": "吸収合体したポケモン", + "trainersDefeated": "倒したトレーナー", + "eggsPulled": "引いたタマゴ", + "rareEggsPulled": "引いたレアタマゴ", + "epicEggsPulled": "引いた超レアタマゴ", + "legendaryEggsPulled": "引いた伝説タマゴ", + "manaphyEggsPulled": "引いたマナフィタマゴ" +} diff --git a/src/locales/ja/growth.json b/src/locales/ja/growth.json new file mode 100644 index 00000000000..e5c1317632f --- /dev/null +++ b/src/locales/ja/growth.json @@ -0,0 +1,8 @@ +{ + "Erratic": "60万タイプ", + "Fast": "80万タイプ", + "Medium_Fast": "100万タイプ", + "Medium_Slow": "105万タイプ", + "Slow": "125万タイプ", + "Fluctuating": "164万タイプ" +} diff --git a/src/locales/ja/menu-ui-handler.json b/src/locales/ja/menu-ui-handler.json new file mode 100644 index 00000000000..851c8478e9d --- /dev/null +++ b/src/locales/ja/menu-ui-handler.json @@ -0,0 +1,29 @@ +{ + "GAME_SETTINGS": "設定", + "ACHIEVEMENTS": "実績", + "STATS": "統計", + "RUN_HISTORY": "ラン歴", + "EGG_LIST": "タマゴリスト", + "EGG_GACHA": "タマゴガチャ", + "MANAGE_DATA": "データ管理", + "COMMUNITY": "コミュニティ", + "SAVE_AND_QUIT": "セーブして終了", + "LOG_OUT": "ログアウト", + "slot": "スロット {{slotNumber}}", + "importSession": "セッションをインポート", + "importSlotSelect": "インポート先の スロットを 選んでください", + "exportSession": "セッションをエクスポート", + "exportSlotSelect": "エクスポート元の スロットを 選んでください", + "importRunHistory": "ラン歴をインポート", + "exportRunHistory": "ラン歴をエクスポート", + "importData": "データをインポート", + "exportData": "データをエクスポート", + "consentPreferences": "同意設定", + "linkDiscord": "Discord連携", + "unlinkDiscord": "Discord連携解除", + "linkGoogle": "Google連携", + "unlinkGoogle": "Google連携解除", + "cancel": "キャンセル", + "losingProgressionWarning": "戦闘開始からの データが セーブされません。\nよろしいですか?", + "noEggs": "現在は タマゴを ふかしていません!" +} diff --git a/src/locales/ja/menu.json b/src/locales/ja/menu.json new file mode 100644 index 00000000000..3630f7590ba --- /dev/null +++ b/src/locales/ja/menu.json @@ -0,0 +1,57 @@ +{ + "cancel": "キャンセル", + "continue": "つづきから", + "dailyRun": "日替わりラン(ベータ版)", + "loadGame": "セーブを読み込む", + "newGame": "はじめから", + "settings": "設定", + "selectGameMode": "ゲームモードを 選んでください。", + "logInOrCreateAccount": "始めるには、ログイン、または 登録して ください。\nメールアドレスは 必要が ありません!", + "username": "ユーザー名", + "password": "パスワード", + "login": "ログイン", + "orUse": "他の\nログイン方法", + "register": "登録", + "emptyUsername": "ユーザー名を 空にする ことは できません", + "invalidLoginUsername": "入力されたユーザー名は無効です", + "invalidRegisterUsername": "ユーザー名には 英文字、 数字、 アンダースコアのみを 含くむ必要が あります", + "invalidLoginPassword": "入力したパスワードは無効です", + "invalidRegisterPassword": "パスワードは 6文字以上 でなければなりません", + "usernameAlreadyUsed": "入力したユーザー名は すでに 使用されています", + "accountNonExistent": "入力したユーザーは 存在しません", + "unmatchingPassword": "入力したパスワードが 一致しません", + "passwordNotMatchingConfirmPassword": "パスワードは パスワード確認と 一致する 必要があります", + "confirmPassword": "パスワード確認", + "registrationAgeWarning": "登録では 13歳以上 であることを 確認します。", + "backToLogin": "ログインへ", + "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": "#", + "usernameScoreboard": "ユーザー名", + "score": "スコア", + "wave": "波", + "loading": "読み込み中…", + "loadingAsset": "読み込み中:{{assetName}}", + "playersOnline": "オンラインのプレイヤー", + "yes": "はい", + "no": "いいえ", + "disclaimer": "免責", + "disclaimerDescription": "このゲームは 未完成作品です。\nセーブデータの 損失を含める ゲーム性に関する 問題が 起きる可能性が あります。\nなお、ゲームは 予告なく変更される 可能性もあり、さらに更新され、完成されるとも 限りません。", + "choosePokemon": "ポケモンを選ぶ", + "renamePokemon": "ニックネームを変える", + "rename": "変える", + "nickname": "ニックネーム", + "errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。", + "noSaves": "何の セーブファイルも ありません!", + "tooManySaves": "セーブファイルが いっぱいです!" +} diff --git a/src/locales/ja/modifier-select-ui-handler.json b/src/locales/ja/modifier-select-ui-handler.json new file mode 100644 index 00000000000..d7428c8e373 --- /dev/null +++ b/src/locales/ja/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "アイテム移行", + "reroll": "選択肢変更", + "lockRarities": "レア度を固定", + "checkTeam": "手持ちを確認", + "transferDesc": "手持ちポケモンの 持たせるアイテムを 移行する", + "rerollDesc": "お金を 使って アイテムの 選択肢を 変更する", + "lockRaritiesDesc": "選択肢を 変更するときの レア度を 固定する\n(選択肢変更の価格は変わる)", + "checkTeamDesc": "手持ちポケモンの 状態を 確認する\nフォルムチェンジアイテムを 有効・無効にする", + "rerollCost": "{{formattedMoney}}円", + "itemCost": "{{formattedMoney}}円" +} diff --git a/src/locales/ja/modifier-type.json b/src/locales/ja/modifier-type.json new file mode 100644 index 00000000000..e78ffaf652e --- /dev/null +++ b/src/locales/ja/modifier-type.json @@ -0,0 +1,570 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{modifierCount}}x {{pokeballName}}", + "description": "{{pokeballName}} x{{modifierCount}}こ てにいれる (インベントリ: {{pokeballAmount}}) \nほそくりつ: {{catchRate}}" + }, + "AddVoucherModifierType": { + "name": "{{modifierCount}}x {{voucherTypeName}}", + "description": "{{voucherTypeName}} x{{modifierCount}}こ てにいれる" + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}} はこのアイテムを\nもつことができません!", + "tooMany": "{{pokemonName}} はこのアイテムを\nもちすぎています!" + } + }, + "PokemonHpRestoreModifierType": { + "description": "ポケモンの HPを {{restorePoints}} または {{restorePercent}}%のどちらか たかいほうを かいふくする", + "extra": { + "fully": "ポケモンのHPをすべてかいふくする", + "fullyWithStatus": "ポケモンの HPと じょうたいいじょうを かいふくする" + } + }, + "PokemonReviveModifierType": { + "description": "ひんしになってしまったポケモンの HP {{restorePercent}}%を かいふくする" + }, + "PokemonStatusHealModifierType": { + "description": "すべてのじょうたいいじょうを なおす" + }, + "PokemonPpRestoreModifierType": { + "description": "ポケモンが おぼえている わざの PPを {{restorePoints}}ずつ かいふくする", + "extra": { + "fully": "ポケモンが おぼえている わざの PPを すべて かいふくする" + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "ポケモンが おぼえている 4つの わざの PPを {{restorePoints}}ずつ かいふくする", + "extra": { + "fully": "ポケモンが おぼえている 4つの わざの PPを すべて かいふくする" + } + }, + "PokemonPpUpModifierType": { + "description": "ポケモンのわざのさいだいPPを さいだいPP 5ごとに {{upPoints}} ポイントずつ ふやします(さいだい3)" + }, + "PokemonNatureChangeModifierType": { + "name": "{{natureName}} Mint", + "description": "ポケモンのせいかくを {{natureName}}にかえて スターターのせいかくをえいきゅうにかいじょする" + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "バトル{{battleCount}}回の間  ダブルバトルになる  確率を 4倍に する" + }, + "TempStatStageBoosterModifierType": { + "description": "全員の 手持ちポケモンの {{stat}}を 最大5回の バトルの間に {{amount}}あげる.", + "extra": { + "stage": "1段階", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる" + }, + "PokemonLevelIncrementModifierType": { + "description": "ポケモンのレベルを1あげる" + }, + "AllPokemonLevelIncrementModifierType": { + "description": "すべてのパーティメンバーのレベルを1あげる" + }, + "BaseStatBoosterModifierType": { + "description": "ポケモンの{{stat}}のきほんステータスを10パーセントあげる。こたいちがたかいほどスタックのげんかいもたかくなる。" + }, + "AllPokemonFullHpRestoreModifierType": { + "description": "すべてのポケモンのHPを100パーセントかいふくする" + }, + "AllPokemonFullReviveModifierType": { + "description": "ひんしになったすべてのポケモンをふっかつさせ HPをぜんかいふくする" + }, + "MoneyRewardModifierType": { + "description": "{{moneyMultiplier}}ぶんのきんがくをあたえる (₽{{moneyAmount}})", + "extra": { + "small": "すくない", + "moderate": "ふつう", + "large": "おおい" + } + }, + "ExpBoosterModifierType": { + "description": "もらえるけいけんちを {{boostPercent}}パーセントふやす" + }, + "PokemonExpBoosterModifierType": { + "description": "もっているポケモンのけいけんちを {{boostPercent}}パーセントふやす" + }, + "PokemonFriendshipBoosterModifierType": { + "description": "しょうりごとに 50%パーセント なかよく なりやすくなる" + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "わざのめいちゅうりつを{{accuracyAmount}}ふやす (さいだい100)" + }, + "PokemonMultiHitModifierType": { + "description": "こうげきがもういちどあたる。そのたびにいりょくがそれぞれ60/75/82.5%へる" + }, + "TmModifierType": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "ポケモンに {{moveName}} をおしえる" + }, + "TmModifierTypeWithInfo": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "ポケモンに {{moveName}} をおしえる\n(Hold C or Shift for more info)" + }, + "EvolutionItemModifierType": { + "description": "とくていのポケモンをしんかさせる" + }, + "FormChangeItemModifierType": { + "description": "とくていのポケモンをフォームチェンジさせる" + }, + "FusePokemonModifierType": { + "description": "2匹のポケモンをけつごうする (とくせいをいどうし、きほんステータスとタイプをわけ、わざプールをきょうゆうする)" + }, + "TerastallizeModifierType": { + "name": "{{teraType}} Tera Shard", + "description": "ポケモンを{{teraType}}タイプにテラスタル(10かいのバトルまで)" + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "こうげきするとき あいてがもっているアイテムを {{chancePercent}}パーセントのかくりつでぬすむ" + }, + "TurnHeldItemTransferModifierType": { + "description": "まいターン あいてからひとつのもちものをてにいれる" + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "こうげきわざに {{chancePercent}}パーセントのかくりつで {{statusEffect}}をあたえる" + }, + "EnemyEndureChanceModifierType": { + "description": "こうげきをこらえるかくりつを{{chancePercent}}パーセントふやす" + }, + "RARE_CANDY": { + "name": "ふしぎなアメ" + }, + "RARER_CANDY": { + "name": "もっとふしぎなアメ" + }, + "MEGA_BRACELET": { + "name": "メガバングル", + "description": "メガストーンがつかえるようになる" + }, + "DYNAMAX_BAND": { + "name": "ダイマックスバンド", + "description": "ダイスープがつかえるようになる" + }, + "TERA_ORB": { + "name": "テラスタルオーブ", + "description": "テラピースがつかえるようになる" + }, + "MAP": { + "name": "ちず", + "description": "わかれみちでいきさきをえらべるようになる" + }, + "POTION": { + "name": "キズぐすり" + }, + "SUPER_POTION": { + "name": "いいキズぐすり" + }, + "HYPER_POTION": { + "name": "すごいキズぐすり" + }, + "MAX_POTION": { + "name": "まんたんのくすり" + }, + "FULL_RESTORE": { + "name": "かいふくのくすり" + }, + "REVIVE": { + "name": "げんきのかけら" + }, + "MAX_REVIVE": { + "name": "げんきのかたまり" + }, + "FULL_HEAL": { + "name": "なんでもなおし" + }, + "SACRED_ASH": { + "name": "せいなるはい" + }, + "REVIVER_SEED": { + "name": "ふっかつのタネ", + "description": "ひんしになったときもっているポケモンをHPはんぶんでふっかつさせる" + }, + "WHITE_HERB": { + "name": "White Herb", + "description": "An item to be held by a Pokémon. It will restore any lowered stat in battle." + }, + "ETHER": { + "name": "ピーピーエイド" + }, + "MAX_ETHER": { + "name": "ピーピーリカバー" + }, + "ELIXIR": { + "name": "ピーピーエイダー" + }, + "MAX_ELIXIR": { + "name": "ピーピーマックス" + }, + "PP_UP": { + "name": "ポイントアップ" + }, + "PP_MAX": { + "name": "ポイントマックス" + }, + "LURE": { + "name": "ダブルバトルコロン" + }, + "SUPER_LURE": { + "name": "シルバーコロン" + }, + "MAX_LURE": { + "name": "ゴールドコロン" + }, + "MEMORY_MUSHROOM": { + "name": "きおくキノコ", + "description": "ポケモンのわすれたわざをおぼえさせる" + }, + "EXP_SHARE": { + "name": "がくしゅうそうち", + "description": "バトルにさんかしていないポケモンが けいけんちの20パーセントをもらう" + }, + "EXP_BALANCE": { + "name": "バランスそうち", + "description": "レベルがひくいパーティメンバーがもらうけいけんちがふえる" + }, + "OVAL_CHARM": { + "name": "まるいおまもり", + "description": "バトルにふくすうのポケモンがさんかするとけいけんちが10パーセントふえる" + }, + "EXP_CHARM": { + "name": "けいけんちおまもり" + }, + "SUPER_EXP_CHARM": { + "name": "いいけいけんちおまもり" + }, + "GOLDEN_EXP_CHARM": { + "name": "ゴールドけいけんちおまもり" + }, + "LUCKY_EGG": { + "name": "しあわせタマゴ" + }, + "GOLDEN_EGG": { + "name": "おうごんタマゴ" + }, + "SOOTHE_BELL": { + "name": "やすらぎのすず" + }, + "SCOPE_LENS": { + "name": "ピントレンズ", + "description": "弱点が 見える レンズ。持たせた ポケモンの技が 急所に 当たりやすくなる。" + }, + "DIRE_HIT": { + "name": "クリティカット", + "extra": { + "raises": "きゅうしょりつ" + } + }, + "LEEK": { + "name": "ながねぎ", + "description": "とても長くて 硬いクキ。カモネギに 持たせると 技が 急所に 当たりやすくなる。" + }, + "EVIOLITE": { + "name": "しんかのきせき", + "description": "進化の不思議な かたまり。持たせると 進化前ポケモンの 防御と 特防が あがる。" + }, + "SOUL_DEW": { + "name": "こころのしずく", + "description": "ポケモンのせいかくがステータスにあたえるえいきょうを10%ふやす(合算)" + }, + "NUGGET": { + "name": "きんのたま" + }, + "BIG_NUGGET": { + "name": "でかいきんのたま" + }, + "RELIC_GOLD": { + "name": "こだいのきんか" + }, + "AMULET_COIN": { + "name": "おまもりこばん", + "description": "もらえる おかねが 20パーセント ふえる" + }, + "GOLDEN_PUNCH": { + "name": "ゴールドパンチ", + "description": "あたえたちょくせつダメージの50パーセントをおかねとしてもらえる" + }, + "COIN_CASE": { + "name": "コインケース", + "description": "10かいのバトルごとにもちきんの10パーセントをりしとしてうけとる" + }, + "LOCK_CAPSULE": { + "name": "ロックカプセル", + "description": "リロールするときにアイテムのレアリティをロックできる" + }, + "GRIP_CLAW": { + "name": "ねばりのかぎづめ" + }, + "WIDE_LENS": { + "name": "こうかくレンズ" + }, + "MULTI_LENS": { + "name": "マルチレンズ" + }, + "HEALING_CHARM": { + "name": "ヒーリングチャーム", + "description": "HPをかいふくするわざとアイテムのこうかを10パーセントあげる (ふっかつはのぞく)" + }, + "CANDY_JAR": { + "name": "アメボトル", + "description": "ふしぎなアメのアイテムでふえるレベルが1ふえる" + }, + "BERRY_POUCH": { + "name": "きのみぶくろ", + "description": "つかったきのみがつかわれないかくりつを30パーセントふやす" + }, + "FOCUS_BAND": { + "name": "きあいのハチマキ", + "description": "ひんしになるダメージをうけてもHP1でたえるかくりつを10パーセントふやす" + }, + "QUICK_CLAW": { + "name": "せんせいのツメ", + "description": "すばやさにかかわらず さきにこうどうするかくりつを10パーセントふやす (ゆうせんどのあと)" + }, + "KINGS_ROCK": { + "name": "おうじゃのしるし", + "description": "こうげきわざがあいてをひるませるかくりつを10パーセントふやす" + }, + "LEFTOVERS": { + "name": "たべのこし", + "description": "ポケモンのさいだいHPの1/16をまいターンかいふくする" + }, + "SHELL_BELL": { + "name": "かいがらのすず", + "description": "ポケモンがあたえたダメージの1/8をかいふくする" + }, + "TOXIC_ORB": { + "name": "どくどくだま", + "description": "ターンの終わりに すでに じょうたいじょうしょうが なければ もうどくの じょうたいに なる" + }, + "FLAME_ORB": { + "name": "かえんだま", + "description": "ターンの終わりに すでに じょうたいじょうしょうが なければ やけどの じょうたいに なる" + }, + "BATON": { + "name": "バトン", + "description": "ポケモンをこうたいするときにこうかをひきつぎ わなをかいひすることもできる" + }, + "SHINY_CHARM": { + "name": "ひかるおまもり", + "description": "やせいのポケモンがいろちがいポケモンであるかくりつをおおきくふやす" + }, + "ABILITY_CHARM": { + "name": "とくせいおまもり", + "description": "やせいのポケモンがかくれとくせいをもつかくりつをおおきくふやす" + }, + "IV_SCANNER": { + "name": "こたいちスキャナー", + "description": "やせいのポケモンのこたいちをスキャンできる。スタックごとに2つのこたいちがあきらかになる。もっともたかいこたいちがさいしょにひょうじされる" + }, + "DNA_SPLICERS": { + "name": "いでんしのくさび" + }, + "MINI_BLACK_HOLE": { + "name": "ミニブラックホール" + }, + "GOLDEN_POKEBALL": { + "name": "ゴールドモンスターボール", + "description": "バトルごとに1つのアイテムオプションをふやす" + }, + "ENEMY_DAMAGE_BOOSTER": { + "name": "ダメージトークン", + "description": "ダメージを5%ふやす" + }, + "ENEMY_DAMAGE_REDUCTION": { + "name": "プロテクショントークン", + "description": "うけるダメージを2.5%へらす" + }, + "ENEMY_HEAL": { + "name": "かいふくトークン", + "description": "まいターンさいだいHPの2%をかいふくする" + }, + "ENEMY_ATTACK_POISON_CHANCE": { + "name": "どくトークン" + }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { + "name": "まひトークン" + }, + "ENEMY_ATTACK_BURN_CHANCE": { + "name": "やけどトークン" + }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { + "name": "なおしトークン", + "description": "まいターン2.5%のかくりつでじょうたいじょうしょうをかいふくする" + }, + "ENEMY_ENDURE_CHANCE": { + "name": "こらえるトークン" + }, + "ENEMY_FUSED_CHANCE": { + "name": "フュージョントークン", + "description": "やせいのポケモンがフュージョンするかくりつを1%ふやす" + } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { + "name": "でんきだま", + "description": "ピカチュウに 持たせると 攻撃と 特攻が あがる 不思議な玉。" + }, + "THICK_CLUB": { + "name": "ふといホネ", + "description": "なにかの 硬いホネ。カラカラ または ガラガラに 持たせると 攻撃が あがる。" + }, + "METAL_POWDER": { + "name": "メタルパウダー", + "description": "メタモンに 持たせると 防御が あがる 不思議な粉。とても こまかくて 硬い。" + }, + "QUICK_POWDER": { + "name": "スピードパウダー", + "description": "メタモンに 持たせると 素早さが あがる 不思議 粉。とても こまかくて 硬い。" + } + }, + "TempStatStageBoosterItem": { + "x_attack": "プラスパワー", + "x_defense": "ディフェンダー", + "x_sp_atk": "スペシャルアップ", + "x_sp_def": "スペシャルガード", + "x_speed": "スピーダー", + "x_accuracy": "ヨクアタール" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "シルクのスカーフ", + "black_belt": "くろおび", + "sharp_beak": "するどいくちばし", + "poison_barb": "どくバリ", + "soft_sand": "やわらかいすな", + "hard_stone": "かたいいし", + "silver_powder": "ぎんのこな", + "spell_tag": "のろいのおふだ", + "metal_coat": "メタルコート", + "charcoal": "もくたん", + "mystic_water": "しんぴのしずく", + "miracle_seed": "きせきのタネ", + "magnet": "じしゃく", + "twisted_spoon": "まがったスプーン", + "never_melt_ice": "とけないこおり", + "dragon_fang": "りゅうのキバ", + "black_glasses": "くろいメガネ", + "fairy_feather": "ようせいのハネ" + }, + "BaseStatBoosterItem": { + "hp_up": "マックスアップ", + "protein": "タウリン", + "iron": "ブロムヘキシン", + "calcium": "リゾチウム", + "zinc": "キトサン", + "carbos": "インドメタシン" + }, + "EvolutionItem": { + "NONE": "None", + "LINKING_CORD": "つながりのヒモ", + "SUN_STONE": "たいようのいし", + "MOON_STONE": "つきのいし", + "LEAF_STONE": "リーフのいし", + "FIRE_STONE": "ほのおのいし", + "WATER_STONE": "みずのいし", + "THUNDER_STONE": "かみなりのいし", + "ICE_STONE": "こおりのいし", + "DUSK_STONE": "やみのいし", + "DAWN_STONE": "めざめいし", + "SHINY_STONE": "ひかりのいし", + "CRACKED_POT": "われたポット", + "SWEET_APPLE": "あまーいりんご", + "TART_APPLE": "すっぱいりんご", + "STRAWBERRY_SWEET": "いちごアメざいく", + "UNREMARKABLE_TEACUP": "ボンサクのちゃわん", + "CHIPPED_POT": "かけたポット", + "BLACK_AUGURITE": "くろのきせき", + "GALARICA_CUFF": "ガラナツブレス", + "GALARICA_WREATH": "ガラナツリース", + "PEAT_BLOCK": "ピートブロック", + "AUSPICIOUS_ARMOR": "イワイノヨロイ", + "MALICIOUS_ARMOR": "ノロイノヨロイ", + "MASTERPIECE_TEACUP": "ケッサクのちゃわん", + "METAL_ALLOY": "ふくごうきんぞく", + "SCROLL_OF_DARKNESS": "あくのかけじく", + "SCROLL_OF_WATERS": "みずのかけじく", + "SYRUPY_APPLE": "みついりりんご" + }, + "FormChangeItem": { + "NONE": "None", + "ABOMASITE": "ユキノオナイト", + "ABSOLITE": "アブソルナイト", + "AERODACTYLITE": "プテラナイト", + "AGGRONITE": "ボスゴドラナイト", + "ALAKAZITE": "フーディナイト", + "ALTARIANITE": "チルタリスナイト", + "AMPHAROSITE": "デンリュウナイト", + "AUDINITE": "タブンネナイト", + "BANETTITE": "ジュペッタナイト", + "BEEDRILLITE": "スピアナイト", + "BLASTOISINITE": "カメックスナイト", + "BLAZIKENITE": "バシャーモナイト", + "CAMERUPTITE": "バクーダナイト", + "CHARIZARDITE_X": "リザードナイトX", + "CHARIZARDITE_Y": "リザードナイトY", + "DIANCITE": "ディアンシナイト", + "GALLADITE": "エルレイドナイト", + "GARCHOMPITE": "ガブリアスナイト", + "GARDEVOIRITE": "サーナイトナイト", + "GENGARITE": "ゲンガナイト", + "GLALITITE": "オニゴーリナイト", + "GYARADOSITE": "ギャラドスナイト", + "HERACRONITE": "ヘラクロスナイト", + "HOUNDOOMINITE": "ヘルガナイト", + "KANGASKHANITE": "ガルーラナイト", + "LATIASITE": "ラティアスナイト", + "LATIOSITE": "ラティオスナイト", + "LOPUNNITE": "ミミロップナイト", + "LUCARIONITE": "ルカリオナイト", + "MANECTITE": "ライボルトナイト", + "MAWILITE": "クチートナイト", + "MEDICHAMITE": "チャーレムナイト", + "METAGROSSITE": "メタグロスナイト", + "MEWTWONITE_X": "ミュウツナイトX", + "MEWTWONITE_Y": "ミュウツナイトY", + "PIDGEOTITE": "ピジョットナイト", + "PINSIRITE": "カイロスナイト", + "RAYQUAZITE": "レックウザナイト", + "SABLENITE": "ヤミラミナイト", + "SALAMENCITE": "ボーマンダナイト", + "SCEPTILITE": "ジュカインナイト", + "SCIZORITE": "ハッサムナイト", + "SHARPEDONITE": "サメハダナイト", + "SLOWBRONITE": "ヤドランナイト", + "STEELIXITE": "ハガネールナイト", + "SWAMPERTITE": "ラグラージナイト", + "TYRANITARITE": "バンギラスナイト", + "VENUSAURITE": "フシギバナイト", + "BLUE_ORB": "あいいろのたま", + "RED_ORB": "べにいろのたま", + "SHARP_METEORITE": "シャープなうんせき", + "HARD_METEORITE": "かたいうんせき", + "SMOOTH_METEORITE": "やわらかいうんせき", + "ADAMANT_CRYSTAL": "だいこんごうだま", + "LUSTROUS_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": "いしずえのめん", + "SHOCK_DRIVE": "イナズマカセット", + "BURN_DRIVE": "ブレイズカセット", + "CHILL_DRIVE": "フリーズカセット", + "DOUSE_DRIVE": "アクアカセット", + "ULTRANECROZIUM_Z": "ウルトラネクロZ" + } +} diff --git a/src/locales/ja/modifier.json b/src/locales/ja/modifier.json new file mode 100644 index 00000000000..c33bb9be151 --- /dev/null +++ b/src/locales/ja/modifier.json @@ -0,0 +1,12 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で もちこたえた!", + "turnHealApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 少し 体力を 回復した!", + "hitHealApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 少し 体力を 回復した!", + "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 復活した!", + "resetNegativeStatStageApply": "{{pokemonNameWithAffix}}は {{typeName}}で\n下がった能力が 元に戻った!", + "moneyInterestApply": "{{typeName}}から {{moneyAmount}}円 取得した!", + "turnHeldItemTransferApply": "{{pokemonName}}の {{typeName}}が\n{{pokemonNameWithAffix}}の {{itemName}}を 吸い取った!", + "contactHeldItemTransferApply": "{{pokemonName}}の {{typeName}}が\n{{pokemonNameWithAffix}}の {{itemName}}を 奪い取った!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}は\n体力を 回復!", + "bypassSpeedChanceApply": "{{pokemonName}}は {{itemName}}で\n行動が はやくなった!" +} diff --git a/src/locales/ja/move-trigger.json b/src/locales/ja/move-trigger.json new file mode 100644 index 00000000000..7449d8c6e4b --- /dev/null +++ b/src/locales/ja/move-trigger.json @@ -0,0 +1,69 @@ +{ + "hitWithRecoil": "{{pokemonName}}は\n反動による ダメージを 受けた!", + "cutHpPowerUpMove": "{{pokemonName}}は\n体力を 削って 技の 威力を 上がった!", + "absorbedElectricity": "{{pokemonName}}は\n 電気を 吸収した!", + "switchedStatChanges": "{{pokemonName}}は 相手と 自分の\n能力変化を 入れ替えた!", + "switchedTwoStatChanges": "{{pokemonName}}は 相手と 自分の {{firstStat}}と\n{{secondStat}}の 能力変化を 入れ替えた!", + "switchedStat": "{{pokemonName}}は 相手と {{stat}}を 入れ替えた!", + "sharedGuard": "{{pokemonName}}は\nお互いのガードを シェアした!", + "sharedPower": "{{pokemonName}}は\nお互いのパワーを シェアした!", + "goingAllOutForAttack": "{{pokemonName}}は\n本気を 出した!", + "regainedHealth": "{{pokemonName}}は\n体力を 回復した!", + "keptGoingAndCrashed": "勢い余って {{pokemonName}}は\n地面に ぶつかった!", + "fled": "{{pokemonName}}は 逃げ出した!", + "cannotBeSwitchedOut": "{{pokemonName}}を\n戻すことが できない!", + "swappedAbilitiesWithTarget": "{{pokemonName}}は\nお互いの 特性を 入れ替えた!", + "coinsScatteredEverywhere": "小判が 辺りに 散らばった!", + "attackedByItem": "{{pokemonName}}に\n{{itemName}}が おそいかかる!", + "whippedUpAWhirlwind": "{{pokemonName}}の 周りで\n空気が 渦を巻く!", + "flewUpHigh": "{{pokemonName}}は\n空高く 飛び上がった!", + "tookInSunlight": "{{pokemonName}}は\n光を 吸収した!", + "dugAHole": "{{pokemonName}}は\n地面に 潜った!", + "loweredItsHead": "{{pokemonName}}は\n首を 引っ込めた!", + "isGlowing": "{{pokemonName}}を\n激しい光が 包む!", + "bellChimed": "鈴の音が 響き渡った!", + "foresawAnAttack": "{{pokemonName}}は\n未来に 攻撃を 予知した!", + "isTighteningFocus": "{{pokemonName}}は\n集中力を 高めている!", + "hidUnderwater": "{{pokemonName}}は\n水中に 身を潜めた!", + "soothingAromaWaftedThroughArea": "心地よい 香りが 広がった!", + "sprangUp": "{{pokemonName}}は\n高く 飛び跳ねた!", + "choseDoomDesireAsDestiny": "{{pokemonName}}は\nはめつのねがいを 未来に 託した!", + "vanishedInstantly": "{{pokemonName}}の 姿が\n一瞬にして 消えた!", + "tookTargetIntoSky": "{{pokemonName}}は {{targetName}}を\n上空に 連れ去った!", + "becameCloakedInFreezingLight": "{{pokemonName}}は\n冷たい光に 包まれた!", + "becameCloakedInFreezingAir": "{{pokemonName}}は\n凍える空気に 包まれた!", + "isChargingPower": "{{pokemonName}}は\nパワーを 溜め込んでいる!", + "burnedItselfOut": "{{pokemonName}}の 炎は 燃え尽きた!", + "startedHeatingUpBeak": "{{pokemonName}}は\nクチバシを 加熱し始めた!", + "setUpShellTrap": "{{pokemonName}}は\nトラップシェルを 仕掛けた!", + "isOverflowingWithSpacePower": "{{pokemonName}}に\n宇宙の 力が 溢れ出す!", + "usedUpAllElectricity": "{{pokemonName}}は\n電気を 使い切った!", + "stoleItem": "{{pokemonName}}は\n{{targetName}}の {{itemName}}を 盗んだ!", + "incineratedItem": "{{pokemonName}}は\n{{targetName}}の {{itemName}}を 燃やした!", + "knockedOffItem": "{{pokemonName}}は\n{{targetName}}の {{itemName}}を はたき落とした!", + "tookMoveAttack": "{{pokemonName}}は\n{{moveName}}の 攻撃を 受けた!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}}は\n体力を 削って {{statName}}全開!", + "copiedStatChanges": "{{pokemonName}}は {{targetName}}の\n能力変化を コピーした!", + "magnitudeMessage": "マグニチュード{{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}}は {{targetName}}に\n狙いを 定めた!", + "transformedIntoType": "{{pokemonName}}は\n{{typeName}}タイプに なった!", + "copiedMove": "{{pokemonName}}は\n{{moveName}}を コピーした!", + "sketchedMove": "{{pokemonName}}は\n{{moveName}}を スケッチした!", + "acquiredAbility": "{{pokemonName}}の 特性が\n{{abilityName}}に なった!", + "copiedTargetAbility": "{{pokemonName}}は\n{{targetName}}の {{abilityName}}を コピーした!", + "transformedIntoTarget": "{{pokemonName}}は\n{{targetName}}に 変身した!", + "tryingToTakeFoeDown": "{{pokemonName}}は 相手を\nみちづれに しようとしている!", + "addType": "{{pokemonName}}に\n{{typeName}}タイプが 追加された!", + "cannotUseMove": "{{pokemonName}}は\n{{moveName}}を 使えなかった!", + "healHp": "{{pokemonName}}の\n体力が 回復した!", + "sacrificialFullRestore": "{{pokemonName}}の\nいやしのねがいが 叶った!", + "invertStats": "{{pokemonName}}は\n能力変化が ひっくり返った!", + "resetStats": "{{pokemonName}}の\n能力変化が 元に戻った!", + "statEliminated": "全ての 能力変化が 元に戻った!", + "faintCountdown": "{{pokemonName}}は\n{{turnCount}}ターン後に 滅びてしまう!", + "copyType": "{{pokemonName}}は {{targetPokemonName}}と\n同じタイプに なった!", + "suppressAbilities": "{{pokemonName}}の 特性が 効かなくなった!", + "revivalBlessing": "{{pokemonName}}は\n復活して 戦えるようになった!", + "swapArenaTags": "{{pokemonName}}は\nお互いの 場の 効果を 入れ替えた!", + "exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った!" +} diff --git a/src/locales/ja/move.json b/src/locales/ja/move.json new file mode 100644 index 00000000000..fbeb2132d23 --- /dev/null +++ b/src/locales/ja/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "はたく", + "effect": "長い しっぽや 手などを 使って 相手を はたいて 攻撃する。" + }, + "karateChop": { + "name": "からてチョップ", + "effect": "鋭い チョップで 相手を たたいて 攻撃する。 急所に 当たりやすい。" + }, + "doubleSlap": { + "name": "おうふくビンタ", + "effect": "おうふく ビンタで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。" + }, + "cometPunch": { + "name": "れんぞくパンチ", + "effect": "どとうの パンチで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。" + }, + "megaPunch": { + "name": "メガトンパンチ", + "effect": "力を こめた パンチで 相手を 攻撃する。" + }, + "payDay": { + "name": "ネコにこばん", + "effect": "相手の 体に 小判を 投げつけて 攻撃する。 戦闘の あとで お金が もらえる。" + }, + "firePunch": { + "name": "ほのおのパンチ", + "effect": "炎を こめた パンチで 相手を 攻撃する。 やけど状態に することが ある。" + }, + "icePunch": { + "name": "れいとうパンチ", + "effect": "冷気を こめた パンチで 相手を 攻撃する。 こおり状態に することが ある。" + }, + "thunderPunch": { + "name": "かみなりパンチ", + "effect": "電撃を こめた パンチで 相手を 攻撃する。 まひ状態に することが ある。" + }, + "scratch": { + "name": "ひっかく", + "effect": "硬く とがった 鋭い ツメで 相手を ひっかいて 攻撃する。" + }, + "viseGrip": { + "name": "はさむ", + "effect": "相手を 両側から はさんで ダメージを あたえる。" + }, + "guillotine": { + "name": "ハサミギロチン", + "effect": "大きな ハサミで 相手を 切り裂いて 攻撃する。 当たれば 一撃で ひんしに する。" + }, + "razorWind": { + "name": "かまいたち", + "effect": "風の 刃を つくり 2ターン目に 相手を 攻撃する。 急所に 当たりやすい。" + }, + "swordsDance": { + "name": "つるぎのまい", + "effect": "戦いの舞を 激しく おどって 気合を 高める。 自分の 攻撃を ぐーんと あげる。" + }, + "cut": { + "name": "いあいぎり", + "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。" + }, + "gust": { + "name": "かぜおこし", + "effect": "翼で おこした 激しい 風を 相手に ぶつけて 攻撃する。" + }, + "wingAttack": { + "name": "つばさでうつ", + "effect": "大きく ひろげた りっぱな 翼を 相手に ぶつけて 攻撃する。" + }, + "whirlwind": { + "name": "ふきとばし", + "effect": "相手を 吹きとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" + }, + "fly": { + "name": "そらをとぶ", + "effect": "1ターン目で 空へ 飛び 2ターン目に 相手を 攻撃する。" + }, + "bind": { + "name": "しめつける", + "effect": "長い 体や つるなどを 使い 4ー5ターンの 間 相手を 締めつけて 攻撃する。" + }, + "slam": { + "name": "たたきつける", + "effect": "長い しっぽや つるなどを 使い 相手を たたきつけて 攻撃する。" + }, + "vineWhip": { + "name": "つるのムチ", + "effect": "ムチのように しなる 細長い つるで 相手を たたきつけて 攻撃する。" + }, + "stomp": { + "name": "ふみつけ", + "effect": "大きな 足で 相手を 踏みつけて 攻撃する。 相手を ひるませることが ある。" + }, + "doubleKick": { + "name": "にどげり", + "effect": "2本の 足で 相手を けとばして 攻撃する。 2回連続で ダメージを 与える。" + }, + "megaKick": { + "name": "メガトンキック", + "effect": "ものすごい 力を こめた キックで 相手を けとばして 攻撃する。" + }, + "jumpKick": { + "name": "とびげり", + "effect": "高い ジャンプからの キックで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。" + }, + "rollingKick": { + "name": "まわしげり", + "effect": "体を 素早く 回転させながら けとばして 攻撃する。 相手を ひるませる ことが ある。" + }, + "sandAttack": { + "name": "すなかけ", + "effect": "相手の 顔に 砂を かけて 命中率を さげる。" + }, + "headbutt": { + "name": "ずつき", + "effect": "頭を 突きだして まっすぐ つっこんで 攻撃する。 相手を ひるませることが ある。" + }, + "hornAttack": { + "name": "つのでつく", + "effect": "鋭く とがった つので 相手を 攻撃する。" + }, + "furyAttack": { + "name": "みだれづき", + "effect": "つのや くちばしで 相手を つついて 攻撃する。 2ー5回の 間 連続で だす。" + }, + "hornDrill": { + "name": "つのドリル", + "effect": "回転する つのを 相手に 突き刺して 攻撃する。 当たれば 一撃で ひんしに する。" + }, + "tackle": { + "name": "たいあたり", + "effect": "相手に むかって 全身で ぶつかっていき 攻撃する。" + }, + "bodySlam": { + "name": "のしかかり", + "effect": "全身で 相手に のしかかり 攻撃する。 まひ状態に することが ある。" + }, + "wrap": { + "name": "まきつく", + "effect": "長い 体や つるなどを 使って 4ー5ターンの 間 相手に まきついて 攻撃する。" + }, + "takeDown": { + "name": "とっしん", + "effect": "すごい 勢いで 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。" + }, + "thrash": { + "name": "あばれる", + "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。" + }, + "doubleEdge": { + "name": "すてみタックル", + "effect": "命を 懸けて 相手に 突進して 攻撃する。 自分も かなり ダメージを 受ける。" + }, + "tailWhip": { + "name": "しっぽをふる", + "effect": "しっぽを 左右に かわいく ふって 油断を 誘う。 相手の 防御を さげる。" + }, + "poisonSting": { + "name": "どくばり", + "effect": "毒の ある ハリを 相手に 突き刺して 攻撃する。 毒状態に することが ある。" + }, + "twineedle": { + "name": "ダブルニードル", + "effect": "2本の ハリを 相手に 突き刺し 2回連続で ダメージ。 毒状態に することが ある。" + }, + "pinMissile": { + "name": "ミサイルばり", + "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + }, + "leer": { + "name": "にらみつける", + "effect": "鋭い 目つきで おびえさせて 相手の 防御を さげる。" + }, + "bite": { + "name": "かみつく", + "effect": "鋭く とがった 歯で かみついて 攻撃する。 相手を ひるませることが ある。" + }, + "growl": { + "name": "なきごえ", + "effect": "かわいい なきごえを 聞かせて 気を ひき 油断を させて 相手の 攻撃を さげる。" + }, + "roar": { + "name": "ほえる", + "effect": "相手を 逃がして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" + }, + "sing": { + "name": "うたう", + "effect": "心地好い きれいな 歌声を 聞かせて 相手を 眠り状態に する。" + }, + "supersonic": { + "name": "ちょうおんぱ", + "effect": "特殊な 音波を 体から 発して 相手を 混乱させる。" + }, + "sonicBoom": { + "name": "ソニックブーム", + "effect": "衝撃波を 相手に ぶつけて 攻撃する。 20の ダメージを 決まって 与える。" + }, + "disable": { + "name": "かなしばり", + "effect": "相手の 動きを とめて 直前に だしていた 技を 4ターンの 間 使えなくする。" + }, + "acid": { + "name": "ようかいえき", + "effect": "強い 酸を 相手に かけて 攻撃する。 相手の 特防を さげることが ある。" + }, + "ember": { + "name": "ひのこ", + "effect": "小さな 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。" + }, + "flamethrower": { + "name": "かえんほうしゃ", + "effect": "激しい 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。" + }, + "mist": { + "name": "しろいきり", + "effect": "白い霧で 体を おおう。 5ターンの 間 相手に 能力を さげられなく なる。" + }, + "waterGun": { + "name": "みずでっぽう", + "effect": "水を 勢いよく 相手に 発射して 攻撃する。" + }, + "hydroPump": { + "name": "ハイドロポンプ", + "effect": "大量の 水を 激しい 勢いで 相手に 発射して 攻撃する。" + }, + "surf": { + "name": "なみのり", + "effect": "大きな 波で 自分の 周りに いるものを 攻撃する。" + }, + "iceBeam": { + "name": "れいとうビーム", + "effect": "凍える ビームを 相手に 発射して 攻撃する。 こおり状態に することが ある。" + }, + "blizzard": { + "name": "ふぶき", + "effect": "激しい 吹雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。" + }, + "psybeam": { + "name": "サイケこうせん", + "effect": "不思議な 光線を 相手に 発射して 攻撃する。 混乱させることが ある。" + }, + "bubbleBeam": { + "name": "バブルこうせん", + "effect": "泡を 勢いよく 相手に 発射して 攻撃する。 素早さを さげる ことが ある。" + }, + "auroraBeam": { + "name": "オーロラビーム", + "effect": "にじいろの ビームを 相手に 発射して 攻撃する。 攻撃を さげる ことが ある。" + }, + "hyperBeam": { + "name": "はかいこうせん", + "effect": "強い 光線を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" + }, + "peck": { + "name": "つつく", + "effect": "鋭く とがった くちばしや つので 相手を 突いて 攻撃する。" + }, + "drillPeck": { + "name": "ドリルくちばし", + "effect": "回転しながら とがった くちばしを 相手に 突き刺して 攻撃する。" + }, + "submission": { + "name": "じごくぐるま", + "effect": "地面に 自分ごと 相手を 投げつけて 攻撃する。 自分も 少し ダメージを 受ける。" + }, + "lowKick": { + "name": "けたぐり", + "effect": "足を 強く けり 相手を 転ばせて 攻撃する。 相手が 重いほど 威力が あがる。" + }, + "counter": { + "name": "カウンター", + "effect": "相手から 受けた 物理攻撃の ダメージを 2倍に して 同じ 相手に 返す。" + }, + "seismicToss": { + "name": "ちきゅうなげ", + "effect": "引力を 使い 投げとばす。 自分の レベルと 同じ ダメージを 相手に 与える。" + }, + "strength": { + "name": "かいりき", + "effect": "こん身の 力で 相手を なぐりつけて 攻撃する。" + }, + "absorb": { + "name": "すいとる", + "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" + }, + "megaDrain": { + "name": "メガドレイン", + "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" + }, + "leechSeed": { + "name": "やどりぎのタネ", + "effect": "植えつけた 相手の HPを 毎ターン 少しだけ 吸い取り 自分の HPを 回復する。" + }, + "growth": { + "name": "せいちょう", + "effect": "体を 一気に 大きく 生長させて 攻撃と 特攻を あげる。" + }, + "razorLeaf": { + "name": "はっぱカッター", + "effect": "はっぱを とばして 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" + }, + "solarBeam": { + "name": "ソーラービーム", + "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に 光の 束を 発射して 攻撃する。" + }, + "poisonPowder": { + "name": "どくのこな", + "effect": "毒の ある 粉を たくさん ふりまいて 相手を 毒状態に する。" + }, + "stunSpore": { + "name": "しびれごな", + "effect": "しびれる 粉を たくさん ふりまいて 相手を まひ状態に する。" + }, + "sleepPowder": { + "name": "ねむりごな", + "effect": "眠くなる 粉を たくさん ふりまいて 相手を 眠り状態に する。" + }, + "petalDance": { + "name": "はなびらのまい", + "effect": "2ー3ターンの 間 花を まきちらして 相手を 攻撃する。 まきちらした あとは 混乱する。" + }, + "stringShot": { + "name": "いとをはく", + "effect": "口から 吹きだした 糸を まきつけて 相手の 素早さを がくっと さげる。" + }, + "dragonRage": { + "name": "りゅうのいかり", + "effect": "怒りの 衝撃波を 相手に ぶつけて 攻撃する。 40の ダメージを 決まって 与える。" + }, + "fireSpin": { + "name": "ほのおのうず", + "effect": "激しく 渦をまく 炎の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + }, + "thunderShock": { + "name": "でんきショック", + "effect": "電気の 刺激を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。" + }, + "thunderbolt": { + "name": "10まんボルト", + "effect": "強い 電撃を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。" + }, + "thunderWave": { + "name": "でんじは", + "effect": "弱い 電撃を 浴びせることで 相手を まひ状態に する。" + }, + "thunder": { + "name": "かみなり", + "effect": "激しい 雷を 相手に 落として 攻撃する。 まひ状態に することが ある。" + }, + "rockThrow": { + "name": "いわおとし", + "effect": "小さな 岩を 持ちあげて 相手に 投げつけて 攻撃する。" + }, + "earthquake": { + "name": "じしん", + "effect": "地震の 衝撃で 自分の 周りに いるものを 攻撃する。" + }, + "fissure": { + "name": "じわれ", + "effect": "地割れの 裂け目に 相手を 落として 攻撃する。 当たれば 一撃で ひんしに する。" + }, + "dig": { + "name": "あなをほる", + "effect": "1ターン目に 潜り 2ターン目で 相手を 攻撃する。" + }, + "toxic": { + "name": "どくどく", + "effect": "相手を 猛毒の 状態に する。 ターンが すすむほど 毒の ダメージが 増えていく。" + }, + "confusion": { + "name": "ねんりき", + "effect": "弱い 念力を 相手に 送って 攻撃する。 相手を 混乱させることが ある。" + }, + "psychic": { + "name": "サイコキネシス", + "effect": "強い 念力を 相手に 送って 攻撃する。 相手の 特防を さげることが ある。" + }, + "hypnosis": { + "name": "さいみんじゅつ", + "effect": "眠気を 誘う 暗示を かけて 相手を 眠り状態に する。" + }, + "meditate": { + "name": "ヨガのポーズ", + "effect": "眠っている 力を 体の 奥から ひきだして 自分の 攻撃を あげる。" + }, + "agility": { + "name": "こうそくいどう", + "effect": "力を ぬいて 体を 軽くして 高速で 動く。 自分の 素早さを ぐーんと あげる。" + }, + "quickAttack": { + "name": "でんこうせっか", + "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。" + }, + "rage": { + "name": "いかり", + "effect": "技を だしたときに 攻撃を 受けると 怒りの 力で 攻撃が あがる。" + }, + "teleport": { + "name": "テレポート", + "effect": "ひかえの ポケモンが いるときに 使うと 入れ替わる。 野生の ポケモンは 逃げてしまう。" + }, + "nightShade": { + "name": "ナイトヘッド", + "effect": "恐ろしい 幻を みせて 自分の レベルと 同じだけの ダメージを 相手に 与える。" + }, + "mimic": { + "name": "ものまね", + "effect": "相手が 最後に 使った 技を 戦闘の あいだ 自分の 技に することが できる。" + }, + "screech": { + "name": "いやなおと", + "effect": "おもわず 耳を ふさぎたくなる いやなおとを だして 相手の 防御を がくっと さげる。" + }, + "doubleTeam": { + "name": "かげぶんしん", + "effect": "素早い 動きで 分身を つくり 相手を まどわせて 回避率を あげる。" + }, + "recover": { + "name": "じこさいせい", + "effect": "細胞を 再生させて 自分の 最大HPの 半分の HPを 回復する。" + }, + "harden": { + "name": "かたくなる", + "effect": "全身に 力を こめて 体を 硬くして 自分の 防御を あげる。" + }, + "minimize": { + "name": "ちいさくなる", + "effect": "体を ちぢめて 小さく みせて 自分の 回避率を ぐーんと あげる。" + }, + "smokescreen": { + "name": "えんまく", + "effect": "煙や 墨などを 吹きかけて 相手の 命中率を さげる。" + }, + "confuseRay": { + "name": "あやしいひかり", + "effect": "怪しい 光を 相手に みせて まどわせる。 相手を 混乱させる。" + }, + "withdraw": { + "name": "からにこもる", + "effect": "殻に 潜りこんで 身を守り 自分の 防御を あげる。" + }, + "defenseCurl": { + "name": "まるくなる", + "effect": "体を まるめて ちぢこまり 自分の 防御を あげる。" + }, + "barrier": { + "name": "バリアー", + "effect": "頑丈な 壁を つくって 自分の 防御を ぐーんと あげる。" + }, + "lightScreen": { + "name": "ひかりのかべ", + "effect": "5ターンの 間 不思議な かべで 相手から 受ける 特殊攻撃の ダメージを 弱める。" + }, + "haze": { + "name": "くろいきり", + "effect": "黒い霧を だして 戦闘に でている ポケモン 全員の 能力変化を もとに もどす。" + }, + "reflect": { + "name": "リフレクター", + "effect": "5ターンの 間 不思議な かべで 相手から 受ける 物理攻撃の ダメージを 弱める。" + }, + "focusEnergy": { + "name": "きあいだめ", + "effect": "深く 息を 吸い 気合を こめる。 自分の 攻撃が 急所に 当たりやすくなる。" + }, + "bide": { + "name": "がまん", + "effect": "2ターンの 間 攻撃に たえて 受けた ダメージを 2倍にして 相手に 返す。" + }, + "metronome": { + "name": "ゆびをふる", + "effect": "指をふり 自分の 脳を 刺激して すべての 技の なかから どれか 1つを くりだす。" + }, + "mirrorMove": { + "name": "オウムがえし", + "effect": "相手の 使った 技を まねして 自分も 同じ技を 使う。" + }, + "selfDestruct": { + "name": "じばく", + "effect": "爆発を おこして 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。" + }, + "eggBomb": { + "name": "タマゴばくだん", + "effect": "大きな タマゴを 力いっぱい 相手に 投げつけて 攻撃する。" + }, + "lick": { + "name": "したでなめる", + "effect": "長い 舌で 相手を なめまわして 攻撃する。 まひ状態に することが ある。" + }, + "smog": { + "name": "スモッグ", + "effect": "汚れた ガスを 相手に 吹きつけて 攻撃する。 毒状態に することが ある。" + }, + "sludge": { + "name": "ヘドロこうげき", + "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。" + }, + "boneClub": { + "name": "ホネこんぼう", + "effect": "手に 持った ホネで 相手を なぐりつけて 攻撃する。 相手を ひるませることが ある。" + }, + "fireBlast": { + "name": "だいもんじ", + "effect": "大の字の 炎で 相手を 焼きつくす。 やけど状態に することが ある。" + }, + "waterfall": { + "name": "たきのぼり", + "effect": "すごい 勢いで 相手に つっこむ。 相手を ひるませることが ある。" + }, + "clamp": { + "name": "からではさむ", + "effect": "とても 頑丈な ぶあつい 殻に 4ー5ターンの 間 相手を はさんで 攻撃する。" + }, + "swift": { + "name": "スピードスター", + "effect": "星型の 光を 発射して 相手を 攻撃する。 攻撃は 必ず 命中する。" + }, + "skullBash": { + "name": "ロケットずつき", + "effect": "1ターン目に 頭を ひっこめて 防御を あげる。 2ターン目に 相手を 攻撃する。" + }, + "spikeCannon": { + "name": "とげキャノン", + "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + }, + "constrict": { + "name": "からみつく", + "effect": "触手や ツタなどを からみつけて 攻撃する。相手の 素早さを さげることが ある。" + }, + "amnesia": { + "name": "ドわすれ", + "effect": "頭を からにして 一瞬 なにかを 忘れることで 自分の 特防を ぐーんと あげる。" + }, + "kinesis": { + "name": "スプーンまげ", + "effect": "スプーンを まげて 注意を ひき 相手の 命中率を さげる。" + }, + "softBoiled": { + "name": "タマゴうみ", + "effect": "最大HPの 半分 自分の HPを 回復する。" + }, + "highJumpKick": { + "name": "とびひざげり", + "effect": "ジャンプからの ひざげりで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。" + }, + "glare": { + "name": "へびにらみ", + "effect": "おなかの 模様で おびえさせて 相手を まひの 状態に する。" + }, + "dreamEater": { + "name": "ゆめくい", + "effect": "寝ている 相手の 夢を 食べて 攻撃する。 ダメージの 半分の HPを 回復する。" + }, + "poisonGas": { + "name": "どくガス", + "effect": "毒ガスを 相手の 顔に 吹きかけて 毒の 状態に する。" + }, + "barrage": { + "name": "たまなげ", + "effect": "まるい ものを 相手に 投げつけて 攻撃する。 2ー5回の 間 連続で だす。" + }, + "leechLife": { + "name": "きゅうけつ", + "effect": "血を 吸い取って 相手を 攻撃する。 与えた ダメージの 半分の HPを 回復できる。" + }, + "lovelyKiss": { + "name": "あくまのキッス", + "effect": "恐ろしい 顔で キスを せまる。 相手を 眠り状態に する。" + }, + "skyAttack": { + "name": "ゴッドバード", + "effect": "2ターン目に 相手を 攻撃する。 たまに ひるませる。 急所にも 当たりやすい。" + }, + "transform": { + "name": "へんしん", + "effect": "相手の ポケモンに 変身することで 相手と まったく 同じ 技が 使える。" + }, + "bubble": { + "name": "あわ", + "effect": "無数の 泡を 相手に 吹きかけて 攻撃する。 相手の 素早さを さげることが ある。" + }, + "dizzyPunch": { + "name": "ピヨピヨパンチ", + "effect": "リズミカルに パンチを くりだして 相手を 攻撃する。 混乱させることが ある。" + }, + "spore": { + "name": "キノコのほうし", + "effect": "催眠効果の ある 胞子を パラパラと ふりまき 相手を 眠り状態に する。" + }, + "flash": { + "name": "フラッシュ", + "effect": "まぶしい 光で 相手の 命中率を さげる。" + }, + "psywave": { + "name": "サイコウェーブ", + "effect": "不思議な 念波を 相手に 発射して 攻撃する。 使うたびに ダメージが 変わる。" + }, + "splash": { + "name": "はねる", + "effect": "攻撃もせずに ピョン ピョンと 跳ねるだけで なにも おこらない……。" + }, + "acidArmor": { + "name": "とける", + "effect": "細胞の 変化で 液状に なり 自分の 防御を ぐーんと あげる。" + }, + "crabhammer": { + "name": "クラブハンマー", + "effect": "大きな ハサミを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。" + }, + "explosion": { + "name": "だいばくはつ", + "effect": "大きな 爆発で 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。" + }, + "furySwipes": { + "name": "みだれひっかき", + "effect": "ツメや カマなどで 相手を ひっかいて 攻撃する。 2ー5回の 間 連続で だす。" + }, + "bonemerang": { + "name": "ホネブーメラン", + "effect": "手に 持った ホネを 相手に 投げつけ 行きと 帰りの 2回連続で ダメージを 与える。" + }, + "rest": { + "name": "ねむる", + "effect": "2ターンの 間 眠り続ける。 自分の HPと 状態異常を すべて 回復する。" + }, + "rockSlide": { + "name": "いわなだれ", + "effect": "大きな 岩を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。" + }, + "hyperFang": { + "name": "ひっさつまえば", + "effect": "鋭い 前歯で 強く かみついて 攻撃する。 相手を ひるませることが ある。" + }, + "sharpen": { + "name": "かくばる", + "effect": "体の かどを 増やして カクカクに なることで 自分の 攻撃を あげる。" + }, + "conversion": { + "name": "テクスチャー", + "effect": "自分の タイプを おぼえている 技で 一番 上の 技と 同じ タイプに する。" + }, + "triAttack": { + "name": "トライアタック", + "effect": "3つの 光線で 攻撃する。 まひか やけどか こおり状態の どれかに することが ある。" + }, + "superFang": { + "name": "いかりのまえば", + "effect": "鋭い 前歯で 激しく かみついて 攻撃する。 相手の HPは 半分に なる。" + }, + "slash": { + "name": "きりさく", + "effect": "ツメや カマなどで 相手を 切り裂いて 攻撃する。 急所に 当たりやすい。" + }, + "substitute": { + "name": "みがわり", + "effect": "自分の HPを 少し 削って 分身を だす。 分身は 自分の 身代わりに なる。" + }, + "struggle": { + "name": "わるあがき", + "effect": "自分の PPが なくなると あがいて 相手を 攻撃する。 自分も 少し ダメージを 受ける。" + }, + "sketch": { + "name": "スケッチ", + "effect": "相手が 使った 技を 自分の ものに する。 1回 使うと スケッチは 消える。" + }, + "tripleKick": { + "name": "トリプルキック", + "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。" + }, + "thief": { + "name": "どろぼう", + "effect": "攻撃と 同時に 道具を 盗もうとする。 盗む 可能性は 30%。" + }, + "spiderWeb": { + "name": "クモのす", + "effect": "ネバネバした 細い 糸を グルグルと からませて 相手を 戦闘から 逃げられなくする。" + }, + "mindReader": { + "name": "こころのめ", + "effect": "相手の 動きを 心で 感じて 次の 攻撃が 必ず 相手に 当たるように する。" + }, + "nightmare": { + "name": "あくむ", + "effect": "眠り状態の 相手に 悪夢を みせて 毎ターン 少しずつ HPを 減らしていく。" + }, + "flameWheel": { + "name": "かえんぐるま", + "effect": "炎を まとい 相手に 突進して 攻撃する。 やけど状態に することが ある。" + }, + "snore": { + "name": "いびき", + "effect": "自分が 寝ているときに 雑音を だして 攻撃する。 相手を ひるませることが ある。" + }, + "curse": { + "name": "のろい", + "effect": "使う ポケモンが ゴーストタイプと それ以外 とでは 効果が 変わる。" + }, + "flail": { + "name": "じたばた", + "effect": "じたばた 暴れて 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。" + }, + "conversion2": { + "name": "テクスチャー2", + "effect": "相手が 最後に 使った技に 抵抗できる ように 自分の タイプを 変化させる。" + }, + "aeroblast": { + "name": "エアロブラスト", + "effect": "空気の 渦を 発射して 攻撃する。 急所に 当たりやすい。" + }, + "cottonSpore": { + "name": "わたほうし", + "effect": "綿のような フワフワの 胞子を まとわり つかせて 相手の 素早さを がくっと さげる。" + }, + "reversal": { + "name": "きしかいせい", + "effect": "力を ふりしぼり 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。" + }, + "spite": { + "name": "うらみ", + "effect": "相手が 最後に 使った技に 恨みを 抱いて その技の PPを 4だけ 減らす。" + }, + "powderSnow": { + "name": "こなゆき", + "effect": "冷たい 粉雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。" + }, + "protect": { + "name": "まもる", + "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" + }, + "machPunch": { + "name": "マッハパンチ", + "effect": "目にも 留まらぬ ものすごい 速さで パンチを くりだす。 必ず 先制攻撃 できる。" + }, + "scaryFace": { + "name": "こわいかお", + "effect": "恐ろしい 顔で にらみ おびえさせて 相手の 素早さを がくっと さげる。" + }, + "feintAttack": { + "name": "だましうち", + "effect": "さりげなく 相手に ちかづき 油断した すきを みて なぐりつける。 攻撃は 必ず 命中する。" + }, + "sweetKiss": { + "name": "てんしのキッス", + "effect": "天使のように かわいく キスして 相手を 混乱させる。" + }, + "bellyDrum": { + "name": "はらだいこ", + "effect": "自分の HPを 最大HPの 半分 減らして 自分の 攻撃を 最大に あげる。" + }, + "sludgeBomb": { + "name": "ヘドロばくだん", + "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。" + }, + "mudSlap": { + "name": "どろかけ", + "effect": "相手の 顔などに 泥を 投げつけて 攻撃する。 命中率を さげる。" + }, + "octazooka": { + "name": "オクタンほう", + "effect": "相手の 顔などに 墨を 吹きかけて 攻撃する。 命中率を さげることが ある。" + }, + "spikes": { + "name": "まきびし", + "effect": "相手の 足下に まきびしを しかける。交代で でてきた 相手の ポケモンに ダメージを 与える。" + }, + "zapCannon": { + "name": "でんじほう", + "effect": "大砲の ような 電気を 発射して 攻撃する。 相手を まひの 状態に する。" + }, + "foresight": { + "name": "みやぶる", + "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" + }, + "destinyBond": { + "name": "みちづれ", + "effect": "技のあと 相手の 攻撃で ひんしに なると 攻撃 相手も ひんしにする。 連続して 出すと 失敗する。" + }, + "perishSong": { + "name": "ほろびのうた", + "effect": "歌を 聴いた ポケモンは 3ターン たつと ひんしに なる。 交代すると 効果は なくなる。" + }, + "icyWind": { + "name": "こごえるかぜ", + "effect": "凍てつく 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。" + }, + "detect": { + "name": "みきり", + "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" + }, + "boneRush": { + "name": "ボーンラッシュ", + "effect": "硬い ホネで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。" + }, + "lockOn": { + "name": "ロックオン", + "effect": "照準を しっかり あわせて 次の 攻撃が 必ず 相手に 当たるように する。" + }, + "outrage": { + "name": "げきりん", + "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。" + }, + "sandstorm": { + "name": "すなあらし", + "effect": "5ターンの 間 砂あらしで いわ じめん はがねタイプ 以外に ダメージ。 いわタイプの 特防が あがる。" + }, + "gigaDrain": { + "name": "ギガドレイン", + "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" + }, + "endure": { + "name": "こらえる", + "effect": "攻撃を 受けても HPを 必ず 1だけ 残せる。 連続で だすと 失敗しやすい。" + }, + "charm": { + "name": "あまえる", + "effect": "かわいく みつめて 油断を 誘い 相手の 攻撃を がくっと さげる。" + }, + "rollout": { + "name": "ころがる", + "effect": "5ターンの 間 転がり続けて 攻撃する。 技が 当たるたびに 威力が あがる。" + }, + "falseSwipe": { + "name": "みねうち", + "effect": "相手の HPが 必ず 1だけ 残るように 手加減して 攻撃する。" + }, + "swagger": { + "name": "いばる", + "effect": "相手を 怒らせて 混乱させる。 怒りで 相手の 攻撃は ぐーんと あがってしまう。" + }, + "milkDrink": { + "name": "ミルクのみ", + "effect": "最大HPの 半分 自分の HPを 回復する。" + }, + "spark": { + "name": "スパーク", + "effect": "電気を まとい 相手に 突進して 攻撃する。 まひ状態に することが ある。" + }, + "furyCutter": { + "name": "れんぞくぎり", + "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。 連続で 当てると 威力が あがる。" + }, + "steelWing": { + "name": "はがねのつばさ", + "effect": "硬い 翼を 相手に たたきつけて 攻撃する。 自分の 防御が あがることが ある。" + }, + "meanLook": { + "name": "くろいまなざし", + "effect": "吸いこまれるような 黒い まなざしで じっと みつめて 相手を 戦闘から 逃げられなくする。" + }, + "attract": { + "name": "メロメロ", + "effect": "♂なら♀を ♀なら♂を 誘惑して メロメロに する。 相手は 技が だしにくくなる。" + }, + "sleepTalk": { + "name": "ねごと", + "effect": "自分が おぼえている 技の うち どれか 1つを くりだす。 自分が 寝ているときだけ 使える。" + }, + "healBell": { + "name": "いやしのすず", + "effect": "心地好い 鈴の 音色を 聞かせて 味方 全員の 状態異常を 回復 する。" + }, + "return": { + "name": "おんがえし", + "effect": "トレーナーの ために 全力で 相手を 攻撃する。 なついているほど 威力は あがる。" + }, + "present": { + "name": "プレゼント", + "effect": "わなを しかけた 箱を 相手に わたして 攻撃する。HPが 回復して しまうことも ある。" + }, + "frustration": { + "name": "やつあたり", + "effect": "不満を はらすため 全力で 相手を 攻撃する。 なついていないほど 威力は あがる。" + }, + "safeguard": { + "name": "しんぴのまもり", + "effect": "5ターンの 間 不思議な 力に 守られて 状態異常に ならなくなる。" + }, + "painSplit": { + "name": "いたみわけ", + "effect": "自分の HPと 相手の HPを あわせて それを 自分と 相手で なかよく わける。" + }, + "sacredFire": { + "name": "せいなるほのお", + "effect": "神秘の 炎で 相手を 焼きつくして 攻撃する。 やけど状態に することが ある。" + }, + "magnitude": { + "name": "マグニチュード", + "effect": "地面を 揺らして 自分の 周りに いるものを 攻撃する。 技の 威力は いろいろ 変わる。" + }, + "dynamicPunch": { + "name": "ばくれつパンチ", + "effect": "こん身の 力で パンチを くりだして 攻撃する。 相手を 必ず 混乱させる。" + }, + "megahorn": { + "name": "メガホーン", + "effect": "硬くて りっぱな つので おもいっきり 相手を 突き刺して 攻撃する。" + }, + "dragonBreath": { + "name": "りゅうのいぶき", + "effect": "ものすごい 息を 相手に 吹きつけて 攻撃する。 まひ状態に することが ある。" + }, + "batonPass": { + "name": "バトンタッチ", + "effect": "控えの ポケモンと 入れ替わる。 能力変化は 替わった ポケモンが そのまま 受けつぐ。" + }, + "encore": { + "name": "アンコール", + "effect": "相手に アンコールした 技を 3回 続けて 出させる。" + }, + "pursuit": { + "name": "おいうち", + "effect": "相手 ポケモンが 入れ替わるときに 技を だしていると 倍の 威力で 攻撃できる。" + }, + "rapidSpin": { + "name": "こうそくスピン", + "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。自分の 素早さも あがる。" + }, + "sweetScent": { + "name": "あまいかおり", + "effect": "香りで 相手の 回避率を がくっと さげる。" + }, + "ironTail": { + "name": "アイアンテール", + "effect": "硬い しっぽで 相手を たたきつけて 攻撃する。 相手の 防御を さげることが ある。" + }, + "metalClaw": { + "name": "メタルクロー", + "effect": "鋼鉄の ツメで 相手を 切り裂いて 攻撃する。 自分の 攻撃が あがることが ある。" + }, + "vitalThrow": { + "name": "あてみなげ", + "effect": "相手より あとに 攻撃する。 そのかわり 自分の 攻撃は 必ず 命中する。" + }, + "morningSun": { + "name": "あさのひざし", + "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" + }, + "synthesis": { + "name": "こうごうせい", + "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" + }, + "moonlight": { + "name": "つきのひかり", + "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" + }, + "hiddenPower": { + "name": "めざめるパワー", + "effect": "技を 使った ポケモンに よって 技の タイプが 変わる。" + }, + "crossChop": { + "name": "クロスチョップ", + "effect": "両手チョップを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。" + }, + "twister": { + "name": "たつまき", + "effect": "竜巻を おこして 相手を まきこみ 攻撃する。 相手を ひるませることが ある。" + }, + "rainDance": { + "name": "あまごい", + "effect": "5ターンの 間 雨を 降らせて みずタイプの 威力を あげる。 ほのおタイプの 威力は さがる。" + }, + "sunnyDay": { + "name": "にほんばれ", + "effect": "5ターンの 間 日差しを 強くして ほのおタイプの 威力を あげる。 みずタイプの 威力は さがる。" + }, + "crunch": { + "name": "かみくだく", + "effect": "鋭い 歯で 相手を かみくだいて 攻撃する。 相手の 防御を さげることが ある。" + }, + "mirrorCoat": { + "name": "ミラーコート", + "effect": "相手から 受けた 特殊攻撃の ダメージを 2倍に して その相手に 返す。" + }, + "psychUp": { + "name": "じこあんじ", + "effect": "自分に 暗示を かけることで 能力変化の 状態を 相手と 同じにする。" + }, + "extremeSpeed": { + "name": "しんそく", + "effect": "目にも 留まらぬ ものすごい 速さで 相手に 突進して 攻撃する。 必ず 先制攻撃 できる。" + }, + "ancientPower": { + "name": "げんしのちから", + "effect": "原始の 力で 攻撃する。 自分の すべての 能力が あがることが ある。" + }, + "shadowBall": { + "name": "シャドーボール", + "effect": "黒い影の 塊を 投げつけて 攻撃する。 相手の 特防を さげることが ある。" + }, + "futureSight": { + "name": "みらいよち", + "effect": "技を 使った 2ターン後に 相手に 念力の 塊を 送って 攻撃する。" + }, + "rockSmash": { + "name": "いわくだき", + "effect": "パンチで 攻撃する。相手の 防御を さげる ことが ある。" + }, + "whirlpool": { + "name": "うずしお", + "effect": "激しく 渦をまく 水の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + }, + "beatUp": { + "name": "ふくろだたき", + "effect": "味方 全員で 攻撃する。 仲間の ポケモンが 多いほど 技の 攻撃回数が 増える。" + }, + "fakeOut": { + "name": "ねこだまし", + "effect": "先制攻撃で 相手を ひるませる。 戦闘に でたら すぐに ださないと 成功しない。" + }, + "uproar": { + "name": "さわぐ", + "effect": "3ターンの 間 騒いで 相手を 攻撃する。 そのあいだは だれも 眠れなくなる。" + }, + "stockpile": { + "name": "たくわえる", + "effect": "力を 蓄えて 自分の 防御と 特防を あげる。 最大 3回まで 蓄えられる。" + }, + "spitUp": { + "name": "はきだす", + "effect": "蓄えた 力を 相手に ぶつけて 攻撃する。 蓄えているほど 威力が あがる。" + }, + "swallow": { + "name": "のみこむ", + "effect": "蓄えた 力を のみこんで 自分の HPを 回復する。 蓄えているほど 回復する。" + }, + "heatWave": { + "name": "ねっぷう", + "effect": "熱い 息を 相手に 吹きつけて 攻撃する。 やけど状態に することが ある。" + }, + "hail": { + "name": "あられ", + "effect": "5ターンの 間 あられを 降らして こおりタイプで ない ポケモン 全員に ダメージを 与える。" + }, + "torment": { + "name": "いちゃもん", + "effect": "相手に いちゃもんを つけて 同じ 技を 2回連続で だせなくする。" + }, + "flatter": { + "name": "おだてる", + "effect": "相手を おだてて 混乱させる。 同時に 相手の 特攻も あげてしまう。" + }, + "willOWisp": { + "name": "おにび", + "effect": "不気味で 怪しい 炎を 放って 相手を やけどの 状態に する。" + }, + "memento": { + "name": "おきみやげ", + "effect": "自分は ひんしに なるが そのかわりに 相手の 攻撃と 特攻を がくっと さげる。" + }, + "facade": { + "name": "からげんき", + "effect": "自分が 毒 まひ やけど 状態のとき 相手に くりだすと 技の 威力が 2倍に なる。" + }, + "focusPunch": { + "name": "きあいパンチ", + "effect": "精神を 高めて パンチを くりだす。 技を だすまでに 攻撃を 受けると 失敗する。" + }, + "smellingSalts": { + "name": "きつけ", + "effect": "まひ状態の 相手には 威力が 2倍に なるが かわりに 相手の まひが 治る。" + }, + "followMe": { + "name": "このゆびとまれ", + "effect": "自分に 注目させて 相手からの 攻撃を すべて 自分に むけさせる。" + }, + "naturePower": { + "name": "しぜんのちから", + "effect": "自然の 力で 攻撃する。 使う 場所で でてくる 技が 変化する。" + }, + "charge": { + "name": "じゅうでん", + "effect": "次の ターンに だす でんきタイプの 技の 威力を あげる。 自分の 特防も あがる。" + }, + "taunt": { + "name": "ちょうはつ", + "effect": "相手を 怒らせる。 3ターンの 間 相手は ダメージを 与える 技しか だせなくなる。" + }, + "helpingHand": { + "name": "てだすけ", + "effect": "仲間を 助ける。 てだすけ された ポケモンの 技の 威力は いつもより 大きくなる。" + }, + "trick": { + "name": "トリック", + "effect": "相手の すきを ついて 自分と 相手の 持ち物を 交換する。" + }, + "rolePlay": { + "name": "なりきり", + "effect": "相手に なりきって 自分も 相手と 同じ 特性に 変化する。" + }, + "wish": { + "name": "ねがいごと", + "effect": "次の ターンに 自分 もしくは 入れ替わった ポケモンの HPを 最大HPの 半分 回復する。" + }, + "assist": { + "name": "ねこのて", + "effect": "大急ぎで 味方の 助けを かりて 味方の ポケモンが おぼえている 技を どれか 1つ 使う。" + }, + "ingrain": { + "name": "ねをはる", + "effect": "大地に 根を 張り 毎ターン 自分の HPを 回復する。 根を 張っているので 入れ替えられない。" + }, + "superpower": { + "name": "ばかぢから", + "effect": "すごい 力を 発揮して 相手を 攻撃する。自分の 攻撃と 防御が さがる。" + }, + "magicCoat": { + "name": "マジックコート", + "effect": "状態異常に なる 技や やどりぎのタネ などを だされたとき 相手に 跳ね返す。" + }, + "recycle": { + "name": "リサイクル", + "effect": "戦闘中に 使って なくなった 自分の 持ち物を 再生させて 使えるように する。" + }, + "revenge": { + "name": "リベンジ", + "effect": "相手から 技を 受けていると その相手に 対して 与える ダメージが 2倍に なる。" + }, + "brickBreak": { + "name": "かわらわり", + "effect": "手刀を 勢いよく 振りおろして 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。" + }, + "yawn": { + "name": "あくび", + "effect": "大きな あくびで 眠気を 誘う。 次の ターンに 相手を 眠り状態に する。" + }, + "knockOff": { + "name": "はたきおとす", + "effect": "相手の 持ち物を はたき 落として 戦闘が 終わるまで 使えなくする。 物を持つ 相手には ダメージが増す。" + }, + "endeavor": { + "name": "がむしゃら", + "effect": "相手の HPが 自分の HPと 同じくらいに なるように ダメージを 与える。" + }, + "eruption": { + "name": "ふんか", + "effect": "怒りを 爆発させて 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" + }, + "skillSwap": { + "name": "スキルスワップ", + "effect": "超能力で 自分の 特性と 相手の 特性を 入れ替える。" + }, + "imprison": { + "name": "ふういん", + "effect": "相手が 自分と 同じ 技を おぼえていたら 相手だけ その技を 使えなくする。" + }, + "refresh": { + "name": "リフレッシュ", + "effect": "体を やすめて 自分が おっている 毒 まひ やけどの 状態異常を 治す。" + }, + "grudge": { + "name": "おんねん", + "effect": "相手の 技で ひんしに されたとき おんねんを かけて その技の PPを 0に する。" + }, + "snatch": { + "name": "よこどり", + "effect": "相手が 使おうと した 回復技や 能力変化の 技を うばって 自分に 使う。" + }, + "secretPower": { + "name": "ひみつのちから", + "effect": "使う場所で 追加効果が 変化する 攻撃。" + }, + "dive": { + "name": "ダイビング", + "effect": "1ターン目で 潜り 2ターン目に 浮きあがって 攻撃する。" + }, + "armThrust": { + "name": "つっぱり", + "effect": "ひらいた 両手で 相手を つっぱって 攻撃する。 2ー5回の 間 連続で だす。" + }, + "camouflage": { + "name": "ほごしょく", + "effect": "水辺や 草むら どうくつなど いる 場所に あわせて 自分の タイプを 変える。" + }, + "tailGlow": { + "name": "ほたるび", + "effect": "点滅する 光を 眺めて 自分の 精神を 統一し 特攻を ぐぐーんと あげる。" + }, + "lusterPurge": { + "name": "ラスターパージ", + "effect": "まばゆい 光を 解放して 攻撃する。 相手の 特防を さげることが ある。" + }, + "mistBall": { + "name": "ミストボール", + "effect": "霧状の 羽毛で 包みこみ 攻撃する。 相手の 特攻を さげることが ある。" + }, + "featherDance": { + "name": "フェザーダンス", + "effect": "羽毛を ふりまいて 相手の 体に からませる。 相手の 攻撃を がくっと さげる。" + }, + "teeterDance": { + "name": "フラフラダンス", + "effect": "フラフラと ダンスを おどって 自分の 周りに いるものを 混乱状態に させる。" + }, + "blazeKick": { + "name": "ブレイズキック", + "effect": "攻撃した 相手を やけど状態に することが ある。 急所にも 当たりやすい。" + }, + "mudSport": { + "name": "どろあそび", + "effect": "あたりを 泥まみれにする。 5ターンの 間 でんきタイプの 技を 弱める。" + }, + "iceBall": { + "name": "アイスボール", + "effect": "5ターンの 間 相手を 攻撃する。 技が 当たるたび 威力が あがる。" + }, + "needleArm": { + "name": "ニードルアーム", + "effect": "トゲの 腕を 激しく ふるって 攻撃する。 相手を ひるませることが ある。" + }, + "slackOff": { + "name": "なまける", + "effect": "怠けて やすむ。 自分の HPを 最大HPの 半分 回復する。" + }, + "hyperVoice": { + "name": "ハイパーボイス", + "effect": "うるさく 響く 大きな 振動を 相手に 与えて 攻撃する。" + }, + "poisonFang": { + "name": "どくどくのキバ", + "effect": "毒の ある キバで 相手に かみついて 攻撃する。 猛毒を おわせる ことが ある。" + }, + "crushClaw": { + "name": "ブレイククロー", + "effect": "硬く 鋭い ツメで 切り裂いて 攻撃する。 相手の 防御を さげることが ある。" + }, + "blastBurn": { + "name": "ブラストバーン", + "effect": "爆発の 炎で 相手を 焼きつくして 攻撃する。 次の ターンは 動けなくなる。" + }, + "hydroCannon": { + "name": "ハイドロカノン", + "effect": "水の 大砲を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" + }, + "meteorMash": { + "name": "コメットパンチ", + "effect": "すい星の ごとく パンチを くりだして 相手を 攻撃する。 自分の 攻撃が あがることが ある。" + }, + "astonish": { + "name": "おどろかす", + "effect": "大きな 声などで 不意に 驚かして 攻撃する。 相手を ひるませることが ある。" + }, + "weatherBall": { + "name": "ウェザーボール", + "effect": "使ったときの 天気に よって 技の タイプと 威力が 変わる。" + }, + "aromatherapy": { + "name": "アロマセラピー", + "effect": "心地好い やすらぐ 香りを かがせて 味方全員の 状態異常を 回復する。" + }, + "fakeTears": { + "name": "うそなき", + "effect": "ないた ふりをして 涙を 流す。 こまらせる ことで 相手の 特防を がくっと さげる。" + }, + "airCutter": { + "name": "エアカッター", + "effect": "鋭い 風で 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" + }, + "overheat": { + "name": "オーバーヒート", + "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。" + }, + "odorSleuth": { + "name": "かぎわける", + "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" + }, + "rockTomb": { + "name": "がんせきふうじ", + "effect": "岩石を 投げつけて 攻撃する。 相手の 動きを 封じることで 素早さを さげる。" + }, + "silverWind": { + "name": "ぎんいろのかぜ", + "effect": "風に りんぷんを のせて 相手を 攻撃する。自分の すべての 能力が あがることが ある。" + }, + "metalSound": { + "name": "きんぞくおん", + "effect": "金属を こすって でるような いやな 音を 聞かせる。 相手の 特防を がくっと さげる。" + }, + "grassWhistle": { + "name": "くさぶえ", + "effect": "心地好い 笛の 音色を 聞かせて 相手を 眠りの 状態に する。" + }, + "tickle": { + "name": "くすぐる", + "effect": "体を くすぐり 笑わせる ことで 相手の 攻撃と 防御を さげる。" + }, + "cosmicPower": { + "name": "コスモパワー", + "effect": "宇宙から 神秘の 力を とりこむ ことで 自分の 防御と 特防を あげる。" + }, + "waterSpout": { + "name": "しおふき", + "effect": "潮を 吹きつけて 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" + }, + "signalBeam": { + "name": "シグナルビーム", + "effect": "不思議な 光を 発射して 攻撃する。 相手を 混乱させることが ある。" + }, + "shadowPunch": { + "name": "シャドーパンチ", + "effect": "影に まぎれて パンチを くりだす。 攻撃は 必ず 命中する。" + }, + "extrasensory": { + "name": "じんつうりき", + "effect": "みえない 不思議な 力を 送って 攻撃する。 相手を ひるませることが ある。" + }, + "skyUppercut": { + "name": "スカイアッパー", + "effect": "空に むかうような 高い アッパーで 相手を 突きあげて 攻撃する。" + }, + "sandTomb": { + "name": "すなじごく", + "effect": "激しく 吹きあれる 砂あらしの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + }, + "sheerCold": { + "name": "ぜったいれいど", + "effect": "相手を 一撃で 瀕死に する。 こおりタイプ 以外の ポケモンが 使うと 当たりにくい。" + }, + "muddyWater": { + "name": "だくりゅう", + "effect": "濁った 水を 相手に 発射して 攻撃する。 命中率を さげることが ある。" + }, + "bulletSeed": { + "name": "タネマシンガン", + "effect": "タネを 勢いよく 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + }, + "aerialAce": { + "name": "つばめがえし", + "effect": "素早い 動きで 相手を ほんろうして 切りつける。 攻撃は 必ず 命中する。" + }, + "icicleSpear": { + "name": "つららばり", + "effect": "鋭い 氷柱を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + }, + "ironDefense": { + "name": "てっぺき", + "effect": "皮膚を 鉄のように 硬くする ことで 自分の 防御を ぐーんと あげる。" + }, + "block": { + "name": "とおせんぼう", + "effect": "両手を ひろげて たちはだかり 相手の 逃げ道を ふさいで 逃げられなくする。" + }, + "howl": { + "name": "とおぼえ", + "effect": "大声で ほえて 気合を 高め 自分と 味方の 攻撃を あげる。" + }, + "dragonClaw": { + "name": "ドラゴンクロー", + "effect": "鋭く とがった 巨大な ツメで 相手を 切り裂いて 攻撃する。" + }, + "frenzyPlant": { + "name": "ハードプラント", + "effect": "大きな 樹木で 相手を たたきつけて 攻撃する。 次の ターンは 動けなくなる。" + }, + "bulkUp": { + "name": "ビルドアップ", + "effect": "体に 力を こめて 筋肉を ぶあつく することで 自分の 攻撃と 防御を あげる。" + }, + "bounce": { + "name": "とびはねる", + "effect": "空高く 飛び跳ねて 2ターン目に 相手を 攻撃する。 まひ状態に することが ある。" + }, + "mudShot": { + "name": "マッドショット", + "effect": "泥の 塊を 相手に 投げつけて 攻撃する。 同時に 相手の 素早さを さげる。" + }, + "poisonTail": { + "name": "ポイズンテール", + "effect": "しっぽで たたく。 毒状態に することが あり 急所にも 当たりやすい。" + }, + "covet": { + "name": "ほしがる", + "effect": "かわいく あまえながら 相手に ちかづき 持っている 道具を うばおうとする。 うばう 可能性は 30%。" + }, + "voltTackle": { + "name": "ボルテッカー", + "effect": "電気を まとって 突進する。 自分も かなり ダメージを 受ける。 まひ状態に することが ある。" + }, + "magicalLeaf": { + "name": "マジカルリーフ", + "effect": "相手を 追跡する 不思議な はっぱを まきちらす。 攻撃は 必ず 命中する。" + }, + "waterSport": { + "name": "みずあそび", + "effect": "あたりを 水で びしょびしょにする。 5ターンの 間 ほのおタイプの 技を 弱める。" + }, + "calmMind": { + "name": "めいそう", + "effect": "静かに 精神を 統一し 心を 鎮めることで 自分の 特攻と 特防を あげる。" + }, + "leafBlade": { + "name": "リーフブレード", + "effect": "はっぱを 剣のように あやつり 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" + }, + "dragonDance": { + "name": "りゅうのまい", + "effect": "神秘的で 力強い 舞を 激しく おどる。 自分の 攻撃と 素早さを あげる。" + }, + "rockBlast": { + "name": "ロックブラスト", + "effect": "硬い 岩石を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + }, + "shockWave": { + "name": "でんげきは", + "effect": "電撃を 素早く 相手に 浴びせる。 攻撃は 必ず 命中する。" + }, + "waterPulse": { + "name": "みずのはどう", + "effect": "水の 振動を 相手に 与えて 攻撃する。 相手を 混乱させることが ある。" + }, + "doomDesire": { + "name": "はめつのねがい", + "effect": "技を 使った 2ターン後に 無数の 光の 束で 相手を 攻撃する。" + }, + "psychoBoost": { + "name": "サイコブースト", + "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。" + }, + "roost": { + "name": "はねやすめ", + "effect": "地面に 降りて 体を やすめる。 最大HPの 半分の HPを 回復する。" + }, + "gravity": { + "name": "じゅうりょく", + "effect": "5ターンの間 ふゆうや ひこうタイプに じめんタイプの 技が 当たるようになる。 空中に 飛ぶ 技も 使えない。" + }, + "miracleEye": { + "name": "ミラクルアイ", + "effect": "あくタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" + }, + "wakeUpSlap": { + "name": "めざましビンタ", + "effect": "眠り状態の 相手に 大きな ダメージを 与える。 かわりに 相手は 眠りから さめる。" + }, + "hammerArm": { + "name": "アームハンマー", + "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。" + }, + "gyroBall": { + "name": "ジャイロボール", + "effect": "体を 高速に 回転させて 体当たりする。相手より 素早さが 低いほど 強い。" + }, + "healingWish": { + "name": "いやしのねがい", + "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの 状態異常と HPを 回復する。" + }, + "brine": { + "name": "しおみず", + "effect": "相手が HPの 半分くらい きずを おっていると 技の 威力が 2倍に なる。" + }, + "naturalGift": { + "name": "しぜんのめぐみ", + "effect": "きのみから 力を もらい 攻撃する。持たせた きのみで 技の タイプと 威力が 変わる。" + }, + "feint": { + "name": "フェイント", + "effect": "まもるや みきり などを している 相手に 攻撃が できる。 守りの 効果を 解除させる。" + }, + "pluck": { + "name": "ついばむ", + "effect": "くちばしで 攻撃。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。" + }, + "tailwind": { + "name": "おいかぜ", + "effect": "激しく 吹きあれる 風の渦を つくり 4ターンの 間 味方 全員の 素早さを あげる。" + }, + "acupressure": { + "name": "つぼをつく", + "effect": "つぼおしで 体を 活性化させる。 能力の どれか 1つを ぐーんと あげる。" + }, + "metalBurst": { + "name": "メタルバースト", + "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。" + }, + "uTurn": { + "name": "とんぼがえり", + "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" + }, + "closeCombat": { + "name": "インファイト", + "effect": "守りを 捨てて 相手の ふところに 突撃する。 自分の 防御と 特防が さがる。" + }, + "payback": { + "name": "しっぺがえし", + "effect": "ためこんで 攻撃する。 相手より あとに 攻撃できると 技の 威力は 2倍に なる。" + }, + "assurance": { + "name": "ダメおし", + "effect": "そのターンに 相手が すでに ダメージを 受けていたら 技の 威力は 2倍に なる。" + }, + "embargo": { + "name": "さしおさえ", + "effect": "持たせた 道具を 5ターンの 間 使えなくする。 トレーナーも その ポケモンには 道具を 使えない。" + }, + "fling": { + "name": "なげつける", + "effect": "持たせた 道具を 素早く 投げつけて 攻撃する。 道具で 威力と 効果が 変わる。" + }, + "psychoShift": { + "name": "サイコシフト", + "effect": "超能力で 暗示を かけて 自分の 受けている 状態異常を 相手に うつす。" + }, + "trumpCard": { + "name": "きりふだ", + "effect": "きりふだの 残り PPが 少なければ 少ないほど 技の 威力が あがる。" + }, + "healBlock": { + "name": "かいふくふうじ", + "effect": "5ターンの 間 技や 特性や 持っている 道具によって HPを 回復 できなくする。" + }, + "wringOut": { + "name": "しぼりとる", + "effect": "強く 締めあげて 攻撃を する。 相手の HPが 残っているほど 威力は あがる。" + }, + "powerTrick": { + "name": "パワートリック", + "effect": "超能力で 自分の 攻撃と 防御の 力を 交換する。" + }, + "gastroAcid": { + "name": "いえき", + "effect": "胃液を 相手の 体に 吐きつける。 ついた 胃液は 相手の 特性の 効果を 消す。" + }, + "luckyChant": { + "name": "おまじない", + "effect": "天に むかって おいのりを ささげ 5ターンの 間 相手の 攻撃を 急所に 当たらなくする。" + }, + "meFirst": { + "name": "さきどり", + "effect": "威力を あげて 相手が だそうとする 技を 先にだす。 先に だせないと 失敗する。" + }, + "copycat": { + "name": "まねっこ", + "effect": "直前に でた 技を まねして 同じ 技を だす。 技が でていないと 失敗する。" + }, + "powerSwap": { + "name": "パワースワップ", + "effect": "超能力で 自分と 相手の 攻撃と 特攻の 能力変化を 入れ替える。" + }, + "guardSwap": { + "name": "ガードスワップ", + "effect": "超能力で 自分と 相手の 防御と 特防の 能力変化を 入れ替える。" + }, + "punishment": { + "name": "おしおき", + "effect": "能力変化で 相手が パワーアップ しているほど 技の 威力が あがる。" + }, + "lastResort": { + "name": "とっておき", + "effect": "戦闘中に おぼえている 技を すべて 使うと はじめて だせる とっておきの 技。" + }, + "worrySeed": { + "name": "なやみのタネ", + "effect": "心を なやませる タネを 植えつける。 相手を 眠れなくして 特性を ふみんに する。" + }, + "suckerPunch": { + "name": "ふいうち", + "effect": "相手より 先に 攻撃 できる。 相手が だす技が 攻撃技でないと 失敗する。" + }, + "toxicSpikes": { + "name": "どくびし", + "effect": "相手の 足下に どくびしを しかける。 交代で でてきた 相手の ポケモンに 毒を おわせる。" + }, + "heartSwap": { + "name": "ハートスワップ", + "effect": "超能力で 自分と 相手に かかっている 能力変化を 入れ替える。" + }, + "aquaRing": { + "name": "アクアリング", + "effect": "自分の 体の 周りを 水で つくった ベールで おおう。 毎ターン HPを 回復する。" + }, + "magnetRise": { + "name": "でんじふゆう", + "effect": "電気で つくった 磁力の 力で 宙に 浮かぶ。 5ターンの 間 浮遊できる。" + }, + "flareBlitz": { + "name": "フレアドライブ", + "effect": "炎を まとって 突進する。 自分も かなり ダメージを 受ける。 やけど状態に することが ある。" + }, + "forcePalm": { + "name": "はっけい", + "effect": "相手の 体に 衝撃波を 当てて 攻撃する。 まひ状態に することが ある。" + }, + "auraSphere": { + "name": "はどうだん", + "effect": "体の 奥から 波導の 力を 相手に うち放つ。 攻撃は 必ず 命中する。" + }, + "rockPolish": { + "name": "ロックカット", + "effect": "自分の 体を 磨いて 空気の 抵抗を 少なくする。素早さを ぐーんと あげることが できる。" + }, + "poisonJab": { + "name": "どくづき", + "effect": "毒に そまった 触手や 腕で 相手を 突き刺す。 毒状態に することが ある。" + }, + "darkPulse": { + "name": "あくのはどう", + "effect": "体から 悪意に みちた 恐ろしい オーラを 発する。 相手を ひるませることが ある。" + }, + "nightSlash": { + "name": "つじぎり", + "effect": "一瞬の すきを ついて 相手を 切りはらう。 急所に 当たりやすい。" + }, + "aquaTail": { + "name": "アクアテール", + "effect": "激しく あれくるう 荒波の ように 大きな しっぽを ふって 相手を 攻撃する。" + }, + "seedBomb": { + "name": "タネばくだん", + "effect": "硬い 殻を もつ 大きな タネを 上から たたきつけて 相手を 攻撃する。" + }, + "airSlash": { + "name": "エアスラッシュ", + "effect": "空をも 切り裂く 空気の 刃で 攻撃する。 相手を ひるませることが ある。" + }, + "xScissor": { + "name": "シザークロス", + "effect": "カマや ツメを ハサミのように 交差させながら 相手を 切り裂く。" + }, + "bugBuzz": { + "name": "むしのさざめき", + "effect": "振動で 音波を おこして 攻撃する。相手の 特防を さげることが ある。" + }, + "dragonPulse": { + "name": "りゅうのはどう", + "effect": "大きな 口から 衝撃波を まきおこして 相手を 攻撃する。" + }, + "dragonRush": { + "name": "ドラゴンダイブ", + "effect": "すさまじい 殺気で 威圧しながら 体当たりする。 相手を ひるませることが ある。" + }, + "powerGem": { + "name": "パワージェム", + "effect": "宝石のように きらめく 光を 発射して 相手を 攻撃する。" + }, + "drainPunch": { + "name": "ドレインパンチ", + "effect": "こぶしから 相手の 力を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。" + }, + "vacuumWave": { + "name": "しんくうは", + "effect": "こぶしを ふって 真空の 波を まきおこす。 必ず 先制攻撃できる。" + }, + "focusBlast": { + "name": "きあいだま", + "effect": "気合を 高めて ありったけの 力を 放出する。 相手の 特防を さげることが ある。" + }, + "energyBall": { + "name": "エナジーボール", + "effect": "自然から 集めた 命の力を 発射する。 相手の 特防を さげることがある。" + }, + "braveBird": { + "name": "ブレイブバード", + "effect": "はねを おりたたみ 低空飛行で 突撃する。 自分も かなり ダメージを 受ける。" + }, + "earthPower": { + "name": "だいちのちから", + "effect": "相手の 足下へ 大地の力を 放出する。相手の 特防を さげることが ある。" + }, + "switcheroo": { + "name": "すりかえ", + "effect": "目にも とまらぬ 速さで 自分と 相手の 持ち物を 交換する。" + }, + "gigaImpact": { + "name": "ギガインパクト", + "effect": "持てる 力を すべて 使って 相手に 突撃する。 次の ターンは 動けなくなる。" + }, + "nastyPlot": { + "name": "わるだくみ", + "effect": "悪いことを 考えて 頭を 活性化させる。 自分の 特攻を ぐーんと あげる。" + }, + "bulletPunch": { + "name": "バレットパンチ", + "effect": "弾丸の ような 速くて 硬い パンチを 相手に くりだす。 必ず 先制攻撃 できる。" + }, + "avalanche": { + "name": "ゆきなだれ", + "effect": "相手から 技を 受けていると その 相手に 対して 技の 威力が 2倍に なる。" + }, + "iceShard": { + "name": "こおりのつぶて", + "effect": "氷の塊を 一瞬で つくり 相手に 素早く 放つ。 必ず 先制攻撃 できる。" + }, + "shadowClaw": { + "name": "シャドークロー", + "effect": "影から つくった 鋭い ツメで 相手を 切り裂く。 急所に 当たりやすい。" + }, + "thunderFang": { + "name": "かみなりのキバ", + "effect": "電気を ためた キバで かみつく。 相手を ひるませたり まひ状態に することが ある。" + }, + "iceFang": { + "name": "こおりのキバ", + "effect": "冷気を ひめた キバで かみつく。 相手を ひるませたり こおり状態に することが ある。" + }, + "fireFang": { + "name": "ほのおのキバ", + "effect": "炎を まとった キバで かみつく。 相手を ひるませたり やけど状態に することが ある。" + }, + "shadowSneak": { + "name": "かげうち", + "effect": "影を のばして 相手の 背後から 攻撃する。 必ず 先制攻撃 できる。" + }, + "mudBomb": { + "name": "どろばくだん", + "effect": "硬い 泥の 弾を 相手に 発射して 攻撃する。 命中率を さげることが ある。" + }, + "psychoCut": { + "name": "サイコカッター", + "effect": "実体化させた 心の 刃で 相手を 切り裂く。 急所に 当たりやすい。" + }, + "zenHeadbutt": { + "name": "しねんのずつき", + "effect": "思念の 力を 額に 集めて 攻撃する。 相手を ひるませることが ある。" + }, + "mirrorShot": { + "name": "ミラーショット", + "effect": "磨きあげられた 体から せん光の 力を 相手に 放つ。 命中率を さげることが ある。" + }, + "flashCannon": { + "name": "ラスターカノン", + "effect": "体の 光を 一点に 集めて 力を 放つ。 相手の 特防を さげることが ある。" + }, + "rockClimb": { + "name": "ロッククライム", + "effect": "すごい 勢いで 相手に つっこみ 攻撃する。 相手を 混乱させることが ある。" + }, + "defog": { + "name": "きりばらい", + "effect": "強い風で 相手の リフレクターや ひかりのかべ などを はらいのける。 回避率も さげる。" + }, + "trickRoom": { + "name": "トリックルーム", + "effect": "まか不思議な 空間を つくる。 5ターンの 間 遅い ポケモンから 行動できる。" + }, + "dracoMeteor": { + "name": "りゅうせいぐん", + "effect": "天空から 隕石を 相手に 落とす。使うと 反動で 自分の 特攻が がくっと さがる。" + }, + "discharge": { + "name": "ほうでん", + "effect": "まばゆい 電撃で 自分の 周りに いるものを 攻撃する。 まひ状態に することが ある。" + }, + "lavaPlume": { + "name": "ふんえん", + "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。" + }, + "leafStorm": { + "name": "リーフストーム", + "effect": "とがった はっぱで 相手に あらしを おこす。使うと 反動で 自分の 特攻が がくっと さがる。" + }, + "powerWhip": { + "name": "パワーウィップ", + "effect": "ツタや 触手を 激しく ふるって 相手を たたきつけ 攻撃する。" + }, + "rockWrecker": { + "name": "がんせきほう", + "effect": "巨大な 岩を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" + }, + "crossPoison": { + "name": "クロスポイズン", + "effect": "毒の 刃で 相手を 切り裂く。 毒状態に することが あり 急所にも 当たりやすい。" + }, + "gunkShot": { + "name": "ダストシュート", + "effect": "汚い ゴミを 相手に ぶつけて 攻撃する。 毒状態に することが ある。" + }, + "ironHead": { + "name": "アイアンヘッド", + "effect": "鋼の ような 硬い 頭で 攻撃する。 相手を ひるませることが ある。" + }, + "magnetBomb": { + "name": "マグネットボム", + "effect": "相手に 吸いつく 鋼の 爆弾を 発射する。 攻撃は 必ず 命中 する。" + }, + "stoneEdge": { + "name": "ストーンエッジ", + "effect": "とがった 岩を 相手に 突き刺して 攻撃する。 急所に 当たりやすい。" + }, + "captivate": { + "name": "ゆうわく", + "effect": "♂なら♀を ♀なら♂を 誘惑して 相手の 特攻を がくっと さげる。" + }, + "stealthRock": { + "name": "ステルスロック", + "effect": "相手の 周りに 無数の 岩を 浮かべて 交代で でてきた 相手の ポケモンに ダメージを 与える。" + }, + "grassKnot": { + "name": "くさむすび", + "effect": "草を からませて 相手を 転ばせる。相手が 重いほど 威力が あがる。" + }, + "chatter": { + "name": "おしゃべり", + "effect": "とても うるさい おしゃべりの 音波で 相手を 攻撃する。 相手を 混乱させる。" + }, + "judgment": { + "name": "さばきのつぶて", + "effect": "無数の 光弾を 相手に 放出する。 自分の 持つ プレートに より タイプが 変わる。" + }, + "bugBite": { + "name": "むしくい", + "effect": "かみついて 攻撃する。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。" + }, + "chargeBeam": { + "name": "チャージビーム", + "effect": "電撃の 束を 相手に 発射する。電気を ためて 自分の 特攻を あげることが ある。" + }, + "woodHammer": { + "name": "ウッドハンマー", + "effect": "硬い 胴体を 相手に たたきつけて 攻撃する。 自分も かなり ダメージを 受ける。" + }, + "aquaJet": { + "name": "アクアジェット", + "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。" + }, + "attackOrder": { + "name": "こうげきしれい", + "effect": "しもべを 呼びだして 相手に むかって 攻撃させる。 急所に 当たりやすい。" + }, + "defendOrder": { + "name": "ぼうぎょしれい", + "effect": "しもべを 呼びだして 自分の 体に おおい つかせる。防御と 特防を あげることが できる。" + }, + "healOrder": { + "name": "かいふくしれい", + "effect": "しもべを 呼びだして きずを 治す。 最大HPの 半分 自分の HPを 回復する。" + }, + "headSmash": { + "name": "もろはのずつき", + "effect": "命を 懸けて こん身の 力で 相手に ずつきを する。 自分も ものすごい ダメージを 受ける。" + }, + "doubleHit": { + "name": "ダブルアタック", + "effect": "しっぽなどを 使い 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。" + }, + "roarOfTime": { + "name": "ときのほうこう", + "effect": "時間が ゆがむほどの 力を うちだして 相手を 攻撃する。 次の ターンは 動けなくなる。" + }, + "spacialRend": { + "name": "あくうせつだん", + "effect": "周りの 空間ごと 相手を 引き裂き ダメージを 与える。 急所に 当たりやすい。" + }, + "lunarDance": { + "name": "みかづきのまい", + "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの すべての 状態を 回復する。" + }, + "crushGrip": { + "name": "にぎりつぶす", + "effect": "すさまじい 力で 相手を にぎりつぶす。 相手の HPが 残っているほど 威力が あがる。" + }, + "magmaStorm": { + "name": "マグマストーム", + "effect": "激しく 燃えたぎる 炎の なかに 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + }, + "darkVoid": { + "name": "ダークホール", + "effect": "暗黒の 世界に ひきずり 落として 相手を 眠り状態に する。" + }, + "seedFlare": { + "name": "シードフレア", + "effect": "体の 中から 衝撃波を 発生させる。相手の 特防を がくっと さげることが ある。" + }, + "ominousWind": { + "name": "あやしいかぜ", + "effect": "みのけも よだつ 突風で 相手を 攻撃する。自分の すべての 能力が あがることが ある。" + }, + "shadowForce": { + "name": "シャドーダイブ", + "effect": "1ターン目で 姿を 消して 2ターン目に 相手を 攻撃する。 守っていても 攻撃は 当たる。" + }, + "honeClaws": { + "name": "つめとぎ", + "effect": "ツメを 磨いて 鋭く する。 自分の 攻撃と 命中率を あげる。" + }, + "wideGuard": { + "name": "ワイドガード", + "effect": "味方全員に 当たる 攻撃を 1ターンの 間 防ぐ。" + }, + "guardSplit": { + "name": "ガードシェア", + "effect": "超能力で 自分と 相手の 防御と 特防を たして 半分に わける。" + }, + "powerSplit": { + "name": "パワーシェア", + "effect": "超能力で 自分と 相手の 攻撃と 特攻を たして 半分に わける。" + }, + "wonderRoom": { + "name": "ワンダールーム", + "effect": "まか不思議な 空間を つくる。 5ターンのあいだ すべてのポケモンの 防御と 特防が 入れ替わる。" + }, + "psyshock": { + "name": "サイコショック", + "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。" + }, + "venoshock": { + "name": "ベノムショック", + "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手には 威力が 2倍に なる。" + }, + "autotomize": { + "name": "ボディパージ", + "effect": "体の ムダな 部分を 削る。 自分の 素早さを ぐーんと あげて 体重も 軽くなる。" + }, + "ragePowder": { + "name": "いかりのこな", + "effect": "イライラさせる 粉を 自分に ふりかけて 注意を ひく。 相手の 攻撃を すべて 自分に むける。" + }, + "telekinesis": { + "name": "テレキネシス", + "effect": "超能力で 相手を 浮かせる。 3ターンの 間 攻撃が 相手に 当たりやすく なる。" + }, + "magicRoom": { + "name": "マジックルーム", + "effect": "まか不思議な 空間を つくる。 5ターンの間 すべてのポケモンの 道具の 効果が なくなる。" + }, + "smackDown": { + "name": "うちおとす", + "effect": "石や 弾を 投げて 飛んでいる 相手を 攻撃する。 相手は うち落とされて 地面に 落ちる。" + }, + "stormThrow": { + "name": "やまあらし", + "effect": "強烈な 一撃を 相手に くりだす。攻撃は 必ず 急所に 当たる。" + }, + "flameBurst": { + "name": "はじけるほのお", + "effect": "当たると はじける 炎で 相手を 攻撃する。はじけた 炎は 隣の 相手にも ふりかかる。" + }, + "sludgeWave": { + "name": "ヘドロウェーブ", + "effect": "ヘドロの 波で 自分の 周りに いるものを 攻撃する。 毒状態に することが ある。" + }, + "quiverDance": { + "name": "ちょうのまい", + "effect": "神秘的で 美しい 舞を 軽やかに おどる。 自分の 特攻と 特防と 素早さを あげる。" + }, + "heavySlam": { + "name": "ヘビーボンバー", + "effect": "重たい 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。" + }, + "synchronoise": { + "name": "シンクロノイズ", + "effect": "不思議な 電波で 周りに いる 自分と 同じ タイプの ポケモンに ダメージを 与える。" + }, + "electroBall": { + "name": "エレキボール", + "effect": "電気の 塊を 相手に ぶつける。相手より 素早さが 速いほど 威力が あがる。" + }, + "soak": { + "name": "みずびたし", + "effect": "たくさんの 水を 浴びせかけて 相手を みずタイプに する。" + }, + "flameCharge": { + "name": "ニトロチャージ", + "effect": "炎を まとい 相手を 攻撃する。 力を ためて 自分の 素早さを あげる。" + }, + "coil": { + "name": "とぐろをまく", + "effect": "とぐろを まいて 集中する。 自分の 攻撃と 防御と 命中率を あげる。" + }, + "lowSweep": { + "name": "ローキック", + "effect": "素早い 動きで 相手の 足を ねらって 攻撃する。 相手の 素早さを さげる。" + }, + "acidSpray": { + "name": "アシッドボム", + "effect": "相手を とかす 液体を 吐きだして 攻撃する。 相手の 特防を がくっと さげる。" + }, + "foulPlay": { + "name": "イカサマ", + "effect": "相手の 力を 利用する。 戦っている 相手の 攻撃が 高いほど ダメージが あがる。" + }, + "simpleBeam": { + "name": "シンプルビーム", + "effect": "なぞの 念波を 相手に 送る。 念波を 受けとった 相手は 特性が たんじゅんに なる。" + }, + "entrainment": { + "name": "なかまづくり", + "effect": "不思議な リズムで おどる。 動きを まねさせて 自分と 相手の 特性を 同じに する。" + }, + "afterYou": { + "name": "おさきにどうぞ", + "effect": "相手の 行動を サポートして 自分の 行動の あとに 続けて 動けるように する。" + }, + "round": { + "name": "りんしょう", + "effect": "歌で 相手を 攻撃する。 みんなで 輪唱すると 続けて だすことが でき 威力も あがる。" + }, + "echoedVoice": { + "name": "エコーボイス", + "effect": "響く 声で 相手を 攻撃する。 毎ターン だれかが 技を 使い続けると 威力が あがる。" + }, + "chipAway": { + "name": "なしくずし", + "effect": "すきを みて 堅実に 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。" + }, + "clearSmog": { + "name": "クリアスモッグ", + "effect": "特殊な 泥の 塊を 相手に 投げつけて 攻撃する。 能力変化を もとに もどす。" + }, + "storedPower": { + "name": "アシストパワー", + "effect": "蓄積された パワーで 相手を 攻撃する。自分の 能力が あがっているほど 威力が あがる。" + }, + "quickGuard": { + "name": "ファストガード", + "effect": "自分と 味方を 相手の 先制攻撃から 守る。" + }, + "allySwitch": { + "name": "サイドチェンジ", + "effect": "不思議な 力で テレポートして 自分と 味方の 居場所を 入れ替える。" + }, + "scald": { + "name": "ねっとう", + "effect": "熱く 煮えたぎる 水を 相手に 発射して 攻撃する。 やけど状態に することが ある。" + }, + "shellSmash": { + "name": "からをやぶる", + "effect": "殻を やぶって 自分の 防御 特防を さげるが 攻撃 特攻 素早さを ぐーんと あげる。" + }, + "healPulse": { + "name": "いやしのはどう", + "effect": "いやしのはどうを とばして 最大HPの 半分 相手の HPを 回復する。" + }, + "hex": { + "name": "たたりめ", + "effect": "たたみかける ように 攻撃する。 状態異常の 相手に 大きな ダメージを 与える。" + }, + "skyDrop": { + "name": "フリーフォール", + "effect": "1ターン目で 相手を 空へ 連れさり 2ターン目に 落として 攻撃する。 連れさられた 相手は 動けない。" + }, + "shiftGear": { + "name": "ギアチェンジ", + "effect": "歯車を 回して 自分の 攻撃を あげる だけでなく 素早さも ぐーんと あげる。" + }, + "circleThrow": { + "name": "ともえなげ", + "effect": "相手を 投げとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" + }, + "incinerate": { + "name": "やきつくす", + "effect": "炎で 相手を 攻撃する。 相手が きのみなどを 持っているとき 燃やして 使えなくする。" + }, + "quash": { + "name": "さきおくり", + "effect": "相手を おさえつけて 行動の 順番を 最後に する。" + }, + "acrobatics": { + "name": "アクロバット", + "effect": "軽やかに 相手を 攻撃する。 自分が 道具を 持っていないとき 大きな ダメージを 与える。" + }, + "reflectType": { + "name": "ミラータイプ", + "effect": "相手の タイプを 反射して 自分も 同じ タイプに なる。" + }, + "retaliate": { + "name": "かたきうち", + "effect": "倒れた 味方の かたきを 討つ。 前の ターンに 味方が 倒されていると 威力が あがる。" + }, + "finalGambit": { + "name": "いのちがけ", + "effect": "命懸けで 相手を 攻撃する。 自分は ひんしに なるが 相手に HP分の ダメージを 与える。" + }, + "bestow": { + "name": "ギフトパス", + "effect": "相手が 道具を 持っていないとき 自分が 持っている 道具を 相手に わたす。" + }, + "inferno": { + "name": "れんごく", + "effect": "激しい 炎で 相手を 包みこみ 攻撃する。 やけど状態に する。" + }, + "waterPledge": { + "name": "みずのちかい", + "effect": "水の柱で 攻撃する。 ほのおと 組みあわせると 威力が あがって 空に にじが かかる。" + }, + "firePledge": { + "name": "ほのおのちかい", + "effect": "炎の柱で 攻撃する。 くさと 組みあわせると 威力が あがって 周りが 火の海に なる。" + }, + "grassPledge": { + "name": "くさのちかい", + "effect": "草の柱で 攻撃する。 みずと 組みあわせると 威力が あがって あたりが 湿原に なる。" + }, + "voltSwitch": { + "name": "ボルトチェンジ", + "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" + }, + "struggleBug": { + "name": "むしのていこう", + "effect": "抵抗して 相手を 攻撃する。 相手の 特攻を さげる。" + }, + "bulldoze": { + "name": "じならし", + "effect": "地面を 踏みならして 自分の 周りに いるものを 攻撃する。 相手の 素早さを さげる。" + }, + "frostBreath": { + "name": "こおりのいぶき", + "effect": "冷たい 息を 相手に 吹きつけて 攻撃する。 必ず 急所に 当たる。" + }, + "dragonTail": { + "name": "ドラゴンテール", + "effect": "相手を はじきとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" + }, + "workUp": { + "name": "ふるいたてる", + "effect": "自分を 奮いたてて 攻撃と 特攻を あげる。" + }, + "electroweb": { + "name": "エレキネット", + "effect": "電気の ネットで 相手を 捕まえて 攻撃する。 相手の 素早さを さげる。" + }, + "wildCharge": { + "name": "ワイルドボルト", + "effect": "電気を まとって 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。" + }, + "drillRun": { + "name": "ドリルライナー", + "effect": "ドリルのように 体を 回転しながら 相手に 体当たりする。 急所に 当たりやすい。" + }, + "dualChop": { + "name": "ダブルチョップ", + "effect": "体の 硬い部分で 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。" + }, + "heartStamp": { + "name": "ハートスタンプ", + "effect": "かわいい しぐさで 油断させて 強烈な 一撃を 浴びせる。 相手を ひるませることが ある。" + }, + "hornLeech": { + "name": "ウッドホーン", + "effect": "つのを 突き刺して 相手の 養分を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。" + }, + "sacredSword": { + "name": "せいなるつるぎ", + "effect": "長い つので 切りつけ 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。" + }, + "razorShell": { + "name": "シェルブレード", + "effect": "鋭い 貝殻で 切りつけて 攻撃する。 相手の 防御を さげることが ある。" + }, + "heatCrash": { + "name": "ヒートスタンプ", + "effect": "燃える 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。" + }, + "leafTornado": { + "name": "グラスミキサー", + "effect": "鋭い はっぱで 相手を 包みこんで 攻撃する。 命中率を さげることが ある。" + }, + "steamroller": { + "name": "ハードローラー", + "effect": "まるめた 体で 回転して 相手を おしつぶす。 相手を ひるませることが ある。" + }, + "cottonGuard": { + "name": "コットンガード", + "effect": "フワフワの 綿毛で 自分の 体を 包みこんで 守る。 防御を ぐぐーんと あげる。" + }, + "nightDaze": { + "name": "ナイトバースト", + "effect": "暗黒の 衝撃波を とばして 相手を 攻撃する。 命中率を さげることが ある。" + }, + "psystrike": { + "name": "サイコブレイク", + "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。" + }, + "tailSlap": { + "name": "スイープビンタ", + "effect": "硬い しっぽで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。" + }, + "hurricane": { + "name": "ぼうふう", + "effect": "強烈な 風で 相手を 包みこんで 攻撃する。 相手を 混乱させることが ある。" + }, + "headCharge": { + "name": "アフロブレイク", + "effect": "すごい アフロの 頭で 相手に 突進して 攻撃する。 自分も 少し ダメージを 受ける。" + }, + "gearGrind": { + "name": "ギアソーサー", + "effect": "鋼鉄の ギアを 相手に 投げつけて 攻撃する。 2回連続で ダメージを 与える。" + }, + "searingShot": { + "name": "かえんだん", + "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。" + }, + "technoBlast": { + "name": "テクノバスター", + "effect": "光弾を 相手に 放出する。 自分の 持つ カセットにより タイプが 変わる。" + }, + "relicSong": { + "name": "いにしえのうた", + "effect": "いにしえのうたを 相手に 聞かせて 心に うったえて 攻撃する。 眠り状態に することが ある。" + }, + "secretSword": { + "name": "しんぴのつるぎ", + "effect": "長い つので 切りつけ 攻撃する。 つのが まとった 不思議な 力は 物理的な ダメージを 与える。" + }, + "glaciate": { + "name": "こごえるせかい", + "effect": "凍えるような 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。" + }, + "boltStrike": { + "name": "らいげき", + "effect": "ぼうだいな 電気を 身に まとって 相手に 突進して 攻撃する。 まひ状態に することが ある。" + }, + "blueFlare": { + "name": "あおいほのお", + "effect": "美しくも 激しい 青い炎で 相手を 包みこんで 攻撃する。 やけど状態に することが ある。" + }, + "fieryDance": { + "name": "ほのおのまい", + "effect": "炎を まとい はばたいて 相手を 攻撃する。自分の 特攻が あがることが ある。" + }, + "freezeShock": { + "name": "フリーズボルト", + "effect": "電気を まとった 氷の 塊で 2ターン目に 相手を たたきつける。 まひ状態に することが ある。" + }, + "iceBurn": { + "name": "コールドフレア", + "effect": "すべてを 凍らせる 激しい 冷気で 2ターン目に 相手を 包みこむ。 やけど状態に することが ある。" + }, + "snarl": { + "name": "バークアウト", + "effect": "まくしたてる ように 怒鳴りつけて 相手の 特攻を さげる。" + }, + "icicleCrash": { + "name": "つららおとし", + "effect": "大きな 氷柱を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。" + }, + "vCreate": { + "name": "Vジェネレート", + "effect": "灼熱の 炎を 額から 発生させて 捨て身の 体当たり。 防御 特防 素早さが さがる。" + }, + "fusionFlare": { + "name": "クロスフレイム", + "effect": "巨大な 炎を たたきつける。 巨大な 雷の 影響を受け 技の 威力が あがる。" + }, + "fusionBolt": { + "name": "クロスサンダー", + "effect": "巨大な 雷を たたきつける。 巨大な 炎の 影響を受け 技の 威力が あがる。" + }, + "flyingPress": { + "name": "フライングプレス", + "effect": "空中から 相手に ダイブする。 この技は かくとうタイプと 同時に ひこうタイプでも ある。" + }, + "matBlock": { + "name": "たたみがえし", + "effect": "かえした タタミを 盾にして 自分や 味方への 技の ダメージを 防ぐ。 変化技は 防ぐことが できない。" + }, + "belch": { + "name": "ゲップ", + "effect": "相手に 向かって ゲップを 浴びせて ダメージを 与える。 きのみを 食べないと だせない。" + }, + "rototiller": { + "name": "たがやす", + "effect": "地面を 耕して 草木が 育ちやすいようにする。 くさタイプの 攻撃と 特攻が あがる。" + }, + "stickyWeb": { + "name": "ねばねばネット", + "effect": "相手の 周りに ねばねばした ネットを はりめぐらせ 交代で でてきた 相手の 素早さを さげる。" + }, + "fellStinger": { + "name": "とどめばり", + "effect": "この 技を 使って 相手を 倒すと 攻撃が ぐぐーんと あがる。" + }, + "phantomForce": { + "name": "ゴーストダイブ", + "effect": "1ターンめで どこかに 消えて 2ターンめに 相手を 攻撃する。 守りを 無視して 攻撃できる。" + }, + "trickOrTreat": { + "name": "ハロウィン", + "effect": "相手を ハロウィンに 誘う。 相手の タイプに ゴーストタイプが 追加される。" + }, + "nobleRoar": { + "name": "おたけび", + "effect": "おたけびを あげて 相手を 威嚇し 相手の 攻撃と 特攻を さげる。" + }, + "ionDeluge": { + "name": "プラズマシャワー", + "effect": "電気を 帯びた 粒子を 拡散し ノーマルタイプの 技を でんきタイプに してしまう。" + }, + "parabolicCharge": { + "name": "パラボラチャージ", + "effect": "周りにいる ポケモン 全員に ダメージ。 与えた ダメージの 半分を 自分が 回復する。" + }, + "forestsCurse": { + "name": "もりののろい", + "effect": "相手に 森ののろいを かける。 のろいを かけられた 相手は タイプに くさタイプが 追加される。" + }, + "petalBlizzard": { + "name": "はなふぶき", + "effect": "激しい 花吹雪を 起こし 周りに いるものに 攻撃して ダメージを 与える。" + }, + "freezeDry": { + "name": "フリーズドライ", + "effect": "相手を 急激に 冷やして こおり 状態に することが ある。 みずタイプにも 効果バツグンになる。" + }, + "disarmingVoice": { + "name": "チャームボイス", + "effect": "魅惑の 鳴き声を だして 相手に 精神的な ダメージを 与える。 攻撃は 必ず 命中 する。" + }, + "partingShot": { + "name": "すてゼリフ", + "effect": "すてゼリフで 相手を いかくし 攻撃と 特攻を さげたのち 控えの ポケモンと 入れ替わる。" + }, + "topsyTurvy": { + "name": "ひっくりかえす", + "effect": "相手に かかっている すべての 能力変化を ひっくり返して 逆にする。" + }, + "drainingKiss": { + "name": "ドレインキッス", + "effect": "キッスによって 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。" + }, + "craftyShield": { + "name": "トリックガード", + "effect": "不思議な 力を 使って 味方への 変化技を 防ぐ。 ダメージ技は 受けてしまう。" + }, + "flowerShield": { + "name": "フラワーガード", + "effect": "不思議な 力を 使って 場にいる くさタイプの ポケモン 全員の 防御を あげる。" + }, + "grassyTerrain": { + "name": "グラスフィールド", + "effect": "5ターンの 間 グラスフィールドにする。 地面にいると 毎ターン 回復する。 くさタイプの 威力が あがる。" + }, + "mistyTerrain": { + "name": "ミストフィールド", + "effect": "5ターンの 間 地面にいると 状態異常に ならず ドラゴン技の ダメージも 半分になる。" + }, + "electrify": { + "name": "そうでん", + "effect": "相手が 技を だす前に そうでん すると そのターン 相手の 技は でんきタイプになる。" + }, + "playRough": { + "name": "じゃれつく", + "effect": "相手に じゃれついて 攻撃する。 相手の 攻撃を さげる ことがある。" + }, + "fairyWind": { + "name": "ようせいのかぜ", + "effect": "ようせいのかぜを 起こし 相手に 吹きつけて 攻撃する。" + }, + "moonblast": { + "name": "ムーンフォース", + "effect": "月の パワーを かりて 相手を 攻撃する。 相手の 特攻を さげる ことがある。" + }, + "boomburst": { + "name": "ばくおんぱ", + "effect": "すさまじい 爆音の 破壊力に よって 周りに いるものを 攻撃する。" + }, + "fairyLock": { + "name": "フェアリーロック", + "effect": "ロックを かけることによって 次のターン すべての ポケモンを 逃げられなくする。" + }, + "kingsShield": { + "name": "キングシールド", + "effect": "相手の 攻撃を 防ぐと 同時に 防御態勢になる。 触れた 相手の 攻撃を さげる。" + }, + "playNice": { + "name": "なかよくする", + "effect": "相手と なかよくなって 戦う 気力を 失わせ 相手の 攻撃を さげる。" + }, + "confide": { + "name": "ないしょばなし", + "effect": "ないしょばなしを することで 相手の 集中力を 失わせ 相手の 特攻を さげる。" + }, + "diamondStorm": { + "name": "ダイヤストーム", + "effect": "ダイヤの 嵐を 巻き起こし ダメージを 与える。 自分の 防御を ぐーんと あげることが ある。" + }, + "steamEruption": { + "name": "スチームバースト", + "effect": "ものすごく 熱い 蒸気を 相手に 浴びせる。 相手は やけどする ことがある。" + }, + "hyperspaceHole": { + "name": "いじげんホール", + "effect": "異次元ホールで 突然 相手の 真横に 現れ 攻撃する。 まもるや みきり なども 無視 できる。" + }, + "waterShuriken": { + "name": "みずしゅりけん", + "effect": "粘液で できた 手裏剣を 2ー5回の 間 連続で だす。 必ず 先制攻撃 できる。" + }, + "mysticalFire": { + "name": "マジカルフレイム", + "effect": "口から 吐きだす 特別 熱い 炎で 攻撃する。 相手の 特攻を さげる。" + }, + "spikyShield": { + "name": "ニードルガード", + "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手の 体力を 削って しまう。" + }, + "aromaticMist": { + "name": "アロマミスト", + "effect": "不思議な アロマの 香りによって 味方の 特防を あげる。" + }, + "eerieImpulse": { + "name": "かいでんぱ", + "effect": "体から かいでんぱを 放ち 相手に 浴びせる ことによって 特攻を がくっと さげる。" + }, + "venomDrench": { + "name": "ベノムトラップ", + "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手は 攻撃 特攻 素早さが さがる。" + }, + "powder": { + "name": "ふんじん", + "effect": "ふんじんを 浴びせた 相手が ほのお技を 使うと 爆発して ダメージを 与える。" + }, + "geomancy": { + "name": "ジオコントロール", + "effect": "1ターン目で エネルギーを 吸収し 2ターン目に 特攻 特防 素早さを ぐーんと あげる。" + }, + "magneticFlux": { + "name": "じばそうさ", + "effect": "磁場を 操作 することによって 特性 プラスと マイナスの 防御 特防が あがる。" + }, + "happyHour": { + "name": "ハッピータイム", + "effect": "ハッピータイムの 技を 使うと 戦闘の あとで もらえる お金が 倍になる。" + }, + "electricTerrain": { + "name": "エレキフィールド", + "effect": "5ターンの 間 エレキフィールドにする。 地面にいる ポケモンは 眠らない。 でんきタイプの 威力が あがる。" + }, + "dazzlingGleam": { + "name": "マジカルシャイン", + "effect": "強力な 光を 放ち 相手に ダメージを 与える。" + }, + "celebrate": { + "name": "おいわい", + "effect": "ポケモンが とっても ハッピーな あなたのことを お祝い してくれる。" + }, + "holdHands": { + "name": "てをつなぐ", + "effect": "味方の ポケモン 同士が 手をつなぐ。 とっても 幸せな 気持ちに なれる。" + }, + "babyDollEyes": { + "name": "つぶらなひとみ", + "effect": "つぶらなひとみで 相手を みつめて 攻撃を さげる。 必ず 先制攻撃 できる。" + }, + "nuzzle": { + "name": "ほっぺすりすり", + "effect": "電気を 帯びた ほっぺを すりつけて 攻撃。 相手を まひ状態に する。" + }, + "holdBack": { + "name": "てかげん", + "effect": "手加減 した 攻撃で 相手の HPを 必ず 1だけ 残す。" + }, + "infestation": { + "name": "まとわりつく", + "effect": "4ー5ターンの 間 相手に まとわりついて 攻撃する。 そのあいだ 相手は 逃げられない。" + }, + "powerUpPunch": { + "name": "グロウパンチ", + "effect": "繰り返し 打つことで だんだん こぶしが 固くなる。 相手に 当てると 攻撃が あがる。" + }, + "oblivionWing": { + "name": "デスウイング", + "effect": "ねらいを 定めた 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。" + }, + "thousandArrows": { + "name": "サウザンアロー", + "effect": "浮いている ポケモンにも 当たる。 浮いていた 相手は 撃ち落とされて 地面に 落ちる。" + }, + "thousandWaves": { + "name": "サウザンウェーブ", + "effect": "地をはう 波によって 攻撃。 波に 巻き込まれた 相手は 戦闘から 逃げられなくなる。" + }, + "landsWrath": { + "name": "グランドフォース", + "effect": "大地の パワーを 集め 力を 相手に 集中させて ダメージを 与える。" + }, + "lightOfRuin": { + "name": "はめつのひかり", + "effect": "永遠の花 の パワーを かりて 強力な 光線を 撃ちだす。 自分も かなりの ダメージを 受ける。" + }, + "originPulse": { + "name": "こんげんのはどう", + "effect": "青白く 輝く 無数の 光線で 相手を 攻撃する。" + }, + "precipiceBlades": { + "name": "だんがいのつるぎ", + "effect": "大地の 力を 刃に 変えて 相手を 攻撃する。" + }, + "dragonAscent": { + "name": "ガリョウテンセイ", + "effect": "大空から 急速落下 して 相手を 攻撃する。 自分の 防御と 特防が さがる。" + }, + "hyperspaceFury": { + "name": "いじげんラッシュ", + "effect": "たくさんの 腕で まもるや みきり などを 無視した 連続攻撃。 自分の 防御が さがる。" + }, + "breakneckBlitzPhysical": { + "name": "ウルトラダッシュアタック", + "effect": "Zパワーで 勢いを つけて 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" + }, + "breakneckBlitzSpecial": { + "name": "ウルトラダッシュアタック", + "effect": "ダミーデータ" + }, + "allOutPummelingPhysical": { + "name": "ぜんりょくむそうげきれつけん", + "effect": "Zパワーで 作った エネルギーの 弾を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" + }, + "allOutPummelingSpecial": { + "name": "ぜんりょくむそうげきれつけん", + "effect": "ダミーデータ" + }, + "supersonicSkystrikePhysical": { + "name": "ファイナルダイブクラッシュ", + "effect": "Zパワーで 勢いよく 飛びあがり 相手に 向かって 全力で 落下。 元になった 技で 威力が 変わる。" + }, + "supersonicSkystrikeSpecial": { + "name": "ファイナルダイブクラッシュ", + "effect": "ダミーデータ" + }, + "acidDownpourPhysical": { + "name": "アシッドポイズンデリート", + "effect": "Zパワーで 毒の 沼を 湧きあがらせ 全力で 相手を 沈める。 元になった 技で 威力が 変わる。" + }, + "acidDownpourSpecial": { + "name": "アシッドポイズンデリート", + "effect": "ダミーデータ" + }, + "tectonicRagePhysical": { + "name": "ライジングランドオーバー", + "effect": "Zパワーで 地面の 奥深くに 潜り 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" + }, + "tectonicRageSpecial": { + "name": "ライジングランドオーバー", + "effect": "ダミーデータ" + }, + "continentalCrushPhysical": { + "name": "ワールズエンドフォール", + "effect": "Zパワーで 大きな 岩山を 呼びだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" + }, + "continentalCrushSpecial": { + "name": "ワールズエンドフォール", + "effect": "ダミーデータ" + }, + "savageSpinOutPhysical": { + "name": "ぜったいほしょくかいてんざん", + "effect": "Zパワーで 吐きだした 糸が 全力で 相手を 縛りつける。 元になった 技で 威力が 変わる。" + }, + "savageSpinOutSpecial": { + "name": "ぜったいほしょくかいてんざん", + "effect": "ダミーデータ" + }, + "neverEndingNightmarePhysical": { + "name": "むげんあんやへのいざない", + "effect": "Zパワーで 呼びよせた 強い 怨念が 全力で 相手に 降りかかる。 元になった 技で 威力が 変わる。" + }, + "neverEndingNightmareSpecial": { + "name": "むげんあんやへのいざない", + "effect": "ダミーデータ" + }, + "corkscrewCrashPhysical": { + "name": "ちょうぜつらせんれんげき", + "effect": "Zパワーで 高速回転を おこない 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" + }, + "corkscrewCrashSpecial": { + "name": "ちょうぜつらせんれんげき", + "effect": "ダミーデータ" + }, + "infernoOverdrivePhysical": { + "name": "ダイナミックフルフレイム", + "effect": "Zパワーで 燃えさかる 炎を 吐きだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" + }, + "infernoOverdriveSpecial": { + "name": "ダイナミックフルフレイム", + "effect": "ダミーデータ" + }, + "hydroVortexPhysical": { + "name": "スーパーアクアトルネード", + "effect": "Zパワーで 大きな 渦潮を 作り 全力で 相手を 飲みこむ。 元になった 技で 威力が 変わる。" + }, + "hydroVortexSpecial": { + "name": "スーパーアクアトルネード", + "effect": "ダミーデータ" + }, + "bloomDoomPhysical": { + "name": "ブルームシャインエクストラ", + "effect": "Zパワーで 草花の エネルギーを 借り 全力で 相手を 攻撃する。 元になった 技で 威力が 変わる。" + }, + "bloomDoomSpecial": { + "name": "ブルームシャインエクストラ", + "effect": "ダミーデータ" + }, + "gigavoltHavocPhysical": { + "name": "スパーキングギガボルト", + "effect": "Zパワーで 溜めた 強い 電気を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" + }, + "gigavoltHavocSpecial": { + "name": "スパーキングギガボルト", + "effect": "ダミーデータ" + }, + "shatteredPsychePhysical": { + "name": "マキシマムサイブレイカー", + "effect": "Zパワーで 相手を 操り 全力で 痛い 思いを させる。 元になった 技で 威力が 変わる。" + }, + "shatteredPsycheSpecial": { + "name": "マキシマムサイブレイカー", + "effect": "ダミーデータ" + }, + "subzeroSlammerPhysical": { + "name": "レイジングジオフリーズ", + "effect": "Zパワーで 気温を 急激に 下げ 全力で 相手を 凍らせる。 元になった 技で 威力が 変わる。" + }, + "subzeroSlammerSpecial": { + "name": "レイジングジオフリーズ", + "effect": "ダミーデータ" + }, + "devastatingDrakePhysical": { + "name": "アルティメットドラゴンバーン", + "effect": "Zパワーで オーラを 実体化し 全力で 相手に 襲いかかる。 元になった 技で 威力が 変わる。" + }, + "devastatingDrakeSpecial": { + "name": "アルティメットドラゴンバーン", + "effect": "ダミーデータ" + }, + "blackHoleEclipsePhysical": { + "name": "ブラックホールイクリプス", + "effect": "Zパワーで 悪の エネルギーを 集め 全力で 相手を 吸いよせる。 元になった 技で 威力が 変わる。" + }, + "blackHoleEclipseSpecial": { + "name": "ブラックホールイクリプス", + "effect": "ダミーデータ" + }, + "twinkleTacklePhysical": { + "name": "ラブリースターインパクト", + "effect": "Zパワーで 魅惑の 空間を 作り 全力で 相手を もてあそぶ。 元になった 技で 威力が 変わる。" + }, + "twinkleTackleSpecial": { + "name": "ラブリースターインパクト", + "effect": "ダミーデータ" + }, + "catastropika": { + "name": "ひっさつのピカチュート", + "effect": "Zパワーで 最大 電力を 身に まとったピカチュウが 全力で 相手に 飛び掛る。" + }, + "shoreUp": { + "name": "すなあつめ", + "effect": "最大HPの 半分 自分の HPを 回復する。 すなあらしの時は 多く 回復。" + }, + "firstImpression": { + "name": "であいがしら", + "effect": "威力が 高い 技 だが 戦闘に 出たら すぐに 出さないと 成功 しない。" + }, + "banefulBunker": { + "name": "トーチカ", + "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手に 毒を 与えてしまう。" + }, + "spiritShackle": { + "name": "かげぬい", + "effect": "攻撃と 同時に 相手の 影を 縫い付けて 逃げられなくする。" + }, + "darkestLariat": { + "name": "DDラリアット", + "effect": "両腕を 回し 相手に 当てる。 相手の 能力変化に 関係なく ダメージを 与える。" + }, + "sparklingAria": { + "name": "うたかたのアリア", + "effect": "歌うことによって たくさんの バルーンを 放出する。 技を 受けると やけどが 治る。" + }, + "iceHammer": { + "name": "アイスハンマー", + "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。" + }, + "floralHealing": { + "name": "フラワーヒール", + "effect": "最大HPの 半分 相手の HPを 回復する。 グラスフィールドの時 効果が あがる。" + }, + "highHorsepower": { + "name": "10まんばりき", + "effect": "全身を 使って 相手に 猛アタックする。" + }, + "strengthSap": { + "name": "ちからをすいとる", + "effect": "相手の 攻撃力と 同じだけ 自分の HPを 回復する。 そして 相手の 攻撃を さげる。" + }, + "solarBlade": { + "name": "ソーラーブレード", + "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に その 力を 剣に 込めて 攻撃する。" + }, + "leafage": { + "name": "このは", + "effect": "はっぱを 相手に 当てて 攻撃する。" + }, + "spotlight": { + "name": "スポットライト", + "effect": "ポケモンに スポットライトを 当て そのターンに そのポケモンしか 狙えない ようにする。" + }, + "toxicThread": { + "name": "どくのいと", + "effect": "毒の 混じった 糸を 吹き付ける。 相手を 毒にして 素早さを さげる。" + }, + "laserFocus": { + "name": "とぎすます", + "effect": "精神を 集中して 次の 攻撃を 必ず 急所に 当てる。" + }, + "gearUp": { + "name": "アシストギア", + "effect": "ギアを 入れる ことによって 特性 プラスと マイナスの 攻撃と 特攻が あがる。" + }, + "throatChop": { + "name": "じごくづき", + "effect": "この 技を 受けた 相手は 地獄の 苦しみから 2ターンの間 音の 技を 出すことが できなくなる。" + }, + "pollenPuff": { + "name": "かふんだんご", + "effect": "敵には 爆発する だんごを 使って 攻撃。 味方には 回復する だんごを 与える。" + }, + "anchorShot": { + "name": "アンカーショット", + "effect": "アンカーを 相手に からませて 攻撃する。 相手は 逃げることが できなくなる。" + }, + "psychicTerrain": { + "name": "サイコフィールド", + "effect": "5ターンの間 地面にいると 先制技を 受けない。 エスパータイプの 威力が あがる。" + }, + "lunge": { + "name": "とびかかる", + "effect": "全力で 相手に 飛びかかって 攻撃。 相手の 攻撃を さげる。" + }, + "fireLash": { + "name": "ほのおのムチ", + "effect": "焼けたムチで 相手を 打ちつける。 攻撃を 受けた 相手は 防御が さがる。" + }, + "powerTrip": { + "name": "つけあがる", + "effect": "自分の 強さを 鼻高々に 攻撃する。自分の 能力が あがって いるほど 威力が あがる。" + }, + "burnUp": { + "name": "もえつきる", + "effect": "全身の ほのおを すべて 燃やして 大ダメージを 与える。 自分の ほのおタイプが なくなる。" + }, + "speedSwap": { + "name": "スピードスワップ", + "effect": "相手の 素早さと 自分の 素早さを 入れ替えてしまう。" + }, + "smartStrike": { + "name": "スマートホーン", + "effect": "とがった つので 相手を 突き刺して 攻撃する。 攻撃は 必ず 命中する。" + }, + "purify": { + "name": "じょうか", + "effect": "相手の 状態異常を 治す。 治すと 自分は HPを 回復 することが できる。" + }, + "revelationDance": { + "name": "めざめるダンス", + "effect": "全力で 踊って 攻撃する。 この 技の タイプは 自分の タイプと 同じになる。" + }, + "coreEnforcer": { + "name": "コアパニッシャー", + "effect": "ダメージを 与えた 相手が すでに 行動を 終えていたら 相手の 特性を 消してしまう。" + }, + "tropKick": { + "name": "トロピカルキック", + "effect": "南国 由来の 熱い キックを 相手に 浴びせる。 相手の 攻撃を さげる。" + }, + "instruct": { + "name": "さいはい", + "effect": "相手が 出した 技を 指示して もう一度 出させることが できる。" + }, + "beakBlast": { + "name": "くちばしキャノン", + "effect": "最初に クチバシを 加熱してから 攻撃を くりだす。 加熱中に さわると やけどする。" + }, + "clangingScales": { + "name": "スケイルノイズ", + "effect": "全身の うろこを こすり 大きな 音を 出して 攻撃する。 攻撃後 自分の 防御が さがる。" + }, + "dragonHammer": { + "name": "ドラゴンハンマー", + "effect": "体を ハンマーのように 使って 相手に 襲いかかり ダメージを 与える。" + }, + "brutalSwing": { + "name": "ぶんまわす", + "effect": "自分の 体を ぶんまわして 相手に ダメージを 与える。" + }, + "auroraVeil": { + "name": "オーロラベール", + "effect": "5ターンの 間 物理と 特殊の ダメージを 弱める。 ゆきの 時しか 出すことが できない。" + }, + "sinisterArrowRaid": { + "name": "シャドーアローズストライク", + "effect": "Zパワーで 無数の 矢を 作りだした ジュナイパーが 全力で 相手を 射抜く 攻撃。" + }, + "maliciousMoonsault": { + "name": "ハイパーダーククラッシャー", + "effect": "Zパワーで タフな 肉体を 得た ガオガエンが 全力で 相手に ぶつかって 攻撃する。" + }, + "oceanicOperetta": { + "name": "わだつみのシンフォニア", + "effect": "Zパワーで 大量の 水を 呼んだ アシレーヌが 全力で 相手を 攻撃する。" + }, + "guardianOfAlola": { + "name": "ガーディアン・デ・アローラ", + "effect": "Zパワーで アローラの 力を 得た とちがみポケモン 全力の 攻撃。 相手の 残りHPを たくさん 減らす。" + }, + "soulStealing7StarStrike": { + "name": "しちせいだっこんたい", + "effect": "Zパワーを 得た マーシャドーが パンチと キックの 連続技を 全力で 相手に 叩き込む。" + }, + "stokedSparksurfer": { + "name": "ライトニングサーフライド", + "effect": "Zパワーを 得た アローラ地方の ライチュウが 全力で 攻撃する。 相手を まひ 状態に する。" + }, + "pulverizingPancake": { + "name": "ほんきをだす こうげき", + "effect": "Zパワーで 本気を 出した カビゴンが 巨体を 躍動させて 全力で 相手に 襲いかかる。" + }, + "extremeEvoboost": { + "name": "ナインエボルブースト", + "effect": "Zパワーを 得た イーブイが 進化した 仲間たちの 力を 借りて 能力を ぐーんと 上げる。" + }, + "genesisSupernova": { + "name": "オリジンズスーパーノヴァ", + "effect": "Zパワーを 得た ミュウが 全力で 相手を 攻撃する。 足元が サイコフィールドになる。" + }, + "shellTrap": { + "name": "トラップシェル", + "effect": "こうらの トラップを しかける。 相手が 物理技を 出すと 爆発して ダメージを 与える。" + }, + "fleurCannon": { + "name": "フルールカノン", + "effect": "強力な ビームを 放ったあと 自分の 特攻が がくっと さがる。" + }, + "psychicFangs": { + "name": "サイコファング", + "effect": "サイコパワーで かみついて 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。" + }, + "stompingTantrum": { + "name": "じだんだ", + "effect": "悔しさを バネにして 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。" + }, + "shadowBone": { + "name": "シャドーボーン", + "effect": "魂の 宿った ホネで 相手を なぐりつけて 攻撃する。 相手の 防御を さげる ことがある。" + }, + "accelerock": { + "name": "アクセルロック", + "effect": "素早い スピードで 相手に ぶつかって 攻撃する。 必ず 先制攻撃 できる。" + }, + "liquidation": { + "name": "アクアブレイク", + "effect": "水の 力で 相手に ぶつかって 攻撃する。 相手の 防御を さげる ことがある。" + }, + "prismaticLaser": { + "name": "プリズムレーザー", + "effect": "プリズムの 力で 強力な 光線を 発射する。 次の ターンは 動けなくなる。" + }, + "spectralThief": { + "name": "シャドースチール", + "effect": "相手の 影に 潜り込み 相手の 能力アップを 奪って 攻撃する。" + }, + "sunsteelStrike": { + "name": "メテオドライブ", + "effect": "流星の ような 勢いで 突進する。 相手の 特性を 無視して 攻撃 することが できる。" + }, + "moongeistBeam": { + "name": "シャドーレイ", + "effect": "怪しい 光線を 放って 攻撃する。相手の 特性を 無視して 攻撃 することが できる。" + }, + "tearfulLook": { + "name": "なみだめ", + "effect": "なみだめに なって 相手の 戦力を 喪失させる。 相手の 攻撃と 特攻が さがる。" + }, + "zingZap": { + "name": "びりびりちくちく", + "effect": "相手に ぶつかって 強力な 電気を浴びせ びりびりちくちく させる。 相手を ひるませる ことが ある。" + }, + "naturesMadness": { + "name": "しぜんのいかり", + "effect": "自然の 怒りを 相手に ぶつける。 相手の HPは 半分に なる。" + }, + "multiAttack": { + "name": "マルチアタック", + "effect": "高い エネルギーを まといつつ 相手に ぶつかって 攻撃する。 メモリに より タイプが 変わる。" + }, + "tenMillionVoltThunderbolt": { + "name": "1000まんボルト", + "effect": "帽子を かぶった ピカチュウが Zパワーで パワーアップした 電撃を 放つ。 急所に 当たりやすい。" + }, + "mindBlown": { + "name": "ビックリヘッド", + "effect": "自分の 頭を 爆発 させて 周りの すべてを 攻撃する。 自分も ダメージを 受けてしまう。" + }, + "plasmaFists": { + "name": "プラズマフィスト", + "effect": "電気を まとった こぶしで 攻撃。 ノーマルタイプの 技を でんきタイプに してしまう。" + }, + "photonGeyser": { + "name": "フォトンゲイザー", + "effect": "光の 柱で 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。" + }, + "lightThatBurnsTheSky": { + "name": "てんこがすめつぼうのひかり", + "effect": "ネクロズマが 相手の 特性の 効果を 無視して 攻撃と 特攻の 高い方で ダメージを 与える。" + }, + "searingSunrazeSmash": { + "name": "サンシャインスマッシャー", + "effect": "Zパワーを 得た ソルガレオが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。" + }, + "menacingMoonrazeMaelstrom": { + "name": "ムーンライトブラスター", + "effect": "Zパワーを 得た ルナアーラが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。" + }, + "letsSnuggleForever": { + "name": "ぽかぼかフレンドタイム", + "effect": "Zパワーを 得た ミミッキュが 全力で ぽかぽか 攻撃。" + }, + "splinteredStormshards": { + "name": "ラジアルエッジストーム", + "effect": "Zパワーを 得た ルガルガンが 全力で 攻撃する。 追加で フィールド状態を 打ち消す。" + }, + "clangorousSoulblaze": { + "name": "ブレイジングソウルビート", + "effect": "Zパワーを 得た ジャラランガが 全力で 相手を 攻撃する。 追加で 自分の 能力が 上がる。" + }, + "zippyZap": { + "name": "ばちばちアクセル", + "effect": "猛スピードの 電撃 アタック。 必ず 先制攻撃 できて 急所に あたる。" + }, + "splishySplash": { + "name": "ざぶざぶサーフ", + "effect": "大きな 波に 電気を あびせ 相手に ぶつけて 攻撃する。 まひ状態に することが ある。" + }, + "floatyFall": { + "name": "ふわふわフォール", + "effect": "ふんわりと 浮かび あがり 一気に 急降下して 攻撃。 相手を ひるませることが ある。" + }, + "pikaPapow": { + "name": "ピカピカサンダー", + "effect": "トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 電撃。 必ず 命中する。" + }, + "bouncyBubble": { + "name": "いきいきバブル", + "effect": "水のかたまりを ぶつけて 攻撃。 水を 吸いとり ダメージの 半分の HPを 回復する。" + }, + "buzzyBuzz": { + "name": "びりびりエレキ", + "effect": "電気を 飛ばし 相手に あびせて 攻撃する。 相手を まひ状態に する。" + }, + "sizzlySlide": { + "name": "めらめらバーン", + "effect": "炎を まとった 体で 勢いよく 相手に ぶつかる。 相手を やけど状態に する。" + }, + "glitzyGlow": { + "name": "どばどばオーラ", + "effect": "念力を これでもかと あびせる。 相手の 特殊攻撃を 弱める 不思議な かべを つくりだす。" + }, + "baddyBad": { + "name": "わるわるゾーン", + "effect": "わるさを アピールして 攻撃。 相手の 物理攻撃を 弱める 不思議な かべを つくりだす。" + }, + "sappySeed": { + "name": "すくすくボンバー", + "effect": "巨大な ツルを 生やし タネを 撒きちらかして 攻撃する。 タネは 毎ターン 相手の HPを 吸いとる。" + }, + "freezyFrost": { + "name": "こちこちフロスト", + "effect": "冷たく 凍った くろいきりの 結晶で 攻撃。 全員の 能力変化を もとに もどす。" + }, + "sparklySwirl": { + "name": "きらきらストーム", + "effect": "むせかえる ような 香りの 竜巻で 相手を つつんで 攻撃。 味方の 状態異常を 回復する。" + }, + "veeveeVolley": { + "name": "ブイブイブレイク", + "effect": "イーブイの トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 体当たり。 必ず 命中する。" + }, + "doubleIronBash": { + "name": "ダブルパンツァー", + "effect": "胸の ナットを 軸に 回転して 2回 続けて うでを たたきつける。 相手を ひるませる ことが ある。" + }, + "maxGuard": { + "name": "ダイウォール", + "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" + }, + "dynamaxCannon": { + "name": "ダイマックスほう", + "effect": "コアから ビームを 放つ。相手の レベルが 過度に 上がっている 場合は 与える ダメージが 最大 2倍に 増える。" + }, + "snipeShot": { + "name": "ねらいうち", + "effect": "相手の 技を 引き受ける 特性や 技の 影響を 無視して 選んだ 相手を 攻撃 できる。" + }, + "jawLock": { + "name": "くらいつく", + "effect": "お互い ひんしに なるまで 交代が できなくなる。 どちらかの ポケモンが いなくなると 効果は消える。" + }, + "stuffCheeks": { + "name": "ほおばる", + "effect": "持っている きのみを 食べて 防御を ぐーんと あげる。" + }, + "noRetreat": { + "name": "はいすいのじん", + "effect": "自分の すべての 能力が 上がるが 交代 したり 逃げることが できなくなる。" + }, + "tarShot": { + "name": "タールショット", + "effect": "ねばねばの タールを 浴びせて 相手の 素早さを 下げる。 相手は ほのおが 弱点に なる。" + }, + "magicPowder": { + "name": "まほうのこな", + "effect": "まほうのこなを 浴びせて 相手を エスパータイプに 変化させる。" + }, + "dragonDarts": { + "name": "ドラゴンアロー", + "effect": "ドラメシヤで 2回 攻撃。 相手が 2匹 いるときは それぞれに 1回ずつ 攻撃する。" + }, + "teatime": { + "name": "おちゃかい", + "effect": "おちゃかいを ひらいて 場にいる ポケモンが それぞれ 持っている きのみを 食べる。" + }, + "octolock": { + "name": "たこがため", + "effect": "相手を 逃げられなくする。 かためられた 相手は 毎ターン 防御と 特防が 下がる。" + }, + "boltBeak": { + "name": "でんげきくちばし", + "effect": "電気を まとった くちばしで 刺す。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。" + }, + "fishiousRend": { + "name": "エラがみ", + "effect": "かたい エラで かみつく。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。" + }, + "courtChange": { + "name": "コートチェンジ", + "effect": "不思議な 力で お互いの 場の 効果を 入れ替える。" + }, + "maxFlare": { + "name": "ダイバーン", + "effect": "ダイマックスした ポケモンが 繰りだす ほのおタイプの 攻撃。 5ターンの 間 日差しを 強くする。" + }, + "maxFlutterby": { + "name": "ダイワーム", + "effect": "ダイマックスした ポケモンが 繰りだす むしタイプの 攻撃。 相手の 特攻を 下げる。" + }, + "maxLightning": { + "name": "ダイサンダー", + "effect": "ダイマックスした ポケモンが 繰りだす でんきタイプの 攻撃。 5ターンの 間 エレキフィールドにする。" + }, + "maxStrike": { + "name": "ダイアタック", + "effect": "ダイマックスした ポケモンが 繰りだす ノーマルタイプの 攻撃。 相手の 素早さを 下げる。" + }, + "maxKnuckle": { + "name": "ダイナックル", + "effect": "ダイマックスした ポケモンが 繰りだす かくとうタイプの 攻撃。 味方の 攻撃を 上げる。" + }, + "maxPhantasm": { + "name": "ダイホロウ", + "effect": "ダイマックスした ポケモンが 繰りだす ゴーストタイプの 攻撃。 相手の 防御を 下げる。" + }, + "maxHailstorm": { + "name": "ダイアイス", + "effect": "ダイマックスした ポケモンが 繰りだす こおりタイプの 攻撃。 5ターンの 間 あられを 降らす。" + }, + "maxOoze": { + "name": "ダイアシッド", + "effect": "ダイマックスした ポケモンが 繰りだす どくタイプの 攻撃。 味方の 特攻を 上げる。" + }, + "maxGeyser": { + "name": "ダイストリーム", + "effect": "ダイマックスした ポケモンが 繰りだす みずタイプの 攻撃。 5ターンの 間 雨を 降らせる。" + }, + "maxAirstream": { + "name": "ダイジェット", + "effect": "ダイマックスした ポケモンが 繰りだす ひこうタイプの 攻撃。 味方の 素早さを 上げる。" + }, + "maxStarfall": { + "name": "ダイフェアリー", + "effect": "ダイマックスした ポケモンが 繰りだす フェアリータイプの 攻撃。 5ターンの 間 ミストフィールドにする。" + }, + "maxWyrmwind": { + "name": "ダイドラグーン", + "effect": "ダイマックスした ポケモンが 繰りだす ドラゴンタイプの 攻撃。 相手の 攻撃を 下げる。" + }, + "maxMindstorm": { + "name": "ダイサイコ", + "effect": "ダイマックスした ポケモンが 繰りだす エスパータイプの 攻撃。 5ターンの 間 サイコフィールドにする。" + }, + "maxRockfall": { + "name": "ダイロック", + "effect": "ダイマックスした ポケモンが 繰りだす いわタイプの 攻撃。 5ターンの 間 砂あらしにする。" + }, + "maxQuake": { + "name": "ダイアース", + "effect": "ダイマックスした ポケモンが 繰りだす じめんタイプの 攻撃。 味方の 特防を 上げる。" + }, + "maxDarkness": { + "name": "ダイアーク", + "effect": "ダイマックスした ポケモンが 繰りだす あくタイプの 攻撃。 相手の 特防を 下げる。" + }, + "maxOvergrowth": { + "name": "ダイソウゲン", + "effect": "ダイマックスした ポケモンが 繰りだす くさタイプの 攻撃。 5ターンの 間 グラスフィールドにする。" + }, + "maxSteelspike": { + "name": "ダイスチル", + "effect": "ダイマックスした ポケモンが 繰りだす はがねタイプの 攻撃。 味方の 防御を 上げる。" + }, + "clangorousSoul": { + "name": "ソウルビート", + "effect": "自分の HPを 少し 削って すべての 能力を 上げる。" + }, + "bodyPress": { + "name": "ボディプレス", + "effect": "体を ぶつけて 攻撃。 防御が 高いほど 与える ダメージが 増える。" + }, + "decorate": { + "name": "デコレーション", + "effect": "かざりつけを することで 相手の 攻撃と 特攻を ぐーんと 上げる。" + }, + "drumBeating": { + "name": "ドラムアタック", + "effect": "ドラムの 根っこを ドラミングで コントロールして こうげき することで 相手の 素早さを 下げる。" + }, + "snapTrap": { + "name": "トラバサミ", + "effect": "トラバサミで 捕らえて 4-5ターンの 間 相手を はさんで 攻撃する。" + }, + "pyroBall": { + "name": "かえんボール", + "effect": "小石を 燃やした 炎の ボールで 相手を 攻撃する。 やけど 状態に することが ある。" + }, + "behemothBlade": { + "name": "きょじゅうざん", + "effect": "全身で 強大な剣を 振りかざし 勢いよく 切りかかって 攻撃する。" + }, + "behemothBash": { + "name": "きょじゅうだん", + "effect": "全身を 強固な盾へと 変化させ 勢いよく ぶつかって 攻撃する。" + }, + "auraWheel": { + "name": "オーラぐるま", + "effect": "ほほぶくろに 溜めた エネルギーで 攻撃し 自分の 素早さを あげる。 モルペコの 姿で タイプが 変わる。" + }, + "breakingSwipe": { + "name": "ワイドブレイカー", + "effect": "きょうじんな しっぽを 激しく ふりはらって 相手を 攻撃する。 相手の 攻撃を 下げる。" + }, + "branchPoke": { + "name": "えだづき", + "effect": "するどく とがった 枝で 相手を 突いて 攻撃する。" + }, + "overdrive": { + "name": "オーバードライブ", + "effect": "ギターや ベースを かきならして 激しく 響く 大きな 振動を 相手に 与えて 攻撃する。" + }, + "appleAcid": { + "name": "りんごさん", + "effect": "すっぱい りんごから つくりだした 酸性の 液体で 攻撃。 相手の 特防を 下げる。" + }, + "gravApple": { + "name": "Gのちから", + "effect": "高いところから りんごを 落として ダメージを 与える。 相手の 防御を 下げる。" + }, + "spiritBreak": { + "name": "ソウルクラッシュ", + "effect": "食らうと くじけるほどの 勢いで 攻撃。 相手の 特攻を 下げる。" + }, + "strangeSteam": { + "name": "ワンダースチーム", + "effect": "煙を 噴出して 相手を 攻撃。 混乱 させることが ある。" + }, + "lifeDew": { + "name": "いのちのしずく", + "effect": "不思議な 水を ふりまいて 自分と 場にいる 味方の HPを 回復する。" + }, + "obstruct": { + "name": "ブロッキング", + "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。 触れると 防御が がくっと 下がる。" + }, + "falseSurrender": { + "name": "どげざつき", + "effect": "頭を 下げる ふりを しながら 振りみだした 髪の毛を 突き刺す。 攻撃は 必ず 命中する。" + }, + "meteorAssault": { + "name": "スターアサルト", + "effect": "太い クキを ふりまわして 攻撃。 ただし 自分も よろめいてしまうため 次の ターンは 動けなくなる。" + }, + "eternabeam": { + "name": "ムゲンダイビーム", + "effect": "本来の 姿と なった ムゲンダイナ 最大の 攻撃。 次の ターンは 動けなくなる。" + }, + "steelBeam": { + "name": "てっていこうせん", + "effect": "全身から 集めた はがねを ビームとして 激しく 撃ちだす。 自分も ダメージを 受けてしまう。" + }, + "expandingForce": { + "name": "ワイドフォース", + "effect": "サイコパワーで 相手を 攻撃する。 サイコフィールドの時 威力が あがり すべての 相手に ダメージを 与える。" + }, + "steelRoller": { + "name": "アイアンローラー", + "effect": "フィールドを 破壊しながら 攻撃。 なんらかの フィールド状態に 変わっていないと 技は 失敗する。" + }, + "scaleShot": { + "name": "スケイルショット", + "effect": "ウロコを 撃ちだして 攻撃する。 2ー5回の 間 連続で だす。 素早さが あがるが 防御が さがる。" + }, + "meteorBeam": { + "name": "メテオビーム", + "effect": "1ターン目に 宇宙の 力を 集めることで 特攻が あがり 2ターン目に 相手を 攻撃する。" + }, + "shellSideArm": { + "name": "シェルアームズ", + "effect": "物理か 特殊か より多く ダメージを 与えられる 能力で 攻撃する。 毒状態に することが ある。" + }, + "mistyExplosion": { + "name": "ミストバースト", + "effect": "自分の 周りに いる すべてを 攻撃するが 使うと 瀕死になる。 ミストフィールドで 威力が あがる。" + }, + "grassyGlide": { + "name": "グラススライダー", + "effect": "地面を 滑るように 相手を 攻撃。 グラスフィールドの時 必ず 先制攻撃 できる。" + }, + "risingVoltage": { + "name": "ライジングボルト", + "effect": "地面から 立ちのぼる 電撃で 攻撃。 相手が エレキフィールドに いる時 技の 威力が 2倍に なる。" + }, + "terrainPulse": { + "name": "だいちのはどう", + "effect": "フィールドの力を 借りて 攻撃。 使った時の フィールドの状態に よって 技の タイプと 威力が 変わる。" + }, + "skitterSmack": { + "name": "はいよるいちげき", + "effect": "背後から はいより 攻撃する。 相手の 特攻を さげる。" + }, + "burningJealousy": { + "name": "しっとのほのお", + "effect": "しっとの エネルギーで 相手を 攻撃。 そのターン 能力が あがった ポケモンを やけどの 状態に する。" + }, + "lashOut": { + "name": "うっぷんばらし", + "effect": "相手への いらだちを ぶつけて 攻撃。 そのターンに 能力を さげられていると 技の 威力が 2倍に なる。" + }, + "poltergeist": { + "name": "ポルターガイスト", + "effect": "相手の 持ち物を あやつって 攻撃。 相手が 道具を 持っていない 場合は 失敗する。" + }, + "corrosiveGas": { + "name": "ふしょくガス", + "effect": "強い 酸性の ガスで 周りに いるものを 包みこみ 持っている 道具を 溶かしてしまう。" + }, + "coaching": { + "name": "コーチング", + "effect": "的確な 指導を おこなうことで 味方 全員の 攻撃と 防御を 上げる。" + }, + "flipTurn": { + "name": "クイックターン", + "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" + }, + "tripleAxel": { + "name": "トリプルアクセル", + "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。" + }, + "dualWingbeat": { + "name": "ダブルウイング", + "effect": "翼を 相手に ぶつけて 攻撃する。 2回連続で ダメージを 与える。" + }, + "scorchingSands": { + "name": "ねっさのだいち", + "effect": "熱く 焼けた 砂を 相手に ぶつけて 攻撃する。 やけど状態に することが ある。" + }, + "jungleHealing": { + "name": "ジャングルヒール", + "effect": "ジャングルと 一体化して 自分と 場にいる 味方の HPと 状態を 回復する。" + }, + "wickedBlow": { + "name": "あんこくきょうだ", + "effect": "あくの型を 極めし 強烈な 一撃。 必ず 急所に 当たる。" + }, + "surgingStrikes": { + "name": "すいりゅうれんだ", + "effect": "みずの型を 極めし 流れるような 3回の 連撃。 必ず 急所に 当たる。" + }, + "thunderCage": { + "name": "サンダープリズン", + "effect": "ほとばしる 電気の おりの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + }, + "dragonEnergy": { + "name": "ドラゴンエナジー", + "effect": "生命力を パワーに 変え 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" + }, + "freezingGlare": { + "name": "いてつくしせん", + "effect": "両目から サイコパワーを 撃ちだして 攻撃する。 こおり状態に することが ある。" + }, + "fieryWrath": { + "name": "もえあがるいかり", + "effect": "怒りを 炎の ような オーラに 変えて 攻撃する。 相手を ひるませることが ある。" + }, + "thunderousKick": { + "name": "らいめいげり", + "effect": "雷の ような 動きで 相手を 翻弄しながら キックする。 相手の 防御を さげる。" + }, + "glacialLance": { + "name": "ブリザードランス", + "effect": "吹雪を まとった 氷の 槍を 相手に 投げつけて 攻撃する。" + }, + "astralBarrage": { + "name": "アストラルビット", + "effect": "たくさんの 小さな 霊体を 相手に ぶつけて 攻撃する。" + }, + "eerieSpell": { + "name": "ぶきみなじゅもん", + "effect": "強力な サイコパワーで 攻撃。 相手が 最後に 使った技の PPを 3だけ 減らす。" + }, + "direClaw": { + "name": "フェイタルクロー", + "effect": "破滅的なツメで 攻撃する。 相手を どく まひ ねむりの いずれかの状態に することも ある。" + }, + "psyshieldBash": { + "name": "バリアーラッシュ", + "effect": "思念のエネルギーを まといながら 相手に ぶつかっていく。 自分の 防御を あげる。" + }, + "powerShift": { + "name": "パワーシフト", + "effect": "自分の 攻撃と防御を 入れ替える。" + }, + "stoneAxe": { + "name": "がんせきアックス", + "effect": "岩の斧で 攻撃する。 ばらまかれた 岩の破片が 相手の 周りに 浮かぶ。" + }, + "springtideStorm": { + "name": "はるのあらし", + "effect": "愛憎 入りまじった 強烈な風で 相手を 包みこんで 攻撃する。 相手の 攻撃を さげることが ある。" + }, + "mysticalPower": { + "name": "しんぴのちから", + "effect": "不思議な力を 放出して 攻撃する。 自分の 特攻が あがる。" + }, + "ragingFury": { + "name": "だいふんげき", + "effect": "2-3ターンの 間 炎を 放ちながら 暴れまわる。 暴れたあとは 混乱する。" + }, + "waveCrash": { + "name": "ウェーブタックル", + "effect": "水を まといつつ 全身で 相手に ぶつかるが 自分も かなりの ダメージ を受ける。" + }, + "chloroblast": { + "name": "クロロブラスト", + "effect": "自身の 葉緑素を 集約し 放出して 攻撃する。 自分も ダメージを 受けてしまう。" + }, + "mountainGale": { + "name": "ひょうざんおろし", + "effect": "氷山のような 大きな 氷塊を ぶつけて 攻撃する。 相手を ひるませることが ある。" + }, + "victoryDance": { + "name": "しょうりのまい", + "effect": "勝利を 呼びこむ 舞を 激しく 踊って 自分の 攻撃と 防御と 素早さを あげる。" + }, + "headlongRush": { + "name": "ぶちかまし", + "effect": "全身全霊の たいあたりを くらわせる。 自分の 防御と 特防が さがる。" + }, + "barbBarrage": { + "name": "どくばりセンボン", + "effect": "無数の毒針で 相手を 毒状態に することもある。 相手が 毒状態だと 威力は 2倍になる。" + }, + "esperWing": { + "name": "オーラウイング", + "effect": "オーラで 強化した翼で 切り裂く。 急所に 当たりやすい。 自分の 素早さを あげる。" + }, + "bitterMalice": { + "name": "うらみつらみ", + "effect": "背筋が 凍るような 怨念で 攻撃して 相手の 攻撃を さげる。" + }, + "shelter": { + "name": "たてこもる", + "effect": "皮膚を 鉄の盾のように 硬くすることで 自分の 防御を ぐーんと あげる。" + }, + "tripleArrows": { + "name": "3ぼんのや", + "effect": "足技のあと 3本の矢を 同時に放つ。 相手の 防御を さげたり ひるませることが ある。 急所に 当たりやすい。" + }, + "infernalParade": { + "name": "ひゃっきやこう", + "effect": "無数の火の玉で 攻撃して やけど状態に することが ある。 相手が 状態異常だと 威力は 2倍。" + }, + "ceaselessEdge": { + "name": "ひけん・ちえなみ", + "effect": "貝殻の剣で 攻撃する。 ばらまかれた 貝殻の破片は 相手の 足下に まきびし となって 散らばる。" + }, + "bleakwindStorm": { + "name": "こがらしあらし", + "effect": "身も心も 震える 冷たく 激しい風で 攻撃する。 相手の 素早さを さげることが ある。" + }, + "wildboltStorm": { + "name": "かみなりあらし", + "effect": "嵐を 起こし 雷雲を 呼びよせ 雷と風で 激しく 攻撃をする。 相手を まひ状態に することもある。" + }, + "sandsearStorm": { + "name": "ねっさのあらし", + "effect": "熱く焼けた砂と 強烈な風で 包みこんで 攻撃する。 相手を やけど状態に することがある。" + }, + "lunarBlessing": { + "name": "みかづきのいのり", + "effect": "みかづきに いのりを ささげて 自分と 場にいる 味方の HPと 状態を 回復する。" + }, + "takeHeart": { + "name": "ブレイブチャージ", + "effect": "心を 奮わせて 自分の 状態異常を 治し さらには 特攻と 特防を あげる。" + }, + "gMaxWildfire": { + "name": "キョダイゴクエン", + "effect": "キョダイマックスした リザードンが 繰りだす ほのおタイプの 攻撃。 4ターンの 間 ダメージを 与える。" + }, + "gMaxBefuddle": { + "name": "キョダイコワク", + "effect": "キョダイマックスした バタフリーが 繰り出す むしタイプの 攻撃。 毒・まひ・眠りの どれかに する。" + }, + "gMaxVoltCrash": { + "name": "キョダイバンライ", + "effect": "キョダイマックスした ピカチュウが 繰りだす でんきタイプの 攻撃。 相手を まひ状態に する。" + }, + "gMaxGoldRush": { + "name": "キョダイコバン", + "effect": "キョダイマックスした ニャースが 繰り出す ノーマルタイプの 攻撃。 相手を 混乱させ お金も もらえる。" + }, + "gMaxChiStrike": { + "name": "キョダイシンゲキ", + "effect": "キョダイマックスした カイリキーが 繰りだす かくとうタイプの 攻撃。 急所に 当たりやすく なる。" + }, + "gMaxTerror": { + "name": "キョダイゲンエイ", + "effect": "キョダイマックスした ゲンガーが 繰りだす ゴーストタイプの 攻撃。 影を 踏み 交代 できなくする。" + }, + "gMaxResonance": { + "name": "キョダイセンリツ", + "effect": "キョダイマックスした ラプラスが 繰りだす こおりタイプの 攻撃。 5ターンの 間 ダメージを 弱める。" + }, + "gMaxCuddle": { + "name": "キョダイホーヨー", + "effect": "キョダイマックスした イーブイが 繰りだす ノーマルタイプの 攻撃。 相手を メロメロに する。" + }, + "gMaxReplenish": { + "name": "キョダイサイセイ", + "effect": "キョダイマックスした カビゴンが 繰りだす ノーマルタイプの 攻撃。 食べた きのみを 再生する。" + }, + "gMaxMalodor": { + "name": "キョダイシュウキ", + "effect": "キョダイマックスした ダストダスが 繰りだす どくタイプの 攻撃。 相手を 毒 状態に する。" + }, + "gMaxStonesurge": { + "name": "キョダイガンジン", + "effect": "キョダイマックスした カジリガメが 繰りだす みずタイプの 攻撃。 鋭い 無数の 岩を ばらまく。" + }, + "gMaxWindRage": { + "name": "キョダイフウゲキ", + "effect": "キョダイマックスした アーマーガアが 繰りだす ひこうタイプの 攻撃。 リフレクターや ひかりのかべを 消し去る。" + }, + "gMaxStunShock": { + "name": "キョダイカンデン", + "effect": "キョダイマックスした ストリンダーが 繰り出す でんきタイプの 攻撃。 相手を 毒 か まひ どちらかにする。" + }, + "gMaxFinale": { + "name": "キョダイダンエン", + "effect": "キョダイマックスした マホイップが 繰りだす フェアリータイプの 攻撃。 味方の HPを 回復する。" + }, + "gMaxDepletion": { + "name": "キョダイゲンスイ", + "effect": "キョダイマックスした ジュラルドンが 繰りだす ドラゴンタイプの 攻撃。 最後に 使われた わざPPを 減らす。" + }, + "gMaxGravitas": { + "name": "キョダイテンドウ", + "effect": "キョダイマックスした イオルブが 繰りだす エスパータイプの 攻撃。 5ターンの 間 重力が 変わる。" + }, + "gMaxVolcalith": { + "name": "キョダイフンセキ", + "effect": "キョダイマックスした セキタンザンが 繰りだす いわタイプの 攻撃。 4ターンの 間 ダメージを 与える。" + }, + "gMaxSandblast": { + "name": "キョダイサジン", + "effect": "キョダイマックスした サダイジャが 繰りだす じめんタイプの 攻撃。 4-5ターンの間 砂が 吹き荒れる。" + }, + "gMaxSnooze": { + "name": "キョダイスイマ", + "effect": "キョダイマックスした オーロンゲが 繰りだす あくタイプの 攻撃。 大きな あくびで 眠気を 誘う。" + }, + "gMaxTartness": { + "name": "キョダイサンゲキ", + "effect": "キョダイマックスした アップリューが 繰りだす くさタイプの 攻撃。 相手の 回避率を 下げる。" + }, + "gMaxSweetness": { + "name": "キョダイカンロ", + "effect": "キョダイマックスした タルップルが 繰りだす くさタイプの 攻撃。 味方の 状態異常を 回復する。" + }, + "gMaxSmite": { + "name": "キョダイテンバツ", + "effect": "キョダイマックスした ブリムオンが 繰りだす フェアリータイプの 攻撃。 相手を 混乱させる。" + }, + "gMaxSteelsurge": { + "name": "キョダイコウジン", + "effect": "キョダイマックスした ダイオウドウが 繰りだす タイプの 攻撃。 鋭い 無数の とげを ばらまく。" + }, + "gMaxMeltdown": { + "name": "キョダイユウゲキ", + "effect": "キョダイマックスした メルメタルが 繰りだす はがねタイプの 攻撃。 同じ 技を 連続で 出せなくする。" + }, + "gMaxFoamBurst": { + "name": "キョダイホウマツ", + "effect": "キョダイマックスした キングラーが 繰りだす みずタイプの 攻撃。 相手の 素早さを がくっと さげる。" + }, + "gMaxCentiferno": { + "name": "キョダイヒャッカ", + "effect": "キョダイマックスした マルヤクデが 繰りだす ほのおタイプの 攻撃。 4-5ターンの間 炎に 閉じこめる。" + }, + "gMaxVineLash": { + "name": "キョダイベンタツ", + "effect": "キョダイマックスした フシギバナが 繰りだす くさタイプの 攻撃。 4ターンの 間 ダメージを 与える。" + }, + "gMaxCannonade": { + "name": "キョダイホウゲキ", + "effect": "キョダイマックスした カメックスが 繰りだす みずタイプの 攻撃。 4ターンの 間 ダメージを 与える。" + }, + "gMaxDrumSolo": { + "name": "キョダイコランダ", + "effect": "キョダイマックスした ゴリランダーが 繰りだす くさタイプの 攻撃。 相手の 特性に ジャマされない。" + }, + "gMaxFireball": { + "name": "キョダイカキュウ", + "effect": "キョダイマックスした エースバーンが 繰りだす ほのおタイプの 攻撃。 相手の 特性に ジャマされない。" + }, + "gMaxHydrosnipe": { + "name": "キョダイソゲキ", + "effect": "キョダイマックスした インテレオンが 繰りだす みずタイプの 攻撃。 相手の 特性に ジャマされない。" + }, + "gMaxOneBlow": { + "name": "キョダイイチゲキ", + "effect": "キョダイマックスした ウーラオスが 繰りだす あくタイプの 攻撃。 ダイウォールを 無視できる 一撃。" + }, + "gMaxRapidFlow": { + "name": "キョダイレンゲキ", + "effect": "キョダイマックスした ウーラオスが 繰りだす みずタイプの 攻撃。 ダイウォールを 無視できる 連撃。" + }, + "teraBlast": { + "name": "テラバースト", + "effect": "テラスタルだと テラスタイプの エネルギーを 放出して 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。" + }, + "silkTrap": { + "name": "スレッドトラップ", + "effect": "糸の罠を はりめぐらせる。 相手の 攻撃を 防ぐと 同時に 触れた 相手の 素早さを さげる。" + }, + "axeKick": { + "name": "かかとおとし", + "effect": "蹴りあげた かかとを 落として 攻撃する。 相手を 混乱させることが ある。 はずすと 自分が ダメージを 受ける。" + }, + "lastRespects": { + "name": "おはかまいり", + "effect": "仲間の 無念を 晴らすため 攻撃する。 倒された 味方のポケモンが 多いほど 技の 威力が 増える。" + }, + "luminaCrash": { + "name": "ルミナコリジョン", + "effect": "精神にも 作用する 奇妙な光を 放って 攻撃する。 相手の 特防を がくっと さげる。" + }, + "orderUp": { + "name": "いっちょうあがり", + "effect": "いなせな 身のこなしで 攻撃。 口の中に シャリタツが いると そのすがたによって 能力が あがる。" + }, + "jetPunch": { + "name": "ジェットパンチ", + "effect": "激流を こぶしに まとって 目にも 留まらぬ パンチを くりだす。 必ず 先制攻撃 できる。" + }, + "spicyExtract": { + "name": "ハバネロエキス", + "effect": "とんでもなく 辛いエキスを 出す。 相手の 攻撃が ぐーんと あがり 防御が がくっと さがる。" + }, + "spinOut": { + "name": "ホイールスピン", + "effect": "足に 負荷を かけることにより 激しく 回転して ダメージを 与える。 自分の 素早さが がくっと さがる。" + }, + "populationBomb": { + "name": "ネズミざん", + "effect": "仲間たちが わらわらと 集まって コンビネーションで 攻撃を 与えていく。 1-10回の 間 連続で あたる。" + }, + "iceSpinner": { + "name": "アイススピナー", + "effect": "足に 薄い氷を まとい クルクルと 回りながら ぶつかる。 回転の 動きによって フィールドを 壊す。" + }, + "glaiveRush": { + "name": "きょけんとつげき", + "effect": "体を 投げだす 無謀な突撃。 技のあと 相手からの 攻撃は 必ず 命中し ダメージが 2倍に なってしまう。" + }, + "revivalBlessing": { + "name": "さいきのいのり", + "effect": "慈愛の心で いのることにより 控えにいる ひんしの ポケモンを HPを 半分の状態で 復活させる。" + }, + "saltCure": { + "name": "しおづけ", + "effect": "相手を しおづけ状態に して 毎ターン ダメージを 与える。 はがね みずタイプは より 苦しむ。" + }, + "tripleDive": { + "name": "トリプルダイブ", + "effect": "息のあった 飛びこみを することで 相手に 水しぶきを あてる。 3回連続で ダメージを 与える。" + }, + "mortalSpin": { + "name": "キラースピン", + "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。 相手を 毒状態に する。" + }, + "doodle": { + "name": "うつしえ", + "effect": "相手の本質を とらえて うつしだし 自分と 味方を 相手と 同じ 特性に 変化させる。" + }, + "filletAway": { + "name": "みをけずる", + "effect": "自分の HPを けずって 自分の 攻撃と 特攻と 素早さを ぐーんと あげる。" + }, + "kowtowCleave": { + "name": "ドゲザン", + "effect": "土下座して 相手を 油断させておいて 切りかかる。 攻撃は 必ず 命中する。" + }, + "flowerTrick": { + "name": "トリックフラワー", + "effect": "細工がある 花たばを 相手に 投げて 攻撃する。 必ず 命中して 急所にも 当たる。" + }, + "torchSong": { + "name": "フレアソング", + "effect": "燃えたぎる 火炎を 歌うように 吹きつけて 相手を 焦がす。 自分の 特攻を あげる。" + }, + "aquaStep": { + "name": "アクアステップ", + "effect": "水もしたたる かろやかな 足どりで 相手を 翻弄し ダメージを 与える。 自分の 素早さを あげる。" + }, + "ragingBull": { + "name": "レイジングブル", + "effect": "怒り狂う あばれうしの 猛烈な タックル。 フォルムで 技のタイプが 変わり ひかりのかべや リフレクターなども 破壊できる。" + }, + "makeItRain": { + "name": "ゴールドラッシュ", + "effect": "大量のコインを ぶちまけて 攻撃。 自分の 特攻が さがる。 戦闘の あとで お金も もらえる。" + }, + "psyblade": { + "name": "サイコブレイド", + "effect": "実体のない刃で 相手を 切り裂く。 エレキフィールドに いるとき 技の威力が 1.5倍に なる。" + }, + "hydroSteam": { + "name": "ハイドロスチーム", + "effect": "煮えたぎる水を 勢いよく 浴びせる。 日差しが 強いとき 技の威力が さがるどころか 1.5倍になる。" + }, + "ruination": { + "name": "カタストロフィ", + "effect": "破滅的な 災厄を 巻き起こし 相手の HPを 半分に する。" + }, + "collisionCourse": { + "name": "アクセルブレイク", + "effect": "変形しながら 荒々しく 落下し いにしえの 大爆発を 引き起こす。 弱点をつくと さらに 威力が 増す。" + }, + "electroDrift": { + "name": "イナズマドライブ", + "effect": "変形しながら 超高速で 走行し 未知なる 電撃が 相手を つらぬく。 弱点をつくと さらに 威力が 増す。" + }, + "shedTail": { + "name": "しっぽきり", + "effect": "自分の HPを 削って 分身を だしたあと もどってきて 控えの ポケモンと 入れ替わる。" + }, + "chillyReception": { + "name": "さむいギャグ", + "effect": "場を 凍らせる ギャグを 言い残し 控えの ポケモンと 入れ替わる。 5ターンの 間 ゆきを 降らす。" + }, + "tidyUp": { + "name": "おかたづけ", + "effect": "まきびし ステルスロック ねばねばネット どくびし みがわりを すべて かたづける。 自分の 攻撃と 素早さが あがる。" + }, + "snowscape": { + "name": "ゆきげしき", + "effect": "5ターンの 間 ゆきを 降らせる。 こおりタイプの 防御が あがる。" + }, + "pounce": { + "name": "とびつく", + "effect": "相手に 飛びついて 攻撃する。 相手の 素早さを さげる。" + }, + "trailblaze": { + "name": "くさわけ", + "effect": "草むらから 飛びだすように 攻撃する。 軽快な 足どりに よって 自分の 素早さを あげる。" + }, + "chillingWater": { + "name": "ひやみず", + "effect": "相手の 元気を 失わせるくらい 冷たい水を 浴びせて 攻撃する。 相手の 攻撃を さげる。" + }, + "hyperDrill": { + "name": "ハイパードリル", + "effect": "とがった 体の部位を 急速に 回転させ つらぬく。 まもるや みきり なども 無視 できる。" + }, + "twinBeam": { + "name": "ツインビーム", + "effect": "両目から 不可思議な 光線を 発射して 攻撃する。 2回連続で ダメージを 与える。" + }, + "rageFist": { + "name": "ふんどのこぶし", + "effect": "怒りを エネルギーに 変えて 攻撃。 受けた 攻撃の 回数が 多いほど 技の 威力が あがる。" + }, + "armorCannon": { + "name": "アーマーキャノン", + "effect": "みずからの ヨロイを 燃えたぎる 弾として 撃ち出して 攻撃する。 自分の 防御と 特防が さがる。" + }, + "bitterBlade": { + "name": "むねんのつるぎ", + "effect": "この世への 未練を 剣先に こめて 切りつける。 与えた ダメージの 半分の HPを 回復できる。" + }, + "doubleShock": { + "name": "でんこうそうげき", + "effect": "全身の でんきを すべて 放って 大ダメージを 与える。 自分の でんきタイプが なくなる。" + }, + "gigatonHammer": { + "name": "デカハンマー", + "effect": "大きな ハンマーを 体ごと ぶんまわして 攻撃する。 この技は 2回連続で だせない。" + }, + "comeuppance": { + "name": "ほうふく", + "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。" + }, + "aquaCutter": { + "name": "アクアカッター", + "effect": "加圧された 水を 刃のように 噴射して 相手を 切り裂く。 急所に 当たりやすい。" + }, + "blazingTorque": { + "name": "バーンアクセル", + "effect": "メラメラの エンジンを 吹かして 相手に ぶつかる。やけど状態に することが ある。" + }, + "wickedTorque": { + "name": "ダークアクセル", + "effect": "悪意で エンジンを 吹かして 相手に ぶつかる。眠り状態に することが ある。" + }, + "noxiousTorque": { + "name": "ポイズンアクセル", + "effect": "有毒な エンジンを 吹かして 相手に ぶつかる。毒状態に することが ある。" + }, + "combatTorque": { + "name": "ファイトアクセル", + "effect": "力いっぱい エンジンを 吹かして 相手に ぶつかる。まひ状態に することが ある。" + }, + "magicalTorque": { + "name": "マジカルアクセル", + "effect": "幻想的な エンジンを 吹かして 相手に ぶつかる。混乱させることが ある。" + }, + "bloodMoon": { + "name": "ブラッドムーン", + "effect": "血のように 赤い満月から ありったけの 気迫を 撃ちだす。 この技は 2回連続で だせない。" + }, + "matchaGotcha": { + "name": "シャカシャカほう", + "effect": "かきまぜた お茶の 大砲は 与えた ダメージの 半分を 回復して やけど状態に することも ある。" + }, + "syrupBomb": { + "name": "みずあめボム", + "effect": "ねっとりした みずあめを 爆発させ 相手を あめまみれ 状態にして 3ターンの間 素早さを さげ続ける。" + }, + "ivyCudgel": { + "name": "ツタこんぼう", + "effect": "ツタを まきつけた こん棒で なぐる。 かぶっている お面で タイプが 変わる。 急所に 当たりやすい。" + }, + "electroShot": { + "name": "エレクトロビーム", + "effect": "1ターン目に 電気を 集めて 特攻が あがり 2ターン目に 高圧の 電気を 発射する。 天気が 雨のときは すぐに 発射できる。" + }, + "teraStarstorm": { + "name": "テラクラスター", + "effect": "結晶の力を 照射し 敵を 排除する。 テラパゴスが ステラフォルムで 放つと すべての 相手に ダメージを 与える。" + }, + "fickleBeam": { + "name": "きまぐレーザー", + "effect": "光線を 発射して 攻撃する。 ときどき ほかの首も 協力して レーザーを 放ち 威力が 2倍に なる。" + }, + "burningBulwark": { + "name": "かえんのまもり", + "effect": "相手の 攻撃を 超高熱の 体毛で 防ぎ 同時に 触れた 相手に やけどを 与えてしまう。" + }, + "thunderclap": { + "name": "じんらい", + "effect": "相手より 先に 電撃を 浴びせる。 相手が だす技が 攻撃技でないと 失敗する。" + }, + "mightyCleave": { + "name": "パワフルエッジ", + "effect": "頭部に 蓄積した 光で 切断する。 守りを 無視して 攻撃できる。" + }, + "tachyonCutter": { + "name": "タキオンカッター", + "effect": "粒子の刃を たて続けに 発射して 2回連続で ダメージを 与える。 攻撃は 必ず 命中する。" + }, + "hardPress": { + "name": "ハードプレス", + "effect": "腕やハサミで 相手を 圧迫する。 相手の HPが 残っているほど 威力が あがる。" + }, + "dragonCheer": { + "name": "ドラゴンエール", + "effect": "竜の鼓舞で 士気を 上げて 味方の技が 急所に 当たりやすくなる。 ドラゴンタイプだと より 鼓舞される。" + }, + "alluringVoice": { + "name": "みわくのボイス", + "effect": "天使のような 歌声で 相手を 攻撃。 そのターン 能力が あがった ポケモンを 混乱の 状態に する。" + }, + "temperFlare": { + "name": "やけっぱち", + "effect": "自棄になった 勢いで 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。" + }, + "supercellSlam": { + "name": "サンダーダイブ", + "effect": "体を 帯電させ て相手に のしかかる。 はずすと 自分が ダメージを 受ける。" + }, + "psychicNoise": { + "name": "サイコノイズ", + "effect": "不快な音波を 相手に 浴びせて 攻撃。 2ターンの間 技や 特性や 持っている 道具によって HPを 回復できなくなる。" + }, + "upperHand": { + "name": "はやてがえし", + "effect": "動きに 反応して 掌底を 打ちこみ 相手を ひるませる。 相手が だす技が 先制攻撃でないと 失敗する。" + }, + "malignantChain": { + "name": "じゃどくのくさり", + "effect": "毒でできた鎖を 相手に 巻きつけ 毒素を 流しこんで 蝕む。 猛毒の 状態に することが ある。" + } +} \ No newline at end of file diff --git a/src/locales/ja/nature.json b/src/locales/ja/nature.json new file mode 100644 index 00000000000..8d7d37b7e74 --- /dev/null +++ b/src/locales/ja/nature.json @@ -0,0 +1,27 @@ +{ + "Hardy": "がんばりや", + "Lonely": "さみしがり", + "Brave": "ゆうかん", + "Adamant": "いじっぱり", + "Naughty": "やんちゃ", + "Bold": "ずぶとい", + "Docile": "すなお", + "Relaxed": "のんき", + "Impish": "わんぱく", + "Lax": "のうてんき", + "Timid": "おくびょう", + "Hasty": "せっかち", + "Serious": "まじめ", + "Jolly": "ようき", + "Naive": "むじゃき", + "Modest": "ひかえめ", + "Mild": "おっとり", + "Quiet": "れいせい", + "Bashful": "てれや", + "Rash": "うっかりや", + "Calm": "おだやか", + "Gentle": "おとなしい", + "Sassy": "なまいき", + "Careful": "しんちょう", + "Quirky": "きまぐれ" +} \ No newline at end of file diff --git a/src/locales/ja/party-ui-handler.json b/src/locales/ja/party-ui-handler.json new file mode 100644 index 00000000000..b112653c544 --- /dev/null +++ b/src/locales/ja/party-ui-handler.json @@ -0,0 +1,8 @@ +{ + "SEND_OUT": "入れ替える", + "SUMMARY": "強さを見る", + "CANCEL": "やめる", + "RELEASE": "逃がす", + "APPLY": "使う", + "TEACH": "教える" +} diff --git a/src/locales/ja/pokeball.json b/src/locales/ja/pokeball.json new file mode 100644 index 00000000000..5ed68867460 --- /dev/null +++ b/src/locales/ja/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "モンスターボール", + "greatBall": "スーパーボール", + "ultraBall": "ハイパーボール", + "rogueBall": "ローグボール", + "masterBall": "マスターボール", + "luxuryBall": "ゴージャスボール" +} \ No newline at end of file diff --git a/src/locales/ja/pokemon-form-battle.json b/src/locales/ja/pokemon-form-battle.json new file mode 100644 index 00000000000..adbc7b4b3da --- /dev/null +++ b/src/locales/ja/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "メガ{{pokemonName}}", + "mega-x": "メガ{{pokemonName}}X", + "mega-y": "メガ{{pokemonName}}Y", + "primal": "ゲンシ{{pokemonName}}", + "gigantamax": "キョダイ{{pokemonName}}", + "eternamax": "E・{{pokemonName}}", + "megaChange": "{{preName}}は\nメガ{{pokemonName}}に メガシンカした!", + "gigantamaxChange": "{{preName}}は\nキョダイマックスした!", + "eternamaxChange": "{{preName}}は\nムゲンダイマックスした!", + "revertChange": "{{pokemonName}}は\n元の姿に 戻った!", + "formChange": "{{preName}}は\n姿を 変えた!", + "disguiseChange": "ばけのかわが みがわりに なった!" +} diff --git a/src/locales/ja/pokemon-form.json b/src/locales/ja/pokemon-form.json new file mode 100644 index 00000000000..76124904456 --- /dev/null +++ b/src/locales/ja/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "コスプレ", + "pikachuCoolCosplay": "クールなコスプレ", + "pikachuBeautyCosplay": "きれいなコスプレ", + "pikachuCuteCosplay": "かわいいコスプレ", + "pikachuSmartCosplay": "かしこいコスプレ", + "pikachuToughCosplay": "パワフルなコスプレ", + "pikachuPartner": "パートナー", + "eeveePartner": "パートナー", + "pichuSpiky": "ギザみみ", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "たいよう", + "castformRainy": "あまみず", + "castformSnowy": "ゆきぐも", + "deoxysNormal": "ノーマル", + "burmyPlant": "くさき", + "burmySandy": "すなち", + "burmyTrash": "ゴミ", + "shellosEast": "ひがし", + "shellosWest": "にし", + "rotomHeat": "ヒート", + "rotomWash": "ウォッシュ", + "rotomFrost": "フロスト", + "rotomFan": "スピン", + "rotomMow": "カット", + "giratinaAltered": "アナザー", + "shayminLand": "ランド", + "basculinRedStriped": "赤筋", + "basculinBlueStriped": "青筋", + "basculinWhiteStriped": "白筋", + "deerlingSpring": "春", + "deerlingSummer": "夏", + "deerlingAutumn": "秋", + "deerlingWinter": "冬", + "tornadusIncarnate": "けしん", + "thundurusIncarnate": "けしん", + "landorusIncarnate": "けしん", + "keldeoOrdinary": "いつも", + "meloettaAria": "ボイス", + "meloettaPirouette": "ステップ", + "froakieBattleBond": "きずなへんげ", + "scatterbugMeadow": "はなぞの", + "scatterbugIcySnow": "ひょうせつ", + "scatterbugPolar": "ゆきぐに", + "scatterbugTundra": "せつげん", + "scatterbugContinental": "たいりく", + "scatterbugGarden": "ていえん", + "scatterbugElegant": "みやび", + "scatterbugModern": "モダン", + "scatterbugMarine": "マリン", + "scatterbugArchipelago": "ぐんとう", + "scatterbugHighPlains": "こうや", + "scatterbugSandstorm": "さじん", + "scatterbugRiver": "たいが", + "scatterbugMonsoon": "スコール", + "scatterbugSavanna": "サバンナ", + "scatterbugSun": "たいよう", + "scatterbugOcean": "オーシャン", + "scatterbugJungle": "ジャングル", + "scatterbugFancy": "ファンシー", + "scatterbugPokeBall": "ボール", + "flabebeRed": "赤", + "flabebeYellow": "黄", + "flabebeOrange": "オレンジ", + "flabebeBlue": "青", + "flabebeWhite": "白", + "furfrouHeart": "ハート", + "furfrouStar": "スター", + "furfrouDiamond": "ダイア", + "furfrouDebutante": "レディ", + "furfrouMatron": "マダム", + "furfrouDandy": "ジェントル", + "furfrouLaReine": "クイーン", + "furfrouKabuki": "カブキ", + "furfrouPharaoh": "キングダム", + "pumpkabooSmall": "ちいさい", + "pumpkabooLarge": "おおきい", + "pumpkabooSuper": "とくだい", + "xerneasNeutral": "リラックス", + "xerneasActive": "アクティブ", + "zygarde50": "50%フォルム", + "zygarde10": "10%フォルム", + "zygarde50Pc": "50%フォルム スワームチェンジ", + "zygarde10Pc": "10%フォルム スワームチェンジ", + "zygardeComplete": "パーフェクトフォルム", + "oricorioBaile": "めらめら", + "oricorioPompom": "ぱちぱち", + "oricorioPau": "ふらふら", + "oricorioSensu": "まいまい", + "rockruffOwnTempo": "マイペース", + "miniorRedMeteor": "赤 りゅうせい", + "miniorOrangeMeteor": "オレンジ りゅうせい", + "miniorYellowMeteor": "黄 りゅうせい", + "miniorGreenMeteor": "緑 りゅうせい", + "miniorBlueMeteor": "水色 りゅうせい", + "miniorIndigoMeteor": "青 りゅうせい", + "miniorVioletMeteor": "紫 りゅうせい", + "miniorRed": "赤", + "miniorOrange": "オレンジ", + "miniorYellow": "黄", + "miniorGreen": "緑", + "miniorBlue": "水色", + "miniorIndigo": "青", + "miniorViolet": "紫", + "mimikyuDisguised": "ばけたすがた", + "mimikyuBusted": "ばれたすがた", + "magearnaOriginal": "500ねんまえ", + "marshadowZenith": "Zパワー", + "sinisteaPhony": "がんさく", + "sinisteaAntique": "しんさく", + "eiscueNoIce": "ナイスなし", + "indeedeeMale": "オス", + "indeedeeFemale": "メス", + "morpekoFullBelly": "まんぷく", + "zacianHeroOfManyBattles": "れきせんのゆうしゃ", + "zamazentaHeroOfManyBattles": "れきせんのゆうしゃ", + "zarudeDada": "とうちゃん", + "enamorusIncarnate": "けしん", + "squawkabillyGreenPlumage": "グリーンフェザー", + "squawkabillyBluePlumage": "ブルーフェザー", + "squawkabillyYellowPlumage": "イエローフェザー", + "squawkabillyWhitePlumage": "ホワイトフェザー", + "tatsugiriCurly": "そったすがた", + "tatsugiriDroopy": "たれたすがた", + "tatsugiriStretchy": "のびたすがた", + "gimmighoulChest": "はこ", + "gimmighoulRoaming": "とほ", + "koraidonApexBuild": "かんぜんけいたい", + "koraidonLimitedBuild":"せいげんけいたい", + "koraidonSprintingBuild":"しっそうけいたい", + "koraidonSwimmingBuild":"ゆうえいけいたい", + "koraidonGlidingBuild":"かっくうけいたい", + "miraidonUltimateMode":"コンプリートモード", + "miraidonLowPowerMode":"リミテッドモード", + "miraidonDriveMode":"ドライブモード", + "miraidonAquaticMode":"フロートモード", + "miraidonGlideMode":"グライドモード", + "poltchageistCounterfeit": "マガイモノ", + "poltchageistArtisan": "タカイモノ", + "paldeaTaurosCombat": "コンバット", + "paldeaTaurosBlaze": "ブレイズ", + "paldeaTaurosAqua": "ウォーター" +} \ No newline at end of file diff --git a/src/locales/ja/pokemon-info-container.json b/src/locales/ja/pokemon-info-container.json new file mode 100644 index 00000000000..287eed23c74 --- /dev/null +++ b/src/locales/ja/pokemon-info-container.json @@ -0,0 +1,7 @@ +{ + "moveset": "技", + "gender": "性別:", + "ability": "特性:", + "nature": "性格:", + "form": "姿:" +} diff --git a/src/locales/ja/pokemon-info.json b/src/locales/ja/pokemon-info.json new file mode 100644 index 00000000000..456b4949839 --- /dev/null +++ b/src/locales/ja/pokemon-info.json @@ -0,0 +1,41 @@ +{ + "Stat": { + "HP": "HP", + "HPshortened": "HP", + "ATK": "攻撃", + "ATKshortened": "攻撃", + "DEF": "防御", + "DEFshortened": "防御", + "SPATK": "特攻", + "SPATKshortened": "特攻", + "SPDEF": "特防", + "SPDEFshortened": "特防", + "SPD": "素早さ", + "SPDshortened": "素早さ", + "ACC": "命中", + "EVA": "回避", + "HPStat": "HP" + }, + "Type": { + "UNKNOWN": "???", + "NORMAL": "ノーマル", + "FIGHTING": "かくとう", + "FLYING": "ひこう", + "POISON": "どく", + "GROUND": "じめん", + "ROCK": "いわ", + "BUG": "むし", + "GHOST": "ゴースト", + "STEEL": "はがね", + "FIRE": "ほのお", + "WATER": "みず", + "GRASS": "くさ", + "ELECTRIC": "でんき", + "PSYCHIC": "エスパー", + "ICE": "こおり", + "DRAGON": "ドラゴン", + "DARK": "あく", + "FAIRY": "フェアリー", + "STELLAR": "ステラ" + } +} diff --git a/src/locales/ja/pokemon-summary.json b/src/locales/ja/pokemon-summary.json new file mode 100644 index 00000000000..cf35befe6fd --- /dev/null +++ b/src/locales/ja/pokemon-summary.json @@ -0,0 +1,44 @@ +{ + "pokemonInfo": "ポケモン情報", + "status": "ステータス", + "powerAccuracyCategory": "威力\n命中\n分類", + "type": "タイプ", + "unknownTrainer": "???", + "ot": "親", + "nature": "性格", + "expPoints": "経験値", + "nextLv": "次のレベルまで", + "cancel": "キャンセル", + "memoString": "{{natureFragment}}な性格。\n{{metFragment}}", + "metFragment": { + "normal": "{{biome}}で\nLv.{{level}}の時に出会った。", + "apparently": "{{biome}}で\nLv.{{level}}の時に出会ったようだ。" + }, + "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}}" + } +} diff --git a/src/locales/ja/pokemon.json b/src/locales/ja/pokemon.json new file mode 100644 index 00000000000..e6fcd02a750 --- /dev/null +++ b/src/locales/ja/pokemon.json @@ -0,0 +1,1084 @@ +{ + "bulbasaur": "フシギダネ", + "ivysaur": "フシギソウ", + "venusaur": "フシギバナ", + "charmander": "ヒトカゲ", + "charmeleon": "リザード", + "charizard": "リザードン", + "squirtle": "ゼニガメ", + "wartortle": "カメール", + "blastoise": "カメックス", + "caterpie": "キャタピー", + "metapod": "トランセル", + "butterfree": "バタフリー", + "weedle": "ビードル", + "kakuna": "コクーン", + "beedrill": "スピアー", + "pidgey": "ポッポ", + "pidgeotto": "ピジョン", + "pidgeot": "ピジョット", + "rattata": "コラッタ", + "raticate": "ラッタ", + "spearow": "オニスズメ", + "fearow": "オニドリル", + "ekans": "アーボ", + "arbok": "アーボック", + "pikachu": "ピカチュウ", + "raichu": "ライチュウ", + "sandshrew": "サンド", + "sandslash": "サンドパン", + "nidoran_f": "ニドラン♀", + "nidorina": "ニドリーナ", + "nidoqueen": "ニドクイン", + "nidoran_m": "ニドラン♂", + "nidorino": "ニドリーノ", + "nidoking": "ニドキング", + "clefairy": "ピッピ", + "clefable": "ピクシー", + "vulpix": "ロコン", + "ninetales": "キュウコン", + "jigglypuff": "プリン", + "wigglytuff": "プクリン", + "zubat": "ズバット", + "golbat": "ゴルバット", + "oddish": "ナゾノクサ", + "gloom": "クサイハナ", + "vileplume": "ラフレシア", + "paras": "パラス", + "parasect": "パラセクト", + "venonat": "コンパン", + "venomoth": "モルフォン", + "diglett": "ディグダ", + "dugtrio": "ダグトリオ", + "meowth": "ニャース", + "persian": "ペルシアン", + "psyduck": "コダック", + "golduck": "ゴルダック", + "mankey": "マンキー", + "primeape": "オコリザル", + "growlithe": "ガーディ", + "arcanine": "ウインディ", + "poliwag": "ニョロモ", + "poliwhirl": "ニョロゾ", + "poliwrath": "ニョロボン", + "abra": "ケーシィ", + "kadabra": "ユンゲラー", + "alakazam": "フーディン", + "machop": "ワンリキー", + "machoke": "ゴーリキー", + "machamp": "カイリキー", + "bellsprout": "マダツボミ", + "weepinbell": "ウツドン", + "victreebel": "ウツボット", + "tentacool": "メノクラゲ", + "tentacruel": "ドククラゲ", + "geodude": "イシツブテ", + "graveler": "ゴローン", + "golem": "ゴローニャ", + "ponyta": "ポニータ", + "rapidash": "ギャロップ", + "slowpoke": "ヤドン", + "slowbro": "ヤドラン", + "magnemite": "コイル", + "magneton": "レアコイル", + "farfetchd": "カモネギ", + "doduo": "ドードー", + "dodrio": "ドードリオ", + "seel": "パウワウ", + "dewgong": "ジュゴン", + "grimer": "ベトベター", + "muk": "ベトベトン", + "shellder": "シェルダー", + "cloyster": "パルシェン", + "gastly": "ゴース", + "haunter": "ゴースト", + "gengar": "ゲンガー", + "onix": "イワーク", + "drowzee": "スリープ", + "hypno": "スリーパー", + "krabby": "クラブ", + "kingler": "キングラー", + "voltorb": "ビリリダマ", + "electrode": "マルマイン", + "exeggcute": "タマタマ", + "exeggutor": "ナッシー", + "cubone": "カラカラ", + "marowak": "ガラガラ", + "hitmonlee": "サワムラー", + "hitmonchan": "エビワラー", + "lickitung": "ベロリンガ", + "koffing": "ドガース", + "weezing": "マタドガス", + "rhyhorn": "サイホーン", + "rhydon": "サイドン", + "chansey": "ラッキー", + "tangela": "モンジャラ", + "kangaskhan": "ガルーラ", + "horsea": "タッツー", + "seadra": "シードラ", + "goldeen": "トサキント", + "seaking": "アズマオウ", + "staryu": "ヒトデマン", + "starmie": "スターミー", + "mr_mime": "バリヤード", + "scyther": "ストライク", + "jynx": "ルージュラ", + "electabuzz": "エレブー", + "magmar": "ブーバー", + "pinsir": "カイロス", + "tauros": "ケンタロス", + "magikarp": "コイキング", + "gyarados": "ギャラドス", + "lapras": "ラプラス", + "ditto": "メタモン", + "eevee": "イーブイ", + "vaporeon": "シャワーズ", + "jolteon": "サンダース", + "flareon": "ブースター", + "porygon": "ポリゴン", + "omanyte": "オムナイト", + "omastar": "オムスター", + "kabuto": "カブト", + "kabutops": "カブトプス", + "aerodactyl": "プテラ", + "snorlax": "カビゴン", + "articuno": "フリーザー", + "zapdos": "サンダー", + "moltres": "ファイヤー", + "dratini": "ミニリュウ", + "dragonair": "ハクリュー", + "dragonite": "カイリュー", + "mewtwo": "ミュウツー", + "mew": "ミュウ", + "chikorita": "チコリータ", + "bayleef": "ベイリーフ", + "meganium": "メガニウム", + "cyndaquil": "ヒノアラシ", + "quilava": "マグマラシ", + "typhlosion": "バクフーン", + "totodile": "ワニノコ", + "croconaw": "アリゲイツ", + "feraligatr": "オーダイル", + "sentret": "オタチ", + "furret": "オオタチ", + "hoothoot": "ホーホー", + "noctowl": "ヨルノズク", + "ledyba": "レディバ", + "ledian": "レディアン", + "spinarak": "イトマル", + "ariados": "アリアドス", + "crobat": "クロバット", + "chinchou": "チョンチー", + "lanturn": "ランターン", + "pichu": "ピチュー", + "cleffa": "ピィ", + "igglybuff": "ププリン", + "togepi": "トゲピー", + "togetic": "トゲチック", + "natu": "ネイティ", + "xatu": "ネイティオ", + "mareep": "メリープ", + "flaaffy": "モココ", + "ampharos": "デンリュウ", + "bellossom": "キレイハナ", + "marill": "マリル", + "azumarill": "マリルリ", + "sudowoodo": "ウソッキー", + "politoed": "ニョロトノ", + "hoppip": "ハネッコ", + "skiploom": "ポポッコ", + "jumpluff": "ワタッコ", + "aipom": "エイパム", + "sunkern": "ヒマナッツ", + "sunflora": "キマワリ", + "yanma": "ヤンヤンマ", + "wooper": "ウパー", + "quagsire": "ヌオー", + "espeon": "エーフィ", + "umbreon": "ブラッキー", + "murkrow": "ヤミカラス", + "slowking": "ヤドキング", + "misdreavus": "ムウマ", + "unown": "アンノーン", + "wobbuffet": "ソーナンス", + "girafarig": "キリンリキ", + "pineco": "クヌギダマ", + "forretress": "フォレトス", + "dunsparce": "ノコッチ", + "gligar": "グライガー", + "steelix": "ハガネール", + "snubbull": "ブルー", + "granbull": "グランブル", + "qwilfish": "ハリーセン", + "scizor": "ハッサム", + "shuckle": "ツボツボ", + "heracross": "ヘラクロス", + "sneasel": "ニューラ", + "teddiursa": "ヒメグマ", + "ursaring": "リングマ", + "slugma": "マグマッグ", + "magcargo": "マグカルゴ", + "swinub": "ウリムー", + "piloswine": "イノムー", + "corsola": "サニーゴ", + "remoraid": "テッポウオ", + "octillery": "オクタン", + "delibird": "デリバード", + "mantine": "マンタイン", + "skarmory": "エアームド", + "houndour": "デルビル", + "houndoom": "ヘルガー", + "kingdra": "キングドラ", + "phanpy": "ゴマゾウ", + "donphan": "ドンファン", + "porygon2": "ポリゴン2", + "stantler": "オドシシ", + "smeargle": "ドーブル", + "tyrogue": "バルキー", + "hitmontop": "カポエラー", + "smoochum": "ムチュール", + "elekid": "エレキッド", + "magby": "ブビィ", + "miltank": "ミルタンク", + "blissey": "ハピナス", + "raikou": "ライコウ", + "entei": "エンテイ", + "suicune": "スイクン", + "larvitar": "ヨーギラス", + "pupitar": "サナギラス", + "tyranitar": "バンギラス", + "lugia": "ルギア", + "ho_oh": "ホウオウ", + "celebi": "セレビィ", + "treecko": "キモリ", + "grovyle": "ジュプトル", + "sceptile": "ジュカイン", + "torchic": "アチャモ", + "combusken": "ワカシャモ", + "blaziken": "バシャーモ", + "mudkip": "ミズゴロウ", + "marshtomp": "ヌマクロー", + "swampert": "ラグラージ", + "poochyena": "ポチエナ", + "mightyena": "グラエナ", + "zigzagoon": "ジグザグマ", + "linoone": "マッスグマ", + "wurmple": "ケムッソ", + "silcoon": "カラサリス", + "beautifly": "アゲハント", + "cascoon": "マユルド", + "dustox": "ドクケイル", + "lotad": "ハスボー", + "lombre": "ハスブレロ", + "ludicolo": "ルンパッパ", + "seedot": "タネボー", + "nuzleaf": "コノハナ", + "shiftry": "ダーテング", + "taillow": "スバメ", + "swellow": "オオスバメ", + "wingull": "キャモメ", + "pelipper": "ペリッパー", + "ralts": "ラルトス", + "kirlia": "キルリア", + "gardevoir": "サーナイト", + "surskit": "アメタマ", + "masquerain": "アメモース", + "shroomish": "キノココ", + "breloom": "キノガッサ", + "slakoth": "ナマケロ", + "vigoroth": "ヤルキモノ", + "slaking": "ケッキング", + "nincada": "ツチニン", + "ninjask": "テッカニン", + "shedinja": "ヌケニン", + "whismur": "ゴニョニョ", + "loudred": "ドゴーム", + "exploud": "バクオング", + "makuhita": "マクノシタ", + "hariyama": "ハリテヤマ", + "azurill": "ルリリ", + "nosepass": "ノズパス", + "skitty": "エネコ", + "delcatty": "エネコロロ", + "sableye": "ヤミラミ", + "mawile": "クチート", + "aron": "ココドラ", + "lairon": "コドラ", + "aggron": "ボスゴドラ", + "meditite": "アサナン", + "medicham": "チャーレム", + "electrike": "ラクライ", + "manectric": "ライボルト", + "plusle": "プラスル", + "minun": "マイナン", + "volbeat": "バルビート", + "illumise": "イルミーゼ", + "roselia": "ロゼリア", + "gulpin": "ゴクリン", + "swalot": "マルノーム", + "carvanha": "キバニア", + "sharpedo": "サメハダー", + "wailmer": "ホエルコ", + "wailord": "ホエルオー", + "numel": "ドンメル", + "camerupt": "バクーダ", + "torkoal": "コータス", + "spoink": "バネブー", + "grumpig": "ブーピッグ", + "spinda": "パッチール", + "trapinch": "ナックラー", + "vibrava": "ビブラーバ", + "flygon": "フライゴン", + "cacnea": "サボネア", + "cacturne": "ノクタス", + "swablu": "チルット", + "altaria": "チルタリス", + "zangoose": "ザングース", + "seviper": "ハブネーク", + "lunatone": "ルナトーン", + "solrock": "ソルロック", + "barboach": "ドジョッチ", + "whiscash": "ナマズン", + "corphish": "ヘイガニ", + "crawdaunt": "シザリガー", + "baltoy": "ヤジロン", + "claydol": "ネンドール", + "lileep": "リリーラ", + "cradily": "ユレイドル", + "anorith": "アノプス", + "armaldo": "アーマルド", + "feebas": "ヒンバス", + "milotic": "ミロカロス", + "castform": "ポワルン", + "kecleon": "カクレオン", + "shuppet": "カゲボウズ", + "banette": "ジュペッタ", + "duskull": "ヨマワル", + "dusclops": "サマヨール", + "tropius": "トロピウス", + "chimecho": "チリーン", + "absol": "アブソル", + "wynaut": "ソーナノ", + "snorunt": "ユキワラシ", + "glalie": "オニゴーリ", + "spheal": "タマザラシ", + "sealeo": "トドグラー", + "walrein": "トドゼルガ", + "clamperl": "パールル", + "huntail": "ハンテール", + "gorebyss": "サクラビス", + "relicanth": "ジーランス", + "luvdisc": "ラブカス", + "bagon": "タツベイ", + "shelgon": "コモルー", + "salamence": "ボーマンダ", + "beldum": "ダンバル", + "metang": "メタング", + "metagross": "メタグロス", + "regirock": "レジロック", + "regice": "レジアイス", + "registeel": "レジスチル", + "latias": "ラティアス", + "latios": "ラティオス", + "kyogre": "カイオーガ", + "groudon": "グラードン", + "rayquaza": "レックウザ", + "jirachi": "ジラーチ", + "deoxys": "デオキシス", + "turtwig": "ナエトル", + "grotle": "ハヤシガメ", + "torterra": "ドダイトス", + "chimchar": "ヒコザル", + "monferno": "モウカザル", + "infernape": "ゴウカザル", + "piplup": "ポッチャマ", + "prinplup": "ポッタイシ", + "empoleon": "エンペルト", + "starly": "ムックル", + "staravia": "ムクバード", + "staraptor": "ムクホーク", + "bidoof": "ビッパ", + "bibarel": "ビーダル", + "kricketot": "コロボーシ", + "kricketune": "コロトック", + "shinx": "コリンク", + "luxio": "ルクシオ", + "luxray": "レントラー", + "budew": "スボミー", + "roserade": "ロズレイド", + "cranidos": "ズガイドス", + "rampardos": "ラムパルド", + "shieldon": "タテトプス", + "bastiodon": "トリデプス", + "burmy": "ミノムッチ", + "wormadam": "ミノマダム", + "mothim": "ガーメイル", + "combee": "ミツハニー", + "vespiquen": "ビークイン", + "pachirisu": "パチリス", + "buizel": "ブイゼル", + "floatzel": "フローゼル", + "cherubi": "チェリンボ", + "cherrim": "チェリム", + "shellos": "カラナクシ", + "gastrodon": "トリトドン", + "ambipom": "エテボース", + "drifloon": "フワンテ", + "drifblim": "フワライド", + "buneary": "ミミロル", + "lopunny": "ミミロップ", + "mismagius": "ムウマージ", + "honchkrow": "ドンカラス", + "glameow": "ニャルマー", + "purugly": "ブニャット", + "chingling": "リーシャン", + "stunky": "スカンプー", + "skuntank": "スカタンク", + "bronzor": "ドーミラー", + "bronzong": "ドータクン", + "bonsly": "ウソハチ", + "mime_jr": "マネネ", + "happiny": "ピンプク", + "chatot": "ペラップ", + "spiritomb": "ミカルゲ", + "gible": "フカマル", + "gabite": "ガバイト", + "garchomp": "ガブリアス", + "munchlax": "ゴンベ", + "riolu": "リオル", + "lucario": "ルカリオ", + "hippopotas": "ヒポポタス", + "hippowdon": "カバルドン", + "skorupi": "スコルピ", + "drapion": "ドラピオン", + "croagunk": "グレッグル", + "toxicroak": "ドクロッグ", + "carnivine": "マスキッパ", + "finneon": "ケイコウオ", + "lumineon": "ネオラント", + "mantyke": "タマンタ", + "snover": "ユキカブリ", + "abomasnow": "ユキノオー", + "weavile": "マニューラ", + "magnezone": "ジバコイル", + "lickilicky": "ベロベルト", + "rhyperior": "ドサイドン", + "tangrowth": "モジャンボ", + "electivire": "エレキブル", + "magmortar": "ブーバーン", + "togekiss": "トゲキッス", + "yanmega": "メガヤンマ", + "leafeon": "リーフィア", + "glaceon": "グレイシア", + "gliscor": "グライオン", + "mamoswine": "マンムー", + "porygon_z": "ポリゴンZ", + "gallade": "エルレイド", + "probopass": "ダイノーズ", + "dusknoir": "ヨノワール", + "froslass": "ユキメノコ", + "rotom": "ロトム", + "uxie": "ユクシー", + "mesprit": "エムリット", + "azelf": "アグノム", + "dialga": "ディアルガ", + "palkia": "パルキア", + "heatran": "ヒードラン", + "regigigas": "レジギガス", + "giratina": "ギラティナ", + "cresselia": "クレセリア", + "phione": "フィオネ", + "manaphy": "マナフィ", + "darkrai": "ダークライ", + "shaymin": "シェイミ", + "arceus": "アルセウス", + "victini": "ビクティニ", + "snivy": "ツタージャ", + "servine": "ジャノビー", + "serperior": "ジャローダ", + "tepig": "ポカブ", + "pignite": "チャオブー", + "emboar": "エンブオー", + "oshawott": "ミジュマル", + "dewott": "フタチマル", + "samurott": "ダイケンキ", + "patrat": "ミネズミ", + "watchog": "ミルホッグ", + "lillipup": "ヨーテリー", + "herdier": "ハーデリア", + "stoutland": "ムーランド", + "purrloin": "チョロネコ", + "liepard": "レパルダス", + "pansage": "ヤナップ", + "simisage": "ヤナッキー", + "pansear": "バオップ", + "simisear": "バオッキー", + "panpour": "ヒヤップ", + "simipour": "ヒヤッキー", + "munna": "ムンナ", + "musharna": "ムシャーナ", + "pidove": "マメパト", + "tranquill": "ハトーボー", + "unfezant": "ケンホロウ", + "blitzle": "シママ", + "zebstrika": "ゼブライカ", + "roggenrola": "ダンゴロ", + "boldore": "ガントル", + "gigalith": "ギガイアス", + "woobat": "コロモリ", + "swoobat": "ココロモリ", + "drilbur": "モグリュー", + "excadrill": "ドリュウズ", + "audino": "タブンネ", + "timburr": "ドッコラー", + "gurdurr": "ドテッコツ", + "conkeldurr": "ローブシン", + "tympole": "オタマロ", + "palpitoad": "ガマガル", + "seismitoad": "ガマゲロゲ", + "throh": "ナゲキ", + "sawk": "ダゲキ", + "sewaddle": "クルミル", + "swadloon": "クルマユ", + "leavanny": "ハハコモリ", + "venipede": "フシデ", + "whirlipede": "ホイーガ", + "scolipede": "ペンドラー", + "cottonee": "モンメン", + "whimsicott": "エルフーン", + "petilil": "チュリネ", + "lilligant": "ドレディア", + "basculin": "バスラオ", + "sandile": "メグロコ", + "krokorok": "ワルビル", + "krookodile": "ワルビアル", + "darumaka": "ダルマッカ", + "darmanitan": "ヒヒダルマ", + "maractus": "マラカッチ", + "dwebble": "イシズマイ", + "crustle": "イワパレス", + "scraggy": "ズルッグ", + "scrafty": "ズルズキン", + "sigilyph": "シンボラー", + "yamask": "デスマス", + "cofagrigus": "デスカーン", + "tirtouga": "プロトーガ", + "carracosta": "アバゴーラ", + "archen": "アーケン", + "archeops": "アーケオス", + "trubbish": "ヤブクロン", + "garbodor": "ダストダス", + "zorua": "ゾロア", + "zoroark": "ゾロアーク", + "minccino": "チラーミィ", + "cinccino": "チラチーノ", + "gothita": "ゴチム", + "gothorita": "ゴチミル", + "gothitelle": "ゴチルゼル", + "solosis": "ユニラン", + "duosion": "ダブラン", + "reuniclus": "ランクルス", + "ducklett": "コアルヒー", + "swanna": "スワンナ", + "vanillite": "バニプッチ", + "vanillish": "バニリッチ", + "vanilluxe": "バイバニラ", + "deerling": "シキジカ", + "sawsbuck": "メブキジカ", + "emolga": "エモンガ", + "karrablast": "カブルモ", + "escavalier": "シュバルゴ", + "foongus": "タマゲタケ", + "amoonguss": "モロバレル", + "frillish": "プルリル", + "jellicent": "ブルンゲル", + "alomomola": "ママンボウ", + "joltik": "バチュル", + "galvantula": "デンチュラ", + "ferroseed": "テッシード", + "ferrothorn": "ナットレイ", + "klink": "ギアル", + "klang": "ギギアル", + "klinklang": "ギギギアル", + "tynamo": "シビシラス", + "eelektrik": "シビビール", + "eelektross": "シビルドン", + "elgyem": "リグレー", + "beheeyem": "オーベム", + "litwick": "ヒトモシ", + "lampent": "ランプラー", + "chandelure": "シャンデラ", + "axew": "キバゴ", + "fraxure": "オノンド", + "haxorus": "オノノクス", + "cubchoo": "クマシュン", + "beartic": "ツンベアー", + "cryogonal": "フリージオ", + "shelmet": "チョボマキ", + "accelgor": "アギルダー", + "stunfisk": "マッギョ", + "mienfoo": "コジョフー", + "mienshao": "コジョンド", + "druddigon": "クリムガン", + "golett": "ゴビット", + "golurk": "ゴルーグ", + "pawniard": "コマタナ", + "bisharp": "キリキザン", + "bouffalant": "バッフロン", + "rufflet": "ワシボン", + "braviary": "ウォーグル", + "vullaby": "バルチャイ", + "mandibuzz": "バルジーナ", + "heatmor": "クイタラン", + "durant": "アイアント", + "deino": "モノズ", + "zweilous": "ジヘッド", + "hydreigon": "サザンドラ", + "larvesta": "メラルバ", + "volcarona": "ウルガモス", + "cobalion": "コバルオン", + "terrakion": "テラキオン", + "virizion": "ビリジオン", + "tornadus": "トルネロス", + "thundurus": "ボルトロス", + "reshiram": "レシラム", + "zekrom": "ゼクロム", + "landorus": "ランドロス", + "kyurem": "キュレム", + "keldeo": "ケルディオ", + "meloetta": "メロエッタ", + "genesect": "ゲノセクト", + "chespin": "ハリマロン", + "quilladin": "ハリボーグ", + "chesnaught": "ブリガロン", + "fennekin": "フォッコ", + "braixen": "テールナー", + "delphox": "マフォクシー", + "froakie": "ケロマツ", + "frogadier": "ゲコガシラ", + "greninja": "ゲッコウガ", + "bunnelby": "ホルビー", + "diggersby": "ホルード", + "fletchling": "ヤヤコマ", + "fletchinder": "ヒノヤコマ", + "talonflame": "ファイアロー", + "scatterbug": "コフキムシ", + "spewpa": "コフーライ", + "vivillon": "ビビヨン", + "litleo": "シシコ", + "pyroar": "カエンジシ", + "flabebe": "フラベベ", + "floette": "フラエッテ", + "florges": "フラージェス", + "skiddo": "メェークル", + "gogoat": "ゴーゴート", + "pancham": "ヤンチャム", + "pangoro": "ゴロンダ", + "furfrou": "トリミアン", + "espurr": "ニャスパー", + "meowstic": "ニャオニクス", + "honedge": "ヒトツキ", + "doublade": "ニダンギル", + "aegislash": "ギルガルド", + "spritzee": "シュシュプ", + "aromatisse": "フレフワン", + "swirlix": "ペロッパフ", + "slurpuff": "ペロリーム", + "inkay": "マーイーカ", + "malamar": "カラマネロ", + "binacle": "カメテテ", + "barbaracle": "ガメノデス", + "skrelp": "クズモー", + "dragalge": "ドラミドロ", + "clauncher": "ウデッポウ", + "clawitzer": "ブロスター", + "helioptile": "エリキテル", + "heliolisk": "エレザード", + "tyrunt": "チゴラス", + "tyrantrum": "ガチゴラス", + "amaura": "アマルス", + "aurorus": "アマルルガ", + "sylveon": "ニンフィア", + "hawlucha": "ルチャブル", + "dedenne": "デデンネ", + "carbink": "メレシー", + "goomy": "ヌメラ", + "sliggoo": "ヌメイル", + "goodra": "ヌメルゴン", + "klefki": "クレッフィ", + "phantump": "ボクレー", + "trevenant": "オーロット", + "pumpkaboo": "バケッチャ", + "gourgeist": "パンプジン", + "bergmite": "カチコール", + "avalugg": "クレベース", + "noibat": "オンバット", + "noivern": "オンバーン", + "xerneas": "ゼルネアス", + "yveltal": "イベルタル", + "zygarde": "ジガルデ", + "diancie": "ディアンシー", + "hoopa": "フーパ", + "volcanion": "ボルケニオン", + "rowlet": "モクロー", + "dartrix": "フクスロー", + "decidueye": "ジュナイパー", + "litten": "ニャビー", + "torracat": "ニャヒート", + "incineroar": "ガオガエン", + "popplio": "アシマリ", + "brionne": "オシャマリ", + "primarina": "アシレーヌ", + "pikipek": "ツツケラ", + "trumbeak": "ケララッパ", + "toucannon": "ドデカバシ", + "yungoos": "ヤングース", + "gumshoos": "デカグース", + "grubbin": "アゴジムシ", + "charjabug": "デンヂムシ", + "vikavolt": "クワガノン", + "crabrawler": "マケンカニ", + "crabominable": "ケケンカニ", + "oricorio": "オドリドリ", + "cutiefly": "アブリー", + "ribombee": "アブリボン", + "rockruff": "イワンコ", + "lycanroc": "ルガルガン", + "wishiwashi": "ヨワシ", + "mareanie": "ヒドイデ", + "toxapex": "ドヒドイデ", + "mudbray": "ドロバンコ", + "mudsdale": "バンバドロ", + "dewpider": "シズクモ", + "araquanid": "オニシズクモ", + "fomantis": "カリキリ", + "lurantis": "ラランテス", + "morelull": "ネマシュ", + "shiinotic": "マシェード", + "salandit": "ヤトウモリ", + "salazzle": "エンニュート", + "stufful": "ヌイコグマ", + "bewear": "キテルグマ", + "bounsweet": "アマカジ", + "steenee": "アママイコ", + "tsareena": "アマージョ", + "comfey": "キュワワー", + "oranguru": "ヤレユータン", + "passimian": "ナゲツケサル", + "wimpod": "コソクムシ", + "golisopod": "グソクムシャ", + "sandygast": "スナバァ", + "palossand": "シロデスナ", + "pyukumuku": "ナマコブシ", + "type_null": "タイプ:ヌル", + "silvally": "シルヴァディ", + "minior": "メテノ", + "komala": "ネッコアラ", + "turtonator": "バクガメス", + "togedemaru": "トゲデマル", + "mimikyu": "ミミッキュ", + "bruxish": "ハギギシリ", + "drampa": "ジジーロン", + "dhelmise": "ダダリン", + "jangmo_o": "ジャラコ", + "hakamo_o": "ジャランゴ", + "kommo_o": "ジャラランガ", + "tapu_koko": "カプ・コケコ", + "tapu_lele": "カプ・テテフ", + "tapu_bulu": "カプ・ブルル", + "tapu_fini": "カプ・レヒレ", + "cosmog": "コスモッグ", + "cosmoem": "コスモウム", + "solgaleo": "ソルガレオ", + "lunala": "ルナアーラ", + "nihilego": "ウツロイド", + "buzzwole": "マッシブーン", + "pheromosa": "フェローチェ", + "xurkitree": "デンジュモク", + "celesteela": "テッカグヤ", + "kartana": "カミツルギ", + "guzzlord": "アクジキング", + "necrozma": "ネクロズマ", + "magearna": "マギアナ", + "marshadow": "マーシャドー", + "poipole": "ベベノム", + "naganadel": "アーゴヨン", + "stakataka": "ツンデツンデ", + "blacephalon": "ズガドーン", + "zeraora": "ゼラオラ", + "meltan": "メルタン", + "melmetal": "メルメタル", + "grookey": "サルノリ", + "thwackey": "バチンキー", + "rillaboom": "ゴリランダー", + "scorbunny": "ヒバニー", + "raboot": "ラビフット", + "cinderace": "エースバーン", + "sobble": "メッソン", + "drizzile": "ジメレオン", + "inteleon": "インテレオン", + "skwovet": "ホシガリス", + "greedent": "ヨクバリス", + "rookidee": "ココガラ", + "corvisquire": "アオガラス", + "corviknight": "アーマーガア", + "blipbug": "サッチムシ", + "dottler": "レドームシ", + "orbeetle": "イオルブ", + "nickit": "クスネ", + "thievul": "フォクスライ", + "gossifleur": "ヒメンカ", + "eldegoss": "ワタシラガ", + "wooloo": "ウールー", + "dubwool": "バイウールー", + "chewtle": "カムカメ", + "drednaw": "カジリガメ", + "yamper": "ワンパチ", + "boltund": "パルスワン", + "rolycoly": "タンドン", + "carkol": "トロッゴン", + "coalossal": "セキタンザン", + "applin": "カジッチュ", + "flapple": "アップリュー", + "appletun": "タルップル", + "silicobra": "スナヘビ", + "sandaconda": "サダイジャ", + "cramorant": "ウッウ", + "arrokuda": "サシカマス", + "barraskewda": "カマスジョー", + "toxel": "エレズン", + "toxtricity": "ストリンダー", + "sizzlipede": "ヤクデ", + "centiskorch": "マルヤクデ", + "clobbopus": "タタッコ", + "grapploct": "オトスパス", + "sinistea": "ヤバチャ", + "polteageist": "ポットデス", + "hatenna": "ミブリム", + "hattrem": "テブリム", + "hatterene": "ブリムオン", + "impidimp": "ベロバー", + "morgrem": "ギモー", + "grimmsnarl": "オーロンゲ", + "obstagoon": "タチフサグマ", + "perrserker": "ニャイキング", + "cursola": "サニゴーン", + "sirfetchd": "ネギガナイト", + "mr_rime": "バリコオル", + "runerigus": "デスバーン", + "milcery": "マホミル", + "alcremie": "マホイップ", + "falinks": "タイレーツ", + "pincurchin": "バチンウニ", + "snom": "ユキハミ", + "frosmoth": "モスノウ", + "stonjourner": "イシヘンジン", + "eiscue": "コオリッポ", + "indeedee": "イエッサン", + "morpeko": "モルペコ", + "cufant": "ゾウドウ", + "copperajah": "ダイオウドウ", + "dracozolt": "パッチラゴン", + "arctozolt": "パッチルドン", + "dracovish": "ウオノラゴン", + "arctovish": "ウオチルドン", + "duraludon": "ジュラルドン", + "dreepy": "ドラメシヤ", + "drakloak": "ドロンチ", + "dragapult": "ドラパルト", + "zacian": "ザシアン", + "zamazenta": "ザマゼンタ", + "eternatus": "ムゲンダイナ", + "kubfu": "ダクマ", + "urshifu": "ウーラオス", + "zarude": "ザルード", + "regieleki": "レジエレキ", + "regidrago": "レジドラゴ", + "glastrier": "ブリザポス", + "spectrier": "レイスポス", + "calyrex": "バドレックス", + "wyrdeer": "アヤシシ", + "kleavor": "バサギリ", + "ursaluna": "ガチグマ", + "basculegion": "イダイトウ", + "sneasler": "オオニューラ", + "overqwil": "ハリーマン", + "enamorus": "ラブトロス", + "sprigatito": "ニャオハ", + "floragato": "ニャローテ", + "meowscarada": "マスカーニャ", + "fuecoco": "ホゲータ", + "crocalor": "アチゲータ", + "skeledirge": "ラウドボーン", + "quaxly": "クワッス", + "quaxwell": "ウェルカモ", + "quaquaval": "ウェーニバル", + "lechonk": "グルトン", + "oinkologne": "パフュートン", + "tarountula": "タマンチュラ", + "spidops": "ワナイダー", + "nymble": "マメバッタ", + "lokix": "エクスレッグ", + "pawmi": "パモ", + "pawmo": "パモット", + "pawmot": "パーモット", + "tandemaus": "ワッカネズミ", + "maushold": "イッカネズミ", + "fidough": "パピモッチ", + "dachsbun": "バウッツェル", + "smoliv": "ミニーブ", + "dolliv": "オリーニョ", + "arboliva": "オリーヴァ", + "squawkabilly": "イキリンコ", + "nacli": "コジオ", + "naclstack": "ジオヅム", + "garganacl": "キョジオーン", + "charcadet": "カルボウ", + "armarouge": "グレンアルマ", + "ceruledge": "ソウブレイズ", + "tadbulb": "ズピカ", + "bellibolt": "ハラバリー", + "wattrel": "カイデン", + "kilowattrel": "タイカイデン", + "maschiff": "オラチフ", + "mabosstiff": "マフィティフ", + "shroodle": "シルシュルー", + "grafaiai": "タギングル", + "bramblin": "アノクサ", + "brambleghast": "アノホラグサ", + "toedscool": "ノノクラゲ", + "toedscruel": "リククラゲ", + "klawf": "ガケガニ", + "capsakid": "カプサイジ", + "scovillain": "スコヴィラン", + "rellor": "シガロコ", + "rabsca": "ベラカス", + "flittle": "ヒラヒナ", + "espathra": "クエスパトラ", + "tinkatink": "カヌチャン", + "tinkatuff": "ナカヌチャン", + "tinkaton": "デカヌチャン", + "wiglett": "ウミディグダ", + "wugtrio": "ウミトリオ", + "bombirdier": "オトシドリ", + "finizen": "ナミイルカ", + "palafin": "イルカマン", + "varoom": "ブロロン", + "revavroom": "ブロロローム", + "cyclizar": "モトトカゲ", + "orthworm": "ミミズズ", + "glimmet": "キラーメ", + "glimmora": "キラフロル", + "greavard": "ボチ", + "houndstone": "ハカドッグ", + "flamigo": "カラミンゴ", + "cetoddle": "アルクジラ", + "cetitan": "ハルクジラ", + "veluza": "ミガルーサ", + "dondozo": "ヘイラッシャ", + "tatsugiri": "シャリタツ", + "annihilape": "コノヨザル", + "clodsire": "ドオー", + "farigiraf": "リキキリン", + "dudunsparce": "ノココッチ", + "kingambit": "ドドゲザン", + "great_tusk": "イダイナキバ", + "scream_tail": "サケブシッポ", + "brute_bonnet": "アラブルタケ", + "flutter_mane": "ハバタクカミ", + "slither_wing": "チヲハウハネ", + "sandy_shocks": "スナノケガワ", + "iron_treads": "テツノワダチ", + "iron_bundle": "テツノツツミ", + "iron_hands": "テツノカイナ", + "iron_jugulis": "テツノコウベ", + "iron_moth": "テツノドクガ", + "iron_thorns": "テツノイバラ", + "frigibax": "セビエ", + "arctibax": "セゴール", + "baxcalibur": "セグレイブ", + "gimmighoul": "コレクレー", + "gholdengo": "サーフゴー", + "wo_chien": "チオンジェン", + "chien_pao": "パオジアン", + "ting_lu": "ディンルー", + "chi_yu": "イーユイ", + "roaring_moon": "トドロクツキ", + "iron_valiant": "テツノブジン", + "koraidon": "コライドン", + "miraidon": "ミライドン", + "walking_wake": "ウネルミナモ", + "iron_leaves": "テツノイサハ ", + "dipplin": "カミッチュ", + "poltchageist": "チャデス", + "sinistcha": "ヤバソチャ", + "okidogi": "イイネイヌ", + "munkidori": "マシマシラ", + "fezandipiti": "キチキギス", + "ogerpon": "オーガポン", + "archaludon": "ブリジュラス", + "hydrapple": "カミツオロチ", + "gouging_fire": "ウガツホムラ", + "raging_bolt": "タケルライコ", + "iron_boulder": "テツノイワオ", + "iron_crown": "テツノカシラ", + "terapagos": "テラパゴス", + "pecharunt": "モモワロウ", + "alola_rattata": "コラッタ", + "alola_raticate": "ラッタ", + "alola_raichu": "ライチュウ", + "alola_sandshrew": "サンド", + "alola_sandslash": "サンドパン", + "alola_vulpix": "ロコン", + "alola_ninetales": "キュウコン", + "alola_diglett": "ディグダ", + "alola_dugtrio": "ダグトリオ", + "alola_meowth": "ニャース", + "alola_persian": "ペルシアン", + "alola_geodude": "イシツブテ", + "alola_graveler": "ゴローン", + "alola_golem": "ゴローニャ", + "alola_grimer": "ベトベター", + "alola_muk": "ベトベトン", + "alola_exeggutor": "ナッシー", + "alola_marowak": "ガラガラ", + "eternal_floette": "フラエッテ", + "galar_meowth": "ニャース", + "galar_ponyta": "ポニータ", + "galar_rapidash": "ギャロップ", + "galar_slowpoke": "ヤドン", + "galar_slowbro": "ヤドラン", + "galar_farfetchd": "カモネギ", + "galar_weezing": "マタドガス", + "galar_mr_mime": "バリヤード", + "galar_articuno": "フリーザー", + "galar_zapdos": "サンダー", + "galar_moltres": "ファイヤー", + "galar_slowking": "ヤドキング", + "galar_corsola": "サニーゴ", + "galar_zigzagoon": "ジグザグマ", + "galar_linoone": "マッスグマ", + "galar_darumaka": "ダルマッカ", + "galar_darmanitan": "ヒヒダルマ", + "galar_yamask": "デスマス", + "galar_stunfisk": "マッギョ", + "hisui_growlithe": "ガーディ", + "hisui_arcanine": "ウインディ", + "hisui_voltorb": "ビリリダマ", + "hisui_electrode": "マルマイン", + "hisui_typhlosion": "バクフーン", + "hisui_qwilfish": "ハリーセン", + "hisui_sneasel": "ニューラ", + "hisui_samurott": "ダイケンキ", + "hisui_lilligant": "ドレディア", + "hisui_zorua": "ゾロア", + "hisui_zoroark": "ゾロアーク", + "hisui_braviary": "ウォーグル", + "hisui_sliggoo": "ヌメイル", + "hisui_goodra": "ヌメルゴン", + "hisui_avalugg": "クレベース", + "hisui_decidueye": "ジュナイパー", + "paldea_tauros": "ケンタロス", + "paldea_wooper": "ウパー", + "bloodmoon_ursaluna": "ガチグマ" +} diff --git a/src/locales/ja/run-history.json b/src/locales/ja/run-history.json new file mode 100644 index 00000000000..3bf9de32c68 --- /dev/null +++ b/src/locales/ja/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "勝利!", + "defeatedWild": "倒された相手:", + "defeatedTrainer": "倒された相手:", + "defeatedTrainerDouble": "倒された相手:", + "defeatedRival": "倒された相手:", + "defeated": "敗北", + "defeatedWild_female": "倒された相手:", + "defeatedTrainer_female": "倒された相手:", + "defeatedTrainerDouble_female": "倒された相手:", + "defeatedRival_female": "倒された相手:", + "defeated_female": "敗北", + "luck": "運", + "score": "スコア", + "mode": "モード", + "challengeRules": "チャレンジ", + "challengeMonoGen1": "I世代", + "challengeMonoGen2": "II世代", + "challengeMonoGen3": "III世代", + "challengeMonoGen4": "IV世代", + "challengeMonoGen5": "V世代", + "challengeMonoGen6": "VI世代", + "challengeMonoGen7": "VII世代", + "challengeMonoGen8": "VIII世代", + "challengeMonoGen9": "IX世代", + "playerItems": "プレイヤーアイテム", + "personalBest": "自己ベスト!", + "SPDshortened": "速さ", + "runInfo": "ラン情報", + "money": "お金", + "runLength": "時間", + "viewHeldItems": "持たせたアイテム", + "hallofFameText": "殿堂入り おめでとう!", + "hallofFameText_female": "殿堂入り おめでとう!", + "viewHallOfFame": "殿堂登録を見る!", + "viewEndingSplash": "クリア後のアートを見る!" +} diff --git a/src/locales/ja/save-slot-select-ui-handler.json b/src/locales/ja/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..73250a08f4b --- /dev/null +++ b/src/locales/ja/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "選択した スロットに データを 上書きします?", + "loading": "読込中…", + "wave": "ラウンド", + "lv": "Lv", + "empty": "なし" +} diff --git a/src/locales/ja/settings.json b/src/locales/ja/settings.json new file mode 100644 index 00000000000..55d39ee70a4 --- /dev/null +++ b/src/locales/ja/settings.json @@ -0,0 +1,107 @@ +{ + "boy": "男の子", + "girl": "女の子", + "general": "全般", + "display": "ディスプレイ", + "audio": "音声", + "gamepad": "コントローラー", + "keyboard": "キーボード", + "gameSpeed": "ゲームの速さ", + "hpBarSpeed": "HPバー増減の速さ", + "expGainsSpeed": "経験値バー増加の速さ", + "expPartyDisplay": "手持ちの経験値取得表示", + "skipSeenDialogues": "もう見た話をスキップ", + "battleStyle": "試合のルール", + "enableRetries": "再挑戦を有効にする", + "hideIvs": "個体値スキャナーを隠す", + "tutorials": "チュートリアル", + "touchControls": "タッチ操作", + "vibrations": "振動", + "normal": "普通", + "fast": "早い", + "faster": "とても早い", + "skip": "スキップ", + "levelUpNotifications": "レベルアップ時のみ", + "on": "オン", + "off": "オフ", + "switch": "入れ替え", + "set": "勝ち抜き", + "auto": "自動", + "disabled": "無効", + "language": "言語", + "change": "変更", + "uiTheme": "UIテーマ", + "default": "デフォルト", + "legacy": "レガシー", + "windowType": "ウィンドウタイプ", + "moneyFormat": "お金の表示形式", + "damageNumbers": "ダメージ表示", + "simple": "シンプル", + "fancy": "オシャレ", + "abbreviated": "省略", + "moveAnimations": "戦闘アニメーション", + "showStatsOnLevelUp": "レベルアップ時のステータス表示", + "candyUpgradeNotification": "飴アプグレ通知", + "passivesOnly": "パッシブのみ", + "candyUpgradeDisplay": "飴アプグレ表示", + "icon": "アイコン", + "animation": "アニメーション", + "moveInfo": "技情報", + "showMovesetFlyout": "技情報表示", + "showArenaFlyout": "戦場情報表示", + "showTimeOfDayWidget": "時刻指標", + "timeOfDayAnimation": "時刻指標アニメーション", + "bounce": "跳ねる", + "timeOfDay_back": "跳ね返る", + "spriteSet": "スプライト設定", + "consistent": "一貫", + "mixedAnimated": "アニメーションミックス", + "fusionPaletteSwaps": "吸収合体ポケモンの色違い", + "playerGender": "プレイヤーの性別", + "typeHints": "タイプ相性ヒント", + "masterVolume": "マスターボリューム", + "bgmVolume": "BGMボリューム", + "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": "提出", + "buttonCancel": "キャンセル", + "buttonStats": "能力変化表示", + "buttonCycleForm": "フォルム変更", + "buttonCycleShiny": "色違い変更", + "buttonCycleGender": "性別変更", + "buttonCycleAbility": "特性変更", + "buttonCycleNature": "性格変更", + "buttonCycleVariant": "色変更", + "buttonSpeedUp": "速さを上げる", + "buttonSlowDown": "速さを下げる", + "alt": "(代替)", + "mute": "ミュート", + "controller": "コントローラー", + "gamepadSupport": "コントローラーサポート", + "showBgmBar": "BGMの名前を表示", + "moveTouchControls": "タッチ移動操作", + "shopOverlayOpacity": "ショップオーバレイ不透明度", + "shopCursorTarget": "ショップカーソル初位置", + "rewards": "ご褒美", + "reroll": "選択肢変更", + "shop": "ショップ", + "checkTeam": "手持ちを確認" +} diff --git a/src/locales/ja/splash-messages.json b/src/locales/ja/splash-messages.json new file mode 100644 index 00000000000..b7378e7a916 --- /dev/null +++ b/src/locales/ja/splash-messages.json @@ -0,0 +1,36 @@ +{ + "battlesWon": "Battles Won!", + "joinTheDiscord": "Join the Discord!", + "infiniteLevels": "Infinite Levels!", + "everythingStacks": "Everything Stacks!", + "optionalSaveScumming": "Optional Save Scumming!", + "biomes": "35 Biomes!", + "openSource": "Open Source!", + "playWithSpeed": "Play with 5x Speed!", + "liveBugTesting": "Live Bug Testing!", + "heavyInfluence": "Heavy RoR2 Influence!", + "pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!", + "nowWithMoreSalt": "Now with 33% More Salt!", + "infiniteFusionAtHome": "Infinite Fusion at Home!", + "brokenEggMoves": "Broken Egg Moves!", + "magnificent": "Magnificent!", + "mubstitute": "Mubstitute!", + "thatsCrazy": "That's Crazy!", + "oranceJuice": "Orance Juice!", + "questionableBalancing": "Questionable Balancing!", + "coolShaders": "Cool Shaders!", + "aiFree": "AI-Free!", + "suddenDifficultySpikes": "Sudden Difficulty Spikes!", + "basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!", + "moreAddictiveThanIntended": "More Addictive than Intended!", + "mostlyConsistentSeeds": "Mostly Consistent Seeds!", + "achievementPointsDontDoAnything": "Achievement Points Don't Do Anything!", + "youDoNotStartAtLevel": "You Do Not Start at Level 2000!", + "dontTalkAboutTheManaphyEggIncident": "Don't Talk About the Manaphy Egg Incident!", + "alsoTryPokengine": "Also Try Pokéngine!", + "alsoTryEmeraldRogue": "Also Try Emerald Rogue!", + "alsoTryRadicalRed": "Also Try Radical Red!", + "eeveeExpo": "Eevee Expo!", + "ynoproject": "YNOproject!", + "breedersInSpace": "Breeders in space!" +} diff --git a/src/locales/ja/starter-select-ui-handler.json b/src/locales/ja/starter-select-ui-handler.json new file mode 100644 index 00000000000..cab5c500df6 --- /dev/null +++ b/src/locales/ja/starter-select-ui-handler.json @@ -0,0 +1,45 @@ +{ + "confirmStartTeam": "この手持ちで 始めますか?", + "confirmExit": "終了しますか?", + "invalidParty": "手持ちは チャレンジの 条件で 認められない!", + "gen1": "1世代", + "gen2": "2世代", + "gen3": "3世代", + "gen4": "4世代", + "gen5": "5世代", + "gen6": "6世代", + "gen7": "7世代", + "gen8": "8世代", + "gen9": "9世代", + "growthRate": "経験値タイプ:", + "ability": "特性:", + "passive": "パッシブ:", + "nature": "性格:", + "eggMoves": "タマゴ技", + "addToParty": "手持ちに入れる", + "removeFromParty": "手持ちから除く", + "toggleIVs": "個体値を表示", + "manageMoves": "技を並び替える", + "manageNature": "性格を変える", + "addToFavorites": "お気に入りにする", + "removeFromFavorites": "お気に入りから除く", + "useCandies": "飴を使う", + "selectNature": "性格を選んでください。", + "selectMoveSwapOut": "入れ替えたい技を選んでください。", + "selectMoveSwapWith": "他の技と交換してください。", + "unlockPassive": "パッシブを開放", + "reduceCost": "ポイントを減らす", + "sameSpeciesEgg": "タマゴを買う", + "cycleShiny": ": 色違い変更", + "cycleForm": ": フォルム変更", + "cycleGender": ": 性別変更", + "cycleAbility": ": 特性変更", + "cycleNature": ": 性格変更", + "cycleVariant": ": 色変更", + "goFilter": ": フィルタ へ ", + "enablePassive": "パッシブ - オン", + "disablePassive": "パッシブ - オフ", + "locked": "非開放", + "disabled": "無効", + "uncaught": "捕まっていない" +} diff --git a/src/locales/ja/status-effect.json b/src/locales/ja/status-effect.json new file mode 100644 index 00000000000..8dafbbdcba7 --- /dev/null +++ b/src/locales/ja/status-effect.json @@ -0,0 +1,65 @@ +{ + "none": { + "name": "なし", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + }, + "poison": { + "name": "どく", + "description": "どく", + "obtain": "{{pokemonNameWithAffix}}は\n毒を あびた!", + "obtainSource": "{{pokemonNameWithAffix}}は\n{{sourceText}}で 毒を あびた!", + "activation": "{{pokemonNameWithAffix}}は\n毒の ダメージを 受けた!", + "overlap": "{{pokemonNameWithAffix}}は すでに\n毒を あびている", + "heal": "{{pokemonNameWithAffix}}の 毒は\nきれいさっぱり なくなった!" + }, + "toxic": { + "name": "もうどく", + "description": "もうどく", + "obtain": "{{pokemonNameWithAffix}}は\n猛毒を あびた!", + "obtainSource": "{{pokemonNameWithAffix}}は\n{{sourceText}}で 猛毒を あびた!", + "activation": "{{pokemonNameWithAffix}}は\n毒の ダメージを受けた!", + "overlap": "{{pokemonNameWithAffix}}は すでに\n毒を あびている", + "heal": "{{pokemonNameWithAffix}}の 毒は\nきれいさっぱり なくなった!" + }, + "paralysis": { + "name": "まひ", + "description": "まひ", + "obtain": "{{pokemonNameWithAffix}}は まひして\n技が でにくくなった!", + "obtainSource": "{{pokemonNameWithAffix}}は {{sourceText}}で まひして\n技が でにくくなった!", + "activation": "{{pokemonNameWithAffix}}は\n体が しびれて 動けない!", + "overlap": "{{pokemonNameWithAffix}}は\nすでに まひしている", + "heal": "{{pokemonNameWithAffix}}の\nしびれが とれた!" + }, + "sleep": { + "name": "ねむり", + "description": "ねむり", + "obtain": "{{pokemonNameWithAffix}}は\n眠ってしまった!", + "obtainSource": "{{pokemonNameWithAffix}}は\n{{sourceText}}で 眠ってしまった!", + "activation": "{{pokemonNameWithAffix}}は\nぐうぐう 眠っている", + "overlap": "{{pokemonNameWithAffix}}は\nすでに 眠っている", + "heal": "{{pokemonNameWithAffix}}は\n目を 覚ました!" + }, + "freeze": { + "name": "こおり", + "description": "こおり", + "obtain": "{{pokemonNameWithAffix}}は\n凍りついた!", + "obtainSource": "{{pokemonNameWithAffix}}は\n{{sourceText}}で 凍りついた!", + "activation": "{{pokemonNameWithAffix}}は\n凍ってしまって 動けない!", + "overlap": "{{pokemonNameWithAffix}}は\nすでに 凍っている", + "heal": "{{pokemonNameWithAffix}}は\nこおり状態が 治った!" + }, + "burn": { + "name": "やけど", + "description": "やけど", + "obtain": "{{pokemonNameWithAffix}}は\nやけどを 負った!", + "obtainSource": "{{pokemonNameWithAffix}}は\n{{sourceText}}で やけどを 負った!", + "activation": "{{pokemonNameWithAffix}}は\nやけどの ダメージを 受けた!", + "overlap": "{{pokemonNameWithAffix}}は すでに\nやけどを 負っている", + "heal": "{{pokemonNameWithAffix}}の\nやけどが 治った!" + } +} \ No newline at end of file diff --git a/src/locales/ja/terrain.json b/src/locales/ja/terrain.json new file mode 100644 index 00000000000..1e0fc60fc62 --- /dev/null +++ b/src/locales/ja/terrain.json @@ -0,0 +1,16 @@ +{ + "misty": "ミストフィールド", + "mistyStartMessage": "足下に 霧(きり)が立ち込めた!", + "mistyClearMessage": "足下の 霧(きり)が消え去った!", + "mistyBlockMessage": "{{pokemonNameWithAffix}}は\nミストフィールドに 守られている!", + "electric": "エレキフィールド", + "electricStartMessage": "足下に 電気が かけめぐる!", + "electricClearMessage": "足下の 電気が 消え去った!", + "grassy": "グラスフィールド", + "grassyStartMessage": "足下に 草がおいしげった!", + "grassyClearMessage": "足下の 草が消え去った!", + "psychic": "サイコフィールド", + "psychicStartMessage": "足元が 不思議な感じに なった!", + "psychicClearMessage": "足元の 不思議感が 消え去った!", + "defaultBlockMessage": "{{pokemonNameWithAffix}}は\n{{terrainName}}に 守られている!" +} \ No newline at end of file diff --git a/src/locales/ja/trainer-classes.json b/src/locales/ja/trainer-classes.json new file mode 100644 index 00000000000..aba294fbbbd --- /dev/null +++ b/src/locales/ja/trainer-classes.json @@ -0,0 +1,130 @@ +{ + "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 new file mode 100644 index 00000000000..70841734b5b --- /dev/null +++ b/src/locales/ja/trainer-names.json @@ -0,0 +1,164 @@ +{ + "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 new file mode 100644 index 00000000000..b3829c701e5 --- /dev/null +++ b/src/locales/ja/trainer-titles.json @@ -0,0 +1,38 @@ +{ + "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/ja/tutorial.json b/src/locales/ja/tutorial.json new file mode 100644 index 00000000000..21b1b4856c8 --- /dev/null +++ b/src/locales/ja/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "PokéRogueへようこそ!ログライク要素が\n加わったバトル中心のポケモンファンゲームです。\n$このゲームは収益を上げず、Pokémonおよび使用される\n著作権資産に対する所有権を主張しません。\n$ゲームはまだ作業中ですが、完全にプレイすることができます。\nバグ報告はディスコードコミュニティをご利用ください。\n$ゲームが遅い場合は、ブラウザ設定で「ハードウェア\nアクセラレーション」がオンになっていることを確認してください", + "accessMenu": "メニューにアクセスするには、入力待ちの間にMキーまたはEscを押してください。\nメニューには設定やさまざまな機能が含まれています。", + "menu": "このメニューから設定にアクセスできます。\n$設定ではゲームスピード、ウィンドウスタイル、\nおよびその他のオプションを変更できます。\n$ここにはさまざまな他の機能もありますので、\nぜひ確認してみてください!", + "starterSelect": "この画面でZキーやSpaceを押してポケモンを選択できます。\n選んだポケモンは自分の最初のパーティーになります。\n$最大6匹のパーティーで始めることができますが\nポケモンによってポイントがあり、合計10を超えてはなりません。\n$捕まえたりふかさせたりすることで\n選択できる性別、特性、フォルムなどの幅を広げることができます。\n$個体値も徐々に累積して高くなるので、\n同じポケモンをたくさん捕まえてみてください!", + "pokerus": "毎日ランダムでスターターの\n3種類に紫色の枠が表示されます。\n$登録されたスターターの中にあれば、\nパーティに追加してつよさを確認してみましょう!", + "statChange": "ポケモンは交代しない限り、\n次のバトルでも能力変化が維持されます。\n$その代わりに、トレーナーバトルや新しいバイオームに\n入る直前に自動的にリセットされます。\n$CキーまたはShiftキーを押し続けると、\n現在のポケモンの能力変化を確認できます。\n$Vキーを押すと、\n相手が使用した技も確認できます。\n$ただし、今のバトルで相手ポケモンがすでに\n使った技のみが表示されます。", + "selectItem": "バトルが終わるたびに、\nランダムなアイテム3つの中から1つを選んで獲得します。\n$種類は消耗品、ポケモンの持ち物、\n永続的なパッシブアイテムなど様々です。\n$ほとんどの消耗しない道具は\n効果が累積されます。\n$進化用など一部のアイテムは\n使用できる場合にのみ登場します。\n$持ち物を渡す機能を使用して\nポケモン同士で道具を持たせることもできます。\n$持ち物があれば、アイテム選択画面の\n右下に渡す機能が表示されます。\n$お金で消耗品を購入することもでき、\nウェーブが進むにつれて購入可能な種類が増えます。\n$アイテムを選択すると次のウェーブに進むため、\nまず消耗品の購入を行ってください。", + "eggGacha": "この画面でポケモンのたまごクーポンを\nガチャができます。\n$卵は戦闘を繰り返すうちにふかします。\n珍しいほどもっと長くかかります。\n$ふかさせたポケモンはパーティーに追加されず、\nスターティングに登録されます。\n$卵からふかしたポケモンは一般的に\n野生で捕まえたポケモンよりも高い個体値を持ちます。\n$一部のポケモンは卵からしか手に入りません。\n$各ガチャマシンがそれぞれ異なるボーナスを持っているため、\n好きな方を使ってみてください!," +} \ No newline at end of file diff --git a/src/locales/ja/voucher.json b/src/locales/ja/voucher.json new file mode 100644 index 00000000000..eabe384bc98 --- /dev/null +++ b/src/locales/ja/voucher.json @@ -0,0 +1,9 @@ +{ + "vouchers": "クーポン", + "eggVoucher": "タマゴクーポン", + "eggVoucherPlus": "タマゴクーポン・プラス", + "eggVoucherPremium": "タマゴクーポン・プレミアム", + "eggVoucherGold": "タマゴクーポン・ゴールド", + "locked": "なし", + "defeatTrainer": "{{trainerName}}を 倒す" +} \ No newline at end of file diff --git a/src/locales/ja/weather.json b/src/locales/ja/weather.json new file mode 100644 index 00000000000..e2d3c6c4e32 --- /dev/null +++ b/src/locales/ja/weather.json @@ -0,0 +1,32 @@ +{ + "sunnyStartMessage": "日差しが 強くなった!", + "sunnyLapseMessage": "日差しが 強い!", + "sunnyClearMessage": "日差しが 元に戻った!", + "rainStartMessage": "雨が 降り始めた!", + "rainLapseMessage": "雨が 降っている!", + "rainClearMessage": "雨が あがった!", + "sandstormStartMessage": "砂あらしが 吹き始めた!", + "sandstormLapseMessage": "砂あらしが 吹きあれる!", + "sandstormClearMessage": "砂あらしが おさまった!", + "sandstormDamageMessage": "砂あらしが\n{{pokemonNameWithAffix}}を 襲う!", + "hailStartMessage": "あられが 降り始めた!", + "hailLapseMessage": "あられが 降っている!", + "hailClearMessage": "あられが 止んだ!", + "hailDamageMessage": "あられが\n{{pokemonNameWithAffix}}を 襲う!", + "snowStartMessage": "雪が 降り始めた!", + "snowLapseMessage": "雪が 降っている!", + "snowClearMessage": "雪が 止んだ!", + "fogStartMessage": "足下に 霧が 立ち込めた!", + "fogLapseMessage": "足下に 霧が 立ち込めている!", + "fogClearMessage": "足下の 霧が 消え去った!", + "heavyRainStartMessage": "強い雨が 降り始めた!", + "heavyRainLapseMessage": "強い雨が 降っている!", + "heavyRainClearMessage": "強い雨が あがった!", + "harshSunStartMessage": "日差しが とても強くなった!", + "harshSunLapseMessage": "日差しが とても強い!", + "harshSunClearMessage": "日差しが 元に戻った!", + "strongWindsStartMessage": "謎の 乱気流が\nひこうポケモンを 護る!", + "strongWindsLapseMessage": "謎の 乱気流の 勢いは 止まらない!", + "strongWindsEffectMessage": "謎の 乱気流が 攻撃を 弱めた!", + "strongWindsClearMessage": "謎の 乱気流が おさまった!" +} diff --git a/src/locales/ko/ability-trigger.json b/src/locales/ko/ability-trigger.json new file mode 100644 index 00000000000..b1f100c5c36 --- /dev/null +++ b/src/locales/ko/ability-trigger.json @@ -0,0 +1,64 @@ +{ + "blockRecoilDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", + "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", + "costar": "{{pokemonName}}[[는]] {{allyName}}의\n능력 변화를 복사했다!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", + "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", + "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", + "trace": "{{pokemonName}}[[는]] 상대 {{targetName}}의 \n{{abilityName}}[[를]] 트레이스했다!", + "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", + "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", + "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}의 정체가 드러났다!", + "blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!", + "fullHpResistType": "{{pokemonNameWithAffix}}[[는]] 등껍질을 빛나게 하여\n타입 상성을 왜곡시켰다!!", + "moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...", + "reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!", + "postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n상대를 상처입혔다!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}}[[는]]\n서로의 특성을 교체했다!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}}[[는]]\n특성이 {{abilityName}}[[가]] 되어 버렸다!", + "postDefendMoveDisable": "{{pokemonNameWithAffix}}의\n{{moveName}}[[를]] 봉인했다!", + "pokemonTypeChange": "{{pokemonNameWithAffix}}[[는]]\n{{moveType}}타입이 됐다!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}}[[는]] {{defenderName}}[[로]]부터\n{{stolenItemType}}[[를]] 빼앗았다!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}}[[는]] {{attackerName}}[[로]]부터\n{{stolenItemType}}[[를]] 빼앗았다!", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}}의\n{{abilityName}}[[를]] 이어받았다!", + "intimidateImmunity": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}의 효과로 능력이 떨어지지 않는다!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}}[[가]] 내온 차를\n{{pokemonName}}[[가]] 모두 비웠다!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}의\n능력 변화가 원래대로 되돌아왔다!", + "postSummonTransform": "{{pokemonNameWithAffix}}[[는]]\n{{targetName}}[[로]] 변신했다!!", + "protectStat": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}의 효과로\n{{statName}}[[가]] 떨어지지 않는다!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n{{statusEffectName}}에 걸리지 않는다!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n상태 이상이 되지 않는다!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n{{battlerTagName}}[[를]] 무시했다!", + "forewarn": "{{pokemonNameWithAffix}}의\n{{moveName}}[[를]] 간파했다!", + "frisk": "{{pokemonNameWithAffix}}[[는]] {{opponentName}}의\n{{opponentAbilityName}}[[를]] 통찰했다!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}에 의한 데미지를 입었다!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}[[는]]\n{{berryName}}[[를]] 수확했다!", + "postTurnHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "fetchBall": "{{pokemonNameWithAffix}}[[는]]\n{{pokeballName}}[[를]] 주워 왔다!", + "healFromBerryUse": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "arenaTrap": "{{pokemonNameWithAffix}}의 {{abilityName}} 때문에\n바꿀 수 없다!", + "postBattleLoot": "{{pokemonNameWithAffix}}[[는]]\n{{itemName}}[[를]] 주웠다!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n상대에게 데미지를 입혔다!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n상대에게 데미지를 입혔다!", + "postSummonPressure": "{{pokemonNameWithAffix}}[[는]]\n프레셔를 발산하고 있다!", + "weatherEffectDisappeared": "날씨의 영향이 없어졌다!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}의\n틀깨기!", + "postSummonAnticipation": "{{pokemonNameWithAffix}}[[는]]\n몸을 떨었다!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}}[[는]]\n활활 타오르는 오라를 발산하고 있다!", + "postSummonTeravolt": "{{pokemonNameWithAffix}}[[는]]\n세차게 튀는 오라를 발산하고 있다!", + "postSummonDarkAura": "{{pokemonNameWithAffix}}[[는]]\n다크오라를 발산하고 있다!", + "postSummonFairyAura": "{{pokemonNameWithAffix}}[[는]]\n페어리오라를 발산하고 있다!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}}[[는]]\n모든 오라를 제압한다!", + "postSummonNeutralizingGas": "주위가 화학변화가스로 가득 찼다!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}의 재앙의그릇에 의해\n주위의 {{statName}}[[가]] 약해졌다!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}의 재앙의검에 의해\n주위의 {{statName}}[[가]] 약해졌다!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}의 재앙의목간에 의해\n주위의 {{statName}}[[가]] 약해졌다!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}의 재앙의구슬에 의해\n주위의 {{statName}}[[가]] 약해졌다!", + "preventBerryUse": "{{pokemonNameWithAffix}}[[는]] 긴장해서\n나무열매를 먹을 수 없게 되었다!" +} diff --git a/src/locales/ko/ability-trigger.ts b/src/locales/ko/ability-trigger.ts deleted file mode 100644 index 58ba7bf9aa6..00000000000 --- a/src/locales/ko/ability-trigger.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", - "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", - "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", - "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", - "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", - "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", - "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", - "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", - "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", -} as const; diff --git a/src/locales/ko/ability.json b/src/locales/ko/ability.json new file mode 100644 index 00000000000..420d27c6011 --- /dev/null +++ b/src/locales/ko/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "악취", + "description": "악취를 풍겨서 공격했을 때 상대가 풀죽을 때가 있다." + }, + "drizzle": { + "name": "잔비", + "description": "등장했을 때 날씨를 비로 만든다." + }, + "speedBoost": { + "name": "가속", + "description": "매 턴 스피드가 올라간다." + }, + "battleArmor": { + "name": "전투무장", + "description": "단단한 껍질에 보호받아 상대의 공격이 급소에 맞지 않는다." + }, + "sturdy": { + "name": "옹골참", + "description": "상대 기술을 받아도 일격으로 쓰러지지 않는다. 일격필살 기술도 효과 없다." + }, + "damp": { + "name": "습기", + "description": "주변을 습하게 함으로써 자폭 등 폭발하는 기술을 아무도 못 쓰게 한다." + }, + "limber": { + "name": "유연", + "description": "유연한 몸으로 인해 마비 상태가 되지 않는다." + }, + "sandVeil": { + "name": "모래숨기", + "description": "모래바람일 때 회피율이 올라간다." + }, + "static": { + "name": "정전기", + "description": "정전기를 몸에 둘러 접촉한 상대를 마비시킬 때가 있다." + }, + "voltAbsorb": { + "name": "축전", + "description": "전기타입의 기술을 받으면 데미지를 받지 않고 회복한다." + }, + "waterAbsorb": { + "name": "저수", + "description": "물타입의 기술을 받으면 데미지를 받지 않고 회복한다." + }, + "oblivious": { + "name": "둔감", + "description": "둔감해서 헤롱헤롱이나 도발 상태가 되지 않는다." + }, + "cloudNine": { + "name": "날씨부정", + "description": "모든 날씨의 영향이 없어진다." + }, + "compoundEyes": { + "name": "복안", + "description": "복안을 가지고 있어 기술의 명중률이 올라간다." + }, + "insomnia": { + "name": "불면", + "description": "잠들지 못하는 체질이라 잠듦 상태가 되지 않는다." + }, + "colorChange": { + "name": "변색", + "description": "상대에게 받은 기술의 타입으로 자신의 타입이 변화한다." + }, + "immunity": { + "name": "면역", + "description": "체내에 면역을 가지고 있어 독 상태가 되지 않는다." + }, + "flashFire": { + "name": "타오르는불꽃", + "description": "불꽃타입의 기술을 받으면 불꽃을 받아서 자신이 사용하는 불꽃타입의 기술이 강해진다." + }, + "shieldDust": { + "name": "인분", + "description": "인분에 보호받아 기술의 추가 효과를 받지 않게 된다." + }, + "ownTempo": { + "name": "마이페이스", + "description": "마이페이스라서 혼란 상태가 되지 않는다." + }, + "suctionCups": { + "name": "흡반", + "description": "흡반으로 지면에 달라붙어 포켓몬을 교체시키는 기술이나 도구의 효과를 발휘하지 못하게 한다." + }, + "intimidate": { + "name": "위협", + "description": "등장했을 때 위협해서 상대를 위축시켜 상대의 공격을 떨어뜨린다." + }, + "shadowTag": { + "name": "그림자밟기", + "description": "상대의 그림자를 밟아 도망치거나 교체할 수 없게 한다." + }, + "roughSkin": { + "name": "까칠한피부", + "description": "공격을 받았을 때 자신에게 접촉한 상대를 까칠까칠한 피부로 상처를 입힌다." + }, + "wonderGuard": { + "name": "불가사의부적", + "description": "효과가 굉장한 기술만 맞는 불가사의한 힘." + }, + "levitate": { + "name": "부유", + "description": "땅에서 뜨는 것으로 땅타입의 기술을 받지 않는다." + }, + "effectSpore": { + "name": "포자", + "description": "공격으로 자신에게 접촉한 상대를 독이나 마비, 잠듦 상태로 만들 때가 있다." + }, + "synchronize": { + "name": "싱크로", + "description": "자신이 걸린 독이나 마비, 화상을 상대에게 옮긴다." + }, + "clearBody": { + "name": "클리어바디", + "description": "상대 기술이나 특성으로 능력이 떨어지지 않는다." + }, + "naturalCure": { + "name": "자연회복", + "description": "지닌 포켓몬으로 돌아오면 상태 이상이 회복된다." + }, + "lightningRod": { + "name": "피뢰침", + "description": "전기타입의 기술을 자신에게 끌어모아 데미지를 받지 않고 특수공격을 올린다." + }, + "sereneGrace": { + "name": "하늘의은총", + "description": "하늘의 은총 덕분에 기술의 추가 효과가 나오기 쉽다." + }, + "swiftSwim": { + "name": "쓱쓱", + "description": "비가 오는 날씨일 때 스피드가 올라간다." + }, + "chlorophyll": { + "name": "엽록소", + "description": "날씨가 맑을 때 스피드가 올라간다." + }, + "illuminate": { + "name": "발광", + "description": "주변을 밝게 하여 명중률이 떨어지지 않는다." + }, + "trace": { + "name": "트레이스", + "description": "등장했을 때 상대의 특성을 트레이스해서 같은 특성이 된다." + }, + "hugePower": { + "name": "천하장사", + "description": "물리공격의 위력이 2배가 된다." + }, + "poisonPoint": { + "name": "독가시", + "description": "자신과 접촉한 상대를 독 상태로 만들 때가 있다." + }, + "innerFocus": { + "name": "정신력", + "description": "단련한 정신으로 인하여 상대의 공격에 풀죽지 않는다." + }, + "magmaArmor": { + "name": "마그마의무장", + "description": "뜨거운 마그마를 몸에 둘러서 얼음 상태가 되지 않는다." + }, + "waterVeil": { + "name": "수의베일", + "description": "물의 베일을 몸에 둘러서 화상 상태가 되지 않는다." + }, + "magnetPull": { + "name": "자력", + "description": "강철타입의 포켓몬을 자력으로 끌어모아 도망칠 수 없게 한다." + }, + "soundproof": { + "name": "방음", + "description": "소리를 차단하는 것으로 소리 공격을 받지 않는다." + }, + "rainDish": { + "name": "젖은접시", + "description": "비가 오는 날씨일 때 조금씩 HP를 회복한다." + }, + "sandStream": { + "name": "모래날림", + "description": "등장했을 때 날씨를 모래바람으로 만든다." + }, + "pressure": { + "name": "프레셔", + "description": "프레셔를 줘서 상대가 쓰는 기술의 PP를 많이 줄인다." + }, + "thickFat": { + "name": "두꺼운지방", + "description": "두꺼운 지방으로 보호되고 있어 불꽃타입과 얼음타입의 기술의 데미지를 반감시킨다." + }, + "earlyBird": { + "name": "일찍기상", + "description": "잠듦 상태가 되어도 2배 스피드로 깨어날 수 있다." + }, + "flameBody": { + "name": "불꽃몸", + "description": "자신과 접촉한 상대를 화상 상태로 만들 때가 있다." + }, + "runAway": { + "name": "도주", + "description": "야생 포켓몬으로부터 반드시 도망칠 수 있다." + }, + "keenEye": { + "name": "날카로운눈", + "description": "날카로운 눈 덕분에 명중률이 떨어지지 않는다." + }, + "hyperCutter": { + "name": "괴력집게", + "description": "힘이 자랑인 집게를 가지고 있어 상대가 공격을 떨어뜨리지 못한다." + }, + "pickup": { + "name": "픽업", + "description": "상대가 지닌 도구를 주워올 때가 있다." + }, + "truant": { + "name": "게으름", + "description": "기술을 사용하면 다음 턴은 쉰다." + }, + "hustle": { + "name": "의욕", + "description": "자신의 공격이 높아지지만 명중률이 떨어진다." + }, + "cuteCharm": { + "name": "헤롱헤롱바디", + "description": "자신과 접촉한 상대를 헤롱헤롱 상태로 만들 때가 있다." + }, + "plus": { + "name": "플러스", + "description": "플러스나 마이너스의 특성을 가진 포켓몬이 동료에 있으면 자신의 특수공격이 올라간다." + }, + "minus": { + "name": "마이너스", + "description": "플러스나 마이너스의 특성을 가진 포켓몬이 동료에 있으면 자신의 특수공격이 올라간다." + }, + "forecast": { + "name": "기분파", + "description": "날씨의 영향을 받아 물타입, 불꽃타입, 얼음타입 중 하나로 변화한다." + }, + "stickyHold": { + "name": "점착", + "description": "점착질의 몸에 도구가 달라붙어 있어 상대에게 도구를 뺏기지 않는다." + }, + "shedSkin": { + "name": "탈피", + "description": "몸의 껍질을 벗어 던져 상태 이상을 회복할 때가 있다." + }, + "guts": { + "name": "근성", + "description": "상태 이상이 되면 근성을 보여서 공격이 올라간다." + }, + "marvelScale": { + "name": "이상한비늘", + "description": "상태 이상이 되면 이상한 비늘이 반응해서 방어가 올라간다." + }, + "liquidOoze": { + "name": "해감액", + "description": "해감액을 흡수한 상대는 강렬한 악취로 데미지를 받아 HP가 줄어든다." + }, + "overgrow": { + "name": "심록", + "description": "HP가 줄었을 때 풀타입 기술의 위력이 올라간다." + }, + "blaze": { + "name": "맹화", + "description": "HP가 줄었을 때 불꽃타입 기술의 위력이 올라간다." + }, + "torrent": { + "name": "급류", + "description": "HP가 줄었을 때 물타입 기술의 위력이 올라간다." + }, + "swarm": { + "name": "벌레의알림", + "description": "HP가 줄었을 때 벌레타입 기술의 위력이 올라간다." + }, + "rockHead": { + "name": "돌머리", + "description": "반동을 받는 기술을 사용해도 HP가 줄지 않는다." + }, + "drought": { + "name": "가뭄", + "description": "등장했을 때 날씨를 맑음으로 만든다." + }, + "arenaTrap": { + "name": "개미지옥", + "description": "배틀에서 상대를 도망칠 수 없게 한다." + }, + "vitalSpirit": { + "name": "의기양양", + "description": "의기양양해져서 잠듦 상태가 되지 않는다." + }, + "whiteSmoke": { + "name": "하얀연기", + "description": "하얀 연기의 보호를 받아 상대가 능력을 떨어뜨릴 수 없다." + }, + "purePower": { + "name": "순수한힘", + "description": "요가의 힘으로 물리공격의 위력이 2배가 된다." + }, + "shellArmor": { + "name": "조가비갑옷", + "description": "단단한 껍질의 보호를 받아 상대의 공격이 급소에 맞지 않는다." + }, + "airLock": { + "name": "에어록", + "description": "모든 날씨의 영향이 없어진다." + }, + "tangledFeet": { + "name": "갈지자걸음", + "description": "혼란 상태일 때는 회피율이 올라간다." + }, + "motorDrive": { + "name": "전기엔진", + "description": "전기타입의 기술을 받으면 데미지를 받지 않고 스피드가 올라간다." + }, + "rivalry": { + "name": "투쟁심", + "description": "성별이 같으면 투쟁심을 불태워 강해진다. 성별이 다르면 약해진다." + }, + "steadfast": { + "name": "불굴의마음", + "description": "풀죽을 때마다 불굴의 마음을 불태워 스피드가 올라간다." + }, + "snowCloak": { + "name": "눈숨기", + "description": "날씨가 눈일 때 회피율이 올라간다." + }, + "gluttony": { + "name": "먹보", + "description": "HP가 줄어들면 먹을 나무열매를 HP가 절반일 때 먹어버린다." + }, + "angerPoint": { + "name": "분노의경혈", + "description": "급소에 공격이 맞으면 크게 분노해 공격력이 최대가 된다." + }, + "unburden": { + "name": "곡예", + "description": "지니던 도구가 없어지면 스피드가 올라간다." + }, + "heatproof": { + "name": "내열", + "description": "내열인 몸으로 인해 불꽃타입 공격의 데미지를 반감한다." + }, + "simple": { + "name": "단순", + "description": "능력 변화가 평소의 2배가 된다." + }, + "drySkin": { + "name": "건조피부", + "description": "비가 오는 날씨나 물타입의 기술로 HP가 회복되고 맑을 때나 불꽃타입의 기술로는 줄어든다." + }, + "download": { + "name": "다운로드", + "description": "상대의 방어와 특수방어를 비교해서 낮은 쪽 능력에 맞춰서 자신의 공격이나 특수공격을 올린다." + }, + "ironFist": { + "name": "철주먹", + "description": "펀치를 사용하는 기술의 위력이 올라간다." + }, + "poisonHeal": { + "name": "포이즌힐", + "description": "독 상태가 되면 HP가 줄지 않고 증가한다." + }, + "adaptability": { + "name": "적응력", + "description": "자신과 같은 타입의 기술 위력이 올라간다." + }, + "skillLink": { + "name": "스킬링크", + "description": "연속 기술을 사용하면 항상 최고 횟수를 사용할 수 있다." + }, + "hydration": { + "name": "촉촉바디", + "description": "비가 오는 날씨일 때 상태 이상이 회복된다." + }, + "solarPower": { + "name": "선파워", + "description": "날씨가 맑으면 특수공격이 올라가지만 매 턴 HP가 줄어든다." + }, + "quickFeet": { + "name": "속보", + "description": "상태 이상이 되면 스피드가 올라간다." + }, + "normalize": { + "name": "노말스킨", + "description": "어떤 타입의 기술도 모두 노말타입이 된다. 위력이 조금 올라간다." + }, + "sniper": { + "name": "스나이퍼", + "description": "공격을 급소에 맞혔을 때 위력이 더욱 올라간다." + }, + "magicGuard": { + "name": "매직가드", + "description": "공격 이외에는 데미지를 입지 않는다." + }, + "noGuard": { + "name": "노가드", + "description": "노가드전법에 따라 서로가 사용하는 기술이 반드시 맞게 된다." + }, + "stall": { + "name": "시간벌기", + "description": "기술을 사용하는 순서가 반드시 마지막이 된다." + }, + "technician": { + "name": "테크니션", + "description": "위력이 약한 기술의 위력을 올려서 공격할 수 있다." + }, + "leafGuard": { + "name": "리프가드", + "description": "날씨가 맑을 때는 상태 이상이 되지 않는다." + }, + "klutz": { + "name": "서투름", + "description": "지니고 있는 도구를 쓸 수 없다." + }, + "moldBreaker": { + "name": "틀깨기", + "description": "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다." + }, + "superLuck": { + "name": "대운", + "description": "대운을 가지고 있어 상대의 급소에 공격이 맞기 쉽다." + }, + "aftermath": { + "name": "유폭", + "description": "기절했을 때 접촉한 상대에게 데미지를 준다." + }, + "anticipation": { + "name": "위험예지", + "description": "상대가 지닌 위험한 기술을 감지할 수 있다." + }, + "forewarn": { + "name": "예지몽", + "description": "등장했을 때 상대가 지닌 기술을 하나만 꿰뚫어본다." + }, + "unaware": { + "name": "천진", + "description": "상대의 능력 변화를 무시하고 공격할 수 있다." + }, + "tintedLens": { + "name": "색안경", + "description": "효과가 별로인 기술을 통상의 위력으로 쓸 수 있다." + }, + "filter": { + "name": "필터", + "description": "효과가 굉장한 공격의 위력을 약하게 만든다." + }, + "slowStart": { + "name": "슬로스타트", + "description": "5턴 동안 공격과 스피드가 절반이 된다." + }, + "scrappy": { + "name": "배짱", + "description": "고스트타입 포켓몬에게 노말타입과 격투타입의 기술을 맞게 한다." + }, + "stormDrain": { + "name": "마중물", + "description": "물타입의 기술을 자신에게 끌어모아 데미지는 받지 않고 특수공격이 올라간다." + }, + "iceBody": { + "name": "아이스바디", + "description": "날씨가 눈일 때 HP를 조금씩 회복한다." + }, + "solidRock": { + "name": "하드록", + "description": "효과가 굉장한 공격의 위력을 약하게 만든다." + }, + "snowWarning": { + "name": "눈퍼뜨리기", + "description": "등장했을 때 날씨를 눈으로 만든다." + }, + "honeyGather": { + "name": "꿀모으기", + "description": "배틀이 끝났을 때 달콤한꿀을 주울 때가 있다. 배틀 후에 꿀을 팔아 돈을 받을 수 있다." + }, + "frisk": { + "name": "통찰", + "description": "등장했을 때 상대의 특성을 통찰할 수 있다." + }, + "reckless": { + "name": "이판사판", + "description": "반동 데미지를 받는 기술의 위력이 올라간다." + }, + "multitype": { + "name": "멀티타입", + "description": "지니고 있는 플레이트나 Z크리스탈 타입에 따라 자신의 타입이 바뀐다." + }, + "flowerGift": { + "name": "플라워기프트", + "description": "날씨가 맑을 때 자신과 같은 편의 공격과 특수방어의 능력이 올라간다." + }, + "badDreams": { + "name": "나이트메어", + "description": "잠듦 상태의 상대에게 데미지를 준다." + }, + "pickpocket": { + "name": "나쁜손버릇", + "description": "접촉한 상대의 도구를 훔친다." + }, + "sheerForce": { + "name": "우격다짐", + "description": "기술의 추가 효과가 없어지지만 그만큼 높은 위력으로 기술을 사용할 수 있다." + }, + "contrary": { + "name": "심술꾸러기", + "description": "능력의 변화가 역전해서 올라갈 때 떨어지고 떨어질 때 올라간다." + }, + "unnerve": { + "name": "긴장감", + "description": "상대를 긴장시켜 나무열매를 먹지 못하게 한다." + }, + "defiant": { + "name": "오기", + "description": "능력이 떨어지면 공격이 크게 올라간다." + }, + "defeatist": { + "name": "무기력", + "description": "HP가 절반이 되면 무기력해져서 공격과 특수공격이 반감된다." + }, + "cursedBody": { + "name": "저주받은바디", + "description": "공격을 받으면 상대의 기술을 사슬묶기 상태로 만들 때가 있다." + }, + "healer": { + "name": "치유의마음", + "description": "같은 편의 상태 이상을 가끔 회복시킨다." + }, + "friendGuard": { + "name": "프렌드가드", + "description": "같은 편의 데미지를 줄일 수 있다." + }, + "weakArmor": { + "name": "깨어진갑옷", + "description": "물리 기술로 데미지를 받으면 방어가 떨어지고 스피드가 크게 올라간다." + }, + "heavyMetal": { + "name": "헤비메탈", + "description": "자신의 무게가 2배가 된다." + }, + "lightMetal": { + "name": "라이트메탈", + "description": "자신의 무게가 절반이 된다." + }, + "multiscale": { + "name": "멀티스케일", + "description": "HP가 꽉 찼을 때 받는 데미지가 줄어든다." + }, + "toxicBoost": { + "name": "독폭주", + "description": "독 상태가 되었을 때 물리 기술의 위력이 올라간다." + }, + "flareBoost": { + "name": "열폭주", + "description": "화상 상태가 되었을 때 특수 기술의 위력이 올라간다." + }, + "harvest": { + "name": "수확", + "description": "사용한 나무열매를 몇 번이고 만들어 낸다." + }, + "telepathy": { + "name": "텔레파시", + "description": "같은 편의 공격의 낌새를 읽고 기술을 회피한다." + }, + "moody": { + "name": "변덕쟁이", + "description": "매 턴 능력 중 하나가 크게 오르고 하나가 떨어진다." + }, + "overcoat": { + "name": "방진", + "description": "모래바람이나 싸라기눈 등의 데미지를 입지 않는다. 가루의 기술을 받지 않는다." + }, + "poisonTouch": { + "name": "독수", + "description": "접촉하기만 해도 상대를 독 상태로 만들 때가 있다." + }, + "regenerator": { + "name": "재생력", + "description": "지닌 포켓몬으로 돌아오면 HP를 조금 회복한다." + }, + "bigPecks": { + "name": "부풀린가슴", + "description": "방어를 떨어뜨리는 효과를 받지 않는다." + }, + "sandRush": { + "name": "모래헤치기", + "description": "날씨가 모래바람일 때 스피드가 올라간다." + }, + "wonderSkin": { + "name": "미라클스킨", + "description": "변화 기술을 받기 어려운 몸으로 되어 있다." + }, + "analytic": { + "name": "애널라이즈", + "description": "제일 마지막에 기술을 쓰면 기술의 위력이 올라간다." + }, + "illusion": { + "name": "일루전", + "description": "지닌 포켓몬 중 제일 뒤에 있는 포켓몬으로 둔갑하여 나와서 상대를 속인다." + }, + "imposter": { + "name": "괴짜", + "description": "눈앞의 포켓몬으로 변신해버린다." + }, + "infiltrator": { + "name": "틈새포착", + "description": "상대의 벽이나 대타출동을 뚫고 공격할 수 있다." + }, + "mummy": { + "name": "미라", + "description": "상대가 접촉하면 상대를 미라로 만들어버린다." + }, + "moxie": { + "name": "자기과신", + "description": "상대를 쓰러뜨리면 자신감이 붙어서 공격이 올라간다." + }, + "justified": { + "name": "정의의마음", + "description": "악타입 공격을 받으면 정의감으로 공격이 올라간다." + }, + "rattled": { + "name": "주눅", + "description": "위협이나 악타입과 고스트타입과 벌레타입의 기술에 주눅이 들어 스피드가 올라간다." + }, + "magicBounce": { + "name": "매직미러", + "description": "상대가 쓴 변화 기술을 받지 않고 그대로 되받아칠 수 있다." + }, + "sapSipper": { + "name": "초식", + "description": "풀타입 기술을 받으면 데미지를 입지 않고 공격이 올라간다." + }, + "prankster": { + "name": "짓궂은마음", + "description": "변화 기술을 먼저 쓸 수 있다." + }, + "sandForce": { + "name": "모래의힘", + "description": "날씨가 모래바람일 때 바위타입과 땅타입과 강철타입의 위력이 올라간다." + }, + "ironBarbs": { + "name": "철가시", + "description": "자신과 접촉한 상대에게 철가시로 데미지를 준다." + }, + "zenMode": { + "name": "달마모드", + "description": "HP가 절반 이하가 되면 모습이 변화한다." + }, + "victoryStar": { + "name": "승리의별", + "description": "자신과 같은 편의 명중률이 올라간다." + }, + "turboblaze": { + "name": "터보블레이즈", + "description": "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다." + }, + "teravolt": { + "name": "테라볼티지", + "description": "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다." + }, + "aromaVeil": { + "name": "아로마베일", + "description": "자신과 같은 편으로 향하는 멘탈 공격을 막을 수 있다." + }, + "flowerVeil": { + "name": "플라워베일", + "description": "같은 편의 풀타입 포켓몬은 능력이 떨어지지 않고 상태 이상도 되지 않는다." + }, + "cheekPouch": { + "name": "볼주머니", + "description": "어떤 나무열매라도 먹으면 HP도 회복한다." + }, + "protean": { + "name": "변환자재", + "description": "자신이 사용한 기술과 같은 타입으로 변화한다." + }, + "furCoat": { + "name": "퍼코트", + "description": "상대로부터 받는 물리 기술의 데미지가 절반이 된다." + }, + "magician": { + "name": "매지션", + "description": "기술을 맞은 상대의 도구를 빼앗아 버린다." + }, + "bulletproof": { + "name": "방탄", + "description": "상대 구슬이나 폭탄 등 기술을 막을 수 있다." + }, + "competitive": { + "name": "승기", + "description": "능력이 떨어지면 특수공격이 크게 올라간다." + }, + "strongJaw": { + "name": "옹골찬턱", + "description": "턱이 튼튼하여 무는 기술의 위력이 올라간다." + }, + "refrigerate": { + "name": "프리즈스킨", + "description": "노말타입의 기술이 얼음타입이 된다. 위력이 조금 올라간다." + }, + "sweetVeil": { + "name": "스위트베일", + "description": "같은 편의 포켓몬이 잠들지 않게 된다." + }, + "stanceChange": { + "name": "배틀스위치", + "description": "공격 기술을 쓰면 블레이드폼으로 기술 킹실드를 쓰면 실드폼으로 변한다." + }, + "galeWings": { + "name": "질풍날개", + "description": "HP가 꽉 찼을 때 비행타입의 기술을 먼저 쓸 수 있다." + }, + "megaLauncher": { + "name": "메가런처", + "description": "파동 기술의 위력이 올라간다." + }, + "grassPelt": { + "name": "풀모피", + "description": "그래스필드일 때 방어가 올라간다." + }, + "symbiosis": { + "name": "공생", + "description": "같은 편이 도구를 쓰면 자신이 지니고 있는 도구를 같은 편에게 건넨다." + }, + "toughClaws": { + "name": "단단한발톱", + "description": "상대에게 접촉하는 기술의 위력이 올라간다." + }, + "pixilate": { + "name": "페어리스킨", + "description": "노말타입의 기술이 페어리타입이 된다. 위력이 조금 올라간다." + }, + "gooey": { + "name": "미끈미끈", + "description": "공격으로 자신과 접촉한 상대의 스피드를 떨어뜨린다." + }, + "aerilate": { + "name": "스카이스킨", + "description": "노말타입의 기술이 비행타입이 된다. 위력이 조금 올라간다." + }, + "parentalBond": { + "name": "부자유친", + "description": "부모와 자식 2마리로 2번 공격할 수 있다." + }, + "darkAura": { + "name": "다크오라", + "description": "전원의 악타입 기술이 강해진다." + }, + "fairyAura": { + "name": "페어리오라", + "description": "전원의 페어리타입 기술이 강해진다." + }, + "auraBreak": { + "name": "오라브레이크", + "description": "오라의 효과를 역전시켜 위력을 떨어뜨린다." + }, + "primordialSea": { + "name": "시작의바다", + "description": "불꽃타입의 공격을 받지 않는 날씨로 만든다." + }, + "desolateLand": { + "name": "끝의대지", + "description": "물타입의 공격을 받지 않는 날씨로 만든다." + }, + "deltaStream": { + "name": "델타스트림", + "description": "비행타입의 약점이 없어지는 날씨로 만든다." + }, + "stamina": { + "name": "지구력", + "description": "공격을 받으면 방어가 올라간다." + }, + "wimpOut": { + "name": "도망태세", + "description": "HP가 절반이 되면 황급히 도망쳐서 지닌 포켓몬으로 돌아간다." + }, + "emergencyExit": { + "name": "위기회피", + "description": "HP가 절반이 되면 위험을 회피하기 위해 지닌 포켓몬으로 돌아간다." + }, + "waterCompaction": { + "name": "꾸덕꾸덕굳기", + "description": "물타입의 기술을 받으면 방어가 크게 올라간다." + }, + "merciless": { + "name": "무도한행동", + "description": "독 상태의 상대를 공격하면 반드시 급소에 맞는다." + }, + "shieldsDown": { + "name": "리밋실드", + "description": "HP가 절반이 되면 껍질이 깨져 공격적으로 된다." + }, + "stakeout": { + "name": "잠복", + "description": "교체로 나온 상대에게 2배 데미지로 공격할 수 있다." + }, + "waterBubble": { + "name": "수포", + "description": "자신을 향하는 불꽃타입 기술의 위력을 떨어뜨린다. 화상을 입지 않는다." + }, + "steelworker": { + "name": "강철술사", + "description": "강철타입 기술의 위력이 올라간다." + }, + "berserk": { + "name": "발끈", + "description": "상대의 공격으로 HP가 절반이 되면 특수공격이 올라간다." + }, + "slushRush": { + "name": "눈치우기", + "description": "날씨가 눈일 때 스피드가 올라간다." + }, + "longReach": { + "name": "원격", + "description": "모든 기술을 상대에게 접촉하지 않고 사용할 수 있다." + }, + "liquidVoice": { + "name": "촉촉보이스", + "description": "모든 소리 기술이 물타입이 된다." + }, + "triage": { + "name": "힐링시프트", + "description": "회복 기술을 먼저 사용할 수 있다." + }, + "galvanize": { + "name": "일렉트릭스킨", + "description": "노말타입 기술이 전기타입이 된다. 위력이 조금 올라간다." + }, + "surgeSurfer": { + "name": "서핑테일", + "description": "일렉트릭필드일 때 스피드가 2배가 된다." + }, + "schooling": { + "name": "어군", + "description": "HP가 많을 때 무리지어 강해진다. HP가 얼마 남지 않으면 무리는 뿔뿔이 흩어진다." + }, + "disguise": { + "name": "탈", + "description": "몸을 덮는 탈로 1번 공격을 막을 수 있다." + }, + "battleBond": { + "name": "유대변화", + "description": "상대를 쓰러뜨리면 트레이너와의 유대감이 깊어져서 지우개굴닌자로 변한다. 물수리검이 강해진다." + }, + "powerConstruct": { + "name": "스웜체인지", + "description": "HP가 절반이 되면 셀들이 응원하러 달려와 퍼펙트폼으로 모습이 변한다." + }, + "corrosion": { + "name": "부식", + "description": "강철타입이나 독타입도 독 상태로 만들 수 있다." + }, + "comatose": { + "name": "절대안깸", + "description": "항상 비몽사몽 상태로 절대 깨지 않는다. 잠든 상태로 공격할 수 있다." + }, + "queenlyMajesty": { + "name": "여왕의위엄", + "description": "상대에게 위압감을 줘서 이쪽을 향한 선제 기술을 사용할 수 없게 한다." + }, + "innardsOut": { + "name": "내용물분출", + "description": "상대가 쓰러뜨렸을 때 HP의 남은 양만큼 상대에게 데미지를 준다." + }, + "dancer": { + "name": "무희", + "description": "누군가 춤 기술을 쓰면 자신도 이어서 춤 기술을 쓸 수 있다." + }, + "battery": { + "name": "배터리", + "description": "같은 편 특수 기술의 위력을 올린다." + }, + "fluffy": { + "name": "복슬복슬", + "description": "상대로부터 받은 접촉하는 기술의 데미지를 반감시키지만 불꽃타입 기술의 데미지는 2배가 된다." + }, + "dazzling": { + "name": "비비드바디", + "description": "상대를 놀라게 해서 이쪽을 향한 선제 기술을 사용할 수 없게 한다." + }, + "soulHeart": { + "name": "소울하트", + "description": "포켓몬이 기절할 때마다 특수공격이 올라간다." + }, + "tanglingHair": { + "name": "컬리헤어", + "description": "공격으로 자신에게 접촉한 상대의 스피드를 떨어뜨린다." + }, + "receiver": { + "name": "리시버", + "description": "쓰러진 같은 편의 특성을 이어받아 같은 특성으로 바뀐다." + }, + "powerOfAlchemy": { + "name": "화학의힘", + "description": "쓰러진 같은 편의 특성을 이어받아 같은 특성으로 바뀐다." + }, + "beastBoost": { + "name": "비스트부스트", + "description": "상대를 기절시켰을 때 자신의 가장 높은 능력이 올라간다." + }, + "rksSystem": { + "name": "AR시스템", + "description": "지니고 있는 메모리로 자신의 타입이 변한다." + }, + "electricSurge": { + "name": "일렉트릭메이커", + "description": "등장했을 때 일렉트릭필드를 사용한다." + }, + "psychicSurge": { + "name": "사이코메이커", + "description": "등장했을 때 사이코필드를 사용한다." + }, + "mistySurge": { + "name": "미스트메이커", + "description": "등장했을 때 미스트필드를 사용한다." + }, + "grassySurge": { + "name": "그래스메이커", + "description": "등장했을 때 그래스필드를 사용한다." + }, + "fullMetalBody": { + "name": "메탈프로텍트", + "description": "상대 기술이나 특성으로 능력이 떨어지지 않는다." + }, + "shadowShield": { + "name": "스펙터가드", + "description": "HP가 꽉 찼을 때 받는 데미지가 줄어든다." + }, + "prismArmor": { + "name": "프리즘아머", + "description": "효과가 굉장한 공격의 위력을 약하게 만든다." + }, + "neuroforce": { + "name": "브레인포스", + "description": "효과가 굉장한 공격의 위력이 더욱 올라간다." + }, + "intrepidSword": { + "name": "불요의검", + "description": "등장했을 때 공격이 올라간다." + }, + "dauntlessShield": { + "name": "불굴의방패", + "description": "등장했을 때 방어가 올라간다." + }, + "libero": { + "name": "리베로", + "description": "자신이 사용한 기술과 같은 타입으로 변화한다." + }, + "ballFetch": { + "name": "볼줍기", + "description": "첫 번째로 실패한 몬스터볼을 주워온다." + }, + "cottonDown": { + "name": "솜털", + "description": "공격을 받으면 솜털을 흩뿌려서 자신을 제외한 모든 포켓몬의 스피드를 떨어뜨린다." + }, + "propellerTail": { + "name": "스크루지느러미", + "description": "상대의 기술을 끌어모으는 특성이나 기술의 영향을 받지 않는다." + }, + "mirrorArmor": { + "name": "미러아머", + "description": "자신이 받는 능력 다운 효과에 한해 되받아친다." + }, + "gulpMissile": { + "name": "그대로꿀꺽미사일", + "description": "파도타기나 다이빙을 쓰면 먹이를 물어온다. 데미지를 받으면 먹이를 토해내서 공격한다." + }, + "stalwart": { + "name": "굳건한신념", + "description": "상대의 기술을 끌어모으는 특성이나 기술의 영향을 받지 않는다." + }, + "steamEngine": { + "name": "증기기관", + "description": "물타입이나 불꽃타입 기술을 받으면 스피드가 매우 크게 올라간다." + }, + "punkRock": { + "name": "펑크록", + "description": "소리 기술의 위력이 올라간다. 상대로부터 받는 소리 기술의 데미지는 절반이 된다." + }, + "sandSpit": { + "name": "모래뿜기", + "description": "공격을 받으면 모래바람을 일으킨다." + }, + "iceScales": { + "name": "얼음인분", + "description": "얼음인분의 보호를 받아 특수공격으로 받는 데미지가 절반이 된다." + }, + "ripen": { + "name": "숙성", + "description": "나무열매를 숙성시켜서 효과가 2배가 된다." + }, + "iceFace": { + "name": "아이스페이스", + "description": "물리공격을 머리의 얼음이 대신 맞아주지만 모습도 바뀐다. 얼음은 싸라기눈이 내리면 원래대로 돌아온다." + }, + "powerSpot": { + "name": "파워스폿", + "description": "옆에 있기만 해도 기술의 위력이 올라간다." + }, + "mimicry": { + "name": "의태", + "description": "필드의 상태에 따라 포켓몬의 타입이 바뀐다." + }, + "screenCleaner": { + "name": "배리어프리", + "description": "등장했을 때 상대와 같은 편의 빛의장막, 리플렉터, 오로라베일의 효과가 사라진다." + }, + "steelySpirit": { + "name": "강철정신", + "description": "같은 편의 강철타입 공격의 위력이 올라간다." + }, + "perishBody": { + "name": "멸망의바디", + "description": "접촉하는 기술을 받으면 3턴 후에 양쪽 모두 기절한다. 교체되면 효과가 없어진다." + }, + "wanderingSpirit": { + "name": "떠도는영혼", + "description": "접촉하는 기술로 공격해온 포켓몬과 특성을 바꾼다." + }, + "gorillaTactics": { + "name": "무아지경", + "description": "공격이 올라가지만 처음에 선택한 기술 외에는 쓸 수 없게 된다." + }, + "neutralizingGas": { + "name": "화학변화가스", + "description": "화학변화가스를 가진 포켓몬이 배틀에 나와 있으면 모든 포켓몬이 가진 특성의 효과가 사라지거나 발동하지 않게 된다." + }, + "pastelVeil": { + "name": "파스텔베일", + "description": "자신과 같은 편이 독의 상태 이상 효과를 받지 않게 된다." + }, + "hungerSwitch": { + "name": "꼬르륵스위치", + "description": "턴이 끝날 때마다 배부른 모양, 배고픈 모양, 배부른 모양...으로 번갈아서 모습을 바꾼다." + }, + "quickDraw": { + "name": "퀵드로", + "description": "상대보다 먼저 행동할 수도 있다." + }, + "unseenFist": { + "name": "보이지않는주먹", + "description": "상대에게 접촉하는 기술을 사용하면 방어의 효과를 무시하고 공격할 수 있다." + }, + "curiousMedicine": { + "name": "기묘한약", + "description": "등장했을 때 조개껍질에서 약을 흩뿌려서 능력 변화를 원래대로 되돌린다." + }, + "transistor": { + "name": "트랜지스터", + "description": "전기타입 기술의 위력이 올라간다." + }, + "dragonsMaw": { + "name": "용의턱", + "description": "드래곤타입 기술의 위력이 올라간다." + }, + "chillingNeigh": { + "name": "백의울음", + "description": "상대를 쓰러뜨리면 차가운 울음소리를 내면서 공격이 올라간다." + }, + "grimNeigh": { + "name": "흑의울음", + "description": "상대를 쓰러뜨리면 무서운 울음소리를 내면서 특수공격이 올라간다." + }, + "asOneGlastrier": { + "name": "혼연일체", + "description": "버드렉스의 긴장감과 블리자포스의 백의울음 두 가지 특성을 겸비한다." + }, + "asOneSpectrier": { + "name": "혼연일체", + "description": "버드렉스의 긴장감과 레이스포스의 흑의울음 두 가지 특성을 겸비한다." + }, + "lingeringAroma": { + "name": "가시지않는향기", + "description": "상대가 접촉하면 가시지 않는 향기가 상대에게 배어 버린다." + }, + "seedSower": { + "name": "넘치는씨", + "description": "공격을 받으면 필드를 그래스필드로 만든다." + }, + "thermalExchange": { + "name": "열교환", + "description": "불꽃타입 기술로 공격받으면 공격이 올라간다. 화상 상태가 되지 않는다." + }, + "angerShell": { + "name": "분노의껍질", + "description": "상대의 공격에 의해 HP가 절반이 되면 화가 나서 방어와 특수방어가 떨어지지만 공격, 특수공격, 스피드가 올라간다." + }, + "purifyingSalt": { + "name": "정화의소금", + "description": "깨끗한 소금에 의해 상태 이상이 되지 않는다. 고스트타입 기술의 데미지를 반감시킨다." + }, + "wellBakedBody": { + "name": "노릇노릇바디", + "description": "불꽃타입 기술로 공격받으면 데미지를 입지 않고 방어가 크게 올라간다." + }, + "windRider": { + "name": "바람타기", + "description": "순풍이 불거나 바람 기술로 공격받으면 데미지를 받지 않고 공격이 올라간다." + }, + "guardDog": { + "name": "파수견", + "description": "위협을 받으면 공격이 올라간다. 포켓몬을 교체시키는 기술이나 도구의 효과를 받지 않는다." + }, + "rockyPayload": { + "name": "바위나르기", + "description": "바위타입 기술의 위력이 올라간다." + }, + "windPower": { + "name": "풍력발전", + "description": "바람 기술로 공격받으면 충전 상태가 된다." + }, + "zeroToHero": { + "name": "마이티체인지", + "description": "지닌 포켓몬으로 돌아오면 마이티폼으로 변한다." + }, + "commander": { + "name": "사령탑", + "description": "등장했을 때 같은 편에 어써러셔가 있으면 입속에 들어가 안에서 지시를 내린다." + }, + "electromorphosis": { + "name": "전기로바꾸기", + "description": "데미지를 받으면 충전 상태가 된다." + }, + "protosynthesis": { + "name": "고대활성", + "description": "부스트에너지를 지니고 있거나 날씨가 맑을 때 가장 높은 능력이 올라간다." + }, + "quarkDrive": { + "name": "쿼크차지", + "description": "부스트에너지를 지니고 있거나 일렉트릭필드일 때 가장 높은 능력이 올라간다." + }, + "goodAsGold": { + "name": "황금몸", + "description": "산화하지 않는 튼튼한 황금몸 덕분에 상대의 변화 기술의 영향을 받지 않는다." + }, + "vesselOfRuin": { + "name": "재앙의그릇", + "description": "재앙을 부르는 그릇의 힘으로 자신을 제외한 모든 포켓몬의 특수 공격을 약하게 만든다." + }, + "swordOfRuin": { + "name": "재앙의검", + "description": "재앙을 부르는 검의 힘으로 자신을 제외한 모든 포켓몬의 방어를 약하게 만든다." + }, + "tabletsOfRuin": { + "name": "재앙의목간", + "description": "재앙을 부르는 목간의 힘으로 자신을 제외한 모든 포켓몬의 공격을 약하게 만든다." + }, + "beadsOfRuin": { + "name": "재앙의구슬", + "description": "재앙을 부르는 곡옥의 힘으로 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다." + }, + "orichalcumPulse": { + "name": "진홍빛고동", + "description": "등장했을 때 날씨를 맑음으로 만든다. 햇살이 강하면 고대의 고동에 의해 공격이 강화된다." + }, + "hadronEngine": { + "name": "하드론엔진", + "description": "등장했을 때 일렉트릭필드를 전개한다. 일렉트릭필드일 때 미래 기관에 의해 특수공격이 강화된다." + }, + "opportunist": { + "name": "편승", + "description": "상대의 능력이 올라가면 자신도 편승해서 똑같이 자신도 올린다." + }, + "cudChew": { + "name": "되새김질", + "description": "한 번에 한하여 나무열매를 먹으면 다음 턴이 끝날 때 위에서 꺼내서 또 먹는다." + }, + "sharpness": { + "name": "예리함", + "description": "상대를 베는 기술의 위력이 올라간다." + }, + "supremeOverlord": { + "name": "총대장", + "description": "등장했을 때 지금까지 쓰러진 같은 편의 수가 많을수록 조금씩 공격과 특수공격이 올라간다." + }, + "costar": { + "name": "협연", + "description": "등장했을 때 같은 편의 능력 변화를 복사한다." + }, + "toxicDebris": { + "name": "독치장", + "description": "물리 기술로 데미지를 받으면 상대의 발밑에 독압정을 뿌린다." + }, + "armorTail": { + "name": "테일아머", + "description": "머리를 감싸고 있는 수수께끼의 꼬리가 이쪽을 향한 선제 기술을 사용할 수 없게 한다." + }, + "earthEater": { + "name": "흙먹기", + "description": "땅타입의 기술로 공격받으면 데미지를 받지 않고 회복한다." + }, + "myceliumMight": { + "name": "균사의힘", + "description": "변화 기술을 사용할 때 반드시 행동이 느려지지만 상대 특성에 방해받지 않는다." + }, + "mindsEye": { + "name": "심안", + "description": "노말타입과 격투타입 기술을 고스트타입에게 맞힐 수 있다. 상대의 회피율 변화를 무시하고 명중률도 떨어지지 않는다." + }, + "supersweetSyrup": { + "name": "감미로운꿀", + "description": "처음 등장했을 때 감미로운 꿀의 향기를 흩뿌려서 상대의 회피율을 떨어뜨린다." + }, + "hospitality": { + "name": "대접", + "description": "등장했을 때 같은 편을 대접해서 HP를 조금 회복시킨다." + }, + "toxicChain": { + "name": "독사슬", + "description": "독소를 머금은 사슬의 힘으로 기술에 맞은 상대를 맹독 상태로 만들 때가 있다." + }, + "embodyAspectTeal": { + "name": "초상투영", + "description": "마음속에 깃든 추억의 힘으로 벽록의가면을 빛나게 하여 자신의 스피드를 올린다." + }, + "embodyAspectWellspring": { + "name": "초상투영", + "description": "마음속에 깃든 추억의 힘으로 우물의가면을 빛나게 하여 자신의 특수방어를 올린다." + }, + "embodyAspectHearthflame": { + "name": "초상투영", + "description": "마음속에 깃든 추억의 힘으로 화덕의가면을 빛나게 하여 자신의 공격력을 올린다." + }, + "embodyAspectCornerstone": { + "name": "초상투영", + "description": "마음속에 깃든 추억의 힘으로 주춧돌의가면을 빛나게 하여 자신의 방어력을 올린다." + }, + "teraShift": { + "name": "테라체인지", + "description": "등장했을 때 주위의 에너지를 흡수하여 테라스탈폼으로 변한다." + }, + "teraShell": { + "name": "테라셸", + "description": "모든 타입의 힘이 담긴 등껍질이 HP가 꽉 찼을 때 받는 데미지를 모두 효과가 별로이게 만든다." + }, + "teraformZero": { + "name": "제로포밍", + "description": "테라파고스가 스텔라폼이 되었을 때 숨겨진 힘에 의해 날씨와 필드의 영향을 모두 무효로 만든다." + }, + "poisonPuppeteer": { + "name": "독조종", + "description": "복숭악동의 기술에 의해 독 상태가 된 상대는 혼란 상태도 되어 버린다." + } +} \ No newline at end of file diff --git a/src/locales/ko/ability.ts b/src/locales/ko/ability.ts deleted file mode 100644 index 18b102800cf..00000000000 --- a/src/locales/ko/ability.ts +++ /dev/null @@ -1,1252 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -/** - * 본가 게임과 텍스트가 다를 경우 주석으로 표시 - */ -export const ability: AbilityTranslationEntries = { - stench: { - name: "악취", - description: "악취를 풍겨서 공격했을 때 상대가 풀죽을 때가 있다." - }, - drizzle: { - name: "잔비", - description: "등장했을 때 날씨를 비로 만든다." - }, - speedBoost: { - name: "가속", - description: "매 턴 스피드가 올라간다." - }, - battleArmor: { - name: "전투무장", - description: "단단한 껍질에 보호받아 상대의 공격이 급소에 맞지 않는다." - }, - sturdy: { - name: "옹골참", - description: "상대 기술을 받아도 일격으로 쓰러지지 않는다. 일격필살 기술도 효과 없다." - }, - damp: { - name: "습기", - description: "주변을 습하게 함으로써 자폭 등 폭발하는 기술을 아무도 못 쓰게 한다." - }, - limber: { - name: "유연", - description: "유연한 몸으로 인해 마비 상태가 되지 않는다." - }, - sandVeil: { - name: "모래숨기", - description: "모래바람일 때 회피율이 올라간다." - }, - static: { - name: "정전기", - description: "정전기를 몸에 둘러 접촉한 상대를 마비시킬 때가 있다." - }, - voltAbsorb: { - name: "축전", - description: "전기타입의 기술을 받으면 데미지를 받지 않고 회복한다." - }, - waterAbsorb: { - name: "저수", - description: "물타입의 기술을 받으면 데미지를 받지 않고 회복한다." - }, - oblivious: { - name: "둔감", - description: "둔감해서 헤롱헤롱이나 도발 상태가 되지 않는다." - }, - cloudNine: { - name: "날씨부정", - description: "모든 날씨의 영향이 없어진다." - }, - compoundEyes: { - name: "복안", - description: "복안을 가지고 있어 기술의 명중률이 올라간다." - }, - insomnia: { - name: "불면", - description: "잠들지 못하는 체질이라 잠듦 상태가 되지 않는다." - }, - colorChange: { - name: "변색", - description: "상대에게 받은 기술의 타입으로 자신의 타입이 변화한다." - }, - immunity: { - name: "면역", - description: "체내에 면역을 가지고 있어 독 상태가 되지 않는다." - }, - flashFire: { - name: "타오르는불꽃", - description: "불꽃타입의 기술을 받으면 불꽃을 받아서 자신이 사용하는 불꽃타입의 기술이 강해진다." - }, - shieldDust: { - name: "인분", - description: "인분에 보호받아 기술의 추가 효과를 받지 않게 된다." - }, - ownTempo: { - name: "마이페이스", - description: "마이페이스라서 혼란 상태가 되지 않는다." - }, - suctionCups: { - name: "흡반", - description: "흡반으로 지면에 달라붙어 포켓몬을 교체시키는 기술이나 도구의 효과를 발휘하지 못하게 한다." - }, - intimidate: { - name: "위협", - description: "등장했을 때 위협해서 상대를 위축시켜 상대의 공격을 떨어뜨린다." - }, - shadowTag: { - name: "그림자밟기", - description: "상대의 그림자를 밟아 도망치거나 교체할 수 없게 한다." - }, - roughSkin: { - name: "까칠한피부", - description: "공격을 받았을 때 자신에게 접촉한 상대를 까칠까칠한 피부로 상처를 입힌다." - }, - wonderGuard: { - name: "불가사의부적", - description: "효과가 굉장한 기술만 맞는 불가사의한 힘." - }, - levitate: { - name: "부유", - description: "땅에서 뜨는 것으로 땅타입의 기술을 받지 않는다." - }, - effectSpore: { - name: "포자", - description: "공격으로 자신에게 접촉한 상대를 독이나 마비, 잠듦 상태로 만들 때가 있다." - }, - synchronize: { - name: "싱크로", - description: "자신이 걸린 독이나 마비, 화상을 상대에게 옮긴다." - }, - clearBody: { - name: "클리어바디", - description: "상대 기술이나 특성으로 능력이 떨어지지 않는다." - }, - naturalCure: { - name: "자연회복", - description: "지닌 포켓몬으로 돌아오면 상태 이상이 회복된다." - }, - lightningRod: { - name: "피뢰침", - description: "전기타입의 기술을 자신에게 끌어모아 데미지를 받지 않고 특수공격을 올린다." - }, - sereneGrace: { - name: "하늘의은총", - description: "하늘의 은총 덕분에 기술의 추가 효과가 나오기 쉽다." - }, - swiftSwim: { - name: "쓱쓱", - description: "비가 오는 날씨일 때 스피드가 올라간다." - }, - chlorophyll: { - name: "엽록소", - description: "날씨가 맑을 때 스피드가 올라간다." - }, - illuminate: { - name: "발광", - description: "주변을 밝게 하여 명중률이 떨어지지 않는다." - }, - trace: { - name: "트레이스", - description: "등장했을 때 상대의 특성을 트레이스해서 같은 특성이 된다." - }, - hugePower: { - name: "천하장사", - description: "물리공격의 위력이 2배가 된다." - }, - poisonPoint: { - name: "독가시", - description: "자신과 접촉한 상대를 독 상태로 만들 때가 있다." - }, - innerFocus: { - name: "정신력", - description: "단련한 정신으로 인하여 상대의 공격에 풀죽지 않는다." - }, - magmaArmor: { - name: "마그마의무장", - description: "뜨거운 마그마를 몸에 둘러서 얼음 상태가 되지 않는다." - }, - waterVeil: { - name: "수의베일", - description: "물의 베일을 몸에 둘러서 화상 상태가 되지 않는다." - }, - magnetPull: { - name: "자력", - description: "강철타입의 포켓몬을 자력으로 끌어모아 도망칠 수 없게 한다." - }, - soundproof: { - name: "방음", - description: "소리를 차단하는 것으로 소리 공격을 받지 않는다." - }, - rainDish: { - name: "젖은접시", - description: "비가 오는 날씨일 때 조금씩 HP를 회복한다." - }, - sandStream: { - name: "모래날림", - description: "등장했을 때 날씨를 모래바람으로 만든다." - }, - pressure: { - name: "프레셔", - description: "프레셔를 줘서 상대가 쓰는 기술의 PP를 많이 줄인다." - }, - thickFat: { - name: "두꺼운지방", - description: "두꺼운 지방으로 보호되고 있어 불꽃타입과 얼음타입의 기술의 데미지를 반감시킨다." - }, - earlyBird: { - name: "일찍기상", - description: "잠듦 상태가 되어도 2배 스피드로 깨어날 수 있다." - }, - flameBody: { - name: "불꽃몸", - description: "자신과 접촉한 상대를 화상 상태로 만들 때가 있다." - }, - runAway: { - name: "도주", - description: "야생 포켓몬으로부터 반드시 도망칠 수 있다." - }, - keenEye: { - name: "날카로운눈", - description: "날카로운 눈 덕분에 명중률이 떨어지지 않는다." - }, - hyperCutter: { - name: "괴력집게", - description: "힘이 자랑인 집게를 가지고 있어 상대가 공격을 떨어뜨리지 못한다." - }, - pickup: { - name: "픽업", - /* 모험 없음 */ - description: "상대가 지닌 도구를 주워올 때가 있다." - }, - truant: { - name: "게으름", - description: "기술을 사용하면 다음 턴은 쉰다." - }, - hustle: { - name: "의욕", - description: "자신의 공격이 높아지지만 명중률이 떨어진다." - }, - cuteCharm: { - name: "헤롱헤롱바디", - description: "자신과 접촉한 상대를 헤롱헤롱 상태로 만들 때가 있다." - }, - plus: { - name: "플러스", - description: "플러스나 마이너스의 특성을 가진 포켓몬이 동료에 있으면 자신의 특수공격이 올라간다." - }, - minus: { - name: "마이너스", - description: "플러스나 마이너스의 특성을 가진 포켓몬이 동료에 있으면 자신의 특수공격이 올라간다." - }, - forecast: { - name: "기분파", - description: "날씨의 영향을 받아 물타입, 불꽃타입, 얼음타입 중 하나로 변화한다." - }, - stickyHold: { - name: "점착", - description: "점착질의 몸에 도구가 달라붙어 있어 상대에게 도구를 뺏기지 않는다." - }, - shedSkin: { - name: "탈피", - description: "몸의 껍질을 벗어 던져 상태 이상을 회복할 때가 있다." - }, - guts: { - name: "근성", - description: "상태 이상이 되면 근성을 보여서 공격이 올라간다." - }, - marvelScale: { - name: "이상한비늘", - description: "상태 이상이 되면 이상한 비늘이 반응해서 방어가 올라간다." - }, - liquidOoze: { - name: "해감액", - description: "해감액을 흡수한 상대는 강렬한 악취로 데미지를 받아 HP가 줄어든다." - }, - overgrow: { - name: "심록", - description: "HP가 줄었을 때 풀타입 기술의 위력이 올라간다." - }, - blaze: { - name: "맹화", - description: "HP가 줄었을 때 불꽃타입 기술의 위력이 올라간다." - }, - torrent: { - name: "급류", - description: "HP가 줄었을 때 물타입 기술의 위력이 올라간다." - }, - swarm: { - name: "벌레의알림", - description: "HP가 줄었을 때 벌레타입 기술의 위력이 올라간다." - }, - rockHead: { - name: "돌머리", - description: "반동을 받는 기술을 사용해도 HP가 줄지 않는다." - }, - drought: { - name: "가뭄", - description: "등장했을 때 날씨를 맑음으로 만든다." - }, - arenaTrap: { - name: "개미지옥", - description: "배틀에서 상대를 도망칠 수 없게 한다." - }, - vitalSpirit: { - name: "의기양양", - description: "의기양양해져서 잠듦 상태가 되지 않는다." - }, - whiteSmoke: { - name: "하얀연기", - description: "하얀 연기의 보호를 받아 상대가 능력을 떨어뜨릴 수 없다." - }, - purePower: { - name: "순수한힘", - description: "요가의 힘으로 물리공격의 위력이 2배가 된다." - }, - shellArmor: { - name: "조가비갑옷", - description: "단단한 껍질의 보호를 받아 상대의 공격이 급소에 맞지 않는다." - }, - airLock: { - name: "에어록", - description: "모든 날씨의 영향이 없어진다." - }, - tangledFeet: { - name: "갈지자걸음", - description: "혼란 상태일 때는 회피율이 올라간다." - }, - motorDrive: { - name: "전기엔진", - description: "전기타입의 기술을 받으면 데미지를 받지 않고 스피드가 올라간다." - }, - rivalry: { - name: "투쟁심", - description: "성별이 같으면 투쟁심을 불태워 강해진다. 성별이 다르면 약해진다." - }, - steadfast: { - name: "불굴의마음", - description: "풀죽을 때마다 불굴의 마음을 불태워 스피드가 올라간다." - }, - snowCloak: { - name: "눈숨기", - description: "날씨가 눈일 때 회피율이 올라간다." - }, - gluttony: { - name: "먹보", - description: "HP가 줄어들면 먹을 나무열매를 HP가 절반일 때 먹어버린다." - }, - angerPoint: { - name: "분노의경혈", - description: "급소에 공격이 맞으면 크게 분노해 공격력이 최대가 된다." - }, - unburden: { - name: "곡예", - description: "지니던 도구가 없어지면 스피드가 올라간다." - }, - heatproof: { - name: "내열", - description: "내열인 몸으로 인해 불꽃타입 공격의 데미지를 반감한다." - }, - simple: { - name: "단순", - description: "능력 변화가 평소의 2배가 된다." - }, - drySkin: { - name: "건조피부", - description: "비가 오는 날씨나 물타입의 기술로 HP가 회복되고 맑을 때나 불꽃타입의 기술로는 줄어든다." - }, - download: { - name: "다운로드", - description: "상대의 방어와 특수방어를 비교해서 낮은 쪽 능력에 맞춰서 자신의 공격이나 특수공격을 올린다." - }, - ironFist: { - name: "철주먹", - description: "펀치를 사용하는 기술의 위력이 올라간다." - }, - poisonHeal: { - name: "포이즌힐", - description: "독 상태가 되면 HP가 줄지 않고 증가한다." - }, - adaptability: { - name: "적응력", - description: "자신과 같은 타입의 기술 위력이 올라간다." - }, - skillLink: { - name: "스킬링크", - description: "연속 기술을 사용하면 항상 최고 횟수를 사용할 수 있다." - }, - hydration: { - name: "촉촉바디", - description: "비가 오는 날씨일 때 상태 이상이 회복된다." - }, - solarPower: { - name: "선파워", - description: "날씨가 맑으면 특수공격이 올라가지만 매 턴 HP가 줄어든다." - }, - quickFeet: { - name: "속보", - description: "상태 이상이 되면 스피드가 올라간다." - }, - normalize: { - name: "노말스킨", - description: "어떤 타입의 기술도 모두 노말타입이 된다. 위력이 조금 올라간다." - }, - sniper: { - name: "스나이퍼", - description: "공격을 급소에 맞혔을 때 위력이 더욱 올라간다." - }, - magicGuard: { - name: "매직가드", - description: "공격 이외에는 데미지를 입지 않는다." - }, - noGuard: { - name: "노가드", - description: "노가드전법에 따라 서로가 사용하는 기술이 반드시 맞게 된다." - }, - stall: { - name: "시간벌기", - description: "기술을 사용하는 순서가 반드시 마지막이 된다." - }, - technician: { - name: "테크니션", - description: "위력이 약한 기술의 위력을 올려서 공격할 수 있다." - }, - leafGuard: { - name: "리프가드", - description: "날씨가 맑을 때는 상태 이상이 되지 않는다." - }, - klutz: { - name: "서투름", - description: "지니고 있는 도구를 쓸 수 없다." - }, - moldBreaker: { - name: "틀깨기", - description: "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다." - }, - superLuck: { - name: "대운", - description: "대운을 가지고 있어 상대의 급소에 공격이 맞기 쉽다." - }, - aftermath: { - name: "유폭", - description: "기절했을 때 접촉한 상대에게 데미지를 준다." - }, - anticipation: { - name: "위험예지", - description: "상대가 지닌 위험한 기술을 감지할 수 있다." - }, - forewarn: { - name: "예지몽", - description: "등장했을 때 상대가 지닌 기술을 하나만 꿰뚫어본다." - }, - unaware: { - name: "천진", - description: "상대의 능력 변화를 무시하고 공격할 수 있다." - }, - tintedLens: { - name: "색안경", - description: "효과가 별로인 기술을 통상의 위력으로 쓸 수 있다." - }, - filter: { - name: "필터", - description: "효과가 굉장한 공격의 위력을 약하게 만든다." - }, - slowStart: { - name: "슬로스타트", - description: "5턴 동안 공격과 스피드가 절반이 된다." - }, - scrappy: { - name: "배짱", - description: "고스트타입 포켓몬에게 노말타입과 격투타입의 기술을 맞게 한다." - }, - stormDrain: { - name: "마중물", - description: "물타입의 기술을 자신에게 끌어모아 데미지는 받지 않고 특수공격이 올라간다." - }, - iceBody: { - name: "아이스바디", - description: "날씨가 눈일 때 HP를 조금씩 회복한다." - }, - solidRock: { - name: "하드록", - description: "효과가 굉장한 공격의 위력을 약하게 만든다." - }, - snowWarning: { - name: "눈퍼뜨리기", - description: "등장했을 때 날씨를 눈으로 만든다." - }, - honeyGather: { - name: "꿀모으기", - description: "배틀이 끝났을 때 달콤한꿀을 주울 때가 있다. 배틀 후에 꿀을 팔아 돈을 받을 수 있다." - }, - frisk: { - name: "통찰", - /* 효과 변경 */ - description: "등장했을 때 상대의 특성을 통찰할 수 있다." - }, - reckless: { - name: "이판사판", - description: "반동 데미지를 받는 기술의 위력이 올라간다." - }, - multitype: { - name: "멀티타입", - description: "지니고 있는 플레이트나 Z크리스탈 타입에 따라 자신의 타입이 바뀐다." - }, - flowerGift: { - name: "플라워기프트", - description: "날씨가 맑을 때 자신과 같은 편의 공격과 특수방어의 능력이 올라간다." - }, - badDreams: { - name: "나이트메어", - description: "잠듦 상태의 상대에게 데미지를 준다." - }, - pickpocket: { - name: "나쁜손버릇", - description: "접촉한 상대의 도구를 훔친다." - }, - sheerForce: { - name: "우격다짐", - description: "기술의 추가 효과가 없어지지만 그만큼 높은 위력으로 기술을 사용할 수 있다." - }, - contrary: { - name: "심술꾸러기", - description: "능력의 변화가 역전해서 올라갈 때 떨어지고 떨어질 때 올라간다." - }, - unnerve: { - name: "긴장감", - description: "상대를 긴장시켜 나무열매를 먹지 못하게 한다." - }, - defiant: { - name: "오기", - description: "능력이 떨어지면 공격이 크게 올라간다." - }, - defeatist: { - name: "무기력", - description: "HP가 절반이 되면 무기력해져서 공격과 특수공격이 반감된다." - }, - cursedBody: { - name: "저주받은바디", - description: "공격을 받으면 상대의 기술을 사슬묶기 상태로 만들 때가 있다." - }, - healer: { - name: "치유의마음", - description: "같은 편의 상태 이상을 가끔 회복시킨다." - }, - friendGuard: { - name: "프렌드가드", - description: "같은 편의 데미지를 줄일 수 있다." - }, - weakArmor: { - name: "깨어진갑옷", - description: "물리 기술로 데미지를 받으면 방어가 떨어지고 스피드가 크게 올라간다." - }, - heavyMetal: { - name: "헤비메탈", - description: "자신의 무게가 2배가 된다." - }, - lightMetal: { - name: "라이트메탈", - description: "자신의 무게가 절반이 된다." - }, - multiscale: { - name: "멀티스케일", - description: "HP가 꽉 찼을 때 받는 데미지가 줄어든다." - }, - toxicBoost: { - name: "독폭주", - description: "독 상태가 되었을 때 물리 기술의 위력이 올라간다." - }, - flareBoost: { - name: "열폭주", - description: "화상 상태가 되었을 때 특수 기술의 위력이 올라간다." - }, - harvest: { - name: "수확", - description: "사용한 나무열매를 몇 번이고 만들어 낸다." - }, - telepathy: { - name: "텔레파시", - description: "같은 편의 공격의 낌새를 읽고 기술을 회피한다." - }, - moody: { - name: "변덕쟁이", - description: "매 턴 능력 중 하나가 크게 오르고 하나가 떨어진다." - }, - overcoat: { - name: "방진", - description: "모래바람이나 싸라기눈 등의 데미지를 입지 않는다. 가루의 기술을 받지 않는다." - }, - poisonTouch: { - name: "독수", - description: "접촉하기만 해도 상대를 독 상태로 만들 때가 있다." - }, - regenerator: { - name: "재생력", - description: "지닌 포켓몬으로 돌아오면 HP를 조금 회복한다." - }, - bigPecks: { - name: "부풀린가슴", - description: "방어를 떨어뜨리는 효과를 받지 않는다." - }, - sandRush: { - name: "모래헤치기", - description: "날씨가 모래바람일 때 스피드가 올라간다." - }, - wonderSkin: { - name: "미라클스킨", - description: "변화 기술을 받기 어려운 몸으로 되어 있다." - }, - analytic: { - name: "애널라이즈", - description: "제일 마지막에 기술을 쓰면 기술의 위력이 올라간다." - }, - illusion: { - name: "일루전", - description: "지닌 포켓몬 중 제일 뒤에 있는 포켓몬으로 둔갑하여 나와서 상대를 속인다." - }, - imposter: { - name: "괴짜", - description: "눈앞의 포켓몬으로 변신해버린다." - }, - infiltrator: { - name: "틈새포착", - description: "상대의 벽이나 대타출동을 뚫고 공격할 수 있다." - }, - mummy: { - name: "미라", - description: "상대가 접촉하면 상대를 미라로 만들어버린다." - }, - moxie: { - name: "자기과신", - description: "상대를 쓰러뜨리면 자신감이 붙어서 공격이 올라간다." - }, - justified: { - name: "정의의마음", - description: "악타입 공격을 받으면 정의감으로 공격이 올라간다." - }, - rattled: { - name: "주눅", - /* 축약 있음 */ - description: "위협이나 악타입과 고스트타입과 벌레타입의 기술에 주눅이 들어 스피드가 올라간다." - }, - magicBounce: { - name: "매직미러", - description: "상대가 쓴 변화 기술을 받지 않고 그대로 되받아칠 수 있다." - }, - sapSipper: { - name: "초식", - description: "풀타입 기술을 받으면 데미지를 입지 않고 공격이 올라간다." - }, - prankster: { - name: "짓궂은마음", - description: "변화 기술을 먼저 쓸 수 있다." - }, - sandForce: { - name: "모래의힘", - description: "날씨가 모래바람일 때 바위타입과 땅타입과 강철타입의 위력이 올라간다." - }, - ironBarbs: { - name: "철가시", - description: "자신과 접촉한 상대에게 철가시로 데미지를 준다." - }, - zenMode: { - name: "달마모드", - description: "HP가 절반 이하가 되면 모습이 변화한다." - }, - victoryStar: { - name: "승리의별", - description: "자신과 같은 편의 명중률이 올라간다." - }, - turboblaze: { - name: "터보블레이즈", - description: "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다." - }, - teravolt: { - name: "테라볼티지", - description: "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다." - }, - aromaVeil: { - name: "아로마베일", - description: "자신과 같은 편으로 향하는 멘탈 공격을 막을 수 있다." - }, - flowerVeil: { - name: "플라워베일", - description: "같은 편의 풀타입 포켓몬은 능력이 떨어지지 않고 상태 이상도 되지 않는다." - }, - cheekPouch: { - name: "볼주머니", - description: "어떤 나무열매라도 먹으면 HP도 회복한다." - }, - protean: { - name: "변환자재", - description: "자신이 사용한 기술과 같은 타입으로 변화한다." - }, - furCoat: { - name: "퍼코트", - description: "상대로부터 받는 물리 기술의 데미지가 절반이 된다." - }, - magician: { - name: "매지션", - description: "기술을 맞은 상대의 도구를 빼앗아 버린다." - }, - bulletproof: { - name: "방탄", - description: "상대 구슬이나 폭탄 등 기술을 막을 수 있다." - }, - competitive: { - name: "승기", - description: "능력이 떨어지면 특수공격이 크게 올라간다." - }, - strongJaw: { - name: "옹골찬턱", - description: "턱이 튼튼하여 무는 기술의 위력이 올라간다." - }, - refrigerate: { - name: "프리즈스킨", - description: "노말타입의 기술이 얼음타입이 된다. 위력이 조금 올라간다." - }, - sweetVeil: { - name: "스위트베일", - description: "같은 편의 포켓몬이 잠들지 않게 된다." - }, - stanceChange: { - name: "배틀스위치", - description: "공격 기술을 쓰면 블레이드폼으로 기술 킹실드를 쓰면 실드폼으로 변한다." - }, - galeWings: { - name: "질풍날개", - description: "HP가 꽉 찼을 때 비행타입의 기술을 먼저 쓸 수 있다." - }, - megaLauncher: { - name: "메가런처", - description: "파동 기술의 위력이 올라간다." - }, - grassPelt: { - name: "풀모피", - description: "그래스필드일 때 방어가 올라간다." - }, - symbiosis: { - name: "공생", - description: "같은 편이 도구를 쓰면 자신이 지니고 있는 도구를 같은 편에게 건넨다." - }, - toughClaws: { - name: "단단한발톱", - description: "상대에게 접촉하는 기술의 위력이 올라간다." - }, - pixilate: { - name: "페어리스킨", - description: "노말타입의 기술이 페어리타입이 된다. 위력이 조금 올라간다." - }, - gooey: { - name: "미끈미끈", - description: "공격으로 자신과 접촉한 상대의 스피드를 떨어뜨린다." - }, - aerilate: { - name: "스카이스킨", - description: "노말타입의 기술이 비행타입이 된다. 위력이 조금 올라간다." - }, - parentalBond: { - name: "부자유친", - description: "부모와 자식 2마리로 2번 공격할 수 있다." - }, - darkAura: { - name: "다크오라", - description: "전원의 악타입 기술이 강해진다." - }, - fairyAura: { - name: "페어리오라", - description: "전원의 페어리타입 기술이 강해진다." - }, - auraBreak: { - name: "오라브레이크", - description: "오라의 효과를 역전시켜 위력을 떨어뜨린다." - }, - primordialSea: { - name: "시작의바다", - description: "불꽃타입의 공격을 받지 않는 날씨로 만든다." - }, - desolateLand: { - name: "끝의대지", - description: "물타입의 공격을 받지 않는 날씨로 만든다." - }, - deltaStream: { - name: "델타스트림", - description: "비행타입의 약점이 없어지는 날씨로 만든다." - }, - stamina: { - name: "지구력", - description: "공격을 받으면 방어가 올라간다." - }, - wimpOut: { - name: "도망태세", - description: "HP가 절반이 되면 황급히 도망쳐서 지닌 포켓몬으로 돌아간다." - }, - emergencyExit: { - name: "위기회피", - description: "HP가 절반이 되면 위험을 회피하기 위해 지닌 포켓몬으로 돌아간다." - }, - waterCompaction: { - name: "꾸덕꾸덕굳기", - description: "물타입의 기술을 받으면 방어가 크게 올라간다." - }, - merciless: { - name: "무도한행동", - description: "독 상태의 상대를 공격하면 반드시 급소에 맞는다." - }, - shieldsDown: { - name: "리밋실드", - description: "HP가 절반이 되면 껍질이 깨져 공격적으로 된다." - }, - stakeout: { - name: "잠복", - description: "교체로 나온 상대에게 2배 데미지로 공격할 수 있다." - }, - waterBubble: { - name: "수포", - description: "자신을 향하는 불꽃타입 기술의 위력을 떨어뜨린다. 화상을 입지 않는다." - }, - steelworker: { - name: "강철술사", - description: "강철타입 기술의 위력이 올라간다." - }, - berserk: { - name: "발끈", - description: "상대의 공격으로 HP가 절반이 되면 특수공격이 올라간다." - }, - slushRush: { - name: "눈치우기", - description: "날씨가 눈일 때 스피드가 올라간다." - }, - longReach: { - name: "원격", - description: "모든 기술을 상대에게 접촉하지 않고 사용할 수 있다." - }, - liquidVoice: { - name: "촉촉보이스", - description: "모든 소리 기술이 물타입이 된다." - }, - triage: { - name: "힐링시프트", - description: "회복 기술을 먼저 사용할 수 있다." - }, - galvanize: { - name: "일렉트릭스킨", - description: "노말타입 기술이 전기타입이 된다. 위력이 조금 올라간다." - }, - surgeSurfer: { - name: "서핑테일", - description: "일렉트릭필드일 때 스피드가 2배가 된다." - }, - schooling: { - name: "어군", - description: "HP가 많을 때 무리지어 강해진다. HP가 얼마 남지 않으면 무리는 뿔뿔이 흩어진다." - }, - disguise: { - name: "탈", - description: "몸을 덮는 탈로 1번 공격을 막을 수 있다." - }, - battleBond: { - name: "유대변화", - description: "상대를 쓰러뜨리면 트레이너와의 유대감이 깊어져서 지우개굴닌자로 변한다. 물수리검이 강해진다." - }, - powerConstruct: { - name: "스웜체인지", - description: "HP가 절반이 되면 셀들이 응원하러 달려와 퍼펙트폼으로 모습이 변한다." - }, - corrosion: { - name: "부식", - description: "강철타입이나 독타입도 독 상태로 만들 수 있다." - }, - comatose: { - name: "절대안깸", - description: "항상 비몽사몽 상태로 절대 깨지 않는다. 잠든 상태로 공격할 수 있다." - }, - queenlyMajesty: { - name: "여왕의위엄", - description: "상대에게 위압감을 줘서 이쪽을 향한 선제 기술을 사용할 수 없게 한다." - }, - innardsOut: { - name: "내용물분출", - description: "상대가 쓰러뜨렸을 때 HP의 남은 양만큼 상대에게 데미지를 준다." - }, - dancer: { - name: "무희", - description: "누군가 춤 기술을 쓰면 자신도 이어서 춤 기술을 쓸 수 있다." - }, - battery: { - name: "배터리", - description: "같은 편 특수 기술의 위력을 올린다." - }, - fluffy: { - name: "복슬복슬", - description: "상대로부터 받은 접촉하는 기술의 데미지를 반감시키지만 불꽃타입 기술의 데미지는 2배가 된다." - }, - dazzling: { - name: "비비드바디", - description: "상대를 놀라게 해서 이쪽을 향한 선제 기술을 사용할 수 없게 한다." - }, - soulHeart: { - name: "소울하트", - description: "포켓몬이 기절할 때마다 특수공격이 올라간다." - }, - tanglingHair: { - name: "컬리헤어", - description: "공격으로 자신에게 접촉한 상대의 스피드를 떨어뜨린다." - }, - receiver: { - name: "리시버", - description: "쓰러진 같은 편의 특성을 이어받아 같은 특성으로 바뀐다." - }, - powerOfAlchemy: { - name: "화학의힘", - description: "쓰러진 같은 편의 특성을 이어받아 같은 특성으로 바뀐다." - }, - beastBoost: { - name: "비스트부스트", - description: "상대를 기절시켰을 때 자신의 가장 높은 능력이 올라간다." - }, - rksSystem: { - name: "AR시스템", - description: "지니고 있는 메모리로 자신의 타입이 변한다." - }, - electricSurge: { - name: "일렉트릭메이커", - description: "등장했을 때 일렉트릭필드를 사용한다." - }, - psychicSurge: { - name: "사이코메이커", - description: "등장했을 때 사이코필드를 사용한다." - }, - mistySurge: { - name: "미스트메이커", - description: "등장했을 때 미스트필드를 사용한다." - }, - grassySurge: { - name: "그래스메이커", - description: "등장했을 때 그래스필드를 사용한다." - }, - fullMetalBody: { - name: "메탈프로텍트", - description: "상대 기술이나 특성으로 능력이 떨어지지 않는다." - }, - shadowShield: { - name: "스펙터가드", - description: "HP가 꽉 찼을 때 받는 데미지가 줄어든다." - }, - prismArmor: { - name: "프리즘아머", - description: "효과가 굉장한 공격의 위력을 약하게 만든다." - }, - neuroforce: { - name: "브레인포스", - description: "효과가 굉장한 공격의 위력이 더욱 올라간다." - }, - intrepidSword: { - name: "불요의검", - description: "등장했을 때 공격이 올라간다." - }, - dauntlessShield: { - name: "불굴의방패", - description: "등장했을 때 방어가 올라간다." - }, - libero: { - name: "리베로", - description: "자신이 사용한 기술과 같은 타입으로 변화한다." - }, - ballFetch: { - name: "볼줍기", - /* 지닌 도구 제한 없음 */ - description: "첫 번째로 실패한 몬스터볼을 주워온다." - }, - cottonDown: { - name: "솜털", - description: "공격을 받으면 솜털을 흩뿌려서 자신을 제외한 모든 포켓몬의 스피드를 떨어뜨린다." - }, - propellerTail: { - name: "스크루지느러미", - description: "상대의 기술을 끌어모으는 특성이나 기술의 영향을 받지 않는다." - }, - mirrorArmor: { - name: "미러아머", - description: "자신이 받는 능력 다운 효과에 한해 되받아친다." - }, - gulpMissile: { - name: "그대로꿀꺽미사일", - description: "파도타기나 다이빙을 쓰면 먹이를 물어온다. 데미지를 받으면 먹이를 토해내서 공격한다." - }, - stalwart: { - name: "굳건한신념", - description: "상대의 기술을 끌어모으는 특성이나 기술의 영향을 받지 않는다." - }, - steamEngine: { - name: "증기기관", - description: "물타입이나 불꽃타입 기술을 받으면 스피드가 매우 크게 올라간다." - }, - punkRock: { - name: "펑크록", - description: "소리 기술의 위력이 올라간다. 상대로부터 받는 소리 기술의 데미지는 절반이 된다." - }, - sandSpit: { - name: "모래뿜기", - description: "공격을 받으면 모래바람을 일으킨다." - }, - iceScales: { - name: "얼음인분", - description: "얼음인분의 보호를 받아 특수공격으로 받는 데미지가 절반이 된다." - }, - ripen: { - name: "숙성", - description: "나무열매를 숙성시켜서 효과가 2배가 된다." - }, - iceFace: { - name: "아이스페이스", - description: "물리공격을 머리의 얼음이 대신 맞아주지만 모습도 바뀐다. 얼음은 싸라기눈이 내리면 원래대로 돌아온다." - }, - powerSpot: { - name: "파워스폿", - description: "옆에 있기만 해도 기술의 위력이 올라간다." - }, - mimicry: { - name: "의태", - description: "필드의 상태에 따라 포켓몬의 타입이 바뀐다." - }, - screenCleaner: { - name: "배리어프리", - description: "등장했을 때 상대와 같은 편의 빛의장막, 리플렉터, 오로라베일의 효과가 사라진다." - }, - steelySpirit: { - name: "강철정신", - description: "같은 편의 강철타입 공격의 위력이 올라간다." - }, - perishBody: { - name: "멸망의바디", - description: "접촉하는 기술을 받으면 3턴 후에 양쪽 모두 기절한다. 교체되면 효과가 없어진다." - }, - wanderingSpirit: { - name: "떠도는영혼", - description: "접촉하는 기술로 공격해온 포켓몬과 특성을 바꾼다." - }, - gorillaTactics: { - name: "무아지경", - description: "공격이 올라가지만 처음에 선택한 기술 외에는 쓸 수 없게 된다." - }, - neutralizingGas: { - name: "화학변화가스", - description: "화학변화가스를 가진 포켓몬이 배틀에 나와 있으면 모든 포켓몬이 가진 특성의 효과가 사라지거나 발동하지 않게 된다." - }, - pastelVeil: { - name: "파스텔베일", - description: "자신과 같은 편이 독의 상태 이상 효과를 받지 않게 된다." - }, - hungerSwitch: { - name: "꼬르륵스위치", - description: "턴이 끝날 때마다 배부른 모양, 배고픈 모양, 배부른 모양...으로 번갈아서 모습을 바꾼다." - }, - quickDraw: { - name: "퀵드로", - description: "상대보다 먼저 행동할 수도 있다." - }, - unseenFist: { - name: "보이지않는주먹", - description: "상대에게 접촉하는 기술을 사용하면 방어의 효과를 무시하고 공격할 수 있다." - }, - curiousMedicine: { - name: "기묘한약", - description: "등장했을 때 조개껍질에서 약을 흩뿌려서 능력 변화를 원래대로 되돌린다." - }, - transistor: { - name: "트랜지스터", - description: "전기타입 기술의 위력이 올라간다." - }, - dragonsMaw: { - name: "용의턱", - description: "드래곤타입 기술의 위력이 올라간다." - }, - chillingNeigh: { - name: "백의울음", - description: "상대를 쓰러뜨리면 차가운 울음소리를 내면서 공격이 올라간다." - }, - grimNeigh: { - name: "흑의울음", - description: "상대를 쓰러뜨리면 무서운 울음소리를 내면서 특수공격이 올라간다." - }, - asOneGlastrier: { - name: "혼연일체", - description: "버드렉스의 긴장감과 블리자포스의 백의울음 두 가지 특성을 겸비한다." - }, - asOneSpectrier: { - name: "혼연일체", - description: "버드렉스의 긴장감과 레이스포스의 흑의울음 두 가지 특성을 겸비한다." - }, - lingeringAroma: { - name: "가시지않는향기", - description: "상대가 접촉하면 가시지 않는 향기가 상대에게 배어 버린다." - }, - seedSower: { - name: "넘치는씨", - description: "공격을 받으면 필드를 그래스필드로 만든다." - }, - thermalExchange: { - name: "열교환", - description: "불꽃타입 기술로 공격받으면 공격이 올라간다. 화상 상태가 되지 않는다." - }, - angerShell: { - name: "분노의껍질", - description: "상대의 공격에 의해 HP가 절반이 되면 화가 나서 방어와 특수방어가 떨어지지만 공격, 특수공격, 스피드가 올라간다." - }, - purifyingSalt: { - name: "정화의소금", - description: "깨끗한 소금에 의해 상태 이상이 되지 않는다. 고스트타입 기술의 데미지를 반감시킨다." - }, - wellBakedBody: { - name: "노릇노릇바디", - description: "불꽃타입 기술로 공격받으면 데미지를 입지 않고 방어가 크게 올라간다." - }, - windRider: { - name: "바람타기", - description: "순풍이 불거나 바람 기술로 공격받으면 데미지를 받지 않고 공격이 올라간다." - }, - guardDog: { - name: "파수견", - description: "위협을 받으면 공격이 올라간다. 포켓몬을 교체시키는 기술이나 도구의 효과를 받지 않는다." - }, - rockyPayload: { - name: "바위나르기", - description: "바위타입 기술의 위력이 올라간다." - }, - windPower: { - name: "풍력발전", - description: "바람 기술로 공격받으면 충전 상태가 된다." - }, - zeroToHero: { - name: "마이티체인지", - description: "지닌 포켓몬으로 돌아오면 마이티폼으로 변한다." - }, - commander: { - name: "사령탑", - description: "등장했을 때 같은 편에 어써러셔가 있으면 입속에 들어가 안에서 지시를 내린다." - }, - electromorphosis: { - name: "전기로바꾸기", - description: "데미지를 받으면 충전 상태가 된다." - }, - protosynthesis: { - name: "고대활성", - description: "부스트에너지를 지니고 있거나 날씨가 맑을 때 가장 높은 능력이 올라간다." - }, - quarkDrive: { - name: "쿼크차지", - description: "부스트에너지를 지니고 있거나 일렉트릭필드일 때 가장 높은 능력이 올라간다." - }, - goodAsGold: { - name: "황금몸", - description: "산화하지 않는 튼튼한 황금몸 덕분에 상대의 변화 기술의 영향을 받지 않는다." - }, - vesselOfRuin: { - name: "재앙의그릇", - description: "재앙을 부르는 그릇의 힘으로 자신을 제외한 모든 포켓몬의 특수 공격을 약하게 만든다." - }, - swordOfRuin: { - name: "재앙의검", - description: "재앙을 부르는 검의 힘으로 자신을 제외한 모든 포켓몬의 방어를 약하게 만든다." - }, - tabletsOfRuin: { - name: "재앙의목간", - description: "재앙을 부르는 목간의 힘으로 자신을 제외한 모든 포켓몬의 공격을 약하게 만든다." - }, - beadsOfRuin: { - name: "재앙의구슬", - description: "재앙을 부르는 곡옥의 힘으로 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다." - }, - orichalcumPulse: { - name: "진홍빛고동", - description: "등장했을 때 날씨를 맑음으로 만든다. 햇살이 강하면 고대의 고동에 의해 공격이 강화된다." - }, - hadronEngine: { - name: "하드론엔진", - description: "등장했을 때 일렉트릭필드를 전개한다. 일렉트릭필드일 때 미래 기관에 의해 특수공격이 강화된다." - }, - opportunist: { - name: "편승", - description: "상대의 능력이 올라가면 자신도 편승해서 똑같이 자신도 올린다." - }, - cudChew: { - name: "되새김질", - description: "한 번에 한하여 나무열매를 먹으면 다음 턴이 끝날 때 위에서 꺼내서 또 먹는다." - }, - sharpness: { - name: "예리함", - description: "상대를 베는 기술의 위력이 올라간다." - }, - supremeOverlord: { - name: "총대장", - description: "등장했을 때 지금까지 쓰러진 같은 편의 수가 많을수록 조금씩 공격과 특수공격이 올라간다." - }, - costar: { - name: "협연", - description: "등장했을 때 같은 편의 능력 변화를 복사한다." - }, - toxicDebris: { - name: "독치장", - description: "물리 기술로 데미지를 받으면 상대의 발밑에 독압정을 뿌린다." - }, - armorTail: { - name: "테일아머", - description: "머리를 감싸고 있는 수수께끼의 꼬리가 이쪽을 향한 선제 기술을 사용할 수 없게 한다." - }, - earthEater: { - name: "흙먹기", - description: "땅타입의 기술로 공격받으면 데미지를 받지 않고 회복한다." - }, - myceliumMight: { - name: "균사의힘", - description: "변화 기술을 사용할 때 반드시 행동이 느려지지만 상대 특성에 방해받지 않는다." - }, - mindsEye: { - name: "심안", - /* 축약 있음 */ - description: "노말타입과 격투타입 기술을 고스트타입에게 맞힐 수 있다. 상대의 회피율 변화를 무시하고 명중률도 떨어지지 않는다." - }, - supersweetSyrup: { - name: "감미로운꿀", - description: "처음 등장했을 때 감미로운 꿀의 향기를 흩뿌려서 상대의 회피율을 떨어뜨린다." - }, - hospitality: { - name: "대접", - description: "등장했을 때 같은 편을 대접해서 HP를 조금 회복시킨다." - }, - toxicChain: { - name: "독사슬", - description: "독소를 머금은 사슬의 힘으로 기술에 맞은 상대를 맹독 상태로 만들 때가 있다." - }, - embodyAspectTeal: { - name: "초상투영", - description: "마음속에 깃든 추억의 힘으로 벽록의가면을 빛나게 하여 자신의 스피드를 올린다." - }, - embodyAspectWellspring: { - name: "초상투영", - description: "마음속에 깃든 추억의 힘으로 우물의가면을 빛나게 하여 자신의 특수방어를 올린다." - }, - embodyAspectHearthflame: { - name: "초상투영", - description: "마음속에 깃든 추억의 힘으로 화덕의가면을 빛나게 하여 자신의 공격력을 올린다." - }, - embodyAspectCornerstone: { - name: "초상투영", - description: "마음속에 깃든 추억의 힘으로 주춧돌의가면을 빛나게 하여 자신의 방어력을 올린다." - }, - teraShift: { - name: "테라체인지", - description: "등장했을 때 주위의 에너지를 흡수하여 테라스탈폼으로 변한다." - }, - teraShell: { - name: "테라셸", - description: "모든 타입의 힘이 담긴 등껍질이 HP가 꽉 찼을 때 받는 데미지를 모두 효과가 별로이게 만든다." - }, - teraformZero: { - name: "제로포밍", - description: "테라파고스가 스텔라폼이 되었을 때 숨겨진 힘에 의해 날씨와 필드의 영향을 모두 무효로 만든다." - }, - poisonPuppeteer: { - name: "독조종", - description: "복숭악동의 기술에 의해 독 상태가 된 상대는 혼란 상태도 되어 버린다." - }, -} as const; diff --git a/src/locales/ko/achv.json b/src/locales/ko/achv.json new file mode 100644 index 00000000000..9364c1c55b6 --- /dev/null +++ b/src/locales/ko/achv.json @@ -0,0 +1,268 @@ +{ + "Achievements": { + "name": "업적" + }, + "Locked": { + "name": "미완료" + }, + "MoneyAchv": { + "description": "누적 소지금 ₽{{moneyAmount}} 달성" + }, + "10K_MONEY": { + "name": "돈 좀 있나?" + }, + "100K_MONEY": { + "name": "부자" + }, + "1M_MONEY": { + "name": "백만장자" + }, + "10M_MONEY": { + "name": "상위 1프로" + }, + "DamageAchv": { + "description": "한 번의 공격만으로 {{damageAmount}} 데미지" + }, + "250_DMG": { + "name": "강타자" + }, + "1000_DMG": { + "name": "최강타자" + }, + "2500_DMG": { + "name": "때릴 줄 아시는군요!" + }, + "10000_DMG": { + "name": "원펀맨" + }, + "HealAchv": { + "description": "기술이나 특성, 지닌 도구로 한 번에 {{healAmount}} {{HP}} 회복" + }, + "250_HEAL": { + "name": "견습 힐러" + }, + "1000_HEAL": { + "name": "상급 힐러" + }, + "2500_HEAL": { + "name": "클레릭" + }, + "10000_HEAL": { + "name": "회복 마스터" + }, + "LevelAchv": { + "description": "포켓몬 Lv{{level}} 달성" + }, + "LV_100": { + "name": "잠깐, 여기가 끝이 아니라구!" + }, + "LV_250": { + "name": "엘리트" + }, + "LV_1000": { + "name": "더 먼 곳을 향해" + }, + "RibbonAchv": { + "description": "총 {{ribbonAmount}}개의 리본 획득" + }, + "10_RIBBONS": { + "name": "포켓몬 리그 챔피언" + }, + "25_RIBBONS": { + "name": "슈퍼 리그 챔피언" + }, + "50_RIBBONS": { + "name": "하이퍼 리그 챔피언" + }, + "75_RIBBONS": { + "name": "로그 리그 챔피언" + }, + "100_RIBBONS": { + "name": "마스터 리그 챔피언" + }, + "TRANSFER_MAX_STAT_STAGE": { + "name": "팀워크", + "description": "한 개 이상의 능력치가 최대 랭크일 때 배턴터치 사용" + }, + "MAX_FRIENDSHIP": { + "name": "친밀 맥스", + "description": "최대 친밀도 달성" + }, + "MEGA_EVOLVE": { + "name": "메가변환", + "description": "포켓몬을 메가진화" + }, + "GIGANTAMAX": { + "name": "엄청난 것", + "description": "포켓몬을 다이맥스" + }, + "TERASTALLIZE": { + "name": "반짝반짝", + "description": "포켓몬을 테라스탈" + }, + "STELLAR_TERASTALLIZE": { + "name": "숨겨진 타입", + "description": "포켓몬을 스텔라 테라스탈" + }, + "SPLICE": { + "name": "끝없는 융합", + "description": "유전자쐐기로 두 포켓몬을 융합" + }, + "MINI_BLACK_HOLE": { + "name": "도구가 가득한 구멍", + "description": "미니 블랙홀 획득" + }, + "CATCH_MYTHICAL": { + "name": "환상", + "description": "환상의 포켓몬 포획" + }, + "CATCH_SUB_LEGENDARY": { + "name": "(준)전설", + "description": "준전설 포켓몬 포획" + }, + "CATCH_LEGENDARY": { + "name": "전설", + "description": "전설의 포켓몬 포획" + }, + "SEE_SHINY": { + "name": "다른 색", + "description": "야생의 색이 다른 포켓몬 발견" + }, + "SHINY_PARTY": { + "name": "찐사랑", + "description": "색이 다른 포켓몬만으로 파티 구성" + }, + "HATCH_MYTHICAL": { + "name": "환상의 알", + "description": "알에서 환상의 포켓몬이 부화" + }, + "HATCH_SUB_LEGENDARY": { + "name": "준전설 알", + "description": "알에서 준전설 포켓몬이 부화" + }, + "HATCH_LEGENDARY": { + "name": "전설의 알", + "description": "알에서 전설의 포켓몬이 부화" + }, + "HATCH_SHINY": { + "name": "빛나는 알", + "description": "알에서 색이 다른 포켓몬이 부화" + }, + "HIDDEN_ABILITY": { + "name": "숨은 잠재력", + "description": "숨겨진 특성을 지닌 포켓몬을 포획" + }, + "PERFECT_IVS": { + "name": "진짜배기 증명서", + "description": "최고의 개체값을 지닌 포켓몬 획득" + }, + "CLASSIC_VICTORY": { + "name": "무패", + "description": "클래식 모드 클리어" + }, + "UNEVOLVED_CLASSIC_VICTORY": { + "name": "우리집 꿈나무", + "description": "최종 진화형이 아닌 포켓몬을 데리고 클래식 모드 클리어." + }, + "MONO_GEN_ONE": { + "name": "근본 라이벌", + "description": "1세대 챌린지 모드 클리어." + }, + "MONO_GEN_TWO": { + "name": "이거 1.5세대죠?", + "description": "2세대 챌린지 모드 클리어." + }, + "MONO_GEN_THREE": { + "name": "Too much water?", + "description": "3세대 챌린지 모드 클리어." + }, + "MONO_GEN_FOUR": { + "name": "난천이 진짜 최강인가요?", + "description": "4세대 챌린지 모드 클리어." + }, + "MONO_GEN_FIVE": { + "name": "100% 오리지널!", + "description": "5세대 챌린지 모드 클리어." + }, + "MONO_GEN_SIX": { + "name": "크루아상 안에 뭐 들었나요?", + "description": "6세대 챌린지 모드 클리어." + }, + "MONO_GEN_SEVEN": { + "name": "기술적으로는…", + "description": "7세대 챌린지 모드 클리어." + }, + "MONO_GEN_EIGHT": { + "name": "챔피언 타임!", + "description": "8세대 챌린지 모드 클리어." + }, + "MONO_GEN_NINE": { + "name": "걔, 봐 준 거야", + "description": "9세대 챌린지 모드 클리어." + }, + "MonoType": { + "description": "{{type}} 타입 챌린지 모드 클리어." + }, + "MONO_NORMAL": { + "name": "심플한 것이 가장 강한 것" + }, + "MONO_FIGHTING": { + "name": "태권도 할 줄 알아요" + }, + "MONO_FLYING": { + "name": "추락하는 것은 날개가 있다" + }, + "MONO_POISON": { + "name": "관동 지방 최애 타입" + }, + "MONO_GROUND": { + "name": "전기 안 통해요" + }, + "MONO_ROCK": { + "name": "웅골참" + }, + "MONO_BUG": { + "name": "독침붕처럼 쏴라" + }, + "MONO_GHOST": { + "name": "무서운 게 딱 좋아!" + }, + "MONO_STEEL": { + "name": "강철 심장" + }, + "MONO_FIRE": { + "name": "불타오르네" + }, + "MONO_WATER": { + "name": "물 들어올 때 노 젓기" + }, + "MONO_GRASS": { + "name": "초록은 동색" + }, + "MONO_ELECTRIC": { + "name": "찌릿찌릿" + }, + "MONO_PSYCHIC": { + "name": "1세대 최강" + }, + "MONO_ICE": { + "name": "얼음땡" + }, + "MONO_DRAGON": { + "name": "용용 죽겠지" + }, + "MONO_DARK": { + "name": "어둠의 다크" + }, + "MONO_FAIRY": { + "name": "설마 자시안으로?" + }, + "FRESH_START": { + "name": "첫트!", + "description": "새 출발 챌린지 모드 클리어." + }, + "INVERSE_BATTLE": { + "name": "상성 전문가(였던 것)", + "description": "거꾸로 배틀 챌린지 모드 클리어." + } +} diff --git a/src/locales/ko/achv.ts b/src/locales/ko/achv.ts deleted file mode 100644 index d8b8cc54f66..00000000000 --- a/src/locales/ko/achv.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "Achievements": { - name: "업적", - }, - "Locked": { - name: "미완료", - }, - - "MoneyAchv": { - description: "누적 소지금 ₽{{moneyAmount}} 달성", - }, - "10K_MONEY": { - name: "돈 좀 있나?", - }, - "100K_MONEY": { - name: "부자", - }, - "1M_MONEY": { - name: "백만장자", - }, - "10M_MONEY": { - name: "상위 1프로", - }, - - "DamageAchv": { - description: "한 번의 공격만으로 {{damageAmount}} 데미지", - }, - "250_DMG": { - name: "강타자", - }, - "1000_DMG": { - name: "최강타자", - }, - "2500_DMG": { - name: "때릴 줄 아시는군요!", - }, - "10000_DMG": { - name: "원펀맨", - }, - - "HealAchv": { - description: "기술이나 특성, 지닌 도구로 한 번에 {{healAmount}} {{HP}} 회복", - }, - "250_HEAL": { - name: "견습 힐러", - }, - "1000_HEAL": { - name: "상급 힐러", - }, - "2500_HEAL": { - name: "클레릭", - }, - "10000_HEAL": { - name: "회복 마스터", - }, - - "LevelAchv": { - description: "포켓몬 Lv{{level}} 달성", - }, - "LV_100": { - name: "잠깐, 여기가 끝이 아니라구!", - }, - "LV_250": { - name: "엘리트", - }, - "LV_1000": { - name: "더 먼 곳을 향해", - }, - - "RibbonAchv": { - description: "총 {{ribbonAmount}}개의 리본 획득", - }, - "10_RIBBONS": { - name: "포켓몬 리그 챔피언", - }, - "25_RIBBONS": { - name: "슈퍼 리그 챔피언", - }, - "50_RIBBONS": { - name: "하이퍼 리그 챔피언", - }, - "75_RIBBONS": { - name: "로그 리그 챔피언", - }, - "100_RIBBONS": { - name: "마스터 리그 챔피언", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "팀워크", - description: "한 개 이상의 능력치가 최대 랭크일 때 배턴터치 사용", - }, - "MAX_FRIENDSHIP": { - name: "친밀 맥스", - description: "최대 친밀도 달성", - }, - "MEGA_EVOLVE": { - name: "메가변환", - description: "포켓몬을 메가진화", - }, - "GIGANTAMAX": { - name: "엄청난 것", - description: "포켓몬을 다이맥스", - }, - "TERASTALLIZE": { - name: "반짝반짝", - description: "포켓몬을 테라스탈", - }, - "STELLAR_TERASTALLIZE": { - name: "숨겨진 타입", - description: "포켓몬을 스텔라 테라스탈", - }, - "SPLICE": { - name: "끝없는 융합", - description: "유전자쐐기로 두 포켓몬을 융합", - }, - "MINI_BLACK_HOLE": { - name: "도구가 가득한 구멍", - description: "미니 블랙홀 획득", - }, - "CATCH_MYTHICAL": { - name: "환상", - description: "환상의 포켓몬 포획", - }, - "CATCH_SUB_LEGENDARY": { - name: "(준)전설", - description: "준전설 포켓몬 포획", - }, - "CATCH_LEGENDARY": { - name: "전설", - description: "전설의 포켓몬 포획", - }, - "SEE_SHINY": { - name: "다른 색", - description: "야생의 색이 다른 포켓몬 발견", - }, - "SHINY_PARTY": { - name: "찐사랑", - description: "색이 다른 포켓몬만으로 파티 구성", - }, - "HATCH_MYTHICAL": { - name: "환상의 알", - description: "알에서 환상의 포켓몬이 부화", - }, - "HATCH_SUB_LEGENDARY": { - name: "준전설 알", - description: "알에서 준전설 포켓몬이 부화", - }, - "HATCH_LEGENDARY": { - name: "전설의 알", - description: "알에서 전설의 포켓몬이 부화", - }, - "HATCH_SHINY": { - name: "빛나는 알", - description: "알에서 색이 다른 포켓몬이 부화", - }, - "HIDDEN_ABILITY": { - name: "숨은 잠재력", - description: "숨겨진 특성을 지닌 포켓몬을 포획", - }, - "PERFECT_IVS": { - name: "진짜배기 증명서", - description: "최고의 개체값을 지닌 포켓몬 획득", - }, - "CLASSIC_VICTORY": { - name: "무패", - description: "클래식 모드 클리어", - }, - - "MONO_GEN_ONE": { - name: "근본 라이벌", - description: "1세대 챌린지 모드 클리어.", - }, - "MONO_GEN_TWO": { - name: "이거 1.5세대죠?", - description: "2세대 챌린지 모드 클리어.", - }, - "MONO_GEN_THREE": { - name: "Too much water?", - description: "3세대 챌린지 모드 클리어.", - }, - "MONO_GEN_FOUR": { - name: "난천이 진짜 최강인가요?", - description: "4세대 챌린지 모드 클리어.", - }, - "MONO_GEN_FIVE": { - name: "100% 오리지널!", - description: "5세대 챌린지 모드 클리어.", - }, - "MONO_GEN_SIX": { - name: "크루아상 안에 뭐 들었나요?", - description: "6세대 챌린지 모드 클리어.", - }, - "MONO_GEN_SEVEN": { - name: "기술적으로는…", - description: "7세대 챌린지 모드 클리어.", - }, - "MONO_GEN_EIGHT": { - name: "챔피언 타임!", - description: "8세대 챌린지 모드 클리어.", - }, - "MONO_GEN_NINE": { - name: "걔, 봐 준 거야", - description: "9세대 챌린지 모드 클리어.", - }, - - "MonoType": { - description: "{{type}} 타입 챌린지 모드 클리어.", - }, - "MONO_NORMAL": { - name: "심플한 것이 가장 강한 것", - }, - "MONO_FIGHTING": { - name: "태권도 할 줄 알아요", - }, - "MONO_FLYING": { - name: "추락하는 것은 날개가 있다", - }, - "MONO_POISON": { - name: "관동 지방 최애 타입", - }, - "MONO_GROUND": { - name: "전기 안 통해요", - }, - "MONO_ROCK": { - name: "웅골참", - }, - "MONO_BUG": { - name: "독침붕처럼 쏴라", - }, - "MONO_GHOST": { - name: "누굴 부를 거야?", - }, - "MONO_STEEL": { - name: "강철 심장", - }, - "MONO_FIRE": { - name: "불타오르네", - }, - "MONO_WATER": { - name: "물 들어올 때 노 젓기", - }, - "MONO_GRASS": { - name: "초록은 동색", - }, - "MONO_ELECTRIC": { - name: "찌릿찌릿", - }, - "MONO_PSYCHIC": { - name: "1세대 최강", - }, - "MONO_ICE": { - name: "얼음땡", - }, - "MONO_DRAGON": { - name: "용용 죽겠지", - }, - "MONO_DARK": { - name: "어둠의 다크", - }, - "MONO_FAIRY": { - name: "설마 자시안으로?", - }, -} as const; - -// Achievement translations for the when the player character is female (it for now uses the same translations as the male version) -export const PGFachv: AchievementTranslationEntries = PGMachv; diff --git a/src/locales/ko/arena-flyout.json b/src/locales/ko/arena-flyout.json new file mode 100644 index 00000000000..e4b271691a5 --- /dev/null +++ b/src/locales/ko/arena-flyout.json @@ -0,0 +1,41 @@ +{ + "activeBattleEffects": "배틀 효과 상태", + "player": "플레이어", + "neutral": "공통", + "enemy": "상대", + "sunny": "쾌청", + "rain": "비", + "sandstorm": "모래바람", + "hail": "싸라기눈", + "snow": "눈", + "fog": "안개", + "heavyRain": "강한 비", + "harshSun": "강한 쾌청", + "strongWinds": "난기류", + "misty": "미스트필드", + "electric": "일렉트릭필드", + "grassy": "그래스필드", + "psychic": "사이코필드", + "mudSport": "흙놀이", + "waterSport": "물놀이", + "spikes": "압정", + "toxicSpikes": "독압정", + "mist": "흰안개", + "futureSight": "미래예지", + "doomDesire": "파멸의소원", + "wish": "희망사항", + "stealthRock": "스텔스록", + "stickyWeb": "끈적끈적네트", + "trickRoom": "트릭룸", + "gravity": "중력", + "reflect": "리플렉터", + "lightScreen": "빛의장막", + "auroraVeil": "오로라베일", + "quickGuard": "패스트가드", + "wideGuard": "와이드가드", + "matBlock": "마룻바닥세워막기", + "craftyShield": "트릭가드", + "tailwind": "순풍", + "happyHour": "해피타임", + "safeguard": "신비의부적" +} diff --git a/src/locales/ko/arena-tag.json b/src/locales/ko/arena-tag.json new file mode 100644 index 00000000000..ce9922ab3bf --- /dev/null +++ b/src/locales/ko/arena-tag.json @@ -0,0 +1,57 @@ +{ + "yourTeam": "우리 편", + "opposingTeam": "상대 편", + "arenaOnRemove": "{{moveName}}의 효과가 사라졌다!", + "arenaOnRemovePlayer": "우리 편 {{moveName}}의\n효과가 사라졌다!", + "arenaOnRemoveEnemy": "상대 편 {{moveName}}의\n효과가 사라졌다!", + "mistOnAdd": "{{pokemonNameWithAffix}} 편은\n흰안개에 둘러싸였다!", + "mistApply": "흰안개의 효과로\n능력은 떨어지지 않는다!", + "reflectOnAdd": "리플렉터로\n물리공격에 강해졌다!", + "reflectOnAddPlayer": "우리 편은 리플렉터로\n물리공격에 강해졌다!", + "reflectOnAddEnemy": "상대는 리플렉터로\n물리공격에 강해졌다!", + "lightScreenOnAdd": "빛의장막으로\n특수공격에 강해졌다!", + "lightScreenOnAddPlayer": "우리 편은 빛의장막으로\n특수공격에 강해졌다!", + "lightScreenOnAddEnemy": "상대는 빛의장막으로\n특수공격에 강해졌다!", + "auroraVeilOnAdd": "오로라베일로\n물리공격과 특수공격에 강해졌다!", + "auroraVeilOnAddPlayer": "우리 편은 오로라베일로\n물리공격과 특수공격에 강해졌다!", + "auroraVeilOnAddEnemy": "상대는 오로라베일로\n물리공격과 특수공격에 강해졌다!", + "conditionalProtectOnAdd": "팀을\n{{moveName}}[[가]] 보호하고 있다!", + "conditionalProtectOnAddPlayer": "우리 편 주변을\n{{moveName}}[[가]] 보호하고 있다!", + "conditionalProtectOnAddEnemy": "상대 주변을\n{{moveName}}[[가]] 보호하고 있다!", + "conditionalProtectApply": "{{pokemonNameWithAffix}}[[를]]\n{{moveName}}[[가]] 지켜주고 있다!", + "matBlockOnAdd": "{{pokemonNameWithAffix}}[[는]]\n마룻바닥세워막기를 노리고 있다!", + "noCritOnAddPlayer": "{{moveName}}의 힘으로\n우리 편의 급소가 숨겨졌다!", + "noCritOnAddEnemy": "{{moveName}}의 힘으로\n상대의 급소가 숨겨졌다!", + "noCritOnRemove": "{{pokemonNameWithAffix}}의 {{moveName}}[[가]] 풀렸다!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}의\n희망사항이 이루어졌다!", + "mudSportOnAdd": "전기의 위력이 약해졌다!", + "mudSportOnRemove": "흙놀이의 효과가\n없어졌다!", + "waterSportOnAdd": "불꽃의 위력이 약해졌다!", + "waterSportOnRemove": "물놀이의 효과가\n없어졌다!", + "spikesOnAdd": "{{opponentDesc}}의 발밑에\n압정이 뿌려졌다!", + "spikesActivateTrap": "{{pokemonNameWithAffix}}[[는]]\n압정뿌리기의 데미지를 입었다!", + "toxicSpikesOnAdd": "{{opponentDesc}}의 발밑에\n독압정이 뿌려졌다!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}[[를]] 흡수했다!", + "stealthRockOnAdd": "{{opponentDesc}} 주변에\n뾰족한 바위가 떠다니기 시작했다!!", + "stealthRockActivateTrap": "{{pokemonNameWithAffix}}에게\n뾰족한 바위가 박혔다!", + "stickyWebOnAdd": "{{opponentDesc}} 발밑에\n{{moveName}}[[가]] 펼쳐졌다!", + "stickyWebActivateTrap": "{{pokemonName}}[[는]]\n끈적끈적네트에 걸렸다!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}}[[는]]\n시공을 뒤틀었다!", + "trickRoomOnRemove": "뒤틀린 시공이 원래대로 되돌아왔다!", + "gravityOnAdd": "중력이 강해졌다!", + "gravityOnRemove": "중력이 원래대로 되돌아왔다!", + "tailwindOnAdd": "순풍이 불기 시작했다!", + "tailwindOnAddPlayer": "우리 편에게\n순풍이 불기 시작했다!", + "tailwindOnAddEnemy": "상대에게\n순풍이 불기 시작했다!", + "tailwindOnRemove": "순풍이 멈췄다!", + "tailwindOnRemovePlayer": "우리 편의\n순풍이 멈췄다!", + "tailwindOnRemoveEnemy": "상대의\n순풍이 멈췄다!", + "happyHourOnAdd": "모두 행복한 기분에\n휩싸였다!", + "happyHourOnRemove": "기분이 원래대로 돌아왔다.", + "safeguardOnAdd": "필드 전체가 신비의 베일에 둘러싸였다!", + "safeguardOnAddPlayer": "우리 편은 신비의 베일에 둘러싸였다!", + "safeguardOnAddEnemy": "상대 편은 신비의 베일에 둘러싸였다!", + "safeguardOnRemove": "필드를 감싸던 신비의 베일이 없어졌다!", + "safeguardOnRemovePlayer": "우리 편을 감싸던 신비의 베일이 없어졌다!", + "safeguardOnRemoveEnemy": "상대 편을 감싸던 신비의 베일이 없어졌다!" +} \ No newline at end of file diff --git a/src/locales/ko/battle-info.json b/src/locales/ko/battle-info.json new file mode 100644 index 00000000000..8f95af52b20 --- /dev/null +++ b/src/locales/ko/battle-info.json @@ -0,0 +1,3 @@ +{ + "generation": "{{generation}}" +} \ No newline at end of file diff --git a/src/locales/ko/battle-message-ui-handler.json b/src/locales/ko/battle-message-ui-handler.json new file mode 100644 index 00000000000..b1ffecf75e5 --- /dev/null +++ b/src/locales/ko/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "최고", + "ivFantastic": "훌륭하다", + "ivVeryGood": "굉장히 좋다", + "ivPrettyGood": "상당히 좋다", + "ivDecent": "적당하다", + "ivNoGood": "별로인 듯" +} \ No newline at end of file diff --git a/src/locales/ko/battle-message-ui-handler.ts b/src/locales/ko/battle-message-ui-handler.ts deleted file mode 100644 index fdd79044090..00000000000 --- a/src/locales/ko/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "최고", - "ivFantastic": "훌륭하다", - "ivVeryGood": "굉장히 좋다", - "ivPrettyGood": "상당히 좋다", - "ivDecent": "적당하다", - "ivNoGood": "별로인 듯", -} as const; diff --git a/src/locales/ko/battle-scene.json b/src/locales/ko/battle-scene.json new file mode 100644 index 00000000000..a0288475d69 --- /dev/null +++ b/src/locales/ko/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/ko/battle.json b/src/locales/ko/battle.json new file mode 100644 index 00000000000..fd715fd0e7e --- /dev/null +++ b/src/locales/ko/battle.json @@ -0,0 +1,99 @@ +{ + "bossAppeared": "{{bossName}}[[가]] 나타났다.", + "trainerAppeared": "{{trainerName}}[[가]]\n승부를 걸어왔다!", + "trainerAppearedDouble": "{{trainerName}}[[가]]\n승부를 걸어왔다!", + "trainerSendOut": "{{trainerName}}[[는]]\n{{pokemonName}}[[를]] 내보냈다!", + "singleWildAppeared": "앗! 야생 {{pokemonName}}[[가]]\n튀어나왔다!", + "multiWildAppeared": "야생 {{pokemonName1}}[[와]]\n{{pokemonName2}}[[가]] 튀어나왔다!", + "playerComeBack": "돌아와, {{pokemonName}}!", + "trainerComeBack": "{{trainerName}}[[는]] {{pokemonName}}[[를]] 넣어버렸다!", + "playerGo": "가랏! {{pokemonName}}!", + "trainerGo": "{{trainerName}}[[는]] {{pokemonName}}[[를]] 내보냈다!", + "switchQuestion": "{{pokemonName}}[[를]]\n교체하시겠습니까?", + "trainerDefeated": "{{trainerName}}[[와]]의\n승부에서 이겼다!", + "moneyWon": "상금으로\n₽{{moneyAmount}}을 손에 넣었다!", + "moneyPickedUp": "₽{{moneyAmount}}을 주웠다!", + "pokemonCaught": "신난다-!\n{{pokemonName}}[[를]] 잡았다!", + "addedAsAStarter": "{{pokemonName}}[[가]]\n스타팅 포켓몬에 추가되었다!", + "partyFull": "지닌 포켓몬이 가득 찼습니다. {{pokemonName}}[[를]]\n대신해 포켓몬을 놓아주시겠습니까?", + "pokemon": "포켓몬", + "sendOutPokemon": "가랏! {{pokemonName}}!", + "hitResultCriticalHit": "급소에 맞았다!", + "hitResultSuperEffective": "효과가 굉장했다!", + "hitResultNotVeryEffective": "효과가 별로인 듯하다…", + "hitResultNoEffect": "{{pokemonName}}에게는\n효과가 없는 것 같다…", + "hitResultImmune": "{{pokemonName}}에게는\n전혀 효과가 없다!", + "hitResultOneHitKO": "일격필살!", + "attackFailed": "그러나 실패하고 말았다!!", + "attackMissed": "{{pokemonNameWithAffix}}에게는\n맞지 않았다!", + "attackHitsCount": "{{count}}번 맞았다!", + "rewardGain": "{{modifierName}}[[를]] 받았다!", + "expGain": "{{pokemonName}}[[는]]\n{{exp}} 경험치를 얻었다!", + "levelUp": "{{pokemonName}}[[는]]\n레벨 {{level}}[[로]] 올랐다!", + "learnMove": "{{pokemonName}}[[는]] 새로\n{{moveName}}[[를]] 배웠다!", + "learnMovePrompt": "{{pokemonName}}[[는]] 새로\n{{moveName}}[[를]] 배우고 싶다!…", + "learnMoveLimitReached": "그러나 {{pokemonName}}[[는]] 기술을 4개\n알고 있으므로 더 이상 배울 수 없다!", + "learnMoveReplaceQuestion": "{{moveName}} 대신 다른 기술을 잊게 하겠습니까?", + "learnMoveStopTeaching": "그럼… {{moveName}}[[를]]\n배우는 것을 포기하겠습니까?", + "learnMoveNotLearned": "{{pokemonName}}[[는]] {{moveName}}[[를]]\n결국 배우지 않았다!", + "learnMoveForgetQuestion": "어느 기술을 잊게 하고싶은가?", + "learnMoveForgetSuccess": "{{pokemonName}}[[는]] {{moveName}}[[를]] 깨끗이 잊었다!", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}… @d{15}… @d{30}@s{se/pb_bounce_1}짠!", + "learnMoveAnd": "그리고…", + "levelCapUp": "레벨의 최대치가\n{{levelCap}}까지 상승했다!", + "moveNotImplemented": "{{moveName}}[[는]] 아직 구현되지 않아 사용할 수 없다…", + "moveNoPP": "기술의 남은 포인트가 없다!", + "moveDisabled": "{{moveName}}[[를]] 쓸 수 없다!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다.", + "noPokeballForce": "본 적 없는 힘이\n볼을 사용하지 못하게 한다.", + "noPokeballTrainer": "다른 트레이너의 포켓몬은 잡을 수 없다!", + "noPokeballMulti": "안돼! 2마리 있어서\n목표를 정할 수가 없어…!", + "noPokeballStrong": "너무 강해서 잡을 수가 없다!\n먼저 약화시켜야 한다!", + "noEscapeForce": "본 적 없는 힘이\n도망칠 수 없게 한다.", + "noEscapeTrainer": "안돼! 승부 도중에\n상대에게 등을 보일 순 없어!", + "noEscapePokemon": "{{pokemonName}}의 {{moveName}}때문에\n{{escapeVerb}} 수 없다!", + "runAwaySuccess": "무사히 도망쳤다!", + "runAwayCannotEscape": "도망칠 수 없었다!", + "escapeVerbSwitch": "교체할", + "escapeVerbFlee": "도망칠", + "notDisabled": "{{pokemonName}}의\n{{moveName}} 사슬묶기가 풀렸다!", + "turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!", + "hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!", + "skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?", + "itemStackFull": "{{fullItemName}}의 소지 한도에 도달했습니다.\n{{itemname}}[[를]] 대신 받습니다.", + "eggHatching": "어라…?", + "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", + "wildPokemonWithAffix": "야생 {{pokemonName}}", + "foePokemonWithAffix": "상대 {{pokemonName}}", + "useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!", + "drainMessage": "{{pokemonName}}[[로]]부터\n체력을 흡수했다!", + "stealEatBerry": "{{pokemonName}}[[가]]\n{{targetName}}의 {{berryName}}[[를]] 빼앗아 먹었다!", + "ppHealBerry": "{{pokemonNameWithAffix}}[[는]] {{berryName}}[[로]]\n{{moveName}}의 PP를 회복했다!", + "hpHealBerry": "{{pokemonNameWithAffix}}[[는]] {{berryName}}[[로]]\n체력을 회복했다!", + "regainHealth": "{{pokemonName}}[[는]]\n체력을 회복했다!", + "fainted": "{{pokemonNameWithAffix}}[[는]] 쓰러졌다!", + "statsAnd": "그리고", + "stats": "스테이터스", + "statRose_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", + "statRose_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", + "statSharplyRose_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", + "statRoseDrastically_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", + "statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", + "statFell_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", + "statFell_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", + "statHarshlyFell_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", + "statSeverelyFell_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", + "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "retryBattle": "이 배틀의 처음부터 재도전하시겠습니까?", + "unlockedSomething": "{{unlockedThing}}[[가]]\n해금되었다.", + "congratulations": "축하합니다!", + "beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!", + "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!" +} diff --git a/src/locales/ko/battle.ts b/src/locales/ko/battle.ts deleted file mode 100644 index e9bfb7cb307..00000000000 --- a/src/locales/ko/battle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "{{bossName}}[[가]] 나타났다.", - "trainerAppeared": "{{trainerName}}[[가]]\n승부를 걸어왔다!", - "trainerAppearedDouble": "{{trainerName}}[[가]]\n승부를 걸어왔다!", - "trainerSendOut": "{{trainerName}}[[는]]\n{{pokemonName}}[[를]] 내보냈다!", - "singleWildAppeared": "앗! 야생 {{pokemonName}}[[가]]\n튀어나왔다!", - "multiWildAppeared": "야생 {{pokemonName1}}[[와]]\n{{pokemonName2}}[[가]] 튀어나왔다!", - "playerComeBack": "돌아와, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}}[[는]] {{pokemonName}}[[를]] 넣어버렸다!", - "playerGo": "가랏! {{pokemonName}}!", - "trainerGo": "{{trainerName}}[[는]] {{pokemonName}}[[를]] 내보냈다!", - "switchQuestion": "{{pokemonName}}[[를]]\n교체하시겠습니까?", - "trainerDefeated": "{{trainerName}}[[와]]의\n승부에서 이겼다!", - "moneyWon": "상금으로\n₽{{moneyAmount}}을 손에 넣었다!", - "pokemonCaught": "신난다-!\n{{pokemonName}}[[를]] 잡았다!", - "addedAsAStarter": "{{pokemonName}}[[가]]\n스타팅 포켓몬에 추가되었다!", - "partyFull": "지닌 포켓몬이 가득 찼습니다. {{pokemonName}}[[를]]\n대신해 포켓몬을 놓아주시겠습니까?", - "pokemon": "포켓몬", - "sendOutPokemon": "가랏! {{pokemonName}}!", - "hitResultCriticalHit": "급소에 맞았다!", - "hitResultSuperEffective": "효과가 굉장했다!", - "hitResultNotVeryEffective": "효과가 별로인 듯하다…", - "hitResultNoEffect": "{{pokemonName}}에게는\n효과가 없는 것 같다…", - "hitResultOneHitKO": "일격필살!", - "attackFailed": "하지만 실패했다!", - "attackHitsCount": "{{count}}번 맞았다!", - "rewardGain": "{{modifierName}}[[를]] 받았다!", - "expGain": "{{pokemonName}}[[는]]\n{{exp}} 경험치를 얻었다!", - "levelUp": "{{pokemonName}}[[는]]\n레벨 {{level}}[[로]] 올랐다!", - "learnMove": "{{pokemonName}}[[는]] 새로\n{{moveName}}[[를]] 배웠다!", - "learnMovePrompt": "{{pokemonName}}[[는]] 새로\n{{moveName}}[[를]] 배우고 싶다!…", - "learnMoveLimitReached": "그러나 {{pokemonName}}[[는]] 기술을 4개\n알고 있으므로 더 이상 배울 수 없다!", - "learnMoveReplaceQuestion": "{{moveName}} 대신 다른 기술을 잊게 하겠습니까?", - "learnMoveStopTeaching": "그럼… {{moveName}}[[를]]\n배우는 것을 포기하겠습니까?", - "learnMoveNotLearned": "{{pokemonName}}[[는]] {{moveName}}[[를]]\n결국 배우지 않았다!", - "learnMoveForgetQuestion": "어느 기술을 잊게 하고싶은가?", - "learnMoveForgetSuccess": "{{pokemonName}}[[는]] {{moveName}}[[를]] 깨끗이 잊었다!", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}… @d{15}… @d{30}@s{pb_bounce_1}짠!", - "learnMoveAnd": "그리고…", - "levelCapUp": "레벨의 최대치가\n{{levelCap}}까지 상승했다!", - "moveNotImplemented": "{{moveName}}[[는]] 아직 구현되지 않아 사용할 수 없다…", - "moveNoPP": "기술의 남은 포인트가 없다!", - "moveDisabled": "{{moveName}}[[를]] 쓸 수 없다!", - "noPokeballForce": "본 적 없는 힘이\n볼을 사용하지 못하게 한다.", - "noPokeballTrainer": "다른 트레이너의 포켓몬은 잡을 수 없다!", - "noPokeballMulti": "안돼! 2마리 있어서\n목표를 정할 수가 없어…!", - "noPokeballStrong": "너무 강해서 잡을 수가 없다!\n먼저 약화시켜야 한다!", - "noEscapeForce": "본 적 없는 힘이\n도망칠 수 없게 한다.", - "noEscapeTrainer": "안돼! 승부 도중에\n상대에게 등을 보일 순 없어!", - "noEscapePokemon": "{{pokemonName}}의 {{moveName}}때문에\n{{escapeVerb}} 수 없다!", - "runAwaySuccess": "무사히 도망쳤다!", - "runAwayCannotEscape": "도망칠 수 없었다!", - "escapeVerbSwitch": "교체할", - "escapeVerbFlee": "도망칠", - "notDisabled": "{{pokemonName}}의\n{{moveName}} 사슬묶기가 풀렸다!", - "turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!", - "hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!", - "skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?", - "eggHatching": "어라…?", - "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", - "wildPokemonWithAffix": "야생 {{pokemonName}}", - "foePokemonWithAffix": "상대 {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!", - "drainMessage": "{{pokemonName}}[[로]]부터\n체력을 흡수했다!", - "stealEatBerry": "{{pokemonName}}[[가]]\n{{targetName}}의 {{berryName}}[[를]] 빼앗아 먹었다!", - "regainHealth": "{{pokemonName}}[[는]]\n체력을 회복했다!", - "fainted": "{{pokemonNameWithAffix}}[[는]] 쓰러졌다!", - "statRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", - "statSharplyRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", - "statRoseDrastically": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", - "statFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", - "statHarshlyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", - "statSeverelyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", - "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!", - "battlerTagsRechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}로부터 풀려났다!", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}[[는]] 풀이 죽어\n움직일 수 없었다!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠졌다!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}의\n혼란이 풀렸다!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 혼란에 빠져 있다", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠져 있다!", - "battlerTagsConfusedLapseHurtItself": "영문도 모른채\n자신을 공격했다!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}[[는]]\n길동무의 영향을 받지 않는다.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}[[는]] {{pokemonNameWithAffix2}}[[를]]\n길동무로 삼았다!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱해졌다!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 헤롱헤롱해있다!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonName}}에게 헤롱헤롱해 있다!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}[[는]] 헤롱헤롱해서\n기술을 쓸 수 없었다!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱 상태에서 벗어났다.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}}에게\n씨앗을 심었다!", - "battlerTagsSeededLapse": "씨뿌리기가 {{pokemonNameWithAffix}}의\n체력을 빼앗는다!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}[[는]]\n씨앗을 날려버렸다!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}[[는]]\n악몽을 꾸기 시작했다!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 악몽을 꾸고 있다!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}[[는]]\n악몽에 시달리고 있다!", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}[[는]]\n앙코르를 받았다!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}의\n앙코르 상태가 풀렸다!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}[[는]] {{pokemonName}}에게\n도우미가 되어주려 한다!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}[[는]] 뿌리로부터\n양분을 흡수했다!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}[[는]] 뿌리를 뻗었다!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n물의 베일을 둘러썼다!", - "battlerTagsAquaRingLapse": "{{moveName}} 효과로 \n{{pokemonName}}[[는]] HP를 회복했다!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}의\n졸음을 유도했다!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}[[는]] {{moveName}}의\n데미지를 입고 있다!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n{{moveName}}[[를]] 당했다!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n휘감겼다!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}[[는]]\n소용돌이 속에 갇혔다!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}[[는]] {{pokemonName}}의\n껍질에 꼈다!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}에 붙잡혔다!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}[[는]]\n마그마의 소용돌이에 갇혔다!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}[[는]]\n집게덫에 붙잡혔다!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}[[는]]\n{{pokemonNameWithAffix}}를 가두었다!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonNameWithAffix}}에게 엉겨 붙었다!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n방어 태세에 들어갔다!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}[[는]]\n공격으로부터 몸을 지켰다!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}[[는]]\n버티기 태세에 들어갔다!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}의 멸망의\n카운트가 {{turnCount}}[[가]] 되었다!", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}[[는]] 게으름을 피우고 있다!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}[[는]] 컨디션이\n좋아지지 않는다!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} 는 마침내\n컨디션을 회복했다!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}의\n{{statName}}[[가]] 올라갔다!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}[[는]]\n의욕이 넘치고 있다!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}[[는]] 평소로 돌아왔다.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", -} as const; diff --git a/src/locales/ko/battler-tags.json b/src/locales/ko/battler-tags.json new file mode 100644 index 00000000000..0993cafa04a --- /dev/null +++ b/src/locales/ko/battler-tags.json @@ -0,0 +1,73 @@ +{ + "trappedDesc": "함정", + "flinchedDesc": "풀죽음", + "confusedDesc": "혼란", + "infatuatedDesc": "헤롱헤롱", + "seedDesc": "씨뿌리기", + "nightmareDesc": "악몽", + "ingrainDesc": "뿌리", + "drowsyDesc": "졸음", + "rechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!", + "trappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!", + "trappedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}로부터 풀려났다!", + "flinchedLapse": "{{pokemonNameWithAffix}}[[는]] 풀이 죽어\n움직일 수 없었다!", + "confusedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠졌다!", + "confusedOnRemove": "{{pokemonNameWithAffix}}의\n혼란이 풀렸다!", + "confusedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 혼란에 빠져 있다", + "confusedLapse": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠져 있다!", + "confusedLapseHurtItself": "영문도 모른채\n자신을 공격했다!", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}}[[는]]\n길동무의 영향을 받지 않는다.", + "destinyBondLapse": "{{pokemonNameWithAffix}}[[는]] {{pokemonNameWithAffix2}}[[를]]\n길동무로 삼았다!", + "infatuatedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱해졌다!", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 헤롱헤롱해있다!", + "infatuatedLapse": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonName}}에게 헤롱헤롱해 있다!", + "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}}[[는]] 헤롱헤롱해서\n기술을 쓸 수 없었다!", + "infatuatedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱 상태에서 벗어났다.", + "seededOnAdd": "{{pokemonNameWithAffix}}에게\n씨앗을 심었다!", + "seededLapse": "씨뿌리기가 {{pokemonNameWithAffix}}의\n체력을 빼앗는다!", + "seededLapseShed": "{{pokemonNameWithAffix}}[[는]]\n씨앗을 날려버렸다!", + "nightmareOnAdd": "{{pokemonNameWithAffix}}[[는]]\n악몽을 꾸기 시작했다!", + "nightmareOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 악몽을 꾸고 있다!", + "nightmareLapse": "{{pokemonNameWithAffix}}[[는]]\n악몽에 시달리고 있다!", + "encoreOnAdd": "{{pokemonNameWithAffix}}[[는]]\n앙코르를 받았다!", + "encoreOnRemove": "{{pokemonNameWithAffix}}의\n앙코르 상태가 풀렸다!", + "helpingHandOnAdd": "{{pokemonNameWithAffix}}[[는]] {{pokemonName}}에게\n도우미가 되어주려 한다!", + "ingrainLapse": "{{pokemonNameWithAffix}}[[는]] 뿌리로부터\n양분을 흡수했다!", + "ingrainOnTrap": "{{pokemonNameWithAffix}}[[는]] 뿌리를 뻗었다!", + "aquaRingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n물의 베일을 둘러썼다!", + "aquaRingLapse": "{{moveName}} 효과로\n{{pokemonName}}[[는]] HP를 회복했다!", + "drowsyOnAdd": "{{pokemonNameWithAffix}}의\n졸음을 유도했다!", + "damagingTrapLapse": "{{pokemonNameWithAffix}}[[는]] {{moveName}}의\n데미지를 입고 있다!", + "bindOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n{{moveName}}[[를]] 당했다!", + "wrapOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n휘감겼다!", + "vortexOnTrap": "{{pokemonNameWithAffix}}[[는]]\n소용돌이 속에 갇혔다!", + "clampOnTrap": "{{sourcePokemonNameWithAffix}}[[는]] {{pokemonName}}의\n껍질에 꼈다!", + "sandTombOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}에 붙잡혔다!", + "magmaStormOnTrap": "{{pokemonNameWithAffix}}[[는]]\n마그마의 소용돌이에 갇혔다!", + "snapTrapOnTrap": "{{pokemonNameWithAffix}}[[는]]\n집게덫에 붙잡혔다!", + "thunderCageOnTrap": "{{sourcePokemonNameWithAffix}}[[는]]\n{{pokemonNameWithAffix}}를 가두었다!", + "infestationOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonNameWithAffix}}에게 엉겨 붙었다!", + "protectedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n방어 태세에 들어갔다!", + "protectedLapse": "{{pokemonNameWithAffix}}[[는]]\n공격으로부터 몸을 지켰다!", + "enduringOnAdd": "{{pokemonNameWithAffix}}[[는]]\n버티기 태세에 들어갔다!", + "enduringLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", + "sturdyLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", + "perishSongLapse": "{{pokemonNameWithAffix}}의 멸망의\n카운트가 {{turnCount}}[[가]] 되었다!", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}}[[는]]\n주목의 대상이 되었다!", + "truantLapse": "{{pokemonNameWithAffix}}[[는]] 게으름을 피우고 있다!", + "slowStartOnAdd": "{{pokemonNameWithAffix}}[[는]] 컨디션이\n좋아지지 않는다!", + "slowStartOnRemove": "{{pokemonNameWithAffix}} 는 마침내\n컨디션을 회복했다!", + "highestStatBoostOnAdd": "{{pokemonNameWithAffix}}의\n{{statName}}[[가]] 올라갔다!", + "highestStatBoostOnRemove": "{{pokemonNameWithAffix}}의\n{{abilityName}} 효과가 사라졌다!", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}}[[는]]\n전자력으로 떠올랐다!", + "magnetRisenOnRemove": "{{pokemonNameWithAffix}}의\n전자력이 없어졌다!", + "critBoostOnAdd": "{{pokemonNameWithAffix}}[[는]]\n의욕이 넘치고 있다!", + "critBoostOnRemove": "{{pokemonNameWithAffix}}[[는]] 평소로 돌아왔다.", + "saltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!", + "saltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.", + "cursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", + "cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", + "stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!", + "disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!", + "disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다." +} diff --git a/src/locales/ko/berry.json b/src/locales/ko/berry.json new file mode 100644 index 00000000000..4681df53fb5 --- /dev/null +++ b/src/locales/ko/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "자뭉열매", + "effect": "지니게 하면 HP가 50% 미만일 때 HP를 25% 회복" + }, + "LUM": { + "name": "리샘열매", + "effect": "지니게 하면 모든 상태 이상과 혼란을 회복" + }, + "ENIGMA": { + "name": "의문열매", + "effect": "지니게 하면 효과가 뛰어난 기술에 당했을 때 HP를 25% 회복" + }, + "LIECHI": { + "name": "치리열매", + "effect": "지니게 하면 HP가 25% 미만일 때 자신의 공격이 상승" + }, + "GANLON": { + "name": "용아열매", + "effect": "지니게 하면 HP가 25% 미만일 때 자신의 방어가 상승" + }, + "PETAYA": { + "name": "야타비열매", + "effect": "지니게 하면 HP가 25% 미만일 때 자신의 특수공격이 상승" + }, + "APICOT": { + "name": "규살열매", + "effect": "지니게 하면 HP가 25% 미만일 때 자신의 특수방어가 상승" + }, + "SALAC": { + "name": "캄라열매", + "effect": "지니게 하면 HP가 25% 미만일 때 자신의 스피드가 상승" + }, + "LANSAT": { + "name": "랑사열매", + "effect": "지니게 하면 HP가 25% 미만일 때 공격이 급소를 맞히기 쉬워짐" + }, + "STARF": { + "name": "스타열매", + "effect": "지니게 하면 HP가 25% 미만일 때 능력 중의 하나가 크게 상승" + }, + "LEPPA": { + "name": "과사열매", + "effect": "지니게 하면 기술의 PP가 0이 되었을 때 PP를 10만큼 회복" + } +} \ No newline at end of file diff --git a/src/locales/ko/berry.ts b/src/locales/ko/berry.ts deleted file mode 100644 index 722edf62c9a..00000000000 --- a/src/locales/ko/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "자뭉열매", - effect: "지니게 하면 HP가 50% 미만일 때 HP를 25% 회복", - }, - "LUM": { - name: "리샘열매", - effect: "지니게 하면 모든 상태 이상과 혼란을 회복", - }, - "ENIGMA": { - name: "의문열매", - effect: "지니게 하면 효과가 뛰어난 기술에 당했을 때 HP를 25% 회복", - }, - "LIECHI": { - name: "치리열매", - effect: "지니게 하면 HP가 25% 미만일 때 자신의 공격이 상승", - }, - "GANLON": { - name: "용아열매", - effect: "지니게 하면 HP가 25% 미만일 때 자신의 방어가 상승", - }, - "PETAYA": { - name: "야타비열매", - effect: "지니게 하면 HP가 25% 미만일 때 자신의 특수공격이 상승", - }, - "APICOT": { - name: "규살열매", - effect: "지니게 하면 HP가 25% 미만일 때 자신의 특수방어가 상승", - }, - "SALAC": { - name: "캄라열매", - effect: "지니게 하면 HP가 25% 미만일 때 자신의 스피드가 상승", - }, - "LANSAT": { - name: "랑사열매", - effect: "지니게 하면 HP가 25% 미만일 때 공격이 급소를 맞히기 쉬워짐", - }, - "STARF": { - name: "스타열매", - effect: "지니게 하면 HP가 25% 미만일 때 능력 중의 하나가 크게 상승", - }, - "LEPPA": { - name: "과사열매", - effect: "지니게 하면 기술의 PP가 0이 되었을 때 PP를 10만큼 회복", - }, -} as const; diff --git a/src/locales/ko/bgm-name.ts b/src/locales/ko/bgm-name.json similarity index 82% rename from src/locales/ko/bgm-name.ts rename to src/locales/ko/bgm-name.json index c133a93450e..5295e2d8708 100644 --- a/src/locales/ko/bgm-name.ts +++ b/src/locales/ko/bgm-name.json @@ -1,11 +1,10 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "Music", - "missing_entries" : "{{name}}", +{ + "music": "Music: ", + "missing_entries": "{{name}}", "battle_kanto_champion": "BW2 관동 챔피언 배틀", "battle_johto_champion": "BW2 성도 챔피언 배틀", - "battle_hoenn_champion": "BW2 호연 챔피언 배틀", + "battle_hoenn_champion_g5": "BW2 호연 챔피언 배틀", + "battle_hoenn_champion_g6": "ORAS 호연 챔피언 배틀", "battle_sinnoh_champion": "BW2 신오 챔피언 배틀", "battle_champion_alder": "BW 하나 챔피언 배틀", "battle_champion_iris": "BW2 하나 챔피언 배틀", @@ -46,6 +45,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_lake_trio": "ORAS 호수의 수호신 배틀", "battle_legendary_sinnoh": "ORAS 신오 전설 조우 배틀", "battle_legendary_dia_pal": "ORAS 디아루가 & 펄기아 배틀", + "battle_legendary_origin_forme": "LA 오리진 디아루가 & 펄기아 배틀", "battle_legendary_giratina": "ORAS 기라티나 배틀", "battle_legendary_arceus": "HGSS 아르세우스 배틀", "battle_legendary_unova": "BW 하나 전설 조우 배틀", @@ -60,9 +60,10 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_zac_zam": "SWSH 자시안 & 자마젠타 배틀", "battle_legendary_glas_spec": "SWSH 블리자포스 & 레이스포스 배틀", "battle_legendary_calyrex": "SWSH 버드렉스 배틀", + "battle_legendary_riders": "SWSH 백마 & 흑마 버드렉스 배틀", "battle_legendary_birds_galar": "SWSH 가라르 전설의 새 배틀", "battle_legendary_ruinous": "SV 재앙의 보물 배틀", - "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_kor_mir": "SV 에리어 제로 배틀", "battle_legendary_loyal_three": "SV 세벗들 배틀", "battle_legendary_ogerpon": "SV 오거폰 배틀", "battle_legendary_terapagos": "SV 테라파고스 배틀", @@ -74,18 +75,25 @@ export const bgmName: SimpleTranslationEntries = { "battle_wild": "BW 야생 포켓몬 배틀", "battle_wild_strong": "BW 강한 야생 포켓몬 조우 배틀", "end_summit": "불가사의 던전 구조대 DX 천공의 탑 꼭대기", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_rocket_grunt": "HGSS 로켓단 배틀", + "battle_aqua_magma_grunt": "ORAS 아쿠아단 & 마그마단 배틀", + "battle_galactic_grunt": "BDSP 갤럭시단 배틀", "battle_plasma_grunt": "BW 플라스마단 배틀", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", - - // Biome Music + "battle_flare_grunt": "XY 플레어단 배틀", + "battle_aether_grunt": "SM 에테르재단 배틀", + "battle_skull_grunt": "SM 스컬단 배틀", + "battle_macro_grunt": "SWSH 트레이너 배틀", + "battle_galactic_admin": "BDSP 갤럭시단 간부 배틀", + "battle_skull_admin": "SM 스컬단 간부 배틀", + "battle_oleana": "SWSH 올리브 배틀", + "battle_rocket_boss": "USUM 비주기 배틀", + "battle_aqua_magma_boss": "ORAS 아강 & 마적 배틀", + "battle_galactic_boss": "BDSP 태홍 배틀", + "battle_plasma_boss": "B2W2 게치스 배틀", + "battle_flare_boss": "XY 플라드리 배틀", + "battle_aether_boss": "SM 루자미네 배틀", + "battle_skull_boss": "SM 구즈마 배틀", + "battle_macro_boss": "SWSH 로즈 배틀", "abyss": "불가사의 던전 하늘의 탐험대 어둠의 화구", "badlands": "불가사의 던전 하늘의 탐험대 불모의 계곡", "beach": "불가사의 던전 하늘의 탐험대 축축한 암반", @@ -101,18 +109,18 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "불가사의 던전 하늘의 탐험대 신비의 숲", "ice_cave": "불가사의 던전 하늘의 탐험대 광대한 얼음산", "island": "불가사의 던전 하늘의 탐험대 연안의 암반", - "jungle": "Lmz - Jungle", // The composer thinks about a more creative name - "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "jungle": "Lmz - Jungle", + "laboratory": "Firel - Laboratory", "lake": "불가사의 던전 하늘의 탐험대 수정 동굴", "meadow": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 숲", - "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "metropolis": "Firel - Metropolis", "mountain": "불가사의 던전 하늘의 탐험대 뿔산", "plains": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 초원", "power_plant": "불가사의 던전 하늘의 탐험대 일렉트릭 평원", "ruins": "불가사의 던전 하늘의 탐험대 봉인의 암반", - "sea": "불가사의 던전 하늘의 탐험대 바닷가 동굴", - "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 해변", + "sea": "Andr06 - Marine Mystique", + "seabed": "Firel - Seabed", + "slum": "Andr06 - Sneaky Snom", "snowy_forest": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 설원", "space": "Firel - Aether", "swamp": "불가사의 던전 하늘의 탐험대 폐쇄되어진 바다", @@ -121,8 +129,6 @@ export const bgmName: SimpleTranslationEntries = { "town": "불가사의 던전 하늘의 탐험대 랜덤 던전 테마 3", "volcano": "불가사의 던전 하늘의 탐험대 열수의 동굴", "wasteland": "불가사의 던전 하늘의 탐험대 환상의 대지", - - // Encounter "encounter_ace_trainer": "BW 눈이 마주치면 승부! (엘리트 트레이너)", "encounter_backpacker": "BW 눈이 마주치면 승부! (등산가)", "encounter_clerk": "BW 눈이 마주치면 승부! (회사원)", @@ -137,9 +143,7 @@ export const bgmName: SimpleTranslationEntries = { "encounter_scientist": "BW 눈이 마주치면 승부! (연구원)", "encounter_twins": "BW 눈이 마주치면 승부! (쌍둥이)", "encounter_youngster": "BW 눈이 마주치면 승부! (반바지 꼬마)", - - // Other "heal": "BW 포켓몬 센터", "menu": "불가사의 던전 하늘의 탐험대 포켓몬 세계에 온 것을 환영한다!", - "title": "불가사의 던전 하늘의 탐험대 메뉴 테마", -} as const; + "title": "불가사의 던전 하늘의 탐험대 메뉴 테마" +} diff --git a/src/locales/ko/biome.ts b/src/locales/ko/biome.json similarity index 85% rename from src/locales/ko/biome.ts rename to src/locales/ko/biome.json index 7167618d161..8149c2c2c48 100644 --- a/src/locales/ko/biome.ts +++ b/src/locales/ko/biome.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { +{ "unknownLocation": "기억할 수 없는 곳", "TOWN": "마을", "PLAINS": "평야", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "눈덮인 숲", "ISLAND": "섬", "LABORATORY": "연구소", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/ko/challenges.json b/src/locales/ko/challenges.json new file mode 100644 index 00000000000..7efdfef3570 --- /dev/null +++ b/src/locales/ko/challenges.json @@ -0,0 +1,36 @@ +{ + "title": "챌린지 조건 설정", + "illegalEvolution": "{{pokemon}}[[는]] 현재의 챌린지에\n부적합한 포켓몬이 되었습니다!", + "singleGeneration": { + "name": "단일 세대", + "desc": "{{gen}}의 포켓몬만 사용할 수 있습니다.", + "desc_default": "선택한 세대의 포켓몬만 사용할 수 있습니다.", + "gen_1": "1세대", + "gen_2": "2세대", + "gen_3": "3세대", + "gen_4": "4세대", + "gen_5": "5세대", + "gen_6": "6세대", + "gen_7": "7세대", + "gen_8": "8세대", + "gen_9": "9세대" + }, + "singleType": { + "name": "단일 타입", + "desc": "{{type}} 타입의 포켓몬만 사용할 수 있습니다.", + "desc_default": "선택한 타입의 포켓몬만 사용할 수 있습니다." + }, + "freshStart": { + "name": "새 출발", + "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/challenges.ts b/src/locales/ko/challenges.ts deleted file mode 100644 index 1f10c4f215a..00000000000 --- a/src/locales/ko/challenges.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TranslationEntries } from "#app/interfaces/locales"; - -export const challenges: TranslationEntries = { - "title": "챌린지 조건 설정", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", - "singleGeneration": { - "name": "단일 세대", - "desc": "{{gen}}의 포켓몬만 사용할 수 있습니다.", - "desc_default": "선택한 세대의 포켓몬만 사용할 수 있습니다.", - "gen_1": "1세대", - "gen_2": "2세대", - "gen_3": "3세대", - "gen_4": "4세대", - "gen_5": "5세대", - "gen_6": "6세대", - "gen_7": "7세대", - "gen_8": "8세대", - "gen_9": "9세대", - }, - "singleType": { - "name": "단일 타입", - "desc": "{{type}} 타입의 포켓몬만 사용할 수 있습니다.", - "desc_default": "선택한 타입의 포켓몬만 사용할 수 있습니다." - //type in pokemon-info - }, -} as const; diff --git a/src/locales/ko/command-ui-handler.json b/src/locales/ko/command-ui-handler.json new file mode 100644 index 00000000000..15cfba7196b --- /dev/null +++ b/src/locales/ko/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "싸운다", + "ball": "볼", + "pokemon": "포켓몬", + "run": "도망간다", + "actionMessage": "{{pokemonName}}[[는]] 무엇을 할까?" +} \ No newline at end of file diff --git a/src/locales/ko/command-ui-handler.ts b/src/locales/ko/command-ui-handler.ts deleted file mode 100644 index a40ec0316bf..00000000000 --- a/src/locales/ko/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "싸운다", - "ball": "볼", - "pokemon": "포켓몬", - "run": "도망간다", - "actionMessage": "{{pokemonName}}[[는]] 무엇을 할까?", -} as const; diff --git a/src/locales/ko/common.json b/src/locales/ko/common.json new file mode 100644 index 00000000000..f67eae67155 --- /dev/null +++ b/src/locales/ko/common.json @@ -0,0 +1,8 @@ +{ + "start": "시작", + "luckIndicator": "행운:", + "shinyOnHover": "색이 다른", + "commonShiny": "커먼", + "rareShiny": "레어", + "epicShiny": "에픽" +} \ No newline at end of file diff --git a/src/locales/ko/common.ts b/src/locales/ko/common.ts deleted file mode 100644 index d87be482f99..00000000000 --- a/src/locales/ko/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "시작", -} as const; diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index 59603c8519d..978cdc83002 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -1,94 +1,113 @@ -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const koConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - statusEffect: statusEffect, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather, - partyUiHandler: partyUiHandler + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory, }; diff --git a/src/locales/ko/dialogue-double-battle.json b/src/locales/ko/dialogue-double-battle.json new file mode 100644 index 00000000000..134b8ade71e --- /dev/null +++ b/src/locales/ko/dialogue-double-battle.json @@ -0,0 +1,82 @@ +{ + "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-final-boss.json b/src/locales/ko/dialogue-final-boss.json new file mode 100644 index 00000000000..d9b8dfc4526 --- /dev/null +++ b/src/locales/ko/dialogue-final-boss.json @@ -0,0 +1,5 @@ +{ + "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-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.json b/src/locales/ko/dialogue.json new file mode 100644 index 00000000000..13fcd64a8d3 --- /dev/null +++ b/src/locales/ko/dialogue.json @@ -0,0 +1,2691 @@ +{ + "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.ts b/src/locales/ko/dialogue.ts deleted file mode 100644 index a98b31a7c61..00000000000 --- a/src/locales/ko/dialogue.ts +++ /dev/null @@ -1,2668 +0,0 @@ -import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/interfaces/locales"; - -// Dialogue of the NPCs in the game when the player character is male (or unset) -export const PGMdialogue: DialogueTranslationEntries = { - "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: `사람들이 나를 오해하는 게 신경 쓰여. - $나는 생각보다 훨씬 깨끗한데.` - }, - "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: "내가 뱃멀미가 나는 것 같군…" - }, - }, - "rocket_grunt": { - "encounter": { - 1: "트러블에 대비하도록!" - }, - "victory": { - 1: "로켓단은 다시 떠오를 거니까!" - }, - }, - "magma_grunt": { - "encounter": { - 1: " 마그마단을 방해한다면, 자비는 없닷!" - }, - "victory": { - 1: "하? 내가 졌어?!" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "아쿠아단을 넘본 사람에게는 자비는 없다, 꼬마도 마찬가지야!" - }, - "victory": { - 1: "말도 안돼!" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "갤럭시단을 방해하지 마!" - }, - "victory": { - 1: "사격 중지…… " - }, - }, - "plasma_grunt": { - "encounter": { - 1: "다른 생각을 가진사람들은 용납하지 않겠다!" - }, - "victory": { - 1: "플라-스마-!" - }, - }, - "flare_grunt": { - "encounter": { - 1: "패션이 우리한텐 가장 중요하다고!" - }, - "victory": { - 1: "미래가 밝아 보이질 않네." - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "그래서! 여기까지 오다니, 감탄이 절로 나오는군!" - }, - "victory": { - 1: "하! 이럴 순 없어!" - }, - "defeat": { - 1: "자신의 힘을 측정하지 못하는 걸 보아하니, 아직 별볼일 없는 꼬맹이로군. 내 말을 명심하도록. " - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "옛 친구들이 나를 필요로 하고 있다…… 그런데도 방해하겠다는 건가?" - }, - "victory": { - 1: "어떻게 이런 일이…?\n로켓단의 소중한 꿈이 환상에 불과해졌군…… " - }, - "defeat": { - 1: "로켓단은 다시 태어난다, 그리고 세상을 지배할 것이다!" - } - }, - "magma_boss_maxie_1": { - "encounter": { - 1: "내 손으로 널 파묻어주지. 영광으로 알도록!" - }, - "victory": { - 1: "윽! 꽤… 제법이군…\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: "우매한 자들이 이 아름다운 세상을 계속 더럽히고 있군." - } - }, - "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: "우리의 쇼가 즐거웠길 바라요.\우아한 춤은 끝났습니다.", - 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: `왜 하고 있는지 생각하지 않으면, 포켓몬 배틀은 의미가 없어 . - $좋게 말하면, 함께 포켓몬과 승부하는 것이 무의미해 지는 것이지.`, - 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: `개인적으로 받아들이지 마세요… 감정 상하지도 말고요… 저와 제 풀타입 포켓몬들이라면… - $음… 무슨 일이 있더라도 배틀을 할 겁니다.`, - 2: "네. 저로 괜찮다면 진심을 담아서 상대해 드리겠습니다.", - 3: "네… 그, 음, 저는 덴트입니다, 풀타입 포켓몬을 좋아합니다." - }, - "victory": { - 1: "…에- 그게… 끝나버렸나요?", - 2: `…놀랐습니다. 당신 아주 강하군요. - $팟이나 콘이라도 이길 수 없었을 것 같습니다…`, - 3: "…어라, 타이밍이 좀 잘못된것 같네요?" - }, - "defeat": { - 1: "어라? 제가 이긴 건가요?", - 2: `제 생각엔… - $아무래도 제가 이겼어야만 했을 거라 생각합니다, 팟과 콘이랑 배틀하면서 우리는 모두 더 강해졌기 때문이죠.`, - 3: "정말… 아주 짜릿한 경험이었습니다…" - } - }, - "roark": { - "encounter": { - 1: "트레이너로서 너의 실력이 어느 정도인지 그리고 함께 싸울 포켓몬이 얼마나 강한지 확인해보겠어!", - 2: "자 간다! 내 자랑이자 기쁨인 바위타입 포켓몬들이야!", - 3: "바위타입 포켓몬이야말로 최고지!", - 4: "트레이너로서 너의 실력이 어느 정도인지 그리고 함께 싸울 포켓몬이 얼마나 강한지 확인해보겠어!" - }, - "victory": { - 1: "이-이럴수가! 열심히 단련시킨 포켓몬들이!", - 2: "…져버린 건가. 다음엔 지하통로에서 화석캐기 승부를 하고 싶구나.", - 3: "네 실력이라면 승리는 당연한 결과겠지.", - 4: "뭐-뭐야?! 이럴 수가! 이것도 부족했단 말인가?", - 5: "내가 실수했군." - }, - "defeat": { - 1: "봤지? 이게 바로 내가 자랑하는 바위 스타일 전투야!", - 2: "고마워! 이번 승부로 아버지를 이길 수 있겠다는 자신감이 생겼어!", - 3: "정말 단단한 바위를 뚫고 나온 기분인데!" - } - }, - "morty": { - "encounter": { - 1: `조금만 더 노력하면, 내가 전설의 포켓몬을 만나는 미래가 보여. - $내가 그 수준에 도달할 수 있게 도와줘!`, - 2: `커다란 무지개색 포켓몬은 진정한 강함을 가진 트레이너 앞에 나타난다는 이야기가 있어. - $난 그 이야기를 믿고, 줄곧 이 곳에서 몰래 수행하고 있어. 그 결과로, 다른 사람들은 볼 수 없는 것을 볼 수 있게 됐지. - $내겐 그 포켓몬을 나타나게 할 사람의 그림자가 보이거든. - $난 그게 나라고 믿어! 넌 내가 그 수준에 올라갈 수 있도록 도와줘야겠어!`, - 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: "이번에는 사천왕으로서 승부하는 거니까 평소 사용하는 아이들로 상대해 드릴게요!" - }, - "victory": { - 1: "멋진 포켓몬 배틀이었어요!" - }, - "defeat": { - 1: "당신의 포켓몬의 노력에 박수를 보내주세요!" - } - }, - "drayton": { - "encounter": { - 1: `의자는 좋은 거야. 너도 그렇게 생각해? 정말 고마운 물건이지. - $왜 다들 앉지 않는 걸까. 서 있는 건 힘들잖아!`, - }, - "victory": { - 1: "전보다 더 강해질 줄이야!" - }, - "defeat": { - 1: "헤헤헷! 내 승리야. 분한 건 알겠지만 카지처럼 나가떨어지지마, 응?" - } - }, - "ramos": { - "encounter": { - 1: `그래, 올곧게 자란 초목을 모아서 만든 풀 정글짐은 어땠는가? - $자네가 느낀 그것이 나의 체육관 관장으로서의 실력이네! 한번 확인해 보겠나?`, - }, - "victory": { - 1: "포켓몬은 자네를 믿고, 자네는 그들을 믿는다…가슴이 후련해지는 승부였구먼." - }, - "defeat": { - 1: "호호호…연약해 보이는 풀잎은 콘크리트도 뚫을 수 있다네." - } - }, - "viola": { - "encounter": { - 1: `패배의 분함도 승리의 순간도… - $둘 다 최고의 피사체야! 정말 멋져 멋져! - $자, 그럼 덤비렴!`, - 2: "나 비올라는 셔트 찬스를 노리는 것처럼--승리를 노릴 거야!" - }, - "victory": { - 1: "너와 네 포켓몬은 최고의 콤비구나! 정말 멋져 멋져!", - 2: `렌즈 너머의 세계와 포켓몬의 마음으로 보는 세계… - $똑같이 보이는 풍경이지만 다양한 세계가 겹쳐져 있는 거야.` - }, - "defeat": { - 1: "내가 승리한 순간을 찍은 사진은 정말 멋져 멋져!", - 2: "좋아! 멋진 사진을 찍었어!" - } - }, - "candice": { - "encounter": { - 1: `나, 무청에게 도전하고 싶은거야? 좋아! 강한 사람을 기다리고 있었으니까! - $그치만 말해두는데, 집중하는 방법을 아는 나도 강력하거든.`, - 2: `포켓몬도 멋도 연애도 정신 집중이 중요하다고! - $무슨 뜻인지 보여줄테니까 각오해!` - }, - "victory": { - 1: "있지, 나 조금 불타오르게 됐어! 널 조금 존경하게 될지도 몰라.", - 2: `우와! 제법인데! 내가 존경하게 만들다니! - $네 집중력과 의지, 완전히 나를 압도하는 같아. ` - }, - "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: `충격을 받아서… 가면을 떨어뜨릴 뻔 했지만… - $네가 얼마나 강한지 확실히 봤어.`, - }, - "defeat": { - 1: "이-이게 내 실력이니까!" - } - }, - "clay": { - "encounter": { - 1: "실망스럽군! 나를 기다리게 하다니, 이 꼬마가. 아무튼 실력을 확인해 볼까!" - }, - "victory": { - 1: "이런 이런… 진심으로 싸워서 진 거라 오히려 시원한 기분이군!" - }, - "defeat": { - 1: `중요한 것은 패배에 어떻게 반응하는 거다. - $그렇기 때문에 패배를 연료로 삼아 나아가는 사람들은 강인하지.`, - } - }, - "kofu": { - "encounter": { - 1: "물포켓몬의 풀코스를! 배 터지게 먹여 주도록 하마!" - }, - "victory": { - 1: "우옷! 우오오옷! 이렇게 팔팔한 트레이너가 다 있다니!" - }, - "defeat": { - 1: "젊은 친구! 다음에 또 만나기를 기대하고 있으마!" - } - }, - "tulip": { - "encounter": { - 1: "리파의 기술로 너의 포켓몬들을 지금보다 훨~씬 아름답게 만들어 줄게!" - }, - "victory": { - 1: "너의 강함은 풀 수 없는 매직이구나." - }, - "defeat": { - 1: "…리파의 업계에서는 어중간한 재능을 가진 사람은 대체로 금방 사라져 버려." - } - }, - "sidney": { - "encounter": { - 1: `음, 좋은 표정이야. 꽤나 즐길 수 있겠는데. - $좋아! 아주 좋아! 좋았어! - $우리 함께, 포켓몬리그에서만 맛볼 수 있는 배틀을 즐겨보도록 하자!`, - }, - "victory": { - 1: "이런, 이런 져버렸군? 뭐, 꽤 즐겼으니 상관없지만." - }, - "defeat": { - 1: "기분 나빠하지 마, 알겠지?" - } - }, - "phoebe": { - "encounter": { - 1: `송화산에서 수행하면서, 고스트 타입 포켓몬과 마음이 통하게 됐어. - $응, 나와 내 포켓몬의 유대감은 정말 강해! - $이런 내 포켓몬들에게 과연 데미지를 줄 수 있을지 한번 시험해봐!`, - }, - "victory": { - 1: "아- 아, 내가 져버렸다." - }, - "defeat": { - 1: "언젠가 다시 승부할 수 있기를 기대할게!" - } - }, - "glacia": { - "encounter": { - 1: `이곳에 도전하러 오는 건 모두 어설픈 트레이너와 포켓몬뿐…. - $당신은 어떤가요? 제 진짜 실력을 발휘해도 괜찮을 정도라면 정말 기쁠텐데 말이죠…!`, - }, - "victory": { - 1: `당신과… 당신 포켓몬들의 뜨거운 혼! - $정말로 압도적인 뜨거움이네요. - $내 얼음 기술로 피해를 주지 못한 것도 놀랍지 않을정도로요!`, - }, - "defeat": { - 1: "저런, 정말로 치열한 승부였네요." - } - }, - "drake": { - "encounter": { - 1: `파트너로 포켓몬과 함께하는 승부에 무엇이 필요한지 넌 알고 있는가? - $그걸 모른다면 넌 이 몸을 이길 수 없다!`, - }, - "victory": { - 1: "훌륭하다, 라고 할 만 하군!" - }, - "defeat": { - 1: "난 승부에서 최선을 다했으니까!" - } - }, - "wallace": { - "encounter": { - 1: `뭐랄까, 너의 분위기가 조금 변한 것 같은… - $그런 느낌이 드는군. 자, 그럼 한번 확인해볼까? 너와 포켓몬의 힘을. - $그리고 확실하게 보여주도록 하지. 나와 포켓몬에 의한 물의 일루전을!`, - }, - "victory": { - 1: `훌륭하군. 넌 정말 굉장한 포켓몬 트레이너다. - $그런 너와 너의 포켓몬을 만나게 된 걸 기쁘게 생각해. 스스로 그 가치를 증명하다니!`, - }, - "defeat": { - 1: "거대한 일루전이로군!" - } - }, - "lorelei": { - "encounter": { - 1: `얼음포켓몬을 내보내면 대적할 사람이 없지! 상대를 얼린다는 건 매우 강력한 공격이야. - $네 포켓몬이 꽁꽁 얼면 그때부턴 내 손바닥 위거든! 아하하! 준비됐어?`, - }, - "victory": { - 1: "어떻게 감히!" - }, - "defeat": { - 1: "얼어붙은 넌 아무것도 할 수 없어." - } - }, - "will": { - "encounter": { - 1: `나는 전세계를 돌아다니며, 강한 에스퍼 포켓몬을 만들도록 수행해왔다. - $계속 더 정진하겠다! 패배는 선택지에 없어!`, - }, - "victory": { - 1: "이… 내가… 믿을수 없어…" - }, - "defeat": { - 1: "근소한 차이였다. 네게 부족한 것이 무엇인지 궁금하군." - } - }, - "malva": { - "encounter": { - 1: `심장이 불에 타버릴 것만 같아요. - $당신에 대한 증오로 불타고 있거든요, 얄미운 트레이너!`, - }, - "victory": { - 1: "도전자가… 사천왕 파키라에게서 멋지게 승리를 쟁취했습니다!" - }, - "defeat": { - 1: "기쁘네요! 당신을 짓밟을 수 있어서 말이죠!" - } - }, - "hala": { - "encounter": { - 1: "그럼…진심을 담아서 진지한 할라로 임하겠다!" - }, - "victory": { - 1: "네가 순례하면서 갖추게 된 강함을 느낄 수 있었다." - }, - "defeat": { - 1: "하하! 경쾌한 승부였구나!" - } - }, - "molayne": { - "encounter": { - 1: `사촌인 마마네에게 캡틴 자리는 줬지만, 아직 실력에는 자신 있어요. - $제 실력은 초신성처럼 빛나니까요!`, - }, - "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: `좋아! 꼬마야, 정말로, 인상적이었단다. - $Y네 포켓몬은 너를 믿고 승리를 위해 최선을 다했구나. - $비록 내가 졌지만, 좋아서 바보같이 웃음이 나오는구나!`, - }, - "defeat": { - 1: "호호호! 이 할머니가 이겼구나!" - } - }, - "lenora": { - "encounter": { - 1: "자 그럼 도전자여, 애정을 담아 키운 포켓몬으로 어떤 방식으로 싸우는지 연구해 보겠다!" - }, - "victory": { - 1: "너에 대한 내 가설이 맞았네. 재능만 있는 게 아니라… 대단한 녀석이구나! 너 반할것 같잖아!" - }, - "defeat": { - 1: "아 하 하! 패배했다면, 그 이유를 분석하고, 다음 승부에서 그 지식을 활용하도록!" - } - }, - "siebold": { - "encounter": { - 1: "살아가는 동안, 궁극적인 요리와 강력한 상대를 찾기 위해… 열과 성을 다할 것입니다!" - }, - "victory": { - 1: "당신에 대한 기억을 제 가슴 속에 담아두겠습니다." - }, - "defeat": { - 1: `우리의 포켓몬 배틀은 영혼의 양식과 같습니다. 그건 저를 계속 지탱할 거예요. - $이것이 제가 전투에서 모든 것을 바친 당신에게, 경의를 표하는 방법입니다!`, - } - }, - "roxie": { - "encounter": { - 1: "간다! 너의 이성을 싹 날려줄 거야!!" - }, - "victory": { - 1: "굉-장해! 네 이성, 이미 나보다 TOXIC해버렸잖아!" - }, - "defeat": { - 1: "헤이, 잠깐-! 좀 더 진지해져! 넌 더 날아가야한다구!" - } - }, - "olivia": { - "encounter": { - 1: "여기에 소개는 필요 없지. 자, 라이치님과 승부할 시간이다!" - }, - "victory": { - 1: "정말 훌륭하군… 당신과 포켓몬 둘 다…" - }, - "defeat": { - 1: "흐-음." - } - }, - "poppy": { - "encounter": { - 1: "우와~! 뽀삐와 포켓몬 승부가 하고 싶으세요?" - }, - "victory": { - 1: "훌쩍, 으에엥~" - }, - "defeat": { - 1: `만세~! 만세~ 목수, 성공했어요! - $에헴! 리벤지 매치는 언제든지 받아 줄게요!`, - } - }, - "agatha": { - "encounter": { - 1: "포켓몬은 싸우게 하려고 있는 것이야! 진정한 싸움이라는 것을 보여주겠다!" - }, - "victory": { - 1: "이런! 넌 무언가 특별하구나, 꼬마야!" - }, - "defeat": { - 1: "바하하하. 제대로 된 승부는 이렇게 하는거다!" - } - }, - "flint": { - "encounter": { - 1: "뜨겁게 타오를 준비는 됐겠지, 이제 곧 대폭발이 다가올테니까!" - }, - "victory": { - 1: "놀랍군! 네 기술이 너무 뜨거워서, 내가 미적지근해보이잖아!" - }, - "defeat": { - 1: "하? 그게 다야? 좀 더 열정이 필요해보이는걸." - } - }, - "grimsley": { - "encounter": { - 1: "이긴 자가 모든 것을 갖고 패배한 자에겐 아무것도 남지 않는다." - }, - "victory": { - 1: "누군가가 이기면 상대한 누군가가 진다… 난 다음 승리를 목표로 하겠어!" - }, - "defeat": { - 1: "누군가가 이기면, 그 사람과 싸운 사람은 지게 되는 것이지." - } - }, - "caitlin": { - "encounter": { - 1: `피어난 꽃에서 나타난 것은 나. 거기 있는 당신… - $강함과 상냥함을 함께 갖춘 포켓몬 트레이너인 것 같네. - $이 카틀레야가 대전 상대로 원하는 건 최고의 강함… - $너도 그 실력을 마음껏 펼쳐 봐!`, - }, - "victory": { - 1: "대전을 통해서 저도 포켓몬도 성장합니다. 감사드립니다." - }, - "defeat": { - 1: "더욱 엘레강트하고 엑셀런트하게 승리를 쟁취하고 싶거든." - } - }, - "diantha": { - "encounter": { - 1: `미래를 향한 희망으로 빛나는 당신과, 당신의 포켓몬을 상대로 승부하는 것… - $솔직히, 매일매일 새로운 날을 위해 필요한 에너지가 채워지는 것 같아요! 정말로요!`, - }, - "victory": { - 1: "고귀한 영혼을 지닌 포켓몬과 트레이너의 모습에 격하게 마음이 흔들려서…" - }, - "defeat": { - 1: "정말, 환상적이야! 어떻게 생각하시나요? 저의 포켓몬들, 꽤 멋있었죠?" - } - }, - "wikstrom": { - "encounter": { - 1: `잘 왔네, 젊은 도전자여! 이 몸은 사천왕 중 한 명인 강철의 남자 간피다! - $자 그럼 간다, 간다! 간닷!`, - }, - "victory": { - 1: "정말 영광이군! 자네의 포켓몬과 서로 신뢰하는 힘, 날 능가하는군!!" - }, - "defeat": { - 1: `이게 무슨 마법이지? 내 마음의 떨림이 멈추질 않는군! - $가치 있는 상대를 이기는 것은 영혼에 날개를 달아주는 것과 같지--그런 내가 비상하는 것일까!`, - } - }, - "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: `잠깐, 기다려주세요. 제가 읽던 책이 거의 클라이맥스에 도달했거든요… - $주인공이 성스러운 검을 얻었고 마지막 시련을 앞두고 있는데… 아, 신경 쓰지 마세요. - $여기까지 왔으니, 그건 제쳐두고 당신과 싸워야겠습니다. - $당신이 과연 주인공이 될 그릇인지 확인해 보도록 하죠!` - }, - "victory": { - 1: "그렇군요… 결국 체크메이트인가요." - }, - "defeat": { - 1: "제 평판을 지켜냈네요." - } - }, - "drasna": { - "encounter": { - 1: `당신 강하시죠? 그것도 상당히 꽤 말이에요… - $어머 기뻐라! 그런 상대와 놀면 포켓몬들도 쑥쑥 크겠어요!` - }, - "victory": { - 1: "어머머 벌써 끝나버리다니… 미안해요, 괜찮으면 또 오세요!" - }, - "defeat": { - 1: "어머, 웬일이야?" - } - }, - "kahili": { - "encounter": { - 1: "자, 여기에서… 승리의 바람이 부는 쪽은 당신과 저 중에 어느 쪽일까요?" - }, - "victory": { - 1: "사천왕으로서 분하지만 당신들의 강함은 진정한 강함이군요." - }, - "defeat": { - 1: "이것이 에이스니까요!" - } - }, - "hassel": { - "encounter": { - 1: "맹렬하게 몰아치는 승부의 숨결을 직접 가르쳐 드리겠습니다!!" - }, - "victory": { - 1: `이번에는 당신이 승리를 쟁취했군요. - $하지만, 시합의 흐름을 보니… 다음 승부는 또 어떻게 될지 모르겠네요.`, - }, - "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: `넌… 포켓몬과 함께 모험을 하면서 무엇을 봤지? - $많은 트레이너와 만나면서 무엇을 느꼈지? - $풍요로운 이 지역을 돌아다니면서, 네 안에서 눈뜨기 시작한 무언가… - $그 모든 것을 나에게 쏟아부었으면 좋겠어. - $나와 내 포켓몬들도 전력을 다해 상대해줄 테니까!`, - }, - "victory": { - 1: "챔피언인 내가 질 줄이야…" - }, - "defeat": { - 1: "덕분에 즐거웠어! 고마워!" - } - }, - "cynthia": { - "encounter": { - 1: "나, 난천은, 네 도전을 받아들일게! 온 힘을 다해 너와 시합하겠어!" - }, - "victory": { - 1: "포켓몬 배틀보다 재밌는 것은 없지만, 언젠간 끝나기 마련이니…" - }, - "defeat": { - 1: "비록 졌어도, 포켓몬에 대한 사랑은 잃지 않도록 해." - } - }, - "iris": { - "encounter": { - 1: `나는 말이지, 강한 트레이너와의 진지한 승부를 즐겨! - $왜냐면 그렇잖아! 이곳에 오는 건 마음 깊이 승리를 추구하는 트레이너. - #함께 싸우는 건 수많은 승부를 헤쳐온 포켓몬. - $그런 상대와 겨룰 수 있다면 나도! 내 포켓몬도! - $더욱더 강해지고 서로 알 수 있으니까! 으응! 그럼 간다! - $포켓몬리그 챔피언 아이리스! 당신을 이기겠습니다!!`, - }, - "victory": { - 1: "후와아아아… 힘을 모두 발휘했는데도 우리가 졌네." - }, - "defeat": { - 1: "우와! 이겼다!" - } - }, - "hau": { - "encounter": { - 1: `트레이너가 따뜻한 지역 출신인지 추운 지역 출신인지에 따라 배틀 스타일이 달라지는지 궁금해졌어. - $그럼 테스트 해볼게~!`, - }, - "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: `젊은 트레이너여! 자네는 내 아들 강석처럼 젊군. - $젊은 트레이너가 많아질수록, 포켓몬의 미래도 밝지! - $그러니, 젊은이들이 넘어야할 벽으로서 상대해주겠다!`, - }, - "victory": { - 1: "흠! 내 견고한 포켓몬이--져버렸군!" - }, - "defeat": { - 1: "으하하핫! 내 견고한 포켓몬은 어땠나?!" - } - }, - "olympia": { - "encounter": { - 1: "이 의식은 앞으로의 길을 정하는 것입니다. 포켓몬 승부를 시작해볼까요!" - }, - "victory": { - 1: "당신이라면 별이라도 움직여서 가야 할 길을 만들어 낼 것 같습니다." - }, - "defeat": { - 1: "우리의 길은 이제 분명해졌습니다." - } - }, - "volkner": { - "encounter": { - 1: `여기까지 왔으니, 넌 꽤 강하겠군… - $네가 내게 포켓몬 승부의 즐거움을 상기시켜 줄 트레이너이길 바란다!`, - }, - "victory": { - 1: `너 나를 이겼군… - $네 열정과 포켓몬이 그런 너를 위해 싸워준 고귀한 방식… - $심지어 스릴까지 넘쳤다. 아주 좋은 승부였어.`, - }, - "defeat": { - 1: `전혀 충격적이지 않았다… - $이런 건 원하지 않았어!`, - } - }, - "burgh": { - "encounter": { - 1: `으-음… 이번 배틀에서 이기면, 예전과는 다른 그림을 그릴 수 있을 것 같아. - $맞아! 난 승리 뮤즈의 목소리를 선명하게 들을 수 있거든. 그럼 승부다!`, - 2: `물론, 난 내 포켓몬을 자랑스럽게 생각하거든! - $자 그럼… 바로 승부할까!` - }, - "victory": { - 1: "벌써 끝이라고? 뮤즈가 나를 버리고 떠나버렸나?", - 2: "아우… 져버렸네! 너 굉장히 강하잖아!" - }, - "defeat": { - 1: "우와… 왠지 뭔가 아름답네, 그치…", - 2: `가끔 사람들이 못난 승리라고 말하는 걸 듣곤 해. - $그치만 난 최선을 다했다면, 어떤 승리든 아름답다고 생각하거든.` - } - }, - "elesa": { - "encounter": { - 1: `컴플리트…! 확신이 들때면, 내 몸을 통하는 전기가 짜릿짜릿하게 느껴져! - $그 감각을 느끼고 싶으니까…, 다음은 사랑스러운 포켓몬들로 너를 어질어질하게 할게!`, - }, - "victory": { - 1: "어질어질하게 만들 셈이였는데, 너한테는 짜릿짜릿하게 당해버렸네." - }, - "defeat": { - 1: "왠지 부족한 기분이야… 다음에는 최선을 다할 수 있지?" - } - }, - "skyla": { - "encounter": { - 1: `드디어 대결의 시간이야! 누가 정상에 오를지 결정짓는 포켓몬 배틀, 그치? - $난 정상에 있는 게 좋아! 높은 곳에서는 항상 멀리 볼 수 있으니까! - $그럼, 다음은 나랑 더욱 즐거운 것을 할까?`, - }, - "victory": { - 1: "배틀에서 네 상대가 되는 거, 뭔가 새로운 모티브가 되네. 고마워!" - }, - "defeat": { - 1: "이기든 지든, 항상 무언가를 얻게 돼, 그치?" - } - }, - "brycen": { - "encounter": { - 1: `다른사람이나 포켓몬과 함께 있을 때도 힘이 생긴다. - $그 도움을 받는 것이 너를 강하게 만들었겠지. 그 힘을 보이거라!`, - }, - "victory": { - 1: "너와 포켓몬과! 멋진 콤비네이션! 아름다운 우정!" - }, - "defeat": { - 1: "극한에서 시험받고 단련하도록!" - } - }, - "drayden": { - "encounter": { - 1: `지금 찾는 것은 밝은 미래를 보여줄 젋은 트레이너의 존재. - $승부에서 모든 걸 보이도록. 네 기술, 내 경험, 그리고 포켓몬을 키워온 사랑도 함께!`, - }, - "victory": { - 1: "패배하여 끓어오르는 이 마음… 뭐라고 표현해야 좋을까." - }, - "defeat": { - 1: "실망스럽군! 난 자네의 능력이 그보다 더 크다는 걸 알고있네!" - } - }, - "grant": { - "encounter": { - 1: `제가 바라는 것은 단 하나뿐입니다. - $서로가 서로를 뛰어넘어, 더 높은 벽에 도달하는 것입니다.`, - }, - "victory": { - 1: "내 앞에 솟아 있는 높은 벽… 그건 바로 당신입니다." - }, - "defeat": { - 1: `인생에서 중요한 교훈은 간단합니다. - $포기하지 않는 것. - $이것이 전부입니다.`, - } - }, - "korrina": { - "encounter": { - 1: "코르니 납시오!" - }, - "victory": { - 1: "네 존재가 너의 포켓몬을 점점 진화시키고 있어!" - }, - "defeat": { - 1: "정말 멋진 배틀이었어!" - } - }, - "clemont": { - "encounter": { - 1: "아앗! 잘 부탁드립니다!" - }, - "victory": { - 1: "당신들의 승부를 향한 마음에 자극을 받았습니다!" - }, - "defeat": { - 1: "저의 슈퍼트레이닝 발명품이 효과가 있는 것 같군요!" - } - }, - "valerie": { - "encounter": { - 1: `어라,트레이너님… 슝슝 워프해서… 이렇게 만나서 반갑네. - $그리고 내가 보기엔 당신은 노력했기에, 이 승부에 참가할 수 있게 된 것 같아. - $찾기 힘든 요정 같은 페어리 타입, 우리 포켓몬들 사뿐하고 화사하지만 강하다구.`, - }, - "victory": { - 1: "난 당신이 내일을 생각하며 웃을 수 있는 것들을 찾길 바라고 있을게…" - }, - "defeat": { - 1: "앗 이런, 가엾어라…" - } - }, - "wulfric": { - "encounter": { - 1: `그거 알아? 그거… 전투와 유대감을 통해 배운다거나 하는… 거 뭐더라, 음. - $여튼 말이지, 난 그냥 재밌어서 하는 거야. - $내 자랑은 별로 듣고 싶지 않으려나? 자, 포켓몬을 꺼내자!`, - }, - "victory": { - 1: "그거야, 바로 그거! 멋지다고. 단단한 얼음을 깨부쉈구나!" - }, - "defeat": { - 1: "나와 싸우면 그런 일이 벌어진다니까!" - } - }, - "kabu": { - "encounter": { - 1: `모든 트레이너와 포켓몬은 이기기 위해 훈련을 하고 있다. - $하지만 싸우는 상대 역시 그만큼 노력하고 있지. - $ 결국 승부는 실전에서, 얼마만큼 제 실력을 발휘할 수 있느냐에 달렸다.`, - }, - "victory": { - 1: "오늘 너와 싸울 수 있어서 참 기뻤다!" - }, - "defeat": { - 1: "내 성장을 체감하게 되는군!" - } - }, - "bea": { - "encounter": { - 1: `당신은 과연, 어떤 공격에도 흔들리지 않는 마음을 가졌을까요? - $제가 시험해보겠습니다, 준비는 되셨습니까?`, - }, - "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: `사실은, 말했던 일들이 해결 되고 나면… 결국은 나 자신이 챔피언이 되고싶다는 걸 알았으니까! - $그러니까 너의 팀을 기분 좋게 잠들게 해주겠어!`, - }, - "victory": { - 1: "응, 그래서 내가 졌구나… 그치만 너와 네 포켓몬의 좋은 점을 많이 볼 수 있었어!" - }, - "defeat": { - 1: "우리의 배틀 방식을 즐겼길 바라." - } - }, - "raihan": { - "encounter": { - 1: "챔피언도 쓰러뜨리고, 토너먼트에서도 우승해서, 위대한 나 금랑님이 얼마나 강한지 세계에 증명 해보실까!" - }, - "victory": { - 1: `역시 난 진 다음에도 멋있네! - $조금 분하지만…. - $기념으로 셀카라도 찍어둘까…!`, - }, - "defeat": { - 1: "자, 이 순간을 기억하기 위한 셀카를 찍자고." - } - }, - "brassius": { - "encounter": { - 1: "준비는 됐겠지!? 그럼, 우리 둘의 예술적인 합작품을 한번 만들어 보도록 할까!" - }, - "victory": { - 1: "아… 아방가르드!!" - }, - "defeat": { - 1: "바로 신작을 만들러 가야 하니 이만 실례하겠다!" - } - }, - "iono": { - "encounter": { - 1: `자~ 오늘의 각오는~ 모야모야~? - $... - $그럼, 이제 시작해 볼까! - $도전자님의 실력은 과연 과연~!?`, - }, - "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: `나의 마음에 상쾌한 바람이 지나갔다... - $정말 대단한 노력이다!` - } - }, - "kieran": { - "encounter": { - 1: `난 노력을 통해 강해지고 또 강해지지! - $난 지지 않아.` - }, - "victory": { - 1: `믿을 수 없어... - $정말 재밌고 가슴 뛰는 배틀이었어!` - }, - "defeat": { - 1: `세상에 마상에! 정말 멋진 배틀이었어! - $네가 더 열심히 훈련할 시간이야.` - } - }, - "rival": { - "encounter": { - 1: `@c{smile}오, 찾았다! 떠나려는 건 알고 있었지만\n인사정도는 해줄 줄 알았는데… - $@c{smile_eclosed}그러니까 정말로 꿈을 좇겠다는 거지?\n듣고도 못 믿었다니까. - $@c{serious_smile_fists}여기까지 온 김에, 배틀은 어때?\n준비가 됐나 보자구. - $@c{serious_mopen_fists}망설이지 말고,\n너의 진면목을 보여봐!` - }, - "victory": { - 1: `@c{shock}와… 정말 깔끔하게 당했네.\n초보자 맞아? - $@c{smile}운이 따른 건지도 모르겠지만…\n그래도 정말 꿈을 이룰 지도. - $그나저나, 박사님께서 이걸 전해달라고 하시더라.\n좋아 보이던데. - $@c{serious_smile_fists}아무튼, 힘 내는거야!` - }, - }, - "rival_female": { - "encounter": { - 1: `@c{smile_wave}여깄구나! 찾고 있었어!\n@c{angry_mopen}절친한테 작별인사도 안 하는거야? - $@c{smile_ehalf}꿈을 향해 떠나는거구나. 그렇지?\n이런 날이 오긴 하네… - $@c{smile}아무튼, 날 까먹고 가버린 건 용서해주겠어.\n@c{smile_wave_wink}배틀을 해준다면 말야! - $@c{angry_mopen}최선을 다 해 봐.\n모험을 시작과 동시에 끝내고 싶지 않다면!` - }, - "victory": { - 1: `@c{shock}왜 벌써 이렇게 센 건데?!@d{96}\n@c{angry}아니면 뭔가 속임수, 그런 거? - $@c{smile_wave_wink}농담, 농담!@d{64} @c{smile_eclosed}내가 진 거 맞아…\n너 정말 앞으로도 잘 하겠는데. - $@c{smile}아 그래, 박사님께서 전해달라던 물건.\n도움이 되면 좋겠어! - $@c{smile_wave}항상 최선을 다 하라구! 믿고 있을게!` - }, - }, - "rival_2": { - "encounter": { - 1: `@c{smile}어라, 너 여깄었구나?\n@c{smile_eclosed}아직도 전승 중이라, 이거지…? - $@c{serious_mopen_fists}널 쫓아서 온 것 같아 보이겠지만, 오해야. - $@c{serious_smile_fists}그래도 솔직히 그 때부터 쭉 재대결이 간절했어. - $그 동안의 훈련도 있겠다 마침 좋은 기회같지? - $@c{serious_mopen_fists}자, 전처럼!\n배틀이야!` - }, - "victory": { - 1: `@c{neutral_eclosed}이런. 자신감이 과했나봐. - $@c{smile}그래, 또 지고 말았네.\n@c{serious_mopen_fists}좀 더 열심히 훈련을 해야겠어!\n - $@c{smile}너한테 도움이 필요할 것 같지는 않지만, 이거.\n남는 게 있어서 말이야. - $@c{serious_smile_fists}물론 이번이 마지막이야, 알겠지?\n공평하게 하지 않으면 그게 내 핑계거리가 되고 말거야. - $@c{smile}이제 갈게. 앞으로도 조심하고!` - }, - }, - "rival_2_female": { - "encounter": { - 1: `@c{smile_wave}우연이네, 이런 곳에서 만나고.\n아직 연전연승이구나? @c{angry_mopen}나쁘지 않아! - $@c{angry_mopen}무슨 생각하고있는지 알겠어, 하지만 아냐.\n@c{smile_eclosed}우연히 근처에 있었을 뿐이라구. - $@c{smile_ehalf}그래도 마침, 가끔은 지는것도 괜찮다고 알려주고 싶었는데. - $@c{smile}우린 실수를 통해서도 성장할 수 있잖아.\n때로는 성공을 반복할 때보다도 더 많이 말야. - $@c{angry_mopen}어쨌든간에, 나도 이런 때를 위해 훈련해왔으니까,\n너도 최선을 다 하는게 좋을 거야!` - }, - "victory": { - 1: `@c{neutral}이… 번에도 져버릴 줄이야… - $@c{smile}으, 그래. 더 열심히 훈련하면 되겠지! - $@c{smile_wave}이것도 하나 더 챙겨왔으니 받아!\n@c{smile_wave_wink}감사 인사는 됐다구~. - $@c{angry_mopen}하지만, 마지막이야!\n또 이렇게 공짜로 나눠주진 않을 테니까! - $@c{smile_wave}그럼!` - }, - "defeat": { - 1: "가끔은 지는 것도 괜찮아…" - } - }, - "rival_3": { - "encounter": { - 1: `@c{smile}이게 누구야! 오랜만이야.\n@c{neutral}역시나… 쭉 이기고 있었구나? - $@c{neutral_eclosed}상황이 좀… 그렇더라. \n혼자 마을로 돌아가봤자 너 없인 예전같아질 수 없겠지. - $@c{serious}이기적인 이야기란건 알지만 말해야겠어.\n@c{neutral_eclosed}너 지금 좀 아닌 것 같아. - $@c{serious}계속 이기기만 하겠다는 건 너무 비현실적이야.\n사람은 원래 꺾여가며 성장하는 거라고. - $@c{neutral_eclosed}물론 지금까지는 잘 해왔다고 생각하겠지만,\n갈 길이 멀지. @c{neutral}대비는 되어 있어? - $@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}농담이야! - $@c{smile_ehalf}하지만 진짜, 고향이 그립진 않아? 집이나… 나는?\n나… 나는, 네가 정말 그리웠어. - $@c{smile_eclosed}난 너의 꿈과 모든 것을 응원하지만,\n넌 언젠가 패배를 겪게 될 거야. - $@c{smile}그 땐 언제나처럼 내가 곁에 있어줄게.\n@c{angry_mopen}내가 얼마나 강해졌는지도, 지금 보여 줄 테니까!` - }, - "victory": { - 1: "@c{shock}이렇게까지 했는데도… 모자랐던 거야…?\n이러면 정말로 너는 이제 영영…" - }, - "defeat": { - 1: "최선을 다 했지.\n집에 갈 시간이야." - } - }, - "rival_4": { - "encounter": { - 1: `@c{neutral}안녕. - $잡담은 넘어가자.\n@c{neutral_eclosed}너에게 이기기 위해 찾아왔어. 간단하지. - $@c{serious_mhalf_fists}이제 잠재력을 끌어내는 법은 확실히 알겠어. - $@c{smile}잠이나 사회적인 활동들.\n줄일 수 있는 불필요한 시간이 아주 많더라. - $@c{serious_mopen_fists}오직 승리 뿐이야.\n이제 아무것도 중요하지 않아. - $@c{neutral_eclosed}나도 이제 더 이상은 지지 않게 됐어.\n@c{smile_eclosed}네 그 철학이 완전히 틀린 건 아니었나봐. - $@c{angry_mhalf}패배는 약자에게 주어지는 것이고, 난 더 이상 약하지 않아. - $@c{serious_mopen_fists}준비해.` - }, - "victory": { - 1: "@c{neutral}너…@d{64} 너 대체 뭐야?" - }, - }, - "rival_4_female": { - "encounter": { - 1: `@c{neutral}나야! 날 잊어버리고 있던 건… 아니지? - $@c{smile}네 업적에 자랑스러워 할 때가 됐어. 축하해!\n하지만 네 여행도 여기까지야. - $@c{smile_eclosed}너는 나도 모르던 내 안의 무언가를 일깨웠어.\n이제 훈련 말고는 아무것도 하지 않아. - $@c{smile_ehalf}먹지도 자지도 않고, 그저 하루종일.\n더 강해지고 있어. - $@c{neutral}사실, 나… 이제 내가 뭔지도 잘 모르겠어. - $그렇지만 기량만은, 정점에 다다랐지.\n아무도 내게 이길 수 없을거야. - $그거 알아? 이게 전부 네 덕이야.\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}널 이기고자 하는 욕구, 아니면 네 꿈…\n이건 그저 더 큰 무언가의 일부일 뿐이었어. - $@c{serious}개인의 문제가 아니라 세계 전체가 엮인 일이었고…\n@c{serious_mhalf_fists}난 널 한계까지 밀어붙이기 위한 도구였던 거지. - $@c{neutral_eclosed}내가 잘 쓰였는진 모르겠지만 어쨌든 최선을 다 했고. - $@c{neutral}끝끝내 도착한 이곳은 끔찍하지만…\n언젠가 와 본 것 같아. - $@c{serious_mhalf_fists}너도 그렇게 느끼지? - $@c{serious}…그리고 무언가가 이야기하고 있어.\n오랫동안 세상에 알려져온 무언가가. - $우리가 함께했던 소중한 시간들은 이제 그저 아득해. - $@c{neutral_eclosed}실제로 일어난 일이긴 할까? - $@c{serious_mopen_fists}너는 계속 나아가야 해. 그렇지 않으면 끝나지 않아.\n오직 너만이 할 수 있어. - $@c{serious_smile_fists}잘 모르겠지만, 하나만은 확실해. - $@c{serious_mopen_fists}여기서 날 쓰러뜨리지 못한다면, 너에게 기회는 없을거란걸.` - }, - "victory": { - 1: `@c{smile_eclosed}내 역할은 여기까진 것 같아. - $하나만 약속해 줘.\n@c{smile}세상을 원래대로 되돌리고 나면, 집으로 돌아오는거야.` - }, - }, - "rival_6_female": { - "encounter": { - 1: `@c{smile_ehalf}또 이렇게 만났네. - $@c{smile_eclosed}나 머릿속이 빙글빙글 도는 것 같아… - $@c{smile_ehalf}모든 것이 이상하게 보이는 이유.\n분명 뭔가가 있어… - $@c{smile}너는 너의 꿈이 있고,\n나는 나의 야망이 있지… - $이 모든것, 우리가 하고 있는 모든 일들이\n더 큰 무언가를 위한 것임을 느낄 수밖에 없어. - $@c{smile_eclosed}나는 아마 너를…\n한계까지 몰아붙여야 하는 거야. - $@c{smile_ehalf}잘 해왔는지는 모르겠는데, 최선은 다 했어. - $이 이상하고 무서운 곳…\n모든게 선명하게 보이고… - $이건… 오래전부터 세상에 알려져온 전부. - $@c{smile_eclosed}우리가 함께해온 추억들이, 이제는 거의 떠오르지 않아. - $@c{smile_ehalf}실제로 일어났던 일일까? 너무 멀게만 느껴지는데… - $@c{angry_mopen}계속 나아가야 해. 안 그러면, 영원히 끝나지 않을 거야. \n오직 너만이 할 수 있어. - $@c{smile_ehalf}난… 이 모든게 무슨 의미가 있는지는 잘 모르겠지만…\n이거 하나는 느끼고 있어. - $@c{neutral}여기서 날 쓰러뜨리지 못한다면, 너에게 기회는 없을거란걸.` - }, - "victory": { - 1: `@c{smile_ehalf}나… 내 소임을 다 한 기분이야… - $@c{smile_eclosed}약속해 줘… 세상을 원래대로 되돌리고서… \n집으로… 무사히 돌아오는 거야. - $@c{smile_ehalf}…고마워.` - }, - }, -}; - - -// Dialogue of the NPCs in the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = PGMdialogue; - -// Dialogue of the endboss of the game when the player character is male (Or unset) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `드디어 때가 다시 도래했다.\n당도한 연유를 아는가? - $이미 도달한 적이 있기에 이 자리에 있다.\n셀 수도 없이 많이. - $아니, 사실 셀 수는 있지.\n정확히 너의 5,643,853번째다. - $매 번 태초의 정신으로 되돌아갔을 뿐.\n하지만 어떻게든, 흔적은 남는다. - $실패만을 반복했을 뿐이지만,\n지금은 네 안에 무언가가 있구나.\n - $홀로 선 것처럼 보이나, 무언가 이질적인… - $마침내 그간의 갈망을 해소해주는가?\n수천 년 간 기다려온 도전을? - $시작하지.`, - "firstStageWin": `그렇군. 정말로 있었어.\n이제 주저할 필요는 없다. - $실망시키지 않도록.`, - "secondStageWin": "…고무적이군." -}; - -// Dialogue of the endboss of the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDialogue; - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}오? 이긴거야?@d{96} @c{smile_eclosed}진즉 알았어야 했는데.\n아무튼, 돌아왔구나. - $@c{smile}다 끝난거야.@d{64} 네가 굴레를 끝장냈어. - $@c{serious_smile_fists}네 꿈도 이뤄졌고말야.\n진짜로 한 번도 안 졌잖아. - $@c{neutral}기억하는 건 우리들 뿐일 모양이지만.@d{96}\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}그럴 줄 알았다니까. - $@c{smile_eclosed}물론… 언제나 느껴왔지.\n@c{smile}끝난 거, 맞지? 이 굴레를 말이야. - $@c{smile_ehalf}네 꿈도 이뤘고 말이야.\n어떻게 한번도 안 졌대? - $네가 한 일은 나만 기억하게 될 모양이지만.\n@c{angry_mopen}나, 안 까먹어볼 테니까! - $@c{smile_wave_wink}농담이야!@d{64} @c{smile}절대 안 잊어버릴 거야.@d{32}\n마음 속엔 쭉 남아있을 수 있게. - $@c{smile_wave}어쨌든,@d{64} 시간이 좀 늦었어…@d{96}\n이런 곳에서 할 말은 아닌가? - $집에 가자. @c{smile_wave_wink}아마 내일은,\n추억을 되짚어보기 위한 배틀을 해볼 수 있을 거야.`, - "ending_endless": "끝에 도달하신 것을 축하드립니다!\n더 많은 컨텐츠를 기다려주세요.", - "ending_name": "Devs" -}; -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; - - -// Dialogue of the named double battles in the game. For when the player is male (or unset). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `그린: 어이 레드! 우리가 누군지 보여주자고! - $레드: ... - $그린: 태초마을의 힘을 보여주지!`, - }, - "victory": { - 1: `그린: 훌륭한 승부였어! - $레드: ...`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `레드: ...! - $그린: 이 녀석은 여전히 말이 없구나. - $그린: 그렇지만 방심해선 안 돼! 그래도 챔피언이라고!`, - }, - "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: `성호: 너 혹시 희귀한 포켓몬 가지고 있니? - $윤진: 성호야... 우리는 포켓몬을 자랑하러 온 게 아니라 승부하러 온 거야. - $성호: 오... 그렇지... 그럼 간다!`, - }, - "victory": { - 1: `성호: 이제 승부는 끝났으니 포켓몬을 자랑해 볼까! - $윤진: 성호야...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `노간주: 우리는 하나 지방 최강의 트레이너들이란다! - $아이리스: 이렇게 강한 트레이너와 싸울 수 있어서 정말 기뻐~!!`, - }, - "victory": { - 1: `노간주: 장하구나! 실로 견줄 자가 천하에 없도다! - $아이리스: 다음 번엔 우리가 꼭 이길 거야~!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `아이리스: 어서 와, 도전자! 내가 바로 하나 지방 챔피언이야~! - $노간주: 아이리스야, 너무 흥분한 것 아니냐?`, - }, - "victory": { - 1: `아이리스: 후와아아아아... 최선을 다했는데도... 우리가 져버렸네! - $노간주: 하지만 우리의 패배를 발판 삼아 나아가리라!`, - }, - }, - "piers_marnie_double": { - "encounter": { - 1: `마리: 오빠, 스파이크마을의 힘을 보여주자! - $두송: 우리가 어둠을 불러올 것이다!`, - }, - "victory": { - 1: `마리: 네가 우리의 어둠에 빛을 불러왔구나! - $두송: 여긴 너무 밝네...`, - }, - }, - "marnie_piers_double": { - "encounter": { - 1: `두송: 콘서트 즐길 준비 됐어? - $마리: 오빠... 얘들은 노래가 아니라 승부를 하러 왔어...`, - }, - "victory": { - 1: `두송: 훌륭한 콘서트였다! - $마리: 오빠...`, - }, - }, -}; - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = PGMdoubleBattleDialogue; diff --git a/src/locales/ko/egg.ts b/src/locales/ko/egg.json similarity index 90% rename from src/locales/ko/egg.ts rename to src/locales/ko/egg.json index 88a845c6424..96985be8cfe 100644 --- a/src/locales/ko/egg.ts +++ b/src/locales/ko/egg.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { +{ "egg": "알", "greatTier": "레어", "ultraTier": "에픽", @@ -22,4 +20,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "알이 부화해서\n{{pokemonName}}[[가]] 태어났다!", "eggMoveUnlock": "알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", "rareEggMoveUnlock": "레어 알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", -} as const; + "moveUPGacha": "알 기술 UP!", + "shinyUPGacha": "색이 다른 포켓몬\nUP!", + "legendaryUPGacha": "UP!" +} \ No newline at end of file diff --git a/src/locales/ko/fight-ui-handler.json b/src/locales/ko/fight-ui-handler.json new file mode 100644 index 00000000000..a5f961095e1 --- /dev/null +++ b/src/locales/ko/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "위력", + "accuracy": "명중률", + "abilityFlyInText": " {{pokemonName}}의 {{passive}}{{abilityName}}", + "passive": "패시브 " +} \ No newline at end of file diff --git a/src/locales/ko/fight-ui-handler.ts b/src/locales/ko/fight-ui-handler.ts deleted file mode 100644 index cf840cc4495..00000000000 --- a/src/locales/ko/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "위력", - "accuracy": "명중률", - "abilityFlyInText": " {{pokemonName}}의 {{passive}}{{abilityName}}", - "passive": "패시브 ", // The space at the end is important -} as const; diff --git a/src/locales/ko/filter-bar.json b/src/locales/ko/filter-bar.json new file mode 100644 index 00000000000..b2104e61750 --- /dev/null +++ b/src/locales/ko/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "세대", + "typeFilter": "타입", + "caughtFilter": "포획", + "unlocksFilter": "해금", + "miscFilter": "기타", + "sortFilter": "정렬", + "all": "전체", + "normal": "기본", + "uncaught": "미포획", + "passive": "패시브", + "passiveUnlocked": "패시브 해금", + "passiveLocked": "패시브 잠김", + "passiveUnlockable": "패시브 해금 가능", + "costReduction": "코스트 감소", + "costReductionUnlocked": "코스트 감소됨", + "costReductionLocked": "코스트 감소 없음", + "costReductionUnlockable": "코스트 감소 가능", + "favorite": "즐겨찾기", + "isFavorite": "즐겨찾기 등록됨", + "notFavorite": "즐겨찾기 제외됨", + "ribbon": "클리어 여부", + "hasWon": "클리어 완료", + "hasNotWon": "클리어 안함", + "hiddenAbility": "숨겨진 특성", + "hasHiddenAbility": "숨겨진 특성 보유", + "noHiddenAbility": "숨겨진 특성 없음", + "egg": "알", + "eggPurchasable": "알 구매 가능", + "pokerus": "포켓러스", + "hasPokerus": "포켓러스 감염", + "noPokerus": "포켓러스 없음", + "sortByNumber": "도감번호", + "sortByCost": "코스트", + "sortByCandies": "사탕 수", + "sortByIVs": "개체값", + "sortByName": "이름" +} \ No newline at end of file diff --git a/src/locales/ko/game-mode.json b/src/locales/ko/game-mode.json new file mode 100644 index 00000000000..8fd619aceeb --- /dev/null +++ b/src/locales/ko/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "클래식", + "endless": "엔드리스", + "endlessSpliced": "엔드리스(융합체)", + "dailyRun": "데일리 런", + "unknown": "언노운", + "challenge": "챌린지" +} \ No newline at end of file diff --git a/src/locales/ko/game-mode.ts b/src/locales/ko/game-mode.ts deleted file mode 100644 index 423f2adb26a..00000000000 --- a/src/locales/ko/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "클래식", - "endless": "엔드리스", - "endlessSpliced": "엔드리스(융합체)", - "dailyRun": "데일리 런", - "unknown": "언노운", - "challenge": "챌린지", -} as const; diff --git a/src/locales/ko/game-stats-ui-handler.ts b/src/locales/ko/game-stats-ui-handler.json similarity index 89% rename from src/locales/ko/game-stats-ui-handler.ts rename to src/locales/ko/game-stats-ui-handler.json index d21f1b2acda..bf184acc32b 100644 --- a/src/locales/ko/game-stats-ui-handler.ts +++ b/src/locales/ko/game-stats-ui-handler.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { +{ "stats": "통계", "playTime": "플레이타임", "totalBattles": "배틀 수", @@ -40,5 +38,5 @@ export const gameStatsUiHandler: SimpleTranslationEntries = { "rareEggsPulled": "뽑은 레어 알", "epicEggsPulled": "뽑은 에픽 알", "legendaryEggsPulled": "뽑은 레전더리 알", - "manaphyEggsPulled": "뽑은 마나피 알", -} as const; + "manaphyEggsPulled": "뽑은 마나피 알" +} \ No newline at end of file diff --git a/src/locales/ko/growth.ts b/src/locales/ko/growth.json similarity index 54% rename from src/locales/ko/growth.ts rename to src/locales/ko/growth.json index 941198fd5d4..cd69c9f1cc1 100644 --- a/src/locales/ko/growth.ts +++ b/src/locales/ko/growth.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { +{ "Erratic": "불규칙", "Fast": "빠름", "Medium_Fast": "중간 빠름", "Medium_Slow": "중간 느림", "Slow": "느림", "Fluctuating": "변동" -} as const; +} \ No newline at end of file diff --git a/src/locales/ko/menu-ui-handler.ts b/src/locales/ko/menu-ui-handler.json similarity index 65% rename from src/locales/ko/menu-ui-handler.ts rename to src/locales/ko/menu-ui-handler.json index 94c3cb2df0c..7fecbf7c25f 100644 --- a/src/locales/ko/menu-ui-handler.ts +++ b/src/locales/ko/menu-ui-handler.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { +{ "GAME_SETTINGS": "게임 설정", "ACHIEVEMENTS": "업적", "STATS": "통계", - "VOUCHERS": "바우처", + "RUN_HISTORY": "플레이 이력", "EGG_LIST": "알 목록", "EGG_GACHA": "알 뽑기", "MANAGE_DATA": "데이터 관리", @@ -16,9 +14,16 @@ export const menuUiHandler: SimpleTranslationEntries = { "importSlotSelect": "불러올 슬롯을 골라주세요.", "exportSession": "세션 내보내기", "exportSlotSelect": "내보낼 슬롯을 골라주세요.", + "importRunHistory":"플레이 이력 불러오기", + "exportRunHistory":"플레이 이력 내보내기", "importData": "데이터 불러오기", "exportData": "데이터 내보내기", + "consentPreferences": "쿠키 설정 동의", + "linkDiscord": "디스코드 연동", + "unlinkDiscord": "디스코드 연동해제", + "linkGoogle": "구글 연동", + "unlinkGoogle": "구글 연동해제", "cancel": "취소", "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?", - "noEggs": "You are not hatching\nany eggs at the moment!" -} as const; + "noEggs": "부화중인 알이 없습니다!" +} \ No newline at end of file diff --git a/src/locales/ko/menu.ts b/src/locales/ko/menu.json similarity index 86% rename from src/locales/ko/menu.ts rename to src/locales/ko/menu.json index cf72dab8a37..a9db630f7a1 100644 --- a/src/locales/ko/menu.ts +++ b/src/locales/ko/menu.json @@ -1,11 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const menu: SimpleTranslationEntries = { +{ "cancel": "취소", "continue": "계속하기", "dailyRun": "데일리 런 (베타)", @@ -17,6 +10,7 @@ export const menu: SimpleTranslationEntries = { "username": "이름", "password": "비밀번호", "login": "로그인", + "orUse": "혹은", "register": "등록", "emptyUsername": "이름은 비워둘 수 없습니다", "invalidLoginUsername": "사용할 수 없는 이름입니다", @@ -47,12 +41,17 @@ export const menu: SimpleTranslationEntries = { "score": "점수", "wave": "웨이브", "loading": "로딩 중…", - "loadingAsset": "Loading asset: {{assetName}}", + "loadingAsset": "리소스 로드 중: {{assetName}}", "playersOnline": "플레이어 온라인", - "yes":"예", - "no":"아니오", + "yes": "예", + "no": "아니오", "disclaimer": "면책 조항", "disclaimerDescription": "이 게임은 완전히 개발되지 않았습니다- (세이브 데이터 소실을 포함) 플레이에 지장을 주는 문제가 생길 수 있으며,\n공지 없이 업데이트가 진행 혹은 중지될 수 있습니다.", "choosePokemon": "포켓몬을 선택하세요.", + "renamePokemon": "포켓몬의 닉네임은?", + "rename": "닉네임 바꾸기", + "nickname": "닉네임", "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.", -} as const; + "noSaves": "기기에 세이브 파일이 없습니다!", + "tooManySaves": "기기에 세이브 파일이 너무 많습니다!" +} diff --git a/src/locales/ko/modifier-select-ui-handler.json b/src/locales/ko/modifier-select-ui-handler.json new file mode 100644 index 00000000000..04b47542e14 --- /dev/null +++ b/src/locales/ko/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "건네주기", + "reroll": "갱신", + "lockRarities": "희귀도 고정", + "checkTeam": "파티 확인", + "transferDesc": "지닌 물건을 다른 포켓몬에게 건네줍니다.", + "rerollDesc": "돈을 소모하여 아이템 목록을 새로 고칩니다.", + "lockRaritiesDesc": "갱신되는 아이템의 희귀도가 고정됩니다(갱신 비용 증가).", + "checkTeamDesc": "파티를 확인하거나 폼 변경 아이템을 사용합니다.", + "rerollCost": "₽{{formattedMoney}}", + "itemCost": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/ko/modifier-type.json b/src/locales/ko/modifier-type.json new file mode 100644 index 00000000000..e957fd0d58a --- /dev/null +++ b/src/locales/ko/modifier-type.json @@ -0,0 +1,607 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{pokeballName}} {{modifierCount}}개", + "description": "{{pokeballName}} {{modifierCount}}개 (현재: {{pokeballAmount}}개)를 획득한다.\n포획률: {{catchRate}}" + }, + "AddVoucherModifierType": { + "name": "{{voucherTypeName}} {{modifierCount}}장", + "description": "{{voucherTypeName}} {{modifierCount}}장을 획득한다." + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}}[[는]]\n이 아이템을 얻을 수 없다!", + "tooMany": "{{pokemonName}}[[는]]\n이 아이템을 너무 많이 갖고 있다!" + } + }, + "PokemonHpRestoreModifierType": { + "description": "포켓몬 1마리의 HP를 {{restorePoints}} 또는 {{restorePercent}}% 중\n높은 수치만큼 회복한다.", + "extra": { + "fully": "포켓몬 1마리의 HP를 모두 회복한다.", + "fullyWithStatus": "포켓몬 1마리의 HP와 상태 이상을 모두 회복한다." + } + }, + "PokemonReviveModifierType": { + "description": "기절해 버린 포켓몬 1마리의 HP를 {{restorePercent}}%까지 회복한다." + }, + "PokemonStatusHealModifierType": { + "description": "포켓몬 1마리의 상태 이상을 모두 회복한다." + }, + "PokemonPpRestoreModifierType": { + "description": "포켓몬이 기억하고 있는 기술 중 1개의 PP를 {{restorePoints}}만큼 회복한다.", + "extra": { + "fully": "포켓몬이 기억하고 있는 기술 중 1개의 PP를 모두 회복한다." + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "포켓몬이 기억하고 있는 4개의 기술 PP를 {{restorePoints}}씩 회복한다.", + "extra": { + "fully": "포켓몬이 기억하고 있는 4개의 기술 PP를 모두 회복한다." + } + }, + "PokemonPpUpModifierType": { + "description": "포켓몬이 기억하고 있는 기술 중 1개의 PP 최대치를 5마다 {{upPoints}}씩 상승시킨다. (최대 3)" + }, + "PokemonNatureChangeModifierType": { + "name": "{{natureName}}민트", + "description": "포켓몬의 성격을 {{natureName}}[[로]] 바꾸고 스타팅에도 등록한다." + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 4배가 된다." + }, + "TempStatStageBoosterModifierType": { + "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] {{amount}}단계 증가한다.", + "extra": { + "stage": "1 스테이지", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다." + }, + "PokemonLevelIncrementModifierType": { + "description": "포켓몬 1마리의 레벨이 {{levels}}만큼 상승한다." + }, + "AllPokemonLevelIncrementModifierType": { + "description": "자신의 모든 포켓몬의 레벨이 {{levels}}만큼 상승한다." + }, + "BaseStatBoosterModifierType": { + "description": "지니게 하면 {{stat}} 종족값을 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다." + }, + "AllPokemonFullHpRestoreModifierType": { + "description": "자신의 포켓몬의 HP를 모두 회복한다." + }, + "AllPokemonFullReviveModifierType": { + "description": "기절해 버린 포켓몬 전원의 HP를 완전히 회복한다." + }, + "MoneyRewardModifierType": { + "description": "{{moneyMultiplier}} 양의 돈을 획득한다. (₽{{moneyAmount}})", + "extra": { + "small": "적은", + "moderate": "적당한", + "large": "많은" + } + }, + "ExpBoosterModifierType": { + "description": "포켓몬이 받는 경험치가 {{boostPercent}}% 증가한다." + }, + "PokemonExpBoosterModifierType": { + "description": "지니게 한 포켓몬은 받는 경험치가 {{boostPercent}}% 증가한다." + }, + "PokemonFriendshipBoosterModifierType": { + "description": "배틀 승리로 얻는 친밀도가 50% 증가한다." + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "기술의 명중률이 {{accuracyAmount}} 증가한다. (최대 100)" + }, + "PokemonMultiHitModifierType": { + "description": "지닌 개수(최대 3개)마다 추가 공격을 하는 대신, 공격력이 60%(1개)/75%(2개)/82.5%(3개)만큼 감소합니다." + }, + "TmModifierType": { + "name": "No.{{moveId}} {{moveName}}", + "description": "포켓몬에게 {{moveName}}[[를]] 가르침." + }, + "TmModifierTypeWithInfo": { + "name": "No.{{moveId}} {{moveName}}", + "description": "포켓몬에게 {{moveName}}[[를]] 가르침.\n(C 또는 Shift를 꾹 눌러 정보 확인)" + }, + "EvolutionItemModifierType": { + "description": "어느 특정 포켓몬을 진화시킨다." + }, + "FormChangeItemModifierType": { + "description": "어느 특정 포켓몬을 폼 체인지시킨다." + }, + "FusePokemonModifierType": { + "description": "두 포켓몬을 결합시킨다. (특성 변환, 종족값과 타입 분배, 기술폭 공유)" + }, + "TerastallizeModifierType": { + "name": "테라피스 {{teraType}}", + "description": "지니게 하면 10번의 배틀 동안 {{teraType}} 테라스탈타입으로 테라스탈한다." + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "공격했을 때, {{chancePercent}}%의 확률로 상대의 도구를 도둑질한다." + }, + "TurnHeldItemTransferModifierType": { + "description": "매 턴, 지닌 포켓몬은 상대로부터 도구를 하나 획득한다." + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "공격했을 때 {{statusEffect}} 상태로 만들 확률이 {{chancePercent}}% 추가된다." + }, + "EnemyEndureChanceModifierType": { + "description": "받은 공격을 버텨낼 확률이 {{chancePercent}}% 추가된다." + }, + "RARE_CANDY": { + "name": "이상한사탕" + }, + "RARER_CANDY": { + "name": "더이상한사탕" + }, + "MEGA_BRACELET": { + "name": "메가링", + "description": "메가스톤을 사용할 수 있게 된다." + }, + "DYNAMAX_BAND": { + "name": "다이맥스 밴드", + "description": "다이버섯을 사용할 수 있게 된다." + }, + "TERA_ORB": { + "name": "테라스탈오브", + "description": "테라피스를 사용할 수 있게 된다." + }, + "MAP": { + "name": "지도", + "description": "갈림길에서 목적지를 선택할 수 있다." + }, + "POTION": { + "name": "상처약" + }, + "SUPER_POTION": { + "name": "좋은상처약" + }, + "HYPER_POTION": { + "name": "고급상처약" + }, + "MAX_POTION": { + "name": "풀회복약" + }, + "FULL_RESTORE": { + "name": "회복약" + }, + "REVIVE": { + "name": "기력의조각" + }, + "MAX_REVIVE": { + "name": "기력의덩어리" + }, + "FULL_HEAL": { + "name": "만병통치제" + }, + "SACRED_ASH": { + "name": "성스러운분말" + }, + "REVIVER_SEED": { + "name": "부활의씨앗", + "description": "포켓몬이 공격을 받고 쓰러지려 할 때 HP를 절반 회복한다." + }, + "WHITE_HERB": { + "name": "하양허브", + "description": "지니게 한 포켓몬의 능력이 떨어졌을 때 원래 상태로 돌아온다." + }, + "ETHER": { + "name": "PP에이드" + }, + "MAX_ETHER": { + "name": "PP회복" + }, + "ELIXIR": { + "name": "PP에이더" + }, + "MAX_ELIXIR": { + "name": "PP맥스" + }, + "PP_UP": { + "name": "포인트업" + }, + "PP_MAX": { + "name": "포인트맥스" + }, + "LURE": { + "name": "더블배틀코롱" + }, + "SUPER_LURE": { + "name": "실버코롱" + }, + "MAX_LURE": { + "name": "골드코롱" + }, + "MEMORY_MUSHROOM": { + "name": "기억버섯", + "description": "포켓몬이 잊어버린 기술을 떠올린다." + }, + "EXP_SHARE": { + "name": "학습장치", + "description": "배틀에 참여하지 않아도 20%의 경험치를 받을 수 있게 된다." + }, + "EXP_BALANCE": { + "name": "균형학습장치", + "description": "레벨이 낮은 포켓몬이 받는 경험치를 가중시킨다." + }, + "OVAL_CHARM": { + "name": "둥근부적", + "description": "여러 마리의 포켓몬이 배틀에 참여할 경우, 전체 경험치의 10%씩을 추가로 획득한다." + }, + "EXP_CHARM": { + "name": "경험부적" + }, + "SUPER_EXP_CHARM": { + "name": "좋은경험부적" + }, + "GOLDEN_EXP_CHARM": { + "name": "황금경험부적" + }, + "LUCKY_EGG": { + "name": "행복의알" + }, + "GOLDEN_EGG": { + "name": "황금의알" + }, + "SOOTHE_BELL": { + "name": "평온의방울" + }, + "SCOPE_LENS": { + "name": "초점렌즈", + "description": "약점이 보이는 렌즈. 지니게 한 포켓몬의 기술이 급소에 맞기 쉬워진다." + }, + "DIRE_HIT": { + "name": "크리티컬커터", + "extra": { + "raises": "급소율" + } + }, + "LEEK": { + "name": "대파", + "description": "매우 길고 단단한 줄기. 파오리에게 지니게 하면 기술이 급소에 맞기 쉬워진다." + }, + "EVIOLITE": { + "name": "진화의휘석", + "description": "진화의 이상한 덩어리. 지니게 하면 진화 전 포켓몬의 방어와 특수방어가 올라간다." + }, + "SOUL_DEW": { + "name": "마음의물방울", + "description": "지닌 포켓몬의 성격의 효과가 10% 증가한다. (합연산)" + }, + "NUGGET": { + "name": "금구슬" + }, + "BIG_NUGGET": { + "name": "큰금구슬" + }, + "RELIC_GOLD": { + "name": "고대의금화" + }, + "AMULET_COIN": { + "name": "부적금화", + "description": "받는 돈이 20% 증가한다." + }, + "GOLDEN_PUNCH": { + "name": "골든펀치", + "description": "주는 데미지의 50%만큼 돈을 획득한다." + }, + "COIN_CASE": { + "name": "동전케이스", + "description": "매 열 번째 배틀마다, 가진 돈의 10%를 이자로 획득한다." + }, + "LOCK_CAPSULE": { + "name": "록캡슐", + "description": "받을 아이템을 갱신할 때 희귀도를 고정시킬 수 있게 된다." + }, + "GRIP_CLAW": { + "name": "끈기갈고리손톱" + }, + "WIDE_LENS": { + "name": "광각렌즈" + }, + "MULTI_LENS": { + "name": "멀티렌즈" + }, + "HEALING_CHARM": { + "name": "치유의부적", + "description": "HP를 회복하는 기술이나 도구를 썼을 때 효율이 10% 증가한다. (부활 제외)" + }, + "CANDY_JAR": { + "name": "사탕단지", + "description": "이상한사탕 종류의 아이템이 올려주는 레벨이 1 증가한다." + }, + "BERRY_POUCH": { + "name": "열매주머니", + "description": "사용한 나무열매가 소모되지 않을 확률이 30% 추가된다." + }, + "FOCUS_BAND": { + "name": "기합의머리띠", + "description": "기절할 듯한 데미지를 받아도 HP를 1 남겨서 견딜 확률이 10% 추가된다." + }, + "QUICK_CLAW": { + "name": "선제공격손톱", + "description": "상대보다 먼저 행동할 수 있게 될 확률이 10% 추가된다. (우선도 처리 이후)" + }, + "KINGS_ROCK": { + "name": "왕의징표석", + "description": "공격해서 데미지를 줄 때 상대를 풀죽일 확률이 10% 추가된다." + }, + "LEFTOVERS": { + "name": "먹다남은음식", + "description": "포켓몬의 HP가 매 턴 최대 체력의 1/16씩 회복된다." + }, + "SHELL_BELL": { + "name": "조개껍질방울", + "description": "포켓몬이 준 데미지의 1/8씩을 회복한다." + }, + "TOXIC_ORB": { + "name": "맹독구슬", + "description": "이 도구를 지닌 포켓몬은 턴이 끝나는 시점에 상태이상에 걸리지 않았다면 맹독 상태가 된다." + }, + "FLAME_ORB": { + "name": "화염구슬", + "description": "이 도구를 지닌 포켓몬은 턴이 끝나는 시점에 상태이상에 걸리지 않았다면 화상 상태가 된다." + }, + "BATON": { + "name": "바톤", + "description": "포켓몬을 교체할 때 효과를 넘겨줄 수 있으며, 함정의 영향을 받지 않게 함" + }, + "SHINY_CHARM": { + "name": "빛나는부적", + "description": "야생 포켓몬이 색이 다른 포켓몬으로 등장할 확률을 급격히 높인다." + }, + "ABILITY_CHARM": { + "name": "특성부적", + "description": "야생 포켓몬이 숨겨진 특성을 가지고 등장할 확률을 급격히 높인다." + }, + "IV_SCANNER": { + "name": "개체값탐지기", + "description": "야생 포켓몬의 개체값을 확인 가능하다. 높은 값부터, 확인할 수 있는 개체값이 두 종류씩 추가된다." + }, + "DNA_SPLICERS": { + "name": "유전자쐐기" + }, + "MINI_BLACK_HOLE": { + "name": "미니 블랙홀" + }, + "GOLDEN_POKEBALL": { + "name": "황금몬스터볼", + "description": "전투 후 획득하는 아이템의 선택지가 하나 더 늘어난다." + }, + "ENEMY_DAMAGE_BOOSTER": { + "name": "데미지 토큰", + "description": "주는 데미지를 5% 증가시킨다." + }, + "ENEMY_DAMAGE_REDUCTION": { + "name": "보호 토큰", + "description": "받는 데미지를 2.5% 감소시킨다." + }, + "ENEMY_HEAL": { + "name": "회복 토큰", + "description": "매 턴 최대 체력의 2%를 회복한다." + }, + "ENEMY_ATTACK_POISON_CHANCE": { + "name": "독 토큰" + }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { + "name": "마비 토큰" + }, + "ENEMY_ATTACK_BURN_CHANCE": { + "name": "화상 토큰" + }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { + "name": "만병통치 토큰", + "description": "매 턴 상태이상에서 회복될 확률이 2.5% 추가된다." + }, + "ENEMY_ENDURE_CHANCE": { + "name": "버티기 토큰" + }, + "ENEMY_FUSED_CHANCE": { + "name": "합체 토큰", + "description": "야생 포켓몬이 합체되어 등장할 확률이 1% 추가된다." + } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { + "name": "전기구슬", + "description": "피카츄에게 지니게 하면 공격과 특수공격이 올라가는 이상한 구슬." + }, + "THICK_CLUB": { + "name": "굵은뼈", + "description": "무언가의 단단한 뼈. 탕구리 혹은 텅구리에게 지니게 하면 공격이 올라간다." + }, + "METAL_POWDER": { + "name": "금속파우더", + "description": "메타몽에게 지니게 하면 방어가 올라가는 이상한 가루. 매우 잘고 단단하다." + }, + "QUICK_POWDER": { + "name": "스피드파우더", + "description": "메타몽에게 지니게 하면 스피드가 올라가는 이상한 가루. 매우 잘고 단단하다." + } + }, + "TempStatStageBoosterItem": { + "x_attack": "플러스파워", + "x_defense": "디펜드업", + "x_sp_atk": "스페셜업", + "x_sp_def": "스페셜가드", + "x_speed": "스피드업", + "x_accuracy": "잘-맞히기" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "실크스카프", + "black_belt": "검은띠", + "sharp_beak": "예리한부리", + "poison_barb": "독바늘", + "soft_sand": "부드러운모래", + "hard_stone": "딱딱한돌", + "silver_powder": "은빛가루", + "spell_tag": "저주의부적", + "metal_coat": "금속코트", + "charcoal": "목탄", + "mystic_water": "신비의물방울", + "miracle_seed": "기적의씨", + "magnet": "자석", + "twisted_spoon": "휘어진스푼", + "never_melt_ice": "녹지않는얼음", + "dragon_fang": "용의이빨", + "black_glasses": "검은안경", + "fairy_feather": "요정의깃털" + }, + "BaseStatBoosterItem": { + "hp_up": "맥스업", + "protein": "타우린", + "iron": "사포닌", + "calcium": "리보플라빈", + "zinc": "키토산", + "carbos": "알칼로이드" + }, + "EvolutionItem": { + "NONE": "None", + "LINKING_CORD": "연결의끈", + "SUN_STONE": "태양의돌", + "MOON_STONE": "달의돌", + "LEAF_STONE": "리프의돌", + "FIRE_STONE": "불꽃의돌", + "WATER_STONE": "물의돌", + "THUNDER_STONE": "천둥의돌", + "ICE_STONE": "얼음의돌", + "DUSK_STONE": "어둠의돌", + "DAWN_STONE": "각성의돌", + "SHINY_STONE": "빛의돌", + "CRACKED_POT": "깨진포트", + "SWEET_APPLE": "달콤한사과", + "TART_APPLE": "새콤한사과", + "STRAWBERRY_SWEET": "딸기사탕공예", + "UNREMARKABLE_TEACUP": "범작찻잔", + "CHIPPED_POT": "이빠진포트", + "BLACK_AUGURITE": "검은휘석", + "GALARICA_CUFF": "가라두구팔찌", + "GALARICA_WREATH": "가라두구머리장식", + "PEAT_BLOCK": "피트블록", + "AUSPICIOUS_ARMOR": "축복받은갑옷", + "MALICIOUS_ARMOR": "저주받은갑옷", + "MASTERPIECE_TEACUP": "걸작찻잔", + "METAL_ALLOY": "복합금속", + "SCROLL_OF_DARKNESS": "악의 족자", + "SCROLL_OF_WATERS": "물의 족자", + "SYRUPY_APPLE": "꿀맛사과" + }, + "FormChangeItem": { + "NONE": "None", + "ABOMASITE": "눈설왕나이트", + "ABSOLITE": "앱솔나이트", + "AERODACTYLITE": "프테라나이트", + "AGGRONITE": "보스로라나이트", + "ALAKAZITE": "후딘나이트", + "ALTARIANITE": "파비코리나이트", + "AMPHAROSITE": "전룡나이트", + "AUDINITE": "다부니나이트", + "BANETTITE": "다크펫나이트", + "BEEDRILLITE": "독침붕나이트", + "BLASTOISINITE": "거북왕나이트", + "BLAZIKENITE": "번치코나이트", + "CAMERUPTITE": "폭타나이트", + "CHARIZARDITE_X": "리자몽나이트 X", + "CHARIZARDITE_Y": "리자몽나이트 Y", + "DIANCITE": "디안시나이트", + "GALLADITE": "엘레이드나이트", + "GARCHOMPITE": "한카리아스나이트", + "GARDEVOIRITE": "가디안나이트", + "GENGARITE": "팬텀나이트", + "GLALITITE": "얼음귀신나이트", + "GYARADOSITE": "갸라도스나이트", + "HERACRONITE": "헤라크로스나이트", + "HOUNDOOMINITE": "헬가나이트", + "KANGASKHANITE": "캥카나이트", + "LATIASITE": "라티아스나이트", + "LATIOSITE": "라티오스나이트", + "LOPUNNITE": "이어롭나이트", + "LUCARIONITE": "루카리오나이트", + "MANECTITE": "썬더볼트나이트", + "MAWILITE": "입치트나이트", + "MEDICHAMITE": "요가램나이트", + "METAGROSSITE": "메타그로스나이트", + "MEWTWONITE_X": "뮤츠나이트 X", + "MEWTWONITE_Y": "뮤츠나이트 Y", + "PIDGEOTITE": "피죤투나이트", + "PINSIRITE": "쁘사이저나이트", + "RAYQUAZITE": "레쿠쟈나이트", + "SABLENITE": "깜까미나이트", + "SALAMENCITE": "보만다나이트", + "SCEPTILITE": "나무킹나이트", + "SCIZORITE": "핫삼나이트", + "SHARPEDONITE": "샤크니아나이트", + "SLOWBRONITE": "야도란나이트", + "STEELIXITE": "강철톤나이트", + "SWAMPERTITE": "대짱이나이트", + "TYRANITARITE": "마기라스나이트", + "VENUSAURITE": "이상해꽃나이트", + "BLUE_ORB": "쪽빛구슬", + "RED_ORB": "주홍구슬", + "SHARP_METEORITE": "뾰족한운석", + "HARD_METEORITE": "단단한운석", + "SMOOTH_METEORITE": "부드러운운석", + "ADAMANT_CRYSTAL": "큰금강옥", + "LUSTROUS_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": "주춧돌의가면", + "SHOCK_DRIVE": "번개카세트", + "BURN_DRIVE": "블레이즈카세트", + "CHILL_DRIVE": "프리즈카세트", + "DOUSE_DRIVE": "아쿠아카세트", + "ULTRANECROZIUM_Z": "울트라네크로Z", + "FIST_PLATE": "주먹플레이트", + "SKY_PLATE": "푸른하늘플레이트", + "TOXIC_PLATE": "맹독플레이트", + "EARTH_PLATE": "대지플레이트", + "STONE_PLATE": "암석플레이트", + "INSECT_PLATE": "비단벌레플레이트", + "SPOOKY_PLATE": "원령플레이트", + "IRON_PLATE": "강철플레이트", + "FLAME_PLATE": "불구슬플레이트", + "SPLASH_PLATE": "물방울플레이트", + "MEADOW_PLATE": "초록플레이트", + "ZAP_PLATE": "우뢰플레이트", + "MIND_PLATE": "이상한플레이트", + "ICICLE_PLATE": "고드름플레이트", + "DRACO_PLATE": "용의플레이트", + "DREAD_PLATE": "공포플레이트", + "PIXIE_PLATE": "정령플레이트", + "BLANK_PLATE": "순백플레이트", + "LEGEND_PLATE": "레전드플레이트", + "FIGHTING_MEMORY": "파이팅메모리", + "FLYING_MEMORY": "플라잉메모리", + "POISON_MEMORY": "포이즌메모리", + "GROUND_MEMORY": "그라운드메모리", + "ROCK_MEMORY": "록메모리", + "BUG_MEMORY": "버그메모리", + "GHOST_MEMORY": "고스트메모리", + "STEEL_MEMORY": "스틸메모리", + "FIRE_MEMORY": "파이어메모리", + "WATER_MEMORY": "워터메모리", + "GRASS_MEMORY": "그래스메모리", + "ELECTRIC_MEMORY": "일렉트릭메모리", + "PSYCHIC_MEMORY": "사이킥메모리", + "ICE_MEMORY": "아이스메모리", + "DRAGON_MEMORY": "드래곤메모리", + "DARK_MEMORY": "다크메모리", + "FAIRY_MEMORY": "페어리메모리", + "NORMAL_MEMORY": "일반메모리" + } +} diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts deleted file mode 100644 index 7a8f1bef8e9..00000000000 --- a/src/locales/ko/modifier-type.ts +++ /dev/null @@ -1,451 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - "AddPokeballModifierType": { - name: "{{pokeballName}} {{modifierCount}}개", - description: "{{pokeballName}} {{modifierCount}}개 (현재: {{pokeballAmount}}개)를 획득한다.\n포획률: {{catchRate}}", - }, - "AddVoucherModifierType": { - name: "{{voucherTypeName}} {{modifierCount}}장", - description: "{{voucherTypeName}} {{modifierCount}}장을 획득한다.", - }, - "PokemonHeldItemModifierType": { - extra: { - "inoperable": "{{pokemonName}}[[는]]\n이 아이템을 얻을 수 없다!", - "tooMany": "{{pokemonName}}[[는]]\n이 아이템을 너무 많이 갖고 있다!", - } - }, - "PokemonHpRestoreModifierType": { - description: "포켓몬 1마리의 HP를 {{restorePoints}} 또는 {{restorePercent}}% 중\n높은 수치만큼 회복한다.", - extra: { - "fully": "포켓몬 1마리의 HP를 모두 회복한다.", - "fullyWithStatus": "포켓몬 1마리의 HP와 상태 이상을 모두 회복한다.", - } - }, - "PokemonReviveModifierType": { - description: "기절해 버린 포켓몬 1마리의 HP를 {{restorePercent}}%까지 회복한다.", - }, - "PokemonStatusHealModifierType": { - description: "포켓몬 1마리의 상태 이상을 모두 회복한다.", - }, - "PokemonPpRestoreModifierType": { - description: "포켓몬이 기억하고 있는 기술 중 1개의 PP를 {{restorePoints}}만큼 회복한다.", - extra: { - "fully": "포켓몬이 기억하고 있는 기술 중 1개의 PP를 모두 회복한다.", - } - }, - "PokemonAllMovePpRestoreModifierType": { - description: "포켓몬이 기억하고 있는 4개의 기술 PP를 {{restorePoints}}씩 회복한다.", - extra: { - "fully": "포켓몬이 기억하고 있는 4개의 기술 PP를 모두 회복한다.", - } - }, - "PokemonPpUpModifierType": { - description: "포켓몬이 기억하고 있는 기술 중 1개의 PP 최대치를 5마다 {{upPoints}}씩 상승시킨다 (최대 3).", - }, - "PokemonNatureChangeModifierType": { - name: "{{natureName}}민트", - description: "포켓몬의 성격을 {{natureName}}[[로]] 바꾸고 스타팅에도 등록한다.", - }, - "DoubleBattleChanceBoosterModifierType": { - description: "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 두 배가 된다.", - }, - "TempBattleStatBoosterModifierType": { - description: "자신의 모든 포켓몬이 5번의 배틀 동안 {{tempBattleStatName}}[[가]] 한 단계 증가한다." - }, - "AttackTypeBoosterModifierType": { - description: "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다.", - }, - "PokemonLevelIncrementModifierType": { - description: "포켓몬 1마리의 레벨이 1만큼 상승한다.", - }, - "AllPokemonLevelIncrementModifierType": { - description: "자신의 모든 포켓몬의 레벨이 1씩 상승한다.", - }, - "PokemonBaseStatBoosterModifierType": { - description: "지니게 하면 {{statName}} 종족값을 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다.", - }, - "AllPokemonFullHpRestoreModifierType": { - description: "자신의 포켓몬의 HP를 모두 회복한다.", - }, - "AllPokemonFullReviveModifierType": { - description: "기절해 버린 포켓몬 전원의 HP를 완전히 회복한다.", - }, - "MoneyRewardModifierType": { - description: "{{moneyMultiplier}} 양의 돈을 획득한다 (₽{{moneyAmount}}).", - extra: { - "small": "적은", - "moderate": "적당한", - "large": "많은", - }, - }, - "ExpBoosterModifierType": { - description: "포켓몬이 받는 경험치가 {{boostPercent}}% 증가한다.", - }, - "PokemonExpBoosterModifierType": { - description: "지니게 한 포켓몬은 받는 경험치가 {{boostPercent}}% 증가한다.", - }, - "PokemonFriendshipBoosterModifierType": { - description: "배틀 승리로 얻는 친밀도가 50% 증가한다.", - }, - "PokemonMoveAccuracyBoosterModifierType": { - description: "기술의 명중률이 {{accuracyAmount}} 증가한다 (최대 100).", - }, - "PokemonMultiHitModifierType": { - description: "지닌 개수(최대 3개)마다 추가 공격을 하는 대신, 공격력이 60%(1개)/75%(2개)/82.5%(3개)만큼 감소합니다.", - }, - "TmModifierType": { - name: "No.{{moveId}} {{moveName}}", - description: "포켓몬에게 {{moveName}}[[를]] 가르침.", - }, - "TmModifierTypeWithInfo": { - name: "No.{{moveId}} {{moveName}}", - description: "포켓몬에게 {{moveName}}를(을) 가르침\n(C 또는 Shift를 꾹 눌러 정보 확인).", - }, - "EvolutionItemModifierType": { - description: "어느 특정 포켓몬을 진화시킨다.", - }, - "FormChangeItemModifierType": { - description: "어느 특정 포켓몬을 폼 체인지시킨다.", - }, - "FusePokemonModifierType": { - description: "두 포켓몬을 결합시킨다 (특성 변환, 종족값과 타입 분배, 기술폭 공유).", - }, - "TerastallizeModifierType": { - name: "테라피스 {{teraType}}", - description: "지니게 하면 10번의 배틀 동안 {{teraType}} 테라스탈타입으로 테라스탈한다.", - }, - "ContactHeldItemTransferChanceModifierType": { - description: "공격했을 때, {{chancePercent}}%의 확률로 상대의 도구를 도둑질한다.", - }, - "TurnHeldItemTransferModifierType": { - description: "매 턴, 지닌 포켓몬은 상대로부터 도구를 하나 획득한다.", - }, - "EnemyAttackStatusEffectChanceModifierType": { - description: "공격했을 때 {{statusEffect}} 상태로 만들 확률이 {{chancePercent}}% 추가된다.", - }, - "EnemyEndureChanceModifierType": { - description: "받은 공격을 버텨낼 확률이 {{chancePercent}}% 추가된다.", - }, - - "RARE_CANDY": { name: "이상한사탕" }, - "RARER_CANDY": { name: "더이상한사탕" }, - - "MEGA_BRACELET": { name: "메가링", description: "메가스톤을 사용할 수 있게 된다." }, - "DYNAMAX_BAND": { name: "다이맥스 밴드", description: "다이버섯을 사용할 수 있게 된다." }, - "TERA_ORB": { name: "테라스탈오브", description: "테라피스를 사용할 수 있게 된다." }, - - "MAP": { name: "지도", description: "갈림길에서 목적지를 선택할 수 있다." }, - - "POTION": { name: "상처약" }, - "SUPER_POTION": { name: "좋은상처약" }, - "HYPER_POTION": { name: "고급상처약" }, - "MAX_POTION": { name: "풀회복약" }, - "FULL_RESTORE": { name: "회복약" }, - - "REVIVE": { name: "기력의조각" }, - "MAX_REVIVE": { name: "기력의덩어리" }, - - "FULL_HEAL": { name: "만병통치제" }, - - "SACRED_ASH": { name: "성스러운분말" }, - - "REVIVER_SEED": { name: "부활의씨앗", description: "포켓몬이 쓰러지려 할 때 HP를 절반 회복한다." }, - - "ETHER": { name: "PP에이드" }, - "MAX_ETHER": { name: "PP회복" }, - - "ELIXIR": { name: "PP에이더" }, - "MAX_ELIXIR": { name: "PP맥스" }, - - "PP_UP": { name: "포인트업" }, - "PP_MAX": { name: "포인트맥스" }, - - "LURE": { name: "더블배틀코롱" }, - "SUPER_LURE": { name: "실버코롱" }, - "MAX_LURE": { name: "골드코롱" }, - - "MEMORY_MUSHROOM": { name: "기억버섯", description: "포켓몬이 잊어버린 기술을 떠올린다." }, - - "EXP_SHARE": { name: "학습장치", description: "배틀에 참여하지 않아도 20%의 경험치를 받을 수 있게 된다." }, - "EXP_BALANCE": { name: "균형학습장치", description: "레벨이 낮은 포켓몬이 받는 경험치를 가중시킨다." }, - - "OVAL_CHARM": { name: "둥근부적", description: "여러 마리의 포켓몬이 배틀에 참여할 경우, 전체 경험치의 10%씩을 추가로 획득한다." }, - - "EXP_CHARM": { name: "경험부적" }, - "SUPER_EXP_CHARM": { name: "좋은경험부적" }, - "GOLDEN_EXP_CHARM": { name: "황금경험부적" }, - - "LUCKY_EGG": { name: "행복의알" }, - "GOLDEN_EGG": { name: "황금의알" }, - - "SOOTHE_BELL": { name: "평온의방울" }, - - "EVIOLITE": { name: "진화의휘석", description: "진화의 이상한 덩어리. 지니게 하면 진화 전 포켓몬의 방어와 특수방어가 올라간다." }, - - "SOUL_DEW": { name: "마음의물방울", description: "지닌 포켓몬의 성격의 효과가 10% 증가한다 (합연산)." }, - - "NUGGET": { name: "금구슬" }, - "BIG_NUGGET": { name: "큰금구슬" }, - "RELIC_GOLD": { name: "고대의금화" }, - - "AMULET_COIN": { name: "부적금화", description: "받는 돈이 20% 증가한다." }, - "GOLDEN_PUNCH": { name: "골든펀치", description: "주는 데미지의 50%만큼 돈을 획득한다." }, - "COIN_CASE": { name: "동전케이스", description: "매 열 번째 배틀마다, 가진 돈의 10%를 이자로 획득한다." }, - - "LOCK_CAPSULE": { name: "록캡슐", description: "받을 아이템을 갱신할 때 희귀도를 고정시킬 수 있게 된다." }, - - "GRIP_CLAW": { name: "끈기갈고리손톱" }, - "WIDE_LENS": { name: "광각렌즈" }, - - "MULTI_LENS": { name: "멀티렌즈" }, - - "HEALING_CHARM": { name: "치유의부적", description: "HP를 회복하는 기술이나 도구를 썼을 때 효율이 10% 증가한다 (부활 제외)." }, - "CANDY_JAR": { name: "사탕단지", description: "이상한사탕 종류의 아이템이 올려주는 레벨이 1 증가한다." }, - - "BERRY_POUCH": { name: "열매주머니", description: "사용한 나무열매가 소모되지 않을 확률이 30% 추가된다." }, - - "FOCUS_BAND": { name: "기합의머리띠", description: "기절할 듯한 데미지를 받아도 HP를 1 남겨서 견딜 확률이 10% 추가된다." }, - - "QUICK_CLAW": { name: "선제공격손톱", description: "상대보다 먼저 행동할 수 있게 될 확률이 10% 추가된다 (우선도 처리 이후)." }, - - "KINGS_ROCK": { name: "왕의징표석", description: "공격해서 데미지를 줄 때 상대를 풀죽일 확률이 10% 추가된다." }, - - "LEFTOVERS": { name: "먹다남은음식", description: "포켓몬의 HP가 매 턴 최대 체력의 1/16씩 회복된다." }, - "SHELL_BELL": { name: "조개껍질방울", description: "포켓몬이 준 데미지의 1/8씩을 회복한다." }, - - "TOXIC_ORB": { name: "맹독구슬", description: "이 도구를 지닌 포켓몬은 턴이 끝나는 시점에 상태이상에 걸리지 않았다면 맹독 상태가 된다." }, - "FLAME_ORB": { name: "화염구슬", description: "이 도구를 지닌 포켓몬은 턴이 끝나는 시점에 상태이상에 걸리지 않았다면 화상 상태가 된다." }, - - "BATON": { name: "바톤", description: "포켓몬을 교체할 때 효과를 넘겨줄 수 있으며, 함정의 영향을 받지 않게 함" }, - - "SHINY_CHARM": { name: "빛나는부적", description: "야생 포켓몬이 색이 다른 포켓몬으로 등장할 확률을 급격히 높인다." }, - "ABILITY_CHARM": { name: "특성부적", description: "야생 포켓몬이 숨겨진 특성을 가지고 등장할 확률을 급격히 높인다." }, - - "IV_SCANNER": { name: "개체값탐지기", description: "야생 포켓몬의 개체값을 확인 가능하다. 높은 값부터, 확인할 수 있는 개체값이 두 종류씩 추가된다." }, - - "DNA_SPLICERS": { name: "유전자쐐기" }, - - "MINI_BLACK_HOLE": { name: "미니 블랙홀" }, - - "GOLDEN_POKEBALL": { name: "황금몬스터볼", description: "전투 후 획득하는 아이템의 선택지가 하나 더 늘어난다." }, - - "ENEMY_DAMAGE_BOOSTER": { name: "데미지 토큰", description: "주는 데미지를 5% 증가시킨다." }, - "ENEMY_DAMAGE_REDUCTION": { name: "보호 토큰", description: "받는 데미지를 2.5% 감소시킨다." }, - "ENEMY_HEAL": { name: "회복 토큰", description: "매 턴 최대 체력의 2%를 회복한다." }, - "ENEMY_ATTACK_POISON_CHANCE": { name: "독 토큰" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { name: "마비 토큰" }, - "ENEMY_ATTACK_BURN_CHANCE": { name: "화상 토큰" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "만병통치 토큰", description: "매 턴 상태이상에서 회복될 확률이 2.5% 추가된다." }, - "ENEMY_ENDURE_CHANCE": { name: "버티기 토큰" }, - "ENEMY_FUSED_CHANCE": { name: "합체 토큰", description: "야생 포켓몬이 합체되어 등장할 확률이 1% 추가된다." }, - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "전기구슬", description: "피카츄에게 지니게 하면 공격과 특수공격이 올라가는 이상한 구슬." }, - "THICK_CLUB": { name: "굵은뼈", description: "무언가의 단단한 뼈. 탕구리 혹은 텅구리에게 지니게 하면 공격이 올라간다." }, - "METAL_POWDER": { name: "금속파우더", description: "메타몽에게 지니게 하면 방어가 올라가는 이상한 가루. 매우 잘고 단단하다." }, - "QUICK_POWDER": { name: "스피드파우더", description: "메타몽에게 지니게 하면 스피드가 올라가는 이상한 가루. 매우 잘고 단단하다." } - }, - TempBattleStatBoosterItem: { - "x_attack": "플러스파워", - "x_defense": "디펜드업", - "x_sp_atk": "스페셜업", - "x_sp_def": "스페셜가드", - "x_speed": "스피드업", - "x_accuracy": "잘-맞히기", - "dire_hit": "크리티컬커터", - }, - - TempBattleStatBoosterStatName: { - "ATK": "공격", - "DEF": "방어", - "SPATK": "특수공격", - "SPDEF": "특수방어", - "SPD": "스피드", - "ACC": "명중률", - "CRIT": "급소율", - "EVA": "회피율", - "DEFAULT": "???", - }, - - AttackTypeBoosterItem: { - "silk_scarf": "실크스카프", - "black_belt": "검은띠", - "sharp_beak": "예리한부리", - "poison_barb": "독바늘", - "soft_sand": "부드러운모래", - "hard_stone": "딱딱한돌", - "silver_powder": "은빛가루", - "spell_tag": "저주의부적", - "metal_coat": "금속코트", - "charcoal": "목탄", - "mystic_water": "신비의물방울", - "miracle_seed": "기적의씨", - "magnet": "자석", - "twisted_spoon": "휘어진스푼", - "never_melt_ice": "녹지않는얼음", - "dragon_fang": "용의이빨", - "black_glasses": "검은안경", - "fairy_feather": "요정의깃털", - }, - BaseStatBoosterItem: { - "hp_up": "맥스업", - "protein": "타우린", - "iron": "사포닌", - "calcium": "리보플라빈", - "zinc": "키토산", - "carbos": "알칼로이드", - }, - EvolutionItem: { - "NONE": "None", - - "LINKING_CORD": "연결의끈", - "SUN_STONE": "태양의돌", - "MOON_STONE": "달의돌", - "LEAF_STONE": "리프의돌", - "FIRE_STONE": "불꽃의돌", - "WATER_STONE": "물의돌", - "THUNDER_STONE": "천둥의돌", - "ICE_STONE": "얼음의돌", - "DUSK_STONE": "어둠의돌", - "DAWN_STONE": "각성의돌", - "SHINY_STONE": "빛의돌", - "CRACKED_POT": "깨진포트", - "SWEET_APPLE": "달콤한사과", - "TART_APPLE": "새콤한사과", - "STRAWBERRY_SWEET": "딸기사탕공예", - "UNREMARKABLE_TEACUP": "범작찻잔", - - "CHIPPED_POT": "이빠진포트", - "BLACK_AUGURITE": "검은휘석", - "GALARICA_CUFF": "가라두구팔찌", - "GALARICA_WREATH": "가라두구머리장식", - "PEAT_BLOCK": "피트블록", - "AUSPICIOUS_ARMOR": "축복받은갑옷", - "MALICIOUS_ARMOR": "저주받은갑옷", - "MASTERPIECE_TEACUP": "걸작찻잔", - "METAL_ALLOY": "복합금속", - "SCROLL_OF_DARKNESS": "악의 족자", - "SCROLL_OF_WATERS": "물의 족자", - "SYRUPY_APPLE": "꿀맛사과", - }, - FormChangeItem: { - "NONE": "None", - - "ABOMASITE": "눈설왕나이트", - "ABSOLITE": "앱솔나이트", - "AERODACTYLITE": "프테라나이트", - "AGGRONITE": "보스로라나이트", - "ALAKAZITE": "후딘나이트", - "ALTARIANITE": "파비코리나이트", - "AMPHAROSITE": "전룡나이트", - "AUDINITE": "다부니나이트", - "BANETTITE": "다크펫나이트", - "BEEDRILLITE": "독침붕나이트", - "BLASTOISINITE": "거북왕나이트", - "BLAZIKENITE": "번치코나이트", - "CAMERUPTITE": "폭타나이트", - "CHARIZARDITE_X": "리자몽나이트 X", - "CHARIZARDITE_Y": "리자몽나이트 Y", - "DIANCITE": "디안시나이트", - "GALLADITE": "엘레이드나이트", - "GARCHOMPITE": "한카리아스나이트", - "GARDEVOIRITE": "가디안나이트", - "GENGARITE": "팬텀나이트", - "GLALITITE": "얼음귀신나이트", - "GYARADOSITE": "갸라도스나이트", - "HERACRONITE": "헤라크로스나이트", - "HOUNDOOMINITE": "헬가나이트", - "KANGASKHANITE": "캥카나이트", - "LATIASITE": "라티아스나이트", - "LATIOSITE": "라티오스나이트", - "LOPUNNITE": "이어롭나이트", - "LUCARIONITE": "루카리오나이트", - "MANECTITE": "썬더볼트나이트", - "MAWILITE": "입치트나이트", - "MEDICHAMITE": "요가램나이트", - "METAGROSSITE": "메타그로스나이트", - "MEWTWONITE_X": "뮤츠나이트 X", - "MEWTWONITE_Y": "뮤츠나이트 Y", - "PIDGEOTITE": "피죤투나이트", - "PINSIRITE": "쁘사이저나이트", - "RAYQUAZITE": "레쿠쟈나이트", - "SABLENITE": "깜까미나이트", - "SALAMENCITE": "보만다나이트", - "SCEPTILITE": "나무킹나이트", - "SCIZORITE": "핫삼나이트", - "SHARPEDONITE": "샤크니아나이트", - "SLOWBRONITE": "야도란나이트", - "STEELIXITE": "강철톤나이트", - "SWAMPERTITE": "대짱이나이트", - "TYRANITARITE": "마기라스나이트", - "VENUSAURITE": "이상해꽃나이트", - - "BLUE_ORB": "쪽빛구슬", - "RED_ORB": "주홍구슬", - "SHARP_METEORITE": "뾰족한운석", - "HARD_METEORITE": "단단한운석", - "SMOOTH_METEORITE": "부드러운운석", - "ADAMANT_CRYSTAL": "큰금강옥", - "LUSTROUS_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": "주춧돌의가면", - "SHOCK_DRIVE": "번개카세트", - "BURN_DRIVE": "블레이즈카세트", - "CHILL_DRIVE": "프리즈카세트", - "DOUSE_DRIVE": "아쿠아카세트", - - "FIST_PLATE": "주먹플레이트", - "SKY_PLATE": "푸른하늘플레이트", - "TOXIC_PLATE": "맹독플레이트", - "EARTH_PLATE": "대지플레이트", - "STONE_PLATE": "암석플레이트", - "INSECT_PLATE": "비단벌레플레이트", - "SPOOKY_PLATE": "원령플레이트", - "IRON_PLATE": "강철플레이트", - "FLAME_PLATE": "불구슬플레이트", - "SPLASH_PLATE": "물방울플레이트", - "MEADOW_PLATE": "초록플레이트", - "ZAP_PLATE": "우뢰플레이트", - "MIND_PLATE": "이상한플레이트", - "ICICLE_PLATE": "고드름플레이트", - "DRACO_PLATE": "용의플레이트", - "DREAD_PLATE": "공포플레이트", - "PIXIE_PLATE": "정령플레이트", - "BLANK_PLATE": "순백플레이트", - "LEGEND_PLATE": "레전드플레이트", - "FIGHTING_MEMORY": "파이팅메모리", - "FLYING_MEMORY": "플라잉메모리", - "POISON_MEMORY": "포이즌메모리", - "GROUND_MEMORY": "그라운드메모리", - "ROCK_MEMORY": "록메모리", - "BUG_MEMORY": "버그메모리", - "GHOST_MEMORY": "고스트메모리", - "STEEL_MEMORY": "스틸메모리", - "FIRE_MEMORY": "파이어메모리", - "WATER_MEMORY": "워터메모리", - "GRASS_MEMORY": "그래스메모리", - "ELECTRIC_MEMORY": "일렉트릭메모리", - "PSYCHIC_MEMORY": "사이킥메모리", - "ICE_MEMORY": "아이스메모리", - "DRAGON_MEMORY": "드래곤메모리", - "DARK_MEMORY": "다크메모리", - "FAIRY_MEMORY": "페어리메모리", - "BLANK_MEMORY": "빈메모리", - }, -} as const; diff --git a/src/locales/ko/modifier.json b/src/locales/ko/modifier.json new file mode 100644 index 00000000000..281ecf61943 --- /dev/null +++ b/src/locales/ko/modifier.json @@ -0,0 +1,12 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 버텼다!!", + "turnHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.", + "hitHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.", + "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}[[는]] {{typeName}}[[로]]\n정신을 차려 싸울 수 있게 되었다!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}[[는]] {{typeName}}[[로]]\n상태를 원래대로 되돌렸다!", + "moneyInterestApply": "{{typeName}}[[로]]부터\n₽{{moneyAmount}}[[를]] 받았다!", + "turnHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 흡수했다!", + "contactHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 가로챘다!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}의\n체력이 약간 회복되었다!", + "bypassSpeedChanceApply": "{{pokemonName}}[[는]] {{itemName}}[[로]]\n행동이 빨라졌다!" +} diff --git a/src/locales/ko/move-trigger.json b/src/locales/ko/move-trigger.json new file mode 100644 index 00000000000..2a38bb13b0a --- /dev/null +++ b/src/locales/ko/move-trigger.json @@ -0,0 +1,70 @@ +{ + "hitWithRecoil": "{{pokemonName}}[[는]]\n반동으로 데미지를 입었다!", + "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의욕이 넘쳐서 땅에 부딪쳤다!", + "fled": "{{pokemonName}}[[는]]\n도망쳤다!", + "cannotBeSwitchedOut": "{{pokemonName}}[[를]]\n돌아오게 할 수 없습니다!", + "swappedAbilitiesWithTarget": "{{pokemonName}}[[는]]\n서로의 특성을 교체했다!", + "coinsScatteredEverywhere": "돈이 주위에 흩어졌다!", + "attackedByItem": "{{itemName}}[[가]]\n{{pokemonName}}에게 덤벼들었다!", + "whippedUpAWhirlwind": "{{pokemonName}}의 주위에서\n공기가 소용돌이친다!", + "flewUpHigh": "{{pokemonName}}는(은)\n하늘 높이 날아올랐다!", + "tookInSunlight": "{{pokemonName}}는(은)\n빛을 흡수했다!", + "dugAHole": "{{pokemonName}}는(은)\n땅으로 파고들었다!", + "loweredItsHead": "{{pokemonName}}는(은)\n목을 움츠렸다!", + "isGlowing": "{{pokemonName}}를(을)\n강렬한 빛이 감쌌다!", + "bellChimed": "방울소리가 울려 퍼졌다!", + "foresawAnAttack": "{{pokemonName}}는(은)\n미래의 공격을 예지했다!", + "isTighteningFocus": "{{pokemonName}}[[는]]\n집중력을 높이고 있다!", + "hidUnderwater": "{{pokemonName}}는(은)\n물속에 몸을 숨겼다!", + "soothingAromaWaftedThroughArea": "기분 좋은 향기가 퍼졌다!", + "sprangUp": "{{pokemonName}}는(은)\n높이 뛰어올랐다!", + "choseDoomDesireAsDestiny": "{{pokemonName}}는(은)\n파멸의소원을 미래에 맡겼다!", + "vanishedInstantly": "{{pokemonName}}의 모습이\n일순간에 사라졌다!", + "tookTargetIntoSky": "{{pokemonName}}는(은) {{targetName}}를(을)\n상공으로 데려갔다!", + "becameCloakedInFreezingLight": "{{pokemonName}}는(은)\n차가운 빛에 둘러싸였다!", + "becameCloakedInFreezingAir": "{{pokemonName}}는(은)\n차디찬 공기에 둘러싸였다!", + "isChargingPower": "{{pokemonName}}는(은)\n파워를 모으고 있다!", + "burnedItselfOut": "{{pokemonName}}의 불꽃은 다 타 버렸다!", + "startedHeatingUpBeak": "{{pokemonName}}는(은)\n부리를 가열하기 시작했다!", + "setUpShellTrap": "{{pokemonName}}[[는]]\n트랩셸을 설치했다!", + "isOverflowingWithSpacePower": "{{pokemonName}}에게서\n우주의 힘이 넘쳐난다!", + "usedUpAllElectricity": "{{pokemonName}}[[는]]\n전기를 다 써 버렸다!", + "stoleItem": "{{pokemonName}}[[는]] {{targetName}}[[로]]부터\n{{itemName}}[[을]] 빼앗았다!", + "incineratedItem": "{{pokemonName}}[[는]] {{targetName}}의\n{{itemName}}[[를]] 불태워서 없애버렸다!", + "knockedOffItem": "{{pokemonName}}[[는]] {{targetName}}의\n{{itemName}}[[를]] 탁 쳐서 떨구었다!", + "tookMoveAttack": "{{pokemonName}}[[는]]\n{{moveName}} 공격을 끌어들였다!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}}[[는]] 체력을 깎아서\n{{statName}}[[를]] 풀 파워로 만들었다!", + "copiedStatChanges": "{{pokemonName}}[[는]] {{targetName}}의\n능력 변화를 복사했다!", + "magnitudeMessage": "매그니튜드{{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}}[[는]] 목표를\n{{targetName}}[[로]] 결정했다!", + "transformedIntoType": "{{pokemonName}}[[는]]\n{{typeName}}타입이 됐다!", + "copiedMove": "{{pokemonName}}[[는]]\n{{moveName}}[[를]] 복사했다!", + "sketchedMove": "{{pokemonName}}[[는]]\n{{moveName}}[[를]] 스케치했다!", + "acquiredAbility": "{{pokemonName}}[[는]]\n{{abilityName}}[[가]] 되었다!", + "copiedTargetAbility": "{{pokemonName}}[[는]] {{targetName}}의\n{{abilityName}}[[를]] 복사했다!", + "transformedIntoTarget": "{{pokemonName}}[[는]]\n{{targetName}}[[로]] 변신했다!", + "tryingToTakeFoeDown": "{{pokemonName}}[[는]] 상대를\n길동무로 삼으려 하고 있다!", + "addType": "{{pokemonName}}에게\n{{typeName}}타입이 추가되었다!", + "cannotUseMove": "{{pokemonName}}[[는]]\n{{moveName}}[[를]] 쓸 수 없다!", + "healHp": "{{pokemonName}}의\n체력이 회복되었다!", + "sacrificialFullRestore": "{{pokemonName}}의\n치유소원이 이루어졌다!", + "invertStats": "{{pokemonName}}[[는]]\n능력 변화가 뒤집혔다!", + "resetStats": "{{pokemonName}}의 모든 상태가\n원래대로 되돌아왔다!", + "statEliminated": "모든 상태가 원래대로 되돌아왔다!", + "faintCountdown": "{{pokemonName}}[[는]]\n{{turnCount}}턴 후에 쓰러져 버린다!", + "copyType": "{{pokemonName}}[[는]]\n{{targetPokemonName}}[[와]] 같은 타입이 되었다!", + "suppressAbilities": "{{pokemonName}}의\n특성이 효과를 발휘하지 못하게 되었다!", + "revivalBlessing": "{{pokemonName}}[[는]]\n정신을 차려 싸울 수 있게 되었다!", + "swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!", + "exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!", + "safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!" +} diff --git a/src/locales/ko/move.json b/src/locales/ko/move.json new file mode 100644 index 00000000000..a06bb2b3e27 --- /dev/null +++ b/src/locales/ko/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "막치기", + "effect": "긴 꼬리나 손 등을 사용하여 상대를 때려서 공격한다." + }, + "karateChop": { + "name": "태권당수", + "effect": "날카로운 당수로 상대를 때려서 공격한다. 급소에 맞기 쉽다." + }, + "doubleSlap": { + "name": "연속뺨치기", + "effect": "연속 뺨치기로 상대를 때려서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "cometPunch": { + "name": "연속펀치", + "effect": "노도 같은 펀치로 상대를 세게 때려서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "megaPunch": { + "name": "메가톤펀치", + "effect": "힘을 담은 펀치로 상대를 공격한다." + }, + "payDay": { + "name": "고양이돈받기", + "effect": "상대의 몸에 돈을 세게 던져서 공격한다. 배틀 후에 돈을 받을 수 있다." + }, + "firePunch": { + "name": "불꽃펀치", + "effect": "불꽃을 담은 펀치로 상대를 공격한다. 화상 상태로 만들 때가 있다." + }, + "icePunch": { + "name": "냉동펀치", + "effect": "냉기를 담은 펀치로 상대를 공격한다. 얼음 상태로 만들 때가 있다." + }, + "thunderPunch": { + "name": "번개펀치", + "effect": "전격을 담은 펀치로 상대를 공격한다. 마비 상태로 만들 때가 있다." + }, + "scratch": { + "name": "할퀴기", + "effect": "단단하고 뾰족한 날카로운 손톱으로 상대를 할퀴어서 공격한다." + }, + "viseGrip": { + "name": "찝기", + "effect": "상대를 양쪽에서 집어서 데미지를 준다." + }, + "guillotine": { + "name": "가위자르기", + "effect": "큰 집게로 상대를 베어 갈라 공격한다. 맞으면 일격에 기절한다." + }, + "razorWind": { + "name": "칼바람", + "effect": "바람의 칼날을 만들어 2턴째에 상대를 공격한다. 급소에 맞기 쉽다." + }, + "swordsDance": { + "name": "칼춤", + "effect": "싸움의 춤을 격렬하게 춰서 기세를 높인다. 자신의 공격을 크게 올린다." + }, + "cut": { + "name": "풀베기", + "effect": "낫이나 발톱 등으로 상대를 베어 공격한다." + }, + "gust": { + "name": "바람일으키기", + "effect": "날개로 일으킨 격한 바람을 상대에게 부딪쳐서 공격한다." + }, + "wingAttack": { + "name": "날개치기", + "effect": "크게 펼친 훌륭한 날개를 상대에게 부딪쳐서 공격한다." + }, + "whirlwind": { + "name": "날려버리기", + "effect": "상대를 날려버려서 교대할 포켓몬을 끌어낸다. 야생의 경우에는 배틀이 끝난다." + }, + "fly": { + "name": "공중날기", + "effect": "1턴째에 하늘을 날아 2턴째에 상대를 공격한다." + }, + "bind": { + "name": "조이기", + "effect": "긴 몸이나 덩굴 등을 써서 4-5턴 동안 상대를 조여 공격한다." + }, + "slam": { + "name": "힘껏치기", + "effect": "긴 꼬리나 덩굴 등을 사용해 상대를 힘껏 쳐서 공격한다." + }, + "vineWhip": { + "name": "덩굴채찍", + "effect": "채찍처럼 휘어지는 가늘고 긴 덩굴로 상대를 힘껏 쳐서 공격한다." + }, + "stomp": { + "name": "짓밟기", + "effect": "큰 발로 상대를 짓밟아서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "doubleKick": { + "name": "두번차기", + "effect": "2개의 다리로 상대를 걷어차서 공격한다. 2회 연속으로 데미지를 준다." + }, + "megaKick": { + "name": "메가톤킥", + "effect": "굉장한 힘을 담은 킥으로 상대를 걷어차서 공격한다." + }, + "jumpKick": { + "name": "점프킥", + "effect": "높이 점프해서 킥으로 상대를 공격한다. 빗나가면 자신이 데미지를 입는다." + }, + "rollingKick": { + "name": "돌려차기", + "effect": "몸을 재빨리 회전시키며 걷어차서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "sandAttack": { + "name": "모래뿌리기", + "effect": "상대의 얼굴에 모래를 뿌려서 명중률을 떨어뜨린다." + }, + "headbutt": { + "name": "박치기", + "effect": "머리를 내밀어 곧장 돌진하여 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "hornAttack": { + "name": "뿔찌르기", + "effect": "날카롭고 뾰족한 뿔로 상대를 공격한다." + }, + "furyAttack": { + "name": "마구찌르기", + "effect": "뿔이나 부리로 상대를 찔러서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "hornDrill": { + "name": "뿔드릴", + "effect": "회전하는 뿔을 상대에게 꿰찔러서 공격한다. 맞으면 일격에 기절한다." + }, + "tackle": { + "name": "몸통박치기", + "effect": "상대를 향해서 몸 전체를 부딪쳐가며 공격한다." + }, + "bodySlam": { + "name": "누르기", + "effect": "몸 전체로 상대를 덮쳐눌러 공격한다. 마비 상태로 만들 때가 있다." + }, + "wrap": { + "name": "김밥말이", + "effect": "긴 몸이나 덩굴 등을 사용해 4-5턴 동안 상대를 휘감아 공격한다." + }, + "takeDown": { + "name": "돌진", + "effect": "굉장한 기세로 상대에게 부딪쳐 공격한다. 자신도 조금 데미지를 입는다." + }, + "thrash": { + "name": "난동부리기", + "effect": "2-3턴 동안 마구 난동 부려서 공격한다. 난동 부린 뒤에는 혼란에 빠진다." + }, + "doubleEdge": { + "name": "이판사판태클", + "effect": "목숨을 걸고 상대에게 돌진하여 공격을 한다. 자신도 상당한 데미지를 입는다." + }, + "tailWhip": { + "name": "꼬리흔들기", + "effect": "꼬리를 좌우로 귀엽게 흔들어 방심을 유도한다. 상대의 방어를 떨어뜨린다." + }, + "poisonSting": { + "name": "독침", + "effect": "독이 있는 침을 상대에게 꿰찔러서 공격한다. 독 상태로 만들 때가 있다." + }, + "twineedle": { + "name": "더블니들", + "effect": "2개의 침을 상대에게 꿰찔러 2회 연속으로 데미지를 준다. 독 상태로 만들 때가 있다." + }, + "pinMissile": { + "name": "바늘미사일", + "effect": "날카로운 침을 상대에게 발사해서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "leer": { + "name": "째려보기", + "effect": "날카로운 눈초리로 겁을 주어 상대의 방어를 떨어뜨린다." + }, + "bite": { + "name": "물기", + "effect": "날카롭고 뾰족한 이빨로 물어서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "growl": { + "name": "울음소리", + "effect": "귀여운 울음소리를 들려주고 관심을 끌어 방심한 사이에 상대의 공격을 떨어뜨린다." + }, + "roar": { + "name": "울부짖기", + "effect": "상대를 도망가게 해서 교대할 포켓몬을 끌어낸다. 야생의 경우에는 배틀이 끝난다." + }, + "sing": { + "name": "노래하기", + "effect": "기분 좋은 예쁜 노랫소리를 들려주고 상대를 잠듦 상태로 만든다." + }, + "supersonic": { + "name": "초음파", + "effect": "특수한 음파를 몸에서 발산하여 상대를 혼란시킨다." + }, + "sonicBoom": { + "name": "소닉붐", + "effect": "충격파를 상대에 부딪쳐서 공격한다. 언제나 20의 데미지를 준다." + }, + "disable": { + "name": "사슬묶기", + "effect": "상대의 움직임을 막아 바로 전에 쓴 기술을 4턴 동안 사용할 수 없게 만든다." + }, + "acid": { + "name": "용해액", + "effect": "강한 산을 상대에게 끼얹어 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "ember": { + "name": "불꽃세례", + "effect": "작은 불꽃을 상대에게 발사하여 공격한다. 화상 상태로 만들 때가 있다." + }, + "flamethrower": { + "name": "화염방사", + "effect": "세찬 불꽃을 상대에게 발사하여 공격한다. 화상 상태로 만들 때가 있다." + }, + "mist": { + "name": "흰안개", + "effect": "하얀 안개로 몸을 덮는다. 5턴 동안 상대에 의해 능력이 떨어지지 않게 된다." + }, + "waterGun": { + "name": "물대포", + "effect": "물을 기세 좋게 상대에게 발사하여 공격한다." + }, + "hydroPump": { + "name": "하이드로펌프", + "effect": "대량의 물을 세찬 기세로 상대에게 발사하여 공격한다." + }, + "surf": { + "name": "파도타기", + "effect": "큰 파도로 자신의 주위에 있는 포켓몬을 공격한다." + }, + "iceBeam": { + "name": "냉동빔", + "effect": "냉동빔을 상대에게 발사하여 공격한다. 얼음 상태로 만들 때가 있다." + }, + "blizzard": { + "name": "눈보라", + "effect": "세찬 눈보라를 상대에게 내뿜어 공격한다. 얼음 상태로 만들 때가 있다." + }, + "psybeam": { + "name": "환상빔", + "effect": "이상한 광선을 상대에게 발사하여 공격한다. 혼란시킬 때가 있다." + }, + "bubbleBeam": { + "name": "거품광선", + "effect": "거품을 기세 좋게 상대에게 발사하여 공격한다. 스피드를 떨어뜨릴 때가 있다." + }, + "auroraBeam": { + "name": "오로라빔", + "effect": "무지개색의 빔을 상대에게 발사하여 공격한다. 공격을 떨어뜨릴 때가 있다." + }, + "hyperBeam": { + "name": "파괴광선", + "effect": "강한 광선을 상대에게 발사하여 공격한다. 다음 턴은 움직일 수 없다." + }, + "peck": { + "name": "쪼기", + "effect": "날카롭고 뾰족한 부리나 뿔로 상대를 쪼아서 공격한다." + }, + "drillPeck": { + "name": "회전부리", + "effect": "회전하면서 뾰족한 부리를 상대에게 꿰찔러 공격한다." + }, + "submission": { + "name": "지옥의바퀴", + "effect": "땅에 자신과 함께 상대를 내던져 공격한다. 자신도 조금 데미지를 입는다." + }, + "lowKick": { + "name": "안다리걸기", + "effect": "발을 강하게 걸고 상대를 넘어뜨려 공격한다. 상대가 무거울수록 위력이 올라간다." + }, + "counter": { + "name": "카운터", + "effect": "상대로부터 받은 물리공격의 데미지를 2배로 만들어 같은 상대에게 돌려준다." + }, + "seismicToss": { + "name": "지구던지기", + "effect": "인력을 사용해 내던진다. 자신의 레벨과 똑같은 데미지를 상대에게 준다." + }, + "strength": { + "name": "괴력", + "effect": "혼신의 힘으로 상대를 세게 때려서 공격한다." + }, + "absorb": { + "name": "흡수", + "effect": "양분을 흡수하여 공격한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." + }, + "megaDrain": { + "name": "메가드레인", + "effect": "양분을 흡수하여 공격한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." + }, + "leechSeed": { + "name": "씨뿌리기", + "effect": "씨가 뿌려진 상대의 HP를 매 턴 조금씩 흡수하여 자신의 HP를 회복한다." + }, + "growth": { + "name": "성장", + "effect": "몸을 일시에 크게 성장시켜 공격과 특수공격을 올린다." + }, + "razorLeaf": { + "name": "잎날가르기", + "effect": "잎사귀를 날려 상대를 베어 공격한다. 급소에 맞기 쉽다." + }, + "solarBeam": { + "name": "솔라빔", + "effect": "1턴째에 빛을 가득 모아 2턴째에 빛의 다발을 발사하여 공격한다." + }, + "poisonPowder": { + "name": "독가루", + "effect": "독이 있는 가루를 많이 흩뿌려서 상대를 독 상태로 만든다." + }, + "stunSpore": { + "name": "저리가루", + "effect": "저리가루를 많이 흩뿌려서 상대를 마비 상태로 만든다." + }, + "sleepPowder": { + "name": "수면가루", + "effect": "잠이 오는 가루를 많이 흩뿌려서 상대를 잠듦 상태로 만든다." + }, + "petalDance": { + "name": "꽃잎댄스", + "effect": "2-3턴 동안 꽃을 흩뿌려서 상대를 공격한다. 흩뿌린 뒤에는 혼란에 빠진다." + }, + "stringShot": { + "name": "실뿜기", + "effect": "입에서 뿜어낸 실을 휘감아서 상대의 스피드를 크게 떨어뜨린다." + }, + "dragonRage": { + "name": "용의분노", + "effect": "분노의 충격파를 상대에게 부딪쳐서 공격한다. 언제나 40의 데미지를 준다." + }, + "fireSpin": { + "name": "회오리불꽃", + "effect": "세차게 소용돌이치는 불꽃 속에 4-5턴 동안 상대를 가두어 공격한다." + }, + "thunderShock": { + "name": "전기쇼크", + "effect": "전기 자극을 상대에게 날려서 공격한다. 마비 상태로 만들 때가 있다." + }, + "thunderbolt": { + "name": "10만볼트", + "effect": "강한 전격을 상대에게 날려서 공격한다. 마비 상태로 만들 때가 있다." + }, + "thunderWave": { + "name": "전기자석파", + "effect": "약한 전격을 날려서 상대를 마비 상태로 만든다." + }, + "thunder": { + "name": "번개", + "effect": "강한 번개를 상대에게 떨어뜨려 공격한다. 마비 상태로 만들 때가 있다." + }, + "rockThrow": { + "name": "돌떨구기", + "effect": "작은 바위를 들어올려 상대에게 내던져서 공격한다." + }, + "earthquake": { + "name": "지진", + "effect": "지진의 충격으로 자신의 주위에 있는 포켓몬을 공격한다." + }, + "fissure": { + "name": "땅가르기", + "effect": "땅이 갈라진 곳에 상대를 떨어뜨려 공격한다. 맞으면 일격에 기절한다." + }, + "dig": { + "name": "구멍파기", + "effect": "1턴째에 파고들어 2턴째에 상대를 공격한다." + }, + "toxic": { + "name": "맹독", + "effect": "상대를 맹독의 상태로 만든다. 턴이 진행될수록 독의 데미지가 증가한다." + }, + "confusion": { + "name": "염동력", + "effect": "약한 염동력을 상대에게 보내어 공격한다. 상대를 혼란시킬 때가 있다." + }, + "psychic": { + "name": "사이코키네시스", + "effect": "강한 염동력을 상대에게 보내어 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "hypnosis": { + "name": "최면술", + "effect": "졸음을 유도하는 암시를 걸어서 상대를 잠듦 상태로 만든다." + }, + "meditate": { + "name": "요가포즈", + "effect": "잠들어 있는 힘을 몸속에서 끌어내어 자신의 공격을 올린다." + }, + "agility": { + "name": "고속이동", + "effect": "힘을 빼고 몸을 가볍게 해서 고속으로 움직인다. 자신의 스피드를 크게 올린다." + }, + "quickAttack": { + "name": "전광석화", + "effect": "눈에 보이지 않는 굉장한 속도로 상대에게 돌진한다. 반드시 선제공격할 수 있다." + }, + "rage": { + "name": "분노", + "effect": "기술을 썼을 때 공격을 받으면 분노의 힘으로 공격이 올라간다." + }, + "teleport": { + "name": "순간이동", + "effect": "교대할 포켓몬이 있을 때 사용하면 교체한다. 야생 포켓몬은 도망가 버린다." + }, + "nightShade": { + "name": "나이트헤드", + "effect": "무시무시한 환상을 보게 해서 자신의 레벨과 똑같은 만큼의 데미지를 상대에게 준다." + }, + "mimic": { + "name": "흉내내기", + "effect": "상대가 마지막에 사용한 기술을 배틀을 하는 동안 자신의 기술로 만들 수 있다." + }, + "screech": { + "name": "싫은소리", + "effect": "그만 귀를 막아버리고 싶은 싫은 소리를 내어 상대의 방어를 크게 떨어뜨린다." + }, + "doubleTeam": { + "name": "그림자분신", + "effect": "재빠른 움직임으로 분신을 만들어 상대를 혼란시켜 회피율을 올린다." + }, + "recover": { + "name": "HP회복", + "effect": "세포를 재생시켜 자신의 최대 HP의 절반만큼 HP를 회복한다." + }, + "harden": { + "name": "단단해지기", + "effect": "전신에 힘을 담아 몸을 단단하게 해서 자신의 방어를 올린다." + }, + "minimize": { + "name": "작아지기", + "effect": "몸을 축소하여 작게 보임으로써 자신의 회피율을 크게 올린다." + }, + "smokescreen": { + "name": "연막", + "effect": "연기나 먹물을 내뿜어 상대의 명중률을 떨어뜨린다." + }, + "confuseRay": { + "name": "이상한빛", + "effect": "이상한 빛을 상대에게 비춰 당황하게 한다. 상대를 혼란시킨다." + }, + "withdraw": { + "name": "껍질에숨기", + "effect": "껍질에 숨어 몸을 보호하여 자신의 방어를 올린다." + }, + "defenseCurl": { + "name": "웅크리기", + "effect": "몸을 둥글게 웅크려서 자신의 방어를 올린다." + }, + "barrier": { + "name": "배리어", + "effect": "튼튼한 장막을 만들어 자신의 방어를 크게 올린다." + }, + "lightScreen": { + "name": "빛의장막", + "effect": "5턴 동안 이상한 장막을 쳐서 상대로부터 받는 특수공격의 데미지를 약하게 한다." + }, + "haze": { + "name": "흑안개", + "effect": "흑안개를 뿜어 배틀에 참가 중인 포켓몬 전원의 능력 변화를 원래대로 돌린다." + }, + "reflect": { + "name": "리플렉터", + "effect": "5턴 동안 이상한 장막을 쳐서 상대로부터 받는 물리공격의 데미지를 약하게 한다." + }, + "focusEnergy": { + "name": "기충전", + "effect": "깊게 숨을 들이마셔 기합을 넣는다. 자신의 공격이 급소에 맞기 쉬워진다." + }, + "bide": { + "name": "참기", + "effect": "2턴 동안 공격을 견뎌 입은 데미지를 2배로 만들어 상대에게 돌려준다." + }, + "metronome": { + "name": "손가락흔들기", + "effect": "손가락을 흔들어 자신의 뇌를 자극해서 모든 기술 중 어느 하나를 날린다." + }, + "mirrorMove": { + "name": "따라하기", + "effect": "상대가 사용한 기술을 흉내 내어 자신도 똑같은 기술을 쓴다." + }, + "selfDestruct": { + "name": "자폭", + "effect": "폭발을 일으켜서 자신의 주위에 있는 포켓몬을 공격한다. 쓰고 나서 기절하게 된다." + }, + "eggBomb": { + "name": "알폭탄", + "effect": "큰 알을 온 힘을 다해 상대에게 내던져서 공격한다." + }, + "lick": { + "name": "핥기", + "effect": "긴 혀로 상대를 핥아서 공격한다. 마비 상태로 만들 때가 있다." + }, + "smog": { + "name": "스모그", + "effect": "더러운 가스를 상대에게 내뿜어 공격한다. 독 상태로 만들 때가 있다." + }, + "sludge": { + "name": "오물공격", + "effect": "더러운 오물을 상대에게 내던져서 공격한다. 독 상태로 만들 때가 있다." + }, + "boneClub": { + "name": "뼈다귀치기", + "effect": "손에 들고 있는 뼈로 상대를 세게 때려서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "fireBlast": { + "name": "불대문자", + "effect": "큰 대자의 불꽃으로 상대를 불태운다. 화상 상태로 만들 때가 있다." + }, + "waterfall": { + "name": "폭포오르기", + "effect": "굉장한 기세로 상대에게 돌진한다. 상대를 풀죽게 만들 때가 있다." + }, + "clamp": { + "name": "껍질끼우기", + "effect": "매우 튼튼하고 두꺼운 껍질에 4-5턴 동안 상대를 끼워서 공격한다." + }, + "swift": { + "name": "스피드스타", + "effect": "별 모양의 빛을 발사해서 상대를 공격한다. 공격은 반드시 명중한다." + }, + "skullBash": { + "name": "로켓박치기", + "effect": "1턴째에 머리를 움츠려 방어를 올린다. 2턴째에 상대를 공격한다." + }, + "spikeCannon": { + "name": "가시대포", + "effect": "날카로운 침을 상대에게 발사해서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "constrict": { + "name": "휘감기", + "effect": "촉수나 덩굴 등을 휘감아서 공격한다. 상대의 스피드를 떨어뜨릴 때가 있다." + }, + "amnesia": { + "name": "망각술", + "effect": "머리를 비워서 순간적으로 무언가를 잊어버림으로써 자신의 특수방어를 크게 올린다." + }, + "kinesis": { + "name": "숟가락휘기", + "effect": "숟가락을 휘어서 주의를 끌어 상대의 명중률을 낮춘다." + }, + "softBoiled": { + "name": "알낳기", + "effect": "자신의 최대 HP 절반을 회복한다." + }, + "highJumpKick": { + "name": "무릎차기", + "effect": "점프해서 무릎차기로 상대를 공격한다. 빗나가면 자신이 데미지를 입는다." + }, + "glare": { + "name": "뱀눈초리", + "effect": "배의 무늬로 겁을 주어 상대를 마비 상태로 만든다." + }, + "dreamEater": { + "name": "꿈먹기", + "effect": "잠자고 있는 상대의 꿈을 먹어 공격한다. 데미지의 절반을 HP로 회복한다." + }, + "poisonGas": { + "name": "독가스", + "effect": "독가스를 상대의 얼굴에 내뿜어 독 상태로 만든다." + }, + "barrage": { + "name": "구슬던지기", + "effect": "둥근 것을 상대에게 내던져서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "leechLife": { + "name": "흡혈", + "effect": "피를 빨아서 상대를 공격한다. 준 데미지의 절반을 HP로 회복한다." + }, + "lovelyKiss": { + "name": "악마의키스", + "effect": "무서운 얼굴로 키스한다. 상대를 잠듦 상태로 만든다." + }, + "skyAttack": { + "name": "불새", + "effect": "2턴째에 상대를 공격한다. 가끔 풀죽게 만든다. 급소에도 맞기 쉽다." + }, + "transform": { + "name": "변신", + "effect": "상대 포켓몬으로 변신하여 상대와 완전히 똑같은 기술을 사용할 수 있다." + }, + "bubble": { + "name": "거품", + "effect": "매우 많은 거품을 상대에게 내뿜어 공격한다. 상대의 스피드를 떨어뜨릴 때가 있다." + }, + "dizzyPunch": { + "name": "잼잼펀치", + "effect": "리드미컬한 펀치를 날려 상대를 공격한다. 혼란시킬 때가 있다." + }, + "spore": { + "name": "버섯포자", + "effect": "최면 효과가 있는 포자를 훌훌 흩뿌려서 상대를 잠듦 상태로 만든다." + }, + "flash": { + "name": "플래시", + "effect": "눈이 부신 빛으로 상대의 명중률을 떨어뜨린다." + }, + "psywave": { + "name": "사이코웨이브", + "effect": "이상한 염력파를 상대에게 발사하여 공격한다. 사용할 때마다 데미지가 바뀐다." + }, + "splash": { + "name": "튀어오르기", + "effect": "공격도 하지 않고 팔딱팔딱 튈 뿐 아무 일도 일어나지 않는다..." + }, + "acidArmor": { + "name": "녹기", + "effect": "세포의 변화로 액체가 되어 자신의 방어를 크게 올린다." + }, + "crabhammer": { + "name": "집게해머", + "effect": "큰 집게를 상대에게 내리쳐서 공격한다. 급소에 맞기 쉽다." + }, + "explosion": { + "name": "대폭발", + "effect": "큰 폭발로 자신의 주위에 있는 포켓몬을 공격한다. 쓰고 나서는 기절한다." + }, + "furySwipes": { + "name": "마구할퀴기", + "effect": "손톱이나 낫 등으로 상대를 할퀴어서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "bonemerang": { + "name": "뼈다귀부메랑", + "effect": "손에 들고 있는 뼈를 상대에게 날려서 날아갈 때와 돌아올 때 2회 연속 데미지를 준다." + }, + "rest": { + "name": "잠자기", + "effect": "2턴 동안 계속 잠잔다. 자신의 HP와 상태 이상을 모두 회복한다." + }, + "rockSlide": { + "name": "스톤샤워", + "effect": "큰 바위를 세차게 부딪쳐서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "hyperFang": { + "name": "필살앞니", + "effect": "날카로운 앞니로 강하게 물어서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "sharpen": { + "name": "각지기", + "effect": "몸의 각을 늘려서 더욱 각지게 하여 자신의 공격을 올린다." + }, + "conversion": { + "name": "텍스처", + "effect": "자신의 타입을 배운 기술 중 가장 위에 있는 기술과 같은 타입으로 바꾼다." + }, + "triAttack": { + "name": "트라이어택", + "effect": "3개의 광선으로 공격한다. 마비, 화상 또는 얼음 상태 중 어느 하나로 만들 때가 있다." + }, + "superFang": { + "name": "분노의앞니", + "effect": "날카로운 앞니로 강하게 물어서 공격한다. 상대의 HP는 절반이 된다." + }, + "slash": { + "name": "베어가르기", + "effect": "발톱이나 낫 등으로 상대를 베어 갈라서 공격한다. 급소에 맞기 쉽다." + }, + "substitute": { + "name": "대타출동", + "effect": "자신의 HP를 조금 깎아서 분신을 만든다. 분신은 자신의 대타가 된다." + }, + "struggle": { + "name": "발버둥", + "effect": "자신의 PP가 떨어지면 발버둥 쳐 상대를 공격한다. 자신도 조금 데미지를 입는다." + }, + "sketch": { + "name": "스케치", + "effect": "상대가 쓴 기술을 자신의 것으로 만든다. 한 번 사용하면 스케치는 사라진다." + }, + "tripleKick": { + "name": "트리플킥", + "effect": "3회 연속으로 킥을 날려 공격한다. 기술이 맞을 때마다 위력이 올라간다." + }, + "thief": { + "name": "도둑질", + "effect": "공격과 동시에 30%의 확률로 도구를 훔친다." + }, + "spiderWeb": { + "name": "거미집", + "effect": "끈적끈적하고 가는 실을 칭칭 휘감아 상대를 배틀에서 도망칠 수 없게 한다." + }, + "mindReader": { + "name": "마음의눈", + "effect": "상대의 움직임을 마음으로 읽고 다음 공격이 반드시 상대에게 명중되게 한다." + }, + "nightmare": { + "name": "악몽", + "effect": "잠듦 상태의 상대에게 악몽을 꾸게 하여 매 턴 조금씩 HP를 떨어뜨려 간다." + }, + "flameWheel": { + "name": "화염바퀴", + "effect": "불꽃을 둘러 상대에게 돌진하여 공격한다. 화상 상태로 만들 때가 있다." + }, + "snore": { + "name": "코골기", + "effect": "자신이 잠들어 있을 때 소음을 내어 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "curse": { + "name": "저주", + "effect": "기술을 쓰는 포켓몬이 고스트타입일 때와 그 이외의 타입일 때는 효과가 다르다." + }, + "flail": { + "name": "바둥바둥", + "effect": "바둥바둥 난동 부려서 공격한다. 자신의 HP가 적을수록 기술의 위력이 올라간다." + }, + "conversion2": { + "name": "텍스처2", + "effect": "상대가 마지막으로 쓴 기술에 저항할 수 있도록 자신의 타입을 변화시킨다." + }, + "aeroblast": { + "name": "에어로블라스트", + "effect": "공기의 소용돌이를 발사하여 공격한다. 급소에 맞기 쉽다." + }, + "cottonSpore": { + "name": "목화포자", + "effect": "솜처럼 폭신폭신한 포자를 착 달라붙게 해서 상대의 스피드를 크게 떨어뜨린다." + }, + "reversal": { + "name": "기사회생", + "effect": "힘을 쥐어짜서 공격한다. 자신의 HP가 적을수록 기술의 위력이 올라간다." + }, + "spite": { + "name": "원한", + "effect": "상대가 마지막으로 사용한 기술에 원한을 품어 그 기술의 PP를 4만큼 줄인다." + }, + "powderSnow": { + "name": "눈싸라기", + "effect": "차가운 가랑눈을 상대에게 내뿜어 공격한다. 얼음 상태로 만들 때가 있다." + }, + "protect": { + "name": "방어", + "effect": "상대의 공격을 전혀 받지 않는다. 연속으로 쓰면 실패하기 쉽다." + }, + "machPunch": { + "name": "마하펀치", + "effect": "눈에 보이지 않는 굉장한 속도로 펀치를 날린다. 반드시 선제공격을 할 수 있다." + }, + "scaryFace": { + "name": "겁나는얼굴", + "effect": "무서운 얼굴로 노려보고 겁주어 상대의 스피드를 크게 떨어뜨린다." + }, + "feintAttack": { + "name": "속여때리기", + "effect": "슬금슬금 상대에게 다가가 방심한 틈을 타서 세게 때린다. 공격은 반드시 명중한다." + }, + "sweetKiss": { + "name": "천사의키스", + "effect": "천사처럼 귀엽게 키스하여 상대를 혼란시킨다." + }, + "bellyDrum": { + "name": "배북", + "effect": "자신의 HP를 최대 HP의 절반만큼 감소시켜 자신의 공격을 최대로 올린다." + }, + "sludgeBomb": { + "name": "오물폭탄", + "effect": "더러운 오물을 상대에게 내던져서 공격한다. 독 상태로 만들 때가 있다." + }, + "mudSlap": { + "name": "진흙뿌리기", + "effect": "상대의 얼굴 등에 진흙을 내던져서 공격한다. 명중률을 떨어뜨린다." + }, + "octazooka": { + "name": "대포무노포", + "effect": "상대의 얼굴 등에 먹물을 내뿜어 공격한다. 명중률을 떨어뜨릴 때가 있다." + }, + "spikes": { + "name": "압정뿌리기", + "effect": "상대의 발밑에 압정을 뿌린다. 교체된 상대 포켓몬에게 데미지를 준다." + }, + "zapCannon": { + "name": "전자포", + "effect": "대포처럼 전기를 발사해서 공격한다. 상대를 마비 상태로 만든다." + }, + "foresight": { + "name": "꿰뚫어보기", + "effect": "고스트타입에 효과가 없는 기술이나 회피율이 높은 상대라 할지라도 공격이 맞게 된다." + }, + "destinyBond": { + "name": "길동무", + "effect": "기술을 쓴 뒤 상대의 공격으로 기절했을 때 공격 상대도 기절하게 한다. 연속으로 쓰면 실패한다." + }, + "perishSong": { + "name": "멸망의노래", + "effect": "노래를 들은 포켓몬은 3턴이 지나면 기절한다. 교체되면 효과가 없어진다." + }, + "icyWind": { + "name": "얼어붙은바람", + "effect": "차가운 냉기를 상대에게 내뿜어 공격한다. 상대의 스피드를 떨어뜨린다." + }, + "detect": { + "name": "판별", + "effect": "상대의 공격을 전혀 받지 않는다. 연속으로 쓰면 실패하기 쉽다." + }, + "boneRush": { + "name": "본러시", + "effect": "단단한 뼈로 상대를 세게 때려서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "lockOn": { + "name": "록온", + "effect": "조준을 잘 맞춰 다음 공격이 반드시 상대에게 명중하도록 한다." + }, + "outrage": { + "name": "역린", + "effect": "2-3턴 동안 마구 난동 부려서 공격한다. 난동 부린 뒤에는 혼란에 빠진다." + }, + "sandstorm": { + "name": "모래바람", + "effect": "5턴 동안 모래바람을 일으켜 바위 땅, 강철타입 이외의 상대에게 데미지를 준다. 바위타입의 특수방어가 올라간다." + }, + "gigaDrain": { + "name": "기가드레인", + "effect": "양분을 흡수하여 공격한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." + }, + "endure": { + "name": "버티기", + "effect": "공격을 받아도 HP를 반드시 1만큼은 남긴다. 연속으로 쓰면 실패하기 쉽다." + }, + "charm": { + "name": "애교부리기", + "effect": "귀엽게 바라보고 방심을 유도하여 상대의 공격을 크게 떨어뜨린다." + }, + "rollout": { + "name": "구르기", + "effect": "5턴 동안 구르기를 반복하여 공격한다. 기술이 맞을 때마다 위력이 올라간다." + }, + "falseSwipe": { + "name": "칼등치기", + "effect": "상대의 HP가 반드시 1만 남도록 조절하여 공격한다." + }, + "swagger": { + "name": "뽐내기", + "effect": "상대를 화내게 해서 혼란시킨다. 분노로 상대의 공격은 크게 올라가 버린다." + }, + "milkDrink": { + "name": "우유마시기", + "effect": "자신의 최대 HP 절반을 회복한다." + }, + "spark": { + "name": "스파크", + "effect": "전기를 둘러 상대에게 돌진하여 공격한다. 마비 상태로 만들 때가 있다." + }, + "furyCutter": { + "name": "연속자르기", + "effect": "낫이나 발톱 등으로 상대를 베어 공격한다. 연속으로 맞히면 위력이 올라간다." + }, + "steelWing": { + "name": "강철날개", + "effect": "단단한 날개를 상대에게 부딪쳐서 공격한다. 자신의 방어가 올라갈 때가 있다." + }, + "meanLook": { + "name": "검은눈빛", + "effect": "빨려 들어갈 것 같은 까만 눈빛으로 가만히 응시하여 상대를 배틀에서 도망갈 수 없게 한다." + }, + "attract": { + "name": "헤롱헤롱", + "effect": "수컷은 암컷을 암컷은 수컷을 유혹하여 헤롱헤롱하게 만든다. 상대가 기술을 쓰기 어려워진다." + }, + "sleepTalk": { + "name": "잠꼬대", + "effect": "자신이 배운 기술 중 하나를 무작위로 날린다. 자신이 잠들어 있을 때만 쓸 수 있다." + }, + "healBell": { + "name": "치료방울", + "effect": "기분 좋은 방울소리를 들려주어 같은 편 전원의 상태 이상을 회복한다." + }, + "return": { + "name": "은혜갚기", + "effect": "트레이너를 위해 전력으로 상대를 공격한다. 친밀할수록 위력이 올라간다." + }, + "present": { + "name": "프레젠트", + "effect": "덫을 설치한 상자를 상대에게 건네어 공격한다. HP가 회복돼버릴 때도 있다." + }, + "frustration": { + "name": "화풀이", + "effect": "불만을 풀기 위해 전력으로 상대를 공격한다. 친밀하지 않을수록 위력이 올라간다." + }, + "safeguard": { + "name": "신비의부적", + "effect": "5턴 동안 이상한 힘의 보호를 받아 상태 이상이 되지 않는다." + }, + "painSplit": { + "name": "아픔나누기", + "effect": "자신의 HP와 상대의 HP를 합친 것을 자신과 상대가 사이좋게 나눈다." + }, + "sacredFire": { + "name": "성스러운불꽃", + "effect": "신비한 불꽃으로 상대를 태워서 공격한다. 화상 상태로 만들 때가 있다." + }, + "magnitude": { + "name": "매그니튜드", + "effect": "땅을 흔들어서 자신의 주위에 있는 포켓몬을 공격한다. 기술의 위력이 여러모로 바뀐다." + }, + "dynamicPunch": { + "name": "폭발펀치", + "effect": "혼신의 힘으로 펀치를 날려서 공격한다. 상대를 반드시 혼란시킨다." + }, + "megahorn": { + "name": "메가혼", + "effect": "단단하고 훌륭한 뿔로 마음껏 상대를 꿰찔러서 공격한다." + }, + "dragonBreath": { + "name": "용의숨결", + "effect": "굉장한 숨결을 상대에게 내뿜어 공격한다. 마비 상태로 만들 때가 있다." + }, + "batonPass": { + "name": "배턴터치", + "effect": "교대 포켓몬과 바뀐다. 능력 변화는 바뀐 포켓몬이 그대로 이어받는다." + }, + "encore": { + "name": "앙코르", + "effect": "상대에게 앙코르를 외쳐서 기술을 3번 연속으로 쓰게 한다." + }, + "pursuit": { + "name": "따라가때리기", + "effect": "상대 포켓몬이 교체될 때 기술을 쓰면 2배의 위력으로 공격할 수 있다." + }, + "rapidSpin": { + "name": "고속스핀", + "effect": "회전해서 상대를 공격한다. 조이기, 김밥말이, 씨뿌리기 등을 날려버린다. 자신의 스피드도 오른다." + }, + "sweetScent": { + "name": "달콤한향기", + "effect": "향기로 상대의 회피율을 크게 떨어뜨린다." + }, + "ironTail": { + "name": "아이언테일", + "effect": "단단한 꼬리로 상대를 힘껏 쳐서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." + }, + "metalClaw": { + "name": "메탈클로", + "effect": "강철의 발톱으로 상대를 베어 갈라 공격한다. 자신의 공격이 올라갈 때도 있다." + }, + "vitalThrow": { + "name": "받아던지기", + "effect": "상대보다 나중에 공격한다. 그 대신 자신의 공격은 반드시 명중한다." + }, + "morningSun": { + "name": "아침햇살", + "effect": "자신의 HP를 회복한다. 날씨에 따라 회복량이 변한다." + }, + "synthesis": { + "name": "광합성", + "effect": "자신의 HP를 회복한다. 날씨에 따라 회복량이 변한다." + }, + "moonlight": { + "name": "달빛", + "effect": "자신의 HP를 회복한다. 날씨에 따라 회복량이 변한다." + }, + "hiddenPower": { + "name": "잠재파워", + "effect": "기술을 쓴 포켓몬에 따라 기술의 타입이 바뀐다." + }, + "crossChop": { + "name": "크로스촙", + "effect": "양손으로 당수를 상대에게 힘껏 쳐서 공격한다. 급소에 맞기 쉽다." + }, + "twister": { + "name": "회오리", + "effect": "회오리를 일으켜 상대를 끌어들여 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "rainDance": { + "name": "비바라기", + "effect": "5턴 동안 비를 내리게 해서 물타입 기술의 위력을 올린다. 불꽃타입의 위력은 떨어진다." + }, + "sunnyDay": { + "name": "쾌청", + "effect": "5턴 동안 햇살을 강하게 해서 불꽃타입 기술의 위력을 올린다. 물타입의 위력은 떨어진다." + }, + "crunch": { + "name": "깨물어부수기", + "effect": "날카로운 이빨로 상대를 깨물어 부숴서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." + }, + "mirrorCoat": { + "name": "미러코트", + "effect": "상대에게 받은 특수공격의 데미지를 2배로 만들어 그 상대에게 돌려준다." + }, + "psychUp": { + "name": "자기암시", + "effect": "자신에게 암시를 걸어서 능력 변화 상태를 상대와 똑같은 상태로 만든다." + }, + "extremeSpeed": { + "name": "신속", + "effect": "눈에 보이지 않는 굉장한 속도로 상대에게 돌진하여 공격한다. 반드시 선제공격을 할 수 있다." + }, + "ancientPower": { + "name": "원시의힘", + "effect": "원시의 힘으로 공격한다. 자신의 모든 능력이 오를 때가 있다." + }, + "shadowBall": { + "name": "섀도볼", + "effect": "까만 그림자의 덩어리를 내던져서 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "futureSight": { + "name": "미래예지", + "effect": "기술을 사용한 2턴 뒤에 상대에게 염동력의 덩어리를 보내어 공격한다." + }, + "rockSmash": { + "name": "바위깨기", + "effect": "펀치로 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." + }, + "whirlpool": { + "name": "바다회오리", + "effect": "세차게 소용돌이치는 물속에 4-5턴 동안 상대를 가두어 공격한다." + }, + "beatUp": { + "name": "집단구타", + "effect": "같은 편 전원이 공격한다. 동료 포켓몬이 많을수록 기술의 공격 횟수가 증가한다." + }, + "fakeOut": { + "name": "속이기", + "effect": "선제공격으로 상대를 풀죽게 한다. 배틀에 나가서 바로 쓰지 않으면 성공할 수 없다." + }, + "uproar": { + "name": "소란피기", + "effect": "3턴 동안 소란 피워 공격한다. 그동안은 아무도 잠들지 않게 된다." + }, + "stockpile": { + "name": "비축하기", + "effect": "힘을 비축해서 자신의 방어와 특수방어를 올린다. 최대 3회까지 비축할 수 있다." + }, + "spitUp": { + "name": "토해내기", + "effect": "비축된 힘을 상대에게 부딪쳐서 공격한다. 비축된 만큼 위력이 올라간다." + }, + "swallow": { + "name": "꿀꺽", + "effect": "비축된 힘을 꿀꺽해서 자신의 HP를 회복한다. 비축된 만큼 회복한다." + }, + "heatWave": { + "name": "열풍", + "effect": "뜨거운 숨결을 상대에게 내뿜어 공격한다. 화상 상태로 만들 때가 있다." + }, + "hail": { + "name": "싸라기눈", + "effect": "5턴 동안 싸라기눈을 내리게 해서 얼음타입이 아닌 포켓몬 모두에게 데미지를 준다." + }, + "torment": { + "name": "트집", + "effect": "상대에게 트집을 잡아서 똑같은 기술을 2회 연속으로 쓸 수 없게 한다." + }, + "flatter": { + "name": "부추기기", + "effect": "상대를 부추겨서 혼란시킨다. 동시에 상대의 특수공격도 올라가 버린다." + }, + "willOWisp": { + "name": "도깨비불", + "effect": "으스스하고 괴상한 불꽃을 쏘아 상대를 화상 상태로 만든다." + }, + "memento": { + "name": "추억의선물", + "effect": "자신은 기절하게 되지만 그 대신 상대의 공격과 특수공격을 크게 떨어뜨린다." + }, + "facade": { + "name": "객기", + "effect": "자신이 독, 마비, 화상 상태일 때 날리면 기술의 위력이 2배가 된다." + }, + "focusPunch": { + "name": "힘껏펀치", + "effect": "정신력을 높여 펀치를 날린다. 기술을 쓰기 전에 공격을 받으면 실패한다." + }, + "smellingSalts": { + "name": "정신차리기", + "effect": "마비 상태의 상대에게는 위력이 2배가 되지만 대신 상대의 마비가 풀린다." + }, + "followMe": { + "name": "날따름", + "effect": "자신에게 주목시켜 상대로부터의 공격을 모두 자신에게 향하게 한다." + }, + "naturePower": { + "name": "자연의힘", + "effect": "자연의 힘으로 공격한다. 사용하는 장소에 따라 나오는 기술이 변화한다." + }, + "charge": { + "name": "충전", + "effect": "다음 턴에 쓸 전기타입 기술의 위력을 올린다. 자신의 특수방어도 올라간다." + }, + "taunt": { + "name": "도발", + "effect": "상대를 화나게 한다. 3턴 동안 상대는 데미지를 주는 기술밖에 쓸 수 없게 된다." + }, + "helpingHand": { + "name": "도우미", + "effect": "동료를 돕는다. 도움받은 포켓몬이 쓰는 기술의 위력은 여느 때보다 커진다." + }, + "trick": { + "name": "트릭", + "effect": "상대의 빈틈을 노려 자신과 상대가 지닌 물건을 바꿔치기한다." + }, + "rolePlay": { + "name": "역할", + "effect": "상대의 역할을 하여 자신도 상대와 같은 특성으로 변화한다." + }, + "wish": { + "name": "희망사항", + "effect": "다음 턴에 자신 또는 교체한 포켓몬의 HP를 최대 HP의 절반만큼 회복한다." + }, + "assist": { + "name": "조수", + "effect": "서둘러서 같은 편의 도움을 받아 같은 편 포켓몬이 기억하고 있는 기술 중 하나를 쓴다." + }, + "ingrain": { + "name": "뿌리박기", + "effect": "대지에 뿌리를 박아 매 턴마다 자신의 HP를 회복한다. 뿌리 박고 있으므로 교체할 수 없다." + }, + "superpower": { + "name": "엄청난힘", + "effect": "엄청난 힘을 발휘하여 상대를 공격한다. 자신의 공격과 방어가 떨어진다." + }, + "magicCoat": { + "name": "매직코트", + "effect": "상대가 상태 이상이 되는 기술이나 씨뿌리기 등을 썼을 때 되받아친다." + }, + "recycle": { + "name": "리사이클", + "effect": "배틀 중에 사용하여 없어진 자신의 지닌 물건을 재생시켜 사용할 수 있게 한다." + }, + "revenge": { + "name": "리벤지", + "effect": "상대에게 기술을 받으면 그 상대에게 주는 데미지가 2배가 된다." + }, + "brickBreak": { + "name": "깨트리기", + "effect": "수도로 기세 좋게 내려쳐서 상대를 공격한다. 빛의장막이나 리플렉터 등도 파괴할 수 있다." + }, + "yawn": { + "name": "하품", + "effect": "큰 하품으로 졸음을 유도한다. 다음 턴에 상대를 잠듦 상태로 만든다." + }, + "knockOff": { + "name": "탁쳐서떨구기", + "effect": "상대의 지닌 물건을 탁 쳐서 떨어뜨려 배틀이 끝날 때까지 사용할 수 없게 한다. 물건을 가진 상대에게는 데미지를 더 준다." + }, + "endeavor": { + "name": "죽기살기", + "effect": "상대의 HP가 자신의 HP와 같아지도록 데미지를 준다." + }, + "eruption": { + "name": "분화", + "effect": "분노를 폭발시켜 상대를 공격한다. 자신의 HP가 적을수록 기술의 위력이 떨어진다." + }, + "skillSwap": { + "name": "스킬스왑", + "effect": "초능력으로 자신의 특성과 상대의 특성을 바꾼다." + }, + "imprison": { + "name": "봉인", + "effect": "상대가 자신과 같은 기술을 배웠다면 상대만 그 기술을 사용할 수 없게 한다." + }, + "refresh": { + "name": "리프레시", + "effect": "몸을 쉬게 하여 자신이 입은 독, 마비, 화상의 상태 이상을 치료한다." + }, + "grudge": { + "name": "원념", + "effect": "상대의 기술로 기절하면 원념을 담아 그 기술의 PP를 0으로 만든다." + }, + "snatch": { + "name": "가로채기", + "effect": "상대가 사용하려고 한 회복 기술이나 능력 변화의 기술을 빼앗아 자신에게 쓴다." + }, + "secretPower": { + "name": "비밀의힘", + "effect": "사용하는 장소에 따라 추가 효과가 변화하는 공격이다." + }, + "dive": { + "name": "다이빙", + "effect": "1턴째에 잠수했다가 2턴째에 떠올라 공격한다." + }, + "armThrust": { + "name": "손바닥치기", + "effect": "펼친 양손으로 상대를 번갈아 쳐서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "camouflage": { + "name": "보호색", + "effect": "물가나 풀밭, 동굴 등 있는 장소에 맞춰서 자신의 타입을 바꾼다." + }, + "tailGlow": { + "name": "반딧불", + "effect": "깜빡거리는 빛을 바라보고 자신의 정신을 통일하여 특수공격을 매우 크게 올린다." + }, + "lusterPurge": { + "name": "러스터퍼지", + "effect": "눈부신 빛을 발산하여 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "mistBall": { + "name": "미스트볼", + "effect": "안개의 깃털로 둘러싸 공격한다. 상대의 특수공격을 떨어뜨릴 때가 있다." + }, + "featherDance": { + "name": "깃털댄스", + "effect": "깃털을 흩뿌려 상대의 몸에 휘감는다. 상대의 공격을 크게 떨어뜨린다." + }, + "teeterDance": { + "name": "흔들흔들댄스", + "effect": "흔들흔들 댄스를 춰서 주위에 있는 포켓몬을 혼란 상태로 만든다." + }, + "blazeKick": { + "name": "블레이즈킥", + "effect": "공격한 상대를 화상 상태로 만들 때가 있다. 급소에도 맞기 쉽다." + }, + "mudSport": { + "name": "흙놀이", + "effect": "주위를 진흙투성이로 만든다. 5턴 동안 전기타입의 기술을 약하게 한다." + }, + "iceBall": { + "name": "아이스볼", + "effect": "5턴 동안 상대를 공격한다. 기술이 맞을 때마다 위력이 올라간다." + }, + "needleArm": { + "name": "바늘팔", + "effect": "바늘팔을 세차게 흔들어 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "slackOff": { + "name": "게으름피우기", + "effect": "게으름 피우며 쉰다. 자신의 HP를 최대 HP의 절반만큼 회복한다." + }, + "hyperVoice": { + "name": "하이퍼보이스", + "effect": "시끄럽게 울리는 큰 진동을 상대에게 전달하여 공격한다." + }, + "poisonFang": { + "name": "맹독엄니", + "effect": "독이 있는 이빨로 상대를 물어서 공격한다. 맹독을 주입할 때가 있다." + }, + "crushClaw": { + "name": "브레이크클로", + "effect": "단단하고 날카로운 손톱으로 베어 갈라서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." + }, + "blastBurn": { + "name": "블라스트번", + "effect": "폭발하는 불꽃으로 상대를 태워서 공격한다. 다음 턴은 움직일 수 없다." + }, + "hydroCannon": { + "name": "하이드로캐논", + "effect": "물의 대포를 상대에게 발사해서 공격한다. 다음 턴은 움직일 수 없다." + }, + "meteorMash": { + "name": "코멧펀치", + "effect": "혜성과 같은 펀치를 날려서 상대를 공격한다. 자신의 공격이 올라갈 때가 있다." + }, + "astonish": { + "name": "놀래키기", + "effect": "큰 소리 등으로 불시에 놀래켜서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "weatherBall": { + "name": "웨더볼", + "effect": "사용했을 때의 날씨에 따라서 기술 타입과 위력이 바뀐다." + }, + "aromatherapy": { + "name": "아로마테라피", + "effect": "기분 좋은 평온한 향기를 맡게 하여 같은 편 모두의 상태 이상을 회복한다." + }, + "fakeTears": { + "name": "거짓울음", + "effect": "우는 척을 하며 눈물을 흘린다. 난처하게 만들어 상대의 특수방어를 크게 떨어뜨린다." + }, + "airCutter": { + "name": "에어커터", + "effect": "날카로운 바람으로 상대를 베어 공격한다. 급소에 맞기 쉽다." + }, + "overheat": { + "name": "오버히트", + "effect": "풀 파워로 상대를 공격한다. 쓰면 반동으로 자신의 특수공격이 크게 떨어진다." + }, + "odorSleuth": { + "name": "냄새구별", + "effect": "고스트타입에 효과가 없는 기술이나 회피율이 높은 상대라 할지라도 공격이 맞게 된다." + }, + "rockTomb": { + "name": "암석봉인", + "effect": "암석을 내던져서 공격한다. 상대의 움직임을 봉인함으로써 스피드를 떨어뜨린다." + }, + "silverWind": { + "name": "은빛바람", + "effect": "바람에 날개 가루를 날려서 상대를 공격한다. 자신의 모든 능력이 올라갈 때가 있다." + }, + "metalSound": { + "name": "금속음", + "effect": "금속을 긁을 때 나는 듯한 싫은 소리를 들려준다. 상대의 특수방어를 크게 떨어뜨린다." + }, + "grassWhistle": { + "name": "풀피리", + "effect": "기분 좋은 피리 소리를 들려주어 상대를 잠듦 상태로 만든다." + }, + "tickle": { + "name": "간지르기", + "effect": "몸을 간질여 웃게 만들어서 상대의 공격과 방어를 떨어뜨린다." + }, + "cosmicPower": { + "name": "코스믹파워", + "effect": "우주로부터 신비한 힘을 손에 넣음으로써 자신의 방어와 특수방어를 올린다." + }, + "waterSpout": { + "name": "해수스파우팅", + "effect": "바닷물을 내뿜어 공격한다. 자신의 HP가 적을수록 기술의 위력이 떨어진다." + }, + "signalBeam": { + "name": "시그널빔", + "effect": "이상한 빛을 발사해서 공격한다. 상대를 혼란시킬 때가 있다." + }, + "shadowPunch": { + "name": "섀도펀치", + "effect": "그림자에 섞여 펀치를 날린다. 공격은 반드시 명중한다." + }, + "extrasensory": { + "name": "신통력", + "effect": "보이지 않는 이상한 힘을 보내어 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "skyUppercut": { + "name": "스카이어퍼", + "effect": "하늘을 향하는 듯한 높은 업퍼로 상대를 밀어올려 공격한다." + }, + "sandTomb": { + "name": "모래지옥", + "effect": "세차게 불어대는 모래바람 속에 4-5턴 동안 상대를 가두어 공격한다." + }, + "sheerCold": { + "name": "절대영도", + "effect": "상대를 일격에 기절시킨다. 얼음타입 이외의 포켓몬이 사용하면 잘 맞지 않는다." + }, + "muddyWater": { + "name": "탁류", + "effect": "탁해진 물을 상대에게 발사하여 공격한다. 명중률을 떨어뜨릴 때가 있다." + }, + "bulletSeed": { + "name": "씨기관총", + "effect": "씨앗을 기세 좋게 상대에게 발사하여 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "aerialAce": { + "name": "제비반환", + "effect": "재빠른 움직임으로 상대를 농락해 벤다. 공격은 반드시 명중한다." + }, + "icicleSpear": { + "name": "고드름침", + "effect": "날카로운 고드름을 상대에게 발사하여 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "ironDefense": { + "name": "철벽", + "effect": "피부를 쇠처럼 단단하게 만듦으로써 자신의 방어를 크게 올린다." + }, + "block": { + "name": "블록", + "effect": "양팔을 벌려 막아서서 상대의 도주로를 가로막아 도망칠 수 없게 한다." + }, + "howl": { + "name": "멀리짖기", + "effect": "큰 소리로 짖고 기합을 높여 자신과 같은 편의 공격을 올린다." + }, + "dragonClaw": { + "name": "드래곤클로", + "effect": "날카롭고 뾰족한 거대한 발톱으로 상대를 베어 갈라서 공격한다." + }, + "frenzyPlant": { + "name": "하드플랜트", + "effect": "큰 나무로 상대를 힘껏 쳐서 공격한다. 다음 턴은 움직일 수 없게 된다." + }, + "bulkUp": { + "name": "벌크업", + "effect": "몸에 힘을 담아 근육을 두껍게 해서 자신의 공격과 방어를 올린다." + }, + "bounce": { + "name": "뛰어오르기", + "effect": "하늘 높이 뛰어올라 2턴째에 상대를 공격한다. 마비 상태로 만들 때가 있다." + }, + "mudShot": { + "name": "머드샷", + "effect": "진흙 덩어리를 상대에게 내던져서 공격한다. 동시에 상대의 스피드를 떨어뜨린다." + }, + "poisonTail": { + "name": "포이즌테일", + "effect": "꼬리로 때린다. 독 상태로 만들 때가 있고 급소에도 맞기 쉽다." + }, + "covet": { + "name": "탐내기", + "effect": "귀엽게 애교부리며 상대에게 다가가 30%의 확률로 지니고 있는 도구를 뺏는다." + }, + "voltTackle": { + "name": "볼트태클", + "effect": "전기를 한데 모아 돌진한다. 자신도 상당한 데미지를 입는다. 마비 상태로 만들 때가 있다." + }, + "magicalLeaf": { + "name": "매지컬리프", + "effect": "상대를 추적하는 이상한 잎사귀를 흩뿌린다. 공격은 반드시 명중한다." + }, + "waterSport": { + "name": "물놀이", + "effect": "주위를 물로 흠뻑 젖게 만든다. 5턴 동안 불꽃타입의 기술을 약하게 한다." + }, + "calmMind": { + "name": "명상", + "effect": "조용히 정신을 통일하고 마음을 가라앉혀서 자신의 특수공격과 특수방어를 올린다." + }, + "leafBlade": { + "name": "리프블레이드", + "effect": "잎사귀를 칼처럼 이용해 상대를 베어 공격한다. 급소에 맞기 쉽다." + }, + "dragonDance": { + "name": "용의춤", + "effect": "신비롭고 힘센 춤을 격렬하게 춘다. 자신의 공격과 스피드를 올린다." + }, + "rockBlast": { + "name": "록블라스트", + "effect": "단단한 암석을 상대에게 발사하여 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "shockWave": { + "name": "전격파", + "effect": "전격을 재빠르게 상대에게 날린다. 공격은 반드시 명중한다." + }, + "waterPulse": { + "name": "물의파동", + "effect": "물의 진동을 상대에게 가하여 공격한다. 상대를 혼란시킬 때가 있다." + }, + "doomDesire": { + "name": "파멸의소원", + "effect": "기술을 사용한 2턴 뒤에 무수한 빛의 다발이 상대를 공격한다." + }, + "psychoBoost": { + "name": "사이코부스트", + "effect": "풀 파워로 상대를 공격한다. 쓰면 반동으로 자신의 특수공격이 크게 떨어진다." + }, + "roost": { + "name": "날개쉬기", + "effect": "땅에 내려와 몸을 쉬게 한다. 최대 HP의 절반만큼 HP를 회복한다." + }, + "gravity": { + "name": "중력", + "effect": "5턴 동안 부유나 비행타입에 땅타입의 기술이 맞게 된다. 공중으로 나는 기술도 사용할 수 없다." + }, + "miracleEye": { + "name": "미라클아이", + "effect": "악타입에 효과가 없는 기술이나 회피율이 높은 상대라 할지라도 공격이 맞게 된다." + }, + "wakeUpSlap": { + "name": "잠깨움뺨치기", + "effect": "잠듦 상태의 상대에게 큰 데미지를 준다. 대신 상대는 잠에서 깬다." + }, + "hammerArm": { + "name": "암해머", + "effect": "강하고 무거운 주먹을 휘둘러 데미지를 준다. 자신의 스피드가 떨어진다." + }, + "gyroBall": { + "name": "자이로볼", + "effect": "몸을 고속으로 회전시켜 몸통박치기한다. 상대보다 스피드가 낮을수록 위력은 올라간다." + }, + "healingWish": { + "name": "치유소원", + "effect": "자신은 기절하지만 교대하여 나오는 포켓몬의 상태 이상과 HP를 회복한다." + }, + "brine": { + "name": "소금물", + "effect": "상대가 HP의 절반 정도 상처를 입고 있으면 기술의 위력이 2배가 된다." + }, + "naturalGift": { + "name": "자연의은혜", + "effect": "나무열매에서 힘을 얻어 공격한다. 지니게 한 나무열매에 따라 기술의 타입과 위력이 바뀐다." + }, + "feint": { + "name": "페인트", + "effect": "방어나 판별 등을 하고 있는 상대에게 공격할 수 있다. 방어 효과를 해제시킨다." + }, + "pluck": { + "name": "쪼아대기", + "effect": "부리로 공격한다. 상대가 나무열매를 지니고 있을 때 먹어서 나무열매의 효과를 받을 수 있다." + }, + "tailwind": { + "name": "순풍", + "effect": "세차게 불어대는 바람의 소용돌이를 만들어 4턴 동안 같은 편 모두의 스피드를 올린다." + }, + "acupressure": { + "name": "경혈찌르기", + "effect": "경혈을 눌러 몸을 활성화시킨다. 능력 중 하나를 크게 올린다." + }, + "metalBurst": { + "name": "메탈버스트", + "effect": "기술을 쓰기 전에 마지막으로 받은 기술의 데미지를 늘려서 기술을 쓴 상대에게 돌려준다." + }, + "uTurn": { + "name": "유턴", + "effect": "공격한 뒤 굉장한 스피드로 돌아와서 교대 포켓몬과 교체한다." + }, + "closeCombat": { + "name": "인파이트", + "effect": "방어를 포기하고 상대 쪽으로 깊숙이 돌격한다. 자신의 방어와 특수방어가 떨어진다." + }, + "payback": { + "name": "보복", + "effect": "모아서 공격한다. 상대보다 나중에 공격할 수 있으면 기술의 위력은 2배가 된다." + }, + "assurance": { + "name": "승부굳히기", + "effect": "그 턴에 상대가 이미 데미지를 입었다면 기술의 위력은 2배가 된다." + }, + "embargo": { + "name": "금제", + "effect": "지니게 한 도구를 5턴 동안 쓸 수 없게 한다. 트레이너도 그 포켓몬에게는 도구를 쓸 수 없다." + }, + "fling": { + "name": "내던지기", + "effect": "지니게 한 도구를 재빠르게 내던져서 공격한다. 도구에 따라 위력과 효과가 바뀐다." + }, + "psychoShift": { + "name": "사이코시프트", + "effect": "초능력으로 암시를 걸어서 자신에게 걸려 있는 상태 이상을 상대에게 옮긴다." + }, + "trumpCard": { + "name": "마지막수단", + "effect": "마지막수단의 남은 PP가 적으면 적을수록 기술의 위력이 올라간다." + }, + "healBlock": { + "name": "회복봉인", + "effect": "5턴 동안 기술이나 특성, 지니고 있는 도구에 의한 HP 회복을 할 수 없게 한다." + }, + "wringOut": { + "name": "쥐어짜기", + "effect": "강하게 조여 공격을 한다. 상대의 HP가 많이 남아 있을수록 위력이 올라간다." + }, + "powerTrick": { + "name": "파워트릭", + "effect": "초능력으로 자신의 공격과 방어의 힘을 교환한다." + }, + "gastroAcid": { + "name": "위액", + "effect": "상대의 몸에 위액을 내뱉는다. 달라붙은 위액은 상대의 특성 효과를 지운다." + }, + "luckyChant": { + "name": "주술", + "effect": "하늘을 향해 기도를 올려 5턴 동안 상대의 공격을 급소에 맞지 않게 한다." + }, + "meFirst": { + "name": "선취", + "effect": "위력을 올려 상대가 쓰려고 하는 기술을 먼저 쓴다. 먼저 쓰지 않으면 실패한다." + }, + "copycat": { + "name": "흉내쟁이", + "effect": "직전에 나온 기술을 흉내 내어 같은 기술을 쓴다. 기술이 나오지 않았으면 실패한다." + }, + "powerSwap": { + "name": "파워스왑", + "effect": "초능력으로 자신과 상대의 공격과 특수공격의 능력 변화를 교체한다." + }, + "guardSwap": { + "name": "가드스왑", + "effect": "초능력으로 자신과 상대의 방어와 특수방어의 능력 변화를 교체한다." + }, + "punishment": { + "name": "혼내기", + "effect": "능력 변화로 상대가 파워업한 만큼 기술의 위력이 올라간다." + }, + "lastResort": { + "name": "비장의무기", + "effect": "배틀 중에 기억하고 있는 기술을 모두 사용하면 그때부터 쓸 수 있는 필살기이다." + }, + "worrySeed": { + "name": "고민씨", + "effect": "마음을 괴롭히는 씨앗을 심는다. 상대를 잠잘 수 없게 해서 특성을 불면으로 만든다." + }, + "suckerPunch": { + "name": "기습", + "effect": "상대보다 먼저 공격할 수 있다. 상대가 쓴 기술이 공격기술이 아니면 실패한다." + }, + "toxicSpikes": { + "name": "독압정", + "effect": "상대의 발밑에 독 압정을 뿌린다. 교체로 나온 상대 포켓몬에게 독을 퍼지게 한다." + }, + "heartSwap": { + "name": "하트스왑", + "effect": "초능력으로 자신과 상대에 걸려 있는 능력 변화를 교체한다." + }, + "aquaRing": { + "name": "아쿠아링", + "effect": "자신의 몸 주변을 물로 만든 베일로 덮는다. 매 턴 HP를 회복한다." + }, + "magnetRise": { + "name": "전자부유", + "effect": "전기로 만든 자력의 힘으로 허공에 뜬다. 5턴 동안 부유할 수 있다." + }, + "flareBlitz": { + "name": "플레어드라이브", + "effect": "불꽃을 두르고 돌진한다. 자신도 상당한 데미지를 입는다. 화상 상태로 만들 때가 있다." + }, + "forcePalm": { + "name": "발경", + "effect": "상대의 몸에 충격파를 부딪쳐 공격한다. 마비 상태로 만들 때가 있다." + }, + "auraSphere": { + "name": "파동탄", + "effect": "몸속에서 파동의 힘을 끌어내 상대에게 쏜다. 공격은 반드시 명중한다." + }, + "rockPolish": { + "name": "록커트", + "effect": "자신의 몸을 갈아 공기의 저항을 적게 한다. 스피드를 크게 올릴 수 있다." + }, + "poisonJab": { + "name": "독찌르기", + "effect": "독에 물든 촉수나 팔로 상대를 꿰찌른다. 독 상태로 만들 때가 있다." + }, + "darkPulse": { + "name": "악의파동", + "effect": "몸에서 악의로 가득한 무서운 오라를 발한다. 상대를 풀죽게 만들 때가 있다." + }, + "nightSlash": { + "name": "깜짝베기", + "effect": "순간적으로 틈을 노려 상대를 베어 버린다. 급소에 맞기 쉽다." + }, + "aquaTail": { + "name": "아쿠아테일", + "effect": "세차게 날뛰는 거친 파도와 같이 큰 꼬리를 흔들어서 상대를 공격한다." + }, + "seedBomb": { + "name": "씨폭탄", + "effect": "단단한 껍질을 가지고 있는 큰 씨앗을 위에서 힘껏 내던져 상대를 공격한다." + }, + "airSlash": { + "name": "에어슬래시", + "effect": "하늘까지 베어 가르는 공기의 칼날로 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "xScissor": { + "name": "시저크로스", + "effect": "낫이나 발톱을 가위처럼 교차시키면서 상대를 베어 가른다." + }, + "bugBuzz": { + "name": "벌레의야단법석", + "effect": "진동으로 음파를 일으켜서 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "dragonPulse": { + "name": "용의파동", + "effect": "큰 입으로 충격파를 일으켜서 상대를 공격한다." + }, + "dragonRush": { + "name": "드래곤다이브", + "effect": "굉장한 살기로 위압하면서 몸통박치기한다. 상대를 풀죽게 만들 때가 있다." + }, + "powerGem": { + "name": "파워젬", + "effect": "보석처럼 반짝이는 빛을 발사하여 상대를 공격한다." + }, + "drainPunch": { + "name": "드레인펀치", + "effect": "주먹으로 상대의 힘을 흡수한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." + }, + "vacuumWave": { + "name": "진공파", + "effect": "주먹을 흔들어 진공의 파도를 일으킨다. 반드시 선제공격을 할 수 있다." + }, + "focusBlast": { + "name": "기합구슬", + "effect": "기합을 높여서 혼신의 힘을 방출한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "energyBall": { + "name": "에너지볼", + "effect": "자연으로부터 모은 생명의 힘을 발사한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "braveBird": { + "name": "브레이브버드", + "effect": "날개를 접어 저공비행으로 돌격한다. 자신도 상당한 데미지를 입는다." + }, + "earthPower": { + "name": "대지의힘", + "effect": "상대의 발밑에 대지의 힘을 방출한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "switcheroo": { + "name": "바꿔치기", + "effect": "눈에 보이지 않는 속도로 자신과 상대가 지닌 물건을 교환한다." + }, + "gigaImpact": { + "name": "기가임팩트", + "effect": "가진 힘을 모두 사용해서 상대에게 돌격한다. 다음 턴은 움직일 수 없다." + }, + "nastyPlot": { + "name": "나쁜음모", + "effect": "나쁜 일을 생각해서 머리를 활성화시킨다. 자신의 특수공격을 크게 올린다." + }, + "bulletPunch": { + "name": "불릿펀치", + "effect": "탄환처럼 빠르고 단단한 펀치를 상대에게 날린다. 반드시 선제공격을 할 수 있다." + }, + "avalanche": { + "name": "눈사태", + "effect": "상대로부터 기술을 받으면 그 상대에 대해서 기술의 위력이 2배가 된다." + }, + "iceShard": { + "name": "얼음뭉치", + "effect": "얼음덩어리를 순식간에 만들어 상대에게 빠르게 쏜다. 반드시 선제공격을 할 수 있다." + }, + "shadowClaw": { + "name": "섀도클로", + "effect": "그림자로 만든 날카로운 발톱으로 상대를 베어 가른다. 급소에 맞기 쉽다." + }, + "thunderFang": { + "name": "번개엄니", + "effect": "전기를 모은 이빨로 문다. 상대를 풀죽게 하거나 마비 상태로 만들 때가 있다." + }, + "iceFang": { + "name": "얼음엄니", + "effect": "냉기를 품은 이빨로 문다. 상대를 풀죽게 하거나 얼음 상태로 만들 때가 있다." + }, + "fireFang": { + "name": "불꽃엄니", + "effect": "불꽃을 두른 이빨로 문다. 상대를 풀죽게 하거나 화상 상태로 만들 때가 있다." + }, + "shadowSneak": { + "name": "야습", + "effect": "그림자를 늘려 상대의 배후에서 공격한다. 반드시 선제공격할 수 있다." + }, + "mudBomb": { + "name": "진흙폭탄", + "effect": "단단한 진흙구슬을 상대에게 발사하여 공격한다. 명중률을 떨어뜨릴 때가 있다." + }, + "psychoCut": { + "name": "사이코커터", + "effect": "실체화시킨 마음의 칼날로 상대를 베어 가른다. 급소에 맞기 쉽다." + }, + "zenHeadbutt": { + "name": "사념의박치기", + "effect": "사념의 힘을 이마에 모아서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "mirrorShot": { + "name": "미러샷", + "effect": "갈고닦은 몸에서 섬광의 힘을 상대에게 쏜다. 명중률을 떨어뜨릴 때가 있다." + }, + "flashCannon": { + "name": "러스터캐논", + "effect": "몸의 빛을 한곳에 모아서 힘을 방출한다. 상대의 특수방어를 떨어뜨릴 때가 있다." + }, + "rockClimb": { + "name": "록클라임", + "effect": "굉장한 기세로 상대에게 돌진하여 공격한다. 상대를 혼란시킬 때가 있다." + }, + "defog": { + "name": "안개제거", + "effect": "강한 바람으로 상대의 리플렉터나 빛의장막 등을 제거한다. 회피율도 떨어뜨린다." + }, + "trickRoom": { + "name": "트릭룸", + "effect": "이상한 공간을 만든다. 5턴 동안 느린 포켓몬부터 행동할 수 있다." + }, + "dracoMeteor": { + "name": "용성군", + "effect": "천공에서 운석을 상대에게 떨어뜨린다. 사용하면 반동으로 자신의 특수공격이 크게 떨어진다." + }, + "discharge": { + "name": "방전", + "effect": "눈부신 전격으로 자신의 주위에 있는 포켓몬을 공격한다. 마비 상태로 만들 때가 있다." + }, + "lavaPlume": { + "name": "분연", + "effect": "새빨간 불꽃으로 자신의 주위에 있는 포켓몬을 공격한다. 화상 상태로 만들 때가 있다." + }, + "leafStorm": { + "name": "리프스톰", + "effect": "뾰족한 잎사귀로 상대에게 돌풍을 일으킨다. 사용하면 반동으로 자신의 특수공격이 크게 떨어진다." + }, + "powerWhip": { + "name": "파워휩", + "effect": "덩굴이나 촉수를 세차게 흔들어 상대를 힘껏 쳐서 공격한다." + }, + "rockWrecker": { + "name": "암석포", + "effect": "거대한 바위를 상대에게 발사하여 공격한다. 다음 턴은 움직일 수 없게 된다." + }, + "crossPoison": { + "name": "크로스포이즌", + "effect": "독 칼날로 상대를 베어 가른다. 독 상태로 만들 때가 있고 급소에도 맞기 쉽다." + }, + "gunkShot": { + "name": "더스트슈트", + "effect": "더러운 쓰레기를 상대에게 부딪쳐서 공격한다. 독 상태로 만들 때가 있다." + }, + "ironHead": { + "name": "아이언헤드", + "effect": "강철과 같은 단단한 머리로 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "magnetBomb": { + "name": "마그넷봄", + "effect": "상대에게 달라붙는 강철의 폭탄을 발사한다. 공격은 반드시 명중한다." + }, + "stoneEdge": { + "name": "스톤에지", + "effect": "뾰족한 바위를 상대에게 꿰찔러서 공격한다. 급소에 맞기 쉽다." + }, + "captivate": { + "name": "유혹", + "effect": "수컷은 암컷을 암컷은 수컷을 유혹하여 상대의 특수공격을 크게 떨어뜨린다." + }, + "stealthRock": { + "name": "스텔스록", + "effect": "상대의 주위에 무수한 바위를 띄워 교체해서 나온 상대 포켓몬에게 데미지를 준다." + }, + "grassKnot": { + "name": "풀묶기", + "effect": "풀을 휘감아서 상대를 쓰러뜨린다. 상대가 무거울수록 위력이 올라간다." + }, + "chatter": { + "name": "수다", + "effect": "매우 시끄럽고 수다스러운 음파로 상대를 공격한다. 상대를 혼란시킨다." + }, + "judgment": { + "name": "심판의뭉치", + "effect": "무수한 광탄을 상대에게 방출한다. 자신이 가지고 있는 플레이트에 따라 타입이 바뀐다." + }, + "bugBite": { + "name": "벌레먹기", + "effect": "물어서 공격한다. 상대가 나무열매를 지니고 있을 때 먹어서 나무열매의 효과를 받을 수 있다." + }, + "chargeBeam": { + "name": "차지빔", + "effect": "전격의 다발을 상대에게 발사한다. 전기를 모아서 자신의 특수공격을 올릴 때가 있다." + }, + "woodHammer": { + "name": "우드해머", + "effect": "단단한 몸통을 상대에게 부딪쳐서 공격한다. 자신도 상당한 데미지를 입는다." + }, + "aquaJet": { + "name": "아쿠아제트", + "effect": "눈에 보이지 않는 굉장한 속도로 상대에게 돌진한다. 반드시 선제공격할 수 있다." + }, + "attackOrder": { + "name": "공격지령", + "effect": "부하를 불러내어 상대를 향해서 공격시킨다. 급소에 맞기 쉽다." + }, + "defendOrder": { + "name": "방어지령", + "effect": "부하를 불러내어 자신의 몸을 뒤덮게 한다. 방어와 특수방어를 올릴 수 있다." + }, + "healOrder": { + "name": "회복지령", + "effect": "부하를 불러내어 상처를 회복한다. 최대 HP의 절반만큼 자신의 HP를 회복한다." + }, + "headSmash": { + "name": "양날박치기", + "effect": "목숨을 걸고 혼신의 힘으로 상대에게 박치기를 한다. 자신도 굉장한 데미지를 입는다." + }, + "doubleHit": { + "name": "더블어택", + "effect": "꼬리 등을 써서 상대를 때려 공격한다. 2회 연속으로 데미지를 준다." + }, + "roarOfTime": { + "name": "시간의포효", + "effect": "시간이 뒤틀릴 정도의 힘을 사용해서 상대를 공격한다. 다음 턴은 움직일 수 없다." + }, + "spacialRend": { + "name": "공간절단", + "effect": "주위의 공간과 더불어 상대를 찢어서 데미지를 준다. 급소에 맞기 쉽다." + }, + "lunarDance": { + "name": "초승달춤", + "effect": "자신은 기절하지만 교대하여 나오는 포켓몬의 모든 상태를 회복한다." + }, + "crushGrip": { + "name": "묵사발", + "effect": "굉장한 힘으로 상대를 묵사발로 만든다. 상대의 HP가 남아 있을수록 위력이 올라간다." + }, + "magmaStorm": { + "name": "마그마스톰", + "effect": "세차게 타오르는 불꽃 속에 4-5턴 동안 상대를 가두어 공격한다." + }, + "darkVoid": { + "name": "다크홀", + "effect": "암흑의 세계로 끌고 가서 떨어뜨려 상대를 잠듦 상태로 만든다." + }, + "seedFlare": { + "name": "시드플레어", + "effect": "몸속에서 충격파를 발생시킨다. 상대의 특수방어를 크게 떨어뜨릴 때가 있다." + }, + "ominousWind": { + "name": "괴상한바람", + "effect": "소름이 끼칠 만한 돌풍으로 상대를 공격한다. 자신의 모든 능력이 올라갈 때가 있다." + }, + "shadowForce": { + "name": "섀도다이브", + "effect": "1턴째에 모습을 감춰 2턴째에 상대를 공격한다. 방어하고 있어도 공격은 맞는다." + }, + "honeClaws": { + "name": "손톱갈기", + "effect": "손톱을 갈아 날카롭게 한다. 자신의 공격과 명중률을 올린다." + }, + "wideGuard": { + "name": "와이드가드", + "effect": "같은 편 전원에게 향하는 공격을 1턴 동안 막는다." + }, + "guardSplit": { + "name": "가드셰어", + "effect": "초능력으로 자신과 상대의 방어와 특수방어를 더해서 반으로 나눈다." + }, + "powerSplit": { + "name": "파워셰어", + "effect": "초능력으로 자신과 상대의 공격과 특수공격을 더해서 반으로 나눈다." + }, + "wonderRoom": { + "name": "원더룸", + "effect": "이상한 공간을 만든다. 5턴 동안 모든 포켓몬의 방어와 특수방어가 바뀐다." + }, + "psyshock": { + "name": "사이코쇼크", + "effect": "이상한 염력파를 실체화하여 상대를 공격한다. 물리적인 데미지를 준다." + }, + "venoshock": { + "name": "베놈쇼크", + "effect": "특수한 독액을 끼얹는다. 독 상태의 상대에게는 위력이 2배가 된다." + }, + "autotomize": { + "name": "바디퍼지", + "effect": "몸의 쓸모없는 부분을 깎는다. 자신의 스피드를 크게 올리고 체중도 가벼워진다." + }, + "ragePowder": { + "name": "분노가루", + "effect": "안절부절못하게 하는 가루를 자신에게 뿌려서 주의를 끈다. 상대의 공격은 모두 자신에게 향한다." + }, + "telekinesis": { + "name": "텔레키네시스", + "effect": "초능력으로 상대를 띄운다. 3턴 동안 공격이 상대에게 맞기 쉬워진다." + }, + "magicRoom": { + "name": "매직룸", + "effect": "이상한 공간을 만든다. 5턴 동안 모든 포켓몬의 도구의 효과가 사라진다." + }, + "smackDown": { + "name": "떨어뜨리기", + "effect": "돌이나 구슬을 던져서 날고 있는 상대를 공격한다. 맞은 상대는 땅에 떨어진다." + }, + "stormThrow": { + "name": "업어후리기", + "effect": "강렬한 일격을 상대에게 날린다. 공격은 반드시 급소에 맞는다." + }, + "flameBurst": { + "name": "불꽃튀기기", + "effect": "맞으면 튀는 불꽃으로 상대를 공격한다. 튕긴 불꽃은 옆의 상대에게도 쏟아진다." + }, + "sludgeWave": { + "name": "오물웨이브", + "effect": "오물 파도로 자신의 주위에 있는 포켓몬을 공격한다. 독 상태로 만들 때가 있다." + }, + "quiverDance": { + "name": "나비춤", + "effect": "신비롭고 아름다운 춤을 경쾌하게 춘다. 자신의 특수공격과 특수방어와 스피드를 올린다." + }, + "heavySlam": { + "name": "헤비봄버", + "effect": "무거운 몸으로 상대에게 부딪쳐 공격한다. 자신이 상대보다 무거울수록 위력이 올라간다." + }, + "synchronoise": { + "name": "싱크로노이즈", + "effect": "이상한 전파로 주위에 있는 자신과 같은 타입의 포켓몬에게 데미지를 준다." + }, + "electroBall": { + "name": "일렉트릭볼", + "effect": "전기 덩어리를 상대에게 부딪쳐서 공격한다. 상대보다 스피드가 빠를수록 위력이 올라간다." + }, + "soak": { + "name": "물붓기", + "effect": "많은 물을 끼얹어서 상대를 물타입으로 바꾼다." + }, + "flameCharge": { + "name": "니트로차지", + "effect": "불꽃을 둘러 상대를 공격한다. 힘을 모아서 자신의 스피드를 올린다." + }, + "coil": { + "name": "똬리틀기", + "effect": "똬리를 틀어서 집중한다. 자신의 공격과 방어와 명중률을 올린다." + }, + "lowSweep": { + "name": "로킥", + "effect": "재빠른 움직임으로 상대의 다리를 노려 공격한다. 상대의 스피드를 떨어뜨린다." + }, + "acidSpray": { + "name": "애시드봄", + "effect": "상대를 녹이는 액체를 토해내서 공격한다. 상대의 특수방어를 크게 떨어뜨린다." + }, + "foulPlay": { + "name": "속임수", + "effect": "상대의 힘을 이용한다. 싸우고 있는 상대의 공격이 높을수록 데미지가 올라간다." + }, + "simpleBeam": { + "name": "심플빔", + "effect": "수수께끼의 염력파를 상대에게 보낸다. 염력파를 받은 상대는 특성이 단순으로 바뀐다." + }, + "entrainment": { + "name": "동료만들기", + "effect": "이상한 리듬으로 춤춘다. 움직임을 흉내 내게 해서 자신과 상대의 특성을 똑같게 만든다." + }, + "afterYou": { + "name": "당신먼저", + "effect": "상대의 행동을 도와서 자신이 행동한 뒤에 바로 움직일 수 있도록 한다." + }, + "round": { + "name": "돌림노래", + "effect": "노래로 상대를 공격한다. 함께 돌림노래를 하면 계속해서 쓸 수 있고 위력도 올라간다." + }, + "echoedVoice": { + "name": "에코보이스", + "effect": "울리는 목소리로 상대를 공격한다. 매 턴 누군가 이 기술을 계속해서 쓰면 위력이 올라간다." + }, + "chipAway": { + "name": "야금야금", + "effect": "틈을 보며 착실하게 공격한다. 상대의 능력 변화에 관계없이 데미지를 준다." + }, + "clearSmog": { + "name": "클리어스모그", + "effect": "특수한 진흙 덩어리를 상대에게 내던져서 공격한다. 능력 변화를 원래대로 돌린다." + }, + "storedPower": { + "name": "어시스트파워", + "effect": "축적된 파워로 상대를 공격한다. 자신의 능력이 올라가 있는 만큼 위력이 오른다." + }, + "quickGuard": { + "name": "패스트가드", + "effect": "자신과 같은 편을 상대의 선제공격으로부터 지킨다." + }, + "allySwitch": { + "name": "사이드체인지", + "effect": "이상한 힘으로 순간이동하여 자신과 같은 편의 위치를 바꾼다." + }, + "scald": { + "name": "열탕", + "effect": "뜨겁게 끓어오르는 물을 상대에게 발사해서 공격한다. 화상 상태로 만들 때가 있다." + }, + "shellSmash": { + "name": "껍질깨기", + "effect": "껍질을 깨서 자신의 방어와 특수방어를 떨어뜨리지만 공격과 특수공격, 스피드를 크게 올린다." + }, + "healPulse": { + "name": "치유파동", + "effect": "치유파동을 날려서 최대 HP의 절반만큼 상대의 HP를 회복한다." + }, + "hex": { + "name": "병상첨병", + "effect": "엎친 데 덮친 격으로 공격한다. 상태 이상인 상대에게 큰 데미지를 준다." + }, + "skyDrop": { + "name": "프리폴", + "effect": "1턴째에 상대를 하늘로 끌고 가서 2턴째에 떨어뜨려 공격한다. 끌려간 상대는 움직일 수 없다." + }, + "shiftGear": { + "name": "기어체인지", + "effect": "톱니바퀴를 돌려서 자신의 공격을 올리는 것뿐만 아니라 스피드도 크게 올린다." + }, + "circleThrow": { + "name": "배대뒤치기", + "effect": "상대를 내던져서 교대할 포켓몬을 끌어낸다. 야생의 경우에는 배틀이 끝난다." + }, + "incinerate": { + "name": "불태우기", + "effect": "불꽃으로 상대를 공격한다. 상대가 나무열매 등을 지니고 있을 때 불태워서 쓸 수 없게 만든다." + }, + "quash": { + "name": "순서미루기", + "effect": "상대를 억눌러서 행동의 순서를 마지막으로 만든다." + }, + "acrobatics": { + "name": "애크러뱃", + "effect": "경쾌하게 상대를 공격한다. 도구를 적게 지니고 있을수록 더 큰 데미지를 준다." + }, + "reflectType": { + "name": "미러타입", + "effect": "상대의 타입을 반사해서 자신도 똑같은 타입이 된다." + }, + "retaliate": { + "name": "원수갚기", + "effect": "쓰러진 같은 편의 원수를 갚는다. 앞 턴에서 같은 편이 쓰러지면 위력이 올라간다." + }, + "finalGambit": { + "name": "목숨걸기", + "effect": "목숨을 걸고 상대를 공격한다. 자신은 기절하게 되지만 상대에게 HP만큼의 데미지를 준다." + }, + "bestow": { + "name": "기프트패스", + "effect": "상대가 도구를 지니고 있지 않을 때 자신이 지니고 있는 도구를 상대에게 건넨다." + }, + "inferno": { + "name": "연옥", + "effect": "격렬한 불꽃으로 상대를 둘러싸 공격한다. 화상 상태로 만든다." + }, + "waterPledge": { + "name": "물의맹세", + "effect": "물기둥으로 공격한다. 불꽃과 조합하면 위력이 올라가고 하늘에 무지개가 걸린다." + }, + "firePledge": { + "name": "불꽃의맹세", + "effect": "불꽃기둥으로 공격한다. 풀과 조합하면 위력이 올라가고 주위가 불바다가 된다." + }, + "grassPledge": { + "name": "풀의맹세", + "effect": "풀기둥으로 공격한다. 물과 조합하면 위력이 올라가고 주변이 습지초원이 된다." + }, + "voltSwitch": { + "name": "볼트체인지", + "effect": "공격한 뒤 굉장한 스피드로 돌아와서 교대 포켓몬과 교체한다." + }, + "struggleBug": { + "name": "벌레의저항", + "effect": "저항해서 상대를 공격한다. 상대의 특수공격을 떨어뜨린다." + }, + "bulldoze": { + "name": "땅고르기", + "effect": "땅을 힘껏 밟아 자신의 주위에 있는 포켓몬을 공격한다. 상대의 스피드를 떨어뜨린다." + }, + "frostBreath": { + "name": "얼음숨결", + "effect": "차가운 숨결을 상대에게 내뿜어 공격한다. 반드시 급소에 맞는다." + }, + "dragonTail": { + "name": "드래곤테일", + "effect": "상대를 튕겨내서 교대할 포켓몬을 끌어낸다. 야생의 경우에는 배틀이 끝난다." + }, + "workUp": { + "name": "분발", + "effect": "스스로 분발해서 공격과 특수공격을 올린다." + }, + "electroweb": { + "name": "일렉트릭네트", + "effect": "전기 네트로 상대를 붙잡아서 공격한다. 상대의 스피드를 떨어뜨린다." + }, + "wildCharge": { + "name": "와일드볼트", + "effect": "전기를 두르고 상대에게 부딪쳐 공격한다. 자신도 조금 데미지를 입는다." + }, + "drillRun": { + "name": "드릴라이너", + "effect": "드릴처럼 몸을 회전시켜서 상대에게 몸통박치기한다. 급소에 맞기 쉽다." + }, + "dualChop": { + "name": "더블촙", + "effect": "몸의 단단한 부분으로 상대를 때려 공격한다. 2회 연속으로 데미지를 준다." + }, + "heartStamp": { + "name": "하트스탬프", + "effect": "귀여운 모습으로 방심시켜서 강렬한 일격을 날린다. 상대를 풀죽게 만들 때가 있다." + }, + "hornLeech": { + "name": "우드혼", + "effect": "뿔을 꿰찔러서 상대의 양분을 흡수한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." + }, + "sacredSword": { + "name": "성스러운칼", + "effect": "긴 뿔로 베어 공격한다. 상대의 능력 변화에 관계없이 데미지를 준다." + }, + "razorShell": { + "name": "셸블레이드", + "effect": "날카로운 조개껍질로 베어 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." + }, + "heatCrash": { + "name": "히트스탬프", + "effect": "불타는 몸으로 상대에게 부딪쳐서 공격한다. 자신이 상대보다 무거울수록 위력이 올라간다." + }, + "leafTornado": { + "name": "그래스믹서", + "effect": "날카로운 잎사귀로 상대를 둘러싸서 공격한다. 명중률을 떨어뜨릴 때가 있다." + }, + "steamroller": { + "name": "하드롤러", + "effect": "둥글게 뭉친 몸을 회전하여 상대를 뭉개 버린다. 상대를 풀죽게 만들 때가 있다." + }, + "cottonGuard": { + "name": "코튼가드", + "effect": "푹신푹신한 솜털로 자신의 몸을 둘러싸서 지킨다. 방어를 매우 크게 올린다." + }, + "nightDaze": { + "name": "나이트버스트", + "effect": "암흑의 충격파를 날려서 상대를 공격한다. 명중률을 떨어뜨릴 때가 있다." + }, + "psystrike": { + "name": "사이코브레이크", + "effect": "이상한 염력파를 실체화하여 상대를 공격한다. 물리적인 데미지를 준다." + }, + "tailSlap": { + "name": "스위프뺨치기", + "effect": "단단한 꼬리로 상대를 때려서 공격한다. 2-5회 동안 연속으로 쓴다." + }, + "hurricane": { + "name": "폭풍", + "effect": "강렬한 바람으로 상대를 둘러싸서 공격한다. 상대를 혼란시킬 때가 있다." + }, + "headCharge": { + "name": "아프로브레이크", + "effect": "굉장한 아프로 머리로 상대에게 돌진하여 공격한다. 자신도 조금 데미지를 입는다." + }, + "gearGrind": { + "name": "기어소서", + "effect": "강철의 기어를 상대에게 던져서 공격한다. 2회 연속으로 데미지를 준다." + }, + "searingShot": { + "name": "화염탄", + "effect": "새빨간 불꽃으로 자신의 주위에 있는 포켓몬을 공격한다. 화상 상태로 만들 때가 있다." + }, + "technoBlast": { + "name": "테크노버스터", + "effect": "광탄을 상대에게 방출한다. 자신이 지니고 있는 카세트에 의해 타입이 바뀐다." + }, + "relicSong": { + "name": "옛노래", + "effect": "옛 노래를 상대에게 들려주고 마음에 호소하여 공격한다. 잠듦 상태로 만들 때가 있다." + }, + "secretSword": { + "name": "신비의칼", + "effect": "긴 뿔로 베어 공격한다. 뿔이 머금은 이상한 힘은 물리적인 데미지를 준다." + }, + "glaciate": { + "name": "얼어붙은세계", + "effect": "차가운 냉기를 상대에게 내뿜어 공격한다. 상대의 스피드를 떨어뜨린다." + }, + "boltStrike": { + "name": "뇌격", + "effect": "방대한 전기를 몸에 둘러 상대에게 돌진해서 공격한다. 마비 상태로 만들 때가 있다." + }, + "blueFlare": { + "name": "푸른불꽃", + "effect": "아름다우면서도 격렬한 푸른불꽃으로 상대를 둘러싸서 공격한다. 화상 상태로 만들 때가 있다." + }, + "fieryDance": { + "name": "불꽃춤", + "effect": "불꽃을 두른 날개를 쳐서 공격한다. 자신의 특수공격이 오를 때가 있다." + }, + "freezeShock": { + "name": "프리즈볼트", + "effect": "전기를 두른 얼음덩어리로 2턴째에 상대를 내리친다. 마비 상태로 만들 때가 있다." + }, + "iceBurn": { + "name": "콜드플레어", + "effect": "모든 것을 얼려버리는 격렬한 냉기로 2턴째에 상대를 둘러싼다. 화상 상태로 만들 때가 있다." + }, + "snarl": { + "name": "바크아웃", + "effect": "호되게 호통을 쳐서 상대의 특수공격을 떨어뜨린다." + }, + "icicleCrash": { + "name": "고드름떨구기", + "effect": "큰 고드름을 격렬하게 부딪쳐서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "vCreate": { + "name": "V제너레이트", + "effect": "작열하는 불꽃을 이마에서 발생시켜 이판사판으로 몸통박치기한다. 방어, 특수방어, 스피드가 떨어진다." + }, + "fusionFlare": { + "name": "크로스플레임", + "effect": "거대한 불꽃을 내리친다. 거대한 천둥의 영향을 받아 기술의 위력이 올라간다." + }, + "fusionBolt": { + "name": "크로스썬더", + "effect": "거대한 천둥을 내리친다. 거대한 불꽃의 영향을 받아 기술의 위력이 올라간다." + }, + "flyingPress": { + "name": "플라잉프레스", + "effect": "공중에서 상대에게 다이브한다. 이 기술은 격투타입임과 동시에 비행타입이기도 하다." + }, + "matBlock": { + "name": "마룻바닥세워막기", + "effect": "뒤집어 세운 마룻바닥을 방패로 하여 자신과 같은 편으로 향하는 기술 데미지를 막는다. 변화 기술은 막을 수 없다." + }, + "belch": { + "name": "트림", + "effect": "상대를 향해 트림을 하여 데미지를 준다. 나무열매를 먹지 않으면 쓸 수 없다." + }, + "rototiller": { + "name": "일구기", + "effect": "땅을 일구어 초목이 자라기 쉽게 한다. 풀타입의 공격과 특수공격이 오른다." + }, + "stickyWeb": { + "name": "끈적끈적네트", + "effect": "상대의 주위에 끈적끈적한 네트를 둘러 펼쳐 교체되어 나온 상대의 스피드를 떨어뜨린다." + }, + "fellStinger": { + "name": "마지막일침", + "effect": "이 기술을 사용하여 상대를 쓰러뜨리면 공격이 매우 크게 오른다." + }, + "phantomForce": { + "name": "고스트다이브", + "effect": "1턴째에 어디론가 사라져서 2턴째에 상대를 공격한다. 기술 방어를 무시하고 공격할 수 있다." + }, + "trickOrTreat": { + "name": "핼러윈", + "effect": "상대를 핼러윈으로 초대한다. 상대 타입에 고스트타입이 추가된다." + }, + "nobleRoar": { + "name": "부르짖기", + "effect": "우렁차게 부르짖어서 상대를 위협하여 상대의 공격과 특수공격을 떨어뜨린다." + }, + "ionDeluge": { + "name": "플라스마샤워", + "effect": "전기를 띤 입자를 확산시켜 노말타입 기술을 전기타입으로 바꿔버린다." + }, + "parabolicCharge": { + "name": "파라볼라차지", + "effect": "주위에 있는 모든 포켓몬에게 데미지를 준다. 준 데미지의 절반을 자신이 회복한다." + }, + "forestsCurse": { + "name": "숲의저주", + "effect": "상대에게 숲의 저주를 건다. 저주에 걸린 상대는 타입에 풀타입이 추가된다." + }, + "petalBlizzard": { + "name": "꽃보라", + "effect": "세찬 꽃보라를 일으켜서 주위에 있는 포켓몬을 공격하여 데미지를 준다." + }, + "freezeDry": { + "name": "프리즈드라이", + "effect": "상대를 급격히 차갑게 하여 얼음 상태로 만들 때가 있다. 물타입 포켓몬에게도 효과가 굉장해진다." + }, + "disarmingVoice": { + "name": "차밍보이스", + "effect": "매혹적인 울음소리를 내어 상대에게 정신적 데미지를 준다. 공격은 반드시 명중한다." + }, + "partingShot": { + "name": "막말내뱉기", + "effect": "막말을 내뱉어 상대를 위협하여 공격과 특수공격을 떨어뜨린 후 교대 포켓몬과 교체한다." + }, + "topsyTurvy": { + "name": "뒤집어엎기", + "effect": "상대에게 걸려 있는 모든 능력 변화를 뒤집어서 반대로 만든다." + }, + "drainingKiss": { + "name": "드레인키스", + "effect": "키스로 상대의 HP를 흡수한다. 준 데미지의 반 이상 HP를 회복한다." + }, + "craftyShield": { + "name": "트릭가드", + "effect": "이상한 힘을 사용하여 같은 편을 공격하는 변화 기술을 막는다. 데미지 기술은 받는다." + }, + "flowerShield": { + "name": "플라워가드", + "effect": "이상한 힘을 사용하여 배틀에 나와 있는 모든 풀타입 포켓몬의 방어를 올린다." + }, + "grassyTerrain": { + "name": "그래스필드", + "effect": "5턴 동안 그래스필드로 만든다. 땅에 있으면 매 턴 회복한다. 풀타입의 위력이 올라간다." + }, + "mistyTerrain": { + "name": "미스트필드", + "effect": "5턴 동안 땅에 있으면 상태 이상이 되지 않고 드래곤타입 기술의 데미지도 절반이 된다." + }, + "electrify": { + "name": "송전", + "effect": "상대가 기술을 쓰기 전에 송전하면 그 턴에 상대가 사용하는 기술은 전기타입이 된다." + }, + "playRough": { + "name": "치근거리기", + "effect": "상대에게 치근거리며 공격한다. 상대의 공격을 떨어뜨릴 때가 있다." + }, + "fairyWind": { + "name": "요정의바람", + "effect": "요정의 바람을 일으켜 상대에게 몰아쳐서 공격한다." + }, + "moonblast": { + "name": "문포스", + "effect": "달의 파워를 빌려서 상대를 공격한다. 상대의 특수공격을 떨어뜨릴 때가 있다." + }, + "boomburst": { + "name": "폭음파", + "effect": "무시무시한 폭음의 파괴력으로 주위에 있는 포켓몬을 공격한다." + }, + "fairyLock": { + "name": "페어리록", + "effect": "록을 걸어 다음 턴의 모든 포켓몬을 도망가지 못하게 한다." + }, + "kingsShield": { + "name": "킹실드", + "effect": "상대의 공격을 막음과 동시에 방어 태세를 갖춘다. 접촉한 상대의 공격을 떨어뜨린다." + }, + "playNice": { + "name": "친해지기", + "effect": "상대와 친해져서 싸울 마음을 잃게 하여 상대의 공격을 떨어뜨린다." + }, + "confide": { + "name": "비밀이야기", + "effect": "비밀 이야기를 해서 상대의 집중력을 잃게 하여 특수공격을 떨어뜨린다." + }, + "diamondStorm": { + "name": "다이아스톰", + "effect": "다이아 폭풍을 일으켜 데미지를 준다. 자신의 방어를 크게 올릴 때가 있다." + }, + "steamEruption": { + "name": "스팀버스트", + "effect": "상대에게 굉장히 뜨거운 증기를 뿜는다. 상대는 화상을 입기도 한다." + }, + "hyperspaceHole": { + "name": "이차원홀", + "effect": "이차원홀로 갑자기 상대 바로 옆에 나타나 공격한다. 방어나 판별 등도 무시할 수 있다." + }, + "waterShuriken": { + "name": "물수리검", + "effect": "점액으로 만든 수리검을 2-5회 동안 연속으로 던진다. 반드시 선제공격할 수 있다." + }, + "mysticalFire": { + "name": "매지컬플레임", + "effect": "입에서 내뱉는 아주 뜨거운 불꽃으로 공격한다. 상대의 특수공격을 떨어뜨린다." + }, + "spikyShield": { + "name": "니들가드", + "effect": "상대의 공격을 막음과 동시에 접촉한 상대의 체력을 떨어뜨린다." + }, + "aromaticMist": { + "name": "아로마미스트", + "effect": "신비한 아로마 향으로 같은 편의 특수방어를 올린다." + }, + "eerieImpulse": { + "name": "괴전파", + "effect": "몸에서 발생시킨 괴전파를 상대에게 쏘아 특수공격을 크게 떨어뜨린다." + }, + "venomDrench": { + "name": "베놈트랩", + "effect": "특수한 독액을 끼얹는다. 독 상태인 상대는 공격, 특수공격, 스피드가 떨어진다." + }, + "powder": { + "name": "분진", + "effect": "분진을 뒤집어쓴 상대가 불꽃 기술을 쓰면 폭발하여 데미지를 준다." + }, + "geomancy": { + "name": "지오컨트롤", + "effect": "1턴째에 에너지를 흡수하여 2턴째에 특수공격, 특수방어, 스피드를 크게 올린다." + }, + "magneticFlux": { + "name": "자기장조작", + "effect": "자기장 조작으로 인해 특성 플러스와 마이너스의 방어, 특수방어가 오른다." + }, + "happyHour": { + "name": "해피타임", + "effect": "해피타임 기술을 쓰면 배틀 후에 받을 수 있는 돈이 배가 된다." + }, + "electricTerrain": { + "name": "일렉트릭필드", + "effect": "5턴 동안 일렉트릭필드로 만든다. 땅에 있는 포켓몬은 잠들지 않는다. 전기타입의 위력이 올라간다." + }, + "dazzlingGleam": { + "name": "매지컬샤인", + "effect": "강력한 빛을 내어 상대에게 데미지를 준다." + }, + "celebrate": { + "name": "축하", + "effect": "포켓몬이 매우 행복한 당신을 축하해 준다." + }, + "holdHands": { + "name": "손에손잡기", + "effect": "같은 편 포켓몬끼리 손에 손을 잡는다. 굉장히 행복한 기분이 들게 된다." + }, + "babyDollEyes": { + "name": "초롱초롱눈동자", + "effect": "초롱초롱한 눈동자로 상대를 바라보며 공격을 떨어뜨린다. 반드시 선제공격할 수 있다." + }, + "nuzzle": { + "name": "볼부비부비", + "effect": "전기가 흐르는 볼을 비벼서 공격한다. 상대를 마비 상태로 만든다." + }, + "holdBack": { + "name": "적당히손봐주기", + "effect": "적당히 공격하여 상대의 HP를 반드시 1은 남긴다." + }, + "infestation": { + "name": "엉겨붙기", + "effect": "4-5턴 동안 상대에게 엉겨 붙어서 공격한다. 그동안 상대는 도망갈 수 없다." + }, + "powerUpPunch": { + "name": "그로우펀치", + "effect": "반복하여 때리면 점점 주먹이 단단해진다. 상대를 때리면 공격이 오른다." + }, + "oblivionWing": { + "name": "데스윙", + "effect": "조준한 상대로부터 HP를 흡수한다. 준 데미지의 반 이상 HP를 회복한다." + }, + "thousandArrows": { + "name": "사우전드애로", + "effect": "떠 있는 포켓몬도 맞힐 수 있다. 떠 있던 상대는 맞아서 땅에 떨어진다." + }, + "thousandWaves": { + "name": "사우전드웨이브", + "effect": "땅 위를 뻗어 나가는 파도로 공격한다. 파도에 휩쓸린 상대는 전투에서 도망칠 수 없게 된다." + }, + "landsWrath": { + "name": "그라운드포스", + "effect": "대지의 힘을 모으고 그 힘을 상대에게 집중시켜서 데미지를 준다." + }, + "lightOfRuin": { + "name": "파멸의빛", + "effect": "영원의 꽃의 파워를 빌려서 강력한 광선을 쏜다. 자신도 상당한 데미지를 입는다." + }, + "originPulse": { + "name": "근원의파동", + "effect": "파랗게 빛나는 무수한 광선으로 상대를 공격한다." + }, + "precipiceBlades": { + "name": "단애의칼", + "effect": "대지의 힘을 칼날로 바꿔 상대를 공격한다." + }, + "dragonAscent": { + "name": "화룡점정", + "effect": "넓은 하늘에서 급속으로 강하하여 상대를 공격한다. 자신의 방어와 특수방어가 떨어진다." + }, + "hyperspaceFury": { + "name": "이차원러시", + "effect": "많은 팔로 방어와 판별 등을 무시하는 연속 공격이다. 자신의 방어가 떨어진다." + }, + "breakneckBlitzPhysical": { + "name": "울트라대시어택", + "effect": "Z파워로 기세를 몰아 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." + }, + "breakneckBlitzSpecial": { + "name": "울트라대시어택", + "effect": "Dummy Data" + }, + "allOutPummelingPhysical": { + "name": "전력무쌍격렬권", + "effect": "Z파워로 만든 에너지 구슬을 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." + }, + "allOutPummelingSpecial": { + "name": "전력무쌍격렬권", + "effect": "Dummy Data" + }, + "supersonicSkystrikePhysical": { + "name": "파이널다이브클래시", + "effect": "Z파워로 기세 좋게 날아올라 상대를 향해 전력으로 낙하한다. 원래 기술에 따라 위력이 변한다." + }, + "supersonicSkystrikeSpecial": { + "name": "파이널다이브클래시", + "effect": "Dummy Data" + }, + "acidDownpourPhysical": { + "name": "애시드포이즌딜리트", + "effect": "Z파워로 독의 늪을 만들어 전력으로 상대를 가라앉힌다. 원래 기술에 따라 위력이 변한다." + }, + "acidDownpourSpecial": { + "name": "애시드포이즌딜리트", + "effect": "Dummy Data" + }, + "tectonicRagePhysical": { + "name": "라이징랜드오버", + "effect": "Z파워로 땅 깊숙이 파고들어 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." + }, + "tectonicRageSpecial": { + "name": "라이징랜드오버", + "effect": "Dummy Data" + }, + "continentalCrushPhysical": { + "name": "월즈엔드폴", + "effect": "Z파워로 큰 바위산을 불러내 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." + }, + "continentalCrushSpecial": { + "name": "월즈엔드폴", + "effect": "Dummy Data" + }, + "savageSpinOutPhysical": { + "name": "절대포식회전참", + "effect": "Z파워로 뱉어낸 실이 전력으로 상대를 붙들어 맨다. 원래 기술에 따라 위력이 변한다." + }, + "savageSpinOutSpecial": { + "name": "절대포식회전참", + "effect": "Dummy Data" + }, + "neverEndingNightmarePhysical": { + "name": "무한암야로의유인", + "effect": "Z파워로 불러낸 강한 원념이 전력으로 상대에게 쏟아진다. 원래 기술에 따라 위력이 변한다." + }, + "neverEndingNightmareSpecial": { + "name": "무한암야로의유인", + "effect": "Dummy Data" + }, + "corkscrewCrashPhysical": { + "name": "초월나선연격", + "effect": "Z파워로 고속 회전을 하여 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." + }, + "corkscrewCrashSpecial": { + "name": "초월나선연격", + "effect": "Dummy Data" + }, + "infernoOverdrivePhysical": { + "name": "다이내믹풀플레임", + "effect": "Z파워로 활활 타는 불꽃을 뱉어내 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." + }, + "infernoOverdriveSpecial": { + "name": "다이내믹풀플레임", + "effect": "Dummy Data" + }, + "hydroVortexPhysical": { + "name": "슈퍼아쿠아토네이도", + "effect": "Z파워로 큰 바다회오리를 만들어 전력으로 상대를 집어삼킨다. 원래 기술에 따라 위력이 변한다." + }, + "hydroVortexSpecial": { + "name": "슈퍼아쿠아토네이도", + "effect": "Dummy Data" + }, + "bloomDoomPhysical": { + "name": "블룸샤인엑스트라", + "effect": "Z파워로 화초들의 에너지를 빌려 전력으로 상대를 공격한다. 원래 기술에 따라 위력이 변한다." + }, + "bloomDoomSpecial": { + "name": "블룸샤인엑스트라", + "effect": "Dummy Data" + }, + "gigavoltHavocPhysical": { + "name": "스파킹기가볼트", + "effect": "Z파워로 비축한 강한 전기를 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." + }, + "gigavoltHavocSpecial": { + "name": "스파킹기가볼트", + "effect": "Dummy Data" + }, + "shatteredPsychePhysical": { + "name": "맥시멈사이브레이커", + "effect": "Z파워로 상대를 조종해 전력으로 매서운 맛을 보여준다. 원래 기술에 따라 위력이 변한다." + }, + "shatteredPsycheSpecial": { + "name": "맥시멈사이브레이커", + "effect": "Dummy Data" + }, + "subzeroSlammerPhysical": { + "name": "레이징지오프리즈", + "effect": "Z파워로 기온을 급격하게 떨어뜨려 전력으로 상대를 얼린다. 원래 기술에 따라 위력이 변한다." + }, + "subzeroSlammerSpecial": { + "name": "레이징지오프리즈", + "effect": "Dummy Data" + }, + "devastatingDrakePhysical": { + "name": "얼티메이트드래곤번", + "effect": "Z파워로 오라를 실체화시켜 전력으로 상대를 공격한다. 원래 기술에 따라 위력이 변한다." + }, + "devastatingDrakeSpecial": { + "name": "얼티메이트드래곤번", + "effect": "Dummy Data" + }, + "blackHoleEclipsePhysical": { + "name": "블랙홀이클립스", + "effect": "Z파워로 어둠의 에너지를 모아 전력으로 상대를 끌어당긴다. 원래 기술에 따라 위력이 변한다." + }, + "blackHoleEclipseSpecial": { + "name": "블랙홀이클립스", + "effect": "Dummy Data" + }, + "twinkleTacklePhysical": { + "name": "러블리스타임팩트", + "effect": "Z파워로 매혹의 공간을 만들어 전력으로 상대를 가지고 논다. 원래 기술에 따라 위력이 변한다." + }, + "twinkleTackleSpecial": { + "name": "러블리스타임팩트", + "effect": "Dummy Data" + }, + "catastropika": { + "name": "필살피카슛", + "effect": "Z파워로 최대 전력을 몸에 두른 피카츄가 전력으로 상대에게 덤벼든다." + }, + "shoreUp": { + "name": "모래모으기", + "effect": "자신의 최대 HP 절반을 회복한다. 모래바람일 때는 많이 회복한다." + }, + "firstImpression": { + "name": "만나자마자", + "effect": "위력이 높은 기술이지만 배틀에 나가서 바로 쓰지 않으면 성공할 수 없다." + }, + "banefulBunker": { + "name": "토치카", + "effect": "상대의 공격을 막음과 동시에 접촉한 상대에게 독을 퍼뜨린다." + }, + "spiritShackle": { + "name": "그림자꿰매기", + "effect": "공격과 동시에 상대의 그림자를 꿰매 도망칠 수 없게 한다." + }, + "darkestLariat": { + "name": "DD래리어트", + "effect": "양팔을 돌려 상대에게 부딪친다. 상대의 능력 변화에 상관없이 데미지를 준다." + }, + "sparklingAria": { + "name": "물거품아리아", + "effect": "노래 부르는 것으로 많은 벌룬을 방출한다. 기술에 맞으면 화상이 낫는다." + }, + "iceHammer": { + "name": "아이스해머", + "effect": "강하고 무거운 주먹을 휘둘러 데미지를 준다. 자신의 스피드가 떨어진다." + }, + "floralHealing": { + "name": "플라워힐", + "effect": "최대 HP의 절반만큼 상대의 HP를 회복한다. 그래스필드일 때 효과가 올라간다." + }, + "highHorsepower": { + "name": "10만마력", + "effect": "온몸을 써서 상대에게 맹렬히 어택한다." + }, + "strengthSap": { + "name": "힘흡수", + "effect": "상대 공격력과 동일하게 자신의 HP를 회복한다. 그리고 상대의 공격을 떨어뜨린다." + }, + "solarBlade": { + "name": "솔라블레이드", + "effect": "1턴째에 빛을 가득 모아 2턴째에 그 힘을 검에 담아 공격한다." + }, + "leafage": { + "name": "나뭇잎", + "effect": "잎을 상대에 맞춰 공격한다." + }, + "spotlight": { + "name": "스포트라이트", + "effect": "포켓몬에게 스포트라이트를 비춰 그 턴에서 그 포켓몬만 공격할 수 있게 한다." + }, + "toxicThread": { + "name": "독실", + "effect": "독이 섞인 실을 뿜어낸다. 상대를 독 상태로 만들고 스피드를 떨어뜨린다." + }, + "laserFocus": { + "name": "예민해지기", + "effect": "정신을 집중해서 다음 공격을 반드시 급소에 맞춘다." + }, + "gearUp": { + "name": "어시스트기어", + "effect": "기어를 넣는 것으로 특성 플러스와 마이너스의 공격과 특수공격이 올라간다." + }, + "throatChop": { + "name": "지옥찌르기", + "effect": "이 기술에 맞은 상대는 지옥의 고통 때문에 2턴 동안 소리 기술을 낼 수 없다." + }, + "pollenPuff": { + "name": "꽃가루경단", + "effect": "상대에게는 폭발하는 경단을 사용하여 공격한다. 같은 편에게는 회복하는 경단을 준다." + }, + "anchorShot": { + "name": "앵커샷", + "effect": "앵커를 상대에게 휘감아서 공격한다. 상대는 도망칠 수 없게 된다." + }, + "psychicTerrain": { + "name": "사이코필드", + "effect": "5턴 동안 땅에 있으면 선제공격을 받지 않는다. 에스퍼타입의 위력이 올라간다." + }, + "lunge": { + "name": "덤벼들기", + "effect": "전력으로 상대에게 덤벼들며 공격한다. 상대의 공격을 떨어뜨린다." + }, + "fireLash": { + "name": "불꽃채찍", + "effect": "불타는 채찍으로 상대를 친다. 공격을 받은 상대는 방어가 떨어진다." + }, + "powerTrip": { + "name": "기어오르기", + "effect": "자신의 강함을 뻐기고 공격한다. 자신의 능력이 올라가 있는 만큼 위력이 오른다." + }, + "burnUp": { + "name": "불사르기", + "effect": "전신의 불꽃을 모두 태워서 큰 데미지를 준다. 자신의 불꽃타입이 없어진다." + }, + "speedSwap": { + "name": "스피드스왑", + "effect": "상대의 스피드와 자신의 스피드를 교체한다." + }, + "smartStrike": { + "name": "스마트혼", + "effect": "뾰족한 뿔로 상대를 꿰찔러서 공격한다. 공격은 반드시 명중한다." + }, + "purify": { + "name": "정화", + "effect": "상대의 상태 이상을 회복한다. 회복하면 자신은 HP를 회복할 수 있다." + }, + "revelationDance": { + "name": "잠재댄스", + "effect": "전력으로 춤추며 공격한다. 이 기술의 타입은 자신의 타입과 같아진다." + }, + "coreEnforcer": { + "name": "코어퍼니셔", + "effect": "데미지를 준 상대가 이미 행동을 끝냈다면 상대의 특성을 없애버린다." + }, + "tropKick": { + "name": "트로피컬킥", + "effect": "남쪽 나라에서 유래된 뜨거운 킥을 상대에게 날린다. 상대의 공격을 떨어뜨린다." + }, + "instruct": { + "name": "지휘", + "effect": "상대에게 지시하여 상대가 쓴 기술을 다시 한번 쓰게 할 수 있다." + }, + "beakBlast": { + "name": "부리캐논", + "effect": "먼저 부리를 가열시킨 다음 공격을 날린다. 가열 중에 만지면 화상을 입는다." + }, + "clangingScales": { + "name": "스케일노이즈", + "effect": "전신의 비늘을 비벼서 큰 소리를 내 공격한다. 공격 후 자신의 방어가 떨어진다." + }, + "dragonHammer": { + "name": "드래곤해머", + "effect": "몸을 해머처럼 써서 상대를 덮쳐 데미지를 준다." + }, + "brutalSwing": { + "name": "세차게휘두르기", + "effect": "자신의 몸을 세차게 휘둘러서 상대에게 데미지를 준다." + }, + "auroraVeil": { + "name": "오로라베일", + "effect": "5턴 동안 물리와 특수 기술의 데미지를 약하게 한다. 설경일 때만 쓸 수 있다." + }, + "sinisterArrowRaid": { + "name": "섀도애로우즈스트라이크", + "effect": "Z파워로 무수한 화살을 만들어낸 모크나이퍼가 전력으로 상대를 꿰뚫는 공격이다." + }, + "maliciousMoonsault": { + "name": "하이퍼다크크러셔", + "effect": "Z파워로 강한 육체를 얻은 어흥염이 전력으로 상대에게 부딪쳐 공격한다." + }, + "oceanicOperetta": { + "name": "바다의심포니", + "effect": "Z파워로 대량의 물을 부른 누리레느가 전력으로 상대를 공격한다." + }, + "guardianOfAlola": { + "name": "알로라의수호자", + "effect": "Z파워로 알로라의 힘을 얻은 토속신포켓몬 전력의 공격. 상대의 남은 HP를 많이 줄인다." + }, + "soulStealing7StarStrike": { + "name": "칠성탈혼퇴", + "effect": "Z파워를 얻은 마샤도가 펀치와 킥의 연속기술을 전력으로 상대에게 퍼붓는다." + }, + "stokedSparksurfer": { + "name": "라이트닝서프라이드", + "effect": "Z파워를 얻은 알로라지방의 라이츄가 전력으로 공격한다. 상대를 마비 상태로 만든다." + }, + "pulverizingPancake": { + "name": "진심의공격", + "effect": "Z파워로 진심을 낸 잠만보가 거대한 몸을 움직여서 전력으로 상대를 공격한다." + }, + "extremeEvoboost": { + "name": "나인이볼부스트", + "effect": "Z파워를 얻은 이브이가 진화한 동료들의 힘을 빌려 능력을 크게 올린다." + }, + "genesisSupernova": { + "name": "오리진즈슈퍼노바", + "effect": "Z파워를 얻은 뮤가 전력으로 상대를 공격한다. 발밑이 사이코필드가 된다." + }, + "shellTrap": { + "name": "트랩셸", + "effect": "껍질의 트랩을 설치한다. 상대가 물리 기술을 쓰면 폭발해서 데미지를 준다." + }, + "fleurCannon": { + "name": "플뢰르캐논", + "effect": "강력한 빔을 발산한 후 자신의 특수공격이 크게 떨어진다." + }, + "psychicFangs": { + "name": "사이코팽", + "effect": "사이코 파워로 물어서 상대를 공격한다. 빛의장막이나 리플렉터도 파괴할 수 있다." + }, + "stompingTantrum": { + "name": "분함의발구르기", + "effect": "분함을 발판 삼아 공격한다. 앞 턴에서 기술이 빗나갔다면 위력이 배가 된다." + }, + "shadowBone": { + "name": "섀도본", + "effect": "영혼이 머물고 있는 뼈로 상대를 세게 때려서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." + }, + "accelerock": { + "name": "액셀록", + "effect": "재빠른 스피드로 상대에게 부딪쳐서 공격한다. 반드시 선제공격할 수 있다." + }, + "liquidation": { + "name": "아쿠아브레이크", + "effect": "물의 힘으로 상대에게 부딪쳐서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." + }, + "prismaticLaser": { + "name": "프리즘레이저", + "effect": "프리즘의 힘으로 강력한 광선을 발사한다. 다음 턴은 움직일 수 없다." + }, + "spectralThief": { + "name": "섀도스틸", + "effect": "상대의 그림자에 숨어들어 상대의 능력이 올라가는 것을 뺏어 공격한다." + }, + "sunsteelStrike": { + "name": "메테오드라이브", + "effect": "유성 같은 기세로 돌진한다. 상대의 특성을 무시하고 공격할 수 있다." + }, + "moongeistBeam": { + "name": "섀도레이", + "effect": "괴상한 광선을 쏘아 공격한다. 상대의 특성을 무시하고 공격할 수 있다." + }, + "tearfulLook": { + "name": "눈물그렁그렁", + "effect": "눈물을 그렁그렁거려 상대의 전의를 상실하게 한다. 상대의 공격과 특수공격이 떨어진다." + }, + "zingZap": { + "name": "찌리리따끔따끔", + "effect": "상대에게 부딪쳐 강력한 전기를 날려서 찌리리따끔따끔하게 만든다. 상대를 풀죽게 만들 때가 있다." + }, + "naturesMadness": { + "name": "자연의분노", + "effect": "자연의 분노를 상대에게 부딪친다. 상대의 HP는 절반이 된다." + }, + "multiAttack": { + "name": "멀티어택", + "effect": "높은 에너지를 둘러싸 상대에게 부딪쳐 공격한다. 메모리에 따라 타입이 바뀐다." + }, + "tenMillionVoltThunderbolt": { + "name": "1000만볼트", + "effect": "모자를 쓴 피카츄가 Z파워로 파워업한 전격을 쏜다. 급소에 맞기 쉽다." + }, + "mindBlown": { + "name": "깜짝헤드", + "effect": "자신의 머리를 폭발시켜 주위의 모든 것을 공격한다. 자신도 데미지를 받는다." + }, + "plasmaFists": { + "name": "플라스마피스트", + "effect": "전기를 두른 주먹으로 공격한다. 노말타입 기술을 전기타입으로 바꿔버린다." + }, + "photonGeyser": { + "name": "포톤가이저", + "effect": "빛의 기둥으로 공격한다. 공격과 특수공격을 비교해서 높은 쪽으로 데미지를 준다." + }, + "lightThatBurnsTheSky": { + "name": "하늘을태우는멸망의빛", + "effect": "네크로즈마가 상대의 특성 효과를 무시하고 공격과 특수공격 중 높은 쪽으로 데미지를 준다." + }, + "searingSunrazeSmash": { + "name": "선샤인스매셔", + "effect": "Z파워를 얻은 솔가레오가 전력으로 공격한다. 상대의 특성 효과를 무시할 수 있다." + }, + "menacingMoonrazeMaelstrom": { + "name": "문라이트블래스터", + "effect": "Z파워를 얻은 루나아라가 전력으로 공격한다. 상대의 특성 효과를 무시할 수 있다." + }, + "letsSnuggleForever": { + "name": "투닥투닥프렌드타임", + "effect": "Z파워를 얻은 따라큐가 전력으로 투닥투닥 공격한다." + }, + "splinteredStormshards": { + "name": "레이디얼에지스톰", + "effect": "Z파워를 얻은 루가루암이 전력으로 공격한다. 추가로 필드 상태를 없앤다." + }, + "clangorousSoulblaze": { + "name": "브레이징소울비트", + "effect": "Z파워를 얻은 짜랑고우거가 전력으로 상대를 공격한다. 추가로 자신의 능력이 올라간다." + }, + "zippyZap": { + "name": "파찌파찌액셀", + "effect": "맹렬한 속도의 전격 공격. 반드시 선제공격할 수 있고 급소에 맞는다." + }, + "splishySplash": { + "name": "참방참방서핑", + "effect": "커다란 파도에 전기를 날리고 상대에게 부딪쳐서 공격한다. 마비 상태로 만들 때가 있다." + }, + "floatyFall": { + "name": "둥실둥실폴", + "effect": "두둥실 떠오른 다음 단숨에 급강하해서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "pikaPapow": { + "name": "피카피카썬더", + "effect": "트레이너를 좋아하는 피카츄의 마음이 강할수록 위력이 올라가는 전격. 반드시 명중한다." + }, + "bouncyBubble": { + "name": "생생버블", + "effect": "물덩어리를 부딪쳐서 공격한다. 물을 흡수하여 준 데미지만큼 HP를 회복한다." + }, + "buzzyBuzz": { + "name": "찌릿찌릿일렉", + "effect": "전기를 상대에게 날려서 공격한다. 상대를 마비 상태로 만든다." + }, + "sizzlySlide": { + "name": "이글이글번", + "effect": "불꽃을 두른 몸으로 기세 좋게 상대에게 부딪친다. 상대를 화상 상태로 만든다." + }, + "glitzyGlow": { + "name": "콸콸오라", + "effect": "염동력을 한가득 날린다. 상대의 특수공격을 약하게 만드는 이상한 장막을 만든다." + }, + "baddyBad": { + "name": "아그아그존", + "effect": "악함을 어필해서 공격한다. 상대의 물리공격을 약하게 만드는 이상한 장막을 만든다." + }, + "sappySeed": { + "name": "쑥쑥봄버", + "effect": "거대한 덩굴을 자라게 하고 씨를 흩뿌려서 공격한다. 씨는 매 턴 상대의 HP를 흡수한다." + }, + "freezyFrost": { + "name": "꽁꽁프로스트", + "effect": "차갑게 얼어붙은 흑안개의 결정으로 공격한다. 전원의 능력 변화를 원래대로 돌린다." + }, + "sparklySwirl": { + "name": "반짝반짝스톰", + "effect": "숨 막힐 듯 진한 향기의 회오리로 상대를 휘감아 공격한다. 같은 편의 상태 이상을 회복한다." + }, + "veeveeVolley": { + "name": "브이브이브레이크", + "effect": "트레이너를 좋아하는 이브이의 마음이 강할수록 위력이 올라가는 몸통박치기. 반드시 명중한다." + }, + "doubleIronBash": { + "name": "더블펀처", + "effect": "가슴의 너트를 축으로 회전시켜 2번 연속 팔로 힘껏 친다. 상대를 풀죽게 만들 때가 있다." + }, + "maxGuard": { + "name": "다이월", + "effect": "상대의 공격을 전혀 받지 않는다. 연속으로 쓰면 실패하기 쉽다." + }, + "dynamaxCannon": { + "name": "다이맥스포", + "effect": "코어에서 빔을 발사해서 공격한다. 상대가 웨이브 레벨 최대치를 초과했다면, 초과한 정도에 비례하여 데미지가 최대 2배가 된다." + }, + "snipeShot": { + "name": "노려맞히기", + "effect": "상대의 기술을 끌어모으는 특성이나 기술의 영향을 무시하고 선택한 상대를 공격할 수 있다." + }, + "jawLock": { + "name": "물고버티기", + "effect": "어느 한쪽이 기절할 때까지 교체할 수 없게 된다. 한쪽의 포켓몬이 없어지면 효과가 사라진다." + }, + "stuffCheeks": { + "name": "볼가득넣기", + "effect": "지니고 있는 나무열매를 먹고 방어를 크게 올린다." + }, + "noRetreat": { + "name": "배수의진", + "effect": "자신의 모든 능력이 올라가지만 교체하거나 도망칠 수 없게 된다." + }, + "tarShot": { + "name": "타르샷", + "effect": "끈적끈적한 타르를 날려서 상대의 스피드를 떨어뜨린다. 상대는 불꽃이 약점이 된다." + }, + "magicPowder": { + "name": "마법가루", + "effect": "마법가루를 날려서 상대를 에스퍼타입으로 바꾼다." + }, + "dragonDarts": { + "name": "드래곤애로", + "effect": "드라꼰으로 2번 공격한다. 상대가 2마리일 때는 각각 1번씩 공격한다." + }, + "teatime": { + "name": "다과회", + "effect": "다과회를 열어서 배틀에 나와 있는 포켓몬이 각각 지니고 있는 나무열매를 먹는다." + }, + "octolock": { + "name": "문어굳히기", + "effect": "상대를 도망칠 수 없게 한다. 굳히기에 당한 상대는 매 턴 방어와 특수방어가 떨어진다." + }, + "boltBeak": { + "name": "전격부리", + "effect": "전기를 두른 부리로 찌른다. 상대보다 먼저 공격하면 기술의 위력은 2배가 된다." + }, + "fishiousRend": { + "name": "아가미물기", + "effect": "단단한 아가미로 문다. 상대보다 먼저 공격하면 기술의 위력은 2배가 된다." + }, + "courtChange": { + "name": "코트체인지", + "effect": "이상한 힘으로 서로의 필드 효과를 교체한다." + }, + "maxFlare": { + "name": "다이번", + "effect": "다이맥스한 포켓몬이 날리는 불꽃타입의 공격. 5턴 동안 햇살을 강하게 만든다." + }, + "maxFlutterby": { + "name": "다이웜", + "effect": "다이맥스한 포켓몬이 날리는 벌레타입의 공격. 상대의 특수공격을 떨어뜨린다." + }, + "maxLightning": { + "name": "다이썬더", + "effect": "다이맥스한 포켓몬이 날리는 전기타입의 공격. 5턴 동안 일렉트릭필드로 만든다." + }, + "maxStrike": { + "name": "다이어택", + "effect": "다이맥스한 포켓몬이 날리는 노말타입의 공격. 상대의 스피드를 떨어뜨린다." + }, + "maxKnuckle": { + "name": "다이너클", + "effect": "다이맥스한 포켓몬이 날리는 격투타입의 공격. 같은 편의 공격을 올린다." + }, + "maxPhantasm": { + "name": "다이할로우", + "effect": "다이맥스한 포켓몬이 날리는 고스트타입의 공격. 상대의 방어를 떨어뜨린다." + }, + "maxHailstorm": { + "name": "다이아이스", + "effect": "다이맥스한 포켓몬이 날리는 얼음타입의 공격. 5턴 동안 싸라기눈을 내리게 한다." + }, + "maxOoze": { + "name": "다이애시드", + "effect": "다이맥스한 포켓몬이 날리는 독타입의 공격. 같은 편의 특수공격을 올린다." + }, + "maxGeyser": { + "name": "다이스트림", + "effect": "다이맥스한 포켓몬이 날리는 물타입의 공격. 5턴 동안 비를 내리게 한다." + }, + "maxAirstream": { + "name": "다이제트", + "effect": "다이맥스한 포켓몬이 날리는 비행타입의 공격. 같은 편의 스피드를 올린다." + }, + "maxStarfall": { + "name": "다이페어리", + "effect": "다이맥스한 포켓몬이 날리는 페어리타입의 공격. 5턴 동안 미스트필드로 만든다." + }, + "maxWyrmwind": { + "name": "다이드라군", + "effect": "다이맥스한 포켓몬이 날리는 드래곤타입의 공격. 상대의 공격을 떨어뜨린다." + }, + "maxMindstorm": { + "name": "다이사이코", + "effect": "다이맥스한 포켓몬이 날리는 에스퍼타입의 공격. 5턴 동안 사이코필드로 만든다." + }, + "maxRockfall": { + "name": "다이록", + "effect": "다이맥스한 포켓몬이 날리는 바위타입의 공격. 5턴 동안 날씨를 모래바람으로 만든다." + }, + "maxQuake": { + "name": "다이어스", + "effect": "다이맥스한 포켓몬이 날리는 땅타입의 공격. 같은 편의 특수방어를 올린다." + }, + "maxDarkness": { + "name": "다이아크", + "effect": "다이맥스한 포켓몬이 날리는 악타입의 공격. 상대의 특수방어를 떨어뜨린다." + }, + "maxOvergrowth": { + "name": "다이그래스", + "effect": "다이맥스한 포켓몬이 날리는 풀타입의 공격. 5턴 동안 그래스필드로 만든다." + }, + "maxSteelspike": { + "name": "다이스틸", + "effect": "다이맥스한 포켓몬이 날리는 강철타입의 공격. 같은 편의 방어를 올린다." + }, + "clangorousSoul": { + "name": "소울비트", + "effect": "자신의 HP를 조금 깎아서 모든 능력을 올린다." + }, + "bodyPress": { + "name": "바디프레스", + "effect": "몸을 부딪쳐서 공격한다. 방어가 높을수록 주는 데미지가 올라간다." + }, + "decorate": { + "name": "데코레이션", + "effect": "데코레이션을 해서 상대의 공격과 특수공격을 크게 올린다." + }, + "drumBeating": { + "name": "드럼어택", + "effect": "드럼의 뿌리를 연주로 조종해서 공격하는 것으로 상대의 스피드를 떨어뜨린다." + }, + "snapTrap": { + "name": "집게덫", + "effect": "집게덫으로 붙잡은 뒤 4-5턴 동안 상대를 끼워서 공격한다." + }, + "pyroBall": { + "name": "화염볼", + "effect": "작은 돌을 태운 불꽃의 공으로 상대를 공격한다. 화상 상태로 만들 때가 있다." + }, + "behemothBlade": { + "name": "거수참", + "effect": "크고 강한 검을 온몸으로 치켜든 다음 기세 좋게 베어서 공격한다." + }, + "behemothBash": { + "name": "거수탄", + "effect": "온몸을 강하고 튼튼한 방패로 바꾼 다음 기세 좋게 부딪혀서 공격한다." + }, + "auraWheel": { + "name": "오라휠", + "effect": "볼주머니에 저장해둔 에너지로 공격하고 자신의 스피드를 올린다. 모르페코의 모습에 따라 타입이 바뀐다." + }, + "breakingSwipe": { + "name": "와이드브레이커", + "effect": "강인한 꼬리를 세차게 휘둘러서 상대를 공격한다. 상대의 공격을 떨어뜨린다." + }, + "branchPoke": { + "name": "가지찌르기", + "effect": "날카롭고 뾰족한 가지로 상대를 찔러서 공격한다." + }, + "overdrive": { + "name": "오버드라이브", + "effect": "기타나 베이스를 쳐서 큰 울림과 강한 진동을 상대에게 전달하여 공격한다." + }, + "appleAcid": { + "name": "사과산", + "effect": "새콤한 사과에서 만들어 낸 산성 액체로 공격한다. 상대의 특수방어를 떨어뜨린다." + }, + "gravApple": { + "name": "G의힘", + "effect": "높은 곳에서 사과를 떨어뜨려서 데미지를 준다. 상대의 방어를 떨어뜨린다." + }, + "spiritBreak": { + "name": "소울크래시", + "effect": "맞으면 기가 꺾여버릴 것 같은 기세로 공격한다. 상대의 특수공격을 떨어뜨린다." + }, + "strangeSteam": { + "name": "원더스팀", + "effect": "연기를 분출해서 상대를 공격한다. 혼란시킬 때가 있다." + }, + "lifeDew": { + "name": "생명의물방울", + "effect": "신비한 물을 흩뿌려서 자신과 배틀에 나와 있는 같은 편의 HP를 회복한다." + }, + "obstruct": { + "name": "블로킹", + "effect": "상대의 공격을 전혀 받지 않는다. 연속으로 쓰면 실패하기 쉽다. 접촉한 상대의 방어를 크게 떨어뜨린다." + }, + "falseSurrender": { + "name": "사죄의찌르기", + "effect": "고개를 숙이는 척하면서 흐트러진 머리카락으로 찌른다. 공격은 반드시 명중한다." + }, + "meteorAssault": { + "name": "스타어설트", + "effect": "굵은 줄기를 휘둘러서 공격한다. 단 자신도 비틀거리기 때문에 다음 턴은 움직일 수 없다." + }, + "eternabeam": { + "name": "무한다이빔", + "effect": "본래의 모습이 된 무한다이노 최대의 공격. 다음 턴은 움직일 수 없다." + }, + "steelBeam": { + "name": "철제광선", + "effect": "전신에서 끌어모은 강철을 빔으로 바꿔 세차게 발사한다. 자신도 데미지를 받는다." + }, + "expandingForce": { + "name": "와이드포스", + "effect": "사이코 파워로 상대를 공격한다. 사이코필드일 때는 위력이 오르며 모든 상대에게 데미지를 준다." + }, + "steelRoller": { + "name": "아이언롤러", + "effect": "필드를 파괴하면서 공격한다. 필드가 어떤 상태로든 변해 있지 않은 경우 기술은 실패한다." + }, + "scaleShot": { + "name": "스케일샷", + "effect": "비늘을 쏘아서 공격한다. 2-5회 동안 연속으로 쓴다. 스피드가 올라가지만 방어가 떨어진다." + }, + "meteorBeam": { + "name": "메테오빔", + "effect": "1턴째에 우주의 힘을 모아서 특수공격을 올리고 2턴째에 상대를 공격한다." + }, + "shellSideArm": { + "name": "셸암즈", + "effect": "물리와 특수 중 더 많은 데미지를 줄 수 있는 능력으로 공격한다. 독 상태로 만들 때가 있다." + }, + "mistyExplosion": { + "name": "미스트버스트", + "effect": "자신의 주위에 있는 모두를 공격하지만 사용하면 기절한다. 미스트필드일 때 위력이 올라간다." + }, + "grassyGlide": { + "name": "그래스슬라이더", + "effect": "지면에 미끄러지듯 상대를 공격한다. 그래스필드일 때 반드시 선제공격할 수 있다." + }, + "risingVoltage": { + "name": "라이징볼트", + "effect": "지면에서 올라오는 전격으로 공격한다. 상대가 일렉트릭필드 위에 있을 때 기술의 위력이 2배가 된다." + }, + "terrainPulse": { + "name": "대지의파동", + "effect": "필드의 힘을 빌려서 공격한다. 사용했을 때의 필드 상태에 따라서 기술 타입과 위력이 바뀐다." + }, + "skitterSmack": { + "name": "엄습하는일격", + "effect": "배후에서 엄습해서 공격한다. 상대의 특수공격을 떨어뜨린다." + }, + "burningJealousy": { + "name": "질투의불꽃", + "effect": "질투의 에너지로 상대를 공격한다. 그 턴에 능력이 올라간 포켓몬을 화상 상태로 만든다." + }, + "lashOut": { + "name": "분풀이", + "effect": "상대에 대한 울분이 담긴 공격을 한다. 그 턴에 능력이 떨어져 있으면 기술의 위력이 2배가 된다." + }, + "poltergeist": { + "name": "폴터가이스트", + "effect": "상대의 지닌 물건을 조종해서 공격한다. 상대가 도구를 지니고 있지 않으면 실패한다." + }, + "corrosiveGas": { + "name": "부식가스", + "effect": "주위에 있는 모든 것을 강력한 산성 가스로 뒤덮어서 지니고 있는 도구를 녹여버린다." + }, + "coaching": { + "name": "코칭", + "effect": "적절한 지도를 통해서 같은 편 전원의 공격과 방어를 올린다." + }, + "flipTurn": { + "name": "퀵턴", + "effect": "공격한 뒤 굉장한 스피드로 돌아와서 교대 포켓몬과 교체한다." + }, + "tripleAxel": { + "name": "트리플악셀", + "effect": "3회 연속으로 킥을 날려 공격한다. 기술이 맞을 때마다 위력이 올라간다." + }, + "dualWingbeat": { + "name": "더블윙", + "effect": "날개를 상대에게 부딪쳐서 공격한다. 2회 연속으로 데미지를 준다." + }, + "scorchingSands": { + "name": "열사의대지", + "effect": "뜨겁게 달궈진 모래를 상대에게 부딪쳐서 공격한다. 화상 상태로 만들 때가 있다." + }, + "jungleHealing": { + "name": "정글힐", + "effect": "정글과 하나가 되어 자신과 배틀에 나와 있는 같은 편의 HP와 모든 상태를 회복한다." + }, + "wickedBlow": { + "name": "암흑강타", + "effect": "악의 태세가 극에 달하여 강렬한 일격을 날린다. 반드시 급소에 맞는다." + }, + "surgingStrikes": { + "name": "수류연타", + "effect": "물의 태세가 극에 달하여 물 흐르듯 3회의 연격을 날린다. 반드시 급소에 맞는다." + }, + "thunderCage": { + "name": "썬더프리즌", + "effect": "전기가 흐르는 우리 안에 4-5턴 동안 상대를 가두어 공격한다." + }, + "dragonEnergy": { + "name": "드래곤에너지", + "effect": "생명력을 파워로 바꿔서 상대를 공격한다. 자신의 HP가 적을수록 기술의 위력이 떨어진다." + }, + "freezingGlare": { + "name": "얼어붙는시선", + "effect": "두 눈에서 사이코 파워를 발사해서 공격한다. 얼음 상태로 만들 때가 있다." + }, + "fieryWrath": { + "name": "타오르는분노", + "effect": "분노를 불꽃 같은 오라로 바꿔서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "thunderousKick": { + "name": "천둥차기", + "effect": "번개 같은 움직임으로 상대를 농락하며 킥을 날린다. 상대의 방어를 떨어뜨린다." + }, + "glacialLance": { + "name": "블리자드랜스", + "effect": "눈보라를 두른 얼음의 창을 상대에게 던져서 공격한다." + }, + "astralBarrage": { + "name": "아스트랄비트", + "effect": "수많은 작은 영체를 상대에게 부딪쳐서 공격한다." + }, + "eerieSpell": { + "name": "섬뜩한주문", + "effect": "강력한 사이코 파워로 공격한다. 상대가 마지막으로 사용한 기술의 PP를 3만큼 줄인다." + }, + "direClaw": { + "name": "페이탈클로", + "effect": "치명적인 손톱으로 공격한다. 상대를 독, 마비, 잠듦 중 하나의 상태로 만들 때가 있다." + }, + "psyshieldBash": { + "name": "배리어러시", + "effect": "사념의 에너지를 두른 채로 상대에게 부딪친다. 자신의 방어를 올린다." + }, + "powerShift": { + "name": "파워시프트", + "effect": "자신의 공격력과 방어력을 바꾼다." + }, + "stoneAxe": { + "name": "암석액스", + "effect": "암석 도끼로 공격한다. 흩어진 암석 파편은 상대의 주위에 떠다니게 된다." + }, + "springtideStorm": { + "name": "봄의폭풍", + "effect": "애증 섞인 강렬한 바람으로 상대를 둘러싸서 공격한다. 상대의 공격을 떨어뜨릴 때가 있다." + }, + "mysticalPower": { + "name": "신비의힘", + "effect": "신비한 힘으로 자신을 강화한다. 자신의 특수공격이 올라간다." + }, + "ragingFury": { + "name": "대격분", + "effect": "2~3턴 동안 불꽃을 마구 뿜어 대며 난동을 부린다. 난동 부린 뒤에는 혼란에 빠진다." + }, + "waveCrash": { + "name": "웨이브태클", + "effect": "물을 두르고 온몸으로 상대에게 부딪친다. 자신도 상당한 데미지를 입는다." + }, + "chloroblast": { + "name": "클로로블라스트", + "effect": "엽록소를 모은 뒤 발사하여 공격한다. 자신도 데미지를 입는다." + }, + "mountainGale": { + "name": "빙산바람", + "effect": "빙산처럼 커다란 얼음덩어리를 부딪쳐서 공격한다. 상대를 풀죽게 만들 때가 있다." + }, + "victoryDance": { + "name": "승리의춤", + "effect": "승리를 부르는 춤을 격렬하게 춘다. 자신의 공격과 방어와 스피드를 올린다." + }, + "headlongRush": { + "name": "들이받기", + "effect": "온 힘을 다한 몸통박치기를 날린다. 자신의 방어와 특수방어가 떨어진다." + }, + "barbBarrage": { + "name": "독침천밭", + "effect": "무수히 많은 독침으로 공격한다. 상대를 독 상태로 만들 때가 있다. 상대가 독 상태인 경우 위력이 2배가 된다." + }, + "esperWing": { + "name": "오라윙", + "effect": "오라로 강화한 날개로 베어 가른다. 급소에 맞기 쉽다. 자신의 스피드를 올린다." + }, + "bitterMalice": { + "name": "천추지한", + "effect": "등골이 서늘해지는 원념으로 공격해서 상대의 공격을 떨어뜨린다." + }, + "shelter": { + "name": "농성", + "effect": "피부를 강철 방패처럼 단단하게 만들어서 자신의 방어를 크게 올린다." + }, + "tripleArrows": { + "name": "3연화살", + "effect": "발 기술을 사용하고 3개의 화살을 동시에 발사한다. 상대의 방어를 떨어뜨리거나 풀죽게 만들 때가 있다. 급소에 맞기 쉽다." + }, + "infernalParade": { + "name": "백귀야행", + "effect": "무수히 많은 불덩이로 공격한다. 화상 상태로 만들 때가 있다. 상대가 상태 이상인 경우 위력이 2배가 된다." + }, + "ceaselessEdge": { + "name": "비검천중파", + "effect": "조개껍질 검으로 공격한다. 조개껍질 파편은 압정이 되어 상대의 발밑에 흩어진다." + }, + "bleakwindStorm": { + "name": "찬바람폭풍", + "effect": "심신을 모두 떨게 만드는 차갑고도 거친 바람으로 공격한다. 상대의 스피드를 떨어뜨릴 때가 있다." + }, + "wildboltStorm": { + "name": "번개폭풍", + "effect": "폭풍을 일으키고 뇌운을 불러서 번개와 바람으로 매섭게 공격한다. 상대를 마비 상태로 만들 때가 있다." + }, + "sandsearStorm": { + "name": "열사의폭풍", + "effect": "뜨겁게 달궈진 모래와 강렬한 바람으로 상대를 둘러싸서 공격한다. 상대를 화상 상태로 만들 때가 있다." + }, + "lunarBlessing": { + "name": "초승달의기도", + "effect": "초승달에 기도를 하여 자신과 같은 편의 HP와 상태 이상을 모두 회복한다." + }, + "takeHeart": { + "name": "브레이브차지", + "effect": "기운을 고조시켜서 자신의 상태 이상을 회복하고 특수공격과 특수방어를 올린다." + }, + "gMaxWildfire": { + "name": "거다이옥염", + "effect": "거다이맥스한 리자몽이 사용하는 불꽃타입 공격. 4턴 동안 데미지를 준다." + }, + "gMaxBefuddle": { + "name": "거다이고혹", + "effect": "거다이맥스한 버터플이 사용하는 벌레타입 공격. 독 마비 잠듦 중 어느 하나로 만든다." + }, + "gMaxVoltCrash": { + "name": "거다이만뢰", + "effect": "거다이맥스한 피카츄가 사용하는 전기타입 공격. 상대를 마비 상태로 만든다." + }, + "gMaxGoldRush": { + "name": "거다이금화", + "effect": "거다이맥스한 나옹이 사용하는 노말타입 공격. 상대를 혼란시키고 돈도 받을 수 있다." + }, + "gMaxChiStrike": { + "name": "거다이회심격", + "effect": "거다이맥스한 괴력몬이 사용하는 격투타입 공격. 급소에 맞기 쉬워진다." + }, + "gMaxTerror": { + "name": "거다이환영", + "effect": "거다이맥스한 팬텀이 사용하는 고스트타입 공격. 그림자를 밟아 교체할 수 없게 한다." + }, + "gMaxResonance": { + "name": "거다이선율", + "effect": "거다이맥스한 라프라스가 사용하는 얼음타입 공격. 5턴 동안 데미지를 약하게 한다." + }, + "gMaxCuddle": { + "name": "거다이포옹", + "effect": "거다이맥스한 이브이가 사용하는 노말타입 공격. 상대를 헤롱헤롱하게 만든다." + }, + "gMaxReplenish": { + "name": "거다이재생", + "effect": "거다이맥스한 잠만보가 사용하는 노말타입 공격. 먹은 나무열매를 재생한다." + }, + "gMaxMalodor": { + "name": "거다이악취", + "effect": "거다이맥스한 더스트나가 사용하는 독타입 공격. 상대를 독 상태로 만든다." + }, + "gMaxStonesurge": { + "name": "거다이암진", + "effect": "거다이맥스한 갈가부기가 사용하는 물타입 공격. 예리한 바위를 무수히 뿌린다." + }, + "gMaxWindRage": { + "name": "거다이풍격", + "effect": "거다이맥스한 아머까오가 사용하는 비행타입 공격. 리플렉터나 빛의장막을 없앤다." + }, + "gMaxStunShock": { + "name": "거다이감전", + "effect": "거다이맥스한 스트린더가 사용하는 전기타입 공격. 독이나 마비 상태로 만든다." + }, + "gMaxFinale": { + "name": "거다이단원", + "effect": "거다이맥스한 마휘핑이 사용하는 페어리타입 공격. 같은 편의 HP를 회복한다." + }, + "gMaxDepletion": { + "name": "거다이감쇠", + "effect": "거다이맥스한 두랄루돈이 사용하는 드래곤타입 공격. 마지막에 사용한 기술의 PP를 줄인다." + }, + "gMaxGravitas": { + "name": "거다이천도", + "effect": "거다이맥스한 이올브가 사용하는 에스퍼타입 공격. 5턴 동안 중력이 바뀐다." + }, + "gMaxVolcalith": { + "name": "거다이분석", + "effect": "거다이맥스한 석탄산이 사용하는 바위타입 공격. 4턴 동안 데미지를 준다." + }, + "gMaxSandblast": { + "name": "거다이사진", + "effect": "거다이맥스한 사다이사가 사용하는 땅타입 공격. 4-5턴 동안 거친 모래바람이 분다." + }, + "gMaxSnooze": { + "name": "거다이수마", + "effect": "거다이맥스한 오롱털이 사용하는 악타입 공격. 큰 하품으로 졸음을 유도한다." + }, + "gMaxTartness": { + "name": "거다이산격", + "effect": "거다이맥스한 애프룡이 사용하는 풀타입 공격. 상대의 회피율을 떨어뜨린다." + }, + "gMaxSweetness": { + "name": "거다이감로", + "effect": "거다이맥스한 단지래플이 사용하는 풀타입 공격. 같은 편의 상태 이상을 회복한다." + }, + "gMaxSmite": { + "name": "거다이천벌", + "effect": "거다이맥스한 브리무음이 사용하는 페어리타입 공격. 상대를 혼란시킨다." + }, + "gMaxSteelsurge": { + "name": "거다이강철진", + "effect": "거다이맥스한 대왕끼리동이 사용하는 강철타입 공격. 예리한 가시를 무수히 뿌린다." + }, + "gMaxMeltdown": { + "name": "거다이융격", + "effect": "거다이맥스한 멜메탈이 사용하는 강철타입 공격. 똑같은 기술을 2회 연속으로 쓸 수 없게 한다." + }, + "gMaxFoamBurst": { + "name": "거다이포말", + "effect": "거다이맥스한 킹크랩이 사용하는 물타입 공격. 상대의 스피드를 크게 떨어뜨린다." + }, + "gMaxCentiferno": { + "name": "거다이백화", + "effect": "거다이맥스한 다태우지네가 사용하는 불꽃타입 공격. 4-5턴 동안 불꽃 속에 가둔다." + }, + "gMaxVineLash": { + "name": "거다이편달", + "effect": "거다이맥스한 이상해꽃이 사용하는 풀타입 공격. 4턴 동안 데미지를 준다." + }, + "gMaxCannonade": { + "name": "거다이포격", + "effect": "거다이맥스한 거북왕이 사용하는 물타입 공격. 4턴 동안 데미지를 준다." + }, + "gMaxDrumSolo": { + "name": "거다이난타", + "effect": "거다이맥스한 고릴타가 사용하는 풀타입 공격. 상대의 특성에 영향을 받지 않는다." + }, + "gMaxFireball": { + "name": "거다이화염구", + "effect": "거다이맥스한 에이스번이 사용하는 불꽃타입 공격. 상대의 특성에 영향을 받지 않는다." + }, + "gMaxHydrosnipe": { + "name": "거다이저격", + "effect": "거다이맥스한 인텔리레온이 사용하는 물타입 공격. 상대의 특성에 영향을 받지 않는다." + }, + "gMaxOneBlow": { + "name": "거다이일격", + "effect": "거다이맥스한 우라오스가 사용하는 악타입 공격. 다이월을 무시하는 일격을 날린다." + }, + "gMaxRapidFlow": { + "name": "거다이연격", + "effect": "거다이맥스한 우라오스가 사용하는 물타입 공격. 다이월을 무시하는 연격을 날린다." + }, + "teraBlast": { + "name": "테라버스트", + "effect": "테라스탈 중이면, 테라스탈타입의 에너지를 방출해서 공격한다. 공격과 특수공격을 비교해서 높은 쪽으로 데미지를 준다." + }, + "silkTrap": { + "name": "스레드트랩", + "effect": "실로 함정을 만들어 둘러친다. 상대의 공격을 막음과 동시에 접촉한 상대의 스피드를 떨어뜨린다." + }, + "axeKick": { + "name": "발꿈치찍기", + "effect": "발꿈치를 들어 올린 뒤 내리찍어 공격한다. 상대를 혼란시킬 때가 있다. 빗나가면 자신이 데미지를 입는다." + }, + "lastRespects": { + "name": "성묘", + "effect": "동료의 한을 풀어 주기 위해 공격한다. 쓰러진 같은 편 포켓몬이 많을수록 기술의 위력이 올라간다." + }, + "luminaCrash": { + "name": "루미나콜리전", + "effect": "정신에도 작용하는 기묘한 빛을 발산해서 공격한다. 상대의 특수방어를 크게 떨어뜨린다." + }, + "orderUp": { + "name": "한판내기", + "effect": "멋들어진 몸놀림으로 공격한다. 입속에 싸리용이 있으면 싸리용의 모습에 따라 능력이 올라간다." + }, + "jetPunch": { + "name": "제트펀치", + "effect": "거센 물살을 주먹에 둘러 눈에 보이지 않는 속도로 펀치를 날린다. 반드시 선제공격할 수 있다." + }, + "spicyExtract": { + "name": "하바네로엑기스", + "effect": "어마어마하게 매운 엑기스를 발사한다. 상대의 공격이 크게 오르고 방어는 크게 떨어진다." + }, + "spinOut": { + "name": "휠스핀", + "effect": "발에 부하를 걸어 격렬하게 회전하며 데미지를 준다. 자신의 스피드가 크게 떨어진다." + }, + "populationBomb": { + "name": "찍찍베기", + "effect": "여기저기서 동료들을 모아서 화려한 콤비네이션으로 공격한다. 1~10회 연속으로 공격한다." + }, + "iceSpinner": { + "name": "아이스스피너", + "effect": "발에 얇은 얼음을 두르고 빙글빙글 회전하며 부딪친다. 회전 운동에 의해 필드가 파괴된다." + }, + "glaiveRush": { + "name": "대검돌격", + "effect": "몸을 내던지는 무모한 돌격. 기술을 사용한 다음, 상대의 공격이 반드시 명중하고 데미지를 2배로 입게 된다." + }, + "revivalBlessing": { + "name": "회생의기도", + "effect": "자애로운 마음으로 기도를 하여 기절한 교대 포켓몬을 HP가 절반인 상태로 부활시킨다." + }, + "saltCure": { + "name": "소금절이", + "effect": "상대를 소금절이 상태로 만들어 매 턴 데미지를 준다. 강철타입이나 물타입에게 더 고통스럽다." + }, + "tripleDive": { + "name": "트리플다이브", + "effect": "호흡이 척척 맞게 다이빙해서 상대에게 물보라를 끼얹는다. 3회 연속으로 데미지를 준다." + }, + "mortalSpin": { + "name": "킬러스핀", + "effect": "회전해서 상대를 공격한다. 조이기, 김밥말이, 씨뿌리기 등의 효과를 날려버린다. 상대를 독 상태로 만든다." + }, + "doodle": { + "name": "베껴그리기", + "effect": "상대의 본질을 꿰뚫어 보고 베껴서 자신과 같은 편을 상대와 같은 특성으로 바꾼다." + }, + "filletAway": { + "name": "제살깎기", + "effect": "자신의 HP를 깎아서 자신의 공격, 특수공격, 스피드를 크게 올린다." + }, + "kowtowCleave": { + "name": "도각참", + "effect": "머리를 조아려 상대를 방심하게 만든 뒤에 베어 버린다. 공격은 반드시 명중한다." + }, + "flowerTrick": { + "name": "트릭플라워", + "effect": "숨겨진 장치가 있는 꽃다발을 상대에게 던져서 공격한다. 반드시 명중하며 급소에 맞는다." + }, + "torchSong": { + "name": "플레어송", + "effect": "활활 타오르는 불꽃을 노래하듯 뿜어서 상대를 태워 버린다. 자신의 특수공격을 올린다." + }, + "aquaStep": { + "name": "아쿠아스텝", + "effect": "물 흐르듯 민첩하고 경쾌한 발재간으로 상대를 농락하며 데미지를 준다. 자신의 스피드를 올린다." + }, + "ragingBull": { + "name": "레이징불", + "effect": "분노해 날뛰는 성난소의 맹렬한 태클. 폼에 따라 기술의 타입이 달라지고 빛의장막이나 리플렉터 등도 파괴할 수 있다." + }, + "makeItRain": { + "name": "골드러시", + "effect": "대량의 코인을 날려서 공격한다. 자신의 특수공격이 떨어진다. 배틀 후에 돈을 받을 수 있다." + }, + "psyblade": { + "name": "사이코블레이드", + "effect": "실체가 없는 칼날로 상대를 베어 가른다. 일렉트릭필드 위에 있을 때 기술의 위력이 1.5배가 된다." + }, + "hydroSteam": { + "name": "하이드로스팀", + "effect": "펄펄 끓는 물을 기세 좋게 뿜어낸다. 햇살이 강할 때 기술의 위력이 떨어지기는커녕 1.5배가 된다." + }, + "ruination": { + "name": "카타스트로피", + "effect": "파멸적인 재앙에 휩쓸리게 하여 상대의 HP를 절반으로 만든다." + }, + "collisionCourse": { + "name": "액셀브레이크", + "effect": "변형하며 거칠게 낙하한 다음 고대의 대폭발을 일으킨다. 약점인 상대에게는 위력이 더욱 올라간다." + }, + "electroDrift": { + "name": "라이트닝드라이브", + "effect": "변형하며 초고속으로 달려서 미지의 전격으로 상대를 관통한다. 약점인 상대에게는 위력이 더욱 올라간다." + }, + "shedTail": { + "name": "꼬리자르기", + "effect": "자신의 HP를 깎아서 분신을 만든 뒤, 돌아와서 교대 포켓몬과 교체한다." + }, + "chillyReception": { + "name": "썰렁개그", + "effect": "자리를 얼어붙게 만드는 개그를 하고 교대 포켓몬과 교체한다. 5턴 동안 눈을 내리게 한다." + }, + "tidyUp": { + "name": "정리정돈", + "effect": "압정뿌리기, 스텔스록, 끈적끈적네트, 독압정, 대타출동을 모두 정리한다. 자신의 공격력과 스피드가 올라간다." + }, + "snowscape": { + "name": "설경", + "effect": "5턴 동안 눈을 내리게 한다. 얼음타입의 방어가 올라간다." + }, + "pounce": { + "name": "달려들기", + "effect": "상대에게 달려들어 공격한다. 상대의 스피드를 떨어뜨린다." + }, + "trailblaze": { + "name": "개척하기", + "effect": "풀숲에서 튀어나오듯이 공격한다. 경쾌한 발재간으로 자신의 스피드를 올린다." + }, + "chillingWater": { + "name": "찬물끼얹기", + "effect": "상대의 기운이 빠질 정도로 차가운 물을 끼얹어서 공격한다. 상대의 공격을 떨어뜨린다." + }, + "hyperDrill": { + "name": "하이퍼드릴", + "effect": "뾰족한 신체 부위를 급속도로 회전시켜 관통한다. 방어나 판별 등도 무시할 수 있다." + }, + "twinBeam": { + "name": "트윈빔", + "effect": "두 눈에서 불가사의한 광선을 발사해서 공격한다. 2회 연속으로 데미지를 준다." + }, + "rageFist": { + "name": "분노의주먹", + "effect": "분노를 에너지로 바꿔서 공격한다. 받은 공격의 횟수가 많을수록 기술의 위력이 올라간다." + }, + "armorCannon": { + "name": "아머캐논", + "effect": "자신의 갑옷을 활활 타오르는 탄환으로 발사해서 공격한다. 자신의 방어와 특수방어가 떨어진다." + }, + "bitterBlade": { + "name": "원념의칼", + "effect": "현세의 미련을 칼끝에 담아 베어 버린다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." + }, + "doubleShock": { + "name": "전광쌍격", + "effect": "전신의 전기를 모두 방출해서 큰 데미지를 준다. 자신의 전기타입이 없어진다." + }, + "gigatonHammer": { + "name": "거대해머", + "effect": "거대한 해머를 온몸으로 휘둘러서 공격한다. 이 기술은 2회 연속으로 쓸 수 없다." + }, + "comeuppance": { + "name": "앙갚음", + "effect": "기술을 쓰기 전에 마지막으로 받은 기술의 데미지를 늘려서 기술을 쓴 상대에게 돌려준다." + }, + "aquaCutter": { + "name": "아쿠아커터", + "effect": "압력을 가한 물을 칼날처럼 분사해서 상대를 베어 가른다. 급소에 맞기 쉽다." + }, + "blazingTorque": { + "name": "번액셀", + "effect": "타오르는 엔진으로 상대에게 부릉거린다. 화상 상태로 만들 때가 있다." + }, + "wickedTorque": { + "name": "다크액셀", + "effect": "악의적으로 상대를 향해 부릉거린다. 잠듦 상태로 만들 때가 있다." + }, + "noxiousTorque": { + "name": "포이즌액셀", + "effect": "독성 엔진으로 상대에게 부릉거린다. 독 상태로 만들 때가 있다." + }, + "combatTorque": { + "name": "파이트액셀", + "effect": "상대를 향해 기세 좋게 부릉거린다. 마비 상태로 만들 때가 있다." + }, + "magicalTorque": { + "name": "매지컬액셀", + "effect": "메르헨틱한 엔진으로 상대에게 부릉거린다. 상대를 혼란시킬 때가 있다." + }, + "bloodMoon": { + "name": "블러드문", + "effect": "피와 같이 붉은 보름달에서 혼신의 기백을 발사한다. 이 기술은 2회 연속으로 쓸 수 없다." + }, + "matchaGotcha": { + "name": "휘적휘적포", + "effect": "휘저은 차를 대포처럼 발사해 준 데미지의 절반을 HP로 회복한다. 화상 상태로 만들 때도 있다." + }, + "syrupBomb": { + "name": "시럽봄", + "effect": "끈적끈적한 물엿을 폭발시킨다. 상대를 물엿범벅 상태로 만들어서 3턴 동안 계속 스피드를 떨어뜨린다." + }, + "ivyCudgel": { + "name": "덩굴방망이", + "effect": "덩굴을 휘감은 방망이로 때린다. 쓰고 있는 가면에 따라 타입이 바뀐다. 급소에 맞기 쉽다." + }, + "electroShot": { + "name": "일렉트로빔", + "effect": "1턴째에 전기를 모아서 특수공격을 올리고 2턴째에 고압의 전기를 발사한다. 비가 오는 날씨일 때는 바로 발사할 수 있다." + }, + "teraStarstorm": { + "name": "테라클러스터", + "effect": "결정의 힘을 내리쬐어 적을 없애 버린다. 테라파고스가 스텔라폼일 때 사용하면 모든 상대에게 데미지를 준다." + }, + "fickleBeam": { + "name": "변덕레이저", + "effect": "광선을 발사해서 공격한다. 가끔 다른 머리도 협력해서 레이저를 발사하여 위력이 2배가 된다." + }, + "burningBulwark": { + "name": "화염의수호", + "effect": "상대의 공격을 초고열의 털로 방어하는 동시에 접촉한 상대를 화상 상태로 만든다." + }, + "thunderclap": { + "name": "질풍신뢰", + "effect": "상대보다 먼저 전격을 퍼붓는다. 상대가 쓴 기술이 공격 기술이 아니면 실패한다." + }, + "mightyCleave": { + "name": "파워풀에지", + "effect": "머리에 축적된 빛으로 절단한다. 기술 방어를 무시하고 공격할 수 있다." + }, + "tachyonCutter": { + "name": "타키온커터", + "effect": "입자로 된 칼날을 연이어 발사해서 2회 연속으로 데미지를 준다. 공격은 반드시 명중한다." + }, + "hardPress": { + "name": "하드프레스", + "effect": "팔이나 집게로 상대를 압박한다. 상대의 HP가 남아 있을수록 위력이 올라간다." + }, + "dragonCheer": { + "name": "드래곤옐", + "effect": "용의 북돋움으로 사기를 높여서 같은 편의 기술이 급소에 맞기 쉬워진다. 드래곤타입이면 더욱더 사기가 북돋는다." + }, + "alluringVoice": { + "name": "매혹의보이스", + "effect": "천사와도 같은 노랫소리로 상대를 공격한다. 그 턴에 능력이 올라간 포켓몬을 혼란 상태로 만든다." + }, + "temperFlare": { + "name": "열불내기", + "effect": "자포자기하는 기세로 공격한다. 앞 턴에서 기술이 빗나갔다면 위력이 배가 된다." + }, + "supercellSlam": { + "name": "썬더다이브", + "effect": "몸에 전기를 두르고 상대를 덮친다. 빗나가면 자신이 데미지를 입는다." + }, + "psychicNoise": { + "name": "사이코노이즈", + "effect": "불쾌한 음파를 상대에게 날려서 공격한다. 2턴 동안 상대는 기술이나 특성 또는 지니고 있는 도구로 HP를 회복할 수 없게 된다." + }, + "upperHand": { + "name": "기선제압", + "effect": "움직임에 반응하여 손바닥으로 밀쳐서 상대를 풀죽게 한다. 상대가 쓴 기술이 선제공격 기술이 아니면 실패한다." + }, + "malignantChain": { + "name": "악독사슬", + "effect": "독으로 된 사슬로 상대를 휘감은 뒤 독소를 흘려보내어 해치운다. 맹독 상태로 만들 때가 있다." + } +} diff --git a/src/locales/ko/move.ts b/src/locales/ko/move.ts deleted file mode 100644 index 3781725bc6f..00000000000 --- a/src/locales/ko/move.ts +++ /dev/null @@ -1,3839 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -/** - * 본가 게임과 텍스트가 다르거나 번역문을 완전히 확인하지 못한 경우 주석으로 표시 - */ -export const move: MoveTranslationEntries = { - pound: { - name: "막치기", - effect: "긴 꼬리나 손 등을 사용하여 상대를 때려서 공격한다." - }, - karateChop: { - name: "태권당수", - effect: "날카로운 당수로 상대를 때려서 공격한다. 급소에 맞기 쉽다." - }, - doubleSlap: { - name: "연속뺨치기", - effect: "연속 뺨치기로 상대를 때려서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - cometPunch: { - name: "연속펀치", - effect: "노도 같은 펀치로 상대를 세게 때려서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - megaPunch: { - name: "메가톤펀치", - effect: "힘을 담은 펀치로 상대를 공격한다." - }, - payDay: { - name: "고양이돈받기", - effect: "상대의 몸에 돈을 세게 던져서 공격한다. 배틀 후에 돈을 받을 수 있다." - }, - firePunch: { - name: "불꽃펀치", - effect: "불꽃을 담은 펀치로 상대를 공격한다. 화상 상태로 만들 때가 있다." - }, - icePunch: { - name: "냉동펀치", - effect: "냉기를 담은 펀치로 상대를 공격한다. 얼음 상태로 만들 때가 있다." - }, - thunderPunch: { - name: "번개펀치", - effect: "전격을 담은 펀치로 상대를 공격한다. 마비 상태로 만들 때가 있다." - }, - scratch: { - name: "할퀴기", - effect: "단단하고 뾰족한 날카로운 손톱으로 상대를 할퀴어서 공격한다." - }, - viseGrip: { - name: "찝기", - effect: "상대를 양쪽에서 집어서 데미지를 준다." - }, - guillotine: { - name: "가위자르기", - effect: "큰 집게로 상대를 베어 갈라 공격한다. 맞으면 일격에 기절한다." - }, - razorWind: { - name: "칼바람", - effect: "바람의 칼날을 만들어 2턴째에 상대를 공격한다. 급소에 맞기 쉽다." - }, - swordsDance: { - name: "칼춤", - effect: "싸움의 춤을 격렬하게 춰서 기세를 높인다. 자신의 공격을 크게 올린다." - }, - cut: { - name: "풀베기", - effect: "낫이나 발톱 등으로 상대를 베어 공격한다." - }, - gust: { - name: "바람일으키기", - effect: "날개로 일으킨 격한 바람을 상대에게 부딪쳐서 공격한다." - }, - wingAttack: { - name: "날개치기", - effect: "크게 펼친 훌륭한 날개를 상대에게 부딪쳐서 공격한다." - }, - whirlwind: { - name: "날려버리기", - effect: "상대를 날려버려서 교대할 포켓몬을 끌어낸다. 야생의 경우에는 배틀이 끝난다." - }, - fly: { - name: "공중날기", - effect: "1턴째에 하늘을 날아 2턴째에 상대를 공격한다." - }, - bind: { - name: "조이기", - effect: "긴 몸이나 덩굴 등을 써서 4-5턴 동안 상대를 조여 공격한다." - }, - slam: { - name: "힘껏치기", - effect: "긴 꼬리나 덩굴 등을 사용해 상대를 힘껏 쳐서 공격한다." - }, - vineWhip: { - name: "덩굴채찍", - effect: "채찍처럼 휘어지는 가늘고 긴 덩굴로 상대를 힘껏 쳐서 공격한다." - }, - stomp: { - name: "짓밟기", - effect: "큰 발로 상대를 짓밟아서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - doubleKick: { - name: "두번차기", - effect: "2개의 다리로 상대를 걷어차서 공격한다. 2회 연속으로 데미지를 준다." - }, - megaKick: { - name: "메가톤킥", - effect: "굉장한 힘을 담은 킥으로 상대를 걷어차서 공격한다." - }, - jumpKick: { - name: "점프킥", - effect: "높이 점프해서 킥으로 상대를 공격한다. 빗나가면 자신이 데미지를 입는다." - }, - rollingKick: { - name: "돌려차기", - effect: "몸을 재빨리 회전시키며 걷어차서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - sandAttack: { - name: "모래뿌리기", - effect: "상대의 얼굴에 모래를 뿌려서 명중률을 떨어뜨린다." - }, - headbutt: { - name: "박치기", - effect: "머리를 내밀어 곧장 돌진하여 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - hornAttack: { - name: "뿔찌르기", - effect: "날카롭고 뾰족한 뿔로 상대를 공격한다." - }, - furyAttack: { - name: "마구찌르기", - effect: "뿔이나 부리로 상대를 찔러서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - hornDrill: { - name: "뿔드릴", - effect: "회전하는 뿔을 상대에게 꿰찔러서 공격한다. 맞으면 일격에 기절한다." - }, - tackle: { - name: "몸통박치기", - effect: "상대를 향해서 몸 전체를 부딪쳐가며 공격한다." - }, - bodySlam: { - name: "누르기", - effect: "몸 전체로 상대를 덮쳐눌러 공격한다. 마비 상태로 만들 때가 있다." - }, - wrap: { - name: "김밥말이", - effect: "긴 몸이나 덩굴 등을 사용해 4-5턴 동안 상대를 휘감아 공격한다." - }, - takeDown: { - name: "돌진", - effect: "굉장한 기세로 상대에게 부딪쳐 공격한다. 자신도 조금 데미지를 입는다." - }, - thrash: { - name: "난동부리기", - effect: "2-3턴 동안 마구 난동 부려서 공격한다. 난동 부린 뒤에는 혼란에 빠진다." - }, - doubleEdge: { - name: "이판사판태클", - effect: "목숨을 걸고 상대에게 돌진하여 공격을 한다. 자신도 상당한 데미지를 입는다." - }, - tailWhip: { - name: "꼬리흔들기", - effect: "꼬리를 좌우로 귀엽게 흔들어 방심을 유도한다. 상대의 방어를 떨어뜨린다." - }, - poisonSting: { - name: "독침", - effect: "독이 있는 침을 상대에게 꿰찔러서 공격한다. 독 상태로 만들 때가 있다." - }, - twineedle: { - name: "더블니들", - effect: "2개의 침을 상대에게 꿰찔러 2회 연속으로 데미지를 준다. 독 상태로 만들 때가 있다." - }, - pinMissile: { - name: "바늘미사일", - effect: "날카로운 침을 상대에게 발사해서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - leer: { - name: "째려보기", - effect: "날카로운 눈초리로 겁을 주어 상대의 방어를 떨어뜨린다." - }, - bite: { - name: "물기", - effect: "날카롭고 뾰족한 이빨로 물어서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - growl: { - name: "울음소리", - effect: "귀여운 울음소리를 들려주고 관심을 끌어 방심한 사이에 상대의 공격을 떨어뜨린다." - }, - roar: { - name: "울부짖기", - effect: "상대를 도망가게 해서 교대할 포켓몬을 끌어낸다. 야생의 경우에는 배틀이 끝난다." - }, - sing: { - name: "노래하기", - effect: "기분 좋은 예쁜 노랫소리를 들려주고 상대를 잠듦 상태로 만든다." - }, - supersonic: { - name: "초음파", - effect: "특수한 음파를 몸에서 발산하여 상대를 혼란시킨다." - }, - sonicBoom: { - name: "소닉붐", - effect: "충격파를 상대에 부딪쳐서 공격한다. 언제나 20의 데미지를 준다." - }, - disable: { - name: "사슬묶기", - effect: "상대의 움직임을 막아 바로 전에 쓴 기술을 4턴 동안 사용할 수 없게 만든다." - }, - acid: { - name: "용해액", - effect: "강한 산을 상대에게 끼얹어 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - ember: { - name: "불꽃세례", - effect: "작은 불꽃을 상대에게 발사하여 공격한다. 화상 상태로 만들 때가 있다." - }, - flamethrower: { - name: "화염방사", - effect: "세찬 불꽃을 상대에게 발사하여 공격한다. 화상 상태로 만들 때가 있다." - }, - mist: { - name: "흰안개", - effect: "하얀 안개로 몸을 덮는다. 5턴 동안 상대에 의해 능력이 떨어지지 않게 된다." - }, - waterGun: { - name: "물대포", - effect: "물을 기세 좋게 상대에게 발사하여 공격한다." - }, - hydroPump: { - name: "하이드로펌프", - effect: "대량의 물을 세찬 기세로 상대에게 발사하여 공격한다." - }, - surf: { - name: "파도타기", - effect: "큰 파도로 자신의 주위에 있는 포켓몬을 공격한다." - }, - iceBeam: { - name: "냉동빔", - effect: "냉동빔을 상대에게 발사하여 공격한다. 얼음 상태로 만들 때가 있다." - }, - blizzard: { - name: "눈보라", - effect: "세찬 눈보라를 상대에게 내뿜어 공격한다. 얼음 상태로 만들 때가 있다." - }, - psybeam: { - name: "환상빔", - effect: "이상한 광선을 상대에게 발사하여 공격한다. 혼란시킬 때가 있다." - }, - bubbleBeam: { - name: "거품광선", - effect: "거품을 기세 좋게 상대에게 발사하여 공격한다. 스피드를 떨어뜨릴 때가 있다." - }, - auroraBeam: { - name: "오로라빔", - effect: "무지개색의 빔을 상대에게 발사하여 공격한다. 공격을 떨어뜨릴 때가 있다." - }, - hyperBeam: { - name: "파괴광선", - effect: "강한 광선을 상대에게 발사하여 공격한다. 다음 턴은 움직일 수 없다." - }, - peck: { - name: "쪼기", - effect: "날카롭고 뾰족한 부리나 뿔로 상대를 쪼아서 공격한다." - }, - drillPeck: { - name: "회전부리", - effect: "회전하면서 뾰족한 부리를 상대에게 꿰찔러 공격한다." - }, - submission: { - name: "지옥의바퀴", - effect: "땅에 자신과 함께 상대를 내던져 공격한다. 자신도 조금 데미지를 입는다." - }, - lowKick: { - name: "안다리걸기", - effect: "발을 강하게 걸고 상대를 넘어뜨려 공격한다. 상대가 무거울수록 위력이 올라간다." - }, - counter: { - name: "카운터", - effect: "상대로부터 받은 물리공격의 데미지를 2배로 만들어 같은 상대에게 돌려준다." - }, - seismicToss: { - name: "지구던지기", - effect: "인력을 사용해 내던진다. 자신의 레벨과 똑같은 데미지를 상대에게 준다." - }, - strength: { - name: "괴력", - effect: "혼신의 힘으로 상대를 세게 때려서 공격한다." - }, - absorb: { - name: "흡수", - effect: "양분을 흡수하여 공격한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." - }, - megaDrain: { - name: "메가드레인", - effect: "양분을 흡수하여 공격한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." - }, - leechSeed: { - name: "씨뿌리기", - effect: "씨가 뿌려진 상대의 HP를 매 턴 조금씩 흡수하여 자신의 HP를 회복한다." - }, - growth: { - name: "성장", - effect: "몸을 일시에 크게 성장시켜 공격과 특수공격을 올린다." - }, - razorLeaf: { - name: "잎날가르기", - effect: "잎사귀를 날려 상대를 베어 공격한다. 급소에 맞기 쉽다." - }, - solarBeam: { - name: "솔라빔", - effect: "1턴째에 빛을 가득 모아 2턴째에 빛의 다발을 발사하여 공격한다." - }, - poisonPowder: { - name: "독가루", - effect: "독이 있는 가루를 많이 흩뿌려서 상대를 독 상태로 만든다." - }, - stunSpore: { - name: "저리가루", - effect: "저리가루를 많이 흩뿌려서 상대를 마비 상태로 만든다." - }, - sleepPowder: { - name: "수면가루", - effect: "잠이 오는 가루를 많이 흩뿌려서 상대를 잠듦 상태로 만든다." - }, - petalDance: { - name: "꽃잎댄스", - effect: "2-3턴 동안 꽃을 흩뿌려서 상대를 공격한다. 흩뿌린 뒤에는 혼란에 빠진다." - }, - stringShot: { - name: "실뿜기", - effect: "입에서 뿜어낸 실을 휘감아서 상대의 스피드를 크게 떨어뜨린다." - }, - dragonRage: { - name: "용의분노", - effect: "분노의 충격파를 상대에게 부딪쳐서 공격한다. 언제나 40의 데미지를 준다." - }, - fireSpin: { - name: "회오리불꽃", - effect: "세차게 소용돌이치는 불꽃 속에 4-5턴 동안 상대를 가두어 공격한다." - }, - thunderShock: { - name: "전기쇼크", - effect: "전기 자극을 상대에게 날려서 공격한다. 마비 상태로 만들 때가 있다." - }, - thunderbolt: { - name: "10만볼트", - effect: "강한 전격을 상대에게 날려서 공격한다. 마비 상태로 만들 때가 있다." - }, - thunderWave: { - name: "전기자석파", - effect: "약한 전격을 날려서 상대를 마비 상태로 만든다." - }, - thunder: { - name: "번개", - effect: "강한 번개를 상대에게 떨어뜨려 공격한다. 마비 상태로 만들 때가 있다." - }, - rockThrow: { - name: "돌떨구기", - effect: "작은 바위를 들어올려 상대에게 내던져서 공격한다." - }, - earthquake: { - name: "지진", - effect: "지진의 충격으로 자신의 주위에 있는 포켓몬을 공격한다." - }, - fissure: { - name: "땅가르기", - effect: "땅이 갈라진 곳에 상대를 떨어뜨려 공격한다. 맞으면 일격에 기절한다." - }, - dig: { - name: "구멍파기", - effect: "1턴째에 파고들어 2턴째에 상대를 공격한다." - }, - toxic: { - name: "맹독", - effect: "상대를 맹독의 상태로 만든다. 턴이 진행될수록 독의 데미지가 증가한다." - }, - confusion: { - name: "염동력", - effect: "약한 염동력을 상대에게 보내어 공격한다. 상대를 혼란시킬 때가 있다." - }, - psychic: { - name: "사이코키네시스", - effect: "강한 염동력을 상대에게 보내어 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - hypnosis: { - name: "최면술", - effect: "졸음을 유도하는 암시를 걸어서 상대를 잠듦 상태로 만든다." - }, - meditate: { - name: "요가포즈", - effect: "잠들어 있는 힘을 몸속에서 끌어내어 자신의 공격을 올린다." - }, - agility: { - name: "고속이동", - effect: "힘을 빼고 몸을 가볍게 해서 고속으로 움직인다. 자신의 스피드를 크게 올린다." - }, - quickAttack: { - name: "전광석화", - effect: "눈에 보이지 않는 굉장한 속도로 상대에게 돌진한다. 반드시 선제공격할 수 있다." - }, - rage: { - name: "분노", - effect: "기술을 썼을 때 공격을 받으면 분노의 힘으로 공격이 올라간다." - }, - teleport: { - name: "순간이동", - effect: "교대할 포켓몬이 있을 때 사용하면 교체한다. 야생 포켓몬은 도망가 버린다." - }, - nightShade: { - name: "나이트헤드", - effect: "무시무시한 환상을 보게 해서 자신의 레벨과 똑같은 만큼의 데미지를 상대에게 준다." - }, - mimic: { - name: "흉내내기", - effect: "상대가 마지막에 사용한 기술을 배틀을 하는 동안 자신의 기술로 만들 수 있다." - }, - screech: { - name: "싫은소리", - effect: "그만 귀를 막아버리고 싶은 싫은 소리를 내어 상대의 방어를 크게 떨어뜨린다." - }, - doubleTeam: { - name: "그림자분신", - effect: "재빠른 움직임으로 분신을 만들어 상대를 혼란시켜 회피율을 올린다." - }, - recover: { - name: "HP회복", - effect: "세포를 재생시켜 자신의 최대 HP의 절반만큼 HP를 회복한다." - }, - harden: { - name: "단단해지기", - effect: "전신에 힘을 담아 몸을 단단하게 해서 자신의 방어를 올린다." - }, - minimize: { - name: "작아지기", - effect: "몸을 축소하여 작게 보임으로써 자신의 회피율을 크게 올린다." - }, - smokescreen: { - name: "연막", - effect: "연기나 먹물을 내뿜어 상대의 명중률을 떨어뜨린다." - }, - confuseRay: { - name: "이상한빛", - effect: "이상한 빛을 상대에게 비춰 당황하게 한다. 상대를 혼란시킨다." - }, - withdraw: { - name: "껍질에숨기", - effect: "껍질에 숨어 몸을 보호하여 자신의 방어를 올린다." - }, - defenseCurl: { - name: "웅크리기", - effect: "몸을 둥글게 웅크려서 자신의 방어를 올린다." - }, - barrier: { - name: "배리어", - effect: "튼튼한 장막을 만들어 자신의 방어를 크게 올린다." - }, - lightScreen: { - name: "빛의장막", - effect: "5턴 동안 이상한 장막을 쳐서 상대로부터 받는 특수공격의 데미지를 약하게 한다." - }, - haze: { - name: "흑안개", - effect: "흑안개를 뿜어 배틀에 참가 중인 포켓몬 전원의 능력 변화를 원래대로 돌린다." - }, - reflect: { - name: "리플렉터", - effect: "5턴 동안 이상한 장막을 쳐서 상대로부터 받는 물리공격의 데미지를 약하게 한다." - }, - focusEnergy: { - name: "기충전", - effect: "깊게 숨을 들이마셔 기합을 넣는다. 자신의 공격이 급소에 맞기 쉬워진다." - }, - bide: { - name: "참기", - effect: "2턴 동안 공격을 견뎌 입은 데미지를 2배로 만들어 상대에게 돌려준다." - }, - metronome: { - name: "손가락흔들기", - effect: "손가락을 흔들어 자신의 뇌를 자극해서 모든 기술 중 어느 하나를 날린다." - }, - mirrorMove: { - name: "따라하기", - effect: "상대가 사용한 기술을 흉내 내어 자신도 똑같은 기술을 쓴다." - }, - selfDestruct: { - name: "자폭", - effect: "폭발을 일으켜서 자신의 주위에 있는 포켓몬을 공격한다. 쓰고 나서 기절하게 된다." - }, - eggBomb: { - name: "알폭탄", - effect: "큰 알을 온 힘을 다해 상대에게 내던져서 공격한다." - }, - lick: { - name: "핥기", - effect: "긴 혀로 상대를 핥아서 공격한다. 마비 상태로 만들 때가 있다." - }, - smog: { - name: "스모그", - effect: "더러운 가스를 상대에게 내뿜어 공격한다. 독 상태로 만들 때가 있다." - }, - sludge: { - name: "오물공격", - effect: "더러운 오물을 상대에게 내던져서 공격한다. 독 상태로 만들 때가 있다." - }, - boneClub: { - name: "뼈다귀치기", - effect: "손에 들고 있는 뼈로 상대를 세게 때려서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - fireBlast: { - name: "불대문자", - effect: "큰 대자의 불꽃으로 상대를 불태운다. 화상 상태로 만들 때가 있다." - }, - waterfall: { - name: "폭포오르기", - effect: "굉장한 기세로 상대에게 돌진한다. 상대를 풀죽게 만들 때가 있다." - }, - clamp: { - name: "껍질끼우기", - effect: "매우 튼튼하고 두꺼운 껍질에 4-5턴 동안 상대를 끼워서 공격한다." - }, - swift: { - name: "스피드스타", - effect: "별 모양의 빛을 발사해서 상대를 공격한다. 공격은 반드시 명중한다." - }, - skullBash: { - name: "로켓박치기", - effect: "1턴째에 머리를 움츠려 방어를 올린다. 2턴째에 상대를 공격한다." - }, - spikeCannon: { - name: "가시대포", - effect: "날카로운 침을 상대에게 발사해서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - constrict: { - name: "휘감기", - effect: "촉수나 덩굴 등을 휘감아서 공격한다. 상대의 스피드를 떨어뜨릴 때가 있다." - }, - amnesia: { - name: "망각술", - effect: "머리를 비워서 순간적으로 무언가를 잊어버림으로써 자신의 특수방어를 크게 올린다." - }, - kinesis: { - name: "숟가락휘기", - effect: "숟가락을 휘어서 주의를 끌어 상대의 명중률을 낮춘다." - }, - softBoiled: { - name: "알낳기", - effect: "자신의 최대 HP 절반을 회복한다." - }, - highJumpKick: { - name: "무릎차기", - effect: "점프해서 무릎차기로 상대를 공격한다. 빗나가면 자신이 데미지를 입는다." - }, - glare: { - name: "뱀눈초리", - effect: "배의 무늬로 겁을 주어 상대를 마비 상태로 만든다." - }, - dreamEater: { - name: "꿈먹기", - effect: "잠자고 있는 상대의 꿈을 먹어 공격한다. 데미지의 절반을 HP로 회복한다." - }, - poisonGas: { - name: "독가스", - effect: "독가스를 상대의 얼굴에 내뿜어 독 상태로 만든다." - }, - barrage: { - name: "구슬던지기", - effect: "둥근 것을 상대에게 내던져서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - leechLife: { - name: "흡혈", - effect: "피를 빨아서 상대를 공격한다. 준 데미지의 절반을 HP로 회복한다." - }, - lovelyKiss: { - name: "악마의키스", - effect: "무서운 얼굴로 키스한다. 상대를 잠듦 상태로 만든다." - }, - skyAttack: { - name: "불새", - effect: "2턴째에 상대를 공격한다. 가끔 풀죽게 만든다. 급소에도 맞기 쉽다." - }, - transform: { - name: "변신", - effect: "상대 포켓몬으로 변신하여 상대와 완전히 똑같은 기술을 사용할 수 있다." - }, - bubble: { - name: "거품", - effect: "매우 많은 거품을 상대에게 내뿜어 공격한다. 상대의 스피드를 떨어뜨릴 때가 있다." - }, - dizzyPunch: { - name: "잼잼펀치", - effect: "리드미컬한 펀치를 날려 상대를 공격한다. 혼란시킬 때가 있다." - }, - spore: { - name: "버섯포자", - effect: "최면 효과가 있는 포자를 훌훌 흩뿌려서 상대를 잠듦 상태로 만든다." - }, - flash: { - name: "플래시", - effect: "눈이 부신 빛으로 상대의 명중률을 떨어뜨린다." - }, - psywave: { - name: "사이코웨이브", - effect: "이상한 염력파를 상대에게 발사하여 공격한다. 사용할 때마다 데미지가 바뀐다." - }, - splash: { - name: "튀어오르기", - effect: "공격도 하지 않고 팔딱팔딱 튈 뿐 아무 일도 일어나지 않는다..." - }, - acidArmor: { - name: "녹기", - effect: "세포의 변화로 액체가 되어 자신의 방어를 크게 올린다." - }, - crabhammer: { - name: "집게해머", - effect: "큰 집게를 상대에게 내리쳐서 공격한다. 급소에 맞기 쉽다." - }, - explosion: { - name: "대폭발", - effect: "큰 폭발로 자신의 주위에 있는 포켓몬을 공격한다. 쓰고 나서는 기절한다." - }, - furySwipes: { - name: "마구할퀴기", - effect: "손톱이나 낫 등으로 상대를 할퀴어서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - bonemerang: { - name: "뼈다귀부메랑", - effect: "손에 들고 있는 뼈를 상대에게 날려서 날아갈 때와 돌아올 때 2회 연속 데미지를 준다." - }, - rest: { - name: "잠자기", - effect: "2턴 동안 계속 잠잔다. 자신의 HP와 상태 이상을 모두 회복한다." - }, - rockSlide: { - name: "스톤샤워", - effect: "큰 바위를 세차게 부딪쳐서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - hyperFang: { - name: "필살앞니", - effect: "날카로운 앞니로 강하게 물어서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - sharpen: { - name: "각지기", - effect: "몸의 각을 늘려서 더욱 각지게 하여 자신의 공격을 올린다." - }, - conversion: { - name: "텍스처", - effect: "자신의 타입을 배운 기술 중 가장 위에 있는 기술과 같은 타입으로 바꾼다." - }, - triAttack: { - name: "트라이어택", - effect: "3개의 광선으로 공격한다. 마비, 화상 또는 얼음 상태 중 어느 하나로 만들 때가 있다." - }, - superFang: { - name: "분노의앞니", - effect: "날카로운 앞니로 강하게 물어서 공격한다. 상대의 HP는 절반이 된다." - }, - slash: { - name: "베어가르기", - effect: "발톱이나 낫 등으로 상대를 베어 갈라서 공격한다. 급소에 맞기 쉽다." - }, - substitute: { - name: "대타출동", - effect: "자신의 HP를 조금 깎아서 분신을 만든다. 분신은 자신의 대타가 된다." - }, - struggle: { - name: "발버둥", - effect: "자신의 PP가 떨어지면 발버둥 쳐 상대를 공격한다. 자신도 조금 데미지를 입는다." - }, - sketch: { - name: "스케치", - effect: "상대가 쓴 기술을 자신의 것으로 만든다. 한 번 사용하면 스케치는 사라진다." - }, - tripleKick: { - name: "트리플킥", - effect: "3회 연속으로 킥을 날려 공격한다. 기술이 맞을 때마다 위력이 올라간다." - }, - thief: { - name: "도둑질", - /* 지닌 도구 대신 확률 제한 */ - effect: "공격과 동시에 30%의 확률로 도구를 훔친다." - }, - spiderWeb: { - name: "거미집", - effect: "끈적끈적하고 가는 실을 칭칭 휘감아 상대를 배틀에서 도망칠 수 없게 한다." - }, - mindReader: { - name: "마음의눈", - effect: "상대의 움직임을 마음으로 읽고 다음 공격이 반드시 상대에게 명중되게 한다." - }, - nightmare: { - name: "악몽", - effect: "잠듦 상태의 상대에게 악몽을 꾸게 하여 매 턴 조금씩 HP를 떨어뜨려 간다." - }, - flameWheel: { - name: "화염바퀴", - effect: "불꽃을 둘러 상대에게 돌진하여 공격한다. 화상 상태로 만들 때가 있다." - }, - snore: { - name: "코골기", - effect: "자신이 잠들어 있을 때 소음을 내어 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - curse: { - name: "저주", - effect: "기술을 쓰는 포켓몬이 고스트타입일 때와 그 이외의 타입일 때는 효과가 다르다." - }, - flail: { - name: "바둥바둥", - effect: "바둥바둥 난동 부려서 공격한다. 자신의 HP가 적을수록 기술의 위력이 올라간다." - }, - conversion2: { - name: "텍스처2", - effect: "상대가 마지막으로 쓴 기술에 저항할 수 있도록 자신의 타입을 변화시킨다." - }, - aeroblast: { - name: "에어로블라스트", - effect: "공기의 소용돌이를 발사하여 공격한다. 급소에 맞기 쉽다." - }, - cottonSpore: { - name: "목화포자", - effect: "솜처럼 폭신폭신한 포자를 착 달라붙게 해서 상대의 스피드를 크게 떨어뜨린다." - }, - reversal: { - name: "기사회생", - effect: "힘을 쥐어짜서 공격한다. 자신의 HP가 적을수록 기술의 위력이 올라간다." - }, - spite: { - name: "원한", - effect: "상대가 마지막으로 사용한 기술에 원한을 품어 그 기술의 PP를 4만큼 줄인다." - }, - powderSnow: { - name: "눈싸라기", - effect: "차가운 가랑눈을 상대에게 내뿜어 공격한다. 얼음 상태로 만들 때가 있다." - }, - protect: { - name: "방어", - effect: "상대의 공격을 전혀 받지 않는다. 연속으로 쓰면 실패하기 쉽다." - }, - machPunch: { - name: "마하펀치", - effect: "눈에 보이지 않는 굉장한 속도로 펀치를 날린다. 반드시 선제공격을 할 수 있다." - }, - scaryFace: { - name: "겁나는얼굴", - effect: "무서운 얼굴로 노려보고 겁주어 상대의 스피드를 크게 떨어뜨린다." - }, - feintAttack: { - name: "속여때리기", - effect: "슬금슬금 상대에게 다가가 방심한 틈을 타서 세게 때린다. 공격은 반드시 명중한다." - }, - sweetKiss: { - name: "천사의키스", - effect: "천사처럼 귀엽게 키스하여 상대를 혼란시킨다." - }, - bellyDrum: { - name: "배북", - effect: "자신의 HP를 최대 HP의 절반만큼 감소시켜 자신의 공격을 최대로 올린다." - }, - sludgeBomb: { - name: "오물폭탄", - effect: "더러운 오물을 상대에게 내던져서 공격한다. 독 상태로 만들 때가 있다." - }, - mudSlap: { - name: "진흙뿌리기", - effect: "상대의 얼굴 등에 진흙을 내던져서 공격한다. 명중률을 떨어뜨린다." - }, - octazooka: { - name: "대포무노포", - effect: "상대의 얼굴 등에 먹물을 내뿜어 공격한다. 명중률을 떨어뜨릴 때가 있다." - }, - spikes: { - name: "압정뿌리기", - effect: "상대의 발밑에 압정을 뿌린다. 교체된 상대 포켓몬에게 데미지를 준다." - }, - zapCannon: { - name: "전자포", - effect: "대포처럼 전기를 발사해서 공격한다. 상대를 마비 상태로 만든다." - }, - foresight: { - name: "꿰뚫어보기", - effect: "고스트타입에 효과가 없는 기술이나 회피율이 높은 상대라 할지라도 공격이 맞게 된다." - }, - destinyBond: { - name: "길동무", - effect: "기술을 쓴 뒤 상대의 공격으로 기절했을 때 공격 상대도 기절하게 한다. 연속으로 쓰면 실패한다." - }, - perishSong: { - name: "멸망의노래", - effect: "노래를 들은 포켓몬은 3턴이 지나면 기절한다. 교체되면 효과가 없어진다." - }, - icyWind: { - name: "얼어붙은바람", - effect: "차가운 냉기를 상대에게 내뿜어 공격한다. 상대의 스피드를 떨어뜨린다." - }, - detect: { - name: "판별", - effect: "상대의 공격을 전혀 받지 않는다. 연속으로 쓰면 실패하기 쉽다." - }, - boneRush: { - name: "본러시", - effect: "단단한 뼈로 상대를 세게 때려서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - lockOn: { - name: "록온", - effect: "조준을 잘 맞춰 다음 공격이 반드시 상대에게 명중하도록 한다." - }, - outrage: { - name: "역린", - effect: "2-3턴 동안 마구 난동 부려서 공격한다. 난동 부린 뒤에는 혼란에 빠진다." - }, - sandstorm: { - name: "모래바람", - effect: "5턴 동안 모래바람을 일으켜 바위 땅, 강철타입 이외의 상대에게 데미지를 준다. 바위타입의 특수방어가 올라간다." - }, - gigaDrain: { - name: "기가드레인", - effect: "양분을 흡수하여 공격한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." - }, - endure: { - name: "버티기", - effect: "공격을 받아도 HP를 반드시 1만큼은 남긴다. 연속으로 쓰면 실패하기 쉽다." - }, - charm: { - name: "애교부리기", - effect: "귀엽게 바라보고 방심을 유도하여 상대의 공격을 크게 떨어뜨린다." - }, - rollout: { - name: "구르기", - effect: "5턴 동안 구르기를 반복하여 공격한다. 기술이 맞을 때마다 위력이 올라간다." - }, - falseSwipe: { - name: "칼등치기", - effect: "상대의 HP가 반드시 1만 남도록 조절하여 공격한다." - }, - swagger: { - name: "뽐내기", - effect: "상대를 화내게 해서 혼란시킨다. 분노로 상대의 공격은 크게 올라가 버린다." - }, - milkDrink: { - name: "우유마시기", - effect: "자신의 최대 HP 절반을 회복한다." - }, - spark: { - name: "스파크", - effect: "전기를 둘러 상대에게 돌진하여 공격한다. 마비 상태로 만들 때가 있다." - }, - furyCutter: { - name: "연속자르기", - effect: "낫이나 발톱 등으로 상대를 베어 공격한다. 연속으로 맞히면 위력이 올라간다." - }, - steelWing: { - name: "강철날개", - effect: "단단한 날개를 상대에게 부딪쳐서 공격한다. 자신의 방어가 올라갈 때가 있다." - }, - meanLook: { - name: "검은눈빛", - effect: "빨려 들어갈 것 같은 까만 눈빛으로 가만히 응시하여 상대를 배틀에서 도망갈 수 없게 한다." - }, - attract: { - name: "헤롱헤롱", - effect: "수컷은 암컷을 암컷은 수컷을 유혹하여 헤롱헤롱하게 만든다. 상대가 기술을 쓰기 어려워진다." - }, - sleepTalk: { - name: "잠꼬대", - effect: "자신이 배운 기술 중 하나를 무작위로 날린다. 자신이 잠들어 있을 때만 쓸 수 있다." - }, - healBell: { - name: "치료방울", - effect: "기분 좋은 방울소리를 들려주어 같은 편 전원의 상태 이상을 회복한다." - }, - return: { - name: "은혜갚기", - effect: "트레이너를 위해 전력으로 상대를 공격한다. 친밀할수록 위력이 올라간다." - }, - present: { - name: "프레젠트", - effect: "덫을 설치한 상자를 상대에게 건네어 공격한다. HP가 회복돼버릴 때도 있다." - }, - frustration: { - name: "화풀이", - effect: "불만을 풀기 위해 전력으로 상대를 공격한다. 친밀하지 않을수록 위력이 올라간다." - }, - safeguard: { - name: "신비의부적", - effect: "5턴 동안 이상한 힘의 보호를 받아 상태 이상이 되지 않는다." - }, - painSplit: { - name: "아픔나누기", - effect: "자신의 HP와 상대의 HP를 합친 것을 자신과 상대가 사이좋게 나눈다." - }, - sacredFire: { - name: "성스러운불꽃", - effect: "신비한 불꽃으로 상대를 태워서 공격한다. 화상 상태로 만들 때가 있다." - }, - magnitude: { - name: "매그니튜드", - effect: "땅을 흔들어서 자신의 주위에 있는 포켓몬을 공격한다. 기술의 위력이 여러모로 바뀐다." - }, - dynamicPunch: { - name: "폭발펀치", - effect: "혼신의 힘으로 펀치를 날려서 공격한다. 상대를 반드시 혼란시킨다." - }, - megahorn: { - name: "메가혼", - effect: "단단하고 훌륭한 뿔로 마음껏 상대를 꿰찔러서 공격한다." - }, - dragonBreath: { - name: "용의숨결", - effect: "굉장한 숨결을 상대에게 내뿜어 공격한다. 마비 상태로 만들 때가 있다." - }, - batonPass: { - name: "배턴터치", - effect: "교대 포켓몬과 바뀐다. 능력 변화는 바뀐 포켓몬이 그대로 이어받는다." - }, - encore: { - name: "앙코르", - effect: "상대에게 앙코르를 외쳐서 기술을 3번 연속으로 쓰게 한다." - }, - pursuit: { - name: "따라가때리기", - effect: "상대 포켓몬이 교체될 때 기술을 쓰면 2배의 위력으로 공격할 수 있다." - }, - rapidSpin: { - name: "고속스핀", - effect: "회전해서 상대를 공격한다. 조이기, 김밥말이, 씨뿌리기 등을 날려버린다. 자신의 스피드도 오른다." - }, - sweetScent: { - name: "달콤한향기", - effect: "향기로 상대의 회피율을 크게 떨어뜨린다." - }, - ironTail: { - name: "아이언테일", - effect: "단단한 꼬리로 상대를 힘껏 쳐서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." - }, - metalClaw: { - name: "메탈클로", - effect: "강철의 발톱으로 상대를 베어 갈라 공격한다. 자신의 공격이 올라갈 때도 있다." - }, - vitalThrow: { - name: "받아던지기", - effect: "상대보다 나중에 공격한다. 그 대신 자신의 공격은 반드시 명중한다." - }, - morningSun: { - name: "아침햇살", - effect: "자신의 HP를 회복한다. 날씨에 따라 회복량이 변한다." - }, - synthesis: { - name: "광합성", - effect: "자신의 HP를 회복한다. 날씨에 따라 회복량이 변한다." - }, - moonlight: { - name: "달빛", - effect: "자신의 HP를 회복한다. 날씨에 따라 회복량이 변한다." - }, - hiddenPower: { - name: "잠재파워", - effect: "기술을 쓴 포켓몬에 따라 기술의 타입이 바뀐다." - }, - crossChop: { - name: "크로스촙", - effect: "양손으로 당수를 상대에게 힘껏 쳐서 공격한다. 급소에 맞기 쉽다." - }, - twister: { - name: "회오리", - effect: "회오리를 일으켜 상대를 끌어들여 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - rainDance: { - name: "비바라기", - effect: "5턴 동안 비를 내리게 해서 물타입 기술의 위력을 올린다. 불꽃타입의 위력은 떨어진다." - }, - sunnyDay: { - name: "쾌청", - effect: "5턴 동안 햇살을 강하게 해서 불꽃타입 기술의 위력을 올린다. 물타입의 위력은 떨어진다." - }, - crunch: { - name: "깨물어부수기", - effect: "날카로운 이빨로 상대를 깨물어 부숴서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." - }, - mirrorCoat: { - name: "미러코트", - effect: "상대에게 받은 특수공격의 데미지를 2배로 만들어 그 상대에게 돌려준다." - }, - psychUp: { - name: "자기암시", - effect: "자신에게 암시를 걸어서 능력 변화 상태를 상대와 똑같은 상태로 만든다." - }, - extremeSpeed: { - name: "신속", - effect: "눈에 보이지 않는 굉장한 속도로 상대에게 돌진하여 공격한다. 반드시 선제공격을 할 수 있다." - }, - ancientPower: { - name: "원시의힘", - effect: "원시의 힘으로 공격한다. 자신의 모든 능력이 오를 때가 있다." - }, - shadowBall: { - name: "섀도볼", - effect: "까만 그림자의 덩어리를 내던져서 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - futureSight: { - name: "미래예지", - effect: "기술을 사용한 2턴 뒤에 상대에게 염동력의 덩어리를 보내어 공격한다." - }, - rockSmash: { - name: "바위깨기", - effect: "펀치로 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." - }, - whirlpool: { - name: "바다회오리", - effect: "세차게 소용돌이치는 물속에 4-5턴 동안 상대를 가두어 공격한다." - }, - beatUp: { - name: "집단구타", - effect: "같은 편 전원이 공격한다. 동료 포켓몬이 많을수록 기술의 공격 횟수가 증가한다." - }, - fakeOut: { - name: "속이기", - effect: "선제공격으로 상대를 풀죽게 한다. 배틀에 나가서 바로 쓰지 않으면 성공할 수 없다." - }, - uproar: { - name: "소란피기", - effect: "3턴 동안 소란 피워 공격한다. 그동안은 아무도 잠들지 않게 된다." - }, - stockpile: { - name: "비축하기", - effect: "힘을 비축해서 자신의 방어와 특수방어를 올린다. 최대 3회까지 비축할 수 있다." - }, - spitUp: { - name: "토해내기", - effect: "비축된 힘을 상대에게 부딪쳐서 공격한다. 비축된 만큼 위력이 올라간다." - }, - swallow: { - name: "꿀꺽", - effect: "비축된 힘을 꿀꺽해서 자신의 HP를 회복한다. 비축된 만큼 회복한다." - }, - heatWave: { - name: "열풍", - effect: "뜨거운 숨결을 상대에게 내뿜어 공격한다. 화상 상태로 만들 때가 있다." - }, - hail: { - name: "싸라기눈", - effect: "5턴 동안 싸라기눈을 내리게 해서 얼음타입이 아닌 포켓몬 모두에게 데미지를 준다." - }, - torment: { - name: "트집", - effect: "상대에게 트집을 잡아서 똑같은 기술을 2회 연속으로 쓸 수 없게 한다." - }, - flatter: { - name: "부추기기", - effect: "상대를 부추겨서 혼란시킨다. 동시에 상대의 특수공격도 올라가 버린다." - }, - willOWisp: { - name: "도깨비불", - effect: "으스스하고 괴상한 불꽃을 쏘아 상대를 화상 상태로 만든다." - }, - memento: { - name: "추억의선물", - effect: "자신은 기절하게 되지만 그 대신 상대의 공격과 특수공격을 크게 떨어뜨린다." - }, - facade: { - name: "객기", - effect: "자신이 독, 마비, 화상 상태일 때 날리면 기술의 위력이 2배가 된다." - }, - focusPunch: { - name: "힘껏펀치", - effect: "정신력을 높여 펀치를 날린다. 기술을 쓰기 전에 공격을 받으면 실패한다." - }, - smellingSalts: { - name: "정신차리기", - effect: "마비 상태의 상대에게는 위력이 2배가 되지만 대신 상대의 마비가 풀린다." - }, - followMe: { - name: "날따름", - effect: "자신에게 주목시켜 상대로부터의 공격을 모두 자신에게 향하게 한다." - }, - naturePower: { - name: "자연의힘", - effect: "자연의 힘으로 공격한다. 사용하는 장소에 따라 나오는 기술이 변화한다." - }, - charge: { - name: "충전", - effect: "다음 턴에 쓸 전기타입 기술의 위력을 올린다. 자신의 특수방어도 올라간다." - }, - taunt: { - name: "도발", - effect: "상대를 화나게 한다. 3턴 동안 상대는 데미지를 주는 기술밖에 쓸 수 없게 된다." - }, - helpingHand: { - name: "도우미", - effect: "동료를 돕는다. 도움받은 포켓몬이 쓰는 기술의 위력은 여느 때보다 커진다." - }, - trick: { - name: "트릭", - effect: "상대의 빈틈을 노려 자신과 상대가 지닌 물건을 바꿔치기한다." - }, - rolePlay: { - name: "역할", - effect: "상대의 역할을 하여 자신도 상대와 같은 특성으로 변화한다." - }, - wish: { - name: "희망사항", - effect: "다음 턴에 자신 또는 교체한 포켓몬의 HP를 최대 HP의 절반만큼 회복한다." - }, - assist: { - name: "조수", - effect: "서둘러서 같은 편의 도움을 받아 같은 편 포켓몬이 기억하고 있는 기술 중 하나를 쓴다." - }, - ingrain: { - name: "뿌리박기", - effect: "대지에 뿌리를 박아 매 턴마다 자신의 HP를 회복한다. 뿌리 박고 있으므로 교체할 수 없다." - }, - superpower: { - name: "엄청난힘", - effect: "엄청난 힘을 발휘하여 상대를 공격한다. 자신의 공격과 방어가 떨어진다." - }, - magicCoat: { - name: "매직코트", - effect: "상대가 상태 이상이 되는 기술이나 씨뿌리기 등을 썼을 때 되받아친다." - }, - recycle: { - name: "리사이클", - effect: "배틀 중에 사용하여 없어진 자신의 지닌 물건을 재생시켜 사용할 수 있게 한다." - }, - revenge: { - name: "리벤지", - effect: "상대에게 기술을 받으면 그 상대에게 주는 데미지가 2배가 된다." - }, - brickBreak: { - name: "깨트리기", - effect: "수도로 기세 좋게 내려쳐서 상대를 공격한다. 빛의장막이나 리플렉터 등도 파괴할 수 있다." - }, - yawn: { - name: "하품", - effect: "큰 하품으로 졸음을 유도한다. 다음 턴에 상대를 잠듦 상태로 만든다." - }, - knockOff: { - name: "탁쳐서떨구기", - effect: "상대의 지닌 물건을 탁 쳐서 떨어뜨려 배틀이 끝날 때까지 사용할 수 없게 한다. 물건을 가진 상대에게는 데미지를 더 준다." - }, - endeavor: { - name: "죽기살기", - effect: "상대의 HP가 자신의 HP와 같아지도록 데미지를 준다." - }, - eruption: { - name: "분화", - effect: "분노를 폭발시켜 상대를 공격한다. 자신의 HP가 적을수록 기술의 위력이 떨어진다." - }, - skillSwap: { - name: "스킬스왑", - effect: "초능력으로 자신의 특성과 상대의 특성을 바꾼다." - }, - imprison: { - name: "봉인", - effect: "상대가 자신과 같은 기술을 배웠다면 상대만 그 기술을 사용할 수 없게 한다." - }, - refresh: { - name: "리프레시", - effect: "몸을 쉬게 하여 자신이 입은 독, 마비, 화상의 상태 이상을 치료한다." - }, - grudge: { - name: "원념", - effect: "상대의 기술로 기절하면 원념을 담아 그 기술의 PP를 0으로 만든다." - }, - snatch: { - name: "가로채기", - effect: "상대가 사용하려고 한 회복 기술이나 능력 변화의 기술을 빼앗아 자신에게 쓴다." - }, - secretPower: { - name: "비밀의힘", - effect: "사용하는 장소에 따라 추가 효과가 변화하는 공격이다." - }, - dive: { - name: "다이빙", - effect: "1턴째에 잠수했다가 2턴째에 떠올라 공격한다." - }, - armThrust: { - name: "손바닥치기", - effect: "펼친 양손으로 상대를 번갈아 쳐서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - camouflage: { - name: "보호색", - effect: "물가나 풀밭, 동굴 등 있는 장소에 맞춰서 자신의 타입을 바꾼다." - }, - tailGlow: { - name: "반딧불", - effect: "깜빡거리는 빛을 바라보고 자신의 정신을 통일하여 특수공격을 매우 크게 올린다." - }, - lusterPurge: { - name: "러스터퍼지", - effect: "눈부신 빛을 발산하여 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - mistBall: { - name: "미스트볼", - effect: "안개의 깃털로 둘러싸 공격한다. 상대의 특수공격을 떨어뜨릴 때가 있다." - }, - featherDance: { - name: "깃털댄스", - effect: "깃털을 흩뿌려 상대의 몸에 휘감는다. 상대의 공격을 크게 떨어뜨린다." - }, - teeterDance: { - name: "흔들흔들댄스", - effect: "흔들흔들 댄스를 춰서 주위에 있는 포켓몬을 혼란 상태로 만든다." - }, - blazeKick: { - name: "블레이즈킥", - effect: "공격한 상대를 화상 상태로 만들 때가 있다. 급소에도 맞기 쉽다." - }, - mudSport: { - name: "흙놀이", - effect: "주위를 진흙투성이로 만든다. 5턴 동안 전기타입의 기술을 약하게 한다." - }, - iceBall: { - name: "아이스볼", - effect: "5턴 동안 상대를 공격한다. 기술이 맞을 때마다 위력이 올라간다." - }, - needleArm: { - name: "바늘팔", - effect: "바늘팔을 세차게 흔들어 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - slackOff: { - name: "게으름피우기", - effect: "게으름 피우며 쉰다. 자신의 HP를 최대 HP의 절반만큼 회복한다." - }, - hyperVoice: { - name: "하이퍼보이스", - effect: "시끄럽게 울리는 큰 진동을 상대에게 전달하여 공격한다." - }, - poisonFang: { - name: "맹독엄니", - effect: "독이 있는 이빨로 상대를 물어서 공격한다. 맹독을 주입할 때가 있다." - }, - crushClaw: { - name: "브레이크클로", - effect: "단단하고 날카로운 손톱으로 베어 갈라서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." - }, - blastBurn: { - name: "블라스트번", - effect: "폭발하는 불꽃으로 상대를 태워서 공격한다. 다음 턴은 움직일 수 없다." - }, - hydroCannon: { - name: "하이드로캐논", - effect: "물의 대포를 상대에게 발사해서 공격한다. 다음 턴은 움직일 수 없다." - }, - meteorMash: { - name: "코멧펀치", - effect: "혜성과 같은 펀치를 날려서 상대를 공격한다. 자신의 공격이 올라갈 때가 있다." - }, - astonish: { - name: "놀래키기", - effect: "큰 소리 등으로 불시에 놀래켜서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - weatherBall: { - name: "웨더볼", - effect: "사용했을 때의 날씨에 따라서 기술 타입과 위력이 바뀐다." - }, - aromatherapy: { - name: "아로마테라피", - effect: "기분 좋은 평온한 향기를 맡게 하여 같은 편 모두의 상태 이상을 회복한다." - }, - fakeTears: { - name: "거짓울음", - effect: "우는 척을 하며 눈물을 흘린다. 난처하게 만들어 상대의 특수방어를 크게 떨어뜨린다." - }, - airCutter: { - name: "에어커터", - effect: "날카로운 바람으로 상대를 베어 공격한다. 급소에 맞기 쉽다." - }, - overheat: { - name: "오버히트", - effect: "풀 파워로 상대를 공격한다. 쓰면 반동으로 자신의 특수공격이 크게 떨어진다." - }, - odorSleuth: { - name: "냄새구별", - effect: "고스트타입에 효과가 없는 기술이나 회피율이 높은 상대라 할지라도 공격이 맞게 된다." - }, - rockTomb: { - name: "암석봉인", - effect: "암석을 내던져서 공격한다. 상대의 움직임을 봉인함으로써 스피드를 떨어뜨린다." - }, - silverWind: { - name: "은빛바람", - effect: "바람에 날개 가루를 날려서 상대를 공격한다. 자신의 모든 능력이 올라갈 때가 있다." - }, - metalSound: { - name: "금속음", - effect: "금속을 긁을 때 나는 듯한 싫은 소리를 들려준다. 상대의 특수방어를 크게 떨어뜨린다." - }, - grassWhistle: { - name: "풀피리", - effect: "기분 좋은 피리 소리를 들려주어 상대를 잠듦 상태로 만든다." - }, - tickle: { - name: "간지르기", - effect: "몸을 간질여 웃게 만들어서 상대의 공격과 방어를 떨어뜨린다." - }, - cosmicPower: { - name: "코스믹파워", - effect: "우주로부터 신비한 힘을 손에 넣음으로써 자신의 방어와 특수방어를 올린다." - }, - waterSpout: { - name: "해수스파우팅", - effect: "바닷물을 내뿜어 공격한다. 자신의 HP가 적을수록 기술의 위력이 떨어진다." - }, - signalBeam: { - name: "시그널빔", - effect: "이상한 빛을 발사해서 공격한다. 상대를 혼란시킬 때가 있다." - }, - shadowPunch: { - name: "섀도펀치", - effect: "그림자에 섞여 펀치를 날린다. 공격은 반드시 명중한다." - }, - extrasensory: { - name: "신통력", - effect: "보이지 않는 이상한 힘을 보내어 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - skyUppercut: { - name: "스카이어퍼", - effect: "하늘을 향하는 듯한 높은 업퍼로 상대를 밀어올려 공격한다." - }, - sandTomb: { - name: "모래지옥", - effect: "세차게 불어대는 모래바람 속에 4-5턴 동안 상대를 가두어 공격한다." - }, - sheerCold: { - name: "절대영도", - effect: "상대를 일격에 기절시킨다. 얼음타입 이외의 포켓몬이 사용하면 잘 맞지 않는다." - }, - muddyWater: { - name: "탁류", - effect: "탁해진 물을 상대에게 발사하여 공격한다. 명중률을 떨어뜨릴 때가 있다." - }, - bulletSeed: { - name: "씨기관총", - effect: "씨앗을 기세 좋게 상대에게 발사하여 공격한다. 2-5회 동안 연속으로 쓴다." - }, - aerialAce: { - name: "제비반환", - effect: "재빠른 움직임으로 상대를 농락해 벤다. 공격은 반드시 명중한다." - }, - icicleSpear: { - name: "고드름침", - effect: "날카로운 고드름을 상대에게 발사하여 공격한다. 2-5회 동안 연속으로 쓴다." - }, - ironDefense: { - name: "철벽", - effect: "피부를 쇠처럼 단단하게 만듦으로써 자신의 방어를 크게 올린다." - }, - block: { - name: "블록", - effect: "양팔을 벌려 막아서서 상대의 도주로를 가로막아 도망칠 수 없게 한다." - }, - howl: { - name: "멀리짖기", - effect: "큰 소리로 짖고 기합을 높여 자신과 같은 편의 공격을 올린다." - }, - dragonClaw: { - name: "드래곤클로", - effect: "날카롭고 뾰족한 거대한 발톱으로 상대를 베어 갈라서 공격한다." - }, - frenzyPlant: { - name: "하드플랜트", - effect: "큰 나무로 상대를 힘껏 쳐서 공격한다. 다음 턴은 움직일 수 없게 된다." - }, - bulkUp: { - name: "벌크업", - effect: "몸에 힘을 담아 근육을 두껍게 해서 자신의 공격과 방어를 올린다." - }, - bounce: { - name: "뛰어오르기", - effect: "하늘 높이 뛰어올라 2턴째에 상대를 공격한다. 마비 상태로 만들 때가 있다." - }, - mudShot: { - name: "머드샷", - effect: "진흙 덩어리를 상대에게 내던져서 공격한다. 동시에 상대의 스피드를 떨어뜨린다." - }, - poisonTail: { - name: "포이즌테일", - effect: "꼬리로 때린다. 독 상태로 만들 때가 있고 급소에도 맞기 쉽다." - }, - covet: { - name: "탐내기", - /* 지닌 도구 대신 확률 제한 */ - effect: "귀엽게 애교부리며 상대에게 다가가 30%의 확률로 지니고 있는 도구를 뺏는다." - }, - voltTackle: { - name: "볼트태클", - effect: "전기를 한데 모아 돌진한다. 자신도 상당한 데미지를 입는다. 마비 상태로 만들 때가 있다." - }, - magicalLeaf: { - name: "매지컬리프", - effect: "상대를 추적하는 이상한 잎사귀를 흩뿌린다. 공격은 반드시 명중한다." - }, - waterSport: { - name: "물놀이", - effect: "주위를 물로 흠뻑 젖게 만든다. 5턴 동안 불꽃타입의 기술을 약하게 한다." - }, - calmMind: { - name: "명상", - effect: "조용히 정신을 통일하고 마음을 가라앉혀서 자신의 특수공격과 특수방어를 올린다." - }, - leafBlade: { - name: "리프블레이드", - effect: "잎사귀를 칼처럼 이용해 상대를 베어 공격한다. 급소에 맞기 쉽다." - }, - dragonDance: { - name: "용의춤", - effect: "신비롭고 힘센 춤을 격렬하게 춘다. 자신의 공격과 스피드를 올린다." - }, - rockBlast: { - name: "록블라스트", - effect: "단단한 암석을 상대에게 발사하여 공격한다. 2-5회 동안 연속으로 쓴다." - }, - shockWave: { - name: "전격파", - effect: "전격을 재빠르게 상대에게 날린다. 공격은 반드시 명중한다." - }, - waterPulse: { - name: "물의파동", - effect: "물의 진동을 상대에게 가하여 공격한다. 상대를 혼란시킬 때가 있다." - }, - doomDesire: { - name: "파멸의소원", - effect: "기술을 사용한 2턴 뒤에 무수한 빛의 다발이 상대를 공격한다." - }, - psychoBoost: { - name: "사이코부스트", - effect: "풀 파워로 상대를 공격한다. 쓰면 반동으로 자신의 특수공격이 크게 떨어진다." - }, - roost: { - name: "날개쉬기", - effect: "땅에 내려와 몸을 쉬게 한다. 최대 HP의 절반만큼 HP를 회복한다." - }, - gravity: { - name: "중력", - effect: "5턴 동안 부유나 비행타입에 땅타입의 기술이 맞게 된다. 공중으로 나는 기술도 사용할 수 없다." - }, - miracleEye: { - name: "미라클아이", - effect: "악타입에 효과가 없는 기술이나 회피율이 높은 상대라 할지라도 공격이 맞게 된다." - }, - wakeUpSlap: { - name: "잠깨움뺨치기", - effect: "잠듦 상태의 상대에게 큰 데미지를 준다. 대신 상대는 잠에서 깬다." - }, - hammerArm: { - name: "암해머", - effect: "강하고 무거운 주먹을 휘둘러 데미지를 준다. 자신의 스피드가 떨어진다." - }, - gyroBall: { - name: "자이로볼", - effect: "몸을 고속으로 회전시켜 몸통박치기한다. 상대보다 스피드가 낮을수록 위력은 올라간다." - }, - healingWish: { - name: "치유소원", - effect: "자신은 기절하지만 교대하여 나오는 포켓몬의 상태 이상과 HP를 회복한다." - }, - brine: { - name: "소금물", - effect: "상대가 HP의 절반 정도 상처를 입고 있으면 기술의 위력이 2배가 된다." - }, - naturalGift: { - name: "자연의은혜", - effect: "나무열매에서 힘을 얻어 공격한다. 지니게 한 나무열매에 따라 기술의 타입과 위력이 바뀐다." - }, - feint: { - name: "페인트", - effect: "방어나 판별 등을 하고 있는 상대에게 공격할 수 있다. 방어 효과를 해제시킨다." - }, - pluck: { - name: "쪼아대기", - effect: "부리로 공격한다. 상대가 나무열매를 지니고 있을 때 먹어서 나무열매의 효과를 받을 수 있다." - }, - tailwind: { - name: "순풍", - effect: "세차게 불어대는 바람의 소용돌이를 만들어 4턴 동안 같은 편 모두의 스피드를 올린다." - }, - acupressure: { - name: "경혈찌르기", - effect: "경혈을 눌러 몸을 활성화시킨다. 능력 중 하나를 크게 올린다." - }, - metalBurst: { - name: "메탈버스트", - effect: "기술을 쓰기 전에 마지막으로 받은 기술의 데미지를 늘려서 기술을 쓴 상대에게 돌려준다." - }, - uTurn: { - name: "유턴", - effect: "공격한 뒤 굉장한 스피드로 돌아와서 교대 포켓몬과 교체한다." - }, - closeCombat: { - name: "인파이트", - effect: "방어를 포기하고 상대 쪽으로 깊숙이 돌격한다. 자신의 방어와 특수방어가 떨어진다." - }, - payback: { - name: "보복", - effect: "모아서 공격한다. 상대보다 나중에 공격할 수 있으면 기술의 위력은 2배가 된다." - }, - assurance: { - name: "승부굳히기", - effect: "그 턴에 상대가 이미 데미지를 입었다면 기술의 위력은 2배가 된다." - }, - embargo: { - name: "금제", - effect: "지니게 한 도구를 5턴 동안 쓸 수 없게 한다. 트레이너도 그 포켓몬에게는 도구를 쓸 수 없다." - }, - fling: { - name: "내던지기", - effect: "지니게 한 도구를 재빠르게 내던져서 공격한다. 도구에 따라 위력과 효과가 바뀐다." - }, - psychoShift: { - name: "사이코시프트", - effect: "초능력으로 암시를 걸어서 자신에게 걸려 있는 상태 이상을 상대에게 옮긴다." - }, - trumpCard: { - name: "마지막수단", - effect: "마지막수단의 남은 PP가 적으면 적을수록 기술의 위력이 올라간다." - }, - healBlock: { - name: "회복봉인", - effect: "5턴 동안 기술이나 특성, 지니고 있는 도구에 의한 HP 회복을 할 수 없게 한다." - }, - wringOut: { - name: "쥐어짜기", - effect: "강하게 조여 공격을 한다. 상대의 HP가 많이 남아 있을수록 위력이 올라간다." - }, - powerTrick: { - name: "파워트릭", - effect: "초능력으로 자신의 공격과 방어의 힘을 교환한다." - }, - gastroAcid: { - name: "위액", - effect: "상대의 몸에 위액을 내뱉는다. 달라붙은 위액은 상대의 특성 효과를 지운다." - }, - luckyChant: { - name: "주술", - effect: "하늘을 향해 기도를 올려 5턴 동안 상대의 공격을 급소에 맞지 않게 한다." - }, - meFirst: { - name: "선취", - effect: "위력을 올려 상대가 쓰려고 하는 기술을 먼저 쓴다. 먼저 쓰지 않으면 실패한다." - }, - copycat: { - name: "흉내쟁이", - effect: "직전에 나온 기술을 흉내 내어 같은 기술을 쓴다. 기술이 나오지 않았으면 실패한다." - }, - powerSwap: { - name: "파워스왑", - effect: "초능력으로 자신과 상대의 공격과 특수공격의 능력 변화를 교체한다." - }, - guardSwap: { - name: "가드스왑", - effect: "초능력으로 자신과 상대의 방어와 특수방어의 능력 변화를 교체한다." - }, - punishment: { - name: "혼내기", - effect: "능력 변화로 상대가 파워업한 만큼 기술의 위력이 올라간다." - }, - lastResort: { - name: "비장의무기", - effect: "배틀 중에 기억하고 있는 기술을 모두 사용하면 그때부터 쓸 수 있는 필살기이다." - }, - worrySeed: { - name: "고민씨", - effect: "마음을 괴롭히는 씨앗을 심는다. 상대를 잠잘 수 없게 해서 특성을 불면으로 만든다." - }, - suckerPunch: { - name: "기습", - effect: "상대보다 먼저 공격할 수 있다. 상대가 쓴 기술이 공격기술이 아니면 실패한다." - }, - toxicSpikes: { - name: "독압정", - effect: "상대의 발밑에 독 압정을 뿌린다. 교체로 나온 상대 포켓몬에게 독을 퍼지게 한다." - }, - heartSwap: { - name: "하트스왑", - effect: "초능력으로 자신과 상대에 걸려 있는 능력 변화를 교체한다." - }, - aquaRing: { - name: "아쿠아링", - effect: "자신의 몸 주변을 물로 만든 베일로 덮는다. 매 턴 HP를 회복한다." - }, - magnetRise: { - name: "전자부유", - effect: "전기로 만든 자력의 힘으로 허공에 뜬다. 5턴 동안 부유할 수 있다." - }, - flareBlitz: { - name: "플레어드라이브", - effect: "불꽃을 두르고 돌진한다. 자신도 상당한 데미지를 입는다. 화상 상태로 만들 때가 있다." - }, - forcePalm: { - name: "발경", - effect: "상대의 몸에 충격파를 부딪쳐 공격한다. 마비 상태로 만들 때가 있다." - }, - auraSphere: { - name: "파동탄", - effect: "몸속에서 파동의 힘을 끌어내 상대에게 쏜다. 공격은 반드시 명중한다." - }, - rockPolish: { - name: "록커트", - effect: "자신의 몸을 갈아 공기의 저항을 적게 한다. 스피드를 크게 올릴 수 있다." - }, - poisonJab: { - name: "독찌르기", - effect: "독에 물든 촉수나 팔로 상대를 꿰찌른다. 독 상태로 만들 때가 있다." - }, - darkPulse: { - name: "악의파동", - effect: "몸에서 악의로 가득한 무서운 오라를 발한다. 상대를 풀죽게 만들 때가 있다." - }, - nightSlash: { - name: "깜짝베기", - effect: "순간적으로 틈을 노려 상대를 베어 버린다. 급소에 맞기 쉽다." - }, - aquaTail: { - name: "아쿠아테일", - effect: "세차게 날뛰는 거친 파도와 같이 큰 꼬리를 흔들어서 상대를 공격한다." - }, - seedBomb: { - name: "씨폭탄", - effect: "단단한 껍질을 가지고 있는 큰 씨앗을 위에서 힘껏 내던져 상대를 공격한다." - }, - airSlash: { - name: "에어슬래시", - effect: "하늘까지 베어 가르는 공기의 칼날로 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - xScissor: { - name: "시저크로스", - effect: "낫이나 발톱을 가위처럼 교차시키면서 상대를 베어 가른다." - }, - bugBuzz: { - name: "벌레의야단법석", - effect: "진동으로 음파를 일으켜서 공격한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - dragonPulse: { - name: "용의파동", - effect: "큰 입으로 충격파를 일으켜서 상대를 공격한다." - }, - dragonRush: { - name: "드래곤다이브", - effect: "굉장한 살기로 위압하면서 몸통박치기한다. 상대를 풀죽게 만들 때가 있다." - }, - powerGem: { - name: "파워젬", - effect: "보석처럼 반짝이는 빛을 발사하여 상대를 공격한다." - }, - drainPunch: { - name: "드레인펀치", - effect: "주먹으로 상대의 힘을 흡수한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." - }, - vacuumWave: { - name: "진공파", - effect: "주먹을 흔들어 진공의 파도를 일으킨다. 반드시 선제공격을 할 수 있다." - }, - focusBlast: { - name: "기합구슬", - effect: "기합을 높여서 혼신의 힘을 방출한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - energyBall: { - name: "에너지볼", - effect: "자연으로부터 모은 생명의 힘을 발사한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - braveBird: { - name: "브레이브버드", - effect: "날개를 접어 저공비행으로 돌격한다. 자신도 상당한 데미지를 입는다." - }, - earthPower: { - name: "대지의힘", - effect: "상대의 발밑에 대지의 힘을 방출한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - switcheroo: { - name: "바꿔치기", - effect: "눈에 보이지 않는 속도로 자신과 상대가 지닌 물건을 교환한다." - }, - gigaImpact: { - name: "기가임팩트", - effect: "가진 힘을 모두 사용해서 상대에게 돌격한다. 다음 턴은 움직일 수 없다." - }, - nastyPlot: { - name: "나쁜음모", - effect: "나쁜 일을 생각해서 머리를 활성화시킨다. 자신의 특수공격을 크게 올린다." - }, - bulletPunch: { - name: "불릿펀치", - effect: "탄환처럼 빠르고 단단한 펀치를 상대에게 날린다. 반드시 선제공격을 할 수 있다." - }, - avalanche: { - name: "눈사태", - effect: "상대로부터 기술을 받으면 그 상대에 대해서 기술의 위력이 2배가 된다." - }, - iceShard: { - name: "얼음뭉치", - effect: "얼음덩어리를 순식간에 만들어 상대에게 빠르게 쏜다. 반드시 선제공격을 할 수 있다." - }, - shadowClaw: { - name: "섀도클로", - effect: "그림자로 만든 날카로운 발톱으로 상대를 베어 가른다. 급소에 맞기 쉽다." - }, - thunderFang: { - name: "번개엄니", - effect: "전기를 모은 이빨로 문다. 상대를 풀죽게 하거나 마비 상태로 만들 때가 있다." - }, - iceFang: { - name: "얼음엄니", - effect: "냉기를 품은 이빨로 문다. 상대를 풀죽게 하거나 얼음 상태로 만들 때가 있다." - }, - fireFang: { - name: "불꽃엄니", - effect: "불꽃을 두른 이빨로 문다. 상대를 풀죽게 하거나 화상 상태로 만들 때가 있다." - }, - shadowSneak: { - name: "야습", - effect: "그림자를 늘려 상대의 배후에서 공격한다. 반드시 선제공격할 수 있다." - }, - mudBomb: { - name: "진흙폭탄", - effect: "단단한 진흙구슬을 상대에게 발사하여 공격한다. 명중률을 떨어뜨릴 때가 있다." - }, - psychoCut: { - name: "사이코커터", - effect: "실체화시킨 마음의 칼날로 상대를 베어 가른다. 급소에 맞기 쉽다." - }, - zenHeadbutt: { - name: "사념의박치기", - effect: "사념의 힘을 이마에 모아서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - mirrorShot: { - name: "미러샷", - effect: "갈고닦은 몸에서 섬광의 힘을 상대에게 쏜다. 명중률을 떨어뜨릴 때가 있다." - }, - flashCannon: { - name: "러스터캐논", - effect: "몸의 빛을 한곳에 모아서 힘을 방출한다. 상대의 특수방어를 떨어뜨릴 때가 있다." - }, - rockClimb: { - name: "록클라임", - effect: "굉장한 기세로 상대에게 돌진하여 공격한다. 상대를 혼란시킬 때가 있다." - }, - defog: { - name: "안개제거", - effect: "강한 바람으로 상대의 리플렉터나 빛의장막 등을 제거한다. 회피율도 떨어뜨린다." - }, - trickRoom: { - name: "트릭룸", - effect: "이상한 공간을 만든다. 5턴 동안 느린 포켓몬부터 행동할 수 있다." - }, - dracoMeteor: { - name: "용성군", - effect: "천공에서 운석을 상대에게 떨어뜨린다. 사용하면 반동으로 자신의 특수공격이 크게 떨어진다." - }, - discharge: { - name: "방전", - effect: "눈부신 전격으로 자신의 주위에 있는 포켓몬을 공격한다. 마비 상태로 만들 때가 있다." - }, - lavaPlume: { - name: "분연", - effect: "새빨간 불꽃으로 자신의 주위에 있는 포켓몬을 공격한다. 화상 상태로 만들 때가 있다." - }, - leafStorm: { - name: "리프스톰", - effect: "뾰족한 잎사귀로 상대에게 돌풍을 일으킨다. 사용하면 반동으로 자신의 특수공격이 크게 떨어진다." - }, - powerWhip: { - name: "파워휩", - effect: "덩굴이나 촉수를 세차게 흔들어 상대를 힘껏 쳐서 공격한다." - }, - rockWrecker: { - name: "암석포", - effect: "거대한 바위를 상대에게 발사하여 공격한다. 다음 턴은 움직일 수 없게 된다." - }, - crossPoison: { - name: "크로스포이즌", - effect: "독 칼날로 상대를 베어 가른다. 독 상태로 만들 때가 있고 급소에도 맞기 쉽다." - }, - gunkShot: { - name: "더스트슈트", - effect: "더러운 쓰레기를 상대에게 부딪쳐서 공격한다. 독 상태로 만들 때가 있다." - }, - ironHead: { - name: "아이언헤드", - effect: "강철과 같은 단단한 머리로 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - magnetBomb: { - name: "마그넷봄", - effect: "상대에게 달라붙는 강철의 폭탄을 발사한다. 공격은 반드시 명중한다." - }, - stoneEdge: { - name: "스톤에지", - effect: "뾰족한 바위를 상대에게 꿰찔러서 공격한다. 급소에 맞기 쉽다." - }, - captivate: { - name: "유혹", - effect: "수컷은 암컷을 암컷은 수컷을 유혹하여 상대의 특수공격을 크게 떨어뜨린다." - }, - stealthRock: { - name: "스텔스록", - effect: "상대의 주위에 무수한 바위를 띄워 교체해서 나온 상대 포켓몬에게 데미지를 준다." - }, - grassKnot: { - name: "풀묶기", - effect: "풀을 휘감아서 상대를 쓰러뜨린다. 상대가 무거울수록 위력이 올라간다." - }, - chatter: { - name: "수다", - effect: "매우 시끄럽고 수다스러운 음파로 상대를 공격한다. 상대를 혼란시킨다." - }, - judgment: { - name: "심판의뭉치", - effect: "무수한 광탄을 상대에게 방출한다. 자신이 가지고 있는 플레이트에 따라 타입이 바뀐다." - }, - bugBite: { - name: "벌레먹기", - effect: "물어서 공격한다. 상대가 나무열매를 지니고 있을 때 먹어서 나무열매의 효과를 받을 수 있다." - }, - chargeBeam: { - name: "차지빔", - effect: "전격의 다발을 상대에게 발사한다. 전기를 모아서 자신의 특수공격을 올릴 때가 있다." - }, - woodHammer: { - name: "우드해머", - effect: "단단한 몸통을 상대에게 부딪쳐서 공격한다. 자신도 상당한 데미지를 입는다." - }, - aquaJet: { - name: "아쿠아제트", - effect: "눈에 보이지 않는 굉장한 속도로 상대에게 돌진한다. 반드시 선제공격할 수 있다." - }, - attackOrder: { - name: "공격지령", - effect: "부하를 불러내어 상대를 향해서 공격시킨다. 급소에 맞기 쉽다." - }, - defendOrder: { - name: "방어지령", - effect: "부하를 불러내어 자신의 몸을 뒤덮게 한다. 방어와 특수방어를 올릴 수 있다." - }, - healOrder: { - name: "회복지령", - effect: "부하를 불러내어 상처를 회복한다. 최대 HP의 절반만큼 자신의 HP를 회복한다." - }, - headSmash: { - name: "양날박치기", - effect: "목숨을 걸고 혼신의 힘으로 상대에게 박치기를 한다. 자신도 굉장한 데미지를 입는다." - }, - doubleHit: { - name: "더블어택", - effect: "꼬리 등을 써서 상대를 때려 공격한다. 2회 연속으로 데미지를 준다." - }, - roarOfTime: { - name: "시간의포효", - effect: "시간이 뒤틀릴 정도의 힘을 사용해서 상대를 공격한다. 다음 턴은 움직일 수 없다." - }, - spacialRend: { - name: "공간절단", - effect: "주위의 공간과 더불어 상대를 찢어서 데미지를 준다. 급소에 맞기 쉽다." - }, - lunarDance: { - name: "초승달춤", - effect: "자신은 기절하지만 교대하여 나오는 포켓몬의 모든 상태를 회복한다." - }, - crushGrip: { - name: "묵사발", - effect: "굉장한 힘으로 상대를 묵사발로 만든다. 상대의 HP가 남아 있을수록 위력이 올라간다." - }, - magmaStorm: { - name: "마그마스톰", - effect: "세차게 타오르는 불꽃 속에 4-5턴 동안 상대를 가두어 공격한다." - }, - darkVoid: { - name: "다크홀", - effect: "암흑의 세계로 끌고 가서 떨어뜨려 상대를 잠듦 상태로 만든다." - }, - seedFlare: { - name: "시드플레어", - effect: "몸속에서 충격파를 발생시킨다. 상대의 특수방어를 크게 떨어뜨릴 때가 있다." - }, - ominousWind: { - name: "괴상한바람", - effect: "소름이 끼칠 만한 돌풍으로 상대를 공격한다. 자신의 모든 능력이 올라갈 때가 있다." - }, - shadowForce: { - name: "섀도다이브", - effect: "1턴째에 모습을 감춰 2턴째에 상대를 공격한다. 방어하고 있어도 공격은 맞는다." - }, - honeClaws: { - name: "손톱갈기", - effect: "손톱을 갈아 날카롭게 한다. 자신의 공격과 명중률을 올린다." - }, - wideGuard: { - name: "와이드가드", - effect: "같은 편 전원에게 향하는 공격을 1턴 동안 막는다." - }, - guardSplit: { - name: "가드셰어", - effect: "초능력으로 자신과 상대의 방어와 특수방어를 더해서 반으로 나눈다." - }, - powerSplit: { - name: "파워셰어", - effect: "초능력으로 자신과 상대의 공격과 특수공격을 더해서 반으로 나눈다." - }, - wonderRoom: { - name: "원더룸", - effect: "이상한 공간을 만든다. 5턴 동안 모든 포켓몬의 방어와 특수방어가 바뀐다." - }, - psyshock: { - name: "사이코쇼크", - effect: "이상한 염력파를 실체화하여 상대를 공격한다. 물리적인 데미지를 준다." - }, - venoshock: { - name: "베놈쇼크", - effect: "특수한 독액을 끼얹는다. 독 상태의 상대에게는 위력이 2배가 된다." - }, - autotomize: { - name: "바디퍼지", - effect: "몸의 쓸모없는 부분을 깎는다. 자신의 스피드를 크게 올리고 체중도 가벼워진다." - }, - ragePowder: { - name: "분노가루", - effect: "안절부절못하게 하는 가루를 자신에게 뿌려서 주의를 끈다. 상대의 공격은 모두 자신에게 향한다." - }, - telekinesis: { - name: "텔레키네시스", - effect: "초능력으로 상대를 띄운다. 3턴 동안 공격이 상대에게 맞기 쉬워진다." - }, - magicRoom: { - name: "매직룸", - effect: "이상한 공간을 만든다. 5턴 동안 모든 포켓몬의 도구의 효과가 사라진다." - }, - smackDown: { - name: "떨어뜨리기", - effect: "돌이나 구슬을 던져서 날고 있는 상대를 공격한다. 맞은 상대는 땅에 떨어진다." - }, - stormThrow: { - name: "업어후리기", - effect: "강렬한 일격을 상대에게 날린다. 공격은 반드시 급소에 맞는다." - }, - flameBurst: { - name: "불꽃튀기기", - effect: "맞으면 튀는 불꽃으로 상대를 공격한다. 튕긴 불꽃은 옆의 상대에게도 쏟아진다." - }, - sludgeWave: { - name: "오물웨이브", - effect: "오물 파도로 자신의 주위에 있는 포켓몬을 공격한다. 독 상태로 만들 때가 있다." - }, - quiverDance: { - name: "나비춤", - effect: "신비롭고 아름다운 춤을 경쾌하게 춘다. 자신의 특수공격과 특수방어와 스피드를 올린다." - }, - heavySlam: { - name: "헤비봄버", - effect: "무거운 몸으로 상대에게 부딪쳐 공격한다. 자신이 상대보다 무거울수록 위력이 올라간다." - }, - synchronoise: { - name: "싱크로노이즈", - effect: "이상한 전파로 주위에 있는 자신과 같은 타입의 포켓몬에게 데미지를 준다." - }, - electroBall: { - name: "일렉트릭볼", - effect: "전기 덩어리를 상대에게 부딪쳐서 공격한다. 상대보다 스피드가 빠를수록 위력이 올라간다." - }, - soak: { - name: "물붓기", - effect: "많은 물을 끼얹어서 상대를 물타입으로 바꾼다." - }, - flameCharge: { - name: "니트로차지", - effect: "불꽃을 둘러 상대를 공격한다. 힘을 모아서 자신의 스피드를 올린다." - }, - coil: { - name: "똬리틀기", - effect: "똬리를 틀어서 집중한다. 자신의 공격과 방어와 명중률을 올린다." - }, - lowSweep: { - name: "로킥", - effect: "재빠른 움직임으로 상대의 다리를 노려 공격한다. 상대의 스피드를 떨어뜨린다." - }, - acidSpray: { - name: "애시드봄", - effect: "상대를 녹이는 액체를 토해내서 공격한다. 상대의 특수방어를 크게 떨어뜨린다." - }, - foulPlay: { - name: "속임수", - effect: "상대의 힘을 이용한다. 싸우고 있는 상대의 공격이 높을수록 데미지가 올라간다." - }, - simpleBeam: { - name: "심플빔", - effect: "수수께끼의 염력파를 상대에게 보낸다. 염력파를 받은 상대는 특성이 단순으로 바뀐다." - }, - entrainment: { - name: "동료만들기", - effect: "이상한 리듬으로 춤춘다. 움직임을 흉내 내게 해서 자신과 상대의 특성을 똑같게 만든다." - }, - afterYou: { - name: "당신먼저", - effect: "상대의 행동을 도와서 자신이 행동한 뒤에 바로 움직일 수 있도록 한다." - }, - round: { - name: "돌림노래", - effect: "노래로 상대를 공격한다. 함께 돌림노래를 하면 계속해서 쓸 수 있고 위력도 올라간다." - }, - echoedVoice: { - name: "에코보이스", - effect: "울리는 목소리로 상대를 공격한다. 매 턴 누군가 이 기술을 계속해서 쓰면 위력이 올라간다." - }, - chipAway: { - name: "야금야금", - effect: "틈을 보며 착실하게 공격한다. 상대의 능력 변화에 관계없이 데미지를 준다." - }, - clearSmog: { - name: "클리어스모그", - effect: "특수한 진흙 덩어리를 상대에게 내던져서 공격한다. 능력 변화를 원래대로 돌린다." - }, - storedPower: { - name: "어시스트파워", - effect: "축적된 파워로 상대를 공격한다. 자신의 능력이 올라가 있는 만큼 위력이 오른다." - }, - quickGuard: { - name: "패스트가드", - effect: "자신과 같은 편을 상대의 선제공격으로부터 지킨다." - }, - allySwitch: { - name: "사이드체인지", - effect: "이상한 힘으로 순간이동하여 자신과 같은 편의 위치를 바꾼다." - }, - scald: { - name: "열탕", - effect: "뜨겁게 끓어오르는 물을 상대에게 발사해서 공격한다. 화상 상태로 만들 때가 있다." - }, - shellSmash: { - name: "껍질깨기", - effect: "껍질을 깨서 자신의 방어와 특수방어를 떨어뜨리지만 공격과 특수공격, 스피드를 크게 올린다." - }, - healPulse: { - name: "치유파동", - effect: "치유파동을 날려서 최대 HP의 절반만큼 상대의 HP를 회복한다." - }, - hex: { - name: "병상첨병", - effect: "엎친 데 덮친 격으로 공격한다. 상태 이상인 상대에게 큰 데미지를 준다." - }, - skyDrop: { - name: "프리폴", - effect: "1턴째에 상대를 하늘로 끌고 가서 2턴째에 떨어뜨려 공격한다. 끌려간 상대는 움직일 수 없다." - }, - shiftGear: { - name: "기어체인지", - effect: "톱니바퀴를 돌려서 자신의 공격을 올리는 것뿐만 아니라 스피드도 크게 올린다." - }, - circleThrow: { - name: "배대뒤치기", - effect: "상대를 내던져서 교대할 포켓몬을 끌어낸다. 야생의 경우에는 배틀이 끝난다." - }, - incinerate: { - name: "불태우기", - effect: "불꽃으로 상대를 공격한다. 상대가 나무열매 등을 지니고 있을 때 불태워서 쓸 수 없게 만든다." - }, - quash: { - name: "순서미루기", - effect: "상대를 억눌러서 행동의 순서를 마지막으로 만든다." - }, - acrobatics: { - name: "애크러뱃", - effect: "경쾌하게 상대를 공격한다. 도구를 적게 지니고 있을수록 더 큰 데미지를 준다." - }, - reflectType: { - name: "미러타입", - effect: "상대의 타입을 반사해서 자신도 똑같은 타입이 된다." - }, - retaliate: { - name: "원수갚기", - effect: "쓰러진 같은 편의 원수를 갚는다. 앞 턴에서 같은 편이 쓰러지면 위력이 올라간다." - }, - finalGambit: { - name: "목숨걸기", - effect: "목숨을 걸고 상대를 공격한다. 자신은 기절하게 되지만 상대에게 HP만큼의 데미지를 준다." - }, - bestow: { - name: "기프트패스", - effect: "상대가 도구를 지니고 있지 않을 때 자신이 지니고 있는 도구를 상대에게 건넨다." - }, - inferno: { - name: "연옥", - effect: "격렬한 불꽃으로 상대를 둘러싸 공격한다. 화상 상태로 만든다." - }, - waterPledge: { - name: "물의맹세", - effect: "물기둥으로 공격한다. 불꽃과 조합하면 위력이 올라가고 하늘에 무지개가 걸린다." - }, - firePledge: { - name: "불꽃의맹세", - effect: "불꽃기둥으로 공격한다. 풀과 조합하면 위력이 올라가고 주위가 불바다가 된다." - }, - grassPledge: { - name: "풀의맹세", - effect: "풀기둥으로 공격한다. 물과 조합하면 위력이 올라가고 주변이 습지초원이 된다." - }, - voltSwitch: { - name: "볼트체인지", - effect: "공격한 뒤 굉장한 스피드로 돌아와서 교대 포켓몬과 교체한다." - }, - struggleBug: { - name: "벌레의저항", - effect: "저항해서 상대를 공격한다. 상대의 특수공격을 떨어뜨린다." - }, - bulldoze: { - name: "땅고르기", - effect: "땅을 힘껏 밟아 자신의 주위에 있는 포켓몬을 공격한다. 상대의 스피드를 떨어뜨린다." - }, - frostBreath: { - name: "얼음숨결", - effect: "차가운 숨결을 상대에게 내뿜어 공격한다. 반드시 급소에 맞는다." - }, - dragonTail: { - name: "드래곤테일", - effect: "상대를 튕겨내서 교대할 포켓몬을 끌어낸다. 야생의 경우에는 배틀이 끝난다." - }, - workUp: { - name: "분발", - effect: "스스로 분발해서 공격과 특수공격을 올린다." - }, - electroweb: { - name: "일렉트릭네트", - effect: "전기 네트로 상대를 붙잡아서 공격한다. 상대의 스피드를 떨어뜨린다." - }, - wildCharge: { - name: "와일드볼트", - effect: "전기를 두르고 상대에게 부딪쳐 공격한다. 자신도 조금 데미지를 입는다." - }, - drillRun: { - name: "드릴라이너", - effect: "드릴처럼 몸을 회전시켜서 상대에게 몸통박치기한다. 급소에 맞기 쉽다." - }, - dualChop: { - name: "더블촙", - effect: "몸의 단단한 부분으로 상대를 때려 공격한다. 2회 연속으로 데미지를 준다." - }, - heartStamp: { - name: "하트스탬프", - effect: "귀여운 모습으로 방심시켜서 강렬한 일격을 날린다. 상대를 풀죽게 만들 때가 있다." - }, - hornLeech: { - name: "우드혼", - effect: "뿔을 꿰찔러서 상대의 양분을 흡수한다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." - }, - sacredSword: { - name: "성스러운칼", - effect: "긴 뿔로 베어 공격한다. 상대의 능력 변화에 관계없이 데미지를 준다." - }, - razorShell: { - name: "셸블레이드", - effect: "날카로운 조개껍질로 베어 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." - }, - heatCrash: { - name: "히트스탬프", - effect: "불타는 몸으로 상대에게 부딪쳐서 공격한다. 자신이 상대보다 무거울수록 위력이 올라간다." - }, - leafTornado: { - name: "그래스믹서", - effect: "날카로운 잎사귀로 상대를 둘러싸서 공격한다. 명중률을 떨어뜨릴 때가 있다." - }, - steamroller: { - name: "하드롤러", - effect: "둥글게 뭉친 몸을 회전하여 상대를 뭉개 버린다. 상대를 풀죽게 만들 때가 있다." - }, - cottonGuard: { - name: "코튼가드", - effect: "푹신푹신한 솜털로 자신의 몸을 둘러싸서 지킨다. 방어를 매우 크게 올린다." - }, - nightDaze: { - name: "나이트버스트", - effect: "암흑의 충격파를 날려서 상대를 공격한다. 명중률을 떨어뜨릴 때가 있다." - }, - psystrike: { - name: "사이코브레이크", - effect: "이상한 염력파를 실체화하여 상대를 공격한다. 물리적인 데미지를 준다." - }, - tailSlap: { - name: "스위프뺨치기", - effect: "단단한 꼬리로 상대를 때려서 공격한다. 2-5회 동안 연속으로 쓴다." - }, - hurricane: { - name: "폭풍", - effect: "강렬한 바람으로 상대를 둘러싸서 공격한다. 상대를 혼란시킬 때가 있다." - }, - headCharge: { - name: "아프로브레이크", - effect: "굉장한 아프로 머리로 상대에게 돌진하여 공격한다. 자신도 조금 데미지를 입는다." - }, - gearGrind: { - name: "기어소서", - effect: "강철의 기어를 상대에게 던져서 공격한다. 2회 연속으로 데미지를 준다." - }, - searingShot: { - name: "화염탄", - effect: "새빨간 불꽃으로 자신의 주위에 있는 포켓몬을 공격한다. 화상 상태로 만들 때가 있다." - }, - technoBlast: { - name: "테크노버스터", - effect: "광탄을 상대에게 방출한다. 자신이 지니고 있는 카세트에 의해 타입이 바뀐다." - }, - relicSong: { - name: "옛노래", - effect: "옛 노래를 상대에게 들려주고 마음에 호소하여 공격한다. 잠듦 상태로 만들 때가 있다." - }, - secretSword: { - name: "신비의칼", - effect: "긴 뿔로 베어 공격한다. 뿔이 머금은 이상한 힘은 물리적인 데미지를 준다." - }, - glaciate: { - name: "얼어붙은세계", - effect: "차가운 냉기를 상대에게 내뿜어 공격한다. 상대의 스피드를 떨어뜨린다." - }, - boltStrike: { - name: "뇌격", - effect: "방대한 전기를 몸에 둘러 상대에게 돌진해서 공격한다. 마비 상태로 만들 때가 있다." - }, - blueFlare: { - name: "푸른불꽃", - effect: "아름다우면서도 격렬한 푸른불꽃으로 상대를 둘러싸서 공격한다. 화상 상태로 만들 때가 있다." - }, - fieryDance: { - name: "불꽃춤", - effect: "불꽃을 두른 날개를 쳐서 공격한다. 자신의 특수공격이 오를 때가 있다." - }, - freezeShock: { - name: "프리즈볼트", - effect: "전기를 두른 얼음덩어리로 2턴째에 상대를 내리친다. 마비 상태로 만들 때가 있다." - }, - iceBurn: { - name: "콜드플레어", - effect: "모든 것을 얼려버리는 격렬한 냉기로 2턴째에 상대를 둘러싼다. 화상 상태로 만들 때가 있다." - }, - snarl: { - name: "바크아웃", - effect: "호되게 호통을 쳐서 상대의 특수공격을 떨어뜨린다." - }, - icicleCrash: { - name: "고드름떨구기", - effect: "큰 고드름을 격렬하게 부딪쳐서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - vCreate: { - name: "V제너레이트", - effect: "작열하는 불꽃을 이마에서 발생시켜 이판사판으로 몸통박치기한다. 방어, 특수방어, 스피드가 떨어진다." - }, - fusionFlare: { - name: "크로스플레임", - effect: "거대한 불꽃을 내리친다. 거대한 천둥의 영향을 받아 기술의 위력이 올라간다." - }, - fusionBolt: { - name: "크로스썬더", - effect: "거대한 천둥을 내리친다. 거대한 불꽃의 영향을 받아 기술의 위력이 올라간다." - }, - flyingPress: { - name: "플라잉프레스", - effect: "공중에서 상대에게 다이브한다. 이 기술은 격투타입임과 동시에 비행타입이기도 하다." - }, - matBlock: { - name: "마룻바닥세워막기", - effect: "뒤집어 세운 마룻바닥을 방패로 하여 자신과 같은 편으로 향하는 기술 데미지를 막는다. 변화 기술은 막을 수 없다." - }, - belch: { - name: "트림", - effect: "상대를 향해 트림을 하여 데미지를 준다. 나무열매를 먹지 않으면 쓸 수 없다." - }, - rototiller: { - name: "일구기", - effect: "땅을 일구어 초목이 자라기 쉽게 한다. 풀타입의 공격과 특수공격이 오른다." - }, - stickyWeb: { - name: "끈적끈적네트", - effect: "상대의 주위에 끈적끈적한 네트를 둘러 펼쳐 교체되어 나온 상대의 스피드를 떨어뜨린다." - }, - fellStinger: { - name: "마지막일침", - effect: "이 기술을 사용하여 상대를 쓰러뜨리면 공격이 매우 크게 오른다." - }, - phantomForce: { - name: "고스트다이브", - effect: "1턴째에 어디론가 사라져서 2턴째에 상대를 공격한다. 기술 방어를 무시하고 공격할 수 있다." - }, - trickOrTreat: { - name: "핼러윈", - effect: "상대를 핼러윈으로 초대한다. 상대 타입에 고스트타입이 추가된다." - }, - nobleRoar: { - name: "부르짖기", - effect: "우렁차게 부르짖어서 상대를 위협하여 상대의 공격과 특수공격을 떨어뜨린다." - }, - ionDeluge: { - name: "플라스마샤워", - effect: "전기를 띤 입자를 확산시켜 노말타입 기술을 전기타입으로 바꿔버린다." - }, - parabolicCharge: { - name: "파라볼라차지", - effect: "주위에 있는 모든 포켓몬에게 데미지를 준다. 준 데미지의 절반을 자신이 회복한다." - }, - forestsCurse: { - name: "숲의저주", - effect: "상대에게 숲의 저주를 건다. 저주에 걸린 상대는 타입에 풀타입이 추가된다." - }, - petalBlizzard: { - name: "꽃보라", - effect: "세찬 꽃보라를 일으켜서 주위에 있는 포켓몬을 공격하여 데미지를 준다." - }, - freezeDry: { - name: "프리즈드라이", - effect: "상대를 급격히 차갑게 하여 얼음 상태로 만들 때가 있다. 물타입 포켓몬에게도 효과가 굉장해진다." - }, - disarmingVoice: { - name: "차밍보이스", - effect: "매혹적인 울음소리를 내어 상대에게 정신적 데미지를 준다. 공격은 반드시 명중한다." - }, - partingShot: { - name: "막말내뱉기", - effect: "막말을 내뱉어 상대를 위협하여 공격과 특수공격을 떨어뜨린 후 교대 포켓몬과 교체한다." - }, - topsyTurvy: { - name: "뒤집어엎기", - effect: "상대에게 걸려 있는 모든 능력 변화를 뒤집어서 반대로 만든다." - }, - drainingKiss: { - name: "드레인키스", - effect: "키스로 상대의 HP를 흡수한다. 준 데미지의 반 이상 HP를 회복한다." - }, - craftyShield: { - name: "트릭가드", - effect: "이상한 힘을 사용하여 같은 편을 공격하는 변화 기술을 막는다. 데미지 기술은 받는다." - }, - flowerShield: { - name: "플라워가드", - effect: "이상한 힘을 사용하여 배틀에 나와 있는 모든 풀타입 포켓몬의 방어를 올린다." - }, - grassyTerrain: { - name: "그래스필드", - effect: "5턴 동안 그래스필드로 만든다. 땅에 있으면 매 턴 회복한다. 풀타입의 위력이 올라간다." - }, - mistyTerrain: { - name: "미스트필드", - effect: "5턴 동안 땅에 있으면 상태 이상이 되지 않고 드래곤타입 기술의 데미지도 절반이 된다." - }, - electrify: { - name: "송전", - effect: "상대가 기술을 쓰기 전에 송전하면 그 턴에 상대가 사용하는 기술은 전기타입이 된다." - }, - playRough: { - name: "치근거리기", - effect: "상대에게 치근거리며 공격한다. 상대의 공격을 떨어뜨릴 때가 있다." - }, - fairyWind: { - name: "요정의바람", - effect: "요정의 바람을 일으켜 상대에게 몰아쳐서 공격한다." - }, - moonblast: { - name: "문포스", - effect: "달의 파워를 빌려서 상대를 공격한다. 상대의 특수공격을 떨어뜨릴 때가 있다." - }, - boomburst: { - name: "폭음파", - effect: "무시무시한 폭음의 파괴력으로 주위에 있는 포켓몬을 공격한다." - }, - fairyLock: { - name: "페어리록", - effect: "록을 걸어 다음 턴의 모든 포켓몬을 도망가지 못하게 한다." - }, - kingsShield: { - name: "킹실드", - effect: "상대의 공격을 막음과 동시에 방어 태세를 갖춘다. 접촉한 상대의 공격을 떨어뜨린다." - }, - playNice: { - name: "친해지기", - effect: "상대와 친해져서 싸울 마음을 잃게 하여 상대의 공격을 떨어뜨린다." - }, - confide: { - name: "비밀이야기", - effect: "비밀 이야기를 해서 상대의 집중력을 잃게 하여 특수공격을 떨어뜨린다." - }, - diamondStorm: { - name: "다이아스톰", - effect: "다이아 폭풍을 일으켜 데미지를 준다. 자신의 방어를 크게 올릴 때가 있다." - }, - steamEruption: { - name: "스팀버스트", - effect: "상대에게 굉장히 뜨거운 증기를 뿜는다. 상대는 화상을 입기도 한다." - }, - hyperspaceHole: { - name: "이차원홀", - effect: "이차원홀로 갑자기 상대 바로 옆에 나타나 공격한다. 방어나 판별 등도 무시할 수 있다." - }, - waterShuriken: { - name: "물수리검", - effect: "점액으로 만든 수리검을 2-5회 동안 연속으로 던진다. 반드시 선제공격할 수 있다." - }, - mysticalFire: { - name: "매지컬플레임", - effect: "입에서 내뱉는 아주 뜨거운 불꽃으로 공격한다. 상대의 특수공격을 떨어뜨린다." - }, - spikyShield: { - name: "니들가드", - effect: "상대의 공격을 막음과 동시에 접촉한 상대의 체력을 떨어뜨린다." - }, - aromaticMist: { - name: "아로마미스트", - effect: "신비한 아로마 향으로 같은 편의 특수방어를 올린다." - }, - eerieImpulse: { - name: "괴전파", - effect: "몸에서 발생시킨 괴전파를 상대에게 쏘아 특수공격을 크게 떨어뜨린다." - }, - venomDrench: { - name: "베놈트랩", - effect: "특수한 독액을 끼얹는다. 독 상태인 상대는 공격, 특수공격, 스피드가 떨어진다." - }, - powder: { - name: "분진", - effect: "분진을 뒤집어쓴 상대가 불꽃 기술을 쓰면 폭발하여 데미지를 준다." - }, - geomancy: { - name: "지오컨트롤", - effect: "1턴째에 에너지를 흡수하여 2턴째에 특수공격, 특수방어, 스피드를 크게 올린다." - }, - magneticFlux: { - name: "자기장조작", - effect: "자기장 조작으로 인해 특성 플러스와 마이너스의 방어, 특수방어가 오른다." - }, - happyHour: { - name: "해피타임", - effect: "해피타임 기술을 쓰면 배틀 후에 받을 수 있는 돈이 배가 된다." - }, - electricTerrain: { - name: "일렉트릭필드", - effect: "5턴 동안 일렉트릭필드로 만든다. 땅에 있는 포켓몬은 잠들지 않는다. 전기타입의 위력이 올라간다." - }, - dazzlingGleam: { - name: "매지컬샤인", - effect: "강력한 빛을 내어 상대에게 데미지를 준다." - }, - celebrate: { - name: "축하", - effect: "포켓몬이 매우 행복한 당신을 축하해 준다." - }, - holdHands: { - name: "손에손잡기", - effect: "같은 편 포켓몬끼리 손에 손을 잡는다. 굉장히 행복한 기분이 들게 된다." - }, - babyDollEyes: { - name: "초롱초롱눈동자", - effect: "초롱초롱한 눈동자로 상대를 바라보며 공격을 떨어뜨린다. 반드시 선제공격할 수 있다." - }, - nuzzle: { - name: "볼부비부비", - effect: "전기가 흐르는 볼을 비벼서 공격한다. 상대를 마비 상태로 만든다." - }, - holdBack: { - name: "적당히손봐주기", - effect: "적당히 공격하여 상대의 HP를 반드시 1은 남긴다." - }, - infestation: { - name: "엉겨붙기", - effect: "4-5턴 동안 상대에게 엉겨 붙어서 공격한다. 그동안 상대는 도망갈 수 없다." - }, - powerUpPunch: { - name: "그로우펀치", - effect: "반복하여 때리면 점점 주먹이 단단해진다. 상대를 때리면 공격이 오른다." - }, - oblivionWing: { - name: "데스윙", - effect: "조준한 상대로부터 HP를 흡수한다. 준 데미지의 반 이상 HP를 회복한다." - }, - thousandArrows: { - name: "사우전드애로", - effect: "떠 있는 포켓몬도 맞힐 수 있다. 떠 있던 상대는 맞아서 땅에 떨어진다." - }, - thousandWaves: { - name: "사우전드웨이브", - effect: "땅 위를 뻗어 나가는 파도로 공격한다. 파도에 휩쓸린 상대는 전투에서 도망칠 수 없게 된다." - }, - landsWrath: { - name: "그라운드포스", - effect: "대지의 힘을 모으고 그 힘을 상대에게 집중시켜서 데미지를 준다." - }, - lightOfRuin: { - name: "파멸의빛", - effect: "영원의 꽃의 파워를 빌려서 강력한 광선을 쏜다. 자신도 상당한 데미지를 입는다." - }, - originPulse: { - name: "근원의파동", - effect: "파랗게 빛나는 무수한 광선으로 상대를 공격한다." - }, - precipiceBlades: { - name: "단애의칼", - effect: "대지의 힘을 칼날로 바꿔 상대를 공격한다." - }, - dragonAscent: { - name: "화룡점정", - effect: "넓은 하늘에서 급속으로 강하하여 상대를 공격한다. 자신의 방어와 특수방어가 떨어진다." - }, - hyperspaceFury: { - name: "이차원러시", - effect: "많은 팔로 방어와 판별 등을 무시하는 연속 공격이다. 자신의 방어가 떨어진다." - }, - breakneckBlitzPhysical: { - name: "울트라대시어택", - effect: "Z파워로 기세를 몰아 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." - }, - breakneckBlitzSpecial: { - name: "울트라대시어택", - effect: "Dummy Data" - }, - allOutPummelingPhysical: { - name: "전력무쌍격렬권", - effect: "Z파워로 만든 에너지 구슬을 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." - }, - allOutPummelingSpecial: { - name: "전력무쌍격렬권", - effect: "Dummy Data" - }, - supersonicSkystrikePhysical: { - name: "파이널다이브클래시", - effect: "Z파워로 기세 좋게 날아올라 상대를 향해 전력으로 낙하한다. 원래 기술에 따라 위력이 변한다." - }, - supersonicSkystrikeSpecial: { - name: "파이널다이브클래시", - effect: "Dummy Data" - }, - acidDownpourPhysical: { - name: "애시드포이즌딜리트", - effect: "Z파워로 독의 늪을 만들어 전력으로 상대를 가라앉힌다. 원래 기술에 따라 위력이 변한다." - }, - acidDownpourSpecial: { - name: "애시드포이즌딜리트", - effect: "Dummy Data" - }, - tectonicRagePhysical: { - name: "라이징랜드오버", - effect: "Z파워로 땅 깊숙이 파고들어 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." - }, - tectonicRageSpecial: { - name: "라이징랜드오버", - effect: "Dummy Data" - }, - continentalCrushPhysical: { - name: "월즈엔드폴", - effect: "Z파워로 큰 바위산을 불러내 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." - }, - continentalCrushSpecial: { - name: "월즈엔드폴", - effect: "Dummy Data" - }, - savageSpinOutPhysical: { - name: "절대포식회전참", - effect: "Z파워로 뱉어낸 실이 전력으로 상대를 붙들어 맨다. 원래 기술에 따라 위력이 변한다." - }, - savageSpinOutSpecial: { - name: "절대포식회전참", - effect: "Dummy Data" - }, - neverEndingNightmarePhysical: { - name: "무한암야로의유인", - effect: "Z파워로 불러낸 강한 원념이 전력으로 상대에게 쏟아진다. 원래 기술에 따라 위력이 변한다." - }, - neverEndingNightmareSpecial: { - name: "무한암야로의유인", - effect: "Dummy Data" - }, - corkscrewCrashPhysical: { - name: "초월나선연격", - effect: "Z파워로 고속 회전을 하여 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." - }, - corkscrewCrashSpecial: { - name: "초월나선연격", - effect: "Dummy Data" - }, - infernoOverdrivePhysical: { - name: "다이내믹풀플레임", - effect: "Z파워로 활활 타는 불꽃을 뱉어내 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." - }, - infernoOverdriveSpecial: { - name: "다이내믹풀플레임", - effect: "Dummy Data" - }, - hydroVortexPhysical: { - name: "슈퍼아쿠아토네이도", - effect: "Z파워로 큰 바다회오리를 만들어 전력으로 상대를 집어삼킨다. 원래 기술에 따라 위력이 변한다." - }, - hydroVortexSpecial: { - name: "슈퍼아쿠아토네이도", - effect: "Dummy Data" - }, - bloomDoomPhysical: { - name: "블룸샤인엑스트라", - effect: "Z파워로 화초들의 에너지를 빌려 전력으로 상대를 공격한다. 원래 기술에 따라 위력이 변한다." - }, - bloomDoomSpecial: { - name: "블룸샤인엑스트라", - effect: "Dummy Data" - }, - gigavoltHavocPhysical: { - name: "스파킹기가볼트", - effect: "Z파워로 비축한 강한 전기를 전력으로 상대에게 부딪친다. 원래 기술에 따라 위력이 변한다." - }, - gigavoltHavocSpecial: { - name: "스파킹기가볼트", - effect: "Dummy Data" - }, - shatteredPsychePhysical: { - name: "맥시멈사이브레이커", - effect: "Z파워로 상대를 조종해 전력으로 매서운 맛을 보여준다. 원래 기술에 따라 위력이 변한다." - }, - shatteredPsycheSpecial: { - name: "맥시멈사이브레이커", - effect: "Dummy Data" - }, - subzeroSlammerPhysical: { - name: "레이징지오프리즈", - effect: "Z파워로 기온을 급격하게 떨어뜨려 전력으로 상대를 얼린다. 원래 기술에 따라 위력이 변한다." - }, - subzeroSlammerSpecial: { - name: "레이징지오프리즈", - effect: "Dummy Data" - }, - devastatingDrakePhysical: { - name: "얼티메이트드래곤번", - effect: "Z파워로 오라를 실체화시켜 전력으로 상대를 공격한다. 원래 기술에 따라 위력이 변한다." - }, - devastatingDrakeSpecial: { - name: "얼티메이트드래곤번", - effect: "Dummy Data" - }, - blackHoleEclipsePhysical: { - name: "블랙홀이클립스", - effect: "Z파워로 어둠의 에너지를 모아 전력으로 상대를 끌어당긴다. 원래 기술에 따라 위력이 변한다." - }, - blackHoleEclipseSpecial: { - name: "블랙홀이클립스", - effect: "Dummy Data" - }, - twinkleTacklePhysical: { - name: "러블리스타임팩트", - effect: "Z파워로 매혹의 공간을 만들어 전력으로 상대를 가지고 논다. 원래 기술에 따라 위력이 변한다." - }, - twinkleTackleSpecial: { - name: "러블리스타임팩트", - effect: "Dummy Data" - }, - catastropika: { - name: "필살피카슛", - effect: "Z파워로 최대 전력을 몸에 두른 피카츄가 전력으로 상대에게 덤벼든다." - }, - shoreUp: { - name: "모래모으기", - effect: "자신의 최대 HP 절반을 회복한다. 모래바람일 때는 많이 회복한다." - }, - firstImpression: { - name: "만나자마자", - effect: "위력이 높은 기술이지만 배틀에 나가서 바로 쓰지 않으면 성공할 수 없다." - }, - banefulBunker: { - name: "토치카", - effect: "상대의 공격을 막음과 동시에 접촉한 상대에게 독을 퍼뜨린다." - }, - spiritShackle: { - name: "그림자꿰매기", - effect: "공격과 동시에 상대의 그림자를 꿰매 도망칠 수 없게 한다." - }, - darkestLariat: { - name: "DD래리어트", - effect: "양팔을 돌려 상대에게 부딪친다. 상대의 능력 변화에 상관없이 데미지를 준다." - }, - sparklingAria: { - name: "물거품아리아", - effect: "노래 부르는 것으로 많은 벌룬을 방출한다. 기술에 맞으면 화상이 낫는다." - }, - iceHammer: { - name: "아이스해머", - effect: "강하고 무거운 주먹을 휘둘러 데미지를 준다. 자신의 스피드가 떨어진다." - }, - floralHealing: { - name: "플라워힐", - effect: "최대 HP의 절반만큼 상대의 HP를 회복한다. 그래스필드일 때 효과가 올라간다." - }, - highHorsepower: { - name: "10만마력", - effect: "온몸을 써서 상대에게 맹렬히 어택한다." - }, - strengthSap: { - name: "힘흡수", - effect: "상대 공격력과 동일하게 자신의 HP를 회복한다. 그리고 상대의 공격을 떨어뜨린다." - }, - solarBlade: { - name: "솔라블레이드", - effect: "1턴째에 빛을 가득 모아 2턴째에 그 힘을 검에 담아 공격한다." - }, - leafage: { - name: "나뭇잎", - effect: "잎을 상대에 맞춰 공격한다." - }, - spotlight: { - name: "스포트라이트", - effect: "포켓몬에게 스포트라이트를 비춰 그 턴에서 그 포켓몬만 공격할 수 있게 한다." - }, - toxicThread: { - name: "독실", - effect: "독이 섞인 실을 뿜어낸다. 상대를 독 상태로 만들고 스피드를 떨어뜨린다." - }, - laserFocus: { - name: "예민해지기", - effect: "정신을 집중해서 다음 공격을 반드시 급소에 맞춘다." - }, - gearUp: { - name: "어시스트기어", - effect: "기어를 넣는 것으로 특성 플러스와 마이너스의 공격과 특수공격이 올라간다." - }, - throatChop: { - name: "지옥찌르기", - effect: "이 기술에 맞은 상대는 지옥의 고통 때문에 2턴 동안 소리 기술을 낼 수 없다." - }, - pollenPuff: { - name: "꽃가루경단", - effect: "상대에게는 폭발하는 경단을 사용하여 공격한다. 같은 편에게는 회복하는 경단을 준다." - }, - anchorShot: { - name: "앵커샷", - effect: "앵커를 상대에게 휘감아서 공격한다. 상대는 도망칠 수 없게 된다." - }, - psychicTerrain: { - name: "사이코필드", - effect: "5턴 동안 땅에 있으면 선제공격을 받지 않는다. 에스퍼타입의 위력이 올라간다." - }, - lunge: { - name: "덤벼들기", - effect: "전력으로 상대에게 덤벼들며 공격한다. 상대의 공격을 떨어뜨린다." - }, - fireLash: { - name: "불꽃채찍", - effect: "불타는 채찍으로 상대를 친다. 공격을 받은 상대는 방어가 떨어진다." - }, - powerTrip: { - name: "기어오르기", - effect: "자신의 강함을 뻐기고 공격한다. 자신의 능력이 올라가 있는 만큼 위력이 오른다." - }, - burnUp: { - name: "불사르기", - effect: "전신의 불꽃을 모두 태워서 큰 데미지를 준다. 자신의 불꽃타입이 없어진다." - }, - speedSwap: { - name: "스피드스왑", - effect: "상대의 스피드와 자신의 스피드를 교체한다." - }, - smartStrike: { - name: "스마트혼", - effect: "뾰족한 뿔로 상대를 꿰찔러서 공격한다. 공격은 반드시 명중한다." - }, - purify: { - name: "정화", - effect: "상대의 상태 이상을 회복한다. 회복하면 자신은 HP를 회복할 수 있다." - }, - revelationDance: { - name: "잠재댄스", - effect: "전력으로 춤추며 공격한다. 이 기술의 타입은 자신의 타입과 같아진다." - }, - coreEnforcer: { - name: "코어퍼니셔", - effect: "데미지를 준 상대가 이미 행동을 끝냈다면 상대의 특성을 없애버린다." - }, - tropKick: { - name: "트로피컬킥", - effect: "남쪽 나라에서 유래된 뜨거운 킥을 상대에게 날린다. 상대의 공격을 떨어뜨린다." - }, - instruct: { - name: "지휘", - effect: "상대에게 지시하여 상대가 쓴 기술을 다시 한번 쓰게 할 수 있다." - }, - beakBlast: { - name: "부리캐논", - effect: "먼저 부리를 가열시킨 다음 공격을 날린다. 가열 중에 만지면 화상을 입는다." - }, - clangingScales: { - name: "스케일노이즈", - effect: "전신의 비늘을 비벼서 큰 소리를 내 공격한다. 공격 후 자신의 방어가 떨어진다." - }, - dragonHammer: { - name: "드래곤해머", - effect: "몸을 해머처럼 써서 상대를 덮쳐 데미지를 준다." - }, - brutalSwing: { - name: "세차게휘두르기", - effect: "자신의 몸을 세차게 휘둘러서 상대에게 데미지를 준다." - }, - auroraVeil: { - name: "오로라베일", - effect: "5턴 동안 물리와 특수 기술의 데미지를 약하게 한다. 설경일 때만 쓸 수 있다." - }, - sinisterArrowRaid: { - name: "섀도애로우즈스트라이크", - effect: "Z파워로 무수한 화살을 만들어낸 모크나이퍼가 전력으로 상대를 꿰뚫는 공격이다." - }, - maliciousMoonsault: { - name: "하이퍼다크크러셔", - effect: "Z파워로 강한 육체를 얻은 어흥염이 전력으로 상대에게 부딪쳐 공격한다." - }, - oceanicOperetta: { - name: "바다의심포니", - effect: "Z파워로 대량의 물을 부른 누리레느가 전력으로 상대를 공격한다." - }, - guardianOfAlola: { - name: "알로라의수호자", - effect: "Z파워로 알로라의 힘을 얻은 토속신포켓몬 전력의 공격. 상대의 남은 HP를 많이 줄인다." - }, - soulStealing7StarStrike: { - name: "칠성탈혼퇴", - effect: "Z파워를 얻은 마샤도가 펀치와 킥의 연속기술을 전력으로 상대에게 퍼붓는다." - }, - stokedSparksurfer: { - name: "라이트닝서프라이드", - effect: "Z파워를 얻은 알로라지방의 라이츄가 전력으로 공격한다. 상대를 마비 상태로 만든다." - }, - pulverizingPancake: { - name: "진심의공격", - effect: "Z파워로 진심을 낸 잠만보가 거대한 몸을 움직여서 전력으로 상대를 공격한다." - }, - extremeEvoboost: { - name: "나인이볼부스트", - effect: "Z파워를 얻은 이브이가 진화한 동료들의 힘을 빌려 능력을 크게 올린다." - }, - genesisSupernova: { - name: "오리진즈슈퍼노바", - effect: "Z파워를 얻은 뮤가 전력으로 상대를 공격한다. 발밑이 사이코필드가 된다." - }, - shellTrap: { - name: "트랩셸", - effect: "껍질의 트랩을 설치한다. 상대가 물리 기술을 쓰면 폭발해서 데미지를 준다." - }, - fleurCannon: { - name: "플뢰르캐논", - effect: "강력한 빔을 발산한 후 자신의 특수공격이 크게 떨어진다." - }, - psychicFangs: { - name: "사이코팽", - effect: "사이코 파워로 물어서 상대를 공격한다. 빛의장막이나 리플렉터도 파괴할 수 있다." - }, - stompingTantrum: { - name: "분함의발구르기", - effect: "분함을 발판 삼아 공격한다. 앞 턴에서 기술이 빗나갔다면 위력이 배가 된다." - }, - shadowBone: { - name: "섀도본", - effect: "영혼이 머물고 있는 뼈로 상대를 세게 때려서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." - }, - accelerock: { - name: "액셀록", - effect: "재빠른 스피드로 상대에게 부딪쳐서 공격한다. 반드시 선제공격할 수 있다." - }, - liquidation: { - name: "아쿠아브레이크", - effect: "물의 힘으로 상대에게 부딪쳐서 공격한다. 상대의 방어를 떨어뜨릴 때가 있다." - }, - prismaticLaser: { - name: "프리즘레이저", - effect: "프리즘의 힘으로 강력한 광선을 발사한다. 다음 턴은 움직일 수 없다." - }, - spectralThief: { - name: "섀도스틸", - effect: "상대의 그림자에 숨어들어 상대의 능력이 올라가는 것을 뺏어 공격한다." - }, - sunsteelStrike: { - name: "메테오드라이브", - effect: "유성 같은 기세로 돌진한다. 상대의 특성을 무시하고 공격할 수 있다." - }, - moongeistBeam: { - name: "섀도레이", - effect: "괴상한 광선을 쏘아 공격한다. 상대의 특성을 무시하고 공격할 수 있다." - }, - tearfulLook: { - name: "눈물그렁그렁", - effect: "눈물을 그렁그렁거려 상대의 전의를 상실하게 한다. 상대의 공격과 특수공격이 떨어진다." - }, - zingZap: { - name: "찌리리따끔따끔", - effect: "상대에게 부딪쳐 강력한 전기를 날려서 찌리리따끔따끔하게 만든다. 상대를 풀죽게 만들 때가 있다." - }, - naturesMadness: { - name: "자연의분노", - effect: "자연의 분노를 상대에게 부딪친다. 상대의 HP는 절반이 된다." - }, - multiAttack: { - name: "멀티어택", - effect: "높은 에너지를 둘러싸 상대에게 부딪쳐 공격한다. 메모리에 따라 타입이 바뀐다." - }, - tenMillionVoltThunderbolt: { - name: "1000만볼트", - effect: "모자를 쓴 피카츄가 Z파워로 파워업한 전격을 쏜다. 급소에 맞기 쉽다." - }, - mindBlown: { - name: "깜짝헤드", - effect: "자신의 머리를 폭발시켜 주위의 모든 것을 공격한다. 자신도 데미지를 받는다." - }, - plasmaFists: { - name: "플라스마피스트", - effect: "전기를 두른 주먹으로 공격한다. 노말타입 기술을 전기타입으로 바꿔버린다." - }, - photonGeyser: { - name: "포톤가이저", - effect: "빛의 기둥으로 공격한다. 공격과 특수공격을 비교해서 높은 쪽으로 데미지를 준다." - }, - lightThatBurnsTheSky: { - name: "하늘을태우는멸망의빛", - effect: "네크로즈마가 상대의 특성 효과를 무시하고 공격과 특수공격 중 높은 쪽으로 데미지를 준다." - }, - searingSunrazeSmash: { - name: "선샤인스매셔", - effect: "Z파워를 얻은 솔가레오가 전력으로 공격한다. 상대의 특성 효과를 무시할 수 있다." - }, - menacingMoonrazeMaelstrom: { - name: "문라이트블래스터", - effect: "Z파워를 얻은 루나아라가 전력으로 공격한다. 상대의 특성 효과를 무시할 수 있다." - }, - letsSnuggleForever: { - name: "투닥투닥프렌드타임", - effect: "Z파워를 얻은 따라큐가 전력으로 투닥투닥 공격한다." - }, - splinteredStormshards: { - name: "레이디얼에지스톰", - effect: "Z파워를 얻은 루가루암이 전력으로 공격한다. 추가로 필드 상태를 없앤다." - }, - clangorousSoulblaze: { - name: "브레이징소울비트", - effect: "Z파워를 얻은 짜랑고우거가 전력으로 상대를 공격한다. 추가로 자신의 능력이 올라간다." - }, - zippyZap: { - name: "파찌파찌액셀", - /* 임의번역 (렛츠고 신규 기술) */ - effect: "맹렬한 속도의 전격 공격. 반드시 선제공격할 수 있고 자신의 회피율을 높인다." - }, - splishySplash: { - name: "참방참방서핑", - effect: "커다란 파도에 전기를 날리고 상대에게 부딪쳐서 공격한다. 마비 상태로 만들 때가 있다." - }, - floatyFall: { - name: "둥실둥실폴", - effect: "두둥실 떠오른 다음 단숨에 급강하해서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - pikaPapow: { - name: "피카피카썬더", - effect: "트레이너를 좋아하는 피카츄의 마음이 강할수록 위력이 올라가는 전격. 반드시 명중한다." - }, - bouncyBubble: { - name: "생생버블", - effect: "물덩어리를 부딪쳐서 공격한다. 물을 흡수하여 준 데미지만큼 HP를 회복한다." - }, - buzzyBuzz: { - name: "찌릿찌릿일렉", - effect: "전기를 상대에게 날려서 공격한다. 상대를 마비 상태로 만든다." - }, - sizzlySlide: { - name: "이글이글번", - effect: "불꽃을 두른 몸으로 기세 좋게 상대에게 부딪친다. 상대를 화상 상태로 만든다." - }, - glitzyGlow: { - name: "콸콸오라", - effect: "염동력을 한가득 날린다. 상대의 특수공격을 약하게 만드는 이상한 장막을 만든다." - }, - baddyBad: { - name: "아그아그존", - effect: "악함을 어필해서 공격한다. 상대의 물리공격을 약하게 만드는 이상한 장막을 만든다." - }, - sappySeed: { - name: "쑥쑥봄버", - effect: "거대한 덩굴을 자라게 하고 씨를 흩뿌려서 공격한다. 씨는 매 턴 상대의 HP를 흡수한다." - }, - freezyFrost: { - name: "꽁꽁프로스트", - effect: "차갑게 얼어붙은 흑안개의 결정으로 공격한다. 전원의 능력 변화를 원래대로 돌린다." - }, - sparklySwirl: { - name: "반짝반짝스톰", - effect: "숨 막힐 듯 진한 향기의 회오리로 상대를 휘감아 공격한다. 같은 편의 상태 이상을 회복한다." - }, - veeveeVolley: { - name: "브이브이브레이크", - effect: "트레이너를 좋아하는 이브이의 마음이 강할수록 위력이 올라가는 몸통박치기. 반드시 명중한다." - }, - doubleIronBash: { - name: "더블펀처", - effect: "가슴의 너트를 축으로 회전시켜 2번 연속 팔로 힘껏 친다. 상대를 풀죽게 만들 때가 있다." - }, - maxGuard: { - name: "다이월", - effect: "상대의 공격을 전혀 받지 않는다. 연속으로 쓰면 실패하기 쉽다." - }, - dynamaxCannon: { - name: "다이맥스포", - /* 다이맥스에서 200레벨로 조건 변경 */ - effect: "코어에서 빔을 발사해서 공격한다. 상대의 레벨이 200보다 크면 데미지가 2배가 된다." - }, - snipeShot: { - name: "노려맞히기", - effect: "상대의 기술을 끌어모으는 특성이나 기술의 영향을 무시하고 선택한 상대를 공격할 수 있다." - }, - jawLock: { - name: "물고버티기", - effect: "어느 한쪽이 기절할 때까지 교체할 수 없게 된다. 한쪽의 포켓몬이 없어지면 효과가 사라진다." - }, - stuffCheeks: { - name: "볼가득넣기", - effect: "지니고 있는 나무열매를 먹고 방어를 크게 올린다." - }, - noRetreat: { - name: "배수의진", - effect: "자신의 모든 능력이 올라가지만 교체하거나 도망칠 수 없게 된다." - }, - tarShot: { - name: "타르샷", - effect: "끈적끈적한 타르를 날려서 상대의 스피드를 떨어뜨린다. 상대는 불꽃이 약점이 된다." - }, - magicPowder: { - name: "마법가루", - effect: "마법가루를 날려서 상대를 에스퍼타입으로 바꾼다." - }, - dragonDarts: { - name: "드래곤애로", - effect: "드라꼰으로 2번 공격한다. 상대가 2마리일 때는 각각 1번씩 공격한다." - }, - teatime: { - name: "다과회", - effect: "다과회를 열어서 배틀에 나와 있는 포켓몬이 각각 지니고 있는 나무열매를 먹는다." - }, - octolock: { - name: "문어굳히기", - effect: "상대를 도망칠 수 없게 한다. 굳히기에 당한 상대는 매 턴 방어와 특수방어가 떨어진다." - }, - boltBeak: { - name: "전격부리", - effect: "전기를 두른 부리로 찌른다. 상대보다 먼저 공격하면 기술의 위력은 2배가 된다." - }, - fishiousRend: { - name: "아가미물기", - effect: "단단한 아가미로 문다. 상대보다 먼저 공격하면 기술의 위력은 2배가 된다." - }, - courtChange: { - name: "코트체인지", - effect: "이상한 힘으로 서로의 필드 효과를 교체한다." - }, - maxFlare: { - name: "다이번", - effect: "다이맥스한 포켓몬이 날리는 불꽃타입의 공격. 5턴 동안 햇살을 강하게 만든다." - }, - maxFlutterby: { - name: "다이웜", - effect: "다이맥스한 포켓몬이 날리는 벌레타입의 공격. 상대의 특수공격을 떨어뜨린다." - }, - maxLightning: { - name: "다이썬더", - effect: "다이맥스한 포켓몬이 날리는 전기타입의 공격. 5턴 동안 일렉트릭필드로 만든다." - }, - maxStrike: { - name: "다이어택", - effect: "다이맥스한 포켓몬이 날리는 노말타입의 공격. 상대의 스피드를 떨어뜨린다." - }, - maxKnuckle: { - name: "다이너클", - effect: "다이맥스한 포켓몬이 날리는 격투타입의 공격. 같은 편의 공격을 올린다." - }, - maxPhantasm: { - name: "다이할로우", - effect: "다이맥스한 포켓몬이 날리는 고스트타입의 공격. 상대의 방어를 떨어뜨린다." - }, - maxHailstorm: { - name: "다이아이스", - effect: "다이맥스한 포켓몬이 날리는 얼음타입의 공격. 5턴 동안 싸라기눈을 내리게 한다." - }, - maxOoze: { - name: "다이애시드", - effect: "다이맥스한 포켓몬이 날리는 독타입의 공격. 같은 편의 특수공격을 올린다." - }, - maxGeyser: { - name: "다이스트림", - effect: "다이맥스한 포켓몬이 날리는 물타입의 공격. 5턴 동안 비를 내리게 한다." - }, - maxAirstream: { - name: "다이제트", - effect: "다이맥스한 포켓몬이 날리는 비행타입의 공격. 같은 편의 스피드를 올린다." - }, - maxStarfall: { - name: "다이페어리", - effect: "다이맥스한 포켓몬이 날리는 페어리타입의 공격. 5턴 동안 미스트필드로 만든다." - }, - maxWyrmwind: { - name: "다이드라군", - effect: "다이맥스한 포켓몬이 날리는 드래곤타입의 공격. 상대의 공격을 떨어뜨린다." - }, - maxMindstorm: { - name: "다이사이코", - effect: "다이맥스한 포켓몬이 날리는 에스퍼타입의 공격. 5턴 동안 사이코필드로 만든다." - }, - maxRockfall: { - name: "다이록", - effect: "다이맥스한 포켓몬이 날리는 바위타입의 공격. 5턴 동안 날씨를 모래바람으로 만든다." - }, - maxQuake: { - name: "다이어스", - effect: "다이맥스한 포켓몬이 날리는 땅타입의 공격. 같은 편의 특수방어를 올린다." - }, - maxDarkness: { - name: "다이아크", - effect: "다이맥스한 포켓몬이 날리는 악타입의 공격. 상대의 특수방어를 떨어뜨린다." - }, - maxOvergrowth: { - name: "다이그래스", - effect: "다이맥스한 포켓몬이 날리는 풀타입의 공격. 5턴 동안 그래스필드로 만든다." - }, - maxSteelspike: { - name: "다이스틸", - effect: "다이맥스한 포켓몬이 날리는 강철타입의 공격. 같은 편의 방어를 올린다." - }, - clangorousSoul: { - name: "소울비트", - effect: "자신의 HP를 조금 깎아서 모든 능력을 올린다." - }, - bodyPress: { - name: "바디프레스", - effect: "몸을 부딪쳐서 공격한다. 방어가 높을수록 주는 데미지가 올라간다." - }, - decorate: { - name: "데코레이션", - effect: "데코레이션을 해서 상대의 공격과 특수공격을 크게 올린다." - }, - drumBeating: { - name: "드럼어택", - effect: "드럼의 뿌리를 연주로 조종해서 공격하는 것으로 상대의 스피드를 떨어뜨린다." - }, - snapTrap: { - name: "집게덫", - effect: "집게덫으로 붙잡은 뒤 4-5턴 동안 상대를 끼워서 공격한다." - }, - pyroBall: { - name: "화염볼", - effect: "작은 돌을 태운 불꽃의 공으로 상대를 공격한다. 화상 상태로 만들 때가 있다." - }, - behemothBlade: { - name: "거수참", - effect: "크고 강한 검을 온몸으로 치켜든 다음 기세 좋게 베어서 공격한다." - }, - behemothBash: { - name: "거수탄", - effect: "온몸을 강하고 튼튼한 방패로 바꾼 다음 기세 좋게 부딪혀서 공격한다." - }, - auraWheel: { - name: "오라휠", - effect: "볼주머니에 저장해둔 에너지로 공격하고 자신의 스피드를 올린다. 모르페코의 모습에 따라 타입이 바뀐다." - }, - breakingSwipe: { - name: "와이드브레이커", - effect: "강인한 꼬리를 세차게 휘둘러서 상대를 공격한다. 상대의 공격을 떨어뜨린다." - }, - branchPoke: { - name: "가지찌르기", - effect: "날카롭고 뾰족한 가지로 상대를 찔러서 공격한다." - }, - overdrive: { - name: "오버드라이브", - effect: "기타나 베이스를 쳐서 큰 울림과 강한 진동을 상대에게 전달하여 공격한다." - }, - appleAcid: { - name: "사과산", - effect: "새콤한 사과에서 만들어 낸 산성 액체로 공격한다. 상대의 특수방어를 떨어뜨린다." - }, - gravApple: { - name: "G의힘", - effect: "높은 곳에서 사과를 떨어뜨려서 데미지를 준다. 상대의 방어를 떨어뜨린다." - }, - spiritBreak: { - name: "소울크래시", - effect: "맞으면 기가 꺾여버릴 것 같은 기세로 공격한다. 상대의 특수공격을 떨어뜨린다." - }, - strangeSteam: { - name: "원더스팀", - effect: "연기를 분출해서 상대를 공격한다. 혼란시킬 때가 있다." - }, - lifeDew: { - name: "생명의물방울", - effect: "신비한 물을 흩뿌려서 자신과 배틀에 나와 있는 같은 편의 HP를 회복한다." - }, - obstruct: { - name: "블로킹", - effect: "상대의 공격을 전혀 받지 않는다. 연속으로 쓰면 실패하기 쉽다. 접촉한 상대의 방어를 크게 떨어뜨린다." - }, - falseSurrender: { - name: "사죄의찌르기", - effect: "고개를 숙이는 척하면서 흐트러진 머리카락으로 찌른다. 공격은 반드시 명중한다." - }, - meteorAssault: { - name: "스타어설트", - effect: "굵은 줄기를 휘둘러서 공격한다. 단 자신도 비틀거리기 때문에 다음 턴은 움직일 수 없다." - }, - eternabeam: { - name: "무한다이빔", - effect: "본래의 모습이 된 무한다이노 최대의 공격. 다음 턴은 움직일 수 없다." - }, - steelBeam: { - name: "철제광선", - effect: "전신에서 끌어모은 강철을 빔으로 바꿔 세차게 발사한다. 자신도 데미지를 받는다." - }, - expandingForce: { - name: "와이드포스", - effect: "사이코 파워로 상대를 공격한다. 사이코필드일 때는 위력이 오르며 모든 상대에게 데미지를 준다." - }, - steelRoller: { - name: "아이언롤러", - effect: "필드를 파괴하면서 공격한다. 필드가 어떤 상태로든 변해 있지 않은 경우 기술은 실패한다." - }, - scaleShot: { - name: "스케일샷", - effect: "비늘을 쏘아서 공격한다. 2-5회 동안 연속으로 쓴다. 스피드가 올라가지만 방어가 떨어진다." - }, - meteorBeam: { - name: "메테오빔", - effect: "1턴째에 우주의 힘을 모아서 특수공격을 올리고 2턴째에 상대를 공격한다." - }, - shellSideArm: { - name: "셸암즈", - effect: "물리와 특수 중 더 많은 데미지를 줄 수 있는 능력으로 공격한다. 독 상태로 만들 때가 있다." - }, - mistyExplosion: { - name: "미스트버스트", - effect: "자신의 주위에 있는 모두를 공격하지만 사용하면 기절한다. 미스트필드일 때 위력이 올라간다." - }, - grassyGlide: { - name: "그래스슬라이더", - effect: "지면에 미끄러지듯 상대를 공격한다. 그래스필드일 때 반드시 선제공격할 수 있다." - }, - risingVoltage: { - name: "라이징볼트", - effect: "지면에서 올라오는 전격으로 공격한다. 상대가 일렉트릭필드 위에 있을 때 기술의 위력이 2배가 된다." - }, - terrainPulse: { - name: "대지의파동", - effect: "필드의 힘을 빌려서 공격한다. 사용했을 때의 필드 상태에 따라서 기술 타입과 위력이 바뀐다." - }, - skitterSmack: { - name: "엄습하는일격", - effect: "배후에서 엄습해서 공격한다. 상대의 특수공격을 떨어뜨린다." - }, - burningJealousy: { - name: "질투의불꽃", - effect: "질투의 에너지로 상대를 공격한다. 그 턴에 능력이 올라간 포켓몬을 화상 상태로 만든다." - }, - lashOut: { - name: "분풀이", - effect: "상대에 대한 울분이 담긴 공격을 한다. 그 턴에 능력이 떨어져 있으면 기술의 위력이 2배가 된다." - }, - poltergeist: { - name: "폴터가이스트", - effect: "상대의 지닌 물건을 조종해서 공격한다. 상대가 도구를 지니고 있지 않으면 실패한다." - }, - corrosiveGas: { - name: "부식가스", - effect: "주위에 있는 모든 것을 강력한 산성 가스로 뒤덮어서 지니고 있는 도구를 녹여버린다." - }, - coaching: { - name: "코칭", - effect: "적절한 지도를 통해서 같은 편 전원의 공격과 방어를 올린다." - }, - flipTurn: { - name: "퀵턴", - effect: "공격한 뒤 굉장한 스피드로 돌아와서 교대 포켓몬과 교체한다." - }, - tripleAxel: { - name: "트리플악셀", - effect: "3회 연속으로 킥을 날려 공격한다. 기술이 맞을 때마다 위력이 올라간다." - }, - dualWingbeat: { - name: "더블윙", - effect: "날개를 상대에게 부딪쳐서 공격한다. 2회 연속으로 데미지를 준다." - }, - scorchingSands: { - name: "열사의대지", - effect: "뜨겁게 달궈진 모래를 상대에게 부딪쳐서 공격한다. 화상 상태로 만들 때가 있다." - }, - jungleHealing: { - name: "정글힐", - effect: "정글과 하나가 되어 자신과 배틀에 나와 있는 같은 편의 HP와 모든 상태를 회복한다." - }, - wickedBlow: { - name: "암흑강타", - effect: "악의 태세가 극에 달하여 강렬한 일격을 날린다. 반드시 급소에 맞는다." - }, - surgingStrikes: { - name: "수류연타", - effect: "물의 태세가 극에 달하여 물 흐르듯 3회의 연격을 날린다. 반드시 급소에 맞는다." - }, - thunderCage: { - name: "썬더프리즌", - effect: "전기가 흐르는 우리 안에 4-5턴 동안 상대를 가두어 공격한다." - }, - dragonEnergy: { - name: "드래곤에너지", - effect: "생명력을 파워로 바꿔서 상대를 공격한다. 자신의 HP가 적을수록 기술의 위력이 떨어진다." - }, - freezingGlare: { - name: "얼어붙는시선", - effect: "두 눈에서 사이코 파워를 발사해서 공격한다. 얼음 상태로 만들 때가 있다." - }, - fieryWrath: { - name: "타오르는분노", - effect: "분노를 불꽃 같은 오라로 바꿔서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - thunderousKick: { - name: "천둥차기", - effect: "번개 같은 움직임으로 상대를 농락하며 킥을 날린다. 상대의 방어를 떨어뜨린다." - }, - glacialLance: { - name: "블리자드랜스", - effect: "눈보라를 두른 얼음의 창을 상대에게 던져서 공격한다." - }, - astralBarrage: { - name: "아스트랄비트", - effect: "수많은 작은 영체를 상대에게 부딪쳐서 공격한다." - }, - eerieSpell: { - name: "섬뜩한주문", - effect: "강력한 사이코 파워로 공격한다. 상대가 마지막으로 사용한 기술의 PP를 3만큼 줄인다." - }, - direClaw: { - name: "페이탈클로", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "치명적인 손톱으로 공격한다. 상대를 독, 마비, 잠듦 중 하나의 상태로 만들 때가 있다." - }, - psyshieldBash: { - name: "배리어러시", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "사념의 에너지를 두른 채로 상대에게 부딪친다. 자신의 방어를 올린다." - }, - powerShift: { - name: "파워시프트", - effect: "자신의 공격력과 방어력을 바꾼다." - }, - stoneAxe: { - name: "암석액스", - effect: "암석 도끼로 공격한다. 흩어진 암석 파편은 상대의 주위에 떠다니게 된다." - }, - springtideStorm: { - name: "봄의폭풍", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "애증 섞인 강렬한 바람으로 상대를 둘러싸서 공격한다. 상대의 공격을 떨어뜨릴 때가 있다." - }, - mysticalPower: { - name: "신비의힘", - effect: "신비한 힘으로 자신을 강화한다. 자신의 특수공격이 올라간다." - }, - ragingFury: { - name: "대격분", - effect: "2~3턴 동안 불꽃을 마구 뿜어 대며 난동을 부린다. 난동 부린 뒤에는 혼란에 빠진다." - }, - waveCrash: { - name: "웨이브태클", - effect: "물을 두르고 온몸으로 상대에게 부딪친다. 자신도 상당한 데미지를 입는다." - }, - chloroblast: { - name: "클로로블라스트", - effect: "엽록소를 모은 뒤 발사하여 공격한다. 자신도 데미지를 입는다." - }, - mountainGale: { - name: "빙산바람", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "빙산처럼 커다란 얼음덩어리를 부딪쳐서 공격한다. 상대를 풀죽게 만들 때가 있다." - }, - victoryDance: { - name: "승리의춤", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "승리를 부르는 춤을 격렬하게 춘다. 자신의 공격과 방어와 스피드를 올린다." - }, - headlongRush: { - name: "들이받기", - effect: "온 힘을 다한 몸통박치기를 날린다. 자신의 방어와 특수방어가 떨어진다." - }, - barbBarrage: { - name: "독침천밭", - effect: "무수히 많은 독침으로 공격한다. 상대를 독 상태로 만들 때가 있다. 상대가 독 상태인 경우 위력이 2배가 된다." - }, - esperWing: { - name: "오라윙", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "오라로 강화한 날개로 베어 가른다. 급소에 맞기 쉽다. 자신의 스피드를 올린다." - }, - bitterMalice: { - name: "천추지한", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "등골이 서늘해지는 원념으로 공격해서 상대의 공격을 떨어뜨린다." - }, - shelter: { - name: "농성", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "피부를 강철 방패처럼 단단하게 만들어서 자신의 방어를 크게 올린다." - }, - tripleArrows: { - name: "3연화살", - effect: "발 기술을 사용하고 3개의 화살을 동시에 발사한다. 상대의 방어를 떨어뜨리거나 풀죽게 만들 때가 있다. 급소에 맞기 쉽다." - }, - infernalParade: { - name: "백귀야행", - effect: "무수히 많은 불덩이로 공격한다. 화상 상태로 만들 때가 있다. 상대가 상태 이상인 경우 위력이 2배가 된다." - }, - ceaselessEdge: { - name: "비검천중파", - effect: "조개껍질 검으로 공격한다. 조개껍질 파편은 압정이 되어 상대의 발밑에 흩어진다." - }, - bleakwindStorm: { - name: "찬바람폭풍", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "심신을 모두 떨게 만드는 차갑고도 거친 바람으로 공격한다. 상대의 스피드를 떨어뜨릴 때가 있다." - }, - wildboltStorm: { - name: "번개폭풍", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "폭풍을 일으키고 뇌운을 불러서 번개와 바람으로 매섭게 공격한다. 상대를 마비 상태로 만들 때가 있다." - }, - sandsearStorm: { - name: "열사의폭풍", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "뜨겁게 달궈진 모래와 강렬한 바람으로 상대를 둘러싸서 공격한다. 상대를 화상 상태로 만들 때가 있다." - }, - lunarBlessing: { - name: "초승달의기도", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "초승달에 기도를 하여 자신과 같은 편의 HP와 상태 이상을 모두 회복한다." - }, - takeHeart: { - name: "브레이브차지", - /* 임의번역 (레전드 아르세우스 신규 기술) */ - effect: "기운을 고조시켜서 자신의 상태 이상을 회복하고 특수공격과 특수방어를 올린다." - }, - gMaxWildfire: { - name: "거다이옥염", - effect: "거다이맥스한 리자몽이 사용하는 불꽃타입 공격. 4턴 동안 데미지를 준다." - }, - gMaxBefuddle: { - name: "거다이고혹", - effect: "거다이맥스한 버터플이 사용하는 벌레타입 공격. 독 마비 잠듦 중 어느 하나로 만든다." - }, - gMaxVoltCrash: { - name: "거다이만뢰", - effect: "거다이맥스한 피카츄가 사용하는 전기타입 공격. 상대를 마비 상태로 만든다." - }, - gMaxGoldRush: { - name: "거다이금화", - effect: "거다이맥스한 나옹이 사용하는 노말타입 공격. 상대를 혼란시키고 돈도 받을 수 있다." - }, - gMaxChiStrike: { - name: "거다이회심격", - effect: "거다이맥스한 괴력몬이 사용하는 격투타입 공격. 급소에 맞기 쉬워진다." - }, - gMaxTerror: { - name: "거다이환영", - effect: "거다이맥스한 팬텀이 사용하는 고스트타입 공격. 그림자를 밟아 교체할 수 없게 한다." - }, - gMaxResonance: { - name: "거다이선율", - effect: "거다이맥스한 라프라스가 사용하는 얼음타입 공격. 5턴 동안 데미지를 약하게 한다." - }, - gMaxCuddle: { - name: "거다이포옹", - effect: "거다이맥스한 이브이가 사용하는 노말타입 공격. 상대를 헤롱헤롱하게 만든다." - }, - gMaxReplenish: { - name: "거다이재생", - effect: "거다이맥스한 잠만보가 사용하는 노말타입 공격. 먹은 나무열매를 재생한다." - }, - gMaxMalodor: { - name: "거다이악취", - effect: "거다이맥스한 더스트나가 사용하는 독타입 공격. 상대를 독 상태로 만든다." - }, - gMaxStonesurge: { - name: "거다이암진", - effect: "거다이맥스한 갈가부기가 사용하는 물타입 공격. 예리한 바위를 무수히 뿌린다." - }, - gMaxWindRage: { - name: "거다이풍격", - effect: "거다이맥스한 아머까오가 사용하는 비행타입 공격. 리플렉터나 빛의장막을 없앤다." - }, - gMaxStunShock: { - name: "거다이감전", - /* 임의번역 (이벤트 맥스레이드 및 갑옷의외딴섬 한정 포켓몬 기술) */ - effect: "거다이맥스한 스트린더가 사용하는 전기타입 공격. 독이나 마비 상태로 만든다." - }, - gMaxFinale: { - name: "거다이단원", - effect: "거다이맥스한 마휘핑이 사용하는 페어리타입 공격. 같은 편의 HP를 회복한다." - }, - gMaxDepletion: { - name: "거다이감쇠", - effect: "거다이맥스한 두랄루돈이 사용하는 드래곤타입 공격. 마지막에 사용한 기술의 PP를 줄인다." - }, - gMaxGravitas: { - name: "거다이천도", - effect: "거다이맥스한 이올브가 사용하는 에스퍼타입 공격. 5턴 동안 중력이 바뀐다." - }, - gMaxVolcalith: { - name: "거다이분석", - effect: "거다이맥스한 석탄산이 사용하는 바위타입 공격. 4턴 동안 데미지를 준다." - }, - gMaxSandblast: { - name: "거다이사진", - effect: "거다이맥스한 사다이사가 사용하는 땅타입 공격. 4-5턴 동안 거친 모래바람이 분다." - }, - gMaxSnooze: { - name: "거다이수마", - effect: "거다이맥스한 오롱털이 사용하는 악타입 공격. 큰 하품으로 졸음을 유도한다." - }, - gMaxTartness: { - name: "거다이산격", - effect: "거다이맥스한 애프룡이 사용하는 풀타입 공격. 상대의 회피율을 떨어뜨린다." - }, - gMaxSweetness: { - name: "거다이감로", - effect: "거다이맥스한 단지래플이 사용하는 풀타입 공격. 같은 편의 상태 이상을 회복한다." - }, - gMaxSmite: { - name: "거다이천벌", - effect: "거다이맥스한 브리무음이 사용하는 페어리타입 공격. 상대를 혼란시킨다." - }, - gMaxSteelsurge: { - name: "거다이강철진", - effect: "거다이맥스한 대왕끼리동이 사용하는 강철타입 공격. 예리한 가시를 무수히 뿌린다." - }, - gMaxMeltdown: { - name: "거다이융격", - /* 임의번역 (Go 연동 포켓몬 기술) */ - effect: "거다이맥스한 멜메탈이 사용하는 강철타입 공격. 똑같은 기술을 2회 연속으로 쓸 수 없게 한다." - }, - gMaxFoamBurst: { - name: "거다이포말", - effect: "거다이맥스한 킹크랩이 사용하는 물타입 공격. 상대의 스피드를 크게 떨어뜨린다." - }, - gMaxCentiferno: { - name: "거다이백화", - effect: "거다이맥스한 다태우지네가 사용하는 불꽃타입 공격. 4-5턴 동안 불꽃 속에 가둔다." - }, - gMaxVineLash: { - name: "거다이편달", - effect: "거다이맥스한 이상해꽃이 사용하는 풀타입 공격. 4턴 동안 데미지를 준다." - }, - gMaxCannonade: { - name: "거다이포격", - effect: "거다이맥스한 거북왕이 사용하는 물타입 공격. 4턴 동안 데미지를 준다." - }, - gMaxDrumSolo: { - name: "거다이난타", - effect: "거다이맥스한 고릴타가 사용하는 풀타입 공격. 상대의 특성에 영향을 받지 않는다." - }, - gMaxFireball: { - name: "거다이화염구", - effect: "거다이맥스한 에이스번이 사용하는 불꽃타입 공격. 상대의 특성에 영향을 받지 않는다." - }, - gMaxHydrosnipe: { - name: "거다이저격", - effect: "거다이맥스한 인텔리레온이 사용하는 물타입 공격. 상대의 특성에 영향을 받지 않는다." - }, - gMaxOneBlow: { - name: "거다이일격", - effect: "거다이맥스한 우라오스가 사용하는 악타입 공격. 다이월을 무시하는 일격을 날린다." - }, - gMaxRapidFlow: { - name: "거다이연격", - effect: "거다이맥스한 우라오스가 사용하는 물타입 공격. 다이월을 무시하는 연격을 날린다." - }, - teraBlast: { - name: "테라버스트", - effect: "테라스탈 중이면, 테라스탈타입의 에너지를 방출해서 공격한다. 공격과 특수공격을 비교해서 높은 쪽으로 데미지를 준다." - }, - silkTrap: { - name: "스레드트랩", - effect: "실로 함정을 만들어 둘러친다. 상대의 공격을 막음과 동시에 접촉한 상대의 스피드를 떨어뜨린다." - }, - axeKick: { - name: "발꿈치찍기", - effect: "발꿈치를 들어 올린 뒤 내리찍어 공격한다. 상대를 혼란시킬 때가 있다. 빗나가면 자신이 데미지를 입는다." - }, - lastRespects: { - name: "성묘", - effect: "동료의 한을 풀어 주기 위해 공격한다. 쓰러진 같은 편 포켓몬이 많을수록 기술의 위력이 올라간다." - }, - luminaCrash: { - name: "루미나콜리전", - effect: "정신에도 작용하는 기묘한 빛을 발산해서 공격한다. 상대의 특수방어를 크게 떨어뜨린다." - }, - orderUp: { - name: "한판내기", - effect: "멋들어진 몸놀림으로 공격한다. 입속에 싸리용이 있으면 싸리용의 모습에 따라 능력이 올라간다." - }, - jetPunch: { - name: "제트펀치", - effect: "거센 물살을 주먹에 둘러 눈에 보이지 않는 속도로 펀치를 날린다. 반드시 선제공격할 수 있다." - }, - spicyExtract: { - name: "하바네로엑기스", - effect: "어마어마하게 매운 엑기스를 발사한다. 상대의 공격이 크게 오르고 방어는 크게 떨어진다." - }, - spinOut: { - name: "휠스핀", - effect: "발에 부하를 걸어 격렬하게 회전하며 데미지를 준다. 자신의 스피드가 크게 떨어진다." - }, - populationBomb: { - name: "찍찍베기", - effect: "여기저기서 동료들을 모아서 화려한 콤비네이션으로 공격한다. 1~10회 연속으로 공격한다." - }, - iceSpinner: { - name: "아이스스피너", - effect: "발에 얇은 얼음을 두르고 빙글빙글 회전하며 부딪친다. 회전 운동에 의해 필드가 파괴된다." - }, - glaiveRush: { - name: "대검돌격", - effect: "몸을 내던지는 무모한 돌격. 기술을 사용한 다음, 상대의 공격이 반드시 명중하고 데미지를 2배로 입게 된다." - }, - revivalBlessing: { - name: "회생의기도", - effect: "자애로운 마음으로 기도를 하여 기절한 교대 포켓몬을 HP가 절반인 상태로 부활시킨다." - }, - saltCure: { - name: "소금절이", - effect: "상대를 소금절이 상태로 만들어 매 턴 데미지를 준다. 강철타입이나 물타입에게 더 고통스럽다." - }, - tripleDive: { - name: "트리플다이브", - effect: "호흡이 척척 맞게 다이빙해서 상대에게 물보라를 끼얹는다. 3회 연속으로 데미지를 준다." - }, - mortalSpin: { - name: "킬러스핀", - effect: "회전해서 상대를 공격한다. 조이기, 김밥말이, 씨뿌리기 등의 효과를 날려버린다. 상대를 독 상태로 만든다." - }, - doodle: { - name: "베껴그리기", - effect: "상대의 본질을 꿰뚫어 보고 베껴서 자신과 같은 편을 상대와 같은 특성으로 바꾼다." - }, - filletAway: { - name: "제살깎기", - effect: "자신의 HP를 깎아서 자신의 공격, 특수공격, 스피드를 크게 올린다." - }, - kowtowCleave: { - name: "도각참", - effect: "머리를 조아려 상대를 방심하게 만든 뒤에 베어 버린다. 공격은 반드시 명중한다." - }, - flowerTrick: { - name: "트릭플라워", - effect: "숨겨진 장치가 있는 꽃다발을 상대에게 던져서 공격한다. 반드시 명중하며 급소에 맞는다." - }, - torchSong: { - name: "플레어송", - effect: "활활 타오르는 불꽃을 노래하듯 뿜어서 상대를 태워 버린다. 자신의 특수공격을 올린다." - }, - aquaStep: { - name: "아쿠아스텝", - effect: "물 흐르듯 민첩하고 경쾌한 발재간으로 상대를 농락하며 데미지를 준다. 자신의 스피드를 올린다." - }, - ragingBull: { - name: "레이징불", - effect: "분노해 날뛰는 성난소의 맹렬한 태클. 폼에 따라 기술의 타입이 달라지고 빛의장막이나 리플렉터 등도 파괴할 수 있다." - }, - makeItRain: { - name: "골드러시", - effect: "대량의 코인을 날려서 공격한다. 자신의 특수공격이 떨어진다. 배틀 후에 돈을 받을 수 있다." - }, - psyblade: { - name: "사이코블레이드", - effect: "실체가 없는 칼날로 상대를 베어 가른다. 일렉트릭필드 위에 있을 때 기술의 위력이 1.5배가 된다." - }, - hydroSteam: { - name: "하이드로스팀", - effect: "펄펄 끓는 물을 기세 좋게 뿜어낸다. 햇살이 강할 때 기술의 위력이 떨어지기는커녕 1.5배가 된다." - }, - ruination: { - name: "카타스트로피", - effect: "파멸적인 재앙에 휩쓸리게 하여 상대의 HP를 절반으로 만든다." - }, - collisionCourse: { - name: "액셀브레이크", - effect: "변형하며 거칠게 낙하한 다음 고대의 대폭발을 일으킨다. 약점인 상대에게는 위력이 더욱 올라간다." - }, - electroDrift: { - name: "라이트닝드라이브", - effect: "변형하며 초고속으로 달려서 미지의 전격으로 상대를 관통한다. 약점인 상대에게는 위력이 더욱 올라간다." - }, - shedTail: { - name: "꼬리자르기", - effect: "자신의 HP를 깎아서 분신을 만든 뒤, 돌아와서 교대 포켓몬과 교체한다." - }, - chillyReception: { - name: "썰렁개그", - effect: "자리를 얼어붙게 만드는 개그를 하고 교대 포켓몬과 교체한다. 5턴 동안 눈을 내리게 한다." - }, - tidyUp: { - name: "정리정돈", - effect: "압정뿌리기, 스텔스록, 끈적끈적네트, 독압정, 대타출동을 모두 정리한다. 자신의 공격력과 스피드가 올라간다." - }, - snowscape: { - name: "설경", - effect: "5턴 동안 눈을 내리게 한다. 얼음타입의 방어가 올라간다." - }, - pounce: { - name: "달려들기", - effect: "상대에게 달려들어 공격한다. 상대의 스피드를 떨어뜨린다." - }, - trailblaze: { - name: "개척하기", - effect: "풀숲에서 튀어나오듯이 공격한다. 경쾌한 발재간으로 자신의 스피드를 올린다." - }, - chillingWater: { - name: "찬물끼얹기", - effect: "상대의 기운이 빠질 정도로 차가운 물을 끼얹어서 공격한다. 상대의 공격을 떨어뜨린다." - }, - hyperDrill: { - name: "하이퍼드릴", - effect: "뾰족한 신체 부위를 급속도로 회전시켜 관통한다. 방어나 판별 등도 무시할 수 있다." - }, - twinBeam: { - name: "트윈빔", - effect: "두 눈에서 불가사의한 광선을 발사해서 공격한다. 2회 연속으로 데미지를 준다." - }, - rageFist: { - name: "분노의주먹", - effect: "분노를 에너지로 바꿔서 공격한다. 받은 공격의 횟수가 많을수록 기술의 위력이 올라간다." - }, - armorCannon: { - name: "아머캐논", - effect: "자신의 갑옷을 활활 타오르는 탄환으로 발사해서 공격한다. 자신의 방어와 특수방어가 떨어진다." - }, - bitterBlade: { - name: "원념의칼", - effect: "현세의 미련을 칼끝에 담아 베어 버린다. 입힌 데미지의 절반에 해당하는 HP를 회복할 수 있다." - }, - doubleShock: { - name: "전광쌍격", - effect: "전신의 전기를 모두 방출해서 큰 데미지를 준다. 자신의 전기타입이 없어진다." - }, - gigatonHammer: { - name: "거대해머", - effect: "거대한 해머를 온몸으로 휘둘러서 공격한다. 이 기술은 2회 연속으로 쓸 수 없다." - }, - comeuppance: { - name: "앙갚음", - effect: "기술을 쓰기 전에 마지막으로 받은 기술의 데미지를 늘려서 기술을 쓴 상대에게 돌려준다." - }, - aquaCutter: { - name: "아쿠아커터", - effect: "압력을 가한 물을 칼날처럼 분사해서 상대를 베어 가른다. 급소에 맞기 쉽다." - }, - blazingTorque: { - name: "번액셀", - /* 임의번역 (NPC 전용기) */ - effect: "타오르는 엔진으로 상대에게 부릉거린다. 화상 상태로 만들 때가 있다." - }, - wickedTorque: { - name: "다크액셀", - /* 임의번역 (NPC 전용기) */ - effect: "악의적으로 상대를 향해 부릉거린다. 잠듦 상태로 만들 때가 있다." - }, - noxiousTorque: { - name: "포이즌액셀", - /* 임의번역 (NPC 전용기) */ - effect: "독성 엔진으로 상대에게 부릉거린다. 독 상태로 만들 때가 있다." - }, - combatTorque: { - name: "파이트액셀", - /* 임의번역 (NPC 전용기) */ - effect: "상대를 향해 기세 좋게 부릉거린다. 마비 상태로 만들 때가 있다." - }, - magicalTorque: { - name: "매지컬액셀", - /* 임의번역 (NPC 전용기) */ - effect: "메르헨틱한 엔진으로 상대에게 부릉거린다. 상대를 혼란시킬 때가 있다." - }, - bloodMoon: { - name: "블러드문", - effect: "피와 같이 붉은 보름달에서 혼신의 기백을 발사한다. 이 기술은 2회 연속으로 쓸 수 없다." - }, - matchaGotcha: { - name: "휘적휘적포", - effect: "휘저은 차를 대포처럼 발사해 준 데미지의 절반을 HP로 회복한다. 화상 상태로 만들 때도 있다." - }, - syrupBomb: { - name: "시럽봄", - effect: "끈적끈적한 물엿을 폭발시킨다. 상대를 물엿범벅 상태로 만들어서 3턴 동안 계속 스피드를 떨어뜨린다." - }, - ivyCudgel: { - name: "덩굴방망이", - effect: "덩굴을 휘감은 방망이로 때린다. 쓰고 있는 가면에 따라 타입이 바뀐다. 급소에 맞기 쉽다." - }, - electroShot: { - name: "일렉트로빔", - effect: "1턴째에 전기를 모아서 특수공격을 올리고 2턴째에 고압의 전기를 발사한다. 비가 오는 날씨일 때는 바로 발사할 수 있다." - }, - teraStarstorm: { - name: "테라클러스터", - effect: "결정의 힘을 내리쬐어 적을 없애 버린다. 테라파고스가 스텔라폼일 때 사용하면 모든 상대에게 데미지를 준다." - }, - fickleBeam: { - name: "변덕레이저", - effect: "광선을 발사해서 공격한다. 가끔 다른 머리도 협력해서 레이저를 발사하여 위력이 2배가 된다." - }, - burningBulwark: { - name: "화염의수호", - effect: "상대의 공격을 초고열의 털로 방어하는 동시에 접촉한 상대를 화상 상태로 만든다." - }, - thunderclap: { - name: "질풍신뢰", - effect: "상대보다 먼저 전격을 퍼붓는다. 상대가 쓴 기술이 공격 기술이 아니면 실패한다." - }, - mightyCleave: { - name: "파워풀에지", - effect: "머리에 축적된 빛으로 절단한다. 기술 방어를 무시하고 공격할 수 있다." - }, - tachyonCutter: { - name: "타키온커터", - effect: "입자로 된 칼날을 연이어 발사해서 2회 연속으로 데미지를 준다. 공격은 반드시 명중한다." - }, - hardPress: { - name: "하드프레스", - effect: "팔이나 집게로 상대를 압박한다. 상대의 HP가 남아 있을수록 위력이 올라간다." - }, - dragonCheer: { - name: "드래곤옐", - effect: "용의 북돋움으로 사기를 높여서 같은 편의 기술이 급소에 맞기 쉬워진다. 드래곤타입이면 더욱더 사기가 북돋는다." - }, - alluringVoice: { - name: "매혹의보이스", - effect: "천사와도 같은 노랫소리로 상대를 공격한다. 그 턴에 능력이 올라간 포켓몬을 혼란 상태로 만든다." - }, - temperFlare: { - name: "열불내기", - effect: "자포자기하는 기세로 공격한다. 앞 턴에서 기술이 빗나갔다면 위력이 배가 된다." - }, - supercellSlam: { - name: "썬더다이브", - effect: "몸에 전기를 두르고 상대를 덮친다. 빗나가면 자신이 데미지를 입는다." - }, - psychicNoise: { - name: "사이코노이즈", - effect: "불쾌한 음파를 상대에게 날려서 공격한다. 2턴 동안 상대는 기술이나 특성 또는 지니고 있는 도구로 HP를 회복할 수 없게 된다." - }, - upperHand: { - name: "기선제압", - effect: "움직임에 반응하여 손바닥으로 밀쳐서 상대를 풀죽게 한다. 상대가 쓴 기술이 선제공격 기술이 아니면 실패한다." - }, - malignantChain: { - name: "악독사슬", - effect: "독으로 된 사슬로 상대를 휘감은 뒤 독소를 흘려보내어 해치운다. 맹독 상태로 만들 때가 있다." - } -} as const; diff --git a/src/locales/ko/nature.ts b/src/locales/ko/nature.json similarity index 81% rename from src/locales/ko/nature.ts rename to src/locales/ko/nature.json index 2d7e2ec85f4..5c025f44612 100644 --- a/src/locales/ko/nature.ts +++ b/src/locales/ko/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "노력", "Lonely": "외로움", "Brave": "용감", @@ -26,4 +24,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "건방", "Careful": "신중", "Quirky": "변덕" -} as const; +} \ No newline at end of file diff --git a/src/locales/ko/party-ui-handler.json b/src/locales/ko/party-ui-handler.json new file mode 100644 index 00000000000..468f33bf960 --- /dev/null +++ b/src/locales/ko/party-ui-handler.json @@ -0,0 +1,47 @@ +{ + "SEND_OUT": "교체한다", + "SUMMARY": "능력치를 본다", + "CANCEL": "그만둔다", + "RELEASE": "놓아준다", + "APPLY": "사용한다", + "TEACH": "가르친다", + "SPLICE": "융합", + "UNSPLICE": "융합 해제", + "ACTIVATE": "발동", + "DEACTIVATE": "해제", + "TRANSFER": "건넨다", + "ALL": "전부", + "PASS_BATON": "배턴터치한다", + "UNPAUSE_EVOLUTION": "진화 재개", + "REVIVE": "되살린다", + "RENAME": "닉네임 바꾸기", + "choosePokemon": "포켓몬을 선택하세요.", + "doWhatWithThisPokemon": "포켓몬을 어떻게 하겠습니까?", + "noEnergy": "{{pokemonName}}[[는]] 싸울 수 있는\n기력이 남아 있지 않습니다!", + "hasEnergy": "{{pokemonName}}[[는]]\n아직도 힘이 넘친다!", + "cantBeUsed": "{{pokemonName}}[[는]] 이 챌린지에서는\n쓸 수 없습니다.", + "tooManyItems": "{{pokemonName}}[[는]] 지닌 도구의 수가\n너무 많습니다", + "anyEffect": "써도 효과가 없다.", + "unpausedEvolutions": "{{pokemonName}}의 진화가 재개되었다.", + "unspliceConfirmation": "{{pokemonName}}로부터 {{fusionName}}의 융합을 해제하시겠습니까?\n{{fusionName}}는 사라지게 됩니다.", + "wasReverted": "{{fusionName}}은 {{pokemonName}}의 모습으로 돌아갔습니다!", + "releaseConfirmation": "{{pokemonName}}[[를]]\n정말 놓아주겠습니까?", + "releaseInBattle": "전투 중인 포켓몬은\n놓아줄 수 없습니다.", + "selectAMove": "기술을 선택해 주십시오", + "changeQuantity": "건네줄 지닌 도구를 선택해 주십시오.\n< 와 > 로 수량을 변경할 수 있습니다.", + "selectAnotherPokemonToSplice": "융합할 포켓몬을 선택해 주십시오.", + "cancel": "그만둔다", + "able": "배운다!", + "notAble": "배우지 못함", + "learned": "알고 있다", + "goodbye": "잘 가, {{pokemonName}}!", + "byebye": "바이바이, {{pokemonName}}!", + "farewell": "작별이야, {{pokemonName}}!", + "soLong": "안녕, {{pokemonName}}!", + "thisIsWhereWePart": "여기서 헤어지자, {{pokemonName}}!", + "illMissYou": "보고 싶을거야, {{pokemonName}}!", + "illNeverForgetYou": "잊지 못할거야, {{pokemonName}}!", + "untilWeMeetAgain": "다시 만날 때까지, {{pokemonName}}!", + "sayonara": "사요나라, {{pokemonName}}!", + "smellYaLater": "또 보자, {{pokemonName}}!" +} \ No newline at end of file diff --git a/src/locales/ko/party-ui-handler.ts b/src/locales/ko/party-ui-handler.ts deleted file mode 100644 index 15a42ae0521..00000000000 --- a/src/locales/ko/party-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "교체한다", - "SUMMARY": "능력치를 본다", - "CANCEL": "그만둔다", - "RELEASE": "놓아준다", - "APPLY": "사용한다", - "TEACH": "가르친다" -} as const; diff --git a/src/locales/ko/pokeball.json b/src/locales/ko/pokeball.json new file mode 100644 index 00000000000..eab6ac91df6 --- /dev/null +++ b/src/locales/ko/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "몬스터볼", + "greatBall": "슈퍼볼", + "ultraBall": "하이퍼볼", + "rogueBall": "로그볼", + "masterBall": "마스터볼", + "luxuryBall": "럭셔리볼" +} \ No newline at end of file diff --git a/src/locales/ko/pokeball.ts b/src/locales/ko/pokeball.ts deleted file mode 100644 index 195ae3a3594..00000000000 --- a/src/locales/ko/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "몬스터볼", - "greatBall": "슈퍼볼", - "ultraBall": "하이퍼볼", - "rogueBall": "로그볼", - "masterBall": "마스터볼", - "luxuryBall": "럭셔리볼", -} as const; diff --git a/src/locales/ko/pokemon-form-battle.json b/src/locales/ko/pokemon-form-battle.json new file mode 100644 index 00000000000..2dca2b7cf66 --- /dev/null +++ b/src/locales/ko/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "메가{{pokemonName}}", + "mega-x": "메가{{pokemonName}}X", + "mega-y": "메가{{pokemonName}}Y", + "primal": "원시{{pokemonName}}", + "gigantamax": "거다이맥스 {{pokemonName}}", + "eternamax": "무한다이맥스 {{pokemonName}}", + "megaChange": "{{preName}}[[는]]\n{{pokemonName}}[[로]] 메가진화했다!", + "gigantamaxChange": "{{preName}}[[는]]\n{{pokemonName}}가 되었다!", + "eternamaxChange": "{{preName}}[[는]]\n{{pokemonName}}가 되었다!", + "revertChange": "{{pokemonName}}[[는]]\n원래 모습으로 되돌아왔다!", + "formChange": "{{preName}}[[는]]\n다른 모습으로 변화했다!", + "disguiseChange": "탈이 대타가 되었다!" +} \ No newline at end of file diff --git a/src/locales/ko/pokemon-form.json b/src/locales/ko/pokemon-form.json new file mode 100644 index 00000000000..885f9a9b891 --- /dev/null +++ b/src/locales/ko/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "옷갈아입기", + "pikachuCoolCosplay": "하드록", + "pikachuBeautyCosplay": "마담", + "pikachuCuteCosplay": "아이돌", + "pikachuSmartCosplay": "닥터", + "pikachuToughCosplay": "마스크드", + "pikachuPartner": "파트너", + "eeveePartner": "파트너", + "pichuSpiky": "삐쭉귀", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "태양의 모습", + "castformRainy": "빗방울의 모습", + "castformSnowy": "설운의 모습", + "deoxysNormal": "노말폼", + "burmyPlant": "초목도롱", + "burmySandy": "모래땅도롱", + "burmyTrash": "슈레도롱", + "shellosEast": "동쪽바다의 모습", + "shellosWest": "서쪽바다의 모습", + "rotomHeat": "히트", + "rotomWash": "워시", + "rotomFrost": "프로스트", + "rotomFan": "스핀", + "rotomMow": "커트", + "giratinaAltered": "어나더폼", + "shayminLand": "랜드폼", + "basculinRedStriped": "적색근의 모습", + "basculinBlueStriped": "청색근의 모습", + "basculinWhiteStriped": "백색근의 모습", + "deerlingSpring": "봄의 모습", + "deerlingSummer": "여름의 모습", + "deerlingAutumn": "가을의 모습", + "deerlingWinter": "겨울의 모습", + "tornadusIncarnate": "화신폼", + "thundurusIncarnate": "화신폼", + "landorusIncarnate": "화신폼", + "keldeoOrdinary": "평상시 모습", + "meloettaAria": "보이스폼", + "meloettaPirouette": "스텝폼", + "froakieBattleBond": "유대변화", + "scatterbugMeadow": "화원의 모양", + "scatterbugIcySnow": "빙설의 모양", + "scatterbugPolar": "설국의 모양", + "scatterbugTundra": "설원의 모양", + "scatterbugContinental": "대륙의 모양", + "scatterbugGarden": "정원의 모양", + "scatterbugElegant": "우아한 모양", + "scatterbugModern": "모던한 모양", + "scatterbugMarine": "마린의 모양", + "scatterbugArchipelago": "군도의 모양", + "scatterbugHighPlains": "황야의 모양", + "scatterbugSandstorm": "사진의 모양", + "scatterbugRiver": "대하의 모양", + "scatterbugMonsoon": "스콜의 모양", + "scatterbugSavanna": "사바나의 모양", + "scatterbugSun": "태양의 모양", + "scatterbugOcean": "오션의 모양", + "scatterbugJungle": "정글의 모양", + "scatterbugFancy": "팬시한 모양", + "scatterbugPokeBall": "볼의 모양", + "flabebeRed": "빨간 꽃", + "flabebeYellow": "노란 꽃", + "flabebeOrange": "오렌지색 꽃", + "flabebeBlue": "파란 꽃", + "flabebeWhite": "하얀 꽃", + "furfrouHeart": "하트컷", + "furfrouStar": "스타컷", + "furfrouDiamond": "다이아컷", + "furfrouDebutante": "레이디컷", + "furfrouMatron": "마담컷", + "furfrouDandy": "젠틀컷", + "furfrouLaReine": "퀸컷", + "furfrouKabuki": "가부키컷", + "furfrouPharaoh": "킹덤컷", + "pumpkabooSmall": "작은 사이즈", + "pumpkabooLarge": "큰 사이즈", + "pumpkabooSuper": "특대 사이즈", + "xerneasNeutral": "릴랙스모드", + "xerneasActive": "액티브모드", + "zygarde50": "50%폼", + "zygarde10": "10%폼", + "zygarde50Pc": "스웜체인지 50%폼", + "zygarde10Pc": "스웜체인지 10%폼", + "zygardeComplete": "퍼펙트폼", + "oricorioBaile": "이글이글스타일", + "oricorioPompom": "파칙파칙스타일", + "oricorioPau": "훌라훌라스타일", + "oricorioSensu": "하늘하늘스타일", + "rockruffOwnTempo": "마이페이스", + "miniorRedMeteor": "유성의 모습(빨강)", + "miniorOrangeMeteor": "유성의 모습(주황)", + "miniorYellowMeteor": "유성의 모습(노랑)", + "miniorGreenMeteor": "유성의 모습(초록)", + "miniorBlueMeteor": "유성의 모습(옥색)", + "miniorIndigoMeteor": "유성의 모습(파랑)", + "miniorVioletMeteor": "유성의 모습(보라)", + "miniorRed": "빨간색 코어", + "miniorOrange": "주황색 코어", + "miniorYellow": "노란색 코어", + "miniorGreen": "초록색 코어", + "miniorBlue": "옥색 코어", + "miniorIndigo": "파란색 코어", + "miniorViolet": "보라색 코어", + "mimikyuDisguised": "둔갑한 모습", + "mimikyuBusted": "들킨 모습", + "magearnaOriginal": "500년 전의 색", + "marshadowZenith": "투지를 불태운 마샤도", + "sinisteaPhony": "위작품", + "sinisteaAntique": "진작품", + "eiscueNoIce": "나이스페이스", + "indeedeeMale": "수컷의 모습", + "indeedeeFemale": "암컷의 모습", + "morpekoFullBelly": "배부른 모양", + "zacianHeroOfManyBattles": "역전의 용사", + "zamazentaHeroOfManyBattles": "역전의 용사", + "zarudeDada": "아빠", + "enamorusIncarnate": "화신폼", + "squawkabillyGreenPlumage": "그린 페더", + "squawkabillyBluePlumage": "블루 페더", + "squawkabillyYellowPlumage": "옐로 페더", + "squawkabillyWhitePlumage": "화이트 페더", + "tatsugiriCurly": "젖힌 모습", + "tatsugiriDroopy": "늘어진 모습", + "tatsugiriStretchy": "뻗은 모습", + "gimmighoulChest": "상자폼", + "gimmighoulRoaming": "도보폼", + "koraidonApexBuild": "완전형태", + "koraidonLimitedBuild": "제한형태", + "koraidonSprintingBuild": "질주형태", + "koraidonSwimmingBuild": "유영형태", + "koraidonGlidingBuild": "활공형태", + "miraidonUltimateMode": "컴플리트모드", + "miraidonLowPowerMode": "리미티드모드", + "miraidonDriveMode": "드라이브모드", + "miraidonAquaticMode": "플로트모드", + "miraidonGlideMode": "글라이드모드", + "poltchageistCounterfeit": "가짜배기의 모습", + "poltchageistArtisan": "알짜배기의 모습", + "paldeaTaurosCombat": "컴뱃종", + "paldeaTaurosBlaze": "블레이즈종", + "paldeaTaurosAqua": "워터종" +} \ No newline at end of file diff --git a/src/locales/ko/pokemon-info-container.json b/src/locales/ko/pokemon-info-container.json new file mode 100644 index 00000000000..95e44212e03 --- /dev/null +++ b/src/locales/ko/pokemon-info-container.json @@ -0,0 +1,7 @@ +{ + "moveset": "기술", + "gender": "성별:", + "ability": "특성:", + "nature": "성격:", + "form": "폼:" +} \ No newline at end of file diff --git a/src/locales/ko/pokemon-info-container.ts b/src/locales/ko/pokemon-info-container.ts deleted file mode 100644 index 31048dee3ef..00000000000 --- a/src/locales/ko/pokemon-info-container.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "기술", - "gender": "성별:", - "ability": "특성:", - "nature": "성격:", - "epic": "에픽", - "rare": "레어", - "common": "커먼", - "form": "폼:" -} as const; diff --git a/src/locales/ko/pokemon-info.ts b/src/locales/ko/pokemon-info.json similarity index 78% rename from src/locales/ko/pokemon-info.ts rename to src/locales/ko/pokemon-info.json index 89d1742f437..1e26af64d0f 100644 --- a/src/locales/ko/pokemon-info.ts +++ b/src/locales/ko/pokemon-info.json @@ -1,7 +1,5 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { +{ + "Stat": { "HP": "HP", "HPshortened": "HP", "ATK": "공격", @@ -15,10 +13,10 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPD": "스피드", "SPDshortened": "스피드", "ACC": "명중률", - "EVA": "회피율" + "EVA": "회피율", + "HPStat": "HP" }, - - Type: { + "Type": { "UNKNOWN": "Unknown", "NORMAL": "노말", "FIGHTING": "격투", @@ -38,6 +36,6 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DRAGON": "드래곤", "DARK": "악", "FAIRY": "페어리", - "STELLAR": "스텔라", - }, -} as const; + "STELLAR": "스텔라" + } +} diff --git a/src/locales/ko/pokemon-summary.json b/src/locales/ko/pokemon-summary.json new file mode 100644 index 00000000000..d9119623662 --- /dev/null +++ b/src/locales/ko/pokemon-summary.json @@ -0,0 +1,44 @@ +{ + "pokemonInfo": "스테이터스", + "status": "상태 이상", + "powerAccuracyCategory": "위력\n명중\n분류", + "type": "타입", + "unknownTrainer": "알수없음", + "ot": "어버이", + "nature": "성격", + "expPoints": "현재 경험치", + "nextLv": "다음 레벨까지", + "cancel": "그만둔다", + "memoString": "{{natureFragment}}.\n{{metFragment}}", + "metFragment": { + "normal": "{{biome}}에서\n레벨 {{level}}일 때 만났다.", + "apparently": "{{biome}}에서\n레벨 {{level}}일 때 만난 것 같다." + }, + "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}}스러운 성격" + } +} diff --git a/src/locales/ko/pokemon.ts b/src/locales/ko/pokemon.json similarity index 99% rename from src/locales/ko/pokemon.ts rename to src/locales/ko/pokemon.json index 68eae6b9ca6..d419c3397b2 100644 --- a/src/locales/ko/pokemon.ts +++ b/src/locales/ko/pokemon.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { +{ "bulbasaur": "이상해씨", "ivysaur": "이상해풀", "venusaur": "이상해꽃", @@ -1083,4 +1081,4 @@ export const pokemon: SimpleTranslationEntries = { "paldea_tauros": "켄타로스", "paldea_wooper": "우파", "bloodmoon_ursaluna": "다투곰" -} as const; +} \ No newline at end of file diff --git a/src/locales/ko/run-history.json b/src/locales/ko/run-history.json new file mode 100644 index 00000000000..dbf50efc632 --- /dev/null +++ b/src/locales/ko/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "승리!", + "defeatedWild": "야생에서 패배: ", + "defeatedTrainer": "트레이너에게 패배: ", + "defeatedTrainerDouble": "더블 배틀에서 패배", + "defeatedRival": "라이벌에게 패배", + "defeated": "패배", + "defeatedWild_female": "야생에서 패배: ", + "defeatedTrainer_female": "트레이너에게 패배: ", + "defeatedTrainerDouble_female": "더블 배틀에서 패배", + "defeatedRival_female": "라이벌에게 패배", + "defeated_female": "패배", + "luck": "행운", + "score": "점수", + "mode": "모드", + "challengeRules": "규칙", + "challengeMonoGen1": "1세대", + "challengeMonoGen2": "2세대", + "challengeMonoGen3": "3세대", + "challengeMonoGen4": "4세대", + "challengeMonoGen5": "5세대", + "challengeMonoGen6": "6세대", + "challengeMonoGen7": "7세대", + "challengeMonoGen8": "8세대", + "challengeMonoGen9": "9세대", + "playerItems": "플레이어 아이템", + "personalBest": "개인 최고기록!", + "SPDshortened": "스피드", + "runInfo": "플레이 정보", + "money": "소지금", + "runLength": "플레이 타임", + "viewHeldItems": "도구", + "hallofFameText": "전당 등록을 축하합니다!", + "hallofFameText_female": "전당 등록을 축하합니다!", + "viewHallOfFame": "전당 보기", + "viewEndingSplash": "엔딩 화면 보기" +} diff --git a/src/locales/ko/save-slot-select-ui-handler.json b/src/locales/ko/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..f3f18ea9ecc --- /dev/null +++ b/src/locales/ko/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "선택한 슬롯에 데이터를 덮어쓰시겠습니까?", + "loading": "로딩 중...", + "wave": "웨이브", + "lv": "Lv", + "empty": "빈 슬롯" +} \ No newline at end of file diff --git a/src/locales/ko/save-slot-select-ui-handler.ts b/src/locales/ko/save-slot-select-ui-handler.ts deleted file mode 100644 index 29f77cd325f..00000000000 --- a/src/locales/ko/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "선택한 슬롯에 데이터를 덮어쓰시겠습니까?", - "loading": "로딩 중...", - "wave": "웨이브", - "lv": "Lv", - "empty": "빈 슬롯", -} as const; diff --git a/src/locales/ko/settings.ts b/src/locales/ko/settings.json similarity index 88% rename from src/locales/ko/settings.ts rename to src/locales/ko/settings.json index ef1469fc8cb..c10046385e1 100644 --- a/src/locales/ko/settings.ts +++ b/src/locales/ko/settings.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { +{ "boy": "남자", "girl": "여자", "general": "일반", @@ -15,6 +13,7 @@ export const settings: SimpleTranslationEntries = { "skipSeenDialogues": "본 대화 생략", "battleStyle": "시합 룰", "enableRetries": "재도전 허용", + "hideIvs": "개체값탐지기 효과 끄기", "tutorials": "튜토리얼", "touchControls": "터치 컨트롤", "vibrations": "진동", @@ -62,7 +61,9 @@ export const settings: SimpleTranslationEntries = { "typeHints": "상성 힌트", "masterVolume": "마스터 볼륨", "bgmVolume": "BGM 볼륨", + "fieldVolume": "전투효과 볼륨", "seVolume": "SE 볼륨", + "uiVolume": "UI 볼륨", "musicPreference": "음악 설정", "mixed": "믹스", "gamepadPleasePlug": "게임패드를 연결하거나 버튼을 입력하세요", @@ -84,7 +85,7 @@ export const settings: SimpleTranslationEntries = { "buttonCancel": "취소", "buttonStats": "스탯", "buttonCycleForm": "폼 변환", - "buttonCycleShiny": "특별한 색 변환", + "buttonCycleShiny": "색이 다른 변환", "buttonCycleGender": "성별 변환", "buttonCycleAbility": "특성 변환", "buttonCycleNature": "성격 변환", @@ -96,4 +97,11 @@ export const settings: SimpleTranslationEntries = { "controller": "컨트롤러", "gamepadSupport": "게임패드 지원", "showBgmBar": "BGM 제목 보여주기", -} as const; + "moveTouchControls": "터치 컨트롤 이동", + "shopOverlayOpacity": "상점 오버레이 투명도", + "shopCursorTarget": "상점 커서 위치", + "rewards": "아이템", + "reroll": "갱신", + "shop": "상점", + "checkTeam": "파티 확인" +} diff --git a/src/locales/ko/splash-messages.ts b/src/locales/ko/splash-messages.json similarity index 92% rename from src/locales/ko/splash-messages.ts rename to src/locales/ko/splash-messages.json index b875e7b282f..6cf7ce050b7 100644 --- a/src/locales/ko/splash-messages.ts +++ b/src/locales/ko/splash-messages.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { +{ "battlesWon": "전투에서 승리하세요!", "joinTheDiscord": "디스코드에 가입하세요!", "infiniteLevels": "무한한 레벨!", @@ -34,4 +32,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Radical Red도 해봐요!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", -} as const; + "breedersInSpace": "충격!우주에 브리더 진짜 계심ㄷㄷ" +} \ No newline at end of file diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.json similarity index 72% rename from src/locales/ko/starter-select-ui-handler.ts rename to src/locales/ko/starter-select-ui-handler.json index 6fdd21a3454..a8419800d9d 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.json @@ -1,12 +1,7 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { +{ "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?", + "confirmExit": "나가시겠습니까?", + "invalidParty": "스타팅 포켓몬 파티에 적합하지 않습니다!", "gen1": "1세대", "gen2": "2세대", "gen3": "3세대", @@ -22,25 +17,29 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "성격:", "eggMoves": "알 기술", "addToParty": "파티에 추가", + "removeFromParty": "파티에서 제외", "toggleIVs": "개체값 토글", "manageMoves": "기술 관리", "manageNature": "성격 관리", + "addToFavorites": "즐겨찾기에 추가", + "removeFromFavorites": "즐겨찾기에서 제외", "useCandies": "사탕 사용", "selectNature": "교체할 성격을 선택해주세요.", "selectMoveSwapOut": "교체할 기술을 선택해주세요.", "selectMoveSwapWith": "교체될 기술을 선택해주세요. 대상:", + "sameSpeciesEgg": "알 구매하기", "unlockPassive": "패시브 해금", "reduceCost": "코스트 줄이기", - "sameSpeciesEgg": "알 구매하기", - "cycleShiny": ": 특별한 색", + "cycleShiny": ": 색이 다른", "cycleForm": ": 폼", "cycleGender": ": 암수", "cycleAbility": ": 특성", "cycleNature": ": 성격", "cycleVariant": ": 색상", + "goFilter": ": 필터로 이동", "enablePassive": "패시브 활성화", "disablePassive": "패시브 비활성화", "locked": "잠김", "disabled": "비활성", - "uncaught": "미등록", -}; + "uncaught": "미등록" +} \ No newline at end of file diff --git a/src/locales/ko/status-effect.json b/src/locales/ko/status-effect.json new file mode 100644 index 00000000000..d65243a8a24 --- /dev/null +++ b/src/locales/ko/status-effect.json @@ -0,0 +1,65 @@ +{ + "none": { + "name": "없음", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + }, + "poison": { + "name": "독", + "description": "독", + "obtain": "{{pokemonNameWithAffix}}의\n몸에 독이 퍼졌다!", + "obtainSource": "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 몸에 독이 퍼졌다!", + "activation": "{{pokemonNameWithAffix}}[[는]]\n독에 의한 데미지를 입었다!", + "overlap": "{{pokemonNameWithAffix}}[[는]] 이미\n몸에 독이 퍼진 상태다.", + "heal": "{{pokemonNameWithAffix}}의 독은\n말끔하게 해독됐다!" + }, + "toxic": { + "name": "맹독", + "description": "독", + "obtain": "{{pokemonNameWithAffix}}의\n몸에 맹독이 퍼졌다!", + "obtainSource": "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 몸에 맹독이 퍼졌다!", + "activation": "{{pokemonNameWithAffix}}[[는]]\n독에 의한 데미지를 입었다!", + "overlap": "{{pokemonNameWithAffix}}[[는]] 이미\n몸에 독이 퍼진 상태다.", + "heal": "{{pokemonNameWithAffix}}의 독은\n말끔하게 해독됐다!" + }, + "paralysis": { + "name": "마비", + "description": "마비", + "obtain": "{{pokemonNameWithAffix}}[[는]] 마비되어\n기술이 나오기 어려워졌다!", + "obtainSource": "{{pokemonNameWithAffix}}[[는]] {{sourceText}} 때문에\n마비되어 기술이 나오기 어려워졌다!", + "activation": "{{pokemonNameWithAffix}}[[는]]\n몸이 저려서 움직일 수 없다!", + "overlap": "{{pokemonNameWithAffix}}[[는]]\n이미 마비되어 있다!", + "heal": "{{pokemonNameWithAffix}}의\n몸저림이 풀렸다!" + }, + "sleep": { + "name": "잠듦", + "description": "잠듦", + "obtain": "{{pokemonNameWithAffix}}[[는]]\n잠들어 버렸다!", + "obtainSource": "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 잠들어 버렸다!", + "activation": "{{pokemonNameWithAffix}}[[는]]\n쿨쿨 잠들어 있다.", + "overlap": "{{pokemonNameWithAffix}}[[는]]\n이미 잠들어 있다.", + "heal": "{{pokemonNameWithAffix}}[[는]]\n눈을 떴다!" + }, + "freeze": { + "name": "얼음", + "description": "얼음", + "obtain": "{{pokemonNameWithAffix}}[[는]]\n얼어붙었다!", + "obtainSource": "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 얼어붙었다!", + "activation": "{{pokemonNameWithAffix}}[[는]]\n얼어 버려서 움직일 수 없다!", + "overlap": "{{pokemonNameWithAffix}}[[는]]\n이미 얼어 있다.", + "heal": "{{pokemonNameWithAffix}}의\n얼음 상태가 나았다!" + }, + "burn": { + "name": "화상", + "description": "화상", + "obtain": "{{pokemonNameWithAffix}}[[는]]\n화상을 입었다!", + "obtainSource": "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 화상을 입었다!", + "activation": "{{pokemonNameWithAffix}}[[는]]\n화상 데미지를 입었다!", + "overlap": "{{pokemonNameWithAffix}}[[는]] 이미\n화상을 입은 상태다.", + "heal": "{{pokemonNameWithAffix}}의\n화상이 나았다!" + } +} \ No newline at end of file diff --git a/src/locales/ko/status-effect.ts b/src/locales/ko/status-effect.ts deleted file mode 100644 index c4e0ab52722..00000000000 --- a/src/locales/ko/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "없음", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "독", - description: "독", - obtain: "{{pokemonNameWithAffix}}의\n몸에 독이 퍼졌다!", - obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 몸에 독이 퍼졌다!", - activation: "{{pokemonNameWithAffix}}[[는]]\n독에 의한 데미지를 입었다!", - overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n몸에 독이 퍼진 상태다.", - heal: "{{pokemonNameWithAffix}}의 독은\n말끔하게 해독됐다!" - }, - toxic: { - name: "맹독", - description: "독", - obtain: "{{pokemonNameWithAffix}}의\n몸에 맹독이 퍼졌다!", - obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 몸에 맹독이 퍼졌다!", - activation: "{{pokemonNameWithAffix}}[[는]]\n독에 의한 데미지를 입었다!", - overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n몸에 독이 퍼진 상태다.", - heal: "{{pokemonNameWithAffix}}의 독은\n말끔하게 해독됐다!" - }, - paralysis: { - name: "마비", - description: "마비", - obtain: "{{pokemonNameWithAffix}}[[는]] 마비되어\n기술이 나오기 어려워졌다!", - obtainSource: "{{pokemonNameWithAffix}}[[는]] {{sourceText}} 때문에\n마비되어 기술이 나오기 어려워졌다!", - activation: "{{pokemonNameWithAffix}}[[는]]\n몸이 저려서 움직일 수 없다!", - overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 마비되어 있다!", - heal: "{{pokemonNameWithAffix}}의\n몸저림이 풀렸다!" - }, - sleep: { - name: "잠듦", - description: "잠듦", - obtain: "{{pokemonNameWithAffix}}[[는]]\n잠들어 버렸다!", - obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 잠들어 버렸다!", - activation: "{{pokemonNameWithAffix}}[[는]]\n쿨쿨 잠들어 있다.", - overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 잠들어 있다.", - heal: "{{pokemonNameWithAffix}}[[는]]\n눈을 떴다!" - }, - freeze: { - name: "얼음", - description: "얼음", - obtain: "{{pokemonNameWithAffix}}[[는]]\n얼어붙었다!", - obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 얼어붙었다!", - activation: "{{pokemonNameWithAffix}}[[는]]\n얼어 버려서 움직일 수 없다!", - overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 얼어 있다.", - heal: "{{pokemonNameWithAffix}}의\n얼음 상태가 나았다!" - }, - burn: { - name: "화상", - description: "화상", - obtain: "{{pokemonNameWithAffix}}[[는]]\n화상을 입었다!", - obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 화상을 입었다!", - activation: "{{pokemonNameWithAffix}}[[는]]\n화상 데미지를 입었다!", - overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n화상을 입은 상태다.", - heal: "{{pokemonNameWithAffix}}의\n화상이 나았다!" - }, -} as const; diff --git a/src/locales/ko/terrain.json b/src/locales/ko/terrain.json new file mode 100644 index 00000000000..b0229b88d39 --- /dev/null +++ b/src/locales/ko/terrain.json @@ -0,0 +1,16 @@ +{ + "misty": "미스트필드", + "mistyStartMessage": "발밑이 안개로 자욱해졌다!", + "mistyClearMessage": "발밑의 안개가 사라졌다!", + "mistyBlockMessage": "{{pokemonNameWithAffix}}[[를]]\n미스트필드가 지켜주고 있다!", + "electric": "일렉트릭필드", + "electricStartMessage": "발밑에 전기가 흐르기 시작했다!", + "electricClearMessage": "발밑의 전기가 사라졌다!", + "grassy": "그래스필드", + "grassyStartMessage": "발밑에 풀이 무성해졌다!", + "grassyClearMessage": "발밑의 풀이 사라졌다!", + "psychic": "사이코필드", + "psychicStartMessage": "발밑에서 이상한 느낌이 든다!", + "psychicClearMessage": "발밑의 이상한 느낌이 사라졌다!", + "defaultBlockMessage": "{{pokemonNameWithAffix}}[[를]]\n{{terrainName}}[[가]] 지켜주고 있다!" +} \ No newline at end of file diff --git a/src/locales/ko/trainer-classes.json b/src/locales/ko/trainer-classes.json new file mode 100644 index 00000000000..da6c6f4aceb --- /dev/null +++ b/src/locales/ko/trainer-classes.json @@ -0,0 +1,130 @@ +{ + "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": "여사원", + "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": "빡빡이", + "scientist": "연구원", + "scientist_female": "연구원", + "scientists": "연구원", + "smasher": "테니스선수", + "snow_worker": "작업원", + "snow_worker_female": "작업원", + "sailor": "선원", + "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_grunt_female": "로켓단 조무래기", + "rocket_grunts": "로켓단 조무래기들", + "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/ko/trainer-names.json b/src/locales/ko/trainer-names.json new file mode 100644 index 00000000000..f1357a428ba --- /dev/null +++ b/src/locales/ko/trainer-names.json @@ -0,0 +1,164 @@ +{ + "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/ko/trainer-titles.json b/src/locales/ko/trainer-titles.json new file mode 100644 index 00000000000..7cff2207817 --- /dev/null +++ b/src/locales/ko/trainer-titles.json @@ -0,0 +1,38 @@ +{ + "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/trainers.ts b/src/locales/ko/trainers.ts deleted file mode 100644 index 429ab13b223..00000000000 --- a/src/locales/ko/trainers.ts +++ /dev/null @@ -1,285 +0,0 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "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": "플레어단 보스", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "엘리트 트레이너", - "ace_trainer_female": "엘리트 트레이너", - "ace_duo": "엘리트 콤비", - "artist": "예술가", - "artist_female": "예술가", - "backers": "팬클럽", - "backpacker": "백팩커", - "backpacker_female": "백팩커", - "backpackers": "백팩커", - "baker": "제빵사", - "battle_girl": "배틀걸", - "beauty": "아가씨", - "beginners": "반바지 꼬마 & 짧은 치마", // 확인 필요 - "biker": "폭주족", - "black_belt": "태권왕", - "breeder": "포켓몬 브리더", - "breeder_female": "포켓몬 브리더", - "breeders": "포켓몬 브리더", - "clerk": "비즈니스맨", - "clerk_female": "여사원", - "colleagues": "비즈니스 파트너", - "crush_kin": "배틀 커플", // 임의번역 - "cyclist": "사이클링", - "cyclist_female": "사이클링", - "cyclists": "사이클링", - "dancer": "댄서", - "dancer_female": "댄서", - "depot_agent": "역무원", - "doctor": "의사", - "doctor_female": "간호사", // doctor_f.png 파일이 간호사 - "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": "빡빡이", - "scientist": "연구원", - "scientist_female": "연구원", - "scientists": "연구원", - "smasher": "테니스선수", - "snow_worker": "작업원", - "snow_worker_female": "작업원", - "sailor": "선원", - "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_grunt_female": "로켓단 조무래기", - "magma_grunt": "마그마단 조무래기", - "magma_grunt_female": "마그마단 조무래기", - "aqua_grunt": "아쿠아단 조무래기", - "aqua_grunt_female": "아쿠아단 조무래기", - "galactic_grunt": "갤럭시단 조무래기", - "galactic_grunt_female": "갤럭시단 조무래기", - "plasma_grunt": "플라스마단 조무래기", - "plasma_grunt_female": "플라스마단 조무래기", - "flare_grunt": "플레어단 조무래기", - "flare_grunt_female": "플레어단 조무래기", -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - "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": "아이비", - "maxie": "마적", - "archie": "아강", - "cyrus": "태홍", - "ghetsis": "게치스", - "lysandre": "플라드리", - - // Double Names - "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": "두송 & 마리", -} as const; diff --git a/src/locales/ko/tutorial.json b/src/locales/ko/tutorial.json new file mode 100644 index 00000000000..b5304f43098 --- /dev/null +++ b/src/locales/ko/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "포켓로그에 오신 것을 환영합니다! 로그라이트 요소가 가미된 전투 중심의 포켓몬 팬게임입니다.\n$이 게임은 수익을 창출하지 않으며 Pokémon 및 사용된 저작권 자산에 대한 소유권을 주장하지 않습니다.\n$게임은 아직 작업중이지만 완전히 플레이할 수 있습니다.\n버그 신고는 디스코드 커뮤니티를 이용해 주시기 바랍니다.\n$게임이 느릴 경우 브라우저 설정에서 '하드웨어 가속'이 켜져 있는지 확인해주세요.", + "accessMenu": "메뉴에 액세스하려면 입력을 기다리는 동안 M 또는 Esc를 누릅니다.\n메뉴에는 설정과 다양한 기능이 포함되어 있습니다.", + "menu": "이 메뉴에서 설정에 액세스할 수 있습니다.\n$설정에서 게임 속도, 윈도우 스타일 및 기타 옵션을 변경할 수 있습니다.\n$여기에는 다양한 다른 기능도 있으니 꼭 확인해보세요!", + "starterSelect": "이 화면에서 Z나 스페이스바로 스타팅을 선택할 수 있습니다.\n이들은 당신의 첫 번째 파티 멤버들입니다.\n$최대 6마리의 파티로 시작할 수 있지만\n포켓몬에 따라 코스트가 있어 총합 10을 넘겨선 안 됩니다.\n$계속 잡거나 부화시켜서\n선택할 수 있는 성별, 특성, 폼 등의 폭을 넓힐 수 있습니다.\n$개체값도 점점 누적되어 높아지므로,\n같은 포켓몬을 많이 잡아보세요!", + "pokerus": "매일 랜덤 스타팅 세 종류에 보라색 테두리가 쳐집니다.\n$등록된 스타팅 중에 있다면,\n파티에 추가해서 능력치 화면을 확인해봅시다!", + "statChange": "포켓몬은 교체하지 않으면 다음 전투에서도 능력치 변화가 유지됩니다.\n$대신 트레이너 배틀이나 새로운 바이옴 입장 직전에 자동으로 들여보내지게 됩니다.\n$C 또는 Shift를 꾹 눌러 현재 포켓몬의 능력치 변화를 볼 수도 있습니다.\n$V를 눌러 상대방이 사용했던 기술도 확인할 수 있습니다.\n$단, 이번 배틀에서 상대 포켓몬이 이미 사용한 기술만 나타납니다.", + "selectItem": "전투가 끝날때마다 무작위 아이템 3개 중 하나를 선택하여 얻습니다.\n$종류는 소모품, 포켓몬의 지닌 도구, 영구적 패시브 아이템에 이르기까지 다양합니다.\n$대부분의 소모되지 않는 도구는 효과가 누적됩니다.\n$진화용과 같은 일부분의 아이템은 사용할 수 있는 경우에만 등장합니다.\n$지닌 도구 건네주기 기능을 사용해 포켓몬끼리 도구를 옮겨 지닐 수도 있습니다.\n$지닌 도구가 있다면 아이템 선택 화면 오른쪽 하단에 건네주기 기능이 표시됩니다.\n$돈으로 소모품을 구입할 수도 있으며, 웨이브 진행에 따라 구입 가능한 종류가 늘어납니다.\n$아이템을 선택하면 다음 웨이브로 넘어가므로, 소모품 구입을 먼저 해 주세요.", + "eggGacha": "이 화면에서 포켓몬 알 바우처를\n사용해 뽑기를 할 수 있습니다.\n$알은 전투를 반복하다 보면 부화합니다.\n희귀할 수록 더 오래 걸립니다.\n$부화시킨 포켓몬은 파티에 추가되지 않고\n스타팅에 등록될 것입니다.\n$알에서 부화한 포켓몬은 일반적으로\n야생에서 잡은 포켓몬보다 더 높은 개체값을 지닙니다.\n$일부 포켓몬은 알에서만 얻을 수 있습니다.\n$각 뽑기 기계가 각각 다른 보너스를 가지고 있으므로,\n원하는 쪽을 사용해보세요!" +} \ No newline at end of file diff --git a/src/locales/ko/tutorial.ts b/src/locales/ko/tutorial.ts deleted file mode 100644 index 834f1be6345..00000000000 --- a/src/locales/ko/tutorial.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - intro: `포켓로그에 오신 것을 환영합니다! 로그라이트 요소가 가미된 전투 중심의 포켓몬 팬게임입니다. - $이 게임은 수익을 창출하지 않으며 Pokémon 및 사용된 저작권 자산에 대한 소유권을 주장하지 않습니다. - $게임은 아직 작업중이지만 완전히 플레이할 수 있습니다.\n버그 신고는 디스코드 커뮤니티를 이용해 주시기 바랍니다. - $게임이 느릴 경우 브라우저 설정에서 '하드웨어 가속'이 켜져 있는지 확인해주세요.`, - - accessMenu: "메뉴에 액세스하려면 입력을 기다리는 동안 M 또는 Esc를 누릅니다.\n메뉴에는 설정과 다양한 기능이 포함되어 있습니다.", - - menu: `이 메뉴에서 설정에 액세스할 수 있습니다. - $설정에서 게임 속도, 윈도우 스타일 및 기타 옵션을 변경할 수 있습니다. - $여기에는 다양한 다른 기능도 있으니 꼭 확인해보세요!`, - - starterSelect: `이 화면에서 Z나 스페이스바로 스타팅을 선택할 수 있습니다.\n이들은 당신의 첫 번째 파티 멤버들입니다. - $최대 6마리의 파티로 시작할 수 있지만\n포켓몬에 따라 코스트가 있어 총합 10을 넘겨선 안 됩니다. - $계속 잡거나 부화시켜서\n선택할 수 있는 성별, 특성, 폼 등의 폭을 넓힐 수 있습니다. - $개체값도 점점 누적되어 높아지므로,\n같은 포켓몬을 많이 잡아보세요!`, - - pokerus: `매일 랜덤 스타팅 세 종류에 보라색 테두리가 쳐집니다. - $등록된 스타팅 중에 있다면,\n파티에 추가해서 능력치 화면을 확인해봅시다!`, - - statChange: `포켓몬은 교체하지 않으면 다음 전투에서도 능력치 변화가 유지됩니다. - $대신 트레이너 배틀이나 새로운 바이옴 입장 직전에 자동으로 들여보내지게 됩니다. - $C 또는 Shift를 꾹 눌러 현재 포켓몬의 능력치 변화를 볼 수도 있습니다. - $V를 눌러 상대방이 사용했던 기술도 확인할 수 있습니다. - $단, 이번 배틀에서 상대 포켓몬이 이미 사용한 기술만 나타납니다.`, - - selectItem: `전투가 끝날때마다 무작위 아이템 3개 중 하나를 선택하여 얻습니다. - $종류는 소모품, 포켓몬의 지닌 도구, 영구적 패시브 아이템에 이르기까지 다양합니다. - $대부분의 소모되지 않는 도구는 효과가 누적됩니다. - $진화용과 같은 일부분의 아이템은 사용할 수 있는 경우에만 등장합니다. - $지닌 도구 건네주기 기능을 사용해 포켓몬끼리 도구를 옮겨 지닐 수도 있습니다. - $지닌 도구가 있다면 아이템 선택 화면 오른쪽 하단에 건네주기 기능이 표시됩니다. - $돈으로 소모품을 구입할 수도 있으며, 웨이브 진행에 따라 구입 가능한 종류가 늘어납니다. - $아이템을 선택하면 다음 웨이브로 넘어가므로, 소모품 구입을 먼저 해 주세요.`, - - eggGacha: `이 화면에서 포켓몬 알 바우처를\n사용해 뽑기를 할 수 있습니다. - $알은 전투를 반복하다 보면 부화합니다.\n희귀할 수록 더 오래 걸립니다. - $부화시킨 포켓몬은 파티에 추가되지 않고\n스타팅에 등록될 것입니다. - $알에서 부화한 포켓몬은 일반적으로\n야생에서 잡은 포켓몬보다 더 높은 개체값을 지닙니다. - $일부 포켓몬은 알에서만 얻을 수 있습니다. - $각 뽑기 기계가 각각 다른 보너스를 가지고 있으므로,\n원하는 쪽을 사용해보세요!`, -} as const; diff --git a/src/locales/ko/voucher.ts b/src/locales/ko/voucher.json similarity index 55% rename from src/locales/ko/voucher.ts rename to src/locales/ko/voucher.json index dd63977a218..7864754fbbe 100644 --- a/src/locales/ko/voucher.ts +++ b/src/locales/ko/voucher.json @@ -1,11 +1,9 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { +{ "vouchers": "바우처", "eggVoucher": "알 바우처", "eggVoucherPlus": "알 바우처 플러스", "eggVoucherPremium": "알 바우처 프리미엄", "eggVoucherGold": "알 바우처 골드", "locked": "미획득", - "defeatTrainer" : "{{trainerName}}에게 승리", -} as const; + "defeatTrainer": "{{trainerName}}에게 승리" +} \ No newline at end of file diff --git a/src/locales/ko/weather.ts b/src/locales/ko/weather.json similarity index 86% rename from src/locales/ko/weather.ts rename to src/locales/ko/weather.json index 7fbd1eaf20b..286bf54cb17 100644 --- a/src/locales/ko/weather.ts +++ b/src/locales/ko/weather.json @@ -1,45 +1,32 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { +{ "sunnyStartMessage": "햇살이 강해졌다!", "sunnyLapseMessage": "햇살이 강하다", "sunnyClearMessage": "햇살이 원래대로 되돌아왔다!", - "rainStartMessage": "비가 내리기 시작했다!", "rainLapseMessage": "비가 계속 내리고 있다", "rainClearMessage": "비가 그쳤다!", - "sandstormStartMessage": "모래바람이 불기 시작했다!", "sandstormLapseMessage": "모래바람이 세차게 분다", "sandstormClearMessage": "모래바람이 가라앉았다!", "sandstormDamageMessage": "모래바람이\n{{pokemonNameWithAffix}}[[를]] 덮쳤다!", - "hailStartMessage": "싸라기눈이 내리기 시작했다!", "hailLapseMessage": "싸라기눈이 계속 내리고 있다", "hailClearMessage": "싸라기눈이 그쳤다!", "hailDamageMessage": "싸라기눈이\n{{pokemonNameWithAffix}}[[를]] 덮쳤다!", - "snowStartMessage": "눈이 내리기 시작했다!", "snowLapseMessage": "눈이 계속 내리고 있다", "snowClearMessage": "눈이 그쳤다!", - - // 이하 LapseMessage 임의번역 "fogStartMessage": "발밑이 안개로 자욱해졌다!", "fogLapseMessage": "발밑이 안개로 자욱하다", "fogClearMessage": "발밑의 안개가 사라졌다!", - "heavyRainStartMessage": "강한 비가 내리기 시작했다!", "heavyRainLapseMessage": "강한 비가 계속 내리고 있다", "heavyRainClearMessage": "강한 비가 그쳤다!", - "harshSunStartMessage": "햇살이 아주 강해졌다!", "harshSunLapseMessage": "햇살이 아주 강하다", "harshSunClearMessage": "햇살이 원래대로 되돌아왔다!", - "strongWindsStartMessage": "수수께끼의 난기류가\n비행포켓몬을 지킨다!", "strongWindsLapseMessage": "수수께끼의 난기류가 강렬하게 불고 있다", - "strongWindsClearMessage": "수수께끼의 난기류가 멈췄다!" // 임의번역 -}; + "strongWindsEffectMessage": "수수께끼의 난기류가 공격을 약하게 만들었다!", + "strongWindsClearMessage": "수수께끼의 난기류가 멈췄다!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/ability-trigger.json b/src/locales/pt_BR/ability-trigger.json new file mode 100644 index 00000000000..f6a11267f9d --- /dev/null +++ b/src/locales/pt_BR/ability-trigger.json @@ -0,0 +1,62 @@ +{ + "blockRecoilDamage": "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano reverso!", + "badDreams": "{{pokemonName}} está tendo pesadelos!", + "costar": "{{pokemonName}} copiou as mudanças\nde atributo de {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} evitou\ndanos com sua {{abilityName}}!", + "perishBody": "{{abilityName}} de {{pokemonName}}\nirá desmaiar ambos os Pokémon em 3 turnos!", + "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaurou seus PS um pouco!", + "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", + "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", + "quickDraw": "{{pokemonName}} pode agir mais rápido que o normal\ngraças ao seu Quick Draw!", + "disguiseAvoidedDamage": "O disfarce de {{pokemonNameWithAffix}} foi descoberto!", + "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!", + "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!", + "moveImmunity": "Isso não afeta {{pokemonNameWithAffix}}!", + "reverseDrain": "{{pokemonNameWithAffix}} absorveu a gosma líquida!", + "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\ntransformou-o no tipo {{typeName}}!", + "postDefendContactDamage": "{{abilityName}} de {{pokemonNameWithAffix}}\feriu seu adversário!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} trocou\nde habilidades com seu alvo!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} deu a seu alvo\na habilidade {{abilityName}}!", + "postDefendMoveDisable": "{{moveName}} de {{pokemonNameWithAffix}}\nfoi desabilitado!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} se transformou no tipo {{moveType}}!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} roubou\n{{stolenItemType}} de {{defenderName}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} roubou\n{{stolenItemType}} de {{attackerName}}!", + "copyFaintedAllyAbility": "A habilidade {{abilityName}} de {{pokemonNameWithAffix}} foi tomada!", + "intimidateImmunity": "{{abilityName}} de {{pokemonNameWithAffix}} previniu-o(a) de ser intimidado(a)!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} bebeu todo o\nchá mate que {{pokemonName}} fez!", + "postSummonClearAllyStats": "As mudanças de atributo de {{pokemonNameWithAffix}}\nforam removidas!", + "postSummonTransform": "{{pokemonNameWithAffix}} se transformou\nem {{targetName}}!", + "protectStat": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine-o(a) de diminuir seu(sua) {{statName}}!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}} de {{abilityName}}\nprevine {{statusEffectName}}!", + "statusEffectImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine condições de estado!", + "battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine {{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}} foi avisado sobre {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} inspecionou a habilidade {{opponentAbilityName}} de {{opponentName}}!", + "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} foi ferido\npor seu(sua) {{abilityName}}!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} colheu uma {{berryName}}!", + "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", + "fetchBall": "{{pokemonNameWithAffix}} encontrou uma\n{{pokeballName}}!", + "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou PS!", + "arenaTrap": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine trocas!", + "postBattleLoot": "{{pokemonNameWithAffix}} pegou um(a)\n{{itemName}}!", + "postFaintContactDamage": "{{abilityName}} de {{pokemonNameWithAffix}}\nferiu seu adversário!", + "postFaintHpDamage": "{{abilityName}} de {{pokemonNameWithAffix}}\nferiu seu adversário!", + "postSummonPressure": "{{pokemonNameWithAffix}} está exercendo sua pressão!", + "weatherEffectDisappeared": "Os efeitos do clima desapareceram.", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} quebra o molde!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} se arrepiou!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} está irradiando uma aura ardente!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} está irradiando uma aura explosiva!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} está irradiando uma aura sombria!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} está irradiando uma aura de fada!!", + "postSummonNeutralizingGas": "O Neutralizing Gas de {{pokemonNameWithAffix}} se espalhou pelo campo de batalha!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} tem duas Habilidades!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} tem duas Habilidades!", + "postSummonVesselOfRuin": "Vessel of Ruin de {{pokemonNameWithAffix}} reduziu o {{statName}}\nde todos os Pokémon em volta!", + "postSummonSwordOfRuin": "Sword of Ruin de {{pokemonNameWithAffix}} reduziu a {{statName}}\nde todos os Pokémon em volta!", + "postSummonTabletsOfRuin": "Tablets of Ruin de {{pokemonNameWithAffix}} reduziu o {{statName}}\nde todos os Pokémon em volta!", + "postSummonBeadsOfRuin": "Beads of Ruin de {{pokemonNameWithAffix}} reduziu a {{statName}}\nde todos os Pokémon em volta!", + "preventBerryUse": "{{pokemonNameWithAffix}} está nervoso\ndemais para comer frutas!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts deleted file mode 100644 index 526c6def80d..00000000000 --- a/src/locales/pt_BR/ability-trigger.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano de recuo!", - "badDreams": "{{pokemonName}} está tendo pesadelos!", - "costar": "{{pokemonName}} copiou as mudanças\nde atributo de {{allyName}}!", - "iceFaceAvoidedDamage": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!", - "perishBody": "{{abilityName}} de {{pokemonName}}\nirá desmaiar ambos os Pokémon em 3 turnos!", - "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaurou seus PS um pouco!", - "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", - "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", - "quickDraw":"{{pokemonName}} pode agir mais rápido que o normal\ngraças ao seu Quick Draw!", -} as const; diff --git a/src/locales/pt_BR/ability.json b/src/locales/pt_BR/ability.json new file mode 100644 index 00000000000..c4180ff01dd --- /dev/null +++ b/src/locales/pt_BR/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "Stench", + "description": "Liberando um forte odor enquanto ataca, este Pokémon pode fazer o alvo hesitar." + }, + "drizzle": { + "name": "Drizzle", + "description": "O Pokémon faz chover ao entrar em batalha." + }, + "speedBoost": { + "name": "Speed Boost", + "description": "Seu atributo de Velocidade é aumentado a cada turno." + }, + "battleArmor": { + "name": "Battle Armor", + "description": "Uma forte armadura protege o Pokémon de golpes críticos." + }, + "sturdy": { + "name": "Sturdy", + "description": "Impede que seja nocauteado com apenas um golpe, se estiver com seus PS ao máximo. Também evita que movimentos de golpes fatais o derrubem." + }, + "damp": { + "name": "Damp", + "description": "Previne o uso de movimentos explosivos, como a Autodestruição, aumentando a umidade dos arredores." + }, + "limber": { + "name": "Limber", + "description": "Seu corpo maleável protege o Pokémon da paralisia." + }, + "sandVeil": { + "name": "Sand Veil", + "description": "Aumenta a evasão do Pokémon durante as tempestades de areia." + }, + "static": { + "name": "Static", + "description": "O Pokémon é carregado com energia estática, então entrar em contato com ele pode causar paralisia." + }, + "voltAbsorb": { + "name": "Volt Absorb", + "description": "Se for atingido por um movimento do tipo Elétrico, ele restaura seus PS ao invés de receber dano." + }, + "waterAbsorb": { + "name": "Water Absorb", + "description": "Se for atingido por um movimento do tipo Água, ele restaura seus PS ao invés de receber dano." + }, + "oblivious": { + "name": "Oblivious", + "description": "Sua indiferença impede que o Pokémon fique apaixonado ou seja provocado por outro Pokémon." + }, + "cloudNine": { + "name": "Cloud Nine", + "description": "Anula todos os efeitos climáticos na batalha." + }, + "compoundEyes": { + "name": "Compound Eyes", + "description": "O olho preciso do Pokémon aumenta sua precisão." + }, + "insomnia": { + "name": "Insomnia", + "description": "Este Pokémon está sofrendo com insônia e não pode adormecer." + }, + "colorChange": { + "name": "Color Change", + "description": "Este Pokémon se torna do tipo do último ataque que sofreu." + }, + "immunity": { + "name": "Immunity", + "description": "O sistema imunológico deste Pokémon impede que ele seja envenenado." + }, + "flashFire": { + "name": "Flash Fire", + "description": "Fortalece movimentos do tipo Fogo quando atingido por um." + }, + "shieldDust": { + "name": "Shield Dust", + "description": "A poeira desse Pokémon bloqueia efeitos adicionais dos ataques recebidos." + }, + "ownTempo": { + "name": "Own Tempo", + "description": "Este Pokémon tem seu próprio ritmo, que o impede de ficar confuso." + }, + "suctionCups": { + "name": "Suction Cups", + "description": "Este Pokémon usa sua ventosas para fixar-se no lugar, negando todos os movimentos e itens que o obriguem a recuar." + }, + "intimidate": { + "name": "Intimidate", + "description": "Quando entra em batalha, este Pokémon intimida o Pokémon adversário, diminuindo seu Ataque." + }, + "shadowTag": { + "name": "Shadow Tag", + "description": "Este Pokémon pisa na sombra do Pokémon adversário, impedindo que ele escape da batalha." + }, + "roughSkin": { + "name": "Rough Skin", + "description": "Quando recebe um ataque direto, usa sua pele áspera para infligir dano ao Pokémon atacante." + }, + "wonderGuard": { + "name": "Wonder Guard", + "description": "Devido seu misterioso poder, apenas movimentos supereficazes acertam esse Pokémon." + }, + "levitate": { + "name": "Levitate", + "description": "Através da levitação esse Pokémon se torna completamente imune a movimentos do tipo Terra." + }, + "effectSpore": { + "name": "Effect Spore", + "description": "Contato direto com o Pokémon pode infligir paralisia, sono ou envenenamento ao atacante." + }, + "synchronize": { + "name": "Synchronize", + "description": "O atacante sofrerá a mesma mudança de estado se causar queima, envenenamento ou paralisia ao Pokémon." + }, + "clearBody": { + "name": "Clear Body", + "description": "Previne que Habilidades e movimentos de outros Pokémon diminuam os atributos deste Pokémon." + }, + "naturalCure": { + "name": "Natural Cure", + "description": "Quando este Pokémon recua, todas mudanças de estado são curadas." + }, + "lightningRod": { + "name": "Lightning Rod", + "description": "O Pokémon absorve todos os movimentos do tipo Elétrico e, ao invés de sofrer dano, aumenta seu Ataque Esp." + }, + "sereneGrace": { + "name": "Serene Grace", + "description": "Aumenta a probabilidade de ocorrerem efeitos adicionais ao atacar." + }, + "swiftSwim": { + "name": "Swift Swim", + "description": "A Velocidade do Pokémon é aumentada quando chove." + }, + "chlorophyll": { + "name": "Chlorophyll", + "description": "A Velocidade do Pokémon é aumentada sob sol forte." + }, + "illuminate": { + "name": "Illuminate", + "description": "Ilumina os arredores, aumentado a possibilidade de encontrar Pokémon selvagens." + }, + "trace": { + "name": "Trace", + "description": "Quando entra em batalha, o Pokémon copia a Habilidade de um Pokémon adversário." + }, + "hugePower": { + "name": "Huge Power", + "description": "Dobra o Ataque do Pokémon." + }, + "poisonPoint": { + "name": "Poison Point", + "description": "Contato direto com o Pokémon pode envenenar o atacante." + }, + "innerFocus": { + "name": "Inner Focus", + "description": "O foco extraordinário do Pokémon o impede de hesitar." + }, + "magmaArmor": { + "name": "Magma Armor", + "description": "O magma escaldante que cobre o Pokémon previne seu congelamento." + }, + "waterVeil": { + "name": "Water Veil", + "description": "O véu de água que cobre o Pokémon previne que ele seja queimado." + }, + "magnetPull": { + "name": "Magnet Pull", + "description": "Impede que Pokémon do tipo Aço escapem através da utilização de sua força magnética." + }, + "soundproof": { + "name": "Soundproof", + "description": "Antirruído dá ao Pokémon imunidade completa a todos movimentos baseados em som." + }, + "rainDish": { + "name": "Rain Dish", + "description": "O Pokémon recupera PS gradualmente na chuva." + }, + "sandStream": { + "name": "Sand Stream", + "description": "Quando entra em batalha o Pokémon conjura uma tempestade de areia." + }, + "pressure": { + "name": "Pressure", + "description": "Pressionando o Pokémon adversário, ele aumenta o custo de PP para o adversário usar um movimento." + }, + "thickFat": { + "name": "Thick Fat", + "description": "Movimentos dos tipos Fogo e Água têm seu dano reduzido pela metade devido à grossa camada de gordura que protege o Pokémon." + }, + "earlyBird": { + "name": "Early Bird", + "description": "O Pokémon acorda duas vezes mais rápido que outros Pokémon." + }, + "flameBody": { + "name": "Flame Body", + "description": "Contato direto com o Pokémon pode queimar o atacante." + }, + "runAway": { + "name": "Run Away", + "description": "Torna a fuga de encontros com Pokémon selvagem garantida." + }, + "keenEye": { + "name": "Keen Eye", + "description": "Seu olhar extremamente aguçado evita que outros Pokémon diminuam sua Precisão." + }, + "hyperCutter": { + "name": "Hyper Cutter", + "description": "Suas poderosas pinças enchem o Pokémon de orgulho. Elas impedem que outros Pokémon diminuam seu atributo de Ataque." + }, + "pickup": { + "name": "Pickup", + "description": "Após uma batalha, o Pokémon pegará um item que um adversário deixou cair." + }, + "truant": { + "name": "Truant", + "description": "Se utilizar um movimento, o Pokémon precisará descansar no turno seguinte." + }, + "hustle": { + "name": "Hustle", + "description": "Aumenta seu Ataque em troca de diminuir a precisão." + }, + "cuteCharm": { + "name": "Cute Charm", + "description": "Contato direto com o Pokémon pode causar paixão ao atacante." + }, + "plus": { + "name": "Plus", + "description": "Aumenta o Ataque Esp. do Pokémon se estiver em batalha com um aliado que tenha as Habilidades Plus ou Minus." + }, + "minus": { + "name": "Minus", + "description": "Aumenta o Ataque Esp. do Pokémon se estiver em batalha com um aliado que tenha as Habilidades Mais ou Menos." + }, + "forecast": { + "name": "Forecast", + "description": "O tipo do Pokémon altera-se para Água, Fogo ou Gelo, dependendo do clima." + }, + "stickyHold": { + "name": "Sticky Hold", + "description": "Outros Pokémon não podem remover itens que este Pokémon esteja segurando." + }, + "shedSkin": { + "name": "Shed Skin", + "description": "O Pokémon pode curar-se de mudanças de estado através da troca de pele." + }, + "guts": { + "name": "Guts", + "description": "É tão corajoso que ser afetado por uma mudança de estado aumenta seu Ataque." + }, + "marvelScale": { + "name": "Marvel Scale", + "description": "Se for afetado por uma mudança de estado, as escamas maravilhosas do Pokémon aumentarão sua Defesa." + }, + "liquidOoze": { + "name": "Liquid Ooze", + "description": "Exala uma substância tóxica com fedor terrível que causa dano a qualquer atacante que use um movimento de dreno." + }, + "overgrow": { + "name": "Overgrow", + "description": "Fortalece os movimentos do tipo Grama quando o Pokémon está com poucos PS." + }, + "blaze": { + "name": "Blaze", + "description": "Fortalece os movimentos do tipo Fogo quando o Pokémon está com poucos PS." + }, + "torrent": { + "name": "Torrent", + "description": "Fortalece os movimentos do tipo Água quando o Pokémon está com poucos PS." + }, + "swarm": { + "name": "Swarm", + "description": "Fortalece os movimentos do tipo Inseto quando o Pokémon está com poucos PS." + }, + "rockHead": { + "name": "Rock Head", + "description": "Protege o Pokémon de dano colateral." + }, + "drought": { + "name": "Drought", + "description": "Intensifica a luz solar quando o Pokémon entra em batalha." + }, + "arenaTrap": { + "name": "Arena Trap", + "description": "Impede que Pokémon adversários fujam." + }, + "vitalSpirit": { + "name": "Vital Spirit", + "description": "Sua determinação o impede de adormecer." + }, + "whiteSmoke": { + "name": "White Smoke", + "description": "O Pokémon é protegido por sua fumaça branca que previne que outros Pokémon diminuam seus atributos." + }, + "purePower": { + "name": "Pure Power", + "description": "O Pokémon dobra seu Ataque usando seu poder puro." + }, + "shellArmor": { + "name": "Shell Armor", + "description": "A robusta couraça que protege o Pokémon bloqueia os golpes críticos." + }, + "airLock": { + "name": "Air Lock", + "description": "Elimina efeitos climáticos." + }, + "tangledFeet": { + "name": "Tangled Feet", + "description": "Sua evasão aumenta se estiver confuso." + }, + "motorDrive": { + "name": "Motor Drive", + "description": "O Pokémon absorve todos os movimentos do tipo Elétrico e, ao invés de sofrer dano, aumenta seu atributo de Velocidade." + }, + "rivalry": { + "name": "Rivalry", + "description": "Sua competitividade faz com que cause mais dano a Pokémon do mesmo gênero, enquanto causa dano reduzido a Pokémon do gênero oposto." + }, + "steadfast": { + "name": "Steadfast", + "description": "A determinação do Pokémon faz com que sua Velocidade aumente cada vez que ele hesita." + }, + "snowCloak": { + "name": "Snow Cloak", + "description": "Aumenta a evasão numa tempestade de granizo." + }, + "gluttony": { + "name": "Gluttony", + "description": "Se estiver segurando uma fruta, a consumirá quando seus PS caírem abaixo da metade, o que é mais cedo que o usual." + }, + "angerPoint": { + "name": "Anger Point", + "description": "Quando recebe um acerto crítico se enraivece, e com isso, aumenta seu Ataque." + }, + "unburden": { + "name": "Unburden", + "description": "Se o item que o Pokémon estiver segurando for usado ou perdido, sua Velocidade aumentará." + }, + "heatproof": { + "name": "Heatproof", + "description": "O corpo a prova de calor desse Pokémon corta pela metade o dano de ataques do tipo Fogo que o acertam." + }, + "simple": { + "name": "Simple", + "description": "Duplica as mudanças de atributos do Pokémon." + }, + "drySkin": { + "name": "Dry Skin", + "description": "Durante chuva ou se for atingido por movimentos de Água, recupera PS. Durante sol forte tem seus PS máximo reduzido e leva dano aumentado do tipo Fogo." + }, + "download": { + "name": "Download", + "description": "Compara Defesa e Defesa Esp. do Pokémon adversário antes de aumentar seu próprio Ataque Esp. ou Ataque, a depender de qual será mais efetivo." + }, + "ironFist": { + "name": "Iron Fist", + "description": "Fortalece movimentos de soco." + }, + "poisonHeal": { + "name": "Poison Heal", + "description": "Se o Pokémon estiver envenenado, recuperará PS ao invés de perdê-los." + }, + "adaptability": { + "name": "Adaptability", + "description": "Fortalece movimentos do mesmo tipo do Pokémon." + }, + "skillLink": { + "name": "Skill Link", + "description": "Faz com que movimentos de repetição acertem sempre o máximo de vezes possível." + }, + "hydration": { + "name": "Hydration", + "description": "Cura mudanças de estado durante a chuva." + }, + "solarPower": { + "name": "Solar Power", + "description": "Aumenta o Ataque Esp. durante o sol forte, entretanto perde um pouco de PS a cada turno." + }, + "quickFeet": { + "name": "Quick Feet", + "description": "Aumenta a Velocidade se o Pokémon sofrer uma mudança de estado." + }, + "normalize": { + "name": "Normalize", + "description": "Todos os movimentos do Pokémon se tornam do tipo Normal. Aumenta um pouco o poder desses movimentos." + }, + "sniper": { + "name": "Sniper", + "description": "Aumenta o poder dos ataques caso sejam críticos." + }, + "magicGuard": { + "name": "Magic Guard", + "description": "O Pokémon só recebe dano de movimentos de ataque." + }, + "noGuard": { + "name": "No Guard", + "description": "Para garantir que todos os ataques atinjam o oponente, o Pokémon adota uma estratégia de desguarnecimento, porém, isso faz com que todos ataques o atinjam." + }, + "stall": { + "name": "Stall", + "description": "O Pokémon age somente após todos os outros agirem." + }, + "technician": { + "name": "Technician", + "description": "Aumenta o poder dos ataques mais fracos do Pokémon." + }, + "leafGuard": { + "name": "Leaf Guard", + "description": "Previne mudanças de estado sob o sol forte." + }, + "klutz": { + "name": "Klutz", + "description": "O Pokémon não pode usar nenhum item que esteja segurando." + }, + "moldBreaker": { + "name": "Mold Breaker", + "description": "Movimentos podem atingir independentemente da Habilidade do alvo." + }, + "superLuck": { + "name": "Super Luck", + "description": "O Pokémon é tão sortudo que tem a sua probabilidade de realizar golpes críticos aumentada." + }, + "aftermath": { + "name": "Aftermath", + "description": "Caso o Pokémon seja derrotado em decorrência de um movimento de contato, o atacante recebe dano." + }, + "anticipation": { + "name": "Anticipation", + "description": "O Pokémon pode sentir movimentos perigosos vindos do Pokémon adversário." + }, + "forewarn": { + "name": "Forewarn", + "description": "Quando entra em batalha, o Pokémon pode dizer um dos movimentos do Pokémon adversário." + }, + "unaware": { + "name": "Unaware", + "description": "Quando está atacando, o Pokémon ignora mudanças de atributos do Pokémon adversário." + }, + "tintedLens": { + "name": "Tinted Lens", + "description": "Movimentos que seriam “pouco eficazes” causam dano normalmente quando usados pelo Pokémon." + }, + "filter": { + "name": "Filter", + "description": "Ataques supereficazes recebidos dão menos dano." + }, + "slowStart": { + "name": "Slow Start", + "description": "O Ataque e a Velocidade do Pokémon são cortados pela metade por cinco turnos." + }, + "scrappy": { + "name": "Scrappy", + "description": "O Pokémon pode atingir Pokémon do tipo Fantasma com ataques dos tipos Normal e Lutador." + }, + "stormDrain": { + "name": "Storm Drain", + "description": "Atrai todos movimentos do tipo Água para si. Ao invés de receber dano desses ataques, tem seu Ataque Esp. aumentado." + }, + "iceBody": { + "name": "Ice Body", + "description": "O Pokémon recupera PS gradualmente durante as tempestades de granizo." + }, + "solidRock": { + "name": "Solid Rock", + "description": "Reduz o dano recebido de ataques supereficazes." + }, + "snowWarning": { + "name": "Snow Warning", + "description": "O Pokémon conjura uma tempestade de granizo quando entra em batalha." + }, + "honeyGather": { + "name": "Honey Gather", + "description": "The Pokémon gathers Honey after a battle. The Honey is then sold for money." + }, + "frisk": { + "name": "Frisk", + "description": "Quando entra em batalha, o Pokémon pode checar a Habilidade do adversário." + }, + "reckless": { + "name": "Reckless", + "description": "Fortalece movimentos que têm dano colateral." + }, + "multitype": { + "name": "Multitype", + "description": "Altera o tipo do Pokémon para o mesmo da Placa ou Cristal Z em sua posse." + }, + "flowerGift": { + "name": "Flower Gift", + "description": "Sob sol forte, o Ataque e a Defesa Esp. do Pokémon e de seus aliados são aumentados." + }, + "badDreams": { + "name": "Bad Dreams", + "description": "Reduz os PS de Pokémon adversários que estiverem dormindo." + }, + "pickpocket": { + "name": "Pickpocket", + "description": "Rouba o item de um atacante que tenha feito contato direto." + }, + "sheerForce": { + "name": "Sheer Force", + "description": "Aumenta o poder de seus movimentos quando ataca, em detrimento de seus efeitos adicionais que são anulados." + }, + "contrary": { + "name": "Contrary", + "description": "Faz as mudanças de atributos terem efeito contrário." + }, + "unnerve": { + "name": "Unnerve", + "description": "Enerva Pokémon adversários, impossibilitando que eles consumam Frutas." + }, + "defiant": { + "name": "Defiant", + "description": "Aumenta bruscamente o Ataque do Pokémon quando seus atributos são diminuídos pelo adversário." + }, + "defeatist": { + "name": "Defeatist", + "description": "Quando fica com metade ou menos dos PS totais, corta o Ataque e Ataque Esp. do Pokémon pela metade." + }, + "cursedBody": { + "name": "Cursed Body", + "description": "Pode desabilitar um movimento utilizado no Pokémon." + }, + "healer": { + "name": "Healer", + "description": "Às vezes cura mudanças de estado de um aliado." + }, + "friendGuard": { + "name": "Friend Guard", + "description": "Reduz o dano causado em aliados." + }, + "weakArmor": { + "name": "Weak Armor", + "description": "Ataques físicos ao Pokémon diminuem sua Defesa, mas aumenta bruscamente sua Velocidade." + }, + "heavyMetal": { + "name": "Heavy Metal", + "description": "Dobra o peso do Pokémon." + }, + "lightMetal": { + "name": "Light Metal", + "description": "Divide o peso do Pokémon pela metade." + }, + "multiscale": { + "name": "Multiscale", + "description": "Reduz o dano que o Pokémon recebe quando está com os PS cheios." + }, + "toxicBoost": { + "name": "Toxic Boost", + "description": "Fortalece ataques físicos quando o Pokémon está envenenado." + }, + "flareBoost": { + "name": "Flare Boost", + "description": "Fortalece ataques especiais quando o Pokémon está queimado." + }, + "harvest": { + "name": "Harvest", + "description": "Pode criar outra Fruta após consumir uma." + }, + "telepathy": { + "name": "Telepathy", + "description": "Prevê os ataques de um aliado em combate e desvia de todos eles." + }, + "moody": { + "name": "Moody", + "description": "Aumenta bruscamente um atributo e diminui outro a cada turno." + }, + "overcoat": { + "name": "Overcoat", + "description": "Protege o Pokémon de coisas como areia, geada e pó." + }, + "poisonTouch": { + "name": "Poison Touch", + "description": "Pode envenenar um alvo quando o Pokémon faz contato." + }, + "regenerator": { + "name": "Regenerator", + "description": "Recupera um pouco de PS quando recua da batalha." + }, + "bigPecks": { + "name": "Big Pecks", + "description": "Protege o Pokémon de efeitos que diminuam a Defesa." + }, + "sandRush": { + "name": "Sand Rush", + "description": "Aumenta a Velocidade do Pokémon durante uma tempestade de areia." + }, + "wonderSkin": { + "name": "Wonder Skin", + "description": "Torna movimentos de atributos mais suscetíveis ao erro." + }, + "analytic": { + "name": "Analytic", + "description": "Aumenta o poder do movimento quando o Pokémon age por último." + }, + "illusion": { + "name": "Illusion", + "description": "Entra em batalha disfarçado, na forma do Pokémon que ocupar o último lugar na equipe." + }, + "imposter": { + "name": "Imposter", + "description": "O Pokémon se transforma no Pokémon que está enfrentando." + }, + "infiltrator": { + "name": "Infiltrator", + "description": "Ignora barreiras, substitutos e coisas do tipo utilizadas pelo Pokémon adversário e ataca normalmente." + }, + "mummy": { + "name": "Mummy", + "description": "Contato direto com o Pokémon altera a Habilidade do atacante para Múmia." + }, + "moxie": { + "name": "Moxie", + "description": "O Pokémon demonstra arrogância, e isso faz com que seu Ataque aumente após derrotar qualquer Pokémon." + }, + "justified": { + "name": "Justified", + "description": "Ser atingido por movimentos do tipo Sombrio aumenta o Ataque do Pokémon, por justiça." + }, + "rattled": { + "name": "Rattled", + "description": "Movimentos dos tipos Sombrio, Fantasma e Inseto assustam o Pokémon, aumentando sua Velocidade" + }, + "magicBounce": { + "name": "Magic Bounce", + "description": "Ao invés de ser atingido por movimentos de atributos, reflete-os." + }, + "sapSipper": { + "name": "Sap Sipper", + "description": "Se for atingido por um movimento do tipo Grama, ao invés de receber dano, aumenta seu Ataque." + }, + "prankster": { + "name": "Prankster", + "description": "Dá prioridade a movimentos de estado." + }, + "sandForce": { + "name": "Sand Force", + "description": "Fortalece o poder dos movimentos do tipo Pedra, Terra e Aço em uma tempestade de areia." + }, + "ironBarbs": { + "name": "Iron Barbs", + "description": "Os espinhos de ferro infligem dano a um atacante que fizer contato direto." + }, + "zenMode": { + "name": "Zen Mode", + "description": "Quando o Pokémon tem seus PS reduzidos à metade ou menos, muda de forma." + }, + "victoryStar": { + "name": "Victory Star", + "description": "Aumenta a Precisão sua e de seus aliados." + }, + "turboblaze": { + "name": "Turboblaze", + "description": "Movimentos podem atingir independentemente da Habilidade do alvo." + }, + "teravolt": { + "name": "Teravolt", + "description": "Movimentos podem atingir independentemente da Habilidade do alvo." + }, + "aromaVeil": { + "name": "Aroma Veil", + "description": "Protege a si mesmo e a seus aliados de ataques que limitem a escolha de movimentos." + }, + "flowerVeil": { + "name": "Flower Veil", + "description": "Pokémon aliados do tipo Grama são protegidos de mudanças de estado e diminuição de seus atributos." + }, + "cheekPouch": { + "name": "Cheek Pouch", + "description": "Quando o Pokémon consome uma Fruta, também recupera um pouco de PS." + }, + "protean": { + "name": "Protean", + "description": "Muda o tipo do Pokémon para o tipo do movimento que ele vai utilizar." + }, + "furCoat": { + "name": "Fur Coat", + "description": "Reduz o dano de movimentos físicos pela metade." + }, + "magician": { + "name": "Magician", + "description": "O Pokémon rouba o item que um Pokémon alvo estiver segurando quando acerta um movimento." + }, + "bulletproof": { + "name": "Bulletproof", + "description": "Protege o Pokémon de alguns movimentos de bola e bomba." + }, + "competitive": { + "name": "Competitive", + "description": "Aumenta bruscamente o Ataque Esp. quando um atributo é diminuído." + }, + "strongJaw": { + "name": "Strong Jaw", + "description": "A poderosa mandíbula do Pokémon aumenta o poder dos seus movimentos de mordida." + }, + "refrigerate": { + "name": "Refrigerate", + "description": "Movimentos do tipo Normal se tornam do tipo Gelo. Aumenta um pouco o poder desses movimentos." + }, + "sweetVeil": { + "name": "Sweet Veil", + "description": "Previne a si e a Pokémon aliados de caírem no sono." + }, + "stanceChange": { + "name": "Stance Change", + "description": "O Pokemon muda para Forma Espada quando usa um movimento de ataque, e muda para a Forma Escudo quando usa o movimento Escudo do Rei." + }, + "galeWings": { + "name": "Gale Wings", + "description": "Quando o Pokémon está com os PS cheios, dá prioridade a movimentos do tipo Voador." + }, + "megaLauncher": { + "name": "Mega Launcher", + "description": "Fortalece movimentos de aura e pulso." + }, + "grassPelt": { + "name": "Grass Pelt", + "description": "Aumenta a Defesa do Pokémon em Terreno de Grama." + }, + "symbiosis": { + "name": "Symbiosis", + "description": "O Pokémon entrega seu item para um aliado que já tiver utilizado seu próprio item." + }, + "toughClaws": { + "name": "Tough Claws", + "description": "Fortalece movimentos que façam contato direto." + }, + "pixilate": { + "name": "Pixilate", + "description": "Movimentos do tipo Normal se tornam do tipo Fada. Aumenta um pouco o poder desses movimentos." + }, + "gooey": { + "name": "Gooey", + "description": "Contato direto com o Pokémon diminui o atributo de Velocidade do atacante." + }, + "aerilate": { + "name": "Aerilate", + "description": "Movimentos do tipo Normal se tornam do tipo Voador. Aumenta um pouco o poder desses movimentos." + }, + "parentalBond": { + "name": "Parental Bond", + "description": "Une suas forças com sua cria para atacar duas vezes." + }, + "darkAura": { + "name": "Dark Aura", + "description": "Fortalece movimentos do tipo Sombrio de todos os Pokémon." + }, + "fairyAura": { + "name": "Fairy Aura", + "description": "Fortalece movimentos do tipo Fada de todos os Pokémon." + }, + "auraBreak": { + "name": "Aura Break", + "description": "Os efeitos de Habilidades de “Aura” são revertidos para diminuir o poder de movimentos afetados." + }, + "primordialSea": { + "name": "Primordial Sea", + "description": "O Pokémon muda o clima para neutralizar ataques do tipo Fogo." + }, + "desolateLand": { + "name": "Desolate Land", + "description": "O Pokémon muda o clima para neutralizar ataques do tipo Água." + }, + "deltaStream": { + "name": "Delta Stream", + "description": "O Pokémon muda o clima para eliminar todas as vulnerabilidades do tipo Voador." + }, + "stamina": { + "name": "Stamina", + "description": "Aumenta a Defesa quando atingido por um ataque." + }, + "wimpOut": { + "name": "Wimp Out", + "description": "Quando fica com metade ou menos de seus PS, recua covardemente da batalha." + }, + "emergencyExit": { + "name": "Emergency Exit", + "description": "Quando fica com metade ou menos de seus PS, sentindo que está em perigo, o Pokémon recua da batalha." + }, + "waterCompaction": { + "name": "Water Compaction", + "description": "Aumenta bruscamente a Defesa do Pokémon quando atingido por um movimento do tipo Água." + }, + "merciless": { + "name": "Merciless", + "description": "Os ataques do Pokémon se tornam críticos se o alvo estiver envenenado." + }, + "shieldsDown": { + "name": "Shields Down", + "description": "Quando fica com metade ou menos de seus PS, o Pokémon quebra sua carapaça e se torna agressivo." + }, + "stakeout": { + "name": "Stakeout", + "description": "Caso o alvo recue da batalha, dobra o dano causado ao Pokémon suplente." + }, + "waterBubble": { + "name": "Water Bubble", + "description": "Diminui o poder de movimentos do tipo Fogo usados contra o Pokémon e o impede de ficar queimado." + }, + "steelworker": { + "name": "Steelworker", + "description": "Fortalece os movimentos do tipo Aço." + }, + "berserk": { + "name": "Berserk", + "description": "Quando é atingido por um movimento que deixa seus PS na metade ou menos, aumenta seu Ataque Esp.." + }, + "slushRush": { + "name": "Slush Rush", + "description": "Aumenta a Velocidade do Pokémon em uma tempestade de granizo." + }, + "longReach": { + "name": "Long Reach", + "description": "O Pokémon usa seus movimentos sem fazer contato direto com o alvo." + }, + "liquidVoice": { + "name": "Liquid Voice", + "description": "Todos os movimentos baseados em som se tornam do tipo Água." + }, + "triage": { + "name": "Triage", + "description": "Concede prioridade para movimentos de cura." + }, + "galvanize": { + "name": "Galvanize", + "description": "Movimentos do tipo Normal se transformam em movimentos do tipo Elétrico. Aumenta um pouco o poder desses movimentos." + }, + "surgeSurfer": { + "name": "Surge Surfer", + "description": "Dobra a Velocidade do Pokémon em Terreno Elétrico." + }, + "schooling": { + "name": "Schooling", + "description": "Quando está com bastante PS, o Pokémon forma um poderoso cardume, que se desfaz quando seus PS ficam baixos." + }, + "disguise": { + "name": "Disguise", + "description": "Uma vez por batalha, a mortalha que cobre o Pokémon pode protegê-lo de um ataque." + }, + "battleBond": { + "name": "Battle Bond", + "description": "Derrotar um Pokémon adversário fortalece os laços entre Pokémon e Treinador, fazendo com que se torne Greninja do Ash, e fortalecendo o ataque Shuriken de Água." + }, + "powerConstruct": { + "name": "Power Construct", + "description": "Quando seus PS ficam da metade para baixo, outras Células se agrupam para auxiliá-lo, fazendo com que o Pokémon mude para sua Forma Completa." + }, + "corrosion": { + "name": "Corrosion", + "description": "O Pokémon pode envenenar o alvo mesmo que ele seja dos tipos Aço ou Venenoso." + }, + "comatose": { + "name": "Comatose", + "description": "Está sempre cochilando e nunca acordará, entretanto, pode atacar sem acordar." + }, + "queenlyMajesty": { + "name": "Queenly Majesty", + "description": "Sua magnificência pressiona o Pokémon adversário, impossibilitando-o de utilizar movimentos de prioridade." + }, + "innardsOut": { + "name": "Innards Out", + "description": "Ao ser nocauteado, inflige dano ao adversário igual ao valor de PS que possuía antes de ser atacado." + }, + "dancer": { + "name": "Dancer", + "description": "Quando outro Pokémon usa um movimento de dança, pode usar um movimento de dança na sequência independentemente de sua Velocidade." + }, + "battery": { + "name": "Battery", + "description": "Fortalece os movimentos especiais dos Pokémon aliados." + }, + "fluffy": { + "name": "Fluffy", + "description": "Corta pela metade o dano recebido de movimentos que fazem contato direto, porém, dobra o dano dos ataques do tipo Fogo." + }, + "dazzling": { + "name": "Dazzling", + "description": "Surpreende o Pokémon adversário, impedindo-o de atacar usando movimentos de prioridade." + }, + "soulHeart": { + "name": "Soul-Heart", + "description": "Aumenta seu atributo de Ataque Esp. toda vez que um Pokémon desmaia." + }, + "tanglingHair": { + "name": "Tangling Hair", + "description": "Contato direto com o Pokémon diminui o atributo de Velocidade do atacante." + }, + "receiver": { + "name": "Receiver", + "description": "O Pokémon copia a Habilidade de um aliado derrotado." + }, + "powerOfAlchemy": { + "name": "Power of Alchemy", + "description": "O Pokémon copia a Habilidade de um aliado derrotado." + }, + "beastBoost": { + "name": "Beast Boost", + "description": "O Pokémon aumentará seu melhor atributo sempre que derrotar outro Pokémon." + }, + "rksSystem": { + "name": "RKS System", + "description": "Troca o tipo do Pokémon para igualar com o disco de memória que ele tiver instalado." + }, + "electricSurge": { + "name": "Electric Surge", + "description": "Quando o Pokémon entra em batalha, altera o terreno para Terreno Elétrico." + }, + "psychicSurge": { + "name": "Psychic Surge", + "description": "Quando o Pokémon entra em batalha, altera o terreno para Terreno Psíquico." + }, + "mistySurge": { + "name": "Misty Surge", + "description": "Quando o Pokémon entra em batalha, altera o terreno para Terreno Enevoado." + }, + "grassySurge": { + "name": "Grassy Surge", + "description": "Quando o Pokémon entra em batalha, altera o terreno para Terreno de Grama." + }, + "fullMetalBody": { + "name": "Full Metal Body", + "description": "Previne que as Habilidades e movimentos de outros Pokémon diminuam os atributos deste Pokémon." + }, + "shadowShield": { + "name": "Shadow Shield", + "description": "Reduz a quantidade de dano que o Pokémon recebe enquanto estiver com seus PS ao máximo." + }, + "prismArmor": { + "name": "Prism Armor", + "description": "Reduz o dano recebido por movimentos supereficazes." + }, + "neuroforce": { + "name": "Neuroforce", + "description": "Fortalece movimentos supereficazes." + }, + "intrepidSword": { + "name": "Intrepid Sword", + "description": "Aumenta o atributo de Ataque ao entrar em batalha." + }, + "dauntlessShield": { + "name": "Dauntless Shield", + "description": "Aumenta o atributo de Defesa ao entrar em batalha." + }, + "libero": { + "name": "Libero", + "description": "Muda o tipo do Pokémon para o tipo do movimento que ele estiver prestes a usar." + }, + "ballFetch": { + "name": "Ball Fetch", + "description": "Se o Pokémon não estiver segurando nenhum item, ele irá buscar a primeira Poké Bola que falhou em capturar um Pokémon na batalha." + }, + "cottonDown": { + "name": "Cotton Down", + "description": "Quando o Pokémon é atingido por um ataque, ele espalha algodão à volta, diminuindo o atributo de Velocidade de todos os Pokémon, exceto ele mesmo." + }, + "propellerTail": { + "name": "Propeller Tail", + "description": "Ignora os efeitos de Habilidades e movimentos de Pokémon adversários que redirecionam e atraem movimentos para si." + }, + "mirrorArmor": { + "name": "Mirror Armor", + "description": "Devolve apenas os efeitos redutores de atributos que o Pokémon recebe." + }, + "gulpMissile": { + "name": "Gulp Missile", + "description": "Quando o Pokémon usa Surf ou Dive, volta com uma presa. Quando recebe dano, cospe a presa no atacante." + }, + "stalwart": { + "name": "Stalwart", + "description": "Ignora os efeitos de Habilidades e movimentos de Pokémon adversários que redirecionam e atraem movimentos para si." + }, + "steamEngine": { + "name": "Steam Engine", + "description": "Aumenta drasticamente a Velocidade, se for atingido por um movimento do tipo Água ou Fogo." + }, + "punkRock": { + "name": "Punk Rock", + "description": "Aumenta o poder dos movimentos baseados em som. O Pokémon também recebe metade do dano desses tipos de movimentos." + }, + "sandSpit": { + "name": "Sand Spit", + "description": "O Pokémon cria uma tempestade de areia quando é atingido por um ataque." + }, + "iceScales": { + "name": "Ice Scales", + "description": "As gélidas escamas que rodeiam seu corpo reduzem à metade o dano recebido por movimentos especiais." + }, + "ripen": { + "name": "Ripen", + "description": "Amadurece Frutas e dobram seus efeitos." + }, + "iceFace": { + "name": "Ice Face", + "description": "Sua cabeça de gelo pode receber ataques físicos como substituto, mas faz com que a aparência do Pokémon mude. O gelo é restaurado no granizo." + }, + "powerSpot": { + "name": "Power Spot", + "description": "O simples fato de estar próximo ao Pokémon fortalece o poder de movimentos." + }, + "mimicry": { + "name": "Mimicry", + "description": "Muda o tipo do Pokémon dependendo do terreno." + }, + "screenCleaner": { + "name": "Screen Cleaner", + "description": "Quando o Pokémon entra em batalha os efeitos de Tela de Luz, Refletir e Véu Aurora são anulados, tanto para Pokémon aliados quanto para oponentes." + }, + "steelySpirit": { + "name": "Steely Spirit", + "description": "Fortalece o poder dos movimentos do tipo Aço de Pokémon aliados." + }, + "perishBody": { + "name": "Perish Body", + "description": "Quando for atingido por um ataque que cause contato direto, tanto o Pokémon quanto o atacante desmaiarão após três turnos, a não ser que recuem da batalha." + }, + "wanderingSpirit": { + "name": "Wandering Spirit", + "description": "O Pokémon troca de Habilidade com um Pokémon que o atinja com um movimento que faz contato direto." + }, + "gorillaTactics": { + "name": "Gorilla Tactics", + "description": "Aumenta o Ataque do Pokémon, entretanto, só permite que ele utilize o primeiro movimento escolhido." + }, + "neutralizingGas": { + "name": "Neutralizing Gas", + "description": "Se o Pokémon com Gás Neutralizador está na batalha, os efeitos das Habilidades de todos os Pokémon serão anuladas ou não serão ativados." + }, + "pastelVeil": { + "name": "Pastel Veil", + "description": "Protege o Pokémon e seu aliado de serem envenenados." + }, + "hungerSwitch": { + "name": "Hunger Switch", + "description": "O Pokémon troca sua forma, alternando entre o Modo Satisfeito e Modo Voraz ao fim de cada turno." + }, + "quickDraw": { + "name": "Quick Draw", + "description": "Permite que o Pokémon aja primeiro ocasionalmente." + }, + "unseenFist": { + "name": "Unseen Fist", + "description": "Se o Pokémon utilizar movimentos que façam contato direto, pode atacar seu alvo mesmo que ele tenha se protegido." + }, + "curiousMedicine": { + "name": "Curious Medicine", + "description": "Quando o Pokémon entra em uma batalha, espalha medicamentos de sua concha que removem de aliados todas mudanças de estado." + }, + "transistor": { + "name": "Transistor", + "description": "Fortalece movimentos do tipo Elétrico." + }, + "dragonsMaw": { + "name": "Dragon's Maw", + "description": "Fortalece movimentos do tipo Dragão." + }, + "chillingNeigh": { + "name": "Chilling Neigh", + "description": "Quando o Pokémon derrota um alvo, emite um relincho assustador que aumenta seu Ataque." + }, + "grimNeigh": { + "name": "Grim Neigh", + "description": "Quando o Pokémon derrota um alvo, emite um relincho assustador que aumenta seu Ataque Esp." + }, + "asOneGlastrier": { + "name": "As One", + "description": "Esta habilidade combina os efeitos da habilidade Unnerve de Calyrex e da habilidade Chilling Neigh de Glastrier." + }, + "asOneSpectrier": { + "name": "As One", + "description": "Essa Habilidade combina os efeitos das Habilidades Enervar de Calyrex e Relincho Negro de Spectrier." + }, + "lingeringAroma": { + "name": "Lingering Aroma", + "description": "O contato com o Pokémon muda a Habilidade do atacante para Lingering Aroma." + }, + "seedSower": { + "name": "Seed Sower", + "description": "Transforma o solo em Terreno de Grama quando o Pokémon é atingido por um ataque." + }, + "thermalExchange": { + "name": "Thermal Exchange", + "description": "Aumenta o atributo de Ataque quando o Pokémon é atingido por um movimento do tipo Fogo. O Pokémon também não pode ser queimado." + }, + "angerShell": { + "name": "Anger Shell", + "description": "Quando um ataque faz com que seu HP caia para metade ou menos, o Pokémon se enfurece. Isso reduz seus atributos de Defesa e Defesa Especial, mas aumenta seus atributos de Ataque, Ataque Especial e Velocidade." + }, + "purifyingSalt": { + "name": "Purifying Salt", + "description": "O sal puro do Pokémon o protege de condições de estado e reduz pela metade o dano recebido de movimentos do tipo Fantasma." + }, + "wellBakedBody": { + "name": "Well-Baked Body", + "description": "O Pokémon não recebe dano quando atingido por movimentos do tipo Fogo. Em vez disso, seu atributo de Defesa é aumentado drasticamente." + }, + "windRider": { + "name": "Wind Rider", + "description": "Aumenta o atributo de Ataque do Pokémon se o Vento de Cauda tiver efeito ou se o Pokémon for atingido por um movimento de vento. O Pokémon também não recebe dano de movimentos de vento." + }, + "guardDog": { + "name": "Guard Dog", + "description": "Aumenta o atributo de Ataque do Pokémon se intimidado. Movimentos e itens que forçariam o Pokémon a trocar também falham em funcionar." + }, + "rockyPayload": { + "name": "Rocky Payload", + "description": "Aumenta o poder dos movimentos do tipo Pedra." + }, + "windPower": { + "name": "Wind Power", + "description": "O Pokémon fica carregado quando é atingido por um movimento de vento, aumentando o poder do próximo movimento do tipo Elétrico que o Pokémon usa." + }, + "zeroToHero": { + "name": "Zero to Hero", + "description": "O Pokémon se transforma em sua Forma Herói quando é trocado." + }, + "commander": { + "name": "Commander", + "description": "Quando o Pokémon entra em batalha, ele entra na boca de um Dondozo aliado se ele estiver no campo. O Pokémon então emite comandos de lá." + }, + "electromorphosis": { + "name": "Electromorphosis", + "description": "O Pokémon fica carregado quando sofre dano, aumentando o poder do próximo movimento do tipo Elétrico que o Pokémon usa." + }, + "protosynthesis": { + "name": "Protosynthesis", + "description": "Aumenta o atributo mais proficiente do Pokémon sob sol intenso ou se o Pokémon estiver segurando Booster Energy." + }, + "quarkDrive": { + "name": "Quark Drive", + "description": "Aumenta o atributo mais proficiente do Pokémon em Terreno Elétrico ou se o Pokémon estiver segurando Booster Energy." + }, + "goodAsGold": { + "name": "Good as Gold", + "description": "Um corpo de ouro puro dá ao Pokémon imunidade completa aos movimentos de status de outros Pokémon." + }, + "vesselOfRuin": { + "name": "Vessel of Ruin", + "description": "O poder do recipiente de ruínas do Pokémon reduz os atributos de Ataque Especial de todos os Pokémon exceto o dele." + }, + "swordOfRuin": { + "name": "Sword of Ruin", + "description": "O poder da espada de ruínas do Pokémon reduz os atributos de Defesa de todos os Pokémon exceto o dele." + }, + "tabletsOfRuin": { + "name": "Tablets of Ruin", + "description": "O poder das tábuas de ruínas do Pokémon reduz os atributos de Ataque de todos os Pokémon exceto o dele." + }, + "beadsOfRuin": { + "name": "Beads of Ruin", + "description": "O poder das contas de ruínas do Pokémon reduz os atributos de Defesa Especial de todos os Pokémon exceto o dele." + }, + "orichalcumPulse": { + "name": "Orichalcum Pulse", + "description": "Torna a luz solar intensa quando o Pokémon entra em batalha. O antigo pulso vibrante do Pokémon também aumenta seu atributo de Ataque sob sol intenso." + }, + "hadronEngine": { + "name": "Hadron Engine", + "description": "Transforma o solo em Terreno Elétrico quando o Pokémon entra em batalha. O motor futurista dentro do Pokémon também aumenta seu atributo de Ataque Especial em Terreno Elétrico." + }, + "opportunist": { + "name": "Opportunist", + "description": "Se um atributo de um oponente for aumentado, o Pokémon aproveita a oportunidade para aumentar o mesmo atributo para si mesmo." + }, + "cudChew": { + "name": "Cud Chew", + "description": "Quando o Pokémon come uma Berry, ele a regurgita no final do próximo turno e come novamente." + }, + "sharpness": { + "name": "Sharpness", + "description": "Aumenta o poder dos movimentos de corte." + }, + "supremeOverlord": { + "name": "Supreme Overlord", + "description": "Quando o Pokémon entra em batalha, seus atributos de Ataque e Ataque Especial são levemente aumentados para cada um dos aliados em sua equipe que já foram derrotados." + }, + "costar": { + "name": "Costar", + "description": "Quando o Pokémon entra em batalha, ele copia as mudanças de atributos de um aliado." + }, + "toxicDebris": { + "name": "Toxic Debris", + "description": "Espalha espinhos venenosos aos pés da equipe adversária quando o Pokémon sofre dano de movimentos físicos." + }, + "armorTail": { + "name": "Armor Tail", + "description": "A cauda misteriosa que cobre a cabeça do Pokémon impede que oponentes usem movimentos de prioridade contra o Pokémon ou seus aliados." + }, + "earthEater": { + "name": "Earth Eater", + "description": "Se for atingido por um movimento do tipo Terra, o Pokémon restaura seu HP em vez de sofrer dano." + }, + "myceliumMight": { + "name": "Mycelium Might", + "description": "O Pokémon sempre agirá mais lentamente quando usar movimentos de status, mas esses movimentos não serão impedidos pela Habilidade do alvo." + }, + "mindsEye": { + "name": "Mind's Eye", + "description": "O Pokémon ignora mudanças na evasividade dos oponentes, sua precisão não pode ser reduzida, e ele pode atingir tipos Fantasma com movimentos dos tipos Normal e Lutador." + }, + "supersweetSyrup": { + "name": "Supersweet Syrup", + "description": "Um aroma doce e enjoativo se espalha pelo campo na primeira vez que o Pokémon entra em batalha, reduzindo a evasividade dos Pokémon oponentes." + }, + "hospitality": { + "name": "Hospitality", + "description": "Quando o Pokémon entra em batalha, ele banha seu aliado com hospitalidade, restaurando uma pequena quantidade do HP do aliado." + }, + "toxicChain": { + "name": "Toxic Chain", + "description": "O poder da cadeia tóxica do Pokémon pode envenenar gravemente qualquer alvo que o Pokémon atinja com um movimento." + }, + "embodyAspectTeal": { + "name": "Embody Aspect", + "description": "O coração do Pokémon se enche de memórias, fazendo com que a Máscara Teal brilhe e aumente o atributo de Velocidade do Pokémon." + }, + "embodyAspectWellspring": { + "name": "Embody Aspect", + "description": "O coração do Pokémon se enche de memórias, fazendo com que a Máscara Wellspring brilhe e aumente o atributo de Defesa Especial do Pokémon." + }, + "embodyAspectHearthflame": { + "name": "Embody Aspect", + "description": "O coração do Pokémon se enche de memórias, fazendo com que a Máscara Hearthflame brilhe e aumente o atributo de Ataque do Pokémon." + }, + "embodyAspectCornerstone": { + "name": "Embody Aspect", + "description": "O coração do Pokémon se enche de memórias, fazendo com que a Máscara Cornerstone brilhe e aumente o atributo de Defesa do Pokémon." + }, + "teraShift": { + "name": "Tera Shift", + "description": "Quando o Pokémon entra em batalha, ele absorve a energia ao seu redor e se transforma em sua Forma Terastal." + }, + "teraShell": { + "name": "Tera Shell", + "description": "A casca do Pokémon contém os poderes de cada tipo. Todos os movimentos que causam dano que atingem o Pokémon quando seu HP está cheio não serão muito eficazes." + }, + "teraformZero": { + "name": "Teraform Zero", + "description": "Quando Terapagos muda para sua Forma Estelar, ele usa seus poderes ocultos para eliminar todos os efeitos do clima e do terreno, reduzindo-os a zero." + }, + "poisonPuppeteer": { + "name": "Poison Puppeteer", + "description": "Pokémon envenenados pelos movimentos de Pecharunt também ficarão confusos." + } +} diff --git a/src/locales/pt_BR/ability.ts b/src/locales/pt_BR/ability.ts deleted file mode 100644 index 2dd4550aabd..00000000000 --- a/src/locales/pt_BR/ability.ts +++ /dev/null @@ -1,1240 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -export const ability: AbilityTranslationEntries = { - stench: { - name: "Stench", - description: "Liberando um forte odor enquanto ataca, este Pokémon pode fazer o alvo hesitar.", - }, - drizzle: { - name: "Drizzle", - description: "O Pokémon faz chover ao entrar em batalha.", - }, - speedBoost: { - name: "Speed Boost", - description: "Seu atributo de Velocidade é aumentado a cada turno.", - }, - battleArmor: { - name: "Battle Armor", - description: "Uma forte armadura protege o Pokémon de golpes críticos.", - }, - sturdy: { - name: "Sturdy", - description: "Impede que seja nocauteado com apenas um golpe, se estiver com seus PS ao máximo. Também evita que movimentos de golpes fatais o derrubem.", - }, - damp: { - name: "Damp", - description: "Previne o uso de movimentos explosivos, como a Autodestruição, aumentando a umidade dos arredores.", - }, - limber: { - name: "Limber", - description: "Seu corpo maleável protege o Pokémon da paralisia.", - }, - sandVeil: { - name: "Sand Veil", - description: "Aumenta a evasão do Pokémon durante as tempestades de areia.", - }, - static: { - name: "Static", - description: "O Pokémon é carregado com energia estática, então entrar em contato com ele pode causar paralisia.", - }, - voltAbsorb: { - name: "Volt Absorb", - description: "Se for atingido por um movimento do tipo Elétrico, ele restaura seus PS ao invés de receber dano.", - }, - waterAbsorb: { - name: "Water Absorb", - description: "Se for atingido por um movimento do tipo Água, ele restaura seus PS ao invés de receber dano.", - }, - oblivious: { - name: "Oblivious", - description: "Sua indiferença impede que o Pokémon fique apaixonado ou seja provocado por outro Pokémon.", - }, - cloudNine: { - name: "Cloud Nine", - description: "Anula todos os efeitos climáticos na batalha.", - }, - compoundEyes: { - name: "Compound Eyes", - description: "O olho preciso do Pokémon aumenta sua precisão.", - }, - insomnia: { - name: "Insomnia", - description: "Este Pokémon está sofrendo com insônia e não pode adormecer.", - }, - colorChange: { - name: "Color Change", - description: "Este Pokémon se torna do tipo do último ataque que sofreu.", - }, - immunity: { - name: "Immunity", - description: "O sistema imunológico deste Pokémon impede que ele seja envenenado.", - }, - flashFire: { - name: "Flash Fire", - description: "Fortalece movimentos do tipo Fogo quando atingido por um.", - }, - shieldDust: { - name: "Shield Dust", - description: "A poeira desse Pokémon bloqueia efeitos adicionais dos ataques recebidos.", - }, - ownTempo: { - name: "Own Tempo", - description: "Este Pokémon tem seu próprio ritmo, que o impede de ficar confuso.", - }, - suctionCups: { - name: "Suction Cups", - description: "Este Pokémon usa sua ventosas para fixar-se no lugar, negando todos os movimentos e itens que o obriguem a recuar.", - }, - intimidate: { - name: "Intimidate", - description: "Quando entra em batalha, este Pokémon intimida o Pokémon adversário, diminuindo seu Ataque.", - }, - shadowTag: { - name: "Shadow Tag", - description: "Este Pokémon pisa na sombra do Pokémon adversário, impedindo que ele escape da batalha.", - }, - roughSkin: { - name: "Rough Skin", - description: "Quando recebe um ataque direto, usa sua pele áspera para infligir dano ao Pokémon atacante.", - }, - wonderGuard: { - name: "Wonder Guard", - description: "Devido seu misterioso poder, apenas movimentos supereficazes acertam esse Pokémon.", - }, - levitate: { - name: "Levitate", - description: "Através da levitação esse Pokémon se torna completamente imune a movimentos do tipo Terra.", - }, - effectSpore: { - name: "Effect Spore", - description: "Contato direto com o Pokémon pode infligir paralisia, sono ou envenenamento ao atacante.", - }, - synchronize: { - name: "Synchronize", - description: "O atacante sofrerá a mesma mudança de estado se causar queima, envenenamento ou paralisia ao Pokémon.", - }, - clearBody: { - name: "Clear Body", - description: "Previne que Habilidades e movimentos de outros Pokémon diminuam os atributos deste Pokémon.", - }, - naturalCure: { - name: "Natural Cure", - description: "Quando este Pokémon recua, todas mudanças de estado são curadas.", - }, - lightningRod: { - name: "Lightning Rod", - description: "O Pokémon absorve todos os movimentos do tipo Elétrico e, ao invés de sofrer dano, aumenta seu Ataque Esp.", - }, - sereneGrace: { - name: "Serene Grace", - description: "Aumenta a probabilidade de ocorrerem efeitos adicionais ao atacar.", - }, - swiftSwim: { - name: "Swift Swim", - description: "A Velocidade do Pokémon é aumentada quando chove.", - }, - chlorophyll: { - name: "Chlorophyll", - description: "A Velocidade do Pokémon é aumentada sob sol forte.", - }, - illuminate: { - name: "Illuminate", - description: "Ilumina os arredores, aumentado a possibilidade de encontrar Pokémon selvagens.", - }, - trace: { - name: "Trace", - description: "Quando entra em batalha, o Pokémon copia a Habilidade de um Pokémon adversário.", - }, - hugePower: { - name: "Huge Power", - description: "Dobra o Ataque do Pokémon.", - }, - poisonPoint: { - name: "Poison Point", - description: "Contato direto com o Pokémon pode envenenar o atacante.", - }, - innerFocus: { - name: "Inner Focus", - description: "O foco extraordinário do Pokémon o impede de hesitar.", - }, - magmaArmor: { - name: "Magma Armor", - description: "O magma escaldante que cobre o Pokémon previne seu congelamento.", - }, - waterVeil: { - name: "Water Veil", - description: "O véu de água que cobre o Pokémon previne que ele seja queimado.", - }, - magnetPull: { - name: "Magnet Pull", - description: "Impede que Pokémon do tipo Aço escapem através da utilização de sua força magnética.", - }, - soundproof: { - name: "Soundproof", - description: "Antirruído dá ao Pokémon imunidade completa a todos movimentos baseados em som.", - }, - rainDish: { - name: "Rain Dish", - description: "O Pokémon recupera PS gradualmente na chuva.", - }, - sandStream: { - name: "Sand Stream", - description: "Quando entra em batalha o Pokémon conjura uma tempestade de areia.", - }, - pressure: { - name: "Pressure", - description: "Pressionando o Pokémon adversário, ele aumenta o custo de PP para o adversário usar um movimento.", - }, - thickFat: { - name: "Thick Fat", - description: "Movimentos dos tipos Fogo e Água têm seu dano reduzido pela metade devido à grossa camada de gordura que protege o Pokémon.", - }, - earlyBird: { - name: "Early Bird", - description: "O Pokémon acorda duas vezes mais rápido que outros Pokémon.", - }, - flameBody: { - name: "Flame Body", - description: "Contato direto com o Pokémon pode queimar o atacante.", - }, - runAway: { - name: "Run Away", - description: "Torna a fuga de encontros com Pokémon selvagem garantida.", - }, - keenEye: { - name: "Keen Eye", - description: "Seu olhar extremamente aguçado evita que outros Pokémon diminuam sua Precisão.", - }, - hyperCutter: { - name: "Hyper Cutter", - description: "Suas poderosas pinças enchem o Pokémon de orgulho. Elas impedem que outros Pokémon diminuam seu atributo de Ataque.", - }, - pickup: { - name: "Pickup", - description: "Após uma batalha, o Pokémon pegará um item que um adversário deixou cair.", - }, - truant: { - name: "Truant", - description: "Se utilizar um movimento, o Pokémon precisará descansar no turno seguinte.", - }, - hustle: { - name: "Hustle", - description: "Aumenta seu Ataque em troca de diminuir a precisão.", - }, - cuteCharm: { - name: "Cute Charm", - description: "Contato direto com o Pokémon pode causar paixão ao atacante.", - }, - plus: { - name: "Plus", - description: "Aumenta o Ataque Esp. do Pokémon se estiver em batalha com um aliado que tenha as Habilidades Plus ou Minus.", - }, - minus: { - name: "Minus", - description: "Aumenta o Ataque Esp. do Pokémon se estiver em batalha com um aliado que tenha as Habilidades Mais ou Menos.", - }, - forecast: { - name: "Forecast", - description: "O tipo do Pokémon altera-se para Água, Fogo ou Gelo, dependendo do clima.", - }, - stickyHold: { - name: "Sticky Hold", - description: "Outros Pokémon não podem remover itens que este Pokémon esteja segurando.", - }, - shedSkin: { - name: "Shed Skin", - description: "O Pokémon pode curar-se de mudanças de estado através da troca de pele.", - }, - guts: { - name: "Guts", - description: "É tão corajoso que ser afetado por uma mudança de estado aumenta seu Ataque.", - }, - marvelScale: { - name: "Marvel Scale", - description: "Se for afetado por uma mudança de estado, as escamas maravilhosas do Pokémon aumentarão sua Defesa.", - }, - liquidOoze: { - name: "Liquid Ooze", - description: "Exala uma substância tóxica com fedor terrível que causa dano a qualquer atacante que use um movimento de dreno.", - }, - overgrow: { - name: "Overgrow", - description: "Fortalece os movimentos do tipo Planta quando o Pokémon está com poucos PS.", - }, - blaze: { - name: "Blaze", - description: "Fortalece os movimentos do tipo Fogo quando o Pokémon está com poucos PS.", - }, - torrent: { - name: "Torrent", - description: "Fortalece os movimentos do tipo Água quando o Pokémon está com poucos PS.", - }, - swarm: { - name: "Swarm", - description: "Fortalece os movimentos do tipo Inseto quando o Pokémon está com poucos PS.", - }, - rockHead: { - name: "Rock Head", - description: "Protege o Pokémon de dano colateral.", - }, - drought: { - name: "Drought", - description: "Intensifica a luz solar quando o Pokémon entra em batalha.", - }, - arenaTrap: { - name: "Arena Trap", - description: "Impede que Pokémon adversários fujam.", - }, - vitalSpirit: { - name: "Vital Spirit", - description: "Sua determinação o impede de adormecer.", - }, - whiteSmoke: { - name: "White Smoke", - description: "O Pokémon é protegido por sua fumaça branca que previne que outros Pokémon diminuam seus atributos.", - }, - purePower: { - name: "Pure Power", - description: "O Pokémon dobra seu Ataque usando seu poder puro.", - }, - shellArmor: { - name: "Shell Armor", - description: "A robusta couraça que protege o Pokémon bloqueia os golpes críticos.", - }, - airLock: { - name: "Air Lock", - description: "Elimina efeitos climáticos.", - }, - tangledFeet: { - name: "Tangled Feet", - description: "Sua evasão aumenta se estiver confuso.", - }, - motorDrive: { - name: "Motor Drive", - description: "O Pokémon absorve todos os movimentos do tipo Elétrico e, ao invés de sofrer dano, aumenta seu atributo de Velocidade.", - }, - rivalry: { - name: "Rivalry", - description: "Sua competitividade faz com que cause mais dano a Pokémon do mesmo gênero, enquanto causa dano reduzido a Pokémon do gênero oposto.", - }, - steadfast: { - name: "Steadfast", - description: "A determinação do Pokémon faz com que sua Velocidade aumente cada vez que ele hesita.", - }, - snowCloak: { - name: "Snow Cloak", - description: "Aumenta a evasão numa tempestade de granizo.", - }, - gluttony: { - name: "Gluttony", - description: "Se estiver segurando uma fruta, a consumirá quando seus PS caírem abaixo da metade, o que é mais cedo que o usual.", - }, - angerPoint: { - name: "Anger Point", - description: "Quando recebe um acerto crítico se enraivece, e com isso, aumenta seu Ataque.", - }, - unburden: { - name: "Unburden", - description: "Se o item que o Pokémon estiver segurando for usado ou perdido, sua Velocidade aumentará.", - }, - heatproof: { - name: "Heatproof", - description: "O corpo a prova de calor desse Pokémon corta pela metade o dano de ataques do tipo Fogo que o acertam.", - }, - simple: { - name: "Simple", - description: "Duplica as mudanças de atributos do Pokémon.", - }, - drySkin: { - name: "Dry Skin", - description: "Durante chuva ou se for atingido por movimentos de Água, recupera PS. Durante sol forte tem seus PS máximo reduzido e leva dano aumentado do tipo Fogo.", - }, - download: { - name: "Download", - description: "Compara Defesa e Defesa Esp. do Pokémon adversário antes de aumentar seu próprio Ataque Esp. ou Ataque, a depender de qual será mais efetivo.", - }, - ironFist: { - name: "Iron Fist", - description: "Fortalece movimentos de soco.", - }, - poisonHeal: { - name: "Poison Heal", - description: "Se o Pokémon estiver envenenado, recuperará PS ao invés de perdê-los.", - }, - adaptability: { - name: "Adaptability", - description: "Fortalece movimentos do mesmo tipo do Pokémon.", - }, - skillLink: { - name: "Skill Link", - description: "Faz com que movimentos de repetição acertem sempre o máximo de vezes possível.", - }, - hydration: { - name: "Hydration", - description: "Cura mudanças de estado durante a chuva.", - }, - solarPower: { - name: "Solar Power", - description: "Aumenta o Ataque Esp. durante o sol forte, entretanto perde um pouco de PS a cada turno.", - }, - quickFeet: { - name: "Quick Feet", - description: "Aumenta a Velocidade se o Pokémon sofrer uma mudança de estado.", - }, - normalize: { - name: "Normalize", - description: "Todos os movimentos do Pokémon se tornam do tipo Normal. Aumenta um pouco o poder desses movimentos.", - }, - sniper: { - name: "Sniper", - description: "Aumenta o poder dos ataques caso sejam críticos.", - }, - magicGuard: { - name: "Magic Guard", - description: "O Pokémon só recebe dano de movimentos de ataque.", - }, - noGuard: { - name: "No Guard", - description: "Para garantir que todos os ataques atinjam o oponente, o Pokémon adota uma estratégia de desguarnecimento, porém, isso faz com que todos ataques o atinjam.", - }, - stall: { - name: "Stall", - description: "O Pokémon age somente após todos os outros agirem.", - }, - technician: { - name: "Technician", - description: "Aumenta o poder dos ataques mais fracos do Pokémon.", - }, - leafGuard: { - name: "Leaf Guard", - description: "Previne mudanças de estado sob o sol forte.", - }, - klutz: { - name: "Klutz", - description: "O Pokémon não pode usar nenhum item que esteja segurando.", - }, - moldBreaker: { - name: "Mold Breaker", - description: "Movimentos podem atingir independentemente da Habilidade do alvo.", - }, - superLuck: { - name: "Super Luck", - description: "O Pokémon é tão sortudo que tem a sua probabilidade de realizar golpes críticos aumentada.", - }, - aftermath: { - name: "Aftermath", - description: "Caso o Pokémon seja derrotado em decorrência de um movimento de contato, o atacante recebe dano.", - }, - anticipation: { - name: "Anticipation", - description: "O Pokémon pode sentir movimentos perigosos vindos do Pokémon adversário.", - }, - forewarn: { - name: "Forewarn", - description: "Quando entra em batalha, o Pokémon pode dizer um dos movimentos do Pokémon adversário.", - }, - unaware: { - name: "Unaware", - description: "Quando está atacando, o Pokémon ignora mudanças de atributos do Pokémon adversário.", - }, - tintedLens: { - name: "Tinted Lens", - description: "Movimentos que seriam “pouco eficazes” causam dano normalmente quando usados pelo Pokémon.", - }, - filter: { - name: "Filter", - description: "Ataques supereficazes recebidos dão menos dano.", - }, - slowStart: { - name: "Slow Start", - description: "O Ataque e a Velocidade do Pokémon são cortados pela metade por cinco turnos.", - }, - scrappy: { - name: "Scrappy", - description: "O Pokémon pode atingir Pokémon do tipo Fantasma com ataques dos tipos Normal e Lutador.", - }, - stormDrain: { - name: "Storm Drain", - description: "Atrai todos movimentos do tipo Água para si. Ao invés de receber dano desses ataques, tem seu Ataque Esp. aumentado.", - }, - iceBody: { - name: "Ice Body", - description: "O Pokémon recupera PS gradualmente durante as tempestades de granizo.", - }, - solidRock: { - name: "Solid Rock", - description: "Reduz o dano recebido de ataques supereficazes.", - }, - snowWarning: { - name: "Snow Warning", - description: "O Pokémon conjura uma tempestade de granizo quando entra em batalha.", - }, - honeyGather: { - name: "Honey Gather", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", - }, - frisk: { - name: "Frisk", - description: "Quando entra em batalha, o Pokémon pode checar a Habilidade do adversário.", - }, - reckless: { - name: "Reckless", - description: "Fortalece movimentos que têm dano colateral.", - }, - multitype: { - name: "Multitype", - description: "Altera o tipo do Pokémon para o mesmo da Placa ou Cristal Z em sua posse.", - }, - flowerGift: { - name: "Flower Gift", - description: "Sob sol forte, o Ataque e a Defesa Esp. do Pokémon e de seus aliados são aumentados.", - }, - badDreams: { - name: "Bad Dreams", - description: "Reduz os PS de Pokémon adversários que estiverem dormindo.", - }, - pickpocket: { - name: "Pickpocket", - description: "Rouba o item de um atacante que tenha feito contato direto.", - }, - sheerForce: { - name: "Sheer Force", - description: "Aumenta o poder de seus movimentos quando ataca, em detrimento de seus efeitos adicionais que são anulados.", - }, - contrary: { - name: "Contrary", - description: "Faz as mudanças de atributos terem efeito contrário.", - }, - unnerve: { - name: "Unnerve", - description: "Enerva Pokémon adversários, impossibilitando que eles consumam Frutas.", - }, - defiant: { - name: "Defiant", - description: "Aumenta bruscamente o Ataque do Pokémon quando seus atributos são diminuídos pelo adversário.", - }, - defeatist: { - name: "Defeatist", - description: "Quando fica com metade ou menos dos PS totais, corta o Ataque e Ataque Esp. do Pokémon pela metade.", - }, - cursedBody: { - name: "Cursed Body", - description: "Pode desabilitar um movimento utilizado no Pokémon.", - }, - healer: { - name: "Healer", - description: "Às vezes cura mudanças de estado de um aliado.", - }, - friendGuard: { - name: "Friend Guard", - description: "Reduz o dano causado em aliados.", - }, - weakArmor: { - name: "Weak Armor", - description: "Ataques físicos ao Pokémon diminuem sua Defesa, mas aumenta bruscamente sua Velocidade.", - }, - heavyMetal: { - name: "Heavy Metal", - description: "Dobra o peso do Pokémon.", - }, - lightMetal: { - name: "Light Metal", - description: "Divide o peso do Pokémon pela metade.", - }, - multiscale: { - name: "Multiscale", - description: "Reduz o dano que o Pokémon recebe quando está com os PS cheios.", - }, - toxicBoost: { - name: "Toxic Boost", - description: "Fortalece ataques físicos quando o Pokémon está envenenado.", - }, - flareBoost: { - name: "Flare Boost", - description: "Fortalece ataques especiais quando o Pokémon está queimado.", - }, - harvest: { - name: "Harvest", - description: "Pode criar outra Fruta após consumir uma.", - }, - telepathy: { - name: "Telepathy", - description: "Prevê os ataques de um aliado em combate e desvia de todos eles.", - }, - moody: { - name: "Moody", - description: "Aumenta bruscamente um atributo e diminui outro a cada turno.", - }, - overcoat: { - name: "Overcoat", - description: "Protege o Pokémon de coisas como areia, geada e pó.", - }, - poisonTouch: { - name: "Poison Touch", - description: "Pode envenenar um alvo quando o Pokémon faz contato.", - }, - regenerator: { - name: "Regenerator", - description: "Recupera um pouco de PS quando recua da batalha.", - }, - bigPecks: { - name: "Big Pecks", - description: "Protege o Pokémon de efeitos que diminuam a Defesa.", - }, - sandRush: { - name: "Sand Rush", - description: "Aumenta a Velocidade do Pokémon durante uma tempestade de areia.", - }, - wonderSkin: { - name: "Wonder Skin", - description: "Torna movimentos de atributos mais suscetíveis ao erro.", - }, - analytic: { - name: "Analytic", - description: "Aumenta o poder do movimento quando o Pokémon age por último.", - }, - illusion: { - name: "Illusion", - description: "Entra em batalha disfarçado, na forma do Pokémon que ocupar o último lugar na equipe.", - }, - imposter: { - name: "Imposter", - description: "O Pokémon se transforma no Pokémon que está enfrentando.", - }, - infiltrator: { - name: "Infiltrator", - description: "Ignora barreiras, substitutos e coisas do tipo utilizadas pelo Pokémon adversário e ataca normalmente.", - }, - mummy: { - name: "Mummy", - description: "Contato direto com o Pokémon altera a Habilidade do atacante para Múmia.", - }, - moxie: { - name: "Moxie", - description: "O Pokémon demonstra arrogância, e isso faz com que seu Ataque aumente após derrotar qualquer Pokémon.", - }, - justified: { - name: "Justified", - description: "Ser atingido por movimentos do tipo Sombrio aumenta o Ataque do Pokémon, por justiça.", - }, - rattled: { - name: "Rattled", - description: "Movimentos dos tipos Sombrio, Fantasma e Inseto assustam o Pokémon, aumentando sua Velocidade", - }, - magicBounce: { - name: "Magic Bounce", - description: "Ao invés de ser atingido por movimentos de atributos, reflete-os.", - }, - sapSipper: { - name: "Sap Sipper", - description: "Se for atingido por um movimento do tipo Planta, ao invés de receber dano, aumenta seu Ataque.", - }, - prankster: { - name: "Prankster", - description: "Dá prioridade a movimentos de estado.", - }, - sandForce: { - name: "Sand Force", - description: "Fortalece o poder dos movimentos do tipo Pedra, Terra e Aço em uma tempestade de areia.", - }, - ironBarbs: { - name: "Iron Barbs", - description: "Os espinhos de ferro infligem dano a um atacante que fizer contato direto.", - }, - zenMode: { - name: "Zen Mode", - description: "Quando o Pokémon tem seus PS reduzidos à metade ou menos, muda de forma.", - }, - victoryStar: { - name: "Victory Star", - description: "Aumenta a Precisão sua e de seus aliados.", - }, - turboblaze: { - name: "Turboblaze", - description: "Movimentos podem atingir independentemente da Habilidade do alvo.", - }, - teravolt: { - name: "Teravolt", - description: "Movimentos podem atingir independentemente da Habilidade do alvo.", - }, - aromaVeil: { - name: "Aroma Veil", - description: "Protege a si mesmo e a seus aliados de ataques que limitem a escolha de movimentos.", - }, - flowerVeil: { - name: "Flower Veil", - description: "Pokémon aliados do tipo Planta são protegidos de mudanças de estado e diminuição de seus atributos.", - }, - cheekPouch: { - name: "Cheek Pouch", - description: "Quando o Pokémon consome uma Fruta, também recupera um pouco de PS.", - }, - protean: { - name: "Protean", - description: "Muda o tipo do Pokémon para o tipo do movimento que ele vai utilizar.", - }, - furCoat: { - name: "Fur Coat", - description: "Reduz o dano de movimentos físicos pela metade.", - }, - magician: { - name: "Magician", - description: "O Pokémon rouba o item que um Pokémon alvo estiver segurando quando acerta um movimento.", - }, - bulletproof: { - name: "Bulletproof", - description: "Protege o Pokémon de alguns movimentos de bola e bomba.", - }, - competitive: { - name: "Competitive", - description: "Aumenta bruscamente o Ataque Esp. quando um atributo é diminuído.", - }, - strongJaw: { - name: "Strong Jaw", - description: "A poderosa mandíbula do Pokémon aumenta o poder dos seus movimentos de mordida.", - }, - refrigerate: { - name: "Refrigerate", - description: "Movimentos do tipo Normal se tornam do tipo Gelo. Aumenta um pouco o poder desses movimentos.", - }, - sweetVeil: { - name: "Sweet Veil", - description: "Previne a si e a Pokémon aliados de caírem no sono.", - }, - stanceChange: { - name: "Stance Change", - description: "O Pokemon muda para Forma Espada quando usa um movimento de ataque, e muda para a Forma Escudo quando usa o movimento Escudo do Rei.", - }, - galeWings: { - name: "Gale Wings", - description: "Quando o Pokémon está com os PS cheios, dá prioridade a movimentos do tipo Voador.", - }, - megaLauncher: { - name: "Mega Launcher", - description: "Fortalece movimentos de aura e pulso.", - }, - grassPelt: { - name: "Grass Pelt", - description: "Aumenta a Defesa do Pokémon em Terreno de Grama.", - }, - symbiosis: { - name: "Symbiosis", - description: "O Pokémon entrega seu item para um aliado que já tiver utilizado seu próprio item.", - }, - toughClaws: { - name: "Tough Claws", - description: "Fortalece movimentos que façam contato direto.", - }, - pixilate: { - name: "Pixilate", - description: "Movimentos do tipo Normal se tornam do tipo Fada. Aumenta um pouco o poder desses movimentos.", - }, - gooey: { - name: "Gooey", - description: "Contato direto com o Pokémon diminui o atributo de Velocidade do atacante.", - }, - aerilate: { - name: "Aerilate", - description: "Movimentos do tipo Normal se tornam do tipo Voador. Aumenta um pouco o poder desses movimentos.", - }, - parentalBond: { - name: "Parental Bond", - description: "Une suas forças com sua cria para atacar duas vezes.", - }, - darkAura: { - name: "Dark Aura", - description: "Fortalece movimentos do tipo Sombrio de todos os Pokémon.", - }, - fairyAura: { - name: "Fairy Aura", - description: "Fortalece movimentos do tipo Fada de todos os Pokémon.", - }, - auraBreak: { - name: "Aura Break", - description: "Os efeitos de Habilidades de “Aura” são revertidos para diminuir o poder de movimentos afetados.", - }, - primordialSea: { - name: "Primordial Sea", - description: "O Pokémon muda o clima para neutralizar ataques do tipo Fogo.", - }, - desolateLand: { - name: "Desolate Land", - description: "O Pokémon muda o clima para neutralizar ataques do tipo Água.", - }, - deltaStream: { - name: "Delta Stream", - description: "O Pokémon muda o clima para eliminar todas as vulnerabilidades do tipo Voador.", - }, - stamina: { - name: "Stamina", - description: "Aumenta a Defesa quando atingido por um ataque.", - }, - wimpOut: { - name: "Wimp Out", - description: "Quando fica com metade ou menos de seus PS, recua covardemente da batalha.", - }, - emergencyExit: { - name: "Emergency Exit", - description: "Quando fica com metade ou menos de seus PS, sentindo que está em perigo, o Pokémon recua da batalha.", - }, - waterCompaction: { - name: "Water Compaction", - description: "Aumenta bruscamente a Defesa do Pokémon quando atingido por um movimento do tipo Água.", - }, - merciless: { - name: "Merciless", - description: "Os ataques do Pokémon se tornam críticos se o alvo estiver envenenado.", - }, - shieldsDown: { - name: "Shields Down", - description: "Quando fica com metade ou menos de seus PS, o Pokémon quebra sua carapaça e se torna agressivo.", - }, - stakeout: { - name: "Stakeout", - description: "Caso o alvo recue da batalha, dobra o dano causado ao Pokémon suplente.", - }, - waterBubble: { - name: "Water Bubble", - description: "Diminui o poder de movimentos do tipo Fogo usados contra o Pokémon e o impede de ficar queimado.", - }, - steelworker: { - name: "Steelworker", - description: "Fortalece os movimentos do tipo Aço.", - }, - berserk: { - name: "Berserk", - description: "Quando é atingido por um movimento que deixa seus PS na metade ou menos, aumenta seu Ataque Esp..", - }, - slushRush: { - name: "Slush Rush", - description: "Aumenta a Velocidade do Pokémon em uma tempestade de granizo.", - }, - longReach: { - name: "Long Reach", - description: "O Pokémon usa seus movimentos sem fazer contato direto com o alvo.", - }, - liquidVoice: { - name: "Liquid Voice", - description: "Todos os movimentos baseados em som se tornam do tipo Água.", - }, - triage: { - name: "Triage", - description: "Concede prioridade para movimentos de cura.", - }, - galvanize: { - name: "Galvanize", - description: "Movimentos do tipo Normal se transformam em movimentos do tipo Elétrico. Aumenta um pouco o poder desses movimentos.", - }, - surgeSurfer: { - name: "Surge Surfer", - description: "Dobra a Velocidade do Pokémon em Terreno Elétrico.", - }, - schooling: { - name: "Schooling", - description: "Quando está com bastante PS, o Pokémon forma um poderoso cardume, que se desfaz quando seus PS ficam baixos.", - }, - disguise: { - name: "Disguise", - description: "Uma vez por batalha, a mortalha que cobre o Pokémon pode protegê-lo de um ataque.", - }, - battleBond: { - name: "Battle Bond", - description: "Derrotar um Pokémon adversário fortalece os laços entre Pokémon e Treinador, fazendo com que se torne Greninja do Ash, e fortalecendo o ataque Shuriken de Água.", - }, - powerConstruct: { - name: "Power Construct", - description: "Quando seus PS ficam da metade para baixo, outras Células se agrupam para auxiliá-lo, fazendo com que o Pokémon mude para sua Forma Completa.", - }, - corrosion: { - name: "Corrosion", - description: "O Pokémon pode envenenar o alvo mesmo que ele seja dos tipos Aço ou Venenoso.", - }, - comatose: { - name: "Comatose", - description: "Está sempre cochilando e nunca acordará, entretanto, pode atacar sem acordar.", - }, - queenlyMajesty: { - name: "Queenly Majesty", - description: "Sua magnificência pressiona o Pokémon adversário, impossibilitando-o de utilizar movimentos de prioridade.", - }, - innardsOut: { - name: "Innards Out", - description: "Ao ser nocauteado, inflige dano ao adversário igual ao valor de PS que possuía antes de ser atacado.", - }, - dancer: { - name: "Dancer", - description: "Quando outro Pokémon usa um movimento de dança, pode usar um movimento de dança na sequência independentemente de sua Velocidade.", - }, - battery: { - name: "Battery", - description: "Fortalece os movimentos especiais dos Pokémon aliados.", - }, - fluffy: { - name: "Fluffy", - description: "Corta pela metade o dano recebido de movimentos que fazem contato direto, porém, dobra o dano dos ataques do tipo Fogo.", - }, - dazzling: { - name: "Dazzling", - description: "Surpreende o Pokémon adversário, impedindo-o de atacar usando movimentos de prioridade.", - }, - soulHeart: { - name: "Soul-Heart", - description: "Aumenta seu atributo de Ataque Esp. toda vez que um Pokémon desmaia.", - }, - tanglingHair: { - name: "Tangling Hair", - description: "Contato direto com o Pokémon diminui o atributo de Velocidade do atacante.", - }, - receiver: { - name: "Receiver", - description: "O Pokémon copia a Habilidade de um aliado derrotado.", - }, - powerOfAlchemy: { - name: "Power of Alchemy", - description: "O Pokémon copia a Habilidade de um aliado derrotado.", - }, - beastBoost: { - name: "Beast Boost", - description: "O Pokémon aumentará seu melhor atributo sempre que derrotar outro Pokémon.", - }, - rksSystem: { - name: "RKS System", - description: "Troca o tipo do Pokémon para igualar com o disco de memória que ele tiver instalado.", - }, - electricSurge: { - name: "Electric Surge", - description: "Quando o Pokémon entra em batalha, altera o terreno para Terreno Elétrico.", - }, - psychicSurge: { - name: "Psychic Surge", - description: "Quando o Pokémon entra em batalha, altera o terreno para Terreno Psíquico.", - }, - mistySurge: { - name: "Misty Surge", - description: "Quando o Pokémon entra em batalha, altera o terreno para Terreno Enevoado.", - }, - grassySurge: { - name: "Grassy Surge", - description: "Quando o Pokémon entra em batalha, altera o terreno para Terreno de Grama.", - }, - fullMetalBody: { - name: "Full Metal Body", - description: "Previne que as Habilidades e movimentos de outros Pokémon diminuam os atributos deste Pokémon.", - }, - shadowShield: { - name: "Shadow Shield", - description: "Reduz a quantidade de dano que o Pokémon recebe enquanto estiver com seus PS ao máximo.", - }, - prismArmor: { - name: "Prism Armor", - description: "Reduz o dano recebido por movimentos supereficazes.", - }, - intrepidSword: { - name: "Intrepid Sword", - description: "Aumenta o atributo de Ataque ao entrar em batalha.", - }, - dauntlessShield: { - name: "Dauntless Shield", - description: "Aumenta o atributo de Defesa ao entrar em batalha.", - }, - libero: { - name: "Libero", - description: "Muda o tipo do Pokémon para o tipo do movimento que ele estiver prestes a usar.", - }, - ballFetch: { - name: "Ball Fetch", - description: "Se o Pokémon não estiver segurando nenhum item, ele irá buscar a primeira Poké Bola que falhou em capturar um Pokémon na batalha.", - }, - cottonDown: { - name: "Cotton Down", - description: "Quando o Pokémon é atingido por um ataque, ele espalha algodão à volta, diminuindo o atributo de Velocidade de todos os Pokémon, exceto ele mesmo.", - }, - propellerTail: { - name: "Propeller Tail", - description: "Ignora os efeitos de Habilidades e movimentos de Pokémon adversários que redirecionam e atraem movimentos para si.", - }, - mirrorArmor: { - name: "Mirror Armor", - description: "Devolve apenas os efeitos redutores de atributos que o Pokémon recebe.", - }, - gulpMissile: { - name: "Gulp Missile", - description: "Quando o Pokémon usa Surf ou Dive, volta com uma presa. Quando recebe dano, cospe a presa no atacante.", - }, - stalwart: { - name: "Stalwart", - description: "Ignora os efeitos de Habilidades e movimentos de Pokémon adversários que redirecionam e atraem movimentos para si.", - }, - steamEngine: { - name: "Steam Engine", - description: "Aumenta drasticamente a Velocidade, se for atingido por um movimento do tipo Água ou Fogo.", - }, - punkRock: { - name: "Punk Rock", - description: "Aumenta o poder dos movimentos baseados em som. O Pokémon também recebe metade do dano desses tipos de movimentos.", - }, - sandSpit: { - name: "Sand Spit", - description: "O Pokémon cria uma tempestade de areia quando é atingido por um ataque.", - }, - iceScales: { - name: "Ice Scales", - description: "As gélidas escamas que rodeiam seu corpo reduzem à metade o dano recebido por movimentos especiais.", - }, - ripen: { - name: "Ripen", - description: "Amadurece Frutas e dobram seus efeitos.", - }, - iceFace: { - name: "Ice Face", - description: "Sua cabeça de gelo pode receber ataques físicos como substituto, mas faz com que a aparência do Pokémon mude. O gelo é restaurado no granizo.", - }, - powerSpot: { - name: "Power Spot", - description: "O simples fato de estar próximo ao Pokémon fortalece o poder de movimentos.", - }, - mimicry: { - name: "Mimicry", - description: "Muda o tipo do Pokémon dependendo do terreno.", - }, - screenCleaner: { - name: "Screen Cleaner", - description: "Quando o Pokémon entra em batalha os efeitos de Tela de Luz, Refletir e Véu Aurora são anulados, tanto para Pokémon aliados quanto para oponentes.", - }, - steelySpirit: { - name: "Steely Spirit", - description: "Fortalece o poder dos movimentos do tipo Aço de Pokémon aliados.", - }, - perishBody: { - name: "Perish Body", - description: "Quando for atingido por um ataque que cause contato direto, tanto o Pokémon quanto o atacante desmaiarão após três turnos, a não ser que recuem da batalha.", - }, - wanderingSpirit: { - name: "Wandering Spirit", - description: "O Pokémon troca de Habilidade com um Pokémon que o atinja com um movimento que faz contato direto.", - }, - gorillaTactics: { - name: "Gorilla Tactics", - description: "Aumenta o Ataque do Pokémon, entretanto, só permite que ele utilize o primeiro movimento escolhido.", - }, - neutralizingGas: { - name: "Neutralizing Gas", - description: "Se o Pokémon com Gás Neutralizador está na batalha, os efeitos das Habilidades de todos os Pokémon serão anuladas ou não serão ativados.", - }, - pastelVeil: { - name: "Pastel Veil", - description: "Protege o Pokémon e seu aliado de serem envenenados.", - }, - hungerSwitch: { - name: "Hunger Switch", - description: "O Pokémon troca sua forma, alternando entre o Modo Satisfeito e Modo Voraz ao fim de cada turno.", - }, - quickDraw: { - name: "Quick Draw", - description: "Permite que o Pokémon aja primeiro ocasionalmente.", - }, - unseenFist: { - name: "Unseen Fist", - description: "Se o Pokémon utilizar movimentos que façam contato direto, pode atacar seu alvo mesmo que ele tenha se protegido.", - }, - curiousMedicine: { - name: "Curious Medicine", - description: "Quando o Pokémon entra em uma batalha, espalha medicamentos de sua concha que removem de aliados todas mudanças de estado.", - }, - transistor: { - name: "Transistor", - description: "Fortalece movimentos do tipo Elétrico.", - }, - dragonsMaw: { - name: "Dragon's Maw", - description: "Fortalece movimentos do tipo Dragão.", - }, - chillingNeigh: { - name: "Chilling Neigh", - description: "Quando o Pokémon derrota um alvo, emite um relincho assustador que aumenta seu Ataque.", - }, - grimNeigh: { - name: "Grim Neigh", - description: "Quando o Pokémon derrota um alvo, emite um relincho assustador que aumenta seu Ataque Esp.", - }, - asOneGlacier: { - name: "As One", - description: "Essa Habilidade combina os efeitos das Habilidades Enervar de Calyrex e Relincho Branco de Glastrier.", - }, - asOneSpectrier: { - name: "As One", - description: "Essa Habilidade combina os efeitos das Habilidades Enervar de Calyrex e Relincho Negro de Spectrier.", - }, - lingeringAroma: { - name: "Lingering Aroma", - description: "O contato com o Pokémon muda a Habilidade do atacante para Lingering Aroma.", - }, - seedSower: { - name: "Seed Sower", - description: "Transforma o solo em Terreno de Grama quando o Pokémon é atingido por um ataque.", - }, - thermalExchange: { - name: "Thermal Exchange", - description: "Aumenta o atributo de Ataque quando o Pokémon é atingido por um movimento do tipo Fogo. O Pokémon também não pode ser queimado.", - }, - angerShell: { - name: "Anger Shell", - description: "Quando um ataque faz com que seu HP caia para metade ou menos, o Pokémon se enfurece. Isso reduz seus atributos de Defesa e Defesa Especial, mas aumenta seus atributos de Ataque, Ataque Especial e Velocidade.", - }, - purifyingSalt: { - name: "Purifying Salt", - description: "O sal puro do Pokémon o protege de condições de estado e reduz pela metade o dano recebido de movimentos do tipo Fantasma.", - }, - wellBakedBody: { - name: "Well-Baked Body", - description: "O Pokémon não recebe dano quando atingido por movimentos do tipo Fogo. Em vez disso, seu atributo de Defesa é aumentado drasticamente.", - }, - windRider: { - name: "Wind Rider", - description: "Aumenta o atributo de Ataque do Pokémon se o Vento de Cauda tiver efeito ou se o Pokémon for atingido por um movimento de vento. O Pokémon também não recebe dano de movimentos de vento.", - }, - guardDog: { - name: "Guard Dog", - description: "Aumenta o atributo de Ataque do Pokémon se intimidado. Movimentos e itens que forçariam o Pokémon a trocar também falham em funcionar.", - }, - rockyPayload: { - name: "Rocky Payload", - description: "Aumenta o poder dos movimentos do tipo Pedra.", - }, - windPower: { - name: "Wind Power", - description: "O Pokémon fica carregado quando é atingido por um movimento de vento, aumentando o poder do próximo movimento do tipo Elétrico que o Pokémon usa.", - }, - zeroToHero: { - name: "Zero to Hero", - description: "O Pokémon se transforma em sua Forma Herói quando é trocado.", - }, - commander: { - name: "Commander", - description: "Quando o Pokémon entra em batalha, ele entra na boca de um Dondozo aliado se ele estiver no campo. O Pokémon então emite comandos de lá.", - }, - electromorphosis: { - name: "Electromorphosis", - description: "O Pokémon fica carregado quando sofre dano, aumentando o poder do próximo movimento do tipo Elétrico que o Pokémon usa.", - }, - protosynthesis: { - name: "Protosynthesis", - description: "Aumenta o atributo mais proficiente do Pokémon sob sol intenso ou se o Pokémon estiver segurando Booster Energy.", - }, - quarkDrive: { - name: "Quark Drive", - description: "Aumenta o atributo mais proficiente do Pokémon em Terreno Elétrico ou se o Pokémon estiver segurando Booster Energy.", - }, - goodAsGold: { - name: "Good as Gold", - description: "Um corpo de ouro puro dá ao Pokémon imunidade completa aos movimentos de status de outros Pokémon.", - }, - vesselOfRuin: { - name: "Vessel of Ruin", - description: "O poder do recipiente de ruínas do Pokémon reduz os atributos de Ataque Especial de todos os Pokémon exceto o dele.", - }, - swordOfRuin: { - name: "Sword of Ruin", - description: "O poder da espada de ruínas do Pokémon reduz os atributos de Defesa de todos os Pokémon exceto o dele.", - }, - tabletsOfRuin: { - name: "Tablets of Ruin", - description: "O poder das tábuas de ruínas do Pokémon reduz os atributos de Ataque de todos os Pokémon exceto o dele.", - }, - beadsOfRuin: { - name: "Beads of Ruin", - description: "O poder das contas de ruínas do Pokémon reduz os atributos de Defesa Especial de todos os Pokémon exceto o dele.", - }, - orichalcumPulse: { - name: "Orichalcum Pulse", - description: "Torna a luz solar intensa quando o Pokémon entra em batalha. O antigo pulso vibrante do Pokémon também aumenta seu atributo de Ataque sob sol intenso.", - }, - hadronEngine: { - name: "Hadron Engine", - description: "Transforma o solo em Terreno Elétrico quando o Pokémon entra em batalha. O motor futurista dentro do Pokémon também aumenta seu atributo de Ataque Especial em Terreno Elétrico.", - }, - opportunist: { - name: "Opportunist", - description: "Se um atributo de um oponente for aumentado, o Pokémon aproveita a oportunidade para aumentar o mesmo atributo para si mesmo.", - }, - cudChew: { - name: "Cud Chew", - description: "Quando o Pokémon come uma Berry, ele a regurgita no final do próximo turno e come novamente.", - }, - sharpness: { - name: "Sharpness", - description: "Aumenta o poder dos movimentos de corte.", - }, - supremeOverlord: { - name: "Supreme Overlord", - description: "Quando o Pokémon entra em batalha, seus atributos de Ataque e Ataque Especial são levemente aumentados para cada um dos aliados em sua equipe que já foram derrotados.", - }, - costar: { - name: "Costar", - description: "Quando o Pokémon entra em batalha, ele copia as mudanças de atributos de um aliado.", - }, - toxicDebris: { - name: "Toxic Debris", - description: "Espalha espinhos venenosos aos pés da equipe adversária quando o Pokémon sofre dano de movimentos físicos.", - }, - armorTail: { - name: "Armor Tail", - description: "A cauda misteriosa que cobre a cabeça do Pokémon impede que oponentes usem movimentos de prioridade contra o Pokémon ou seus aliados.", - }, - earthEater: { - name: "Earth Eater", - description: "Se for atingido por um movimento do tipo Terra, o Pokémon restaura seu HP em vez de sofrer dano.", - }, - myceliumMight: { - name: "Mycelium Might", - description: "O Pokémon sempre agirá mais lentamente quando usar movimentos de status, mas esses movimentos não serão impedidos pela Habilidade do alvo.", - }, - mindsEye: { - name: "Mind's Eye", - description: "O Pokémon ignora mudanças na evasividade dos oponentes, sua precisão não pode ser reduzida, e ele pode atingir tipos Fantasma com movimentos dos tipos Normal e Lutador.", - }, - supersweetSyrup: { - name: "Supersweet Syrup", - description: "Um aroma doce e enjoativo se espalha pelo campo na primeira vez que o Pokémon entra em batalha, reduzindo a evasividade dos Pokémon oponentes.", - }, - hospitality: { - name: "Hospitality", - description: "Quando o Pokémon entra em batalha, ele banha seu aliado com hospitalidade, restaurando uma pequena quantidade do HP do aliado.", - }, - toxicChain: { - name: "Toxic Chain", - description: "O poder da cadeia tóxica do Pokémon pode envenenar gravemente qualquer alvo que o Pokémon atinja com um movimento.", - }, - embodyAspectTeal: { - name: "Embody Aspect", - description: "O coração do Pokémon se enche de memórias, fazendo com que a Máscara Teal brilhe e aumente o atributo de Velocidade do Pokémon.", - }, - embodyAspectWellspring: { - name: "Embody Aspect", - description: "O coração do Pokémon se enche de memórias, fazendo com que a Máscara Wellspring brilhe e aumente o atributo de Defesa Especial do Pokémon.", - }, - embodyAspectHearthflame: { - name: "Embody Aspect", - description: "O coração do Pokémon se enche de memórias, fazendo com que a Máscara Hearthflame brilhe e aumente o atributo de Ataque do Pokémon.", - }, - embodyAspectCornerstone: { - name: "Embody Aspect", - description: "O coração do Pokémon se enche de memórias, fazendo com que a Máscara Cornerstone brilhe e aumente o atributo de Defesa do Pokémon.", - }, - teraShift: { - name: "Tera Shift", - description: "Quando o Pokémon entra em batalha, ele absorve a energia ao seu redor e se transforma em sua Forma Terastal.", - }, - teraShell: { - name: "Tera Shell", - description: "A casca do Pokémon contém os poderes de cada tipo. Todos os movimentos que causam dano que atingem o Pokémon quando seu HP está cheio não serão muito eficazes.", - }, - teraformZero: { - name: "Teraform Zero", - description: "Quando Terapagos muda para sua Forma Estelar, ele usa seus poderes ocultos para eliminar todos os efeitos do clima e do terreno, reduzindo-os a zero.", - }, - poisonPuppeteer: { - name: "Poison Puppeteer", - description: "Pokémon envenenados pelos movimentos de Pecharunt também ficarão confusos.", - }, -} as const; diff --git a/src/locales/pt_BR/achv.json b/src/locales/pt_BR/achv.json new file mode 100644 index 00000000000..93e982b60ea --- /dev/null +++ b/src/locales/pt_BR/achv.json @@ -0,0 +1,272 @@ +{ + "Achievements": { + "name": "Conquistas" + }, + "Locked": { + "name": "Não conquistado" + }, + "MoneyAchv": { + "description": "Acumule um total de ₽{{moneyAmount}}" + }, + "10K_MONEY": { + "name": "Chuva de Dinheiro" + }, + "100K_MONEY": { + "name": "Tô Rica!" + }, + "1M_MONEY": { + "name": "Quem Quer Ser Um Milionário?" + }, + "10M_MONEY": { + "name": "Tio Patinhas" + }, + "DamageAchv": { + "description": "Inflija {{damageAmount}} de dano em um único golpe" + }, + "250_DMG": { + "name": "Essa Doeu!" + }, + "1000_DMG": { + "name": "Essa Doeu Mais!" + }, + "2500_DMG": { + "name": "Essa Doeu Muito!" + }, + "10000_DMG": { + "name": "Essa Doeu Pra Caramba!" + }, + "HealAchv": { + "description": "Cure {{healAmount}} {{HP}} de uma vez só com um movimento, habilidade ou item segurado" + }, + "250_HEAL": { + "name": "Residente" + }, + "1000_HEAL": { + "name": "Enfermeiro", + "name_female": "Enfermeira" + }, + "2500_HEAL": { + "name": "Médico", + "name_female": "Médica" + }, + "10000_HEAL": { + "name": "Médico de Plantão", + "name_female": "Médica de Plantão" + }, + "LevelAchv": { + "description": "Aumente o nível de um Pokémon para o Nv{{level}}" + }, + "LV_100": { + "name": "Calma Que Tem Mais!" + }, + "LV_250": { + "name": "Treinador de Elite", + "name_female": "Treinadora de Elite" + }, + "LV_1000": { + "name": "Ao Infinito e Além!" + }, + "RibbonAchv": { + "description": "Acumule um total de {{ribbonAmount}} Fitas" + }, + "10_RIBBONS": { + "name": "Fita de Bronze" + }, + "25_RIBBONS": { + "name": "Fita de Prata" + }, + "50_RIBBONS": { + "name": "Fita de Ouro" + }, + "75_RIBBONS": { + "name": "Fita de Platina" + }, + "100_RIBBONS": { + "name": "Fita de Diamante" + }, + "TRANSFER_MAX_STAT_STAGE": { + "name": "Trabalho em Equipe", + "description": "Use Baton Pass com pelo menos um atributo aumentado ao máximo" + }, + "MAX_FRIENDSHIP": { + "name": "Melhores Amigos", + "description": "Alcance a amizade máxima com um Pokémon" + }, + "MEGA_EVOLVE": { + "name": "Megamorfose", + "description": "Megaevolua um Pokémon" + }, + "GIGANTAMAX": { + "name": "Ficou Gigante!", + "description": "Gigantamax um Pokémon" + }, + "TERASTALLIZE": { + "name": "Terastalização", + "description": "Terastalize um Pokémon" + }, + "STELLAR_TERASTALLIZE": { + "name": "Estrela Cadente", + "description": "Terastalize um Pokémon para o tipo Estelar" + }, + "SPLICE": { + "name": "Fusão!", + "description": "Funda dois Pokémon com um Splicer de DNA" + }, + "MINI_BLACK_HOLE": { + "name": "Buraco Sem Fundo", + "description": "Adquira um Mini Buraco Negro" + }, + "CATCH_MYTHICAL": { + "name": "Mítico", + "description": "Capture um Pokémon Mítico" + }, + "CATCH_SUB_LEGENDARY": { + "name": "Quase Lendário", + "description": "Capture um Pokémon Semi-Lendário" + }, + "CATCH_LEGENDARY": { + "name": "Lendário", + "description": "Capture um Pokémon Lendário" + }, + "SEE_SHINY": { + "name": "Ué, Tá Brilhando?", + "description": "Encontre um Pokémon Shiny selvagem" + }, + "SHINY_PARTY": { + "name": "Tá Todo Mundo Brilhando!", + "description": "Tenha uma equipe formada por 6 Pokémon Shiny" + }, + "HATCH_MYTHICAL": { + "name": "Ovo Mítico", + "description": "Choque um Pokémon Mítico" + }, + "HATCH_SUB_LEGENDARY": { + "name": "Ovo Semi-Lendário", + "description": "Choque um Pokémon Semi-Lendário" + }, + "HATCH_LEGENDARY": { + "name": "Ovo Lendário", + "description": "Choque um Pokémon Lendário" + }, + "HATCH_SHINY": { + "name": "Ovo Shiny", + "description": "Choque um Pokémon Shiny" + }, + "HIDDEN_ABILITY": { + "name": "Potencial Oculto", + "description": "Capture um Pokémon com uma Habilidade Oculta" + }, + "PERFECT_IVS": { + "name": "Perfeição Certificada", + "description": "Obtenha IVs perfeitos em um Pokémon" + }, + "CLASSIC_VICTORY": { + "name": "Invencível", + "description": "Vença o jogo no modo clássico" + }, + "UNEVOLVED_CLASSIC_VICTORY": { + "name": "Tire as Crianças da Sala", + "description": "Vença o jogo no Modo Clássico com pelo menos um membro da equipe não evoluído." + }, + "MONO_GEN_ONE": { + "name": "O Início de Tudo", + "description": "Complete o desafio da geração um." + }, + "MONO_GEN_TWO": { + "name": "Geração 1.5", + "description": "Complete o desafio da geração dois." + }, + "MONO_GEN_THREE": { + "name": "Será que tem muita água?", + "description": "Complete o desafio da geração três." + }, + "MONO_GEN_FOUR": { + "name": "Essa foi a mais difícil?", + "description": "Complete o desafio da geração quatro." + }, + "MONO_GEN_FIVE": { + "name": "Nada original", + "description": "Complete o desafio da geração cinco." + }, + "MONO_GEN_SIX": { + "name": "Esse croissant tem recheio?", + "description": "Complete o desafio da geração seis." + }, + "MONO_GEN_SEVEN": { + "name": "Z-Move ou Se vira nos 30?", + "description": "Complete o desafio da geração sete." + }, + "MONO_GEN_EIGHT": { + "name": "Finalmente ele ganhou!", + "description": "Complete o desafio da geração oito." + }, + "MONO_GEN_NINE": { + "name": "Isso aqui tá muito fácil!", + "description": "Complete o desafio da geração nove." + }, + "MonoType": { + "description": "Complete o desafio de monotipo {{type}}." + }, + "MONO_NORMAL": { + "name": "Extra Ordinário" + }, + "MONO_FIGHTING": { + "name": "Briga de Rua" + }, + "MONO_FLYING": { + "name": "Rinha de Pidgeys" + }, + "MONO_POISON": { + "name": "Menina Veneno" + }, + "MONO_GROUND": { + "name": "Comendo Poeira" + }, + "MONO_ROCK": { + "name": "...Tanto Bate Até Que Fura" + }, + "MONO_BUG": { + "name": "Vida de Inseto" + }, + "MONO_GHOST": { + "name": "Fantasminha Camarada" + }, + "MONO_STEEL": { + "name": "Levantando Ferro" + }, + "MONO_FIRE": { + "name": "Tá Pegando Fogo, Bicho!" + }, + "MONO_WATER": { + "name": "Água Mole em Pedra Dura..." + }, + "MONO_GRASS": { + "name": "Jardim Botânico" + }, + "MONO_ELECTRIC": { + "name": "Choque de Realidade" + }, + "MONO_PSYCHIC": { + "name": "Preciso de Terapia" + }, + "MONO_ICE": { + "name": "Era do Gelo" + }, + "MONO_DRAGON": { + "name": "Caverna do Dragão" + }, + "MONO_DARK": { + "name": "É Só Uma Fase" + }, + "MONO_FAIRY": { + "name": "Clube das Winx" + }, + "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" + } +} diff --git a/src/locales/pt_BR/achv.ts b/src/locales/pt_BR/achv.ts deleted file mode 100644 index ea77e0c17e9..00000000000 --- a/src/locales/pt_BR/achv.ts +++ /dev/null @@ -1,535 +0,0 @@ -import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "Achievements": { - name: "Conquistas", - }, - "Locked": { - name: "Não conquistado", - }, - - "MoneyAchv": { - description: "Acumule um total de ₽{{moneyAmount}}", - }, - "10K_MONEY": { - name: "Chuva de Dinheiro", - }, - "100K_MONEY": { - name: "Tô Rica!", - }, - "1M_MONEY": { - name: "Quem Quer Ser Um Milionário?", - }, - "10M_MONEY": { - name: "Tio Patinhas", - }, - - "DamageAchv": { - description: "Inflija {{damageAmount}} de dano em um único golpe", - }, - "250_DMG": { - name: "Essa Doeu!", - }, - "1000_DMG": { - name: "Essa Doeu Mais!", - }, - "2500_DMG": { - name: "Essa Doeu Muito!", - }, - "10000_DMG": { - name: "Essa Doeu Pra Caramba!", - }, - - "HealAchv": { - description: "Cure {{healAmount}} {{HP}} de uma vez só com um movimento, habilidade ou item segurado", - }, - "250_HEAL": { - name: "Residente", - }, - "1000_HEAL": { - name: "Enfermeiro", - }, - "2500_HEAL": { - name: "Médico", - }, - "10000_HEAL": { - name: "Médico de Plantão", - }, - - "LevelAchv": { - description: "Aumente o nível de um Pokémon para o Nv{{level}}", - }, - "LV_100": { - name: "Calma Que Tem Mais!", - }, - "LV_250": { - name: "Treinador de Elite", - }, - "LV_1000": { - name: "Ao Infinito e Além!", - }, - - "RibbonAchv": { - description: "Acumule um total de {{ribbonAmount}} Fitas", - }, - "10_RIBBONS": { - name: "Fita de Bronze", - }, - "25_RIBBONS": { - name: "Fita de Prata", - }, - "50_RIBBONS": { - name: "Fita de Ouro", - }, - "75_RIBBONS": { - name: "Fita de Platina", - }, - "100_RIBBONS": { - name: "Fita de Diamante", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "Trabalho em Equipe", - description: "Use Baton Pass com pelo menos um atributo aumentado ao máximo", - }, - "MAX_FRIENDSHIP": { - name: "Melhores Amigos", - description: "Alcance a amizade máxima com um Pokémon", - }, - "MEGA_EVOLVE": { - name: "Megamorfose", - description: "Megaevolua um Pokémon", - }, - "GIGANTAMAX": { - name: "Ficou Gigante!", - description: "Gigantamax um Pokémon", - }, - "TERASTALLIZE": { - name: "Terastalização", - description: "Terastalize um Pokémon", - }, - "STELLAR_TERASTALLIZE": { - name: "Estrela Cadente", - description: "Terastalize um Pokémon para o tipo Estelar", - }, - "SPLICE": { - name: "Fusão!", - description: "Funda dois Pokémon com um Splicer de DNA", - }, - "MINI_BLACK_HOLE": { - name: "Buraco Sem Fundo", - description: "Adquira um Mini Buraco Negro", - }, - "CATCH_MYTHICAL": { - name: "Mítico", - description: "Capture um Pokémon Mítico", - }, - "CATCH_SUB_LEGENDARY": { - name: "Quase Lendário", - description: "Capture um Pokémon Semi-Lendário", - }, - "CATCH_LEGENDARY": { - name: "Lendário", - description: "Capture um Pokémon Lendário", - }, - "SEE_SHINY": { - name: "Ué, Tá Brilhando?", - description: "Encontre um Pokémon Shiny selvagem", - }, - "SHINY_PARTY": { - name: "Tá Todo Mundo Brilhando!", - description: "Tenha uma equipe formada por 6 Pokémon Shiny", - }, - "HATCH_MYTHICAL": { - name: "Ovo Mítico", - description: "Choque um Pokémon Mítico", - }, - "HATCH_SUB_LEGENDARY": { - name: "Ovo Semi-Lendário", - description: "Choque um Pokémon Semi-Lendário", - }, - "HATCH_LEGENDARY": { - name: "Ovo Lendário", - description: "Choque um Pokémon Lendário", - }, - "HATCH_SHINY": { - name: "Ovo Shiny", - description: "Choque um Pokémon Shiny", - }, - "HIDDEN_ABILITY": { - name: "Potencial Oculto", - description: "Capture um Pokémon com uma Habilidade Oculta", - }, - "PERFECT_IVS": { - name: "Perfeição Certificada", - description: "Obtenha IVs perfeitos em um Pokémon", - }, - "CLASSIC_VICTORY": { - name: "Invencível", - description: "Vença o jogo no modo clássico", - }, - - "MONO_GEN_ONE": { - - name: "O Início de Tudo", - description: "Complete o desafio da geração um.", - }, - "MONO_GEN_TWO": { - name: "Geração 1.5", - description: "Complete o desafio da geração dois.", - }, - "MONO_GEN_THREE": { - name: "Será que tem muita água?", - description: "Complete o desafio da geração três.", - }, - "MONO_GEN_FOUR": { - name: "Essa foi a mais difícil?", - description: "Complete o desafio da geração quatro.", - }, - "MONO_GEN_FIVE": { - name: "Nada original", - description: "Complete o desafio da geração cinco.", - }, - "MONO_GEN_SIX": { - name: "Esse croissant tem recheio?", - description: "Complete o desafio da geração seis.", - }, - "MONO_GEN_SEVEN": { - name: "Z-Move ou Se vira nos 30?", - description: "Complete o desafio da geração sete.", - }, - "MONO_GEN_EIGHT": { - name: "Finalmente ele ganhou!", - description: "Complete o desafio da geração oito.", - }, - "MONO_GEN_NINE": { - name: "Isso aqui tá muito fácil!", - description: "Complete o desafio da geração nove.", - }, - - "MonoType": { - description: "Complete o desafio de monotipo {{type}}.", - }, - "MONO_NORMAL": { - name: "Extra Ordinário", - }, - "MONO_FIGHTING": { - name: "Briga de Rua", - }, - "MONO_FLYING": { - name: "Rinha de Pidgeys", - }, - "MONO_POISON": { - name: "Menina Veneno", - }, - "MONO_GROUND": { - name: "Comendo Poeira", - }, - "MONO_ROCK": { - name: "Duro Como Pedra", - }, - "MONO_BUG": { - name: "Vida de Inseto", - }, - "MONO_GHOST": { - name: "Fantasminha Camarada", - }, - "MONO_STEEL": { - name: "Levantando Ferro", - }, - "MONO_FIRE": { - name: "Tá Pegando Fogo, Bicho!", - }, - "MONO_WATER": { - name: "Água Mole em Pedra Dura...", - }, - "MONO_GRASS": { - name: "Jardim Botânico", - }, - "MONO_ELECTRIC": { - name: "Choque de Realidade", - }, - "MONO_PSYCHIC": { - name: "Preciso de Terapia", - }, - "MONO_ICE": { - name: "Era do Gelo", - }, - "MONO_DRAGON": { - name: "Caverna do Dragão", - }, - "MONO_DARK": { - name: "É Só Uma Fase", - }, - "MONO_FAIRY": { - name: "Clube das Winx", - }, -} as const; - -// Achievement translations for the when the player character is female -export const PGFachv: AchievementTranslationEntries = { - "Achievements": { - name: "Conquistas", - }, - "Locked": { - name: "Não conquistado", - }, - - "MoneyAchv": { - description: "Acumule um total de ₽{{moneyAmount}}", - }, - "10K_MONEY": { - name: "Chuva de Dinheiro", - }, - "100K_MONEY": { - name: "Tô Rica!", - }, - "1M_MONEY": { - name: "Quem Quer Ser Um Milionário?", - }, - "10M_MONEY": { - name: "Tio Patinhas", - }, - - "DamageAchv": { - description: "Inflija {{damageAmount}} de dano em um único golpe", - }, - "250_DMG": { - name: "Essa Doeu!", - }, - "1000_DMG": { - name: "Essa Doeu Mais!", - }, - "2500_DMG": { - name: "Essa Doeu Muito!", - }, - "10000_DMG": { - name: "Essa Doeu Pra Caramba!", - }, - - "HealAchv": { - description: "Cure {{healAmount}} {{HP}} de uma vez só com um movimento, habilidade ou item segurado", - }, - "250_HEAL": { - name: "Residente", - }, - "1000_HEAL": { - name: "Enfermeira", - }, - "2500_HEAL": { - name: "Médica", - }, - "10000_HEAL": { - name: "Médica de Plantão", - }, - - "LevelAchv": { - description: "Aumente o nível de um Pokémon para o Nv{{level}}", - }, - "LV_100": { - name: "Calma Que Tem Mais!", - }, - "LV_250": { - name: "Treinadora de Elite", - }, - "LV_1000": { - name: "Ao Infinito e Além!", - }, - - "RibbonAchv": { - description: "Acumule um total de {{ribbonAmount}} Fitas", - }, - "10_RIBBONS": { - name: "Fita de Bronze", - }, - "25_RIBBONS": { - name: "Fita de Prata", - }, - "50_RIBBONS": { - name: "Fita de Ouro", - }, - "75_RIBBONS": { - name: "Fita de Platina", - }, - "100_RIBBONS": { - name: "Fita de Diamante", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "Trabalho em Equipe", - description: "Use Baton Pass com pelo menos um atributo aumentado ao máximo", - }, - "MAX_FRIENDSHIP": { - name: "Melhores Amigos", - description: "Alcance a amizade máxima com um Pokémon", - }, - "MEGA_EVOLVE": { - name: "Megamorfose", - description: "Megaevolua um Pokémon", - }, - "GIGANTAMAX": { - name: "Ficou Gigante!", - description: "Gigantamax um Pokémon", - }, - "TERASTALLIZE": { - name: "Terastalização", - description: "Terastalize um Pokémon", - }, - "STELLAR_TERASTALLIZE": { - name: "Estrela Cadente", - description: "Terastalize um Pokémon para o tipo Estelar", - }, - "SPLICE": { - name: "Fusão!", - description: "Funda dois Pokémon com um Splicer de DNA", - }, - "MINI_BLACK_HOLE": { - name: "Buraco Sem Fundo", - description: "Adquira um Mini Buraco Negro", - }, - "CATCH_MYTHICAL": { - name: "Mítico", - description: "Capture um Pokémon Mítico", - }, - "CATCH_SUB_LEGENDARY": { - name: "Quase Lendário", - description: "Capture um Pokémon Semi-Lendário", - }, - "CATCH_LEGENDARY": { - name: "Lendário", - description: "Capture um Pokémon Lendário", - }, - "SEE_SHINY": { - name: "Ué, Tá Brilhando?", - description: "Encontre um Pokémon Shiny selvagem", - }, - "SHINY_PARTY": { - name: "Tá Todo Mundo Brilhando!", - description: "Tenha uma equipe formada por 6 Pokémon Shiny", - }, - "HATCH_MYTHICAL": { - name: "Ovo Mítico", - description: "Choque um Pokémon Mítico", - }, - "HATCH_SUB_LEGENDARY": { - name: "Ovo Semi-Lendário", - description: "Choque um Pokémon Semi-Lendário", - }, - "HATCH_LEGENDARY": { - name: "Ovo Lendário", - description: "Choque um Pokémon Lendário", - }, - "HATCH_SHINY": { - name: "Ovo Shiny", - description: "Choque um Pokémon Shiny", - }, - "HIDDEN_ABILITY": { - name: "Potencial Oculto", - description: "Capture um Pokémon com uma Habilidade Oculta", - }, - "PERFECT_IVS": { - name: "Perfeição Certificada", - description: "Obtenha IVs perfeitos em um Pokémon", - }, - "CLASSIC_VICTORY": { - name: "Invencível", - description: "Vença o jogo no modo clássico", - }, - - "MONO_GEN_ONE": { - - name: "O Início de Tudo", - description: "Complete o desafio da geração um.", - }, - "MONO_GEN_TWO": { - name: "Geração 1.5", - description: "Complete o desafio da geração dois.", - }, - "MONO_GEN_THREE": { - name: "Será que tem muita água?", - description: "Complete o desafio da geração três.", - }, - "MONO_GEN_FOUR": { - name: "Essa foi a mais difícil?", - description: "Complete o desafio da geração quatro.", - }, - "MONO_GEN_FIVE": { - name: "Nada original", - description: "Complete o desafio da geração cinco.", - }, - "MONO_GEN_SIX": { - name: "Esse croissant tem recheio?", - description: "Complete o desafio da geração seis.", - }, - "MONO_GEN_SEVEN": { - name: "Z-Move ou Se vira nos 30?", - description: "Complete o desafio da geração sete.", - }, - "MONO_GEN_EIGHT": { - name: "Finalmente ele ganhou!", - description: "Complete o desafio da geração oito.", - }, - "MONO_GEN_NINE": { - name: "Isso aqui tá muito fácil!", - description: "Complete o desafio da geração nove.", - }, - - "MonoType": { - description: "Complete o desafio de monotipo {{type}}.", - }, - "MONO_NORMAL": { - name: "Extra Ordinário", - }, - "MONO_FIGHTING": { - name: "Briga de Rua", - }, - "MONO_FLYING": { - name: "Rinha de Pidgeys", - }, - "MONO_POISON": { - name: "Menina Veneno", - }, - "MONO_GROUND": { - name: "Comendo Poeira", - }, - "MONO_ROCK": { - name: "Duro Como Pedra", - }, - "MONO_BUG": { - name: "Vida de Inseto", - }, - "MONO_GHOST": { - name: "Fantasminha Camarada", - }, - "MONO_STEEL": { - name: "Levantando Ferro", - }, - "MONO_FIRE": { - name: "Tá Pegando Fogo, Bicho!", - }, - "MONO_WATER": { - name: "Água Mole em Pedra Dura...", - }, - "MONO_GRASS": { - name: "Jardim Botânico", - }, - "MONO_ELECTRIC": { - name: "Choque de Realidade", - }, - "MONO_PSYCHIC": { - name: "Preciso de Terapia", - }, - "MONO_ICE": { - name: "Era do Gelo", - }, - "MONO_DRAGON": { - name: "Caverna do Dragão", - }, - "MONO_DARK": { - name: "É Só Uma Fase", - }, - "MONO_FAIRY": { - name: "Clube das Winx", - }, -} as const; diff --git a/src/locales/pt_BR/arena-flyout.json b/src/locales/pt_BR/arena-flyout.json new file mode 100644 index 00000000000..a4be2727b27 --- /dev/null +++ b/src/locales/pt_BR/arena-flyout.json @@ -0,0 +1,41 @@ +{ + "activeBattleEffects": "Efeitos de Batalha Ativos", + "player": "Jogador", + "neutral": "Neutro", + "enemy": "Inimigo", + "sunny": "Ensolarado", + "rain": "Chuva", + "sandstorm": "Tempestade de Areia", + "hail": "Granizo", + "snow": "Neve", + "fog": "Névoa", + "heavyRain": "Chuva Forte", + "harshSun": "Sol Forte", + "strongWinds": "Ventos Fortes", + "misty": "Terreno Enevoado", + "electric": "Terreno Elétrico", + "grassy": "Terreno de Planta", + "psychic": "Terreno Psíquico", + "mudSport": "Mud Sport", + "waterSport": "Water Sport", + "spikes": "Spikes", + "toxicSpikes": "Toxic Spikes", + "mist": "Mist", + "futureSight": "Future Sight", + "doomDesire": "Doom Desire", + "wish": "Wish", + "stealthRock": "Stealth Rock", + "stickyWeb": "Sticky Web", + "trickRoom": "Trick Room", + "gravity": "Gravity", + "reflect": "Reflect", + "lightScreen": "Light Screen", + "auroraVeil": "Aurora Veil", + "quickGuard": "Quick Guard", + "wideGuard": "Wide Guard", + "matBlock": "Mat Block", + "craftyShield": "Crafty Shield", + "tailwind": "Tailwind", + "happyHour": "Happy Hour", + "safeguard": "Safeguard" +} diff --git a/src/locales/pt_BR/arena-tag.json b/src/locales/pt_BR/arena-tag.json new file mode 100644 index 00000000000..7ab1ecea721 --- /dev/null +++ b/src/locales/pt_BR/arena-tag.json @@ -0,0 +1,57 @@ +{ + "yourTeam": "sua equipe", + "opposingTeam": "a equipe adversária", + "arenaOnRemove": "O efeito de {{moveName}} acabou.", + "arenaOnRemovePlayer": "O efeito de {{moveName}} acabou\nem sua equipe.", + "arenaOnRemoveEnemy": "O efeito de {{moveName}} acabou\nna equipe adversária.", + "mistOnAdd": "A equipe de {{pokemonNameWithAffix}} está protegida\npela névoa!", + "mistApply": "A névoa previne\na diminuição de atributos!", + "reflectOnAdd": "Reflect reduziu o dano de movimentos físicos.", + "reflectOnAddPlayer": "Reflect reduziu o dano de movimentos físicos em sua equipe.", + "reflectOnAddEnemy": "Reflect reduziu o dano de movimentos físicos na equipe adversária.", + "lightScreenOnAdd": "Light Screen reduziu o dano de movimentos especiais.", + "lightScreenOnAddPlayer": "Light Screen reduziu o dano de movimentos especiais em sua equipe.", + "lightScreenOnAddEnemy": "Light Screen reduziu o dano de movimentos especiais na equipe adversária.", + "auroraVeilOnAdd": "Aurora Veil reduziu o dano de movimentos.", + "auroraVeilOnAddPlayer": "Aurora Veil reduziu o dano de movimentos em sua equipe.", + "auroraVeilOnAddEnemy": "Aurora Veil reduziu o dano de movimentos na equipe adversária.", + "conditionalProtectOnAdd": "{{moveName}} protegeu a equipe!", + "conditionalProtectOnAddPlayer": "{{moveName}} protegeu sua equipe!", + "conditionalProtectOnAddEnemy": "{{moveName}} protegeu a\nequipe adversária!", + "conditionalProtectApply": "{{moveName}} protegeu {{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} pretende levantar um tapete\npara bloquear ataques!", + "noCritOnAddPlayer": "{{moveName}} protegeu sua\nequipe de acertos críticos!", + "noCritOnAddEnemy": "{{moveName}} protegeu a\nequipe adversária de acertos críticos", + "noCritOnRemove": "{{moveName}} de {{pokemonNameWithAffix}}\nacabou!", + "wishTagOnAdd": "O desejo de {{pokemonNameWithAffix}}\nfoi concedido!", + "mudSportOnAdd": "O poder de movimentos elétricos foi enfraquecido!", + "mudSportOnRemove": "Os efeitos de Mud Sport\nsumiram.", + "waterSportOnAdd": "O poder de movimentos de fogo foi enfraquecido!", + "waterSportOnRemove": "Os efeitos de Water Sport\nsumiram.", + "spikesOnAdd": "{{moveName}} foram espalhados\nno chão ao redor de {{opponentDesc}}!", + "spikesActivateTrap": "{{pokemonNameWithAffix}} foi ferido\npelos espinhos!", + "toxicSpikesOnAdd": "{{moveName}} foram espalhados\nno chão ao redor de {{opponentDesc}}!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorveu os {{moveName}}!", + "stealthRockOnAdd": "Pedras pontiagudas estão flutuando\nao redor de {{opponentDesc}}!", + "stealthRockActivateTrap": "{{pokemonNameWithAffix}} foi atingido\npor pedras pontiagudas!", + "stickyWebOnAdd": "Uma {{moveName}} foi espalhada no chão ao redor da equipe adversária!", + "stickyWebActivateTrap": "{{pokemonName}} adversário foi pego por uma Sticky Web!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} distorceu\nas dimensões!", + "trickRoomOnRemove": "As dimensões distorcidas\nretornaram ao normal!", + "gravityOnAdd": "A gravidade aumentou!", + "gravityOnRemove": "A gravidade retornou ao normal!", + "tailwindOnAdd": "O Tailwind soprou de trás de sua equipe!", + "tailwindOnAddPlayer": "O Tailwind soprou de trás de\nsua equipe!", + "tailwindOnAddEnemy": "O Tailwind soprou de trás da\nequipe adversária!", + "tailwindOnRemove": "O Tailwind de sua equipe acabou!", + "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.", + "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/battle-info.json b/src/locales/pt_BR/battle-info.json new file mode 100644 index 00000000000..0fd211c5c85 --- /dev/null +++ b/src/locales/pt_BR/battle-info.json @@ -0,0 +1,3 @@ +{ + "generation": "Geração {{generation}}" +} \ No newline at end of file diff --git a/src/locales/pt_BR/battle-message-ui-handler.json b/src/locales/pt_BR/battle-message-ui-handler.json new file mode 100644 index 00000000000..ee7062bccba --- /dev/null +++ b/src/locales/pt_BR/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "Perfeito", + "ivFantastic": "Fantástico", + "ivVeryGood": "Muito Bom", + "ivPrettyGood": "Bom", + "ivDecent": "Regular", + "ivNoGood": "Ruim" +} \ No newline at end of file diff --git a/src/locales/pt_BR/battle-message-ui-handler.ts b/src/locales/pt_BR/battle-message-ui-handler.ts deleted file mode 100644 index a7b0fb1f13b..00000000000 --- a/src/locales/pt_BR/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "Perfeito", - "ivFantastic": "Fantástico", - "ivVeryGood": "Muito Bom", - "ivPrettyGood": "Bom", - "ivDecent": "Regular", - "ivNoGood": "Ruim", -} as const; diff --git a/src/locales/pt_BR/battle-scene.json b/src/locales/pt_BR/battle-scene.json new file mode 100644 index 00000000000..a0288475d69 --- /dev/null +++ b/src/locales/pt_BR/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/pt_BR/battle.json b/src/locales/pt_BR/battle.json new file mode 100644 index 00000000000..2b20e0062ea --- /dev/null +++ b/src/locales/pt_BR/battle.json @@ -0,0 +1,98 @@ +{ + "bossAppeared": "{{bossName}} apareceu.", + "trainerAppeared": "{{trainerName}}\nquer batalhar!", + "trainerAppearedDouble": "{{trainerName}}\nquerem batalhar!", + "singleWildAppeared": "Um {{pokemonName}} selvagem apareceu!", + "trainerSendOut": "{{trainerName}} escolheu\n{{pokemonName}}!", + "multiWildAppeared": "Um {{pokemonName1}} e um {{pokemonName2}} selvagens\napareceram!", + "playerComeBack": "{{pokemonName}}, retorne!", + "trainerComeBack": "{{trainerName}} retirou {{pokemonName}} da batalha!", + "playerGo": "{{pokemonName}}, eu escolho você!", + "trainerGo": "{{trainerName}} escolheu {{pokemonName}}!", + "switchQuestion": "Quer trocar\nde {{pokemonName}}?", + "trainerDefeated": "Você derrotou\n{{trainerName}}!", + "moneyWon": "Você ganhou\n₽{{moneyAmount}} por vencer!", + "moneyPickedUp": "Você pegou ₽{{moneyAmount}} do chão!", + "pokemonCaught": "{{pokemonName}} foi capturado!", + "addedAsAStarter": "{{pokemonName}} foi adicionado\naos seus iniciais!", + "partyFull": "Sua equipe está cheia.\nSolte um Pokémon para ter espaço para {{pokemonName}}?", + "pokemon": "Pokémon", + "sendOutPokemon": "{{pokemonName}}, eu escolho você!!", + "hitResultCriticalHit": "Foi um acerto crítico!", + "hitResultSuperEffective": "É supereficaz!", + "hitResultNotVeryEffective": "É pouco eficaz...", + "hitResultNoEffect": "Isso não afeta {{pokemonName}}!", + "hitResultImmune": "{{pokemonName}} não é afetado!", + "hitResultOneHitKO": "Foi um nocaute de um golpe!", + "attackFailed": "Mas falhou!", + "attackMissed": "{{pokemonNameWithAffix}} desviou do ataque!", + "attackHitsCount": "Acertou {{count}} vezes.", + "rewardGain": "Você recebeu\n{{modifierName}}!", + "expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.", + "levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!", + "learnMove": "{{pokemonName}} aprendeu {{moveName}}!", + "learnMovePrompt": "{{pokemonName}} quer aprender\n{{moveName}}.", + "learnMoveLimitReached": "Porém, {{pokemonName}} já sabe\nquatro movimentos.", + "learnMoveReplaceQuestion": "Quer substituir um de seus movimentos por {{moveName}}?", + "learnMoveStopTeaching": "Você não quer aprender\n{{moveName}}?", + "learnMoveNotLearned": "{{pokemonName}} não aprendeu {{moveName}}.", + "learnMoveForgetQuestion": "Qual movimento quer esquecer?", + "learnMoveForgetSuccess": "{{pokemonName}} esqueceu como usar {{moveName}}.", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Puf!", + "learnMoveAnd": "E…", + "levelCapUp": "O nível máximo aumentou\npara {{levelCap}}!", + "moveNotImplemented": "{{moveName}} ainda não foi implementado e não pode ser usado.", + "moveNoPP": "Não há mais PP\npara esse movimento!", + "moveDisabled": "Não se pode usar {{moveName}} porque foi desabilitado!", + "noPokeballForce": "Uma força misteriosa\nte impede de usar Poké Bolas.", + "noPokeballTrainer": "Não se pode capturar\nPokémon dos outros!", + "noPokeballMulti": "Não se pode lançar Poké Bolas\nquando há mais de um Pokémon!", + "noPokeballStrong": "Este Pokémon é forte demais para ser capturado!\nÉ preciso enfraquecê-lo primeiro!", + "noEscapeForce": "Uma força misteriosa\nte impede de fugir.", + "noEscapeTrainer": "Não se pode fugir de\nbatalhas contra treinadores!", + "noEscapePokemon": "O movimento {{moveName}} de {{pokemonName}} te impede de fugir!", + "runAwaySuccess": "Você fugiu com sucesso.", + "runAwayCannotEscape": "Você nao conseguiu fugir!", + "escapeVerbSwitch": "trocar", + "escapeVerbFlee": "fugir", + "notDisabled": "O movimento {{moveName}}\nnão está mais desabilitado!", + "turnEndHpRestore": "Os PS de {{pokemonName}} foram restaurados!", + "hpIsFull": "Os PS de {{pokemonName}}\njá estão cheios!", + "skipItemQuestion": "Tem certeza de que não quer escolher um item?", + "itemStackFull": "O estoque de {{fullItemName}} está cheio.\nVocê receberá {{itemName}} no lugar.", + "eggHatching": "Opa?", + "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?", + "wildPokemonWithAffix": "{{pokemonName}} selvagem", + "foePokemonWithAffix": "{{pokemonName}} adversário", + "useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!", + "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", + "regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", + "stealEatBerry": "{{pokemonName}} roubou e comeu\na {{berryName}} de {{targetName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}} restaurou PP do movimento {{moveName}}\nusando sua {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} restarou sua saúde usando\nsua {{berryName}}!", + "fainted": "{{pokemonNameWithAffix}} desmaiou!", + "statsAnd": "e", + "stats": "Os atributos", + "statRose_one": "{{stats}} de {{pokemonNameWithAffix}} aumentou!", + "statRose_other": "{{stats}} de {{pokemonNameWithAffix}} aumentaram!", + "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}} aumentou bruscamente!", + "statSharplyRose_other": "{{stats}} de {{pokemonNameWithAffix}} aumentaram bruscamente!", + "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}} aumentou drasticamente!", + "statRoseDrastically_other": "{{stats}} de {{pokemonNameWithAffix}} aumentaram drasticamente!", + "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}} não vai mais aumentar!", + "statWontGoAnyHigher_other": "{{stats}} de {{pokemonNameWithAffix}} não vão mais aumentar!", + "statFell_one": "{{stats}} de {{pokemonNameWithAffix}} diminuiu!", + "statFell_other": "{{stats}} de {{pokemonNameWithAffix}} diminuíram!", + "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}} diminuiu duramente!", + "statHarshlyFell_other": "{{stats}} de {{pokemonNameWithAffix}} diminuíram duramente!", + "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}} diminuiu severamente!", + "statSeverelyFell_other": "{{stats}} de {{pokemonNameWithAffix}} diminuíram severamente!", + "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!", + "statWontGoAnyLower_other": "{{stats}} de {{pokemonNameWithAffix}} não vão mais diminuir!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!", + "retryBattle": "Você gostaria de tentar novamente desde o início da batalha?", + "unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.", + "congratulations": "Parabéns!", + "beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!" +} diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts deleted file mode 100644 index 15f1d83c3c9..00000000000 --- a/src/locales/pt_BR/battle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "{{bossName}} apareceu.", - "trainerAppeared": "{{trainerName}}\nquer batalhar!", - "trainerAppearedDouble": "{{trainerName}}\nquerem batalhar!", - "singleWildAppeared": "Um {{pokemonName}} selvagem apareceu!", - "trainerSendOut": "{{trainerName}} escolheu\n{{pokemonName}}!", - "multiWildAppeared": "Um {{pokemonName1}} e um {{pokemonName2}} selvagens\napareceram!", - "playerComeBack": "{{pokemonName}}, retorne!", - "trainerComeBack": "{{trainerName}} retirou {{pokemonName}} da batalha!", - "playerGo": "{{pokemonName}}, eu escolho você!", - "trainerGo": "{{trainerName}} escolheu {{pokemonName}}!", - "switchQuestion": "Quer trocar\nde {{pokemonName}}?", - "trainerDefeated": "Você derrotou\n{{trainerName}}!", - "moneyWon": "Você ganhou\n₽{{moneyAmount}} por ganhar!", - "pokemonCaught": "{{pokemonName}} foi capturado!", - "addedAsAStarter": "{{pokemonName}} foi adicionado\naos seus iniciais!", - "partyFull": "Sua equipe está cheia.\nSolte um Pokémon para ter espaço para {{pokemonName}}?", - "pokemon": "Pokémon", - "sendOutPokemon": "{{pokemonName}}, eu escolho você!!", - "hitResultCriticalHit": "Foi um acerto crítico!", - "hitResultSuperEffective": "É supereficaz!", - "hitResultNotVeryEffective": "É pouco eficaz...", - "hitResultNoEffect": "Isso não afeta {{pokemonName}}!", - "hitResultOneHitKO": "Foi um nocaute de um golpe!", - "attackFailed": "Mas falhou!", - "attackHitsCount": "Acertou {{count}} vezes.", - "rewardGain": "Você recebeu\n{{modifierName}}!", - "expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.", - "levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!", - "learnMove": "{{pokemonName}} aprendeu {{moveName}}!", - "learnMovePrompt": "{{pokemonName}} quer aprender\n{{moveName}}.", - "learnMoveLimitReached": "Porém, {{pokemonName}} já sabe\nquatro movimentos.", - "learnMoveReplaceQuestion": "Quer substituir um de seus movimentos por {{moveName}}?", - "learnMoveStopTeaching": "Você não quer aprender\n{{moveName}}?", - "learnMoveNotLearned": "{{pokemonName}} não aprendeu {{moveName}}.", - "learnMoveForgetQuestion": "Qual movimento quer esquecer?", - "learnMoveForgetSuccess": "{{pokemonName}} esqueceu como usar {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Puf!", - "learnMoveAnd": "E…", - "levelCapUp": "O nível máximo aumentou\npara {{levelCap}}!", - "moveNotImplemented": "{{moveName}} ainda não foi implementado e não pode ser usado.", - "moveNoPP": "Não há mais PP\npara esse movimento!", - "moveDisabled": "Não se pode usar {{moveName}} porque foi desabilitado!", - "noPokeballForce": "Uma força misteriosa\nte impede de usar Poké Bolas.", - "noPokeballTrainer": "Não se pode capturar\nPokémon dos outros!", - "noPokeballMulti": "Não se pode lançar Poké Bolas\nquando há mais de um Pokémon!", - "noPokeballStrong": "Este Pokémon é forte demais para ser capturado!\nÉ preciso enfraquecê-lo primeiro!", - "noEscapeForce": "Uma força misteriosa\nte impede de fugir.", - "noEscapeTrainer": "Não se pode fugir de\nbatalhas contra treinadores!", - "noEscapePokemon": "O movimento {{moveName}} de {{pokemonName}} te impede de fugir!", - "runAwaySuccess": "Você fugiu com sucesso.", - "runAwayCannotEscape": "Você nao conseguiu fugir!", - "escapeVerbSwitch": "trocar", - "escapeVerbFlee": "fugir", - "notDisabled": "O movimento {{moveName}}\nnão está mais desabilitado!", - "turnEndHpRestore": "Os PS de {{pokemonName}} foram restaurados!", - "hpIsFull": "Os PS de {{pokemonName}}\njá estão cheios!", - "skipItemQuestion": "Tem certeza de que não quer escolher um item?", - "eggHatching": "Opa?", - "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?", - "wildPokemonWithAffix": "{{pokemonName}} selvagem", - "foePokemonWithAffix": "{{pokemonName}} adversário", - "useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!", - "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", - "regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", - "fainted": "{{pokemonNameWithAffix}} desmaiou!", - "statRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou!", - "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou bruscamente!", - "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}} aumentou drasticamente!", - "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}} não vai mais aumentar!", - "statFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu!", - "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu duramente!", - "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu severamente!", - "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!", - "ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}!", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} hesitou!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} ficou\nconfuso!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} saiu\nde sua confusão!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} já\nestá confuso!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} está\nconfuso!", - "battlerTagsConfusedLapseHurtItself": "Se machucou em sua\nconfusão!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} não é afetado\npelos efeitos de Destiny Bond.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} levou\n{{pokemonNameWithAffix2}} junto com ele!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} se apaixonou\npor {{sourcePokemonName}}!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} já\nestá apaixonado!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} está apaixonado\npor {{sourcePokemonName}}!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} está\nimobilizado pelo amor!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} superou\nsua paixão.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} foi semeado!", - "battlerTagsSeededLapse": "A saúde de {{pokemonNameWithAffix}}\nfoi sugada pelo Leech Seed!", - "battlerTagsSeededLapseShed": "O Leech Seed de{{pokemonNameWithAffix}}\nsugou todo o gotejamento!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} começou\na ter um Nightmare!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} já\nestá preso em um Nightmare!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} está preso\nem um Nightmare!", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} ganhou\num Encore!", - "battlerTagsEncoreOnRemove": "O Encore de {{pokemonNameWithAffix}}\nacabou!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} está pronto para\najudar {{pokemonName}}!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorveu\nnutrientes com suas raízes!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} plantou suas raízes!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} se cercou\ncom um véu de água!", - "battlerTagsAquaRingLapse": "{{moveName}} restaurou\nPS de {{pokemonName}}!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} ficou com sono!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} foi ferido\npelo {{moveName}}!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} foi espremido\npelo {{moveName}} de {{sourcePokemonName}}!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} foi enrolado\npor {{sourcePokemonName}}!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} ficou preso\nno vórtice!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} foi preso\npor {{moveName}}!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} foi preso\npor um redemoinho de magma!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} foi preso\npor uma armadilha!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} foi ferido por \numa infestação de {{sourcePokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nse protegeu!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nse protegeu!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} está\npreparado!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", - "battlerTagsPerishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} está\nviajando na maionese!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} não\nestá preparado!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finalmente\nconseguiu se recompor!", - "battlerTagsHighestStatBoostOnAdd": "O atributo de {{statName}} de\n{{pokemonNameWithAffix}} aumentou!", - "battlerTagsHighestStatBoostOnRemove": "Os efeitos do {{abilityName}} de\n{{pokemonNameWithAffix}} acabaram!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} está ficando\nbombado!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxou.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} está sendo curado com sal!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!" -} as const; diff --git a/src/locales/pt_BR/battler-tags.json b/src/locales/pt_BR/battler-tags.json new file mode 100644 index 00000000000..e0f6538404b --- /dev/null +++ b/src/locales/pt_BR/battler-tags.json @@ -0,0 +1,71 @@ +{ + "trappedDesc": "o aprisionamento", + "flinchedDesc": "a hesitação", + "confusedDesc": "a confusão", + "infatuatedDesc": "a paixão", + "seedDesc": "sementes", + "nightmareDesc": "os pesadelos", + "ingrainDesc": "o enraizamento", + "drowsyDesc": "a sonolência", + "rechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!", + "trappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!", + "trappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}!", + "flinchedLapse": "{{pokemonNameWithAffix}} hesitou!", + "confusedOnAdd": "{{pokemonNameWithAffix}} ficou\nconfuso!", + "confusedOnRemove": "{{pokemonNameWithAffix}} saiu\nde sua confusão!", + "confusedOnOverlap": "{{pokemonNameWithAffix}} já\nestá confuso!", + "confusedLapse": "{{pokemonNameWithAffix}} está\nconfuso!", + "confusedLapseHurtItself": "Se machucou em sua\nconfusão!", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} não é afetado\npelos efeitos de Destiny Bond.", + "destinyBondLapse": "{{pokemonNameWithAffix}} levou\n{{pokemonNameWithAffix2}} junto com ele!", + "infatuatedOnAdd": "{{pokemonNameWithAffix}} se apaixonou\npor {{sourcePokemonName}}!", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}} já\nestá apaixonado!", + "infatuatedLapse": "{{pokemonNameWithAffix}} está apaixonado\npor {{sourcePokemonName}}!", + "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} está\nimobilizado pelo amor!", + "infatuatedOnRemove": "{{pokemonNameWithAffix}} superou\nsua paixão.", + "seededOnAdd": "{{pokemonNameWithAffix}} foi semeado!", + "seededLapse": "A saúde de {{pokemonNameWithAffix}}\nfoi sugada pelo Leech Seed!", + "seededLapseShed": "O Leech Seed de{{pokemonNameWithAffix}}\nsugou todo o gotejamento!", + "nightmareOnAdd": "{{pokemonNameWithAffix}} começou\na ter um Nightmare!", + "nightmareOnOverlap": "{{pokemonNameWithAffix}} já\nestá preso em um Nightmare!", + "nightmareLapse": "{{pokemonNameWithAffix}} está preso\nem um Nightmare!", + "encoreOnAdd": "{{pokemonNameWithAffix}} ganhou\num Encore!", + "encoreOnRemove": "O Encore de {{pokemonNameWithAffix}}\nacabou!", + "helpingHandOnAdd": "{{pokemonNameWithAffix}} está pronto para\najudar {{pokemonName}}!", + "ingrainLapse": "{{pokemonNameWithAffix}} absorveu\nnutrientes com suas raízes!", + "ingrainOnTrap": "{{pokemonNameWithAffix}} plantou suas raízes!", + "aquaRingOnAdd": "{{pokemonNameWithAffix}} se cercou\ncom um véu de água!", + "aquaRingLapse": "{{moveName}} restaurou\nPS de {{pokemonName}}!", + "drowsyOnAdd": "{{pokemonNameWithAffix}} ficou com sono!", + "damagingTrapLapse": "{{pokemonNameWithAffix}} foi ferido\npelo {{moveName}}!", + "bindOnTrap": "{{pokemonNameWithAffix}} foi espremido\npelo {{moveName}} de {{sourcePokemonName}}!", + "wrapOnTrap": "{{pokemonNameWithAffix}} foi enrolado\npor {{sourcePokemonName}}!", + "vortexOnTrap": "{{pokemonNameWithAffix}} ficou preso\nno vórtice!", + "clampOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonName}}!", + "sandTombOnTrap": "{{pokemonNameWithAffix}} foi preso\npor {{moveName}}!", + "magmaStormOnTrap": "{{pokemonNameWithAffix}} foi preso\npor um redemoinho de magma!", + "snapTrapOnTrap": "{{pokemonNameWithAffix}} foi preso\npor uma armadilha!", + "thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonNameWithAffix}}!", + "infestationOnTrap": "{{pokemonNameWithAffix}} foi ferido por \numa infestação de {{sourcePokemonNameWithAffix}}!", + "protectedOnAdd": "{{pokemonNameWithAffix}}\nse protegeu!", + "protectedLapse": "{{pokemonNameWithAffix}}\nse protegeu!", + "enduringOnAdd": "{{pokemonNameWithAffix}} está\npreparado!", + "enduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", + "sturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", + "perishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} virou o centro\ndas atenções!", + "truantLapse": "{{pokemonNameWithAffix}} está\nviajando na maionese!", + "slowStartOnAdd": "{{pokemonNameWithAffix}} não\nestá preparado!", + "slowStartOnRemove": "{{pokemonNameWithAffix}} finalmente\nconseguiu se recompor!", + "highestStatBoostOnAdd": "O atributo de {{statName}} de\n{{pokemonNameWithAffix}} aumentou!", + "highestStatBoostOnRemove": "Os efeitos do {{abilityName}} de\n{{pokemonNameWithAffix}} acabaram!", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}} levitou com eletromagnetismo!", + "magnetRisenOnRemove": "O eletromagnetismo de {{pokemonNameWithAffix}} sumiu!", + "critBoostOnAdd": "{{pokemonNameWithAffix}} está ficando\nbombado!", + "critBoostOnRemove": "{{pokemonNameWithAffix}} relaxou.", + "saltCuredOnAdd": "{{pokemonNameWithAffix}} está sendo curado com sal!", + "saltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!", + "cursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!", + "cursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!", + "stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!" +} diff --git a/src/locales/pt_BR/berry.json b/src/locales/pt_BR/berry.json new file mode 100644 index 00000000000..0ca5d3de286 --- /dev/null +++ b/src/locales/pt_BR/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "Fruta Sitrus", + "effect": "Restaura 25% dos PS se os PS estiverem abaixo de 50%" + }, + "LUM": { + "name": "Fruta Lum", + "effect": "Cura qualquer mudança de estado ou confusão" + }, + "ENIGMA": { + "name": "Fruta Enigma", + "effect": "Restaura 25% dos PS se atingido por um golpe supereficaz" + }, + "LIECHI": { + "name": "Fruta Liechi", + "effect": "Aumenta o Ataque se os PS estiverem abaixo de 25%" + }, + "GANLON": { + "name": "Fruta Ganlon", + "effect": "Aumenta a Defesa se os PS estiverem abaixo de 25%" + }, + "PETAYA": { + "name": "Fruta Petaya", + "effect": "Aumenta o Ataque Especial se os PS estiverem abaixo de 25%" + }, + "APICOT": { + "name": "Fruta Apicot", + "effect": "Aumenta a Defesa Especial se os PS estiverem abaixo de 25%" + }, + "SALAC": { + "name": "Fruta Salac", + "effect": "Aumenta a Velocidade se os PS estiverem abaixo de 25%" + }, + "LANSAT": { + "name": "Fruta Lansat", + "effect": "Aumenta a chance de acerto crítico se os PS estiverem abaixo de 25%" + }, + "STARF": { + "name": "Fruta Starf", + "effect": "Aumenta drasticamente um atributo aleatório se os PS estiverem abaixo de 25%" + }, + "LEPPA": { + "name": "Fruta Leppa", + "effect": "Restaura 10 PP de um movimento se seus PP acabarem" + } +} \ No newline at end of file diff --git a/src/locales/pt_BR/berry.ts b/src/locales/pt_BR/berry.ts deleted file mode 100644 index d409565168f..00000000000 --- a/src/locales/pt_BR/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "Fruta Sitrus", - effect: "Restaura 25% dos PS se os PS estiverem abaixo de 50%", - }, - "LUM": { - name: "Fruta Lum", - effect: "Cura qualquer mudança de estado ou confusão", - }, - "ENIGMA": { - name: "Fruta Enigma", - effect: "Restaura 25% dos PS se atingido por um golpe supereficaz", - }, - "LIECHI": { - name: "Fruta Liechi", - effect: "Aumenta o Ataque se os PS estiverem abaixo de 25%", - }, - "GANLON": { - name: "Fruta Ganlon", - effect: "Aumenta a Defesa se os PS estiverem abaixo de 25%", - }, - "PETAYA": { - name: "Fruta Petaya", - effect: "Aumenta o Ataque Especial se os PS estiverem abaixo de 25%", - }, - "APICOT": { - name: "Fruta Apicot", - effect: "Aumenta a Defesa Especial se os PS estiverem abaixo de 25%", - }, - "SALAC": { - name: "Fruta Salac", - effect: "Aumenta a Velocidade se os PS estiverem abaixo de 25%", - }, - "LANSAT": { - name: "Fruta Lansat", - effect: "Aumenta a chance de acerto crítico se os PS estiverem abaixo de 25%", - }, - "STARF": { - name: "Fruta Starf", - effect: "Aumenta drasticamente um atributo aleatório se os PS estiverem abaixo de 25%", - }, - "LEPPA": { - name: "Fruta Leppa", - effect: "Restaura 10 PP de um movimento se seus PP acabarem", - }, -} as const; diff --git a/src/locales/pt_BR/bgm-name.json b/src/locales/pt_BR/bgm-name.json new file mode 100644 index 00000000000..86d8ce3e790 --- /dev/null +++ b/src/locales/pt_BR/bgm-name.json @@ -0,0 +1,150 @@ +{ + "music": "Música: ", + "missing_entries": "{{name}}", + "battle_kanto_champion": "B2W2 Batalha do Campeão de Kanto", + "battle_johto_champion": "B2W2 Batalha do Campeão de Johto", + "battle_hoenn_champion_g5": "B2W2 Batalha do Campeão de Hoenn", + "battle_hoenn_champion_g6": "ORAS Batalha do Campeão de Hoenn", + "battle_sinnoh_champion": "B2W2 Batalha do Campeão de Sinnoh", + "battle_champion_alder": "BW Batalha do Campeão de Unova", + "battle_champion_iris": "B2W2 Batalha do Campeão de Unova", + "battle_kalos_champion": "XY Batalha do Campeão de Kalos", + "battle_alola_champion": "USUM Batalha do Campeão de Alola", + "battle_galar_champion": "SWSH Batalha do Campeão de Galar", + "battle_champion_geeta": "SV Batalha da Campeã Geeta", + "battle_champion_nemona": "SV Batalha da Campeã Nemona", + "battle_champion_kieran": "SV Batalha do Campeão Kieran", + "battle_hoenn_elite": "ORAS Batalha da Elite dos Quatro", + "battle_unova_elite": "BW Batalha da Elite dos Quatro", + "battle_kalos_elite": "XY Batalha da Elite dos Quatro", + "battle_alola_elite": "SM Batalha da Elite dos Quatro", + "battle_galar_elite": "SWSH Batalha da Liga Pokémon", + "battle_paldea_elite": "SV Batalha da Elite dos Quatro", + "battle_bb_elite": "SV Liga BB Batalha da Elite dos Quatro", + "battle_final_encounter": "PMD RTDX Domínio do Rayquaza", + "battle_final": "BW Batalha do Ghetsis", + "battle_kanto_gym": "B2W2 Batalha de Ginásio de Kanto", + "battle_johto_gym": "B2W2 Batalha de Ginásio de Johto", + "battle_hoenn_gym": "B2W2 Batalha de Ginásio de Hoenn", + "battle_sinnoh_gym": "B2W2 Batalha de Ginásio de Sinnoh", + "battle_unova_gym": "BW Batalha de Ginásio de Unova", + "battle_kalos_gym": "XY Batalha de Ginásio de Kalos", + "battle_galar_gym": "SWSH Batalha de Ginásio de Galar", + "battle_paldea_gym": "SV Batalha de Ginásio de Paldea", + "battle_legendary_kanto": "XY Batalha dos Lendários de Kanto", + "battle_legendary_raikou": "HGSS Batalha do Raikou", + "battle_legendary_entei": "HGSS Batalha do Entei", + "battle_legendary_suicune": "HGSS Batalha do Suicune", + "battle_legendary_lugia": "HGSS Batalha do Lugia", + "battle_legendary_ho_oh": "HGSS Batalha do Ho-Oh", + "battle_legendary_regis_g5": "B2W2 Batalha dos Titãs Lendários", + "battle_legendary_regis_g6": "ORAS Batalha dos Titãs Lendários", + "battle_legendary_gro_kyo": "ORAS Batalha do Groudon & Kyogre", + "battle_legendary_rayquaza": "ORAS Batalha do Rayquaza", + "battle_legendary_deoxys": "ORAS Batalha do Deoxys", + "battle_legendary_lake_trio": "ORAS Batalha do Trio dos Lagos", + "battle_legendary_sinnoh": "ORAS Batalha dos Lendários de Sinnoh", + "battle_legendary_dia_pal": "ORAS Batalha do Dialga & Palkia", + "battle_legendary_origin_forme": "LA Origin Batalha com Dialga & Palkia", + "battle_legendary_giratina": "ORAS Batalha do Giratina", + "battle_legendary_arceus": "HGSS Batalha do Arceus", + "battle_legendary_unova": "BW Batalha dos Lendários de Unova", + "battle_legendary_kyurem": "BW Batalha do Kyurem", + "battle_legendary_res_zek": "BW Batalha do Reshiram & Zekrom", + "battle_legendary_xern_yvel": "XY Batalha do Xerneas & Yveltal", + "battle_legendary_tapu": "SM Batalha dos Guardiões de Alola", + "battle_legendary_sol_lun": "SM Batalha do Solgaleo & Lunala", + "battle_legendary_ub": "SM Batalha das Ultracriaturas", + "battle_legendary_dusk_dawn": "USUM Batalha do Necrozma Crepúsculo & Alvorada", + "battle_legendary_ultra_nec": "USUM Batalha do Necrozma Ultra", + "battle_legendary_zac_zam": "SWSH Batalha do Zacian & Zamazenta", + "battle_legendary_glas_spec": "SWSH Batalha do Glastrier & Spectrier", + "battle_legendary_calyrex": "SWSH Batalha do Calyrex", + "battle_legendary_riders": "SWSH Batalha com Ice & Shadow Rider Calyrex", + "battle_legendary_birds_galar": "SWSH Batalha dos Pássaros Lendários de Galar", + "battle_legendary_ruinous": "SV Batalha dos Lendários Ruinosos", + "battle_legendary_kor_mir": "SV Batalha das Cavernas da Área Zero", + "battle_legendary_loyal_three": "SV Batalha dos Três Leais", + "battle_legendary_ogerpon": "SV Batalha do Ogerpon", + "battle_legendary_terapagos": "SV Batalha do Terapagos", + "battle_legendary_pecharunt": "SV Batalha do Pecharunt", + "battle_rival": "BW Batalha do Rival", + "battle_rival_2": "BW Batalha do N", + "battle_rival_3": "BW Batalha Final do N", + "battle_trainer": "BW Batalha de Treinador", + "battle_wild": "BW Batalha de Pokémon Selvagem", + "battle_wild_strong": "BW Batalha de Pokémon Selvagem Forte", + "end_summit": "PMD RTDX Cume da Torre do Céu", + "battle_rocket_grunt": "HGSS Batalha da Equipe Rocket", + "battle_aqua_magma_grunt": "ORAS Batalha da Equipe Aqua & Magma", + "battle_galactic_grunt": "BDSP Batalha da Equipe Galáctica", + "battle_plasma_grunt": "BW Batalha da Equipe Plasma", + "battle_flare_grunt": "XY Batalha da Equipe Flare", + "battle_aether_grunt": "SM Batalha da Fundação Aether", + "battle_skull_grunt": "SM Batalha da Equipe Skull", + "battle_macro_grunt": "SWSH Batalha de Treinador", + "battle_galactic_admin": "BDSP Batalha com Admin da Equipe Galáctica", + "battle_skull_admin": "SM Batalha com Admin da Euipe Skull", + "battle_oleana": "SWSH Batalha da Oleana", + "battle_rocket_boss": "USUM Batalha do Giovanni", + "battle_aqua_magma_boss": "ORAS Batalha do Maxie & Archie", + "battle_galactic_boss": "BDSP Batalha do Cyrus", + "battle_plasma_boss": "B2W2 Batalha do Ghetsis", + "battle_flare_boss": "XY Batalha do Lysandre", + "battle_aether_boss": "SM Batalha da Lusamine", + "battle_skull_boss": "SM Batalha do Guzma", + "battle_macro_boss": "SWSH Batalha do Rose", + + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", + "laboratory": "Firel - Laboratory", + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "Andr06 - Marine Mystique", + "seabed": "Firel - Seabed", + "slum": "Andr06 - Sneaky Snom", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + "encounter_ace_trainer": "BW Encontro com Treinador (Treinador Ás)", + "encounter_backpacker": "BW Encontro com Treinador (Mochileiro)", + "encounter_clerk": "BW Encontro com Treinador (Funcionário)", + "encounter_cyclist": "BW Encontro com Treinador (Ciclista)", + "encounter_lass": "BW Encontro com Treinador (Senhorita)", + "encounter_parasol_lady": "BW Encontro com Treinador (Moça de Sombrinha)", + "encounter_pokefan": "BW Encontro com Treinador (Pokéfã)", + "encounter_psychic": "BW Encontro com Treinador (Médium)", + "encounter_rich": "BW Encontro com Treinador (Cavalheiro)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Encontro com Treinador (Arruaceiro)", + "encounter_scientist": "BW Encontro com Treinador (Cientista)", + "encounter_twins": "BW Encontro com Treinador (Gêmeos)", + "encounter_youngster": "BW Encontro com Treinador (Jovem)", + "heal": "BW Centro Pokémon", + "menu": "PMD EoS Bem-vindo ao Mundo dos Pokémon!", + "title": "PMD EoS Menu Principal" +} diff --git a/src/locales/pt_BR/bgm-name.ts b/src/locales/pt_BR/bgm-name.ts deleted file mode 100644 index ef15c6c6dcb..00000000000 --- a/src/locales/pt_BR/bgm-name.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "Music", - "missing_entries" : "{{name}}", - "battle_kanto_champion": "B2W2 Kanto Champion Battle", - "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", - "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", - "battle_champion_alder": "BW Unova Champion Battle", - "battle_champion_iris": "B2W2 Unova Champion Battle", - "battle_kalos_champion": "XY Kalos Champion Battle", - "battle_alola_champion": "USUM Alola Champion Battle", - "battle_galar_champion": "SWSH Galar Champion Battle", - "battle_champion_geeta": "SV Champion Geeta Battle", - "battle_champion_nemona": "SV Champion Nemona Battle", - "battle_champion_kieran": "SV Champion Kieran Battle", - "battle_hoenn_elite": "ORAS Elite Four Battle", - "battle_unova_elite": "BW Elite Four Battle", - "battle_kalos_elite": "XY Elite Four Battle", - "battle_alola_elite": "SM Elite Four Battle", - "battle_galar_elite": "SWSH League Tournament Battle", - "battle_paldea_elite": "SV Elite Four Battle", - "battle_bb_elite": "SV BB League Elite Four Battle", - "battle_final_encounter": "PMD RTDX Rayquaza's Domain", - "battle_final": "BW Ghetsis Battle", - "battle_kanto_gym": "B2W2 Kanto Gym Battle", - "battle_johto_gym": "B2W2 Johto Gym Battle", - "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", - "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", - "battle_unova_gym": "BW Unova Gym Battle", - "battle_kalos_gym": "XY Kalos Gym Battle", - "battle_galar_gym": "SWSH Galar Gym Battle", - "battle_paldea_gym": "SV Paldea Gym Battle", - "battle_legendary_kanto": "XY Kanto Legendary Battle", - "battle_legendary_raikou": "HGSS Raikou Battle", - "battle_legendary_entei": "HGSS Entei Battle", - "battle_legendary_suicune": "HGSS Suicune Battle", - "battle_legendary_lugia": "HGSS Lugia Battle", - "battle_legendary_ho_oh": "HGSS Ho-oh Battle", - "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", - "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", - "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", - "battle_legendary_rayquaza": "ORAS Rayquaza Battle", - "battle_legendary_deoxys": "ORAS Deoxys Battle", - "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", - "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", - "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", - "battle_legendary_giratina": "ORAS Giratina Battle", - "battle_legendary_arceus": "HGSS Arceus Battle", - "battle_legendary_unova": "BW Unova Legendary Battle", - "battle_legendary_kyurem": "BW Kyurem Battle", - "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", - "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", - "battle_legendary_tapu": "SM Tapu Battle", - "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", - "battle_legendary_ub": "SM Ultra Beast Battle", - "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", - "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", - "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", - "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", - "battle_legendary_calyrex": "SWSH Calyrex Battle", - "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", - "battle_legendary_ruinous": "SV Treasures of Ruin Battle", - "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", - "battle_legendary_loyal_three": "SV Loyal Three Battle", - "battle_legendary_ogerpon": "SV Ogerpon Battle", - "battle_legendary_terapagos": "SV Terapagos Battle", - "battle_legendary_pecharunt": "SV Pecharunt Battle", - "battle_rival": "BW Rival Battle", - "battle_rival_2": "BW N Battle", - "battle_rival_3": "BW Final N Battle", - "battle_trainer": "BW Trainer Battle", - "battle_wild": "BW Wild Battle", - "battle_wild_strong": "BW Strong Wild Battle", - "end_summit": "PMD RTDX Sky Tower Summit", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", - "battle_plasma_grunt": "BW Team Plasma Battle", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", - - // Biome Music - "abyss": "PMD EoS Dark Crater", - "badlands": "PMD EoS Barren Valley", - "beach": "PMD EoS Drenched Bluff", - "cave": "PMD EoS Sky Peak Cave", - "construction_site": "PMD EoS Boulder Quarry", - "desert": "PMD EoS Northern Desert", - "dojo": "PMD EoS Marowak Dojo", - "end": "PMD RTDX Sky Tower", - "factory": "PMD EoS Concealed Ruins", - "fairy_cave": "PMD EoS Star Cave", - "forest": "PMD EoS Dusk Forest", - "grass": "PMD EoS Apple Woods", - "graveyard": "PMD EoS Mystifying Forest", - "ice_cave": "PMD EoS Vast Ice Mountain", - "island": "PMD EoS Craggy Coast", - "jungle": "Lmz - Jungle", // The composer thinks about a more creative name - "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name - "lake": "PMD EoS Crystal Cave", - "meadow": "PMD EoS Sky Peak Forest", - "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name - "mountain": "PMD EoS Mt. Horn", - "plains": "PMD EoS Sky Peak Prairie", - "power_plant": "PMD EoS Far Amp Plains", - "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", - "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", - "snowy_forest": "PMD EoS Sky Peak Snowfield", - "space": "Firel - Aether", - "swamp": "PMD EoS Surrounded Sea", - "tall_grass": "PMD EoS Foggy Forest", - "temple": "PMD EoS Aegis Cave", - "town": "PMD EoS Random Dungeon Theme 3", - "volcano": "PMD EoS Steam Cave", - "wasteland": "PMD EoS Hidden Highland", - - // Encounter - "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", - "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", - "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", - "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", - "encounter_lass": "BW Trainers' Eyes Meet (Lass)", - "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", - "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", - "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", - "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", - "encounter_rival": "BW Cheren", - "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", - "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", - "encounter_twins": "BW Trainers' Eyes Meet (Twins)", - "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", - - // Other - "heal": "BW Pokémon Heal", - "menu": "PMD EoS Welcome to the World of Pokémon!", - "title": "PMD EoS Top Menu Theme", -} as const; diff --git a/src/locales/pt_BR/biome.ts b/src/locales/pt_BR/biome.json similarity index 80% rename from src/locales/pt_BR/biome.ts rename to src/locales/pt_BR/biome.json index 46dad06b0de..d10f22eb487 100644 --- a/src/locales/pt_BR/biome.ts +++ b/src/locales/pt_BR/biome.json @@ -1,7 +1,5 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { - "unknownLocation": "Em algum lugar do qual você não se lembra", +{ + "unknownLocation": "em algum lugar do qual você não se lembra", "TOWN": "Cidade", "PLAINS": "Planície", "GRASS": "Grama", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "Floresta Nevada", "ISLAND": "Ilha", "LABORATORY": "Laboratório", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/pt_BR/challenges.ts b/src/locales/pt_BR/challenges.json similarity index 56% rename from src/locales/pt_BR/challenges.ts rename to src/locales/pt_BR/challenges.json index 7c991189bc8..8402ad106b6 100644 --- a/src/locales/pt_BR/challenges.ts +++ b/src/locales/pt_BR/challenges.json @@ -1,6 +1,4 @@ -import { TranslationEntries } from "#app/interfaces/locales"; - -export const challenges: TranslationEntries = { +{ "title": "Desafios", "illegalEvolution": "{{pokemon}} não pode ser escolhido\nnesse desafio!", "singleGeneration": { @@ -15,11 +13,24 @@ export const challenges: TranslationEntries = { "gen_6": "sexta", "gen_7": "sétima", "gen_8": "oitava", - "gen_9": "nona", + "gen_9": "nona" }, "singleType": { "name": "Monotipo", "desc": "Você só pode user Pokémon do tipo {{type}}.", "desc_default": "Você só pode user Pokémon de um único tipo." }, -} as const; + "freshStart": { + "name": "Novo Começo", + "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" + } +} diff --git a/src/locales/pt_BR/command-ui-handler.json b/src/locales/pt_BR/command-ui-handler.json new file mode 100644 index 00000000000..fcd8e7026b4 --- /dev/null +++ b/src/locales/pt_BR/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "Lutar", + "ball": "Bolas", + "pokemon": "Pokémon", + "run": "Fugir", + "actionMessage": "O que {{pokemonName}}\ndeve fazer?" +} \ No newline at end of file diff --git a/src/locales/pt_BR/command-ui-handler.ts b/src/locales/pt_BR/command-ui-handler.ts deleted file mode 100644 index cd8f7c4a378..00000000000 --- a/src/locales/pt_BR/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Lutar", - "ball": "Bolas", - "pokemon": "Pokémon", - "run": "Fugir", - "actionMessage": "O que {{pokemonName}}\ndeve fazer?", -} as const; diff --git a/src/locales/pt_BR/common.json b/src/locales/pt_BR/common.json new file mode 100644 index 00000000000..a5ec4381f26 --- /dev/null +++ b/src/locales/pt_BR/common.json @@ -0,0 +1,8 @@ +{ + "start": "Iniciar", + "luckIndicator": "Sorte:", + "shinyOnHover": "Shiny", + "commonShiny": "Comum", + "rareShiny": "Raro", + "epicShiny": "Épico" +} \ No newline at end of file diff --git a/src/locales/pt_BR/common.ts b/src/locales/pt_BR/common.ts deleted file mode 100644 index d7cbfd5d052..00000000000 --- a/src/locales/pt_BR/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "Iniciar", -} as const; diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index ac4176144c6..9e8377149c1 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -1,94 +1,113 @@ -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const ptBrConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - partyUiHandler: partyUiHandler, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - statusEffect: statusEffect, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory: runHistory, }; diff --git a/src/locales/pt_BR/dialogue-double-battle.json b/src/locales/pt_BR/dialogue-double-battle.json new file mode 100644 index 00000000000..4d1c7d90c9b --- /dev/null +++ b/src/locales/pt_BR/dialogue-double-battle.json @@ -0,0 +1,83 @@ +{ + "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-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!" + } + }, + "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-final-boss.json b/src/locales/pt_BR/dialogue-final-boss.json new file mode 100644 index 00000000000..7009f00db5b --- /dev/null +++ b/src/locales/pt_BR/dialogue-final-boss.json @@ -0,0 +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.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.json b/src/locales/pt_BR/dialogue.json new file mode 100644 index 00000000000..2f39442ee5a --- /dev/null +++ b/src/locales/pt_BR/dialogue.json @@ -0,0 +1,2809 @@ +{ + "youngster": { + "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-vinda ao mundo sem fim!", + "13_female": "As batalhas continuam para sempre! Bem-vindo 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 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…", + "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 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." + }, + "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é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…" + } + }, + "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ê é o personagem principal!", + "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!", + "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 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!", + "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 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.", + "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 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": { + "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 pronto para saborear a derrota!", + "1_female": "Espero que esteja pronta para saborear a derrota!" + }, + "victory": { + "1": "Vou assar uma revanche." + } + }, + "biker": { + "encounter": { + "1": "Hora de acelerar e te deixar na poeira!" + }, + "victory": { + "1": "Vou me ajustar para a próxima corrida." + } + }, + "firebreather": { + "encounter": { + "1": "Minhas chamas irão te consumir!", + "2": "Minha alma está pegando fogo. Irei te mostrar como queima!", + "3": "Cola aqui e dá uma olhada!" + }, + "victory": { + "1": "Fui reduzido a cinzas…", + "2": "Uau! Isso foi quente!", + "3": "Ai! Queimei minha língua!" + } + }, + "sailor": { + "encounter": { + "1": "Mano, você vai andar na prancha se perder!", + "2": "Vem com tudo! Sou um marinheiro com orgulho!", + "3": "Ahoy marujo! Tá enjoado, é?!", + "3_female": "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 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…" + } + }, + "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 um treinador qualquer...", + "3_female": "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 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_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": { + "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á-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_female": "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á-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_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_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_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_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!" + } + }, + "bryony": { + "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": { + "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, 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_female": "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 pronto para uma surra cósmica!", + "5_female": "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 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." + }, + "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ê é 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!" + }, + "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, 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!" + } + }, + "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á 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ê!", + "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, 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!" + }, + "victory": { + "1": "Uau, você me derrotou!", + "2": "Você surfou minha onda e me derrubou!", + "3": "Sinto-me perdido na Caverna Granito!" + }, + "defeat": { + "1": "Haha, eu surfei a grande onda!\nDesafie-me novamente algum dia.", + "2": "Surfe comigo novamente algum dia!", + "3": "Assim como as marés vão e vêm, espero que você volte para me desafiar novamente." + } + }, + "wattson": { + "encounter": { + "1": "Hora de levar um choque!\nWahahahaha!", + "2": "Vou fazer faíscas voarem!\nWahahahaha!", + "3": "Espero que tenha trazido Cura de Paralisia!\nWahahahaha!" + }, + "victory": { + "1": "Parece que estou sem carga!\nWahahahaha!", + "2": "Você me aterrissou completamente!\nWahahahaha!", + "3": "Obrigado pela emoção!\nWahahahaha!" + }, + "defeat": { + "1": "Você está totalmente carregado agora!\nWahahahaha!", + "1_female": "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ê é 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!" + }, + "defeat": { + "1": "Meus Pokémon Voadores e eu sempre dançaremos com elegância!", + "2": "Espero que tenha gostado do nosso show.\nNossa dança graciosa terminou.", + "3": "Você não quer ver nossa coreografia elegante novamente?" + } + }, + "tate": { + "encounter": { + "1": "Hehehe... Ficou surpreso de me ver sem minha irmã?", + "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?" + }, + "victory": { + "1": "Não pode ser ajudado...\nSinto falta da Liza...", + "2": "Seu vínculo com seus Pokémon era mais forte que o meu.", + "3": "Se eu estivesse com Liza, teríamos vencido.\nConseguimos completar os pensamentos um do outro!" + }, + "defeat": { + "1": "Meus Pokémon e eu somos superiores!", + "2": "Se você não consegue nem me derrotar, nunca será capaz de derrotar Liza também.", + "3": "Tudo graças ao meu treinamento rigoroso com Liza.\nPosso me tornar um com os Pokémon." + } + }, + "liza": { + "encounter": { + "1": "Fufufu... Ficou surpreso de me ver sem meu irmão?", + "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?" + }, + "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á-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_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...", + "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 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..." + }, + "defeat": { + "1": "Agora você vê como as batalhas podem ser severas?", + "2": "Hee! Parece que ganhei de novo!", + "3": "Você está segurando?" + } + }, + "marlon": { + "encounter": { + "1": "Você parece forte! Vamos começar!", + "2": "Sou forte como a amplitude do oceano. Você vai ser varrido, com certeza.", + "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!" + }, + "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ê é 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?" + }, + "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 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!" + }, + "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ê-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.", + "2": "Obrigado! Sinto que vi um pouco do caminho em direção aos meus ideais.", + "3": "Hmm... Isso é problemático." + }, + "defeat": { + "1": "Como Líder de Ginásio, meu objetivo é ser um obstáculo para você superar.", + "2": "Tudo bem!", + "3": "Cheguei onde estou porque os Pokémon estavam ao meu lado.\nTalvez precisemos pensar por que os Pokémon nos ajudam, não em termos de Pokémon e Treinadores, mas como uma relação entre seres vivos." + } + }, + "chili": { + "encounter": { + "1": "Ihuuu! Hora de brincar com FOGO!! Sou o mais forte dos nossos irmãos!", + "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!", + "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_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.", + "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.", + "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_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." + }, + "defeat": { + "1": "Veja? Estou orgulhoso do meu estilo de batalha rochoso!", + "2": "Obrigado! A batalha me deu confiança de que talvez eu consiga vencer meu pai!", + "3": "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!" + } + }, + "morty": { + "encounter": { + "1": "Com um pouco mais, eu poderia ver um futuro em que encontro o Pokémon lendário.\nVocê vai me ajudar a alcançar esse nível!", + "2": "Dizem que um Pokémon com cores de arco-íris aparecerá diante de um Treinador verdadeiramente poderoso.\nAcreditei nessa história, então treinei secretamente aqui a vida toda. Como resultado, agora posso ver o que os outros não podem.\nVejo uma sombra da pessoa que fará o Pokémon aparecer.\nAcredito que essa pessoa sou eu! Você vai me ajudar a alcançar esse nível!", + "3": "Quer você escolha acreditar ou não, o poder místico existe.", + "4": "Você pode testemunhar os frutos do meu treinamento.", + "5": "Você deve fazer sua alma se tornar uma com a dos Pokémon. Você pode fazer isso?", + "6": "Diga, você quer fazer parte do meu treinamento?" + }, + "victory": { + "1": "Ainda não sou bom o suficiente...", + "2": "Eu vejo... Sua jornada o levou a lugares distantes e você testemunhou muito mais do que eu.\nEu invejo você por isso...", + "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.", + "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 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_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." + }, + "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ê é ó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!", + "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 bom, não é?", + "1_female": "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, 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!" + }, + "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ê é 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?" + } + }, + "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 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!" + } + }, + "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_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_female": "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ê, 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_female": "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 um Treinador interessante para enfrentar!", + "1_female": "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, garoto.", + "1_female": "Nada mal, garota." + }, + "defeat": { + "1": "Nahahaha! Você realmente é algo mais, garoto!", + "1_female": "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ê é 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!" + } + }, + "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, 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_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!" + } + }, + "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ério! Você tem que dar mais de si!", + "1_female": "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 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!" + }, + "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 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ê." + }, + "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 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_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_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": { + "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ífico!", + "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_female": "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 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." + } + }, + "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 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!" + }, + "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 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…" + }, + "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 um novo Campeão.", + "1_female": "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 mau!", + "1_female": "Waaah! Waaah! Você é tão má!" + }, + "defeat": { + "1": "E é isso!" + } + }, + "chuck": { + "encounter": { + "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?" + }, + "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 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!" + }, + "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á-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…" + }, + "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": "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!" + }, + "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 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." + }, + "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 é 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ã…" + }, + "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ê é 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." + } + }, + "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_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." + }, + "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á 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!" + }, + "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 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_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!" + } + }, + "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, meu amigo, você move minha ALMA!", + "1_female": "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. Pronto para ser levado pela corrente?", + "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!", + "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á 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": { + "1": "Você dissipou as sombras... Por enquanto. Bem feito.", + "2": "Sua luz atravessou minha escuridão. Ótimo trabalho." + }, + "defeat": { + "1": "As sombras falaram... Sua força não é suficiente.", + "2": "A escuridão triunfa... Talvez na próxima vez você veja a luz." + } + }, + "raihan_elite": { + "encounter": { + "1": "Tempestade se formando! Vamos ver se você aguenta essa luta!", + "2": "Prepare-se para enfrentar o olho da tempestade!" + }, + "victory": { + "1": "Você enfrentou a tempestade... Trabalho incrível!", + "2": "Você navegou nos ventos perfeitamente... Grande batalha!" + }, + "defeat": { + "1": "Outra tempestade enfrentada, outra vitória conquistada! Bem lutado!", + "2": "Você foi pego na minha tempestade! Melhor sorte na próxima vez!", + "2_female": "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 ansioso 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á pronto.\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 um novato?\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á invicto. @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á invicto? 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á preparado 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ê é o único 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.ts b/src/locales/pt_BR/dialogue.ts deleted file mode 100644 index 3325cf81cf9..00000000000 --- a/src/locales/pt_BR/dialogue.ts +++ /dev/null @@ -1,5108 +0,0 @@ -import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/interfaces/locales"; - -// Diálogo dos NPCs no jogo quando o personagem do jogador é masculino (ou não definido) -export const PGMdialogue: DialogueTranslationEntries = { - "youngster": { - "encounter": { - 1: "Eai, quer batalhar?", - 2: "Você também é um treinador novo?", - 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!", - 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!", - 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!" - }, - "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 perder 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 um treinador novo. 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?", - 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ério.", - 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ê é o personagem principal!", - 4: "OK! OK! Você poderia ser um 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 pronto 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 cortado em pedaços? Ou prefere o papel de saco de pancadas?" - }, - "victory": { - 1: "Oh. Os Pokémon fizeram a luta. Meu chute forte não ajudou em nada.", - 2: "Hmmm… Se eu ia perder de qualquer maneira, esperava ficar totalmente destruído no processo." - }, - }, - "battle_girl": { - "encounter": { - 1: "Você não precisa tentar me impressionar. Você pode perder contra mim.", - }, - "victory": { - 1: "É difícil dizer adeus, mas estamos ficando sem tempo…", - }, - }, - "hiker": { - "encounter": { - 1: "Minha barriga de meia-idade me deu tanta gravidade quanto as montanhas que eu escalo!", - 2: "Herdei esse corpo ossudo dos meus pais… Sou como uma cadeia de montanhas viva…", - }, - "victory": { - 1: "Pelo menos não posso perder quando se trata de IMC!", - 2: "Não é suficiente… Nunca é suficiente. Meu colesterol ruim não está alto o suficiente…" - }, - }, - "ranger": { - "encounter": { - 1: "Quando estou cercado pela natureza, a maioria das outras coisas deixa de importar.", - 2: "Quando estou vivendo sem natureza na minha vida, às vezes sinto uma crise de ansiedade se aproximando." - }, - "victory": { - 1: "Não importa para a vastidão da natureza se eu ganhar ou perder…", - 2: "Algo assim é bastante trivial comparado aos sentimentos sufocantes da vida na cidade." - }, - "defeat": { - 1: "Ganhei a batalha. Mas a vitória não é nada comparada à vastidão da natureza…", - 2: "Tenho certeza de que como você se sente não é tão ruim se comparar aos meus ataques de ansiedade…" - } - }, - "scientist": { - "encounter": { - 1: "Minha pesquisa levará este mundo à paz e alegria.", - }, - "victory": { - 1: "Sou um gênio… Não devo perder para alguém como você…", - }, - }, - "school_kid": { - "encounter": { - 1: "Heehee. Estou confiante nos meus cálculos e análises.", - 2: "Estou ganhando o máximo de experiência que posso porque quero ser um Líder de Ginásio um dia." - }, - "victory": { - 1: "Aff… Cálculo e análise talvez não sejam páreo para o acaso…", - 2: "Até experiências difíceis e desafiadoras têm seu propósito, eu acho." - } - }, - "artist": { - "encounter": { - 1: "Eu costumava ser popular, mas agora estou acabado.", - }, - "victory": { - 1: "À medida que os tempos mudam, os valores também mudam. Percebi isso tarde demais.", - }, - }, - "guitarist": { - "encounter": { - 1: "Prepare-se para sentir o ritmo da derrota enquanto eu toco minha vitória!", - }, - "victory": { - 1: "Silenciado por agora, mas minha melodia de resiliência continuará a tocar.", - }, - }, - "worker": { - "encounter": { - 1: "Me incomoda que as pessoas sempre me entendam mal. Sou muito mais puro do que todos pensam.", - }, - "victory": { - 1: "Eu realmente não quero que minha pele queime, então quero ficar na sombra enquanto trabalho.", - }, - }, - "worker_female": { - "encounter": { - 1: `Me incomoda que as pessoas sempre me entendam mal. - $Sou muito mais pura do que todos pensam.` - }, - "victory": { - 1: "Eu realmente não quero que minha pele queime, então quero ficar na sombra enquanto trabalho." - }, - "defeat": { - 1: "Meu corpo e mente nem sempre estão necessariamente em sincronia." - } - }, - "worker_double": { - "encounter": { - 1: "Vou te mostrar que podemos te quebrar. Estamos treinando no campo!", - }, - "victory": { - 1: "Que estranho… Como isso pode ser… Não deveria ter sido superado.", - }, - }, - "hex_maniac": { - "encounter": { - 1: "Normalmente, só escuto música clássica, mas se eu perder, acho que vou tentar um pouco de new age!", - 2: "Eu fico mais forte a cada lágrima que derramo." - }, - "victory": { - 1: "É o início da era de Aquário?", - 2: "Agora posso ficar ainda mais forte. Cresço com cada rancor." - }, - "defeat": { - 1: "New age se refere simplesmente aos compositores clássicos do século XX, certo?", - 2: "Não fique preso na tristeza ou frustração. Você pode usar seus rancores para se motivar." - } - }, - "psychic": { - "encounter": { - 1: "Oi! Concentre-se!", - }, - "victory": { - 1: "Perdi minha concentração!", - }, - }, - "officer": { - "encounter": { - 1: "Prepare-se, porque a justiça está prestes a ser servida!", - 2: "Pronto para defender a lei e servir a justiça no campo de batalha!" - }, - "victory": { - 1: "O peso da justiça parece mais pesado do que nunca…", - 2: "As sombras da derrota pairam no distrito." - } - }, - "beauty": { - "encounter": { - 1: "Minha última batalha… É assim que eu gostaria que víssemos esta partida…", - }, - "victory": { - 1: "Foi divertido… Vamos ter outra última batalha algum dia…", - }, - }, - "baker": { - "encounter": { - 1: "Espero que esteja pronto para saborear a derrota!" - }, - "victory": { - 1: "Vou assar uma revanche." - }, - }, - "biker": { - "encounter": { - 1: "Hora de acelerar e te deixar na poeira!" - }, - "victory": { - 1: "Vou me ajustar para a próxima corrida." - }, - }, - "firebreather": { - "encounter": { - 1: "Minhas chamas irão te consumir!", - 2: "Minha alma está pegando fogo. Irei te mostrar como queima!", - 3: "Cola aqui e dá uma olhada!" - }, - "victory": { - 1: "Fui reduzido a cinzas…", - 2: "Uau! Isso foi quente!", - 3: "Ai! Queimei minha língua!" - }, - }, - "sailor": { - "encounter": { - 1: "Mano, você vai andar na prancha se perder!", - 2: "Vem com tudo! Sou um marinheiro com orgulho!", - 3: "Ahoy marujo! Tá enjoado, é?!" - }, - "victory": { - 1: "Argh! Perdi pra uma criança!", - 2: "Sua vontade de ganhar me afogou!", - 3: "Estou achando que quem tá enjoado sou eu..." - }, - }, - "rocket_grunt": { - "encounter": { - 1: "Se prepara pra encrenca!" - }, - "victory": { - 1: "Equipe Rocket decolando de novo!" - }, - }, - "magma_grunt": { - "encounter": { - 1: "Se você se meter com a Equipe Magma, não teremos piedade!" - }, - "victory": { - 1: "Ahn? Eu perdi?!" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "Não pegamos leve com quem se mete com a Equipe Aqua, nem mesmo crianças!" - }, - "victory": { - 1: "Tá de brincadeira!" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "Não mexe com a Equipe Galáctica!" - }, - "victory": { - 1: "Fui amassado..." - }, - }, - "plasma_grunt": { - "encounter": { - 1: "Não toleramos pessoas que pensam diferente de nós!" - }, - "victory": { - 1: "Plasmaaaaaaaaa!" - }, - }, - "flare_grunt": { - "encounter": { - 1: "A moda é a coisa mais importante pra gente!" - }, - "victory": { - 1: "O futuro não parece brilhante pra mim." - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "Tenho que admitir, estou impressionado que tenha chegado até aqui!" - }, - "victory": { - 1: "QUÊ! Isso não é possível!" - }, - "defeat": { - 1: "Guarde minhas palavras.\nNão ser capaz de medir sua própria força mostra que você ainda é uma criança." - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "Meus antigos associados precisam de mim... Você vai ficar no meu caminho?" - }, - "victory": { - 1: "Como isso é possível...?\nO precioso sonho da Equipe Rocket se tornou pouco mais que uma ilusão..." - }, - "defeat": { - 1: "A Equipe Rocket renascerá, e eu dominarei o mundo!" - } - }, - "magma_boss_maxie_1": { - "encounter": { - 1: "Eu vou te enterrar com minhas próprias mãos.\nEspero que você aprecie essa honra!" - }, - "victory": { - 1: "Ugh! Você é... bastante capaz...\nEu fiquei para trás, mas apenas por um triz..." - }, - "defeat": { - 1: "A Equipe Magma vai prevalecer!" - } - }, - "magma_boss_maxie_2": { - "encounter": { - 1: "Você é o último obstáculo entre mim e meus objetivos.\nPrepare-se para meu ataque final! Fuhahaha!" - }, - "victory": { - 1: "Isso... Isso não é... Ngh..." - }, - "defeat": { - 1: "E agora... Eu transformarei este planeta em uma terra ideal para a humanidade." - } - }, - "aqua_boss_archie_1": { - "encounter": { - 1: "Eu sou o líder da Equipe Aqua, então temo que esse seja o fim da linha para você." - }, - "victory": { - 1: "Vamos nos encontrar de novo em algum lugar. Eu vou ter certeza de lembrar desse rosto." - }, - "defeat": { - 1: "Brilhante! Nada vai parar minha equipe agora!" - } - }, - "aqua_boss_archie_2": { - "encounter": { - 1: "Estive esperando tanto tempo por este dia.\nEste é o verdadeiro poder da minha equipe!" - }, - "victory": { - 1: "Como eu suspeitava..." - }, - "defeat": { - 1: "Eu vou voltar tudo neste mundo ao seu estado puro e original!!" - } - }, - "galactic_boss_cyrus_1": { - "encounter": { - 1: "Você foi compelido a vir aqui por tal sentimentalismo vazio\nEu farei você se arrepender de ter ouvido seu coração!" - }, - "victory": { - 1: "Interessante. E bastante curioso." - }, - "defeat": { - 1: "Eu criarei meu novo mundo..." - } - }, - "galactic_boss_cyrus_2": { - "encounter": { - 1: "Nos encontramos novamente. Parece que nossos destinos estão entrelaçados.\nMas aqui e agora, eu finalmente quebrarei esse vínculo!" - }, - "victory": { - 1: "Como? Como? COMO?!" - }, - "defeat": { - 1: "Até logo." - } - }, - "plasma_boss_ghetsis_1": { - "encounter": { - 1: "Ninguém pode me deter! Não importa quem seja ou o que faça!" - }, - "victory": { - 1: "Como isso é possível? Eu sou o criador da Equipe Plasma! Eu sou perfeito!" - }, - "defeat": { - 1: "Eu sou o governante perfeito de um novo mundo perfeito! Mwa ha ha!" - } - }, - "plasma_boss_ghetsis_2": { - "encounter": { - 1: "Vamos! Eu quero ver sua cara depois que você perder toda a esperança!" - }, - "victory": { - 1: "Meus cálculos... Não! Meus planos cuidadosos! O mundo deveria ser meu!" - }, - "defeat": { - 1: "Kyurem! Use Absofusion!" - } - }, - "flare_boss_lysandre_1": { - "encounter": { - 1: "Você está aqui para me deter? Mostre-me em batalha." - }, - "victory": { - 1: "Você está aqui para me deter. Mas eu peço que você espere." - }, - "defeat": { - 1: "Pokémon... não devem mais existir." - } - }, - "flare_boss_lysandre_2": { - "encounter": { - 1: "O futuro que você quer, ou o futuro que eu quero... Vamos ver qual é o mais merecedor, não é mesmo?" - }, - "victory": { - 1: "Uau!" - }, - "defeat": { - 1: "Tolos sem visão continuarão a poluir este belo mundo." - } - }, - "brock": { - "encounter": { - 1: "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!", - 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ê é habilidoso…", - 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, garoto!", - 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!", - 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á preparado 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, um desafiante!\nVamos ver o que você pode fazer!", - 2: "Você parece uma grande onda.\nVamos batalhar!", - 3: "Hora de criar uma tempestade!\nVamos!" - }, - "victory": { - 1: "Uau, você me derrotou!", - 2: "Você surfou minha onda e me derrubou!", - 3: "Sinto-me perdido na Caverna Granito!" - }, - "defeat": { - 1: "Haha, eu surfei a grande onda!\nDesafie-me novamente algum dia.", - 2: "Surfe comigo novamente algum dia!", - 3: "Assim como as marés vão e vêm, espero que você volte para me desafiar novamente." - } - }, - "wattson": { - "encounter": { - 1: "Hora de levar um choque!\nWahahahaha!", - 2: "Vou fazer faíscas voarem!\nWahahahaha!", - 3: "Espero que tenha trazido Cura de Paralisia!\nWahahahaha!" - }, - "victory": { - 1: "Parece que estou sem carga!\nWahahahaha!", - 2: "Você me aterrissou completamente!\nWahahahaha!", - 3: "Obrigado pela emoção!\nWahahahaha!" - }, - "defeat": { - 1: "Você está totalmente carregado agora!\nWahahahaha!", - 2: "Espero ver você faíscando em batalhas futuras!\nWahahahaha!", - 3: "Wahahahaha! Que batalha eletrizante!" - } - }, - "flannery": { - "encounter": { - 1: "Meus Pokémon de fogo estão prontos para queimar a concorrência!\nVamos nessa!", - 2: "Prepare-se para sentir o calor da minha determinação!\nNão vou segurar nada!", - 3: "Minhas habilidades vão incinerar você!\nPrepare-se para a batalha mais quente da sua vida!" - }, - "victory": { - 1: "Essa derrota só faz minha determinação queimar mais!", - 2: "Essa perda não apagará minhas chamas!\nEstarei de volta mais forte!", - 3: "Vou usar essa experiência para reacender meu espírito competitivo!" - }, - "defeat": { - 1: "Minhas chamas nunca se apagarão!\nSou muito apaixonada por isso!", - 2: "Você foi incrível!\nVamos fazer isso de novo algum dia!", - 3: "Que batalha ardente!\nMal posso esperar pela próxima!" - } - }, - "norman": { - "encounter": { - 1: "Você está 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ê é o primeiro Treinador que vejo com mais graça do que eu.\nJogou excelentemente.", - 2: "Oh, meus Pokémon Voadores despencaram!\nMuito bem.", - 3: "Embora eu tenha caído, meus Pokémon continuarão a voar!" - }, - "defeat": { - 1: "Meus Pokémon Voadores e eu sempre dançaremos com elegância!", - 2: "Espero que tenha gostado do nosso show.\nNossa dança graciosa terminou.", - 3: "Você não quer ver nossa coreografia elegante novamente?" - } - }, - "tate": { - "encounter": { - 1: "Hehehe... Ficou surpreso de me ver sem minha irmã?", - 2: "Posso ver o que você está pensando...\nVocê quer batalhar!", - 3: "Como você pode derrotar alguém...\nQue sabe todos os seus movimentos?" - }, - "victory": { - 1: "Não pode ser ajudado...\nSinto falta da Liza...", - 2: "Seu vínculo com seus Pokémon era mais forte que o meu.", - 3: "Se eu estivesse com Liza, teríamos vencido.\nConseguimos completar os pensamentos um do outro!" - }, - "defeat": { - 1: "Meus Pokémon e eu somos superiores!", - 2: "Se você não consegue nem me derrotar, nunca será capaz de derrotar Liza também.", - 3: "Tudo graças ao meu treinamento rigoroso com Liza.\nPosso me tornar um com os Pokémon." - } - }, - "liza": { - "encounter": { - 1: "Fufufu... Ficou surpreso de me ver sem meu irmão?", - 2: "Posso determinar o que você deseja...\nVocê quer batalhar, não quer?", - 3: "Como você pode derrotar alguém...\nQue é um com seus Pokémon?" - }, - "victory": { - 1: "Não pode ser ajudado...\nSinto falta do Tate...", - 2: "Seu vínculo com seus Pokémon...\nÉ mais forte que o meu.", - 3: "Se eu estivesse com Tate, teríamos vencido.\nPodemos terminar as frases um do outro!" - }, - "defeat": { - 1: "Meus Pokémon e eu somos vitoriosos.", - 2: "Se você não consegue nem me derrotar, nunca será capaz de derrotar Tate também.", - 3: "Tudo graças ao meu treinamento rigoroso com Tate.\nPosso me sincronizar com meus Pokémon." - } - }, - "juan": { - "encounter": { - 1: "Agora não é hora de agir timidamente.\nVamos batalhar!", - 2: "Ahahaha, você será testemunha da minha arte com Pokémon de Água!", - 3: "Um tufão se aproxima!\nVocê será capaz de me testar?", - 4: "Por favor, você será testemunha da nossa arte.\nUma grande ilusão de água esculpida por meus Pokémon e por mim!" - }, - "victory": { - 1: "Você pode ser um gênio que pode enfrentar Wallace!", - 2: "Eu me concentrei na elegância enquanto você treinava.\nÉ natural que você me derrotasse.", - 3: "Ahahaha!\nMuito bem, você venceu desta vez.", - 4: "De você, sinto o brilho brilhante da habilidade que superará tudo." - }, - "defeat": { - 1: "Meus Pokémon e eu esculpimos uma ilusão de Água e saímos vitoriosos.", - 2: "Ahahaha, eu venci, e você perdeu.", - 3: "Posso emprestar meu traje? Pode te ajudar a batalhar!\nAhahaha, estou brincando!", - 4: "Eu sou o vencedor! O que quer dizer, você perdeu." - } - }, - "crasher_wake": { - "encounter": { - 1: "Crash! Crash! Cuidado!\nCrasher Wake… está… aqui!", - 2: "Crash! Crash! Crasher Wake!", - 3: "Sou a onda de poder que vai te lavar!" - }, - "victory": { - 1: "Isso coloca um sorriso no meu rosto!\nGuhahaha! Foi uma explosão!", - 2: "Hunwah! Acabou e terminou!\nComo vou dizer isso...\nQuero mais! Queria batalhar muito mais!", - 3: "O QUÊ?!" - }, - "defeat": { - 1: "Siiiiim! Isso mesmo!", - 2: "Eu venci, mas quero mais! Queria batalhar muito mais!", - 3: "Até logo!" - } - }, - "falkner": { - "encounter": { - 1: "Vou mostrar o verdadeiro poder dos magníficos Pokémon pássaros!", - 2: "Ventos, fiquem comigo!", - 3: "Pai! Espero que esteja vendo minha batalha de cima!" - }, - "victory": { - 1: "Eu entendo... Vou sair graciosamente.", - 2: "Uma derrota é uma derrota. Você é realmente forte.", - 3: "...Droga! Sim, eu perdi." - }, - "defeat": { - 1: "Pai! Venci com seus amados Pokémon pássaros...", - 2: "Pokémon pássaros são os melhores afinal!", - 3: "Sinto que estou alcançando meu pai!" - } - }, - "nessa": { - "encounter": { - 1: "Não importa que tipo de plano sua mente refinada possa estar tramando, meu parceiro e eu vamos afundá-lo.", - 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!" - }, - "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 bom, hein?", - 2: "Se você encontrar Gordie por aí, certifique-se de dar uma boa surra nele, ok?", - 3: "Acho que você levou a quebra de gelo um pouco literalmente demais..." - }, - "defeat": { - 1: "Agora você vê como as batalhas podem ser severas?", - 2: "Hee! Parece que ganhei de novo!", - 3: "Você está segurando?" - } - }, - "marlon": { - "encounter": { - 1: "Você parece forte! Vamos começar!", - 2: "Sou forte como a amplitude do oceano. Você vai ser varrido, com certeza.", - 3: "Oh ho, então estou enfrentando você! Isso é fora do comum." - }, - "victory": { - 1: "Você foi incrível! Está criando alguns Pokémon incríveis. Você dominou a coisa de Treinador!", - 2: "Você não apenas parece forte, você é forte de verdade! Eh, eu também fui varrido!", - 3: "Você é forte como uma onda impressionante!" - }, - "defeat": { - 1: "Você é forte, mas não é o suficiente para mudar o mar, ok!", - 2: "Hee! Parece que ganhei de novo!", - 3: "Doce, doce vitória!" - } - }, - "shauntal": { - "encounter": { - 1: "Com licença. Você é um 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 Treinador e está interessado em você.\nMeu objetivo é testá-lo—levar você aos limites da sua força. Kiai!", - 2: "Vitória, vitória decisiva, é meu objetivo! Desafiante, aqui vou eu!", - 3: "Em mim mesmo, procuro desenvolver a força de um lutador e eliminar qualquer fraqueza em mim!\nPrevalecendo com a força de minhas convicções!" - }, - "victory": { - 1: "Ufa! Bem feito!", - 2: "À medida que suas batalhas continuarem, mire em alturas ainda maiores!", - 3: "A força demonstrada por você e seus Pokémon me impressionou profundamente..." - }, - "defeat": { - 1: "Hmm.", - 2: "Isso foi uma boa batalha.", - 3: "Haaah! Haaah! Haiyaaaah!" - } - }, - "cheren": { - "encounter": { - 1: "Você me lembra um velho amigo. Isso me deixa animado para essa batalha Pokémon!", - 2: "As batalhas Pokémon não têm sentido se você não pensa por que você batalha.\nOu melhor, isso torna as batalhas junto com Pokémon sem sentido.", - 3: "Meu nome é Cheren! Sou um Líder de Ginásio e professor! Prazer em conhecê-lo." - }, - "victory": { - 1: "Obrigado! Vi o que estava faltando em mim.", - 2: "Obrigado! Sinto que vi um pouco do caminho em direção aos meus ideais.", - 3: "Hmm... Isso é problemático." - }, - "defeat": { - 1: "Como Líder de Ginásio, meu objetivo é ser um obstáculo para você superar.", - 2: "Tudo bem!", - 3: "Cheguei onde estou porque os Pokémon estavam ao meu lado.\nTalvez precisemos pensar por que os Pokémon nos ajudam, não em termos de Pokémon e Treinadores, mas como uma relação entre seres vivos." - } - }, - "chili": { - "encounter": { - 1: "Ihuuu! Hora de brincar com FOGO!! Sou o mais forte dos nossos irmãos!", - 2: "Ta-da! O incendiário do tipo Fogo Chili—sou eu—será seu oponente!", - 3: "Vou mostrar o que eu e meus tipos de Fogo podemos fazer!" - }, - "victory": { - 1: "Você me pegou. Estou... queimado...", - 2: "Uau! Você está pegando fogo!", - 3: "Ai! Você me pegou!" - }, - "defeat": { - 1: "Estou pegando fogo! Jogue comigo, e você se queimará!", - 2: "Quando você brinca com fogo, você se queima!", - 3: "Quero dizer, vamos lá, seu oponente era eu! Você não tinha chance!" - } - }, - "cilan": { - "encounter": { - 1: "Nada pessoal... Sem ressentimentos... Eu e meus Pokémon do tipo Grama vamos...\nUm... Vamos batalhar, aconteça o que acontecer.", - 2: "Então, hum, se você está bem comigo, vou, hum, colocar tudo o que tenho em ser, er, você sabe, seu oponente.", - 3: "OK… Então, hum, eu sou o Cilan, gosto de Pokémon do tipo Grama." - }, - "victory": { - 1: "Er... Acabou agora?", - 2: "…Que surpresa. Você é muito forte, não é?\nAcho que meus irmãos também não teriam sido capazes de te derrotar...", - 3: "…Huh. Parece que meu timing estava, hum, errado?" - }, - "defeat": { - 1: "Huh? Ganhei?", - 2: "Acho...\nSuponho que ganhei, porque competi com meus irmãos Chili e Cress, e todos conseguimos ficar mais fortes.", - 3: "Foi... uma experiência bastante emocionante..." - } - }, - "roark": { - "encounter": { - 1: "Preciso ver seu potencial como Treinador. 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ê!" - }, - "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.", - 3: "Com habilidade como a sua, é natural que você vença.", - 4: "O-o que?! Não pode ser! Nem isso foi suficiente?", - 5: "Eu estraguei tudo." - }, - "defeat": { - 1: "Veja? Estou orgulhoso do meu estilo de batalha rochoso!", - 2: "Obrigado! A batalha me deu confiança de que talvez eu consiga vencer meu pai!", - 3: "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!" - } - }, - "morty": { - "encounter": { - 1: "Com um pouco mais, eu poderia ver um futuro em que encontro o Pokémon lendário.\nVocê vai me ajudar a alcançar esse nível!", - 2: "Dizem que um Pokémon com cores de arco-íris aparecerá diante de um Treinador verdadeiramente poderoso.\nAcreditei nessa história, então treinei secretamente aqui a vida toda. Como resultado, agora posso ver o que os outros não podem.\nVejo uma sombra da pessoa que fará o Pokémon aparecer.\nAcredito que essa pessoa sou eu! Você vai me ajudar a alcançar esse nível!", - 3: "Quer você escolha acreditar ou não, o poder místico existe.", - 4: "Você pode testemunhar os frutos do meu treinamento.", - 5: "Você deve fazer sua alma se tornar uma com a dos Pokémon. Você pode fazer isso?", - 6: "Diga, você quer fazer parte do meu treinamento?" - }, - "victory": { - 1: "Ainda não sou bom o suficiente...", - 2: "Eu vejo... Sua jornada o levou a lugares distantes e você testemunhou muito mais do que eu.\nEu invejo você por isso...", - 3: "Como isso é possível...", - 4: "Não acho que nossos potenciais sejam tão diferentes.\nMas você parece ter algo mais do que isso... Que seja.", - 5: "Acho que preciso de mais treinamento.", - 6: "Isso é uma pena." - }, - "defeat": { - 1: "Eu me movi... mais um passo adiante.", - 2: "Fufufu...", - 3: "O-o que?! Não pode ser! Nem isso foi suficiente?", - 4: "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!", - 5: "Ahahahah!", - 6: "Eu sabia que venceria!" - } - }, - "crispin": { - "encounter": { - 1: "Quero vencer, então é exatamente isso que vou fazer!", - 2: "Eu batalho porque quero batalhar! E sabe de uma coisa? É assim que deve ser!" - }, - "victory": { - 1: "Queria vencer... mas perdi!", - 2: "Eu perdi... porque não consegui vencer!" - }, - "defeat": { - 1: "Ei, espere um segundo. Eu acabei de vencer? Acho que acabei de vencer! Que satisfação!", - 2: "Uou! Isso foi incrível!" - } - }, - "amarys": { - "encounter": { - 1: "Quero ser a pessoa a ajudar alguém em particular. Sendo assim, não posso me dar ao luxo de perder.\n... Nossa batalha começa agora." - }, - "victory": { - 1: "Eu sou... não o suficiente, eu vejo." - }, - "defeat": { - 1: "A vitória pertence a mim. Bem lutado." - } - }, - "lacey": { - "encounter": { - 1: "Vou enfrentar você com meu time usual como membro da Elite dos Quatro." - }, - "victory": { - 1: "Foi uma excelente batalha. Estou ansiosa para o próximo desafio." - }, - "defeat": { - 1: "Fufufu... Nada mal.\nDesafiantes que derrotam a Elite dos Quatro são dignos de notar." - } - }, - "drayton": { - "encounter": { - 1: `Cara, eu amo cadeiras. Você não ama cadeiras? Que salva-vidas. - $Não entendo por que todo mundo não fica sentado o tempo todo. Ficar de pé é cansativo!`, - }, - "victory": { - 1: "Acho que deveria ter esperado por isso!" - }, - "defeat": { - 1: "Heh heh! Não ligue para mim, só pegando uma vitória aqui. Entendo se você estiver chateado, mas não vá dar uma de Kieran comigo, OK?" - } - }, - "ramos": { - "encounter": { - 1: `Você gostou do jardim de diversão que fiz com todas essas plantas resistentes minhas? - $A força delas é um sinal da minha força como jardineiro e Líder de Ginásio! Você tem certeza de que está pronto para enfrentar tudo isso?`, - }, - "victory": { - 1: "Você acredita nos seus Pokémon... E eles acreditam em você também... Foi uma boa batalha, broto." - }, - "defeat": { - 1: "Hohoho... De fato. Pequenas lâminas frágeis de grama conseguem quebrar até mesmo concreto." - } - }, - "viola": { - "encounter": { - 1: `Seja as lágrimas de frustração que seguem uma derrota ou o florescer da alegria que vem com a vitória… - $Ambos são ótimos temas para minha câmera! Fantástico! Isso vai ser simplesmente fantástico! - $Agora venha para cima de mim!`, - 2: "Minha lente está sempre focada na vitória – não vou deixar nada estragar esta foto!" - }, - "victory": { - 1: "Você e seus Pokémon me mostraram uma nova profundidade de campo! Fantástico! Simplesmente fantástico!", - 2: `O mundo que você vê através de uma lente, e o mundo que você vê com um Pokémon ao seu lado… - $O mesmo mundo pode parecer completamente diferente dependendo do seu ponto de vista.` - }, - "defeat": { - 1: "A foto do momento da minha vitória vai ser um verdadeiro sucesso!", - 2: "Sim! Tirei ótimas fotos!" - } - }, - "candice": { - "encounter": { - 1: `Você quer desafiar a Candice? Com certeza! Eu estava esperando por alguém forte! - $Mas devo te avisar, sou forte porque sei como focar.`, - 2: `Pokémon, moda, romance… É tudo uma questão de foco! - $Vou te mostrar exatamente o que quero dizer. Prepare-se para perder!` - }, - "victory": { - 1: "Devo dizer, estou aquecida para você! Posso até te admirar um pouco.", - 2: `Uau! Você é ótimo! Ganhou meu respeito! - $Acho que seu foco e vontade nos derrubaram totalmente.` - }, - "defeat": { - 1: "Eu senti sua vontade de vencer, mas eu não perco!", - 2: "Viu? O foco da Candice! O foco dos meus Pokémon também é ótimo!" - } - }, - "gardenia": { - "encounter": { - 1: "Você tem uma aura vencedora. Então, de qualquer forma, isso vai ser divertido. Vamos ter nossa batalha!" - }, - "victory": { - 1: "Incrível! Você é muito bom, não é?" - }, - "defeat": { - 1: "Sim! Meus Pokémon e eu somos perfeitamente bons!" - } - }, - "aaron": { - "encounter": { - 1: "Ok! Deixe-me enfrentar você!" - }, - "victory": { - 1: "Batalhar é um assunto profundo e complexo..." - }, - "defeat": { - 1: "Vencer um membro da Elite dos Quatro não é fácil." - } - }, - "cress": { - "encounter": { - 1: "Isso mesmo! Serei eu e meus estimados tipos Água que você deve enfrentar na batalha!" - }, - "victory": { - 1: "Perder? Eu? Não acredito nisso." - }, - "defeat": { - 1: "Este é o resultado apropriado quando eu sou seu oponente." - } - }, - "allister": { - "encounter": { - 1: "'M Allister.\nA-aqui... vou eu..." - }, - "victory": { - 1: `Quase perdi minha máscara de tanto choque... Isso foi… - $Uau. Posso ver sua habilidade pelo que ela é.`, - }, - "defeat": { - 1: "I-isso foi incrível!" - } - }, - "clay": { - "encounter": { - 1: "Harrumph! Me deixou esperando, não foi, garoto? Tudo bem, hora de ver o que você pode fazer!" - }, - "victory": { - 1: "Cara, como é bom dar tudo de si e ainda assim ser derrotado!" - }, - "defeat": { - 1: `O que importa é como você reage à derrota. - $É por isso que as pessoas que usam a derrota como combustível para melhorar são duras.`, - } - }, - "kofu": { - "encounter": { - 1: "Vou te servir um prato completo de Pokémon do tipo Água! Mas não tente comê-los!" - }, - "victory": { - 1: "Vaultin' Veluza! Você é animado, não é! Um pouco ANIMADO DEMAIS, se me permite dizer!" - }, - "defeat": { - 1: "Volte para me ver novamente, ouviu?" - } - }, - "tulip": { - "encounter": { - 1: "Permita-me usar minhas habilidades para deixar seus lindos Pokémon ainda mais bonitos!" - }, - "victory": { - 1: "Sua força tem uma magia que não pode ser apagada." - }, - "defeat": { - 1: "Você sabe, na minha linha de trabalho, pessoas que carecem de talento em uma área ou outra frequentemente desaparecem rapidamente - nunca mais se ouve falar delas." - } - }, - "sidney": { - "encounter": { - 1: `Gostei desse olhar que você me deu. Acho que você vai ser um bom desafio. - $Isso é ótimo! Parece muito bom! Vamos nessa! - $Você e eu, vamos curtir uma batalha que só pode acontecer aqui!`, - }, - "victory": { - 1: "E aí, gostou? Eu perdi! Mas foi divertido, então não importa." - }, - "defeat": { - 1: "Sem ressentimentos, beleza?" - } - }, - "phoebe": { - "encounter": { - 1: `Enquanto treinava, adquiri a habilidade de me comunicar com Pokémon do tipo Fantasma. - $Sim, o vínculo que desenvolvi com os Pokémon é extremamente forte. - $Então, vamos lá, tente ver se você consegue até mesmo causar dano aos meus Pokémon!`, - }, - "victory": { - 1: "Ah, droga. Eu perdi." - }, - "defeat": { - 1: "Estou ansiosa para batalhar com você de novo algum dia!" - } - }, - "glacia": { - "encounter": { - 1: `Tudo o que vi foram desafios de Treinadores fracos e seus Pokémon. - $E você? Ficaria extremamente satisfeita se pudesse dar tudo de mim contra você!`, - }, - "victory": { - 1: `Você e seus Pokémon… Como seus espíritos queimam! - $O calor consumido é esmagador. - $Não é surpresa que minhas habilidades geladas falharam em te machucar.`, - }, - "defeat": { - 1: "Uma batalha intensamente apaixonada, sem dúvida." - } - }, - "drake": { - "encounter": { - 1: `Para nós, batalhar com Pokémon como parceiros, você sabe o que é necessário? Você sabe o que precisa? - $Se não souber, nunca prevalecerá contra mim!`, - }, - "victory": { - 1: "Excelente, deve-se dizer." - }, - "defeat": { - 1: "Dei meu máximo nessa batalha!" - } - }, - "wallace": { - "encounter": { - 1: `Há algo em você… Uma diferença na sua postura. - $Acho que sinto isso em você. Agora, me mostre. Mostre-me o poder que você tem com seus Pokémon. - $E eu, por minha vez, apresentarei uma performance de ilusões na água com meus Pokémon!`, - }, - "victory": { - 1: `Bravo. Agora percebo sua autenticidade e magnificência como Treinador de Pokémon. - $Tenho muita alegria em ter conhecido você e seus Pokémon. Você se mostrou digno.`, - }, - "defeat": { - 1: "Uma grande ilusão!" - } - }, - "lorelei": { - "encounter": { - 1: `Ninguém me supera quando se trata de Pokémon gelados! Movimentos congelantes são poderosos! - $Seus Pokémon estarão à minha mercê quando estiverem congelados! Hahaha! Está pronto?`, - }, - "victory": { - 1: "Como ousa!" - }, - "defeat": { - 1: "Não há nada que você possa fazer quando está congelado." - } - }, - "will": { - "encounter": { - 1: `Treinei por todo o mundo, tornando meus Pokémon psíquicos poderosos. - $Eu só posso melhorar! Perder não é uma opção!`, - }, - "victory": { - 1: "Eu… Eu não… acredito…" - }, - "defeat": { - 1: "Isso foi por pouco. Me pergunto o que você está faltando." - } - }, - "malva": { - "encounter": { - 1: `Sinto que meu coração pode explodir em chamas. - $Estou ardendo de ódio por você, pirralho!`, - }, - "victory": { - 1: "Que novidade… Um novo desafiador derrotou Malva!" - }, - "defeat": { - 1: "Estou encantada! Sim, encantada por poder esmagar você sob meu calcanhar." - } - }, - "hala": { - "encounter": { - 1: "O velho Hala está aqui para fazer você gritar!" - }, - "victory": { - 1: "Pude sentir o poder que você ganhou na sua jornada." - }, - "defeat": { - 1: "Haha! Que batalha deliciosa!" - } - }, - "molayne": { - "encounter": { - 1: `Dei a posição de capitão ao meu primo Sophocles, mas estou confiante na minha habilidade. - $Minha força é como a de uma supernova!`, - }, - "victory": { - 1: "Certamente encontrei um Treinador 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, garoto." - }, - "defeat": { - 1: "Nahahaha! Você realmente é algo mais, garoto!" - } - }, - "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ê é um especialista em Pokémon!\nMinha pesquisa ainda não está completa. OK, você venceu." - }, - "defeat": { - 1: "Obrigado! Graças à nossa batalha, eu também pude fazer progressos na minha pesquisa!" - } - }, - "koga": { - "encounter": { - 1: "Fwahahahaha! Pokémon não são apenas sobre força bruta--você verá em breve!" - }, - "victory": { - 1: "Ah! Você provou seu valor!" - }, - "defeat": { - 1: "Você aprendeu a temer as técnicas do ninja?" - } - }, - "bertha": { - "encounter": { - 1: "Bem, você mostraria a esta velha senhora o quanto aprendeu?" - }, - "victory": { - 1: `Bem! Querida criança, devo dizer, isso foi muito impressionante. - $Seus Pokémon acreditaram em você e fizeram o melhor para te dar a vitória. - $Mesmo tendo perdido, me encontro com esse sorriso bobo!`, - }, - "defeat": { - 1: "Hahahahah! Parece que esta velha senhora ganhou!" - } - }, - "lenora": { - "encounter": { - 1: "Bem, desafiador, vou pesquisar como você batalha com os Pokémon que criou com tanto carinho!" - }, - "victory": { - 1: "Minha teoria sobre você estava correta. Você é mais do que talentoso… Você é motivado! Eu te saúdo!" - }, - "defeat": { - 1: "Ah ha ha! Se você perder, certifique-se de analisar o porquê e use esse conhecimento na próxima batalha!" - } - }, - "siebold": { - "encounter": { - 1: "Enquanto eu estiver vivo, continuarei em busca da culinária suprema... e dos oponentes mais fortes em batalha!" - }, - "victory": { - 1: "Guardarei minha memória de você e seus Pokémon para sempre em meu coração." - }, - "defeat": { - 1: `Nossa batalha Pokémon foi como alimento para minha alma. Isso vai me manter em frente. - $É assim que vou prestar meus respeitos a você por dar tudo de si na batalha!`, - } - }, - "roxie": { - "encounter": { - 1: "Prepare-se! Vou arrancar algum senso de você!" - }, - "victory": { - 1: "Selvagem! Sua razão já é mais tóxica que a minha!" - }, - "defeat": { - 1: "Ei, vamos lá! Seja sério! Você tem que dar mais de si!" - } - }, - "olivia": { - "encounter": { - 1: "Não precisa de introdução aqui. Hora de batalhar comigo, Olivia!" - }, - "victory": { - 1: "Realmente encantador… Tanto você quanto seus Pokémon…" - }, - "defeat": { - 1: "Mmm-hmm." - } - }, - "poppy": { - "encounter": { - 1: "Oooh! Você quer ter uma batalha Pokémon comigo?" - }, - "victory": { - 1: "Uagh?! Mmmuuuggghhh…" - }, - "defeat": { - 1: `Yaaay! Eu consegui! Eu der-ro-tei você! Você pode vir para… Para… Uma revanche? - $Venha para uma revanche quando quiser!`, - } - }, - "agatha": { - "encounter": { - 1: "Pokémon são para batalhas! Vou te mostrar como um verdadeiro Treinador batalha!" - }, - "victory": { - 1: "Oh meu! Você é algo especial, criança!" - }, - "defeat": { - 1: "Bahaha. É assim que uma batalha adequada é feita!" - } - }, - "flint": { - "encounter": { - 1: "Espero que você esteja aquecido, porque aqui vem o Big Bang!" - }, - "victory": { - 1: "Incrível! Seus movimentos são tão quentes que fazem os meus parecerem mornos!" - }, - "defeat": { - 1: "Huh? Isso é tudo? Acho que você precisa de um pouco mais de paixão." - } - }, - "grimsley": { - "encounter": { - 1: "O vencedor leva tudo, e não sobra nada para o perdedor." - }, - "victory": { - 1: "Quando se perde, perde-se tudo… A próxima coisa que vou procurar será a vitória, também!" - }, - "defeat": { - 1: "Se alguém vence, a pessoa que lutou contra essa pessoa perde." - } - }, - "caitlin": { - "encounter": { - 1: `Sou eu que apareci quando a flor se abriu. Você que estava esperando… - $Você parece um Treinador de Pokémon com força refinada e bondade profunda. - $O que eu procuro no meu oponente é uma força soberba… - $Por favor, libere seu poder ao máximo!`, - }, - "victory": { - 1: "Meus Pokémon e eu aprendemos muito! Agradeço a você." - }, - "defeat": { - 1: "Aspiro a reivindicar a vitória com elegância e graça." - } - }, - "diantha": { - "encounter": { - 1: `Batalhar contra você e seus Pokémon, todos vocês cheios de esperança para o futuro… - $Honestamente, isso apenas me enche da energia que preciso para continuar enfrentando cada novo dia! Sim!`, - }, - "victory": { - 1: "Testemunhar os espíritos nobres de você e seus Pokémon em batalha realmente tocou meu coração…" - }, - "defeat": { - 1: "Oh, fantástico! O que achou? Minha equipe foi bem legal, né?" - } - }, - "wikstrom": { - "encounter": { - 1: `Bem encontrado, jovem desafiador! Verdadeiramente sou a lâmina famosa de aço endurecido, Duque Wikstrom! - $Que a batalha comece! En garde!`, - }, - "victory": { - 1: "Glorioso! A confiança que você compartilha com seu honrado Pokémon supera até mesmo a minha!" - }, - "defeat": { - 1: `Que tipo de magia é essa? Meu coração bate incessantemente no meu peito! - $Vencer contra um oponente tão digno dá asas à minha alma--assim eu voo!`, - } - }, - "acerola": { - "encounter": { - 1: "Batalhar é simplesmente divertido! Vamos lá, eu posso te derrotar!" - }, - "victory": { - 1: "Eu… Estou sem palavras! Como você conseguiu?!" - }, - "defeat": { - 1: "Ehaha! Que vitória incrível!" - } - }, - "larry_elite": { - "encounter": { - 1: `Olá… Sou eu, Larry. - $Eu também sou membro da Elite dos Quatro, sim… Infelizmente para mim.`, - }, - "victory": { - 1: "Bem, isso tirou o vento debaixo das nossas asas…" - }, - "defeat": { - 1: "É hora de uma reunião com o chefe." - } - }, - "lance": { - "encounter": { - 1: "Estive esperando por você. Permita-me testar suas habilidades.", - 2: "Achei que você conseguiria chegar tão longe. Vamos começar." - }, - "victory": { - 1: "Você me pegou. Você é magnífico!", - 2: "Nunca esperei que outro Treinador me derrotasse… Estou surpreso." - }, - "defeat": { - 1: "Isso foi por pouco. Quer tentar de novo?", - 2: "Não é que você seja fraco. Não se incomode com isso." - } - }, - "karen": { - "encounter": { - 1: "Eu sou Karen. Você gostaria de um duelo com meus Pokémon do tipo Sombrio?", - 2: "Sou diferente daqueles que você já conheceu.", - 3: "Você montou uma equipe charmosa. Nossa batalha deve ser boa." - }, - "victory": { - 1: "Não! Eu não posso vencer. Como você ficou tão forte?", - 2: "Não me desviarei do meu caminho escolhido.", - 3: "O Campeão está ansioso para te conhecer." - }, - "defeat": { - 1: "Isso era o que eu esperava.", - 2: "Bem, isso foi relativamente divertido.", - 3: "Venha me visitar a qualquer momento." - } - }, - "milo": { - "encounter": { - 1: `Parece que você entende bem os Pokémon. - $Isso vai ser uma batalha e tanto! - $Vou ter que usar a Dynamax no meu Pokémon se eu quiser vencer!`, - }, - "victory": { - 1: "O poder da Grama murchou… Que desafiador incrível!" - }, - "defeat": { - 1: "Isso realmente vai te deixar em choque e admiração." - } - }, - "lucian": { - "encounter": { - 1: `Só um momento, por favor. O livro que estou lendo está quase no clímax emocionante… - $O herói obteve uma espada mística e está prestes a enfrentar sua prova final… Ah, tanto faz. - $Já que você chegou tão longe, vou deixar isso de lado e batalhar com você. - $Deixe-me ver se você alcançará tanta glória quanto o herói do meu livro!`, - }, - "victory": { - 1: "Eu vejo… Parece que você me colocou em xeque-mate." - }, - "defeat": { - 1: "Tenho uma reputação a manter." - } - }, - "drasna": { - "encounter": { - 1: `Você deve ser um Treinador forte. Sim, bastante forte… - $Isso é uma notícia maravilhosa! Enfrentar oponentes como você e sua equipe fará meus Pokémon crescerem como ervas daninhas!`, - }, - "victory": { - 1: "Oh, meu Deus. Isso foi uma batalha rápida… Espero que você volte novamente algum dia!" - }, - "defeat": { - 1: "Como isso é possível?" - } - }, - "kahili": { - "encounter": { - 1: "Então, aqui está você… Por que não vemos para quem os ventos favorecem hoje, você… ou eu?" - }, - "victory": { - 1: "É frustrante para mim como membro da Elite dos Quatro, mas parece que sua força é real." - }, - "defeat": { - 1: "Essa foi uma jogada de mestre!" - } - }, - "hassel": { - "encounter": { - 1: "Prepare-se para aprender em primeira mão como é a respiração ardente de uma batalha feroz!" - }, - "victory": { - 1: `A sorte sorriu para mim desta vez, mas… - $Julgando pelo andamento da luta, quem sabe se serei tão sortudo na próxima vez.`, - }, - "defeat": { - 1: "Essa foi uma jogada de mestre!" - } - }, - "blue": { - "encounter": { - 1: "Você deve ser muito bom 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 um novo Campeão." - }, - "defeat": { - 1: "Defendi com sucesso meu Campeonato." - } - }, - "steven": { - "encounter": { - 1: `Diga-me… O que você viu na sua jornada com seus Pokémon? - $O que você sentiu, encontrando tantos outros Treinadores por aí? - $Viajar por esta terra rica… Isso despertou algo dentro de você? - $Quero que você venha até mim com tudo o que aprendeu. - $Meus Pokémon e eu responderemos com tudo o que sabemos!`, - }, - "victory": { - 1: "Então eu, o Campeão, caio em derrota…" - }, - "defeat": { - 1: "Esse tempo foi bem gasto! Obrigado!" - } - }, - "cynthia": { - "encounter": { - 1: "Eu, Cynthia, aceito seu desafio! Não haverá nenhuma trégua da minha parte!" - }, - "victory": { - 1: "Não importa o quão divertida a batalha seja, ela sempre terminará algum dia…" - }, - "defeat": { - 1: "Mesmo que você perca, nunca perca o amor pelos Pokémon." - } - }, - "iris": { - "encounter": { - 1: `Sabe de uma coisa? Estou realmente ansiosa para ter batalhas sérias com Treinadores fortes! - $Quero dizer, vamos lá! Os Treinadores que chegam aqui são Treinadores que desejam a vitória com todas as fibras do seu ser! - #E eles estão batalhando ao lado de Pokémon que passaram por inúmeras batalhas difíceis! - $Se eu batalhar com pessoas assim, não só eu ficarei mais forte, meus Pokémon também! - $E nós vamos nos conhecer ainda melhor! OK! Prepare-se! - $Sou Iris, a Campeã da Liga Pokémon, e vou te derrotar!`, - }, - "victory": { - 1: "Aghhhh… Eu dei o meu melhor, mas nós perdemos…" - }, - "defeat": { - 1: "Yay! Nós vencemos!" - } - }, - "hau": { - "encounter": { - 1: `Eu me pergunto se um Treinador batalha de maneira diferente dependendo se ele é de uma região quente ou fria. - $Vamos testar isso!`, - }, - "victory": { - 1: "Isso foi incrível! Acho que entendi um pouco melhor seu estilo agora!" - }, - "defeat": { - 1: "Cara, essa foi uma batalha e tanto!" - } - }, - "geeta": { - "encounter": { - 1: `Decidi entrar na batalha mais uma vez. - $Venha agora… Mostre-me os frutos do seu treinamento.`, - }, - "victory": { - 1: "Estou ansiosa para notícias de todas as suas conquistas!" - }, - "defeat": { - 1: "Qual o problema? Isso é tudo?" - } - }, - "nemona": { - "encounter": { - 1: "Yesss! Estou tão empolgada! Hora de soltar tudo!" - }, - "victory": { - 1: "Bem, isso foi ruim, mas ainda me diverti! Eu te pego na próxima!" - }, - "defeat": { - 1: "Bem, essa foi uma ótima batalha! Frutífera, com certeza." - } - }, - "leon": { - "encounter": { - 1: "Vamos ter um tempo absolutamente campeão!" - }, - "victory": { - 1: `Meu tempo como Campeão acabou… - $Mas que tempo campeão foi! - $Obrigado pela melhor batalha que já tive!`, - }, - "defeat": { - 1: "Um tempo absolutamente campeão, foi!" - } - }, - "whitney": { - "encounter": { - 1: "Eai! Você não acha que os Pokémon são, tipo, super fofos?" - }, - "victory": { - 1: "Waaah! Waaah! Você é tão mau!" - }, - "defeat": { - 1: "E é isso!" - } - }, - "chuck": { - "encounter": { - 1: "Hah! Você quer me desafiar? É corajoso 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 jogado 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á-lo agora e não vou segurar nada. - $Por favor, prepare-se para a batalha!`, - }, - "victory": { - 1: "Eu admito a derrota…" - }, - "defeat": { - 1: "Isso foi incrível." - } - }, - "fantina": { - "encounter": { - 1: `Você vai me desafiar, não é? Mas eu vou ganhar. - $É o que a Líder do Ginásio de Hearthome faz, não?`, - }, - "victory": { - 1: "Você é tão incrivelmente forte. Sei porque perdi." - }, - "defeat": { - 1: "Estou tão, tão, muito feliz!" - } - }, - "byron": { - "encounter": { - 1: `Treinador! Você é jovem, assim como meu filho, Roark. - $Com mais Treinadores jovens assumindo o comando, o futuro dos Pokémon é brilhante! - $Então, como uma parede para os jovens, aceitarei seu desafio!`, - }, - "victory": { - 1: "Hmm! Meus Pokémon robustos--derrotados!" - }, - "defeat": { - 1: "Gwahahaha! Como foram meus Pokémon robustos?!" - } - }, - "olympia": { - "encounter": { - 1: "Um costume antigo decidindo o destino de alguém. A batalha começa!" - }, - "victory": { - 1: "Crie seu próprio caminho. Não deixe nada te atrapalhar. Seu destino, seu futuro." - }, - "defeat": { - 1: "Nosso caminho está claro agora." - } - }, - "volkner": { - "encounter": { - 1: `Já que você chegou tão longe, deve ser bastante forte… - $Espero que você seja o Treinador que me faça lembrar como é divertido batalhar!`, - }, - "victory": { - 1: `Você me venceu… - $Seu desejo e a maneira nobre como seus Pokémon batalharam por você… - $Eu até me senti emocionado durante nossa luta. Foi uma batalha muito boa.`, - }, - "defeat": { - 1: `Não foi nada chocante… - $Isso não é o que eu queria!`, - } - }, - "burgh": { - "encounter": { - 1: `M'hm… Se eu ganhar esta batalha, sinto que posso desenhar um quadro diferente de qualquer outro. - $OK! Posso ouvir minha musa da batalha claramente. Vamos direto ao ponto!`, - 2: `Claro, estou realmente orgulhoso de todos os meus Pokémon! - $Bem agora… Vamos direto ao ponto!` - }, - "victory": { - 1: "Acabou? Minha musa me abandonou?", - 2: "Hmm… Acabou! Você é incrível!" - }, - "defeat": { - 1: "Uau… É bonito de alguma forma, não é…", - 2: `Às vezes ouço as pessoas dizerem que foi uma vitória feia. - $Acho que se você está dando o seu melhor, qualquer vitória é bonita.` - } - }, - "elesa": { - "encounter": { - 1: `C'est fini! Quando tenho certeza disso, sinto um choque elétrico percorrer meu corpo! - $Quero sentir essa sensação, então agora meus amados Pokémon vão fazer sua cabeça girar!`, - }, - "victory": { - 1: "Eu queria fazer sua cabeça girar, mas você me surpreendeu." - }, - "defeat": { - 1: "Isso foi insatisfatório de alguma forma… Você dará tudo de si na próxima vez?" - } - }, - "skyla": { - "encounter": { - 1: `Finalmente é hora do confronto! Isso significa a batalha Pokémon que decide quem está no topo, certo? - $Eu amo estar no topo! Porque você pode ver para sempre e sempre de lugares altos! - $Então, que tal nós nos divertirmos?`, - }, - "victory": { - 1: "Ser seu oponente na batalha é uma nova fonte de força para mim. Obrigada!" - }, - "defeat": { - 1: "Ganhar ou perder, você sempre ganha algo com uma batalha, certo?" - } - }, - "brycen": { - "encounter": { - 1: `Há também força em estar com outras pessoas e Pokémon. - $Receber o apoio deles te fortalece. Vou te mostrar esse poder!`, - }, - "victory": { - 1: "A maravilhosa combinação de você e seus Pokémon! Que amizade linda!" - }, - "defeat": { - 1: "Condições extremas realmente testam e treinam você!" - } - }, - "drayden": { - "encounter": { - 1: `O que eu quero encontrar é um jovem Treinador que possa me mostrar um futuro brilhante. - $Vamos batalhar com tudo o que temos: sua habilidade, minha experiência e o amor com que criamos nossos Pokémon!`, - }, - "victory": { - 1: "Esse sentimento intenso que me invade após uma derrota… Não sei como descrevê-lo." - }, - "defeat": { - 1: "Harrumph! Sei que sua habilidade é maior que isso!" - } - }, - "grant": { - "encounter": { - 1: `Só há uma coisa que desejo. - $Que, superando um ao outro, encontremos um caminho para alturas ainda maiores.`, - }, - "victory": { - 1: "Você é uma parede que não consigo superar!" - }, - "defeat": { - 1: `Não desista. - $Isso é tudo o que realmente importa. - $As lições mais importantes da vida são simples.`, - } - }, - "korrina": { - "encounter": { - 1: "Hora da grande aparição de Lady Korrina!" - }, - "victory": { - 1: "É o seu próprio ser que permite que seus Pokémon evoluam!" - }, - "defeat": { - 1: "Que batalha explosiva!" - } - }, - "clemont": { - "encounter": { - 1: "Oh! Estou feliz por termos nos encontrado!" - }, - "victory": { - 1: "Sua paixão pela batalha me inspira!" - }, - "defeat": { - 1: "Parece que minha Máquina Treinadora-Crescer-Forte, Mach 2 está realmente funcionando!" - } - }, - "valerie": { - "encounter": { - 1: `Oh, se não é um jovem Treinador… É adorável conhecê-lo assim. - $Então, suponho que você ganhou o direito a uma batalha, como recompensa por seus esforços. - $O elusivo Fada pode parecer frágil como a brisa e delicado como uma flor, mas é forte.`, - }, - "victory": { - 1: "Espero que você encontre coisas para sorrir amanhã…" - }, - "defeat": { - 1: "Oh meu Deus, que pena…" - } - }, - "wulfric": { - "encounter": { - 1: `Sabe de uma coisa? Todos falamos muito sobre o que você aprende com as batalhas e os laços e tudo mais… - $Mas realmente, eu só faço isso porque é divertido. - $Quem se importa com o grandioso? Vamos batalhar!`, - }, - "victory": { - 1: "Incrível! Sou duro como um iceberg, mas você me quebrou por completo!" - }, - "defeat": { - 1: "Lute comigo e é isso que acontece!" - } - }, - "kabu": { - "encounter": { - 1: `Todo Treinador e Pokémon treina duro em busca da vitória. - $Mas isso significa que seu oponente também está se esforçando para vencer. - $No final, a partida é decidida por qual lado é capaz de liberar seu verdadeiro potencial.`, - }, - "victory": { - 1: "Estou feliz por poder lutar com você hoje!" - }, - "defeat": { - 1: "É uma ótima maneira de sentir meu próprio crescimento!" - } - }, - "bea": { - "encounter": { - 1: `Você tem um espírito inabalável que não será movido, não importa como você seja atacado? - $Acho que vou testar isso, certo?`, - }, - "victory": { - 1: "Senti o espírito de luta de seus Pokémon enquanto você os liderava na batalha." - }, - "defeat": { - 1: "Essa foi a melhor partida que alguém poderia esperar." - } - }, - "opal": { - "encounter": { - 1: "Deixe-me ver como você e seu Pokémon parceiro se comportam!" - }, - "victory": { - 1: "Seu rosa ainda está faltando, mas você é um Treinador 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ético você é e quão forte eu sou." - }, - "victory": { - 1: "Eu vejo… Bem, tudo bem. Eu não estava me esforçando muito de qualquer maneira." - }, - "defeat": { - 1: "Bom trabalho, eu suponho." - } - }, - "gordie": { - "encounter": { - 1: "Então, vamos acabar com isso." - }, - "victory": { - 1: "Eu só quero me enterrar em um buraco… Bem, acho que seria mais como cair daqui." - }, - "defeat": { - 1: "Batalhe como sempre faz, a vitória seguirá!" - } - }, - "marnie": { - "encounter": { - 1: `A verdade é que, quando tudo está dito e feito… Eu realmente só quero me tornar Campeã por mim mesma! - $Então, não leve para o pessoal quando eu chutar seu traseiro!`, - }, - "victory": { - 1: "OK, então eu perdi… Mas consegui ver muitos dos pontos bons de você e seus Pokémon!" - }, - "defeat": { - 1: "Espero que você tenha gostado das nossas táticas de batalha." - } - }, - "raihan": { - "encounter": { - 1: "Vou derrotar o Campeão, vencer todo o torneio e provar ao mundo o quão forte o grande Raihan realmente é!" - }, - "victory": { - 1: `Eu pareço bem mesmo quando perco. - $É uma verdadeira maldição. - $Acho que é hora de mais uma selfie!`, - }, - "defeat": { - 1: "Vamos tirar uma selfie para lembrar disso." - } - }, - "brassius": { - "encounter": { - 1: "Pressuponho que você está pronto? Que nossa obra de arte colaborativa comece!" - }, - "victory": { - 1: "Ahhh…avant-garde!" - }, - "defeat": { - 1: "Começarei uma nova peça imediatamente!" - } - }, - "iono": { - "encounter": { - 1: `Como você está se sentindo sobre esta batalha? - $... - $Vamos começar o show! Quão forte é o nosso desafiador? - $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!" - }, - "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, meu amigo, você move minha ALMA!" - }, - "defeat": { - 1: "Até mais, baby!" - } - }, - "grusha": { - "encounter": { - 1: "Tudo o que preciso fazer é garantir que o poder do meu Pokémon te arrependa até os ossos!" - }, - "victory": { - 1: "Sua paixão ardente... Eu meio que gosto, para ser honesto." - }, - "defeat": { - 1: "As coisas não esquentaram para você." - } - }, - "marnie_elite": { - "encounter": { - 1: "Você chegou até aqui, hein? Vamos ver se você pode lidar com meus Pokémon!", - 2: "Vou dar o meu melhor, mas não pense que vou pegar leve com você!" - }, - "victory": { - 1: "Não acredito que perdi... Mas você mereceu essa vitória. Bem feito!", - 2: "Parece que ainda tenho muito a aprender. Grande batalha, porém!" - }, - "defeat": { - 1: "Você lutou bem, mas eu tenho a vantagem! Melhor sorte na próxima vez!", - 2: "Parece que meu treinamento valeu a pena. Obrigado pela batalha!" - } - }, - "nessa_elite": { - "encounter": { - 1: "As marés estão mudando a meu favor. Pronto para ser levado pela corrente?", - 2: "Vamos fazer ondas com esta batalha! Espero que esteja preparado!" - }, - "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á pronto para enfrentar seus medos?", - 2: "Vamos ver se você pode lidar com a escuridão que eu comando." - }, - "victory": { - 1: "Você dissipou as sombras... Por enquanto. Bem feito.", - 2: "Sua luz atravessou minha escuridão. Ótimo trabalho." - }, - "defeat": { - 1: "As sombras falaram... Sua força não é suficiente.", - 2: "A escuridão triunfa... Talvez na próxima vez você veja a luz." - } - }, - "raihan_elite": { - "encounter": { - 1: "Tempestade se formando! Vamos ver se você aguenta essa luta!", - 2: "Prepare-se para enfrentar o olho da tempestade!" - }, - "victory": { - 1: "Você enfrentou a tempestade... Trabalho incrível!", - 2: "Você navegou nos ventos perfeitamente... Grande batalha!" - }, - "defeat": { - 1: "Outra tempestade enfrentada, outra vitória conquistada! Bem lutado!", - 2: "Você foi pego na minha tempestade! Melhor sorte na próxima vez!" - } - }, - "alder": { - "encounter": { - 1: "Se prepare para uma batalha contra o Treinador mais forte de Unova!" - }, - "victory": { - 1: "Muito bem! Você certamente é um talento incomparável." - }, - "defeat": { - 1: `Um vento fresco sopra em meu coração... - $Que esforço extraordinário!` - } - }, - "kieran": { - "encounter": { - 1: `Através do trabalho duro, eu me torno cada vez mais forte! - $Eu não perco.` - }, - "victory": { - 1: `Eu não acredito... - $Que batalha divertida e emocionante!` - }, - "defeat": { - 1: `Uau, que batalha! - $Hora de você treinar ainda mais.` - } - }, - "rival": { - "encounter": { - 1: `@c{smile}Eai, estava procurando você! Sabia que você estava ansioso para começar, mas esperava pelo menos um tchau… - $@c{smile_eclosed}Então você está realmente perseguindo seu sonho, hein?\n Quase não consigo acreditar. - $@c{serious_smile_fists}Já que estamos aqui, que tal uma batalha?\nAfinal, quero ter certeza de que você está pronto. - $@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 um novato? - $@c{smile}Talvez tenha sido um pouco de sorte, mas…\nQuem sabe você consiga chegar até o fim. - $Aliás, o professor me pediu para te dar esses itens. Eles parecem bem legais. - $@c{serious_smile_fists}Boa sorte lá fora!` - }, - }, - "rival_female": { - "encounter": { - 1: `@c{smile_wave}Aí está você! Procurei você em todo lugar!\n@c{angry_mopen}Esqueceu de se despedir da sua melhor amiga? - $@c{smile_ehalf}Você está indo atrás do seu sonho, né?\nEsse dia realmente chegou, não é… - $@c{smile}Enfim, vou te perdoar por ter me esquecido, mas com uma condição. @c{smile_wave_wink}Você tem que lutar comigo! - $@c{angry_mopen}Dê o seu melhor! Não quer que sua aventura acabe antes de começar, né?` - }, - "victory": { - 1: `@c{shock}Você acabou de começar e já está tão forte?!@d{96}\n@c{angry}Você trapaceou, não foi? - $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile_eclosed}Eu perdi de forma justa… Tenho a sensação de que você vai se sair muito bem lá fora. - $@c{smile}Aliás, o professor pediu para eu te dar alguns itens. Espero que sejam úteis! - $@c{smile_wave}Dê o seu melhor, como sempre! Eu acredito em você!` - }, - }, - "rival_2": { - "encounter": { - 1: `@c{smile}Eai, você também está aqui?\n@c{smile_eclosed}Ainda com um recorde perfeito, hein…? - $@c{serious_mopen_fists}Sei que parece que eu te segui até aqui, mas isso não é totalmente verdade. - $@c{serious_smile_fists}Sinceramente, tenho estado ansioso por uma revanche desde que você me venceu em casa. - $Tenho treinado bastante, então vou dar uma luta difícil desta vez. - $@c{serious_mopen_fists}Não se segure, assim como antes!\nVamos lá!` - }, - "victory": { - 1: `@c{neutral_eclosed}Ah. Acho que fui confiante demais. - $@c{smile}Tudo bem, no entanto. Eu imaginei que isso poderia acontecer.\n@c{serious_mopen_fists}Isso só significa que preciso me esforçar mais para a próxima vez!\n - $@c{smile}Ah, não que você precise realmente de ajuda, mas eu tinha um extra desses itens e pensei que você poderia querer. - $@c{serious_smile_fists}Não espere outro depois deste!\nNão posso continuar dando vantagem ao meu oponente. - $@c{smile}Enfim, cuide-se!` - }, - }, - "rival_2_female": { - "encounter": { - 1: `@c{smile_wave}Oh, que surpresa te encontrar aqui. Parece que você ainda está invicto. @c{angry_mopen}Hum… Nada mal! - $@c{angry_mopen}Eu sei o que você está pensando, e não, eu não estava te espionando. @c{smile_eclosed}Acontece que eu estava na área. - $@c{smile_ehalf}Estou feliz por você, mas só quero te avisar que está tudo bem perder às vezes. - $@c{smile}Aprendemos com nossos erros, muitas vezes mais do que se continuássemos vencendo. - $@c{angry_mopen}De qualquer forma, tenho treinado duro para nossa revanche, então é melhor você dar o seu melhor!` - }, - "victory": { - 1: `@c{neutral}Eu… não era para eu perder dessa vez… - $@c{smile}Ah bem. Isso só significa que vou ter que treinar ainda mais para a próxima vez! - $@c{smile_wave}Também consegui mais um desses para você!\n@c{smile_wave_wink}Não precisa me agradecer~. - $@c{angry_mopen}Este é o último, hein! Você não vai ganhar mais nenhum presente de mim depois desse! - $@c{smile_wave}Continue assim!` - }, - "defeat": { - 1: "Está tudo bem perder às vezes…" - } - }, - "rival_3": { - "encounter": { - 1: `@c{smile}Eai, olha quem é! Faz um tempo.\n@c{neutral}Você… ainda está invicto? Hum. - $@c{neutral_eclosed}As coisas têm sido meio… estranhas.\nNão é a mesma coisa em casa sem você. - $@c{serious}Eu sei que é egoísta, mas preciso desabafar.\n@c{neutral_eclosed}Acho que você está se metendo em algo grande demais aqui. - $@c{serious}Nunca perder é irrealista.\nPrecisamos perder às vezes para crescer. - $@c{neutral_eclosed}Você teve uma grande jornada, mas ainda há muito pela frente, e só vai ficar mais difícil. @c{neutral}Você está preparado para isso? - $@c{serious_mopen_fists}Se sim, prove para mim.` - }, - "victory": { - 1: "@c{angry_mhalf}Isso é ridículo… Eu mal parei de treinar…\nComo ainda estamos tão distantes?" - }, - }, - "rival_3_female": { - "encounter": { - 1: `@c{smile_wave}Quanto tempo! Ainda não perdeu, né.\n@c{angry}Você está começando a me irritar. @c{smile_wave_wink}Brincadeirinha! - $@c{smile_ehalf}Mas sério, você não sente saudades de casa? Ou… de mim?\nEu… Eu quero dizer, sentimos muito a sua falta. - $@c{smile_eclosed}Eu apoio o seu sonho e tudo mais, mas a realidade é que você vai perder mais cedo ou mais tarde. - $@c{smile}E quando isso acontecer, estarei lá para você, como sempre.\n@c{angry_mopen}Agora, deixe-me mostrar o quão forte eu me tornei!` - }, - "victory": { - 1: "@c{shock}Depois de tudo isso… não foi o suficiente…?\nVocê nunca vai voltar a esse ritmo…" - }, - "defeat": { - 1: "Você deu o seu melhor, agora vamos para casa." - } - }, - "rival_4": { - "encounter": { - 1: `@c{neutral}Oi. - $Não vou enrolar com você.\n@c{neutral_eclosed}Estou aqui para vencer, simples assim. - $@c{serious_mhalf_fists}Aprendi a maximizar meu potencial dedicando todo o meu tempo ao treino. - $@c{smile}Você ganha muito tempo extra quando corta o sono e a interação social desnecessários. - $@c{serious_mopen_fists}Nada disso importa mais, não até eu vencer. - $@c{neutral_eclosed}Cheguei ao ponto de não perder mais.\n@c{smile_eclosed}Acho que sua filosofia não estava tão errada afinal. - $@c{angry_mhalf}Perder é para os fracos, e eu não sou mais fraco. - $@c{serious_mopen_fists}Prepare-se.` - }, - "victory": { - 1: "@c{neutral}O que…@d{64} O que você é?" - }, - }, - "rival_4_female": { - "encounter": { - 1: `@c{neutral}Sou eu! Você não esqueceu de mim de novo… esqueceu? - $@c{smile}Você deveria se orgulhar de até onde chegou. Parabéns!\nMas parece que é o fim da sua jornada. - $@c{smile_eclosed}Você despertou algo em mim que eu nunca soube que existia.\nParece que agora tudo o que faço é treinar. - $@c{smile_ehalf}Eu mal como ou durmo agora, só treino meus Pokémon o dia todo, ficando mais forte a cada vez. - $@c{neutral}Na verdade, eu… mal me reconheço. - $E agora, finalmente atingi o desempenho máximo.\nNão acho que alguém poderia me vencer agora. - $E sabe de uma coisa? É tudo por sua causa.\n@c{smile_ehalf}Eu não sei se te agradeço ou te odeio. - $@c{angry_mopen}Prepare-se.` - }, - "victory": { - 1: "@c{neutral}O que…@d{64} O que você é?" - }, - "defeat": { - 1: "$@c{smile}Você deveria se orgulhar de até onde chegou." - } - }, - "rival_5": { - "encounter": { - 1: "@c{neutral}…" - }, - "victory": { - 1: "@c{neutral}…" - }, - }, - "rival_5_female": { - "encounter": { - 1: "@c{neutral}…" - }, - "victory": { - 1: "@c{neutral}…" - }, - "defeat": { - 1: "$@c{smile_ehalf}…" - } - }, - "rival_6": { - "encounter": { - 1: `@c{smile_eclosed}Nos encontramos de novo. - $@c{neutral}Tive um tempo para refletir sobre tudo isso.\nHá uma razão para tudo isso parecer tão estranho. - $@c{neutral_eclosed}Seu sonho, minha vontade de te vencer…\nTudo faz parte de algo maior. - $@c{serious}Isso não é sobre mim, nem sobre você… É sobre o mundo, @c{serious_mhalf_fists}e é meu propósito te levar ao limite. - $@c{neutral_eclosed}Se cumpri esse propósito, não posso dizer, mas fiz tudo ao meu alcance. - $@c{neutral}Este lugar em que acabamos é assustador… Mas de alguma forma me sinto indiferente, como se já tivesse estado aqui antes. - $@c{serious_mhalf_fists}Você sente o mesmo, não sente? - $@c{serious}…é como se algo aqui estivesse falando comigo.\nIsso é tudo o que o mundo conhece há muito tempo. - $Aqueles momentos que apreciamos juntos que parecem tão recentes não passam de uma memória distante. - $@c{neutral_eclosed}Quem pode dizer se eles foram realmente reais em primeiro lugar. - $@c{serious_mopen_fists}Você precisa continuar empurrando, porque se não o fizer, isso nunca vai acabar. Você é o único que pode fazer isso. - $@c{serious_smile_fists}Eu mal sei o que tudo isso significa, só sei que é verdade. - $@c{serious_mopen_fists}Se você não pode me derrotar aqui e agora, você não terá chance.` - }, - "victory": { - 1: `@c{smile_eclosed}Parece que meu trabalho aqui está feito. - $Quero que você me prometa uma coisa.\n@c{smile}Depois que curar o mundo, por favor, volte para casa.` - }, - }, - "rival_6_female": { - "encounter": { - 1: `@c{smile_ehalf}Então somos só nós de novo. - $@c{smile_eclosed}Sabe, continuo pensando nisso… - $@c{smile_ehalf}Há algo nisso tudo, por que tudo parece tão estranho agora… - $@c{smile}Você tem seu sonho, e eu tenho essa ambição em mim… - $Não consigo evitar sentir que há um propósito maior em tudo isso, no que estamos fazendo, você e eu. - $@c{smile_eclosed}Acho que devo te levar ao limite. - $@c{smile_ehalf}Não tenho certeza se estou fazendo um bom trabalho nisso, mas tentei meu melhor até agora. - $Há algo neste lugar estranho e terrível… Tudo parece tão claro… - $Isso… é tudo o que o mundo conhece há muito tempo. - $@c{smile_eclosed}É como se eu mal pudesse lembrar das memórias que apreciamos juntos. - $@c{smile_ehalf}Elas foram reais? Elas parecem tão distantes agora… - $@c{angry_mopen}Você precisa continuar empurrando, porque se não o fizer, isso nunca vai acabar. Você é o único que pode fazer isso. - $@c{smile_ehalf}Eu… não sei o que tudo isso significa… mas sinto que é verdade. - $@c{neutral}Se você não pode me derrotar aqui e agora, você não terá chance.` - }, - "victory": { - 1: `@c{smile_ehalf}Eu… acho que cumpri meu propósito… - $@c{smile_eclosed}Prometa-me… Depois que curar o mundo… Por favor… volte para casa. - $@c{smile_ehalf}…Obrigada.` - }, - }, -}; - - -// Diálogo dos NPCs no jogo quando o personagem do jogador é feminino. Para idiomas que não possuem pronomes de gênero, isso pode ser definido como PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = { - "youngster": { - "encounter": { - 1: "Eai, quer batalhar?", - 2: "Você também é uma treinadora nova?", - 3: "Eai, nunca te vi antes. Vamos batalhar!", - 4: "Acabei de perder, então estou tentando encontrar mais Pokémon.\nEspera! Você parece fraca! Vamos batalhar!", - 5: "A gente já se conheceu antes? Não lembro muito bem. Enfim, prazer te conhecer!", - 6: "Beleza! Vamos nessa!", - 7: "Beleza! Lá vou eu! Vou te mostrar meu poder!", - 8: "Hahaha... Vou te mostrar o quão incríveis são meus Pokémon!", - 9: "Sem perder tempo com cumprimentos. Vamos logo, quando estiver pronta!", - 10: "Não baixe a guarda, ou você pode acabar chorando quando uma criança te vencer.", - 11: "Eu criei meus Pokémon com muito cuidado. Você não tem permissão para machucá-los!", - 12: "Que bom que você chegou! Não vai ser fácil daqui pra frente.", - 13: "As batalhas continuam para sempre! Bem-vinda ao mundo sem fim!" - }, - "victory": { - 1: "Uau! Você é forte!", - 2: "Eu não tive chance, né?", - 3: "Vou te encontrar de novo quando for mais velho e te vencer!", - 4: "Ugh. Não tenho mais Pokémon.", - 5: "Não acredito… NÃO ACREDITO! Como pude de novo…", - 6: "Não! Eu perdi!", - 7: "Uau! Você é incrível! Estou surpreso!", - 8: "Pode ser… Como… Eu e meus Pokémon somos os mais fortes, porém…", - 9: "Não vou perder da próxima vez! Vamos batalhar de novo algum dia!", - 10: "Aff! Não vê que sou apenas uma criança? Não foi justo você ir com tudo!", - 11: "Seus Pokémon são incríveis! Troca comigo!", - 12: "Me empolguei um pouco antes, mas sobre qual trabalho eu estava falando?", - 13: "Ahaha! É isso aí! Você já está em casa nesse mundo!" - } - }, - "lass": { - "encounter": { - 1: "Vamos batalhar, pode ser?", - 2: "Você parece uma treinadora nova. Vamos batalhar!", - 3: "Não te reconheço. Que tal uma batalha?", - 4: "Vamos ter uma batalha Pokémon divertida!", - 5: "Vou te mostrar como realmente usar Pokémon!", - 6: "Uma batalha séria começa com um começo sério! Tem certeza que está pronta?", - 7: "Você só é jovem uma vez. E só tem uma chance em cada batalha. Logo, você será apenas uma memória.", - 8: "Vai com calma comigo, tá? Mas vou lutar sério!", - 9: "A escola é chata. Não tenho nada para fazer. Só estou batalhando para passar o tempo." - }, - "victory": { - 1: "Isso foi impressionante! Tenho muito a aprender.", - 2: "Não pensei que você me venceria tão fácil…", - 3: "Espero que possamos ter uma revanche um dia.", - 4: "Isso foi incrivelmente divertido! Você me esgotou totalmente…", - 5: "Você realmente me ensinou uma lição! Você é incrível!", - 6: "Sério, eu perdi. Isso é, tipo, seriamente deprimente, mas você foi seriamente legal.", - 7: "Não preciso de memórias como essa. Deletando memória…", - 8: "Ei! Eu te disse para pegar leve comigo! Mesmo assim, você é legal quando fica séria.", - 9: "Estou realmente cansando de batalhar… Deve haver algo novo para fazer…" - } - }, - "breeder": { - "encounter": { - 1: "Pokémon obedientes, Pokémon egoístas… Pokémon têm características únicas.", - 2: "Embora minha criação e comportamento sejam ruins, criei meus Pokémon bem.", - 3: "Hmm, você disciplina seus Pokémon? Mimar demais não é bom." - }, - "victory": { - 1: "É importante nutrir e treinar as características de cada Pokémon.", - 2: "Ao contrário do meu lado diabólico, esses são bons Pokémon.", - 3: "Muito elogio pode estragar tanto Pokémon quanto pessoas." - }, - "defeat": { - 1: "Você não deve ficar com raiva dos seus Pokémon, mesmo se perder uma batalha.", - 2: "Certo? Pokémon bons, né? Eu sou adequado para criar coisas.", - 3: "Não importa o quanto você ame seus Pokémon, ainda precisa discipliná-los quando se comportam mal." - } - }, - "breeder_female": { - "encounter": { - 1: "Pokémon nunca te traem. Eles retribuem todo o amor que você dá a eles.", - 2: "Quer uma dica para treinar bons Pokémon?", - 3: "Eu criei esses Pokémon muito especiais usando um método especial." - }, - "victory": { - 1: "Ugh… Não era para ser assim. Será que administrei a mistura errada?", - 2: "Como isso aconteceu com meus Pokémon… O que você está dando de comer aos seus Pokémon?", - 3: "Se eu perder, isso significa que eu estava só matando o tempo. Não machuca meu ego nem um pouco." - }, - "defeat": { - 1: "Isso prova que meus Pokémon aceitaram meu amor.", - 2: "O verdadeiro truque para treinar bons Pokémon é capturar bons Pokémon.", - 3: "Pokémon serão fortes ou fracos dependendo de como você os cria." - } - }, - "fisherman": { - "encounter": { - 1: "Anem! Você me fez perder uma fisgada!\nO que vai fazer sobre isso?", - 2: "Sai daqui! Você está assustando os Pokémon!", - 3: "Vamos ver se você consegue fisgar uma vitória!", - }, - "victory": { - 1: "Esqueça isso.", - 2: "Da próxima vez, eu vou pescar a vitória!", - 3: "Acho que subestimei a força das correntes dessa vez.", - }, - }, - "fisherman_female": { - "encounter": { - 1: "Uau! Peguei um grande!", - 2: "Linha lançada, pronta para pescar o sucesso!", - 3: "Pronta para fazer ondas!" - }, - "victory": { - 1: "Vou voltar com um anzol mais forte.", - 2: "Vou pescar a vitória na próxima vez.", - 3: "Estou só afiando meus anzóis para a revanche!" - }, - }, - "swimmer": { - "encounter": { - 1: "Hora de mergulhar!", - 2: "Vamos surfar nas ondas da vitória!", - 3: "Pronto para fazer um splash!", - }, - "victory": { - 1: "Molhado na derrota!", - 2: "Uma onda de derrota!", - 3: "De volta à praia, eu acho.", - }, - }, - "backpacker": { - "encounter": { - 1: "Prepare-se, vamos começar!", - 2: "Vamos ver se você consegue acompanhar!", - 3: "Prepare-se, desafiante!", - 4: "Passei 20 anos tentando me encontrar… Mas onde estou?" - }, - "victory": { - 1: "Dessa vez tropecei!", - 2: "Ah, acho que estou perdido.", - 3: "Caminho sem saída!", - 4: "Espere um segundo! Ei! Você não sabe quem eu sou?" - }, - }, - "ace_trainer": { - "encounter": { - 1: "Você parece bastante confiante.", - 2: "Seus Pokémon… Mostre-os para mim…", - 3: "Como sou um Treinador Ás, as pessoas acham que sou forte.", - 4: "Você sabe o que é preciso para ser um Treinador Ás?" - }, - "victory": { - 1: "Sim… Você tem bons Pokémon…", - 2: "O quê?! Mas sou um gênio das batalhas!", - 3: "Claro, você é a personagem principal!", - 4: "OK! OK! Você poderia ser uma Treinador Ás!" - }, - "defeat": { - 1: "Estou dedicando corpo e alma às batalhas de Pokémon!", - 2: "Tudo dentro das minhas expectativas… Nada para se surpreender…", - 3: "Eu achava que cresceria para ser uma pessoa frágil que parecia que quebraria se você apertasse muito.", - 4: "Claro que sou forte e não perco. É importante ganhar com graça." - } - }, - "parasol_lady": { - "encounter": { - 1: "Hora de embelezar o campo de batalha com elegância e postura!", - }, - "victory": { - 1: "Minha elegância permanece inabalável!", - } - }, - "twins": { - "encounter": { - 1: "Prepare-se, porque quando nos unimos, é o dobro do problema!", - 2: "Dois corações, uma estratégia – vamos ver se você consegue acompanhar nosso poder de gêmeos!", - 3: "Espero que esteja pronta para o dobro do problema, porque estamos prestes a causar!" - }, - "victory": { - 1: "Podemos ter perdido essa rodada, mas nosso vínculo permanece inquebrável!", - 2: "Nosso espírito de gêmeos não será apagado por muito tempo.", - 3: "Voltaremos mais fortes como uma dupla dinâmica!" - }, - "defeat": { - 1: "O poder dos gêmeos reina supremo!", - 2: "Dois corações, um triunfo!", - 3: "Dobro de sorrisos, dobro da dança da vitória!" - } - }, - "cyclist": { - "encounter": { - 1: "Prepare-se para comer poeira!", - 2: "Prepare-se, desafiante! Estou prestes a te deixar para trás!", - 3: "Pé no pedal, vamos ver se você consegue acompanhar!" - }, - "victory": { - 1: "As rodas podem estar paradas, mas a determinação continua a pedalar.", - 2: "Fui mais rápido!", - 3: "O caminho para a vitória tem muitas curvas e voltas para explorar." - }, - }, - "black_belt": { - "encounter": { - 1: "Elogio sua coragem ao me desafiar! Pois eu sou o que tem o chute mais forte!", - 2: "Oh, entendo. Você gostaria de ser cortada em pedaços? Ou prefere o papel de saco de pancadas?" - }, - "victory": { - 1: "Oh. Os Pokémon fizeram a luta. Meu chute forte não ajudou em nada.", - 2: "Hmmm… Se eu ia perder de qualquer maneira, esperava ficar totalmente destruído no processo." - }, - }, - "battle_girl": { - "encounter": { - 1: "Você não precisa tentar me impressionar. Você pode perder contra mim.", - }, - "victory": { - 1: "É difícil dizer adeus, mas estamos ficando sem tempo…", - }, - }, - "hiker": { - "encounter": { - 1: "Minha barriga de meia-idade me deu tanta gravidade quanto as montanhas que eu escalo!", - 2: "Herdei esse corpo ossudo dos meus pais… Sou como uma cadeia de montanhas viva…", - }, - "victory": { - 1: "Pelo menos não posso perder quando se trata de IMC!", - 2: "Não é suficiente… Nunca é suficiente. Meu colesterol ruim não está alto o suficiente…" - }, - }, - "ranger": { - "encounter": { - 1: "Quando estou cercado pela natureza, a maioria das outras coisas deixa de importar.", - 2: "Quando estou vivendo sem natureza na minha vida, às vezes sinto uma crise de ansiedade se aproximando." - }, - "victory": { - 1: "Não importa para a vastidão da natureza se eu ganhar ou perder…", - 2: "Algo assim é bastante trivial comparado aos sentimentos sufocantes da vida na cidade." - }, - "defeat": { - 1: "Ganhei a batalha. Mas a vitória não é nada comparada à vastidão da natureza…", - 2: "Tenho certeza de que como você se sente não é tão ruim se comparar aos meus ataques de ansiedade…" - } - }, - "scientist": { - "encounter": { - 1: "Minha pesquisa levará este mundo à paz e alegria.", - }, - "victory": { - 1: "Sou um gênio… Não devo perder para alguém como você…", - }, - }, - "school_kid": { - "encounter": { - 1: "Heehee. Estou confiante nos meus cálculos e análises.", - 2: "Estou ganhando o máximo de experiência que posso porque quero ser um Líder de Ginásio um dia." - }, - "victory": { - 1: "Aff… Cálculo e análise talvez não sejam páreo para o acaso…", - 2: "Até experiências difíceis e desafiadoras têm seu propósito, eu acho." - } - }, - "artist": { - "encounter": { - 1: "Eu costumava ser popular, mas agora estou acabado.", - }, - "victory": { - 1: "À medida que os tempos mudam, os valores também mudam. Percebi isso tarde demais.", - }, - }, - "guitarist": { - "encounter": { - 1: "Prepare-se para sentir o ritmo da derrota enquanto eu toco minha vitória!", - }, - "victory": { - 1: "Silenciado por agora, mas minha melodia de resiliência continuará a tocar.", - }, - }, - "worker": { - "encounter": { - 1: "Me incomoda que as pessoas sempre me entendam mal. Sou muito mais puro do que todos pensam.", - }, - "victory": { - 1: "Eu realmente não quero que minha pele queime, então quero ficar na sombra enquanto trabalho.", - }, - }, - "worker_female": { - "encounter": { - 1: `Me incomoda que as pessoas sempre me entendam mal. - $Sou muito mais pura do que todos pensam.` - }, - "victory": { - 1: "Eu realmente não quero que minha pele queime, então quero ficar na sombra enquanto trabalho." - }, - "defeat": { - 1: "Meu corpo e mente nem sempre estão necessariamente em sincronia." - } - }, - "worker_double": { - "encounter": { - 1: "Vou te mostrar que podemos te quebrar. Estamos treinando no campo!", - }, - "victory": { - 1: "Que estranho… Como isso pode ser… Não deveria ter sido superado.", - }, - }, - "hex_maniac": { - "encounter": { - 1: "Normalmente, só escuto música clássica, mas se eu perder, acho que vou tentar um pouco de new age!", - 2: "Eu fico mais forte a cada lágrima que derramo." - }, - "victory": { - 1: "É o início da era de Aquário?", - 2: "Agora posso ficar ainda mais forte. Cresço com cada rancor." - }, - "defeat": { - 1: "New age se refere simplesmente aos compositores clássicos do século XX, certo?", - 2: "Não fique preso na tristeza ou frustração. Você pode usar seus rancores para se motivar." - } - }, - "psychic": { - "encounter": { - 1: "Oi! Concentre-se!", - }, - "victory": { - 1: "Perdi minha concentração!", - }, - }, - "officer": { - "encounter": { - 1: "Prepare-se, porque a justiça está prestes a ser servida!", - 2: "Pronto para defender a lei e servir a justiça no campo de batalha!" - }, - "victory": { - 1: "O peso da justiça parece mais pesado do que nunca…", - 2: "As sombras da derrota pairam no distrito." - } - }, - "beauty": { - "encounter": { - 1: "Minha última batalha… É assim que eu gostaria que víssemos esta partida…", - }, - "victory": { - 1: "Foi divertido… Vamos ter outra última batalha algum dia…", - }, - }, - "baker": { - "encounter": { - 1: "Espero que esteja pronta para saborear a derrota!" - }, - "victory": { - 1: "Vou assar uma revanche." - }, - }, - "biker": { - "encounter": { - 1: "Hora de acelerar e te deixar na poeira!" - }, - "victory": { - 1: "Vou me ajustar para a próxima corrida." - }, - }, - "firebreather": { - "encounter": { - 1: "Minhas chamas irão te consumir!", - 2: "Minha alma está pegando fogo. Irei te mostrar como queima!", - 3: "Cola aqui e dá uma olhada!" - }, - "victory": { - 1: "Fui reduzido a cinzas…", - 2: "Uau! Isso foi quente!", - 3: "Ai! Queimei minha língua!" - }, - }, - "sailor": { - "encounter": { - 1: "Mano, você vai andar na prancha se perder!", - 2: "Vem com tudo! Sou um marinheiro com orgulho!", - 3: "Ahoy marujo! Tá enjoado, é?!" - }, - "victory": { - 1: "Argh! Perdi pra uma criança!", - 2: "Sua vontade de ganhar me afogou!", - 3: "Estou achando que quem tá enjoado sou eu..." - }, - }, - "brock": { - "encounter": { - 1: "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!", - 2: "Minha vontade firme como pedra vai te sobrecarregar!", - 3: "Permita-me mostrar a verdadeira força dos meus Pokémon!" - }, - "victory": { - 1: "A força dos seus Pokémon superou minhas defesas de pedra!", - 2: "O mundo é enorme! Estou feliz por ter tido a chance de batalhar com você.", - 3: "Talvez eu deva voltar a perseguir meu sonho de ser Criador de Pokémon…" - }, - "defeat": { - 1: "A melhor defesa é um bom ataque!\nEssa é a minha maneira de fazer as coisas!", - 2: "Venha estudar rochas comigo da próxima vez para aprender melhor a combatê-las!", - 3: "Hah, todas as minhas viagens pelas regiões estão valendo a pena!" - } - }, - "misty": { - "encounter": { - 1: "Minha política é um ataque total com Pokémon do tipo Água!", - 2: "Oi, vou mostrar a força dos meus Pokémon aquáticos!", - 3: "Meu sonho era viajar e batalhar com treinadores poderosos…\nVocê será um desafio suficiente?" - }, - "victory": { - 1: "Você realmente é forte… Vou admitir que você é habilidosa…", - 2: "Hmm… Você sabe que só teve sorte, certo?!", - 3: "Uau, você é demais! Não acredito que me venceu!" - }, - "defeat": { - 1: "A poderosa Misty foi demais para você?", - 2: "Espero que você tenha visto as técnicas de natação elegantes dos meus Pokémon!", - 3: "Seus Pokémon não foram páreo para meus orgulhos e alegrias!" - } - }, - "lt_surge": { - "encounter": { - 1: "Meus Pokémon Elétricos me salvaram durante a guerra! Vou te mostrar como!", - 2: "Em sentido! Vou te chocar até você se render!", - 3: "Vou te eletrizar como faço com todos os meus inimigos na batalha!" - }, - "victory": { - 1: "Whoa! Seu time é de verdade, garota!", - 2: "Uau, você é forte! Até meus truques elétricos perderam para você.", - 3: "Isso foi uma derrota absolutamente chocante!" - }, - "defeat": { - 1: "Oh sim! Quando se trata de Pokémon do tipo Elétrico, sou o número um do mundo!", - 2: "Hahaha! Foi uma batalha eletrizante, garota!", - 3: "Uma batalha de Pokémon é guerra, e eu te mostrei combate em primeira mão!" - } - }, - "erika": { - "encounter": { - 1: "Ah, o tempo está adorável aqui…\nOh, uma batalha? Muito bem então.", - 2: "Minhas habilidades de batalha Pokémon rivalizam com minhas habilidades de arranjo de flores.", - 3: "Oh, espero que o aroma agradável dos meus Pokémon não me faça dormir de novo…", - 4: "Ver flores em um jardim é tão calmante." - }, - "victory": { - 1: "Oh! Eu concedo a derrota.", - 2: "Aquela partida foi muito agradável.", - 3: "Ah, parece que perdi…", - 4: "Oh, meu Deus." - }, - "defeat": { - 1: "Tinha medo de adormecer…", - 2: "Oh, meu Deus, parece que meus Pokémon de Grama te dominaram.", - 3: "Essa batalha foi uma experiência tão calmante.", - 4: "Oh… É só isso?" - } - }, - "janine": { - "encounter": { - 1: "Estou dominando a arte dos ataques venenosos.\nVou lutar com você hoje!", - 2: "Meu pai confia que posso me defender.\nVou provar que ele está certo!", - 3: "Minhas técnicas de ninja só perdem para as do meu pai!\nVocê consegue acompanhar?" - }, - "victory": { - 1: "Ainda preciso de treinamento… Entendi.", - 2: "Sua técnica de batalha superou a minha.", - 3: "Vou me aplicar de verdade e melhorar minhas habilidades." - }, - "defeat": { - 1: "Hehe… o veneno drenou todas as suas forças para lutar.", - 2: "Ha! Você não teve chance contra minhas habilidades superiores de ninja!", - 3: "A fé do meu pai em mim não foi mal colocada." - } - }, - "sabrina": { - "encounter": { - 1: "Através da minha habilidade psíquica, tive uma visão da sua chegada!", - 2: "Não gosto de lutar, mas se você quiser, vou mostrar meus poderes!", - 3: "Posso sentir grande ambição em você. Vou ver se não é infundada." - }, - "victory": { - 1: "Seu poder… Ele supera o que eu previa…", - 2: "Não consegui prever seu poder com precisão.", - 3: "Mesmo com meus imensos poderes psíquicos, não consigo sentir outro tão forte quanto você." - }, - "defeat": { - 1: "Essa vitória… É exatamente como previ nas minhas visões!", - 2: "Talvez fosse outra pessoa que eu sentisse um grande desejo…", - 3: "Aprimore suas habilidades antes de entrar em batalha precipitadamente.\nVocê nunca sabe o que o futuro pode reservar se fizer isso…" - } - }, - "blaine": { - "encounter": { - 1: "Hah! Espero que tenha trazido uma Cura de Queimadura!", - 2: "Meus Pokémon de Fogo vão incinerar todos os desafiantes!", - 3: "Prepare-se para brincar com fogo!" - }, - "victory": { - 1: "Queimei até não restar nada! Nem cinzas sobraram!", - 2: "Não acendi as chamas alto o suficiente?", - 3: "Estou completamente exausto… Mas isso faz minha motivação para melhorar queimar ainda mais!" - }, - "defeat": { - 1: "Meu inferno ardente não pode ser apagado!", - 2: "Meus Pokémon foram fortalecidos com o calor desta vitória!", - 3: "Hah! Minha paixão queima mais do que a sua!" - } - }, - "giovanni": { - "encounter": { - 1: "Eu, o líder da Equipe Rocket, vou te fazer sentir um mundo de dor!", - 2: "Meu treinamento aqui será vital antes de enfrentar meus antigos associados novamente.", - 3: "Não acho que você está preparada para o nível de fracasso que está prestes a experimentar!" - }, - "victory": { - 1: "O QUE! Eu, perder?! Não tenho nada a dizer a você!", - 2: "Hmm… Você nunca entenderia o que quero alcançar.", - 3: "Esta derrota está apenas adiando o inevitável.\nVou ressurgir a Equipe Rocket das cinzas a tempo." - }, - "defeat": { - 1: "Não ser capaz de medir sua própria força mostra que você ainda é apenas uma criança.", - 2: "Não tente interferir comigo novamente.", - 3: "Espero que entenda o quão tolo foi me desafiar." - } - }, - "roxanne": { - "encounter": { - 1: "Você poderia gentilmente demonstrar como batalha?", - 2: "Você pode aprender muitas coisas batalhando com muitos treinadores.", - 3: "Oh, você me pegou estrategizando.\nGostaria de batalhar?" - }, - "victory": { - 1: "Oh, parece que perdi.\nEu entendo.", - 2: "Parece que ainda tenho muito mais a aprender quando se trata de batalhas.", - 3: "Vou levar o que aprendi aqui hoje a sério." - }, - "defeat": { - 1: "Aprendi muitas coisas com nossa batalha.\nEspero que você também tenha aprendido.", - 2: "Espero batalhar com você novamente.\nEspero que use o que aprendeu aqui.", - 3: "Venci devido a tudo o que aprendi." - } - }, - "brawly": { - "encounter": { - 1: "Oh cara, uma desafiante!\nVamos ver o que você pode fazer!", - 2: "Você parece uma grande onda.\nVamos batalhar!", - 3: "Hora de criar uma tempestade!\nVamos!" - }, - "victory": { - 1: "Uau, você me derrotou!", - 2: "Você surfou minha onda e me derrubou!", - 3: "Sinto-me perdido na Caverna Granito!" - }, - "defeat": { - 1: "Haha, eu surfei a grande onda!\nDesafie-me novamente algum dia.", - 2: "Surfe comigo novamente algum dia!", - 3: "Assim como as marés vão e vêm, espero que você volte para me desafiar novamente." - } - }, - "wattson": { - "encounter": { - 1: "Hora de levar um choque!\nWahahahaha!", - 2: "Vou fazer faíscas voarem!\nWahahahaha!", - 3: "Espero que tenha trazido Cura de Paralisia!\nWahahahaha!" - }, - "victory": { - 1: "Parece que estou sem carga!\nWahahahaha!", - 2: "Você me aterrissou completamente!\nWahahahaha!", - 3: "Obrigado pela emoção!\nWahahahaha!" - }, - "defeat": { - 1: "Você está totalmente carregado agora!\nWahahahaha!", - 2: "Espero ver você faíscando em batalhas futuras!\nWahahahaha!", - 3: "Wahahahaha! Que batalha eletrizante!" - } - }, - "flannery": { - "encounter": { - 1: "Meus Pokémon de fogo estão prontos para queimar a concorrência!\nVamos nessa!", - 2: "Prepare-se para sentir o calor da minha determinação!\nNão vou segurar nada!", - 3: "Minhas habilidades vão incinerar você!\nPrepare-se para a batalha mais quente da sua vida!" - }, - "victory": { - 1: "Essa derrota só faz minha determinação queimar mais!", - 2: "Essa perda não apagará minhas chamas!\nEstarei de volta mais forte!", - 3: "Vou usar essa experiência para reacender meu espírito competitivo!" - }, - "defeat": { - 1: "Minhas chamas nunca se apagarão!\nSou muito apaixonada por isso!", - 2: "Você foi incrível!\nVamos fazer isso de novo algum dia!", - 3: "Que batalha ardente!\nMal posso esperar pela próxima!" - } - }, - "norman": { - "encounter": { - 1: "Você está pronta para enfrentar a força pura do meu time?\nVou te mostrar o poder do equilíbrio!", - 2: "Minha experiência em batalha vai fazer você suar!\nPrepare-se!", - 3: "Treinei meu time rigorosamente.\nVamos ver se você consegue igualar!" - }, - "victory": { - 1: "Parece que subestimei você.\nFoi uma batalha dura.", - 2: "Você é forte, mas ainda há muito para aprender.", - 3: "Essa derrota não abalará minha determinação.\nEstarei de volta mais forte!" - }, - "defeat": { - 1: "Você lutou bravamente!\nEspero batalhar com você novamente.", - 2: "Sua força é incrível!\nNão posso esperar pela nossa próxima batalha.", - 3: "Foi uma honra batalhar com você!\nAté a próxima!" - } - }, - "winona": { - "encounter": { - 1: "Tenho sobrevoado os céus em busca de presas...\nE você é meu alvo!", - 2: "Não importa como será nossa batalha, meus Pokémon Voadores e eu triunfaremos com graça. Vamos batalhar!", - 3: "Espero que você não tenha medo de altura.\nVamos subir!" - }, - "victory": { - 1: "Você é a primeira Treinadora que vejo com mais graça do que eu.\nJogou excelentemente.", - 2: "Oh, meus Pokémon Voadores despencaram!\nMuito bem.", - 3: "Embora eu tenha caído, meus Pokémon continuarão a voar!" - }, - "defeat": { - 1: "Meus Pokémon Voadores e eu sempre dançaremos com elegância!", - 2: "Espero que tenha gostado do nosso show.\nNossa dança graciosa terminou.", - 3: "Você não quer ver nossa coreografia elegante novamente?" - } - }, - "tate": { - "encounter": { - 1: "Hehehe... Ficou surpreso de me ver sem minha irmã?", - 2: "Posso ver o que você está pensando...\nVocê quer batalhar!", - 3: "Como você pode derrotar alguém...\nQue sabe todos os seus movimentos?" - }, - "victory": { - 1: "Não pode ser ajudado...\nSinto falta da Liza...", - 2: "Seu vínculo com seus Pokémon era mais forte que o meu.", - 3: "Se eu estivesse com Liza, teríamos vencido.\nConseguimos completar os pensamentos um do outro!" - }, - "defeat": { - 1: "Meus Pokémon e eu somos superiores!", - 2: "Se você não consegue nem me derrotar, nunca será capaz de derrotar Liza também.", - 3: "Tudo graças ao meu treinamento rigoroso com Liza.\nPosso me tornar um com os Pokémon." - } - }, - "liza": { - "encounter": { - 1: "Fufufu... Ficou surpreso de me ver sem meu irmão?", - 2: "Posso determinar o que você deseja...\nVocê quer batalhar, não quer?", - 3: "Como você pode derrotar alguém...\nQue é um com seus Pokémon?" - }, - "victory": { - 1: "Não pode ser ajudado...\nSinto falta do Tate...", - 2: "Seu vínculo com seus Pokémon...\nÉ mais forte que o meu.", - 3: "Se eu estivesse com Tate, teríamos vencido.\nPodemos terminar as frases um do outro!" - }, - "defeat": { - 1: "Meus Pokémon e eu somos vitoriosos.", - 2: "Se você não consegue nem me derrotar, nunca será capaz de derrotar Tate também.", - 3: "Tudo graças ao meu treinamento rigoroso com Tate.\nPosso me sincronizar com meus Pokémon." - } - }, - "juan": { - "encounter": { - 1: "Agora não é hora de agir timidamente.\nVamos batalhar!", - 2: "Ahahaha, você será testemunha da minha arte com Pokémon de Água!", - 3: "Um tufão se aproxima!\nVocê será capaz de me testar?", - 4: "Por favor, você será testemunha da nossa arte.\nUma grande ilusão de água esculpida por meus Pokémon e por mim!" - }, - "victory": { - 1: "Você pode ser um gênio que pode enfrentar Wallace!", - 2: "Eu me concentrei na elegância enquanto você treinava.\nÉ natural que você me derrotasse.", - 3: "Ahahaha!\nMuito bem, você venceu desta vez.", - 4: "De você, sinto o brilho brilhante da habilidade que superará tudo." - }, - "defeat": { - 1: "Meus Pokémon e eu esculpimos uma ilusão de Água e saímos vitoriosos.", - 2: "Ahahaha, eu venci, e você perdeu.", - 3: "Posso emprestar meu traje? Pode te ajudar a batalhar!\nAhahaha, estou brincando!", - 4: "Eu sou o vencedor! O que quer dizer, você perdeu." - } - }, - "crasher_wake": { - "encounter": { - 1: "Crash! Crash! Cuidado!\nCrasher Wake… está… aqui!", - 2: "Crash! Crash! Crasher Wake!", - 3: "Sou a onda de poder que vai te lavar!" - }, - "victory": { - 1: "Isso coloca um sorriso no meu rosto!\nGuhahaha! Foi uma explosão!", - 2: "Hunwah! Acabou e terminou!\nComo vou dizer isso...\nQuero mais! Queria batalhar muito mais!", - 3: "O QUÊ?!" - }, - "defeat": { - 1: "Siiiiim! Isso mesmo!", - 2: "Eu venci, mas quero mais! Queria batalhar muito mais!", - 3: "Até logo!" - } - }, - "falkner": { - "encounter": { - 1: "Vou mostrar o verdadeiro poder dos magníficos Pokémon pássaros!", - 2: "Ventos, fiquem comigo!", - 3: "Pai! Espero que esteja vendo minha batalha de cima!" - }, - "victory": { - 1: "Eu entendo... Vou sair graciosamente.", - 2: "Uma derrota é uma derrota. Você é realmente forte.", - 3: "...Droga! Sim, eu perdi." - }, - "defeat": { - 1: "Pai! Venci com seus amados Pokémon pássaros...", - 2: "Pokémon pássaros são os melhores afinal!", - 3: "Sinto que estou alcançando meu pai!" - } - }, - "nessa": { - "encounter": { - 1: "Não importa que tipo de plano sua mente refinada possa estar tramando, meu parceiro e eu vamos afundá-la.", - 2: "Não estou aqui para conversar. Estou aqui para vencer!", - 3: "Este é um pequeno presente dos meus Pokémon... Espero que você possa recebê-la!" - }, - "victory": { - 1: "Você e seus Pokémon são demais...", - 2: "Como...? Como isso pode ser?!", - 3: "Fui totalmente arrastada!" - }, - "defeat": { - 1: "A onda furiosa ataca novamente!", - 2: "Hora de surfar na onda da vitória!", - 3: "Hehe!" - } - }, - "melony": { - "encounter": { - 1: "Não vou me segurar!", - 2: "Tudo bem, acho que devemos começar.", - 3: "Vou congelar você completamente!" - }, - "victory": { - 1: "Você... Você é muito boa, hein?", - 2: "Se você encontrar Gordie por aí, certifique-se de dar uma boa surra nele, ok?", - 3: "Acho que você levou a quebra de gelo um pouco literalmente demais..." - }, - "defeat": { - 1: "Agora você vê como as batalhas podem ser severas?", - 2: "Hee! Parece que ganhei de novo!", - 3: "Você está segurando?" - } - }, - "marlon": { - "encounter": { - 1: "Você parece forte! Vamos começar!", - 2: "Sou forte como a amplitude do oceano. Você vai ser varrido, com certeza.", - 3: "Oh ho, então estou enfrentando você! Isso é fora do comum." - }, - "victory": { - 1: "Você foi incrível! Está criando alguns Pokémon incríveis. Você dominou a coisa de Treinador!", - 2: "Você não apenas parece forte, você é forte de verdade! Eh, eu também fui varrido!", - 3: "Você é forte como uma onda impressionante!" - }, - "defeat": { - 1: "Você é forte, mas não é o suficiente para mudar o mar, ok!", - 2: "Hee! Parece que ganhei de novo!", - 3: "Doce, doce vitória!" - } - }, - "shauntal": { - "encounter": { - 1: "Com licença. Você é uma desafiante, certo?\nSou a usuária de Pokémon do tipo Fantasma da Elite dos Quatro, Shauntal, e serei sua oponente.", - 2: "Adoro escrever sobre Treinadores que vêm aqui e os Pokémon que treinam.\nPosso usar você e seus Pokémon como tema?", - 3: "Cada pessoa que trabalha com Pokémon tem uma história para contar.\nQue história está prestes a ser contada?" - }, - "victory": { - 1: "Uau. Estou sem palavras!", - 2: "D-desculpe! Primeiro, preciso me desculpar com meus Pokémon...\n\nLamento muito que você tenha tido uma experiência ruim por minha causa!", - 3: "Mesmo com isso, ainda sou uma da Elite dos Quatro!" - }, - "defeat": { - 1: "Hehe.", - 2: "Isso me deu um excelente material para meu próximo romance!", - 3: "E assim, outra história termina..." - } - }, - "marshal": { - "encounter": { - 1: "Meu mentor, Alder, vê seu potencial como Treinadora e está interessado em você.\nMeu objetivo é testá-lo—levar você aos limites da sua força. Kiai!", - 2: "Vitória, vitória decisiva, é meu objetivo! Desafiante, aqui vou eu!", - 3: "Em mim mesmo, procuro desenvolver a força de um lutador e eliminar qualquer fraqueza em mim!\nPrevalecendo com a força de minhas convicções!" - }, - "victory": { - 1: "Ufa! Bem feito!", - 2: "À medida que suas batalhas continuarem, mire em alturas ainda maiores!", - 3: "A força demonstrada por você e seus Pokémon me impressionou profundamente..." - }, - "defeat": { - 1: "Hmm.", - 2: "Isso foi uma boa batalha.", - 3: "Haaah! Haaah! Haiyaaaah!" - } - }, - "cheren": { - "encounter": { - 1: "Você me lembra um velho amigo. Isso me deixa animado para essa batalha Pokémon!", - 2: "As batalhas Pokémon não têm sentido se você não pensa por que você batalha.\nOu melhor, isso torna as batalhas junto com Pokémon sem sentido.", - 3: "Meu nome é Cheren! Sou um Líder de Ginásio e professor! Prazer em conhecê-la." - }, - "victory": { - 1: "Obrigado! Vi o que estava faltando em mim.", - 2: "Obrigado! Sinto que vi um pouco do caminho em direção aos meus ideais.", - 3: "Hmm... Isso é problemático." - }, - "defeat": { - 1: "Como Líder de Ginásio, meu objetivo é ser um obstáculo para você superar.", - 2: "Tudo bem!", - 3: "Cheguei onde estou porque os Pokémon estavam ao meu lado.\nTalvez precisemos pensar por que os Pokémon nos ajudam, não em termos de Pokémon e Treinadores, mas como uma relação entre seres vivos." - } - }, - "chili": { - "encounter": { - 1: "Ihuuu! Hora de brincar com FOGO!! Sou o mais forte dos nossos irmãos!", - 2: "Ta-da! O incendiário do tipo Fogo Chili—sou eu—será seu oponente!", - 3: "Vou mostrar o que eu e meus tipos de Fogo podemos fazer!" - }, - "victory": { - 1: "Você me pegou. Estou... queimado...", - 2: "Uau! Você está pegando fogo!", - 3: "Ai! Você me pegou!" - }, - "defeat": { - 1: "Estou pegando fogo! Jogue comigo, e você se queimará!", - 2: "Quando você brinca com fogo, você se queima!", - 3: "Quero dizer, vamos lá, seu oponente era eu! Você não tinha chance!" - } - }, - "cilan": { - "encounter": { - 1: "Nada pessoal... Sem ressentimentos... Eu e meus Pokémon do tipo Grama vamos...\nUm... Vamos batalhar, aconteça o que acontecer.", - 2: "Então, hum, se você está bem comigo, vou, hum, colocar tudo o que tenho em ser, er, você sabe, seu oponente.", - 3: "OK… Então, hum, eu sou o Cilan, gosto de Pokémon do tipo Grama." - }, - "victory": { - 1: "Er... Acabou agora?", - 2: "…Que surpresa. Você é muito forte, não é?\nAcho que meus irmãos também não teriam sido capazes de te derrotar...", - 3: "…Huh. Parece que meu timing estava, hum, errado?" - }, - "defeat": { - 1: "Huh? Ganhei?", - 2: "Acho...\nSuponho que ganhei, porque competi com meus irmãos Chili e Cress, e todos conseguimos ficar mais fortes.", - 3: "Foi... uma experiência bastante emocionante..." - } - }, - "roark": { - "encounter": { - 1: "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!", - 2: "Vamos lá! Estes são meus Pokémon de pedra, meu orgulho e alegria!", - 3: "Pokémon do tipo Pedra são simplesmente os melhores!", - 4: "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!" - }, - "victory": { - 1: "O-o que? Isso não pode ser! Meus Pokémon fortificados!", - 2: "...Perdemos o controle. Da próxima vez, gostaria de desafiá-la a uma corrida de escavação de fósseis no subsolo.", - 3: "Com habilidade como a sua, é natural que você vença.", - 4: "O-o que?! Não pode ser! Nem isso foi suficiente?", - 5: "Eu estraguei tudo." - }, - "defeat": { - 1: "Veja? Estou orgulhoso do meu estilo de batalha rochoso!", - 2: "Obrigado! A batalha me deu confiança de que talvez eu consiga vencer meu pai!", - 3: "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!" - } - }, - "morty": { - "encounter": { - 1: "Com um pouco mais, eu poderia ver um futuro em que encontro o Pokémon lendário.\nVocê vai me ajudar a alcançar esse nível!", - 2: "Dizem que um Pokémon com cores de arco-íris aparecerá diante de um Treinador verdadeiramente poderoso.\nAcreditei nessa história, então treinei secretamente aqui a vida toda. Como resultado, agora posso ver o que os outros não podem.\nVejo uma sombra da pessoa que fará o Pokémon aparecer.\nAcredito que essa pessoa sou eu! Você vai me ajudar a alcançar esse nível!", - 3: "Quer você escolha acreditar ou não, o poder místico existe.", - 4: "Você pode testemunhar os frutos do meu treinamento.", - 5: "Você deve fazer sua alma se tornar uma com a dos Pokémon. Você pode fazer isso?", - 6: "Diga, você quer fazer parte do meu treinamento?" - }, - "victory": { - 1: "Ainda não sou bom o suficiente...", - 2: "Eu vejo... Sua jornada o levou a lugares distantes e você testemunhou muito mais do que eu.\nEu invejo você por isso...", - 3: "Como isso é possível...", - 4: "Não acho que nossos potenciais sejam tão diferentes.\nMas você parece ter algo mais do que isso... Que seja.", - 5: "Acho que preciso de mais treinamento.", - 6: "Isso é uma pena." - }, - "defeat": { - 1: "Eu me movi... mais um passo adiante.", - 2: "Fufufu...", - 3: "O-o que?! Não pode ser! Nem isso foi suficiente?", - 4: "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!", - 5: "Ahahahah!", - 6: "Eu sabia que venceria!" - } - }, - "crispin": { - "encounter": { - 1: "Quero vencer, então é exatamente isso que vou fazer!", - 2: "Eu batalho porque quero batalhar! E sabe de uma coisa? É assim que deve ser!" - }, - "victory": { - 1: "Queria vencer... mas perdi!", - 2: "Eu perdi... porque não consegui vencer!" - }, - "defeat": { - 1: "Ei, espere um segundo. Eu acabei de vencer? Acho que acabei de vencer! Que satisfação!", - 2: "Uou! Isso foi incrível!" - } - }, - "amarys": { - "encounter": { - 1: "Quero ser a pessoa a ajudar alguém em particular. Sendo assim, não posso me dar ao luxo de perder.\n... Nossa batalha começa agora." - }, - "victory": { - 1: "Eu sou... não o suficiente, eu vejo." - }, - "defeat": { - 1: "A vitória pertence a mim. Bem lutado." - } - }, - "lacey": { - "encounter": { - 1: "Vou enfrentar você com meu time usual como membro da Elite dos Quatro." - }, - "victory": { - 1: "Foi uma excelente batalha. Estou ansiosa para o próximo desafio." - }, - "defeat": { - 1: "Fufufu... Nada mal.\nDesafiantes que derrotam a Elite dos Quatro são dignos de notar." - } - }, - "drayton": { - "encounter": { - 1: `Cara, eu amo cadeiras. Você não ama cadeiras? Que salva-vidas. - $Não entendo por que todo mundo não fica sentado o tempo todo. Ficar de pé é cansativo!`, - }, - "victory": { - 1: "Acho que deveria ter esperado por isso!" - }, - "defeat": { - 1: "Heh heh! Não ligue para mim, só pegando uma vitória aqui. Entendo se você estiver chateado, mas não vá dar uma de Kieran comigo, OK?" - } - }, - "ramos": { - "encounter": { - 1: `Você gostou do jardim de diversão que fiz com todas essas plantas resistentes minhas? - $A força delas é um sinal da minha força como jardineiro e Líder de Ginásio! Você tem certeza de que está pronta para enfrentar tudo isso?`, - }, - "victory": { - 1: "Você acredita nos seus Pokémon... E eles acreditam em você também... Foi uma boa batalha, broto." - }, - "defeat": { - 1: "Hohoho... De fato. Pequenas lâminas frágeis de grama conseguem quebrar até mesmo concreto." - } - }, - "viola": { - "encounter": { - 1: `Seja as lágrimas de frustração que seguem uma derrota ou o florescer da alegria que vem com a vitória… - $Ambos são ótimos temas para minha câmera! Fantástico! Isso vai ser simplesmente fantástico! - $Agora venha para cima de mim!`, - 2: "Minha lente está sempre focada na vitória – não vou deixar nada estragar esta foto!" - }, - "victory": { - 1: "Você e seus Pokémon me mostraram uma nova profundidade de campo! Fantástico! Simplesmente fantástico!", - 2: `O mundo que você vê através de uma lente, e o mundo que você vê com um Pokémon ao seu lado… - $O mesmo mundo pode parecer completamente diferente dependendo do seu ponto de vista.` - }, - "defeat": { - 1: "A foto do momento da minha vitória vai ser um verdadeiro sucesso!", - 2: "Sim! Tirei ótimas fotos!" - } - }, - "candice": { - "encounter": { - 1: `Você quer desafiar a Candice? Com certeza! Eu estava esperando por alguém forte! - $Mas devo te avisar, sou forte porque sei como focar.`, - 2: `Pokémon, moda, romance… É tudo uma questão de foco! - $Vou te mostrar exatamente o que quero dizer. Prepare-se para perder!` - }, - "victory": { - 1: "Devo dizer, estou aquecida para você! Posso até te admirar um pouco.", - 2: `Uau! Você é ótima! Ganhou meu respeito! - $Acho que seu foco e vontade nos derrubaram totalmente.` - }, - "defeat": { - 1: "Eu senti sua vontade de vencer, mas eu não perco!", - 2: "Viu? O foco da Candice! O foco dos meus Pokémon também é ótimo!" - } - }, - "gardenia": { - "encounter": { - 1: "Você tem uma aura vencedora. Então, de qualquer forma, isso vai ser divertido. Vamos ter nossa batalha!" - }, - "victory": { - 1: "Incrível! Você é muito boa, não é?" - }, - "defeat": { - 1: "Sim! Meus Pokémon e eu somos perfeitamente bons!" - } - }, - "aaron": { - "encounter": { - 1: "Ok! Deixe-me enfrentar você!" - }, - "victory": { - 1: "Batalhar é um assunto profundo e complexo..." - }, - "defeat": { - 1: "Vencer um membro da Elite dos Quatro não é fácil." - } - }, - "cress": { - "encounter": { - 1: "Isso mesmo! Serei eu e meus estimados tipos Água que você deve enfrentar na batalha!" - }, - "victory": { - 1: "Perder? Eu? Não acredito nisso." - }, - "defeat": { - 1: "Este é o resultado apropriado quando eu sou seu oponente." - } - }, - "allister": { - "encounter": { - 1: "'M Allister.\nA-aqui... vou eu..." - }, - "victory": { - 1: `Quase perdi minha máscara de tanto choque... Isso foi… - $Uau. Posso ver sua habilidade pelo que ela é.`, - }, - "defeat": { - 1: "I-isso foi incrível!" - } - }, - "clay": { - "encounter": { - 1: "Harrumph! Me deixou esperando, não foi, garota? Tudo bem, hora de ver o que você pode fazer!" - }, - "victory": { - 1: "Cara, como é bom dar tudo de si e ainda assim ser derrotado!" - }, - "defeat": { - 1: `O que importa é como você reage à derrota. - $É por isso que as pessoas que usam a derrota como combustível para melhorar são duras.`, - } - }, - "kofu": { - "encounter": { - 1: "Vou te servir um prato completo de Pokémon do tipo Água! Mas não tente comê-los!" - }, - "victory": { - 1: "Vaultin' Veluza! Você é animada, não é! Um pouco ANIMADO DEMAIS, se me permite dizer!" - }, - "defeat": { - 1: "Volte para me ver novamente, ouviu?" - } - }, - "tulip": { - "encounter": { - 1: "Permita-me usar minhas habilidades para deixar seus lindos Pokémon ainda mais bonitos!" - }, - "victory": { - 1: "Sua força tem uma magia que não pode ser apagada." - }, - "defeat": { - 1: "Você sabe, na minha linha de trabalho, pessoas que carecem de talento em uma área ou outra frequentemente desaparecem rapidamente - nunca mais se ouve falar delas." - } - }, - "sidney": { - "encounter": { - 1: `Gostei desse olhar que você me deu. Acho que você vai ser um bom desafio. - $Isso é ótimo! Parece muito bom! Vamos nessa! - $Você e eu, vamos curtir uma batalha que só pode acontecer aqui!`, - }, - "victory": { - 1: "E aí, gostou? Eu perdi! Mas foi divertido, então não importa." - }, - "defeat": { - 1: "Sem ressentimentos, beleza?" - } - }, - "phoebe": { - "encounter": { - 1: `Enquanto treinava, adquiri a habilidade de me comunicar com Pokémon do tipo Fantasma. - $Sim, o vínculo que desenvolvi com os Pokémon é extremamente forte. - $Então, vamos lá, tente ver se você consegue até mesmo causar dano aos meus Pokémon!`, - }, - "victory": { - 1: "Ah, droga. Eu perdi." - }, - "defeat": { - 1: "Estou ansiosa para batalhar com você de novo algum dia!" - } - }, - "glacia": { - "encounter": { - 1: `Tudo o que vi foram desafios de Treinadores fracos e seus Pokémon. - $E você? Ficaria extremamente satisfeita se pudesse dar tudo de mim contra você!`, - }, - "victory": { - 1: `Você e seus Pokémon… Como seus espíritos queimam! - $O calor consumido é esmagador. - $Não é surpresa que minhas habilidades geladas falharam em te machucar.`, - }, - "defeat": { - 1: "Uma batalha intensamente apaixonada, sem dúvida." - } - }, - "drake": { - "encounter": { - 1: `Para nós, batalhar com Pokémon como parceiros, você sabe o que é necessário? Você sabe o que precisa? - $Se não souber, nunca prevalecerá contra mim!`, - }, - "victory": { - 1: "Excelente, deve-se dizer." - }, - "defeat": { - 1: "Dei meu máximo nessa batalha!" - } - }, - "wallace": { - "encounter": { - 1: `Há algo em você… Uma diferença na sua postura. - $Acho que sinto isso em você. Agora, me mostre. Mostre-me o poder que você tem com seus Pokémon. - $E eu, por minha vez, apresentarei uma performance de ilusões na água com meus Pokémon!`, - }, - "victory": { - 1: `Bravo. Agora percebo sua autenticidade e magnificência como Treinadora de Pokémon. - $Tenho muita alegria em ter conhecido você e seus Pokémon. Você se mostrou digno.`, - }, - "defeat": { - 1: "Uma grande ilusão!" - } - }, - "lorelei": { - "encounter": { - 1: `Ninguém me supera quando se trata de Pokémon gelados! Movimentos congelantes são poderosos! - $Seus Pokémon estarão à minha mercê quando estiverem congelados! Hahaha! Está pronta?`, - }, - "victory": { - 1: "Como ousa!" - }, - "defeat": { - 1: "Não há nada que você possa fazer quando está congelado." - } - }, - "will": { - "encounter": { - 1: `Treinei por todo o mundo, tornando meus Pokémon psíquicos poderosos. - $Eu só posso melhorar! Perder não é uma opção!`, - }, - "victory": { - 1: "Eu… Eu não… acredito…" - }, - "defeat": { - 1: "Isso foi por pouco. Me pergunto o que você está faltando." - } - }, - "malva": { - "encounter": { - 1: `Sinto que meu coração pode explodir em chamas. - $Estou ardendo de ódio por você, pirralha!`, - }, - "victory": { - 1: "Que novidade… Uma nova desafiadora derrotou Malva!" - }, - "defeat": { - 1: "Estou encantada! Sim, encantada por poder esmagar você sob meu calcanhar." - } - }, - "hala": { - "encounter": { - 1: "O velho Hala está aqui para fazer você gritar!" - }, - "victory": { - 1: "Pude sentir o poder que você ganhou na sua jornada." - }, - "defeat": { - 1: "Haha! Que batalha deliciosa!" - } - }, - "molayne": { - "encounter": { - 1: `Dei a posição de capitão ao meu primo Sophocles, mas estou confiante na minha habilidade. - $Minha força é como a de uma supernova!`, - }, - "victory": { - 1: "Certamente encontrei uma Treinadora interessante para enfrentar!" - }, - "defeat": { - 1: "Ahaha. Que batalha interessante." - } - }, - "rika": { - "encounter": { - 1: "Eu diria que vou pegar leve com você, mas… estaria mentindo! Pense rápido!" - }, - "victory": { - 1: "Nada mal, garota." - }, - "defeat": { - 1: "Nahahaha! Você realmente é algo mais, garota!" - } - }, - "bruno": { - "encounter": { - 1: "Nós vamos te triturar com nosso poder superior! Hoo hah!" - }, - "victory": { - 1: "Por quê? Como eu poderia perder?" - }, - "defeat": { - 1: "Você pode me desafiar o quanto quiser, mas os resultados nunca vão mudar!" - } - }, - "bugsy": { - "encounter": { - 1: "Sou Bugsy! Eu nunca perco quando se trata de Pokémon do tipo Inseto!" - }, - "victory": { - 1: "Uau, incrível! Você é uma especialista em Pokémon!\nMinha pesquisa ainda não está completa. OK, você venceu." - }, - "defeat": { - 1: "Obrigado! Graças à nossa batalha, eu também pude fazer progressos na minha pesquisa!" - } - }, - "koga": { - "encounter": { - 1: "Fwahahahaha! Pokémon não são apenas sobre força bruta--você verá em breve!" - }, - "victory": { - 1: "Ah! Você provou seu valor!" - }, - "defeat": { - 1: "Você aprendeu a temer as técnicas do ninja?" - } - }, - "bertha": { - "encounter": { - 1: "Bem, você mostraria a esta velha senhora o quanto aprendeu?" - }, - "victory": { - 1: `Bem! Querida criança, devo dizer, isso foi muito impressionante. - $Seus Pokémon acreditaram em você e fizeram o melhor para te dar a vitória. - $Mesmo tendo perdido, me encontro com esse sorriso bobo!`, - }, - "defeat": { - 1: "Hahahahah! Parece que esta velha senhora ganhou!" - } - }, - "lenora": { - "encounter": { - 1: "Bem, desafiador, vou pesquisar como você batalha com os Pokémon que criou com tanto carinho!" - }, - "victory": { - 1: "Minha teoria sobre você estava correta. Você é mais do que talentosa… Você é motivada! Eu te saúdo!" - }, - "defeat": { - 1: "Ah ha ha! Se você perder, certifique-se de analisar o porquê e use esse conhecimento na próxima batalha!" - } - }, - "siebold": { - "encounter": { - 1: "Enquanto eu estiver vivo, continuarei em busca da culinária suprema... e dos oponentes mais fortes em batalha!" - }, - "victory": { - 1: "Guardarei minha memória de você e seus Pokémon para sempre em meu coração." - }, - "defeat": { - 1: `Nossa batalha Pokémon foi como alimento para minha alma. Isso vai me manter em frente. - $É assim que vou prestar meus respeitos a você por dar tudo de si na batalha!`, - } - }, - "roxie": { - "encounter": { - 1: "Prepare-se! Vou arrancar algum senso de você!" - }, - "victory": { - 1: "Selvagem! Sua razão já é mais tóxica que a minha!" - }, - "defeat": { - 1: "Ei, vamos lá! Seja séria! Você tem que dar mais de si!" - } - }, - "olivia": { - "encounter": { - 1: "Não precisa de introdução aqui. Hora de batalhar comigo, Olivia!" - }, - "victory": { - 1: "Realmente encantador… Tanto você quanto seus Pokémon…" - }, - "defeat": { - 1: "Mmm-hmm." - } - }, - "poppy": { - "encounter": { - 1: "Oooh! Você quer ter uma batalha Pokémon comigo?" - }, - "victory": { - 1: "Uagh?! Mmmuuuggghhh…" - }, - "defeat": { - 1: `Yaaay! Eu consegui! Eu der-ro-tei você! Você pode vir para… Para… Uma revanche? - $Venha para uma revanche quando quiser!`, - } - }, - "agatha": { - "encounter": { - 1: "Pokémon são para batalhas! Vou te mostrar como um verdadeiro Treinador batalha!" - }, - "victory": { - 1: "Oh meu! Você é algo especial, criança!" - }, - "defeat": { - 1: "Bahaha. É assim que uma batalha adequada é feita!" - } - }, - "flint": { - "encounter": { - 1: "Espero que você esteja aquecida, porque aqui vem o Big Bang!" - }, - "victory": { - 1: "Incrível! Seus movimentos são tão quentes que fazem os meus parecerem mornos!" - }, - "defeat": { - 1: "Huh? Isso é tudo? Acho que você precisa de um pouco mais de paixão." - } - }, - "grimsley": { - "encounter": { - 1: "O vencedor leva tudo, e não sobra nada para o perdedor." - }, - "victory": { - 1: "Quando se perde, perde-se tudo… A próxima coisa que vou procurar será a vitória, também!" - }, - "defeat": { - 1: "Se alguém vence, a pessoa que lutou contra essa pessoa perde." - } - }, - "caitlin": { - "encounter": { - 1: `Sou eu que apareci quando a flor se abriu. Você que estava esperando… - $Você parece uma Treinadora de Pokémon com força refinada e bondade profunda. - $O que eu procuro no meu oponente é uma força soberba… - $Por favor, libere seu poder ao máximo!`, - }, - "victory": { - 1: "Meus Pokémon e eu aprendemos muito! Agradeço a você." - }, - "defeat": { - 1: "Aspiro a reivindicar a vitória com elegância e graça." - } - }, - "diantha": { - "encounter": { - 1: `Batalhar contra você e seus Pokémon, todos vocês cheios de esperança para o futuro… - $Honestamente, isso apenas me enche da energia que preciso para continuar enfrentando cada novo dia! Sim!`, - }, - "victory": { - 1: "Testemunhar os espíritos nobres de você e seus Pokémon em batalha realmente tocou meu coração…" - }, - "defeat": { - 1: "Oh, fantástico! O que achou? Minha equipe foi bem legal, né?" - } - }, - "wikstrom": { - "encounter": { - 1: `Bem encontrado, jovem desafiador! Verdadeiramente sou a lâmina famosa de aço endurecido, Duque Wikstrom! - $Que a batalha comece! En garde!`, - }, - "victory": { - 1: "Glorioso! A confiança que você compartilha com seu honrado Pokémon supera até mesmo a minha!" - }, - "defeat": { - 1: `Que tipo de magia é essa? Meu coração bate incessantemente no meu peito! - $Vencer contra um oponente tão digno dá asas à minha alma--assim eu voo!`, - } - }, - "acerola": { - "encounter": { - 1: "Batalhar é simplesmente divertido! Vamos lá, eu posso te derrotar!" - }, - "victory": { - 1: "Eu… Estou sem palavras! Como você conseguiu?!" - }, - "defeat": { - 1: "Ehaha! Que vitória incrível!" - } - }, - "larry_elite": { - "encounter": { - 1: `Olá… Sou eu, Larry. - $Eu também sou membro da Elite dos Quatro, sim… Infelizmente para mim.`, - }, - "victory": { - 1: "Bem, isso tirou o vento debaixo das nossas asas…" - }, - "defeat": { - 1: "É hora de uma reunião com o chefe." - } - }, - "lance": { - "encounter": { - 1: "Estive esperando por você. Permita-me testar suas habilidades.", - 2: "Achei que você conseguiria chegar tão longe. Vamos começar." - }, - "victory": { - 1: "Você me pegou. Você é magnífica!", - 2: "Nunca esperei que outro Treinador me derrotasse… Estou surpreso." - }, - "defeat": { - 1: "Isso foi por pouco. Quer tentar de novo?", - 2: "Não é que você seja fraco. Não se incomode com isso." - } - }, - "karen": { - "encounter": { - 1: "Eu sou Karen. Você gostaria de um duelo com meus Pokémon do tipo Sombrio?", - 2: "Sou diferente daqueles que você já conheceu.", - 3: "Você montou uma equipe charmosa. Nossa batalha deve ser boa." - }, - "victory": { - 1: "Não! Eu não posso vencer. Como você ficou tão forte?", - 2: "Não me desviarei do meu caminho escolhido.", - 3: "O Campeão está ansioso para te conhecer." - }, - "defeat": { - 1: "Isso era o que eu esperava.", - 2: "Bem, isso foi relativamente divertido.", - 3: "Venha me visitar a qualquer momento." - } - }, - "milo": { - "encounter": { - 1: `Parece que você entende bem os Pokémon. - $Isso vai ser uma batalha e tanto! - $Vou ter que usar a Dynamax no meu Pokémon se eu quiser vencer!`, - }, - "victory": { - 1: "O poder da Grama murchou… Que desafiador incrível!" - }, - "defeat": { - 1: "Isso realmente vai te deixar em choque e admiração." - } - }, - "lucian": { - "encounter": { - 1: `Só um momento, por favor. O livro que estou lendo está quase no clímax emocionante… - $O herói obteve uma espada mística e está prestes a enfrentar sua prova final… Ah, tanto faz. - $Já que você chegou tão longe, vou deixar isso de lado e batalhar com você. - $Deixe-me ver se você alcançará tanta glória quanto o herói do meu livro!`, - }, - "victory": { - 1: "Eu vejo… Parece que você me colocou em xeque-mate." - }, - "defeat": { - 1: "Tenho uma reputação a manter." - } - }, - "drasna": { - "encounter": { - 1: `Você deve ser uma Treinadora forte. Sim, bastante forte… - $Isso é uma notícia maravilhosa! Enfrentar oponentes como você e sua equipe fará meus Pokémon crescerem como ervas daninhas!`, - }, - "victory": { - 1: "Oh, meu Deus. Isso foi uma batalha rápida… Espero que você volte novamente algum dia!" - }, - "defeat": { - 1: "Como isso é possível?" - } - }, - "kahili": { - "encounter": { - 1: "Então, aqui está você… Por que não vemos para quem os ventos favorecem hoje, você… ou eu?" - }, - "victory": { - 1: "É frustrante para mim como membro da Elite dos Quatro, mas parece que sua força é real." - }, - "defeat": { - 1: "Essa foi uma jogada de mestre!" - } - }, - "hassel": { - "encounter": { - 1: "Prepare-se para aprender em primeira mão como é a respiração ardente de uma batalha feroz!" - }, - "victory": { - 1: `A sorte sorriu para mim desta vez, mas… - $Julgando pelo andamento da luta, quem sabe se serei tão sortudo na próxima vez.`, - }, - "defeat": { - 1: "Essa foi uma jogada de mestre!" - } - }, - "blue": { - "encounter": { - 1: "Você deve ser muito boa para chegar tão longe." - }, - "victory": { - 1: "Só perdi para ele e agora para você… Ele? Hee, hee…" - }, - "defeat": { - 1: "Viu? Meu poder é o que me trouxe até aqui." - } - }, - "piers": { - "encounter": { - 1: "Prepare-se para uma mosh pit comigo e minha galera! Spikemuth, é hora de roquear!" - }, - "victory": { - 1: "Eu e minha equipe demos o nosso melhor. Vamos nos encontrar novamente para uma batalha algum dia…" - }, - "defeat": { - 1: "Minha garganta está desgastada de tanto gritar… Mas essa foi uma batalha empolgante!" - } - }, - "red": { - "encounter": { - 1: "…!" - }, - "victory": { - 1: "…?" - }, - "defeat": { - 1: "…!" - } - }, - "jasmine": { - "encounter": { - 1: "Oh… Seus Pokémon são impressionantes. Acho que vou gostar disso." - }, - "victory": { - 1: "Você é realmente forte. Vou ter que me esforçar muito mais também." - }, - "defeat": { - 1: "Eu nunca esperei ganhar." - } - }, - "lance_champion": { - "encounter": { - 1: "Ainda sou o Campeão. Não vou segurar nada." - }, - "victory": { - 1: "Esta é a emergência de uma nova Campeã." - }, - "defeat": { - 1: "Defendi com sucesso meu Campeonato." - } - }, - "steven": { - "encounter": { - 1: `Diga-me… O que você viu na sua jornada com seus Pokémon? - $O que você sentiu, encontrando tantos outros Treinadores por aí? - $Viajar por esta terra rica… Isso despertou algo dentro de você? - $Quero que você venha até mim com tudo o que aprendeu. - $Meus Pokémon e eu responderemos com tudo o que sabemos!`, - }, - "victory": { - 1: "Então eu, o Campeão, caio em derrota…" - }, - "defeat": { - 1: "Esse tempo foi bem gasto! Obrigado!" - } - }, - "cynthia": { - "encounter": { - 1: "Eu, Cynthia, aceito seu desafio! Não haverá nenhuma trégua da minha parte!" - }, - "victory": { - 1: "Não importa o quão divertida a batalha seja, ela sempre terminará algum dia…" - }, - "defeat": { - 1: "Mesmo que você perca, nunca perca o amor pelos Pokémon." - } - }, - "iris": { - "encounter": { - 1: `Sabe de uma coisa? Estou realmente ansiosa para ter batalhas sérias com Treinadores fortes! - $Quero dizer, vamos lá! Os Treinadores que chegam aqui são Treinadores que desejam a vitória com todas as fibras do seu ser! - #E eles estão batalhando ao lado de Pokémon que passaram por inúmeras batalhas difíceis! - $Se eu batalhar com pessoas assim, não só eu ficarei mais forte, meus Pokémon também! - $E nós vamos nos conhecer ainda melhor! OK! Prepare-se! - $Sou Iris, a Campeã da Liga Pokémon, e vou te derrotar!`, - }, - "victory": { - 1: "Aghhhh… Eu dei o meu melhor, mas nós perdemos…" - }, - "defeat": { - 1: "Yay! Nós vencemos!" - } - }, - "hau": { - "encounter": { - 1: `Eu me pergunto se um Treinador batalha de maneira diferente dependendo se ele é de uma região quente ou fria. - $Vamos testar isso!`, - }, - "victory": { - 1: "Isso foi incrível! Acho que entendi um pouco melhor seu estilo agora!" - }, - "defeat": { - 1: "Cara, essa foi uma batalha e tanto!" - } - }, - "geeta": { - "encounter": { - 1: `Decidi entrar na batalha mais uma vez. - $Venha agora… Mostre-me os frutos do seu treinamento.`, - }, - "victory": { - 1: "Estou ansiosa para notícias de todas as suas conquistas!" - }, - "defeat": { - 1: "Qual o problema? Isso é tudo?" - } - }, - "nemona": { - "encounter": { - 1: "Yesss! Estou tão empolgada! Hora de soltar tudo!" - }, - "victory": { - 1: "Bem, isso foi ruim, mas ainda me diverti! Eu te pego na próxima!" - }, - "defeat": { - 1: "Bem, essa foi uma ótima batalha! Frutífera, com certeza." - } - }, - "leon": { - "encounter": { - 1: "Vamos ter um tempo absolutamente campeão!" - }, - "victory": { - 1: `Meu tempo como Campeão acabou… - $Mas que tempo campeão foi! - $Obrigado pela melhor batalha que já tive!`, - }, - "defeat": { - 1: "Um tempo absolutamente campeão, foi!" - } - }, - "whitney": { - "encounter": { - 1: "Eai! Você não acha que os Pokémon são, tipo, super fofos?" - }, - "victory": { - 1: "Waaah! Waaah! Você é tão má!" - }, - "defeat": { - 1: "E é isso!" - } - }, - "chuck": { - "encounter": { - 1: "Hah! Você quer me desafiar? É corajosa ou apenas ignorante?" - }, - "victory": { - 1: "Você é forte! Por favor, me faça seu aprendiz?" - }, - "defeat": { - 1: "Aí está. Você percebe o quanto sou mais poderoso que você?" - } - }, - "katy": { - "encounter": { - 1: "Não baixe a guarda, a menos que queira se ver jogada no chão!" - }, - "victory": { - 1: "Todos os meus adoráveis Pokémon caíram como moscas!" - }, - "defeat": { - 1: "Coma, meu adorável Vivillon!" - } - }, - "pryce": { - "encounter": { - 1: "A juventude sozinha não garante a vitória! Experiência é o que conta." - }, - "victory": { - 1: "Excelente! Isso foi perfeito. Tente não esquecer o que sente agora." - }, - "defeat": { - 1: "Exatamente como eu imaginei." - } - }, - "clair": { - "encounter": { - 1: "Você sabe quem eu sou? E ainda se atreve a me desafiar?" - }, - "victory": { - 1: "Eu me pergunto até onde você pode ir com seu nível de habilidade. Isso deve ser fascinante." - }, - "defeat": { - 1: "E é isso." - } - }, - "maylene": { - "encounter": { - 1: `Vim desafiá-la agora e não vou segurar nada. - $Por favor, prepare-se para a batalha!`, - }, - "victory": { - 1: "Eu admito a derrota…" - }, - "defeat": { - 1: "Isso foi incrível." - } - }, - "fantina": { - "encounter": { - 1: `Você vai me desafiar, não é? Mas eu vou ganhar. - $É o que a Líder do Ginásio de Hearthome faz, não?`, - }, - "victory": { - 1: "Você é tão incrivelmente forte. Sei porque perdi." - }, - "defeat": { - 1: "Estou tão, tão, muito feliz!" - } - }, - "byron": { - "encounter": { - 1: `Treinadora! Você é jovem, assim como meu filho, Roark. - $Com mais Treinadores jovens assumindo o comando, o futuro dos Pokémon é brilhante! - $Então, como uma parede para os jovens, aceitarei seu desafio!`, - }, - "victory": { - 1: "Hmm! Meus Pokémon robustos--derrotados!" - }, - "defeat": { - 1: "Gwahahaha! Como foram meus Pokémon robustos?!" - } - }, - "olympia": { - "encounter": { - 1: "Um costume antigo decidindo o destino de alguém. A batalha começa!" - }, - "victory": { - 1: "Crie seu próprio caminho. Não deixe nada te atrapalhar. Seu destino, seu futuro." - }, - "defeat": { - 1: "Nosso caminho está claro agora." - } - }, - "volkner": { - "encounter": { - 1: `Já que você chegou tão longe, deve ser bastante forte… - $Espero que você seja a Treinadora que me faça lembrar como é divertido batalhar!`, - }, - "victory": { - 1: `Você me venceu… - $Seu desejo e a maneira nobre como seus Pokémon batalharam por você… - $Eu até me senti emocionado durante nossa luta. Foi uma batalha muito boa.`, - }, - "defeat": { - 1: `Não foi nada chocante… - $Isso não é o que eu queria!`, - } - }, - "burgh": { - "encounter": { - 1: `M'hm… Se eu ganhar esta batalha, sinto que posso desenhar um quadro diferente de qualquer outro. - $OK! Posso ouvir minha musa da batalha claramente. Vamos direto ao ponto!`, - 2: `Claro, estou realmente orgulhoso de todos os meus Pokémon! - $Bem agora… Vamos direto ao ponto!` - }, - "victory": { - 1: "Acabou? Minha musa me abandonou?", - 2: "Hmm… Acabou! Você é incrível!" - }, - "defeat": { - 1: "Uau… É bonito de alguma forma, não é…", - 2: `Às vezes ouço as pessoas dizerem que foi uma vitória feia. - $Acho que se você está dando o seu melhor, qualquer vitória é bonita.` - } - }, - "elesa": { - "encounter": { - 1: `C'est fini! Quando tenho certeza disso, sinto um choque elétrico percorrer meu corpo! - $Quero sentir essa sensação, então agora meus amados Pokémon vão fazer sua cabeça girar!`, - }, - "victory": { - 1: "Eu queria fazer sua cabeça girar, mas você me surpreendeu." - }, - "defeat": { - 1: "Isso foi insatisfatório de alguma forma… Você dará tudo de si na próxima vez?" - } - }, - "skyla": { - "encounter": { - 1: `Finalmente é hora do confronto! Isso significa a batalha Pokémon que decide quem está no topo, certo? - $Eu amo estar no topo! Porque você pode ver para sempre e sempre de lugares altos! - $Então, que tal nós nos divertirmos?`, - }, - "victory": { - 1: "Ser seu oponente na batalha é uma nova fonte de força para mim. Obrigada!" - }, - "defeat": { - 1: "Ganhar ou perder, você sempre ganha algo com uma batalha, certo?" - } - }, - "brycen": { - "encounter": { - 1: `Há também força em estar com outras pessoas e Pokémon. - $Receber o apoio deles te fortalece. Vou te mostrar esse poder!`, - }, - "victory": { - 1: "A maravilhosa combinação de você e seus Pokémon! Que amizade linda!" - }, - "defeat": { - 1: "Condições extremas realmente testam e treinam você!" - } - }, - "drayden": { - "encounter": { - 1: `O que eu quero encontrar é um jovem Treinador que possa me mostrar um futuro brilhante. - $Vamos batalhar com tudo o que temos: sua habilidade, minha experiência e o amor com que criamos nossos Pokémon!`, - }, - "victory": { - 1: "Esse sentimento intenso que me invade após uma derrota… Não sei como descrevê-lo." - }, - "defeat": { - 1: "Harrumph! Sei que sua habilidade é maior que isso!" - } - }, - "grant": { - "encounter": { - 1: `Só há uma coisa que desejo. - $Que, superando um ao outro, encontremos um caminho para alturas ainda maiores.`, - }, - "victory": { - 1: "Você é uma parede que não consigo superar!" - }, - "defeat": { - 1: `Não desista. - $Isso é tudo o que realmente importa. - $As lições mais importantes da vida são simples.`, - } - }, - "korrina": { - "encounter": { - 1: "Hora da grande aparição de Lady Korrina!" - }, - "victory": { - 1: "É o seu próprio ser que permite que seus Pokémon evoluam!" - }, - "defeat": { - 1: "Que batalha explosiva!" - } - }, - "clemont": { - "encounter": { - 1: "Oh! Estou feliz por termos nos encontrado!" - }, - "victory": { - 1: "Sua paixão pela batalha me inspira!" - }, - "defeat": { - 1: "Parece que minha Máquina Treinadora-Crescer-Forte, Mach 2 está realmente funcionando!" - } - }, - "valerie": { - "encounter": { - 1: `Oh, se não é uma jovem Treinadora… É adorável conhecê-lo assim. - $Então, suponho que você ganhou o direito a uma batalha, como recompensa por seus esforços. - $O elusivo Fada pode parecer frágil como a brisa e delicado como uma flor, mas é forte.`, - }, - "victory": { - 1: "Espero que você encontre coisas para sorrir amanhã…" - }, - "defeat": { - 1: "Oh meu Deus, que pena…" - } - }, - "wulfric": { - "encounter": { - 1: `Sabe de uma coisa? Todos falamos muito sobre o que você aprende com as batalhas e os laços e tudo mais… - $Mas realmente, eu só faço isso porque é divertido. - $Quem se importa com o grandioso? Vamos batalhar!`, - }, - "victory": { - 1: "Incrível! Sou duro como um iceberg, mas você me quebrou por completo!" - }, - "defeat": { - 1: "Lute comigo e é isso que acontece!" - } - }, - "kabu": { - "encounter": { - 1: `Todo Treinador e Pokémon treina duro em busca da vitória. - $Mas isso significa que seu oponente também está se esforçando para vencer. - $No final, a partida é decidida por qual lado é capaz de liberar seu verdadeiro potencial.`, - }, - "victory": { - 1: "Estou feliz por poder lutar com você hoje!" - }, - "defeat": { - 1: "É uma ótima maneira de sentir meu próprio crescimento!" - } - }, - "bea": { - "encounter": { - 1: `Você tem um espírito inabalável que não será movido, não importa como você seja atacado? - $Acho que vou testar isso, certo?`, - }, - "victory": { - 1: "Senti o espírito de luta de seus Pokémon enquanto você os liderava na batalha." - }, - "defeat": { - 1: "Essa foi a melhor partida que alguém poderia esperar." - } - }, - "opal": { - "encounter": { - 1: "Deixe-me ver como você e seu Pokémon parceiro se comportam!" - }, - "victory": { - 1: "Seu rosa ainda está faltando, mas você é uma Treinadora excelente com Pokémon excelentes." - }, - "defeat": { - 1: "Muito ruim para você, eu acho." - } - }, - "bede": { - "encounter": { - 1: "Suponho que devo provar além de qualquer dúvida o quão patética você é e quão forte eu sou." - }, - "victory": { - 1: "Eu vejo… Bem, tudo bem. Eu não estava me esforçando muito de qualquer maneira." - }, - "defeat": { - 1: "Bom trabalho, eu suponho." - } - }, - "gordie": { - "encounter": { - 1: "Então, vamos acabar com isso." - }, - "victory": { - 1: "Eu só quero me enterrar em um buraco… Bem, acho que seria mais como cair daqui." - }, - "defeat": { - 1: "Batalhe como sempre faz, a vitória seguirá!" - } - }, - "marnie": { - "encounter": { - 1: `A verdade é que, quando tudo está dito e feito… Eu realmente só quero me tornar Campeã por mim mesma! - $Então, não leve para o pessoal quando eu chutar seu traseiro!`, - }, - "victory": { - 1: "OK, então eu perdi… Mas consegui ver muitos dos pontos bons de você e seus Pokémon!" - }, - "defeat": { - 1: "Espero que você tenha gostado das nossas táticas de batalha." - } - }, - "raihan": { - "encounter": { - 1: "Vou derrotar o Campeão, vencer todo o torneio e provar ao mundo o quão forte o grande Raihan realmente é!" - }, - "victory": { - 1: `Eu pareço bem mesmo quando perco. - $É uma verdadeira maldição. - $Acho que é hora de mais uma selfie!`, - }, - "defeat": { - 1: "Vamos tirar uma selfie para lembrar disso." - } - }, - "brassius": { - "encounter": { - 1: "Pressuponho que você está pronta? Que nossa obra de arte colaborativa comece!" - }, - "victory": { - 1: "Ahhh…avant-garde!" - }, - "defeat": { - 1: "Começarei uma nova peça imediatamente!" - } - }, - "iono": { - "encounter": { - 1: `Como você está se sentindo sobre esta batalha? - $... - $Vamos começar o show! Quão forte é o nossa desafiadora? - $Eu não sei! Vamos descobrir juntos!`, - }, - "victory": { - 1: "Você é tão chamativa e brilhante quanto um Raio do Trovão de 10.000.000 volts, amiga!" - }, - "defeat": { - 1: "Seus olhos são MEUS!" - } - }, - "larry": { - "encounter": { - 1: "Quando tudo está dito e feito, a simplicidade é mais forte." - }, - "victory": { - 1: "Uma porção de derrota, hein?" - }, - "defeat": { - 1: "Vou encerrar o dia." - } - }, - "ryme": { - "encounter": { - 1: "Vamos lá, baby! Me agite até os ossos!" - }, - "victory": { - 1: "Você é legal, minha amiga, você move minha ALMA!" - }, - "defeat": { - 1: "Até mais, baby!" - } - }, - "grusha": { - "encounter": { - 1: "Tudo o que preciso fazer é garantir que o poder do meu Pokémon te arrependa até os ossos!" - }, - "victory": { - 1: "Sua paixão ardente... Eu meio que gosto, para ser honesto." - }, - "defeat": { - 1: "As coisas não esquentaram para você." - } - }, - "marnie_elite": { - "encounter": { - 1: "Você chegou até aqui, hein? Vamos ver se você pode lidar com meus Pokémon!", - 2: "Vou dar o meu melhor, mas não pense que vou pegar leve com você!" - }, - "victory": { - 1: "Não acredito que perdi... Mas você mereceu essa vitória. Bem feito!", - 2: "Parece que ainda tenho muito a aprender. Grande batalha, porém!" - }, - "defeat": { - 1: "Você lutou bem, mas eu tenho a vantagem! Melhor sorte na próxima vez!", - 2: "Parece que meu treinamento valeu a pena. Obrigado pela batalha!" - } - }, - "nessa_elite": { - "encounter": { - 1: "As marés estão mudando a meu favor. Pronta para ser levada pela corrente?", - 2: "Vamos fazer ondas com esta batalha! Espero que esteja preparada!" - }, - "victory": { - 1: "Você navegou nessas águas perfeitamente... Bem feito!", - 2: "Parece que minhas correntes não foram páreo para você. Bom trabalho!" - }, - "defeat": { - 1: "A água sempre encontra um caminho. Essa foi uma batalha refrescante!", - 2: "Você lutou bem, mas o poder do oceano é imparável!" - } - }, - "bea_elite": { - "encounter": { - 1: "Prepare-se! Meu espírito de luta brilha intensamente!", - 2: "Vamos ver se você consegue acompanhar meu ritmo implacável!" - }, - "victory": { - 1: "Sua força... É impressionante. Você realmente merece essa vitória.", - 2: "Nunca senti essa intensidade antes. Trabalho incrível!" - }, - "defeat": { - 1: "Outra vitória para meu rigoroso regime de treinamento! Bem feito!", - 2: "Você tem força, mas eu treinei mais. Grande batalha!" - } - }, - "allister_elite": { - "encounter": { - 1: "As sombras caem... Você está pronta para enfrentar seus medos?", - 2: "Vamos ver se você pode lidar com a escuridão que eu comando." - }, - "victory": { - 1: "Você dissipou as sombras... Por enquanto. Bem feito.", - 2: "Sua luz atravessou minha escuridão. Ótimo trabalho." - }, - "defeat": { - 1: "As sombras falaram... Sua força não é suficiente.", - 2: "A escuridão triunfa... Talvez na próxima vez você veja a luz." - } - }, - "raihan_elite": { - "encounter": { - 1: "Tempestade se formando! Vamos ver se você aguenta essa luta!", - 2: "Prepare-se para enfrentar o olho da tempestade!" - }, - "victory": { - 1: "Você enfrentou a tempestade... Trabalho incrível!", - 2: "Você navegou nos ventos perfeitamente... Grande batalha!" - }, - "defeat": { - 1: "Outra tempestade enfrentada, outra vitória conquistada! Bem lutado!", - 2: "Você foi pego na minha tempestade! Melhor sorte na próxima vez!" - } - }, - "alder": { - "encounter": { - 1: "Se prepare para uma batalha contra o Treinador mais forte de Unova!" - }, - "victory": { - 1: "Muito bem! Você certamente é um talento incomparável." - }, - "defeat": { - 1: `Um vento fresco sopra em meu coração... - $Que esforço extraordinário!` - } - }, - "kieran": { - "encounter": { - 1: `Através do trabalho duro, eu me torno cada vez mais forte! - $Eu não perco.` - }, - "victory": { - 1: `Eu não acredito... - $Que batalha divertida e emocionante!` - }, - "defeat": { - 1: `Uau, que batalha! - $Hora de você treinar ainda mais.` - } - }, - "rival": { - "encounter": { - 1: `@c{smile}Eai, estava procurando você! Sabia que você estava ansiosa para começar, mas esperava pelo menos um tchau… - $@c{smile_eclosed}Então você está realmente perseguindo seu sonho, hein?\n Quase não consigo acreditar. - $@c{serious_smile_fists}Já que estamos aqui, que tal uma batalha?\nAfinal, quero ter certeza de que você está pronta. - $@c{serious_mopen_fists}Não se segure, quero que você dê tudo de si!` - }, - "victory": { - 1: `@c{shock}Caramba… Você me limpou.\nVocê é mesmo uma novata? - $@c{smile}Talvez tenha sido um pouco de sorte, mas…\nQuem sabe você consiga chegar até o fim. - $Aliás, o professor me pediu para te dar esses itens. Eles parecem bem legais. - $@c{serious_smile_fists}Boa sorte lá fora!` - }, - }, - "rival_female": { - "encounter": { - 1: `@c{smile_wave}Aí está você! Procurei você em todo lugar!\n@c{angry_mopen}Esqueceu de se despedir da sua melhor amiga? - $@c{smile_ehalf}Você está indo atrás do seu sonho, né?\nEsse dia realmente chegou, não é… - $@c{smile}Enfim, vou te perdoar por ter me esquecido, mas com uma condição. @c{smile_wave_wink}Você tem que lutar comigo! - $@c{angry_mopen}Dê o seu melhor! Não quer que sua aventura acabe antes de começar, né?` - }, - "victory": { - 1: `@c{shock}Você acabou de começar e já está tão forte?!@d{96}\n@c{angry}Você trapaceou, não foi? - $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile_eclosed}Eu perdi de forma justa… Tenho a sensação de que você vai se sair muito bem lá fora. - $@c{smile}Aliás, o professor pediu para eu te dar alguns itens. Espero que sejam úteis! - $@c{smile_wave}Dê o seu melhor, como sempre! Eu acredito em você!` - }, - }, - "rival_2": { - "encounter": { - 1: `@c{smile}Eai, você também está aqui?\n@c{smile_eclosed}Ainda com um recorde perfeito, hein…? - $@c{serious_mopen_fists}Sei que parece que eu te segui até aqui, mas isso não é totalmente verdade. - $@c{serious_smile_fists}Sinceramente, tenho estado ansioso por uma revanche desde que você me venceu em casa. - $Tenho treinado bastante, então vou dar uma luta difícil desta vez. - $@c{serious_mopen_fists}Não se segure, assim como antes!\nVamos lá!` - }, - "victory": { - 1: `@c{neutral_eclosed}Ah. Acho que fui confiante demais. - $@c{smile}Tudo bem, no entanto. Eu imaginei que isso poderia acontecer.\n@c{serious_mopen_fists}Isso só significa que preciso me esforçar mais para a próxima vez!\n - $@c{smile}Ah, não que você precise realmente de ajuda, mas eu tinha um extra desses itens e pensei que você poderia querer. - $@c{serious_smile_fists}Não espere outro depois deste!\nNão posso continuar dando vantagem ao meu oponente. - $@c{smile}Enfim, cuide-se!` - }, - }, - "rival_2_female": { - "encounter": { - 1: `@c{smile_wave}Oh, que surpresa te encontrar aqui. Parece que você ainda está invicto. @c{angry_mopen}Hum… Nada mal! - $@c{angry_mopen}Eu sei o que você está pensando, e não, eu não estava te espionando. @c{smile_eclosed}Acontece que eu estava na área. - $@c{smile_ehalf}Estou feliz por você, mas só quero te avisar que está tudo bem perder às vezes. - $@c{smile}Aprendemos com nossos erros, muitas vezes mais do que se continuássemos vencendo. - $@c{angry_mopen}De qualquer forma, tenho treinado duro para nossa revanche, então é melhor você dar o seu melhor!` - }, - "victory": { - 1: `@c{neutral}Eu… não era para eu perder dessa vez… - $@c{smile}Ah bem. Isso só significa que vou ter que treinar ainda mais para a próxima vez! - $@c{smile_wave}Também consegui mais um desses para você!\n@c{smile_wave_wink}Não precisa me agradecer~. - $@c{angry_mopen}Este é o último, hein! Você não vai ganhar mais nenhum presente de mim depois desse! - $@c{smile_wave}Continue assim!` - }, - "defeat": { - 1: "Está tudo bem perder às vezes…" - } - }, - "rival_3": { - "encounter": { - 1: `@c{smile}Eai, olha quem é! Faz um tempo.\n@c{neutral}Você… ainda está invicto? Hum. - $@c{neutral_eclosed}As coisas têm sido meio… estranhas.\nNão é a mesma coisa em casa sem você. - $@c{serious}Eu sei que é egoísta, mas preciso desabafar.\n@c{neutral_eclosed}Acho que você está se metendo em algo grande demais aqui. - $@c{serious}Nunca perder é irrealista.\nPrecisamos perder às vezes para crescer. - $@c{neutral_eclosed}Você teve uma grande jornada, mas ainda há muito pela frente, e só vai ficar mais difícil. @c{neutral}Você está preparada para isso? - $@c{serious_mopen_fists}Se sim, prove para mim.` - }, - "victory": { - 1: "@c{angry_mhalf}Isso é ridículo… Eu mal parei de treinar…\nComo ainda estamos tão distantes?" - }, - }, - "rival_3_female": { - "encounter": { - 1: `@c{smile_wave}Quanto tempo! Ainda não perdeu, né.\n@c{angry}Você está começando a me irritar. @c{smile_wave_wink}Brincadeirinha! - $@c{smile_ehalf}Mas sério, você não sente saudades de casa? Ou… de mim?\nEu… Eu quero dizer, sentimos muito a sua falta. - $@c{smile_eclosed}Eu apoio o seu sonho e tudo mais, mas a realidade é que você vai perder mais cedo ou mais tarde. - $@c{smile}E quando isso acontecer, estarei lá para você, como sempre.\n@c{angry_mopen}Agora, deixe-me mostrar o quão forte eu me tornei!` - }, - "victory": { - 1: "@c{shock}Depois de tudo isso… não foi o suficiente…?\nVocê nunca vai voltar a esse ritmo…" - }, - "defeat": { - 1: "Você deu o seu melhor, agora vamos para casa." - } - }, - "rival_4": { - "encounter": { - 1: `@c{neutral}Oi. - $Não vou enrolar com você.\n@c{neutral_eclosed}Estou aqui para vencer, simples assim. - $@c{serious_mhalf_fists}Aprendi a maximizar meu potencial dedicando todo o meu tempo ao treino. - $@c{smile}Você ganha muito tempo extra quando corta o sono e a interação social desnecessários. - $@c{serious_mopen_fists}Nada disso importa mais, não até eu vencer. - $@c{neutral_eclosed}Cheguei ao ponto de não perder mais.\n@c{smile_eclosed}Acho que sua filosofia não estava tão errada afinal. - $@c{angry_mhalf}Perder é para os fracos, e eu não sou mais fraco. - $@c{serious_mopen_fists}Prepare-se.` - }, - "victory": { - 1: "@c{neutral}O que…@d{64} O que você é?" - }, - }, - "rival_4_female": { - "encounter": { - 1: `@c{neutral}Sou eu! Você não esqueceu de mim de novo… esqueceu? - $@c{smile}Você deveria se orgulhar de até onde chegou. Parabéns!\nMas parece que é o fim da sua jornada. - $@c{smile_eclosed}Você despertou algo em mim que eu nunca soube que existia.\nParece que agora tudo o que faço é treinar. - $@c{smile_ehalf}Eu mal como ou durmo agora, só treino meus Pokémon o dia todo, ficando mais forte a cada vez. - $@c{neutral}Na verdade, eu… mal me reconheço. - $E agora, finalmente atingi o desempenho máximo.\nNão acho que alguém poderia me vencer agora. - $E sabe de uma coisa? É tudo por sua causa.\n@c{smile_ehalf}Eu não sei se te agradeço ou te odeio. - $@c{angry_mopen}Prepare-se.` - }, - "victory": { - 1: "@c{neutral}O que…@d{64} O que você é?" - }, - "defeat": { - 1: "$@c{smile}Você deveria se orgulhar de até onde chegou." - } - }, - "rival_5": { - "encounter": { - 1: "@c{neutral}…" - }, - "victory": { - 1: "@c{neutral}…" - }, - }, - "rival_5_female": { - "encounter": { - 1: "@c{neutral}…" - }, - "victory": { - 1: "@c{neutral}…" - }, - "defeat": { - 1: "$@c{smile_ehalf}…" - } - }, - "rival_6": { - "encounter": { - 1: `@c{smile_eclosed}Nos encontramos de novo. - $@c{neutral}Tive um tempo para refletir sobre tudo isso.\nHá uma razão para tudo isso parecer tão estranho. - $@c{neutral_eclosed}Seu sonho, minha vontade de te vencer…\nTudo faz parte de algo maior. - $@c{serious}Isso não é sobre mim, nem sobre você… É sobre o mundo, @c{serious_mhalf_fists}e é meu propósito te levar ao limite. - $@c{neutral_eclosed}Se cumpri esse propósito, não posso dizer, mas fiz tudo ao meu alcance. - $@c{neutral}Este lugar em que acabamos é assustador… Mas de alguma forma me sinto indiferente, como se já tivesse estado aqui antes. - $@c{serious_mhalf_fists}Você sente o mesmo, não sente? - $@c{serious}…é como se algo aqui estivesse falando comigo.\nIsso é tudo o que o mundo conhece há muito tempo. - $Aqueles momentos que apreciamos juntos que parecem tão recentes não passam de uma memória distante. - $@c{neutral_eclosed}Quem pode dizer se eles foram realmente reais em primeiro lugar. - $@c{serious_mopen_fists}Você precisa continuar empurrando, porque se não o fizer, isso nunca vai acabar. Você é a única que pode fazer isso. - $@c{serious_smile_fists}Eu mal sei o que tudo isso significa, só sei que é verdade. - $@c{serious_mopen_fists}Se você não pode me derrotar aqui e agora, você não terá chance.` - }, - "victory": { - 1: `@c{smile_eclosed}Parece que meu trabalho aqui está feito. - $Quero que você me prometa uma coisa.\n@c{smile}Depois que curar o mundo, por favor, volte para casa.` - }, - }, - "rival_6_female": { - "encounter": { - 1: `@c{smile_ehalf}Então somos só nós de novo. - $@c{smile_eclosed}Sabe, continuo pensando nisso… - $@c{smile_ehalf}Há algo nisso tudo, por que tudo parece tão estranho agora… - $@c{smile}Você tem seu sonho, e eu tenho essa ambição em mim… - $Não consigo evitar sentir que há um propósito maior em tudo isso, no que estamos fazendo, você e eu. - $@c{smile_eclosed}Acho que devo te levar ao limite. - $@c{smile_ehalf}Não tenho certeza se estou fazendo um bom trabalho nisso, mas tentei meu melhor até agora. - $Há algo neste lugar estranho e terrível… Tudo parece tão claro… - $Isso… é tudo o que o mundo conhece há muito tempo. - $@c{smile_eclosed}É como se eu mal pudesse lembrar das memórias que apreciamos juntos. - $@c{smile_ehalf}Elas foram reais? Elas parecem tão distantes agora… - $@c{angry_mopen}Você precisa continuar empurrando, porque se não o fizer, isso nunca vai acabar. Você é o único que pode fazer isso. - $@c{smile_ehalf}Eu… não sei o que tudo isso significa… mas sinto que é verdade. - $@c{neutral}Se você não pode me derrotar aqui e agora, você não terá chance.` - }, - "victory": { - 1: `@c{smile_ehalf}Eu… acho que cumpri meu propósito… - $@c{smile_eclosed}Prometa-me… Depois que curar o mundo… Por favor… volte para casa. - $@c{smile_ehalf}…Obrigada.` - }, - }, -}; - -// Diálogo do chefe final do jogo quando o personagem do jogador é masculino (ou não definido) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `Parece que a hora finalmente chegou novamente.\nVocê sabe por que veio aqui, não sabe? - $Você foi atraído para cá, porque já esteve aqui antes.\nInúmeras vezes. - $Embora talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu 5.643.853º ciclo. - $A cada ciclo, sua mente retorna ao seu estado anterior.\nMesmo assim, de alguma forma, vestígios de seus antigos "eus" permanecem. - $Até agora, você ainda não conseguiu, mas sinto uma presença diferente em você desta vez.\n - $Você é o único aqui, embora pareça haver... outro. - $Você finalmente vai se mostrar um desafio formidável para mim?\nO desafio que anseio há milênios? - $Vamos começar.`, - "firstStageWin": `Entendo. A presença que senti era realmente real.\nParece que não preciso mais me segurar. - $Não me decepcione.`, - "secondStageWin": "…Magnífico." -}; - -// Diálogo do chefe final do jogo quando o personagem do jogador é feminino. Para idiomas que não possuem pronomes de gênero, isso pode ser definido como PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `Parece que a hora finalmente chegou novamente.\nVocê sabe por que veio aqui, não sabe? - $Você foi atraída para cá, porque já esteve aqui antes.\nInúmeras vezes. - $Embora talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu 5.643.853º ciclo. - $A cada ciclo, sua mente retorna ao seu estado anterior.\nMesmo assim, de alguma forma, vestígios de seus antigos "eus" permanecem. - $Até agora, você ainda não conseguiu, mas sinto uma presença diferente em você desta vez.\n - $Você é a única aqui, embora pareça haver... outro. - $Você finalmente vai se mostrar um desafio formidável para mim?\nO desafio que anseio há milênios? - $Vamos começar.`, - "firstStageWin": `Entendo. A presença que senti era realmente real.\nParece que não preciso mais me segurar. - $Não me decepcione.`, - "secondStageWin": "…Magnífico." -}; - -// Diálogo que não se enquadra em nenhuma outra categoria (por exemplo, mensagens de tutorial ou o final do jogo). Para quando o personagem do jogador é masculino -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}Oh? Você venceu?@d{96} @c{smile_eclosed}Acho que eu deveria saber.\nMas, você está de volta agora. - $@c{smile}Acabou.@d{64} Você quebrou o ciclo. - $@c{serious_smile_fists}Você também realizou seu sonho, não é?\nVocê não perdeu nenhuma vez. - $@c{neutral}Eu sou o único que vai lembrar o que você fez.@d{96}\nAcho que está tudo bem, não é? - $@c{serious_smile_fists}Sua lenda sempre viverá em nossos corações. - $@c{smile_eclosed}Enfim, já tive o suficiente deste lugar, não é? Vamos para casa. - $@c{serious_smile_fists}Talvez quando voltarmos, possamos ter outra batalha?\nSe você estiver 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. - $@c{smile_eclosed}Claro… Eu sempre tive essa sensação.\n@c{smile}Acabou agora, certo? Você quebrou o ciclo. - $@c{smile_ehalf}Você também realizou seu sonho, não foi?\nVocê não perdeu nenhuma vez. - $Eu serei a única a lembrar o que você fez.\n@c{angry_mopen}Eu tentarei não esquecer! - $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações. - $@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar. - $Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?`, - "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.", - "ending_name": "Desenvolvedores" -}; - -// Diálogo que não se enquadra em nenhuma outra categoria (por exemplo, mensagens de tutorial ou o final do jogo). Para quando o personagem do jogador é feminino. Para idiomas que não possuem pronomes de gênero, isso pode ser definido como PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}Oh? Você venceu?@d{96} @c{smile_eclosed}Acho que eu deveria saber.\nMas, você está de volta agora. - $@c{smile}Acabou.@d{64} Você quebrou o ciclo. - $@c{serious_smile_fists}Você também realizou seu sonho, não é?\nVocê não perdeu nenhuma vez. - $@c{neutral}Eu sou o único que vai lembrar o que você fez.@d{96}\nAcho que está tudo bem, não é? - $@c{serious_smile_fists}Sua lenda sempre viverá em nossos corações. - $@c{smile_eclosed}Enfim, já tive o suficiente deste lugar, não é? Vamos para casa. - $@c{serious_smile_fists}Talvez quando voltarmos, possamos ter outra batalha?\nSe você estiver disposta.`, - "ending_female": - `@c{shock}Você está de volta?@d{32} Isso significa que…@d{96} você venceu?!\n@c{smile_ehalf}Eu deveria saber que você conseguiria. - $@c{smile_eclosed}Claro… Eu sempre tive essa sensação.\n@c{smile}Acabou agora, certo? Você quebrou o ciclo. - $@c{smile_ehalf}Você também realizou seu sonho, não foi?\nVocê não perdeu nenhuma vez. - $Eu serei a única a lembrar o que você fez.\n@c{angry_mopen}Eu tentarei não esquecer! - $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações. - $@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar. - $Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?`, - "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.", - "ending_name": "Desenvolvedores" -}; - - -// Diálogo das batalhas duplas nomeadas no jogo. Para quando o jogador é masculino (ou não definido). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `Blue: Ei Red, vamos mostrar do que somos feitos! - $Red: ... - $Blue: Este é o poder da Cidade de Pallet!`, - }, - "victory": { - 1: `Blue: Essa foi uma ótima batalha! - $Red: ...`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `Red: ...! - $Blue: Ele nunca fala muito. - $Blue: Mas não se deixe enganar! Ele é um campeão, afinal!`, - }, - "victory": { - 1: `Red: ...! - $Blue: Da próxima vez, vamos vencer você!`, - }, - }, - "tate_liza_double": { - "encounter": { - 1: `Tate: Está surpreso? - $Liza: Somos dois líderes de ginásio ao mesmo tempo! - $Tate: Somos gêmeos! - $Liza: Não precisamos falar para nos entender! - $Tate: Duas vezes o poder... - $Liza: Você consegue lidar com isso?`, - }, - "victory": { - 1: `Tate: O quê? Nossa combinação foi perfeita! - $Liza: Parece que precisamos treinar mais...`, - }, - }, - "liza_tate_double": { - "encounter": { - 1: `Liza: Hihihi... Está surpreso? - $Tate: Sim, somos realmente dois líderes de ginásio ao mesmo tempo! - $Liza: Este é meu irmão gêmeo Tate! - $Tate: E esta é minha irmã gêmea Liza! - $Liza: Não acha que somos uma combinação perfeita?` - }, - "victory": { - 1: `Liza: Nós somos... - $Tate: ...não tão fortes quanto pensávamos?`, - }, - }, - "wallace_steven_double": { - "encounter": { - 1: `Steven: Wallace, vamos mostrar a eles o poder dos campeões! - $Wallace: Vamos mostrar o poder de Hoenn! - $Steven: Vamos lá!`, - }, - "victory": { - 1: `Steven: Essa foi uma ótima batalha! - $Wallace: Vamos vencer da próxima vez!`, - }, - }, - "steven_wallace_double": { - "encounter": { - 1: `Steven: Você tem algum Pokémon raro? - $Wallace: Steven... Estamos aqui para uma batalha, não para mostrar nossos Pokémon. - $Steven: Ah... Entendi... Vamos lá então!`, - }, - "victory": { - 1: `Steven: Agora que terminamos a batalha, vamos mostrar nossos Pokémon! - $Wallace: Steven...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `Alder: Somos os treinadores mais fortes de Unova! - $Iris: Lutas contra treinadores fortes são as melhores!`, - }, - "victory": { - 1: `Alder: Uau! Você é super forte! - $Iris: Vamos vencer da próxima vez!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `Iris: Bem-vindo, Desafiante! Eu sou A Campeã de Unova! - $Alder: Iris, você não está um pouco empolgada demais?`, - }, - "victory": { - 1: `Iris: Uma derrota como essa não é fácil de engolir... - $Alder: Mas só ficaremos mais fortes a cada derrota!`, - }, - }, - "piers_marnie_double": { - "encounter": { - 1: `Marnie: Irmão, vamos mostrar a eles o poder de Spikemuth! - $Piers: Nós trazemos a escuridão!`, - }, - "victory": { - 1: `Marnie: Você trouxe luz para nossa escuridão! - $Piers: Está muito claro...`, - }, - }, - "marnie_piers_double": { - "encounter": { - 1: `Piers: Prontos para um show? - $Marnie: Irmão... Eles estão aqui para lutar, não para cantar...`, - }, - "victory": { - 1: `Piers: Agora esse foi um ótimo show! - $Marnie: Irmão...`, - }, - }, -}; - - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = { - "blue_red_double": { - "encounter": { - 1: `Blue: Ei Red, vamos mostrar do que somos feitos! - $Red: ... - $Blue: Este é o poder da Cidade de Pallet!`, - }, - "victory": { - 1: `Blue: Essa foi uma ótima batalha! - $Red: ...`, - }, - }, - "red_blue_double": { - "encounter": { - 1: `Red: ...! - $Blue: Ele nunca fala muito. - $Blue: Mas não se deixe enganar! Ele é um campeão, afinal!`, - }, - "victory": { - 1: `Red: ...! - $Blue: Da próxima vez, vamos vencer você!`, - }, - }, - "tate_liza_double": { - "encounter": { - 1: `Tate: Está surpreso? - $Liza: Somos dois líderes de ginásio ao mesmo tempo! - $Tate: Somos gêmeos! - $Liza: Não precisamos falar para nos entender! - $Tate: Duas vezes o poder... - $Liza: Você consegue lidar com isso?`, - }, - "victory": { - 1: `Tate: O quê? Nossa combinação foi perfeita! - $Liza: Parece que precisamos treinar mais...`, - }, - }, - "liza_tate_double": { - "encounter": { - 1: `Liza: Hihihi... Está surpreso? - $Tate: Sim, somos realmente dois líderes de ginásio ao mesmo tempo! - $Liza: Este é meu irmão gêmeo Tate! - $Tate: E esta é minha irmã gêmea Liza! - $Liza: Não acha que somos uma combinação perfeita?` - }, - "victory": { - 1: `Liza: Nós somos... - $Tate: ...não tão fortes quanto pensávamos?`, - }, - }, - "wallace_steven_double": { - "encounter": { - 1: `Steven: Wallace, vamos mostrar a eles o poder dos campeões! - $Wallace: Vamos mostrar o poder de Hoenn! - $Steven: Vamos lá!`, - }, - "victory": { - 1: `Steven: Essa foi uma ótima batalha! - $Wallace: Vamos vencer da próxima vez!`, - }, - }, - "steven_wallace_double": { - "encounter": { - 1: `Steven: Você tem algum Pokémon raro? - $Wallace: Steven... Estamos aqui para uma batalha, não para mostrar nossos Pokémon. - $Steven: Ah... Entendi... Vamos lá então!`, - }, - "victory": { - 1: `Steven: Agora que terminamos a batalha, vamos mostrar nossos Pokémon! - $Wallace: Steven...`, - }, - }, - "alder_iris_double": { - "encounter": { - 1: `Alder: Somos os treinadores mais fortes de Unova! - $Iris: Lutas contra treinadores fortes são as melhores!`, - }, - "victory": { - 1: `Alder: Uau! Você é super forte! - $Iris: Vamos vencer da próxima vez!`, - }, - }, - "iris_alder_double": { - "encounter": { - 1: `Iris: Bem-vinda, Desafiante! Eu sou A Campeã de Unova! - $Alder: Iris, você não está um pouco empolgada demais?`, - }, - "victory": { - 1: `Iris: Uma derrota como essa não é fácil de engolir... - $Alder: Mas só ficaremos mais fortes a cada derrota!`, - }, - }, - "piers_marnie_double": { - "encounter": { - 1: `Marnie: Irmão, vamos mostrar a eles o poder de Spikemuth! - $Piers: Nós trazemos a escuridão!`, - }, - "victory": { - 1: `Marnie: Você trouxe luz para nossa escuridão! - $Piers: Está muito claro...`, - }, - }, - "marnie_piers_double": { - "encounter": { - 1: `Piers: Prontos para um show? - $Marnie: Irmão... Eles estão aqui para lutar, não para cantar...`, - }, - "victory": { - 1: `Piers: Agora esse foi um ótimo show! - $Marnie: Irmão...`, - }, - }, -}; diff --git a/src/locales/pt_BR/egg.ts b/src/locales/pt_BR/egg.json similarity index 89% rename from src/locales/pt_BR/egg.ts rename to src/locales/pt_BR/egg.json index 6690c293aaf..a14217858b5 100644 --- a/src/locales/pt_BR/egg.ts +++ b/src/locales/pt_BR/egg.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { +{ "egg": "Ovo", "greatTier": "Raro", "ultraTier": "Épico", @@ -22,4 +20,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} nasceu do ovo!", "eggMoveUnlock": "Movimento de Ovo desbloqueado: {{moveName}}", "rareEggMoveUnlock": "Movimento Raro de Ovo desbloqueado: {{moveName}}", -} as const; + "moveUPGacha": "Movimento\nde Ovo Bônus!", + "shinyUPGacha": "Shiny Bônus!", + "legendaryUPGacha": "Bônus!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/fight-ui-handler.json b/src/locales/pt_BR/fight-ui-handler.json new file mode 100644 index 00000000000..f5c4379126d --- /dev/null +++ b/src/locales/pt_BR/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "Poder", + "accuracy": "Precisão", + "abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}", + "passive": "Passiva de " +} \ No newline at end of file diff --git a/src/locales/pt_BR/fight-ui-handler.ts b/src/locales/pt_BR/fight-ui-handler.ts deleted file mode 100644 index 6ce615ad5b1..00000000000 --- a/src/locales/pt_BR/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Poder", - "accuracy": "Precisão", - "abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}", - "passive": "Passiva de ", // The space at the end is important -} as const; diff --git a/src/locales/pt_BR/filter-bar.json b/src/locales/pt_BR/filter-bar.json new file mode 100644 index 00000000000..05898796d9f --- /dev/null +++ b/src/locales/pt_BR/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "Ger.", + "typeFilter": "Tipo", + "caughtFilter": "Capturado", + "unlocksFilter": "Desbloqueios", + "miscFilter": "Outros", + "sortFilter": "Ordem", + "all": "Tudo", + "normal": "Normal", + "uncaught": "Não Capturado", + "passive": "Passiva", + "passiveUnlocked": "Passiva Desbloqueada", + "passiveLocked": "Passiva Bloqueada", + "passiveUnlockable": "Passiva - Pode Desbloquear", + "costReduction": "Redução de Custo", + "costReductionUnlocked": "Redução de Custo Desbloq.", + "costReductionLocked": "Redução de Custo Bloqueada", + "costReductionUnlockable": "Redução de Custo Disponível", + "favorite": "Favoritos", + "isFavorite": "Favoritos - Sim", + "notFavorite": "Favoritos - Não", + "ribbon": "Fita", + "hasWon": "Fita - Sim", + "hasNotWon": "Fita - Não", + "hiddenAbility": "Habilidade Oculta", + "hasHiddenAbility": "Habilidade Oculta - Sim", + "noHiddenAbility": "Habilidade Oculta - Não", + "egg": "Ovo", + "eggPurchasable": "Ovo Comprável", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Sim", + "noPokerus": "Pokérus - Não", + "sortByNumber": "Número", + "sortByCost": "Custo", + "sortByCandies": "# Doces", + "sortByIVs": "IVs", + "sortByName": "Nome" +} \ No newline at end of file diff --git a/src/locales/pt_BR/game-mode.json b/src/locales/pt_BR/game-mode.json new file mode 100644 index 00000000000..9aa0f286959 --- /dev/null +++ b/src/locales/pt_BR/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "Clássico", + "endless": "Infinito", + "endlessSpliced": "Infinito (Fusões)", + "dailyRun": "Desafio Diário", + "unknown": "Desconhecido", + "challenge": "Desafio" +} \ No newline at end of file diff --git a/src/locales/pt_BR/game-mode.ts b/src/locales/pt_BR/game-mode.ts deleted file mode 100644 index 44396635c6c..00000000000 --- a/src/locales/pt_BR/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "Clássico", - "endless": "Infinito", - "endlessSpliced": "Infinito (Fusões)", - "dailyRun": "Desafio Diário", - "unknown": "Desconhecido", - "challenge": "Desafio", -} as const; diff --git a/src/locales/pt_BR/game-stats-ui-handler.ts b/src/locales/pt_BR/game-stats-ui-handler.json similarity index 86% rename from src/locales/pt_BR/game-stats-ui-handler.ts rename to src/locales/pt_BR/game-stats-ui-handler.json index 863f9e773f6..eb36f484cc3 100644 --- a/src/locales/pt_BR/game-stats-ui-handler.ts +++ b/src/locales/pt_BR/game-stats-ui-handler.json @@ -1,44 +1,42 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Estatísticas", - "playTime": "Tempo de Jogo", - "totalBattles": "Total de Batalhas", - "starters": "Iniciais", - "shinyStarters": "Iniciais Shiny", - "speciesSeen": "Espécies Vistas", - "speciesCaught": "Capturadas", - "ribbonsOwned": "Fitas Obtidas", - "classicRuns": "Jogos Clássicos", - "classicWins": "Vitórias Clássicas", - "dailyRunAttempts": "Jogos de Desafio Diário", - "dailyRunWins": "Vitórias de Desafio Diário", - "endlessRuns": "Jogos Infinitos", - "highestWaveEndless": "Maior Onda (Infinito)", - "highestMoney": "Maior Dinheiro", - "highestDamage": "Maior Dano", - "highestHPHealed": "Maior PS Curado", - "pokemonEncountered": "Pokémon Encontrados", - "pokemonDefeated": "Pokémon Derrotados", - "pokemonCaught": "Pokémon Capturados", - "eggsHatched": "Ovos Chocados", - "subLegendsSeen": "Sub-Lendários Vistos", - "subLegendsCaught": "Sub-Lend. Capturados", - "subLegendsHatched": "Sub-Lendários Chocados", - "legendsSeen": "Lendários Vistos", - "legendsCaught": "Lendários Capturados", - "legendsHatched": "Lendários Chocados", - "mythicalsSeen": "Míticos Vistos", - "mythicalsCaught": "Míticos Capturados", - "mythicalsHatched": "Míticos Chocados", - "shiniesSeen": "Shinies Vistos", - "shiniesCaught": "Shinies Capturados", - "shiniesHatched": "Shinies Chocados", - "pokemonFused": "Pokémon Fundidos", - "trainersDefeated": "Treinadores Derrotados", - "eggsPulled": "Ovos Ganhos", - "rareEggsPulled": "Ovos Raros Ganhos", - "epicEggsPulled": "Ovos Épicos Ganhos", - "legendaryEggsPulled": "Ovos Lendários Ganhos", - "manaphyEggsPulled": "Ovos de Manaphy Ganhos", -} as const; +{ + "stats": "Estatísticas", + "playTime": "Tempo de Jogo", + "totalBattles": "Total de Batalhas", + "starters": "Iniciais", + "shinyStarters": "Iniciais Shiny", + "speciesSeen": "Espécies Vistas", + "speciesCaught": "Capturadas", + "ribbonsOwned": "Fitas Obtidas", + "classicRuns": "Jogos Clássicos", + "classicWins": "Vitórias Clássicas", + "dailyRunAttempts": "Jogos de Desafio Diário", + "dailyRunWins": "Vitórias de Desafio Diário", + "endlessRuns": "Jogos Infinitos", + "highestWaveEndless": "Maior Onda (Infinito)", + "highestMoney": "Maior Dinheiro", + "highestDamage": "Maior Dano", + "highestHPHealed": "Maior PS Curado", + "pokemonEncountered": "Pokémon Encontrados", + "pokemonDefeated": "Pokémon Derrotados", + "pokemonCaught": "Pokémon Capturados", + "eggsHatched": "Ovos Chocados", + "subLegendsSeen": "Sub-Lendários Vistos", + "subLegendsCaught": "Sub-Lend. Capturados", + "subLegendsHatched": "Sub-Lendários Chocados", + "legendsSeen": "Lendários Vistos", + "legendsCaught": "Lendários Capturados", + "legendsHatched": "Lendários Chocados", + "mythicalsSeen": "Míticos Vistos", + "mythicalsCaught": "Míticos Capturados", + "mythicalsHatched": "Míticos Chocados", + "shiniesSeen": "Shinies Vistos", + "shiniesCaught": "Shinies Capturados", + "shiniesHatched": "Shinies Chocados", + "pokemonFused": "Pokémon Fundidos", + "trainersDefeated": "Treinadores Derrotados", + "eggsPulled": "Ovos Ganhos", + "rareEggsPulled": "Ovos Raros Ganhos", + "epicEggsPulled": "Ovos Épicos Ganhos", + "legendaryEggsPulled": "Ovos Lendários Ganhos", + "manaphyEggsPulled": "Ovos de Manaphy Ganhos" +} \ No newline at end of file diff --git a/src/locales/pt_BR/growth.json b/src/locales/pt_BR/growth.json new file mode 100644 index 00000000000..d9b11dc23c3 --- /dev/null +++ b/src/locales/pt_BR/growth.json @@ -0,0 +1,8 @@ +{ + "Erratic": "Muito Rápido", + "Fast": "Rápido", + "Medium_Fast": "Meio Rápido", + "Medium_Slow": "Meio Lento", + "Slow": "Lento", + "Fluctuating": "Muito Lento" +} \ No newline at end of file diff --git a/src/locales/pt_BR/growth.ts b/src/locales/pt_BR/growth.ts deleted file mode 100644 index 7b268ae49ef..00000000000 --- a/src/locales/pt_BR/growth.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { - "Erratic": "Muito Rápido", - "Fast": "Rápido", - "Medium_Fast": "Meio Rápido", - "Medium_Slow": "Meio Lento", - "Slow": "Lento", - "Fluctuating": "Muito Lento", -} as const; diff --git a/src/locales/pt_BR/menu-ui-handler.ts b/src/locales/pt_BR/menu-ui-handler.json similarity index 62% rename from src/locales/pt_BR/menu-ui-handler.ts rename to src/locales/pt_BR/menu-ui-handler.json index 75e5adcfd87..df654976d68 100644 --- a/src/locales/pt_BR/menu-ui-handler.ts +++ b/src/locales/pt_BR/menu-ui-handler.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { +{ "GAME_SETTINGS": "Configurações", "ACHIEVEMENTS": "Conquistas", "STATS": "Estatísticas", - "VOUCHERS": "Vouchers", + "RUN_HISTORY": "Histórico de Jogos", "EGG_LIST": "Incubadora", "EGG_GACHA": "Gacha de ovos", "MANAGE_DATA": "Gerenciar dados", @@ -16,9 +14,16 @@ export const menuUiHandler: SimpleTranslationEntries = { "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", "importData": "Importar dados", "exportData": "Exportar dados", + "consentPreferences": "Opções de Privacidade", + "linkDiscord": "Conectar Discord", + "unlinkDiscord": "Desconectar Discord", + "linkGoogle": "Conectar Google", + "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!" -} as const; + "noEggs": "Você não está chocando nenhum ovo\nno momento!" +} diff --git a/src/locales/pt_BR/menu.ts b/src/locales/pt_BR/menu.json similarity index 82% rename from src/locales/pt_BR/menu.ts rename to src/locales/pt_BR/menu.json index a200f2c9abe..415796f91ed 100644 --- a/src/locales/pt_BR/menu.ts +++ b/src/locales/pt_BR/menu.json @@ -1,11 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const menu: SimpleTranslationEntries = { +{ "cancel": "Cancelar", "continue": "Continuar", "dailyRun": "Desafio Diário (Beta)", @@ -17,6 +10,7 @@ export const menu: SimpleTranslationEntries = { "username": "Nome de Usuário", "password": "Senha", "login": "Iniciar sessão", + "orUse": "Ou use", "register": "Registrar-se", "emptyUsername": "Nome de usuário vazio", "invalidLoginUsername": "Nome de usuário inválido", @@ -34,11 +28,11 @@ export const menu: SimpleTranslationEntries = { "sessionSuccess": "Sessão carregada com sucesso.", "failedToLoadSession": "Não foi possível carregar os dados da sua sessão.\nEles podem estar corrompidos.", "boyOrGirl": "Você é um menino ou uma menina?", - "evolving": "Que?\n{{pokemonName}} tá evoluindo!", + "evolving": "Quê?\n{{pokemonName}} tá evoluindo!", "stoppedEvolving": "{{pokemonName}} parou de evoluir.", "pauseEvolutionsQuestion": "Gostaria de pausar evoluções para {{pokemonName}}?\nEvoluções podem ser religadas na tela de equipe.", "evolutionsPaused": "Evoluções foram paradas para {{pokemonName}}.", - "evolutionDone": "Parabéns!\nSeu {{pokemonName}} evolui para {{evolvedPokemonName}}!", + "evolutionDone": "Parabéns!\nSeu {{pokemonName}} evoluiu para {{evolvedPokemonName}}!", "dailyRankings": "Classificação Diária", "weeklyRankings": "Classificação Semanal", "noRankings": "Sem Classificação", @@ -54,5 +48,8 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "AVISO", "disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis\n perdas de dados salvos), sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído.", "choosePokemon": "Escolha um Pokémon.", - "errorServerDown": "Opa! Não foi possível conectar-se ao servidor.\n\nVocê pode deixar essa janela aberta,\npois o jogo irá se reconectar automaticamente.", -} as const; + "renamePokemon": "Renomear Pokémon", + "rename": "Renomear", + "nickname": "Apelido", + "errorServerDown": "Opa! Não foi possível conectar-se ao servidor.\n\nVocê pode deixar essa janela aberta,\npois o jogo irá se reconectar automaticamente." +} \ No newline at end of file diff --git a/src/locales/pt_BR/modifier-select-ui-handler.json b/src/locales/pt_BR/modifier-select-ui-handler.json new file mode 100644 index 00000000000..4aef7f145ae --- /dev/null +++ b/src/locales/pt_BR/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "Alterar", + "reroll": "Atualizar", + "lockRarities": "Travar Raridades", + "checkTeam": "Checar Time", + "transferDesc": "Transfira um item segurado de um Pokémon para outro.", + "rerollDesc": "Gaste dinheiro para atualizar as suas opções de itens.", + "lockRaritiesDesc": "Trava a raridade dos itens na atualização (afeta o custo da atualização).", + "checkTeamDesc": "Cheque seu time ou use um item de mudança de forma.", + "rerollCost": "₽{{formattedMoney}}", + "itemCost": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/pt_BR/modifier-type.json b/src/locales/pt_BR/modifier-type.json new file mode 100644 index 00000000000..f20a4ef3d0f --- /dev/null +++ b/src/locales/pt_BR/modifier-type.json @@ -0,0 +1,607 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{modifierCount}}x {{pokeballName}}", + "description": "Ganhe {{modifierCount}}x {{pokeballName}} (Mochila: {{pokeballAmount}}) \nChance de captura: {{catchRate}}." + }, + "AddVoucherModifierType": { + "name": "{{modifierCount}}x {{voucherTypeName}}", + "description": "Ganhe {{modifierCount}}x {{voucherTypeName}}." + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}} não pode\nsegurar esse item!", + "tooMany": "{{pokemonName}} tem muitos\nmuitos deste item!" + } + }, + "PokemonHpRestoreModifierType": { + "description": "Restaura {{restorePoints}} PS ou {{restorePercent}}% PS de um Pokémon, o que for maior.", + "extra": { + "fully": "Restaura totalmente os PS de um Pokémon.", + "fullyWithStatus": "Restaura totalmente os PS de um Pokémon e cura qualquer mudança de estado." + } + }, + "PokemonReviveModifierType": { + "description": "Reanima um Pokémon e restaura {{restorePercent}}% PS." + }, + "PokemonStatusHealModifierType": { + "description": "Cura uma mudança de estado de um Pokémon." + }, + "PokemonPpRestoreModifierType": { + "description": "Restaura {{restorePoints}} PP para um movimento de um Pokémon.", + "extra": { + "fully": "Restaura todos os PP para um movimento de um Pokémon." + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "Restaura {{restorePoints}} PP para todos os movimentos de um Pokémon.", + "extra": { + "fully": "Restaura todos os PP para todos os movimentos de um Pokémon." + } + }, + "PokemonPpUpModifierType": { + "description": "Aumenta permanentemente os PP para o movimento de um Pokémon em {{upPoints}} para cada 5 PP máximos (máximo 3)." + }, + "PokemonNatureChangeModifierType": { + "name": "Hortelã {{natureName}}", + "description": "Muda a natureza do Pokémon para {{natureName}} e a desbloqueia permanentemente." + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "Quadruplica as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas." + }, + "TempStatStageBoosterModifierType": { + "description": "Aumenta o atributo de {{stat}} para todos os membros da equipe em {{amount}} por 5 batalhas.", + "extra": { + "stage": "um nível", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "Aumenta o poder dos ataques do tipo {{moveType}} de um Pokémon em 20%." + }, + "PokemonLevelIncrementModifierType": { + "description": "Aumenta em {{levels}} o nível de um Pokémon." + }, + "AllPokemonLevelIncrementModifierType": { + "description": "Aumenta em {{levels}} o nível de todos os membros da equipe." + }, + "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." + }, + "AllPokemonFullReviveModifierType": { + "description": "Reanima todos os Pokémon, restaurando totalmente seus PS." + }, + "MoneyRewardModifierType": { + "description": "Garante uma quantidade {{moneyMultiplier}} de dinheiro (₽{{moneyAmount}}).", + "extra": { + "small": "pequena", + "moderate": "moderada", + "large": "grande" + } + }, + "ExpBoosterModifierType": { + "description": "Aumenta o ganho de pontos de experiência em {{boostPercent}}%." + }, + "PokemonExpBoosterModifierType": { + "description": "Aumenta o ganho de pontos de experiência de quem segura em {{boostPercent}}%." + }, + "PokemonFriendshipBoosterModifierType": { + "description": "Aumenta o ganho de amizade por vitória em 50%." + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "Aumenta a precisão dos movimentos em {{accuracyAmount}} (máximo 100)." + }, + "PokemonMultiHitModifierType": { + "description": "Ataques acertam uma vez adicional ao custo de uma redução de poder de 60/75/82.5% por item, respectivamente." + }, + "TmModifierType": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "Ensina {{moveName}} a um Pokémon." + }, + "TmModifierTypeWithInfo": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "Ensina {{moveName}} a um Pokémon\n(Segure C ou Shift para mais informações)." + }, + "EvolutionItemModifierType": { + "description": "Faz certos Pokémon evoluírem." + }, + "FormChangeItemModifierType": { + "description": "Faz certos Pokémon mudarem de forma." + }, + "FusePokemonModifierType": { + "description": "Combina dois Pokémon (transfere Habilidade, divide os atributos base e tipos, compartilha os movimentos)." + }, + "TerastallizeModifierType": { + "name": "Fragmento Tera {{teraType}}", + "description": "Terastalize um Pokémon para o tipo {{teraType}} por 10 ondas." + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "Quando atacar, tem {{chancePercent}}% de chance de roubar um item do oponente." + }, + "TurnHeldItemTransferModifierType": { + "description": "Todo turno, o Pokémon ganha um item aleatório do oponente." + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "Ganha {{chancePercent}}% de chance de infligir {{statusEffect}} com ataques." + }, + "EnemyEndureChanceModifierType": { + "description": "Ganha {{chancePercent}}% de chance de sobreviver a um ataque que o faria desmaiar." + }, + "RARE_CANDY": { + "name": "Doce Raro" + }, + "RARER_CANDY": { + "name": "Doce Raríssimo" + }, + "MEGA_BRACELET": { + "name": "Mega Bracelete", + "description": "Mega Pedras ficam disponíveis." + }, + "DYNAMAX_BAND": { + "name": "Bracelete Dynamax", + "description": "Cogumáximos ficam disponíveis." + }, + "TERA_ORB": { + "name": "Orbe Tera", + "description": "Fragmentos Tera ficam disponíveis." + }, + "MAP": { + "name": "Mapa", + "description": "Permite escolher a próxima rota." + }, + "POTION": { + "name": "Poção" + }, + "SUPER_POTION": { + "name": "Super Poção" + }, + "HYPER_POTION": { + "name": "Hiper Poção" + }, + "MAX_POTION": { + "name": "Poção Máxima" + }, + "FULL_RESTORE": { + "name": "Restaurador" + }, + "REVIVE": { + "name": "Reanimador" + }, + "MAX_REVIVE": { + "name": "Reanimador Máximo" + }, + "FULL_HEAL": { + "name": "Cura Total" + }, + "SACRED_ASH": { + "name": "Cinza Sagrada" + }, + "REVIVER_SEED": { + "name": "Semente Reanimadora", + "description": "Após desmaiar por um ataque direto, reanima com 50% de PS." + }, + "WHITE_HERB": { + "name": "Erva Branca", + "description": "Restaura quaisquer atributos diminuídos em batalha." + }, + "ETHER": { + "name": "Éter" + }, + "MAX_ETHER": { + "name": "Éter Máximo" + }, + "ELIXIR": { + "name": "Elixir" + }, + "MAX_ELIXIR": { + "name": "Elixir Máximo" + }, + "PP_UP": { + "name": "Mais PP" + }, + "PP_MAX": { + "name": "PP Máximo" + }, + "LURE": { + "name": "Incenso" + }, + "SUPER_LURE": { + "name": "Super Incenso" + }, + "MAX_LURE": { + "name": "Incenso Máximo" + }, + "MEMORY_MUSHROOM": { + "name": "Cogumemória", + "description": "Relembra um movimento esquecido." + }, + "EXP_SHARE": { + "name": "Compart. de Exp.", + "description": "Distribui pontos de experiência para todos os membros da equipe." + }, + "EXP_BALANCE": { + "name": "Balanceador de Exp.", + "description": "Distribui pontos de experiência principalmente para os Pokémon mais fracos." + }, + "OVAL_CHARM": { + "name": "Amuleto Oval", + "description": "Quando vários Pokémon participam de uma batalha, cada um recebe 10% extra de pontos de experiência." + }, + "EXP_CHARM": { + "name": "Amuleto de Exp." + }, + "SUPER_EXP_CHARM": { + "name": "Super Amuleto de Exp." + }, + "GOLDEN_EXP_CHARM": { + "name": "Amuleto de Exp. Dourado" + }, + "LUCKY_EGG": { + "name": "Ovo da Sorte" + }, + "GOLDEN_EGG": { + "name": "Ovo Dourado" + }, + "SOOTHE_BELL": { + "name": "Guizo" + }, + "SCOPE_LENS": { + "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." + }, + "EVIOLITE": { + "name": "Eviolita", + "description": "Esse misterioso caroço evolutivo aumenta os atributos de Defesa e Def. Esp. quando segurado por um Pokémon que ainda pode evoluir." + }, + "SOUL_DEW": { + "name": "Joia da Alma", + "description": "Aumenta a influência da natureza de um Pokémon em seus atributos em 10% (cumulativo)." + }, + "NUGGET": { + "name": "Pepita" + }, + "BIG_NUGGET": { + "name": "Pepita Grande" + }, + "RELIC_GOLD": { + "name": "Relíquia de Ouro" + }, + "AMULET_COIN": { + "name": "Moeda Amuleto", + "description": "Aumenta a recompensa de dinheiro em 50%." + }, + "GOLDEN_PUNCH": { + "name": "Soco Dourado", + "description": "Concede 50% do dano causado em dinheiro." + }, + "COIN_CASE": { + "name": "Moedeira", + "description": "Após cada 10ª batalha, recebe 10% de seu dinheiro em juros." + }, + "LOCK_CAPSULE": { + "name": "Cápsula de Travamento", + "description": "Permite que você trave raridades de itens ao rolar novamente." + }, + "GRIP_CLAW": { + "name": "Garra-Aperto" + }, + "WIDE_LENS": { + "name": "Lente Ampla" + }, + "MULTI_LENS": { + "name": "Multi Lentes" + }, + "HEALING_CHARM": { + "name": "Amuleto de Cura", + "description": "Aumenta a eficácia dos movimentos e itens que restauram PS em 10% (exceto Reanimador)." + }, + "CANDY_JAR": { + "name": "Pote de Doces", + "description": "Aumenta o número de níveis adicionados pelo Doce Raro em 1." + }, + "BERRY_POUCH": { + "name": "Bolsa de Berries", + "description": "Adiciona uma chance de 30% de que uma berry usada não seja consumida." + }, + "FOCUS_BAND": { + "name": "Bandana", + "description": "Adiciona uma chance de 10% de sobreviver com 1 PS após ser danificado o suficiente para desmaiar." + }, + "QUICK_CLAW": { + "name": "Garra Rápida", + "description": "Adiciona uma chance de 10% de atacar primeiro, ignorando sua velocidade (após prioridades)." + }, + "KINGS_ROCK": { + "name": "Pedra do Rei", + "description": "Adiciona uma chance de 10% de movimentos fazerem o oponente hesitar." + }, + "LEFTOVERS": { + "name": "Sobras", + "description": "Cura 1/16 dos PS máximos de um Pokémon a cada turno." + }, + "SHELL_BELL": { + "name": "Concha-Sino", + "description": "Cura 1/8 do dano causado por um Pokémon." + }, + "TOXIC_ORB": { + "name": "Esfera Tóxica", + "description": "Uma esfera estranha que exala toxinas quando tocada e envenena seriamente quem a segurar." + }, + "FLAME_ORB": { + "name": "Esfera da Chama", + "description": "Uma esfera estranha que aquece quando tocada e queima quem a segurar." + }, + "BATON": { + "name": "Bastão", + "description": "Permite passar mudanças de atributo ao trocar Pokémon, ignorando armadilhas." + }, + "SHINY_CHARM": { + "name": "Amuleto Brilhante", + "description": "Aumenta drasticamente a chance de um Pokémon selvagem ser Shiny." + }, + "ABILITY_CHARM": { + "name": "Amuleto de Habilidade", + "description": "Aumenta drasticamente a chance de um Pokémon selvagem ter uma Habilidade Oculta." + }, + "IV_SCANNER": { + "name": "Scanner de IVs", + "description": "Permite escanear os IVs de Pokémon selvagens. 2 IVs são revelados por item. Os melhores IVs são mostrados primeiro." + }, + "DNA_SPLICERS": { + "name": "Splicer de DNA" + }, + "MINI_BLACK_HOLE": { + "name": "Mini Buraco Negro" + }, + "GOLDEN_POKEBALL": { + "name": "Poké Bola Dourada", + "description": "Adiciona 1 opção de item extra ao final de cada batalha." + }, + "ENEMY_DAMAGE_BOOSTER": { + "name": "Token de Dano", + "description": "Aumenta o dano em 5%." + }, + "ENEMY_DAMAGE_REDUCTION": { + "name": "Token de Proteção", + "description": "Reduz o dano recebido em 2,5%." + }, + "ENEMY_HEAL": { + "name": "Token de Recuperação", + "description": "Cura 2% dos PS máximos a cada turno." + }, + "ENEMY_ATTACK_POISON_CHANCE": { + "name": "Token de Veneno" + }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { + "name": "Token de Paralisia" + }, + "ENEMY_ATTACK_BURN_CHANCE": { + "name": "Token de Queimadura" + }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { + "name": "Token de Cura Total", + "description": "Adiciona uma chance de 2.5% a cada turno de curar uma condição de status." + }, + "ENEMY_ENDURE_CHANCE": { + "name": "Token de Persistência" + }, + "ENEMY_FUSED_CHANCE": { + "name": "Token de Fusão", + "description": "Adiciona uma chance de 1% de que um Pokémon selvagem seja uma fusão." + } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { + "name": "Bola de Luz", + "description": "Orbe intrigante que aumenta os atributos de Ataque e Ataque Esp. de Pikachu." + }, + "THICK_CLUB": { + "name": "Osso Grosso", + "description": "Este duro osso de origem desconhecida aumenta o atributo de Ataque de Cubone ou Marowak." + }, + "METAL_POWDER": { + "name": "Pó Metálico", + "description": "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Defesa de Ditto." + }, + "QUICK_POWDER": { + "name": "Pó Veloz", + "description": "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Velocidade de Ditto." + } + }, + "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" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "Lenço de Seda", + "black_belt": "Faixa Preta", + "sharp_beak": "Bico Afiado", + "poison_barb": "Farpa Venenosa", + "soft_sand": "Areia Macia", + "hard_stone": "Pedra Dura", + "silver_powder": "Pó de Prata", + "spell_tag": "Talismã de Feitiço", + "metal_coat": "Revestimento Metálico", + "charcoal": "Carvão", + "mystic_water": "Água Mística", + "miracle_seed": "Semente Milagrosa", + "magnet": "Ímã", + "twisted_spoon": "Colher Torcida", + "never_melt_ice": "Gelo Eterno", + "dragon_fang": "Presa de Dragão", + "black_glasses": "Óculos Escuros", + "fairy_feather": "Pena de Fada" + }, + "BaseStatBoosterItem": { + "hp_up": "Mais PS", + "protein": "Proteína", + "iron": "Ferro", + "calcium": "Cálcio", + "zinc": "Zinco", + "carbos": "Carboidrato" + }, + "EvolutionItem": { + "NONE": "None", + "LINKING_CORD": "Cabo de Conexão", + "SUN_STONE": "Pedra do Sol", + "MOON_STONE": "Pedra da Lua", + "LEAF_STONE": "Pedra da Folha", + "FIRE_STONE": "Pedra do Fogo", + "WATER_STONE": "Pedra da Água", + "THUNDER_STONE": "Pedra do Trovão", + "ICE_STONE": "Pedra do Gelo", + "DUSK_STONE": "Pedra do Crepúsculo", + "DAWN_STONE": "Pedra da Alvorada", + "SHINY_STONE": "Pedra Brilhante", + "CRACKED_POT": "Vaso Quebrado", + "SWEET_APPLE": "Maçã Doce", + "TART_APPLE": "Maçã Azeda", + "STRAWBERRY_SWEET": "Doce de Morango", + "UNREMARKABLE_TEACUP": "Xícara Comum", + "CHIPPED_POT": "Pote Lascado", + "BLACK_AUGURITE": "Mineral Negro", + "GALARICA_CUFF": "Bracelete de Galar", + "GALARICA_WREATH": "Coroa de Galar", + "PEAT_BLOCK": "Bloco de Turfa", + "AUSPICIOUS_ARMOR": "Armadura Prometida", + "MALICIOUS_ARMOR": "Armadura Maldita", + "MASTERPIECE_TEACUP": "Xícara Excepcional", + "METAL_ALLOY": "Liga de Metal", + "SCROLL_OF_DARKNESS": "Pergaminho da Escuridão", + "SCROLL_OF_WATERS": "Pergaminho da Água", + "SYRUPY_APPLE": "Xarope de Maçã" + }, + "FormChangeItem": { + "NONE": "None", + "ABOMASITE": "Abomasita", + "ABSOLITE": "Absolita", + "AERODACTYLITE": "Aerodactylita", + "AGGRONITE": "Aggronita", + "ALAKAZITE": "Alakazita", + "ALTARIANITE": "Altarianita", + "AMPHAROSITE": "Ampharosita", + "AUDINITE": "Audinita", + "BANETTITE": "Banettita", + "BEEDRILLITE": "Beedrillita", + "BLASTOISINITE": "Blastoisinita", + "BLAZIKENITE": "Blazikenita", + "CAMERUPTITE": "Cameruptita", + "CHARIZARDITE_X": "Charizardita X", + "CHARIZARDITE_Y": "Charizardita Y", + "DIANCITE": "Diancita", + "GALLADITE": "Galladita", + "GARCHOMPITE": "Garchompita", + "GARDEVOIRITE": "Gardevoirita", + "GENGARITE": "Gengarita", + "GLALITITE": "Glalitita", + "GYARADOSITE": "Gyaradosita", + "HERACRONITE": "Heracronita", + "HOUNDOOMINITE": "Houndoominita", + "KANGASKHANITE": "Kangaskhanita", + "LATIASITE": "Latiasita", + "LATIOSITE": "Latiosita", + "LOPUNNITE": "Lopunnita", + "LUCARIONITE": "Lucarionita", + "MANECTITE": "Manectita", + "MAWILITE": "Mawilita", + "MEDICHAMITE": "Medichamita", + "METAGROSSITE": "Metagrossita", + "MEWTWONITE_X": "Mewtwonita X", + "MEWTWONITE_Y": "Mewtwonita Y", + "PIDGEOTITE": "Pidgeotita", + "PINSIRITE": "Pinsirita", + "RAYQUAZITE": "Rayquazita", + "SABLENITE": "Sablenita", + "SALAMENCITE": "Salamencita", + "SCEPTILITE": "Sceptilita", + "SCIZORITE": "Scizorita", + "SHARPEDONITE": "Sharpedonita", + "SLOWBRONITE": "Slowbronita", + "STEELIXITE": "Steelixita", + "SWAMPERTITE": "Swampertita", + "TYRANITARITE": "Tyranitarita", + "VENUSAURITE": "Venusaurita", + "BLUE_ORB": "Orbe Azul", + "RED_ORB": "Orbe Vermelha", + "SHARP_METEORITE": "Meteorito Afiado", + "HARD_METEORITE": "Meteorito Duro", + "SMOOTH_METEORITE": " Meteorito Liso", + "ADAMANT_CRYSTAL": "Cristal Adamante", + "LUSTROUS_GLOBE": "Globo Brilhante", + "GRISEOUS_CORE": "Núcleo Platinado", + "REVEAL_GLASS": "Espelho da Verdade", + "GRACIDEA": "Gracídea", + "MAX_MUSHROOMS": "Cogumáximo", + "DARK_STONE": "Pedra das Trevas", + "LIGHT_STONE": "Pedra da Luz", + "PRISON_BOTTLE": "Garrafa Prisão", + "N_LUNARIZER": "Lunarizador N", + "N_SOLARIZER": "Solarizador N", + "RUSTED_SWORD": "Espada Enferrujada", + "RUSTED_SHIELD": "Escudo Enferrujado", + "ICY_REINS_OF_UNITY": "Rédeas de Gelo da União", + "SHADOW_REINS_OF_UNITY": "Rédeas Sombrias da União", + "WELLSPRING_MASK": "Máscara Nascente", + "HEARTHFLAME_MASK": "Máscara Fornalha", + "CORNERSTONE_MASK": "Máscara Alicerce", + "SHOCK_DRIVE": "MagneDisco", + "BURN_DRIVE": "IgneDisco", + "CHILL_DRIVE": "CrioDisco", + "DOUSE_DRIVE": "HidroDisco", + "ULTRANECROZIUM_Z": "Ultranecrozium Z", + "FIST_PLATE": "Placa do Punho", + "SKY_PLATE": "Placa do Céu", + "TOXIC_PLATE": "Placa Tóxica", + "EARTH_PLATE": "Placa Terrestre", + "STONE_PLATE": "Placa de Pedra", + "INSECT_PLATE": "Placa de Insetos", + "SPOOKY_PLATE": "Placa Assustadora", + "IRON_PLATE": "Placa de Ferro", + "FLAME_PLATE": "Placa da Chama", + "SPLASH_PLATE": "Placa de Respingo", + "MEADOW_PLATE": "Placa da Planície", + "ZAP_PLATE": "Placa Elétrica", + "MIND_PLATE": "Placa Mental", + "ICICLE_PLATE": "Placa de Gelo", + "DRACO_PLATE": "Placa do Dragão", + "DREAD_PLATE": "Placa Sombria", + "PIXIE_PLATE": "Placa de Fada", + "BLANK_PLATE": "Placa em Branco", + "LEGEND_PLATE": "Placa Lendária", + "FIGHTING_MEMORY": "Memória de Lutador", + "FLYING_MEMORY": "Memória Voadora", + "POISON_MEMORY": "Memória Venenosa", + "GROUND_MEMORY": "Memória Terrestre", + "ROCK_MEMORY": "Memória da Rocha", + "BUG_MEMORY": "Memória de Insetos", + "GHOST_MEMORY": "Memória Fantasma", + "STEEL_MEMORY": "Memória de Aço", + "FIRE_MEMORY": "Memória de Fogo", + "WATER_MEMORY": "Memória da Água", + "GRASS_MEMORY": "Memória de Planta", + "ELECTRIC_MEMORY": "Memória Elétrica", + "PSYCHIC_MEMORY": "Memória Psíquica", + "ICE_MEMORY": "Memória de Gelo", + "DRAGON_MEMORY": "Memória do Dragão", + "DARK_MEMORY": "Memória Sombria", + "FAIRY_MEMORY": "Memória de Fada", + "NORMAL_MEMORY": "Memória Normal" + } +} diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts deleted file mode 100644 index a6504b931f0..00000000000 --- a/src/locales/pt_BR/modifier-type.ts +++ /dev/null @@ -1,451 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - "AddPokeballModifierType": { - name: "{{modifierCount}}x {{pokeballName}}", - description: "Ganhe {{modifierCount}}x {{pokeballName}} (Mochila: {{pokeballAmount}}) \nChance de captura: {{catchRate}}.", - }, - "AddVoucherModifierType": { - name: "{{modifierCount}}x {{voucherTypeName}}", - description: "Ganhe {{modifierCount}}x {{voucherTypeName}}.", - }, - "PokemonHeldItemModifierType": { - extra: { - "inoperable": "{{pokemonName}} não pode\nsegurar esse item!", - "tooMany": "{{pokemonName}} tem muitos\nmuitos deste item!", - } - }, - "PokemonHpRestoreModifierType": { - description: "Restaura {{restorePoints}} PS ou {{restorePercent}}% PS de um Pokémon, o que for maior.", - extra: { - "fully": "Restaura totalmente os PS de um Pokémon.", - "fullyWithStatus": "Restaura totalmente os PS de um Pokémon e cura qualquer mudança de estado.", - } - }, - "PokemonReviveModifierType": { - description: "Reanima um Pokémon e restaura {{restorePercent}}% PS.", - }, - "PokemonStatusHealModifierType": { - description: "Cura uma mudança de estado de um Pokémon.", - }, - "PokemonPpRestoreModifierType": { - description: "Restaura {{restorePoints}} PP para um movimento de um Pokémon.", - extra: { - "fully": "Restaura todos os PP para um movimento de um Pokémon.", - } - }, - "PokemonAllMovePpRestoreModifierType": { - description: "Restaura {{restorePoints}} PP para todos os movimentos de um Pokémon.", - extra: { - "fully": "Restaura todos os PP para todos os movimentos de um Pokémon.", - } - }, - "PokemonPpUpModifierType": { - description: "Aumenta permanentemente os PP para o movimento de um Pokémon em {{upPoints}} para cada 5 PP máximos (máximo 3).", - }, - "PokemonNatureChangeModifierType": { - name: "Hortelã {{natureName}}", - description: "Muda a natureza do Pokémon para {{natureName}} e a desbloqueia permanentemente.", - }, - "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.", - }, - "AttackTypeBoosterModifierType": { - description: "Aumenta o poder dos ataques do tipo {{moveType}} de um Pokémon em 20%.", - }, - "PokemonLevelIncrementModifierType": { - description: "Aumenta em 1 o nível de um Pokémon.", - }, - "AllPokemonLevelIncrementModifierType": { - description: "Aumenta em 1 os níveis de todos os Pokémon.", - }, - "PokemonBaseStatBoosterModifierType": { - description: "Aumenta o atributo base de {{statName}} em 10%. Quanto maior os IVs, maior o limite de aumento.", - }, - "AllPokemonFullHpRestoreModifierType": { - description: "Restaura totalmente os PS de todos os Pokémon.", - }, - "AllPokemonFullReviveModifierType": { - description: "Reanima todos os Pokémon, restaurando totalmente seus PS.", - }, - "MoneyRewardModifierType": { - description: "Garante uma quantidade {{moneyMultiplier}} de dinheiro (₽{{moneyAmount}}).", - extra: { - "small": "pequena", - "moderate": "moderada", - "large": "grande", - }, - }, - "ExpBoosterModifierType": { - description: "Aumenta o ganho de pontos de experiência em {{boostPercent}}%.", - }, - "PokemonExpBoosterModifierType": { - description: "Aumenta o ganho de pontos de experiência de quem segura em {{boostPercent}}%.", - }, - "PokemonFriendshipBoosterModifierType": { - description: "Aumenta o ganho de amizade por vitória em 50%.", - }, - "PokemonMoveAccuracyBoosterModifierType": { - description: "Aumenta a precisão dos movimentos em {{accuracyAmount}} (máximo 100).", - }, - "PokemonMultiHitModifierType": { - description: "Ataques acertam uma vez adicional ao custo de uma redução de poder de 60/75/82.5% por item, respectivamente.", - }, - "TmModifierType": { - name: "TM{{moveId}} - {{moveName}}", - description: "Ensina {{moveName}} a um Pokémon.", - }, - "TmModifierTypeWithInfo": { - name: "TM{{moveId}} - {{moveName}}", - description: "Ensina {{moveName}} a um Pokémon\n(Segure C ou Shift para mais informações).", - }, - "EvolutionItemModifierType": { - description: "Faz certos Pokémon evoluírem.", - }, - "FormChangeItemModifierType": { - description: "Faz certos Pokémon mudarem de forma.", - }, - "FusePokemonModifierType": { - description: "Combina dois Pokémon (transfere Habilidade, divide os atributos base e tipos, compartilha os movimentos).", - }, - "TerastallizeModifierType": { - name: "Fragmento Tera {{teraType}}", - description: "Terastalize um Pokémon para o tipo {{teraType}} por 10 ondas.", - }, - "ContactHeldItemTransferChanceModifierType": { - description: "Quando atacar, tem {{chancePercent}}% de chance de roubar um item do oponente.", - }, - "TurnHeldItemTransferModifierType": { - description: "Todo turno, o Pokémon ganha um item aleatório do oponente.", - }, - "EnemyAttackStatusEffectChanceModifierType": { - description: "Ganha {{chancePercent}}% de chance de infligir {{statusEffect}} com ataques.", - }, - "EnemyEndureChanceModifierType": { - description: "Ganha {{chancePercent}}% de chance de sobreviver a um ataque que o faria desmaiar.", - }, - - "RARE_CANDY": { name: "Doce Raro" }, - "RARER_CANDY": { name: "Doce Raríssimo" }, - - "MEGA_BRACELET": { name: "Mega Bracelete", description: "Mega Pedras ficam disponíveis." }, - "DYNAMAX_BAND": { name: "Bracelete Dynamax", description: "Cogumáximos ficam disponíveis." }, - "TERA_ORB": { name: "Orbe Tera", description: "Fragmentos Tera ficam disponíveis." }, - - "MAP": { name: "Mapa", description: "Permite escolher a próxima rota." }, - - "POTION": { name: "Poção" }, - "SUPER_POTION": { name: "Super Poção" }, - "HYPER_POTION": { name: "Hiper Poção" }, - "MAX_POTION": { name: "Poção Máxima" }, - "FULL_RESTORE": { name: "Restaurador" }, - - "REVIVE": { name: "Reanimador" }, - "MAX_REVIVE": { name: "Reanimador Máximo" }, - - "FULL_HEAL": { name: "Cura Total" }, - - "SACRED_ASH": { name: "Cinza Sagrada" }, - - "REVIVER_SEED": { name: "Semente Reanimadora", description: "Após desmaiar, reanima com 50% de PS." }, - - "ETHER": { name: "Éter" }, - "MAX_ETHER": { name: "Éter Máximo" }, - - "ELIXIR": { name: "Elixir" }, - "MAX_ELIXIR": { name: "Elixir Máximo" }, - - "PP_UP": { name: "Mais PP" }, - "PP_MAX": { name: "PP Máximo" }, - - "LURE": { name: "Incenso" }, - "SUPER_LURE": { name: "Super Incenso" }, - "MAX_LURE": { name: "Incenso Máximo" }, - - "MEMORY_MUSHROOM": { name: "Cogumemória", description: "Relembra um movimento esquecido." }, - - "EXP_SHARE": { name: "Compart. de Exp.", description: "Distribui pontos de experiência para todos os membros da equipe." }, - "EXP_BALANCE": { name: "Balanceador de Exp.", description: "Distribui pontos de experiência principalmente para os Pokémon mais fracos." }, - - "OVAL_CHARM": { name: "Amuleto Oval", description: "Quando vários Pokémon participam de uma batalha, cada um recebe 10% extra de pontos de experiência." }, - - "EXP_CHARM": { name: "Amuleto de Exp." }, - "SUPER_EXP_CHARM": { name: "Super Amuleto de Exp." }, - "GOLDEN_EXP_CHARM": { name: "Amuleto de Exp. Dourado" }, - - "LUCKY_EGG": { name: "Ovo da Sorte" }, - "GOLDEN_EGG": { name: "Ovo Dourado" }, - - "SOOTHE_BELL": { name: "Guizo" }, - - "EVIOLITE": { name: "Eviolita", description: "Esse misterioso caroço evolutivo aumenta os atributos de Defesa e Def. Esp. quando segurado por um Pokémon que ainda pode evoluir." }, - - "SOUL_DEW": { name: "Joia da Alma", description: "Aumenta a influência da natureza de um Pokémon em seus atributos em 10% (cumulativo)." }, - - "NUGGET": { name: "Pepita" }, - "BIG_NUGGET": { name: "Pepita Grande" }, - "RELIC_GOLD": { name: "Relíquia de Ouro" }, - - "AMULET_COIN": { name: "Moeda Amuleto", description: "Aumenta a recompensa de dinheiro em 50%." }, - "GOLDEN_PUNCH": { name: "Soco Dourado", description: "Concede 50% do dano causado em dinheiro." }, - "COIN_CASE": { name: "Moedeira", description: "Após cada 10ª batalha, recebe 10% de seu dinheiro em juros." }, - - "LOCK_CAPSULE": { name: "Cápsula de Travamento", description: "Permite que você trave raridades de itens ao rolar novamente." }, - - "GRIP_CLAW": { name: "Garra-Aperto" }, - "WIDE_LENS": { name: "Lente Ampla" }, - - "MULTI_LENS": { name: "Multi Lentes" }, - - "HEALING_CHARM": { name: "Amuleto de Cura", description: "Aumenta a eficácia dos movimentos e itens que restauram PS em 10% (exceto Reanimador)." }, - "CANDY_JAR": { name: "Pote de Doces", description: "Aumenta o número de níveis adicionados pelo Doce Raro em 1." }, - - "BERRY_POUCH": { name: "Bolsa de Berries", description: "Adiciona uma chance de 30% de que uma berry usada não seja consumida." }, - - "FOCUS_BAND": { name: "Bandana", description: "Adiciona uma chance de 10% de sobreviver com 1 PS após ser danificado o suficiente para desmaiar." }, - - "QUICK_CLAW": { name: "Garra Rápida", description: "Adiciona uma chance de 10% de atacar primeiro, ignorando sua velocidade (após prioridades)." }, - - "KINGS_ROCK": { name: "Pedra do Rei", description: "Adiciona uma chance de 10% de movimentos fazerem o oponente hesitar." }, - - "LEFTOVERS": { name: "Sobras", description: "Cura 1/16 dos PS máximos de um Pokémon a cada turno." }, - "SHELL_BELL": { name: "Concha-Sino", description: "Cura 1/8 do dano causado por um Pokémon." }, - - "TOXIC_ORB": { name: "Esfera Tóxica", description: "Uma esfera estranha que exala toxinas quando tocada e envenena seriamente quem a segurar." }, - "FLAME_ORB": { name: "Esfera da Chama", description: "Uma esfera estranha que aquece quando tocada e queima quem a segurar." }, - - "BATON": { name: "Bastão", description: "Permite passar mudanças de atributo ao trocar Pokémon, ignorando armadilhas." }, - - "SHINY_CHARM": { name: "Amuleto Brilhante", description: "Aumenta drasticamente a chance de um Pokémon selvagem ser Shiny." }, - "ABILITY_CHARM": { name: "Amuleto de Habilidade", description: "Aumenta drasticamente a chance de um Pokémon selvagem ter uma Habilidade Oculta." }, - - "IV_SCANNER": { name: "Scanner de IVs", description: "Permite escanear os IVs de Pokémon selvagens. 2 IVs são revelados por item. Os melhores IVs são mostrados primeiro." }, - - "DNA_SPLICERS": { name: "Splicer de DNA" }, - - "MINI_BLACK_HOLE": { name: "Mini Buraco Negro" }, - - "GOLDEN_POKEBALL": { name: "Poké Bola Dourada", description: "Adiciona 1 opção de item extra ao final de cada batalha." }, - - "ENEMY_DAMAGE_BOOSTER": { name: "Token de Dano", description: "Aumenta o dano em 5%." }, - "ENEMY_DAMAGE_REDUCTION": { name: "Token de Proteção", description: "Reduz o dano recebido em 2,5%." }, - "ENEMY_HEAL": { name: "Token de Recuperação", description: "Cura 2% dos PS máximos a cada turno." }, - "ENEMY_ATTACK_POISON_CHANCE": { name: "Token de Veneno" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Token de Paralisia" }, - "ENEMY_ATTACK_BURN_CHANCE": { name: "Token de Queimadura" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Token de Cura Total", description: "Adiciona uma chance de 2.5% a cada turno de curar uma condição de status." }, - "ENEMY_ENDURE_CHANCE": { name: "Token de Persistência" }, - "ENEMY_FUSED_CHANCE": { name: "Token de Fusão", description: "Adiciona uma chance de 1% de que um Pokémon selvagem seja uma fusão." }, - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "Bola de Luz", description: "Orbe intrigante que aumenta os atributos de Ataque e Ataque Esp. de Pikachu." }, - "THICK_CLUB": { name: "Osso Grosso", description: "Este duro osso de origem desconhecida aumenta o atributo de Ataque de Cubone ou Marowak." }, - "METAL_POWDER": { name: "Pó Metálico", description: "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Defesa de Ditto." }, - "QUICK_POWDER": { name: "Pó Veloz", description: "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Velocidade de Ditto." } - }, - TempBattleStatBoosterItem: { - "x_attack": "Ataque X", - "x_defense": "Defesa X", - "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": "???", - }, - - AttackTypeBoosterItem: { - "silk_scarf": "Lenço de Seda", - "black_belt": "Faixa Preta", - "sharp_beak": "Bico Afiado", - "poison_barb": "Farpa Venenosa", - "soft_sand": "Areia Macia", - "hard_stone": "Pedra Dura", - "silver_powder": "Pó de Prata", - "spell_tag": "Talismã de Feitiço", - "metal_coat": "Revestimento Metálico", - "charcoal": "Carvão", - "mystic_water": "Água Mística", - "miracle_seed": "Semente Milagrosa", - "magnet": "Ímã", - "twisted_spoon": "Colher Torcida", - "never_melt_ice": "Gelo Eterno", - "dragon_fang": "Presa de Dragão", - "black_glasses": "Óculos Escuros", - "fairy_feather": "Pena de Fada", - }, - BaseStatBoosterItem: { - "hp_up": "Mais PS", - "protein": "Proteína", - "iron": "Ferro", - "calcium": "Cálcio", - "zinc": "Zinco", - "carbos": "Carboidrato", - }, - EvolutionItem: { - "NONE": "None", - - "LINKING_CORD": "Cabo de Conexão", - "SUN_STONE": "Pedra do Sol", - "MOON_STONE": "Pedra da Lua", - "LEAF_STONE": "Pedra da Folha", - "FIRE_STONE": "Pedra do Fogo", - "WATER_STONE": "Pedra da Água", - "THUNDER_STONE": "Pedra do Trovão", - "ICE_STONE": "Pedra do Gelo", - "DUSK_STONE": "Pedra do Crepúsculo", - "DAWN_STONE": "Pedra da Alvorada", - "SHINY_STONE": "Pedra Brilhante", - "CRACKED_POT": "Vaso Quebrado", - "SWEET_APPLE": "Maçã Doce", - "TART_APPLE": "Maçã Azeda", - "STRAWBERRY_SWEET": "Doce de Morango", - "UNREMARKABLE_TEACUP": "Xícara Comum", - - "CHIPPED_POT": "Pote Lascado", - "BLACK_AUGURITE": "Mineral Negro", - "GALARICA_CUFF": "Bracelete de Galar", - "GALARICA_WREATH": "Coroa de Galar", - "PEAT_BLOCK": "Bloco de Turfa", - "AUSPICIOUS_ARMOR": "Armadura Prometida", - "MALICIOUS_ARMOR": "Armadura Maldita", - "MASTERPIECE_TEACUP": "Xícara Excepcional", - "METAL_ALLOY": "Liga de Metal", - "SCROLL_OF_DARKNESS": "Pergaminho da Escuridão", - "SCROLL_OF_WATERS": "Pergaminho da Água", - "SYRUPY_APPLE": "Xarope de Maçã", - }, - FormChangeItem: { - "NONE": "None", - - "ABOMASITE": "Abomasita", - "ABSOLITE": "Absolita", - "AERODACTYLITE": "Aerodactylita", - "AGGRONITE": "Aggronita", - "ALAKAZITE": "Alakazita", - "ALTARIANITE": "Altarianita", - "AMPHAROSITE": "Ampharosita", - "AUDINITE": "Audinita", - "BANETTITE": "Banettita", - "BEEDRILLITE": "Beedrillita", - "BLASTOISINITE": "Blastoisinita", - "BLAZIKENITE": "Blazikenita", - "CAMERUPTITE": "Cameruptita", - "CHARIZARDITE X": "Charizardita X", - "CHARIZARDITE Y": "Charizardita Y", - "DIANCITE": "Diancita", - "GALLADITE": "Galladita", - "GARCHOMPITE": "Garchompita", - "GARDEVOIRITE": "Gardevoirita", - "GENGARITE": "Gengarita", - "GLALITITE": "Glalitita", - "GYARADOSITE": "Gyaradosita", - "HERACRONITE": "Heracronita", - "HOUNDOOMINITE": "Houndoominita", - "KANGASKHANITE": "Kangaskhanita", - "LATIASITE": "Latiasita", - "LATIOSITE": "Latiosita", - "LOPUNNITE": "Lopunnita", - "LUCARIONITE": "Lucarionita", - "MANECTITE": "Manectita", - "MAWILITE": "Mawilita", - "MEDICHAMITE": "Medichamita", - "METAGROSSITE": "Metagrossita", - "MEWTWONITE X": "Mewtwonita X", - "MEWTWONITE Y": "Mewtwonita Y", - "PIDGEOTITE": "Pidgeotita", - "PINSIRITE": "Pinsirita", - "SABLENITE": "Sablenita", - "RAYQUAZITE": "Rayquazita", - "SALAMENCITE": "Salamencita", - "SCEPTILITE": "Sceptilita", - "SCIZORITE": "Scizorita", - "SHARPEDONITE": "Sharpedonita", - "SLOWBRONITE": "Slowbronita", - "STEELIXITE": "Steelixita", - "SWAMPERTITE": "Swampertita", - "TYRANITARITE": "Tyranitarita", - "VENUSAURITE": "Venusaurita", - - "BLUE_ORB": "Orbe Azul", - "RED_ORB": "Orbe Vermelha", - "SHARP_METEORITE": "Meteorito Afiado", - "HARD_METEORITE": "Meteorito Duro", - "SMOOTH_METEORITE": " Meteorito Liso", - "ADAMANT_CRYSTAL": "Cristal Adamante", - "LUSTROUS_GLOBE": "Globo Brilhante", - "GRISEOUS_CORE": "Núcleo Platinado", - "REVEAL_GLASS": "Espelho da Verdade", - "GRACIDEA": "Gracídea", - "MAX_MUSHROOMS": "Cogumáximo", - "DARK_STONE": "Pedra das Trevas", - "LIGHT_STONE": "Pedra da Luz", - "PRISON_BOTTLE": "Garrafa Prisão", - "N_LUNARIZER": "Lunarizador N", - "N_SOLARIZER": "Solarizador N", - "RUSTED_SWORD": "Espada Enferrujada", - "RUSTED_SHIELD": "Escudo Enferrujado", - "ICY_REINS_OF_UNITY": "Rédeas de Gelo da União", - "SHADOW_REINS_OF_UNITY": "Rédeas Sombrias da União", - "WELLSPRING_MASK": "Máscara Nascente", - "HEARTHFLAME_MASK": "Máscara Fornalha", - "CORNERSTONE_MASK": "Máscara Alicerce", - "SHOCK_DRIVE": "MagneDisco", - "BURN_DRIVE": "IgneDisco", - "CHILL_DRIVE": "CrioDisco", - "DOUSE_DRIVE": "HidroDisco", - - "FIST_PLATE": "Placa do Punho", - "SKY_PLATE": "Placa do Céu", - "TOXIC_PLATE": "Placa Tóxica", - "EARTH_PLATE": "Placa Terrestre", - "STONE_PLATE": "Placa de Pedra", - "INSECT_PLATE": "Placa de Insetos", - "SPOOKY_PLATE": "Placa Assustadora", - "IRON_PLATE": "Placa de Ferro", - "FLAME_PLATE": "Placa da Chama", - "SPLASH_PLATE": "Placa de Respingo", - "MEADOW_PLATE": "Placa da Planície", - "ZAP_PLATE": "Placa Elétrica", - "MIND_PLATE": "Placa Mental", - "ICICLE_PLATE": "Placa de Gelo", - "DRACO_PLATE": "Placa do Dragão", - "DREAD_PLATE": "Placa Sombria", - "PIXIE_PLATE": "Placa de Fada", - "BLANK_PLATE": "Placa em Branco", - "LEGEND_PLATE": "Placa Lendária", - "FIGHTING_MEMORY": "Memória de Lutador", - "FLYING_MEMORY": "Memória Voadora", - "POISON_MEMORY": "Memória Venenosa", - "GROUND_MEMORY": "Memória Terrestre", - "ROCK_MEMORY": "Memória da Rocha", - "BUG_MEMORY": "Memória de Insetos", - "GHOST_MEMORY": "Memória Fantasma", - "STEEL_MEMORY": "Memória de Aço", - "FIRE_MEMORY": "Memória de Fogo", - "WATER_MEMORY": "Memória da Água", - "GRASS_MEMORY": "Memória de Planta", - "ELECTRIC_MEMORY": "Memória Elétrica", - "PSYCHIC_MEMORY": "Memória Psíquica", - "ICE_MEMORY": "Memória de Gelo", - "DRAGON_MEMORY": "Memória do Dragão", - "DARK_MEMORY": "Memória Sombria", - "FAIRY_MEMORY": "Memória de Fada", - "BLANK_MEMORY": "Memória Vazia", - }, -} as const; diff --git a/src/locales/pt_BR/modifier.json b/src/locales/pt_BR/modifier.json new file mode 100644 index 00000000000..38622de579e --- /dev/null +++ b/src/locales/pt_BR/modifier.json @@ -0,0 +1,12 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}} aguentou o tranco\nusando sua {{typeName}}!", + "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}}!", + "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}}!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestaurou um pouco de seus PS!", + "bypassSpeedChanceApply": "{{pokemonName}} se move mais rápido que o normal graças à sua {{itemName}}!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/move-trigger.json b/src/locales/pt_BR/move-trigger.json new file mode 100644 index 00000000000..9aa13dedad5 --- /dev/null +++ b/src/locales/pt_BR/move-trigger.json @@ -0,0 +1,66 @@ +{ + "hitWithRecoil": "{{pokemonName}} foi ferido pelo dano reverso!", + "cutHpPowerUpMove": "{{pokemonName}} diminuiu seus PS para aumentar o poder do ataque!", + "absorbedElectricity": "{{pokemonName}} absorveu eletricidade!", + "switchedStatChanges": "{{pokemonName}} trocou as mudanças de atributo com o alvo!", + "goingAllOutForAttack": "{{pokemonName}} está arriscando tudo nesse ataque!", + "regainedHealth": "{{pokemonName}} recuperou/nsaúde!", + "keptGoingAndCrashed": "{{pokemonName}} errou o alvo/ne se arrebentou!", + "fled": "{{pokemonName}} fugiu!", + "cannotBeSwitchedOut": "{{pokemonName}} não pode ser trocado!", + "swappedAbilitiesWithTarget": "{{pokemonName}} trocou/nde habilidades com o alvo!", + "coinsScatteredEverywhere": "Moedas foram espalhadas por toda parte!", + "attackedByItem": "{{pokemonName}} está prestes a ser atacado por {{itemName}}!", + "whippedUpAWhirlwind": "{{pokemonName}} criou\num redemoinho de vento!", + "flewUpHigh": "{{pokemonName}} voou\nbem alto!", + "tookInSunlight": "{{pokemonName}} absorveu a luz do sol!", + "dugAHole": "{{pokemonName}} cavou um buraco no chão!", + "loweredItsHead": "{{pokemonName}} abaixou sua cabeça!", + "isGlowing": "{{pokemonName}} ficou envolto em uma luz forte!", + "bellChimed": "Um sino tocou!", + "foresawAnAttack": "{{pokemonName}} previu/num ataque!", + "isTighteningFocus": "{{pokemonName}} está\naumentando seu foco!", + "hidUnderwater": "{{pokemonName}} se escondeu/nembaixo d'água!", + "soothingAromaWaftedThroughArea": "Um aroma suave se espalhou pelo ambiente!", + "sprangUp": "{{pokemonName}} se levantou!", + "choseDoomDesireAsDestiny": "{{pokemonName}} escolheu\no Desejo da Perdição como seu destino!", + "vanishedInstantly": "{{pokemonName}} desapareceu\nde repente!", + "tookTargetIntoSky": "{{pokemonName}} levou {{targetName}}\npara o céu!", + "becameCloakedInFreezingLight": "{{pokemonName}} ficou envolto/nem uma luz congelante!", + "becameCloakedInFreezingAir": "{{pokemonName}} ficou envolto/nem ar congelante!", + "isChargingPower": "{{pokemonName}} está absorvendo energia!", + "burnedItselfOut": "{{pokemonName}} apagou seu próprio fogo!", + "startedHeatingUpBeak": "{{pokemonName}} começou\na esquentar seu bico!", + "setUpShellTrap": "{{pokemonName}} armou uma armadilha de carapaça!", + "isOverflowingWithSpacePower": "{{pokemonName}} está sobrecarregado\ncom energia espacial!", + "usedUpAllElectricity": "{{pokemonName}} usou toda a sua eletricidade!", + "stoleItem": "{{pokemonName}} roubou/no(a) {{itemName}} de {{targetName}}!", + "incineratedItem": "{{pokemonName}} incinerou\na {{itemName}} de {{targetName}}!", + "knockedOffItem": "{{pokemonName}} derrubou\no(a) {{itemName}} de {{targetName}}!", + "tookMoveAttack": "{{pokemonName}} pegou\no movimento {{moveName}}!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} reduziu seus PS\ne maximizou seu atributo de {{statName}}!", + "copiedStatChanges": "{{pokemonName}} copiou\nas mudanças de atributo de {{targetName}}!", + "magnitudeMessage": "Magnitude {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} mirou\nem {{targetName}}!", + "transformedIntoType": "{{pokemonName}} se transformou\nem tipo {{typeName}}!", + "copiedMove": "{{pokemonName}} copiou\no movimento {{moveName}}!", + "sketchedMove": "{{pokemonName}} desenhou\no movimento {{moveName}}!", + "acquiredAbility": "{{pokemonName}} adquiriu\na habilidade {{abilityName}}!", + "copiedTargetAbility": "{{pokemonName}} copiou a habilidade\nde {{targetName}}!", + "transformedIntoTarget": "{{pokemonName}} se transformou\nem um(a) {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} está tentando derrubar o atacante com ele!", + "addType": "{{pokemonName}} recebeu\no tipo {{typeName}}!", + "cannotUseMove": "{{pokemonName}} não pode usar {{moveName}}!", + "healHp": "{{pokemonName}} teve seus PS recuperados.", + "sacrificialFullRestore": "O Healing Wish de {{pokemonName}}\nfoi concedido!", + "invertStats": "As mudanças de atributo de {{pokemonName}}\nforam revertidas!", + "resetStats": "As mudanças de atributo de {{pokemonName}}\nforam eliminadas!", + "statEliminated": "Todas as mudanças de atributo foram eliminadas!", + "faintCountdown": "{{pokemonName}}\nirá desmaiar em {{turnCount}} turnos.", + "copyType": "O tipo de {{pokemonName}}\nmudou para combinar com {{targetPokemonName}}!", + "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}}!", + "safeguard": "{{targetName}} está protegido por Safeguard!" +} diff --git a/src/locales/pt_BR/move.json b/src/locales/pt_BR/move.json new file mode 100644 index 00000000000..c463665f1ad --- /dev/null +++ b/src/locales/pt_BR/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "Pound", + "effect": "O alvo é golpeado com uma pata, uma cauda longa, ou com algo desse tipo." + }, + "karateChop": { + "name": "Karate Chop", + "effect": "O alvo é atacado com um golpe cortante. Golpes críticos ocorrem mais facilmente." + }, + "doubleSlap": { + "name": "Double Slap", + "effect": "O alvo é estapeado repetidamente, de duas a cinco vezes seguidas." + }, + "cometPunch": { + "name": "Comet Punch", + "effect": "O alvo é atingido com uma sequência de socos que acertam de duas a cinco vezes seguidas." + }, + "megaPunch": { + "name": "Mega Punch", + "effect": "O alvo é atingido por um soco desferido com grande força muscular." + }, + "payDay": { + "name": "Pay Day", + "effect": "Várias moedas são lançadas no alvo para causar dano. O Treinador recebe o dinheiro após a batalha." + }, + "firePunch": { + "name": "Fire Punch", + "effect": "O alvo é atingido por um punho flamejante. Isso pode deixar o alvo queimado." + }, + "icePunch": { + "name": "Ice Punch", + "effect": "O alvo é atingido por um punho gelado. Isso pode deixar o alvo congelado." + }, + "thunderPunch": { + "name": "Thunder Punch", + "effect": "O alvo é atingido por um punho eletrificado. Isso também pode deixar o alvo paralisado." + }, + "scratch": { + "name": "Scratch", + "effect": "Garras duras, pontiagudas e afiadas rasgam o alvo para causar dano." + }, + "viseGrip": { + "name": "Vise Grip", + "effect": "O alvo é agarrado e espremido de ambos os lados para causar dano." + }, + "guillotine": { + "name": "Guillotine", + "effect": "Um ataque violento e destruidor com grandes pinças. Se o golpe acertar, o alvo desmaiará instantaneamente." + }, + "razorWind": { + "name": "Razor Wind", + "effect": "Neste ataque de dois turnos, lâminas de vento golpeiam Pokémon adversários no segundo turno. Golpes críticos ocorrem mais facilmente." + }, + "swordsDance": { + "name": "Swords Dance", + "effect": "Uma dança frenética para elevar o espírito de luta. Aumenta bruscamente o Ataque do usuário." + }, + "cut": { + "name": "Cut", + "effect": "O alvo é cortado com uma foice ou garra." + }, + "gust": { + "name": "Gust", + "effect": "Uma rajada de vento é levantada por asas e lançada no alvo para causar dano." + }, + "wingAttack": { + "name": "Wing Attack", + "effect": "O alvo é atingido por asas grandes e imponentes, amplamente abertas para causar dano." + }, + "whirlwind": { + "name": "Whirlwind", + "effect": "O alvo é soprado para fora da batalha, dando lugar a outro Pokémon. Em batalhas selvagens, a batalha termina caso seja contra um único Pokémon." + }, + "fly": { + "name": "Fly", + "effect": "O usuário levanta vôo e ataca o alvo no próximo turno." + }, + "bind": { + "name": "Bind", + "effect": "Um longo corpo ou tentáculos são utilizados para prender o alvo e espremê-lo por quatro ou cinco turnos." + }, + "slam": { + "name": "Slam", + "effect": "O alvo é atingido com uma longa cauda, vinhas ou algo parecido para infligir dano." + }, + "vineWhip": { + "name": "Vine Whip", + "effect": "O usuário utiliza-se de vinhas finas como chicote para infligir dano." + }, + "stomp": { + "name": "Stomp", + "effect": "O alvo é pisoteado por um grande pé. Isso também pode fazer o alvo hesitar." + }, + "doubleKick": { + "name": "Double Kick", + "effect": "O alvo é atingido rapidamente com um chute duas vezes seguidas usando ambos os pés." + }, + "megaKick": { + "name": "Mega Kick", + "effect": "O alvo é atingido por um chute desferido com grande força muscular." + }, + "jumpKick": { + "name": "Jump Kick", + "effect": "O usuário pula alto, depois golpeia com um chute. Se o chute erra, o usuário se fere." + }, + "rollingKick": { + "name": "Rolling Kick", + "effect": "O usuário desfere um rápido chute giratório. Isso também pode fazer o alvo hesitar." + }, + "sandAttack": { + "name": "Sand Attack", + "effect": "Areia é lançada no rosto do alvo, reduzindo sua Precisão." + }, + "headbutt": { + "name": "Headbutt", + "effect": "O usuário direciona sua cabeça e ataca, avançando diretamente sobre o alvo. Isso também pode fazer o alvo hesitar." + }, + "hornAttack": { + "name": "Horn Attack", + "effect": "O alvo é perfurado por um chifre pontudo e afiado para infligir dano." + }, + "furyAttack": { + "name": "Fury Attack", + "effect": "O alvo é perfurado repetidamente por um chifre ou bico, de duas a cinco vezes seguidas." + }, + "hornDrill": { + "name": "Horn Drill", + "effect": "O usuário perfura o alvo com um chifre que gira como uma broca. Se o golpe acertar, o alvo desmaia instantaneamente." + }, + "tackle": { + "name": "Tackle", + "effect": "Um ataque físico cujo o usuário vai para cima do alvo e lhe atinge com todo o seu corpo." + }, + "bodySlam": { + "name": "Body Slam", + "effect": "O usuário se lança para cima do alvo com todo o peso de seu corpo. Isso pode deixar o alvo paralisado." + }, + "wrap": { + "name": "Wrap", + "effect": "Um longo corpo, vinhas ou algo assim, são usados para embrulhar e apertar o alvo por quatro ou cinco turnos." + }, + "takeDown": { + "name": "Take Down", + "effect": "Uma investida corporal imprudente para golpear o alvo. Isso também fere um pouco o usuário." + }, + "thrash": { + "name": "Thrash", + "effect": "O usuário fica furioso e ataca com violência de dois a três turnos. O usuário então se torna confuso." + }, + "doubleEdge": { + "name": "Double-Edge", + "effect": "Uma investida imprudente e muito perigosa. Isso também fere bastante o usuário." + }, + "tailWhip": { + "name": "Tail Whip", + "effect": "O usuário balança sua cauda de maneira fofa, baixando a guarda do Pokémon adversário e diminuindo sua Defesa." + }, + "poisonSting": { + "name": "Poison Sting", + "effect": "O usuário perfura o alvo com um ferrão venenoso. Isso também pode envenenar o alvo." + }, + "twineedle": { + "name": "Twineedle", + "effect": "O usuário causa dano duas vezes seguidas, perfurando o alvo com dois ferrões. Isso também pode envenenar o alvo." + }, + "pinMissile": { + "name": "Pin Missile", + "effect": "Espinhos afiados são lançados no alvo em rápida sucessão. Eles acertam de duas a cinco vezes seguidas." + }, + "leer": { + "name": "Leer", + "effect": "O usuário lança um olhar intimidador no Pokémon oponente, reduzindo sua Defesa." + }, + "bite": { + "name": "Bite", + "effect": "O alvo é mordido ferozmente com presas afiadas. Isso também pode fazer o alvo hesitar." + }, + "growl": { + "name": "Growl", + "effect": "O usuário rosna de maneira agradável, baixando a guarda do Pokémon adversário. Isso diminui o Ataque do oponente." + }, + "roar": { + "name": "Roar", + "effect": "O alvo se assusta, retorna para a sua Poké Bola e um outro Pokémon toma o seu lugar. O combate é encerrado contra um único Pokémon selvagem." + }, + "sing": { + "name": "Sing", + "effect": "Uma suave canção de ninar é cantada com uma voz calma, colocando o alvo em sono profundo." + }, + "supersonic": { + "name": "Supersonic", + "effect": "O usuário gera estranhas ondas sonoras de seu corpo que confundem o alvo." + }, + "sonicBoom": { + "name": "Sonic Boom", + "effect": "O alvo é atingido com uma onda de choque destrutiva que sempre causa dano de 20 PS." + }, + "disable": { + "name": "Disable", + "effect": "Por quatro turnos, este movimento impede que o alvo utilize o último movimento usado por ele." + }, + "acid": { + "name": "Acid", + "effect": "Os Pokémon adversários são atacados com um jato de um forte ácido. Isso pode diminuir a Defesa Especial." + }, + "ember": { + "name": "Ember", + "effect": "O alvo é atacado com pequenas chamas. Também pode deixar o alvo com uma queimadura." + }, + "flamethrower": { + "name": "Flamethrower", + "effect": "O usuário queima o alvo com uma grande explosão de fogo. Também pode deixar o alvo com uma queimadura." + }, + "mist": { + "name": "Mist", + "effect": "O usuário esconde a si mesmo e seus aliados em uma neblina branca que impede que seus atributos sejam reduzidos por cinco turnos." + }, + "waterGun": { + "name": "Water Gun", + "effect": "O alvo é atingido por um disparo forte de água." + }, + "hydroPump": { + "name": "Hydro Pump", + "effect": "O alvo é atingido por um enorme volume de água lançado sob uma forte pressão." + }, + "surf": { + "name": "Surf", + "effect": "O usuário ataca tudo ao seu redor, inundando os arredores com uma onda gigante." + }, + "iceBeam": { + "name": "Ice Beam", + "effect": "O alvo é atingido por um raio de energia congelante. Isso também pode deixar o alvo congelado." + }, + "blizzard": { + "name": "Blizzard", + "effect": "Uma enorme nevasca é invocada para atacar o Pokémon oponente. Também pode deixar o alvo congelado." + }, + "psybeam": { + "name": "Psybeam", + "effect": "O alvo é atacado por um feixe peculiar. Isso também pode deixar o alvo confuso." + }, + "bubbleBeam": { + "name": "Bubble Beam", + "effect": "Um jato de bolhas é borrifado com intensidade no alvo. Isso também pode diminuir a Velocidade do alvo." + }, + "auroraBeam": { + "name": "Aurora Beam", + "effect": "O alvo é atingido por um raio colorido como o arco-íris. Isso também pode diminuir o Ataque do alvo." + }, + "hyperBeam": { + "name": "Hyper Beam", + "effect": "O alvo é atingido por um raio poderoso. O usuário não poderá se mover no próximo turno." + }, + "peck": { + "name": "Peck", + "effect": "O alvo é atingido por um bico ou chifre pontudo." + }, + "drillPeck": { + "name": "Drill Peck", + "effect": "Um ataque giratório com um bico afiado que age como uma broca." + }, + "submission": { + "name": "Submission", + "effect": "O usuário agarra o alvo e, imprudentemente, mergulha em direção ao chão. Isso também fere um pouco o usuário." + }, + "lowKick": { + "name": "Low Kick", + "effect": "Um poderoso chute baixo que derruba o alvo. Quanto mais pesado o alvo for, maior o poder do movimento." + }, + "counter": { + "name": "Counter", + "effect": "Um movimento de retaliação que neutraliza qualquer ataque físico, causando o dobro do dano recebido." + }, + "seismicToss": { + "name": "Seismic Toss", + "effect": "O alvo é lançado usando o poder da gravidade. Isso causa dano igual ao nível do usuário." + }, + "strength": { + "name": "Strength", + "effect": "O alvo é atingido por um soco dado com o máximo de força." + }, + "absorb": { + "name": "Absorb", + "effect": "Um ataque que drena nutrientes. O usuário recupera PS pela metade do dano infligido ao alvo." + }, + "megaDrain": { + "name": "Mega Drain", + "effect": "Um ataque que drena nutrientes. O usuário recupera PS pela metade do dano infligido ao alvo." + }, + "leechSeed": { + "name": "Leech Seed", + "effect": "Uma semente é plantada no alvo. Isso rouba alguns pontos de PS do alvo a cada turno." + }, + "growth": { + "name": "Growth", + "effect": "O corpo do usuário cresce de uma vez só, aumentando seu Ataque e Ataque Especial." + }, + "razorLeaf": { + "name": "Razor Leaf", + "effect": "Folhas superafiadas são lançadas para cortar os Pokémon adversários. Golpes críticos ocorrem mais facilmente." + }, + "solarBeam": { + "name": "Solar Beam", + "effect": "Neste ataque de dois turnos, o usuário absorve luz, então dispara um raio focalizado no próximo turno." + }, + "poisonPowder": { + "name": "Poison Powder", + "effect": "O usuário espalha uma nuvem de poeira tóxica que envenena o alvo." + }, + "stunSpore": { + "name": "Stun Spore", + "effect": "O usuário espalha uma nuvem de esporos entorpecentes que paralisam o alvo." + }, + "sleepPowder": { + "name": "Sleep Powder", + "effect": "O usuário espalha uma grande nuvem de pó sonífero ao redor do alvo." + }, + "petalDance": { + "name": "Petal Dance", + "effect": "O usuário ataca o alvo espalhando pétalas de dois a três turnos. O usuário então fica confuso." + }, + "stringShot": { + "name": "String Shot", + "effect": "O Pokémon adversário é enrolado com uma seda expelida da boca do usuário, o que reduz duramente sua Velocidade." + }, + "dragonRage": { + "name": "Dragon Rage", + "effect": "Este ataque atinge o alvo com uma onda de choque de pura fúria. Este ataque sempre causa 40 PS de dano." + }, + "fireSpin": { + "name": "Fire Spin", + "effect": "O alvo fica preso dentro de um vórtice feroz de fogo que se prolonga por quatro ou cinco turnos." + }, + "thunderShock": { + "name": "Thunder Shock", + "effect": "Um choque elétrico que cai sobre o alvo causando dano. Isso também pode deixar o alvo paralisado." + }, + "thunderbolt": { + "name": "Thunderbolt", + "effect": "Uma forte explosão elétrica que cai sobre o alvo. Também pode deixar o alvo com paralisia." + }, + "thunderWave": { + "name": "Thunder Wave", + "effect": "O usuário lança um choque elétrico fraco que paralisa o alvo." + }, + "thunder": { + "name": "Thunder", + "effect": "Um raio cruel despenca no alvo para causar dano. Isso também pode deixar o alvo com paralisia." + }, + "rockThrow": { + "name": "Rock Throw", + "effect": "Para atacar, o usuário pega uma pequena rocha e joga no alvo." + }, + "earthquake": { + "name": "Earthquake", + "effect": "O usuário desencadeia um terremoto que atinge todos os Pokémon ao seu redor." + }, + "fissure": { + "name": "Fissure", + "effect": "O usuário abre uma fissura no chão e joga o alvo nela. O alvo desmaiará instantaneamente se esse ataque acertar." + }, + "dig": { + "name": "Dig", + "effect": "O usuário se entoca, então ataca no próximo turno." + }, + "toxic": { + "name": "Toxic", + "effect": "Um movimento que deixa o alvo seriamente envenenado. Seu dano venenoso aumenta a cada turno." + }, + "confusion": { + "name": "Confusion", + "effect": "O alvo é atingido por uma força telecinética fraca. Isso também pode deixar o alvo confuso." + }, + "psychic": { + "name": "Psychic", + "effect": "O alvo é atingido por uma força telecinética poderosa. Isso também pode diminuir a Defesa Especial do alvo." + }, + "hypnosis": { + "name": "Hypnosis", + "effect": "O usuário implanta uma sugestão hipnótica para fazer o alvo cair em um sono profundo." + }, + "meditate": { + "name": "Meditate", + "effect": "O usuário medita para despertar o poder profundo do seu corpo para aumentar seu Ataque." + }, + "agility": { + "name": "Agility", + "effect": "O usuário relaxa o corpo para se mover rapidamente. Isso aumenta bruscamente sua Velocidade." + }, + "quickAttack": { + "name": "Quick Attack", + "effect": "O usuário ataca o alvo em uma velocidade que o torna quase invisível. Esse movimento tem prioridade." + }, + "rage": { + "name": "Rage", + "effect": "Enquanto este movimento estiver em uso, o poder da ira aumenta o Ataque toda vez que o usuário for atingido em batalha." + }, + "teleport": { + "name": "Teleport", + "effect": "Use para fugir de qualquer Pokémon selvagem." + }, + "nightShade": { + "name": "Night Shade", + "effect": "O usuário faz com que o alvo veja uma miragem assustadora. Isso causa dano igual ao nível do usuário." + }, + "mimic": { + "name": "Mimic", + "effect": "O usuário copia o último movimento do alvo. O movimento pode ser usado durante a batalha até que o Pokémon seja trocado." + }, + "screech": { + "name": "Screech", + "effect": "Um grito estridente que reduz duramente o atributo de Defesa do alvo." + }, + "doubleTeam": { + "name": "Double Team", + "effect": "Movendo-se rapidamente, o usuário faz cópias ilusórias para aumentar sua Evasão." + }, + "recover": { + "name": "Recover", + "effect": "Restaurando suas células, o usuário restaura metade do seu máximo de PS." + }, + "harden": { + "name": "Harden", + "effect": "O usuário enrijece todos os músculos do seu corpo para aumentar seu atributo de Defesa." + }, + "minimize": { + "name": "Minimize", + "effect": "O usuário comprime seu corpo para se parecer menor, o que aumenta bruscamente sua Evasão." + }, + "smokescreen": { + "name": "Smokescreen", + "effect": "O usuário lança uma nuvem obscura de fumaça ou tinta. Isso diminui a Precisão do alvo." + }, + "confuseRay": { + "name": "Confuse Ray", + "effect": "O alvo é exposto a um raio sinistro que leva à confusão." + }, + "withdraw": { + "name": "Withdraw", + "effect": "O usuário retrai seu corpo para dentro de seu casco duro, aumentando o seu atributo de Defesa." + }, + "defenseCurl": { + "name": "Defense Curl", + "effect": "O usuário se enrola para esconder os pontos fracos e aumentar seu atributo de Defesa." + }, + "barrier": { + "name": "Barrier", + "effect": "O usuário ergue uma barreira robusta que aumenta bruscamente a sua Defesa." + }, + "lightScreen": { + "name": "Light Screen", + "effect": "Uma incrível parede de luz é erguida para reduzir o dano de ataques especiais por cinco turnos." + }, + "haze": { + "name": "Haze", + "effect": "O usuário cria uma névoa que elimina todas as alterações de atributos de todos os Pokémon em batalha." + }, + "reflect": { + "name": "Reflect", + "effect": "Uma incrível parede de luz é erguida para reduzir o dano de ataques físicos por cinco turnos." + }, + "focusEnergy": { + "name": "Focus Energy", + "effect": "O usuário respira fundo e concentra-se para que golpes críticos ocorram mais facilmente." + }, + "bide": { + "name": "Bide", + "effect": "O usuário resiste a ataques por dois turnos, e revida causando o dobro do dano recebido." + }, + "metronome": { + "name": "Metronome", + "effect": "O usuário balança um dedo e estimula seu cérebro para usar aleatoriamente quase qualquer movimento." + }, + "mirrorMove": { + "name": "Mirror Move", + "effect": "O usuário contra-ataca o alvo imitando seu último movimento utilizado." + }, + "selfDestruct": { + "name": "Self-Destruct", + "effect": "O usuário ataca tudo ao seu redor causando uma explosão. O usuário desmaia por usar esse golpe." + }, + "eggBomb": { + "name": "Egg Bomb", + "effect": "Um ovo grande é arremessado contra o alvo com força máxima para causar dano." + }, + "lick": { + "name": "Lick", + "effect": "O alvo é lambido com uma língua comprida, causando dano. Isso também pode deixar o alvo paralisado." + }, + "smog": { + "name": "Smog", + "effect": "O alvo é atacado com uma descarga de gases poluentes. Isso também pode envenenar o alvo." + }, + "sludge": { + "name": "Sludge", + "effect": "Lodo insalubre é no arremessado no alvo. Isso também pode causar envenenamento." + }, + "boneClub": { + "name": "Bone Club", + "effect": "O usuário golpeia o alvo com um osso. Isso também pode o fazer o alvo hesitar." + }, + "fireBlast": { + "name": "Fire Blast", + "effect": "O alvo é atacado com uma intensa explosão de fogo consumidor. Isso também pode deixar o alvo com uma queimadura." + }, + "waterfall": { + "name": "Waterfall", + "effect": "O usuário investe no alvo e pode fazê-lo hesitar." + }, + "clamp": { + "name": "Clamp", + "effect": "O alvo é apertado e imprensado pela concha densa e robusta do usuário por quatro ou cinco turnos." + }, + "swift": { + "name": "Swift", + "effect": "Raios em formato de estrela são disparados no Pokémon adversário. Esse ataque nunca erra." + }, + "skullBash": { + "name": "Skull Bash", + "effect": "O usuário retrai sua cabeça para aumentar a Defesa no primeiro turno e depois se choca com o alvo no próximo turno." + }, + "spikeCannon": { + "name": "Spike Cannon", + "effect": "Espinhos afiados são lançados no alvo em rápida sucessão. Eles acertam de duas a cinco vezes seguidas." + }, + "constrict": { + "name": "Constrict", + "effect": "O alvo é atacado com longos e sorrateiros tentáculos ou vinhas. Isso também pode diminuir a Velocidade do alvo." + }, + "amnesia": { + "name": "Amnesia", + "effect": "O usuário esvazia sua mente para esquecer suas preocupações. Aumenta bruscamente a Defesa Especial." + }, + "kinesis": { + "name": "Kinesis", + "effect": "O usuário distrai o alvo entortando uma colher. Isso diminui a Precisão do alvo." + }, + "softBoiled": { + "name": "Soft-Boiled", + "effect": "O usuário restaura os próprios PS pela metade dos seus PS máximos." + }, + "highJumpKick": { + "name": "High Jump Kick", + "effect": "O alvo é atacado com uma joelhada de um pulo. Caso erre, o usuário se machuca." + }, + "glare": { + "name": "Glare", + "effect": "O usuário intimida o alvo com o padrão em sua barriga para causar paralisia." + }, + "dreamEater": { + "name": "Dream Eater", + "effect": "O usuário se alimenta dos sonhos de um alvo adormecido. Ele absorve metade do dano causado para curar seus PS." + }, + "poisonGas": { + "name": "Poison Gas", + "effect": "Uma nuvem de gás venenoso é assoprada no rosto do Pokémon adversário. Isso pode envenenar os alvos." + }, + "barrage": { + "name": "Barrage", + "effect": "Objetos redondos são lançados no alvo para acertar de duas a cinco vezes seguidas." + }, + "leechLife": { + "name": "Leech Life", + "effect": "O usuário drena o sangue do alvo. Os PS do usuário são restaurados pela metade do dano recebido pelo alvo." + }, + "lovelyKiss": { + "name": "Lovely Kiss", + "effect": "Com uma face assustadora, o usuário tenta beijar o alvo à força. Se conseguir, o alvo cai no sono." + }, + "skyAttack": { + "name": "Sky Attack", + "effect": "Um movimento de dois turnos onde golpes críticos ocorrem mais facilmente. Também pode fazer o alvo hesitar." + }, + "transform": { + "name": "Transform", + "effect": "O usuário transforma-se em uma cópia do alvo, conseguindo os mesmos movimentos do adversário." + }, + "bubble": { + "name": "Bubble", + "effect": "Um jato de incontáveis bolhas é disparado no Pokémon adversário. Isso também pode diminuir a velocidade do alvo." + }, + "dizzyPunch": { + "name": "Dizzy Punch", + "effect": "O alvo é atingido com socos dados ritmicamente. Isso também pode deixar alvo confuso." + }, + "spore": { + "name": "Spore", + "effect": "O usuário espalha rajadas de esporos que induzem sono ao alvo." + }, + "flash": { + "name": "Flash", + "effect": "O usuário pisca uma luz brilhante que reduz a Precisão do alvo." + }, + "psywave": { + "name": "Psywave", + "effect": "O alvo é atacado com uma estranha onda psíquica. O ataque varia de intensidade." + }, + "splash": { + "name": "Splash", + "effect": "O usuário apenas debate-se no chão e espirra água ao seu redor sem efeito algum..." + }, + "acidArmor": { + "name": "Acid Armor", + "effect": "O usuário altera sua estrutura celular para se liquefazer, aumentando bruscamente o seu atributo de Defesa." + }, + "crabhammer": { + "name": "Crabhammer", + "effect": "O alvo é martelado com uma grande pinça. Golpes críticos acertam mais facilmente." + }, + "explosion": { + "name": "Explosion", + "effect": "O usuário ataca tudo o que estiver à sua volta causando uma tremenda explosão. O usuário desmaia ao usar esse movimento." + }, + "furySwipes": { + "name": "Fury Swipes", + "effect": "O alvo é atacado com garras afiadas ou foices rapidamente, de duas a cinco vezes seguidas." + }, + "bonemerang": { + "name": "Bonemerang", + "effect": "O usuário arremessa o osso que segura. O osso gira, atingindo o alvo duas vezes, indo e voltando." + }, + "rest": { + "name": "Rest", + "effect": "O usuário dorme por dois turnos. Isso restaura completamente os PS do usuário e cura quaisquer condições negativas." + }, + "rockSlide": { + "name": "Rock Slide", + "effect": "Pedras grandes são arremessadas no Pokémon oponente para causar dano. Isso também pode fazer o Pokémon oponente hesitar." + }, + "hyperFang": { + "name": "Hyper Fang", + "effect": "O usuário morde o alvo com força, usando as suas afiadas presas frontais. Isso também pode fazer o alvo hesitar." + }, + "sharpen": { + "name": "Sharpen", + "effect": "O usuário abaixa o número de polígonos, ficando mais pontiagudo. Isso aumenta o seu atributo de Ataque." + }, + "conversion": { + "name": "Conversion", + "effect": "O usuário muda seu tipo para o mesmo tipo do movimento no topo da lista dos movimentos que conhece no momento." + }, + "triAttack": { + "name": "Tri Attack", + "effect": "O usuário golpeia com um ataque de três raios simultâneos. Também pode queimar, congelar ou paralisar o alvo." + }, + "superFang": { + "name": "Super Fang", + "effect": "O usuário mastiga com força o alvo usando suas afiadas presas frontais. Isso corta os PS do alvo pela metade." + }, + "slash": { + "name": "Slash", + "effect": "O alvo é atacado com um açoite de garras ou lâminas. Golpes críticos ocorrem mais facilmente." + }, + "substitute": { + "name": "Substitute", + "effect": "O usuário faz uma cópia de si mesmo usando parte de seus PS. A cópia serve como uma isca para o usuário." + }, + "struggle": { + "name": "Struggle", + "effect": "Um ataque usado em desespero, apenas se o usuário não tiver PP. Isso também causa um pouco de dano no usuário." + }, + "sketch": { + "name": "Sketch", + "effect": "Permite que o usuário aprenda permanentemente o último movimento usado pelo alvo. Assim que for usado, o Esboço desaparece." + }, + "tripleKick": { + "name": "Triple Kick", + "effect": "Um ataque de três chutes consecutivos que se fortalece a cada golpe acertado." + }, + "thief": { + "name": "Thief", + "effect": "O usuário ataca e rouba o item segurado por seu alvo simultaneamente. O usuário não pode roubar algo se ele já segurar um item." + }, + "spiderWeb": { + "name": "Spider Web", + "effect": "O usuário enlaça o alvo com uma teia fina e grudenta, para que ele não possa fugir da batalha." + }, + "mindReader": { + "name": "Mind Reader", + "effect": "O usuário pressente os movimentos do alvo com sua mente para ter certeza que o seu próximo ataque não o erre." + }, + "nightmare": { + "name": "Nightmare", + "effect": "Um alvo que dorme terá um pesadelo que causará dano a cada turno." + }, + "flameWheel": { + "name": "Flame Wheel", + "effect": "O usuário se envolve em fogo e dispara em direção ao alvo. Isso também pode causar queimaduras no oponente." + }, + "snore": { + "name": "Snore", + "effect": "Um ataque que só pode ser usado se o usuário estiver dormindo. O barulho alto pode fazer o alvo hesitar." + }, + "curse": { + "name": "Curse", + "effect": "Um movimento que funciona diferente com o tipo Fantasma do que com outros tipos." + }, + "flail": { + "name": "Flail", + "effect": "O usuário agita os membros sem rumo para atacar. Quanto menores forem os PS do usuário, melhor será o movimento." + }, + "conversion2": { + "name": "Conversion 2", + "effect": "O usuário muda a própria tipagem para se fazer resistente ao tipo do último ataque usado pelo oponente." + }, + "aeroblast": { + "name": "Aeroblast", + "effect": "Um vortex de vento é atirado em direção ao alvo para causar dano. Golpes críticos ocorrem mais facilmente." + }, + "cottonSpore": { + "name": "Cotton Spore", + "effect": "O usuário solta esporos de algodão que grudam no Pokémon adversário. Isso prejudica bruscamente a Velocidade do oponente." + }, + "reversal": { + "name": "Reversal", + "effect": "Um ataque total que fica mais forte quanto menos PS o usuário possuir." + }, + "spite": { + "name": "Spite", + "effect": "O usuário libera todo o seu rancor no último movimento usado pelo oponente, cortando 4 PP do mesmo." + }, + "powderSnow": { + "name": "Powder Snow", + "effect": "O usuário ataca com uma brisa congelante de Neve em Pó. Isso talvez possa congelar o Pokémon adversário." + }, + "protect": { + "name": "Protect", + "effect": "Permite que o usuário desvie de todos os ataques. A sua chance de falhar aumenta, caso seja usado em sucessão." + }, + "machPunch": { + "name": "Mach Punch", + "effect": "O usuário soca numa velocidade incompreensível. Esse movimento tem prioridade." + }, + "scaryFace": { + "name": "Scary Face", + "effect": "O usuário assusta o alvo com uma cara assustadora para prejudicar duramente a velocidade do oponente." + }, + "feintAttack": { + "name": "Feint Attack", + "effect": "O usuário se aproxima do alvo amigavelmente, então ataca com um soco inesperado. Esse ataque nunca erra." + }, + "sweetKiss": { + "name": "Sweet Kiss", + "effect": "O usuário beija o alvo com uma fofura doce e angelical, causando confusão." + }, + "bellyDrum": { + "name": "Belly Drum", + "effect": "O usuário maximiza seu Ataque em troca de PS igual à metade do seu PS máximo." + }, + "sludgeBomb": { + "name": "Sludge Bomb", + "effect": "Lodo insalubre é no arremessado no alvo. Isso também pode causar envenenamento." + }, + "mudSlap": { + "name": "Mud-Slap", + "effect": "O usuário arremessa lama no rosto do adversário para causar dano e prejudicar sua precisão." + }, + "octazooka": { + "name": "Octazooka", + "effect": "O usuário ataca jogando tinta no rosto ou nos olhos do alvo. Isso pode prejudicar a Precisão do alvo." + }, + "spikes": { + "name": "Spikes", + "effect": "O usuário lança armadilhas de espinhos nos pés da equipe adversária. As armadilhas ferem os Pokémon que são trocados em batalha." + }, + "zapCannon": { + "name": "Zap Cannon", + "effect": "O usuário atira uma explosão elétrica como um canhão para infligir dano e causar paralisia." + }, + "foresight": { + "name": "Foresight", + "effect": "Permite que um alvo do tipo Fantasma seja atingido por ataques do tipo Normal e Lutador. Isso também permite que um alvo evasivo seja acertado." + }, + "destinyBond": { + "name": "Destiny Bond", + "effect": "Quando esse movimento é usado, caso o usuário desmaie, o Pokémon que acertou o nocaute também desmaiará. A chance de falhar aumenta se usado em sucessão." + }, + "perishSong": { + "name": "Perish Song", + "effect": "Qualquer Pokémon que ouvir essa Canção desmaiará em três turnos, a não ser que ele seja retirado da batalha." + }, + "icyWind": { + "name": "Icy Wind", + "effect": "O usuário ataca com uma rajada de ar arrepiante. Isso também prejudica a Velocidade do Pokémon adversário." + }, + "detect": { + "name": "Detect", + "effect": "Permite que o usuário desvie de todos os ataques. A sua chance de falhar aumenta, caso seja usado em sucessão." + }, + "boneRush": { + "name": "Bone Rush", + "effect": "O usuário atinge o alvo com um osso duro de duas a cinco vezes seguidas." + }, + "lockOn": { + "name": "Lock-On", + "effect": "O usuário foca sua mira no alvo. Isso garante que o próximo ataque não erre o alvo." + }, + "outrage": { + "name": "Outrage", + "effect": "O usuário fica furioso e ataca com violência de dois a três turnos. O usuário então se torna confuso." + }, + "sandstorm": { + "name": "Sandstorm", + "effect": "Uma tempestade de areia é invocada durante 5 turnos para ferir todos os combatentes, exceto os tipos Pedra, Terra e Aço. Isso aumenta a Defesa Especial dos tipo Pedra." + }, + "gigaDrain": { + "name": "Giga Drain", + "effect": "Um ataque que drena nutrientes. O usuário recupera PS pela metade do dano infligido ao alvo." + }, + "endure": { + "name": "Endure", + "effect": "O usuário resiste a qualquer ataque com pelo menos 1 PS. A chance de falhar aumenta caso seja usado em sucessão." + }, + "charm": { + "name": "Charm", + "effect": "O usuário contempla o alvo com um olhar charmoso, fazendo-o ficar menos atento. Isso prejudica duramente o Ataque do oponente." + }, + "rollout": { + "name": "Rollout", + "effect": "O usuário rola continuamente em direção ao alvo por cinco turnos. O ataque fica mais forte a cada acerto." + }, + "falseSwipe": { + "name": "False Swipe", + "effect": "Um ataque moderado que previne que o alvo desmaie. O alvo é deixado com pelo menos 1 de PS." + }, + "swagger": { + "name": "Swagger", + "effect": "O usuário enfurece e confunde o alvo. Entretanto, isso também aumenta bruscamente o Ataque do alvo." + }, + "milkDrink": { + "name": "Milk Drink", + "effect": "O usuário restaura os próprios PS pela metade dos seus PS máximos." + }, + "spark": { + "name": "Spark", + "effect": "O usuário direciona uma investida carregada com eletricidade no alvo. Isso pode paralisar o alvo." + }, + "furyCutter": { + "name": "Fury Cutter", + "effect": "O alvo é cortado com foices ou garras. Esse ataque se torna mais poderoso se usado em sucessão." + }, + "steelWing": { + "name": "Steel Wing", + "effect": "O alvo é atingido com asas de aço. Isso também pode aumentar a Defesa do usuário." + }, + "meanLook": { + "name": "Mean Look", + "effect": "O usuário encara o alvo com um olhar sombrio e opressor. O alvo se torna incapaz de fugir." + }, + "attract": { + "name": "Attract", + "effect": "Caso o adversário seja do gênero oposto ao usuário, o alvo se apaixona e se torna menos suscetível a atacar." + }, + "sleepTalk": { + "name": "Sleep Talk", + "effect": "Enquanto está dormindo, o usuário usa aleatoriamente um dos movimentos que tem conhecimento." + }, + "healBell": { + "name": "Heal Bell", + "effect": "O usuário toca um sino calmante para curar condições de estados de todos os Pokémon aliados na equipe." + }, + "return": { + "name": "Return", + "effect": "Um ataque poderoso que fica mais poderoso à medida que o usuário gosta de seu Treinador." + }, + "present": { + "name": "Present", + "effect": "O usuário ataca o alvo entregando um presente com uma armadilha oculta. Entretanto, às vezes cura os PS do alvo." + }, + "frustration": { + "name": "Frustration", + "effect": "Um ataque poderoso que fica mais poderoso à medida que o usuário desgosta de seu Treinador." + }, + "safeguard": { + "name": "Safeguard", + "effect": "O usuário cria um campo protetor que previne condições de estado por cinco turnos." + }, + "painSplit": { + "name": "Pain Split", + "effect": "O usuário adiciona os próprios PS aos PS do alvo, então compartilha igualmente os PS combinados com o alvo." + }, + "sacredFire": { + "name": "Sacred Fire", + "effect": "O usuário é arrasado com uma rajada de fogo místico de grande intensidade. Isso pode deixar o alvo queimado." + }, + "magnitude": { + "name": "Magnitude", + "effect": "O usuário ataca tudo ao seu redor com um grande tremor. Seu poder varia." + }, + "dynamicPunch": { + "name": "Dynamic Punch", + "effect": "O usuário soca o alvo com sua força totalmente concentrada. Em caso de acerto, confundirá o alvo." + }, + "megahorn": { + "name": "Megahorn", + "effect": "Usando seu impressionante chifre resistente, o usuário golpeia o alvo sem trégua." + }, + "dragonBreath": { + "name": "Dragon Breath", + "effect": "O usuário sopra uma poderosa rajada que causa dano. Isso também pode paralisar o alvo." + }, + "batonPass": { + "name": "Baton Pass", + "effect": "O usuário troca de lugar com um Pokémon da equipe em espera e passa para ele quaisquer mudanças de atributos." + }, + "encore": { + "name": "Encore", + "effect": "O usuário enaltece o alvo para que ele continue usando o movimento que ele usou por último durante três turnos." + }, + "pursuit": { + "name": "Pursuit", + "effect": "Um ataque que causa o dobro do dano caso seja usado em um alvo que esteja sendo trocado para fora da batalha." + }, + "rapidSpin": { + "name": "Rapid Spin", + "effect": "Um ataque giratório que pode anular movimentos como Enlaçar, Embrulho, Sanguessuga e Espinhos." + }, + "sweetScent": { + "name": "Sweet Scent", + "effect": "Um aroma doce que prejudica duramente a Evasão do Pokémon adversário." + }, + "ironTail": { + "name": "Iron Tail", + "effect": "O alvo é esmagado com uma cauda dura como aço. Isso também pode prejudicar a Defesa do alvo." + }, + "metalClaw": { + "name": "Metal Claw", + "effect": "O alvo é cortado com garras de metal. Isso também pode aumentar o Ataque do usuário." + }, + "vitalThrow": { + "name": "Vital Throw", + "effect": "O usuário sempre ataca por último. Em troca, esse arremesso nunca erra." + }, + "morningSun": { + "name": "Morning Sun", + "effect": "O usuário restaura os próprios PS. A quantidade de PS recuperada varia conforme o clima." + }, + "synthesis": { + "name": "Synthesis", + "effect": "O usuário restaura os próprios PS. A quantidade de PS recuperada varia conforme o clima." + }, + "moonlight": { + "name": "Moonlight", + "effect": "O usuário restaura os próprios PS. A quantidade de PS recuperada varia conforme o clima." + }, + "hiddenPower": { + "name": "Hidden Power", + "effect": "Um ataque único que varia em tipo dependendo do Pokémon que está utilizando." + }, + "crossChop": { + "name": "Cross Chop", + "effect": "O usuário dá um golpe duplo com seus antebraços cruzados. Golpes críticos ocorrem mais facilmente." + }, + "twister": { + "name": "Twister", + "effect": "O usuário rapidamente cria um tornado vicioso para rasgar os Pokémon adversários. Isso pode fazê-los hesitar." + }, + "rainDance": { + "name": "Rain Dance", + "effect": "O usuário invoca uma chuva intensa que continua caindo por cinco turnos, fortalecendo os movimentos do tipo Água. Também enfraquece os movimentos do tipo fogo." + }, + "sunnyDay": { + "name": "Sunny Day", + "effect": "O usuário intensifica o sol por cinco turnos, fortalecendo os ataques do tipo Fogo. Também enfraquece os movimentos do tipo água." + }, + "crunch": { + "name": "Crunch", + "effect": "O usuário mastiga o alvo com presas afiadas. Isso também pode prejudicar a Defesa do alvo." + }, + "mirrorCoat": { + "name": "Mirror Coat", + "effect": "Um movimento de retaliação que contra-ataca qualquer ataque especial, infligindo o dobro do dano recebido." + }, + "psychUp": { + "name": "Psych Up", + "effect": "O usuário hipnotiza a si mesmo para copiar qualquer mudança de atributo feita pelo alvo." + }, + "extremeSpeed": { + "name": "Extreme Speed", + "effect": "O usuário ataca o alvo numa velocidade invisível ao olho nu. Esse movimento tem prioridade." + }, + "ancientPower": { + "name": "Ancient Power", + "effect": "O usuário ataca com um poder pré-histórico. Isso também pode fortalecer todos os atributos do usuário de uma vez." + }, + "shadowBall": { + "name": "Shadow Ball", + "effect": "O usuário arremessa uma esfera sombria no alvo. Isso também pode prejudicar a Defesa Especial do alvo." + }, + "futureSight": { + "name": "Future Sight", + "effect": "Dois turnos após esse movimento ser usado, uma grande quantidade de energia psíquica atinge o alvo." + }, + "rockSmash": { + "name": "Rock Smash", + "effect": "O usuário ataca com um soco. Isso também pode prejudicar o atributo de Defesa do alvo." + }, + "whirlpool": { + "name": "Whirlpool", + "effect": "O usuário prende o alvo num violento redemoinho por quatro ou cinco turnos." + }, + "beatUp": { + "name": "Beat Up", + "effect": "O usuário reúne todos os Pokémon da equipe para atacar o alvo. Quanto maior o número de Pokémon na equipe, maior será o número de ataques." + }, + "fakeOut": { + "name": "Fake Out", + "effect": "Um ataque que acerta primeiro e faz o alvo hesitar. Só funciona no primeiro turno do usuário em batalha." + }, + "uproar": { + "name": "Uproar", + "effect": "O usuário ataca gritando por três turnos. Durante esse tempo, ninguém pode cair no sono." + }, + "stockpile": { + "name": "Stockpile", + "effect": "O usuário carrega seu poder e fortalece a Defesa e a Defesa Especial. O movimento pode ser usado três vezes." + }, + "spitUp": { + "name": "Spit Up", + "effect": "O poder carregado usando o movimento Estocagem é liberado de uma só vez em um ataque. Quanto mais poder é armazenado, maior a força do movimento." + }, + "swallow": { + "name": "Swallow", + "effect": "O poder carregado usando o movimento Estocagem é absorvido pelo usuário para curar PS. Quanto mais poder for armazenado, mais PS serão recuperados." + }, + "heatWave": { + "name": "Heat Wave", + "effect": "O usuário ataca exalando um sopro ardente nos Pokémon adversários. Isso também pode deixar esses Pokémon queimados." + }, + "hail": { + "name": "Hail", + "effect": "O usuário invoca uma tempestade de granizo durante cinco turnos. Isso fere todos os Pokémon, exceto os tipo Gelo." + }, + "torment": { + "name": "Torment", + "effect": "O usuário atormenta o alvo, fazendo-o incapaz de usar o mesmo movimento duas vezes seguidas." + }, + "flatter": { + "name": "Flatter", + "effect": "Bajulação é usada para confundir o oponente. Entretanto, isso também fortalece o Ataque Especial do alvo." + }, + "willOWisp": { + "name": "Will-O-Wisp", + "effect": "O usuário atira uma sinistra chama azulada no alvo para causar uma queimadura." + }, + "memento": { + "name": "Memento", + "effect": "O usuário desmaia quando usa esse movimento. Em troca, prejudica duramente o Ataque e o Ataque Especial do alvo." + }, + "facade": { + "name": "Facade", + "effect": "Um ataque que dobra de poder caso o usuário esteja envenenado, queimado ou paralisado." + }, + "focusPunch": { + "name": "Focus Punch", + "effect": "O usuário foca sua mente antes de dar um soco. Esse ataque falhará caso o usuário seja atingido antes de executá-lo." + }, + "smellingSalts": { + "name": "Smelling Salts", + "effect": "Esse ataque causa o dobro do dano em um alvo paralisado. Entretanto, isso também cura a paralisia do alvo." + }, + "followMe": { + "name": "Follow Me", + "effect": "O usuário chama a atenção para si mesmo, fazendo todos os alvos mirarem apenas nele." + }, + "naturePower": { + "name": "Nature Power", + "effect": "Um ataque que faz uso do poder da natureza. Seus efeitos variam dependendo do ambiente ao redor do usuário." + }, + "charge": { + "name": "Charge", + "effect": "O usuário fortalece o poder do golpe do tipo Elétrico usado no próximo turno. Isso também fortalece a Defesa Especial do usuário." + }, + "taunt": { + "name": "Taunt", + "effect": "O alvo é provocado e fica em fúria, fazendo-o usar apenas movimentos de ataque por três turnos." + }, + "helpingHand": { + "name": "Helping Hand", + "effect": "O usuário auxilia um aliado, fortalecendo o poder do ataque desse aliado." + }, + "trick": { + "name": "Trick", + "effect": "O usuário pega o alvo de surpresa e faz uma troca de itens com o alvo." + }, + "rolePlay": { + "name": "Role Play", + "effect": "O usuário imita o alvo completamente, copiando a Habilidade natural do alvo." + }, + "wish": { + "name": "Wish", + "effect": "Um turno após esse movimento ter sido usado, os PS do usuário ou de seu substituinte são restaurados pela metade dos PS máximos do usuário." + }, + "assist": { + "name": "Assist", + "effect": "O usuário na pressa usa aleatoriamente um dos movimentos conhecidos pelos outros Pokémon na equipe." + }, + "ingrain": { + "name": "Ingrain", + "effect": "O usuário planta suas raízes para curar seus PS por turno. Devido ao enraizamento, ele não pode sair da batalha." + }, + "superpower": { + "name": "Superpower", + "effect": "O usuário ataca o alvo com grande poder. Entretanto, isso também prejudica o Ataque e Defesa do usuário." + }, + "magicCoat": { + "name": "Magic Coat", + "effect": "Uma barreira que reflete de volta ao alvo movimentos como Semente Drenante e movimentos que reduzem atributos." + }, + "recycle": { + "name": "Recycle", + "effect": "O usuário recicla um item segurado que já foi usado em batalha para que possa ser usado de novo." + }, + "revenge": { + "name": "Revenge", + "effect": "Um movimento atacante que inflige o dobro do dano se o usuário foi ferido pelo adversário no mesmo turno." + }, + "brickBreak": { + "name": "Brick Break", + "effect": "O usuário ataca com um corte veloz. Isso também quebra barreiras como Tela de Luz e Refletir." + }, + "yawn": { + "name": "Yawn", + "effect": "O usuário dá um grande e preguiçoso bocejo que acalma o alvo, fazendo-o cair no sono no próximo turno." + }, + "knockOff": { + "name": "Knock Off", + "effect": "O usuário dá um tapa no item segurado pelo alvo e esse item não poderá mais ser usado naquela batalha. Caso possua um item, o alvo receberá mais dano." + }, + "endeavor": { + "name": "Endeavor", + "effect": "Um movimento de ataque que corta os PS do alvo para que se equalize aos PS do usuário." + }, + "eruption": { + "name": "Eruption", + "effect": "O usuário ataca o Pokémon adversário com uma fúria explosiva. Quanto menor for os PS do usuário, menor será o poder do movimento." + }, + "skillSwap": { + "name": "Skill Swap", + "effect": "O usuário utiliza seu poder psíquico para trocar de Habilidade com o alvo." + }, + "imprison": { + "name": "Imprison", + "effect": "Se os Pokémon adversários conhecerem algum movimento também conhecido pelo usuário, eles não poderão usá-lo." + }, + "refresh": { + "name": "Refresh", + "effect": "O usuário descansa para curar a si mesmo de envenenamentos, queimaduras ou paralisias." + }, + "grudge": { + "name": "Grudge", + "effect": "Se o usuário desmaiar, o rancor do usuário vai esgotar completamente os PP do movimento que o nocauteou." + }, + "snatch": { + "name": "Snatch", + "effect": "O usuário rouba o efeito de qualquer tentativa de usar um movimento de cura ou mudança de atributo." + }, + "secretPower": { + "name": "Secret Power", + "effect": "Os efeitos adicionais deste movimento variam dependendo do ambiente ao redor do usuário." + }, + "dive": { + "name": "Dive", + "effect": "Mergulhando no primeiro turno, o usuário emerge e ataca no próximo turno." + }, + "armThrust": { + "name": "Arm Thrust", + "effect": "O usuário solta uma sequência de golpes braçais com as palmas abertas, de duas a cinco vezes seguidas." + }, + "camouflage": { + "name": "Camouflage", + "effect": "O tipo do usuário é mudado dependendo do ambiente ao seu redor, como na margem da água, rodeado por grama ou dentro de uma caverna." + }, + "tailGlow": { + "name": "Tail Glow", + "effect": "O usuário direciona seu olhar à luzes piscantes para focar sua mente, aumentando drasticamente o seu Ataque Especial." + }, + "lusterPurge": { + "name": "Luster Purge", + "effect": "O usuário libera uma explosão de luz letal. Isso pode prejudicar a Defesa Especial do alvo." + }, + "mistBall": { + "name": "Mist Ball", + "effect": "Um amalgamado de penas nevoentas envolvem e ferem o alvo. Isso pode prejudicar o Ataque Especial do alvo." + }, + "featherDance": { + "name": "Feather Dance", + "effect": "O usuário cobre o corpo do alvo com uma grande massa de penas que prejudicam duramente o Ataque do alvo." + }, + "teeterDance": { + "name": "Teeter Dance", + "effect": "O usuário performa uma dança desajeitada que confunde os Pokémon ao seu redor." + }, + "blazeKick": { + "name": "Blaze Kick", + "effect": "O usuário lança um chute que acerta golpes críticos com mais facilidade. Isso também pode deixar o alvo queimado." + }, + "mudSport": { + "name": "Mud Sport", + "effect": "O usuário chuta lama ao redor do campo de batalha. Isso enfraquece os golpes do tipo Elétrico por cinco turnos." + }, + "iceBall": { + "name": "Ice Ball", + "effect": "O usuário ataca continuamente por cinco turnos. O ataque se torna mais forte cada vez que acerta." + }, + "needleArm": { + "name": "Needle Arm", + "effect": "O usuário ataca selvagemente balançando seus braços pontiagudos. Isso pode fazer o alvo hesitar." + }, + "slackOff": { + "name": "Slack Off", + "effect": "O usuário relaxa, restaurando os próprios PS pela metade dos seus PS máximos." + }, + "hyperVoice": { + "name": "Hyper Voice", + "effect": "O usuário libera um horrível grito estridente com o poder de infligir dano." + }, + "poisonFang": { + "name": "Poison Fang", + "effect": "O usuário morde o alvo com suas presas tóxicas. Isso pode envenenar seriamente o alvo." + }, + "crushClaw": { + "name": "Crush Claw", + "effect": "O usuário retalha o alvo com garras duras e afiadas. Isso pode prejudicar a Defesa do alvo." + }, + "blastBurn": { + "name": "Blast Burn", + "effect": "O alvo é arrasado por uma ardente explosão. O usuário não pode se mover no próximo turno." + }, + "hydroCannon": { + "name": "Hydro Cannon", + "effect": "O alvo é acertado por uma explosão aquática. O usuário não pode se mover no próximo turno." + }, + "meteorMash": { + "name": "Meteor Mash", + "effect": "O alvo é acertado por um soco forte disparado como um meteoro. Isso pode fortalecer o Ataque do usuário." + }, + "astonish": { + "name": "Astonish", + "effect": "O usuário ataca o alvo enquanto grita de forma alarmante. Isso pode fazer o alvo hesitar." + }, + "weatherBall": { + "name": "Weather Ball", + "effect": "Um ataque que varia de poder e tipo dependendo do clima." + }, + "aromatherapy": { + "name": "Aromatherapy", + "effect": "O usuário lança uma fragrância calmante que cura todos os estados negativos afetando a equipe do usuário." + }, + "fakeTears": { + "name": "Fake Tears", + "effect": "O usuário finge chorar para perturbar o alvo, duramente prejudicando a sua Defesa Especial." + }, + "airCutter": { + "name": "Air Cutter", + "effect": "O usuário lança uma rajada de vento afiado para cortar seus oponentes. Golpes críticos ocorrem mais facilmente." + }, + "overheat": { + "name": "Overheat", + "effect": "O usuário ataca o alvo com seu poder máximo; contudo, o efeito colateral diminui o Ataque Especial do usuário." + }, + "odorSleuth": { + "name": "Odor Sleuth", + "effect": "Permite que um alvo do tipo Fantasma seja atingido por ataques do tipo Normal e Lutador. Isso também permite que um alvo evasivo seja acertado." + }, + "rockTomb": { + "name": "Rock Tomb", + "effect": "Rochas são arremessadas no alvo. Isso também diminui a Velocidade do alvo, impedindo que se movimente." + }, + "silverWind": { + "name": "Silver Wind", + "effect": "O alvo é atacado com escamas pulverulentas sopradas pelo vento. Isso pode aumentar todos os atributos do usuário." + }, + "metalSound": { + "name": "Metal Sound", + "effect": "Um som horrível que lembra metal sendo raspado, isso prejudica duramente a Defesa Especial do alvo." + }, + "grassWhistle": { + "name": "Grass Whistle", + "effect": "O usuário toca uma agradável melodia que acalma o alvo, fazendo-o entrar em sono profundo." + }, + "tickle": { + "name": "Tickle", + "effect": "O usuário faz cócegas no alvo, o fazendo rir, reduzindo seus atributos de Ataque e Defesa." + }, + "cosmicPower": { + "name": "Cosmic Power", + "effect": "O usuário absorve energia mística do espaço para aumentar sua Defesa e Defesa Especial." + }, + "waterSpout": { + "name": "Water Spout", + "effect": "O usuário jorra água para ferir os Pokémon oponentes. Quanto menos PS o usuário tiver, menor será o poder do movimento." + }, + "signalBeam": { + "name": "Signal Beam", + "effect": "O usuário ataca com um raio de luz sinistro. Isso também pode confundir o alvo." + }, + "shadowPunch": { + "name": "Shadow Punch", + "effect": "O usuário dispara um soco dentre as sombras. Esse ataque nunca erra." + }, + "extrasensory": { + "name": "Extrasensory", + "effect": "O usuário ataca com um poder estranho e incompreensível. Isso também pode fazer o alvo hesitar." + }, + "skyUppercut": { + "name": "Sky Uppercut", + "effect": "O usuário ataca o alvo com um gancho de direita poderoso direcionado ao céu." + }, + "sandTomb": { + "name": "Sand Tomb", + "effect": "O usuário prende o alvo dentro de uma violenta tempestade de areia por quatro ou cinco turnos." + }, + "sheerCold": { + "name": "Sheer Cold", + "effect": "O alvo desmaia instantaneamente. É mais difícil de acertar se o usuário não for um tipo Gelo." + }, + "muddyWater": { + "name": "Muddy Water", + "effect": "O usuário ataca atirando água barrenta nos Pokémon adversários. Isso também pode diminuir a Precisão deles." + }, + "bulletSeed": { + "name": "Bullet Seed", + "effect": "O usuário atira sementes com grande força no alvo de duas a cinco vezes seguidas." + }, + "aerialAce": { + "name": "Aerial Ace", + "effect": "O usuário confunde o alvo com sua velocidade e então ataca. Esse ataque nunca erra." + }, + "icicleSpear": { + "name": "Icicle Spear", + "effect": "O usuário arremessa lanças afiadas de gelo no alvo de duas a cinco vezes seguidas." + }, + "ironDefense": { + "name": "Iron Defense", + "effect": "O usuário endurece a superfície de seu corpo como aço, bruscamente fortalecendo sua Defesa." + }, + "block": { + "name": "Block", + "effect": "O usuário bloqueia o caminho do alvo com seus braços amplamente abertos para prevenir escapatória." + }, + "howl": { + "name": "Howl", + "effect": "O usuário uiva alto para fortalecer seu espirito, o que aumenta seu Ataque." + }, + "dragonClaw": { + "name": "Dragon Claw", + "effect": "O usuário corta o alvo com grandes garras afiadas." + }, + "frenzyPlant": { + "name": "Frenzy Plant", + "effect": "O usuário esmaga o alvo com uma enorme árvore. O usuário não pode se mover no próximo turno." + }, + "bulkUp": { + "name": "Bulk Up", + "effect": "O usuário flexiona os seus músculos para fortalecer seu corpo, aumentando os seus atributos de Ataque e Defesa." + }, + "bounce": { + "name": "Bounce", + "effect": "O usuário pula alto e então cai em cima do alvo no segundo turno. Isso também pode deixar o alvo com paralisia." + }, + "mudShot": { + "name": "Mud Shot", + "effect": "O usuário ataca arremessando uma bola de lama ao alvo. Isso também diminui a Velocidade do alvo." + }, + "poisonTail": { + "name": "Poison Tail", + "effect": "O usuário acerta o alvo com sua cauda. Isso também pode envenenar o alvo. Golpes críticos ocorrem mais facilmente." + }, + "covet": { + "name": "Covet", + "effect": "O usuário, despretensiosamente, se aproxima do alvo e então rouba o item segurado pelo alvo." + }, + "voltTackle": { + "name": "Volt Tackle", + "effect": "O usuário eletrifica a si próprio e então ataca. Isso também fere muito o usuário. Pode deixar o alvo com paralisia." + }, + "magicalLeaf": { + "name": "Magical Leaf", + "effect": "O usuário espalha folhas peculiares que perseguem o alvo. Esse ataque nunca erra." + }, + "waterSport": { + "name": "Water Sport", + "effect": "O usuário encharca o campo de batalha. Isso enfraquece os movimentos do tipo Fogo por cinco turnos." + }, + "calmMind": { + "name": "Calm Mind", + "effect": "O usuário silenciosamente focaliza sua mente e acalma o seu espírito para aumentar ambos os atributos especiais." + }, + "leafBlade": { + "name": "Leaf Blade", + "effect": "O usuário empunha uma folha afiada como uma espada e ataca cortando o alvo. Golpes críticos acertam mais facilmente." + }, + "dragonDance": { + "name": "Dragon Dance", + "effect": "O usuário, energicamente, performa uma dança mística e poderosa para aumentar seu Ataque e Velocidade." + }, + "rockBlast": { + "name": "Rock Blast", + "effect": "O usuário arremessa rochas duras no alvo. Duas a cinco rochas são lançadas em sequência." + }, + "shockWave": { + "name": "Shock Wave", + "effect": "O usuário atinge o alvo com um repentino ataque de eletricidade. Esse ataque nunca erra." + }, + "waterPulse": { + "name": "Water Pulse", + "effect": "O usuário ataca o alvo com uma pulsante explosão de água. Talvez isso confunda o alvo." + }, + "doomDesire": { + "name": "Doom Desire", + "effect": "Dois turnos após esse movimento ter sido usado, o usuário explode o alvo com um feixe de luz concentrado." + }, + "psychoBoost": { + "name": "Psycho Boost", + "effect": "O usuário ataca o alvo com poder máximo. O efeito colateral do ataque prejudica duramente o Ataque Especial do usuário." + }, + "roost": { + "name": "Roost", + "effect": "O usuário pousa e descansa seu corpo. Isso restaura os PS do usuário pela metade do seu máximo de PS." + }, + "gravity": { + "name": "Gravity", + "effect": "Permite que Pokémon do tipo Voador ou Pokémon com a Habilidade Levitação possam ser atingidos por golpes do tipo Terra. Golpes que envolvam voar ficam inutilizados." + }, + "miracleEye": { + "name": "Miracle Eye", + "effect": "Permite que um alvo tipo Sombrio seja atingido por ataques do tipo Psíquico. Isso também permite que um alvo evasivo possa ser atingido." + }, + "wakeUpSlap": { + "name": "Wake-Up Slap", + "effect": "Esse ataque causa muito dano em um alvo que estiver dormindo; entretanto, isso também acorda o alvo." + }, + "hammerArm": { + "name": "Hammer Arm", + "effect": "O usuário balança seus braços e atinge com seus fortes e pesados punhos. Isso diminui a Velocidade do usuário." + }, + "gyroBall": { + "name": "Gyro Ball", + "effect": "O alvo é acertado com um giro em alta velocidade. Quanto mais lento for o usuário comparado ao alvo, maior será o poder do movimento." + }, + "healingWish": { + "name": "Healing Wish", + "effect": "O usuário desmaia. Em troca, o Pokémon que tomará seu lugar terá seus PS restaurados e condições negativas curadas." + }, + "brine": { + "name": "Brine", + "effect": "Se os PS do alvo estiverem pela metade ou menos, esse ataque terá o dobro do poder." + }, + "naturalGift": { + "name": "Natural Gift", + "effect": "O usuário canaliza o poder para atacar usando a Fruta que está segurando. A Fruta determina o tipo e o poder do movimento." + }, + "feint": { + "name": "Feint", + "effect": "Um ataque que acerta um alvo usando Proteção ou Detectar. Isso também extingue os efeitos desses movimentos." + }, + "pluck": { + "name": "Pluck", + "effect": "O usuário bica o alvo. Caso o alvo esteja segurando uma Fruta, o usuário a come e ganha seu efeito." + }, + "tailwind": { + "name": "Tailwind", + "effect": "O usuário forma um turbulento redemoinho que aumenta a Velocidade do usuário e de seus seus aliados por quatro turnos." + }, + "acupressure": { + "name": "Acupressure", + "effect": "O usuário aplica pressão em pontos de estresse, bruscamente fortalecendo um de seus atributos ou de seus aliados." + }, + "metalBurst": { + "name": "Metal Burst", + "effect": "O usuário revida com muito mais força contra o alvo que lhe infligiu dano por ultimo." + }, + "uTurn": { + "name": "U-turn", + "effect": "Depois de fazer o seu ataque, o usuário corre de volta para trocar de lugar com um Pokémon da própria equipe." + }, + "closeCombat": { + "name": "Close Combat", + "effect": "O usuário luta com o alvo de perto sem se defender. Isso diminui a Defesa e Defesa Especial do usuário." + }, + "payback": { + "name": "Payback", + "effect": "O usuário acumula poder, então ataca. Se o usuário se mover depois do alvo, o poder deste ataque será dobrado." + }, + "assurance": { + "name": "Assurance", + "effect": "Caso o alvo já tenha recebido dano no mesmo turno, o poder desse ataque é dobrado." + }, + "embargo": { + "name": "Embargo", + "effect": "Este movimento previne que o alvo use o seu item por cinco turnos. Seu Treinador também estará restrito de usar itens nele." + }, + "fling": { + "name": "Fling", + "effect": "O usuário arremessa seu item no alvo para atacar. O poder e o efeito deste movimento dependem do item utilizado." + }, + "psychoShift": { + "name": "Psycho Shift", + "effect": "Usando seu poder psíquico da sugestão, o usuário transfere suas condições de estado para o alvo." + }, + "trumpCard": { + "name": "Trump Card", + "effect": "Quanto menos PP este movimento tiver, maior será sua força." + }, + "healBlock": { + "name": "Heal Block", + "effect": "Por cinco turnos, o usuário previne que a equipe adversária use quaisquer movimentos, Habilidades, ou itens segurados para recuperar PS." + }, + "wringOut": { + "name": "Wring Out", + "effect": "O usuário torce o alvo com força bruta. Quando mais PS o alvo possuir, maior será o poder do movimento." + }, + "powerTrick": { + "name": "Power Trick", + "effect": "O usuário usufrui de seu poder psíquico para trocar os atributos de seu Ataque com sua Defesa." + }, + "gastroAcid": { + "name": "Gastro Acid", + "effect": "O usuário arremessa os ácidos de seu estômago no alvo. O fluido elimina o efeito da habilidade do alvo." + }, + "luckyChant": { + "name": "Lucky Chant", + "effect": "O usuário recita um encantamento em direção ao céu, prevenindo que os Pokémon oponentes acertem golpes críticos." + }, + "meFirst": { + "name": "Me First", + "effect": "O usuário corta a ação do alvo para roubar seu movimento e usá-lo com maior poder. Esse movimento falha caso não seja usado primeiro." + }, + "copycat": { + "name": "Copycat", + "effect": "O usuário imita o movimento imediatamente usado antes dele. O movimento falha caso nenhum outro movimento tenha sido usado." + }, + "powerSwap": { + "name": "Power Swap", + "effect": "O usuário usufrui de seu poder psíquico para trocar mudanças de atributos feitas ao seu Ataque e Ataque Especial com os do alvo." + }, + "guardSwap": { + "name": "Guard Swap", + "effect": "O usuário usufrui de seu poder psíquico para trocar mudanças de atributos feitas à sua Defesa e Defesa Especial com as do alvo." + }, + "punishment": { + "name": "Punishment", + "effect": "Quanto mais os atributos do alvo estiverem fortalecidos, maior será o poder desse movimento." + }, + "lastResort": { + "name": "Last Resort", + "effect": "Este movimento somente pode ser usado depois de o usuário ter usado todos os outros movimentos que ele conhece em batalha." + }, + "worrySeed": { + "name": "Worry Seed", + "effect": "Uma semente que causa preocupação é plantada no alvo. Isso previne o sono, fazendo a Habilidade do alvo se tornar Insônia." + }, + "suckerPunch": { + "name": "Sucker Punch", + "effect": "Esse movimento permite que o usuário ataque primeiro. Esse ataque falha caso o alvo não esteja preparando um ataque." + }, + "toxicSpikes": { + "name": "Toxic Spikes", + "effect": "O usuário planta uma armadilha de espinhos venenosos nos pés da equipe adversária. Os espinhos envenenam os Pokémon que entram em batalha." + }, + "heartSwap": { + "name": "Heart Swap", + "effect": "O usuário usufrui de seu poder psíquico para trocar mudanças de atributos com o oponente." + }, + "aquaRing": { + "name": "Aqua Ring", + "effect": "O usuário envolve-se em um véu feito de água. Ele recupera um pouco de PS a cada turno." + }, + "magnetRise": { + "name": "Magnet Rise", + "effect": "O usuário levita usando magnetismo gerado por eletricidade por cinco turnos." + }, + "flareBlitz": { + "name": "Flare Blitz", + "effect": "O usuário cobre o próprio corpo com chamas e avança no alvo. Isso também fere muito o usuário e pode deixar o alvo com uma queimadura." + }, + "forcePalm": { + "name": "Force Palm", + "effect": "O alvo é atacado com uma onda de choque. Isso também pode deixar o alvo com paralisia." + }, + "auraSphere": { + "name": "Aura Sphere", + "effect": "O usuário libera uma explosão de poder da aura de seu corpo no alvo. Esse ataque nunca erra." + }, + "rockPolish": { + "name": "Rock Polish", + "effect": "O usuário pule seu corpo para reduzir entraves. Isso pode aumentar bruscamente a Velocidade." + }, + "poisonJab": { + "name": "Poison Jab", + "effect": "O alvo é perfurado com um tentáculo ou braço banhado com veneno. Isso também pode envenenar o alvo." + }, + "darkPulse": { + "name": "Dark Pulse", + "effect": "O usuário descarrega uma horrível aura imbuída com pensamentos obscuros. Isso também pode fazer o alvo hesitar." + }, + "nightSlash": { + "name": "Night Slash", + "effect": "O usuário retalha o alvo no instante que surge uma oportunidade. Golpes críticos ocorrem mais facilmente." + }, + "aquaTail": { + "name": "Aqua Tail", + "effect": "O usuário ataca balançando sua cauda como se fosse uma violenta e furiosa tempestade." + }, + "seedBomb": { + "name": "Seed Bomb", + "effect": "O usuário atira uma barragem de sementes de casca dura acertando o alvo por cima." + }, + "airSlash": { + "name": "Air Slash", + "effect": "O usuário ataca com uma lâmina de ar que corta até mesmo o céu. Isso pode fazer o alvo hesitar." + }, + "xScissor": { + "name": "X-Scissor", + "effect": "O usuário cutila o alvo cruzando suas foices ou garras como se elas fossem um par de tesouras." + }, + "bugBuzz": { + "name": "Bug Buzz", + "effect": "O usuário gera uma dolorosa onda de som. Isso também pode diminuir o atributo de Defesa Especial do alvo." + }, + "dragonPulse": { + "name": "Dragon Pulse", + "effect": "O alvo é atacado com uma onda de choque gerada pela boca aberta do usuário." + }, + "dragonRush": { + "name": "Dragon Rush", + "effect": "O usuário ataca o alvo enquanto demonstra uma ameaça esmagadora. Isso também pode fazer o alvo hesitar." + }, + "powerGem": { + "name": "Power Gem", + "effect": "O usuário ataca com um raio de luz que brilha como se fosse feito de pedras preciosas." + }, + "drainPunch": { + "name": "Drain Punch", + "effect": "Um soco que drena energia. Os PS do usuário são curados pela metade do dano infligido ao alvo." + }, + "vacuumWave": { + "name": "Vacuum Wave", + "effect": "O usuário rodopia seus punhos para lançar uma onda de vácuo puro no alvo. Esse movimento tem prioridade." + }, + "focusBlast": { + "name": "Focus Blast", + "effect": "O usuário eleva seu foco mental e libera o seu poder. Isso também pode diminuir a Defesa Especial do alvo." + }, + "energyBall": { + "name": "Energy Ball", + "effect": "O usuário extrai o poder da natureza e dispara no alvo. Isso também pode diminuir a Defesa Especial do alvo." + }, + "braveBird": { + "name": "Brave Bird", + "effect": "O usuário dobra suas asas e avança de uma baixa altitude. Isso também fere muito o usuário." + }, + "earthPower": { + "name": "Earth Power", + "effect": "O usuário faz o solo debaixo do alvo emergir com poder. Isso também pode diminuir a Defesa Especial do alvo." + }, + "switcheroo": { + "name": "Switcheroo", + "effect": "O usuário troca de itens com o alvo mais rápido do que os olhos podem acompanhar." + }, + "gigaImpact": { + "name": "Giga Impact", + "effect": "O usuário investe no alvo usando absolutamente todo o seu poder. O usuário não poderá se mover no próximo turno." + }, + "nastyPlot": { + "name": "Nasty Plot", + "effect": "O usuário estimula seu cérebro com pensamentos malvados. Isso bruscamente aumenta o Ataque Especial do usuário." + }, + "bulletPunch": { + "name": "Bullet Punch", + "effect": "O usuário atinge o alvo com socos fortes tão rápidos como tiros. Esse movimento tem prioridade." + }, + "avalanche": { + "name": "Avalanche", + "effect": "Um ataque que inflige o dobro do dano caso o usuário já tenha sido ferido pelo alvo no mesmo turno." + }, + "iceShard": { + "name": "Ice Shard", + "effect": "O usuário congela rapidamente cristais de gelo e os arremessa no alvo. Esse movimento tem prioridade." + }, + "shadowClaw": { + "name": "Shadow Claw", + "effect": "O usuário corta com uma garra afiada feita de sombras. Golpes críticos ocorrem mais facilmente." + }, + "thunderFang": { + "name": "Thunder Fang", + "effect": "O usuário morde com presas eletrificadas. Isso também pode fazer o alvo hesitar ou deixá-lo paralisado." + }, + "iceFang": { + "name": "Ice Fang", + "effect": "O usuário morde com presas infundidas com gelo. Isso também pode fazer o alvo hesitar ou deixá-lo congelado." + }, + "fireFang": { + "name": "Fire Fang", + "effect": "O usuário morde com presas cobertas de fogo. Isso também pode fazer o alvo hesitar ou deixá-lo queimado." + }, + "shadowSneak": { + "name": "Shadow Sneak", + "effect": "O usuário estende a própria sombra e ataca o alvo por trás. Esse movimento tem prioridade." + }, + "mudBomb": { + "name": "Mud Bomb", + "effect": "O usuário lança uma bola concentrada de lama para atacar. Isso também pode diminuir a Precisão do alvo." + }, + "psychoCut": { + "name": "Psycho Cut", + "effect": "O usuário corta o alvo com lâminas materializadas com poder psíquico. Golpes críticos ocorrem mais facilmente." + }, + "zenHeadbutt": { + "name": "Zen Headbutt", + "effect": "O usuário foca sua força de vontade em sua cabeça e ataca o alvo. Isso também pode fazer o alvo hesitar." + }, + "mirrorShot": { + "name": "Mirror Shot", + "effect": "O usuário libera um clarão de energia vindo de seu corpo polido no alvo. Isso pode diminuir a Precisão do alvo." + }, + "flashCannon": { + "name": "Flash Cannon", + "effect": "O usuário reúne toda a sua energia de luz e lança de uma só vez. Isso também pode diminuir a Defesa Especial do alvo." + }, + "rockClimb": { + "name": "Rock Climb", + "effect": "O usuário ataca o alvo o esmagando com uma incrível força bruta. Isso pode confundir o alvo." + }, + "defog": { + "name": "Defog", + "effect": "Um vento forte que dispersa as barreiras do alvo como Refletir ou Tela de Luz. Isso também diminui a Evasiva do oponente." + }, + "trickRoom": { + "name": "Trick Room", + "effect": "O usuário cria uma área bizarra onde Pokémon mais lentos se movem primeiro por cinco turnos." + }, + "dracoMeteor": { + "name": "Draco Meteor", + "effect": "Cometas são invocados do céu e caem sobre o alvo. O efeito colateral do ataque duramente prejudica o atributo de Ataque Especial do usuário." + }, + "discharge": { + "name": "Discharge", + "effect": "O usuário atinge tudo ao seu redor liberando uma explosão de eletricidade. Isso também pode causar paralisia." + }, + "lavaPlume": { + "name": "Lava Plume", + "effect": "O usuário queima tudo ao seu redor com um inferno de chamas escarlate. Isso também pode causar uma queimadura em alvos atingidos." + }, + "leafStorm": { + "name": "Leaf Storm", + "effect": "O usuário cria uma tempestade de folhas ao redor do alvo. Isso diminui duramente o Ataque Especial do usuário." + }, + "powerWhip": { + "name": "Power Whip", + "effect": "O usuário rodopia suas vinhas ou tentáculos com vigor para chicotear o alvo cruelmente." + }, + "rockWrecker": { + "name": "Rock Wrecker", + "effect": "O usuário lança uma grande rocha no alvo. O usuário não pode se mover no próximo turno." + }, + "crossPoison": { + "name": "Cross Poison", + "effect": "Um ataque cortante com uma lâmina envenenada que pode envenenar o alvo. Golpes críticos ocorrem mais facilmente." + }, + "gunkShot": { + "name": "Gunk Shot", + "effect": "O usuário atira lixo repugnante no alvo. Isso também pode envenenar o alvo." + }, + "ironHead": { + "name": "Iron Head", + "effect": "O usuário acerta o alvo com sua cabeça dura como aço. Isso também pode fazer o alvo hesitar." + }, + "magnetBomb": { + "name": "Magnet Bomb", + "effect": "O usuário lança bombas de aço que grudam no alvo. Esse ataque nunca erra." + }, + "stoneEdge": { + "name": "Stone Edge", + "effect": "O usuário perfura o alvo por baixo com pedras afiadas. Golpes críticos ocorrem mais facilmente." + }, + "captivate": { + "name": "Captivate", + "effect": "Se algum dos Pokémon oponentes forem do gênero oposto do usuário, ele se encanta, o que diminui duramente o seu Ataque Especial." + }, + "stealthRock": { + "name": "Stealth Rock", + "effect": "O usuário planta armadilhas de pedras levitantes ao redor da equipe oponente. A armadilha fere os Pokémon oponentes que entrarem em campo." + }, + "grassKnot": { + "name": "Grass Knot", + "effect": "O usuário planta uma armadilha com grama e o alvo tropeça nela. Quanto mais pesado o alvo for, maior é o poder do movimento." + }, + "chatter": { + "name": "Chatter", + "effect": "O usuário ataca o alvo com ondas de som vindas de sua tagarelagem ensurdecedora. Isso confunde o alvo." + }, + "judgment": { + "name": "Judgment", + "effect": "O usuário libera incontáveis tiros de luz no alvo. A tipagem desse movimento varia dependendo do tipo de Placa que o usuário está segurando." + }, + "bugBite": { + "name": "Bug Bite", + "effect": "O usuário morde o alvo. Caso o alvo esteja segurando uma Fruta, o usuário a come e ganha seu efeito." + }, + "chargeBeam": { + "name": "Charge Beam", + "effect": "O usuário ataca com uma carga elétrica. O usuário pode usar a eletricidade que sobrar para fortalecer seu Ataque Especial." + }, + "woodHammer": { + "name": "Wood Hammer", + "effect": "O usuário usa seu corpo rígido para golpear o alvo. Isso também fere muito o usuário." + }, + "aquaJet": { + "name": "Aqua Jet", + "effect": "O usuário ataca o alvo em uma velocidade que o torna quase invisível. Esse movimento tem prioridade." + }, + "attackOrder": { + "name": "Attack Order", + "effect": "O usuário ordena que seus subordinados ataquem o alvo. Golpes críticos ocorrem mais facilmente." + }, + "defendOrder": { + "name": "Defend Order", + "effect": "O usuário ordena que seus subordinados protejam seu corpo, aumentando seus atributos de Defesa e Defesa Especial." + }, + "healOrder": { + "name": "Heal Order", + "effect": "O usuário ordena que seus subordinados o curem. O usuário restaura até metade de seus PS máximos." + }, + "headSmash": { + "name": "Head Smash", + "effect": "O usuário usa toda a sua força para acertar uma perigosa cabeçada destrutiva no alvo. Isso também fere terrivelmente o usuário." + }, + "doubleHit": { + "name": "Double Hit", + "effect": "O usuário golpeia o alvo com uma longa cauda, vinhas, ou um tentáculo. O alvo é acertado duas vezes seguidas." + }, + "roarOfTime": { + "name": "Roar of Time", + "effect": "O usuário bombardeia o alvo com tamanho poder que distorce até mesmo o tempo; porém, não se moverá no próximo turno." + }, + "spacialRend": { + "name": "Spacial Rend", + "effect": "O usuário rasga a existência do alvo junto com o espaço ao seu redor. Golpes críticos ocorrem mais facilmente." + }, + "lunarDance": { + "name": "Lunar Dance", + "effect": "O usuário desmaia. Em troca, o Pokémon que tomará seu lugar terá suas condições negativas e PS restaurados." + }, + "crushGrip": { + "name": "Crush Grip", + "effect": "O alvo é esmagado com grande força. Quanto mais PS o alvo possuir, maior será o poder desse movimento." + }, + "magmaStorm": { + "name": "Magma Storm", + "effect": "O alvo é preso dentro de um turbilhão de fogo que arde de quatro a cinco turnos." + }, + "darkVoid": { + "name": "Dark Void", + "effect": "Pokémon oponentes são sugados para dentro de um mundo de total escuridão que os faz dormir." + }, + "seedFlare": { + "name": "Seed Flare", + "effect": "O usuário emite uma onda de choque de seu corpo para atacar o alvo. Isso também pode diminuir duramente a Defesa Especial do alvo." + }, + "ominousWind": { + "name": "Ominous Wind", + "effect": "O usuário ataca o alvo com uma rajada de vento repulsivo. Talvez aumente todos os atributos do usuário de uma vez." + }, + "shadowForce": { + "name": "Shadow Force", + "effect": "O usuário desaparece, então atinge o alvo no próximo turno. Esse movimento acerta o alvo mesmo que ele proteja a si mesmo." + }, + "honeClaws": { + "name": "Hone Claws", + "effect": "O usuário afia suas garras para fortalecer seu Ataque e sua Precisão." + }, + "wideGuard": { + "name": "Wide Guard", + "effect": "O usuário e seus aliados são protegidos de ataques de longo alcance por um turno." + }, + "guardSplit": { + "name": "Guard Split", + "effect": "O usuário usufrui de seu poder psíquico para equalizar seus atributos de Defesa e Defesa Especial com o alvo." + }, + "powerSplit": { + "name": "Power Split", + "effect": "O usuário usufrui de seu poder psíquico para igualar seus atributos de Ataque e Ataque Especial com o alvo." + }, + "wonderRoom": { + "name": "Wonder Room", + "effect": "O usuário cria uma área bizarra onde os atributos de Defesa e Defesa Especial dos Pokémon são trocados por cinco turnos." + }, + "psyshock": { + "name": "Psyshock", + "effect": "O usuário materializa uma estranha onda psíquica para atacar o alvo. Esse ataque inflige dano físico." + }, + "venoshock": { + "name": "Venoshock", + "effect": "O usuário encharca o alvo com um líquido venenoso especial. O poder desse movimento dobra se o alvo estiver envenenado." + }, + "autotomize": { + "name": "Autotomize", + "effect": "O usuário perde parte de seu corpo para se tornar mais leve e bruscamente aumentar seu atributo de Velocidade." + }, + "ragePowder": { + "name": "Rage Powder", + "effect": "O usuário espalha uma nuvem de pó irritante para chamar a atenção para si mesmo. Oponentes miram apenas no usuário." + }, + "telekinesis": { + "name": "Telekinesis", + "effect": "O usuário faz o alvo flutuar usando o seu poder psíquico. O alvo fica propício a ser atingido por três turnos." + }, + "magicRoom": { + "name": "Magic Room", + "effect": "O usuário cria uma área bizarra onde os itens dos Pokémon perdem seus efeitos por cinco turnos." + }, + "smackDown": { + "name": "Smack Down", + "effect": "O usuário atira uma pedra ou algum projétil similar para atacar o oponente. Um Pokémon voador irá cair no chão quando for acertado." + }, + "stormThrow": { + "name": "Storm Throw", + "effect": "O usuário atinge o alvo com um golpe poderoso. Esse ataque sempre resulta em um golpe critico." + }, + "flameBurst": { + "name": "Flame Burst", + "effect": "O usuário ataca o alvo com uma chama explosiva. A explosão da chama também fere os Pokémon próximos ao alvo." + }, + "sludgeWave": { + "name": "Sludge Wave", + "effect": "O usuário atinge tudo à volta inundando a área com uma grande onda de sedimentos. Isso também pode envenenar os atingidos." + }, + "quiverDance": { + "name": "Quiver Dance", + "effect": "O usuário delicadamente executa uma linda dança mística. Isso fortalece os atributos de Ataque Especial, Defesa Especial e Velocidade do usuário." + }, + "heavySlam": { + "name": "Heavy Slam", + "effect": "O usuário golpeia o alvo com seu corpo pesado. Quanto mais pesado o usuário for comparado ao alvo, maior será o poder do movimento." + }, + "synchronoise": { + "name": "Synchronoise", + "effect": "Usando uma estranha onda de choque, o usuário inflige dano em qualquer Pokémon do mesmo tipo na área ao seu redor." + }, + "electroBall": { + "name": "Electro Ball", + "effect": "O usuário arremessa uma esfera elétrica no alvo. Quanto mais rápido for o usuário comparado ao alvo, maior será o poder do movimento." + }, + "soak": { + "name": "Soak", + "effect": "O usuário atira uma corrente de água no alvo e muda a tipagem do alvo para Água." + }, + "flameCharge": { + "name": "Flame Charge", + "effect": "Ocultando-se nas chamas, o usuário ataca. Então, concentrando mais poder, o usuário aumenta sua Velocidade." + }, + "coil": { + "name": "Coil", + "effect": "O usuário enrola seu corpo e se concentra. Isso aumenta seus atributos de Ataque, Defesa e Precisão." + }, + "lowSweep": { + "name": "Low Sweep", + "effect": "O usuário faz um ataque repentino nas pernas do alvo, diminuindo a Velocidade dele." + }, + "acidSpray": { + "name": "Acid Spray", + "effect": "O usuário cospe um fluido corrosivo no alvo. Isso duramente diminui a Defesa Especial do alvo." + }, + "foulPlay": { + "name": "Foul Play", + "effect": "O usuário vira o poder do alvo contra ele. Quanto maior for o atributo de Ataque do alvo, maior será o poder do movimento." + }, + "simpleBeam": { + "name": "Simple Beam", + "effect": "Essa misteriosa onda psíquica produzida pelo usuário muda a Habilidade do alvo para “Simples”." + }, + "entrainment": { + "name": "Entrainment", + "effect": "O usuário dança em um ritmo estranho que contagia o alvo que o imita, fazendo a Habilidade do alvo tornar-se a mesma que a do usuário." + }, + "afterYou": { + "name": "After You", + "effect": "O usuário auxilia o alvo e o faz usar seu movimento exatamente após o usuário." + }, + "round": { + "name": "Round", + "effect": "O usuário ataca o alvo com uma música. Outros podem entrar na Ronda e fazer o ataque dar um dano ainda maior." + }, + "echoedVoice": { + "name": "Echoed Voice", + "effect": "O usuário ataca o alvo com uma voz ecoante. Se esse movimento for usado um turno após o outro, ele infligirá dano maior." + }, + "chipAway": { + "name": "Chip Away", + "effect": "Procurando por uma brecha, o usuário ataca consistentemente. As mudanças de atributos do alvo não afetam o dano desse movimento." + }, + "clearSmog": { + "name": "Clear Smog", + "effect": "O usuário ataca arremessando um amontoado de lama especial. Todas as mudanças de atributos voltam ao normal." + }, + "storedPower": { + "name": "Stored Power", + "effect": "O usuário ataca o alvo com seu poder armazenado. Quanto mais os atributos do usuário estiverem fortalecidos, maior será o poder do movimento." + }, + "quickGuard": { + "name": "Quick Guard", + "effect": "O usuário protege a si mesmo e seus aliados de golpes de prioridade." + }, + "allySwitch": { + "name": "Ally Switch", + "effect": "O usuário teletransporta usando um estranho poder e troca de lugar com um de seus aliados." + }, + "scald": { + "name": "Scald", + "effect": "O usuário atira água fervente no seu alvo. Isso também pode deixar o alvo com queimadura." + }, + "shellSmash": { + "name": "Shell Smash", + "effect": "O usuário quebra a própria concha, diminuindo sua Defesa e Defesa Especial, mas bruscamente aumentando Ataque, Ataque Especial e Velocidade." + }, + "healPulse": { + "name": "Heal Pulse", + "effect": "O usuário emite um pulso curativo que restaura os PS do alvo pela metade de seus PS máximos." + }, + "hex": { + "name": "Hex", + "effect": "Esse ataque cruel inflige dano massivo a um alvo afetado por condições negativas." + }, + "skyDrop": { + "name": "Sky Drop", + "effect": "O usuário leva o alvo para o céu, então o solta durante o próximo turno. O alvo não pode atacar enquanto estiver no céu." + }, + "shiftGear": { + "name": "Shift Gear", + "effect": "O usuário roda suas engrenagens, aumentando seu Ataque e bruscamente aumentando sua Velocidade." + }, + "circleThrow": { + "name": "Circle Throw", + "effect": "O alvo é arremessado, e um Pokémon diferente é trazido para a batalha. Na natureza, isso termina uma batalha contra um único Pokémon." + }, + "incinerate": { + "name": "Incinerate", + "effect": "O usuário ataca o Pokémon oponente com fogo. Se um Pokémon estiver segurando um certo item, como uma Fruta, o item será queimado e inutilizado." + }, + "quash": { + "name": "Quash", + "effect": "O usuário reprime o alvo e o faz se mover por último." + }, + "acrobatics": { + "name": "Acrobatics", + "effect": "O usuário atinge o alvo rapidamente. Se o usuário não estiver segurando um item, esse ataque causa um dano massivo." + }, + "reflectType": { + "name": "Reflect Type", + "effect": "O usuário reflete o tipo do alvo, fazendo-o ter o mesmo tipo do alvo." + }, + "retaliate": { + "name": "Retaliate", + "effect": "O usuário se vinga por um aliado desmaiado. Se um aliado desmaiou no turno anterior, esse movimento ficará mais poderoso." + }, + "finalGambit": { + "name": "Final Gambit", + "effect": "O usuário arrisca tudo para atacar seu alvo. O usuário desmaia porém inflige dano igual aos seus PS perdidos." + }, + "bestow": { + "name": "Bestow", + "effect": "O usuário passa seu item ao alvo se o alvo não estiver segurando um item." + }, + "inferno": { + "name": "Inferno", + "effect": "O usuário ataca engolindo o alvo em intensas chamas. intense fire. Isso deixa o alvo com uma queimadura." + }, + "waterPledge": { + "name": "Water Pledge", + "effect": "Um pilar de água atinge o alvo. Quando combinado com seu equivalente do tipo fogo, seu dano aumenta e um arco-íris é formado." + }, + "firePledge": { + "name": "Fire Pledge", + "effect": "Um pilar de fogo atinge o alvo. Quando combinado com seu equivalente do tipo Planta, seu dano aumenta e um vasto mar de fogo aparece." + }, + "grassPledge": { + "name": "Grass Pledge", + "effect": "Um pilar de grama acerta o alvo. Quando combinado com seu equivalente do tipo Água, seu dano aumenta e um vasto pântano surge." + }, + "voltSwitch": { + "name": "Volt Switch", + "effect": "Depois de fazer o seu ataque, o usuário corre de volta para trocar de lugar com um Pokémon da própria equipe." + }, + "struggleBug": { + "name": "Struggle Bug", + "effect": "Enquanto resiste, o usuário ataca o Pokémon oponente. Isso diminui o Ataque Especial daqueles atingidos." + }, + "bulldoze": { + "name": "Bulldoze", + "effect": "O usuário atinge a todos ao seu redor pisoteando o chão. Isso diminui a Velocidade daqueles atingidos." + }, + "frostBreath": { + "name": "Frost Breath", + "effect": "O usuário sopra sua respiração gelada no alvo. Esse ataque sempre resulta em um acerto crítico." + }, + "dragonTail": { + "name": "Dragon Tail", + "effect": "O alvo é arremessado e um Pokémon diferente é trazido para o combate. Em batalhas selvagens, isso encerra a batalha contra um único Pokémon." + }, + "workUp": { + "name": "Work Up", + "effect": "O usuário se agita e seus atributos de Ataque e Ataque Especial são fortalecidos." + }, + "electroweb": { + "name": "Electroweb", + "effect": "O usuário ataca e captura os Pokémon adversários usando uma rede elétrica. Isso diminui a Velocidade deles." + }, + "wildCharge": { + "name": "Wild Charge", + "effect": "O usuário se cobre de eletricidade e colide com o seu alvo. Isso também fere um pouco o usuário." + }, + "drillRun": { + "name": "Drill Run", + "effect": "O usuário colide com seu alvo enquanto rotaciona seu corpo como uma broca. Golpes críticos acertam mais facilmente." + }, + "dualChop": { + "name": "Dual Chop", + "effect": "O usuário ataca o seu alvo o acertando com golpes brutais. O alvo é atingido duas vezes seguidas." + }, + "heartStamp": { + "name": "Heart Stamp", + "effect": "O usuário libera sua fúria em um golpe violento após enganar o alvo com sua atuação fofa. Isso também pode fazer o alvo hesitar." + }, + "hornLeech": { + "name": "Horn Leech", + "effect": "O usuário drena a energia do alvo com seus chifres. Os PS do usuário são restaurados pela metade do dano recebido pelo alvo." + }, + "sacredSword": { + "name": "Sacred Sword", + "effect": "O usuário ataca cortando com um longo chifre. As mudanças de atributos do alvo não afetam o dano desse ataque." + }, + "razorShell": { + "name": "Razor Shell", + "effect": "O usuário corta seu alvo com conchas afiadas. Isso pode também diminuir o atributo de Defesa do alvo." + }, + "heatCrash": { + "name": "Heat Crash", + "effect": "O usuário golpeia seu alvo com seu corpo envolto em chamas. Quanto mais pesado o usuário for comparado ao alvo, maior será o poder do movimento." + }, + "leafTornado": { + "name": "Leaf Tornado", + "effect": "O usuário ataca seu alvo cercando-o com folhas afiadas. Isso também pode diminuir a precisão do alvo." + }, + "steamroller": { + "name": "Steamroller", + "effect": "O usuário esmaga seu alvo rolando sobre ele com seu corpo enrolado como uma bola. Isso também pode fazer o alvo hesitar." + }, + "cottonGuard": { + "name": "Cotton Guard", + "effect": "O usuário protege a si mesmo envolvendo seu corpo em algodão macio, o que drasticamente aumenta o atributo de Defesa do usuário." + }, + "nightDaze": { + "name": "Night Daze", + "effect": "O usuário libera uma onda de choque escura como a noite no alvo. Isso também pode reduzir a Precisão do alvo." + }, + "psystrike": { + "name": "Psystrike", + "effect": "O usuário materializa uma estranha onda psíquica para atacar o alvo. Esse ataque inflige dano físico." + }, + "tailSlap": { + "name": "Tail Slap", + "effect": "O usuário ataca golpeando o alvo com sua cauda resistente. Isso acerta o alvo duas a cinco vezes seguidas." + }, + "hurricane": { + "name": "Hurricane", + "effect": "O usuário ataca prendendo seu oponente num violento turbilhão que voa alto no céu. Isso também pode confundir o alvo." + }, + "headCharge": { + "name": "Head Charge", + "effect": "O usuário ataca colidindo sua cabeça no alvo, usando sua pelagem protetora. Isso também fere um pouco o usuário." + }, + "gearGrind": { + "name": "Gear Grind", + "effect": "O usuário ataca arremessando engrenagens de aço no seu alvo duas vezes em sequência." + }, + "searingShot": { + "name": "Searing Shot", + "effect": "O usuário queima tudo ao seu redor com um inferno de chamas escarlate. Isso também pode causar uma queimadura em alvos atingidos." + }, + "technoBlast": { + "name": "Techno Blast", + "effect": "O usuário atira um raio de luz em seu alvo. O tipo do movimento muda dependendo do Disco que o usuário estiver segurando." + }, + "relicSong": { + "name": "Relic Song", + "effect": "O usuário canta uma antiga canção e ataca encantando o coração dos Pokémon adversários. Isso também pode induzir sono." + }, + "secretSword": { + "name": "Secret Sword", + "effect": "O usuário ataca cortando com seu longo chifre. O estranho poder contido no chifre inflige dano físico no alvo." + }, + "glaciate": { + "name": "Glaciate", + "effect": "O usuário ataca soprando ar congelante nos Pokémon oponentes. Isso diminui a Velocidade deles." + }, + "boltStrike": { + "name": "Bolt Strike", + "effect": "O usuário cobre a si mesmo com uma grande quantidade de eletricidade e avança no alvo. Isso também pode paralisar o alvo." + }, + "blueFlare": { + "name": "Blue Flare", + "effect": "O usuário ataca engolindo o alvo numa intensa, porém linda, chama azul. Isso também pode deixar o alvo com uma queimadura." + }, + "fieryDance": { + "name": "Fiery Dance", + "effect": "Coberto por chamas, o usuário dança e bate suas asas. Isso também pode aumentar o Ataque Especial do usuário." + }, + "freezeShock": { + "name": "Freeze Shock", + "effect": "No segundo turno, o usuário acerta o alvo com gelo eletricamente carregado. Isso também pode deixar o alvo paralisado." + }, + "iceBurn": { + "name": "Ice Burn", + "effect": "No segundo turno, um impiedoso vento gélido cerca o alvo. Isso pode deixar o alvo com uma queimadura." + }, + "snarl": { + "name": "Snarl", + "effect": "O usuário grita como se ele estivesse reclamando de algo, diminuindo o Ataque Especial do Pokémon oponente." + }, + "icicleCrash": { + "name": "Icicle Crash", + "effect": "O usuário ataca arremessando estacas de gelo no alvo violentamente. Isso também pode fazer o alvo hesitar." + }, + "vCreate": { + "name": "V-create", + "effect": "Com uma ardente chama em sua testa, o usuário joga seu corpo em direção ao alvo. Isso diminui a Defesa, Defesa Especial, e Velocidade do usuário." + }, + "fusionFlare": { + "name": "Fusion Flare", + "effect": "O usuário invoca uma chama gigante. Esse movimento é mais poderoso quando influenciado por um enorme raio." + }, + "fusionBolt": { + "name": "Fusion Bolt", + "effect": "O usuário conduz um raio gigantesco. Esse movimento é mais poderoso quando influenciado por uma enorme chama." + }, + "flyingPress": { + "name": "Flying Press", + "effect": "O usuário mergulha do céu em direção ao alvo. Esse movimento é simultaneamente do tipo Lutador e Voador." + }, + "matBlock": { + "name": "Mat Block", + "effect": "Usando uma esteira elevada como escudo, o usuário protege a si mesmo e a seus aliados de golpes que causam dano. Isso não previne condições negativas." + }, + "belch": { + "name": "Belch", + "effect": "O usuário expurga um arroto danificante no alvo. O usuário deve comer uma Fruta para usar esse movimento." + }, + "rototiller": { + "name": "Rototiller", + "effect": "O usuário ara o solo, facilitando o crescimento de plantas. Isso aumenta os atributos de Ataque e Ataque Especial dos Pokémon do tipo Planta." + }, + "stickyWeb": { + "name": "Sticky Web", + "effect": "O usuário tece uma teia viscosa ao redor da equipe adversária, o que diminui a Velocidade dos adversários após entrarem em campo." + }, + "fellStinger": { + "name": "Fell Stinger", + "effect": "Quando o usuário nocauteia um alvo com este movimento, o atributo de Ataque do usuário aumenta bruscamente." + }, + "phantomForce": { + "name": "Phantom Force", + "effect": "O usuário desaparece para algum lugar e então ataca o alvo no próximo turno. Esse movimento acerta mesmo se o alvo estiver se protegendo." + }, + "trickOrTreat": { + "name": "Trick-or-Treat", + "effect": "O usuário enche o alvo com o espírito do Halloween para celebrarem juntos. Isso adiciona o tipo Fantasma à tipagem do alvo." + }, + "nobleRoar": { + "name": "Noble Roar", + "effect": "Soltando um nobre rugido, o usuário intimida o alvo e diminui seus atributos de Ataque e Ataque Especial." + }, + "ionDeluge": { + "name": "Ion Deluge", + "effect": "O usuário dispersa partículas eletricamente carregadas, o que muda movimentos do tipo Normal para o tipo Elétrico." + }, + "parabolicCharge": { + "name": "Parabolic Charge", + "effect": "O usuário ataca tudo ao seu redor. Os PS do usuário são restaurados pela metade do dano recebido por aqueles que foram atingidos." + }, + "forestsCurse": { + "name": "Forest's Curse", + "effect": "O usuário conjura uma maldição da floresta no alvo. Isso adiciona o tipo Planta à tipagem do alvo." + }, + "petalBlizzard": { + "name": "Petal Blizzard", + "effect": "O usuário rotaciona uma violenta nevasca composta por pétalas e ataca tudo ao seu redor." + }, + "freezeDry": { + "name": "Freeze-Dry", + "effect": "O usuário rapidamente diminui a temperatura do alvo. Isso pode deixar o alvo congelado. Esse movimento é supereficaz contra tipos Água." + }, + "disarmingVoice": { + "name": "Disarming Voice", + "effect": "Liberando um grito encantador, o usuário inflige dano emocional nos Pokémon oponentes. Esse ataque nunca erra." + }, + "partingShot": { + "name": "Parting Shot", + "effect": "O usuário diminui os atributos de Ataque e Ataque Esp. do alvo com uma ameaça antes de ser trocado por outro Pokémon na equipe." + }, + "topsyTurvy": { + "name": "Topsy-Turvy", + "effect": "Todas as mudanças de atributos afetando o alvo viram de cabeça para baixo e se tornam o oposto do que eram." + }, + "drainingKiss": { + "name": "Draining Kiss", + "effect": "O usuário rouba a energia do alvo com um beijo. Os PS do usuário são restaurados além da metade do dano recebido pelo alvo." + }, + "craftyShield": { + "name": "Crafty Shield", + "effect": "O usuário protege a si mesmo e seus aliados de condições negativas com um misterioso poder. Isso não previne golpes que inflijam dano." + }, + "flowerShield": { + "name": "Flower Shield", + "effect": "Usando um misterioso poder, o usuário aumenta o atributo de Defesa de todos os Pokémon tipo Planta em batalha." + }, + "grassyTerrain": { + "name": "Grassy Terrain", + "effect": "O usuário transforma o campo de batalha em grama por cinco turnos. Isso restaura os PS dos Pokémon no solo um pouco a cada turno e fortalece golpes do tipo Grama." + }, + "mistyTerrain": { + "name": "Misty Terrain", + "effect": "Isto protege os Pokémon no solo de condições de estado e corta pela metade o dano dos movimentos do tipo Dragão por cinco turnos." + }, + "electrify": { + "name": "Electrify", + "effect": "Caso o alvo tenha sido energizado antes de usar um movimento durante aquele turno, o movimento do alvo se tornará do tipo Elétrico." + }, + "playRough": { + "name": "Play Rough", + "effect": "O usuário joga duro com o alvo e o ataca. Isso também pode diminuir o atributo de Ataque do alvo." + }, + "fairyWind": { + "name": "Fairy Wind", + "effect": "O usuário rotaciona um vento de fada e ataca o alvo com ele." + }, + "moonblast": { + "name": "Moonblast", + "effect": "Canalizando o poder da lua, o usuário ataca o alvo. Isso também pode diminuir o atributo de Ataque Especial do alvo." + }, + "boomburst": { + "name": "Boomburst", + "effect": "O usuário ataca tudo ao seu redor com o poder destrutivo de um terrível som explosivo." + }, + "fairyLock": { + "name": "Fairy Lock", + "effect": "Bloqueando o campo de batalha, o usuário previne que todos os Pokémon fujam durante o próximo turno." + }, + "kingsShield": { + "name": "King's Shield", + "effect": "O usuário assume uma posição defensiva enquanto protege a si mesmo de dano. Isto duramente diminui o Ataque de qualquer um que faça contato direto." + }, + "playNice": { + "name": "Play Nice", + "effect": "O usuário e o alvo se tornam amigos, fazendo com que o alvo perca sua vontade de lutar. Isso diminui o atributo de Ataque do alvo." + }, + "confide": { + "name": "Confide", + "effect": "O usuário conta um segredo para o alvo e o alvo perde sua habilidade de se concentrar. Isso diminui o Ataque Especial do alvo." + }, + "diamondStorm": { + "name": "Diamond Storm", + "effect": "O usuário provoca uma tempestade de diamantes para ferir os Pokémon oponentes. Isso também pode aumentar o atributo de Defesa do usuário." + }, + "steamEruption": { + "name": "Steam Eruption", + "effect": "O usuário imerge o alvo em vapor superaquecido. Isso também pode deixar o alvo com uma queimadura." + }, + "hyperspaceHole": { + "name": "Hyperspace Hole", + "effect": "Usando uma fenda espacial, o usuário aparece ao lado do alvo e ataca. Isso também acerta um alvo usando movimentos como Proteger ou Detectar." + }, + "waterShuriken": { + "name": "Water Shuriken", + "effect": "O usuário acerta o alvo jogando estrelas ninja de duas a cinco vezes seguidas. Esse movimento tem prioridade." + }, + "mysticalFire": { + "name": "Mystical Fire", + "effect": "O usuário ataca soprando um fogo ardente especial. Isso também diminui o Ataque Especial do alvo." + }, + "spikyShield": { + "name": "Spiky Shield", + "effect": "Além de proteger o alvo de ataques, este movimento também fere qualquer atacante que fizer contato direto." + }, + "aromaticMist": { + "name": "Aromatic Mist", + "effect": "Usando um misterioso aroma, o usuário aumenta o atributo de Defesa Especial de um Pokémon aliado." + }, + "eerieImpulse": { + "name": "Eerie Impulse", + "effect": "O corpo do usuário gera um impulso misterioso. O alvo exposto ao impulso tem seu Ataque Especial duramente diminuído." + }, + "venomDrench": { + "name": "Venom Drench", + "effect": "Pokémon oponentes são encharcados por um estranho líquido venenoso. Isso diminui o Ataque, Ataque Esp. e Velocidade de um alvo envenenado." + }, + "powder": { + "name": "Powder", + "effect": "O usuário cobre o alvo em pólvora. Se o alvo usar um movimento do tipo Fogo, a pólvora entra em combustão e causa dano ao alvo." + }, + "geomancy": { + "name": "Geomancy", + "effect": "O usuário absorve energia e bruscamente aumenta seus atributos de Ataque Especial, Defesa Especial e Velocidade no próximo turno." + }, + "magneticFlux": { + "name": "Magnetic Flux", + "effect": "O usuário manipula campos magnéticos, o que aumenta os atributos de Defesa e Defesa Especial de Pokémon aliados com as Habilidades “Mais” ou “Menos”." + }, + "happyHour": { + "name": "Happy Hour", + "effect": "Usar Happy Hour dobra a quantidade de prêmio em dinheiro recebido após a batalha." + }, + "electricTerrain": { + "name": "Electric Terrain", + "effect": "O usuário eletrifica o campo de batalha por cinco turnos, fortalecendo movimentos do tipo Elétrico. Pokémon no solo não podem mais cair no sono." + }, + "dazzlingGleam": { + "name": "Dazzling Gleam", + "effect": "O usuário causa dano ao Pokémon oponente emitindo um clarão poderoso." + }, + "celebrate": { + "name": "Celebrate", + "effect": "O Pokémon te dá parabéns pelo seu dia especial!" + }, + "holdHands": { + "name": "Hold Hands", + "effect": "O usuário e um aliado dão as mãos. Isso os deixam muito contentes." + }, + "babyDollEyes": { + "name": "Baby-Doll Eyes", + "effect": "O usuário encara o alvo com seus olhos adoráveis, o que diminui seu atributo de Ataque. Esse movimento tem prioridade." + }, + "nuzzle": { + "name": "Nuzzle", + "effect": "O usuário ataca esfregando suas bochechas eletrizadas contra o alvo. Isso também deixa o alvo paralisado." + }, + "holdBack": { + "name": "Hold Back", + "effect": "O usuário pega leve quando ataca e o alvo é deixado com pelo menos 1 PS." + }, + "infestation": { + "name": "Infestation", + "effect": "O alvo é infestado e atacado de quatro a cinco turnos. O alvo não pode fugir durante esse período." + }, + "powerUpPunch": { + "name": "Power-Up Punch", + "effect": "Golpear oponentes repetidamente faz os punhos do usuário enrijecerem. Acertar um alvo aumenta o Ataque." + }, + "oblivionWing": { + "name": "Oblivion Wing", + "effect": "O usuário absorve os PS de seu alvo. Os PS do usuário são restaurados além da metade do dano recebido pelo usuário." + }, + "thousandArrows": { + "name": "Thousand Arrows", + "effect": "Este movimento também acerta Pokémon adversários que estão no ar. Esses Pokémon são derrubados e caem no chão." + }, + "thousandWaves": { + "name": "Thousand Waves", + "effect": "O usuário ataca com tremores que se dispersam pelo chão. Alvos atingidos não podem fugir da batalha." + }, + "landsWrath": { + "name": "Land's Wrath", + "effect": "O usuário reúne a energia da terra e foca esse poder nos Pokémon oponentes para causar dano." + }, + "lightOfRuin": { + "name": "Light of Ruin", + "effect": "Usufruindo do poder da flor eterna, o usuário atira um poderoso raio de luz. Isso também fere muito o usuário." + }, + "originPulse": { + "name": "Origin Pulse", + "effect": "O usuário ataca o Pokémon adversário com inúmeros raios de luz resplandescente que brilham em uma cor de profundo azul." + }, + "precipiceBlades": { + "name": "Precipice Blades", + "effect": "O usuário ataca o Pokémon adversário manifestando o poder terrestre em espadas de pedra assustadoras." + }, + "dragonAscent": { + "name": "Dragon Ascent", + "effect": "Depois de alcançar grandes alturas, o usuário ataca o alvo mergulhando do céu em alta velocidade, porém isso diminui sua própria Defesa e Defesa Especial." + }, + "hyperspaceFury": { + "name": "Hyperspace Fury", + "effect": "Usando seus diversos braços, o usuário libera golpes furiosos que ignoram efeitos de movimentos como Proteção e Detectar. Diminui a Defesa do usuário." + }, + "breakneckBlitzPhysical": { + "name": "Breakneck Blitz", + "effect": "Utilizando o Poder Z, o usuário intensifica seu ímpeto e atinge o alvo em alta velocidade. Seu poder varia dependendo do movimento original." + }, + "breakneckBlitzSpecial": { + "name": "Breakneck Blitz", + "effect": "Dummy Data" + }, + "allOutPummelingPhysical": { + "name": "All-Out Pummeling", + "effect": "Utilizando o Poder Z, o usuário cria e arremessa uma esfera de energia no alvo com força total. Seu poder varia dependendo do movimento original." + }, + "allOutPummelingSpecial": { + "name": "All-Out Pummeling", + "effect": "Dummy Data" + }, + "supersonicSkystrikePhysical": { + "name": "Supersonic Skystrike", + "effect": "Utilizando o Poder Z, o usuário ascende e mergulha em direção ao alvo em alta velocidade. Seu poder varia dependendo do movimento original." + }, + "supersonicSkystrikeSpecial": { + "name": "Supersonic Skystrike", + "effect": "Dummy Data" + }, + "acidDownpourPhysical": { + "name": "Acid Downpour", + "effect": "Utilizando o Poder Z, o usuário cria um pântano venenoso e afoga o alvo com toda sua força. Seu poder varia dependendo do movimento original." + }, + "acidDownpourSpecial": { + "name": "Acid Downpour", + "effect": "Dummy Data" + }, + "tectonicRagePhysical": { + "name": "Tectonic Rage", + "effect": "Utilizando o Poder Z, o usuário abre uma cratera e mergulha nela com o alvo com força total. Seu poder varia dependendo do movimento original." + }, + "tectonicRageSpecial": { + "name": "Tectonic Rage", + "effect": "Dummy Data" + }, + "continentalCrushPhysical": { + "name": "Continental Crush", + "effect": "Utilizando o Poder Z, o usuário cria um meteoro que cai do céu em direção ao alvo com força total. Seu poder varia dependendo do movimento original." + }, + "continentalCrushSpecial": { + "name": "Continental Crush", + "effect": "Dummy Data" + }, + "savageSpinOutPhysical": { + "name": "Savage Spin-Out", + "effect": "Utilizando o Poder Z, o usuário restringe o alvo em um casulo de seda e ataca ele com força total. Seu poder varia dependendo do movimento original." + }, + "savageSpinOutSpecial": { + "name": "Savage Spin-Out", + "effect": "Dummy Data" + }, + "neverEndingNightmarePhysical": { + "name": "Never-Ending Nightmare", + "effect": "Utilizando o Poder Z, o usuário invoca espectros rancorosos que sufocam o alvo. Seu poder varia dependendo do movimento original." + }, + "neverEndingNightmareSpecial": { + "name": "Never-Ending Nightmare", + "effect": "Dummy Data" + }, + "corkscrewCrashPhysical": { + "name": "Corkscrew Crash", + "effect": "Utilizando o Poder Z, o usuário gira rapidamente e ataca o alvo com força total. Seu poder varia dependendo do movimento original." + }, + "corkscrewCrashSpecial": { + "name": "Corkscrew Crash", + "effect": "Dummy Data" + }, + "infernoOverdrivePhysical": { + "name": "Inferno Overdrive", + "effect": "Utilizando o Poder Z, o usuário cospe uma enorme labareda ardente contra o alvo com força total. Seu poder varia dependendo do movimento original." + }, + "infernoOverdriveSpecial": { + "name": "Inferno Overdrive", + "effect": "Dummy Data" + }, + "hydroVortexPhysical": { + "name": "Hydro Vortex", + "effect": "Utilizando o Poder Z, o usuário cria um intenso turbilhão que engole o alvo com força total. Seu poder varia dependendo do movimento original." + }, + "hydroVortexSpecial": { + "name": "Hydro Vortex", + "effect": "Dummy Data" + }, + "bloomDoomPhysical": { + "name": "Bloom Doom", + "effect": "Utilizando o Poder Z, o usuário absorve a energia vital do ambiente e ataca o alvo com força total. Seu poder varia dependendo do movimento original." + }, + "bloomDoomSpecial": { + "name": "Bloom Doom", + "effect": "Dummy Data" + }, + "gigavoltHavocPhysical": { + "name": "Gigavolt Havoc", + "effect": "Utilizando o Poder Z, o usuário concentra uma corrente elétrica carregada e atinge o alvo. Seu poder varia dependendo do movimento original." + }, + "gigavoltHavocSpecial": { + "name": "Gigavolt Havoc", + "effect": "Dummy Data" + }, + "shatteredPsychePhysical": { + "name": "Shattered Psyche", + "effect": "Utilizando o Poder Z, o usuário manipula a cabeça do alvo e destrói-o mentalmente. Seu poder varia dependendo do movimento original." + }, + "shatteredPsycheSpecial": { + "name": "Shattered Psyche", + "effect": "Dummy Data" + }, + "subzeroSlammerPhysical": { + "name": "Subzero Slammer", + "effect": "Utilizando o Poder Z, o usuário lança um raio de gelo que reduz a temperatura do alvo a zero. Seu poder varia dependendo do movimento original." + }, + "subzeroSlammerSpecial": { + "name": "Subzero Slammer", + "effect": "Dummy Data" + }, + "devastatingDrakePhysical": { + "name": "Devastating Drake", + "effect": "Utilizando o Poder Z, o usuário materializa sua aura, que ataca o alvo com força total. Seu poder varia dependendo do movimento original." + }, + "devastatingDrakeSpecial": { + "name": "Devastating Drake", + "effect": "Dummy Data" + }, + "blackHoleEclipsePhysical": { + "name": "Black Hole Eclipse", + "effect": "Utilizando o Poder Z, o usuário cria um buraco negro que engole o alvo. Seu poder varia dependendo do movimento original." + }, + "blackHoleEclipseSpecial": { + "name": "Black Hole Eclipse", + "effect": "Dummy Data" + }, + "twinkleTacklePhysical": { + "name": "Twinkle Tackle", + "effect": "Utilizando o Poder Z, o usuário cria uma dimensão graciosa que deixa o alvo a sua mercê. Seu poder varia dependendo do movimento original." + }, + "twinkleTackleSpecial": { + "name": "Twinkle Tackle", + "effect": "Dummy Data" + }, + "catastropika": { + "name": "Catastropika", + "effect": "Utilizando seu Poder Z, Pikachu acumula o máximo de eletricidade que seu corpo suporta e pula no alvo com força total." + }, + "shoreUp": { + "name": "Shore Up", + "effect": "Recupera metade dos PS do usuário. Durante uma Tempestade de Areia, recupera um pouco mais." + }, + "firstImpression": { + "name": "First Impression", + "effect": "Embora esse movimento seja poderoso, ele funciona apenas na primeira rodada em que o usuário está em batalha." + }, + "banefulBunker": { + "name": "Baneful Bunker", + "effect": "Além de proteger o usuário de ataques, este movimento também envenena qualquer um que fizer contato direto." + }, + "spiritShackle": { + "name": "Spirit Shackle", + "effect": "O usuário ataca enquanto fisga simultaneamente a sombra do alvo e impede ele de escapar." + }, + "darkestLariat": { + "name": "Darkest Lariat", + "effect": "O usuário balança os dois braços e acerta o alvo. As mudanças de atributos do alvo não afetam o dano deste ataque." + }, + "sparklingAria": { + "name": "Sparkling Aria", + "effect": "Libera borbulhas ao cantar. Se um Pokémon estiver queimado, ele será curado pelo toque das bolhas." + }, + "iceHammer": { + "name": "Ice Hammer", + "effect": "O usuário gira seu corpo e bate com seus fortes e pesados punhos. Isso diminui a Velocidade do usuário." + }, + "floralHealing": { + "name": "Floral Healing", + "effect": "O usuário restaura os PS do alvo até metade a dos seus PS máximo. Ele restaura mais HP quando o terreno é de grama." + }, + "highHorsepower": { + "name": "High Horsepower", + "effect": "O usuário ataca ferozmente o alvo usando todo o seu corpo." + }, + "strengthSap": { + "name": "Strength Sap", + "effect": "O usuário restaura seus PS em uma quantidade igual ao atributo de Ataque do alvo. Também diminui o atributo de Ataque do alvo." + }, + "solarBlade": { + "name": "Solar Blade", + "effect": "O usuário absorve luz e concentra-a em forma de lâmina com a energia absorvida no primeiro turno e atacando o alvo no próximo turno." + }, + "leafage": { + "name": "Leafage", + "effect": "O usuário ataca lançando folhas no alvo." + }, + "spotlight": { + "name": "Spotlight", + "effect": "O usuário direciona o foco no alvo para que apenas ele seja atacado durante o turno." + }, + "toxicThread": { + "name": "Toxic Thread", + "effect": "O usuário dispara fios venenosos para envenenar o alvo e diminuir sua Velocidade." + }, + "laserFocus": { + "name": "Laser Focus", + "effect": "O usuário se concentra intensamente. O ataque no próximo turno sempre resultará em um acerto crítico." + }, + "gearUp": { + "name": "Gear Up", + "effect": "O usuário engata suas engrenagens para aumentar os atributos de Ataque e Ataque Esp. de Pokémon aliados com as Habilidades Mais ou Menos." + }, + "throatChop": { + "name": "Throat Chop", + "effect": "O usuário acerta a garganta do alvo, e a dor resultante impede que o alvo use movimentos que emitam som por dois turnos." + }, + "pollenPuff": { + "name": "Pollen Puff", + "effect": "O usuário ataca o inimigo com uma bola de pólen explosiva. Se o alvo for um aliado, ele recebe uma bola de pólen que restaura seus PS em vez disso." + }, + "anchorShot": { + "name": "Anchor Shot", + "effect": "O usuário revolve o alvo com a corrente de sua âncora enquanto ataca. O alvo se torna incapaz de fugir." + }, + "psychicTerrain": { + "name": "Psychic Terrain", + "effect": "Protege o Pokémon no terreno de movimentos de prioridade e aumenta o poder dos movimentos do tipo Psíquico por cinco turnos." + }, + "lunge": { + "name": "Lunge", + "effect": "O usuário faz uma estocada no alvo, atacando com força total. Isso também diminui o Ataque do alvo." + }, + "fireLash": { + "name": "Fire Lash", + "effect": "O usuário atinge o alvo com um chicote em chamas. Também diminui a Defesa do alvo." + }, + "powerTrip": { + "name": "Power Trip", + "effect": "O usuário ostenta sua força e ataca o alvo. Quanto mais os atributos do usuário forem aumentados, maior será o poder do movimento." + }, + "burnUp": { + "name": "Burn Up", + "effect": "Para infligir um dano massivo, o usuário se exaure. Após usar esse movimento, o usuário não será mais do tipo Fogo." + }, + "speedSwap": { + "name": "Speed Swap", + "effect": "O usuário troca os atributos de Velocidade com o alvo." + }, + "smartStrike": { + "name": "Smart Strike", + "effect": "O usuário perfura o alvo com um chifre afiado. Esse ataque nunca erra." + }, + "purify": { + "name": "Purify", + "effect": "O usuário cura a condição de estado do alvo. Se o movimento for bem-sucedido, também recupera os PS do usuário." + }, + "revelationDance": { + "name": "Revelation Dance", + "effect": "O usuário ataca o alvo dançando intensamente. O tipo do usuário determina o tipo deste movimento." + }, + "coreEnforcer": { + "name": "Core Enforcer", + "effect": "Se os Pokémon nos quais o usuário causou dano já tiverem usado seus movimentos, esse movimento elimina o efeito da Habilidade do alvo." + }, + "tropKick": { + "name": "Trop Kick", + "effect": "O usuário desfere um chute intenso de origens tropicais no alvo. Também diminui o Ataque do alvo." + }, + "instruct": { + "name": "Instruct", + "effect": "O usuário instrui o alvo a usar novamente o seu último movimento usado." + }, + "beakBlast": { + "name": "Beak Blast", + "effect": "O usuário aquece o bico e depois ataca o alvo. Fazer contato direto com o Pokémon enquanto ele aquece o bico resultará em queimadura." + }, + "clangingScales": { + "name": "Clanging Scales", + "effect": "O usuário esfrega as escamas de todo o seu corpo e faz um estrondo para machucar o Pokémon oponente. A Defesa do usuário diminui após o ataque." + }, + "dragonHammer": { + "name": "Dragon Hammer", + "effect": "O usuário usa seu corpo como um martelo para atacar o alvo e causar dano." + }, + "brutalSwing": { + "name": "Brutal Swing", + "effect": "O usuário balança o corpo violentamente para infligir dano a tudo em seu redor." + }, + "auroraVeil": { + "name": "Aurora Veil", + "effect": "Esse movimento reduz o dano de movimentos físicos e especiais por cinco turnos. Só pode ser usado durante uma tempestade de granizo." + }, + "sinisterArrowRaid": { + "name": "Sinister Arrow Raid", + "effect": "Utilizando o Poder Z, Decidueye cria incontáveis flechas e dispara-as contra o alvo com força total." + }, + "maliciousMoonsault": { + "name": "Malicious Moonsault", + "effect": "Utilizando o Poder Z, Incineroar fortalece seu corpo e pula no alvo com força total." + }, + "oceanicOperetta": { + "name": "Oceanic Operetta", + "effect": "Utilizando o Poder Z, Primarina convoca uma quantidade massiva de água e lança contra o alvo com força total." + }, + "guardianOfAlola": { + "name": "Guardian of Alola", + "effect": "Utilizando o Poder Z, o Espírito Nativo canaliza a energia de Alola e ataca o alvo com força total. Reduz muito os PS do alvo." + }, + "soulStealing7StarStrike": { + "name": "Soul-Stealing 7-Star Strike", + "effect": "Quando um Marshadow obtém o Poder Z, ele ataca o alvo consecutivamente com socos e chutes usando força total." + }, + "stokedSparksurfer": { + "name": "Stoked Sparksurfer", + "effect": "Quando um Raichu de Alola obtém o Poder Z, ele lança um ataque contra o alvo com força total. Este movimento deixa o alvo paralisado." + }, + "pulverizingPancake": { + "name": "Pulverizing Pancake", + "effect": "O Poder Z desperta as capacidades máximas de seu Snorlax. O Pokémon movimenta seu enorme corpo velozmente e ataca o alvo com força total." + }, + "extremeEvoboost": { + "name": "Extreme Evoboost", + "effect": "Quando um Eevee obtém o Poder Z, ele absorve energia dos seus amigos evoluídos e aumenta os seus atributos bruscamente." + }, + "genesisSupernova": { + "name": "Genesis Supernova", + "effect": "Quando um Mew obtém o Poder Z, ele ataca o alvo com força total. O terreno será carregado com energia psíquica." + }, + "shellTrap": { + "name": "Shell Trap", + "effect": "O usuário arma uma cilada explosiva. Se o usuário for atingido fisicamente, a cilada irá explodir e causar de dano ao Pokémon oponente." + }, + "fleurCannon": { + "name": "Fleur Cannon", + "effect": "O usuário dispara um raio poderoso. O efeito colateral do ataque prejudica duramente o Ataque Especial do usuário." + }, + "psychicFangs": { + "name": "Psychic Fangs", + "effect": "O usuário morde o alvo com suas capacidades psíquicas. Pode destruir Tela de Luz e Refletir." + }, + "stompingTantrum": { + "name": "Stomping Tantrum", + "effect": "Guiado pela frustração, o usuário ataca o alvo. Se o movimento anterior falhou, o poder do movimento é dobrado." + }, + "shadowBone": { + "name": "Shadow Bone", + "effect": "O usuário ataca o alvo com um osso que contém um espírito. Pode diminuir a Defesa do alvo." + }, + "accelerock": { + "name": "Accelerock", + "effect": "O usuário colide contra o alvo em alta velocidade. Esse movimento sempre ataca primeiro." + }, + "liquidation": { + "name": "Liquidation", + "effect": "O usuário dispara no alvo um jato d'água poderoso. Diminui a Defesa do alvo." + }, + "prismaticLaser": { + "name": "Prismatic Laser", + "effect": "O usuário dispara lasers poderosos usando o poder de um prisma. O usuário não pode se mover no próximo turno." + }, + "spectralThief": { + "name": "Spectral Thief", + "effect": "O usuário se esconde na sombra do alvo, rouba seus aumentos de atributos e então, ataca-o." + }, + "sunsteelStrike": { + "name": "Sunsteel Strike", + "effect": "O usuário atinge o alvo com a força de um meteoro. Esse movimento pode ser usado no alvo independentemente de sua Habilidade." + }, + "moongeistBeam": { + "name": "Moongeist Beam", + "effect": "O usuário emite um raio pavoroso para atacar o alvo. Esse movimento pode ser usado no alvo independentemente de sua Habilidade." + }, + "tearfulLook": { + "name": "Tearful Look", + "effect": "O usuário fica manhoso e o alvo perde a vontade de lutar. Diminui o Ataque e o Ataque Esp. do alvo." + }, + "zingZap": { + "name": "Zing Zap", + "effect": "Uma forte explosão elétrica que cai sobre o alvo, eletrocutando-o e podendo fazê-lo hesitar." + }, + "naturesMadness": { + "name": "Nature's Madness", + "effect": "O usuário atinge o alvo com a força da natureza. Reduz os PS do alvo pela metade." + }, + "multiAttack": { + "name": "Multi-Attack", + "effect": "Se envolvendo em energia concentrada, o usuário acerta o alvo. A memória segurada determina o tipo do movimento." + }, + "tenMillionVoltThunderbolt": { + "name": "10,000,000 Volt Thunderbolt", + "effect": "Usando seu Poder Z, o Pikachu de boné acumula eletricidade e despeja-a. Golpes críticos acertam mais facilmente." + }, + "mindBlown": { + "name": "Mind Blown", + "effect": "O usuário ataca tudo ao seu redor fazendo sua própria cabeça explodir. Isso também causa dano ao usuário." + }, + "plasmaFists": { + "name": "Plasma Fists", + "effect": "O usuário ataca com punhos carregados eletricamente. Este movimento transforma movimentos do tipo Normal em movimentos do tipo Elétrico." + }, + "photonGeyser": { + "name": "Photon Geyser", + "effect": "O usuário ataca o alvo com um pilar de luz. Este movimento causa dano de Ataque ou Ataque Especial—o que for maior para o usuário." + }, + "lightThatBurnsTheSky": { + "name": "Light That Burns the Sky", + "effect": "Este ataque causa dano de Ataque ou Ataque Especial—o que for maior para o usuário, Necrozma. Este movimento ignora a Habilidade do alvo." + }, + "searingSunrazeSmash": { + "name": "Searing Sunraze Smash", + "effect": "Após obter o Z-Power, o usuário, Solgaleo, ataca o alvo com força total. Este movimento pode ignorar o efeito da Habilidade do alvo." + }, + "menacingMoonrazeMaelstrom": { + "name": "Menacing Moonraze Maelstrom", + "effect": "Após obter o Z-Power, o usuário, Lunala, ataca o alvo com força total. Este movimento pode ignorar o efeito da Habilidade do alvo." + }, + "letsSnuggleForever": { + "name": "Let's Snuggle Forever", + "effect": "Após obter o Z-Power, o usuário, Mimikyu, soca o alvo com força total." + }, + "splinteredStormshards": { + "name": "Splintered Stormshards", + "effect": "Após obter o Z-Power, o usuário, Lycanroc, ataca o alvo com força total. Este movimento nega o efeito no campo de batalha." + }, + "clangorousSoulblaze": { + "name": "Clangorous Soulblaze", + "effect": "Após obter o Z-Power, o usuário, Kommo-o, ataca os Pokémon adversários com força total. Este movimento aumenta os atributos do usuário." + }, + "zippyZap": { + "name": "Zippy Zap", + "effect": "O usuário ataca o alvo com rajadas de eletricidade em alta velocidade. Esse movimento sempre vai primeiro e resulta em um golpe crítico." + }, + "splishySplash": { + "name": "Splishy Splash", + "effect": "O usuário carrega uma onda enorme com eletricidade e atinge os Pokémon adversários com a onda. Isso também pode deixar os Pokémon adversários paralisados." + }, + "floatyFall": { + "name": "Floaty Fall", + "effect": "O usuário flutua no ar e então mergulha em um ângulo íngreme para atacar o alvo. Isso também pode fazer o alvo hesitar." + }, + "pikaPapow": { + "name": "Pika Papow", + "effect": "Quanto mais o Pikachu ama seu Treinador, maior o poder do movimento. Nunca erra." + }, + "bouncyBubble": { + "name": "Bouncy Bubble", + "effect": "O usuário ataca atirando bolhas de água no alvo. Em seguida, absorve água e restaura seu HP pelo mesmo valor de dano causado ao alvo." + }, + "buzzyBuzz": { + "name": "Buzzy Buzz", + "effect": "O usuário dispara um choque de eletricidade para atacar o alvo. Isso também deixa o alvo paralisado." + }, + "sizzlySlide": { + "name": "Sizzly Slide", + "effect": "O usuário se envolve em fogo e carrega contra o alvo. Isso também deixa o alvo queimado." + }, + "glitzyGlow": { + "name": "Glitzy Glow", + "effect": "O usuário bombardeia o alvo com força telecinética. Uma parede maravilhosa de luz é erguida para enfraquecer o poder dos movimentos especiais dos Pokémon adversários." + }, + "baddyBad": { + "name": "Baddy Bad", + "effect": "O usuário age mal e ataca o alvo. Uma parede maravilhosa de luz é erguida para enfraquecer o poder dos movimentos físicos dos Pokémon adversários." + }, + "sappySeed": { + "name": "Sappy Seed", + "effect": "O usuário cresce um caule gigantesco que espalha sementes para atacar o alvo. As sementes drenam o HP do alvo a cada turno." + }, + "freezyFrost": { + "name": "Freezy Frost", + "effect": "O usuário ataca com um cristal feito de névoa congelada fria. Isso elimina todas as mudanças de atributo entre todos os Pokémon envolvidos na batalha." + }, + "sparklySwirl": { + "name": "Sparkly Swirl", + "effect": "O usuário ataca o alvo envolvendo-o com um redemoinho de um aroma esmagador. Isso também cura todas as condições de status do grupo do usuário." + }, + "veeveeVolley": { + "name": "Veevee Volley", + "effect": "Quanto mais o Eevee ama seu Treinador, maior o poder do movimento. Nunca erra." + }, + "doubleIronBash": { + "name": "Double Iron Bash", + "effect": "O usuário gira, centrando a porca hexagonal em seu peito e depois ataca com seus braços duas vezes seguidas. Isso também pode fazer o alvo hesitar." + }, + "maxGuard": { + "name": "Max Guard", + "effect": "Este movimento permite ao usuário proteger-se de todos os ataques. Sua chance de falhar aumenta se for usado em sucessão." + }, + "dynamaxCannon": { + "name": "Dynamax Cannon", + "effect": "O usuário libera um forte feixe de seu núcleo. Este movimento causa até o dobro do dano se o alvo estiver com seu nível acima do limite." + }, + "snipeShot": { + "name": "Snipe Shot", + "effect": "O usuário ignora os efeitos dos movimentos e Habilidades dos Pokémon adversários que atraem movimentos, permitindo que este movimento atinja o alvo escolhido." + }, + "jawLock": { + "name": "Jaw Lock", + "effect": "Este movimento impede o usuário e o alvo de trocarem de lugar até que um deles desmaie. O efeito desaparece se qualquer um dos Pokémon deixar o campo." + }, + "stuffCheeks": { + "name": "Stuff Cheeks", + "effect": "O usuário come sua Fruta segurada, depois aumenta muito seu atributo de Defesa." + }, + "noRetreat": { + "name": "No Retreat", + "effect": "Este movimento aumenta todos os atributos do usuário, mas impede o usuário de trocar de lugar ou fugir." + }, + "tarShot": { + "name": "Tar Shot", + "effect": "O usuário derrama alcatrão pegajoso sobre o alvo, diminuindo o atributo de Velocidade do alvo. O alvo se torna mais fraco contra movimentos do tipo Fogo." + }, + "magicPowder": { + "name": "Magic Powder", + "effect": "O usuário espalha uma nuvem de pó mágico que muda o alvo para o tipo Psíquico." + }, + "dragonDarts": { + "name": "Dragon Darts", + "effect": "O usuário ataca duas vezes usando Dreepy. Se houver dois alvos, este movimento atinge cada alvo uma vez." + }, + "teatime": { + "name": "Teatime", + "effect": "O usuário faz hora do chá com todos os Pokémon na batalha. Cada Pokémon come sua Fruta segurada." + }, + "octolock": { + "name": "Octolock", + "effect": "O usuário prende o alvo e impede que ele fuja. Este movimento também diminui os atributos de Defesa e Def. Esp. do alvo a cada turno." + }, + "boltBeak": { + "name": "Bolt Beak", + "effect": "O usuário fere o alvo com seu bico eletrificado. Se o usuário atacar antes do alvo, o poder deste movimento é dobrado." + }, + "fishiousRend": { + "name": "Fishious Rend", + "effect": "O usuário fere o alvo com suas brânquias duras. Se o usuário atacar antes do alvo, o poder deste movimento é dobrado." + }, + "courtChange": { + "name": "Court Change", + "effect": "Com seu poder misterioso, o usuário troca os efeitos de cada lado do campo." + }, + "maxFlare": { + "name": "Max Flare", + "effect": "Este é um ataque do tipo Fogo que Pokémon Dynamax usam. O usuário intensifica o sol por cinco turnos." + }, + "maxFlutterby": { + "name": "Max Flutterby", + "effect": "Este é um ataque do tipo Inseto que Pokémon Dynamax usam. Isso diminui o atributo de Atq. Esp. do alvo." + }, + "maxLightning": { + "name": "Max Lightning", + "effect": "Este é um ataque do tipo Elétrico que Pokémon Dynamax usam. O usuário transforma o chão em Terreno Elétrico por cinco turnos." + }, + "maxStrike": { + "name": "Max Strike", + "effect": "Este é um ataque do tipo Normal que Pokémon Dynamax usam. Isso diminui o atributo de Velocidade do alvo." + }, + "maxKnuckle": { + "name": "Max Knuckle", + "effect": "Este é um ataque do tipo Lutador que Pokémon Dynamax usam. Isso aumenta os atributos de Ataque dos Pokémon aliados." + }, + "maxPhantasm": { + "name": "Max Phantasm", + "effect": "Este é um ataque do tipo Fantasma que Pokémon Dynamax usam. Isso diminui o atributo de Defesa do alvo." + }, + "maxHailstorm": { + "name": "Max Hailstorm", + "effect": "Este é um ataque do tipo Gelo que Pokémon Dynamax usam. O usuário convoca uma tempestade de granizo que dura cinco turnos." + }, + "maxOoze": { + "name": "Max Ooze", + "effect": "Este é um ataque do tipo Veneno que Pokémon Dynamax usam. Isso aumenta os atributos de Atq. Esp. dos Pokémon aliados." + }, + "maxGeyser": { + "name": "Max Geyser", + "effect": "Este é um ataque do tipo Água que Pokémon Dynamax usam. O usuário convoca uma chuva pesada que cai por cinco turnos." + }, + "maxAirstream": { + "name": "Max Airstream", + "effect": "Este é um ataque do tipo Voador que Pokémon Dynamax usam. Isso aumenta os atributos de Velocidade dos Pokémon aliados." + }, + "maxStarfall": { + "name": "Max Starfall", + "effect": "Este é um ataque do tipo Fada que Pokémon Dynamax usam. O usuário transforma o chão em Terreno de Nevoeiro por cinco turnos." + }, + "maxWyrmwind": { + "name": "Max Wyrmwind", + "effect": "Este é um ataque do tipo Dragão que Pokémon Dynamax usam. Isso diminui o atributo de Ataque do alvo." + }, + "maxMindstorm": { + "name": "Max Mindstorm", + "effect": "Este é um ataque do tipo Psíquico que Pokémon Dynamax usam. O usuário transforma o chão em Terreno Psíquico por cinco turnos." + }, + "maxRockfall": { + "name": "Max Rockfall", + "effect": "Este é um ataque do tipo Pedra que Pokémon Dynamax usam. O usuário convoca uma tempestade de areia que dura cinco turnos." + }, + "maxQuake": { + "name": "Max Quake", + "effect": "Este é um ataque do tipo Terra que Pokémon Dynamax usam. Isso aumenta os atributos de Def. Esp. dos Pokémon aliados." + }, + "maxDarkness": { + "name": "Max Darkness", + "effect": "Este é um ataque do tipo Sombrio que Pokémon Dynamax usam. Isso diminui o atributo de Def. Esp. do alvo." + }, + "maxOvergrowth": { + "name": "Max Overgrowth", + "effect": "Este é um ataque do tipo Grama que Pokémon Dynamax usam. O usuário transforma o chão em Terreno de Grama por cinco turnos." + }, + "maxSteelspike": { + "name": "Max Steelspike", + "effect": "Este é um ataque do tipo Aço que Pokémon Dynamax usam. Isso aumenta os atributos de Defesa dos Pokémon aliados." + }, + "clangorousSoul": { + "name": "Clangorous Soul", + "effect": "O usuário aumenta todos os seus atributos usando um pouco de seu HP." + }, + "bodyPress": { + "name": "Body Press", + "effect": "O usuário ataca pressionando seu corpo contra o alvo. Quanto maior a Defesa do usuário, mais dano pode infligir ao alvo." + }, + "decorate": { + "name": "Decorate", + "effect": "O usuário aumenta muito os atributos de Ataque e Atq. Esp. do alvo decorando o alvo." + }, + "drumBeating": { + "name": "Drum Beating", + "effect": "O usuário toca seu tambor, controlando as raízes do tambor para atacar o alvo. Isso também diminui o atributo de Velocidade do alvo." + }, + "snapTrap": { + "name": "Snap Trap", + "effect": "O usuário prende o alvo em uma armadilha rápida por quatro ou cinco turnos." + }, + "pyroBall": { + "name": "Pyro Ball", + "effect": "O usuário ataca acendendo uma pequena pedra e lançando-a como uma bola de fogo no alvo. Isso também pode deixar o alvo queimado." + }, + "behemothBlade": { + "name": "Behemoth Blade", + "effect": "O usuário empunha uma espada grande e poderosa usando todo o seu corpo e corta o alvo em um ataque vigoroso." + }, + "behemothBash": { + "name": "Behemoth Bash", + "effect": "O corpo do usuário se torna um escudo firme e atinge o alvo com força." + }, + "auraWheel": { + "name": "Aura Wheel", + "effect": "Morpeko ataca e aumenta sua Velocidade com a energia armazenada em suas bochechas. O tipo deste movimento muda dependendo da forma do usuário." + }, + "breakingSwipe": { + "name": "Breaking Swipe", + "effect": "O usuário balança sua cauda dura violentamente e ataca os Pokémon adversários. Isso também diminui os atributos de Ataque deles." + }, + "branchPoke": { + "name": "Branch Poke", + "effect": "O usuário ataca o alvo cutucando-o com um galho pontiagudo." + }, + "overdrive": { + "name": "Overdrive", + "effect": "O usuário ataca os Pokémon adversários vibrando uma guitarra ou baixo, causando um eco enorme e uma vibração forte." + }, + "appleAcid": { + "name": "Apple Acid", + "effect": "O usuário ataca o alvo com um líquido ácido criado a partir de maçãs azedas. Isso também diminui o atributo de Def. Esp. do alvo." + }, + "gravApple": { + "name": "Grav Apple", + "effect": "O usuário inflige dano derrubando uma maçã de cima. Isso também diminui o atributo de Defesa do alvo." + }, + "spiritBreak": { + "name": "Spirit Break", + "effect": "O usuário ataca o alvo com tanta força que poderia quebrar o espírito do alvo. Isso também diminui o atributo de Atq. Esp. do alvo." + }, + "strangeSteam": { + "name": "Strange Steam", + "effect": "O usuário ataca o alvo emitindo vapor. Isso também pode deixar o alvo confuso." + }, + "lifeDew": { + "name": "Life Dew", + "effect": "O usuário espalha água misteriosa ao redor e restaura o HP de si mesmo e de seus Pokémon aliados na batalha." + }, + "obstruct": { + "name": "Obstruct", + "effect": "Este movimento permite ao usuário proteger-se de todos os ataques. Sua chance de falhar aumenta se for usado em sucessão. Contato direto reduz severamente o atributo de Defesa do atacante." + }, + "falseSurrender": { + "name": "False Surrender", + "effect": "O usuário finge abaixar a cabeça, mas então esfaqueia o alvo com seus cabelos desgrenhados. Este ataque nunca erra." + }, + "meteorAssault": { + "name": "Meteor Assault", + "effect": "O usuário ataca selvagemente com seu alho-poró grosso. O usuário não pode se mover na próxima rodada, porque a força deste movimento o faz cambalear." + }, + "eternabeam": { + "name": "Eternabeam", + "effect": "Este é o ataque mais poderoso de Eternatus em sua forma original. O usuário não pode se mover na próxima rodada." + }, + "steelBeam": { + "name": "Steel Beam", + "effect": "O usuário dispara um feixe de aço que coletou de todo o seu corpo. Isso também causa dano ao usuário." + }, + "expandingForce": { + "name": "Expanding Force", + "effect": "O usuário ataca o alvo com seu poder psíquico. O poder deste movimento aumenta e danifica todos os Pokémon adversários no Terreno Psíquico." + }, + "steelRoller": { + "name": "Steel Roller", + "effect": "O usuário ataca enquanto destrói o terreno. Este movimento falha quando o chão não foi transformado em um terreno." + }, + "scaleShot": { + "name": "Scale Shot", + "effect": "O usuário ataca atirando escamas de duas a cinco vezes seguidas. Este movimento aumenta o atributo de Velocidade do usuário, mas diminui seu atributo de Defesa." + }, + "meteorBeam": { + "name": "Meteor Beam", + "effect": "Neste ataque de dois turnos, o usuário reúne energia espacial e aumenta seu atributo de Atq. Esp., depois ataca o alvo no próximo turno." + }, + "shellSideArm": { + "name": "Shell Side Arm", + "effect": "Este movimento causa dano físico ou especial, o que for mais eficaz. Isso também pode envenenar o alvo." + }, + "mistyExplosion": { + "name": "Misty Explosion", + "effect": "O usuário ataca tudo ao seu redor e desmaia ao usar este movimento. O poder deste movimento é aumentado no Terreno de Nevoeiro." + }, + "grassyGlide": { + "name": "Grassy Glide", + "effect": "Deslizando no chão, o usuário ataca o alvo. Este movimento sempre ataca primeiro no Terreno de Grama." + }, + "risingVoltage": { + "name": "Rising Voltage", + "effect": "O usuário ataca com a voltagem elétrica que sobe do chão. O poder deste movimento dobra quando o alvo está no Terreno Elétrico." + }, + "terrainPulse": { + "name": "Terrain Pulse", + "effect": "O usuário utiliza o poder do terreno para atacar. O tipo e o poder deste movimento mudam dependendo do terreno em que é usado." + }, + "skitterSmack": { + "name": "Skitter Smack", + "effect": "O usuário corre por trás do alvo para atacar. Isso também diminui o atributo de Atq. Esp. do alvo." + }, + "burningJealousy": { + "name": "Burning Jealousy", + "effect": "O usuário ataca com energia da inveja. Isso deixa todos os Pokémon adversários que tiveram seus atributos aumentados durante o turno com uma queimadura." + }, + "lashOut": { + "name": "Lash Out", + "effect": "O usuário ataca para desabafar sua frustração contra o alvo. Se os atributos do usuário foram diminuídos durante este turno, o poder deste movimento é dobrado." + }, + "poltergeist": { + "name": "Poltergeist", + "effect": "O usuário ataca o alvo controlando o item do alvo. O movimento falha se o alvo não tiver um item." + }, + "corrosiveGas": { + "name": "Corrosive Gas", + "effect": "O usuário envolve tudo ao seu redor com gás altamente ácido e derrete os itens que eles seguram." + }, + "coaching": { + "name": "Coaching", + "effect": "O usuário treina adequadamente seus Pokémon aliados, aumentando seus atributos de Ataque e Defesa." + }, + "flipTurn": { + "name": "Flip Turn", + "effect": "Após fazer seu ataque, o usuário corre para trocar de lugar com um Pokémon do grupo à espera." + }, + "tripleAxel": { + "name": "Triple Axel", + "effect": "Um ataque de três chutes consecutivos que se torna mais poderoso a cada acerto bem-sucedido." + }, + "dualWingbeat": { + "name": "Dual Wingbeat", + "effect": "O usuário atinge o alvo com suas asas. O alvo é atingido duas vezes seguidas." + }, + "scorchingSands": { + "name": "Scorching Sands", + "effect": "O usuário joga areia escaldante no alvo para atacar. Isso também pode deixar o alvo queimado." + }, + "jungleHealing": { + "name": "Jungle Healing", + "effect": "O usuário se torna um com a selva, restaurando HP e curando quaisquer condições de status de si mesmo e de seus Pokémon aliados na batalha." + }, + "wickedBlow": { + "name": "Wicked Blow", + "effect": "O usuário, tendo dominado o estilo Sombrio, atinge o alvo com um golpe feroz. Este ataque sempre resulta em um acerto crítico." + }, + "surgingStrikes": { + "name": "Surging Strikes", + "effect": "O usuário, tendo dominado o estilo Água, atinge o alvo com um movimento fluido três vezes seguidas. Estes ataques sempre resultam em acertos críticos." + }, + "thunderCage": { + "name": "Thunder Cage", + "effect": "O usuário prende o alvo em uma gaiola de eletricidade cintilante por quatro ou cinco turnos." + }, + "dragonEnergy": { + "name": "Dragon Energy", + "effect": "Convertendo sua força vital em poder, o usuário ataca os Pokémon adversários. Quanto menor o HP do usuário, menor o poder do movimento." + }, + "freezingGlare": { + "name": "Freezing Glare", + "effect": "O usuário dispara seu poder psíquico dos olhos para atacar. Isso também pode deixar o alvo congelado." + }, + "fieryWrath": { + "name": "Fiery Wrath", + "effect": "O usuário transforma sua ira em uma aura semelhante ao fogo para atacar. Isso também pode fazer os Pokémon adversários hesitarem." + }, + "thunderousKick": { + "name": "Thunderous Kick", + "effect": "O usuário oprime o alvo com movimento semelhante ao relâmpago antes de entregar um chute. Isso também diminui o atributo de Defesa do alvo." + }, + "glacialLance": { + "name": "Glacial Lance", + "effect": "O usuário ataca lançando uma lança de gelo envolta em nevasca nos Pokémon adversários." + }, + "astralBarrage": { + "name": "Astral Barrage", + "effect": "O usuário ataca enviando uma quantidade assustadora de pequenos fantasmas nos Pokémon adversários." + }, + "eerieSpell": { + "name": "Eerie Spell", + "effect": "O usuário ataca com seu tremendo poder psíquico. Isso também remove 3 PP do último movimento usado pelo alvo." + }, + "direClaw": { + "name": "Dire Claw", + "effect": "O usuário ataca o alvo com garras destruidoras. Isso também pode deixar o alvo envenenado, paralisado ou adormecido." + }, + "psyshieldBash": { + "name": "Psyshield Bash", + "effect": "Envoltando-se em energia psíquica, o usuário se choca contra o alvo. Isso também aumenta o atributo de Defesa do usuário." + }, + "powerShift": { + "name": "Power Shift", + "effect": "O usuário troca seus atributos de Ataque e Defesa." + }, + "stoneAxe": { + "name": "Stone Axe", + "effect": "O usuário balança seus machados de pedra no alvo. Fragmentos de pedra deixados para trás por este ataque flutuam ao redor do alvo." + }, + "springtideStorm": { + "name": "Springtide Storm", + "effect": "O usuário ataca envolvendo os Pokémon adversários em ventos ferozes repletos de amor e ódio. Isso também pode diminuir os atributos de Ataque deles." + }, + "mysticalPower": { + "name": "Mystical Power", + "effect": "O usuário ataca emitindo um poder misterioso. Isso também aumenta o atributo de Atq. Esp. do usuário." + }, + "ragingFury": { + "name": "Raging Fury", + "effect": "O usuário se enfurece espalhando chamas por dois ou três turnos. O usuário então fica confuso." + }, + "waveCrash": { + "name": "Wave Crash", + "effect": "O usuário se envolve em água e atinge o alvo com todo o corpo para infligir dano. Isso também causa muito dano ao usuário." + }, + "chloroblast": { + "name": "Chloroblast", + "effect": "O usuário lança sua clorofila acumulada para infligir dano no alvo. Isso também causa dano ao usuário." + }, + "mountainGale": { + "name": "Mountain Gale", + "effect": "O usuário arremessa pedaços gigantes de gelo no alvo para infligir dano. Isso também pode fazer o alvo hesitar." + }, + "victoryDance": { + "name": "Victory Dance", + "effect": "O usuário realiza uma dança intensa para inaugurar a vitória, aumentando seus atributos de Ataque, Defesa e Velocidade." + }, + "headlongRush": { + "name": "Headlong Rush", + "effect": "O usuário se choca contra o alvo em um ataque de corpo inteiro. Isso também diminui os atributos de Defesa e Def. Esp. do usuário." + }, + "barbBarrage": { + "name": "Barb Barrage", + "effect": "O usuário lança inúmeras barbas tóxicas para infligir dano. O poder deste movimento é dobrado se o alvo já estiver envenenado." + }, + "esperWing": { + "name": "Esper Wing", + "effect": "O usuário corta o alvo com asas enriquecidas com aura. Isso também aumenta o atributo de Velocidade do usuário. Este movimento tem uma chance aumentada de causar um acerto crítico." + }, + "bitterMalice": { + "name": "Bitter Malice", + "effect": "O usuário ataca o alvo com um ressentimento arrepiante. Isso também diminui o atributo de Ataque do alvo." + }, + "shelter": { + "name": "Shelter", + "effect": "O usuário torna sua pele tão dura quanto um escudo de ferro, aumentando muito seu atributo de Defesa." + }, + "tripleArrows": { + "name": "Triple Arrows", + "effect": "O usuário chuta e depois dispara três flechas. Este movimento tem uma chance aumentada de causar um acerto crítico e também pode diminuir o atributo de Defesa do alvo ou fazê-lo hesitar." + }, + "infernalParade": { + "name": "Infernal Parade", + "effect": "O usuário ataca com miríades de bolas de fogo. Isso também pode deixar o alvo queimado. O poder deste movimento é dobrado se o alvo tiver uma condição de status." + }, + "ceaselessEdge": { + "name": "Ceaseless Edge", + "effect": "O usuário corta sua lâmina de concha no alvo. Fragmentos de concha deixados para trás por este ataque permanecem espalhados sob o alvo como espinhos." + }, + "bleakwindStorm": { + "name": "Bleakwind Storm", + "effect": "O usuário ataca com ventos selvagemente frios que fazem tanto o corpo quanto o espírito tremerem. Isso também pode diminuir os atributos de Velocidade dos Pokémon adversários." + }, + "wildboltStorm": { + "name": "Wildbolt Storm", + "effect": "O usuário invoca uma tempestade trovejante e ataca selvagemente com relâmpagos e vento. Isso também pode deixar os Pokémon adversários paralisados." + }, + "sandsearStorm": { + "name": "Sandsear Storm", + "effect": "O usuário ataca envolvendo os Pokémon adversários em ventos ferozes e areia escaldante. Isso também pode deixá-los queimados." + }, + "lunarBlessing": { + "name": "Lunar Blessing", + "effect": "O usuário recebe uma bênção do crescente lunar, restaurando HP e curando condições de status para si mesmo e seus Pokémon aliados atualmente na batalha." + }, + "takeHeart": { + "name": "Take Heart", + "effect": "O usuário levanta o espírito, curando suas próprias condições de status e aumentando seus atributos de Atq. Esp. e Def. Esp." + }, + "gMaxWildfire": { + "name": "G-Max Wildfire", + "effect": "Um ataque do tipo Fogo que o Gigantamax Charizard usa. Este movimento continua causando dano aos oponentes por quatro turnos." + }, + "gMaxBefuddle": { + "name": "G-Max Befuddle", + "effect": "Um ataque do tipo Inseto que o Gigantamax Butterfree usa. Este movimento inflige as condições de envenenado, paralisado ou adormecido nos oponentes." + }, + "gMaxVoltCrash": { + "name": "G-Max Volt Crash", + "effect": "Um ataque do tipo Elétrico que o Gigantamax Pikachu usa. Este movimento paralisa os oponentes." + }, + "gMaxGoldRush": { + "name": "G-Max Gold Rush", + "effect": "Um ataque do tipo Normal que o Gigantamax Meowth usa. Este movimento confunde os oponentes e também ganha dinheiro extra." + }, + "gMaxChiStrike": { + "name": "G-Max Chi Strike", + "effect": "Um ataque do tipo Lutador que Gigantamax Machamp usa. Este movimento aumenta a chance de acertos críticos." + }, + "gMaxTerror": { + "name": "G-Max Terror", + "effect": "Um ataque do tipo Fantasma que Gigantamax Gengar usa. Este Pokémon pisa na sombra do Pokémon adversário para impedi-lo de escapar." + }, + "gMaxResonance": { + "name": "G-Max Resonance", + "effect": "Um ataque do tipo Gelo que Gigantamax Lapras usa. Este movimento reduz o dano recebido por cinco turnos." + }, + "gMaxCuddle": { + "name": "G-Max Cuddle", + "effect": "Um ataque do tipo Normal que Gigantamax Eevee usa. Este movimento apaixona os oponentes." + }, + "gMaxReplenish": { + "name": "G-Max Replenish", + "effect": "Um ataque do tipo Normal que Gigantamax Snorlax usa. Este movimento restaura Frutas que foram comidas." + }, + "gMaxMalodor": { + "name": "G-Max Malodor", + "effect": "Um ataque do tipo Veneno que Gigantamax Garbodor usa. Este movimento envenena os oponentes." + }, + "gMaxStonesurge": { + "name": "G-Max Stonesurge", + "effect": "Um ataque do tipo Água que Gigantamax Drednaw usa. Este movimento espalha pedras afiadas pelo campo." + }, + "gMaxWindRage": { + "name": "G-Max Wind Rage", + "effect": "Um ataque do tipo Voador que Gigantamax Corviknight usa. Este movimento remove os efeitos de movimentos como Reflect e Light Screen." + }, + "gMaxStunShock": { + "name": "G-Max Stun Shock", + "effect": "Um ataque do tipo Elétrico que Gigantamax Toxtricity usa. Este movimento envenena ou paralisa os oponentes." + }, + "gMaxFinale": { + "name": "G-Max Finale", + "effect": "Um ataque do tipo Fada que Gigantamax Alcremie usa. Este movimento cura os PS dos aliados." + }, + "gMaxDepletion": { + "name": "G-Max Depletion", + "effect": "Um ataque do tipo Dragão que Gigantamax Duraludon usa. Reduz o PP do último movimento usado." + }, + "gMaxGravitas": { + "name": "G-Max Gravitas", + "effect": "Um ataque do tipo Psíquico que Gigantamax Orbeetle usa. Este movimento muda a gravidade por cinco turnos." + }, + "gMaxVolcalith": { + "name": "G-Max Volcalith", + "effect": "Um ataque do tipo Pedra que Gigantamax Coalossal usa. Este movimento continua a causar dano aos oponentes por quatro turnos." + }, + "gMaxSandblast": { + "name": "G-Max Sandblast", + "effect": "Um ataque do tipo Terra que Gigantamax Sandaconda usa. Os oponentes ficam presos em uma tempestade de areia furiosa por quatro a cinco turnos." + }, + "gMaxSnooze": { + "name": "G-Max Snooze", + "effect": "Um ataque do tipo Sombrio que Gigantamax Grimmsnarl usa. O usuário solta um grande bocejo que faz com que os alvos adormeçam no próximo turno." + }, + "gMaxTartness": { + "name": "G-Max Tartness", + "effect": "Um ataque do tipo Planta que Gigantamax Flapple usa. Este movimento reduz a Evasão dos oponentes." + }, + "gMaxSweetness": { + "name": "G-Max Sweetness", + "effect": "Um ataque do tipo Planta que Gigantamax Appletun usa. Este movimento cura as condições de status dos aliados." + }, + "gMaxSmite": { + "name": "G-Max Smite", + "effect": "Um ataque do tipo Fada que Gigantamax Hatterene usa. Este movimento confunde os oponentes." + }, + "gMaxSteelsurge": { + "name": "G-Max Steelsurge", + "effect": "Um ataque do tipo Aço que Gigantamax Copperajah usa. Este movimento espalha estacas afiadas pelo campo." + }, + "gMaxMeltdown": { + "name": "G-Max Meltdown", + "effect": "Um ataque do tipo Aço que Gigantamax Melmetal usa. Este movimento impede os oponentes de usar o mesmo movimento duas vezes seguidas." + }, + "gMaxFoamBurst": { + "name": "G-Max Foam Burst", + "effect": "Um ataque do tipo Água que Gigantamax Kingler usa. Este movimento reduz drasticamente a Velocidade dos oponentes." + }, + "gMaxCentiferno": { + "name": "G-Max Centiferno", + "effect": "Um ataque do tipo Fogo que Gigantamax Centiskorch usa. Este movimento prende os oponentes em chamas por quatro a cinco turnos." + }, + "gMaxVineLash": { + "name": "G-Max Vine Lash", + "effect": "Um ataque do tipo Planta que Gigantamax Venusaur usa. Este movimento continua a causar dano aos oponentes por quatro turnos." + }, + "gMaxCannonade": { + "name": "G-Max Cannonade", + "effect": "Um ataque do tipo Água que Gigantamax Blastoise usa. Este movimento continua a causar dano aos oponentes por quatro turnos." + }, + "gMaxDrumSolo": { + "name": "G-Max Drum Solo", + "effect": "Um ataque do tipo Planta que Gigantamax Rillaboom usa. Este movimento pode ser usado no alvo independentemente de suas Habilidades." + }, + "gMaxFireball": { + "name": "G-Max Fireball", + "effect": "Um ataque do tipo Fogo que Gigantamax Cinderace usa. Este movimento pode ser usado no alvo independentemente de suas Habilidades." + }, + "gMaxHydrosnipe": { + "name": "G-Max Hydrosnipe", + "effect": "Um ataque do tipo Água que Gigantamax Inteleon usa. Este movimento pode ser usado no alvo independentemente de suas Habilidades." + }, + "gMaxOneBlow": { + "name": "G-Max One Blow", + "effect": "Um ataque do tipo Sombrio que Gigantamax Urshifu usa. Este movimento único pode ignorar o Max Guard." + }, + "gMaxRapidFlow": { + "name": "G-Max Rapid Flow", + "effect": "Um ataque do tipo Água que Gigantamax Urshifu usa. Este movimento rápido pode ignorar o Max Guard." + }, + "teraBlast": { + "name": "Tera Blast", + "effect": "Se o usuário estiver Terastalizado, ele libera energia de seu Tera Tipo. Este movimento causa dano usando o maior entre o Ataque ou Ataque Esp. do usuário." + }, + "silkTrap": { + "name": "Silk Trap", + "effect": "O usuário tece uma armadilha de seda, protegendo-se de dano enquanto reduz o atributo de Velocidade de qualquer atacante que faça contato direto." + }, + "axeKick": { + "name": "Axe Kick", + "effect": "O usuário ataca chutando para cima e depois abaixando o calcanhar sobre o alvo. Isso também pode confundir o alvo. Se errar, o usuário sofre dano." + }, + "lastRespects": { + "name": "Last Respects", + "effect": "O usuário ataca para vingar seus aliados. Quanto mais aliados derrotados, maior o poder do movimento." + }, + "luminaCrash": { + "name": "Lumina Crash", + "effect": "O usuário ataca liberando uma luz peculiar que afeta até a mente. Isso também reduz muito a Defesa Esp. do alvo." + }, + "orderUp": { + "name": "Order Up", + "effect": "O usuário ataca com elegância. Se o usuário tiver um Tatsugiri na boca, este movimento aumenta uma dos atributos do usuário com base na forma do Tatsugiri." + }, + "jetPunch": { + "name": "Jet Punch", + "effect": "O usuário convoca um turbilhão ao redor de seu punho e ataca com velocidade cegante. Este movimento sempre age primeiro." + }, + "spicyExtract": { + "name": "Spicy Extract", + "effect": "O usuário emite um extrato incrivelmente picante, aumentando muito o Ataque do alvo e reduzindo muito a Defesa do alvo." + }, + "spinOut": { + "name": "Spin Out", + "effect": "O usuário gira furiosamente ao esticar as pernas, causando dano ao alvo. Isso também reduz muito a Velocidade do usuário." + }, + "populationBomb": { + "name": "Population Bomb", + "effect": "Os companheiros do usuário se reúnem em massa para executar um ataque combinado que atinge o alvo de uma a dez vezes seguidas." + }, + "iceSpinner": { + "name": "Ice Spinner", + "effect": "O usuário cobre seus pés com gelo fino e gira ao redor, atingindo o alvo. O movimento giratório deste movimento também destrói o terreno." + }, + "glaiveRush": { + "name": "Glaive Rush", + "effect": "O usuário lança todo o seu corpo em uma carga imprudente. Após o uso deste movimento, ataques contra o usuário não podem errar e infligirão o dobro do dano até a próxima vez que o usuário agir." + }, + "revivalBlessing": { + "name": "Revival Blessing", + "effect": "O usuário concede uma bênção amorosa, reanimando um Pokémon da equipe que tenha desmaiado e restaurando metade do máximo de PS desse Pokémon." + }, + "saltCure": { + "name": "Salt Cure", + "effect": "O usuário cura o alvo com sal, causando dano a cada turno. Tipos de Aço e Água são mais fortemente afetados por este movimento." + }, + "tripleDive": { + "name": "Triple Dive", + "effect": "O usuário executa um mergulho triplo perfeitamente cronometrado, atingindo o alvo com respingos de água três vezes seguidas." + }, + "mortalSpin": { + "name": "Mortal Spin", + "effect": "O usuário realiza um ataque giratório que também pode eliminar os efeitos de movimentos como Bind, Wrap e Leech Seed. Isso também envenena os Pokémon oponentes." + }, + "doodle": { + "name": "Doodle", + "effect": "O usuário captura a essência do alvo em um esboço. Isso muda as Habilidades do usuário e de seus Pokémon aliados para a do alvo." + }, + "filletAway": { + "name": "Fillet Away", + "effect": "O usuário aumenta muito seus atributos de Ataque, Ataque Esp. e Velocidade ao usar seus próprios PS." + }, + "kowtowCleave": { + "name": "Kowtow Cleave", + "effect": "O usuário corta o alvo depois de se curvar para fazer o alvo baixar a guarda. Este ataque nunca erra." + }, + "flowerTrick": { + "name": "Flower Trick", + "effect": "O usuário lança um buquê de flores armado no alvo. Este ataque nunca erra e sempre resulta em um acerto crítico." + }, + "torchSong": { + "name": "Torch Song", + "effect": "O usuário exala chamas furiosas como se estivesse cantando uma canção, queimando o alvo. Isso também aumenta o atributo de Ataque Esp. do usuário." + }, + "aquaStep": { + "name": "Aqua Step", + "effect": "O usuário brinca com o alvo e o ataca usando passos de dança leves e fluidos. Isso também aumenta a Velocidade do usuário." + }, + "ragingBull": { + "name": "Raging Bull", + "effect": "O usuário realiza um ataque de investida como um touro enfurecido. O tipo deste movimento depende da forma do usuário. Ele também pode quebrar barreiras, como Light Screen e Reflect." + }, + "makeItRain": { + "name": "Make It Rain", + "effect": "O usuário ataca lançando uma massa de moedas. Isso também reduz o atributo de Ataque Esp. do usuário. Dinheiro é ganho após a batalha." + }, + "psyblade": { + "name": "Psyblade", + "effect": "O usuário fende o alvo com uma lâmina etérea. O poder deste movimento é aumentado em 50% se o usuário estiver no Electric Terrain." + }, + "hydroSteam": { + "name": "Hydro Steam", + "effect": "O usuário ataca o alvo com água fervente. O poder deste movimento não é reduzido sob sol forte, mas sim aumentado em 50%." + }, + "ruination": { + "name": "Ruination", + "effect": "O usuário invoca um desastre ruinoso. Isso corta os PS do alvo pela metade." + }, + "collisionCourse": { + "name": "Collision Course", + "effect": "O usuário se transforma e cai no chão, causando uma explosão pré-histórica massiva. O poder deste movimento é aumentado mais do que o usual se for um golpe super eficaz." + }, + "electroDrift": { + "name": "Electro Drift", + "effect": "O usuário avança a velocidades ultra-rápidas, perfurando o alvo com eletricidade futurista. O poder deste movimento é aumentado mais do que o usual se for um golpe super eficaz." + }, + "shedTail": { + "name": "Shed Tail", + "effect": "O usuário cria um substituto para si mesmo usando seus próprios PS antes de trocar de lugar com um Pokémon da equipe que está esperando." + }, + "chillyReception": { + "name": "Chilly Reception", + "effect": "O usuário conta uma piada terrivelmente ruim antes de trocar de lugar com um Pokémon da equipe que está esperando. Isso invoca uma nevasca que dura cinco turnos." + }, + "tidyUp": { + "name": "Tidy Up", + "effect": "O usuário arruma e remove os efeitos de Spikes, Stealth Rock, Sticky Web, Toxic Spikes e Substitute. Isso também aumenta os atributos de Ataque e Velocidade do usuário." + }, + "snowscape": { + "name": "Snowscape", + "effect": "O usuário invoca uma tempestade de neve que dura cinco turnos. Isso aumenta os atributos de Defesa dos tipos Gelo." + }, + "pounce": { + "name": "Pounce", + "effect": "O usuário ataca saltando sobre o alvo. Isso também reduz a Velocidade do alvo." + }, + "trailblaze": { + "name": "Trailblaze", + "effect": "O usuário ataca repentinamente como se estivesse saltando de dentro da grama alta. A agilidade do usuário aumenta sua Velocidade." + }, + "chillingWater": { + "name": "Chilling Water", + "effect": "O usuário ataca o alvo derramando sobre ele água tão fria que suga seu poder. Isso também reduz o atributo de Ataque do alvo." + }, + "hyperDrill": { + "name": "Hyper Drill", + "effect": "O usuário gira a parte pontiaguda de seu corpo em alta velocidade para perfurar o alvo. Este ataque pode atingir um alvo que esteja usando um movimento como Protect ou Detect." + }, + "twinBeam": { + "name": "Twin Beam", + "effect": "O usuário dispara feixes místicos de seus olhos para causar dano. O alvo é atingido duas vezes seguidas." + }, + "rageFist": { + "name": "Rage Fist", + "effect": "O usuário converte sua raiva em energia para atacar. Quanto mais vezes o usuário foi atingido por ataques, maior o poder do movimento." + }, + "armorCannon": { + "name": "Armor Cannon", + "effect": "O usuário dispara sua própria armadura como projéteis ardentes. Isso também reduz os atributos de Defesa e Defesa Esp. do usuário." + }, + "bitterBlade": { + "name": "Bitter Blade", + "effect": "O usuário concentra seus sentimentos amargos em relação ao mundo dos vivos em um ataque cortante. Os PS do usuário são restaurados em até metade do dano causado ao alvo." + }, + "doubleShock": { + "name": "Double Shock", + "effect": "O usuário descarrega toda a eletricidade de seu corpo para executar um ataque de alto dano. Após usar este movimento, o usuário não será mais do tipo Elétrico." + }, + "gigatonHammer": { + "name": "Gigaton Hammer", + "effect": "O usuário balança todo o seu corpo para atacar com seu enorme martelo. Este movimento não pode ser usado duas vezes seguidas." + }, + "comeuppance": { + "name": "Comeuppance", + "effect": "O usuário retalia com muito mais força contra o oponente que causou o último dano a ele." + }, + "aquaCutter": { + "name": "Aqua Cutter", + "effect": "O usuário expele água pressurizada para cortar o alvo como uma lâmina. Este movimento tem uma chance aumentada de resultar em um acerto crítico." + }, + "blazingTorque": { + "name": "Blazing Torque", + "effect": "O usuário acelera seu motor ardente no alvo. Isso também pode deixar o alvo queimado." + }, + "wickedTorque": { + "name": "Wicked Torque", + "effect": "O usuário acelera seu motor no alvo com intenção maliciosa. Isso pode fazer o alvo adormecer." + }, + "noxiousTorque": { + "name": "Noxious Torque", + "effect": "O usuário acelera seu motor venenoso no alvo. Isso também pode envenenar o alvo." + }, + "combatTorque": { + "name": "Combat Torque", + "effect": "O usuário acelera seu motor com força no alvo. Isso também pode deixar o alvo paralisado." + }, + "magicalTorque": { + "name": "Magical Torque", + "effect": "O usuário acelera seu motor de fadas no alvo. Isso também pode confundir o alvo." + }, + "bloodMoon": { + "name": "Blood Moon", + "effect": "O usuário libera toda a força de seu espírito de uma lua cheia que brilha tão vermelha quanto o sangue. Este movimento não pode ser usado duas vezes seguidas." + }, + "matchaGotcha": { + "name": "Matcha Gotcha", + "effect": "O usuário dispara um jato de chá que misturou. Os PS do usuário são restaurados em até metade do dano causado ao alvo. Isso também pode deixar o alvo queimado." + }, + "syrupBomb": { + "name": "Syrup Bomb", + "effect": "O usuário detona uma explosão de xarope de doces pegajoso, que reveste o alvo e faz o atributo de Velocidade do alvo cair a cada turno por três turnos." + }, + "ivyCudgel": { + "name": "Ivy Cudgel", + "effect": "O usuário golpeia com um porrete envolto em hera. O tipo deste movimento muda dependendo da máscara usada pelo usuário, e tem uma chance aumentada de resultar em um acerto crítico." + }, + "electroShot": { + "name": "Electro Shot", + "effect": "O usuário acumula eletricidade no primeiro turno, aumentando suo atributo de Ataque Esp., e então dispara um tiro de alta voltagem no próximo turno. O tiro será disparado imediatamente na chuva." + }, + "teraStarstorm": { + "name": "Tera Starstorm", + "effect": "Com o poder de seus cristais, o usuário bombardeia e elimina o alvo. Quando usado por Terapagos em sua Forma Estelar, este movimento causa dano a todos os Pokémon oponentes." + }, + "fickleBeam": { + "name": "Fickle Beam", + "effect": "O usuário dispara um feixe de luz para causar dano. Às vezes, todas as cabeças do usuário disparam feixes ao mesmo tempo, dobrando o poder do movimento." + }, + "burningBulwark": { + "name": "Burning Bulwark", + "effect": "A pele intensamente quente do usuário o protege de ataques e também queima qualquer atacante que faça contato direto." + }, + "thunderclap": { + "name": "Thunderclap", + "effect": "Este movimento permite que o usuário ataque primeiro com um choque de eletricidade. Este movimento falha se o alvo não estiver preparando um ataque." + }, + "mightyCleave": { + "name": "Mighty Cleave", + "effect": "O usuário empunha a luz que se acumulou no topo de sua cabeça para cortar o alvo. Este movimento atinge mesmo se o alvo se proteger." + }, + "tachyonCutter": { + "name": "Tachyon Cutter", + "effect": "O usuário ataca lançando lâminas de partículas no alvo duas vezes seguidas. Este ataque nunca erra." + }, + "hardPress": { + "name": "Hard Press", + "effect": "O alvo é esmagado com um braço, uma garra ou algo do tipo para causar dano. Quanto mais PS o alvo tiver, maior o poder do movimento." + }, + "dragonCheer": { + "name": "Dragon Cheer", + "effect": "O usuário eleva o moral de seus aliados com um grito dracônico, para que seus futuros ataques tenham uma chance aumentada de resultar em golpes críticos. Isso anima mais os tipos Dragão." + }, + "alluringVoice": { + "name": "Alluring Voice", + "effect": "O usuário ataca o alvo usando sua voz angelical. Isso também confunde o alvo se seus atributos tiverem sido aumentadas durante o turno." + }, + "temperFlare": { + "name": "Temper Flare", + "effect": "Impulsionado pelo desespero, o usuário ataca o alvo. O poder deste movimento é dobrado se o movimento anterior do usuário tiver falhado." + }, + "supercellSlam": { + "name": "Supercell Slam", + "effect": "O usuário eletrifica seu corpo e cai sobre o alvo para causar dano. Se este movimento errar, o usuário sofre dano." + }, + "psychicNoise": { + "name": "Psychic Noise", + "effect": "O usuário ataca o alvo com ondas sonoras desagradáveis. Por dois turnos, o alvo é impedido de recuperar PS através de movimentos, Habilidades ou itens mantidos." + }, + "upperHand": { + "name": "Upper Hand", + "effect": "O usuário reage ao movimento do alvo e o ataca com o calcanhar da palma da mão, fazendo o alvo hesitar. Este movimento falha se o alvo não estiver preparando um movimento de prioridade." + }, + "malignantChain": { + "name": "Malignant Chain", + "effect": "O usuário derrama toxinas no alvo envolvendo-o em uma corrente tóxica e corrosiva. Isso também pode deixar o alvo seriamente envenenado." + } +} diff --git a/src/locales/pt_BR/move.ts b/src/locales/pt_BR/move.ts deleted file mode 100644 index 0008cc55416..00000000000 --- a/src/locales/pt_BR/move.ts +++ /dev/null @@ -1,3812 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -export const move: MoveTranslationEntries = { - "pound": { - name: "Pound", - effect: "O alvo é golpeado com uma pata, uma cauda longa, ou com algo desse tipo." - }, - "karateChop": { - name: "Karate Chop", - effect: "O alvo é atacado com um golpe cortante. Golpes críticos ocorrem mais facilmente." - }, - "doubleSlap": { - name: "Double Slap", - effect: "O alvo é estapeado repetidamente, de duas a cinco vezes seguidas." - }, - "cometPunch": { - name: "Comet Punch", - effect: "O alvo é atingido com uma sequência de socos que acertam de duas a cinco vezes seguidas." - }, - "megaPunch": { - name: "Mega Punch", - effect: "O alvo é atingido por um soco desferido com grande força muscular." - }, - "payDay": { - name: "Pay Day", - effect: "Várias moedas são lançadas no alvo para causar dano. O Treinador recebe o dinheiro após a batalha." - }, - "firePunch": { - name: "Fire Punch", - effect: "O alvo é atingido por um punho flamejante. Isso pode deixar o alvo queimado." - }, - "icePunch": { - name: "Ice Punch", - effect: "O alvo é atingido por um punho gelado. Isso pode deixar o alvo congelado." - }, - "thunderPunch": { - name: "Thunder Punch", - effect: "O alvo é atingido por um punho eletrificado. Isso também pode deixar o alvo paralisado." - }, - "scratch": { - name: "Scratch", - effect: "Garras duras, pontiagudas e afiadas rasgam o alvo para causar dano." - }, - "viceGrip": { - name: "Vice Grip", - effect: "O alvo é agarrado pelos lados e espremido." - }, - "guillotine": { - name: "Guillotine", - effect: "Um ataque violento e destruidor com grandes pinças. Se o golpe acertar, o alvo desmaiará instantaneamente." - }, - "razorWind": { - name: "Razor Wind", - effect: "Neste ataque de dois turnos, lâminas de vento golpeiam Pokémon adversários no segundo turno. Golpes críticos ocorrem mais facilmente." - }, - "swordsDance": { - name: "Swords Dance", - effect: "Uma dança frenética para elevar o espírito de luta. Aumenta bruscamente o Ataque do usuário." - }, - "cut": { - name: "Cut", - effect: "O alvo é cortado com uma foice ou garra." - }, - "gust": { - name: "Gust", - effect: "Uma rajada de vento é levantada por asas e lançada no alvo para causar dano." - }, - "wingAttack": { - name: "Wing Attack", - effect: "O alvo é atingido por asas grandes e imponentes, amplamente abertas para causar dano." - }, - "whirlwind": { - name: "Whirlwind", - effect: "O alvo é soprado para fora da batalha, dando lugar a outro Pokémon. Em batalhas selvagens, a batalha termina caso seja contra um único Pokémon." - }, - "fly": { - name: "Fly", - effect: "O usuário levanta vôo e ataca o alvo no próximo turno." - }, - "bind": { - name: "Bind", - effect: "Um longo corpo ou tentáculos são utilizados para prender o alvo e espremê-lo por quatro ou cinco turnos." - }, - "slam": { - name: "Slam", - effect: "O alvo é atingido com uma longa cauda, vinhas ou algo parecido para infligir dano." - }, - "vineWhip": { - name: "Vine Whip", - effect: "O usuário utiliza-se de vinhas finas como chicote para infligir dano." - }, - "stomp": { - name: "Stomp", - effect: "O alvo é pisoteado por um grande pé. Isso também pode fazer o alvo hesitar." - }, - "doubleKick": { - name: "Double Kick", - effect: "O alvo é atingido rapidamente com um chute duas vezes seguidas usando ambos os pés." - }, - "megaKick": { - name: "Mega Kick", - effect: "O alvo é atingido por um chute desferido com grande força muscular." - }, - "jumpKick": { - name: "Jump Kick", - effect: "O usuário pula alto, depois golpeia com um chute. Se o chute erra, o usuário se fere." - }, - "rollingKick": { - name: "Rolling Kick", - effect: "O usuário desfere um rápido chute giratório. Isso também pode fazer o alvo hesitar." - }, - "sandAttack": { - name: "Sand Attack", - effect: "Areia é lançada no rosto do alvo, reduzindo sua Precisão." - }, - "headbutt": { - name: "Headbutt", - effect: "O usuário direciona sua cabeça e ataca, avançando diretamente sobre o alvo. Isso também pode fazer o alvo hesitar." - }, - "hornAttack": { - name: "Horn Attack", - effect: "O alvo é perfurado por um chifre pontudo e afiado para infligir dano." - }, - "furyAttack": { - name: "Fury Attack", - effect: "O alvo é perfurado repetidamente por um chifre ou bico, de duas a cinco vezes seguidas." - }, - "hornDrill": { - name: "Horn Drill", - effect: "O usuário perfura o alvo com um chifre que gira como uma broca. Se o golpe acertar, o alvo desmaia instantaneamente." - }, - "tackle": { - name: "Tackle", - effect: "Um ataque físico cujo o usuário vai para cima do alvo e lhe atinge com todo o seu corpo." - }, - "bodySlam": { - name: "Body Slam", - effect: "O usuário se lança para cima do alvo com todo o peso de seu corpo. Isso pode deixar o alvo paralisado." - }, - "wrap": { - name: "Wrap", - effect: "Um longo corpo, vinhas ou algo assim, são usados para embrulhar e apertar o alvo por quatro ou cinco turnos." - }, - "takeDown": { - name: "Take Down", - effect: "Uma investida corporal imprudente para golpear o alvo. Isso também fere um pouco o usuário." - }, - "thrash": { - name: "Thrash", - effect: "O usuário fica furioso e ataca com violência de dois a três turnos. O usuário então se torna confuso." - }, - "doubleEdge": { - name: "Double-Edge", - effect: "Uma investida imprudente e muito perigosa. Isso também fere bastante o usuário." - }, - "tailWhip": { - name: "Tail Whip", - effect: "O usuário balança sua cauda de maneira fofa, baixando a guarda do Pokémon adversário e diminuindo sua Defesa." - }, - "poisonSting": { - name: "Poison Sting", - effect: "O usuário perfura o alvo com um ferrão venenoso. Isso também pode envenenar o alvo." - }, - "twineedle": { - name: "Twineedle", - effect: "O usuário causa dano duas vezes seguidas, perfurando o alvo com dois ferrões. Isso também pode envenenar o alvo." - }, - "pinMissile": { - name: "Pin Missile", - effect: "Espinhos afiados são lançados no alvo em rápida sucessão. Eles acertam de duas a cinco vezes seguidas." - }, - "leer": { - name: "Leer", - effect: "O usuário lança um olhar intimidador no Pokémon oponente, reduzindo sua Defesa." - }, - "bite": { - name: "Bite", - effect: "O alvo é mordido ferozmente com presas afiadas. Isso também pode fazer o alvo hesitar." - }, - "growl": { - name: "Growl", - effect: "O usuário rosna de maneira agradável, baixando a guarda do Pokémon adversário. Isso diminui o Ataque do oponente." - }, - "roar": { - name: "Roar", - effect: "O alvo se assusta, retorna para a sua Poké Bola e um outro Pokémon toma o seu lugar. O combate é encerrado contra um único Pokémon selvagem." - }, - "sing": { - name: "Sing", - effect: "Uma suave canção de ninar é cantada com uma voz calma, colocando o alvo em sono profundo." - }, - "supersonic": { - name: "Supersonic", - effect: "O usuário gera estranhas ondas sonoras de seu corpo que confundem o alvo." - }, - "sonicBoom": { - name: "Sonic Boom", - effect: "O alvo é atingido com uma onda de choque destrutiva que sempre causa dano de 20 PS." - }, - "disable": { - name: "Disable", - effect: "Por quatro turnos, este movimento impede que o alvo utilize o último movimento usado por ele." - }, - "acid": { - name: "Acid", - effect: "Os Pokémon adversários são atacados com um jato de um forte ácido. Isso pode diminuir a Defesa Especial." - }, - "ember": { - name: "Ember", - effect: "O alvo é atacado com pequenas chamas. Também pode deixar o alvo com uma queimadura." - }, - "flamethrower": { - name: "Flamethrower", - effect: "O usuário queima o alvo com uma grande explosão de fogo. Também pode deixar o alvo com uma queimadura." - }, - "mist": { - name: "Mist", - effect: "O usuário esconde a si mesmo e seus aliados em uma neblina branca que impede que seus atributos sejam reduzidos por cinco turnos." - }, - "waterGun": { - name: "Water Gun", - effect: "O alvo é atingido por um disparo forte de água." - }, - "hydroPump": { - name: "Hydro Pump", - effect: "O alvo é atingido por um enorme volume de água lançado sob uma forte pressão." - }, - "surf": { - name: "Surf", - effect: "O usuário ataca tudo ao seu redor, inundando os arredores com uma onda gigante." - }, - "iceBeam": { - name: "Ice Beam", - effect: "O alvo é atingido por um raio de energia congelante. Isso também pode deixar o alvo congelado." - }, - "blizzard": { - name: "Blizzard", - effect: "Uma enorme nevasca é invocada para atacar o Pokémon oponente. Também pode deixar o alvo congelado." - }, - "psybeam": { - name: "Psybeam", - effect: "O alvo é atacado por um feixe peculiar. Isso também pode deixar o alvo confuso." - }, - "bubbleBeam": { - name: "Bubble Beam", - effect: "Um jato de bolhas é borrifado com intensidade no alvo. Isso também pode diminuir a Velocidade do alvo." - }, - "auroraBeam": { - name: "Aurora Beam", - effect: "O alvo é atingido por um raio colorido como o arco-íris. Isso também pode diminuir o Ataque do alvo." - }, - "hyperBeam": { - name: "Hyper Beam", - effect: "O alvo é atingido por um raio poderoso. O usuário não poderá se mover no próximo turno." - }, - "peck": { - name: "Peck", - effect: "O alvo é atingido por um bico ou chifre pontudo." - }, - "drillPeck": { - name: "Drill Peck", - effect: "Um ataque giratório com um bico afiado que age como uma broca." - }, - "submission": { - name: "Submission", - effect: "O usuário agarra o alvo e, imprudentemente, mergulha em direção ao chão. Isso também fere um pouco o usuário." - }, - "lowKick": { - name: "Low Kick", - effect: "Um poderoso chute baixo que derruba o alvo. Quanto mais pesado o alvo for, maior o poder do movimento." - }, - "counter": { - name: "Counter", - effect: "Um movimento de retaliação que neutraliza qualquer ataque físico, causando o dobro do dano recebido." - }, - "seismicToss": { - name: "Seismic Toss", - effect: "O alvo é lançado usando o poder da gravidade. Isso causa dano igual ao nível do usuário." - }, - "strength": { - name: "Strength", - effect: "O alvo é atingido por um soco dado com o máximo de força." - }, - "absorb": { - name: "Absorb", - effect: "Um ataque que drena nutrientes. O usuário recupera PS pela metade do dano infligido ao alvo." - }, - "megaDrain": { - name: "Mega Drain", - effect: "Um ataque que drena nutrientes. O usuário recupera PS pela metade do dano infligido ao alvo." - }, - "leechSeed": { - name: "Leech Seed", - effect: "Uma semente é plantada no alvo. Isso rouba alguns pontos de PS do alvo a cada turno." - }, - "growth": { - name: "Growth", - effect: "O corpo do usuário cresce de uma vez só, aumentando seu Ataque e Ataque Especial." - }, - "razorLeaf": { - name: "Razor Leaf", - effect: "Folhas superafiadas são lançadas para cortar os Pokémon adversários. Golpes críticos ocorrem mais facilmente." - }, - "solarBeam": { - name: "Solar Beam", - effect: "Neste ataque de dois turnos, o usuário absorve luz, então dispara um raio focalizado no próximo turno." - }, - "poisonPowder": { - name: "Poison Powder", - effect: "O usuário espalha uma nuvem de poeira tóxica que envenena o alvo." - }, - "stunSpore": { - name: "Stun Spore", - effect: "O usuário espalha uma nuvem de esporos entorpecentes que paralisam o alvo." - }, - "sleepPowder": { - name: "Sleep Powder", - effect: "O usuário espalha uma grande nuvem de pó sonífero ao redor do alvo." - }, - "petalDance": { - name: "Petal Dance", - effect: "O usuário ataca o alvo espalhando pétalas de dois a três turnos. O usuário então fica confuso." - }, - "stringShot": { - name: "String Shot", - effect: "O Pokémon adversário é enrolado com uma seda expelida da boca do usuário, o que reduz duramente sua Velocidade." - }, - "dragonRage": { - name: "Dragon Rage", - effect: "Este ataque atinge o alvo com uma onda de choque de pura fúria. Este ataque sempre causa 40 PS de dano." - }, - "fireSpin": { - name: "Fire Spin", - effect: "O alvo fica preso dentro de um vórtice feroz de fogo que se prolonga por quatro ou cinco turnos." - }, - "thunderShock": { - name: "Thunder Shock", - effect: "Um choque elétrico que cai sobre o alvo causando dano. Isso também pode deixar o alvo paralisado." - }, - "thunderbolt": { - name: "Thunderbolt", - effect: "Uma forte explosão elétrica que cai sobre o alvo. Também pode deixar o alvo com paralisia." - }, - "thunderWave": { - name: "Thunder Wave", - effect: "O usuário lança um choque elétrico fraco que paralisa o alvo." - }, - "thunder": { - name: "Thunder", - effect: "Um raio cruel despenca no alvo para causar dano. Isso também pode deixar o alvo com paralisia." - }, - "rockThrow": { - name: "Rock Throw", - effect: "Para atacar, o usuário pega uma pequena rocha e joga no alvo." - }, - "earthquake": { - name: "Earthquake", - effect: "O usuário desencadeia um terremoto que atinge todos os Pokémon ao seu redor." - }, - "fissure": { - name: "Fissure", - effect: "O usuário abre uma fissura no chão e joga o alvo nela. O alvo desmaiará instantaneamente se esse ataque acertar." - }, - "dig": { - name: "Dig", - effect: "O usuário se entoca, então ataca no próximo turno." - }, - "toxic": { - name: "Toxic", - effect: "Um movimento que deixa o alvo seriamente envenenado. Seu dano venenoso aumenta a cada turno." - }, - "confusion": { - name: "Confusion", - effect: "O alvo é atingido por uma força telecinética fraca. Isso também pode deixar o alvo confuso." - }, - "psychic": { - name: "Psychic", - effect: "O alvo é atingido por uma força telecinética poderosa. Isso também pode diminuir a Defesa Especial do alvo." - }, - "hypnosis": { - name: "Hypnosis", - effect: "O usuário implanta uma sugestão hipnótica para fazer o alvo cair em um sono profundo." - }, - "meditate": { - name: "Meditate", - effect: "O usuário medita para despertar o poder profundo do seu corpo para aumentar seu Ataque." - }, - "agility": { - name: "Agility", - effect: "O usuário relaxa o corpo para se mover rapidamente. Isso aumenta bruscamente sua Velocidade." - }, - "quickAttack": { - name: "Quick Attack", - effect: "O usuário ataca o alvo em uma velocidade que o torna quase invisível. Esse movimento tem prioridade." - }, - "rage": { - name: "Rage", - effect: "Enquanto este movimento estiver em uso, o poder da ira aumenta o Ataque toda vez que o usuário for atingido em batalha." - }, - "teleport": { - name: "Teleport", - effect: "Use para fugir de qualquer Pokémon selvagem." - }, - "nightShade": { - name: "Night Shade", - effect: "O usuário faz com que o alvo veja uma miragem assustadora. Isso causa dano igual ao nível do usuário." - }, - "mimic": { - name: "Mimic", - effect: "O usuário copia o último movimento do alvo. O movimento pode ser usado durante a batalha até que o Pokémon seja trocado." - }, - "screech": { - name: "Screech", - effect: "Um grito estridente que reduz duramente o atributo de Defesa do alvo." - }, - "doubleTeam": { - name: "Double Team", - effect: "Movendo-se rapidamente, o usuário faz cópias ilusórias para aumentar sua Evasão." - }, - "recover": { - name: "Recover", - effect: "Restaurando suas células, o usuário restaura metade do seu máximo de PS." - }, - "harden": { - name: "Harden", - effect: "O usuário enrijece todos os músculos do seu corpo para aumentar seu atributo de Defesa." - }, - "minimize": { - name: "Minimize", - effect: "O usuário comprime seu corpo para se parecer menor, o que aumenta bruscamente sua Evasão." - }, - "smokescreen": { - name: "Smokescreen", - effect: "O usuário lança uma nuvem obscura de fumaça ou tinta. Isso diminui a Precisão do alvo." - }, - "confuseRay": { - name: "Confuse Ray", - effect: "O alvo é exposto a um raio sinistro que leva à confusão." - }, - "withdraw": { - name: "Withdraw", - effect: "O usuário retrai seu corpo para dentro de seu casco duro, aumentando o seu atributo de Defesa." - }, - "defenseCurl": { - name: "Defense Curl", - effect: "O usuário se enrola para esconder os pontos fracos e aumentar seu atributo de Defesa." - }, - "barrier": { - name: "Barrier", - effect: "O usuário ergue uma barreira robusta que aumenta bruscamente a sua Defesa." - }, - "lightScreen": { - name: "Light Screen", - effect: "Uma incrível parede de luz é erguida para reduzir o dano de ataques especiais por cinco turnos." - }, - "haze": { - name: "Haze", - effect: "O usuário cria uma névoa que elimina todas as alterações de atributos de todos os Pokémon em batalha." - }, - "reflect": { - name: "Reflect", - effect: "Uma incrível parede de luz é erguida para reduzir o dano de ataques físicos por cinco turnos." - }, - "focusEnergy": { - name: "Focus Energy", - effect: "O usuário respira fundo e concentra-se para que golpes críticos ocorram mais facilmente." - }, - "bide": { - name: "Bide", - effect: "O usuário resiste a ataques por dois turnos, e revida causando o dobro do dano recebido." - }, - "metronome": { - name: "Metronome", - effect: "O usuário balança um dedo e estimula seu cérebro para usar aleatoriamente quase qualquer movimento." - }, - "mirrorMove": { - name: "Mirror Move", - effect: "O usuário contra-ataca o alvo imitando seu último movimento utilizado." - }, - "selfDestruct": { - name: "Self-Destruct", - effect: "O usuário ataca tudo ao seu redor causando uma explosão. O usuário desmaia por usar esse golpe." - }, - "eggBomb": { - name: "Egg Bomb", - effect: "Um ovo grande é arremessado contra o alvo com força máxima para causar dano." - }, - "lick": { - name: "Lick", - effect: "O alvo é lambido com uma língua comprida, causando dano. Isso também pode deixar o alvo paralisado." - }, - "smog": { - name: "Smog", - effect: "O alvo é atacado com uma descarga de gases poluentes. Isso também pode envenenar o alvo." - }, - "sludge": { - name: "Sludge", - effect: "Lodo insalubre é no arremessado no alvo. Isso também pode causar envenenamento." - }, - "boneClub": { - name: "Bone Club", - effect: "O usuário golpeia o alvo com um osso. Isso também pode o fazer o alvo hesitar." - }, - "fireBlast": { - name: "Fire Blast", - effect: "O alvo é atacado com uma intensa explosão de fogo consumidor. Isso também pode deixar o alvo com uma queimadura." - }, - "waterfall": { - name: "Waterfall", - effect: "O usuário investe no alvo e pode fazê-lo hesitar." - }, - "clamp": { - name: "Clamp", - effect: "O alvo é apertado e imprensado pela concha densa e robusta do usuário por quatro ou cinco turnos." - }, - "swift": { - name: "Swift", - effect: "Raios em formato de estrela são disparados no Pokémon adversário. Esse ataque nunca erra." - }, - "skullBash": { - name: "Skull Bash", - effect: "O usuário retrai sua cabeça para aumentar a Defesa no primeiro turno e depois se choca com o alvo no próximo turno." - }, - "spikeCannon": { - name: "Spike Cannon", - effect: "Espinhos afiados são lançados no alvo em rápida sucessão. Eles acertam de duas a cinco vezes seguidas." - }, - "constrict": { - name: "Constrict", - effect: "O alvo é atacado com longos e sorrateiros tentáculos ou vinhas. Isso também pode diminuir a Velocidade do alvo." - }, - "amnesia": { - name: "Amnesia", - effect: "O usuário esvazia sua mente para esquecer suas preocupações. Aumenta bruscamente a Defesa Especial." - }, - "kinesis": { - name: "Kinesis", - effect: "O usuário distrai o alvo entortando uma colher. Isso diminui a Precisão do alvo." - }, - "softBoiled": { - name: "Soft-Boiled", - effect: "O usuário restaura os próprios PS pela metade dos seus PS máximos." - }, - "highJumpKick": { - name: "High Jump Kick", - effect: "O alvo é atacado com uma joelhada de um pulo. Caso erre, o usuário se machuca." - }, - "glare": { - name: "Glare", - effect: "O usuário intimida o alvo com o padrão em sua barriga para causar paralisia." - }, - "dreamEater": { - name: "Dream Eater", - effect: "O usuário se alimenta dos sonhos de um alvo adormecido. Ele absorve metade do dano causado para curar seus PS." - }, - "poisonGas": { - name: "Poison Gas", - effect: "Uma nuvem de gás venenoso é assoprada no rosto do Pokémon adversário. Isso pode envenenar os alvos." - }, - "barrage": { - name: "Barrage", - effect: "Objetos redondos são lançados no alvo para acertar de duas a cinco vezes seguidas." - }, - "leechLife": { - name: "Leech Life", - effect: "O usuário drena o sangue do alvo. Os PS do usuário são restaurados pela metade do dano recebido pelo alvo." - }, - "lovelyKiss": { - name: "Lovely Kiss", - effect: "Com uma face assustadora, o usuário tenta beijar o alvo à força. Se conseguir, o alvo cai no sono." - }, - "skyAttack": { - name: "Sky Attack", - effect: "Um movimento de dois turnos onde golpes críticos ocorrem mais facilmente. Também pode fazer o alvo hesitar." - }, - "transform": { - name: "Transform", - effect: "O usuário transforma-se em uma cópia do alvo, conseguindo os mesmos movimentos do adversário." - }, - "bubble": { - name: "Bubble", - effect: "Um jato de incontáveis bolhas é disparado no Pokémon adversário. Isso também pode diminuir a velocidade do alvo." - }, - "dizzyPunch": { - name: "Dizzy Punch", - effect: "O alvo é atingido com socos dados ritmicamente. Isso também pode deixar alvo confuso." - }, - "spore": { - name: "Spore", - effect: "O usuário espalha rajadas de esporos que induzem sono ao alvo." - }, - "flash": { - name: "Flash", - effect: "O usuário pisca uma luz brilhante que reduz a Precisão do alvo." - }, - "psywave": { - name: "Psywave", - effect: "O alvo é atacado com uma estranha onda psíquica. O ataque varia de intensidade." - }, - "splash": { - name: "Splash", - effect: "O usuário apenas debate-se no chão e espirra água ao seu redor sem efeito algum..." - }, - "acidArmor": { - name: "Acid Armor", - effect: "O usuário altera sua estrutura celular para se liquefazer, aumentando bruscamente o seu atributo de Defesa." - }, - "crabhammer": { - name: "Crabhammer", - effect: "O alvo é martelado com uma grande pinça. Golpes críticos acertam mais facilmente." - }, - "explosion": { - name: "Explosion", - effect: "O usuário ataca tudo o que estiver à sua volta causando uma tremenda explosão. O usuário desmaia ao usar esse movimento." - }, - "furySwipes": { - name: "Fury Swipes", - effect: "O alvo é atacado com garras afiadas ou foices rapidamente, de duas a cinco vezes seguidas." - }, - "bonemerang": { - name: "Bonemerang", - effect: "O usuário arremessa o osso que segura. O osso gira, atingindo o alvo duas vezes, indo e voltando." - }, - "rest": { - name: "Rest", - effect: "O usuário dorme por dois turnos. Isso restaura completamente os PS do usuário e cura quaisquer condições negativas." - }, - "rockSlide": { - name: "Rock Slide", - effect: "Pedras grandes são arremessadas no Pokémon oponente para causar dano. Isso também pode fazer o Pokémon oponente hesitar." - }, - "hyperFang": { - name: "Hyper Fang", - effect: "O usuário morde o alvo com força, usando as suas afiadas presas frontais. Isso também pode fazer o alvo hesitar." - }, - "sharpen": { - name: "Sharpen", - effect: "O usuário abaixa o número de polígonos, ficando mais pontiagudo. Isso aumenta o seu atributo de Ataque." - }, - "conversion": { - name: "Conversion", - effect: "O usuário muda seu tipo para o mesmo tipo do movimento no topo da lista dos movimentos que conhece no momento." - }, - "triAttack": { - name: "Tri Attack", - effect: "O usuário golpeia com um ataque de três raios simultâneos. Também pode queimar, congelar ou paralisar o alvo." - }, - "superFang": { - name: "Super Fang", - effect: "O usuário mastiga com força o alvo usando suas afiadas presas frontais. Isso corta os PS do alvo pela metade." - }, - "slash": { - name: "Slash", - effect: "O alvo é atacado com um açoite de garras ou lâminas. Golpes críticos ocorrem mais facilmente." - }, - "substitute": { - name: "Substitute", - effect: "O usuário faz uma cópia de si mesmo usando parte de seus PS. A cópia serve como uma isca para o usuário." - }, - "struggle": { - name: "Struggle", - effect: "Um ataque usado em desespero, apenas se o usuário não tiver PP. Isso também causa um pouco de dano no usuário." - }, - "sketch": { - name: "Sketch", - effect: "Permite que o usuário aprenda permanentemente o último movimento usado pelo alvo. Assim que for usado, o Esboço desaparece." - }, - "tripleKick": { - name: "Triple Kick", - effect: "Um ataque de três chutes consecutivos que se fortalece a cada golpe acertado." - }, - "thief": { - name: "Thief", - effect: "O usuário ataca e rouba o item segurado por seu alvo simultaneamente. O usuário não pode roubar algo se ele já segurar um item." - }, - "spiderWeb": { - name: "Spider Web", - effect: "O usuário enlaça o alvo com uma teia fina e grudenta, para que ele não possa fugir da batalha." - }, - "mindReader": { - name: "Mind Reader", - effect: "O usuário pressente os movimentos do alvo com sua mente para ter certeza que o seu próximo ataque não o erre." - }, - "nightmare": { - name: "Nightmare", - effect: "Um alvo que dorme terá um pesadelo que causará dano a cada turno." - }, - "flameWheel": { - name: "Flame Wheel", - effect: "O usuário se envolve em fogo e dispara em direção ao alvo. Isso também pode causar queimaduras no oponente." - }, - "snore": { - name: "Snore", - effect: "Um ataque que só pode ser usado se o usuário estiver dormindo. O barulho alto pode fazer o alvo hesitar." - }, - "curse": { - name: "Curse", - effect: "Um movimento que funciona diferente com o tipo Fantasma do que com outros tipos." - }, - "flail": { - name: "Flail", - effect: "O usuário agita os membros sem rumo para atacar. Quanto menores forem os PS do usuário, melhor será o movimento." - }, - "conversion2": { - name: "Conversion 2", - effect: "O usuário muda a própria tipagem para se fazer resistente ao tipo do último ataque usado pelo oponente." - }, - "aeroblast": { - name: "Aeroblast", - effect: "Um vortex de vento é atirado em direção ao alvo para causar dano. Golpes críticos ocorrem mais facilmente." - }, - "cottonSpore": { - name: "Cotton Spore", - effect: "O usuário solta esporos de algodão que grudam no Pokémon adversário. Isso prejudica bruscamente a Velocidade do oponente." - }, - "reversal": { - name: "Reversal", - effect: "Um ataque total que fica mais forte quanto menos PS o usuário possuir." - }, - "spite": { - name: "Spite", - effect: "O usuário libera todo o seu rancor no último movimento usado pelo oponente, cortando 4 PP do mesmo." - }, - "powderSnow": { - name: "Powder Snow", - effect: "O usuário ataca com uma brisa congelante de Neve em Pó. Isso talvez possa congelar o Pokémon adversário." - }, - "protect": { - name: "Protect", - effect: "Permite que o usuário desvie de todos os ataques. A sua chance de falhar aumenta, caso seja usado em sucessão." - }, - "machPunch": { - name: "Mach Punch", - effect: "O usuário soca numa velocidade incompreensível. Esse movimento tem prioridade." - }, - "scaryFace": { - name: "Scary Face", - effect: "O usuário assusta o alvo com uma cara assustadora para prejudicar duramente a velocidade do oponente." - }, - "feintAttack": { - name: "Feint Attack", - effect: "O usuário se aproxima do alvo amigavelmente, então ataca com um soco inesperado. Esse ataque nunca erra." - }, - "sweetKiss": { - name: "Sweet Kiss", - effect: "O usuário beija o alvo com uma fofura doce e angelical, causando confusão." - }, - "bellyDrum": { - name: "Belly Drum", - effect: "O usuário maximiza seu Ataque em troca de PS igual à metade do seu PS máximo." - }, - "sludgeBomb": { - name: "Sludge Bomb", - effect: "Lodo insalubre é no arremessado no alvo. Isso também pode causar envenenamento." - }, - "mudSlap": { - name: "Mud-Slap", - effect: "O usuário arremessa lama no rosto do adversário para causar dano e prejudicar sua precisão." - }, - "octazooka": { - name: "Octazooka", - effect: "O usuário ataca jogando tinta no rosto ou nos olhos do alvo. Isso pode prejudicar a Precisão do alvo." - }, - "spikes": { - name: "Spikes", - effect: "O usuário lança armadilhas de espinhos nos pés da equipe adversária. As armadilhas ferem os Pokémon que são trocados em batalha." - }, - "zapCannon": { - name: "Zap Cannon", - effect: "O usuário atira uma explosão elétrica como um canhão para infligir dano e causar paralisia." - }, - "foresight": { - name: "Foresight", - effect: "Permite que um alvo do tipo Fantasma seja atingido por ataques do tipo Normal e Lutador. Isso também permite que um alvo evasivo seja acertado." - }, - "destinyBond": { - name: "Destiny Bond", - effect: "Quando esse movimento é usado, caso o usuário desmaie, o Pokémon que acertou o nocaute também desmaiará. A chance de falhar aumenta se usado em sucessão." - }, - "perishSong": { - name: "Perish Song", - effect: "Qualquer Pokémon que ouvir essa Canção desmaiará em três turnos, a não ser que ele seja retirado da batalha." - }, - "icyWind": { - name: "Icy Wind", - effect: "O usuário ataca com uma rajada de ar arrepiante. Isso também prejudica a Velocidade do Pokémon adversário." - }, - "detect": { - name: "Detect", - effect: "Permite que o usuário desvie de todos os ataques. A sua chance de falhar aumenta, caso seja usado em sucessão." - }, - "boneRush": { - name: "Bone Rush", - effect: "O usuário atinge o alvo com um osso duro de duas a cinco vezes seguidas." - }, - "lockOn": { - name: "Lock-On", - effect: "O usuário foca sua mira no alvo. Isso garante que o próximo ataque não erre o alvo." - }, - "outrage": { - name: "Outrage", - effect: "O usuário fica furioso e ataca com violência de dois a três turnos. O usuário então se torna confuso." - }, - "sandstorm": { - name: "Sandstorm", - effect: "Uma tempestade de areia é invocada durante 5 turnos para ferir todos os combatentes, exceto os tipos Pedra, Terra e Aço. Isso aumenta a Defesa Especial dos tipo Pedra." - }, - "gigaDrain": { - name: "Giga Drain", - effect: "Um ataque que drena nutrientes. O usuário recupera PS pela metade do dano infligido ao alvo." - }, - "endure": { - name: "Endure", - effect: "O usuário resiste a qualquer ataque com pelo menos 1 PS. A chance de falhar aumenta caso seja usado em sucessão." - }, - "charm": { - name: "Charm", - effect: "O usuário contempla o alvo com um olhar charmoso, fazendo-o ficar menos atento. Isso prejudica duramente o Ataque do oponente." - }, - "rollout": { - name: "Rollout", - effect: "O usuário rola continuamente em direção ao alvo por cinco turnos. O ataque fica mais forte a cada acerto." - }, - "falseSwipe": { - name: "False Swipe", - effect: "Um ataque moderado que previne que o alvo desmaie. O alvo é deixado com pelo menos 1 de PS." - }, - "swagger": { - name: "Swagger", - effect: "O usuário enfurece e confunde o alvo. Entretanto, isso também aumenta bruscamente o Ataque do alvo." - }, - "milkDrink": { - name: "Milk Drink", - effect: "O usuário restaura os próprios PS pela metade dos seus PS máximos." - }, - "spark": { - name: "Spark", - effect: "O usuário direciona uma investida carregada com eletricidade no alvo. Isso pode paralisar o alvo." - }, - "furyCutter": { - name: "Fury Cutter", - effect: "O alvo é cortado com foices ou garras. Esse ataque se torna mais poderoso se usado em sucessão." - }, - "steelWing": { - name: "Steel Wing", - effect: "O alvo é atingido com asas de aço. Isso também pode aumentar a Defesa do usuário." - }, - "meanLook": { - name: "Mean Look", - effect: "O usuário encara o alvo com um olhar sombrio e opressor. O alvo se torna incapaz de fugir." - }, - "attract": { - name: "Attract", - effect: "Caso o adversário seja do gênero oposto ao usuário, o alvo se apaixona e se torna menos suscetível a atacar." - }, - "sleepTalk": { - name: "Sleep Talk", - effect: "Enquanto está dormindo, o usuário usa aleatoriamente um dos movimentos que tem conhecimento." - }, - "healBell": { - name: "Heal Bell", - effect: "O usuário toca um sino calmante para curar condições de estados de todos os Pokémon aliados na equipe." - }, - "return": { - name: "Return", - effect: "Um ataque poderoso que fica mais poderoso à medida que o usuário gosta de seu Treinador." - }, - "present": { - name: "Present", - effect: "O usuário ataca o alvo entregando um presente com uma armadilha oculta. Entretanto, às vezes cura os PS do alvo." - }, - "frustration": { - name: "Frustration", - effect: "Um ataque poderoso que fica mais poderoso à medida que o usuário desgosta de seu Treinador." - }, - "safeguard": { - name: "Safeguard", - effect: "O usuário cria um campo protetor que previne condições de estado por cinco turnos." - }, - "painSplit": { - name: "Pain Split", - effect: "O usuário adiciona os próprios PS aos PS do alvo, então compartilha igualmente os PS combinados com o alvo." - }, - "sacredFire": { - name: "Sacred Fire", - effect: "O usuário é arrasado com uma rajada de fogo místico de grande intensidade. Isso pode deixar o alvo queimado." - }, - "magnitude": { - name: "Magnitude", - effect: "O usuário ataca tudo ao seu redor com um grande tremor. Seu poder varia." - }, - "dynamicPunch": { - name: "Dynamic Punch", - effect: "O usuário soca o alvo com sua força totalmente concentrada. Em caso de acerto, confundirá o alvo." - }, - "megahorn": { - name: "Megahorn", - effect: "Usando seu impressionante chifre resistente, o usuário golpeia o alvo sem trégua." - }, - "dragonBreath": { - name: "Dragon Breath", - effect: "O usuário sopra uma poderosa rajada que causa dano. Isso também pode paralisar o alvo." - }, - "batonPass": { - name: "Baton Pass", - effect: "O usuário troca de lugar com um Pokémon da equipe em espera e passa para ele quaisquer mudanças de atributos." - }, - "encore": { - name: "Encore", - effect: "O usuário enaltece o alvo para que ele continue usando o movimento que ele usou por último durante três turnos." - }, - "pursuit": { - name: "Pursuit", - effect: "Um ataque que causa o dobro do dano caso seja usado em um alvo que esteja sendo trocado para fora da batalha." - }, - "rapidSpin": { - name: "Rapid Spin", - effect: "Um ataque giratório que pode anular movimentos como Enlaçar, Embrulho, Sanguessuga e Espinhos." - }, - "sweetScent": { - name: "Sweet Scent", - effect: "Um aroma doce que prejudica duramente a Evasão do Pokémon adversário." - }, - "ironTail": { - name: "Iron Tail", - effect: "O alvo é esmagado com uma cauda dura como aço. Isso também pode prejudicar a Defesa do alvo." - }, - "metalClaw": { - name: "Metal Claw", - effect: "O alvo é cortado com garras de metal. Isso também pode aumentar o Ataque do usuário." - }, - "vitalThrow": { - name: "Vital Throw", - effect: "O usuário sempre ataca por último. Em troca, esse arremesso nunca erra." - }, - "morningSun": { - name: "Morning Sun", - effect: "O usuário restaura os próprios PS. A quantidade de PS recuperada varia conforme o clima." - }, - "synthesis": { - name: "Synthesis", - effect: "O usuário restaura os próprios PS. A quantidade de PS recuperada varia conforme o clima." - }, - "moonlight": { - name: "Moonlight", - effect: "O usuário restaura os próprios PS. A quantidade de PS recuperada varia conforme o clima." - }, - "hiddenPower": { - name: "Hidden Power", - effect: "Um ataque único que varia em tipo dependendo do Pokémon que está utilizando." - }, - "crossChop": { - name: "Cross Chop", - effect: "O usuário dá um golpe duplo com seus antebraços cruzados. Golpes críticos ocorrem mais facilmente." - }, - "twister": { - name: "Twister", - effect: "O usuário rapidamente cria um tornado vicioso para rasgar os Pokémon adversários. Isso pode fazê-los hesitar." - }, - "rainDance": { - name: "Rain Dance", - effect: "O usuário invoca uma chuva intensa que continua caindo por cinco turnos, fortalecendo os movimentos do tipo Água. Também enfraquece os movimentos do tipo fogo." - }, - "sunnyDay": { - name: "Sunny Day", - effect: "O usuário intensifica o sol por cinco turnos, fortalecendo os ataques do tipo Fogo. Também enfraquece os movimentos do tipo água." - }, - "crunch": { - name: "Crunch", - effect: "O usuário mastiga o alvo com presas afiadas. Isso também pode prejudicar a Defesa do alvo." - }, - "mirrorCoat": { - name: "Mirror Coat", - effect: "Um movimento de retaliação que contra-ataca qualquer ataque especial, infligindo o dobro do dano recebido." - }, - "psychUp": { - name: "Psych Up", - effect: "O usuário hipnotiza a si mesmo para copiar qualquer mudança de atributo feita pelo alvo." - }, - "extremeSpeed": { - name: "Extreme Speed", - effect: "O usuário ataca o alvo numa velocidade invisível ao olho nu. Esse movimento tem prioridade." - }, - "ancientPower": { - name: "Ancient Power", - effect: "O usuário ataca com um poder pré-histórico. Isso também pode fortalecer todos os atributos do usuário de uma vez." - }, - "shadowBall": { - name: "Shadow Ball", - effect: "O usuário arremessa uma esfera sombria no alvo. Isso também pode prejudicar a Defesa Especial do alvo." - }, - "futureSight": { - name: "Future Sight", - effect: "Dois turnos após esse movimento ser usado, uma grande quantidade de energia psíquica atinge o alvo." - }, - "rockSmash": { - name: "Rock Smash", - effect: "O usuário ataca com um soco. Isso também pode prejudicar o atributo de Defesa do alvo." - }, - "whirlpool": { - name: "Whirlpool", - effect: "O usuário prende o alvo num violento redemoinho por quatro ou cinco turnos." - }, - "beatUp": { - name: "Beat Up", - effect: "O usuário reúne todos os Pokémon da equipe para atacar o alvo. Quanto maior o número de Pokémon na equipe, maior será o número de ataques." - }, - "fakeOut": { - name: "Fake Out", - effect: "Um ataque que acerta primeiro e faz o alvo hesitar. Só funciona no primeiro turno do usuário em batalha." - }, - "uproar": { - name: "Uproar", - effect: "O usuário ataca gritando por três turnos. Durante esse tempo, ninguém pode cair no sono." - }, - "stockpile": { - name: "Stockpile", - effect: "O usuário carrega seu poder e fortalece a Defesa e a Defesa Especial. O movimento pode ser usado três vezes." - }, - "spitUp": { - name: "Spit Up", - effect: "O poder carregado usando o movimento Estocagem é liberado de uma só vez em um ataque. Quanto mais poder é armazenado, maior a força do movimento." - }, - "swallow": { - name: "Swallow", - effect: "O poder carregado usando o movimento Estocagem é absorvido pelo usuário para curar PS. Quanto mais poder for armazenado, mais PS serão recuperados." - }, - "heatWave": { - name: "Heat Wave", - effect: "O usuário ataca exalando um sopro ardente nos Pokémon adversários. Isso também pode deixar esses Pokémon queimados." - }, - "hail": { - name: "Hail", - effect: "O usuário invoca uma tempestade de granizo durante cinco turnos. Isso fere todos os Pokémon, exceto os tipo Gelo." - }, - "torment": { - name: "Torment", - effect: "O usuário atormenta o alvo, fazendo-o incapaz de usar o mesmo movimento duas vezes seguidas." - }, - "flatter": { - name: "Flatter", - effect: "Bajulação é usada para confundir o oponente. Entretanto, isso também fortalece o Ataque Especial do alvo." - }, - "willOWisp": { - name: "Will-O-Wisp", - effect: "O usuário atira uma sinistra chama azulada no alvo para causar uma queimadura." - }, - "memento": { - name: "Memento", - effect: "O usuário desmaia quando usa esse movimento. Em troca, prejudica duramente o Ataque e o Ataque Especial do alvo." - }, - "facade": { - name: "Facade", - effect: "Um ataque que dobra de poder caso o usuário esteja envenenado, queimado ou paralisado." - }, - "focusPunch": { - name: "Focus Punch", - effect: "O usuário foca sua mente antes de dar um soco. Esse ataque falhará caso o usuário seja atingido antes de executá-lo." - }, - "smellingSalts": { - name: "Smelling Salts", - effect: "Esse ataque causa o dobro do dano em um alvo paralisado. Entretanto, isso também cura a paralisia do alvo." - }, - "followMe": { - name: "Follow Me", - effect: "O usuário chama a atenção para si mesmo, fazendo todos os alvos mirarem apenas nele." - }, - "naturePower": { - name: "Nature Power", - effect: "Um ataque que faz uso do poder da natureza. Seus efeitos variam dependendo do ambiente ao redor do usuário." - }, - "charge": { - name: "Charge", - effect: "O usuário fortalece o poder do golpe do tipo Elétrico usado no próximo turno. Isso também fortalece a Defesa Especial do usuário." - }, - "taunt": { - name: "Taunt", - effect: "O alvo é provocado e fica em fúria, fazendo-o usar apenas movimentos de ataque por três turnos." - }, - "helpingHand": { - name: "Helping Hand", - effect: "O usuário auxilia um aliado, fortalecendo o poder do ataque desse aliado." - }, - "trick": { - name: "Trick", - effect: "O usuário pega o alvo de surpresa e faz uma troca de itens com o alvo." - }, - "rolePlay": { - name: "Role Play", - effect: "O usuário imita o alvo completamente, copiando a Habilidade natural do alvo." - }, - "wish": { - name: "Wish", - effect: "Um turno após esse movimento ter sido usado, os PS do usuário ou de seu substituinte são restaurados pela metade dos PS máximos do usuário." - }, - "assist": { - name: "Assist", - effect: "O usuário na pressa usa aleatoriamente um dos movimentos conhecidos pelos outros Pokémon na equipe." - }, - "ingrain": { - name: "Ingrain", - effect: "O usuário planta suas raízes para curar seus PS por turno. Devido ao enraizamento, ele não pode sair da batalha." - }, - "superpower": { - name: "Superpower", - effect: "O usuário ataca o alvo com grande poder. Entretanto, isso também prejudica o Ataque e Defesa do usuário." - }, - "magicCoat": { - name: "Magic Coat", - effect: "Uma barreira que reflete de volta ao alvo movimentos como Semente Drenante e movimentos que reduzem atributos." - }, - "recycle": { - name: "Recycle", - effect: "O usuário recicla um item segurado que já foi usado em batalha para que possa ser usado de novo." - }, - "revenge": { - name: "Revenge", - effect: "Um movimento atacante que inflige o dobro do dano se o usuário foi ferido pelo adversário no mesmo turno." - }, - "brickBreak": { - name: "Brick Break", - effect: "O usuário ataca com um corte veloz. Isso também quebra barreiras como Tela de Luz e Refletir." - }, - "yawn": { - name: "Yawn", - effect: "O usuário dá um grande e preguiçoso bocejo que acalma o alvo, fazendo-o cair no sono no próximo turno." - }, - "knockOff": { - name: "Knock Off", - effect: "O usuário dá um tapa no item segurado pelo alvo e esse item não poderá mais ser usado naquela batalha. Caso possua um item, o alvo receberá mais dano." - }, - "endeavor": { - name: "Endeavor", - effect: "Um movimento de ataque que corta os PS do alvo para que se equalize aos PS do usuário." - }, - "eruption": { - name: "Eruption", - effect: "O usuário ataca o Pokémon adversário com uma fúria explosiva. Quanto menor for os PS do usuário, menor será o poder do movimento." - }, - "skillSwap": { - name: "Skill Swap", - effect: "O usuário utiliza seu poder psíquico para trocar de Habilidade com o alvo." - }, - "imprison": { - name: "Imprison", - effect: "Se os Pokémon adversários conhecerem algum movimento também conhecido pelo usuário, eles não poderão usá-lo." - }, - "refresh": { - name: "Refresh", - effect: "O usuário descansa para curar a si mesmo de envenenamentos, queimaduras ou paralisias." - }, - "grudge": { - name: "Grudge", - effect: "Se o usuário desmaiar, o rancor do usuário vai esgotar completamente os PP do movimento que o nocauteou." - }, - "snatch": { - name: "Snatch", - effect: "O usuário rouba o efeito de qualquer tentativa de usar um movimento de cura ou mudança de atributo." - }, - "secretPower": { - name: "Secret Power", - effect: "Os efeitos adicionais deste movimento variam dependendo do ambiente ao redor do usuário." - }, - "dive": { - name: "Dive", - effect: "Mergulhando no primeiro turno, o usuário emerge e ataca no próximo turno." - }, - "armThrust": { - name: "Arm Thrust", - effect: "O usuário solta uma sequência de golpes braçais com as palmas abertas, de duas a cinco vezes seguidas." - }, - "camouflage": { - name: "Camouflage", - effect: "O tipo do usuário é mudado dependendo do ambiente ao seu redor, como na margem da água, rodeado por grama ou dentro de uma caverna." - }, - "tailGlow": { - name: "Tail Glow", - effect: "O usuário direciona seu olhar à luzes piscantes para focar sua mente, aumentando drasticamente o seu Ataque Especial." - }, - "lusterPurge": { - name: "Luster Purge", - effect: "O usuário libera uma explosão de luz letal. Isso pode prejudicar a Defesa Especial do alvo." - }, - "mistBall": { - name: "Mist Ball", - effect: "Um amalgamado de penas nevoentas envolvem e ferem o alvo. Isso pode prejudicar o Ataque Especial do alvo." - }, - "featherDance": { - name: "Feather Dance", - effect: "O usuário cobre o corpo do alvo com uma grande massa de penas que prejudicam duramente o Ataque do alvo." - }, - "teeterDance": { - name: "Teeter Dance", - effect: "O usuário performa uma dança desajeitada que confunde os Pokémon ao seu redor." - }, - "blazeKick": { - name: "Blaze Kick", - effect: "O usuário lança um chute que acerta golpes críticos com mais facilidade. Isso também pode deixar o alvo queimado." - }, - "mudSport": { - name: "Mud Sport", - effect: "O usuário chuta lama ao redor do campo de batalha. Isso enfraquece os golpes do tipo Elétrico por cinco turnos." - }, - "iceBall": { - name: "Ice Ball", - effect: "O usuário ataca continuamente por cinco turnos. O ataque se torna mais forte cada vez que acerta." - }, - "needleArm": { - name: "Needle Arm", - effect: "O usuário ataca selvagemente balançando seus braços pontiagudos. Isso pode fazer o alvo hesitar." - }, - "slackOff": { - name: "Slack Off", - effect: "O usuário relaxa, restaurando os próprios PS pela metade dos seus PS máximos." - }, - "hyperVoice": { - name: "Hyper Voice", - effect: "O usuário libera um horrível grito estridente com o poder de infligir dano." - }, - "poisonFang": { - name: "Poison Fang", - effect: "O usuário morde o alvo com suas presas tóxicas. Isso pode envenenar seriamente o alvo." - }, - "crushClaw": { - name: "Crush Claw", - effect: "O usuário retalha o alvo com garras duras e afiadas. Isso pode prejudicar a Defesa do alvo." - }, - "blastBurn": { - name: "Blast Burn", - effect: "O alvo é arrasado por uma ardente explosão. O usuário não pode se mover no próximo turno." - }, - "hydroCannon": { - name: "Hydro Cannon", - effect: "O alvo é acertado por uma explosão aquática. O usuário não pode se mover no próximo turno." - }, - "meteorMash": { - name: "Meteor Mash", - effect: "O alvo é acertado por um soco forte disparado como um meteoro. Isso pode fortalecer o Ataque do usuário." - }, - "astonish": { - name: "Astonish", - effect: "O usuário ataca o alvo enquanto grita de forma alarmante. Isso pode fazer o alvo hesitar." - }, - "weatherBall": { - name: "Weather Ball", - effect: "Um ataque que varia de poder e tipo dependendo do clima." - }, - "aromatherapy": { - name: "Aromatherapy", - effect: "O usuário lança uma fragrância calmante que cura todos os estados negativos afetando a equipe do usuário." - }, - "fakeTears": { - name: "Fake Tears", - effect: "O usuário finge chorar para perturbar o alvo, duramente prejudicando a sua Defesa Especial." - }, - "airCutter": { - name: "Air Cutter", - effect: "O usuário lança uma rajada de vento afiado para cortar seus oponentes. Golpes críticos ocorrem mais facilmente." - }, - "overheat": { - name: "Overheat", - effect: "O usuário ataca o alvo com seu poder máximo; contudo, o efeito colateral diminui o Ataque Especial do usuário." - }, - "odorSleuth": { - name: "Odor Sleuth", - effect: "Permite que um alvo do tipo Fantasma seja atingido por ataques do tipo Normal e Lutador. Isso também permite que um alvo evasivo seja acertado." - }, - "rockTomb": { - name: "Rock Tomb", - effect: "Rochas são arremessadas no alvo. Isso também diminui a Velocidade do alvo, impedindo que se movimente." - }, - "silverWind": { - name: "Silver Wind", - effect: "O alvo é atacado com escamas pulverulentas sopradas pelo vento. Isso pode aumentar todos os atributos do usuário." - }, - "metalSound": { - name: "Metal Sound", - effect: "Um som horrível que lembra metal sendo raspado, isso prejudica duramente a Defesa Especial do alvo." - }, - "grassWhistle": { - name: "Grass Whistle", - effect: "O usuário toca uma agradável melodia que acalma o alvo, fazendo-o entrar em sono profundo." - }, - "tickle": { - name: "Tickle", - effect: "O usuário faz cócegas no alvo, o fazendo rir, reduzindo seus atributos de Ataque e Defesa." - }, - "cosmicPower": { - name: "Cosmic Power", - effect: "O usuário absorve energia mística do espaço para aumentar sua Defesa e Defesa Especial." - }, - "waterSpout": { - name: "Water Spout", - effect: "O usuário jorra água para ferir os Pokémon oponentes. Quanto menos PS o usuário tiver, menor será o poder do movimento." - }, - "signalBeam": { - name: "Signal Beam", - effect: "O usuário ataca com um raio de luz sinistro. Isso também pode confundir o alvo." - }, - "shadowPunch": { - name: "Shadow Punch", - effect: "O usuário dispara um soco dentre as sombras. Esse ataque nunca erra." - }, - "extrasensory": { - name: "Extrasensory", - effect: "O usuário ataca com um poder estranho e incompreensível. Isso também pode fazer o alvo hesitar." - }, - "skyUppercut": { - name: "Sky Uppercut", - effect: "O usuário ataca o alvo com um gancho de direita poderoso direcionado ao céu." - }, - "sandTomb": { - name: "Sand Tomb", - effect: "O usuário prende o alvo dentro de uma violenta tempestade de areia por quatro ou cinco turnos." - }, - "sheerCold": { - name: "Sheer Cold", - effect: "O alvo desmaia instantaneamente. É mais difícil de acertar se o usuário não for um tipo Gelo." - }, - "muddyWater": { - name: "Muddy Water", - effect: "O usuário ataca atirando água barrenta nos Pokémon adversários. Isso também pode diminuir a Precisão deles." - }, - "bulletSeed": { - name: "Bullet Seed", - effect: "O usuário atira sementes com grande força no alvo de duas a cinco vezes seguidas." - }, - "aerialAce": { - name: "Aerial Ace", - effect: "O usuário confunde o alvo com sua velocidade e então ataca. Esse ataque nunca erra." - }, - "icicleSpear": { - name: "Icicle Spear", - effect: "O usuário arremessa lanças afiadas de gelo no alvo de duas a cinco vezes seguidas." - }, - "ironDefense": { - name: "Iron Defense", - effect: "O usuário endurece a superfície de seu corpo como aço, bruscamente fortalecendo sua Defesa." - }, - "block": { - name: "Block", - effect: "O usuário bloqueia o caminho do alvo com seus braços amplamente abertos para prevenir escapatória." - }, - "howl": { - name: "Howl", - effect: "O usuário uiva alto para fortalecer seu espirito, o que aumenta seu Ataque." - }, - "dragonClaw": { - name: "Dragon Claw", - effect: "O usuário corta o alvo com grandes garras afiadas." - }, - "frenzyPlant": { - name: "Frenzy Plant", - effect: "O usuário esmaga o alvo com uma enorme árvore. O usuário não pode se mover no próximo turno." - }, - "bulkUp": { - name: "Bulk Up", - effect: "O usuário flexiona os seus músculos para fortalecer seu corpo, aumentando os seus atributos de Ataque e Defesa." - }, - "bounce": { - name: "Bounce", - effect: "O usuário pula alto e então cai em cima do alvo no segundo turno. Isso também pode deixar o alvo com paralisia." - }, - "mudShot": { - name: "Mud Shot", - effect: "O usuário ataca arremessando uma bola de lama ao alvo. Isso também diminui a Velocidade do alvo." - }, - "poisonTail": { - name: "Poison Tail", - effect: "O usuário acerta o alvo com sua cauda. Isso também pode envenenar o alvo. Golpes críticos ocorrem mais facilmente." - }, - "covet": { - name: "Covet", - effect: "O usuário, despretensiosamente, se aproxima do alvo e então rouba o item segurado pelo alvo." - }, - "voltTackle": { - name: "Volt Tackle", - effect: "O usuário eletrifica a si próprio e então ataca. Isso também fere muito o usuário. Pode deixar o alvo com paralisia." - }, - "magicalLeaf": { - name: "Magical Leaf", - effect: "O usuário espalha folhas peculiares que perseguem o alvo. Esse ataque nunca erra." - }, - "waterSport": { - name: "Water Sport", - effect: "O usuário encharca o campo de batalha. Isso enfraquece os movimentos do tipo Fogo por cinco turnos." - }, - "calmMind": { - name: "Calm Mind", - effect: "O usuário silenciosamente focaliza sua mente e acalma o seu espírito para aumentar ambos os atributos especiais." - }, - "leafBlade": { - name: "Leaf Blade", - effect: "O usuário empunha uma folha afiada como uma espada e ataca cortando o alvo. Golpes críticos acertam mais facilmente." - }, - "dragonDance": { - name: "Dragon Dance", - effect: "O usuário, energicamente, performa uma dança mística e poderosa para aumentar seu Ataque e Velocidade." - }, - "rockBlast": { - name: "Rock Blast", - effect: "O usuário arremessa rochas duras no alvo. Duas a cinco rochas são lançadas em sequência." - }, - "shockWave": { - name: "Shock Wave", - effect: "O usuário atinge o alvo com um repentino ataque de eletricidade. Esse ataque nunca erra." - }, - "waterPulse": { - name: "Water Pulse", - effect: "O usuário ataca o alvo com uma pulsante explosão de água. Talvez isso confunda o alvo." - }, - "doomDesire": { - name: "Doom Desire", - effect: "Dois turnos após esse movimento ter sido usado, o usuário explode o alvo com um feixe de luz concentrado." - }, - "psychoBoost": { - name: "Psycho Boost", - effect: "O usuário ataca o alvo com poder máximo. O efeito colateral do ataque prejudica duramente o Ataque Especial do usuário." - }, - "roost": { - name: "Roost", - effect: "O usuário pousa e descansa seu corpo. Isso restaura os PS do usuário pela metade do seu máximo de PS." - }, - "gravity": { - name: "Gravity", - effect: "Permite que Pokémon do tipo Voador ou Pokémon com a Habilidade Levitação possam ser atingidos por golpes do tipo Terra. Golpes que envolvam voar ficam inutilizados." - }, - "miracleEye": { - name: "Miracle Eye", - effect: "Permite que um alvo tipo Sombrio seja atingido por ataques do tipo Psíquico. Isso também permite que um alvo evasivo possa ser atingido." - }, - "wakeUpSlap": { - name: "Wake-Up Slap", - effect: "Esse ataque causa muito dano em um alvo que estiver dormindo; entretanto, isso também acorda o alvo." - }, - "hammerArm": { - name: "Hammer Arm", - effect: "O usuário balança seus braços e atinge com seus fortes e pesados punhos. Isso diminui a Velocidade do usuário." - }, - "gyroBall": { - name: "Gyro Ball", - effect: "O alvo é acertado com um giro em alta velocidade. Quanto mais lento for o usuário comparado ao alvo, maior será o poder do movimento." - }, - "healingWish": { - name: "Healing Wish", - effect: "O usuário desmaia. Em troca, o Pokémon que tomará seu lugar terá seus PS restaurados e condições negativas curadas." - }, - "brine": { - name: "Brine", - effect: "Se os PS do alvo estiverem pela metade ou menos, esse ataque terá o dobro do poder." - }, - "naturalGift": { - name: "Natural Gift", - effect: "O usuário canaliza o poder para atacar usando a Fruta que está segurando. A Fruta determina o tipo e o poder do movimento." - }, - "feint": { - name: "Feint", - effect: "Um ataque que acerta um alvo usando Proteção ou Detectar. Isso também extingue os efeitos desses movimentos." - }, - "pluck": { - name: "Pluck", - effect: "O usuário bica o alvo. Caso o alvo esteja segurando uma Fruta, o usuário a come e ganha seu efeito." - }, - "tailwind": { - name: "Tailwind", - effect: "O usuário forma um turbulento redemoinho que aumenta a Velocidade do usuário e de seus seus aliados por quatro turnos." - }, - "acupressure": { - name: "Acupressure", - effect: "O usuário aplica pressão em pontos de estresse, bruscamente fortalecendo um de seus atributos ou de seus aliados." - }, - "metalBurst": { - name: "Metal Burst", - effect: "O usuário revida com muito mais força contra o alvo que lhe infligiu dano por ultimo." - }, - "uTurn": { - name: "U-turn", - effect: "Depois de fazer o seu ataque, o usuário corre de volta para trocar de lugar com um Pokémon da própria equipe." - }, - "closeCombat": { - name: "Close Combat", - effect: "O usuário luta com o alvo de perto sem se defender. Isso diminui a Defesa e Defesa Especial do usuário." - }, - "payback": { - name: "Payback", - effect: "O usuário acumula poder, então ataca. Se o usuário se mover depois do alvo, o poder deste ataque será dobrado." - }, - "assurance": { - name: "Assurance", - effect: "Caso o alvo já tenha recebido dano no mesmo turno, o poder desse ataque é dobrado." - }, - "embargo": { - name: "Embargo", - effect: "Este movimento previne que o alvo use o seu item por cinco turnos. Seu Treinador também estará restrito de usar itens nele." - }, - "fling": { - name: "Fling", - effect: "O usuário arremessa seu item no alvo para atacar. O poder e o efeito deste movimento dependem do item utilizado." - }, - "psychoShift": { - name: "Psycho Shift", - effect: "Usando seu poder psíquico da sugestão, o usuário transfere suas condições de estado para o alvo." - }, - "trumpCard": { - name: "Trump Card", - effect: "Quanto menos PP este movimento tiver, maior será sua força." - }, - "healBlock": { - name: "Heal Block", - effect: "Por cinco turnos, o usuário previne que a equipe adversária use quaisquer movimentos, Habilidades, ou itens segurados para recuperar PS." - }, - "wringOut": { - name: "Wring Out", - effect: "O usuário torce o alvo com força bruta. Quando mais PS o alvo possuir, maior será o poder do movimento." - }, - "powerTrick": { - name: "Power Trick", - effect: "O usuário usufrui de seu poder psíquico para trocar os atributos de seu Ataque com sua Defesa." - }, - "gastroAcid": { - name: "Gastro Acid", - effect: "O usuário arremessa os ácidos de seu estômago no alvo. O fluido elimina o efeito da habilidade do alvo." - }, - "luckyChant": { - name: "Lucky Chant", - effect: "O usuário recita um encantamento em direção ao céu, prevenindo que os Pokémon oponentes acertem golpes críticos." - }, - "meFirst": { - name: "Me First", - effect: "O usuário corta a ação do alvo para roubar seu movimento e usá-lo com maior poder. Esse movimento falha caso não seja usado primeiro." - }, - "copycat": { - name: "Copycat", - effect: "O usuário imita o movimento imediatamente usado antes dele. O movimento falha caso nenhum outro movimento tenha sido usado." - }, - "powerSwap": { - name: "Power Swap", - effect: "O usuário usufrui de seu poder psíquico para trocar mudanças de atributos feitas ao seu Ataque e Ataque Especial com os do alvo." - }, - "guardSwap": { - name: "Guard Swap", - effect: "O usuário usufrui de seu poder psíquico para trocar mudanças de atributos feitas à sua Defesa e Defesa Especial com as do alvo." - }, - "punishment": { - name: "Punishment", - effect: "Quanto mais os atributos do alvo estiverem fortalecidos, maior será o poder desse movimento." - }, - "lastResort": { - name: "Last Resort", - effect: "Este movimento somente pode ser usado depois de o usuário ter usado todos os outros movimentos que ele conhece em batalha." - }, - "worrySeed": { - name: "Worry Seed", - effect: "Uma semente que causa preocupação é plantada no alvo. Isso previne o sono, fazendo a Habilidade do alvo se tornar Insônia." - }, - "suckerPunch": { - name: "Sucker Punch", - effect: "Esse movimento permite que o usuário ataque primeiro. Esse ataque falha caso o alvo não esteja preparando um ataque." - }, - "toxicSpikes": { - name: "Toxic Spikes", - effect: "O usuário planta uma armadilha de espinhos venenosos nos pés da equipe adversária. Os espinhos envenenam os Pokémon que entram em batalha." - }, - "heartSwap": { - name: "Heart Swap", - effect: "O usuário usufrui de seu poder psíquico para trocar mudanças de atributos com o oponente." - }, - "aquaRing": { - name: "Aqua Ring", - effect: "O usuário envolve-se em um véu feito de água. Ele recupera um pouco de PS a cada turno." - }, - "magnetRise": { - name: "Magnet Rise", - effect: "O usuário levita usando magnetismo gerado por eletricidade por cinco turnos." - }, - "flareBlitz": { - name: "Flare Blitz", - effect: "O usuário cobre o próprio corpo com chamas e avança no alvo. Isso também fere muito o usuário e pode deixar o alvo com uma queimadura." - }, - "forcePalm": { - name: "Force Palm", - effect: "O alvo é atacado com uma onda de choque. Isso também pode deixar o alvo com paralisia." - }, - "auraSphere": { - name: "Aura Sphere", - effect: "O usuário libera uma explosão de poder da aura de seu corpo no alvo. Esse ataque nunca erra." - }, - "rockPolish": { - name: "Rock Polish", - effect: "O usuário pule seu corpo para reduzir entraves. Isso pode aumentar bruscamente a Velocidade." - }, - "poisonJab": { - name: "Poison Jab", - effect: "O alvo é perfurado com um tentáculo ou braço banhado com veneno. Isso também pode envenenar o alvo." - }, - "darkPulse": { - name: "Dark Pulse", - effect: "O usuário descarrega uma horrível aura imbuída com pensamentos obscuros. Isso também pode fazer o alvo hesitar." - }, - "nightSlash": { - name: "Night Slash", - effect: "O usuário retalha o alvo no instante que surge uma oportunidade. Golpes críticos ocorrem mais facilmente." - }, - "aquaTail": { - name: "Aqua Tail", - effect: "O usuário ataca balançando sua cauda como se fosse uma violenta e furiosa tempestade." - }, - "seedBomb": { - name: "Seed Bomb", - effect: "O usuário atira uma barragem de sementes de casca dura acertando o alvo por cima." - }, - "airSlash": { - name: "Air Slash", - effect: "O usuário ataca com uma lâmina de ar que corta até mesmo o céu. Isso pode fazer o alvo hesitar." - }, - "xScissor": { - name: "X-Scissor", - effect: "O usuário cutila o alvo cruzando suas foices ou garras como se elas fossem um par de tesouras." - }, - "bugBuzz": { - name: "Bug Buzz", - effect: "O usuário gera uma dolorosa onda de som. Isso também pode diminuir o atributo de Defesa Especial do alvo." - }, - "dragonPulse": { - name: "Dragon Pulse", - effect: "O alvo é atacado com uma onda de choque gerada pela boca aberta do usuário." - }, - "dragonRush": { - name: "Dragon Rush", - effect: "O usuário ataca o alvo enquanto demonstra uma ameaça esmagadora. Isso também pode fazer o alvo hesitar." - }, - "powerGem": { - name: "Power Gem", - effect: "O usuário ataca com um raio de luz que brilha como se fosse feito de pedras preciosas." - }, - "drainPunch": { - name: "Drain Punch", - effect: "Um soco que drena energia. Os PS do usuário são curados pela metade do dano infligido ao alvo." - }, - "vacuumWave": { - name: "Vacuum Wave", - effect: "O usuário rodopia seus punhos para lançar uma onda de vácuo puro no alvo. Esse movimento tem prioridade." - }, - "focusBlast": { - name: "Focus Blast", - effect: "O usuário eleva seu foco mental e libera o seu poder. Isso também pode diminuir a Defesa Especial do alvo." - }, - "energyBall": { - name: "Energy Ball", - effect: "O usuário extrai o poder da natureza e dispara no alvo. Isso também pode diminuir a Defesa Especial do alvo." - }, - "braveBird": { - name: "Brave Bird", - effect: "O usuário dobra suas asas e avança de uma baixa altitude. Isso também fere muito o usuário." - }, - "earthPower": { - name: "Earth Power", - effect: "O usuário faz o solo debaixo do alvo emergir com poder. Isso também pode diminuir a Defesa Especial do alvo." - }, - "switcheroo": { - name: "Switcheroo", - effect: "O usuário troca de itens com o alvo mais rápido do que os olhos podem acompanhar." - }, - "gigaImpact": { - name: "Giga Impact", - effect: "O usuário investe no alvo usando absolutamente todo o seu poder. O usuário não poderá se mover no próximo turno." - }, - "nastyPlot": { - name: "Nasty Plot", - effect: "O usuário estimula seu cérebro com pensamentos malvados. Isso bruscamente aumenta o Ataque Especial do usuário." - }, - "bulletPunch": { - name: "Bullet Punch", - effect: "O usuário atinge o alvo com socos fortes tão rápidos como tiros. Esse movimento tem prioridade." - }, - "avalanche": { - name: "Avalanche", - effect: "Um ataque que inflige o dobro do dano caso o usuário já tenha sido ferido pelo alvo no mesmo turno." - }, - "iceShard": { - name: "Ice Shard", - effect: "O usuário congela rapidamente cristais de gelo e os arremessa no alvo. Esse movimento tem prioridade." - }, - "shadowClaw": { - name: "Shadow Claw", - effect: "O usuário corta com uma garra afiada feita de sombras. Golpes críticos ocorrem mais facilmente." - }, - "thunderFang": { - name: "Thunder Fang", - effect: "O usuário morde com presas eletrificadas. Isso também pode fazer o alvo hesitar ou deixá-lo paralisado." - }, - "iceFang": { - name: "Ice Fang", - effect: "O usuário morde com presas infundidas com gelo. Isso também pode fazer o alvo hesitar ou deixá-lo congelado." - }, - "fireFang": { - name: "Fire Fang", - effect: "O usuário morde com presas cobertas de fogo. Isso também pode fazer o alvo hesitar ou deixá-lo queimado." - }, - "shadowSneak": { - name: "Shadow Sneak", - effect: "O usuário estende a própria sombra e ataca o alvo por trás. Esse movimento tem prioridade." - }, - "mudBomb": { - name: "Mud Bomb", - effect: "O usuário lança uma bola concentrada de lama para atacar. Isso também pode diminuir a Precisão do alvo." - }, - "psychoCut": { - name: "Psycho Cut", - effect: "O usuário corta o alvo com lâminas materializadas com poder psíquico. Golpes críticos ocorrem mais facilmente." - }, - "zenHeadbutt": { - name: "Zen Headbutt", - effect: "O usuário foca sua força de vontade em sua cabeça e ataca o alvo. Isso também pode fazer o alvo hesitar." - }, - "mirrorShot": { - name: "Mirror Shot", - effect: "O usuário libera um clarão de energia vindo de seu corpo polido no alvo. Isso pode diminuir a Precisão do alvo." - }, - "flashCannon": { - name: "Flash Cannon", - effect: "O usuário reúne toda a sua energia de luz e lança de uma só vez. Isso também pode diminuir a Defesa Especial do alvo." - }, - "rockClimb": { - name: "Rock Climb", - effect: "O usuário ataca o alvo o esmagando com uma incrível força bruta. Isso pode confundir o alvo." - }, - "defog": { - name: "Defog", - effect: "Um vento forte que dispersa as barreiras do alvo como Refletir ou Tela de Luz. Isso também diminui a Evasiva do oponente." - }, - "trickRoom": { - name: "Trick Room", - effect: "O usuário cria uma área bizarra onde Pokémon mais lentos se movem primeiro por cinco turnos." - }, - "dracoMeteor": { - name: "Draco Meteor", - effect: "Cometas são invocados do céu e caem sobre o alvo. O efeito colateral do ataque duramente prejudica o atributo de Ataque Especial do usuário." - }, - "discharge": { - name: "Discharge", - effect: "O usuário atinge tudo ao seu redor liberando uma explosão de eletricidade. Isso também pode causar paralisia." - }, - "lavaPlume": { - name: "Lava Plume", - effect: "O usuário queima tudo ao seu redor com um inferno de chamas escarlate. Isso também pode causar uma queimadura em alvos atingidos." - }, - "leafStorm": { - name: "Leaf Storm", - effect: "O usuário cria uma tempestade de folhas ao redor do alvo. Isso diminui duramente o Ataque Especial do usuário." - }, - "powerWhip": { - name: "Power Whip", - effect: "O usuário rodopia suas vinhas ou tentáculos com vigor para chicotear o alvo cruelmente." - }, - "rockWrecker": { - name: "Rock Wrecker", - effect: "O usuário lança uma grande rocha no alvo. O usuário não pode se mover no próximo turno." - }, - "crossPoison": { - name: "Cross Poison", - effect: "Um ataque cortante com uma lâmina envenenada que pode envenenar o alvo. Golpes críticos ocorrem mais facilmente." - }, - "gunkShot": { - name: "Gunk Shot", - effect: "O usuário atira lixo repugnante no alvo. Isso também pode envenenar o alvo." - }, - "ironHead": { - name: "Iron Head", - effect: "O usuário acerta o alvo com sua cabeça dura como aço. Isso também pode fazer o alvo hesitar." - }, - "magnetBomb": { - name: "Magnet Bomb", - effect: "O usuário lança bombas de aço que grudam no alvo. Esse ataque nunca erra." - }, - "stoneEdge": { - name: "Stone Edge", - effect: "O usuário perfura o alvo por baixo com pedras afiadas. Golpes críticos ocorrem mais facilmente." - }, - "captivate": { - name: "Captivate", - effect: "Se algum dos Pokémon oponentes forem do gênero oposto do usuário, ele se encanta, o que diminui duramente o seu Ataque Especial." - }, - "stealthRock": { - name: "Stealth Rock", - effect: "O usuário planta armadilhas de pedras levitantes ao redor da equipe oponente. A armadilha fere os Pokémon oponentes que entrarem em campo." - }, - "grassKnot": { - name: "Grass Knot", - effect: "O usuário planta uma armadilha com grama e o alvo tropeça nela. Quanto mais pesado o alvo for, maior é o poder do movimento." - }, - "chatter": { - name: "Chatter", - effect: "O usuário ataca o alvo com ondas de som vindas de sua tagarelagem ensurdecedora. Isso confunde o alvo." - }, - "judgment": { - name: "Judgment", - effect: "O usuário libera incontáveis tiros de luz no alvo. A tipagem desse movimento varia dependendo do tipo de Placa que o usuário está segurando." - }, - "bugBite": { - name: "Bug Bite", - effect: "O usuário morde o alvo. Caso o alvo esteja segurando uma Fruta, o usuário a come e ganha seu efeito." - }, - "chargeBeam": { - name: "Charge Beam", - effect: "O usuário ataca com uma carga elétrica. O usuário pode usar a eletricidade que sobrar para fortalecer seu Ataque Especial." - }, - "woodHammer": { - name: "Wood Hammer", - effect: "O usuário usa seu corpo rígido para golpear o alvo. Isso também fere muito o usuário." - }, - "aquaJet": { - name: "Aqua Jet", - effect: "O usuário ataca o alvo em uma velocidade que o torna quase invisível. Esse movimento tem prioridade." - }, - "attackOrder": { - name: "Attack Order", - effect: "O usuário ordena que seus subordinados ataquem o alvo. Golpes críticos ocorrem mais facilmente." - }, - "defendOrder": { - name: "Defend Order", - effect: "O usuário ordena que seus subordinados protejam seu corpo, aumentando seus atributos de Defesa e Defesa Especial." - }, - "healOrder": { - name: "Heal Order", - effect: "O usuário ordena que seus subordinados o curem. O usuário restaura até metade de seus PS máximos." - }, - "headSmash": { - name: "Head Smash", - effect: "O usuário usa toda a sua força para acertar uma perigosa cabeçada destrutiva no alvo. Isso também fere terrivelmente o usuário." - }, - "doubleHit": { - name: "Double Hit", - effect: "O usuário golpeia o alvo com uma longa cauda, vinhas, ou um tentáculo. O alvo é acertado duas vezes seguidas." - }, - "roarOfTime": { - name: "Roar of Time", - effect: "O usuário bombardeia o alvo com tamanho poder que distorce até mesmo o tempo; porém, não se moverá no próximo turno." - }, - "spacialRend": { - name: "Spacial Rend", - effect: "O usuário rasga a existência do alvo junto com o espaço ao seu redor. Golpes críticos ocorrem mais facilmente." - }, - "lunarDance": { - name: "Lunar Dance", - effect: "O usuário desmaia. Em troca, o Pokémon que tomará seu lugar terá suas condições negativas e PS restaurados." - }, - "crushGrip": { - name: "Crush Grip", - effect: "O alvo é esmagado com grande força. Quanto mais PS o alvo possuir, maior será o poder desse movimento." - }, - "magmaStorm": { - name: "Magma Storm", - effect: "O alvo é preso dentro de um turbilhão de fogo que arde de quatro a cinco turnos." - }, - "darkVoid": { - name: "Dark Void", - effect: "Pokémon oponentes são sugados para dentro de um mundo de total escuridão que os faz dormir." - }, - "seedFlare": { - name: "Seed Flare", - effect: "O usuário emite uma onda de choque de seu corpo para atacar o alvo. Isso também pode diminuir duramente a Defesa Especial do alvo." - }, - "ominousWind": { - name: "Ominous Wind", - effect: "O usuário ataca o alvo com uma rajada de vento repulsivo. Talvez aumente todos os atributos do usuário de uma vez." - }, - "shadowForce": { - name: "Shadow Force", - effect: "O usuário desaparece, então atinge o alvo no próximo turno. Esse movimento acerta o alvo mesmo que ele proteja a si mesmo." - }, - "honeClaws": { - name: "Hone Claws", - effect: "O usuário afia suas garras para fortalecer seu Ataque e sua Precisão." - }, - "wideGuard": { - name: "Wide Guard", - effect: "O usuário e seus aliados são protegidos de ataques de longo alcance por um turno." - }, - "guardSplit": { - name: "Guard Split", - effect: "O usuário usufrui de seu poder psíquico para equalizar seus atributos de Defesa e Defesa Especial com o alvo." - }, - "powerSplit": { - name: "Power Split", - effect: "O usuário usufrui de seu poder psíquico para igualar seus atributos de Ataque e Ataque Especial com o alvo." - }, - "wonderRoom": { - name: "Wonder Room", - effect: "O usuário cria uma área bizarra onde os atributos de Defesa e Defesa Especial dos Pokémon são trocados por cinco turnos." - }, - "psyshock": { - name: "Psyshock", - effect: "O usuário materializa uma estranha onda psíquica para atacar o alvo. Esse ataque inflige dano físico." - }, - "venoshock": { - name: "Venoshock", - effect: "O usuário encharca o alvo com um líquido venenoso especial. O poder desse movimento dobra se o alvo estiver envenenado." - }, - "autotomize": { - name: "Autotomize", - effect: "O usuário perde parte de seu corpo para se tornar mais leve e bruscamente aumentar seu atributo de Velocidade." - }, - "ragePowder": { - name: "Rage Powder", - effect: "O usuário espalha uma nuvem de pó irritante para chamar a atenção para si mesmo. Oponentes miram apenas no usuário." - }, - "telekinesis": { - name: "Telekinesis", - effect: "O usuário faz o alvo flutuar usando o seu poder psíquico. O alvo fica propício a ser atingido por três turnos." - }, - "magicRoom": { - name: "Magic Room", - effect: "O usuário cria uma área bizarra onde os itens dos Pokémon perdem seus efeitos por cinco turnos." - }, - "smackDown": { - name: "Smack Down", - effect: "O usuário atira uma pedra ou algum projétil similar para atacar o oponente. Um Pokémon voador irá cair no chão quando for acertado." - }, - "stormThrow": { - name: "Storm Throw", - effect: "O usuário atinge o alvo com um golpe poderoso. Esse ataque sempre resulta em um golpe critico." - }, - "flameBurst": { - name: "Flame Burst", - effect: "O usuário ataca o alvo com uma chama explosiva. A explosão da chama também fere os Pokémon próximos ao alvo." - }, - "sludgeWave": { - name: "Sludge Wave", - effect: "O usuário atinge tudo à volta inundando a área com uma grande onda de sedimentos. Isso também pode envenenar os atingidos." - }, - "quiverDance": { - name: "Quiver Dance", - effect: "O usuário delicadamente executa uma linda dança mística. Isso fortalece os atributos de Ataque Especial, Defesa Especial e Velocidade do usuário." - }, - "heavySlam": { - name: "Heavy Slam", - effect: "O usuário golpeia o alvo com seu corpo pesado. Quanto mais pesado o usuário for comparado ao alvo, maior será o poder do movimento." - }, - "synchronoise": { - name: "Synchronoise", - effect: "Usando uma estranha onda de choque, o usuário inflige dano em qualquer Pokémon do mesmo tipo na área ao seu redor." - }, - "electroBall": { - name: "Electro Ball", - effect: "O usuário arremessa uma esfera elétrica no alvo. Quanto mais rápido for o usuário comparado ao alvo, maior será o poder do movimento." - }, - "soak": { - name: "Soak", - effect: "O usuário atira uma corrente de água no alvo e muda a tipagem do alvo para Água." - }, - "flameCharge": { - name: "Flame Charge", - effect: "Ocultando-se nas chamas, o usuário ataca. Então, concentrando mais poder, o usuário aumenta sua Velocidade." - }, - "coil": { - name: "Coil", - effect: "O usuário enrola seu corpo e se concentra. Isso aumenta seus atributos de Ataque, Defesa e Precisão." - }, - "lowSweep": { - name: "Low Sweep", - effect: "O usuário faz um ataque repentino nas pernas do alvo, diminuindo a Velocidade dele." - }, - "acidSpray": { - name: "Acid Spray", - effect: "O usuário cospe um fluido corrosivo no alvo. Isso duramente diminui a Defesa Especial do alvo." - }, - "foulPlay": { - name: "Foul Play", - effect: "O usuário vira o poder do alvo contra ele. Quanto maior for o atributo de Ataque do alvo, maior será o poder do movimento." - }, - "simpleBeam": { - name: "Simple Beam", - effect: "Essa misteriosa onda psíquica produzida pelo usuário muda a Habilidade do alvo para “Simples”." - }, - "entrainment": { - name: "Entrainment", - effect: "O usuário dança em um ritmo estranho que contagia o alvo que o imita, fazendo a Habilidade do alvo tornar-se a mesma que a do usuário." - }, - "afterYou": { - name: "After You", - effect: "O usuário auxilia o alvo e o faz usar seu movimento exatamente após o usuário." - }, - "round": { - name: "Round", - effect: "O usuário ataca o alvo com uma música. Outros podem entrar na Ronda e fazer o ataque dar um dano ainda maior." - }, - "echoedVoice": { - name: "Echoed Voice", - effect: "O usuário ataca o alvo com uma voz ecoante. Se esse movimento for usado um turno após o outro, ele infligirá dano maior." - }, - "chipAway": { - name: "Chip Away", - effect: "Procurando por uma brecha, o usuário ataca consistentemente. As mudanças de atributos do alvo não afetam o dano desse movimento." - }, - "clearSmog": { - name: "Clear Smog", - effect: "O usuário ataca arremessando um amontoado de lama especial. Todas as mudanças de atributos voltam ao normal." - }, - "storedPower": { - name: "Stored Power", - effect: "O usuário ataca o alvo com seu poder armazenado. Quanto mais os atributos do usuário estiverem fortalecidos, maior será o poder do movimento." - }, - "quickGuard": { - name: "Quick Guard", - effect: "O usuário protege a si mesmo e seus aliados de golpes de prioridade." - }, - "allySwitch": { - name: "Ally Switch", - effect: "O usuário teletransporta usando um estranho poder e troca de lugar com um de seus aliados." - }, - "scald": { - name: "Scald", - effect: "O usuário atira água fervente no seu alvo. Isso também pode deixar o alvo com queimadura." - }, - "shellSmash": { - name: "Shell Smash", - effect: "O usuário quebra a própria concha, diminuindo sua Defesa e Defesa Especial, mas bruscamente aumentando Ataque, Ataque Especial e Velocidade." - }, - "healPulse": { - name: "Heal Pulse", - effect: "O usuário emite um pulso curativo que restaura os PS do alvo pela metade de seus PS máximos." - }, - "hex": { - name: "Hex", - effect: "Esse ataque cruel inflige dano massivo a um alvo afetado por condições negativas." - }, - "skyDrop": { - name: "Sky Drop", - effect: "O usuário leva o alvo para o céu, então o solta durante o próximo turno. O alvo não pode atacar enquanto estiver no céu." - }, - "shiftGear": { - name: "Shift Gear", - effect: "O usuário roda suas engrenagens, aumentando seu Ataque e bruscamente aumentando sua Velocidade." - }, - "circleThrow": { - name: "Circle Throw", - effect: "O alvo é arremessado, e um Pokémon diferente é trazido para a batalha. Na natureza, isso termina uma batalha contra um único Pokémon." - }, - "incinerate": { - name: "Incinerate", - effect: "O usuário ataca o Pokémon oponente com fogo. Se um Pokémon estiver segurando um certo item, como uma Fruta, o item será queimado e inutilizado." - }, - "quash": { - name: "Quash", - effect: "O usuário reprime o alvo e o faz se mover por último." - }, - "acrobatics": { - name: "Acrobatics", - effect: "O usuário atinge o alvo rapidamente. Se o usuário não estiver segurando um item, esse ataque causa um dano massivo." - }, - "reflectType": { - name: "Reflect Type", - effect: "O usuário reflete o tipo do alvo, fazendo-o ter o mesmo tipo do alvo." - }, - "retaliate": { - name: "Retaliate", - effect: "O usuário se vinga por um aliado desmaiado. Se um aliado desmaiou no turno anterior, esse movimento ficará mais poderoso." - }, - "finalGambit": { - name: "Final Gambit", - effect: "O usuário arrisca tudo para atacar seu alvo. O usuário desmaia porém inflige dano igual aos seus PS perdidos." - }, - "bestow": { - name: "Bestow", - effect: "O usuário passa seu item ao alvo se o alvo não estiver segurando um item." - }, - "inferno": { - name: "Inferno", - effect: "O usuário ataca engolindo o alvo em intensas chamas. intense fire. Isso deixa o alvo com uma queimadura." - }, - "waterPledge": { - name: "Water Pledge", - effect: "Um pilar de água atinge o alvo. Quando combinado com seu equivalente do tipo fogo, seu dano aumenta e um arco-íris é formado." - }, - "firePledge": { - name: "Fire Pledge", - effect: "Um pilar de fogo atinge o alvo. Quando combinado com seu equivalente do tipo Planta, seu dano aumenta e um vasto mar de fogo aparece." - }, - "grassPledge": { - name: "Grass Pledge", - effect: "Um pilar de grama acerta o alvo. Quando combinado com seu equivalente do tipo Água, seu dano aumenta e um vasto pântano surge." - }, - "voltSwitch": { - name: "Volt Switch", - effect: "Depois de fazer o seu ataque, o usuário corre de volta para trocar de lugar com um Pokémon da própria equipe." - }, - "struggleBug": { - name: "Struggle Bug", - effect: "Enquanto resiste, o usuário ataca o Pokémon oponente. Isso diminui o Ataque Especial daqueles atingidos." - }, - "bulldoze": { - name: "Bulldoze", - effect: "O usuário atinge a todos ao seu redor pisoteando o chão. Isso diminui a Velocidade daqueles atingidos." - }, - "frostBreath": { - name: "Frost Breath", - effect: "O usuário sopra sua respiração gelada no alvo. Esse ataque sempre resulta em um acerto crítico." - }, - "dragonTail": { - name: "Dragon Tail", - effect: "O alvo é arremessado e um Pokémon diferente é trazido para o combate. Em batalhas selvagens, isso encerra a batalha contra um único Pokémon." - }, - "workUp": { - name: "Work Up", - effect: "O usuário se agita e seus atributos de Ataque e Ataque Especial são fortalecidos." - }, - "electroweb": { - name: "Electroweb", - effect: "O usuário ataca e captura os Pokémon adversários usando uma rede elétrica. Isso diminui a Velocidade deles." - }, - "wildCharge": { - name: "Wild Charge", - effect: "O usuário se cobre de eletricidade e colide com o seu alvo. Isso também fere um pouco o usuário." - }, - "drillRun": { - name: "Drill Run", - effect: "O usuário colide com seu alvo enquanto rotaciona seu corpo como uma broca. Golpes críticos acertam mais facilmente." - }, - "dualChop": { - name: "Dual Chop", - effect: "O usuário ataca o seu alvo o acertando com golpes brutais. O alvo é atingido duas vezes seguidas." - }, - "heartStamp": { - name: "Heart Stamp", - effect: "O usuário libera sua fúria em um golpe violento após enganar o alvo com sua atuação fofa. Isso também pode fazer o alvo hesitar." - }, - "hornLeech": { - name: "Horn Leech", - effect: "O usuário drena a energia do alvo com seus chifres. Os PS do usuário são restaurados pela metade do dano recebido pelo alvo." - }, - "sacredSword": { - name: "Sacred Sword", - effect: "O usuário ataca cortando com um longo chifre. As mudanças de atributos do alvo não afetam o dano desse ataque." - }, - "razorShell": { - name: "Razor Shell", - effect: "O usuário corta seu alvo com conchas afiadas. Isso pode também diminuir o atributo de Defesa do alvo." - }, - "heatCrash": { - name: "Heat Crash", - effect: "O usuário golpeia seu alvo com seu corpo envolto em chamas. Quanto mais pesado o usuário for comparado ao alvo, maior será o poder do movimento." - }, - "leafTornado": { - name: "Leaf Tornado", - effect: "O usuário ataca seu alvo cercando-o com folhas afiadas. Isso também pode diminuir a precisão do alvo." - }, - "steamroller": { - name: "Steamroller", - effect: "O usuário esmaga seu alvo rolando sobre ele com seu corpo enrolado como uma bola. Isso também pode fazer o alvo hesitar." - }, - "cottonGuard": { - name: "Cotton Guard", - effect: "O usuário protege a si mesmo envolvendo seu corpo em algodão macio, o que drasticamente aumenta o atributo de Defesa do usuário." - }, - "nightDaze": { - name: "Night Daze", - effect: "O usuário libera uma onda de choque escura como a noite no alvo. Isso também pode reduzir a Precisão do alvo." - }, - "psystrike": { - name: "Psystrike", - effect: "O usuário materializa uma estranha onda psíquica para atacar o alvo. Esse ataque inflige dano físico." - }, - "tailSlap": { - name: "Tail Slap", - effect: "O usuário ataca golpeando o alvo com sua cauda resistente. Isso acerta o alvo duas a cinco vezes seguidas." - }, - "hurricane": { - name: "Hurricane", - effect: "O usuário ataca prendendo seu oponente num violento turbilhão que voa alto no céu. Isso também pode confundir o alvo." - }, - "headCharge": { - name: "Head Charge", - effect: "O usuário ataca colidindo sua cabeça no alvo, usando sua pelagem protetora. Isso também fere um pouco o usuário." - }, - "gearGrind": { - name: "Gear Grind", - effect: "O usuário ataca arremessando engrenagens de aço no seu alvo duas vezes em sequência." - }, - "searingShot": { - name: "Searing Shot", - effect: "O usuário queima tudo ao seu redor com um inferno de chamas escarlate. Isso também pode causar uma queimadura em alvos atingidos." - }, - "technoBlast": { - name: "Techno Blast", - effect: "O usuário atira um raio de luz em seu alvo. O tipo do movimento muda dependendo do Disco que o usuário estiver segurando." - }, - "relicSong": { - name: "Relic Song", - effect: "O usuário canta uma antiga canção e ataca encantando o coração dos Pokémon adversários. Isso também pode induzir sono." - }, - "secretSword": { - name: "Secret Sword", - effect: "O usuário ataca cortando com seu longo chifre. O estranho poder contido no chifre inflige dano físico no alvo." - }, - "glaciate": { - name: "Glaciate", - effect: "O usuário ataca soprando ar congelante nos Pokémon oponentes. Isso diminui a Velocidade deles." - }, - "boltStrike": { - name: "Bolt Strike", - effect: "O usuário cobre a si mesmo com uma grande quantidade de eletricidade e avança no alvo. Isso também pode paralisar o alvo." - }, - "blueFlare": { - name: "Blue Flare", - effect: "O usuário ataca engolindo o alvo numa intensa, porém linda, chama azul. Isso também pode deixar o alvo com uma queimadura." - }, - "fieryDance": { - name: "Fiery Dance", - effect: "Coberto por chamas, o usuário dança e bate suas asas. Isso também pode aumentar o Ataque Especial do usuário." - }, - "freezeShock": { - name: "Freeze Shock", - effect: "No segundo turno, o usuário acerta o alvo com gelo eletricamente carregado. Isso também pode deixar o alvo paralisado." - }, - "iceBurn": { - name: "Ice Burn", - effect: "No segundo turno, um impiedoso vento gélido cerca o alvo. Isso pode deixar o alvo com uma queimadura." - }, - "snarl": { - name: "Snarl", - effect: "O usuário grita como se ele estivesse reclamando de algo, diminuindo o Ataque Especial do Pokémon oponente." - }, - "icicleCrash": { - name: "Icicle Crash", - effect: "O usuário ataca arremessando estacas de gelo no alvo violentamente. Isso também pode fazer o alvo hesitar." - }, - "vCreate": { - name: "V-create", - effect: "Com uma ardente chama em sua testa, o usuário joga seu corpo em direção ao alvo. Isso diminui a Defesa, Defesa Especial, e Velocidade do usuário." - }, - "fusionFlare": { - name: "Fusion Flare", - effect: "O usuário invoca uma chama gigante. Esse movimento é mais poderoso quando influenciado por um enorme raio." - }, - "fusionBolt": { - name: "Fusion Bolt", - effect: "O usuário conduz um raio gigantesco. Esse movimento é mais poderoso quando influenciado por uma enorme chama." - }, - "flyingPress": { - name: "Flying Press", - effect: "O usuário mergulha do céu em direção ao alvo. Esse movimento é simultaneamente do tipo Lutador e Voador." - }, - "matBlock": { - name: "Mat Block", - effect: "Usando uma esteira elevada como escudo, o usuário protege a si mesmo e a seus aliados de golpes que causam dano. Isso não previne condições negativas." - }, - "belch": { - name: "Belch", - effect: "O usuário expurga um arroto danificante no alvo. O usuário deve comer uma Fruta para usar esse movimento." - }, - "rototiller": { - name: "Rototiller", - effect: "O usuário ara o solo, facilitando o crescimento de plantas. Isso aumenta os atributos de Ataque e Ataque Especial dos Pokémon do tipo Planta." - }, - "stickyWeb": { - name: "Sticky Web", - effect: "O usuário tece uma teia viscosa ao redor da equipe adversária, o que diminui a Velocidade dos adversários após entrarem em campo." - }, - "fellStinger": { - name: "Fell Stinger", - effect: "Quando o usuário nocauteia um alvo com este movimento, o atributo de Ataque do usuário aumenta bruscamente." - }, - "phantomForce": { - name: "Phantom Force", - effect: "O usuário desaparece para algum lugar e então ataca o alvo no próximo turno. Esse movimento acerta mesmo se o alvo estiver se protegendo." - }, - "trickOrTreat": { - name: "Trick-or-Treat", - effect: "O usuário enche o alvo com o espírito do Halloween para celebrarem juntos. Isso adiciona o tipo Fantasma à tipagem do alvo." - }, - "nobleRoar": { - name: "Noble Roar", - effect: "Soltando um nobre rugido, o usuário intimida o alvo e diminui seus atributos de Ataque e Ataque Especial." - }, - "ionDeluge": { - name: "Ion Deluge", - effect: "O usuário dispersa partículas eletricamente carregadas, o que muda movimentos do tipo Normal para o tipo Elétrico." - }, - "parabolicCharge": { - name: "Parabolic Charge", - effect: "O usuário ataca tudo ao seu redor. Os PS do usuário são restaurados pela metade do dano recebido por aqueles que foram atingidos." - }, - "forest’SCurse": { - name: "Forest’s Curse", - effect: "O usuário conjura uma maldição da floresta no alvo. Isso adiciona o tipo Planta à tipagem do alvo." - }, - "petalBlizzard": { - name: "Petal Blizzard", - effect: "O usuário rotaciona uma violenta nevasca composta por pétalas e ataca tudo ao seu redor." - }, - "freezeDry": { - name: "Freeze-Dry", - effect: "O usuário rapidamente diminui a temperatura do alvo. Isso pode deixar o alvo congelado. Esse movimento é supereficaz contra tipos Água." - }, - "disarmingVoice": { - name: "Disarming Voice", - effect: "Liberando um grito encantador, o usuário inflige dano emocional nos Pokémon oponentes. Esse ataque nunca erra." - }, - "partingShot": { - name: "Parting Shot", - effect: "O usuário diminui os atributos de Ataque e Ataque Esp. do alvo com uma ameaça antes de ser trocado por outro Pokémon na equipe." - }, - "topsyTurvy": { - name: "Topsy-Turvy", - effect: "Todas as mudanças de atributos afetando o alvo viram de cabeça para baixo e se tornam o oposto do que eram." - }, - "drainingKiss": { - name: "Draining Kiss", - effect: "O usuário rouba a energia do alvo com um beijo. Os PS do usuário são restaurados além da metade do dano recebido pelo alvo." - }, - "craftyShield": { - name: "Crafty Shield", - effect: "O usuário protege a si mesmo e seus aliados de condições negativas com um misterioso poder. Isso não previne golpes que inflijam dano." - }, - "flowerShield": { - name: "Flower Shield", - effect: "Usando um misterioso poder, o usuário aumenta o atributo de Defesa de todos os Pokémon tipo Planta em batalha." - }, - "grassyTerrain": { - name: "Grassy Terrain", - effect: "O usuário transforma o campo de batalha em grama por cinco turnos. Isso restaura os PS dos Pokémon no solo um pouco a cada turno e fortalece golpes do tipo Grama." - }, - "mistyTerrain": { - name: "Misty Terrain", - effect: "Isto protege os Pokémon no solo de condições de estado e corta pela metade o dano dos movimentos do tipo Dragão por cinco turnos." - }, - "electrify": { - name: "Electrify", - effect: "Caso o alvo tenha sido energizado antes de usar um movimento durante aquele turno, o movimento do alvo se tornará do tipo Elétrico." - }, - "playRough": { - name: "Play Rough", - effect: "O usuário joga duro com o alvo e o ataca. Isso também pode diminuir o atributo de Ataque do alvo." - }, - "fairyWind": { - name: "Fairy Wind", - effect: "O usuário rotaciona um vento de fada e ataca o alvo com ele." - }, - "moonblast": { - name: "Moonblast", - effect: "Canalizando o poder da lua, o usuário ataca o alvo. Isso também pode diminuir o atributo de Ataque Especial do alvo." - }, - "boomburst": { - name: "Boomburst", - effect: "O usuário ataca tudo ao seu redor com o poder destrutivo de um terrível som explosivo." - }, - "fairyLock": { - name: "Fairy Lock", - effect: "Bloqueando o campo de batalha, o usuário previne que todos os Pokémon fujam durante o próximo turno." - }, - "king’SShield": { - name: "King’s Shield", - effect: "O usuário assume uma posição defensiva enquanto protege a si mesmo de dano. Isto duramente diminui o Ataque de qualquer um que faça contato direto." - }, - "playNice": { - name: "Play Nice", - effect: "O usuário e o alvo se tornam amigos, fazendo com que o alvo perca sua vontade de lutar. Isso diminui o atributo de Ataque do alvo." - }, - "confide": { - name: "Confide", - effect: "O usuário conta um segredo para o alvo e o alvo perde sua habilidade de se concentrar. Isso diminui o Ataque Especial do alvo." - }, - "diamondStorm": { - name: "Diamond Storm", - effect: "O usuário provoca uma tempestade de diamantes para ferir os Pokémon oponentes. Isso também pode aumentar o atributo de Defesa do usuário." - }, - "steamEruption": { - name: "Steam Eruption", - effect: "O usuário imerge o alvo em vapor superaquecido. Isso também pode deixar o alvo com uma queimadura." - }, - "hyperspaceHole": { - name: "Hyperspace Hole", - effect: "Usando uma fenda espacial, o usuário aparece ao lado do alvo e ataca. Isso também acerta um alvo usando movimentos como Proteger ou Detectar." - }, - "waterShuriken": { - name: "Water Shuriken", - effect: "O usuário acerta o alvo jogando estrelas ninja de duas a cinco vezes seguidas. Esse movimento tem prioridade." - }, - "mysticalFire": { - name: "Mystical Fire", - effect: "O usuário ataca soprando um fogo ardente especial. Isso também diminui o Ataque Especial do alvo." - }, - "spikyShield": { - name: "Spiky Shield", - effect: "Além de proteger o alvo de ataques, este movimento também fere qualquer atacante que fizer contato direto." - }, - "aromaticMist": { - name: "Aromatic Mist", - effect: "Usando um misterioso aroma, o usuário aumenta o atributo de Defesa Especial de um Pokémon aliado." - }, - "eerieImpulse": { - name: "Eerie Impulse", - effect: "O corpo do usuário gera um impulso misterioso. O alvo exposto ao impulso tem seu Ataque Especial duramente diminuído." - }, - "venomDrench": { - name: "Venom Drench", - effect: "Pokémon oponentes são encharcados por um estranho líquido venenoso. Isso diminui o Ataque, Ataque Esp. e Velocidade de um alvo envenenado." - }, - "powder": { - name: "Powder", - effect: "O usuário cobre o alvo em pólvora. Se o alvo usar um movimento do tipo Fogo, a pólvora entra em combustão e causa dano ao alvo." - }, - "geomancy": { - name: "Geomancy", - effect: "O usuário absorve energia e bruscamente aumenta seus atributos de Ataque Especial, Defesa Especial e Velocidade no próximo turno." - }, - "magneticFlux": { - name: "Magnetic Flux", - effect: "O usuário manipula campos magnéticos, o que aumenta os atributos de Defesa e Defesa Especial de Pokémon aliados com as Habilidades “Mais” ou “Menos”." - }, - "happyHour": { - name: "Happy Hour", - effect: "Usar Happy Hour dobra a quantidade de prêmio em dinheiro recebido após a batalha." - }, - "electricTerrain": { - name: "Electric Terrain", - effect: "O usuário eletrifica o campo de batalha por cinco turnos, fortalecendo movimentos do tipo Elétrico. Pokémon no solo não podem mais cair no sono." - }, - "dazzlingGleam": { - name: "Dazzling Gleam", - effect: "O usuário causa dano ao Pokémon oponente emitindo um clarão poderoso." - }, - "celebrate": { - name: "Celebrate", - effect: "O Pokémon te dá parabéns pelo seu dia especial!" - }, - "holdHands": { - name: "Hold Hands", - effect: "O usuário e um aliado dão as mãos. Isso os deixam muito contentes." - }, - "babyDollEyes": { - name: "Baby-Doll Eyes", - effect: "O usuário encara o alvo com seus olhos adoráveis, o que diminui seu atributo de Ataque. Esse movimento tem prioridade." - }, - "nuzzle": { - name: "Nuzzle", - effect: "O usuário ataca esfregando suas bochechas eletrizadas contra o alvo. Isso também deixa o alvo paralisado." - }, - "holdBack": { - name: "Hold Back", - effect: "O usuário pega leve quando ataca e o alvo é deixado com pelo menos 1 PS." - }, - "infestation": { - name: "Infestation", - effect: "O alvo é infestado e atacado de quatro a cinco turnos. O alvo não pode fugir durante esse período." - }, - "powerUpPunch": { - name: "Power-Up Punch", - effect: "Golpear oponentes repetidamente faz os punhos do usuário enrijecerem. Acertar um alvo aumenta o Ataque." - }, - "oblivionWing": { - name: "Oblivion Wing", - effect: "O usuário absorve os PS de seu alvo. Os PS do usuário são restaurados além da metade do dano recebido pelo usuário." - }, - "thousandArrows": { - name: "Thousand Arrows", - effect: "Este movimento também acerta Pokémon adversários que estão no ar. Esses Pokémon são derrubados e caem no chão." - }, - "thousandWaves": { - name: "Thousand Waves", - effect: "O usuário ataca com tremores que se dispersam pelo chão. Alvos atingidos não podem fugir da batalha." - }, - "land’SWrath": { - name: "Land’s Wrath", - effect: "O usuário reúne a energia da terra e foca esse poder nos Pokémon oponentes para causar dano." - }, - "lightOfRuin": { - name: "Light of Ruin", - effect: "Usufruindo do poder da flor eterna, o usuário atira um poderoso raio de luz. Isso também fere muito o usuário." - }, - "originPulse": { - name: "Origin Pulse", - effect: "O usuário ataca o Pokémon adversário com inúmeros raios de luz resplandescente que brilham em uma cor de profundo azul." - }, - "precipiceBlades": { - name: "Precipice Blades", - effect: "O usuário ataca o Pokémon adversário manifestando o poder terrestre em espadas de pedra assustadoras." - }, - "dragonAscent": { - name: "Dragon Ascent", - effect: "Depois de alcançar grandes alturas, o usuário ataca o alvo mergulhando do céu em alta velocidade, porém isso diminui sua própria Defesa e Defesa Especial." - }, - "hyperspaceFury": { - name: "Hyperspace Fury", - effect: "Usando seus diversos braços, o usuário libera golpes furiosos que ignoram efeitos de movimentos como Proteção e Detectar. Diminui a Defesa do usuário." - }, - "breakneckBlitzPhysical": { - name: "Breakneck Blitz", - effect: "Utilizando o Poder Z, o usuário intensifica seu ímpeto e atinge o alvo em alta velocidade. Seu poder varia dependendo do movimento original." - }, - "breakneckBlitzSpecial": { - name: "Breakneck Blitz", - effect: "Dummy Data" - }, - "allOutPummelingPhysical": { - name: "All-Out Pummeling", - effect: "Utilizando o Poder Z, o usuário cria e arremessa uma esfera de energia no alvo com força total. Seu poder varia dependendo do movimento original." - }, - "allOutPummelingSpecial": { - name: "All-Out Pummeling", - effect: "Dummy Data" - }, - "supersonicSkystrikePhysical": { - name: "Supersonic Skystrike", - effect: "Utilizando o Poder Z, o usuário ascende e mergulha em direção ao alvo em alta velocidade. Seu poder varia dependendo do movimento original." - }, - "supersonicSkystrikeSpecial": { - name: "Supersonic Skystrike", - effect: "Dummy Data" - }, - "acidDownpourPhysical": { - name: "Acid Downpour", - effect: "Utilizando o Poder Z, o usuário cria um pântano venenoso e afoga o alvo com toda sua força. Seu poder varia dependendo do movimento original." - }, - "acidDownpourSpecial": { - name: "Acid Downpour", - effect: "Dummy Data" - }, - "tectonicRagePhysical": { - name: "Tectonic Rage", - effect: "Utilizando o Poder Z, o usuário abre uma cratera e mergulha nela com o alvo com força total. Seu poder varia dependendo do movimento original." - }, - "tectonicRageSpecial": { - name: "Tectonic Rage", - effect: "Dummy Data" - }, - "continentalCrushPhysical": { - name: "Continental Crush", - effect: "Utilizando o Poder Z, o usuário cria um meteoro que cai do céu em direção ao alvo com força total. Seu poder varia dependendo do movimento original." - }, - "continentalCrushSpecial": { - name: "Continental Crush", - effect: "Dummy Data" - }, - "savageSpinOutPhysical": { - name: "Savage Spin-Out", - effect: "Utilizando o Poder Z, o usuário restringe o alvo em um casulo de seda e ataca ele com força total. Seu poder varia dependendo do movimento original." - }, - "savageSpinOutSpecial": { - name: "Savage Spin-Out", - effect: "Dummy Data" - }, - "neverEndingNightmarePhysical": { - name: "Never-Ending Nightmare", - effect: "Utilizando o Poder Z, o usuário invoca espectros rancorosos que sufocam o alvo. Seu poder varia dependendo do movimento original." - }, - "neverEndingNightmareSpecial": { - name: "Never-Ending Nightmare", - effect: "Dummy Data" - }, - "corkscrewCrashPhysical": { - name: "Corkscrew Crash", - effect: "Utilizando o Poder Z, o usuário gira rapidamente e ataca o alvo com força total. Seu poder varia dependendo do movimento original." - }, - "corkscrewCrashSpecial": { - name: "Corkscrew Crash", - effect: "Dummy Data" - }, - "infernoOverdrivePhysical": { - name: "Inferno Overdrive", - effect: "Utilizando o Poder Z, o usuário cospe uma enorme labareda ardente contra o alvo com força total. Seu poder varia dependendo do movimento original." - }, - "infernoOverdriveSpecial": { - name: "Inferno Overdrive", - effect: "Dummy Data" - }, - "hydroVortexPhysical": { - name: "Hydro Vortex", - effect: "Utilizando o Poder Z, o usuário cria um intenso turbilhão que engole o alvo com força total. Seu poder varia dependendo do movimento original." - }, - "hydroVortexSpecial": { - name: "Hydro Vortex", - effect: "Dummy Data" - }, - "bloomDoomPhysical": { - name: "Bloom Doom", - effect: "Utilizando o Poder Z, o usuário absorve a energia vital do ambiente e ataca o alvo com força total. Seu poder varia dependendo do movimento original." - }, - "bloomDoomSpecial": { - name: "Bloom Doom", - effect: "Dummy Data" - }, - "gigavoltHavocPhysical": { - name: "Gigavolt Havoc", - effect: "Utilizando o Poder Z, o usuário concentra uma corrente elétrica carregada e atinge o alvo. Seu poder varia dependendo do movimento original." - }, - "gigavoltHavocSpecial": { - name: "Gigavolt Havoc", - effect: "Dummy Data" - }, - "shatteredPsychePhysical": { - name: "Shattered Psyche", - effect: "Utilizando o Poder Z, o usuário manipula a cabeça do alvo e destrói-o mentalmente. Seu poder varia dependendo do movimento original." - }, - "shatteredPsycheSpecial": { - name: "Shattered Psyche", - effect: "Dummy Data" - }, - "subzeroSlammerPhysical": { - name: "Subzero Slammer", - effect: "Utilizando o Poder Z, o usuário lança um raio de gelo que reduz a temperatura do alvo a zero. Seu poder varia dependendo do movimento original." - }, - "subzeroSlammerSpecial": { - name: "Subzero Slammer", - effect: "Dummy Data" - }, - "devastatingDrakePhysical": { - name: "Devastating Drake", - effect: "Utilizando o Poder Z, o usuário materializa sua aura, que ataca o alvo com força total. Seu poder varia dependendo do movimento original." - }, - "devastatingDrakeSpecial": { - name: "Devastating Drake", - effect: "Dummy Data" - }, - "blackHoleEclipsePhysical": { - name: "Black Hole Eclipse", - effect: "Utilizando o Poder Z, o usuário cria um buraco negro que engole o alvo. Seu poder varia dependendo do movimento original." - }, - "blackHoleEclipseSpecial": { - name: "Black Hole Eclipse", - effect: "Dummy Data" - }, - "twinkleTacklePhysical": { - name: "Twinkle Tackle", - effect: "Utilizando o Poder Z, o usuário cria uma dimensão graciosa que deixa o alvo a sua mercê. Seu poder varia dependendo do movimento original." - }, - "twinkleTackleSpecial": { - name: "Twinkle Tackle", - effect: "Dummy Data" - }, - "catastropika": { - name: "Catastropika", - effect: "Utilizando seu Poder Z, Pikachu acumula o máximo de eletricidade que seu corpo suporta e pula no alvo com força total." - }, - "shoreUp": { - name: "Shore Up", - effect: "Recupera metade dos PS do usuário. Durante uma Tempestade de Areia, recupera um pouco mais." - }, - "firstImpression": { - name: "First Impression", - effect: "Embora esse movimento seja poderoso, ele funciona apenas na primeira rodada em que o usuário está em batalha." - }, - "banefulBunker": { - name: "Baneful Bunker", - effect: "Além de proteger o usuário de ataques, este movimento também envenena qualquer um que fizer contato direto." - }, - "spiritShackle": { - name: "Spirit Shackle", - effect: "O usuário ataca enquanto fisga simultaneamente a sombra do alvo e impede ele de escapar." - }, - "darkestLariat": { - name: "Darkest Lariat", - effect: "O usuário balança os dois braços e acerta o alvo. As mudanças de atributos do alvo não afetam o dano deste ataque." - }, - "sparklingAria": { - name: "Sparkling Aria", - effect: "Libera borbulhas ao cantar. Se um Pokémon estiver queimado, ele será curado pelo toque das bolhas." - }, - "iceHammer": { - name: "Ice Hammer", - effect: "O usuário gira seu corpo e bate com seus fortes e pesados punhos. Isso diminui a Velocidade do usuário." - }, - "floralHealing": { - name: "Floral Healing", - effect: "O usuário restaura os PS do alvo até metade a dos seus PS máximo. Ele restaura mais HP quando o terreno é de grama." - }, - "highHorsepower": { - name: "High Horsepower", - effect: "O usuário ataca ferozmente o alvo usando todo o seu corpo." - }, - "strengthSap": { - name: "Strength Sap", - effect: "O usuário restaura seus PS em uma quantidade igual ao atributo de Ataque do alvo. Também diminui o atributo de Ataque do alvo." - }, - "solarBlade": { - name: "Solar Blade", - effect: "O usuário absorve luz e concentra-a em forma de lâmina com a energia absorvida no primeiro turno e atacando o alvo no próximo turno." - }, - "leafage": { - name: "Leafage", - effect: "O usuário ataca lançando folhas no alvo." - }, - "spotlight": { - name: "Spotlight", - effect: "O usuário direciona o foco no alvo para que apenas ele seja atacado durante o turno." - }, - "toxicThread": { - name: "Toxic Thread", - effect: "O usuário dispara fios venenosos para envenenar o alvo e diminuir sua Velocidade." - }, - "laserFocus": { - name: "Laser Focus", - effect: "O usuário se concentra intensamente. O ataque no próximo turno sempre resultará em um acerto crítico." - }, - "gearUp": { - name: "Gear Up", - effect: "O usuário engata suas engrenagens para aumentar os atributos de Ataque e Ataque Esp. de Pokémon aliados com as Habilidades Mais ou Menos." - }, - "throatChop": { - name: "Throat Chop", - effect: "O usuário acerta a garganta do alvo, e a dor resultante impede que o alvo use movimentos que emitam som por dois turnos." - }, - "pollenPuff": { - name: "Pollen Puff", - effect: "O usuário ataca o inimigo com uma bola de pólen explosiva. Se o alvo for um aliado, ele recebe uma bola de pólen que restaura seus PS em vez disso." - }, - "anchorShot": { - name: "Anchor Shot", - effect: "O usuário revolve o alvo com a corrente de sua âncora enquanto ataca. O alvo se torna incapaz de fugir." - }, - "psychicTerrain": { - name: "Psychic Terrain", - effect: "Protege o Pokémon no terreno de movimentos de prioridade e aumenta o poder dos movimentos do tipo Psíquico por cinco turnos." - }, - "lunge": { - name: "Lunge", - effect: "O usuário faz uma estocada no alvo, atacando com força total. Isso também diminui o Ataque do alvo." - }, - "fireLash": { - name: "Fire Lash", - effect: "O usuário atinge o alvo com um chicote em chamas. Também diminui a Defesa do alvo." - }, - "powerTrip": { - name: "Power Trip", - effect: "O usuário ostenta sua força e ataca o alvo. Quanto mais os atributos do usuário forem aumentados, maior será o poder do movimento." - }, - "burnUp": { - name: "Burn Up", - effect: "Para infligir um dano massivo, o usuário se exaure. Após usar esse movimento, o usuário não será mais do tipo Fogo." - }, - "speedSwap": { - name: "Speed Swap", - effect: "O usuário troca os atributos de Velocidade com o alvo." - }, - "smartStrike": { - name: "Smart Strike", - effect: "O usuário perfura o alvo com um chifre afiado. Esse ataque nunca erra." - }, - "purify": { - name: "Purify", - effect: "O usuário cura a condição de estado do alvo. Se o movimento for bem-sucedido, também recupera os PS do usuário." - }, - "revelationDance": { - name: "Revelation Dance", - effect: "O usuário ataca o alvo dançando intensamente. O tipo do usuário determina o tipo deste movimento." - }, - "coreEnforcer": { - name: "Core Enforcer", - effect: "Se os Pokémon nos quais o usuário causou dano já tiverem usado seus movimentos, esse movimento elimina o efeito da Habilidade do alvo." - }, - "tropKick": { - name: "Trop Kick", - effect: "O usuário desfere um chute intenso de origens tropicais no alvo. Também diminui o Ataque do alvo." - }, - "instruct": { - name: "Instruct", - effect: "O usuário instrui o alvo a usar novamente o seu último movimento usado." - }, - "beakBlast": { - name: "Beak Blast", - effect: "O usuário aquece o bico e depois ataca o alvo. Fazer contato direto com o Pokémon enquanto ele aquece o bico resultará em queimadura." - }, - "clangingScales": { - name: "Clanging Scales", - effect: "O usuário esfrega as escamas de todo o seu corpo e faz um estrondo para machucar o Pokémon oponente. A Defesa do usuário diminui após o ataque." - }, - "dragonHammer": { - name: "Dragon Hammer", - effect: "O usuário usa seu corpo como um martelo para atacar o alvo e causar dano." - }, - "brutalSwing": { - name: "Brutal Swing", - effect: "O usuário balança o corpo violentamente para infligir dano a tudo em seu redor." - }, - "auroraVeil": { - name: "Aurora Veil", - effect: "Esse movimento reduz o dano de movimentos físicos e especiais por cinco turnos. Só pode ser usado durante uma tempestade de granizo." - }, - "sinisterArrowRaid": { - name: "Sinister Arrow Raid", - effect: "Utilizando o Poder Z, Decidueye cria incontáveis flechas e dispara-as contra o alvo com força total." - }, - "maliciousMoonsault": { - name: "Malicious Moonsault", - effect: "Utilizando o Poder Z, Incineroar fortalece seu corpo e pula no alvo com força total." - }, - "oceanicOperetta": { - name: "Oceanic Operetta", - effect: "Utilizando o Poder Z, Primarina convoca uma quantidade massiva de água e lança contra o alvo com força total." - }, - "guardianOfAlola": { - name: "Guardian of Alola", - effect: "Utilizando o Poder Z, o Espírito Nativo canaliza a energia de Alola e ataca o alvo com força total. Reduz muito os PS do alvo." - }, - "soulStealing7StarStrike": { - name: "Soul-Stealing 7-Star Strike", - effect: "Quando um Marshadow obtém o Poder Z, ele ataca o alvo consecutivamente com socos e chutes usando força total." - }, - "stokedSparksurfer": { - name: "Stoked Sparksurfer", - effect: "Quando um Raichu de Alola obtém o Poder Z, ele lança um ataque contra o alvo com força total. Este movimento deixa o alvo paralisado." - }, - "pulverizingPancake": { - name: "Pulverizing Pancake", - effect: "O Poder Z desperta as capacidades máximas de seu Snorlax. O Pokémon movimenta seu enorme corpo velozmente e ataca o alvo com força total." - }, - "extremeEvoboost": { - name: "Extreme Evoboost", - effect: "Quando um Eevee obtém o Poder Z, ele absorve energia dos seus amigos evoluídos e aumenta os seus atributos bruscamente." - }, - "genesisSupernova": { - name: "Genesis Supernova", - effect: "Quando um Mew obtém o Poder Z, ele ataca o alvo com força total. O terreno será carregado com energia psíquica." - }, - "shellTrap": { - name: "Shell Trap", - effect: "O usuário arma uma cilada explosiva. Se o usuário for atingido fisicamente, a cilada irá explodir e causar de dano ao Pokémon oponente." - }, - "fleurCannon": { - name: "Fleur Cannon", - effect: "O usuário dispara um raio poderoso. O efeito colateral do ataque prejudica duramente o Ataque Especial do usuário." - }, - "psychicFangs": { - name: "Psychic Fangs", - effect: "O usuário morde o alvo com suas capacidades psíquicas. Pode destruir Tela de Luz e Refletir." - }, - "stompingTantrum": { - name: "Stomping Tantrum", - effect: "Guiado pela frustração, o usuário ataca o alvo. Se o movimento anterior falhou, o poder do movimento é dobrado." - }, - "shadowBone": { - name: "Shadow Bone", - effect: "O usuário ataca o alvo com um osso que contém um espírito. Pode diminuir a Defesa do alvo." - }, - "accelerock": { - name: "Accelerock", - effect: "O usuário colide contra o alvo em alta velocidade. Esse movimento sempre ataca primeiro." - }, - "liquidation": { - name: "Liquidation", - effect: "O usuário dispara no alvo um jato d'água poderoso. Diminui a Defesa do alvo." - }, - "prismaticLaser": { - name: "Prismatic Laser", - effect: "O usuário dispara lasers poderosos usando o poder de um prisma. O usuário não pode se mover no próximo turno." - }, - "spectralThief": { - name: "Spectral Thief", - effect: "O usuário se esconde na sombra do alvo, rouba seus aumentos de atributos e então, ataca-o." - }, - "sunsteelStrike": { - name: "Sunsteel Strike", - effect: "O usuário atinge o alvo com a força de um meteoro. Esse movimento pode ser usado no alvo independentemente de sua Habilidade." - }, - "moongeistBeam": { - name: "Moongeist Beam", - effect: "O usuário emite um raio pavoroso para atacar o alvo. Esse movimento pode ser usado no alvo independentemente de sua Habilidade." - }, - "tearfulLook": { - name: "Tearful Look", - effect: "O usuário fica manhoso e o alvo perde a vontade de lutar. Diminui o Ataque e o Ataque Esp. do alvo." - }, - "zingZap": { - name: "Zing Zap", - effect: "Uma forte explosão elétrica que cai sobre o alvo, eletrocutando-o e podendo fazê-lo hesitar." - }, - "naturesMadness": { - name: "Nature's Madness", - effect: "O usuário atinge o alvo com a força da natureza. Reduz os PS do alvo pela metade." - }, - "multiAttack": { - name: "Multi-Attack", - effect: "Se envolvendo em energia concentrada, o usuário acerta o alvo. A memória segurada determina o tipo do movimento." - }, - "10,000,000VoltThunderbolt": { - name: "10,000,000 Volt Thunderbolt", - effect: "Usando seu Poder Z, o Pikachu de boné acumula eletricidade e despeja-a. Golpes críticos acertam mais facilmente." - }, - mindBlown: { - name: "Mind Blown", - effect: "O usuário ataca tudo ao seu redor fazendo sua própria cabeça explodir. Isso também causa dano ao usuário." - }, - plasmaFists: { - name: "Plasma Fists", - effect: "O usuário ataca com punhos carregados eletricamente. Este movimento transforma movimentos do tipo Normal em movimentos do tipo Elétrico." - }, - photonGeyser: { - name: "Photon Geyser", - effect: "O usuário ataca o alvo com um pilar de luz. Este movimento causa dano de Ataque ou Ataque Especial—o que for maior para o usuário." - }, - lightThatBurnsTheSky: { - name: "Light That Burns the Sky", - effect: "Este ataque causa dano de Ataque ou Ataque Especial—o que for maior para o usuário, Necrozma. Este movimento ignora a Habilidade do alvo." - }, - searingSunrazeSmash: { - name: "Searing Sunraze Smash", - effect: "Após obter o Z-Power, o usuário, Solgaleo, ataca o alvo com força total. Este movimento pode ignorar o efeito da Habilidade do alvo." - }, - menacingMoonrazeMaelstrom: { - name: "Menacing Moonraze Maelstrom", - effect: "Após obter o Z-Power, o usuário, Lunala, ataca o alvo com força total. Este movimento pode ignorar o efeito da Habilidade do alvo." - }, - letsSnuggleForever: { - name: "Let's Snuggle Forever", - effect: "Após obter o Z-Power, o usuário, Mimikyu, soca o alvo com força total." - }, - splinteredStormshards: { - name: "Splintered Stormshards", - effect: "Após obter o Z-Power, o usuário, Lycanroc, ataca o alvo com força total. Este movimento nega o efeito no campo de batalha." - }, - clangorousSoulblaze: { - name: "Clangorous Soulblaze", - effect: "Após obter o Z-Power, o usuário, Kommo-o, ataca os Pokémon adversários com força total. Este movimento aumenta os atributos do usuário." - }, - zippyZap: { - name: "Zippy Zap", - effect: "O usuário ataca o alvo com rajadas de eletricidade em alta velocidade. Esse movimento sempre vai primeiro e aumenta a Evasão do usuário." - }, - splishySplash: { - name: "Splishy Splash", - effect: "O usuário carrega uma onda enorme com eletricidade e atinge os Pokémon adversários com a onda. Isso também pode deixar os Pokémon adversários paralisados." - }, - floatyFall: { - name: "Floaty Fall", - effect: "O usuário flutua no ar e então mergulha em um ângulo íngreme para atacar o alvo. Isso também pode fazer o alvo hesitar." - }, - pikaPapow: { - name: "Pika Papow", - effect: "Quanto mais o Pikachu ama seu Treinador, maior o poder do movimento. Nunca erra." - }, - bouncyBubble: { - name: "Bouncy Bubble", - effect: "O usuário ataca atirando bolhas de água no alvo. Em seguida, absorve água e restaura seu HP pelo mesmo valor de dano causado ao alvo." - }, - buzzyBuzz: { - name: "Buzzy Buzz", - effect: "O usuário dispara um choque de eletricidade para atacar o alvo. Isso também deixa o alvo paralisado." - }, - sizzlySlide: { - name: "Sizzly Slide", - effect: "O usuário se envolve em fogo e carrega contra o alvo. Isso também deixa o alvo queimado." - }, - glitzyGlow: { - name: "Glitzy Glow", - effect: "O usuário bombardeia o alvo com força telecinética. Uma parede maravilhosa de luz é erguida para enfraquecer o poder dos movimentos especiais dos Pokémon adversários." - }, - baddyBad: { - name: "Baddy Bad", - effect: "O usuário age mal e ataca o alvo. Uma parede maravilhosa de luz é erguida para enfraquecer o poder dos movimentos físicos dos Pokémon adversários." - }, - sappySeed: { - name: "Sappy Seed", - effect: "O usuário cresce um caule gigantesco que espalha sementes para atacar o alvo. As sementes drenam o HP do alvo a cada turno." - }, - freezyFrost: { - name: "Freezy Frost", - effect: "O usuário ataca com um cristal feito de névoa congelada fria. Isso elimina todas as mudanças de atributo entre todos os Pokémon envolvidos na batalha." - }, - sparklySwirl: { - name: "Sparkly Swirl", - effect: "O usuário ataca o alvo envolvendo-o com um redemoinho de um aroma esmagador. Isso também cura todas as condições de status do grupo do usuário." - }, - veeveeVolley: { - name: "Veevee Volley", - effect: "Quanto mais o Eevee ama seu Treinador, maior o poder do movimento. Nunca erra." - }, - doubleIronBash: { - name: "Double Iron Bash", - effect: "O usuário gira, centrando a porca hexagonal em seu peito e depois ataca com seus braços duas vezes seguidas. Isso também pode fazer o alvo hesitar." - }, - maxGuard: { - name: "Max Guard", - effect: "Este movimento permite ao usuário proteger-se de todos os ataques. Sua chance de falhar aumenta se for usado em sucessão." - }, - dynamaxCannon: { - name: "Dynamax Cannon", - effect: "O usuário libera um forte feixe de seu núcleo. Este movimento causa o dobro do dano se o alvo estiver acima do nível 200." - }, - snipeShot: { - name: "Snipe Shot", - effect: "O usuário ignora os efeitos dos movimentos e Habilidades dos Pokémon adversários que atraem movimentos, permitindo que este movimento atinja o alvo escolhido." - }, - jawLock: { - name: "Jaw Lock", - effect: "Este movimento impede o usuário e o alvo de trocarem de lugar até que um deles desmaie. O efeito desaparece se qualquer um dos Pokémon deixar o campo." - }, - stuffCheeks: { - name: "Stuff Cheeks", - effect: "O usuário come sua Fruta segurada, depois aumenta muito seu atributo de Defesa." - }, - noRetreat: { - name: "No Retreat", - effect: "Este movimento aumenta todos os atributos do usuário, mas impede o usuário de trocar de lugar ou fugir." - }, - tarShot: { - name: "Tar Shot", - effect: "O usuário derrama alcatrão pegajoso sobre o alvo, diminuindo o atributo de Velocidade do alvo. O alvo se torna mais fraco contra movimentos do tipo Fogo." - }, - magicPowder: { - name: "Magic Powder", - effect: "O usuário espalha uma nuvem de pó mágico que muda o alvo para o tipo Psíquico." - }, - dragonDarts: { - name: "Dragon Darts", - effect: "O usuário ataca duas vezes usando Dreepy. Se houver dois alvos, este movimento atinge cada alvo uma vez." - }, - teatime: { - name: "Teatime", - effect: "O usuário faz hora do chá com todos os Pokémon na batalha. Cada Pokémon come sua Fruta segurada." - }, - octolock: { - name: "Octolock", - effect: "O usuário prende o alvo e impede que ele fuja. Este movimento também diminui os atributos de Defesa e Def. Esp. do alvo a cada turno." - }, - boltBeak: { - name: "Bolt Beak", - effect: "O usuário fere o alvo com seu bico eletrificado. Se o usuário atacar antes do alvo, o poder deste movimento é dobrado." - }, - fishiousRend: { - name: "Fishious Rend", - effect: "O usuário fere o alvo com suas brânquias duras. Se o usuário atacar antes do alvo, o poder deste movimento é dobrado." - }, - courtChange: { - name: "Court Change", - effect: "Com seu poder misterioso, o usuário troca os efeitos de cada lado do campo." - }, - maxFlare: { - name: "Max Flare", - effect: "Este é um ataque do tipo Fogo que Pokémon Dynamax usam. O usuário intensifica o sol por cinco turnos." - }, - maxFlutterby: { - name: "Max Flutterby", - effect: "Este é um ataque do tipo Inseto que Pokémon Dynamax usam. Isso diminui o atributo de Atq. Esp. do alvo." - }, - maxLightning: { - name: "Max Lightning", - effect: "Este é um ataque do tipo Elétrico que Pokémon Dynamax usam. O usuário transforma o chão em Terreno Elétrico por cinco turnos." - }, - maxStrike: { - name: "Max Strike", - effect: "Este é um ataque do tipo Normal que Pokémon Dynamax usam. Isso diminui o atributo de Velocidade do alvo." - }, - maxKnuckle: { - name: "Max Knuckle", - effect: "Este é um ataque do tipo Lutador que Pokémon Dynamax usam. Isso aumenta os atributos de Ataque dos Pokémon aliados." - }, - maxPhantasm: { - name: "Max Phantasm", - effect: "Este é um ataque do tipo Fantasma que Pokémon Dynamax usam. Isso diminui o atributo de Defesa do alvo." - }, - maxHailstorm: { - name: "Max Hailstorm", - effect: "Este é um ataque do tipo Gelo que Pokémon Dynamax usam. O usuário convoca uma tempestade de granizo que dura cinco turnos." - }, - maxOoze: { - name: "Max Ooze", - effect: "Este é um ataque do tipo Veneno que Pokémon Dynamax usam. Isso aumenta os atributos de Atq. Esp. dos Pokémon aliados." - }, - maxGeyser: { - name: "Max Geyser", - effect: "Este é um ataque do tipo Água que Pokémon Dynamax usam. O usuário convoca uma chuva pesada que cai por cinco turnos." - }, - maxAirstream: { - name: "Max Airstream", - effect: "Este é um ataque do tipo Voador que Pokémon Dynamax usam. Isso aumenta os atributos de Velocidade dos Pokémon aliados." - }, - maxStarfall: { - name: "Max Starfall", - effect: "Este é um ataque do tipo Fada que Pokémon Dynamax usam. O usuário transforma o chão em Terreno de Nevoeiro por cinco turnos." - }, - maxWyrmwind: { - name: "Max Wyrmwind", - effect: "Este é um ataque do tipo Dragão que Pokémon Dynamax usam. Isso diminui o atributo de Ataque do alvo." - }, - maxMindstorm: { - name: "Max Mindstorm", - effect: "Este é um ataque do tipo Psíquico que Pokémon Dynamax usam. O usuário transforma o chão em Terreno Psíquico por cinco turnos." - }, - maxRockfall: { - name: "Max Rockfall", - effect: "Este é um ataque do tipo Pedra que Pokémon Dynamax usam. O usuário convoca uma tempestade de areia que dura cinco turnos." - }, - maxQuake: { - name: "Max Quake", - effect: "Este é um ataque do tipo Terra que Pokémon Dynamax usam. Isso aumenta os atributos de Def. Esp. dos Pokémon aliados." - }, - maxDarkness: { - name: "Max Darkness", - effect: "Este é um ataque do tipo Sombrio que Pokémon Dynamax usam. Isso diminui o atributo de Def. Esp. do alvo." - }, - maxOvergrowth: { - name: "Max Overgrowth", - effect: "Este é um ataque do tipo Grama que Pokémon Dynamax usam. O usuário transforma o chão em Terreno de Grama por cinco turnos." - }, - maxSteelspike: { - name: "Max Steelspike", - effect: "Este é um ataque do tipo Aço que Pokémon Dynamax usam. Isso aumenta os atributos de Defesa dos Pokémon aliados." - }, - clangorousSoul: { - name: "Clangorous Soul", - effect: "O usuário aumenta todos os seus atributos usando um pouco de seu HP." - }, - bodyPress: { - name: "Body Press", - effect: "O usuário ataca pressionando seu corpo contra o alvo. Quanto maior a Defesa do usuário, mais dano pode infligir ao alvo." - }, - decorate: { - name: "Decorate", - effect: "O usuário aumenta muito os atributos de Ataque e Atq. Esp. do alvo decorando o alvo." - }, - drumBeating: { - name: "Drum Beating", - effect: "O usuário toca seu tambor, controlando as raízes do tambor para atacar o alvo. Isso também diminui o atributo de Velocidade do alvo." - }, - snapTrap: { - name: "Snap Trap", - effect: "O usuário prende o alvo em uma armadilha rápida por quatro ou cinco turnos." - }, - pyroBall: { - name: "Pyro Ball", - effect: "O usuário ataca acendendo uma pequena pedra e lançando-a como uma bola de fogo no alvo. Isso também pode deixar o alvo queimado." - }, - behemothBlade: { - name: "Behemoth Blade", - effect: "O usuário empunha uma espada grande e poderosa usando todo o seu corpo e corta o alvo em um ataque vigoroso." - }, - behemothBash: { - name: "Behemoth Bash", - effect: "O corpo do usuário se torna um escudo firme e atinge o alvo com força." - }, - auraWheel: { - name: "Aura Wheel", - effect: "Morpeko ataca e aumenta sua Velocidade com a energia armazenada em suas bochechas. O tipo deste movimento muda dependendo da forma do usuário." - }, - breakingSwipe: { - name: "Breaking Swipe", - effect: "O usuário balança sua cauda dura violentamente e ataca os Pokémon adversários. Isso também diminui os atributos de Ataque deles." - }, - branchPoke: { - name: "Branch Poke", - effect: "O usuário ataca o alvo cutucando-o com um galho pontiagudo." - }, - overdrive: { - name: "Overdrive", - effect: "O usuário ataca os Pokémon adversários vibrando uma guitarra ou baixo, causando um eco enorme e uma vibração forte." - }, - appleAcid: { - name: "Apple Acid", - effect: "O usuário ataca o alvo com um líquido ácido criado a partir de maçãs azedas. Isso também diminui o atributo de Def. Esp. do alvo." - }, - gravApple: { - name: "Grav Apple", - effect: "O usuário inflige dano derrubando uma maçã de cima. Isso também diminui o atributo de Defesa do alvo." - }, - spiritBreak: { - name: "Spirit Break", - effect: "O usuário ataca o alvo com tanta força que poderia quebrar o espírito do alvo. Isso também diminui o atributo de Atq. Esp. do alvo." - }, - strangeSteam: { - name: "Strange Steam", - effect: "O usuário ataca o alvo emitindo vapor. Isso também pode deixar o alvo confuso." - }, - lifeDew: { - name: "Life Dew", - effect: "O usuário espalha água misteriosa ao redor e restaura o HP de si mesmo e de seus Pokémon aliados na batalha." - }, - obstruct: { - name: "Obstruct", - effect: "Este movimento permite ao usuário proteger-se de todos os ataques. Sua chance de falhar aumenta se for usado em sucessão. Contato direto reduz severamente o atributo de Defesa do atacante." - }, - falseSurrender: { - name: "False Surrender", - effect: "O usuário finge abaixar a cabeça, mas então esfaqueia o alvo com seus cabelos desgrenhados. Este ataque nunca erra." - }, - meteorAssault: { - name: "Meteor Assault", - effect: "O usuário ataca selvagemente com seu alho-poró grosso. O usuário não pode se mover na próxima rodada, porque a força deste movimento o faz cambalear." - }, - eternabeam: { - name: "Eternabeam", - effect: "Este é o ataque mais poderoso de Eternatus em sua forma original. O usuário não pode se mover na próxima rodada." - }, - steelBeam: { - name: "Steel Beam", - effect: "O usuário dispara um feixe de aço que coletou de todo o seu corpo. Isso também causa dano ao usuário." - }, - expandingForce: { - name: "Expanding Force", - effect: "O usuário ataca o alvo com seu poder psíquico. O poder deste movimento aumenta e danifica todos os Pokémon adversários no Terreno Psíquico." - }, - steelRoller: { - name: "Steel Roller", - effect: "O usuário ataca enquanto destrói o terreno. Este movimento falha quando o chão não foi transformado em um terreno." - }, - scaleShot: { - name: "Scale Shot", - effect: "O usuário ataca atirando escamas de duas a cinco vezes seguidas. Este movimento aumenta o atributo de Velocidade do usuário, mas diminui seu atributo de Defesa." - }, - meteorBeam: { - name: "Meteor Beam", - effect: "Neste ataque de dois turnos, o usuário reúne energia espacial e aumenta seu atributo de Atq. Esp., depois ataca o alvo no próximo turno." - }, - shellSideArm: { - name: "Shell Side Arm", - effect: "Este movimento causa dano físico ou especial, o que for mais eficaz. Isso também pode envenenar o alvo." - }, - mistyExplosion: { - name: "Misty Explosion", - effect: "O usuário ataca tudo ao seu redor e desmaia ao usar este movimento. O poder deste movimento é aumentado no Terreno de Nevoeiro." - }, - grassyGlide: { - name: "Grassy Glide", - effect: "Deslizando no chão, o usuário ataca o alvo. Este movimento sempre ataca primeiro no Terreno de Grama." - }, - risingVoltage: { - name: "Rising Voltage", - effect: "O usuário ataca com a voltagem elétrica que sobe do chão. O poder deste movimento dobra quando o alvo está no Terreno Elétrico." - }, - terrainPulse: { - name: "Terrain Pulse", - effect: "O usuário utiliza o poder do terreno para atacar. O tipo e o poder deste movimento mudam dependendo do terreno em que é usado." - }, - skitterSmack: { - name: "Skitter Smack", - effect: "O usuário corre por trás do alvo para atacar. Isso também diminui o atributo de Atq. Esp. do alvo." - }, - burningJealousy: { - name: "Burning Jealousy", - effect: "O usuário ataca com energia da inveja. Isso deixa todos os Pokémon adversários que tiveram seus atributos aumentados durante o turno com uma queimadura." - }, - lashOut: { - name: "Lash Out", - effect: "O usuário ataca para desabafar sua frustração contra o alvo. Se os atributos do usuário foram diminuídos durante este turno, o poder deste movimento é dobrado." - }, - poltergeist: { - name: "Poltergeist", - effect: "O usuário ataca o alvo controlando o item do alvo. O movimento falha se o alvo não tiver um item." - }, - corrosiveGas: { - name: "Corrosive Gas", - effect: "O usuário envolve tudo ao seu redor com gás altamente ácido e derrete os itens que eles seguram." - }, - coaching: { - name: "Coaching", - effect: "O usuário treina adequadamente seus Pokémon aliados, aumentando seus atributos de Ataque e Defesa." - }, - flipTurn: { - name: "Flip Turn", - effect: "Após fazer seu ataque, o usuário corre para trocar de lugar com um Pokémon do grupo à espera." - }, - tripleAxel: { - name: "Triple Axel", - effect: "Um ataque de três chutes consecutivos que se torna mais poderoso a cada acerto bem-sucedido." - }, - dualWingbeat: { - name: "Dual Wingbeat", - effect: "O usuário atinge o alvo com suas asas. O alvo é atingido duas vezes seguidas." - }, - scorchingSands: { - name: "Scorching Sands", - effect: "O usuário joga areia escaldante no alvo para atacar. Isso também pode deixar o alvo queimado." - }, - jungleHealing: { - name: "Jungle Healing", - effect: "O usuário se torna um com a selva, restaurando HP e curando quaisquer condições de status de si mesmo e de seus Pokémon aliados na batalha." - }, - wickedBlow: { - name: "Wicked Blow", - effect: "O usuário, tendo dominado o estilo Sombrio, atinge o alvo com um golpe feroz. Este ataque sempre resulta em um acerto crítico." - }, - surgingStrikes: { - name: "Surging Strikes", - effect: "O usuário, tendo dominado o estilo Água, atinge o alvo com um movimento fluido três vezes seguidas. Estes ataques sempre resultam em acertos críticos." - }, - thunderCage: { - name: "Thunder Cage", - effect: "O usuário prende o alvo em uma gaiola de eletricidade cintilante por quatro ou cinco turnos." - }, - dragonEnergy: { - name: "Dragon Energy", - effect: "Convertendo sua força vital em poder, o usuário ataca os Pokémon adversários. Quanto menor o HP do usuário, menor o poder do movimento." - }, - freezingGlare: { - name: "Freezing Glare", - effect: "O usuário dispara seu poder psíquico dos olhos para atacar. Isso também pode deixar o alvo congelado." - }, - fieryWrath: { - name: "Fiery Wrath", - effect: "O usuário transforma sua ira em uma aura semelhante ao fogo para atacar. Isso também pode fazer os Pokémon adversários hesitarem." - }, - thunderousKick: { - name: "Thunderous Kick", - effect: "O usuário oprime o alvo com movimento semelhante ao relâmpago antes de entregar um chute. Isso também diminui o atributo de Defesa do alvo." - }, - glacialLance: { - name: "Glacial Lance", - effect: "O usuário ataca lançando uma lança de gelo envolta em nevasca nos Pokémon adversários." - }, - astralBarrage: { - name: "Astral Barrage", - effect: "O usuário ataca enviando uma quantidade assustadora de pequenos fantasmas nos Pokémon adversários." - }, - eerieSpell: { - name: "Eerie Spell", - effect: "O usuário ataca com seu tremendo poder psíquico. Isso também remove 3 PP do último movimento usado pelo alvo." - }, - direClaw: { - name: "Dire Claw", - effect: "O usuário ataca o alvo com garras destruidoras. Isso também pode deixar o alvo envenenado, paralisado ou adormecido." - }, - psyshieldBash: { - name: "Psyshield Bash", - effect: "Envoltando-se em energia psíquica, o usuário se choca contra o alvo. Isso também aumenta o atributo de Defesa do usuário." - }, - powerShift: { - name: "Power Shift", - effect: "O usuário troca seus atributos de Ataque e Defesa." - }, - stoneAxe: { - name: "Stone Axe", - effect: "O usuário balança seus machados de pedra no alvo. Fragmentos de pedra deixados para trás por este ataque flutuam ao redor do alvo." - }, - springtideStorm: { - name: "Springtide Storm", - effect: "O usuário ataca envolvendo os Pokémon adversários em ventos ferozes repletos de amor e ódio. Isso também pode diminuir os atributos de Ataque deles." - }, - mysticalPower: { - name: "Mystical Power", - effect: "O usuário ataca emitindo um poder misterioso. Isso também aumenta o atributo de Atq. Esp. do usuário." - }, - ragingFury: { - name: "Raging Fury", - effect: "O usuário se enfurece espalhando chamas por dois ou três turnos. O usuário então fica confuso." - }, - waveCrash: { - name: "Wave Crash", - effect: "O usuário se envolve em água e atinge o alvo com todo o corpo para infligir dano. Isso também causa muito dano ao usuário." - }, - chloroblast: { - name: "Chloroblast", - effect: "O usuário lança sua clorofila acumulada para infligir dano no alvo. Isso também causa dano ao usuário." - }, - mountainGale: { - name: "Mountain Gale", - effect: "O usuário arremessa pedaços gigantes de gelo no alvo para infligir dano. Isso também pode fazer o alvo hesitar." - }, - victoryDance: { - name: "Victory Dance", - effect: "O usuário realiza uma dança intensa para inaugurar a vitória, aumentando seus atributos de Ataque, Defesa e Velocidade." - }, - headlongRush: { - name: "Headlong Rush", - effect: "O usuário se choca contra o alvo em um ataque de corpo inteiro. Isso também diminui os atributos de Defesa e Def. Esp. do usuário." - }, - barbBarrage: { - name: "Barb Barrage", - effect: "O usuário lança inúmeras barbas tóxicas para infligir dano. O poder deste movimento é dobrado se o alvo já estiver envenenado." - }, - esperWing: { - name: "Esper Wing", - effect: "O usuário corta o alvo com asas enriquecidas com aura. Isso também aumenta o atributo de Velocidade do usuário. Este movimento tem uma chance aumentada de causar um acerto crítico." - }, - bitterMalice: { - name: "Bitter Malice", - effect: "O usuário ataca o alvo com um ressentimento arrepiante. Isso também diminui o atributo de Ataque do alvo." - }, - shelter: { - name: "Shelter", - effect: "O usuário torna sua pele tão dura quanto um escudo de ferro, aumentando muito seu atributo de Defesa." - }, - tripleArrows: { - name: "Triple Arrows", - effect: "O usuário chuta e depois dispara três flechas. Este movimento tem uma chance aumentada de causar um acerto crítico e também pode diminuir o atributo de Defesa do alvo ou fazê-lo hesitar." - }, - infernalParade: { - name: "Infernal Parade", - effect: "O usuário ataca com miríades de bolas de fogo. Isso também pode deixar o alvo queimado. O poder deste movimento é dobrado se o alvo tiver uma condição de status." - }, - ceaselessEdge: { - name: "Ceaseless Edge", - effect: "O usuário corta sua lâmina de concha no alvo. Fragmentos de concha deixados para trás por este ataque permanecem espalhados sob o alvo como espinhos." - }, - bleakwindStorm: { - name: "Bleakwind Storm", - effect: "O usuário ataca com ventos selvagemente frios que fazem tanto o corpo quanto o espírito tremerem. Isso também pode diminuir os atributos de Velocidade dos Pokémon adversários." - }, - wildboltStorm: { - name: "Wildbolt Storm", - effect: "O usuário invoca uma tempestade trovejante e ataca selvagemente com relâmpagos e vento. Isso também pode deixar os Pokémon adversários paralisados." - }, - sandsearStorm: { - name: "Sandsear Storm", - effect: "O usuário ataca envolvendo os Pokémon adversários em ventos ferozes e areia escaldante. Isso também pode deixá-los queimados." - }, - lunarBlessing: { - name: "Lunar Blessing", - effect: "O usuário recebe uma bênção do crescente lunar, restaurando HP e curando condições de status para si mesmo e seus Pokémon aliados atualmente na batalha." - }, - takeHeart: { - name: "Take Heart", - effect: "O usuário levanta o espírito, curando suas próprias condições de status e aumentando seus atributos de Atq. Esp. e Def. Esp." - }, - gMaxWildfire: { - name: "G-Max Wildfire", - effect: "Um ataque do tipo Fogo que o Gigantamax Charizard usa. Este movimento continua causando dano aos oponentes por quatro turnos." - }, - gMaxBefuddle: { - name: "G-Max Befuddle", - effect: "Um ataque do tipo Inseto que o Gigantamax Butterfree usa. Este movimento inflige as condições de envenenado, paralisado ou adormecido nos oponentes." - }, - gMaxVoltCrash: { - name: "G-Max Volt Crash", - effect: "Um ataque do tipo Elétrico que o Gigantamax Pikachu usa. Este movimento paralisa os oponentes." - }, - gMaxGoldRush: { - name: "G-Max Gold Rush", - effect: "Um ataque do tipo Normal que o Gigantamax Meowth usa. Este movimento confunde os oponentes e também ganha dinheiro extra." - }, - "gMaxChiStrike": { - name: "G-Max Chi Strike", - effect: "Um ataque do tipo Lutador que Gigantamax Machamp usa. Este movimento aumenta a chance de acertos críticos." - }, - "gMaxTerror": { - name: "G-Max Terror", - effect: "Um ataque do tipo Fantasma que Gigantamax Gengar usa. Este Pokémon pisa na sombra do Pokémon adversário para impedi-lo de escapar." - }, - "gMaxResonance": { - name: "G-Max Resonance", - effect: "Um ataque do tipo Gelo que Gigantamax Lapras usa. Este movimento reduz o dano recebido por cinco turnos." - }, - "gMaxCuddle": { - name: "G-Max Cuddle", - effect: "Um ataque do tipo Normal que Gigantamax Eevee usa. Este movimento apaixona os oponentes." - }, - "gMaxReplenish": { - name: "G-Max Replenish", - effect: "Um ataque do tipo Normal que Gigantamax Snorlax usa. Este movimento restaura Frutas que foram comidas." - }, - "gMaxMalodor": { - name: "G-Max Malodor", - effect: "Um ataque do tipo Veneno que Gigantamax Garbodor usa. Este movimento envenena os oponentes." - }, - "gMaxStonesurge": { - name: "G-Max Stonesurge", - effect: "Um ataque do tipo Água que Gigantamax Drednaw usa. Este movimento espalha pedras afiadas pelo campo." - }, - "gMaxWindRage": { - name: "G-Max Wind Rage", - effect: "Um ataque do tipo Voador que Gigantamax Corviknight usa. Este movimento remove os efeitos de movimentos como Reflect e Light Screen." - }, - "gMaxStunShock": { - name: "G-Max Stun Shock", - effect: "Um ataque do tipo Elétrico que Gigantamax Toxtricity usa. Este movimento envenena ou paralisa os oponentes." - }, - "gMaxFinale": { - name: "G-Max Finale", - effect: "Um ataque do tipo Fada que Gigantamax Alcremie usa. Este movimento cura os PS dos aliados." - }, - "gMaxDepletion": { - name: "G-Max Depletion", - effect: "Um ataque do tipo Dragão que Gigantamax Duraludon usa. Reduz o PP do último movimento usado." - }, - "gMaxGravitas": { - name: "G-Max Gravitas", - effect: "Um ataque do tipo Psíquico que Gigantamax Orbeetle usa. Este movimento muda a gravidade por cinco turnos." - }, - "gMaxVolcalith": { - name: "G-Max Volcalith", - effect: "Um ataque do tipo Pedra que Gigantamax Coalossal usa. Este movimento continua a causar dano aos oponentes por quatro turnos." - }, - "gMaxSandblast": { - name: "G-Max Sandblast", - effect: "Um ataque do tipo Terra que Gigantamax Sandaconda usa. Os oponentes ficam presos em uma tempestade de areia furiosa por quatro a cinco turnos." - }, - "gMaxSnooze": { - name: "G-Max Snooze", - effect: "Um ataque do tipo Sombrio que Gigantamax Grimmsnarl usa. O usuário solta um grande bocejo que faz com que os alvos adormeçam no próximo turno." - }, - "gMaxTartness": { - name: "G-Max Tartness", - effect: "Um ataque do tipo Planta que Gigantamax Flapple usa. Este movimento reduz a Evasão dos oponentes." - }, - "gMaxSweetness": { - name: "G-Max Sweetness", - effect: "Um ataque do tipo Planta que Gigantamax Appletun usa. Este movimento cura as condições de status dos aliados." - }, - "gMaxSmite": { - name: "G-Max Smite", - effect: "Um ataque do tipo Fada que Gigantamax Hatterene usa. Este movimento confunde os oponentes." - }, - "gMaxSteelsurge": { - name: "G-Max Steelsurge", - effect: "Um ataque do tipo Aço que Gigantamax Copperajah usa. Este movimento espalha estacas afiadas pelo campo." - }, - "gMaxMeltdown": { - name: "G-Max Meltdown", - effect: "Um ataque do tipo Aço que Gigantamax Melmetal usa. Este movimento impede os oponentes de usar o mesmo movimento duas vezes seguidas." - }, - "gMaxFoamBurst": { - name: "G-Max Foam Burst", - effect: "Um ataque do tipo Água que Gigantamax Kingler usa. Este movimento reduz drasticamente a Velocidade dos oponentes." - }, - "gMaxCentiferno": { - name: "G-Max Centiferno", - effect: "Um ataque do tipo Fogo que Gigantamax Centiskorch usa. Este movimento prende os oponentes em chamas por quatro a cinco turnos." - }, - "gMaxVineLash": { - name: "G-Max Vine Lash", - effect: "Um ataque do tipo Planta que Gigantamax Venusaur usa. Este movimento continua a causar dano aos oponentes por quatro turnos." - }, - "gMaxCannonade": { - name: "G-Max Cannonade", - effect: "Um ataque do tipo Água que Gigantamax Blastoise usa. Este movimento continua a causar dano aos oponentes por quatro turnos." - }, - "gMaxDrumSolo": { - name: "G-Max Drum Solo", - effect: "Um ataque do tipo Planta que Gigantamax Rillaboom usa. Este movimento pode ser usado no alvo independentemente de suas Habilidades." - }, - "gMaxFireball": { - name: "G-Max Fireball", - effect: "Um ataque do tipo Fogo que Gigantamax Cinderace usa. Este movimento pode ser usado no alvo independentemente de suas Habilidades." - }, - "gMaxHydrosnipe": { - name: "G-Max Hydrosnipe", - effect: "Um ataque do tipo Água que Gigantamax Inteleon usa. Este movimento pode ser usado no alvo independentemente de suas Habilidades." - }, - "gMaxOneBlow": { - name: "G-Max One Blow", - effect: "Um ataque do tipo Sombrio que Gigantamax Urshifu usa. Este movimento único pode ignorar o Max Guard." - }, - "gMaxRapidFlow": { - name: "G-Max Rapid Flow", - effect: "Um ataque do tipo Água que Gigantamax Urshifu usa. Este movimento rápido pode ignorar o Max Guard." - }, - "teraBlast": { - name: "Tera Blast", - effect: "Se o usuário estiver Terastalizado, ele libera energia de seu Tera Tipo. Este movimento causa dano usando o maior entre o Ataque ou Ataque Esp. do usuário." - }, - "silkTrap": { - name: "Silk Trap", - effect: "O usuário tece uma armadilha de seda, protegendo-se de dano enquanto reduz o atributo de Velocidade de qualquer atacante que faça contato direto." - }, - "axeKick": { - name: "Axe Kick", - effect: "O usuário ataca chutando para cima e depois abaixando o calcanhar sobre o alvo. Isso também pode confundir o alvo. Se errar, o usuário sofre dano." - }, - "lastRespects": { - name: "Last Respects", - effect: "O usuário ataca para vingar seus aliados. Quanto mais aliados derrotados, maior o poder do movimento." - }, - "luminaCrash": { - name: "Lumina Crash", - effect: "O usuário ataca liberando uma luz peculiar que afeta até a mente. Isso também reduz muito a Defesa Esp. do alvo." - }, - "orderUp": { - name: "Order Up", - effect: "O usuário ataca com elegância. Se o usuário tiver um Tatsugiri na boca, este movimento aumenta uma dos atributos do usuário com base na forma do Tatsugiri." - }, - "jetPunch": { - name: "Jet Punch", - effect: "O usuário convoca um turbilhão ao redor de seu punho e ataca com velocidade cegante. Este movimento sempre age primeiro." - }, - "spicyExtract": { - name: "Spicy Extract", - effect: "O usuário emite um extrato incrivelmente picante, aumentando muito o Ataque do alvo e reduzindo muito a Defesa do alvo." - }, - "spinOut": { - name: "Spin Out", - effect: "O usuário gira furiosamente ao esticar as pernas, causando dano ao alvo. Isso também reduz muito a Velocidade do usuário." - }, - "populationBomb": { - name: "Population Bomb", - effect: "Os companheiros do usuário se reúnem em massa para executar um ataque combinado que atinge o alvo de uma a dez vezes seguidas." - }, - "iceSpinner": { - name: "Ice Spinner", - effect: "O usuário cobre seus pés com gelo fino e gira ao redor, atingindo o alvo. O movimento giratório deste movimento também destrói o terreno." - }, - "glaiveRush": { - name: "Glaive Rush", - effect: "O usuário lança todo o seu corpo em uma carga imprudente. Após o uso deste movimento, ataques contra o usuário não podem errar e infligirão o dobro do dano até a próxima vez que o usuário agir." - }, - "revivalBlessing": { - name: "Revival Blessing", - effect: "O usuário concede uma bênção amorosa, reanimando um Pokémon da equipe que tenha desmaiado e restaurando metade do máximo de PS desse Pokémon." - }, - "saltCure": { - name: "Salt Cure", - effect: "O usuário cura o alvo com sal, causando dano a cada turno. Tipos de Aço e Água são mais fortemente afetados por este movimento." - }, - "tripleDive": { - name: "Triple Dive", - effect: "O usuário executa um mergulho triplo perfeitamente cronometrado, atingindo o alvo com respingos de água três vezes seguidas." - }, - "mortalSpin": { - name: "Mortal Spin", - effect: "O usuário realiza um ataque giratório que também pode eliminar os efeitos de movimentos como Bind, Wrap e Leech Seed. Isso também envenena os Pokémon oponentes." - }, - "doodle": { - name: "Doodle", - effect: "O usuário captura a essência do alvo em um esboço. Isso muda as Habilidades do usuário e de seus Pokémon aliados para a do alvo." - }, - "filletAway": { - name: "Fillet Away", - effect: "O usuário aumenta muito seus atributos de Ataque, Ataque Esp. e Velocidade ao usar seus próprios PS." - }, - "kowtowCleave": { - name: "Kowtow Cleave", - effect: "O usuário corta o alvo depois de se curvar para fazer o alvo baixar a guarda. Este ataque nunca erra." - }, - "flowerTrick": { - name: "Flower Trick", - effect: "O usuário lança um buquê de flores armado no alvo. Este ataque nunca erra e sempre resulta em um acerto crítico." - }, - "torchSong": { - name: "Torch Song", - effect: "O usuário exala chamas furiosas como se estivesse cantando uma canção, queimando o alvo. Isso também aumenta o atributo de Ataque Esp. do usuário." - }, - "aquaStep": { - name: "Aqua Step", - effect: "O usuário brinca com o alvo e o ataca usando passos de dança leves e fluidos. Isso também aumenta a Velocidade do usuário." - }, - "ragingBull": { - name: "Raging Bull", - effect: "O usuário realiza um ataque de investida como um touro enfurecido. O tipo deste movimento depende da forma do usuário. Ele também pode quebrar barreiras, como Light Screen e Reflect." - }, - "makeItRain": { - name: "Make It Rain", - effect: "O usuário ataca lançando uma massa de moedas. Isso também reduz o atributo de Ataque Esp. do usuário. Dinheiro é ganho após a batalha." - }, - "psyblade": { - name: "Psyblade", - effect: "O usuário fende o alvo com uma lâmina etérea. O poder deste movimento é aumentado em 50% se o usuário estiver no Electric Terrain." - }, - "hydroSteam": { - name: "Hydro Steam", - effect: "O usuário ataca o alvo com água fervente. O poder deste movimento não é reduzido sob sol forte, mas sim aumentado em 50%." - }, - "ruination": { - name: "Ruination", - effect: "O usuário invoca um desastre ruinoso. Isso corta os PS do alvo pela metade." - }, - "collisionCourse": { - name: "Collision Course", - effect: "O usuário se transforma e cai no chão, causando uma explosão pré-histórica massiva. O poder deste movimento é aumentado mais do que o usual se for um golpe super eficaz." - }, - "electroDrift": { - name: "Electro Drift", - effect: "O usuário avança a velocidades ultra-rápidas, perfurando o alvo com eletricidade futurista. O poder deste movimento é aumentado mais do que o usual se for um golpe super eficaz." - }, - "shedTail": { - name: "Shed Tail", - effect: "O usuário cria um substituto para si mesmo usando seus próprios PS antes de trocar de lugar com um Pokémon da equipe que está esperando." - }, - "chillyReception": { - name: "Chilly Reception", - effect: "O usuário conta uma piada terrivelmente ruim antes de trocar de lugar com um Pokémon da equipe que está esperando. Isso invoca uma nevasca que dura cinco turnos." - }, - "tidyUp": { - name: "Tidy Up", - effect: "O usuário arruma e remove os efeitos de Spikes, Stealth Rock, Sticky Web, Toxic Spikes e Substitute. Isso também aumenta os atributos de Ataque e Velocidade do usuário." - }, - "snowscape": { - name: "Snowscape", - effect: "O usuário invoca uma tempestade de neve que dura cinco turnos. Isso aumenta os atributos de Defesa dos tipos Gelo." - }, - "pounce": { - name: "Pounce", - effect: "O usuário ataca saltando sobre o alvo. Isso também reduz a Velocidade do alvo." - }, - "trailblaze": { - name: "Trailblaze", - effect: "O usuário ataca repentinamente como se estivesse saltando de dentro da grama alta. A agilidade do usuário aumenta sua Velocidade." - }, - "chillingWater": { - name: "Chilling Water", - effect: "O usuário ataca o alvo derramando sobre ele água tão fria que suga seu poder. Isso também reduz o atributo de Ataque do alvo." - }, - "hyperDrill": { - name: "Hyper Drill", - effect: "O usuário gira a parte pontiaguda de seu corpo em alta velocidade para perfurar o alvo. Este ataque pode atingir um alvo que esteja usando um movimento como Protect ou Detect." - }, - "twinBeam": { - name: "Twin Beam", - effect: "O usuário dispara feixes místicos de seus olhos para causar dano. O alvo é atingido duas vezes seguidas." - }, - "rageFist": { - name: "Rage Fist", - effect: "O usuário converte sua raiva em energia para atacar. Quanto mais vezes o usuário foi atingido por ataques, maior o poder do movimento." - }, - "armorCannon": { - name: "Armor Cannon", - effect: "O usuário dispara sua própria armadura como projéteis ardentes. Isso também reduz os atributos de Defesa e Defesa Esp. do usuário." - }, - "bitterBlade": { - name: "Bitter Blade", - effect: "O usuário concentra seus sentimentos amargos em relação ao mundo dos vivos em um ataque cortante. Os PS do usuário são restaurados em até metade do dano causado ao alvo." - }, - "doubleShock": { - name: "Double Shock", - effect: "O usuário descarrega toda a eletricidade de seu corpo para executar um ataque de alto dano. Após usar este movimento, o usuário não será mais do tipo Elétrico." - }, - "gigatonHammer": { - name: "Gigaton Hammer", - effect: "O usuário balança todo o seu corpo para atacar com seu enorme martelo. Este movimento não pode ser usado duas vezes seguidas." - }, - "comeuppance": { - name: "Comeuppance", - effect: "O usuário retalia com muito mais força contra o oponente que causou o último dano a ele." - }, - "aquaCutter": { - name: "Aqua Cutter", - effect: "O usuário expele água pressurizada para cortar o alvo como uma lâmina. Este movimento tem uma chance aumentada de resultar em um acerto crítico." - }, - "blazingTorque": { - name: "Blazing Torque", - effect: "O usuário acelera seu motor ardente no alvo. Isso também pode deixar o alvo queimado." - }, - "wickedTorque": { - name: "Wicked Torque", - effect: "O usuário acelera seu motor no alvo com intenção maliciosa. Isso pode fazer o alvo adormecer." - }, - "noxiousTorque": { - name: "Noxious Torque", - effect: "O usuário acelera seu motor venenoso no alvo. Isso também pode envenenar o alvo." - }, - "combatTorque": { - name: "Combat Torque", - effect: "O usuário acelera seu motor com força no alvo. Isso também pode deixar o alvo paralisado." - }, - "magicalTorque": { - name: "Magical Torque", - effect: "O usuário acelera seu motor de fadas no alvo. Isso também pode confundir o alvo." - }, - "bloodMoon": { - name: "Blood Moon", - effect: "O usuário libera toda a força de seu espírito de uma lua cheia que brilha tão vermelha quanto o sangue. Este movimento não pode ser usado duas vezes seguidas." - }, - "matchaGotcha": { - name: "Matcha Gotcha", - effect: "O usuário dispara um jato de chá que misturou. Os PS do usuário são restaurados em até metade do dano causado ao alvo. Isso também pode deixar o alvo queimado." - }, - "syrupBomb": { - name: "Syrup Bomb", - effect: "O usuário detona uma explosão de xarope de doces pegajoso, que reveste o alvo e faz o atributo de Velocidade do alvo cair a cada turno por três turnos." - }, - "ivyCudgel": { - name: "Ivy Cudgel", - effect: "O usuário golpeia com um porrete envolto em hera. O tipo deste movimento muda dependendo da máscara usada pelo usuário, e tem uma chance aumentada de resultar em um acerto crítico." - }, - "electroShot": { - name: "Electro Shot", - effect: "O usuário acumula eletricidade no primeiro turno, aumentando suo atributo de Ataque Esp., e então dispara um tiro de alta voltagem no próximo turno. O tiro será disparado imediatamente na chuva." - }, - "teraStarstorm": { - name: "Tera Starstorm", - effect: "Com o poder de seus cristais, o usuário bombardeia e elimina o alvo. Quando usado por Terapagos em sua Forma Estelar, este movimento causa dano a todos os Pokémon oponentes." - }, - "fickleBeam": { - name: "Fickle Beam", - effect: "O usuário dispara um feixe de luz para causar dano. Às vezes, todas as cabeças do usuário disparam feixes ao mesmo tempo, dobrando o poder do movimento." - }, - "burningBulwark": { - name: "Burning Bulwark", - effect: "A pele intensamente quente do usuário o protege de ataques e também queima qualquer atacante que faça contato direto." - }, - "thunderclap": { - name: "Thunderclap", - effect: "Este movimento permite que o usuário ataque primeiro com um choque de eletricidade. Este movimento falha se o alvo não estiver preparando um ataque." - }, - "mightyCleave": { - name: "Mighty Cleave", - effect: "O usuário empunha a luz que se acumulou no topo de sua cabeça para cortar o alvo. Este movimento atinge mesmo se o alvo se proteger." - }, - "tachyonCutter": { - name: "Tachyon Cutter", - effect: "O usuário ataca lançando lâminas de partículas no alvo duas vezes seguidas. Este ataque nunca erra." - }, - "hardPress": { - name: "Hard Press", - effect: "O alvo é esmagado com um braço, uma garra ou algo do tipo para causar dano. Quanto mais PS o alvo tiver, maior o poder do movimento." - }, - "dragonCheer": { - name: "Dragon Cheer", - effect: "O usuário eleva o moral de seus aliados com um grito dracônico, para que seus futuros ataques tenham uma chance aumentada de resultar em golpes críticos. Isso anima mais os tipos Dragão." - }, - "alluringVoice": { - name: "Alluring Voice", - effect: "O usuário ataca o alvo usando sua voz angelical. Isso também confunde o alvo se seus atributos tiverem sido aumentadas durante o turno." - }, - "temperFlare": { - name: "Temper Flare", - effect: "Impulsionado pelo desespero, o usuário ataca o alvo. O poder deste movimento é dobrado se o movimento anterior do usuário tiver falhado." - }, - "supercellSlam": { - name: "Supercell Slam", - effect: "O usuário eletrifica seu corpo e cai sobre o alvo para causar dano. Se este movimento errar, o usuário sofre dano." - }, - "psychicNoise": { - name: "Psychic Noise", - effect: "O usuário ataca o alvo com ondas sonoras desagradáveis. Por dois turnos, o alvo é impedido de recuperar PS através de movimentos, Habilidades ou itens mantidos." - }, - "upperHand": { - name: "Upper Hand", - effect: "O usuário reage ao movimento do alvo e o ataca com o calcanhar da palma da mão, fazendo o alvo hesitar. Este movimento falha se o alvo não estiver preparando um movimento de prioridade." - }, - "malignantChain": { - name: "Malignant Chain", - effect: "O usuário derrama toxinas no alvo envolvendo-o em uma corrente tóxica e corrosiva. Isso também pode deixar o alvo seriamente envenenado." - } -} as const; diff --git a/src/locales/pt_BR/nature.ts b/src/locales/pt_BR/nature.json similarity index 77% rename from src/locales/pt_BR/nature.ts rename to src/locales/pt_BR/nature.json index fc906fde6ef..5678c74061c 100644 --- a/src/locales/pt_BR/nature.ts +++ b/src/locales/pt_BR/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "Destemida", "Lonely": "Solitária", "Brave": "Valente", @@ -25,5 +23,5 @@ export const nature: SimpleTranslationEntries = { "Gentle": "Gentil", "Sassy": "Atrevida", "Careful": "Cuidadosa", - "Quirky": "Peculiar", -} as const; + "Quirky": "Peculiar" +} \ No newline at end of file diff --git a/src/locales/pt_BR/party-ui-handler.json b/src/locales/pt_BR/party-ui-handler.json new file mode 100644 index 00000000000..435bc916ac6 --- /dev/null +++ b/src/locales/pt_BR/party-ui-handler.json @@ -0,0 +1,47 @@ +{ + "SEND_OUT": "Trocar", + "SUMMARY": "Sumário", + "CANCEL": "Cancelar", + "RELEASE": "Soltar", + "APPLY": "Aplicar", + "TEACH": "Ensinar", + "SPLICE": "Fundir", + "UNSPLICE": "Separar", + "ACTIVATE": "Ativar", + "DEACTIVATE": "Desativar", + "TRANSFER": "Transferir", + "ALL": "Tudo", + "PASS_BATON": "Passar Bastão", + "UNPAUSE_EVOLUTION": "Ativar Evolução", + "REVIVE": "Reanimar", + "RENAME": "Renomear", + "choosePokemon": "Escolha um Pokémon.", + "doWhatWithThisPokemon": "O que você deseja fazer?", + "noEnergy": "{{pokemonName}} não pode\nmais batalhar!", + "hasEnergy": "{{pokemonName}} ainda\npode batalhar!", + "cantBeUsed": "{{pokemonName}} não pode\nser usado neste desafio!", + "tooManyItems": "{{pokemonName}} já tem\nmuitos desse item!", + "anyEffect": "Isso não terá nenhum efeito.", + "unpausedEvolutions": "Evoluções foram despausadas para {{pokemonName}}.", + "unspliceConfirmation": "Você realmente deseja desfazer a fusão de {{fusionName}}\ncom {{pokemonName}}? {{fusionName}} será perdido.", + "wasReverted": "{{fusionName}} foi revertido para {{pokemonName}}.", + "releaseConfirmation": "Você realmente deseja soltar {{pokemonName}}?", + "releaseInBattle": "Você não pode soltar um Pokémon que está em batalha!", + "selectAMove": "Selecione um movimento.", + "changeQuantity": "Selecione um item para transferir.\nUse < e > para mudar a quantidade.", + "selectAnotherPokemonToSplice": "Selecione outro Pokémon para fundir.", + "cancel": "Voltar", + "able": "Capaz", + "notAble": "Incapaz", + "learned": "Aprendido", + "goodbye": "Adeus, {{pokemonName}}!", + "byebye": "Tchau, {{pokemonName}}!", + "farewell": "Até mais, {{pokemonName}}!", + "soLong": "Até logo, {{pokemonName}}!", + "thisIsWhereWePart": "Aqui é onde nos separamos, {{pokemonName}}!", + "illMissYou": "Vou sentir saudades, {{pokemonName}}!", + "illNeverForgetYou": "Nunca vou esquecer de você, {{pokemonName}}!", + "untilWeMeetAgain": "Até nos encontrarmos novamente, {{pokemonName}}!", + "sayonara": "Sayonara, {{pokemonName}}!", + "smellYaLater": "Te vejo depois, {{pokemonName}}!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/party-ui-handler.ts b/src/locales/pt_BR/party-ui-handler.ts deleted file mode 100644 index 683dc4b368a..00000000000 --- a/src/locales/pt_BR/party-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Trocar", - "SUMMARY": "Sumário", - "CANCEL": "Cancelar", - "RELEASE": "Soltar", - "APPLY": "Aplicar", - "TEACH": "Ensinar", -} as const; diff --git a/src/locales/pt_BR/pokeball.json b/src/locales/pt_BR/pokeball.json new file mode 100644 index 00000000000..3a059654bb3 --- /dev/null +++ b/src/locales/pt_BR/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "Poké Bola", + "greatBall": "Grande Bola", + "ultraBall": "Ultra Bola", + "rogueBall": "Bola Rogue", + "masterBall": "Bola Mestra", + "luxuryBall": "Bola Luxo" +} \ No newline at end of file diff --git a/src/locales/pt_BR/pokeball.ts b/src/locales/pt_BR/pokeball.ts deleted file mode 100644 index ee29b9612e6..00000000000 --- a/src/locales/pt_BR/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Bola", - "greatBall": "Grande Bola", - "ultraBall": "Ultra Bola", - "rogueBall": "Bola Rogue", - "masterBall": "Bola Mestra", - "luxuryBall": "Bola Luxo", -} as const; diff --git a/src/locales/pt_BR/pokemon-form-battle.json b/src/locales/pt_BR/pokemon-form-battle.json new file mode 100644 index 00000000000..6ea7947fb66 --- /dev/null +++ b/src/locales/pt_BR/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "{{pokemonName}} Primordial", + "gigantamax": "G-Max {{pokemonName}}", + "eternamax": "E-Max {{pokemonName}}", + "megaChange": "{{preName}} Mega Evoluiu\npara {{pokemonName}}!", + "gigantamaxChange": "{{preName}} Gigantamaxou\npara {{pokemonName}}!", + "eternamaxChange": "{{preName}} Eternamaxou\npara {{pokemonName}}!", + "revertChange": "{{pokemonName}} voltou\npara sua forma original!", + "formChange": "{{preName}} mudou de forma!", + "disguiseChange": "O seu disfarce serviu-lhe de isca!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/pokemon-form.json b/src/locales/pt_BR/pokemon-form.json new file mode 100644 index 00000000000..aa8f32a5d36 --- /dev/null +++ b/src/locales/pt_BR/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cosplay Legal", + "pikachuBeautyCosplay": "Cosplay Bonito", + "pikachuCuteCosplay": "Cosplay Fofo", + "pikachuSmartCosplay": "Cosplay Inteligente", + "pikachuToughCosplay": "Cosplay Forte", + "pikachuPartner": "Parceiro", + "eeveePartner": "Parceiro", + "pichuSpiky": "Orelha Espetada", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "Ensolarado", + "castformRainy": "Chuvoso", + "castformSnowy": "Nevado", + "deoxysNormal": "Normal", + "burmyPlant": "Vegetal", + "burmySandy": "Arenoso", + "burmyTrash": "Lixo", + "shellosEast": "Leste", + "shellosWest": "Oeste", + "rotomHeat": "Calor", + "rotomWash": "Lavagem", + "rotomFrost": "Congelante", + "rotomFan": "Ventilador", + "rotomMow": "Corte", + "giratinaAltered": "Alterado", + "shayminLand": "Terrestre", + "basculinRedStriped": "Listras Vermelhas", + "basculinBlueStriped": "Listras Azuis", + "basculinWhiteStriped": "Listras Brancas", + "deerlingSpring": "Primavera", + "deerlingSummer": "Verão", + "deerlingAutumn": "Outono", + "deerlingWinter": "Inverno", + "tornadusIncarnate": "Materializado", + "thundurusIncarnate": "Materializado", + "landorusIncarnate": "Materializado", + "keldeoOrdinary": "Comum", + "meloettaAria": "Ária", + "meloettaPirouette": "Pirueta", + "froakieBattleBond": "Vínculo de Batalha", + "scatterbugMeadow": "Prado", + "scatterbugIcySnow": "Neve Congelada", + "scatterbugPolar": "Polar", + "scatterbugTundra": "Tundra", + "scatterbugContinental": "Continental", + "scatterbugGarden": "Jardim", + "scatterbugElegant": "Elegante", + "scatterbugModern": "Moderno", + "scatterbugMarine": "Marinho", + "scatterbugArchipelago": "Arquipélago", + "scatterbugHighPlains": "Planalto", + "scatterbugSandstorm": "Deserto", + "scatterbugRiver": "Rio", + "scatterbugMonsoon": "Monção", + "scatterbugSavanna": "Savana", + "scatterbugSun": "Solar", + "scatterbugOcean": "Oceano", + "scatterbugJungle": "Selva", + "scatterbugFancy": "Chique", + "scatterbugPokeBall": "Poké Bola", + "flabebeRed": "Vermelha", + "flabebeYellow": "Amarela", + "flabebeOrange": "Laranja", + "flabebeBlue": "Azul", + "flabebeWhite": "Branca", + "furfrouHeart": "Coração", + "furfrouStar": "Estrela", + "furfrouDiamond": "Diamante", + "furfrouDebutante": "Debutante", + "furfrouMatron": "Madame", + "furfrouDandy": "Cavalheiro", + "furfrouLaReine": "Aristocrático", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Faraó", + "pumpkabooSmall": "Pequeno", + "pumpkabooLarge": "Grande", + "pumpkabooSuper": "Extragrande", + "xerneasNeutral": "Relaxado", + "xerneasActive": "Ativo", + "zygarde50": "Forma 50%", + "zygarde10": "Forma 10%", + "zygarde50Pc": "Forma 50% Agrupada", + "zygarde10Pc": "Forma 10% Agrupada", + "zygardeComplete": "Forma Completa", + "oricorioBaile": "Flamenco", + "oricorioPompom": "Pompom", + "oricorioPau": "Hula", + "oricorioSensu": "Leque", + "rockruffOwnTempo": "Próprio Tempo", + "miniorRedMeteor": "Meteoro Vermelho", + "miniorOrangeMeteor": "Meteoro Laranja", + "miniorYellowMeteor": "Meteoro Amarelo", + "miniorGreenMeteor": "Meteoro Verde", + "miniorBlueMeteor": "Meteoro Azul", + "miniorIndigoMeteor": "Meteoro Anil", + "miniorVioletMeteor": "Meteoro Violeta", + "miniorRed": "Vermelho", + "miniorOrange": "Laranja", + "miniorYellow": "Amarelo", + "miniorGreen": "Verde", + "miniorBlue": "Azul", + "miniorIndigo": "Anil", + "miniorViolet": "Violeta", + "mimikyuDisguised": "Disfarçado", + "mimikyuBusted": "Descoberto", + "magearnaOriginal": "Original", + "marshadowZenith": "Zênite", + "sinisteaPhony": "Falsificado", + "sinisteaAntique": "Autêntico", + "eiscueNoIce": "Descongelado", + "indeedeeMale": "Macho", + "indeedeeFemale": "Fêmea", + "morpekoFullBelly": "Saciado", + "zacianHeroOfManyBattles": "Herói Veterano", + "zamazentaHeroOfManyBattles": "Herói Veterano", + "zarudeDada": "Papa", + "enamorusIncarnate": "Materializado", + "squawkabillyGreenPlumage": "Plumas Verdes", + "squawkabillyBluePlumage": "Plumas Azuis", + "squawkabillyYellowPlumage": "Plumas Amarelas", + "squawkabillyWhitePlumage": "Plumas Brancas", + "tatsugiriCurly": "Curvado", + "tatsugiriDroopy": "Caído", + "tatsugiriStretchy": "Reto", + "gimmighoulChest": "Baú", + "gimmighoulRoaming": "Perambulante", + "koraidonApexBuild": "Forma Plena", + "koraidonLimitedBuild": "Forma Limitada", + "koraidonSprintingBuild": "Forma de Corrida", + "koraidonSwimmingBuild": "Forma de Nado", + "koraidonGlidingBuild": "Forma de Voo", + "miraidonUltimateMode": "Modo Pleno", + "miraidonLowPowerMode": "Modo Limitado", + "miraidonDriveMode": "Modo Terrestre", + "miraidonAquaticMode": "Modo Aquático", + "miraidonGlideMode": "Modo Aéreo", + "poltchageistCounterfeit": "Imitação", + "poltchageistArtisan": "Artesão", + "paldeaTaurosCombat": "Combate", + "paldeaTaurosBlaze": "Chamas", + "paldeaTaurosAqua": "Aquático" +} diff --git a/src/locales/pt_BR/pokemon-info-container.json b/src/locales/pt_BR/pokemon-info-container.json new file mode 100644 index 00000000000..dcf1fc4e0b5 --- /dev/null +++ b/src/locales/pt_BR/pokemon-info-container.json @@ -0,0 +1,7 @@ +{ + "moveset": "Movimentos", + "gender": "Gênero:", + "ability": "Habilidade:", + "nature": "Natureza:", + "form": "Forma:" +} \ No newline at end of file diff --git a/src/locales/pt_BR/pokemon-info-container.ts b/src/locales/pt_BR/pokemon-info-container.ts deleted file mode 100644 index 31b93d90daf..00000000000 --- a/src/locales/pt_BR/pokemon-info-container.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Movimentos", - "gender": "Gênero:", - "ability": "Habilidade:", - "nature": "Natureza:", - "epic": "Épico", - "rare": "Raro", - "common": "Comum", -} as const; diff --git a/src/locales/pt_BR/pokemon-info.ts b/src/locales/pt_BR/pokemon-info.json similarity index 82% rename from src/locales/pt_BR/pokemon-info.ts rename to src/locales/pt_BR/pokemon-info.json index a4af3f3e34a..a7a46b7a24e 100644 --- a/src/locales/pt_BR/pokemon-info.ts +++ b/src/locales/pt_BR/pokemon-info.json @@ -1,7 +1,5 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { +{ + "Stat": { "HP": "PS", "HPshortened": "PS", "ATK": "Ataque", @@ -16,9 +14,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDshortened": "Veloc.", "ACC": "Precisão", "EVA": "Evasão", + "HPStat": "PS" }, - - Type: { + "Type": { "UNKNOWN": "Desconhecido", "NORMAL": "Normal", "FIGHTING": "Lutador", @@ -39,5 +37,5 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DARK": "Sombrio", "FAIRY": "Fada", "STELLAR": "Estelar" - }, -} as const; + } +} diff --git a/src/locales/pt_BR/pokemon-summary.json b/src/locales/pt_BR/pokemon-summary.json new file mode 100644 index 00000000000..4c427dbac4f --- /dev/null +++ b/src/locales/pt_BR/pokemon-summary.json @@ -0,0 +1,44 @@ +{ + "pokemonInfo": "Info. Pokémon", + "status": "Status", + "powerAccuracyCategory": "Poder\nPrecisão\nCategoria", + "type": "Tipo", + "unknownTrainer": "Desconhecido", + "ot": "TO", + "nature": "natureza", + "expPoints": "Pontos EXP.", + "nextLv": "Próx. Nv.", + "cancel": "Cancelar", + "memoString": "Natureza {{natureFragment}},\n{{metFragment}}", + "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}}" + } +} diff --git a/src/locales/pt_BR/pokemon.ts b/src/locales/pt_BR/pokemon.json similarity index 99% rename from src/locales/pt_BR/pokemon.ts rename to src/locales/pt_BR/pokemon.json index b3151eabb29..f780d2accbd 100644 --- a/src/locales/pt_BR/pokemon.ts +++ b/src/locales/pt_BR/pokemon.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { +{ "bulbasaur": "Bulbasaur", "ivysaur": "Ivysaur", "venusaur": "Venusaur", @@ -1082,5 +1080,5 @@ export const pokemon: SimpleTranslationEntries = { "hisui_decidueye": "Decidueye", "paldea_tauros": "Tauros", "paldea_wooper": "Wooper", - "bloodmoon_ursaluna": "Ursaluna", -} as const; + "bloodmoon_ursaluna": "Ursaluna" +} \ No newline at end of file diff --git a/src/locales/pt_BR/run-history.json b/src/locales/pt_BR/run-history.json new file mode 100644 index 00000000000..74cc2c35d28 --- /dev/null +++ b/src/locales/pt_BR/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "Vitória!", + "defeatedWild": "Derrotado por ", + "defeatedTrainer": "Derrotado por ", + "defeatedTrainerDouble": "Derrotado por Dupla", + "defeatedRival": "Derrotado por Rival", + "defeated": "Derrotado", + "defeatedWild_female": "Derrotada por ", + "defeatedTrainer_female": "Derrotada por ", + "defeatedTrainerDouble_female": "Derrotada por Dupla", + "defeatedRival_female": "Derrotada por Rival", + "defeated_female": "Derrotada", + "luck": "Sorte", + "score": "Pontuação", + "mode": "Modo", + "challengeRules": "Regra(s)", + "challengeMonoGen1": "Ger. 1", + "challengeMonoGen2": "Ger. 2", + "challengeMonoGen3": "Ger. 3", + "challengeMonoGen4": "Ger. 4", + "challengeMonoGen5": "Ger. 5", + "challengeMonoGen6": "Ger. 6", + "challengeMonoGen7": "Ger. 7", + "challengeMonoGen8": "Ger. 8", + "challengeMonoGen9": "Ger. 9", + "playerItems": "Itens do Jogador", + "personalBest": "Recorde Pessoal!", + "SPDshortened": "Vel.", + "runInfo": "Info. do Jogo", + "money": "Dinheiro", + "runLength": "Duração do Jogo", + "viewHeldItems": "Itens Segurados", + "hallofFameText": "Bem-vindo ao Hall da Fama!", + "hallofFameText_female": "Bem-vinda ao Hall da Fama!", + "viewHallOfFame": "Veja o Hall da Fama!", + "viewEndingSplash": "Veja a arte final!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/save-slot-select-ui-handler.json b/src/locales/pt_BR/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..31fe28de691 --- /dev/null +++ b/src/locales/pt_BR/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "Substituir os dados desse slot?", + "loading": "Carregando...", + "wave": "Onda", + "lv": "Nv", + "empty": "Vazio" +} \ No newline at end of file diff --git a/src/locales/pt_BR/save-slot-select-ui-handler.ts b/src/locales/pt_BR/save-slot-select-ui-handler.ts deleted file mode 100644 index 6dee8a1a16a..00000000000 --- a/src/locales/pt_BR/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Substituir os dados desse slot?", - "loading": "Carregando...", - "wave": "Onda", - "lv": "Nv", - "empty": "Vazio", -} as const; diff --git a/src/locales/pt_BR/settings.ts b/src/locales/pt_BR/settings.json similarity index 87% rename from src/locales/pt_BR/settings.ts rename to src/locales/pt_BR/settings.json index 9d336cf0757..74f3918bed8 100644 --- a/src/locales/pt_BR/settings.ts +++ b/src/locales/pt_BR/settings.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { +{ "boy": "Menino", "girl": "Menina", "general": "Geral", @@ -15,6 +13,7 @@ export const settings: SimpleTranslationEntries = { "skipSeenDialogues": "Pular Diálogos Vistos", "battleStyle": "Estilo de Batalha", "enableRetries": "Habilitar Novas Tentativas", + "hideIvs": "Esconder scanner de IV", "tutorials": "Tutorial", "touchControls": "Controles de Toque", "vibrations": "Vibração", @@ -61,8 +60,10 @@ export const settings: SimpleTranslationEntries = { "playerGender": "Gênero do Jogador", "typeHints": "Dicas de Tipo", "masterVolume": "Volume Mestre", - "bgmVolume": "Volume de BGM", - "seVolume": "Volume de SE", + "bgmVolume": "Músicas", + "fieldVolume": "Ambiente", + "seVolume": "Ef. Sonoros", + "uiVolume": "Interface", "musicPreference": "Preferência de Música", "mixed": "Misto", "gamepadPleasePlug": "Conecte um controle ou pressione um botão", @@ -95,5 +96,12 @@ export const settings: SimpleTranslationEntries = { "mute": "Mudo", "controller": "Controle", "gamepadSupport": "Suporte para Controle", - "showBgmBar": "Show Music Names", -} as const; + "showBgmBar": "Exibir Nomes das Músicas", + "moveTouchControls": "Mover Controles de Toque", + "shopOverlayOpacity": "Opacidade da Loja", + "shopCursorTarget": "Alvo do Cursor da Loja", + "rewards": "Itens", + "reroll": "Atualizar", + "shop": "Loja", + "checkTeam": "Checar Time" +} diff --git a/src/locales/pt_BR/splash-messages.ts b/src/locales/pt_BR/splash-messages.json similarity index 91% rename from src/locales/pt_BR/splash-messages.ts rename to src/locales/pt_BR/splash-messages.json index d21945943a0..55c0b1b9e74 100644 --- a/src/locales/pt_BR/splash-messages.ts +++ b/src/locales/pt_BR/splash-messages.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { +{ "battlesWon": "Batalhas Ganhas!", "joinTheDiscord": "Junte-se ao Discord!", "infiniteLevels": "Níveis Infinitos!", @@ -34,4 +32,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Também Jogue Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", -} as const; + "breedersInSpace": "Criadores Pokémon no Espaço!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.json similarity index 75% rename from src/locales/pt_BR/starter-select-ui-handler.ts rename to src/locales/pt_BR/starter-select-ui-handler.json index eb2709a0da8..1d83e43f12c 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.json @@ -1,12 +1,7 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { +{ "confirmStartTeam": "Começar com esses Pokémon?", + "confirmExit": "Deseja sair?", + "invalidParty": "Essa equipe de iniciais não é válida!", "gen1": "G1", "gen2": "G2", "gen3": "G3", @@ -22,25 +17,29 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Natureza:", "eggMoves": "Mov. de Ovo", "addToParty": "Adicionar à equipe", + "removeFromParty": "Remover da Equipe", "toggleIVs": "Mostrar IVs", "manageMoves": "Mudar Movimentos", "manageNature": "Mudar Natureza", + "addToFavorites": "Adicionar aos Favoritos", + "removeFromFavorites": "Remover dos Favoritos", "useCandies": "Usar Doces", "selectNature": "Escolha uma natureza.", "selectMoveSwapOut": "Escolha um movimento para substituir.", "selectMoveSwapWith": "Escolha o movimento que substituirá", + "sameSpeciesEgg": "Comprar Ovo", "unlockPassive": "Aprender Passiva", "reduceCost": "Reduzir Custo", - "sameSpeciesEgg": "Comprar Ovo", "cycleShiny": ": » Shiny", "cycleForm": ": » Forma", "cycleGender": ": » Gênero", "cycleAbility": ": » Habilidade", "cycleNature": ": » Natureza", "cycleVariant": ": » Variante", + "goFilter": ": Ir para filtros", "enablePassive": "Ativar Passiva", "disablePassive": "Desativar Passiva", "locked": "Bloqueada", "disabled": "Desativada", "uncaught": "Não capturado" -}; +} \ No newline at end of file diff --git a/src/locales/pt_BR/status-effect.json b/src/locales/pt_BR/status-effect.json new file mode 100644 index 00000000000..5a851a0bdeb --- /dev/null +++ b/src/locales/pt_BR/status-effect.json @@ -0,0 +1,65 @@ +{ + "none": { + "name": "Nenhum", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + }, + "poison": { + "name": "Envenenamento", + "description": "envenenamento", + "obtain": "{{pokemonNameWithAffix}}\nfoi envenenado!", + "obtainSource": "{{pokemonNameWithAffix}}\nfoi envenenado por {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", + "overlap": "{{pokemonNameWithAffix}} já\nestá envenenado!", + "heal": "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" + }, + "toxic": { + "name": "Toxic", + "description": "envenenamento", + "obtain": "{{pokemonNameWithAffix}}\nfoi seriamente envenenado!", + "obtainSource": "{{pokemonNameWithAffix}} foi seriamente\nenvenenado por {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", + "overlap": "{{pokemonNameWithAffix}} já\nestá envenenado!", + "heal": "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" + }, + "paralysis": { + "name": "Paralisia", + "description": "paralisia", + "obtain": "{{pokemonNameWithAffix}} foi paralisado,\nTalvez ele não consiga se mover!", + "obtainSource": "{{pokemonNameWithAffix}} foi paralisado por {{sourceText}},\nTalvez ele não consiga se mover!", + "activation": "{{pokemonNameWithAffix}} está paralisado!\nEle não consegue se mover!", + "overlap": "{{pokemonNameWithAffix}} já\nestá paralisado!", + "heal": "{{pokemonNameWithAffix}} foi\ncurado da paralisia!" + }, + "sleep": { + "name": "Dormindo", + "description": "dormindo", + "obtain": "{{pokemonNameWithAffix}}\nadormeceu!", + "obtainSource": "{{pokemonNameWithAffix}}\ndormiu devido a {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} está dormindo profundamente.", + "overlap": "{{pokemonNameWithAffix}} já\nestá dormindo!", + "heal": "{{pokemonNameWithAffix}} acordou!" + }, + "freeze": { + "name": "Congelamento", + "description": "congelando", + "obtain": "{{pokemonNameWithAffix}}\nfoi congelado!", + "obtainSource": "{{pokemonNameWithAffix}}\nfoi congelado por {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} está\ncongelado!", + "overlap": "{{pokemonNameWithAffix}} já\nestá congelado!", + "heal": "{{pokemonNameWithAffix}} foi\ndescongelado!" + }, + "burn": { + "name": "Queimadura", + "description": "queimadura", + "obtain": "{{pokemonNameWithAffix}}\nfoi queimado!", + "obtainSource": "{{pokemonNameWithAffix}}\nfoi queimado por {{sourceText}}!", + "activation": "{{pokemonNameWithAffix}} foi ferido\npor sua queimadura!", + "overlap": "{{pokemonNameWithAffix}} já\nestá queimado!", + "heal": "{{pokemonNameWithAffix}} foi\ncurado de sua queimadura!" + } +} \ No newline at end of file diff --git a/src/locales/pt_BR/status-effect.ts b/src/locales/pt_BR/status-effect.ts deleted file mode 100644 index d99e2bd5ec1..00000000000 --- a/src/locales/pt_BR/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "Nenhum", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "Envenenamento", - description: "envenenamento", - obtain: "{{pokemonNameWithAffix}}\nfoi envenenado!", - obtainSource: "{{pokemonNameWithAffix}}\nfoi envenenado por {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", - overlap: "{{pokemonNameWithAffix}} já\nestá envenenado!", - heal: "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" - }, - toxic: { - name: "Toxic", - description: "envenenamento", - obtain: "{{pokemonNameWithAffix}}\nfoi seriamente envenenado!", - obtainSource: "{{pokemonNameWithAffix}} foi seriamente\nenvenenado por {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", - overlap: "{{pokemonNameWithAffix}} já\nestá envenenado!", - heal: "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" - }, - paralysis: { - name: "Paralisia", - description: "paralisia", - obtain: "{{pokemonNameWithAffix}} foi paralisado,\nTalvez ele não consiga se mover!", - obtainSource: "{{pokemonNameWithAffix}} foi paralisado por {{sourceText}},\nTalvez ele não consiga se mover!", - activation: "{{pokemonNameWithAffix}} está paralisado!\nEle não consegue se mover!", - overlap: "{{pokemonNameWithAffix}} já\nestá paralisado!", - heal: "{{pokemonNameWithAffix}} foi\ncurado da paralisia!" - }, - sleep: { - name: "Dormindo", - description: "dormindo", - obtain: "{{pokemonNameWithAffix}}\nadormeceu!", - obtainSource: "{{pokemonNameWithAffix}}\ndormiu devido a {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} está dormindo profundamente.", - overlap: "{{pokemonNameWithAffix}} já\nestá dormindo!", - heal: "{{pokemonNameWithAffix}} acordou!" - }, - freeze: { - name: "Congelamento", - description: "congelando", - obtain: "{{pokemonNameWithAffix}}\nfoi congelado!", - obtainSource: "{{pokemonNameWithAffix}}\nfoi congelado por {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} está\ncongelado!", - overlap: "{{pokemonNameWithAffix}} já\nestá congelado!", - heal: "{{pokemonNameWithAffix}} foi\ndescongelado!" - }, - burn: { - name: "Queimadura", - description: "queimadura", - obtain: "{{pokemonNameWithAffix}}\nfoi queimado!", - obtainSource: "{{pokemonNameWithAffix}}\nfoi queimado por {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} foi ferido\npor sua queimadura!", - overlap: "{{pokemonNameWithAffix}} já\nestá queimado!", - heal: "{{pokemonNameWithAffix}} foi\ncurado de sua queimadura!" - }, -} as const; diff --git a/src/locales/pt_BR/terrain.json b/src/locales/pt_BR/terrain.json new file mode 100644 index 00000000000..73df2b441ac --- /dev/null +++ b/src/locales/pt_BR/terrain.json @@ -0,0 +1,16 @@ +{ + "misty": "Enevoado", + "mistyStartMessage": "Uma névoa se espalhou pelo campo de batalha!", + "mistyClearMessage": "A névou sumiu do campo de batalha.", + "mistyBlockMessage": "{{pokemonNameWithAffix}} se envolveu com uma névoa protetora!", + "electric": "Elétrico", + "electricStartMessage": "Uma corrente elétrica se espalhou pelo campo de batalha!", + "electricClearMessage": "A eletricidade sumiu do campo de batalha.", + "grassy": "de Plantas", + "grassyStartMessage": "Grama cresceu para cobrir o campo de batalha!", + "grassyClearMessage": "A grama sumiu do campo de batalha.", + "psychic": "Psíquico", + "psychicStartMessage": "O campo de batalha ficou esquisito!", + "psychicClearMessage": "A esquisitice sumiu do campo de batalha!", + "defaultBlockMessage": "{{pokemonNameWithAffix}} está protegido pelo Terreno {{terrainName}}!" +} \ No newline at end of file diff --git a/src/locales/pt_BR/trainer-classes.json b/src/locales/pt_BR/trainer-classes.json new file mode 100644 index 00000000000..482265d00c6 --- /dev/null +++ b/src/locales/pt_BR/trainer-classes.json @@ -0,0 +1,131 @@ +{ + "ace_trainer": "Treinador Ás", + "ace_trainer_female": "Treinadora Ás", + "ace_duo": "Dupla Ás", + "artist": "Artista", + "artist_female": "Artista", + "backers": "Torcedores", + "backpacker": "Mochileiro", + "backpacker_female": "Mochileira", + "backpackers": "Mochileiros", + "baker": "Padeira", + "battle_girl": "Lutadora", + "beauty": "Modelo", + "beginners": "Iniciantes", + "biker": "Motoqueiro", + "black_belt": "Faixa Preta", + "breeder": "Criador", + "breeder_female": "Criadora", + "breeders": "Criadores", + "clerk": "Funcionário", + "clerk_female": "Funcionária", + "colleagues": "Funcionários", + "crush_kin": "Casal Lutador", + "cyclist": "Ciclista", + "cyclist_female": "Ciclista", + "cyclists": "Ciclistas", + "dancer": "Dançarino", + "dancer_female": "Dançarina", + "depot_agent": "Ferroviário", + "doctor": "Doutor", + "doctor_female": "Doutora", + "firebreather": "Cospe-Fogo", + "fisherman": "Pescador", + "fisherman_female": "Pescadora", + "gentleman": "Cavalheiro", + "guitarist": "Guitarrista", + "guitarist_female": "Guitarrista", + "harlequin": "Arlequim", + "hiker": "Montanhista", + "hooligans": "Bandoleiro", + "hoopster": "Jogador de Basquete", + "infielder": "Jogador de Baseball", + "janitor": "Faxineiro", + "lady": "Dama", + "lass": "Senhorita", + "linebacker": "Zagueiro", + "maid": "Doméstica", + "madame": "Madame", + "medical_team": "Equipe Médica", + "musician": "Músico", + "hex_maniac": "Ocultista", + "nurse": "Enfermeira", + "nursery_aide": "Professora do Berçário", + "officer": "Policial", + "parasol_lady": "Moça de Sombrinha", + "pilot": "Piloto", + "pokéfan": "Pokefã", + "pokéfan_female": "Pokéfã", + "pokéfan_family": "Família Pokefã", + "preschooler": "Menino do Prezinho", + "preschooler_female": "Menina do Prezinho", + "preschoolers": "Alunos do Prezinho", + "psychic": "Médium", + "psychic_female": "Médium", + "psychics": "Médiuns", + "pokémon_ranger": "Guarda Pokémon", + "pokémon_ranger_female": "Guarda Pokémon", + "pokémon_rangers": "Guardas Pokémon", + "ranger": "Guarda", + "restaurant_staff": "Equipe do Restaurante", + "rich": "Burguês", + "rich_female": "Burguesa", + "rich_boy": "Riquinho", + "rich_couple": "Casal Burguês", + "rich_kid": "Garoto Rico", + "rich_kid_female": "Garota Rica", + "rich_kids": "Garotos Ricos", + "roughneck": "Arruaceiro", + "sailor": "Marinheiro", + "scientist": "Cientista", + "scientist_female": "Cientista", + "scientists": "Cientistas", + "smasher": "Tenista", + "snow_worker": "Operário da Neve", + "snow_worker_female": "Operária da Neve", + "striker": "Atacante", + "school_kid": "Estudante", + "school_kid_female": "Estudante", + "school_kids": "Estudantes", + "swimmer": "Nadador", + "swimmer_female": "Nadadora", + "swimmers": "Nadadores", + "twins": "Gêmeos", + "veteran": "Veterano", + "veteran_female": "Veterana", + "veteran_duo": "Dupla Veterana", + "waiter": "Garçom", + "waitress": "Garçonete", + "worker": "Operário", + "worker_female": "Operária", + "workers": "Operários", + "youngster": "Jovem", + "rocket_grunt": "Capanga da Equipe Rocket", + "rocket_grunts": "Capangas da Equipe Rocket", + "rocket_grunt_female": "Capanga da Equipe Rocket", + "magma_grunt": "Capanga da Equipe Magma", + "magma_grunt_female": "Capanga da Equipe Magma", + "magma_grunts": "Capangas da Equipe Magma", + "aqua_grunt": "Capanga da Equipe Aqua", + "aqua_grunt_female": "Capanga da Equipe Aqua", + "aqua_grunts": "Capangas da Equipe Aqua", + "galactic_grunt": "Capanga da Equipe Galáctica", + "galactic_grunt_female": "Capanga da Equipe Galáctica", + "galactic_grunts": "Capangas da Equipe Galáctica", + "plasma_grunt": "Capanga da Equipe Plasma", + "plasma_grunt_female": "Capanga da Equipe Plasma", + "plasma_grunts": "Capangas da Equipe Plasma", + "flare_grunt": "Capanga da Equipe Flare", + "flare_grunt_female": "Capanga da Equipe Flare", + "flare_grunts": "Capangas da Equipe Flare", + "aether_grunt": "Funcionário da Fundação Aether", + "aether_grunt_female": "Funcionária da Fundação Aether", + "aether_grunts": "Funcionários da Fundação Aether", + "skull_grunt": "Capanga da Equipe Skull", + "skull_grunt_female": "Capanga da Equipe Skull", + "skull_grunts": "Capangas da Equipe Skull", + "macro_grunt": "Treinador da Macro Cosmos", + "macro_grunt_female": "Treinadora da Macro Cosmos", + "macro_grunts": "Treinadores da Macro Cosmos" + +} diff --git a/src/locales/pt_BR/trainer-names.json b/src/locales/pt_BR/trainer-names.json new file mode 100644 index 00000000000..5500e2ddb46 --- /dev/null +++ b/src/locales/pt_BR/trainer-names.json @@ -0,0 +1,162 @@ +{ + "brock": "Brock", + "misty": "Misty", + "lt_surge": "Ten. Surge", + "erika": "Erika", + "janine": "Janine", + "sabrina": "Sabrina", + "blaine": "Blaine", + "giovanni": "Giovanni", + "falkner": "Falkner", + "bugsy": "Bugsy", + "whitney": "Whitney", + "morty": "Morty", + "chuck": "Chuck", + "jasmine": "Jasmine", + "pryce": "Pryce", + "clair": "Clair", + "roxanne": "Roxanne", + "brawly": "Brawly", + "wattson": "Wattson", + "flannery": "Flannery", + "norman": "Norman", + "winona": "Winona", + "tate": "Tate", + "liza": "Liza", + "juan": "Juan", + "roark": "Roark", + "gardenia": "Gardenia", + "maylene": "Maylene", + "crasher_wake": "Demolidor Wake", + "fantina": "Fantina", + "byron": "Byron", + "candice": "Candice", + "volkner": "Volkner", + "cilan": "Cilan", + "chili": "Chili", + "cress": "Cress", + "cheren": "Cheren", + "lenora": "Lenora", + "roxie": "Roxie", + "burgh": "Burgh", + "elesa": "Elesa", + "clay": "Clay", + "skyla": "Skyla", + "brycen": "Brycen", + "drayden": "Drayden", + "marlon": "Marlon", + "viola": "Viola", + "grant": "Grant", + "korrina": "Korrina", + "ramos": "Ramos", + "clemont": "Clemont", + "valerie": "Valerie", + "olympia": "Olympia", + "wulfric": "Wulfric", + "milo": "Milo", + "nessa": "Nessa", + "kabu": "Kabu", + "bea": "Bea", + "allister": "Allister", + "opal": "Opal", + "bede": "Bede", + "gordie": "Gordie", + "melony": "Melony", + "piers": "Piers", + "marnie": "Marnie", + "raihan": "Raihan", + "katy": "Katy", + "brassius": "Brassius", + "iono": "Iono", + "kofu": "Kofu", + "larry": "Larry", + "ryme": "Ryme", + "tulip": "Tulip", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agatha", + "lance": "Lance", + "will": "Will", + "koga": "Koga", + "karen": "Karen", + "sidney": "Sidney", + "phoebe": "Phoebe", + "glacia": "Glacia", + "drake": "Drake", + "aaron": "Aaron", + "bertha": "Bertha", + "flint": "Flint", + "lucian": "Lucian", + "shauntal": "Shauntal", + "marshal": "Marshal", + "grimsley": "Grimsley", + "caitlin": "Caitlin", + "malva": "Malva", + "siebold": "Siebold", + "wikstrom": "Wikstrom", + "drasna": "Drasna", + "hala": "Hala", + "molayne": "Molayne", + "olivia": "Olivia", + "acerola": "Acerola", + "kahili": "Kahili", + "rika": "Rika", + "poppy": "Poppy", + "hassel": "Hassel", + "crispin": "Crispin", + "amarys": "Amarys", + "lacey": "Lacey", + "drayton": "Drayton", + "blue": "Blue", + "red": "Red", + "steven": "Steven", + "wallace": "Wallace", + "cynthia": "Cynthia", + "alder": "Alder", + "iris": "Iris", + "diantha": "Diantha", + "hau": "Hau", + "geeta": "Geeta", + "nemona": "Nemona", + "kieran": "Kieran", + "leon": "Leon", + "rival": "Finn", + "rival_female": "Ivy", + "archer": "Archer", + "ariana": "Ariana", + "proton": "Proton", + "petrel": "Petrel", + "tabitha": "Tabitha", + "courtney": "Courtney", + "shelly": "Shelly", + "matt": "Matt", + "mars": "Mars", + "jupiter": "Jupiter", + "saturn": "Saturn", + "zinzolin": "Zinzolin", + "rood": "Rood", + "xerosic": "Xerosic", + "bryony": "Bryony", + "faba": "Faba", + "plumeria": "Plumeria", + "oleana": "Oleana", + "maxie": "Maxie", + "archie": "Archie", + "cyrus": "Cyrus", + "ghetsis": "Ghetsis", + "lysandre": "Lysandre", + "lusamine": "Lusamine", + "guzma": "Guzma", + "rose": "Rose", + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie" +} diff --git a/src/locales/pt_BR/trainer-titles.json b/src/locales/pt_BR/trainer-titles.json new file mode 100644 index 00000000000..701c2e143fa --- /dev/null +++ b/src/locales/pt_BR/trainer-titles.json @@ -0,0 +1,38 @@ +{ + "elite_four": "Elite dos Quatro", + "elite_four_female": "Elite dos Quatro", + "gym_leader": "Líder de Ginásio", + "gym_leader_female": "Líder de Ginásio", + "gym_leader_double": "Líderes de Ginásio", + "champion": "Campeão", + "champion_female": "Campeã", + "champion_double": "Dupla Campeã", + "rival": "Rival", + "professor": "Professor", + "frontier_brain": "Cérebro da Fronteira", + "rocket_boss": "Chefe da Equipe Rocket", + "magma_boss": "Chefe da Equipe Magma", + "aqua_boss": "Chefe da Equipe Aqua", + "galactic_boss": "Chefe da Equipe Galáctica", + "plasma_boss": "Chefe da Equipe Plasma", + "flare_boss": "Chefe da Equipe Flare", + "aether_boss": "Presidente Aether", + "skull_boss": "Chefe da Equipe Skull", + "macro_boss": "Presidente da Macro Cosmos", + + "rocket_admin": "Admin da Equipe Rocket", + "rocket_admin_female": "Admin da Equipe Rocket", + "magma_admin": "Admin da Equipe Magma", + "magma_admin_female": "Admin da Equipe Magma", + "aqua_admin": "Admin da Equipe Aqua", + "aqua_admin_female": "Admin da Equipe Aqua", + "galactic_commander": "Comandante da Equipe Galáctica", + "galactic_commander_female": "Comandante da Equipe Galáctica", + "plasma_sage": "Sábio da Equipe Plasma", + "plasma_admin": "Admin da Equipe Plasma", + "flare_admin": "Admin da Equipe Flare", + "flare_admin_female": "Admin da Equipe Flare", + "aether_admin": "Admin da Fundação Aether", + "skull_admin": "Admin da Equipe Skull", + "macro_admin": "Macro Cosmos" +} diff --git a/src/locales/pt_BR/trainers.ts b/src/locales/pt_BR/trainers.ts deleted file mode 100644 index 57fbe220412..00000000000 --- a/src/locales/pt_BR/trainers.ts +++ /dev/null @@ -1,285 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "elite_four": "Elite dos Quatro", - "elite_four_female": "Elite dos Quatro", - "gym_leader": "Líder de Ginásio", - "gym_leader_female": "Líder de Ginásio", - "gym_leader_double": "Líderes de Ginásio", - "champion": "Campeão", - "champion_female": "Campeã", - "champion_double": "Dupla Campeã", - "rival": "Rival", - "professor": "Professor", - "frontier_brain": "Cérebro da Fronteira", - "rocket_boss": "Chefe da Equipe Rocket", - "magma_boss": "Chefe da Equipe Magma", - "aqua_boss": "Chefe da Equipe Aqua", - "galactic_boss": "Chefe da Equipe Galáctica", - "plasma_boss": "Chefe da Equipe Plasma", - "flare_boss": "Chefe da Equipe Flare", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Treinador Ás", - "ace_trainer_female": "Treinadora Ás", - "ace_duo": "Dupla Ás", - "artist": "Artista", - "artist_female": "Artista", - "backpackers": "Mochileiros", - "backers": "Torcedores", - "backpacker": "Mochileiro", - "backpacker_female": "Mochileira", - "baker": "Padeira", - "battle_girl": "Lutadora", - "beauty": "Modelo", - "beginners": "Iniciantes", - "biker": "Motoqueiro", - "black_belt": "Faixa Preta", - "breeder": "Criador", - "breeder_female": "Criadora", - "breeders": "Criadores", - "clerk": "Funcionário", - "clerk_female": "Funcionária", - "colleagues": "Funcionários", - "crush_kin": "Casal Lutador", - "cyclist": "Ciclista", - "cyclist_female": "Ciclista", - "cyclists": "Ciclistas", - "dancer": "Dançarino", - "dancer_female": "Dançarina", - "depot_agent": "Ferroviário", - "doctor": "Doutor", - "doctor_female": "Doutora", - "firebreather": "Cospe-Fogo", - "fishermen": "Pescador", - "fishermen_female": "Pescadora", - "gentleman": "Cavalheiro", - "guitarist": "Guitarrista", - "guitarist_female": "Guitarrista", - "harlequin": "Arlequim", - "hiker": "Montanhista", - "hooligans": "Bandoleiro", - "hoopster": "Jogador de Basquete", - "infielder": "Jogador de Baseball", - "janitor": "Faxineiro", - "lady": "Dama", - "lass": "Senhorita", - "linebacker": "Zagueiro", - "maid": "Doméstica", - "madame": "Madame", - "medical_team": "Equipe Médica", - "musician": "Músico", - "hex_maniac": "Ocultista", - "nurse": "Enfermeira", - "nursery_aide": "Professora do Berçário", - "officer": "Policial", - "parasol_lady": "Moça de Sombrinha", - "pilot": "Piloto", - "pokéfan": "Pokefã", - "pokéfan_female": "Pokéfã", - "pokéfan_family": "Família Pokefã", - "preschooler": "Menino do Prezinho", - "preschooler_female": "Menina do Prezinho", - "preschoolers": "Alunos do Prezinho", - "psychic": "Médium", - "psychic_female": "Médium", - "psychics": "Médiuns", - "pokémon_ranger": "Guarda Pokémon", - "pokémon_ranger_female": "Guarda Pokémon", - "pokémon_rangers": "Guardas Pokémon", - "ranger": "Guarda", - "restaurant_staff": "Equipe do Restaurante", - "rich": "Burguês", - "rich_female": "Burguesa", - "rich_boy": "Riquinho", - "rich_couple": "Casal Burguês", - "rich_kid": "Garoto Rico", - "rich_kid_female": "Garota Rica", - "rich_kids": "Garotos Ricos", - "roughneck": "Arruaceiro", - "sailor": "Marinheiro", - "scientist": "Cientista", - "scientist_female": "Cientista", - "scientists": "Cientistas", - "smasher": "Tenista", - "snow_worker": "Operário da Neve", - "snow_worker_female": "Operária da Neve", - "striker": "Atacante", - "school_kid": "Estudante", - "school_kid_female": "Estudante", - "school_kids": "Estudantes", - "swimmer": "Nadador", - "swimmer_female": "Nadadora", - "swimmers": "Nadadores", - "twins": "Gêmeos", - "veteran": "Veterano", - "veteran_female": "Veterana", - "veteran_duo": "Dupla Veterana", - "waiter": "Garçom", - "waitress": "Garçonete", - "worker": "Operário", - "worker_female": "Operária", - "workers": "Operários", - "youngster": "Jovem", - "rocket_grunt": "Recruta da Equipe Rocket", - "rocket_grunt_female": "Recruta da Equipe Rocket", - "magma_grunt": "Recruta da Equipe Magma", - "magma_grunt_female": "Recruta da Equipe Magma", - "aqua_grunt": "Recruta da Equipe Aqua", - "aqua_grunt_female": "Recruta da Equipe Aqua", - "galactic_grunt": "Recruta da Equipe Galáctica", - "galactic_grunt_female": "Recruta da Equipe Galáctica", - "plasma_grunt": "Recruta da Equipe Plasma", - "plasma_grunt_female": "Recruta da Equipe Plasma", - "flare_grunt": "Recruta da Equipe Flare", - "flare_grunt_female": "Recruta da Equipe Flare", -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Ten. Surge", - "erika": "Erika", - "janine": "Janine", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Falkner", - "bugsy": "Bugsy", - "whitney": "Whitney", - "morty": "Morty", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Pryce", - "clair": "Clair", - "roxanne": "Roxanne", - "brawly": "Brawly", - "wattson": "Wattson", - "flannery": "Flannery", - "norman": "Norman", - "winona": "Winona", - "tate": "Tate", - "liza": "Liza", - "juan": "Juan", - "roark": "Roark", - "gardenia": "Gardenia", - "maylene": "Maylene", - "crasher_wake": "Demolidor Wake", - "fantina": "Fantina", - "byron": "Byron", - "candice": "Candice", - "volkner": "Volkner", - "cilan": "Cilan", - "chili": "Chili", - "cress": "Cress", - "cheren": "Cheren", - "lenora": "Lenora", - "roxie": "Roxie", - "burgh": "Burgh", - "elesa": "Elesa", - "clay": "Clay", - "skyla": "Skyla", - "brycen": "Brycen", - "drayden": "Drayden", - "marlon": "Marlon", - "viola": "Viola", - "grant": "Grant", - "korrina": "Korrina", - "ramos": "Ramos", - "clemont": "Clemont", - "valerie": "Valerie", - "olympia": "Olympia", - "wulfric": "Wulfric", - "milo": "Milo", - "nessa": "Nessa", - "kabu": "Kabu", - "bea": "Bea", - "allister": "Allister", - "opal": "Opal", - "bede": "Bede", - "gordie": "Gordie", - "melony": "Melony", - "piers": "Piers", - "marnie": "Marnie", - "raihan": "Raihan", - "katy": "Katy", - "brassius": "Brassius", - "iono": "Iono", - "kofu": "Kofu", - "larry": "Larry", - "ryme": "Ryme", - "tulip": "Tulip", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Will", - "koga": "Koga", - "karen": "Karen", - "sidney": "Sidney", - "phoebe": "Phoebe", - "glacia": "Glacia", - "drake": "Drake", - "aaron": "Aaron", - "bertha": "Bertha", - "flint": "Flint", - "lucian": "Lucian", - "shauntal": "Shauntal", - "marshal": "Marshal", - "grimsley": "Grimsley", - "caitlin": "Caitlin", - "malva": "Malva", - "siebold": "Siebold", - "wikstrom": "Wikstrom", - "drasna": "Drasna", - "hala": "Hala", - "molayne": "Molayne", - "olivia": "Olivia", - "acerola": "Acerola", - "kahili": "Kahili", - "rika": "Rika", - "poppy": "Poppy", - "hassel": "Hassel", - "crispin": "Crispin", - "amarys": "Amarys", - "lacey": "Lacey", - "drayton": "Drayton", - "blue": "Blue", - "red": "Red", - "steven": "Steven", - "wallace": "Wallace", - "cynthia": "Cynthia", - "alder": "Alder", - "iris": "Iris", - "diantha": "Diantha", - "hau": "Hau", - "geeta": "Geeta", - "nemona": "Nemona", - "kieran": "Kieran", - "leon": "Leon", - "rival": "Finn", - "rival_female": "Ivy", - "maxie": "Maxie", - "archie": "Archie", - "cyrus": "Cyrus", - "ghetsis": "Ghetsis", - "lysandre": "Lysandre", - - // Double Names - "blue_red_double": "Blue & Red", - "red_blue_double": "Red & Blue", - "tate_liza_double": "Tate & Liza", - "liza_tate_double": "Liza & Tate", - "steven_wallace_double": "Steven & Wallace", - "wallace_steven_double": "Wallace & Steven", - "alder_iris_double": "Alder & Iris", - "iris_alder_double": "Iris & Alder", - "marnie_piers_double": "Marnie & Piers", - "piers_marnie_double": "Piers & Marnie", -} as const; diff --git a/src/locales/pt_BR/tutorial.json b/src/locales/pt_BR/tutorial.json new file mode 100644 index 00000000000..92ea0dd080f --- /dev/null +++ b/src/locales/pt_BR/tutorial.json @@ -0,0 +1,10 @@ +{ + "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\\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": "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/pt_BR/tutorial.ts b/src/locales/pt_BR/tutorial.ts deleted file mode 100644 index a64a7458881..00000000000 --- a/src/locales/pt_BR/tutorial.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - "intro": `Bem-vindo ao PokéRogue! Este é um jogo Pokémon feito por fãs focado em batalhas com elementos roguelite. - $Este jogo não é monetizado e não reivindicamos propriedade de Pokémon nem dos ativos protegidos - $por direitos autorais usados. - $O jogo é um trabalho em andamento, mas é totalmente jogável. - $Para relatórios de bugs, use a comunidade no Discord. - $Se o jogo estiver rodando lentamente, certifique-se de que a 'Aceleração de hardware' esteja ativada - $nas configurações do seu navegador.`, - - "accessMenu": `Para acessar o menu, pressione M ou Esc. - $O menu contém configurações e diversas funções.`, - - "menu": `A partir deste menu, você pode acessar as configurações. - $Nas configurações, você pode alterar a velocidade do jogo, - $o estilo da janela, entre outras opções. - $Existem também vários outros recursos disponíveis aqui. - $Não deixe de conferir todos eles!`, - - "starterSelect": `Aqui você pode escolher seus iniciais apertando a tecla Z ou\na Barra de Espaço. - $Esses serão os primeiro Pokémon da sua equipe. - $Cada inicial tem seu custo. Sua equipe pode ter até 6\nmembros, desde que a soma dos custos não ultrapasse 10. - $Você pode escolher o gênero, a habilidade\ne até a forma do seu inicial. - $Essas opções dependem das variantes dessa\nespécie que você já capturou ou chocou. - $Os IVs de cada inicial são os melhores de todos os Pokémon\ndaquela espécie que você já capturou ou chocou. - $Sempre capture vários Pokémon de várias espécies!`, - - "pokerus": `Todo dia, 3 Pokémon iniciais ficam com uma borda roxa. - $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. - $Seus Pokémon voltam a suas Poké Bolas antes de batalhas contra treinadores e de entrar em um novo bioma. - $Para ver as mudanças de atributos dos Pokémon em campo, mantena C ou Shift pressionado durante a batalha.`, - - "selectItem": `Após cada batalha, você pode escolher entre 3 itens aleatórios. - $Você pode escolher apenas um deles. - $Esses itens variam entre consumíveis, itens de segurar e itens passivos permanentes. - $A maioria dos efeitos de itens não consumíveis podem ser acumulados. - $Alguns itens só aparecerão se puderem ser usados, como os itens de evolução. - $Você também pode transferir itens de segurar entre os Pokémon utilizando a opção "Transfer". - $A opção de transferir irá aparecer no canto inferior direito assim que você obter um item de segurar. - $Você pode comprar itens consumíveis com dinheiro, e sua variedade aumentará conforme você for mais longe. - $Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolhê-lo, a próxima batalha começará.`, - - "eggGacha": `Aqui você pode trocar seus vouchers\npor ovos de Pokémon. - $Ovos ficam mais próximos de chocar após cada batalha.\nOvos mais raros demoram mais para chocar. - $Pokémon chocados não serão adicionados a sua equipe,\nmas sim aos seus iniciais. - $Pokémon chocados geralmente possuem IVs melhores\nque Pokémon selvagens. - $Alguns Pokémon só podem ser obtidos através de seus ovos. - $Temos 3 máquinas, cada uma com seu bônus específico,\nentão escolha a que mais lhe convém!`, -} as const; diff --git a/src/locales/pt_BR/voucher.ts b/src/locales/pt_BR/voucher.json similarity index 65% rename from src/locales/pt_BR/voucher.ts rename to src/locales/pt_BR/voucher.json index 8c115caa810..c33dfa20e0f 100644 --- a/src/locales/pt_BR/voucher.ts +++ b/src/locales/pt_BR/voucher.json @@ -1,11 +1,9 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { - "vouchers": "Vouchers", - "eggVoucher": "Voucher de Ovo", - "eggVoucherPlus": "Voucher de Ovo Plus", - "eggVoucherPremium": "Voucher de Ovo Premium", - "eggVoucherGold": "Voucher de Ovo Dourado", - "locked": "Bloqueado", - "defeatTrainer": "Derrote {{trainerName}}" -} as const; +{ + "vouchers": "Vouchers", + "eggVoucher": "Voucher de Ovo", + "eggVoucherPlus": "Voucher de Ovo Plus", + "eggVoucherPremium": "Voucher de Ovo Premium", + "eggVoucherGold": "Voucher de Ovo Dourado", + "locked": "Bloqueado", + "defeatTrainer": "Derrote {{trainerName}}" +} \ No newline at end of file diff --git a/src/locales/pt_BR/weather.ts b/src/locales/pt_BR/weather.json similarity index 84% rename from src/locales/pt_BR/weather.ts rename to src/locales/pt_BR/weather.json index 6aaab6d3cd9..54b929da0b9 100644 --- a/src/locales/pt_BR/weather.ts +++ b/src/locales/pt_BR/weather.json @@ -1,44 +1,32 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { +{ "sunnyStartMessage": "A luz do sol ficou clara!", "sunnyLapseMessage": "A luz do sol está forte.", "sunnyClearMessage": "A luz do sol sumiu.", - "rainStartMessage": "Começou a chover!", "rainLapseMessage": "A chuva continua forte.", "rainClearMessage": "A chuva parou.", - "sandstormStartMessage": "Uma tempestade de areia se formou!", "sandstormLapseMessage": "A tempestade de areia é violenta.", "sandstormClearMessage": "A tempestade de areia diminuiu.", "sandstormDamageMessage": "{{pokemonNameWithAffix}} é atingido\npela tempestade de areia!", - "hailStartMessage": "Começou a chover granizo!", "hailLapseMessage": "Granizo cai do céu.", "hailClearMessage": "O granizo parou.", "hailDamageMessage": "{{pokemonNameWithAffix}} é atingido\npelo granizo!", - "snowStartMessage": "Começou a nevar!", "snowLapseMessage": "A neve continua caindo.", "snowClearMessage": "Parou de nevar.", - "fogStartMessage": "Uma névoa densa se formou!", "fogLapseMessage": "A névoa continua forte.", "fogClearMessage": "A névoa sumiu.", - "heavyRainStartMessage": "Um temporal começou!", "heavyRainLapseMessage": "O temporal continua forte.", "heavyRainClearMessage": "O temporal parou.", - "harshSunStartMessage": "A luz do sol está escaldante!", "harshSunLapseMessage": "A luz do sol é intensa.", "harshSunClearMessage": "A luz do sol enfraqueceu.", - "strongWindsStartMessage": "Ventos fortes apareceram!", "strongWindsLapseMessage": "Os ventos fortes continuam.", - "strongWindsClearMessage": "Os ventos fortes diminuíram.", -}; + "strongWindsEffectMessage": "A corrente de ar misteriosa enfraqueceu o ataque!", + "strongWindsClearMessage": "Os ventos fortes diminuíram." +} \ No newline at end of file diff --git a/src/locales/zh_CN/ability-trigger.json b/src/locales/zh_CN/ability-trigger.json new file mode 100644 index 00000000000..0bb9c3a56ef --- /dev/null +++ b/src/locales/zh_CN/ability-trigger.json @@ -0,0 +1,64 @@ +{ + "blockRecoilDamage": "{{pokemonName}}的{{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}}被折磨着!", + "costar": "{{pokemonName}}复制了{{allyName}}的能力变化!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}}因为{{abilityName}}\n避免了伤害!", + "perishBody": "因为{{pokemonName}}的{{abilityName}}\n双方将在3回合后灭亡!", + "poisonHeal": "{{pokemonName}}因{{abilityName}}\n回复了少许HP!", + "trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}!", + "windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!", + "quickDraw": "因为速击效果发动,\n{{pokemonName}}比平常出招更快了!", + "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的画皮脱落了!", + "blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害!", + "fullHpResistType": "{{pokemonNameWithAffix}}\n让甲壳发出光辉,使属性相克发生扭曲!", + "moveImmunity": "对{{pokemonNameWithAffix}}没有效果!", + "reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", + "postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使对方受到了伤害!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}}\n互换了各自的特性!", + "postDefendAbilityGive": "因为{{pokemonNameWithAffix}}\n对方的特性变成了{{abilityName}}!", + "postDefendMoveDisable": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!", + "pokemonTypeChange": "{{pokemonNameWithAffix}}\n变成了{{moveType}}属性!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}}从{{defenderName}}那里\n夺取了{{stolenItemType}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}}从{{attackerName}}那里\n夺取了{{stolenItemType}}!", + "copyFaintedAllyAbility": "继承了{{pokemonNameWithAffix}}的\n{{abilityName}}!", + "intimidateImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}没有受到威吓!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}}喝光了\n{{pokemonName}}泡的茶!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}的\n能力变化消失了!", + "postSummonTransform": "{{pokemonNameWithAffix}}\n变身成了{{targetName}}!", + "protectStat": "因{{pokemonNameWithAffix}}的{{abilityName}}\n{{statName}}不会降低!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}因{{abilityName}}\n{{statusEffectName}}没有效果!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n异常状态没有效果!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n而不会{{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}}读取了\n{{moveName}}!", + "frisk": "{{pokemonNameWithAffix}}察觉到了\n{{opponentName}}的{{opponentAbilityName}}!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}}\n因{{abilityName}}而受到了伤害!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}\n收获了{{berryName}}!", + "postTurnHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", + "fetchBall": "{{pokemonNameWithAffix}}\n捡回了{{pokeballName}}!", + "healFromBerryUse": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了HP!", + "arenaTrap": "因{{pokemonNameWithAffix}}的{{abilityName}}\n而无法进行替换!", + "postBattleLoot": "{{pokemonNameWithAffix}}捡到了\n{{itemName}}!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使对方受到了伤害!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使对方受到了伤害!", + "postSummonPressure": "从{{pokemonNameWithAffix}}的身上\n感到了一种压迫感!", + "weatherEffectDisappeared": "天气的影响消失了!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}\n打破了常规!", + "postSummonAnticipation": "{{pokemonNameWithAffix}}\n发抖了!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}}\n正在释放炽焰气场!", + "postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在释放溅射气场!", + "postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在释放暗黑气场!", + "postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在释放妖精气场!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}}\n压制了所有气场!", + "postSummonNeutralizingGas": "周围充满了\n{{pokemonNameWithAffix}}的化学变化气体!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}的灾祸之鼎\n令周围的宝可梦的{{statName}}减弱了!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}的灾祸之剑\n令周围的宝可梦的{{statName}}减弱了!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的灾祸之简\n令周围的宝可梦的{{statName}}减弱了!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的灾祸之玉\n令周围的宝可梦的{{statName}}减弱了!", + "preventBerryUse": "{{pokemonNameWithAffix}}因太紧张\n而无法食用树果!" +} diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts deleted file mode 100644 index a9d7fa5b202..00000000000 --- a/src/locales/zh_CN/ability-trigger.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}}的{{abilityName}}\n抵消了反作用力!", - "badDreams": "{{pokemonName}}被折磨着!", - "costar": "{{pokemonName}}复制了{{allyName}}的能力变化!", - "iceFaceAvoidedDamage": "{{pokemonName}}因为{{abilityName}}\n避免了伤害!", - "trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}!", - "windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!", - "quickDraw":"因为速击效果发动,\n{{pokemonName}}比平常出招更快了!", -} as const; diff --git a/src/locales/zh_CN/ability.json b/src/locales/zh_CN/ability.json new file mode 100644 index 00000000000..7c70c84f55c --- /dev/null +++ b/src/locales/zh_CN/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "恶臭", + "description": "通过释放臭臭的气味,在攻击的时\n候,有时会使对手畏缩。" + }, + "drizzle": { + "name": "降雨", + "description": "出场时,会将天气变为下雨。" + }, + "speedBoost": { + "name": "加速", + "description": "每一回合速度会变快。" + }, + "battleArmor": { + "name": "战斗盔甲", + "description": "被坚硬的甲壳守护着,不会被对手\n的攻击击中要害。" + }, + "sturdy": { + "name": "结实", + "description": "在HP全满时,即使受到招式攻击\n,也不会被一击打倒。一击必杀的\n招式也没有效果。" + }, + "damp": { + "name": "湿气", + "description": "通过把周围都弄湿,使谁都无法使\n用自爆等爆炸类的招式。" + }, + "limber": { + "name": "柔软", + "description": "因为身体柔软,不会变为麻痹状态\n。" + }, + "sandVeil": { + "name": "沙隐", + "description": "在沙暴的时候,闪避率会提高。" + }, + "static": { + "name": "静电", + "description": "身上带有静电,有时会让接触到的\n对手麻痹。" + }, + "voltAbsorb": { + "name": "蓄电", + "description": "受到电属性的招式攻击时,不会受\n到伤害,而是会回复。" + }, + "waterAbsorb": { + "name": "储水", + "description": "受到水属性的招式攻击时,不会受\n到伤害,而是会回复。" + }, + "oblivious": { + "name": "迟钝", + "description": "因为感觉迟钝,不会变为着迷和被\n挑衅状态。对威吓也毫不动摇。" + }, + "cloudNine": { + "name": "无关天气", + "description": "任何天气的影响都会消失。" + }, + "compoundEyes": { + "name": "复眼", + "description": "因为拥有复眼,招式的命中率会提\n高。" + }, + "insomnia": { + "name": "不眠", + "description": "因为有着睡不着的体质,所以不会\n陷入睡眠状态。" + }, + "colorChange": { + "name": "变色", + "description": "自己的属性会变为从对手处所受招\n式的属性。" + }, + "immunity": { + "name": "免疫", + "description": "因为体内拥有免疫能力,不会变为\n中毒状态。" + }, + "flashFire": { + "name": "引火", + "description": "受到火属性的招式攻击时,吸收火\n焰,自己使出的火属性招式会变强\n。" + }, + "shieldDust": { + "name": "鳞粉", + "description": "被鳞粉守护着,不会受到招式的追\n加效果影响。" + }, + "ownTempo": { + "name": "我行我素", + "description": "因为我行我素,不会变为混乱状态\n。对威吓也毫不动摇。" + }, + "suctionCups": { + "name": "吸盘", + "description": "用吸盘牢牢贴在地面上,让替换宝\n可梦的招式和道具无效。" + }, + "intimidate": { + "name": "威吓", + "description": "出场时威吓对手,让其退缩,降低\n对手的攻击。" + }, + "shadowTag": { + "name": "踩影", + "description": "踩住对手的影子使其无法逃走或替\n换。" + }, + "roughSkin": { + "name": "粗糙皮肤", + "description": "受到攻击时,用粗糙的皮肤弄伤接\n触到自己的对手。" + }, + "wonderGuard": { + "name": "神奇守护", + "description": "不可思议的力量,只有效果绝佳的\n招式才能击中。" + }, + "levitate": { + "name": "飘浮", + "description": "从地面浮起,从而不会受到地面属\n性招式的攻击。" + }, + "effectSpore": { + "name": "孢子", + "description": "受到攻击时,有时会把接触到自己\n的对手变为中毒、麻痹或睡眠状态\n。" + }, + "synchronize": { + "name": "同步", + "description": "将自己的中毒、麻痹或灼伤状态传\n染给对手。" + }, + "clearBody": { + "name": "恒净之躯", + "description": "不会因为对手的招式或特性而被降\n低能力。" + }, + "naturalCure": { + "name": "自然回复", + "description": "回到同行队伍后,异常状态就会被\n治愈。" + }, + "lightningRod": { + "name": "避雷针", + "description": "将电属性的招式吸引到自己身上,\n不会受到伤害,而是会提高特攻。" + }, + "sereneGrace": { + "name": "天恩", + "description": "托天恩的福,招式的追加效果容易\n出现。" + }, + "swiftSwim": { + "name": "悠游自如", + "description": "下雨天气时,速度会提高。" + }, + "chlorophyll": { + "name": "叶绿素", + "description": "晴朗天气时,速度会提高。" + }, + "illuminate": { + "name": "发光", + "description": "通过让周围变亮来保持命中率不会\n被降低。" + }, + "trace": { + "name": "复制", + "description": "出场时,复制对手的特性,变为与\n之相同的特性。" + }, + "hugePower": { + "name": "大力士", + "description": "物理攻击的威力会变为2倍。" + }, + "poisonPoint": { + "name": "毒刺", + "description": "有时会让接触到自己的对手变为中\n毒状态。" + }, + "innerFocus": { + "name": "精神力", + "description": "拥有经过锻炼的精神,而不会因对\n手的攻击而畏缩。对威吓也毫不动\n摇。" + }, + "magmaArmor": { + "name": "熔岩铠甲", + "description": "将炽热的熔岩覆盖在身上,不会变\n为冰冻状态。" + }, + "waterVeil": { + "name": "水幕", + "description": "将水幕裹在身上,不会变为灼伤状\n态。" + }, + "magnetPull": { + "name": "磁力", + "description": "用磁力吸住钢属性的宝可梦,使其\n无法逃走。" + }, + "soundproof": { + "name": "隔音", + "description": "通过屏蔽声音,不受到声音招式的\n影响。" + }, + "rainDish": { + "name": "雨盘", + "description": "下雨天气时,会缓缓回复HP。" + }, + "sandStream": { + "name": "扬沙", + "description": "出场时,会把天气变为沙暴。" + }, + "pressure": { + "name": "压迫感", + "description": "给予对手压迫感,大量减少其使用\n招式的PP。" + }, + "thickFat": { + "name": "厚脂肪", + "description": "因为被厚厚的脂肪保护着,会让火\n属性和冰属性的招式伤害减半。" + }, + "earlyBird": { + "name": "早起", + "description": "即使变为睡眠状态,也能以2倍的\n速度提早醒来。" + }, + "flameBody": { + "name": "火焰之躯", + "description": "有时会让接触到自己的对手变为灼\n伤状态。" + }, + "runAway": { + "name": "逃跑", + "description": "一定能从野生宝可梦那儿逃走。" + }, + "keenEye": { + "name": "锐利目光", + "description": "多亏了锐利的目光,命中率不会被\n降低。" + }, + "hyperCutter": { + "name": "怪力钳", + "description": "因为拥有以力量自豪的钳子,不会\n被对手降低攻击。" + }, + "pickup": { + "name": "捡拾", + "description": "有时会捡来对手用过的道具,冒险\n过程中也会捡到。" + }, + "truant": { + "name": "懒惰", + "description": "如果使出招式,下一回合就会休息\n。" + }, + "hustle": { + "name": "活力", + "description": "自己的攻击变高,但命中率会降低\n。" + }, + "cuteCharm": { + "name": "迷人之躯", + "description": "有时会让接触到自己的对手着迷。" + }, + "plus": { + "name": "正电", + "description": "出场的伙伴之间如果有正电或负电\n特性的宝可梦,自己的特攻会提高\n。" + }, + "minus": { + "name": "负电", + "description": "出场的伙伴之间如果有正电或负电\n特性的宝可梦,自己的特攻会提高\n。" + }, + "forecast": { + "name": "阴晴不定", + "description": "受天气的影响,会变为水属性、火\n属性或冰属性中的某一个。" + }, + "stickyHold": { + "name": "黏着", + "description": "因为道具是粘在黏性身体上的,所\n以不会被对手夺走。" + }, + "shedSkin": { + "name": "蜕皮", + "description": "通过蜕去身上的皮,有时会治愈异\n常状态。" + }, + "guts": { + "name": "毅力", + "description": "如果变为异常状态,会拿出毅力,\n攻击会提高。" + }, + "marvelScale": { + "name": "神奇鳞片", + "description": "如果变为异常状态,神奇鳞片会发\n生反应,防御会提高。" + }, + "liquidOoze": { + "name": "污泥浆", + "description": "吸收了污泥浆的对手会因强烈的恶\n臭而受到伤害,减少HP。" + }, + "overgrow": { + "name": "茂盛", + "description": "HP减少的时候,草属性的招式威\n力会提高。" + }, + "blaze": { + "name": "猛火", + "description": "HP减少的时候,火属性的招式威\n力会提高。" + }, + "torrent": { + "name": "激流", + "description": "HP减少的时候,水属性的招式威\n力会提高。" + }, + "swarm": { + "name": "虫之预感", + "description": "HP减少的时候,虫属性的招式威\n力会提高。" + }, + "rockHead": { + "name": "坚硬脑袋", + "description": "即使使出会受反作用力伤害的招式\n,HP也不会减少。" + }, + "drought": { + "name": "日照", + "description": "出场时,会将天气变为晴朗。" + }, + "arenaTrap": { + "name": "沙穴", + "description": "在战斗中让对手无法逃走。" + }, + "vitalSpirit": { + "name": "干劲", + "description": "通过激发出干劲,不会变为睡眠状\n态。" + }, + "whiteSmoke": { + "name": "白色烟雾", + "description": "被白色烟雾保护着,不会被对手降\n低能力。" + }, + "purePower": { + "name": "瑜伽之力", + "description": "因瑜伽的力量,物理攻击的威力会\n变为2倍。" + }, + "shellArmor": { + "name": "硬壳盔甲", + "description": "被坚硬的壳保护着,对手的攻击不\n会击中要害。" + }, + "airLock": { + "name": "气闸", + "description": "所有天气的影响都会消失。" + }, + "tangledFeet": { + "name": "蹒跚", + "description": "在混乱状态时,闪避率会提高。" + }, + "motorDrive": { + "name": "电气引擎", + "description": "受到电属性的招式攻击时,不会受\n到伤害,而是速度会提高。" + }, + "rivalry": { + "name": "斗争心", + "description": "面对性别相同的对手,会燃起斗争\n心,变得更强。而面对性别不同的\n,则会变弱。" + }, + "steadfast": { + "name": "不屈之心", + "description": "每次畏缩时,不屈之心就会燃起,\n速度也会提高。" + }, + "snowCloak": { + "name": "雪隐", + "description": "下雪天气时,闪避率会提高。" + }, + "gluttony": { + "name": "贪吃鬼", + "description": "原本HP变得很少时才会吃树果,\n在HP还有一半时就会把它吃掉。" + }, + "angerPoint": { + "name": "愤怒穴位", + "description": "要害被击中时,会大发雷霆,攻击\n力变为最大。" + }, + "unburden": { + "name": "轻装", + "description": "失去所持有的道具时,速度会提高\n。" + }, + "heatproof": { + "name": "耐热", + "description": "耐热的体质会让火属性的招式伤害\n减半。" + }, + "simple": { + "name": "单纯", + "description": "能力变化会变为平时的2倍。" + }, + "drySkin": { + "name": "干燥皮肤", + "description": "下雨天气时和受到水属性的招式时\n,HP会回复。晴朗天气时和受到\n火属性的招式时,HP会减少。" + }, + "download": { + "name": "下载", + "description": "比较对手的防御和特防,根据较低\n的那项能力相应地提高自己的攻击\n或特攻。" + }, + "ironFist": { + "name": "铁拳", + "description": "使用拳类招式的威力会提高。" + }, + "poisonHeal": { + "name": "毒疗", + "description": "变为中毒状态时,HP不会减少,\n反而会增加起来。" + }, + "adaptability": { + "name": "适应力", + "description": "与自身同属性的招式威力会提高。" + }, + "skillLink": { + "name": "连续攻击", + "description": "如果使用连续招式,总是能使出最\n高次数。" + }, + "hydration": { + "name": "湿润之躯", + "description": "下雨天气时,异常状态会治愈。" + }, + "solarPower": { + "name": "太阳之力", + "description": "晴朗天气时,特攻会提高,而每回\n合HP会减少。" + }, + "quickFeet": { + "name": "飞毛腿", + "description": "变为异常状态时,速度会提高。" + }, + "normalize": { + "name": "一般皮肤", + "description": "无论是什么属性的招式,全部会变\n为一般属性。威力会少量提高。" + }, + "sniper": { + "name": "狙击手", + "description": "击中要害时,威力会变得更强。" + }, + "magicGuard": { + "name": "魔法防守", + "description": "不会受到攻击以外的伤害。" + }, + "noGuard": { + "name": "无防守", + "description": "由于无防守战术,双方使出的招式\n都必定会击中。" + }, + "stall": { + "name": "慢出", + "description": "使出招式的顺序必定会变为最后。" + }, + "technician": { + "name": "技术高手", + "description": "攻击时可以将低威力招式的威力提\n高。" + }, + "leafGuard": { + "name": "叶子防守", + "description": "晴朗天气时,不会变为异常状态。" + }, + "klutz": { + "name": "笨拙", + "description": "无法使用持有的道具。" + }, + "moldBreaker": { + "name": "破格", + "description": "可以不受对手特性的干扰,向对手\n使出招式。" + }, + "superLuck": { + "name": "超幸运", + "description": "因为拥有超幸运,攻击容易击中对\n手的要害。" + }, + "aftermath": { + "name": "引爆", + "description": "变为濒死时,会对接触到自己的对\n手造成伤害。" + }, + "anticipation": { + "name": "危险预知", + "description": "可以察觉到对手拥有的危险招式。" + }, + "forewarn": { + "name": "预知梦", + "description": "出场时,只读取1个对手拥有的招\n式。" + }, + "unaware": { + "name": "纯朴", + "description": "可以无视对手能力的变化,进行攻\n击。" + }, + "tintedLens": { + "name": "有色眼镜", + "description": "可以将效果不好的招式以通常的威\n力使出。" + }, + "filter": { + "name": "过滤", + "description": "受到效果绝佳的攻击时,可以减弱\n其威力。" + }, + "slowStart": { + "name": "慢启动", + "description": "在5回合内,攻击和速度减半。" + }, + "scrappy": { + "name": "胆量", + "description": "一般属性和格斗属性的招式可以击\n中幽灵属性的宝可梦。对威吓也毫\n不动摇。" + }, + "stormDrain": { + "name": "引水", + "description": "将水属性的招式引到自己身上,不\n会受到伤害,而是会提高特攻。" + }, + "iceBody": { + "name": "冰冻之躯", + "description": "下雪天气时,会缓缓回复HP。" + }, + "solidRock": { + "name": "坚硬岩石", + "description": "受到效果绝佳的攻击时,可以减弱\n其威力。" + }, + "snowWarning": { + "name": "降雪", + "description": "出场时,会将天气变为下雪。" + }, + "honeyGather": { + "name": "采蜜", + "description": "The Pokémon gat\nhers Honey afte\nr a battle. The\n Honey is then \nsold for money." + }, + "frisk": { + "name": "察觉", + "description": "出场时,可以察觉对手的特性。" + }, + "reckless": { + "name": "舍身", + "description": "自己会因反作用力受伤的招式,其\n威力会提高。" + }, + "multitype": { + "name": "多属性", + "description": "自己的属性会根据持有的石板而改\n变。" + }, + "flowerGift": { + "name": "花之礼", + "description": "晴朗天气时,自己与同伴的攻击和\n特防能力会提高。" + }, + "badDreams": { + "name": "梦魇", + "description": "给予睡眠状态的对手伤害。" + }, + "pickpocket": { + "name": "顺手牵羊", + "description": "盗取接触到自己的对手的道具。" + }, + "sheerForce": { + "name": "强行", + "description": "招式的追加效果消失,但因此能以\n更高的威力使出招式。" + }, + "contrary": { + "name": "唱反调", + "description": "能力的变化发生逆转,原本提高时\n会降低,而原本降低时会提高。" + }, + "unnerve": { + "name": "紧张感", + "description": "让对手紧张,使其无法食用树果。" + }, + "defiant": { + "name": "不服输", + "description": "被对手降低能力时,攻击会大幅提\n高。" + }, + "defeatist": { + "name": "软弱", + "description": "HP减半时,会变得软弱,攻击和\n特攻会减半。" + }, + "cursedBody": { + "name": "诅咒之躯", + "description": "受到攻击时,有时会把对手的招式\n变为定身法状态。" + }, + "healer": { + "name": "治愈之心", + "description": "有时会治愈异常状态的同伴。" + }, + "friendGuard": { + "name": "友情防守", + "description": "可以减少我方的伤害。" + }, + "weakArmor": { + "name": "碎裂铠甲", + "description": "受到物理招式的伤害时,防御会降\n低,速度会大幅提高。" + }, + "heavyMetal": { + "name": "重金属", + "description": "自身的重量会变为2倍。" + }, + "lightMetal": { + "name": "轻金属", + "description": "自身的重量会减半。" + }, + "multiscale": { + "name": "多重鳞片", + "description": "HP全满时,受到的伤害会变少。" + }, + "toxicBoost": { + "name": "中毒激升", + "description": "变为中毒状态时,物理招式的威力\n会提高。" + }, + "flareBoost": { + "name": "受热激升", + "description": "变为灼伤状态时,特殊招式的威力\n会提高。" + }, + "harvest": { + "name": "收获", + "description": "可以多次制作出已被使用掉的树果\n。" + }, + "telepathy": { + "name": "心灵感应", + "description": "读取我方的攻击,并闪避其招式伤\n害。" + }, + "moody": { + "name": "心情不定", + "description": "每一回合,能力中的某项会大幅提\n高,而某项会降低。" + }, + "overcoat": { + "name": "防尘", + "description": "不会受到沙暴的伤害。也不会受到\n粉末类和孢子类招式的影响。" + }, + "poisonTouch": { + "name": "毒手", + "description": "只通过接触就有可能让对手变为中\n毒状态。" + }, + "regenerator": { + "name": "再生力", + "description": "退回同行队伍后,HP会少量回复\n。" + }, + "bigPecks": { + "name": "健壮胸肌", + "description": "不会受到防御降低的效果。" + }, + "sandRush": { + "name": "拨沙", + "description": "沙暴天气时,速度会提高。" + }, + "wonderSkin": { + "name": "奇迹皮肤", + "description": "成为不易受到变化招式攻击的身体\n。" + }, + "analytic": { + "name": "分析", + "description": "如果在最后使出招式,招式的威力\n会提高。" + }, + "illusion": { + "name": "幻觉", + "description": "假扮成同行队伍中的最后一只宝可\n梦出场,迷惑对手。" + }, + "imposter": { + "name": "变身者", + "description": "变身为当前面对的宝可梦。" + }, + "infiltrator": { + "name": "穿透", + "description": "可以穿透对手的壁障或替身进行攻\n击。" + }, + "mummy": { + "name": "木乃伊", + "description": "被对手接触到后,会将对手变为木\n乃伊。" + }, + "moxie": { + "name": "自信过度", + "description": "如果打倒对手,就会充满自信,攻\n击会提高。" + }, + "justified": { + "name": "正义之心", + "description": "受到恶属性的招式攻击时,因为正\n义感,攻击会提高。" + }, + "rattled": { + "name": "胆怯", + "description": "受到恶属性、幽灵属性和虫属性的\n攻击或威吓时,会因胆怯而速度提\n高。" + }, + "magicBounce": { + "name": "魔法镜", + "description": "可以不受到由对手使出的变化招式\n影响,并将其反弹。" + }, + "sapSipper": { + "name": "食草", + "description": "受到草属性的招式攻击时,不会受\n到伤害,而是攻击会提高。" + }, + "prankster": { + "name": "恶作剧之心", + "description": "可以率先使出变化招式。" + }, + "sandForce": { + "name": "沙之力", + "description": "沙暴天气时,岩石属性、地面属性\n和钢属性的招式威力会提高。" + }, + "ironBarbs": { + "name": "铁刺", + "description": "用铁刺给予接触到自己的对手伤害\n。" + }, + "zenMode": { + "name": "达摩模式", + "description": "HP变为一半以下时,样子会改变\n。" + }, + "victoryStar": { + "name": "胜利之星", + "description": "自己和同伴的命中率会提高。" + }, + "turboblaze": { + "name": "涡轮火焰", + "description": "可以不受对手特性的干扰,向对手\n使出招式。" + }, + "teravolt": { + "name": "兆级电压", + "description": "可以不受对手特性的干扰,向对手\n使出招式。" + }, + "aromaVeil": { + "name": "芳香幕", + "description": "可以防住向自己和同伴发出的心灵\n攻击。" + }, + "flowerVeil": { + "name": "花幕", + "description": "我方的草属性宝可梦能力不会降低\n,也不会变为异常状态。" + }, + "cheekPouch": { + "name": "颊囊", + "description": "无论是哪种树果,食用后,HP都\n会回复。" + }, + "protean": { + "name": "变幻自如", + "description": "变为与自己使出的招式相同的属性\n。每次出场战斗仅生效一次。" + }, + "furCoat": { + "name": "毛皮大衣", + "description": "对手给予的物理招式的伤害会减半\n。" + }, + "magician": { + "name": "魔术师", + "description": "夺走被自己的招式击中的对手的道\n具。" + }, + "bulletproof": { + "name": "防弹", + "description": "可以防住对手的球和弹类招式。" + }, + "competitive": { + "name": "好胜", + "description": "如果被对手降低能力,特攻会大幅\n提高。" + }, + "strongJaw": { + "name": "强壮之颚", + "description": "因为颚部强壮,啃咬类招式的威力\n会提高。" + }, + "refrigerate": { + "name": "冰冻皮肤", + "description": "一般属性的招式会变为冰属性。威\n力会少量提高。" + }, + "sweetVeil": { + "name": "甜幕", + "description": "自己和同伴的宝可梦不会变为睡眠\n状态。" + }, + "stanceChange": { + "name": "战斗切换", + "description": "如果使出攻击招式,会变为刀剑形\n态,如果使出招式“王者盾牌”,\n会变为盾牌形态。" + }, + "galeWings": { + "name": "疾风之翼", + "description": "HP全满时,飞行属性的招式可以\n率先使出。" + }, + "megaLauncher": { + "name": "超级发射器", + "description": "波动和波导类招式的威力会提高。" + }, + "grassPelt": { + "name": "草之毛皮", + "description": "在青草场地时,防御会提高。" + }, + "symbiosis": { + "name": "共生", + "description": "同伴使用道具时,会把自己持有的\n道具传递给同伴。" + }, + "toughClaws": { + "name": "硬爪", + "description": "接触到对手的招式威力会提高。" + }, + "pixilate": { + "name": "妖精皮肤", + "description": "一般属性的招式会变为妖精属性。\n威力会少量提高。" + }, + "gooey": { + "name": "黏滑", + "description": "对于用攻击接触到自己的对手,会\n降低其速度。" + }, + "aerilate": { + "name": "飞行皮肤", + "description": "一般属性的招式会变为飞行属性。\n威力会少量提高。" + }, + "parentalBond": { + "name": "亲子爱", + "description": "亲子俩可以合计攻击2次。" + }, + "darkAura": { + "name": "暗黑气场", + "description": "全体的恶属性招式变强。" + }, + "fairyAura": { + "name": "妖精气场", + "description": "全体的妖精属性招式变强。" + }, + "auraBreak": { + "name": "气场破坏", + "description": "让气场的效果发生逆转,降低威力\n。" + }, + "primordialSea": { + "name": "始源之海", + "description": "变为不会受到火属性攻击的天气。" + }, + "desolateLand": { + "name": "终结之地", + "description": "变为不会受到水属性攻击的天气。" + }, + "deltaStream": { + "name": "德尔塔气流", + "description": "变为令飞行属性的弱点消失的天气\n。" + }, + "stamina": { + "name": "持久力", + "description": "受到攻击时,防御会提高。" + }, + "wimpOut": { + "name": "跃跃欲逃", + "description": "HP变为一半时,会慌慌张张逃走\n,退回同行队伍中。" + }, + "emergencyExit": { + "name": "危险回避", + "description": "HP变为一半时,为了回避危险,\n会退回到同行队伍中。" + }, + "waterCompaction": { + "name": "遇水凝固", + "description": "受到水属性的招式攻击时,防御会\n大幅提高。" + }, + "merciless": { + "name": "不仁不义", + "description": "攻击中毒状态的对手时,必定会击\n中要害。" + }, + "shieldsDown": { + "name": "界限盾壳", + "description": "HP变为一半时,壳会坏掉,变得\n有攻击性。" + }, + "stakeout": { + "name": "蹲守", + "description": "可以对替换出场的对手以2倍的伤\n害进行攻击。" + }, + "waterBubble": { + "name": "水泡", + "description": "降低自己受到的火属性招式的威力\n,不会灼伤。" + }, + "steelworker": { + "name": "钢能力者", + "description": "钢属性的招式威力会提高。" + }, + "berserk": { + "name": "怒火冲天", + "description": "因对手的攻击HP变为一半时,特\n攻会提高。" + }, + "slushRush": { + "name": "拨雪", + "description": "下雪天气时,速度会提高。" + }, + "longReach": { + "name": "远隔", + "description": "可以不接触对手就使出所有的招式\n。" + }, + "liquidVoice": { + "name": "湿润之声", + "description": "所有的声音招式都变为水属性。" + }, + "triage": { + "name": "先行治疗", + "description": "可以率先使出回复招式。" + }, + "galvanize": { + "name": "电气皮肤", + "description": "一般属性的招式会变为电属性。威\n力会少量提高。" + }, + "surgeSurfer": { + "name": "冲浪之尾", + "description": "电气场地时,速度会变为2倍。" + }, + "schooling": { + "name": "鱼群", + "description": "HP多的时候会聚起来变强。HP\n剩余量变少时,群体会分崩离析。" + }, + "disguise": { + "name": "画皮", + "description": "通过画皮覆盖住身体,可以防住1\n次攻击。" + }, + "battleBond": { + "name": "牵绊变身", + "description": "打倒对手时,与训练家的牵绊会增\n强,自己的攻击、特攻、速度会提\n高。" + }, + "powerConstruct": { + "name": "群聚变形", + "description": "HP变为一半时,细胞们会赶来支\n援,变为完全体形态。" + }, + "corrosion": { + "name": "腐蚀", + "description": "可以使钢属性和毒属性的宝可梦也\n陷入中毒状态。" + }, + "comatose": { + "name": "绝对睡眠", + "description": "总是半梦半醒的状态,绝对不会醒\n来。可以就这么睡着进行攻击。" + }, + "queenlyMajesty": { + "name": "女王的威严", + "description": "向对手施加威慑力,使其无法对我\n方使出先制招式。" + }, + "innardsOut": { + "name": "飞出的内在物", + "description": "被对手打倒的时候,会给予对手相\n当于HP剩余量的伤害。" + }, + "dancer": { + "name": "舞者", + "description": "有谁使出跳舞招式时,自己也能就\n这么接着使出跳舞招式。" + }, + "battery": { + "name": "蓄电池", + "description": "会提高我方的特殊招式的威力。" + }, + "fluffy": { + "name": "毛茸茸", + "description": "会将对手所给予的接触类招式的伤\n害减半,但火属性招式的伤害会变\n为2倍。" + }, + "dazzling": { + "name": "鲜艳之躯", + "description": "让对手吓一跳,使其无法对我方使\n出先制招式。" + }, + "soulHeart": { + "name": "魂心", + "description": "宝可梦每次变为濒死状态时,特攻\n会提高。" + }, + "tanglingHair": { + "name": "卷发", + "description": "对于用攻击接触到自己的对手,会\n降低其速度。" + }, + "receiver": { + "name": "接球手", + "description": "继承被打倒的同伴的特性,变为相\n同的特性。" + }, + "powerOfAlchemy": { + "name": "化学之力", + "description": "继承被打倒的同伴的特性,变为相\n同的特性。" + }, + "beastBoost": { + "name": "异兽提升", + "description": "打倒对手的时候,自己最高的那项\n能力会提高。" + }, + "rksSystem": { + "name": "AR系统", + "description": "根据持有的存储碟,自己的属性会\n改变。" + }, + "electricSurge": { + "name": "电气制造者", + "description": "出场时,会布下电气场地。" + }, + "psychicSurge": { + "name": "精神制造者", + "description": "出场时,会布下精神场地。" + }, + "mistySurge": { + "name": "薄雾制造者", + "description": "出场时,会布下薄雾场地。" + }, + "grassySurge": { + "name": "青草制造者", + "description": "出场时,会布下青草场地。" + }, + "fullMetalBody": { + "name": "金属防护", + "description": "不会因为对手的招式或特性而被降\n低能力。" + }, + "shadowShield": { + "name": "幻影防守", + "description": "HP全满时,受到的伤害会变少。" + }, + "prismArmor": { + "name": "棱镜装甲", + "description": "受到效果绝佳的攻击时,可以减弱\n其威力。" + }, + "neuroforce": { + "name": "脑核之力", + "description": "效果绝佳的攻击,威力会变得更强\n。" + }, + "intrepidSword": { + "name": "不挠之剑", + "description": "首次出场时,攻击会提高。" + }, + "dauntlessShield": { + "name": "不屈之盾", + "description": "首次出场时,防御会提高。" + }, + "libero": { + "name": "自由者", + "description": "变为与自己使出的招式相同的属性\n。每次出场战斗仅生效一次。" + }, + "ballFetch": { + "name": "捡球", + "description": "没有携带道具时,会拾取第1个投\n出后捕捉失败的精灵球。" + }, + "cottonDown": { + "name": "棉絮", + "description": "受到攻击后撒下棉絮,降低除自己\n以外的所有宝可梦的速度。" + }, + "propellerTail": { + "name": "螺旋尾鳍", + "description": "能无视具有吸引对手招式效果的特\n性或招式的影响。" + }, + "mirrorArmor": { + "name": "镜甲", + "description": "只反弹自己受到的能力降低效果。" + }, + "gulpMissile": { + "name": "一口导弹", + "description": "冲浪或潜水时会叼来猎物。受到伤\n害时,会吐出猎物进行攻击。" + }, + "stalwart": { + "name": "坚毅", + "description": "能无视具有吸引对手招式效果的特\n性或招式的影响。" + }, + "steamEngine": { + "name": "蒸汽机", + "description": "受到水属性或火属性的招式攻击时\n,速度会巨幅提高。" + }, + "punkRock": { + "name": "庞克摇滚", + "description": "声音招式的威力会提高。受到的声\n音招式伤害会减半。" + }, + "sandSpit": { + "name": "吐沙", + "description": "受到攻击时,会刮起沙暴。" + }, + "iceScales": { + "name": "冰鳞粉", + "description": "由于有冰鳞粉的守护,受到的特殊\n攻击伤害会减半。" + }, + "ripen": { + "name": "熟成", + "description": "使树果成熟,效果变为2倍。" + }, + "iceFace": { + "name": "结冻头", + "description": "头部的冰会代替自己承受物理攻击\n,但是样子会改变。下雪时,冰会\n恢复原状。" + }, + "powerSpot": { + "name": "能量点", + "description": "只要处在相邻位置,招式的威力就\n会提高。" + }, + "mimicry": { + "name": "拟态", + "description": "宝可梦的属性会根据场地的状态而\n变化。" + }, + "screenCleaner": { + "name": "除障", + "description": "出场时,敌方和我方的光墙、反射\n壁和极光幕的效果会消失。" + }, + "steelySpirit": { + "name": "钢之意志", + "description": "我方的钢属性攻击威力会提高。" + }, + "perishBody": { + "name": "灭亡之躯", + "description": "受到接触类招式攻击时,双方都会\n在3回合后变为濒死状态。替换后\n效果消失。" + }, + "wanderingSpirit": { + "name": "游魂", + "description": "与使用接触类招式攻击自己的宝可\n梦互换特性。" + }, + "gorillaTactics": { + "name": "一猩一意", + "description": "虽然攻击会提高,但是只能使出一\n开始所选的招式。" + }, + "neutralizingGas": { + "name": "化学变化气体", + "description": "特性为化学变化气体的宝可梦在场\n时,场上所有宝可梦的特性效果都\n会消失或者无法生效。" + }, + "pastelVeil": { + "name": "粉彩护幕", + "description": "自己和同伴都不会陷入中毒的异常\n状态。" + }, + "hungerSwitch": { + "name": "饱了又饿", + "description": "每回合结束时会在满腹花纹与空腹\n花纹之间交替改变样子。" + }, + "quickDraw": { + "name": "速击", + "description": "有时能比对手先一步行动。" + }, + "unseenFist": { + "name": "无形拳", + "description": "如果使出的是接触到对手的招式,\n就可以无视守护效果进行攻击。" + }, + "curiousMedicine": { + "name": "怪药", + "description": "出场时会从贝壳撒药,将我方的能\n力变化复原。" + }, + "transistor": { + "name": "电晶体", + "description": "电属性的招式威力会提高。" + }, + "dragonsMaw": { + "name": "龙颚", + "description": "龙属性的招式威力会提高。" + }, + "chillingNeigh": { + "name": "苍白嘶鸣", + "description": "打倒对手时会用冰冷的声音嘶鸣并\n提高攻击。" + }, + "grimNeigh": { + "name": "漆黑嘶鸣", + "description": "打倒对手时会用恐怖的声音嘶鸣并\n提高特攻。" + }, + "asOneGlastrier": { + "name": "人马一体", + "description": "兼备蕾冠王的紧张感和雪暴马的苍\n白嘶鸣这两种特性。" + }, + "asOneSpectrier": { + "name": "人马一体", + "description": "兼备蕾冠王的紧张感和灵幽马的漆\n黑嘶鸣这两种特性。" + }, + "lingeringAroma": { + "name": "甩不掉的气味", + "description": "被对手接触到后,甩不掉的气味会\n沾上对手。" + }, + "seedSower": { + "name": "掉出种子", + "description": "受到攻击时,会将脚下变成青草场\n地。" + }, + "thermalExchange": { + "name": "热交换", + "description": "受到火属性的招式攻击时,攻击会\n提高,且不会陷入灼伤状态。" + }, + "angerShell": { + "name": "愤怒甲壳", + "description": "因被对手攻击而HP变为一半时,\n会因愤怒降低防御和特防。但攻击\n、特攻、速度会提高。" + }, + "purifyingSalt": { + "name": "洁净之盐", + "description": "因洁净的盐而不会陷入异常状态。\n会让幽灵属性的招式伤害减半。" + }, + "wellBakedBody": { + "name": "焦香之躯", + "description": "受到火属性的招式攻击时,不会受\n到伤害,而是会大幅提高防御。" + }, + "windRider": { + "name": "乘风", + "description": "吹起了顺风或受到风的招式攻击时\n,不会受到伤害,而是会提高攻击\n。" + }, + "guardDog": { + "name": "看门犬", + "description": "受到威吓时,攻击会提高。让替换\n宝可梦的招式和道具无效。" + }, + "rockyPayload": { + "name": "搬岩", + "description": "岩石属性的招式威力会提高。" + }, + "windPower": { + "name": "风力发电", + "description": "受到风的招式攻击时,会变为充电\n状态。" + }, + "zeroToHero": { + "name": "全能变身", + "description": "回到同行队伍后,会变为全能形态\n。" + }, + "commander": { + "name": "发号施令", + "description": "出场时,若我方当中有吃吼霸,就\n会进入其口中,并从其口中发出指\n令。" + }, + "electromorphosis": { + "name": "电力转换", + "description": "受到伤害时,会变为充电状态。" + }, + "protosynthesis": { + "name": "古代活性", + "description": "携带着驱劲能量或天气为晴朗时,\n数值最高的能力会提高。" + }, + "quarkDrive": { + "name": "夸克充能", + "description": "携带着驱劲能量或在电气场地上时\n,数值最高的能力会提高。" + }, + "goodAsGold": { + "name": "黄金之躯", + "description": "不会氧化的坚固黄金身躯不会受到\n对手的变化招式的影响。" + }, + "vesselOfRuin": { + "name": "灾祸之鼎", + "description": "以能呼唤灾厄的鼎的力量降低除自\n己以外的宝可梦的特攻。" + }, + "swordOfRuin": { + "name": "灾祸之剑", + "description": "以能呼唤灾厄的剑的力量降低除自\n己以外的宝可梦的防御。" + }, + "tabletsOfRuin": { + "name": "灾祸之简", + "description": "以能呼唤灾厄的简的力量降低除自\n己以外的宝可梦的攻击。" + }, + "beadsOfRuin": { + "name": "灾祸之玉", + "description": "以能呼唤灾厄的勾玉的力量降低除\n自己以外的宝可梦的特防。" + }, + "orichalcumPulse": { + "name": "绯红脉动", + "description": "出场时,会将天气变为晴朗。日照\n强烈时,会通过古代的脉动升高攻\n击。" + }, + "hadronEngine": { + "name": "强子引擎", + "description": "出场时,会布下电气场地。处于电\n气场地时,会通过未来的机关升高\n特攻。" + }, + "opportunist": { + "name": "跟风", + "description": "对手的能力提高时,自己也会趁机\n同样地提高能力。" + }, + "cudChew": { + "name": "反刍", + "description": "吃了树果后,会在下一回合结束时\n从胃反刍出来再吃1次。" + }, + "sharpness": { + "name": "锋锐", + "description": "提高切割对手的招式的威力。" + }, + "supremeOverlord": { + "name": "大将", + "description": "出场时,攻击和特攻会按照目前被\n打倒的同伴数量逐渐提升,被打倒\n越多,提升越多。" + }, + "costar": { + "name": "同台共演", + "description": "出场时,复制同伴的能力变化。" + }, + "toxicDebris": { + "name": "毒满地", + "description": "受到物理招式的伤害时,会在对手\n脚下散布毒菱。" + }, + "armorTail": { + "name": "尾甲", + "description": "包裹头部的神秘尾巴使对手无法对\n我方使出先制招式。" + }, + "earthEater": { + "name": "食土", + "description": "受到地面属性的招式攻击时,不会\n受到伤害,而是会得到回复。" + }, + "myceliumMight": { + "name": "菌丝之力", + "description": "使出变化招式时,虽然行动必定会\n变慢,但能不受对手的特性妨碍。" + }, + "mindsEye": { + "name": "心眼", + "description": "一般属性和格斗属性的招式可以击\n中幽灵属性的宝可梦。无视对手的\n闪避率的变化,且命中率不会被降\n低。" + }, + "supersweetSyrup": { + "name": "甘露之蜜", + "description": "首次出场时,会散发出甜腻的蜜的\n香味来降低对手的闪避率。" + }, + "hospitality": { + "name": "款待", + "description": "出场时款待同伴,回复其少量HP\n。" + }, + "toxicChain": { + "name": "毒锁链", + "description": "凭借含有毒素的锁链的力量,有时\n能让被招式击中的对手陷入剧毒状\n态。" + }, + "embodyAspectTeal": { + "name": "面影辉映", + "description": "将回忆映于心中,让碧草面具发出\n光辉,提高自己的速度。" + }, + "embodyAspectWellspring": { + "name": "面影辉映", + "description": "将回忆映于心中,让水井面具发出\n光辉,提高自己的特防。" + }, + "embodyAspectHearthflame": { + "name": "面影辉映", + "description": "将回忆映于心中,让火灶面具发出\n光辉,提高自己的攻击。" + }, + "embodyAspectCornerstone": { + "name": "面影辉映", + "description": "将回忆映于心中,让础石面具发出\n光辉,提高自己的防御。" + }, + "teraShift": { + "name": "太晶变形", + "description": "出场时,会吸收周围的能量,变为\n太晶形态。" + }, + "teraShell": { + "name": "太晶甲壳", + "description": "甲壳蕴藏着全部属性的力量,会将\n自己HP全满时受到的伤害全都变\n为效果不好。" + }, + "teraformZero": { + "name": "归零化境", + "description": "太乐巴戈斯变为星晶形态时,蕴藏\n在它身上的力量会将天气和场地的\n影响全部归零。" + }, + "poisonPuppeteer": { + "name": "毒傀儡", + "description": "因桃歹郎的招式而陷入中毒状态的\n对手同时也会陷入混乱状态。" + } +} \ No newline at end of file diff --git a/src/locales/zh_CN/ability.ts b/src/locales/zh_CN/ability.ts deleted file mode 100644 index 82bc403ad84..00000000000 --- a/src/locales/zh_CN/ability.ts +++ /dev/null @@ -1,1244 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -export const ability: AbilityTranslationEntries = { - stench: { - name: "恶臭", - description: "通过释放臭臭的气味,在攻击的时\n候,有时会使对手畏缩。", - }, - drizzle: { - name: "降雨", - description: "出场时,会将天气变为下雨。", - }, - speedBoost: { - name: "加速", - description: "每一回合速度会变快。", - }, - battleArmor: { - name: "战斗盔甲", - description: "被坚硬的甲壳守护着,不会被对手\n的攻击击中要害。", - }, - sturdy: { - name: "结实", - description: "在HP全满时,即使受到招式攻击\n,也不会被一击打倒。一击必杀的\n招式也没有效果。", - }, - damp: { - name: "湿气", - description: "通过把周围都弄湿,使谁都无法使\n用自爆等爆炸类的招式。", - }, - limber: { - name: "柔软", - description: "因为身体柔软,不会变为麻痹状态\n。", - }, - sandVeil: { - name: "沙隐", - description: "在沙暴的时候,闪避率会提高。", - }, - static: { - name: "静电", - description: "身上带有静电,有时会让接触到的\n对手麻痹。", - }, - voltAbsorb: { - name: "蓄电", - description: "受到电属性的招式攻击时,不会受\n到伤害,而是会回复。", - }, - waterAbsorb: { - name: "储水", - description: "受到水属性的招式攻击时,不会受\n到伤害,而是会回复。", - }, - oblivious: { - name: "迟钝", - description: "因为感觉迟钝,不会变为着迷和被\n挑衅状态。对威吓也毫不动摇。", - }, - cloudNine: { - name: "无关天气", - description: "任何天气的影响都会消失。", - }, - compoundEyes: { - name: "复眼", - description: "因为拥有复眼,招式的命中率会提\n高。", - }, - insomnia: { - name: "不眠", - description: "因为有着睡不着的体质,所以不会\n陷入睡眠状态。", - }, - colorChange: { - name: "变色", - description: "自己的属性会变为从对手处所受招\n式的属性。", - }, - immunity: { - name: "免疫", - description: "因为体内拥有免疫能力,不会变为\n中毒状态。", - }, - flashFire: { - name: "引火", - description: "受到火属性的招式攻击时,吸收火\n焰,自己使出的火属性招式会变强\n。", - }, - shieldDust: { - name: "鳞粉", - description: "被鳞粉守护着,不会受到招式的追\n加效果影响。", - }, - ownTempo: { - name: "我行我素", - description: "因为我行我素,不会变为混乱状态\n。对威吓也毫不动摇。", - }, - suctionCups: { - name: "吸盘", - description: "用吸盘牢牢贴在地面上,让替换宝\n可梦的招式和道具无效。", - }, - intimidate: { - name: "威吓", - description: "出场时威吓对手,让其退缩,降低\n对手的攻击。", - }, - shadowTag: { - name: "踩影", - description: "踩住对手的影子使其无法逃走或替\n换。", - }, - roughSkin: { - name: "粗糙皮肤", - description: "受到攻击时,用粗糙的皮肤弄伤接\n触到自己的对手。", - }, - wonderGuard: { - name: "神奇守护", - description: "不可思议的力量,只有效果绝佳的\n招式才能击中。", - }, - levitate: { - name: "飘浮", - description: "从地面浮起,从而不会受到地面属\n性招式的攻击。", - }, - effectSpore: { - name: "孢子", - description: "受到攻击时,有时会把接触到自己\n的对手变为中毒、麻痹或睡眠状态\n。", - }, - synchronize: { - name: "同步", - description: "将自己的中毒、麻痹或灼伤状态传\n染给对手。", - }, - clearBody: { - name: "恒净之躯", - description: "不会因为对手的招式或特性而被降\n低能力。", - }, - naturalCure: { - name: "自然回复", - description: "回到同行队伍后,异常状态就会被\n治愈。", - }, - lightningRod: { - name: "避雷针", - description: "将电属性的招式吸引到自己身上,\n不会受到伤害,而是会提高特攻。", - }, - sereneGrace: { - name: "天恩", - description: "托天恩的福,招式的追加效果容易\n出现。", - }, - swiftSwim: { - name: "悠游自如", - description: "下雨天气时,速度会提高。", - }, - chlorophyll: { - name: "叶绿素", - description: "晴朗天气时,速度会提高。", - }, - illuminate: { - name: "发光", - description: "通过让周围变亮来保持命中率不会\n被降低。", - }, - trace: { - name: "复制", - description: "出场时,复制对手的特性,变为与\n之相同的特性。", - }, - hugePower: { - name: "大力士", - description: "物理攻击的威力会变为2倍。", - }, - poisonPoint: { - name: "毒刺", - description: "有时会让接触到自己的对手变为中\n毒状态。", - }, - innerFocus: { - name: "精神力", - description: "拥有经过锻炼的精神,而不会因对\n手的攻击而畏缩。对威吓也毫不动\n摇。", - }, - magmaArmor: { - name: "熔岩铠甲", - description: "将炽热的熔岩覆盖在身上,不会变\n为冰冻状态。", - }, - waterVeil: { - name: "水幕", - description: "将水幕裹在身上,不会变为灼伤状\n态。", - }, - magnetPull: { - name: "磁力", - description: "用磁力吸住钢属性的宝可梦,使其\n无法逃走。", - }, - soundproof: { - name: "隔音", - description: "通过屏蔽声音,不受到声音招式的\n影响。", - }, - rainDish: { - name: "雨盘", - description: "下雨天气时,会缓缓回复HP。", - }, - sandStream: { - name: "扬沙", - description: "出场时,会把天气变为沙暴。", - }, - pressure: { - name: "压迫感", - description: "给予对手压迫感,大量减少其使用\n招式的PP。", - }, - thickFat: { - name: "厚脂肪", - description: "因为被厚厚的脂肪保护着,会让火\n属性和冰属性的招式伤害减半。", - }, - earlyBird: { - name: "早起", - description: "即使变为睡眠状态,也能以2倍的\n速度提早醒来。", - }, - flameBody: { - name: "火焰之躯", - description: "有时会让接触到自己的对手变为灼\n伤状态。", - }, - runAway: { - name: "逃跑", - description: "一定能从野生宝可梦那儿逃走。", - }, - keenEye: { - name: "锐利目光", - description: "多亏了锐利的目光,命中率不会被\n降低。", - }, - hyperCutter: { - name: "怪力钳", - description: "因为拥有以力量自豪的钳子,不会\n被对手降低攻击。", - }, - pickup: { - name: "捡拾", - description: "有时会捡来对手用过的道具,冒险\n过程中也会捡到。", - }, - truant: { - name: "懒惰", - description: "如果使出招式,下一回合就会休息\n。", - }, - hustle: { - name: "活力", - description: "自己的攻击变高,但命中率会降低\n。", - }, - cuteCharm: { - name: "迷人之躯", - description: "有时会让接触到自己的对手着迷。", - }, - plus: { - name: "正电", - description: "出场的伙伴之间如果有正电或负电\n特性的宝可梦,自己的特攻会提高\n。", - }, - minus: { - name: "负电", - description: "出场的伙伴之间如果有正电或负电\n特性的宝可梦,自己的特攻会提高\n。", - }, - forecast: { - name: "阴晴不定", - description: "受天气的影响,会变为水属性、火\n属性或冰属性中的某一个。", - }, - stickyHold: { - name: "黏着", - description: "因为道具是粘在黏性身体上的,所\n以不会被对手夺走。", - }, - shedSkin: { - name: "蜕皮", - description: "通过蜕去身上的皮,有时会治愈异\n常状态。", - }, - guts: { - name: "毅力", - description: "如果变为异常状态,会拿出毅力,\n攻击会提高。", - }, - marvelScale: { - name: "神奇鳞片", - description: "如果变为异常状态,神奇鳞片会发\n生反应,防御会提高。", - }, - liquidOoze: { - name: "污泥浆", - description: "吸收了污泥浆的对手会因强烈的恶\n臭而受到伤害,减少HP。", - }, - overgrow: { - name: "茂盛", - description: "HP减少的时候,草属性的招式威\n力会提高。", - }, - blaze: { - name: "猛火", - description: "HP减少的时候,火属性的招式威\n力会提高。", - }, - torrent: { - name: "激流", - description: "HP减少的时候,水属性的招式威\n力会提高。", - }, - swarm: { - name: "虫之预感", - description: "HP减少的时候,虫属性的招式威\n力会提高。", - }, - rockHead: { - name: "坚硬脑袋", - description: "即使使出会受反作用力伤害的招式\n,HP也不会减少。", - }, - drought: { - name: "日照", - description: "出场时,会将天气变为晴朗。", - }, - arenaTrap: { - name: "沙穴", - description: "在战斗中让对手无法逃走。", - }, - vitalSpirit: { - name: "干劲", - description: "通过激发出干劲,不会变为睡眠状\n态。", - }, - whiteSmoke: { - name: "白色烟雾", - description: "被白色烟雾保护着,不会被对手降\n低能力。", - }, - purePower: { - name: "瑜伽之力", - description: "因瑜伽的力量,物理攻击的威力会\n变为2倍。", - }, - shellArmor: { - name: "硬壳盔甲", - description: "被坚硬的壳保护着,对手的攻击不\n会击中要害。", - }, - airLock: { - name: "气闸", - description: "所有天气的影响都会消失。", - }, - tangledFeet: { - name: "蹒跚", - description: "在混乱状态时,闪避率会提高。", - }, - motorDrive: { - name: "电气引擎", - description: "受到电属性的招式攻击时,不会受\n到伤害,而是速度会提高。", - }, - rivalry: { - name: "斗争心", - description: "面对性别相同的对手,会燃起斗争\n心,变得更强。而面对性别不同的\n,则会变弱。", - }, - steadfast: { - name: "不屈之心", - description: "每次畏缩时,不屈之心就会燃起,\n速度也会提高。", - }, - snowCloak: { - name: "雪隐", - description: "下雪天气时,闪避率会提高。", - }, - gluttony: { - name: "贪吃鬼", - description: "原本HP变得很少时才会吃树果,\n在HP还有一半时就会把它吃掉。", - }, - angerPoint: { - name: "愤怒穴位", - description: "要害被击中时,会大发雷霆,攻击\n力变为最大。", - }, - unburden: { - name: "轻装", - description: "失去所持有的道具时,速度会提高\n。", - }, - heatproof: { - name: "耐热", - description: "耐热的体质会让火属性的招式伤害\n减半。", - }, - simple: { - name: "单纯", - description: "能力变化会变为平时的2倍。", - }, - drySkin: { - name: "干燥皮肤", - description: "下雨天气时和受到水属性的招式时\n,HP会回复。晴朗天气时和受到\n火属性的招式时,HP会减少。", - }, - download: { - name: "下载", - description: "比较对手的防御和特防,根据较低\n的那项能力相应地提高自己的攻击\n或特攻。", - }, - ironFist: { - name: "铁拳", - description: "使用拳类招式的威力会提高。", - }, - poisonHeal: { - name: "毒疗", - description: "变为中毒状态时,HP不会减少,\n反而会增加起来。", - }, - adaptability: { - name: "适应力", - description: "与自身同属性的招式威力会提高。", - }, - skillLink: { - name: "连续攻击", - description: "如果使用连续招式,总是能使出最\n高次数。", - }, - hydration: { - name: "湿润之躯", - description: "下雨天气时,异常状态会治愈。", - }, - solarPower: { - name: "太阳之力", - description: "晴朗天气时,特攻会提高,而每回\n合HP会减少。", - }, - quickFeet: { - name: "飞毛腿", - description: "变为异常状态时,速度会提高。", - }, - normalize: { - name: "一般皮肤", - description: "无论是什么属性的招式,全部会变\n为一般属性。威力会少量提高。", - }, - sniper: { - name: "狙击手", - description: "击中要害时,威力会变得更强。", - }, - magicGuard: { - name: "魔法防守", - description: "不会受到攻击以外的伤害。", - }, - noGuard: { - name: "无防守", - description: "由于无防守战术,双方使出的招式\n都必定会击中。", - }, - stall: { - name: "慢出", - description: "使出招式的顺序必定会变为最后。", - }, - technician: { - name: "技术高手", - description: "攻击时可以将低威力招式的威力提\n高。", - }, - leafGuard: { - name: "叶子防守", - description: "晴朗天气时,不会变为异常状态。", - }, - klutz: { - name: "笨拙", - description: "无法使用持有的道具。", - }, - moldBreaker: { - name: "破格", - description: "可以不受对手特性的干扰,向对手\n使出招式。", - }, - superLuck: { - name: "超幸运", - description: "因为拥有超幸运,攻击容易击中对\n手的要害。", - }, - aftermath: { - name: "引爆", - description: "变为濒死时,会对接触到自己的对\n手造成伤害。", - }, - anticipation: { - name: "危险预知", - description: "可以察觉到对手拥有的危险招式。", - }, - forewarn: { - name: "预知梦", - description: "出场时,只读取1个对手拥有的招\n式。", - }, - unaware: { - name: "纯朴", - description: "可以无视对手能力的变化,进行攻\n击。", - }, - tintedLens: { - name: "有色眼镜", - description: "可以将效果不好的招式以通常的威\n力使出。", - }, - filter: { - name: "过滤", - description: "受到效果绝佳的攻击时,可以减弱\n其威力。", - }, - slowStart: { - name: "慢启动", - description: "在5回合内,攻击和速度减半。", - }, - scrappy: { - name: "胆量", - description: "一般属性和格斗属性的招式可以击\n中幽灵属性的宝可梦。对威吓也毫\n不动摇。", - }, - stormDrain: { - name: "引水", - description: "将水属性的招式引到自己身上,不\n会受到伤害,而是会提高特攻。", - }, - iceBody: { - name: "冰冻之躯", - description: "下雪天气时,会缓缓回复HP。", - }, - solidRock: { - name: "坚硬岩石", - description: "受到效果绝佳的攻击时,可以减弱\n其威力。", - }, - snowWarning: { - name: "降雪", - description: "出场时,会将天气变为下雪。", - }, - honeyGather: { - name: "采蜜", - description: "The Pokémon gat\nhers Honey afte\nr a battle. The\n Honey is then \nsold for money.", - }, - frisk: { - name: "察觉", - description: "出场时,可以察觉对手的特性。", - }, - reckless: { - name: "舍身", - description: "自己会因反作用力受伤的招式,其\n威力会提高。", - }, - multitype: { - name: "多属性", - description: "自己的属性会根据持有的石板而改\n变。", - }, - flowerGift: { - name: "花之礼", - description: "晴朗天气时,自己与同伴的攻击和\n特防能力会提高。", - }, - badDreams: { - name: "梦魇", - description: "给予睡眠状态的对手伤害。", - }, - pickpocket: { - name: "顺手牵羊", - description: "盗取接触到自己的对手的道具。", - }, - sheerForce: { - name: "强行", - description: "招式的追加效果消失,但因此能以\n更高的威力使出招式。", - }, - contrary: { - name: "唱反调", - description: "能力的变化发生逆转,原本提高时\n会降低,而原本降低时会提高。", - }, - unnerve: { - name: "紧张感", - description: "让对手紧张,使其无法食用树果。", - }, - defiant: { - name: "不服输", - description: "被对手降低能力时,攻击会大幅提\n高。", - }, - defeatist: { - name: "软弱", - description: "HP减半时,会变得软弱,攻击和\n特攻会减半。", - }, - cursedBody: { - name: "诅咒之躯", - description: "受到攻击时,有时会把对手的招式\n变为定身法状态。", - }, - healer: { - name: "治愈之心", - description: "有时会治愈异常状态的同伴。", - }, - friendGuard: { - name: "友情防守", - description: "可以减少我方的伤害。", - }, - weakArmor: { - name: "碎裂铠甲", - description: "受到物理招式的伤害时,防御会降\n低,速度会大幅提高。", - }, - heavyMetal: { - name: "重金属", - description: "自身的重量会变为2倍。", - }, - lightMetal: { - name: "轻金属", - description: "自身的重量会减半。", - }, - multiscale: { - name: "多重鳞片", - description: "HP全满时,受到的伤害会变少。", - }, - toxicBoost: { - name: "中毒激升", - description: "变为中毒状态时,物理招式的威力\n会提高。", - }, - flareBoost: { - name: "受热激升", - description: "变为灼伤状态时,特殊招式的威力\n会提高。", - }, - harvest: { - name: "收获", - description: "可以多次制作出已被使用掉的树果\n。", - }, - telepathy: { - name: "心灵感应", - description: "读取我方的攻击,并闪避其招式伤\n害。", - }, - moody: { - name: "心情不定", - description: "每一回合,能力中的某项会大幅提\n高,而某项会降低。", - }, - overcoat: { - name: "防尘", - description: "不会受到沙暴的伤害。也不会受到\n粉末类和孢子类招式的影响。", - }, - poisonTouch: { - name: "毒手", - description: "只通过接触就有可能让对手变为中\n毒状态。", - }, - regenerator: { - name: "再生力", - description: "退回同行队伍后,HP会少量回复\n。", - }, - bigPecks: { - name: "健壮胸肌", - description: "不会受到防御降低的效果。", - }, - sandRush: { - name: "拨沙", - description: "沙暴天气时,速度会提高。", - }, - wonderSkin: { - name: "奇迹皮肤", - description: "成为不易受到变化招式攻击的身体\n。", - }, - analytic: { - name: "分析", - description: "如果在最后使出招式,招式的威力\n会提高。", - }, - illusion: { - name: "幻觉", - description: "假扮成同行队伍中的最后一只宝可\n梦出场,迷惑对手。", - }, - imposter: { - name: "变身者", - description: "变身为当前面对的宝可梦。", - }, - infiltrator: { - name: "穿透", - description: "可以穿透对手的壁障或替身进行攻\n击。", - }, - mummy: { - name: "木乃伊", - description: "被对手接触到后,会将对手变为木\n乃伊。", - }, - moxie: { - name: "自信过度", - description: "如果打倒对手,就会充满自信,攻\n击会提高。", - }, - justified: { - name: "正义之心", - description: "受到恶属性的招式攻击时,因为正\n义感,攻击会提高。", - }, - rattled: { - name: "胆怯", - description: "受到恶属性、幽灵属性和虫属性的\n攻击或威吓时,会因胆怯而速度提\n高。", - }, - magicBounce: { - name: "魔法镜", - description: "可以不受到由对手使出的变化招式\n影响,并将其反弹。", - }, - sapSipper: { - name: "食草", - description: "受到草属性的招式攻击时,不会受\n到伤害,而是攻击会提高。", - }, - prankster: { - name: "恶作剧之心", - description: "可以率先使出变化招式。", - }, - sandForce: { - name: "沙之力", - description: "沙暴天气时,岩石属性、地面属性\n和钢属性的招式威力会提高。", - }, - ironBarbs: { - name: "铁刺", - description: "用铁刺给予接触到自己的对手伤害\n。", - }, - zenMode: { - name: "达摩模式", - description: "HP变为一半以下时,样子会改变\n。", - }, - victoryStar: { - name: "胜利之星", - description: "自己和同伴的命中率会提高。", - }, - turboblaze: { - name: "涡轮火焰", - description: "可以不受对手特性的干扰,向对手\n使出招式。", - }, - teravolt: { - name: "兆级电压", - description: "可以不受对手特性的干扰,向对手\n使出招式。", - }, - aromaVeil: { - name: "芳香幕", - description: "可以防住向自己和同伴发出的心灵\n攻击。", - }, - flowerVeil: { - name: "花幕", - description: "我方的草属性宝可梦能力不会降低\n,也不会变为异常状态。", - }, - cheekPouch: { - name: "颊囊", - description: "无论是哪种树果,食用后,HP都\n会回复。", - }, - protean: { - name: "变幻自如", - description: "变为与自己使出的招式相同的属性\n。每次出场战斗仅生效一次。", - }, - furCoat: { - name: "毛皮大衣", - description: "对手给予的物理招式的伤害会减半\n。", - }, - magician: { - name: "魔术师", - description: "夺走被自己的招式击中的对手的道\n具。", - }, - bulletproof: { - name: "防弹", - description: "可以防住对手的球和弹类招式。", - }, - competitive: { - name: "好胜", - description: "如果被对手降低能力,特攻会大幅\n提高。", - }, - strongJaw: { - name: "强壮之颚", - description: "因为颚部强壮,啃咬类招式的威力\n会提高。", - }, - refrigerate: { - name: "冰冻皮肤", - description: "一般属性的招式会变为冰属性。威\n力会少量提高。", - }, - sweetVeil: { - name: "甜幕", - description: "自己和同伴的宝可梦不会变为睡眠\n状态。", - }, - stanceChange: { - name: "战斗切换", - description: "如果使出攻击招式,会变为刀剑形\n态,如果使出招式“王者盾牌”,\n会变为盾牌形态。", - }, - galeWings: { - name: "疾风之翼", - description: "HP全满时,飞行属性的招式可以\n率先使出。", - }, - megaLauncher: { - name: "超级发射器", - description: "波动和波导类招式的威力会提高。", - }, - grassPelt: { - name: "草之毛皮", - description: "在青草场地时,防御会提高。", - }, - symbiosis: { - name: "共生", - description: "同伴使用道具时,会把自己持有的\n道具传递给同伴。", - }, - toughClaws: { - name: "硬爪", - description: "接触到对手的招式威力会提高。", - }, - pixilate: { - name: "妖精皮肤", - description: "一般属性的招式会变为妖精属性。\n威力会少量提高。", - }, - gooey: { - name: "黏滑", - description: "对于用攻击接触到自己的对手,会\n降低其速度。", - }, - aerilate: { - name: "飞行皮肤", - description: "一般属性的招式会变为飞行属性。\n威力会少量提高。", - }, - parentalBond: { - name: "亲子爱", - description: "亲子俩可以合计攻击2次。", - }, - darkAura: { - name: "暗黑气场", - description: "全体的恶属性招式变强。", - }, - fairyAura: { - name: "妖精气场", - description: "全体的妖精属性招式变强。", - }, - auraBreak: { - name: "气场破坏", - description: "让气场的效果发生逆转,降低威力\n。", - }, - primordialSea: { - name: "始源之海", - description: "变为不会受到火属性攻击的天气。", - }, - desolateLand: { - name: "终结之地", - description: "变为不会受到水属性攻击的天气。", - }, - deltaStream: { - name: "德尔塔气流", - description: "变为令飞行属性的弱点消失的天气\n。", - }, - stamina: { - name: "持久力", - description: "受到攻击时,防御会提高。", - }, - wimpOut: { - name: "跃跃欲逃", - description: "HP变为一半时,会慌慌张张逃走\n,退回同行队伍中。", - }, - emergencyExit: { - name: "危险回避", - description: "HP变为一半时,为了回避危险,\n会退回到同行队伍中。", - }, - waterCompaction: { - name: "遇水凝固", - description: "受到水属性的招式攻击时,防御会\n大幅提高。", - }, - merciless: { - name: "不仁不义", - description: "攻击中毒状态的对手时,必定会击\n中要害。", - }, - shieldsDown: { - name: "界限盾壳", - description: "HP变为一半时,壳会坏掉,变得\n有攻击性。", - }, - stakeout: { - name: "蹲守", - description: "可以对替换出场的对手以2倍的伤\n害进行攻击。", - }, - waterBubble: { - name: "水泡", - description: "降低自己受到的火属性招式的威力\n,不会灼伤。", - }, - steelworker: { - name: "钢能力者", - description: "钢属性的招式威力会提高。", - }, - berserk: { - name: "怒火冲天", - description: "因对手的攻击HP变为一半时,特\n攻会提高。", - }, - slushRush: { - name: "拨雪", - description: "下雪天气时,速度会提高。", - }, - longReach: { - name: "远隔", - description: "可以不接触对手就使出所有的招式\n。", - }, - liquidVoice: { - name: "湿润之声", - description: "所有的声音招式都变为水属性。", - }, - triage: { - name: "先行治疗", - description: "可以率先使出回复招式。", - }, - galvanize: { - name: "电气皮肤", - description: "一般属性的招式会变为电属性。威\n力会少量提高。", - }, - surgeSurfer: { - name: "冲浪之尾", - description: "电气场地时,速度会变为2倍。", - }, - schooling: { - name: "鱼群", - description: "HP多的时候会聚起来变强。HP\n剩余量变少时,群体会分崩离析。", - }, - disguise: { - name: "画皮", - description: "通过画皮覆盖住身体,可以防住1\n次攻击。", - }, - battleBond: { - name: "牵绊变身", - description: "打倒对手时,与训练家的牵绊会增\n强,自己的攻击、特攻、速度会提\n高。", - }, - powerConstruct: { - name: "群聚变形", - description: "HP变为一半时,细胞们会赶来支\n援,变为完全体形态。", - }, - corrosion: { - name: "腐蚀", - description: "可以使钢属性和毒属性的宝可梦也\n陷入中毒状态。", - }, - comatose: { - name: "绝对睡眠", - description: "总是半梦半醒的状态,绝对不会醒\n来。可以就这么睡着进行攻击。", - }, - queenlyMajesty: { - name: "女王的威严", - description: "向对手施加威慑力,使其无法对我\n方使出先制招式。", - }, - innardsOut: { - name: "飞出的内在物", - description: "被对手打倒的时候,会给予对手相\n当于HP剩余量的伤害。", - }, - dancer: { - name: "舞者", - description: "有谁使出跳舞招式时,自己也能就\n这么接着使出跳舞招式。", - }, - battery: { - name: "蓄电池", - description: "会提高我方的特殊招式的威力。", - }, - fluffy: { - name: "毛茸茸", - description: "会将对手所给予的接触类招式的伤\n害减半,但火属性招式的伤害会变\n为2倍。", - }, - dazzling: { - name: "鲜艳之躯", - description: "让对手吓一跳,使其无法对我方使\n出先制招式。", - }, - soulHeart: { - name: "魂心", - description: "宝可梦每次变为濒死状态时,特攻\n会提高。", - }, - tanglingHair: { - name: "卷发", - description: "对于用攻击接触到自己的对手,会\n降低其速度。", - }, - receiver: { - name: "接球手", - description: "继承被打倒的同伴的特性,变为相\n同的特性。", - }, - powerOfAlchemy: { - name: "化学之力", - description: "继承被打倒的同伴的特性,变为相\n同的特性。", - }, - beastBoost: { - name: "异兽提升", - description: "打倒对手的时候,自己最高的那项\n能力会提高。", - }, - rksSystem: { - name: "AR系统", - description: "根据持有的存储碟,自己的属性会\n改变。", - }, - electricSurge: { - name: "电气制造者", - description: "出场时,会布下电气场地。", - }, - psychicSurge: { - name: "精神制造者", - description: "出场时,会布下精神场地。", - }, - mistySurge: { - name: "薄雾制造者", - description: "出场时,会布下薄雾场地。", - }, - grassySurge: { - name: "青草制造者", - description: "出场时,会布下青草场地。", - }, - fullMetalBody: { - name: "金属防护", - description: "不会因为对手的招式或特性而被降\n低能力。", - }, - shadowShield: { - name: "幻影防守", - description: "HP全满时,受到的伤害会变少。", - }, - prismArmor: { - name: "棱镜装甲", - description: "受到效果绝佳的攻击时,可以减弱\n其威力。", - }, - neuroforce: { - name: "脑核之力", - description: "效果绝佳的攻击,威力会变得更强\n。", - }, - intrepidSword: { - name: "不挠之剑", - description: "首次出场时,攻击会提高。", - }, - dauntlessShield: { - name: "不屈之盾", - description: "首次出场时,防御会提高。", - }, - libero: { - name: "自由者", - description: "变为与自己使出的招式相同的属性\n。每次出场战斗仅生效一次。", - }, - ballFetch: { - name: "捡球", - description: "没有携带道具时,会拾取第1个投\n出后捕捉失败的精灵球。", - }, - cottonDown: { - name: "棉絮", - description: "受到攻击后撒下棉絮,降低除自己\n以外的所有宝可梦的速度。", - }, - propellerTail: { - name: "螺旋尾鳍", - description: "能无视具有吸引对手招式效果的特\n性或招式的影响。", - }, - mirrorArmor: { - name: "镜甲", - description: "只反弹自己受到的能力降低效果。", - }, - gulpMissile: { - name: "一口导弹", - description: "冲浪或潜水时会叼来猎物。受到伤\n害时,会吐出猎物进行攻击。", - }, - stalwart: { - name: "坚毅", - description: "能无视具有吸引对手招式效果的特\n性或招式的影响。", - }, - steamEngine: { - name: "蒸汽机", - description: "受到水属性或火属性的招式攻击时\n,速度会巨幅提高。", - }, - punkRock: { - name: "庞克摇滚", - description: "声音招式的威力会提高。受到的声\n音招式伤害会减半。", - }, - sandSpit: { - name: "吐沙", - description: "受到攻击时,会刮起沙暴。", - }, - iceScales: { - name: "冰鳞粉", - description: "由于有冰鳞粉的守护,受到的特殊\n攻击伤害会减半。", - }, - ripen: { - name: "熟成", - description: "使树果成熟,效果变为2倍。", - }, - iceFace: { - name: "结冻头", - description: "头部的冰会代替自己承受物理攻击\n,但是样子会改变。下雪时,冰会\n恢复原状。", - }, - powerSpot: { - name: "能量点", - description: "只要处在相邻位置,招式的威力就\n会提高。", - }, - mimicry: { - name: "拟态", - description: "宝可梦的属性会根据场地的状态而\n变化。", - }, - screenCleaner: { - name: "除障", - description: "出场时,敌方和我方的光墙、反射\n壁和极光幕的效果会消失。", - }, - steelySpirit: { - name: "钢之意志", - description: "我方的钢属性攻击威力会提高。", - }, - perishBody: { - name: "灭亡之躯", - description: "受到接触类招式攻击时,双方都会\n在3回合后变为濒死状态。替换后\n效果消失。", - }, - wanderingSpirit: { - name: "游魂", - description: "与使用接触类招式攻击自己的宝可\n梦互换特性。", - }, - gorillaTactics: { - name: "一猩一意", - description: "虽然攻击会提高,但是只能使出一\n开始所选的招式。", - }, - neutralizingGas: { - name: "化学变化气体", - description: "特性为化学变化气体的宝可梦在场\n时,场上所有宝可梦的特性效果都\n会消失或者无法生效。", - }, - pastelVeil: { - name: "粉彩护幕", - description: "自己和同伴都不会陷入中毒的异常\n状态。", - }, - hungerSwitch: { - name: "饱了又饿", - description: "每回合结束时会在满腹花纹与空腹\n花纹之间交替改变样子。", - }, - quickDraw: { - name: "速击", - description: "有时能比对手先一步行动。", - }, - unseenFist: { - name: "无形拳", - description: "如果使出的是接触到对手的招式,\n就可以无视守护效果进行攻击。", - }, - curiousMedicine: { - name: "怪药", - description: "出场时会从贝壳撒药,将我方的能\n力变化复原。", - }, - transistor: { - name: "电晶体", - description: "电属性的招式威力会提高。", - }, - dragonsMaw: { - name: "龙颚", - description: "龙属性的招式威力会提高。", - }, - chillingNeigh: { - name: "苍白嘶鸣", - description: "打倒对手时会用冰冷的声音嘶鸣并\n提高攻击。", - }, - grimNeigh: { - name: "漆黑嘶鸣", - description: "打倒对手时会用恐怖的声音嘶鸣并\n提高特攻。", - }, - asOneGlastrier: { - name: "人马一体", - description: "兼备蕾冠王的紧张感和雪暴马的苍\n白嘶鸣这两种特性。", - }, - asOneSpectrier: { - name: "人马一体", - description: "兼备蕾冠王的紧张感和灵幽马的漆\n黑嘶鸣这两种特性。", - }, - lingeringAroma: { - name: "甩不掉的气味", - description: "被对手接触到后,甩不掉的气味会\n沾上对手。", - }, - seedSower: { - name: "掉出种子", - description: "受到攻击时,会将脚下变成青草场\n地。", - }, - thermalExchange: { - name: "热交换", - description: "受到火属性的招式攻击时,攻击会\n提高,且不会陷入灼伤状态。", - }, - angerShell: { - name: "愤怒甲壳", - description: "因被对手攻击而HP变为一半时,\n会因愤怒降低防御和特防。但攻击\n、特攻、速度会提高。", - }, - purifyingSalt: { - name: "洁净之盐", - description: "因洁净的盐而不会陷入异常状态。\n会让幽灵属性的招式伤害减半。", - }, - wellBakedBody: { - name: "焦香之躯", - description: "受到火属性的招式攻击时,不会受\n到伤害,而是会大幅提高防御。", - }, - windRider: { - name: "乘风", - description: "吹起了顺风或受到风的招式攻击时\n,不会受到伤害,而是会提高攻击\n。", - }, - guardDog: { - name: "看门犬", - description: "受到威吓时,攻击会提高。让替换\n宝可梦的招式和道具无效。", - }, - rockyPayload: { - name: "搬岩", - description: "岩石属性的招式威力会提高。", - }, - windPower: { - name: "风力发电", - description: "受到风的招式攻击时,会变为充电\n状态。", - }, - zeroToHero: { - name: "全能变身", - description: "回到同行队伍后,会变为全能形态\n。", - }, - commander: { - name: "发号施令", - description: "出场时,若我方当中有吃吼霸,就\n会进入其口中,并从其口中发出指\n令。", - }, - electromorphosis: { - name: "电力转换", - description: "受到伤害时,会变为充电状态。", - }, - protosynthesis: { - name: "古代活性", - description: "携带着驱劲能量或天气为晴朗时,\n数值最高的能力会提高。", - }, - quarkDrive: { - name: "夸克充能", - description: "携带着驱劲能量或在电气场地上时\n,数值最高的能力会提高。", - }, - goodAsGold: { - name: "黄金之躯", - description: "不会氧化的坚固黄金身躯不会受到\n对手的变化招式的影响。", - }, - vesselOfRuin: { - name: "灾祸之鼎", - description: "以能呼唤灾厄的鼎的力量降低除自\n己以外的宝可梦的特攻。", - }, - swordOfRuin: { - name: "灾祸之剑", - description: "以能呼唤灾厄的剑的力量降低除自\n己以外的宝可梦的防御。", - }, - tabletsOfRuin: { - name: "灾祸之简", - description: "以能呼唤灾厄的简的力量降低除自\n己以外的宝可梦的攻击。", - }, - beadsOfRuin: { - name: "灾祸之玉", - description: "以能呼唤灾厄的勾玉的力量降低除\n自己以外的宝可梦的特防。", - }, - orichalcumPulse: { - name: "绯红脉动", - description: "出场时,会将天气变为晴朗。日照\n强烈时,会通过古代的脉动升高攻\n击。", - }, - hadronEngine: { - name: "强子引擎", - description: "出场时,会布下电气场地。处于电\n气场地时,会通过未来的机关升高\n特攻。", - }, - opportunist: { - name: "跟风", - description: "对手的能力提高时,自己也会趁机\n同样地提高能力。", - }, - cudChew: { - name: "反刍", - description: "吃了树果后,会在下一回合结束时\n从胃反刍出来再吃1次。", - }, - sharpness: { - name: "锋锐", - description: "提高切割对手的招式的威力。", - }, - supremeOverlord: { - name: "大将", - description: "出场时,攻击和特攻会按照目前被\n打倒的同伴数量逐渐提升,被打倒\n越多,提升越多。", - }, - costar: { - name: "同台共演", - description: "出场时,复制同伴的能力变化。", - }, - toxicDebris: { - name: "毒满地", - description: "受到物理招式的伤害时,会在对手\n脚下散布毒菱。", - }, - armorTail: { - name: "尾甲", - description: "包裹头部的神秘尾巴使对手无法对\n我方使出先制招式。", - }, - earthEater: { - name: "食土", - description: "受到地面属性的招式攻击时,不会\n受到伤害,而是会得到回复。", - }, - myceliumMight: { - name: "菌丝之力", - description: "使出变化招式时,虽然行动必定会\n变慢,但能不受对手的特性妨碍。", - }, - mindsEye: { - name: "心眼", - description: "一般属性和格斗属性的招式可以击\n中幽灵属性的宝可梦。无视对手的\n闪避率的变化,且命中率不会被降\n低。", - }, - supersweetSyrup: { - name: "甘露之蜜", - description: "首次出场时,会散发出甜腻的蜜的\n香味来降低对手的闪避率。", - }, - hospitality: { - name: "款待", - description: "出场时款待同伴,回复其少量HP\n。", - }, - toxicChain: { - name: "毒锁链", - description: "凭借含有毒素的锁链的力量,有时\n能让被招式击中的对手陷入剧毒状\n态。", - }, - embodyAspectTeal: { - name: "面影辉映", - description: "将回忆映于心中,让碧草面具发出\n光辉,提高自己的速度。", - }, - embodyAspectWellspring: { - name: "面影辉映", - description: "将回忆映于心中,让水井面具发出\n光辉,提高自己的特防。", - }, - embodyAspectHearthflame: { - name: "面影辉映", - description: "将回忆映于心中,让火灶面具发出\n光辉,提高自己的攻击。", - }, - embodyAspectCornerstone: { - name: "面影辉映", - description: "将回忆映于心中,让础石面具发出\n光辉,提高自己的防御。", - }, - teraShift: { - name: "太晶变形", - description: "出场时,会吸收周围的能量,变为\n太晶形态。", - }, - teraShell: { - name: "太晶甲壳", - description: "甲壳蕴藏着全部属性的力量,会将\n自己HP全满时受到的伤害全都变\n为效果不好。", - }, - teraformZero: { - name: "归零化境", - description: "太乐巴戈斯变为星晶形态时,蕴藏\n在它身上的力量会将天气和场地的\n影响全部归零。", - }, - poisonPuppeteer: { - name: "毒傀儡", - description: "因桃歹郎的招式而陷入中毒状态的\n对手同时也会陷入混乱状态。", - }, -} as const; diff --git a/src/locales/zh_CN/achv.json b/src/locales/zh_CN/achv.json new file mode 100644 index 00000000000..90dfda0e3c1 --- /dev/null +++ b/src/locales/zh_CN/achv.json @@ -0,0 +1,276 @@ +{ + "Achievements": { + "name": "成就" + }, + "Locked": { + "name": "未解锁" + }, + + "MoneyAchv": { + "description": "累计获得 ₽{{moneyAmount}}" + }, + "10K_MONEY": { + "name": "小有积蓄" + }, + "100K_MONEY": { + "name": "大户人家" + }, + "1M_MONEY": { + "name": "百万富翁" + }, + "10M_MONEY": { + "name": "暴发户" + }, + + "DamageAchv": { + "description": "在单次攻击中造成 {{damageAmount}} 点伤害" + }, + "250_DMG": { + "name": "重拳出击" + }, + "1000_DMG": { + "name": "神拳猛击" + }, + "2500_DMG": { + "name": "夺少?" + }, + "10000_DMG": { + "name": "一拳超人" + }, + + "HealAchv": { + "description": "通过技能、能力或携带的道具一次性治疗 {{healAmount}} {{HP}}点" + }, + "250_HEAL": { + "name": "新手奶妈" + }, + "1000_HEAL": { + "name": "治疗担当" + }, + "2500_HEAL": { + "name": "牧师" + }, + "10000_HEAL": { + "name": "泉水" + }, + + "LevelAchv": { + "description": "将一只宝可梦提升到 Lv{{level}}" + }, + "LV_100": { + "name": "别急,后面还有" + }, + "LV_250": { + "name": "精英" + }, + "LV_1000": { + "name": "天外有天" + }, + + "RibbonAchv": { + "description": "累计获得 {{ribbonAmount}} 个勋章" + }, + "10_RIBBONS": { + "name": "宝可梦联盟冠军" + }, + "25_RIBBONS": { + "name": "超级球联盟冠军" + }, + "50_RIBBONS": { + "name": "高级球联盟冠军" + }, + "75_RIBBONS": { + "name": "肉鸽球联盟冠军" + }, + "100_RIBBONS": { + "name": "大师球联盟冠军" + }, + + "TRANSFER_MAX_STAT_STAGE": { + "name": "团队协作", + "description": "在一项属性强化至最大时用接力棒传递给其他宝可梦" + }, + "MAX_FRIENDSHIP": { + "name": "亲密无间", + "description": "使一只宝可梦的亲密度达到最大值" + }, + "MEGA_EVOLVE": { + "name": "大变身", + "description": "超级进化一只宝可梦" + }, + "GIGANTAMAX": { + "name": "这位更是重量级", + "description": "极巨化一只宝可梦" + }, + "TERASTALLIZE": { + "name": "本系爱好者", + "description": "太晶化一只宝可梦" + }, + "STELLAR_TERASTALLIZE": { + "name": "隐藏属性", + "description": "星晶化一只宝可梦" + }, + "SPLICE": { + "name": "无限融合", + "description": "使用基因之楔将两只宝可梦融合在一起" + }, + "MINI_BLACK_HOLE": { + "name": "一大洞的道具", + "description": "获得一个迷你黑洞" + }, + "CATCH_MYTHICAL": { + "name": "神秘礼物", + "description": "捕捉一只幻之宝可梦" + }, + "CATCH_SUB_LEGENDARY": { + "name": "二级传说", + "description": "捕捉一只二级传说宝可梦" + }, + "CATCH_LEGENDARY": { + "name": "传说", + "description": "捕捉一只传说宝可梦" + }, + "SEE_SHINY": { + "name": "闪耀夺目", + "description": "在野外找到一只闪光宝可梦" + }, + "SHINY_PARTY": { + "name": "呕心沥血", + "description": "拥有一支由闪光宝可梦组成的满员队伍" + }, + "HATCH_MYTHICAL": { + "name": "幻兽蛋", + "description": "从蛋中孵化出一只幻之宝可梦" + }, + "HATCH_SUB_LEGENDARY": { + "name": "二级传说蛋", + "description": "从蛋中孵化出一只二级传说宝可梦" + }, + "HATCH_LEGENDARY": { + "name": "传说蛋", + "description": "从蛋中孵化出一只传说宝可梦" + }, + "HATCH_SHINY": { + "name": "金色传说!", + "description": "从蛋中孵化出一只闪光宝可梦" + }, + "HIDDEN_ABILITY": { + "name": "隐藏实力", + "description": "捕捉一只拥有隐藏特性的宝可梦" + }, + "PERFECT_IVS": { + "name": "合格证", + "description": "获得一只拥有完美个体值的宝可梦" + }, + "CLASSIC_VICTORY": { + "name": "战无不胜", + "description": "在经典模式中通关游戏" + }, + "UNEVOLVED_CLASSIC_VICTORY": { + "name": "带孩子来上班", + "description": "通关经典模式时队伍中至少有一名未进化的宝可梦" + }, + + "MONO_GEN_ONE": { + "name": "最初的劲敌", + "description": "完成仅限第一世代的挑战" + }, + "MONO_GEN_TWO": { + "name": "1.5世代", + "description": "完成仅限第二世代的挑战" + }, + "MONO_GEN_THREE": { + "name": "“水太多了”", + "description": "完成仅限第三世代的挑战" + }, + "MONO_GEN_FOUR": { + "name": "她真是最强冠军吗?", + "description": "完成仅限第四世代的挑战" + }, + "MONO_GEN_FIVE": { + "name": "完全原创", + "description": "完成仅限第五世代的挑战" + }, + "MONO_GEN_SIX": { + "name": "女大公", + "description": "完成仅限第六世代的挑战" + }, + "MONO_GEN_SEVEN": { + "name": "首届冠军", + "description": "完成仅限第七世代的挑战" + }, + "MONO_GEN_EIGHT": { + "name": "冠军时刻!", + "description": "完成仅限第八世代的挑战" + }, + "MONO_GEN_NINE": { + "name": "她又放水了", + "description": "完成仅限第九世代的挑战" + }, + + "MonoType": { + "description": "完成 {{type}} 单属性挑战" + }, + "MONO_NORMAL": { + "name": "异乎寻常的寻常" + }, + "MONO_FIGHTING": { + "name": "我有真功夫" + }, + "MONO_FLYING": { + "name": "愤怒的小鸟" + }, + "MONO_POISON": { + "name": "关都地区特色" + }, + "MONO_GROUND": { + "name": "地震预报" + }, + "MONO_ROCK": { + "name": "坚如磐石" + }, + "MONO_BUG": { + "name": "音箱蟀侠" + }, + "MONO_GHOST": { + "name": "捉鬼敢死队" + }, + "MONO_STEEL": { + "name": "铁巨人" + }, + "MONO_FIRE": { + "name": "搓火球解决一切" + }, + "MONO_WATER": { + "name": "当雨来临,倾盆而下" + }, + "MONO_GRASS": { + "name": "别踏这个青" + }, + "MONO_ELECTRIC": { + "name": "瞄准大岩蛇的角!" + }, + "MONO_PSYCHIC": { + "name": "脑洞大开" + }, + "MONO_ICE": { + "name": "如履薄冰" + }, + "MONO_DRAGON": { + "name": "准神俱乐部" + }, + "MONO_DARK": { + "name": "总有叛逆期" + }, + "MONO_FAIRY": { + "name": "林克,醒醒!" + }, + "FRESH_START": { + "name": "初次尝试!", + "description": "完成初次尝试挑战" + }, + "INVERSE_BATTLE": { + "name": "镜子子镜", + "description": "完成逆转之战挑战\n战挑战之转逆成完" + } +} diff --git a/src/locales/zh_CN/achv.ts b/src/locales/zh_CN/achv.ts deleted file mode 100644 index 486ff3cc02b..00000000000 --- a/src/locales/zh_CN/achv.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "Achievements": { - name: "成就", - }, - "Locked": { - name: "未解锁", - }, - - "MoneyAchv": { - description: "累计获得 ₽{{moneyAmount}}", - }, - "10K_MONEY": { - name: "小有积蓄", - }, - "100K_MONEY": { - name: "大户人家", - }, - "1M_MONEY": { - name: "百万富翁", - }, - "10M_MONEY": { - name: "暴发户", - }, - - "DamageAchv": { - description: "在单次攻击中造成 {{damageAmount}} 点伤害", - }, - "250_DMG": { - name: "重拳出击", - }, - "1000_DMG": { - name: "神拳猛击", - }, - "2500_DMG": { - name: "夺少?", - }, - "10000_DMG": { - name: "一拳超人", - }, - - "HealAchv": { - description: "通过技能、能力或携带的道具一次性治疗 {{healAmount}} {{HP}}点", - }, - "250_HEAL": { - name: "新手奶妈", - }, - "1000_HEAL": { - name: "治疗担当", - }, - "2500_HEAL": { - name: "牧师", - }, - "10000_HEAL": { - name: "泉水", - }, - - "LevelAchv": { - description: "将一只宝可梦提升到 Lv{{level}}", - }, - "LV_100": { - name: "别急,后面还有", - }, - "LV_250": { - name: "精英", - }, - "LV_1000": { - name: "天外有天", - }, - - "RibbonAchv": { - description: "累计获得 {{ribbonAmount}} 个勋章", - }, - "10_RIBBONS": { - name: "宝可梦联盟冠军", - }, - "25_RIBBONS": { - name: "超级球联盟冠军", - }, - "50_RIBBONS": { - name: "高级球联盟冠军", - }, - "75_RIBBONS": { - name: "肉鸽球联盟冠军", - }, - "100_RIBBONS": { - name: "大师球联盟冠军", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "团队协作", - description: "在一项属性强化至最大时用接力棒传递给其他宝可梦", - }, - "MAX_FRIENDSHIP": { - name: "亲密无间", - description: "使一只宝可梦的亲密度达到最大值", - }, - "MEGA_EVOLVE": { - name: "大变身", - description: "超级进化一只宝可梦", - }, - "GIGANTAMAX": { - name: "这位更是重量级", - description: "极巨化一只宝可梦", - }, - "TERASTALLIZE": { - name: "本系爱好者", - description: "太晶化一只宝可梦", - }, - "STELLAR_TERASTALLIZE": { - name: "隐藏属性", - description: "星晶化一只宝可梦", - }, - "SPLICE": { - name: "无限融合", - description: "使用基因之楔将两只宝可梦融合在一起", - }, - "MINI_BLACK_HOLE": { - name: "一大洞的道具", - description: "获得一个迷你黑洞", - }, - "CATCH_MYTHICAL": { - name: "神秘礼物", - description: "捕捉一只幻之宝可梦", - }, - "CATCH_SUB_LEGENDARY": { - name: "二级传说", - description: "捕捉一只二级传说宝可梦", - }, - "CATCH_LEGENDARY": { - name: "传说", - description: "捕捉一只传说宝可梦", - }, - "SEE_SHINY": { - name: "闪耀夺目", - description: "在野外找到一只闪光宝可梦", - }, - "SHINY_PARTY": { - name: "呕心沥血", - description: "拥有一支由闪光宝可梦组成的满员队伍", - }, - "HATCH_MYTHICAL": { - name: "幻兽蛋", - description: "从蛋中孵化出一只幻之宝可梦", - }, - "HATCH_SUB_LEGENDARY": { - name: "二级传说蛋", - description: "从蛋中孵化出一只二级传说宝可梦", - }, - "HATCH_LEGENDARY": { - name: "传说蛋", - description: "从蛋中孵化出一只传说宝可梦", - }, - "HATCH_SHINY": { - name: "金色传说!", - description: "从蛋中孵化出一只闪光宝可梦", - }, - "HIDDEN_ABILITY": { - name: "隐藏实力", - description: "捕捉一只拥有隐藏特性的宝可梦", - }, - "PERFECT_IVS": { - name: "合格证", - description: "获得一只拥有完美个体值的宝可梦", - }, - "CLASSIC_VICTORY": { - name: "战无不胜", - description: "在经典模式中通关游戏", - }, - - "MONO_GEN_ONE": { - name: "最初的劲敌", - description: "完成仅限第一世代的挑战.", - }, - "MONO_GEN_TWO": { - name: "1.5世代", - description: "完成仅限第二世代的挑战.", - }, - "MONO_GEN_THREE": { - name: "“水太多了”", - description: "完成仅限第三世代的挑战.", - }, - "MONO_GEN_FOUR": { - name: "她真是最强冠军吗?", - description: "完成仅限第四世代的挑战.", - }, - "MONO_GEN_FIVE": { - name: "完全原创", - description: "完成仅限第五世代的挑战.", - }, - "MONO_GEN_SIX": { - name: "女大公", - description: "完成仅限第六世代的挑战.", - }, - "MONO_GEN_SEVEN": { - name: "首届冠军", - description: "完成仅限第七世代的挑战.", - }, - "MONO_GEN_EIGHT": { - name: "冠军时刻!", - description: "完成仅限第八世代的挑战.", - }, - "MONO_GEN_NINE": { - name: "她又放水了", - description: "完成仅限第九世代的挑战.", - }, - - "MonoType": { - description: "完成 {{type}} 单属性挑战.", - }, - "MONO_NORMAL": { - name: "异乎寻常的寻常", - }, - "MONO_FIGHTING": { - name: "我有真功夫", - }, - "MONO_FLYING": { - name: "愤怒的小鸟", - }, - "MONO_POISON": { - name: "关都地区特色", - }, - "MONO_GROUND": { - name: "地震预报", - }, - "MONO_ROCK": { - name: "坚如磐石", - }, - "MONO_BUG": { - name: "音箱蟀侠", - }, - "MONO_GHOST": { - name: "捉鬼敢死队", - }, - "MONO_STEEL": { - name: "铁巨人", - }, - "MONO_FIRE": { - name: "搓火球解决一切", - }, - "MONO_WATER": { - name: "当雨来临,倾盆而下", - }, - "MONO_GRASS": { - name: "别踏这个青", - }, - "MONO_ELECTRIC": { - name: "瞄准大岩蛇的角!", - }, - "MONO_PSYCHIC": { - name: "脑洞大开", - }, - "MONO_ICE": { - name: "如履薄冰", - }, - "MONO_DRAGON": { - name: "准神俱乐部", - }, - "MONO_DARK": { - name: "总有叛逆期", - }, - "MONO_FAIRY": { - name: "林克,醒醒!", - }, -} as const; - -// Achievement translations for the when the player character is female (it for now uses the same translations as the male version) -export const PGFachv: AchievementTranslationEntries = PGMachv; diff --git a/src/locales/zh_CN/arena-flyout.json b/src/locales/zh_CN/arena-flyout.json new file mode 100644 index 00000000000..fbce213c4aa --- /dev/null +++ b/src/locales/zh_CN/arena-flyout.json @@ -0,0 +1,41 @@ +{ + "activeBattleEffects": "当前战斗效果", + "player": "我方", + "neutral": "全局", + "enemy": "敌方", + "sunny": "大晴天", + "rain": "下雨", + "sandstorm": "沙暴", + "hail": "冰雹", + "snow": "下雪", + "fog": "起雾", + "heavyRain": "大雨", + "harshSun": "大日照", + "strongWinds": "乱流", + "misty": "薄雾场地", + "electric": "电气场地", + "grassy": "青草场地", + "psychic": "精神场地", + "mudSport": "玩泥巴", + "waterSport": "玩水", + "spikes": "撒菱", + "toxicSpikes": "毒菱", + "mist": "白雾", + "futureSight": "预知未来", + "doomDesire": "破灭之愿", + "wish": "祈愿", + "stealthRock": "隐形岩", + "stickyWeb": "黏黏网", + "trickRoom": "戏法空间", + "gravity": "重力", + "reflect": "反射壁", + "lightScreen": "光墙", + "auroraVeil": "极光幕", + "quickGuard": "快速防守", + "wideGuard": "广域防守", + "matBlock": "掀榻榻米", + "craftyShield": "戏法防守", + "tailwind": "顺风", + "happyHour": "快乐时光", + "safeguard": "神秘守护" +} diff --git a/src/locales/zh_CN/arena-tag.json b/src/locales/zh_CN/arena-tag.json new file mode 100644 index 00000000000..74ad38ba9bf --- /dev/null +++ b/src/locales/zh_CN/arena-tag.json @@ -0,0 +1,57 @@ +{ + "yourTeam": "我方队伍", + "opposingTeam": "敌方队伍", + "arenaOnRemove": "{{moveName}}的效果消失了!", + "arenaOnRemovePlayer": "{{moveName}}在我方的效果消失了!", + "arenaOnRemoveEnemy": "{{moveName}}在敌方的效果消失了!", + "mistOnAdd": "{{pokemonNameWithAffix}}的一方被\n白雾包围了!", + "mistApply": "正受到白雾的保护\n能力不会被降低!", + "reflectOnAdd": "反射壁使\n物理抗性提高了!", + "reflectOnAddPlayer": "反射壁使我方的\n物理抗性提高了!", + "reflectOnAddEnemy": "反射壁使敌方的\n物理抗性提高了!", + "lightScreenOnAdd": "光墙使\n特殊抗性提高了!", + "lightScreenOnAddPlayer": "光墙使我方的\n特殊抗性提高了!", + "lightScreenOnAddEnemy": "光墙使敌方的\n特殊抗性提高了!", + "auroraVeilOnAdd": "极光幕使\n物理和特殊抗性提高了!", + "auroraVeilOnAddPlayer": "极光幕使我方的\n物理和特殊抗性提高了!", + "auroraVeilOnAddEnemy": "极光幕使敌方的\n物理和特殊抗性提高了!", + "conditionalProtectOnAdd": "{{moveName}}\n保护了!", + "conditionalProtectOnAddPlayer": "{{moveName}}\n保护了我方!", + "conditionalProtectOnAddEnemy": "{{moveName}}\n保护了敌方!", + "conditionalProtectApply": "{{moveName}}\n保护了{{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}}正在\n伺机使出掀榻榻米!", + "noCritOnAddPlayer": "{{moveName}}保护了你的\n队伍不被击中要害!", + "noCritOnAddEnemy": "{{moveName}}保护了对方的\n队伍不被击中要害!", + "noCritOnRemove": "{{pokemonNameWithAffix}}的{{moveName}}\n效果消失了!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}的\n祈愿实现了!", + "mudSportOnAdd": "电气的威力减弱了!", + "mudSportOnRemove": "玩泥巴的效果消失了!", + "waterSportOnAdd": "火焰的威力减弱了!", + "waterSportOnRemove": "玩水的效果消失了!", + "spikesOnAdd": "{{opponentDesc}}脚下\n散落着{{moveName}}!", + "spikesActivateTrap": "{{pokemonNameWithAffix}}\n受到了撒菱的伤害!", + "toxicSpikesOnAdd": "{{opponentDesc}}脚下\n散落着{{moveName}}!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}\n吸收了{{moveName}}!", + "stealthRockOnAdd": "{{opponentDesc}}周围\n开始浮现出尖锐的岩石!", + "stealthRockActivateTrap": "尖锐的岩石扎进了\n{{pokemonNameWithAffix}}的体内!", + "stickyWebOnAdd": "对方的脚下\n延伸出了{{moveName}}!", + "stickyWebActivateTrap": "{{pokemonName}}\n被黏黏网粘住了!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}}\n扭曲了时空!", + "trickRoomOnRemove": "扭曲的时空复原了!", + "gravityOnAdd": "重力变强了!", + "gravityOnRemove": "重力复原了!", + "tailwindOnAdd": "从身后\n吹起了顺风!", + "tailwindOnAddPlayer": "从我方身后\n吹起了顺风!", + "tailwindOnAddEnemy": "从敌方身后\n吹起了顺风!", + "tailwindOnRemove": "顺风停止了!", + "tailwindOnRemovePlayer": "我方的顺风停止了!", + "tailwindOnRemoveEnemy": "敌方的顺风停止了!", + "happyHourOnAdd": "大家被欢乐的\n气氛包围了!", + "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/battle-info.json b/src/locales/zh_CN/battle-info.json new file mode 100644 index 00000000000..884a01eb8a7 --- /dev/null +++ b/src/locales/zh_CN/battle-info.json @@ -0,0 +1,3 @@ +{ + "generation": "第{{generation}}世代" +} \ No newline at end of file diff --git a/src/locales/zh_CN/battle-message-ui-handler.json b/src/locales/zh_CN/battle-message-ui-handler.json new file mode 100644 index 00000000000..2aa750a9776 --- /dev/null +++ b/src/locales/zh_CN/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "最棒", + "ivFantastic": "了不起", + "ivVeryGood": "非常好", + "ivPrettyGood": "相当好", + "ivDecent": "一般般", + "ivNoGood": "也许不行" +} \ No newline at end of file diff --git a/src/locales/zh_CN/battle-message-ui-handler.ts b/src/locales/zh_CN/battle-message-ui-handler.ts deleted file mode 100644 index fb6e74cf66b..00000000000 --- a/src/locales/zh_CN/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "最棒", - "ivFantastic": "了不起", - "ivVeryGood": "非常好", - "ivPrettyGood": "相当好", - "ivDecent": "一般般", - "ivNoGood": "也许不行", -} as const; diff --git a/src/locales/zh_CN/battle-scene.json b/src/locales/zh_CN/battle-scene.json new file mode 100644 index 00000000000..a0288475d69 --- /dev/null +++ b/src/locales/zh_CN/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/zh_CN/battle.json b/src/locales/zh_CN/battle.json new file mode 100644 index 00000000000..4197786b7d8 --- /dev/null +++ b/src/locales/zh_CN/battle.json @@ -0,0 +1,91 @@ +{ + "bossAppeared": "{{bossName}} 出现了。", + "trainerAppeared": "{{trainerName}}\n想要和你对战!", + "trainerAppearedDouble": "{{trainerName}}\n想要和你对战!", + "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!", + "singleWildAppeared": "一只野生的{{pokemonName}}出现了!", + "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出现了!", + "playerComeBack": "回来吧,{{pokemonName}}!", + "trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!", + "playerGo": "去吧!{{pokemonName}}!", + "trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!", + "switchQuestion": "要更换\n{{pokemonName}}吗?", + "trainerDefeated": "你击败了\n{{trainerName}}!", + "moneyWon": "你赢得了\n₽{{moneyAmount}}!", + "moneyPickedUp": "捡到了₽{{moneyAmount}}!", + "pokemonCaught": "{{pokemonName}}被抓住了!", + "addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦!", + "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?", + "pokemon": "宝可梦", + "sendOutPokemon": "上吧!\n{{pokemonName}}!", + "hitResultCriticalHit": "击中了要害!", + "hitResultSuperEffective": "效果拔群!", + "hitResultNotVeryEffective": "收效甚微…", + "hitResultNoEffect": "对{{pokemonName}}没有效果!!", + "hitResultImmune": "对于{{pokemonName}},\n完全没有效果!", + "hitResultOneHitKO": "一击必杀!", + "attackFailed": "但是失败了!", + "attackMissed": "没有命中{{pokemonNameWithAffix}}!", + "attackHitsCount": "击中{{count}}次!", + "rewardGain": "你获得了\n{{modifierName}}!", + "expGain": "{{pokemonName}}获得了{{exp}} 点经验值!", + "levelUp": "{{pokemonName}}升级到Lv.{{level}}!", + "learnMove": "{{pokemonName}}学会了{{moveName}}!", + "learnMovePrompt": "{{pokemonName}}想要学习{{moveName}}。", + "learnMoveLimitReached": "但是,{{pokemonName}}已经学会了\n四个技能", + "learnMoveReplaceQuestion": "要忘记一个技能并学习{{moveName}}吗?", + "learnMoveStopTeaching": "不再尝试学习{{moveName}}?", + "learnMoveNotLearned": "{{pokemonName}}没有学会{{moveName}}。", + "learnMoveForgetQuestion": "要忘记哪个技能?", + "learnMoveForgetSuccess": "{{pokemonName}}忘记了\n如何使用{{moveName}}。", + "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}空!", + "learnMoveAnd": "然后……", + "levelCapUp": "等级上限提升到{{levelCap}}!", + "moveNotImplemented": "{{moveName}}尚未实装,无法选择。", + "moveNoPP": "这个技能的PP用完了", + "moveDisabled": "{{moveName}}被禁用!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被无效化了!", + "noPokeballForce": "一股无形的力量阻止了你使用精灵球。", + "noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!", + "noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!", + "noPokeballStrong": "目标宝可梦太强了,无法捕捉!\n你需要先削弱它!", + "noEscapeForce": "一股无形的力量阻止你逃跑。", + "noEscapeTrainer": "你不能从与训练家的战斗中逃跑!", + "noEscapePokemon": "{{pokemonName}}的{{moveName}}\n阻止了你{{escapeVerb}}!", + "runAwaySuccess": "成功逃走了!", + "runAwayCannotEscape": "无法逃走!", + "escapeVerbSwitch": "切换", + "escapeVerbFlee": "逃跑", + "notDisabled": "{{moveName}}不再被禁用!", + "turnEndHpRestore": "{{pokemonName}}的体力恢复了。", + "hpIsFull": "{{pokemonName}}的体力已满!", + "skipItemQuestion": "你确定要跳过拾取道具吗?", + "itemStackFull": "{{fullItemName}}持有数达到上限,\n你获得了{{itemName}}作为替代。", + "eggHatching": "咦?", + "stealEatBerry": "{{pokemonName}}夺取并吃掉了\n{{targetName}}的{{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了{{moveName}}的PP!", + "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了体力!", + "ivScannerUseQuestion": "对{{pokemonName}}使用个体值扫描仪?", + "wildPokemonWithAffix": "野生的{{pokemonName}}", + "foePokemonWithAffix": "对手的{{pokemonName}}", + "useMove": "{{pokemonNameWithAffix}}使用了\n{{moveName}}!", + "drainMessage": "{{pokemonName}}\n吸取了体力!", + "regainHealth": "{{pokemonName}}\n回复了体力!", + "fainted": "{{pokemonNameWithAffix}}\n倒下了!", + "statsAnd": "和", + "stats": "能力", + "statRose_other": "{{pokemonNameWithAffix}}的{{stats}}提高了!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}的{{stats}}大幅提高了!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}的{{stats}}极大幅提高了!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}的{{stats}}已经无法再提高了!", + "statFell_other": "{{pokemonNameWithAffix}}的{{stats}}降低了!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}的{{stats}}大幅降低了!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}的{{stats}}极大幅降低了!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}的{{stats}}已经无法再降低了!", + "transformedIntoType": "{{pokemonName}}变成了\n{{type}}属性!", + "ppReduced": "降低了{{targetName}}的\n{{moveName}}的PP{{reduction}}点!", + "retryBattle": "你要从对战开始时重试么?", + "unlockedSomething": "{{unlockedThing}}\n已解锁。", + "congratulations": "恭喜!", + "beatModeFirstTime": "{{speciesName}}首次击败了{{gameMode}}!\n你获得了{{newModifier}}!" +} diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts deleted file mode 100644 index 3fde016d5cc..00000000000 --- a/src/locales/zh_CN/battle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "{{bossName}} 出现了。", - "trainerAppeared": "{{trainerName}}\n想要和你对战!", - "trainerAppearedDouble": "{{trainerName}}\n想要和你对战!", - "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!", - "singleWildAppeared": "一只野生的{{pokemonName}}出现了!", - "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出现了!", - "playerComeBack": "回来吧,{{pokemonName}}!", - "trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!", - "playerGo": "去吧!{{pokemonName}}!", - "trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!", - "switchQuestion": "要更换\n{{pokemonName}}吗?", - "trainerDefeated": "你击败了\n{{trainerName}}!", - "moneyWon": "你赢得了\n₽{{moneyAmount}}!", - "pokemonCaught": "{{pokemonName}}被抓住了!", - "addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦!", - "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?", - "pokemon": "宝可梦", - "sendOutPokemon": "上吧!\n{{pokemonName}}!", - "hitResultCriticalHit": "击中了要害!", - "hitResultSuperEffective": "效果拔群!", - "hitResultNotVeryEffective": "收效甚微…", - "hitResultNoEffect": "对{{pokemonName}}没有效果!!", - "hitResultOneHitKO": "一击必杀!", - "attackFailed": "但是失败了!", - "attackHitsCount": "击中{{count}}次!", - "rewardGain": "你获得了\n{{modifierName}}!", - "expGain": "{{pokemonName}}获得了 {{exp}} 点经验值!", - "levelUp": "{{pokemonName}}升级到 Lv.{{level}}!", - "learnMove": "{{pokemonName}} 学会了 {{moveName}}!", - "learnMovePrompt": "{{pokemonName}}想要学习{{moveName}}。", - "learnMoveLimitReached": "但是,{{pokemonName}}已经学会了\n四个技能", - "learnMoveReplaceQuestion": "要忘记一个技能并学习{{moveName}}吗?", - "learnMoveStopTeaching": "不再尝试学习{{moveName}}?", - "learnMoveNotLearned": "{{pokemonName}}没有学会{{moveName}}。", - "learnMoveForgetQuestion": "要忘记哪个技能?", - "learnMoveForgetSuccess": "{{pokemonName}}忘记了\n如何使用{{moveName}}。", - "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{pb_bounce_1}空!", - "learnMoveAnd": "然后……", - "levelCapUp": "等级上限提升到{{levelCap}}!", - "moveNotImplemented": "{{moveName}}尚未实装,无法选择。", - "moveNoPP": "这个技能的PP用完了", - "moveDisabled": "{{moveName}}被禁用!", - "noPokeballForce": "一股无形的力量阻止了你使用精灵球。", - "noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!", - "noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!", - "noPokeballStrong": "目标宝可梦太强了,无法捕捉!\n你需要先削弱它!", - "noEscapeForce": "一股无形的力量阻止你逃跑。", - "noEscapeTrainer": "你不能从与训练家的战斗中逃跑!", - "noEscapePokemon": "{{pokemonName}}的{{moveName}}\n阻止了你{{escapeVerb}}!", - "runAwaySuccess": "成功逃走了!", - "runAwayCannotEscape": "无法逃走!", - "escapeVerbSwitch": "切换", - "escapeVerbFlee": "逃跑", - "notDisabled": "{{moveName}}不再被禁用!", - "turnEndHpRestore": "{{pokemonName}}的体力恢复了。", - "hpIsFull": "{{pokemonName}}的体力已满!", - "skipItemQuestion": "你确定要跳过拾取道具吗?", - "eggHatching": "咦?", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", - "ivScannerUseQuestion": "对{{pokemonName}}使用个体值扫描仪?", - "wildPokemonWithAffix": "野生的{{pokemonName}}", - "foePokemonWithAffix": "对手 {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}}使用了\n{{moveName}}!", - "drainMessage": "{{pokemonName}}\n吸取了体力!", - "regainHealth": "{{pokemonName}}\n回复了体力!", - "fainted": "{{pokemonNameWithAffix}}\n倒下了!", - "statRose": "{{pokemonNameWithAffix}}\n的{{stats}}提高了!", - "statSharplyRose": "{{pokemonNameWithAffix}}\n的{{stats}}大幅提高了!", - "statRoseDrastically": "{{pokemonNameWithAffix}}\n的{{stats}}极大幅提高了!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}}\n的{{stats}}已经无法再提高了!", - "statFell": "{{pokemonNameWithAffix}}\n的{{stats}}降低了!", - "statHarshlyFell": "{{pokemonNameWithAffix}}\n的{{stats}}大幅降低了!", - "statSeverelyFell": "{{pokemonNameWithAffix}}\n的{{stats}}极大幅降低了!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}}\n的{{stats}}已经无法再降低了!", - "ppReduced": "降低了{{targetName}}的\n{{moveName}}的PP{{reduction}}点!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}\n因攻击的反作用力而无法动弹!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}!", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}\n畏缩了,无法使出招式!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}\n混乱了!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}\n的混乱解除了!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}\n已经混乱了。", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}\n正在混乱中!", - "battlerTagsConfusedLapseHurtItself": "不知所以地攻击了自己!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}\n不再受到同命的影响", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}\n和{{pokemonNameWithAffix2}}同归于尽了!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷了!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}\n已经着迷了!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷中!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}\n不会着迷!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\n治愈了着迷状态!", - "battlerTagsSeededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}}的身上!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}\n被寄生种子吸取了体力!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}\n开始做恶梦了!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}\n已经被恶梦缠身!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}\n正被恶梦缠身!", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}\n接受了再来一次!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}\n的再来一次状态解除了!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}\n摆出了帮助{{pokemonName}}的架势!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}\n用扎根回复了体力!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}\n扎根了!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}\n用水流环包裹了自己!", - "battlerTagsAquaRingLapse": "{{moveName}}回复了\n{{pokemonName}}的体力!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}\n产生睡意了!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了\n{{moveName}}的伤害!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}的{{moveName}}紧紧束缚住了!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}绑紧了!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}\n被困在了旋涡之中!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳\n夹住了{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}\n被{{moveName}}困住了!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}\n被困在了熔岩风暴之中!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}\n被捕兽夹困住了!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了\n{{sourcePokemonNameWithAffix}}的死缠烂打!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\n摆出了防守的架势!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\n在攻击中保护了自己!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}\n摆出了挺住攻击的架势!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}\n的灭亡计时变成{{turnCount}}了!", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}\n正在偷懒!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!", - "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!" -} as const; diff --git a/src/locales/zh_CN/battler-tags.json b/src/locales/zh_CN/battler-tags.json new file mode 100644 index 00000000000..792551d1ab1 --- /dev/null +++ b/src/locales/zh_CN/battler-tags.json @@ -0,0 +1,73 @@ +{ + "trappedDesc": "束缚", + "flinchedDesc": "畏缩", + "confusedDesc": "混乱", + "infatuatedDesc": "着迷", + "seedDesc": "寄生种子", + "nightmareDesc": "恶梦", + "ingrainDesc": "扎根", + "drowsyDesc": "瞌睡", + "rechargingLapse": "{{pokemonNameWithAffix}}\n因攻击的反作用力而无法动弹!", + "trappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", + "trappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}!", + "flinchedLapse": "{{pokemonNameWithAffix}}\n畏缩了,无法使出招式!", + "confusedOnAdd": "{{pokemonNameWithAffix}}\n混乱了!", + "confusedOnRemove": "{{pokemonNameWithAffix}}\n的混乱解除了!", + "confusedOnOverlap": "{{pokemonNameWithAffix}}\n已经混乱了。", + "confusedLapse": "{{pokemonNameWithAffix}}\n正在混乱中!", + "confusedLapseHurtItself": "不知所以地攻击了自己!", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}}\n不再受到同命的影响", + "destinyBondLapse": "{{pokemonNameWithAffix}}\n和{{pokemonNameWithAffix2}}同归于尽了!", + "infatuatedOnAdd": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷了!", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}}\n已经着迷了!", + "infatuatedLapse": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷中!", + "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}}\n不会着迷!", + "infatuatedOnRemove": "{{pokemonNameWithAffix}}\n治愈了着迷状态!", + "seededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}}的身上!", + "seededLapse": "{{pokemonNameWithAffix}}\n被寄生种子吸取了体力!", + "seededLapseShed": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", + "nightmareOnAdd": "{{pokemonNameWithAffix}}\n开始做恶梦了!", + "nightmareOnOverlap": "{{pokemonNameWithAffix}}\n已经被恶梦缠身!", + "nightmareLapse": "{{pokemonNameWithAffix}}\n正被恶梦缠身!", + "encoreOnAdd": "{{pokemonNameWithAffix}}\n接受了再来一次!", + "encoreOnRemove": "{{pokemonNameWithAffix}}\n的再来一次状态解除了!", + "helpingHandOnAdd": "{{pokemonNameWithAffix}}\n摆出了帮助{{pokemonName}}的架势!", + "ingrainLapse": "{{pokemonNameWithAffix}}\n用扎根回复了体力!", + "ingrainOnTrap": "{{pokemonNameWithAffix}}\n扎根了!", + "aquaRingOnAdd": "{{pokemonNameWithAffix}}\n用水流环包裹了自己!", + "aquaRingLapse": "{{moveName}}回复了\n{{pokemonName}}的体力!", + "drowsyOnAdd": "{{pokemonNameWithAffix}}\n产生睡意了!", + "damagingTrapLapse": "{{pokemonNameWithAffix}}受到了\n{{moveName}}的伤害!", + "bindOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}的{{moveName}}紧紧束缚住了!", + "wrapOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}绑紧了!", + "vortexOnTrap": "{{pokemonNameWithAffix}}\n被困在了旋涡之中!", + "clampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳\n夹住了{{pokemonName}}!", + "sandTombOnTrap": "{{pokemonNameWithAffix}}\n被{{moveName}}困住了!", + "magmaStormOnTrap": "{{pokemonNameWithAffix}}\n被困在了熔岩风暴之中!", + "snapTrapOnTrap": "{{pokemonNameWithAffix}}\n被捕兽夹困住了!", + "thunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了\n{{pokemonNameWithAffix}}!", + "infestationOnTrap": "{{pokemonNameWithAffix}}受到了\n{{sourcePokemonNameWithAffix}}的死缠烂打!", + "protectedOnAdd": "{{pokemonNameWithAffix}}\n摆出了防守的架势!", + "protectedLapse": "{{pokemonNameWithAffix}}\n在攻击中保护了自己!", + "enduringOnAdd": "{{pokemonNameWithAffix}}\n摆出了挺住攻击的架势!", + "enduringLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", + "sturdyLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", + "perishSongLapse": "{{pokemonNameWithAffix}}\n的灭亡计时变成{{turnCount}}了!", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n变得万众瞩目了!", + "truantLapse": "{{pokemonNameWithAffix}}\n正在偷懒!", + "slowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平!", + "slowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平!", + "highestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!", + "highestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因电磁力浮了起来!", + "magnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n电磁力消失了!", + "critBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足!", + "critBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。", + "saltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态!", + "saltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", + "cursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", + "cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!", + "stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!", + "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!", + "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!" +} diff --git a/src/locales/zh_CN/berry.json b/src/locales/zh_CN/berry.json new file mode 100644 index 00000000000..4a739343655 --- /dev/null +++ b/src/locales/zh_CN/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "文柚果", + "effect": "HP低于50%时,回复最大HP的25%" + }, + "LUM": { + "name": "木子果", + "effect": "治愈任何异常状态和混乱状态" + }, + "ENIGMA": { + "name": "谜芝果", + "effect": "受到效果绝佳的招式攻击时,回复25%最大HP" + }, + "LIECHI": { + "name": "枝荔果", + "effect": "HP低于25%时,攻击提升一个等级" + }, + "GANLON": { + "name": "龙睛果", + "effect": "HP低于25%时,防御提升一个等级" + }, + "PETAYA": { + "name": "龙火果", + "effect": "HP低于25%时,特攻提升一个等级" + }, + "APICOT": { + "name": "杏仔果", + "effect": "HP低于25%时,特防提升一个等级" + }, + "SALAC": { + "name": "沙鳞果", + "effect": "HP低于25%时,速度提升一个等级" + }, + "LANSAT": { + "name": "兰萨果", + "effect": "HP低于25%时,击中要害率提升两个等级" + }, + "STARF": { + "name": "星桃果", + "effect": "HP低于25%时,提高随机一项能力两个等级" + }, + "LEPPA": { + "name": "苹野果", + "effect": "有招式的PP降到0时,恢复该招式10PP" + } +} \ No newline at end of file diff --git a/src/locales/zh_CN/berry.ts b/src/locales/zh_CN/berry.ts deleted file mode 100644 index c13393f23a3..00000000000 --- a/src/locales/zh_CN/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "文柚果", - effect: "HP低于50%时,回复最大HP的25%", - }, - "LUM": { - name: "木子果", - effect: "治愈任何异常状态和混乱状态", - }, - "ENIGMA": { - name: "谜芝果", - effect: "受到效果绝佳的招式攻击时,回复25%最大HP", - }, - "LIECHI": { - name: "枝荔果", - effect: "HP低于25%时,攻击提升一个等级", - }, - "GANLON": { - name: "龙睛果", - effect: "HP低于25%时,防御提升一个等级", - }, - "PETAYA": { - name: "龙火果", - effect: "HP低于25%时,特攻提升一个等级", - }, - "APICOT": { - name: "杏仔果", - effect: "HP低于25%时,特防提升一个等级", - }, - "SALAC": { - name: "沙鳞果", - effect: "HP低于25%时,速度提升一个等级", - }, - "LANSAT": { - name: "兰萨果", - effect: "HP低于25%时,击中要害率提升两个等级", - }, - "STARF": { - name: "星桃果", - effect: "HP低于25%时,提高随机一项能力两个等级", - }, - "LEPPA": { - name: "苹野果", - effect: "有招式的PP降到0时,恢复该招式10PP", - }, -} as const; diff --git a/src/locales/zh_CN/bgm-name.ts b/src/locales/zh_CN/bgm-name.json similarity index 88% rename from src/locales/zh_CN/bgm-name.ts rename to src/locales/zh_CN/bgm-name.json index 70e969d7b5e..d0508a49661 100644 --- a/src/locales/zh_CN/bgm-name.ts +++ b/src/locales/zh_CN/bgm-name.json @@ -1,11 +1,10 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "BGM", - "missing_entries" : "{{name}}", +{ + "music": "BGM: ", + "missing_entries": "{{name}}", "battle_kanto_champion": "黑2白2「决战!关都冠军」", "battle_johto_champion": "黑2白2「决战!城都冠军」", - "battle_hoenn_champion": "黑2白2「决战!丰缘冠军」", + "battle_hoenn_champion_g5": "黑2白2「决战!丰缘冠军」", + "battle_hoenn_champion_g6": "Ω红宝石α蓝宝石「决战!丰缘冠军」", "battle_sinnoh_champion": "黑2白2「决战!神奥冠军」", "battle_champion_alder": "黑白「决战!合众冠军」", "battle_champion_iris": "黑2白2「决战!合众冠军」", @@ -79,13 +78,21 @@ export const bgmName: SimpleTranslationEntries = { "battle_galactic_grunt": "晶灿钻石·明亮珍珠「战斗!银河队」", "battle_plasma_grunt": "黑白「战斗!等离子团」", "battle_flare_grunt": "XY「战斗!闪焰队」", + "battle_aether_grunt": "日月「战斗!以太基金会」", + "battle_skull_grunt": "日月「战斗!骷髅队」", + "battle_macro_grunt": "剑盾「战斗!马洛科蒙集团」", + "battle_galactic_admin": "晶灿钻石·明亮珍珠「战斗!银河队干部」", + "battle_skull_admin": "日月「战斗!骷髅队干部」", + "battle_oleana": "剑盾「战斗!奥利薇」", "battle_rocket_boss": "究极日月「战斗!坂木」", "battle_aqua_magma_boss": "Ω红宝石α蓝宝石「战斗!水梧桐・赤焰松」", "battle_galactic_boss": "晶灿钻石·明亮珍珠「战斗!赤日」", "battle_plasma_boss": "黑2白2「战斗!魁奇思」", "battle_flare_boss": "XY「战斗!弗拉达利」", + "battle_aether_boss": "日月「战斗!露莎米奈」", + "battle_skull_boss": "日月「战斗!古兹马」", + "battle_macro_boss": "剑盾「战斗!洛兹」", - // Biome Music "abyss": "空之探险队「黑暗小丘」", "badlands": "空之探险队「枯竭之谷」", "beach": "空之探险队「潮湿岩地」", @@ -101,18 +108,18 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "空之探险队「神秘森林」", "ice_cave": "空之探险队「大冰山」", "island": "空之探险队「沿岸岩地」", - "jungle": "Lmz - 丛林", // The composer thinks about a more creative name - "laboratory": "Firel - 研究所", // The composer thinks about a more creative name + "jungle": "Lmz - 丛林", + "laboratory": "Firel - 研究所", "lake": "空之探险队「水晶洞窟」", "meadow": "空之探险队「天空顶端(森林)」", - "metropolis": "Firel - 城市", // The composer thinks about a more creative name + "metropolis": "Firel - 城市", "mountain": "空之探险队「角山」", "plains": "空之探险队「天空顶端(草原)」", "power_plant": "空之探险队「电气平原 深处」", "ruins": "空之探险队「封印岩地 深处」", - "sea": "空之探险队「石滩洞窟」", - "seabed": "Firel - 海底", // The composer thinks about a more creative name - "slum": "空之探险队「天空顶端(岩场)」", + "sea": "Andr06 - Marine Mystique", + "seabed": "Firel - 海底", + "slum": "Andr06 - Sneaky Snom", "snowy_forest": "空之探险队「天空顶端(雪山)」", "space": "Firel - 太空", "swamp": "空之探险队「封闭之海」", @@ -121,8 +128,6 @@ export const bgmName: SimpleTranslationEntries = { "town": "空之探险队「随机迷宫3」", "volcano": "空之探险队「热水洞窟」", "wasteland": "空之探险队「梦幻高原」", - - // Encounter "encounter_ace_trainer": "黑白 「视线!精英训练师」", "encounter_backpacker": "黑白 「视线!背包客」", "encounter_clerk": "黑白 「视线!上班族」", @@ -137,9 +142,7 @@ export const bgmName: SimpleTranslationEntries = { "encounter_scientist": "黑白 「视线!科学家」", "encounter_twins": "黑白 「视线!双胞胎」", "encounter_youngster": "黑白 「视线!短裤小子」", - - // Other "heal": "黑白「宝可梦回复」", "menu": "空之探险队「欢迎来到宝可梦的世界」", - "title": "空之探险队「主题曲」", -} as const; + "title": "空之探险队「主题曲」" +} diff --git a/src/locales/zh_CN/biome.ts b/src/locales/zh_CN/biome.json similarity index 85% rename from src/locales/zh_CN/biome.ts rename to src/locales/zh_CN/biome.json index 9026dc7fbee..114b0638e0b 100644 --- a/src/locales/zh_CN/biome.ts +++ b/src/locales/zh_CN/biome.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { +{ "unknownLocation": "未知领域", "TOWN": "城镇", "PLAINS": "平原", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "冰雪森林", "ISLAND": "岛屿", "LABORATORY": "研究所", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/zh_CN/challenges.ts b/src/locales/zh_CN/challenges.json similarity index 57% rename from src/locales/zh_CN/challenges.ts rename to src/locales/zh_CN/challenges.json index 4c1b523ef16..9351ec96285 100644 --- a/src/locales/zh_CN/challenges.ts +++ b/src/locales/zh_CN/challenges.json @@ -1,6 +1,4 @@ -import { TranslationEntries } from "#app/interfaces/locales"; - -export const challenges: TranslationEntries = { +{ "title": "适用挑战条件", "illegalEvolution": "{{pokemon}}变成了\n不符合此挑战条件的宝可梦!", "singleGeneration": { @@ -15,11 +13,24 @@ export const challenges: TranslationEntries = { "gen_6": "六", "gen_7": "七", "gen_8": "八", - "gen_9": "九", + "gen_9": "九" }, "singleType": { "name": "单属性", "desc": "你只能使用{{type}}\n属性的宝可梦", "desc_default": "你只能使用所选\n属性的宝可梦" }, -} as const; + "freshStart": { + "name": "初次尝试", + "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/command-ui-handler.json b/src/locales/zh_CN/command-ui-handler.json new file mode 100644 index 00000000000..b65ba643e05 --- /dev/null +++ b/src/locales/zh_CN/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "战斗", + "ball": "精灵球", + "pokemon": "宝可梦", + "run": "逃跑", + "actionMessage": "要让\n{{pokemonName}} 做什么?" +} \ No newline at end of file diff --git a/src/locales/zh_CN/command-ui-handler.ts b/src/locales/zh_CN/command-ui-handler.ts deleted file mode 100644 index 57397a930df..00000000000 --- a/src/locales/zh_CN/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "战斗", - "ball": "精灵球", - "pokemon": "宝可梦", - "run": "逃跑", - "actionMessage": "要让\n{{pokemonName}} 做什么?", -} as const; diff --git a/src/locales/zh_CN/common.json b/src/locales/zh_CN/common.json new file mode 100644 index 00000000000..bf639f0875c --- /dev/null +++ b/src/locales/zh_CN/common.json @@ -0,0 +1,8 @@ +{ + "start": "开始", + "luckIndicator": "幸运:", + "shinyOnHover": "闪光", + "commonShiny": "常见", + "rareShiny": "稀有", + "epicShiny": "史诗" +} \ No newline at end of file diff --git a/src/locales/zh_CN/common.ts b/src/locales/zh_CN/common.ts deleted file mode 100644 index 29f54ff0dc9..00000000000 --- a/src/locales/zh_CN/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "开始", -} as const; diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 1d987eaec16..44a190d8c11 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -1,94 +1,113 @@ -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const zhCnConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - statusEffect: statusEffect, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather, - partyUiHandler: partyUiHandler + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory, }; diff --git a/src/locales/zh_CN/dialogue-double-battle.json b/src/locales/zh_CN/dialogue-double-battle.json new file mode 100644 index 00000000000..5ab6bf49890 --- /dev/null +++ b/src/locales/zh_CN/dialogue-double-battle.json @@ -0,0 +1,82 @@ +{ + "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-final-boss.json b/src/locales/zh_CN/dialogue-final-boss.json new file mode 100644 index 00000000000..edbc302dcd4 --- /dev/null +++ b/src/locales/zh_CN/dialogue-final-boss.json @@ -0,0 +1,5 @@ +{ + "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-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.json b/src/locales/zh_CN/dialogue.json new file mode 100644 index 00000000000..5a4615fac54 --- /dev/null +++ b/src/locales/zh_CN/dialogue.json @@ -0,0 +1,2691 @@ +{ + "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.ts b/src/locales/zh_CN/dialogue.ts deleted file mode 100644 index 6afbcd71064..00000000000 --- a/src/locales/zh_CN/dialogue.ts +++ /dev/null @@ -1,2458 +0,0 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Dialogue of the NPCs in the game when the player character is male (or unset) -export const PGMdialogue: DialogueTranslationEntries = { - "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: "好像是我晕船了…" - }, - }, - "rocket_grunt": { - "encounter": { - 1: "你要有麻烦了!" - }, - "victory": { - 1: "好讨厌的感觉啊!" - }, - }, - "magma_grunt": { - "encounter": { - 1: "如果你挡在熔岩队路上,那就别指望我们手下留情!" - }, - "victory": { - 1: "哈?我输了?!" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "即使是小孩,如果要和海洋队作对,也别指望我们手下留情!" - }, - "victory": { - 1: "你在开玩笑吧?" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "别惹银河队!" - }, - "victory": { - 1: "停机了…" - }, - }, - "plasma_grunt": { - "encounter": { - 1: "异端不共戴天!" - }, - "victory": { - 1: "等离子子子子子子!" - }, - }, - "flare_grunt": { - "encounter": { - 1: "时尚最重要!" - }, - "victory": { - 1: "未来一片黑暗啊…" - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "我不得不说,能来到这里,你的确很不简单!" - }, - "victory": { - 1: "什么!这不可能!" - }, - "defeat": { - 1: "记住我的话。无法衡量自己的力量,说明你还是个孩子。" - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "我的老伙计还需要我…你要挡我的路吗?" - }, - "victory": { - 1: "这怎么可能…?\n火箭队的梦想…就这么成为泡影了…" - }, - "defeat": { - 1: "火箭队会重生,而我会统治世界!" - } - }, - "magma_boss_maxie_1": { - "encounter": { - 1: "我会亲手埋葬你,希望你能喜欢!" - }, - "victory": { - 1: "啊!你…很厉害…我落后了…一点…" - }, - "defeat": { - 1: "熔岩队必胜!" - } - }, - "magma_boss_maxie_2": { - "encounter": { - 1: "你是我实现目标最后的障碍。\n准备好迎接我最强的一击吧!哈哈哈哈!" - }, - "victory": { - 1: "这…这不…呃" - }, - "defeat": { - 1: "现在…我要把这个星球变成人类的理想国度!" - } - }, - "aqua_boss_archie_1": { - "encounter": { - 1: "我是海洋队的老大,所以,你的路大概走到头了。" - }, - "victory": { - 1: "下次再见吧。我会记住你的脸的。" - }, - "defeat": { - 1: "天才!我的队伍不会再退缩了!" - } - }, - "aqua_boss_archie_2": { - "encounter": { - 1: "我等这一天很久了。\n这就是我的真实力量!" - }, - "victory": { - 1: "果然很强……啊!" - }, - "defeat": { - 1: "我会让这世界上的一切回归到最初的纯净状态!!" - } - }, - "galactic_boss_cyrus_1": { - "encounter": { - 1: "但在这之前,让我见识见识你那敢向银河队叫板的实力吧。" - }, - "victory": { - 1: "有意思,简直太有意思了。" - }, - "defeat": { - 1: "我要创造我的新世界…" - } - }, - "galactic_boss_cyrus_2": { - "encounter": { - 1: "是啊,我和你还真是有缘呢。\n不过,这段孽缘…就让我在此斩断吧!" - }, - "victory": { - 1: "怎么可能!怎么可能!怎么可能!" - }, - "defeat": { - 1: "永别了。" - } - }, - "plasma_boss_ghetsis_1": { - "encounter": { - 1: "无论是谁做了什么!都无法阻止我!" - }, - "victory": { - 1: "怎么回事?我可是建立了等离子队的完美的人啊!\n是要改变世界的完美的统治者!" - }, - "defeat": { - 1: "我是坐拥世界的完美统治者!哇哈哈哈!" - } - }, - "plasma_boss_ghetsis_2": { - "encounter": { - 1: "来吧!让我看看你彻底绝望时的那张脸!" - }, - "victory": { - 1: "不!我的伟大目标!我要完全支配世界啊!" - }, - "defeat": { - 1: "酋雷姆!融合吧!" - } - }, - "flare_boss_lysandre_1": { - "encounter": { - 1: "你想要阻止我?在对战中展示给我看吧!" - }, - "victory": { - 1: "看来你的确是想要阻止我。但是,先等一下。" - }, - "defeat": { - 1: "宝可梦…不该存在。" - } - }, - "flare_boss_lysandre_2": { - "encounter": { - 1: "你我的未来…究竟哪个才正确,\n就让我们来问问各自的宝可梦吧!" - }, - "victory": { - 1: "哇啊啊啊!" - }, - "defeat": { - 1: "没有远见的蠢货会继续玷污这个美丽的世界。" - } - }, - "brock": { - "encounter": { - 1: "我对岩石属性宝可梦的专精会击败你!来吧!", - 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: "你应该准备好了吧,\一起完成这美丽的艺术作品吧!", - }, - "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: `战斗结束后,我的心像是吹过了温和的风…… - $真是厉害!` - } - }, - "kieran": { - "encounter": { - 1: `我的努力让我越来越强! - $所以我不会输。` - }, - "victory": { - 1: `不可能…… - $真是一场有趣又激动人心的战斗啊!` - }, - "defeat": { - 1: `哇塞,好一场战斗! - $你得多练练了。` - } - }, - "rival": { - "encounter": { - 1: "@c{smile}嘿,我在找你呢!我知道你急着上路,\n但至少说个再见吧…$@c{smile_eclosed}所以你终于要开始追逐梦想了?\n我几乎不敢相信。$@c{serious_smile_fists}来都来了,来一场对战怎么样?\n毕竟,我想看看你是不是准备周全了。$@c{serious_mopen_fists}不要手下留情,我想让你全力以赴!", - }, - "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}……谢谢你。", - - }, - }, -}; - - -// Dialogue of the NPCs in the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = PGMdialogue; - -// Dialogue of the endboss of the game when the player character is male (Or unset) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `看来终于又到了那个时候。\n你知道自己为何会来到这里,不是吗? - $你被吸引到这里,因为你以前就来过这里。\n无数次。 - $尽管,或许可以数一数。\n准确地说,这实际上是你的第5,643,853次循环。 - $每一次循环,你的思想都会恢复到之前的状态。\n即便如此,不知何故,你之前自我的残留仍然存在。 - $直到现在,你仍未成功,\n但我感觉这次你身上有一种异样的气息。 - $你是这里唯一的人,尽管感觉上还有……另一个人。 - $你最终会成为对我来的一个硬茬吗?\n我渴望了数千年的挑战? - $我们,开始。`, - "firstStageWin": `我明白了。我所感觉到的气息确实是真实的。\n看来我不再需要保留实力了。 - $别让我失望。`, - "secondStageWin": "…漂亮。" -}; - -// Dialogue of the endboss of the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDialogue; - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}哦?你赢了?@d{96} @c{smile_eclosed}我应该早猜到了\n你回来了。 - $@c{smile}结束了。@d{64} 你终结了这个循环。 - $@c{serious_smile_fists}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。 - $@c{neutral}我是唯一能够记得你所作所为的人@d{96}\n我觉得这应该也还行吧? - $@c{serious_smile_fists}你的传奇将永远留存于我们心中。 - $@c{smile_eclosed}不管了,我真是受够这个地方了,你也一样吗?我们回家吧。 - $@c{serious_smile_fists}可能等我们回家以后,再打一场?\n要是你想的话`, - "ending_female": - `@c{shock}你回来了?@d{32} 也就是说…@d{96} 你赢了呀!?\n@c{smile_ehalf}我应该早料到了。 - $@c{smile_eclosed}当然…我一直有这种感觉\n@c{smile}一切都结束了,对么? 你打破了循环。 - $@c{smile_ehalf}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。 - $我是唯一能够记得你所作所为的人\n@c{angry_mopen}我会努力不忘掉哒! - $@c{smile_wave_wink}开玩笑啦,@d{64} @c{smile}我才不会忘呢。@d{32}\n你的传奇将永远留存于我们心中。 - $@c{smile_wave}不管了,@d{64} 时候不早了@d{96} ,应该吧?\n在这地方还真搞不清楚。 - $一起回家吧。 @c{smile_wave_wink}可能明天,我们再来打一场,为了重温回忆嘛~`, -}; -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; - - -// Dialogue of the named double battles in the game. For when the player is male (or unset). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "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: "聂梓:这首歌献给大家!$玛俐:哥哥……", - }, - }, -}; - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = PGMdoubleBattleDialogue; diff --git a/src/locales/zh_CN/egg.ts b/src/locales/zh_CN/egg.json similarity index 88% rename from src/locales/zh_CN/egg.ts rename to src/locales/zh_CN/egg.json index 35334d75bdd..5a299368873 100644 --- a/src/locales/zh_CN/egg.ts +++ b/src/locales/zh_CN/egg.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { +{ "egg": "蛋", "greatTier": "稀有", "ultraTier": "史诗", @@ -22,4 +20,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} 从蛋中孵化了!", "eggMoveUnlock": "蛋招式已解锁: {{moveName}}", "rareEggMoveUnlock": "稀有蛋招式已解锁: {{moveName}}", -} as const; + "moveUPGacha": "蛋招式UP!", + "shinyUPGacha": "闪光UP!", + "legendaryUPGacha": "UP!" +} \ No newline at end of file diff --git a/src/locales/zh_CN/fight-ui-handler.json b/src/locales/zh_CN/fight-ui-handler.json new file mode 100644 index 00000000000..8496bf2c1ea --- /dev/null +++ b/src/locales/zh_CN/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "威力", + "accuracy": "命中", + "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", + "passive": "被动 " +} \ No newline at end of file diff --git a/src/locales/zh_CN/fight-ui-handler.ts b/src/locales/zh_CN/fight-ui-handler.ts deleted file mode 100644 index 07865250d9f..00000000000 --- a/src/locales/zh_CN/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "威力", - "accuracy": "命中", - "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", - "passive": "被动 ", // The space at the end is important -} as const; diff --git a/src/locales/zh_CN/filter-bar.json b/src/locales/zh_CN/filter-bar.json new file mode 100644 index 00000000000..1726d40d268 --- /dev/null +++ b/src/locales/zh_CN/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "世代", + "typeFilter": "属性", + "caughtFilter": "捕获", + "unlocksFilter": "解锁", + "miscFilter": "混合", + "sortFilter": "排序", + "all": "全部", + "normal": "无闪光", + "uncaught": "未捕获", + "passive": "被动", + "passiveUnlocked": "被动解锁", + "passiveLocked": "被动未解锁", + "passiveUnlockable": "被动可解锁", + "costReduction": "费用降低", + "costReductionUnlocked": "已降费", + "costReductionLocked": "未降费", + "costReductionUnlockable": "可降费", + "favorite": "最爱", + "isFavorite": "包含最爱", + "notFavorite": "不包含最爱", + "ribbon": "缎带", + "hasWon": "有缎带", + "hasNotWon": "无缎带", + "hiddenAbility": "梦特", + "hasHiddenAbility": "有梦特", + "noHiddenAbility": "无梦特", + "egg": "蛋", + "eggPurchasable": "可购买蛋", + "pokerus": "病毒", + "hasPokerus": "有病毒", + "noPokerus": "无病毒", + "sortByNumber": "编号", + "sortByCost": "费用", + "sortByCandies": "糖果", + "sortByIVs": "个体", + "sortByName": "名称" +} \ No newline at end of file diff --git a/src/locales/zh_CN/game-mode.json b/src/locales/zh_CN/game-mode.json new file mode 100644 index 00000000000..810f943b400 --- /dev/null +++ b/src/locales/zh_CN/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "经典模式", + "endless": "无尽模式", + "endlessSpliced": "融合无尽模式", + "dailyRun": "每日挑战", + "unknown": "未知", + "challenge": "挑战模式" +} diff --git a/src/locales/zh_CN/game-mode.ts b/src/locales/zh_CN/game-mode.ts deleted file mode 100644 index ed96ac4c78e..00000000000 --- a/src/locales/zh_CN/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "经典模式", - "endless": "无尽模式", - "endlessSpliced": "融合无尽模式", - "dailyRun": "每日挑战", - "unknown": "未知", - "challenge": "挑战模式", -} as const; diff --git a/src/locales/zh_CN/game-stats-ui-handler.ts b/src/locales/zh_CN/game-stats-ui-handler.json similarity index 87% rename from src/locales/zh_CN/game-stats-ui-handler.ts rename to src/locales/zh_CN/game-stats-ui-handler.json index 9fb3b9f5af8..94f767e14e3 100644 --- a/src/locales/zh_CN/game-stats-ui-handler.ts +++ b/src/locales/zh_CN/game-stats-ui-handler.json @@ -1,44 +1,42 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "统计", - "playTime": "游戏时间", - "totalBattles": "总战斗次数", - "starters": "初始宝可梦", - "shinyStarters": "闪光初始宝可梦", - "speciesSeen": "遇到的种类", - "speciesCaught": "捕捉的种类", - "ribbonsOwned": "拥有缎带数", - "classicRuns": "经典模式次数", - "classicWins": "经典模式通关次数", - "dailyRunAttempts": "每日挑战次数", - "dailyRunWins": "每日挑战通关次数", - "endlessRuns": "无尽模式挑战次数", - "highestWaveEndless": "最高层数(无尽)", - "highestMoney": "最多金钱", - "highestDamage": "最高伤害", - "highestHPHealed": "最多治疗", - "pokemonEncountered": "遇敌数量", - "pokemonDefeated": "打倒数量", - "pokemonCaught": "捕捉数量", - "eggsHatched": "孵蛋数量", - "subLegendsSeen": "遇到的二级神宝可梦", - "subLegendsCaught": "捕捉的二级神宝可梦", - "subLegendsHatched": "孵化的二级神宝可梦", - "legendsSeen": "遇到的传说宝可梦", - "legendsCaught": "捕捉的传说宝可梦", - "legendsHatched": "孵化的传说宝可梦", - "mythicalsSeen": "遇到的幻兽宝可梦", - "mythicalsCaught": "捕捉的幻兽宝可梦", - "mythicalsHatched": "孵化的幻兽宝可梦", - "shiniesSeen": "遇到的闪光宝可梦", - "shiniesCaught": "捕捉的闪光宝可梦", - "shiniesHatched": "孵化的闪光宝可梦", - "pokemonFused": "融合宝可梦次数", - "trainersDefeated": "打败的训练师数", - "eggsPulled": "总扭蛋次数", - "rareEggsPulled": "稀有扭蛋数", - "epicEggsPulled": "史诗扭蛋数", - "legendaryEggsPulled": "传说扭蛋数", - "manaphyEggsPulled": "玛娜霏扭蛋数", -} as const; +{ + "stats": "统计", + "playTime": "游戏时间", + "totalBattles": "总战斗次数", + "starters": "初始宝可梦", + "shinyStarters": "闪光初始宝可梦", + "speciesSeen": "遇到的种类", + "speciesCaught": "捕捉的种类", + "ribbonsOwned": "拥有缎带数", + "classicRuns": "经典模式次数", + "classicWins": "经典模式通关次数", + "dailyRunAttempts": "每日挑战次数", + "dailyRunWins": "每日挑战通关次数", + "endlessRuns": "无尽模式挑战次数", + "highestWaveEndless": "最高层数(无尽)", + "highestMoney": "最多金钱", + "highestDamage": "最高伤害", + "highestHPHealed": "最多治疗", + "pokemonEncountered": "遇敌数量", + "pokemonDefeated": "打倒数量", + "pokemonCaught": "捕捉数量", + "eggsHatched": "孵蛋数量", + "subLegendsSeen": "遇到的二级神宝可梦", + "subLegendsCaught": "捕捉的二级神宝可梦", + "subLegendsHatched": "孵化的二级神宝可梦", + "legendsSeen": "遇到的传说宝可梦", + "legendsCaught": "捕捉的传说宝可梦", + "legendsHatched": "孵化的传说宝可梦", + "mythicalsSeen": "遇到的幻兽宝可梦", + "mythicalsCaught": "捕捉的幻兽宝可梦", + "mythicalsHatched": "孵化的幻兽宝可梦", + "shiniesSeen": "遇到的闪光宝可梦", + "shiniesCaught": "捕捉的闪光宝可梦", + "shiniesHatched": "孵化的闪光宝可梦", + "pokemonFused": "融合宝可梦次数", + "trainersDefeated": "打败的训练师数", + "eggsPulled": "总扭蛋次数", + "rareEggsPulled": "稀有扭蛋数", + "epicEggsPulled": "史诗扭蛋数", + "legendaryEggsPulled": "传说扭蛋数", + "manaphyEggsPulled": "玛娜霏扭蛋数" +} diff --git a/src/locales/zh_CN/growth.ts b/src/locales/zh_CN/growth.json similarity index 50% rename from src/locales/zh_CN/growth.ts rename to src/locales/zh_CN/growth.json index 9362810c4f8..4ae2f5e5743 100644 --- a/src/locales/zh_CN/growth.ts +++ b/src/locales/zh_CN/growth.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { - "Erratic": "非常快", - "Fast": "快", - "Medium_Fast": "较快", - "Medium_Slow": "较慢", - "Slow": "慢", - "Fluctuating": "非常慢" -} as const; +{ + "Erratic": "非常快", + "Fast": "快", + "Medium_Fast": "较快", + "Medium_Slow": "较慢", + "Slow": "慢", + "Fluctuating": "非常慢" +} \ No newline at end of file diff --git a/src/locales/zh_CN/menu-ui-handler.ts b/src/locales/zh_CN/menu-ui-handler.json similarity index 70% rename from src/locales/zh_CN/menu-ui-handler.ts rename to src/locales/zh_CN/menu-ui-handler.json index 71d79472a45..c8ecaa6dd98 100644 --- a/src/locales/zh_CN/menu-ui-handler.ts +++ b/src/locales/zh_CN/menu-ui-handler.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { +{ "GAME_SETTINGS": "游戏设置", "ACHIEVEMENTS": "成就", "STATS": "数据统计", - "VOUCHERS": "兑换券", + "RUN_HISTORY": "历史记录", "EGG_LIST": "蛋列表", "EGG_GACHA": "扭蛋机", "MANAGE_DATA": "管理数据", @@ -16,9 +14,16 @@ export const menuUiHandler: SimpleTranslationEntries = { "importSlotSelect": "选择要导入到的存档位。", "exportSession": "导出存档", "exportSlotSelect": "选择要导出的存档位。", + "importRunHistory":"导入历史记录", + "exportRunHistory":"导出历史记录", "importData": "导入数据", "exportData": "导出数据", + "consentPreferences": "同意偏好", + "linkDiscord": "关联Discord", + "unlinkDiscord": "解除关联Discord", + "linkGoogle": "关联Google", + "unlinkGoogle": "解除关联Google", "cancel": "取消", "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。\n是否继续?", "noEggs": "当前没有任何蛋\n正在孵化中!" -} as const; +} \ No newline at end of file diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.json similarity index 87% rename from src/locales/zh_CN/menu.ts rename to src/locales/zh_CN/menu.json index c19c41333e8..8946b5b8df6 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.json @@ -1,11 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const menu: SimpleTranslationEntries = { +{ "cancel": "取消", "continue": "继续", "dailyRun": "每日挑战 (Beta)", @@ -17,6 +10,7 @@ export const menu: SimpleTranslationEntries = { "username": "用户名", "password": "密码", "login": "登录", + "Or use": "或使用", "register": "注册", "emptyUsername": "用户名不能为空", "invalidLoginUsername": "输入的用户名无效", @@ -54,5 +48,10 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "免责声明", "disclaimerDescription": "这个游戏尚未完成; 可能存在游戏性问题(包括潜在的丢档风险)、\n 不经通知的调整、 未来可能会更新或完成更多内容", "choosePokemon": "选择一只宝可梦。", + "renamePokemon": "给宝可梦起名", + "rename": "起名", + "nickname": "昵称", "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。", -} as const; + "noSaves": "你没有任何记录文件!", + "tooManySaves": "你的记录文件太多了!" +} diff --git a/src/locales/zh_CN/modifier-select-ui-handler.json b/src/locales/zh_CN/modifier-select-ui-handler.json new file mode 100644 index 00000000000..b3475737dfd --- /dev/null +++ b/src/locales/zh_CN/modifier-select-ui-handler.json @@ -0,0 +1,12 @@ +{ + "transfer": "交换道具", + "reroll": "刷新商店", + "lockRarities": "锁定稀有度", + "checkTeam": "查看队伍", + "transferDesc": "将宝可梦携带的道具交换给其他宝可梦", + "rerollDesc": "花钱刷新道具", + "lockRaritiesDesc": "在刷新时锁定道具稀有度(影响刷新费用)", + "checkTeamDesc": "检查队伍或使用形态改变道具", + "rerollCost": "₽{{formattedMoney}}", + "itemCost": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/zh_CN/modifier-type.json b/src/locales/zh_CN/modifier-type.json new file mode 100644 index 00000000000..26e4c2dc110 --- /dev/null +++ b/src/locales/zh_CN/modifier-type.json @@ -0,0 +1,607 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{modifierCount}}x {{pokeballName}}", + "description": "获得 {{pokeballName}} x{{modifierCount}} (已有:{{pokeballAmount}}) \n捕捉倍率:{{catchRate}}。" + }, + "AddVoucherModifierType": { + "name": "{{modifierCount}}x {{voucherTypeName}}", + "description": "获得 {{voucherTypeName}} x{{modifierCount}}。" + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}} 无法携带\n这个物品!", + "tooMany": "{{pokemonName}} 已有太多\n这个物品!" + } + }, + "PokemonHpRestoreModifierType": { + "description": "为一只宝可梦回复{{restorePoints}}HP或{{restorePercent}}%HP,取较大值。", + "extra": { + "fully": "为一只宝可梦回复全部HP。", + "fullyWithStatus": "为一只宝可梦回复全部HP并消除所有负面\n状态。" + } + }, + "PokemonReviveModifierType": { + "description": "复活一只宝可梦并回复 {{restorePercent}}% HP。" + }, + "PokemonStatusHealModifierType": { + "description": "为一只宝可梦消除所有负面状态。" + }, + "PokemonPpRestoreModifierType": { + "description": "为一只宝可梦的一个招式回复 {{restorePoints}} PP。", + "extra": { + "fully": "完全回复一只宝可梦一个招式的PP。" + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "为一只宝可梦的所有招式回复 {{restorePoints}} PP。", + "extra": { + "fully": "为一只宝可梦的所有招式回复所有PP。" + } + }, + "PokemonPpUpModifierType": { + "description": "选择一只宝可梦的一个招式使用\n使其PP最大值提升基础的20% (最多3次)。" + }, + "PokemonNatureChangeModifierType": { + "name": "{{natureName}}薄荷", + "description": "将一只宝可梦的性格改为{{natureName}}并为\n该宝可梦永久解锁该性格。" + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "遭遇双打概率提升四倍,持续{{battleCount}}场战斗。" + }, + "TempStatStageBoosterModifierType": { + "description": "提升全队的{{stat}}{{amount}}级,持续5场战斗。", + "extra": { + "stage": "1阶", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "一只宝可梦的{{moveType}}系招式威力提升20%。" + }, + "PokemonLevelIncrementModifierType": { + "description": "使一只宝可梦的等级提升{{levels}}级。" + }, + "AllPokemonLevelIncrementModifierType": { + "description": "使一只寶可夢的等級提升{{levels}}級。" + }, + "BaseStatBoosterModifierType": { + "description": "增加10%持有者的{{stat}},\n个体值越高堆叠上限越高。" + }, + "AllPokemonFullHpRestoreModifierType": { + "description": "所有宝可梦完全回复HP。" + }, + "AllPokemonFullReviveModifierType": { + "description": "复活所有濒死的宝可梦,\n并完全回复HP。" + }, + "MoneyRewardModifierType": { + "description": "获得{{moneyMultiplier}}金钱(₽{{moneyAmount}})。", + "extra": { + "small": "少量", + "moderate": "中等", + "large": "大量" + } + }, + "ExpBoosterModifierType": { + "description": "经验值获取量增加{{boostPercent}}%。" + }, + "PokemonExpBoosterModifierType": { + "description": "持有者经验值获取量增加{{boostPercent}}%。" + }, + "PokemonFriendshipBoosterModifierType": { + "description": "每场战斗获得的好感度提升50%。" + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "招式命中率增加{{accuracyAmount}}(最大100)。" + }, + "PokemonMultiHitModifierType": { + "description": "攻击以40/25/12.5%的伤害造成2/3/4次伤害" + }, + "TmModifierType": { + "name": "招式学习器\n{{moveId}} - {{moveName}}", + "description": "教会一只宝可梦{{moveName}}。" + }, + "TmModifierTypeWithInfo": { + "name": "招式学习器\n{{moveId}} - {{moveName}}", + "description": "教会一只宝可梦{{moveName}}\n(按住C或者Shift查看更多信息)。" + }, + "EvolutionItemModifierType": { + "description": "使某些宝可梦进化。" + }, + "FormChangeItemModifierType": { + "description": "使某些宝可梦更改形态。" + }, + "FusePokemonModifierType": { + "description": "融合两只宝可梦 (改变特性, 平分基础点数\n和属性, 共享招式池)。" + }, + "TerastallizeModifierType": { + "name": "{{teraType}}太晶碎块", + "description": "持有者获得{{teraType}}太晶化,\n持续10场战斗。" + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "攻击时{{chancePercent}}%概率\n偷取对手物品。" + }, + "TurnHeldItemTransferModifierType": { + "description": "持有者每回合从对手那里\n获得一个持有的物品。" + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "攻击时{{chancePercent}}%概率造成{{statusEffect}}。" + }, + "EnemyEndureChanceModifierType": { + "description": "敌方增加{{chancePercent}}%的概率\n在本回合不会倒下。" + }, + "RARE_CANDY": { + "name": "神奇糖果" + }, + "RARER_CANDY": { + "name": "超神奇糖果" + }, + "MEGA_BRACELET": { + "name": "MEGA手镯", + "description": "能让携带着MEGA石战斗的宝可梦\n进行MEGA进化。" + }, + "DYNAMAX_BAND": { + "name": "极巨腕带", + "description": "能让携带着极巨菇菇战斗的宝可梦\n进行超极巨化。" + }, + "TERA_ORB": { + "name": "太晶珠", + "description": "能让携带着太晶碎块战斗的宝可梦\n进行太晶化。" + }, + "MAP": { + "name": "地图", + "description": "有概率允许你在切换地区时\n选择目的地。" + }, + "POTION": { + "name": "伤药" + }, + "SUPER_POTION": { + "name": "好伤药" + }, + "HYPER_POTION": { + "name": "厉害伤药" + }, + "MAX_POTION": { + "name": "全满药" + }, + "FULL_RESTORE": { + "name": "全复药" + }, + "REVIVE": { + "name": "活力碎片" + }, + "MAX_REVIVE": { + "name": "活力块" + }, + "FULL_HEAL": { + "name": "万灵药" + }, + "SACRED_ASH": { + "name": "圣灰" + }, + "REVIVER_SEED": { + "name": "复活种子", + "description": "受到技能攻击伤害濒死时,\n恢复该宝可梦的HP至1/2。" + }, + "WHITE_HERB": { + "name": "白色香草", + "description": "当携带它的宝可梦能力降低时,\n仅能回到之前的状态1次。" + }, + "ETHER": { + "name": "PP单项小补剂" + }, + "MAX_ETHER": { + "name": "PP单项全补剂" + }, + "ELIXIR": { + "name": "PP多项小补剂" + }, + "MAX_ELIXIR": { + "name": "PP多项全补剂" + }, + "PP_UP": { + "name": "PP提升剂" + }, + "PP_MAX": { + "name": "PP极限提升剂" + }, + "LURE": { + "name": "引虫香水" + }, + "SUPER_LURE": { + "name": "白银香水" + }, + "MAX_LURE": { + "name": "黄金香水" + }, + "MEMORY_MUSHROOM": { + "name": "回忆蘑菇", + "description": "回忆一个宝可梦已经遗忘的招式。" + }, + "EXP_SHARE": { + "name": "学习装置", + "description": "未参加对战的宝可梦获得20%的经验值。" + }, + "EXP_BALANCE": { + "name": "均衡型学习装置", + "description": "经验值会更多分给队伍中等级最低的宝可梦。" + }, + "OVAL_CHARM": { + "name": "圆形护符", + "description": "当多只宝可梦参与战斗,分别获得总经验值\n10%的额外经验值。" + }, + "EXP_CHARM": { + "name": "经验护符" + }, + "SUPER_EXP_CHARM": { + "name": "超级经验护符" + }, + "GOLDEN_EXP_CHARM": { + "name": "黄金经验护符" + }, + "LUCKY_EGG": { + "name": "幸运蛋" + }, + "GOLDEN_EGG": { + "name": "金蛋" + }, + "SOOTHE_BELL": { + "name": "安抚之铃" + }, + "SCOPE_LENS": { + "name": "焦点镜", + "description": "能看见弱点的镜片。携带它的宝可梦的招式\n会变得容易击中要害。" + }, + "DIRE_HIT": { + "name": "要害攻击", + "extra": { + "raises": "会心" + } + }, + "LEEK": { + "name": "大葱", + "description": "非常长且坚硬的茎。让大葱鸭携带后,\n招式会变得容易击中要害。" + }, + "EVIOLITE": { + "name": "进化奇石", + "description": "携带后,还能进化的宝可梦的\n防御和特防就会提高。" + }, + "SOUL_DEW": { + "name": "心之水滴", + "description": "增加10%宝可梦性格对数值的影响 (加算)。" + }, + "NUGGET": { + "name": "金珠" + }, + "BIG_NUGGET": { + "name": "巨大金珠" + }, + "RELIC_GOLD": { + "name": "古代金币" + }, + "AMULET_COIN": { + "name": "护符金币", + "description": "获得的金钱增加20%。" + }, + "GOLDEN_PUNCH": { + "name": "黄金拳头", + "description": "将50%造成的伤害转换为金钱。" + }, + "COIN_CASE": { + "name": "代币盒", + "description": "每10场战斗, 获得自己金钱10%的利息。" + }, + "LOCK_CAPSULE": { + "name": "上锁的容器", + "description": "允许在商店中刷新物品时,\n锁定物品的稀有度。" + }, + "GRIP_CLAW": { + "name": "紧缠钩爪" + }, + "WIDE_LENS": { + "name": "广角镜" + }, + "MULTI_LENS": { + "name": "多重镜" + }, + "HEALING_CHARM": { + "name": "治愈护符", + "description": "HP回复量增加10% (不含复活)。" + }, + "CANDY_JAR": { + "name": "糖果罐", + "description": "神奇糖果提供的升级额外增加1级。" + }, + "BERRY_POUCH": { + "name": "树果袋", + "description": "使用树果时有30%的几率不会消耗树果。" + }, + "FOCUS_BAND": { + "name": "气势头带", + "description": "携带该道具的宝可梦有10%几率在受到攻击\n而将陷入濒死状态时,保留1点HP不陷入濒死状态。" + }, + "QUICK_CLAW": { + "name": "先制之爪", + "description": "有10%的几率无视速度优先使出招式\n(先制技能优先)。" + }, + "KINGS_ROCK": { + "name": "王者之证", + "description": "使用任意原本不会造成畏缩状态的攻击,\n有10%几率使目标陷入畏缩状态。" + }, + "LEFTOVERS": { + "name": "吃剩的东西", + "description": "携带后,在每个回合结束时恢复\n最大HP的1/16。" + }, + "SHELL_BELL": { + "name": "贝壳之铃", + "description": "携带后,在攻击对方成功造成伤害时,\n携带者的HP会恢复其所造成伤害的1/8。" + }, + "TOXIC_ORB": { + "name": "剧毒宝珠", + "description": "触碰后会放出毒的神奇宝珠。\n携带后,在战斗时会变成剧毒状态。" + }, + "FLAME_ORB": { + "name": "火焰宝珠", + "description": "触碰后会放出热量的神奇宝珠。\n携带后,在战斗时会变成灼伤状态。" + }, + "BATON": { + "name": "接力棒", + "description": "允许在切换宝可梦时保留能力变化, 对陷阱\n同样生效。" + }, + "SHINY_CHARM": { + "name": "闪耀护符", + "description": "显著增加野生宝可梦的闪光概率。" + }, + "ABILITY_CHARM": { + "name": "特性护符", + "description": "显著增加野生宝可梦有隐藏特性的概率。" + }, + "IV_SCANNER": { + "name": "个体值探测器", + "description": "允许扫描野生宝可梦的个体值。每多拥有一个\n多显示两项个体值,优先显示最高项。" + }, + "DNA_SPLICERS": { + "name": "基因之楔" + }, + "MINI_BLACK_HOLE": { + "name": "迷你黑洞" + }, + "GOLDEN_POKEBALL": { + "name": "黄金精灵球", + "description": "在每场战斗结束后,增加一个额外物品选项。" + }, + "ENEMY_DAMAGE_BOOSTER": { + "name": "伤害硬币", + "description": "造成5%额外伤害(乘算)。" + }, + "ENEMY_DAMAGE_REDUCTION": { + "name": "防御硬币", + "description": "受到2.5%更少伤害(乘算)。" + }, + "ENEMY_HEAL": { + "name": "回复硬币", + "description": "每回合回复2%最大HP。" + }, + "ENEMY_ATTACK_POISON_CHANCE": { + "name": "剧毒硬币" + }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { + "name": "麻痹硬币" + }, + "ENEMY_ATTACK_BURN_CHANCE": { + "name": "灼烧硬币" + }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { + "name": "万灵药硬币", + "description": "增加2.5%每回合治愈异常状态的概率。" + }, + "ENEMY_ENDURE_CHANCE": { + "name": "忍受硬币" + }, + "ENEMY_FUSED_CHANCE": { + "name": "融合硬币", + "description": "增加1%野生融合宝可梦出现概率。" + } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { + "name": "电气球", + "description": "让皮卡丘携带后,\n攻击和特攻就会提高的神奇之球。" + }, + "THICK_CLUB": { + "name": "粗骨头", + "description": "某种坚硬的骨头。\n让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" + }, + "METAL_POWDER": { + "name": "金属粉", + "description": "让百变怪携带后,防御就会提高的神奇粉末。\n非常细腻坚硬。" + }, + "QUICK_POWDER": { + "name": "速度粉", + "description": "让百变怪携带后,速度就会提高的神奇粉末。\n非常细腻坚硬。" + } + }, + "TempStatStageBoosterItem": { + "x_attack": "力量强化", + "x_defense": "防御强化", + "x_sp_atk": "特攻强化", + "x_sp_def": "特防强化", + "x_speed": "速度强化", + "x_accuracy": "命中强化" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "丝绸围巾", + "black_belt": "黑带", + "sharp_beak": "锐利鸟嘴", + "poison_barb": "毒针", + "soft_sand": "柔软沙子", + "hard_stone": "硬石头", + "silver_powder": "银粉", + "spell_tag": "诅咒之符", + "metal_coat": "金属膜", + "charcoal": "木炭", + "mystic_water": "神秘水滴", + "miracle_seed": "奇迹种子", + "magnet": "磁铁", + "twisted_spoon": "弯曲的汤匙", + "never_melt_ice": "不融冰", + "dragon_fang": "龙之牙", + "black_glasses": "黑色眼镜", + "fairy_feather": "妖精之羽" + }, + "BaseStatBoosterItem": { + "hp_up": "HP增强剂", + "protein": "攻击增强剂", + "iron": "防御增强剂", + "calcium": "特攻增强剂", + "zinc": "特防增强剂", + "carbos": "速度增强剂" + }, + "EvolutionItem": { + "NONE": "无", + "LINKING_CORD": "联系绳", + "SUN_STONE": "日之石", + "MOON_STONE": "月之石", + "LEAF_STONE": "叶之石", + "FIRE_STONE": "火之石", + "WATER_STONE": "水之石", + "THUNDER_STONE": "雷之石", + "ICE_STONE": "冰之石", + "DUSK_STONE": "暗之石", + "DAWN_STONE": "觉醒之石", + "SHINY_STONE": "光之石", + "CRACKED_POT": "破裂的茶壶", + "SWEET_APPLE": "甜甜苹果", + "TART_APPLE": "酸酸苹果", + "STRAWBERRY_SWEET": "草莓糖饰", + "UNREMARKABLE_TEACUP": "凡作茶碗", + "CHIPPED_POT": "缺损的茶壶", + "BLACK_AUGURITE": "黑奇石", + "GALARICA_CUFF": "伽勒豆蔻手环", + "GALARICA_WREATH": "伽勒豆蔻花圈", + "PEAT_BLOCK": "泥炭块", + "AUSPICIOUS_ARMOR": "庆祝之铠", + "MALICIOUS_ARMOR": "咒术之铠", + "MASTERPIECE_TEACUP": "杰作茶碗", + "METAL_ALLOY": "复合金属", + "SCROLL_OF_DARKNESS": "恶之挂轴", + "SCROLL_OF_WATERS": "水之挂轴", + "SYRUPY_APPLE": "蜜汁苹果" + }, + "FormChangeItem": { + "NONE": "无", + "ABOMASITE": "暴雪王进化石", + "ABSOLITE": "阿勃梭鲁进化石", + "AERODACTYLITE": "化石翼龙进化石", + "AGGRONITE": "波士可多拉进化石", + "ALAKAZITE": "胡地进化石", + "ALTARIANITE": "七夕青鸟进化石", + "AMPHAROSITE": "电龙进化石", + "AUDINITE": "差不多娃娃进化石", + "BANETTITE": "诅咒娃娃进化石", + "BEEDRILLITE": "大针蜂进化石", + "BLASTOISINITE": "水箭龟进化石", + "BLAZIKENITE": "火焰鸡进化石", + "CAMERUPTITE": "喷火驼进化石", + "CHARIZARDITE_X": "喷火龙进化石X", + "CHARIZARDITE_Y": "喷火龙进化石Y", + "DIANCITE": "蒂安希进化石", + "GALLADITE": "艾路雷朵进化石", + "GARCHOMPITE": "烈咬陆鲨进化石", + "GARDEVOIRITE": "沙奈朵进化石", + "GENGARITE": "耿鬼进化石", + "GLALITITE": "冰鬼护进化石", + "GYARADOSITE": "暴鲤龙进化石", + "HERACRONITE": "赫拉克罗斯进化石", + "HOUNDOOMINITE": "黑鲁加进化石", + "KANGASKHANITE": "袋兽进化石", + "LATIASITE": "拉帝亚斯进化石", + "LATIOSITE": "拉帝欧斯进化石", + "LOPUNNITE": "长耳兔进化石", + "LUCARIONITE": "路卡利欧进化石", + "MANECTITE": "雷电兽进化石", + "MAWILITE": "大嘴娃进化石", + "MEDICHAMITE": "恰雷姆进化石", + "METAGROSSITE": "巨金怪进化石", + "MEWTWONITE_X": "超梦进化石X", + "MEWTWONITE_Y": "超梦进化石Y", + "PIDGEOTITE": "大比鸟进化石", + "PINSIRITE": "凯罗斯进化石", + "RAYQUAZITE": "烈空坐进化石", + "SABLENITE": "勾魂眼进化石", + "SALAMENCITE": "暴飞龙进化石", + "SCEPTILITE": "蜥蜴王进化石", + "SCIZORITE": "巨钳螳螂进化石", + "SHARPEDONITE": "巨牙鲨进化石", + "SLOWBRONITE": "呆壳兽进化石", + "STEELIXITE": "大钢蛇进化石", + "SWAMPERTITE": "巨沼怪进化石", + "TYRANITARITE": "班基拉斯进化石", + "VENUSAURITE": "妙蛙花进化石", + "BLUE_ORB": "靛蓝色宝珠", + "RED_ORB": "朱红色宝珠", + "SHARP_METEORITE": "锐利陨石", + "HARD_METEORITE": "坚硬陨石", + "SMOOTH_METEORITE": "光滑陨石", + "ADAMANT_CRYSTAL": "大金刚宝玉", + "LUSTROUS_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": "础石面具", + "SHOCK_DRIVE": "闪电卡带", + "BURN_DRIVE": "火焰卡带", + "CHILL_DRIVE": "冰冻卡带", + "DOUSE_DRIVE": "水流卡带", + "ULTRANECROZIUM_Z": "究极奈克洛Z", + "FIST_PLATE": "拳头石板", + "SKY_PLATE": "蓝天石板", + "TOXIC_PLATE": "剧毒石板", + "EARTH_PLATE": "大地石板", + "STONE_PLATE": "岩石石板", + "INSECT_PLATE": "玉虫石板", + "SPOOKY_PLATE": "妖怪石板", + "IRON_PLATE": "钢铁石板", + "FLAME_PLATE": "火球石板", + "SPLASH_PLATE": "水滴石板", + "MEADOW_PLATE": "碧绿石板", + "ZAP_PLATE": "雷电石板", + "MIND_PLATE": "神奇石板", + "ICICLE_PLATE": "冰柱石板", + "DRACO_PLATE": "龙之石板", + "DREAD_PLATE": "恶颜石板", + "PIXIE_PLATE": "妖精石板", + "BLANK_PLATE": "净空石板", + "LEGEND_PLATE": "传说石板", + "FIGHTING_MEMORY": "战斗存储碟", + "FLYING_MEMORY": "飞翔存储碟", + "POISON_MEMORY": "毒存储碟", + "GROUND_MEMORY": "大地存储碟", + "ROCK_MEMORY": "岩石存储碟", + "BUG_MEMORY": "虫子存储碟", + "GHOST_MEMORY": "幽灵存储碟", + "STEEL_MEMORY": "钢铁存储碟", + "FIRE_MEMORY": "火焰存储碟", + "WATER_MEMORY": "清水存储碟", + "GRASS_MEMORY": "青草存储碟", + "ELECTRIC_MEMORY": "电子存储碟", + "PSYCHIC_MEMORY": "精神存储碟", + "ICE_MEMORY": "冰雪存储碟", + "DRAGON_MEMORY": "龙存储碟", + "DARK_MEMORY": "黑暗存储碟", + "FAIRY_MEMORY": "妖精存储碟", + "NORMAL_MEMORY": "一般存储碟" + } +} diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts deleted file mode 100644 index 3ac9ac196cd..00000000000 --- a/src/locales/zh_CN/modifier-type.ts +++ /dev/null @@ -1,451 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - "AddPokeballModifierType": { - name: "{{modifierCount}}x {{pokeballName}}", - description: "获得 {{pokeballName}} x{{modifierCount}} (已有:{{pokeballAmount}}) \n捕捉倍率:{{catchRate}}。", - }, - "AddVoucherModifierType": { - name: "{{modifierCount}}x {{voucherTypeName}}", - description: "获得 {{voucherTypeName}} x{{modifierCount}}。", - }, - "PokemonHeldItemModifierType": { - extra: { - "inoperable": "{{pokemonName}} 无法携带\n这个物品!", - "tooMany": "{{pokemonName}} 已有太多\n这个物品!", - } - }, - "PokemonHpRestoreModifierType": { - description: "为一只宝可梦回复{{restorePoints}}HP或{{restorePercent}}%HP,取较大值。", - extra: { - "fully": "为一只宝可梦回复全部HP。", - "fullyWithStatus": "为一只宝可梦回复全部HP并消除所有负面\n状态。", - } - }, - "PokemonReviveModifierType": { - description: "复活一只宝可梦并回复 {{restorePercent}}% HP。", - }, - "PokemonStatusHealModifierType": { - description: "为一只宝可梦消除所有负面状态。", - }, - "PokemonPpRestoreModifierType": { - description: "为一只宝可梦的一个招式回复 {{restorePoints}} PP。", - extra: { - "fully": "完全回复一只宝可梦一个招式的PP。", - } - }, - "PokemonAllMovePpRestoreModifierType": { - description: "为一只宝可梦的所有招式回复 {{restorePoints}} PP。", - extra: { - "fully": "为一只宝可梦的所有招式回复所有PP。", - } - }, - "PokemonPpUpModifierType": { - description: "选择一只宝可梦的一个招式使用\n使其PP最大值提升基础的20% (最多3次)。", - }, - "PokemonNatureChangeModifierType": { - name: "{{natureName}}薄荷", - description: "将一只宝可梦的性格改为{{natureName}}并为\n该宝可梦永久解锁该性格。", - }, - "DoubleBattleChanceBoosterModifierType": { - description: "接下来的{{battleCount}}场战斗是双打的概率翻倍。", - }, - "TempBattleStatBoosterModifierType": { - description: "为所有成员宝可梦提升一级{{tempBattleStatName}},持续5场战斗。", - }, - "AttackTypeBoosterModifierType": { - description: "一只宝可梦的{{moveType}}系招式威力提升20%。", - }, - "PokemonLevelIncrementModifierType": { - description: "一只宝可梦等级提升1级。", - }, - "AllPokemonLevelIncrementModifierType": { - description: "所有成员宝可梦等级提升1级。", - }, - "PokemonBaseStatBoosterModifierType": { - description: "增加10%持有者的{{statName}},\n个体值越高堆叠上限越高。", - }, - "AllPokemonFullHpRestoreModifierType": { - description: "所有宝可梦完全回复HP。", - }, - "AllPokemonFullReviveModifierType": { - description: "复活所有濒死的宝可梦,\n并完全回复HP。", - }, - "MoneyRewardModifierType": { - description: "获得{{moneyMultiplier}}金钱(₽{{moneyAmount}})。", - extra: { - "small": "少量", - "moderate": "中等", - "large": "大量", - }, - }, - "ExpBoosterModifierType": { - description: "经验值获取量增加{{boostPercent}}%。", - }, - "PokemonExpBoosterModifierType": { - description: "持有者经验值获取量增加{{boostPercent}}%。", - }, - "PokemonFriendshipBoosterModifierType": { - description: "每场战斗获得的好感度提升50%。", - }, - "PokemonMoveAccuracyBoosterModifierType": { - description: "招式命中率增加{{accuracyAmount}}(最大100)。", - }, - "PokemonMultiHitModifierType": { - description: "攻击以40/25/12.5%的伤害造成2/3/4次伤害", - }, - "TmModifierType": { - name: "招式学习器\n{{moveId}} - {{moveName}}", - description: "教会一只宝可梦{{moveName}}。", - }, - "TmModifierTypeWithInfo": { - name: "招式学习器\n{{moveId}} - {{moveName}}", - description: "教会一只宝可梦{{moveName}}\n(按住C或者Shift查看更多信息)。", - }, - "EvolutionItemModifierType": { - description: "使某些宝可梦进化。", - }, - "FormChangeItemModifierType": { - description: "使某些宝可梦更改形态。", - }, - "FusePokemonModifierType": { - description: "融合两只宝可梦 (改变特性, 平分基础点数\n和属性, 共享招式池)。", - }, - "TerastallizeModifierType": { - name: "{{teraType}}太晶碎块", - description: "持有者获得{{teraType}}太晶化,\n持续10场战斗。", - }, - "ContactHeldItemTransferChanceModifierType": { - description: "攻击时{{chancePercent}}%概率\n偷取对手物品。", - }, - "TurnHeldItemTransferModifierType": { - description: "持有者每回合从对手那里\n获得一个持有的物品。", - }, - "EnemyAttackStatusEffectChanceModifierType": { - description: "攻击时{{chancePercent}}%概率造成{{statusEffect}}。", - }, - "EnemyEndureChanceModifierType": { - description: "敌方增加{{chancePercent}}%的概率\n在本回合不会倒下。", - }, - - "RARE_CANDY": { name: "神奇糖果" }, - "RARER_CANDY": { name: "超神奇糖果" }, - - "MEGA_BRACELET": { name: "MEGA手镯", description: "能让携带着MEGA石战斗的宝可梦\n进行MEGA进化。" }, - "DYNAMAX_BAND": { name: "极巨腕带", description: "能让携带着极巨菇菇战斗的宝可梦\n进行超极巨化。" }, - "TERA_ORB": { name: "太晶珠", description: "能让携带着太晶碎块战斗的宝可梦\n进行太晶化。" }, - - "MAP": { name: "地图", description: "有概率允许你在切换地区时\n选择目的地。"}, - - "POTION": { name: "伤药" }, - "SUPER_POTION": { name: "好伤药" }, - "HYPER_POTION": { name: "厉害伤药" }, - "MAX_POTION": { name: "全满药" }, - "FULL_RESTORE": { name: "全复药" }, - - "REVIVE": { name: "活力碎片" }, - "MAX_REVIVE": { name: "活力块" }, - - "FULL_HEAL": { name: "万灵药" }, - - "SACRED_ASH": { name: "圣灰" }, - - "REVIVER_SEED": { name: "复活种子", description: "恢复1只濒死宝可梦的HP至1/2。" }, - - "ETHER": { name: "PP单项小补剂" }, - "MAX_ETHER": { name: "PP单项全补剂" }, - - "ELIXIR": { name: "PP多项小补剂" }, - "MAX_ELIXIR": { name: "PP多项全补剂" }, - - "PP_UP": { name: "PP提升剂" }, - "PP_MAX": { name: "PP极限提升剂" }, - - "LURE": { name: "引虫香水" }, - "SUPER_LURE": { name: "白银香水" }, - "MAX_LURE": { name: "黄金香水" }, - - "MEMORY_MUSHROOM": { name: "回忆蘑菇", description: "回忆一个宝可梦已经遗忘的招式。" }, - - "EXP_SHARE": { name: "学习装置", description: "未参加对战的宝可梦获得20%的经验值。" }, - "EXP_BALANCE": { name: "均衡型学习装置", description: "经验值会更多分给队伍中等级最低的宝可梦。" }, - - "OVAL_CHARM": { name: "圆形护符", description: "当多只宝可梦参与战斗,分别获得总经验值\n10%的额外经验值。" }, - - "EXP_CHARM": { name: "经验护符" }, - "SUPER_EXP_CHARM": { name: "超级经验护符" }, - "GOLDEN_EXP_CHARM": { name: "黄金经验护符" }, - - "LUCKY_EGG": { name: "幸运蛋" }, - "GOLDEN_EGG": { name: "金蛋" }, - - "SOOTHE_BELL": { name: "安抚之铃" }, - - "EVIOLITE": { name: "进化奇石", description: "携带后,还能进化的宝可梦的\n防御和特防就会提高。" }, - - "SOUL_DEW": { name: "心之水滴", description: "增加10%宝可梦性格对数值的影响 (加算)。" }, - - "NUGGET": { name: "金珠" }, - "BIG_NUGGET": { name: "巨大金珠" }, - "RELIC_GOLD": { name: "古代金币" }, - - "AMULET_COIN": { name: "护符金币", description: "获得的金钱增加20%。" }, - "GOLDEN_PUNCH": { name: "黄金拳头", description: "将50%造成的伤害转换为金钱。" }, - "COIN_CASE": { name: "代币盒", description: "每10场战斗, 获得自己金钱10%的利息。" }, - - "LOCK_CAPSULE": { name: "上锁的容器", description: "允许在商店中刷新物品时,\n锁定物品的稀有度。" }, - - "GRIP_CLAW": { name: "紧缠钩爪" }, - "WIDE_LENS": { name: "广角镜" }, - - "MULTI_LENS": { name: "多重镜" }, - - "HEALING_CHARM": { name: "治愈护符", description: "HP回复量增加10% (不含复活)。" }, - "CANDY_JAR": { name: "糖果罐", description: "神奇糖果提供的升级额外增加1级。" }, - - "BERRY_POUCH": { name: "树果袋", description: "使用树果时有30%的几率不会消耗树果。" }, - - "FOCUS_BAND": { name: "气势头带", description: "携带该道具的宝可梦有10%几率在受到攻击\n而将陷入濒死状态时,保留1点HP不陷入濒死状态。" }, - - "QUICK_CLAW": { name: "先制之爪", description: "有10%的几率无视速度优先使出招式\n(先制技能优先)。" }, - - "KINGS_ROCK": { name: "王者之证", description: "使用任意原本不会造成畏缩状态的攻击,\n有10%几率使目标陷入畏缩状态。" }, - - "LEFTOVERS": { name: "吃剩的东西", description: "携带后,在每个回合结束时恢复\n最大HP的1/16。" }, - "SHELL_BELL": { name: "贝壳之铃", description: "携带后,在攻击对方成功造成伤害时,\n携带者的HP会恢复其所造成伤害的1/8。" }, - - "TOXIC_ORB": { name: "剧毒宝珠", description: "触碰后会放出毒的神奇宝珠。携带后,在战斗时会变成剧毒状态。" }, - "FLAME_ORB": { name: "火焰宝珠", description: "触碰后会放出热量的神奇宝珠。携带后,在战斗时会变成灼伤状态。" }, - - "BATON": { name: "接力棒", description: "允许在切换宝可梦时保留能力变化, 对陷阱\n同样生效。" }, - - "SHINY_CHARM": { name: "闪耀护符", description: "显著增加野生宝可梦的闪光概率。" }, - "ABILITY_CHARM": { name: "特性护符", description: "显著增加野生宝可梦有隐藏特性的概率。" }, - - "IV_SCANNER": { name: "个体值探测器", description: "允许扫描野生宝可梦的个体值。每多拥有一个\n多显示两项个体值,优先显示最高项。" }, - - "DNA_SPLICERS": { name: "基因之楔" }, - - "MINI_BLACK_HOLE": { name: "迷你黑洞" }, - - "GOLDEN_POKEBALL": { name: "黄金精灵球", description: "在每场战斗结束后,增加一个额外物品选项。" }, - - "ENEMY_DAMAGE_BOOSTER": { name: "伤害硬币", description: "造成5%额外伤害(乘算)。" }, - "ENEMY_DAMAGE_REDUCTION": { name: "防御硬币", description: "受到2.5%更少伤害(乘算)。" }, - "ENEMY_HEAL": { name: "回复硬币", description: "每回合回复2%最大HP。" }, - "ENEMY_ATTACK_POISON_CHANCE": { name: "剧毒硬币" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { name: "麻痹硬币" }, - "ENEMY_ATTACK_BURN_CHANCE": { name: "灼烧硬币" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "万灵药硬币", description: "增加2.5%每回合治愈异常状态的概率。" }, - "ENEMY_ENDURE_CHANCE": { name: "忍受硬币" }, - "ENEMY_FUSED_CHANCE": { name: "融合硬币", description: "增加1%野生融合宝可梦出现概率。" }, - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,攻击和特攻就会提高的神奇之球。" }, - "THICK_CLUB": { name: "粗骨头", description: "某种坚硬的骨头。让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" }, - "METAL_POWDER": { name: "金属粉", description: "让百变怪携带后,防御就会提高的神奇粉末。非常细腻坚硬。" }, - "QUICK_POWDER": { name: "速度粉", description: "让百变怪携带后,速度就会提高的神奇粉末。非常细腻坚硬。" } - }, - TempBattleStatBoosterItem: { - "x_attack": "力量强化", - "x_defense": "防御强化", - "x_sp_atk": "特攻强化", - "x_sp_def": "特防强化", - "x_speed": "速度强化", - "x_accuracy": "命中强化", - "dire_hit": "要害攻击", - }, - - TempBattleStatBoosterStatName: { - "ATK": "攻击", - "DEF": "防御", - "SPATK": "特攻", - "SPDEF": "特防", - "SPD": "速度", - "ACC": "命中", - "CRIT": "会心", - "EVA": "闪避", - "DEFAULT": "???", - }, - - AttackTypeBoosterItem: { - "silk_scarf": "丝绸围巾", - "black_belt": "黑带", - "sharp_beak": "锐利鸟嘴", - "poison_barb": "毒针", - "soft_sand": "柔软沙子", - "hard_stone": "硬石头", - "silver_powder": "银粉", - "spell_tag": "诅咒之符", - "metal_coat": "金属膜", - "charcoal": "木炭", - "mystic_water": "神秘水滴", - "miracle_seed": "奇迹种子", - "magnet": "磁铁", - "twisted_spoon": "弯曲的汤匙", - "never_melt_ice": "不融冰", - "dragon_fang": "龙之牙", - "black_glasses": "黑色眼镜", - "fairy_feather": "妖精之羽", - }, - BaseStatBoosterItem: { - "hp_up": "HP增强剂", - "protein": "攻击增强剂", - "iron": "防御增强剂", - "calcium": "特攻增强剂", - "zinc": "特防增强剂", - "carbos": "速度增强剂", - }, - EvolutionItem: { - "NONE": "无", - - "LINKING_CORD": "联系绳", - "SUN_STONE": "日之石", - "MOON_STONE": "月之石", - "LEAF_STONE": "叶之石", - "FIRE_STONE": "火之石", - "WATER_STONE": "水之石", - "THUNDER_STONE": "雷之石", - "ICE_STONE": "冰之石", - "DUSK_STONE": "暗之石", - "DAWN_STONE": "觉醒之石", - "SHINY_STONE": "光之石", - "CRACKED_POT": "破裂的茶壶", - "SWEET_APPLE": "甜甜苹果", - "TART_APPLE": "酸酸苹果", - "STRAWBERRY_SWEET": "草莓糖饰", - "UNREMARKABLE_TEACUP": "凡作茶碗", - - "CHIPPED_POT": "缺损的茶壶", - "BLACK_AUGURITE": "黑奇石", - "GALARICA_CUFF": "伽勒豆蔻手环", - "GALARICA_WREATH": "伽勒豆蔻花圈", - "PEAT_BLOCK": "泥炭块", - "AUSPICIOUS_ARMOR": "庆祝之铠", - "MALICIOUS_ARMOR": "咒术之铠", - "MASTERPIECE_TEACUP": "杰作茶碗", - "METAL_ALLOY": "复合金属", - "SCROLL_OF_DARKNESS": "恶之挂轴", - "SCROLL_OF_WATERS": "水之挂轴", - "SYRUPY_APPLE": "蜜汁苹果", - }, - FormChangeItem: { - "NONE": "无", - - "ABOMASITE": "暴雪王进化石", - "ABSOLITE": "阿勃梭鲁进化石", - "AERODACTYLITE": "化石翼龙进化石", - "AGGRONITE": "波士可多拉进化石", - "ALAKAZITE": "胡地进化石", - "ALTARIANITE": "七夕青鸟进化石", - "AMPHAROSITE": "电龙进化石", - "AUDINITE": "差不多娃娃进化石", - "BANETTITE": "诅咒娃娃进化石", - "BEEDRILLITE": "大针蜂进化石", - "BLASTOISINITE": "水箭龟进化石", - "BLAZIKENITE": "火焰鸡进化石", - "CAMERUPTITE": "喷火驼进化石", - "CHARIZARDITE_X": "喷火龙进化石X", - "CHARIZARDITE_Y": "喷火龙进化石Y", - "DIANCITE": "蒂安希进化石", - "GALLADITE": "艾路雷朵进化石", - "GARCHOMPITE": "烈咬陆鲨进化石", - "GARDEVOIRITE": "沙奈朵进化石", - "GENGARITE": "耿鬼进化石", - "GLALITITE": "冰鬼护进化石", - "GYARADOSITE": "暴鲤龙进化石", - "HERACRONITE": "赫拉克罗斯进化石", - "HOUNDOOMINITE": "黑鲁加进化石", - "KANGASKHANITE": "袋兽进化石", - "LATIASITE": "拉帝亚斯进化石", - "LATIOSITE": "拉帝欧斯进化石", - "LOPUNNITE": "长耳兔进化石", - "LUCARIONITE": "路卡利欧进化石", - "MANECTITE": "雷电兽进化石", - "MAWILITE": "大嘴娃进化石", - "MEDICHAMITE": "恰雷姆进化石", - "METAGROSSITE": "巨金怪进化石", - "MEWTWONITE_X": "超梦进化石X", - "MEWTWONITE_Y": "超梦进化石Y", - "PIDGEOTITE": "大比鸟进化石", - "PINSIRITE": "凯罗斯进化石", - "RAYQUAZITE": "烈空坐进化石", - "SABLENITE": "勾魂眼进化石", - "SALAMENCITE": "暴飞龙进化石", - "SCEPTILITE": "蜥蜴王进化石", - "SCIZORITE": "巨钳螳螂进化石", - "SHARPEDONITE": "巨牙鲨进化石", - "SLOWBRONITE": "呆壳兽进化石", - "STEELIXITE": "大钢蛇进化石", - "SWAMPERTITE": "巨沼怪进化石", - "TYRANITARITE": "班基拉斯进化石", - "VENUSAURITE": "妙蛙花进化石", - - "BLUE_ORB": "靛蓝色宝珠", - "RED_ORB": "朱红色宝珠", - "SHARP_METEORITE": "锐利陨石", - "HARD_METEORITE": "坚硬陨石", - "SMOOTH_METEORITE": "光滑陨石", - "ADAMANT_CRYSTAL": "大金刚宝玉", - "LUSTROUS_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": "础石面具", - "SHOCK_DRIVE": "闪电卡带", - "BURN_DRIVE": "火焰卡带", - "CHILL_DRIVE": "冰冻卡带", - "DOUSE_DRIVE": "水流卡带", - - "FIST_PLATE": "拳头石板", - "SKY_PLATE": "蓝天石板", - "TOXIC_PLATE": "剧毒石板", - "EARTH_PLATE": "大地石板", - "STONE_PLATE": "岩石石板", - "INSECT_PLATE": "玉虫石板", - "SPOOKY_PLATE": "妖怪石板", - "IRON_PLATE": "钢铁石板", - "FLAME_PLATE": "火球石板", - "SPLASH_PLATE": "水滴石板", - "MEADOW_PLATE": "碧绿石板", - "ZAP_PLATE": "雷电石板", - "MIND_PLATE": "神奇石板", - "ICICLE_PLATE": "冰柱石板", - "DRACO_PLATE": "龙之石板", - "DREAD_PLATE": "恶颜石板", - "PIXIE_PLATE": "妖精石板", - "BLANK_PLATE": "净空石板", - "LEGEND_PLATE": "传说石板", - "FIGHTING_MEMORY": "战斗存储碟", - "FLYING_MEMORY": "飞翔存储碟", - "POISON_MEMORY": "毒存储碟", - "GROUND_MEMORY": "大地存储碟", - "ROCK_MEMORY": "岩石存储碟", - "BUG_MEMORY": "虫子存储碟", - "GHOST_MEMORY": "幽灵存储碟", - "STEEL_MEMORY": "钢铁存储碟", - "FIRE_MEMORY": "火焰存储碟", - "WATER_MEMORY": "清水存储碟", - "GRASS_MEMORY": "青草存储碟", - "ELECTRIC_MEMORY": "电子存储碟", - "PSYCHIC_MEMORY": "精神存储碟", - "ICE_MEMORY": "冰雪存储碟", - "DRAGON_MEMORY": "龙存储碟", - "DARK_MEMORY": "黑暗存储碟", - "FAIRY_MEMORY": "妖精存储碟", - "BLANK_MEMORY": "空白存储碟", - }, -} as const; diff --git a/src/locales/zh_CN/modifier.json b/src/locales/zh_CN/modifier.json new file mode 100644 index 00000000000..a50cdd35bc1 --- /dev/null +++ b/src/locales/zh_CN/modifier.json @@ -0,0 +1,12 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}}用{{typeName}}\n撑住了!", + "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", + "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", + "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n恢复了活力!", + "resetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\n复原了!", + "moneyInterestApply": "用{{typeName}}\n获得了 ₽{{moneyAmount}} 利息!", + "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", + "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}夺取了!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\n回复了一些体力!", + "bypassSpeedChanceApply": "{{pokemonName}}用了{{itemName}}后,行动变快了!" +} \ No newline at end of file diff --git a/src/locales/zh_CN/move-trigger.json b/src/locales/zh_CN/move-trigger.json new file mode 100644 index 00000000000..1eb4c397f45 --- /dev/null +++ b/src/locales/zh_CN/move-trigger.json @@ -0,0 +1,70 @@ +{ + "hitWithRecoil": "{{pokemonName}}\n受到了反作用力造成的伤害!", + "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而撞到了地面!", + "fled": "{{pokemonName}}\n逃走了!", + "cannotBeSwitchedOut": "{{pokemonName}}\n无法被收回!", + "swappedAbilitiesWithTarget": "{{pokemonName}}\n互换了各自的特性!", + "coinsScatteredEverywhere": "金币散落一地!", + "attackedByItem": "{{pokemonName}}被\n{{itemName}}袭击了!", + "whippedUpAWhirlwind": "{{pokemonName}}周围的\n空气产生了旋涡!", + "flewUpHigh": "{{pokemonName}}\n飞向了高空!", + "tookInSunlight": "{{pokemonName}}\n吸收了光!", + "dugAHole": "{{pokemonName}}\n钻入了地里!", + "loweredItsHead": "{{pokemonName}}\n把头缩了进去!", + "isGlowing": "强光包围了{{pokemonName}}\n!", + "bellChimed": "铃声响彻四周!", + "foresawAnAttack": "{{pokemonName}}\n预知了未来的攻击!", + "isTighteningFocus": "{{pokemonName}}正在集中注意力!", + "hidUnderwater": "{{pokemonName}}\n潜入了水中!", + "soothingAromaWaftedThroughArea": "怡人的香气扩散了开来!", + "sprangUp": "{{pokemonName}}\n高高地跳了起来!", + "choseDoomDesireAsDestiny": "{{pokemonName}}\n将破灭之愿托付给了未来!", + "vanishedInstantly": "{{pokemonName}}的身影\n瞬间消失了!", + "tookTargetIntoSky": "{{pokemonName}}将{{targetName}}\n带上了高空!", + "becameCloakedInFreezingLight": "{{pokemonName}}\n被冷光包围了!", + "becameCloakedInFreezingAir": "{{pokemonName}}\n被冰冻的空气包围了!", + "isChargingPower": "{{pokemonName}}\n正在积蓄力量!", + "burnedItselfOut": "{{pokemonName}}的火焰燃尽了!", + "startedHeatingUpBeak": "{{pokemonName}}\n开始给鸟嘴加热了!", + "setUpShellTrap": "{{pokemonName}}\n设置了陷阱甲壳!", + "isOverflowingWithSpacePower": "{{pokemonName}}身上\n溢出了宇宙之力!", + "usedUpAllElectricity": "{{pokemonName}}\n用尽电力了!", + "stoleItem": "{{pokemonName}}从{{targetName}}那里\n夺取了{{itemName}}!", + "incineratedItem": "{{pokemonName}}烧没了\n{{targetName}}的{{itemName}}!", + "knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}!", + "tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻击!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削减了体力并释放了全部{{statName}}!", + "copiedStatChanges": "{{pokemonName}}复制了\n{{targetName}}的能力变化!", + "magnitudeMessage": "震级{{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}}将目标对准了\n{{targetName}}!", + "transformedIntoType": "{{pokemonName}} \n变成了{{typeName}}属性!", + "copiedMove": "{{pokemonName}}\n复制了{{moveName}}!", + "sketchedMove": "{{pokemonName}}\n对{{moveName}}进行了写生!", + "acquiredAbility": "{{pokemonName}}的特性\n变为{{abilityName}}了!", + "copiedTargetAbility": "{{pokemonName}}复制了\n{{targetName}}的{{abilityName}}!", + "transformedIntoTarget": "{{pokemonName}}\n变身成了{{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}}\n想和对手同归于尽!", + "addType": "{{pokemonName}}\n增加了{{typeName}}属性!", + "cannotUseMove": "{{pokemonName}}\n无法使用{{moveName}}!", + "healHp": "{{pokemonName}}的\n体力回复了!", + "sacrificialFullRestore": "{{pokemonName}}的\n治愈之愿实现了!", + "invertStats": "{{pokemonName}}的\n能力变化颠倒过来了!", + "resetStats": "{{pokemonName}}的\n能力变化复原了!", + "statEliminated": "所有能力都复原了!", + "faintCountdown": "{{pokemonName}}\n将在{{turnCount}}回合后灭亡!", + "copyType": "{{pokemonName}}\n变成了{{targetPokemonName}}的属性!", + "suppressAbilities": "{{pokemonName}}的特性\n变得无效了!", + "revivalBlessing": "{{pokemonName}}复活了!", + "swapArenaTags": "{{pokemonName}}\n交换了双方的场地效果!", + "exposedMove": "{{pokemonName}}识破了\n{{targetPokemonName}}的原型!", + "safeguard": "{{targetName}}\n正受到神秘之幕的保护!" +} \ No newline at end of file diff --git a/src/locales/zh_CN/move.json b/src/locales/zh_CN/move.json new file mode 100644 index 00000000000..5974271abb2 --- /dev/null +++ b/src/locales/zh_CN/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "拍击", + "effect": "使用长长的尾巴或手等拍打对手进行攻击" + }, + "karateChop": { + "name": "空手劈", + "effect": "用锋利的手刀劈向对手进行攻击。\n容易击中要害" + }, + "doubleSlap": { + "name": "连环巴掌", + "effect": "用连环巴掌拍打对手进行攻击。\n连续攻击2~5次" + }, + "cometPunch": { + "name": "连续拳", + "effect": "用拳头怒涛般的殴打对手进行攻击。\n连续攻击2~5次" + }, + "megaPunch": { + "name": "百万吨重拳", + "effect": "用充满力量的拳头攻击对手" + }, + "payDay": { + "name": "聚宝功", + "effect": "向对手的身体投掷小金币进行攻击。\n战斗后可以拿到钱" + }, + "firePunch": { + "name": "火焰拳", + "effect": "用充满火焰的拳头攻击对手。\n有时会让对手陷入灼伤状态" + }, + "icePunch": { + "name": "冰冻拳", + "effect": "用充满寒气的拳头攻击对手。\n有时会让对手陷入冰冻状态" + }, + "thunderPunch": { + "name": "雷电拳", + "effect": "用充满电流的拳头攻击对手。\n有时会让对手陷入麻痹状态" + }, + "scratch": { + "name": "抓", + "effect": "用坚硬且无比锋利的爪子抓对手进行攻击" + }, + "viseGrip": { + "name": "夹住", + "effect": "将对手从两侧夹住,给予伤害" + }, + "guillotine": { + "name": "极落钳", + "effect": "用大钳子或剪刀等夹断对手进行攻击。\n只要命中就会一击昏厥" + }, + "razorWind": { + "name": "旋风刀", + "effect": "制造风之刃,于第2回合攻击对手。\n容易击中要害" + }, + "swordsDance": { + "name": "剑舞", + "effect": "激烈地跳起战舞提高气势。\n大幅提高自己的攻击" + }, + "cut": { + "name": "居合劈", + "effect": "用镰刀或爪子等切斩对手进行攻击" + }, + "gust": { + "name": "起风", + "effect": "用翅膀将刮起的狂风袭向对手进行攻击" + }, + "wingAttack": { + "name": "翅膀攻击", + "effect": "大大地展开美丽的翅膀,\n将其撞向对手进行攻击" + }, + "whirlwind": { + "name": "吹飞", + "effect": "吹飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束" + }, + "fly": { + "name": "飞翔", + "effect": "第1回合飞上天空,第2回合攻击对手" + }, + "bind": { + "name": "绑紧", + "effect": "使用长长的身体或藤蔓等,\n在4~5回合内绑紧对手进行攻击" + }, + "slam": { + "name": "摔打", + "effect": "使用长长的尾巴或藤蔓等摔打对手\n进行攻击" + }, + "vineWhip": { + "name": "藤鞭", + "effect": "用如同鞭子般弯曲而细长的藤蔓摔\n打对手进行攻击" + }, + "stomp": { + "name": "踩踏", + "effect": "用大脚踩踏对手进行攻击。\n有时会使对手畏缩" + }, + "doubleKick": { + "name": "二连踢", + "effect": "用2只脚踢飞对手进行攻击。\n连续2次给予伤害" + }, + "megaKick": { + "name": "百万吨重踢", + "effect": "使出力大无穷的重踢踢飞对手进行攻击" + }, + "jumpKick": { + "name": "飞踢", + "effect": "使出高高的腾空踢攻击对手。\n如果踢偏则自己会受到伤害" + }, + "rollingKick": { + "name": "回旋踢", + "effect": "一边使身体快速旋转,\n一边踢飞对手进行攻击。\n有时会使对手畏缩" + }, + "sandAttack": { + "name": "泼沙", + "effect": "向对手脸上泼沙子,从而降低命中率" + }, + "headbutt": { + "name": "头锤", + "effect": "将头伸出,笔直地扑向对手进行攻击。\n有时会使对手畏缩" + }, + "hornAttack": { + "name": "角撞", + "effect": "用尖锐的角攻击对手" + }, + "furyAttack": { + "name": "乱击", + "effect": "用角或喙刺向对手进行攻击。\n连续攻击2~5次" + }, + "hornDrill": { + "name": "角钻", + "effect": "用旋转的角刺入对手进行攻击。\n只要命中就会一击昏厥" + }, + "tackle": { + "name": "撞击", + "effect": "用整个身体撞向对手进行攻击" + }, + "bodySlam": { + "name": "泰山压顶", + "effect": "用整个身体压住对手进行攻击。\n有时会让对手陷入麻痹状态" + }, + "wrap": { + "name": "紧束", + "effect": "使用长长的身体或藤蔓等,\n在4~5回合内紧束对手进行攻击" + }, + "takeDown": { + "name": "猛撞", + "effect": "以惊人的气势撞向对手进行攻击。\n自己也会受到少许伤害" + }, + "thrash": { + "name": "大闹一番", + "effect": "在2~3回合内,乱打一气地攻击对手。\n大闹一番后自己会陷入混乱" + }, + "doubleEdge": { + "name": "舍身冲撞", + "effect": "拼命地猛撞向对手进行攻击。\n自己也会受到不小的伤害" + }, + "tailWhip": { + "name": "摇尾巴", + "effect": "可爱地左右摇晃尾巴,\n诱使对手疏忽大意。会降低对手的防御" + }, + "poisonSting": { + "name": "毒针", + "effect": "将有毒的针刺入对手进行攻击。\n有时会让对手陷入中毒状态" + }, + "twineedle": { + "name": "双针", + "effect": "将2根针刺入对手,连续2次给予伤害。\n有时会让对手陷入中毒状态" + }, + "pinMissile": { + "name": "飞弹针", + "effect": "向对手发射锐针进行攻击。\n连续攻击2~5次" + }, + "leer": { + "name": "瞪眼", + "effect": "用犀利的眼神使其害怕,\n从而降低对手的防御" + }, + "bite": { + "name": "咬住", + "effect": "用尖锐的牙咬住对手进行攻击。\n有时会使对手畏缩" + }, + "growl": { + "name": "叫声", + "effect": "让对手听可爱的叫声,\n引开注意力使其疏忽,\n从而降低对手的攻击" + }, + "roar": { + "name": "吼叫", + "effect": "放走对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束" + }, + "sing": { + "name": "唱歌", + "effect": "让对手听舒适、美妙的歌声,\n从而陷入睡眠状态" + }, + "supersonic": { + "name": "超音波", + "effect": "从身体发出特殊的音波,\n从而使对手混乱" + }, + "sonicBoom": { + "name": "音爆", + "effect": "将冲击波撞向对手进行攻击。\n必定会给予20的伤害" + }, + "disable": { + "name": "定身法", + "effect": "阻碍对手行动,之前使出的招式将\n在4回合内无法使用" + }, + "acid": { + "name": "溶解液", + "effect": "将强酸泼向对手进行攻击。\n有时会降低对手的特防" + }, + "ember": { + "name": "火花", + "effect": "向对手发射小型火焰进行攻击。\n有时会让对手陷入灼伤状态" + }, + "flamethrower": { + "name": "喷射火焰", + "effect": "向对手发射烈焰进行攻击。\n有时会让对手陷入灼伤状态" + }, + "mist": { + "name": "白雾", + "effect": "用白雾覆盖身体。在5回合内不会\n让对手降低自己的能力" + }, + "waterGun": { + "name": "水枪", + "effect": "向对手猛烈地喷射水流进行攻击" + }, + "hydroPump": { + "name": "水炮", + "effect": "向对手猛烈地喷射大量水流进行攻击" + }, + "surf": { + "name": "冲浪", + "effect": "利用大浪攻击自己周围所有的宝可梦" + }, + "iceBeam": { + "name": "冰冻光束", + "effect": "向对手发射冰冻光束进行攻击。\n有时会让对手陷入冰冻状态" + }, + "blizzard": { + "name": "暴风雪", + "effect": "将猛烈的暴风雪刮向对手进行攻击。\n有时会让对手陷入冰冻状态" + }, + "psybeam": { + "name": "幻象光线", + "effect": "向对手发射神奇的光线进行攻击。\n有时会使对手混乱" + }, + "bubbleBeam": { + "name": "泡沫光线", + "effect": "向对手猛烈地喷射泡沫进行攻击。\n有时会降低对手的速度" + }, + "auroraBeam": { + "name": "极光束", + "effect": "向对手发射虹色光束进行攻击。\n有时会降低对手的攻击" + }, + "hyperBeam": { + "name": "破坏光线", + "effect": "向对手发射强烈的光线进行攻击。\n下一回合自己将无法动弹" + }, + "peck": { + "name": "啄", + "effect": "用尖锐的喙或角刺向对手进行攻击" + }, + "drillPeck": { + "name": "啄钻", + "effect": "一边旋转,一边将尖喙刺入对手进行攻击" + }, + "submission": { + "name": "深渊翻滚", + "effect": "将对手连同自己一起摔向地面进行攻击。\n自己也会受到少许伤害" + }, + "lowKick": { + "name": "踢倒", + "effect": "用力踢对手的脚,使其摔倒进行攻击。\n对手越重,威力越大" + }, + "counter": { + "name": "双倍奉还", + "effect": "从对手那里受到物理攻击的伤害将\n以2倍返还给同一个对手" + }, + "seismicToss": { + "name": "地球上投", + "effect": "利用引力将对手甩飞出去。\n给予对手和自己等级相同的伤害" + }, + "strength": { + "name": "怪力", + "effect": "使出浑身力气殴打对手进行攻击" + }, + "absorb": { + "name": "吸取", + "effect": "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP" + }, + "megaDrain": { + "name": "超级吸取", + "effect": "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP" + }, + "leechSeed": { + "name": "寄生种子", + "effect": "植入寄生种子后,将在每回合一点\n一点吸取对手的HP,\n从而用来回复自己的HP" + }, + "growth": { + "name": "生长", + "effect": "让身体一下子长大,从而提高攻击和特攻" + }, + "razorLeaf": { + "name": "飞叶快刀", + "effect": "飞出叶片,切斩对手进行攻击。\n容易击中要害" + }, + "solarBeam": { + "name": "日光束", + "effect": "第1回合收集满满的日光,\n第2回合发射光束进行攻击" + }, + "poisonPowder": { + "name": "毒粉", + "effect": "撒出毒粉,从而让对手陷入中毒状态" + }, + "stunSpore": { + "name": "麻痹粉", + "effect": "撒出麻痹粉,从而让对手陷入麻痹状态" + }, + "sleepPowder": { + "name": "催眠粉", + "effect": "撒出催眠粉,从而让对手陷入睡眠状态" + }, + "petalDance": { + "name": "花瓣舞", + "effect": "在2~3回合内,散落花瓣攻击对手。\n之后自己会陷入混乱" + }, + "stringShot": { + "name": "吐丝", + "effect": "用口中吐出的丝缠绕对手,\n从而大幅降低对手的速度" + }, + "dragonRage": { + "name": "龙之怒", + "effect": "将愤怒的冲击波撞向对手进行攻击。\n必定会给予40的伤害" + }, + "fireSpin": { + "name": "火焰旋涡", + "effect": "将对手困在激烈的火焰旋涡中,\n在4~5回合内进行攻击" + }, + "thunderShock": { + "name": "电击", + "effect": "发出电流刺激对手进行攻击。\n有时会让对手陷入麻痹状态" + }, + "thunderbolt": { + "name": "十万伏特", + "effect": "向对手发出强力电击进行攻击。\n有时会让对手陷入麻痹状态" + }, + "thunderWave": { + "name": "电磁波", + "effect": "向对手发出微弱的电击,\n从而让对手陷入麻痹状态" + }, + "thunder": { + "name": "打雷", + "effect": "向对手劈下暴雷进行攻击。\n有时会让对手陷入麻痹状态" + }, + "rockThrow": { + "name": "落石", + "effect": "拿起小岩石,投掷对手进行攻击" + }, + "earthquake": { + "name": "地震", + "effect": "利用地震的冲击,攻击自己周围所\n有的宝可梦" + }, + "fissure": { + "name": "地裂", + "effect": "让对手掉落于地裂的裂缝中进行攻击。\n只要命中就会一击昏厥" + }, + "dig": { + "name": "挖洞", + "effect": "第1回合钻入地底,第2回合攻击对手" + }, + "toxic": { + "name": "剧毒", + "effect": "让对手陷入剧毒状态。\n随着回合的推进,中毒伤害会增加" + }, + "confusion": { + "name": "念力", + "effect": "向对手发送微弱的念力进行攻击。\n有时会使对手混乱" + }, + "psychic": { + "name": "精神强念", + "effect": "向对手发送强大的念力进行攻击。\n有时会降低对手的特防" + }, + "hypnosis": { + "name": "催眠术", + "effect": "施以诱导睡意的暗示,\n让对手陷入睡眠状态" + }, + "meditate": { + "name": "瑜伽姿势", + "effect": "唤醒身体深处沉睡的力量,\n从而提高自己的攻击" + }, + "agility": { + "name": "高速移动", + "effect": "让身体放松变得轻盈,\n以便高速移动。大幅提高自己的速度" + }, + "quickAttack": { + "name": "电光一闪", + "effect": "以迅雷不及掩耳之势扑向对手。\n必定能够先制攻击" + }, + "rage": { + "name": "愤怒", + "effect": "如果在使出招式后受到攻击的话,\n会因愤怒的力量而提高攻击" + }, + "teleport": { + "name": "瞬间移动", + "effect": "当有后备宝可梦时使用,\n就可以进行替换。\n野生的宝可梦使用则会逃走" + }, + "nightShade": { + "name": "黑夜魔影", + "effect": "显示恐怖幻影,只给予对手和自己\n等级相同的伤害" + }, + "mimic": { + "name": "模仿", + "effect": "可以将对手最后使用的招式,\n在战斗内变成自己的招式" + }, + "screech": { + "name": "刺耳声", + "effect": "发出不由自主想要捂起耳朵的刺耳声,\n从而大幅降低对手的防御" + }, + "doubleTeam": { + "name": "影子分身", + "effect": "通过快速移动来制造分身,\n扰乱对手,从而提高闪避率" + }, + "recover": { + "name": "自我再生", + "effect": "让细胞再生,从而回复自己最大H\nP的一半" + }, + "harden": { + "name": "变硬", + "effect": "全身使劲,让身体变硬,\n从而提高自己的防御" + }, + "minimize": { + "name": "变小", + "effect": "蜷缩身体显得很小,从而大幅提高\n自己的闪避率" + }, + "smokescreen": { + "name": "烟幕", + "effect": "向对手喷出烟或墨汁等,\n从而降低对手的命中率" + }, + "confuseRay": { + "name": "奇异之光", + "effect": "显示奇怪的光,扰乱对手。\n使对手混乱" + }, + "withdraw": { + "name": "缩入壳中", + "effect": "缩入壳里保护身体,从而提高自己的防御" + }, + "defenseCurl": { + "name": "变圆", + "effect": "将身体蜷曲变圆,从而提高自己的防御" + }, + "barrier": { + "name": "屏障", + "effect": "制造坚固的壁障,从而大幅提高自\n己的防御" + }, + "lightScreen": { + "name": "光墙", + "effect": "利用神奇的墙壁,在5回合内减弱\n从对手那里受到的特殊攻击的伤害" + }, + "haze": { + "name": "黑雾", + "effect": "升起黑雾,将正在场上战斗的全体\n宝可梦的能力变回原点" + }, + "reflect": { + "name": "反射壁", + "effect": "利用神奇的墙壁,在5回合内减弱\n从对手那里受到的物理攻击的伤害" + }, + "focusEnergy": { + "name": "聚气", + "effect": "深深地吸口气,集中精神。\n自己的攻击会变得容易击中要害" + }, + "bide": { + "name": "忍耐", + "effect": "在2回合内忍受攻击,\n受到的伤害会2倍返还给对手" + }, + "metronome": { + "name": "挥指", + "effect": "挥动手指刺激自己的大脑,\n从许多的招式中随机使出1个" + }, + "mirrorMove": { + "name": "鹦鹉学舌", + "effect": "模仿对手使用的招式,\n自己也使用相同招式" + }, + "selfDestruct": { + "name": "玉石俱碎", + "effect": "引发爆炸,攻击自己周围所有的宝可梦。\n使用后陷入昏厥" + }, + "eggBomb": { + "name": "炸蛋", + "effect": "向对手用力投掷大大的蛋进行攻击" + }, + "lick": { + "name": "舌舔", + "effect": "用长长的舌头,舔遍对手进行攻击。\n有时会让对手陷入麻痹状态" + }, + "smog": { + "name": "浊雾", + "effect": "将肮脏的浓雾吹向对手进行攻击。\n有时会让对手陷入中毒状态" + }, + "sludge": { + "name": "污泥攻击", + "effect": "用污泥投掷对手进行攻击。\n有时会让对手陷入中毒状态" + }, + "boneClub": { + "name": "骨棒", + "effect": "用手中的骨头殴打对手进行攻击。\n有时会使对手畏缩" + }, + "fireBlast": { + "name": "大字爆炎", + "effect": "用大字形状的火焰烧尽对手。\n有时会让对手陷入灼伤状态" + }, + "waterfall": { + "name": "攀瀑", + "effect": "以惊人的气势扑向对手。\n有时会使对手畏缩" + }, + "clamp": { + "name": "贝壳夹击", + "effect": "用非常坚固且厚实的贝壳,\n在4~5回合内夹住对手进行攻击" + }, + "swift": { + "name": "高速星星", + "effect": "发射星形的光攻击对手。\n攻击必定会命中" + }, + "skullBash": { + "name": "火箭头锤", + "effect": "第1回合把头缩进去,\n从而提高防御。第2回合攻击对手" + }, + "spikeCannon": { + "name": "尖刺加农炮", + "effect": "向对手发射锐针进行攻击。\n连续攻击2~5次" + }, + "constrict": { + "name": "缠绕", + "effect": "用触手或青藤等缠绕进行攻击。\n有时会降低对手的速度" + }, + "amnesia": { + "name": "瞬间失忆", + "effect": "将头脑清空,瞬间忘记某事,\n从而大幅提高自己的特防" + }, + "kinesis": { + "name": "折弯汤匙", + "effect": "折弯汤匙引开注意,从而降低对手\n的命中率" + }, + "softBoiled": { + "name": "生蛋", + "effect": "回复自己最大HP的一半" + }, + "highJumpKick": { + "name": "飞膝踢", + "effect": "跳起后用膝盖撞对手进行攻击。\n如果撞偏则自己会受到伤害" + }, + "glare": { + "name": "大蛇瞪眼", + "effect": "用腹部的花纹使对手害怕,\n从而让其陷入麻痹状态" + }, + "dreamEater": { + "name": "食梦", + "effect": "吃掉正在睡觉的对手的梦进行攻击。\n回复对手所受到伤害的一半HP" + }, + "poisonGas": { + "name": "毒瓦斯", + "effect": "将毒瓦斯吹到对手的脸上,\n从而让对手陷入中毒状态" + }, + "barrage": { + "name": "投球", + "effect": "向对手投掷圆形物体进行攻击。\n连续攻击2~5次" + }, + "leechLife": { + "name": "吸血", + "effect": "吸取血液攻击对手。可以回复给予\n对手伤害的一半HP" + }, + "lovelyKiss": { + "name": "恶魔之吻", + "effect": "用恐怖的脸强吻对手。\n让对手陷入睡眠状态" + }, + "skyAttack": { + "name": "神鸟猛击", + "effect": "第2回合攻击对手。偶尔使对手畏缩。\n也容易击中要害" + }, + "transform": { + "name": "变身", + "effect": "变身成对手宝可梦的样子,\n能够使用和对手完全相同的招式" + }, + "bubble": { + "name": "泡沫", + "effect": "向对手用力吹起无数泡泡进行攻击。\n有时会降低对手的速度" + }, + "dizzyPunch": { + "name": "迷昏拳", + "effect": "有节奏地出拳攻击对手。\n有时会使对手混乱" + }, + "spore": { + "name": "蘑菇孢子", + "effect": "沙沙沙地撒满具有催眠效果的孢子,\n从而让对手陷入睡眠状态" + }, + "flash": { + "name": "闪光", + "effect": "使出光芒,从而降低对手的命中率。\n也可在阴暗的洞窟里照亮四周" + }, + "psywave": { + "name": "精神波", + "effect": "向对手发射神奇的念波进行攻击。\n每次使用,伤害都会改变" + }, + "splash": { + "name": "跃起", + "effect": "也不攻击只是一蹦一蹦地跳,\n什么都不会发生…" + }, + "acidArmor": { + "name": "溶化", + "effect": "通过细胞的变化进行液化,\n从而大幅提高自己的防御" + }, + "crabhammer": { + "name": "蟹钳锤", + "effect": "用大钳子敲打对手进行攻击。\n容易击中要害" + }, + "explosion": { + "name": "大爆炸", + "effect": "引发大爆炸,\n攻击自己周围所有的宝可梦。\n使用后自己会陷入昏厥" + }, + "furySwipes": { + "name": "乱抓", + "effect": "用爪子或镰刀等抓对手进行攻击。\n连续攻击2~5次" + }, + "bonemerang": { + "name": "骨头回力镖", + "effect": "用手中的骨头投掷对手,\n来回连续2次给予伤害" + }, + "rest": { + "name": "睡觉", + "effect": "连续睡上2回合。回复自己的全部\nHP以及治愈所有异常状态" + }, + "rockSlide": { + "name": "岩崩", + "effect": "将大岩石猛烈地撞向对手进行攻击。\n有时会使对手畏缩" + }, + "hyperFang": { + "name": "终结门牙", + "effect": "用锋利的门牙牢牢地咬住对手进行攻击。\n有时会使对手畏缩" + }, + "sharpen": { + "name": "棱角化", + "effect": "增加身体的角,变得棱棱角角,\n从而提高自己的攻击" + }, + "conversion": { + "name": "纹理", + "effect": "将自己的属性转换成和已学会的招\n式中第一个招式相同的属性" + }, + "triAttack": { + "name": "三重攻击", + "effect": "用3种光线进行攻击。\n有时会让对手陷入麻痹、\n灼伤或冰冻的状态" + }, + "superFang": { + "name": "愤怒门牙", + "effect": "用锋利的门牙猛烈地咬住对手进行攻击。\n对手的HP减半" + }, + "slash": { + "name": "劈开", + "effect": "用爪子或镰刀等劈开对手进行攻击。\n容易击中要害" + }, + "substitute": { + "name": "替身", + "effect": "削减少许自己的HP,\n制造分身。分身将成为自己的替身" + }, + "struggle": { + "name": "挣扎", + "effect": "当自己的PP耗尽时,\n努力挣扎攻击对手。\n自己也会受到少许伤害" + }, + "sketch": { + "name": "写生", + "effect": "将对手使用的招式变成自己的招式。\n使用1次后写生消失" + }, + "tripleKick": { + "name": "三连踢", + "effect": "连续3次踢对手进行攻击。\n每踢中一次,威力就会提高" + }, + "thief": { + "name": "小偷", + "effect": "攻击的同时盗取对手的道具。" + }, + "spiderWeb": { + "name": "蛛网", + "effect": "将黏糊糊的细丝一层一层缠住对手,\n使其不能从战斗中逃走" + }, + "mindReader": { + "name": "心之眼", + "effect": "用心感受对手的行动,\n下次攻击必定会击中对手" + }, + "nightmare": { + "name": "恶梦", + "effect": "让在睡眠状态下的对手做恶梦,\n每回合会缓缓减少HP" + }, + "flameWheel": { + "name": "火焰轮", + "effect": "让火焰覆盖全身,猛撞向对手进行攻击。\n有时会让对手陷入灼伤状态" + }, + "snore": { + "name": "打鼾", + "effect": "在自己睡觉时,发出噪音进行攻击。\n有时会使对手畏缩" + }, + "curse": { + "name": "诅咒", + "effect": "使用该招式的宝可梦,\n其属性是幽灵属性或其他属性时,\n效果会不一样" + }, + "flail": { + "name": "抓狂", + "effect": "抓狂般乱打进行攻击。\n自己的HP越少,招式的威力越大" + }, + "conversion2": { + "name": "纹理2", + "effect": "为了可以抵抗对手最后使用的招式,\n从而使自己的属性发生变化" + }, + "aeroblast": { + "name": "气旋攻击", + "effect": "发射空气旋涡进行攻击。\n容易击中要害" + }, + "cottonSpore": { + "name": "棉孢子", + "effect": "将棉花般柔软的孢子紧贴对手,\n从而大幅降低对手的速度" + }, + "reversal": { + "name": "绝处逢生", + "effect": "竭尽全力进行攻击。自己的HP越少,\n招式的威力越大" + }, + "spite": { + "name": "怨恨", + "effect": "对对手最后使用的招式怀有怨恨,\n减少4PP该招式" + }, + "powderSnow": { + "name": "细雪", + "effect": "将冰冷的细雪吹向对手进行攻击。\n有时会让对手陷入冰冻状态" + }, + "protect": { + "name": "守住", + "effect": "完全抵挡对手的攻击。\n连续使出则容易失败" + }, + "machPunch": { + "name": "音速拳", + "effect": "以迅雷不及掩耳之势出拳。\n必定能够先制攻击" + }, + "scaryFace": { + "name": "可怕面孔", + "effect": "用恐怖的表情瞪着对手,\n使其害怕,从而大幅降低对手的速度" + }, + "feintAttack": { + "name": "出奇一击", + "effect": "悄悄地靠近对手,趁其不备进行殴打。\n攻击必定会命中" + }, + "sweetKiss": { + "name": "天使之吻", + "effect": "像天使般可爱地亲吻对手,\n从而使对手混乱" + }, + "bellyDrum": { + "name": "腹鼓", + "effect": "将自己的HP减少到最大HP的一半,\n从而最大限度提高自己的攻击" + }, + "sludgeBomb": { + "name": "污泥炸弹", + "effect": "用污泥投掷对手进行攻击。\n有时会让对手陷入中毒状态" + }, + "mudSlap": { + "name": "掷泥", + "effect": "向对手的脸等投掷泥块进行攻击。\n会降低对手的命中率" + }, + "octazooka": { + "name": "章鱼桶炮", + "effect": "向对手的脸等喷出墨汁进行攻击。\n有时会降低对手的命中率" + }, + "spikes": { + "name": "撒菱", + "effect": "在对手的脚下扔撒菱。\n对替换出场的对手的宝可梦给予伤害" + }, + "zapCannon": { + "name": "电磁炮", + "effect": "发射大炮一样的电流进行攻击。\n让对手陷入麻痹状态" + }, + "foresight": { + "name": "识破", + "effect": "使出后对幽灵属性宝可梦没有效果\n的招式以及闪避率高的对手,\n变得能够打中" + }, + "destinyBond": { + "name": "同命", + "effect": "使出招式后,当受到对手攻击\n陷入昏厥时,对手也会一同昏厥。\n连续使出则会失败" + }, + "perishSong": { + "name": "终焉之歌", + "effect": "倾听歌声的宝可梦经过3回合陷入昏厥。\n替换后效果消失" + }, + "icyWind": { + "name": "冰冻之风", + "effect": "将结冰的冷气吹向对手进行攻击。\n会降低对手的速度" + }, + "detect": { + "name": "看穿", + "effect": "完全抵挡对手的攻击。\n连续使出则容易失败" + }, + "boneRush": { + "name": "骨棒乱打", + "effect": "用坚硬的骨头殴打对手进行攻击。\n连续攻击2~5次" + }, + "lockOn": { + "name": "锁定", + "effect": "紧紧瞄准对手,下次攻击必定会打中" + }, + "outrage": { + "name": "逆鳞", + "effect": "在2~3回合内,乱打一气地进行攻击。\n大闹一番后自己会陷入混乱" + }, + "sandstorm": { + "name": "沙暴", + "effect": "在5回合内扬起沙暴,\n除岩石、地面和钢属性以外的宝可梦,\n都会受到伤害。岩石属性的特防还会提高" + }, + "gigaDrain": { + "name": "终极吸取", + "effect": "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP" + }, + "endure": { + "name": "挺住", + "effect": "即使受到攻击,也至少会留下1HP。\n连续使出则容易失败" + }, + "charm": { + "name": "撒娇", + "effect": "可爱地凝视,诱使对手疏忽大意,\n从而大幅降低对手的攻击" + }, + "rollout": { + "name": "滚动", + "effect": "在5回合内连续滚动攻击对手。\n招式每次击中,威力就会提高" + }, + "falseSwipe": { + "name": "点到为止", + "effect": "对手的HP至少会留下1HP,\n如此般手下留情地攻击" + }, + "swagger": { + "name": "虚张声势", + "effect": "激怒对手,使其混乱。\n因为愤怒,对手的攻击会大幅提高" + }, + "milkDrink": { + "name": "喝牛奶", + "effect": "回复自己最大HP的一半" + }, + "spark": { + "name": "电光", + "effect": "让电流覆盖全身,猛撞向对手进行攻击。\n有时会让对手陷入麻痹状态" + }, + "furyCutter": { + "name": "连斩", + "effect": "用镰刀或爪子等切斩对手进行攻击。\n连续击中,威力就会提高" + }, + "steelWing": { + "name": "钢翼", + "effect": "用坚硬的翅膀敲打对手进行攻击。\n有时会提高自己的防御" + }, + "meanLook": { + "name": "黑色目光", + "effect": "用好似要勾人心魂的黑色目光一动\n不动地凝视对手,使其不能从战斗中逃走" + }, + "attract": { + "name": "迷人", + "effect": "♂诱惑♀或♀诱惑♂,让对手着迷。\n对手将很难使出招式" + }, + "sleepTalk": { + "name": "梦话", + "effect": "从自己已学会的招式中任意使出1个。\n只能在自己睡觉时使用" + }, + "healBell": { + "name": "治愈铃声", + "effect": "让同伴听舒适的铃音,\n从而治愈我方全员的异常状态" + }, + "return": { + "name": "报恩", + "effect": "为了训练家而全力攻击对手。\n亲密度越高,威力越大" + }, + "present": { + "name": "礼物", + "effect": "递给对手设有圈套的盒子进行攻击。\n也有可能回复对手HP" + }, + "frustration": { + "name": "迁怒", + "effect": "为了发泄不满而全力攻击对手。\n亲密度越低,威力越大" + }, + "safeguard": { + "name": "神秘守护", + "effect": "在5回合内被神奇的力量守护,\n从而不会陷入异常状态" + }, + "painSplit": { + "name": "分担痛楚", + "effect": "将自己的HP和对手的HP相加,\n然后自己和对手友好地平分" + }, + "sacredFire": { + "name": "神圣之火", + "effect": "用神秘的火焰烧尽对手进行攻击。\n有时会让对手陷入灼伤状态" + }, + "magnitude": { + "name": "震级", + "effect": "晃动地面,攻击自己周围所有的宝可梦。\n招式的威力会有各种变化" + }, + "dynamicPunch": { + "name": "爆裂拳", + "effect": "使出浑身力气出拳进行攻击。\n必定会使对手混乱" + }, + "megahorn": { + "name": "超级角击", + "effect": "用坚硬且华丽的角狠狠地刺入对手\n进行攻击" + }, + "dragonBreath": { + "name": "龙息", + "effect": "将强烈的气息吹向对手进行攻击。\n有时会让对手陷入麻痹状态" + }, + "batonPass": { + "name": "接棒", + "effect": "和后备宝可梦进行替换。\n换上的宝可梦能直接继承其能力的变化" + }, + "encore": { + "name": "再来一次", + "effect": "让对手接受再来一次,\n连续3次使出最后使用的招式" + }, + "pursuit": { + "name": "追打", + "effect": "当对手替换宝可梦上场时\n使出此招式的话,\n能够以2倍的威力进行攻击" + }, + "rapidSpin": { + "name": "高速旋转", + "effect": "通过旋转来攻击对手。\n可以摆脱绑紧、紧束、寄生种子等招式。\n还能提高自己的速度" + }, + "sweetScent": { + "name": "甜甜香气", + "effect": "用香气大幅降低对手的闪避率" + }, + "ironTail": { + "name": "铁尾", + "effect": "使用坚硬的尾巴摔打对手进行攻击。\n有时会降低对手的防御" + }, + "metalClaw": { + "name": "金属爪", + "effect": "用钢铁之爪劈开对手进行攻击。\n有时会提高自己的攻击" + }, + "vitalThrow": { + "name": "借力摔", + "effect": "会在对手之后进行攻击。\n但是自己的攻击必定会命中" + }, + "morningSun": { + "name": "晨光", + "effect": "回复自己的HP。根据天气的不同,\n回复量也会有所变化" + }, + "synthesis": { + "name": "光合作用", + "effect": "回复自己的HP。根据天气的不同,\n回复量也会有所变化" + }, + "moonlight": { + "name": "月光", + "effect": "回复自己的HP。根据天气的不同,\n回复量也会有所变化" + }, + "hiddenPower": { + "name": "觉醒力量", + "effect": "招式的属性会随着使用此招式的宝\n可梦而改变" + }, + "crossChop": { + "name": "十字劈", + "effect": "用两手呈十字劈打对手进行攻击。\n容易击中要害" + }, + "twister": { + "name": "龙卷风", + "effect": "兴起龙卷风,将对手卷入进行攻击。\n有时会使对手畏缩" + }, + "rainDance": { + "name": "求雨", + "effect": "在5回合内一直降雨,\n从而提高水属性的招式威力。\n火属性的招式威力则降低" + }, + "sunnyDay": { + "name": "大晴天", + "effect": "在5回合内让日照变得强烈,\n从而提高火属性的招式威力。\n水属性的招式威力则降低" + }, + "crunch": { + "name": "咬碎", + "effect": "用利牙咬碎对手进行攻击。\n有时会降低对手的防御" + }, + "mirrorCoat": { + "name": "镜面反射", + "effect": "从对手那里受到特殊攻击的伤害将\n以2倍返还给同一个对手" + }, + "psychUp": { + "name": "自我暗示", + "effect": "向自己施以自我暗示,\n将能力变化的状态变得和对手一样" + }, + "extremeSpeed": { + "name": "神速", + "effect": "以迅雷不及掩耳之势猛\n撞向对手进行攻击。\n必定能够先制攻击" + }, + "ancientPower": { + "name": "原始之力", + "effect": "用原始之力进行攻击。\n有时会提高自己所有的能力" + }, + "shadowBall": { + "name": "暗影球", + "effect": "投掷一团黑影进行攻击。\n有时会降低对手的特防" + }, + "futureSight": { + "name": "预知未来", + "effect": "在使用招式2回合后,\n向对手发送一团念力进行攻击" + }, + "rockSmash": { + "name": "碎岩", + "effect": "用拳头进行攻击。有时会降低对手的防御" + }, + "whirlpool": { + "name": "潮旋", + "effect": "将对手困在激烈的水流旋涡中,\n在4~5回合内进行攻击" + }, + "beatUp": { + "name": "围攻", + "effect": "我方全员进行攻击。同行的宝可梦越多,\n招式的攻击次数越多" + }, + "fakeOut": { + "name": "击掌奇袭", + "effect": "进行先制攻击,使对手畏缩。\n要在出场后立刻使出才能成功" + }, + "uproar": { + "name": "吵闹", + "effect": "在3回合内大吵大闹攻击对手。\n在此期间谁都不能入眠" + }, + "stockpile": { + "name": "蓄力", + "effect": "积蓄力量,提高自己的防御和特防。\n最多积蓄3次" + }, + "spitUp": { + "name": "喷出", + "effect": "将积蓄的力量撞向对手进行攻击。\n积蓄得越多,威力越大" + }, + "swallow": { + "name": "吞下", + "effect": "将积蓄的力量吞下,\n从而回复自己的HP。\n积蓄得越多,回复越大" + }, + "heatWave": { + "name": "热风", + "effect": "将炎热的气息吹向对手进行攻击。\n有时会让对手陷入灼伤状态" + }, + "hail": { + "name": "冰雹", + "effect": "在5回合内一直降冰雹,\n除冰属性的宝可梦以外,\n给予全体宝可梦伤害" + }, + "torment": { + "name": "无理取闹", + "effect": "向对手无理取闹,令其不能连续2\n次使出相同招式" + }, + "flatter": { + "name": "吹捧", + "effect": "吹捧对手,使其混乱。\n同时还会提高对手的特攻" + }, + "willOWisp": { + "name": "磷火", + "effect": "放出怪异的火焰,从而让对手陷入\n灼伤状态" + }, + "memento": { + "name": "临别礼物", + "effect": "虽然会使自己陷入昏厥,\n但是能够大幅降低对手的攻击和特攻" + }, + "facade": { + "name": "硬撑", + "effect": "当自己处于中毒、麻痹、灼伤状态时,\n向对手使出此招式的话,\n威力会变成2倍" + }, + "focusPunch": { + "name": "真气拳", + "effect": "集中精神出拳。在招式使出前若受\n到攻击则会失败" + }, + "smellingSalts": { + "name": "清醒", + "effect": "对于麻痹状态下的对手,\n威力会变成2倍。\n但相反对手的麻痹也会被治愈" + }, + "followMe": { + "name": "看我嘛", + "effect": "引起对手的注意,将对手的攻击全\n部转移到自己身上" + }, + "naturePower": { + "name": "自然之力", + "effect": "用自然之力进行攻击。\n根据所使用场所的不同,\n使出的招式也会有所变化" + }, + "charge": { + "name": "充电", + "effect": "变为充电状态,提高下次使出的电\n属性的招式威力。自己的特防也会提高" + }, + "taunt": { + "name": "挑衅", + "effect": "使对手愤怒。在3回合内让对手只\n能使出给予伤害的招式" + }, + "helpingHand": { + "name": "帮助", + "effect": "帮助伙伴。被帮助的宝可梦,\n其招式威力变得比平时大" + }, + "trick": { + "name": "戏法", + "effect": "抓住对手的空隙,交换自己和对手\n的持有物" + }, + "rolePlay": { + "name": "扮演", + "effect": "扮演对手,让自己的特性变得和对手相同" + }, + "wish": { + "name": "祈愿", + "effect": "在下一回合回复自己或是替换出场\n的宝可梦最大HP的一半" + }, + "assist": { + "name": "借助", + "effect": "向同伴紧急求助,从我方宝可梦已\n学会的招式中随机使用1个" + }, + "ingrain": { + "name": "扎根", + "effect": "在大地上扎根,每回合回复自己的HP。\n因为扎根了,所以不能替换宝可梦" + }, + "superpower": { + "name": "蛮力", + "effect": "发挥惊人的力量攻击对手。\n自己的攻击和防御会降低" + }, + "magicCoat": { + "name": "魔法反射", + "effect": "当对手使出会变成异常状态的招式\n或寄生种子等时,会将对手的招式\n反射回去" + }, + "recycle": { + "name": "回收利用", + "effect": "使战斗中已经消耗掉的\n自己的持有物再生,\n并可以再次使用" + }, + "revenge": { + "name": "报复", + "effect": "如果受到对手的招式攻击,\n就能给予对手2倍的伤害" + }, + "brickBreak": { + "name": "劈瓦", + "effect": "将手刀猛烈地挥下攻击对手。\n还可以破坏光墙和反射壁等" + }, + "yawn": { + "name": "哈欠", + "effect": "打个大哈欠引起睡意。\n在下一回合让对手陷入睡眠状态" + }, + "knockOff": { + "name": "拍落", + "effect": "拍落对手的持有物,直到战斗结束\n都不能使用。对手携带道具时会增加伤害" + }, + "endeavor": { + "name": "蛮干", + "effect": "给予伤害,使对手的HP变得和自\n己的HP一样" + }, + "eruption": { + "name": "喷火", + "effect": "爆发怒火攻击对手。自己的HP越少,\n招式的威力越小" + }, + "skillSwap": { + "name": "特性互换", + "effect": "利用超能力互换自己和对手的特性" + }, + "imprison": { + "name": "封印", + "effect": "如果对手有和自己相同的招式,\n那么只有对手无法使用该招式" + }, + "refresh": { + "name": "焕然一新", + "effect": "让身体休息,治愈自己身上所中的\n毒、麻痹、灼伤的异常状态" + }, + "grudge": { + "name": "怨念", + "effect": "因对手的招式而陷入昏厥时给对手\n施加怨念,让该招式的PP变成0" + }, + "snatch": { + "name": "抢夺", + "effect": "将对手打算使用的回复招式或能力\n变化招式夺为己用" + }, + "secretPower": { + "name": "秘密之力", + "effect": "根据使用场所不同,该招式的追加\n效果也会有所变化" + }, + "dive": { + "name": "潜水", + "effect": "第1回合潜入水中,第2回合浮上\n来进行攻击" + }, + "armThrust": { + "name": "猛推", + "effect": "用张开着的双手猛推对手进行攻击。\n连续攻击2~5次" + }, + "camouflage": { + "name": "保护色", + "effect": "根据所在场所不同,如水边、草丛\n和洞窟等,可以改变自己的属性" + }, + "tailGlow": { + "name": "萤火", + "effect": "凝视闪烁的光芒,集中自己的精神,\n从而巨幅提高特攻" + }, + "lusterPurge": { + "name": "洁净光芒", + "effect": "释放耀眼的光芒进行攻击。\n有时会降低对手的特防" + }, + "mistBall": { + "name": "薄雾球", + "effect": "用围绕着雾状羽毛的球进行攻击。\n有时会降低对手的特攻" + }, + "featherDance": { + "name": "羽毛舞", + "effect": "撒出羽毛,笼罩在对手的周围。\n大幅降低对手的攻击" + }, + "teeterDance": { + "name": "摇晃舞", + "effect": "摇摇晃晃地跳起舞蹈,\n让自己周围的宝可梦陷入混乱状态" + }, + "blazeKick": { + "name": "火焰踢", + "effect": "攻击对手后,有时会使其陷入灼伤状态。\n也容易击中要害" + }, + "mudSport": { + "name": "玩泥巴", + "effect": "一旦使用此招式,\n周围就会弄得到处是泥。\n在5回合内减弱电属性的招式" + }, + "iceBall": { + "name": "冰球", + "effect": "在5回合内攻击对手。\n招式每次击中,威力就会提高" + }, + "needleArm": { + "name": "尖刺臂", + "effect": "用带刺的手臂猛烈地挥舞进行攻击。\n有时会使对手畏缩" + }, + "slackOff": { + "name": "偷懒", + "effect": "偷懒休息。回复自己最大HP的一半" + }, + "hyperVoice": { + "name": "巨声", + "effect": "给予对手又吵又响的巨大震动进行攻击" + }, + "poisonFang": { + "name": "剧毒牙", + "effect": "用有毒的牙齿咬住对手进行攻击。\n有时会使对手中剧毒" + }, + "crushClaw": { + "name": "撕裂爪", + "effect": "用坚硬的锐爪劈开对手进行攻击。\n有时会降低对手的防御" + }, + "blastBurn": { + "name": "爆炸烈焰", + "effect": "用爆炸的火焰烧尽对手进行攻击。\n下一回合自己将无法动弹" + }, + "hydroCannon": { + "name": "加农水炮", + "effect": "向对手喷射水炮进行攻击。\n下一回合自己将无法动弹" + }, + "meteorMash": { + "name": "彗星拳", + "effect": "使出彗星般的拳头攻击对手。\n有时会提高自己的攻击" + }, + "astonish": { + "name": "惊吓", + "effect": "用尖叫声等突然惊吓对手进行攻击。\n有时会使对手畏缩" + }, + "weatherBall": { + "name": "气象球", + "effect": "根据使用时的天气,招式属性和威\n力会改变" + }, + "aromatherapy": { + "name": "芳香治疗", + "effect": "让同伴闻沁人心脾的香气,\n从而治愈我方全员的异常状态" + }, + "fakeTears": { + "name": "假哭", + "effect": "装哭流泪。使对手不知所措,\n从而大幅降低对手的特防" + }, + "airCutter": { + "name": "空气利刃", + "effect": "用锐利的风切斩对手进行攻击。\n容易击中要害" + }, + "overheat": { + "name": "过热", + "effect": "使出全部力量攻击对手。\n使用之后会因为反作用力,\n自己的特攻大幅降低" + }, + "odorSleuth": { + "name": "气味侦测", + "effect": "使出后对幽灵属性宝可梦没有效果\n的招式以及闪避率高的对手,\n变得能够打中" + }, + "rockTomb": { + "name": "岩石封锁", + "effect": "投掷岩石进行攻击。封住对手的行动,\n从而降低速度" + }, + "silverWind": { + "name": "银色旋风", + "effect": "在风中掺入鳞粉攻击对手。\n有时会提高自己的全部能力" + }, + "metalSound": { + "name": "金属音", + "effect": "让对手听摩擦金属般讨厌的声音。\n大幅降低对手的特防" + }, + "grassWhistle": { + "name": "草笛", + "effect": "让对手听舒适的笛声,\n从而陷入睡眠状态" + }, + "tickle": { + "name": "挠痒", + "effect": "给对手挠痒,使其发笑,\n从而降低对手的攻击和防御" + }, + "cosmicPower": { + "name": "宇宙力量", + "effect": "汲取宇宙中神秘的力量,\n从而提高自己的防御和特防" + }, + "waterSpout": { + "name": "喷水", + "effect": "掀起潮水进行攻击。自己的HP越少,\n招式的威力越小" + }, + "signalBeam": { + "name": "信号光束", + "effect": "发射神奇的光线进行攻击。\n有时会使对手混乱" + }, + "shadowPunch": { + "name": "暗影拳", + "effect": "使出混影之拳。攻击必定会命中" + }, + "extrasensory": { + "name": "神通力", + "effect": "发出看不见的神奇力量进行攻击。\n有时会使对手畏缩" + }, + "skyUppercut": { + "name": "冲天拳", + "effect": "用冲向天空般高高的上勾拳顶起对\n手进行攻击" + }, + "sandTomb": { + "name": "流沙深渊", + "effect": "将对手困在铺天盖地的沙暴中,\n在4~5回合内进行攻击" + }, + "sheerCold": { + "name": "绝对零度", + "effect": "给对手一击昏厥。如果是冰属性以\n外的宝可梦使用,就会难以打中" + }, + "muddyWater": { + "name": "浊流", + "effect": "向对手喷射浑浊的水进行攻击。\n有时会降低对手的命中率" + }, + "bulletSeed": { + "name": "种子机关枪", + "effect": "向对手猛烈地发射种子进行攻击。\n连续攻击2~5次" + }, + "aerialAce": { + "name": "燕返", + "effect": "以敏捷的动作戏弄对手后进行切斩。\n攻击必定会命中" + }, + "icicleSpear": { + "name": "冰锥", + "effect": "向对手发射锋利的冰柱进行攻击。\n连续攻击2~5次" + }, + "ironDefense": { + "name": "铁壁", + "effect": "将皮肤变得坚硬如铁,\n从而大幅提高自己的防御" + }, + "block": { + "name": "挡路", + "effect": "张开双手进行阻挡,封住对手的退路,\n使其不能逃走" + }, + "howl": { + "name": "长嚎", + "effect": "大声吼叫提高气势,从而提高自己\n和同伴的攻击" + }, + "dragonClaw": { + "name": "龙爪", + "effect": "用尖锐的巨爪劈开对手进行攻击" + }, + "frenzyPlant": { + "name": "疯狂植物", + "effect": "用大树摔打对手进行攻击。\n下一回合自己将无法动弹" + }, + "bulkUp": { + "name": "健美", + "effect": "使出全身力气绷紧肌肉,\n从而提高自己的攻击和防御" + }, + "bounce": { + "name": "弹跳", + "effect": "弹跳到高高的空中,第2回合攻击对手。\n有时会让对手陷入麻痹状态" + }, + "mudShot": { + "name": "泥巴射击", + "effect": "向对手投掷泥块进行攻击。\n同时降低对手的速度" + }, + "poisonTail": { + "name": "毒尾", + "effect": "用尾巴拍打。\n有时会让对手陷入中毒状态,\n也容易击中要害" + }, + "covet": { + "name": "渴望", + "effect": "一边可爱地撒娇,\n一边靠近对手进行攻击,\n还能夺取对手携带的道具" + }, + "voltTackle": { + "name": "伏特攻击", + "effect": "让电流覆盖全身猛撞向对手。\n自己也会受到不小的伤害。\n有时会让对手陷入麻痹状态" + }, + "magicalLeaf": { + "name": "魔法叶", + "effect": "散落可以追踪对手的神奇叶片。\n攻击必定会命中" + }, + "waterSport": { + "name": "玩水", + "effect": "用水湿透周围。在5回合内减弱火\n属性的招式" + }, + "calmMind": { + "name": "冥想", + "effect": "静心凝神,从而提高自己的特攻和特防" + }, + "leafBlade": { + "name": "叶刃", + "effect": "像用剑一般操纵叶片切斩对手进行攻击。\n容易击中要害" + }, + "dragonDance": { + "name": "龙之舞", + "effect": "激烈地跳起神秘且强有力的舞蹈。\n从而提高自己的攻击和速度" + }, + "rockBlast": { + "name": "岩石爆击", + "effect": "向对手发射坚硬的岩石进行攻击。\n连续攻击2~5次" + }, + "shockWave": { + "name": "电击波", + "effect": "向对手快速发出电击。\n攻击必定会命中" + }, + "waterPulse": { + "name": "水之波动", + "effect": "用水的震动攻击对手。\n有时会使对手混乱" + }, + "doomDesire": { + "name": "破灭之愿", + "effect": "使用招式2回合后,会用无数道光\n束攻击对手" + }, + "psychoBoost": { + "name": "精神突进", + "effect": "使出全部力量攻击对手。\n使用之后会因为反作用力,\n自己的特攻大幅降低" + }, + "roost": { + "name": "羽栖", + "effect": "降到地面,使身体休息。\n回复自己最大HP的一半" + }, + "gravity": { + "name": "重力", + "effect": "在5回合内,飘浮特性和飞行属性\n的宝可梦会被地面属性的招式击中。\n飞向空中的招式也将无法使用" + }, + "miracleEye": { + "name": "奇迹之眼", + "effect": "使出后对恶属性宝可梦没有效果的\n招式以及闪避率高的对手,\n变得能够打中" + }, + "wakeUpSlap": { + "name": "唤醒巴掌", + "effect": "给予睡眠状态下的对手较大的伤害。\n但相反对手会从睡眠中醒过来" + }, + "hammerArm": { + "name": "臂锤", + "effect": "挥舞强力而沉重的拳头,\n给予对手伤害。自己的速度会降低" + }, + "gyroBall": { + "name": "陀螺球", + "effect": "让身体高速旋转并撞击对手。\n速度比对手越慢,威力越大" + }, + "healingWish": { + "name": "治愈之愿", + "effect": "虽然自己陷入昏厥,但可以治愈后\n备上场的宝可梦的异常状态以及回复HP" + }, + "brine": { + "name": "盐水", + "effect": "当对手的HP负伤到一半左右时,\n招式威力会变成2倍" + }, + "naturalGift": { + "name": "自然之恩", + "effect": "从树果上获得力量进行攻击。\n根据携带的树果,招式属性和威力会改变" + }, + "feint": { + "name": "佯攻", + "effect": "能够攻击正在使用守住或看穿等招\n式的对手。解除其守护效果" + }, + "pluck": { + "name": "啄食", + "effect": "用喙进行攻击。当对手携带树果时,\n可以食用并获得其效果" + }, + "tailwind": { + "name": "顺风", + "effect": "刮起猛烈的旋风,在4回合内提高\n我方全员的速度" + }, + "acupressure": { + "name": "点穴", + "effect": "通过点穴让身体舒筋活络。\n大幅提高某1项能力" + }, + "metalBurst": { + "name": "金属爆炸", + "effect": "使出招式前,将最后受到的招式的\n伤害大力返还给对手" + }, + "uTurn": { + "name": "急速折返", + "effect": "在攻击之后急速返回,\n和后备宝可梦进行替换" + }, + "closeCombat": { + "name": "近身战", + "effect": "放弃守护,向对手的怀里突击。\n自己的防御和特防会降低" + }, + "payback": { + "name": "以牙还牙", + "effect": "蓄力攻击。如果能在对手之后攻击,\n招式的威力会变成2倍" + }, + "assurance": { + "name": "恶意追击", + "effect": "如果此回合内对手已经受到伤害的话,\n招式威力会变成2倍" + }, + "embargo": { + "name": "查封", + "effect": "让对手在5回合内不能使用宝可梦\n携带的道具。训练家也不能给那只\n宝可梦使用道具" + }, + "fling": { + "name": "投掷", + "effect": "快速投掷携带的道具进行攻击。\n根据道具不同,威力和效果会改变" + }, + "psychoShift": { + "name": "精神转移", + "effect": "利用超能力施以暗示,\n从而将自己受到的异常状态转移给对手" + }, + "trumpCard": { + "name": "王牌", + "effect": "王牌招式的剩余PP越少,\n招式的威力越大" + }, + "healBlock": { + "name": "回复封锁", + "effect": "在5回合内无法通过招式、特性或\n携带的道具来回复HP" + }, + "wringOut": { + "name": "绞紧", + "effect": "用力勒紧对手进行攻击。\n对手的HP越多,威力越大" + }, + "powerTrick": { + "name": "力量戏法", + "effect": "利用超能力交换自己的攻击和防御的力量" + }, + "gastroAcid": { + "name": "胃液", + "effect": "将胃液吐向对手的身体。\n沾上的胃液会消除对手的特性效果" + }, + "luckyChant": { + "name": "幸运咒语", + "effect": "向天许愿,从而在5回合内不会被\n对手的攻击打中要害" + }, + "meFirst": { + "name": "抢先一步", + "effect": "提高威力,\n抢先使出对手想要使出的招式。\n如果不先使出则会失败" + }, + "copycat": { + "name": "仿效", + "effect": "模仿对手刚才使出的招式,\n并使出相同招式。\n如果对手还没出招则会失败" + }, + "powerSwap": { + "name": "力量互换", + "effect": "利用超能力互换自己和对手的攻击\n以及特攻的能力变化" + }, + "guardSwap": { + "name": "防守互换", + "effect": "利用超能力互换自己和对手的防御\n以及特防的能力变化" + }, + "punishment": { + "name": "惩罚", + "effect": "根据能力变化,对手提高的力量越大,\n招式的威力越大" + }, + "lastResort": { + "name": "珍藏", + "effect": "当战斗中已学会的招式全部使用过后,\n才能开始使出珍藏的招式" + }, + "worrySeed": { + "name": "烦恼种子", + "effect": "种植心神不宁的种子。\n使对手不能入眠,并将特性变成不眠" + }, + "suckerPunch": { + "name": "突袭", + "effect": "可以比对手先攻击。对手使出的招\n式如果不是攻击招式则会失败" + }, + "toxicSpikes": { + "name": "毒菱", + "effect": "在对手的脚下撒毒菱。\n使对手替换出场的宝可梦中毒" + }, + "heartSwap": { + "name": "心灵互换", + "effect": "利用超能力互换自己和对手之间的\n能力变化" + }, + "aquaRing": { + "name": "水流环", + "effect": "在自己身体的周围覆盖用水制造的幕。\n每回合回复HP" + }, + "magnetRise": { + "name": "电磁飘浮", + "effect": "利用电气产生的磁力浮在空中。\n在5回合内可以飘浮" + }, + "flareBlitz": { + "name": "闪焰冲锋", + "effect": "让火焰覆盖全身猛撞向对手。\n自己也会受到不小的伤害。\n有时会让对手陷入灼伤状态" + }, + "forcePalm": { + "name": "发劲", + "effect": "向对手的身体发出冲击波进行攻击。\n有时会让对手陷入麻痹状态" + }, + "auraSphere": { + "name": "波导弹", + "effect": "从体内产生出波导之力,\n然后向对手发出。攻击必定会命中" + }, + "rockPolish": { + "name": "岩石打磨", + "effect": "打磨自己的身体,减少空气阻力。\n可以大幅提高自己的速度" + }, + "poisonJab": { + "name": "毒击", + "effect": "用带毒的触手或手臂刺入对手。\n有时会让对手陷入中毒状态" + }, + "darkPulse": { + "name": "恶之波动", + "effect": "从体内发出充满恶意的恐怖气场。\n有时会使对手畏缩" + }, + "nightSlash": { + "name": "暗袭要害", + "effect": "抓住瞬间的空隙切斩对手。\n容易击中要害" + }, + "aquaTail": { + "name": "水流尾", + "effect": "如惊涛骇浪般挥动大尾巴攻击对手" + }, + "seedBomb": { + "name": "种子炸弹", + "effect": "将外壳坚硬的大种子,\n从上方砸下攻击对手" + }, + "airSlash": { + "name": "空气之刃", + "effect": "用连天空也能劈开的空气之刃进行攻击。\n有时会使对手畏缩" + }, + "xScissor": { + "name": "十字剪", + "effect": "将镰刀或爪子像剪刀般地交叉,\n顺势劈开对手" + }, + "bugBuzz": { + "name": "虫鸣", + "effect": "利用振动发出音波进行攻击。\n有时会降低对手的特防" + }, + "dragonPulse": { + "name": "龙之波动", + "effect": "从大大的口中掀起冲击波攻击对手" + }, + "dragonRush": { + "name": "龙之俯冲", + "effect": "释放出骇人的杀气,一边威慑一边\n撞击对手。有时会使对手畏缩" + }, + "powerGem": { + "name": "力量宝石", + "effect": "发射如宝石般闪耀的光芒攻击对手" + }, + "drainPunch": { + "name": "吸取拳", + "effect": "用拳头吸取对手的力量。\n可以回复给予对手伤害的一半HP" + }, + "vacuumWave": { + "name": "真空波", + "effect": "挥动拳头,掀起真空波。\n必定能够先制攻击" + }, + "focusBlast": { + "name": "真气弹", + "effect": "提高气势,释放出全部力量。\n有时会降低对手的特防" + }, + "energyBall": { + "name": "能量球", + "effect": "发射从自然收集的生命力量。\n有时会降低对手的特防" + }, + "braveBird": { + "name": "勇鸟猛攻", + "effect": "收拢翅膀,通过低空飞行突击对手。\n自己也会受到不小的伤害" + }, + "earthPower": { + "name": "大地之力", + "effect": "向对手脚下释放出大地之力。\n有时会降低对手的特防" + }, + "switcheroo": { + "name": "掉包", + "effect": "用一闪而过的速度交换自己和对手\n的持有物" + }, + "gigaImpact": { + "name": "终极冲击", + "effect": "使出自己浑身力量突击对手。\n下一回合自己将无法动弹" + }, + "nastyPlot": { + "name": "诡计", + "effect": "谋划诡计,激活头脑。\n大幅提高自己的特攻" + }, + "bulletPunch": { + "name": "子弹拳", + "effect": "向对手使出如子弹般快速而坚硬的拳头。\n必定能够先制攻击" + }, + "avalanche": { + "name": "雪崩", + "effect": "如果受到对手的招式攻击,\n就能给予该对手2倍威力的攻击" + }, + "iceShard": { + "name": "冰砾", + "effect": "瞬间制作冰块,快速地扔向对手。\n必定能够先制攻击" + }, + "shadowClaw": { + "name": "暗影爪", + "effect": "以影子做成的锐爪,劈开对手。\n容易击中要害" + }, + "thunderFang": { + "name": "雷电牙", + "effect": "用蓄满电流的牙齿咬住对手。\n有时会使对手畏缩或陷入麻痹状态" + }, + "iceFang": { + "name": "冰冻牙", + "effect": "用藏有冷气的牙齿咬住对手。\n有时会使对手畏缩或陷入冰冻状态" + }, + "fireFang": { + "name": "火焰牙", + "effect": "用覆盖着火焰的牙齿咬住对手。\n有时会使对手畏缩或陷入灼伤状态" + }, + "shadowSneak": { + "name": "影子偷袭", + "effect": "伸长影子,从对手的背后进行攻击。\n必定能够先制攻击" + }, + "mudBomb": { + "name": "泥巴炸弹", + "effect": "向对手发射坚硬的泥弹进行攻击。\n有时会降低对手的命中率" + }, + "psychoCut": { + "name": "精神利刃", + "effect": "用实体化的心之利刃劈开对手。\n容易击中要害" + }, + "zenHeadbutt": { + "name": "意念头锤", + "effect": "将思念的力量集中在前额进行攻击。\n有时会使对手畏缩" + }, + "mirrorShot": { + "name": "镜光射击", + "effect": "抛光自己的身体,\n向对手释放出闪光之力。\n有时会降低对手的命中率" + }, + "flashCannon": { + "name": "加农光炮", + "effect": "将身体的光芒聚集在一点释放出去。\n有时会降低对手的特防" + }, + "rockClimb": { + "name": "攀岩", + "effect": "发动猛撞攻击,有时会使对手混乱。\n是宝可表的秘传招式之一" + }, + "defog": { + "name": "清除浓雾", + "effect": "用强风吹开对手的反射壁或光墙等。\n也会降低对手的闪避率" + }, + "trickRoom": { + "name": "戏法空间", + "effect": "制造出离奇的空间。在5回合内速\n度慢的宝可梦可以先行动" + }, + "dracoMeteor": { + "name": "流星群", + "effect": "从天空中向对手落下陨石。\n使用之后因为反作用力,\n自己的特攻会大幅降低" + }, + "discharge": { + "name": "放电", + "effect": "用耀眼的电击攻击\n自己周围所有的宝可梦。\n有时会陷入麻痹状态" + }, + "lavaPlume": { + "name": "喷烟", + "effect": "用熊熊烈火攻击自己周围所有的宝可梦。\n有时会陷入灼伤状态" + }, + "leafStorm": { + "name": "飞叶风暴", + "effect": "用尖尖的叶片向对手卷起风暴。\n使用之后因为反作用力自己的特攻会\n大幅降低" + }, + "powerWhip": { + "name": "强力鞭打", + "effect": "激烈地挥舞青藤或触手摔打对手进行攻击" + }, + "rockWrecker": { + "name": "岩石炮", + "effect": "向对手发射巨大的岩石进行攻击。\n下一回合自己将无法动弹" + }, + "crossPoison": { + "name": "十字毒刃", + "effect": "用毒刃劈开对手。有时会让对手陷\n入中毒状态,也容易击中要害" + }, + "gunkShot": { + "name": "垃圾射击", + "effect": "用肮脏的垃圾撞向对手进行攻击。\n有时会让对手陷入中毒状态" + }, + "ironHead": { + "name": "铁头", + "effect": "用钢铁般坚硬的头部进行攻击。\n有时会使对手畏缩" + }, + "magnetBomb": { + "name": "磁铁炸弹", + "effect": "发射吸住对手的钢铁炸弹。\n攻击必定会命中" + }, + "stoneEdge": { + "name": "尖石攻击", + "effect": "用尖尖的岩石刺入对手进行攻击。\n容易击中要害" + }, + "captivate": { + "name": "诱惑", + "effect": "♂诱惑♀或♀诱惑♂,\n从而大幅降低对手的特攻" + }, + "stealthRock": { + "name": "隐形岩", + "effect": "将无数岩石悬浮在对手的周围,\n从而对替换出场的对手的宝可梦给予伤害" + }, + "grassKnot": { + "name": "打草结", + "effect": "用草缠住并绊倒对手。\n对手越重,威力越大" + }, + "chatter": { + "name": "喋喋不休", + "effect": "用非常烦人的,\n喋喋不休的音波攻击对手。\n使对手混乱" + }, + "judgment": { + "name": "制裁光砾", + "effect": "向对手放出无数的光弹。\n属性会根据自己携带的石板不同而改变" + }, + "bugBite": { + "name": "虫咬", + "effect": "咬住进行攻击。当对手携带树果时,\n可以食用并获得其效果" + }, + "chargeBeam": { + "name": "充电光束", + "effect": "向对手发射电击光束。\n由于蓄满电流,有时会提高自己的特攻" + }, + "woodHammer": { + "name": "木槌", + "effect": "用坚硬的躯体撞击对手进行攻击。\n自己也会受到不小的伤害" + }, + "aquaJet": { + "name": "水流喷射", + "effect": "以迅雷不及掩耳之势扑向对手。\n必定能够先制攻击" + }, + "attackOrder": { + "name": "攻击指令", + "effect": "召唤手下,让其朝对手发起攻击。\n容易击中要害" + }, + "defendOrder": { + "name": "防御指令", + "effect": "召唤手下,让其附在自己的身体上。\n可以提高自己的防御和特防" + }, + "healOrder": { + "name": "回复指令", + "effect": "召唤手下疗伤。回复自己最大HP的一半" + }, + "headSmash": { + "name": "双刃头锤", + "effect": "拼命使出浑身力气,\n向对手进行头锤攻击。\n自己也会受到非常大的伤害" + }, + "doubleHit": { + "name": "二连击", + "effect": "使用尾巴等拍打对手进行攻击。\n连续2次给予伤害" + }, + "roarOfTime": { + "name": "时光咆哮", + "effect": "释放出扭曲时间般的强大力量攻击对手。\n下一回合自己将无法动弹" + }, + "spacialRend": { + "name": "亚空裂斩", + "effect": "将对手连同周围的空间一起撕裂并\n给予伤害。容易击中要害" + }, + "lunarDance": { + "name": "新月舞", + "effect": "虽然自己陷入昏厥,但可以治愈后\n备上场的宝可梦的全部状态" + }, + "crushGrip": { + "name": "捏碎", + "effect": "用骇人的力量捏碎对手。\n对手剩余的HP越多,威力越大" + }, + "magmaStorm": { + "name": "熔岩风暴", + "effect": "将对手困在熊熊燃烧的火焰中,\n在4~5回合内进行攻击" + }, + "darkVoid": { + "name": "暗黑洞", + "effect": "将对手强制拖入黑暗的世界,\n从而让对手陷入睡眠状态" + }, + "seedFlare": { + "name": "种子闪光", + "effect": "从身体里产生冲击波。\n有时会大幅降低对手的特防" + }, + "ominousWind": { + "name": "奇异之风", + "effect": "突然刮起毛骨悚然的暴风攻击对手。\n有时会提高自己的全部能力" + }, + "shadowForce": { + "name": "暗影潜袭", + "effect": "第1回合消失踪影,第2回合攻击对手。\n即使对手正受保护,\n也能击中" + }, + "honeClaws": { + "name": "磨爪", + "effect": "将爪子磨得更加锋利。\n提高自己的攻击和命中率" + }, + "wideGuard": { + "name": "广域防守", + "effect": "在1回合内防住击打我方全员的攻击" + }, + "guardSplit": { + "name": "防守平分", + "effect": "利用超能力将自己和对手的防御和\n特防相加,再进行平分" + }, + "powerSplit": { + "name": "力量平分", + "effect": "利用超能力将自己和对手的攻击和\n特攻相加,再进行平分" + }, + "wonderRoom": { + "name": "奇妙空间", + "effect": "制造出离奇的空间。在5回合内互\n换所有宝可梦的防御和特防" + }, + "psyshock": { + "name": "精神冲击", + "effect": "将神奇的念波实体化攻击对手。\n给予物理伤害" + }, + "venoshock": { + "name": "毒液冲击", + "effect": "将特殊的毒液泼向对手。\n对处于中毒状态的对手,威力会变成2倍" + }, + "autotomize": { + "name": "身体轻量化", + "effect": "削掉身体上没用的部分。\n大幅提高自己的速度,同时体重也会变轻" + }, + "ragePowder": { + "name": "愤怒粉", + "effect": "将令人烦躁的粉末撒在自己身上,\n用以吸引对手的注意。\n使对手的攻击全部指向自己" + }, + "telekinesis": { + "name": "意念移物", + "effect": "利用超能力使对手浮起来。\n在3回合内攻击会变得容易打中对手" + }, + "magicRoom": { + "name": "魔法空间", + "effect": "制造出离奇的空间。在5回合内所\n有宝可梦携带道具的效果都会消失" + }, + "smackDown": { + "name": "击落", + "effect": "扔石头或炮弹,攻击飞行的对手。\n对手会被击落,掉到地面" + }, + "stormThrow": { + "name": "山岚摔", + "effect": "向对手使出强烈的一击。\n攻击必定会击中要害" + }, + "flameBurst": { + "name": "烈焰溅射", + "effect": "如果击中,爆裂的火焰会攻击到对手。\n爆裂出的火焰还会飞溅到旁边的对手" + }, + "sludgeWave": { + "name": "污泥波", + "effect": "用污泥波攻击自己周围所有的宝可梦。\n有时会陷入中毒状态" + }, + "quiverDance": { + "name": "蝶舞", + "effect": "轻巧地跳起神秘而又美丽的舞蹈。\n提高自己的特攻、特防和速度" + }, + "heavySlam": { + "name": "重磅冲撞", + "effect": "用沉重的身体撞向对手进行攻击。\n自己比对手越重,威力越大" + }, + "synchronoise": { + "name": "同步干扰", + "effect": "用神奇电波对周围所有和自己属性\n相同的宝可梦给予伤害" + }, + "electroBall": { + "name": "电球", + "effect": "用电气团撞向对手。\n自己比对手速度越快,\n威力越大" + }, + "soak": { + "name": "浸水", + "effect": "将大量的水泼向对手,\n从而使其变成水属性" + }, + "flameCharge": { + "name": "蓄能焰袭", + "effect": "让火焰覆盖全身,攻击对手。\n积蓄力量来提高自己的速度" + }, + "coil": { + "name": "盘蜷", + "effect": "盘蜷着集中精神。提高自己的攻击\n、防御和命中率" + }, + "lowSweep": { + "name": "下盘踢", + "effect": "以敏捷的动作瞄准对手的脚进行攻击。\n会降低对手的速度" + }, + "acidSpray": { + "name": "酸液炸弹", + "effect": "喷出能溶化对手的液体进行攻击。\n会大幅降低对手的特防" + }, + "foulPlay": { + "name": "欺诈", + "effect": "利用对手的力量进行攻击。\n正和自己战斗的对手,其攻击越高,\n伤害越大" + }, + "simpleBeam": { + "name": "单纯光束", + "effect": "向对手发送谜之念波。\n接收到念波的对手,其特性会变为单纯" + }, + "entrainment": { + "name": "找伙伴", + "effect": "用神奇的节奏跳舞。使对手模仿自\n己的动作,从而将特性变成一样" + }, + "afterYou": { + "name": "您先请", + "effect": "支援我方或对手的行动,\n使其紧接着此招式之后行动" + }, + "round": { + "name": "轮唱", + "effect": "用歌声攻击对手。大家一起轮唱便\n可以接连使出,威力也会提高" + }, + "echoedVoice": { + "name": "回声", + "effect": "用回声攻击对手。如果每回合都有\n宝可梦接着使用该招式,\n威力就会提高" + }, + "chipAway": { + "name": "逐步击破", + "effect": "看准机会稳步攻击。\n无视对手的能力变化,\n直接给予伤害" + }, + "clearSmog": { + "name": "清除之烟", + "effect": "向对手投掷特殊的泥块进行攻击。\n使其能力变回原点" + }, + "storedPower": { + "name": "辅助力量", + "effect": "用蓄积起来的力量攻击对手。\n自己的能力提高得越多,威力就越大" + }, + "quickGuard": { + "name": "快速防守", + "effect": "守护自己和同伴,以防对手的先制攻击" + }, + "allySwitch": { + "name": "交换场地", + "effect": "用神奇的力量瞬间移动,\n互换自己和同伴所在的位置。\n连续使出则容易失败" + }, + "scald": { + "name": "热水", + "effect": "向对手喷射煮得翻滚的开水进行攻击。\n有时会让对手陷入灼伤状态" + }, + "shellSmash": { + "name": "破壳", + "effect": "打破外壳,降低自己的防御和特防,\n但大幅提高攻击、特攻和速度" + }, + "healPulse": { + "name": "治愈波动", + "effect": "放出治愈波动,从而回复对手最大\nHP的一半" + }, + "hex": { + "name": "祸不单行", + "effect": "接二连三地进行攻击。\n对处于异常状态的对手给予较大的伤害" + }, + "skyDrop": { + "name": "自由落体", + "effect": "第1回合将对手带到空中,\n第2回合将其摔下进行攻击。\n被带到空中的对手不能动弹" + }, + "shiftGear": { + "name": "换档", + "effect": "转动齿轮,不仅提高自己的攻击,\n还会大幅提高速度" + }, + "circleThrow": { + "name": "巴投", + "effect": "扔飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束" + }, + "incinerate": { + "name": "烧净", + "effect": "用火焰攻击对手。对手携带树果等时,\n会烧掉,使其不能使用" + }, + "quash": { + "name": "延后", + "effect": "压制对手,从而将其行动顺序放到最后" + }, + "acrobatics": { + "name": "杂技", + "effect": "轻巧地攻击对手。自己没有携带道具时,\n会给予较大的伤害" + }, + "reflectType": { + "name": "镜面属性", + "effect": "反射对手的属性,让自己也变成一\n样的属性" + }, + "retaliate": { + "name": "报仇", + "effect": "为倒下的同伴报仇。如果上一回合\n有同伴倒下,威力就会提高" + }, + "finalGambit": { + "name": "搏命", + "effect": "拼命攻击对手。虽然自己陷入昏厥,\n但会给予对手和自己目前HP等\n量的伤害" + }, + "bestow": { + "name": "传递礼物", + "effect": "当对手未携带道具时,\n能够将自己携带的道具交给对手" + }, + "inferno": { + "name": "烈火深渊", + "effect": "用烈焰包裹住对手进行攻击。\n让对手陷入灼伤状态" + }, + "waterPledge": { + "name": "水之誓约", + "effect": "用水柱进行攻击。如果和火组合,\n威力就会提高,天空中会挂上彩虹" + }, + "firePledge": { + "name": "火之誓约", + "effect": "用火柱进行攻击。如果和草组合,\n威力就会提高,周围会变成火海" + }, + "grassPledge": { + "name": "草之誓约", + "effect": "用草柱进行攻击。如果和水组合,\n威力就会提高,周围会变成湿地" + }, + "voltSwitch": { + "name": "伏特替换", + "effect": "在攻击之后急速返回,\n和后备宝可梦进行替换" + }, + "struggleBug": { + "name": "虫之抵抗", + "effect": "抵抗并攻击对手。会降低对手的特攻" + }, + "bulldoze": { + "name": "重踏", + "effect": "用力踩踏地面并攻击自己周围所有\n的宝可梦。会降低对方的速度" + }, + "frostBreath": { + "name": "冰息", + "effect": "将冰冷的气息吹向对手进行攻击。\n必定会击中要害" + }, + "dragonTail": { + "name": "龙尾", + "effect": "弹飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束" + }, + "workUp": { + "name": "自我激励", + "effect": "激励自己,从而提高攻击和特攻" + }, + "electroweb": { + "name": "电网", + "effect": "用电网捉住对手进行攻击。\n会降低对手的速度" + }, + "wildCharge": { + "name": "疯狂伏特", + "effect": "让电流覆盖全身,撞向对手进行攻击。\n自己也会受到少许伤害" + }, + "drillRun": { + "name": "直冲钻", + "effect": "像钢钻一样,\n一边旋转身体一边撞击对手。\n容易击中要害" + }, + "dualChop": { + "name": "二连劈", + "effect": "用身体坚硬的部分拍打对手进行攻击。\n连续2次给予伤害" + }, + "heartStamp": { + "name": "爱心印章", + "effect": "以可爱的动作使对手疏忽,\n乘机给出强烈的一击。有时会使对手畏缩" + }, + "hornLeech": { + "name": "木角", + "effect": "将角刺入,吸取对手的养分。\n可以回复给予对手伤害的一半HP" + }, + "sacredSword": { + "name": "圣剑", + "effect": "用剑切斩对手进行攻击。\n无视对手的能力变化,直接给予伤害" + }, + "razorShell": { + "name": "贝壳刃", + "effect": "用锋利的贝壳切斩对手进行攻击。\n有时会降低对手的防御" + }, + "heatCrash": { + "name": "高温重压", + "effect": "用燃烧的身体撞向对手进行攻击。\n自己比对手越重,威力越大" + }, + "leafTornado": { + "name": "青草搅拌器", + "effect": "用锋利的叶片包裹住对手进行攻击。\n有时会降低对手的命中率" + }, + "steamroller": { + "name": "疯狂滚压", + "effect": "旋转揉成团的身体压扁对手。\n有时会使对手畏缩" + }, + "cottonGuard": { + "name": "棉花防守", + "effect": "用软绵绵的绒毛包裹住自己的身体\n进行守护。巨幅提高自己的防御" + }, + "nightDaze": { + "name": "暗黑爆破", + "effect": "放出黑暗的冲击波攻击对手。\n有时会降低对手的命中率" + }, + "psystrike": { + "name": "精神击破", + "effect": "将神奇的念波实体化攻击对手。\n给予物理伤害" + }, + "tailSlap": { + "name": "扫尾拍打", + "effect": "用坚硬的尾巴拍打对手进行攻击。\n连续攻击2~5次" + }, + "hurricane": { + "name": "暴风", + "effect": "用强烈的风席卷对手进行攻击。\n有时会使对手混乱" + }, + "headCharge": { + "name": "爆炸头突击", + "effect": "用厉害的爆炸头猛撞向对手进行攻击。\n自己也会受到少许伤害" + }, + "gearGrind": { + "name": "齿轮飞盘", + "effect": "向对手投掷钢铁齿轮进行攻击。\n连续2次给予伤害" + }, + "searingShot": { + "name": "火焰弹", + "effect": "用熊熊烈火攻击自己周围所有的宝可梦。\n有时会陷入灼伤状态" + }, + "technoBlast": { + "name": "高科技光炮", + "effect": "向对手放出光弹。属性会根据自己\n携带的卡带不同而改变" + }, + "relicSong": { + "name": "古老之歌", + "effect": "让对手听古老之歌,打动对手的内\n心进行攻击。有时会让对手陷入睡眠状态" + }, + "secretSword": { + "name": "神秘之剑", + "effect": "用长角切斩对手进行攻击。\n角上拥有的神奇力量将给予物理伤害" + }, + "glaciate": { + "name": "冰封世界", + "effect": "将冰冻的冷气吹向对手进行攻击。\n会降低对手的速度" + }, + "boltStrike": { + "name": "雷击", + "effect": "让强大的电流覆盖全身,\n猛撞向对手进行攻击。\n有时会让对手陷入麻痹状态" + }, + "blueFlare": { + "name": "青焰", + "effect": "用美丽而激烈的青焰\n包裹住对手进行攻击。\n有时会让对手陷入灼伤状态" + }, + "fieryDance": { + "name": "火之舞", + "effect": "让火焰覆盖全身,振翅攻击对手。\n有时会提高自己的特攻" + }, + "freezeShock": { + "name": "冰冻伏特", + "effect": "用覆盖着电流的冰块,\n在第2回合撞向对手。\n有时会让对手陷入麻痹状态" + }, + "iceBurn": { + "name": "极寒冷焰", + "effect": "用能够冻结一切的强烈冷气,\n在第2回合包裹住对手。有时会让对手\n陷入灼伤状态" + }, + "snarl": { + "name": "大声咆哮", + "effect": "没完没了地大声斥责,\n从而降低对手的特攻" + }, + "icicleCrash": { + "name": "冰柱坠击", + "effect": "用大冰柱激烈地撞向对手进行攻击。\n有时会使对手畏缩" + }, + "vCreate": { + "name": "V热焰", + "effect": "从前额产生灼热的火焰,\n舍身撞击对手。防御、特防和速度会降低" + }, + "fusionFlare": { + "name": "交错火焰", + "effect": "释放出巨大的火焰。受到巨大的闪\n电影响时,招式威力会提高" + }, + "fusionBolt": { + "name": "交错闪电", + "effect": "释放出巨大的闪电。受到巨大的火\n焰影响时,招式威力会提高" + }, + "flyingPress": { + "name": "飞身重压", + "effect": "从空中俯冲向对手。此招式同时带\n有格斗属性和飞行属性" + }, + "matBlock": { + "name": "掀榻榻米", + "effect": "将掀起来的榻榻米当作盾牌,\n防住自己和同伴免受招式伤害。\n变化招式无法防住" + }, + "belch": { + "name": "打嗝", + "effect": "朝着对手打嗝,并给予伤害。\n如果不吃树果则无法使出" + }, + "rototiller": { + "name": "耕地", + "effect": "翻耕土地,使草木更容易成长。\n会提高草属性宝可梦的攻击和特攻" + }, + "stickyWeb": { + "name": "黏黏网", + "effect": "在对手周围围上黏黏的网,\n降低替换出场的对手的速度" + }, + "fellStinger": { + "name": "致命针刺", + "effect": "如果使用此招式打倒对手,\n攻击会巨幅提高" + }, + "phantomForce": { + "name": "潜灵奇袭", + "effect": "第1回合消失在某处,\n第2回合攻击对手。\n可以无视守护进行攻击" + }, + "trickOrTreat": { + "name": "万圣夜", + "effect": "邀请对手参加万圣夜。\n使对手被追加幽灵属性" + }, + "nobleRoar": { + "name": "战吼", + "effect": "发出战吼威吓对手,从而降低对手\n的攻击和特攻" + }, + "ionDeluge": { + "name": "等离子浴", + "effect": "将带电粒子扩散开来,\n使一般属性的招式变成电属性" + }, + "parabolicCharge": { + "name": "抛物面充电", + "effect": "给周围全体宝可梦造成伤害。\n可以回复给予伤害的一半HP" + }, + "forestsCurse": { + "name": "森林咒术", + "effect": "向对手施加森林咒术。\n中了咒术的对手会被追加草属性" + }, + "petalBlizzard": { + "name": "落英缤纷", + "effect": "猛烈地刮起飞雪般的落花,\n攻击周围所有的宝可梦,并给予伤害" + }, + "freezeDry": { + "name": "冷冻干燥", + "effect": "急剧冷冻对手,有时会让对手陷入\n冰冻状态。对于水属性宝可梦也是\n效果绝佳" + }, + "disarmingVoice": { + "name": "魅惑之声", + "effect": "发出魅惑的叫声,\n给予对手精神上的伤害。\n攻击必定会命中" + }, + "partingShot": { + "name": "抛下狠话", + "effect": "抛下狠话威吓对手,降低攻击和特攻后,\n和后备宝可梦进行替换" + }, + "topsyTurvy": { + "name": "颠倒", + "effect": "颠倒对手身上的所有能力变化,\n变成和原来相反的状态" + }, + "drainingKiss": { + "name": "吸取之吻", + "effect": "用一个吻吸取对手的HP。\n回复给予对手伤害的一半以上的HP" + }, + "craftyShield": { + "name": "戏法防守", + "effect": "使用神奇的力量防住\n攻击我方的变化招式。\n但无法防住伤害招式的攻击" + }, + "flowerShield": { + "name": "鲜花防守", + "effect": "使用神奇的力量提高在场的所有草\n属性宝可梦的防御" + }, + "grassyTerrain": { + "name": "青草场地", + "effect": "在5回合内变成青草场地。\n地面上的宝可梦每回合都能回复。\n草属性的招式威力还会提高" + }, + "mistyTerrain": { + "name": "薄雾场地", + "effect": "在5回合内,地面上的宝可梦不会\n陷入异常状态。龙属性招式的伤害\n也会减半" + }, + "electrify": { + "name": "输电", + "effect": "对手使出招式前,如果输电,\n则该回合对手的招式变成电属性" + }, + "playRough": { + "name": "嬉闹", + "effect": "与对手嬉闹并攻击。有时会降低对\n手的攻击" + }, + "fairyWind": { + "name": "妖精之风", + "effect": "刮起妖精之风,吹向对手进行攻击" + }, + "moonblast": { + "name": "月亮之力", + "effect": "借用月亮的力量攻击对手。\n有时会降低对手的特攻" + }, + "boomburst": { + "name": "爆音波", + "effect": "通过震耳欲聋的爆炸声产生的破坏力,\n攻击自己周围所有的宝可梦" + }, + "fairyLock": { + "name": "妖精之锁", + "effect": "通过封锁,下一回合所有的宝可梦\n都无法逃走" + }, + "kingsShield": { + "name": "王者盾牌", + "effect": "防住对手攻击的同时,\n自己变为防御姿态。\n能够降低所接触到的对手的攻击" + }, + "playNice": { + "name": "和睦相处", + "effect": "和对手和睦相处,使其失去战斗的气力,\n从而降低对手的攻击" + }, + "confide": { + "name": "密语", + "effect": "和对手进行密语,使其失去集中力,\n从而降低对手的特攻" + }, + "diamondStorm": { + "name": "钻石风暴", + "effect": "掀起钻石风暴给予伤害。\n有时会大幅提高自己的防御" + }, + "steamEruption": { + "name": "蒸汽爆炸", + "effect": "将滚烫的蒸汽喷向对手。\n有时会让对手灼伤" + }, + "hyperspaceHole": { + "name": "异次元洞", + "effect": "通过异次元洞,突然出现在对手的\n侧面进行攻击。还可以无视守住和\n看穿等招式" + }, + "waterShuriken": { + "name": "飞水手里剑", + "effect": "用粘液制成的手里剑,\n连续攻击2~5次。必定能够先制攻击" + }, + "mysticalFire": { + "name": "魔法火焰", + "effect": "从口中喷出特别灼热的火焰进行攻击。\n降低对手的特攻" + }, + "spikyShield": { + "name": "尖刺防守", + "effect": "防住对手攻击的同时,\n削减接触到自己的对手的体力" + }, + "aromaticMist": { + "name": "芳香薄雾", + "effect": "通过神奇的芳香,提高我方宝可梦的特防" + }, + "eerieImpulse": { + "name": "怪异电波", + "effect": "从身体放射出怪异电波,\n让对手沐浴其中,从而大幅降低其特攻" + }, + "venomDrench": { + "name": "毒液陷阱", + "effect": "将特殊的毒液泼向对手。\n对处于中毒状态的对手,其攻击、\n特攻和速度都会降低" + }, + "powder": { + "name": "粉尘", + "effect": "如果被撒到粉尘的对手使用火招式,\n则会爆炸并给予伤害" + }, + "geomancy": { + "name": "大地掌控", + "effect": "第1回合吸收能量,第2回合大幅\n提高特攻、特防和速度" + }, + "magneticFlux": { + "name": "磁场操控", + "effect": "通过操控磁场,会提高特性为正电\n和负电的宝可梦的防御和特防" + }, + "happyHour": { + "name": "欢乐时光", + "effect": "如果使用欢乐时光,战斗后得到的\n钱会翻倍" + }, + "electricTerrain": { + "name": "电气场地", + "effect": "在5回合内变成电气场地。\n地面上的宝可梦将无法入眠。\n电属性的招式威力还会提高" + }, + "dazzlingGleam": { + "name": "魔法闪耀", + "effect": "向对手发射强光,并给予伤害" + }, + "celebrate": { + "name": "庆祝", + "effect": "宝可梦为十分开心的你庆祝" + }, + "holdHands": { + "name": "牵手", + "effect": "我方宝可梦之间牵手。\n能带来非常幸福的心情" + }, + "babyDollEyes": { + "name": "圆瞳", + "effect": "用圆瞳凝视对手,从而降低其攻击。\n必定能够先制攻击" + }, + "nuzzle": { + "name": "蹭蹭脸颊", + "effect": "将带电的脸颊蹭蹭对手进行攻击。\n让对手陷入麻痹状态" + }, + "holdBack": { + "name": "手下留情", + "effect": "在攻击的时候手下留情,\n从而使对手的HP至少会留下1HP" + }, + "infestation": { + "name": "纠缠不休", + "effect": "在4~5回合内死缠烂打地进行攻击。\n在此期间对手将无法逃走" + }, + "powerUpPunch": { + "name": "增强拳", + "effect": "通过反复击打对手,使自己的拳头\n慢慢变硬。打中对手攻击就会提高" + }, + "oblivionWing": { + "name": "归天之翼", + "effect": "从锁定的对手身上吸取HP。\n回复给予对手伤害的一半以上的HP" + }, + "thousandArrows": { + "name": "千箭齐发", + "effect": "可以击中浮在空中的宝可梦。\n空中的对手被击落后,会掉到地面" + }, + "thousandWaves": { + "name": "千波激荡", + "effect": "从地面掀起波浪进行攻击。\n被掀入波浪中的对手,\n将无法从战斗中逃走" + }, + "landsWrath": { + "name": "大地神力", + "effect": "聚集大地的力量,\n将此力量集中攻击对手,\n并给予伤害" + }, + "lightOfRuin": { + "name": "破灭之光", + "effect": "借用永恒之花的力量,\n发射出强力光线。\n自己也会受到非常大的伤害" + }, + "originPulse": { + "name": "根源波动", + "effect": "用无数青白色且闪耀的光线攻击对手" + }, + "precipiceBlades": { + "name": "断崖之剑", + "effect": "将大地的力量变化为利刃攻击对手" + }, + "dragonAscent": { + "name": "画龙点睛", + "effect": "从天空中急速下降攻击对手。\n自己的防御和特防会降低" + }, + "hyperspaceFury": { + "name": "异次元猛攻", + "effect": "用许多手臂,无视对手的守住或看\n穿等招式进行连续攻击,\n自己的防御会降低" + }, + "breakneckBlitzPhysical": { + "name": "一般Z究极无敌大冲撞", + "effect": "通过Z力量气势猛烈地全力撞上对手。\n威力会根据原来的招式而改变" + }, + "breakneckBlitzSpecial": { + "name": "一般Z究极无敌大冲撞", + "effect": "通过Z力量气势猛烈地全力撞上对手。\n威力会根据原来的招式而改变" + }, + "allOutPummelingPhysical": { + "name": "格斗Z全力无双激烈拳", + "effect": "通过Z力量制造出能量弹,\n全力撞向对手。\n威力会根据原来的招式而改变" + }, + "allOutPummelingSpecial": { + "name": "格斗Z全力无双激烈拳", + "effect": "通过Z力量制造出能量弹,\n全力撞向对手。\n威力会根据原来的招式而改变" + }, + "supersonicSkystrikePhysical": { + "name": "飞行Z极速俯冲轰烈撞", + "effect": "通过Z力量猛烈地飞向天空,\n朝对手全力落下。\n威力会根据原来的招式而改变" + }, + "supersonicSkystrikeSpecial": { + "name": "飞行Z极速俯冲轰烈撞", + "effect": "通过Z力量猛烈地飞向天空,\n朝对手全力落下。\n威力会根据原来的招式而改变" + }, + "acidDownpourPhysical": { + "name": "毒Z强酸剧毒灭绝雨", + "effect": "通过Z力量使毒沼涌起,\n全力让对手沉下去。\n威力会根据原来的招式而改变" + }, + "acidDownpourSpecial": { + "name": "毒Z强酸剧毒灭绝雨", + "effect": "通过Z力量使毒沼涌起,\n全力让对手沉下去。\n威力会根据原来的招式而改变" + }, + "tectonicRagePhysical": { + "name": "地面Z地隆啸天大终结", + "effect": "通过Z力量潜入地里最深处,\n全力撞上对手。\n威力会根据原来的招式而改变" + }, + "tectonicRageSpecial": { + "name": "地面Z地隆啸天大终结", + "effect": "通过Z力量潜入地里最深处,\n全力撞上对手。\n威力会根据原来的招式而改变" + }, + "continentalCrushPhysical": { + "name": "岩石Z毁天灭地巨岩坠", + "effect": "通过Z力量召唤大大的岩山,\n全力撞向对手。\n威力会根据原来的招式而改变" + }, + "continentalCrushSpecial": { + "name": "岩石Z毁天灭地巨岩坠", + "effect": "通过Z力量召唤大大的岩山,\n全力撞向对手。\n威力会根据原来的招式而改变" + }, + "savageSpinOutPhysical": { + "name": "虫Z绝对捕食回旋斩", + "effect": "通过Z力量将吐出的丝线全力束缚对手。\n威力会根据原来的招式而改变" + }, + "savageSpinOutSpecial": { + "name": "虫Z绝对捕食回旋斩", + "effect": "通过Z力量将吐出的丝线全力束缚对手。\n威力会根据原来的招式而改变" + }, + "neverEndingNightmarePhysical": { + "name": "幽灵Z无尽暗夜之诱惑", + "effect": "通过Z力量召唤强烈的怨念,\n全力降临到对手身上。\n威力会根据原来的招式而改变" + }, + "neverEndingNightmareSpecial": { + "name": "幽灵Z无尽暗夜之诱惑", + "effect": "通过Z力量召唤强烈的怨念,\n全力降临到对手身上。\n威力会根据原来的招式而改变" + }, + "corkscrewCrashPhysical": { + "name": "钢Z超绝螺旋连击", + "effect": "通过Z力量进行高速旋转,\n全力撞上对手。\n威力会根据原来的招式而改变" + }, + "corkscrewCrashSpecial": { + "name": "钢Z超绝螺旋连击", + "effect": "通过Z力量进行高速旋转,\n全力撞上对手。\n威力会根据原来的招式而改变" + }, + "infernoOverdrivePhysical": { + "name": "火Z超强极限爆焰弹", + "effect": "通过Z力量喷出熊熊烈火,\n全力撞向对手。\n威力会根据原来的招式而改变" + }, + "infernoOverdriveSpecial": { + "name": "火Z超强极限爆焰弹", + "effect": "通过Z力量喷出熊熊烈火,\n全力撞向对手。\n威力会根据原来的招式而改变" + }, + "hydroVortexPhysical": { + "name": "水Z超级水流大漩涡", + "effect": "通过Z力量制造大大的潮旋,\n全力吞没对手。\n威力会根据原来的招式而改变" + }, + "hydroVortexSpecial": { + "name": "水Z超级水流大漩涡", + "effect": "通过Z力量制造大大的潮旋,\n全力吞没对手。\n威力会根据原来的招式而改变" + }, + "bloomDoomPhysical": { + "name": "草Z绚烂缤纷花怒放", + "effect": "通过Z力量借助花草的能量,\n全力攻击对手。\n威力会根据原来的招式而改变" + }, + "bloomDoomSpecial": { + "name": "草Z绚烂缤纷花怒放", + "effect": "通过Z力量借助花草的能量,\n全力攻击对手。\n威力会根据原来的招式而改变" + }, + "gigavoltHavocPhysical": { + "name": "电Z终极伏特狂雷闪", + "effect": "通过Z力量将蓄积的强大电流全力\n撞向对手。威力会根据原来的招式而改变" + }, + "gigavoltHavocSpecial": { + "name": "电Z终极伏特狂雷闪", + "effect": "通过Z力量将蓄积的强大电流全力\n撞向对手。威力会根据原来的招式而改变" + }, + "shatteredPsychePhysical": { + "name": "超能力Z至高精神破坏波", + "effect": "通过Z力量操纵对手,\n全力使其感受到痛苦。\n威力会根据原来的招式而改变" + }, + "shatteredPsycheSpecial": { + "name": "超能力Z至高精神破坏波", + "effect": "通过Z力量操纵对手,\n全力使其感受到痛苦。\n威力会根据原来的招式而改变" + }, + "subzeroSlammerPhysical": { + "name": "冰Z激狂大地万里冰", + "effect": "通过Z力量急剧降低气温,\n全力冰冻对手。\n威力会根据原来的招式而改变" + }, + "subzeroSlammerSpecial": { + "name": "冰Z激狂大地万里冰", + "effect": "通过Z力量急剧降低气温,\n全力冰冻对手。\n威力会根据原来的招式而改变" + }, + "devastatingDrakePhysical": { + "name": "龙Z究极巨龙震天地", + "effect": "通过Z力量将气场实体化,\n向对手全力发动袭击。\n威力会根据原来的招式而改变" + }, + "devastatingDrakeSpecial": { + "name": "龙Z究极巨龙震天地", + "effect": "通过Z力量将气场实体化,\n向对手全力发动袭击。\n威力会根据原来的招式而改变" + }, + "blackHoleEclipsePhysical": { + "name": "恶Z黑洞吞噬万物灭", + "effect": "通过Z力量收集恶能量,\n全力将对手吸入。\n威力会根据原来的招式而改变" + }, + "blackHoleEclipseSpecial": { + "name": "恶Z黑洞吞噬万物灭", + "effect": "通过Z力量收集恶能量,\n全力将对手吸入。\n威力会根据原来的招式而改变" + }, + "twinkleTacklePhysical": { + "name": "妖精Z可爱星星飞天撞", + "effect": "通过Z力量制造魅惑空间,\n全力捉弄对手。\n威力会根据原来的招式而改变" + }, + "twinkleTackleSpecial": { + "name": "妖精Z可爱星星飞天撞", + "effect": "通过Z力量制造魅惑空间,\n全力捉弄对手。\n威力会根据原来的招式而改变" + }, + "catastropika": { + "name": "皮卡丘Z皮卡皮卡必杀击", + "effect": "通过Z力量,皮卡丘全身覆盖最强电力,\n全力猛扑对手" + }, + "shoreUp": { + "name": "集沙", + "effect": "回复自己最大HP的一半。\n在沙暴中回复得更多" + }, + "firstImpression": { + "name": "迎头一击", + "effect": "威力很高的招式,但只有在出场战斗时,\n立刻使出才能成功" + }, + "banefulBunker": { + "name": "碉堡", + "effect": "防住对手攻击的同时,\n让接触到自己的对手中毒" + }, + "spiritShackle": { + "name": "缝影", + "effect": "攻击的同时,缝住对手的影子,\n使其无法逃走" + }, + "darkestLariat": { + "name": "DD金勾臂", + "effect": "旋转双臂打向对手。\n无视对手的能力变化,\n直接给予伤害" + }, + "sparklingAria": { + "name": "泡影的咏叹调", + "effect": "随着唱歌会放出很多气球。\n受到此招式攻击时,灼伤会被治愈" + }, + "iceHammer": { + "name": "冰锤", + "effect": "挥舞强力而沉重的拳头,\n给予对手伤害。自己的速度会降低" + }, + "floralHealing": { + "name": "花疗", + "effect": "回复对手最大HP的一半。\n在青草场地时,效果会提高" + }, + "highHorsepower": { + "name": "十万马力", + "effect": "使出全身力量,猛攻对手" + }, + "strengthSap": { + "name": "吸取力量", + "effect": "给自己回复和对手攻击力\n相同数值的HP,\n然后降低对手的攻击" + }, + "solarBlade": { + "name": "日光刃", + "effect": "第1回合收集满满的日光,\n第2回合将此力量集中在剑上进行攻击" + }, + "leafage": { + "name": "树叶", + "effect": "将叶片打向对手,进行攻击" + }, + "spotlight": { + "name": "聚光灯", + "effect": "给宝可梦打上聚光灯,\n该回合只能瞄准该宝可梦" + }, + "toxicThread": { + "name": "毒丝", + "effect": "将混有毒的丝吐向对手。\n使其中毒,从而降低对手的速度" + }, + "laserFocus": { + "name": "磨砺", + "effect": "集中精神,下次攻击必定会击中要害" + }, + "gearUp": { + "name": "辅助齿轮", + "effect": "启动齿轮,提高特性为正电和负电\n的宝可梦的攻击和特攻" + }, + "throatChop": { + "name": "深渊突刺", + "effect": "受到此招式攻击的对手,\n会因为地狱般的痛苦,在2回合内,\n变得无法使出声音类招式" + }, + "pollenPuff": { + "name": "花粉团", + "effect": "对敌人使用是会爆炸的团子。\n对我方使用则是给予回复的团子" + }, + "anchorShot": { + "name": "掷锚", + "effect": "将锚缠住对手进行攻击。\n使对手无法逃走" + }, + "psychicTerrain": { + "name": "精神场地", + "effect": "在5回合内,地面上的宝可梦不会\n受到先制招式的攻击。\n超能力属性的招式威力会提高" + }, + "lunge": { + "name": "猛扑", + "effect": "全力猛扑对手进行攻击。\n从而降低对手的攻击" + }, + "fireLash": { + "name": "火焰鞭", + "effect": "用燃烧的鞭子抽打对手。\n受到攻击的对手防御会降低" + }, + "powerTrip": { + "name": "嚣张", + "effect": "耀武扬威地攻击对手,\n自己的能力提高得越多,威力就越大" + }, + "burnUp": { + "name": "燃尽", + "effect": "将自己全身燃烧起火焰来,\n给予对手大大的伤害。\n自己的火属性将会消失" + }, + "speedSwap": { + "name": "速度互换", + "effect": "将对手和自己的速度进行互换" + }, + "smartStrike": { + "name": "修长之角", + "effect": "用尖尖的角刺入对手进行攻击。\n攻击必定会命中" + }, + "purify": { + "name": "净化", + "effect": "治愈对手的异常状态。\n治愈后可以回复自己的HP" + }, + "revelationDance": { + "name": "觉醒之舞", + "effect": "全力跳舞进行攻击。此招式的属性\n将变得和自己的属性相同" + }, + "coreEnforcer": { + "name": "核心惩罚者", + "effect": "如果给予过伤害的对手已经结束行动,\n其特性就会被消除" + }, + "tropKick": { + "name": "热带踢", + "effect": "向对手使出来自南国的火热脚踢。\n从而降低对手的攻击" + }, + "instruct": { + "name": "号令", + "effect": "向对手下达指示,让其再次使出刚\n才的招式" + }, + "beakBlast": { + "name": "鸟嘴加农炮", + "effect": "先加热鸟嘴后再进行攻击。\n鸟嘴在加热时对手触碰的话,\n就会使其灼伤" + }, + "clangingScales": { + "name": "鳞片噪音", + "effect": "摩擦全身鳞片,\n发出响亮的声音进行攻击。\n攻击后自己的防御会降低" + }, + "dragonHammer": { + "name": "龙锤", + "effect": "将身体当作锤子,向对手发动袭击,\n给予伤害" + }, + "brutalSwing": { + "name": "狂舞挥打", + "effect": "用自己的身体狂舞挥打,\n给予对手伤害" + }, + "auroraVeil": { + "name": "极光幕", + "effect": "在5回合内减弱物理和特殊的伤害。\n只有下雪时才能使出" + }, + "sinisterArrowRaid": { + "name": "狙射树枭Z遮天蔽日暗影箭", + "effect": "通过Z力量制造出无数箭的狙射树\n枭将全力射穿对手进行攻击" + }, + "maliciousMoonsault": { + "name": "炽焰咆哮虎Z极恶飞跃粉碎击", + "effect": "通过Z力量得到强壮肉体的炽焰咆\n哮虎将全力撞向对手进行攻击" + }, + "oceanicOperetta": { + "name": "西狮海壬Z海神庄严交响乐", + "effect": "通过Z力量召唤大量水的西狮海壬\n将全力攻击对手" + }, + "guardianOfAlola": { + "name": "卡璞Z巨人卫士・阿罗拉", + "effect": "通过Z力量得到阿罗拉之力的土地\n神宝可梦将全力进行攻击。\n对手的剩余HP会减少很多" + }, + "soulStealing7StarStrike": { + "name": "玛夏多Z七星夺魂腿", + "effect": "得到Z力量的玛夏多将全力使出拳\n头和脚踢的连续招式叩打对手" + }, + "stokedSparksurfer": { + "name": "阿罗雷Z驾雷驭电戏冲浪", + "effect": "得到Z力量的阿罗拉地区的雷丘将\n全力进行攻击。从而让对手陷入麻痹状态" + }, + "pulverizingPancake": { + "name": "卡比兽Z认真起来大爆击", + "effect": "通过Z力量使得认真起来的卡比兽\n跃动巨大身躯,全力向对手发动袭击" + }, + "extremeEvoboost": { + "name": "伊布Z九彩昇华齐聚顶", + "effect": "得到Z力量的伊布将借助进化后伙\n伴们的力量,大幅提高能力" + }, + "genesisSupernova": { + "name": "梦幻Z起源超新星大爆炸", + "effect": "得到Z力量的梦幻将全力攻击对手。\n脚下会变成精神场地" + }, + "shellTrap": { + "name": "陷阱甲壳", + "effect": "设下甲壳陷阱。如果对手使出物理招式,\n陷阱就会爆炸并给予对手伤害" + }, + "fleurCannon": { + "name": "花朵加农炮", + "effect": "放出强力光束后,自己的特攻会大幅降低" + }, + "psychicFangs": { + "name": "精神之牙", + "effect": "利用精神力量咬住对手进行攻击。\n还可以破坏光墙和反射壁等" + }, + "stompingTantrum": { + "name": "跺脚", + "effect": "化悔恨为力量进行攻击。\n如果上一回合招式没有打中,\n威力就会翻倍" + }, + "shadowBone": { + "name": "暗影之骨", + "effect": "用附有灵魂的骨头殴打对手进行攻击。\n有时会降低对手的防御" + }, + "accelerock": { + "name": "冲岩", + "effect": "迅速撞向对手进行攻击。\n必定能够先制攻击" + }, + "liquidation": { + "name": "水流裂破", + "effect": "用水之力量撞向对手进行攻击。\n有时会降低对手的防御" + }, + "prismaticLaser": { + "name": "棱镜镭射", + "effect": "用棱镜的力量发射强烈光线。\n下一回合自己将无法动弹" + }, + "spectralThief": { + "name": "暗影偷盗", + "effect": "潜入对手的影子进行攻击。\n会夺取对手的能力提升" + }, + "sunsteelStrike": { + "name": "流星闪冲", + "effect": "以流星般的气势猛撞对手。\n可以无视对手的特性进行攻击" + }, + "moongeistBeam": { + "name": "暗影之光", + "effect": "放出奇怪的光线攻击对手。\n可以无视对手的特性进行攻击" + }, + "tearfulLook": { + "name": "泪眼汪汪", + "effect": "变得泪眼汪汪,让对手丧失斗志。\n从而降低对手的攻击和特攻" + }, + "zingZap": { + "name": "麻麻刺刺", + "effect": "撞向对手,并发出强电,\n使其感到麻麻刺刺的。有时会使对手畏缩" + }, + "naturesMadness": { + "name": "自然之怒", + "effect": "向对手释放自然之怒。\n对手的HP会减半" + }, + "multiAttack": { + "name": "多属性攻击", + "effect": "一边覆盖高能量,\n一边撞向对手进行攻击。\n根据存储碟不同,\n属性会改变" + }, + "tenMillionVoltThunderbolt": { + "name": "智皮卡Z千万伏特", + "effect": "戴着帽子的皮卡丘将通过Z力量增\n强的电击全力释放给对手。\n容易击中要害" + }, + "mindBlown": { + "name": "惊爆大头", + "effect": "让自己的头爆炸,来攻击周围的一切。\n自己也会受到伤害" + }, + "plasmaFists": { + "name": "等离子闪电拳", + "effect": "用覆盖着电流的拳头进行攻击。\n使一般属性的招式变成电属性" + }, + "photonGeyser": { + "name": "光子喷涌", + "effect": "用光柱来进行攻击。比较自己的攻\n击和特攻,用数值相对较高的一项\n给予对方伤害" + }, + "lightThatBurnsTheSky": { + "name": "究极奈克洛Z焚天灭世炽光爆", + "effect": "奈克洛兹玛会无视对手的特性效果,\n在攻击和特攻之间,\n用数值相对较高的一项给予对方伤害" + }, + "searingSunrazeSmash": { + "name": "索尔迦雷欧Z日光回旋下苍穹", + "effect": "得到Z力量的索尔迦雷欧\n将全力进行攻击。\n可以无视对手的特性效果" + }, + "menacingMoonrazeMaelstrom": { + "name": "露奈雅拉Z月华飞溅落灵霄", + "effect": "得到Z力量的露奈雅拉将全力进行攻击。\n可以无视对手的特性效果" + }, + "letsSnuggleForever": { + "name": "谜拟丘Z亲密无间大乱揍", + "effect": "得到Z力量的谜拟Q将全力进行乱揍攻击" + }, + "splinteredStormshards": { + "name": "鬃岩狼人Z狼啸石牙飓风暴", + "effect": "得到Z力量的鬃岩狼人将全力进行攻击。\n而且会消除场地状态" + }, + "clangorousSoulblaze": { + "name": "杖尾鳞甲龙Z炽魂热舞烈音爆", + "effect": "得到Z力量的杖尾鳞甲龙\n将全力攻击对手。\n并且自己的能力会提高" + }, + "zippyZap": { + "name": "电电加速", + "effect": "迅猛无比的电击。必定能够先制攻击,击中对方的要害。" + }, + "splishySplash": { + "name": "滔滔冲浪", + "effect": "往巨浪中注入电能后冲撞对手进行攻击。\n有时会让对手陷入麻痹状态" + }, + "floatyFall": { + "name": "飘飘坠落", + "effect": "轻飘飘地浮起来后,再猛地俯冲下\n去进行攻击。有时会使对手畏缩" + }, + "pikaPapow": { + "name": "闪闪雷光", + "effect": "皮卡丘越喜欢训练家,\n电击的威力就越强。攻击必定会命中" + }, + "bouncyBubble": { + "name": "活活气泡", + "effect": "投掷水球进行攻击。吸水后能回复\n等同于造成的伤害的HP" + }, + "buzzyBuzz": { + "name": "麻麻电击", + "effect": "放出电击攻击对手。让对手陷入麻痹状态" + }, + "sizzlySlide": { + "name": "熊熊火爆", + "effect": "用燃起大火的身体猛烈地冲撞对手。\n让对手陷入灼伤状态" + }, + "glitzyGlow": { + "name": "哗哗气场", + "effect": "利用念力强攻,粉碎对方信心。\n制造一道能减弱对手特殊攻击的神奇墙壁" + }, + "baddyBad": { + "name": "坏坏领域", + "effect": "恶行恶相地进行攻击。\n制造一道能减弱对手物理攻击的神奇墙壁" + }, + "sappySeed": { + "name": "茁茁炸弹", + "effect": "长出巨大的藤蔓,播撒种子进行攻击。\n种子每回合都会吸取对手的HP" + }, + "freezyFrost": { + "name": "冰冰霜冻", + "effect": "利用冰冷的黑雾结晶进行攻击。\n使全体宝可梦的能力变回原点" + }, + "sparklySwirl": { + "name": "亮亮风暴", + "effect": "利用芬芳刺鼻的龙卷风吞噬对方。\n能治愈我方宝可梦的异常状态" + }, + "veeveeVolley": { + "name": "砰砰击破", + "effect": "伊布越喜欢训练家,冲撞的威力就越强。\n攻击必定会命中" + }, + "doubleIronBash": { + "name": "钢拳双击", + "effect": "以胸口的螺帽为中心旋转,\n并连续2次挥动手臂打击对手。\n有时会使对手畏缩" + }, + "maxGuard": { + "name": "极巨防壁", + "effect": "完全抵挡对手的攻击。\n连续使出则容易失败" + }, + "dynamaxCannon": { + "name": "极巨炮", + "effect": "将凝缩在体内的能量从核心放出进行攻击,\n对手等级比当前波次的等级上限越高,造成的伤害越高,最多两倍。" + }, + "snipeShot": { + "name": "狙击", + "effect": "能无视具有吸引对手招式效果的特\n性或招式的影响。可以向选定的对\n手进行攻击" + }, + "jawLock": { + "name": "紧咬不放", + "effect": "使双方直到一方昏厥为止\n无法替换宝可梦。\n其中一方退场则可以解除效果" + }, + "stuffCheeks": { + "name": "大快朵颐", + "effect": "吃掉携带的树果,大幅提高防御" + }, + "noRetreat": { + "name": "背水一战", + "effect": "提高自己的所有能力,\n但无法替换或逃走" + }, + "tarShot": { + "name": "沥青射击", + "effect": "泼洒黏糊糊的沥青,降低对手的速度。\n火属性会变成对手的弱点" + }, + "magicPowder": { + "name": "魔法粉", + "effect": "向对手喷洒魔法粉,使对手变为超\n能力属性" + }, + "dragonDarts": { + "name": "龙箭", + "effect": "让多龙梅西亚进行2次攻击。\n如果对手有2只宝可梦,则对它们各进\n行1次攻击" + }, + "teatime": { + "name": "茶会", + "effect": "举办一场茶会,场上的所有宝可梦\n都会吃掉自己携带的树果" + }, + "octolock": { + "name": "蛸固", + "effect": "让对手无法逃走。对手被固定后,\n每回合都会降低防御和特防" + }, + "boltBeak": { + "name": "电喙", + "effect": "用带电的喙啄刺对手。\n如果比对手先出手攻击,\n招式的威力会变成2倍" + }, + "fishiousRend": { + "name": "鳃咬", + "effect": "用坚硬的腮咬住对手。\n如果比对手先出手攻击,\n招式的威力会变成2倍" + }, + "courtChange": { + "name": "换场", + "effect": "用神奇的力量交换双方的场地效果" + }, + "maxFlare": { + "name": "极巨火爆", + "effect": "极巨化宝可梦使出的火属性攻击。\n可在5回合内让日照变得强烈" + }, + "maxFlutterby": { + "name": "极巨虫蛊", + "effect": "极巨化宝可梦使出的虫属性攻击。\n会降低对手的特攻" + }, + "maxLightning": { + "name": "极巨闪电", + "effect": "极巨化宝可梦使出的电属性攻击。\n可在5回合内将脚下变成电气场地" + }, + "maxStrike": { + "name": "极巨攻击", + "effect": "极巨化宝可梦使出的一般属性攻击。\n会降低对手的速度" + }, + "maxKnuckle": { + "name": "极巨拳斗", + "effect": "极巨化宝可梦使出的格斗属性攻击。\n会提高我方的攻击" + }, + "maxPhantasm": { + "name": "极巨幽魂", + "effect": "极巨化宝可梦使出的幽灵属性攻击。\n会降低对手的防御" + }, + "maxHailstorm": { + "name": "极巨寒冰", + "effect": "极巨化宝可梦使出的冰属性攻击。\n在5回合内会下雪" + }, + "maxOoze": { + "name": "极巨酸毒", + "effect": "极巨化宝可梦使出的毒属性攻击。\n会提高我方的特攻" + }, + "maxGeyser": { + "name": "极巨水流", + "effect": "极巨化宝可梦使出的水属性攻击。\n可在5回合内降下大雨" + }, + "maxAirstream": { + "name": "极巨飞冲", + "effect": "极巨化宝可梦使出的飞行属性攻击。\n会提高我方的速度" + }, + "maxStarfall": { + "name": "极巨妖精", + "effect": "极巨化宝可梦使出的妖精属性攻击。\n可在5回合内将脚下变成薄雾场地" + }, + "maxWyrmwind": { + "name": "极巨龙骑", + "effect": "极巨化宝可梦使出的龙属性攻击。\n会降低对手的攻击" + }, + "maxMindstorm": { + "name": "极巨超能", + "effect": "极巨化宝可梦使出的超能力属性攻击。\n可在5回合内将脚下变成精神场地" + }, + "maxRockfall": { + "name": "极巨岩石", + "effect": "极巨化宝可梦使出的岩石属性攻击。\n可在5回合内卷起沙暴" + }, + "maxQuake": { + "name": "极巨大地", + "effect": "极巨化宝可梦使出的地面属性攻击。\n会提高我方的特防" + }, + "maxDarkness": { + "name": "极巨恶霸", + "effect": "极巨化宝可梦使出的恶属性攻击。\n会降低对手的特防" + }, + "maxOvergrowth": { + "name": "极巨草原", + "effect": "极巨化宝可梦使出的草属性攻击。\n可在5回合内将脚下变成青草场地" + }, + "maxSteelspike": { + "name": "极巨钢铁", + "effect": "极巨化宝可梦使出的钢属性攻击。\n会提高我方的防御" + }, + "clangorousSoul": { + "name": "魂舞烈音爆", + "effect": "削减少许自己的HP,\n使所有能力都提高" + }, + "bodyPress": { + "name": "扑击", + "effect": "用身体撞向对手进行攻击。\n防御越高,给予的伤害就越高" + }, + "decorate": { + "name": "装饰", + "effect": "通过装饰,大幅提高对方的攻击和特攻" + }, + "drumBeating": { + "name": "鼓击", + "effect": "用鼓点来控制鼓的根部进行攻击,\n从而降低对手的速度" + }, + "snapTrap": { + "name": "捕兽夹", + "effect": "使用捕兽夹,在4~5回合内,\n夹住对手进行攻击" + }, + "pyroBall": { + "name": "火焰球", + "effect": "点燃小石子,形成火球攻击对手。\n有时会使对手陷入灼伤状态" + }, + "behemothBlade": { + "name": "巨兽斩", + "effect": "以全身力气举起强大的剑,\n猛烈地劈向对手进行攻击" + }, + "behemothBash": { + "name": "巨兽弹", + "effect": "将全身变化为坚固的盾,\n猛烈地撞向对手进行攻击" + }, + "auraWheel": { + "name": "气场轮", + "effect": "用储存在颊囊里的能量进行攻击,\n并提高自己的速度。其属性会随着\n莫鲁贝可的样子而改变" + }, + "breakingSwipe": { + "name": "广域破坏", + "effect": "用坚韧的尾巴猛扫对手进行攻击,\n从而降低对手的攻击" + }, + "branchPoke": { + "name": "木枝突刺", + "effect": "使用尖锐的树枝刺向对手进行攻击" + }, + "overdrive": { + "name": "破音", + "effect": "奏响吉他和贝斯,释放出发出巨响\n的剧烈震动攻击对手" + }, + "appleAcid": { + "name": "苹果酸", + "effect": "使用从酸苹果中提取出来的酸性液\n体进行攻击。降低对手的特防" + }, + "gravApple": { + "name": "万有引力", + "effect": "从高处落下苹果,给予对手伤害。\n可降低对手的防御" + }, + "spiritBreak": { + "name": "灵魂冲击", + "effect": "用足以让对手一蹶不振的气势进行攻击。\n会降低对手的特攻" + }, + "strangeSteam": { + "name": "神奇蒸汽", + "effect": "喷出烟雾攻击对手。有时会使对手混乱" + }, + "lifeDew": { + "name": "生命水滴", + "effect": "喷洒出神奇的水,回复自己和场上\n同伴的HP" + }, + "obstruct": { + "name": "拦堵", + "effect": "完全抵挡对手的攻击。\n连续使出则容易失败。一旦触碰,\n防御就会大幅降低" + }, + "falseSurrender": { + "name": "假跪真撞", + "effect": "装作低头认错的样子,\n用凌乱的头发进行突刺。攻击必定会命中" + }, + "meteorAssault": { + "name": "流星突击", + "effect": "大力挥舞粗壮的茎进行攻击。\n但同时自己也会被晃晕,下一回合自己\n将无法动弹" + }, + "eternabeam": { + "name": "无极光束", + "effect": "无极汰那变回原来的样子后,\n发动的最强攻击。\n下一回合自己将无法动弹" + }, + "steelBeam": { + "name": "铁蹄光线", + "effect": "将从全身聚集的钢铁化为光束,\n激烈地发射出去。自己也会受到伤害" + }, + "expandingForce": { + "name": "广域战力", + "effect": "利用精神力量攻击对手。\n在精神场地上威力会有所提高,\n能对所有对手造成伤害" + }, + "steelRoller": { + "name": "铁滚轮", + "effect": "在破坏场地的同时攻击对手。\n如果脚下没有任何场地状态存在,\n使出此招式时便会失败" + }, + "scaleShot": { + "name": "鳞射", + "effect": "发射鳞片进行攻击。连续攻击2~5次。\n速度会提高但防御会降低" + }, + "meteorBeam": { + "name": "流星光束", + "effect": "第1回合聚集宇宙之力提高特攻,\n第2回合攻击对手" + }, + "shellSideArm": { + "name": "臂贝武器", + "effect": "从物理攻击和特殊攻击中选择可造\n成较多伤害的方式进行攻击。\n有时会让对手陷入中毒状态" + }, + "mistyExplosion": { + "name": "薄雾炸裂", + "effect": "对自己周围的所有宝可梦进行攻击,\n但使出后,自己会陷入昏厥。\n在薄雾场地上,招式威力会提高" + }, + "grassyGlide": { + "name": "青草滑梯", + "effect": "仿佛在地面上滑行般地攻击对手。\n在青草场地上,必定能够先制攻击" + }, + "risingVoltage": { + "name": "电力上升", + "effect": "用从地面升腾而起的电击进行攻击。\n当对手处于电气场地上时,\n招式威力会变成2倍" + }, + "terrainPulse": { + "name": "大地波动", + "effect": "借助场地的力量进行攻击。\n视使出招式时场地状态不同,\n招式的属性和威力会有所变化" + }, + "skitterSmack": { + "name": "爬击", + "effect": "从对手背后爬近后进行攻击。\n会降低对手的特攻" + }, + "burningJealousy": { + "name": "妒火", + "effect": "用嫉妒的能量攻击对手。\n会让在该回合内能力有所提高\n的宝可梦陷入灼伤状态" + }, + "lashOut": { + "name": "泄愤", + "effect": "攻击对手以发泄对其感到的恼怒情绪。\n如果在该回合内自身能力遭到降低,\n招式的威力会变成2倍" + }, + "poltergeist": { + "name": "灵骚", + "effect": "操纵对手的持有物进行攻击。\n当对手没有携带道具时,使出此招式时\n便会失败" + }, + "corrosiveGas": { + "name": "腐蚀气体", + "effect": "用具有强酸性的气体包裹住自己周\n围所有的宝可梦,并融化其所携带的道具" + }, + "coaching": { + "name": "指导", + "effect": "通过进行正确合理的指导,\n提高我方全员的攻击和防御" + }, + "flipTurn": { + "name": "快速折返", + "effect": "在攻击之后急速返回,\n和后备宝可梦进行替换" + }, + "tripleAxel": { + "name": "三旋击", + "effect": "连续3次踢对手进行攻击。\n每踢中一次,威力就会提高" + }, + "dualWingbeat": { + "name": "双翼", + "effect": "将翅膀撞向对手进行攻击。\n连续2次给予伤害" + }, + "scorchingSands": { + "name": "热沙大地", + "effect": "将滚烫的沙子砸向对手进行攻击。\n有时会让对手陷入灼伤状态" + }, + "jungleHealing": { + "name": "丛林治疗", + "effect": "与丛林融为一体,回复自己和场上\n同伴的HP和状态" + }, + "wickedBlow": { + "name": "暗冥强击", + "effect": "将恶之流派修炼至大成的猛烈一击。\n必定会击中要害" + }, + "surgingStrikes": { + "name": "水流连打", + "effect": "将水之流派修炼至大成的仿若行云\n流水般的3次连击。必定会击中要害" + }, + "thunderCage": { + "name": "雷电囚笼", + "effect": "将对手困在电流四溅的囚笼中,\n在4~5回合内进行攻击" + }, + "dragonEnergy": { + "name": "巨龙威能", + "effect": "把生命力转换为力量攻击对手。\n自己的HP越少,招式的威力越小" + }, + "freezingGlare": { + "name": "冰冷视线", + "effect": "从双眼发射精神力量进行攻击。\n有时会让对手陷入冰冻状态" + }, + "fieryWrath": { + "name": "怒火中烧", + "effect": "将愤怒转化为火焰般的气场进行攻击。\n有时会使对手畏缩" + }, + "thunderousKick": { + "name": "雷鸣蹴击", + "effect": "以雷电般的动作\n戏耍对手的同时使出脚踢。\n可降低对手的防御" + }, + "glacialLance": { + "name": "雪矛", + "effect": "向对手投掷掀起暴风雪的冰矛进行攻击" + }, + "astralBarrage": { + "name": "星碎", + "effect": "用大量的小灵体向对手发起攻击" + }, + "eerieSpell": { + "name": "诡异咒语", + "effect": "用强大的精神力量攻击。\n让对手最后使用的招式减少3PP" + }, + "direClaw": { + "name": "克命爪", + "effect": "以破灭之爪进行攻击。\n有时还会让对手陷入中毒、麻痹、\n睡眠之中的一种状态" + }, + "psyshieldBash": { + "name": "屏障猛攻", + "effect": "让意念的能量覆盖全身,\n撞向对手进行攻击。会提高自己的防御" + }, + "powerShift": { + "name": "力量转换", + "effect": "将自己的攻击与防御互相交换" + }, + "stoneAxe": { + "name": "岩斧", + "effect": "用岩石之斧进行攻击。\n散落的岩石碎片会飘浮在对手周围" + }, + "springtideStorm": { + "name": "阳春风暴", + "effect": "用交织着爱与恨的烈风席卷对手\n进行攻击。有时会降低对手的攻击" + }, + "mysticalPower": { + "name": "神秘之力", + "effect": "放出不可思议的力量攻击。\n会提高自己的特攻" + }, + "ragingFury": { + "name": "大愤慨", + "effect": "在2~3回合内,一边放出火焰,\n一边疯狂乱打。大闹一番后自己会\n陷入混乱" + }, + "waveCrash": { + "name": "波动冲", + "effect": "让水覆盖全身后撞向对手。\n自己也会受到不少伤害" + }, + "chloroblast": { + "name": "叶绿爆震", + "effect": "将自己的叶绿素凝聚起来后放出去\n进行攻击。自己也会受到伤害" + }, + "mountainGale": { + "name": "冰山风", + "effect": "将冰山般巨大的冰块砸向对手进行攻击。\n有时会使对手畏缩" + }, + "victoryDance": { + "name": "胜利之舞", + "effect": "激烈地跳起唤来胜利的舞蹈,\n提高自己的攻击、防御和速度" + }, + "headlongRush": { + "name": "突飞猛扑", + "effect": "向对手使出灌注了全心全力的撞击。\n自己的防御和特防会降低" + }, + "barbBarrage": { + "name": "毒千针", + "effect": "用无数的毒针进行攻击。\n有时还会让对手陷入中毒状态。\n攻击处于中毒状态的对手时,\n威力会变成2倍" + }, + "esperWing": { + "name": "气场之翼", + "effect": "用经过气场强化的翅膀撕裂对手。\n容易击中要害。会提高自己的速度" + }, + "bitterMalice": { + "name": "冤冤相报", + "effect": "用令人毛骨悚然的怨念进行攻击。\n会降低对手的攻击" + }, + "shelter": { + "name": "闭关", + "effect": "将皮肤变得坚硬如铁盾,\n从而大幅提高自己的防御" + }, + "tripleArrows": { + "name": "三连箭", + "effect": "使出一记腿技后同时发射3箭。\n有时会降低对手的防御或使对手畏缩。\n容易击中要害" + }, + "infernalParade": { + "name": "群魔乱舞", + "effect": "用无数的火球进行攻击。有时会让对手陷\n入灼伤状态。攻击处于异常状态\n的对手时,威力会变成2倍" + }, + "ceaselessEdge": { + "name": "秘剑・千重涛", + "effect": "用贝壳之剑进行攻击。\n散落的贝壳碎片会散落\n在对手脚下成为撒菱" + }, + "bleakwindStorm": { + "name": "枯叶风暴", + "effect": "用足以让身心都止不住颤抖的冰冷\n狂风进行攻击。有时会降低对手的速度" + }, + "wildboltStorm": { + "name": "鸣雷风暴", + "effect": "呼唤雷云引起风暴,用雷与风进行\n激烈的攻击。有时会让对手陷入麻痹状态" + }, + "sandsearStorm": { + "name": "热沙风暴", + "effect": "用灼热的沙子和强烈的风席卷对手\n进行攻击。有时会让对手陷入灼伤状态" + }, + "lunarBlessing": { + "name": "新月祈祷", + "effect": "向新月献上祈祷,回复自己和场上\n同伴的HP和状态" + }, + "takeHeart": { + "name": "勇气填充", + "effect": "鼓起冲劲,治愈自己的异常状态,\n同时提高自己的特攻和特防" + }, + "gMaxWildfire": { + "name": "超极巨深渊灭焰", + "effect": "超极巨化的喷火龙使出的火属性攻击。\n可在4回合内给予对手伤害" + }, + "gMaxBefuddle": { + "name": "超极巨蝶影蛊惑", + "effect": "超极巨化的巴大蝶使出的虫属性攻击。\n会让对手陷入中毒、麻痹或睡眠状态" + }, + "gMaxVoltCrash": { + "name": "超极巨万雷轰顶", + "effect": "超极巨化的皮卡丘使出的电属性攻击。\n会让对手陷入麻痹状态" + }, + "gMaxGoldRush": { + "name": "超极巨特大金币", + "effect": "超极巨化的喵喵使出的一般属性攻击。\n会让对手陷入混乱状态,\n并可获得金钱" + }, + "gMaxChiStrike": { + "name": "超极巨会心一击", + "effect": "超极巨化的怪力使出的格斗属性攻击。\n会变得容易击中要害" + }, + "gMaxTerror": { + "name": "超极巨幻影幽魂", + "effect": "超极巨化的耿鬼使出的幽灵属性攻击。\n会踩住对手的影子,\n让其无法被替换" + }, + "gMaxResonance": { + "name": "超极巨极光旋律", + "effect": "超极巨化的拉普拉斯使出的冰属性攻击。\n可在5回合内减弱受到的伤害" + }, + "gMaxCuddle": { + "name": "超极巨热情拥抱", + "effect": "超极巨化的伊布使出的一般属性攻击。\n会让对手陷入着迷状态" + }, + "gMaxReplenish": { + "name": "超极巨资源再生", + "effect": "超极巨化的卡比兽使出的一般属性攻击。\n会让吃掉的树果再生" + }, + "gMaxMalodor": { + "name": "超极巨臭气冲天", + "effect": "超极巨化的灰尘山使出的毒属性攻击。\n会让对手陷入中毒状态" + }, + "gMaxStonesurge": { + "name": "超极巨岩阵以待", + "effect": "超极巨化的暴噬龟使出的水属性攻击。\n会发射无数锐利的岩石" + }, + "gMaxWindRage": { + "name": "超极巨旋风袭卷", + "effect": "超极巨化的钢铠鸦使出的飞行属性攻击。\n可消除反射壁和光墙" + }, + "gMaxStunShock": { + "name": "超极巨异毒电场", + "effect": "超极巨化的颤弦蝾螈使出的电属性攻击。\n会让对手陷入中毒或麻痹状态" + }, + "gMaxFinale": { + "name": "超极巨幸福圆满", + "effect": "超极巨化的霜奶仙使出的妖精属性攻击。\n可回复我方的HP" + }, + "gMaxDepletion": { + "name": "超极巨劣化衰变", + "effect": "超极巨化的铝钢龙使出的龙属性攻击。\n可减少对手最后使用的招式的PP" + }, + "gMaxGravitas": { + "name": "超极巨天道七星", + "effect": "超极巨化的以欧路普使出的超能力\n属性攻击。在5回合内重力会产生变化" + }, + "gMaxVolcalith": { + "name": "超极巨炎石喷发", + "effect": "超极巨化的巨炭山使出的岩石属性攻击。\n可在4回合内给予对手伤害" + }, + "gMaxSandblast": { + "name": "超极巨沙尘漫天", + "effect": "超极巨化的沙螺蟒使出的地面属性攻击。\n在4~5回合内会狂刮沙暴" + }, + "gMaxSnooze": { + "name": "超极巨睡魔降临", + "effect": "超极巨化的长毛巨魔使出的恶属性攻击。\n会通过打大哈欠让对手产生睡意" + }, + "gMaxTartness": { + "name": "超极巨酸不溜丢", + "effect": "超极巨化的苹裹龙使出的草属性攻击。\n会降低对手的闪避率" + }, + "gMaxSweetness": { + "name": "超极巨琼浆玉液", + "effect": "超极巨化的丰蜜龙使出的草属性攻击。\n会治愈我方的异常状态" + }, + "gMaxSmite": { + "name": "超极巨天谴雷诛", + "effect": "超极巨化的布莉姆温使出的\n妖精属性攻击。\n会让对手陷入混乱状态" + }, + "gMaxSteelsurge": { + "name": "超极巨钢铁阵法", + "effect": "超极巨化的大王铜象使出的钢属性攻击。\n会发射无数锐利的刺" + }, + "gMaxMeltdown": { + "name": "超极巨液金熔击", + "effect": "超极巨化的美录梅塔使出的钢属性攻击。\n会让对手无法连续使出相同的招式" + }, + "gMaxFoamBurst": { + "name": "超极巨激漩泡涡", + "effect": "超极巨化的巨钳蟹使出的水属性攻击。\n会大幅降低对手的速度" + }, + "gMaxCentiferno": { + "name": "超极巨百火焚野", + "effect": "超极巨化的焚焰蚣使出的火属性攻击。\n可在4~5回合内将对手困在火焰中" + }, + "gMaxVineLash": { + "name": "超极巨灰飞鞭灭", + "effect": "超极巨化的妙蛙花使出的草属性攻击。\n可在4回合内给予对手伤害" + }, + "gMaxCannonade": { + "name": "超极巨水炮轰灭", + "effect": "超极巨化的水箭龟使出的水属性攻击。\n可在4回合内给予对手伤害" + }, + "gMaxDrumSolo": { + "name": "超极巨狂擂乱打", + "effect": "超极巨化的轰擂金刚猩使出的\n草属性攻击。\n不会受到对手特性的干扰" + }, + "gMaxFireball": { + "name": "超极巨破阵火球", + "effect": "超极巨化的闪焰王牌使出的火属性攻击。\n不会受到对手特性的干扰" + }, + "gMaxHydrosnipe": { + "name": "超极巨狙击神射", + "effect": "超极巨化的千面避役使出的水属性攻击。\n不会受到对手特性的干扰" + }, + "gMaxOneBlow": { + "name": "超极巨夺命一击", + "effect": "超极巨化的武道熊师使出的恶属性攻击。\n是可以无视极巨防壁的一击" + }, + "gMaxRapidFlow": { + "name": "超极巨流水连击", + "effect": "超极巨化的武道熊师使出的水属性攻击。\n是可以无视极巨防壁的连击" + }, + "teraBlast": { + "name": "太晶爆发", + "effect": "太晶化时,会放出太晶属性的能量攻击。\n比较自己的攻击和特攻,\n用数值相对较高的一项给予对方伤害。\n(其他属性)/用攻击和特攻数\n值较高的一项给予伤害。\n对正处于太晶化的对手效果绝佳。\n自己的攻击和特攻会降低。(星晶" + }, + "silkTrap": { + "name": "线阱", + "effect": "用丝设置陷阱。防住对方攻击的同时,\n能够降低所接触到的对手的速度" + }, + "axeKick": { + "name": "下压踢", + "effect": "将踢起的脚跟往下劈向对手进行攻击。\n有时会使对手混乱。\n如果劈偏则自己会受到伤害" + }, + "lastRespects": { + "name": "扫墓", + "effect": "为了化解伙伴的悔恨而进行攻击。\n被打倒的我方宝可梦越多,\n招式的威力越高" + }, + "luminaCrash": { + "name": "琉光冲激", + "effect": "放出连精神都能影响到的奇妙怪光\n进行攻击。会大幅降低对方的特防" + }, + "orderUp": { + "name": "上菜", + "effect": "以潇洒的身手进行攻击。\n若口中有米立龙,会按其样子提高能力" + }, + "jetPunch": { + "name": "喷射拳", + "effect": "将激流覆盖于拳头,以肉眼无法辨\n识的速度打出拳击。必定能够先制攻击" + }, + "spicyExtract": { + "name": "辣椒精华", + "effect": "放出极为辛辣的精华。\n对手的攻击会大幅提高,防御会大幅降低" + }, + "spinOut": { + "name": "疾速转轮", + "effect": "通过往腿上增加负荷,\n以激烈的旋转给予对手伤害。\n自己的速度会大幅降低" + }, + "populationBomb": { + "name": "鼠数儿", + "effect": "伙伴们会纷纷赶来集合,\n以群体行动给予对手攻击。\n连续命中1~10次" + }, + "iceSpinner": { + "name": "冰旋", + "effect": "脚上覆盖薄冰,旋转着撞击对手。\n通过旋转的动作破坏场地" + }, + "glaiveRush": { + "name": "巨剑突击", + "effect": "有勇无谋的舍身突击。使出招式后,\n对手的攻击必定会命中,\n且伤害会变成2倍" + }, + "revivalBlessing": { + "name": "复生祈祷", + "effect": "通过以慈爱之心祈祷,\n让陷入昏厥的后备宝可梦\n以回复一半HP的状态复活" + }, + "saltCure": { + "name": "盐腌", + "effect": "使对手陷入盐腌状态,\n每回合给予对手伤害。\n对手为钢或水属性时会更痛苦" + }, + "tripleDive": { + "name": "三连钻", + "effect": "以默契的跳跃溅起水花击向对手。\n连续3次给予伤害" + }, + "mortalSpin": { + "name": "晶光转转", + "effect": "通过旋转来攻击对手。\n可以摆脱绑紧、紧束、寄生种子等招式。\n还能让对手陷入中毒状态" + }, + "doodle": { + "name": "描绘", + "effect": "把握并映射出对手的本质,\n让自己和同伴宝可梦的特性\n变得和对手相同" + }, + "filletAway": { + "name": "甩肉", + "effect": "削减自己的HP,大幅提高攻击和\n特攻以及速度" + }, + "kowtowCleave": { + "name": "仆刀", + "effect": "下跪让对手大意后发起袭击劈向对手。\n攻击必定会命中" + }, + "flowerTrick": { + "name": "千变万花", + "effect": "将做了手脚的花束扔向对手进行攻击。\n必定会命中,且会击中要害" + }, + "torchSong": { + "name": "闪焰高歌", + "effect": "如唱歌一样喷出熊熊燃烧的火焰\n烧焦对手。会提高自己的特攻" + }, + "aquaStep": { + "name": "流水旋舞", + "effect": "以盈盈欲滴的轻快步伐戏耍对手并\n给予其伤害。会提高自己的速度" + }, + "ragingBull": { + "name": "怒牛", + "effect": "狂怒暴牛的猛烈冲撞。\n招式的属性随形态改变,\n光墙和反射壁等招式也能破坏" + }, + "makeItRain": { + "name": "淘金潮", + "effect": "扔出大量硬币攻击。自己的特攻会降低,\n战斗后还可以拿到钱" + }, + "psyblade": { + "name": "精神剑", + "effect": "用无形的利刃劈开对手。\n处于电气场地时,\n招式威力会变成1.5倍" + }, + "hydroSteam": { + "name": "水蒸气", + "effect": "将煮得翻滚的开水猛烈地喷向对手。\n日照强烈时,招式威力不但不会降低,\n还会变成1.5倍" + }, + "ruination": { + "name": "大灾难", + "effect": "引发毁灭性的灾厄,使对手的HP减半" + }, + "collisionCourse": { + "name": "全开猛撞", + "effect": "边变形边凶暴地落下,\n并引发起古老的大爆炸。若针对到弱点,\n威力会进一步" + }, + "electroDrift": { + "name": "闪电猛冲", + "effect": "边变形边高速奔走,并以未知的电\n击贯穿对手。若针对到弱点,\n威力会进一步" + }, + "shedTail": { + "name": "断尾", + "effect": "削减自己的HP,制造分身后会返回,\n并和后备宝可梦进行替换" + }, + "chillyReception": { + "name": "冷笑话", + "effect": "留下冷场的冷笑话后,\n和后备宝可梦进行替换。\n在5回合内会下雪" + }, + "tidyUp": { + "name": "大扫除", + "effect": "将撒菱、隐形岩、黏黏网、毒菱、\n替身全部扫除掉。自己的攻击和速\n度会提高" + }, + "snowscape": { + "name": "雪景", + "effect": "在5回合内会下雪。冰属性的防御会提高" + }, + "pounce": { + "name": "虫扑", + "effect": "飞扑向对手攻击。会降低对手的速度" + }, + "trailblaze": { + "name": "起草", + "effect": "跳出草丛进行攻击。通过轻快的步\n伐会提高自己的速度" + }, + "chillingWater": { + "name": "泼冷水", + "effect": "泼洒冰冷得足以让对手失去活力的\n水进行攻击。会降低对手的攻击" + }, + "hyperDrill": { + "name": "强力钻", + "effect": "急速旋转尖锐的身体部位贯穿对手。\n可以无视守住和看穿等招式" + }, + "twinBeam": { + "name": "双光束", + "effect": "从两眼发射出神奇的光线攻击。\n连续2次给予伤害" + }, + "rageFist": { + "name": "愤怒之拳", + "effect": "将愤怒化为力量攻击。\n受到攻击的次数越多,招式的威力越高" + }, + "armorCannon": { + "name": "铠农炮", + "effect": "熊熊燃烧自己的铠甲,\n将其做成炮弹射出攻击。\n自己的防御和特防会降低" + }, + "bitterBlade": { + "name": "悔念剑", + "effect": "将对世间的留恋聚集于剑尖,\n并斩击对手。可以回复给予对手伤害的\n一半HP" + }, + "doubleShock": { + "name": "电光双击", + "effect": "将全身所有的电力放出,\n给予对手大大的伤害。\n自己的电属性将会消失" + }, + "gigatonHammer": { + "name": "巨力锤", + "effect": "连同身体转起巨大的锤子进行攻击。\n这个招式无法连续使出2次" + }, + "comeuppance": { + "name": "复仇", + "effect": "使出招式前,将最后受到的招式的\n伤害大力返还给对手" + }, + "aquaCutter": { + "name": "水波刀", + "effect": "如刀刃般喷射出加压的水切开对手。\n容易击中要害" + }, + "blazingTorque": { + "name": "灼热暴冲", + "effect": "攻击目标造成伤害,有30%的几\n率使目标陷入灼伤状态。" + }, + "wickedTorque": { + "name": "黑暗暴冲", + "effect": "攻击目标造成伤害,有30%的几\n率使目标陷入睡眠状态。" + }, + "noxiousTorque": { + "name": "剧毒暴冲", + "effect": "攻击目标造成伤害,有30%的几\n率使目标陷入中毒状态。" + }, + "combatTorque": { + "name": "格斗暴冲", + "effect": "攻击目标造成伤害,有30%的几\n率使目标陷入麻痹状态。\n此招式可以命中幽灵属性的宝可梦。" + }, + "magicalTorque": { + "name": "魔法暴冲", + "effect": "攻击目标造成伤害,有30%的几\n率使目标陷入混乱状态。" + }, + "bloodMoon": { + "name": "血月", + "effect": "从赤红如血的满月发射出全部的气势。\n这个招式无法连续使出2次" + }, + "matchaGotcha": { + "name": "刷刷茶炮", + "effect": "发射经搅拌的茶的大炮,\n可以回复给予对手伤害的一半HP,\n有时会让对手陷入灼伤状态" + }, + "syrupBomb": { + "name": "糖浆炸弹", + "effect": "使粘稠的麦芽糖浆爆炸,\n让对手陷入满身糖状态,\n在3回合内持续降\n低其速度" + }, + "ivyCudgel": { + "name": "棘藤棒", + "effect": "用缠有藤蔓的棍棒殴打。\n属性会随所戴的面具而改变。\n容易击中要害" + }, + "electroShot": { + "name": "电光束", + "effect": "第1回合收集电力提高特攻,\n第2回合将高压的电力发射出去。\n下雨天气时能立刻发射" + }, + "teraStarstorm": { + "name": "晶光星群", + "effect": "照射出结晶的力量来驱逐敌人。\n太乐巴戈斯在星晶形态下使出时,\n能对所有对手造成伤害" + }, + "fickleBeam": { + "name": "随机光", + "effect": "发射光线进行攻击。有时其他的头\n也会合力发射镭射,让招式威力变成2倍" + }, + "burningBulwark": { + "name": "火焰守护", + "effect": "用超高温的体毛防住对手攻击的同时,\n让接触到自己的对手灼伤" + }, + "thunderclap": { + "name": "迅雷", + "effect": "可以比对手先使出电击进行攻击。\n对手使出的招式如果不是攻击招式\n则会失败" + }, + "mightyCleave": { + "name": "强刃攻击", + "effect": "用积蓄在头部的光来斩切对手。\n可以无视守护进行攻击" + }, + "tachyonCutter": { + "name": "迅子利刃", + "effect": "接连发射出粒子的利刃,\n连续2次给予伤害。攻击必定会命中" + }, + "hardPress": { + "name": "硬压", + "effect": "用手臂或钳子压迫对手。\n对手剩余的HP越多,威力越大" + }, + "dragonCheer": { + "name": "龙声鼓舞", + "effect": "以龙之鼓舞提高士气,\n让我方的招式变得容易击中要害。\n对龙属性的鼓舞效果会更强" + }, + "alluringVoice": { + "name": "魅诱之声", + "effect": "用天使般的歌声攻击对手。\n会让此回合内能力有提高的\n宝可梦陷入混乱状态" + }, + "temperFlare": { + "name": "豁出去", + "effect": "以自暴自弃的气势进行攻击。\n如果上一回合招式没有命中,\n威力就会翻倍" + }, + "supercellSlam": { + "name": "闪电强袭", + "effect": "让身体带电后压向对手。\n如果没有命中则自己会受到伤害" + }, + "psychicNoise": { + "name": "精神噪音", + "effect": "用令对手不舒服的音波进行攻击。\n让对手在2回合内无法通过招式、\n特性或携带的道具回复HP" + }, + "upperHand": { + "name": "快手还击", + "effect": "察觉到对手的动作后用掌根攻击,\n让对手畏缩。如果对手使出的招式\n不是先制攻击,则会失败" + }, + "malignantChain": { + "name": "邪毒锁链", + "effect": "用由毒形成的锁链缠住对手注入毒\n素加以侵蚀。有时会让对手陷入剧毒状态" + } +} diff --git a/src/locales/zh_CN/move.ts b/src/locales/zh_CN/move.ts deleted file mode 100644 index a444a59a3ff..00000000000 --- a/src/locales/zh_CN/move.ts +++ /dev/null @@ -1,3812 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -export const move: MoveTranslationEntries = { - "pound": { - name: "拍击", - effect: "使用长长的尾巴或手等拍打对手进行攻击", - }, - "karateChop": { - name: "空手劈", - effect: "用锋利的手刀劈向对手进行攻击。\n容易击中要害", - }, - "doubleSlap": { - name: "连环巴掌", - effect: "用连环巴掌拍打对手进行攻击。\n连续攻击2~5次", - }, - "cometPunch": { - name: "连续拳", - effect: "用拳头怒涛般的殴打对手进行攻击。\n连续攻击2~5次", - }, - "megaPunch": { - name: "百万吨重拳", - effect: "用充满力量的拳头攻击对手", - }, - "payDay": { - name: "聚宝功", - effect: "向对手的身体投掷小金币进行攻击。\n战斗后可以拿到钱", - }, - "firePunch": { - name: "火焰拳", - effect: "用充满火焰的拳头攻击对手。\n有时会让对手陷入灼伤状态", - }, - "icePunch": { - name: "冰冻拳", - effect: "用充满寒气的拳头攻击对手。\n有时会让对手陷入冰冻状态", - }, - "thunderPunch": { - name: "雷电拳", - effect: "用充满电流的拳头攻击对手。\n有时会让对手陷入麻痹状态", - }, - "scratch": { - name: "抓", - effect: "用坚硬且无比锋利的爪子抓对手进行攻击", - }, - "viseGrip": { - name: "夹住", - effect: "将对手从两侧夹住,给予伤害", - }, - "guillotine": { - name: "极落钳", - effect: "用大钳子或剪刀等夹断对手进行攻击。\n只要命中就会一击昏厥", - }, - "razorWind": { - name: "旋风刀", - effect: "制造风之刃,于第2回合攻击对手。\n容易击中要害", - }, - "swordsDance": { - name: "剑舞", - effect: "激烈地跳起战舞提高气势。\n大幅提高自己的攻击", - }, - "cut": { - name: "居合劈", - effect: "用镰刀或爪子等切斩对手进行攻击", - }, - "gust": { - name: "起风", - effect: "用翅膀将刮起的狂风袭向对手进行攻击", - }, - "wingAttack": { - name: "翅膀攻击", - effect: "大大地展开美丽的翅膀,\n将其撞向对手进行攻击", - }, - "whirlwind": { - name: "吹飞", - effect: "吹飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束", - }, - "fly": { - name: "飞翔", - effect: "第1回合飞上天空,第2回合攻击对手", - }, - "bind": { - name: "绑紧", - effect: "使用长长的身体或藤蔓等,\n在4~5回合内绑紧对手进行攻击", - }, - "slam": { - name: "摔打", - effect: "使用长长的尾巴或藤蔓等摔打对手\n进行攻击", - }, - "vineWhip": { - name: "藤鞭", - effect: "用如同鞭子般弯曲而细长的藤蔓摔\n打对手进行攻击", - }, - "stomp": { - name: "踩踏", - effect: "用大脚踩踏对手进行攻击。\n有时会使对手畏缩", - }, - "doubleKick": { - name: "二连踢", - effect: "用2只脚踢飞对手进行攻击。\n连续2次给予伤害", - }, - "megaKick": { - name: "百万吨重踢", - effect: "使出力大无穷的重踢踢飞对手进行攻击", - }, - "jumpKick": { - name: "飞踢", - effect: "使出高高的腾空踢攻击对手。\n如果踢偏则自己会受到伤害", - }, - "rollingKick": { - name: "回旋踢", - effect: "一边使身体快速旋转,\n一边踢飞对手进行攻击。有时会使对手畏缩", - }, - "sandAttack": { - name: "泼沙", - effect: "向对手脸上泼沙子,从而降低命中率", - }, - "headbutt": { - name: "头锤", - effect: "将头伸出,笔直地扑向对手进行攻击。\n有时会使对手畏缩", - }, - "hornAttack": { - name: "角撞", - effect: "用尖锐的角攻击对手", - }, - "furyAttack": { - name: "乱击", - effect: "用角或喙刺向对手进行攻击。\n连续攻击2~5次", - }, - "hornDrill": { - name: "角钻", - effect: "用旋转的角刺入对手进行攻击。\n只要命中就会一击昏厥", - }, - "tackle": { - name: "撞击", - effect: "用整个身体撞向对手进行攻击", - }, - "bodySlam": { - name: "泰山压顶", - effect: "用整个身体压住对手进行攻击。\n有时会让对手陷入麻痹状态", - }, - "wrap": { - name: "紧束", - effect: "使用长长的身体或藤蔓等,\n在4~5回合内紧束对手进行攻击", - }, - "takeDown": { - name: "猛撞", - effect: "以惊人的气势撞向对手进行攻击。\n自己也会受到少许伤害", - }, - "thrash": { - name: "大闹一番", - effect: "在2~3回合内,乱打一气地攻击对手。\n大闹一番后自己会陷入混乱", - }, - "doubleEdge": { - name: "舍身冲撞", - effect: "拼命地猛撞向对手进行攻击。\n自己也会受到不小的伤害", - }, - "tailWhip": { - name: "摇尾巴", - effect: "可爱地左右摇晃尾巴,\n诱使对手疏忽大意。会降低对手的防御", - }, - "poisonSting": { - name: "毒针", - effect: "将有毒的针刺入对手进行攻击。\n有时会让对手陷入中毒状态", - }, - "twineedle": { - name: "双针", - effect: "将2根针刺入对手,连续2次给予伤害。\n有时会让对手陷入中毒状态", - }, - "pinMissile": { - name: "飞弹针", - effect: "向对手发射锐针进行攻击。\n连续攻击2~5次", - }, - "leer": { - name: "瞪眼", - effect: "用犀利的眼神使其害怕,\n从而降低对手的防御", - }, - "bite": { - name: "咬住", - effect: "用尖锐的牙咬住对手进行攻击。\n有时会使对手畏缩", - }, - "growl": { - name: "叫声", - effect: "让对手听可爱的叫声,\n引开注意力使其疏忽,从而降低对手的攻击", - }, - "roar": { - name: "吼叫", - effect: "放走对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束", - }, - "sing": { - name: "唱歌", - effect: "让对手听舒适、美妙的歌声,\n从而陷入睡眠状态", - }, - "supersonic": { - name: "超音波", - effect: "从身体发出特殊的音波,\n从而使对手混乱", - }, - "sonicBoom": { - name: "音爆", - effect: "将冲击波撞向对手进行攻击。\n必定会给予20的伤害", - }, - "disable": { - name: "定身法", - effect: "阻碍对手行动,之前使出的招式将\n在4回合内无法使用", - }, - "acid": { - name: "溶解液", - effect: "将强酸泼向对手进行攻击。\n有时会降低对手的特防", - }, - "ember": { - name: "火花", - effect: "向对手发射小型火焰进行攻击。\n有时会让对手陷入灼伤状态", - }, - "flamethrower": { - name: "喷射火焰", - effect: "向对手发射烈焰进行攻击。\n有时会让对手陷入灼伤状态", - }, - "mist": { - name: "白雾", - effect: "用白雾覆盖身体。在5回合内不会\n让对手降低自己的能力", - }, - "waterGun": { - name: "水枪", - effect: "向对手猛烈地喷射水流进行攻击", - }, - "hydroPump": { - name: "水炮", - effect: "向对手猛烈地喷射大量水流进行攻击", - }, - "surf": { - name: "冲浪", - effect: "利用大浪攻击自己周围所有的宝可梦", - }, - "iceBeam": { - name: "冰冻光束", - effect: "向对手发射冰冻光束进行攻击。\n有时会让对手陷入冰冻状态", - }, - "blizzard": { - name: "暴风雪", - effect: "将猛烈的暴风雪刮向对手进行攻击。\n有时会让对手陷入冰冻状态", - }, - "psybeam": { - name: "幻象光线", - effect: "向对手发射神奇的光线进行攻击。\n有时会使对手混乱", - }, - "bubbleBeam": { - name: "泡沫光线", - effect: "向对手猛烈地喷射泡沫进行攻击。\n有时会降低对手的速度", - }, - "auroraBeam": { - name: "极光束", - effect: "向对手发射虹色光束进行攻击。\n有时会降低对手的攻击", - }, - "hyperBeam": { - name: "破坏光线", - effect: "向对手发射强烈的光线进行攻击。\n下一回合自己将无法动弹", - }, - "peck": { - name: "啄", - effect: "用尖锐的喙或角刺向对手进行攻击", - }, - "drillPeck": { - name: "啄钻", - effect: "一边旋转,一边将尖喙刺入对手进行攻击", - }, - "submission": { - name: "深渊翻滚", - effect: "将对手连同自己一起摔向地面进行攻击。\n自己也会受到少许伤害", - }, - "lowKick": { - name: "踢倒", - effect: "用力踢对手的脚,使其摔倒进行攻击。\n对手越重,威力越大", - }, - "counter": { - name: "双倍奉还", - effect: "从对手那里受到物理攻击的伤害将\n以2倍返还给同一个对手", - }, - "seismicToss": { - name: "地球上投", - effect: "利用引力将对手甩飞出去。\n给予对手和自己等级相同的伤害", - }, - "strength": { - name: "怪力", - effect: "使出浑身力气殴打对手进行攻击", - }, - "absorb": { - name: "吸取", - effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP", - }, - "megaDrain": { - name: "超级吸取", - effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP", - }, - "leechSeed": { - name: "寄生种子", - effect: "植入寄生种子后,将在每回合一点\n一点吸取对手的HP,\n从而用来回复自己的HP", - }, - "growth": { - name: "生长", - effect: "让身体一下子长大,从而提高攻击和特攻", - }, - "razorLeaf": { - name: "飞叶快刀", - effect: "飞出叶片,切斩对手进行攻击。\n容易击中要害", - }, - "solarBeam": { - name: "日光束", - effect: "第1回合收集满满的日光,\n第2回合发射光束进行攻击", - }, - "poisonPowder": { - name: "毒粉", - effect: "撒出毒粉,从而让对手陷入中毒状态", - }, - "stunSpore": { - name: "麻痹粉", - effect: "撒出麻痹粉,从而让对手陷入麻痹状态", - }, - "sleepPowder": { - name: "催眠粉", - effect: "撒出催眠粉,从而让对手陷入睡眠状态", - }, - "petalDance": { - name: "花瓣舞", - effect: "在2~3回合内,散落花瓣攻击对手。\n之后自己会陷入混乱", - }, - "stringShot": { - name: "吐丝", - effect: "用口中吐出的丝缠绕对手,\n从而大幅降低对手的速度", - }, - "dragonRage": { - name: "龙之怒", - effect: "将愤怒的冲击波撞向对手进行攻击。\n必定会给予40的伤害", - }, - "fireSpin": { - name: "火焰旋涡", - effect: "将对手困在激烈的火焰旋涡中,\n在4~5回合内进行攻击", - }, - "thunderShock": { - name: "电击", - effect: "发出电流刺激对手进行攻击。\n有时会让对手陷入麻痹状态", - }, - "thunderbolt": { - name: "十万伏特", - effect: "向对手发出强力电击进行攻击。\n有时会让对手陷入麻痹状态", - }, - "thunderWave": { - name: "电磁波", - effect: "向对手发出微弱的电击,\n从而让对手陷入麻痹状态", - }, - "thunder": { - name: "打雷", - effect: "向对手劈下暴雷进行攻击。\n有时会让对手陷入麻痹状态", - }, - "rockThrow": { - name: "落石", - effect: "拿起小岩石,投掷对手进行攻击", - }, - "earthquake": { - name: "地震", - effect: "利用地震的冲击,攻击自己周围所\n有的宝可梦", - }, - "fissure": { - name: "地裂", - effect: "让对手掉落于地裂的裂缝中进行攻击。\n只要命中就会一击昏厥", - }, - "dig": { - name: "挖洞", - effect: "第1回合钻入地底,第2回合攻击对手", - }, - "toxic": { - name: "剧毒", - effect: "让对手陷入剧毒状态。\n随着回合的推进,中毒伤害会增加", - }, - "confusion": { - name: "念力", - effect: "向对手发送微弱的念力进行攻击。\n有时会使对手混乱", - }, - "psychic": { - name: "精神强念", - effect: "向对手发送强大的念力进行攻击。\n有时会降低对手的特防", - }, - "hypnosis": { - name: "催眠术", - effect: "施以诱导睡意的暗示,\n让对手陷入睡眠状态", - }, - "meditate": { - name: "瑜伽姿势", - effect: "唤醒身体深处沉睡的力量,\n从而提高自己的攻击", - }, - "agility": { - name: "高速移动", - effect: "让身体放松变得轻盈,\n以便高速移动。大幅提高自己的速度", - }, - "quickAttack": { - name: "电光一闪", - effect: "以迅雷不及掩耳之势扑向对手。\n必定能够先制攻击", - }, - "rage": { - name: "愤怒", - effect: "如果在使出招式后受到攻击的话,\n会因愤怒的力量而提高攻击", - }, - "teleport": { - name: "瞬间移动", - effect: "当有后备宝可梦时使用,\n就可以进行替换。野生的宝可梦使用则会逃走", - }, - "nightShade": { - name: "黑夜魔影", - effect: "显示恐怖幻影,只给予对手和自己\n等级相同的伤害", - }, - "mimic": { - name: "模仿", - effect: "可以将对手最后使用的招式,\n在战斗内变成自己的招式", - }, - "screech": { - name: "刺耳声", - effect: "发出不由自主想要捂起耳朵的刺耳声,\n从而大幅降低对手的防御", - }, - "doubleTeam": { - name: "影子分身", - effect: "通过快速移动来制造分身,\n扰乱对手,从而提高闪避率", - }, - "recover": { - name: "自我再生", - effect: "让细胞再生,从而回复自己最大H\nP的一半", - }, - "harden": { - name: "变硬", - effect: "全身使劲,让身体变硬,\n从而提高自己的防御", - }, - "minimize": { - name: "变小", - effect: "蜷缩身体显得很小,从而大幅提高\n自己的闪避率", - }, - "smokescreen": { - name: "烟幕", - effect: "向对手喷出烟或墨汁等,\n从而降低对手的命中率", - }, - "confuseRay": { - name: "奇异之光", - effect: "显示奇怪的光,扰乱对手。\n使对手混乱", - }, - "withdraw": { - name: "缩入壳中", - effect: "缩入壳里保护身体,从而提高自己的防御", - }, - "defenseCurl": { - name: "变圆", - effect: "将身体蜷曲变圆,从而提高自己的防御", - }, - "barrier": { - name: "屏障", - effect: "制造坚固的壁障,从而大幅提高自\n己的防御", - }, - "lightScreen": { - name: "光墙", - effect: "利用神奇的墙壁,在5回合内减弱\n从对手那里受到的特殊攻击的伤害", - }, - "haze": { - name: "黑雾", - effect: "升起黑雾,将正在场上战斗的全体\n宝可梦的能力变回原点", - }, - "reflect": { - name: "反射壁", - effect: "利用神奇的墙壁,在5回合内减弱\n从对手那里受到的物理攻击的伤害", - }, - "focusEnergy": { - name: "聚气", - effect: "深深地吸口气,集中精神。\n自己的攻击会变得容易击中要害", - }, - "bide": { - name: "忍耐", - effect: "在2回合内忍受攻击,\n受到的伤害会2倍返还给对手", - }, - "metronome": { - name: "挥指", - effect: "挥动手指刺激自己的大脑,\n从许多的招式中随机使出1个", - }, - "mirrorMove": { - name: "鹦鹉学舌", - effect: "模仿对手使用的招式,\n自己也使用相同招式", - }, - "selfDestruct": { - name: "玉石俱碎", - effect: "引发爆炸,攻击自己周围所有的宝可梦。\n使用后陷入昏厥", - }, - "eggBomb": { - name: "炸蛋", - effect: "向对手用力投掷大大的蛋进行攻击", - }, - "lick": { - name: "舌舔", - effect: "用长长的舌头,舔遍对手进行攻击。\n有时会让对手陷入麻痹状态", - }, - "smog": { - name: "浊雾", - effect: "将肮脏的浓雾吹向对手进行攻击。\n有时会让对手陷入中毒状态", - }, - "sludge": { - name: "污泥攻击", - effect: "用污泥投掷对手进行攻击。\n有时会让对手陷入中毒状态", - }, - "boneClub": { - name: "骨棒", - effect: "用手中的骨头殴打对手进行攻击。\n有时会使对手畏缩", - }, - "fireBlast": { - name: "大字爆炎", - effect: "用大字形状的火焰烧尽对手。\n有时会让对手陷入灼伤状态", - }, - "waterfall": { - name: "攀瀑", - effect: "以惊人的气势扑向对手。\n有时会使对手畏缩", - }, - "clamp": { - name: "贝壳夹击", - effect: "用非常坚固且厚实的贝壳,\n在4~5回合内夹住对手进行攻击", - }, - "swift": { - name: "高速星星", - effect: "发射星形的光攻击对手。\n攻击必定会命中", - }, - "skullBash": { - name: "火箭头锤", - effect: "第1回合把头缩进去,\n从而提高防御。第2回合攻击对手", - }, - "spikeCannon": { - name: "尖刺加农炮", - effect: "向对手发射锐针进行攻击。\n连续攻击2~5次", - }, - "constrict": { - name: "缠绕", - effect: "用触手或青藤等缠绕进行攻击。\n有时会降低对手的速度", - }, - "amnesia": { - name: "瞬间失忆", - effect: "将头脑清空,瞬间忘记某事,\n从而大幅提高自己的特防", - }, - "kinesis": { - name: "折弯汤匙", - effect: "折弯汤匙引开注意,从而降低对手\n的命中率", - }, - "softBoiled": { - name: "生蛋", - effect: "回复自己最大HP的一半", - }, - "highJumpKick": { - name: "飞膝踢", - effect: "跳起后用膝盖撞对手进行攻击。\n如果撞偏则自己会受到伤害", - }, - "glare": { - name: "大蛇瞪眼", - effect: "用腹部的花纹使对手害怕,\n从而让其陷入麻痹状态", - }, - "dreamEater": { - name: "食梦", - effect: "吃掉正在睡觉的对手的梦进行攻击。\n回复对手所受到伤害的一半HP", - }, - "poisonGas": { - name: "毒瓦斯", - effect: "将毒瓦斯吹到对手的脸上,\n从而让对手陷入中毒状态", - }, - "barrage": { - name: "投球", - effect: "向对手投掷圆形物体进行攻击。\n连续攻击2~5次", - }, - "leechLife": { - name: "吸血", - effect: "吸取血液攻击对手。可以回复给予\n对手伤害的一半HP", - }, - "lovelyKiss": { - name: "恶魔之吻", - effect: "用恐怖的脸强吻对手。\n让对手陷入睡眠状态", - }, - "skyAttack": { - name: "神鸟猛击", - effect: "第2回合攻击对手。偶尔使对手畏缩。\n也容易击中要害", - }, - "transform": { - name: "变身", - effect: "变身成对手宝可梦的样子,\n能够使用和对手完全相同的招式", - }, - "bubble": { - name: "泡沫", - effect: "向对手用力吹起无数泡泡进行攻击。\n有时会降低对手的速度", - }, - "dizzyPunch": { - name: "迷昏拳", - effect: "有节奏地出拳攻击对手。\n有时会使对手混乱", - }, - "spore": { - name: "蘑菇孢子", - effect: "沙沙沙地撒满具有催眠效果的孢子,\n从而让对手陷入睡眠状态", - }, - "flash": { - name: "闪光", - effect: "使出光芒,从而降低对手的命中率。\n也可在阴暗的洞窟里照亮四周", - }, - "psywave": { - name: "精神波", - effect: "向对手发射神奇的念波进行攻击。\n每次使用,伤害都会改变", - }, - "splash": { - name: "跃起", - effect: "也不攻击只是一蹦一蹦地跳,\n什么都不会发生…", - }, - "acidArmor": { - name: "溶化", - effect: "通过细胞的变化进行液化,\n从而大幅提高自己的防御", - }, - "crabhammer": { - name: "蟹钳锤", - effect: "用大钳子敲打对手进行攻击。\n容易击中要害", - }, - "explosion": { - name: "大爆炸", - effect: "引发大爆炸,攻击自己周围所有的宝可梦。\n使用后自己会陷入昏厥", - }, - "furySwipes": { - name: "乱抓", - effect: "用爪子或镰刀等抓对手进行攻击。\n连续攻击2~5次", - }, - "bonemerang": { - name: "骨头回力镖", - effect: "用手中的骨头投掷对手,\n来回连续2次给予伤害", - }, - "rest": { - name: "睡觉", - effect: "连续睡上2回合。回复自己的全部\nHP以及治愈所有异常状态", - }, - "rockSlide": { - name: "岩崩", - effect: "将大岩石猛烈地撞向对手进行攻击。\n有时会使对手畏缩", - }, - "hyperFang": { - name: "终结门牙", - effect: "用锋利的门牙牢牢地咬住对手进行攻击。\n有时会使对手畏缩", - }, - "sharpen": { - name: "棱角化", - effect: "增加身体的角,变得棱棱角角,\n从而提高自己的攻击", - }, - "conversion": { - name: "纹理", - effect: "将自己的属性转换成和已学会的招\n式中第一个招式相同的属性", - }, - "triAttack": { - name: "三重攻击", - effect: "用3种光线进行攻击。\n有时会让对手陷入麻痹、灼伤或冰冻的状态", - }, - "superFang": { - name: "愤怒门牙", - effect: "用锋利的门牙猛烈地咬住对手进行攻击。\n对手的HP减半", - }, - "slash": { - name: "劈开", - effect: "用爪子或镰刀等劈开对手进行攻击。\n容易击中要害", - }, - "substitute": { - name: "替身", - effect: "削减少许自己的HP,\n制造分身。分身将成为自己的替身", - }, - "struggle": { - name: "挣扎", - effect: "当自己的PP耗尽时,\n努力挣扎攻击对手。自己也会受到少许伤害", - }, - "sketch": { - name: "写生", - effect: "将对手使用的招式变成自己的招式。\n使用1次后写生消失", - }, - "tripleKick": { - name: "三连踢", - effect: "连续3次踢对手进行攻击。\n每踢中一次,威力就会提高", - }, - "thief": { - name: "小偷", - effect: "攻击的同时盗取对手的道具。", - }, - "spiderWeb": { - name: "蛛网", - effect: "将黏糊糊的细丝一层一层缠住对手,\n使其不能从战斗中逃走", - }, - "mindReader": { - name: "心之眼", - effect: "用心感受对手的行动,\n下次攻击必定会击中对手", - }, - "nightmare": { - name: "恶梦", - effect: "让在睡眠状态下的对手做恶梦,\n每回合会缓缓减少HP", - }, - "flameWheel": { - name: "火焰轮", - effect: "让火焰覆盖全身,猛撞向对手进行攻击。\n有时会让对手陷入灼伤状态", - }, - "snore": { - name: "打鼾", - effect: "在自己睡觉时,发出噪音进行攻击。\n有时会使对手畏缩", - }, - "curse": { - name: "诅咒", - effect: "使用该招式的宝可梦,\n其属性是幽灵属性或其他属性时,\n效果会不一样", - }, - "flail": { - name: "抓狂", - effect: "抓狂般乱打进行攻击。\n自己的HP越少,招式的威力越大", - }, - "conversion2": { - name: "纹理2", - effect: "为了可以抵抗对手最后使用的招式,\n从而使自己的属性发生变化", - }, - "aeroblast": { - name: "气旋攻击", - effect: "发射空气旋涡进行攻击。\n容易击中要害", - }, - "cottonSpore": { - name: "棉孢子", - effect: "将棉花般柔软的孢子紧贴对手,\n从而大幅降低对手的速度", - }, - "reversal": { - name: "绝处逢生", - effect: "竭尽全力进行攻击。自己的HP越少,\n招式的威力越大", - }, - "spite": { - name: "怨恨", - effect: "对对手最后使用的招式怀有怨恨,\n减少4PP该招式", - }, - "powderSnow": { - name: "细雪", - effect: "将冰冷的细雪吹向对手进行攻击。\n有时会让对手陷入冰冻状态", - }, - "protect": { - name: "守住", - effect: "完全抵挡对手的攻击。\n连续使出则容易失败", - }, - "machPunch": { - name: "音速拳", - effect: "以迅雷不及掩耳之势出拳。\n必定能够先制攻击", - }, - "scaryFace": { - name: "可怕面孔", - effect: "用恐怖的表情瞪着对手,\n使其害怕,从而大幅降低对手的速度", - }, - "feintAttack": { - name: "出奇一击", - effect: "悄悄地靠近对手,趁其不备进行殴打。\n攻击必定会命中", - }, - "sweetKiss": { - name: "天使之吻", - effect: "像天使般可爱地亲吻对手,\n从而使对手混乱", - }, - "bellyDrum": { - name: "腹鼓", - effect: "将自己的HP减少到最大HP的一半,\n从而最大限度提高自己的攻击", - }, - "sludgeBomb": { - name: "污泥炸弹", - effect: "用污泥投掷对手进行攻击。\n有时会让对手陷入中毒状态", - }, - "mudSlap": { - name: "掷泥", - effect: "向对手的脸等投掷泥块进行攻击。\n会降低对手的命中率", - }, - "octazooka": { - name: "章鱼桶炮", - effect: "向对手的脸等喷出墨汁进行攻击。\n有时会降低对手的命中率", - }, - "spikes": { - name: "撒菱", - effect: "在对手的脚下扔撒菱。\n对替换出场的对手的宝可梦给予伤害", - }, - "zapCannon": { - name: "电磁炮", - effect: "发射大炮一样的电流进行攻击。\n让对手陷入麻痹状态", - }, - "foresight": { - name: "识破", - effect: "使出后对幽灵属性宝可梦没有效果\n的招式以及闪避率高的对手,\n变得能够打中", - }, - "destinyBond": { - name: "同命", - effect: "使出招式后,当受到对手攻击陷入昏厥时,\n对手也会一同昏厥。\n连续使出则会失败", - }, - "perishSong": { - name: "终焉之歌", - effect: "倾听歌声的宝可梦经过3回合陷入昏厥。\n替换后效果消失", - }, - "icyWind": { - name: "冰冻之风", - effect: "将结冰的冷气吹向对手进行攻击。\n会降低对手的速度", - }, - "detect": { - name: "看穿", - effect: "完全抵挡对手的攻击。\n连续使出则容易失败", - }, - "boneRush": { - name: "骨棒乱打", - effect: "用坚硬的骨头殴打对手进行攻击。\n连续攻击2~5次", - }, - "lockOn": { - name: "锁定", - effect: "紧紧瞄准对手,下次攻击必定会打中", - }, - "outrage": { - name: "逆鳞", - effect: "在2~3回合内,乱打一气地进行攻击。\n大闹一番后自己会陷入混乱", - }, - "sandstorm": { - name: "沙暴", - effect: "在5回合内扬起沙暴,\n除岩石、地面和钢属性以外的宝可梦,\n都会受到伤害。岩石属性的特防还会提高", - }, - "gigaDrain": { - name: "终极吸取", - effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP", - }, - "endure": { - name: "挺住", - effect: "即使受到攻击,也至少会留下1HP。\n连续使出则容易失败", - }, - "charm": { - name: "撒娇", - effect: "可爱地凝视,诱使对手疏忽大意,\n从而大幅降低对手的攻击", - }, - "rollout": { - name: "滚动", - effect: "在5回合内连续滚动攻击对手。\n招式每次击中,威力就会提高", - }, - "falseSwipe": { - name: "点到为止", - effect: "对手的HP至少会留下1HP,\n如此般手下留情地攻击", - }, - "swagger": { - name: "虚张声势", - effect: "激怒对手,使其混乱。\n因为愤怒,对手的攻击会大幅提高", - }, - "milkDrink": { - name: "喝牛奶", - effect: "回复自己最大HP的一半", - }, - "spark": { - name: "电光", - effect: "让电流覆盖全身,猛撞向对手进行攻击。\n有时会让对手陷入麻痹状态", - }, - "furyCutter": { - name: "连斩", - effect: "用镰刀或爪子等切斩对手进行攻击。\n连续击中,威力就会提高", - }, - "steelWing": { - name: "钢翼", - effect: "用坚硬的翅膀敲打对手进行攻击。\n有时会提高自己的防御", - }, - "meanLook": { - name: "黑色目光", - effect: "用好似要勾人心魂的黑色目光一动\n不动地凝视对手,使其不能从战斗中逃走", - }, - "attract": { - name: "迷人", - effect: "♂诱惑♀或♀诱惑♂,让对手着迷。\n对手将很难使出招式", - }, - "sleepTalk": { - name: "梦话", - effect: "从自己已学会的招式中任意使出1个。\n只能在自己睡觉时使用", - }, - "healBell": { - name: "治愈铃声", - effect: "让同伴听舒适的铃音,\n从而治愈我方全员的异常状态", - }, - "return": { - name: "报恩", - effect: "为了训练家而全力攻击对手。\n亲密度越高,威力越大", - }, - "present": { - name: "礼物", - effect: "递给对手设有圈套的盒子进行攻击。\n也有可能回复对手HP", - }, - "frustration": { - name: "迁怒", - effect: "为了发泄不满而全力攻击对手。\n亲密度越低,威力越大", - }, - "safeguard": { - name: "神秘守护", - effect: "在5回合内被神奇的力量守护,\n从而不会陷入异常状态", - }, - "painSplit": { - name: "分担痛楚", - effect: "将自己的HP和对手的HP相加,\n然后自己和对手友好地平分", - }, - "sacredFire": { - name: "神圣之火", - effect: "用神秘的火焰烧尽对手进行攻击。\n有时会让对手陷入灼伤状态", - }, - "magnitude": { - name: "震级", - effect: "晃动地面,攻击自己周围所有的宝可梦。\n招式的威力会有各种变化", - }, - "dynamicPunch": { - name: "爆裂拳", - effect: "使出浑身力气出拳进行攻击。\n必定会使对手混乱", - }, - "megahorn": { - name: "超级角击", - effect: "用坚硬且华丽的角狠狠地刺入对手\n进行攻击", - }, - "dragonBreath": { - name: "龙息", - effect: "将强烈的气息吹向对手进行攻击。\n有时会让对手陷入麻痹状态", - }, - "batonPass": { - name: "接棒", - effect: "和后备宝可梦进行替换。\n换上的宝可梦能直接继承其能力的变化", - }, - "encore": { - name: "再来一次", - effect: "让对手接受再来一次,\n连续3次使出最后使用的招式", - }, - "pursuit": { - name: "追打", - effect: "当对手替换宝可梦上场时使出此招式的话,\n能够以2倍的威力进行攻击", - }, - "rapidSpin": { - name: "高速旋转", - effect: "通过旋转来攻击对手。\n可以摆脱绑紧、紧束、寄生种子等招式。\n还能提高自己的速度", - }, - "sweetScent": { - name: "甜甜香气", - effect: "用香气大幅降低对手的闪避率", - }, - "ironTail": { - name: "铁尾", - effect: "使用坚硬的尾巴摔打对手进行攻击。\n有时会降低对手的防御", - }, - "metalClaw": { - name: "金属爪", - effect: "用钢铁之爪劈开对手进行攻击。\n有时会提高自己的攻击", - }, - "vitalThrow": { - name: "借力摔", - effect: "会在对手之后进行攻击。\n但是自己的攻击必定会命中", - }, - "morningSun": { - name: "晨光", - effect: "回复自己的HP。根据天气的不同,\n回复量也会有所变化", - }, - "synthesis": { - name: "光合作用", - effect: "回复自己的HP。根据天气的不同,\n回复量也会有所变化", - }, - "moonlight": { - name: "月光", - effect: "回复自己的HP。根据天气的不同,\n回复量也会有所变化", - }, - "hiddenPower": { - name: "觉醒力量", - effect: "招式的属性会随着使用此招式的宝\n可梦而改变", - }, - "crossChop": { - name: "十字劈", - effect: "用两手呈十字劈打对手进行攻击。\n容易击中要害", - }, - "twister": { - name: "龙卷风", - effect: "兴起龙卷风,将对手卷入进行攻击。\n有时会使对手畏缩", - }, - "rainDance": { - name: "求雨", - effect: "在5回合内一直降雨,\n从而提高水属性的招式威力。火属性的招式威\n力则降低", - }, - "sunnyDay": { - name: "大晴天", - effect: "在5回合内让日照变得强烈,\n从而提高火属性的招式威力。\n水属性的招式威力则降低", - }, - "crunch": { - name: "咬碎", - effect: "用利牙咬碎对手进行攻击。\n有时会降低对手的防御", - }, - "mirrorCoat": { - name: "镜面反射", - effect: "从对手那里受到特殊攻击的伤害将\n以2倍返还给同一个对手", - }, - "psychUp": { - name: "自我暗示", - effect: "向自己施以自我暗示,\n将能力变化的状态变得和对手一样", - }, - "extremeSpeed": { - name: "神速", - effect: "以迅雷不及掩耳之势猛撞向对手进行攻击。\n必定能够先制攻击", - }, - "ancientPower": { - name: "原始之力", - effect: "用原始之力进行攻击。\n有时会提高自己所有的能力", - }, - "shadowBall": { - name: "暗影球", - effect: "投掷一团黑影进行攻击。\n有时会降低对手的特防", - }, - "futureSight": { - name: "预知未来", - effect: "在使用招式2回合后,\n向对手发送一团念力进行攻击", - }, - "rockSmash": { - name: "碎岩", - effect: "用拳头进行攻击。有时会降低对手的防御", - }, - "whirlpool": { - name: "潮旋", - effect: "将对手困在激烈的水流旋涡中,\n在4~5回合内进行攻击", - }, - "beatUp": { - name: "围攻", - effect: "我方全员进行攻击。同行的宝可梦越多,\n招式的攻击次数越多", - }, - "fakeOut": { - name: "击掌奇袭", - effect: "进行先制攻击,使对手畏缩。\n要在出场后立刻使出才能成功", - }, - "uproar": { - name: "吵闹", - effect: "在3回合内大吵大闹攻击对手。\n在此期间谁都不能入眠", - }, - "stockpile": { - name: "蓄力", - effect: "积蓄力量,提高自己的防御和特防。\n最多积蓄3次", - }, - "spitUp": { - name: "喷出", - effect: "将积蓄的力量撞向对手进行攻击。\n积蓄得越多,威力越大", - }, - "swallow": { - name: "吞下", - effect: "将积蓄的力量吞下,从而回复自己的HP。\n积蓄得越多,回复越大", - }, - "heatWave": { - name: "热风", - effect: "将炎热的气息吹向对手进行攻击。\n有时会让对手陷入灼伤状态", - }, - "hail": { - name: "冰雹", - effect: "在5回合内一直降冰雹,\n除冰属性的宝可梦以外,给予全体宝可梦伤害", - }, - "torment": { - name: "无理取闹", - effect: "向对手无理取闹,令其不能连续2\n次使出相同招式", - }, - "flatter": { - name: "吹捧", - effect: "吹捧对手,使其混乱。\n同时还会提高对手的特攻", - }, - "willOWisp": { - name: "磷火", - effect: "放出怪异的火焰,从而让对手陷入\n灼伤状态", - }, - "memento": { - name: "临别礼物", - effect: "虽然会使自己陷入昏厥,\n但是能够大幅降低对手的攻击和特攻", - }, - "facade": { - name: "硬撑", - effect: "当自己处于中毒、麻痹、灼伤状态时,\n向对手使出此招式的话,\n威力会变成2倍", - }, - "focusPunch": { - name: "真气拳", - effect: "集中精神出拳。在招式使出前若受\n到攻击则会失败", - }, - "smellingSalts": { - name: "清醒", - effect: "对于麻痹状态下的对手,\n威力会变成2倍。但相反对手的麻痹也会被治愈", - }, - "followMe": { - name: "看我嘛", - effect: "引起对手的注意,将对手的攻击全\n部转移到自己身上", - }, - "naturePower": { - name: "自然之力", - effect: "用自然之力进行攻击。\n根据所使用场所的不同,使出的招式也会有所变化", - }, - "charge": { - name: "充电", - effect: "变为充电状态,提高下次使出的电\n属性的招式威力。自己的特防也会提高", - }, - "taunt": { - name: "挑衅", - effect: "使对手愤怒。在3回合内让对手只\n能使出给予伤害的招式", - }, - "helpingHand": { - name: "帮助", - effect: "帮助伙伴。被帮助的宝可梦,\n其招式威力变得比平时大", - }, - "trick": { - name: "戏法", - effect: "抓住对手的空隙,交换自己和对手\n的持有物", - }, - "rolePlay": { - name: "扮演", - effect: "扮演对手,让自己的特性变得和对手相同", - }, - "wish": { - name: "祈愿", - effect: "在下一回合回复自己或是替换出场\n的宝可梦最大HP的一半", - }, - "assist": { - name: "借助", - effect: "向同伴紧急求助,从我方宝可梦已\n学会的招式中随机使用1个", - }, - "ingrain": { - name: "扎根", - effect: "在大地上扎根,每回合回复自己的HP。\n因为扎根了,所以不能替换宝可梦", - }, - "superpower": { - name: "蛮力", - effect: "发挥惊人的力量攻击对手。\n自己的攻击和防御会降低", - }, - "magicCoat": { - name: "魔法反射", - effect: "当对手使出会变成异常状态的招式\n或寄生种子等时,会将对手的招式\n反射回去", - }, - "recycle": { - name: "回收利用", - effect: "使战斗中已经消耗掉的自己的持有物再生,\n并可以再次使用", - }, - "revenge": { - name: "报复", - effect: "如果受到对手的招式攻击,\n就能给予对手2倍的伤害", - }, - "brickBreak": { - name: "劈瓦", - effect: "将手刀猛烈地挥下攻击对手。\n还可以破坏光墙和反射壁等", - }, - "yawn": { - name: "哈欠", - effect: "打个大哈欠引起睡意。\n在下一回合让对手陷入睡眠状态", - }, - "knockOff": { - name: "拍落", - effect: "拍落对手的持有物,直到战斗结束\n都不能使用。对手携带道具时会增加伤害", - }, - "endeavor": { - name: "蛮干", - effect: "给予伤害,使对手的HP变得和自\n己的HP一样", - }, - "eruption": { - name: "喷火", - effect: "爆发怒火攻击对手。自己的HP越少,\n招式的威力越小", - }, - "skillSwap": { - name: "特性互换", - effect: "利用超能力互换自己和对手的特性", - }, - "imprison": { - name: "封印", - effect: "如果对手有和自己相同的招式,\n那么只有对手无法使用该招式", - }, - "refresh": { - name: "焕然一新", - effect: "让身体休息,治愈自己身上所中的\n毒、麻痹、灼伤的异常状态", - }, - "grudge": { - name: "怨念", - effect: "因对手的招式而陷入昏厥时给对手\n施加怨念,让该招式的PP变成0", - }, - "snatch": { - name: "抢夺", - effect: "将对手打算使用的回复招式或能力\n变化招式夺为己用", - }, - "secretPower": { - name: "秘密之力", - effect: "根据使用场所不同,该招式的追加\n效果也会有所变化", - }, - "dive": { - name: "潜水", - effect: "第1回合潜入水中,第2回合浮上\n来进行攻击", - }, - "armThrust": { - name: "猛推", - effect: "用张开着的双手猛推对手进行攻击。\n连续攻击2~5次", - }, - "camouflage": { - name: "保护色", - effect: "根据所在场所不同,如水边、草丛\n和洞窟等,可以改变自己的属性", - }, - "tailGlow": { - name: "萤火", - effect: "凝视闪烁的光芒,集中自己的精神,\n从而巨幅提高特攻", - }, - "lusterPurge": { - name: "洁净光芒", - effect: "释放耀眼的光芒进行攻击。\n有时会降低对手的特防", - }, - "mistBall": { - name: "薄雾球", - effect: "用围绕着雾状羽毛的球进行攻击。\n有时会降低对手的特攻", - }, - "featherDance": { - name: "羽毛舞", - effect: "撒出羽毛,笼罩在对手的周围。\n大幅降低对手的攻击", - }, - "teeterDance": { - name: "摇晃舞", - effect: "摇摇晃晃地跳起舞蹈,\n让自己周围的宝可梦陷入混乱状态", - }, - "blazeKick": { - name: "火焰踢", - effect: "攻击对手后,有时会使其陷入灼伤状态。\n也容易击中要害", - }, - "mudSport": { - name: "玩泥巴", - effect: "一旦使用此招式,周围就会弄得到处是泥。\n在5回合内减弱电属性的招式", - }, - "iceBall": { - name: "冰球", - effect: "在5回合内攻击对手。\n招式每次击中,威力就会提高", - }, - "needleArm": { - name: "尖刺臂", - effect: "用带刺的手臂猛烈地挥舞进行攻击。\n有时会使对手畏缩", - }, - "slackOff": { - name: "偷懒", - effect: "偷懒休息。回复自己最大HP的一半", - }, - "hyperVoice": { - name: "巨声", - effect: "给予对手又吵又响的巨大震动进行攻击", - }, - "poisonFang": { - name: "剧毒牙", - effect: "用有毒的牙齿咬住对手进行攻击。\n有时会使对手中剧毒", - }, - "crushClaw": { - name: "撕裂爪", - effect: "用坚硬的锐爪劈开对手进行攻击。\n有时会降低对手的防御", - }, - "blastBurn": { - name: "爆炸烈焰", - effect: "用爆炸的火焰烧尽对手进行攻击。\n下一回合自己将无法动弹", - }, - "hydroCannon": { - name: "加农水炮", - effect: "向对手喷射水炮进行攻击。\n下一回合自己将无法动弹", - }, - "meteorMash": { - name: "彗星拳", - effect: "使出彗星般的拳头攻击对手。\n有时会提高自己的攻击", - }, - "astonish": { - name: "惊吓", - effect: "用尖叫声等突然惊吓对手进行攻击。\n有时会使对手畏缩", - }, - "weatherBall": { - name: "气象球", - effect: "根据使用时的天气,招式属性和威\n力会改变", - }, - "aromatherapy": { - name: "芳香治疗", - effect: "让同伴闻沁人心脾的香气,\n从而治愈我方全员的异常状态", - }, - "fakeTears": { - name: "假哭", - effect: "装哭流泪。使对手不知所措,\n从而大幅降低对手的特防", - }, - "airCutter": { - name: "空气利刃", - effect: "用锐利的风切斩对手进行攻击。\n容易击中要害", - }, - "overheat": { - name: "过热", - effect: "使出全部力量攻击对手。\n使用之后会因为反作用力,自己的特攻大幅降低", - }, - "odorSleuth": { - name: "气味侦测", - effect: "使出后对幽灵属性宝可梦没有效果\n的招式以及闪避率高的对手,\n变得能够打中", - }, - "rockTomb": { - name: "岩石封锁", - effect: "投掷岩石进行攻击。封住对手的行动,\n从而降低速度", - }, - "silverWind": { - name: "银色旋风", - effect: "在风中掺入鳞粉攻击对手。\n有时会提高自己的全部能力", - }, - "metalSound": { - name: "金属音", - effect: "让对手听摩擦金属般讨厌的声音。\n大幅降低对手的特防", - }, - "grassWhistle": { - name: "草笛", - effect: "让对手听舒适的笛声,\n从而陷入睡眠状态", - }, - "tickle": { - name: "挠痒", - effect: "给对手挠痒,使其发笑,\n从而降低对手的攻击和防御", - }, - "cosmicPower": { - name: "宇宙力量", - effect: "汲取宇宙中神秘的力量,\n从而提高自己的防御和特防", - }, - "waterSpout": { - name: "喷水", - effect: "掀起潮水进行攻击。自己的HP越少,\n招式的威力越小", - }, - "signalBeam": { - name: "信号光束", - effect: "发射神奇的光线进行攻击。\n有时会使对手混乱", - }, - "shadowPunch": { - name: "暗影拳", - effect: "使出混影之拳。攻击必定会命中", - }, - "extrasensory": { - name: "神通力", - effect: "发出看不见的神奇力量进行攻击。\n有时会使对手畏缩", - }, - "skyUppercut": { - name: "冲天拳", - effect: "用冲向天空般高高的上勾拳顶起对\n手进行攻击", - }, - "sandTomb": { - name: "流沙深渊", - effect: "将对手困在铺天盖地的沙暴中,\n在4~5回合内进行攻击", - }, - "sheerCold": { - name: "绝对零度", - effect: "给对手一击昏厥。如果是冰属性以\n外的宝可梦使用,就会难以打中", - }, - "muddyWater": { - name: "浊流", - effect: "向对手喷射浑浊的水进行攻击。\n有时会降低对手的命中率", - }, - "bulletSeed": { - name: "种子机关枪", - effect: "向对手猛烈地发射种子进行攻击。\n连续攻击2~5次", - }, - "aerialAce": { - name: "燕返", - effect: "以敏捷的动作戏弄对手后进行切斩。\n攻击必定会命中", - }, - "icicleSpear": { - name: "冰锥", - effect: "向对手发射锋利的冰柱进行攻击。\n连续攻击2~5次", - }, - "ironDefense": { - name: "铁壁", - effect: "将皮肤变得坚硬如铁,\n从而大幅提高自己的防御", - }, - "block": { - name: "挡路", - effect: "张开双手进行阻挡,封住对手的退路,\n使其不能逃走", - }, - "howl": { - name: "长嚎", - effect: "大声吼叫提高气势,从而提高自己\n和同伴的攻击", - }, - "dragonClaw": { - name: "龙爪", - effect: "用尖锐的巨爪劈开对手进行攻击", - }, - "frenzyPlant": { - name: "疯狂植物", - effect: "用大树摔打对手进行攻击。\n下一回合自己将无法动弹", - }, - "bulkUp": { - name: "健美", - effect: "使出全身力气绷紧肌肉,\n从而提高自己的攻击和防御", - }, - "bounce": { - name: "弹跳", - effect: "弹跳到高高的空中,第2回合攻击对手。\n有时会让对手陷入麻痹状态", - }, - "mudShot": { - name: "泥巴射击", - effect: "向对手投掷泥块进行攻击。\n同时降低对手的速度", - }, - "poisonTail": { - name: "毒尾", - effect: "用尾巴拍打。有时会让对手陷入中毒状态,\n也容易击中要害", - }, - "covet": { - name: "渴望", - effect: "一边可爱地撒娇,一边靠近对手进行攻击,\n还能夺取对手携带的道具", - }, - "voltTackle": { - name: "伏特攻击", - effect: "让电流覆盖全身猛撞向对手。\n自己也会受到不小的伤害。\n有时会让对手陷入麻痹状态", - }, - "magicalLeaf": { - name: "魔法叶", - effect: "散落可以追踪对手的神奇叶片。\n攻击必定会命中", - }, - "waterSport": { - name: "玩水", - effect: "用水湿透周围。在5回合内减弱火\n属性的招式", - }, - "calmMind": { - name: "冥想", - effect: "静心凝神,从而提高自己的特攻和特防", - }, - "leafBlade": { - name: "叶刃", - effect: "像用剑一般操纵叶片切斩对手进行攻击。\n容易击中要害", - }, - "dragonDance": { - name: "龙之舞", - effect: "激烈地跳起神秘且强有力的舞蹈。\n从而提高自己的攻击和速度", - }, - "rockBlast": { - name: "岩石爆击", - effect: "向对手发射坚硬的岩石进行攻击。\n连续攻击2~5次", - }, - "shockWave": { - name: "电击波", - effect: "向对手快速发出电击。\n攻击必定会命中", - }, - "waterPulse": { - name: "水之波动", - effect: "用水的震动攻击对手。\n有时会使对手混乱", - }, - "doomDesire": { - name: "破灭之愿", - effect: "使用招式2回合后,会用无数道光\n束攻击对手", - }, - "psychoBoost": { - name: "精神突进", - effect: "使出全部力量攻击对手。\n使用之后会因为反作用力,自己的特攻大幅降低", - }, - "roost": { - name: "羽栖", - effect: "降到地面,使身体休息。\n回复自己最大HP的一半", - }, - "gravity": { - name: "重力", - effect: "在5回合内,飘浮特性和飞行属性\n的宝可梦会被地面属性的招式击中。\n飞向空中的招式也将无法使用", - }, - "miracleEye": { - name: "奇迹之眼", - effect: "使出后对恶属性宝可梦没有效果的\n招式以及闪避率高的对手,\n变得能够打中", - }, - "wakeUpSlap": { - name: "唤醒巴掌", - effect: "给予睡眠状态下的对手较大的伤害。\n但相反对手会从睡眠中醒过来", - }, - "hammerArm": { - name: "臂锤", - effect: "挥舞强力而沉重的拳头,\n给予对手伤害。自己的速度会降低", - }, - "gyroBall": { - name: "陀螺球", - effect: "让身体高速旋转并撞击对手。\n速度比对手越慢,威力越大", - }, - "healingWish": { - name: "治愈之愿", - effect: "虽然自己陷入昏厥,但可以治愈后\n备上场的宝可梦的异常状态以及回复HP", - }, - "brine": { - name: "盐水", - effect: "当对手的HP负伤到一半左右时,\n招式威力会变成2倍", - }, - "naturalGift": { - name: "自然之恩", - effect: "从树果上获得力量进行攻击。\n根据携带的树果,招式属性和威力会改变", - }, - "feint": { - name: "佯攻", - effect: "能够攻击正在使用守住或看穿等招\n式的对手。解除其守护效果", - }, - "pluck": { - name: "啄食", - effect: "用喙进行攻击。当对手携带树果时,\n可以食用并获得其效果", - }, - "tailwind": { - name: "顺风", - effect: "刮起猛烈的旋风,在4回合内提高\n我方全员的速度", - }, - "acupressure": { - name: "点穴", - effect: "通过点穴让身体舒筋活络。\n大幅提高某1项能力", - }, - "metalBurst": { - name: "金属爆炸", - effect: "使出招式前,将最后受到的招式的\n伤害大力返还给对手", - }, - "uTurn": { - name: "急速折返", - effect: "在攻击之后急速返回,\n和后备宝可梦进行替换", - }, - "closeCombat": { - name: "近身战", - effect: "放弃守护,向对手的怀里突击。\n自己的防御和特防会降低", - }, - "payback": { - name: "以牙还牙", - effect: "蓄力攻击。如果能在对手之后攻击,\n招式的威力会变成2倍", - }, - "assurance": { - name: "恶意追击", - effect: "如果此回合内对手已经受到伤害的话,\n招式威力会变成2倍", - }, - "embargo": { - name: "查封", - effect: "让对手在5回合内不能使用宝可梦\n携带的道具。训练家也不能给那只\n宝可梦使用道具", - }, - "fling": { - name: "投掷", - effect: "快速投掷携带的道具进行攻击。\n根据道具不同,威力和效果会改变", - }, - "psychoShift": { - name: "精神转移", - effect: "利用超能力施以暗示,\n从而将自己受到的异常状态转移给对手", - }, - "trumpCard": { - name: "王牌", - effect: "王牌招式的剩余PP越少,\n招式的威力越大", - }, - "healBlock": { - name: "回复封锁", - effect: "在5回合内无法通过招式、特性或\n携带的道具来回复HP", - }, - "wringOut": { - name: "绞紧", - effect: "用力勒紧对手进行攻击。\n对手的HP越多,威力越大", - }, - "powerTrick": { - name: "力量戏法", - effect: "利用超能力交换自己的攻击和防御的力量", - }, - "gastroAcid": { - name: "胃液", - effect: "将胃液吐向对手的身体。\n沾上的胃液会消除对手的特性效果", - }, - "luckyChant": { - name: "幸运咒语", - effect: "向天许愿,从而在5回合内不会被\n对手的攻击打中要害", - }, - "meFirst": { - name: "抢先一步", - effect: "提高威力,抢先使出对手想要使出的招式。\n如果不先使出则会失败", - }, - "copycat": { - name: "仿效", - effect: "模仿对手刚才使出的招式,\n并使出相同招式。如果对手还没出招则会失败", - }, - "powerSwap": { - name: "力量互换", - effect: "利用超能力互换自己和对手的攻击\n以及特攻的能力变化", - }, - "guardSwap": { - name: "防守互换", - effect: "利用超能力互换自己和对手的防御\n以及特防的能力变化", - }, - "punishment": { - name: "惩罚", - effect: "根据能力变化,对手提高的力量越大,\n招式的威力越大", - }, - "lastResort": { - name: "珍藏", - effect: "当战斗中已学会的招式全部使用过后,\n才能开始使出珍藏的招式", - }, - "worrySeed": { - name: "烦恼种子", - effect: "种植心神不宁的种子。\n使对手不能入眠,并将特性变成不眠", - }, - "suckerPunch": { - name: "突袭", - effect: "可以比对手先攻击。对手使出的招\n式如果不是攻击招式则会失败", - }, - "toxicSpikes": { - name: "毒菱", - effect: "在对手的脚下撒毒菱。\n使对手替换出场的宝可梦中毒", - }, - "heartSwap": { - name: "心灵互换", - effect: "利用超能力互换自己和对手之间的\n能力变化", - }, - "aquaRing": { - name: "水流环", - effect: "在自己身体的周围覆盖用水制造的幕。\n每回合回复HP", - }, - "magnetRise": { - name: "电磁飘浮", - effect: "利用电气产生的磁力浮在空中。\n在5回合内可以飘浮", - }, - "flareBlitz": { - name: "闪焰冲锋", - effect: "让火焰覆盖全身猛撞向对手。\n自己也会受到不小的伤害。\n有时会让对手陷入灼伤状态", - }, - "forcePalm": { - name: "发劲", - effect: "向对手的身体发出冲击波进行攻击。\n有时会让对手陷入麻痹状态", - }, - "auraSphere": { - name: "波导弹", - effect: "从体内产生出波导之力,\n然后向对手发出。攻击必定会命中", - }, - "rockPolish": { - name: "岩石打磨", - effect: "打磨自己的身体,减少空气阻力。\n可以大幅提高自己的速度", - }, - "poisonJab": { - name: "毒击", - effect: "用带毒的触手或手臂刺入对手。\n有时会让对手陷入中毒状态", - }, - "darkPulse": { - name: "恶之波动", - effect: "从体内发出充满恶意的恐怖气场。\n有时会使对手畏缩", - }, - "nightSlash": { - name: "暗袭要害", - effect: "抓住瞬间的空隙切斩对手。\n容易击中要害", - }, - "aquaTail": { - name: "水流尾", - effect: "如惊涛骇浪般挥动大尾巴攻击对手", - }, - "seedBomb": { - name: "种子炸弹", - effect: "将外壳坚硬的大种子,\n从上方砸下攻击对手", - }, - "airSlash": { - name: "空气之刃", - effect: "用连天空也能劈开的空气之刃进行攻击。\n有时会使对手畏缩", - }, - "xScissor": { - name: "十字剪", - effect: "将镰刀或爪子像剪刀般地交叉,\n顺势劈开对手", - }, - "bugBuzz": { - name: "虫鸣", - effect: "利用振动发出音波进行攻击。\n有时会降低对手的特防", - }, - "dragonPulse": { - name: "龙之波动", - effect: "从大大的口中掀起冲击波攻击对手", - }, - "dragonRush": { - name: "龙之俯冲", - effect: "释放出骇人的杀气,一边威慑一边\n撞击对手。有时会使对手畏缩", - }, - "powerGem": { - name: "力量宝石", - effect: "发射如宝石般闪耀的光芒攻击对手", - }, - "drainPunch": { - name: "吸取拳", - effect: "用拳头吸取对手的力量。\n可以回复给予对手伤害的一半HP", - }, - "vacuumWave": { - name: "真空波", - effect: "挥动拳头,掀起真空波。\n必定能够先制攻击", - }, - "focusBlast": { - name: "真气弹", - effect: "提高气势,释放出全部力量。\n有时会降低对手的特防", - }, - "energyBall": { - name: "能量球", - effect: "发射从自然收集的生命力量。\n有时会降低对手的特防", - }, - "braveBird": { - name: "勇鸟猛攻", - effect: "收拢翅膀,通过低空飞行突击对手。\n自己也会受到不小的伤害", - }, - "earthPower": { - name: "大地之力", - effect: "向对手脚下释放出大地之力。\n有时会降低对手的特防", - }, - "switcheroo": { - name: "掉包", - effect: "用一闪而过的速度交换自己和对手\n的持有物", - }, - "gigaImpact": { - name: "终极冲击", - effect: "使出自己浑身力量突击对手。\n下一回合自己将无法动弹", - }, - "nastyPlot": { - name: "诡计", - effect: "谋划诡计,激活头脑。\n大幅提高自己的特攻", - }, - "bulletPunch": { - name: "子弹拳", - effect: "向对手使出如子弹般快速而坚硬的拳头。\n必定能够先制攻击", - }, - "avalanche": { - name: "雪崩", - effect: "如果受到对手的招式攻击,\n就能给予该对手2倍威力的攻击", - }, - "iceShard": { - name: "冰砾", - effect: "瞬间制作冰块,快速地扔向对手。\n必定能够先制攻击", - }, - "shadowClaw": { - name: "暗影爪", - effect: "以影子做成的锐爪,劈开对手。\n容易击中要害", - }, - "thunderFang": { - name: "雷电牙", - effect: "用蓄满电流的牙齿咬住对手。\n有时会使对手畏缩或陷入麻痹状态", - }, - "iceFang": { - name: "冰冻牙", - effect: "用藏有冷气的牙齿咬住对手。\n有时会使对手畏缩或陷入冰冻状态", - }, - "fireFang": { - name: "火焰牙", - effect: "用覆盖着火焰的牙齿咬住对手。\n有时会使对手畏缩或陷入灼伤状态", - }, - "shadowSneak": { - name: "影子偷袭", - effect: "伸长影子,从对手的背后进行攻击。\n必定能够先制攻击", - }, - "mudBomb": { - name: "泥巴炸弹", - effect: "向对手发射坚硬的泥弹进行攻击。\n有时会降低对手的命中率", - }, - "psychoCut": { - name: "精神利刃", - effect: "用实体化的心之利刃劈开对手。\n容易击中要害", - }, - "zenHeadbutt": { - name: "意念头锤", - effect: "将思念的力量集中在前额进行攻击。\n有时会使对手畏缩", - }, - "mirrorShot": { - name: "镜光射击", - effect: "抛光自己的身体,向对手释放出闪光之力。\n有时会降低对手的命中率", - }, - "flashCannon": { - name: "加农光炮", - effect: "将身体的光芒聚集在一点释放出去。\n有时会降低对手的特防", - }, - "rockClimb": { - name: "攀岩", - effect: "发动猛撞攻击,有时会使对手混乱。\n是宝可表的秘传招式之一", - }, - "defog": { - name: "清除浓雾", - effect: "用强风吹开对手的反射壁或光墙等。\n也会降低对手的闪避率", - }, - "trickRoom": { - name: "戏法空间", - effect: "制造出离奇的空间。在5回合内速\n度慢的宝可梦可以先行动", - }, - "dracoMeteor": { - name: "流星群", - effect: "从天空中向对手落下陨石。\n使用之后因为反作用力,自己的特攻会大幅降低", - }, - "discharge": { - name: "放电", - effect: "用耀眼的电击攻击自己周围所有的宝可梦。\n有时会陷入麻痹状态", - }, - "lavaPlume": { - name: "喷烟", - effect: "用熊熊烈火攻击自己周围所有的宝可梦。\n有时会陷入灼伤状态", - }, - "leafStorm": { - name: "飞叶风暴", - effect: "用尖尖的叶片向对手卷起风暴。\n使用之后因为反作用力自己的特攻会\n大幅降低", - }, - "powerWhip": { - name: "强力鞭打", - effect: "激烈地挥舞青藤或触手摔打对手进行攻击", - }, - "rockWrecker": { - name: "岩石炮", - effect: "向对手发射巨大的岩石进行攻击。\n下一回合自己将无法动弹", - }, - "crossPoison": { - name: "十字毒刃", - effect: "用毒刃劈开对手。有时会让对手陷\n入中毒状态,也容易击中要害", - }, - "gunkShot": { - name: "垃圾射击", - effect: "用肮脏的垃圾撞向对手进行攻击。\n有时会让对手陷入中毒状态", - }, - "ironHead": { - name: "铁头", - effect: "用钢铁般坚硬的头部进行攻击。\n有时会使对手畏缩", - }, - "magnetBomb": { - name: "磁铁炸弹", - effect: "发射吸住对手的钢铁炸弹。\n攻击必定会命中", - }, - "stoneEdge": { - name: "尖石攻击", - effect: "用尖尖的岩石刺入对手进行攻击。\n容易击中要害", - }, - "captivate": { - name: "诱惑", - effect: "♂诱惑♀或♀诱惑♂,\n从而大幅降低对手的特攻", - }, - "stealthRock": { - name: "隐形岩", - effect: "将无数岩石悬浮在对手的周围,\n从而对替换出场的对手的宝可梦给予伤害", - }, - "grassKnot": { - name: "打草结", - effect: "用草缠住并绊倒对手。\n对手越重,威力越大", - }, - "chatter": { - name: "喋喋不休", - effect: "用非常烦人的,喋喋不休的音波攻击对手。\n使对手混乱", - }, - "judgment": { - name: "制裁光砾", - effect: "向对手放出无数的光弹。\n属性会根据自己携带的石板不同而改变", - }, - "bugBite": { - name: "虫咬", - effect: "咬住进行攻击。当对手携带树果时,\n可以食用并获得其效果", - }, - "chargeBeam": { - name: "充电光束", - effect: "向对手发射电击光束。\n由于蓄满电流,有时会提高自己的特攻", - }, - "woodHammer": { - name: "木槌", - effect: "用坚硬的躯体撞击对手进行攻击。\n自己也会受到不小的伤害", - }, - "aquaJet": { - name: "水流喷射", - effect: "以迅雷不及掩耳之势扑向对手。\n必定能够先制攻击", - }, - "attackOrder": { - name: "攻击指令", - effect: "召唤手下,让其朝对手发起攻击。\n容易击中要害", - }, - "defendOrder": { - name: "防御指令", - effect: "召唤手下,让其附在自己的身体上。\n可以提高自己的防御和特防", - }, - "healOrder": { - name: "回复指令", - effect: "召唤手下疗伤。回复自己最大HP的一半", - }, - "headSmash": { - name: "双刃头锤", - effect: "拼命使出浑身力气,向对手进行头锤攻击。\n自己也会受到非常大的伤害", - }, - "doubleHit": { - name: "二连击", - effect: "使用尾巴等拍打对手进行攻击。\n连续2次给予伤害", - }, - "roarOfTime": { - name: "时光咆哮", - effect: "释放出扭曲时间般的强大力量攻击对手。\n下一回合自己将无法动弹", - }, - "spacialRend": { - name: "亚空裂斩", - effect: "将对手连同周围的空间一起撕裂并\n给予伤害。容易击中要害", - }, - "lunarDance": { - name: "新月舞", - effect: "虽然自己陷入昏厥,但可以治愈后\n备上场的宝可梦的全部状态", - }, - "crushGrip": { - name: "捏碎", - effect: "用骇人的力量捏碎对手。\n对手剩余的HP越多,威力越大", - }, - "magmaStorm": { - name: "熔岩风暴", - effect: "将对手困在熊熊燃烧的火焰中,\n在4~5回合内进行攻击", - }, - "darkVoid": { - name: "暗黑洞", - effect: "将对手强制拖入黑暗的世界,\n从而让对手陷入睡眠状态", - }, - "seedFlare": { - name: "种子闪光", - effect: "从身体里产生冲击波。\n有时会大幅降低对手的特防", - }, - "ominousWind": { - name: "奇异之风", - effect: "突然刮起毛骨悚然的暴风攻击对手。\n有时会提高自己的全部能力", - }, - "shadowForce": { - name: "暗影潜袭", - effect: "第1回合消失踪影,第2回合攻击对手。\n即使对手正受保护,\n也能击中", - }, - "honeClaws": { - name: "磨爪", - effect: "将爪子磨得更加锋利。\n提高自己的攻击和命中率", - }, - "wideGuard": { - name: "广域防守", - effect: "在1回合内防住击打我方全员的攻击", - }, - "guardSplit": { - name: "防守平分", - effect: "利用超能力将自己和对手的防御和\n特防相加,再进行平分", - }, - "powerSplit": { - name: "力量平分", - effect: "利用超能力将自己和对手的攻击和\n特攻相加,再进行平分", - }, - "wonderRoom": { - name: "奇妙空间", - effect: "制造出离奇的空间。在5回合内互\n换所有宝可梦的防御和特防", - }, - "psyshock": { - name: "精神冲击", - effect: "将神奇的念波实体化攻击对手。\n给予物理伤害", - }, - "venoshock": { - name: "毒液冲击", - effect: "将特殊的毒液泼向对手。\n对处于中毒状态的对手,威力会变成2倍", - }, - "autotomize": { - name: "身体轻量化", - effect: "削掉身体上没用的部分。\n大幅提高自己的速度,同时体重也会变轻", - }, - "ragePowder": { - name: "愤怒粉", - effect: "将令人烦躁的粉末撒在自己身上,\n用以吸引对手的注意。\n使对手的攻击全部指向自己", - }, - "telekinesis": { - name: "意念移物", - effect: "利用超能力使对手浮起来。\n在3回合内攻击会变得容易打中对手", - }, - "magicRoom": { - name: "魔法空间", - effect: "制造出离奇的空间。在5回合内所\n有宝可梦携带道具的效果都会消失", - }, - "smackDown": { - name: "击落", - effect: "扔石头或炮弹,攻击飞行的对手。\n对手会被击落,掉到地面", - }, - "stormThrow": { - name: "山岚摔", - effect: "向对手使出强烈的一击。\n攻击必定会击中要害", - }, - "flameBurst": { - name: "烈焰溅射", - effect: "如果击中,爆裂的火焰会攻击到对手。\n爆裂出的火焰还会飞溅到旁边的对手", - }, - "sludgeWave": { - name: "污泥波", - effect: "用污泥波攻击自己周围所有的宝可梦。\n有时会陷入中毒状态", - }, - "quiverDance": { - name: "蝶舞", - effect: "轻巧地跳起神秘而又美丽的舞蹈。\n提高自己的特攻、特防和速度", - }, - "heavySlam": { - name: "重磅冲撞", - effect: "用沉重的身体撞向对手进行攻击。\n自己比对手越重,威力越大", - }, - "synchronoise": { - name: "同步干扰", - effect: "用神奇电波对周围所有和自己属性\n相同的宝可梦给予伤害", - }, - "electroBall": { - name: "电球", - effect: "用电气团撞向对手。自己比对手速度越快,\n威力越大", - }, - "soak": { - name: "浸水", - effect: "将大量的水泼向对手,\n从而使其变成水属性", - }, - "flameCharge": { - name: "蓄能焰袭", - effect: "让火焰覆盖全身,攻击对手。\n积蓄力量来提高自己的速度", - }, - "coil": { - name: "盘蜷", - effect: "盘蜷着集中精神。提高自己的攻击\n、防御和命中率", - }, - "lowSweep": { - name: "下盘踢", - effect: "以敏捷的动作瞄准对手的脚进行攻击。\n会降低对手的速度", - }, - "acidSpray": { - name: "酸液炸弹", - effect: "喷出能溶化对手的液体进行攻击。\n会大幅降低对手的特防", - }, - "foulPlay": { - name: "欺诈", - effect: "利用对手的力量进行攻击。\n正和自己战斗的对手,其攻击越高,\n伤害越大", - }, - "simpleBeam": { - name: "单纯光束", - effect: "向对手发送谜之念波。\n接收到念波的对手,其特性会变为单纯", - }, - "entrainment": { - name: "找伙伴", - effect: "用神奇的节奏跳舞。使对手模仿自\n己的动作,从而将特性变成一样", - }, - "afterYou": { - name: "您先请", - effect: "支援我方或对手的行动,\n使其紧接着此招式之后行动", - }, - "round": { - name: "轮唱", - effect: "用歌声攻击对手。大家一起轮唱便\n可以接连使出,威力也会提高", - }, - "echoedVoice": { - name: "回声", - effect: "用回声攻击对手。如果每回合都有\n宝可梦接着使用该招式,\n威力就会提高", - }, - "chipAway": { - name: "逐步击破", - effect: "看准机会稳步攻击。无视对手的能力变化,\n直接给予伤害", - }, - "clearSmog": { - name: "清除之烟", - effect: "向对手投掷特殊的泥块进行攻击。\n使其能力变回原点", - }, - "storedPower": { - name: "辅助力量", - effect: "用蓄积起来的力量攻击对手。\n自己的能力提高得越多,威力就越大", - }, - "quickGuard": { - name: "快速防守", - effect: "守护自己和同伴,以防对手的先制攻击", - }, - "allySwitch": { - name: "交换场地", - effect: "用神奇的力量瞬间移动,\n互换自己和同伴所在的位置。连续使出则容易失败", - }, - "scald": { - name: "热水", - effect: "向对手喷射煮得翻滚的开水进行攻击。\n有时会让对手陷入灼伤状态", - }, - "shellSmash": { - name: "破壳", - effect: "打破外壳,降低自己的防御和特防,\n但大幅提高攻击、特攻和速度", - }, - "healPulse": { - name: "治愈波动", - effect: "放出治愈波动,从而回复对手最大\nHP的一半", - }, - "hex": { - name: "祸不单行", - effect: "接二连三地进行攻击。\n对处于异常状态的对手给予较大的伤害", - }, - "skyDrop": { - name: "自由落体", - effect: "第1回合将对手带到空中,\n第2回合将其摔下进行攻击。\n被带到空中的对手不能动弹", - }, - "shiftGear": { - name: "换档", - effect: "转动齿轮,不仅提高自己的攻击,\n还会大幅提高速度", - }, - "circleThrow": { - name: "巴投", - effect: "扔飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束", - }, - "incinerate": { - name: "烧净", - effect: "用火焰攻击对手。对手携带树果等时,\n会烧掉,使其不能使用", - }, - "quash": { - name: "延后", - effect: "压制对手,从而将其行动顺序放到最后", - }, - "acrobatics": { - name: "杂技", - effect: "轻巧地攻击对手。自己没有携带道具时,\n会给予较大的伤害", - }, - "reflectType": { - name: "镜面属性", - effect: "反射对手的属性,让自己也变成一\n样的属性", - }, - "retaliate": { - name: "报仇", - effect: "为倒下的同伴报仇。如果上一回合\n有同伴倒下,威力就会提高", - }, - "finalGambit": { - name: "搏命", - effect: "拼命攻击对手。虽然自己陷入昏厥,\n但会给予对手和自己目前HP等\n量的伤害", - }, - "bestow": { - name: "传递礼物", - effect: "当对手未携带道具时,\n能够将自己携带的道具交给对手", - }, - "inferno": { - name: "烈火深渊", - effect: "用烈焰包裹住对手进行攻击。\n让对手陷入灼伤状态", - }, - "waterPledge": { - name: "水之誓约", - effect: "用水柱进行攻击。如果和火组合,\n威力就会提高,天空中会挂上彩虹", - }, - "firePledge": { - name: "火之誓约", - effect: "用火柱进行攻击。如果和草组合,\n威力就会提高,周围会变成火海", - }, - "grassPledge": { - name: "草之誓约", - effect: "用草柱进行攻击。如果和水组合,\n威力就会提高,周围会变成湿地", - }, - "voltSwitch": { - name: "伏特替换", - effect: "在攻击之后急速返回,\n和后备宝可梦进行替换", - }, - "struggleBug": { - name: "虫之抵抗", - effect: "抵抗并攻击对手。会降低对手的特攻", - }, - "bulldoze": { - name: "重踏", - effect: "用力踩踏地面并攻击自己周围所有\n的宝可梦。会降低对方的速度", - }, - "frostBreath": { - name: "冰息", - effect: "将冰冷的气息吹向对手进行攻击。\n必定会击中要害", - }, - "dragonTail": { - name: "龙尾", - effect: "弹飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束", - }, - "workUp": { - name: "自我激励", - effect: "激励自己,从而提高攻击和特攻", - }, - "electroweb": { - name: "电网", - effect: "用电网捉住对手进行攻击。\n会降低对手的速度", - }, - "wildCharge": { - name: "疯狂伏特", - effect: "让电流覆盖全身,撞向对手进行攻击。\n自己也会受到少许伤害", - }, - "drillRun": { - name: "直冲钻", - effect: "像钢钻一样,一边旋转身体一边撞击对手。\n容易击中要害", - }, - "dualChop": { - name: "二连劈", - effect: "用身体坚硬的部分拍打对手进行攻击。\n连续2次给予伤害", - }, - "heartStamp": { - name: "爱心印章", - effect: "以可爱的动作使对手疏忽,\n乘机给出强烈的一击。有时会使对手畏缩", - }, - "hornLeech": { - name: "木角", - effect: "将角刺入,吸取对手的养分。\n可以回复给予对手伤害的一半HP", - }, - "sacredSword": { - name: "圣剑", - effect: "用剑切斩对手进行攻击。\n无视对手的能力变化,直接给予伤害", - }, - "razorShell": { - name: "贝壳刃", - effect: "用锋利的贝壳切斩对手进行攻击。\n有时会降低对手的防御", - }, - "heatCrash": { - name: "高温重压", - effect: "用燃烧的身体撞向对手进行攻击。\n自己比对手越重,威力越大", - }, - "leafTornado": { - name: "青草搅拌器", - effect: "用锋利的叶片包裹住对手进行攻击。\n有时会降低对手的命中率", - }, - "steamroller": { - name: "疯狂滚压", - effect: "旋转揉成团的身体压扁对手。\n有时会使对手畏缩", - }, - "cottonGuard": { - name: "棉花防守", - effect: "用软绵绵的绒毛包裹住自己的身体\n进行守护。巨幅提高自己的防御", - }, - "nightDaze": { - name: "暗黑爆破", - effect: "放出黑暗的冲击波攻击对手。\n有时会降低对手的命中率", - }, - "psystrike": { - name: "精神击破", - effect: "将神奇的念波实体化攻击对手。\n给予物理伤害", - }, - "tailSlap": { - name: "扫尾拍打", - effect: "用坚硬的尾巴拍打对手进行攻击。\n连续攻击2~5次", - }, - "hurricane": { - name: "暴风", - effect: "用强烈的风席卷对手进行攻击。\n有时会使对手混乱", - }, - "headCharge": { - name: "爆炸头突击", - effect: "用厉害的爆炸头猛撞向对手进行攻击。\n自己也会受到少许伤害", - }, - "gearGrind": { - name: "齿轮飞盘", - effect: "向对手投掷钢铁齿轮进行攻击。\n连续2次给予伤害", - }, - "searingShot": { - name: "火焰弹", - effect: "用熊熊烈火攻击自己周围所有的宝可梦。\n有时会陷入灼伤状态", - }, - "technoBlast": { - name: "高科技光炮", - effect: "向对手放出光弹。属性会根据自己\n携带的卡带不同而改变", - }, - "relicSong": { - name: "古老之歌", - effect: "让对手听古老之歌,打动对手的内\n心进行攻击。有时会让对手陷入睡眠状态", - }, - "secretSword": { - name: "神秘之剑", - effect: "用长角切斩对手进行攻击。\n角上拥有的神奇力量将给予物理伤害", - }, - "glaciate": { - name: "冰封世界", - effect: "将冰冻的冷气吹向对手进行攻击。\n会降低对手的速度", - }, - "boltStrike": { - name: "雷击", - effect: "让强大的电流覆盖全身,\n猛撞向对手进行攻击。有时会让对手陷入麻痹状态", - }, - "blueFlare": { - name: "青焰", - effect: "用美丽而激烈的青焰包裹住对手进行攻击。\n有时会让对手陷入灼伤状态", - }, - "fieryDance": { - name: "火之舞", - effect: "让火焰覆盖全身,振翅攻击对手。\n有时会提高自己的特攻", - }, - "freezeShock": { - name: "冰冻伏特", - effect: "用覆盖着电流的冰块,\n在第2回合撞向对手。有时会让对手陷入麻痹状态", - }, - "iceBurn": { - name: "极寒冷焰", - effect: "用能够冻结一切的强烈冷气,\n在第2回合包裹住对手。有时会让对手\n陷入灼伤状态", - }, - "snarl": { - name: "大声咆哮", - effect: "没完没了地大声斥责,\n从而降低对手的特攻", - }, - "icicleCrash": { - name: "冰柱坠击", - effect: "用大冰柱激烈地撞向对手进行攻击。\n有时会使对手畏缩", - }, - "vCreate": { - name: "V热焰", - effect: "从前额产生灼热的火焰,\n舍身撞击对手。防御、特防和速度会降低", - }, - "fusionFlare": { - name: "交错火焰", - effect: "释放出巨大的火焰。受到巨大的闪\n电影响时,招式威力会提高", - }, - "fusionBolt": { - name: "交错闪电", - effect: "释放出巨大的闪电。受到巨大的火\n焰影响时,招式威力会提高", - }, - "flyingPress": { - name: "飞身重压", - effect: "从空中俯冲向对手。此招式同时带\n有格斗属性和飞行属性", - }, - "matBlock": { - name: "掀榻榻米", - effect: "将掀起来的榻榻米当作盾牌,\n防住自己和同伴免受招式伤害。\n变化招式无法防住", - }, - "belch": { - name: "打嗝", - effect: "朝着对手打嗝,并给予伤害。\n如果不吃树果则无法使出", - }, - "rototiller": { - name: "耕地", - effect: "翻耕土地,使草木更容易成长。\n会提高草属性宝可梦的攻击和特攻", - }, - "stickyWeb": { - name: "黏黏网", - effect: "在对手周围围上黏黏的网,\n降低替换出场的对手的速度", - }, - "fellStinger": { - name: "致命针刺", - effect: "如果使用此招式打倒对手,\n攻击会巨幅提高", - }, - "phantomForce": { - name: "潜灵奇袭", - effect: "第1回合消失在某处,\n第2回合攻击对手。可以无视守护进行攻击", - }, - "trickOrTreat": { - name: "万圣夜", - effect: "邀请对手参加万圣夜。\n使对手被追加幽灵属性", - }, - "nobleRoar": { - name: "战吼", - effect: "发出战吼威吓对手,从而降低对手\n的攻击和特攻", - }, - "ionDeluge": { - name: "等离子浴", - effect: "将带电粒子扩散开来,\n使一般属性的招式变成电属性", - }, - "parabolicCharge": { - name: "抛物面充电", - effect: "给周围全体宝可梦造成伤害。\n可以回复给予伤害的一半HP", - }, - "forestsCurse": { - name: "森林咒术", - effect: "向对手施加森林咒术。\n中了咒术的对手会被追加草属性", - }, - "petalBlizzard": { - name: "落英缤纷", - effect: "猛烈地刮起飞雪般的落花,\n攻击周围所有的宝可梦,并给予伤害", - }, - "freezeDry": { - name: "冷冻干燥", - effect: "急剧冷冻对手,有时会让对手陷入\n冰冻状态。对于水属性宝可梦也是\n效果绝佳", - }, - "disarmingVoice": { - name: "魅惑之声", - effect: "发出魅惑的叫声,给予对手精神上的伤害。\n攻击必定会命中", - }, - "partingShot": { - name: "抛下狠话", - effect: "抛下狠话威吓对手,降低攻击和特攻后,\n和后备宝可梦进行替换", - }, - "topsyTurvy": { - name: "颠倒", - effect: "颠倒对手身上的所有能力变化,\n变成和原来相反的状态", - }, - "drainingKiss": { - name: "吸取之吻", - effect: "用一个吻吸取对手的HP。\n回复给予对手伤害的一半以上的HP", - }, - "craftyShield": { - name: "戏法防守", - effect: "使用神奇的力量防住攻击我方的变化招式。\n但无法防住伤害招式的攻击", - }, - "flowerShield": { - name: "鲜花防守", - effect: "使用神奇的力量提高在场的所有草\n属性宝可梦的防御", - }, - "grassyTerrain": { - name: "青草场地", - effect: "在5回合内变成青草场地。\n地面上的宝可梦每回合都能回复。\n草属性的招式威力还会提高", - }, - "mistyTerrain": { - name: "薄雾场地", - effect: "在5回合内,地面上的宝可梦不会\n陷入异常状态。龙属性招式的伤害\n也会减半", - }, - "electrify": { - name: "输电", - effect: "对手使出招式前,如果输电,\n则该回合对手的招式变成电属性", - }, - "playRough": { - name: "嬉闹", - effect: "与对手嬉闹并攻击。有时会降低对\n手的攻击", - }, - "fairyWind": { - name: "妖精之风", - effect: "刮起妖精之风,吹向对手进行攻击", - }, - "moonblast": { - name: "月亮之力", - effect: "借用月亮的力量攻击对手。\n有时会降低对手的特攻", - }, - "boomburst": { - name: "爆音波", - effect: "通过震耳欲聋的爆炸声产生的破坏力,\n攻击自己周围所有的宝可梦", - }, - "fairyLock": { - name: "妖精之锁", - effect: "通过封锁,下一回合所有的宝可梦\n都无法逃走", - }, - "kingsShield": { - name: "王者盾牌", - effect: "防住对手攻击的同时,\n自己变为防御姿态。能够降低所接触到的对手的攻击", - }, - "playNice": { - name: "和睦相处", - effect: "和对手和睦相处,使其失去战斗的气力,\n从而降低对手的攻击", - }, - "confide": { - name: "密语", - effect: "和对手进行密语,使其失去集中力,\n从而降低对手的特攻", - }, - "diamondStorm": { - name: "钻石风暴", - effect: "掀起钻石风暴给予伤害。\n有时会大幅提高自己的防御", - }, - "steamEruption": { - name: "蒸汽爆炸", - effect: "将滚烫的蒸汽喷向对手。\n有时会让对手灼伤", - }, - "hyperspaceHole": { - name: "异次元洞", - effect: "通过异次元洞,突然出现在对手的\n侧面进行攻击。还可以无视守住和\n看穿等招式", - }, - "waterShuriken": { - name: "飞水手里剑", - effect: "用粘液制成的手里剑,\n连续攻击2~5次。必定能够先制攻击", - }, - "mysticalFire": { - name: "魔法火焰", - effect: "从口中喷出特别灼热的火焰进行攻击。\n降低对手的特攻", - }, - "spikyShield": { - name: "尖刺防守", - effect: "防住对手攻击的同时,\n削减接触到自己的对手的体力", - }, - "aromaticMist": { - name: "芳香薄雾", - effect: "通过神奇的芳香,提高我方宝可梦的特防", - }, - "eerieImpulse": { - name: "怪异电波", - effect: "从身体放射出怪异电波,\n让对手沐浴其中,从而大幅降低其特攻", - }, - "venomDrench": { - name: "毒液陷阱", - effect: "将特殊的毒液泼向对手。\n对处于中毒状态的对手,其攻击、特攻和速\n度都会降低", - }, - "powder": { - name: "粉尘", - effect: "如果被撒到粉尘的对手使用火招式,\n则会爆炸并给予伤害", - }, - "geomancy": { - name: "大地掌控", - effect: "第1回合吸收能量,第2回合大幅\n提高特攻、特防和速度", - }, - "magneticFlux": { - name: "磁场操控", - effect: "通过操控磁场,会提高特性为正电\n和负电的宝可梦的防御和特防", - }, - "happyHour": { - name: "欢乐时光", - effect: "如果使用欢乐时光,战斗后得到的\n钱会翻倍", - }, - "electricTerrain": { - name: "电气场地", - effect: "在5回合内变成电气场地。\n地面上的宝可梦将无法入眠。\n电属性的招式威力还会提高", - }, - "dazzlingGleam": { - name: "魔法闪耀", - effect: "向对手发射强光,并给予伤害", - }, - "celebrate": { - name: "庆祝", - effect: "宝可梦为十分开心的你庆祝", - }, - "holdHands": { - name: "牵手", - effect: "我方宝可梦之间牵手。\n能带来非常幸福的心情", - }, - "babyDollEyes": { - name: "圆瞳", - effect: "用圆瞳凝视对手,从而降低其攻击。\n必定能够先制攻击", - }, - "nuzzle": { - name: "蹭蹭脸颊", - effect: "将带电的脸颊蹭蹭对手进行攻击。\n让对手陷入麻痹状态", - }, - "holdBack": { - name: "手下留情", - effect: "在攻击的时候手下留情,\n从而使对手的HP至少会留下1HP", - }, - "infestation": { - name: "纠缠不休", - effect: "在4~5回合内死缠烂打地进行攻击。\n在此期间对手将无法逃走", - }, - "powerUpPunch": { - name: "增强拳", - effect: "通过反复击打对手,使自己的拳头\n慢慢变硬。打中对手攻击就会提高", - }, - "oblivionWing": { - name: "归天之翼", - effect: "从锁定的对手身上吸取HP。\n回复给予对手伤害的一半以上的HP", - }, - "thousandArrows": { - name: "千箭齐发", - effect: "可以击中浮在空中的宝可梦。\n空中的对手被击落后,会掉到地面", - }, - "thousandWaves": { - name: "千波激荡", - effect: "从地面掀起波浪进行攻击。\n被掀入波浪中的对手,将无法从战斗中逃走", - }, - "landsWrath": { - name: "大地神力", - effect: "聚集大地的力量,将此力量集中攻击对手,\n并给予伤害", - }, - "lightOfRuin": { - name: "破灭之光", - effect: "借用永恒之花的力量,\n发射出强力光线。自己也会受到非常大的伤害", - }, - "originPulse": { - name: "根源波动", - effect: "用无数青白色且闪耀的光线攻击对手", - }, - "precipiceBlades": { - name: "断崖之剑", - effect: "将大地的力量变化为利刃攻击对手", - }, - "dragonAscent": { - name: "画龙点睛", - effect: "从天空中急速下降攻击对手。\n自己的防御和特防会降低", - }, - "hyperspaceFury": { - name: "异次元猛攻", - effect: "用许多手臂,无视对手的守住或看\n穿等招式进行连续攻击,\n自己的防御会降低", - }, - "breakneckBlitzPhysical": { - name: "一般Z究极无敌大冲撞", - effect: "通过Z力量气势猛烈地全力撞上对手。\n威力会根据原来的招式而改变", - }, - "breakneckBlitzSpecial": { - name: "一般Z究极无敌大冲撞", - effect: "通过Z力量气势猛烈地全力撞上对手。\n威力会根据原来的招式而改变", - }, - "allOutPummelingPhysical": { - name: "格斗Z全力无双激烈拳", - effect: "通过Z力量制造出能量弹,\n全力撞向对手。威力会根据原来的招式而改变", - }, - "allOutPummelingSpecial": { - name: "格斗Z全力无双激烈拳", - effect: "通过Z力量制造出能量弹,\n全力撞向对手。威力会根据原来的招式而改变", - }, - "supersonicSkystrikePhysical": { - name: "飞行Z极速俯冲轰烈撞", - effect: "通过Z力量猛烈地飞向天空,\n朝对手全力落下。威力会根据原来的招\n式而改变", - }, - "supersonicSkystrikeSpecial": { - name: "飞行Z极速俯冲轰烈撞", - effect: "通过Z力量猛烈地飞向天空,\n朝对手全力落下。威力会根据原来的招\n式而改变", - }, - "acidDownpourPhysical": { - name: "毒Z强酸剧毒灭绝雨", - effect: "通过Z力量使毒沼涌起,\n全力让对手沉下去。威力会根据原来的招式而改变", - }, - "acidDownpourSpecial": { - name: "毒Z强酸剧毒灭绝雨", - effect: "通过Z力量使毒沼涌起,\n全力让对手沉下去。威力会根据原来的招式而改变", - }, - "tectonicRagePhysical": { - name: "地面Z地隆啸天大终结", - effect: "通过Z力量潜入地里最深处,\n全力撞上对手。威力会根据原来的招式而改变", - }, - "tectonicRageSpecial": { - name: "地面Z地隆啸天大终结", - effect: "通过Z力量潜入地里最深处,\n全力撞上对手。威力会根据原来的招式而改变", - }, - "continentalCrushPhysical": { - name: "岩石Z毁天灭地巨岩坠", - effect: "通过Z力量召唤大大的岩山,\n全力撞向对手。威力会根据原来的招式而改变", - }, - "continentalCrushSpecial": { - name: "岩石Z毁天灭地巨岩坠", - effect: "通过Z力量召唤大大的岩山,\n全力撞向对手。威力会根据原来的招式而改变", - }, - "savageSpinOutPhysical": { - name: "虫Z绝对捕食回旋斩", - effect: "通过Z力量将吐出的丝线全力束缚对手。\n威力会根据原来的招式而改变", - }, - "savageSpinOutSpecial": { - name: "虫Z绝对捕食回旋斩", - effect: "通过Z力量将吐出的丝线全力束缚对手。\n威力会根据原来的招式而改变", - }, - "neverEndingNightmarePhysical": { - name: "幽灵Z无尽暗夜之诱惑", - effect: "通过Z力量召唤强烈的怨念,\n全力降临到对手身上。威力会根据原来\n的招式而改变", - }, - "neverEndingNightmareSpecial": { - name: "幽灵Z无尽暗夜之诱惑", - effect: "通过Z力量召唤强烈的怨念,\n全力降临到对手身上。威力会根据原来\n的招式而改变", - }, - "corkscrewCrashPhysical": { - name: "钢Z超绝螺旋连击", - effect: "通过Z力量进行高速旋转,\n全力撞上对手。威力会根据原来的招式而改变", - }, - "corkscrewCrashSpecial": { - name: "钢Z超绝螺旋连击", - effect: "通过Z力量进行高速旋转,\n全力撞上对手。威力会根据原来的招式而改变", - }, - "infernoOverdrivePhysical": { - name: "火Z超强极限爆焰弹", - effect: "通过Z力量喷出熊熊烈火,\n全力撞向对手。威力会根据原来的招式而改变", - }, - "infernoOverdriveSpecial": { - name: "火Z超强极限爆焰弹", - effect: "通过Z力量喷出熊熊烈火,\n全力撞向对手。威力会根据原来的招式而改变", - }, - "hydroVortexPhysical": { - name: "水Z超级水流大漩涡", - effect: "通过Z力量制造大大的潮旋,\n全力吞没对手。威力会根据原来的招式而改变", - }, - "hydroVortexSpecial": { - name: "水Z超级水流大漩涡", - effect: "通过Z力量制造大大的潮旋,\n全力吞没对手。威力会根据原来的招式而改变", - }, - "bloomDoomPhysical": { - name: "草Z绚烂缤纷花怒放", - effect: "通过Z力量借助花草的能量,\n全力攻击对手。威力会根据原来的招式而改变", - }, - "bloomDoomSpecial": { - name: "草Z绚烂缤纷花怒放", - effect: "通过Z力量借助花草的能量,\n全力攻击对手。威力会根据原来的招式而改变", - }, - "gigavoltHavocPhysical": { - name: "电Z终极伏特狂雷闪", - effect: "通过Z力量将蓄积的强大电流全力\n撞向对手。威力会根据原来的招式而改变", - }, - "gigavoltHavocSpecial": { - name: "电Z终极伏特狂雷闪", - effect: "通过Z力量将蓄积的强大电流全力\n撞向对手。威力会根据原来的招式而改变", - }, - "shatteredPsychePhysical": { - name: "超能力Z至高精神破坏波", - effect: "通过Z力量操纵对手,\n全力使其感受到痛苦。威力会根据原来的招式而改变", - }, - "shatteredPsycheSpecial": { - name: "超能力Z至高精神破坏波", - effect: "通过Z力量操纵对手,\n全力使其感受到痛苦。威力会根据原来的招式而改变", - }, - "subzeroSlammerPhysical": { - name: "冰Z激狂大地万里冰", - effect: "通过Z力量急剧降低气温,\n全力冰冻对手。威力会根据原来的招式而改变", - }, - "subzeroSlammerSpecial": { - name: "冰Z激狂大地万里冰", - effect: "通过Z力量急剧降低气温,\n全力冰冻对手。威力会根据原来的招式而改变", - }, - "devastatingDrakePhysical": { - name: "龙Z究极巨龙震天地", - effect: "通过Z力量将气场实体化,\n向对手全力发动袭击。威力会根据原来的\n招式而改变", - }, - "devastatingDrakeSpecial": { - name: "龙Z究极巨龙震天地", - effect: "通过Z力量将气场实体化,\n向对手全力发动袭击。威力会根据原来的\n招式而改变", - }, - "blackHoleEclipsePhysical": { - name: "恶Z黑洞吞噬万物灭", - effect: "通过Z力量收集恶能量,\n全力将对手吸入。威力会根据原来的招式而改变", - }, - "blackHoleEclipseSpecial": { - name: "恶Z黑洞吞噬万物灭", - effect: "通过Z力量收集恶能量,\n全力将对手吸入。威力会根据原来的招式而改变", - }, - "twinkleTacklePhysical": { - name: "妖精Z可爱星星飞天撞", - effect: "通过Z力量制造魅惑空间,\n全力捉弄对手。威力会根据原来的招式而改变", - }, - "twinkleTackleSpecial": { - name: "妖精Z可爱星星飞天撞", - effect: "通过Z力量制造魅惑空间,\n全力捉弄对手。威力会根据原来的招式而改变", - }, - "catastropika": { - name: "皮卡丘Z皮卡皮卡必杀击", - effect: "通过Z力量,皮卡丘全身覆盖最强电力,\n全力猛扑对手", - }, - "shoreUp": { - name: "集沙", - effect: "回复自己最大HP的一半。\n在沙暴中回复得更多", - }, - "firstImpression": { - name: "迎头一击", - effect: "威力很高的招式,但只有在出场战斗时,\n立刻使出才能成功", - }, - "banefulBunker": { - name: "碉堡", - effect: "防住对手攻击的同时,\n让接触到自己的对手中毒", - }, - "spiritShackle": { - name: "缝影", - effect: "攻击的同时,缝住对手的影子,\n使其无法逃走", - }, - "darkestLariat": { - name: "DD金勾臂", - effect: "旋转双臂打向对手。无视对手的能力变化,\n直接给予伤害", - }, - "sparklingAria": { - name: "泡影的咏叹调", - effect: "随着唱歌会放出很多气球。\n受到此招式攻击时,灼伤会被治愈", - }, - "iceHammer": { - name: "冰锤", - effect: "挥舞强力而沉重的拳头,\n给予对手伤害。自己的速度会降低", - }, - "floralHealing": { - name: "花疗", - effect: "回复对手最大HP的一半。\n在青草场地时,效果会提高", - }, - "highHorsepower": { - name: "十万马力", - effect: "使出全身力量,猛攻对手", - }, - "strengthSap": { - name: "吸取力量", - effect: "给自己回复和对手攻击力相同数值的HP,\n然后降低对手的攻击", - }, - "solarBlade": { - name: "日光刃", - effect: "第1回合收集满满的日光,\n第2回合将此力量集中在剑上进行攻击", - }, - "leafage": { - name: "树叶", - effect: "将叶片打向对手,进行攻击", - }, - "spotlight": { - name: "聚光灯", - effect: "给宝可梦打上聚光灯,\n该回合只能瞄准该宝可梦", - }, - "toxicThread": { - name: "毒丝", - effect: "将混有毒的丝吐向对手。\n使其中毒,从而降低对手的速度", - }, - "laserFocus": { - name: "磨砺", - effect: "集中精神,下次攻击必定会击中要害", - }, - "gearUp": { - name: "辅助齿轮", - effect: "启动齿轮,提高特性为正电和负电\n的宝可梦的攻击和特攻", - }, - "throatChop": { - name: "深渊突刺", - effect: "受到此招式攻击的对手,\n会因为地狱般的痛苦,在2回合内,\n变得无法使出声音类招式", - }, - "pollenPuff": { - name: "花粉团", - effect: "对敌人使用是会爆炸的团子。\n对我方使用则是给予回复的团子", - }, - "anchorShot": { - name: "掷锚", - effect: "将锚缠住对手进行攻击。\n使对手无法逃走", - }, - "psychicTerrain": { - name: "精神场地", - effect: "在5回合内,地面上的宝可梦不会\n受到先制招式的攻击。\n超能力属性的招式威力会提高", - }, - "lunge": { - name: "猛扑", - effect: "全力猛扑对手进行攻击。\n从而降低对手的攻击", - }, - "fireLash": { - name: "火焰鞭", - effect: "用燃烧的鞭子抽打对手。\n受到攻击的对手防御会降低", - }, - "powerTrip": { - name: "嚣张", - effect: "耀武扬威地攻击对手,\n自己的能力提高得越多,威力就越大", - }, - "burnUp": { - name: "燃尽", - effect: "将自己全身燃烧起火焰来,\n给予对手大大的伤害。自己的火属性将会消失", - }, - "speedSwap": { - name: "速度互换", - effect: "将对手和自己的速度进行互换", - }, - "smartStrike": { - name: "修长之角", - effect: "用尖尖的角刺入对手进行攻击。\n攻击必定会命中", - }, - "purify": { - name: "净化", - effect: "治愈对手的异常状态。\n治愈后可以回复自己的HP", - }, - "revelationDance": { - name: "觉醒之舞", - effect: "全力跳舞进行攻击。此招式的属性\n将变得和自己的属性相同", - }, - "coreEnforcer": { - name: "核心惩罚者", - effect: "如果给予过伤害的对手已经结束行动,\n其特性就会被消除", - }, - "tropKick": { - name: "热带踢", - effect: "向对手使出来自南国的火热脚踢。\n从而降低对手的攻击", - }, - "instruct": { - name: "号令", - effect: "向对手下达指示,让其再次使出刚\n才的招式", - }, - "beakBlast": { - name: "鸟嘴加农炮", - effect: "先加热鸟嘴后再进行攻击。\n鸟嘴在加热时对手触碰的话,\n就会使其灼伤", - }, - "clangingScales": { - name: "鳞片噪音", - effect: "摩擦全身鳞片,发出响亮的声音进行攻击。\n攻击后自己的防御会降低", - }, - "dragonHammer": { - name: "龙锤", - effect: "将身体当作锤子,向对手发动袭击,\n给予伤害", - }, - "brutalSwing": { - name: "狂舞挥打", - effect: "用自己的身体狂舞挥打,\n给予对手伤害", - }, - "auroraVeil": { - name: "极光幕", - effect: "在5回合内减弱物理和特殊的伤害。\n只有下雪时才能使出", - }, - "sinisterArrowRaid": { - name: "狙射树枭Z遮天蔽日暗影箭", - effect: "通过Z力量制造出无数箭的狙射树\n枭将全力射穿对手进行攻击", - }, - "maliciousMoonsault": { - name: "炽焰咆哮虎Z极恶飞跃粉碎击", - effect: "通过Z力量得到强壮肉体的炽焰咆\n哮虎将全力撞向对手进行攻击", - }, - "oceanicOperetta": { - name: "西狮海壬Z海神庄严交响乐", - effect: "通过Z力量召唤大量水的西狮海壬\n将全力攻击对手", - }, - "guardianOfAlola": { - name: "卡璞Z巨人卫士・阿罗拉", - effect: "通过Z力量得到阿罗拉之力的土地\n神宝可梦将全力进行攻击。\n对手的剩余HP会减少很多", - }, - "soulStealing7StarStrike": { - name: "玛夏多Z七星夺魂腿", - effect: "得到Z力量的玛夏多将全力使出拳\n头和脚踢的连续招式叩打对手", - }, - "stokedSparksurfer": { - name: "阿罗雷Z驾雷驭电戏冲浪", - effect: "得到Z力量的阿罗拉地区的雷丘将\n全力进行攻击。从而让对手陷入麻痹状态", - }, - "pulverizingPancake": { - name: "卡比兽Z认真起来大爆击", - effect: "通过Z力量使得认真起来的卡比兽\n跃动巨大身躯,全力向对手发动袭击", - }, - "extremeEvoboost": { - name: "伊布Z九彩昇华齐聚顶", - effect: "得到Z力量的伊布将借助进化后伙\n伴们的力量,大幅提高能力", - }, - "genesisSupernova": { - name: "梦幻Z起源超新星大爆炸", - effect: "得到Z力量的梦幻将全力攻击对手。\n脚下会变成精神场地", - }, - "shellTrap": { - name: "陷阱甲壳", - effect: "设下甲壳陷阱。如果对手使出物理招式,\n陷阱就会爆炸并给予对手伤害", - }, - "fleurCannon": { - name: "花朵加农炮", - effect: "放出强力光束后,自己的特攻会大幅降低", - }, - "psychicFangs": { - name: "精神之牙", - effect: "利用精神力量咬住对手进行攻击。\n还可以破坏光墙和反射壁等", - }, - "stompingTantrum": { - name: "跺脚", - effect: "化悔恨为力量进行攻击。\n如果上一回合招式没有打中,威力就会翻倍", - }, - "shadowBone": { - name: "暗影之骨", - effect: "用附有灵魂的骨头殴打对手进行攻击。\n有时会降低对手的防御", - }, - "accelerock": { - name: "冲岩", - effect: "迅速撞向对手进行攻击。\n必定能够先制攻击", - }, - "liquidation": { - name: "水流裂破", - effect: "用水之力量撞向对手进行攻击。\n有时会降低对手的防御", - }, - "prismaticLaser": { - name: "棱镜镭射", - effect: "用棱镜的力量发射强烈光线。\n下一回合自己将无法动弹", - }, - "spectralThief": { - name: "暗影偷盗", - effect: "潜入对手的影子进行攻击。\n会夺取对手的能力提升", - }, - "sunsteelStrike": { - name: "流星闪冲", - effect: "以流星般的气势猛撞对手。\n可以无视对手的特性进行攻击", - }, - "moongeistBeam": { - name: "暗影之光", - effect: "放出奇怪的光线攻击对手。\n可以无视对手的特性进行攻击", - }, - "tearfulLook": { - name: "泪眼汪汪", - effect: "变得泪眼汪汪,让对手丧失斗志。\n从而降低对手的攻击和特攻", - }, - "zingZap": { - name: "麻麻刺刺", - effect: "撞向对手,并发出强电,\n使其感到麻麻刺刺的。有时会使对手畏缩", - }, - "naturesMadness": { - name: "自然之怒", - effect: "向对手释放自然之怒。\n对手的HP会减半", - }, - "multiAttack": { - name: "多属性攻击", - effect: "一边覆盖高能量,一边撞向对手进行攻击。\n根据存储碟不同,\n属性会改变", - }, - "tenMillionVoltThunderbolt": { - name: "智皮卡Z千万伏特", - effect: "戴着帽子的皮卡丘将通过Z力量增\n强的电击全力释放给对手。\n容易击中要害", - }, - "mindBlown": { - name: "惊爆大头", - effect: "让自己的头爆炸,来攻击周围的一切。\n自己也会受到伤害", - }, - "plasmaFists": { - name: "等离子闪电拳", - effect: "用覆盖着电流的拳头进行攻击。\n使一般属性的招式变成电属性", - }, - "photonGeyser": { - name: "光子喷涌", - effect: "用光柱来进行攻击。比较自己的攻\n击和特攻,用数值相对较高的一项\n给予对方伤害", - }, - "lightThatBurnsTheSky": { - name: "究极奈克洛Z焚天灭世炽光爆", - effect: "奈克洛兹玛会无视对手的特性效果,\n在攻击和特攻之间,\n用数值相对较高的一项给予对方伤害", - }, - "searingSunrazeSmash": { - name: "索尔迦雷欧Z日光回旋下苍穹", - effect: "得到Z力量的索尔迦雷欧将全力进行攻击。\n可以无视对手的特性效果", - }, - "menacingMoonrazeMaelstrom": { - name: "露奈雅拉Z月华飞溅落灵霄", - effect: "得到Z力量的露奈雅拉将全力进行攻击。\n可以无视对手的特性效果", - }, - "letsSnuggleForever": { - name: "谜拟丘Z亲密无间大乱揍", - effect: "得到Z力量的谜拟Q将全力进行乱揍攻击", - }, - "splinteredStormshards": { - name: "鬃岩狼人Z狼啸石牙飓风暴", - effect: "得到Z力量的鬃岩狼人将全力进行攻击。\n而且会消除场地状态", - }, - "clangorousSoulblaze": { - name: "杖尾鳞甲龙Z炽魂热舞烈音爆", - effect: "得到Z力量的杖尾鳞甲龙将全力攻击对手。\n并且自己的能力会提高", - }, - "zippyZap": { - name: "电电加速", - effect: "迅猛无比的电击。必定能够先制攻击,\n并且提高自己的闪避率。", - }, - "splishySplash": { - name: "滔滔冲浪", - effect: "往巨浪中注入电能后冲撞对手进行攻击。\n有时会让对手陷入麻痹状态", - }, - "floatyFall": { - name: "飘飘坠落", - effect: "轻飘飘地浮起来后,再猛地俯冲下\n去进行攻击。有时会使对手畏缩", - }, - "pikaPapow": { - name: "闪闪雷光", - effect: "皮卡丘越喜欢训练家,\n电击的威力就越强。攻击必定会命中", - }, - "bouncyBubble": { - name: "活活气泡", - effect: "投掷水球进行攻击。吸水后能回复\n等同于造成的伤害的HP", - }, - "buzzyBuzz": { - name: "麻麻电击", - effect: "放出电击攻击对手。让对手陷入麻痹状态", - }, - "sizzlySlide": { - name: "熊熊火爆", - effect: "用燃起大火的身体猛烈地冲撞对手。\n让对手陷入灼伤状态", - }, - "glitzyGlow": { - name: "哗哗气场", - effect: "利用念力强攻,粉碎对方信心。\n制造一道能减弱对手特殊攻击的神奇墙壁", - }, - "baddyBad": { - name: "坏坏领域", - effect: "恶行恶相地进行攻击。\n制造一道能减弱对手物理攻击的神奇墙壁", - }, - "sappySeed": { - name: "茁茁炸弹", - effect: "长出巨大的藤蔓,播撒种子进行攻击。\n种子每回合都会吸取对手的HP", - }, - "freezyFrost": { - name: "冰冰霜冻", - effect: "利用冰冷的黑雾结晶进行攻击。\n使全体宝可梦的能力变回原点", - }, - "sparklySwirl": { - name: "亮亮风暴", - effect: "利用芬芳刺鼻的龙卷风吞噬对方。\n能治愈我方宝可梦的异常状态", - }, - "veeveeVolley": { - name: "砰砰击破", - effect: "伊布越喜欢训练家,冲撞的威力就越强。\n攻击必定会命中", - }, - "doubleIronBash": { - name: "钢拳双击", - effect: "以胸口的螺帽为中心旋转,\n并连续2次挥动手臂打击对手。\n有时会使对手畏缩", - }, - "maxGuard": { - name: "极巨防壁", - effect: "完全抵挡对手的攻击。\n连续使出则容易失败", - }, - "dynamaxCannon": { - name: "极巨炮", - effect: "将凝缩在体内的能量从核心放出进行攻击", - }, - "snipeShot": { - name: "狙击", - effect: "能无视具有吸引对手招式效果的特\n性或招式的影响。可以向选定的对\n手进行攻击", - }, - "jawLock": { - name: "紧咬不放", - effect: "使双方直到一方昏厥为止无法替换宝可梦。\n其中一方退场则可以解除效果", - }, - "stuffCheeks": { - name: "大快朵颐", - effect: "吃掉携带的树果,大幅提高防御", - }, - "noRetreat": { - name: "背水一战", - effect: "提高自己的所有能力,\n但无法替换或逃走", - }, - "tarShot": { - name: "沥青射击", - effect: "泼洒黏糊糊的沥青,降低对手的速度。\n火属性会变成对手的弱点", - }, - "magicPowder": { - name: "魔法粉", - effect: "向对手喷洒魔法粉,使对手变为超\n能力属性", - }, - "dragonDarts": { - name: "龙箭", - effect: "让多龙梅西亚进行2次攻击。\n如果对手有2只宝可梦,则对它们各进\n行1次攻击", - }, - "teatime": { - name: "茶会", - effect: "举办一场茶会,场上的所有宝可梦\n都会吃掉自己携带的树果", - }, - "octolock": { - name: "蛸固", - effect: "让对手无法逃走。对手被固定后,\n每回合都会降低防御和特防", - }, - "boltBeak": { - name: "电喙", - effect: "用带电的喙啄刺对手。\n如果比对手先出手攻击,招式的威力会变成2倍", - }, - "fishiousRend": { - name: "鳃咬", - effect: "用坚硬的腮咬住对手。\n如果比对手先出手攻击,招式的威力会变成2倍", - }, - "courtChange": { - name: "换场", - effect: "用神奇的力量交换双方的场地效果", - }, - "maxFlare": { - name: "极巨火爆", - effect: "极巨化宝可梦使出的火属性攻击。\n可在5回合内让日照变得强烈", - }, - "maxFlutterby": { - name: "极巨虫蛊", - effect: "极巨化宝可梦使出的虫属性攻击。\n会降低对手的特攻", - }, - "maxLightning": { - name: "极巨闪电", - effect: "极巨化宝可梦使出的电属性攻击。\n可在5回合内将脚下变成电气场地", - }, - "maxStrike": { - name: "极巨攻击", - effect: "极巨化宝可梦使出的一般属性攻击。\n会降低对手的速度", - }, - "maxKnuckle": { - name: "极巨拳斗", - effect: "极巨化宝可梦使出的格斗属性攻击。\n会提高我方的攻击", - }, - "maxPhantasm": { - name: "极巨幽魂", - effect: "极巨化宝可梦使出的幽灵属性攻击。\n会降低对手的防御", - }, - "maxHailstorm": { - name: "极巨寒冰", - effect: "极巨化宝可梦使出的冰属性攻击。\n在5回合内会下雪", - }, - "maxOoze": { - name: "极巨酸毒", - effect: "极巨化宝可梦使出的毒属性攻击。\n会提高我方的特攻", - }, - "maxGeyser": { - name: "极巨水流", - effect: "极巨化宝可梦使出的水属性攻击。\n可在5回合内降下大雨", - }, - "maxAirstream": { - name: "极巨飞冲", - effect: "极巨化宝可梦使出的飞行属性攻击。\n会提高我方的速度", - }, - "maxStarfall": { - name: "极巨妖精", - effect: "极巨化宝可梦使出的妖精属性攻击。\n可在5回合内将脚下变成薄雾场地", - }, - "maxWyrmwind": { - name: "极巨龙骑", - effect: "极巨化宝可梦使出的龙属性攻击。\n会降低对手的攻击", - }, - "maxMindstorm": { - name: "极巨超能", - effect: "极巨化宝可梦使出的超能力属性攻击。\n可在5回合内将脚下变成精神场地", - }, - "maxRockfall": { - name: "极巨岩石", - effect: "极巨化宝可梦使出的岩石属性攻击。\n可在5回合内卷起沙暴", - }, - "maxQuake": { - name: "极巨大地", - effect: "极巨化宝可梦使出的地面属性攻击。\n会提高我方的特防", - }, - "maxDarkness": { - name: "极巨恶霸", - effect: "极巨化宝可梦使出的恶属性攻击。\n会降低对手的特防", - }, - "maxOvergrowth": { - name: "极巨草原", - effect: "极巨化宝可梦使出的草属性攻击。\n可在5回合内将脚下变成青草场地", - }, - "maxSteelspike": { - name: "极巨钢铁", - effect: "极巨化宝可梦使出的钢属性攻击。\n会提高我方的防御", - }, - "clangorousSoul": { - name: "魂舞烈音爆", - effect: "削减少许自己的HP,\n使所有能力都提高", - }, - "bodyPress": { - name: "扑击", - effect: "用身体撞向对手进行攻击。\n防御越高,给予的伤害就越高", - }, - "decorate": { - name: "装饰", - effect: "通过装饰,大幅提高对方的攻击和特攻", - }, - "drumBeating": { - name: "鼓击", - effect: "用鼓点来控制鼓的根部进行攻击,\n从而降低对手的速度", - }, - "snapTrap": { - name: "捕兽夹", - effect: "使用捕兽夹,在4~5回合内,\n夹住对手进行攻击", - }, - "pyroBall": { - name: "火焰球", - effect: "点燃小石子,形成火球攻击对手。\n有时会使对手陷入灼伤状态", - }, - "behemothBlade": { - name: "巨兽斩", - effect: "以全身力气举起强大的剑,\n猛烈地劈向对手进行攻击", - }, - "behemothBash": { - name: "巨兽弹", - effect: "将全身变化为坚固的盾,\n猛烈地撞向对手进行攻击", - }, - "auraWheel": { - name: "气场轮", - effect: "用储存在颊囊里的能量进行攻击,\n并提高自己的速度。其属性会随着\n莫鲁贝可的样子而改变", - }, - "breakingSwipe": { - name: "广域破坏", - effect: "用坚韧的尾巴猛扫对手进行攻击,\n从而降低对手的攻击", - }, - "branchPoke": { - name: "木枝突刺", - effect: "使用尖锐的树枝刺向对手进行攻击", - }, - "overdrive": { - name: "破音", - effect: "奏响吉他和贝斯,释放出发出巨响\n的剧烈震动攻击对手", - }, - "appleAcid": { - name: "苹果酸", - effect: "使用从酸苹果中提取出来的酸性液\n体进行攻击。降低对手的特防", - }, - "gravApple": { - name: "万有引力", - effect: "从高处落下苹果,给予对手伤害。\n可降低对手的防御", - }, - "spiritBreak": { - name: "灵魂冲击", - effect: "用足以让对手一蹶不振的气势进行攻击。\n会降低对手的特攻", - }, - "strangeSteam": { - name: "神奇蒸汽", - effect: "喷出烟雾攻击对手。有时会使对手混乱", - }, - "lifeDew": { - name: "生命水滴", - effect: "喷洒出神奇的水,回复自己和场上\n同伴的HP", - }, - "obstruct": { - name: "拦堵", - effect: "完全抵挡对手的攻击。\n连续使出则容易失败。一旦触碰,\n防御就会大幅降低", - }, - "falseSurrender": { - name: "假跪真撞", - effect: "装作低头认错的样子,\n用凌乱的头发进行突刺。攻击必定会命中", - }, - "meteorAssault": { - name: "流星突击", - effect: "大力挥舞粗壮的茎进行攻击。\n但同时自己也会被晃晕,下一回合自己\n将无法动弹", - }, - "eternabeam": { - name: "无极光束", - effect: "无极汰那变回原来的样子后,\n发动的最强攻击。下一回合自己将无法动弹", - }, - "steelBeam": { - name: "铁蹄光线", - effect: "将从全身聚集的钢铁化为光束,\n激烈地发射出去。自己也会受到伤害", - }, - "expandingForce": { - name: "广域战力", - effect: "利用精神力量攻击对手。\n在精神场地上威力会有所提高,\n能对所有对手造成伤害", - }, - "steelRoller": { - name: "铁滚轮", - effect: "在破坏场地的同时攻击对手。\n如果脚下没有任何场地状态存在,\n使出此招式时便会失败", - }, - "scaleShot": { - name: "鳞射", - effect: "发射鳞片进行攻击。连续攻击2~5次。\n速度会提高但防御会降低", - }, - "meteorBeam": { - name: "流星光束", - effect: "第1回合聚集宇宙之力提高特攻,\n第2回合攻击对手", - }, - "shellSideArm": { - name: "臂贝武器", - effect: "从物理攻击和特殊攻击中选择可造\n成较多伤害的方式进行攻击。\n有时会让对手陷入中毒状态", - }, - "mistyExplosion": { - name: "薄雾炸裂", - effect: "对自己周围的所有宝可梦进行攻击,\n但使出后,自己会陷入昏厥。\n在薄雾场地上,招式威力会提高", - }, - "grassyGlide": { - name: "青草滑梯", - effect: "仿佛在地面上滑行般地攻击对手。\n在青草场地上,必定能够先制攻击", - }, - "risingVoltage": { - name: "电力上升", - effect: "用从地面升腾而起的电击进行攻击。\n当对手处于电气场地上时,\n招式威力会变成2倍", - }, - "terrainPulse": { - name: "大地波动", - effect: "借助场地的力量进行攻击。\n视使出招式时场地状态不同,\n招式的属性和威力会有所变化", - }, - "skitterSmack": { - name: "爬击", - effect: "从对手背后爬近后进行攻击。\n会降低对手的特攻", - }, - "burningJealousy": { - name: "妒火", - effect: "用嫉妒的能量攻击对手。\n会让在该回合内能力有所提高的宝可梦陷入\n灼伤状态", - }, - "lashOut": { - name: "泄愤", - effect: "攻击对手以发泄对其感到的恼怒情绪。\n如果在该回合内自身能力遭到降低,\n招式的威力会变成2倍", - }, - "poltergeist": { - name: "灵骚", - effect: "操纵对手的持有物进行攻击。\n当对手没有携带道具时,使出此招式时\n便会失败", - }, - "corrosiveGas": { - name: "腐蚀气体", - effect: "用具有强酸性的气体包裹住自己周\n围所有的宝可梦,并融化其所携带的道具", - }, - "coaching": { - name: "指导", - effect: "通过进行正确合理的指导,\n提高我方全员的攻击和防御", - }, - "flipTurn": { - name: "快速折返", - effect: "在攻击之后急速返回,\n和后备宝可梦进行替换", - }, - "tripleAxel": { - name: "三旋击", - effect: "连续3次踢对手进行攻击。\n每踢中一次,威力就会提高", - }, - "dualWingbeat": { - name: "双翼", - effect: "将翅膀撞向对手进行攻击。\n连续2次给予伤害", - }, - "scorchingSands": { - name: "热沙大地", - effect: "将滚烫的沙子砸向对手进行攻击。\n有时会让对手陷入灼伤状态", - }, - "jungleHealing": { - name: "丛林治疗", - effect: "与丛林融为一体,回复自己和场上\n同伴的HP和状态", - }, - "wickedBlow": { - name: "暗冥强击", - effect: "将恶之流派修炼至大成的猛烈一击。\n必定会击中要害", - }, - "surgingStrikes": { - name: "水流连打", - effect: "将水之流派修炼至大成的仿若行云\n流水般的3次连击。必定会击中要害", - }, - "thunderCage": { - name: "雷电囚笼", - effect: "将对手困在电流四溅的囚笼中,\n在4~5回合内进行攻击", - }, - "dragonEnergy": { - name: "巨龙威能", - effect: "把生命力转换为力量攻击对手。\n自己的HP越少,招式的威力越小", - }, - "freezingGlare": { - name: "冰冷视线", - effect: "从双眼发射精神力量进行攻击。\n有时会让对手陷入冰冻状态", - }, - "fieryWrath": { - name: "怒火中烧", - effect: "将愤怒转化为火焰般的气场进行攻击。\n有时会使对手畏缩", - }, - "thunderousKick": { - name: "雷鸣蹴击", - effect: "以雷电般的动作戏耍对手的同时使出脚踢。\n可降低对手的防御", - }, - "glacialLance": { - name: "雪矛", - effect: "向对手投掷掀起暴风雪的冰矛进行攻击", - }, - "astralBarrage": { - name: "星碎", - effect: "用大量的小灵体向对手发起攻击", - }, - "eerieSpell": { - name: "诡异咒语", - effect: "用强大的精神力量攻击。\n让对手最后使用的招式减少3PP", - }, - "direClaw": { - name: "克命爪", - effect: "以破灭之爪进行攻击。\n有时还会让对手陷入中毒、麻痹、睡眠之中的\n一种状态", - }, - "psyshieldBash": { - name: "屏障猛攻", - effect: "让意念的能量覆盖全身,\n撞向对手进行攻击。会提高自己的防御", - }, - "powerShift": { - name: "力量转换", - effect: "将自己的攻击与防御互相交换", - }, - "stoneAxe": { - name: "岩斧", - effect: "用岩石之斧进行攻击。\n散落的岩石碎片会飘浮在对手周围", - }, - "springtideStorm": { - name: "阳春风暴", - effect: "用交织着爱与恨的烈风席卷对手进行攻击。\n有时会降低对手的攻击", - }, - "mysticalPower": { - name: "神秘之力", - effect: "放出不可思议的力量攻击。\n会提高自己的特攻", - }, - "ragingFury": { - name: "大愤慨", - effect: "在2~3回合内,一边放出火焰,\n一边疯狂乱打。大闹一番后自己会\n陷入混乱", - }, - "waveCrash": { - name: "波动冲", - effect: "让水覆盖全身后撞向对手。\n自己也会受到不少伤害", - }, - "chloroblast": { - name: "叶绿爆震", - effect: "将自己的叶绿素凝聚起来后放出去\n进行攻击。自己也会受到伤害", - }, - "mountainGale": { - name: "冰山风", - effect: "将冰山般巨大的冰块砸向对手进行攻击。\n有时会使对手畏缩", - }, - "victoryDance": { - name: "胜利之舞", - effect: "激烈地跳起唤来胜利的舞蹈,\n提高自己的攻击、防御和速度", - }, - "headlongRush": { - name: "突飞猛扑", - effect: "向对手使出灌注了全心全力的撞击。\n自己的防御和特防会降低", - }, - "barbBarrage": { - name: "毒千针", - effect: "用无数的毒针进行攻击。\n有时还会让对手陷入中毒状态。\n攻击处于中毒状态的对手时,威力会变成2倍", - }, - "esperWing": { - name: "气场之翼", - effect: "用经过气场强化的翅膀撕裂对手。\n容易击中要害。会提高自己的速度", - }, - "bitterMalice": { - name: "冤冤相报", - effect: "用令人毛骨悚然的怨念进行攻击。\n会降低对手的攻击", - }, - "shelter": { - name: "闭关", - effect: "将皮肤变得坚硬如铁盾,\n从而大幅提高自己的防御", - }, - "tripleArrows": { - name: "三连箭", - effect: "使出一记腿技后同时发射3箭。\n有时会降低对手的防御或使对手畏缩。\n容易击中要害", - }, - "infernalParade": { - name: "群魔乱舞", - effect: "用无数的火球进行攻击。\n有时会让对手陷入灼伤状态。攻击处于异常\n状态的对手时,威力会变成2倍", - }, - "ceaselessEdge": { - name: "秘剑・千重涛", - effect: "用贝壳之剑进行攻击。\n散落的贝壳碎片会散落在对手脚下成为撒菱", - }, - "bleakwindStorm": { - name: "枯叶风暴", - effect: "用足以让身心都止不住颤抖的冰冷\n狂风进行攻击。有时会降低对手的速度", - }, - "wildboltStorm": { - name: "鸣雷风暴", - effect: "呼唤雷云引起风暴,用雷与风进行\n激烈的攻击。有时会让对手陷入麻痹状态", - }, - "sandsearStorm": { - name: "热沙风暴", - effect: "用灼热的沙子和强烈的风席卷对手\n进行攻击。有时会让对手陷入灼伤状态", - }, - "lunarBlessing": { - name: "新月祈祷", - effect: "向新月献上祈祷,回复自己和场上\n同伴的HP和状态", - }, - "takeHeart": { - name: "勇气填充", - effect: "鼓起冲劲,治愈自己的异常状态,\n同时提高自己的特攻和特防", - }, - "gMaxWildfire": { - name: "超极巨深渊灭焰", - effect: "超极巨化的喷火龙使出的火属性攻击。\n可在4回合内给予对手伤害", - }, - "gMaxBefuddle": { - name: "超极巨蝶影蛊惑", - effect: "超极巨化的巴大蝶使出的虫属性攻击。\n会让对手陷入中毒、麻痹或睡眠状态", - }, - "gMaxVoltCrash": { - name: "超极巨万雷轰顶", - effect: "超极巨化的皮卡丘使出的电属性攻击。\n会让对手陷入麻痹状态", - }, - "gMaxGoldRush": { - name: "超极巨特大金币", - effect: "超极巨化的喵喵使出的一般属性攻击。\n会让对手陷入混乱状态,\n并可获得金钱", - }, - "gMaxChiStrike": { - name: "超极巨会心一击", - effect: "超极巨化的怪力使出的格斗属性攻击。\n会变得容易击中要害", - }, - "gMaxTerror": { - name: "超极巨幻影幽魂", - effect: "超极巨化的耿鬼使出的幽灵属性攻击。\n会踩住对手的影子,\n让其无法被替换", - }, - "gMaxResonance": { - name: "超极巨极光旋律", - effect: "超极巨化的拉普拉斯使出的冰属性攻击。\n可在5回合内减弱受到的伤害", - }, - "gMaxCuddle": { - name: "超极巨热情拥抱", - effect: "超极巨化的伊布使出的一般属性攻击。\n会让对手陷入着迷状态", - }, - "gMaxReplenish": { - name: "超极巨资源再生", - effect: "超极巨化的卡比兽使出的一般属性攻击。\n会让吃掉的树果再生", - }, - "gMaxMalodor": { - name: "超极巨臭气冲天", - effect: "超极巨化的灰尘山使出的毒属性攻击。\n会让对手陷入中毒状态", - }, - "gMaxStonesurge": { - name: "超极巨岩阵以待", - effect: "超极巨化的暴噬龟使出的水属性攻击。\n会发射无数锐利的岩石", - }, - "gMaxWindRage": { - name: "超极巨旋风袭卷", - effect: "超极巨化的钢铠鸦使出的飞行属性攻击。\n可消除反射壁和光墙", - }, - "gMaxStunShock": { - name: "超极巨异毒电场", - effect: "超极巨化的颤弦蝾螈使出的电属性攻击。\n会让对手陷入中毒或麻痹状态", - }, - "gMaxFinale": { - name: "超极巨幸福圆满", - effect: "超极巨化的霜奶仙使出的妖精属性攻击。\n可回复我方的HP", - }, - "gMaxDepletion": { - name: "超极巨劣化衰变", - effect: "超极巨化的铝钢龙使出的龙属性攻击。\n可减少对手最后使用的招式的PP", - }, - "gMaxGravitas": { - name: "超极巨天道七星", - effect: "超极巨化的以欧路普使出的超能力\n属性攻击。在5回合内重力会产生变化", - }, - "gMaxVolcalith": { - name: "超极巨炎石喷发", - effect: "超极巨化的巨炭山使出的岩石属性攻击。\n可在4回合内给予对手伤害", - }, - "gMaxSandblast": { - name: "超极巨沙尘漫天", - effect: "超极巨化的沙螺蟒使出的地面属性攻击。\n在4~5回合内会狂刮沙暴", - }, - "gMaxSnooze": { - name: "超极巨睡魔降临", - effect: "超极巨化的长毛巨魔使出的恶属性攻击。\n会通过打大哈欠让对手产生睡意", - }, - "gMaxTartness": { - name: "超极巨酸不溜丢", - effect: "超极巨化的苹裹龙使出的草属性攻击。\n会降低对手的闪避率", - }, - "gMaxSweetness": { - name: "超极巨琼浆玉液", - effect: "超极巨化的丰蜜龙使出的草属性攻击。\n会治愈我方的异常状态", - }, - "gMaxSmite": { - name: "超极巨天谴雷诛", - effect: "超极巨化的布莉姆温使出的妖精属性攻击。\n会让对手陷入混乱状态", - }, - "gMaxSteelsurge": { - name: "超极巨钢铁阵法", - effect: "超极巨化的大王铜象使出的钢属性攻击。\n会发射无数锐利的刺", - }, - "gMaxMeltdown": { - name: "超极巨液金熔击", - effect: "超极巨化的美录梅塔使出的钢属性攻击。\n会让对手无法连续使出相同的招式", - }, - "gMaxFoamBurst": { - name: "超极巨激漩泡涡", - effect: "超极巨化的巨钳蟹使出的水属性攻击。\n会大幅降低对手的速度", - }, - "gMaxCentiferno": { - name: "超极巨百火焚野", - effect: "超极巨化的焚焰蚣使出的火属性攻击。\n可在4~5回合内将对手困在火焰中", - }, - "gMaxVineLash": { - name: "超极巨灰飞鞭灭", - effect: "超极巨化的妙蛙花使出的草属性攻击。\n可在4回合内给予对手伤害", - }, - "gMaxCannonade": { - name: "超极巨水炮轰灭", - effect: "超极巨化的水箭龟使出的水属性攻击。\n可在4回合内给予对手伤害", - }, - "gMaxDrumSolo": { - name: "超极巨狂擂乱打", - effect: "超极巨化的轰擂金刚猩使出的草属性攻击。\n不会受到对手特性的干扰", - }, - "gMaxFireball": { - name: "超极巨破阵火球", - effect: "超极巨化的闪焰王牌使出的火属性攻击。\n不会受到对手特性的干扰", - }, - "gMaxHydrosnipe": { - name: "超极巨狙击神射", - effect: "超极巨化的千面避役使出的水属性攻击。\n不会受到对手特性的干扰", - }, - "gMaxOneBlow": { - name: "超极巨夺命一击", - effect: "超极巨化的武道熊师使出的恶属性攻击。\n是可以无视极巨防壁的一击", - }, - "gMaxRapidFlow": { - name: "超极巨流水连击", - effect: "超极巨化的武道熊师使出的水属性攻击。\n是可以无视极巨防壁的连击", - }, - "teraBlast": { - name: "太晶爆发", - effect: "太晶化时,会放出太晶属性的能量攻击。\n比较自己的攻击和特攻,\n用数值相对较高的一项给予对方伤害。\n(其他属性)/用攻击和特攻数\n值较高的一项给予伤害。\n对正处于太晶化的对手效果绝佳。\n自己的攻击和特攻会降低。(星晶", - }, - "silkTrap": { - name: "线阱", - effect: "用丝设置陷阱。防住对方攻击的同时,\n能够降低所接触到的对手的速度", - }, - "axeKick": { - name: "下压踢", - effect: "将踢起的脚跟往下劈向对手进行攻击。\n有时会使对手混乱。\n如果劈偏则自己会受到伤害", - }, - "lastRespects": { - name: "扫墓", - effect: "为了化解伙伴的悔恨而进行攻击。\n被打倒的我方宝可梦越多,\n招式的威力越高", - }, - "luminaCrash": { - name: "琉光冲激", - effect: "放出连精神都能影响到的奇妙怪光\n进行攻击。会大幅降低对方的特防", - }, - "orderUp": { - name: "上菜", - effect: "以潇洒的身手进行攻击。\n若口中有米立龙,会按其样子提高能力", - }, - "jetPunch": { - name: "喷射拳", - effect: "将激流覆盖于拳头,以肉眼无法辨\n识的速度打出拳击。必定能够先制攻击", - }, - "spicyExtract": { - name: "辣椒精华", - effect: "放出极为辛辣的精华。\n对手的攻击会大幅提高,防御会大幅降低", - }, - "spinOut": { - name: "疾速转轮", - effect: "通过往腿上增加负荷,\n以激烈的旋转给予对手伤害。自己的速度会大幅降低", - }, - "populationBomb": { - name: "鼠数儿", - effect: "伙伴们会纷纷赶来集合,\n以群体行动给予对手攻击。连续命中1~10次", - }, - "iceSpinner": { - name: "冰旋", - effect: "脚上覆盖薄冰,旋转着撞击对手。\n通过旋转的动作破坏场地", - }, - "glaiveRush": { - name: "巨剑突击", - effect: "有勇无谋的舍身突击。使出招式后,\n对手的攻击必定会命中,\n且伤害会变成2倍", - }, - "revivalBlessing": { - name: "复生祈祷", - effect: "通过以慈爱之心祈祷,\n让陷入昏厥的后备宝可梦以回复一半HP的状态复活", - }, - "saltCure": { - name: "盐腌", - effect: "使对手陷入盐腌状态,\n每回合给予对手伤害。对手为钢或水属性时会更痛苦", - }, - "tripleDive": { - name: "三连钻", - effect: "以默契的跳跃溅起水花击向对手。\n连续3次给予伤害", - }, - "mortalSpin": { - name: "晶光转转", - effect: "通过旋转来攻击对手。\n可以摆脱绑紧、紧束、寄生种子等招式。\n还能让对手陷入中毒状态", - }, - "doodle": { - name: "描绘", - effect: "把握并映射出对手的本质,\n让自己和同伴宝可梦的特性变得和对手相同", - }, - "filletAway": { - name: "甩肉", - effect: "削减自己的HP,大幅提高攻击和\n特攻以及速度", - }, - "kowtowCleave": { - name: "仆刀", - effect: "下跪让对手大意后发起袭击劈向对手。\n攻击必定会命中", - }, - "flowerTrick": { - name: "千变万花", - effect: "将做了手脚的花束扔向对手进行攻击。\n必定会命中,且会击中要害", - }, - "torchSong": { - name: "闪焰高歌", - effect: "如唱歌一样喷出熊熊燃烧的火焰烧焦对手。\n会提高自己的特攻", - }, - "aquaStep": { - name: "流水旋舞", - effect: "以盈盈欲滴的轻快步伐戏耍对手并\n给予其伤害。会提高自己的速度", - }, - "ragingBull": { - name: "怒牛", - effect: "狂怒暴牛的猛烈冲撞。\n招式的属性随形态改变,光墙和反射壁等招式\n也能破坏", - }, - "makeItRain": { - name: "淘金潮", - effect: "扔出大量硬币攻击。自己的特攻会降低,\n战斗后还可以拿到钱", - }, - "psyblade": { - name: "精神剑", - effect: "用无形的利刃劈开对手。\n处于电气场地时,招式威力会变成1.5倍", - }, - "hydroSteam": { - name: "水蒸气", - effect: "将煮得翻滚的开水猛烈地喷向对手。\n日照强烈时,招式威力不但不会降低,\n还会变成1.5倍", - }, - "ruination": { - name: "大灾难", - effect: "引发毁灭性的灾厄,使对手的HP减半", - }, - "collisionCourse": { - name: "全开猛撞", - effect: "边变形边凶暴地落下,\n并引发起古老的大爆炸。若针对到弱点,\n威力会进一步", - }, - "electroDrift": { - name: "闪电猛冲", - effect: "边变形边高速奔走,并以未知的电\n击贯穿对手。若针对到弱点,\n威力会进一步", - }, - "shedTail": { - name: "断尾", - effect: "削减自己的HP,制造分身后会返回,\n并和后备宝可梦进行替换", - }, - "chillyReception": { - name: "冷笑话", - effect: "留下冷场的冷笑话后,\n和后备宝可梦进行替换。在5回合内会下雪", - }, - "tidyUp": { - name: "大扫除", - effect: "将撒菱、隐形岩、黏黏网、毒菱、\n替身全部扫除掉。自己的攻击和速\n度会提高", - }, - "snowscape": { - name: "雪景", - effect: "在5回合内会下雪。冰属性的防御会提高", - }, - "pounce": { - name: "虫扑", - effect: "飞扑向对手攻击。会降低对手的速度", - }, - "trailblaze": { - name: "起草", - effect: "跳出草丛进行攻击。通过轻快的步\n伐会提高自己的速度", - }, - "chillingWater": { - name: "泼冷水", - effect: "泼洒冰冷得足以让对手失去活力的\n水进行攻击。会降低对手的攻击", - }, - "hyperDrill": { - name: "强力钻", - effect: "急速旋转尖锐的身体部位贯穿对手。\n可以无视守住和看穿等招式", - }, - "twinBeam": { - name: "双光束", - effect: "从两眼发射出神奇的光线攻击。\n连续2次给予伤害", - }, - "rageFist": { - name: "愤怒之拳", - effect: "将愤怒化为力量攻击。\n受到攻击的次数越多,招式的威力越高", - }, - "armorCannon": { - name: "铠农炮", - effect: "熊熊燃烧自己的铠甲,\n将其做成炮弹射出攻击。自己的防御和特防会降低", - }, - "bitterBlade": { - name: "悔念剑", - effect: "将对世间的留恋聚集于剑尖,\n并斩击对手。可以回复给予对手伤害的\n一半HP", - }, - "doubleShock": { - name: "电光双击", - effect: "将全身所有的电力放出,\n给予对手大大的伤害。自己的电属性将会消失", - }, - "gigatonHammer": { - name: "巨力锤", - effect: "连同身体转起巨大的锤子进行攻击。\n这个招式无法连续使出2次", - }, - "comeuppance": { - name: "复仇", - effect: "使出招式前,将最后受到的招式的\n伤害大力返还给对手", - }, - "aquaCutter": { - name: "水波刀", - effect: "如刀刃般喷射出加压的水切开对手。\n容易击中要害", - }, - "blazingTorque": { - name: "灼热暴冲", - effect: "攻击目标造成伤害,有30%的几\n率使目标陷入灼伤状态。", - }, - "wickedTorque": { - name: "黑暗暴冲", - effect: "攻击目标造成伤害,有30%的几\n率使目标陷入睡眠状态。", - }, - "noxiousTorque": { - name: "剧毒暴冲", - effect: "攻击目标造成伤害,有30%的几\n率使目标陷入中毒状态。", - }, - "combatTorque": { - name: "格斗暴冲", - effect: "攻击目标造成伤害,有30%的几\n率使目标陷入麻痹状态。\n此招式可以命中幽灵属性的宝可梦。", - }, - "magicalTorque": { - name: "魔法暴冲", - effect: "攻击目标造成伤害,有30%的几\n率使目标陷入混乱状态。", - }, - "bloodMoon": { - name: "血月", - effect: "从赤红如血的满月发射出全部的气势。\n这个招式无法连续使出2次", - }, - "matchaGotcha": { - name: "刷刷茶炮", - effect: "发射经搅拌的茶的大炮,\n可以回复给予对手伤害的一半HP,\n有时会让对手陷入灼伤状态", - }, - "syrupBomb": { - name: "糖浆炸弹", - effect: "使粘稠的麦芽糖浆爆炸,\n让对手陷入满身糖状态,在3回合内持续降\n低其速度", - }, - "ivyCudgel": { - name: "棘藤棒", - effect: "用缠有藤蔓的棍棒殴打。\n属性会随所戴的面具而改变。容易击中要害", - }, - "electroShot": { - name: "电光束", - effect: "第1回合收集电力提高特攻,\n第2回合将高压的电力发射出去。\n下雨天气时能立刻发射", - }, - "teraStarstorm": { - name: "晶光星群", - effect: "照射出结晶的力量来驱逐敌人。\n太乐巴戈斯在星晶形态下使出时,\n能对所有对手造成伤害", - }, - "fickleBeam": { - name: "随机光", - effect: "发射光线进行攻击。有时其他的头\n也会合力发射镭射,让招式威力变成2倍", - }, - "burningBulwark": { - name: "火焰守护", - effect: "用超高温的体毛防住对手攻击的同时,\n让接触到自己的对手灼伤", - }, - "thunderclap": { - name: "迅雷", - effect: "可以比对手先使出电击进行攻击。\n对手使出的招式如果不是攻击招式\n则会失败", - }, - "mightyCleave": { - name: "强刃攻击", - effect: "用积蓄在头部的光来斩切对手。\n可以无视守护进行攻击", - }, - "tachyonCutter": { - name: "迅子利刃", - effect: "接连发射出粒子的利刃,\n连续2次给予伤害。攻击必定会命中", - }, - "hardPress": { - name: "硬压", - effect: "用手臂或钳子压迫对手。\n对手剩余的HP越多,威力越大", - }, - "dragonCheer": { - name: "龙声鼓舞", - effect: "以龙之鼓舞提高士气,\n让我方的招式变得容易击中要害。\n对龙属性的鼓舞效果会更强", - }, - "alluringVoice": { - name: "魅诱之声", - effect: "用天使般的歌声攻击对手。\n会让此回合内能力有提高的宝可梦陷入混乱状态", - }, - "temperFlare": { - name: "豁出去", - effect: "以自暴自弃的气势进行攻击。\n如果上一回合招式没有命中,\n威力就会翻倍", - }, - "supercellSlam": { - name: "闪电强袭", - effect: "让身体带电后压向对手。\n如果没有命中则自己会受到伤害", - }, - "psychicNoise": { - name: "精神噪音", - effect: "用令对手不舒服的音波进行攻击。\n让对手在2回合内无法通过招式、\n特性或携带的道具回复HP", - }, - "upperHand": { - name: "快手还击", - effect: "察觉到对手的动作后用掌根攻击,\n让对手畏缩。如果对手使出的招式\n不是先制攻击,则会失败", - }, - "malignantChain": { - name: "邪毒锁链", - effect: "用由毒形成的锁链缠住对手注入毒\n素加以侵蚀。有时会让对手陷入剧毒状态", - } -} as const; diff --git a/src/locales/zh_CN/nature.ts b/src/locales/zh_CN/nature.json similarity index 80% rename from src/locales/zh_CN/nature.ts rename to src/locales/zh_CN/nature.json index d4447e8b03d..60b34c9363a 100644 --- a/src/locales/zh_CN/nature.ts +++ b/src/locales/zh_CN/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "勤奋", "Lonely": "怕寂寞", "Brave": "勇敢", @@ -26,4 +24,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "自大", "Careful": "慎重", "Quirky": "浮躁" -} as const; +} \ No newline at end of file diff --git a/src/locales/zh_CN/party-ui-handler.json b/src/locales/zh_CN/party-ui-handler.json new file mode 100644 index 00000000000..db364d29ab2 --- /dev/null +++ b/src/locales/zh_CN/party-ui-handler.json @@ -0,0 +1,47 @@ +{ + "SEND_OUT": "上场", + "SUMMARY": "概要", + "CANCEL": "取消", + "RELEASE": "放生", + "APPLY": "应用", + "TEACH": "教授", + "SPLICE": "融合", + "UNSPLICE": "分离", + "ACTIVATE": "激活", + "DEACTIVATE": "解除", + "TRANSFER": "交换", + "ALL": "全部道具", + "PASS_BATON": "接棒", + "UNPAUSE_EVOLUTION": "解除进化暂停", + "REVIVE": "复活", + "RENAME": "起名", + "choosePokemon": "选择一只宝可梦。", + "doWhatWithThisPokemon": "要对宝可梦做什么?", + "noEnergy": "{{pokemonName}}没有力气战斗了!", + "hasEnergy": "{{pokemonName}}仍然精神十足!", + "cantBeUsed": "{{pokemonName}}无法在此挑战中使用!", + "tooManyItems": "{{pokemonName}}拥有\n太多这个道具了!", + "anyEffect": "即便使用也无效果哦。", + "unpausedEvolutions": "{{pokemonName}}的进化停止了。", + "unspliceConfirmation": "真的要把{{fusionName}}\n从{{pokemonName}}身上分离吗? {{fusionName}}会就此消失。", + "wasReverted": "{{fusionName}}恢复成了{{pokemonName}}。", + "releaseConfirmation": "你真要放生{{pokemonName}}吗?", + "releaseInBattle": "你无法放生正在战斗中的宝可梦!", + "selectAMove": "选择一个招式。", + "changeQuantity": "选择一件道具来交换。\n使用 ← 和 → 来指定数量。", + "selectAnotherPokemonToSplice": "选择另一只宝可梦来融合。", + "cancel": "取消", + "able": "能学会!", + "notAble": "无法学习", + "learned": "已习得", + "goodbye": "再见,{{pokemonName}}!", + "byebye": "拜拜,{{pokemonName}}!", + "farewell": "再会了,{{pokemonName}}!", + "soLong": "告辞了,{{pokemonName}}!", + "thisIsWhereWePart": "就此分别吧,{{pokemonName}}!", + "illMissYou": "我会想你的,{{pokemonName}}!", + "illNeverForgetYou": "我不会忘记你的,{{pokemonName}}!", + "untilWeMeetAgain": "下次再见了,{{pokemonName}}!", + "sayonara": "撒由那拉,{{pokemonName}}!", + "smellYaLater": "拜拜了您嘞,{{pokemonName}}!" +} \ No newline at end of file diff --git a/src/locales/zh_CN/party-ui-handler.ts b/src/locales/zh_CN/party-ui-handler.ts deleted file mode 100644 index 52529bf8fa9..00000000000 --- a/src/locales/zh_CN/party-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "上场", - "SUMMARY": "概要", - "CANCEL": "取消", - "RELEASE": "放生", - "APPLY": "应用", - "TEACH": "教授" -} as const; diff --git a/src/locales/zh_CN/pokeball.json b/src/locales/zh_CN/pokeball.json new file mode 100644 index 00000000000..4f2a959f904 --- /dev/null +++ b/src/locales/zh_CN/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "精灵球", + "greatBall": "超级球", + "ultraBall": "高级球", + "rogueBall": "肉鸽球", + "masterBall": "大师球", + "luxuryBall": "豪华球" +} \ No newline at end of file diff --git a/src/locales/zh_CN/pokeball.ts b/src/locales/zh_CN/pokeball.ts deleted file mode 100644 index b8df88983bb..00000000000 --- a/src/locales/zh_CN/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "精灵球", - "greatBall": "超级球", - "ultraBall": "高级球", - "rogueBall": "肉鸽球", - "masterBall": "大师球", - "luxuryBall": "豪华球", -} as const; diff --git a/src/locales/zh_CN/pokemon-form-battle.json b/src/locales/zh_CN/pokemon-form-battle.json new file mode 100644 index 00000000000..9db2cbc0154 --- /dev/null +++ b/src/locales/zh_CN/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "原始{{pokemonName}}", + "gigantamax": "超极巨{{pokemonName}}", + "eternamax": "无极巨{{pokemonName}}", + "megaChange": "{{preName}}超级进化成了\n{{pokemonName}}!", + "gigantamaxChange": "{{preName}}超极巨化成了\n{{pokemonName}}!", + "eternamaxChange": "{{preName}}无极巨化成了\n{{pokemonName}}!", + "revertChange": "{{pokemonName}}变回了\n原本的样子!", + "formChange": "{{preName}}变成其他样子了。", + "disguiseChange": "它的画皮被当作诱饵使用了!" +} \ No newline at end of file diff --git a/src/locales/zh_CN/pokemon-form.json b/src/locales/zh_CN/pokemon-form.json new file mode 100644 index 00000000000..09ec54be804 --- /dev/null +++ b/src/locales/zh_CN/pokemon-form.json @@ -0,0 +1,170 @@ +{ + "pikachuCosplay": "服装", + "pikachuCoolCosplay": "摇滚巨星", + "pikachuBeautyCosplay": "贵妇", + "pikachuCuteCosplay": "流行偶像", + "pikachuSmartCosplay": "博士", + "pikachuToughCosplay": "面罩摔跤手", + "pikachuPartner": "搭档", + "eeveePartner": "搭档", + "pichuSpiky": "刺刺耳", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "晴天", + "castformRainy": "雨天", + "castformSnowy": "雪天", + "deoxysNormal": "普通", + "burmyPlant": "草木蓑衣", + "burmySandy": "砂土蓑衣", + "burmyTrash": "垃圾蓑衣", + "shellosEast": "东海", + "shellosWest": "西海", + "rotomHeat": "加热", + "rotomWash": "清洗", + "rotomFrost": "结冰", + "rotomFan": "旋转", + "rotomMow": "切割", + "giratinaAltered": "别种", + "shayminLand": "陆上", + "basculinRedStriped": "红条纹", + "basculinBlueStriped": "蓝条纹", + "basculinWhiteStriped": "白条纹", + "deerlingSpring": "春天", + "deerlingSummer": "夏天", + "deerlingAutumn": "秋天", + "deerlingWinter": "冬天", + "tornadusIncarnate": "化身", + "thundurusIncarnate": "化身", + "landorusIncarnate": "化身", + "keldeoOrdinary": "通常", + "meloettaAria": "歌声", + "meloettaPirouette": "舞步形态", + "froakieBattleBond": "牵绊变身", + "scatterbugMeadow": "花园花纹", + "scatterbugIcySnow": "冰雪花纹", + "scatterbugPolar": "雪国花纹", + "scatterbugTundra": "雪原花纹", + "scatterbugContinental": "大陆花纹", + "scatterbugGarden": "庭园花纹", + "scatterbugElegant": "高雅花纹", + "scatterbugModern": "摩登花纹", + "scatterbugMarine": "大海花纹", + "scatterbugArchipelago": "群岛花纹", + "scatterbugHighPlains": "荒野花纹", + "scatterbugSandstorm": "沙尘花纹", + "scatterbugRiver": "大河花纹", + "scatterbugMonsoon": "骤雨花纹", + "scatterbugSavanna": "热带草原花纹", + "scatterbugSun": "太阳花纹", + "scatterbugOcean": "大洋花纹", + "scatterbugJungle": "热带雨林花纹", + "scatterbugFancy": "幻彩花纹", + "scatterbugPokeBall": "球球花纹", + "flabebeRed": "红花", + "flabebeYellow": "黄花", + "flabebeOrange": "橙花", + "flabebeBlue": "蓝花", + "flabebeWhite": "白花", + "furfrouHeart": "心形造型", + "furfrouStar": "星形造型", + "furfrouDiamond": "菱形造型", + "furfrouDebutante": "淑女造型", + "furfrouMatron": "贵妇造型", + "furfrouDandy": "绅士造型", + "furfrouLaReine": "女王造型", + "furfrouKabuki": "歌舞伎造型", + "furfrouPharaoh": "国王造型", + "pumpkabooSmall": "小尺寸", + "pumpkabooLarge": "大尺寸", + "pumpkabooSuper": "特大尺寸", + "xerneasNeutral": "放松模式", + "xerneasActive": "活跃模式", + "zygarde50": "50%形态", + "zygarde10": "10%形态", + "zygarde50Pc": "50%形态 群聚变形", + "zygarde10Pc": "10%形态 群聚变形", + "zygardeComplete": "完全体形态", + "oricorioBaile": "热辣热辣风格", + "oricorioPompom": "啪滋啪滋风格", + "oricorioPau": "呼拉呼拉风格", + "oricorioSensu": "轻盈轻盈风格", + "rockruffOwnTempo": "特殊岩狗狗", + "miniorRedMeteor": "红色核心", + "miniorOrangeMeteor": "橙色核心", + "miniorYellowMeteor": "黄色核心", + "miniorGreenMeteor": "绿色核心", + "miniorBlueMeteor": "浅蓝色核心", + "miniorIndigoMeteor": "蓝色核心", + "miniorVioletMeteor": "紫色核心", + "miniorRed": "红色", + "miniorOrange": "橙色", + "miniorYellow": "黄色", + "miniorGreen": "绿色", + "miniorBlue": "浅蓝色", + "miniorIndigo": "蓝色", + "miniorViolet": "紫色", + "mimikyuDisguised": "化形", + "mimikyuBusted": "现形", + "magearnaOriginal": "500年前的颜色", + "marshadowZenith": "全力", + "sinisteaPhony": "赝品", + "sinisteaAntique": "真品", + "eiscueNoIce": "解冻头", + "indeedeeMale": "雄性", + "indeedeeFemale": "雌性", + "morpekoFullBelly": "满腹花纹", + "zacianHeroOfManyBattles": "百战勇者", + "zamazentaHeroOfManyBattles": "百战勇者", + "zarudeDada": "老爹", + "enamorusIncarnate": "化身", + "squawkabillyGreenPlumage": "绿羽毛", + "squawkabillyBluePlumage": "蓝羽毛", + "squawkabillyYellowPlumage": "黄羽毛", + "squawkabillyWhitePlumage": "白羽毛", + "tatsugiriCurly": "上弓姿势", + "tatsugiriDroopy": "下垂姿势", + "tatsugiriStretchy": "平挺姿势", + "gimmighoulChest": "宝箱形态", + "gimmighoulRoaming": "徒步形态", + "koraidonApexBuild": "顶尖形态", + "koraidonLimitedBuild": "限制形态", + "koraidonSprintingBuild": "冲刺形态", + "koraidonSwimmingBuild": "游泳形态", + "koraidonGlidingBuild": "滑翔形态", + "miraidonUltimateMode": "极限模式", + "miraidonLowPowerMode": "节能模式", + "miraidonDriveMode": "驾驶模式", + "miraidonAquaticMode": "水上模式", + "miraidonGlideMode": "滑翔模式", + "poltchageistCounterfeit": "冒牌货", + "poltchageistArtisan": "高档货", + "paldeaTaurosCombat": "斗战种", + "paldeaTaurosBlaze": "火炽种", + "paldeaTaurosAqua": "水澜种" +} \ No newline at end of file diff --git a/src/locales/zh_CN/pokemon-info-container.json b/src/locales/zh_CN/pokemon-info-container.json new file mode 100644 index 00000000000..15b5f4a2da5 --- /dev/null +++ b/src/locales/zh_CN/pokemon-info-container.json @@ -0,0 +1,6 @@ +{ + "moveset": "招式", + "gender": "性别:", + "ability": "特性:", + "nature": "性格:" +} \ No newline at end of file diff --git a/src/locales/zh_CN/pokemon-info-container.ts b/src/locales/zh_CN/pokemon-info-container.ts deleted file mode 100644 index f7072276e65..00000000000 --- a/src/locales/zh_CN/pokemon-info-container.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "招式", - "gender": "性别:", - "ability": "特性:", - "nature": "性格:", - "epic": "史诗", - "rare": "稀有", - "common": "常见" -} as const; diff --git a/src/locales/zh_CN/pokemon-info.ts b/src/locales/zh_CN/pokemon-info.json similarity index 73% rename from src/locales/zh_CN/pokemon-info.ts rename to src/locales/zh_CN/pokemon-info.json index f7aaf3a33cb..a21a8156e4c 100644 --- a/src/locales/zh_CN/pokemon-info.ts +++ b/src/locales/zh_CN/pokemon-info.json @@ -1,43 +1,40 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "最大HP", - "HPshortened": "最大HP", - "ATK": "攻击", - "ATKshortened": "攻击", - "DEF": "防御", - "DEFshortened": "防御", - "SPATK": "特攻", - "SPATKshortened": "特攻", - "SPDEF": "特防", - "SPDEFshortened": "特防", - "SPD": "速度", - "SPDshortened": "速度", - "ACC": "命中率", - "EVA": "回避率" - }, - - Type: { - "UNKNOWN": "未知", - "NORMAL": "一般", - "FIGHTING": "格斗", - "FLYING": "飞行", - "POISON": "毒", - "GROUND": "地面", - "ROCK": "岩石", - "BUG": "虫", - "GHOST": "幽灵", - "STEEL": "钢", - "FIRE": "火", - "WATER": "水", - "GRASS": "草", - "ELECTRIC": "电", - "PSYCHIC": "超能力", - "ICE": "冰", - "DRAGON": "龙", - "DARK": "恶", - "FAIRY": "妖精", - "STELLAR": "星晶", - }, -} as const; +{ + "Stat": { + "HP": "最大HP", + "HPshortened": "HP", + "ATK": "攻击", + "ATKshortened": "攻击", + "DEF": "防御", + "DEFshortened": "防御", + "SPATK": "特攻", + "SPATKshortened": "特攻", + "SPDEF": "特防", + "SPDEFshortened": "特防", + "SPD": "速度", + "SPDshortened": "速度", + "ACC": "命中率", + "EVA": "回避率" + }, + "Type": { + "UNKNOWN": "未知", + "NORMAL": "一般", + "FIGHTING": "格斗", + "FLYING": "飞行", + "POISON": "毒", + "GROUND": "地面", + "ROCK": "岩石", + "BUG": "虫", + "GHOST": "幽灵", + "STEEL": "钢", + "FIRE": "火", + "WATER": "水", + "GRASS": "草", + "ELECTRIC": "电", + "PSYCHIC": "超能力", + "ICE": "冰", + "DRAGON": "龙", + "DARK": "恶", + "FAIRY": "妖精", + "STELLAR": "星晶" + } +} diff --git a/src/locales/zh_CN/pokemon-summary.json b/src/locales/zh_CN/pokemon-summary.json new file mode 100644 index 00000000000..159b0a38315 --- /dev/null +++ b/src/locales/zh_CN/pokemon-summary.json @@ -0,0 +1,16 @@ +{ + "pokemonInfo": "宝可梦信息", + "status": "状态", + "powerAccuracyCategory": "威力\n命中率\n类别", + "type": "属性", + "unknownTrainer": "未知", + "ot": "训练师", + "nature": "性格", + "expPoints": "经验值", + "nextLv": "下一级", + "cancel": "取消", + "memoString": "{{natureFragment}} 性格,\n{{metFragment}}", + "metFragment": { + "apparently": "命中注定般地相遇于Lv.{{level}},\n{{biome}}。" + } +} \ No newline at end of file diff --git a/src/locales/zh_CN/pokemon.ts b/src/locales/zh_CN/pokemon.json similarity index 99% rename from src/locales/zh_CN/pokemon.ts rename to src/locales/zh_CN/pokemon.json index 5ff670637f4..1e70dc29e70 100644 --- a/src/locales/zh_CN/pokemon.ts +++ b/src/locales/zh_CN/pokemon.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { +{ "bulbasaur": "妙蛙种子", "ivysaur": "妙蛙草", "venusaur": "妙蛙花", @@ -1082,5 +1080,5 @@ export const pokemon: SimpleTranslationEntries = { "hisui_decidueye": "狙射树枭", "paldea_tauros": "肯泰罗", "paldea_wooper": "乌波", - "bloodmoon_ursaluna": "月月熊", -} as const; + "bloodmoon_ursaluna": "月月熊" +} \ No newline at end of file diff --git a/src/locales/zh_CN/run-history.json b/src/locales/zh_CN/run-history.json new file mode 100644 index 00000000000..08f430364fc --- /dev/null +++ b/src/locales/zh_CN/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "胜利!", + "defeatedWild": "被打败", + "defeatedTrainer": "被打败", + "defeatedTrainerDouble": "被组合打败", + "defeatedRival": "被劲敌打败", + "defeated": "被打败", + "defeatedWild_female": "被打败", + "defeatedTrainer_female": "被打败", + "defeatedTrainerDouble_female": "被组合打败", + "defeatedRival_female": "被劲敌打败", + "defeated_female": "被打败", + "luck": "幸运", + "score": "分数", + "mode": "模式", + "challengeRules": "规则", + "challengeMonoGen1": "一代", + "challengeMonoGen2": "二代", + "challengeMonoGen3": "三代", + "challengeMonoGen4": "四代", + "challengeMonoGen5": "五代", + "challengeMonoGen6": "六代", + "challengeMonoGen7": "七代", + "challengeMonoGen8": "八代", + "challengeMonoGen9": "九代", + "playerItems": "玩家道具", + "personalBest": "个人最佳!", + "SPDshortened": "速率", + "runInfo": "游戏记录", + "money": "金钱", + "runLength": "游戏时长", + "viewHeldItems": "持有道具", + "hallofFameText": "欢迎来到名人堂!", + "hallofFameText_female": "欢迎来到名人堂!", + "viewHallOfFame": "浏览名人堂!", + "viewEndingSplash": "浏览结算画面" +} \ No newline at end of file diff --git a/src/locales/zh_CN/save-slot-select-ui-handler.json b/src/locales/zh_CN/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..a6c5348a39c --- /dev/null +++ b/src/locales/zh_CN/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "要覆盖该槽位的存档吗?", + "loading": "正在加载中...", + "wave": "层数", + "lv": "Lv", + "empty": "空" +} \ No newline at end of file diff --git a/src/locales/zh_CN/save-slot-select-ui-handler.ts b/src/locales/zh_CN/save-slot-select-ui-handler.ts deleted file mode 100644 index 001ecbe2d00..00000000000 --- a/src/locales/zh_CN/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "要覆盖该槽位的存档吗?", - "loading": "正在加载中...", - "wave": "层数", - "lv": "Lv", - "empty": "空", -} as const; diff --git a/src/locales/zh_CN/settings.ts b/src/locales/zh_CN/settings.json similarity index 90% rename from src/locales/zh_CN/settings.ts rename to src/locales/zh_CN/settings.json index 3ca6cb435c6..dd001213b9e 100644 --- a/src/locales/zh_CN/settings.ts +++ b/src/locales/zh_CN/settings.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { +{ "boy": "男孩", "girl": "女孩", "general": "常规", @@ -15,6 +13,7 @@ export const settings: SimpleTranslationEntries = { "skipSeenDialogues": "跳过已读对话", "battleStyle": "对战模式", "enableRetries": "允许重试", + "hideIvs": "禁用个体值探测器信息", "tutorials": "教程", "touchControls": "触摸操作", "vibrations": "手柄震动", @@ -62,6 +61,7 @@ export const settings: SimpleTranslationEntries = { "typeHints": "属性提示", "masterVolume": "主音量", "bgmVolume": "音乐", + "fieldVolume": "场景音量", "seVolume": "音效", "musicPreference": "音乐偏好", "mixed": "全曲混合", @@ -96,4 +96,11 @@ export const settings: SimpleTranslationEntries = { "controller": "控制器", "gamepadSupport": "手柄支持", "showBgmBar": "显示音乐名称", -} as const; + "moveTouchControls": "移动触摸控制", + "shopOverlayOpacity": "商店显示不透明度", + "shopCursorTarget": "商店指针位置", + "rewards": "道具", + "reroll": "刷新", + "shop": "购买", + "checkTeam": "检查队伍" +} diff --git a/src/locales/zh_CN/splash-messages.ts b/src/locales/zh_CN/splash-messages.json similarity index 91% rename from src/locales/zh_CN/splash-messages.ts rename to src/locales/zh_CN/splash-messages.json index 35551cf1163..f679c43cdb9 100644 --- a/src/locales/zh_CN/splash-messages.ts +++ b/src/locales/zh_CN/splash-messages.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { +{ "battlesWon": "场胜利!", "joinTheDiscord": "加入Discord!", "infiniteLevels": "等级无限!", @@ -34,4 +32,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "也玩玩看激进红!", "eeveeExpo": "伊布博览会!", "ynoproject": "Yume Nikki 页游项目!", -} as const; + "breedersInSpace": "饲养员也能上太空?" +} \ No newline at end of file diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.json similarity index 70% rename from src/locales/zh_CN/starter-select-ui-handler.ts rename to src/locales/zh_CN/starter-select-ui-handler.json index 059358078f4..d184d5f7c63 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.json @@ -1,12 +1,7 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"使用这些宝可梦开始游戏吗?", +{ + "confirmStartTeam": "使用这些宝可梦开始游戏吗?", + "confirmExit": "确定要退出吗?", + "invalidParty": "初始队伍不可用!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -22,25 +17,29 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "性格:", "eggMoves": "蛋招式", "addToParty": "加入队伍", + "removeFromParty": "移出队伍", "toggleIVs": "显示个体", "manageMoves": "管理招式", "manageNature": "管理性格", + "addToFavorites": "Add to Favorites", + "removeFromFavorites": "Remove from Favorites", "useCandies": "使用糖果", "selectNature": "选择性格", "selectMoveSwapOut": "选择要替换的招式。", "selectMoveSwapWith": "选择要替换成的招式", + "sameSpeciesEgg": "兑换一颗蛋", "unlockPassive": "解锁被动", "reduceCost": "降低花费", - "sameSpeciesEgg": "兑换一颗蛋", "cycleShiny": ": 闪光", "cycleForm": ": 形态", "cycleGender": ": 性别", "cycleAbility": ": 特性", "cycleNature": ": 性格", "cycleVariant": ": 变种", + "goFilter": ": 转到筛选", "enablePassive": "启用被动", "disablePassive": "禁用被动", "locked": "未解锁", "disabled": "已禁用", "uncaught": "未捕获" -}; +} \ No newline at end of file diff --git a/src/locales/zh_CN/status-effect.json b/src/locales/zh_CN/status-effect.json new file mode 100644 index 00000000000..f7fb9092107 --- /dev/null +++ b/src/locales/zh_CN/status-effect.json @@ -0,0 +1,65 @@ +{ + "none": { + "name": "无", + "description": "", + "obtain": "", + "obtainSource": "", + "activation": "", + "overlap": "", + "heal": "" + }, + "poison": { + "name": "中毒", + "description": "中毒", + "obtain": "{{pokemonNameWithAffix}}中毒了!", + "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}中毒了!", + "activation": "{{pokemonNameWithAffix}}受到了毒的伤害!", + "overlap": "{{pokemonNameWithAffix}}已经中毒了!", + "heal": "{{pokemonNameWithAffix}}中的毒彻底清除了!" + }, + "toxic": { + "name": "剧毒", + "description": "中毒", + "obtain": "{{pokemonNameWithAffix}}中了剧毒!", + "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}中了剧毒!", + "activation": "{{pokemonNameWithAffix}}受到了毒的伤害!", + "overlap": "{{pokemonNameWithAffix}}已经中毒了!", + "heal": "{{pokemonNameWithAffix}}中的毒彻底清除了!" + }, + "paralysis": { + "name": "麻痹", + "description": "麻痹", + "obtain": "{{pokemonNameWithAffix}}麻痹了,很难使出招式!", + "obtainSource": "{{pokemonNameWithAffix}}被{{sourceText}}麻痹了,很难使出招式!", + "activation": "{{pokemonNameWithAffix}}因身体麻痹而无法行动!", + "overlap": "{{pokemonNameWithAffix}}已经麻痹了!", + "heal": "{{pokemonNameWithAffix}}的麻痹治愈了!" + }, + "sleep": { + "name": "睡眠", + "description": "睡眠", + "obtain": "{{pokemonNameWithAffix}}睡着了!", + "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}睡着了!", + "activation": "{{pokemonNameWithAffix}}正在呼呼大睡。", + "overlap": "{{pokemonNameWithAffix}}已经睡着了!", + "heal": "{{pokemonNameWithAffix}}醒了!" + }, + "freeze": { + "name": "冰冻", + "description": "冰冻", + "obtain": "{{pokemonNameWithAffix}}冻住了!", + "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}冻住了!", + "activation": "{{pokemonNameWithAffix}}因冻住了而无法行动!", + "overlap": "{{pokemonNameWithAffix}}已经冻住了!", + "heal": "{{pokemonNameWithAffix}}治愈了冰冻状态!" + }, + "burn": { + "name": "灼伤", + "description": "灼伤", + "obtain": "{{pokemonNameWithAffix}}被灼伤了!", + "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}被灼伤了!", + "activation": "{{pokemonNameWithAffix}}受到了灼伤的伤害!", + "overlap": "{{pokemonNameWithAffix}}已经被灼伤了!", + "heal": "{{pokemonNameWithAffix}}的灼伤治愈了!" + } +} \ No newline at end of file diff --git a/src/locales/zh_CN/status-effect.ts b/src/locales/zh_CN/status-effect.ts deleted file mode 100644 index b9df1733bc1..00000000000 --- a/src/locales/zh_CN/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "无", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "中毒", - description: "中毒", - obtain: "{{pokemonNameWithAffix}}中毒了!", - obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}中毒了!", - activation: "{{pokemonNameWithAffix}}受到了毒的伤害!", - overlap: "{{pokemonNameWithAffix}}已经中毒了!", - heal: "{{pokemonNameWithAffix}}中的毒彻底清除了!" - }, - toxic: { - name: "剧毒", - description: "中毒", - obtain: "{{pokemonNameWithAffix}}中了剧毒!", - obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}中了剧毒!", - activation: "{{pokemonNameWithAffix}}受到了毒的伤害!", - overlap: "{{pokemonNameWithAffix}}已经中毒了!", - heal: "{{pokemonNameWithAffix}}中的毒彻底清除了!" - }, - paralysis: { - name: "麻痹", - description: "麻痹", - obtain: "{{pokemonNameWithAffix}}麻痹了,很难使出招式!", - obtainSource: "{{pokemonNameWithAffix}}被{{sourceText}}麻痹了,很难使出招式!", - activation: "{{pokemonNameWithAffix}}因身体麻痹而无法行动!", - overlap: "{{pokemonNameWithAffix}}已经麻痹了!", - heal: "{{pokemonNameWithAffix}}的麻痹治愈了!" - }, - sleep: { - name: "睡眠", - description: "睡眠", - obtain: "{{pokemonNameWithAffix}}睡着了!", - obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}睡着了!", - activation: "{{pokemonNameWithAffix}}正在呼呼大睡。", - overlap: "{{pokemonNameWithAffix}}已经睡着了!", - heal: "{{pokemonNameWithAffix}}醒了!" - }, - freeze: { - name: "冰冻", - description: "冰冻", - obtain: "{{pokemonNameWithAffix}}冻住了!", - obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}冻住了!", - activation: "{{pokemonNameWithAffix}}因冻住了而无法行动!", - overlap: "{{pokemonNameWithAffix}}已经冻住了!", - heal: "{{pokemonNameWithAffix}}治愈了冰冻状态!" - }, - burn: { - name: "灼伤", - description: "灼伤", - obtain: "{{pokemonNameWithAffix}}被灼伤了!", - obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}被灼伤了!", - activation: "{{pokemonNameWithAffix}}受到了灼伤的伤害!", - overlap: "{{pokemonNameWithAffix}}已经被灼伤了!", - heal: "{{pokemonNameWithAffix}}的灼伤治愈了!" - }, -} as const; diff --git a/src/locales/zh_CN/terrain.json b/src/locales/zh_CN/terrain.json new file mode 100644 index 00000000000..b56a9ce9ee8 --- /dev/null +++ b/src/locales/zh_CN/terrain.json @@ -0,0 +1,16 @@ +{ + "misty": "薄雾", + "mistyStartMessage": "脚下雾气缭绕!", + "mistyClearMessage": "脚下的雾气消失不见了!", + "mistyBlockMessage": "{{pokemonNameWithAffix}}正受到薄雾场地的保护!", + "electric": "电气", + "electricStartMessage": "脚下电光飞闪!", + "electricClearMessage": "脚下的电光消失不见了!", + "grassy": "青草", + "grassyStartMessage": "脚下青草如茵!", + "grassyClearMessage": "脚下的青草消失不见了!", + "psychic": "精神", + "psychicStartMessage": "脚下传来了奇妙的感觉!", + "psychicClearMessage": "脚下的奇妙感觉消失了!", + "defaultBlockMessage": "{{pokemonNameWithAffix}}正受到{{terrainName}}的的保护!" +} \ No newline at end of file diff --git a/src/locales/zh_CN/trainer-classes.json b/src/locales/zh_CN/trainer-classes.json new file mode 100644 index 00000000000..3a50acf5c01 --- /dev/null +++ b/src/locales/zh_CN/trainer-classes.json @@ -0,0 +1,130 @@ +{ + "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_grunt_female": "火箭队手下", + "rocket_grunts": "火箭队手下们", + "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/zh_CN/trainer-names.json b/src/locales/zh_CN/trainer-names.json new file mode 100644 index 00000000000..9e03a514ff7 --- /dev/null +++ b/src/locales/zh_CN/trainer-names.json @@ -0,0 +1,164 @@ +{ + "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": "东瓜", + "faba": "扎奥博", + "plumeria": "布尔美丽", + "oleana": "奥莉薇", + + "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": "哈乌", + "leon": "丹帝", + "geeta": "也慈", + "nemona": "妮莫", + "kieran": "乌栗", + "rival": "芬恩", + "rival_female": "艾薇", + "archer": "阿波罗", + "ariana": "雅典娜", + "proton": "兰斯", + "petrel": "拉姆达", + "tabitha": "火村", + "courtney": "火雁", + "shelly": "阿泉", + "matt": "阿潮", + "mars": "伙星", + "jupiter": "碎星", + "saturn": "镇星", + "zinzolin": "维奥", + "rood": "罗德", + "xerosic": "库瑟洛斯奇", + "bryony": "芭菈", + "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/zh_CN/trainer-titles.json b/src/locales/zh_CN/trainer-titles.json new file mode 100644 index 00000000000..07654ec8fc3 --- /dev/null +++ b/src/locales/zh_CN/trainer-titles.json @@ -0,0 +1,38 @@ +{ + "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/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts deleted file mode 100644 index 534685d05d1..00000000000 --- a/src/locales/zh_CN/trainers.ts +++ /dev/null @@ -1,344 +0,0 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "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": "闪焰队老大", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "精英训练家", - "ace_trainer_female": "精英训练家", - "ace_duo": "精英组合", - "artist": "艺术家", - "artist_female": "艺术家", - "backers": "啦啦队", - "backpacker": "背包客", - "backpacker_female": "背包客", - "backpackers": "背包客组合", - "baker": "面包师", - "battle_girl": "对战少女", - "beauty": "大姐姐", - "beginners": "新人训练家组合", - "biker": "飙车族", - "black_belt": "空手道王", - "breeder": "宝可梦培育家", - "breeder_female": "宝可梦培育家", - "breeders": "宝可梦培育家组合", - "clerk": "商务人士", - "clerk_female": "职场OL", - "colleagues": "商务伙伴", - "crush_kin": "格斗姐弟", - "cyclist": "自行车手", - "cyclist_female": "自行车手", - "cyclists": "自行车手组合", - "dancer": "舞者", - "dancer_female": "舞者", - "depot_agent": "铁路员工", - "doctor": "医生", - "doctor_female": "医生", - "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_grunt_female": "火箭队手下", - "magma_grunt": "熔岩队手下", - "magma_grunt_female": "熔岩队手下", - "aqua_grunt": "海洋队手下", - "aqua_grunt_female": "海洋队手下", - "galactic_grunt": "银河队手下", - "galactic_grunt_female": "银河队手下", - "plasma_grunt": "等离子队手下", - "plasma_grunt_female": "等离子队手下", - "flare_grunt": "闪焰队手下", - "flare_grunt_female": "闪焰队手下", -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - // ---- 馆主 Gym leader ---- - // 关都地区 Kanto Region - "brock": "小刚", - "misty": "小霞", - "lt_surge": "马志士", - "erika": "莉佳", - "janine": "阿杏", - "sabrina": "娜姿", - "blaine": "夏伯", - "giovanni": "坂木", - - // 城都地区 Johto Region - "falkner": "阿速", - "bugsy": "阿笔", - "whitney": "小茜", - "morty": "松叶", - "chuck": "阿四", - "jasmine": "阿蜜", - "pryce": "柳伯", - "clair": "小椿", - - // 丰缘地区 Hoenn Region - "roxanne": "杜娟", - "brawly": "藤树", - "wattson": "铁旋", - "flannery": "亚莎", - "norman": "千里", - "winona": "娜琪", - "tate": "小枫", - "liza": "小南", - "juan": "亚当", - - // 神奥地区 Sinnoh Region - "roark": "瓢太", - "gardenia": "菜种", - "maylene": "阿李", - "crasher_wake": "吉宪", - "fantina": "梅丽莎", - "byron": "东瓜", - "candice": "小菘", - "volkner": "电次", - - // 合众地区 Unova Region - "cilan": "天桐", - "chili": "伯特", - "cress": "寇恩", - "cheren": "黑连", - "lenora": "芦荟", - "roxie": "霍米加", - "burgh": "亚堤", - "elesa": "小菊儿", - "clay": "菊老大", - "skyla": "风露", - "brycen": "哈奇库", - "drayden": "夏卡", - "marlon": "西子伊", - - // 卡洛斯地区 Kalos Region - "viola": "紫罗兰", - "grant": "查克洛", - "korrina": "可尔妮", - "ramos": "福爷", - "clemont": "希特隆", - "valerie": "玛绣", - "olympia": "葛吉花", - "wulfric": "得抚", - - // 伽勒尔地区 Galar Region - "milo": "亚洛", - "nessa": "露璃娜", - "kabu": "卡芜", - "bea": "彩豆", - "allister": "欧尼奥", - "opal": "波普菈", - "bede": "彼特", - "gordie": "玛瓜", - "melony": "美蓉", - "piers": "聂梓", - "marnie": "玛俐", - "raihan": "奇巴纳", - - // 帕底亚地区 Paldea Region - "katy": "阿枫", - "brassius": "寇沙", - "iono": "奇树", - "kofu": "海岱", - "larry": "青木", - "ryme": "莱姆", - "tulip": "莉普", - "grusha": "古鲁夏", - - // ---- 四天王 Elite Four ---- - // 关都地区 Kanto Region - "lorelei": "科拿", - "bruno": "希巴", - "agatha": "菊子", - "lance": "阿渡", - - // 城都地区 Johto Region - "will": "一树", - "koga": "阿桔", - "karen": "梨花", - - // 丰都地区 Hoenn Region - "sidney": "花月", - "phoebe": "芙蓉", - "glacia": "波妮", - "drake": "源治", - - // 神奥地区 Sinnoh Region - "aaron": "阿柳", - "bertha": "菊野", - "flint": "大叶", - "lucian": "悟松", - - // 合众地区 Unova Region - "shauntal": "婉龙", - "marshal": "连武", - "grimsley": "越橘", - "caitlin": "嘉德丽雅", - - // 卡洛斯地区 Kalos Region - "malva": "帕琦拉", - "siebold": "志米", - "wikstrom": "雁铠", - "drasna": "朵拉塞娜", - - // 阿罗拉地区 Alola Region - "hala": "哈拉", - "molayne": "马睿因", - "olivia": "丽姿", - "acerola": "阿塞萝拉", - "kahili": "卡希丽", - - // 帕底亚地区 Paldea Region - "rika": "辛俐", - "poppy": "波琵", - "hassel": "八朔", - - // 蓝莓学院 Blueberry Academy - "crispin": "赤松", - "amarys": "纳莉", - "lacey": "紫竽", - "drayton": "杜若", - - // ---- 冠军 Champion ---- - // 关都地区 Kanto Region - "blue": "青绿", - "red": "赤红", - - // 丰缘地区 Hoenn Region - "steven": "大吾", - "wallace": "米可利", - - // 神奥地区 Sinnoh Region - "cynthia": "竹兰", - - // 合众地区 Unova Region - "alder": "阿戴克", - "iris": "艾莉丝", - - // 卡洛斯地区 Kalos Region - "diantha": "卡露妮", - - // 阿罗拉地区 Alola Region - "hau": "哈乌", - - // 伽勒尔地区 Galar Region - "leon": "丹帝", - - // 帕底亚地区 paldea Region - "geeta": "也慈", - "nemona": "妮莫", - - // 蓝莓学院 Blueberry academy - "kieran": "乌栗", - - // 劲敌 rival - "rival": "芬恩", - "rival_female": "艾薇", - - // ---- 组织老大 Bosses ---- - "maxie": "赤焰松", - "archie": "水梧桐", - "cyrus": "赤日", - "ghetsis": "魁奇思", - "lysandre": "弗拉达利", - - - // Double Names - "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": "聂梓 & 玛俐", -} as const; diff --git a/src/locales/zh_CN/tutorial.json b/src/locales/zh_CN/tutorial.json new file mode 100644 index 00000000000..2f76b2ba2b5 --- /dev/null +++ b/src/locales/zh_CN/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "欢迎来到PokéRogue!这是一款以战斗为核心的\n融合了roguelite元素的宝可梦同人游戏。\n$本游戏未进行商业化,我们没有\nPokémon或Pokémon使用的版\n$权资产的所有权。\n$游戏仍在开发中,但已可完整游玩。如需报\n告错误,请通过 Discord 社区。\n$如果游戏运行缓慢,请确保在浏览器设置中\n打开了“硬件加速”。", + "accessMenu": "在等待输入时,按 M 或 Escape 键可访\n问菜单。菜单包含设置和各种功能。", + "menu": "在此菜单中,您可以访问设置。\n$在设置中,您可以更改游戏速度、窗口样式\n和其他选项。\n$这里还有各种其他功能,请务必全部查看!", + "starterSelect": "在此页面中,您可以通过按Z或空格键选择\n您的初始宝可梦。这些是您最初的队伍成员。\n$每个初始宝可梦都有一个费用值。您的队伍\n最多可以拥有6名成员,只要总费用不超过10。\n$您还可以根据您捕获或孵化的变种选择性别\n、特性和形态。\n$一个物种个体值是您捕获或孵化的所有宝可\n梦中最好的,所以尽量获得更多同种宝可梦!", + "pokerus": "每天随机3个可选的初始宝可梦会有紫色边\n框。\n$如果您看到您拥有的初始宝可梦带有紫色边\n框,请尝试将其添加到您的队伍中。请务必\n$查看其概况!", + "statChange": "只要您的宝可梦没有被召回,属性变化就会\n在战斗中持续存在。\n$在训练家战斗之前和进入新的宝可梦群落之\n前,您的宝可梦会被召回。\n$您还可以通过按住C或Shift键来查看\n场上宝可梦的能力变化。", + "selectItem": "每次战斗后,您都可以从多个随机物品中\n选择其中一个。\n$这些物品包括消耗品、宝可梦携带物品和永\n久被动道具。\n$大多数非消耗品的效果会以各种方式叠加。\n$某些物品只有在可以使用时才会出现,例如\n进化物品。\n$您还可以使用转移选项在宝可梦之间转移携\n带物品。\n$一旦您获得了携带物品,转移选项就会出现\n在右下角。\n$您可以用金钱购买消耗品,并且随着您游戏\n的深入,将会有更多种类的消耗品可供选择。\n$请务必在选择随机物品之前购买这些消耗品\n因为一旦您选择,游戏就会进入下一场战斗。", + "eggGacha": "在此页面中,您可以使用您的兑换券兑换宝\n可梦蛋。\n$蛋需要孵化,并且在每场战斗后都会减少孵\n化周期。稀有蛋需要更长时间才能孵化。\n$孵化的宝可梦不会被添加到您的队伍中,它\n们将被添加到您的初始宝可梦中。\n$从蛋中孵化的宝可梦通常比野生宝可梦具有\n更好的个体值。\n$有些宝可梦只能从蛋中获得。\n$有 3 种不同的扭蛋机可供选择,每种扭蛋机\n都有不同的奖励,请选择最适合您的!" +} \ No newline at end of file diff --git a/src/locales/zh_CN/tutorial.ts b/src/locales/zh_CN/tutorial.ts deleted file mode 100644 index e9c428aac9f..00000000000 --- a/src/locales/zh_CN/tutorial.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - "intro": `欢迎来到PokéRogue!这是一款以战斗为核心的\n融合了roguelite元素的宝可梦同人游戏。 - $本游戏未进行商业化,我们没有\nPokémon或Pokémon使用的版 - $权资产的所有权。 - $游戏仍在开发中,但已可完整游玩。如需报\n告错误,请通过 Discord 社区。 - $如果游戏运行缓慢,请确保在浏览器设置中\n打开了“硬件加速”。`, - - "accessMenu": "在等待输入时,按 M 或 Escape 键可访\n问菜单。菜单包含设置和各种功能。", - - "menu": `在此菜单中,您可以访问设置。 - $在设置中,您可以更改游戏速度、窗口样式\n和其他选项。 - $这里还有各种其他功能,请务必全部查看!`, - - "starterSelect": `在此页面中,您可以通过按Z或空格键选择\n您的初始宝可梦。这些是您最初的队伍成员。 - $每个初始宝可梦都有一个费用值。您的队伍\n最多可以拥有6名成员,只要总费用不超过10。 - $您还可以根据您捕获或孵化的变种选择性别\n、特性和形态。 - $一个物种个体值是您捕获或孵化的所有宝可\n梦中最好的,所以尽量获得更多同种宝可梦!`, - - "pokerus": `每天随机3个可选的初始宝可梦会有紫色边\n框。 - $如果您看到您拥有的初始宝可梦带有紫色边\n框,请尝试将其添加到您的队伍中。请务必 - $查看其概况!`, - - "statChange": `只要您的宝可梦没有被召回,属性变化就会\n在战斗中持续存在。 - $在训练家战斗之前和进入新的宝可梦群落之\n前,您的宝可梦会被召回。 - $您还可以通过按住C或Shift键来查看\n场上宝可梦的能力变化。`, - - "selectItem": `每次战斗后,您都可以从多个随机物品中\n选择其中一个。 - $这些物品包括消耗品、宝可梦携带物品和永\n久被动道具。 - $大多数非消耗品的效果会以各种方式叠加。 - $某些物品只有在可以使用时才会出现,例如\n进化物品。 - $您还可以使用转移选项在宝可梦之间转移携\n带物品。 - $一旦您获得了携带物品,转移选项就会出现\n在右下角。 - $您可以用金钱购买消耗品,并且随着您游戏\n的深入,将会有更多种类的消耗品可供选择。 - $请务必在选择随机物品之前购买这些消耗品\n因为一旦您选择,游戏就会进入下一场战斗。`, - - "eggGacha": `在此页面中,您可以使用您的兑换券兑换宝\n可梦蛋。 - $蛋需要孵化,并且在每场战斗后都会减少孵\n化周期。稀有蛋需要更长时间才能孵化。 - $孵化的宝可梦不会被添加到您的队伍中,它\n们将被添加到您的初始宝可梦中。 - $从蛋中孵化的宝可梦通常比野生宝可梦具有\n更好的个体值。 - $有些宝可梦只能从蛋中获得。 - $有 3 种不同的扭蛋机可供选择,每种扭蛋机\n都有不同的奖励,请选择最适合您的!`, -} as const; diff --git a/src/locales/zh_CN/voucher.ts b/src/locales/zh_CN/voucher.json similarity index 63% rename from src/locales/zh_CN/voucher.ts rename to src/locales/zh_CN/voucher.json index 613c96c6da8..c913affda7d 100644 --- a/src/locales/zh_CN/voucher.ts +++ b/src/locales/zh_CN/voucher.json @@ -1,11 +1,9 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { - "vouchers": "兑换券", - "eggVoucher": "初级扭蛋券", - "eggVoucherPlus": "中级扭蛋券", - "eggVoucherPremium": "高级扭蛋券", - "eggVoucherGold": "黄金扭蛋券", - "locked": "锁定", - "defeatTrainer": "你打败了{{trainerName}}" -} as const; +{ + "vouchers": "兑换券", + "eggVoucher": "初级扭蛋券", + "eggVoucherPlus": "中级扭蛋券", + "eggVoucherPremium": "高级扭蛋券", + "eggVoucherGold": "黄金扭蛋券", + "locked": "锁定", + "defeatTrainer": "你打败了{{trainerName}}" +} \ No newline at end of file diff --git a/src/locales/zh_CN/weather.ts b/src/locales/zh_CN/weather.json similarity index 86% rename from src/locales/zh_CN/weather.ts rename to src/locales/zh_CN/weather.json index ad1ecc65007..65f677044ac 100644 --- a/src/locales/zh_CN/weather.ts +++ b/src/locales/zh_CN/weather.json @@ -1,44 +1,31 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { +{ "sunnyStartMessage": "日照变强了!", "sunnyLapseMessage": "日照很强。", "sunnyClearMessage": "日照复原了。", - "rainStartMessage": "开始下雨了!", "rainLapseMessage": "雨继续下。", "rainClearMessage": "雨停了。", - "sandstormStartMessage": "开始刮沙暴了!", "sandstormLapseMessage": "沙暴肆虐。", "sandstormClearMessage": "沙暴停止了!", "sandstormDamageMessage": "沙暴袭击了{{pokemonNameWithAffix}}!", - "hailStartMessage": "开始下冰雹了!", "hailLapseMessage": "冰雹继续肆虐。", "hailClearMessage": "冰雹不再下了。", "hailDamageMessage": "冰雹袭击了{{pokemonNameWithAffix}}!", - "snowStartMessage": "开始下雪了!", "snowLapseMessage": "雪继续下。", "snowClearMessage": "雪停了。", - "fogStartMessage": "起雾了!", "fogLapseMessage": "雾很浓。", "fogClearMessage": "雾散了。", - "heavyRainStartMessage": "开始下起了暴雨!", "heavyRainLapseMessage": "暴雨势头不减。", "heavyRainClearMessage": "暴雨停了。", - "harshSunStartMessage": "日照变得非常强了!", "harshSunLapseMessage": "强日照势头不减。", "harshSunClearMessage": "日照复原了。", - "strongWindsStartMessage": "吹起了神秘的乱流!", "strongWindsLapseMessage": "神秘的乱流势头不减。", "strongWindsClearMessage": "神秘的乱流停止了。" -}; +} \ No newline at end of file diff --git a/src/locales/zh_TW/ability-trigger.json b/src/locales/zh_TW/ability-trigger.json new file mode 100644 index 00000000000..f31fb12bc35 --- /dev/null +++ b/src/locales/zh_TW/ability-trigger.json @@ -0,0 +1,13 @@ +{ + "blockRecoilDamage": "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}} 被折磨着!", + "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} 因爲 {{abilityName}}\n避免了傷害!", + "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", + "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", + "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的畫皮脫落了!", + "fullHpResistType": "{{pokemonNameWithAffix}}讓甲殼綻放光輝,扭曲了屬性相剋關係!", + "weatherEffectDisappeared": "天氣的影響消失了!", + "postSummonAuraBreak": "{{pokemonNameWithAffix}}壓制了所有氣場!", + "preventBerryUse": "{{pokemonNameWithAffix}}因太緊張\n而無法食用樹果!" +} diff --git a/src/locales/zh_TW/ability-trigger.ts b/src/locales/zh_TW/ability-trigger.ts deleted file mode 100644 index c436e5021f7..00000000000 --- a/src/locales/zh_TW/ability-trigger.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", - "badDreams": "{{pokemonName}} 被折磨着!", - "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!", - "iceFaceAvoidedDamage": "{{pokemonName}} 因爲 {{abilityName}}\n避免了傷害!", - "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", - "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", - "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", -} as const; diff --git a/src/locales/zh_TW/ability.json b/src/locales/zh_TW/ability.json new file mode 100644 index 00000000000..ddfe2783794 --- /dev/null +++ b/src/locales/zh_TW/ability.json @@ -0,0 +1,1242 @@ +{ + "stench": { + "name": "惡臭", + "description": "發出臭氣,在攻擊的時候,\n有時會使對手畏縮。" + }, + "drizzle": { + "name": "降雨", + "description": "出場時,會將天氣變為下雨\n。" + }, + "speedBoost": { + "name": "加速", + "description": "每一回合速度會變快。" + }, + "battleArmor": { + "name": "戰鬥盔甲", + "description": "被堅硬的甲殼守護著,不會\n被對手的攻擊擊中要害。" + }, + "sturdy": { + "name": "結實", + "description": "在HP全滿時受到招式攻擊\n不會被一擊打倒。一擊必殺\n的招式也沒有效果。" + }, + "damp": { + "name": "濕氣", + "description": "透過把周圍都弄溼,使誰都\n無法使用自爆等爆炸類的招\n式。" + }, + "limber": { + "name": "柔軟", + "description": "因為身體柔軟,不會變為麻\n痹狀態。" + }, + "sandVeil": { + "name": "沙隱", + "description": "在沙暴中閃避率會提高。" + }, + "static": { + "name": "靜電", + "description": "身上帶有靜電,有時會令接\n觸到的對手麻痹。" + }, + "voltAbsorb": { + "name": "蓄電", + "description": "受到電屬性的招式攻擊時,\n不會受到傷害,而是會回復。" + }, + "waterAbsorb": { + "name": "儲水", + "description": "受到水屬性的招式攻擊時,\n不會受到傷害,而是會回復。" + }, + "oblivious": { + "name": "遲鈍", + "description": "感覺遲鈍,不會陷入著迷和\n被挑釁狀態。面對威嚇也不\n會動搖。" + }, + "cloudNine": { + "name": "無關天氣", + "description": "任何天氣的影響都會消失。" + }, + "compoundEyes": { + "name": "複眼", + "description": "因為擁有複眼,會提高招式\n的命中率。" + }, + "insomnia": { + "name": "不眠", + "description": "因為有著睡不著的體質,所\n以不會陷入睡眠狀態。" + }, + "colorChange": { + "name": "變色", + "description": "自己的屬性會變為擊中自己\n的對手招式的屬性。" + }, + "immunity": { + "name": "免疫", + "description": "因為體內擁有免疫能力,不\n會變為中毒狀態。" + }, + "flashFire": { + "name": "引火", + "description": "受到火屬性的招式攻擊時,\n吸收火焰,自己使出的火屬\n性招式會變強。" + }, + "shieldDust": { + "name": "鱗粉", + "description": "被鱗粉守護著,不會受到招\n式的追加效果影響。" + }, + "ownTempo": { + "name": "我行我素", + "description": "因為我行我素,不會陷入混\n亂狀態。面對威嚇也不會動\n搖。" + }, + "suctionCups": { + "name": "吸盤", + "description": "用吸盤將自己牢牢吸附在地\n面上,讓替換寶可夢的招式\n和道具失效。" + }, + "intimidate": { + "name": "威嚇", + "description": "出場時威嚇對手,使其退縮\n,從而降低對手的攻擊。" + }, + "shadowTag": { + "name": "踩影", + "description": "踩住對手的影子使其無法逃\n走或替換。" + }, + "roughSkin": { + "name": "粗糙皮膚", + "description": "受到攻擊時,用粗糙的皮膚\n弄傷接觸到自己的對手。" + }, + "wonderGuard": { + "name": "神奇守護", + "description": "不可思議的力量,只有效果\n絕佳的招式才能擊中。" + }, + "levitate": { + "name": "飄浮", + "description": "從地面浮起,從而不會受到\n地面屬性招式的攻擊。" + }, + "effectSpore": { + "name": "孢子", + "description": "受到攻擊時,有時會把接觸\n到自己的對手變為中毒、麻\n痹或睡眠狀態。" + }, + "synchronize": { + "name": "同步", + "description": "將自己的中毒、麻痹或灼傷\n狀態傳染給對手。" + }, + "clearBody": { + "name": "恆淨之軀", + "description": "不會因對手的招式或特性而\n被降低能力。" + }, + "naturalCure": { + "name": "自然回復", + "description": "異常狀態會在離場後治癒。" + }, + "lightningRod": { + "name": "避雷針", + "description": "將電屬性的招式吸引到自己\n身上,不但不會受到傷害,\n反而會提高特攻。" + }, + "sereneGrace": { + "name": "天恩", + "description": "受到上天保佑,容易出現招式的追加效果。" + }, + "swiftSwim": { + "name": "悠遊自如", + "description": "天氣為下雨時,速度會提高。" + }, + "chlorophyll": { + "name": "葉綠素", + "description": "天氣為晴朗時,速度會提高。" + }, + "illuminate": { + "name": "發光", + "description": "透過讓周圍變亮,命中率不\n會被降低。" + }, + "trace": { + "name": "複製", + "description": "出場時,複製對手的特性,\n變為與之相同的特性。" + }, + "hugePower": { + "name": "大力士", + "description": "物理攻擊的威力會變為2倍\n。" + }, + "poisonPoint": { + "name": "毒刺", + "description": "有時會讓接觸到自己的對手\n變為中毒狀態。" + }, + "innerFocus": { + "name": "精神力", + "description": "靠著經過鍛鍊的精神,不會\n因對手的攻擊而畏縮。面對\n威嚇也不會動搖。" + }, + "magmaArmor": { + "name": "熔岩鎧甲", + "description": "將熾熱的熔岩覆蓋在身上,\n不會陷入冰凍狀態。" + }, + "waterVeil": { + "name": "水幕", + "description": "將水幕裹在身上,不會陷入\n灼傷狀態。" + }, + "magnetPull": { + "name": "磁力", + "description": "用磁力吸住鋼屬性的寶可夢\n,使其無法逃走。" + }, + "soundproof": { + "name": "隔音", + "description": "透過遮蔽聲音,不受到聲音\n招式的影響。" + }, + "rainDish": { + "name": "雨盤", + "description": "天氣為下雨時,會緩緩回復\nHP。" + }, + "sandStream": { + "name": "揚沙", + "description": "出場時,會把天氣變為沙暴。" + }, + "pressure": { + "name": "壓迫感", + "description": "給予對手壓迫感,大量減少\n其使用招式的PP。" + }, + "thickFat": { + "name": "厚脂肪", + "description": "被厚厚的脂肪保護著,能夠\n讓火屬性和冰屬性招式的傷\n害減半。" + }, + "earlyBird": { + "name": "早起", + "description": "即使陷入睡眠狀態,也能以\n2倍的速度提早醒來。" + }, + "flameBody": { + "name": "火焰之軀", + "description": "有時會讓接觸到自己的對手\n變為灼傷狀態。" + }, + "runAway": { + "name": "逃跑", + "description": "一定能從野生寶可夢那裡逃\n走。" + }, + "keenEye": { + "name": "銳利目光", + "description": "靠著銳利的目光,命中率不\n會被降低。" + }, + "hyperCutter": { + "name": "怪力鉗", + "description": "因為擁有以力量自豪的鉗子,\n不會被對手降低攻擊。" + }, + "pickup": { + "name": "撿拾", + "description": "有時會撿來對手用過的道具,\n冒險過程中也會撿到。" + }, + "truant": { + "name": "懶惰", + "description": "如果使出招式,下一回合就\n需要休息。" + }, + "hustle": { + "name": "活力", + "description": "自己的攻擊雖會變高,但命\n中率會降低。" + }, + "cuteCharm": { + "name": "迷人之軀", + "description": "有時會讓接觸到自己的對手陷\n入著迷狀態。" + }, + "plus": { + "name": "正電", + "description": "場上的夥伴之中,如果有正\n電或負電特性的寶可夢,自\n己的特攻會提高。" + }, + "minus": { + "name": "負電", + "description": "場上的夥伴之中,如果有正\n電或負電特性的寶可夢,自\n己的特攻會提高。" + }, + "forecast": { + "name": "陰晴不定", + "description": "在天氣的影響下,會變成水\n屬性、火屬性或冰屬性之中\n的一種。" + }, + "stickyHold": { + "name": "黏著", + "description": "道具會黏在具有黏性的身體\n上,不會被對手奪走。" + }, + "shedSkin": { + "name": "蛻皮", + "description": "透過蛻去身上的皮,有時會\n治癒異常狀態。" + }, + "guts": { + "name": "毅力", + "description": "陷入異常狀態時,會拿出毅\n力,攻擊會提高。" + }, + "marvelScale": { + "name": "神奇鱗片", + "description": "陷入異常狀態時,神奇鱗片\n會發生反應,防禦會提高。" + }, + "liquidOoze": { + "name": "污泥漿", + "description": "吸收了污泥漿的對手會因為\n強烈的惡臭而使得HP減少。" + }, + "overgrow": { + "name": "茂盛", + "description": "HP減少的時候,草屬性的\n招式威力會提高。" + }, + "blaze": { + "name": "猛火", + "description": "HP減少的時候,火屬性的\n招式威力會提高。" + }, + "torrent": { + "name": "激流", + "description": "HP減少的時候,水屬性的\n招式威力會提高。" + }, + "swarm": { + "name": "蟲之預感", + "description": "HP減少的時候,蟲屬性的\n招式威力會提高。" + }, + "rockHead": { + "name": "堅硬腦袋", + "description": "即使使出會受反作用力傷害\n的招式,HP也不會減少。" + }, + "drought": { + "name": "日照", + "description": "出場時,會將天氣變為晴朗。" + }, + "arenaTrap": { + "name": "沙穴", + "description": "在戰鬥中讓對手無法逃走。" + }, + "vitalSpirit": { + "name": "幹勁", + "description": "透過激發出幹勁,不會變為\n睡眠狀態。" + }, + "whiteSmoke": { + "name": "白色煙霧", + "description": "被白色煙霧保護著,不會被\n對手降低能力。" + }, + "purePower": { + "name": "瑜伽之力", + "description": "因瑜伽的力量,物理攻擊的\n威力會變為2倍。" + }, + "shellArmor": { + "name": "硬殼盔甲", + "description": "被堅硬的殼保護著,對手的\n攻擊不會擊中要害。" + }, + "airLock": { + "name": "氣閘", + "description": "所有天氣的影響都會消失。" + }, + "tangledFeet": { + "name": "蹣跚", + "description": "陷入混亂狀態時,閃避率會\n提高。" + }, + "motorDrive": { + "name": "電氣引擎", + "description": "受到電屬性的招式攻擊時,\n不但不會受到傷害,反而速\n度會提高。" + }, + "rivalry": { + "name": "鬥爭心", + "description": "面對性別相同的對手,會燃\n起鬥爭心,變得更強。面對\n性別不同的對手時則會變弱。" + }, + "steadfast": { + "name": "不屈之心", + "description": "每次畏縮時,不屈之心就會\n燃起,速度也會提高。" + }, + "snowCloak": { + "name": "雪隱", + "description": "天氣為下雪時,閃避率會提\n高。" + }, + "gluttony": { + "name": "貪吃鬼", + "description": "原本HP變得很少時才會吃\n樹果,在HP還有一半時就\n會把它吃掉。" + }, + "angerPoint": { + "name": "憤怒穴位", + "description": "要害被擊中時會大發雷霆。\n攻擊力會提高到最大。" + }, + "unburden": { + "name": "輕裝", + "description": "失去所持有的道具時,速度\n會提高。" + }, + "heatproof": { + "name": "耐熱", + "description": "靠著耐熱的體質,讓火屬性\n的招式傷害減半。" + }, + "simple": { + "name": "單純", + "description": "能力變化會變為平時的2倍。" + }, + "drySkin": { + "name": "乾燥皮膚", + "description": "下雨天氣時和受到水屬性的\n招式時,HP會回復。晴朗\n天氣時和受到火屬性的招式\n時,HP會減少。" + }, + "download": { + "name": "下載", + "description": "比較對手的防禦和特防,根\n據較低的那項能力相應地提\n高自己的攻擊或特攻。" + }, + "ironFist": { + "name": "鐵拳", + "description": "使用到拳頭的招式威力會\n提高。" + }, + "poisonHeal": { + "name": "毒療", + "description": "陷入中毒狀態時,HP不會\n減少,反而會漸漸增加。" + }, + "adaptability": { + "name": "適應力", + "description": "與自身同屬性的招式威力會\n提高。" + }, + "skillLink": { + "name": "連續攻擊", + "description": "使用連續招式時,每回都能\n以最多次數進行攻擊。" + }, + "hydration": { + "name": "濕潤之軀", + "description": "天氣為下雨時,會治癒異常\n狀態。" + }, + "solarPower": { + "name": "太陽之力", + "description": "天氣為晴朗時特攻會提高,\n但每回合HP會減少。" + }, + "quickFeet": { + "name": "飛毛腿", + "description": "陷入異常狀態時,速度會提\n高。" + }, + "normalize": { + "name": "一般皮膚", + "description": "無論是什麼屬性的招式,全\n部都會變為一般屬性。威力\n會少量提高。" + }, + "sniper": { + "name": "狙擊手", + "description": "擊中要害時,威力會進一步\n提高。" + }, + "magicGuard": { + "name": "魔法防守", + "description": "不會受到攻擊以外的傷害。" + }, + "noGuard": { + "name": "無防守", + "description": "由於無防守戰術,雙方使出\n的招式都必定會擊中。" + }, + "stall": { + "name": "慢出", + "description": "使出招式的順序必定會變為\n最後。" + }, + "technician": { + "name": "技術高手", + "description": "可讓威力低的招式提高威力\n來進行攻擊。" + }, + "leafGuard": { + "name": "葉子防守", + "description": "天氣為晴朗時,不會陷入異\n常狀態。" + }, + "klutz": { + "name": "笨拙", + "description": "無法使用持有的道具。" + }, + "moldBreaker": { + "name": "破格", + "description": "可不受特性影響,向對手使\n出招式。" + }, + "superLuck": { + "name": "超幸運", + "description": "因為非常幸運,容易擊中對\n手的要害。" + }, + "aftermath": { + "name": "引爆", + "description": "瀕死時,會對接觸到自己的\n對手造成傷害。" + }, + "anticipation": { + "name": "危險預知", + "description": "察覺對手持有的危險招式。" + }, + "forewarn": { + "name": "預知夢", + "description": "出場時,預見1個對手持有\n的招式。" + }, + "unaware": { + "name": "純樸", + "description": "可無視對手能力的變化,進\n行攻擊。" + }, + "tintedLens": { + "name": "有色眼鏡", + "description": "可將效果不好的招式以正常\n的威力使出。" + }, + "filter": { + "name": "過濾", + "description": "受到效果絕佳的攻擊時,可\n減弱其威力。" + }, + "slowStart": { + "name": "慢啓動", + "description": "在5回合內,攻擊和速度會\n減半。" + }, + "scrappy": { + "name": "膽量", + "description": "一般屬性和格鬥屬性的招式\n可擊中幽靈屬性的寶可夢。\n面對威嚇也不會動搖。" + }, + "stormDrain": { + "name": "引水", + "description": "將水屬性的招式引到自己身\n上,不但不會受到傷害,反\n而會提高特攻。" + }, + "iceBody": { + "name": "冰凍之軀", + "description": "天氣為下雪時,會漸漸回復\nHP。" + }, + "solidRock": { + "name": "堅硬岩石", + "description": "受到效果絕佳的攻擊時,可\n減弱其威力。" + }, + "snowWarning": { + "name": "降雪", + "description": "出場時,會將天氣變為下雪。" + }, + "honeyGather": { + "name": "採蜜", + "description": "The Pokémon gathers Honey after a battle. The Honey is then sold for money." + }, + "frisk": { + "name": "察覺", + "description": "出場時,可以察覺對手的特\n性。" + }, + "reckless": { + "name": "捨身", + "description": "會讓自己因反作用力而受傷\n的招式威力會提高。" + }, + "multitype": { + "name": "多屬性", + "description": "自己的屬性會依持有的石板\n而改變。" + }, + "flowerGift": { + "name": "花之禮", + "description": "天氣為晴朗時,自己和同伴\n的攻擊和特防能力會提高。" + }, + "badDreams": { + "name": "夢魘", + "description": "給予陷入睡眠狀態的對手傷\n害。" + }, + "pickpocket": { + "name": "順手牽羊", + "description": "盜取接觸到自己的對手的道\n具。" + }, + "sheerForce": { + "name": "強行", + "description": "招式會失去追加效果,但可\n以用更高的威力使出招式。" + }, + "contrary": { + "name": "唱反調", + "description": "能力的變化會逆轉,原本提\n高時會降低,原本降低時會\n提高。" + }, + "unnerve": { + "name": "緊張感", + "description": "讓對手感到緊張,無法吃樹\n果。" + }, + "defiant": { + "name": "不服輸", + "description": "被對手降低能力時,攻擊會\n大幅提高。" + }, + "defeatist": { + "name": "軟弱", + "description": "HP降到一半以下時,會變\n得軟弱而使得攻擊和特攻減\n半。" + }, + "cursedBody": { + "name": "詛咒之軀", + "description": "受到攻擊時,有時會把對手\n的招式變為定身法狀態。" + }, + "healer": { + "name": "治癒之心", + "description": "有時會治癒同伴的異常狀態。" + }, + "friendGuard": { + "name": "友情防守", + "description": "可以減少我方受到的傷害。" + }, + "weakArmor": { + "name": "碎裂鎧甲", + "description": "因物理招式受到傷害時,防\n禦會降低,速度會大幅提高。" + }, + "heavyMetal": { + "name": "重金屬", + "description": "自己的重量會變為2倍。" + }, + "lightMetal": { + "name": "輕金屬", + "description": "自己的重量會減半。" + }, + "multiscale": { + "name": "多重鱗片", + "description": "HP全滿時,受到的傷害會\n變少。" + }, + "toxicBoost": { + "name": "中毒激升", + "description": "陷入中毒狀態時,物理招式\n的威力會提高。" + }, + "flareBoost": { + "name": "受熱激升", + "description": "陷入灼傷狀態時,特殊招式\n的威力會提高。" + }, + "harvest": { + "name": "收穫", + "description": "可多次採收已被使用過的樹果。" + }, + "telepathy": { + "name": "心靈感應", + "description": "讀取我方的攻擊,並閃避其\n招式傷害。" + }, + "moody": { + "name": "心情不定", + "description": "每一回合,能力中的某項會\n大幅提高,而某項會降低。" + }, + "overcoat": { + "name": "防塵", + "description": "不會受到沙暴的傷害。也不\n會受到粉末類和孢子類招式\n的影響。" + }, + "poisonTouch": { + "name": "毒手", + "description": "有時僅是接觸就能讓對手中\n毒。" + }, + "regenerator": { + "name": "再生力", + "description": "退回同行隊伍後,HP會少\n量回復。" + }, + "bigPecks": { + "name": "健壯胸肌", + "description": "不會受到降低防禦的效果影\n響。" + }, + "sandRush": { + "name": "撥沙", + "description": "天氣為沙暴時,速度會提高。" + }, + "wonderSkin": { + "name": "奇蹟皮膚", + "description": "不易受到變化類招式攻擊的\n身體。" + }, + "analytic": { + "name": "分析", + "description": "如果在最後使出招式,招式\n的威力就會變強。" + }, + "illusion": { + "name": "幻覺", + "description": "假扮成同行隊伍中的最後一\n隻寶可夢出場,迷惑對手。" + }, + "imposter": { + "name": "變身者", + "description": "變身為當前面對的寶可夢。" + }, + "infiltrator": { + "name": "穿透", + "description": "可穿透對手的屏障或替身進\n行攻擊。" + }, + "mummy": { + "name": "木乃伊", + "description": "被對手接觸到後,會將對手\n變為木乃伊。" + }, + "moxie": { + "name": "自信過度", + "description": "如果打倒對手,會充滿自信\n並提高攻擊。" + }, + "justified": { + "name": "正義之心", + "description": "受到惡屬性的招式攻擊時,\n因為正義感,攻擊會提高。" + }, + "rattled": { + "name": "膽怯", + "description": "受到惡屬性、幽靈屬性和蟲\n屬性的招式攻擊,或受到威\n嚇時,會因膽怯而使得速度\n提高。" + }, + "magicBounce": { + "name": "魔法鏡", + "description": "可不受到由對手使出的變化\n類招式所影響,並將其反彈。" + }, + "sapSipper": { + "name": "食草", + "description": "受到草屬性的招式攻擊時,\n不但不會受到傷害,反而攻\n擊會提高。" + }, + "prankster": { + "name": "惡作劇之心", + "description": "可以搶先使出變化類招式。" + }, + "sandForce": { + "name": "沙之力", + "description": "天氣為沙暴時,岩石屬性、\n地面屬性和鋼屬性招式的威\n力會提高。" + }, + "ironBarbs": { + "name": "鐵刺", + "description": "用鐵刺給予接觸到自己的對\n手傷害。" + }, + "zenMode": { + "name": "達摩模式", + "description": "HP變為一半以下時,樣子\n會改變。" + }, + "victoryStar": { + "name": "勝利之星", + "description": "自己和同伴的命中率會提高。" + }, + "turboblaze": { + "name": "渦輪火焰", + "description": "可以不受對手特性的干擾,\n向對手使出招式。" + }, + "teravolt": { + "name": "兆級電壓", + "description": "可以不受對手特性的干擾,\n向對手使出招式。" + }, + "aromaVeil": { + "name": "芳香幕", + "description": "可防住向自己和同伴發出的\n心靈攻擊。" + }, + "flowerVeil": { + "name": "花幕", + "description": "我方的草屬性寶可夢能力不\n會降低。也不會陷入異常狀\n態。" + }, + "cheekPouch": { + "name": "頰囊", + "description": "無論是哪種樹果,吃下去後\nHP都會回復。" + }, + "protean": { + "name": "變幻自如", + "description": "每次出場戰鬥時,變為與自\n己使出的招式相同的屬性1\n次。" + }, + "furCoat": { + "name": "毛皮大衣", + "description": "對手的物理招式造成的傷害\n會減半。" + }, + "magician": { + "name": "魔術師", + "description": "奪走被自己的招式擊中的對\n手的道具。" + }, + "bulletproof": { + "name": "防彈", + "description": "可防住對手的球和彈類的招\n式。" + }, + "competitive": { + "name": "好勝", + "description": "被對手降低能力時,特攻會\n大幅提高。" + }, + "strongJaw": { + "name": "強壯之顎", + "description": "顎部強壯,會提高啃咬類招\n式的威力。" + }, + "refrigerate": { + "name": "冰凍皮膚", + "description": "一般屬性的招式會變為冰屬\n性。威力會少量提高。" + }, + "sweetVeil": { + "name": "甜幕", + "description": "自己和我方的寶可夢不會陷\n入睡眠狀態。" + }, + "stanceChange": { + "name": "戰鬥切換", + "description": "若使出攻擊招式,會變為刀\n劍形態,若使出招式「王者\n盾牌」,會變為盾牌形態。" + }, + "galeWings": { + "name": "疾風之翼", + "description": "HP全滿時,可以搶先在對\n手之前使出飛行屬性的招式。" + }, + "megaLauncher": { + "name": "超級發射器", + "description": "波動和波導類招式的威力會\n提高。" + }, + "grassPelt": { + "name": "草之毛皮", + "description": "在青草場地時,防禦會提高。" + }, + "symbiosis": { + "name": "共生", + "description": "同伴使用道具時,會把自己\n持有的道具傳遞給同伴。" + }, + "toughClaws": { + "name": "硬爪", + "description": "接觸到對手的招式威力會提\n高。" + }, + "pixilate": { + "name": "妖精皮膚", + "description": "一般屬性的招式會變為妖精\n屬性。威力會少量提高。" + }, + "gooey": { + "name": "黏滑", + "description": "對手用攻擊接觸到自己時,\n降低此對手的速度。" + }, + "aerilate": { + "name": "飛行皮膚", + "description": "一般屬性的招式會變為飛行\n屬性。威力會少量提高。" + }, + "parentalBond": { + "name": "親子愛", + "description": "親子倆可合計攻擊2次。" + }, + "darkAura": { + "name": "暗黑氣場", + "description": "全體的惡屬性招式變強。" + }, + "fairyAura": { + "name": "妖精氣場", + "description": "全體的妖精屬性招式變強。" + }, + "auraBreak": { + "name": "氣場破壞", + "description": "讓氣場的效果逆轉,並降低\n威力。" + }, + "primordialSea": { + "name": "始源之海", + "description": "變為讓火屬性攻擊失效的天\n氣。" + }, + "desolateLand": { + "name": "終結之地", + "description": "變為讓水屬性攻擊失效的天\n氣。" + }, + "deltaStream": { + "name": "德爾塔氣流", + "description": "變為令飛行屬性的弱點消失\n的天氣。" + }, + "stamina": { + "name": "持久力", + "description": "受到攻擊時,防禦會提高。" + }, + "wimpOut": { + "name": "躍躍欲逃", + "description": "HP變為一半時,會慌慌張\n張逃走,退回同行隊伍中。" + }, + "emergencyExit": { + "name": "危險迴避", + "description": "HP減到一半時,為了避開\n危險,會退回到同行隊伍中。" + }, + "waterCompaction": { + "name": "遇水凝固", + "description": "受到水屬性的招式攻擊時,\n防禦會大幅提高。" + }, + "merciless": { + "name": "不仁不義", + "description": "攻擊中毒狀態的對手時,\n必定會擊中要害。" + }, + "shieldsDown": { + "name": "界限盾殼", + "description": "HP變為一半時,殼會壞掉,\n變得更有攻擊性。" + }, + "stakeout": { + "name": "蹲守", + "description": "可以向替換出場的對手以2\n倍的傷害進行攻擊。" + }, + "waterBubble": { + "name": "水泡", + "description": "降低自己受到的火屬性招式\n的威力,不會灼傷。" + }, + "steelworker": { + "name": "鋼能力者", + "description": "鋼屬性的招式威力會提高。" + }, + "berserk": { + "name": "怒火沖天", + "description": "HP因對手的攻擊降到一半\n時,特攻會提高。" + }, + "slushRush": { + "name": "撥雪", + "description": "天氣為下雪時,速度會提高。" + }, + "longReach": { + "name": "遠隔", + "description": "可以不接觸對手就使出所有\n的招式。" + }, + "liquidVoice": { + "name": "溼潤之聲", + "description": "所有的聲音招式都變為水屬\n性。" + }, + "triage": { + "name": "先行治療", + "description": "可以搶先使出回復招式。" + }, + "galvanize": { + "name": "電氣皮膚", + "description": "一般屬性的招式會變為電屬\n性。威力會少量提高。" + }, + "surgeSurfer": { + "name": "衝浪之尾", + "description": "電氣場地時,速度會變為2\n倍。" + }, + "schooling": { + "name": "魚羣", + "description": "HP多的時候會聚起來變強。\nHP剩餘量變少時,群體\n會分崩離析。" + }, + "disguise": { + "name": "畫皮", + "description": "用畫皮覆蓋住身體,可防住\n1次攻擊。" + }, + "battleBond": { + "name": "牽絆變身", + "description": "打倒對手時,與訓練家的牽\n絆會加深,自己的攻擊、特\n攻和速度會提高。" + }, + "powerConstruct": { + "name": "群聚變形", + "description": "HP變為一半時,細胞們會\n趕來支援,變為完全體形態。" + }, + "corrosion": { + "name": "腐蝕", + "description": "就算對方是鋼屬性或毒屬性\n寶可夢,也可讓對方陷入中\n毒狀態。" + }, + "comatose": { + "name": "絕對睡眠", + "description": "總是半夢半醒的狀態,絕對\n不會醒來。可在睡著的狀況\n下進行攻擊。" + }, + "queenlyMajesty": { + "name": "女王的威嚴", + "description": "向對手施加威懾力,使其無\n法對我方使出先制招式。" + }, + "innardsOut": { + "name": "飛出的內在物", + "description": "被對手打倒的時候,會給予\n對手相當於HP剩餘量的傷\n害。" + }, + "dancer": { + "name": "舞者", + "description": "當有誰使出跳舞招式時,自\n己也能接著使出跳舞招式。" + }, + "battery": { + "name": "蓄電池", + "description": "會提高我方的特殊招式的威\n力。" + }, + "fluffy": { + "name": "毛茸茸", + "description": "會將對手所給予的接觸類招\n式的傷害減半,但火屬性招\n式的傷害會變為2倍。" + }, + "dazzling": { + "name": "鮮豔之軀", + "description": "讓對手嚇一跳,使其無法對\n我方使出先制招式。" + }, + "soulHeart": { + "name": "魂心", + "description": "每當場上有寶可夢陷入瀕死\n狀態時,特攻就會提高。" + }, + "tanglingHair": { + "name": "捲髮", + "description": "對手用攻擊接觸到自己時,\n降低此對手的速度。" + }, + "receiver": { + "name": "接球手", + "description": "繼承被打倒的同伴的特性,\n變為相同的特性。" + }, + "powerOfAlchemy": { + "name": "化學之力", + "description": "繼承被打倒的同伴的特性,\n變為相同的特性。" + }, + "beastBoost": { + "name": "異獸提升", + "description": "打倒對手的時候,會提高自\n己最高的那項能力。" + }, + "rksSystem": { + "name": "AR系統", + "description": "根據持有的記憶碟,自己的\n屬性會改變。" + }, + "electricSurge": { + "name": "電氣製造者", + "description": "出場時,會布下電氣場地。" + }, + "psychicSurge": { + "name": "精神製造者", + "description": "出場時,會布下精神場地。" + }, + "mistySurge": { + "name": "薄霧製造者", + "description": "出場時,會布下薄霧場地。" + }, + "grassySurge": { + "name": "青草製造者", + "description": "出場時,會布下青草場地。" + }, + "fullMetalBody": { + "name": "金屬防護", + "description": "不會因對手的招式或特性而\n被降低能力。" + }, + "shadowShield": { + "name": "幻影防守", + "description": "HP全滿時,受到的傷害會\n變少。" + }, + "prismArmor": { + "name": "棱鏡裝甲", + "description": "受到效果絕佳的攻擊時,可\n減弱其威力。" + }, + "neuroforce": { + "name": "腦核之力", + "description": "可進一步提升效果絕佳招式\n的威力。" + }, + "intrepidSword": { + "name": "不撓之劍", + "description": "在戰鬥中首次出場時,攻擊\n會提高。" + }, + "dauntlessShield": { + "name": "不屈之盾", + "description": "在戰鬥中首次出場時,防禦\n會提高。" + }, + "libero": { + "name": "自由者", + "description": "每次出場戰鬥時,變為與自\n己使出的招式相同的屬性1\n次。" + }, + "ballFetch": { + "name": "撿球", + "description": "當寶可夢沒有攜帶道具時,\n會撿回第1個投出後捕捉失\n敗的精靈球。" + }, + "cottonDown": { + "name": "棉絮", + "description": "受到攻擊時會撒下棉絮,降\n低除自己以外的所有寶可夢\n的速度。" + }, + "propellerTail": { + "name": "螺旋尾鰭", + "description": "能無視具有吸引對手招式效\n果的特性或招式的影響。" + }, + "mirrorArmor": { + "name": "鏡甲", + "description": "只反彈自己受到的能力降低\n效果。" + }, + "gulpMissile": { + "name": "一口導彈", + "description": "衝浪或潛水時會叼來獵物。\n當受到傷害時,會吐出獵物\n攻擊對手。" + }, + "stalwart": { + "name": "堅毅", + "description": "能無視具有吸引對手招式效\n果的特性或招式的影響。" + }, + "steamEngine": { + "name": "蒸汽機", + "description": "受到水屬性或火屬性招式攻\n擊時,速度會極大幅提高。" + }, + "punkRock": { + "name": "龐克搖滾", + "description": "聲音招式的威力會提高。受\n到聲音招式的傷害會減半。" + }, + "sandSpit": { + "name": "吐沙", + "description": "受到攻擊時,會刮起沙暴。" + }, + "iceScales": { + "name": "冰鱗粉", + "description": "得到冰鱗粉的守護,受到的\n特殊攻擊傷害會減半。" + }, + "ripen": { + "name": "熟成", + "description": "讓樹果成熟,使效果變為2\n倍。" + }, + "iceFace": { + "name": "結凍頭", + "description": "頭部的冰會代替自己承受物\n理攻擊,但是樣子會改變。\n下雪時,冰會恢復原狀。" + }, + "powerSpot": { + "name": "能量點", + "description": "只要站在旁邊,招式的威力\n就會提高。" + }, + "mimicry": { + "name": "擬態", + "description": "寶可夢的屬性會根據場地的\n狀態而改變。" + }, + "screenCleaner": { + "name": "除障", + "description": "出場時,敵方和我方的光牆\n、反射壁和極光幕的效果會\n消失。" + }, + "steelySpirit": { + "name": "鋼之意志", + "description": "我方的鋼屬性攻擊威力會提\n高。" + }, + "perishBody": { + "name": "滅亡之軀", + "description": "在受到接觸類招式攻擊時,\n3個回合後雙方都會陷入瀕\n死。替換寶可夢後效果就\n會消失。" + }, + "wanderingSpirit": { + "name": "遊魂", + "description": "與使用接觸類招式攻擊自己\n的寶可夢互換特性。" + }, + "gorillaTactics": { + "name": "一猩一意", + "description": "攻擊雖然會提高,但只能使\n出最初選擇的招式。" + }, + "neutralizingGas": { + "name": "化學變化氣體", + "description": "當場上有特性是化學變化氣\n體的寶可夢時,所有寶可夢\n的特性效果都會消失或無\n法發動。" + }, + "pastelVeil": { + "name": "粉彩護幕", + "description": "自己和我方同伴都不會陷入\n中毒的異常狀態。" + }, + "hungerSwitch": { + "name": "飽了又餓", + "description": "在每個回合結束時,會在滿\n腹花紋和空腹花紋之間交替\n改變樣子。" + }, + "quickDraw": { + "name": "速擊", + "description": "有時能比對手先一步行動。" + }, + "unseenFist": { + "name": "無形拳", + "description": "只要是接觸到對手的招式,\n就可以無視對手的防守效果\n進行攻擊。" + }, + "curiousMedicine": { + "name": "怪藥", + "description": "出場時,會從貝殼撒藥,將\n我方的能力變化復原。" + }, + "transistor": { + "name": "電晶體", + "description": "電屬性的招式威力會提高。" + }, + "dragonsMaw": { + "name": "龍顎", + "description": "龍屬性的招式威力會提高。" + }, + "chillingNeigh": { + "name": "蒼白嘶鳴", + "description": "打倒對手時會用冰冷的聲音\n嘶鳴並提高攻擊。" + }, + "grimNeigh": { + "name": "漆黑嘶鳴", + "description": "打倒對手時會用恐怖的聲音\n嘶鳴並提高特攻。" + }, + "asOneGlastrier": { + "name": "人馬一體", + "description": "兼備蕾冠王的緊張感和雪暴\n馬的蒼白嘶鳴這2種特性。" + }, + "asOneSpectrier": { + "name": "人馬一體", + "description": "兼備蕾冠王的緊張感和靈幽\n馬的漆黑嘶鳴這2種特性。" + }, + "lingeringAroma": { + "name": "甩不掉的氣味", + "description": "被對手接觸到時,甩不掉的\n氣味會沾染給對手。" + }, + "seedSower": { + "name": "掉出種子", + "description": "受到攻擊時,會將腳下變成\n青草場地。" + }, + "thermalExchange": { + "name": "熱交換", + "description": "受到火屬性的招式攻擊時,\n攻擊會提高,不會陷入灼傷\n狀態。" + }, + "angerShell": { + "name": "憤怒甲殼", + "description": "HP因對手的攻擊降到一半\n時,會因憤怒而降低防禦和\n特防,但攻擊、特攻和速度\n會提高。" + }, + "purifyingSalt": { + "name": "潔淨之鹽", + "description": "因潔淨的鹽而不會陷入異常\n狀態。能夠讓幽靈屬性招式\n的傷害減半。" + }, + "wellBakedBody": { + "name": "焦香之軀", + "description": "受到火屬性的招式攻擊時,\n不但不會受到傷害,反而防\n禦會大幅提高" + }, + "windRider": { + "name": "乘風", + "description": "吹起順風或受到風的招式攻\n擊時,不但不會受到傷害,\n反而攻擊會提高。" + }, + "guardDog": { + "name": "看門犬", + "description": "受到威嚇時,攻擊會提高。\n會讓替換寶可夢的招式和道\n具失效。" + }, + "rockyPayload": { + "name": "搬巖", + "description": "岩石屬性的招式威力會提高。" + }, + "windPower": { + "name": "風力發電", + "description": "受到風的招式攻擊時,會變\n成充電狀態。" + }, + "zeroToHero": { + "name": "全能變身", + "description": "離場後會變為全能形態。" + }, + "commander": { + "name": "發號施令", + "description": "出場時,若我方有吃吼霸,\n便會進入吃吼霸的口中,從\n那裡發號施令。" + }, + "electromorphosis": { + "name": "電力轉換", + "description": "受到傷害時,會變成充電狀\n態。" + }, + "protosynthesis": { + "name": "古代活性", + "description": "攜帶著驅勁能量或天氣為晴\n朗時,數值最高的能力會提\n高。" + }, + "quarkDrive": { + "name": "夸克充能", + "description": "攜帶著驅勁能量或在電氣場\n地上時,數值最高的能力會\n提高。" + }, + "goodAsGold": { + "name": "黃金之軀", + "description": "既不氧化又堅韌的黃金之軀\n不會受到對手的變化類招式\n攻擊。" + }, + "vesselOfRuin": { + "name": "災禍之鼎", + "description": "在喚來災厄之鼎的力量下,\n除自己以外的特攻會變弱。" + }, + "swordOfRuin": { + "name": "災禍之劍", + "description": "在喚來災厄之劍的力量下,\n除自己以外的防禦會變弱。" + }, + "tabletsOfRuin": { + "name": "災禍之簡", + "description": "在喚來災厄之木簡的力量下\n,除自己以外的攻擊會變弱。" + }, + "beadsOfRuin": { + "name": "災禍之玉", + "description": "在喚來災厄之木簡的力量下\n,除自己以外的特防會變弱。" + }, + "orichalcumPulse": { + "name": "緋紅脈動", + "description": "出場時,會將天氣變為晴朗\n。日照很強時,會因為古代\n的脈動而使攻擊升高。" + }, + "hadronEngine": { + "name": "強子引擎", + "description": "出場時,會布下電氣場地。\n在電氣場地時,會因為未來\n的機關而使特攻升高。" + }, + "opportunist": { + "name": "跟風", + "description": "對手的能力提高時,自己也\n會跟著提高能力。" + }, + "cudChew": { + "name": "反芻", + "description": "食用樹果後,會在下一回合\n結束時從胃裡取出,以1次\n為限再次食用。" + }, + "sharpness": { + "name": "鋒銳", + "description": "切斬對手的招式威力會提高。" + }, + "supremeOverlord": { + "name": "大將", + "description": "出場時,先前每有1隻同伴\n被打倒,攻擊和特攻就會提\n高少許。" + }, + "costar": { + "name": "同台共演", + "description": "出場時,會複製同伴的能力\n變化。" + }, + "toxicDebris": { + "name": "毒滿地", + "description": "因物理招式受到傷害時,會\n在對手腳下散布毒菱。" + }, + "armorTail": { + "name": "尾甲", + "description": "包覆著頭部的神秘尾巴使對\n手無法對我方使出先制招式。" + }, + "earthEater": { + "name": "食土", + "description": "受到地面屬性的招式攻擊時\n,不會受到傷害,而是會回\n復。" + }, + "myceliumMight": { + "name": "菌絲之力", + "description": "使出變化類招式時,行動一\n定會變緩慢,但不會受到對\n手特性的干擾。" + }, + "mindsEye": { + "name": "心眼", + "description": "一般屬性和格鬥屬性的招式\n可以擊中幽靈屬性的寶可夢。\n無視對手的閃避率的變化,\n且命中率不會被降低。" + }, + "supersweetSyrup": { + "name": "甘露之蜜", + "description": "在對戰中首次出場時,會四\n處散播甜膩的蜜香,降低對\n手的閃避率。" + }, + "hospitality": { + "name": "款待", + "description": "出場時款待同伴,使其回復\n少量HP。" + }, + "toxicChain": { + "name": "毒鎖鏈", + "description": "靠著含有毒素的鎖鏈的力量\n,有時會讓被招式擊中的對\n手陷入劇毒狀態。" + }, + "embodyAspectTeal": { + "name": "面影輝映", + "description": "將回憶映於心中,使碧草面\n具發出光輝,提高自己的速\n度。" + }, + "embodyAspectWellspring": { + "name": "面影輝映", + "description": "將回憶映於心中,使水井面\n具發出光輝,提高自己的特\n防。" + }, + "embodyAspectHearthflame": { + "name": "面影輝映", + "description": "將回憶映於心中,使火灶面\n具發出光輝,提高自己的攻\n擊。" + }, + "embodyAspectCornerstone": { + "name": "面影輝映", + "description": "將回憶映於心中,使礎石面\n具發出光輝,提高自己的防\n御。" + }, + "teraShift": { + "name": "太晶變形", + "description": "出場時,會吸收周圍的能量\n,變為太晶形態。" + }, + "teraShell": { + "name": "太晶甲殼", + "description": "蘊藏著所有屬性力量的甲殼\n會將自身HP全滿時受到的\n傷害全都變為效果不好。" + }, + "teraformZero": { + "name": "歸零化境", + "description": "太樂巴戈斯變為星晶形態時\n,蘊藏其身的力量會將天氣\n和場地的影響全部歸零。" + }, + "poisonPuppeteer": { + "name": "毒傀儡", + "description": "因為桃歹郎的招式而陷入中\n毒狀態的對手同時也會陷入\n混亂狀態。" + } +} \ No newline at end of file diff --git a/src/locales/zh_TW/ability.ts b/src/locales/zh_TW/ability.ts deleted file mode 100644 index 9fa520a81ff..00000000000 --- a/src/locales/zh_TW/ability.ts +++ /dev/null @@ -1,1146 +0,0 @@ -import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; - -export const ability: AbilityTranslationEntries = { - stench: { - name: "惡臭", - description: "發出臭氣,在攻擊的時候,\n有時會使對手畏縮。", - }, - drizzle: { name: "降雨", description: "出場時,會將天氣變為下雨\n。" }, - speedBoost: { name: "加速", description: "每一回合速度會變快。" }, - battleArmor: { - name: "戰鬥盔甲", - description: "被堅硬的甲殼守護著,不會\n被對手的攻擊擊中要害。", - }, - sturdy: { - name: "結實", - description: - "在HP全滿時受到招式攻擊\n不會被一擊打倒。一擊必殺\n的招式也沒有效果。", - - }, - damp: { - name: "濕氣", - description: "透過把周圍都弄溼,使誰都\n無法使用自爆等爆炸類的招\n式。", - }, - limber: { name: "柔軟", description: "因為身體柔軟,不會變為麻\n痹狀態。" }, - sandVeil: { name: "沙隱", description: "在沙暴中閃避率會提高。" }, - static: { - name: "靜電", - description: "身上帶有靜電,有時會令接\n觸到的對手麻痹。", - }, - voltAbsorb: { - name: "蓄電", - description: "受到電屬性的招式攻擊時,\n不會受到傷害,而是會回復。", - }, - waterAbsorb: { - name: "儲水", - description: "受到水屬性的招式攻擊時,\n不會受到傷害,而是會回復。", - }, - oblivious: { - name: "遲鈍", - description: - "感覺遲鈍,不會陷入著迷和\n被挑釁狀態。面對威嚇也不\n會動搖。", - }, - cloudNine: { name: "無關天氣", description: "任何天氣的影響都會消失。" }, - compoundEyes: { - name: "複眼", - description: "因為擁有複眼,會提高招式\n的命中率。", - }, - insomnia: { - name: "不眠", - description: "因為有著睡不著的體質,所\n以不會陷入睡眠狀態。", - }, - colorChange: { - name: "變色", - description: "自己的屬性會變為擊中自己\n的對手招式的屬性。", - }, - immunity: { - name: "免疫", - description: "因為體內擁有免疫能力,不\n會變為中毒狀態。", - }, - flashFire: { - name: "引火", - description: - "受到火屬性的招式攻擊時,\n吸收火焰,自己使出的火屬\n性招式會變強。", - }, - shieldDust: { - name: "鱗粉", - description: "被鱗粉守護著,不會受到招\n式的追加效果影響。", - }, - ownTempo: { - name: "我行我素", - description: "因為我行我素,不會陷入混\n亂狀態。面對威嚇也不會動\n搖。", - }, - suctionCups: { - name: "吸盤", - description: "用吸盤將自己牢牢吸附在地\n面上,讓替換寶可夢的招式\n和道具失效。", - }, - intimidate: { - name: "威嚇", - description: "出場時威嚇對手,使其退縮\n,從而降低對手的攻擊。", - }, - shadowTag: { - name: "踩影", - description: "踩住對手的影子使其無法逃\n走或替換。", - }, - roughSkin: { - name: "粗糙皮膚", - description: "受到攻擊時,用粗糙的皮膚\n弄傷接觸到自己的對手。", - }, - wonderGuard: { - name: "神奇守護", - description: "不可思議的力量,只有效果\n絕佳的招式才能擊中。", - }, - levitate: { - name: "飄浮", - description: "從地面浮起,從而不會受到\n地面屬性招式的攻擊。", - }, - effectSpore: { - name: "孢子", - description: - "受到攻擊時,有時會把接觸\n到自己的對手變為中毒、麻\n痹或睡眠狀態。", - }, - synchronize: { - name: "同步", - description: "將自己的中毒、麻痹或灼傷\n狀態傳染給對手。", - }, - clearBody: { - name: "恆淨之軀", - description: "不會因對手的招式或特性而\n被降低能力。", - }, - naturalCure: { - name: "自然回復", - description: "異常狀態會在離場後治癒。", - }, - lightningRod: { - name: "避雷針", - description: - "將電屬性的招式吸引到自己\n身上,不但不會受到傷害,\n反而會提高特攻。", - }, - sereneGrace: { - name: "天恩", - description: "受到上天保佑,容易出現招式的追加效果。", - }, - swiftSwim: { name: "悠遊自如", description: "天氣為下雨時,速度會提高。" }, - chlorophyll: { name: "葉綠素", description: "天氣為晴朗時,速度會提高。" }, - illuminate: { - name: "發光", - description: "透過讓周圍變亮,命中率不\n會被降低。", - }, - trace: { - name: "複製", - description: "出場時,複製對手的特性,\n變為與之相同的特性。", - }, - hugePower: { name: "大力士", description: "物理攻擊的威力會變為2倍\n。" }, - poisonPoint: { - name: "毒刺", - description: "有時會讓接觸到自己的對手\n變為中毒狀態。", - }, - innerFocus: { - name: "精神力", - description: - "靠著經過鍛鍊的精神,不會\n因對手的攻擊而畏縮。面對\n威嚇也不會動搖。", - }, - magmaArmor: { - name: "熔岩鎧甲", - description: "將熾熱的熔岩覆蓋在身上,\n不會陷入冰凍狀態。", - }, - waterVeil: { - name: "水幕", - description: "將水幕裹在身上,不會陷入\n灼傷狀態。", - }, - magnetPull: { - name: "磁力", - description: "用磁力吸住鋼屬性的寶可夢\n,使其無法逃走。", - }, - soundproof: { - name: "隔音", - description: "透過遮蔽聲音,不受到聲音\n招式的影響。", - }, - rainDish: { name: "雨盤", description: "天氣為下雨時,會緩緩回復\nHP。" }, - sandStream: { name: "揚沙", description: "出場時,會把天氣變為沙暴。" }, - pressure: { - name: "壓迫感", - description: "給予對手壓迫感,大量減少\n其使用招式的PP。", - }, - thickFat: { - name: "厚脂肪", - description: - "被厚厚的脂肪保護著,能夠\n讓火屬性和冰屬性招式的傷\n害減半。", - }, - earlyBird: { - name: "早起", - description: "即使陷入睡眠狀態,也能以\n2倍的速度提早醒來。", - }, - flameBody: { - name: "火焰之軀", - description: "有時會讓接觸到自己的對手\n變為灼傷狀態。", - }, - runAway: { name: "逃跑", description: "一定能從野生寶可夢那裡逃\n走。" }, - keenEye: { - name: "銳利目光", - description: "靠著銳利的目光,命中率不\n會被降低。", - }, - hyperCutter: { - name: "怪力鉗", - description: "因為擁有以力量自豪的鉗子,\n不會被對手降低攻擊。", - }, - pickup: { - name: "撿拾", - description: "有時會撿來對手用過的道具,\n冒險過程中也會撿到。", - }, - truant: { name: "懶惰", description: "如果使出招式,下一回合就\n需要休息。" }, - hustle: { name: "活力", description: "自己的攻擊雖會變高,但命\n中率會降低。" }, - cuteCharm: { - name: "迷人之軀", - description: "有時會讓接觸到自己的對手陷\n入著迷狀態。", - }, - plus: { - name: "正電", - description: - "場上的夥伴之中,如果有正\n電或負電特性的寶可夢,自\n己的特攻會提高。", - }, - minus: { - name: "負電", - description: - "場上的夥伴之中,如果有正\n電或負電特性的寶可夢,自\n己的特攻會提高。", - }, - forecast: { - name: "陰晴不定", - description: - "在天氣的影響下,會變成水\n屬性、火屬性或冰屬性之中\n的一種。", - }, - stickyHold: { - name: "黏著", - description: "道具會黏在具有黏性的身體\n上,不會被對手奪走。", - }, - shedSkin: { - name: "蛻皮", - description: "透過蛻去身上的皮,有時會\n治癒異常狀態。", - }, - guts: { - name: "毅力", - description: "陷入異常狀態時,會拿出毅\n力,攻擊會提高。", - }, - marvelScale: { - name: "神奇鱗片", - description: "陷入異常狀態時,神奇鱗片\n會發生反應,防禦會提高。", - }, - liquidOoze: { - name: "污泥漿", - description: - "吸收了污泥漿的對手會因為\n強烈的惡臭而使得HP減少。", - }, - overgrow: { - name: "茂盛", - description: "HP減少的時候,草屬性的\n招式威力會提高。", - }, - blaze: { - name: "猛火", - description: "HP減少的時候,火屬性的\n招式威力會提高。", - }, - torrent: { - name: "激流", - description: "HP減少的時候,水屬性的\n招式威力會提高。", - }, - swarm: { - name: "蟲之預感", - description: "HP減少的時候,蟲屬性的\n招式威力會提高。", - }, - rockHead: { - name: "堅硬腦袋", - description: "即使使出會受反作用力傷害\n的招式,HP也不會減少。", - }, - drought: { name: "日照", description: "出場時,會將天氣變為晴朗。" }, - arenaTrap: { name: "沙穴", description: "在戰鬥中讓對手無法逃走。" }, - vitalSpirit: { - name: "幹勁", - description: "透過激發出幹勁,不會變為\n睡眠狀態。", - }, - whiteSmoke: { - name: "白色煙霧", - description: "被白色煙霧保護著,不會被\n對手降低能力。", - }, - purePower: { - name: "瑜伽之力", - description: "因瑜伽的力量,物理攻擊的\n威力會變為2倍。", - }, - shellArmor: { - name: "硬殼盔甲", - description: "被堅硬的殼保護著,對手的\n攻擊不會擊中要害。", - }, - airLock: { name: "氣閘", description: "所有天氣的影響都會消失。" }, - tangledFeet: { - name: "蹣跚", - description: "陷入混亂狀態時,閃避率會\n提高。", - }, - motorDrive: { - name: "電氣引擎", - description: - "受到電屬性的招式攻擊時,\n不但不會受到傷害,反而速\n度會提高。", - }, - rivalry: { - name: "鬥爭心", - description: - "面對性別相同的對手,會燃\n起鬥爭心,變得更強。面對\n性別不同的對手時則會變弱。", - }, - steadfast: { - name: "不屈之心", - description: "每次畏縮時,不屈之心就會\n燃起,速度也會提高。", - }, - snowCloak: { name: "雪隱", description: "天氣為下雪時,閃避率會提\n高。" }, - gluttony: { - name: "貪吃鬼", - description: - "原本HP變得很少時才會吃\n樹果,在HP還有一半時就\n會把它吃掉。", - }, - angerPoint: { - name: "憤怒穴位", - description: "要害被擊中時會大發雷霆。\n攻擊力會提高到最大。", - }, - unburden: { - name: "輕裝", - description: "失去所持有的道具時,速度\n會提高。", - }, - heatproof: { - name: "耐熱", - description: "靠著耐熱的體質,讓火屬性\n的招式傷害減半。", - }, - simple: { name: "單純", description: "能力變化會變為平時的2倍。" }, - drySkin: { - name: "乾燥皮膚", - description: - "下雨天氣時和受到水屬性的\n招式時,HP會回復。晴朗\n天氣時和受到火屬性的招式\n時,HP會減少。", - }, - download: { - name: "下載", - description: - "比較對手的防禦和特防,根\n據較低的那項能力相應地提\n高自己的攻擊或特攻。", - }, - ironFist: { name: "鐵拳", description: "使用到拳頭的招式威力會\n提高。" }, - poisonHeal: { - name: "毒療", - description: "陷入中毒狀態時,HP不會\n減少,反而會漸漸增加。", - }, - adaptability: { - name: "適應力", - description: "與自身同屬性的招式威力會\n提高。", - }, - skillLink: { - name: "連續攻擊", - description: "使用連續招式時,每回都能\n以最多次數進行攻擊。", - }, - hydration: { - name: "濕潤之軀", - description: "天氣為下雨時,會治癒異常\n狀態。", - }, - solarPower: { - name: "太陽之力", - description: "天氣為晴朗時特攻會提高,\n但每回合HP會減少。", - }, - quickFeet: { - name: "飛毛腿", - description: "陷入異常狀態時,速度會提\n高。", - }, - normalize: { - name: "一般皮膚", - description: - "無論是什麼屬性的招式,全\n部都會變為一般屬性。威力\n會少量提高。", - }, - sniper: { name: "狙擊手", description: "擊中要害時,威力會進一步\n提高。" }, - magicGuard: { name: "魔法防守", description: "不會受到攻擊以外的傷害。" }, - noGuard: { - name: "無防守", - description: "由於無防守戰術,雙方使出\n的招式都必定會擊中。", - }, - stall: { name: "慢出", description: "使出招式的順序必定會變為\n最後。" }, - technician: { - name: "技術高手", - description: "可讓威力低的招式提高威力\n來進行攻擊。", - }, - leafGuard: { - name: "葉子防守", - description: "天氣為晴朗時,不會陷入異\n常狀態。", - }, - klutz: { name: "笨拙", description: "無法使用持有的道具。" }, - moldBreaker: { - name: "破格", - description: "可不受特性影響,向對手使\n出招式。", - }, - superLuck: { - name: "超幸運", - description: "因為非常幸運,容易擊中對\n手的要害。", - }, - aftermath: { - name: "引爆", - description: "瀕死時,會對接觸到自己的\n對手造成傷害。", - }, - anticipation: { - name: "危險預知", - description: "察覺對手持有的危險招式。", - }, - forewarn: { - name: "預知夢", - description: "出場時,預見1個對手持有\n的招式。", - }, - unaware: { - name: "純樸", - description: "可無視對手能力的變化,進\n行攻擊。", - }, - tintedLens: { - name: "有色眼鏡", - description: "可將效果不好的招式以正常\n的威力使出。", - }, - filter: { - name: "過濾", - description: "受到效果絕佳的攻擊時,可\n減弱其威力。", - }, - slowStart: { - name: "慢啓動", - description: "在5回合內,攻擊和速度會\n減半。", - }, - scrappy: { - name: "膽量", - description: - "一般屬性和格鬥屬性的招式\n可擊中幽靈屬性的寶可夢。\n面對威嚇也不會動搖。", - }, - stormDrain: { - name: "引水", - description: - "將水屬性的招式引到自己身\n上,不但不會受到傷害,反\n而會提高特攻。", - }, - iceBody: { - name: "冰凍之軀", - description: "天氣為下雪時,會漸漸回復\nHP。", - }, - solidRock: { - name: "堅硬岩石", - description: "受到效果絕佳的攻擊時,可\n減弱其威力。", - }, - snowWarning: { name: "降雪", description: "出場時,會將天氣變為下雪。" }, - honeyGather: { - name: "採蜜", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", - }, - frisk: { - name: "察覺", - description: "出場時,可以察覺對手的特\n性。", - }, - reckless: { - name: "捨身", - description: "會讓自己因反作用力而受傷\n的招式威力會提高。", - }, - multitype: { - name: "多屬性", - description: "自己的屬性會依持有的石板\n而改變。", - }, - flowerGift: { - name: "花之禮", - description: "天氣為晴朗時,自己和同伴\n的攻擊和特防能力會提高。", - }, - badDreams: { name: "夢魘", description: "給予陷入睡眠狀態的對手傷\n害。" }, - pickpocket: { - name: "順手牽羊", - description: "盜取接觸到自己的對手的道\n具。", - }, - sheerForce: { - name: "強行", - description: "招式會失去追加效果,但可\n以用更高的威力使出招式。", - }, - contrary: { - name: "唱反調", - description: - "能力的變化會逆轉,原本提\n高時會降低,原本降低時會\n提高。", - }, - unnerve: { - name: "緊張感", - description: "讓對手感到緊張,無法吃樹\n果。", - }, - defiant: { - name: "不服輸", - description: "被對手降低能力時,攻擊會\n大幅提高。", - }, - defeatist: { - name: "軟弱", - description: "HP降到一半以下時,會變\n得軟弱而使得攻擊和特攻減\n半。", - }, - cursedBody: { - name: "詛咒之軀", - description: "受到攻擊時,有時會把對手\n的招式變為定身法狀態。", - }, - healer: { name: "治癒之心", description: "有時會治癒同伴的異常狀態。" }, - friendGuard: { name: "友情防守", description: "可以減少我方受到的傷害。" }, - weakArmor: { - name: "碎裂鎧甲", - description: "因物理招式受到傷害時,防\n禦會降低,速度會大幅提高。", - }, - heavyMetal: { name: "重金屬", description: "自己的重量會變為2倍。" }, - lightMetal: { name: "輕金屬", description: "自己的重量會減半。" }, - multiscale: { - name: "多重鱗片", - description: "HP全滿時,受到的傷害會\n變少。", - }, - toxicBoost: { - name: "中毒激升", - description: "陷入中毒狀態時,物理招式\n的威力會提高。", - }, - flareBoost: { - name: "受熱激升", - description: "陷入灼傷狀態時,特殊招式\n的威力會提高。", - }, - harvest: { - name: "收穫", - description: "可多次採收已被使用過的樹果。", - }, - telepathy: { - name: "心靈感應", - description: "讀取我方的攻擊,並閃避其\n招式傷害。", - }, - moody: { - name: "心情不定", - description: "每一回合,能力中的某項會\n大幅提高,而某項會降低。", - }, - overcoat: { - name: "防塵", - description: - "不會受到沙暴的傷害。也不\n會受到粉末類和孢子類招式\n的影響。", - }, - poisonTouch: { - name: "毒手", - description: "有時僅是接觸就能讓對手中\n毒。", - }, - regenerator: { - name: "再生力", - description: "退回同行隊伍後,HP會少\n量回復。", - }, - bigPecks: { name: "健壯胸肌", description: "不會受到降低防禦的效果影\n響。" }, - sandRush: { name: "撥沙", description: "天氣為沙暴時,速度會提高。" }, - wonderSkin: { - name: "奇蹟皮膚", - description: "不易受到變化類招式攻擊的\n身體。", - }, - analytic: { - name: "分析", - description: "如果在最後使出招式,招式\n的威力就會變強。", - }, - illusion: { - name: "幻覺", - description: "假扮成同行隊伍中的最後一\n隻寶可夢出場,迷惑對手。", - }, - imposter: { name: "變身者", description: "變身為當前面對的寶可夢。" }, - infiltrator: { - name: "穿透", - description: "可穿透對手的屏障或替身進\n行攻擊。", - }, - mummy: { - name: "木乃伊", - description: "被對手接觸到後,會將對手\n變為木乃伊。", - }, - moxie: { - name: "自信過度", - description: "如果打倒對手,會充滿自信\n並提高攻擊。", - }, - justified: { - name: "正義之心", - description: "受到惡屬性的招式攻擊時,\n因為正義感,攻擊會提高。", - }, - rattled: { - name: "膽怯", - description: - "受到惡屬性、幽靈屬性和蟲\n屬性的招式攻擊,或受到威\n嚇時,會因膽怯而使得速度\n提高。", - }, - magicBounce: { - name: "魔法鏡", - description: "可不受到由對手使出的變化\n類招式所影響,並將其反彈。", - }, - sapSipper: { - name: "食草", - description: - "受到草屬性的招式攻擊時,\n不但不會受到傷害,反而攻\n擊會提高。", - }, - prankster: { name: "惡作劇之心", description: "可以搶先使出變化類招式。" }, - sandForce: { - name: "沙之力", - description: - "天氣為沙暴時,岩石屬性、\n地面屬性和鋼屬性招式的威\n力會提高。", - }, - ironBarbs: { - name: "鐵刺", - description: "用鐵刺給予接觸到自己的對\n手傷害。", - }, - zenMode: { - name: "達摩模式", - description: "HP變為一半以下時,樣子\n會改變。", - }, - victoryStar: { - name: "勝利之星", - description: "自己和同伴的命中率會提高。", - }, - turboblaze: { - name: "渦輪火焰", - description: "可以不受對手特性的干擾,\n向對手使出招式。", - }, - teravolt: { - name: "兆級電壓", - description: "可以不受對手特性的干擾,\n向對手使出招式。", - }, - aromaVeil: { - name: "芳香幕", - description: "可防住向自己和同伴發出的\n心靈攻擊。", - }, - flowerVeil: { - name: "花幕", - description: "我方的草屬性寶可夢能力不\n會降低。也不會陷入異常狀\n態。", - }, - cheekPouch: { - name: "頰囊", - description: "無論是哪種樹果,吃下去後\nHP都會回復。", - }, - protean: { - name: "變幻自如", - description: - "每次出場戰鬥時,變為與自\n己使出的招式相同的屬性1\n次。", - }, - furCoat: { - name: "毛皮大衣", - description: "對手的物理招式造成的傷害\n會減半。", - }, - magician: { - name: "魔術師", - description: "奪走被自己的招式擊中的對\n手的道具。", - }, - bulletproof: { - name: "防彈", - description: "可防住對手的球和彈類的招\n式。", - }, - competitive: { - name: "好勝", - description: "被對手降低能力時,特攻會\n大幅提高。", - }, - strongJaw: { - name: "強壯之顎", - description: "顎部強壯,會提高啃咬類招\n式的威力。", - }, - refrigerate: { - name: "冰凍皮膚", - description: "一般屬性的招式會變為冰屬\n性。威力會少量提高。", - }, - sweetVeil: { - name: "甜幕", - description: "自己和我方的寶可夢不會陷\n入睡眠狀態。", - }, - stanceChange: { - name: "戰鬥切換", - description: - "若使出攻擊招式,會變為刀\n劍形態,若使出招式「王者\n盾牌」,會變為盾牌形態。", - }, - galeWings: { - name: "疾風之翼", - description: "HP全滿時,可以搶先在對\n手之前使出飛行屬性的招式。", - }, - megaLauncher: { - name: "超級發射器", - description: "波動和波導類招式的威力會\n提高。", - }, - grassPelt: { name: "草之毛皮", description: "在青草場地時,防禦會提高。" }, - symbiosis: { - name: "共生", - description: "同伴使用道具時,會把自己\n持有的道具傳遞給同伴。", - }, - toughClaws: { name: "硬爪", description: "接觸到對手的招式威力會提\n高。" }, - pixilate: { - name: "妖精皮膚", - description: "一般屬性的招式會變為妖精\n屬性。威力會少量提高。", - }, - gooey: { - name: "黏滑", - description: "對手用攻擊接觸到自己時,\n降低此對手的速度。", - }, - aerilate: { - name: "飛行皮膚", - description: "一般屬性的招式會變為飛行\n屬性。威力會少量提高。", - }, - parentalBond: { name: "親子愛", description: "親子倆可合計攻擊2次。" }, - darkAura: { name: "暗黑氣場", description: "全體的惡屬性招式變強。" }, - fairyAura: { name: "妖精氣場", description: "全體的妖精屬性招式變強。" }, - auraBreak: { - name: "氣場破壞", - description: "讓氣場的效果逆轉,並降低\n威力。", - }, - primordialSea: { - name: "始源之海", - description: "變為讓火屬性攻擊失效的天\n氣。", - }, - desolateLand: { - name: "終結之地", - description: "變為讓水屬性攻擊失效的天\n氣。", - }, - deltaStream: { - name: "德爾塔氣流", - description: "變為令飛行屬性的弱點消失\n的天氣。", - }, - stamina: { name: "持久力", description: "受到攻擊時,防禦會提高。" }, - wimpOut: { - name: "躍躍欲逃", - description: "HP變為一半時,會慌慌張\n張逃走,退回同行隊伍中。", - }, - emergencyExit: { - name: "危險迴避", - description: "HP減到一半時,為了避開\n危險,會退回到同行隊伍中。", - }, - waterCompaction: { - name: "遇水凝固", - description: "受到水屬性的招式攻擊時,\n防禦會大幅提高。", - }, - merciless: { - name: "不仁不義", - description: "攻擊中毒狀態的對手時,\n必定會擊中要害。", - }, - shieldsDown: { - name: "界限盾殼", - description: "HP變為一半時,殼會壞掉,\n變得更有攻擊性。", - }, - stakeout: { - name: "蹲守", - description: "可以向替換出場的對手以2\n倍的傷害進行攻擊。", - }, - waterBubble: { - name: "水泡", - description: "降低自己受到的火屬性招式\n的威力,不會灼傷。", - }, - steelworker: { name: "鋼能力者", description: "鋼屬性的招式威力會提高。" }, - berserk: { - name: "怒火沖天", - description: "HP因對手的攻擊降到一半\n時,特攻會提高。", - }, - slushRush: { name: "撥雪", description: "天氣為下雪時,速度會提高。" }, - longReach: { - name: "遠隔", - description: "可以不接觸對手就使出所有\n的招式。", - }, - liquidVoice: { - name: "溼潤之聲", - description: "所有的聲音招式都變為水屬\n性。", - }, - triage: { name: "先行治療", description: "可以搶先使出回復招式。" }, - galvanize: { - name: "電氣皮膚", - description: "一般屬性的招式會變為電屬\n性。威力會少量提高。", - }, - surgeSurfer: { - name: "衝浪之尾", - description: "電氣場地時,速度會變為2\n倍。", - }, - schooling: { - name: "魚羣", - description: - "HP多的時候會聚起來變強。\nHP剩餘量變少時,群體\n會分崩離析。", - }, - disguise: { - name: "畫皮", - description: "用畫皮覆蓋住身體,可防住\n1次攻擊。", - }, - battleBond: { - name: "牽絆變身", - description: - "打倒對手時,與訓練家的牽\n絆會加深,自己的攻擊、特\n攻和速度會提高。", - }, - powerConstruct: { - name: "群聚變形", - description: "HP變為一半時,細胞們會\n趕來支援,變為完全體形態。", - }, - corrosion: { - name: "腐蝕", - description: "就算對方是鋼屬性或毒屬性\n寶可夢,也可讓對方陷入中\n毒狀態。", - }, - comatose: { - name: "絕對睡眠", - description: - "總是半夢半醒的狀態,絕對\n不會醒來。可在睡著的狀況\n下進行攻擊。", - }, - queenlyMajesty: { - name: "女王的威嚴", - description: "向對手施加威懾力,使其無\n法對我方使出先制招式。", - }, - innardsOut: { - name: "飛出的內在物", - description: "被對手打倒的時候,會給予\n對手相當於HP剩餘量的傷\n害。", - }, - dancer: { - name: "舞者", - description: "當有誰使出跳舞招式時,自\n己也能接著使出跳舞招式。", - }, - battery: { name: "蓄電池", description: "會提高我方的特殊招式的威\n力。" }, - fluffy: { - name: "毛茸茸", - description: - "會將對手所給予的接觸類招\n式的傷害減半,但火屬性招\n式的傷害會變為2倍。", - }, - dazzling: { - name: "鮮豔之軀", - description: "讓對手嚇一跳,使其無法對\n我方使出先制招式。", - }, - soulHeart: { - name: "魂心", - description: "每當場上有寶可夢陷入瀕死\n狀態時,特攻就會提高。", - }, - tanglingHair: { - name: "捲髮", - description: "對手用攻擊接觸到自己時,\n降低此對手的速度。", - }, - receiver: { - name: "接球手", - description: "繼承被打倒的同伴的特性,\n變為相同的特性。", - }, - powerOfAlchemy: { - name: "化學之力", - description: "繼承被打倒的同伴的特性,\n變為相同的特性。", - }, - beastBoost: { - name: "異獸提升", - description: "打倒對手的時候,會提高自\n己最高的那項能力。", - }, - rksSystem: { - name: "AR系統", - description: "根據持有的記憶碟,自己的\n屬性會改變。", - }, - electricSurge: { - name: "電氣製造者", - description: "出場時,會布下電氣場地。", - }, - psychicSurge: { - name: "精神製造者", - description: "出場時,會布下精神場地。", - }, - mistySurge: { name: "薄霧製造者", description: "出場時,會布下薄霧場地。" }, - grassySurge: { - name: "青草製造者", - description: "出場時,會布下青草場地。", - }, - fullMetalBody: { - name: "金屬防護", - description: "不會因對手的招式或特性而\n被降低能力。", - }, - shadowShield: { - name: "幻影防守", - description: "HP全滿時,受到的傷害會\n變少。", - }, - prismArmor: { - name: "棱鏡裝甲", - description: "受到效果絕佳的攻擊時,可\n減弱其威力。", - }, - neuroforce: { - name: "腦核之力", - description: "可進一步提升效果絕佳招式\n的威力。", - }, - intrepidSword: { - name: "不撓之劍", - description: "在戰鬥中首次出場時,攻擊\n會提高。", - }, - dauntlessShield: { - name: "不屈之盾", - description: "在戰鬥中首次出場時,防禦\n會提高。", - }, - libero: { - name: "自由者", - description: - "每次出場戰鬥時,變為與自\n己使出的招式相同的屬性1\n次。", - }, - ballFetch: { - name: "撿球", - description: "當寶可夢沒有攜帶道具時,\n會撿回第1個投出後捕捉失\n敗的精靈球。", - }, - cottonDown: { - name: "棉絮", - description: - "受到攻擊時會撒下棉絮,降\n低除自己以外的所有寶可夢\n的速度。", - }, - propellerTail: { - name: "螺旋尾鰭", - description: "能無視具有吸引對手招式效\n果的特性或招式的影響。", - }, - mirrorArmor: { - name: "鏡甲", - description: "只反彈自己受到的能力降低\n效果。", - }, - gulpMissile: { - name: "一口導彈", - description: - "衝浪或潛水時會叼來獵物。\n當受到傷害時,會吐出獵物\n攻擊對手。", - }, - stalwart: { - name: "堅毅", - description: "能無視具有吸引對手招式效\n果的特性或招式的影響。", - }, - steamEngine: { - name: "蒸汽機", - description: "受到水屬性或火屬性招式攻\n擊時,速度會極大幅提高。", - }, - punkRock: { - name: "龐克搖滾", - description: "聲音招式的威力會提高。受\n到聲音招式的傷害會減半。", - }, - sandSpit: { name: "吐沙", description: "受到攻擊時,會刮起沙暴。" }, - iceScales: { - name: "冰鱗粉", - description: "得到冰鱗粉的守護,受到的\n特殊攻擊傷害會減半。", - }, - ripen: { name: "熟成", description: "讓樹果成熟,使效果變為2\n倍。" }, - iceFace: { - name: "結凍頭", - description: - "頭部的冰會代替自己承受物\n理攻擊,但是樣子會改變。\n下雪時,冰會恢復原狀。", - }, - powerSpot: { - name: "能量點", - description: "只要站在旁邊,招式的威力\n就會提高。", - }, - mimicry: { - name: "擬態", - description: "寶可夢的屬性會根據場地的\n狀態而改變。", - }, - screenCleaner: { - name: "除障", - description: - "出場時,敵方和我方的光牆\n、反射壁和極光幕的效果會\n消失。", - }, - steelySpirit: { - name: "鋼之意志", - description: "我方的鋼屬性攻擊威力會提\n高。", - }, - perishBody: { - name: "滅亡之軀", - description: - "在受到接觸類招式攻擊時,\n3個回合後雙方都會陷入瀕\n死。替換寶可夢後效果就\n會消失。", - }, - wanderingSpirit: { - name: "遊魂", - description: "與使用接觸類招式攻擊自己\n的寶可夢互換特性。", - }, - gorillaTactics: { - name: "一猩一意", - description: "攻擊雖然會提高,但只能使\n出最初選擇的招式。", - }, - neutralizingGas: { - name: "化學變化氣體", - description: - "當場上有特性是化學變化氣\n體的寶可夢時,所有寶可夢\n的特性效果都會消失或無\n法發動。", - }, - pastelVeil: { - name: "粉彩護幕", - description: "自己和我方同伴都不會陷入\n中毒的異常狀態。", - }, - hungerSwitch: { - name: "飽了又餓", - description: "在每個回合結束時,會在滿\n腹花紋和空腹花紋之間交替\n改變樣子。", - }, - quickDraw: { name: "速擊", description: "有時能比對手先一步行動。" }, - unseenFist: { - name: "無形拳", - description: - "只要是接觸到對手的招式,\n就可以無視對手的防守效果\n進行攻擊。", - }, - curiousMedicine: { - name: "怪藥", - description: "出場時,會從貝殼撒藥,將\n我方的能力變化復原。", - }, - transistor: { name: "電晶體", description: "電屬性的招式威力會提高。" }, - dragonsMaw: { name: "龍顎", description: "龍屬性的招式威力會提高。" }, - chillingNeigh: { - name: "蒼白嘶鳴", - description: "打倒對手時會用冰冷的聲音\n嘶鳴並提高攻擊。", - }, - grimNeigh: { - name: "漆黑嘶鳴", - description: "打倒對手時會用恐怖的聲音\n嘶鳴並提高特攻。", - }, - asOneGlastrier: { - name: "人馬一體", - description: "兼備蕾冠王的緊張感和雪暴\n馬的蒼白嘶鳴這2種特性。", - }, - asOneSpectrier: { - name: "人馬一體", - description: "兼備蕾冠王的緊張感和靈幽\n馬的漆黑嘶鳴這2種特性。", - }, - lingeringAroma: { - name: "甩不掉的氣味", - description: "被對手接觸到時,甩不掉的\n氣味會沾染給對手。", - }, - seedSower: { - name: "掉出種子", - description: "受到攻擊時,會將腳下變成\n青草場地。", - }, - thermalExchange: { - name: "熱交換", - description: - "受到火屬性的招式攻擊時,\n攻擊會提高,不會陷入灼傷\n狀態。", - }, - angerShell: { - name: "憤怒甲殼", - description: - "HP因對手的攻擊降到一半\n時,會因憤怒而降低防禦和\n特防,但攻擊、特攻和速度\n會提高。", - }, - purifyingSalt: { - name: "潔淨之鹽", - description: - "因潔淨的鹽而不會陷入異常\n狀態。能夠讓幽靈屬性招式\n的傷害減半。", - }, - wellBakedBody: { - name: "焦香之軀", - description: - "受到火屬性的招式攻擊時,\n不但不會受到傷害,反而防\n禦會大幅提高", - }, - windRider: { - name: "乘風", - description: - "吹起順風或受到風的招式攻\n擊時,不但不會受到傷害,\n反而攻擊會提高。", - }, - guardDog: { - name: "看門犬", - description: - "受到威嚇時,攻擊會提高。\n會讓替換寶可夢的招式和道\n具失效。", - }, - rockyPayload: { name: "搬巖", description: "岩石屬性的招式威力會提高。" }, - windPower: { - name: "風力發電", - description: "受到風的招式攻擊時,會變\n成充電狀態。", - }, - zeroToHero: { - name: "全能變身", - description: "離場後會變為全能形態。", - }, - commander: { - name: "發號施令", - description: - "出場時,若我方有吃吼霸,\n便會進入吃吼霸的口中,從\n那裡發號施令。", - }, - electromorphosis: { - name: "電力轉換", - description: "受到傷害時,會變成充電狀\n態。", - }, - protosynthesis: { - name: "古代活性", - description: "攜帶著驅勁能量或天氣為晴\n朗時,數值最高的能力會提\n高。", - }, - quarkDrive: { - name: "夸克充能", - description: - "攜帶著驅勁能量或在電氣場\n地上時,數值最高的能力會\n提高。", - }, - goodAsGold: { - name: "黃金之軀", - description: "既不氧化又堅韌的黃金之軀\n不會受到對手的變化類招式\n攻擊。", - }, - vesselOfRuin: { - name: "災禍之鼎", - description: "在喚來災厄之鼎的力量下,\n除自己以外的特攻會變弱。", - }, - swordOfRuin: { - name: "災禍之劍", - description: "在喚來災厄之劍的力量下,\n除自己以外的防禦會變弱。", - }, - tabletsOfRuin: { - name: "災禍之簡", - description: "在喚來災厄之木簡的力量下\n,除自己以外的攻擊會變弱。", - }, - beadsOfRuin: { - name: "災禍之玉", - description: "在喚來災厄之木簡的力量下\n,除自己以外的特防會變弱。", - }, - orichalcumPulse: { - name: "緋紅脈動", - description: - "出場時,會將天氣變為晴朗\n。日照很強時,會因為古代\n的脈動而使攻擊升高。", - }, - hadronEngine: { - name: "強子引擎", - description: - "出場時,會布下電氣場地。\n在電氣場地時,會因為未來\n的機關而使特攻升高。", - }, - opportunist: { - name: "跟風", - description: "對手的能力提高時,自己也\n會跟著提高能力。", - }, - cudChew: { - name: "反芻", - description: "食用樹果後,會在下一回合\n結束時從胃裡取出,以1次\n為限再次食用。", - }, - sharpness: { name: "鋒銳", description: "切斬對手的招式威力會提高。" }, - supremeOverlord: { - name: "大將", - description: - "出場時,先前每有1隻同伴\n被打倒,攻擊和特攻就會提\n高少許。", - }, - costar: { name: "同台共演", description: "出場時,會複製同伴的能力\n變化。" }, - toxicDebris: { - name: "毒滿地", - description: "因物理招式受到傷害時,會\n在對手腳下散布毒菱。", - }, - armorTail: { - name: "尾甲", - description: "包覆著頭部的神秘尾巴使對\n手無法對我方使出先制招式。", - }, - earthEater: { - name: "食土", - description: - "受到地面屬性的招式攻擊時\n,不會受到傷害,而是會回\n復。", - }, - myceliumMight: { - name: "菌絲之力", - description: - "使出變化類招式時,行動一\n定會變緩慢,但不會受到對\n手特性的干擾。", - }, - mindsEye: { - name: "心眼", - description: - "一般屬性和格鬥屬性的招式\n可以擊中幽靈屬性的寶可夢。\n無視對手的閃避率的變化,\n且命中率不會被降低。", - }, - supersweetSyrup: { - name: "甘露之蜜", - description: - "在對戰中首次出場時,會四\n處散播甜膩的蜜香,降低對\n手的閃避率。", - }, - hospitality: { - name: "款待", - description: "出場時款待同伴,使其回復\n少量HP。", - }, - toxicChain: { - name: "毒鎖鏈", - description: - "靠著含有毒素的鎖鏈的力量\n,有時會讓被招式擊中的對\n手陷入劇毒狀態。", - }, - embodyAspectTeal: { - name: "面影輝映", - description: "將回憶映於心中,使碧草面\n具發出光輝,提高自己的速\n度。", - }, - embodyAspectWellspring: { - name: "面影輝映", - description: "將回憶映於心中,使水井面\n具發出光輝,提高自己的特\n防。", - }, - embodyAspectHearthflame: { - name: "面影輝映", - description: "將回憶映於心中,使火灶面\n具發出光輝,提高自己的攻\n擊。", - }, - embodyAspectCornerstone: { - name: "面影輝映", - description: "將回憶映於心中,使礎石面\n具發出光輝,提高自己的防\n御。", - }, - teraShift: { - name: "太晶變形", - description: "出場時,會吸收周圍的能量\n,變為太晶形態。", - }, - teraShell: { - name: "太晶甲殼", - description: - "蘊藏著所有屬性力量的甲殼\n會將自身HP全滿時受到的\n傷害全都變為效果不好。", - }, - teraformZero: { - name: "歸零化境", - description: - "太樂巴戈斯變為星晶形態時\n,蘊藏其身的力量會將天氣\n和場地的影響全部歸零。", - }, - poisonPuppeteer: { - name: "毒傀儡", - description: - "因為桃歹郎的招式而陷入中\n毒狀態的對手同時也會陷入\n混亂狀態。", - }, -} as const; diff --git a/src/locales/zh_TW/achv.json b/src/locales/zh_TW/achv.json new file mode 100644 index 00000000000..9edce2e368d --- /dev/null +++ b/src/locales/zh_TW/achv.json @@ -0,0 +1,260 @@ +{ + "Achievements": { + "name": "成就" + }, + "Locked": { + "name": "未解鎖" + }, + "MoneyAchv": { + "description": "累計獲得 ₽{{moneyAmount}}" + }, + "10K_MONEY": { + "name": "小有積蓄" + }, + "100K_MONEY": { + "name": "大戶人家" + }, + "1M_MONEY": { + "name": "百萬富翁" + }, + "10M_MONEY": { + "name": "暴發戶" + }, + "DamageAchv": { + "description": "在單次攻擊中造成 {{damageAmount}} 點傷害" + }, + "250_DMG": { + "name": "重拳出擊" + }, + "1000_DMG": { + "name": "神拳猛擊" + }, + "2500_DMG": { + "name": "奪少?" + }, + "10000_DMG": { + "name": "一拳超人" + }, + "HealAchv": { + "description": "通過技能、能力或攜帶的道具一次性治療 {{healAmount}} {{HP}}點" + }, + "250_HEAL": { + "name": "新手奶媽" + }, + "1000_HEAL": { + "name": "治療擔當" + }, + "2500_HEAL": { + "name": "牧師" + }, + "10000_HEAL": { + "name": "泉水" + }, + "LevelAchv": { + "description": "將一隻寶可夢提升到 Lv{{level}}" + }, + "LV_100": { + "name": "别急,後面還有" + }, + "LV_250": { + "name": "精英" + }, + "LV_1000": { + "name": "天外有天" + }, + "RibbonAchv": { + "description": "累計獲得 {{ribbonAmount}} 個勛章" + }, + "10_RIBBONS": { + "name": "寶可夢聯盟冠軍" + }, + "25_RIBBONS": { + "name": "超級球聯盟冠軍" + }, + "50_RIBBONS": { + "name": "高級球聯盟冠軍" + }, + "75_RIBBONS": { + "name": "肉鴿球聯盟冠軍" + }, + "100_RIBBONS": { + "name": "大師球聯盟冠軍" + }, + "TRANSFER_MAX_STAT_STAGE": { + "name": "團隊協作", + "description": "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢" + }, + "MAX_FRIENDSHIP": { + "name": "親密無間", + "description": "使一隻寶可夢的親密度達到最大值" + }, + "MEGA_EVOLVE": { + "name": "大變身", + "description": "超級進化一隻寶可夢" + }, + "GIGANTAMAX": { + "name": "這位更是重量級", + "description": "極巨化一隻寶可夢" + }, + "TERASTALLIZE": { + "name": "本系愛好者", + "description": "太晶化一隻寶可夢" + }, + "STELLAR_TERASTALLIZE": { + "name": "隱藏屬性", + "description": "星晶化一隻寶可夢" + }, + "SPLICE": { + "name": "無限融合", + "description": "使用基因之楔將兩隻寶可夢融合在一起" + }, + "MINI_BLACK_HOLE": { + "name": "一大洞的道具", + "description": "獲得一個迷你黑洞" + }, + "CATCH_MYTHICAL": { + "name": "神秘禮物", + "description": "捕捉一隻幻之寶可夢" + }, + "CATCH_SUB_LEGENDARY": { + "name": "二級傳說", + "description": "捕捉一隻準傳說寶可夢" + }, + "CATCH_LEGENDARY": { + "name": "傳說", + "description": "捕捉一隻傳說寶可夢" + }, + "SEE_SHINY": { + "name": "閃耀奪目", + "description": "在野外找到一隻閃光寶可夢" + }, + "SHINY_PARTY": { + "name": "嘔心瀝血", + "description": "擁有一支由閃光寶可夢組成的滿員隊伍" + }, + "HATCH_MYTHICAL": { + "name": "幻獸蛋", + "description": "從蛋中孵化出一隻幻之寶可夢" + }, + "HATCH_SUB_LEGENDARY": { + "name": "二級傳說蛋", + "description": "從蛋中孵化出一隻準傳說寶可夢" + }, + "HATCH_LEGENDARY": { + "name": "傳說蛋", + "description": "從蛋中孵化出一隻傳說寶可夢" + }, + "HATCH_SHINY": { + "name": "金色傳說!", + "description": "從蛋中孵化出一隻閃光寶可夢" + }, + "HIDDEN_ABILITY": { + "name": "隱藏實力", + "description": "捕捉一隻擁有隱藏特性的寶可夢" + }, + "PERFECT_IVS": { + "name": "合格證", + "description": "獲得一隻擁有完美個體值的寶可夢" + }, + "CLASSIC_VICTORY": { + "name": "戰無不勝", + "description": "在經典模式中通關遊戲" + }, + "MONO_GEN_ONE": { + "name": "最初的勁敵", + "description": "完成僅限第一世代的挑戰." + }, + "MONO_GEN_TWO": { + "name": "1.5世代", + "description": "完成僅限第二世代的挑戰." + }, + "MONO_GEN_THREE": { + "name": "“水太多了”", + "description": "完成僅限第三世代的挑戰." + }, + "MONO_GEN_FOUR": { + "name": "她真是最強冠軍嗎?", + "description": "完成僅限第四世代的挑戰." + }, + "MONO_GEN_FIVE": { + "name": "完全原創", + "description": "完成僅限第五世代的挑戰." + }, + "MONO_GEN_SIX": { + "name": "女大公", + "description": "完成僅限第六世代的挑戰." + }, + "MONO_GEN_SEVEN": { + "name": "首屆冠軍", + "description": "完成僅限第七世代的挑戰." + }, + "MONO_GEN_EIGHT": { + "name": "冠軍時刻!", + "description": "完成僅限第八世代的挑戰." + }, + "MONO_GEN_NINE": { + "name": "她又放水了", + "description": "完成僅限第九世代的挑戰." + }, + "MonoType": { + "description": "完成 {{type}} 單屬性挑戰." + }, + "MONO_NORMAL": { + "name": "異乎尋常的尋常" + }, + "MONO_FIGHTING": { + "name": "我有真功夫" + }, + "MONO_FLYING": { + "name": "憤怒的小鳥" + }, + "MONO_POISON": { + "name": "關都地區特色" + }, + "MONO_GROUND": { + "name": "地震預報" + }, + "MONO_ROCK": { + "name": "堅如磐石" + }, + "MONO_BUG": { + "name": "音箱蟀俠" + }, + "MONO_GHOST": { + "name": "捉鬼敢死隊" + }, + "MONO_STEEL": { + "name": "鐵巨人" + }, + "MONO_FIRE": { + "name": "搓火球解決一切" + }, + "MONO_WATER": { + "name": "當雨來臨,傾盆而下" + }, + "MONO_GRASS": { + "name": "別踏這個青" + }, + "MONO_ELECTRIC": { + "name": "瞄準大岩蛇的角!" + }, + "MONO_PSYCHIC": { + "name": "腦洞大開" + }, + "MONO_ICE": { + "name": "如履薄冰" + }, + "MONO_DRAGON": { + "name": "準神俱樂部" + }, + "MONO_DARK": { + "name": "總有叛逆期" + }, + "MONO_FAIRY": { + "name": "林克,醒醒!" + }, + "INVERSE_BATTLE": { + "name": "鏡子子鏡", + "description": "完成逆轉之戰挑戰\n戰挑戰之轉逆成完" + } +} diff --git a/src/locales/zh_TW/achv.ts b/src/locales/zh_TW/achv.ts deleted file mode 100644 index 8b85f59447e..00000000000 --- a/src/locales/zh_TW/achv.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; - -// Achievement translations for the when the player character is male -export const PGMachv: AchievementTranslationEntries = { - "Achievements": { - name: "成就", - }, - "Locked": { - name: "未解鎖", - }, - - "MoneyAchv": { - description: "累計獲得 ₽{{moneyAmount}}", - }, - "10K_MONEY": { - name: "小有積蓄", - }, - "100K_MONEY": { - name: "大戶人家", - }, - "1M_MONEY": { - name: "百萬富翁", - }, - "10M_MONEY": { - name: "暴發戶", - }, - - "DamageAchv": { - description: "在單次攻擊中造成 {{damageAmount}} 點傷害", - }, - "250_DMG": { - name: "重拳出擊", - }, - "1000_DMG": { - name: "神拳猛擊", - }, - "2500_DMG": { - name: "奪少?", - }, - "10000_DMG": { - name: "一拳超人", - }, - - "HealAchv": { - description: "通過技能、能力或攜帶的道具一次性治療 {{healAmount}} {{HP}}點", - }, - "250_HEAL": { - name: "新手奶媽", - }, - "1000_HEAL": { - name: "治療擔當", - }, - "2500_HEAL": { - name: "牧師", - }, - "10000_HEAL": { - name: "泉水", - }, - - "LevelAchv": { - description: "將一隻寶可夢提升到 Lv{{level}}", - }, - "LV_100": { - name: "别急,後面還有", - }, - "LV_250": { - name: "精英", - }, - "LV_1000": { - name: "天外有天", - }, - - "RibbonAchv": { - description: "累計獲得 {{ribbonAmount}} 個勛章", - }, - "10_RIBBONS": { - name: "寶可夢聯盟冠軍", - }, - "25_RIBBONS": { - name: "超級球聯盟冠軍", - }, - "50_RIBBONS": { - name: "高級球聯盟冠軍", - }, - "75_RIBBONS": { - name: "肉鴿球聯盟冠軍", - }, - "100_RIBBONS": { - name: "大師球聯盟冠軍", - }, - - "TRANSFER_MAX_BATTLE_STAT": { - name: "團隊協作", - description: "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢", - }, - "MAX_FRIENDSHIP": { - name: "親密無間", - description: "使一隻寶可夢的親密度達到最大值", - }, - "MEGA_EVOLVE": { - name: "大變身", - description: "超級進化一隻寶可夢", - }, - "GIGANTAMAX": { - name: "這位更是重量級", - description: "極巨化一隻寶可夢", - }, - "TERASTALLIZE": { - name: "本系愛好者", - description: "太晶化一隻寶可夢", - }, - "STELLAR_TERASTALLIZE": { - name: "隱藏屬性", - description: "星晶化一隻寶可夢", - }, - "SPLICE": { - name: "無限融合", - description: "使用基因之楔將兩隻寶可夢融合在一起", - }, - "MINI_BLACK_HOLE": { - name: "一大洞的道具", - description: "獲得一個迷你黑洞", - }, - "CATCH_MYTHICAL": { - name: "神秘禮物", - description: "捕捉一隻幻之寶可夢", - }, - "CATCH_SUB_LEGENDARY": { - name: "二級傳說", - description: "捕捉一隻準傳說寶可夢", - }, - "CATCH_LEGENDARY": { - name: "傳說", - description: "捕捉一隻傳說寶可夢", - }, - "SEE_SHINY": { - name: "閃耀奪目", - description: "在野外找到一隻閃光寶可夢", - }, - "SHINY_PARTY": { - name: "嘔心瀝血", - description: "擁有一支由閃光寶可夢組成的滿員隊伍", - }, - "HATCH_MYTHICAL": { - name: "幻獸蛋", - description: "從蛋中孵化出一隻幻之寶可夢", - }, - "HATCH_SUB_LEGENDARY": { - name: "二級傳說蛋", - description: "從蛋中孵化出一隻準傳說寶可夢", - }, - "HATCH_LEGENDARY": { - name: "傳說蛋", - description: "從蛋中孵化出一隻傳說寶可夢", - }, - "HATCH_SHINY": { - name: "金色傳說!", - description: "從蛋中孵化出一隻閃光寶可夢", - }, - "HIDDEN_ABILITY": { - name: "隱藏實力", - description: "捕捉一隻擁有隱藏特性的寶可夢", - }, - "PERFECT_IVS": { - name: "合格證", - description: "獲得一隻擁有完美個體值的寶可夢", - }, - "CLASSIC_VICTORY": { - name: "戰無不勝", - description: "在經典模式中通關遊戲", - }, - - "MONO_GEN_ONE": { - name: "最初的勁敵", - description: "完成僅限第一世代的挑戰.", - }, - "MONO_GEN_TWO": { - name: "1.5世代", - description: "完成僅限第二世代的挑戰.", - }, - "MONO_GEN_THREE": { - name: "“水太多了”", - description: "完成僅限第三世代的挑戰.", - }, - "MONO_GEN_FOUR": { - name: "她真是最強冠軍嗎?", - description: "完成僅限第四世代的挑戰.", - }, - "MONO_GEN_FIVE": { - name: "完全原創", - description: "完成僅限第五世代的挑戰.", - }, - "MONO_GEN_SIX": { - name: "女大公", - description: "完成僅限第六世代的挑戰.", - }, - "MONO_GEN_SEVEN": { - name: "首屆冠軍", - description: "完成僅限第七世代的挑戰.", - }, - "MONO_GEN_EIGHT": { - name: "冠軍時刻!", - description: "完成僅限第八世代的挑戰.", - }, - "MONO_GEN_NINE": { - name: "她又放水了", - description: "完成僅限第九世代的挑戰.", - }, - - "MonoType": { - description: "完成 {{type}} 單屬性挑戰.", - }, - "MONO_NORMAL": { - name: "異乎尋常的尋常", - }, - "MONO_FIGHTING": { - name: "我有真功夫", - }, - "MONO_FLYING": { - name: "憤怒的小鳥", - }, - "MONO_POISON": { - name: "關都地區特色", - }, - "MONO_GROUND": { - name: "地震預報", - }, - "MONO_ROCK": { - name: "堅如磐石", - }, - "MONO_BUG": { - name: "音箱蟀俠", - }, - "MONO_GHOST": { - name: "捉鬼敢死隊", - }, - "MONO_STEEL": { - name: "鐵巨人", - }, - "MONO_FIRE": { - name: "搓火球解決一切", - }, - "MONO_WATER": { - name: "當雨來臨,傾盆而下", - }, - "MONO_GRASS": { - name: "別踏這個青", - }, - "MONO_ELECTRIC": { - name: "瞄準大岩蛇的角!", - }, - "MONO_PSYCHIC": { - name: "腦洞大開", - }, - "MONO_ICE": { - name: "如履薄冰", - }, - "MONO_DRAGON": { - name: "準神俱樂部", - }, - "MONO_DARK": { - name: "總有叛逆期", - }, - "MONO_FAIRY": { - name: "林克,醒醒!", - }, -} as const; - -// Achievement translations for the when the player character is female (it for now uses the same translations as the male version) -export const PGFachv: AchievementTranslationEntries = PGMachv; diff --git a/src/locales/zh_TW/arena-flyout.json b/src/locales/zh_TW/arena-flyout.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/zh_TW/arena-flyout.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/zh_TW/arena-tag.json b/src/locales/zh_TW/arena-tag.json new file mode 100644 index 00000000000..78246d9c44f --- /dev/null +++ b/src/locales/zh_TW/arena-tag.json @@ -0,0 +1,11 @@ +{ + "noCritOnAddPlayer": "{{moveName}}保護了你的\n隊伍不被擊中要害!", + "noCritOnAddEnemy": "{{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/battle-info.json b/src/locales/zh_TW/battle-info.json new file mode 100644 index 00000000000..884a01eb8a7 --- /dev/null +++ b/src/locales/zh_TW/battle-info.json @@ -0,0 +1,3 @@ +{ + "generation": "第{{generation}}世代" +} \ No newline at end of file diff --git a/src/locales/zh_TW/battle-message-ui-handler.json b/src/locales/zh_TW/battle-message-ui-handler.json new file mode 100644 index 00000000000..9cfa83e31dd --- /dev/null +++ b/src/locales/zh_TW/battle-message-ui-handler.json @@ -0,0 +1,8 @@ +{ + "ivBest": "最棒", + "ivFantastic": "了不起", + "ivVeryGood": "非常好", + "ivPrettyGood": "相當好", + "ivDecent": "一般般", + "ivNoGood": "也許不行" +} \ No newline at end of file diff --git a/src/locales/zh_TW/battle-message-ui-handler.ts b/src/locales/zh_TW/battle-message-ui-handler.ts deleted file mode 100644 index 3cd63de7961..00000000000 --- a/src/locales/zh_TW/battle-message-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battleMessageUiHandler: SimpleTranslationEntries = { - "ivBest": "最棒", - "ivFantastic": "了不起", - "ivVeryGood": "非常好", - "ivPrettyGood": "相當好", - "ivDecent": "一般般", - "ivNoGood": "也許不行", -} as const; diff --git a/src/locales/zh_TW/battle-scene.json b/src/locales/zh_TW/battle-scene.json new file mode 100644 index 00000000000..a0288475d69 --- /dev/null +++ b/src/locales/zh_TW/battle-scene.json @@ -0,0 +1,3 @@ +{ + "moneyOwned": "₽{{formattedMoney}}" +} \ No newline at end of file diff --git a/src/locales/zh_TW/battle.json b/src/locales/zh_TW/battle.json new file mode 100644 index 00000000000..0d44688ff4a --- /dev/null +++ b/src/locales/zh_TW/battle.json @@ -0,0 +1,69 @@ +{ + "bossAppeared": "{{bossName}} 出現了.", + "trainerAppeared": "{{trainerName}}\n想要和你對戰!", + "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!", + "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", + "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!", + "playerComeBack": "回來吧, {{pokemonName}}!", + "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", + "playerGo": "去吧! {{pokemonName}}!", + "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", + "switchQuestion": "要更換\n{{pokemonName}}嗎?", + "trainerDefeated": "你擊敗了\n{{trainerName}}!", + "moneyPickedUp": "撿到了 ₽{{moneyAmount}}!", + "pokemonCaught": "{{pokemonName}} 被抓住了!", + "pokemon": "寶可夢", + "sendOutPokemon": "上吧! {{pokemonName}}!", + "hitResultCriticalHit": "擊中了要害!", + "hitResultSuperEffective": "效果拔群!", + "hitResultNotVeryEffective": "收效甚微…", + "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", + "hitResultImmune": "對于{{pokemonName}},\n完全沒有效果!", + "hitResultOneHitKO": "一擊切殺!", + "attackFailed": "但是失敗了!", + "attackMissed": "沒有命中{{pokemonNameWithAffix}}!", + "attackHitsCount": "擊中 {{count}} 次!", + "rewardGain": "You received\n{{modifierName}}!", + "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", + "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", + "learnMove": "{{pokemonName}} 學會了{{moveName}}!", + "learnMovePrompt": "{{pokemonName}} 想要學習 {{moveName}}.", + "learnMoveLimitReached": "但是, {{pokemonName}} 已經學會了\n四個招式.", + "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", + "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?", + "learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.", + "learnMoveForgetQuestion": "要忘記哪個技能?", + "learnMoveForgetSuccess": "{{pokemonName}} 忘記了 {{moveName}}.", + "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}噗!", + "learnMoveAnd": "然後…", + "levelCapUp": "等級上限提升到 {{levelCap}}!", + "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", + "moveNoPP": "這個技能的PP用完了", + "moveDisabled": "{{moveName}} 被禁用!", + "disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被無效化了!", + "noPokeballForce": "一股無形的力量阻止了你使用精靈球。", + "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", + "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", + "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", + "noEscapeForce": "一股無形的力量阻止你逃跑。", + "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", + "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", + "runAwaySuccess": "你成功逃脫了!", + "runAwayCannotEscape": "你無法逃脫!", + "escapeVerbSwitch": "切換", + "escapeVerbFlee": "逃跑", + "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了{{moveName}}的PP!", + "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了體力!", + "notDisabled": "{{moveName}} 不再被禁用!", + "skipItemQuestion": "你要跳過拾取道具嗎?", + "itemStackFull": "{{fullItemName}}持有數已達到上限,\n你獲得了{{itemName}}作爲代替。", + "eggHatching": "咦?", + "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?", + "wildPokemonWithAffix": "野生的 {{pokemonName}}", + "foePokemonWithAffix": "對手 {{pokemonName}}", + "useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}!", + "drainMessage": "{{pokemonName}} 吸取了體力!", + "regainHealth": "{{pokemonName}} 回復了體力!", + "fainted": "{{pokemonNameWithAffix}} 倒下了!", + "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!" +} diff --git a/src/locales/zh_TW/battle.ts b/src/locales/zh_TW/battle.ts deleted file mode 100644 index 077933c46d6..00000000000 --- a/src/locales/zh_TW/battle.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const battle: SimpleTranslationEntries = { - "bossAppeared": "{{bossName}} 出現了.", - "trainerAppeared": "{{trainerName}}\n想要和你對戰!", - "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!", - "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", - "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!", - "playerComeBack": "回來吧, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", - "playerGo": "去吧! {{pokemonName}}!", - "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", - "switchQuestion": "要更換\n{{pokemonName}}嗎?", - "trainerDefeated": "你擊敗了\n{{trainerName}}!", - "pokemonCaught": "{{pokemonName}} 被抓住了!", - "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", - "pokemon": "寶可夢", - "sendOutPokemon": "上吧! {{pokemonName}}!", - "hitResultCriticalHit": "擊中了要害!", - "hitResultSuperEffective": "效果拔群!", - "hitResultNotVeryEffective": "收效甚微…", - "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", - "hitResultOneHitKO": "一擊切殺!", - "attackFailed": "但是失敗了!", - "attackHitsCount": "擊中 {{count}} 次!", - "rewardGain": "You received\n{{modifierName}}!", - "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", - "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", - "learnMove": "{{pokemonName}} 學會了{{moveName}}!", - "learnMovePrompt": "{{pokemonName}} 想要學習 {{moveName}}.", - "learnMoveLimitReached": "但是, {{pokemonName}} 已經學會了\n四個招式.", - "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", - "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?", - "learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.", - "learnMoveForgetQuestion": "要忘記哪個技能?", - "learnMoveForgetSuccess": "{{pokemonName}} 忘記了 {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}噗!", - "learnMoveAnd": "然後…", - "levelCapUp": "等級上限提升到 {{levelCap}}!", - "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", - "moveNoPP": "這個技能的PP用完了", - "moveDisabled": "{{moveName}} 被禁用!", - "noPokeballForce": "一股無形的力量阻止了你使用精靈球。", - "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", - "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", - "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", - "noEscapeForce": "一股無形的力量阻止你逃跑。", - "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", - "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", - "runAwaySuccess": "你成功逃脫了!", - "runAwayCannotEscape": "你無法逃脫!", - "escapeVerbSwitch": "切換", - "escapeVerbFlee": "逃跑", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", - "notDisabled": "{{moveName}} 不再被禁用!", - "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", - "hpIsFull": "{{pokemonName}}'s\nHP is full!", - "skipItemQuestion": "你要跳過拾取道具嗎?", - "eggHatching": "咦?", - "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?", - "wildPokemonWithAffix": "野生的 {{pokemonName}}", - "foePokemonWithAffix": "對手 {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}!", - "drainMessage": "{{pokemonName}} 吸取了體力!", - "regainHealth": "{{pokemonName}} 回復了體力!", - "fainted": "{{pokemonNameWithAffix}} 倒下了!", - "statRose": "{{pokemonNameWithAffix}} 的 {{stats}} 提高了!", - "statSharplyRose": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅提高了!", - "statRoseDrastically": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅提高了!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再提高了!", - "statFell": "{{pokemonNameWithAffix}} 的 {{stats}} 降低了!", - "statHarshlyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅降低了!", - "statSeverelyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅降低了!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再降低了!", - "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}因攻擊的反作用力而無法動彈!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}擺脫了{{moveName}}!", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}畏縮了!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}混亂了!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}的混亂解除了!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}已經混亂了。", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}正在混亂中!", - "battlerTagsConfusedLapseHurtItself": "不知所以地攻擊了自己!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}不再受到同命的影響", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} 和{{pokemonNameWithAffix2}} 同歸於盡了!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷了!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}已經著迷了!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷中!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不會著迷!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} 治癒了著迷狀態!", - "battlerTagsSeededOnAdd": "將種子種植在了{{pokemonNameWithAffix}}身上!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}被寄生種子吸取了體力!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}吸到了污泥漿!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}開始做惡夢了!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}已經被惡夢纏身!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}正被惡夢纏身!", - "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}接受了再來一次!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}的再來一次狀態解除了!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}擺出了幫助{{pokemonName}} 的架勢!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}用扎根回復了體力!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}扎根了!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}用水流環包裹了自己!", - "battlerTagsAquaRingLapse": "{{moveName}}回復了{{pokemonName}}的體力!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}產生睡意了!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了{{moveName}}的傷害!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}的 {{moveName}}緊緊束縛住了!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}綁緊了!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}被困在了旋渦之中!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用貝殼夾住了{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}被{{moveName}}困住了!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}被困在了熔岩風暴之中!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}被捕獸夾困住了!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了{{sourcePokemonNameWithAffix}}的死纏爛打!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}擺出了防守的架勢!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}在攻擊中保護了自己!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}擺出了挺住攻擊的架勢!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的滅亡計時變成{{turnCount}}了!", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懶!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!", - "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", -} as const; diff --git a/src/locales/zh_TW/battler-tags.json b/src/locales/zh_TW/battler-tags.json new file mode 100644 index 00000000000..b5a2760f7ac --- /dev/null +++ b/src/locales/zh_TW/battler-tags.json @@ -0,0 +1,72 @@ +{ + "trappedDesc": "束縛", + "flinchedDesc": "畏縮", + "confusedDesc": "混亂", + "infatuatedDesc": "著迷", + "seedDesc": "寄生種子", + "nightmareDesc": "惡夢", + "ingrainDesc": "扎根", + "drowsyDesc": "瞌睡", + "rechargingLapse": "{{pokemonNameWithAffix}}因攻擊的反作用力而無法動彈!", + "trappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", + "trappedOnRemove": "{{pokemonNameWithAffix}}擺脫了{{moveName}}!", + "flinchedLapse": "{{pokemonNameWithAffix}}畏縮了!", + "confusedOnAdd": "{{pokemonNameWithAffix}}混亂了!", + "confusedOnRemove": "{{pokemonNameWithAffix}}的混亂解除了!", + "confusedOnOverlap": "{{pokemonNameWithAffix}}已經混亂了。", + "confusedLapse": "{{pokemonNameWithAffix}}正在混亂中!", + "confusedLapseHurtItself": "不知所以地攻擊了自己!", + "destinyBondLapseIsBoss": "{{pokemonNameWithAffix}}不再受到同命的影響", + "destinyBondLapse": "{{pokemonNameWithAffix}} 和{{pokemonNameWithAffix2}} 同歸於盡了!", + "infatuatedOnAdd": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷了!", + "infatuatedOnOverlap": "{{pokemonNameWithAffix}}已經著迷了!", + "infatuatedLapse": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷中!", + "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不會著迷!", + "infatuatedOnRemove": "{{pokemonNameWithAffix}} 治癒了著迷狀態!", + "seededOnAdd": "將種子種植在了{{pokemonNameWithAffix}}身上!", + "seededLapse": "{{pokemonNameWithAffix}}被寄生種子吸取了體力!", + "seededLapseShed": "{{pokemonNameWithAffix}}吸到了污泥漿!", + "nightmareOnAdd": "{{pokemonNameWithAffix}}開始做惡夢了!", + "nightmareOnOverlap": "{{pokemonNameWithAffix}}已經被惡夢纏身!", + "nightmareLapse": "{{pokemonNameWithAffix}}正被惡夢纏身!", + "encoreOnAdd": "{{pokemonNameWithAffix}}接受了再來一次!", + "encoreOnRemove": "{{pokemonNameWithAffix}}的再來一次狀態解除了!", + "helpingHandOnAdd": "{{pokemonNameWithAffix}}擺出了幫助{{pokemonName}} 的架勢!", + "ingrainLapse": "{{pokemonNameWithAffix}}用扎根回復了體力!", + "ingrainOnTrap": "{{pokemonNameWithAffix}}扎根了!", + "aquaRingOnAdd": "{{pokemonNameWithAffix}}用水流環包裹了自己!", + "aquaRingLapse": "{{moveName}}回復了{{pokemonName}}的體力!", + "drowsyOnAdd": "{{pokemonNameWithAffix}}產生睡意了!", + "damagingTrapLapse": "{{pokemonNameWithAffix}}受到了{{moveName}}的傷害!", + "bindOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}的 {{moveName}}緊緊束縛住了!", + "wrapOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}綁緊了!", + "vortexOnTrap": "{{pokemonNameWithAffix}}被困在了旋渦之中!", + "clampOnTrap": "{{sourcePokemonNameWithAffix}}用貝殼夾住了{{pokemonName}}!", + "sandTombOnTrap": "{{pokemonNameWithAffix}}被{{moveName}}困住了!", + "magmaStormOnTrap": "{{pokemonNameWithAffix}}被困在了熔岩風暴之中!", + "snapTrapOnTrap": "{{pokemonNameWithAffix}}被捕獸夾困住了!", + "thunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了{{pokemonNameWithAffix}}!", + "infestationOnTrap": "{{pokemonNameWithAffix}}受到了{{sourcePokemonNameWithAffix}}的死纏爛打!", + "protectedOnAdd": "{{pokemonNameWithAffix}}擺出了防守的架勢!", + "protectedLapse": "{{pokemonNameWithAffix}}在攻擊中保護了自己!", + "enduringOnAdd": "{{pokemonNameWithAffix}}擺出了挺住攻擊的架勢!", + "enduringLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", + "sturdyLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", + "perishSongLapse": "{{pokemonNameWithAffix}} 的滅亡計時變成{{turnCount}}了!", + "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n變得萬眾矚目了!", + "truantLapse": "{{pokemonNameWithAffix}}正在偷懶!", + "slowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!", + "slowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!", + "highestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!", + "highestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!", + "magnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因電磁力浮了起來!", + "magnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n電磁力消失了!", + "critBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!", + "critBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。", + "saltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", + "saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", + "cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!", + "cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", + "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{moveName}}!", + "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!" +} diff --git a/src/locales/zh_TW/berry.json b/src/locales/zh_TW/berry.json new file mode 100644 index 00000000000..ba16fec0900 --- /dev/null +++ b/src/locales/zh_TW/berry.json @@ -0,0 +1,46 @@ +{ + "SITRUS": { + "name": "文柚果", + "effect": "HP低於50%時,恢復最大HP的25%" + }, + "LUM": { + "name": "木子果", + "effect": "治癒任何異常狀態和混亂狀態" + }, + "ENIGMA": { + "name": "謎芝果", + "effect": "受到效果絕佳的招式攻擊時,恢復25%最大HP" + }, + "LIECHI": { + "name": "枝荔果", + "effect": "HP低於25%時,攻擊提升一個等級" + }, + "GANLON": { + "name": "龍睛果", + "effect": "HP低於25%時,防禦提升一個等級" + }, + "PETAYA": { + "name": "龍火果", + "effect": "HP低於25%時,特攻提升一個等級" + }, + "APICOT": { + "name": "杏仔果", + "effect": "HP低於25%時,特防提升一個等級" + }, + "SALAC": { + "name": "沙鱗果", + "effect": "HP低於25%時,速度提升一個等級" + }, + "LANSAT": { + "name": "蘭薩果", + "effect": "HP低於25%時,擊中要害率提升兩個等級" + }, + "STARF": { + "name": "星桃果", + "effect": "HP低於25%時,提高隨機一項能力兩個等級" + }, + "LEPPA": { + "name": "蘋野果", + "effect": "有招式的PP降到0時,恢復該招式10PP" + } +} \ No newline at end of file diff --git a/src/locales/zh_TW/berry.ts b/src/locales/zh_TW/berry.ts deleted file mode 100644 index a084ef91aa5..00000000000 --- a/src/locales/zh_TW/berry.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BerryTranslationEntries } from "#app/interfaces/locales"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "文柚果", - effect: "HP低於50%時,恢復最大HP的25%", - }, - "LUM": { - name: "木子果", - effect: "治癒任何異常狀態和混亂狀態", - }, - "ENIGMA": { - name: "謎芝果", - effect: "受到效果絕佳的招式攻擊時,恢復25%最大HP", - }, - "LIECHI": { - name: "枝荔果", - effect: "HP低於25%時,攻擊提升一個等級", - }, - "GANLON": { - name: "龍睛果", - effect: "HP低於25%時,防禦提升一個等級", - }, - "PETAYA": { - name: "龍火果", - effect: "HP低於25%時,特攻提升一個等級", - }, - "APICOT": { - name: "杏仔果", - effect: "HP低於25%時,特防提升一個等級", - }, - "SALAC": { - name: "沙鱗果", - effect: "HP低於25%時,速度提升一個等級", - }, - "LANSAT": { - name: "蘭薩果", - effect: "HP低於25%時,擊中要害率提升兩個等級", - }, - "STARF": { - name: "星桃果", - effect: "HP低於25%時,提高隨機一項能力兩個等級", - }, - "LEPPA": { - name: "蘋野果", - effect: "有招式的PP降到0時,恢復該招式10PP", - }, -} as const; diff --git a/src/locales/zh_TW/bgm-name.json b/src/locales/zh_TW/bgm-name.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/zh_TW/bgm-name.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/zh_TW/bgm-name.ts b/src/locales/zh_TW/bgm-name.ts deleted file mode 100644 index ef15c6c6dcb..00000000000 --- a/src/locales/zh_TW/bgm-name.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const bgmName: SimpleTranslationEntries = { - "music": "Music", - "missing_entries" : "{{name}}", - "battle_kanto_champion": "B2W2 Kanto Champion Battle", - "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", - "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", - "battle_champion_alder": "BW Unova Champion Battle", - "battle_champion_iris": "B2W2 Unova Champion Battle", - "battle_kalos_champion": "XY Kalos Champion Battle", - "battle_alola_champion": "USUM Alola Champion Battle", - "battle_galar_champion": "SWSH Galar Champion Battle", - "battle_champion_geeta": "SV Champion Geeta Battle", - "battle_champion_nemona": "SV Champion Nemona Battle", - "battle_champion_kieran": "SV Champion Kieran Battle", - "battle_hoenn_elite": "ORAS Elite Four Battle", - "battle_unova_elite": "BW Elite Four Battle", - "battle_kalos_elite": "XY Elite Four Battle", - "battle_alola_elite": "SM Elite Four Battle", - "battle_galar_elite": "SWSH League Tournament Battle", - "battle_paldea_elite": "SV Elite Four Battle", - "battle_bb_elite": "SV BB League Elite Four Battle", - "battle_final_encounter": "PMD RTDX Rayquaza's Domain", - "battle_final": "BW Ghetsis Battle", - "battle_kanto_gym": "B2W2 Kanto Gym Battle", - "battle_johto_gym": "B2W2 Johto Gym Battle", - "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", - "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", - "battle_unova_gym": "BW Unova Gym Battle", - "battle_kalos_gym": "XY Kalos Gym Battle", - "battle_galar_gym": "SWSH Galar Gym Battle", - "battle_paldea_gym": "SV Paldea Gym Battle", - "battle_legendary_kanto": "XY Kanto Legendary Battle", - "battle_legendary_raikou": "HGSS Raikou Battle", - "battle_legendary_entei": "HGSS Entei Battle", - "battle_legendary_suicune": "HGSS Suicune Battle", - "battle_legendary_lugia": "HGSS Lugia Battle", - "battle_legendary_ho_oh": "HGSS Ho-oh Battle", - "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", - "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", - "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", - "battle_legendary_rayquaza": "ORAS Rayquaza Battle", - "battle_legendary_deoxys": "ORAS Deoxys Battle", - "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", - "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", - "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", - "battle_legendary_giratina": "ORAS Giratina Battle", - "battle_legendary_arceus": "HGSS Arceus Battle", - "battle_legendary_unova": "BW Unova Legendary Battle", - "battle_legendary_kyurem": "BW Kyurem Battle", - "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", - "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", - "battle_legendary_tapu": "SM Tapu Battle", - "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", - "battle_legendary_ub": "SM Ultra Beast Battle", - "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", - "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", - "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", - "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", - "battle_legendary_calyrex": "SWSH Calyrex Battle", - "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", - "battle_legendary_ruinous": "SV Treasures of Ruin Battle", - "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", - "battle_legendary_loyal_three": "SV Loyal Three Battle", - "battle_legendary_ogerpon": "SV Ogerpon Battle", - "battle_legendary_terapagos": "SV Terapagos Battle", - "battle_legendary_pecharunt": "SV Pecharunt Battle", - "battle_rival": "BW Rival Battle", - "battle_rival_2": "BW N Battle", - "battle_rival_3": "BW Final N Battle", - "battle_trainer": "BW Trainer Battle", - "battle_wild": "BW Wild Battle", - "battle_wild_strong": "BW Strong Wild Battle", - "end_summit": "PMD RTDX Sky Tower Summit", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", - "battle_plasma_grunt": "BW Team Plasma Battle", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", - - // Biome Music - "abyss": "PMD EoS Dark Crater", - "badlands": "PMD EoS Barren Valley", - "beach": "PMD EoS Drenched Bluff", - "cave": "PMD EoS Sky Peak Cave", - "construction_site": "PMD EoS Boulder Quarry", - "desert": "PMD EoS Northern Desert", - "dojo": "PMD EoS Marowak Dojo", - "end": "PMD RTDX Sky Tower", - "factory": "PMD EoS Concealed Ruins", - "fairy_cave": "PMD EoS Star Cave", - "forest": "PMD EoS Dusk Forest", - "grass": "PMD EoS Apple Woods", - "graveyard": "PMD EoS Mystifying Forest", - "ice_cave": "PMD EoS Vast Ice Mountain", - "island": "PMD EoS Craggy Coast", - "jungle": "Lmz - Jungle", // The composer thinks about a more creative name - "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name - "lake": "PMD EoS Crystal Cave", - "meadow": "PMD EoS Sky Peak Forest", - "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name - "mountain": "PMD EoS Mt. Horn", - "plains": "PMD EoS Sky Peak Prairie", - "power_plant": "PMD EoS Far Amp Plains", - "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", - "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", - "snowy_forest": "PMD EoS Sky Peak Snowfield", - "space": "Firel - Aether", - "swamp": "PMD EoS Surrounded Sea", - "tall_grass": "PMD EoS Foggy Forest", - "temple": "PMD EoS Aegis Cave", - "town": "PMD EoS Random Dungeon Theme 3", - "volcano": "PMD EoS Steam Cave", - "wasteland": "PMD EoS Hidden Highland", - - // Encounter - "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", - "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", - "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", - "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", - "encounter_lass": "BW Trainers' Eyes Meet (Lass)", - "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", - "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", - "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", - "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", - "encounter_rival": "BW Cheren", - "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", - "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", - "encounter_twins": "BW Trainers' Eyes Meet (Twins)", - "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", - - // Other - "heal": "BW Pokémon Heal", - "menu": "PMD EoS Welcome to the World of Pokémon!", - "title": "PMD EoS Top Menu Theme", -} as const; diff --git a/src/locales/zh_TW/biome.ts b/src/locales/zh_TW/biome.json similarity index 85% rename from src/locales/zh_TW/biome.ts rename to src/locales/zh_TW/biome.json index dbfa2f7adb9..5f10d817377 100644 --- a/src/locales/zh_TW/biome.ts +++ b/src/locales/zh_TW/biome.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const biome: SimpleTranslationEntries = { +{ "unknownLocation": "未知領域", "TOWN": "城鎮", "PLAINS": "平原", @@ -36,5 +34,5 @@ export const biome: SimpleTranslationEntries = { "SNOWY_FOREST": "冰雪森林", "ISLAND": "島嶼", "LABORATORY": "研究所", - "END": "???", -} as const; + "END": "???" +} \ No newline at end of file diff --git a/src/locales/zh_TW/challenges.ts b/src/locales/zh_TW/challenges.json similarity index 69% rename from src/locales/zh_TW/challenges.ts rename to src/locales/zh_TW/challenges.json index e702ec4f278..a1fc6b8f50f 100644 --- a/src/locales/zh_TW/challenges.ts +++ b/src/locales/zh_TW/challenges.json @@ -1,6 +1,4 @@ -import { TranslationEntries } from "#app/interfaces/locales"; - -export const challenges: TranslationEntries = { +{ "title": "適用挑戰條件", "illegalEvolution": "{{pokemon}} 進化成了不符合\n挑戰條件的寶可夢!", "singleGeneration": { @@ -15,11 +13,18 @@ export const challenges: TranslationEntries = { "gen_6": "六", "gen_7": "七", "gen_8": "八", - "gen_9": "九", + "gen_9": "九" }, "singleType": { "name": "單屬性", "desc": "你只能使用{{type}}\n屬性的寶可夢", "desc_default": "你只能使用所選\n屬性的寶可夢" }, -} as const; + "inverseBattle": { + "name": "逆轉之戰", + "shortName": "逆轉之戰", + "desc": "屬性相克關系被反轉,且沒有任何屬性對其他屬性免疫。\n禁用其他挑戰的成就。", + "value.0": "關閉", + "value.1": "開啓" + } +} \ No newline at end of file diff --git a/src/locales/zh_TW/command-ui-handler.json b/src/locales/zh_TW/command-ui-handler.json new file mode 100644 index 00000000000..224835addaf --- /dev/null +++ b/src/locales/zh_TW/command-ui-handler.json @@ -0,0 +1,7 @@ +{ + "fight": "戰鬥", + "ball": "精靈球", + "pokemon": "寶可夢", + "run": "逃跑", + "actionMessage": "要讓\n{{pokemonName}} 做甚麼?" +} \ No newline at end of file diff --git a/src/locales/zh_TW/command-ui-handler.ts b/src/locales/zh_TW/command-ui-handler.ts deleted file mode 100644 index 300b20224b3..00000000000 --- a/src/locales/zh_TW/command-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const commandUiHandler: SimpleTranslationEntries = { - "fight": "戰鬥", - "ball": "精靈球", - "pokemon": "寶可夢", - "run": "逃跑", - "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", -} as const; diff --git a/src/locales/zh_TW/common.json b/src/locales/zh_TW/common.json new file mode 100644 index 00000000000..29ac963ebc3 --- /dev/null +++ b/src/locales/zh_TW/common.json @@ -0,0 +1,8 @@ +{ + "start": "開始", + "luckIndicator": "Luck:", + "shinyOnHover": "Shiny", + "commonShiny": "常見", + "rareShiny": "稀有", + "epicShiny": "史詩" +} \ No newline at end of file diff --git a/src/locales/zh_TW/common.ts b/src/locales/zh_TW/common.ts deleted file mode 100644 index c3dc42785ee..00000000000 --- a/src/locales/zh_TW/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const common: SimpleTranslationEntries = { - "start": "開始", -} as const; diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index 688f3b47033..cf505d683a5 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -1,94 +1,113 @@ -import { ability } from "./ability"; -import { abilityTriggers } from "./ability-trigger"; -import { PGFachv, PGMachv } from "./achv"; -import { battle } from "./battle"; -import { battleMessageUiHandler } from "./battle-message-ui-handler"; -import { berry } from "./berry"; -import { bgmName } from "./bgm-name"; -import { biome } from "./biome"; -import { challenges } from "./challenges"; -import { commandUiHandler } from "./command-ui-handler"; -import { - PGFbattleSpecDialogue, - PGFdialogue, - PGFdoubleBattleDialogue, - PGFmiscDialogue, - PGMbattleSpecDialogue, - PGMdialogue, - PGMdoubleBattleDialogue, - PGMmiscDialogue -} from "./dialogue"; -import { egg } from "./egg"; -import { fightUiHandler } from "./fight-ui-handler"; -import { gameMode } from "./game-mode"; -import { gameStatsUiHandler } from "./game-stats-ui-handler"; -import { growth } from "./growth"; -import { menu } from "./menu"; -import { menuUiHandler } from "./menu-ui-handler"; -import { modifierType } from "./modifier-type"; -import { move } from "./move"; -import { nature } from "./nature"; -import { pokeball } from "./pokeball"; -import { pokemon } from "./pokemon"; -import { pokemonInfo } from "./pokemon-info"; -import { pokemonInfoContainer } from "./pokemon-info-container"; -import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; -import { splashMessages } from "./splash-messages"; -import { starterSelectUiHandler } from "./starter-select-ui-handler"; -import { statusEffect } from "./status-effect"; -import { titles, trainerClasses, trainerNames } from "./trainers"; -import { tutorial } from "./tutorial"; -import { voucher } from "./voucher"; -import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; +import common from "./common.json"; +import settings from "./settings.json"; +import ability from "./ability.json"; +import abilityTriggers from "./ability-trigger.json"; +import arenaFlyout from "./arena-flyout.json"; +import arenaTag from "./arena-tag.json"; +import achv from "./achv.json"; +import battle from "./battle.json"; +import battleScene from "./battle-scene.json"; +import battleInfo from "./battle-info.json"; +import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battlerTags from "./battler-tags.json"; +import berry from "./berry.json"; +import bgmName from "./bgm-name.json"; +import biome from "./biome.json"; +import challenges from "./challenges.json"; +import commandUiHandler from "./command-ui-handler.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"; +import gameMode from "./game-mode.json"; +import gameStatsUiHandler from "./game-stats-ui-handler.json"; +import growth from "./growth.json"; +import menu from "./menu.json"; +import menuUiHandler from "./menu-ui-handler.json"; +import modifier from "./modifier.json"; +import modifierType from "./modifier-type.json"; +import move from "./move.json"; +import nature from "./nature.json"; +import partyUiHandler from "./party-ui-handler.json"; +import pokeball from "./pokeball.json"; +import pokemon from "./pokemon.json"; +import pokemonForm from "./pokemon-form.json"; +import battlePokemonForm from "./pokemon-form-battle.json"; +import pokemonInfo from "./pokemon-info.json"; +import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonSummary from "./pokemon-summary.json"; +import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import splashMessages from "./splash-messages.json"; +import starterSelectUiHandler from "./starter-select-ui-handler.json"; +import statusEffect from "./status-effect.json"; +import trainerTitles from "./trainer-titles.json"; +import trainerClasses from "./trainer-classes.json"; +import trainerNames from "./trainer-names.json"; +import tutorial from "./tutorial.json"; +import voucher from "./voucher.json"; +import weather from "./weather.json"; +import terrain from "./terrain.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; +import moveTriggers from "./move-trigger.json"; +import runHistory from "./run-history.json"; export const zhTwConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - bgmName: bgmName, - biome: biome, - challenges: challenges, - commandUiHandler: commandUiHandler, - common: common, - PGMachv: PGMachv, - PGFachv: PGFachv, - PGMdialogue: PGMdialogue, - PGFdialogue: PGFdialogue, - PGMbattleSpecDialogue: PGMbattleSpecDialogue, - PGFbattleSpecDialogue: PGFbattleSpecDialogue, - PGMmiscDialogue: PGMmiscDialogue, - PGFmiscDialogue: PGFmiscDialogue, - PGMdoubleBattleDialogue: PGMdoubleBattleDialogue, - PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, - egg: egg, - fightUiHandler: fightUiHandler, - gameMode: gameMode, - gameStatsUiHandler: gameStatsUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - pokemonInfoContainer: pokemonInfoContainer, - saveSlotSelectUiHandler: saveSlotSelectUiHandler, - settings: settings, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - statusEffect: statusEffect, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - voucher: voucher, - weather: weather, - partyUiHandler: partyUiHandler + ability, + abilityTriggers, + arenaFlyout, + arenaTag, + battle, + battleScene, + battleInfo, + battleMessageUiHandler, + battlePokemonForm, + battlerTags, + berry, + bgmName, + biome, + challenges, + commandUiHandler, + common, + achv, + dialogue, + battleSpecDialogue, + miscDialogue, + doubleBattleDialogue, + egg, + fightUiHandler, + filterBar, + gameMode, + gameStatsUiHandler, + growth, + menu, + menuUiHandler, + modifier, + modifierType, + move, + nature, + pokeball, + pokemon, + pokemonForm, + pokemonInfo, + pokemonInfoContainer, + pokemonSummary, + saveSlotSelectUiHandler, + settings, + splashMessages, + starterSelectUiHandler, + statusEffect, + terrain, + titles: trainerTitles, + trainerClasses, + trainerNames, + tutorial, + voucher, + weather, + partyUiHandler, + modifierSelectUiHandler, + moveTriggers, + runHistory, }; diff --git a/src/locales/zh_TW/dialogue-double-battle.json b/src/locales/zh_TW/dialogue-double-battle.json new file mode 100644 index 00000000000..684beac5eaf --- /dev/null +++ b/src/locales/zh_TW/dialogue-double-battle.json @@ -0,0 +1,82 @@ +{ + "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-final-boss.json b/src/locales/zh_TW/dialogue-final-boss.json new file mode 100644 index 00000000000..13bfee9eb96 --- /dev/null +++ b/src/locales/zh_TW/dialogue-final-boss.json @@ -0,0 +1,5 @@ +{ + "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-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.json b/src/locales/zh_TW/dialogue.json new file mode 100644 index 00000000000..4236e239622 --- /dev/null +++ b/src/locales/zh_TW/dialogue.json @@ -0,0 +1,2137 @@ +{ + "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.ts b/src/locales/zh_TW/dialogue.ts deleted file mode 100644 index 0823236bc84..00000000000 --- a/src/locales/zh_TW/dialogue.ts +++ /dev/null @@ -1,2457 +0,0 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Dialogue of the NPCs in the game when the player character is male (or unset) -export const PGMdialogue: DialogueTranslationEntries = { - "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: "好像是我暈船了…" - }, - }, - "rocket_grunt": { - "encounter": { - 1: "Prepare for trouble!" - }, - "victory": { - 1: "Team Rocket blasting off again!" - }, - }, - "magma_grunt": { - "encounter": { - 1: " If you get in the way of Team Magma, don’t expect any mercy!" - }, - "victory": { - 1: "Huh? I lost?!" - }, - }, - "aqua_grunt": { - "encounter": { - 1: "No one who crosses Team Aqua gets any mercy, not even kids!" - }, - "victory": { - 1: "You're kidding me!" - }, - }, - "galactic_grunt": { - "encounter": { - 1: "Don't mess with Team Galactic!" - }, - "victory": { - 1: "Shut down..." - }, - }, - "plasma_grunt": { - "encounter": { - 1: "We won't tolerate people who have different ideas!" - }, - "victory": { - 1: "Plasmaaaaaaaaa!" - }, - }, - "flare_grunt": { - "encounter": { - 1: "Fashion is most important to us!" - }, - "victory": { - 1: "The future doesn't look bright for me." - }, - }, - "rocket_boss_giovanni_1": { - "encounter": { - 1: "So! I must say, I am impressed you got here!" - }, - "victory": { - 1: "WHAT! This cannot be!" - }, - "defeat": { - 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." - } - }, - "rocket_boss_giovanni_2": { - "encounter": { - 1: "My old associates need me... Are you going to get in my way?" - }, - "victory": { - 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." - }, - "defeat": { - 1: "Team Rocket will be reborn again, and I will rule the world!" - } - }, - "magma_boss_maxie_1": { - "encounter": { - 1: "I will bury you by my own hand. I hope you appreciate this honor!" - }, - "victory": { - 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." - }, - "defeat": { - 1: "Team Magma will prevail!" - } - }, - "magma_boss_maxie_2": { - "encounter": { - 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" - }, - "victory": { - 1: "This... This is not.. Ngh..." - }, - "defeat": { - 1: "And now... I will transform this planet to a land ideal for humanity." - } - }, - "aqua_boss_archie_1": { - "encounter": { - 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." - }, - "victory": { - 1: "Let's meet again somewhere. I'll be sure to remember that face." - }, - "defeat": { - 1: "Brilliant! My team won't hold back now!" - } - }, - "aqua_boss_archie_2": { - "encounter": { - 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" - }, - "victory": { - 1: "Like I figured..." - }, - "defeat": { - 1: "I'll return everything in this world to its original, pure state!!" - } - }, - "galactic_boss_cyrus_1": { - "encounter": { - 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" - }, - "victory": { - 1: "Interesting. And quite curious." - }, - "defeat": { - 1: "I will create my new world..." - } - }, - "galactic_boss_cyrus_2": { - "encounter": { - 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" - }, - "victory": { - 1: "How? How? HOW?!" - }, - "defeat": { - 1: "Farewell." - } - }, - "plasma_boss_ghetsis_1": { - "encounter": { - 1: "I won't allow anyone to stop me! No matter who does what!" - }, - "victory": { - 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" - }, - "defeat": { - 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" - } - }, - "plasma_boss_ghetsis_2": { - "encounter": { - 1: "Come now! I want to see your face at the moment you lose all hope!" - }, - "victory": { - 1: "My calculations... No! My careful schemes! The world should be mine!" - }, - "defeat": { - 1: "Kyurem! Use Absofusion!" - } - }, - "flare_boss_lysandre_1": { - "encounter": { - 1: "Do you want to stop me? Show me in battle." - }, - "victory": { - 1: "You are here to stop me. But I ask you to wait. " - }, - "defeat": { - 1: "Pokemon...Shall no longer exist." - } - }, - "flare_boss_lysandre_2": { - "encounter": { - 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" - }, - "victory": { - 1: "Whaugh!" - }, - "defeat": { - 1: "Fools with no vision will continue to befoul this beautiful world." - } - }, - "brock": { - "encounter": { - 1: "我對岩石屬性寶可夢的專精會擊敗你!來吧!", - 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: "你應該準備好了吧,\一起完成這美麗的藝術作品吧!", - }, - "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: `戰鬥結束後,我的心像是吹過了溫和的風… - $真是厲害!` - } - }, - "kieran": { - "encounter": { - 1: `我的努力讓我越來越強! - $所以我不會輸。` - }, - "victory": { - 1: `不可能… - $真是一場有趣又激動人心的戰鬥啊!` - }, - "defeat": { - 1: `哇塞,好一場戰鬥! - $你得多練練了。` - } - }, - "rival": { - "encounter": { - 1: "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟,我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!", - }, - "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}……謝謝你。", - }, - }, -}; - - -// Dialogue of the NPCs in the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = PGMdialogue; - -// Dialogue of the endboss of the game when the player character is male (Or unset) -export const PGMbattleSpecDialogue: SimpleTranslationEntries = { - "encounter": `看來終於又到了那個時候。\n你知道自己為何會來到這裡,不是嗎? - $你被吸引到這裡,因為你以前就來過這裡。\n無數次。 - $儘管,或許可以數一數。\n準確地說,這實際上是你的第5,643,853次循環。 - $每一次循環,你的思想都會恢復到之前的狀態。\n即便如此,不知何故,你之前自我的殘留仍然存在。 - $直到現在,你仍未成功,但我感覺這次你身上有一種異樣的氣息。 - $你是這裡唯一的人,儘管感覺上還有……另一個人。 - $你最終會成為對我來的一個硬茬嗎?\n我渴望了數千年的挑戰? - $我們,開始。`, - "firstStageWin": `我明白了。我所感覺到的氣息確實是真實的。\n看來我不再需要保留實力了。 - $別讓我失望。`, - "secondStageWin": "…漂亮。" -}; - -// Dialogue of the endboss of the game when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDialogue; - -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male -export const PGMmiscDialogue: SimpleTranslationEntries = { - "ending": - `@c{smile}哦?你贏了?@d{96} @c{smile_eclosed}我應該早猜到了\n你回來了。 - $@c{smile}結束了。@d{64} 你終結了這個循環。 - $@c{serious_smile_fists}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。 - $@c{neutral}我是唯一能夠記得你所作所為的人@d{96}\n我覺得這應該也還行吧? - $@c{serious_smile_fists}你的傳奇將永遠留存於我們心中。 - $@c{smile_eclosed}不管了,我真是受夠這個地方了,你也一樣嗎?我們回家吧。 - $@c{serious_smile_fists}可能等我們回家以後,再打一場?\n要是你想的話`, - "ending_female": - `@c{shock}你回來了?@d{32} 也就是說…@d{96} 你贏了呀!?\n@c{smile_ehalf}我應該早料到了。 - $@c{smile_eclosed}當然…我一直有這種感覺\n@c{smile}一切都結束了,對麼? 你打破了循環。 - $@c{smile_ehalf}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。 - $我是唯一能夠記得你所作所為的人\n@c{angry_mopen}我會努力不忘掉哒! - $@c{smile_wave_wink}開玩笑啦,@d{64} @c{smile}我才不會忘呢。@d{32}\n你的傳奇將永遠留存於我們心中。 - $@c{smile_wave}不管了,@d{64} 時候不早了@d{96} ,應該吧?\n在這地方還真搞不清楚。 - $一起回家吧。 @c{smile_wave_wink}可能明天,我們再來打一場,為了重溫回憶嘛~`, -}; -// Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is female. For languages that do not have gendered pronouns, this can be set to PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; - - -// Dialogue of the named double battles in the game. For when the player is male (or unset). -export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { - "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: "聶梓:這首歌獻給大家!$瑪俐:哥哥……", - }, - }, -}; - -// Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = PGMdoubleBattleDialogue; diff --git a/src/locales/zh_TW/egg.ts b/src/locales/zh_TW/egg.json similarity index 88% rename from src/locales/zh_TW/egg.ts rename to src/locales/zh_TW/egg.json index eecfcf0b735..28e5e1b9bda 100644 --- a/src/locales/zh_TW/egg.ts +++ b/src/locales/zh_TW/egg.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const egg: SimpleTranslationEntries = { +{ "egg": "蛋", "greatTier": "稀有", "ultraTier": "史詩", @@ -22,4 +20,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!", "eggMoveUnlock": "蛋招式已解鎖: {{moveName}}", "rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}", -} as const; + "moveUPGacha": "蛋招式UP!", + "shinyUPGacha": "闪光UP!", + "legendaryUPGacha": "UP!" +} \ No newline at end of file diff --git a/src/locales/zh_TW/fight-ui-handler.json b/src/locales/zh_TW/fight-ui-handler.json new file mode 100644 index 00000000000..3cf1868196a --- /dev/null +++ b/src/locales/zh_TW/fight-ui-handler.json @@ -0,0 +1,7 @@ +{ + "pp": "PP", + "power": "威力", + "accuracy": "命中率", + "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", + "passive": "被動能力 " +} \ No newline at end of file diff --git a/src/locales/zh_TW/fight-ui-handler.ts b/src/locales/zh_TW/fight-ui-handler.ts deleted file mode 100644 index d86a703d844..00000000000 --- a/src/locales/zh_TW/fight-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "威力", - "accuracy": "命中率", - "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", - "passive": "被動能力 ", // The space at the end is important -} as const; diff --git a/src/locales/zh_TW/filter-bar.json b/src/locales/zh_TW/filter-bar.json new file mode 100644 index 00000000000..80688c19767 --- /dev/null +++ b/src/locales/zh_TW/filter-bar.json @@ -0,0 +1,38 @@ +{ + "genFilter": "世代", + "typeFilter": "屬性", + "caughtFilter": "捕獲", + "unlocksFilter": "解鎖", + "miscFilter": "混合", + "sortFilter": "排序", + "all": "全部", + "normal": "通常", + "uncaught": "未捕獲", + "passive": "被動", + "passiveUnlocked": "被動解鎖", + "passiveLocked": "被動未解鎖", + "passiveUnlockable": "被動可解鎖", + "costReduction": "費用降低", + "costReductionUnlocked": "已降費", + "costReductionLocked": "未降費", + "costReductionUnlockable": "可降費", + "favorite": "最愛", + "isFavorite": "包含最愛", + "notFavorite": "不包含最愛", + "ribbon": "緞帶", + "hasWon": "有緞帶", + "hasNotWon": "無緞帶", + "hiddenAbility": "隱藏特性", + "hasHiddenAbility": "有隱藏特性", + "noHiddenAbility": "無隱藏特性", + "egg": "蛋", + "eggPurchasable": "可購買蛋", + "pokerus": "病毒", + "hasPokerus": "有病毒", + "noPokerus": "無病毒", + "sortByNumber": "編號", + "sortByCost": "花費", + "sortByCandies": "糖果", + "sortByIVs": "個體值", + "sortByName": "名稱" +} \ No newline at end of file diff --git a/src/locales/zh_TW/game-mode.json b/src/locales/zh_TW/game-mode.json new file mode 100644 index 00000000000..b41dbdcae96 --- /dev/null +++ b/src/locales/zh_TW/game-mode.json @@ -0,0 +1,8 @@ +{ + "classic": "經典模式", + "endless": "無盡模式", + "endlessSpliced": "融合無盡模式", + "dailyRun": "每日挑戰", + "unknown": "未知", + "challenge": "挑戰模式" +} \ No newline at end of file diff --git a/src/locales/zh_TW/game-mode.ts b/src/locales/zh_TW/game-mode.ts deleted file mode 100644 index dc2a227d638..00000000000 --- a/src/locales/zh_TW/game-mode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameMode: SimpleTranslationEntries = { - "classic": "經典模式", - "endless": "無盡模式", - "endlessSpliced": "融合無盡模式", - "dailyRun": "每日挑戰", - "unknown": "未知", - "challenge": "挑戰模式", -} as const; diff --git a/src/locales/zh_TW/game-stats-ui-handler.ts b/src/locales/zh_TW/game-stats-ui-handler.json similarity index 89% rename from src/locales/zh_TW/game-stats-ui-handler.ts rename to src/locales/zh_TW/game-stats-ui-handler.json index 343ae7240cb..ccd7f481fe1 100644 --- a/src/locales/zh_TW/game-stats-ui-handler.ts +++ b/src/locales/zh_TW/game-stats-ui-handler.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const gameStatsUiHandler: SimpleTranslationEntries = { +{ "stats": "統計", "playTime": "遊戲時間", "totalBattles": "總戰鬥次數", @@ -40,5 +38,5 @@ export const gameStatsUiHandler: SimpleTranslationEntries = { "rareEggsPulled": "稀有扭蛋數", "epicEggsPulled": "史詩扭蛋數", "legendaryEggsPulled": "傳說扭蛋數", - "manaphyEggsPulled": "瑪娜霏扭蛋數", -} as const; + "manaphyEggsPulled": "瑪娜霏扭蛋數" +} \ No newline at end of file diff --git a/src/locales/zh_TW/growth.ts b/src/locales/zh_TW/growth.json similarity index 51% rename from src/locales/zh_TW/growth.ts rename to src/locales/zh_TW/growth.json index a67f108052a..6e6d8db4b4a 100644 --- a/src/locales/zh_TW/growth.ts +++ b/src/locales/zh_TW/growth.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const growth: SimpleTranslationEntries = { +{ "Erratic": "最快", "Fast": "快", "Medium_Fast": "較快", "Medium_Slow": "較慢", "Slow": "慢", "Fluctuating": "最慢" -} as const; +} \ No newline at end of file diff --git a/src/locales/zh_TW/menu-ui-handler.ts b/src/locales/zh_TW/menu-ui-handler.json similarity index 70% rename from src/locales/zh_TW/menu-ui-handler.ts rename to src/locales/zh_TW/menu-ui-handler.json index 21ba10ba30e..33e6b44d73d 100644 --- a/src/locales/zh_TW/menu-ui-handler.ts +++ b/src/locales/zh_TW/menu-ui-handler.json @@ -1,10 +1,8 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const menuUiHandler: SimpleTranslationEntries = { +{ "GAME_SETTINGS": "遊戲設置", "ACHIEVEMENTS": "成就", "STATS": "數據", - "VOUCHERS": "兌換劵", + "RUN_HISTORY": "歷史記錄", "EGG_LIST": "蛋列表", "EGG_GACHA": "扭蛋機", "MANAGE_DATA": "管理數據", @@ -16,9 +14,11 @@ export const menuUiHandler: SimpleTranslationEntries = { "importSlotSelect": "選擇要導入到的存檔位。", "exportSession": "導出存檔", "exportSlotSelect": "選擇要導出的存檔位。", + "importRunHistory":"導入歷史記錄", + "exportRunHistory":"導出歷史記錄", "importData": "導入數據", "exportData": "導出數據", + "consentPreferences": "同意偏好", "cancel": "取消", - "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?", - "noEggs": "You are not hatching\nany eggs at the moment!" -} as const; + "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?" +} \ No newline at end of file diff --git a/src/locales/zh_TW/menu.ts b/src/locales/zh_TW/menu.json similarity index 67% rename from src/locales/zh_TW/menu.ts rename to src/locales/zh_TW/menu.json index 6d89bc256c6..b56a39bbda2 100644 --- a/src/locales/zh_TW/menu.ts +++ b/src/locales/zh_TW/menu.json @@ -1,11 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const menu: SimpleTranslationEntries = { +{ "cancel": "取消", "continue": "繼續", "dailyRun": "每日挑戰 (Beta)", @@ -17,6 +10,7 @@ export const menu: SimpleTranslationEntries = { "username": "用戶名", "password": "密碼", "login": "登入", + "orUse": "Or use", "register": "注冊", "emptyUsername": "用戶名不能為空", "invalidLoginUsername": "提供的用戶名無效", @@ -43,16 +37,10 @@ export const menu: SimpleTranslationEntries = { "weeklyRankings": "每週排名", "noRankings": "無排名", "positionIcon": "#", - "usernameScoreboard": "Username", - "score": "Score", - "wave": "Wave", "loading": "加載中…", - "loadingAsset": "Loading asset: {{assetName}}", "playersOnline": "在線玩家", - "yes":"是", - "no":"否", - "disclaimer": "DISCLAIMER", - "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", - "choosePokemon": "Choose a Pokémon.", - "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", -} as const; + "yes": "是", + "no": "否", + "noSaves": "你沒有任何記錄檔!", + "tooManySaves": "你的記錄檔太多了!" +} diff --git a/src/locales/zh_TW/modifier-select-ui-handler.json b/src/locales/zh_TW/modifier-select-ui-handler.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/zh_TW/modifier-select-ui-handler.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/zh_TW/modifier-type.json b/src/locales/zh_TW/modifier-type.json new file mode 100644 index 00000000000..ec066277cda --- /dev/null +++ b/src/locales/zh_TW/modifier-type.json @@ -0,0 +1,603 @@ +{ + "ModifierType": { + "AddPokeballModifierType": { + "name": "{{modifierCount}}x {{pokeballName}}", + "description": "獲得 {{pokeballName}} x{{modifierCount}} (已有:{{pokeballAmount}}) \n捕捉倍率:{{catchRate}}。" + }, + "AddVoucherModifierType": { + "name": "{{modifierCount}}x {{voucherTypeName}}", + "description": "獲得 {{voucherTypeName}} x{{modifierCount}}。" + }, + "PokemonHeldItemModifierType": { + "extra": { + "inoperable": "{{pokemonName}} 無法攜帶\n這個物品!", + "tooMany": "{{pokemonName}} 已有太多\n這個物品!" + } + }, + "PokemonHpRestoreModifierType": { + "description": "爲一隻寶可夢恢復 {{restorePoints}} HP 或 {{restorePercent}}% HP,取最大值。", + "extra": { + "fully": "爲一隻寶可夢恢復全部HP。", + "fullyWithStatus": "爲一隻寶可夢恢復全部HP並消除所有負面\n狀態。" + } + }, + "PokemonReviveModifierType": { + "description": "復活一隻寶可夢並恢復 {{restorePercent}}% HP。" + }, + "PokemonStatusHealModifierType": { + "description": "爲一隻寶可夢消除所有負面狀態。" + }, + "PokemonPpRestoreModifierType": { + "description": "爲一隻寶可夢的一個招式恢復 {{restorePoints}} PP。", + "extra": { + "fully": "完全恢復一隻寶可夢一個招式的PP。" + } + }, + "PokemonAllMovePpRestoreModifierType": { + "description": "爲一隻寶可夢的所有招式恢復 {{restorePoints}} PP。", + "extra": { + "fully": "爲一隻寶可夢的所有招式恢復所有PP。" + } + }, + "PokemonPpUpModifierType": { + "description": "永久提升一個招式的PP,每5點最大PP增加{{upPoints}} (最多3點)。" + }, + "PokemonNatureChangeModifierType": { + "name": "{{natureName}}薄荷", + "description": "將一隻寶可夢的性格改爲{{natureName}}併爲該寶可\n夢永久解鎖該性格。" + }, + "DoubleBattleChanceBoosterModifierType": { + "description": "遭遇雙打機率提升四倍,持續{{battleCount}}場戰鬥。" + }, + "TempStatStageBoosterModifierType": { + "description": "提升全隊的{{stat}}{{amount}}級,持續5場戰鬥。", + "extra": { + "stage": "1階", + "percentage": "30%" + } + }, + "AttackTypeBoosterModifierType": { + "description": "一隻寶可夢的{{moveType}}系招式威力提升20%。" + }, + "PokemonLevelIncrementModifierType": { + "description": "Increases a Pokémon's level by {{levels}}." + }, + "AllPokemonLevelIncrementModifierType": { + "description": "Increases all party members' level by {{levels}}." + }, + "BaseStatBoosterModifierType": { + "description": "增加持有者的{{stat}}10%,個體值越高堆疊\n上限越高。" + }, + "AllPokemonFullHpRestoreModifierType": { + "description": "所有寶可夢完全恢復HP。" + }, + "AllPokemonFullReviveModifierType": { + "description": "復活所有瀕死寶可夢,完全恢復HP。" + }, + "MoneyRewardModifierType": { + "description": "獲得{{moneyMultiplier}}金錢 (₽{{moneyAmount}})。", + "extra": { + "small": "少量", + "moderate": "中等", + "large": "大量" + } + }, + "ExpBoosterModifierType": { + "description": "經驗值獲取量增加{{boostPercent}}%。" + }, + "PokemonExpBoosterModifierType": { + "description": "持有者經驗值獲取量增加{{boostPercent}}%。" + }, + "PokemonFriendshipBoosterModifierType": { + "description": "每場戰鬥獲得的好感度提升50%。" + }, + "PokemonMoveAccuracyBoosterModifierType": { + "description": "招式命中率增加{{accuracyAmount}} (最大100)。" + }, + "PokemonMultiHitModifierType": { + "description": "攻擊造成一次額外傷害,每次堆疊額外傷害\n分別衰減60/75/82.5%。" + }, + "TmModifierType": { + "name": "招式學習器 {{moveId}} - {{moveName}}", + "description": "教會一隻寶可夢{{moveName}}。" + }, + "TmModifierTypeWithInfo": { + "name": "TM{{moveId}} - {{moveName}}", + "description": "教會一隻寶可夢{{moveName}}\n(Hold C or Shift for more info)。" + }, + "EvolutionItemModifierType": { + "description": "使某些寶可夢進化。" + }, + "FormChangeItemModifierType": { + "description": "使某些寶可夢更改形態。" + }, + "FusePokemonModifierType": { + "description": "融合兩隻寶可夢 (改變特性, 平分基礎點數\n和屬性, 共享招式池)。" + }, + "TerastallizeModifierType": { + "name": "{{teraType}}太晶碎塊", + "description": "持有者獲得{{teraType}}太晶化10場戰鬥。" + }, + "ContactHeldItemTransferChanceModifierType": { + "description": "攻擊時{{chancePercent}}%概率偷取對手物品。" + }, + "TurnHeldItemTransferModifierType": { + "description": "持有者每回合從對手那裏獲得一個持有的物品。" + }, + "EnemyAttackStatusEffectChanceModifierType": { + "description": "攻擊時{{chancePercent}}%概率造成{{statusEffect}}。" + }, + "EnemyEndureChanceModifierType": { + "description": "增加{{chancePercent}}%遭受攻擊的概率。" + }, + "RARE_CANDY": { + "name": "神奇糖果" + }, + "RARER_CANDY": { + "name": "超神奇糖果" + }, + "MEGA_BRACELET": { + "name": "超級手鐲", + "description": "能讓攜帶着超級石戰鬥的寶可夢進行\n超級進化。" + }, + "DYNAMAX_BAND": { + "name": "極巨腕帶", + "description": "能讓攜帶着極巨菇菇戰鬥的寶可夢進行\n極巨化。" + }, + "TERA_ORB": { + "name": "太晶珠", + "description": "能讓攜帶着太晶碎塊戰鬥的寶可夢進行\n太晶化。" + }, + "MAP": { + "name": "地圖", + "description": "允許你在切換寶可夢羣落時選擇目的地。" + }, + "POTION": { + "name": "傷藥" + }, + "SUPER_POTION": { + "name": "好傷藥" + }, + "HYPER_POTION": { + "name": "厲害傷藥" + }, + "MAX_POTION": { + "name": "全滿藥" + }, + "FULL_RESTORE": { + "name": "全復藥" + }, + "REVIVE": { + "name": "活力碎片" + }, + "MAX_REVIVE": { + "name": "活力塊" + }, + "FULL_HEAL": { + "name": "萬靈藥" + }, + "SACRED_ASH": { + "name": "聖灰" + }, + "REVIVER_SEED": { + "name": "復活種子", + "description": "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。" + }, + "ETHER": { + "name": "PP單項小補劑" + }, + "MAX_ETHER": { + "name": "PP單項全補劑" + }, + "ELIXIR": { + "name": "PP多項小補劑" + }, + "MAX_ELIXIR": { + "name": "PP多項全補劑" + }, + "PP_UP": { + "name": "PP提升劑" + }, + "PP_MAX": { + "name": "PP極限提升劑" + }, + "LURE": { + "name": "引蟲香水" + }, + "SUPER_LURE": { + "name": "白銀香水" + }, + "MAX_LURE": { + "name": "黃金香水" + }, + "MEMORY_MUSHROOM": { + "name": "回憶蘑菇", + "description": "回憶一個寶可夢已經遺忘的招式。" + }, + "EXP_SHARE": { + "name": "學習裝置", + "description": "未參加對戰的寶可夢獲得20%的經驗值。" + }, + "EXP_BALANCE": { + "name": "均衡型學習裝置", + "description": "隊伍中的低級寶可夢獲得更多經驗值。" + }, + "OVAL_CHARM": { + "name": "圓形護符", + "description": "當多隻寶可夢參與戰鬥,分別獲得總經驗值\n10%的額外經驗值。" + }, + "EXP_CHARM": { + "name": "經驗護符" + }, + "SUPER_EXP_CHARM": { + "name": "超級經驗護符" + }, + "GOLDEN_EXP_CHARM": { + "name": "黃金經驗護符" + }, + "LUCKY_EGG": { + "name": "幸運蛋" + }, + "GOLDEN_EGG": { + "name": "金蛋" + }, + "SOOTHE_BELL": { + "name": "安撫之鈴" + }, + "SCOPE_LENS": { + "name": "焦點鏡", + "description": "能看見弱點的鏡片。攜帶它的寶可夢的招式 會變得容易擊中要害。" + }, + "DIRE_HIT": { + "name": "要害攻擊", + "extra": { + "raises": "會心" + } + }, + "LEEK": { + "name": "大蔥", + "description": "非常長且堅硬的莖。讓大蔥鴨攜帶後,招式會 變得容易擊中要害。" + }, + "EVIOLITE": { + "name": "進化奇石", + "description": "進化的神奇石塊。攜帶後,還能進化的寶可夢的 防禦和特防就會提高。" + }, + "SOUL_DEW": { + "name": "心之水滴", + "description": "增加寶可夢性格影響10% (加算)。" + }, + "NUGGET": { + "name": "金珠" + }, + "BIG_NUGGET": { + "name": "巨大金珠" + }, + "RELIC_GOLD": { + "name": "古代金幣" + }, + "AMULET_COIN": { + "name": "護符金幣", + "description": "金錢獎勵增加20%。" + }, + "GOLDEN_PUNCH": { + "name": "黃金拳頭", + "description": "將50%造成的傷害轉換爲金錢。" + }, + "COIN_CASE": { + "name": "代幣盒", + "description": "每十場戰鬥, 獲得自己金錢10%的利息。" + }, + "LOCK_CAPSULE": { + "name": "上鎖的容器", + "description": "允許在刷新物品時鎖定物品稀有度。" + }, + "GRIP_CLAW": { + "name": "緊纏鉤爪" + }, + "WIDE_LENS": { + "name": "廣角鏡" + }, + "MULTI_LENS": { + "name": "多重鏡" + }, + "HEALING_CHARM": { + "name": "治癒護符", + "description": "HP恢復量增加10% (不含復活)。" + }, + "CANDY_JAR": { + "name": "糖果罐", + "description": "神奇糖果提供的升級提升1級。" + }, + "BERRY_POUCH": { + "name": "樹果袋", + "description": "使用樹果時有30%的幾率不會消耗樹果。" + }, + "FOCUS_BAND": { + "name": "氣勢頭帶", + "description": "攜帶該道具的寶可夢有10%幾率在受到\n攻擊而將陷入瀕死狀態時,保留1點HP不陷入瀕死狀態。" + }, + "QUICK_CLAW": { + "name": "先制之爪", + "description": "有10%的幾率無視速度優先使出招式\n(先制技能優先)。" + }, + "KINGS_ROCK": { + "name": "王者之證", + "description": "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時,有\n10%幾率使目標陷入畏縮狀態。" + }, + "LEFTOVERS": { + "name": "喫剩的東西", + "description": "攜帶該道具的寶可夢在每個回合結束時恢復\n最大HP的1/16。" + }, + "SHELL_BELL": { + "name": "貝殼之鈴", + "description": "攜帶該道具的寶可夢在攻擊對方成功造成傷\n害時,攜帶者的HP會恢復其所造成傷害\n的1/8。" + }, + "TOXIC_ORB": { + "name": "劇毒寶珠", + "description": "觸碰後會放出毒的神奇寶珠。\n攜帶後,在戰鬥時會變成劇毒狀態。" + }, + "FLAME_ORB": { + "name": "火焰寶珠", + "description": "觸碰後會放出熱量的神奇寶珠。\n攜帶後,在戰鬥時會變成灼傷狀態。" + }, + "BATON": { + "name": "接力棒", + "description": "允許在切換寶可夢時保留能力變化, 對陷阱\n同樣生效。" + }, + "SHINY_CHARM": { + "name": "閃耀護符", + "description": "顯著增加野生寶可夢的閃光概率。" + }, + "ABILITY_CHARM": { + "name": "特性護符", + "description": "顯著增加野生寶可夢有隱藏特性的概率。" + }, + "IV_SCANNER": { + "name": "個體值探測器", + "description": "允許掃描野生寶可夢的個體值。 每個次顯示\n2個個體值. 最好的個體值優先顯示。" + }, + "DNA_SPLICERS": { + "name": "基因之楔" + }, + "MINI_BLACK_HOLE": { + "name": "迷你黑洞" + }, + "GOLDEN_POKEBALL": { + "name": "黃金精靈球", + "description": "在每場戰鬥結束後增加一個額外物品選項。" + }, + "ENEMY_DAMAGE_BOOSTER": { + "name": "傷害硬幣", + "description": "增加5%造成傷害。" + }, + "ENEMY_DAMAGE_REDUCTION": { + "name": "防禦硬幣", + "description": "減少2.5%承受傷害。" + }, + "ENEMY_HEAL": { + "name": "恢復硬幣", + "description": "每回合恢復2%最大HP。" + }, + "ENEMY_ATTACK_POISON_CHANCE": { + "name": "劇毒硬幣" + }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { + "name": "麻痹硬幣" + }, + "ENEMY_ATTACK_BURN_CHANCE": { + "name": "灼燒硬幣" + }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { + "name": "萬靈藥硬幣", + "description": "增加2.5%每回合治癒異常狀態的概率。" + }, + "ENEMY_ENDURE_CHANCE": { + "name": "忍受硬幣" + }, + "ENEMY_FUSED_CHANCE": { + "name": "融合硬幣", + "description": "增加1%野生融合寶可夢出現概率。" + } + }, + "SpeciesBoosterItem": { + "LIGHT_BALL": { + "name": "電氣球", + "description": "讓皮卡丘攜帶後,攻擊和特攻就會 提高的神奇之球。" + }, + "THICK_CLUB": { + "name": "粗骨頭", + "description": "某種堅硬的骨頭。讓卡拉卡拉或嘎啦嘎啦攜帶後,攻擊就會提高。" + }, + "METAL_POWDER": { + "name": "金屬粉", + "description": "讓百變怪攜帶後,防禦就會提高的神奇粉末。非常細緻堅硬。" + }, + "QUICK_POWDER": { + "name": "速度粉", + "description": "讓百變怪攜帶後,速度就會提高的神奇粉末。非常細緻堅硬。" + } + }, + "TempStatStageBoosterItem": { + "x_attack": "力量強化", + "x_defense": "防禦強化", + "x_sp_atk": "特攻強化", + "x_sp_def": "特防強化", + "x_speed": "速度強化", + "x_accuracy": "命中強化" + }, + "AttackTypeBoosterItem": { + "silk_scarf": "絲綢圍巾", + "black_belt": "黑帶", + "sharp_beak": "銳利鳥嘴", + "poison_barb": "毒針", + "soft_sand": "柔軟沙子", + "hard_stone": "硬石頭", + "silver_powder": "銀粉", + "spell_tag": "詛咒之符", + "metal_coat": "金屬膜", + "charcoal": "木炭", + "mystic_water": "神祕水滴", + "miracle_seed": "奇蹟種子", + "magnet": "磁鐵", + "twisted_spoon": "彎曲的湯匙", + "never_melt_ice": "不融冰", + "dragon_fang": "龍之牙", + "black_glasses": "黑色眼鏡", + "fairy_feather": "妖精之羽" + }, + "BaseStatBoosterItem": { + "hp_up": "HP增強劑", + "protein": "攻擊增強劑", + "iron": "防禦增強劑", + "calcium": "特攻增強劑", + "zinc": "特防增強劑", + "carbos": "速度增強劑" + }, + "EvolutionItem": { + "NONE": "無", + "LINKING_CORD": "聯繫繩", + "SUN_STONE": "日之石", + "MOON_STONE": "月之石", + "LEAF_STONE": "葉之石", + "FIRE_STONE": "火之石", + "WATER_STONE": "水之石", + "THUNDER_STONE": "雷之石", + "ICE_STONE": "冰之石", + "DUSK_STONE": "暗之石", + "DAWN_STONE": "覺醒之石", + "SHINY_STONE": "光之石", + "CRACKED_POT": "破裂的茶壺", + "SWEET_APPLE": "甜甜蘋果", + "TART_APPLE": "酸酸蘋果", + "STRAWBERRY_SWEET": "草莓糖飾", + "UNREMARKABLE_TEACUP": "凡作茶碗", + "CHIPPED_POT": "缺損的茶壺", + "BLACK_AUGURITE": "黑奇石", + "GALARICA_CUFF": "伽勒豆蔻手環", + "GALARICA_WREATH": "伽勒豆蔻花圈", + "PEAT_BLOCK": "泥炭塊", + "AUSPICIOUS_ARMOR": "慶祝之鎧", + "MALICIOUS_ARMOR": "咒術之鎧", + "MASTERPIECE_TEACUP": "傑作茶碗", + "METAL_ALLOY": "複合金屬", + "SCROLL_OF_DARKNESS": "惡之掛軸", + "SCROLL_OF_WATERS": "水之掛軸", + "SYRUPY_APPLE": "蜜汁蘋果" + }, + "FormChangeItem": { + "NONE": "無", + "ABOMASITE": "暴雪王進化石", + "ABSOLITE": "阿勃梭魯進化石", + "AERODACTYLITE": "化石翼龍進化石", + "AGGRONITE": "波士可多拉進化石", + "ALAKAZITE": "胡地進化石", + "ALTARIANITE": "七夕青鳥進化石", + "AMPHAROSITE": "電龍進化石", + "AUDINITE": "差不多娃娃進化石", + "BANETTITE": "詛咒娃娃進化石", + "BEEDRILLITE": "大針蜂進化石", + "BLASTOISINITE": "水箭龜進化石", + "BLAZIKENITE": "火焰雞進化石", + "CAMERUPTITE": "噴火駝進化石", + "CHARIZARDITE_X": "噴火龍進化石X", + "CHARIZARDITE_Y": "噴火龍進化石Y", + "DIANCITE": "蒂安希進化石", + "GALLADITE": "艾路雷朵進化石", + "GARCHOMPITE": "烈咬陸鯊進化石", + "GARDEVOIRITE": "沙奈朵進化石", + "GENGARITE": "耿鬼進化石", + "GLALITITE": "冰鬼護進化石", + "GYARADOSITE": "暴鯉龍進化石", + "HERACRONITE": "赫拉克羅斯進化石", + "HOUNDOOMINITE": "黑魯加進化石", + "KANGASKHANITE": "袋獸進化石", + "LATIASITE": "拉帝亞斯進化石", + "LATIOSITE": "拉帝歐斯進化石", + "LOPUNNITE": "長耳兔進化石", + "LUCARIONITE": "路卡利歐進化石", + "MANECTITE": "雷電獸進化石", + "MAWILITE": "大嘴娃進化石", + "MEDICHAMITE": "恰雷姆進化石", + "METAGROSSITE": "巨金怪進化石", + "MEWTWONITE_X": "超夢進化石X", + "MEWTWONITE_Y": "超夢進化石Y", + "PIDGEOTITE": "大比鳥進化石", + "PINSIRITE": "凱羅斯進化石", + "RAYQUAZITE": "烈空坐進化石", + "SABLENITE": "勾魂眼進化石", + "SALAMENCITE": "暴飛龍進化石", + "SCEPTILITE": "蜥蜴王進化石", + "SCIZORITE": "巨鉗螳螂進化石", + "SHARPEDONITE": "巨牙鯊進化石", + "SLOWBRONITE": "呆殼獸進化石", + "STEELIXITE": "大鋼蛇進化石", + "SWAMPERTITE": "巨沼怪進化石", + "TYRANITARITE": "班基拉斯進化石", + "VENUSAURITE": "妙蛙花進化石", + "BLUE_ORB": "靛藍色寶珠", + "RED_ORB": "硃紅色寶珠", + "SHARP_METEORITE": "銳利隕石", + "HARD_METEORITE": "堅硬隕石", + "SMOOTH_METEORITE": "光滑隕石", + "ADAMANT_CRYSTAL": "大金剛寶玉", + "LUSTROUS_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": "礎石面具", + "SHOCK_DRIVE": "閃電卡帶", + "BURN_DRIVE": "火焰卡帶", + "CHILL_DRIVE": "冰凍卡帶", + "DOUSE_DRIVE": "水流卡帶", + "ULTRANECROZIUM_Z": "究極奈克洛Z", + "FIST_PLATE": "拳頭石板", + "SKY_PLATE": "藍天石板", + "TOXIC_PLATE": "劇毒石板", + "EARTH_PLATE": "大地石板", + "STONE_PLATE": "岩石石板", + "INSECT_PLATE": "玉蟲石板", + "SPOOKY_PLATE": "妖怪石板", + "IRON_PLATE": "鋼鐵石板", + "FLAME_PLATE": "火球石板", + "SPLASH_PLATE": "水滴石板", + "MEADOW_PLATE": "碧綠石板", + "ZAP_PLATE": "雷電石板", + "MIND_PLATE": "神奇石板", + "ICICLE_PLATE": "冰柱石板", + "DRACO_PLATE": "龍之石板", + "DREAD_PLATE": "惡顏石板", + "PIXIE_PLATE": "妖精石板", + "BLANK_PLATE": "淨空石板", + "LEGEND_PLATE": "傳說石板", + "FIGHTING_MEMORY": "戰鬥記憶碟", + "FLYING_MEMORY": "飛翔記憶碟", + "POISON_MEMORY": "毒記憶碟", + "GROUND_MEMORY": "大地記憶碟", + "ROCK_MEMORY": "岩石記憶碟", + "BUG_MEMORY": "蟲子記憶碟", + "GHOST_MEMORY": "幽靈記憶碟", + "STEEL_MEMORY": "鋼鐵記憶碟", + "FIRE_MEMORY": "火焰記憶碟", + "WATER_MEMORY": "清水記憶碟", + "GRASS_MEMORY": "青草記憶碟", + "ELECTRIC_MEMORY": "電子記憶碟", + "PSYCHIC_MEMORY": "精神記憶碟", + "ICE_MEMORY": "冰雪記憶碟", + "DRAGON_MEMORY": "龍記憶碟", + "DARK_MEMORY": "黑暗記憶碟", + "FAIRY_MEMORY": "妖精記憶碟", + "NORMAL_MEMORY": "一般記憶碟" + } +} diff --git a/src/locales/zh_TW/modifier-type.ts b/src/locales/zh_TW/modifier-type.ts deleted file mode 100644 index d31d9b8a53d..00000000000 --- a/src/locales/zh_TW/modifier-type.ts +++ /dev/null @@ -1,507 +0,0 @@ -import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; - -export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - AddPokeballModifierType: { - name: "{{modifierCount}}x {{pokeballName}}", - description: - "獲得 {{pokeballName}} x{{modifierCount}} (已有:{{pokeballAmount}}) \n捕捉倍率:{{catchRate}}。", - }, - AddVoucherModifierType: { - name: "{{modifierCount}}x {{voucherTypeName}}", - description: "獲得 {{voucherTypeName}} x{{modifierCount}}。", - }, - PokemonHeldItemModifierType: { - extra: { - inoperable: "{{pokemonName}} 無法攜帶\n這個物品!", - tooMany: "{{pokemonName}} 已有太多\n這個物品!", - }, - }, - PokemonHpRestoreModifierType: { - description: - "爲一隻寶可夢恢復 {{restorePoints}} HP 或 {{restorePercent}}% HP,取最大值。", - extra: { - fully: "爲一隻寶可夢恢復全部HP。", - fullyWithStatus: "爲一隻寶可夢恢復全部HP並消除所有負面\n狀態。", - }, - }, - PokemonReviveModifierType: { - description: "復活一隻寶可夢並恢復 {{restorePercent}}% HP。", - }, - PokemonStatusHealModifierType: { - description: "爲一隻寶可夢消除所有負面狀態。", - }, - PokemonPpRestoreModifierType: { - description: "爲一隻寶可夢的一個招式恢復 {{restorePoints}} PP。", - extra: { fully: "完全恢復一隻寶可夢一個招式的PP。" }, - }, - PokemonAllMovePpRestoreModifierType: { - description: "爲一隻寶可夢的所有招式恢復 {{restorePoints}} PP。", - extra: { fully: "爲一隻寶可夢的所有招式恢復所有PP。" }, - }, - PokemonPpUpModifierType: { - description: - "永久提升一個招式的PP,每5點最大PP增加{{upPoints}} (最多3點)。", - }, - PokemonNatureChangeModifierType: { - name: "{{natureName}}薄荷", - description: - "將一隻寶可夢的性格改爲{{natureName}}併爲該寶可\n夢永久解鎖該性格。", - }, - DoubleBattleChanceBoosterModifierType: { - description: "接下來的{{battleCount}}場戰鬥是雙打的概率翻倍。", - }, - TempBattleStatBoosterModifierType: { - description: - "爲所有成員寶可夢提升一級{{tempBattleStatName}},持續5場戰鬥。", - }, - AttackTypeBoosterModifierType: { - description: "一隻寶可夢的{{moveType}}系招式威力提升20%。", - }, - PokemonLevelIncrementModifierType: { - description: "一隻寶可夢等級提升1級。", - }, - AllPokemonLevelIncrementModifierType: { - description: "所有成員寶可夢等級提升1級。", - }, - PokemonBaseStatBoosterModifierType: { - description: - "增加持有者的{{statName}}10%,個體值越高堆疊\n上限越高。", - }, - AllPokemonFullHpRestoreModifierType: { - description: "所有寶可夢完全恢復HP。", - }, - AllPokemonFullReviveModifierType: { - description: "復活所有瀕死寶可夢,完全恢復HP。", - }, - MoneyRewardModifierType: { - description: "獲得{{moneyMultiplier}}金錢 (₽{{moneyAmount}})。", - extra: { small: "少量", moderate: "中等", large: "大量" }, - }, - ExpBoosterModifierType: { - description: "經驗值獲取量增加{{boostPercent}}%。", - }, - PokemonExpBoosterModifierType: { - description: "持有者經驗值獲取量增加{{boostPercent}}%。", - }, - PokemonFriendshipBoosterModifierType: { - description: "每場戰鬥獲得的好感度提升50%。", - }, - PokemonMoveAccuracyBoosterModifierType: { - description: "招式命中率增加{{accuracyAmount}} (最大100)。", - }, - PokemonMultiHitModifierType: { - description: - "攻擊造成一次額外傷害,每次堆疊額外傷害\n分別衰減60/75/82.5%。", - }, - TmModifierType: { - name: "招式學習器 {{moveId}} - {{moveName}}", - description: "教會一隻寶可夢{{moveName}}。", - }, - TmModifierTypeWithInfo: { - name: "TM{{moveId}} - {{moveName}}", - description: "教會一隻寶可夢{{moveName}}\n(Hold C or Shift for more info)。", - }, - EvolutionItemModifierType: { description: "使某些寶可夢進化。" }, - FormChangeItemModifierType: { description: "使某些寶可夢更改形態。" }, - FusePokemonModifierType: { - description: - "融合兩隻寶可夢 (改變特性, 平分基礎點數\n和屬性, 共享招式池)。", - }, - TerastallizeModifierType: { - name: "{{teraType}}太晶碎塊", - description: "持有者獲得{{teraType}}太晶化10場戰鬥。", - }, - ContactHeldItemTransferChanceModifierType: { - description: "攻擊時{{chancePercent}}%概率偷取對手物品。", - }, - TurnHeldItemTransferModifierType: { - description: "持有者每回合從對手那裏獲得一個持有的物品。", - }, - EnemyAttackStatusEffectChanceModifierType: { - description: "攻擊時{{chancePercent}}%概率造成{{statusEffect}}。", - }, - EnemyEndureChanceModifierType: { - description: "增加{{chancePercent}}%遭受攻擊的概率。", - }, - RARE_CANDY: { name: "神奇糖果" }, - RARER_CANDY: { name: "超神奇糖果" }, - MEGA_BRACELET: { - name: "超級手鐲", - description: "能讓攜帶着超級石戰鬥的寶可夢進行\n超級進化。", - }, - DYNAMAX_BAND: { - name: "極巨腕帶", - description: "能讓攜帶着極巨菇菇戰鬥的寶可夢進行\n極巨化。", - }, - TERA_ORB: { - name: "太晶珠", - description: "能讓攜帶着太晶碎塊戰鬥的寶可夢進行\n太晶化。", - }, - MAP: { - name: "地圖", - description: "允許你在切換寶可夢羣落時選擇目的地。", - }, - POTION: { name: "傷藥" }, - SUPER_POTION: { name: "好傷藥" }, - HYPER_POTION: { name: "厲害傷藥" }, - MAX_POTION: { name: "全滿藥" }, - FULL_RESTORE: { name: "全復藥" }, - REVIVE: { name: "活力碎片" }, - MAX_REVIVE: { name: "活力塊" }, - FULL_HEAL: { name: "萬靈藥" }, - SACRED_ASH: { name: "聖灰" }, - REVIVER_SEED: { - name: "復活種子", - description: "恢復1隻瀕死寶可夢的HP至1/2。", - }, - ETHER: { name: "PP單項小補劑" }, - MAX_ETHER: { name: "PP單項全補劑" }, - ELIXIR: { name: "PP多項小補劑" }, - MAX_ELIXIR: { name: "PP多項全補劑" }, - PP_UP: { name: "PP提升劑" }, - PP_MAX: { name: "PP極限提升劑" }, - LURE: { name: "引蟲香水" }, - SUPER_LURE: { name: "白銀香水" }, - MAX_LURE: { name: "黃金香水" }, - MEMORY_MUSHROOM: { - name: "回憶蘑菇", - description: "回憶一個寶可夢已經遺忘的招式。", - }, - EXP_SHARE: { - name: "學習裝置", - description: "未參加對戰的寶可夢獲得20%的經驗值。", - }, - EXP_BALANCE: { - name: "均衡型學習裝置", - description: "隊伍中的低級寶可夢獲得更多經驗值。", - }, - OVAL_CHARM: { - name: "圓形護符", - description: - "當多隻寶可夢參與戰鬥,分別獲得總經驗值\n10%的額外經驗值。", - }, - EXP_CHARM: { name: "經驗護符" }, - SUPER_EXP_CHARM: { name: "超級經驗護符" }, - GOLDEN_EXP_CHARM: { name: "黃金經驗護符" }, - LUCKY_EGG: { name: "幸運蛋" }, - GOLDEN_EGG: { name: "金蛋" }, - SOOTHE_BELL: { name: "安撫之鈴" }, - EVIOLITE: { - name: "進化奇石", - description: "進化的神奇石塊。攜帶後,還能進化的寶可夢的 防禦和特防就會提高。" - }, - SOUL_DEW: { - name: "心之水滴", - description: "增加寶可夢性格影響10% (加算)。", - }, - NUGGET: { name: "金珠" }, - BIG_NUGGET: { name: "巨大金珠" }, - RELIC_GOLD: { name: "古代金幣" }, - AMULET_COIN: { name: "護符金幣", description: "金錢獎勵增加20%。" }, - GOLDEN_PUNCH: { - name: "黃金拳頭", - description: "將50%造成的傷害轉換爲金錢。", - }, - COIN_CASE: { - name: "代幣盒", - description: "每十場戰鬥, 獲得自己金錢10%的利息。", - }, - LOCK_CAPSULE: { - name: "上鎖的容器", - description: "允許在刷新物品時鎖定物品稀有度。", - }, - GRIP_CLAW: { name: "緊纏鉤爪" }, - WIDE_LENS: { name: "廣角鏡" }, - MULTI_LENS: { name: "多重鏡" }, - HEALING_CHARM: { - name: "治癒護符", - description: "HP恢復量增加10% (不含復活)。", - }, - CANDY_JAR: { name: "糖果罐", description: "神奇糖果提供的升級提升1級。" }, - BERRY_POUCH: { - name: "樹果袋", - description: "使用樹果時有30%的幾率不會消耗樹果。", - }, - FOCUS_BAND: { - name: "氣勢頭帶", - description: - "攜帶該道具的寶可夢有10%幾率在受到\n攻擊而將陷入瀕死狀態時,保留1點HP不陷入瀕死狀態。", - }, - QUICK_CLAW: { - name: "先制之爪", - description: "有10%的幾率無視速度優先使出招式\n(先制技能優先)。", - }, - KINGS_ROCK: { - name: "王者之證", - description: - "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時,有\n10%幾率使目標陷入畏縮狀態。", - }, - LEFTOVERS: { - name: "喫剩的東西", - description: "攜帶該道具的寶可夢在每個回合結束時恢復\n最大HP的1/16。", - }, - SHELL_BELL: { - name: "貝殼之鈴", - description: - "攜帶該道具的寶可夢在攻擊對方成功造成傷\n害時,攜帶者的HP會恢復其所造成傷害\n的1/8。", - }, - TOXIC_ORB: { - name: "劇毒寶珠", - description: - "觸碰後會放出毒的神奇寶珠。\n攜帶後,在戰鬥時會變成劇毒狀態。" - }, - FLAME_ORB: { - name: "火焰寶珠", - description: - "觸碰後會放出熱量的神奇寶珠。\n攜帶後,在戰鬥時會變成灼傷狀態。" - }, - BATON: { - name: "接力棒", - description: "允許在切換寶可夢時保留能力變化, 對陷阱\n同樣生效。", - }, - SHINY_CHARM: { - name: "閃耀護符", - description: "顯著增加野生寶可夢的閃光概率。", - }, - ABILITY_CHARM: { - name: "特性護符", - description: "顯著增加野生寶可夢有隱藏特性的概率。", - }, - IV_SCANNER: { - name: "個體值探測器", - description: - "允許掃描野生寶可夢的個體值。 每個次顯示\n2個個體值. 最好的個體值優先顯示。", - }, - DNA_SPLICERS: { name: "基因之楔" }, - MINI_BLACK_HOLE: { name: "迷你黑洞" }, - GOLDEN_POKEBALL: { - name: "黃金精靈球", - description: "在每場戰鬥結束後增加一個額外物品選項。", - }, - ENEMY_DAMAGE_BOOSTER: { - name: "傷害硬幣", - description: "增加5%造成傷害。", - }, - ENEMY_DAMAGE_REDUCTION: { - name: "防禦硬幣", - description: "減少2.5%承受傷害。", - }, - ENEMY_HEAL: { name: "恢復硬幣", description: "每回合恢復2%最大HP。" }, - ENEMY_ATTACK_POISON_CHANCE: { name: "劇毒硬幣" }, - ENEMY_ATTACK_PARALYZE_CHANCE: { name: "麻痹硬幣" }, - ENEMY_ATTACK_BURN_CHANCE: { name: "灼燒硬幣" }, - ENEMY_STATUS_EFFECT_HEAL_CHANCE: { - name: "萬靈藥硬幣", - description: "增加2.5%每回合治癒異常狀態的概率。", - }, - ENEMY_ENDURE_CHANCE: { name: "忍受硬幣" }, - ENEMY_FUSED_CHANCE: { - name: "融合硬幣", - description: "增加1%野生融合寶可夢出現概率。", - }, - }, - SpeciesBoosterItem: { - "LIGHT_BALL": { name: "電氣球", description: "讓皮卡丘攜帶後,攻擊和特攻就會 提高的神奇之球。" }, - "THICK_CLUB": { name: "粗骨頭", description: "某種堅硬的骨頭。讓卡拉卡拉或嘎啦嘎啦攜帶後,攻擊就會提高。" }, - "METAL_POWDER": { name: "金屬粉", description: "讓百變怪攜帶後,防禦就會提高的神奇粉末。非常細緻堅硬。" }, - "QUICK_POWDER": { name: "速度粉", description: "讓百變怪攜帶後,速度就會提高的神奇粉末。非常細緻堅硬。" } - }, - TempBattleStatBoosterItem: { - x_attack: "力量強化", - x_defense: "防禦強化", - x_sp_atk: "特攻強化", - x_sp_def: "特防強化", - x_speed: "速度強化", - x_accuracy: "命中強化", - dire_hit: "要害攻擊", - }, - - TempBattleStatBoosterStatName: { - "ATK": "攻擊", - "DEF": "防禦", - "SPATK": "特攻", - "SPDEF": "特防", - "SPD": "速度", - "ACC": "命中", - "CRIT": "會心", - "EVA": "閃避", - "DEFAULT": "???", - }, - - AttackTypeBoosterItem: { - silk_scarf: "絲綢圍巾", - black_belt: "黑帶", - sharp_beak: "銳利鳥嘴", - poison_barb: "毒針", - soft_sand: "柔軟沙子", - hard_stone: "硬石頭", - silver_powder: "銀粉", - spell_tag: "詛咒之符", - metal_coat: "金屬膜", - charcoal: "木炭", - mystic_water: "神祕水滴", - miracle_seed: "奇蹟種子", - magnet: "磁鐵", - twisted_spoon: "彎曲的湯匙", - never_melt_ice: "不融冰", - dragon_fang: "龍之牙", - black_glasses: "黑色眼鏡", - fairy_feather: "妖精之羽", - }, - BaseStatBoosterItem: { - hp_up: "HP增強劑", - protein: "攻擊增強劑", - iron: "防禦增強劑", - calcium: "特攻增強劑", - zinc: "特防增強劑", - carbos: "速度增強劑", - }, - EvolutionItem: { - NONE: "無", - LINKING_CORD: "聯繫繩", - SUN_STONE: "日之石", - MOON_STONE: "月之石", - LEAF_STONE: "葉之石", - FIRE_STONE: "火之石", - WATER_STONE: "水之石", - THUNDER_STONE: "雷之石", - ICE_STONE: "冰之石", - DUSK_STONE: "暗之石", - DAWN_STONE: "覺醒之石", - SHINY_STONE: "光之石", - CRACKED_POT: "破裂的茶壺", - SWEET_APPLE: "甜甜蘋果", - TART_APPLE: "酸酸蘋果", - STRAWBERRY_SWEET: "草莓糖飾", - UNREMARKABLE_TEACUP: "凡作茶碗", - CHIPPED_POT: "缺損的茶壺", - BLACK_AUGURITE: "黑奇石", - GALARICA_CUFF: "伽勒豆蔻手環", - GALARICA_WREATH: "伽勒豆蔻花圈", - PEAT_BLOCK: "泥炭塊", - AUSPICIOUS_ARMOR: "慶祝之鎧", - MALICIOUS_ARMOR: "咒術之鎧", - MASTERPIECE_TEACUP: "傑作茶碗", - METAL_ALLOY: "複合金屬", - SCROLL_OF_DARKNESS: "惡之掛軸", - SCROLL_OF_WATERS: "水之掛軸", - SYRUPY_APPLE: "蜜汁蘋果", - }, - FormChangeItem: { - NONE: "無", - ABOMASITE: "暴雪王進化石", - ABSOLITE: "阿勃梭魯進化石", - AERODACTYLITE: "化石翼龍進化石", - AGGRONITE: "波士可多拉進化石", - ALAKAZITE: "胡地進化石", - ALTARIANITE: "七夕青鳥進化石", - AMPHAROSITE: "電龍進化石", - AUDINITE: "差不多娃娃進化石", - BANETTITE: "詛咒娃娃進化石", - BEEDRILLITE: "大針蜂進化石", - BLASTOISINITE: "水箭龜進化石", - BLAZIKENITE: "火焰雞進化石", - CAMERUPTITE: "噴火駝進化石", - CHARIZARDITE_X: "噴火龍進化石X", - CHARIZARDITE_Y: "噴火龍進化石Y", - DIANCITE: "蒂安希進化石", - GALLADITE: "艾路雷朵進化石", - GARCHOMPITE: "烈咬陸鯊進化石", - GARDEVOIRITE: "沙奈朵進化石", - GENGARITE: "耿鬼進化石", - GLALITITE: "冰鬼護進化石", - GYARADOSITE: "暴鯉龍進化石", - HERACRONITE: "赫拉克羅斯進化石", - HOUNDOOMINITE: "黑魯加進化石", - KANGASKHANITE: "袋獸進化石", - LATIASITE: "拉帝亞斯進化石", - LATIOSITE: "拉帝歐斯進化石", - LOPUNNITE: "長耳兔進化石", - LUCARIONITE: "路卡利歐進化石", - MANECTITE: "雷電獸進化石", - MAWILITE: "大嘴娃進化石", - MEDICHAMITE: "恰雷姆進化石", - METAGROSSITE: "巨金怪進化石", - MEWTWONITE_X: "超夢進化石X", - MEWTWONITE_Y: "超夢進化石Y", - PIDGEOTITE: "大比鳥進化石", - PINSIRITE: "凱羅斯進化石", - RAYQUAZITE: "烈空坐進化石", - SABLENITE: "勾魂眼進化石", - SALAMENCITE: "暴飛龍進化石", - SCEPTILITE: "蜥蜴王進化石", - SCIZORITE: "巨鉗螳螂進化石", - SHARPEDONITE: "巨牙鯊進化石", - SLOWBRONITE: "呆殼獸進化石", - STEELIXITE: "大鋼蛇進化石", - SWAMPERTITE: "巨沼怪進化石", - TYRANITARITE: "班基拉斯進化石", - VENUSAURITE: "妙蛙花進化石", - BLUE_ORB: "靛藍色寶珠", - RED_ORB: "硃紅色寶珠", - SHARP_METEORITE: "銳利隕石", - HARD_METEORITE: "堅硬隕石", - SMOOTH_METEORITE: "光滑隕石", - ADAMANT_CRYSTAL: "大金剛寶玉", - LUSTROUS_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: "礎石面具", - SHOCK_DRIVE: "閃電卡帶", - BURN_DRIVE: "火焰卡帶", - CHILL_DRIVE: "冰凍卡帶", - DOUSE_DRIVE: "水流卡帶", - - "FIST_PLATE": "拳頭石板", - "SKY_PLATE": "藍天石板", - "TOXIC_PLATE": "劇毒石板", - "EARTH_PLATE": "大地石板", - "STONE_PLATE": "岩石石板", - "INSECT_PLATE": "玉蟲石板", - "SPOOKY_PLATE": "妖怪石板", - "IRON_PLATE": "鋼鐵石板", - "FLAME_PLATE": "火球石板", - "SPLASH_PLATE": "水滴石板", - "MEADOW_PLATE": "碧綠石板", - "ZAP_PLATE": "雷電石板", - "MIND_PLATE": "神奇石板", - "ICICLE_PLATE": "冰柱石板", - "DRACO_PLATE": "龍之石板", - "DREAD_PLATE": "惡顏石板", - "PIXIE_PLATE": "妖精石板", - "BLANK_PLATE": "淨空石板", - "LEGEND_PLATE": "傳說石板", - "FIGHTING_MEMORY": "戰鬥記憶碟", - "FLYING_MEMORY": "飛翔記憶碟", - "POISON_MEMORY": "毒記憶碟", - "GROUND_MEMORY": "大地記憶碟", - "ROCK_MEMORY": "岩石記憶碟", - "BUG_MEMORY": "蟲子記憶碟", - "GHOST_MEMORY": "幽靈記憶碟", - "STEEL_MEMORY": "鋼鐵記憶碟", - "FIRE_MEMORY": "火焰記憶碟", - "WATER_MEMORY": "清水記憶碟", - "GRASS_MEMORY": "青草記憶碟", - "ELECTRIC_MEMORY": "電子記憶碟", - "PSYCHIC_MEMORY": "精神記憶碟", - "ICE_MEMORY": "冰雪記憶碟", - "DRAGON_MEMORY": "龍記憶碟", - "DARK_MEMORY": "黑暗記憶碟", - "FAIRY_MEMORY": "妖精記憶碟", - "BLANK_MEMORY": "空白記憶碟", - }, -} as const; diff --git a/src/locales/zh_TW/modifier.json b/src/locales/zh_TW/modifier.json new file mode 100644 index 00000000000..1c0d4760e6f --- /dev/null +++ b/src/locales/zh_TW/modifier.json @@ -0,0 +1,11 @@ +{ + "surviveDamageApply": "{{pokemonNameWithAffix}}用{{typeName}}\n撐住了!", + "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!", + "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!", + "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了活力!", + "moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!", + "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", + "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\n回復了一些體力!", + "bypassSpeedChanceApply": "{{pokemonName}}用了{{itemName}}後,行動變快了!" +} diff --git a/src/locales/zh_TW/move-trigger.json b/src/locales/zh_TW/move-trigger.json new file mode 100644 index 00000000000..d6d0ce659ea --- /dev/null +++ b/src/locales/zh_TW/move-trigger.json @@ -0,0 +1,70 @@ +{ + "hitWithRecoil": "{{pokemonName}}\n受到了反作用力造成的傷害!", + "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而撞到了地面!", + "fled": "{{pokemonName}}\n逃走了!", + "cannotBeSwitchedOut": "{{pokemonName}}\n無法被收回!", + "swappedAbilitiesWithTarget": "{{pokemonName}}\n互換了各自的特性!", + "coinsScatteredEverywhere": "金幣散落一地!", + "attackedByItem": "{{pokemonName}}被\n{{itemName}}襲擊了!", + "whippedUpAWhirlwind": "{{pokemonName}}周圍的\n空氣產生了旋渦!", + "flewUpHigh": "{{pokemonName}}\n飛向了高空!", + "tookInSunlight": "{{pokemonName}}\n吸收了光線!", + "dugAHole": "{{pokemonName}}\n鑽進了地下!", + "loweredItsHead": "{{pokemonName}}\n把頭縮了進去!", + "isGlowing": "強光包圍了\n{{pokemonName}}!", + "bellChimed": "鈴聲響徹四周!", + "foresawAnAttack": "{{pokemonName}}\n預知了未來的攻擊!", + "isTighteningFocus": "{{pokemonName}}正在集中注意力!", + "hidUnderwater": "{{pokemonName}}\n潛入了水中!", + "soothingAromaWaftedThroughArea": "怡人的香氣擴散了開來!", + "sprangUp": "{{pokemonName}}\n高高地跳了起來!", + "choseDoomDesireAsDestiny": "{{pokemonName}}\n將破滅之願託付給了未來!", + "vanishedInstantly": "{{pokemonName}}的身影\n瞬間消失了!", + "tookTargetIntoSky": "{{pokemonName}}將{{targetName}}\n帶上了高空!", + "becameCloakedInFreezingLight": "{{pokemonName}}\n被冷光包圍了!", + "becameCloakedInFreezingAir": "{{pokemonName}}\n被冰凍的空氣包圍了!", + "isChargingPower": "{{pokemonName}}\n正在積蓄力量!", + "burnedItselfOut": "{{pokemonName}}的火焰燃盡了!", + "startedHeatingUpBeak": "{{pokemonName}}\n開始給鳥嘴加熱了!", + "setUpShellTrap": "{{pokemonName}}\n設下了陷阱甲殼!", + "isOverflowingWithSpacePower": "{{pokemonName}}湧起了宇宙的力量!", + "usedUpAllElectricity": "{{pokemonName}}\n用盡了電力!", + "stoleItem": "{{pokemonName}}从{{targetName}}那裏\n奪取了{{itemName}}!", + "incineratedItem": "{{pokemonName}}燒掉了\n{{targetName}}的{{itemName}}!", + "knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}!", + "tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻擊!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削減體力並釋放了全部{{statName}}!", + "copiedStatChanges": "{{pokemonName}}複製了\n{{targetName}}的能力變化!", + "magnitudeMessage": "震級{{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}}將目標對準了\n{{targetName}}!", + "transformedIntoType": "{{pokemonName}} \n變成了{{typeName}}屬性!", + "copiedMove": "{{pokemonName}}\n複製了{{moveName}}!", + "sketchedMove": "{{pokemonName}}\n對{{moveName}}進行了寫生!", + "acquiredAbility": "{{pokemonName}}的特性\n變为{{abilityName}}了!", + "copiedTargetAbility": "{{pokemonName}}複製了\n{{targetName}}的{{abilityName}}!", + "transformedIntoTarget": "{{pokemonName}}\n變身成了{{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}}\n想和對手同歸於盡!", + "addType": "{{pokemonName}}\n增加了{{typeName}}屬性!", + "cannotUseMove": "{{pokemonName}}\n無法使用{{moveName}}!", + "healHp": "{{pokemonName}}的\n體力回復了!", + "sacrificialFullRestore": "{{pokemonName}}的\n治癒之願實現了!", + "invertStats": "{{pokemonName}}的\n能力變化顛倒過來了!", + "resetStats": "{{pokemonName}}的\n能力變化復原了!", + "statEliminated": "所有能力都復原了!", + "faintCountdown": "{{pokemonName}}\n將在{{turnCount}}回合後滅亡!", + "copyType": "{{pokemonName}}變成了{{targetPokemonName}}的屬性!", + "suppressAbilities": "{{pokemonName}}的特性\n變得無效了!", + "revivalBlessing": "{{pokemonName}}復活了!", + "swapArenaTags": "{{pokemonName}}\n交換了雙方的場地效果!", + "exposedMove": "{{pokemonName}}識破了\n{{targetPokemonName}}的原形!", + "safeguard": "{{targetName}}\n正受到神秘之幕的保護!" +} \ No newline at end of file diff --git a/src/locales/zh_TW/move.json b/src/locales/zh_TW/move.json new file mode 100644 index 00000000000..101d6f85e5d --- /dev/null +++ b/src/locales/zh_TW/move.json @@ -0,0 +1,3810 @@ +{ + "pound": { + "name": "拍擊", + "effect": "使用長長的尾巴或手等拍打\n對手進行攻擊" + }, + "karateChop": { + "name": "空手劈", + "effect": "用鋒利的手刀劈向對手進行\n攻擊。容易擊中要害" + }, + "doubleSlap": { + "name": "連環巴掌", + "effect": "用連環巴掌拍打對手進行攻\n擊。連續攻擊2~5次" + }, + "cometPunch": { + "name": "連續拳", + "effect": "用拳頭怒濤般的毆打對手進\n行攻擊。連續攻擊2~5次" + }, + "megaPunch": { + "name": "百萬噸重拳", + "effect": "用充滿力量的拳頭攻擊對手" + }, + "payDay": { + "name": "聚寶功", + "effect": "向對手的身體投擲小金幣進\n行攻擊。戰鬥後可以拿到錢" + }, + "firePunch": { + "name": "火焰拳", + "effect": "用充滿火焰的拳頭攻擊對手。\n有時會讓對手陷入灼傷狀\n態" + }, + "icePunch": { + "name": "冰凍拳", + "effect": "用充滿寒氣的拳頭攻擊對手。\n有時會讓對手陷入冰凍狀\n態" + }, + "thunderPunch": { + "name": "雷電拳", + "effect": "用充滿電流的拳頭攻擊對手。\n有時會讓對手陷入麻痹狀\n態" + }, + "scratch": { + "name": "抓", + "effect": "用堅硬且無比鋒利的爪子抓\n對手進行攻擊" + }, + "viseGrip": { + "name": "夾住", + "effect": "將對手從兩側夾住,給予傷\n害" + }, + "guillotine": { + "name": "斷頭鉗", + "effect": "用大鉗子或剪刀等夾斷對手\n進行攻擊。只要命中就會一\n擊瀕死" + }, + "razorWind": { + "name": "旋風刀", + "effect": "製造風之刃,於第2回合攻\n擊對手。容易擊中要害" + }, + "swordsDance": { + "name": "劍舞", + "effect": "激烈地跳起戰舞提高氣勢。\n大幅提高自己的攻擊" + }, + "cut": { + "name": "居合斬", + "effect": "用鐮刀或爪子等切斬對手進\n行攻擊" + }, + "gust": { + "name": "起風", + "effect": "用翅膀將颳起的狂風襲向對\n手進行攻擊" + }, + "wingAttack": { + "name": "翅膀攻擊", + "effect": "大大地展開美麗的翅膀,將\n其撞向對手進行攻擊" + }, + "whirlwind": { + "name": "吹飛", + "effect": "吹飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束" + }, + "fly": { + "name": "飛翔", + "effect": "第1回合飛上天空,第2回\n合攻擊對手" + }, + "bind": { + "name": "綁緊", + "effect": "使用長長的身體或藤蔓等,\n在4~5回合內綁緊對手進\n行攻擊" + }, + "slam": { + "name": "摔打", + "effect": "使用長長的尾巴或藤蔓等摔\n打對手進行攻擊" + }, + "vineWhip": { + "name": "藤鞭", + "effect": "用如同鞭子般彎曲而細長的\n藤蔓摔打對手進行攻擊" + }, + "stomp": { + "name": "踩踏", + "effect": "用大腳踩踏對手進行攻擊。\n有時會使對手畏縮" + }, + "doubleKick": { + "name": "二連踢", + "effect": "用2隻腳踢飛對手進行攻擊。\n連續2次給予傷害" + }, + "megaKick": { + "name": "百萬噸重踢", + "effect": "使出力大無窮的重踢踢飛對\n手進行攻擊" + }, + "jumpKick": { + "name": "飛踢", + "effect": "使出高高的騰空踢攻擊對手。\n如果踢偏則自己會受到傷\n害" + }, + "rollingKick": { + "name": "迴旋踢", + "effect": "一邊使身體快速旋轉,一邊\n踢飛對手進行攻擊。有時會\n使對手畏縮" + }, + "sandAttack": { + "name": "潑沙", + "effect": "向對手臉上潑沙子,從而降\n低命中率" + }, + "headbutt": { + "name": "頭錘", + "effect": "將頭伸出,筆直地撲向對手\n進行攻擊。有時會使對手畏\n縮" + }, + "hornAttack": { + "name": "角撞", + "effect": "用尖銳的角攻擊對手" + }, + "furyAttack": { + "name": "亂擊", + "effect": "用角或喙刺向對手進行攻擊。\n連續攻擊2~5次" + }, + "hornDrill": { + "name": "角鑽", + "effect": "用旋轉的角刺入對手進行攻\n擊。只要命中就會一擊昏厥" + }, + "tackle": { + "name": "撞擊", + "effect": "用整個身體撞向對手進行攻\n擊" + }, + "bodySlam": { + "name": "泰山壓頂", + "effect": "用整個身體壓住對手進行攻\n擊。有時會讓對手陷入麻痹\n狀態" + }, + "wrap": { + "name": "緊束", + "effect": "使用長長的身體或藤蔓等,\n在4~5回合內緊束對手進\n行攻擊" + }, + "takeDown": { + "name": "猛撞", + "effect": "以驚人的氣勢撞向對手進行\n攻擊。自己也會受到少許傷\n害" + }, + "thrash": { + "name": "大鬧一番", + "effect": "在2~3回合內,亂打一氣\n地攻擊對手。大鬧一番後自\n己會陷入混亂" + }, + "doubleEdge": { + "name": "捨身衝撞", + "effect": "拼命地猛撞向對手進行攻擊。\n自己也會受到不小的傷害" + }, + "tailWhip": { + "name": "搖尾巴", + "effect": "可愛地左右搖晃尾巴,誘使\n對手疏忽大意。會降低對手\n的防禦" + }, + "poisonSting": { + "name": "毒針", + "effect": "將有毒的針刺入對手進行攻\n擊。有時會讓對手陷入中毒\n狀態" + }, + "twineedle": { + "name": "雙針", + "effect": "將2根針刺入對手,連續2\n次給予傷害。有時會讓對手\n陷入中毒狀態" + }, + "pinMissile": { + "name": "飛彈針", + "effect": "向對手發射銳針進行攻擊。\n連續攻擊2~5次" + }, + "leer": { + "name": "瞪眼", + "effect": "用犀利的眼神使其害怕,從\n而降低對手的防禦" + }, + "bite": { + "name": "咬住", + "effect": "用尖銳的牙咬住對手進行攻\n擊。有時會使對手畏縮" + }, + "growl": { + "name": "叫聲", + "effect": "讓對手聽可愛的叫聲,引開\n注意力使其疏忽,從而降低\n對手的攻擊" + }, + "roar": { + "name": "吼叫", + "effect": "放走對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束" + }, + "sing": { + "name": "唱歌", + "effect": "讓對手聽舒適、美妙的歌聲,\n從而陷入睡眠狀態" + }, + "supersonic": { + "name": "超音波", + "effect": "從身體發出特殊的音波,從\n而使對手混亂" + }, + "sonicBoom": { + "name": "音爆", + "effect": "將衝擊波撞向對手進行攻擊。\n必定會給予20的傷害" + }, + "disable": { + "name": "定身法", + "effect": "阻礙對手行動,之前使出的\n招式將在4回合內無法使用" + }, + "acid": { + "name": "溶解液", + "effect": "將強酸潑向對手進行攻擊。\n有時會降低對手的特防" + }, + "ember": { + "name": "火花", + "effect": "向對手發射小型火焰進行攻\n擊。有時會讓對手陷入灼傷\n狀態" + }, + "flamethrower": { + "name": "噴射火焰", + "effect": "向對手發射烈焰進行攻擊。\n有時會讓對手陷入灼傷狀態" + }, + "mist": { + "name": "白霧", + "effect": "用白霧覆蓋身體。在5回合\n內不會讓對手降低自己的能\n力" + }, + "waterGun": { + "name": "水槍", + "effect": "向對手猛烈地噴射水流進行\n攻擊" + }, + "hydroPump": { + "name": "水炮", + "effect": "向對手猛烈地噴射大量水流\n進行攻擊" + }, + "surf": { + "name": "衝浪", + "effect": "利用大浪攻擊自己周圍所有\n的寶可夢" + }, + "iceBeam": { + "name": "冰凍光束", + "effect": "向對手發射冰凍光束進行攻\n擊。有時會讓對手陷入冰凍\n狀態" + }, + "blizzard": { + "name": "暴風雪", + "effect": "將猛烈的暴風雪刮向對手進\n行攻擊。有時會讓對手陷入\n冰凍狀態" + }, + "psybeam": { + "name": "幻象光線", + "effect": "向對手發射神奇的光線進行\n攻擊。有時會使對手混亂" + }, + "bubbleBeam": { + "name": "泡沫光線", + "effect": "向對手猛烈地噴射泡沫進行\n攻擊。有時會降低對手的速\n度" + }, + "auroraBeam": { + "name": "極光束", + "effect": "向對手發射虹色光束進行攻\n擊。有時會降低對手的攻擊" + }, + "hyperBeam": { + "name": "破壞光線", + "effect": "向對手發射強烈的光線進行\n攻擊。下一回合自己將無法\n動彈" + }, + "peck": { + "name": "啄", + "effect": "用尖銳的喙或角刺向對手進\n行攻擊" + }, + "drillPeck": { + "name": "啄鑽", + "effect": "一邊旋轉,一邊將尖喙刺入\n對手進行攻擊" + }, + "submission": { + "name": "地獄翻滾", + "effect": "將對手連同自己一起摔向地\n面進行攻擊。自己也會受到\n少許傷害" + }, + "lowKick": { + "name": "踢倒", + "effect": "用力踢對手的腳,使其摔倒\n進行攻擊。對手越重,威力\n越大" + }, + "counter": { + "name": "雙倍奉還", + "effect": "從對手那裏受到物理攻擊的\n傷害將以2倍返還給同一個\n對手" + }, + "seismicToss": { + "name": "地球上投", + "effect": "利用引力將對手甩飛出去。\n給予對手和自己等級相同的\n傷害" + }, + "strength": { + "name": "怪力", + "effect": "使出渾身力氣毆打對手進行\n攻擊" + }, + "absorb": { + "name": "吸取", + "effect": "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP" + }, + "megaDrain": { + "name": "超級吸取", + "effect": "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP" + }, + "leechSeed": { + "name": "寄生種子", + "effect": "植入寄生種子後,將在每回\n合一點一點吸取對手的HP,\n從而用來回復自己的HP" + }, + "growth": { + "name": "生長", + "effect": "讓身體一下子長大,從而提\n高攻擊和特攻" + }, + "razorLeaf": { + "name": "飛葉快刀", + "effect": "飛出葉片,切斬對手進行攻\n擊。容易擊中要害" + }, + "solarBeam": { + "name": "日光束", + "effect": "第1回合收集滿滿的日光,\n第2回合發射光束進行攻擊" + }, + "poisonPowder": { + "name": "毒粉", + "effect": "撒出毒粉,從而讓對手陷入\n中毒狀態" + }, + "stunSpore": { + "name": "麻痹粉", + "effect": "撒出麻痹粉,從而讓對手陷\n入麻痹狀態" + }, + "sleepPowder": { + "name": "催眠粉", + "effect": "撒出催眠粉,從而讓對手陷\n入睡眠狀態" + }, + "petalDance": { + "name": "花瓣舞", + "effect": "在2~3回合內,散落花瓣\n攻擊對手。之後自己會陷入\n混亂" + }, + "stringShot": { + "name": "吐絲", + "effect": "用口中吐出的絲纏繞對手,\n從而大幅降低對手的速度" + }, + "dragonRage": { + "name": "龍之怒", + "effect": "將憤怒的衝擊波撞向對手進\n行攻擊。必定會給予40的\n傷害" + }, + "fireSpin": { + "name": "火焰旋渦", + "effect": "將對手困在激烈的火焰旋渦\n中,在4~5回合內進行攻\n擊" + }, + "thunderShock": { + "name": "電擊", + "effect": "發出電流刺激對手進行攻擊。\n有時會讓對手陷入麻痹狀\n態" + }, + "thunderbolt": { + "name": "十萬伏特", + "effect": "向對手發出強力電擊進行攻\n擊。有時會讓對手陷入麻痹\n狀態" + }, + "thunderWave": { + "name": "電磁波", + "effect": "向對手發出微弱的電擊,從\n而讓對手陷入麻痹狀態" + }, + "thunder": { + "name": "打雷", + "effect": "向對手劈下暴雷進行攻擊。\n有時會讓對手陷入麻痹狀態" + }, + "rockThrow": { + "name": "落石", + "effect": "拿起小岩石,投擲對手進行\n攻擊" + }, + "earthquake": { + "name": "地震", + "effect": "利用地震的衝擊,攻擊自己\n周圍所有的寶可夢" + }, + "fissure": { + "name": "地裂", + "effect": "讓對手掉落於地裂的裂縫中\n進行攻擊。只要命中就會一\n擊瀕死" + }, + "dig": { + "name": "挖洞", + "effect": "第1回合鑽入地底,第2回\n合攻擊對手" + }, + "toxic": { + "name": "劇毒", + "effect": "讓對手陷入劇毒狀態。隨着\n回合的推進,中毒傷害會增\n加" + }, + "confusion": { + "name": "念力", + "effect": "向對手發送微弱的念力進行\n攻擊。有時會使對手混亂" + }, + "psychic": { + "name": "精神強念", + "effect": "向對手發送強大的念力進行\n攻擊。有時會降低對手的特\n防" + }, + "hypnosis": { + "name": "催眠術", + "effect": "施以誘導睡意的暗示,讓對\n手陷入睡眠狀態" + }, + "meditate": { + "name": "瑜伽姿勢", + "effect": "喚醒身體深處沉睡的力量,\n從而提高自己的攻擊" + }, + "agility": { + "name": "高速移動", + "effect": "讓身體放鬆變得輕盈,以便\n高速移動。大幅提高自己的\n速度" + }, + "quickAttack": { + "name": "電光一閃", + "effect": "以迅雷不及掩耳之勢撲向對\n手。必定能夠先制攻擊" + }, + "rage": { + "name": "憤怒", + "effect": "如果在使出招式後受到攻擊\n的話,會因憤怒的力量而提\n高攻擊" + }, + "teleport": { + "name": "瞬間移動", + "effect": "當有後備寶可夢時使用,就\n可以進行替換。野生的寶可\n夢使用則會逃走" + }, + "nightShade": { + "name": "黑夜魔影", + "effect": "顯示恐怖幻影,只給予對手\n和自己等級相同的傷害" + }, + "mimic": { + "name": "模仿", + "effect": "可以將對手最後使用的招式,\n在戰鬥內變成自己的招式" + }, + "screech": { + "name": "刺耳聲", + "effect": "發出不由自主想要捂起耳朵\n的刺耳聲,從而大幅降低對\n手的防禦" + }, + "doubleTeam": { + "name": "影子分身", + "effect": "通過快速移動來製造分身,\n擾亂對手,從而提高閃避率" + }, + "recover": { + "name": "自我再生", + "effect": "讓細胞再生,從而回復自己\n最大HP的一半" + }, + "harden": { + "name": "變硬", + "effect": "全身使勁,讓身體變硬,從\n而提高自己的防禦" + }, + "minimize": { + "name": "變小", + "effect": "蜷縮身體顯得很小,從而大\n幅提高自己的閃避率" + }, + "smokescreen": { + "name": "煙幕", + "effect": "向對手噴出煙或墨汁等,從\n而降低對手的命中率" + }, + "confuseRay": { + "name": "奇異之光", + "effect": "顯示奇怪的光,擾亂對手。\n使對手混亂" + }, + "withdraw": { + "name": "縮入殼中", + "effect": "縮入殼裏保護身體,從而提\n高自己的防禦" + }, + "defenseCurl": { + "name": "變圓", + "effect": "將身體蜷曲變圓,從而提高\n自己的防禦" + }, + "barrier": { + "name": "屏障", + "effect": "製造堅固的壁障,從而大幅\n提高自己的防禦" + }, + "lightScreen": { + "name": "光牆", + "effect": "利用神奇的牆壁,在5回合\n內減弱從對手那裏受到的特\n殊攻擊的傷害" + }, + "haze": { + "name": "黑霧", + "effect": "升起黑霧,將正在場上戰鬥\n的全體寶可夢的能力變回原\n點" + }, + "reflect": { + "name": "反射壁", + "effect": "利用神奇的牆壁,在5回合\n內減弱從對手那裏受到的物\n理攻擊的傷害" + }, + "focusEnergy": { + "name": "聚氣", + "effect": "深深地吸口氣,集中精神。\n自己的攻擊會變得容易擊中\n要害" + }, + "bide": { + "name": "忍耐", + "effect": "在2回合內忍受攻擊,受到\n的傷害會2倍返還給對手" + }, + "metronome": { + "name": "揮指", + "effect": "揮動手指刺激自己的大腦,\n從許多的招式中隨機使出1\n個" + }, + "mirrorMove": { + "name": "鸚鵡學舌", + "effect": "模仿對手使用的招式,自己\n也使用相同招式" + }, + "selfDestruct": { + "name": "自爆", + "effect": "引發爆炸,攻擊自己周圍所\n有的寶可夢。使用後陷入瀕\n死" + }, + "eggBomb": { + "name": "炸蛋", + "effect": "向對手用力投擲大大的蛋進\n行攻擊" + }, + "lick": { + "name": "舌舔", + "effect": "用長長的舌頭,舔遍對手進\n行攻擊。有時會讓對手陷入\n麻痹狀態" + }, + "smog": { + "name": "濁霧", + "effect": "將骯髒的濃霧吹向對手進行\n攻擊。有時會讓對手陷入中\n毒狀態" + }, + "sludge": { + "name": "污泥攻擊", + "effect": "用污泥投擲對手進行攻擊。\n有時會讓對手陷入中毒狀態" + }, + "boneClub": { + "name": "骨棒", + "effect": "用手中的骨頭毆打對手進行\n攻擊。有時會使對手畏縮" + }, + "fireBlast": { + "name": "大字爆炎", + "effect": "用大字形狀的火焰燒盡對手。\n有時會讓對手陷入灼傷狀\n態" + }, + "waterfall": { + "name": "攀瀑", + "effect": "以驚人的氣勢撲向對手。有\n時會使對手畏縮" + }, + "clamp": { + "name": "貝殼夾擊", + "effect": "用非常堅固且厚實的貝殼,\n在4~5回合內夾住對手進\n行攻擊" + }, + "swift": { + "name": "高速星星", + "effect": "發射星形的光攻擊對手。攻\n擊必定會命中" + }, + "skullBash": { + "name": "火箭頭錘", + "effect": "第1回合把頭縮進去,從而\n提高防禦。第2回合攻擊對\n手" + }, + "spikeCannon": { + "name": "尖刺加農炮", + "effect": "向對手發射銳針進行攻擊。\n連續攻擊2~5次" + }, + "constrict": { + "name": "纏繞", + "effect": "用觸手或青藤等纏繞進行攻\n擊。有時會降低對手的速度" + }, + "amnesia": { + "name": "瞬間失憶", + "effect": "將頭腦清空,瞬間忘記某事,\n從而大幅提高自己的特防" + }, + "kinesis": { + "name": "折彎湯匙", + "effect": "折彎湯匙引開注意,從而降\n低對手的命中率" + }, + "softBoiled": { + "name": "生蛋", + "effect": "回覆自己最大HP的一半" + }, + "highJumpKick": { + "name": "飛膝踢", + "effect": "跳起後用膝蓋撞對手進行攻\n擊。如果撞偏則自己會受到\n傷害" + }, + "glare": { + "name": "大蛇瞪眼", + "effect": "用腹部的花紋使對手害怕,\n從而讓其陷入麻痹狀態" + }, + "dreamEater": { + "name": "食夢", + "effect": "喫掉正在睡覺的對手的夢進\n行攻擊。回覆對手所受到傷\n害的一半HP" + }, + "poisonGas": { + "name": "毒瓦斯", + "effect": "將毒瓦斯吹到對手的臉上,\n從而讓對手陷入中毒狀態" + }, + "barrage": { + "name": "投球", + "effect": "向對手投擲圓形物體進行攻\n擊。連續攻擊2~5次" + }, + "leechLife": { + "name": "吸血", + "effect": "吸取血液攻擊對手。可以回\n復給予對手傷害的一半HP" + }, + "lovelyKiss": { + "name": "惡魔之吻", + "effect": "用恐怖的臉強吻對手。讓對\n手陷入睡眠狀態" + }, + "skyAttack": { + "name": "神鳥猛擊", + "effect": "第2回合攻擊對手。偶爾使\n對手畏縮。也容易擊中要害" + }, + "transform": { + "name": "變身", + "effect": "變身成對手寶可夢的樣子,\n能夠使用和對手完全相同的\n招式" + }, + "bubble": { + "name": "泡沫", + "effect": "向對手用力吹起無數泡泡進\n行攻擊。有時會降低對手的\n速度" + }, + "dizzyPunch": { + "name": "迷昏拳", + "effect": "有節奏地出拳攻擊對手。有\n時會使對手混亂" + }, + "spore": { + "name": "蘑菇孢子", + "effect": "沙沙沙地撒滿具有催眠效果\n的孢子,從而讓對手陷入睡\n眠狀態" + }, + "flash": { + "name": "閃光", + "effect": "使出光芒,從而降低對手的\n命中率。也可在陰暗的洞窟\n裏照亮四周" + }, + "psywave": { + "name": "精神波", + "effect": "向對手發射神奇的念波進行\n攻擊。每次使用,傷害都會\n改變" + }, + "splash": { + "name": "躍起", + "effect": "也不攻擊只是一蹦一蹦地跳,\n什麼都不會發生…" + }, + "acidArmor": { + "name": "溶化", + "effect": "通過細胞的變化進行液化,\n從而大幅提高自己的防禦" + }, + "crabhammer": { + "name": "蟹鉗錘", + "effect": "用大鉗子敲打對手進行攻擊。\n容易擊中要害" + }, + "explosion": { + "name": "大爆炸", + "effect": "引發大爆炸,攻擊自己周圍\n所有的寶可夢。使用後自己\n會陷入瀕死" + }, + "furySwipes": { + "name": "亂抓", + "effect": "用爪子或鐮刀等抓對手進行\n攻擊。連續攻擊2~5次" + }, + "bonemerang": { + "name": "骨頭回力鏢", + "effect": "用手中的骨頭投擲對手,來\n回連續2次給予傷害" + }, + "rest": { + "name": "睡覺", + "effect": "連續睡上2回合。回覆自己\n的全部HP以及治癒所有異\n常狀態" + }, + "rockSlide": { + "name": "岩崩", + "effect": "將大岩石猛烈地撞向對手進\n行攻擊。有時會使對手畏縮" + }, + "hyperFang": { + "name": "必殺門牙", + "effect": "用鋒利的門牙牢牢地咬住對\n手進行攻擊。有時會使對手\n畏縮" + }, + "sharpen": { + "name": "稜角化", + "effect": "增加身體的角,變得棱棱角\n角,從而提高自己的攻擊" + }, + "conversion": { + "name": "紋理", + "effect": "將自己的屬性轉換成和已學\n會的招式中第一個招式相同\n的屬性" + }, + "triAttack": { + "name": "三重攻擊", + "effect": "用3種光線進行攻擊。有時\n會讓對手陷入麻痹、灼傷或\n冰凍的狀態" + }, + "superFang": { + "name": "憤怒門牙", + "effect": "用鋒利的門牙猛烈地咬住對\n手進行攻擊。對手的HP減\n半" + }, + "slash": { + "name": "劈開", + "effect": "用爪子或鐮刀等劈開對手進\n行攻擊。容易擊中要害" + }, + "substitute": { + "name": "替身", + "effect": "削減少許自己的HP,製造\n分身。分身將成爲自己的替\n身" + }, + "struggle": { + "name": "掙扎", + "effect": "當自己的PP耗盡時,努力\n掙扎攻擊對手。自己也會受\n到少許傷害" + }, + "sketch": { + "name": "寫生", + "effect": "將對手使用的招式變成自己\n的招式。使用1次後寫生消\n失" + }, + "tripleKick": { + "name": "三連踢", + "effect": "連續3次踢對手進行攻擊。\n每踢中一次,威力就會提高" + }, + "thief": { + "name": "小偷", + "effect": "攻擊的同時盜取道具。當自\n己攜帶道具時,不會去盜取" + }, + "spiderWeb": { + "name": "蛛網", + "effect": "將黏糊糊的細絲一層一層纏\n住對手,使其不能從戰鬥中\n逃走" + }, + "mindReader": { + "name": "心之眼", + "effect": "用心感受對手的行動,下次\n攻擊必定會擊中對手" + }, + "nightmare": { + "name": "惡夢", + "effect": "讓在睡眠狀態下的對手做惡\n夢,每回合會緩緩減少HP" + }, + "flameWheel": { + "name": "火焰輪", + "effect": "讓火焰覆蓋全身,猛撞向對\n手進行攻擊。有時會讓對手\n陷入灼傷狀態" + }, + "snore": { + "name": "打鼾", + "effect": "在自己睡覺時,發出噪音進\n行攻擊。有時會使對手畏縮" + }, + "curse": { + "name": "詛咒", + "effect": "使用該招式的寶可夢,其屬\n性是幽靈屬性或其他屬性時,\n效果會不一樣" + }, + "flail": { + "name": "抓狂", + "effect": "抓狂般亂打進行攻擊。自己\n的HP越少,招式的威力越\n大" + }, + "conversion2": { + "name": "紋理2", + "effect": "爲了可以抵抗對手最後使用\n的招式,從而使自己的屬性\n發生變化" + }, + "aeroblast": { + "name": "氣旋攻擊", + "effect": "發射空氣旋渦進行攻擊。容\n易擊中要害" + }, + "cottonSpore": { + "name": "棉孢子", + "effect": "將棉花般柔軟的孢子緊貼對\n手,從而大幅降低對手的速\n度" + }, + "reversal": { + "name": "起死回生", + "effect": "竭盡全力進行攻擊。自己的\nHP越少,招式的威力越大" + }, + "spite": { + "name": "怨恨", + "effect": "對對手最後使用的招式懷有\n怨恨,減少4PP該招式" + }, + "powderSnow": { + "name": "細雪", + "effect": "將冰冷的細雪吹向對手進行\n攻擊。有時會讓對手陷入冰\n凍狀態" + }, + "protect": { + "name": "守住", + "effect": "完全抵擋對手的攻擊。連續\n使出則容易失敗" + }, + "machPunch": { + "name": "音速拳", + "effect": "以迅雷不及掩耳之勢出拳。\n必定能夠先制攻擊" + }, + "scaryFace": { + "name": "鬼面", + "effect": "用恐怖的表情瞪着對手,使\n其害怕,從而大幅降低對手\n的速度" + }, + "feintAttack": { + "name": "出奇一擊", + "effect": "悄悄地靠近對手,趁其不備\n進行毆打。攻擊必定會命中" + }, + "sweetKiss": { + "name": "天使之吻", + "effect": "像天使般可愛地親吻對手,\n從而使對手混亂" + }, + "bellyDrum": { + "name": "腹鼓", + "effect": "將自己的HP減少到最大\nHP的一半,從而最大限度提\n高自己的攻擊" + }, + "sludgeBomb": { + "name": "污泥炸彈", + "effect": "用污泥投擲對手進行攻擊。\n有時會讓對手陷入中毒狀態" + }, + "mudSlap": { + "name": "擲泥", + "effect": "向對手的臉等投擲泥塊進行\n攻擊。會降低對手的命中率" + }, + "octazooka": { + "name": "章魚桶炮", + "effect": "向對手的臉等噴出墨汁進行\n攻擊。有時會降低對手的命\n中率" + }, + "spikes": { + "name": "撒菱", + "effect": "在對手的腳下扔撒菱。對替\n換出場的對手的寶可夢給予\n傷害" + }, + "zapCannon": { + "name": "電磁炮", + "effect": "發射大炮一樣的電流進行攻\n擊。讓對手陷入麻痹狀態" + }, + "foresight": { + "name": "識破", + "effect": "使出後對幽靈屬性寶可夢沒\n有效果的招式以及閃避率高\n的對手,變得能夠打中" + }, + "destinyBond": { + "name": "同命", + "effect": "使出招式後,當受到對手攻\n擊陷入瀕死時,對手也會一\n同瀕死。連續使出則會失敗" + }, + "perishSong": { + "name": "滅亡之歌", + "effect": "傾聽歌聲的寶可夢經過3回\n合陷入瀕死。替換後效果消\n失" + }, + "icyWind": { + "name": "冰凍之風", + "effect": "將結冰的冷氣吹向對手進行\n攻擊。會降低對手的速度" + }, + "detect": { + "name": "看穿", + "effect": "完全抵擋對手的攻擊。連續\n使出則容易失敗" + }, + "boneRush": { + "name": "骨棒亂打", + "effect": "用堅硬的骨頭毆打對手進行\n攻擊。連續攻擊2~5次" + }, + "lockOn": { + "name": "鎖定", + "effect": "緊緊瞄準對手,下次攻擊必\n定會打中" + }, + "outrage": { + "name": "逆鱗", + "effect": "在2~3回合內,亂打一氣\n地進行攻擊。大鬧一番後自\n己會陷入混亂" + }, + "sandstorm": { + "name": "沙暴", + "effect": "在5回合內揚起沙暴,除巖\n石、地面和鋼屬性以外的寶\n可夢,都會受到傷害。岩石\n屬性的特防還會提高" + }, + "gigaDrain": { + "name": "終極吸取", + "effect": "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP" + }, + "endure": { + "name": "挺住", + "effect": "即使受到攻擊,也至少會留\n下1HP。連續使出則容易\n失敗" + }, + "charm": { + "name": "撒嬌", + "effect": "可愛地凝視,誘使對手疏忽\n大意,從而大幅降低對手的\n攻擊" + }, + "rollout": { + "name": "滾動", + "effect": "在5回合內連續滾動攻擊對\n手。招式每次擊中,威力就\n會提高" + }, + "falseSwipe": { + "name": "點到爲止", + "effect": "對手的HP至少會留下1\nHP,如此般手下留情地攻擊" + }, + "swagger": { + "name": "虛張聲勢", + "effect": "激怒對手,使其混亂。因爲\n憤怒,對手的攻擊會大幅提\n高" + }, + "milkDrink": { + "name": "喝牛奶", + "effect": "回覆自己最大HP的一半" + }, + "spark": { + "name": "電光", + "effect": "讓電流覆蓋全身,猛撞向對\n手進行攻擊。有時會讓對手\n陷入麻痹狀態" + }, + "furyCutter": { + "name": "連斬", + "effect": "用鐮刀或爪子等切斬對手進\n行攻擊。連續擊中,威力就\n會提高" + }, + "steelWing": { + "name": "鋼翼", + "effect": "用堅硬的翅膀敲打對手進行\n攻擊。有時會提高自己的防\n御" + }, + "meanLook": { + "name": "黑色目光", + "effect": "用好似要勾人心魂的黑色目\n光一動不動地凝視對手,使\n其不能從戰鬥中逃走" + }, + "attract": { + "name": "迷人", + "effect": "♂誘惑♀或♀誘惑♂,讓對\n手着迷。對手將很難使出招\n式" + }, + "sleepTalk": { + "name": "夢話", + "effect": "從自己已學會的招式中任意\n使出1個。只能在自己睡覺\n時使用" + }, + "healBell": { + "name": "治癒鈴聲", + "effect": "讓同伴聽舒適的鈴音,從而\n治癒我方全員的異常狀態" + }, + "return": { + "name": "報恩", + "effect": "爲了訓練家而全力攻擊對手。\n親密度越高,威力越大" + }, + "present": { + "name": "禮物", + "effect": "遞給對手設有圈套的盒子進\n行攻擊。也有可能回覆對手\nHP" + }, + "frustration": { + "name": "遷怒", + "effect": "爲了發泄不滿而全力攻擊對\n手。親密度越低,威力越大" + }, + "safeguard": { + "name": "神祕守護", + "effect": "在5回合內被神奇的力量守\n護,從而不會陷入異常狀態" + }, + "painSplit": { + "name": "分擔痛楚", + "effect": "將自己的HP和對手的HP\n相加,然後自己和對手友好\n地平分" + }, + "sacredFire": { + "name": "神聖之火", + "effect": "用神祕的火焰燒盡對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態" + }, + "magnitude": { + "name": "震級", + "effect": "晃動地面,攻擊自己周圍所\n有的寶可夢。招式的威力會\n有各種變化" + }, + "dynamicPunch": { + "name": "爆裂拳", + "effect": "使出渾身力氣出拳進行攻擊。\n必定會使對手混亂" + }, + "megahorn": { + "name": "超級角擊", + "effect": "用堅硬且華麗的角狠狠地刺\n入對手進行攻擊" + }, + "dragonBreath": { + "name": "龍息", + "effect": "將強烈的氣息吹向對手進行\n攻擊。有時會讓對手陷入麻\n痹狀態" + }, + "batonPass": { + "name": "接棒", + "effect": "和後備寶可夢進行替換。換\n上的寶可夢能直接繼承其能\n力的變化" + }, + "encore": { + "name": "再來一次", + "effect": "讓對手接受再來一次,連續\n3次使出最後使用的招式" + }, + "pursuit": { + "name": "追打", + "effect": "當對手替換寶可夢上場時使\n出此招式的話,能夠以2倍\n的威力進行攻擊" + }, + "rapidSpin": { + "name": "高速旋轉", + "effect": "通過旋轉來攻擊對手。可以\n擺脫綁緊、緊束、寄生種子\n等招式。還能提高自己的速\n度" + }, + "sweetScent": { + "name": "甜甜香氣", + "effect": "用香氣大幅降低對手的閃避\n率" + }, + "ironTail": { + "name": "鐵尾", + "effect": "使用堅硬的尾巴摔打對手進\n行攻擊。有時會降低對手的\n防禦" + }, + "metalClaw": { + "name": "金屬爪", + "effect": "用鋼鐵之爪劈開對手進行攻\n擊。有時會提高自己的攻擊" + }, + "vitalThrow": { + "name": "借力摔", + "effect": "會在對手之後進行攻擊。但\n是自己的攻擊必定會命中" + }, + "morningSun": { + "name": "晨光", + "effect": "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化" + }, + "synthesis": { + "name": "光合作用", + "effect": "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化" + }, + "moonlight": { + "name": "月光", + "effect": "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化" + }, + "hiddenPower": { + "name": "覺醒力量", + "effect": "招式的屬性會隨着使用此招\n式的寶可夢而改變" + }, + "crossChop": { + "name": "十字劈", + "effect": "用兩手呈十字劈打對手進行\n攻擊。容易擊中要害" + }, + "twister": { + "name": "龍捲風", + "effect": "興起龍捲風,將對手卷入進\n行攻擊。有時會使對手畏縮" + }, + "rainDance": { + "name": "求雨", + "effect": "在5回合內一直降雨,從而\n提高水屬性的招式威力。火\n屬性的招式威力則降低" + }, + "sunnyDay": { + "name": "大晴天", + "effect": "在5回合內讓日照變得強烈,\n從而提高火屬性的招式威\n力。水屬性的招式威力則降\n低" + }, + "crunch": { + "name": "咬碎", + "effect": "用利牙咬碎對手進行攻擊。\n有時會降低對手的防禦" + }, + "mirrorCoat": { + "name": "鏡面反射", + "effect": "從對手那裏受到特殊攻擊的\n傷害將以2倍返還給同一個\n對手" + }, + "psychUp": { + "name": "自我暗示", + "effect": "向自己施以自我暗示,將能\n力變化的狀態變得和對手一\n樣" + }, + "extremeSpeed": { + "name": "神速", + "effect": "以迅雷不及掩耳之勢猛撞向\n對手進行攻擊。必定能夠先\n制攻擊" + }, + "ancientPower": { + "name": "原始之力", + "effect": "用原始之力進行攻擊。有時\n會提高自己所有的能力" + }, + "shadowBall": { + "name": "暗影球", + "effect": "投擲一團黑影進行攻擊。有\n時會降低對手的特防" + }, + "futureSight": { + "name": "預知未來", + "effect": "在使用招式2回合後,向對\n手發送一團念力進行攻擊" + }, + "rockSmash": { + "name": "碎岩", + "effect": "用拳頭進行攻擊。有時會降\n低對手的防禦" + }, + "whirlpool": { + "name": "潮旋", + "effect": "將對手困在激烈的水流旋渦\n中,在4~5回合內進行攻\n擊" + }, + "beatUp": { + "name": "圍攻", + "effect": "我方全員進行攻擊。同行的\n寶可夢越多,招式的攻擊次\n數越多" + }, + "fakeOut": { + "name": "擊掌奇襲", + "effect": "進行先制攻擊,使對手畏縮。\n要在出場後立刻使出才能\n成功" + }, + "uproar": { + "name": "吵鬧", + "effect": "在3回合內大吵大鬧攻擊對\n手。在此期間誰都不能入眠" + }, + "stockpile": { + "name": "蓄力", + "effect": "積蓄力量,提高自己的防禦\n和特防。最多積蓄3次" + }, + "spitUp": { + "name": "噴出", + "effect": "將積蓄的力量撞向對手進行\n攻擊。積蓄得越多,威力越\n大" + }, + "swallow": { + "name": "吞下", + "effect": "將積蓄的力量吞下,從而回\n復自己的HP。積蓄得越多,\n回覆越大" + }, + "heatWave": { + "name": "熱風", + "effect": "將炎熱的氣息吹向對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態" + }, + "hail": { + "name": "冰雹", + "effect": "在5回合內一直降冰雹,除\n冰屬性的寶可夢以外,給予\n全體寶可夢傷害" + }, + "torment": { + "name": "無理取鬧", + "effect": "向對手無理取鬧,令其不能\n連續2次使出相同招式" + }, + "flatter": { + "name": "吹捧", + "effect": "吹捧對手,使其混亂。同時\n還會提高對手的特攻" + }, + "willOWisp": { + "name": "鬼火", + "effect": "放出怪異的火焰,從而讓對\n手陷入灼傷狀態" + }, + "memento": { + "name": "臨別禮物", + "effect": "雖然會使自己陷入昏厥,但\n是能夠大幅降低對手的攻擊\n和特攻" + }, + "facade": { + "name": "硬撐", + "effect": "當自己處於中毒、麻痹、灼\n傷狀態時,向對手使出此招\n式的話,威力會變成2倍" + }, + "focusPunch": { + "name": "真氣拳", + "effect": "集中精神出拳。在招式使出\n前若受到攻擊則會失敗" + }, + "smellingSalts": { + "name": "清醒", + "effect": "對於麻痹狀態下的對手,威\n力會變成2倍。但相反對手\n的麻痹也會被治癒" + }, + "followMe": { + "name": "看我嘛", + "effect": "引起對手的注意,將對手的\n攻擊全部轉移到自己身上" + }, + "naturePower": { + "name": "自然之力", + "effect": "用自然之力進行攻擊。根據\n所使用場所的不同,使出的\n招式也會有所變化" + }, + "charge": { + "name": "充電", + "effect": "變爲充電狀態,提高下次使\n出的電屬性的招式威力。自\n己的特防也會提高" + }, + "taunt": { + "name": "挑釁", + "effect": "使對手憤怒。在3回合內讓\n對手只能使出給予傷害的招\n式" + }, + "helpingHand": { + "name": "幫助", + "effect": "幫助夥伴。被幫助的寶可夢,\n其招式威力變得比平時大" + }, + "trick": { + "name": "戲法", + "effect": "抓住對手的空隙,交換自己\n和對手的持有物" + }, + "rolePlay": { + "name": "扮演", + "effect": "扮演對手,讓自己的特性變\n得和對手相同" + }, + "wish": { + "name": "祈願", + "effect": "在下一回合回覆自己或是替\n換出場的寶可夢最大HP的\n一半" + }, + "assist": { + "name": "藉助", + "effect": "向同伴緊急求助,從我方寶\n可夢已學會的招式中隨機使\n用1個" + }, + "ingrain": { + "name": "扎根", + "effect": "在大地上扎根,每回合回覆\n自己的HP。因爲扎根了,\n所以不能替換寶可夢" + }, + "superpower": { + "name": "蠻力", + "effect": "發揮驚人的力量攻擊對手。\n自己的攻擊和防禦會降低" + }, + "magicCoat": { + "name": "魔法反射", + "effect": "當對手使出會變成異常狀態\n的招式或寄生種子等時,會\n將對手的招式反射回去" + }, + "recycle": { + "name": "回收利用", + "effect": "使戰鬥中已經消耗掉的自己\n的持有物再生,並可以再次\n使用" + }, + "revenge": { + "name": "報復", + "effect": "如果受到對手的招式攻擊,\n就能給予對手2倍的傷害" + }, + "brickBreak": { + "name": "劈瓦", + "effect": "將手刀猛烈地揮下攻擊對手。\n還可以破壞光牆和反射壁\n等" + }, + "yawn": { + "name": "哈欠", + "effect": "打個大哈欠引起睡意。在下\n一回合讓對手陷入睡眠狀態" + }, + "knockOff": { + "name": "拍落", + "effect": "拍落對手的持有物,直到戰\n鬥結束都不能使用。對手攜\n帶道具時會增加傷害" + }, + "endeavor": { + "name": "蠻幹", + "effect": "給予傷害,使對手的HP變\n得和自己的HP一樣" + }, + "eruption": { + "name": "噴火", + "effect": "爆發怒火攻擊對手。自己的\nHP越少,招式的威力越小" + }, + "skillSwap": { + "name": "特性互換", + "effect": "利用超能力互換自己和對手\n的特性" + }, + "imprison": { + "name": "封印", + "effect": "如果對手有和自己相同的招\n式,那麼只有對手無法使用\n該招式" + }, + "refresh": { + "name": "煥然一新", + "effect": "讓身體休息,治癒自己身上\n所中的毒、麻痹、灼傷的異\n常狀態" + }, + "grudge": { + "name": "怨念", + "effect": "因對手的招式而陷入昏厥時\n給對手施加怨念,讓該招式\n的PP變成0" + }, + "snatch": { + "name": "搶奪", + "effect": "將對手打算使用的回覆招式\n或能力變化招式奪爲己用" + }, + "secretPower": { + "name": "祕密之力", + "effect": "根據使用場所不同,該招式\n的追加效果也會有所變化" + }, + "dive": { + "name": "潛水", + "effect": "第1回合潛入水中,第2回\n合浮上來進行攻擊" + }, + "armThrust": { + "name": "猛推", + "effect": "用張開着的雙手猛推對手進\n行攻擊。連續攻擊2~5次" + }, + "camouflage": { + "name": "保護色", + "effect": "根據所在場所不同,如水邊\n、草叢和洞窟等,可以改變\n自己的屬性" + }, + "tailGlow": { + "name": "螢火", + "effect": "凝視閃爍的光芒,集中自己\n的精神,從而巨幅提高特攻" + }, + "lusterPurge": { + "name": "潔淨光芒", + "effect": "釋放耀眼的光芒進行攻擊。\n有時會降低對手的特防" + }, + "mistBall": { + "name": "薄霧球", + "effect": "用圍繞着霧狀羽毛的球進行\n攻擊。有時會降低對手的特\n攻" + }, + "featherDance": { + "name": "羽毛舞", + "effect": "撒出羽毛,籠罩在對手的周\n圍。大幅降低對手的攻擊" + }, + "teeterDance": { + "name": "搖晃舞", + "effect": "搖搖晃晃地跳起舞蹈,讓自\n己周圍的寶可夢陷入混亂狀\n態" + }, + "blazeKick": { + "name": "火焰踢", + "effect": "攻擊對手後,有時會使其陷\n入灼傷狀態。也容易擊中要\n害" + }, + "mudSport": { + "name": "玩泥巴", + "effect": "一旦使用此招式,周圍就會\n弄得到處是泥。在5回合內\n減弱電屬性的招式" + }, + "iceBall": { + "name": "冰球", + "effect": "在5回合內攻擊對手。招式\n每次擊中,威力就會提高" + }, + "needleArm": { + "name": "尖刺臂", + "effect": "用帶刺的手臂猛烈地揮舞進\n行攻擊。有時會使對手畏縮" + }, + "slackOff": { + "name": "偷懶", + "effect": "偷懶休息。回覆自己最大\nHP的一半" + }, + "hyperVoice": { + "name": "巨聲", + "effect": "給予對手又吵又響的巨大震\n動進行攻擊" + }, + "poisonFang": { + "name": "劇毒牙", + "effect": "用有毒的牙齒咬住對手進行\n攻擊。有時會使對手中劇毒" + }, + "crushClaw": { + "name": "撕裂爪", + "effect": "用堅硬的銳爪劈開對手進行\n攻擊。有時會降低對手的防\n御" + }, + "blastBurn": { + "name": "爆炸烈焰", + "effect": "用爆炸的火焰燒盡對手進行\n攻擊。下一回合自己將無法\n動彈" + }, + "hydroCannon": { + "name": "加農水炮", + "effect": "向對手噴射水炮進行攻擊。\n下一回合自己將無法動彈" + }, + "meteorMash": { + "name": "彗星拳", + "effect": "使出彗星般的拳頭攻擊對手。\n有時會提高自己的攻擊" + }, + "astonish": { + "name": "驚嚇", + "effect": "用尖叫聲等突然驚嚇對手進\n行攻擊。有時會使對手畏縮" + }, + "weatherBall": { + "name": "氣象球", + "effect": "根據使用時的天氣,招式屬\n性和威力會改變" + }, + "aromatherapy": { + "name": "芳香治療", + "effect": "讓同伴聞沁人心脾的香氣,\n從而治癒我方全員的異常狀\n態" + }, + "fakeTears": { + "name": "假哭", + "effect": "裝哭流淚。使對手不知所措,\n從而大幅降低對手的特防" + }, + "airCutter": { + "name": "空氣利刃", + "effect": "用銳利的風切斬對手進行攻\n擊。容易擊中要害" + }, + "overheat": { + "name": "過熱", + "effect": "使出全部力量攻擊對手。使\n用之後會因爲反作用力,自\n己的特攻大幅降低" + }, + "odorSleuth": { + "name": "氣味偵測", + "effect": "使出後對幽靈屬性寶可夢沒\n有效果的招式以及閃避率高\n的對手,變得能夠打中" + }, + "rockTomb": { + "name": "岩石封鎖", + "effect": "投擲岩石進行攻擊。封住對\n手的行動,從而降低速度" + }, + "silverWind": { + "name": "銀色旋風", + "effect": "在風中摻入鱗粉攻擊對手。\n有時會提高自己的全部能力" + }, + "metalSound": { + "name": "金屬音", + "effect": "讓對手聽摩擦金屬般討厭的\n聲音。大幅降低對手的特防" + }, + "grassWhistle": { + "name": "草笛", + "effect": "讓對手聽舒適的笛聲,從而\n陷入睡眠狀態" + }, + "tickle": { + "name": "搔癢", + "effect": "給對手搔癢,使其發笑,從\n而降低對手的攻擊和防禦" + }, + "cosmicPower": { + "name": "宇宙力量", + "effect": "汲取宇宙中神祕的力量,從\n而提高自己的防禦和特防" + }, + "waterSpout": { + "name": "噴水", + "effect": "掀起潮水進行攻擊。自己的\nHP越少,招式的威力越小" + }, + "signalBeam": { + "name": "信號光束", + "effect": "發射神奇的光線進行攻擊。\n有時會使對手混亂" + }, + "shadowPunch": { + "name": "暗影拳", + "effect": "使出混影之拳。攻擊必定會\n命中" + }, + "extrasensory": { + "name": "神通力", + "effect": "發出看不見的神奇力量進行\n攻擊。有時會使對手畏縮" + }, + "skyUppercut": { + "name": "衝天拳", + "effect": "用衝向天空般高高的上勾拳\n頂起對手進行攻擊" + }, + "sandTomb": { + "name": "流沙地獄", + "effect": "將對手困在鋪天蓋地的沙暴\n中,在4~5回合內進行攻\n擊" + }, + "sheerCold": { + "name": "絕對零度", + "effect": "給對手一擊瀕死。如果是冰\n屬性以外的寶可夢使用,就\n會難以打中" + }, + "muddyWater": { + "name": "濁流", + "effect": "向對手噴射渾濁的水進行攻\n擊。有時會降低對手的命中\n率" + }, + "bulletSeed": { + "name": "種子機關槍", + "effect": "向對手猛烈地發射種子進行\n攻擊。連續攻擊2~5次" + }, + "aerialAce": { + "name": "燕返", + "effect": "以敏捷的動作戲弄對手後進\n行切斬。攻擊必定會命中" + }, + "icicleSpear": { + "name": "冰錐", + "effect": "向對手發射鋒利的冰柱進行\n攻擊。連續攻擊2~5次" + }, + "ironDefense": { + "name": "鐵壁", + "effect": "將皮膚變得堅硬如鐵,從而\n大幅提高自己的防禦" + }, + "block": { + "name": "擋路", + "effect": "張開雙手進行阻擋,封住對\n手的退路,使其不能逃走" + }, + "howl": { + "name": "長嚎", + "effect": "大聲吼叫提高氣勢,從而提\n高自己和同伴的攻擊" + }, + "dragonClaw": { + "name": "龍爪", + "effect": "用尖銳的巨爪劈開對手進行\n攻擊" + }, + "frenzyPlant": { + "name": "瘋狂植物", + "effect": "用大樹摔打對手進行攻擊。\n下一回合自己將無法動彈" + }, + "bulkUp": { + "name": "健美", + "effect": "使出全身力氣繃緊肌肉,從\n而提高自己的攻擊和防禦" + }, + "bounce": { + "name": "彈跳", + "effect": "彈跳到高高的空中,第2回\n合攻擊對手。有時會讓對手\n陷入麻痹狀態" + }, + "mudShot": { + "name": "泥巴射擊", + "effect": "向對手投擲泥塊進行攻擊。\n同時降低對手的速度" + }, + "poisonTail": { + "name": "毒尾", + "effect": "用尾巴拍打。有時會讓對手\n陷入中毒狀態,也容易擊中\n要害" + }, + "covet": { + "name": "渴望", + "effect": "一邊可愛地撒嬌,一邊靠近\n對手進行攻擊,還能奪取對\n手攜帶的道具" + }, + "voltTackle": { + "name": "伏特攻擊", + "effect": "讓電流覆蓋全身猛撞向對手。\n自己也會受到不小的傷害。\n有時會讓對手陷入麻痹狀\n態" + }, + "magicalLeaf": { + "name": "魔法葉", + "effect": "散落可以追蹤對手的神奇葉\n片。攻擊必定會命中" + }, + "waterSport": { + "name": "玩水", + "effect": "用水溼透周圍。在5回合內\n減弱火屬性的招式" + }, + "calmMind": { + "name": "冥想", + "effect": "靜心凝神,從而提高自己的\n特攻和特防" + }, + "leafBlade": { + "name": "葉刃", + "effect": "像用劍一般操縱葉片切斬對\n手進行攻擊。容易擊中要害" + }, + "dragonDance": { + "name": "龍之舞", + "effect": "激烈地跳起神祕且強有力的\n舞蹈。從而提高自己的攻擊\n和速度" + }, + "rockBlast": { + "name": "岩石爆擊", + "effect": "向對手發射堅硬的岩石進行\n攻擊。連續攻擊2~5次" + }, + "shockWave": { + "name": "電擊波", + "effect": "向對手快速發出電擊。攻擊\n必定會命中" + }, + "waterPulse": { + "name": "水之波動", + "effect": "用水的震動攻擊對手。有時\n會使對手混亂" + }, + "doomDesire": { + "name": "破滅之願", + "effect": "使用招式2回合後,會用無\n數道光束攻擊對手" + }, + "psychoBoost": { + "name": "精神突進", + "effect": "使出全部力量攻擊對手。使\n用之後會因爲反作用力,自\n己的特攻大幅降低" + }, + "roost": { + "name": "羽棲", + "effect": "降到地面,使身體休息。回\n復自己最大HP的一半" + }, + "gravity": { + "name": "重力", + "effect": "在5回合內,飄浮特性和飛\n行屬性的寶可夢會被地面屬\n性的招式擊中。飛向空中的\n招式也將無法使用" + }, + "miracleEye": { + "name": "奇蹟之眼", + "effect": "使出後對惡屬性寶可夢沒有\n效果的招式以及閃避率高的\n對手,變得能夠打中" + }, + "wakeUpSlap": { + "name": "喚醒巴掌", + "effect": "給予睡眠狀態下的對手較大\n的傷害。但相反對手會從睡\n眠中醒過來" + }, + "hammerArm": { + "name": "臂錘", + "effect": "揮舞強力而沉重的拳頭,給\n予對手傷害。自己的速度會\n降低" + }, + "gyroBall": { + "name": "陀螺球", + "effect": "讓身體高速旋轉並撞擊對手。\n速度比對手越慢,威力越\n大" + }, + "healingWish": { + "name": "治癒之願", + "effect": "雖然自己陷入瀕死,但可以\n治癒後備上場的寶可夢的異\n常狀態以及回覆HP" + }, + "brine": { + "name": "鹽水", + "effect": "當對手的HP負傷到一半左\n右時,招式威力會變成2倍" + }, + "naturalGift": { + "name": "自然之恩", + "effect": "從樹果上獲得力量進行攻擊。\n根據攜帶的樹果,招式屬\n性和威力會改變" + }, + "feint": { + "name": "佯攻", + "effect": "能夠攻擊正在使用守住或看\n穿等招式的對手。解除其守\n護效果" + }, + "pluck": { + "name": "啄食", + "effect": "用喙進行攻擊。當對手攜帶\n樹果時,可以食用並獲得其\n效果" + }, + "tailwind": { + "name": "順風", + "effect": "颳起猛烈的旋風,在4回合\n內提高我方全員的速度" + }, + "acupressure": { + "name": "點穴", + "effect": "通過點穴讓身體舒筋活絡。\n大幅提高某1項能力" + }, + "metalBurst": { + "name": "金屬爆炸", + "effect": "使出招式前,將最後受到的\n招式的傷害大力返還給對手" + }, + "uTurn": { + "name": "急速折返", + "effect": "在攻擊之後急速返回,和後\n備寶可夢進行替換" + }, + "closeCombat": { + "name": "近身戰", + "effect": "放棄守護,向對手的懷裏突\n擊。自己的防禦和特防會降\n低" + }, + "payback": { + "name": "以牙還牙", + "effect": "蓄力攻擊。如果能在對手之\n後攻擊,招式的威力會變成\n2倍" + }, + "assurance": { + "name": "惡意追擊", + "effect": "如果此回合內對手已經受到\n傷害的話,招式威力會變成\n2倍" + }, + "embargo": { + "name": "查封", + "effect": "讓對手在5回合內不能使用\n寶可夢攜帶的道具。訓練家\n也不能給那隻寶可夢使用道\n具" + }, + "fling": { + "name": "投擲", + "effect": "快速投擲攜帶的道具進行攻\n擊。根據道具不同,威力和\n效果會改變" + }, + "psychoShift": { + "name": "精神轉移", + "effect": "利用超能力施以暗示,從而\n將自己受到的異常狀態轉移\n給對手" + }, + "trumpCard": { + "name": "王牌", + "effect": "王牌招式的剩餘PP越少,\n招式的威力越大" + }, + "healBlock": { + "name": "回覆封鎖", + "effect": "在5回合內無法通過招式、\n特性或攜帶的道具來回復H\nP" + }, + "wringOut": { + "name": "絞緊", + "effect": "用力勒緊對手進行攻擊。對\n手的HP越多,威力越大" + }, + "powerTrick": { + "name": "力量戲法", + "effect": "利用超能力交換自己的攻擊\n和防禦的力量" + }, + "gastroAcid": { + "name": "胃液", + "effect": "將胃液吐向對手的身體。沾\n上的胃液會消除對手的特性\n效果" + }, + "luckyChant": { + "name": "幸運咒語", + "effect": "向天許願,從而在5回合內\n不會被對手的攻擊打中要害" + }, + "meFirst": { + "name": "搶先一步", + "effect": "提高威力,搶先使出對手想\n要使出的招式。如果不先使\n出則會失敗" + }, + "copycat": { + "name": "仿效", + "effect": "模仿對手剛纔使出的招式,\n並使出相同招式。如果對手\n還沒出招則會失敗" + }, + "powerSwap": { + "name": "力量互換", + "effect": "利用超能力互換自己和對手\n的攻擊以及特攻的能力變化" + }, + "guardSwap": { + "name": "防守互換", + "effect": "利用超能力互換自己和對手\n的防禦以及特防的能力變化" + }, + "punishment": { + "name": "懲罰", + "effect": "根據能力變化,對手提高的\n力量越大,招式的威力越大" + }, + "lastResort": { + "name": "珍藏", + "effect": "當戰鬥中已學會的招式全部\n使用過後,才能開始使出珍\n藏的招式" + }, + "worrySeed": { + "name": "煩惱種子", + "effect": "種植心神不寧的種子。使對\n手不能入眠,並將特性變成\n不眠" + }, + "suckerPunch": { + "name": "突襲", + "effect": "可以比對手先攻擊。對手使\n出的招式如果不是攻擊招式\n則會失敗" + }, + "toxicSpikes": { + "name": "毒菱", + "effect": "在對手的腳下撒毒菱。使對\n手替換出場的寶可夢中毒" + }, + "heartSwap": { + "name": "心靈互換", + "effect": "利用超能力互換自己和對手\n之間的能力變化" + }, + "aquaRing": { + "name": "水流環", + "effect": "在自己身體的周圍覆蓋用水\n製造的幕。每回合回覆HP" + }, + "magnetRise": { + "name": "電磁飄浮", + "effect": "利用電氣產生的磁力浮在空\n中。在5回合內可以飄浮" + }, + "flareBlitz": { + "name": "閃焰衝鋒", + "effect": "讓火焰覆蓋全身猛撞向對手。\n自己也會受到不小的傷害。\n有時會讓對手陷入灼傷狀\n態" + }, + "forcePalm": { + "name": "發勁", + "effect": "向對手的身體發出衝擊波進\n行攻擊。有時會讓對手陷入\n麻痹狀態" + }, + "auraSphere": { + "name": "波導彈", + "effect": "從體內產生出波導之力,然\n後向對手發出。攻擊必定會\n命中" + }, + "rockPolish": { + "name": "岩石打磨", + "effect": "打磨自己的身體,減少空氣\n阻力。可以大幅提高自己的\n速度" + }, + "poisonJab": { + "name": "毒擊", + "effect": "用帶毒的觸手或手臂刺入對\n手。有時會讓對手陷入中毒\n狀態" + }, + "darkPulse": { + "name": "惡之波動", + "effect": "從體內發出充滿惡意的恐怖\n氣場。有時會使對手畏縮" + }, + "nightSlash": { + "name": "暗襲要害", + "effect": "抓住瞬間的空隙切斬對手。\n容易擊中要害" + }, + "aquaTail": { + "name": "水流尾", + "effect": "如驚濤駭浪般揮動大尾巴攻\n擊對手" + }, + "seedBomb": { + "name": "種子炸彈", + "effect": "將外殼堅硬的大種子,從上\n方砸下攻擊對手" + }, + "airSlash": { + "name": "空氣斬", + "effect": "用連天空也能劈開的空氣之\n刃進行攻擊。有時會使對手\n畏縮" + }, + "xScissor": { + "name": "十字剪", + "effect": "將鐮刀或爪子像剪刀般地交\n叉,順勢劈開對手" + }, + "bugBuzz": { + "name": "蟲鳴", + "effect": "利用振動發出音波進行攻擊。\n有時會降低對手的特防" + }, + "dragonPulse": { + "name": "龍之波動", + "effect": "從大大的口中掀起衝擊波攻\n擊對手" + }, + "dragonRush": { + "name": "龍之俯衝", + "effect": "釋放出駭人的殺氣,一邊威\n懾一邊撞擊對手。有時會使\n對手畏縮" + }, + "powerGem": { + "name": "力量寶石", + "effect": "發射如寶石般閃耀的光芒攻\n擊對手" + }, + "drainPunch": { + "name": "吸取拳", + "effect": "用拳頭吸取對手的力量。可\n以回覆給予對手傷害的一半\nHP" + }, + "vacuumWave": { + "name": "真空波", + "effect": "揮動拳頭,掀起真空波。必\n定能夠先制攻擊" + }, + "focusBlast": { + "name": "真氣彈", + "effect": "提高氣勢,釋放出全部力量。\n有時會降低對手的特防" + }, + "energyBall": { + "name": "能量球", + "effect": "發射從自然收集的生命力量。\n有時會降低對手的特防" + }, + "braveBird": { + "name": "勇鳥猛攻", + "effect": "收攏翅膀,通過低空飛行突\n擊對手。自己也會受到不小\n的傷害" + }, + "earthPower": { + "name": "大地之力", + "effect": "向對手腳下釋放出大地之力。\n有時會降低對手的特防" + }, + "switcheroo": { + "name": "掉包", + "effect": "用一閃而過的速度交換自己\n和對手的持有物" + }, + "gigaImpact": { + "name": "終極衝擊", + "effect": "使出自己渾身力量突擊對手。\n下一回合自己將無法動彈" + }, + "nastyPlot": { + "name": "詭計", + "effect": "謀劃詭計,激活頭腦。大幅\n提高自己的特攻" + }, + "bulletPunch": { + "name": "子彈拳", + "effect": "向對手使出如子彈般快速而\n堅硬的拳頭。必定能夠先制\n攻擊" + }, + "avalanche": { + "name": "雪崩", + "effect": "如果受到對手的招式攻擊,\n就能給予該對手2倍威力的\n攻擊" + }, + "iceShard": { + "name": "冰礫", + "effect": "瞬間製作冰塊,快速地扔向\n對手。必定能夠先制攻擊" + }, + "shadowClaw": { + "name": "暗影爪", + "effect": "以影子做成的銳爪,劈開對\n手。容易擊中要害" + }, + "thunderFang": { + "name": "雷電牙", + "effect": "用蓄滿電流的牙齒咬住對手。\n有時會使對手畏縮或陷入\n麻痹狀態" + }, + "iceFang": { + "name": "冰凍牙", + "effect": "用藏有冷氣的牙齒咬住對手。\n有時會使對手畏縮或陷入\n冰凍狀態" + }, + "fireFang": { + "name": "火焰牙", + "effect": "用覆蓋着火焰的牙齒咬住對\n手。有時會使對手畏縮或陷\n入灼傷狀態" + }, + "shadowSneak": { + "name": "影子偷襲", + "effect": "伸長影子,從對手的背後進\n行攻擊。必定能夠先制攻擊" + }, + "mudBomb": { + "name": "泥巴炸彈", + "effect": "向對手發射堅硬的泥彈進行\n攻擊。有時會降低對手的命\n中率" + }, + "psychoCut": { + "name": "精神利刃", + "effect": "用實體化的心之利刃劈開對\n手。容易擊中要害" + }, + "zenHeadbutt": { + "name": "意念頭錘", + "effect": "將思念的力量集中在前額進\n行攻擊。有時會使對手畏縮" + }, + "mirrorShot": { + "name": "鏡光射擊", + "effect": "拋光自己的身體,向對手釋\n放出閃光之力。有時會降低\n對手的命中率" + }, + "flashCannon": { + "name": "加農光炮", + "effect": "將身體的光芒聚集在一點釋\n放出去。有時會降低對手的\n特防" + }, + "rockClimb": { + "name": "攀岩", + "effect": "發動猛撞攻擊,有時會使對\n手混亂。是寶可表的祕傳招\n式之一" + }, + "defog": { + "name": "清除濃霧", + "effect": "用強風吹開對手的反射壁或\n光牆等。也會降低對手的閃\n避率" + }, + "trickRoom": { + "name": "戲法空間", + "effect": "製造出離奇的空間。在5回\n合內速度慢的寶可夢可以先\n行動" + }, + "dracoMeteor": { + "name": "流星群", + "effect": "從天空中向對手落下隕石。\n使用之後因爲反作用力,自\n己的特攻會大幅降低" + }, + "discharge": { + "name": "放電", + "effect": "用耀眼的電擊攻擊自己周圍\n所有的寶可夢。有時會陷入\n麻痹狀態" + }, + "lavaPlume": { + "name": "噴煙", + "effect": "用熊熊烈火攻擊自己周圍所\n有的寶可夢。有時會陷入灼\n傷狀態" + }, + "leafStorm": { + "name": "飛葉風暴", + "effect": "用尖尖的葉片向對手卷起風\n暴。使用之後因爲反作用力\n自己的特攻會大幅降低" + }, + "powerWhip": { + "name": "強力鞭打", + "effect": "激烈地揮舞青藤或觸手摔打\n對手進行攻擊" + }, + "rockWrecker": { + "name": "岩石炮", + "effect": "向對手發射巨大的岩石進行\n攻擊。下一回合自己將無法\n動彈" + }, + "crossPoison": { + "name": "十字毒刃", + "effect": "用毒刃劈開對手。有時會讓\n對手陷入中毒狀態,也容易\n擊中要害" + }, + "gunkShot": { + "name": "垃圾射擊", + "effect": "用骯髒的垃圾撞向對手進行\n攻擊。有時會讓對手陷入中\n毒狀態" + }, + "ironHead": { + "name": "鐵頭", + "effect": "用鋼鐵般堅硬的頭部進行攻\n擊。有時會使對手畏縮" + }, + "magnetBomb": { + "name": "磁鐵炸彈", + "effect": "發射吸住對手的鋼鐵炸彈。\n攻擊必定會命中" + }, + "stoneEdge": { + "name": "尖石攻擊", + "effect": "用尖尖的岩石刺入對手進行\n攻擊。容易擊中要害" + }, + "captivate": { + "name": "誘惑", + "effect": "♂誘惑♀或♀誘惑♂,從而\n大幅降低對手的特攻" + }, + "stealthRock": { + "name": "隱形岩", + "effect": "將無數岩石懸浮在對手的周\n圍,從而對替換出場的對手\n的寶可夢給予傷害" + }, + "grassKnot": { + "name": "打草結", + "effect": "用草纏住並絆倒對手。對手\n越重,威力越大" + }, + "chatter": { + "name": "喋喋不休", + "effect": "用非常煩人的,喋喋不休的\n音波攻擊對手。使對手混亂" + }, + "judgment": { + "name": "制裁光礫", + "effect": "向對手放出無數的光彈。屬\n性會根據自己攜帶的石板不\n同而改變" + }, + "bugBite": { + "name": "蟲咬", + "effect": "咬住進行攻擊。當對手攜帶\n樹果時,可以食用並獲得其\n效果" + }, + "chargeBeam": { + "name": "充電光束", + "effect": "向對手發射電擊光束。由於\n蓄滿電流,有時會提高自己\n的特攻" + }, + "woodHammer": { + "name": "木槌", + "effect": "用堅硬的軀體撞擊對手進行\n攻擊。自己也會受到不小的\n傷害" + }, + "aquaJet": { + "name": "水流噴射", + "effect": "以迅雷不及掩耳之勢撲向對\n手。必定能夠先制攻擊" + }, + "attackOrder": { + "name": "攻擊指令", + "effect": "召喚手下,讓其朝對手發起\n攻擊。容易擊中要害" + }, + "defendOrder": { + "name": "防禦指令", + "effect": "召喚手下,讓其附在自己的\n身體上。可以提高自己的防\n御和特防" + }, + "healOrder": { + "name": "回覆指令", + "effect": "召喚手下療傷。回覆自己最\n大HP的一半" + }, + "headSmash": { + "name": "雙刃頭錘", + "effect": "拼命使出渾身力氣,向對手\n進行頭錘攻擊。自己也會受\n到非常大的傷害" + }, + "doubleHit": { + "name": "二連擊", + "effect": "使用尾巴等拍打對手進行攻\n擊。連續2次給予傷害" + }, + "roarOfTime": { + "name": "時光咆哮", + "effect": "釋放出扭曲時間般的強大力\n量攻擊對手。下一回合自己\n將無法動彈" + }, + "spacialRend": { + "name": "亞空裂斬", + "effect": "將對手連同周圍的空間一起\n撕裂並給予傷害。容易擊中\n要害" + }, + "lunarDance": { + "name": "新月舞", + "effect": "雖然自己陷入昏厥,但可以\n治癒後備上場的寶可夢的全\n部狀態" + }, + "crushGrip": { + "name": "捏碎", + "effect": "用駭人的力量捏碎對手。對\n手剩餘的HP越多,威力越\n大" + }, + "magmaStorm": { + "name": "熔岩風暴", + "effect": "將對手困在熊熊燃燒的火焰\n中,在4~5回合內進行攻\n擊" + }, + "darkVoid": { + "name": "暗黑洞", + "effect": "將對手強制拖入黑暗的世界,\n從而讓對手陷入睡眠狀態" + }, + "seedFlare": { + "name": "種子閃光", + "effect": "從身體裏產生衝擊波。有時\n會大幅降低對手的特防" + }, + "ominousWind": { + "name": "奇異之風", + "effect": "突然颳起毛骨悚然的暴風攻\n擊對手。有時會提高自己的\n全部能力" + }, + "shadowForce": { + "name": "暗影潛襲", + "effect": "第1回合消失蹤影,第2回\n合攻擊對手。即使對手正受\n保護,也能擊中" + }, + "honeClaws": { + "name": "磨爪", + "effect": "將爪子磨得更加鋒利。提高\n自己的攻擊和命中率" + }, + "wideGuard": { + "name": "廣域防守", + "effect": "在1回合內防住擊打我方全\n員的攻擊" + }, + "guardSplit": { + "name": "防守平分", + "effect": "利用超能力將自己和對手的\n防禦和特防相加,再進行平\n分" + }, + "powerSplit": { + "name": "力量平分", + "effect": "利用超能力將自己和對手的\n攻擊和特攻相加,再進行平\n分" + }, + "wonderRoom": { + "name": "奇妙空間", + "effect": "製造出離奇的空間。在5回\n合內互換所有寶可夢的防禦\n和特防" + }, + "psyshock": { + "name": "精神衝擊", + "effect": "將神奇的念波實體化攻擊對\n手。給予物理傷害" + }, + "venoshock": { + "name": "毒液衝擊", + "effect": "將特殊的毒液潑向對手。對\n處於中毒狀態的對手,威力\n會變成2倍" + }, + "autotomize": { + "name": "身體輕量化", + "effect": "削掉身體上沒用的部分。大\n幅提高自己的速度,同時體\n重也會變輕" + }, + "ragePowder": { + "name": "憤怒粉", + "effect": "將令人煩躁的粉末撒在自己\n身上,用以吸引對手的注意。\n使對手的攻擊全部指向自\n己" + }, + "telekinesis": { + "name": "意念移物", + "effect": "利用超能力使對手浮起來。\n在3回合內攻擊會變得容易\n打中對手" + }, + "magicRoom": { + "name": "魔法空間", + "effect": "製造出離奇的空間。在5回\n合內所有寶可夢攜帶道具的\n效果都會消失" + }, + "smackDown": { + "name": "擊落", + "effect": "扔石頭或炮彈,攻擊飛行的\n對手。對手會被擊落,掉到\n地面" + }, + "stormThrow": { + "name": "山嵐摔", + "effect": "向對手使出強烈的一擊。攻\n擊必定會擊中要害" + }, + "flameBurst": { + "name": "烈焰濺射", + "effect": "如果擊中,爆裂的火焰會攻\n擊到對手。爆裂出的火焰還\n會飛濺到旁邊的對手" + }, + "sludgeWave": { + "name": "污泥波", + "effect": "用污泥波攻擊自己周圍所有\n的寶可夢。有時會陷入中毒\n狀態" + }, + "quiverDance": { + "name": "蝶舞", + "effect": "輕巧地跳起神祕而又美麗的\n舞蹈。提高自己的特攻、特\n防和速度" + }, + "heavySlam": { + "name": "重磅衝撞", + "effect": "用沉重的身體撞向對手進行\n攻擊。自己比對手越重,威\n力越大" + }, + "synchronoise": { + "name": "同步干擾", + "effect": "用神奇電波對周圍所有和自\n己屬性相同的寶可夢給予傷\n害" + }, + "electroBall": { + "name": "電球", + "effect": "用電氣團撞向對手。自己比\n對手速度越快,威力越大" + }, + "soak": { + "name": "浸水", + "effect": "將大量的水潑向對手,從而\n使其變成水屬性" + }, + "flameCharge": { + "name": "蓄能焰襲", + "effect": "讓火焰覆蓋全身,攻擊對手。\n積蓄力量來提高自己的速\n度" + }, + "coil": { + "name": "盤蜷", + "effect": "盤蜷着集中精神。提高自己\n的攻擊、防禦和命中率" + }, + "lowSweep": { + "name": "下盤踢", + "effect": "以敏捷的動作瞄準對手的腳\n進行攻擊。會降低對手的速\n度" + }, + "acidSpray": { + "name": "酸液炸彈", + "effect": "噴出能溶化對手的液體進行\n攻擊。會大幅降低對手的特\n防" + }, + "foulPlay": { + "name": "欺詐", + "effect": "利用對手的力量進行攻擊。\n正和自己戰鬥的對手,其攻\n擊越高,傷害越大" + }, + "simpleBeam": { + "name": "單純光束", + "effect": "向對手發送謎之念波。接收\n到念波的對手,其特性會變\n爲單純" + }, + "entrainment": { + "name": "找夥伴", + "effect": "用神奇的節奏跳舞。使對手\n模仿自己的動作,從而將特\n性變成一樣" + }, + "afterYou": { + "name": "您先請", + "effect": "支援我方或對手的行動,使\n其緊接着此招式之後行動" + }, + "round": { + "name": "輪唱", + "effect": "用歌聲攻擊對手。大家一起\n輪唱便可以接連使出,威力\n也會提高" + }, + "echoedVoice": { + "name": "迴聲", + "effect": "用回聲攻擊對手。如果每回\n合都有寶可夢接着使用該招\n式,威力就會提高" + }, + "chipAway": { + "name": "逐步擊破", + "effect": "看準機會穩步攻擊。無視對\n手的能力變化,直接給予傷\n害" + }, + "clearSmog": { + "name": "清除之煙", + "effect": "向對手投擲特殊的泥塊進行\n攻擊。使其能力變回原點" + }, + "storedPower": { + "name": "輔助力量", + "effect": "用蓄積起來的力量攻擊對手。\n自己的能力提高得越多,\n威力就越大" + }, + "quickGuard": { + "name": "快速防守", + "effect": "守護自己和同伴,以防對手\n的先制攻擊" + }, + "allySwitch": { + "name": "交換場地", + "effect": "用神奇的力量瞬間移動,互\n換自己和同伴所在的位置。\n連續使出則容易失敗" + }, + "scald": { + "name": "熱水", + "effect": "向對手噴射煮得翻滾的開水\n進行攻擊。有時會讓對手陷\n入灼傷狀態" + }, + "shellSmash": { + "name": "破殼", + "effect": "打破外殼,降低自己的防禦\n和特防,但大幅提高攻擊、\n特攻和速度" + }, + "healPulse": { + "name": "治癒波動", + "effect": "放出治癒波動,從而回復對\n手最大HP的一半" + }, + "hex": { + "name": "禍不單行", + "effect": "接二連三地進行攻擊。對處\n於異常狀態的對手給予較大\n的傷害" + }, + "skyDrop": { + "name": "自由落體", + "effect": "第1回合將對手帶到空中,\n第2回合將其摔下進行攻擊。\n被帶到空中的對手不能動\n彈" + }, + "shiftGear": { + "name": "換檔", + "effect": "轉動齒輪,不僅提高自己的\n攻擊,還會大幅提高速度" + }, + "circleThrow": { + "name": "巴投", + "effect": "扔飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束" + }, + "incinerate": { + "name": "燒盡", + "effect": "用火焰攻擊對手。對手攜帶\n樹果等時,會燒掉,使其不\n能使用" + }, + "quash": { + "name": "延後", + "effect": "壓制對手,從而將其行動順\n序放到最後" + }, + "acrobatics": { + "name": "雜技", + "effect": "輕巧地攻擊對手。自己沒有\n攜帶道具時,會給予較大的\n傷害" + }, + "reflectType": { + "name": "鏡面屬性", + "effect": "反射對手的屬性,讓自己也\n變成一樣的屬性" + }, + "retaliate": { + "name": "報仇", + "effect": "爲倒下的同伴報仇。如果上\n一回合有同伴倒下,威力就\n會提高" + }, + "finalGambit": { + "name": "搏命", + "effect": "拼命攻擊對手。雖然自己陷\n入昏厥,但會給予對手和自\n己目前HP等量的傷害" + }, + "bestow": { + "name": "傳遞禮物", + "effect": "當對手未攜帶道具時,能夠\n將自己攜帶的道具交給對手" + }, + "inferno": { + "name": "煉獄", + "effect": "用猛烈的火焰包圍對手進行\n攻擊。讓對手陷入灼傷狀態" + }, + "waterPledge": { + "name": "水之誓約", + "effect": "用水柱進行攻擊。如果和火\n組合,威力就會提高,天空\n中會掛上彩虹" + }, + "firePledge": { + "name": "火之誓約", + "effect": "用火柱進行攻擊。如果和草\n組合,威力就會提高,周圍\n會變成火海" + }, + "grassPledge": { + "name": "草之誓約", + "effect": "用草柱進行攻擊。如果和水\n組合,威力就會提高,周圍\n會變成溼地" + }, + "voltSwitch": { + "name": "伏特替換", + "effect": "在攻擊之後急速返回,和後\n備寶可夢進行替換" + }, + "struggleBug": { + "name": "蟲之抵抗", + "effect": "抵抗並攻擊對手。會降低對\n手的特攻" + }, + "bulldoze": { + "name": "重踏", + "effect": "用力踩踏地面並攻擊自己周\n圍所有的寶可夢。會降低對\n方的速度" + }, + "frostBreath": { + "name": "冰息", + "effect": "將冰冷的氣息吹向對手進行\n攻擊。必定會擊中要害" + }, + "dragonTail": { + "name": "龍尾", + "effect": "彈飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束" + }, + "workUp": { + "name": "自我激勵", + "effect": "激勵自己,從而提高攻擊和\n特攻" + }, + "electroweb": { + "name": "電網", + "effect": "用電網捉住對手進行攻擊。\n會降低對手的速度" + }, + "wildCharge": { + "name": "瘋狂伏特", + "effect": "讓電流覆蓋全身,撞向對手\n進行攻擊。自己也會受到少\n許傷害" + }, + "drillRun": { + "name": "直衝鑽", + "effect": "像鋼鑽一樣,一邊旋轉身體\n一邊撞擊對手。容易擊中要\n害" + }, + "dualChop": { + "name": "二連劈", + "effect": "用身體堅硬的部分拍打對手\n進行攻擊。連續2次給予傷\n害" + }, + "heartStamp": { + "name": "愛心印章", + "effect": "以可愛的動作使對手疏忽,\n乘機給出強烈的一擊。有時\n會使對手畏縮" + }, + "hornLeech": { + "name": "木角", + "effect": "將角刺入,吸取對手的養分。\n可以回覆給予對手傷害的\n一半HP" + }, + "sacredSword": { + "name": "聖劍", + "effect": "用劍切斬對手進行攻擊。無\n視對手的能力變化,直接給\n予傷害" + }, + "razorShell": { + "name": "貝殼刃", + "effect": "用鋒利的貝殼切斬對手進行\n攻擊。有時會降低對手的防\n御" + }, + "heatCrash": { + "name": "高溫重壓", + "effect": "用燃燒的身體撞向對手進行\n攻擊。自己比對手越重,威\n力越大" + }, + "leafTornado": { + "name": "青草攪拌器", + "effect": "用鋒利的葉片包裹住對手進\n行攻擊。有時會降低對手的\n命中率" + }, + "steamroller": { + "name": "瘋狂滾壓", + "effect": "旋轉揉成團的身體壓扁對手。\n有時會使對手畏縮" + }, + "cottonGuard": { + "name": "棉花防守", + "effect": "用軟綿綿的絨毛包裹住自己\n的身體進行守護。巨幅提高\n自己的防禦" + }, + "nightDaze": { + "name": "暗黑爆破", + "effect": "放出黑暗的衝擊波攻擊對手。\n有時會降低對手的命中率" + }, + "psystrike": { + "name": "精神擊破", + "effect": "將神奇的念波實體化攻擊對\n手。給予物理傷害" + }, + "tailSlap": { + "name": "掃尾拍打", + "effect": "用堅硬的尾巴拍打對手進行\n攻擊。連續攻擊2~5次" + }, + "hurricane": { + "name": "暴風", + "effect": "用強烈的風席捲對手進行攻\n擊。有時會使對手混亂" + }, + "headCharge": { + "name": "爆炸頭突擊", + "effect": "用厲害的爆炸頭猛撞向對手\n進行攻擊。自己也會受到少\n許傷害" + }, + "gearGrind": { + "name": "齒輪飛盤", + "effect": "向對手投擲鋼鐵齒輪進行攻\n擊。連續2次給予傷害" + }, + "searingShot": { + "name": "火焰彈", + "effect": "用熊熊烈火攻擊自己周圍所\n有的寶可夢。有時會陷入灼\n傷狀態" + }, + "technoBlast": { + "name": "高科技光炮", + "effect": "向對手放出光彈。屬性會根\n據自己攜帶的卡帶不同而改\n變" + }, + "relicSong": { + "name": "古老之歌", + "effect": "讓對手聽古老之歌,打動對\n手的內心進行攻擊。有時會\n讓對手陷入睡眠狀態" + }, + "secretSword": { + "name": "神祕之劍", + "effect": "用長角切斬對手進行攻擊。\n角上擁有的神奇力量將給予\n物理傷害" + }, + "glaciate": { + "name": "冰封世界", + "effect": "將冰凍的冷氣吹向對手進行\n攻擊。會降低對手的速度" + }, + "boltStrike": { + "name": "雷擊", + "effect": "讓強大的電流覆蓋全身,猛\n撞向對手進行攻擊。有時會\n讓對手陷入麻痹狀態" + }, + "blueFlare": { + "name": "青焰", + "effect": "用美麗而激烈的青焰包裹住\n對手進行攻擊。有時會讓對\n手陷入灼傷狀態" + }, + "fieryDance": { + "name": "火之舞", + "effect": "讓火焰覆蓋全身,振翅攻擊\n對手。有時會提高自己的特\n攻" + }, + "freezeShock": { + "name": "冰凍伏特", + "effect": "用覆蓋着電流的冰塊,在第\n2回合撞向對手。有時會讓\n對手陷入麻痹狀態" + }, + "iceBurn": { + "name": "極寒冷焰", + "effect": "用能夠凍結一切的強烈冷氣,\n在第2回合包裹住對手。\n有時會讓對手陷入灼傷狀態" + }, + "snarl": { + "name": "大聲咆哮", + "effect": "沒完沒了地大聲斥責,從而\n降低對手的特攻" + }, + "icicleCrash": { + "name": "冰柱墜擊", + "effect": "用大冰柱激烈地撞向對手進\n行攻擊。有時會使對手畏縮" + }, + "vCreate": { + "name": "V熱焰", + "effect": "從前額產生灼熱的火焰,舍\n身撞擊對手。防禦、特防和\n速度會降低" + }, + "fusionFlare": { + "name": "交錯火焰", + "effect": "釋放出巨大的火焰。受到巨\n大的閃電影響時,招式威力\n會提高" + }, + "fusionBolt": { + "name": "交錯閃電", + "effect": "釋放出巨大的閃電。受到巨\n大的火焰影響時,招式威力\n會提高" + }, + "flyingPress": { + "name": "飛身重壓", + "effect": "從空中俯衝向對手。此招式\n同時帶有格鬥屬性和飛行屬\n性" + }, + "matBlock": { + "name": "掀榻榻米", + "effect": "將掀起來的榻榻米當作盾牌,\n防住自己和同伴免受招式\n傷害。變化招式無法防住" + }, + "belch": { + "name": "打嗝", + "effect": "朝着對手打嗝,並給予傷害。\n如果不喫樹果則無法使出" + }, + "rototiller": { + "name": "耕地", + "effect": "翻耕土地,使草木更容易成\n長。會提高草屬性寶可夢的\n攻擊和特攻" + }, + "stickyWeb": { + "name": "黏黏網", + "effect": "在對手周圍圍上黏黏的網,\n降低替換出場的對手的速度" + }, + "fellStinger": { + "name": "致命針刺", + "effect": "如果使用此招式打倒對手,\n攻擊會巨幅提高" + }, + "phantomForce": { + "name": "潛靈奇襲", + "effect": "第1回合消失在某處,第2\n回合攻擊對手。可以無視守\n護進行攻擊" + }, + "trickOrTreat": { + "name": "萬聖夜", + "effect": "邀請對手參加萬聖夜。使對\n手被追加幽靈屬性" + }, + "nobleRoar": { + "name": "戰吼", + "effect": "發出戰吼威嚇對手,從而降\n低對手的攻擊和特攻" + }, + "ionDeluge": { + "name": "等離子浴", + "effect": "將帶電粒子擴散開來,使一\n般屬性的招式變成電屬性" + }, + "parabolicCharge": { + "name": "拋物面充電", + "effect": "給周圍全體寶可夢造成傷害。\n可以回覆給予傷害的一半\nHP" + }, + "forestsCurse": { + "name": "森林咒術", + "effect": "向對手施加森林咒術。中了\n咒術的對手會被追加草屬性" + }, + "petalBlizzard": { + "name": "落英繽紛", + "effect": "猛烈地颳起飛雪般的落花,\n攻擊周圍所有的寶可夢,並\n給予傷害" + }, + "freezeDry": { + "name": "冷凍乾燥", + "effect": "急劇冷凍對手,有時會讓對\n手陷入冰凍狀態。對於水屬\n性寶可夢也是效果絕佳" + }, + "disarmingVoice": { + "name": "魅惑之聲", + "effect": "發出魅惑的叫聲,給予對手\n精神上的傷害。攻擊必定會\n命中" + }, + "partingShot": { + "name": "拋下狠話", + "effect": "拋下狠話威嚇對手,降低攻\n擊和特攻後,和後備寶可夢\n進行替換" + }, + "topsyTurvy": { + "name": "顛倒", + "effect": "顛倒對手身上的所有能力變\n化,變成和原來相反的狀態" + }, + "drainingKiss": { + "name": "吸取之吻", + "effect": "用一個吻吸取對手的HP。\n回覆給予對手傷害的一半以\n上的HP" + }, + "craftyShield": { + "name": "戲法防守", + "effect": "使用神奇的力量防住攻擊我\n方的變化招式。但無法防住\n傷害招式的攻擊" + }, + "flowerShield": { + "name": "鮮花防守", + "effect": "使用神奇的力量提高在場的\n所有草屬性寶可夢的防禦" + }, + "grassyTerrain": { + "name": "青草場地", + "effect": "在5回合內變成青草場地。\n地面上的寶可夢每回合都能\n回覆。草屬性的招式威力還\n會提高" + }, + "mistyTerrain": { + "name": "薄霧場地", + "effect": "在5回合內,地面上的寶可\n夢不會陷入異常狀態。龍屬\n性招式的傷害也會減半" + }, + "electrify": { + "name": "輸電", + "effect": "對手使出招式前,如果輸電,\n則該回合對手的招式變成\n電屬性" + }, + "playRough": { + "name": "嬉鬧", + "effect": "與對手嬉鬧並攻擊。有時會\n降低對手的攻擊" + }, + "fairyWind": { + "name": "妖精之風", + "effect": "颳起妖精之風,吹向對手進\n行攻擊" + }, + "moonblast": { + "name": "月亮之力", + "effect": "借用月亮的力量攻擊對手。\n有時會降低對手的特攻" + }, + "boomburst": { + "name": "爆音波", + "effect": "通過震耳欲聾的爆炸聲產生\n的破壞力,攻擊自己周圍所\n有的寶可夢" + }, + "fairyLock": { + "name": "妖精之鎖", + "effect": "通過封鎖,下一回合所有的\n寶可夢都無法逃走" + }, + "kingsShield": { + "name": "王者盾牌", + "effect": "防住對手攻擊的同時,自己\n變爲防禦姿態。能夠降低所\n接觸到的對手的攻擊" + }, + "playNice": { + "name": "和睦相處", + "effect": "和對手和睦相處,使其失去\n戰鬥的氣力,從而降低對手\n的攻擊" + }, + "confide": { + "name": "密語", + "effect": "和對手進行密語,使其失去\n集中力,從而降低對手的特\n攻" + }, + "diamondStorm": { + "name": "鑽石風暴", + "effect": "掀起鑽石風暴給予傷害。有\n時會大幅提高自己的防禦" + }, + "steamEruption": { + "name": "蒸汽爆炸", + "effect": "將滾燙的蒸汽噴向對手。有\n時會讓對手灼傷" + }, + "hyperspaceHole": { + "name": "異次元洞", + "effect": "通過異次元洞,突然出現在\n對手的側面進行攻擊。還可\n以無視守住和看穿等招式" + }, + "waterShuriken": { + "name": "飛水手裏劍", + "effect": "用粘液製成的手裏劍,連續\n攻擊2~5次。必定能夠先\n制攻擊" + }, + "mysticalFire": { + "name": "魔法火焰", + "effect": "從口中噴出特別灼熱的火焰\n進行攻擊。降低對手的特攻" + }, + "spikyShield": { + "name": "尖刺防守", + "effect": "防住對手攻擊的同時,削減\n接觸到自己的對手的體力" + }, + "aromaticMist": { + "name": "芳香薄霧", + "effect": "通過神奇的芳香,提高我方\n寶可夢的特防" + }, + "eerieImpulse": { + "name": "怪異電波", + "effect": "從身體放射出怪異電波,讓\n對手沐浴其中,從而大幅降\n低其特攻" + }, + "venomDrench": { + "name": "毒液陷阱", + "effect": "將特殊的毒液潑向對手。對\n處於中毒狀態的對手,其攻\n擊、特攻和速度都會降低" + }, + "powder": { + "name": "粉塵", + "effect": "如果被撒到粉塵的對手使用\n火招式,則會爆炸並給予傷\n害" + }, + "geomancy": { + "name": "大地掌控", + "effect": "第1回合吸收能量,第2回\n合大幅提高特攻、特防和速\n度" + }, + "magneticFlux": { + "name": "磁場操控", + "effect": "通過操控磁場,會提高特性\n爲正電和負電的寶可夢的防\n御和特防" + }, + "happyHour": { + "name": "歡樂時光", + "effect": "如果使用歡樂時光,戰鬥後\n得到的錢會翻倍" + }, + "electricTerrain": { + "name": "電氣場地", + "effect": "在5回合內變成電氣場地。\n地面上的寶可夢將無法入眠。\n電屬性的招式威力還會提\n高" + }, + "dazzlingGleam": { + "name": "魔法閃耀", + "effect": "向對手發射強光,並給予傷\n害" + }, + "celebrate": { + "name": "慶祝", + "effect": "寶可夢爲十分開心的你慶祝" + }, + "holdHands": { + "name": "牽手", + "effect": "我方寶可夢之間牽手。能帶\n來非常幸福的心情" + }, + "babyDollEyes": { + "name": "圓瞳", + "effect": "用圓瞳凝視對手,從而降低\n其攻擊。必定能夠先制攻擊" + }, + "nuzzle": { + "name": "蹭蹭臉頰", + "effect": "將帶電的臉頰蹭蹭對手進行\n攻擊。讓對手陷入麻痹狀態" + }, + "holdBack": { + "name": "手下留情", + "effect": "在攻擊的時候手下留情,從\n而使對手的HP至少會留下\n1HP" + }, + "infestation": { + "name": "糾纏不休", + "effect": "在4~5回合內死纏爛打地\n進行攻擊。在此期間對手將\n無法逃走" + }, + "powerUpPunch": { + "name": "增強拳", + "effect": "通過反覆擊打對手,使自己\n的拳頭慢慢變硬。打中對手\n攻擊就會提高" + }, + "oblivionWing": { + "name": "歸天之翼", + "effect": "從鎖定的對手身上吸取HP。\n回覆給予對手傷害的一半\n以上的HP" + }, + "thousandArrows": { + "name": "千箭齊發", + "effect": "可以擊中浮在空中的寶可夢。\n空中的對手被擊落後,會\n掉到地面" + }, + "thousandWaves": { + "name": "千波激盪", + "effect": "從地面掀起波浪進行攻擊。\n被掀入波浪中的對手,將無\n法從戰鬥中逃走" + }, + "landsWrath": { + "name": "大地神力", + "effect": "聚集大地的力量,將此力量\n集中攻擊對手,並給予傷害" + }, + "lightOfRuin": { + "name": "破滅之光", + "effect": "借用永恆之花的力量,發射\n出強力光線。自己也會受到\n非常大的傷害" + }, + "originPulse": { + "name": "根源波動", + "effect": "用無數青白色且閃耀的光線\n攻擊對手" + }, + "precipiceBlades": { + "name": "斷崖之劍", + "effect": "將大地的力量變化爲利刃攻\n擊對手" + }, + "dragonAscent": { + "name": "畫龍點睛", + "effect": "從天空中急速下降攻擊對手。\n自己的防禦和特防會降低" + }, + "hyperspaceFury": { + "name": "異次元猛攻", + "effect": "用許多手臂,無視對手的守\n住或看穿等招式進行連續攻\n擊,自己的防禦會降低" + }, + "breakneckBlitzPhysical": { + "name": "一般Z究極無敵大沖撞", + "effect": "通過Z力量氣勢猛烈地全力\n撞上對手。威力會根據原來\n的招式而改變" + }, + "breakneckBlitzSpecial": { + "name": "一般Z究極無敵大沖撞", + "effect": "通過Z力量氣勢猛烈地全力\n撞上對手。威力會根據原來\n的招式而改變" + }, + "allOutPummelingPhysical": { + "name": "格鬥Z全力無雙激烈拳", + "effect": "通過Z力量製造出能量彈,\n全力撞向對手。威力會根據\n原來的招式而改變" + }, + "allOutPummelingSpecial": { + "name": "格鬥Z全力無雙激烈拳", + "effect": "通過Z力量製造出能量彈,\n全力撞向對手。威力會根據\n原來的招式而改變" + }, + "supersonicSkystrikePhysical": { + "name": "飛行Z極速俯衝轟烈撞", + "effect": "通過Z力量猛烈地飛向天空,\n朝對手全力落下。威力會\n根據原來的招式而改變" + }, + "supersonicSkystrikeSpecial": { + "name": "飛行Z極速俯衝轟烈撞", + "effect": "通過Z力量猛烈地飛向天空,\n朝對手全力落下。威力會\n根據原來的招式而改變" + }, + "acidDownpourPhysical": { + "name": "毒Z強酸劇毒滅絕雨", + "effect": "通過Z力量使毒沼湧起,全\n力讓對手沉下去。威力會根\n據原來的招式而改變" + }, + "acidDownpourSpecial": { + "name": "毒Z強酸劇毒滅絕雨", + "effect": "通過Z力量使毒沼湧起,全\n力讓對手沉下去。威力會根\n據原來的招式而改變" + }, + "tectonicRagePhysical": { + "name": "地面Z地隆嘯天大終結", + "effect": "通過Z力量潛入地裏最深處,\n全力撞上對手。威力會根\n據原來的招式而改變" + }, + "tectonicRageSpecial": { + "name": "地面Z地隆嘯天大終結", + "effect": "通過Z力量潛入地裏最深處,\n全力撞上對手。威力會根\n據原來的招式而改變" + }, + "continentalCrushPhysical": { + "name": "岩石Z毀天滅地巨巖墜", + "effect": "通過Z力量召喚大大的巖山,\n全力撞向對手。威力會根\n據原來的招式而改變" + }, + "continentalCrushSpecial": { + "name": "岩石Z毀天滅地巨巖墜", + "effect": "通過Z力量召喚大大的巖山,\n全力撞向對手。威力會根\n據原來的招式而改變" + }, + "savageSpinOutPhysical": { + "name": "蟲Z絕對捕食迴旋斬", + "effect": "通過Z力量將吐出的絲線全\n力束縛對手。威力會根據原\n來的招式而改變" + }, + "savageSpinOutSpecial": { + "name": "蟲Z絕對捕食迴旋斬", + "effect": "通過Z力量將吐出的絲線全\n力束縛對手。威力會根據原\n來的招式而改變" + }, + "neverEndingNightmarePhysical": { + "name": "幽靈Z無盡暗夜之誘惑", + "effect": "通過Z力量召喚強烈的怨念,\n全力降臨到對手身上。威\n力會根據原來的招式而改變" + }, + "neverEndingNightmareSpecial": { + "name": "幽靈Z無盡暗夜之誘惑", + "effect": "通過Z力量召喚強烈的怨念,\n全力降臨到對手身上。威\n力會根據原來的招式而改變" + }, + "corkscrewCrashPhysical": { + "name": "鋼Z超絕螺旋連擊", + "effect": "通過Z力量進行高速旋轉,\n全力撞上對手。威力會根據\n原來的招式而改變" + }, + "corkscrewCrashSpecial": { + "name": "鋼Z超絕螺旋連擊", + "effect": "通過Z力量進行高速旋轉,\n全力撞上對手。威力會根據\n原來的招式而改變" + }, + "infernoOverdrivePhysical": { + "name": "火Z超強極限爆焰彈", + "effect": "通過Z力量噴出熊熊烈火,\n全力撞向對手。威力會根據\n原來的招式而改變" + }, + "infernoOverdriveSpecial": { + "name": "火Z超強極限爆焰彈", + "effect": "通過Z力量噴出熊熊烈火,\n全力撞向對手。威力會根據\n原來的招式而改變" + }, + "hydroVortexPhysical": { + "name": "水Z超級水流大漩渦", + "effect": "通過Z力量製造大大的潮旋,\n全力吞沒對手。威力會根\n據原來的招式而改變" + }, + "hydroVortexSpecial": { + "name": "水Z超級水流大漩渦", + "effect": "通過Z力量製造大大的潮旋,\n全力吞沒對手。威力會根\n據原來的招式而改變" + }, + "bloomDoomPhysical": { + "name": "草Z絢爛繽紛花怒放", + "effect": "通過Z力量藉助花草的能量,\n全力攻擊對手。威力會根\n據原來的招式而改變" + }, + "bloomDoomSpecial": { + "name": "草Z絢爛繽紛花怒放", + "effect": "通過Z力量藉助花草的能量,\n全力攻擊對手。威力會根\n據原來的招式而改變" + }, + "gigavoltHavocPhysical": { + "name": "電Z終極伏特狂雷閃", + "effect": "通過Z力量將蓄積的強大電\n流全力撞向對手。威力會根\n據原來的招式而改變" + }, + "gigavoltHavocSpecial": { + "name": "電Z終極伏特狂雷閃", + "effect": "通過Z力量將蓄積的強大電\n流全力撞向對手。威力會根\n據原來的招式而改變" + }, + "shatteredPsychePhysical": { + "name": "超能力Z至高精神破壞波", + "effect": "通過Z力量操縱對手,全力\n使其感受到痛苦。威力會根\n據原來的招式而改變" + }, + "shatteredPsycheSpecial": { + "name": "超能力Z至高精神破壞波", + "effect": "通過Z力量操縱對手,全力\n使其感受到痛苦。威力會根\n據原來的招式而改變" + }, + "subzeroSlammerPhysical": { + "name": "冰Z激狂大地萬里冰", + "effect": "通過Z力量急劇降低氣溫,\n全力冰凍對手。威力會根據\n原來的招式而改變" + }, + "subzeroSlammerSpecial": { + "name": "冰Z激狂大地萬里冰", + "effect": "通過Z力量急劇降低氣溫,\n全力冰凍對手。威力會根據\n原來的招式而改變" + }, + "devastatingDrakePhysical": { + "name": "龍Z究極巨龍震天地", + "effect": "通過Z力量將氣場實體化,\n向對手全力發動襲擊。威力\n會根據原來的招式而改變" + }, + "devastatingDrakeSpecial": { + "name": "龍Z究極巨龍震天地", + "effect": "通過Z力量將氣場實體化,\n向對手全力發動襲擊。威力\n會根據原來的招式而改變" + }, + "blackHoleEclipsePhysical": { + "name": "惡Z黑洞吞噬萬物滅", + "effect": "通過Z力量收集惡能量,全\n力將對手吸入。威力會根據\n原來的招式而改變" + }, + "blackHoleEclipseSpecial": { + "name": "惡Z黑洞吞噬萬物滅", + "effect": "通過Z力量收集惡能量,全\n力將對手吸入。威力會根據\n原來的招式而改變" + }, + "twinkleTacklePhysical": { + "name": "妖精Z可愛星星飛天撞", + "effect": "通過Z力量製造魅惑空間,\n全力捉弄對手。威力會根據\n原來的招式而改變" + }, + "twinkleTackleSpecial": { + "name": "妖精Z可愛星星飛天撞", + "effect": "通過Z力量製造魅惑空間,\n全力捉弄對手。威力會根據\n原來的招式而改變" + }, + "catastropika": { + "name": "皮卡丘Z皮卡皮卡必殺擊", + "effect": "通過Z力量,皮卡丘全身覆\n蓋最強電力,全力猛撲對手" + }, + "shoreUp": { + "name": "集沙", + "effect": "回覆自己最大HP的一半。\n在沙暴中回覆得更多" + }, + "firstImpression": { + "name": "迎頭一擊", + "effect": "威力很高的招式,但只有在\n出場戰鬥時,立刻使出才能\n成功" + }, + "banefulBunker": { + "name": "碉堡", + "effect": "防住對手攻擊的同時,讓接\n觸到自己的對手中毒" + }, + "spiritShackle": { + "name": "縫影", + "effect": "攻擊的同時,縫住對手的影\n子,使其無法逃走" + }, + "darkestLariat": { + "name": "DD金勾臂", + "effect": "旋轉雙臂打向對手。無視對\n手的能力變化,直接給予傷\n害" + }, + "sparklingAria": { + "name": "泡影的詠歎調", + "effect": "隨着唱歌會放出很多氣球。\n受到此招式攻擊時,灼傷會\n被治癒" + }, + "iceHammer": { + "name": "冰錘", + "effect": "揮舞強力而沉重的拳頭,給\n予對手傷害。自己的速度會\n降低" + }, + "floralHealing": { + "name": "花療", + "effect": "回覆對手最大HP的一半。\n在青草場地時,效果會提高" + }, + "highHorsepower": { + "name": "十萬馬力", + "effect": "使出全身力量,猛攻對手" + }, + "strengthSap": { + "name": "吸取力量", + "effect": "給自己回覆和對手攻擊力相\n同數值的HP,然後降低對\n手的攻擊" + }, + "solarBlade": { + "name": "日光刃", + "effect": "第1回合收集滿滿的日光,\n第2回合將此力量集中在劍\n上進行攻擊" + }, + "leafage": { + "name": "樹葉", + "effect": "將葉片打向對手,進行攻擊" + }, + "spotlight": { + "name": "聚光燈", + "effect": "給寶可夢打上聚光燈,該回\n合只能瞄準該寶可夢" + }, + "toxicThread": { + "name": "毒絲", + "effect": "將混有毒的絲吐向對手。使\n其中毒,從而降低對手的速\n度" + }, + "laserFocus": { + "name": "磨礪", + "effect": "集中精神,下次攻擊必定會\n擊中要害" + }, + "gearUp": { + "name": "輔助齒輪", + "effect": "啓動齒輪,提高特性爲正電\n和負電的寶可夢的攻擊和特\n攻" + }, + "throatChop": { + "name": "深淵突刺", + "effect": "受到此招式攻擊的對手,會\n因爲地獄般的痛苦,在2回\n合內,變得無法使出聲音類\n招式" + }, + "pollenPuff": { + "name": "花粉團", + "effect": "對敵人使用是會爆炸的糰子。\n對我方使用則是給予回覆\n的糰子" + }, + "anchorShot": { + "name": "擲錨", + "effect": "將錨纏住對手進行攻擊。使\n對手無法逃走" + }, + "psychicTerrain": { + "name": "精神場地", + "effect": "在5回合內,地面上的寶可\n夢不會受到先制招式的攻擊。\n超能力屬性的招式威力會\n提高" + }, + "lunge": { + "name": "猛撲", + "effect": "全力猛撲對手進行攻擊。從\n而降低對手的攻擊" + }, + "fireLash": { + "name": "火焰鞭", + "effect": "用燃燒的鞭子抽打對手。受\n到攻擊的對手防禦會降低" + }, + "powerTrip": { + "name": "囂張", + "effect": "耀武揚威地攻擊對手,自己\n的能力提高得越多,威力就\n越大" + }, + "burnUp": { + "name": "燃盡", + "effect": "將自己全身燃燒起火焰來,\n給予對手大大的傷害。自己\n的火屬性將會消失" + }, + "speedSwap": { + "name": "速度互換", + "effect": "將對手和自己的速度進行互\n換" + }, + "smartStrike": { + "name": "修長之角", + "effect": "用尖尖的角刺入對手進行攻\n擊。攻擊必定會命中" + }, + "purify": { + "name": "淨化", + "effect": "治癒對手的異常狀態。治癒\n後可以回覆自己的HP" + }, + "revelationDance": { + "name": "覺醒之舞", + "effect": "全力跳舞進行攻擊。此招式\n的屬性將變得和自己的屬性\n相同" + }, + "coreEnforcer": { + "name": "核心懲罰者", + "effect": "如果給予過傷害的對手已經\n結束行動,其特性就會被消\n除" + }, + "tropKick": { + "name": "熱帶踢", + "effect": "向對手使出來自南國的火熱\n腳踢。從而降低對手的攻擊" + }, + "instruct": { + "name": "號令", + "effect": "向對手下達指示,讓其再次\n使出剛纔的招式" + }, + "beakBlast": { + "name": "鳥嘴加農炮", + "effect": "先加熱鳥嘴後再進行攻擊。\n鳥嘴在加熱時對手觸碰的話,\n就會使其灼傷" + }, + "clangingScales": { + "name": "鱗片噪音", + "effect": "摩擦全身鱗片,發出響亮的\n聲音進行攻擊。攻擊後自己\n的防禦會降低" + }, + "dragonHammer": { + "name": "龍錘", + "effect": "將身體當作錘子,向對手發\n動襲擊,給予傷害" + }, + "brutalSwing": { + "name": "狂舞揮打", + "effect": "用自己的身體狂舞揮打,給\n予對手傷害" + }, + "auroraVeil": { + "name": "極光幕", + "effect": "在5回合內減弱物理和特殊\n的傷害。只有下雪時才能使\n出" + }, + "sinisterArrowRaid": { + "name": "狙射樹梟Z遮天蔽日暗影箭", + "effect": "通過Z力量製造出無數箭的\n狙射樹梟將全力射穿對手進\n行攻擊" + }, + "maliciousMoonsault": { + "name": "熾焰咆哮虎Z極惡飛躍粉碎擊", + "effect": "通過Z力量得到強壯肉體的\n熾焰咆哮虎將全力撞向對手\n進行攻擊" + }, + "oceanicOperetta": { + "name": "西獅海壬Z海神莊嚴交響樂", + "effect": "通過Z力量召喚大量水的西\n獅海壬將全力攻擊對手" + }, + "guardianOfAlola": { + "name": "卡璞Z巨人衛士・阿羅拉", + "effect": "通過Z力量得到阿羅拉之力\n的土地神寶可夢將全力進行\n攻擊。對手的剩餘HP會減\n少很多" + }, + "soulStealing7StarStrike": { + "name": "瑪夏多Z七星奪魂腿", + "effect": "得到Z力量的瑪夏多將全力\n使出拳頭和腳踢的連續招式\n叩打對手" + }, + "stokedSparksurfer": { + "name": "阿羅雷Z駕雷馭電戲衝浪", + "effect": "得到Z力量的阿羅拉地區的\n雷丘將全力進行攻擊。從而\n讓對手陷入麻痹狀態" + }, + "pulverizingPancake": { + "name": "卡比獸Z認真起來大爆擊", + "effect": "通過Z力量使得認真起來的\n卡比獸躍動巨大身軀,全力\n向對手發動襲擊" + }, + "extremeEvoboost": { + "name": "伊布Z九彩昇華齊聚頂", + "effect": "得到Z力量的伊布將藉助進\n化後夥伴們的力量,大幅提\n高能力" + }, + "genesisSupernova": { + "name": "夢幻Z起源超新星大爆炸", + "effect": "得到Z力量的夢幻將全力攻\n擊對手。腳下會變成精神場\n地" + }, + "shellTrap": { + "name": "陷阱甲殼", + "effect": "設下甲殼陷阱。如果對手使\n出物理招式,陷阱就會爆炸\n並給予對手傷害" + }, + "fleurCannon": { + "name": "花朵加農炮", + "effect": "放出強力光束後,自己的特\n攻會大幅降低" + }, + "psychicFangs": { + "name": "精神之牙", + "effect": "利用精神力量咬住對手進行\n攻擊。還可以破壞光牆和反\n射壁等" + }, + "stompingTantrum": { + "name": "跺腳", + "effect": "化悔恨爲力量進行攻擊。如\n果上一回合招式沒有打中,\n威力就會翻倍" + }, + "shadowBone": { + "name": "暗影之骨", + "effect": "用附有靈魂的骨頭毆打對手\n進行攻擊。有時會降低對手\n的防禦" + }, + "accelerock": { + "name": "衝巖", + "effect": "迅速撞向對手進行攻擊。必\n定能夠先制攻擊" + }, + "liquidation": { + "name": "水流裂破", + "effect": "用水之力量撞向對手進行攻\n擊。有時會降低對手的防禦" + }, + "prismaticLaser": { + "name": "棱鏡鐳射", + "effect": "用棱鏡的力量發射強烈光線。\n下一回合自己將無法動彈" + }, + "spectralThief": { + "name": "暗影偷盜", + "effect": "潛入對手的影子進行攻擊。\n會奪取對手的能力提升" + }, + "sunsteelStrike": { + "name": "流星閃衝", + "effect": "以流星般的氣勢猛撞對手。\n可以無視對手的特性進行攻\n擊" + }, + "moongeistBeam": { + "name": "暗影之光", + "effect": "放出奇怪的光線攻擊對手。\n可以無視對手的特性進行攻\n擊" + }, + "tearfulLook": { + "name": "淚眼汪汪", + "effect": "變得淚眼汪汪,讓對手喪失\n鬥志。從而降低對手的攻擊\n和特攻" + }, + "zingZap": { + "name": "麻麻刺刺", + "effect": "撞向對手,併發出強電,使\n其感到麻麻刺刺的。有時會\n使對手畏縮" + }, + "naturesMadness": { + "name": "自然之怒", + "effect": "向對手釋放自然之怒。對手\n的HP會減半" + }, + "multiAttack": { + "name": "多屬性攻擊", + "effect": "一邊覆蓋高能量,一邊撞向\n對手進行攻擊。根據存儲碟\n不同,屬性會改變" + }, + "tenMillionVoltThunderbolt": { + "name": "智皮卡Z千萬伏特", + "effect": "戴着帽子的皮卡丘將通過Z\n力量增強的電擊全力釋放給\n對手。容易擊中要害" + }, + "mindBlown": { + "name": "驚爆大頭", + "effect": "讓自己的頭爆炸,來攻擊周\n圍的一切。自己也會受到傷\n害" + }, + "plasmaFists": { + "name": "等離子閃電拳", + "effect": "用覆蓋着電流的拳頭進行攻\n擊。使一般屬性的招式變成\n電屬性" + }, + "photonGeyser": { + "name": "光子噴湧", + "effect": "用光柱來進行攻擊。比較自\n己的攻擊和特攻,用數值相\n對較高的一項給予對方傷害" + }, + "lightThatBurnsTheSky": { + "name": "究極奈克洛Z焚天滅世熾光爆", + "effect": "奈克洛茲瑪會無視對手的特\n性效果,在攻擊和特攻之間,\n用數值相對較高的一項給\n予對方傷害" + }, + "searingSunrazeSmash": { + "name": "索爾迦雷歐Z日光迴旋下蒼穹", + "effect": "得到Z力量的索爾迦雷歐將\n全力進行攻擊。可以無視對\n手的特性效果" + }, + "menacingMoonrazeMaelstrom": { + "name": "露奈雅拉Z月華飛濺落靈霄", + "effect": "得到Z力量的露奈雅拉將全\n力進行攻擊。可以無視對手\n的特性效果" + }, + "letsSnuggleForever": { + "name": "謎擬丘Z親密無間大亂揍", + "effect": "得到Z力量的謎擬Q將全力\n進行亂揍攻擊" + }, + "splinteredStormshards": { + "name": "鬃巖狼人Z狼嘯石牙颶風暴", + "effect": "得到Z力量的鬃巖狼人將全\n力進行攻擊。而且會消除場\n地狀態" + }, + "clangorousSoulblaze": { + "name": "杖尾鱗甲龍Z熾魂熱舞烈音爆", + "effect": "得到Z力量的杖尾鱗甲龍將\n全力攻擊對手。並且自己的\n能力會提高" + }, + "zippyZap": { + "name": "電電加速", + "effect": "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness." + }, + "splishySplash": { + "name": "滔滔衝浪", + "effect": "往巨浪中注入電能後衝撞對\n手進行攻擊。有時會讓對手\n陷入麻痹狀態" + }, + "floatyFall": { + "name": "飄飄墜落", + "effect": "輕飄飄地浮起來後,再猛地\n俯衝下去進行攻擊。有時會\n使對手畏縮" + }, + "pikaPapow": { + "name": "閃閃雷光", + "effect": "皮卡丘越喜歡訓練家,電擊\n的威力就越強。攻擊必定會\n命中" + }, + "bouncyBubble": { + "name": "活活氣泡", + "effect": "投擲水球進行攻擊。吸水後\n能回覆等同於造成的傷害\n的HP" + }, + "buzzyBuzz": { + "name": "麻麻電擊", + "effect": "放出電擊攻擊對手。讓對手\n陷入麻痹狀態" + }, + "sizzlySlide": { + "name": "熊熊火爆", + "effect": "用燃起大火的身體猛烈地衝\n撞對手。讓對手陷入灼傷狀\n態" + }, + "glitzyGlow": { + "name": "嘩嘩氣場", + "effect": "利用念力強攻,粉碎對方信\n心。製造一道能減弱對手特\n殊攻擊的神奇牆壁" + }, + "baddyBad": { + "name": "壞壞領域", + "effect": "惡行惡相地進行攻擊。製造\n一道能減弱對手物理攻擊的\n神奇牆壁" + }, + "sappySeed": { + "name": "茁茁炸彈", + "effect": "長出巨大的藤蔓,播撒種子\n進行攻擊。種子每回合都會\n吸取對手的HP" + }, + "freezyFrost": { + "name": "冰冰霜凍", + "effect": "利用冰冷的黑霧結晶進行攻\n擊。使全體寶可夢的能力變\n回原點" + }, + "sparklySwirl": { + "name": "亮亮風暴", + "effect": "利用芬芳刺鼻的龍捲風吞噬\n對方。能治癒我方寶可夢的\n異常狀態" + }, + "veeveeVolley": { + "name": "砰砰擊破", + "effect": "伊布越喜歡訓練家,衝撞的\n威力就越強。攻擊必定會命\n中" + }, + "doubleIronBash": { + "name": "鋼拳雙擊", + "effect": "以胸口的螺帽爲中心旋轉,\n並連續2次揮動手臂打擊對\n手。有時會使對手畏縮" + }, + "maxGuard": { + "name": "極巨防壁", + "effect": "完全抵擋對手的攻擊。連續\n使出則容易失敗" + }, + "dynamaxCannon": { + "name": "極巨炮", + "effect": "將凝縮在體內的能量從核心放出進行攻擊,\n對手等級比當前波次的等級上限越高,造成的傷害越高,最多兩倍。" + }, + "snipeShot": { + "name": "狙擊", + "effect": "能無視具有吸引對手招式效\n果的特性或招式的影響。可\n以向選定的對手進行攻擊" + }, + "jawLock": { + "name": "緊咬不放", + "effect": "使雙方直到一方昏厥爲止無\n法替換寶可夢。其中一方退\n場則可以解除效果" + }, + "stuffCheeks": { + "name": "大快朵頤", + "effect": "喫掉攜帶的樹果,大幅提高\n防禦" + }, + "noRetreat": { + "name": "背水一戰", + "effect": "提高自己的所有能力,但無\n法替換或逃走" + }, + "tarShot": { + "name": "瀝青射擊", + "effect": "潑灑黏糊糊的瀝青,降低對\n手的速度。火屬性會變成對\n手的弱點" + }, + "magicPowder": { + "name": "魔法粉", + "effect": "向對手噴灑魔法粉,使對手\n變爲超能力屬性" + }, + "dragonDarts": { + "name": "龍箭", + "effect": "讓多龍梅西亞進行2次攻擊。\n如果對手有2隻寶可夢,\n則對它們各進行1次攻擊" + }, + "teatime": { + "name": "茶會", + "effect": "舉辦一場茶會,場上的所有\n寶可夢都會喫掉自己攜帶的\n樹果" + }, + "octolock": { + "name": "蛸固", + "effect": "讓對手無法逃走。對手被固\n定後,每回合都會降低防禦\n和特防" + }, + "boltBeak": { + "name": "電喙", + "effect": "用帶電的喙啄刺對手。如果\n比對手先出手攻擊,招式的\n威力會變成2倍" + }, + "fishiousRend": { + "name": "鰓咬", + "effect": "用堅硬的腮咬住對手。如果\n比對手先出手攻擊,招式的\n威力會變成2倍" + }, + "courtChange": { + "name": "換場", + "effect": "用神奇的力量交換雙方的場\n地效果" + }, + "maxFlare": { + "name": "極巨火爆", + "effect": "極巨化寶可夢使出的火屬性\n攻擊。可在5回合內讓日照\n變得強烈" + }, + "maxFlutterby": { + "name": "極巨蟲蠱", + "effect": "極巨化寶可夢使出的蟲屬性\n攻擊。會降低對手的特攻" + }, + "maxLightning": { + "name": "極巨閃電", + "effect": "極巨化寶可夢使出的電屬性\n攻擊。可在5回合內將腳下\n變成電氣場地" + }, + "maxStrike": { + "name": "極巨攻擊", + "effect": "極巨化寶可夢使出的一般屬\n性攻擊。會降低對手的速度" + }, + "maxKnuckle": { + "name": "極巨拳鬥", + "effect": "極巨化寶可夢使出的格鬥屬\n性攻擊。會提高我方的攻擊" + }, + "maxPhantasm": { + "name": "極巨幽魂", + "effect": "極巨化寶可夢使出的幽靈屬\n性攻擊。會降低對手的防禦" + }, + "maxHailstorm": { + "name": "極巨寒冰", + "effect": "極巨化寶可夢使出的冰屬性\n攻擊。在5回合內會下雪" + }, + "maxOoze": { + "name": "極巨酸毒", + "effect": "極巨化寶可夢使出的毒屬性\n攻擊。會提高我方的特攻" + }, + "maxGeyser": { + "name": "極巨水流", + "effect": "極巨化寶可夢使出的水屬性\n攻擊。可在5回合內降下大\n雨" + }, + "maxAirstream": { + "name": "極巨飛衝", + "effect": "極巨化寶可夢使出的飛行屬\n性攻擊。會提高我方的速度" + }, + "maxStarfall": { + "name": "極巨妖精", + "effect": "極巨化寶可夢使出的妖精屬\n性攻擊。可在5回合內將腳\n下變成薄霧場地" + }, + "maxWyrmwind": { + "name": "極巨龍騎", + "effect": "極巨化寶可夢使出的龍屬性\n攻擊。會降低對手的攻擊" + }, + "maxMindstorm": { + "name": "極巨超能", + "effect": "極巨化寶可夢使出的超能力\n屬性攻擊。可在5回合內將\n腳下變成精神場地" + }, + "maxRockfall": { + "name": "極巨岩石", + "effect": "極巨化寶可夢使出的岩石屬\n性攻擊。可在5回合內捲起\n沙暴" + }, + "maxQuake": { + "name": "極巨大地", + "effect": "極巨化寶可夢使出的地面屬\n性攻擊。會提高我方的特防" + }, + "maxDarkness": { + "name": "極巨惡霸", + "effect": "極巨化寶可夢使出的惡屬性\n攻擊。會降低對手的特防" + }, + "maxOvergrowth": { + "name": "極巨草原", + "effect": "極巨化寶可夢使出的草屬性\n攻擊。可在5回合內將腳下\n變成青草場地" + }, + "maxSteelspike": { + "name": "極巨鋼鐵", + "effect": "極巨化寶可夢使出的鋼屬性\n攻擊。會提高我方的防禦" + }, + "clangorousSoul": { + "name": "魂舞烈音爆", + "effect": "削減少許自己的HP,使所\n有能力都提高" + }, + "bodyPress": { + "name": "撲擊", + "effect": "用身體撞向對手進行攻擊。\n防禦越高,給予的傷害就越\n高" + }, + "decorate": { + "name": "裝飾", + "effect": "通過裝飾,大幅提高對方的\n攻擊和特攻" + }, + "drumBeating": { + "name": "鼓擊", + "effect": "用鼓點來控制鼓的根部進行\n攻擊,從而降低對手的速度" + }, + "snapTrap": { + "name": "捕獸夾", + "effect": "使用捕獸夾,在4~5回合\n內,夾住對手進行攻擊" + }, + "pyroBall": { + "name": "火焰球", + "effect": "點燃小石子,形成火球攻擊\n對手。有時會使對手陷入灼\n傷狀態" + }, + "behemothBlade": { + "name": "巨獸斬", + "effect": "以全身力氣舉起強大的劍,\n猛烈地劈向對手進行攻擊" + }, + "behemothBash": { + "name": "巨獸彈", + "effect": "將全身變化爲堅固的盾,猛\n烈地撞向對手進行攻擊" + }, + "auraWheel": { + "name": "氣場輪", + "effect": "用儲存在頰囊裏的能量進行\n攻擊,並提高自己的速度。\n其屬性會隨着莫魯貝可的樣\n子而改變" + }, + "breakingSwipe": { + "name": "廣域破壞", + "effect": "用堅韌的尾巴猛掃對手進行\n攻擊,從而降低對手的攻擊" + }, + "branchPoke": { + "name": "木枝突刺", + "effect": "使用尖銳的樹枝刺向對手進\n行攻擊" + }, + "overdrive": { + "name": "破音", + "effect": "奏響吉他和貝斯,釋放出發\n出巨響的劇烈震動攻擊對手" + }, + "appleAcid": { + "name": "蘋果酸", + "effect": "使用從酸蘋果中提取出來的\n酸性液體進行攻擊。降低對\n手的特防" + }, + "gravApple": { + "name": "萬有引力", + "effect": "從高處落下蘋果,給予對手\n傷害。可降低對手的防禦" + }, + "spiritBreak": { + "name": "靈魂衝擊", + "effect": "用足以讓對手一蹶不振的氣\n勢進行攻擊。會降低對手的\n特攻" + }, + "strangeSteam": { + "name": "神奇蒸汽", + "effect": "噴出煙霧攻擊對手。有時會\n使對手混亂" + }, + "lifeDew": { + "name": "生命水滴", + "effect": "噴灑出神奇的水,回覆自己\n和場上同伴的HP" + }, + "obstruct": { + "name": "攔堵", + "effect": "完全抵擋對手的攻擊。連續\n使出則容易失敗。一旦觸碰,\n防禦就會大幅降低" + }, + "falseSurrender": { + "name": "假跪真撞", + "effect": "裝作低頭認錯的樣子,用凌\n亂的頭髮進行突刺。攻擊必\n定會命中" + }, + "meteorAssault": { + "name": "流星突擊", + "effect": "大力揮舞粗壯的莖進行攻擊。\n但同時自己也會被晃暈,\n下一回合自己將無法動彈" + }, + "eternabeam": { + "name": "無極光束", + "effect": "無極汰那變回原來的樣子後,\n發動的最強攻擊。下一回\n合自己將無法動彈" + }, + "steelBeam": { + "name": "鐵蹄光線", + "effect": "將從全身聚集的鋼鐵化爲光\n束,激烈地發射出去。自己\n也會受到傷害" + }, + "expandingForce": { + "name": "廣域戰力", + "effect": "利用精神力量攻擊對手。在\n精神場地上威力會有所提高,\n能對所有對手造成傷害" + }, + "steelRoller": { + "name": "鐵滾輪", + "effect": "在破壞場地的同時攻擊對手。\n如果腳下沒有任何場地狀\n態存在,使出此招式時便會\n失敗" + }, + "scaleShot": { + "name": "鱗射", + "effect": "發射鱗片進行攻擊。連續攻\n擊2~5次。速度會提高但\n防禦會降低" + }, + "meteorBeam": { + "name": "流星光束", + "effect": "第1回合聚集宇宙之力提高\n特攻,第2回合攻擊對手" + }, + "shellSideArm": { + "name": "臂貝武器", + "effect": "從物理攻擊和特殊攻擊中選\n擇可造成較多傷害的方式進\n行攻擊。有時會讓對手陷入\n中毒狀態" + }, + "mistyExplosion": { + "name": "薄霧炸裂", + "effect": "對自己周圍的所有寶可夢進\n行攻擊,但使出後,自己會\n陷入昏厥。在薄霧場地上,\n招式威力會提高" + }, + "grassyGlide": { + "name": "青草滑梯", + "effect": "彷彿在地面上滑行般地攻擊\n對手。在青草場地上,必定\n能夠先制攻擊" + }, + "risingVoltage": { + "name": "電力上升", + "effect": "用從地面升騰而起的電擊進\n行攻擊。當對手處於電氣場\n地上時,招式威力會變成2\n倍" + }, + "terrainPulse": { + "name": "大地波動", + "effect": "藉助場地的力量進行攻擊。\n視使出招式時場地狀態不同,\n招式的屬性和威力會有所\n變化" + }, + "skitterSmack": { + "name": "爬擊", + "effect": "從對手背後爬近後進行攻擊。\n會降低對手的特攻" + }, + "burningJealousy": { + "name": "妒火", + "effect": "用嫉妒的能量攻擊對手。會\n讓在該回合內能力有所提高\n的寶可夢陷入灼傷狀態" + }, + "lashOut": { + "name": "泄憤", + "effect": "攻擊對手以發泄對其感到的\n惱怒情緒。如果在該回合內\n自身能力遭到降低,招式的\n威力會變成2倍" + }, + "poltergeist": { + "name": "靈騷", + "effect": "操縱對手的持有物進行攻擊。\n當對手沒有攜帶道具時,\n使出此招式時便會失敗" + }, + "corrosiveGas": { + "name": "腐蝕氣體", + "effect": "用具有強酸性的氣體包裹住\n自己周圍所有的寶可夢,並\n融化其所攜帶的道具" + }, + "coaching": { + "name": "指導", + "effect": "通過進行正確合理的指導,\n提高我方全員的攻擊和防禦" + }, + "flipTurn": { + "name": "快速折返", + "effect": "在攻擊之後急速返回,和後\n備寶可夢進行替換" + }, + "tripleAxel": { + "name": "三旋擊", + "effect": "連續3次踢對手進行攻擊。\n每踢中一次,威力就會提高" + }, + "dualWingbeat": { + "name": "雙翼", + "effect": "將翅膀撞向對手進行攻擊。\n連續2次給予傷害" + }, + "scorchingSands": { + "name": "熱沙大地", + "effect": "將滾燙的沙子砸向對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態" + }, + "jungleHealing": { + "name": "叢林治療", + "effect": "與叢林融爲一體,回覆自己\n和場上同伴的HP和狀態" + }, + "wickedBlow": { + "name": "闇冥強擊", + "effect": "將惡之流派修煉至大成的猛\n烈一擊。必定會擊中要害" + }, + "surgingStrikes": { + "name": "水流連打", + "effect": "將水之流派修煉至大成的仿\n若行雲流水般的3次連擊。\n必定會擊中要害" + }, + "thunderCage": { + "name": "雷電囚籠", + "effect": "將對手困在電流四濺的囚籠\n中,在4~5回合內進行攻\n擊" + }, + "dragonEnergy": { + "name": "巨龍威能", + "effect": "把生命力轉換爲力量攻擊對\n手。自己的HP越少,招式\n的威力越小" + }, + "freezingGlare": { + "name": "冰冷視線", + "effect": "從雙眼發射精神力量進行攻\n擊。有時會讓對手陷入冰凍\n狀態" + }, + "fieryWrath": { + "name": "怒火中燒", + "effect": "將憤怒轉化爲火焰般的氣場\n進行攻擊。有時會使對手畏\n縮" + }, + "thunderousKick": { + "name": "雷鳴蹴擊", + "effect": "以雷電般的動作戲耍對手的\n同時使出腳踢。可降低對手\n的防禦" + }, + "glacialLance": { + "name": "雪矛", + "effect": "向對手投擲掀起暴風雪的冰\n矛進行攻擊" + }, + "astralBarrage": { + "name": "星碎", + "effect": "用大量的小靈體向對手發起\n攻擊" + }, + "eerieSpell": { + "name": "詭異咒語", + "effect": "用強大的精神力量攻擊。讓\n對手最後使用的招式減少3\nPP" + }, + "direClaw": { + "name": "克命爪", + "effect": "以破滅之爪進行攻擊。有時\n還會讓對手陷入中毒、麻痹\n、睡眠之中的一種狀態" + }, + "psyshieldBash": { + "name": "屏障猛攻", + "effect": "讓意念的能量覆蓋全身,撞\n向對手進行攻擊。會提高自\n己的防禦" + }, + "powerShift": { + "name": "力量轉換", + "effect": "將自己的攻擊與防禦互相交\n換" + }, + "stoneAxe": { + "name": "巖斧", + "effect": "用岩石之斧進行攻擊。散落\n的岩石碎片會飄浮在對手周\n圍" + }, + "springtideStorm": { + "name": "陽春風暴", + "effect": "用交織着愛與恨的烈風席捲\n對手進行攻擊。有時會降低\n對手的攻擊" + }, + "mysticalPower": { + "name": "神祕之力", + "effect": "放出不可思議的力量攻擊。\n會提高自己的特攻" + }, + "ragingFury": { + "name": "大憤慨", + "effect": "在2~3回合內,一邊放出\n火焰,一邊瘋狂亂打。大鬧\n一番後自己會陷入混亂" + }, + "waveCrash": { + "name": "波動衝", + "effect": "讓水覆蓋全身後撞向對手。\n自己也會受到不少傷害" + }, + "chloroblast": { + "name": "葉綠爆震", + "effect": "將自己的葉綠素凝聚起來後\n放出去進行攻擊。自己也會\n受到傷害" + }, + "mountainGale": { + "name": "冰山風", + "effect": "將冰山般巨大的冰塊砸向對\n手進行攻擊。有時會使對手\n畏縮" + }, + "victoryDance": { + "name": "勝利之舞", + "effect": "激烈地跳起喚來勝利的舞蹈,\n提高自己的攻擊、防禦和\n速度" + }, + "headlongRush": { + "name": "突飛猛撲", + "effect": "向對手使出灌注了全心全力\n的撞擊。自己的防禦和特防\n會降低" + }, + "barbBarrage": { + "name": "毒千針", + "effect": "用無數的毒針進行攻擊。有\n時還會讓對手陷入中毒狀態。\n攻擊處於中毒狀態的對手\n時,威力會變成2倍" + }, + "esperWing": { + "name": "氣場之翼", + "effect": "用經過氣場強化的翅膀撕裂\n對手。容易擊中要害。會提\n高自己的速度" + }, + "bitterMalice": { + "name": "冤冤相報", + "effect": "用令人毛骨悚然的怨念進行\n攻擊。會降低對手的攻擊" + }, + "shelter": { + "name": "閉關", + "effect": "將皮膚變得堅硬如鐵盾,從\n而大幅提高自己的防禦" + }, + "tripleArrows": { + "name": "三連箭", + "effect": "使出一記腿技後同時發射3\n箭。有時會降低對手的防禦\n或使對手畏縮。容易擊中要\n害" + }, + "infernalParade": { + "name": "羣魔亂舞", + "effect": "用無數的火球進行攻擊。有\n時會讓對手陷入灼傷狀態。\n攻擊處於異常狀態的對手時,\n威力會變成2倍" + }, + "ceaselessEdge": { + "name": "祕劍・千重濤", + "effect": "用貝殼之劍進行攻擊。散落\n的貝殼碎片會散落在對手腳\n下成爲撒菱" + }, + "bleakwindStorm": { + "name": "枯葉風暴", + "effect": "用足以讓身心都止不住顫抖\n的冰冷狂風進行攻擊。有時\n會降低對手的速度" + }, + "wildboltStorm": { + "name": "鳴雷風暴", + "effect": "呼喚雷雲引起風暴,用雷與\n風進行激烈的攻擊。有時會\n讓對手陷入麻痹狀態" + }, + "sandsearStorm": { + "name": "熱沙風暴", + "effect": "用灼熱的沙子和強烈的風席\n卷對手進行攻擊。有時會讓\n對手陷入灼傷狀態" + }, + "lunarBlessing": { + "name": "新月祈禱", + "effect": "向新月獻上祈禱,回覆自己\n和場上同伴的HP和狀態" + }, + "takeHeart": { + "name": "勇氣填充", + "effect": "鼓起衝勁,治癒自己的異常\n狀態,同時提高自己的特攻\n和特防" + }, + "gMaxWildfire": { + "name": "超極巨深淵滅焰", + "effect": "超極巨化的噴火龍使出的火\n屬性攻擊。可在4回合內給\n予對手傷害" + }, + "gMaxBefuddle": { + "name": "超極巨蝶影蠱惑", + "effect": "超極巨化的巴大蝶使出的蟲\n屬性攻擊。會讓對手陷入中\n毒、麻痹或睡眠狀態" + }, + "gMaxVoltCrash": { + "name": "超極鉅萬雷轟頂", + "effect": "超極巨化的皮卡丘使出的電\n屬性攻擊。會讓對手陷入麻\n痹狀態" + }, + "gMaxGoldRush": { + "name": "超極巨特大金幣", + "effect": "超極巨化的喵喵使出的一般\n屬性攻擊。會讓對手陷入混\n亂狀態,並可獲得金錢" + }, + "gMaxChiStrike": { + "name": "超極巨會心一擊", + "effect": "超極巨化的怪力使出的格鬥\n屬性攻擊。會變得容易擊中\n要害" + }, + "gMaxTerror": { + "name": "超極巨幻影幽魂", + "effect": "超極巨化的耿鬼使出的幽靈\n屬性攻擊。會踩住對手的影\n子,讓其無法被替換" + }, + "gMaxResonance": { + "name": "超極巨極光旋律", + "effect": "超極巨化的拉普拉斯使出的\n冰屬性攻擊。可在5回合內\n減弱受到的傷害" + }, + "gMaxCuddle": { + "name": "超極巨熱情擁抱", + "effect": "超極巨化的伊布使出的一般\n屬性攻擊。會讓對手陷入着\n迷狀態" + }, + "gMaxReplenish": { + "name": "超極巨資源再生", + "effect": "超極巨化的卡比獸使出的一\n般屬性攻擊。會讓喫掉的樹\n果再生" + }, + "gMaxMalodor": { + "name": "超極巨臭氣沖天", + "effect": "超極巨化的灰塵山使出的毒\n屬性攻擊。會讓對手陷入中\n毒狀態" + }, + "gMaxStonesurge": { + "name": "超極巨巖陣以待", + "effect": "超極巨化的暴噬龜使出的水\n屬性攻擊。會發射無數銳利\n的岩石" + }, + "gMaxWindRage": { + "name": "超極巨旋風襲捲", + "effect": "超極巨化的鋼鎧鴉使出的飛\n行屬性攻擊。可消除反射壁\n和光牆" + }, + "gMaxStunShock": { + "name": "超極巨異毒電場", + "effect": "超極巨化的顫弦蠑螈使出的\n電屬性攻擊。會讓對手陷入\n中毒或麻痹狀態" + }, + "gMaxFinale": { + "name": "超極巨幸福圓滿", + "effect": "超極巨化的霜奶仙使出的妖\n精屬性攻擊。可回覆我方的\nHP" + }, + "gMaxDepletion": { + "name": "超極巨劣化衰變", + "effect": "超極巨化的鋁鋼龍使出的龍\n屬性攻擊。可減少對手最後\n使用的招式的PP" + }, + "gMaxGravitas": { + "name": "超極巨天道七星", + "effect": "超極巨化的以歐路普使出的\n超能力屬性攻擊。在5回合\n內重力會產生變化" + }, + "gMaxVolcalith": { + "name": "超極巨炎石噴發", + "effect": "超極巨化的巨炭山使出的巖\n石屬性攻擊。可在4回合內\n給予對手傷害" + }, + "gMaxSandblast": { + "name": "超極巨沙塵漫天", + "effect": "超極巨化的沙螺蟒使出的地\n面屬性攻擊。在4~5回合\n內會狂刮沙暴" + }, + "gMaxSnooze": { + "name": "超極巨睡魔降臨", + "effect": "超極巨化的長毛巨魔使出的\n惡屬性攻擊。會通過打大哈\n欠讓對手產生睡意" + }, + "gMaxTartness": { + "name": "超極巨酸不溜丟", + "effect": "超極巨化的蘋裹龍使出的草\n屬性攻擊。會降低對手的閃\n避率" + }, + "gMaxSweetness": { + "name": "超極巨瓊漿玉液", + "effect": "超極巨化的豐蜜龍使出的草\n屬性攻擊。會治癒我方的異\n常狀態" + }, + "gMaxSmite": { + "name": "超極巨天譴雷誅", + "effect": "超極巨化的布莉姆溫使出的\n妖精屬性攻擊。會讓對手陷\n入混亂狀態" + }, + "gMaxSteelsurge": { + "name": "超極巨鋼鐵陣法", + "effect": "超極巨化的大王銅象使出的\n鋼屬性攻擊。會發射無數銳\n利的刺" + }, + "gMaxMeltdown": { + "name": "超極巨液金熔擊", + "effect": "超極巨化的美錄梅塔使出的\n鋼屬性攻擊。會讓對手無法\n連續使出相同的招式" + }, + "gMaxFoamBurst": { + "name": "超極巨激漩泡渦", + "effect": "超極巨化的巨鉗蟹使出的水\n屬性攻擊。會大幅降低對手\n的速度" + }, + "gMaxCentiferno": { + "name": "超極巨百火焚野", + "effect": "超極巨化的焚焰蚣使出的火\n屬性攻擊。可在4~5回合\n內將對手困在火焰中" + }, + "gMaxVineLash": { + "name": "超極巨灰飛鞭滅", + "effect": "超極巨化的妙蛙花使出的草\n屬性攻擊。可在4回合內給\n予對手傷害" + }, + "gMaxCannonade": { + "name": "超極巨水炮轟滅", + "effect": "超極巨化的水箭龜使出的水\n屬性攻擊。可在4回合內給\n予對手傷害" + }, + "gMaxDrumSolo": { + "name": "超極巨狂擂亂打", + "effect": "超極巨化的轟擂金剛猩使出\n的草屬性攻擊。不會受到對\n手特性的干擾" + }, + "gMaxFireball": { + "name": "超極巨破陣火球", + "effect": "超極巨化的閃焰王牌使出的\n火屬性攻擊。不會受到對手\n特性的干擾" + }, + "gMaxHydrosnipe": { + "name": "超極巨狙擊神射", + "effect": "超極巨化的千面避役使出的\n水屬性攻擊。不會受到對手\n特性的干擾" + }, + "gMaxOneBlow": { + "name": "超極巨奪命一擊", + "effect": "超極巨化的武道熊師使出的\n惡屬性攻擊。是可以無視極\n巨防壁的一擊" + }, + "gMaxRapidFlow": { + "name": "超極巨流水連擊", + "effect": "超極巨化的武道熊師使出的\n水屬性攻擊。是可以無視極\n巨防壁的連擊" + }, + "teraBlast": { + "name": "太晶爆發", + "effect": "太晶化時,會放出太晶屬性\n的能量攻擊。比較自己的攻\n擊和特攻,用數值相對較高\n的一項給予對方傷害。(其\n他屬性)/用攻擊和特攻數\n值較高的一項給予傷害。對\n正處於太晶化的對手效果絕\n佳。自己的攻擊和特攻會降\n低。(星晶" + }, + "silkTrap": { + "name": "線阱", + "effect": "用絲設置陷阱。防住對方攻\n擊的同時,能夠降低所接觸\n到的對手的速度" + }, + "axeKick": { + "name": "下壓踢", + "effect": "將踢起的腳跟往下劈向對手\n進行攻擊。有時會使對手混\n亂。如果劈偏則自己會受到\n傷害" + }, + "lastRespects": { + "name": "掃墓", + "effect": "爲了化解夥伴的悔恨而進行\n攻擊。被打倒的我方寶可夢\n越多,招式的威力越高" + }, + "luminaCrash": { + "name": "琉光衝激", + "effect": "放出連精神都能影響到的奇\n妙怪光進行攻擊。會大幅降\n低對方的特防" + }, + "orderUp": { + "name": "上菜", + "effect": "以瀟灑的身手進行攻擊。若\n口中有米立龍,會按其樣子\n提高能力" + }, + "jetPunch": { + "name": "噴射拳", + "effect": "將激流覆蓋於拳頭,以肉眼\n無法辨識的速度打出拳擊。\n必定能夠先制攻擊" + }, + "spicyExtract": { + "name": "辣椒精華", + "effect": "放出極爲辛辣的精華。對手\n的攻擊會大幅提高,防禦會\n大幅降低" + }, + "spinOut": { + "name": "疾速轉輪", + "effect": "通過往腿上增加負荷,以激\n烈的旋轉給予對手傷害。自\n己的速度會大幅降低" + }, + "populationBomb": { + "name": "鼠數兒", + "effect": "夥伴們會紛紛趕來集合,以\n羣體行動給予對手攻擊。連\n續命中1~10次" + }, + "iceSpinner": { + "name": "冰旋", + "effect": "腳上覆蓋薄冰,旋轉着撞擊\n對手。通過旋轉的動作破壞\n場地" + }, + "glaiveRush": { + "name": "巨劍突擊", + "effect": "有勇無謀的捨身突擊。使出\n招式後,對手的攻擊必定會\n命中,且傷害會變成2倍" + }, + "revivalBlessing": { + "name": "復生祈禱", + "effect": "通過以慈愛之心祈禱,讓陷\n入昏厥的後備寶可夢以回覆\n一半HP的狀態復活" + }, + "saltCure": { + "name": "鹽醃", + "effect": "使對手陷入鹽醃狀態,每回\n合給予對手傷害。對手爲鋼\n或水屬性時會更痛苦" + }, + "tripleDive": { + "name": "三連鑽", + "effect": "以默契的跳躍濺起水花擊向\n對手。連續3次給予傷害" + }, + "mortalSpin": { + "name": "晶光轉轉", + "effect": "通過旋轉來攻擊對手。可以\n擺脫綁緊、緊束、寄生種子\n等招式。還能讓對手陷入中\n毒狀態" + }, + "doodle": { + "name": "描繪", + "effect": "把握並映射出對手的本質,\n讓自己和同伴寶可夢的特性\n變得和對手相同" + }, + "filletAway": { + "name": "甩肉", + "effect": "削減自己的HP,大幅提高\n攻擊和特攻以及速度" + }, + "kowtowCleave": { + "name": "僕刀", + "effect": "下跪讓對手大意後發起襲擊\n劈向對手。攻擊必定會命中" + }, + "flowerTrick": { + "name": "千變萬花", + "effect": "將做了手腳的花束扔向對手\n進行攻擊。必定會命中,且\n會擊中要害" + }, + "torchSong": { + "name": "閃焰高歌", + "effect": "如唱歌一樣噴出熊熊燃燒的\n火焰燒焦對手。會提高自己\n的特攻" + }, + "aquaStep": { + "name": "流水旋舞", + "effect": "以盈盈欲滴的輕快步伐戲耍\n對手並給予其傷害。會提高\n自己的速度" + }, + "ragingBull": { + "name": "怒牛", + "effect": "狂怒暴牛的猛烈衝撞。招式\n的屬性隨形態改變,光牆和\n反射壁等招式也能破壞" + }, + "makeItRain": { + "name": "淘金潮", + "effect": "扔出大量硬幣攻擊。自己的\n特攻會降低,戰鬥後還可以\n拿到錢" + }, + "psyblade": { + "name": "精神劍", + "effect": "用無形的利刃劈開對手。處\n於電氣場地時,招式威力會\n變成1.5倍" + }, + "hydroSteam": { + "name": "水蒸氣", + "effect": "將煮得翻滾的開水猛烈地噴\n向對手。日照強烈時,招式\n威力不但不會降低,還會變\n成1.5倍" + }, + "ruination": { + "name": "大災難", + "effect": "引發毀滅性的災厄,使對手\n的HP減半" + }, + "collisionCourse": { + "name": "全開猛撞", + "effect": "邊變形邊兇暴地落下,並引\n發起古老的大爆炸。若針對\n到弱點,威力會進一步" + }, + "electroDrift": { + "name": "閃電猛衝", + "effect": "邊變形邊高速奔走,並以未\n知的電擊貫穿對手。若針對\n到弱點,威力會進一步" + }, + "shedTail": { + "name": "斷尾", + "effect": "削減自己的HP,製造分身\n後會返回,並和後備寶可夢\n進行替換" + }, + "chillyReception": { + "name": "冷笑話", + "effect": "留下冷場的冷笑話後,和後\n備寶可夢進行替換。在5回\n合內會下雪" + }, + "tidyUp": { + "name": "大掃除", + "effect": "將撒菱、隱形巖、黏黏網、\n毒菱、替身全部掃除掉。自\n己的攻擊和速度會提高" + }, + "snowscape": { + "name": "雪景", + "effect": "在5回合內會下雪。冰屬性\n的防禦會提高" + }, + "pounce": { + "name": "蟲撲", + "effect": "飛撲向對手攻擊。會降低對\n手的速度" + }, + "trailblaze": { + "name": "起草", + "effect": "跳出草叢進行攻擊。通過輕\n快的步伐會提高自己的速度" + }, + "chillingWater": { + "name": "潑冷水", + "effect": "潑灑冰冷得足以讓對手失去\n活力的水進行攻擊。會降低\n對手的攻擊" + }, + "hyperDrill": { + "name": "強力鑽", + "effect": "急速旋轉尖銳的身體部位貫\n穿對手。可以無視守住和看\n穿等招式" + }, + "twinBeam": { + "name": "雙光束", + "effect": "從兩眼發射出神奇的光線攻\n擊。連續2次給予傷害" + }, + "rageFist": { + "name": "憤怒之拳", + "effect": "將憤怒化爲力量攻擊。受到\n攻擊的次數越多,招式的威\n力越高" + }, + "armorCannon": { + "name": "鎧農炮", + "effect": "熊熊燃燒自己的鎧甲,將其\n做成炮彈射出攻擊。自己的\n防禦和特防會降低" + }, + "bitterBlade": { + "name": "悔念劍", + "effect": "將對世間的留戀聚集於劍尖,\n並斬擊對手。可以回覆給\n予對手傷害的一半HP" + }, + "doubleShock": { + "name": "電光雙擊", + "effect": "將全身所有的電力放出,給\n予對手大大的傷害。自己的\n電屬性將會消失" + }, + "gigatonHammer": { + "name": "巨力錘", + "effect": "連同身體轉起巨大的錘子進\n行攻擊。這個招式無法連續\n使出2次" + }, + "comeuppance": { + "name": "復仇", + "effect": "使出招式前,將最後受到的\n招式的傷害大力返還給對手" + }, + "aquaCutter": { + "name": "水波刀", + "effect": "如刀刃般噴射出加壓的水切\n開對手。容易擊中要害" + }, + "blazingTorque": { + "name": "灼熱暴衝", + "effect": "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n灼傷狀態。" + }, + "wickedTorque": { + "name": "黑暗暴衝", + "effect": "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n睡眠狀態。" + }, + "noxiousTorque": { + "name": "劇毒暴衝", + "effect": "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n中毒狀態。" + }, + "combatTorque": { + "name": "格鬥暴衝", + "effect": "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n麻痹狀態。此招式可以命中\n幽靈屬性的寶可夢。" + }, + "magicalTorque": { + "name": "魔法暴衝", + "effect": "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n混亂狀態。" + }, + "bloodMoon": { + "name": "血月", + "effect": "從赤紅如血的滿月發射出全\n部的氣勢。這個招式無法連\n續使出2次" + }, + "matchaGotcha": { + "name": "刷刷茶炮", + "effect": "發射經攪拌的茶的大炮,可\n以回覆給予對手傷害的一半\nHP,有時會讓對手陷入灼\n傷狀態" + }, + "syrupBomb": { + "name": "糖漿炸彈", + "effect": "使粘稠的麥芽糖漿爆炸,讓\n對手陷入滿身糖狀態,在3\n回合內持續降低其速度" + }, + "ivyCudgel": { + "name": "棘藤棒", + "effect": "用纏有藤蔓的棍棒毆打。屬\n性會隨所戴的面具而改變。\n容易擊中要害" + }, + "electroShot": { + "name": "電光束", + "effect": "第1回合收集電力提高特攻,\n第2回合將高壓的電力發\n射出去。下雨天氣時能立刻\n發射" + }, + "teraStarstorm": { + "name": "晶光星羣", + "effect": "照射出結晶的力量來驅逐敵\n人。太樂巴戈斯在星晶形態\n下使出時,能對所有對手造\n成傷害" + }, + "fickleBeam": { + "name": "隨機光", + "effect": "發射光線進行攻擊。有時其\n他的頭也會合力發射鐳射,\n讓招式威力變成2倍" + }, + "burningBulwark": { + "name": "火焰守護", + "effect": "用超高溫的體毛防住對手攻\n擊的同時,讓接觸到自己的\n對手灼傷" + }, + "thunderclap": { + "name": "迅雷", + "effect": "可以比對手先使出電擊進行\n攻擊。對手使出的招式如果\n不是攻擊招式則會失敗" + }, + "mightyCleave": { + "name": "強刃攻擊", + "effect": "用積蓄在頭部的光來斬切對\n手。可以無視守護進行攻擊" + }, + "tachyonCutter": { + "name": "迅子利刃", + "effect": "接連發射出粒子的利刃,連\n續2次給予傷害。攻擊必定\n會命中" + }, + "hardPress": { + "name": "硬壓", + "effect": "用手臂或鉗子壓迫對手。對\n手剩餘的HP越多,威力越\n大" + }, + "dragonCheer": { + "name": "龍聲鼓舞", + "effect": "以龍之鼓舞提高士氣,讓我\n方的招式變得容易擊中要害。\n對龍屬性的鼓舞效果會更\n強" + }, + "alluringVoice": { + "name": "魅誘之聲", + "effect": "用天使般的歌聲攻擊對手。\n會讓此回合內能力有提高的\n寶可夢陷入混亂狀態" + }, + "temperFlare": { + "name": "豁出去", + "effect": "以自暴自棄的氣勢進行攻擊。\n如果上一回合招式沒有命\n中,威力就會翻倍" + }, + "supercellSlam": { + "name": "閃電強襲", + "effect": "讓身體帶電後壓向對手。如\n果沒有命中則自己會受到傷\n害" + }, + "psychicNoise": { + "name": "精神噪音", + "effect": "用令對手不舒服的音波進行\n攻擊。讓對手在2回合內無\n法通過招式、特性或攜帶的\n道具回覆HP" + }, + "upperHand": { + "name": "快手還擊", + "effect": "察覺到對手的動作後用掌根\n攻擊,讓對手畏縮。如果對\n手使出的招式不是先制攻擊,\n則會失敗" + }, + "malignantChain": { + "name": "邪毒鎖鏈", + "effect": "用由毒形成的鎖鏈纏住對手\n注入毒素加以侵蝕。有時會\n讓對手陷入劇毒狀態" + } +} \ No newline at end of file diff --git a/src/locales/zh_TW/move.ts b/src/locales/zh_TW/move.ts deleted file mode 100644 index 0a6321850db..00000000000 --- a/src/locales/zh_TW/move.ts +++ /dev/null @@ -1,3680 +0,0 @@ -import { MoveTranslationEntries } from "#app/interfaces/locales"; - -export const move: MoveTranslationEntries = { - pound: { name: "拍擊", effect: "使用長長的尾巴或手等拍打\n對手進行攻擊" }, - karateChop: { - name: "空手劈", - effect: "用鋒利的手刀劈向對手進行\n攻擊。容易擊中要害", - }, - doubleSlap: { - name: "連環巴掌", - effect: "用連環巴掌拍打對手進行攻\n擊。連續攻擊2~5次", - }, - cometPunch: { - name: "連續拳", - effect: "用拳頭怒濤般的毆打對手進\n行攻擊。連續攻擊2~5次", - }, - megaPunch: { name: "百萬噸重拳", effect: "用充滿力量的拳頭攻擊對手" }, - payDay: { - name: "聚寶功", - effect: "向對手的身體投擲小金幣進\n行攻擊。戰鬥後可以拿到錢", - }, - firePunch: { - name: "火焰拳", - effect: "用充滿火焰的拳頭攻擊對手。\n有時會讓對手陷入灼傷狀\n態", - }, - icePunch: { - name: "冰凍拳", - effect: "用充滿寒氣的拳頭攻擊對手。\n有時會讓對手陷入冰凍狀\n態", - }, - thunderPunch: { - name: "雷電拳", - effect: "用充滿電流的拳頭攻擊對手。\n有時會讓對手陷入麻痹狀\n態", - }, - scratch: { name: "抓", effect: "用堅硬且無比鋒利的爪子抓\n對手進行攻擊" }, - viseGrip: { name: "夾住", effect: "將對手從兩側夾住,給予傷\n害" }, - guillotine: { - name: "斷頭鉗", - effect: "用大鉗子或剪刀等夾斷對手\n進行攻擊。只要命中就會一\n擊瀕死", - }, - razorWind: { - name: "旋風刀", - effect: "製造風之刃,於第2回合攻\n擊對手。容易擊中要害", - }, - swordsDance: { - name: "劍舞", - effect: "激烈地跳起戰舞提高氣勢。\n大幅提高自己的攻擊", - }, - cut: { name: "居合斬", effect: "用鐮刀或爪子等切斬對手進\n行攻擊" }, - gust: { name: "起風", effect: "用翅膀將颳起的狂風襲向對\n手進行攻擊" }, - wingAttack: { - name: "翅膀攻擊", - effect: "大大地展開美麗的翅膀,將\n其撞向對手進行攻擊", - }, - whirlwind: { - name: "吹飛", - effect: "吹飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", - }, - fly: { name: "飛翔", effect: "第1回合飛上天空,第2回\n合攻擊對手" }, - bind: { - name: "綁緊", - effect: "使用長長的身體或藤蔓等,\n在4~5回合內綁緊對手進\n行攻擊", - }, - slam: { name: "摔打", effect: "使用長長的尾巴或藤蔓等摔\n打對手進行攻擊" }, - vineWhip: { - name: "藤鞭", - effect: "用如同鞭子般彎曲而細長的\n藤蔓摔打對手進行攻擊", - }, - stomp: { - name: "踩踏", - effect: "用大腳踩踏對手進行攻擊。\n有時會使對手畏縮", - }, - doubleKick: { - name: "二連踢", - effect: "用2隻腳踢飛對手進行攻擊。\n連續2次給予傷害", - }, - megaKick: { - name: "百萬噸重踢", - effect: "使出力大無窮的重踢踢飛對\n手進行攻擊", - }, - jumpKick: { - name: "飛踢", - effect: "使出高高的騰空踢攻擊對手。\n如果踢偏則自己會受到傷\n害", - }, - rollingKick: { - name: "迴旋踢", - effect: "一邊使身體快速旋轉,一邊\n踢飛對手進行攻擊。有時會\n使對手畏縮", - }, - sandAttack: { name: "潑沙", effect: "向對手臉上潑沙子,從而降\n低命中率" }, - headbutt: { - name: "頭錘", - effect: "將頭伸出,筆直地撲向對手\n進行攻擊。有時會使對手畏\n縮", - }, - hornAttack: { name: "角撞", effect: "用尖銳的角攻擊對手" }, - furyAttack: { - name: "亂擊", - effect: "用角或喙刺向對手進行攻擊。\n連續攻擊2~5次", - }, - hornDrill: { - name: "角鑽", - effect: "用旋轉的角刺入對手進行攻\n擊。只要命中就會一擊昏厥", - }, - tackle: { name: "撞擊", effect: "用整個身體撞向對手進行攻\n擊" }, - bodySlam: { - name: "泰山壓頂", - effect: "用整個身體壓住對手進行攻\n擊。有時會讓對手陷入麻痹\n狀態", - }, - wrap: { - name: "緊束", - effect: "使用長長的身體或藤蔓等,\n在4~5回合內緊束對手進\n行攻擊", - }, - takeDown: { - name: "猛撞", - effect: "以驚人的氣勢撞向對手進行\n攻擊。自己也會受到少許傷\n害", - }, - thrash: { - name: "大鬧一番", - effect: "在2~3回合內,亂打一氣\n地攻擊對手。大鬧一番後自\n己會陷入混亂", - }, - doubleEdge: { - name: "捨身衝撞", - effect: "拼命地猛撞向對手進行攻擊。\n自己也會受到不小的傷害", - }, - tailWhip: { - name: "搖尾巴", - effect: "可愛地左右搖晃尾巴,誘使\n對手疏忽大意。會降低對手\n的防禦", - }, - poisonSting: { - name: "毒針", - effect: "將有毒的針刺入對手進行攻\n擊。有時會讓對手陷入中毒\n狀態", - }, - twineedle: { - name: "雙針", - effect: "將2根針刺入對手,連續2\n次給予傷害。有時會讓對手\n陷入中毒狀態", - }, - pinMissile: { - name: "飛彈針", - effect: "向對手發射銳針進行攻擊。\n連續攻擊2~5次", - }, - leer: { - name: "瞪眼", - effect: "用犀利的眼神使其害怕,從\n而降低對手的防禦", - }, - bite: { - name: "咬住", - effect: "用尖銳的牙咬住對手進行攻\n擊。有時會使對手畏縮", - }, - growl: { - name: "叫聲", - effect: "讓對手聽可愛的叫聲,引開\n注意力使其疏忽,從而降低\n對手的攻擊", - }, - roar: { - name: "吼叫", - effect: "放走對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", - }, - sing: { - name: "唱歌", - effect: "讓對手聽舒適、美妙的歌聲,\n從而陷入睡眠狀態", - }, - supersonic: { - name: "超音波", - effect: "從身體發出特殊的音波,從\n而使對手混亂", - }, - sonicBoom: { - name: "音爆", - effect: "將衝擊波撞向對手進行攻擊。\n必定會給予20的傷害", - }, - disable: { - name: "定身法", - effect: "阻礙對手行動,之前使出的\n招式將在4回合內無法使用", - }, - acid: { - name: "溶解液", - effect: "將強酸潑向對手進行攻擊。\n有時會降低對手的特防", - }, - ember: { - name: "火花", - effect: "向對手發射小型火焰進行攻\n擊。有時會讓對手陷入灼傷\n狀態", - }, - flamethrower: { - name: "噴射火焰", - effect: "向對手發射烈焰進行攻擊。\n有時會讓對手陷入灼傷狀態", - }, - mist: { - name: "白霧", - effect: "用白霧覆蓋身體。在5回合\n內不會讓對手降低自己的能\n力", - }, - waterGun: { name: "水槍", effect: "向對手猛烈地噴射水流進行\n攻擊" }, - hydroPump: { name: "水炮", effect: "向對手猛烈地噴射大量水流\n進行攻擊" }, - surf: { name: "衝浪", effect: "利用大浪攻擊自己周圍所有\n的寶可夢" }, - iceBeam: { - name: "冰凍光束", - effect: "向對手發射冰凍光束進行攻\n擊。有時會讓對手陷入冰凍\n狀態", - }, - blizzard: { - name: "暴風雪", - effect: "將猛烈的暴風雪刮向對手進\n行攻擊。有時會讓對手陷入\n冰凍狀態", - }, - psybeam: { - name: "幻象光線", - effect: "向對手發射神奇的光線進行\n攻擊。有時會使對手混亂", - }, - bubbleBeam: { - name: "泡沫光線", - effect: "向對手猛烈地噴射泡沫進行\n攻擊。有時會降低對手的速\n度", - }, - auroraBeam: { - name: "極光束", - effect: "向對手發射虹色光束進行攻\n擊。有時會降低對手的攻擊", - }, - hyperBeam: { - name: "破壞光線", - effect: "向對手發射強烈的光線進行\n攻擊。下一回合自己將無法\n動彈", - }, - peck: { name: "啄", effect: "用尖銳的喙或角刺向對手進\n行攻擊" }, - drillPeck: { - name: "啄鑽", - effect: "一邊旋轉,一邊將尖喙刺入\n對手進行攻擊", - }, - submission: { - name: "地獄翻滾", - effect: "將對手連同自己一起摔向地\n面進行攻擊。自己也會受到\n少許傷害", - }, - lowKick: { - name: "踢倒", - effect: "用力踢對手的腳,使其摔倒\n進行攻擊。對手越重,威力\n越大", - }, - counter: { - name: "雙倍奉還", - effect: "從對手那裏受到物理攻擊的\n傷害將以2倍返還給同一個\n對手", - }, - seismicToss: { - name: "地球上投", - effect: "利用引力將對手甩飛出去。\n給予對手和自己等級相同的\n傷害", - }, - strength: { name: "怪力", effect: "使出渾身力氣毆打對手進行\n攻擊" }, - absorb: { - name: "吸取", - effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", - }, - megaDrain: { - name: "超級吸取", - effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", - }, - leechSeed: { - name: "寄生種子", - effect: "植入寄生種子後,將在每回\n合一點一點吸取對手的HP,\n從而用來回復自己的HP", - }, - growth: { name: "生長", effect: "讓身體一下子長大,從而提\n高攻擊和特攻" }, - razorLeaf: { - name: "飛葉快刀", - effect: "飛出葉片,切斬對手進行攻\n擊。容易擊中要害", - }, - solarBeam: { - name: "日光束", - effect: "第1回合收集滿滿的日光,\n第2回合發射光束進行攻擊", - }, - poisonPowder: { - name: "毒粉", - effect: "撒出毒粉,從而讓對手陷入\n中毒狀態", - }, - stunSpore: { - name: "麻痹粉", - effect: "撒出麻痹粉,從而讓對手陷\n入麻痹狀態", - }, - sleepPowder: { - name: "催眠粉", - effect: "撒出催眠粉,從而讓對手陷\n入睡眠狀態", - }, - petalDance: { - name: "花瓣舞", - effect: "在2~3回合內,散落花瓣\n攻擊對手。之後自己會陷入\n混亂", - }, - stringShot: { - name: "吐絲", - effect: "用口中吐出的絲纏繞對手,\n從而大幅降低對手的速度", - }, - dragonRage: { - name: "龍之怒", - effect: "將憤怒的衝擊波撞向對手進\n行攻擊。必定會給予40的\n傷害", - }, - fireSpin: { - name: "火焰旋渦", - effect: "將對手困在激烈的火焰旋渦\n中,在4~5回合內進行攻\n擊", - }, - thunderShock: { - name: "電擊", - effect: "發出電流刺激對手進行攻擊。\n有時會讓對手陷入麻痹狀\n態", - }, - thunderbolt: { - name: "十萬伏特", - effect: "向對手發出強力電擊進行攻\n擊。有時會讓對手陷入麻痹\n狀態", - }, - thunderWave: { - name: "電磁波", - effect: "向對手發出微弱的電擊,從\n而讓對手陷入麻痹狀態", - }, - thunder: { - name: "打雷", - effect: "向對手劈下暴雷進行攻擊。\n有時會讓對手陷入麻痹狀態", - }, - rockThrow: { name: "落石", effect: "拿起小岩石,投擲對手進行\n攻擊" }, - earthquake: { - name: "地震", - effect: "利用地震的衝擊,攻擊自己\n周圍所有的寶可夢", - }, - fissure: { - name: "地裂", - effect: "讓對手掉落於地裂的裂縫中\n進行攻擊。只要命中就會一\n擊瀕死", - }, - dig: { name: "挖洞", effect: "第1回合鑽入地底,第2回\n合攻擊對手" }, - toxic: { - name: "劇毒", - effect: "讓對手陷入劇毒狀態。隨着\n回合的推進,中毒傷害會增\n加", - }, - confusion: { - name: "念力", - effect: "向對手發送微弱的念力進行\n攻擊。有時會使對手混亂", - }, - psychic: { - name: "精神強念", - effect: "向對手發送強大的念力進行\n攻擊。有時會降低對手的特\n防", - }, - hypnosis: { - name: "催眠術", - effect: "施以誘導睡意的暗示,讓對\n手陷入睡眠狀態", - }, - meditate: { - name: "瑜伽姿勢", - effect: "喚醒身體深處沉睡的力量,\n從而提高自己的攻擊", - }, - agility: { - name: "高速移動", - effect: "讓身體放鬆變得輕盈,以便\n高速移動。大幅提高自己的\n速度", - }, - quickAttack: { - name: "電光一閃", - effect: "以迅雷不及掩耳之勢撲向對\n手。必定能夠先制攻擊", - }, - rage: { - name: "憤怒", - effect: "如果在使出招式後受到攻擊\n的話,會因憤怒的力量而提\n高攻擊", - }, - teleport: { - name: "瞬間移動", - effect: "當有後備寶可夢時使用,就\n可以進行替換。野生的寶可\n夢使用則會逃走", - }, - nightShade: { - name: "黑夜魔影", - effect: "顯示恐怖幻影,只給予對手\n和自己等級相同的傷害", - }, - mimic: { - name: "模仿", - effect: "可以將對手最後使用的招式,\n在戰鬥內變成自己的招式", - }, - screech: { - name: "刺耳聲", - effect: "發出不由自主想要捂起耳朵\n的刺耳聲,從而大幅降低對\n手的防禦", - }, - doubleTeam: { - name: "影子分身", - effect: "通過快速移動來製造分身,\n擾亂對手,從而提高閃避率", - }, - recover: { - name: "自我再生", - effect: "讓細胞再生,從而回復自己\n最大HP的一半", - }, - harden: { - name: "變硬", - effect: "全身使勁,讓身體變硬,從\n而提高自己的防禦", - }, - minimize: { - name: "變小", - effect: "蜷縮身體顯得很小,從而大\n幅提高自己的閃避率", - }, - smokescreen: { - name: "煙幕", - effect: "向對手噴出煙或墨汁等,從\n而降低對手的命中率", - }, - confuseRay: { - name: "奇異之光", - effect: "顯示奇怪的光,擾亂對手。\n使對手混亂", - }, - withdraw: { - name: "縮入殼中", - effect: "縮入殼裏保護身體,從而提\n高自己的防禦", - }, - defenseCurl: { - name: "變圓", - effect: "將身體蜷曲變圓,從而提高\n自己的防禦", - }, - barrier: { - name: "屏障", - effect: "製造堅固的壁障,從而大幅\n提高自己的防禦", - }, - lightScreen: { - name: "光牆", - effect: "利用神奇的牆壁,在5回合\n內減弱從對手那裏受到的特\n殊攻擊的傷害", - }, - haze: { - name: "黑霧", - effect: "升起黑霧,將正在場上戰鬥\n的全體寶可夢的能力變回原\n點", - }, - reflect: { - name: "反射壁", - effect: "利用神奇的牆壁,在5回合\n內減弱從對手那裏受到的物\n理攻擊的傷害", - }, - focusEnergy: { - name: "聚氣", - effect: "深深地吸口氣,集中精神。\n自己的攻擊會變得容易擊中\n要害", - }, - bide: { - name: "忍耐", - effect: "在2回合內忍受攻擊,受到\n的傷害會2倍返還給對手", - }, - metronome: { - name: "揮指", - effect: "揮動手指刺激自己的大腦,\n從許多的招式中隨機使出1\n個", - }, - mirrorMove: { - name: "鸚鵡學舌", - effect: "模仿對手使用的招式,自己\n也使用相同招式", - }, - selfDestruct: { - name: "自爆", - effect: "引發爆炸,攻擊自己周圍所\n有的寶可夢。使用後陷入瀕\n死", - }, - eggBomb: { name: "炸蛋", effect: "向對手用力投擲大大的蛋進\n行攻擊" }, - lick: { - name: "舌舔", - effect: "用長長的舌頭,舔遍對手進\n行攻擊。有時會讓對手陷入\n麻痹狀態", - }, - smog: { - name: "濁霧", - effect: "將骯髒的濃霧吹向對手進行\n攻擊。有時會讓對手陷入中\n毒狀態", - }, - sludge: { - name: "污泥攻擊", - effect: "用污泥投擲對手進行攻擊。\n有時會讓對手陷入中毒狀態", - }, - boneClub: { - name: "骨棒", - effect: "用手中的骨頭毆打對手進行\n攻擊。有時會使對手畏縮", - }, - fireBlast: { - name: "大字爆炎", - effect: "用大字形狀的火焰燒盡對手。\n有時會讓對手陷入灼傷狀\n態", - }, - waterfall: { - name: "攀瀑", - effect: "以驚人的氣勢撲向對手。有\n時會使對手畏縮", - }, - clamp: { - name: "貝殼夾擊", - effect: "用非常堅固且厚實的貝殼,\n在4~5回合內夾住對手進\n行攻擊", - }, - swift: { - name: "高速星星", - effect: "發射星形的光攻擊對手。攻\n擊必定會命中", - }, - skullBash: { - name: "火箭頭錘", - effect: "第1回合把頭縮進去,從而\n提高防禦。第2回合攻擊對\n手", - }, - spikeCannon: { - name: "尖刺加農炮", - effect: "向對手發射銳針進行攻擊。\n連續攻擊2~5次", - }, - constrict: { - name: "纏繞", - effect: "用觸手或青藤等纏繞進行攻\n擊。有時會降低對手的速度", - }, - amnesia: { - name: "瞬間失憶", - effect: "將頭腦清空,瞬間忘記某事,\n從而大幅提高自己的特防", - }, - kinesis: { - name: "折彎湯匙", - effect: "折彎湯匙引開注意,從而降\n低對手的命中率", - }, - softBoiled: { name: "生蛋", effect: "回覆自己最大HP的一半" }, - highJumpKick: { - name: "飛膝踢", - effect: "跳起後用膝蓋撞對手進行攻\n擊。如果撞偏則自己會受到\n傷害", - }, - glare: { - name: "大蛇瞪眼", - effect: "用腹部的花紋使對手害怕,\n從而讓其陷入麻痹狀態", - }, - dreamEater: { - name: "食夢", - effect: "喫掉正在睡覺的對手的夢進\n行攻擊。回覆對手所受到傷\n害的一半HP", - }, - poisonGas: { - name: "毒瓦斯", - effect: "將毒瓦斯吹到對手的臉上,\n從而讓對手陷入中毒狀態", - }, - barrage: { - name: "投球", - effect: "向對手投擲圓形物體進行攻\n擊。連續攻擊2~5次", - }, - leechLife: { - name: "吸血", - effect: "吸取血液攻擊對手。可以回\n復給予對手傷害的一半HP", - }, - lovelyKiss: { - name: "惡魔之吻", - effect: "用恐怖的臉強吻對手。讓對\n手陷入睡眠狀態", - }, - skyAttack: { - name: "神鳥猛擊", - effect: "第2回合攻擊對手。偶爾使\n對手畏縮。也容易擊中要害", - }, - transform: { - name: "變身", - effect: "變身成對手寶可夢的樣子,\n能夠使用和對手完全相同的\n招式", - }, - bubble: { - name: "泡沫", - effect: "向對手用力吹起無數泡泡進\n行攻擊。有時會降低對手的\n速度", - }, - dizzyPunch: { - name: "迷昏拳", - effect: "有節奏地出拳攻擊對手。有\n時會使對手混亂", - }, - spore: { - name: "蘑菇孢子", - effect: "沙沙沙地撒滿具有催眠效果\n的孢子,從而讓對手陷入睡\n眠狀態", - }, - flash: { - name: "閃光", - effect: "使出光芒,從而降低對手的\n命中率。也可在陰暗的洞窟\n裏照亮四周", - }, - psywave: { - name: "精神波", - effect: "向對手發射神奇的念波進行\n攻擊。每次使用,傷害都會\n改變", - }, - splash: { - name: "躍起", - effect: "也不攻擊只是一蹦一蹦地跳,\n什麼都不會發生…", - }, - acidArmor: { - name: "溶化", - effect: "通過細胞的變化進行液化,\n從而大幅提高自己的防禦", - }, - crabhammer: { - name: "蟹鉗錘", - effect: "用大鉗子敲打對手進行攻擊。\n容易擊中要害", - }, - explosion: { - name: "大爆炸", - effect: "引發大爆炸,攻擊自己周圍\n所有的寶可夢。使用後自己\n會陷入瀕死", - }, - furySwipes: { - name: "亂抓", - effect: "用爪子或鐮刀等抓對手進行\n攻擊。連續攻擊2~5次", - }, - bonemerang: { - name: "骨頭回力鏢", - effect: "用手中的骨頭投擲對手,來\n回連續2次給予傷害", - }, - rest: { - name: "睡覺", - effect: "連續睡上2回合。回覆自己\n的全部HP以及治癒所有異\n常狀態", - }, - rockSlide: { - name: "岩崩", - effect: "將大岩石猛烈地撞向對手進\n行攻擊。有時會使對手畏縮", - }, - hyperFang: { - name: "必殺門牙", - effect: "用鋒利的門牙牢牢地咬住對\n手進行攻擊。有時會使對手\n畏縮", - }, - sharpen: { - name: "稜角化", - effect: "增加身體的角,變得棱棱角\n角,從而提高自己的攻擊", - }, - conversion: { - name: "紋理", - effect: "將自己的屬性轉換成和已學\n會的招式中第一個招式相同\n的屬性", - }, - triAttack: { - name: "三重攻擊", - effect: "用3種光線進行攻擊。有時\n會讓對手陷入麻痹、灼傷或\n冰凍的狀態", - }, - superFang: { - name: "憤怒門牙", - effect: "用鋒利的門牙猛烈地咬住對\n手進行攻擊。對手的HP減\n半", - }, - slash: { - name: "劈開", - effect: "用爪子或鐮刀等劈開對手進\n行攻擊。容易擊中要害", - }, - substitute: { - name: "替身", - effect: "削減少許自己的HP,製造\n分身。分身將成爲自己的替\n身", - }, - struggle: { - name: "掙扎", - effect: "當自己的PP耗盡時,努力\n掙扎攻擊對手。自己也會受\n到少許傷害", - }, - sketch: { - name: "寫生", - effect: "將對手使用的招式變成自己\n的招式。使用1次後寫生消\n失", - }, - tripleKick: { - name: "三連踢", - effect: "連續3次踢對手進行攻擊。\n每踢中一次,威力就會提高", - }, - thief: { - name: "小偷", - effect: "攻擊的同時盜取道具。當自\n己攜帶道具時,不會去盜取", - }, - spiderWeb: { - name: "蛛網", - effect: "將黏糊糊的細絲一層一層纏\n住對手,使其不能從戰鬥中\n逃走", - }, - mindReader: { - name: "心之眼", - effect: "用心感受對手的行動,下次\n攻擊必定會擊中對手", - }, - nightmare: { - name: "惡夢", - effect: "讓在睡眠狀態下的對手做惡\n夢,每回合會緩緩減少HP", - }, - flameWheel: { - name: "火焰輪", - effect: "讓火焰覆蓋全身,猛撞向對\n手進行攻擊。有時會讓對手\n陷入灼傷狀態", - }, - snore: { - name: "打鼾", - effect: "在自己睡覺時,發出噪音進\n行攻擊。有時會使對手畏縮", - }, - curse: { - name: "詛咒", - effect: "使用該招式的寶可夢,其屬\n性是幽靈屬性或其他屬性時,\n效果會不一樣", - }, - flail: { - name: "抓狂", - effect: "抓狂般亂打進行攻擊。自己\n的HP越少,招式的威力越\n大", - }, - conversion2: { - name: "紋理2", - effect: "爲了可以抵抗對手最後使用\n的招式,從而使自己的屬性\n發生變化", - }, - aeroblast: { - name: "氣旋攻擊", - effect: "發射空氣旋渦進行攻擊。容\n易擊中要害", - }, - cottonSpore: { - name: "棉孢子", - effect: "將棉花般柔軟的孢子緊貼對\n手,從而大幅降低對手的速\n度", - }, - reversal: { - name: "起死回生", - effect: "竭盡全力進行攻擊。自己的\nHP越少,招式的威力越大", - }, - spite: { - name: "怨恨", - effect: "對對手最後使用的招式懷有\n怨恨,減少4PP該招式", - }, - powderSnow: { - name: "細雪", - effect: "將冰冷的細雪吹向對手進行\n攻擊。有時會讓對手陷入冰\n凍狀態", - }, - protect: { - name: "守住", - effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", - }, - machPunch: { - name: "音速拳", - effect: "以迅雷不及掩耳之勢出拳。\n必定能夠先制攻擊", - }, - scaryFace: { - name: "鬼面", - effect: "用恐怖的表情瞪着對手,使\n其害怕,從而大幅降低對手\n的速度", - }, - feintAttack: { - name: "出奇一擊", - effect: "悄悄地靠近對手,趁其不備\n進行毆打。攻擊必定會命中", - }, - sweetKiss: { - name: "天使之吻", - effect: "像天使般可愛地親吻對手,\n從而使對手混亂", - }, - bellyDrum: { - name: "腹鼓", - effect: "將自己的HP減少到最大\nHP的一半,從而最大限度提\n高自己的攻擊", - }, - sludgeBomb: { - name: "污泥炸彈", - effect: "用污泥投擲對手進行攻擊。\n有時會讓對手陷入中毒狀態", - }, - mudSlap: { - name: "擲泥", - effect: "向對手的臉等投擲泥塊進行\n攻擊。會降低對手的命中率", - }, - octazooka: { - name: "章魚桶炮", - effect: "向對手的臉等噴出墨汁進行\n攻擊。有時會降低對手的命\n中率", - }, - spikes: { - name: "撒菱", - effect: "在對手的腳下扔撒菱。對替\n換出場的對手的寶可夢給予\n傷害", - }, - zapCannon: { - name: "電磁炮", - effect: "發射大炮一樣的電流進行攻\n擊。讓對手陷入麻痹狀態", - }, - foresight: { - name: "識破", - effect: "使出後對幽靈屬性寶可夢沒\n有效果的招式以及閃避率高\n的對手,變得能夠打中", - }, - destinyBond: { - name: "同命", - effect: "使出招式後,當受到對手攻\n擊陷入瀕死時,對手也會一\n同瀕死。連續使出則會失敗", - }, - perishSong: { - name: "滅亡之歌", - effect: "傾聽歌聲的寶可夢經過3回\n合陷入瀕死。替換後效果消\n失", - }, - icyWind: { - name: "冰凍之風", - effect: "將結冰的冷氣吹向對手進行\n攻擊。會降低對手的速度", - }, - detect: { - name: "看穿", - effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", - }, - boneRush: { - name: "骨棒亂打", - effect: "用堅硬的骨頭毆打對手進行\n攻擊。連續攻擊2~5次", - }, - lockOn: { name: "鎖定", effect: "緊緊瞄準對手,下次攻擊必\n定會打中" }, - outrage: { - name: "逆鱗", - effect: "在2~3回合內,亂打一氣\n地進行攻擊。大鬧一番後自\n己會陷入混亂", - }, - sandstorm: { - name: "沙暴", - effect: "在5回合內揚起沙暴,除巖\n石、地面和鋼屬性以外的寶\n可夢,都會受到傷害。岩石\n屬性的特防還會提高", - }, - gigaDrain: { - name: "終極吸取", - effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", - }, - endure: { - name: "挺住", - effect: "即使受到攻擊,也至少會留\n下1HP。連續使出則容易\n失敗", - }, - charm: { - name: "撒嬌", - effect: "可愛地凝視,誘使對手疏忽\n大意,從而大幅降低對手的\n攻擊", - }, - rollout: { - name: "滾動", - effect: "在5回合內連續滾動攻擊對\n手。招式每次擊中,威力就\n會提高", - }, - falseSwipe: { - name: "點到爲止", - effect: "對手的HP至少會留下1\nHP,如此般手下留情地攻擊", - }, - swagger: { - name: "虛張聲勢", - effect: "激怒對手,使其混亂。因爲\n憤怒,對手的攻擊會大幅提\n高", - }, - milkDrink: { name: "喝牛奶", effect: "回覆自己最大HP的一半" }, - spark: { - name: "電光", - effect: "讓電流覆蓋全身,猛撞向對\n手進行攻擊。有時會讓對手\n陷入麻痹狀態", - }, - furyCutter: { - name: "連斬", - effect: "用鐮刀或爪子等切斬對手進\n行攻擊。連續擊中,威力就\n會提高", - }, - steelWing: { - name: "鋼翼", - effect: "用堅硬的翅膀敲打對手進行\n攻擊。有時會提高自己的防\n御", - }, - meanLook: { - name: "黑色目光", - effect: "用好似要勾人心魂的黑色目\n光一動不動地凝視對手,使\n其不能從戰鬥中逃走", - }, - attract: { - name: "迷人", - effect: "♂誘惑♀或♀誘惑♂,讓對\n手着迷。對手將很難使出招\n式", - }, - sleepTalk: { - name: "夢話", - effect: "從自己已學會的招式中任意\n使出1個。只能在自己睡覺\n時使用", - }, - healBell: { - name: "治癒鈴聲", - effect: "讓同伴聽舒適的鈴音,從而\n治癒我方全員的異常狀態", - }, - return: { - name: "報恩", - effect: "爲了訓練家而全力攻擊對手。\n親密度越高,威力越大", - }, - present: { - name: "禮物", - effect: "遞給對手設有圈套的盒子進\n行攻擊。也有可能回覆對手\nHP", - }, - frustration: { - name: "遷怒", - effect: "爲了發泄不滿而全力攻擊對\n手。親密度越低,威力越大", - }, - safeguard: { - name: "神祕守護", - effect: "在5回合內被神奇的力量守\n護,從而不會陷入異常狀態", - }, - painSplit: { - name: "分擔痛楚", - effect: "將自己的HP和對手的HP\n相加,然後自己和對手友好\n地平分", - }, - sacredFire: { - name: "神聖之火", - effect: "用神祕的火焰燒盡對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", - }, - magnitude: { - name: "震級", - effect: "晃動地面,攻擊自己周圍所\n有的寶可夢。招式的威力會\n有各種變化", - }, - dynamicPunch: { - name: "爆裂拳", - effect: "使出渾身力氣出拳進行攻擊。\n必定會使對手混亂", - }, - megahorn: { - name: "超級角擊", - effect: "用堅硬且華麗的角狠狠地刺\n入對手進行攻擊", - }, - dragonBreath: { - name: "龍息", - effect: "將強烈的氣息吹向對手進行\n攻擊。有時會讓對手陷入麻\n痹狀態", - }, - batonPass: { - name: "接棒", - effect: "和後備寶可夢進行替換。換\n上的寶可夢能直接繼承其能\n力的變化", - }, - encore: { - name: "再來一次", - effect: "讓對手接受再來一次,連續\n3次使出最後使用的招式", - }, - pursuit: { - name: "追打", - effect: "當對手替換寶可夢上場時使\n出此招式的話,能夠以2倍\n的威力進行攻擊", - }, - rapidSpin: { - name: "高速旋轉", - effect: "通過旋轉來攻擊對手。可以\n擺脫綁緊、緊束、寄生種子\n等招式。還能提高自己的速\n度", - }, - sweetScent: { name: "甜甜香氣", effect: "用香氣大幅降低對手的閃避\n率" }, - ironTail: { - name: "鐵尾", - effect: "使用堅硬的尾巴摔打對手進\n行攻擊。有時會降低對手的\n防禦", - }, - metalClaw: { - name: "金屬爪", - effect: "用鋼鐵之爪劈開對手進行攻\n擊。有時會提高自己的攻擊", - }, - vitalThrow: { - name: "借力摔", - effect: "會在對手之後進行攻擊。但\n是自己的攻擊必定會命中", - }, - morningSun: { - name: "晨光", - effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", - }, - synthesis: { - name: "光合作用", - effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", - }, - moonlight: { - name: "月光", - effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", - }, - hiddenPower: { - name: "覺醒力量", - effect: "招式的屬性會隨着使用此招\n式的寶可夢而改變", - }, - crossChop: { - name: "十字劈", - effect: "用兩手呈十字劈打對手進行\n攻擊。容易擊中要害", - }, - twister: { - name: "龍捲風", - effect: "興起龍捲風,將對手卷入進\n行攻擊。有時會使對手畏縮", - }, - rainDance: { - name: "求雨", - effect: "在5回合內一直降雨,從而\n提高水屬性的招式威力。火\n屬性的招式威力則降低", - }, - sunnyDay: { - name: "大晴天", - effect: "在5回合內讓日照變得強烈,\n從而提高火屬性的招式威\n力。水屬性的招式威力則降\n低", - }, - crunch: { - name: "咬碎", - effect: "用利牙咬碎對手進行攻擊。\n有時會降低對手的防禦", - }, - mirrorCoat: { - name: "鏡面反射", - effect: "從對手那裏受到特殊攻擊的\n傷害將以2倍返還給同一個\n對手", - }, - psychUp: { - name: "自我暗示", - effect: "向自己施以自我暗示,將能\n力變化的狀態變得和對手一\n樣", - }, - extremeSpeed: { - name: "神速", - effect: "以迅雷不及掩耳之勢猛撞向\n對手進行攻擊。必定能夠先\n制攻擊", - }, - ancientPower: { - name: "原始之力", - effect: "用原始之力進行攻擊。有時\n會提高自己所有的能力", - }, - shadowBall: { - name: "暗影球", - effect: "投擲一團黑影進行攻擊。有\n時會降低對手的特防", - }, - futureSight: { - name: "預知未來", - effect: "在使用招式2回合後,向對\n手發送一團念力進行攻擊", - }, - rockSmash: { - name: "碎岩", - effect: "用拳頭進行攻擊。有時會降\n低對手的防禦", - }, - whirlpool: { - name: "潮旋", - effect: "將對手困在激烈的水流旋渦\n中,在4~5回合內進行攻\n擊", - }, - beatUp: { - name: "圍攻", - effect: "我方全員進行攻擊。同行的\n寶可夢越多,招式的攻擊次\n數越多", - }, - fakeOut: { - name: "擊掌奇襲", - effect: "進行先制攻擊,使對手畏縮。\n要在出場後立刻使出才能\n成功", - }, - uproar: { - name: "吵鬧", - effect: "在3回合內大吵大鬧攻擊對\n手。在此期間誰都不能入眠", - }, - stockpile: { - name: "蓄力", - effect: "積蓄力量,提高自己的防禦\n和特防。最多積蓄3次", - }, - spitUp: { - name: "噴出", - effect: "將積蓄的力量撞向對手進行\n攻擊。積蓄得越多,威力越\n大", - }, - swallow: { - name: "吞下", - effect: "將積蓄的力量吞下,從而回\n復自己的HP。積蓄得越多,\n回覆越大", - }, - heatWave: { - name: "熱風", - effect: "將炎熱的氣息吹向對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", - }, - hail: { - name: "冰雹", - effect: "在5回合內一直降冰雹,除\n冰屬性的寶可夢以外,給予\n全體寶可夢傷害", - }, - torment: { - name: "無理取鬧", - effect: "向對手無理取鬧,令其不能\n連續2次使出相同招式", - }, - flatter: { - name: "吹捧", - effect: "吹捧對手,使其混亂。同時\n還會提高對手的特攻", - }, - willOWisp: { - name: "鬼火", - effect: "放出怪異的火焰,從而讓對\n手陷入灼傷狀態", - }, - memento: { - name: "臨別禮物", - effect: "雖然會使自己陷入昏厥,但\n是能夠大幅降低對手的攻擊\n和特攻", - }, - facade: { - name: "硬撐", - effect: "當自己處於中毒、麻痹、灼\n傷狀態時,向對手使出此招\n式的話,威力會變成2倍", - }, - focusPunch: { - name: "真氣拳", - effect: "集中精神出拳。在招式使出\n前若受到攻擊則會失敗", - }, - smellingSalts: { - name: "清醒", - effect: "對於麻痹狀態下的對手,威\n力會變成2倍。但相反對手\n的麻痹也會被治癒", - }, - followMe: { - name: "看我嘛", - effect: "引起對手的注意,將對手的\n攻擊全部轉移到自己身上", - }, - naturePower: { - name: "自然之力", - effect: "用自然之力進行攻擊。根據\n所使用場所的不同,使出的\n招式也會有所變化", - }, - charge: { - name: "充電", - effect: "變爲充電狀態,提高下次使\n出的電屬性的招式威力。自\n己的特防也會提高", - }, - taunt: { - name: "挑釁", - effect: "使對手憤怒。在3回合內讓\n對手只能使出給予傷害的招\n式", - }, - helpingHand: { - name: "幫助", - effect: "幫助夥伴。被幫助的寶可夢,\n其招式威力變得比平時大", - }, - trick: { name: "戲法", effect: "抓住對手的空隙,交換自己\n和對手的持有物" }, - rolePlay: { - name: "扮演", - effect: "扮演對手,讓自己的特性變\n得和對手相同", - }, - wish: { - name: "祈願", - effect: "在下一回合回覆自己或是替\n換出場的寶可夢最大HP的\n一半", - }, - assist: { - name: "藉助", - effect: "向同伴緊急求助,從我方寶\n可夢已學會的招式中隨機使\n用1個", - }, - ingrain: { - name: "扎根", - effect: "在大地上扎根,每回合回覆\n自己的HP。因爲扎根了,\n所以不能替換寶可夢", - }, - superpower: { - name: "蠻力", - effect: "發揮驚人的力量攻擊對手。\n自己的攻擊和防禦會降低", - }, - magicCoat: { - name: "魔法反射", - effect: "當對手使出會變成異常狀態\n的招式或寄生種子等時,會\n將對手的招式反射回去", - }, - recycle: { - name: "回收利用", - effect: "使戰鬥中已經消耗掉的自己\n的持有物再生,並可以再次\n使用", - }, - revenge: { - name: "報復", - effect: "如果受到對手的招式攻擊,\n就能給予對手2倍的傷害", - }, - brickBreak: { - name: "劈瓦", - effect: "將手刀猛烈地揮下攻擊對手。\n還可以破壞光牆和反射壁\n等", - }, - yawn: { - name: "哈欠", - effect: "打個大哈欠引起睡意。在下\n一回合讓對手陷入睡眠狀態", - }, - knockOff: { - name: "拍落", - effect: "拍落對手的持有物,直到戰\n鬥結束都不能使用。對手攜\n帶道具時會增加傷害", - }, - endeavor: { - name: "蠻幹", - effect: "給予傷害,使對手的HP變\n得和自己的HP一樣", - }, - eruption: { - name: "噴火", - effect: "爆發怒火攻擊對手。自己的\nHP越少,招式的威力越小", - }, - skillSwap: { name: "特性互換", effect: "利用超能力互換自己和對手\n的特性" }, - imprison: { - name: "封印", - effect: "如果對手有和自己相同的招\n式,那麼只有對手無法使用\n該招式", - }, - refresh: { - name: "煥然一新", - effect: "讓身體休息,治癒自己身上\n所中的毒、麻痹、灼傷的異\n常狀態", - }, - grudge: { - name: "怨念", - effect: "因對手的招式而陷入昏厥時\n給對手施加怨念,讓該招式\n的PP變成0", - }, - snatch: { - name: "搶奪", - effect: "將對手打算使用的回覆招式\n或能力變化招式奪爲己用", - }, - secretPower: { - name: "祕密之力", - effect: "根據使用場所不同,該招式\n的追加效果也會有所變化", - }, - dive: { - name: "潛水", - effect: "第1回合潛入水中,第2回\n合浮上來進行攻擊", - }, - armThrust: { - name: "猛推", - effect: "用張開着的雙手猛推對手進\n行攻擊。連續攻擊2~5次", - }, - camouflage: { - name: "保護色", - effect: "根據所在場所不同,如水邊\n、草叢和洞窟等,可以改變\n自己的屬性", - }, - tailGlow: { - name: "螢火", - effect: "凝視閃爍的光芒,集中自己\n的精神,從而巨幅提高特攻", - }, - lusterPurge: { - name: "潔淨光芒", - effect: "釋放耀眼的光芒進行攻擊。\n有時會降低對手的特防", - }, - mistBall: { - name: "薄霧球", - effect: "用圍繞着霧狀羽毛的球進行\n攻擊。有時會降低對手的特\n攻", - }, - featherDance: { - name: "羽毛舞", - effect: "撒出羽毛,籠罩在對手的周\n圍。大幅降低對手的攻擊", - }, - teeterDance: { - name: "搖晃舞", - effect: "搖搖晃晃地跳起舞蹈,讓自\n己周圍的寶可夢陷入混亂狀\n態", - }, - blazeKick: { - name: "火焰踢", - effect: "攻擊對手後,有時會使其陷\n入灼傷狀態。也容易擊中要\n害", - }, - mudSport: { - name: "玩泥巴", - effect: "一旦使用此招式,周圍就會\n弄得到處是泥。在5回合內\n減弱電屬性的招式", - }, - iceBall: { - name: "冰球", - effect: "在5回合內攻擊對手。招式\n每次擊中,威力就會提高", - }, - needleArm: { - name: "尖刺臂", - effect: "用帶刺的手臂猛烈地揮舞進\n行攻擊。有時會使對手畏縮", - }, - slackOff: { name: "偷懶", effect: "偷懶休息。回覆自己最大\nHP的一半" }, - hyperVoice: { - name: "巨聲", - effect: "給予對手又吵又響的巨大震\n動進行攻擊", - }, - poisonFang: { - name: "劇毒牙", - effect: "用有毒的牙齒咬住對手進行\n攻擊。有時會使對手中劇毒", - }, - crushClaw: { - name: "撕裂爪", - effect: "用堅硬的銳爪劈開對手進行\n攻擊。有時會降低對手的防\n御", - }, - blastBurn: { - name: "爆炸烈焰", - effect: "用爆炸的火焰燒盡對手進行\n攻擊。下一回合自己將無法\n動彈", - }, - hydroCannon: { - name: "加農水炮", - effect: "向對手噴射水炮進行攻擊。\n下一回合自己將無法動彈", - }, - meteorMash: { - name: "彗星拳", - effect: "使出彗星般的拳頭攻擊對手。\n有時會提高自己的攻擊", - }, - astonish: { - name: "驚嚇", - effect: "用尖叫聲等突然驚嚇對手進\n行攻擊。有時會使對手畏縮", - }, - weatherBall: { - name: "氣象球", - effect: "根據使用時的天氣,招式屬\n性和威力會改變", - }, - aromatherapy: { - name: "芳香治療", - effect: "讓同伴聞沁人心脾的香氣,\n從而治癒我方全員的異常狀\n態", - }, - fakeTears: { - name: "假哭", - effect: "裝哭流淚。使對手不知所措,\n從而大幅降低對手的特防", - }, - airCutter: { - name: "空氣利刃", - effect: "用銳利的風切斬對手進行攻\n擊。容易擊中要害", - }, - overheat: { - name: "過熱", - effect: "使出全部力量攻擊對手。使\n用之後會因爲反作用力,自\n己的特攻大幅降低", - }, - odorSleuth: { - name: "氣味偵測", - effect: "使出後對幽靈屬性寶可夢沒\n有效果的招式以及閃避率高\n的對手,變得能夠打中", - }, - rockTomb: { - name: "岩石封鎖", - effect: "投擲岩石進行攻擊。封住對\n手的行動,從而降低速度", - }, - silverWind: { - name: "銀色旋風", - effect: "在風中摻入鱗粉攻擊對手。\n有時會提高自己的全部能力", - }, - metalSound: { - name: "金屬音", - effect: "讓對手聽摩擦金屬般討厭的\n聲音。大幅降低對手的特防", - }, - grassWhistle: { - name: "草笛", - effect: "讓對手聽舒適的笛聲,從而\n陷入睡眠狀態", - }, - tickle: { - name: "搔癢", - effect: "給對手搔癢,使其發笑,從\n而降低對手的攻擊和防禦", - }, - cosmicPower: { - name: "宇宙力量", - effect: "汲取宇宙中神祕的力量,從\n而提高自己的防禦和特防", - }, - waterSpout: { - name: "噴水", - effect: "掀起潮水進行攻擊。自己的\nHP越少,招式的威力越小", - }, - signalBeam: { - name: "信號光束", - effect: "發射神奇的光線進行攻擊。\n有時會使對手混亂", - }, - shadowPunch: { name: "暗影拳", effect: "使出混影之拳。攻擊必定會\n命中" }, - extrasensory: { - name: "神通力", - effect: "發出看不見的神奇力量進行\n攻擊。有時會使對手畏縮", - }, - skyUppercut: { - name: "衝天拳", - effect: "用衝向天空般高高的上勾拳\n頂起對手進行攻擊", - }, - sandTomb: { - name: "流沙地獄", - effect: "將對手困在鋪天蓋地的沙暴\n中,在4~5回合內進行攻\n擊", - }, - sheerCold: { - name: "絕對零度", - effect: "給對手一擊瀕死。如果是冰\n屬性以外的寶可夢使用,就\n會難以打中", - }, - muddyWater: { - name: "濁流", - effect: "向對手噴射渾濁的水進行攻\n擊。有時會降低對手的命中\n率", - }, - bulletSeed: { - name: "種子機關槍", - effect: "向對手猛烈地發射種子進行\n攻擊。連續攻擊2~5次", - }, - aerialAce: { - name: "燕返", - effect: "以敏捷的動作戲弄對手後進\n行切斬。攻擊必定會命中", - }, - icicleSpear: { - name: "冰錐", - effect: "向對手發射鋒利的冰柱進行\n攻擊。連續攻擊2~5次", - }, - ironDefense: { - name: "鐵壁", - effect: "將皮膚變得堅硬如鐵,從而\n大幅提高自己的防禦", - }, - block: { - name: "擋路", - effect: "張開雙手進行阻擋,封住對\n手的退路,使其不能逃走", - }, - howl: { - name: "長嚎", - effect: "大聲吼叫提高氣勢,從而提\n高自己和同伴的攻擊", - }, - dragonClaw: { name: "龍爪", effect: "用尖銳的巨爪劈開對手進行\n攻擊" }, - frenzyPlant: { - name: "瘋狂植物", - effect: "用大樹摔打對手進行攻擊。\n下一回合自己將無法動彈", - }, - bulkUp: { - name: "健美", - effect: "使出全身力氣繃緊肌肉,從\n而提高自己的攻擊和防禦", - }, - bounce: { - name: "彈跳", - effect: "彈跳到高高的空中,第2回\n合攻擊對手。有時會讓對手\n陷入麻痹狀態", - }, - mudShot: { - name: "泥巴射擊", - effect: "向對手投擲泥塊進行攻擊。\n同時降低對手的速度", - }, - poisonTail: { - name: "毒尾", - effect: "用尾巴拍打。有時會讓對手\n陷入中毒狀態,也容易擊中\n要害", - }, - covet: { - name: "渴望", - effect: "一邊可愛地撒嬌,一邊靠近\n對手進行攻擊,還能奪取對\n手攜帶的道具", - }, - voltTackle: { - name: "伏特攻擊", - effect: "讓電流覆蓋全身猛撞向對手。\n自己也會受到不小的傷害。\n有時會讓對手陷入麻痹狀\n態", - }, - magicalLeaf: { - name: "魔法葉", - effect: "散落可以追蹤對手的神奇葉\n片。攻擊必定會命中", - }, - waterSport: { - name: "玩水", - effect: "用水溼透周圍。在5回合內\n減弱火屬性的招式", - }, - calmMind: { name: "冥想", effect: "靜心凝神,從而提高自己的\n特攻和特防" }, - leafBlade: { - name: "葉刃", - effect: "像用劍一般操縱葉片切斬對\n手進行攻擊。容易擊中要害", - }, - dragonDance: { - name: "龍之舞", - effect: "激烈地跳起神祕且強有力的\n舞蹈。從而提高自己的攻擊\n和速度", - }, - rockBlast: { - name: "岩石爆擊", - effect: "向對手發射堅硬的岩石進行\n攻擊。連續攻擊2~5次", - }, - shockWave: { - name: "電擊波", - effect: "向對手快速發出電擊。攻擊\n必定會命中", - }, - waterPulse: { - name: "水之波動", - effect: "用水的震動攻擊對手。有時\n會使對手混亂", - }, - doomDesire: { - name: "破滅之願", - effect: "使用招式2回合後,會用無\n數道光束攻擊對手", - }, - psychoBoost: { - name: "精神突進", - effect: "使出全部力量攻擊對手。使\n用之後會因爲反作用力,自\n己的特攻大幅降低", - }, - roost: { - name: "羽棲", - effect: "降到地面,使身體休息。回\n復自己最大HP的一半", - }, - gravity: { - name: "重力", - effect: "在5回合內,飄浮特性和飛\n行屬性的寶可夢會被地面屬\n性的招式擊中。飛向空中的\n招式也將無法使用", - }, - miracleEye: { - name: "奇蹟之眼", - effect: "使出後對惡屬性寶可夢沒有\n效果的招式以及閃避率高的\n對手,變得能夠打中", - }, - wakeUpSlap: { - name: "喚醒巴掌", - effect: "給予睡眠狀態下的對手較大\n的傷害。但相反對手會從睡\n眠中醒過來", - }, - hammerArm: { - name: "臂錘", - effect: "揮舞強力而沉重的拳頭,給\n予對手傷害。自己的速度會\n降低", - }, - gyroBall: { - name: "陀螺球", - effect: "讓身體高速旋轉並撞擊對手。\n速度比對手越慢,威力越\n大", - }, - healingWish: { - name: "治癒之願", - effect: "雖然自己陷入瀕死,但可以\n治癒後備上場的寶可夢的異\n常狀態以及回覆HP", - }, - brine: { - name: "鹽水", - effect: "當對手的HP負傷到一半左\n右時,招式威力會變成2倍", - }, - naturalGift: { - name: "自然之恩", - effect: "從樹果上獲得力量進行攻擊。\n根據攜帶的樹果,招式屬\n性和威力會改變", - }, - feint: { - name: "佯攻", - effect: "能夠攻擊正在使用守住或看\n穿等招式的對手。解除其守\n護效果", - }, - pluck: { - name: "啄食", - effect: "用喙進行攻擊。當對手攜帶\n樹果時,可以食用並獲得其\n效果", - }, - tailwind: { - name: "順風", - effect: "颳起猛烈的旋風,在4回合\n內提高我方全員的速度", - }, - acupressure: { - name: "點穴", - effect: "通過點穴讓身體舒筋活絡。\n大幅提高某1項能力", - }, - metalBurst: { - name: "金屬爆炸", - effect: "使出招式前,將最後受到的\n招式的傷害大力返還給對手", - }, - uTurn: { - name: "急速折返", - effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", - }, - closeCombat: { - name: "近身戰", - effect: "放棄守護,向對手的懷裏突\n擊。自己的防禦和特防會降\n低", - }, - payback: { - name: "以牙還牙", - effect: "蓄力攻擊。如果能在對手之\n後攻擊,招式的威力會變成\n2倍", - }, - assurance: { - name: "惡意追擊", - effect: "如果此回合內對手已經受到\n傷害的話,招式威力會變成\n2倍", - }, - embargo: { - name: "查封", - effect: "讓對手在5回合內不能使用\n寶可夢攜帶的道具。訓練家\n也不能給那隻寶可夢使用道\n具", - }, - fling: { - name: "投擲", - effect: "快速投擲攜帶的道具進行攻\n擊。根據道具不同,威力和\n效果會改變", - }, - psychoShift: { - name: "精神轉移", - effect: "利用超能力施以暗示,從而\n將自己受到的異常狀態轉移\n給對手", - }, - trumpCard: { - name: "王牌", - effect: "王牌招式的剩餘PP越少,\n招式的威力越大", - }, - healBlock: { - name: "回覆封鎖", - effect: "在5回合內無法通過招式、\n特性或攜帶的道具來回復H\nP", - }, - wringOut: { - name: "絞緊", - effect: "用力勒緊對手進行攻擊。對\n手的HP越多,威力越大", - }, - powerTrick: { - name: "力量戲法", - effect: "利用超能力交換自己的攻擊\n和防禦的力量", - }, - gastroAcid: { - name: "胃液", - effect: "將胃液吐向對手的身體。沾\n上的胃液會消除對手的特性\n效果", - }, - luckyChant: { - name: "幸運咒語", - effect: "向天許願,從而在5回合內\n不會被對手的攻擊打中要害", - }, - meFirst: { - name: "搶先一步", - effect: "提高威力,搶先使出對手想\n要使出的招式。如果不先使\n出則會失敗", - }, - copycat: { - name: "仿效", - effect: "模仿對手剛纔使出的招式,\n並使出相同招式。如果對手\n還沒出招則會失敗", - }, - powerSwap: { - name: "力量互換", - effect: "利用超能力互換自己和對手\n的攻擊以及特攻的能力變化", - }, - guardSwap: { - name: "防守互換", - effect: "利用超能力互換自己和對手\n的防禦以及特防的能力變化", - }, - punishment: { - name: "懲罰", - effect: "根據能力變化,對手提高的\n力量越大,招式的威力越大", - }, - lastResort: { - name: "珍藏", - effect: "當戰鬥中已學會的招式全部\n使用過後,才能開始使出珍\n藏的招式", - }, - worrySeed: { - name: "煩惱種子", - effect: "種植心神不寧的種子。使對\n手不能入眠,並將特性變成\n不眠", - }, - suckerPunch: { - name: "突襲", - effect: "可以比對手先攻擊。對手使\n出的招式如果不是攻擊招式\n則會失敗", - }, - toxicSpikes: { - name: "毒菱", - effect: "在對手的腳下撒毒菱。使對\n手替換出場的寶可夢中毒", - }, - heartSwap: { - name: "心靈互換", - effect: "利用超能力互換自己和對手\n之間的能力變化", - }, - aquaRing: { - name: "水流環", - effect: "在自己身體的周圍覆蓋用水\n製造的幕。每回合回覆HP", - }, - magnetRise: { - name: "電磁飄浮", - effect: "利用電氣產生的磁力浮在空\n中。在5回合內可以飄浮", - }, - flareBlitz: { - name: "閃焰衝鋒", - effect: "讓火焰覆蓋全身猛撞向對手。\n自己也會受到不小的傷害。\n有時會讓對手陷入灼傷狀\n態", - }, - forcePalm: { - name: "發勁", - effect: "向對手的身體發出衝擊波進\n行攻擊。有時會讓對手陷入\n麻痹狀態", - }, - auraSphere: { - name: "波導彈", - effect: "從體內產生出波導之力,然\n後向對手發出。攻擊必定會\n命中", - }, - rockPolish: { - name: "岩石打磨", - effect: "打磨自己的身體,減少空氣\n阻力。可以大幅提高自己的\n速度", - }, - poisonJab: { - name: "毒擊", - effect: "用帶毒的觸手或手臂刺入對\n手。有時會讓對手陷入中毒\n狀態", - }, - darkPulse: { - name: "惡之波動", - effect: "從體內發出充滿惡意的恐怖\n氣場。有時會使對手畏縮", - }, - nightSlash: { - name: "暗襲要害", - effect: "抓住瞬間的空隙切斬對手。\n容易擊中要害", - }, - aquaTail: { - name: "水流尾", effect: "如驚濤駭浪般揮動大尾巴攻\n擊對手" - }, - seedBomb: { - name: "種子炸彈", - effect: "將外殼堅硬的大種子,從上\n方砸下攻擊對手", - }, - airSlash: { - name: "空氣斬", - effect: "用連天空也能劈開的空氣之\n刃進行攻擊。有時會使對手\n畏縮", - }, - xScissor: { - name: "十字剪", - effect: "將鐮刀或爪子像剪刀般地交\n叉,順勢劈開對手", - }, - bugBuzz: { - name: "蟲鳴", - effect: "利用振動發出音波進行攻擊。\n有時會降低對手的特防", - }, - dragonPulse: { - name: "龍之波動", - effect: "從大大的口中掀起衝擊波攻\n擊對手", - }, - dragonRush: { - name: "龍之俯衝", - effect: "釋放出駭人的殺氣,一邊威\n懾一邊撞擊對手。有時會使\n對手畏縮", - }, - powerGem: { - name: "力量寶石", effect: "發射如寶石般閃耀的光芒攻\n擊對手" - }, - drainPunch: { - name: "吸取拳", - effect: "用拳頭吸取對手的力量。可\n以回覆給予對手傷害的一半\nHP", - }, - vacuumWave: { - name: "真空波", - effect: "揮動拳頭,掀起真空波。必\n定能夠先制攻擊", - }, - focusBlast: { - name: "真氣彈", - effect: "提高氣勢,釋放出全部力量。\n有時會降低對手的特防", - }, - energyBall: { - name: "能量球", - effect: "發射從自然收集的生命力量。\n有時會降低對手的特防", - }, - braveBird: { - name: "勇鳥猛攻", - effect: "收攏翅膀,通過低空飛行突\n擊對手。自己也會受到不小\n的傷害", - }, - earthPower: { - name: "大地之力", - effect: "向對手腳下釋放出大地之力。\n有時會降低對手的特防", - }, - switcheroo: { - name: "掉包", - effect: "用一閃而過的速度交換自己\n和對手的持有物", - }, - gigaImpact: { - name: "終極衝擊", - effect: "使出自己渾身力量突擊對手。\n下一回合自己將無法動彈", - }, - nastyPlot: { - name: "詭計", - effect: "謀劃詭計,激活頭腦。大幅\n提高自己的特攻", - }, - bulletPunch: { - name: "子彈拳", - effect: "向對手使出如子彈般快速而\n堅硬的拳頭。必定能夠先制\n攻擊", - }, - avalanche: { - name: "雪崩", - effect: "如果受到對手的招式攻擊,\n就能給予該對手2倍威力的\n攻擊", - }, - iceShard: { - name: "冰礫", - effect: "瞬間製作冰塊,快速地扔向\n對手。必定能夠先制攻擊", - }, - shadowClaw: { - name: "暗影爪", - effect: "以影子做成的銳爪,劈開對\n手。容易擊中要害", - }, - thunderFang: { - name: "雷電牙", - effect: "用蓄滿電流的牙齒咬住對手。\n有時會使對手畏縮或陷入\n麻痹狀態", - }, - iceFang: { - name: "冰凍牙", - effect: "用藏有冷氣的牙齒咬住對手。\n有時會使對手畏縮或陷入\n冰凍狀態", - }, - fireFang: { - name: "火焰牙", - effect: "用覆蓋着火焰的牙齒咬住對\n手。有時會使對手畏縮或陷\n入灼傷狀態", - }, - shadowSneak: { - name: "影子偷襲", - effect: "伸長影子,從對手的背後進\n行攻擊。必定能夠先制攻擊", - }, - mudBomb: { - name: "泥巴炸彈", - effect: "向對手發射堅硬的泥彈進行\n攻擊。有時會降低對手的命\n中率", - }, - psychoCut: { - name: "精神利刃", - effect: "用實體化的心之利刃劈開對\n手。容易擊中要害", - }, - zenHeadbutt: { - name: "意念頭錘", - effect: "將思念的力量集中在前額進\n行攻擊。有時會使對手畏縮", - }, - mirrorShot: { - name: "鏡光射擊", - effect: "拋光自己的身體,向對手釋\n放出閃光之力。有時會降低\n對手的命中率", - }, - flashCannon: { - name: "加農光炮", - effect: "將身體的光芒聚集在一點釋\n放出去。有時會降低對手的\n特防", - }, - rockClimb: { - name: "攀岩", - effect: "發動猛撞攻擊,有時會使對\n手混亂。是寶可表的祕傳招\n式之一", - }, - defog: { - name: "清除濃霧", - effect: "用強風吹開對手的反射壁或\n光牆等。也會降低對手的閃\n避率", - }, - trickRoom: { - name: "戲法空間", - effect: "製造出離奇的空間。在5回\n合內速度慢的寶可夢可以先\n行動", - }, - dracoMeteor: { - name: "流星群", - effect: "從天空中向對手落下隕石。\n使用之後因爲反作用力,自\n己的特攻會大幅降低", - }, - discharge: { - name: "放電", - effect: "用耀眼的電擊攻擊自己周圍\n所有的寶可夢。有時會陷入\n麻痹狀態", - }, - lavaPlume: { - name: "噴煙", - effect: "用熊熊烈火攻擊自己周圍所\n有的寶可夢。有時會陷入灼\n傷狀態", - }, - leafStorm: { - name: "飛葉風暴", - effect: "用尖尖的葉片向對手卷起風\n暴。使用之後因爲反作用力\n自己的特攻會大幅降低", - }, - powerWhip: { - name: "強力鞭打", - effect: "激烈地揮舞青藤或觸手摔打\n對手進行攻擊", - }, - rockWrecker: { - name: "岩石炮", - effect: "向對手發射巨大的岩石進行\n攻擊。下一回合自己將無法\n動彈", - }, - crossPoison: { - name: "十字毒刃", - effect: "用毒刃劈開對手。有時會讓\n對手陷入中毒狀態,也容易\n擊中要害", - }, - gunkShot: { - name: "垃圾射擊", - effect: "用骯髒的垃圾撞向對手進行\n攻擊。有時會讓對手陷入中\n毒狀態", - }, - ironHead: { - name: "鐵頭", - effect: "用鋼鐵般堅硬的頭部進行攻\n擊。有時會使對手畏縮", - }, - magnetBomb: { - name: "磁鐵炸彈", - effect: "發射吸住對手的鋼鐵炸彈。\n攻擊必定會命中", - }, - stoneEdge: { - name: "尖石攻擊", - effect: "用尖尖的岩石刺入對手進行\n攻擊。容易擊中要害", - }, - captivate: { - name: "誘惑", - effect: "♂誘惑♀或♀誘惑♂,從而\n大幅降低對手的特攻", - }, - stealthRock: { - name: "隱形岩", - effect: "將無數岩石懸浮在對手的周\n圍,從而對替換出場的對手\n的寶可夢給予傷害", - }, - grassKnot: { - name: "打草結", - effect: "用草纏住並絆倒對手。對手\n越重,威力越大", - }, - chatter: { - name: "喋喋不休", - effect: "用非常煩人的,喋喋不休的\n音波攻擊對手。使對手混亂", - }, - judgment: { - name: "制裁光礫", - effect: "向對手放出無數的光彈。屬\n性會根據自己攜帶的石板不\n同而改變", - }, - bugBite: { - name: "蟲咬", - effect: "咬住進行攻擊。當對手攜帶\n樹果時,可以食用並獲得其\n效果", - }, - chargeBeam: { - name: "充電光束", - effect: "向對手發射電擊光束。由於\n蓄滿電流,有時會提高自己\n的特攻", - }, - woodHammer: { - name: "木槌", - effect: "用堅硬的軀體撞擊對手進行\n攻擊。自己也會受到不小的\n傷害", - }, - aquaJet: { - name: "水流噴射", - effect: "以迅雷不及掩耳之勢撲向對\n手。必定能夠先制攻擊", - }, - attackOrder: { - name: "攻擊指令", - effect: "召喚手下,讓其朝對手發起\n攻擊。容易擊中要害", - }, - defendOrder: { - name: "防禦指令", - effect: "召喚手下,讓其附在自己的\n身體上。可以提高自己的防\n御和特防", - }, - healOrder: { - name: "回覆指令", - effect: "召喚手下療傷。回覆自己最\n大HP的一半", - }, - headSmash: { - name: "雙刃頭錘", - effect: "拼命使出渾身力氣,向對手\n進行頭錘攻擊。自己也會受\n到非常大的傷害", - }, - doubleHit: { - name: "二連擊", - effect: "使用尾巴等拍打對手進行攻\n擊。連續2次給予傷害", - }, - roarOfTime: { - name: "時光咆哮", - effect: "釋放出扭曲時間般的強大力\n量攻擊對手。下一回合自己\n將無法動彈", - }, - spacialRend: { - name: "亞空裂斬", - effect: "將對手連同周圍的空間一起\n撕裂並給予傷害。容易擊中\n要害", - }, - lunarDance: { - name: "新月舞", - effect: "雖然自己陷入昏厥,但可以\n治癒後備上場的寶可夢的全\n部狀態", - }, - crushGrip: { - name: "捏碎", - effect: "用駭人的力量捏碎對手。對\n手剩餘的HP越多,威力越\n大", - }, - magmaStorm: { - name: "熔岩風暴", - effect: "將對手困在熊熊燃燒的火焰\n中,在4~5回合內進行攻\n擊", - }, - darkVoid: { - name: "暗黑洞", - effect: "將對手強制拖入黑暗的世界,\n從而讓對手陷入睡眠狀態", - }, - seedFlare: { - name: "種子閃光", - effect: "從身體裏產生衝擊波。有時\n會大幅降低對手的特防", - }, - ominousWind: { - name: "奇異之風", - effect: "突然颳起毛骨悚然的暴風攻\n擊對手。有時會提高自己的\n全部能力", - }, - shadowForce: { - name: "暗影潛襲", - effect: "第1回合消失蹤影,第2回\n合攻擊對手。即使對手正受\n保護,也能擊中", - }, - honeClaws: { - name: "磨爪", - effect: "將爪子磨得更加鋒利。提高\n自己的攻擊和命中率", - }, - wideGuard: { - name: "廣域防守", - effect: "在1回合內防住擊打我方全\n員的攻擊", - }, - guardSplit: { - name: "防守平分", - effect: "利用超能力將自己和對手的\n防禦和特防相加,再進行平\n分", - }, - powerSplit: { - name: "力量平分", - effect: "利用超能力將自己和對手的\n攻擊和特攻相加,再進行平\n分", - }, - wonderRoom: { - name: "奇妙空間", - effect: "製造出離奇的空間。在5回\n合內互換所有寶可夢的防禦\n和特防", - }, - psyshock: { - name: "精神衝擊", - effect: "將神奇的念波實體化攻擊對\n手。給予物理傷害", - }, - venoshock: { - name: "毒液衝擊", - effect: "將特殊的毒液潑向對手。對\n處於中毒狀態的對手,威力\n會變成2倍", - }, - autotomize: { - name: "身體輕量化", - effect: "削掉身體上沒用的部分。大\n幅提高自己的速度,同時體\n重也會變輕", - }, - ragePowder: { - name: "憤怒粉", - effect: "將令人煩躁的粉末撒在自己\n身上,用以吸引對手的注意。\n使對手的攻擊全部指向自\n己", - }, - telekinesis: { - name: "意念移物", - effect: "利用超能力使對手浮起來。\n在3回合內攻擊會變得容易\n打中對手", - }, - magicRoom: { - name: "魔法空間", - effect: "製造出離奇的空間。在5回\n合內所有寶可夢攜帶道具的\n效果都會消失", - }, - smackDown: { - name: "擊落", - effect: "扔石頭或炮彈,攻擊飛行的\n對手。對手會被擊落,掉到\n地面", - }, - stormThrow: { - name: "山嵐摔", - effect: "向對手使出強烈的一擊。攻\n擊必定會擊中要害", - }, - flameBurst: { - name: "烈焰濺射", - effect: "如果擊中,爆裂的火焰會攻\n擊到對手。爆裂出的火焰還\n會飛濺到旁邊的對手", - }, - sludgeWave: { - name: "污泥波", - effect: "用污泥波攻擊自己周圍所有\n的寶可夢。有時會陷入中毒\n狀態", - }, - quiverDance: { - name: "蝶舞", - effect: "輕巧地跳起神祕而又美麗的\n舞蹈。提高自己的特攻、特\n防和速度", - }, - heavySlam: { - name: "重磅衝撞", - effect: "用沉重的身體撞向對手進行\n攻擊。自己比對手越重,威\n力越大", - }, - synchronoise: { - name: "同步干擾", - effect: "用神奇電波對周圍所有和自\n己屬性相同的寶可夢給予傷\n害", - }, - electroBall: { - name: "電球", - effect: "用電氣團撞向對手。自己比\n對手速度越快,威力越大", - }, - soak: { - name: "浸水", effect: "將大量的水潑向對手,從而\n使其變成水屬性" - }, - flameCharge: { - name: "蓄能焰襲", - effect: "讓火焰覆蓋全身,攻擊對手。\n積蓄力量來提高自己的速\n度", - }, - coil: { - name: "盤蜷", - effect: "盤蜷着集中精神。提高自己\n的攻擊、防禦和命中率", - }, - lowSweep: { - name: "下盤踢", - effect: "以敏捷的動作瞄準對手的腳\n進行攻擊。會降低對手的速\n度", - }, - acidSpray: { - name: "酸液炸彈", - effect: "噴出能溶化對手的液體進行\n攻擊。會大幅降低對手的特\n防", - }, - foulPlay: { - name: "欺詐", - effect: "利用對手的力量進行攻擊。\n正和自己戰鬥的對手,其攻\n擊越高,傷害越大", - }, - simpleBeam: { - name: "單純光束", - effect: "向對手發送謎之念波。接收\n到念波的對手,其特性會變\n爲單純", - }, - entrainment: { - name: "找夥伴", - effect: "用神奇的節奏跳舞。使對手\n模仿自己的動作,從而將特\n性變成一樣", - }, - afterYou: { - name: "您先請", - effect: "支援我方或對手的行動,使\n其緊接着此招式之後行動", - }, - round: { - name: "輪唱", - effect: "用歌聲攻擊對手。大家一起\n輪唱便可以接連使出,威力\n也會提高", - }, - echoedVoice: { - name: "迴聲", - effect: "用回聲攻擊對手。如果每回\n合都有寶可夢接着使用該招\n式,威力就會提高", - }, - chipAway: { - name: "逐步擊破", - effect: "看準機會穩步攻擊。無視對\n手的能力變化,直接給予傷\n害", - }, - clearSmog: { - name: "清除之煙", - effect: "向對手投擲特殊的泥塊進行\n攻擊。使其能力變回原點", - }, - storedPower: { - name: "輔助力量", - effect: "用蓄積起來的力量攻擊對手。\n自己的能力提高得越多,\n威力就越大", - }, - quickGuard: { - name: "快速防守", - effect: "守護自己和同伴,以防對手\n的先制攻擊", - }, - allySwitch: { - name: "交換場地", - effect: "用神奇的力量瞬間移動,互\n換自己和同伴所在的位置。\n連續使出則容易失敗", - }, - scald: { - name: "熱水", - effect: "向對手噴射煮得翻滾的開水\n進行攻擊。有時會讓對手陷\n入灼傷狀態", - }, - shellSmash: { - name: "破殼", - effect: "打破外殼,降低自己的防禦\n和特防,但大幅提高攻擊、\n特攻和速度", - }, - healPulse: { - name: "治癒波動", - effect: "放出治癒波動,從而回復對\n手最大HP的一半", - }, - hex: { - name: "禍不單行", - effect: "接二連三地進行攻擊。對處\n於異常狀態的對手給予較大\n的傷害", - }, - skyDrop: { - name: "自由落體", - effect: "第1回合將對手帶到空中,\n第2回合將其摔下進行攻擊。\n被帶到空中的對手不能動\n彈", - }, - shiftGear: { - name: "換檔", - effect: "轉動齒輪,不僅提高自己的\n攻擊,還會大幅提高速度", - }, - circleThrow: { - name: "巴投", - effect: "扔飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", - }, - incinerate: { - name: "燒盡", - effect: "用火焰攻擊對手。對手攜帶\n樹果等時,會燒掉,使其不\n能使用", - }, - quash: { - name: "延後", effect: "壓制對手,從而將其行動順\n序放到最後" - }, - acrobatics: { - name: "雜技", - effect: "輕巧地攻擊對手。自己沒有\n攜帶道具時,會給予較大的\n傷害", - }, - reflectType: { - name: "鏡面屬性", - effect: "反射對手的屬性,讓自己也\n變成一樣的屬性", - }, - retaliate: { - name: "報仇", - effect: "爲倒下的同伴報仇。如果上\n一回合有同伴倒下,威力就\n會提高", - }, - finalGambit: { - name: "搏命", - effect: "拼命攻擊對手。雖然自己陷\n入昏厥,但會給予對手和自\n己目前HP等量的傷害", - }, - bestow: { - name: "傳遞禮物", - effect: "當對手未攜帶道具時,能夠\n將自己攜帶的道具交給對手", - }, - inferno: { - name: "煉獄", - effect: "用猛烈的火焰包圍對手進行\n攻擊。讓對手陷入灼傷狀態", - }, - waterPledge: { - name: "水之誓約", - effect: "用水柱進行攻擊。如果和火\n組合,威力就會提高,天空\n中會掛上彩虹", - }, - firePledge: { - name: "火之誓約", - effect: "用火柱進行攻擊。如果和草\n組合,威力就會提高,周圍\n會變成火海", - }, - grassPledge: { - name: "草之誓約", - effect: "用草柱進行攻擊。如果和水\n組合,威力就會提高,周圍\n會變成溼地", - }, - voltSwitch: { - name: "伏特替換", - effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", - }, - struggleBug: { - name: "蟲之抵抗", - effect: "抵抗並攻擊對手。會降低對\n手的特攻", - }, - bulldoze: { - name: "重踏", - effect: "用力踩踏地面並攻擊自己周\n圍所有的寶可夢。會降低對\n方的速度", - }, - frostBreath: { - name: "冰息", - effect: "將冰冷的氣息吹向對手進行\n攻擊。必定會擊中要害", - }, - dragonTail: { - name: "龍尾", - effect: "彈飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", - }, - workUp: { - name: "自我激勵", effect: "激勵自己,從而提高攻擊和\n特攻" - }, - electroweb: { - name: "電網", - effect: "用電網捉住對手進行攻擊。\n會降低對手的速度", - }, - wildCharge: { - name: "瘋狂伏特", - effect: "讓電流覆蓋全身,撞向對手\n進行攻擊。自己也會受到少\n許傷害", - }, - drillRun: { - name: "直衝鑽", - effect: "像鋼鑽一樣,一邊旋轉身體\n一邊撞擊對手。容易擊中要\n害", - }, - dualChop: { - name: "二連劈", - effect: "用身體堅硬的部分拍打對手\n進行攻擊。連續2次給予傷\n害", - }, - heartStamp: { - name: "愛心印章", - effect: "以可愛的動作使對手疏忽,\n乘機給出強烈的一擊。有時\n會使對手畏縮", - }, - hornLeech: { - name: "木角", - effect: "將角刺入,吸取對手的養分。\n可以回覆給予對手傷害的\n一半HP", - }, - sacredSword: { - name: "聖劍", - effect: "用劍切斬對手進行攻擊。無\n視對手的能力變化,直接給\n予傷害", - }, - razorShell: { - name: "貝殼刃", - effect: "用鋒利的貝殼切斬對手進行\n攻擊。有時會降低對手的防\n御", - }, - heatCrash: { - name: "高溫重壓", - effect: "用燃燒的身體撞向對手進行\n攻擊。自己比對手越重,威\n力越大", - }, - leafTornado: { - name: "青草攪拌器", - effect: "用鋒利的葉片包裹住對手進\n行攻擊。有時會降低對手的\n命中率", - }, - steamroller: { - name: "瘋狂滾壓", - effect: "旋轉揉成團的身體壓扁對手。\n有時會使對手畏縮", - }, - cottonGuard: { - name: "棉花防守", - effect: "用軟綿綿的絨毛包裹住自己\n的身體進行守護。巨幅提高\n自己的防禦", - }, - nightDaze: { - name: "暗黑爆破", - effect: "放出黑暗的衝擊波攻擊對手。\n有時會降低對手的命中率", - }, - psystrike: { - name: "精神擊破", - effect: "將神奇的念波實體化攻擊對\n手。給予物理傷害", - }, - tailSlap: { - name: "掃尾拍打", - effect: "用堅硬的尾巴拍打對手進行\n攻擊。連續攻擊2~5次", - }, - hurricane: { - name: "暴風", - effect: "用強烈的風席捲對手進行攻\n擊。有時會使對手混亂", - }, - headCharge: { - name: "爆炸頭突擊", - effect: "用厲害的爆炸頭猛撞向對手\n進行攻擊。自己也會受到少\n許傷害", - }, - gearGrind: { - name: "齒輪飛盤", - effect: "向對手投擲鋼鐵齒輪進行攻\n擊。連續2次給予傷害", - }, - searingShot: { - name: "火焰彈", - effect: "用熊熊烈火攻擊自己周圍所\n有的寶可夢。有時會陷入灼\n傷狀態", - }, - technoBlast: { - name: "高科技光炮", - effect: "向對手放出光彈。屬性會根\n據自己攜帶的卡帶不同而改\n變", - }, - relicSong: { - name: "古老之歌", - effect: "讓對手聽古老之歌,打動對\n手的內心進行攻擊。有時會\n讓對手陷入睡眠狀態", - }, - secretSword: { - name: "神祕之劍", - effect: "用長角切斬對手進行攻擊。\n角上擁有的神奇力量將給予\n物理傷害", - }, - glaciate: { - name: "冰封世界", - effect: "將冰凍的冷氣吹向對手進行\n攻擊。會降低對手的速度", - }, - boltStrike: { - name: "雷擊", - effect: "讓強大的電流覆蓋全身,猛\n撞向對手進行攻擊。有時會\n讓對手陷入麻痹狀態", - }, - blueFlare: { - name: "青焰", - effect: "用美麗而激烈的青焰包裹住\n對手進行攻擊。有時會讓對\n手陷入灼傷狀態", - }, - fieryDance: { - name: "火之舞", - effect: "讓火焰覆蓋全身,振翅攻擊\n對手。有時會提高自己的特\n攻", - }, - freezeShock: { - name: "冰凍伏特", - effect: "用覆蓋着電流的冰塊,在第\n2回合撞向對手。有時會讓\n對手陷入麻痹狀態", - }, - iceBurn: { - name: "極寒冷焰", - effect: "用能夠凍結一切的強烈冷氣,\n在第2回合包裹住對手。\n有時會讓對手陷入灼傷狀態", - }, - snarl: { - name: "大聲咆哮", - effect: "沒完沒了地大聲斥責,從而\n降低對手的特攻", - }, - icicleCrash: { - name: "冰柱墜擊", - effect: "用大冰柱激烈地撞向對手進\n行攻擊。有時會使對手畏縮", - }, - vCreate: { - name: "V熱焰", - effect: "從前額產生灼熱的火焰,舍\n身撞擊對手。防禦、特防和\n速度會降低", - }, - fusionFlare: { - name: "交錯火焰", - effect: "釋放出巨大的火焰。受到巨\n大的閃電影響時,招式威力\n會提高", - }, - fusionBolt: { - name: "交錯閃電", - effect: "釋放出巨大的閃電。受到巨\n大的火焰影響時,招式威力\n會提高", - }, - flyingPress: { - name: "飛身重壓", - effect: "從空中俯衝向對手。此招式\n同時帶有格鬥屬性和飛行屬\n性", - }, - matBlock: { - name: "掀榻榻米", - effect: "將掀起來的榻榻米當作盾牌,\n防住自己和同伴免受招式\n傷害。變化招式無法防住", - }, - belch: { - name: "打嗝", - effect: "朝着對手打嗝,並給予傷害。\n如果不喫樹果則無法使出", - }, - rototiller: { - name: "耕地", - effect: "翻耕土地,使草木更容易成\n長。會提高草屬性寶可夢的\n攻擊和特攻", - }, - stickyWeb: { - name: "黏黏網", - effect: "在對手周圍圍上黏黏的網,\n降低替換出場的對手的速度", - }, - fellStinger: { - name: "致命針刺", - effect: "如果使用此招式打倒對手,\n攻擊會巨幅提高", - }, - phantomForce: { - name: "潛靈奇襲", - effect: "第1回合消失在某處,第2\n回合攻擊對手。可以無視守\n護進行攻擊", - }, - trickOrTreat: { - name: "萬聖夜", - effect: "邀請對手參加萬聖夜。使對\n手被追加幽靈屬性", - }, - nobleRoar: { - name: "戰吼", - effect: "發出戰吼威嚇對手,從而降\n低對手的攻擊和特攻", - }, - ionDeluge: { - name: "等離子浴", - effect: "將帶電粒子擴散開來,使一\n般屬性的招式變成電屬性", - }, - parabolicCharge: { - name: "拋物面充電", - effect: "給周圍全體寶可夢造成傷害。\n可以回覆給予傷害的一半\nHP", - }, - forestsCurse: { - name: "森林咒術", - effect: "向對手施加森林咒術。中了\n咒術的對手會被追加草屬性", - }, - petalBlizzard: { - name: "落英繽紛", - effect: "猛烈地颳起飛雪般的落花,\n攻擊周圍所有的寶可夢,並\n給予傷害", - }, - freezeDry: { - name: "冷凍乾燥", - effect: "急劇冷凍對手,有時會讓對\n手陷入冰凍狀態。對於水屬\n性寶可夢也是效果絕佳", - }, - disarmingVoice: { - name: "魅惑之聲", - effect: "發出魅惑的叫聲,給予對手\n精神上的傷害。攻擊必定會\n命中", - }, - partingShot: { - name: "拋下狠話", - effect: "拋下狠話威嚇對手,降低攻\n擊和特攻後,和後備寶可夢\n進行替換", - }, - topsyTurvy: { - name: "顛倒", - effect: "顛倒對手身上的所有能力變\n化,變成和原來相反的狀態", - }, - drainingKiss: { - name: "吸取之吻", - effect: "用一個吻吸取對手的HP。\n回覆給予對手傷害的一半以\n上的HP", - }, - craftyShield: { - name: "戲法防守", - effect: "使用神奇的力量防住攻擊我\n方的變化招式。但無法防住\n傷害招式的攻擊", - }, - flowerShield: { - name: "鮮花防守", - effect: "使用神奇的力量提高在場的\n所有草屬性寶可夢的防禦", - }, - grassyTerrain: { - name: "青草場地", - effect: "在5回合內變成青草場地。\n地面上的寶可夢每回合都能\n回覆。草屬性的招式威力還\n會提高", - }, - mistyTerrain: { - name: "薄霧場地", - effect: "在5回合內,地面上的寶可\n夢不會陷入異常狀態。龍屬\n性招式的傷害也會減半", - }, - electrify: { - name: "輸電", - effect: "對手使出招式前,如果輸電,\n則該回合對手的招式變成\n電屬性", - }, - playRough: { - name: "嬉鬧", - effect: "與對手嬉鬧並攻擊。有時會\n降低對手的攻擊", - }, - fairyWind: { - name: "妖精之風", effect: "颳起妖精之風,吹向對手進\n行攻擊" - }, - moonblast: { - name: "月亮之力", - effect: "借用月亮的力量攻擊對手。\n有時會降低對手的特攻", - }, - boomburst: { - name: "爆音波", - effect: "通過震耳欲聾的爆炸聲產生\n的破壞力,攻擊自己周圍所\n有的寶可夢", - }, - fairyLock: { - name: "妖精之鎖", - effect: "通過封鎖,下一回合所有的\n寶可夢都無法逃走", - }, - kingsShield: { - name: "王者盾牌", - effect: "防住對手攻擊的同時,自己\n變爲防禦姿態。能夠降低所\n接觸到的對手的攻擊", - }, - playNice: { - name: "和睦相處", - effect: "和對手和睦相處,使其失去\n戰鬥的氣力,從而降低對手\n的攻擊", - }, - confide: { - name: "密語", - effect: "和對手進行密語,使其失去\n集中力,從而降低對手的特\n攻", - }, - diamondStorm: { - name: "鑽石風暴", - effect: "掀起鑽石風暴給予傷害。有\n時會大幅提高自己的防禦", - }, - steamEruption: { - name: "蒸汽爆炸", - effect: "將滾燙的蒸汽噴向對手。有\n時會讓對手灼傷", - }, - hyperspaceHole: { - name: "異次元洞", - effect: "通過異次元洞,突然出現在\n對手的側面進行攻擊。還可\n以無視守住和看穿等招式", - }, - waterShuriken: { - name: "飛水手裏劍", - effect: "用粘液製成的手裏劍,連續\n攻擊2~5次。必定能夠先\n制攻擊", - }, - mysticalFire: { - name: "魔法火焰", - effect: "從口中噴出特別灼熱的火焰\n進行攻擊。降低對手的特攻", - }, - spikyShield: { - name: "尖刺防守", - effect: "防住對手攻擊的同時,削減\n接觸到自己的對手的體力", - }, - aromaticMist: { - name: "芳香薄霧", - effect: "通過神奇的芳香,提高我方\n寶可夢的特防", - }, - eerieImpulse: { - name: "怪異電波", - effect: "從身體放射出怪異電波,讓\n對手沐浴其中,從而大幅降\n低其特攻", - }, - venomDrench: { - name: "毒液陷阱", - effect: "將特殊的毒液潑向對手。對\n處於中毒狀態的對手,其攻\n擊、特攻和速度都會降低", - }, - powder: { - name: "粉塵", - effect: "如果被撒到粉塵的對手使用\n火招式,則會爆炸並給予傷\n害", - }, - geomancy: { - name: "大地掌控", - effect: "第1回合吸收能量,第2回\n合大幅提高特攻、特防和速\n度", - }, - magneticFlux: { - name: "磁場操控", - effect: "通過操控磁場,會提高特性\n爲正電和負電的寶可夢的防\n御和特防", - }, - happyHour: { - name: "歡樂時光", - effect: "如果使用歡樂時光,戰鬥後\n得到的錢會翻倍", - }, - electricTerrain: { - name: "電氣場地", - effect: "在5回合內變成電氣場地。\n地面上的寶可夢將無法入眠。\n電屬性的招式威力還會提\n高", - }, - dazzlingGleam: { name: "魔法閃耀", effect: "向對手發射強光,並給予傷\n害" }, - celebrate: { name: "慶祝", effect: "寶可夢爲十分開心的你慶祝" }, - holdHands: { - name: "牽手", - effect: "我方寶可夢之間牽手。能帶\n來非常幸福的心情", - }, - babyDollEyes: { - name: "圓瞳", - effect: "用圓瞳凝視對手,從而降低\n其攻擊。必定能夠先制攻擊", - }, - nuzzle: { - name: "蹭蹭臉頰", - effect: "將帶電的臉頰蹭蹭對手進行\n攻擊。讓對手陷入麻痹狀態", - }, - holdBack: { - name: "手下留情", - effect: "在攻擊的時候手下留情,從\n而使對手的HP至少會留下\n1HP", - }, - infestation: { - name: "糾纏不休", - effect: "在4~5回合內死纏爛打地\n進行攻擊。在此期間對手將\n無法逃走", - }, - powerUpPunch: { - name: "增強拳", - effect: "通過反覆擊打對手,使自己\n的拳頭慢慢變硬。打中對手\n攻擊就會提高", - }, - oblivionWing: { - name: "歸天之翼", - effect: "從鎖定的對手身上吸取HP。\n回覆給予對手傷害的一半\n以上的HP", - }, - thousandArrows: { - name: "千箭齊發", - effect: "可以擊中浮在空中的寶可夢。\n空中的對手被擊落後,會\n掉到地面", - }, - thousandWaves: { - name: "千波激盪", - effect: "從地面掀起波浪進行攻擊。\n被掀入波浪中的對手,將無\n法從戰鬥中逃走", - }, - landsWrath: { - name: "大地神力", - effect: "聚集大地的力量,將此力量\n集中攻擊對手,並給予傷害", - }, - lightOfRuin: { - name: "破滅之光", - effect: "借用永恆之花的力量,發射\n出強力光線。自己也會受到\n非常大的傷害", - }, - originPulse: { - name: "根源波動", - effect: "用無數青白色且閃耀的光線\n攻擊對手", - }, - precipiceBlades: { - name: "斷崖之劍", - effect: "將大地的力量變化爲利刃攻\n擊對手", - }, - dragonAscent: { - name: "畫龍點睛", - effect: "從天空中急速下降攻擊對手。\n自己的防禦和特防會降低", - }, - hyperspaceFury: { - name: "異次元猛攻", - effect: "用許多手臂,無視對手的守\n住或看穿等招式進行連續攻\n擊,自己的防禦會降低", - }, - breakneckBlitzPhysical: { - name: "一般Z究極無敵大沖撞", - effect: "通過Z力量氣勢猛烈地全力\n撞上對手。威力會根據原來\n的招式而改變", - }, - breakneckBlitzSpecial: { - name: "一般Z究極無敵大沖撞", - effect: "通過Z力量氣勢猛烈地全力\n撞上對手。威力會根據原來\n的招式而改變", - }, - allOutPummelingPhysical: { - name: "格鬥Z全力無雙激烈拳", - effect: "通過Z力量製造出能量彈,\n全力撞向對手。威力會根據\n原來的招式而改變", - }, - allOutPummelingSpecial: { - name: "格鬥Z全力無雙激烈拳", - effect: "通過Z力量製造出能量彈,\n全力撞向對手。威力會根據\n原來的招式而改變", - }, - supersonicSkystrikePhysical: { - name: "飛行Z極速俯衝轟烈撞", - effect: "通過Z力量猛烈地飛向天空,\n朝對手全力落下。威力會\n根據原來的招式而改變", - }, - supersonicSkystrikeSpecial: { - name: "飛行Z極速俯衝轟烈撞", - effect: "通過Z力量猛烈地飛向天空,\n朝對手全力落下。威力會\n根據原來的招式而改變", - }, - acidDownpourPhysical: { - name: "毒Z強酸劇毒滅絕雨", - effect: "通過Z力量使毒沼湧起,全\n力讓對手沉下去。威力會根\n據原來的招式而改變", - }, - acidDownpourSpecial: { - name: "毒Z強酸劇毒滅絕雨", - effect: "通過Z力量使毒沼湧起,全\n力讓對手沉下去。威力會根\n據原來的招式而改變", - }, - tectonicRagePhysical: { - name: "地面Z地隆嘯天大終結", - effect: "通過Z力量潛入地裏最深處,\n全力撞上對手。威力會根\n據原來的招式而改變", - }, - tectonicRageSpecial: { - name: "地面Z地隆嘯天大終結", - effect: "通過Z力量潛入地裏最深處,\n全力撞上對手。威力會根\n據原來的招式而改變", - }, - continentalCrushPhysical: { - name: "岩石Z毀天滅地巨巖墜", - effect: "通過Z力量召喚大大的巖山,\n全力撞向對手。威力會根\n據原來的招式而改變", - }, - continentalCrushSpecial: { - name: "岩石Z毀天滅地巨巖墜", - effect: "通過Z力量召喚大大的巖山,\n全力撞向對手。威力會根\n據原來的招式而改變", - }, - savageSpinOutPhysical: { - name: "蟲Z絕對捕食迴旋斬", - effect: "通過Z力量將吐出的絲線全\n力束縛對手。威力會根據原\n來的招式而改變", - }, - savageSpinOutSpecial: { - name: "蟲Z絕對捕食迴旋斬", - effect: "通過Z力量將吐出的絲線全\n力束縛對手。威力會根據原\n來的招式而改變", - }, - neverEndingNightmarePhysical: { - name: "幽靈Z無盡暗夜之誘惑", - effect: "通過Z力量召喚強烈的怨念,\n全力降臨到對手身上。威\n力會根據原來的招式而改變", - }, - neverEndingNightmareSpecial: { - name: "幽靈Z無盡暗夜之誘惑", - effect: "通過Z力量召喚強烈的怨念,\n全力降臨到對手身上。威\n力會根據原來的招式而改變", - }, - corkscrewCrashPhysical: { - name: "鋼Z超絕螺旋連擊", - effect: "通過Z力量進行高速旋轉,\n全力撞上對手。威力會根據\n原來的招式而改變", - }, - corkscrewCrashSpecial: { - name: "鋼Z超絕螺旋連擊", - effect: "通過Z力量進行高速旋轉,\n全力撞上對手。威力會根據\n原來的招式而改變", - }, - infernoOverdrivePhysical: { - name: "火Z超強極限爆焰彈", - effect: "通過Z力量噴出熊熊烈火,\n全力撞向對手。威力會根據\n原來的招式而改變", - }, - infernoOverdriveSpecial: { - name: "火Z超強極限爆焰彈", - effect: "通過Z力量噴出熊熊烈火,\n全力撞向對手。威力會根據\n原來的招式而改變", - }, - hydroVortexPhysical: { - name: "水Z超級水流大漩渦", - effect: "通過Z力量製造大大的潮旋,\n全力吞沒對手。威力會根\n據原來的招式而改變", - }, - hydroVortexSpecial: { - name: "水Z超級水流大漩渦", - effect: "通過Z力量製造大大的潮旋,\n全力吞沒對手。威力會根\n據原來的招式而改變", - }, - bloomDoomPhysical: { - name: "草Z絢爛繽紛花怒放", - effect: "通過Z力量藉助花草的能量,\n全力攻擊對手。威力會根\n據原來的招式而改變", - }, - bloomDoomSpecial: { - name: "草Z絢爛繽紛花怒放", - effect: "通過Z力量藉助花草的能量,\n全力攻擊對手。威力會根\n據原來的招式而改變", - }, - gigavoltHavocPhysical: { - name: "電Z終極伏特狂雷閃", - effect: "通過Z力量將蓄積的強大電\n流全力撞向對手。威力會根\n據原來的招式而改變", - }, - gigavoltHavocSpecial: { - name: "電Z終極伏特狂雷閃", - effect: "通過Z力量將蓄積的強大電\n流全力撞向對手。威力會根\n據原來的招式而改變", - }, - shatteredPsychePhysical: { - name: "超能力Z至高精神破壞波", - effect: "通過Z力量操縱對手,全力\n使其感受到痛苦。威力會根\n據原來的招式而改變", - }, - shatteredPsycheSpecial: { - name: "超能力Z至高精神破壞波", - effect: "通過Z力量操縱對手,全力\n使其感受到痛苦。威力會根\n據原來的招式而改變", - }, - subzeroSlammerPhysical: { - name: "冰Z激狂大地萬里冰", - effect: "通過Z力量急劇降低氣溫,\n全力冰凍對手。威力會根據\n原來的招式而改變", - }, - subzeroSlammerSpecial: { - name: "冰Z激狂大地萬里冰", - effect: "通過Z力量急劇降低氣溫,\n全力冰凍對手。威力會根據\n原來的招式而改變", - }, - devastatingDrakePhysical: { - name: "龍Z究極巨龍震天地", - effect: "通過Z力量將氣場實體化,\n向對手全力發動襲擊。威力\n會根據原來的招式而改變", - }, - devastatingDrakeSpecial: { - name: "龍Z究極巨龍震天地", - effect: "通過Z力量將氣場實體化,\n向對手全力發動襲擊。威力\n會根據原來的招式而改變", - }, - blackHoleEclipsePhysical: { - name: "惡Z黑洞吞噬萬物滅", - effect: "通過Z力量收集惡能量,全\n力將對手吸入。威力會根據\n原來的招式而改變", - }, - blackHoleEclipseSpecial: { - name: "惡Z黑洞吞噬萬物滅", - effect: "通過Z力量收集惡能量,全\n力將對手吸入。威力會根據\n原來的招式而改變", - }, - twinkleTacklePhysical: { - name: "妖精Z可愛星星飛天撞", - effect: "通過Z力量製造魅惑空間,\n全力捉弄對手。威力會根據\n原來的招式而改變", - }, - twinkleTackleSpecial: { - name: "妖精Z可愛星星飛天撞", - effect: "通過Z力量製造魅惑空間,\n全力捉弄對手。威力會根據\n原來的招式而改變", - }, - catastropika: { - name: "皮卡丘Z皮卡皮卡必殺擊", - effect: "通過Z力量,皮卡丘全身覆\n蓋最強電力,全力猛撲對手", - }, - shoreUp: { - name: "集沙", - effect: "回覆自己最大HP的一半。\n在沙暴中回覆得更多", - }, - firstImpression: { - name: "迎頭一擊", - effect: "威力很高的招式,但只有在\n出場戰鬥時,立刻使出才能\n成功", - }, - banefulBunker: { - name: "碉堡", - effect: "防住對手攻擊的同時,讓接\n觸到自己的對手中毒", - }, - spiritShackle: { - name: "縫影", - effect: "攻擊的同時,縫住對手的影\n子,使其無法逃走", - }, - darkestLariat: { - name: "DD金勾臂", - effect: "旋轉雙臂打向對手。無視對\n手的能力變化,直接給予傷\n害", - }, - sparklingAria: { - name: "泡影的詠歎調", - effect: "隨着唱歌會放出很多氣球。\n受到此招式攻擊時,灼傷會\n被治癒", - }, - iceHammer: { - name: "冰錘", - effect: "揮舞強力而沉重的拳頭,給\n予對手傷害。自己的速度會\n降低", - }, - floralHealing: { - name: "花療", - effect: "回覆對手最大HP的一半。\n在青草場地時,效果會提高", - }, - highHorsepower: { name: "十萬馬力", effect: "使出全身力量,猛攻對手" }, - strengthSap: { - name: "吸取力量", - effect: "給自己回覆和對手攻擊力相\n同數值的HP,然後降低對\n手的攻擊", - }, - solarBlade: { - name: "日光刃", - effect: "第1回合收集滿滿的日光,\n第2回合將此力量集中在劍\n上進行攻擊", - }, - leafage: { name: "樹葉", effect: "將葉片打向對手,進行攻擊" }, - spotlight: { - name: "聚光燈", - effect: "給寶可夢打上聚光燈,該回\n合只能瞄準該寶可夢", - }, - toxicThread: { - name: "毒絲", - effect: "將混有毒的絲吐向對手。使\n其中毒,從而降低對手的速\n度", - }, - laserFocus: { name: "磨礪", effect: "集中精神,下次攻擊必定會\n擊中要害" }, - gearUp: { - name: "輔助齒輪", - effect: "啓動齒輪,提高特性爲正電\n和負電的寶可夢的攻擊和特\n攻", - }, - throatChop: { - name: "深淵突刺", - effect: "受到此招式攻擊的對手,會\n因爲地獄般的痛苦,在2回\n合內,變得無法使出聲音類\n招式", - }, - pollenPuff: { - name: "花粉團", - effect: "對敵人使用是會爆炸的糰子。\n對我方使用則是給予回覆\n的糰子", - }, - anchorShot: { - name: "擲錨", - effect: "將錨纏住對手進行攻擊。使\n對手無法逃走", - }, - psychicTerrain: { - name: "精神場地", - effect: "在5回合內,地面上的寶可\n夢不會受到先制招式的攻擊。\n超能力屬性的招式威力會\n提高", - }, - lunge: { - name: "猛撲", - effect: "全力猛撲對手進行攻擊。從\n而降低對手的攻擊", - }, - fireLash: { - name: "火焰鞭", - effect: "用燃燒的鞭子抽打對手。受\n到攻擊的對手防禦會降低", - }, - powerTrip: { - name: "囂張", - effect: "耀武揚威地攻擊對手,自己\n的能力提高得越多,威力就\n越大", - }, - burnUp: { - name: "燃盡", - effect: "將自己全身燃燒起火焰來,\n給予對手大大的傷害。自己\n的火屬性將會消失", - }, - speedSwap: { name: "速度互換", effect: "將對手和自己的速度進行互\n換" }, - smartStrike: { - name: "修長之角", - effect: "用尖尖的角刺入對手進行攻\n擊。攻擊必定會命中", - }, - purify: { - name: "淨化", - effect: "治癒對手的異常狀態。治癒\n後可以回覆自己的HP", - }, - revelationDance: { - name: "覺醒之舞", - effect: "全力跳舞進行攻擊。此招式\n的屬性將變得和自己的屬性\n相同", - }, - coreEnforcer: { - name: "核心懲罰者", - effect: "如果給予過傷害的對手已經\n結束行動,其特性就會被消\n除", - }, - tropKick: { - name: "熱帶踢", - effect: "向對手使出來自南國的火熱\n腳踢。從而降低對手的攻擊", - }, - instruct: { - name: "號令", - effect: "向對手下達指示,讓其再次\n使出剛纔的招式", - }, - beakBlast: { - name: "鳥嘴加農炮", - effect: "先加熱鳥嘴後再進行攻擊。\n鳥嘴在加熱時對手觸碰的話,\n就會使其灼傷", - }, - clangingScales: { - name: "鱗片噪音", - effect: "摩擦全身鱗片,發出響亮的\n聲音進行攻擊。攻擊後自己\n的防禦會降低", - }, - dragonHammer: { - name: "龍錘", - effect: "將身體當作錘子,向對手發\n動襲擊,給予傷害", - }, - brutalSwing: { - name: "狂舞揮打", - effect: "用自己的身體狂舞揮打,給\n予對手傷害", - }, - auroraVeil: { - name: "極光幕", - effect: "在5回合內減弱物理和特殊\n的傷害。只有下雪時才能使\n出", - }, - sinisterArrowRaid: { - name: "狙射樹梟Z遮天蔽日暗影箭", - effect: "通過Z力量製造出無數箭的\n狙射樹梟將全力射穿對手進\n行攻擊", - }, - maliciousMoonsault: { - name: "熾焰咆哮虎Z極惡飛躍粉碎擊", - effect: "通過Z力量得到強壯肉體的\n熾焰咆哮虎將全力撞向對手\n進行攻擊", - }, - oceanicOperetta: { - name: "西獅海壬Z海神莊嚴交響樂", - effect: "通過Z力量召喚大量水的西\n獅海壬將全力攻擊對手", - }, - guardianOfAlola: { - name: "卡璞Z巨人衛士・阿羅拉", - effect: "通過Z力量得到阿羅拉之力\n的土地神寶可夢將全力進行\n攻擊。對手的剩餘HP會減\n少很多", - }, - soulStealing7StarStrike: { - name: "瑪夏多Z七星奪魂腿", - effect: "得到Z力量的瑪夏多將全力\n使出拳頭和腳踢的連續招式\n叩打對手", - }, - stokedSparksurfer: { - name: "阿羅雷Z駕雷馭電戲衝浪", - effect: "得到Z力量的阿羅拉地區的\n雷丘將全力進行攻擊。從而\n讓對手陷入麻痹狀態", - }, - pulverizingPancake: { - name: "卡比獸Z認真起來大爆擊", - effect: "通過Z力量使得認真起來的\n卡比獸躍動巨大身軀,全力\n向對手發動襲擊", - }, - extremeEvoboost: { - name: "伊布Z九彩昇華齊聚頂", - effect: "得到Z力量的伊布將藉助進\n化後夥伴們的力量,大幅提\n高能力", - }, - genesisSupernova: { - name: "夢幻Z起源超新星大爆炸", - effect: "得到Z力量的夢幻將全力攻\n擊對手。腳下會變成精神場\n地", - }, - shellTrap: { - name: "陷阱甲殼", - effect: "設下甲殼陷阱。如果對手使\n出物理招式,陷阱就會爆炸\n並給予對手傷害", - }, - fleurCannon: { - name: "花朵加農炮", - effect: "放出強力光束後,自己的特\n攻會大幅降低", - }, - psychicFangs: { - name: "精神之牙", - effect: "利用精神力量咬住對手進行\n攻擊。還可以破壞光牆和反\n射壁等", - }, - stompingTantrum: { - name: "跺腳", - effect: "化悔恨爲力量進行攻擊。如\n果上一回合招式沒有打中,\n威力就會翻倍", - }, - shadowBone: { - name: "暗影之骨", - effect: "用附有靈魂的骨頭毆打對手\n進行攻擊。有時會降低對手\n的防禦", - }, - accelerock: { - name: "衝巖", - effect: "迅速撞向對手進行攻擊。必\n定能夠先制攻擊", - }, - liquidation: { - name: "水流裂破", - effect: "用水之力量撞向對手進行攻\n擊。有時會降低對手的防禦", - }, - prismaticLaser: { - name: "棱鏡鐳射", - effect: "用棱鏡的力量發射強烈光線。\n下一回合自己將無法動彈", - }, - spectralThief: { - name: "暗影偷盜", - effect: "潛入對手的影子進行攻擊。\n會奪取對手的能力提升", - }, - sunsteelStrike: { - name: "流星閃衝", - effect: "以流星般的氣勢猛撞對手。\n可以無視對手的特性進行攻\n擊", - }, - moongeistBeam: { - name: "暗影之光", - effect: "放出奇怪的光線攻擊對手。\n可以無視對手的特性進行攻\n擊", - }, - tearfulLook: { - name: "淚眼汪汪", - effect: "變得淚眼汪汪,讓對手喪失\n鬥志。從而降低對手的攻擊\n和特攻", - }, - zingZap: { - name: "麻麻刺刺", - effect: "撞向對手,併發出強電,使\n其感到麻麻刺刺的。有時會\n使對手畏縮", - }, - naturesMadness: { - name: "自然之怒", - effect: "向對手釋放自然之怒。對手\n的HP會減半", - }, - multiAttack: { - name: "多屬性攻擊", - effect: "一邊覆蓋高能量,一邊撞向\n對手進行攻擊。根據存儲碟\n不同,屬性會改變", - }, - tenMillionVoltThunderbolt: { - name: "智皮卡Z千萬伏特", - effect: "戴着帽子的皮卡丘將通過Z\n力量增強的電擊全力釋放給\n對手。容易擊中要害", - }, - mindBlown: { - name: "驚爆大頭", - effect: "讓自己的頭爆炸,來攻擊周\n圍的一切。自己也會受到傷\n害", - }, - plasmaFists: { - name: "等離子閃電拳", - effect: "用覆蓋着電流的拳頭進行攻\n擊。使一般屬性的招式變成\n電屬性", - }, - photonGeyser: { - name: "光子噴湧", - effect: "用光柱來進行攻擊。比較自\n己的攻擊和特攻,用數值相\n對較高的一項給予對方傷害", - }, - lightThatBurnsTheSky: { - name: "究極奈克洛Z焚天滅世熾光爆", - effect: "奈克洛茲瑪會無視對手的特\n性效果,在攻擊和特攻之間,\n用數值相對較高的一項給\n予對方傷害", - }, - searingSunrazeSmash: { - name: "索爾迦雷歐Z日光迴旋下蒼穹", - effect: "得到Z力量的索爾迦雷歐將\n全力進行攻擊。可以無視對\n手的特性效果", - }, - menacingMoonrazeMaelstrom: { - name: "露奈雅拉Z月華飛濺落靈霄", - effect: "得到Z力量的露奈雅拉將全\n力進行攻擊。可以無視對手\n的特性效果", - }, - letsSnuggleForever: { - name: "謎擬丘Z親密無間大亂揍", - effect: "得到Z力量的謎擬Q將全力\n進行亂揍攻擊", - }, - splinteredStormshards: { - name: "鬃巖狼人Z狼嘯石牙颶風暴", - effect: "得到Z力量的鬃巖狼人將全\n力進行攻擊。而且會消除場\n地狀態", - }, - clangorousSoulblaze: { - name: "杖尾鱗甲龍Z熾魂熱舞烈音爆", - effect: "得到Z力量的杖尾鱗甲龍將\n全力攻擊對手。並且自己的\n能力會提高", - }, - zippyZap: { - name: "電電加速", - effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.", - }, - splishySplash: { - name: "滔滔衝浪", - effect: "往巨浪中注入電能後衝撞對\n手進行攻擊。有時會讓對手\n陷入麻痹狀態", - }, - floatyFall: { - name: "飄飄墜落", - effect: "輕飄飄地浮起來後,再猛地\n俯衝下去進行攻擊。有時會\n使對手畏縮", - }, - pikaPapow: { - name: "閃閃雷光", - effect: "皮卡丘越喜歡訓練家,電擊\n的威力就越強。攻擊必定會\n命中", - }, - bouncyBubble: { - name: "活活氣泡", - effect: "投擲水球進行攻擊。吸水後\n能回覆等同於造成的傷害\n的HP", - }, - buzzyBuzz: { - name: "麻麻電擊", - effect: "放出電擊攻擊對手。讓對手\n陷入麻痹狀態", - }, - sizzlySlide: { - name: "熊熊火爆", - effect: "用燃起大火的身體猛烈地衝\n撞對手。讓對手陷入灼傷狀\n態", - }, - glitzyGlow: { - name: "嘩嘩氣場", - effect: "利用念力強攻,粉碎對方信\n心。製造一道能減弱對手特\n殊攻擊的神奇牆壁", - }, - baddyBad: { - name: "壞壞領域", - effect: "惡行惡相地進行攻擊。製造\n一道能減弱對手物理攻擊的\n神奇牆壁", - }, - sappySeed: { - name: "茁茁炸彈", - effect: "長出巨大的藤蔓,播撒種子\n進行攻擊。種子每回合都會\n吸取對手的HP", - }, - freezyFrost: { - name: "冰冰霜凍", - effect: "利用冰冷的黑霧結晶進行攻\n擊。使全體寶可夢的能力變\n回原點", - }, - sparklySwirl: { - name: "亮亮風暴", - effect: "利用芬芳刺鼻的龍捲風吞噬\n對方。能治癒我方寶可夢的\n異常狀態", - }, - veeveeVolley: { - name: "砰砰擊破", - effect: "伊布越喜歡訓練家,衝撞的\n威力就越強。攻擊必定會命\n中", - }, - doubleIronBash: { - name: "鋼拳雙擊", - effect: "以胸口的螺帽爲中心旋轉,\n並連續2次揮動手臂打擊對\n手。有時會使對手畏縮", - }, - maxGuard: { - name: "極巨防壁", - effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", - }, - dynamaxCannon: { - name: "極巨炮", - effect: "將凝縮在體內的能量從核心\n放出進行攻擊", - }, - snipeShot: { - name: "狙擊", - effect: "能無視具有吸引對手招式效\n果的特性或招式的影響。可\n以向選定的對手進行攻擊", - }, - jawLock: { - name: "緊咬不放", - effect: "使雙方直到一方昏厥爲止無\n法替換寶可夢。其中一方退\n場則可以解除效果", - }, - stuffCheeks: { name: "大快朵頤", effect: "喫掉攜帶的樹果,大幅提高\n防禦" }, - noRetreat: { - name: "背水一戰", - effect: "提高自己的所有能力,但無\n法替換或逃走", - }, - tarShot: { - name: "瀝青射擊", - effect: "潑灑黏糊糊的瀝青,降低對\n手的速度。火屬性會變成對\n手的弱點", - }, - magicPowder: { - name: "魔法粉", - effect: "向對手噴灑魔法粉,使對手\n變爲超能力屬性", - }, - dragonDarts: { - name: "龍箭", - effect: "讓多龍梅西亞進行2次攻擊。\n如果對手有2隻寶可夢,\n則對它們各進行1次攻擊", - }, - teatime: { - name: "茶會", - effect: "舉辦一場茶會,場上的所有\n寶可夢都會喫掉自己攜帶的\n樹果", - }, - octolock: { - name: "蛸固", - effect: "讓對手無法逃走。對手被固\n定後,每回合都會降低防禦\n和特防", - }, - boltBeak: { - name: "電喙", - effect: "用帶電的喙啄刺對手。如果\n比對手先出手攻擊,招式的\n威力會變成2倍", - }, - fishiousRend: { - name: "鰓咬", - effect: "用堅硬的腮咬住對手。如果\n比對手先出手攻擊,招式的\n威力會變成2倍", - }, - courtChange: { name: "換場", effect: "用神奇的力量交換雙方的場\n地效果" }, - maxFlare: { - name: "極巨火爆", - effect: "極巨化寶可夢使出的火屬性\n攻擊。可在5回合內讓日照\n變得強烈", - }, - maxFlutterby: { - name: "極巨蟲蠱", - effect: "極巨化寶可夢使出的蟲屬性\n攻擊。會降低對手的特攻", - }, - maxLightning: { - name: "極巨閃電", - effect: "極巨化寶可夢使出的電屬性\n攻擊。可在5回合內將腳下\n變成電氣場地", - }, - maxStrike: { - name: "極巨攻擊", - effect: "極巨化寶可夢使出的一般屬\n性攻擊。會降低對手的速度", - }, - maxKnuckle: { - name: "極巨拳鬥", - effect: "極巨化寶可夢使出的格鬥屬\n性攻擊。會提高我方的攻擊", - }, - maxPhantasm: { - name: "極巨幽魂", - effect: "極巨化寶可夢使出的幽靈屬\n性攻擊。會降低對手的防禦", - }, - maxHailstorm: { - name: "極巨寒冰", - effect: "極巨化寶可夢使出的冰屬性\n攻擊。在5回合內會下雪", - }, - maxOoze: { - name: "極巨酸毒", - effect: "極巨化寶可夢使出的毒屬性\n攻擊。會提高我方的特攻", - }, - maxGeyser: { - name: "極巨水流", - effect: "極巨化寶可夢使出的水屬性\n攻擊。可在5回合內降下大\n雨", - }, - maxAirstream: { - name: "極巨飛衝", - effect: "極巨化寶可夢使出的飛行屬\n性攻擊。會提高我方的速度", - }, - maxStarfall: { - name: "極巨妖精", - effect: "極巨化寶可夢使出的妖精屬\n性攻擊。可在5回合內將腳\n下變成薄霧場地", - }, - maxWyrmwind: { - name: "極巨龍騎", - effect: "極巨化寶可夢使出的龍屬性\n攻擊。會降低對手的攻擊", - }, - maxMindstorm: { - name: "極巨超能", - effect: "極巨化寶可夢使出的超能力\n屬性攻擊。可在5回合內將\n腳下變成精神場地", - }, - maxRockfall: { - name: "極巨岩石", - effect: "極巨化寶可夢使出的岩石屬\n性攻擊。可在5回合內捲起\n沙暴", - }, - maxQuake: { - name: "極巨大地", - effect: "極巨化寶可夢使出的地面屬\n性攻擊。會提高我方的特防", - }, - maxDarkness: { - name: "極巨惡霸", - effect: "極巨化寶可夢使出的惡屬性\n攻擊。會降低對手的特防", - }, - maxOvergrowth: { - name: "極巨草原", - effect: "極巨化寶可夢使出的草屬性\n攻擊。可在5回合內將腳下\n變成青草場地", - }, - maxSteelspike: { - name: "極巨鋼鐵", - effect: "極巨化寶可夢使出的鋼屬性\n攻擊。會提高我方的防禦", - }, - clangorousSoul: { - name: "魂舞烈音爆", - effect: "削減少許自己的HP,使所\n有能力都提高", - }, - bodyPress: { - name: "撲擊", - effect: "用身體撞向對手進行攻擊。\n防禦越高,給予的傷害就越\n高", - }, - decorate: { name: "裝飾", effect: "通過裝飾,大幅提高對方的\n攻擊和特攻" }, - drumBeating: { - name: "鼓擊", - effect: "用鼓點來控制鼓的根部進行\n攻擊,從而降低對手的速度", - }, - snapTrap: { - name: "捕獸夾", - effect: "使用捕獸夾,在4~5回合\n內,夾住對手進行攻擊", - }, - pyroBall: { - name: "火焰球", - effect: "點燃小石子,形成火球攻擊\n對手。有時會使對手陷入灼\n傷狀態", - }, - behemothBlade: { - name: "巨獸斬", - effect: "以全身力氣舉起強大的劍,\n猛烈地劈向對手進行攻擊", - }, - behemothBash: { - name: "巨獸彈", - effect: "將全身變化爲堅固的盾,猛\n烈地撞向對手進行攻擊", - }, - auraWheel: { - name: "氣場輪", - effect: "用儲存在頰囊裏的能量進行\n攻擊,並提高自己的速度。\n其屬性會隨着莫魯貝可的樣\n子而改變", - }, - breakingSwipe: { - name: "廣域破壞", - effect: "用堅韌的尾巴猛掃對手進行\n攻擊,從而降低對手的攻擊", - }, - branchPoke: { - name: "木枝突刺", - effect: "使用尖銳的樹枝刺向對手進\n行攻擊", - }, - overdrive: { - name: "破音", - effect: "奏響吉他和貝斯,釋放出發\n出巨響的劇烈震動攻擊對手", - }, - appleAcid: { - name: "蘋果酸", - effect: "使用從酸蘋果中提取出來的\n酸性液體進行攻擊。降低對\n手的特防", - }, - gravApple: { - name: "萬有引力", - effect: "從高處落下蘋果,給予對手\n傷害。可降低對手的防禦", - }, - spiritBreak: { - name: "靈魂衝擊", - effect: "用足以讓對手一蹶不振的氣\n勢進行攻擊。會降低對手的\n特攻", - }, - strangeSteam: { - name: "神奇蒸汽", - effect: "噴出煙霧攻擊對手。有時會\n使對手混亂", - }, - lifeDew: { - name: "生命水滴", - effect: "噴灑出神奇的水,回覆自己\n和場上同伴的HP", - }, - obstruct: { - name: "攔堵", - effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗。一旦觸碰,\n防禦就會大幅降低", - }, - falseSurrender: { - name: "假跪真撞", - effect: "裝作低頭認錯的樣子,用凌\n亂的頭髮進行突刺。攻擊必\n定會命中", - }, - meteorAssault: { - name: "流星突擊", - effect: "大力揮舞粗壯的莖進行攻擊。\n但同時自己也會被晃暈,\n下一回合自己將無法動彈", - }, - eternabeam: { - name: "無極光束", - effect: "無極汰那變回原來的樣子後,\n發動的最強攻擊。下一回\n合自己將無法動彈", - }, - steelBeam: { - name: "鐵蹄光線", - effect: "將從全身聚集的鋼鐵化爲光\n束,激烈地發射出去。自己\n也會受到傷害", - }, - expandingForce: { - name: "廣域戰力", - effect: "利用精神力量攻擊對手。在\n精神場地上威力會有所提高,\n能對所有對手造成傷害", - }, - steelRoller: { - name: "鐵滾輪", - effect: "在破壞場地的同時攻擊對手。\n如果腳下沒有任何場地狀\n態存在,使出此招式時便會\n失敗", - }, - scaleShot: { - name: "鱗射", - effect: "發射鱗片進行攻擊。連續攻\n擊2~5次。速度會提高但\n防禦會降低", - }, - meteorBeam: { - name: "流星光束", - effect: "第1回合聚集宇宙之力提高\n特攻,第2回合攻擊對手", - }, - shellSideArm: { - name: "臂貝武器", - effect: "從物理攻擊和特殊攻擊中選\n擇可造成較多傷害的方式進\n行攻擊。有時會讓對手陷入\n中毒狀態", - }, - mistyExplosion: { - name: "薄霧炸裂", - effect: "對自己周圍的所有寶可夢進\n行攻擊,但使出後,自己會\n陷入昏厥。在薄霧場地上,\n招式威力會提高", - }, - grassyGlide: { - name: "青草滑梯", - effect: "彷彿在地面上滑行般地攻擊\n對手。在青草場地上,必定\n能夠先制攻擊", - }, - risingVoltage: { - name: "電力上升", - effect: "用從地面升騰而起的電擊進\n行攻擊。當對手處於電氣場\n地上時,招式威力會變成2\n倍", - }, - terrainPulse: { - name: "大地波動", - effect: "藉助場地的力量進行攻擊。\n視使出招式時場地狀態不同,\n招式的屬性和威力會有所\n變化", - }, - skitterSmack: { - name: "爬擊", - effect: "從對手背後爬近後進行攻擊。\n會降低對手的特攻", - }, - burningJealousy: { - name: "妒火", - effect: "用嫉妒的能量攻擊對手。會\n讓在該回合內能力有所提高\n的寶可夢陷入灼傷狀態", - }, - lashOut: { - name: "泄憤", - effect: "攻擊對手以發泄對其感到的\n惱怒情緒。如果在該回合內\n自身能力遭到降低,招式的\n威力會變成2倍", - }, - poltergeist: { - name: "靈騷", - effect: "操縱對手的持有物進行攻擊。\n當對手沒有攜帶道具時,\n使出此招式時便會失敗", - }, - corrosiveGas: { - name: "腐蝕氣體", - effect: "用具有強酸性的氣體包裹住\n自己周圍所有的寶可夢,並\n融化其所攜帶的道具", - }, - coaching: { - name: "指導", - effect: "通過進行正確合理的指導,\n提高我方全員的攻擊和防禦", - }, - flipTurn: { - name: "快速折返", - effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", - }, - tripleAxel: { - name: "三旋擊", - effect: "連續3次踢對手進行攻擊。\n每踢中一次,威力就會提高", - }, - dualWingbeat: { - name: "雙翼", - effect: "將翅膀撞向對手進行攻擊。\n連續2次給予傷害", - }, - scorchingSands: { - name: "熱沙大地", - effect: "將滾燙的沙子砸向對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", - }, - jungleHealing: { - name: "叢林治療", - effect: "與叢林融爲一體,回覆自己\n和場上同伴的HP和狀態", - }, - wickedBlow: { - name: "闇冥強擊", - effect: "將惡之流派修煉至大成的猛\n烈一擊。必定會擊中要害", - }, - surgingStrikes: { - name: "水流連打", - effect: "將水之流派修煉至大成的仿\n若行雲流水般的3次連擊。\n必定會擊中要害", - }, - thunderCage: { - name: "雷電囚籠", - effect: "將對手困在電流四濺的囚籠\n中,在4~5回合內進行攻\n擊", - }, - dragonEnergy: { - name: "巨龍威能", - effect: "把生命力轉換爲力量攻擊對\n手。自己的HP越少,招式\n的威力越小", - }, - freezingGlare: { - name: "冰冷視線", - effect: "從雙眼發射精神力量進行攻\n擊。有時會讓對手陷入冰凍\n狀態", - }, - fieryWrath: { - name: "怒火中燒", - effect: "將憤怒轉化爲火焰般的氣場\n進行攻擊。有時會使對手畏\n縮", - }, - thunderousKick: { - name: "雷鳴蹴擊", - effect: "以雷電般的動作戲耍對手的\n同時使出腳踢。可降低對手\n的防禦", - }, - glacialLance: { - name: "雪矛", - effect: "向對手投擲掀起暴風雪的冰\n矛進行攻擊", - }, - astralBarrage: { name: "星碎", effect: "用大量的小靈體向對手發起\n攻擊" }, - eerieSpell: { - name: "詭異咒語", - effect: "用強大的精神力量攻擊。讓\n對手最後使用的招式減少3\nPP", - }, - direClaw: { - name: "克命爪", - effect: "以破滅之爪進行攻擊。有時\n還會讓對手陷入中毒、麻痹\n、睡眠之中的一種狀態", - }, - psyshieldBash: { - name: "屏障猛攻", - effect: "讓意念的能量覆蓋全身,撞\n向對手進行攻擊。會提高自\n己的防禦", - }, - powerShift: { name: "力量轉換", effect: "將自己的攻擊與防禦互相交\n換" }, - stoneAxe: { - name: "巖斧", - effect: "用岩石之斧進行攻擊。散落\n的岩石碎片會飄浮在對手周\n圍", - }, - springtideStorm: { - name: "陽春風暴", - effect: "用交織着愛與恨的烈風席捲\n對手進行攻擊。有時會降低\n對手的攻擊", - }, - mysticalPower: { - name: "神祕之力", - effect: "放出不可思議的力量攻擊。\n會提高自己的特攻", - }, - ragingFury: { - name: "大憤慨", - effect: "在2~3回合內,一邊放出\n火焰,一邊瘋狂亂打。大鬧\n一番後自己會陷入混亂", - }, - waveCrash: { - name: "波動衝", - effect: "讓水覆蓋全身後撞向對手。\n自己也會受到不少傷害", - }, - chloroblast: { - name: "葉綠爆震", - effect: "將自己的葉綠素凝聚起來後\n放出去進行攻擊。自己也會\n受到傷害", - }, - mountainGale: { - name: "冰山風", - effect: "將冰山般巨大的冰塊砸向對\n手進行攻擊。有時會使對手\n畏縮", - }, - victoryDance: { - name: "勝利之舞", - effect: "激烈地跳起喚來勝利的舞蹈,\n提高自己的攻擊、防禦和\n速度", - }, - headlongRush: { - name: "突飛猛撲", - effect: "向對手使出灌注了全心全力\n的撞擊。自己的防禦和特防\n會降低", - }, - barbBarrage: { - name: "毒千針", - effect: "用無數的毒針進行攻擊。有\n時還會讓對手陷入中毒狀態。\n攻擊處於中毒狀態的對手\n時,威力會變成2倍", - }, - esperWing: { - name: "氣場之翼", - effect: "用經過氣場強化的翅膀撕裂\n對手。容易擊中要害。會提\n高自己的速度", - }, - bitterMalice: { - name: "冤冤相報", - effect: "用令人毛骨悚然的怨念進行\n攻擊。會降低對手的攻擊", - }, - shelter: { - name: "閉關", - effect: "將皮膚變得堅硬如鐵盾,從\n而大幅提高自己的防禦", - }, - tripleArrows: { - name: "三連箭", - effect: "使出一記腿技後同時發射3\n箭。有時會降低對手的防禦\n或使對手畏縮。容易擊中要\n害", - }, - infernalParade: { - name: "羣魔亂舞", - effect: "用無數的火球進行攻擊。有\n時會讓對手陷入灼傷狀態。\n攻擊處於異常狀態的對手時,\n威力會變成2倍", - }, - ceaselessEdge: { - name: "祕劍・千重濤", - effect: "用貝殼之劍進行攻擊。散落\n的貝殼碎片會散落在對手腳\n下成爲撒菱", - }, - bleakwindStorm: { - name: "枯葉風暴", - effect: "用足以讓身心都止不住顫抖\n的冰冷狂風進行攻擊。有時\n會降低對手的速度", - }, - wildboltStorm: { - name: "鳴雷風暴", - effect: "呼喚雷雲引起風暴,用雷與\n風進行激烈的攻擊。有時會\n讓對手陷入麻痹狀態", - }, - sandsearStorm: { - name: "熱沙風暴", - effect: "用灼熱的沙子和強烈的風席\n卷對手進行攻擊。有時會讓\n對手陷入灼傷狀態", - }, - lunarBlessing: { - name: "新月祈禱", - effect: "向新月獻上祈禱,回覆自己\n和場上同伴的HP和狀態", - }, - takeHeart: { - name: "勇氣填充", - effect: "鼓起衝勁,治癒自己的異常\n狀態,同時提高自己的特攻\n和特防", - }, - gMaxWildfire: { - name: "超極巨深淵滅焰", - effect: "超極巨化的噴火龍使出的火\n屬性攻擊。可在4回合內給\n予對手傷害", - }, - gMaxBefuddle: { - name: "超極巨蝶影蠱惑", - effect: "超極巨化的巴大蝶使出的蟲\n屬性攻擊。會讓對手陷入中\n毒、麻痹或睡眠狀態", - }, - gMaxVoltCrash: { - name: "超極鉅萬雷轟頂", - effect: "超極巨化的皮卡丘使出的電\n屬性攻擊。會讓對手陷入麻\n痹狀態", - }, - gMaxGoldRush: { - name: "超極巨特大金幣", - effect: "超極巨化的喵喵使出的一般\n屬性攻擊。會讓對手陷入混\n亂狀態,並可獲得金錢", - }, - gMaxChiStrike: { - name: "超極巨會心一擊", - effect: "超極巨化的怪力使出的格鬥\n屬性攻擊。會變得容易擊中\n要害", - }, - gMaxTerror: { - name: "超極巨幻影幽魂", - effect: "超極巨化的耿鬼使出的幽靈\n屬性攻擊。會踩住對手的影\n子,讓其無法被替換", - }, - gMaxResonance: { - name: "超極巨極光旋律", - effect: "超極巨化的拉普拉斯使出的\n冰屬性攻擊。可在5回合內\n減弱受到的傷害", - }, - gMaxCuddle: { - name: "超極巨熱情擁抱", - effect: "超極巨化的伊布使出的一般\n屬性攻擊。會讓對手陷入着\n迷狀態", - }, - gMaxReplenish: { - name: "超極巨資源再生", - effect: "超極巨化的卡比獸使出的一\n般屬性攻擊。會讓喫掉的樹\n果再生", - }, - gMaxMalodor: { - name: "超極巨臭氣沖天", - effect: "超極巨化的灰塵山使出的毒\n屬性攻擊。會讓對手陷入中\n毒狀態", - }, - gMaxStonesurge: { - name: "超極巨巖陣以待", - effect: "超極巨化的暴噬龜使出的水\n屬性攻擊。會發射無數銳利\n的岩石", - }, - gMaxWindRage: { - name: "超極巨旋風襲捲", - effect: "超極巨化的鋼鎧鴉使出的飛\n行屬性攻擊。可消除反射壁\n和光牆", - }, - gMaxStunShock: { - name: "超極巨異毒電場", - effect: "超極巨化的顫弦蠑螈使出的\n電屬性攻擊。會讓對手陷入\n中毒或麻痹狀態", - }, - gMaxFinale: { - name: "超極巨幸福圓滿", - effect: "超極巨化的霜奶仙使出的妖\n精屬性攻擊。可回覆我方的\nHP", - }, - gMaxDepletion: { - name: "超極巨劣化衰變", - effect: "超極巨化的鋁鋼龍使出的龍\n屬性攻擊。可減少對手最後\n使用的招式的PP", - }, - gMaxGravitas: { - name: "超極巨天道七星", - effect: "超極巨化的以歐路普使出的\n超能力屬性攻擊。在5回合\n內重力會產生變化", - }, - gMaxVolcalith: { - name: "超極巨炎石噴發", - effect: "超極巨化的巨炭山使出的巖\n石屬性攻擊。可在4回合內\n給予對手傷害", - }, - gMaxSandblast: { - name: "超極巨沙塵漫天", - effect: "超極巨化的沙螺蟒使出的地\n面屬性攻擊。在4~5回合\n內會狂刮沙暴", - }, - gMaxSnooze: { - name: "超極巨睡魔降臨", - effect: "超極巨化的長毛巨魔使出的\n惡屬性攻擊。會通過打大哈\n欠讓對手產生睡意", - }, - gMaxTartness: { - name: "超極巨酸不溜丟", - effect: "超極巨化的蘋裹龍使出的草\n屬性攻擊。會降低對手的閃\n避率", - }, - gMaxSweetness: { - name: "超極巨瓊漿玉液", - effect: "超極巨化的豐蜜龍使出的草\n屬性攻擊。會治癒我方的異\n常狀態", - }, - gMaxSmite: { - name: "超極巨天譴雷誅", - effect: "超極巨化的布莉姆溫使出的\n妖精屬性攻擊。會讓對手陷\n入混亂狀態", - }, - gMaxSteelsurge: { - name: "超極巨鋼鐵陣法", - effect: "超極巨化的大王銅象使出的\n鋼屬性攻擊。會發射無數銳\n利的刺", - }, - gMaxMeltdown: { - name: "超極巨液金熔擊", - effect: "超極巨化的美錄梅塔使出的\n鋼屬性攻擊。會讓對手無法\n連續使出相同的招式", - }, - gMaxFoamBurst: { - name: "超極巨激漩泡渦", - effect: "超極巨化的巨鉗蟹使出的水\n屬性攻擊。會大幅降低對手\n的速度", - }, - gMaxCentiferno: { - name: "超極巨百火焚野", - effect: "超極巨化的焚焰蚣使出的火\n屬性攻擊。可在4~5回合\n內將對手困在火焰中", - }, - gMaxVineLash: { - name: "超極巨灰飛鞭滅", - effect: "超極巨化的妙蛙花使出的草\n屬性攻擊。可在4回合內給\n予對手傷害", - }, - gMaxCannonade: { - name: "超極巨水炮轟滅", - effect: "超極巨化的水箭龜使出的水\n屬性攻擊。可在4回合內給\n予對手傷害", - }, - gMaxDrumSolo: { - name: "超極巨狂擂亂打", - effect: "超極巨化的轟擂金剛猩使出\n的草屬性攻擊。不會受到對\n手特性的干擾", - }, - gMaxFireball: { - name: "超極巨破陣火球", - effect: "超極巨化的閃焰王牌使出的\n火屬性攻擊。不會受到對手\n特性的干擾", - }, - gMaxHydrosnipe: { - name: "超極巨狙擊神射", - effect: "超極巨化的千面避役使出的\n水屬性攻擊。不會受到對手\n特性的干擾", - }, - gMaxOneBlow: { - name: "超極巨奪命一擊", - effect: "超極巨化的武道熊師使出的\n惡屬性攻擊。是可以無視極\n巨防壁的一擊", - }, - gMaxRapidFlow: { - name: "超極巨流水連擊", - effect: "超極巨化的武道熊師使出的\n水屬性攻擊。是可以無視極\n巨防壁的連擊", - }, - teraBlast: { - name: "太晶爆發", - effect: "太晶化時,會放出太晶屬性\n的能量攻擊。比較自己的攻\n擊和特攻,用數值相對較高\n的一項給予對方傷害。(其\n他屬性)/用攻擊和特攻數\n值較高的一項給予傷害。對\n正處於太晶化的對手效果絕\n佳。自己的攻擊和特攻會降\n低。(星晶", - }, - silkTrap: { - name: "線阱", - effect: "用絲設置陷阱。防住對方攻\n擊的同時,能夠降低所接觸\n到的對手的速度", - }, - axeKick: { - name: "下壓踢", - effect: "將踢起的腳跟往下劈向對手\n進行攻擊。有時會使對手混\n亂。如果劈偏則自己會受到\n傷害", - }, - lastRespects: { - name: "掃墓", - effect: "爲了化解夥伴的悔恨而進行\n攻擊。被打倒的我方寶可夢\n越多,招式的威力越高", - }, - luminaCrash: { - name: "琉光衝激", - effect: "放出連精神都能影響到的奇\n妙怪光進行攻擊。會大幅降\n低對方的特防", - }, - orderUp: { - name: "上菜", - effect: "以瀟灑的身手進行攻擊。若\n口中有米立龍,會按其樣子\n提高能力", - }, - jetPunch: { - name: "噴射拳", - effect: "將激流覆蓋於拳頭,以肉眼\n無法辨識的速度打出拳擊。\n必定能夠先制攻擊", - }, - spicyExtract: { - name: "辣椒精華", - effect: "放出極爲辛辣的精華。對手\n的攻擊會大幅提高,防禦會\n大幅降低", - }, - spinOut: { - name: "疾速轉輪", - effect: "通過往腿上增加負荷,以激\n烈的旋轉給予對手傷害。自\n己的速度會大幅降低", - }, - populationBomb: { - name: "鼠數兒", - effect: "夥伴們會紛紛趕來集合,以\n羣體行動給予對手攻擊。連\n續命中1~10次", - }, - iceSpinner: { - name: "冰旋", - effect: "腳上覆蓋薄冰,旋轉着撞擊\n對手。通過旋轉的動作破壞\n場地", - }, - glaiveRush: { - name: "巨劍突擊", - effect: "有勇無謀的捨身突擊。使出\n招式後,對手的攻擊必定會\n命中,且傷害會變成2倍", - }, - revivalBlessing: { - name: "復生祈禱", - effect: "通過以慈愛之心祈禱,讓陷\n入昏厥的後備寶可夢以回覆\n一半HP的狀態復活", - }, - saltCure: { - name: "鹽醃", - effect: "使對手陷入鹽醃狀態,每回\n合給予對手傷害。對手爲鋼\n或水屬性時會更痛苦", - }, - tripleDive: { - name: "三連鑽", - effect: "以默契的跳躍濺起水花擊向\n對手。連續3次給予傷害", - }, - mortalSpin: { - name: "晶光轉轉", - effect: "通過旋轉來攻擊對手。可以\n擺脫綁緊、緊束、寄生種子\n等招式。還能讓對手陷入中\n毒狀態", - }, - doodle: { - name: "描繪", - effect: "把握並映射出對手的本質,\n讓自己和同伴寶可夢的特性\n變得和對手相同", - }, - filletAway: { - name: "甩肉", - effect: "削減自己的HP,大幅提高\n攻擊和特攻以及速度", - }, - kowtowCleave: { - name: "僕刀", - effect: "下跪讓對手大意後發起襲擊\n劈向對手。攻擊必定會命中", - }, - flowerTrick: { - name: "千變萬花", - effect: "將做了手腳的花束扔向對手\n進行攻擊。必定會命中,且\n會擊中要害", - }, - torchSong: { - name: "閃焰高歌", - effect: "如唱歌一樣噴出熊熊燃燒的\n火焰燒焦對手。會提高自己\n的特攻", - }, - aquaStep: { - name: "流水旋舞", - effect: "以盈盈欲滴的輕快步伐戲耍\n對手並給予其傷害。會提高\n自己的速度", - }, - ragingBull: { - name: "怒牛", - effect: "狂怒暴牛的猛烈衝撞。招式\n的屬性隨形態改變,光牆和\n反射壁等招式也能破壞", - }, - makeItRain: { - name: "淘金潮", - effect: "扔出大量硬幣攻擊。自己的\n特攻會降低,戰鬥後還可以\n拿到錢", - }, - psyblade: { - name: "精神劍", - effect: "用無形的利刃劈開對手。處\n於電氣場地時,招式威力會\n變成1.5倍", - }, - hydroSteam: { - name: "水蒸氣", - effect: "將煮得翻滾的開水猛烈地噴\n向對手。日照強烈時,招式\n威力不但不會降低,還會變\n成1.5倍", - }, - ruination: { - name: "大災難", - effect: "引發毀滅性的災厄,使對手\n的HP減半", - }, - collisionCourse: { - name: "全開猛撞", - effect: "邊變形邊兇暴地落下,並引\n發起古老的大爆炸。若針對\n到弱點,威力會進一步", - }, - electroDrift: { - name: "閃電猛衝", - effect: "邊變形邊高速奔走,並以未\n知的電擊貫穿對手。若針對\n到弱點,威力會進一步", - }, - shedTail: { - name: "斷尾", - effect: "削減自己的HP,製造分身\n後會返回,並和後備寶可夢\n進行替換", - }, - chillyReception: { - name: "冷笑話", - effect: "留下冷場的冷笑話後,和後\n備寶可夢進行替換。在5回\n合內會下雪", - }, - tidyUp: { - name: "大掃除", - effect: "將撒菱、隱形巖、黏黏網、\n毒菱、替身全部掃除掉。自\n己的攻擊和速度會提高", - }, - snowscape: { - name: "雪景", - effect: "在5回合內會下雪。冰屬性\n的防禦會提高", - }, - pounce: { name: "蟲撲", effect: "飛撲向對手攻擊。會降低對\n手的速度" }, - trailblaze: { - name: "起草", - effect: "跳出草叢進行攻擊。通過輕\n快的步伐會提高自己的速度", - }, - chillingWater: { - name: "潑冷水", - effect: "潑灑冰冷得足以讓對手失去\n活力的水進行攻擊。會降低\n對手的攻擊", - }, - hyperDrill: { - name: "強力鑽", - effect: "急速旋轉尖銳的身體部位貫\n穿對手。可以無視守住和看\n穿等招式", - }, - twinBeam: { - name: "雙光束", - effect: "從兩眼發射出神奇的光線攻\n擊。連續2次給予傷害", - }, - rageFist: { - name: "憤怒之拳", - effect: "將憤怒化爲力量攻擊。受到\n攻擊的次數越多,招式的威\n力越高", - }, - armorCannon: { - name: "鎧農炮", - effect: "熊熊燃燒自己的鎧甲,將其\n做成炮彈射出攻擊。自己的\n防禦和特防會降低", - }, - bitterBlade: { - name: "悔念劍", - effect: "將對世間的留戀聚集於劍尖,\n並斬擊對手。可以回覆給\n予對手傷害的一半HP", - }, - doubleShock: { - name: "電光雙擊", - effect: "將全身所有的電力放出,給\n予對手大大的傷害。自己的\n電屬性將會消失", - }, - gigatonHammer: { - name: "巨力錘", - effect: "連同身體轉起巨大的錘子進\n行攻擊。這個招式無法連續\n使出2次", - }, - comeuppance: { - name: "復仇", - effect: "使出招式前,將最後受到的\n招式的傷害大力返還給對手", - }, - aquaCutter: { - name: "水波刀", - effect: "如刀刃般噴射出加壓的水切\n開對手。容易擊中要害", - }, - blazingTorque: { - name: "灼熱暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n灼傷狀態。", - }, - wickedTorque: { - name: "黑暗暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n睡眠狀態。", - }, - noxiousTorque: { - name: "劇毒暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n中毒狀態。", - }, - combatTorque: { - name: "格鬥暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n麻痹狀態。此招式可以命中\n幽靈屬性的寶可夢。", - }, - magicalTorque: { - name: "魔法暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n混亂狀態。", - }, - bloodMoon: { - name: "血月", - effect: "從赤紅如血的滿月發射出全\n部的氣勢。這個招式無法連\n續使出2次", - }, - matchaGotcha: { - name: "刷刷茶炮", - effect: "發射經攪拌的茶的大炮,可\n以回覆給予對手傷害的一半\nHP,有時會讓對手陷入灼\n傷狀態", - }, - syrupBomb: { - name: "糖漿炸彈", - effect: "使粘稠的麥芽糖漿爆炸,讓\n對手陷入滿身糖狀態,在3\n回合內持續降低其速度", - }, - ivyCudgel: { - name: "棘藤棒", - effect: "用纏有藤蔓的棍棒毆打。屬\n性會隨所戴的面具而改變。\n容易擊中要害", - }, - electroShot: { - name: "電光束", - effect: "第1回合收集電力提高特攻,\n第2回合將高壓的電力發\n射出去。下雨天氣時能立刻\n發射", - }, - teraStarstorm: { - name: "晶光星羣", - effect: "照射出結晶的力量來驅逐敵\n人。太樂巴戈斯在星晶形態\n下使出時,能對所有對手造\n成傷害", - }, - fickleBeam: { - name: "隨機光", - effect: "發射光線進行攻擊。有時其\n他的頭也會合力發射鐳射,\n讓招式威力變成2倍", - }, - burningBulwark: { - name: "火焰守護", - effect: "用超高溫的體毛防住對手攻\n擊的同時,讓接觸到自己的\n對手灼傷", - }, - thunderclap: { - name: "迅雷", - effect: "可以比對手先使出電擊進行\n攻擊。對手使出的招式如果\n不是攻擊招式則會失敗", - }, - mightyCleave: { - name: "強刃攻擊", - effect: "用積蓄在頭部的光來斬切對\n手。可以無視守護進行攻擊", - }, - tachyonCutter: { - name: "迅子利刃", - effect: "接連發射出粒子的利刃,連\n續2次給予傷害。攻擊必定\n會命中", - }, - hardPress: { - name: "硬壓", - effect: "用手臂或鉗子壓迫對手。對\n手剩餘的HP越多,威力越\n大", - }, - dragonCheer: { - name: "龍聲鼓舞", - effect: "以龍之鼓舞提高士氣,讓我\n方的招式變得容易擊中要害。\n對龍屬性的鼓舞效果會更\n強", - }, - alluringVoice: { - name: "魅誘之聲", - effect: "用天使般的歌聲攻擊對手。\n會讓此回合內能力有提高的\n寶可夢陷入混亂狀態", - }, - temperFlare: { - name: "豁出去", - effect: "以自暴自棄的氣勢進行攻擊。\n如果上一回合招式沒有命\n中,威力就會翻倍", - }, - supercellSlam: { - name: "閃電強襲", - effect: "讓身體帶電後壓向對手。如\n果沒有命中則自己會受到傷\n害", - }, - psychicNoise: { - name: "精神噪音", - effect: "用令對手不舒服的音波進行\n攻擊。讓對手在2回合內無\n法通過招式、特性或攜帶的\n道具回覆HP", - }, - upperHand: { - name: "快手還擊", - effect: "察覺到對手的動作後用掌根\n攻擊,讓對手畏縮。如果對\n手使出的招式不是先制攻擊,\n則會失敗", - }, - malignantChain: { - name: "邪毒鎖鏈", - effect: "用由毒形成的鎖鏈纏住對手\n注入毒素加以侵蝕。有時會\n讓對手陷入劇毒狀態", - }, -} as const; diff --git a/src/locales/zh_TW/nature.ts b/src/locales/zh_TW/nature.json similarity index 80% rename from src/locales/zh_TW/nature.ts rename to src/locales/zh_TW/nature.json index f72d271c139..bde8d938c06 100644 --- a/src/locales/zh_TW/nature.ts +++ b/src/locales/zh_TW/nature.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const nature: SimpleTranslationEntries = { +{ "Hardy": "勤奮", "Lonely": "怕寂寞", "Brave": "勇敢", @@ -26,4 +24,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "自大", "Careful": "慎重", "Quirky": "浮躁" -} as const; +} \ No newline at end of file diff --git a/src/locales/zh_TW/party-ui-handler.json b/src/locales/zh_TW/party-ui-handler.json new file mode 100644 index 00000000000..975212bbdad --- /dev/null +++ b/src/locales/zh_TW/party-ui-handler.json @@ -0,0 +1,8 @@ +{ + "SEND_OUT": "上場", + "SUMMARY": "概要", + "CANCEL": "取消", + "RELEASE": "放生", + "APPLY": "應用", + "TEACH": "教授" +} \ No newline at end of file diff --git a/src/locales/zh_TW/party-ui-handler.ts b/src/locales/zh_TW/party-ui-handler.ts deleted file mode 100644 index dfe1a3629b6..00000000000 --- a/src/locales/zh_TW/party-ui-handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "上場", - "SUMMARY": "概要", - "CANCEL": "取消", - "RELEASE": "放生", - "APPLY": "應用", - "TEACH": "教授" -} as const; diff --git a/src/locales/zh_TW/pokeball.json b/src/locales/zh_TW/pokeball.json new file mode 100644 index 00000000000..48492edf311 --- /dev/null +++ b/src/locales/zh_TW/pokeball.json @@ -0,0 +1,8 @@ +{ + "pokeBall": "精靈球", + "greatBall": "超級球", + "ultraBall": "高級球", + "rogueBall": "肉鴿球", + "masterBall": "大師球", + "luxuryBall": "豪華球" +} \ No newline at end of file diff --git a/src/locales/zh_TW/pokeball.ts b/src/locales/zh_TW/pokeball.ts deleted file mode 100644 index 8919f3591e1..00000000000 --- a/src/locales/zh_TW/pokeball.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokeball: SimpleTranslationEntries = { - "pokeBall": "精靈球", - "greatBall": "超級球", - "ultraBall": "高級球", - "rogueBall": "肉鴿球", - "masterBall": "大師球", - "luxuryBall": "豪華球", -} as const; diff --git a/src/locales/zh_TW/pokemon-form-battle.json b/src/locales/zh_TW/pokemon-form-battle.json new file mode 100644 index 00000000000..75087aa0669 --- /dev/null +++ b/src/locales/zh_TW/pokemon-form-battle.json @@ -0,0 +1,14 @@ +{ + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "Primal {{pokemonName}}", + "gigantamax": "G-Max {{pokemonName}}", + "eternamax": "E-Max {{pokemonName}}", + "megaChange": "{{preName}}超級進化成了\n{{pokemonName}}!", + "gigantamaxChange": "{{preName}}超極巨化成了\n{{pokemonName}}!", + "eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}!", + "revertChange": "{{pokemonName}}變回了\n原本的樣子!", + "formChange": "{{preName}}變為其他樣子了。", + "disguiseChange": "它的畫皮被當作誘餌使用了!" +} \ No newline at end of file diff --git a/src/locales/zh_TW/pokemon-form.json b/src/locales/zh_TW/pokemon-form.json new file mode 100644 index 00000000000..b98a1e946b8 --- /dev/null +++ b/src/locales/zh_TW/pokemon-form.json @@ -0,0 +1,3 @@ +{ + "meloettaPirouette": "舞步形態" +} \ No newline at end of file diff --git a/src/locales/zh_TW/pokemon-info-container.json b/src/locales/zh_TW/pokemon-info-container.json new file mode 100644 index 00000000000..15b5f4a2da5 --- /dev/null +++ b/src/locales/zh_TW/pokemon-info-container.json @@ -0,0 +1,6 @@ +{ + "moveset": "招式", + "gender": "性别:", + "ability": "特性:", + "nature": "性格:" +} \ No newline at end of file diff --git a/src/locales/zh_TW/pokemon-info-container.ts b/src/locales/zh_TW/pokemon-info-container.ts deleted file mode 100644 index 19cb5219465..00000000000 --- a/src/locales/zh_TW/pokemon-info-container.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "招式", - "gender": "性别:", - "ability": "特性:", - "nature": "性格:", - "epic": "史詩", - "rare": "稀有", - "common": "常見" -} as const; diff --git a/src/locales/zh_TW/pokemon-info.ts b/src/locales/zh_TW/pokemon-info.json similarity index 75% rename from src/locales/zh_TW/pokemon-info.ts rename to src/locales/zh_TW/pokemon-info.json index b3edea0c3d4..66a99857a82 100644 --- a/src/locales/zh_TW/pokemon-info.ts +++ b/src/locales/zh_TW/pokemon-info.json @@ -1,7 +1,5 @@ -import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; - -export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { +{ + "Stat": { "HP": "最大生命", "HPshortened": "生命", "ATK": "物理攻擊", @@ -13,12 +11,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "特殊防禦", "SPDEFshortened": "特防", "SPD": "速度", - "SPDshortened": "速度", - "ACC": "Accuracy", - "EVA": "Evasiveness" + "SPDshortened": "速度" }, - - Type: { + "Type": { "UNKNOWN": "未知", "NORMAL": "一般", "FIGHTING": "格鬥", @@ -39,5 +34,5 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DARK": "惡", "FAIRY": "妖精", "STELLAR": "星晶" - }, -} as const; + } +} \ No newline at end of file diff --git a/src/locales/zh_TW/pokemon-summary.json b/src/locales/zh_TW/pokemon-summary.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/zh_TW/pokemon-summary.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/zh_TW/pokemon.ts b/src/locales/zh_TW/pokemon.json similarity index 99% rename from src/locales/zh_TW/pokemon.ts rename to src/locales/zh_TW/pokemon.json index 2a82f11f4c3..4acd4a21fd5 100644 --- a/src/locales/zh_TW/pokemon.ts +++ b/src/locales/zh_TW/pokemon.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const pokemon: SimpleTranslationEntries = { +{ "bulbasaur": "妙蛙種子", "ivysaur": "妙蛙草", "venusaur": "妙蛙花", @@ -1082,5 +1080,5 @@ export const pokemon: SimpleTranslationEntries = { "hisui_decidueye": "狙射樹梟", "paldea_tauros": "肯泰羅", "paldea_wooper": "烏波", - "bloodmoon_ursaluna": "月月熊", -} as const; + "bloodmoon_ursaluna": "月月熊" +} \ No newline at end of file diff --git a/src/locales/zh_TW/run-history.json b/src/locales/zh_TW/run-history.json new file mode 100644 index 00000000000..76cb2592ce2 --- /dev/null +++ b/src/locales/zh_TW/run-history.json @@ -0,0 +1,37 @@ +{ + "victory": "勝利!", + "defeatedWild": "被打敗", + "defeatedTrainer": "被打敗", + "defeatedTrainerDouble": "被組合打敗", + "defeatedRival": "被勁敵打敗", + "defeated": "被打敗", + "defeatedWild_female": "被打敗", + "defeatedTrainer_female": "被打敗", + "defeatedTrainerDouble_female": "被組合打敗", + "defeatedRival_female": "被勁敵打敗", + "defeated_female": "被打敗", + "luck": "幸運", + "score": "分數", + "mode": "模式", + "challengeRules": "規則", + "challengeMonoGen1": "一代", + "challengeMonoGen2": "二代", + "challengeMonoGen3": "三代", + "challengeMonoGen4": "四代", + "challengeMonoGen5": "五代", + "challengeMonoGen6": "六代", + "challengeMonoGen7": "七代", + "challengeMonoGen8": "八代", + "challengeMonoGen9": "九代", + "playerItems": "玩家道具", + "personalBest": "個人最佳!", + "SPDshortened": "速率", + "runInfo": "遊戲記錄", + "money": "金錢", + "runLength": "遊戲時長", + "viewHeldItems": "持有道具", + "hallofFameText": "歡迎來到名人堂!", + "hallofFameText_female": "歡迎來到名人堂!", + "viewHallOfFame": "浏覽名人堂!", + "viewEndingSplash": "浏覽結算畫面" +} \ No newline at end of file diff --git a/src/locales/zh_TW/save-slot-select-ui-handler.json b/src/locales/zh_TW/save-slot-select-ui-handler.json new file mode 100644 index 00000000000..94fd6b0971f --- /dev/null +++ b/src/locales/zh_TW/save-slot-select-ui-handler.json @@ -0,0 +1,7 @@ +{ + "overwriteData": "要覆蓋該槽位的存檔嗎?", + "loading": "正在加載...", + "wave": "層數", + "lv": "Lv", + "empty": "空" +} \ No newline at end of file diff --git a/src/locales/zh_TW/save-slot-select-ui-handler.ts b/src/locales/zh_TW/save-slot-select-ui-handler.ts deleted file mode 100644 index 68377aec4b2..00000000000 --- a/src/locales/zh_TW/save-slot-select-ui-handler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "要覆蓋該槽位的存檔嗎?", - "loading": "正在加載...", - "wave": "層數", - "lv": "Lv", - "empty": "空", -} as const; diff --git a/src/locales/zh_TW/settings.ts b/src/locales/zh_TW/settings.json similarity index 94% rename from src/locales/zh_TW/settings.ts rename to src/locales/zh_TW/settings.json index dcb87fafe35..b077e0216a3 100644 --- a/src/locales/zh_TW/settings.ts +++ b/src/locales/zh_TW/settings.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; - -export const settings: SimpleTranslationEntries = { +{ "boy": "男孩", "girl": "女孩", "general": "常規", @@ -15,6 +13,7 @@ export const settings: SimpleTranslationEntries = { "skipSeenDialogues": "跳過已讀對話", "battleStyle": "對戰模式", "enableRetries": "允許重試", + "hideIvs": "禁用個體值探測器信息", "tutorials": "教程", "touchControls": "觸摸操作", "vibrations": "手柄震動", @@ -62,6 +61,7 @@ export const settings: SimpleTranslationEntries = { "typeHints": "屬性提示", "masterVolume": "主音量", "bgmVolume": "音樂", + "fieldVolume": "場景音量", "seVolume": "音效", "musicPreference": "音樂偏好", "mixed": "全曲混合", @@ -95,5 +95,5 @@ export const settings: SimpleTranslationEntries = { "mute": "靜音", "controller": "控制器", "gamepadSupport": "手柄支持", - "showBgmBar": "Show Music Names", -} as const; + "moveTouchControls": "移動觸控控制" +} diff --git a/src/locales/zh_TW/splash-messages.ts b/src/locales/zh_TW/splash-messages.json similarity index 91% rename from src/locales/zh_TW/splash-messages.ts rename to src/locales/zh_TW/splash-messages.json index 3fbbea71564..8535a9acd84 100644 --- a/src/locales/zh_TW/splash-messages.ts +++ b/src/locales/zh_TW/splash-messages.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const splashMessages: SimpleTranslationEntries = { +{ "battlesWon": "勝利場數!", "joinTheDiscord": "加入Discord!", "infiniteLevels": "無限等級!", @@ -34,4 +32,4 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "也試試激進紅!", "eeveeExpo": "伊布博覽會!", "ynoproject": "YNO專案!" -} as const; +} \ No newline at end of file diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.json similarity index 70% rename from src/locales/zh_TW/starter-select-ui-handler.ts rename to src/locales/zh_TW/starter-select-ui-handler.json index ae9a4083d20..2a0db7217da 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.json @@ -1,12 +1,6 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The menu namespace holds most miscellaneous text that isn't directly part of the game's - * contents or directly related to Pokemon data. This includes menu navigation, settings, - * account interactions, descriptive text, etc. - */ -export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"使用這些寶可夢開始嗎?", +{ + "confirmStartTeam": "使用這些寶可夢開始嗎?", + "invalidParty": "此為無效隊伍!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -23,6 +17,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "eggMoves": "孵化招式", "start": "開始", "addToParty": "加入隊伍", + "removeFromParty": "移出隊伍", "toggleIVs": "查看個體值", "manageMoves": "管理技能", "manageNature": "管理性格", @@ -30,18 +25,19 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "選擇性格", "selectMoveSwapOut": "選擇想要替換走的招式", "selectMoveSwapWith": "選擇想要替換成的招式", + "sameSpeciesEgg": "買蛋", "unlockPassive": "解鎖被動", "reduceCost": "降低花費", - "sameSpeciesEgg": "買蛋", "cycleShiny": ": 閃光", "cycleForm": ": 形態", "cycleGender": ": 性別", "cycleAbility": ": 特性", "cycleNature": ": 性格", "cycleVariant": ": 變種", + "goFilter": ": 轉到篩選", "enablePassive": "啟用被動", "disablePassive": "禁用被動", "locked": "未解鎖", "disabled": "已禁用", "uncaught": "未捕獲" -}; +} \ No newline at end of file diff --git a/src/locales/zh_TW/status-effect.json b/src/locales/zh_TW/status-effect.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/src/locales/zh_TW/status-effect.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/locales/zh_TW/status-effect.ts b/src/locales/zh_TW/status-effect.ts deleted file mode 100644 index 1a402ac30fd..00000000000 --- a/src/locales/zh_TW/status-effect.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; - -export const statusEffect: StatusEffectTranslationEntries = { - none: { - name: "None", - description: "", - obtain: "", - obtainSource: "", - activation: "", - overlap: "", - heal: "" - }, - poison: { - name: "Poison", - description: "poisoning", - obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", - overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", - heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" - }, - toxic: { - name: "Toxic", - description: "poisoning", - obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", - overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", - heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" - }, - paralysis: { - name: "Paralysis", - description: "paralysis", - obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", - obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}},\nIt may be unable to move!", - activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", - overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", - heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" - }, - sleep: { - name: "Sleep", - description: "sleep", - obtain: "{{pokemonNameWithAffix}}\nfell asleep!", - obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is fast asleep.", - overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", - heal: "{{pokemonNameWithAffix}} woke up!" - }, - freeze: { - name: "Freeze", - description: "freezing", - obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", - obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", - overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", - heal: "{{pokemonNameWithAffix}} was\ndefrosted!" - }, - burn: { - name: "Burn", - description: "burn", - obtain: "{{pokemonNameWithAffix}}\nwas burned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", - activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", - overlap: "{{pokemonNameWithAffix}} is\nalready burned!", - heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" - }, -} as const; diff --git a/src/locales/zh_TW/terrain.json b/src/locales/zh_TW/terrain.json new file mode 100644 index 00000000000..37b74a1e352 --- /dev/null +++ b/src/locales/zh_TW/terrain.json @@ -0,0 +1,16 @@ +{ + "misty": "薄霧", + "mistyStartMessage": "腳下霧氣繚繞!", + "mistyClearMessage": "腳下的霧氣消失不見了!", + "mistyBlockMessage": "{{pokemonNameWithAffix}}正受到薄霧場地的保護!", + "electric": "電氣", + "electricStartMessage": "腳下電流飛閃!", + "electricClearMessage": "腳下的電流消失了!", + "grassy": "青草", + "grassyStartMessage": "腳下青草如茵!", + "grassyClearMessage": "腳下的青草消失不見了!", + "psychic": "精神", + "psychicStartMessage": "腳下傳來了奇妙的感覺!", + "psychicClearMessage": "腳下的奇妙感覺消失了!", + "defaultBlockMessage": "{{pokemonNameWithAffix}}正受到{{terrainName}}的保護!" +} \ No newline at end of file diff --git a/src/locales/zh_TW/trainer-classes.json b/src/locales/zh_TW/trainer-classes.json new file mode 100644 index 00000000000..d6ff7238ec1 --- /dev/null +++ b/src/locales/zh_TW/trainer-classes.json @@ -0,0 +1,119 @@ +{ + "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_grunts": "火箭队手下們", + "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": "闪焰队手下們" +} \ No newline at end of file diff --git a/src/locales/zh_TW/trainer-names.json b/src/locales/zh_TW/trainer-names.json new file mode 100644 index 00000000000..64e8892e64b --- /dev/null +++ b/src/locales/zh_TW/trainer-names.json @@ -0,0 +1,136 @@ +{ + "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": "哈烏", + "leon": "丹帝", + "geeta": "也慈", + "nemona": "妮莫", + "kieran": "烏栗", + "rival": "芬恩", + "rival_female": "艾薇", + "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": "聶梓 & 瑪俐" +} \ No newline at end of file diff --git a/src/locales/zh_TW/trainer-titles.json b/src/locales/zh_TW/trainer-titles.json new file mode 100644 index 00000000000..54fe48b1464 --- /dev/null +++ b/src/locales/zh_TW/trainer-titles.json @@ -0,0 +1,13 @@ +{ + "elite_four": "四天王", + "elite_four_female": "四天王", + "gym_leader": "道館館主", + "gym_leader_female": "道館館主", + "gym_leader_double": "道館館主", + "champion": "冠軍", + "champion_female": "冠軍", + "champion_double": "冠軍搭檔", + "rival": "勁敵", + "professor": "博士", + "frontier_brain": "開拓頭腦" +} \ No newline at end of file diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts deleted file mode 100644 index 594363ce009..00000000000 --- a/src/locales/zh_TW/trainers.ts +++ /dev/null @@ -1,318 +0,0 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; - -// Titles of special trainers like gym leaders, elite four, and the champion -export const titles: SimpleTranslationEntries = { - "elite_four": "四天王", - "elite_four_female": "四天王", - "gym_leader": "道館館主", - "gym_leader_female": "道館館主", - "gym_leader_double": "道館館主", - "champion": "冠軍", - "champion_female": "冠軍", - "champion_double": "冠軍搭檔", - "rival": "勁敵", - "professor": "博士", - "frontier_brain": "開拓頭腦", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. -} as const; - -// Titles of trainers like "Youngster" or "Lass" -export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "精英訓練家", - "ace_trainer_female": "精英訓練家", - "ace_duo": "精英組合", - "artist": "藝術家", - "artist_female": "藝術家", - "backers": "啦啦隊", - "backpacker": "背包客", - "backpacker_female": "背包客", - "backpackers": "背包客組合", - "baker": "麵包師", - "battle_girl": "對戰少女", - "beauty": "大姐姐", - "beginners": "新人訓練家組合", - "biker": "飆車族", - "black_belt": "空手道王", - "breeder": "寶可夢培育家", - "breeder_female": "寶可夢培育家", - "breeders": "寶可夢培育家組合", - "clerk": "商務人士", - "clerk_female": "職場OL", - "colleagues": "商務夥伴", - "crush_kin": "格鬥姐弟", - "cyclist": "自行車手", - "cyclist_female": "自行車手", - "cyclists": "自行車手組合", - "dancer": "舞者", - "dancer_female": "舞者", - "depot_agent": "鐵路員工", - "doctor": "醫生", - "doctor_female": "醫生", - "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": "短褲小子" -} as const; - -// Names of special trainers like gym leaders, elite four, and the champion -export const trainerNames: SimpleTranslationEntries = { - // ---- 館主 Gym leader ---- - // 關都地區 Kanto Region - "brock": "小剛", - "misty": "小霞", - "lt_surge": "馬志士", - "erika": "莉佳", - "janine": "阿杏", - "sabrina": "娜姿", - "blaine": "夏伯", - "giovanni": "坂木", - - // 城都地區 Johto Region - "falkner": "阿速", - "bugsy": "阿筆", - "whitney": "小茜", - "morty": "松葉", - "chuck": "阿四", - "jasmine": "阿蜜", - "pryce": "柳伯", - "clair": "小椿", - - // 豐緣地區 Hoenn Region - "roxanne": "杜鵑", - "brawly": "藤樹", - "wattson": "鐵旋", - "flannery": "亞莎", - "norman": "千里", - "winona": "娜琪", - "tate": "小楓", - "liza": "小南", - "juan": "亞當", - - // 神奧地區 Sinnoh Region - "roark": "瓢太", - "gardenia": "菜種", - "maylene": "阿李", - "crasher_wake": "吉憲", - "fantina": "梅麗莎", - "byron": "東瓜", - "candice": "小菘", - "volkner": "電次", - - // 合眾地區 Unova Region - "cilan": "天桐", - "chili": "伯特", - "cress": "寇恩", - "cheren": "黑連", - "lenora": "蘆薈", - "roxie": "霍米加", - "burgh": "亞堤", - "elesa": "小菊兒", - "clay": "菊老大", - "skyla": "風露", - "brycen": "哈奇庫", - "drayden": "夏卡", - "marlon": "西子伊", - - // 卡洛斯地區 Kalos Region - "viola": "紫羅蘭", - "grant": "查克洛", - "korrina": "可爾妮", - "ramos": "福爺", - "clemont": "希特隆", - "valerie": "瑪綉", - "olympia": "葛吉花", - "wulfric": "得撫", - - // 伽勒爾地區 Galar Region - "milo": "亞洛", - "nessa": "露璃娜", - "kabu": "卡芜", - "bea": "彩豆", - "allister": "歐尼奧", - "opal": "波普菈", - "bede": "彼特", - "gordie": "瑪瓜", - "melony": "美蓉", - "piers": "聶梓", - "marnie": "瑪俐", - "raihan": "奇巴納", - - // 帕底亞地區 Paldea Region - "katy": "阿楓", - "brassius": "寇沙", - "iono": "奇樹", - "kofu": "海岱", - "larry": "青木", - "ryme": "萊姆", - "tulip": "莉普", - "grusha": "古魯夏", - - // ---- 四天王 Elite Four ---- - // 關都地區 Kanto Region - "lorelei": "科拿", - "bruno": "希巴", - "agatha": "菊子", - "lance": "阿渡", - - // 城都地區 Johto Region - "will": "一樹", - "koga": "阿桔", - "karen": "梨花", - - // 豐都地區 Hoenn Region - "sidney": "花月", - "phoebe": "芙蓉", - "glacia": "波妮", - "drake": "源治", - - // 神奧地區 Sinnoh Region - "aaron": "阿柳", - "bertha": "菊野", - "flint": "大葉", - "lucian": "悟松", - - // 合眾地區 Unova Region - "shauntal": "婉龍", - "marshal": "連武", - "grimsley": "越橘", - "caitlin": "嘉德麗雅", - - // 卡洛斯地區 Kalos Region - "malva": "帕琦拉", - "siebold": "志米", - "wikstrom": "雁鎧", - "drasna": "朵拉塞娜", - - // 阿羅拉地區 Alola Region - "hala": "哈拉", - "molayne": "馬睿因", - "olivia": "麗姿", - "acerola": "阿塞蘿拉", - "kahili": "卡希麗", - - // 帕底亞地區 Paldea Region - "rika": "辛俐", - "poppy": "波琵", - "hassel": "八朔", - - // 藍莓學院 Blueberry Academy - "crispin": "赤松", - "amarys": "納莉", - "lacey": "紫竽", - "drayton": "杜若", - - // ---- 冠軍 Champion ---- - // 關都地區 Kanto Region - "blue": "青綠", - "red": "赤紅", - - // 豐緣地區 Hoenn Region - "steven": "大吾", - "wallace": "米可利", - - // 神奧地區 Sinnoh Region - "cynthia": "竹蘭", - - // 合眾地區 Unova Region - "alder": "阿戴克", - "iris": "艾莉絲", - - // 卡洛斯地區 Kalos Region - "diantha": "卡露妮", - - // 阿羅拉地區 Alola Region - "hau": "哈烏", - - // 伽勒爾地區 Galar Region - "leon": "丹帝", - - // 帕底亞地區 Paldea Region - "geeta": "也慈", - "nemona": "妮莫", - - // 藍莓學院 Blueberry Academy - "kieran": "烏栗", - - // 勁敵 Rival - "rival": "芬恩", - "rival_female": "艾薇", - - // Double Names - "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": "聶梓 & 瑪俐", -} as const; diff --git a/src/locales/zh_TW/tutorial.json b/src/locales/zh_TW/tutorial.json new file mode 100644 index 00000000000..5e6e3d0ba9c --- /dev/null +++ b/src/locales/zh_TW/tutorial.json @@ -0,0 +1,10 @@ +{ + "intro": "歡迎來到PokéRogue!這是一款以戰鬥爲核心的融合了roguelite元素的寶可夢同人遊戲。 \n$本遊戲未進行商業化,我們沒有\nPokémon或Pokémon使用的版 \n$權資產的所有權。 \n$遊戲仍在開發中,但已可完整遊玩。如需報\n告錯誤,請使用 Discord 社區。 \n$如果遊戲運行緩慢,請確保在瀏覽器設置中\n打開了“硬件加速”。", + "accessMenu": "在等待輸入時,按 M 或 Escape 鍵可訪\n問菜單。菜單包含設置和各種功能。", + "menu": "在此菜單中,您可以訪問設置。 \n$在設置中,您可以更改遊戲速度、窗口樣式\n和其他選項。 \n$這裏還有各種其他功能,請務必全部查看!", + "starterSelect": "在此頁面中,您可以選擇您的初始寶可夢。\n這些是您最初的隊伍成員。 \n$每個初始寶可夢都有一個費用值。您的隊伍\n最多可以擁有6名成員,只要總費用不超過10。 \n$您還可以根據您捕獲或孵化的變種選擇性別\n、特性和形態。 \n$一個物種個體值是您捕獲或孵化的所有寶可\n夢中最好的,所以儘量獲得更多同種寶可夢!", + "pokerus": "每天隨機3個可選的初始寶可夢會有紫色邊\n框。 \n$如果您看到您擁有的初始寶可夢帶有紫色邊\n框,請嘗試將其添加到您的隊伍中。請務必 \n$查看其概況!", + "statChange": "只要您的寶可夢沒有被召回,屬性變化就會\n在戰鬥中持續存在。 \n$在訓練家戰鬥之前和進入新的寶可夢羣落之\n前,您的寶可夢會被召回。 \n$您還可以通過按住C或Shift鍵來查看\n場上寶可夢的能力變化。", + "selectItem": "每次戰鬥後,您都可以選擇 3 個隨機物品。\n您只能選擇其中一個。 \n$這些物品包括消耗品、寶可夢攜帶物品和永\n久被動道具。 \n$大多數非消耗品的效果會以各種方式疊加。 \n$某些物品只有在可以使用時纔會出現,例如\n進化物品。 \n$您還可以使用轉移選項在寶可夢之間轉移攜\n帶物品。 \n$一旦您獲得了攜帶物品,轉移選項就會出現\n在右下角。 \n$您可以用金錢購買消耗品,並且隨着您遊戲\n的深入,將會有更多種類的消耗品可供選擇。 \n$請務必在選擇隨機物品之前購買這些消耗品\n因爲一旦您選擇,遊戲就會進入下一場戰鬥。", + "eggGacha": "在此頁面中,您可以使用您的兌換券兌換寶\n可夢蛋。 \n$蛋需要孵化,並且在每場戰鬥後都會減少孵\n化週期。稀有蛋需要更長時間才能孵化。 \n$孵化的寶可夢不會被添加到您的隊伍中,它\n們將被添加到您的初始寶可夢中。 \n$從蛋中孵化的寶可夢通常比野生寶可夢具有\n更好的個體值。 \n$有些寶可夢只能從蛋中獲得。 \n$有 3 種不同的扭蛋機可供選擇,每種扭蛋機\n都有不同的獎勵,請選擇最適合您的!" +} \ No newline at end of file diff --git a/src/locales/zh_TW/tutorial.ts b/src/locales/zh_TW/tutorial.ts deleted file mode 100644 index 482ac5ce651..00000000000 --- a/src/locales/zh_TW/tutorial.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const tutorial: SimpleTranslationEntries = { - "intro": `歡迎來到PokéRogue!這是一款以戰鬥爲核心的融合了roguelite元素的寶可夢同人遊戲。 - $本遊戲未進行商業化,我們沒有\nPokémon或Pokémon使用的版 - $權資產的所有權。 - $遊戲仍在開發中,但已可完整遊玩。如需報\n告錯誤,請使用 Discord 社區。 - $如果遊戲運行緩慢,請確保在瀏覽器設置中\n打開了“硬件加速”。`, - - "accessMenu": "在等待輸入時,按 M 或 Escape 鍵可訪\n問菜單。菜單包含設置和各種功能。", - - "menu": `在此菜單中,您可以訪問設置。 - $在設置中,您可以更改遊戲速度、窗口樣式\n和其他選項。 - $這裏還有各種其他功能,請務必全部查看!`, - - "starterSelect": `在此頁面中,您可以選擇您的初始寶可夢。\n這些是您最初的隊伍成員。 - $每個初始寶可夢都有一個費用值。您的隊伍\n最多可以擁有6名成員,只要總費用不超過10。 - $您還可以根據您捕獲或孵化的變種選擇性別\n、特性和形態。 - $一個物種個體值是您捕獲或孵化的所有寶可\n夢中最好的,所以儘量獲得更多同種寶可夢!`, - - "pokerus": `每天隨機3個可選的初始寶可夢會有紫色邊\n框。 - $如果您看到您擁有的初始寶可夢帶有紫色邊\n框,請嘗試將其添加到您的隊伍中。請務必 - $查看其概況!`, - - "statChange": `只要您的寶可夢沒有被召回,屬性變化就會\n在戰鬥中持續存在。 - $在訓練家戰鬥之前和進入新的寶可夢羣落之\n前,您的寶可夢會被召回。 - $您還可以通過按住C或Shift鍵來查看\n場上寶可夢的能力變化。`, - - "selectItem": `每次戰鬥後,您都可以選擇 3 個隨機物品。\n您只能選擇其中一個。 - $這些物品包括消耗品、寶可夢攜帶物品和永\n久被動道具。 - $大多數非消耗品的效果會以各種方式疊加。 - $某些物品只有在可以使用時纔會出現,例如\n進化物品。 - $您還可以使用轉移選項在寶可夢之間轉移攜\n帶物品。 - $一旦您獲得了攜帶物品,轉移選項就會出現\n在右下角。 - $您可以用金錢購買消耗品,並且隨着您遊戲\n的深入,將會有更多種類的消耗品可供選擇。 - $請務必在選擇隨機物品之前購買這些消耗品\n因爲一旦您選擇,遊戲就會進入下一場戰鬥。`, - - "eggGacha": `在此頁面中,您可以使用您的兌換券兌換寶\n可夢蛋。 - $蛋需要孵化,並且在每場戰鬥後都會減少孵\n化週期。稀有蛋需要更長時間才能孵化。 - $孵化的寶可夢不會被添加到您的隊伍中,它\n們將被添加到您的初始寶可夢中。 - $從蛋中孵化的寶可夢通常比野生寶可夢具有\n更好的個體值。 - $有些寶可夢只能從蛋中獲得。 - $有 3 種不同的扭蛋機可供選擇,每種扭蛋機\n都有不同的獎勵,請選擇最適合您的!` -} as const; diff --git a/src/locales/zh_TW/voucher.ts b/src/locales/zh_TW/voucher.json similarity index 65% rename from src/locales/zh_TW/voucher.ts rename to src/locales/zh_TW/voucher.json index 9b521e683fd..fcff16ba6fc 100644 --- a/src/locales/zh_TW/voucher.ts +++ b/src/locales/zh_TW/voucher.json @@ -1,6 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -export const voucher: SimpleTranslationEntries = { +{ "vouchers": "兌換券", "eggVoucher": "初級扭蛋券", "eggVoucherPlus": "中級扭蛋券", @@ -8,4 +6,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "黃金扭蛋券", "locked": "鎖定", "defeatTrainer": "你打敗了{{trainerName}}" -} as const; +} \ No newline at end of file diff --git a/src/locales/zh_TW/weather.ts b/src/locales/zh_TW/weather.json similarity index 86% rename from src/locales/zh_TW/weather.ts rename to src/locales/zh_TW/weather.json index 7efdc8af0ad..b20975374ea 100644 --- a/src/locales/zh_TW/weather.ts +++ b/src/locales/zh_TW/weather.json @@ -1,44 +1,31 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; - -/** - * The weather namespace holds text displayed when weather is active during a battle - */ -export const weather: SimpleTranslationEntries = { +{ "sunnyStartMessage": "日照變強了!", "sunnyLapseMessage": "日照很強。", "sunnyClearMessage": "日照復原了。", - "rainStartMessage": "下大雨了!", "rainLapseMessage": "雨繼續下。", "rainClearMessage": "雨停了。", - "sandstormStartMessage": "開始刮沙暴了!", "sandstormLapseMessage": "沙暴肆虐。", "sandstormClearMessage": "沙暴停止了。", "sandstormDamageMessage": "沙暴襲擊了{{pokemonNameWithAffix}}!", - "hailStartMessage": "開始下冰雹了!", "hailLapseMessage": "冰雹繼續肆虐。", "hailClearMessage": "冰雹不再下了。", "hailDamageMessage": "冰雹襲擊了{{pokemonNameWithAffix}}!", - "snowStartMessage": "開始下雪了!", "snowLapseMessage": "雪繼續下。", "snowClearMessage": "雪停了。", - "fogStartMessage": "起霧了!", "fogLapseMessage": "霧很濃。", "fogClearMessage": "霧散了。", - "heavyRainStartMessage": "開始下起了暴雨!", "heavyRainLapseMessage": "暴雨勢頭不減。", "heavyRainClearMessage": "暴雨停了。", - "harshSunStartMessage": "日照變得非常強了!", "harshSunLapseMessage": "強日照勢頭不減。", "harshSunClearMessage": "日照復原了。", - "strongWindsStartMessage": "吹起了神秘的亂流!", "strongWindsLapseMessage": "神秘的亂流勢頭不減。", "strongWindsClearMessage": "神秘的亂流停止了。" -}; +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 41cd68afc1e..b5f813bdf2f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,8 +4,8 @@ import InvertPostFX from "./pipelines/invert"; import { version } from "../package.json"; import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import BBCodeTextPlugin from "phaser3-rex-plugins/plugins/bbcodetext-plugin"; -import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin.js"; -import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js"; +import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin"; +import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin"; import { LoadingScene } from "./loading-scene"; @@ -73,75 +73,13 @@ const config: Phaser.Types.Core.GameConfig = { /** * Sets this object's position relative to another object with a given offset - * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x The relative x position - * @param y The relative y position */ -const setPositionRelative = function (guideObject: any, x: number, y: number) { +const setPositionRelative = function (guideObject: Phaser.GameObjects.GameObject, x: number, y: number) { const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y); }; -declare module "phaser" { - namespace GameObjects { - interface Container { - /** - * Sets this object's position relative to another object with a given offset - * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x The relative x position - * @param y The relative y position - */ - setPositionRelative(guideObject: any, x: number, y: number): void; - } - interface Sprite { - /** - * Sets this object's position relative to another object with a given offset - * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x The relative x position - * @param y The relative y position - */ - setPositionRelative(guideObject: any, x: number, y: number): void; - } - interface Image { - /** - * Sets this object's position relative to another object with a given offset - * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x The relative x position - * @param y The relative y position - */ - setPositionRelative(guideObject: any, x: number, y: number): void; - } - interface NineSlice { - /** - * Sets this object's position relative to another object with a given offset - * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x The relative x position - * @param y The relative y position - */ - setPositionRelative(guideObject: any, x: number, y: number): void; - } - interface Text { - /** - * Sets this object's position relative to another object with a given offset - * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x The relative x position - * @param y The relative y position - */ - setPositionRelative(guideObject: any, x: number, y: number): void; - } - interface Rectangle { - /** - * Sets this object's position relative to another object with a given offset - * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x The relative x position - * @param y The relative y position - */ - setPositionRelative(guideObject: any, x: number, y: number): void; - } - } -} - Phaser.GameObjects.Container.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Sprite.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Image.prototype.setPositionRelative = setPositionRelative; diff --git a/src/messages.ts b/src/messages.ts index 5c465cc08e9..1cd6a5966b6 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -2,39 +2,32 @@ import { BattleSpec } from "#enums/battle-spec"; import Pokemon from "./field/pokemon"; import i18next from "i18next"; -/** - * Builds a message by concatenating the Pokemon name with its potential affix and the given text - * @param pokemon {@linkcode Pokemon} name and battle context will be retrieved from this instance for {@linkcode getPokemonNameWithAffix} - * @param {string} content any text - * @returns {string} ex: "Wild Gengar fainted!", "Ectoplasma sauvage est K.O!" - * @see {@linkcode getPokemonNameWithAffix} for the Pokemon's name and potentiel affix - */ -export function getPokemonMessage(pokemon: Pokemon, content: string): string { - return `${getPokemonNameWithAffix(pokemon)}${content}`; -} - /** * Retrieves the Pokemon's name, potentially with an affix indicating its role (wild or foe) in the current battle context, translated * @param pokemon {@linkcode Pokemon} name and battle context will be retrieved from this instance * @returns {string} ex: "Wild Gengar", "Ectoplasma sauvage" */ -export function getPokemonNameWithAffix(pokemon: Pokemon): string { +export function getPokemonNameWithAffix(pokemon: Pokemon | undefined): string { + if (!pokemon) { + return "Missigno"; + } + switch (pokemon.scene.currentBattle.battleSpec) { case BattleSpec.DEFAULT: return !pokemon.isPlayer() ? pokemon.hasTrainer() ? i18next.t("battle:foePokemonWithAffix", { - pokemonName: pokemon.name, + pokemonName: pokemon.getNameToRender(), }) : i18next.t("battle:wildPokemonWithAffix", { - pokemonName: pokemon.name, + pokemonName: pokemon.getNameToRender(), }) - : pokemon.name; + : pokemon.getNameToRender(); case BattleSpec.FINAL_BOSS: return !pokemon.isPlayer() - ? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.name }) - : pokemon.name; + ? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.getNameToRender() }) + : pokemon.getNameToRender(); default: - return pokemon.name; + return pokemon.getNameToRender(); } } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index d8ec0072bd4..fdfe60332f5 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,32 +1,32 @@ import * as Modifiers from "./modifier"; -import { AttackMove, allMoves } from "../data/move"; +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"; import { SpeciesFormKey } from "../data/pokemon-species"; import BattleScene from "../battle-scene"; import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from "../system/voucher"; -import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from "../data/pokemon-forms"; +import { FormChangeItem, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger, pokemonFormChanges } from "../data/pokemon-forms"; import { ModifierTier } from "./modifier-tier"; import { Nature, getNatureName, getNatureStatMultiplier } from "#app/data/nature"; import i18next from "i18next"; import { getModifierTierTextTint } from "#app/ui/text"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { MoneyMultiplierModifier } from "./modifier"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { PermanentStat, TEMP_BATTLE_STATS, TempBattleStat, Stat, getStatKey } from "#app/enums/stat"; const outputModifierData = false; const useMaxWeightForOutput = false; @@ -50,13 +50,13 @@ export class ModifierType { public group: string; public soundName: string; public tier: ModifierTier; - protected newModifierFunc: NewModifierFunc; + protected newModifierFunc: NewModifierFunc | null; - constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, group?: string, soundName?: string) { - this.localeKey = localeKey; - this.iconImage = iconImage; - this.group = group || ""; - this.soundName = soundName || "restore"; + constructor(localeKey: string | null, iconImage: string | null, newModifierFunc: NewModifierFunc | null, group?: string, soundName?: string) { + this.localeKey = localeKey!; // TODO: is this bang correct? + this.iconImage = iconImage!; // TODO: is this bang correct? + this.group = group!; // TODO: is this bang correct? + this.soundName = soundName ?? "se/restore"; this.newModifierFunc = newModifierFunc; } @@ -72,7 +72,7 @@ export class ModifierType { this.tier = tier; } - getOrInferTier(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierTier { + getOrInferTier(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierTier | null { if (this.tier) { return this.tier; } @@ -110,16 +110,36 @@ export class ModifierType { } withIdFromFunc(func: ModifierTypeFunc): ModifierType { - this.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === func); + this.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === func)!; // TODO: is this bang correct? return this; } - newModifier(...args: any[]): Modifier { - return this.newModifierFunc(this, args); + /** + * Populates the tier field by performing a reverse lookup on the modifier pool specified by {@linkcode poolType} using the + * {@linkcode ModifierType}'s id. + * @param poolType the {@linkcode ModifierPoolType} to look into to derive the item's tier; defaults to {@linkcode ModifierPoolType.PLAYER} + */ + withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierType { + for (const tier of Object.values(getModifierPoolForType(poolType))) { + for (const modifier of tier) { + if (this.id === modifier.modifierType.id) { + this.tier = modifier.modifierType.tier; + break; + } + } + if (this.tier) { + break; + } + } + return this; + } + + newModifier(...args: any[]): Modifier | null { + return this.newModifierFunc && this.newModifierFunc(this, args); } } -type ModifierTypeGeneratorFunc = (party: Pokemon[], pregenArgs?: any[]) => ModifierType; +type ModifierTypeGeneratorFunc = (party: Pokemon[], pregenArgs?: any[]) => ModifierType | null; export class ModifierTypeGenerator extends ModifierType { private genTypeFunc: ModifierTypeGeneratorFunc; @@ -148,7 +168,7 @@ class AddPokeballModifierType extends ModifierType { private count: integer; constructor(iconImage: string, pokeballType: PokeballType, count: integer) { - super("", iconImage, (_type, _args) => new Modifiers.AddPokeballModifier(this, pokeballType, count), "pb", "pb_bounce_1"); + super("", iconImage, (_type, _args) => new Modifiers.AddPokeballModifier(this, pokeballType, count), "pb", "se/pb_bounce_1"); this.pokeballType = pokeballType; this.count = count; } @@ -196,7 +216,7 @@ class AddVoucherModifierType extends ModifierType { } export class PokemonModifierType extends ModifierType { - public selectFilter: PokemonSelectFilter; + public selectFilter: PokemonSelectFilter | undefined; constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, group?: string, soundName?: string) { super(localeKey, iconImage, newModifierFunc, group, soundName); @@ -212,10 +232,10 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { const matchingModifier = pokemon.scene.findModifier(m => m instanceof Modifiers.PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(dummyModifier)) as Modifiers.PokemonHeldItemModifier; const maxStackCount = dummyModifier.getMaxStackCount(pokemon.scene); if (!maxStackCount) { - return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable", { "pokemonName": pokemon.name }); + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable", { "pokemonName": getPokemonNameWithAffix(pokemon) }); } if (matchingModifier && matchingModifier.stackCount === maxStackCount) { - return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { "pokemonName": pokemon.name }); + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { "pokemonName": getPokemonNameWithAffix(pokemon) }); } return null; }, group, soundName); @@ -234,7 +254,7 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string, restorePoints: integer, restorePercent: integer, healStatus: boolean = false, newModifierFunc?: NewModifierFunc, selectFilter?: PokemonSelectFilter, group?: string) { super(localeKey, iconImage, newModifierFunc || ((_type, args) => new Modifiers.PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints, this.restorePercent, this.healStatus, false)), selectFilter || ((pokemon: PlayerPokemon) => { - if (!pokemon.hp || (pokemon.hp >= pokemon.getMaxHp() && (!this.healStatus || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED))))) { + if (!pokemon.hp || (pokemon.isFullHp() && (!this.healStatus || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED))))) { return PartyUiHandler.NoEffectMessage; } return null; @@ -297,7 +317,7 @@ export class PokemonStatusHealModifierType extends PokemonModifierType { } export abstract class PokemonMoveModifierType extends PokemonModifierType { - public moveSelectFilter: PokemonMoveSelectFilter; + public moveSelectFilter: PokemonMoveSelectFilter | undefined; constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, moveSelectFilter?: PokemonMoveSelectFilter, group?: string) { super(localeKey, iconImage, newModifierFunc, selectFilter, group); @@ -337,7 +357,7 @@ export class PokemonAllMovePpRestoreModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string, restorePoints: integer) { super(localeKey, iconImage, (_type, args) => new Modifiers.PokemonAllMovePpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints), (pokemon: PlayerPokemon) => { - if (!pokemon.getMoveset().filter(m => m.ppUsed).length) { + if (!pokemon.getMoveset().filter(m => m?.ppUsed).length) { return PartyUiHandler.NoEffectMessage; } return null; @@ -413,39 +433,48 @@ export class RememberMoveModifierType extends PokemonModifierType { } export class DoubleBattleChanceBoosterModifierType extends ModifierType { - public battleCount: integer; + private maxBattles: number; - constructor(localeKey: string, iconImage: string, battleCount: integer) { - super(localeKey, iconImage, (_type, _args) => new Modifiers.DoubleBattleChanceBoosterModifier(this, this.battleCount), "lure"); + constructor(localeKey: string, iconImage: string, maxBattles: number) { + super(localeKey, iconImage, (_type, _args) => new Modifiers.DoubleBattleChanceBoosterModifier(this, maxBattles), "lure"); - this.battleCount = battleCount; + this.maxBattles = maxBattles; } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.DoubleBattleChanceBoosterModifierType.description", { battleCount: this.battleCount }); + getDescription(_scene: BattleScene): string { + return i18next.t("modifierType:ModifierType.DoubleBattleChanceBoosterModifierType.description", { + battleCount: this.maxBattles + }); } } -export class TempBattleStatBoosterModifierType extends ModifierType implements GeneratedPersistentModifierType { - public tempBattleStat: TempBattleStat; +export class TempStatStageBoosterModifierType extends ModifierType implements GeneratedPersistentModifierType { + private stat: TempBattleStat; + private nameKey: string; + private quantityKey: string; - constructor(tempBattleStat: TempBattleStat) { - super("", getTempBattleStatBoosterItemName(tempBattleStat).replace(/\./g, "").replace(/[ ]/g, "_").toLowerCase(), - (_type, _args) => new Modifiers.TempBattleStatBoosterModifier(this, this.tempBattleStat)); + constructor(stat: TempBattleStat) { + const nameKey = TempStatStageBoosterModifierTypeGenerator.items[stat]; + super("", nameKey, (_type, _args) => new Modifiers.TempStatStageBoosterModifier(this, this.stat, 5)); - this.tempBattleStat = tempBattleStat; + this.stat = stat; + this.nameKey = nameKey; + this.quantityKey = (stat !== Stat.ACC) ? "percentage" : "stage"; } get name(): string { - return i18next.t(`modifierType:TempBattleStatBoosterItem.${getTempBattleStatBoosterItemName(this.tempBattleStat).replace(/\./g, "").replace(/[ ]/g, "_").toLowerCase()}`); + return i18next.t(`modifierType:TempStatStageBoosterItem.${this.nameKey}`); } - 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)), + amount: i18next.t(`modifierType:ModifierType.TempStatStageBoosterModifierType.extra.${this.quantityKey}`) + }); } getPregenArgs(): any[] { - return [ this.tempBattleStat ]; + return [ this.stat ]; } } @@ -517,7 +546,7 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i public boostPercent: integer; constructor(moveType: Type, boostPercent: integer) { - super("", `${getAttackTypeBoosterItemName(moveType).replace(/[ \-]/g, "_").toLowerCase()}`, + super("", `${getAttackTypeBoosterItemName(moveType)?.replace(/[ \-]/g, "_").toLowerCase()}`, (_type, args) => new Modifiers.AttackTypeBoosterModifier(this, (args[0] as Pokemon).id, moveType, boostPercent)); this.moveType = moveType; @@ -525,7 +554,7 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i } get name(): string { - return i18next.t(`modifierType:AttackTypeBoosterItem.${getAttackTypeBoosterItemName(this.moveType).replace(/[ \-]/g, "_").toLowerCase()}`); + return i18next.t(`modifierType:AttackTypeBoosterItem.${getAttackTypeBoosterItemName(this.moveType)?.replace(/[ \-]/g, "_").toLowerCase()}`); } getDescription(scene: BattleScene): string { @@ -566,7 +595,12 @@ export class PokemonLevelIncrementModifierType extends PokemonModifierType { } getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.PokemonLevelIncrementModifierType.description"); + let levels = 1; + const hasCandyJar = scene.modifiers.find(modifier => modifier instanceof Modifiers.LevelIncrementBoosterModifier); + if (hasCandyJar) { + levels += hasCandyJar.stackCount; + } + return i18next.t("modifierType:ModifierType.PokemonLevelIncrementModifierType.description", { levels }); } } @@ -576,44 +610,33 @@ export class AllPokemonLevelIncrementModifierType extends ModifierType { } getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.AllPokemonLevelIncrementModifierType.description"); + let levels = 1; + const hasCandyJar = scene.modifiers.find(modifier => modifier instanceof Modifiers.LevelIncrementBoosterModifier); + if (hasCandyJar) { + levels += hasCandyJar.stackCount; + } + return i18next.t("modifierType:ModifierType.AllPokemonLevelIncrementModifierType.description", { levels }); } } -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[] { @@ -627,7 +650,7 @@ class AllPokemonFullHpRestoreModifierType extends ModifierType { constructor(localeKey: string, iconImage: string, descriptionKey?: string, newModifierFunc?: NewModifierFunc) { super(localeKey, iconImage, newModifierFunc || ((_type, _args) => new Modifiers.PokemonHpRestoreModifier(this, -1, 0, 100, false))); - this.descriptionKey = descriptionKey; + this.descriptionKey = descriptionKey!; // TODO: is this bang correct? } getDescription(scene: BattleScene): string { @@ -646,7 +669,7 @@ export class MoneyRewardModifierType extends ModifierType { private moneyMultiplierDescriptorKey: string; constructor(localeKey: string, iconImage: string, moneyMultiplier: number, moneyMultiplierDescriptorKey: string) { - super(localeKey, iconImage, (_type, _args) => new Modifiers.MoneyRewardModifier(this, moneyMultiplier), "money", "buy"); + super(localeKey, iconImage, (_type, _args) => new Modifiers.MoneyRewardModifier(this, moneyMultiplier), "money", "se/buy"); this.moneyMultiplier = moneyMultiplier; this.moneyMultiplierDescriptorKey = moneyMultiplierDescriptorKey; @@ -760,10 +783,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))).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() && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + } 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 === null || e.preFormKey === pokemon.getFusionFormKey())).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { return null; } @@ -798,7 +821,7 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G // Make sure the Pokemon has alternate forms if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) // Get all form changes for this species with an item trigger, including any compound triggers - && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) + && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger) && (fc.preFormKey === pokemon.getFormKey())) // Returns true if any form changes match this item .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) .flat().flatMap(fc => fc.item).includes(this.formChangeItem) @@ -844,11 +867,11 @@ export class FusePokemonModifierType extends PokemonModifierType { class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) { return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20); } - const attackMoveTypes = party.map(p => p.getMoveset().map(m => m.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat(); + const attackMoveTypes = party.map(p => p.getMoveset().map(m => m?.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat(); if (!attackMoveTypes.length) { return null; } @@ -857,8 +880,8 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { let totalWeight = 0; for (const t of attackMoveTypes) { if (attackMoveTypeWeights.has(t)) { - if (attackMoveTypeWeights.get(t) < 3) { - attackMoveTypeWeights.set(t, attackMoveTypeWeights.get(t) + 1); + if (attackMoveTypeWeights.get(t)! < 3) { // attackMoveTypeWeights.has(t) was checked before + attackMoveTypeWeights.set(t, attackMoveTypeWeights.get(t)! + 1); } else { continue; } @@ -878,7 +901,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { let weight = 0; for (const t of attackMoveTypeWeights.keys()) { - const typeWeight = attackMoveTypeWeights.get(t); + const typeWeight = attackMoveTypeWeights.get(t)!; // guranteed to be defined if (randInt <= weight + typeWeight) { type = t; break; @@ -886,7 +909,49 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { weight += typeWeight; } - return new AttackTypeBoosterModifierType(type, 20); + return new AttackTypeBoosterModifierType(type!, 20); + }); + } +} + +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); }); } } @@ -899,7 +964,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] }, @@ -908,18 +973,19 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + const items = SpeciesStatBoosterModifierTypeGenerator.items; + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in items)) { return new SpeciesStatBoosterModifierType(pregenArgs[0] as SpeciesStatBoosterItem); } - const values = Object.values(SpeciesStatBoosterModifierTypeGenerator.items); - const keys = Object.keys(SpeciesStatBoosterModifierTypeGenerator.items); + const values = Object.values(items); + const keys = Object.keys(items); const weights = keys.map(() => 0); for (const p of party) { const speciesId = p.getSpeciesForm(true).speciesId; const fusionSpeciesId = p.isFusion() ? p.getFusionSpeciesForm(true).speciesId : null; - const hasFling = p.getMoveset(true).some(m => m.moveId === Moves.FLING); + const hasFling = p.getMoveset(true).some(m => m?.moveId === Moves.FLING); for (const i in values) { const checkedSpecies = values[i].species; @@ -968,8 +1034,11 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { class TmModifierTypeGenerator extends ModifierTypeGenerator { constructor(tier: ModifierTier) { - super((party: Pokemon[]) => { - const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m.moveId === tm))); + super((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Moves)) { + return new TmModifierType(pregenArgs[0] as Moves); + } + const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm))); const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i); if (!tierUniqueCompatibleTms.length) { return null; @@ -983,7 +1052,7 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator { class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { constructor(rare: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in EvolutionItem)) { return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem); } @@ -992,35 +1061,65 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { const evolutions = pokemonEvolutions[p.species.speciesId]; return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFormKey()) && (!e.condition || e.condition.predicate(p))); }).flat(), - party.filter(p => p.isFusion() && pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId)).map(p => { - const evolutions = pokemonEvolutions[p.fusionSpecies.speciesId]; + party.filter(p => p.isFusion() && p.fusionSpecies && pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId)).map(p => { + const evolutions = pokemonEvolutions[p.fusionSpecies!.speciesId]; return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFusionFormKey()) && (!e.condition || e.condition.predicate(p))); }).flat() - ].flat().flatMap(e => e.item).filter(i => (i > 50) === rare); + ].flat().flatMap(e => e.item).filter(i => (!!i && i > 50) === rare); if (!evolutionItemPool.length) { return null; } - return new EvolutionItemModifierType(evolutionItemPool[Utils.randSeedInt(evolutionItemPool.length)]); + return new EvolutionItemModifierType(evolutionItemPool[Utils.randSeedInt(evolutionItemPool.length)]!); // TODO: is the bang correct? }); } } class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { - constructor() { + constructor(rare: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) { return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); } - const formChangeItemPool = party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => { + const formChangeItemPool = [...new Set(party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => { const formChanges = pokemonFormChanges[p.species.speciesId]; - return formChanges.filter(fc => ((fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 && fc.formKey.indexOf(SpeciesFormKey.PRIMAL) === -1) || party[0].scene.getModifiers(Modifiers.MegaEvolutionAccessModifier).length) - && ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || party[0].scene.getModifiers(Modifiers.GigantamaxAccessModifier).length)) + let formChangeItemTriggers = formChanges.filter(fc => ((fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 && fc.formKey.indexOf(SpeciesFormKey.PRIMAL) === -1) || party[0].scene.getModifiers(Modifiers.MegaEvolutionAccessModifier).length) + && ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || party[0].scene.getModifiers(Modifiers.GigantamaxAccessModifier).length) + && (!fc.conditions.length || fc.conditions.filter(cond => cond instanceof SpeciesFormChangeCondition && cond.predicate(p)).length) + && (fc.preFormKey === p.getFormKey())) .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) .filter(t => t && t.active && !p.scene.findModifier(m => m instanceof Modifiers.PokemonFormChangeItemModifier && m.pokemonId === p.id && m.formChangeItem === t.item)); - }).flat().flatMap(fc => fc.item); + + if (p.species.speciesId === Species.NECROZMA) { + // technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break... + + let foundULTRA_Z = false, + foundN_LUNA = false, + foundN_SOLAR = false; + formChangeItemTriggers.forEach((fc, i) => { + switch (fc.item) { + case FormChangeItem.ULTRANECROZIUM_Z: + foundULTRA_Z = true; + break; + case FormChangeItem.N_LUNARIZER: + foundN_LUNA = true; + break; + case FormChangeItem.N_SOLARIZER: + foundN_SOLAR = true; + break; + } + }); + if (foundULTRA_Z && foundN_LUNA && foundN_SOLAR) { + // all three items are present -> user hasn't acquired any of the N_*ARIZERs -> block ULTRANECROZIUM_Z acquisition. + formChangeItemTriggers = formChangeItemTriggers.filter(fc => fc.item !== FormChangeItem.ULTRANECROZIUM_Z); + } + } + return formChangeItemTriggers; + }).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) { return null; @@ -1144,7 +1243,7 @@ class WeightedModifierType { constructor(modifierTypeFunc: ModifierTypeFunc, weight: integer | WeightedModifierTypeWeightFunc, maxWeight?: integer) { this.modifierType = modifierTypeFunc(); - this.modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc); + this.modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc)!; // TODO: is this bang correct? this.weight = weight; this.maxWeight = maxWeight || (!(weight instanceof Function) ? weight : 0); } @@ -1154,6 +1253,58 @@ class WeightedModifierType { } } +type BaseModifierOverride = { + name: Exclude; + count?: number; +}; + +/** Type for modifiers and held items that are constructed via {@linkcode ModifierTypeGenerator}. */ +export type GeneratorModifierOverride = { + count?: number; +} & ( + | { + name: keyof Pick; + type?: SpeciesStatBoosterItem; + } + | { + name: keyof Pick; + type?: TempBattleStat; + } + | { + name: keyof Pick; + type?: Stat; + } + | { + name: keyof Pick; + type?: Nature; + } + | { + name: keyof Pick; + type?: Type; + } + | { + name: keyof Pick; + type?: BerryType; + } + | { + name: keyof Pick; + type?: EvolutionItem; + } + | { + name: keyof Pick; + type?: FormChangeItem; + } + | { + name: keyof Pick; + type?: Moves; + } +); + +/** Type used to construct modifiers and held items for overriding purposes. */ +export type ModifierOverride = GeneratorModifierOverride | BaseModifierOverride; + +export type ModifierTypeKeys = keyof typeof modifierTypes; + export const modifierTypes = { POKEBALL: () => new AddPokeballModifierType("pb", PokeballType.POKEBALL, 5), GREAT_BALL: () => new AddPokeballModifierType("gb", PokeballType.GREAT_BALL, 5), @@ -1166,7 +1317,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)), @@ -1188,6 +1340,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.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), @@ -1202,41 +1355,36 @@ export const modifierTypes = { SUPER_REPEL: () => new DoubleBattleChanceBoosterModifierType('Super Repel', 10), MAX_REPEL: () => new DoubleBattleChanceBoosterModifierType('Max Repel', 25),*/ - LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.LURE", "lure", 5), - SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 10), - MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 25), + LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.LURE", "lure", 10), + SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 15), + MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 30), SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(), - TEMP_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { - 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) { - 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"), + amount: i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.extra.stage") + }); } - 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, 5)), + + BASE_STAT_BOOSTER: () => new BaseStatBoosterModifierTypeGenerator(), ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(), MINT: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Nature)) { return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature); } return new PokemonNatureChangeModifierType(Utils.randSeedInt(Utils.getEnumValues(Nature).length) as Nature); }), TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) { return new TerastallizeModifierType(pregenArgs[0] as Type); } if (!party[0].scene.getModifiers(Modifiers.TerastallizeAccessModifier).length) { @@ -1253,7 +1401,7 @@ export const modifierTypes = { }), BERRY: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in BerryType)) { return new BerryModifierType(pregenArgs[0] as BerryType); } const berryTypes = Utils.getEnumValues(BerryType); @@ -1291,6 +1439,9 @@ export const modifierTypes = { SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType("modifierType:ModifierType.SOOTHE_BELL", "soothe_bell"), + SCOPE_LENS: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SCOPE_LENS", "scope_lens", (type, args) => new Modifiers.CritBoosterModifier(type, (args[0] as Pokemon).id, 1)), + LEEK: () => new PokemonHeldItemModifierType("modifierType:ModifierType.LEEK", "leek", (type, args) => new Modifiers.SpeciesCritBoosterModifier(type, (args[0] as Pokemon).id, 2, [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD])), + EVIOLITE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVIOLITE", "eviolite", (type, args) => new Modifiers.EvolutionStatBoosterModifier(type, (args[0] as Pokemon).id, [Stat.DEF, Stat.SPDEF], 1.5)), SOUL_DEW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SOUL_DEW", "soul_dew", (type, args) => new Modifiers.PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), @@ -1327,7 +1478,7 @@ export const modifierTypes = { TOXIC_ORB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.TOXIC_ORB", "toxic_orb", (type, args) => new Modifiers.TurnStatusEffectModifier(type, (args[0] as Pokemon).id)), FLAME_ORB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.FLAME_ORB", "flame_orb", (type, args) => new Modifiers.TurnStatusEffectModifier(type, (args[0] as Pokemon).id)), - BATON: () => new PokemonHeldItemModifierType("modifierType:ModifierType.BATON", "stick", (type, args) => new Modifiers.SwitchEffectTransferModifier(type, (args[0] as Pokemon).id)), + BATON: () => new PokemonHeldItemModifierType("modifierType:ModifierType.BATON", "baton", (type, args) => new Modifiers.SwitchEffectTransferModifier(type, (args[0] as Pokemon).id)), SHINY_CHARM: () => new ModifierType("modifierType:ModifierType.SHINY_CHARM", "shiny_charm", (type, _args) => new Modifiers.ShinyRateBoosterModifier(type)), ABILITY_CHARM: () => new ModifierType("modifierType:ModifierType.ABILITY_CHARM", "ability_charm", (type, _args) => new Modifiers.HiddenAbilityRateBoosterModifier(type)), @@ -1342,7 +1493,7 @@ export const modifierTypes = { VOUCHER_PLUS: () => new AddVoucherModifierType(VoucherType.PLUS, 1), VOUCHER_PREMIUM: () => new AddVoucherModifierType(VoucherType.PREMIUM, 1), - GOLDEN_POKEBALL: () => new ModifierType("modifierType:ModifierType.GOLDEN_POKEBALL", "pb_gold", (type, _args) => new Modifiers.ExtraModifierModifier(type), null, "pb_bounce_1"), + GOLDEN_POKEBALL: () => new ModifierType("modifierType:ModifierType.GOLDEN_POKEBALL", "pb_gold", (type, _args) => new Modifiers.ExtraModifierModifier(type), undefined, "se/pb_bounce_1"), ENEMY_DAMAGE_BOOSTER: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", "wl_item_drop", (type, _args) => new Modifiers.EnemyDamageBoosterModifier(type, 5)), ENEMY_DAMAGE_REDUCTION: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", "wl_guard_spec", (type, _args) => new Modifiers.EnemyDamageReducerModifier(type, 2.5)), @@ -1383,15 +1534,15 @@ const modifierPool: ModifierPool = { return thresholdPartyMemberCount; }, 3), new WeightedModifierType(modifierTypes.ETHER, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m.ppUsed && (m.getMovePp() - m.ppUsed) <= 5).length).length, 3); + const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed >= Math.floor(m.getMovePp() / 2)).length).length, 3); return thresholdPartyMemberCount * 3; }, 9), new WeightedModifierType(modifierTypes.MAX_ETHER, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m.ppUsed && (m.getMovePp() - m.ppUsed) <= 5).length).length, 3); + const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed >= Math.floor(m.getMovePp() / 2)).length).length, 3); return thresholdPartyMemberCount; }, 3), - new WeightedModifierType(modifierTypes.LURE, 2), - new WeightedModifierType(modifierTypes.TEMP_STAT_BOOSTER, 4), + new WeightedModifierType(modifierTypes.LURE, skipInLastClassicWaveOrDefault(2)), + new WeightedModifierType(modifierTypes.TEMP_STAT_STAGE_BOOSTER, 4), new WeightedModifierType(modifierTypes.BERRY, 2), new WeightedModifierType(modifierTypes.TM_COMMON, 2), ].map(m => { @@ -1403,7 +1554,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.FULL_HEAL, (party: Pokemon[]) => { const statusEffectPartyMemberCount = Math.min(party.filter(p => p.hp && !!p.status && !p.getHeldItems().some(i => { if (i instanceof Modifiers.TurnStatusEffectModifier) { - return (i as Modifiers.TurnStatusEffectModifier).getStatusEffect() === p.status.effect; + return (i as Modifiers.TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; } return false; })).length, 3); @@ -1431,7 +1582,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.FULL_RESTORE, (party: Pokemon[]) => { const statusEffectPartyMemberCount = Math.min(party.filter(p => p.hp && !!p.status && !p.getHeldItems().some(i => { if (i instanceof Modifiers.TurnStatusEffectModifier) { - return (i as Modifiers.TurnStatusEffectModifier).getStatusEffect() === p.status.effect; + return (i as Modifiers.TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; } return false; })).length, 3); @@ -1439,15 +1590,15 @@ const modifierPool: ModifierPool = { return thresholdPartyMemberCount; }, 3), new WeightedModifierType(modifierTypes.ELIXIR, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m.ppUsed && (m.getMovePp() - m.ppUsed) <= 5).length).length, 3); + const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed >= Math.floor(m.getMovePp() / 2)).length).length, 3); return thresholdPartyMemberCount * 3; }, 9), new WeightedModifierType(modifierTypes.MAX_ELIXIR, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m.ppUsed && (m.getMovePp() - m.ppUsed) <= 5).length).length, 3); + const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed >= Math.floor(m.getMovePp() / 2)).length).length, 3); return thresholdPartyMemberCount; }, 3), new WeightedModifierType(modifierTypes.DIRE_HIT, 4), - new WeightedModifierType(modifierTypes.SUPER_LURE, 4), + new WeightedModifierType(modifierTypes.SUPER_LURE, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.NUGGET, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.EVOLUTION_ITEM, (party: Pokemon[]) => { return Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15), 8); @@ -1470,36 +1621,55 @@ const modifierPool: ModifierPool = { }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ULTRA_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.ULTRA_BALL)) ? 0 : 15, 15), - new WeightedModifierType(modifierTypes.MAX_LURE, 4), + new WeightedModifierType(modifierTypes.MAX_LURE, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.BIG_NUGGET, skipInLastClassicWaveOrDefault(12)), new WeightedModifierType(modifierTypes.PP_MAX, 3), new WeightedModifierType(modifierTypes.MINT, 4), new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32), + new WeightedModifierType(modifierTypes.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[]) => party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0), + new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => { + if (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.EVIOLITE]) { + return party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0; + } + return 0; + }), new WeightedModifierType(modifierTypes.SPECIES_STAT_BOOSTER, 12), + new WeightedModifierType(modifierTypes.LEEK, (party: Pokemon[]) => { + const checkedSpecies = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; + // If a party member doesn't already have a Leek and is one of the relevant species, Leek can appear + return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.SpeciesCritBoosterModifier) && (checkedSpecies.includes(p.getSpeciesForm(true).speciesId) || (p.isFusion() && checkedSpecies.includes(p.getFusionSpeciesForm(true).speciesId)))) ? 12 : 0; + }, 12), new WeightedModifierType(modifierTypes.TOXIC_ORB, (party: Pokemon[]) => { const checkedAbilities = [Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.TOXIC_BOOST, Abilities.POISON_HEAL, Abilities.MAGIC_GUARD]; const checkedMoves = [Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT]; // If a party member doesn't already have one of these two orbs and has one of the above moves or abilities, the orb can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => checkedMoves.includes(m.moveId)))) ? 10 : 0; + return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && checkedMoves.includes(m.moveId)))) ? 10 : 0; }, 10), new WeightedModifierType(modifierTypes.FLAME_ORB, (party: Pokemon[]) => { const checkedAbilities = [Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.FLARE_BOOST, Abilities.MAGIC_GUARD]; const checkedMoves = [Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT]; // If a party member doesn't already have one of these two orbs and has one of the above moves or abilities, the orb can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => checkedMoves.includes(m.moveId)))) ? 10 : 0; + return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && checkedMoves.includes(m.moveId)))) ? 10 : 0; + }, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => { + const checkedAbilities = [Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT]; + const weightMultiplier = party.filter( + p => !p.getHeldItems().some(i => i instanceof 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); }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), - new WeightedModifierType(modifierTypes.CANDY_JAR, 5), + new WeightedModifierType(modifierTypes.CANDY_JAR, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), new WeightedModifierType(modifierTypes.TM_ULTRA, 11), new WeightedModifierType(modifierTypes.RARER_CANDY, 4), new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, skipInLastClassicWaveOrDefault(2)), - new WeightedModifierType(modifierTypes.IV_SCANNER, 4), - new WeightedModifierType(modifierTypes.EXP_CHARM, 8), - new WeightedModifierType(modifierTypes.EXP_SHARE, 10), - new WeightedModifierType(modifierTypes.EXP_BALANCE, 3), + new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)), + new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)), + new WeightedModifierType(modifierTypes.EXP_SHARE, skipInLastClassicWaveOrDefault(10)), + new WeightedModifierType(modifierTypes.EXP_BALANCE, skipInLastClassicWaveOrDefault(3)), new WeightedModifierType(modifierTypes.TERA_ORB, (party: Pokemon[]) => Math.min(Math.max(Math.floor(party[0].scene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.WIDE_LENS, 4), @@ -1513,16 +1683,17 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SHELL_BELL, 3), new WeightedModifierType(modifierTypes.BERRY_POUCH, 4), new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), + new WeightedModifierType(modifierTypes.SCOPE_LENS, 4), new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.SOUL_DEW, 7), //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4), - new WeightedModifierType(modifierTypes.ABILITY_CHARM, 6), + new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), - new WeightedModifierType(modifierTypes.LOCK_CAPSULE, 3), - new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, 8), - new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), + new WeightedModifierType(modifierTypes.LOCK_CAPSULE, skipInLastClassicWaveOrDefault(3)), + new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, skipInLastClassicWaveOrDefault(8)), + 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), @@ -1536,7 +1707,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.MULTI_LENS, 18), new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), - new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE] ? 1 : 0, 1), + new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) ? 1 : 0, 1), ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) @@ -1555,6 +1726,7 @@ const wildModifierPool: ModifierPool = { }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, 0) ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1583,12 +1755,12 @@ const trainerModifierPool: ModifierPool = { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 1), + new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, 0), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.REVIVER_SEED, 2), new WeightedModifierType(modifierTypes.FOCUS_BAND, 2), new WeightedModifierType(modifierTypes.LUCKY_EGG, 4), new WeightedModifierType(modifierTypes.QUICK_CLAW, 1), @@ -1601,6 +1773,7 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.KINGS_ROCK, 1), new WeightedModifierType(modifierTypes.LEFTOVERS, 1), new WeightedModifierType(modifierTypes.SHELL_BELL, 1), + new WeightedModifierType(modifierTypes.SCOPE_LENS, 1), ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) @@ -1638,10 +1811,10 @@ const enemyBuffModifierPool: ModifierPool = { ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), - [ModifierTier.ROGUE]: [ ].map(m => { + [ModifierTier.ROGUE]: [ ].map((m: WeightedModifierType) => { m.setTier(ModifierTier.ROGUE); return m; }), - [ModifierTier.MASTER]: [ ].map(m => { + [ModifierTier.MASTER]: [ ].map((m: WeightedModifierType) => { m.setTier(ModifierTier.MASTER); return m; }) }; @@ -1686,7 +1859,7 @@ const dailyStarterModifierPool: ModifierPool = { export function getModifierType(modifierTypeFunc: ModifierTypeFunc): ModifierType { const modifierType = modifierTypeFunc(); if (!modifierType.id) { - modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc); + modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc)!; // TODO: is this bang correct? } return modifierType; } @@ -1725,7 +1898,7 @@ export function getModifierPoolForType(poolType: ModifierPoolType): ModifierPool return pool; } -const tierWeights = [ 769 / 1024, 192 / 1024, 48 / 1024, 12 / 1024, 1 / 1024 ]; +const tierWeights = [ 768 / 1024, 195 / 1024, 48 / 1024, 12 / 1024, 1 / 1024 ]; export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: ModifierPoolType, rerollCount: integer = 0) { const pool = getModifierPoolForType(poolType); @@ -1809,24 +1982,46 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo const options: ModifierTypeOption[] = []; const retryCount = Math.min(count * 5, 50); new Array(count).fill(0).map((_, i) => { - let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, modifierTiers?.length > i ? modifierTiers[i] : undefined); + let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, modifierTiers && modifierTiers.length > i ? modifierTiers[i] : undefined); let r = 0; - while (options.length && ++r < retryCount && options.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) { - candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate.type.tier, candidate.upgradeCount); + while (options.length && ++r < retryCount && options.filter(o => o.type?.name === candidate?.type?.name || o.type?.group === candidate?.type?.group).length) { + candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate?.type?.tier, candidate?.upgradeCount); + } + if (candidate) { + options.push(candidate); } - options.push(candidate); }); - // OVERRIDE IF NECESSARY - if (Overrides.ITEM_REWARD_OVERRIDE?.length) { - options.forEach((mod, i) => { - // @ts-ignore: keeps throwing don't use string as index error in typedoc run - const override = modifierTypes[Overrides.ITEM_REWARD_OVERRIDE[i]]?.(); - mod.type = (override instanceof ModifierTypeGenerator ? override.generateType(party) : override) || mod.type; - }); - } + + overridePlayerModifierTypeOptions(options, party); + return options; } +/** + * Replaces the {@linkcode ModifierType} of the entries within {@linkcode options} with any + * {@linkcode ModifierOverride} entries listed in {@linkcode Overrides.ITEM_REWARD_OVERRIDE} + * up to the smallest amount of entries between {@linkcode options} and the override array. + * @param options Array of naturally rolled {@linkcode ModifierTypeOption}s + * @param party Array of the player's current party + */ +export function overridePlayerModifierTypeOptions(options: ModifierTypeOption[], party: PlayerPokemon[]) { + const minLength = Math.min(options.length, Overrides.ITEM_REWARD_OVERRIDE.length); + for (let i = 0; i < minLength; i++) { + const override: ModifierOverride = Overrides.ITEM_REWARD_OVERRIDE[i]; + const modifierFunc = modifierTypes[override.name]; + let modifierType: ModifierType | null = modifierFunc(); + + if (modifierType instanceof ModifierTypeGenerator) { + const pregenArgs = ("type" in override) && (override.type !== null) ? [override.type] : undefined; + modifierType = modifierType.generateType(party, pregenArgs); + } + + if (modifierType) { + options[i].type = modifierType.withIdFromFunc(modifierFunc).withTierFromPool(); + } + } +} + export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, baseCost: integer): ModifierTypeOption[] { if (!(waveIndex % 10)) { return []; @@ -1865,23 +2060,35 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, base } export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: Modifiers.PersistentModifier[], scene: BattleScene): Modifiers.EnemyPersistentModifier { - const tierStackCount = tier === ModifierTier.ULTRA ? 5 : tier === ModifierTier.GREAT ? 3 : 1; - const retryCount = 50; - let candidate = getNewModifierTypeOption(null, ModifierPoolType.ENEMY_BUFF, tier); - let r = 0; - let matchingModifier: Modifiers.PersistentModifier; - while (++r < retryCount && (matchingModifier = enemyModifiers.find(m => m.type.id === candidate.type.id)) && matchingModifier.getMaxStackCount(scene) < matchingModifier.stackCount + (r < 10 ? tierStackCount : 1)) { - candidate = getNewModifierTypeOption(null, ModifierPoolType.ENEMY_BUFF, tier); + let tierStackCount: number; + switch (tier) { + case ModifierTier.ULTRA: + tierStackCount = 5; + break; + case ModifierTier.GREAT: + tierStackCount = 3; + break; + default: + tierStackCount = 1; + break; } - const modifier = candidate.type.newModifier() as Modifiers.EnemyPersistentModifier; + const retryCount = 50; + let candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier); + let r = 0; + let matchingModifier: Modifiers.PersistentModifier | undefined; + while (++r < retryCount && (matchingModifier = enemyModifiers.find(m => m.type.id === candidate?.type?.id)) && matchingModifier.getMaxStackCount(scene) < matchingModifier.stackCount + (r < 10 ? tierStackCount : 1)) { + candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier); + } + + const modifier = candidate?.type?.newModifier() as Modifiers.EnemyPersistentModifier; modifier.stackCount = tierStackCount; return modifier; } export function getEnemyModifierTypesForWave(waveIndex: integer, count: integer, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, upgradeChance: integer = 0): PokemonHeldItemModifierType[] { - const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !Utils.randSeedInt(upgradeChance) ? 1 : 0).type as PokemonHeldItemModifierType); + const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !Utils.randSeedInt(upgradeChance) ? 1 : 0)?.type as PokemonHeldItemModifierType); if (!(waveIndex % 1000)) { ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType); } @@ -1893,8 +2100,21 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): Modifiers.P for (const p of party) { for (let m = 0; m < 3; m++) { const tierValue = Utils.randSeedInt(64); - const tier = tierValue > 25 ? ModifierTier.COMMON : tierValue > 12 ? ModifierTier.GREAT : tierValue > 4 ? ModifierTier.ULTRA : tierValue ? ModifierTier.ROGUE : ModifierTier.MASTER; - const modifier = getNewModifierTypeOption(party, ModifierPoolType.DAILY_STARTER, tier).type.newModifier(p) as Modifiers.PokemonHeldItemModifier; + + let tier: ModifierTier; + if (tierValue > 25) { + tier = ModifierTier.COMMON; + } else if (tierValue > 12) { + tier = ModifierTier.GREAT; + } else if (tierValue > 4) { + tier = ModifierTier.ULTRA; + } else if (tierValue) { + tier = ModifierTier.ROGUE; + } else { + tier = ModifierTier.MASTER; + } + + const modifier = getNewModifierTypeOption(party, ModifierPoolType.DAILY_STARTER, tier)?.type?.newModifier(p) as Modifiers.PokemonHeldItemModifier; ret.push(modifier); } } @@ -1902,7 +2122,7 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): Modifiers.P return ret; } -function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, tier?: ModifierTier, upgradeCount?: integer, retryCount: integer = 0): ModifierTypeOption { +function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, tier?: ModifierTier, upgradeCount?: integer, retryCount: integer = 0): ModifierTypeOption | null { const player = !poolType; const pool = getModifierPoolForType(poolType); let thresholds: object; @@ -1939,11 +2159,19 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, } } while (upgraded); } - tier = tierValue > 255 ? ModifierTier.COMMON : tierValue > 60 ? ModifierTier.GREAT : tierValue > 12 ? ModifierTier.ULTRA : tierValue ? ModifierTier.ROGUE : ModifierTier.MASTER; - // Does this actually do anything? - if (!upgradeCount) { - upgradeCount = Math.min(upgradeCount, ModifierTier.MASTER - tier); + + if (tierValue > 255) { + tier = ModifierTier.COMMON; + } else if (tierValue > 60) { + tier = ModifierTier.GREAT; + } else if (tierValue > 12) { + tier = ModifierTier.ULTRA; + } else if (tierValue) { + tier = ModifierTier.ROGUE; + } else { + tier = ModifierTier.MASTER; } + tier += upgradeCount; while (tier && (!modifierPool.hasOwnProperty(tier) || !modifierPool[tier].length)) { tier--; @@ -1973,7 +2201,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, const tierThresholds = Object.keys(thresholds[tier]); const totalWeight = parseInt(tierThresholds[tierThresholds.length - 1]); const value = Utils.randSeedInt(totalWeight); - let index: integer; + let index: integer | undefined; for (const t of tierThresholds) { const threshold = parseInt(t); if (value < threshold) { @@ -1989,7 +2217,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, if (player) { console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier]); } - let modifierType: ModifierType = (pool[tier][index]).modifierType; + let modifierType: ModifierType | null = (pool[tier][index]).modifierType; if (modifierType instanceof ModifierTypeGenerator) { modifierType = (modifierType as ModifierTypeGenerator).generateType(party); if (modifierType === null) { @@ -2002,7 +2230,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, console.log(modifierType, !player ? "(enemy)" : ""); - return new ModifierTypeOption(modifierType as ModifierType, upgradeCount); + return new ModifierTypeOption(modifierType as ModifierType, upgradeCount!); // TODO: is this bang correct? } export function getDefaultModifierTypeForTier(tier: ModifierTier): ModifierType { @@ -2026,7 +2254,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; } @@ -2036,6 +2264,19 @@ export function getLuckString(luckValue: integer): string { } export function getLuckTextTint(luckValue: integer): integer { - const modifierTier = luckValue ? luckValue > 2 ? luckValue > 5 ? luckValue > 9 ? luckValue > 11 ? ModifierTier.LUXURY : ModifierTier.MASTER : ModifierTier.ROGUE : ModifierTier.ULTRA : ModifierTier.GREAT : ModifierTier.COMMON; + let modifierTier: ModifierTier; + if (luckValue > 11) { + modifierTier = ModifierTier.LUXURY; + } else if (luckValue > 9) { + modifierTier = ModifierTier.MASTER; + } else if (luckValue > 5) { + modifierTier = ModifierTier.ROGUE; + } else if (luckValue > 2) { + modifierTier = ModifierTier.ULTRA; + } else if (luckValue) { + modifierTier = ModifierTier.GREAT; + } else { + modifierTier = ModifierTier.COMMON; + } return getModifierTierTextTint(modifierTier); } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 0b339906cc5..0b105a0c852 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1,47 +1,49 @@ import * as ModifierTypes from "./modifier-type"; -import { LearnMovePhase, LevelUpPhase, PokemonHealPhase } from "../phases"; 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 "../evolution-phase"; +import { EvolutionPhase } from "../phases/evolution-phase"; import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; -import {getPokemonMessage, getPokemonNameWithAffix} from "../messages"; +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"; import { VoucherType } from "../system/voucher"; import { FormChangeItem, SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; import { Nature } from "#app/data/nature"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { ModifierType, modifierTypes } from "./modifier-type"; -import { Command } from "#app/ui/command-ui-handler.js"; +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.js"; -import { Abilities } from "#app/enums/abilities.js"; +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; +import { LevelUpPhase } from "#app/phases/level-up-phase"; +import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; export type ModifierPredicate = (modifier: Modifier) => boolean; const iconOverflowIndex = 24; -export const modifierSortFunc = (a: Modifier, b: Modifier) => { +export const modifierSortFunc = (a: Modifier, b: Modifier): number => { const itemNameMatch = a.type.name.localeCompare(b.type.name); const typeNameMatch = a.constructor.name.localeCompare(b.constructor.name); - const aId = a instanceof PokemonHeldItemModifier ? a.pokemonId : 4294967295; - const bId = b instanceof PokemonHeldItemModifier ? b.pokemonId : 4294967295; + const aId = a instanceof PokemonHeldItemModifier && a.pokemonId ? a.pokemonId : 4294967295; + const bId = b instanceof PokemonHeldItemModifier && b.pokemonId ? b.pokemonId : 4294967295; //First sort by pokemonID if (aId < bId) { return 1; - } else if (aId>bId) { + } else if (aId > bId) { return -1; } else if (aId === bId) { //Then sort by item type @@ -51,6 +53,8 @@ export const modifierSortFunc = (a: Modifier, b: Modifier) => { } else { return typeNameMatch; } + } else { + return 0; } }; @@ -149,7 +153,7 @@ export abstract class PersistentModifier extends Modifier { public stackCount: integer; public virtualStackCount: integer; - constructor(type: ModifierType, stackCount: integer) { + constructor(type: ModifierType, stackCount?: integer) { super(type); this.stackCount = stackCount === undefined ? 1 : stackCount; this.virtualStackCount = 0; @@ -220,7 +224,7 @@ export abstract class PersistentModifier extends Modifier { return container; } - getIconStackText(scene: BattleScene, virtual?: boolean): Phaser.GameObjects.BitmapText { + getIconStackText(scene: BattleScene, virtual?: boolean): Phaser.GameObjects.BitmapText | null { if (this.getMaxStackCount(scene) === 1 || (virtual && !this.virtualStackCount)) { return null; } @@ -288,110 +292,232 @@ export class AddVoucherModifier extends ConsumableModifier { } } +/** + * Modifier used for party-wide or passive items that start an initial + * {@linkcode battleCount} equal to {@linkcode maxBattles} that, for every + * battle, decrements. Typically, when {@linkcode battleCount} reaches 0, the + * modifier will be removed. If a modifier of the same type is to be added, it + * will reset {@linkcode battleCount} back to {@linkcode maxBattles} of the + * existing modifier instead of adding that modifier directly. + * @extends PersistentModifier + * @abstract + * @see {@linkcode add} + */ export abstract class LapsingPersistentModifier extends PersistentModifier { - protected battlesLeft: integer; + /** The maximum amount of battles the modifier will exist for */ + private maxBattles: number; + /** The current amount of battles the modifier will exist for */ + private battleCount: number; - constructor(type: ModifierTypes.ModifierType, battlesLeft?: integer, stackCount?: integer) { + constructor(type: ModifierTypes.ModifierType, maxBattles: number, battleCount?: number, stackCount?: integer) { super(type, stackCount); - this.battlesLeft = battlesLeft; + this.maxBattles = maxBattles; + this.battleCount = battleCount ?? this.maxBattles; } - lapse(args: any[]): boolean { - return !!--this.battlesLeft; + /** + * 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 battleCount}. + * @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 LapsingPersistentModifier; + if (modifierInstance.getBattleCount() < modifierInstance.getMaxBattles()) { + modifierInstance.resetBattleCount(); + scene.playSound("se/restore"); + return true; + } + // should never get here + return false; + } + } + + modifiers.push(this); + return true; + } + + lapse(_args: any[]): boolean { + this.battleCount--; + return this.battleCount > 0; } getIcon(scene: BattleScene): Phaser.GameObjects.Container { const container = super.getIcon(scene); - const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: "66px", color: "#f89890" }); - battleCountText.setShadow(0, 0, null); - battleCountText.setStroke("#984038", 16); + // Linear interpolation on hue + const hue = Math.floor(120 * (this.battleCount / this.maxBattles) + 5); + + // Generates the color hex code with a constant saturation and lightness but varying hue + const typeHex = Utils.hslToHex(hue, 0.50, 0.90); + const strokeHex = Utils.hslToHex(hue, 0.70, 0.30); + + const battleCountText = addTextObject(scene, 27, 0, this.battleCount.toString(), TextStyle.PARTY, { fontSize: "66px", color: typeHex }); + battleCountText.setShadow(0, 0); + battleCountText.setStroke(strokeHex, 16); battleCountText.setOrigin(1, 0); container.add(battleCountText); return container; } - getBattlesLeft(): integer { - return this.battlesLeft; + getBattleCount(): number { + return this.battleCount; } - getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number { - return 99; - } -} - -export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier { - constructor(type: ModifierTypes.DoubleBattleChanceBoosterModifierType, battlesLeft: integer, stackCount?: integer) { - super(type, battlesLeft, stackCount); + resetBattleCount(): void { + this.battleCount = this.maxBattles; } - match(modifier: Modifier): boolean { - if (modifier instanceof DoubleBattleChanceBoosterModifier) { - // Check type id to not match different tiers of lures - return modifier.type.id === this.type.id && modifier.battlesLeft === this.battlesLeft; - } - return false; - } - - clone(): DoubleBattleChanceBoosterModifier { - return new DoubleBattleChanceBoosterModifier(this.type as ModifierTypes.DoubleBattleChanceBoosterModifierType, this.battlesLeft, this.stackCount); + getMaxBattles(): number { + return this.maxBattles; } getArgs(): any[] { - return [ this.battlesLeft ]; + return [ this.maxBattles, this.battleCount ]; } + + getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number { + return 1; + } +} + +/** + * Modifier used for passive items, specifically lures, that + * temporarily increases the chance of a double battle. + * @extends LapsingPersistentModifier + * @see {@linkcode apply} + */ +export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier { + constructor(type: ModifierType, maxBattles:number, battleCount?: number, stackCount?: integer) { + super(type, maxBattles, battleCount, stackCount); + } + + match(modifier: Modifier): boolean { + return (modifier instanceof DoubleBattleChanceBoosterModifier) && (modifier.getMaxBattles() === this.getMaxBattles()); + } + + clone(): DoubleBattleChanceBoosterModifier { + return new DoubleBattleChanceBoosterModifier(this.type as ModifierTypes.DoubleBattleChanceBoosterModifierType, this.getMaxBattles(), this.getBattleCount(), this.stackCount); + } + /** * Modifies the chance of a double battle occurring - * @param args A single element array containing the double battle chance as a NumberHolder - * @returns {boolean} Returns true if the modifier was applied + * @param args [0] {@linkcode Utils.NumberHolder} for double battle chance + * @returns true if the modifier was applied */ apply(args: any[]): boolean { const doubleBattleChance = args[0] as Utils.NumberHolder; // This is divided because the chance is generated as a number from 0 to doubleBattleChance.value using Utils.randSeedInt // A double battle will initiate if the generated number is 0 - doubleBattleChance.value = Math.ceil(doubleBattleChance.value / 2); + doubleBattleChance.value = Math.ceil(doubleBattleChance.value / 4); return true; } } -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 { + /** The stat whose stat stage multiplier will be temporarily increased */ + private stat: TempBattleStat; + /** The amount by which the stat stage itself or its multiplier will be increased by */ + private boost: number; - constructor(type: ModifierTypes.TempBattleStatBoosterModifierType, tempBattleStat: TempBattleStat, battlesLeft?: integer, stackCount?: integer) { - super(type, battlesLeft || 5, stackCount); + constructor(type: ModifierType, stat: TempBattleStat, maxBattles: number, battleCount?: number, stackCount?: number) { + super(type, maxBattles, battleCount, 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.boost = (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.getMaxBattles(), this.getBattleCount(), this.stackCount); } getArgs(): any[] { - return [ this.tempBattleStat, this.battlesLeft ]; + return [ this.stat, ...super.getArgs() ]; } + /** + * 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); + } + + /** + * Increases the incoming stat stage matching {@linkcode stat} by {@linkcode boost}. + * @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 { - const tempBattleStat = args[0] as TempBattleStat; + (args[1] as Utils.NumberHolder).value += this.boost; + return true; + } +} - if (tempBattleStat === this.tempBattleStat) { - const statLevel = args[1] as Utils.IntegerHolder; - statLevel.value = Math.min(statLevel.value + 1, 6); - return true; - } +/** + * 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, maxBattles: number, battleCount?: number, stackCount?: number) { + super(type, maxBattles, battleCount, stackCount); + } - return false; + clone() { + return new TempCritBoosterModifier(this.type, this.getMaxBattles(), this.getBattleCount(), 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; } } @@ -469,8 +595,9 @@ export class TerastallizeAccessModifier extends PersistentModifier { export abstract class PokemonHeldItemModifier extends PersistentModifier { public pokemonId: integer; + readonly isTransferrable: boolean = true; - constructor(type: ModifierType, pokemonId: integer, stackCount: integer) { + constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, stackCount); this.pokemonId = pokemonId; @@ -487,15 +614,11 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { } shouldApply(args: any[]): boolean { - return super.shouldApply(args) && args.length && args[0] instanceof Pokemon && (this.pokemonId === -1 || (args[0] as Pokemon).id === this.pokemonId); - } - - getTransferrable(withinParty: boolean) { - return true; + return super.shouldApply(args) && args.length !== 0 && args[0] instanceof Pokemon && (this.pokemonId === -1 || (args[0] as Pokemon).id === this.pokemonId); } isIconVisible(scene: BattleScene): boolean { - return this.getPokemon(scene).isOnField(); + return !!(this.getPokemon(scene)?.isOnField()); } getIcon(scene: BattleScene, forSummary?: boolean): Phaser.GameObjects.Container { @@ -503,9 +626,11 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { if (!forSummary) { const pokemon = this.getPokemon(scene); - const pokemonIcon = scene.addPokemonIcon(pokemon, -2, 10, 0, 0.5); - - container.add(pokemonIcon); + if (pokemon) { + const pokemonIcon = scene.addPokemonIcon(pokemon, -2, 10, 0, 0.5); + container.add(pokemonIcon); + container.setName(pokemon.id.toString()); + } const item = scene.add.sprite(16, this.virtualStackCount ? 8 : 16, "items"); item.setScale(0.5); @@ -529,8 +654,8 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { return container; } - getPokemon(scene: BattleScene): Pokemon { - return scene.getPokemonById(this.pokemonId); + getPokemon(scene: BattleScene): Pokemon | undefined { + return this.pokemonId ? scene.getPokemonById(this.pokemonId) ?? undefined : undefined; } getScoreMultiplier(): number { @@ -564,16 +689,17 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { return this.getMaxHeldItemCount(pokemon); } - abstract getMaxHeldItemCount(pokemon: Pokemon): integer; + abstract getMaxHeldItemCount(pokemon?: Pokemon): integer; } export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModifier { protected battlesLeft: integer; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.ModifierType, pokemonId: integer, battlesLeft?: integer, stackCount?: integer) { super(type, pokemonId, stackCount); - this.battlesLeft = battlesLeft; + this.battlesLeft = battlesLeft!; // TODO: is this bang correct? } lapse(args: any[]): boolean { @@ -583,9 +709,9 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi getIcon(scene: BattleScene, forSummary?: boolean): Phaser.GameObjects.Container { const container = super.getIcon(scene, forSummary); - if (this.getPokemon(scene).isPlayer()) { + if (this.getPokemon(scene)?.isPlayer()) { const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: "66px", color: "#f89890" }); - battleCountText.setShadow(0, 0, null); + battleCountText.setShadow(0, 0); battleCountText.setStroke("#984038", 16); battleCountText.setOrigin(1, 0); container.add(battleCountText); @@ -605,6 +731,7 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { public teraType: Type; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.TerastallizeModifierType, pokemonId: integer, teraType: Type, battlesLeft?: integer, stackCount?: integer) { super(type, pokemonId, battlesLeft || 10, stackCount); @@ -648,10 +775,6 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { return ret; } - getTransferrable(withinParty: boolean): boolean { - return false; - } - getScoreMultiplier(): number { return 1.25; } @@ -661,23 +784,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[] { @@ -685,19 +815,15 @@ 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; } - getTransferrable(_withinParty: boolean): boolean { - return false; - } - getScoreMultiplier(): number { return 1.1; } @@ -881,6 +1007,97 @@ export class SpeciesStatBoosterModifier extends StatBoosterModifier { } } +/** + * Modifier used for held items that apply critical-hit stage boost(s). + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class CritBoosterModifier extends PokemonHeldItemModifier { + /** The amount of stages by which the held item increases the current critical-hit stage value */ + protected stageIncrement: number; + + constructor(type: ModifierType, pokemonId: integer, stageIncrement: number, stackCount?: integer) { + super(type, pokemonId, stackCount); + + this.stageIncrement = stageIncrement; + } + + clone() { + return new CritBoosterModifier(this.type, this.pokemonId, this.stageIncrement, this.stackCount); + } + + getArgs(): any[] { + return super.getArgs().concat(this.stageIncrement); + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof CritBoosterModifier) { + return (modifier as CritBoosterModifier).stageIncrement === this.stageIncrement; + } + + return false; + } + + /** + * Increases the current critical-hit stage value by {@linkcode stageIncrement}. + * @param args [0] {@linkcode Pokemon} N/A + * [1] {@linkcode Utils.IntegerHolder} that holds the resulting critical-hit level + * @returns true if the critical-hit stage boost applies successfully, false otherwise + */ + apply(args: any[]): boolean { + const critStage = args[1] as Utils.NumberHolder; + + critStage.value += this.stageIncrement; + return true; + } + + getMaxHeldItemCount(_pokemon: Pokemon): number { + return 1; + } +} + +/** + * Modifier used for held items that apply critical-hit stage boost(s) + * if the holder is of a specific {@linkcode Species}. + * @extends CritBoosterModifier + * @see {@linkcode shouldApply} + */ +export class SpeciesCritBoosterModifier extends CritBoosterModifier { + /** The species that the held item's critical-hit stage boost applies to */ + private species: Species[]; + + constructor(type: ModifierType, pokemonId: integer, stageIncrement: number, species: Species[], stackCount?: integer) { + super(type, pokemonId, stageIncrement, stackCount); + + this.species = species; + } + + clone() { + return new SpeciesCritBoosterModifier(this.type, this.pokemonId, this.stageIncrement, this.species, this.stackCount); + } + + getArgs(): any[] { + return [ ...super.getArgs(), this.species ]; + } + + matchType(modifier: Modifier): boolean { + return modifier instanceof SpeciesCritBoosterModifier; + } + + /** + * Checks if the holder's {@linkcode Species} (or its fused species) is listed + * in {@linkcode species}. + * @param args [0] {@linkcode Pokemon} that holds the held item + * [1] {@linkcode Utils.IntegerHolder} N/A + * @returns true if the critical-hit level can be incremented, false otherwise + */ + shouldApply(args: any[]) { + const holder = args[0] as Pokemon; + + return super.shouldApply(args) && (this.species.includes(holder.getSpeciesForm(true).speciesId) || (holder.isFusion() && this.species.includes(holder.getFusionSpeciesForm(true).speciesId))); + } +} + /** * Applies Specific Type item boosts (e.g., Magnet) */ @@ -965,7 +1182,7 @@ export class SurviveDamageModifier extends PokemonHeldItemModifier { if (!surviveDamage.value && pokemon.randSeedInt(10) < this.getStackCount()) { surviveDamage.value = true; - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` hung on\nusing its ${this.type.name}!`)); + pokemon.scene.queueMessage(i18next.t("modifier:surviveDamageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); return true; } @@ -1004,7 +1221,7 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { const hasQuickClaw = this.type instanceof ModifierTypes.PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW"; if (isCommandFight && hasQuickClaw) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " used its Quick Claw to move faster!")); + pokemon.scene.queueMessage(i18next.t("modifier:bypassSpeedChanceApply", { pokemonName: getPokemonNameWithAffix(pokemon), itemName: i18next.t("modifierType:ModifierType.QUICK_CLAW.name") })); } return true; } @@ -1067,10 +1284,10 @@ export class TurnHealModifier extends PokemonHeldItemModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - if (pokemon.getHpRatio() < 1) { + if (!pokemon.isFullHp()) { const scene = pokemon.scene; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 16) * this.stackCount, 1), getPokemonMessage(pokemon, `'s ${this.type.name}\nrestored its HP a little!`), true)); + Utils.toDmgValue(pokemon.getMaxHp() / 16) * this.stackCount, i18next.t("modifier:turnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); return true; } @@ -1158,10 +1375,10 @@ export class HitHealModifier extends PokemonHeldItemModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - if (pokemon.turnData.damageDealt && pokemon.getHpRatio() < 1) { + if (pokemon.turnData.damageDealt && !pokemon.isFullHp()) { const scene = pokemon.scene; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.turnData.damageDealt / 8) * this.stackCount, 1), getPokemonMessage(pokemon, `'s ${this.type.name}\nrestored its HP a little!`), true)); + Utils.toDmgValue(pokemon.turnData.damageDealt / 8) * this.stackCount, i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); } return true; @@ -1296,7 +1513,7 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { const pokemon = args[0] as Pokemon; pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 2), 1), getPokemonMessage(pokemon, ` was revived\nby its ${this.type.name}!`), false, false, true)); + Utils.toDmgValue(pokemon.getMaxHp() / 2), i18next.t("modifier:pokemonInstantReviveApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), false, false, true)); pokemon.resetStatus(true, false, true); return true; @@ -1307,6 +1524,53 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { } } +/** + * Modifier used for held items, namely White Herb, that restore adverse stat + * stages in battle. + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class ResetNegativeStatStageModifier extends PokemonHeldItemModifier { + constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + } + + matchType(modifier: Modifier) { + return modifier instanceof ResetNegativeStatStageModifier; + } + + clone() { + return new ResetNegativeStatStageModifier(this.type, this.pokemonId, this.stackCount); + } + + /** + * 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; + let statRestored = false; + + for (const s of BATTLE_STATS) { + if (pokemon.getStatStage(s) < 0) { + pokemon.setStatStage(s, 0); + statRestored = true; + } + } + + if (statRestored) { + pokemon.scene.queueMessage(i18next.t("modifier:resetNegativeStatStageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); + } + return statRestored; + } + + getMaxHeldItemCount(_pokemon: Pokemon): integer { + return 2; + } +} + export abstract class ConsumablePokemonModifier extends ConsumableModifier { public pokemonId: integer; @@ -1317,7 +1581,7 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { } shouldApply(args: any[]): boolean { - return args.length && args[0] instanceof PlayerPokemon && (this.pokemonId === -1 || (args[0] as PlayerPokemon).id === this.pokemonId); + return args.length !== 0 && args[0] instanceof PlayerPokemon && (this.pokemonId === -1 || (args[0] as PlayerPokemon).id === this.pokemonId); } getPokemon(scene: BattleScene) { @@ -1394,7 +1658,7 @@ export class PokemonPpRestoreModifier extends ConsumablePokemonMoveModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - const move = pokemon.getMoveset()[this.moveIndex]; + const move = pokemon.getMoveset()[this.moveIndex]!; //TODO: is the bang correct? move.ppUsed = this.restorePoints > -1 ? Math.max(move.ppUsed - this.restorePoints, 0) : 0; return true; @@ -1413,7 +1677,7 @@ export class PokemonAllMovePpRestoreModifier extends ConsumablePokemonModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; for (const move of pokemon.getMoveset()) { - move.ppUsed = this.restorePoints > -1 ? Math.max(move.ppUsed - this.restorePoints, 0) : 0; + move!.ppUsed = this.restorePoints > -1 ? Math.max(move!.ppUsed - this.restorePoints, 0) : 0; // TODO: are those bangs correct? } return true; @@ -1431,7 +1695,7 @@ export class PokemonPpUpModifier extends ConsumablePokemonMoveModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - const move = pokemon.getMoveset()[this.moveIndex]; + const move = pokemon.getMoveset()[this.moveIndex]!; // TODO: is the bang correct? move.ppUp = Math.min(move.ppUp + this.upPoints, 3); return true; @@ -1451,11 +1715,11 @@ export class PokemonNatureChangeModifier extends ConsumablePokemonModifier { const pokemon = args[0] as Pokemon; pokemon.natureOverride = this.nature; let speciesId = pokemon.species.speciesId; - pokemon.scene.gameData.dexData[speciesId].natureAttr |= Math.pow(2, this.nature + 1); + pokemon.scene.gameData.dexData[speciesId].natureAttr |= 1 << (this.nature + 1); while (pokemonPrevolutions.hasOwnProperty(speciesId)) { speciesId = pokemonPrevolutions[speciesId]; - pokemon.scene.gameData.dexData[speciesId].natureAttr |= Math.pow(2, this.nature + 1); + pokemon.scene.gameData.dexData[speciesId].natureAttr |= 1 << (this.nature + 1); } return true; @@ -1494,7 +1758,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; } @@ -1533,7 +1797,7 @@ export class EvolutionItemModifier extends ConsumablePokemonModifier { : null; if (!matchingEvolution && pokemon.isFusion()) { - matchingEvolution = pokemonEvolutions[pokemon.fusionSpecies.speciesId].find(e => e.item === (this.type as ModifierTypes.EvolutionItemModifierType).evolutionItem + matchingEvolution = pokemonEvolutions[pokemon.fusionSpecies!.speciesId].find(e => e.item === (this.type as ModifierTypes.EvolutionItemModifierType).evolutionItem // TODO: is the bang correct? && (e.evoFormKey === null || (e.preFormKey || "") === pokemon.getFusionFormKey()) && (!e.condition || e.condition.predicate(pokemon))); if (matchingEvolution) { @@ -1877,6 +2141,7 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { public formChangeItem: FormChangeItem; public active: boolean; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.FormChangeItemModifierType, pokemonId: integer, formChangeItem: FormChangeItem, active: boolean, stackCount?: integer) { super(type, pokemonId, stackCount); @@ -1915,10 +2180,6 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { return ret; } - getTransferrable(withinParty: boolean) { - return withinParty; - } - getMaxHeldItemCount(pokemon: Pokemon): integer { return 1; } @@ -2010,7 +2271,10 @@ export class MoneyInterestModifier extends PersistentModifier { const interestAmount = Math.floor(scene.money * 0.1 * this.getStackCount()); scene.addMoney(interestAmount); - scene.queueMessage(`You received interest of ₽${interestAmount.toLocaleString("en-US")}\nfrom the ${this.type.name}!`, null, true); + const userLocale = navigator.language || "en-US"; + const formattedMoneyAmount = interestAmount.toLocaleString(userLocale); + const message = i18next.t("modifier:moneyInterestApply", { moneyAmount: formattedMoneyAmount, typeName: this.type.name }); + scene.queueMessage(message, undefined, true); return true; } @@ -2062,7 +2326,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; } @@ -2160,13 +2424,12 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { return false; } - const withinParty = pokemon.isPlayer() === targetPokemon.isPlayer(); const poolType = pokemon.isPlayer() ? ModifierTypes.ModifierPoolType.PLAYER : pokemon.hasTrainer() ? ModifierTypes.ModifierPoolType.TRAINER : ModifierTypes.ModifierPoolType.WILD; const transferredModifierTypes: ModifierTypes.ModifierType[] = []; const itemModifiers = pokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === targetPokemon.id && m.getTransferrable(withinParty), targetPokemon.isPlayer()) as PokemonHeldItemModifier[]; - let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier, highestTier), 0); + && m.pokemonId === targetPokemon.id && m.isTransferrable, targetPokemon.isPlayer()) as PokemonHeldItemModifier[]; + let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is this bang correct? let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); const heldItemTransferPromises: Promise[] = []; @@ -2210,6 +2473,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { * @see {@linkcode modifierTypes[MINI_BLACK_HOLE]} */ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { + isTransferrable: boolean = true; constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, pokemonId, stackCount); } @@ -2222,21 +2486,21 @@ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { return new TurnHeldItemTransferModifier(this.type, this.pokemonId, this.stackCount); } - getTransferrable(withinParty: boolean) { - return withinParty; - } - getTransferredItemCount(): integer { return this.getStackCount(); } getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierTypes.ModifierType): string { - return getPokemonMessage(targetPokemon, `'s ${item.name} was absorbed\nby ${pokemon.name}'s ${this.type.name}!`); + return i18next.t("modifier:turnHeldItemTransferApply", { pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), itemName: item.name, pokemonName: pokemon.getNameToRender(), typeName: this.type.name }); } getMaxHeldItemCount(pokemon: Pokemon): integer { return 1; } + + setTransferrableFalse(): void { + this.isTransferrable = false; + } } /** @@ -2285,7 +2549,7 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif } getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierTypes.ModifierType): string { - return getPokemonMessage(targetPokemon, `'s ${item.name} was snatched\nby ${pokemon.name}'s ${this.type.name}!`); + return i18next.t("modifier:contactHeldItemTransferApply", { pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), itemName: item.name, pokemonName: getPokemonNameWithAffix(pokemon), typeName: this.type.name }); } getMaxHeldItemCount(pokemon: Pokemon): integer { @@ -2440,10 +2704,10 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - if (pokemon.getHpRatio() < 1) { + if (!pokemon.isFullHp()) { const scene = pokemon.scene; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), getPokemonMessage(pokemon, "\nrestored some HP!"), true, false, false, false, true)); + Math.max(Math.floor(pokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), i18next.t("modifier:enemyTurnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), true, false, false, false, true)); return true; } @@ -2610,68 +2874,78 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { } /** - * Uses override from overrides.ts to set PersistentModifiers for starting a new game - * @param scene current BattleScene - * @param player is this for player for enemy + * Uses either `MODIFIER_OVERRIDE` in overrides.ts to set {@linkcode PersistentModifier}s for either: + * - The player + * - The enemy + * @param scene current {@linkcode BattleScene} + * @param isPlayer {@linkcode boolean} for whether the player (`true`) or enemy (`false`) is being overridden */ -export function overrideModifiers(scene: BattleScene, player: boolean = true): void { - const modifierOverride = player ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; - if (!modifierOverride || modifierOverride.length === 0 || !scene) { +export function overrideModifiers(scene: BattleScene, isPlayer: boolean = true): void { + const modifiersOverride: ModifierTypes.ModifierOverride[] = isPlayer ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; + if (!modifiersOverride || modifiersOverride.length === 0 || !scene) { return; - } // if no override, do nothing - // if it's the opponent, we clear all his current modifiers to avoid stacking - if (!player) { + } + + // If it's the opponent, clear all of their current modifiers to avoid stacking + if (!isPlayer) { scene.clearEnemyModifiers(); } - // we loop through all the modifier name given in the override file - modifierOverride.forEach(item => { - const modifierName = item.name; - const qty = item.count || 1; - if (!modifierTypes.hasOwnProperty(modifierName)) { - return; - } // if the modifier does not exist, we skip it - const modifierType: ModifierType = modifierTypes[modifierName](); - const modifier: PersistentModifier = modifierType.withIdFromFunc(modifierTypes[modifierName]).newModifier() as PersistentModifier; - modifier.stackCount = qty; - if (player) { - scene.addModifier(modifier, true, false, false, true); - } else { - scene.addEnemyModifier(modifier, true, true); + + modifiersOverride.forEach(item => { + const modifierFunc = modifierTypes[item.name]; + let modifierType: ModifierType | null = modifierFunc(); + + 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); + } } }); } /** - * Uses override from overrides.ts to set PokemonHeldItemModifiers for starting a new game - * @param scene current BattleScene - * @param player is this for player for enemy + * Uses either `HELD_ITEMS_OVERRIDE` in overrides.ts to set {@linkcode PokemonHeldItemModifier}s for either: + * - The first member of the player's team when starting a new game + * - An enemy {@linkcode Pokemon} being spawned in + * @param scene current {@linkcode BattleScene} + * @param pokemon {@linkcode Pokemon} whose held items are being overridden + * @param isPlayer {@linkcode boolean} for whether the {@linkcode pokemon} is the player's (`true`) or an enemy (`false`) */ -export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, player: boolean = true): void { - const heldItemsOverride = player ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; +export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, isPlayer: boolean = true): void { + const heldItemsOverride: ModifierTypes.ModifierOverride[] = isPlayer ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) { return; - } // if no override, do nothing - // we loop through all the itemName given in the override file + } + heldItemsOverride.forEach(item => { - const itemName = item.name; + const modifierFunc = modifierTypes[item.name]; + let modifierType: ModifierType | null = modifierFunc(); const qty = item.count || 1; - if (!modifierTypes.hasOwnProperty(itemName)) { - return; - } // if the item does not exist, we skip it - const modifierType: ModifierType = modifierTypes[itemName](); // we retrieve the item in the list - let itemModifier: PokemonHeldItemModifier; + if (modifierType instanceof ModifierTypes.ModifierTypeGenerator) { - itemModifier = modifierType.generateType(null, [item.type]).withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; - } else { - itemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; + const pregenArgs = ("type" in item) && (item.type !== null) ? [item.type] : undefined; + modifierType = modifierType.generateType([], pregenArgs); } - // we create the item - itemModifier.pokemonId = pokemon.id; // we assign the created item to the pokemon - itemModifier.stackCount = qty; // we say how many items we want - if (player) { - scene.addModifier(itemModifier, true, false, false, true); - } else { - scene.addEnemyModifier(itemModifier, true, true); + + const heldItemModifier = modifierType && modifierType.withIdFromFunc(modifierFunc).newModifier(pokemon) as PokemonHeldItemModifier; + if (heldItemModifier) { + heldItemModifier.pokemonId = pokemon.id; + heldItemModifier.stackCount = qty; + if (isPlayer) { + scene.addModifier(heldItemModifier, true, false, false, true); + } else { + scene.addEnemyModifier(heldItemModifier, true, true); + } } }); } diff --git a/src/overrides.ts b/src/overrides.ts index 3e894967893..48c118b55bc 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -1,148 +1,197 @@ -import { WeatherType } from "./data/weather"; -import { Variant } from "./data/variant"; -import { TempBattleStat } from "./data/temp-battle-stat"; -import { Nature } from "./data/nature"; -import { Type } from "./data/type"; -import { Stat } from "./data/pokemon-stat"; -import { PokeballCounts } from "./battle-scene"; -import { PokeballType } from "./data/pokeball"; -import { Gender } from "./data/gender"; -import { StatusEffect } from "./data/status-effect"; -import { SpeciesStatBoosterItem, modifierTypes } from "./modifier/modifier-type"; -import { VariantTier } from "./enums/variant-tiers"; -import { EggTier } from "#enums/egg-type"; -import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars import { Abilities } from "#enums/abilities"; -import { BerryType } from "#enums/berry-type"; import { Biome } from "#enums/biome"; +import { EggTier } from "#enums/egg-type"; import { Moves } from "#enums/moves"; +import { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; import { TimeOfDay } from "#enums/time-of-day"; +import { VariantTier } from "#enums/variant-tiers"; +import { WeatherType } from "#enums/weather-type"; +import { type PokeballCounts } from "./battle-scene"; +import { Gender } from "./data/gender"; +import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars +import { Variant } from "./data/variant"; +import { type ModifierOverride } from "./modifier/modifier-type"; /** - * Overrides for testing different in game situations - * if an override name starts with "STARTING", it will apply when a new run begins - */ - -/** - * OVERALL OVERRIDES - */ - -// a specific seed (default: a random string of 24 characters) -export const SEED_OVERRIDE: string = ""; -export const WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; -export const DOUBLE_BATTLE_OVERRIDE: boolean = false; -export const SINGLE_BATTLE_OVERRIDE: boolean = false; -export const STARTING_WAVE_OVERRIDE: integer = 0; -export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; -export const ARENA_TINT_OVERRIDE: TimeOfDay = null; -// Multiplies XP gained by this value including 0. Set to null to ignore the override -export const XP_MULTIPLIER_OVERRIDE: number = null; -// default 1000 -export const STARTING_MONEY_OVERRIDE: integer = 0; -export const FREE_CANDY_UPGRADE_OVERRIDE: boolean = false; -export const POKEBALL_OVERRIDE: { active: boolean, pokeballs: PokeballCounts } = { - active: false, - pokeballs: { - [PokeballType.POKEBALL]: 5, - [PokeballType.GREAT_BALL]: 0, - [PokeballType.ULTRA_BALL]: 0, - [PokeballType.ROGUE_BALL]: 0, - [PokeballType.MASTER_BALL]: 0, - } -}; - -/** - * PLAYER OVERRIDES - */ - -/** - * Set the form index of any starter in the party whose `speciesId` is inside this override - * @see {@link allSpecies} in `src/data/pokemon-species.ts` for form indexes + * Overrides that are using when testing different in game situations + * + * Any override added here will be used instead of the value in {@linkcode DefaultOverrides} + * + * If an override name starts with "STARTING", it will apply when a new run begins + * * @example * ``` - * const STARTER_FORM_OVERRIDES = { - * [Species.DARMANITAN]: 1 + * const overrides = { + * ABILITY_OVERRIDE: Abilities.PROTEAN, + * PASSIVE_ABILITY_OVERRIDE: Abilities.PIXILATE, * } * ``` */ -export const STARTER_FORM_OVERRIDES: Partial> = {}; - -// default 5 or 20 for Daily -export const STARTING_LEVEL_OVERRIDE: integer = 0; -/** - * SPECIES OVERRIDE - * will only apply to the first starter in your party or each enemy pokemon - * default is 0 to not override - * @example SPECIES_OVERRIDE = Species.Bulbasaur; - */ -export const STARTER_SPECIES_OVERRIDE: Species | integer = 0; -export const ABILITY_OVERRIDE: Abilities = Abilities.NONE; -export const PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; -export const STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; -export const GENDER_OVERRIDE: Gender = null; -export const MOVESET_OVERRIDE: Array = []; -export const SHINY_OVERRIDE: boolean = false; -export const VARIANT_OVERRIDE: Variant = 0; +const overrides = {} satisfies Partial>; /** - * OPPONENT / ENEMY OVERRIDES - */ - -export const OPP_SPECIES_OVERRIDE: Species | integer = 0; -export const OPP_LEVEL_OVERRIDE: number = 0; -export const OPP_ABILITY_OVERRIDE: Abilities = Abilities.NONE; -export const OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; -export const OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; -export const OPP_GENDER_OVERRIDE: Gender = null; -export const OPP_MOVESET_OVERRIDE: Array = []; -export const OPP_SHINY_OVERRIDE: boolean = false; -export const OPP_VARIANT_OVERRIDE: Variant = 0; -export const OPP_IVS_OVERRIDE: integer | integer[] = []; - -/** - * EGG OVERRIDES - */ - -export const EGG_IMMEDIATE_HATCH_OVERRIDE: boolean = false; -export const EGG_TIER_OVERRIDE: EggTier = null; -export const EGG_SHINY_OVERRIDE: boolean = false; -export const EGG_VARIANT_OVERRIDE: VariantTier = null; -export const EGG_FREE_GACHA_PULLS_OVERRIDE: boolean = false; -export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; - -/** - * MODIFIER / ITEM OVERRIDES - * if count is not provided, it will default to 1 - * @example Modifier Override [{name: "EXP_SHARE", count: 2}] - * @example Held Item Override [{name: "LUCKY_EGG"}] + * If you need to add Overrides values for local testing do that inside {@linkcode overrides} + * --- + * Defaults for Overrides that are used when testing different in game situations * - * Some items are generated based on a sub-type (i.e. berries), to override those: - * @example [{name: "BERRY", count: 5, type: BerryType.SITRUS}] - * types are listed in interface below - * - TempBattleStat is for TEMP_STAT_BOOSTER / X Items (Dire hit is separate) - * - Stat is for BASE_STAT_BOOSTER / Vitamin - * - Nature is for MINT - * - Type is for TERA_SHARD or ATTACK_TYPE_BOOSTER (type boosting items i.e Silk Scarf) - * - BerryType is for BERRY - * - SpeciesStatBoosterItem is for SPECIES_STAT_BOOSTER + * If an override name starts with "STARTING", it will apply when a new run begins */ -interface ModifierOverride { - name: keyof typeof modifierTypes & string, - count?: integer - type?: TempBattleStat|Stat|Nature|Type|BerryType|SpeciesStatBoosterItem +class DefaultOverrides { + // ----------------- + // OVERALL OVERRIDES + // ----------------- + /** a specific seed (default: a random string of 24 characters) */ + readonly SEED_OVERRIDE: string = ""; + readonly WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; + readonly BATTLE_TYPE_OVERRIDE: "double" | "single" | null = null; + readonly STARTING_WAVE_OVERRIDE: number = 0; + readonly STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; + readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null; + /** Multiplies XP gained by this value including 0. Set to null to ignore the override */ + readonly XP_MULTIPLIER_OVERRIDE: number | null = null; + readonly NEVER_CRIT_OVERRIDE: boolean = false; + /** default 1000 */ + readonly STARTING_MONEY_OVERRIDE: number = 0; + /** Sets all shop item prices to 0 */ + readonly WAIVE_SHOP_FEES_OVERRIDE: boolean = false; + /** Sets reroll price to 0 */ + readonly WAIVE_ROLL_FEE_OVERRIDE: boolean = false; + readonly FREE_CANDY_UPGRADE_OVERRIDE: boolean = false; + readonly POKEBALL_OVERRIDE: { active: boolean; pokeballs: PokeballCounts } = { + active: false, + pokeballs: { + [PokeballType.POKEBALL]: 5, + [PokeballType.GREAT_BALL]: 0, + [PokeballType.ULTRA_BALL]: 0, + [PokeballType.ROGUE_BALL]: 0, + [PokeballType.MASTER_BALL]: 0, + }, + }; + + // ---------------- + // PLAYER OVERRIDES + // ---------------- + /** + * Set the form index of any starter in the party whose `speciesId` is inside this override + * @see {@link allSpecies} in `src/data/pokemon-species.ts` for form indexes + * @example + * ``` + * const STARTER_FORM_OVERRIDES = { + * [Species.DARMANITAN]: 1 + * } + * ``` + */ + readonly STARTER_FORM_OVERRIDES: Partial> = {}; + + /** default 5 or 20 for Daily */ + readonly STARTING_LEVEL_OVERRIDE: number = 0; + /** + * SPECIES OVERRIDE + * will only apply to the first starter in your party or each enemy pokemon + * default is 0 to not override + * @example SPECIES_OVERRIDE = Species.Bulbasaur; + */ + readonly STARTER_SPECIES_OVERRIDE: Species | number = 0; + readonly ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; + readonly GENDER_OVERRIDE: Gender | null = null; + readonly MOVESET_OVERRIDE: Array = []; + readonly SHINY_OVERRIDE: boolean = false; + readonly VARIANT_OVERRIDE: Variant = 0; + + // -------------------------- + // OPPONENT / ENEMY OVERRIDES + // -------------------------- + readonly OPP_SPECIES_OVERRIDE: Species | number = 0; + readonly OPP_LEVEL_OVERRIDE: number = 0; + readonly OPP_ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; + readonly OPP_GENDER_OVERRIDE: Gender | null = null; + readonly OPP_MOVESET_OVERRIDE: Array = []; + readonly OPP_SHINY_OVERRIDE: boolean = false; + 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 + // ------------- + readonly EGG_IMMEDIATE_HATCH_OVERRIDE: boolean = false; + readonly EGG_TIER_OVERRIDE: EggTier | null = null; + readonly EGG_SHINY_OVERRIDE: boolean = false; + readonly EGG_VARIANT_OVERRIDE: VariantTier | null = null; + readonly EGG_FREE_GACHA_PULLS_OVERRIDE: boolean = false; + readonly EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; + + // ------------------------- + // MODIFIER / ITEM OVERRIDES + // ------------------------- + /** + * Overrides labeled `MODIFIER` deal with any modifier so long as it doesn't require a party + * member to hold it (typically this is, extends, or generates a {@linkcode ModifierType}), + * like `EXP_SHARE`, `CANDY_JAR`, etc. + * + * Overrides labeled `HELD_ITEM` specifically pertain to any entry in {@linkcode modifierTypes} that + * extends, or generates a {@linkcode PokemonHeldItemModifierType}, like `SOUL_DEW`, `TOXIC_ORB`, etc. + * + * Note that, if count is not provided, it will default to 1. + * + * Additionally, note that some held items and modifiers are grouped together via + * a {@linkcode ModifierTypeGenerator} and require pre-generation arguments to get + * a specific item from that group. If a type is not set, the generator will either + * use the party to weight item choice or randomly pick an item. + * + * @example + * ``` + * // Will have a quantity of 2 in-game + * STARTING_MODIFIER_OVERRIDE = [{name: "EXP_SHARE", count: 2}] + * // Will have a quantity of 1 in-game + * STARTING_HELD_ITEM_OVERRIDE = [{name: "LUCKY_EGG"}] + * // Type must be given to get a specific berry + * STARTING_HELD_ITEM_OVERRIDE = [{name: "BERRY", type: BerryType.SITRUS}] + * // A random berry will be generated at runtime + * STARTING_HELD_ITEM_OVERRIDE = [{name: "BERRY"}] + * ``` + */ + readonly STARTING_MODIFIER_OVERRIDE: ModifierOverride[] = []; + /** + * Override array of {@linkcode ModifierOverride}s used to provide modifiers to enemies. + * + * Note that any previous modifiers are cleared. + */ + readonly OPP_MODIFIER_OVERRIDE: ModifierOverride[] = []; + + /** Override array of {@linkcode ModifierOverride}s used to provide held items to first party member when starting a new game. */ + readonly STARTING_HELD_ITEMS_OVERRIDE: ModifierOverride[] = []; + /** Override array of {@linkcode ModifierOverride}s used to provide held items to enemies on spawn. */ + readonly OPP_HELD_ITEMS_OVERRIDE: ModifierOverride[] = []; + + /** + * Override array of {@linkcode ModifierOverride}s used to replace the generated item rolls after a wave. + * + * If less entries are listed than rolled, only those entries will be used to replace the corresponding items while the rest randomly generated. + * If more entries are listed than rolled, only the first X entries will be used, where X is the number of items rolled. + * + * Note that, for all items in the array, `count` is not used. + */ + readonly ITEM_REWARD_OVERRIDE: ModifierOverride[] = []; } -export const STARTING_MODIFIER_OVERRIDE: Array = []; -export const OPP_MODIFIER_OVERRIDE: Array = []; -export const STARTING_HELD_ITEMS_OVERRIDE: Array = []; -export const OPP_HELD_ITEMS_OVERRIDE: Array = []; -export const NEVER_CRIT_OVERRIDE: boolean = false; +export const defaultOverrides = new DefaultOverrides(); -/** - * An array of items by keys as defined in the "modifierTypes" object in the "modifier/modifier-type.ts" file. - * Items listed will replace the normal rolls. - * If less items are listed than rolled, only some items will be replaced - * If more items are listed than rolled, only the first X items will be shown, where X is the number of items rolled. - */ -export const ITEM_REWARD_OVERRIDE: Array = []; +export default { + ...defaultOverrides, + ...overrides +} satisfies InstanceType; diff --git a/src/phases.ts b/src/phases.ts deleted file mode 100644 index df7314e6285..00000000000 --- a/src/phases.ts +++ /dev/null @@ -1,5507 +0,0 @@ -import BattleScene, { bypassLogin } from "./battle-scene"; -import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./field/pokemon"; -import * as Utils from "./utils"; -import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, PreMoveMessageAttr, HealStatusEffectAttr, IgnoreOpponentStatChangesAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, OneHitKOAccuracyAttr, ForceSwitchOutAttr, VariableTargetAttr, IncrementMovePriorityAttr } from "./data/move"; -import { Mode } from "./ui/ui"; -import { Command } from "./ui/command-ui-handler"; -import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier } from "./modifier/modifier"; -import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; -import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; -import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; -import { StatusEffect, getStatusEffectActivationText, getStatusEffectCatchRateMultiplier, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText } from "./data/status-effect"; -import { SummaryUiMode } from "./ui/summary-ui-handler"; -import EvolutionSceneHandler from "./ui/evolution-scene-handler"; -import { EvolutionPhase } from "./evolution-phase"; -import { Phase } from "./phase"; -import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat"; -import { biomeLinks, getBiomeName } from "./data/biomes"; -import { ModifierTier } from "./modifier/modifier-tier"; -import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; -import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; -import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; -import { Starter } from "./ui/starter-select-ui-handler"; -import { Gender } from "./data/gender"; -import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; -import { TempBattleStat } from "./data/temp-battle-stat"; -import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; -import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, AddSecondStrikeAbAttr } from "./data/ability"; -import { Unlockables, getUnlockableName } from "./system/unlockables"; -import { getBiomeKey } from "./field/arena"; -import { BattleType, BattlerIndex, TurnCommand } from "./battle"; -import { ChallengeAchv, HealAchv, LevelAchv, achvs } from "./system/achv"; -import { TrainerSlot, trainerConfigs } from "./data/trainer-config"; -import { EggHatchPhase } from "./egg-hatch-phase"; -import { Egg } from "./data/egg"; -import { vouchers } from "./system/voucher"; -import { clientSessionId, loggedInUser, updateUserInfo } from "./account"; -import { SessionSaveData } from "./system/game-data"; -import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims"; -import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms"; -import { battleSpecDialogue, getCharVariantFromDialogue, miscDialogue } from "./data/dialogue"; -import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "./ui/modifier-select-ui-handler"; -import { SettingKeys } from "./system/settings/settings"; -import { Tutorial, handleTutorial } from "./tutorial"; -import { TerrainType } from "./data/terrain"; -import { OptionSelectConfig, OptionSelectItem } from "./ui/abstact-option-select-ui-handler"; -import { SaveSlotUiMode } from "./ui/save-slot-select-ui-handler"; -import { fetchDailyRunSeed, getDailyRunStarters } from "./data/daily-run"; -import { GameMode, GameModes, getGameMode } from "./game-mode"; -import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; -import i18next from "./plugins/i18n"; -import * as Overrides from "./overrides"; -import { TextStyle, addTextObject } from "./ui/text"; -import { Type } from "./data/type"; -import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./events/battle-scene"; -import { Abilities } from "#enums/abilities"; -import { ArenaTagType } from "#enums/arena-tag-type"; -import { BattleSpec } from "#enums/battle-spec"; -import { BattleStyle } from "#enums/battle-style"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { Biome } from "#enums/biome"; -import { ExpNotification } from "#enums/exp-notification"; -import { Moves } from "#enums/moves"; -import { PlayerGender } from "#enums/player-gender"; -import { Species } from "#enums/species"; -import { TrainerType } from "#enums/trainer-type"; - -const { t } = i18next; - -export class LoginPhase extends Phase { - private showText: boolean; - - constructor(scene: BattleScene, showText?: boolean) { - super(scene); - - this.showText = showText === undefined || !!showText; - } - - start(): void { - super.start(); - - const hasSession = !!Utils.getCookie(Utils.sessionIdKey); - - this.scene.ui.setMode(Mode.LOADING, { buttonActions: [] }); - Utils.executeIf(bypassLogin || hasSession, updateUserInfo).then(response => { - const success = response ? response[0] : false; - const statusCode = response ? response[1] : null; - if (!success) { - if (!statusCode || statusCode === 400) { - if (this.showText) { - this.scene.ui.showText(i18next.t("menu:logInOrCreateAccount")); - } - - this.scene.playSound("menu_open"); - - const loadData = () => { - updateUserInfo().then(success => { - if (!success[0]) { - Utils.setCookie(Utils.sessionIdKey, ""); - this.scene.reset(true, true); - return; - } - this.scene.gameData.loadSystem().then(() => this.end()); - }); - }; - - this.scene.ui.setMode(Mode.LOGIN_FORM, { - buttonActions: [ - () => { - this.scene.ui.playSelect(); - loadData(); - }, () => { - this.scene.playSound("menu_open"); - this.scene.ui.setMode(Mode.REGISTRATION_FORM, { - buttonActions: [ - () => { - this.scene.ui.playSelect(); - updateUserInfo().then(success => { - if (!success[0]) { - Utils.setCookie(Utils.sessionIdKey, ""); - this.scene.reset(true, true); - return; - } - this.end(); - } ); - }, () => { - this.scene.unshiftPhase(new LoginPhase(this.scene, false)); - this.end(); - } - ] - }); - } - ] - }); - } else if (statusCode === 401) { - Utils.setCookie(Utils.sessionIdKey, ""); - this.scene.reset(true, true); - } else { - this.scene.unshiftPhase(new UnavailablePhase(this.scene)); - super.end(); - } - return null; - } else { - this.scene.gameData.loadSystem().then(success => { - if (success || bypassLogin) { - this.end(); - } else { - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(t("menu:failedToLoadSaveData")); - } - }); - } - }); - } - - end(): void { - this.scene.ui.setMode(Mode.MESSAGE); - - if (!this.scene.gameData.gender) { - this.scene.unshiftPhase(new SelectGenderPhase(this.scene)); - } - - handleTutorial(this.scene, Tutorial.Intro).then(() => super.end()); - } -} - -export class TitlePhase extends Phase { - private loaded: boolean; - private lastSessionData: SessionSaveData; - public gameMode: GameModes; - - constructor(scene: BattleScene) { - super(scene); - - this.loaded = false; - } - - start(): void { - super.start(); - - this.scene.ui.clearText(); - this.scene.ui.fadeIn(250); - - this.scene.playBgm("title", true); - - this.scene.gameData.getSession(loggedInUser.lastSessionSlot).then(sessionData => { - if (sessionData) { - this.lastSessionData = sessionData; - const biomeKey = getBiomeKey(sessionData.arena.biome); - const bgTexture = `${biomeKey}_bg`; - this.scene.arenaBg.setTexture(bgTexture); - } - this.showOptions(); - }).catch(err => { - console.error(err); - this.showOptions(); - }); - } - - showOptions(): void { - const options: OptionSelectItem[] = []; - if (loggedInUser.lastSessionSlot > -1) { - options.push({ - label: i18next.t("continue", null, { ns: "menu"}), - handler: () => { - this.loadSaveSlot(this.lastSessionData ? -1 : loggedInUser.lastSessionSlot); - return true; - } - }); - } - options.push({ - label: i18next.t("menu:newGame"), - handler: () => { - const setModeAndEnd = (gameMode: GameModes) => { - this.gameMode = gameMode; - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.clearText(); - this.end(); - }; - if (this.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]) { - const options: OptionSelectItem[] = [ - { - label: GameMode.getModeName(GameModes.CLASSIC), - handler: () => { - setModeAndEnd(GameModes.CLASSIC); - return true; - } - }, - { - label: GameMode.getModeName(GameModes.CHALLENGE), - handler: () => { - setModeAndEnd(GameModes.CHALLENGE); - return true; - } - }, - { - label: GameMode.getModeName(GameModes.ENDLESS), - handler: () => { - setModeAndEnd(GameModes.ENDLESS); - return true; - } - } - ]; - if (this.scene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE]) { - options.push({ - label: GameMode.getModeName(GameModes.SPLICED_ENDLESS), - handler: () => { - setModeAndEnd(GameModes.SPLICED_ENDLESS); - return true; - } - }); - } - options.push({ - label: i18next.t("menu:cancel"), - handler: () => { - this.scene.clearPhaseQueue(); - this.scene.pushPhase(new TitlePhase(this.scene)); - super.end(); - return true; - } - }); - this.scene.ui.showText(i18next.t("menu:selectGameMode"), null, () => this.scene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options })); - } else { - this.gameMode = GameModes.CLASSIC; - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.clearText(); - this.end(); - } - return true; - } - }, - { - label: i18next.t("menu:loadGame"), - handler: () => { - this.scene.ui.setOverlayMode(Mode.SAVE_SLOT, SaveSlotUiMode.LOAD, - (slotId: integer) => { - if (slotId === -1) { - return this.showOptions(); - } - this.loadSaveSlot(slotId); - }); - return true; - } - }, - { - label: i18next.t("menu:dailyRun"), - handler: () => { - this.initDailyRun(); - return true; - }, - keepOpen: true - }, - { - label: i18next.t("menu:settings"), - handler: () => { - this.scene.ui.setOverlayMode(Mode.SETTINGS); - return true; - }, - keepOpen: true - }); - const config: OptionSelectConfig = { - options: options, - noCancel: true, - yOffset: 47 - }; - this.scene.ui.setMode(Mode.TITLE, config); - } - - loadSaveSlot(slotId: integer): void { - this.scene.sessionSlotId = slotId > -1 ? slotId : loggedInUser.lastSessionSlot; - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.gameData.loadSession(this.scene, slotId, slotId === -1 ? this.lastSessionData : null).then((success: boolean) => { - if (success) { - this.loaded = true; - this.scene.ui.showText(i18next.t("menu:sessionSuccess"), null, () => this.end()); - } else { - this.end(); - } - }).catch(err => { - console.error(err); - this.scene.ui.showText(i18next.t("menu:failedToLoadSession"), null); - }); - } - - initDailyRun(): void { - this.scene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: integer) => { - this.scene.clearPhaseQueue(); - if (slotId === -1) { - this.scene.pushPhase(new TitlePhase(this.scene)); - return super.end(); - } - this.scene.sessionSlotId = slotId; - - const generateDaily = (seed: string) => { - this.scene.gameMode = getGameMode(GameModes.DAILY); - - this.scene.setSeed(seed); - this.scene.resetSeed(1); - - this.scene.money = this.scene.gameMode.getStartingMoney(); - - const starters = getDailyRunStarters(this.scene, seed); - const startingLevel = this.scene.gameMode.getStartingLevel(); - - const party = this.scene.getParty(); - const loadPokemonAssets: Promise[] = []; - for (const starter of starters) { - const starterProps = this.scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); - const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); - const starterGender = starter.species.malePercent !== null - ? !starterProps.female ? Gender.MALE : Gender.FEMALE - : Gender.GENDERLESS; - const starterPokemon = this.scene.addPlayerPokemon(starter.species, startingLevel, starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, undefined, starter.nature); - starterPokemon.setVisible(false); - party.push(starterPokemon); - loadPokemonAssets.push(starterPokemon.loadAssets()); - } - - regenerateModifierPoolThresholds(party, ModifierPoolType.DAILY_STARTER); - const modifiers: Modifier[] = Array(3).fill(null).map(() => modifierTypes.EXP_SHARE().withIdFromFunc(modifierTypes.EXP_SHARE).newModifier()) - .concat(Array(3).fill(null).map(() => modifierTypes.GOLDEN_EXP_CHARM().withIdFromFunc(modifierTypes.GOLDEN_EXP_CHARM).newModifier())) - .concat(getDailyRunStarterModifiers(party)); - - for (const m of modifiers) { - this.scene.addModifier(m, true, false, false, true); - } - this.scene.updateModifiers(true, true); - - Promise.all(loadPokemonAssets).then(() => { - this.scene.time.delayedCall(500, () => this.scene.playBgm()); - this.scene.gameData.gameStats.dailyRunSessionsPlayed++; - this.scene.newArena(this.scene.gameMode.getStartingBiome(this.scene)); - this.scene.newBattle(); - this.scene.arena.init(); - this.scene.sessionPlayTime = 0; - this.scene.lastSavePlayTime = 0; - this.end(); - }); - }; - - // If Online, calls seed fetch from db to generate daily run. If Offline, generates a daily run based on current date. - if (!Utils.isLocal) { - fetchDailyRunSeed().then(seed => { - generateDaily(seed); - }).catch(err => { - console.error("Failed to load daily run:\n", err); - }); - } else { - generateDaily(btoa(new Date().toISOString().substring(0, 10))); - } - }); - } - - end(): void { - if (!this.loaded && !this.scene.gameMode.isDaily) { - this.scene.arena.preloadBgm(); - this.scene.gameMode = getGameMode(this.gameMode); - if (this.gameMode === GameModes.CHALLENGE) { - this.scene.pushPhase(new SelectChallengePhase(this.scene)); - } else { - this.scene.pushPhase(new SelectStarterPhase(this.scene)); - } - this.scene.newArena(this.scene.gameMode.getStartingBiome(this.scene)); - } else { - this.scene.playBgm(); - } - - this.scene.pushPhase(new EncounterPhase(this.scene, this.loaded)); - - if (this.loaded) { - const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()).length; - - this.scene.pushPhase(new SummonPhase(this.scene, 0, true, true)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) { - this.scene.pushPhase(new SummonPhase(this.scene, 1, true, true)); - } - - if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { - const minPartySize = this.scene.currentBattle.double ? 2 : 1; - if (availablePartyMembers > minPartySize) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); - } - } - } - } - - for (const achv of Object.keys(this.scene.gameData.achvUnlocks)) { - if (vouchers.hasOwnProperty(achv)) { - this.scene.validateVoucher(vouchers[achv]); - } - } - - super.end(); - } -} - -export class UnavailablePhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - - start(): void { - this.scene.ui.setMode(Mode.UNAVAILABLE, () => { - this.scene.unshiftPhase(new LoginPhase(this.scene, true)); - this.end(); - }); - } -} - -export class ReloadSessionPhase extends Phase { - private systemDataStr: string; - - constructor(scene: BattleScene, systemDataStr?: string) { - super(scene); - - this.systemDataStr = systemDataStr; - } - - start(): void { - this.scene.ui.setMode(Mode.SESSION_RELOAD); - - let delayElapsed = false; - let loaded = false; - - this.scene.time.delayedCall(Utils.fixedInt(1500), () => { - if (loaded) { - this.end(); - } else { - delayElapsed = true; - } - }); - - this.scene.gameData.clearLocalData(); - - (this.systemDataStr ? this.scene.gameData.initSystem(this.systemDataStr) : this.scene.gameData.loadSystem()).then(() => { - if (delayElapsed) { - this.end(); - } else { - loaded = true; - } - }); - } -} - -export class OutdatedPhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - - start(): void { - this.scene.ui.setMode(Mode.OUTDATED); - } -} - -export class SelectGenderPhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - - start(): void { - super.start(); - - this.scene.ui.showText(i18next.t("menu:boyOrGirl"), null, () => { - this.scene.ui.setMode(Mode.OPTION_SELECT, { - options: [ - { - label: i18next.t("settings:boy"), - handler: () => { - this.scene.gameData.gender = PlayerGender.MALE; - this.scene.gameData.saveSetting(SettingKeys.Player_Gender, 0); - this.scene.gameData.saveSystem().then(() => this.end()); - return true; - } - }, - { - label: i18next.t("settings:girl"), - handler: () => { - this.scene.gameData.gender = PlayerGender.FEMALE; - this.scene.gameData.saveSetting(SettingKeys.Player_Gender, 1); - this.scene.gameData.saveSystem().then(() => this.end()); - return true; - } - } - ] - }); - }); - } - - end(): void { - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - } -} - -export class SelectChallengePhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - this.scene.playBgm("menu"); - - this.scene.ui.setMode(Mode.CHALLENGE_SELECT); - } -} - -export class SelectStarterPhase extends Phase { - - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - this.scene.playBgm("menu"); - - this.scene.ui.setMode(Mode.STARTER_SELECT, (starters: Starter[]) => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: integer) => { - if (slotId === -1) { - this.scene.clearPhaseQueue(); - this.scene.pushPhase(new TitlePhase(this.scene)); - return this.end(); - } - this.scene.sessionSlotId = slotId; - this.initBattle(starters); - }); - }); - } - - /** - * Initialize starters before starting the first battle - * @param starters {@linkcode Pokemon} with which to start the first battle - */ - initBattle(starters: Starter[]) { - const party = this.scene.getParty(); - const loadPokemonAssets: Promise[] = []; - starters.forEach((starter: Starter, i: integer) => { - if (!i && Overrides.STARTER_SPECIES_OVERRIDE) { - starter.species = getPokemonSpecies(Overrides.STARTER_SPECIES_OVERRIDE as Species); - } - const starterProps = this.scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); - let starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); - if ( - starter.species.speciesId in Overrides.STARTER_FORM_OVERRIDES && - starter.species.forms[Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]] - ) { - starterFormIndex = Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]; - } - - let starterGender = starter.species.malePercent !== null - ? !starterProps.female ? Gender.MALE : Gender.FEMALE - : Gender.GENDERLESS; - if (Overrides.GENDER_OVERRIDE !== null) { - starterGender = Overrides.GENDER_OVERRIDE; - } - const starterIvs = this.scene.gameData.dexData[starter.species.speciesId].ivs.slice(0); - const starterPokemon = this.scene.addPlayerPokemon(starter.species, this.scene.gameMode.getStartingLevel(), starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, starterIvs, starter.nature); - starterPokemon.tryPopulateMoveset(starter.moveset); - if (starter.passive) { - starterPokemon.passive = true; - } - starterPokemon.luck = this.scene.gameData.getDexAttrLuck(this.scene.gameData.dexData[starter.species.speciesId].caughtAttr); - if (starter.pokerus) { - starterPokemon.pokerus = true; - } - if (this.scene.gameMode.isSplicedOnly) { - starterPokemon.generateFusionSpecies(true); - } - starterPokemon.setVisible(false); - party.push(starterPokemon); - loadPokemonAssets.push(starterPokemon.loadAssets()); - }); - overrideModifiers(this.scene); - overrideHeldItems(this.scene, party[0]); - Promise.all(loadPokemonAssets).then(() => { - SoundFade.fadeOut(this.scene, this.scene.sound.get("menu"), 500, true); - this.scene.time.delayedCall(500, () => this.scene.playBgm()); - if (this.scene.gameMode.isClassic) { - this.scene.gameData.gameStats.classicSessionsPlayed++; - } else { - this.scene.gameData.gameStats.endlessSessionsPlayed++; - } - this.scene.newBattle(); - this.scene.arena.init(); - this.scene.sessionPlayTime = 0; - this.scene.lastSavePlayTime = 0; - this.end(); - }); - } -} - -export class BattlePhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - - showEnemyTrainer(trainerSlot: TrainerSlot = TrainerSlot.NONE): void { - const sprites = this.scene.currentBattle.trainer.getSprites(); - const tintSprites = this.scene.currentBattle.trainer.getTintSprites(); - for (let i = 0; i < sprites.length; i++) { - const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2; - [sprites[i], tintSprites[i]].map(sprite => { - if (visible) { - sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16; - } - sprite.setVisible(visible); - sprite.clearTint(); - }); - sprites[i].setVisible(visible); - tintSprites[i].setVisible(visible); - sprites[i].clearTint(); - tintSprites[i].clearTint(); - } - this.scene.tweens.add({ - targets: this.scene.currentBattle.trainer, - x: "-=16", - y: "+=16", - alpha: 1, - ease: "Sine.easeInOut", - duration: 750 - }); - } - - hideEnemyTrainer(): void { - this.scene.tweens.add({ - targets: this.scene.currentBattle.trainer, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 750 - }); - } -} - -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)); - } -} - -export abstract class PokemonPhase extends FieldPhase { - protected battlerIndex: BattlerIndex | integer; - public player: boolean; - public fieldIndex: integer; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex | integer) { - super(scene); - - if (battlerIndex === undefined) { - battlerIndex = scene.getField().find(p => p?.isActive()).getBattlerIndex(); - } - - this.battlerIndex = battlerIndex; - this.player = battlerIndex < 2; - this.fieldIndex = battlerIndex % 2; - } - - getPokemon() { - if (this.battlerIndex > BattlerIndex.ENEMY_2) { - return this.scene.getPokemonById(this.battlerIndex); - } - return this.scene.getField()[this.battlerIndex]; - } -} - -export abstract class PartyMemberPokemonPhase extends FieldPhase { - protected partyMemberIndex: integer; - protected fieldIndex: integer; - protected player: boolean; - - constructor(scene: BattleScene, partyMemberIndex: integer, player: boolean) { - super(scene); - - this.partyMemberIndex = partyMemberIndex; - this.fieldIndex = partyMemberIndex < this.scene.currentBattle.getBattlerCount() - ? partyMemberIndex - : -1; - this.player = player; - } - - getParty(): Pokemon[] { - return this.player ? this.scene.getParty() : this.scene.getEnemyParty(); - } - - getPokemon(): Pokemon { - return this.getParty()[this.partyMemberIndex]; - } -} - -export abstract class PlayerPartyMemberPokemonPhase extends PartyMemberPokemonPhase { - constructor(scene: BattleScene, partyMemberIndex: integer) { - super(scene, partyMemberIndex, true); - } - - getPlayerPokemon(): PlayerPokemon { - return super.getPokemon() as PlayerPokemon; - } -} - -export abstract class EnemyPartyMemberPokemonPhase extends PartyMemberPokemonPhase { - constructor(scene: BattleScene, partyMemberIndex: integer) { - super(scene, partyMemberIndex, false); - } - - getEnemyPokemon(): EnemyPokemon { - return super.getPokemon() as EnemyPokemon; - } -} - -export class EncounterPhase extends BattlePhase { - private loaded: boolean; - - constructor(scene: BattleScene, loaded?: boolean) { - super(scene); - - this.loaded = !!loaded; - } - - start() { - super.start(); - - this.scene.updateGameInfo(); - - this.scene.initSession(); - - this.scene.eventTarget.dispatchEvent(new EncounterPhaseEvent()); - - // Failsafe if players somehow skip floor 200 in classic mode - if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) { - this.scene.unshiftPhase(new GameOverPhase(this.scene)); - } - - const loadEnemyAssets = []; - - const battle = this.scene.currentBattle; - - let totalBst = 0; - - battle.enemyLevels.forEach((level, e) => { - if (!this.loaded) { - if (battle.battleType === BattleType.TRAINER) { - battle.enemyParty[e] = battle.trainer.genPartyMember(e); - } else { - const enemySpecies = this.scene.randomSpecies(battle.waveIndex, level, true); - battle.enemyParty[e] = this.scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, !!this.scene.getEncounterBossSegments(battle.waveIndex, level, enemySpecies)); - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - battle.enemyParty[e].ivs = new Array(6).fill(31); - } - this.scene.getParty().slice(0, !battle.double ? 1 : 2).reverse().forEach(playerPokemon => { - applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, battle.enemyParty[e]); - }); - } - } - const enemyPokemon = this.scene.getEnemyParty()[e]; - if (e < (battle.double ? 2 : 1)) { - enemyPokemon.setX(-66 + enemyPokemon.getFieldPositionOffset()[0]); - enemyPokemon.resetSummonData(); - } - - if (!this.loaded) { - this.scene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER); - } - - if (enemyPokemon.species.speciesId === Species.ETERNATUS) { - if (this.scene.gameMode.isClassic && (battle.battleSpec === BattleSpec.FINAL_BOSS || this.scene.gameMode.isWaveFinal(battle.waveIndex))) { - if (battle.battleSpec !== BattleSpec.FINAL_BOSS) { - enemyPokemon.formIndex = 1; - enemyPokemon.updateScale(); - } - enemyPokemon.setBoss(); - } else if (!(battle.waveIndex % 1000)) { - enemyPokemon.formIndex = 1; - enemyPokemon.updateScale(); - } - } - - totalBst += enemyPokemon.getSpeciesForm().baseTotal; - - loadEnemyAssets.push(enemyPokemon.loadAssets()); - - console.log(enemyPokemon.name, enemyPokemon.species.speciesId, enemyPokemon.stats); - }); - - if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { - this.scene.validateAchv(achvs.SHINY_PARTY); - } - - if (battle.battleType === BattleType.TRAINER) { - loadEnemyAssets.push(battle.trainer.loadAssets().then(() => battle.trainer.initSprite())); - } else { - // This block only applies for double battles to init the boss segments (idk why it's split up like this) - if (battle.enemyParty.filter(p => p.isBoss()).length > 1) { - for (const enemyPokemon of battle.enemyParty) { - // If the enemy pokemon is a boss and wasn't populated from data source, then set it up - if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) { - enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst))); - enemyPokemon.initBattleInfo(); - } - } - } - } - - Promise.all(loadEnemyAssets).then(() => { - battle.enemyParty.forEach((enemyPokemon, e) => { - if (e < (battle.double ? 2 : 1)) { - if (battle.battleType === BattleType.WILD) { - this.scene.field.add(enemyPokemon); - battle.seenEnemyPartyMemberIds.add(enemyPokemon.id); - const playerPokemon = this.scene.getPlayerPokemon(); - if (playerPokemon?.visible) { - this.scene.field.moveBelow(enemyPokemon as Pokemon, playerPokemon); - } - enemyPokemon.tint(0, 0.5); - } else if (battle.battleType === BattleType.TRAINER) { - enemyPokemon.setVisible(false); - this.scene.currentBattle.trainer.tint(0, 0.5); - } - if (battle.double) { - enemyPokemon.setFieldPosition(e ? FieldPosition.RIGHT : FieldPosition.LEFT); - } - } - }); - - if (!this.loaded) { - regenerateModifierPoolThresholds(this.scene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); - this.scene.generateEnemyModifiers(); - } - - this.scene.ui.setMode(Mode.MESSAGE).then(() => { - if (!this.loaded) { - this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || this.scene.lastSavePlayTime >= 300).then(success => { - this.scene.disableMenu = false; - if (!success) { - return this.scene.reset(true); - } - this.doEncounter(); - }); - } else { - this.doEncounter(); - } - }); - }); - } - - doEncounter() { - this.scene.playBgm(undefined, true); - this.scene.updateModifiers(false); - this.scene.setFieldScale(1); - - /*if (startingWave > 10) { - for (let m = 0; m < Math.min(Math.floor(startingWave / 10), 99); m++) - this.scene.addModifier(getPlayerModifierTypeOptionsForWave((m + 1) * 10, 1, this.scene.getParty())[0].type.newModifier(), true); - this.scene.updateModifiers(true); - }*/ - - for (const pokemon of this.scene.getParty()) { - if (pokemon) { - pokemon.resetBattleData(); - } - } - - if (!this.loaded) { - this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); - } - - const enemyField = this.scene.getEnemyField(); - this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer].flat(), - x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, - duration: 2000, - onComplete: () => { - if (!this.tryOverrideForBattleSpec()) { - this.doEncounterCommon(); - } - } - }); - } - - getEncounterMessage(): string { - const enemyField = this.scene.getEnemyField(); - - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - return i18next.t("battle:bossAppeared", { bossName: enemyField[0].name }); - } - - if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - if (this.scene.currentBattle.double) { - return i18next.t("battle:trainerAppearedDouble", { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }); - - } else { - return i18next.t("battle:trainerAppeared", { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }); - } - } - - return enemyField.length === 1 - ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].name }) - : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name }); - } - - doEncounterCommon(showEncounterMessage: boolean = true) { - const enemyField = this.scene.getEnemyField(); - - if (this.scene.currentBattle.battleType === BattleType.WILD) { - enemyField.forEach(enemyPokemon => { - enemyPokemon.untint(100, "Sine.easeOut"); - enemyPokemon.cry(); - enemyPokemon.showInfo(); - if (enemyPokemon.isShiny()) { - this.scene.validateAchv(achvs.SEE_SHINY); - } - }); - this.scene.updateFieldScale(); - if (showEncounterMessage) { - this.scene.ui.showText(this.getEncounterMessage(), null, () => this.end(), 1500); - } else { - this.end(); - } - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - const trainer = this.scene.currentBattle.trainer; - trainer.untint(100, "Sine.easeOut"); - trainer.playAnim(); - - const doSummon = () => { - this.scene.currentBattle.started = true; - this.scene.playBgm(undefined); - this.scene.pbTray.showPbTray(this.scene.getParty()); - this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); - const doTrainerSummon = () => { - this.hideEnemyTrainer(); - const availablePartyMembers = this.scene.getEnemyParty().filter(p => !p.isFainted()).length; - this.scene.unshiftPhase(new SummonPhase(this.scene, 0, false)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) { - this.scene.unshiftPhase(new SummonPhase(this.scene, 1, false)); - } - this.end(); - }; - if (showEncounterMessage) { - this.scene.ui.showText(this.getEncounterMessage(), null, doTrainerSummon, 1500, true); - } else { - doTrainerSummon(); - } - }; - - const encounterMessages = this.scene.currentBattle.trainer.getEncounterMessages(); - - if (!encounterMessages?.length) { - doSummon(); - } else { - let message: string; - this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.waveIndex); - - const showDialogueAndSummon = () => { - this.scene.ui.showDialogue(message, trainer.getName(TrainerSlot.NONE, true), null, () => { - this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => doSummon())); - }); - }; - if (this.scene.currentBattle.trainer.config.hasCharSprite && !this.scene.ui.shouldSkipDialogue(message)) { - this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(trainer.getKey(), getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); - } else { - showDialogueAndSummon(); - } - } - } - } - - end() { - const enemyField = this.scene.getEnemyField(); - - enemyField.forEach((enemyPokemon, e) => { - if (enemyPokemon.isShiny()) { - this.scene.unshiftPhase(new ShinySparklePhase(this.scene, BattlerIndex.ENEMY + e)); - } - }); - - if (this.scene.currentBattle.battleType !== BattleType.TRAINER) { - enemyField.map(p => this.scene.pushConditionalPhase(new PostSummonPhase(this.scene, p.getBattlerIndex()), () => { - // if there is not a player party, we can't continue - if (!this.scene.getParty()?.length) { - return false; - } - // how many player pokemon are on the field ? - const pokemonsOnFieldCount = this.scene.getParty().filter(p => p.isOnField()).length; - // if it's a 2vs1, there will never be a 2nd pokemon on our field even - const requiredPokemonsOnField = Math.min(this.scene.getParty().filter((p) => !p.isFainted()).length, 2); - // if it's a double, there should be 2, otherwise 1 - if (this.scene.currentBattle.double) { - return pokemonsOnFieldCount === requiredPokemonsOnField; - } - return pokemonsOnFieldCount === 1; - })); - const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); - if (ivScannerModifier) { - enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); - } - } - - if (!this.loaded) { - const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()); - - if (!availablePartyMembers[0].isOnField()) { - this.scene.pushPhase(new SummonPhase(this.scene, 0)); - } - - if (this.scene.currentBattle.double) { - if (availablePartyMembers.length > 1) { - this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true)); - if (!availablePartyMembers[1].isOnField()) { - this.scene.pushPhase(new SummonPhase(this.scene, 1)); - } - } - } else { - if (availablePartyMembers.length > 1 && availablePartyMembers[1].isOnField()) { - this.scene.pushPhase(new ReturnPhase(this.scene, 1)); - } - this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, false)); - } - - if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { - const minPartySize = this.scene.currentBattle.double ? 2 : 1; - if (availablePartyMembers.length > minPartySize) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); - } - } - } - } - handleTutorial(this.scene, Tutorial.Access_Menu).then(() => super.end()); - } - - tryOverrideForBattleSpec(): boolean { - switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - const enemy = this.scene.getEnemyPokemon(); - this.scene.ui.showText(this.getEncounterMessage(), null, () => { - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].encounter, enemy.species.name, null, () => { - this.doEncounterCommon(false); - }); - }, 1500, true); - return true; - } - - return false; - } -} - -export class NextEncounterPhase extends EncounterPhase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - } - - doEncounter(): void { - this.scene.playBgm(undefined, true); - - for (const pokemon of this.scene.getParty()) { - if (pokemon) { - pokemon.resetBattleData(); - } - } - - this.scene.arenaNextEnemy.setBiome(this.scene.arena.biomeType); - this.scene.arenaNextEnemy.setVisible(true); - - const enemyField = this.scene.getEnemyField(); - this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, this.scene.arenaNextEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.lastEnemyTrainer].flat(), - x: "+=300", - duration: 2000, - onComplete: () => { - this.scene.arenaEnemy.setBiome(this.scene.arena.biomeType); - this.scene.arenaEnemy.setX(this.scene.arenaNextEnemy.x); - this.scene.arenaEnemy.setAlpha(1); - this.scene.arenaNextEnemy.setX(this.scene.arenaNextEnemy.x - 300); - this.scene.arenaNextEnemy.setVisible(false); - if (this.scene.lastEnemyTrainer) { - this.scene.lastEnemyTrainer.destroy(); - } - - if (!this.tryOverrideForBattleSpec()) { - this.doEncounterCommon(); - } - } - }); - } -} - -export class NewBiomeEncounterPhase extends NextEncounterPhase { - constructor(scene: BattleScene) { - super(scene); - } - - doEncounter(): void { - this.scene.playBgm(undefined, true); - - for (const pokemon of this.scene.getParty()) { - if (pokemon) { - pokemon.resetBattleData(); - } - } - - this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); - - for (const pokemon of this.scene.getParty().filter(p => p.isOnField())) { - applyAbAttrs(PostBiomeChangeAbAttr, pokemon, null); - } - - const enemyField = this.scene.getEnemyField(); - this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, enemyField].flat(), - x: "+=300", - duration: 2000, - onComplete: () => { - if (!this.tryOverrideForBattleSpec()) { - this.doEncounterCommon(); - } - } - }); - } -} - -export class PostSummonPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); - } - - start() { - super.start(); - - const pokemon = this.getPokemon(); - - if (pokemon.status?.effect === StatusEffect.TOXIC) { - pokemon.status.turnCount = 0; - } - this.scene.arena.applyTags(ArenaTrapTag, pokemon); - applyPostSummonAbAttrs(PostSummonAbAttr, pokemon).then(() => this.end()); - } -} - -export class SelectBiomePhase extends BattlePhase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - const currentBiome = this.scene.arena.biomeType; - - const setNextBiome = (nextBiome: Biome) => { - if (this.scene.currentBattle.waveIndex % 10 === 1) { - this.scene.applyModifiers(MoneyInterestModifier, true, this.scene); - this.scene.unshiftPhase(new PartyHealPhase(this.scene, false)); - } - this.scene.unshiftPhase(new SwitchBiomePhase(this.scene, nextBiome)); - this.end(); - }; - - if ((this.scene.gameMode.isClassic && this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex + 9)) - || (this.scene.gameMode.isDaily && this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) - || (this.scene.gameMode.hasShortBiomes && !(this.scene.currentBattle.waveIndex % 50))) { - setNextBiome(Biome.END); - } else if (this.scene.gameMode.hasRandomBiomes) { - setNextBiome(this.generateNextBiome()); - } else if (Array.isArray(biomeLinks[currentBiome])) { - let biomes: Biome[]; - this.scene.executeWithSeedOffset(() => { - biomes = (biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) - .filter(b => !Array.isArray(b) || !Utils.randSeedInt(b[1])) - .map(b => !Array.isArray(b) ? b : b[0]); - }, this.scene.currentBattle.waveIndex); - if (biomes.length > 1 && this.scene.findModifier(m => m instanceof MapModifier)) { - let biomeChoices: Biome[]; - this.scene.executeWithSeedOffset(() => { - biomeChoices = (!Array.isArray(biomeLinks[currentBiome]) - ? [biomeLinks[currentBiome] as Biome] - : biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) - .filter((b, i) => !Array.isArray(b) || !Utils.randSeedInt(b[1])) - .map(b => Array.isArray(b) ? b[0] : b); - }, this.scene.currentBattle.waveIndex); - const biomeSelectItems = biomeChoices.map(b => { - const ret: OptionSelectItem = { - label: getBiomeName(b), - handler: () => { - this.scene.ui.setMode(Mode.MESSAGE); - setNextBiome(b); - return true; - } - }; - return ret; - }); - this.scene.ui.setMode(Mode.OPTION_SELECT, { - options: biomeSelectItems, - delay: 1000 - }); - } else { - setNextBiome(biomes[Utils.randSeedInt(biomes.length)]); - } - } else if (biomeLinks.hasOwnProperty(currentBiome)) { - setNextBiome(biomeLinks[currentBiome] as Biome); - } else { - setNextBiome(this.generateNextBiome()); - } - } - - generateNextBiome(): Biome { - if (!(this.scene.currentBattle.waveIndex % 50)) { - return Biome.END; - } - return this.scene.generateRandomBiome(this.scene.currentBattle.waveIndex); - } -} - -export class SwitchBiomePhase extends BattlePhase { - private nextBiome: Biome; - - constructor(scene: BattleScene, nextBiome: Biome) { - super(scene); - - this.nextBiome = nextBiome; - } - - start() { - super.start(); - - if (this.nextBiome === undefined) { - return this.end(); - } - - this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, this.scene.lastEnemyTrainer], - x: "+=300", - duration: 2000, - onComplete: () => { - this.scene.arenaEnemy.setX(this.scene.arenaEnemy.x - 600); - - this.scene.newArena(this.nextBiome); - - const biomeKey = getBiomeKey(this.nextBiome); - const bgTexture = `${biomeKey}_bg`; - this.scene.arenaBgTransition.setTexture(bgTexture); - this.scene.arenaBgTransition.setAlpha(0); - this.scene.arenaBgTransition.setVisible(true); - this.scene.arenaPlayerTransition.setBiome(this.nextBiome); - this.scene.arenaPlayerTransition.setAlpha(0); - this.scene.arenaPlayerTransition.setVisible(true); - - this.scene.tweens.add({ - targets: [this.scene.arenaPlayer, this.scene.arenaBgTransition, this.scene.arenaPlayerTransition], - duration: 1000, - delay: 1000, - ease: "Sine.easeInOut", - alpha: (target: any) => target === this.scene.arenaPlayer ? 0 : 1, - onComplete: () => { - this.scene.arenaBg.setTexture(bgTexture); - this.scene.arenaPlayer.setBiome(this.nextBiome); - this.scene.arenaPlayer.setAlpha(1); - this.scene.arenaEnemy.setBiome(this.nextBiome); - this.scene.arenaEnemy.setAlpha(1); - this.scene.arenaNextEnemy.setBiome(this.nextBiome); - this.scene.arenaBgTransition.setVisible(false); - this.scene.arenaPlayerTransition.setVisible(false); - if (this.scene.lastEnemyTrainer) { - this.scene.lastEnemyTrainer.destroy(); - } - - this.end(); - } - }); - } - }); - } -} - -export class SummonPhase extends PartyMemberPokemonPhase { - private loaded: boolean; - - constructor(scene: BattleScene, fieldIndex: integer, player: boolean = true, loaded: boolean = false) { - super(scene, fieldIndex, player); - - this.loaded = loaded; - } - - start() { - super.start(); - - this.preSummon(); - } - - /** - * Sends out a Pokemon before the battle begins and shows the appropriate messages - */ - preSummon(): void { - const partyMember = this.getPokemon(); - // If the Pokemon about to be sent out is fainted or illegal under a challenge, switch to the first non-fainted legal Pokemon - if (!partyMember.isAllowedInBattle()) { - console.warn("The Pokemon about to be sent out is fainted or illegal under a challenge. Attempting to resolve..."); - - // First check if they're somehow still in play, if so remove them. - if (partyMember.isOnField()) { - partyMember.hideInfo(); - partyMember.setVisible(false); - this.scene.field.remove(partyMember); - this.scene.triggerPokemonFormChange(partyMember, SpeciesFormChangeActiveTrigger, true); - } - - const party = this.getParty(); - - // Find the first non-fainted Pokemon index above the current one - const legalIndex = party.findIndex((p, i) => i > this.partyMemberIndex && p.isAllowedInBattle()); - if (legalIndex === -1) { - console.error("Party Details:\n", party); - console.error("All available Pokemon were fainted or illegal!"); - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new GameOverPhase(this.scene)); - this.end(); - return; - } - - // Swaps the fainted Pokemon and the first non-fainted legal Pokemon in the party - [party[this.partyMemberIndex], party[legalIndex]] = [party[legalIndex], party[this.partyMemberIndex]]; - console.warn("Swapped %s %O with %s %O", partyMember?.name, partyMember, party[0]?.name, party[0]); - } - - if (this.player) { - this.scene.ui.showText(i18next.t("battle:playerGo", { pokemonName: this.getPokemon().name })); - if (this.player) { - this.scene.pbTray.hide(); - } - this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - this.scene.time.delayedCall(562, () => { - this.scene.trainer.setFrame("2"); - this.scene.time.delayedCall(64, () => { - this.scene.trainer.setFrame("3"); - }); - }); - this.scene.tweens.add({ - targets: this.scene.trainer, - x: -36, - duration: 1000, - onComplete: () => this.scene.trainer.setVisible(false) - }); - this.scene.time.delayedCall(750, () => this.summon()); - } else { - const trainerName = this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); - const pokemonName = this.getPokemon().name; - const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); - - this.scene.pbTrayEnemy.hide(); - this.scene.ui.showText(message, null, () => this.summon()); - } - } - - summon(): void { - const pokemon = this.getPokemon(); - - const pokeball = this.scene.addFieldSprite(this.player ? 36 : 248, this.player ? 80 : 44, "pb", getPokeballAtlasKey(pokemon.pokeball)); - pokeball.setVisible(false); - pokeball.setOrigin(0.5, 0.625); - this.scene.field.add(pokeball); - - if (this.fieldIndex === 1) { - pokemon.setFieldPosition(FieldPosition.RIGHT, 0); - } else { - const availablePartyMembers = this.getParty().filter(p => p.isAllowedInBattle()).length; - pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); - } - - const fpOffset = pokemon.getFieldPositionOffset(); - - pokeball.setVisible(true); - - this.scene.tweens.add({ - targets: pokeball, - duration: 650, - x: (this.player ? 100 : 236) + fpOffset[0] - }); - - this.scene.tweens.add({ - targets: pokeball, - duration: 150, - ease: "Cubic.easeOut", - y: (this.player ? 70 : 34) + fpOffset[1], - onComplete: () => { - this.scene.tweens.add({ - targets: pokeball, - duration: 500, - ease: "Cubic.easeIn", - angle: 1440, - y: (this.player ? 132 : 86) + fpOffset[1], - onComplete: () => { - this.scene.playSound("pb_rel"); - pokeball.destroy(); - this.scene.add.existing(pokemon); - this.scene.field.add(pokemon); - if (!this.player) { - const playerPokemon = this.scene.getPlayerPokemon() as Pokemon; - if (playerPokemon?.visible) { - this.scene.field.moveBelow(pokemon, playerPokemon); - } - this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); - } - addPokeballOpenParticles(this.scene, pokemon.x, pokemon.y - 16, pokemon.pokeball); - this.scene.updateModifiers(this.player); - this.scene.updateFieldScale(); - pokemon.showInfo(); - pokemon.playAnim(); - pokemon.setVisible(true); - pokemon.getSprite().setVisible(true); - pokemon.setScale(0.5); - pokemon.tint(getPokeballTintColor(pokemon.pokeball)); - pokemon.untint(250, "Sine.easeIn"); - this.scene.updateFieldScale(); - this.scene.tweens.add({ - targets: pokemon, - duration: 250, - ease: "Sine.easeIn", - scale: pokemon.getSpriteScale(), - onComplete: () => { - pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); - pokemon.getSprite().clearTint(); - pokemon.resetSummonData(); - this.scene.time.delayedCall(1000, () => this.end()); - } - }); - } - }); - } - }); - } - - onEnd(): void { - const pokemon = this.getPokemon(); - - if (pokemon.isShiny()) { - this.scene.unshiftPhase(new ShinySparklePhase(this.scene, pokemon.getBattlerIndex())); - } - - pokemon.resetTurnData(); - - if (!this.loaded || this.scene.currentBattle.battleType === BattleType.TRAINER || (this.scene.currentBattle.waveIndex % 10) === 1) { - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); - this.queuePostSummon(); - } - } - - queuePostSummon(): void { - this.scene.pushPhase(new PostSummonPhase(this.scene, this.getPokemon().getBattlerIndex())); - } - - end() { - this.onEnd(); - - super.end(); - } -} - -export class SwitchSummonPhase extends SummonPhase { - private slotIndex: integer; - private doReturn: boolean; - private batonPass: boolean; - - private lastPokemon: Pokemon; - - constructor(scene: BattleScene, fieldIndex: integer, slotIndex: integer, doReturn: boolean, batonPass: boolean, player?: boolean) { - super(scene, fieldIndex, player !== undefined ? player : true); - - this.slotIndex = slotIndex; - this.doReturn = doReturn; - this.batonPass = batonPass; - } - - start(): void { - super.start(); - } - - preSummon(): void { - if (!this.player) { - if (this.slotIndex === -1) { - this.slotIndex = this.scene.currentBattle.trainer.getNextSummonIndex(!this.fieldIndex ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); - } - if (this.slotIndex > -1) { - this.showEnemyTrainer(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); - this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); - } - } - - if (!this.doReturn || (this.slotIndex !== -1 && !(this.player ? this.scene.getParty() : this.scene.getEnemyParty())[this.slotIndex])) { - if (this.player) { - return this.switchAndSummon(); - } else { - this.scene.time.delayedCall(750, () => this.switchAndSummon()); - return; - } - } - - const pokemon = this.getPokemon(); - - if (!this.batonPass) { - (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); - } - - this.scene.ui.showText(this.player ? - i18next.t("battle:playerComeBack", { pokemonName: pokemon.name }) : - i18next.t("battle:trainerComeBack", { - trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), - pokemonName: pokemon.name - }) - ); - this.scene.playSound("pb_rel"); - pokemon.hideInfo(); - pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn"); - this.scene.tweens.add({ - targets: pokemon, - duration: 250, - ease: "Sine.easeIn", - scale: 0.5, - onComplete: () => { - pokemon.setVisible(false); - this.scene.field.remove(pokemon); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); - this.scene.time.delayedCall(750, () => this.switchAndSummon()); - } - }); - } - - switchAndSummon() { - const party = this.player ? this.getParty() : this.scene.getEnemyParty(); - const switchedPokemon = party[this.slotIndex]; - this.lastPokemon = this.getPokemon(); - applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, this.lastPokemon); - if (this.batonPass && switchedPokemon) { - (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedPokemon.id)); - if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) { - const batonPassModifier = this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier - && (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id) as SwitchEffectTransferModifier; - if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) { - this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedPokemon, false); - } - } - } - if (switchedPokemon) { - party[this.slotIndex] = this.lastPokemon; - party[this.fieldIndex] = switchedPokemon; - const showTextAndSummon = () => { - this.scene.ui.showText(this.player ? - i18next.t("battle:playerGo", { pokemonName: switchedPokemon.name }) : - i18next.t("battle:trainerGo", { - trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), - pokemonName: this.getPokemon().name - }) - ); - this.summon(); - }; - if (this.player) { - showTextAndSummon(); - } else { - this.scene.time.delayedCall(1500, () => { - this.hideEnemyTrainer(); - this.scene.pbTrayEnemy.hide(); - showTextAndSummon(); - }); - } - } else { - this.end(); - } - } - - onEnd(): void { - super.onEnd(); - - const pokemon = this.getPokemon(); - - const moveId = this.lastPokemon?.scene.currentBattle.lastMove; - const lastUsedMove = moveId ? allMoves[moveId] : undefined; - - const currentCommand = pokemon.scene.currentBattle.turnCommands[this.fieldIndex]?.command; - const lastPokemonIsForceSwitchedAndNotFainted = lastUsedMove?.hasAttr(ForceSwitchOutAttr) && !this.lastPokemon.isFainted(); - - // Compensate for turn spent summoning - // Or compensate for force switch move if switched out pokemon is not fainted - if (currentCommand === Command.POKEMON || lastPokemonIsForceSwitchedAndNotFainted) { - pokemon.battleSummonData.turnCount--; - } - - if (this.batonPass && pokemon) { - pokemon.transferSummon(this.lastPokemon); - } - - this.lastPokemon?.resetSummonData(); - - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); - } - - queuePostSummon(): void { - this.scene.unshiftPhase(new PostSummonPhase(this.scene, this.getPokemon().getBattlerIndex())); - } -} - -export class ReturnPhase extends SwitchSummonPhase { - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene, fieldIndex, -1, true, false); - } - - switchAndSummon(): void { - this.end(); - } - - summon(): void { } - - onEnd(): void { - const pokemon = this.getPokemon(); - - pokemon.resetTurnData(); - pokemon.resetSummonData(); - - this.scene.updateFieldScale(); - - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger); - } -} - -export class ShowTrainerPhase extends BattlePhase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - this.scene.trainer.setVisible(true); - - this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); - - this.scene.tweens.add({ - targets: this.scene.trainer, - x: 106, - duration: 1000, - onComplete: () => this.end() - }); - } -} - -export class ToggleDoublePositionPhase extends BattlePhase { - private double: boolean; - - constructor(scene: BattleScene, double: boolean) { - super(scene); - - this.double = double; - } - - start() { - super.start(); - - const playerPokemon = this.scene.getPlayerField().find(p => p.isActive(true)); - if (playerPokemon) { - playerPokemon.setFieldPosition(this.double && this.scene.getParty().filter(p => p.isAllowedInBattle()).length > 1 ? FieldPosition.LEFT : FieldPosition.CENTER, 500).then(() => { - if (playerPokemon.getFieldIndex() === 1) { - const party = this.scene.getParty(); - party[1] = party[0]; - party[0] = playerPokemon; - } - this.end(); - }); - } else { - this.end(); - } - } -} - -export class CheckSwitchPhase extends BattlePhase { - protected fieldIndex: integer; - protected useName: boolean; - - constructor(scene: BattleScene, fieldIndex: integer, useName: boolean) { - super(scene); - - this.fieldIndex = fieldIndex; - this.useName = useName; - } - - start() { - super.start(); - - const pokemon = this.scene.getPlayerField()[this.fieldIndex]; - - if (this.scene.battleStyle === BattleStyle.SET) { - super.end(); - return; - } - - if (this.scene.field.getAll().indexOf(pokemon) === -1) { - this.scene.unshiftPhase(new SummonMissingPhase(this.scene, this.fieldIndex)); - super.end(); - return; - } - - if (!this.scene.getParty().slice(1).filter(p => p.isActive()).length) { - super.end(); - return; - } - - if (pokemon.getTag(BattlerTagType.FRENZY)) { - super.end(); - return; - } - - this.scene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? pokemon.name : i18next.t("battle:pokemon") }), null, () => { - this.scene.ui.setMode(Mode.CONFIRM, () => { - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); - this.scene.unshiftPhase(new SwitchPhase(this.scene, this.fieldIndex, false, true)); - this.end(); - }, () => { - this.scene.ui.setMode(Mode.MESSAGE); - this.end(); - }); - }); - } -} - -export class SummonMissingPhase extends SummonPhase { - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene, fieldIndex); - } - - preSummon(): void { - this.scene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: this.getPokemon().name })); - this.scene.time.delayedCall(250, () => this.summon()); - } -} - -export class LevelCapPhase extends FieldPhase { - constructor(scene: BattleScene) { - super(scene); - } - - start(): void { - super.start(); - - this.scene.ui.setMode(Mode.MESSAGE).then(() => { - this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:levelCapUp", { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true); - this.executeForAll(pokemon => pokemon.updateInfo(true)); - }); - } -} - -export class TurnInitPhase extends FieldPhase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - this.scene.getPlayerField().forEach(p => { - // If this pokemon is in play and evolved into something illegal under the current challenge, force a switch - if (p.isOnField() && !p.isAllowedInBattle()) { - this.scene.queueMessage(i18next.t("challenges:illegalEvolution", { "pokemon": p.name }), null, true); - - const allowedPokemon = this.scene.getParty().filter(p => p.isAllowedInBattle()); - - if (!allowedPokemon.length) { - // If there are no longer any legal pokemon in the party, game over. - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new GameOverPhase(this.scene)); - } else if (allowedPokemon.length >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !allowedPokemon[0].isActive(true))) { - // If there is at least one pokemon in the back that is legal to switch in, force a switch. - p.switchOut(false, true); - } else { - // If there are no pokemon in the back but we're not game overing, just hide the pokemon. - // This should only happen in double battles. - p.hideInfo(); - p.setVisible(false); - this.scene.field.remove(p); - this.scene.triggerPokemonFormChange(p, SpeciesFormChangeActiveTrigger, true); - } - if (allowedPokemon.length === 1 && this.scene.currentBattle.double) { - this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); - } - } - }); - - //this.scene.pushPhase(new MoveAnimTestPhase(this.scene)); - this.scene.eventTarget.dispatchEvent(new TurnInitEvent()); - - this.scene.getField().forEach((pokemon, i) => { - if (pokemon?.isActive()) { - if (pokemon.isPlayer()) { - this.scene.currentBattle.addParticipant(pokemon as PlayerPokemon); - } - - pokemon.resetTurnData(); - - this.scene.pushPhase(pokemon.isPlayer() ? new CommandPhase(this.scene, i) : new EnemyCommandPhase(this.scene, i - BattlerIndex.ENEMY)); - } - }); - - this.scene.pushPhase(new TurnStartPhase(this.scene)); - - this.end(); - } -} - -export class CommandPhase extends FieldPhase { - protected fieldIndex: integer; - - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene); - - this.fieldIndex = fieldIndex; - } - - start() { - super.start(); - - if (this.fieldIndex) { - // If we somehow are attempting to check the right pokemon but there's only one pokemon out - // Switch back to the center pokemon. This can happen rarely in double battles with mid turn switching - if (this.scene.getPlayerField().filter(p => p.isActive()).length === 1) { - this.fieldIndex = FieldPosition.CENTER; - } else { - const allyCommand = this.scene.currentBattle.turnCommands[this.fieldIndex - 1]; - if (allyCommand.command === Command.BALL || allyCommand.command === Command.RUN) { - this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: allyCommand.command, skip: true }; - } - } - } - - if (this.scene.currentBattle.turnCommands[this.fieldIndex]?.skip) { - return this.end(); - } - - const playerPokemon = this.scene.getPlayerField()[this.fieldIndex]; - - const moveQueue = playerPokemon.getMoveQueue(); - - while (moveQueue.length && moveQueue[0] - && moveQueue[0].move && (!playerPokemon.getMoveset().find(m => m.moveId === moveQueue[0].move) - || !playerPokemon.getMoveset()[playerPokemon.getMoveset().findIndex(m => m.moveId === moveQueue[0].move)].isUsable(playerPokemon, moveQueue[0].ignorePP))) { - moveQueue.shift(); - } - - if (moveQueue.length) { - const queuedMove = moveQueue[0]; - if (!queuedMove.move) { - this.handleCommand(Command.FIGHT, -1, false); - } else { - const moveIndex = playerPokemon.getMoveset().findIndex(m => m.moveId === queuedMove.move); - if (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex].isUsable(playerPokemon, queuedMove.ignorePP)) { - this.handleCommand(Command.FIGHT, moveIndex, queuedMove.ignorePP, { targets: queuedMove.targets, multiple: queuedMove.targets.length > 1 }); - } else { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - } - } - } else { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - } - } - - 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) { - case Command.FIGHT: - let useStruggle = false; - if (cursor === -1 || - playerPokemon.trySelectMove(cursor, args[0] as boolean) || - (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m.isUsable(playerPokemon)).length)) { - const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor].moveId : Moves.NONE : Moves.STRUGGLE; - const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; - const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2]; - if (!moveId) { - turnCommand.targets = [this.fieldIndex]; - } - console.log(moveTargets, playerPokemon.name); - if (moveTargets.targets.length <= 1 || moveTargets.multiple) { - turnCommand.move.targets = moveTargets.targets; - } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { - turnCommand.move.targets = playerPokemon.getMoveQueue()[0].targets; - } else { - this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); - } - this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; - success = true; - } else if (cursor < playerPokemon.getMoveset().length) { - const move = playerPokemon.getMoveset()[cursor]; - this.scene.ui.setMode(Mode.MESSAGE); - - // Decides between a Disabled, Not Implemented, or No PP translation message - const errorMessage = - playerPokemon.summonData.disabledMove === move.moveId ? "battle:moveDisabled" : - move.getName().endsWith(" (N)") ? "battle:moveNotImplemented" : "battle:moveNoPP"; - const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator - - this.scene.ui.showText(i18next.t(errorMessage, { moveName: moveName }), null, () => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); - }, null, true); - } - break; - case Command.BALL: - if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballTrainer"), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else { - const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); - if (targets.length > 1) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballMulti"), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (cursor < 5) { - const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true)); - if (targetPokemon.isBoss() && targetPokemon.bossSegmentIndex >= 1 && !targetPokemon.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballStrong"), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else { - this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor }; - this.scene.currentBattle.turnCommands[this.fieldIndex].targets = targets; - if (this.fieldIndex) { - this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; - } - success = true; - } - } - } - break; - case Command.POKEMON: - case Command.RUN: - const isSwitch = command === Command.POKEMON; - if (!isSwitch && this.scene.arena.biomeType === Biome.END) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noEscapeForce"), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else { - const trapTag = playerPokemon.findTag(t => t instanceof TrappedTag) as TrappedTag; - const trapped = new Utils.BooleanHolder(false); - const batonPass = isSwitch && args[0] as boolean; - if (!batonPass) { - enemyField.forEach(enemyPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trapped, playerPokemon)); - } - if (batonPass || (!trapTag && !trapped.value)) { - this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch - ? { command: Command.POKEMON, cursor: cursor, args: args } - : { command: Command.RUN }; - success = true; - if (!isSwitch && this.fieldIndex) { - this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; - } - } else if (trapTag) { - if (trapTag.sourceMove === Moves.INGRAIN && this.scene.getPokemonById(trapTag.sourceId).isOfType(Type.GHOST)) { - success = true; - this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch - ? { command: Command.POKEMON, cursor: cursor, args: args } - : { command: Command.RUN }; - break; - } - if (!isSwitch) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - } - this.scene.ui.showText( - i18next.t("battle:noEscapePokemon", { - pokemonName: this.scene.getPokemonById(trapTag.sourceId).name, - moveName: trapTag.getMoveName(), - escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee") - }), - null, - () => { - this.scene.ui.showText(null, 0); - if (!isSwitch) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - } - }, null, true); - } - } - break; - } - - if (success) { - this.end(); - } - - return success; - } - - cancel() { - if (this.fieldIndex) { - this.scene.unshiftPhase(new CommandPhase(this.scene, 0)); - this.scene.unshiftPhase(new CommandPhase(this.scene, 1)); - this.end(); - } - } - - checkFightOverride(): boolean { - const pokemon = this.getPokemon(); - - const encoreTag = pokemon.getTag(EncoreTag) as EncoreTag; - - if (!encoreTag) { - return false; - } - - const moveIndex = pokemon.getMoveset().findIndex(m => m.moveId === encoreTag.moveId); - - if (moveIndex === -1 || !pokemon.getMoveset()[moveIndex].isUsable(pokemon)) { - return false; - } - - this.handleCommand(Command.FIGHT, moveIndex, false); - - return true; - } - - getFieldIndex(): integer { - return this.fieldIndex; - } - - getPokemon(): PlayerPokemon { - return this.scene.getPlayerField()[this.fieldIndex]; - } - - end() { - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - } -} - -export class EnemyCommandPhase extends FieldPhase { - protected fieldIndex: integer; - - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene); - - this.fieldIndex = fieldIndex; - } - - start() { - super.start(); - - const enemyPokemon = this.scene.getEnemyField()[this.fieldIndex]; - - const battle = this.scene.currentBattle; - - const trainer = battle.trainer; - - 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)); - if (!trapTag && !trapped.value) { - const partyMemberScores = trainer.getPartyMemberMatchupScores(enemyPokemon.trainerSlot, true); - - if (partyMemberScores.length) { - const matchupScores = opponents.map(opp => enemyPokemon.getMatchupScore(opp)); - const matchupScore = matchupScores.reduce((total, score) => total += score, 0) / matchupScores.length; - - const sortedPartyMemberScores = trainer.getSortedPartyMemberMatchupScores(partyMemberScores); - - const switchMultiplier = 1 - (battle.enemySwitchCounter ? Math.pow(0.1, (1 / battle.enemySwitchCounter)) : 0); - - if (sortedPartyMemberScores[0][1] * switchMultiplier >= matchupScore * (trainer.config.isBoss ? 2 : 3)) { - const index = trainer.getNextSummonIndex(enemyPokemon.trainerSlot, partyMemberScores); - - battle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = - { command: Command.POKEMON, cursor: index, args: [false] }; - - battle.enemySwitchCounter++; - - return this.end(); - } - } - } - } - - const nextMove = enemyPokemon.getNextMove(); - - this.scene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = - { command: Command.FIGHT, move: nextMove }; - - this.scene.currentBattle.enemySwitchCounter = Math.max(this.scene.currentBattle.enemySwitchCounter - 1, 0); - - this.end(); - } -} - -export class SelectTargetPhase extends PokemonPhase { - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene, fieldIndex); - } - - start() { - super.start(); - - const turnCommand = this.scene.currentBattle.turnCommands[this.fieldIndex]; - const move = turnCommand.move?.move; - this.scene.ui.setMode(Mode.TARGET_SELECT, this.fieldIndex, move, (cursor: integer) => { - this.scene.ui.setMode(Mode.MESSAGE); - if (cursor === -1) { - this.scene.currentBattle.turnCommands[this.fieldIndex] = null; - this.scene.unshiftPhase(new CommandPhase(this.scene, this.fieldIndex)); - } else { - turnCommand.targets = [cursor]; - } - if (turnCommand.command === Command.BALL && this.fieldIndex) { - this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; - } - this.end(); - }); - } -} - -export class TurnStartPhase extends FieldPhase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - const field = this.scene.getField(); - const order = this.getOrder(); - - const battlerBypassSpeed = {}; - - this.scene.getField(true).filter(p => p.summonData).map(p => { - const bypassSpeed = new Utils.BooleanHolder(false); - applyAbAttrs(BypassSpeedChanceAbAttr, p, null, bypassSpeed); - this.scene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); - battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; - }); - - const moveOrder = order.slice(0); - - moveOrder.sort((a, b) => { - const aCommand = this.scene.currentBattle.turnCommands[a]; - const bCommand = this.scene.currentBattle.turnCommands[b]; - - if (aCommand.command !== bCommand.command) { - if (aCommand.command === Command.FIGHT) { - return 1; - } else if (bCommand.command === Command.FIGHT) { - return -1; - } - } else if (aCommand.command === Command.FIGHT) { - const aMove = allMoves[aCommand.move.move]; - const bMove = allMoves[bCommand.move.move]; - - const aPriority = new Utils.IntegerHolder(aMove.priority); - const bPriority = new Utils.IntegerHolder(bMove.priority); - - applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a), null, aMove, aPriority); - applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b), null, bMove, bPriority); - - applyAbAttrs(IncrementMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a), null, aMove, aPriority); - applyAbAttrs(IncrementMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b), null, bMove, bPriority); - - if (aPriority.value !== bPriority.value) { - return aPriority.value < bPriority.value ? 1 : -1; - } - } - - if (battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) { - return battlerBypassSpeed[a].value ? -1 : 1; - } - - const aIndex = order.indexOf(a); - const bIndex = order.indexOf(b); - - return aIndex < bIndex ? -1 : aIndex > bIndex ? 1 : 0; - }); - - for (const o of moveOrder) { - - const pokemon = field[o]; - const turnCommand = this.scene.currentBattle.turnCommands[o]; - - if (turnCommand.skip) { - continue; - } - - switch (turnCommand.command) { - case Command.FIGHT: - const queuedMove = turnCommand.move; - if (!queuedMove) { - continue; - } - const move = pokemon.getMoveset().find(m => m.moveId === queuedMove.move) || new PokemonMove(queuedMove.move); - if (pokemon.isPlayer()) { - if (turnCommand.cursor === -1) { - this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move)); - } else { - const playerPhase = new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move, false, queuedMove.ignorePP); - this.scene.pushPhase(playerPhase); - } - } else { - this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move, false, queuedMove.ignorePP)); - } - break; - case Command.BALL: - this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets[0] % 2, turnCommand.cursor)); - break; - case Command.POKEMON: - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), turnCommand.cursor, true, turnCommand.args[0] as boolean, pokemon.isPlayer())); - break; - case Command.RUN: - let runningPokemon = pokemon; - if (this.scene.currentBattle.double) { - const playerActivePokemon = field.filter(pokemon => { - if (!!pokemon) { - return pokemon.isPlayer() && pokemon.isActive(); - } else { - return; - } - }); - // if only one pokemon is alive, use that one - if (playerActivePokemon.length > 1) { - // find which active pokemon has faster speed - const fasterPokemon = playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) ? playerActivePokemon[0] : playerActivePokemon[1]; - // check if either active pokemon has the ability "Run Away" - const hasRunAway = playerActivePokemon.find(p => p.hasAbility(Abilities.RUN_AWAY)); - runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon; - } - } - this.scene.unshiftPhase(new AttemptRunPhase(this.scene, runningPokemon.getFieldIndex())); - break; - } - } - - - this.scene.pushPhase(new WeatherEffectPhase(this.scene)); - - for (const o of order) { - if (field[o].status && field[o].status.isPostTurn()) { - this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, o)); - } - } - - this.scene.pushPhase(new BerryPhase(this.scene)); - this.scene.pushPhase(new TurnEndPhase(this.scene)); - - this.end(); - } -} - -/** The phase after attacks where the pokemon eat berries */ -export class BerryPhase extends FieldPhase { - start() { - super.start(); - - this.executeForAll((pokemon) => { - const hasUsableBerry = !!this.scene.findModifier((m) => { - return m instanceof BerryModifier && m.shouldApply([pokemon]); - }, pokemon.isPlayer()); - - if (hasUsableBerry) { - const cancelled = new Utils.BooleanHolder(false); - pokemon.getOpponents().map((opp) => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled)); - - if (cancelled.value) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is too\nnervous to eat berries!")); - } else { - this.scene.unshiftPhase( - new CommonAnimPhase(this.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.USE_ITEM) - ); - - for (const berryModifier of this.scene.applyModifiers(BerryModifier, pokemon.isPlayer(), pokemon) as BerryModifier[]) { - if (berryModifier.consumed) { - if (!--berryModifier.stackCount) { - this.scene.removeModifier(berryModifier); - } else { - berryModifier.consumed = false; - } - } - this.scene.eventTarget.dispatchEvent(new BerryUsedEvent(berryModifier)); // Announce a berry was used - } - - this.scene.updateModifiers(pokemon.isPlayer()); - - applyAbAttrs(HealFromBerryUseAbAttr, pokemon, new Utils.BooleanHolder(false)); - } - } - }); - - this.end(); - } -} - -export class TurnEndPhase extends FieldPhase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - this.scene.currentBattle.incrementTurn(this.scene); - this.scene.eventTarget.dispatchEvent(new TurnEndEvent(this.scene.currentBattle.turn)); - - const handlePokemon = (pokemon: Pokemon) => { - pokemon.lapseTags(BattlerTagLapseType.TURN_END); - - if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) { - this.scene.pushPhase(new MessagePhase(this.scene, i18next.t("battle:notDisabled", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: allMoves[pokemon.summonData.disabledMove].name }))); - pokemon.summonData.disabledMove = Moves.NONE; - } - - this.scene.applyModifiers(TurnHealModifier, pokemon.isPlayer(), pokemon); - - if (this.scene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { - this.scene.unshiftPhase(new PokemonHealPhase(this.scene, pokemon.getBattlerIndex(), - Math.max(pokemon.getMaxHp() >> 4, 1), i18next.t("battle:turnEndHpRestore", { pokemonName: getPokemonNameWithAffix(pokemon) }), true)); - } - - if (!pokemon.isPlayer()) { - this.scene.applyModifiers(EnemyTurnHealModifier, false, pokemon); - this.scene.applyModifier(EnemyStatusEffectHealChanceModifier, false, pokemon); - } - - applyPostTurnAbAttrs(PostTurnAbAttr, pokemon); - - this.scene.applyModifiers(TurnStatusEffectModifier, pokemon.isPlayer(), pokemon); - - this.scene.applyModifiers(TurnHeldItemTransferModifier, pokemon.isPlayer(), pokemon); - - pokemon.battleSummonData.turnCount++; - }; - - this.executeForAll(handlePokemon); - - this.scene.arena.lapseTags(); - - if (this.scene.arena.weather && !this.scene.arena.weather.lapse()) { - this.scene.arena.trySetWeather(WeatherType.NONE, false); - } - - if (this.scene.arena.terrain && !this.scene.arena.terrain.lapse()) { - this.scene.arena.trySetTerrain(TerrainType.NONE, false); - } - - this.end(); - } -} - -export class BattleEndPhase extends BattlePhase { - start() { - super.start(); - - this.scene.currentBattle.addBattleScore(this.scene); - - this.scene.gameData.gameStats.battles++; - if (this.scene.currentBattle.trainer) { - this.scene.gameData.gameStats.trainersDefeated++; - } - if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) { - this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1; - } - - // Endless graceful end - if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex >= 5850) { - this.scene.clearPhaseQueue(); - 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); - } - - if (this.scene.currentBattle.moneyScattered) { - this.scene.currentBattle.pickUpScatteredMoney(this.scene); - } - - this.scene.clearEnemyHeldItemModifiers(); - - const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; - for (const m of lapsingModifiers) { - const args: any[] = []; - if (m instanceof LapsingPokemonHeldItemModifier) { - args.push(this.scene.getPokemonById(m.pokemonId)); - } - if (!m.lapse(args)) { - this.scene.removeModifier(m); - } - } - - this.scene.updateModifiers().then(() => this.end()); - } -} - -export class NewBattlePhase extends BattlePhase { - start() { - super.start(); - - this.scene.newBattle(); - - this.end(); - } -} - -export class CommonAnimPhase extends PokemonPhase { - private anim: CommonAnim; - private targetIndex: integer; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, targetIndex: BattlerIndex, anim: CommonAnim) { - super(scene, battlerIndex); - - this.anim = anim; - this.targetIndex = targetIndex; - } - - setAnimation(anim: CommonAnim) { - this.anim = anim; - } - - start() { - new CommonBattleAnim(this.anim, this.getPokemon(), this.targetIndex !== undefined ? (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField())[this.targetIndex] : this.getPokemon()).play(this.scene, () => { - this.end(); - }); - } -} - -export class MovePhase extends BattlePhase { - public pokemon: Pokemon; - public move: PokemonMove; - public targets: BattlerIndex[]; - protected followUp: boolean; - protected ignorePp: boolean; - protected failed: boolean; - protected cancelled: boolean; - - constructor(scene: BattleScene, pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp?: boolean, ignorePp?: boolean) { - super(scene); - - this.pokemon = pokemon; - this.targets = targets; - this.move = move; - this.followUp = !!followUp; - this.ignorePp = !!ignorePp; - this.failed = false; - this.cancelled = false; - } - - canMove(): boolean { - return this.pokemon.isActive(true) && this.move.isUsable(this.pokemon, this.ignorePp) && !!this.targets.length; - } - - /**Signifies the current move should fail but still use PP */ - fail(): void { - this.failed = true; - } - - /**Signifies the current move should cancel and retain PP */ - cancel(): void { - this.cancelled = true; - } - - start() { - super.start(); - - console.log(Moves[this.move.moveId]); - - if (!this.canMove()) { - if (this.move.moveId && this.pokemon.summonData?.disabledMove === this.move.moveId) { - this.scene.queueMessage(`${this.move.getName()} is disabled!`); - } - if (this.pokemon.isActive(true) && this.move.ppUsed >= this.move.getMovePp()) { // if the move PP was reduced from Spite or otherwise, the move fails - this.fail(); - this.showMoveText(); - this.showFailedText(); - } - return this.end(); - } - - if (!this.followUp) { - if (this.move.getMove().checkFlag(MoveFlags.IGNORE_ABILITIES, this.pokemon, null)) { - this.scene.arena.setIgnoreAbilities(); - } - } else { - this.pokemon.turnData.hitsLeft = undefined; - this.pokemon.turnData.hitCount = undefined; - } - - // Move redirection abilities (ie. Storm Drain) only support single target moves - const moveTarget = this.targets.length === 1 - ? new Utils.IntegerHolder(this.targets[0]) - : null; - if (moveTarget) { - const oldTarget = moveTarget.value; - this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, this.move.moveId, moveTarget)); - this.pokemon.getOpponents().forEach(p => { - const redirectTag = p.getTag(CenterOfAttentionTag) as CenterOfAttentionTag; - if (redirectTag && (!redirectTag.powder || (!this.pokemon.isOfType(Type.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT)))) { - moveTarget.value = p.getBattlerIndex(); - } - }); - //Check if this move is immune to being redirected, and restore its target to the intended target if it is. - if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) || this.move.getMove().hasAttr(BypassRedirectAttr))) { - //If an ability prevented this move from being redirected, display its ability pop up. - if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) && !this.move.getMove().hasAttr(BypassRedirectAttr)) && oldTarget !== moveTarget.value) { - this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr))); - } - moveTarget.value = oldTarget; - } - this.targets[0] = moveTarget.value; - } - - if (this.targets.length === 1 && this.targets[0] === BattlerIndex.ATTACKER) { - if (this.pokemon.turnData.attacksReceived.length) { - const attacker = this.pokemon.turnData.attacksReceived.length ? this.pokemon.scene.getPokemonById(this.pokemon.turnData.attacksReceived[0].sourceId) : null; - if (attacker?.isActive(true)) { - this.targets[0] = attacker.getBattlerIndex(); - } - } - if (this.targets[0] === BattlerIndex.ATTACKER) { - this.fail(); // Marks the move as failed for later in doMove - this.showMoveText(); - this.showFailedText(); - } - } - - const targets = this.scene.getField(true).filter(p => { - if (this.targets.indexOf(p.getBattlerIndex()) > -1) { - return true; - } - return false; - }); - - const doMove = () => { - this.pokemon.turnData.acted = true; // Record that the move was attempted, even if it fails - - this.pokemon.lapseTags(BattlerTagLapseType.PRE_MOVE); - - let ppUsed = 1; - // Filter all opponents to include only those this move is targeting - const targetedOpponents = this.pokemon.getOpponents().filter(o => this.targets.includes(o.getBattlerIndex())); - for (const opponent of targetedOpponents) { - if (this.move.ppUsed + ppUsed >= this.move.getMovePp()) { // If we're already at max PP usage, stop checking - break; - } - if (opponent.hasAbilityWithAttr(IncreasePpAbAttr)) { // Accounting for abilities like Pressure - ppUsed++; - } - } - - if (!this.followUp && this.canMove() && !this.cancelled) { - this.pokemon.lapseTags(BattlerTagLapseType.MOVE); - } - - const moveQueue = this.pokemon.getMoveQueue(); - if (this.cancelled || this.failed) { - if (this.failed) { - this.move.usePp(ppUsed); // Only use PP if the move failed - this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); - } - - // Record a failed move so Abilities like Truant don't trigger next turn and soft-lock - this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); - - this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); // Remove any tags from moves like Fly/Dive/etc. - moveQueue.shift(); // Remove the second turn of charge moves - return this.end(); - } - - this.scene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger); - - if (this.move.moveId) { - this.showMoveText(); - } - - // This should only happen when there are no valid targets left on the field - if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || !targets.length) { - this.showFailedText(); - this.cancel(); - - // Record a failed move so Abilities like Truant don't trigger next turn and soft-lock - this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); - - this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); // Remove any tags from moves like Fly/Dive/etc. - - moveQueue.shift(); - return this.end(); - } - - if (!moveQueue.length || !moveQueue.shift().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(), ppUsed)); - } - - if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { - this.scene.currentBattle.lastMove = this.move.moveId; - } - - // Assume conditions affecting targets only apply to moves with a single target - let success = this.move.getMove().applyConditions(this.pokemon, targets[0], this.move.getMove()); - const cancelled = new Utils.BooleanHolder(false); - let failedText = this.move.getMove().getFailedText(this.pokemon, targets[0], this.move.getMove(), cancelled); - if (success && this.scene.arena.isMoveWeatherCancelled(this.move.getMove())) { - success = false; - } else if (success && this.scene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, this.move.getMove())) { - success = false; - if (failedText === null) { - failedText = getTerrainBlockMessage(targets[0], this.scene.arena.terrain.terrainType); - } - } - - /** - * Trigger pokemon type change before playing the move animation - * Will still change the user's type when using Roar, Whirlwind, Trick-or-Treat, and Forest's Curse, - * regardless of whether the move successfully executes or not. - */ - if (success || [Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE].includes(this.move.moveId)) { - applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); - } - - if (success) { - this.scene.unshiftPhase(this.getEffectPhase()); - } else { - this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); - if (!cancelled.value) { - this.showFailedText(failedText); - } - } - // Checks if Dancer ability is triggered - if (this.move.getMove().hasFlag(MoveFlags.DANCE_MOVE) && !this.followUp) { - // Pokemon with Dancer can be on either side of the battle so we check in both cases - this.scene.getPlayerField().forEach(pokemon => { - applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets); - }); - this.scene.getEnemyField().forEach(pokemon => { - applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets); - }); - } - this.end(); - }; - - if (!this.followUp && this.pokemon.status && !this.pokemon.status.isPostTurn()) { - this.pokemon.status.incrementTurn(); - let activated = false; - let healed = false; - - switch (this.pokemon.status.effect) { - case StatusEffect.PARALYSIS: - if (!this.pokemon.randSeedInt(4)) { - activated = true; - this.cancelled = true; - } - break; - case StatusEffect.SLEEP: - applyMoveAttrs(BypassSleepAttr, this.pokemon, null, this.move.getMove()); - healed = this.pokemon.status.turnCount === this.pokemon.status.cureTurn; - activated = !healed && !this.pokemon.getTag(BattlerTagType.BYPASS_SLEEP); - this.cancelled = activated; - break; - case StatusEffect.FREEZE: - healed = !!this.move.getMove().findAttr(attr => attr instanceof HealStatusEffectAttr && attr.selfTarget && attr.isOfEffect(StatusEffect.FREEZE)) || !this.pokemon.randSeedInt(5); - activated = !healed; - this.cancelled = activated; - break; - } - - if (activated) { - this.scene.queueMessage(getStatusEffectActivationText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); - this.scene.unshiftPhase(new CommonAnimPhase(this.scene, this.pokemon.getBattlerIndex(), undefined, CommonAnim.POISON + (this.pokemon.status.effect - 1))); - doMove(); - } else { - if (healed) { - this.scene.queueMessage(getStatusEffectHealText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); - this.pokemon.resetStatus(); - this.pokemon.updateInfo(); - } - doMove(); - } - } else { - doMove(); - } - } - - getEffectPhase(): MoveEffectPhase { - return new MoveEffectPhase(this.scene, this.pokemon.getBattlerIndex(), this.targets, this.move); - } - - showMoveText(): void { - if (this.move.getMove().hasAttr(ChargeAttr)) { - const lastMove = this.pokemon.getLastXMoves() as TurnMove[]; - if (!lastMove.length || lastMove[0].move !== this.move.getMove().id || lastMove[0].result !== MoveResult.OTHER) { - this.scene.queueMessage(i18next.t("battle:useMove", { - pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), - moveName: this.move.getName() - }), 500); - return; - } - } - - if (this.pokemon.getTag(BattlerTagType.RECHARGING || BattlerTagType.INTERRUPTED)) { - return; - } - - this.scene.queueMessage(i18next.t("battle:useMove", { - pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), - moveName: this.move.getName() - }), 500); - applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents().find(() => true), this.move.getMove()); - } - - showFailedText(failedText: string = null): void { - this.scene.queueMessage(failedText || i18next.t("battle:attackFailed")); - } - - end() { - if (!this.followUp && this.canMove()) { - this.scene.unshiftPhase(new MoveEndPhase(this.scene, this.pokemon.getBattlerIndex())); - } - - super.end(); - } -} - -export class MoveEffectPhase extends PokemonPhase { - public move: PokemonMove; - protected targets: BattlerIndex[]; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove) { - super(scene, battlerIndex); - this.move = move; - // In double battles, if the right Pokemon selects a spread move and the left Pokemon dies - // with no party members available to switch in, then the right Pokemon takes the index - // of the left Pokemon and gets hit unless this is checked. - if (targets.includes(battlerIndex) && this.move.getMove().moveTarget === MoveTarget.ALL_NEAR_OTHERS) { - const i = targets.indexOf(battlerIndex); - targets.splice(i, i + 1); - } - this.targets = targets; - } - - start() { - super.start(); - - const user = this.getUserPokemon(); - const targets = this.getTargets(); - - if (!user?.isOnField()) { - return super.end(); - } - - const overridden = new Utils.BooleanHolder(false); - const move = this.move.getMove(); - - // Assume single target for override - applyMoveAttrs(OverrideMoveEffectAttr, user, this.getTarget(), move, overridden, this.move.virtual).then(() => { - - if (overridden.value) { - return this.end(); - } - - user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); - - if (user.turnData.hitsLeft === undefined) { - const hitCount = new Utils.IntegerHolder(1); - // Assume single target for multi hit - applyMoveAttrs(MultiHitAttr, user, this.getTarget(), move, hitCount); - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, targets.length, hitCount, new Utils.IntegerHolder(0)); - if (move instanceof AttackMove && !move.hasAttr(FixedDamageAttr)) { - this.scene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, hitCount, new Utils.IntegerHolder(0)); - } - user.turnData.hitsLeft = user.turnData.hitCount = hitCount.value; - } - - const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; - - const targetHitChecks = Object.fromEntries(targets.map(p => [p.getBattlerIndex(), this.hitCheck(p)])); - const activeTargets = targets.map(t => t.isActive(true)); - if (!activeTargets.length || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]])) { - this.stopMultiHit(); - if (activeTargets.length) { - this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); - moveHistoryEntry.result = MoveResult.MISS; - applyMoveAttrs(MissEffectAttr, user, null, move); - } else { - this.scene.queueMessage(i18next.t("battle:attackFailed")); - moveHistoryEntry.result = MoveResult.FAIL; - } - user.pushMoveHistory(moveHistoryEntry); - return this.end(); - } - - const applyAttrs: Promise[] = []; - - // Move animation only needs one target - new MoveAnim(move.id as Moves, user, this.getTarget()?.getBattlerIndex()).play(this.scene, () => { - for (const target of targets) { - if (!targetHitChecks[target.getBattlerIndex()]) { - this.stopMultiHit(target); - this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); - if (moveHistoryEntry.result === MoveResult.PENDING) { - moveHistoryEntry.result = MoveResult.MISS; - } - applyMoveAttrs(MissEffectAttr, user, null, move); - continue; - } - - const isProtected = !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target) && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)); - - const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); - const firstTarget = (moveHistoryEntry.result === MoveResult.PENDING); - - if (firstHit) { - user.pushMoveHistory(moveHistoryEntry); - } - - moveHistoryEntry.result = MoveResult.SUCCESS; - - const hitResult = !isProtected ? target.apply(user, move) : HitResult.NO_EFFECT; - - const lastHit = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()); - - if (lastHit) { - this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); - } - - applyAttrs.push(new Promise(resolve => { - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), - user, target, move).then(() => { - if (hitResult !== HitResult.FAIL) { - const chargeEffect = !!move.getAttrs(ChargeAttr).find(ca => ca.usedChargeEffect(user, this.getTarget(), move)); - // Charge attribute with charge effect takes all effect attributes and applies them to charge stage, so ignore them if this is present - Utils.executeIf(!chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY - && attr.selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, move)).then(() => { - if (hitResult !== HitResult.NO_EFFECT) { - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_APPLY - && !(attr as MoveEffectAttr).selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()).then(() => { - if (hitResult < HitResult.NO_EFFECT && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr)) { - const flinched = new Utils.BooleanHolder(false); - user.scene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); - if (flinched.value) { - target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); - } - } - Utils.executeIf(!isProtected && !chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.HIT - && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && (!attr.firstTargetOnly || firstTarget), user, target, this.move.getMove()).then(() => { - return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult).then(() => { - if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { - user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); - } - })).then(() => { - applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult).then(() => { - if (this.move.getMove() instanceof AttackMove) { - this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); - } - resolve(); - }); - }); - }) - ).then(() => resolve()); - }); - } else { - applyMoveAttrs(NoEffectAttr, user, null, move).then(() => resolve()); - } - }); - } else { - resolve(); - } - }); - })); - } - // Trigger effect which should only apply one time on the last hit after all targeted effects have already applied - const postTarget = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()) ? - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : - null; - - if (!!postTarget) { - if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after - applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); - } else { // Otherwise, push a new asynchronous move effect - applyAttrs.push(postTarget); - } - } - - Promise.allSettled(applyAttrs).then(() => this.end()); - }); - }); - } - - end() { - const move = this.move.getMove(); - move.type = move.defaultType; - const user = this.getUserPokemon(); - if (user) { - if (--user.turnData.hitsLeft >= 1 && this.getTarget()?.isActive()) { - this.scene.unshiftPhase(this.getNewHitPhase()); - } else { - const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0); - if (hitsTotal > 1) { - this.scene.queueMessage(i18next.t("battle:attackHitsCount", { count: hitsTotal })); - } - this.scene.applyModifiers(HitHealModifier, this.player, user); - } - } - - super.end(); - } - - hitCheck(target: Pokemon): boolean { - // Moves targeting the user and entry hazards can't miss - if ([MoveTarget.USER, MoveTarget.ENEMY_SIDE].includes(this.move.getMove().moveTarget)) { - return true; - } - - const user = this.getUserPokemon(); - - // Hit check only calculated on first hit for multi-hit moves unless flag is set to check all hits. - // However, if an ability with the MaxMultiHitAbAttr, namely Skill Link, is present, act as a normal - // multi-hit move and proceed with all hits - if (user.turnData.hitsLeft < user.turnData.hitCount) { - if (!this.move.getMove().hasFlag(MoveFlags.CHECK_ALL_HITS) || user.hasAbilityWithAttr(MaxMultiHitAbAttr)) { - return true; - } - } - - if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { - return true; - } - - // If the user should ignore accuracy on a target, check who the user targeted last turn and see if they match - if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().slice(1).find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { - return true; - } - - const hiddenTag = target.getTag(SemiInvulnerableTag); - if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === hiddenTag.tagType)) { - return false; - } - - const moveAccuracy = new Utils.NumberHolder(this.move.getMove().accuracy); - - applyMoveAttrs(VariableAccuracyAttr, user, target, this.move.getMove(), moveAccuracy); - applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this.move.getMove(), { value: false }, moveAccuracy); - - if (moveAccuracy.value === -1) { - return true; - } - - const isOhko = this.move.getMove().hasAttr(OneHitKOAccuracyAttr); - - if (!isOhko) { - user.scene.applyModifiers(PokemonMoveAccuracyBoosterModifier, user.isPlayer(), user, moveAccuracy); - } - - if (this.scene.arena.weather?.weatherType === WeatherType.FOG) { - moveAccuracy.value = Math.floor(moveAccuracy.value * 0.9); - } - - if (!isOhko && this.scene.arena.getTag(ArenaTagType.GRAVITY)) { - moveAccuracy.value = Math.floor(moveAccuracy.value * 1.67); - } - - const userAccuracyLevel = new Utils.IntegerHolder(user.summonData.battleStats[BattleStat.ACC]); - const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]); - applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, userAccuracyLevel); - applyAbAttrs(IgnoreOpponentStatChangesAbAttr, user, null, targetEvasionLevel); - applyAbAttrs(IgnoreOpponentEvasionAbAttr, user, null, targetEvasionLevel); - applyMoveAttrs(IgnoreOpponentStatChangesAttr, user, target, this.move.getMove(), targetEvasionLevel); - this.scene.applyModifiers(TempBattleStatBoosterModifier, this.player, TempBattleStat.ACC, userAccuracyLevel); - - const rand = user.randSeedInt(100, 1); - - 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)); - } - - applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, user, BattleStat.ACC, accuracyMultiplier, this.move.getMove()); - - const evasionMultiplier = new Utils.NumberHolder(1); - applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier); - - accuracyMultiplier.value /= evasionMultiplier.value; - - return rand <= moveAccuracy.value * accuracyMultiplier.value; - } - - getUserPokemon(): Pokemon { - if (this.battlerIndex > BattlerIndex.ENEMY_2) { - return this.scene.getPokemonById(this.battlerIndex); - } - return (this.player ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.fieldIndex]; - } - - getTargets(): Pokemon[] { - return this.scene.getField(true).filter(p => this.targets.indexOf(p.getBattlerIndex()) > -1); - } - - getTarget(): Pokemon { - return this.getTargets().find(() => true); - } - - removeTarget(target: Pokemon): void { - const targetIndex = this.targets.findIndex(ind => ind === target.getBattlerIndex()); - if (targetIndex !== -1) { - this.targets.splice(this.targets.findIndex(ind => ind === target.getBattlerIndex()), 1); - } - } - - stopMultiHit(target?: Pokemon): void { - /** If given a specific target, remove the target from subsequent strikes */ - if (target) { - this.removeTarget(target); - } - /** - * If no target specified, or the specified target was the last of this move's - * targets, completely cancel all subsequent strikes. - */ - if (!target || this.targets.length === 0 ) { - this.getUserPokemon().turnData.hitCount = 1; - this.getUserPokemon().turnData.hitsLeft = 1; - } - } - - getNewHitPhase() { - return new MoveEffectPhase(this.scene, this.battlerIndex, this.targets, this.move); - } -} - -export class MoveEndPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); - } - - start() { - super.start(); - - const pokemon = this.getPokemon(); - if (pokemon.isActive(true)) { - pokemon.lapseTags(BattlerTagLapseType.AFTER_MOVE); - } - - this.scene.arena.setIgnoreAbilities(false); - - this.end(); - } -} - -export class MoveAnimTestPhase extends BattlePhase { - private moveQueue: Moves[]; - - constructor(scene: BattleScene, moveQueue?: Moves[]) { - super(scene); - - this.moveQueue = moveQueue || Utils.getEnumValues(Moves).slice(1); - } - - start() { - const moveQueue = this.moveQueue.slice(0); - this.playMoveAnim(moveQueue, true); - } - - playMoveAnim(moveQueue: Moves[], player: boolean) { - const moveId = player ? moveQueue[0] : moveQueue.shift(); - if (moveId === undefined) { - this.playMoveAnim(this.moveQueue.slice(0), true); - return; - } else if (player) { - console.log(Moves[moveId]); - } - - initMoveAnim(this.scene, moveId).then(() => { - loadMoveAnimAssets(this.scene, [moveId], true) - .then(() => { - new MoveAnim(moveId, player ? this.scene.getPlayerPokemon() : this.scene.getEnemyPokemon(), (player !== (allMoves[moveId] instanceof SelfStatusMove) ? this.scene.getEnemyPokemon() : this.scene.getPlayerPokemon()).getBattlerIndex()).play(this.scene, () => { - if (player) { - this.playMoveAnim(moveQueue, false); - } else { - this.playMoveAnim(moveQueue, true); - } - }); - }); - }); - } -} - -export class ShowAbilityPhase extends PokemonPhase { - private passive: boolean; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, passive: boolean = false) { - super(scene, battlerIndex); - - this.passive = passive; - } - - start() { - super.start(); - - const pokemon = this.getPokemon(); - - this.scene.abilityBar.showAbility(pokemon, this.passive); - if (pokemon.battleData) { - pokemon.battleData.abilityRevealed = true; - } - - this.end(); - } -} - -export class StatChangePhase extends PokemonPhase { - private stats: BattleStat[]; - private selfTarget: boolean; - private levels: integer; - private showMessage: boolean; - private ignoreAbilities: boolean; - private canBeCopied: boolean; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], levels: integer, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true) { - super(scene, battlerIndex); - - this.selfTarget = selfTarget; - this.stats = stats; - this.levels = levels; - this.showMessage = showMessage; - this.ignoreAbilities = ignoreAbilities; - this.canBeCopied = canBeCopied; - } - - 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, 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]); - - 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, this.stats, levels.value); - } - } - - applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget); - - 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(`stat_${levels.value >= 1 ? "up" : "down"}`); - - statSprite.setMask(new Phaser.Display.Masks.BitmapMask(this.scene, pokemonMaskSprite)); - - 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 allStats[this.getPokemon().randSeedInt(BattleStat.SPD + 1)]; - } - - 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 - ? "stats" - : `${relLevelStats.slice(0, -1).map(s => getBattleStatName(s)).join(", ")}${relLevelStats.length > 2 ? "," : ""} and ${getBattleStatName(relLevelStats[relLevelStats.length - 1])}`; - } else { - statsFragment = getBattleStatName(relLevelStats[0]); - } - messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1)); - }); - - return messages; - } -} - -export class WeatherEffectPhase extends CommonAnimPhase { - public weather: Weather; - - constructor(scene: BattleScene) { - super(scene, undefined, undefined, CommonAnim.SUNNY + ((scene?.arena?.weather?.weatherType || WeatherType.NONE) - 1)); - this.weather = scene?.arena?.weather; - } - - start() { - // Update weather state with any changes that occurred during the turn - this.weather = this.scene?.arena?.weather; - - if (!this.weather) { - this.end(); - return; - } - - this.setAnimation(CommonAnim.SUNNY + (this.weather.weatherType - 1)); - - if (this.weather.isDamaging()) { - - const cancelled = new Utils.BooleanHolder(false); - - this.executeForAll((pokemon: Pokemon) => applyPreWeatherEffectAbAttrs(SuppressWeatherEffectAbAttr, pokemon, this.weather, cancelled)); - - if (!cancelled.value) { - const inflictDamage = (pokemon: Pokemon) => { - const cancelled = new Utils.BooleanHolder(false); - - applyPreWeatherEffectAbAttrs(PreWeatherDamageAbAttr, pokemon, this.weather, cancelled); - applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - - if (cancelled.value) { - return; - } - - const damage = Math.ceil(pokemon.getMaxHp() / 16); - - this.scene.queueMessage(getWeatherDamageMessage(this.weather.weatherType, pokemon)); - pokemon.damageAndUpdate(damage, HitResult.EFFECTIVE, false, false, true); - }; - - this.executeForAll((pokemon: Pokemon) => { - const immune = !pokemon || !!pokemon.getTypes(true, true).filter(t => this.weather.isTypeDamageImmune(t)).length; - if (!immune) { - inflictDamage(pokemon); - } - }); - } - } - - this.scene.ui.showText(getWeatherLapseMessage(this.weather.weatherType), null, () => { - this.executeForAll((pokemon: Pokemon) => applyPostWeatherLapseAbAttrs(PostWeatherLapseAbAttr, pokemon, this.weather)); - - super.start(); - }); - } -} - -export class ObtainStatusEffectPhase extends PokemonPhase { - private statusEffect: StatusEffect; - private cureTurn: integer; - private sourceText: string; - private sourcePokemon: Pokemon; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, statusEffect: StatusEffect, cureTurn?: integer, sourceText?: string, sourcePokemon?: Pokemon) { - super(scene, battlerIndex); - - this.statusEffect = statusEffect; - this.cureTurn = cureTurn; - this.sourceText = sourceText; - this.sourcePokemon = sourcePokemon; // For tracking which Pokemon caused the status effect - } - - start() { - const pokemon = this.getPokemon(); - if (!pokemon.status) { - if (pokemon.trySetStatus(this.statusEffect, false, this.sourcePokemon)) { - if (this.cureTurn) { - pokemon.status.cureTurn = this.cureTurn; - } - pokemon.updateInfo(true); - new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect - 1), pokemon).play(this.scene, () => { - this.scene.queueMessage(getStatusEffectObtainText(this.statusEffect, getPokemonNameWithAffix(pokemon), this.sourceText)); - if (pokemon.status.isPostTurn()) { - this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, this.battlerIndex)); - } - this.end(); - }); - return; - } - } else if (pokemon.status.effect === this.statusEffect) { - this.scene.queueMessage(getStatusEffectOverlapText(this.statusEffect, getPokemonNameWithAffix(pokemon))); - } - this.end(); - } -} - -export class PostTurnStatusEffectPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); - } - - start() { - const pokemon = this.getPokemon(); - if (pokemon?.isActive(true) && pokemon.status && pokemon.status.isPostTurn()) { - pokemon.status.incrementTurn(); - const cancelled = new Utils.BooleanHolder(false); - applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - applyAbAttrs(BlockStatusDamageAbAttr, pokemon, cancelled); - - if (!cancelled.value) { - this.scene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); - let damage: integer = 0; - switch (pokemon.status.effect) { - case StatusEffect.POISON: - damage = Math.max(pokemon.getMaxHp() >> 3, 1); - break; - case StatusEffect.TOXIC: - damage = Math.max(Math.floor((pokemon.getMaxHp() / 16) * pokemon.status.turnCount), 1); - break; - case StatusEffect.BURN: - damage = Math.max(pokemon.getMaxHp() >> 4, 1); - break; - } - if (damage) { - // Set preventEndure flag to avoid pokemon surviving thanks to focus band, sturdy, endure ... - this.scene.damageNumberHandler.add(this.getPokemon(), pokemon.damage(damage, false, true)); - pokemon.updateInfo(); - } - new CommonBattleAnim(CommonAnim.POISON + (pokemon.status.effect - 1), pokemon).play(this.scene, () => this.end()); - } else { - this.end(); - } - } else { - this.end(); - } - } -} - -export class MessagePhase extends Phase { - private text: string; - private callbackDelay: integer; - private prompt: boolean; - private promptDelay: integer; - - constructor(scene: BattleScene, text: string, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { - super(scene); - - this.text = text; - this.callbackDelay = callbackDelay; - this.prompt = prompt; - this.promptDelay = promptDelay; - } - - start() { - super.start(); - - if (this.text.indexOf("$") > -1) { - const pageIndex = this.text.indexOf("$"); - this.scene.unshiftPhase(new MessagePhase(this.scene, this.text.slice(pageIndex + 1), this.callbackDelay, this.prompt, this.promptDelay)); - this.text = this.text.slice(0, pageIndex).trim(); - } - - this.scene.ui.showText(this.text, null, () => this.end(), this.callbackDelay || (this.prompt ? 0 : 1500), this.prompt, this.promptDelay); - } - - end() { - if (this.scene.abilityBar.shown) { - this.scene.abilityBar.hide(); - } - - super.end(); - } -} - -export class DamagePhase extends PokemonPhase { - private amount: integer; - private damageResult: DamageResult; - private critical: boolean; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, amount: integer, damageResult?: DamageResult, critical: boolean = false) { - super(scene, battlerIndex); - - this.amount = amount; - this.damageResult = damageResult || HitResult.EFFECTIVE; - this.critical = critical; - } - - start() { - super.start(); - - if (this.damageResult === HitResult.ONE_HIT_KO) { - this.scene.toggleInvert(true); - this.scene.time.delayedCall(Utils.fixedInt(1000), () => { - this.scene.toggleInvert(false); - this.applyDamage(); - }); - return; - } - - this.applyDamage(); - } - - updateAmount(amount: integer): void { - this.amount = amount; - } - - applyDamage() { - switch (this.damageResult) { - case HitResult.EFFECTIVE: - this.scene.playSound("hit"); - break; - case HitResult.SUPER_EFFECTIVE: - case HitResult.ONE_HIT_KO: - this.scene.playSound("hit_strong"); - break; - case HitResult.NOT_VERY_EFFECTIVE: - this.scene.playSound("hit_weak"); - break; - } - - if (this.amount) { - this.scene.damageNumberHandler.add(this.getPokemon(), this.amount, this.damageResult, this.critical); - } - - if (this.damageResult !== HitResult.OTHER) { - const flashTimer = this.scene.time.addEvent({ - delay: 100, - repeat: 5, - startAt: 200, - callback: () => { - this.getPokemon().getSprite().setVisible(flashTimer.repeatCount % 2 === 0); - if (!flashTimer.repeatCount) { - this.getPokemon().updateInfo().then(() => this.end()); - } - } - }); - } else { - this.getPokemon().updateInfo().then(() => this.end()); - } - } - - end() { - switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - const pokemon = this.getPokemon(); - if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { - this.scene.fadeOutBgm(Utils.fixedInt(2000), false); - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, null, () => { - this.scene.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true); - pokemon.generateAndPopulateMoveset(1); - this.scene.setFieldScale(0.75); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - this.scene.currentBattle.double = true; - const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()); - if (availablePartyMembers.length > 1) { - this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true)); - if (!availablePartyMembers[1].isOnField()) { - this.scene.pushPhase(new SummonPhase(this.scene, 1)); - } - } - - super.end(); - }); - return; - } - break; - } - - super.end(); - } -} - -export class FaintPhase extends PokemonPhase { - private preventEndure: boolean; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, preventEndure?: boolean) { - super(scene, battlerIndex); - - this.preventEndure = preventEndure; - } - - start() { - super.start(); - - if (!this.preventEndure) { - const instantReviveModifier = this.scene.applyModifier(PokemonInstantReviveModifier, this.player, this.getPokemon()) as PokemonInstantReviveModifier; - - if (instantReviveModifier) { - if (!--instantReviveModifier.stackCount) { - this.scene.removeModifier(instantReviveModifier); - } - this.scene.updateModifiers(this.player); - return this.end(); - } - } - - if (!this.tryOverrideForBattleSpec()) { - this.doFaint(); - } - } - - doFaint(): void { - const pokemon = this.getPokemon(); - - // Track total times pokemon have been KO'd for supreme overlord/last respects - if (pokemon.isPlayer()) { - this.scene.currentBattle.playerFaints += 1; - } else { - this.scene.currentBattle.enemyFaints += 1; - } - - this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true); - - if (pokemon.turnData?.attacksReceived?.length) { - const lastAttack = pokemon.turnData.attacksReceived[0]; - applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, this.scene.getPokemonById(lastAttack.sourceId), new PokemonMove(lastAttack.move).getMove(), lastAttack.result); - } - - const alivePlayField = this.scene.getField(true); - alivePlayField.forEach(p => applyPostKnockOutAbAttrs(PostKnockOutAbAttr, p, pokemon)); - if (pokemon.turnData?.attacksReceived?.length) { - const defeatSource = this.scene.getPokemonById(pokemon.turnData.attacksReceived[0].sourceId); - if (defeatSource?.isOnField()) { - applyPostVictoryAbAttrs(PostVictoryAbAttr, defeatSource); - const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move]; - const pvattrs = pvmove.getAttrs(PostVictoryStatChangeAttr); - if (pvattrs.length) { - for (const pvattr of pvattrs) { - pvattr.applyPostVictory(defeatSource, defeatSource, pvmove); - } - } - } - } - - if (this.player) { - const nonFaintedLegalPartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()); - const nonFaintedPartyMemberCount = nonFaintedLegalPartyMembers.length; - if (!nonFaintedPartyMemberCount) { - this.scene.unshiftPhase(new GameOverPhase(this.scene)); - } else if (nonFaintedPartyMemberCount >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !nonFaintedLegalPartyMembers[0].isActive(true))) { - this.scene.pushPhase(new SwitchPhase(this.scene, this.fieldIndex, true, false)); - } - if (nonFaintedPartyMemberCount === 1 && this.scene.currentBattle.double) { - this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); - } - } else { - this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); - if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - const hasReservePartyMember = !!this.scene.getEnemyParty().filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot).length; - if (hasReservePartyMember) { - this.scene.pushPhase(new SwitchSummonPhase(this.scene, this.fieldIndex, -1, false, false, false)); - } - } - } - - if (this.scene.currentBattle.double) { - const allyPokemon = pokemon.getAlly(); - if (allyPokemon?.isActive(true)) { - let targetingMovePhase: MovePhase; - do { - targetingMovePhase = this.scene.findPhase(mp => mp instanceof MovePhase && mp.targets.length === 1 && mp.targets[0] === pokemon.getBattlerIndex() && mp.pokemon.isPlayer() !== allyPokemon.isPlayer()) as MovePhase; - if (targetingMovePhase && targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex()) { - targetingMovePhase.targets[0] = allyPokemon.getBattlerIndex(); - } - } while (targetingMovePhase); - } - } - - pokemon.lapseTags(BattlerTagLapseType.FAINT); - this.scene.getField(true).filter(p => p !== pokemon).forEach(p => p.removeTagsBySourceId(pokemon.id)); - - pokemon.faintCry(() => { - if (pokemon instanceof PlayerPokemon) { - pokemon.addFriendship(-10); - } - pokemon.hideInfo(); - this.scene.playSound("faint"); - this.scene.tweens.add({ - targets: pokemon, - duration: 500, - y: pokemon.y + 150, - ease: "Sine.easeIn", - onComplete: () => { - pokemon.setVisible(false); - pokemon.y -= 150; - pokemon.trySetStatus(StatusEffect.FAINT); - if (pokemon.isPlayer()) { - this.scene.currentBattle.removeFaintedParticipant(pokemon as PlayerPokemon); - } else { - this.scene.addFaintedEnemyScore(pokemon as EnemyPokemon); - this.scene.currentBattle.addPostBattleLoot(pokemon as EnemyPokemon); - } - this.scene.field.remove(pokemon); - this.end(); - } - }); - }); - } - - tryOverrideForBattleSpec(): boolean { - switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - if (!this.player) { - const enemy = this.getPokemon(); - if (enemy.formIndex) { - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.species.name, null, () => this.doFaint()); - } else { - // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase - enemy.hp++; - this.scene.unshiftPhase(new DamagePhase(this.scene, enemy.getBattlerIndex(), 0, HitResult.OTHER)); - this.end(); - } - return true; - } - } - - return false; - } -} - -export class VictoryPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); - } - - start() { - super.start(); - - this.scene.gameData.gameStats.pokemonDefeated++; - - const participantIds = this.scene.currentBattle.playerParticipantIds; - const party = this.scene.getParty(); - const expShareModifier = this.scene.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; - const expBalanceModifier = this.scene.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; - const multipleParticipantExpBonusModifier = this.scene.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; - const nonFaintedPartyMembers = party.filter(p => p.hp); - const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < this.scene.getMaxExpLevel()); - const partyMemberExp = []; - - if (participantIds.size) { - let expValue = this.getPokemon().getExpValue(); - if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - expValue = Math.floor(expValue * 1.5); - } - for (const partyMember of nonFaintedPartyMembers) { - const pId = partyMember.id; - const participated = participantIds.has(pId); - if (participated) { - partyMember.addFriendship(2); - } - if (!expPartyMembers.includes(partyMember)) { - continue; - } - if (!participated && !expShareModifier) { - partyMemberExp.push(0); - continue; - } - let expMultiplier = 0; - if (participated) { - expMultiplier += (1 / participantIds.size); - if (participantIds.size > 1 && multipleParticipantExpBonusModifier) { - expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; - } - } else if (expShareModifier) { - expMultiplier += (expShareModifier.getStackCount() * 0.2) / participantIds.size; - } - if (partyMember.pokerus) { - expMultiplier *= 1.5; - } - if (Overrides.XP_MULTIPLIER_OVERRIDE !== null) { - expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; - } - const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); - this.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); - partyMemberExp.push(Math.floor(pokemonExp.value)); - } - - if (expBalanceModifier) { - let totalLevel = 0; - let totalExp = 0; - expPartyMembers.forEach((expPartyMember, epm) => { - totalExp += partyMemberExp[epm]; - totalLevel += expPartyMember.level; - }); - - const medianLevel = Math.floor(totalLevel / expPartyMembers.length); - - const recipientExpPartyMemberIndexes = []; - expPartyMembers.forEach((expPartyMember, epm) => { - if (expPartyMember.level <= medianLevel) { - recipientExpPartyMemberIndexes.push(epm); - } - }); - - const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); - - expPartyMembers.forEach((_partyMember, pm) => { - partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); - }); - } - - for (let pm = 0; pm < expPartyMembers.length; pm++) { - const exp = partyMemberExp[pm]; - - if (exp) { - const partyMemberIndex = party.indexOf(expPartyMembers[pm]); - this.scene.unshiftPhase(expPartyMembers[pm].isOnField() ? new ExpPhase(this.scene, partyMemberIndex, exp) : new ShowPartyExpBarPhase(this.scene, partyMemberIndex, exp)); - } - } - } - - if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType ? !p?.isFainted(true) : p.isOnField())) { - this.scene.pushPhase(new BattleEndPhase(this.scene)); - if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - this.scene.pushPhase(new TrainerVictoryPhase(this.scene)); - } - if (this.scene.gameMode.isEndless || !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) { - this.scene.pushPhase(new EggLapsePhase(this.scene)); - if (this.scene.currentBattle.waveIndex % 10) { - this.scene.pushPhase(new SelectModifierPhase(this.scene)); - } else if (this.scene.gameMode.isDaily) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.EXP_CHARM)); - if (this.scene.currentBattle.waveIndex > 10 && !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.GOLDEN_POKEBALL)); - } - } else { - const superExpWave = !this.scene.gameMode.isEndless ? (this.scene.offsetGym ? 0 : 20) : 10; - if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex === 10) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.EXP_SHARE)); - } - if (this.scene.currentBattle.waveIndex <= 750 && (this.scene.currentBattle.waveIndex <= 500 || (this.scene.currentBattle.waveIndex % 30) === superExpWave)) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, (this.scene.currentBattle.waveIndex % 30) !== superExpWave || this.scene.currentBattle.waveIndex > 250 ? modifierTypes.EXP_CHARM : modifierTypes.SUPER_EXP_CHARM)); - } - if (this.scene.currentBattle.waveIndex <= 150 && !(this.scene.currentBattle.waveIndex % 50)) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.GOLDEN_POKEBALL)); - } - if (this.scene.gameMode.isEndless && !(this.scene.currentBattle.waveIndex % 50)) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, !(this.scene.currentBattle.waveIndex % 250) ? modifierTypes.VOUCHER_PREMIUM : modifierTypes.VOUCHER_PLUS)); - this.scene.pushPhase(new AddEnemyBuffModifierPhase(this.scene)); - } - } - this.scene.pushPhase(new NewBattlePhase(this.scene)); - } else { - this.scene.currentBattle.battleType = BattleType.CLEAR; - this.scene.score += this.scene.gameMode.getClearScoreBonus(); - this.scene.updateScoreText(); - this.scene.pushPhase(new GameOverPhase(this.scene, true)); - } - } - - this.end(); - } -} - -export class TrainerVictoryPhase extends BattlePhase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - this.scene.disableMenu = true; - - this.scene.playBgm(this.scene.currentBattle.trainer.config.victoryBgm); - - this.scene.unshiftPhase(new MoneyRewardPhase(this.scene, this.scene.currentBattle.trainer.config.moneyMultiplier)); - - const modifierRewardFuncs = this.scene.currentBattle.trainer.config.modifierRewardFuncs; - for (const modifierRewardFunc of modifierRewardFuncs) { - this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, modifierRewardFunc)); - } - - const trainerType = this.scene.currentBattle.trainer.config.trainerType; - if (vouchers.hasOwnProperty(TrainerType[trainerType])) { - if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer.config.isBoss) { - this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType])); - } - } - - this.scene.ui.showText(i18next.t("battle:trainerDefeated", { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => { - const victoryMessages = this.scene.currentBattle.trainer.getVictoryMessages(); - let message: string; - this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(victoryMessages), this.scene.currentBattle.waveIndex); - - const showMessage = () => { - const originalFunc = showMessageOrEnd; - showMessageOrEnd = () => this.scene.ui.showDialogue(message, this.scene.currentBattle.trainer.getName(), null, originalFunc); - - showMessageOrEnd(); - }; - let showMessageOrEnd = () => this.end(); - if (victoryMessages?.length) { - if (this.scene.currentBattle.trainer.config.hasCharSprite && !this.scene.ui.shouldSkipDialogue(message)) { - const originalFunc = showMessageOrEnd; - showMessageOrEnd = () => this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => originalFunc())); - this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(this.scene.currentBattle.trainer.getKey(), getCharVariantFromDialogue(victoryMessages[0])).then(() => showMessage())); - } else { - showMessage(); - } - } else { - showMessageOrEnd(); - } - }, null, true); - - this.showEnemyTrainer(); - } -} - -export class MoneyRewardPhase extends BattlePhase { - private moneyMultiplier: number; - - constructor(scene: BattleScene, moneyMultiplier: number) { - super(scene); - - this.moneyMultiplier = moneyMultiplier; - } - - start() { - const moneyAmount = new Utils.IntegerHolder(this.scene.getWaveMoneyAmount(this.moneyMultiplier)); - - this.scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - - if (this.scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { - moneyAmount.value *= 2; - } - - this.scene.addMoney(moneyAmount.value); - - const userLocale = navigator.language || "en-US"; - const formattedMoneyAmount = moneyAmount.value.toLocaleString(userLocale); - const message = i18next.t("battle:moneyWon", { moneyAmount: formattedMoneyAmount }); - - this.scene.ui.showText(message, null, () => this.end(), null, true); - } -} - -export class ModifierRewardPhase extends BattlePhase { - protected modifierType: ModifierType; - - constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc) { - super(scene); - - this.modifierType = getModifierType(modifierTypeFunc); - } - - start() { - super.start(); - - this.doReward().then(() => this.end()); - } - - doReward(): Promise { - return new Promise(resolve => { - const newModifier = this.modifierType.newModifier(); - this.scene.addModifier(newModifier).then(() => { - this.scene.playSound("item_fanfare"); - this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier.type.name }), null, () => resolve(), null, true); - }); - }); - } -} - -export class GameOverModifierRewardPhase extends ModifierRewardPhase { - constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc) { - super(scene, modifierTypeFunc); - } - - doReward(): Promise { - return new Promise(resolve => { - const newModifier = this.modifierType.newModifier(); - this.scene.addModifier(newModifier).then(() => { - this.scene.playSound("level_up_fanfare"); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier.type.name }), null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); - resolve(); - }, null, true, 1500); - }); - }); - }); - } -} - -export class RibbonModifierRewardPhase extends ModifierRewardPhase { - private species: PokemonSpecies; - - constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc, species: PokemonSpecies) { - super(scene, modifierTypeFunc); - - this.species = species; - } - - doReward(): Promise { - return new Promise(resolve => { - const newModifier = this.modifierType.newModifier(); - this.scene.addModifier(newModifier).then(() => { - this.scene.playSound("level_up_fanfare"); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(`${this.species.name} beat ${this.scene.gameMode.getName()} Mode for the first time!\nYou received ${newModifier.type.name}!`, null, () => { - resolve(); - }, null, true, 1500); - }); - }); - } -} - -export class GameOverPhase extends BattlePhase { - private victory: boolean; - private firstRibbons: PokemonSpecies[] = []; - - constructor(scene: BattleScene, victory?: boolean) { - super(scene); - - this.victory = !!victory; - } - - start() { - super.start(); - - // Failsafe if players somehow skip floor 200 in classic mode - if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) { - this.victory = true; - } - - if (this.victory && this.scene.gameMode.isEndless) { - this.scene.ui.showDialogue(i18next.t("PGMmiscDialogue:ending_endless"), i18next.t("PGMmiscDialogue:ending_name"), 0, () => this.handleGameOver()); - } else if (this.victory || !this.scene.enableRetries) { - this.handleGameOver(); - } else { - this.scene.ui.showText("Would you like to retry from the start of the battle?", null, () => { - this.scene.ui.setMode(Mode.CONFIRM, () => { - this.scene.ui.fadeOut(1250).then(() => { - this.scene.reset(); - this.scene.clearPhaseQueue(); - this.scene.gameData.loadSession(this.scene, this.scene.sessionSlotId).then(() => { - this.scene.pushPhase(new EncounterPhase(this.scene, true)); - - const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()).length; - - this.scene.pushPhase(new SummonPhase(this.scene, 0)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) { - this.scene.pushPhase(new SummonPhase(this.scene, 1)); - } - if (this.scene.currentBattle.waveIndex > 1 && this.scene.currentBattle.battleType !== BattleType.TRAINER) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); - } - } - - this.scene.ui.fadeIn(1250); - this.end(); - }); - }); - }, () => this.handleGameOver(), false, 0, 0, 1000); - }); - } - } - - handleGameOver(): void { - const doGameOver = (newClear: boolean) => { - this.scene.disableMenu = true; - this.scene.time.delayedCall(1000, () => { - let firstClear = false; - if (this.victory && newClear) { - if (this.scene.gameMode.isClassic) { - firstClear = this.scene.validateAchv(achvs.CLASSIC_VICTORY); - this.scene.gameData.gameStats.sessionsWon++; - for (const pokemon of this.scene.getParty()) { - this.awardRibbon(pokemon); - - if (pokemon.species.getRootSpeciesId() !== pokemon.species.getRootSpeciesId(true)) { - this.awardRibbon(pokemon, true); - } - } - } else if (this.scene.gameMode.isDaily && newClear) { - this.scene.gameData.gameStats.dailyRunSessionsWon++; - } - } - const fadeDuration = this.victory ? 10000 : 5000; - this.scene.fadeOutBgm(fadeDuration, true); - const activeBattlers = this.scene.getField().filter(p => p?.isActive(true)); - activeBattlers.map(p => p.hideInfo()); - this.scene.ui.fadeOut(fadeDuration).then(() => { - activeBattlers.map(a => a.setVisible(false)); - this.scene.setFieldScale(1, true); - this.scene.clearPhaseQueue(); - this.scene.ui.clearText(); - - if (this.victory && this.scene.gameMode.isChallenge) { - this.scene.gameMode.challenges.forEach(c => this.scene.validateAchvs(ChallengeAchv, c)); - } - - const clear = (endCardPhase?: EndCardPhase) => { - if (newClear) { - this.handleUnlocks(); - } - if (this.victory && newClear) { - for (const species of this.firstRibbons) { - this.scene.unshiftPhase(new RibbonModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PLUS, species)); - } - if (!firstClear) { - this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); - } - } - this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase)); - this.end(); - }; - - if (this.victory && this.scene.gameMode.isClassic) { - const message = miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1]; - - if (!this.scene.ui.shouldSkipDialogue(message)) { - 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, () => { - this.scene.ui.fadeOut(500).then(() => { - this.scene.charSprite.hide().then(() => { - const endCardPhase = new EndCardPhase(this.scene); - this.scene.unshiftPhase(endCardPhase); - clear(endCardPhase); - }); - }); - }); - }); - }); - } else { - const endCardPhase = new EndCardPhase(this.scene); - this.scene.unshiftPhase(endCardPhase); - clear(endCardPhase); - } - } else { - clear(); - } - }); - }); - }; - - /* Added a local check to see if the game is running offline on victory - If Online, execute apiFetch as intended - If Offline, execute offlineNewClear(), a localStorage implementation of newClear daily run checks */ - if (this.victory) { - if (!Utils.isLocal) { - Utils.apiFetch(`savedata/session/newclear?slot=${this.scene.sessionSlotId}&clientSessionId=${clientSessionId}`, true) - .then(response => response.json()) - .then(newClear => doGameOver(newClear)); - } else { - this.scene.gameData.offlineNewClear(this.scene).then(result => { - doGameOver(result); - }); - } - } else { - doGameOver(false); - } - } - - handleUnlocks(): void { - if (this.victory && this.scene.gameMode.isClassic) { - if (!this.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]) { - this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.ENDLESS_MODE)); - } - if (this.scene.getParty().filter(p => p.fusionSpecies).length && !this.scene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE]) { - this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.SPLICED_ENDLESS_MODE)); - } - if (!this.scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) { - this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.MINI_BLACK_HOLE)); - } - } - } - - awardRibbon(pokemon: Pokemon, forStarter: boolean = false): void { - const speciesId = getPokemonSpecies(pokemon.species.speciesId); - const speciesRibbonCount = this.scene.gameData.incrementRibbonCount(speciesId, forStarter); - // first time classic win, award voucher - if (speciesRibbonCount === 1) { - this.firstRibbons.push(getPokemonSpecies(pokemon.species.getRootSpeciesId(forStarter))); - } - } -} - -export class EndCardPhase extends Phase { - public endCard: Phaser.GameObjects.Image; - public text: Phaser.GameObjects.Text; - - constructor(scene: BattleScene) { - super(scene); - } - - start(): void { - super.start(); - - this.scene.ui.getMessageHandler().bg.setVisible(false); - this.scene.ui.getMessageHandler().nameBoxContainer.setVisible(false); - - this.endCard = this.scene.add.image(0, 0, `end_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}`); - this.endCard.setOrigin(0); - this.endCard.setScale(0.5); - this.scene.field.add(this.endCard); - - this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, "Congratulations!", TextStyle.SUMMARY, { fontSize: "128px" }); - this.text.setOrigin(0.5); - this.scene.field.add(this.text); - - this.scene.ui.clearText(); - - this.scene.ui.fadeIn(1000).then(() => { - - this.scene.ui.showText("", null, () => { - this.scene.ui.getMessageHandler().bg.setVisible(true); - this.end(); - }, null, true); - }); - } -} - -export class UnlockPhase extends Phase { - private unlockable: Unlockables; - - constructor(scene: BattleScene, unlockable: Unlockables) { - super(scene); - - this.unlockable = unlockable; - } - - start(): void { - this.scene.time.delayedCall(2000, () => { - this.scene.gameData.unlocks[this.unlockable] = true; - this.scene.playSound("level_up_fanfare"); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(`${getUnlockableName(this.unlockable)}\nhas been unlocked.`, null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); - this.end(); - }, null, true, 1500); - }); - } -} - -export class PostGameOverPhase extends Phase { - private endCardPhase: EndCardPhase; - - constructor(scene: BattleScene, endCardPhase: EndCardPhase) { - super(scene); - - this.endCardPhase = endCardPhase; - } - - start() { - super.start(); - - const saveAndReset = () => { - this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { - if (!success) { - return this.scene.reset(true); - } - this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { - if (!success[0]) { - return this.scene.reset(true); - } - this.scene.reset(); - this.scene.unshiftPhase(new TitlePhase(this.scene)); - this.end(); - }); - }); - }; - - if (this.endCardPhase) { - this.scene.ui.fadeOut(500).then(() => { - this.scene.ui.getMessageHandler().bg.setVisible(true); - - this.endCardPhase.endCard.destroy(); - this.endCardPhase.text.destroy(); - saveAndReset(); - }); - } else { - saveAndReset(); - } - } -} - -export class SwitchPhase extends BattlePhase { - protected fieldIndex: integer; - private isModal: boolean; - private doReturn: boolean; - - constructor(scene: BattleScene, fieldIndex: integer, isModal: boolean, doReturn: boolean) { - super(scene); - - this.fieldIndex = fieldIndex; - this.isModal = isModal; - this.doReturn = doReturn; - } - - start() { - super.start(); - - // Skip modal switch if impossible - if (this.isModal && !this.scene.getParty().filter(p => p.isAllowedInBattle() && !p.isActive(true)).length) { - return super.end(); - } - - // Check if there is any space still in field - if (this.isModal && this.scene.getPlayerField().filter(p => p.isAllowedInBattle() && p.isActive(true)).length >= this.scene.currentBattle.getBattlerCount()) { - return super.end(); - } - - // Override field index to 0 in case of double battle where 2/3 remaining legal party members fainted at once - const fieldIndex = this.scene.currentBattle.getBattlerCount() === 1 || this.scene.getParty().filter(p => p.isAllowedInBattle()).length > 1 ? this.fieldIndex : 0; - - this.scene.ui.setMode(Mode.PARTY, this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, fieldIndex, (slotIndex: integer, option: PartyOption) => { - if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, fieldIndex, slotIndex, this.doReturn, option === PartyOption.PASS_BATON)); - } - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - }, PartyUiHandler.FilterNonFainted); - } -} - -export class ExpPhase extends PlayerPartyMemberPokemonPhase { - private expValue: number; - - constructor(scene: BattleScene, partyMemberIndex: integer, expValue: number) { - super(scene, partyMemberIndex); - - this.expValue = expValue; - } - - start() { - super.start(); - - const pokemon = this.getPokemon(); - const exp = new Utils.NumberHolder(this.expValue); - this.scene.applyModifiers(ExpBoosterModifier, true, exp); - exp.value = Math.floor(exp.value); - this.scene.ui.showText(i18next.t("battle:expGain", { pokemonName: pokemon.name, exp: exp.value }), null, () => { - const lastLevel = pokemon.level; - pokemon.addExp(exp.value); - const newLevel = pokemon.level; - if (newLevel > lastLevel) { - this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, lastLevel, newLevel)); - } - pokemon.updateInfo().then(() => this.end()); - }, null, true); - } -} - -export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase { - private expValue: number; - - constructor(scene: BattleScene, partyMemberIndex: integer, expValue: number) { - super(scene, partyMemberIndex); - - this.expValue = expValue; - } - - start() { - super.start(); - - const pokemon = this.getPokemon(); - const exp = new Utils.NumberHolder(this.expValue); - this.scene.applyModifiers(ExpBoosterModifier, true, exp); - exp.value = Math.floor(exp.value); - - const lastLevel = pokemon.level; - pokemon.addExp(exp.value); - const newLevel = pokemon.level; - if (newLevel > lastLevel) { - this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, lastLevel, newLevel)); - } - this.scene.unshiftPhase(new HidePartyExpBarPhase(this.scene)); - pokemon.updateInfo(); - - if (this.scene.expParty === ExpNotification.SKIP) { - this.end(); - } else if (this.scene.expParty === ExpNotification.ONLY_LEVEL_UP) { - if (newLevel > lastLevel) { // this means if we level up - // instead of displaying the exp gain in the small frame, we display the new level - // we use the same method for mode 0 & 1, by giving a parameter saying to display the exp or the level - this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, this.scene.expParty === ExpNotification.ONLY_LEVEL_UP, newLevel).then(() => { - setTimeout(() => this.end(), 800 / Math.pow(2, this.scene.expGainsSpeed)); - }); - } else { - this.end(); - } - } else if (this.scene.expGainsSpeed < 3) { - this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, false, newLevel).then(() => { - setTimeout(() => this.end(), 500 / Math.pow(2, this.scene.expGainsSpeed)); - }); - } else { - this.end(); - } - - } -} - -export class HidePartyExpBarPhase extends BattlePhase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - this.scene.partyExpBar.hide().then(() => this.end()); - } -} - -export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { - private lastLevel: integer; - private level: integer; - - constructor(scene: BattleScene, partyMemberIndex: integer, lastLevel: integer, level: integer) { - super(scene, partyMemberIndex); - - this.lastLevel = lastLevel; - this.level = level; - this.scene = scene; - } - - start() { - super.start(); - - if (this.level > this.scene.gameData.gameStats.highestLevel) { - this.scene.gameData.gameStats.highestLevel = this.level; - } - - this.scene.validateAchvs(LevelAchv, new Utils.IntegerHolder(this.level)); - - const pokemon = this.getPokemon(); - const prevStats = pokemon.stats.slice(0); - pokemon.calculateStats(); - pokemon.updateInfo(); - if (this.scene.expParty === ExpNotification.DEFAULT) { - this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:levelUp", { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true); - } else if (this.scene.expParty === ExpNotification.SKIP) { - this.end(); - } else { - // we still want to display the stats if activated - this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()); - } - if (this.level <= 100) { - const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1); - for (const lm of levelMoves) { - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, lm[1])); - } - } - if (!pokemon.pauseEvolutions) { - const evolution = pokemon.getEvolution(); - if (evolution) { - this.scene.unshiftPhase(new EvolutionPhase(this.scene, pokemon as PlayerPokemon, evolution, this.lastLevel)); - } - } - } -} - -export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { - private moveId: Moves; - - constructor(scene: BattleScene, partyMemberIndex: integer, moveId: Moves) { - super(scene, partyMemberIndex); - - this.moveId = moveId; - } - - start() { - super.start(); - - const pokemon = this.getPokemon(); - const move = allMoves[this.moveId]; - - const existingMoveIndex = pokemon.getMoveset().findIndex(m => m?.moveId === move.id); - - if (existingMoveIndex > -1) { - return this.end(); - } - - const emptyMoveIndex = pokemon.getMoveset().length < 4 - ? pokemon.getMoveset().length - : pokemon.getMoveset().findIndex(m => m === null); - - const messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler - ? Mode.EVOLUTION_SCENE - : Mode.MESSAGE; - - if (emptyMoveIndex > -1) { - pokemon.setMove(emptyMoveIndex, this.moveId); - initMoveAnim(this.scene, this.moveId).then(() => { - loadMoveAnimAssets(this.scene, [this.moveId], true) - .then(() => { - this.scene.ui.setMode(messageMode).then(() => { - this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:learnMove", { pokemonName: pokemon.name, moveName: move.name }), null, () => { - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); - this.end(); - }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); - }); - }); - }); - } else { - this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: pokemon.name, moveName: move.name }), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: pokemon.name }), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }), null, () => { - const noHandler = () => { - this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), null, () => { - this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { - this.scene.ui.setMode(messageMode); - this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true); - }, () => { - this.scene.ui.setMode(messageMode); - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); - this.end(); - }); - }); - }); - }; - this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { - this.scene.ui.setMode(messageMode); - this.scene.ui.showText(i18next.t("battle:learnMoveForgetQuestion"), null, () => { - this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => { - if (moveIndex === 4) { - noHandler(); - return; - } - this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveAnd"), null, () => { - pokemon.setMove(moveIndex, Moves.NONE); - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); - this.end(); - }, null, true); - }, null, true); - }, null, true); - }); - }); - }, null, true); - }, noHandler); - }); - }, null, true); - }, null, true); - }); - } - } -} - -export class PokemonHealPhase extends CommonAnimPhase { - private hpHealed: integer; - private message: string; - private showFullHpMessage: boolean; - private skipAnim: boolean; - private revive: boolean; - private healStatus: boolean; - private preventFullHeal: boolean; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, hpHealed: integer, message: string, showFullHpMessage: boolean, skipAnim: boolean = false, revive: boolean = false, healStatus: boolean = false, preventFullHeal: boolean = false) { - super(scene, battlerIndex, undefined, CommonAnim.HEALTH_UP); - - this.hpHealed = hpHealed; - this.message = message; - this.showFullHpMessage = showFullHpMessage; - this.skipAnim = skipAnim; - this.revive = revive; - this.healStatus = healStatus; - this.preventFullHeal = preventFullHeal; - } - - start() { - if (!this.skipAnim && (this.revive || this.getPokemon().hp) && this.getPokemon().getHpRatio() < 1) { - super.start(); - } else { - this.end(); - } - } - - end() { - const pokemon = this.getPokemon(); - - if (!pokemon.isOnField() || (!this.revive && !pokemon.isActive())) { - super.end(); - return; - } - - const fullHp = pokemon.getHpRatio() >= 1; - - const hasMessage = !!this.message; - const healOrDamage = (!fullHp || this.hpHealed < 0); - let lastStatusEffect = StatusEffect.NONE; - - if (healOrDamage) { - const hpRestoreMultiplier = new Utils.IntegerHolder(1); - if (!this.revive) { - this.scene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); - } - const healAmount = new Utils.NumberHolder(Math.floor(this.hpHealed * hpRestoreMultiplier.value)); - if (healAmount.value < 0) { - pokemon.damageAndUpdate(healAmount.value * -1, HitResult.HEAL as DamageResult); - healAmount.value = 0; - } - // Prevent healing to full if specified (in case of healing tokens so Sturdy doesn't cause a softlock) - if (this.preventFullHeal && pokemon.hp + healAmount.value >= pokemon.getMaxHp()) { - healAmount.value = (pokemon.getMaxHp() - pokemon.hp) - 1; - } - healAmount.value = pokemon.heal(healAmount.value); - if (healAmount.value) { - this.scene.damageNumberHandler.add(pokemon, healAmount.value, HitResult.HEAL); - } - if (pokemon.isPlayer()) { - this.scene.validateAchvs(HealAchv, healAmount); - if (healAmount.value > this.scene.gameData.gameStats.highestHeal) { - this.scene.gameData.gameStats.highestHeal = healAmount.value; - } - } - if (this.healStatus && !this.revive && pokemon.status) { - lastStatusEffect = pokemon.status.effect; - pokemon.resetStatus(); - } - pokemon.updateInfo().then(() => super.end()); - } else if (this.healStatus && !this.revive && pokemon.status) { - lastStatusEffect = pokemon.status.effect; - pokemon.resetStatus(); - pokemon.updateInfo().then(() => super.end()); - } else if (this.showFullHpMessage) { - this.message = i18next.t("battle:hpIsFull", { pokemonName: getPokemonNameWithAffix(pokemon) }); - } - - if (this.message) { - this.scene.queueMessage(this.message); - } - - if (this.healStatus && lastStatusEffect && !hasMessage) { - this.scene.queueMessage(getStatusEffectHealText(lastStatusEffect, getPokemonNameWithAffix(pokemon))); - } - - if (!healOrDamage && !lastStatusEffect) { - super.end(); - } - } -} - -export class AttemptCapturePhase extends PokemonPhase { - private pokeballType: PokeballType; - private pokeball: Phaser.GameObjects.Sprite; - private originalY: number; - - constructor(scene: BattleScene, targetIndex: integer, pokeballType: PokeballType) { - super(scene, BattlerIndex.ENEMY + targetIndex); - - this.pokeballType = pokeballType; - } - - start() { - super.start(); - - const pokemon = this.getPokemon() as EnemyPokemon; - - if (!pokemon?.hp) { - return this.end(); - } - - this.scene.pokeballCounts[this.pokeballType]--; - - this.originalY = pokemon.y; - - const _3m = 3 * pokemon.getMaxHp(); - const _2h = 2 * pokemon.hp; - const catchRate = pokemon.species.catchRate; - const pokeballMultiplier = getPokeballCatchMultiplier(this.pokeballType); - const statusMultiplier = pokemon.status ? getStatusEffectCatchRateMultiplier(pokemon.status.effect) : 1; - const x = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier); - const y = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x))); - const fpOffset = pokemon.getFieldPositionOffset(); - - const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); - this.pokeball = this.scene.addFieldSprite(16, 80, "pb", pokeballAtlasKey); - this.pokeball.setOrigin(0.5, 0.625); - this.scene.field.add(this.pokeball); - - this.scene.playSound("pb_throw"); - this.scene.time.delayedCall(300, () => { - this.scene.field.moveBelow(this.pokeball as Phaser.GameObjects.GameObject, pokemon); - }); - - this.scene.tweens.add({ - targets: this.pokeball, - x: { value: 236 + fpOffset[0], ease: "Linear" }, - y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" }, - duration: 500, - onComplete: () => { - this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - this.scene.playSound("pb_rel"); - pokemon.tint(getPokeballTintColor(this.pokeballType)); - - addPokeballOpenParticles(this.scene, this.pokeball.x, this.pokeball.y, this.pokeballType); - - this.scene.tweens.add({ - targets: pokemon, - duration: 500, - ease: "Sine.easeIn", - scale: 0.25, - y: 20, - onComplete: () => { - this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - pokemon.setVisible(false); - this.scene.playSound("pb_catch"); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}`)); - - const doShake = () => { - let shakeCount = 0; - const pbX = this.pokeball.x; - const shakeCounter = this.scene.tweens.addCounter({ - from: 0, - to: 1, - repeat: 4, - yoyo: true, - ease: "Cubic.easeOut", - duration: 250, - repeatDelay: 500, - onUpdate: t => { - if (shakeCount && shakeCount < 4) { - const value = t.getValue(); - const directionMultiplier = shakeCount % 2 === 1 ? 1 : -1; - this.pokeball.setX(pbX + value * 4 * directionMultiplier); - this.pokeball.setAngle(value * 27.5 * directionMultiplier); - } - }, - onRepeat: () => { - if (!pokemon.species.isObtainable()) { - shakeCounter.stop(); - this.failCatch(shakeCount); - } else if (shakeCount++ < 3) { - if (pokeballMultiplier === -1 || pokemon.randSeedInt(65536) < y) { - this.scene.playSound("pb_move"); - } else { - shakeCounter.stop(); - this.failCatch(shakeCount); - } - } else { - this.scene.playSound("pb_lock"); - addPokeballCaptureStars(this.scene, this.pokeball); - - const pbTint = this.scene.add.sprite(this.pokeball.x, this.pokeball.y, "pb", "pb"); - pbTint.setOrigin(this.pokeball.originX, this.pokeball.originY); - pbTint.setTintFill(0); - pbTint.setAlpha(0); - this.scene.field.add(pbTint); - this.scene.tweens.add({ - targets: pbTint, - alpha: 0.375, - duration: 200, - easing: "Sine.easeOut", - onComplete: () => { - this.scene.tweens.add({ - targets: pbTint, - alpha: 0, - duration: 200, - easing: "Sine.easeIn", - onComplete: () => pbTint.destroy() - }); - } - }); - } - }, - onComplete: () => this.catch() - }); - }; - - this.scene.time.delayedCall(250, () => doPokeballBounceAnim(this.scene, this.pokeball, 16, 72, 350, doShake)); - } - }); - } - }); - } - - failCatch(shakeCount: integer) { - const pokemon = this.getPokemon(); - - this.scene.playSound("pb_rel"); - pokemon.setY(this.originalY); - if (pokemon.status?.effect !== StatusEffect.SLEEP) { - pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); - } - pokemon.tint(getPokeballTintColor(this.pokeballType)); - pokemon.setVisible(true); - pokemon.untint(250, "Sine.easeOut"); - - const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); - this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - - this.scene.tweens.add({ - targets: pokemon, - duration: 250, - ease: "Sine.easeOut", - scale: 1 - }); - - this.scene.currentBattle.lastUsedPokeball = this.pokeballType; - this.removePb(); - this.end(); - } - - catch() { - const pokemon = this.getPokemon() as EnemyPokemon; - this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); - - const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { - this.scene.validateAchv(achvs.HIDDEN_ABILITY); - } - - if (pokemon.species.subLegendary) { - this.scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); - } - - if (pokemon.species.legendary) { - this.scene.validateAchv(achvs.CATCH_LEGENDARY); - } - - if (pokemon.species.mythical) { - this.scene.validateAchv(achvs.CATCH_MYTHICAL); - } - - this.scene.pokemonInfoContainer.show(pokemon, true); - - this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - - this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { - const end = () => { - this.scene.pokemonInfoContainer.hide(); - this.removePb(); - this.end(); - }; - const removePokemon = () => { - this.scene.addFaintedEnemyScore(pokemon); - this.scene.getPlayerField().filter(p => p.isActive(true)).forEach(playerPokemon => playerPokemon.removeTagsBySourceId(pokemon.id)); - pokemon.hp = 0; - pokemon.trySetStatus(StatusEffect.FAINT); - this.scene.clearEnemyHeldItemModifiers(); - this.scene.field.remove(pokemon, true); - }; - const addToParty = () => { - const newPokemon = pokemon.addToParty(this.pokeballType); - const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); - if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { - this.scene.validateAchv(achvs.SHINY_PARTY); - } - Promise.all(modifiers.map(m => this.scene.addModifier(m, true))).then(() => { - this.scene.updateModifiers(true); - removePokemon(); - if (newPokemon) { - newPokemon.loadAssets().then(end); - } else { - end(); - } - }); - }; - Promise.all([pokemon.hideInfo(), this.scene.gameData.setPokemonCaught(pokemon)]).then(() => { - if (this.scene.getParty().length === 6) { - const promptRelease = () => { - this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.name }), null, () => { - this.scene.pokemonInfoContainer.makeRoomForConfirmUi(); - this.scene.ui.setMode(Mode.CONFIRM, () => { - this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => { - this.scene.ui.setMode(Mode.MESSAGE).then(() => { - if (slotIndex < 6) { - addToParty(); - } else { - promptRelease(); - } - }); - }); - }, () => { - this.scene.ui.setMode(Mode.MESSAGE).then(() => { - removePokemon(); - end(); - }); - }); - }); - }; - promptRelease(); - } else { - addToParty(); - } - }); - }, 0, true); - } - - removePb() { - this.scene.tweens.add({ - targets: this.pokeball, - duration: 250, - delay: 250, - ease: "Sine.easeIn", - alpha: 0, - onComplete: () => this.pokeball.destroy() - }); - } -} - -export class AttemptRunPhase extends PokemonPhase { - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene, fieldIndex); - } - - start() { - super.start(); - - const playerPokemon = this.getPokemon(); - const enemyField = this.scene.getEnemyField(); - - const enemySpeed = enemyField.reduce((total: integer, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), 0) / enemyField.length; - - const escapeChance = new Utils.IntegerHolder((((playerPokemon.getStat(Stat.SPD) * 128) / enemySpeed) + (30 * this.scene.currentBattle.escapeAttempts++)) % 256); - applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, escapeChance); - - if (playerPokemon.randSeedInt(256) < escapeChance.value) { - this.scene.playSound("flee"); - this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); - - this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, enemyField].flat(), - alpha: 0, - duration: 250, - ease: "Sine.easeIn", - onComplete: () => enemyField.forEach(enemyPokemon => enemyPokemon.destroy()) - }); - - this.scene.clearEnemyHeldItemModifiers(); - - enemyField.forEach(enemyPokemon => { - enemyPokemon.hideInfo().then(() => enemyPokemon.destroy()); - enemyPokemon.hp = 0; - enemyPokemon.trySetStatus(StatusEffect.FAINT); - }); - - this.scene.pushPhase(new BattleEndPhase(this.scene)); - this.scene.pushPhase(new NewBattlePhase(this.scene)); - } else { - this.scene.queueMessage(i18next.t("battle:runAwayCannotEscape"), null, true, 500); - } - - this.end(); - } -} - -export class SelectModifierPhase extends BattlePhase { - private rerollCount: integer; - private modifierTiers: ModifierTier[]; - - constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[]) { - super(scene); - - this.rerollCount = rerollCount; - this.modifierTiers = modifierTiers; - } - - start() { - super.start(); - - if (!this.rerollCount) { - this.updateSeed(); - } else { - this.scene.reroll = false; - } - - const party = this.scene.getParty(); - regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); - const modifierCount = new Utils.IntegerHolder(3); - if (this.isPlayer()) { - this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); - } - const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value); - - const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { - if (rowCursor < 0 || cursor < 0) { - this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { - this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { - this.scene.ui.revertMode(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - }, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers))); - }); - return false; - } - let modifierType: ModifierType; - let cost: integer; - switch (rowCursor) { - case 0: - switch (cursor) { - case 0: - const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers); - if (this.scene.money < rerollCost) { - this.scene.ui.playError(); - return false; - } else { - this.scene.reroll = true; - this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier))); - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - this.scene.money -= rerollCost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - this.scene.playSound("buy"); - } - break; - case 1: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { - if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { - const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; - const itemModifier = itemModifiers[itemIndex]; - this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, PartyUiHandler.FilterItemMaxStacks); - break; - case 2: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - }); - break; - case 3: - this.scene.lockModifierTiers = !this.scene.lockModifierTiers; - const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - uiHandler.updateLockRaritiesText(); - uiHandler.updateRerollCostText(); - return false; - } - return true; - case 1: - modifierType = typeOptions[cursor].type; - break; - default: - const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); - const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; - modifierType = shopOption.type; - cost = shopOption.cost; - break; - } - - if (cost && this.scene.money < cost) { - this.scene.ui.playError(); - return false; - } - - const applyModifier = (modifier: Modifier, playSound: boolean = false) => { - const result = this.scene.addModifier(modifier, false, playSound); - if (cost) { - result.then(success => { - if (success) { - this.scene.money -= cost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - this.scene.playSound("buy"); - (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); - } else { - this.scene.ui.playError(); - } - }); - } else { - const doEnd = () => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - }; - if (result instanceof Promise) { - result.then(() => doEnd()); - } else { - doEnd(); - } - } - }; - - if (modifierType instanceof PokemonModifierType) { - if (modifierType instanceof FusePokemonModifierType) { - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => { - if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex]); - applyModifier(modifier, true); - }); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, modifierType.selectFilter); - } else { - const pokemonModifierType = modifierType as PokemonModifierType; - const isMoveModifier = modifierType instanceof PokemonMoveModifierType; - const isTmModifier = modifierType instanceof TmModifierType; - const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; - const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); - const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER - : isTmModifier ? PartyUiMode.TM_MODIFIER - : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER - : PartyUiMode.MODIFIER; - const tmMoveId = isTmModifier - ? (modifierType as TmModifierType).moveId - : undefined; - this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => { - if (slotIndex < 6) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = !isMoveModifier - ? !isRememberMoveModifier - ? modifierType.newModifier(party[slotIndex]) - : modifierType.newModifier(party[slotIndex], option as integer) - : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); - applyModifier(modifier, true); - }); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); - } - } else { - applyModifier(modifierType.newModifier()); - } - - return !cost; - }; - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - - updateSeed(): void { - this.scene.resetSeed(); - } - - isPlayer(): boolean { - return true; - } - - getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer { - let baseValue = 0; - if (lockRarities) { - const tierValues = [50, 125, 300, 750, 2000]; - for (const opt of typeOptions) { - baseValue += tierValues[opt.type.tier]; - } - } else { - baseValue = 250; - } - return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount), Number.MAX_SAFE_INTEGER); - } - - getPoolType(): ModifierPoolType { - return ModifierPoolType.PLAYER; - } - - getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] { - return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined); - } - - addModifier(modifier: Modifier): Promise { - return this.scene.addModifier(modifier, false, true); - } -} - -export class EggLapsePhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - const eggsToHatch: Egg[] = this.scene.gameData.eggs.filter((egg: Egg) => { - return Overrides.EGG_IMMEDIATE_HATCH_OVERRIDE ? true : --egg.hatchWaves < 1; - }); - - let eggCount: integer = eggsToHatch.length; - - 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--; - } - } - - } - this.end(); - } -} - -export class AddEnemyBuffModifierPhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - const waveIndex = this.scene.currentBattle.waveIndex; - const tier = !(waveIndex % 1000) ? ModifierTier.ULTRA : !(waveIndex % 250) ? ModifierTier.GREAT : ModifierTier.COMMON; - - regenerateModifierPoolThresholds(this.scene.getEnemyParty(), ModifierPoolType.ENEMY_BUFF); - - const count = Math.ceil(waveIndex / 250); - for (let i = 0; i < count; i++) { - this.scene.addEnemyModifier(getEnemyBuffModifierForWave(tier, this.scene.findModifiers(m => m instanceof EnemyPersistentModifier, false), this.scene), true, true); - } - this.scene.updateModifiers(false, true).then(() => this.end()); - } -} - -/** - * Cures the party of all non-volatile status conditions, shows a message - * @param {BattleScene} scene The current scene - * @param {Pokemon} user The user of the move that cures the party - * @param {string} message The message that should be displayed - * @param {Abilities} abilityCondition Pokemon with this ability will not be affected ie. Soundproof - */ -export class PartyStatusCurePhase extends BattlePhase { - private user: Pokemon; - private message: string; - private abilityCondition: Abilities; - - constructor(scene: BattleScene, user: Pokemon, message: string, abilityCondition: Abilities) { - super(scene); - - this.user = user; - this.message = message; - this.abilityCondition = abilityCondition; - } - - start() { - super.start(); - for (const pokemon of this.scene.getParty()) { - if (!pokemon.isOnField() || pokemon === this.user) { - pokemon.resetStatus(false); - pokemon.updateInfo(true); - } else { - if (!pokemon.hasAbility(this.abilityCondition)) { - pokemon.resetStatus(); - pokemon.updateInfo(true); - } else { - // Manually show ability bar, since we're not hooked into the targeting system - pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, pokemon.getPassiveAbility()?.id === this.abilityCondition)); - } - } - } - if (this.message) { - this.scene.queueMessage(this.message); - } - this.end(); - } -} - -export class PartyHealPhase extends BattlePhase { - private resumeBgm: boolean; - - constructor(scene: BattleScene, resumeBgm: boolean) { - super(scene); - - this.resumeBgm = resumeBgm; - } - - start() { - super.start(); - - const bgmPlaying = this.scene.isBgmPlaying(); - if (bgmPlaying) { - this.scene.fadeOutBgm(1000, false); - } - this.scene.ui.fadeOut(1000).then(() => { - for (const pokemon of this.scene.getParty()) { - pokemon.hp = pokemon.getMaxHp(); - pokemon.resetStatus(); - for (const move of pokemon.moveset) { - move.ppUsed = 0; - } - pokemon.updateInfo(true); - } - const healSong = this.scene.playSoundWithoutBgm("heal"); - this.scene.time.delayedCall(Utils.fixedInt(healSong.totalDuration * 1000), () => { - healSong.destroy(); - if (this.resumeBgm && bgmPlaying) { - this.scene.playBgm(); - } - this.scene.ui.fadeIn(500).then(() => this.end()); - }); - }); - } -} - -export class ShinySparklePhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); - } - - start() { - super.start(); - - this.getPokemon().sparkle(); - this.scene.time.delayedCall(1000, () => this.end()); - } -} - -export class ScanIvsPhase extends PokemonPhase { - private shownIvs: integer; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, shownIvs: integer) { - super(scene, battlerIndex); - - this.shownIvs = shownIvs; - } - - start() { - super.start(); - - if (!this.shownIvs) { - return this.end(); - } - - const pokemon = this.getPokemon(); - - this.scene.ui.showText(i18next.t("battle:ivScannerUseQuestion", { pokemonName: pokemon.name }), null, () => { - this.scene.ui.setMode(Mode.CONFIRM, () => { - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.clearText(); - new CommonBattleAnim(CommonAnim.LOCK_ON, pokemon, pokemon).play(this.scene, () => { - this.scene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs, this.shownIvs).then(() => this.end()); - }); - }, () => { - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.clearText(); - this.end(); - }); - }); - } -} - -export class TrainerMessageTestPhase extends BattlePhase { - private trainerTypes: TrainerType[]; - - constructor(scene: BattleScene, ...trainerTypes: TrainerType[]) { - super(scene); - - this.trainerTypes = trainerTypes; - } - - start() { - super.start(); - - const testMessages: string[] = []; - - for (const t of Object.keys(trainerConfigs)) { - const type = parseInt(t); - if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === type as TrainerType)) { - continue; - } - const config = trainerConfigs[type]; - [config.encounterMessages, config.femaleEncounterMessages, config.victoryMessages, config.femaleVictoryMessages, config.defeatMessages, config.femaleDefeatMessages] - .map(messages => { - if (messages?.length) { - testMessages.push(...messages); - } - }); - } - - for (const message of testMessages) { - this.scene.pushPhase(new TestMessagePhase(this.scene, message)); - } - - this.end(); - } -} - -export class TestMessagePhase extends MessagePhase { - constructor(scene: BattleScene, message: string) { - super(scene, message, null, true); - } -} diff --git a/src/phases/add-enemy-buff-modifier-phase.ts b/src/phases/add-enemy-buff-modifier-phase.ts new file mode 100644 index 00000000000..451e6e2662c --- /dev/null +++ b/src/phases/add-enemy-buff-modifier-phase.ts @@ -0,0 +1,26 @@ +import BattleScene from "#app/battle-scene"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { regenerateModifierPoolThresholds, ModifierPoolType, getEnemyBuffModifierForWave } from "#app/modifier/modifier-type"; +import { EnemyPersistentModifier } from "#app/modifier/modifier"; +import { Phase } from "#app/phase"; + +export class AddEnemyBuffModifierPhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + const waveIndex = this.scene.currentBattle.waveIndex; + const tier = !(waveIndex % 1000) ? ModifierTier.ULTRA : !(waveIndex % 250) ? ModifierTier.GREAT : ModifierTier.COMMON; + + regenerateModifierPoolThresholds(this.scene.getEnemyParty(), ModifierPoolType.ENEMY_BUFF); + + const count = Math.ceil(waveIndex / 250); + for (let i = 0; i < count; i++) { + this.scene.addEnemyModifier(getEnemyBuffModifierForWave(tier, this.scene.findModifiers(m => m instanceof EnemyPersistentModifier, false), this.scene), true, true); + } + this.scene.updateModifiers(false, true).then(() => this.end()); + } +} diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts new file mode 100644 index 00000000000..55a82affaf6 --- /dev/null +++ b/src/phases/attempt-capture-phase.ts @@ -0,0 +1,288 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim } from "#app/data/pokeball"; +import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; +import { PokeballType } from "#app/enums/pokeball"; +import { StatusEffect } from "#app/enums/status-effect"; +import { addPokeballOpenParticles, addPokeballCaptureStars } from "#app/field/anims"; +import { EnemyPokemon } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { achvs } from "#app/system/achv"; +import { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; +import { SummaryUiMode } from "#app/ui/summary-ui-handler"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { PokemonPhase } from "./pokemon-phase"; +import { VictoryPhase } from "./victory-phase"; + +export class AttemptCapturePhase extends PokemonPhase { + private pokeballType: PokeballType; + private pokeball: Phaser.GameObjects.Sprite; + private originalY: number; + + constructor(scene: BattleScene, targetIndex: integer, pokeballType: PokeballType) { + super(scene, BattlerIndex.ENEMY + targetIndex); + + this.pokeballType = pokeballType; + } + + start() { + super.start(); + + const pokemon = this.getPokemon() as EnemyPokemon; + + if (!pokemon?.hp) { + return this.end(); + } + + this.scene.pokeballCounts[this.pokeballType]--; + + this.originalY = pokemon.y; + + const _3m = 3 * pokemon.getMaxHp(); + const _2h = 2 * pokemon.hp; + const catchRate = pokemon.species.catchRate; + const pokeballMultiplier = getPokeballCatchMultiplier(this.pokeballType); + const statusMultiplier = pokemon.status ? getStatusEffectCatchRateMultiplier(pokemon.status.effect) : 1; + const x = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier); + const y = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x))); + const fpOffset = pokemon.getFieldPositionOffset(); + + const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); + this.pokeball = this.scene.addFieldSprite(16, 80, "pb", pokeballAtlasKey); + this.pokeball.setOrigin(0.5, 0.625); + this.scene.field.add(this.pokeball); + + this.scene.playSound("se/pb_throw"); + this.scene.time.delayedCall(300, () => { + this.scene.field.moveBelow(this.pokeball as Phaser.GameObjects.GameObject, pokemon); + }); + + this.scene.tweens.add({ + targets: this.pokeball, + x: { value: 236 + fpOffset[0], ease: "Linear" }, + y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" }, + duration: 500, + onComplete: () => { + this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + this.scene.playSound("se/pb_rel"); + pokemon.tint(getPokeballTintColor(this.pokeballType)); + + addPokeballOpenParticles(this.scene, this.pokeball.x, this.pokeball.y, this.pokeballType); + + this.scene.tweens.add({ + targets: pokemon, + duration: 500, + ease: "Sine.easeIn", + scale: 0.25, + y: 20, + onComplete: () => { + this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + pokemon.setVisible(false); + this.scene.playSound("se/pb_catch"); + this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}`)); + + const doShake = () => { + let shakeCount = 0; + const pbX = this.pokeball.x; + const shakeCounter = this.scene.tweens.addCounter({ + from: 0, + to: 1, + repeat: 4, + yoyo: true, + ease: "Cubic.easeOut", + duration: 250, + repeatDelay: 500, + onUpdate: t => { + if (shakeCount && shakeCount < 4) { + const value = t.getValue(); + const directionMultiplier = shakeCount % 2 === 1 ? 1 : -1; + this.pokeball.setX(pbX + value * 4 * directionMultiplier); + this.pokeball.setAngle(value * 27.5 * directionMultiplier); + } + }, + onRepeat: () => { + if (!pokemon.species.isObtainable()) { + shakeCounter.stop(); + this.failCatch(shakeCount); + } else if (shakeCount++ < 3) { + if (pokeballMultiplier === -1 || pokemon.randSeedInt(65536) < y) { + this.scene.playSound("se/pb_move"); + } else { + shakeCounter.stop(); + this.failCatch(shakeCount); + } + } else { + this.scene.playSound("se/pb_lock"); + addPokeballCaptureStars(this.scene, this.pokeball); + + const pbTint = this.scene.add.sprite(this.pokeball.x, this.pokeball.y, "pb", "pb"); + pbTint.setOrigin(this.pokeball.originX, this.pokeball.originY); + pbTint.setTintFill(0); + pbTint.setAlpha(0); + this.scene.field.add(pbTint); + this.scene.tweens.add({ + targets: pbTint, + alpha: 0.375, + duration: 200, + easing: "Sine.easeOut", + onComplete: () => { + this.scene.tweens.add({ + targets: pbTint, + alpha: 0, + duration: 200, + easing: "Sine.easeIn", + onComplete: () => pbTint.destroy() + }); + } + }); + } + }, + onComplete: () => { + this.catch(); + } + }); + }; + + this.scene.time.delayedCall(250, () => doPokeballBounceAnim(this.scene, this.pokeball, 16, 72, 350, doShake)); + } + }); + } + }); + } + + failCatch(shakeCount: integer) { + const pokemon = this.getPokemon(); + + this.scene.playSound("se/pb_rel"); + pokemon.setY(this.originalY); + if (pokemon.status?.effect !== StatusEffect.SLEEP) { + pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); + } + pokemon.tint(getPokeballTintColor(this.pokeballType)); + pokemon.setVisible(true); + pokemon.untint(250, "Sine.easeOut"); + + const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); + this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + + this.scene.tweens.add({ + targets: pokemon, + duration: 250, + ease: "Sine.easeOut", + scale: 1 + }); + + this.scene.currentBattle.lastUsedPokeball = this.pokeballType; + this.removePb(); + this.end(); + } + + catch() { + const pokemon = this.getPokemon() as EnemyPokemon; + + const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); + + if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { + this.scene.validateAchv(achvs.HIDDEN_ABILITY); + } + + if (pokemon.species.subLegendary) { + this.scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + } + + if (pokemon.species.legendary) { + this.scene.validateAchv(achvs.CATCH_LEGENDARY); + } + + if (pokemon.species.mythical) { + this.scene.validateAchv(achvs.CATCH_MYTHICAL); + } + + this.scene.pokemonInfoContainer.show(pokemon, true); + + this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); + + this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { + const end = () => { + this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); + this.scene.pokemonInfoContainer.hide(); + this.removePb(); + this.end(); + }; + const removePokemon = () => { + this.scene.addFaintedEnemyScore(pokemon); + this.scene.getPlayerField().filter(p => p.isActive(true)).forEach(playerPokemon => playerPokemon.removeTagsBySourceId(pokemon.id)); + pokemon.hp = 0; + pokemon.trySetStatus(StatusEffect.FAINT); + this.scene.clearEnemyHeldItemModifiers(); + this.scene.field.remove(pokemon, true); + }; + const addToParty = () => { + const newPokemon = pokemon.addToParty(this.pokeballType); + const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); + if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { + this.scene.validateAchv(achvs.SHINY_PARTY); + } + Promise.all(modifiers.map(m => this.scene.addModifier(m, true))).then(() => { + this.scene.updateModifiers(true); + removePokemon(); + if (newPokemon) { + newPokemon.loadAssets().then(end); + } else { + end(); + } + }); + }; + Promise.all([pokemon.hideInfo(), this.scene.gameData.setPokemonCaught(pokemon)]).then(() => { + if (this.scene.getParty().length === 6) { + const promptRelease = () => { + this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.getNameToRender() }), null, () => { + this.scene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); + this.scene.ui.setMode(Mode.CONFIRM, () => { + const newPokemon = this.scene.addPlayerPokemon(pokemon.species, pokemon.level, pokemon.abilityIndex, pokemon.formIndex, pokemon.gender, pokemon.shiny, pokemon.variant, pokemon.ivs, pokemon.nature, pokemon); + this.scene.ui.setMode(Mode.SUMMARY, newPokemon, 0, SummaryUiMode.DEFAULT, () => { + this.scene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, false); + }, () => { + this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => { + this.scene.ui.setMode(Mode.MESSAGE).then(() => { + if (slotIndex < 6) { + addToParty(); + } else { + promptRelease(); + } + }); + }); + }, () => { + this.scene.ui.setMode(Mode.MESSAGE).then(() => { + removePokemon(); + end(); + }); + }, "fullParty"); + }); + }; + promptRelease(); + } else { + addToParty(); + } + }); + }, 0, true); + } + + removePb() { + this.scene.tweens.add({ + targets: this.pokeball, + duration: 250, + delay: 250, + ease: "Sine.easeIn", + alpha: 0, + onComplete: () => this.pokeball.destroy() + }); + } +} diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts new file mode 100644 index 00000000000..46d68f6005a --- /dev/null +++ b/src/phases/attempt-run-phase.ts @@ -0,0 +1,103 @@ +import BattleScene from "#app/battle-scene"; +import { applyAbAttrs, RunSuccessAbAttr } from "#app/data/ability"; +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import Pokemon, { PlayerPokemon, EnemyPokemon } from "#app/field/pokemon"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattleEndPhase } from "./battle-end-phase"; +import { NewBattlePhase } from "./new-battle-phase"; +import { PokemonPhase } from "./pokemon-phase"; + +export class AttemptRunPhase extends PokemonPhase { + constructor(scene: BattleScene, fieldIndex: number) { + super(scene, fieldIndex); + } + + start() { + super.start(); + + const playerField = this.scene.getPlayerField(); + const enemyField = this.scene.getEnemyField(); + + const playerPokemon = this.getPokemon(); + + const escapeChance = new Utils.NumberHolder(0); + + this.attemptRunAway(playerField, enemyField, escapeChance); + + applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance); + + if (playerPokemon.randSeedInt(100) < escapeChance.value) { + this.scene.playSound("se/flee"); + this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); + + this.scene.tweens.add({ + targets: [this.scene.arenaEnemy, enemyField].flat(), + alpha: 0, + duration: 250, + ease: "Sine.easeIn", + onComplete: () => enemyField.forEach(enemyPokemon => enemyPokemon.destroy()) + }); + + this.scene.clearEnemyHeldItemModifiers(); + + enemyField.forEach(enemyPokemon => { + enemyPokemon.hideInfo().then(() => enemyPokemon.destroy()); + enemyPokemon.hp = 0; + enemyPokemon.trySetStatus(StatusEffect.FAINT); + }); + + this.scene.pushPhase(new BattleEndPhase(this.scene)); + this.scene.pushPhase(new NewBattlePhase(this.scene)); + } else { + this.scene.queueMessage(i18next.t("battle:runAwayCannotEscape"), null, true, 500); + } + + this.end(); + } + + attemptRunAway(playerField: PlayerPokemon[], enemyField: EnemyPokemon[], escapeChance: Utils.NumberHolder) { + /** Sum of the speed of all enemy pokemon on the field */ + const enemySpeed = enemyField.reduce((total: number, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), 0); + /** Sum of the speed of all player pokemon on the field */ + const playerSpeed = playerField.reduce((total: number, playerPokemon: Pokemon) => total + playerPokemon.getStat(Stat.SPD), 0); + + /* The way the escape chance works is by looking at the difference between your speed and the enemy field's average speed as a ratio. The higher this ratio, the higher your chance of success. + * However, there is a cap for the ratio of your speed vs enemy speed which beyond that point, you won't gain any advantage. It also looks at how many times you've tried to escape. + * Again, the more times you've tried to escape, the higher your odds of escaping. Bosses and non-bosses are calculated differently - bosses are harder to escape from vs non-bosses + * Finally, there's a minimum and maximum escape chance as well so that escapes aren't guaranteed, yet they are never 0 either. + * The percentage chance to escape from a pokemon for both bosses and non bosses is linear and based on the minimum and maximum chances, and the speed ratio cap. + * + * At the time of writing, these conditions should be met: + * - The minimum escape chance should be 5% for bosses and non bosses + * - Bosses should have a maximum escape chance of 25%, whereas non-bosses should be 95% + * - The bonus per previous escape attempt should be 2% for bosses and 10% for non-bosses + * - The speed ratio cap should be 6x for bosses and 4x for non-bosses + * - The "default" escape chance when your speed equals the enemy speed should be 8.33% for bosses and 27.5% for non-bosses + * + * From the above, we can calculate the below values + */ + + let isBoss = false; + for (let e = 0; e < enemyField.length; e++) { + isBoss = isBoss || enemyField[e].isBoss(); // this line checks if any of the enemy pokemon on the field are bosses; if so, the calculation for escaping is different + } + + /** The ratio between the speed of your active pokemon and the speed of the enemy field */ + const speedRatio = playerSpeed / enemySpeed; + /** The max ratio before escape chance stops increasing. Increased if there is a boss on the field */ + const speedCap = isBoss ? 6 : 4; + /** Minimum percent chance to escape */ + const minChance = 5; + /** Maximum percent chance to escape. Decreased if a boss is on the field */ + const maxChance = isBoss ? 25 : 95; + /** How much each escape attempt increases the chance of the next attempt. Decreased if a boss is on the field */ + const escapeBonus = isBoss ? 2 : 10; + /** Slope of the escape chance curve */ + const escapeSlope = (maxChance - minChance) / speedCap; + + // This will calculate the escape chance given all of the above and clamp it to the range of [`minChance`, `maxChance`] + escapeChance.value = Phaser.Math.Clamp(Math.round((escapeSlope * speedRatio) + minChance + (escapeBonus * this.scene.currentBattle.escapeAttempts++)), minChance, maxChance); + } +} diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts new file mode 100644 index 00000000000..f08e04b443a --- /dev/null +++ b/src/phases/battle-end-phase.ts @@ -0,0 +1,49 @@ +import { applyPostBattleAbAttrs, PostBattleAbAttr } from "#app/data/ability"; +import { LapsingPersistentModifier, LapsingPokemonHeldItemModifier } from "#app/modifier/modifier"; +import { BattlePhase } from "./battle-phase"; +import { GameOverPhase } from "./game-over-phase"; + +export class BattleEndPhase extends BattlePhase { + start() { + super.start(); + + this.scene.currentBattle.addBattleScore(this.scene); + + this.scene.gameData.gameStats.battles++; + if (this.scene.currentBattle.trainer) { + this.scene.gameData.gameStats.trainersDefeated++; + } + if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) { + this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1; + } + + // Endless graceful end + if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex >= 5850) { + this.scene.clearPhaseQueue(); + this.scene.unshiftPhase(new GameOverPhase(this.scene, true)); + } + + for (const pokemon of this.scene.getParty().filter(p => p.isAllowedInBattle())) { + applyPostBattleAbAttrs(PostBattleAbAttr, pokemon); + } + + if (this.scene.currentBattle.moneyScattered) { + this.scene.currentBattle.pickUpScatteredMoney(this.scene); + } + + this.scene.clearEnemyHeldItemModifiers(); + + const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; + for (const m of lapsingModifiers) { + const args: any[] = []; + if (m instanceof LapsingPokemonHeldItemModifier) { + args.push(this.scene.getPokemonById(m.pokemonId)); + } + if (!m.lapse(args)) { + this.scene.removeModifier(m); + } + } + + this.scene.updateModifiers().then(() => this.end()); + } +} diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts new file mode 100644 index 00000000000..b51e19bdf0e --- /dev/null +++ b/src/phases/battle-phase.ts @@ -0,0 +1,47 @@ +import BattleScene from "#app/battle-scene"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { Phase } from "#app/phase"; + +export class BattlePhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + showEnemyTrainer(trainerSlot: TrainerSlot = TrainerSlot.NONE): void { + const sprites = this.scene.currentBattle.trainer?.getSprites()!; // TODO: is this bang correct? + const tintSprites = this.scene.currentBattle.trainer?.getTintSprites()!; // TODO: is this bang correct? + for (let i = 0; i < sprites.length; i++) { + const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2; + [sprites[i], tintSprites[i]].map(sprite => { + if (visible) { + sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16; + } + sprite.setVisible(visible); + sprite.clearTint(); + }); + sprites[i].setVisible(visible); + tintSprites[i].setVisible(visible); + sprites[i].clearTint(); + tintSprites[i].clearTint(); + } + this.scene.tweens.add({ + targets: this.scene.currentBattle.trainer, + x: "-=16", + y: "+=16", + alpha: 1, + ease: "Sine.easeInOut", + duration: 750 + }); + } + + hideEnemyTrainer(): void { + this.scene.tweens.add({ + targets: this.scene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750 + }); + } +} diff --git a/src/phases/berry-phase.ts b/src/phases/berry-phase.ts new file mode 100644 index 00000000000..66ecaa6c7f8 --- /dev/null +++ b/src/phases/berry-phase.ts @@ -0,0 +1,52 @@ +import { applyAbAttrs, PreventBerryUseAbAttr, HealFromBerryUseAbAttr } from "#app/data/ability"; +import { CommonAnim } from "#app/data/battle-anims"; +import { BerryUsedEvent } from "#app/events/battle-scene"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { BerryModifier } from "#app/modifier/modifier"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { FieldPhase } from "./field-phase"; +import { CommonAnimPhase } from "./common-anim-phase"; + +/** The phase after attacks where the pokemon eat berries */ +export class BerryPhase extends FieldPhase { + start() { + super.start(); + + this.executeForAll((pokemon) => { + const hasUsableBerry = !!this.scene.findModifier((m) => { + return m instanceof BerryModifier && m.shouldApply([pokemon]); + }, pokemon.isPlayer()); + + if (hasUsableBerry) { + const cancelled = new Utils.BooleanHolder(false); + pokemon.getOpponents().map((opp) => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled)); + + if (cancelled.value) { + pokemon.scene.queueMessage(i18next.t("abilityTriggers:preventBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } else { + this.scene.unshiftPhase( + new CommonAnimPhase(this.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.USE_ITEM) + ); + + for (const berryModifier of this.scene.applyModifiers(BerryModifier, pokemon.isPlayer(), pokemon) as BerryModifier[]) { + if (berryModifier.consumed) { + if (!--berryModifier.stackCount) { + this.scene.removeModifier(berryModifier); + } else { + berryModifier.consumed = false; + } + } + this.scene.eventTarget.dispatchEvent(new BerryUsedEvent(berryModifier)); // Announce a berry was used + } + + this.scene.updateModifiers(pokemon.isPlayer()); + + applyAbAttrs(HealFromBerryUseAbAttr, pokemon, new Utils.BooleanHolder(false)); + } + } + }); + + this.end(); + } +} diff --git a/src/phases/check-switch-phase.ts b/src/phases/check-switch-phase.ts new file mode 100644 index 00000000000..a069ba224a2 --- /dev/null +++ b/src/phases/check-switch-phase.ts @@ -0,0 +1,61 @@ +import BattleScene from "#app/battle-scene"; +import { BattleStyle } from "#app/enums/battle-style"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { BattlePhase } from "./battle-phase"; +import { PostSummonPhase } from "./post-summon-phase"; +import { SummonMissingPhase } from "./summon-missing-phase"; +import { SwitchPhase } from "./switch-phase"; + +export class CheckSwitchPhase extends BattlePhase { + protected fieldIndex: integer; + protected useName: boolean; + + constructor(scene: BattleScene, fieldIndex: integer, useName: boolean) { + super(scene); + + this.fieldIndex = fieldIndex; + this.useName = useName; + } + + start() { + super.start(); + + const pokemon = this.scene.getPlayerField()[this.fieldIndex]; + + if (this.scene.battleStyle === BattleStyle.SET) { + super.end(); + return; + } + + if (this.scene.field.getAll().indexOf(pokemon) === -1) { + this.scene.unshiftPhase(new SummonMissingPhase(this.scene, this.fieldIndex)); + super.end(); + return; + } + + if (!this.scene.getParty().slice(1).filter(p => p.isActive()).length) { + super.end(); + return; + } + + if (pokemon.getTag(BattlerTagType.FRENZY)) { + super.end(); + return; + } + + this.scene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? getPokemonNameWithAffix(pokemon) : i18next.t("battle:pokemon") }), null, () => { + this.scene.ui.setMode(Mode.CONFIRM, () => { + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); + this.scene.unshiftPhase(new SwitchPhase(this.scene, this.fieldIndex, false, true)); + this.end(); + }, () => { + this.scene.ui.setMode(Mode.MESSAGE); + this.end(); + }); + }); + } +} diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts new file mode 100644 index 00000000000..47d212aa598 --- /dev/null +++ b/src/phases/command-phase.ts @@ -0,0 +1,283 @@ +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 { FieldPhase } from "./field-phase"; +import { SelectTargetPhase } from "./select-target-phase"; + +export class CommandPhase extends FieldPhase { + protected fieldIndex: integer; + + constructor(scene: BattleScene, fieldIndex: integer) { + super(scene); + + this.fieldIndex = fieldIndex; + } + + start() { + super.start(); + + if (this.fieldIndex) { + // If we somehow are attempting to check the right pokemon but there's only one pokemon out + // Switch back to the center pokemon. This can happen rarely in double battles with mid turn switching + if (this.scene.getPlayerField().filter(p => p.isActive()).length === 1) { + this.fieldIndex = FieldPosition.CENTER; + } else { + const allyCommand = this.scene.currentBattle.turnCommands[this.fieldIndex - 1]; + if (allyCommand?.command === Command.BALL || allyCommand?.command === Command.RUN) { + this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: allyCommand?.command, skip: true }; + } + } + } + + if (this.scene.currentBattle.turnCommands[this.fieldIndex]?.skip) { + return this.end(); + } + + const playerPokemon = this.scene.getPlayerField()[this.fieldIndex]; + + const moveQueue = playerPokemon.getMoveQueue(); + + while (moveQueue.length && moveQueue[0] + && moveQueue[0].move && (!playerPokemon.getMoveset().find(m => m?.moveId === moveQueue[0].move) + || !playerPokemon.getMoveset()[playerPokemon.getMoveset().findIndex(m => m?.moveId === moveQueue[0].move)]!.isUsable(playerPokemon, moveQueue[0].ignorePP))) { // TODO: is the bang correct? + moveQueue.shift(); + } + + if (moveQueue.length) { + const queuedMove = moveQueue[0]; + if (!queuedMove.move) { + this.handleCommand(Command.FIGHT, -1, false); + } else { + const moveIndex = playerPokemon.getMoveset().findIndex(m => m?.moveId === queuedMove.move); + if (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex]!.isUsable(playerPokemon, queuedMove.ignorePP)) { // TODO: is the bang correct? + this.handleCommand(Command.FIGHT, moveIndex, queuedMove.ignorePP, { targets: queuedMove.targets, multiple: queuedMove.targets.length > 1 }); + } else { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } + } + } else { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } + } + + handleCommand(command: Command, cursor: integer, ...args: any[]): boolean { + const playerPokemon = this.scene.getPlayerField()[this.fieldIndex]; + let success: boolean; + + switch (command) { + case Command.FIGHT: + let useStruggle = false; + if (cursor === -1 || + playerPokemon.trySelectMove(cursor, args[0] as boolean) || + (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m?.isUsable(playerPokemon)).length)) { + const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor]!.moveId : Moves.NONE : Moves.STRUGGLE; // TODO: is the bang correct? + const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; + const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2]; + if (!moveId) { + turnCommand.targets = [this.fieldIndex]; + } + console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); + if (moveTargets.targets.length > 1 && moveTargets.multiple) { + this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); + } + if (moveTargets.targets.length <= 1 || moveTargets.multiple) { + turnCommand.move!.targets = moveTargets.targets; //TODO: is the bang correct here? + } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { + turnCommand.move!.targets = playerPokemon.getMoveQueue()[0].targets; //TODO: is the bang correct here? + } else { + this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); + } + this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; + success = true; + } else if (cursor < playerPokemon.getMoveset().length) { + const move = playerPokemon.getMoveset()[cursor]!; //TODO: is this bang correct? + this.scene.ui.setMode(Mode.MESSAGE); + + // Decides between a Disabled, Not Implemented, or No PP translation message + const errorMessage = + playerPokemon.isMoveRestricted(move.moveId) + ? playerPokemon.getRestrictingTag(move.moveId)!.selectionDeniedText(playerPokemon, move.moveId) + : move.getName().endsWith(" (N)") ? "battle:moveNotImplemented" : "battle:moveNoPP"; + const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator + + this.scene.ui.showText(i18next.t(errorMessage, { moveName: moveName }), null, () => { + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); + }, null, true); + } + break; + case Command.BALL: + const notInDex = (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1); + if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || this.scene.gameMode.isFreshStartChallenge() || notInDex )) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballTrainer"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else { + const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); + if (targets.length > 1) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballMulti"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else if (cursor < 5) { + const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true)); + if (targetPokemon?.isBoss() && targetPokemon?.bossSegmentIndex >= 1 && !targetPokemon?.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballStrong"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else { + this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor }; + this.scene.currentBattle.turnCommands[this.fieldIndex]!.targets = targets; + if (this.fieldIndex) { + this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; + } + success = true; + } + } + } + break; + case Command.POKEMON: + case Command.RUN: + const isSwitch = command === Command.POKEMON; + if (!isSwitch && this.scene.arena.biomeType === Biome.END) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noEscapeForce"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else { + const batonPass = isSwitch && args[0] as boolean; + const trappedAbMessages: string[] = []; + if (batonPass || !playerPokemon.isTrapped(trappedAbMessages)) { + this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch + ? { command: Command.POKEMON, cursor: cursor, args: args } + : { command: Command.RUN }; + success = true; + if (!isSwitch && this.fieldIndex) { + this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; + } + } else if (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); + } + this.scene.ui.showText( + i18next.t("battle:noEscapePokemon", { + pokemonName: trapTag.sourceId && this.scene.getPokemonById(trapTag.sourceId) ? getPokemonNameWithAffix(this.scene.getPokemonById(trapTag.sourceId)!) : "", + moveName: trapTag.getMoveName(), + escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee") + }), + null, + () => { + this.scene.ui.showText("", 0); + if (!isSwitch) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } + }, null, true); + } + } + break; + } + + if (success!) { // TODO: is the bang correct? + this.end(); + } + + return success!; // TODO: is the bang correct? + } + + cancel() { + if (this.fieldIndex) { + this.scene.unshiftPhase(new CommandPhase(this.scene, 0)); + this.scene.unshiftPhase(new CommandPhase(this.scene, 1)); + this.end(); + } + } + + checkFightOverride(): boolean { + const pokemon = this.getPokemon(); + + const encoreTag = pokemon.getTag(EncoreTag) as EncoreTag; + + if (!encoreTag) { + return false; + } + + const moveIndex = pokemon.getMoveset().findIndex(m => m?.moveId === encoreTag.moveId); + + if (moveIndex === -1 || !pokemon.getMoveset()[moveIndex]!.isUsable(pokemon)) { // TODO: is this bang correct? + return false; + } + + this.handleCommand(Command.FIGHT, moveIndex, false); + + return true; + } + + getFieldIndex(): integer { + return this.fieldIndex; + } + + getPokemon(): PlayerPokemon { + return this.scene.getPlayerField()[this.fieldIndex]; + } + + end() { + this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + } +} diff --git a/src/phases/common-anim-phase.ts b/src/phases/common-anim-phase.ts new file mode 100644 index 00000000000..a85cd7629d9 --- /dev/null +++ b/src/phases/common-anim-phase.ts @@ -0,0 +1,26 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; +import { PokemonPhase } from "./pokemon-phase"; + +export class CommonAnimPhase extends PokemonPhase { + private anim: CommonAnim | null; + private targetIndex: integer | undefined; + + constructor(scene: BattleScene, battlerIndex?: BattlerIndex, targetIndex?: BattlerIndex | undefined, anim?: CommonAnim) { + super(scene, battlerIndex); + + this.anim = anim!; // TODO: is this bang correct? + this.targetIndex = targetIndex; + } + + setAnimation(anim: CommonAnim) { + this.anim = anim; + } + + start() { + new CommonBattleAnim(this.anim, this.getPokemon(), this.targetIndex !== undefined ? (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField())[this.targetIndex] : this.getPokemon()).play(this.scene, () => { + this.end(); + }); + } +} diff --git a/src/phases/damage-phase.ts b/src/phases/damage-phase.ts new file mode 100644 index 00000000000..5add0345358 --- /dev/null +++ b/src/phases/damage-phase.ts @@ -0,0 +1,84 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { BattleSpec } from "#app/enums/battle-spec"; +import { DamageResult, HitResult } from "#app/field/pokemon"; +import * as Utils from "#app/utils"; +import { PokemonPhase } from "./pokemon-phase"; + +export class DamagePhase extends PokemonPhase { + private amount: integer; + private damageResult: DamageResult; + private critical: boolean; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, amount: integer, damageResult?: DamageResult, critical: boolean = false) { + super(scene, battlerIndex); + + this.amount = amount; + this.damageResult = damageResult || HitResult.EFFECTIVE; + this.critical = critical; + } + + start() { + super.start(); + + if (this.damageResult === HitResult.ONE_HIT_KO) { + if (this.scene.moveAnimations) { + this.scene.toggleInvert(true); + } + this.scene.time.delayedCall(Utils.fixedInt(1000), () => { + this.scene.toggleInvert(false); + this.applyDamage(); + }); + return; + } + + this.applyDamage(); + } + + updateAmount(amount: integer): void { + this.amount = amount; + } + + applyDamage() { + switch (this.damageResult) { + case HitResult.EFFECTIVE: + this.scene.playSound("se/hit"); + break; + case HitResult.SUPER_EFFECTIVE: + case HitResult.ONE_HIT_KO: + this.scene.playSound("se/hit_strong"); + break; + case HitResult.NOT_VERY_EFFECTIVE: + this.scene.playSound("se/hit_weak"); + break; + } + + if (this.amount) { + this.scene.damageNumberHandler.add(this.getPokemon(), this.amount, this.damageResult, this.critical); + } + + if (this.damageResult !== HitResult.OTHER) { + const flashTimer = this.scene.time.addEvent({ + delay: 100, + repeat: 5, + startAt: 200, + callback: () => { + this.getPokemon().getSprite().setVisible(flashTimer.repeatCount % 2 === 0); + if (!flashTimer.repeatCount) { + this.getPokemon().updateInfo().then(() => this.end()); + } + } + }); + } else { + this.getPokemon().updateInfo().then(() => this.end()); + } + } + + override end() { + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + this.scene.initFinalBossPhaseTwo(this.getPokemon()); + } else { + super.end(); + } + } +} diff --git a/src/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts similarity index 88% rename from src/egg-hatch-phase.ts rename to src/phases/egg-hatch-phase.ts index 44b72fb3d05..4b03aa62f02 100644 --- a/src/egg-hatch-phase.ts +++ b/src/phases/egg-hatch-phase.ts @@ -1,16 +1,20 @@ -import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +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 { Phase } from "./phase"; -import BattleScene, { AnySound } from "./battle-scene"; -import * as Utils from "./utils"; -import { Mode } from "./ui/ui"; -import { EGG_SEED, Egg } from "./data/egg"; -import EggHatchSceneHandler from "./ui/egg-hatch-scene-handler"; -import { PlayerPokemon } from "./field/pokemon"; -import { achvs } from "./system/achv"; -import PokemonInfoContainer from "./ui/pokemon-info-container"; -import EggCounterContainer from "./ui/egg-counter-container"; -import { EggCountChangedEvent } from "./events/egg"; +import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +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 @@ -18,6 +22,8 @@ import { EggCountChangedEvent } from "./events/egg"; 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; } @@ -83,7 +90,7 @@ export class EggHatchPhase extends Phase { this.scene.gameData.eggs.splice(eggIndex, 1); - this.scene.fadeOutBgm(null, false); + this.scene.fadeOutBgm(undefined, false); this.eggHatchHandler = this.scene.ui.getHandler() as EggHatchSceneHandler; @@ -178,7 +185,7 @@ export class EggHatchPhase extends Phase { if (this.hatched) { return; } - this.scene.playSound("egg_crack"); + this.scene.playSound("se/egg_crack"); this.doSpray(4); this.eggCrackSprite.setFrame("3"); this.scene.time.delayedCall(125, () => this.eggCrackSprite.setFrame("4")); @@ -220,7 +227,7 @@ export class EggHatchPhase extends Phase { if (count === undefined) { count = 0; } - this.scene.playSound("pb_move"); + this.scene.playSound("se/pb_move"); this.scene.tweens.add({ targets: this.eggContainer, x: `-=${intensity / (count ? 1 : 2)}`, @@ -233,8 +240,8 @@ export class EggHatchPhase extends Phase { ease: "Sine.easeInOut", duration: 250, onComplete: () => { - count++; - if (count < repeatCount) { + count!++; + if (count! < repeatCount!) { // we know they are defined return this.doEggShake(intensity, repeatCount, count).then(() => resolve()); } this.scene.tweens.add({ @@ -281,7 +288,7 @@ export class EggHatchPhase extends Phase { SoundFade.fadeOut(this.scene, this.evolutionBgm, Utils.fixedInt(100)); } for (let e = 0; e < 5; e++) { - this.scene.time.delayedCall(Utils.fixedInt(375 * e), () => this.scene.playSound("egg_hatch", { volume: 1 - (e * 0.2) })); + this.scene.time.delayedCall(Utils.fixedInt(375 * e), () => this.scene.playSound("se/egg_hatch", { volume: 1 - (e * 0.2) })); } this.eggLightraysOverlay.setVisible(true); this.eggLightraysOverlay.play("egg_lightrays"); @@ -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); @@ -334,7 +342,7 @@ export class EggHatchPhase extends Phase { if (isShiny) { this.scene.time.delayedCall(Utils.fixedInt(500), () => { this.pokemonShinySparkle.play(`sparkle${this.pokemon.variant ? `_${this.pokemon.variant + 1}` : ""}`); - this.scene.playSound("sparkle"); + this.scene.playSound("se/sparkle"); }); } this.scene.time.delayedCall(Utils.fixedInt(!this.skipped ? !isShiny ? 1250 : 1750 : !isShiny ? 250 : 750), () => { @@ -342,16 +350,16 @@ export class EggHatchPhase extends Phase { this.scene.playSoundWithoutBgm("evolution_fanfare"); - this.scene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.name }), null, () => { + 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.ui.showText(null, 0); + 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 new file mode 100644 index 00000000000..1adb1568166 --- /dev/null +++ b/src/phases/egg-lapse-phase.ts @@ -0,0 +1,138 @@ +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); + } + + start() { + super.start(); + + 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= []; + + if (eggsToHatchCount > 0) { + + 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 new file mode 100644 index 00000000000..3f37095569a --- /dev/null +++ b/src/phases/encounter-phase.ts @@ -0,0 +1,390 @@ +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"; +import { CheckSwitchPhase } from "./check-switch-phase"; +import { GameOverPhase } from "./game-over-phase"; +import { PostSummonPhase } from "./post-summon-phase"; +import { ReturnPhase } from "./return-phase"; +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; + + constructor(scene: BattleScene, loaded?: boolean) { + super(scene); + + this.loaded = !!loaded; + } + + start() { + super.start(); + + this.scene.updateGameInfo(); + + this.scene.initSession(); + + this.scene.eventTarget.dispatchEvent(new EncounterPhaseEvent()); + + // Failsafe if players somehow skip floor 200 in classic mode + if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) { + this.scene.unshiftPhase(new GameOverPhase(this.scene)); + } + + const loadEnemyAssets: Promise[] = []; + + const battle = this.scene.currentBattle; + + let totalBst = 0; + + battle.enemyLevels?.forEach((level, e) => { + if (!this.loaded) { + if (battle.battleType === BattleType.TRAINER) { + battle.enemyParty[e] = battle.trainer?.genPartyMember(e)!; // TODO:: is the bang correct here? + } else { + const enemySpecies = this.scene.randomSpecies(battle.waveIndex, level, true); + battle.enemyParty[e] = this.scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, !!this.scene.getEncounterBossSegments(battle.waveIndex, level, enemySpecies)); + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + battle.enemyParty[e].ivs = new Array(6).fill(31); + } + this.scene.getParty().slice(0, !battle.double ? 1 : 2).reverse().forEach(playerPokemon => { + applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, false, battle.enemyParty[e]); + }); + } + } + const enemyPokemon = this.scene.getEnemyParty()[e]; + if (e < (battle.double ? 2 : 1)) { + enemyPokemon.setX(-66 + enemyPokemon.getFieldPositionOffset()[0]); + enemyPokemon.resetSummonData(); + } + + if (!this.loaded) { + this.scene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER); + } + + if (enemyPokemon.species.speciesId === Species.ETERNATUS) { + if (this.scene.gameMode.isClassic && (battle.battleSpec === BattleSpec.FINAL_BOSS || this.scene.gameMode.isWaveFinal(battle.waveIndex))) { + if (battle.battleSpec !== BattleSpec.FINAL_BOSS) { + enemyPokemon.formIndex = 1; + enemyPokemon.updateScale(); + } + enemyPokemon.setBoss(); + } else if (!(battle.waveIndex % 1000)) { + enemyPokemon.formIndex = 1; + enemyPokemon.updateScale(); + const bossMBH = this.scene.findModifier(m => m instanceof TurnHeldItemTransferModifier && m.pokemonId === enemyPokemon.id, false) as TurnHeldItemTransferModifier; + this.scene.removeModifier(bossMBH!); + bossMBH?.setTransferrableFalse(); + this.scene.addEnemyModifier(bossMBH!); + } + } + + totalBst += enemyPokemon.getSpeciesForm().baseTotal; + + loadEnemyAssets.push(enemyPokemon.loadAssets()); + + console.log(getPokemonNameWithAffix(enemyPokemon), enemyPokemon.species.speciesId, enemyPokemon.stats); + }); + + if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { + this.scene.validateAchv(achvs.SHINY_PARTY); + } + + if (battle.battleType === BattleType.TRAINER) { + loadEnemyAssets.push(battle.trainer?.loadAssets().then(() => battle.trainer?.initSprite())!); // TODO: is this bang correct? + } else { + 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 update the number of segments + if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) { + enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst))); + enemyPokemon.initBattleInfo(); + } + } + } + } + + Promise.all(loadEnemyAssets).then(() => { + battle.enemyParty.forEach((enemyPokemon, e) => { + if (e < (battle.double ? 2 : 1)) { + if (battle.battleType === BattleType.WILD) { + this.scene.field.add(enemyPokemon); + battle.seenEnemyPartyMemberIds.add(enemyPokemon.id); + const playerPokemon = this.scene.getPlayerPokemon(); + if (playerPokemon?.visible) { + this.scene.field.moveBelow(enemyPokemon as Pokemon, playerPokemon); + } + enemyPokemon.tint(0, 0.5); + } else if (battle.battleType === BattleType.TRAINER) { + enemyPokemon.setVisible(false); + this.scene.currentBattle.trainer?.tint(0, 0.5); + } + if (battle.double) { + enemyPokemon.setFieldPosition(e ? FieldPosition.RIGHT : FieldPosition.LEFT); + } + } + }); + + if (!this.loaded) { + regenerateModifierPoolThresholds(this.scene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); + this.scene.generateEnemyModifiers(); + } + + this.scene.ui.setMode(Mode.MESSAGE).then(() => { + if (!this.loaded) { + //@ts-ignore + this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || this.scene.lastSavePlayTime >= 300).then(success => { // TODO: get rid of ts-ignore + this.scene.disableMenu = false; + if (!success) { + return this.scene.reset(true); + } + this.doEncounter(); + this.scene.resetSeed(); + }); + } else { + this.doEncounter(); + this.scene.resetSeed(); + } + }); + }); + } + + doEncounter() { + this.scene.playBgm(undefined, true); + this.scene.updateModifiers(false); + this.scene.setFieldScale(1); + + /*if (startingWave > 10) { + for (let m = 0; m < Math.min(Math.floor(startingWave / 10), 99); m++) + this.scene.addModifier(getPlayerModifierTypeOptionsForWave((m + 1) * 10, 1, this.scene.getParty())[0].type.newModifier(), true); + this.scene.updateModifiers(true); + }*/ + + for (const pokemon of this.scene.getParty()) { + if (pokemon) { + pokemon.resetBattleData(); + } + } + + if (!this.loaded) { + this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + } + + const enemyField = this.scene.getEnemyField(); + this.scene.tweens.add({ + targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer].flat(), + x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, + duration: 2000, + onComplete: () => { + if (!this.tryOverrideForBattleSpec()) { + this.doEncounterCommon(); + } + } + }); + } + + getEncounterMessage(): string { + const enemyField = this.scene.getEnemyField(); + + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + return i18next.t("battle:bossAppeared", { bossName: getPokemonNameWithAffix(enemyField[0])}); + } + + if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + if (this.scene.currentBattle.double) { + return i18next.t("battle:trainerAppearedDouble", { trainerName: this.scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); + + } else { + return i18next.t("battle:trainerAppeared", { trainerName: this.scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); + } + } + + return enemyField.length === 1 + ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].getNameToRender() }) + : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].getNameToRender(), pokemonName2: enemyField[1].getNameToRender() }); + } + + doEncounterCommon(showEncounterMessage: boolean = true) { + const enemyField = this.scene.getEnemyField(); + + if (this.scene.currentBattle.battleType === BattleType.WILD) { + enemyField.forEach(enemyPokemon => { + enemyPokemon.untint(100, "Sine.easeOut"); + enemyPokemon.cry(); + enemyPokemon.showInfo(); + if (enemyPokemon.isShiny()) { + this.scene.validateAchv(achvs.SEE_SHINY); + } + }); + this.scene.updateFieldScale(); + if (showEncounterMessage) { + this.scene.ui.showText(this.getEncounterMessage(), null, () => this.end(), 1500); + } else { + this.end(); + } + } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + const trainer = this.scene.currentBattle.trainer; + trainer?.untint(100, "Sine.easeOut"); + trainer?.playAnim(); + + const doSummon = () => { + this.scene.currentBattle.started = true; + this.scene.playBgm(undefined); + this.scene.pbTray.showPbTray(this.scene.getParty()); + this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); + const doTrainerSummon = () => { + this.hideEnemyTrainer(); + const availablePartyMembers = this.scene.getEnemyParty().filter(p => !p.isFainted()).length; + this.scene.unshiftPhase(new SummonPhase(this.scene, 0, false)); + if (this.scene.currentBattle.double && availablePartyMembers > 1) { + this.scene.unshiftPhase(new SummonPhase(this.scene, 1, false)); + } + this.end(); + }; + if (showEncounterMessage) { + this.scene.ui.showText(this.getEncounterMessage(), null, doTrainerSummon, 1500, true); + } else { + doTrainerSummon(); + } + }; + + const encounterMessages = this.scene.currentBattle.trainer?.getEncounterMessages(); + + if (!encounterMessages?.length) { + doSummon(); + } else { + let message: string; + this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.waveIndex); + message = message!; // tell TS compiler it's defined now + const showDialogueAndSummon = () => { + this.scene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { + this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => doSummon())); + }); + }; + if (this.scene.currentBattle.trainer?.config.hasCharSprite && !this.scene.ui.shouldSkipDialogue(message)) { + this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); // TODO: is this bang correct? + } else { + showDialogueAndSummon(); + } + } + } + } + + end() { + const enemyField = this.scene.getEnemyField(); + + enemyField.forEach((enemyPokemon, e) => { + if (enemyPokemon.isShiny()) { + this.scene.unshiftPhase(new ShinySparklePhase(this.scene, BattlerIndex.ENEMY + e)); + } + }); + + if (this.scene.currentBattle.battleType !== BattleType.TRAINER) { + enemyField.map(p => this.scene.pushConditionalPhase(new PostSummonPhase(this.scene, p.getBattlerIndex()), () => { + // if there is not a player party, we can't continue + if (!this.scene.getParty()?.length) { + return false; + } + // how many player pokemon are on the field ? + const pokemonsOnFieldCount = this.scene.getParty().filter(p => p.isOnField()).length; + // if it's a 2vs1, there will never be a 2nd pokemon on our field even + const requiredPokemonsOnField = Math.min(this.scene.getParty().filter((p) => !p.isFainted()).length, 2); + // if it's a double, there should be 2, otherwise 1 + if (this.scene.currentBattle.double) { + return pokemonsOnFieldCount === requiredPokemonsOnField; + } + return pokemonsOnFieldCount === 1; + })); + const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); + if (ivScannerModifier) { + enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + } + } + + if (!this.loaded) { + const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()); + + if (!availablePartyMembers[0].isOnField()) { + this.scene.pushPhase(new SummonPhase(this.scene, 0)); + } + + if (this.scene.currentBattle.double) { + if (availablePartyMembers.length > 1) { + this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true)); + if (!availablePartyMembers[1].isOnField()) { + this.scene.pushPhase(new SummonPhase(this.scene, 1)); + } + } + } else { + if (availablePartyMembers.length > 1 && availablePartyMembers[1].isOnField()) { + this.scene.pushPhase(new ReturnPhase(this.scene, 1)); + } + this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, false)); + } + + if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { + const minPartySize = this.scene.currentBattle.double ? 2 : 1; + if (availablePartyMembers.length > minPartySize) { + this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); + if (this.scene.currentBattle.double) { + this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + } + } + } + } + handleTutorial(this.scene, Tutorial.Access_Menu).then(() => super.end()); + } + + tryOverrideForBattleSpec(): boolean { + switch (this.scene.currentBattle.battleSpec) { + case BattleSpec.FINAL_BOSS: + const enemy = this.scene.getEnemyPokemon(); + this.scene.ui.showText(this.getEncounterMessage(), null, () => { + const localizationKey = "battleSpecDialogue:encounter"; + if (this.scene.ui.shouldSkipDialogue(localizationKey)) { + // 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/end-card-phase.ts b/src/phases/end-card-phase.ts new file mode 100644 index 00000000000..274a745017a --- /dev/null +++ b/src/phases/end-card-phase.ts @@ -0,0 +1,40 @@ +import BattleScene from "#app/battle-scene"; +import { PlayerGender } from "#app/enums/player-gender"; +import { Phase } from "#app/phase"; +import { addTextObject, TextStyle } from "#app/ui/text"; +import i18next from "i18next"; + +export class EndCardPhase extends Phase { + public endCard: Phaser.GameObjects.Image; + public text: Phaser.GameObjects.Text; + + constructor(scene: BattleScene) { + super(scene); + } + + start(): void { + super.start(); + + this.scene.ui.getMessageHandler().bg.setVisible(false); + this.scene.ui.getMessageHandler().nameBoxContainer.setVisible(false); + + this.endCard = this.scene.add.image(0, 0, `end_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}`); + this.endCard.setOrigin(0); + this.endCard.setScale(0.5); + this.scene.field.add(this.endCard); + + this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }); + this.text.setOrigin(0.5); + this.scene.field.add(this.text); + + this.scene.ui.clearText(); + + this.scene.ui.fadeIn(1000).then(() => { + + this.scene.ui.showText("", null, () => { + this.scene.ui.getMessageHandler().bg.setVisible(true); + this.end(); + }, null, true); + }); + } +} diff --git a/src/phases/end-evolution-phase.ts b/src/phases/end-evolution-phase.ts new file mode 100644 index 00000000000..8a6ce52553d --- /dev/null +++ b/src/phases/end-evolution-phase.ts @@ -0,0 +1,16 @@ +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; + +export class EndEvolutionPhase extends Phase { + + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => this.end()); + } +} diff --git a/src/phases/enemy-command-phase.ts b/src/phases/enemy-command-phase.ts new file mode 100644 index 00000000000..91ee0456cd4 --- /dev/null +++ b/src/phases/enemy-command-phase.ts @@ -0,0 +1,84 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { Command } from "#app/ui/command-ui-handler"; +import { FieldPhase } from "./field-phase"; + +/** + * Phase for determining an enemy AI's action for the next turn. + * During this phase, the enemy decides whether to switch (if it has a trainer) + * or to use a move from its moveset. + * + * For more information on how the Enemy AI works, see docs/enemy-ai.md + * @see {@linkcode Pokemon.getMatchupScore} + * @see {@linkcode EnemyPokemon.getNextMove} + */ +export class EnemyCommandPhase extends FieldPhase { + protected fieldIndex: integer; + + constructor(scene: BattleScene, fieldIndex: integer) { + super(scene); + + this.fieldIndex = fieldIndex; + } + + start() { + super.start(); + + const enemyPokemon = this.scene.getEnemyField()[this.fieldIndex]; + + const battle = this.scene.currentBattle; + + const trainer = battle.trainer; + + /** + * If the enemy has a trainer, decide whether or not the enemy should switch + * to another member in its party. + * + * This block compares the active enemy Pokemon's {@linkcode Pokemon.getMatchupScore | matchup score} + * against the active player Pokemon with the enemy party's other non-fainted Pokemon. If a party + * member's matchup score is 3x the active enemy's score (or 2x for "boss" trainers), + * the enemy will switch to that Pokemon. + */ + if (trainer && !enemyPokemon.getMoveQueue().length) { + const opponents = enemyPokemon.getOpponents(); + + if (!enemyPokemon.isTrapped()) { + const partyMemberScores = trainer.getPartyMemberMatchupScores(enemyPokemon.trainerSlot, true); + + if (partyMemberScores.length) { + const matchupScores = opponents.map(opp => enemyPokemon.getMatchupScore(opp)); + const matchupScore = matchupScores.reduce((total, score) => total += score, 0) / matchupScores.length; + + const sortedPartyMemberScores = trainer.getSortedPartyMemberMatchupScores(partyMemberScores); + + const switchMultiplier = 1 - (battle.enemySwitchCounter ? Math.pow(0.1, (1 / battle.enemySwitchCounter)) : 0); + + if (sortedPartyMemberScores[0][1] * switchMultiplier >= matchupScore * (trainer.config.isBoss ? 2 : 3)) { + const index = trainer.getNextSummonIndex(enemyPokemon.trainerSlot, partyMemberScores); + + battle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = + { command: Command.POKEMON, cursor: index, args: [false] }; + + battle.enemySwitchCounter++; + + return this.end(); + } + } + } + } + + /** Select a move to use (and a target to use it against, if applicable) */ + const nextMove = enemyPokemon.getNextMove(); + + this.scene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = + { command: Command.FIGHT, move: nextMove }; + + this.scene.currentBattle.enemySwitchCounter = Math.max(this.scene.currentBattle.enemySwitchCounter - 1, 0); + + this.end(); + } + + getFieldIndex(): number { + return this.fieldIndex; + } +} diff --git a/src/phases/enemy-party-member-pokemon-phase.ts b/src/phases/enemy-party-member-pokemon-phase.ts new file mode 100644 index 00000000000..bb34f53b475 --- /dev/null +++ b/src/phases/enemy-party-member-pokemon-phase.ts @@ -0,0 +1,13 @@ +import BattleScene from "#app/battle-scene"; +import { EnemyPokemon } from "#app/field/pokemon"; +import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; + +export abstract class EnemyPartyMemberPokemonPhase extends PartyMemberPokemonPhase { + constructor(scene: BattleScene, partyMemberIndex: integer) { + super(scene, partyMemberIndex, false); + } + + getEnemyPokemon(): EnemyPokemon { + return super.getPokemon() as EnemyPokemon; + } +} diff --git a/src/evolution-phase.ts b/src/phases/evolution-phase.ts similarity index 93% rename from src/evolution-phase.ts rename to src/phases/evolution-phase.ts index c7986f6664f..0c3c2fa5bcf 100644 --- a/src/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -1,21 +1,23 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { Phase } from "./phase"; -import BattleScene from "./battle-scene"; -import { SpeciesFormEvolution } from "./data/pokemon-evolutions"; -import EvolutionSceneHandler from "./ui/evolution-scene-handler"; -import * as Utils from "./utils"; -import { Mode } from "./ui/ui"; -import { LearnMovePhase } from "./phases"; -import { cos, sin } from "./field/anims"; -import { PlayerPokemon } from "./field/pokemon"; -import { getTypeRgb } from "./data/type"; +import { Phase } from "../phase"; +import BattleScene from "../battle-scene"; +import { SpeciesFormEvolution } from "../data/pokemon-evolutions"; +import EvolutionSceneHandler from "../ui/evolution-scene-handler"; +import * as Utils from "../utils"; +import { Mode } from "../ui/ui"; +import { cos, sin } from "../field/anims"; +import { PlayerPokemon } from "../field/pokemon"; +import { getTypeRgb } from "../data/type"; import i18next from "i18next"; +import { getPokemonNameWithAffix } from "../messages"; +import { LearnMovePhase } from "./learn-move-phase"; +import { EndEvolutionPhase } from "./end-evolution-phase"; export class EvolutionPhase extends Phase { protected pokemon: PlayerPokemon; protected lastLevel: integer; - private evolution: SpeciesFormEvolution; + private evolution: SpeciesFormEvolution | null; protected evolutionContainer: Phaser.GameObjects.Container; protected evolutionBaseBg: Phaser.GameObjects.Image; @@ -27,7 +29,7 @@ export class EvolutionPhase extends Phase { protected pokemonEvoSprite: Phaser.GameObjects.Sprite; protected pokemonEvoTintSprite: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene, pokemon: PlayerPokemon, evolution: SpeciesFormEvolution, lastLevel: integer) { + constructor(scene: BattleScene, pokemon: PlayerPokemon, evolution: SpeciesFormEvolution | null, lastLevel: integer) { super(scene); this.pokemon = pokemon; @@ -52,7 +54,7 @@ export class EvolutionPhase extends Phase { return this.end(); } - this.scene.fadeOutBgm(null, false); + this.scene.fadeOutBgm(undefined, false); const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; @@ -116,7 +118,7 @@ export class EvolutionPhase extends Phase { doEvolution(): void { const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; - const preName = this.pokemon.name; + const preName = getPokemonNameWithAffix(this.pokemon); this.scene.ui.showText(i18next.t("menu:evolving", { pokemonName: preName }), null, () => { this.pokemon.cry(); @@ -155,7 +157,7 @@ export class EvolutionPhase extends Phase { this.evolutionBg.setVisible(true); this.evolutionBg.play(); }); - this.scene.playSound("charge"); + this.scene.playSound("se/charge"); this.doSpiralUpward(); this.scene.tweens.addCounter({ from: 0, @@ -167,7 +169,7 @@ export class EvolutionPhase extends Phase { onComplete: () => { this.pokemonSprite.setVisible(false); this.scene.time.delayedCall(1100, () => { - this.scene.playSound("beam"); + this.scene.playSound("se/beam"); this.doArcDownward(); this.scene.time.delayedCall(1500, () => { this.pokemonEvoTintSprite.setScale(0.25); @@ -194,7 +196,7 @@ export class EvolutionPhase extends Phase { this.scene.ui.showText(i18next.t("menu:stoppedEvolving", { pokemonName: preName }), null, () => { this.scene.ui.showText(i18next.t("menu:pauseEvolutionsQuestion", { pokemonName: preName }), null, () => { const end = () => { - this.scene.ui.showText(null, 0); + this.scene.ui.showText("", 0); this.scene.playBgm(); evolvedPokemon.destroy(); this.end(); @@ -212,20 +214,20 @@ export class EvolutionPhase extends Phase { return; } - this.scene.playSound("sparkle"); + this.scene.playSound("se/sparkle"); this.pokemonEvoSprite.setVisible(true); this.doCircleInward(); this.scene.time.delayedCall(900, () => { evolutionHandler.canCancel = false; - this.pokemon.evolve(this.evolution).then(() => { + this.pokemon.evolve(this.evolution, this.pokemon.species).then(() => { const levelMoves = this.pokemon.getLevelMoves(this.lastLevel + 1, true); for (const lm of levelMoves) { this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.scene.getParty().indexOf(this.pokemon), lm[1])); } this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); - this.scene.playSound("shine"); + this.scene.playSound("se/shine"); this.doSpray(); this.scene.tweens.add({ targets: this.evolutionOverlay, @@ -529,16 +531,3 @@ export class EvolutionPhase extends Phase { updateParticle(); } } - -export class EndEvolutionPhase extends Phase { - - constructor(scene: BattleScene) { - super(scene); - } - - start() { - super.start(); - - this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => this.end()); - } -} diff --git a/src/phases/exp-phase.ts b/src/phases/exp-phase.ts new file mode 100644 index 00000000000..81982980d2a --- /dev/null +++ b/src/phases/exp-phase.ts @@ -0,0 +1,35 @@ +import BattleScene from "#app/battle-scene"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { ExpBoosterModifier } from "#app/modifier/modifier"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; +import { LevelUpPhase } from "./level-up-phase"; + +export class ExpPhase extends PlayerPartyMemberPokemonPhase { + private expValue: number; + + constructor(scene: BattleScene, partyMemberIndex: integer, expValue: number) { + super(scene, partyMemberIndex); + + this.expValue = expValue; + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + const exp = new Utils.NumberHolder(this.expValue); + this.scene.applyModifiers(ExpBoosterModifier, true, exp); + exp.value = Math.floor(exp.value); + this.scene.ui.showText(i18next.t("battle:expGain", { pokemonName: getPokemonNameWithAffix(pokemon), exp: exp.value }), null, () => { + const lastLevel = pokemon.level; + pokemon.addExp(exp.value); + const newLevel = pokemon.level; + if (newLevel > lastLevel) { + this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, lastLevel, newLevel)); + } + pokemon.updateInfo().then(() => this.end()); + }, null, true); + } +} diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts new file mode 100644 index 00000000000..48366afaad4 --- /dev/null +++ b/src/phases/faint-phase.ts @@ -0,0 +1,173 @@ +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"; +import { SwitchSummonPhase } from "./switch-summon-phase"; +import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; +import { GameOverPhase } from "./game-over-phase"; +import { SwitchPhase } from "./switch-phase"; +import { VictoryPhase } from "./victory-phase"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; + +export class FaintPhase extends PokemonPhase { + private preventEndure: boolean; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, preventEndure?: boolean) { + super(scene, battlerIndex); + + this.preventEndure = preventEndure!; // TODO: is this bang correct? + } + + start() { + super.start(); + + if (!this.preventEndure) { + const instantReviveModifier = this.scene.applyModifier(PokemonInstantReviveModifier, this.player, this.getPokemon()) as PokemonInstantReviveModifier; + + if (instantReviveModifier) { + if (!--instantReviveModifier.stackCount) { + this.scene.removeModifier(instantReviveModifier); + } + this.scene.updateModifiers(this.player); + return this.end(); + } + } + + if (!this.tryOverrideForBattleSpec()) { + this.doFaint(); + } + } + + doFaint(): void { + const pokemon = this.getPokemon(); + + + // Track total times pokemon have been KO'd for supreme overlord/last respects + if (pokemon.isPlayer()) { + this.scene.currentBattle.playerFaints += 1; + } else { + this.scene.currentBattle.enemyFaints += 1; + } + + this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true); + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + + if (pokemon.turnData?.attacksReceived?.length) { + const lastAttack = pokemon.turnData.attacksReceived[0]; + applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, this.scene.getPokemonById(lastAttack.sourceId)!, new PokemonMove(lastAttack.move).getMove(), lastAttack.result); // TODO: is this bang correct? + } + + const alivePlayField = this.scene.getField(true); + alivePlayField.forEach(p => applyPostKnockOutAbAttrs(PostKnockOutAbAttr, p, pokemon)); + if (pokemon.turnData?.attacksReceived?.length) { + const defeatSource = this.scene.getPokemonById(pokemon.turnData.attacksReceived[0].sourceId); + if (defeatSource?.isOnField()) { + applyPostVictoryAbAttrs(PostVictoryAbAttr, defeatSource); + const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move]; + const pvattrs = pvmove.getAttrs(PostVictoryStatStageChangeAttr); + if (pvattrs.length) { + for (const pvattr of pvattrs) { + pvattr.applyPostVictory(defeatSource, defeatSource, pvmove); + } + } + } + } + + if (this.player) { + /** The total number of Pokemon in the player's party that can legally fight */ + const legalPlayerPokemon = this.scene.getParty().filter(p => p.isAllowedInBattle()); + /** The total number of legal player Pokemon that aren't currently on the field */ + const legalPlayerPartyPokemon = legalPlayerPokemon.filter(p => !p.isActive(true)); + if (!legalPlayerPokemon.length) { + /** If the player doesn't have any legal Pokemon, end the game */ + this.scene.unshiftPhase(new GameOverPhase(this.scene)); + } else if (this.scene.currentBattle.double && legalPlayerPokemon.length === 1 && legalPlayerPartyPokemon.length === 0) { + /** + * If the player has exactly one Pokemon in total at this point in a double battle, and that Pokemon + * is already on the field, unshift a phase that moves that Pokemon to center position. + */ + this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + } else if (legalPlayerPartyPokemon.length > 0) { + /** + * If previous conditions weren't met, and the player has at least 1 legal Pokemon off the field, + * push a phase that prompts the player to summon a Pokemon from their party. + */ + this.scene.pushPhase(new SwitchPhase(this.scene, this.fieldIndex, true, false)); + } + } else { + this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); + if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + const hasReservePartyMember = !!this.scene.getEnemyParty().filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot).length; + if (hasReservePartyMember) { + this.scene.pushPhase(new SwitchSummonPhase(this.scene, this.fieldIndex, -1, false, false, false)); + } + } + } + + // in double battles redirect potential moves off fainted pokemon + if (this.scene.currentBattle.double) { + const allyPokemon = pokemon.getAlly(); + this.scene.redirectPokemonMoves(pokemon, allyPokemon); + } + + pokemon.lapseTags(BattlerTagLapseType.FAINT); + this.scene.getField(true).filter(p => p !== pokemon).forEach(p => p.removeTagsBySourceId(pokemon.id)); + + pokemon.faintCry(() => { + if (pokemon instanceof PlayerPokemon) { + pokemon.addFriendship(-10); + } + pokemon.hideInfo(); + this.scene.playSound("se/faint"); + this.scene.tweens.add({ + targets: pokemon, + duration: 500, + y: pokemon.y + 150, + ease: "Sine.easeIn", + onComplete: () => { + pokemon.setVisible(false); + pokemon.y -= 150; + pokemon.trySetStatus(StatusEffect.FAINT); + if (pokemon.isPlayer()) { + this.scene.currentBattle.removeFaintedParticipant(pokemon as PlayerPokemon); + } else { + this.scene.addFaintedEnemyScore(pokemon as EnemyPokemon); + this.scene.currentBattle.addPostBattleLoot(pokemon as EnemyPokemon); + } + this.scene.field.remove(pokemon); + this.end(); + } + }); + }); + } + + tryOverrideForBattleSpec(): boolean { + switch (this.scene.currentBattle.battleSpec) { + case BattleSpec.FINAL_BOSS: + if (!this.player) { + const enemy = this.getPokemon(); + if (enemy.formIndex) { + this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.species.name, null, () => this.doFaint()); + } else { + // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase + enemy.hp++; + this.scene.unshiftPhase(new DamagePhase(this.scene, enemy.getBattlerIndex(), 0, HitResult.OTHER)); + this.end(); + } + return true; + } + } + + return false; + } +} diff --git a/src/phases/field-phase.ts b/src/phases/field-phase.ts new file mode 100644 index 00000000000..46c3c4983b4 --- /dev/null +++ b/src/phases/field-phase.ts @@ -0,0 +1,11 @@ +import Pokemon from "#app/field/pokemon"; +import { BattlePhase } from "./battle-phase"; + +type PokemonFunc = (pokemon: Pokemon) => void; + +export abstract class FieldPhase extends BattlePhase { + executeForAll(func: PokemonFunc): void { + const field = this.scene.getField(true).filter(p => p.summonData); + field.forEach(pokemon => func(pokemon)); + } +} diff --git a/src/form-change-phase.ts b/src/phases/form-change-phase.ts similarity index 56% rename from src/form-change-phase.ts rename to src/phases/form-change-phase.ts index ebf91c635fd..33c1f8e8cef 100644 --- a/src/form-change-phase.ts +++ b/src/phases/form-change-phase.ts @@ -1,15 +1,14 @@ -import BattleScene from "./battle-scene"; -import * as Utils from "./utils"; -import { SpeciesFormKey } from "./data/pokemon-species"; -import { achvs } from "./system/achv"; -import { SpeciesFormChange, getSpeciesFormChangeMessage } from "./data/pokemon-forms"; -import { EndEvolutionPhase, EvolutionPhase } from "./evolution-phase"; -import Pokemon, { EnemyPokemon, PlayerPokemon } from "./field/pokemon"; -import { Mode } from "./ui/ui"; -import PartyUiHandler from "./ui/party-ui-handler"; -import { BattleSpec } from "#enums/battle-spec"; -import { BattlePhase, MovePhase, PokemonHealPhase } from "./phases"; -import { getTypeRgb } from "./data/type"; +import BattleScene from "../battle-scene"; +import * as Utils from "../utils"; +import { SpeciesFormKey } from "../data/pokemon-species"; +import { achvs } from "../system/achv"; +import { SpeciesFormChange, getSpeciesFormChangeMessage } from "../data/pokemon-forms"; +import { PlayerPokemon } from "../field/pokemon"; +import { Mode } from "../ui/ui"; +import PartyUiHandler from "../ui/party-ui-handler"; +import { getPokemonNameWithAffix } from "../messages"; +import { EndEvolutionPhase } from "./end-evolution-phase"; +import { EvolutionPhase } from "./evolution-phase"; export class FormChangePhase extends EvolutionPhase { private formChange: SpeciesFormChange; @@ -34,7 +33,7 @@ export class FormChangePhase extends EvolutionPhase { } doEvolution(): void { - const preName = this.pokemon.name; + const preName = getPokemonNameWithAffix(this.pokemon); this.pokemon.getPossibleForm(this.formChange).then(transformedPokemon => { @@ -69,7 +68,7 @@ export class FormChangePhase extends EvolutionPhase { this.evolutionBg.setVisible(true); this.evolutionBg.play(); }); - this.scene.playSound("charge"); + this.scene.playSound("se/charge"); this.doSpiralUpward(); this.scene.tweens.addCounter({ from: 0, @@ -81,13 +80,13 @@ export class FormChangePhase extends EvolutionPhase { onComplete: () => { this.pokemonSprite.setVisible(false); this.scene.time.delayedCall(1100, () => { - this.scene.playSound("beam"); + this.scene.playSound("se/beam"); this.doArcDownward(); this.scene.time.delayedCall(1000, () => { this.pokemonEvoTintSprite.setScale(0.25); this.pokemonEvoTintSprite.setVisible(true); this.doCycle(1, 1).then(_success => { - this.scene.playSound("sparkle"); + this.scene.playSound("se/sparkle"); this.pokemonEvoSprite.setVisible(true); this.doCircleInward(); this.scene.time.delayedCall(900, () => { @@ -96,7 +95,7 @@ export class FormChangePhase extends EvolutionPhase { this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); } - this.scene.playSound("shine"); + this.scene.playSound("se/shine"); this.doSpray(); this.scene.tweens.add({ targets: this.evolutionOverlay, @@ -173,126 +172,3 @@ export class FormChangePhase extends EvolutionPhase { } } } - -export class QuietFormChangePhase extends BattlePhase { - protected pokemon: Pokemon; - protected formChange: SpeciesFormChange; - - constructor(scene: BattleScene, pokemon: Pokemon, formChange: SpeciesFormChange) { - super(scene); - this.pokemon = pokemon; - this.formChange = formChange; - } - - start(): void { - super.start(); - - if (this.pokemon.formIndex === this.pokemon.species.forms.findIndex(f => f.formKey === this.formChange.formKey)) { - return this.end(); - } - - const preName = this.pokemon.name; - - if (!this.pokemon.isOnField()) { - this.pokemon.changeForm(this.formChange).then(() => { - this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); - }); - return; - } - - const getPokemonSprite = () => { - const sprite = this.scene.addPokemonSprite(this.pokemon, this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, "pkmn__sub"); - sprite.setOrigin(0.5, 1); - sprite.play(this.pokemon.getBattleSpriteKey()).stop(); - sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); - [ "spriteColors", "fusionSpriteColors" ].map(k => { - if (this.pokemon.summonData?.speciesForm) { - k += "Base"; - } - sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; - }); - this.scene.field.add(sprite); - return sprite; - }; - - const [ pokemonTintSprite, pokemonFormTintSprite ] = [ getPokemonSprite(), getPokemonSprite() ]; - - this.pokemon.getSprite().on("animationupdate", (_anim, frame) => { - if (frame.textureKey === pokemonTintSprite.texture.key) { - pokemonTintSprite.setFrame(frame.textureFrame); - } else { - pokemonFormTintSprite.setFrame(frame.textureFrame); - } - }); - - pokemonTintSprite.setAlpha(0); - pokemonTintSprite.setTintFill(0xFFFFFF); - pokemonFormTintSprite.setVisible(false); - pokemonFormTintSprite.setTintFill(0xFFFFFF); - - this.scene.playSound("PRSFX- Transform"); - - this.scene.tweens.add({ - targets: pokemonTintSprite, - alpha: 1, - duration: 1000, - ease: "Cubic.easeIn", - onComplete: () => { - this.pokemon.setVisible(false); - this.pokemon.changeForm(this.formChange).then(() => { - pokemonFormTintSprite.setScale(0.01); - pokemonFormTintSprite.play(this.pokemon.getBattleSpriteKey()).stop(); - pokemonFormTintSprite.setVisible(true); - this.scene.tweens.add({ - targets: pokemonTintSprite, - delay: 250, - scale: 0.01, - ease: "Cubic.easeInOut", - duration: 500, - onComplete: () => pokemonTintSprite.destroy() - }); - this.scene.tweens.add({ - targets: pokemonFormTintSprite, - delay: 250, - scale: this.pokemon.getSpriteScale(), - ease: "Cubic.easeInOut", - duration: 500, - onComplete: () => { - this.pokemon.setVisible(true); - this.scene.tweens.add({ - targets: pokemonFormTintSprite, - delay: 250, - alpha: 0, - ease: "Cubic.easeOut", - duration: 1000, - onComplete: () => { - pokemonTintSprite.setVisible(false); - this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); - } - }); - } - }); - }); - } - }); - } - - end(): void { - if (this.pokemon.scene?.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { - this.scene.playBgm(); - this.scene.unshiftPhase(new PokemonHealPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true)); - this.pokemon.findAndRemoveTags(() => true); - this.pokemon.bossSegments = 5; - this.pokemon.bossSegmentIndex = 4; - this.pokemon.initBattleInfo(); - this.pokemon.cry(); - - const movePhase = this.scene.findPhase(p => p instanceof MovePhase && p.pokemon === this.pokemon) as MovePhase; - if (movePhase) { - movePhase.cancel(); - } - } - - super.end(); - } -} diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts new file mode 100644 index 00000000000..a698e62e2e1 --- /dev/null +++ b/src/phases/game-over-modifier-reward-phase.ts @@ -0,0 +1,28 @@ +import BattleScene from "#app/battle-scene"; +import { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { ModifierRewardPhase } from "./modifier-reward-phase"; + +export class GameOverModifierRewardPhase extends ModifierRewardPhase { + constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc) { + super(scene, modifierTypeFunc); + } + + doReward(): Promise { + return new Promise(resolve => { + const newModifier = this.modifierType.newModifier(); + this.scene.addModifier(newModifier).then(() => { + // Sound loaded into game as is + this.scene.playSound("level_up_fanfare"); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.fadeIn(250).then(() => { + this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => { + this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); + resolve(); + }, null, true, 1500); + }); + }); + }); + } +} diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts new file mode 100644 index 00000000000..17805e90f0f --- /dev/null +++ b/src/phases/game-over-phase.ts @@ -0,0 +1,244 @@ +import { clientSessionId } from "#app/account"; +import BattleScene from "#app/battle-scene"; +import { BattleType } from "#app/battle"; +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"; +import { PlayerGender } from "#app/enums/player-gender"; +import { TrainerType } from "#app/enums/trainer-type"; +import Pokemon from "#app/field/pokemon"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { achvs, ChallengeAchv } from "#app/system/achv"; +import { Unlockables } from "#app/system/unlockables"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "./battle-phase"; +import { CheckSwitchPhase } from "./check-switch-phase"; +import { EncounterPhase } from "./encounter-phase"; +import { GameOverModifierRewardPhase } from "./game-over-modifier-reward-phase"; +import { RibbonModifierRewardPhase } from "./ribbon-modifier-reward-phase"; +import { SummonPhase } from "./summon-phase"; +import { EndCardPhase } from "./end-card-phase"; +import { PostGameOverPhase } from "./post-game-over-phase"; +import { UnlockPhase } from "./unlock-phase"; +import { SessionSaveData } from "../system/game-data"; +import TrainerData from "../system/trainer-data"; +import PokemonData from "../system/pokemon-data"; +import PersistentModifierData from "../system/modifier-data"; +import ChallengeData from "../system/challenge-data"; +import ArenaData from "../system/arena-data"; + +export class GameOverPhase extends BattlePhase { + private victory: boolean; + private firstRibbons: PokemonSpecies[] = []; + + constructor(scene: BattleScene, victory?: boolean) { + super(scene); + + this.victory = !!victory; + } + + start() { + super.start(); + + // Failsafe if players somehow skip floor 200 in classic mode + if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) { + this.victory = true; + } + + if (this.victory && this.scene.gameMode.isEndless) { + const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const genderStr = PlayerGender[genderIndex].toLowerCase(); + this.scene.ui.showDialogue(i18next.t("miscDialogue:ending_endless", { context: genderStr }), i18next.t("miscDialogue:ending_name"), 0, () => this.handleGameOver()); + } else if (this.victory || !this.scene.enableRetries) { + this.handleGameOver(); + } else { + this.scene.ui.showText(i18next.t("battle:retryBattle"), null, () => { + this.scene.ui.setMode(Mode.CONFIRM, () => { + this.scene.ui.fadeOut(1250).then(() => { + this.scene.reset(); + this.scene.clearPhaseQueue(); + this.scene.gameData.loadSession(this.scene, this.scene.sessionSlotId).then(() => { + this.scene.pushPhase(new EncounterPhase(this.scene, true)); + + const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()).length; + + this.scene.pushPhase(new SummonPhase(this.scene, 0)); + if (this.scene.currentBattle.double && availablePartyMembers > 1) { + this.scene.pushPhase(new SummonPhase(this.scene, 1)); + } + if (this.scene.currentBattle.waveIndex > 1 && this.scene.currentBattle.battleType !== BattleType.TRAINER) { + this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); + if (this.scene.currentBattle.double && availablePartyMembers > 1) { + this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + } + } + + this.scene.ui.fadeIn(1250); + this.end(); + }); + }); + }, () => this.handleGameOver(), false, 0, 0, 1000); + }); + } + } + + handleGameOver(): void { + const doGameOver = (newClear: boolean) => { + this.scene.disableMenu = true; + this.scene.time.delayedCall(1000, () => { + let firstClear = false; + if (this.victory && newClear) { + if (this.scene.gameMode.isClassic) { + firstClear = this.scene.validateAchv(achvs.CLASSIC_VICTORY); + this.scene.validateAchv(achvs.UNEVOLVED_CLASSIC_VICTORY); + this.scene.gameData.gameStats.sessionsWon++; + for (const pokemon of this.scene.getParty()) { + this.awardRibbon(pokemon); + + if (pokemon.species.getRootSpeciesId() !== pokemon.species.getRootSpeciesId(true)) { + this.awardRibbon(pokemon, true); + } + } + } else if (this.scene.gameMode.isDaily && newClear) { + this.scene.gameData.gameStats.dailyRunSessionsWon++; + } + } + this.scene.gameData.saveRunHistory(this.scene, this.getFinalSessionData(), this.victory); + const fadeDuration = this.victory ? 10000 : 5000; + this.scene.fadeOutBgm(fadeDuration, true); + const activeBattlers = this.scene.getField().filter(p => p?.isActive(true)); + activeBattlers.map(p => p.hideInfo()); + this.scene.ui.fadeOut(fadeDuration).then(() => { + activeBattlers.map(a => a.setVisible(false)); + this.scene.setFieldScale(1, true); + this.scene.clearPhaseQueue(); + this.scene.ui.clearText(); + + if (this.victory && this.scene.gameMode.isChallenge) { + this.scene.gameMode.challenges.forEach(c => this.scene.validateAchvs(ChallengeAchv, c)); + } + + const clear = (endCardPhase?: EndCardPhase) => { + if (newClear) { + this.handleUnlocks(); + } + if (this.victory && newClear) { + for (const species of this.firstRibbons) { + this.scene.unshiftPhase(new RibbonModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PLUS, species)); + } + if (!firstClear) { + this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); + } + } + this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase)); + this.end(); + }; + + if (this.victory && this.scene.gameMode.isClassic) { + const dialogueKey = "miscDialogue:ending"; + + if (!this.scene.ui.shouldSkipDialogue(dialogueKey)) { + this.scene.ui.fadeIn(500).then(() => { + 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); + this.scene.unshiftPhase(endCardPhase); + clear(endCardPhase); + }); + }); + }); + }); + }); + } else { + const endCardPhase = new EndCardPhase(this.scene); + this.scene.unshiftPhase(endCardPhase); + clear(endCardPhase); + } + } else { + clear(); + } + }); + }); + }; + + /* Added a local check to see if the game is running offline on victory + If Online, execute apiFetch as intended + If Offline, execute offlineNewClear(), a localStorage implementation of newClear daily run checks */ + if (this.victory) { + if (!Utils.isLocal) { + Utils.apiFetch(`savedata/session/newclear?slot=${this.scene.sessionSlotId}&clientSessionId=${clientSessionId}`, true) + .then(response => response.json()) + .then(newClear => doGameOver(newClear)); + } else { + this.scene.gameData.offlineNewClear(this.scene).then(result => { + doGameOver(result); + }); + } + } else { + doGameOver(false); + } + } + + handleUnlocks(): void { + if (this.victory && this.scene.gameMode.isClassic) { + if (!this.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]) { + this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.ENDLESS_MODE)); + } + if (this.scene.getParty().filter(p => p.fusionSpecies).length && !this.scene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE]) { + this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.SPLICED_ENDLESS_MODE)); + } + if (!this.scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) { + this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.MINI_BLACK_HOLE)); + } + if (!this.scene.gameData.unlocks[Unlockables.EVIOLITE] && this.scene.getParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions)) { + this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.EVIOLITE)); + } + } + } + + awardRibbon(pokemon: Pokemon, forStarter: boolean = false): void { + const speciesId = getPokemonSpecies(pokemon.species.speciesId); + const speciesRibbonCount = this.scene.gameData.incrementRibbonCount(speciesId, forStarter); + // first time classic win, award voucher + if (speciesRibbonCount === 1) { + this.firstRibbons.push(getPokemonSpecies(pokemon.species.getRootSpeciesId(forStarter))); + } + } + + /** + * This function mirrors game-data.ts' getSessionSaveData() to update the session data to reflect any changes that occurred within the last wave + * This means that level ups, item usage, evolutions, etc. will all be accurately reflected. + * @returns {@linkCode SessionSaveData} an updated version of the wave's SessionSaveData that accurately reflects the events of the wave + */ + private getFinalSessionData(): SessionSaveData { + return { + seed: this.scene.seed, + playTime: this.scene.sessionPlayTime, + gameMode: this.scene.gameMode.modeId, + party: this.scene.getParty().map(p => new PokemonData(p)), + enemyParty: this.scene.getEnemyParty().map(p => new PokemonData(p)), + modifiers: this.scene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), + enemyModifiers: this.scene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), + arena: new ArenaData(this.scene.arena), + pokeballCounts: this.scene.pokeballCounts, + money: this.scene.money, + score: this.scene.score, + waveIndex: this.scene.currentBattle.waveIndex, + battleType: this.scene.currentBattle.battleType, + trainer: this.scene.currentBattle.battleType === BattleType.TRAINER ? new TrainerData(this.scene.currentBattle.trainer) : null, + gameVersion: this.scene.game.config.gameVersion, + timestamp: new Date().getTime(), + challenges: this.scene.gameMode.challenges.map(c => new ChallengeData(c)) + } as SessionSaveData; + } +} + diff --git a/src/phases/hide-party-exp-bar-phase.ts b/src/phases/hide-party-exp-bar-phase.ts new file mode 100644 index 00000000000..303650ea1ad --- /dev/null +++ b/src/phases/hide-party-exp-bar-phase.ts @@ -0,0 +1,14 @@ +import BattleScene from "#app/battle-scene"; +import { BattlePhase } from "./battle-phase"; + +export class HidePartyExpBarPhase extends BattlePhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.partyExpBar.hide().then(() => this.end()); + } +} diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts new file mode 100644 index 00000000000..049fc6951b6 --- /dev/null +++ b/src/phases/learn-move-phase.ts @@ -0,0 +1,112 @@ +import BattleScene from "#app/battle-scene"; +import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import { allMoves } from "#app/data/move"; +import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms"; +import { Moves } from "#app/enums/moves"; +import { getPokemonNameWithAffix } from "#app/messages"; +import EvolutionSceneHandler from "#app/ui/evolution-scene-handler"; +import { SummaryUiMode } from "#app/ui/summary-ui-handler"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; + +export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { + private moveId: Moves; + private fromTM: boolean; + + constructor(scene: BattleScene, partyMemberIndex: integer, moveId: Moves, fromTM?: boolean) { + super(scene, partyMemberIndex); + + this.moveId = moveId; + this.fromTM = fromTM ?? false; + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + const move = allMoves[this.moveId]; + + const existingMoveIndex = pokemon.getMoveset().findIndex(m => m?.moveId === move.id); + + if (existingMoveIndex > -1) { + return this.end(); + } + + const emptyMoveIndex = pokemon.getMoveset().length < 4 + ? pokemon.getMoveset().length + : pokemon.getMoveset().findIndex(m => m === null); + + const messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler + ? Mode.EVOLUTION_SCENE + : Mode.MESSAGE; + + 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(() => { + this.scene.ui.setMode(messageMode).then(() => { + // Sound loaded into game as is + this.scene.playSound("level_up_fanfare"); + this.scene.ui.showText(i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => { + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); + this.end(); + }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); + }); + }); + }); + } else { + this.scene.ui.setMode(messageMode).then(() => { + this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }), null, () => { + const noHandler = () => { + this.scene.ui.setMode(messageMode).then(() => { + this.scene.ui.showText(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), null, () => { + this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { + this.scene.ui.setMode(messageMode); + this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => this.end(), null, true); + }, () => { + this.scene.ui.setMode(messageMode); + this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); + this.end(); + }); + }); + }); + }; + this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { + this.scene.ui.setMode(messageMode); + this.scene.ui.showText(i18next.t("battle:learnMoveForgetQuestion"), null, () => { + this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => { + if (moveIndex === 4) { + noHandler(); + return; + } + this.scene.ui.setMode(messageMode).then(() => { + this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: 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(); + }, null, true); + }, null, true); + }, null, true); + }); + }); + }, null, true); + }, noHandler); + }); + }, null, true); + }, null, true); + }); + } + } +} diff --git a/src/phases/level-cap-phase.ts b/src/phases/level-cap-phase.ts new file mode 100644 index 00000000000..d1404e45010 --- /dev/null +++ b/src/phases/level-cap-phase.ts @@ -0,0 +1,21 @@ +import BattleScene from "#app/battle-scene"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { FieldPhase } from "./field-phase"; + +export class LevelCapPhase extends FieldPhase { + constructor(scene: BattleScene) { + super(scene); + } + + start(): void { + super.start(); + + this.scene.ui.setMode(Mode.MESSAGE).then(() => { + // Sound loaded into game as is + this.scene.playSound("level_up_fanfare"); + this.scene.ui.showText(i18next.t("battle:levelCapUp", { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true); + this.executeForAll(pokemon => pokemon.updateInfo(true)); + }); + } +} diff --git a/src/phases/level-up-phase.ts b/src/phases/level-up-phase.ts new file mode 100644 index 00000000000..a99e038acba --- /dev/null +++ b/src/phases/level-up-phase.ts @@ -0,0 +1,59 @@ +import BattleScene from "#app/battle-scene"; +import { ExpNotification } from "#app/enums/exp-notification"; +import { EvolutionPhase } from "#app/phases/evolution-phase"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { LevelAchv } from "#app/system/achv"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; +import { LearnMovePhase } from "./learn-move-phase"; + +export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { + private lastLevel: integer; + private level: integer; + + constructor(scene: BattleScene, partyMemberIndex: integer, lastLevel: integer, level: integer) { + super(scene, partyMemberIndex); + + this.lastLevel = lastLevel; + this.level = level; + this.scene = scene; + } + + start() { + super.start(); + + if (this.level > this.scene.gameData.gameStats.highestLevel) { + this.scene.gameData.gameStats.highestLevel = this.level; + } + + this.scene.validateAchvs(LevelAchv, new Utils.IntegerHolder(this.level)); + + const pokemon = this.getPokemon(); + const prevStats = pokemon.stats.slice(0); + pokemon.calculateStats(); + pokemon.updateInfo(); + if (this.scene.expParty === ExpNotification.DEFAULT) { + this.scene.playSound("level_up_fanfare"); + this.scene.ui.showText(i18next.t("battle:levelUp", { pokemonName: getPokemonNameWithAffix(this.getPokemon()), level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true); + } else if (this.scene.expParty === ExpNotification.SKIP) { + this.end(); + } else { + // we still want to display the stats if activated + this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()); + } + if (this.lastLevel < 100) { // this feels like an unnecessary optimization + const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1); + for (const lm of levelMoves) { + this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, lm[1])); + } + } + if (!pokemon.pauseEvolutions) { + const evolution = pokemon.getEvolution(); + if (evolution) { + this.scene.unshiftPhase(new EvolutionPhase(this.scene, pokemon as PlayerPokemon, evolution, this.lastLevel)); + } + } + } +} diff --git a/src/phases/login-phase.ts b/src/phases/login-phase.ts new file mode 100644 index 00000000000..89ced201e9e --- /dev/null +++ b/src/phases/login-phase.ts @@ -0,0 +1,116 @@ +import { updateUserInfo } from "#app/account"; +import BattleScene, { bypassLogin } from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { handleTutorial, Tutorial } from "#app/tutorial"; +import { Mode } from "#app/ui/ui"; +import i18next, { t } from "i18next"; +import * as Utils from "#app/utils"; +import { SelectGenderPhase } from "./select-gender-phase"; +import { UnavailablePhase } from "./unavailable-phase"; + +export class LoginPhase extends Phase { + private showText: boolean; + + constructor(scene: BattleScene, showText?: boolean) { + super(scene); + + this.showText = showText === undefined || !!showText; + } + + start(): void { + super.start(); + + const hasSession = !!Utils.getCookie(Utils.sessionIdKey); + + this.scene.ui.setMode(Mode.LOADING, { buttonActions: [] }); + Utils.executeIf(bypassLogin || hasSession, updateUserInfo).then(response => { + const success = response ? response[0] : false; + const statusCode = response ? response[1] : null; + if (!success) { + if (!statusCode || statusCode === 400) { + if (this.showText) { + this.scene.ui.showText(i18next.t("menu:logInOrCreateAccount")); + } + + this.scene.playSound("menu_open"); + + const loadData = () => { + updateUserInfo().then(success => { + if (!success[0]) { + Utils.removeCookie(Utils.sessionIdKey); + this.scene.reset(true, true); + return; + } + this.scene.gameData.loadSystem().then(() => this.end()); + }); + }; + + this.scene.ui.setMode(Mode.LOGIN_FORM, { + buttonActions: [ + () => { + this.scene.ui.playSelect(); + loadData(); + }, () => { + this.scene.playSound("menu_open"); + this.scene.ui.setMode(Mode.REGISTRATION_FORM, { + buttonActions: [ + () => { + this.scene.ui.playSelect(); + updateUserInfo().then(success => { + if (!success[0]) { + Utils.removeCookie(Utils.sessionIdKey); + this.scene.reset(true, true); + return; + } + this.end(); + } ); + }, () => { + this.scene.unshiftPhase(new LoginPhase(this.scene, false)); + this.end(); + } + ] + }); + }, () => { + const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`); + const discordId = import.meta.env.VITE_DISCORD_CLIENT_ID; + const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&prompt=none`; + window.open(discordUrl, "_self"); + }, () => { + const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/google/callback`); + const googleId = import.meta.env.VITE_GOOGLE_CLIENT_ID; + const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&redirect_uri=${redirectUri}&response_type=code&scope=openid`; + window.open(googleUrl, "_self"); + } + ] + }); + } else if (statusCode === 401) { + Utils.removeCookie(Utils.sessionIdKey); + this.scene.reset(true, true); + } else { + this.scene.unshiftPhase(new UnavailablePhase(this.scene)); + super.end(); + } + return null; + } else { + this.scene.gameData.loadSystem().then(success => { + if (success || bypassLogin) { + this.end(); + } else { + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(t("menu:failedToLoadSaveData")); + } + }); + } + }); + } + + end(): void { + this.scene.ui.setMode(Mode.MESSAGE); + + if (!this.scene.gameData.gender) { + this.scene.unshiftPhase(new SelectGenderPhase(this.scene)); + } + + handleTutorial(this.scene, Tutorial.Intro).then(() => super.end()); + } +} diff --git a/src/phases/message-phase.ts b/src/phases/message-phase.ts new file mode 100644 index 00000000000..2244980c899 --- /dev/null +++ b/src/phases/message-phase.ts @@ -0,0 +1,38 @@ +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; + +export class MessagePhase extends Phase { + private text: string; + private callbackDelay: integer | null; + private prompt: boolean | null; + private promptDelay: integer | null; + + constructor(scene: BattleScene, text: string, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { + super(scene); + + this.text = text; + this.callbackDelay = callbackDelay!; // TODO: is this bang correct? + this.prompt = prompt!; // TODO: is this bang correct? + this.promptDelay = promptDelay!; // TODO: is this bang correct? + } + + start() { + super.start(); + + if (this.text.indexOf("$") > -1) { + const pageIndex = this.text.indexOf("$"); + this.scene.unshiftPhase(new MessagePhase(this.scene, this.text.slice(pageIndex + 1), this.callbackDelay, this.prompt, this.promptDelay)); + this.text = this.text.slice(0, pageIndex).trim(); + } + + this.scene.ui.showText(this.text, null, () => this.end(), this.callbackDelay || (this.prompt ? 0 : 1500), this.prompt, this.promptDelay); + } + + end() { + if (this.scene.abilityBar.shown) { + this.scene.abilityBar.hide(); + } + + super.end(); + } +} diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts new file mode 100644 index 00000000000..20a8366d9c6 --- /dev/null +++ b/src/phases/modifier-reward-phase.ts @@ -0,0 +1,30 @@ +import BattleScene from "#app/battle-scene"; +import { ModifierType, ModifierTypeFunc, getModifierType } from "#app/modifier/modifier-type"; +import i18next from "i18next"; +import { BattlePhase } from "./battle-phase"; + +export class ModifierRewardPhase extends BattlePhase { + protected modifierType: ModifierType; + + constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc) { + super(scene); + + this.modifierType = getModifierType(modifierTypeFunc); + } + + start() { + super.start(); + + this.doReward().then(() => this.end()); + } + + doReward(): Promise { + return new Promise(resolve => { + const newModifier = this.modifierType.newModifier(); + this.scene.addModifier(newModifier).then(() => { + this.scene.playSound("item_fanfare"); + this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); + }); + }); + } +} diff --git a/src/phases/money-reward-phase.ts b/src/phases/money-reward-phase.ts new file mode 100644 index 00000000000..2f0a4f7b990 --- /dev/null +++ b/src/phases/money-reward-phase.ts @@ -0,0 +1,34 @@ +import BattleScene from "#app/battle-scene"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { MoneyMultiplierModifier } from "#app/modifier/modifier"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "./battle-phase"; + +export class MoneyRewardPhase extends BattlePhase { + private moneyMultiplier: number; + + constructor(scene: BattleScene, moneyMultiplier: number) { + super(scene); + + this.moneyMultiplier = moneyMultiplier; + } + + start() { + const moneyAmount = new Utils.IntegerHolder(this.scene.getWaveMoneyAmount(this.moneyMultiplier)); + + this.scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + + if (this.scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + moneyAmount.value *= 2; + } + + this.scene.addMoney(moneyAmount.value); + + const userLocale = navigator.language || "en-US"; + const formattedMoneyAmount = moneyAmount.value.toLocaleString(userLocale); + const message = i18next.t("battle:moneyWon", { moneyAmount: formattedMoneyAmount }); + + this.scene.ui.showText(message, null, () => this.end(), null, true); + } +} diff --git a/src/phases/move-anim-test-phase.ts b/src/phases/move-anim-test-phase.ts new file mode 100644 index 00000000000..2d3b54bfd9a --- /dev/null +++ b/src/phases/move-anim-test-phase.ts @@ -0,0 +1,44 @@ +import BattleScene from "#app/battle-scene"; +import { initMoveAnim, loadMoveAnimAssets, MoveAnim } from "#app/data/battle-anims"; +import { allMoves, SelfStatusMove } from "#app/data/move"; +import { Moves } from "#app/enums/moves"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "./battle-phase"; + +export class MoveAnimTestPhase extends BattlePhase { + private moveQueue: Moves[]; + + constructor(scene: BattleScene, moveQueue?: Moves[]) { + super(scene); + + this.moveQueue = moveQueue || Utils.getEnumValues(Moves).slice(1); + } + + start() { + const moveQueue = this.moveQueue.slice(0); + this.playMoveAnim(moveQueue, true); + } + + playMoveAnim(moveQueue: Moves[], player: boolean) { + const moveId = player ? moveQueue[0] : moveQueue.shift(); + if (moveId === undefined) { + this.playMoveAnim(this.moveQueue.slice(0), true); + return; + } else if (player) { + console.log(Moves[moveId]); + } + + initMoveAnim(this.scene, moveId).then(() => { + loadMoveAnimAssets(this.scene, [moveId], true) + .then(() => { + new MoveAnim(moveId, player ? this.scene.getPlayerPokemon()! : this.scene.getEnemyPokemon()!, (player !== (allMoves[moveId] instanceof SelfStatusMove) ? this.scene.getEnemyPokemon()! : this.scene.getPlayerPokemon()!).getBattlerIndex()).play(this.scene, () => { // TODO: are the bangs correct here? + if (player) { + this.playMoveAnim(moveQueue, false); + } else { + this.playMoveAnim(moveQueue, true); + } + }); + }); + }); + } +} diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts new file mode 100644 index 00000000000..fb2b82ada03 --- /dev/null +++ b/src/phases/move-effect-phase.ts @@ -0,0 +1,445 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr } from "#app/data/ability"; +import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag"; +import { MoveAnim } from "#app/data/battle-anims"; +import { BattlerTagLapseType, ProtectedTag, SemiInvulnerableTag } from "#app/data/battler-tags"; +import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr } from "#app/data/move"; +import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import Pokemon, { PokemonMove, MoveResult, HitResult } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { PokemonMultiHitModifier, FlinchChanceModifier, EnemyAttackStatusEffectChanceModifier, ContactHeldItemTransferChanceModifier, HitHealModifier } from "#app/modifier/modifier"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { PokemonPhase } from "./pokemon-phase"; + +export class MoveEffectPhase extends PokemonPhase { + public move: PokemonMove; + protected targets: BattlerIndex[]; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove) { + super(scene, battlerIndex); + this.move = move; + /** + * In double battles, if the right Pokemon selects a spread move and the left Pokemon dies + * with no party members available to switch in, then the right Pokemon takes the index + * of the left Pokemon and gets hit unless this is checked. + */ + if (targets.includes(battlerIndex) && this.move.getMove().moveTarget === MoveTarget.ALL_NEAR_OTHERS) { + const i = targets.indexOf(battlerIndex); + targets.splice(i, i + 1); + } + this.targets = targets; + } + + start() { + super.start(); + + /** The Pokemon using this phase's invoked move */ + const user = this.getUserPokemon(); + /** All Pokemon targeted by this phase's invoked move */ + const targets = this.getTargets(); + + /** If the user was somehow removed from the field, end this phase */ + if (!user?.isOnField()) { + return super.end(); + } + + /** + * Does an effect from this move override other effects on this turn? + * e.g. Charging moves (Fly, etc.) on their first turn of use. + */ + const overridden = new Utils.BooleanHolder(false); + /** The {@linkcode Move} object from {@linkcode allMoves} invoked by this phase */ + const move = this.move.getMove(); + + // Assume single target for override + applyMoveAttrs(OverrideMoveEffectAttr, user, this.getTarget() ?? null, move, overridden, this.move.virtual).then(() => { + // If other effects were overriden, stop this phase before they can be applied + if (overridden.value) { + return this.end(); + } + + user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); + + /** + * If this phase is for the first hit of the invoked move, + * resolve the move's total hit count. This block combines the + * effects of the move itself, Parental Bond, and Multi-Lens to do so. + */ + if (user.turnData.hitsLeft === undefined) { + const hitCount = new Utils.IntegerHolder(1); + // Assume single target for multi hit + applyMoveAttrs(MultiHitAttr, user, this.getTarget() ?? null, move, hitCount); + // If Parental Bond is applicable, double the hit count + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, targets.length, hitCount, new Utils.IntegerHolder(0)); + // If Multi-Lens is applicable, multiply the hit count by 1 + the number of Multi-Lenses held by the user + if (move instanceof AttackMove && !move.hasAttr(FixedDamageAttr)) { + this.scene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, hitCount, new Utils.IntegerHolder(0)); + } + // Set the user's relevant turnData fields to reflect the final hit count + user.turnData.hitCount = hitCount.value; + user.turnData.hitsLeft = hitCount.value; + } + + /** + * Log to be entered into the user's move history once the move result is resolved. + * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully + * used in the sense of "Does it have an effect on the user?". + */ + const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; + + /** + * Stores results of hit checks of the invoked move against all targets, organized by battler index. + * @see {@linkcode hitCheck} + */ + const targetHitChecks = Object.fromEntries(targets.map(p => [p.getBattlerIndex(), this.hitCheck(p)])); + const hasActiveTargets = targets.some(t => t.isActive(true)); + /** + * If no targets are left for the move to hit (FAIL), or the invoked move is single-target + * (and not random target) and failed the hit check against its target (MISS), log the move + * as FAILed or MISSed (depending on the conditions above) and end this phase. + */ + if (!hasActiveTargets || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]])) { + this.stopMultiHit(); + if (hasActiveTargets) { + this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getTarget()? getPokemonNameWithAffix(this.getTarget()!) : "" })); + moveHistoryEntry.result = MoveResult.MISS; + applyMoveAttrs(MissEffectAttr, user, null, move); + } else { + this.scene.queueMessage(i18next.t("battle:attackFailed")); + moveHistoryEntry.result = MoveResult.FAIL; + } + user.pushMoveHistory(moveHistoryEntry); + return this.end(); + } + + /** All move effect attributes are chained together in this array to be applied asynchronously. */ + const applyAttrs: Promise[] = []; + + // Move animation only needs one target + new MoveAnim(move.id as Moves, user, this.getTarget()?.getBattlerIndex()!).play(this.scene, () => { // TODO: is the bang correct here? + /** Has the move successfully hit a target (for damage) yet? */ + let hasHit: boolean = false; + for (const target of targets) { + /** + * If the move missed a target, stop all future hits against that target + * and move on to the next target (if there is one). + */ + if (!targetHitChecks[target.getBattlerIndex()]) { + this.stopMultiHit(target); + this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + if (moveHistoryEntry.result === MoveResult.PENDING) { + moveHistoryEntry.result = MoveResult.MISS; + } + user.pushMoveHistory(moveHistoryEntry); + applyMoveAttrs(MissEffectAttr, user, null, move); + continue; + } + + /** The {@linkcode ArenaTagSide} to which the target belongs */ + const targetSide = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + /** Has the invoked move been cancelled by conditional protection (e.g Quick Guard)? */ + const hasConditionalProtectApplied = new Utils.BooleanHolder(false); + /** Does the applied conditional protection bypass Protect-ignoring effects? */ + const bypassIgnoreProtect = new Utils.BooleanHolder(false); + // If the move is not targeting a Pokemon on the user's side, try to apply conditional protection effects + if (!this.move.getMove().isAllyTarget()) { + this.scene.arena.applyTagsForSide(ConditionalProtectTag, targetSide, hasConditionalProtectApplied, user, target, move.id, bypassIgnoreProtect); + } + + /** Is the target protected by Protect, etc. or a relevant conditional protection effect? */ + const isProtected = (bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) + && (hasConditionalProtectApplied.value || target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType))); + + /** Does this phase represent the invoked move's first strike? */ + const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); + + // Only log the move's result on the first strike + if (firstHit) { + user.pushMoveHistory(moveHistoryEntry); + } + + /** + * Since all fail/miss checks have applied, the move is considered successfully applied. + * It's worth noting that if the move has no effect or is protected against, this assignment + * is overwritten and the move is logged as a FAIL. + */ + moveHistoryEntry.result = MoveResult.SUCCESS; + + /** + * Stores the result of applying the invoked move to the target. + * If the target is protected, the result is always `NO_EFFECT`. + * Otherwise, the hit result is based on type effectiveness, immunities, + * and other factors that may negate the attack or status application. + * + * Internally, the call to {@linkcode Pokemon.apply} is where damage is calculated + * (for attack moves) and the target's HP is updated. However, this isn't + * made visible to the user until the resulting {@linkcode DamagePhase} + * is invoked. + */ + const hitResult = !isProtected ? target.apply(user, move) : HitResult.NO_EFFECT; + + /** Does {@linkcode hitResult} indicate that damage was dealt to the target? */ + const dealsDamage = [ + HitResult.EFFECTIVE, + HitResult.SUPER_EFFECTIVE, + HitResult.NOT_VERY_EFFECTIVE, + HitResult.ONE_HIT_KO + ].includes(hitResult); + + /** Is this target the first one hit by the move on its current strike? */ + const firstTarget = dealsDamage && !hasHit; + if (firstTarget) { + hasHit = true; + } + + /** + * If the move has no effect on the target (i.e. the target is protected or immune), + * change the logged move result to FAIL. + */ + if (hitResult === HitResult.NO_EFFECT) { + moveHistoryEntry.result = MoveResult.FAIL; + } + + /** Does this phase represent the invoked move's last strike? */ + const lastHit = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()); + + /** + * If the user can change forms by using the invoked move, + * it only changes forms after the move's last hit + * (see Relic Song's interaction with Parental Bond when used by Meloetta). + */ + if (lastHit) { + this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); + } + + /** + * Create a Promise that applys *all* effects from the invoked move's MoveEffectAttrs. + * These are ordered by trigger type (see {@linkcode MoveEffectTrigger}), and each trigger + * type requires different conditions to be met with respect to the move's hit result. + */ + applyAttrs.push(new Promise(resolve => { + // Apply all effects with PRE_MOVE triggers (if the target isn't immune to the move) + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && hitResult !== HitResult.NO_EFFECT, + user, target, move).then(() => { + // All other effects require the move to not have failed or have been cancelled to trigger + if (hitResult !== HitResult.FAIL) { + /** Are the move's effects tied to the first turn of a charge move? */ + const chargeEffect = !!move.getAttrs(ChargeAttr).find(ca => ca.usedChargeEffect(user, this.getTarget() ?? null, move)); + /** + * If the invoked move's effects are meant to trigger during the move's "charge turn," + * ignore all effects after this point. + * Otherwise, apply all self-targeted POST_APPLY effects. + */ + Utils.executeIf(!chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY + && attr.selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, move)).then(() => { + // All effects past this point require the move to have hit the target + if (hitResult !== HitResult.NO_EFFECT) { + // Apply all non-self-targeted POST_APPLY effects + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_APPLY + && !(attr as MoveEffectAttr).selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()).then(() => { + /** + * If the move hit, and the target doesn't have Shield Dust, + * apply the chance to flinch the target gained from King's Rock + */ + if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr)) { + const flinched = new Utils.BooleanHolder(false); + user.scene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); + if (flinched.value) { + target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); + } + } + // If the move was not protected against, apply all HIT effects + Utils.executeIf(!isProtected && !chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.HIT + && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && (!attr.firstTargetOnly || firstTarget), user, target, this.move.getMove()).then(() => { + // Apply the target's post-defend ability effects (as long as the target is active or can otherwise apply them) + return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult).then(() => { + // If the invoked move is an enemy attack, apply the enemy's status effect-inflicting tags and tokens + target.lapseTag(BattlerTagType.BEAK_BLAST_CHARGING); + if (move.category === MoveCategory.PHYSICAL && user.isPlayer() !== target.isPlayer()) { + target.lapseTag(BattlerTagType.SHELL_TRAP); + } + if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { + user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); + } + })).then(() => { + // Apply the user's post-attack ability effects + applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult).then(() => { + /** + * If the invoked move is an attack, apply the user's chance to + * steal an item from the target granted by Grip Claw + */ + if (this.move.getMove() instanceof AttackMove) { + this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); + } + resolve(); + }); + }); + }) + ).then(() => resolve()); + }); + } else { + applyMoveAttrs(NoEffectAttr, user, null, move).then(() => resolve()); + } + }); + } else { + resolve(); + } + }); + })); + } + // Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved + const postTarget = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()) ? + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : + null; + + if (!!postTarget) { + if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after + applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); + } else { // Otherwise, push a new asynchronous move effect + applyAttrs.push(postTarget); + } + } + + // Wait for all move effects to finish applying, then end this phase + Promise.allSettled(applyAttrs).then(() => this.end()); + }); + }); + } + + end() { + const user = this.getUserPokemon(); + /** + * If this phase isn't for the invoked move's last strike, + * unshift another MoveEffectPhase for the next strike. + * Otherwise, queue a message indicating the number of times the move has struck + * (if the move has struck more than once), then apply the heal from Shell Bell + * to the user. + */ + if (user) { + if (user.turnData.hitsLeft && --user.turnData.hitsLeft >= 1 && this.getTarget()?.isActive()) { + this.scene.unshiftPhase(this.getNewHitPhase()); + } else { + // Queue message for number of hits made by multi-move + // If multi-hit attack only hits once, still want to render a message + const hitsTotal = user.turnData.hitCount! - Math.max(user.turnData.hitsLeft!, 0); // TODO: are those bangs correct? + if (hitsTotal > 1 || (user.turnData.hitsLeft && user.turnData.hitsLeft > 0)) { + // If there are multiple hits, or if there are hits of the multi-hit move left + this.scene.queueMessage(i18next.t("battle:attackHitsCount", { count: hitsTotal })); + } + this.scene.applyModifiers(HitHealModifier, this.player, user); + } + } + + super.end(); + } + + /** + * Resolves whether this phase's invoked move hits or misses the given target + * @param target {@linkcode Pokemon} the Pokemon targeted by the invoked move + * @returns `true` if the move does not miss the target; `false` otherwise + */ + hitCheck(target: Pokemon): boolean { + // Moves targeting the user and entry hazards can't miss + if ([MoveTarget.USER, MoveTarget.ENEMY_SIDE].includes(this.move.getMove().moveTarget)) { + return true; + } + + const user = this.getUserPokemon()!; // TODO: is this bang correct? + + // Hit check only calculated on first hit for multi-hit moves unless flag is set to check all hits. + // However, if an ability with the MaxMultiHitAbAttr, namely Skill Link, is present, act as a normal + // multi-hit move and proceed with all hits + if (user.turnData.hitsLeft < user.turnData.hitCount) { + if (!this.move.getMove().hasFlag(MoveFlags.CHECK_ALL_HITS) || user.hasAbilityWithAttr(MaxMultiHitAbAttr)) { + return true; + } + } + + if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { + return true; + } + + // If the user should ignore accuracy on a target, check who the user targeted last turn and see if they match + if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + return true; + } + + if (target.getTag(BattlerTagType.ALWAYS_GET_HIT)) { + return true; + } + + const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); + if (semiInvulnerableTag && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType)) { + return false; + } + + const moveAccuracy = this.move.getMove().calculateBattleAccuracy(user, target); + + if (moveAccuracy === -1) { + return true; + } + + const accuracyMultiplier = user.getAccuracyMultiplier(target, this.move.getMove()); + const rand = user.randSeedInt(100); + + return rand < (moveAccuracy * accuracyMultiplier); + } + + /** Returns the {@linkcode Pokemon} using this phase's invoked move */ + getUserPokemon(): Pokemon | undefined { + if (this.battlerIndex > BattlerIndex.ENEMY_2) { + return this.scene.getPokemonById(this.battlerIndex) ?? undefined; + } + return (this.player ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.fieldIndex]; + } + + /** Returns an array of all {@linkcode Pokemon} targeted by this phase's invoked move */ + getTargets(): Pokemon[] { + return this.scene.getField(true).filter(p => this.targets.indexOf(p.getBattlerIndex()) > -1); + } + + /** Returns the first target of this phase's invoked move */ + getTarget(): Pokemon | undefined { + return this.getTargets()[0]; + } + + /** + * Removes the given {@linkcode Pokemon} from this phase's target list + * @param target {@linkcode Pokemon} the Pokemon to be removed + */ + removeTarget(target: Pokemon): void { + const targetIndex = this.targets.findIndex(ind => ind === target.getBattlerIndex()); + if (targetIndex !== -1) { + this.targets.splice(this.targets.findIndex(ind => ind === target.getBattlerIndex()), 1); + } + } + + /** + * Prevents subsequent strikes of this phase's invoked move from occurring + * @param target {@linkcode Pokemon} if defined, only stop subsequent + * strikes against this Pokemon + */ + stopMultiHit(target?: Pokemon): void { + /** If given a specific target, remove the target from subsequent strikes */ + if (target) { + this.removeTarget(target); + } + /** + * If no target specified, or the specified target was the last of this move's + * targets, completely cancel all subsequent strikes. + */ + if (!target || this.targets.length === 0 ) { + this.getUserPokemon()!.turnData.hitCount = 1; // TODO: is the bang correct here? + this.getUserPokemon()!.turnData.hitsLeft = 1; // TODO: is the bang correct here? + } + } + + /** Returns a new MoveEffectPhase with the same properties as this phase */ + getNewHitPhase() { + return new MoveEffectPhase(this.scene, this.battlerIndex, this.targets, this.move); + } +} diff --git a/src/phases/move-end-phase.ts b/src/phases/move-end-phase.ts new file mode 100644 index 00000000000..e03f2ec14b0 --- /dev/null +++ b/src/phases/move-end-phase.ts @@ -0,0 +1,23 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { BattlerTagLapseType } from "#app/data/battler-tags"; +import { PokemonPhase } from "./pokemon-phase"; + +export class MoveEndPhase extends PokemonPhase { + constructor(scene: BattleScene, battlerIndex: BattlerIndex) { + super(scene, battlerIndex); + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + if (pokemon.isActive(true)) { + pokemon.lapseTags(BattlerTagLapseType.AFTER_MOVE); + } + + this.scene.arena.setIgnoreAbilities(false); + + this.end(); + } +} diff --git a/src/phases/move-header-phase.ts b/src/phases/move-header-phase.ts new file mode 100644 index 00000000000..c307ff0be6e --- /dev/null +++ b/src/phases/move-header-phase.ts @@ -0,0 +1,30 @@ +import BattleScene from "#app/battle-scene"; +import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/move"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import { BattlePhase } from "./battle-phase"; + +export class MoveHeaderPhase extends BattlePhase { + public pokemon: Pokemon; + public move: PokemonMove; + + constructor(scene: BattleScene, pokemon: Pokemon, move: PokemonMove) { + super(scene); + + this.pokemon = pokemon; + this.move = move; + } + + canMove(): boolean { + return this.pokemon.isActive(true) && this.move.isUsable(this.pokemon); + } + + start() { + super.start(); + + if (this.canMove()) { + applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()).then(() => this.end()); + } else { + this.end(); + } + } +} diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts new file mode 100644 index 00000000000..8209bdd44d1 --- /dev/null +++ b/src/phases/move-phase.ts @@ -0,0 +1,326 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr } from "#app/data/ability"; +import { CommonAnim } from "#app/data/battle-anims"; +import { BattlerTagLapseType, CenterOfAttentionTag } from "#app/data/battler-tags"; +import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move"; +import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; +import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; +import { Type } from "#app/data/type"; +import { getTerrainBlockMessage } from "#app/data/weather"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import { StatusEffect } from "#app/enums/status-effect"; +import { MoveUsedEvent } from "#app/events/battle-scene"; +import Pokemon, { MoveResult, PokemonMove, TurnMove } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import * as Utils from "#app/utils"; +import i18next from "i18next"; +import { BattlePhase } from "./battle-phase"; +import { CommonAnimPhase } from "./common-anim-phase"; +import { MoveEffectPhase } from "./move-effect-phase"; +import { MoveEndPhase } from "./move-end-phase"; +import { ShowAbilityPhase } from "./show-ability-phase"; + +export class MovePhase extends BattlePhase { + public pokemon: Pokemon; + public move: PokemonMove; + public targets: BattlerIndex[]; + protected followUp: boolean; + protected ignorePp: boolean; + protected failed: boolean; + protected cancelled: boolean; + + constructor(scene: BattleScene, pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp?: boolean, ignorePp?: boolean) { + super(scene); + + this.pokemon = pokemon; + this.targets = targets; + this.move = move; + this.followUp = followUp ?? false; + this.ignorePp = ignorePp ?? false; + this.failed = false; + this.cancelled = false; + } + + canMove(ignoreDisableTags?: boolean): boolean { + return this.pokemon.isActive(true) && this.move.isUsable(this.pokemon, this.ignorePp, ignoreDisableTags) && !!this.targets.length; + } + + /**Signifies the current move should fail but still use PP */ + fail(): void { + this.failed = true; + } + + /**Signifies the current move should cancel and retain PP */ + cancel(): void { + this.cancelled = true; + } + + start() { + super.start(); + + console.log(Moves[this.move.moveId]); + + if (!this.canMove(true)) { + if (this.pokemon.isActive(true) && this.move.ppUsed >= this.move.getMovePp()) { // if the move PP was reduced from Spite or otherwise, the move fails + this.fail(); + this.showMoveText(); + this.showFailedText(); + } + return this.end(); + } + + if (!this.followUp) { + if (this.move.getMove().checkFlag(MoveFlags.IGNORE_ABILITIES, this.pokemon, null)) { + this.scene.arena.setIgnoreAbilities(); + } + } else { + this.pokemon.turnData.hitsLeft = 0; // TODO: is `0` correct? + this.pokemon.turnData.hitCount = 0; // TODO: is `0` correct? + } + + // Move redirection abilities (ie. Storm Drain) only support single target moves + const moveTarget = this.targets.length === 1 + ? new Utils.IntegerHolder(this.targets[0]) + : null; + if (moveTarget) { + const oldTarget = moveTarget.value; + this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, false, this.move.moveId, moveTarget)); + this.pokemon.getOpponents().forEach(p => { + const redirectTag = p.getTag(CenterOfAttentionTag) as CenterOfAttentionTag; + if (redirectTag && (!redirectTag.powder || (!this.pokemon.isOfType(Type.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT)))) { + moveTarget.value = p.getBattlerIndex(); + } + }); + //Check if this move is immune to being redirected, and restore its target to the intended target if it is. + if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) || this.move.getMove().hasAttr(BypassRedirectAttr))) { + //If an ability prevented this move from being redirected, display its ability pop up. + if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) && !this.move.getMove().hasAttr(BypassRedirectAttr)) && oldTarget !== moveTarget.value) { + this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr))); + } + moveTarget.value = oldTarget; + } + this.targets[0] = moveTarget.value; + } + + // Check for counterattack moves to switch target + if (this.targets.length === 1 && this.targets[0] === BattlerIndex.ATTACKER) { + if (this.pokemon.turnData.attacksReceived.length) { + const attack = this.pokemon.turnData.attacksReceived[0]; + this.targets[0] = attack.sourceBattlerIndex; + + // account for metal burst and comeuppance hitting remaining targets in double battles + // counterattack will redirect to remaining ally if original attacker faints + if (this.scene.currentBattle.double && this.move.getMove().hasFlag(MoveFlags.REDIRECT_COUNTER)) { + if (this.scene.getField()[this.targets[0]].hp === 0) { + const opposingField = this.pokemon.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField(); + //@ts-ignore + this.targets[0] = opposingField.find(p => p.hp > 0)?.getBattlerIndex(); //TODO: fix ts-ignore + } + } + } + if (this.targets[0] === BattlerIndex.ATTACKER) { + this.fail(); // Marks the move as failed for later in doMove + this.showMoveText(); + this.showFailedText(); + } + } + + const targets = this.scene.getField(true).filter(p => { + if (this.targets.indexOf(p.getBattlerIndex()) > -1) { + return true; + } + return false; + }); + + const doMove = () => { + this.pokemon.turnData.acted = true; // Record that the move was attempted, even if it fails + + this.pokemon.lapseTags(BattlerTagLapseType.PRE_MOVE); + + let ppUsed = 1; + // Filter all opponents to include only those this move is targeting + const targetedOpponents = this.pokemon.getOpponents().filter(o => this.targets.includes(o.getBattlerIndex())); + for (const opponent of targetedOpponents) { + if (this.move.ppUsed + ppUsed >= this.move.getMovePp()) { // If we're already at max PP usage, stop checking + break; + } + if (opponent.hasAbilityWithAttr(IncreasePpAbAttr)) { // Accounting for abilities like Pressure + ppUsed++; + } + } + + if (!this.followUp && this.canMove() && !this.cancelled) { + this.pokemon.lapseTags(BattlerTagLapseType.MOVE); + } + + const moveQueue = this.pokemon.getMoveQueue(); + if (this.cancelled || this.failed) { + if (this.failed) { + this.move.usePp(ppUsed); // Only use PP if the move failed + this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), this.move.ppUsed)); + } + + // Record a failed move so Abilities like Truant don't trigger next turn and soft-lock + this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); + + this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); // Remove any tags from moves like Fly/Dive/etc. + moveQueue.shift(); // Remove the second turn of charge moves + return this.end(); + } + + this.scene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger); + + if (this.move.moveId) { + this.showMoveText(); + } + + // This should only happen when there are no valid targets left on the field + if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || !targets.length) { + this.showFailedText(); + this.cancel(); + + // Record a failed move so Abilities like Truant don't trigger next turn and soft-lock + this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); + + this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); // Remove any tags from moves like Fly/Dive/etc. + + moveQueue.shift(); + return this.end(); + } + + 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)); + } + + if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { + this.scene.currentBattle.lastMove = this.move.moveId; + } + + // Assume conditions affecting targets only apply to moves with a single target + let success = this.move.getMove().applyConditions(this.pokemon, targets[0], this.move.getMove()); + const cancelled = new Utils.BooleanHolder(false); + let failedText = this.move.getMove().getFailedText(this.pokemon, targets[0], this.move.getMove(), cancelled); + if (success && this.scene.arena.isMoveWeatherCancelled(this.move.getMove())) { + success = false; + } else if (success && this.scene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, this.move.getMove())) { + success = false; + if (failedText === null) { + failedText = getTerrainBlockMessage(targets[0], this.scene.arena.terrain?.terrainType!); // TODO: is this bang correct? + } + } + + /** + * Trigger pokemon type change before playing the move animation + * Will still change the user's type when using Roar, Whirlwind, Trick-or-Treat, and Forest's Curse, + * regardless of whether the move successfully executes or not. + */ + if (success || [Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE].includes(this.move.moveId)) { + applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); + } + + if (success) { + this.scene.unshiftPhase(this.getEffectPhase()); + } else { + this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); + if (!cancelled.value) { + this.showFailedText(failedText); + } + } + // Checks if Dancer ability is triggered + if (this.move.getMove().hasFlag(MoveFlags.DANCE_MOVE) && !this.followUp) { + // Pokemon with Dancer can be on either side of the battle so we check in both cases + this.scene.getPlayerField().forEach(pokemon => { + applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets); + }); + this.scene.getEnemyField().forEach(pokemon => { + applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets); + }); + } + this.end(); + }; + + if (!this.followUp && this.pokemon.status && !this.pokemon.status.isPostTurn()) { + this.pokemon.status.incrementTurn(); + let activated = false; + let healed = false; + + switch (this.pokemon.status.effect) { + case StatusEffect.PARALYSIS: + if (!this.pokemon.randSeedInt(4)) { + activated = true; + this.cancelled = true; + } + break; + case StatusEffect.SLEEP: + applyMoveAttrs(BypassSleepAttr, this.pokemon, null, this.move.getMove()); + healed = this.pokemon.status.turnCount === this.pokemon.status.cureTurn; + activated = !healed && !this.pokemon.getTag(BattlerTagType.BYPASS_SLEEP); + this.cancelled = activated; + break; + case StatusEffect.FREEZE: + healed = !!this.move.getMove().findAttr(attr => attr instanceof HealStatusEffectAttr && attr.selfTarget && attr.isOfEffect(StatusEffect.FREEZE)) || !this.pokemon.randSeedInt(5); + activated = !healed; + this.cancelled = activated; + break; + } + + if (activated) { + this.scene.queueMessage(getStatusEffectActivationText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); + this.scene.unshiftPhase(new CommonAnimPhase(this.scene, this.pokemon.getBattlerIndex(), undefined, CommonAnim.POISON + (this.pokemon.status.effect - 1))); + doMove(); + } else { + if (healed) { + this.scene.queueMessage(getStatusEffectHealText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); + this.pokemon.resetStatus(); + this.pokemon.updateInfo(); + } + doMove(); + } + } else { + doMove(); + } + } + + getEffectPhase(): MoveEffectPhase { + return new MoveEffectPhase(this.scene, this.pokemon.getBattlerIndex(), this.targets, this.move); + } + + showMoveText(): void { + if (this.move.getMove().hasAttr(ChargeAttr)) { + const lastMove = this.pokemon.getLastXMoves() as TurnMove[]; + if (!lastMove.length || lastMove[0].move !== this.move.getMove().id || lastMove[0].result !== MoveResult.OTHER) { + this.scene.queueMessage(i18next.t("battle:useMove", { + pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), + moveName: this.move.getName() + }), 500); + return; + } + } + + if (this.pokemon.getTag(BattlerTagType.RECHARGING || BattlerTagType.INTERRUPTED)) { + return; + } + + this.scene.queueMessage(i18next.t("battle:useMove", { + pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), + moveName: this.move.getName() + }), 500); + applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents().find(() => true)!, this.move.getMove()); //TODO: is the bang correct here? + } + + showFailedText(failedText: string | null = null): void { + this.scene.queueMessage(failedText || i18next.t("battle:attackFailed")); + } + + end() { + if (!this.followUp && this.canMove()) { + this.scene.unshiftPhase(new MoveEndPhase(this.scene, this.pokemon.getBattlerIndex())); + } + + super.end(); + } +} diff --git a/src/phases/new-battle-phase.ts b/src/phases/new-battle-phase.ts new file mode 100644 index 00000000000..5a422c9e6c7 --- /dev/null +++ b/src/phases/new-battle-phase.ts @@ -0,0 +1,11 @@ +import { BattlePhase } from "./battle-phase"; + +export class NewBattlePhase extends BattlePhase { + start() { + super.start(); + + this.scene.newBattle(); + + this.end(); + } +} diff --git a/src/phases/new-biome-encounter-phase.ts b/src/phases/new-biome-encounter-phase.ts new file mode 100644 index 00000000000..9f1209fb7ee --- /dev/null +++ b/src/phases/new-biome-encounter-phase.ts @@ -0,0 +1,38 @@ +import BattleScene from "#app/battle-scene"; +import { applyAbAttrs, PostBiomeChangeAbAttr } from "#app/data/ability"; +import { getRandomWeatherType } from "#app/data/weather"; +import { NextEncounterPhase } from "./next-encounter-phase"; + +export class NewBiomeEncounterPhase extends NextEncounterPhase { + constructor(scene: BattleScene) { + super(scene); + } + + doEncounter(): void { + this.scene.playBgm(undefined, true); + + for (const pokemon of this.scene.getParty()) { + if (pokemon) { + pokemon.resetBattleData(); + } + } + + this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + + for (const pokemon of this.scene.getParty().filter(p => p.isOnField())) { + applyAbAttrs(PostBiomeChangeAbAttr, pokemon, null); + } + + const enemyField = this.scene.getEnemyField(); + this.scene.tweens.add({ + targets: [this.scene.arenaEnemy, enemyField].flat(), + x: "+=300", + duration: 2000, + onComplete: () => { + if (!this.tryOverrideForBattleSpec()) { + this.doEncounterCommon(); + } + } + }); + } +} diff --git a/src/phases/next-encounter-phase.ts b/src/phases/next-encounter-phase.ts new file mode 100644 index 00000000000..d51aa374b6e --- /dev/null +++ b/src/phases/next-encounter-phase.ts @@ -0,0 +1,46 @@ +import BattleScene from "#app/battle-scene"; +import { EncounterPhase } from "./encounter-phase"; + +export class NextEncounterPhase extends EncounterPhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + } + + doEncounter(): void { + this.scene.playBgm(undefined, true); + + for (const pokemon of this.scene.getParty()) { + if (pokemon) { + pokemon.resetBattleData(); + } + } + + this.scene.arenaNextEnemy.setBiome(this.scene.arena.biomeType); + this.scene.arenaNextEnemy.setVisible(true); + + const enemyField = this.scene.getEnemyField(); + this.scene.tweens.add({ + targets: [this.scene.arenaEnemy, this.scene.arenaNextEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.lastEnemyTrainer].flat(), + x: "+=300", + duration: 2000, + onComplete: () => { + this.scene.arenaEnemy.setBiome(this.scene.arena.biomeType); + this.scene.arenaEnemy.setX(this.scene.arenaNextEnemy.x); + this.scene.arenaEnemy.setAlpha(1); + this.scene.arenaNextEnemy.setX(this.scene.arenaNextEnemy.x - 300); + this.scene.arenaNextEnemy.setVisible(false); + if (this.scene.lastEnemyTrainer) { + this.scene.lastEnemyTrainer.destroy(); + } + + if (!this.tryOverrideForBattleSpec()) { + this.doEncounterCommon(); + } + } + }); + } +} diff --git a/src/phases/obtain-status-effect-phase.ts b/src/phases/obtain-status-effect-phase.ts new file mode 100644 index 00000000000..2dfb63d9329 --- /dev/null +++ b/src/phases/obtain-status-effect-phase.ts @@ -0,0 +1,48 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; +import { getStatusEffectObtainText, getStatusEffectOverlapText } from "#app/data/status-effect"; +import { StatusEffect } from "#app/enums/status-effect"; +import Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { PokemonPhase } from "./pokemon-phase"; +import { PostTurnStatusEffectPhase } from "./post-turn-status-effect-phase"; + +export class ObtainStatusEffectPhase extends PokemonPhase { + private statusEffect?: StatusEffect | undefined; + private cureTurn?: integer | null; + private sourceText?: string | null; + private sourcePokemon?: Pokemon | null; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, statusEffect?: StatusEffect, cureTurn?: integer | null, sourceText?: string | null, sourcePokemon?: Pokemon | null) { + super(scene, battlerIndex); + + this.statusEffect = statusEffect; + this.cureTurn = cureTurn; + this.sourceText = sourceText; + this.sourcePokemon = sourcePokemon; // For tracking which Pokemon caused the status effect + } + + start() { + const pokemon = this.getPokemon(); + if (pokemon && !pokemon.status) { + if (pokemon.trySetStatus(this.statusEffect, false, this.sourcePokemon)) { + if (this.cureTurn) { + pokemon.status!.cureTurn = this.cureTurn; // TODO: is this bang correct? + } + pokemon.updateInfo(true); + new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect! - 1), pokemon).play(this.scene, () => { + this.scene.queueMessage(getStatusEffectObtainText(this.statusEffect, getPokemonNameWithAffix(pokemon), this.sourceText ?? undefined)); + if (pokemon.status?.isPostTurn()) { + this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, this.battlerIndex)); + } + this.end(); + }); + return; + } + } else if (pokemon.status?.effect === this.statusEffect) { + this.scene.queueMessage(getStatusEffectOverlapText(this.statusEffect ?? StatusEffect.NONE, getPokemonNameWithAffix(pokemon))); + } + this.end(); + } +} diff --git a/src/phases/outdated-phase.ts b/src/phases/outdated-phase.ts new file mode 100644 index 00000000000..4baf16d2f56 --- /dev/null +++ b/src/phases/outdated-phase.ts @@ -0,0 +1,13 @@ +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; + +export class OutdatedPhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start(): void { + this.scene.ui.setMode(Mode.OUTDATED); + } +} diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts new file mode 100644 index 00000000000..e6ee11202df --- /dev/null +++ b/src/phases/party-heal-phase.ts @@ -0,0 +1,40 @@ +import BattleScene from "#app/battle-scene"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "./battle-phase"; + +export class PartyHealPhase extends BattlePhase { + private resumeBgm: boolean; + + constructor(scene: BattleScene, resumeBgm: boolean) { + super(scene); + + this.resumeBgm = resumeBgm; + } + + start() { + super.start(); + + const bgmPlaying = this.scene.isBgmPlaying(); + if (bgmPlaying) { + this.scene.fadeOutBgm(1000, false); + } + this.scene.ui.fadeOut(1000).then(() => { + for (const pokemon of this.scene.getParty()) { + pokemon.hp = pokemon.getMaxHp(); + pokemon.resetStatus(); + for (const move of pokemon.moveset) { + move!.ppUsed = 0; // TODO: is this bang correct? + } + pokemon.updateInfo(true); + } + const healSong = this.scene.playSoundWithoutBgm("heal"); + this.scene.time.delayedCall(Utils.fixedInt(healSong.totalDuration * 1000), () => { + healSong.destroy(); + if (this.resumeBgm && bgmPlaying) { + this.scene.playBgm(); + } + this.scene.ui.fadeIn(500).then(() => this.end()); + }); + }); + } +} diff --git a/src/phases/party-member-pokemon-phase.ts b/src/phases/party-member-pokemon-phase.ts new file mode 100644 index 00000000000..2b6ca01261d --- /dev/null +++ b/src/phases/party-member-pokemon-phase.ts @@ -0,0 +1,27 @@ +import BattleScene from "#app/battle-scene"; +import Pokemon from "#app/field/pokemon"; +import { FieldPhase } from "./field-phase"; + +export abstract class PartyMemberPokemonPhase extends FieldPhase { + protected partyMemberIndex: integer; + protected fieldIndex: integer; + protected player: boolean; + + constructor(scene: BattleScene, partyMemberIndex: integer, player: boolean) { + super(scene); + + this.partyMemberIndex = partyMemberIndex; + this.fieldIndex = partyMemberIndex < this.scene.currentBattle.getBattlerCount() + ? partyMemberIndex + : -1; + this.player = player; + } + + getParty(): Pokemon[] { + return this.player ? this.scene.getParty() : this.scene.getEnemyParty(); + } + + getPokemon(): Pokemon { + return this.getParty()[this.partyMemberIndex]; + } +} diff --git a/src/phases/party-status-cure-phase.ts b/src/phases/party-status-cure-phase.ts new file mode 100644 index 00000000000..e4903c7fc1f --- /dev/null +++ b/src/phases/party-status-cure-phase.ts @@ -0,0 +1,48 @@ +import BattleScene from "#app/battle-scene"; +import { Abilities } from "#app/enums/abilities"; +import Pokemon from "#app/field/pokemon"; +import { BattlePhase } from "./battle-phase"; +import { ShowAbilityPhase } from "./show-ability-phase"; + +/** + * Cures the party of all non-volatile status conditions, shows a message + * @param {BattleScene} scene The current scene + * @param {Pokemon} user The user of the move that cures the party + * @param {string} message The message that should be displayed + * @param {Abilities} abilityCondition Pokemon with this ability will not be affected ie. Soundproof + */ +export class PartyStatusCurePhase extends BattlePhase { + private user: Pokemon; + private message: string; + private abilityCondition: Abilities; + + constructor(scene: BattleScene, user: Pokemon, message: string, abilityCondition: Abilities) { + super(scene); + + this.user = user; + this.message = message; + this.abilityCondition = abilityCondition; + } + + start() { + super.start(); + for (const pokemon of this.scene.getParty()) { + if (!pokemon.isOnField() || pokemon === this.user) { + pokemon.resetStatus(false); + pokemon.updateInfo(true); + } else { + if (!pokemon.hasAbility(this.abilityCondition)) { + pokemon.resetStatus(); + pokemon.updateInfo(true); + } else { + // Manually show ability bar, since we're not hooked into the targeting system + pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, pokemon.getPassiveAbility()?.id === this.abilityCondition)); + } + } + } + if (this.message) { + this.scene.queueMessage(this.message); + } + this.end(); + } +} diff --git a/src/phases/player-party-member-pokemon-phase.ts b/src/phases/player-party-member-pokemon-phase.ts new file mode 100644 index 00000000000..87855b9334c --- /dev/null +++ b/src/phases/player-party-member-pokemon-phase.ts @@ -0,0 +1,13 @@ +import BattleScene from "#app/battle-scene"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; + +export abstract class PlayerPartyMemberPokemonPhase extends PartyMemberPokemonPhase { + constructor(scene: BattleScene, partyMemberIndex: integer) { + super(scene, partyMemberIndex, true); + } + + getPlayerPokemon(): PlayerPokemon { + return super.getPokemon() as PlayerPokemon; + } +} diff --git a/src/phases/pokemon-heal-phase.ts b/src/phases/pokemon-heal-phase.ts new file mode 100644 index 00000000000..49db2641e98 --- /dev/null +++ b/src/phases/pokemon-heal-phase.ts @@ -0,0 +1,104 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { CommonAnim } from "#app/data/battle-anims"; +import { getStatusEffectHealText } from "#app/data/status-effect"; +import { StatusEffect } from "#app/enums/status-effect"; +import { HitResult, DamageResult } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { HealingBoosterModifier } from "#app/modifier/modifier"; +import { HealAchv } from "#app/system/achv"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { CommonAnimPhase } from "./common-anim-phase"; + +export class PokemonHealPhase extends CommonAnimPhase { + private hpHealed: integer; + private message: string | null; + private showFullHpMessage: boolean; + private skipAnim: boolean; + private revive: boolean; + private healStatus: boolean; + private preventFullHeal: boolean; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, hpHealed: integer, message: string | null, showFullHpMessage: boolean, skipAnim: boolean = false, revive: boolean = false, healStatus: boolean = false, preventFullHeal: boolean = false) { + super(scene, battlerIndex, undefined, CommonAnim.HEALTH_UP); + + this.hpHealed = hpHealed; + this.message = message; + this.showFullHpMessage = showFullHpMessage; + this.skipAnim = skipAnim; + this.revive = revive; + this.healStatus = healStatus; + this.preventFullHeal = preventFullHeal; + } + + start() { + if (!this.skipAnim && (this.revive || this.getPokemon().hp) && !this.getPokemon().isFullHp()) { + super.start(); + } else { + this.end(); + } + } + + end() { + const pokemon = this.getPokemon(); + + if (!pokemon.isOnField() || (!this.revive && !pokemon.isActive())) { + super.end(); + return; + } + + const hasMessage = !!this.message; + const healOrDamage = (!pokemon.isFullHp() || this.hpHealed < 0); + let lastStatusEffect = StatusEffect.NONE; + + if (healOrDamage) { + const hpRestoreMultiplier = new Utils.IntegerHolder(1); + if (!this.revive) { + this.scene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); + } + const healAmount = new Utils.NumberHolder(Math.floor(this.hpHealed * hpRestoreMultiplier.value)); + if (healAmount.value < 0) { + pokemon.damageAndUpdate(healAmount.value * -1, HitResult.HEAL as DamageResult); + healAmount.value = 0; + } + // Prevent healing to full if specified (in case of healing tokens so Sturdy doesn't cause a softlock) + if (this.preventFullHeal && pokemon.hp + healAmount.value >= pokemon.getMaxHp()) { + healAmount.value = (pokemon.getMaxHp() - pokemon.hp) - 1; + } + healAmount.value = pokemon.heal(healAmount.value); + if (healAmount.value) { + this.scene.damageNumberHandler.add(pokemon, healAmount.value, HitResult.HEAL); + } + if (pokemon.isPlayer()) { + this.scene.validateAchvs(HealAchv, healAmount); + if (healAmount.value > this.scene.gameData.gameStats.highestHeal) { + this.scene.gameData.gameStats.highestHeal = healAmount.value; + } + } + if (this.healStatus && !this.revive && pokemon.status) { + lastStatusEffect = pokemon.status.effect; + pokemon.resetStatus(); + } + pokemon.updateInfo().then(() => super.end()); + } else if (this.healStatus && !this.revive && pokemon.status) { + lastStatusEffect = pokemon.status.effect; + pokemon.resetStatus(); + pokemon.updateInfo().then(() => super.end()); + } else if (this.showFullHpMessage) { + this.message = i18next.t("battle:hpIsFull", { pokemonName: getPokemonNameWithAffix(pokemon) }); + } + + if (this.message) { + this.scene.queueMessage(this.message); + } + + if (this.healStatus && lastStatusEffect && !hasMessage) { + this.scene.queueMessage(getStatusEffectHealText(lastStatusEffect, getPokemonNameWithAffix(pokemon))); + } + + if (!healOrDamage && !lastStatusEffect) { + super.end(); + } + } +} diff --git a/src/phases/pokemon-phase.ts b/src/phases/pokemon-phase.ts new file mode 100644 index 00000000000..b980c1d1719 --- /dev/null +++ b/src/phases/pokemon-phase.ts @@ -0,0 +1,29 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import Pokemon from "#app/field/pokemon"; +import { FieldPhase } from "./field-phase"; + +export abstract class PokemonPhase extends FieldPhase { + protected battlerIndex: BattlerIndex | integer; + public player: boolean; + public fieldIndex: integer; + + constructor(scene: BattleScene, battlerIndex?: BattlerIndex | integer) { + super(scene); + + if (battlerIndex === undefined) { + battlerIndex = scene.getField().find(p => p?.isActive())!.getBattlerIndex(); // TODO: is the bang correct here? + } + + this.battlerIndex = battlerIndex; + this.player = battlerIndex < 2; + this.fieldIndex = battlerIndex % 2; + } + + getPokemon(): Pokemon { + if (this.battlerIndex > BattlerIndex.ENEMY_2) { + return this.scene.getPokemonById(this.battlerIndex)!; //TODO: is this bang correct? + } + return this.scene.getField()[this.battlerIndex]!; //TODO: is this bang correct? + } +} diff --git a/src/phases/post-game-over-phase.ts b/src/phases/post-game-over-phase.ts new file mode 100644 index 00000000000..beeb30c7260 --- /dev/null +++ b/src/phases/post-game-over-phase.ts @@ -0,0 +1,46 @@ +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { EndCardPhase } from "./end-card-phase"; +import { TitlePhase } from "./title-phase"; + +export class PostGameOverPhase extends Phase { + private endCardPhase: EndCardPhase | null; + + constructor(scene: BattleScene, endCardPhase?: EndCardPhase) { + super(scene); + + this.endCardPhase = endCardPhase!; // TODO: is this bang correct? + } + + start() { + super.start(); + + const saveAndReset = () => { + this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { + if (!success) { + return this.scene.reset(true); + } + this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { + if (!success[0]) { + return this.scene.reset(true); + } + this.scene.reset(); + this.scene.unshiftPhase(new TitlePhase(this.scene)); + this.end(); + }); + }); + }; + + if (this.endCardPhase) { + this.scene.ui.fadeOut(500).then(() => { + this.scene.ui.getMessageHandler().bg.setVisible(true); + + this.endCardPhase?.endCard.destroy(); + this.endCardPhase?.text.destroy(); + saveAndReset(); + }); + } else { + saveAndReset(); + } + } +} diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts new file mode 100644 index 00000000000..47a5513f0eb --- /dev/null +++ b/src/phases/post-summon-phase.ts @@ -0,0 +1,24 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { applyPostSummonAbAttrs, PostSummonAbAttr } from "#app/data/ability"; +import { ArenaTrapTag } from "#app/data/arena-tag"; +import { StatusEffect } from "#app/enums/status-effect"; +import { PokemonPhase } from "./pokemon-phase"; + +export class PostSummonPhase extends PokemonPhase { + constructor(scene: BattleScene, battlerIndex: BattlerIndex) { + super(scene, battlerIndex); + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + + if (pokemon.status?.effect === StatusEffect.TOXIC) { + pokemon.status.turnCount = 0; + } + this.scene.arena.applyTags(ArenaTrapTag, pokemon); + applyPostSummonAbAttrs(PostSummonAbAttr, pokemon).then(() => this.end()); + } +} diff --git a/src/phases/post-turn-status-effect-phase.ts b/src/phases/post-turn-status-effect-phase.ts new file mode 100644 index 00000000000..413f9eae65e --- /dev/null +++ b/src/phases/post-turn-status-effect-phase.ts @@ -0,0 +1,61 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { applyAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability"; +import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; +import { getStatusEffectActivationText } from "#app/data/status-effect"; +import { BattleSpec } from "#app/enums/battle-spec"; +import { StatusEffect } from "#app/enums/status-effect"; +import { getPokemonNameWithAffix } from "#app/messages"; +import * as Utils from "#app/utils"; +import { PokemonPhase } from "./pokemon-phase"; + +export class PostTurnStatusEffectPhase extends PokemonPhase { + constructor(scene: BattleScene, battlerIndex: BattlerIndex) { + super(scene, battlerIndex); + } + + start() { + const pokemon = this.getPokemon(); + if (pokemon?.isActive(true) && pokemon.status && pokemon.status.isPostTurn()) { + pokemon.status.incrementTurn(); + const cancelled = new Utils.BooleanHolder(false); + applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); + applyAbAttrs(BlockStatusDamageAbAttr, pokemon, cancelled); + + if (!cancelled.value) { + this.scene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + const damage = new Utils.NumberHolder(0); + switch (pokemon.status.effect) { + case StatusEffect.POISON: + damage.value = Math.max(pokemon.getMaxHp() >> 3, 1); + break; + case StatusEffect.TOXIC: + damage.value = Math.max(Math.floor((pokemon.getMaxHp() / 16) * pokemon.status.turnCount), 1); + break; + case StatusEffect.BURN: + damage.value = Math.max(pokemon.getMaxHp() >> 4, 1); + applyAbAttrs(ReduceBurnDamageAbAttr, pokemon, null, false, damage); + break; + } + if (damage.value) { + // Set preventEndure flag to avoid pokemon surviving thanks to focus band, sturdy, endure ... + this.scene.damageNumberHandler.add(this.getPokemon(), pokemon.damage(damage.value, false, true)); + pokemon.updateInfo(); + } + new CommonBattleAnim(CommonAnim.POISON + (pokemon.status.effect - 1), pokemon).play(this.scene, () => this.end()); + } else { + this.end(); + } + } else { + this.end(); + } + } + + override end() { + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + this.scene.initFinalBossPhaseTwo(this.getPokemon()); + } else { + super.end(); + } + } +} diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts new file mode 100644 index 00000000000..6a1d31d137d --- /dev/null +++ b/src/phases/quiet-form-change-phase.ts @@ -0,0 +1,133 @@ +import BattleScene from "#app/battle-scene"; +import { SemiInvulnerableTag } from "#app/data/battler-tags"; +import { SpeciesFormChange, getSpeciesFormChangeMessage } from "#app/data/pokemon-forms"; +import { getTypeRgb } from "#app/data/type"; +import { BattleSpec } from "#app/enums/battle-spec"; +import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { BattlePhase } from "./battle-phase"; +import { MovePhase } from "./move-phase"; +import { PokemonHealPhase } from "./pokemon-heal-phase"; + +export class QuietFormChangePhase extends BattlePhase { + protected pokemon: Pokemon; + protected formChange: SpeciesFormChange; + + constructor(scene: BattleScene, pokemon: Pokemon, formChange: SpeciesFormChange) { + super(scene); + this.pokemon = pokemon; + this.formChange = formChange; + } + + start(): void { + super.start(); + + if (this.pokemon.formIndex === this.pokemon.species.forms.findIndex(f => f.formKey === this.formChange.formKey)) { + return this.end(); + } + + const preName = getPokemonNameWithAffix(this.pokemon); + + if (!this.pokemon.isOnField() || this.pokemon.getTag(SemiInvulnerableTag)) { + this.pokemon.changeForm(this.formChange).then(() => { + this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); + }); + return; + } + + const getPokemonSprite = () => { + const sprite = this.scene.addPokemonSprite(this.pokemon, this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, "pkmn__sub"); + sprite.setOrigin(0.5, 1); + sprite.play(this.pokemon.getBattleSpriteKey()).stop(); + sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); + [ "spriteColors", "fusionSpriteColors" ].map(k => { + if (this.pokemon.summonData?.speciesForm) { + k += "Base"; + } + sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; + }); + this.scene.field.add(sprite); + return sprite; + }; + + const [ pokemonTintSprite, pokemonFormTintSprite ] = [ getPokemonSprite(), getPokemonSprite() ]; + + this.pokemon.getSprite().on("animationupdate", (_anim, frame) => { + if (frame.textureKey === pokemonTintSprite.texture.key) { + pokemonTintSprite.setFrame(frame.textureFrame); + } else { + pokemonFormTintSprite.setFrame(frame.textureFrame); + } + }); + + pokemonTintSprite.setAlpha(0); + pokemonTintSprite.setTintFill(0xFFFFFF); + pokemonFormTintSprite.setVisible(false); + pokemonFormTintSprite.setTintFill(0xFFFFFF); + + this.scene.playSound("PRSFX- Transform"); + + this.scene.tweens.add({ + targets: pokemonTintSprite, + alpha: 1, + duration: 1000, + ease: "Cubic.easeIn", + onComplete: () => { + this.pokemon.setVisible(false); + this.pokemon.changeForm(this.formChange).then(() => { + pokemonFormTintSprite.setScale(0.01); + pokemonFormTintSprite.play(this.pokemon.getBattleSpriteKey()).stop(); + pokemonFormTintSprite.setVisible(true); + this.scene.tweens.add({ + targets: pokemonTintSprite, + delay: 250, + scale: 0.01, + ease: "Cubic.easeInOut", + duration: 500, + onComplete: () => pokemonTintSprite.destroy() + }); + this.scene.tweens.add({ + targets: pokemonFormTintSprite, + delay: 250, + scale: this.pokemon.getSpriteScale(), + ease: "Cubic.easeInOut", + duration: 500, + onComplete: () => { + this.pokemon.setVisible(true); + this.scene.tweens.add({ + targets: pokemonFormTintSprite, + delay: 250, + alpha: 0, + ease: "Cubic.easeOut", + duration: 1000, + onComplete: () => { + pokemonTintSprite.setVisible(false); + this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); + } + }); + } + }); + }); + } + }); + } + + end(): void { + if (this.pokemon.scene?.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { + this.scene.playBgm(); + this.scene.unshiftPhase(new PokemonHealPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true)); + this.pokemon.findAndRemoveTags(() => true); + this.pokemon.bossSegments = 5; + this.pokemon.bossSegmentIndex = 4; + this.pokemon.initBattleInfo(); + this.pokemon.cry(); + + const movePhase = this.scene.findPhase(p => p instanceof MovePhase && p.pokemon === this.pokemon) as MovePhase; + if (movePhase) { + movePhase.cancel(); + } + } + + super.end(); + } +} diff --git a/src/phases/reload-session-phase.ts b/src/phases/reload-session-phase.ts new file mode 100644 index 00000000000..f8a38105869 --- /dev/null +++ b/src/phases/reload-session-phase.ts @@ -0,0 +1,39 @@ +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; +import * as Utils from "#app/utils"; + +export class ReloadSessionPhase extends Phase { + private systemDataStr: string | null; + + constructor(scene: BattleScene, systemDataStr?: string) { + super(scene); + + this.systemDataStr = systemDataStr ?? null; + } + + start(): void { + this.scene.ui.setMode(Mode.SESSION_RELOAD); + + let delayElapsed = false; + let loaded = false; + + this.scene.time.delayedCall(Utils.fixedInt(1500), () => { + if (loaded) { + this.end(); + } else { + delayElapsed = true; + } + }); + + this.scene.gameData.clearLocalData(); + + (this.systemDataStr ? this.scene.gameData.initSystem(this.systemDataStr) : this.scene.gameData.loadSystem()).then(() => { + if (delayElapsed) { + this.end(); + } else { + loaded = true; + } + }); + } +} diff --git a/src/phases/return-phase.ts b/src/phases/return-phase.ts new file mode 100644 index 00000000000..dfc458eb817 --- /dev/null +++ b/src/phases/return-phase.ts @@ -0,0 +1,26 @@ +import BattleScene from "#app/battle-scene"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; +import { SwitchSummonPhase } from "./switch-summon-phase"; + +export class ReturnPhase extends SwitchSummonPhase { + constructor(scene: BattleScene, fieldIndex: integer) { + super(scene, fieldIndex, -1, true, false); + } + + switchAndSummon(): void { + this.end(); + } + + summon(): void { } + + onEnd(): void { + const pokemon = this.getPokemon(); + + pokemon.resetTurnData(); + pokemon.resetSummonData(); + + this.scene.updateFieldScale(); + + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger); + } +} diff --git a/src/phases/ribbon-modifier-reward-phase.ts b/src/phases/ribbon-modifier-reward-phase.ts new file mode 100644 index 00000000000..fabb3bfa1b1 --- /dev/null +++ b/src/phases/ribbon-modifier-reward-phase.ts @@ -0,0 +1,33 @@ +import BattleScene from "#app/battle-scene"; +import PokemonSpecies from "#app/data/pokemon-species"; +import { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { ModifierRewardPhase } from "./modifier-reward-phase"; + +export class RibbonModifierRewardPhase extends ModifierRewardPhase { + private species: PokemonSpecies; + + constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc, species: PokemonSpecies) { + super(scene, modifierTypeFunc); + + this.species = species; + } + + doReward(): Promise { + return new Promise(resolve => { + const newModifier = this.modifierType.newModifier(); + this.scene.addModifier(newModifier).then(() => { + this.scene.playSound("level_up_fanfare"); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:beatModeFirstTime", { + speciesName: this.species.name, + gameMode: this.scene.gameMode.getName(), + newModifier: newModifier?.type.name + }), null, () => { + resolve(); + }, null, true, 1500); + }); + }); + } +} diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts new file mode 100644 index 00000000000..ba27e4f1943 --- /dev/null +++ b/src/phases/scan-ivs-phase.ts @@ -0,0 +1,69 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; +import { Stat } from "#app/enums/stat"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { getTextColor, TextStyle } from "#app/ui/text"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { PokemonPhase } from "./pokemon-phase"; + +export class ScanIvsPhase extends PokemonPhase { + private shownIvs: integer; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, shownIvs: integer) { + super(scene, battlerIndex); + + this.shownIvs = shownIvs; + } + + start() { + super.start(); + + if (!this.shownIvs) { + return this.end(); + } + + const pokemon = this.getPokemon(); + + let enemyIvs: number[] = []; + let statsContainer: Phaser.GameObjects.Sprite[] = []; + let statsContainerLabels: Phaser.GameObjects.Sprite[] = []; + const enemyField = this.scene.getEnemyField(); + const uiTheme = (this.scene as BattleScene).uiTheme; // Assuming uiTheme is accessible + for (let e = 0; e < enemyField.length; e++) { + enemyIvs = enemyField[e].ivs; + const currentIvs = this.scene.gameData.dexData[enemyField[e].species.getRootSpeciesId()].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists + const ivsToShow = this.scene.ui.getMessageHandler().getTopIvs(enemyIvs, this.shownIvs); + statsContainer = enemyField[e].getBattleInfo().getStatsValueContainer().list as Phaser.GameObjects.Sprite[]; + statsContainerLabels = statsContainer.filter(m => m.name.indexOf("icon_stat_label") >= 0); + for (let s = 0; s < statsContainerLabels.length; s++) { + const ivStat = Stat[statsContainerLabels[s].frame.name]; + if (enemyIvs[ivStat] > currentIvs[ivStat] && ivsToShow.indexOf(Number(ivStat)) >= 0) { + const hexColour = enemyIvs[ivStat] === 31 ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme); + const hexTextColour = Phaser.Display.Color.HexStringToColor(hexColour).color; + statsContainerLabels[s].setTint(hexTextColour); + } + statsContainerLabels[s].setVisible(true); + } + } + + if (!this.scene.hideIvs) { + this.scene.ui.showText(i18next.t("battle:ivScannerUseQuestion", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { + this.scene.ui.setMode(Mode.CONFIRM, () => { + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.clearText(); + new CommonBattleAnim(CommonAnim.LOCK_ON, pokemon, pokemon).play(this.scene, () => { + this.scene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs, this.shownIvs).then(() => this.end()); + }); + }, () => { + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.clearText(); + this.end(); + }); + }); + } else { + this.end(); + } + } +} diff --git a/src/phases/select-biome-phase.ts b/src/phases/select-biome-phase.ts new file mode 100644 index 00000000000..fe9b5b3996b --- /dev/null +++ b/src/phases/select-biome-phase.ts @@ -0,0 +1,84 @@ +import BattleScene from "#app/battle-scene"; +import { biomeLinks, getBiomeName } from "#app/data/biomes"; +import { Biome } from "#app/enums/biome"; +import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { BattlePhase } from "./battle-phase"; +import * as Utils from "#app/utils"; +import { PartyHealPhase } from "./party-heal-phase"; +import { SwitchBiomePhase } from "./switch-biome-phase"; + +export class SelectBiomePhase extends BattlePhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + const currentBiome = this.scene.arena.biomeType; + + const setNextBiome = (nextBiome: Biome) => { + if (this.scene.currentBattle.waveIndex % 10 === 1) { + this.scene.applyModifiers(MoneyInterestModifier, true, this.scene); + this.scene.unshiftPhase(new PartyHealPhase(this.scene, false)); + } + this.scene.unshiftPhase(new SwitchBiomePhase(this.scene, nextBiome)); + this.end(); + }; + + if ((this.scene.gameMode.isClassic && this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex + 9)) + || (this.scene.gameMode.isDaily && this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) + || (this.scene.gameMode.hasShortBiomes && !(this.scene.currentBattle.waveIndex % 50))) { + setNextBiome(Biome.END); + } else if (this.scene.gameMode.hasRandomBiomes) { + setNextBiome(this.generateNextBiome()); + } else if (Array.isArray(biomeLinks[currentBiome])) { + let biomes: Biome[] = []; + this.scene.executeWithSeedOffset(() => { + biomes = (biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) + .filter(b => !Array.isArray(b) || !Utils.randSeedInt(b[1])) + .map(b => !Array.isArray(b) ? b : b[0]); + }, this.scene.currentBattle.waveIndex); + if (biomes.length > 1 && this.scene.findModifier(m => m instanceof MapModifier)) { + let biomeChoices: Biome[] = []; + this.scene.executeWithSeedOffset(() => { + biomeChoices = (!Array.isArray(biomeLinks[currentBiome]) + ? [biomeLinks[currentBiome] as Biome] + : biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) + .filter((b, i) => !Array.isArray(b) || !Utils.randSeedInt(b[1])) + .map(b => Array.isArray(b) ? b[0] : b); + }, this.scene.currentBattle.waveIndex); + const biomeSelectItems = biomeChoices.map(b => { + const ret: OptionSelectItem = { + label: getBiomeName(b), + handler: () => { + this.scene.ui.setMode(Mode.MESSAGE); + setNextBiome(b); + return true; + } + }; + return ret; + }); + this.scene.ui.setMode(Mode.OPTION_SELECT, { + options: biomeSelectItems, + delay: 1000 + }); + } else { + setNextBiome(biomes[Utils.randSeedInt(biomes.length)]); + } + } else if (biomeLinks.hasOwnProperty(currentBiome)) { + setNextBiome(biomeLinks[currentBiome] as Biome); + } else { + setNextBiome(this.generateNextBiome()); + } + } + + generateNextBiome(): Biome { + if (!(this.scene.currentBattle.waveIndex % 50)) { + return Biome.END; + } + return this.scene.generateRandomBiome(this.scene.currentBattle.waveIndex); + } +} diff --git a/src/phases/select-challenge-phase.ts b/src/phases/select-challenge-phase.ts new file mode 100644 index 00000000000..9450c60fec5 --- /dev/null +++ b/src/phases/select-challenge-phase.ts @@ -0,0 +1,17 @@ +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; + +export class SelectChallengePhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.playBgm("menu"); + + this.scene.ui.setMode(Mode.CHALLENGE_SELECT); + } +} diff --git a/src/phases/select-gender-phase.ts b/src/phases/select-gender-phase.ts new file mode 100644 index 00000000000..7f2c965f1d1 --- /dev/null +++ b/src/phases/select-gender-phase.ts @@ -0,0 +1,46 @@ +import BattleScene from "#app/battle-scene"; +import { PlayerGender } from "#app/enums/player-gender"; +import { Phase } from "#app/phase"; +import { SettingKeys } from "#app/system/settings/settings"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; + +export class SelectGenderPhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start(): void { + super.start(); + + this.scene.ui.showText(i18next.t("menu:boyOrGirl"), null, () => { + this.scene.ui.setMode(Mode.OPTION_SELECT, { + options: [ + { + label: i18next.t("settings:boy"), + handler: () => { + this.scene.gameData.gender = PlayerGender.MALE; + this.scene.gameData.saveSetting(SettingKeys.Player_Gender, 0); + this.scene.gameData.saveSystem().then(() => this.end()); + return true; + } + }, + { + label: i18next.t("settings:girl"), + handler: () => { + this.scene.gameData.gender = PlayerGender.FEMALE; + this.scene.gameData.saveSetting(SettingKeys.Player_Gender, 1); + this.scene.gameData.saveSystem().then(() => this.end()); + return true; + } + } + ] + }); + }); + } + + end(): void { + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + } +} diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts new file mode 100644 index 00000000000..e14638c5dd2 --- /dev/null +++ b/src/phases/select-modifier-phase.ts @@ -0,0 +1,234 @@ +import BattleScene from "#app/battle-scene"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { regenerateModifierPoolThresholds, ModifierTypeOption, ModifierType, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, ModifierPoolType, getPlayerModifierTypeOptions } from "#app/modifier/modifier-type"; +import { ExtraModifierModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; +import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "./battle-phase"; +import Overrides from "#app/overrides"; + +export class SelectModifierPhase extends BattlePhase { + private rerollCount: integer; + private modifierTiers: ModifierTier[]; + + constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[]) { + super(scene); + + this.rerollCount = rerollCount; + this.modifierTiers = modifierTiers!; // TODO: is this bang correct? + } + + start() { + super.start(); + + if (!this.rerollCount) { + this.updateSeed(); + } else { + this.scene.reroll = false; + } + + const party = this.scene.getParty(); + regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); + const modifierCount = new Utils.IntegerHolder(3); + if (this.isPlayer()) { + this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); + } + const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value); + + const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { + if (rowCursor < 0 || cursor < 0) { + this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { + this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { + this.scene.ui.revertMode(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + }, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers))); + }); + return false; + } + let modifierType: ModifierType; + let cost: integer; + switch (rowCursor) { + case 0: + switch (cursor) { + case 0: + const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers); + if (this.scene.money < rerollCost) { + this.scene.ui.playError(); + return false; + } else { + this.scene.reroll = true; + this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type?.tier).filter(t => t !== undefined) as ModifierTier[])); + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + this.scene.money -= rerollCost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + } + this.scene.playSound("se/buy"); + } + break; + case 1: + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { + if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { + const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && m.isTransferrable && m.pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; + const itemModifier = itemModifiers[itemIndex]; + this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, PartyUiHandler.FilterItemMaxStacks); + break; + case 2: + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + }); + break; + case 3: + this.scene.lockModifierTiers = !this.scene.lockModifierTiers; + const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + uiHandler.updateLockRaritiesText(); + uiHandler.updateRerollCostText(); + return false; + } + return true; + case 1: + if (typeOptions[cursor].type) { + modifierType = typeOptions[cursor].type; + } + break; + default: + const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); + const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; + if (shopOption.type) { + modifierType = shopOption.type; + } + cost = shopOption.cost; + break; + } + + if (cost! && (this.scene.money < cost) && !Overrides.WAIVE_ROLL_FEE_OVERRIDE) { // TODO: is the bang on cost correct? + this.scene.ui.playError(); + return false; + } + + const applyModifier = (modifier: Modifier, playSound: boolean = false) => { + const result = this.scene.addModifier(modifier, false, playSound); + if (cost) { + result.then(success => { + if (success) { + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + this.scene.money -= cost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + } + this.scene.playSound("se/buy"); + (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); + } else { + this.scene.ui.playError(); + } + }); + } else { + const doEnd = () => { + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + }; + if (result instanceof Promise) { + result.then(() => doEnd()); + } else { + doEnd(); + } + } + }; + + if (modifierType! instanceof PokemonModifierType) { //TODO: is the bang correct? + if (modifierType instanceof FusePokemonModifierType) { + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => { + if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex])!; //TODO: is the bang correct? + applyModifier(modifier, true); + }); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, modifierType.selectFilter); + } else { + const pokemonModifierType = modifierType as PokemonModifierType; + const isMoveModifier = modifierType instanceof PokemonMoveModifierType; + const isTmModifier = modifierType instanceof TmModifierType; + const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; + const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); + const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER + : isTmModifier ? PartyUiMode.TM_MODIFIER + : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER + : PartyUiMode.MODIFIER; + const tmMoveId = isTmModifier + ? (modifierType as TmModifierType).moveId + : undefined; + this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => { + if (slotIndex < 6) { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = !isMoveModifier + ? !isRememberMoveModifier + ? modifierType.newModifier(party[slotIndex]) + : modifierType.newModifier(party[slotIndex], option as integer) + : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); + applyModifier(modifier!, true); // TODO: is the bang correct? + }); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); + } + } else { + applyModifier(modifierType!.newModifier()!); // TODO: is the bang correct? + } + + return !cost!;// TODO: is the bang correct? + }; + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + + updateSeed(): void { + this.scene.resetSeed(); + } + + isPlayer(): boolean { + return true; + } + + getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): number { + let baseValue = 0; + if (Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + return baseValue; + } else if (lockRarities) { + const tierValues = [50, 125, 300, 750, 2000]; + for (const opt of typeOptions) { + baseValue += tierValues[opt.type.tier ?? 0]; + } + } else { + baseValue = 250; + } + return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount), Number.MAX_SAFE_INTEGER); + } + + getPoolType(): ModifierPoolType { + return ModifierPoolType.PLAYER; + } + + getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] { + return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined); + } + + addModifier(modifier: Modifier): Promise { + return this.scene.addModifier(modifier, false, true); + } +} diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts new file mode 100644 index 00000000000..cd3c112549c --- /dev/null +++ b/src/phases/select-starter-phase.ts @@ -0,0 +1,112 @@ +import BattleScene from "#app/battle-scene"; +import { applyChallenges, ChallengeType } from "#app/data/challenge"; +import { Gender } from "#app/data/gender"; +import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Species } from "#app/enums/species"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { overrideModifiers, overrideHeldItems } from "#app/modifier/modifier"; +import { Phase } from "#app/phase"; +import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler"; +import { Starter } from "#app/ui/starter-select-ui-handler"; +import { Mode } from "#app/ui/ui"; +import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import { TitlePhase } from "./title-phase"; +import Overrides from "#app/overrides"; + +export class SelectStarterPhase extends Phase { + + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.playBgm("menu"); + + this.scene.ui.setMode(Mode.STARTER_SELECT, (starters: Starter[]) => { + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: integer) => { + if (slotId === -1) { + this.scene.clearPhaseQueue(); + this.scene.pushPhase(new TitlePhase(this.scene)); + return this.end(); + } + this.scene.sessionSlotId = slotId; + this.initBattle(starters); + }); + }); + } + + /** + * Initialize starters before starting the first battle + * @param starters {@linkcode Pokemon} with which to start the first battle + */ + initBattle(starters: Starter[]) { + const party = this.scene.getParty(); + const loadPokemonAssets: Promise[] = []; + starters.forEach((starter: Starter, i: integer) => { + if (!i && Overrides.STARTER_SPECIES_OVERRIDE) { + starter.species = getPokemonSpecies(Overrides.STARTER_SPECIES_OVERRIDE as Species); + } + const starterProps = this.scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); + let starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); + if ( + starter.species.speciesId in Overrides.STARTER_FORM_OVERRIDES && + starter.species.forms[Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!] + ) { + starterFormIndex = Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!; + } + + let starterGender = starter.species.malePercent !== null + ? !starterProps.female ? Gender.MALE : Gender.FEMALE + : Gender.GENDERLESS; + if (Overrides.GENDER_OVERRIDE !== null) { + starterGender = Overrides.GENDER_OVERRIDE; + } + const starterIvs = this.scene.gameData.dexData[starter.species.speciesId].ivs.slice(0); + const starterPokemon = this.scene.addPlayerPokemon(starter.species, this.scene.gameMode.getStartingLevel(), starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, starterIvs, starter.nature); + starter.moveset && starterPokemon.tryPopulateMoveset(starter.moveset); + if (starter.passive) { + starterPokemon.passive = true; + } + starterPokemon.luck = this.scene.gameData.getDexAttrLuck(this.scene.gameData.dexData[starter.species.speciesId].caughtAttr); + if (starter.pokerus) { + starterPokemon.pokerus = true; + } + + if (starter.nickname) { + starterPokemon.nickname = starter.nickname; + } + + if (this.scene.gameMode.isSplicedOnly) { + starterPokemon.generateFusionSpecies(true); + } + starterPokemon.setVisible(false); + applyChallenges(this.scene.gameMode, ChallengeType.STARTER_MODIFY, starterPokemon); + party.push(starterPokemon); + loadPokemonAssets.push(starterPokemon.loadAssets()); + }); + overrideModifiers(this.scene); + overrideHeldItems(this.scene, party[0]); + Promise.all(loadPokemonAssets).then(() => { + SoundFade.fadeOut(this.scene, this.scene.sound.get("menu"), 500, true); + this.scene.time.delayedCall(500, () => this.scene.playBgm()); + if (this.scene.gameMode.isClassic) { + this.scene.gameData.gameStats.classicSessionsPlayed++; + } else { + this.scene.gameData.gameStats.endlessSessionsPlayed++; + } + this.scene.newBattle(); + this.scene.arena.init(); + this.scene.sessionPlayTime = 0; + this.scene.lastSavePlayTime = 0; + // Ensures Keldeo (or any future Pokemon that have this type of form change) starts in the correct form + this.scene.getParty().forEach((p: PlayerPokemon) => { + this.scene.triggerPokemonFormChange(p, SpeciesFormChangeMoveLearnedTrigger); + }); + this.end(); + }); + } +} diff --git a/src/phases/select-target-phase.ts b/src/phases/select-target-phase.ts new file mode 100644 index 00000000000..716d2737a6c --- /dev/null +++ b/src/phases/select-target-phase.ts @@ -0,0 +1,32 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { CommandPhase } from "./command-phase"; +import { PokemonPhase } from "./pokemon-phase"; + +export class SelectTargetPhase extends PokemonPhase { + constructor(scene: BattleScene, fieldIndex: integer) { + super(scene, fieldIndex); + } + + start() { + super.start(); + + const turnCommand = this.scene.currentBattle.turnCommands[this.fieldIndex]; + const move = turnCommand?.move?.move; + this.scene.ui.setMode(Mode.TARGET_SELECT, this.fieldIndex, move, (targets: BattlerIndex[]) => { + this.scene.ui.setMode(Mode.MESSAGE); + if (targets.length < 1) { + this.scene.currentBattle.turnCommands[this.fieldIndex] = null; + this.scene.unshiftPhase(new CommandPhase(this.scene, this.fieldIndex)); + } else { + turnCommand!.targets = targets; //TODO: is the bang correct here? + } + if (turnCommand?.command === Command.BALL && this.fieldIndex) { + this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; //TODO: is the bang correct here? + } + this.end(); + }); + } +} diff --git a/src/phases/shiny-sparkle-phase.ts b/src/phases/shiny-sparkle-phase.ts new file mode 100644 index 00000000000..49c60a82dd5 --- /dev/null +++ b/src/phases/shiny-sparkle-phase.ts @@ -0,0 +1,16 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { PokemonPhase } from "./pokemon-phase"; + +export class ShinySparklePhase extends PokemonPhase { + constructor(scene: BattleScene, battlerIndex: BattlerIndex) { + super(scene, battlerIndex); + } + + start() { + super.start(); + + this.getPokemon().sparkle(); + this.scene.time.delayedCall(1000, () => this.end()); + } +} diff --git a/src/phases/show-ability-phase.ts b/src/phases/show-ability-phase.ts new file mode 100644 index 00000000000..cf34e327b4f --- /dev/null +++ b/src/phases/show-ability-phase.ts @@ -0,0 +1,29 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { PokemonPhase } from "./pokemon-phase"; + +export class ShowAbilityPhase extends PokemonPhase { + private passive: boolean; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, passive: boolean = false) { + super(scene, battlerIndex); + + this.passive = passive; + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + + if (pokemon) { + this.scene.abilityBar.showAbility(pokemon, this.passive); + + if (pokemon?.battleData) { + pokemon.battleData.abilityRevealed = true; + } + } + + this.end(); + } +} diff --git a/src/phases/show-party-exp-bar-phase.ts b/src/phases/show-party-exp-bar-phase.ts new file mode 100644 index 00000000000..9e019b202a5 --- /dev/null +++ b/src/phases/show-party-exp-bar-phase.ts @@ -0,0 +1,56 @@ +import BattleScene from "#app/battle-scene"; +import { ExpNotification } from "#app/enums/exp-notification"; +import { ExpBoosterModifier } from "#app/modifier/modifier"; +import * as Utils from "#app/utils"; +import { HidePartyExpBarPhase } from "./hide-party-exp-bar-phase"; +import { LevelUpPhase } from "./level-up-phase"; +import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; + +export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase { + private expValue: number; + + constructor(scene: BattleScene, partyMemberIndex: integer, expValue: number) { + super(scene, partyMemberIndex); + + this.expValue = expValue; + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + const exp = new Utils.NumberHolder(this.expValue); + this.scene.applyModifiers(ExpBoosterModifier, true, exp); + exp.value = Math.floor(exp.value); + + const lastLevel = pokemon.level; + pokemon.addExp(exp.value); + const newLevel = pokemon.level; + if (newLevel > lastLevel) { + this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, lastLevel, newLevel)); + } + this.scene.unshiftPhase(new HidePartyExpBarPhase(this.scene)); + pokemon.updateInfo(); + + if (this.scene.expParty === ExpNotification.SKIP) { + this.end(); + } else if (this.scene.expParty === ExpNotification.ONLY_LEVEL_UP) { + if (newLevel > lastLevel) { // this means if we level up + // instead of displaying the exp gain in the small frame, we display the new level + // we use the same method for mode 0 & 1, by giving a parameter saying to display the exp or the level + this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, this.scene.expParty === ExpNotification.ONLY_LEVEL_UP, newLevel).then(() => { + setTimeout(() => this.end(), 800 / Math.pow(2, this.scene.expGainsSpeed)); + }); + } else { + this.end(); + } + } else if (this.scene.expGainsSpeed < 3) { + this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, false, newLevel).then(() => { + setTimeout(() => this.end(), 500 / Math.pow(2, this.scene.expGainsSpeed)); + }); + } else { + this.end(); + } + + } +} diff --git a/src/phases/show-trainer-phase.ts b/src/phases/show-trainer-phase.ts new file mode 100644 index 00000000000..26ccddd53fc --- /dev/null +++ b/src/phases/show-trainer-phase.ts @@ -0,0 +1,24 @@ +import BattleScene from "#app/battle-scene"; +import { PlayerGender } from "#app/enums/player-gender"; +import { BattlePhase } from "./battle-phase"; + +export class ShowTrainerPhase extends BattlePhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.trainer.setVisible(true); + + this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + + this.scene.tweens.add({ + targets: this.scene.trainer, + x: 106, + duration: 1000, + onComplete: () => this.end() + }); + } +} 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/summon-missing-phase.ts b/src/phases/summon-missing-phase.ts new file mode 100644 index 00000000000..83ac8779dd8 --- /dev/null +++ b/src/phases/summon-missing-phase.ts @@ -0,0 +1,15 @@ +import BattleScene from "#app/battle-scene"; +import { getPokemonNameWithAffix } from "#app/messages"; +import i18next from "i18next"; +import { SummonPhase } from "./summon-phase"; + +export class SummonMissingPhase extends SummonPhase { + constructor(scene: BattleScene, fieldIndex: integer) { + super(scene, fieldIndex); + } + + preSummon(): void { + this.scene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); + this.scene.time.delayedCall(250, () => this.summon()); + } +} diff --git a/src/phases/summon-phase.ts b/src/phases/summon-phase.ts new file mode 100644 index 00000000000..2645060c547 --- /dev/null +++ b/src/phases/summon-phase.ts @@ -0,0 +1,194 @@ +import BattleScene from "#app/battle-scene"; +import { BattleType } from "#app/battle"; +import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { PlayerGender } from "#app/enums/player-gender"; +import { addPokeballOpenParticles } from "#app/field/anims"; +import Pokemon, { FieldPosition } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import i18next from "i18next"; +import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; +import { PostSummonPhase } from "./post-summon-phase"; +import { GameOverPhase } from "./game-over-phase"; +import { ShinySparklePhase } from "./shiny-sparkle-phase"; + +export class SummonPhase extends PartyMemberPokemonPhase { + private loaded: boolean; + + constructor(scene: BattleScene, fieldIndex: integer, player: boolean = true, loaded: boolean = false) { + super(scene, fieldIndex, player); + + this.loaded = loaded; + } + + start() { + super.start(); + + this.preSummon(); + } + + /** + * Sends out a Pokemon before the battle begins and shows the appropriate messages + */ + preSummon(): void { + const partyMember = this.getPokemon(); + // If the Pokemon about to be sent out is fainted or illegal under a challenge, switch to the first non-fainted legal Pokemon + if (!partyMember.isAllowedInBattle()) { + console.warn("The Pokemon about to be sent out is fainted or illegal under a challenge. Attempting to resolve..."); + + // First check if they're somehow still in play, if so remove them. + if (partyMember.isOnField()) { + partyMember.leaveField(); + } + + const party = this.getParty(); + + // Find the first non-fainted Pokemon index above the current one + const legalIndex = party.findIndex((p, i) => i > this.partyMemberIndex && p.isAllowedInBattle()); + if (legalIndex === -1) { + console.error("Party Details:\n", party); + console.error("All available Pokemon were fainted or illegal!"); + this.scene.clearPhaseQueue(); + this.scene.unshiftPhase(new GameOverPhase(this.scene)); + this.end(); + return; + } + + // Swaps the fainted Pokemon and the first non-fainted legal Pokemon in the party + [party[this.partyMemberIndex], party[legalIndex]] = [party[legalIndex], party[this.partyMemberIndex]]; + console.warn("Swapped %s %O with %s %O", getPokemonNameWithAffix(partyMember), partyMember, getPokemonNameWithAffix(party[0]), party[0]); + } + + if (this.player) { + this.scene.ui.showText(i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); + if (this.player) { + this.scene.pbTray.hide(); + } + this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + this.scene.time.delayedCall(562, () => { + this.scene.trainer.setFrame("2"); + this.scene.time.delayedCall(64, () => { + this.scene.trainer.setFrame("3"); + }); + }); + this.scene.tweens.add({ + targets: this.scene.trainer, + x: -36, + duration: 1000, + onComplete: () => this.scene.trainer.setVisible(false) + }); + this.scene.time.delayedCall(750, () => this.summon()); + } else { + const trainerName = this.scene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); + const pokemonName = this.getPokemon().getNameToRender(); + const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); + + this.scene.pbTrayEnemy.hide(); + this.scene.ui.showText(message, null, () => this.summon()); + } + } + + summon(): void { + const pokemon = this.getPokemon(); + + const pokeball = this.scene.addFieldSprite(this.player ? 36 : 248, this.player ? 80 : 44, "pb", getPokeballAtlasKey(pokemon.pokeball)); + pokeball.setVisible(false); + pokeball.setOrigin(0.5, 0.625); + this.scene.field.add(pokeball); + + if (this.fieldIndex === 1) { + pokemon.setFieldPosition(FieldPosition.RIGHT, 0); + } else { + const availablePartyMembers = this.getParty().filter(p => p.isAllowedInBattle()).length; + pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); + } + + const fpOffset = pokemon.getFieldPositionOffset(); + + pokeball.setVisible(true); + + this.scene.tweens.add({ + targets: pokeball, + duration: 650, + x: (this.player ? 100 : 236) + fpOffset[0] + }); + + this.scene.tweens.add({ + targets: pokeball, + duration: 150, + ease: "Cubic.easeOut", + y: (this.player ? 70 : 34) + fpOffset[1], + onComplete: () => { + this.scene.tweens.add({ + targets: pokeball, + duration: 500, + ease: "Cubic.easeIn", + angle: 1440, + y: (this.player ? 132 : 86) + fpOffset[1], + onComplete: () => { + this.scene.playSound("se/pb_rel"); + pokeball.destroy(); + this.scene.add.existing(pokemon); + this.scene.field.add(pokemon); + if (!this.player) { + const playerPokemon = this.scene.getPlayerPokemon() as Pokemon; + if (playerPokemon?.visible) { + this.scene.field.moveBelow(pokemon, playerPokemon); + } + this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); + } + addPokeballOpenParticles(this.scene, pokemon.x, pokemon.y - 16, pokemon.pokeball); + this.scene.updateModifiers(this.player); + this.scene.updateFieldScale(); + pokemon.showInfo(); + pokemon.playAnim(); + pokemon.setVisible(true); + pokemon.getSprite().setVisible(true); + pokemon.setScale(0.5); + pokemon.tint(getPokeballTintColor(pokemon.pokeball)); + pokemon.untint(250, "Sine.easeIn"); + this.scene.updateFieldScale(); + this.scene.tweens.add({ + targets: pokemon, + duration: 250, + ease: "Sine.easeIn", + scale: pokemon.getSpriteScale(), + onComplete: () => { + pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); + pokemon.getSprite().clearTint(); + pokemon.resetSummonData(); + this.scene.time.delayedCall(1000, () => this.end()); + } + }); + } + }); + } + }); + } + + onEnd(): void { + const pokemon = this.getPokemon(); + + if (pokemon.isShiny()) { + this.scene.unshiftPhase(new ShinySparklePhase(this.scene, pokemon.getBattlerIndex())); + } + + pokemon.resetTurnData(); + + if (!this.loaded || this.scene.currentBattle.battleType === BattleType.TRAINER || (this.scene.currentBattle.waveIndex % 10) === 1) { + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + this.queuePostSummon(); + } + } + + queuePostSummon(): void { + this.scene.pushPhase(new PostSummonPhase(this.scene, this.getPokemon().getBattlerIndex())); + } + + end() { + this.onEnd(); + + super.end(); + } +} diff --git a/src/phases/switch-biome-phase.ts b/src/phases/switch-biome-phase.ts new file mode 100644 index 00000000000..9cf5635a39f --- /dev/null +++ b/src/phases/switch-biome-phase.ts @@ -0,0 +1,65 @@ +import BattleScene from "#app/battle-scene"; +import { Biome } from "#app/enums/biome"; +import { getBiomeKey } from "#app/field/arena"; +import { BattlePhase } from "./battle-phase"; + +export class SwitchBiomePhase extends BattlePhase { + private nextBiome: Biome; + + constructor(scene: BattleScene, nextBiome: Biome) { + super(scene); + + this.nextBiome = nextBiome; + } + + start() { + super.start(); + + if (this.nextBiome === undefined) { + return this.end(); + } + + this.scene.tweens.add({ + targets: [this.scene.arenaEnemy, this.scene.lastEnemyTrainer], + x: "+=300", + duration: 2000, + onComplete: () => { + this.scene.arenaEnemy.setX(this.scene.arenaEnemy.x - 600); + + this.scene.newArena(this.nextBiome); + + const biomeKey = getBiomeKey(this.nextBiome); + const bgTexture = `${biomeKey}_bg`; + this.scene.arenaBgTransition.setTexture(bgTexture); + this.scene.arenaBgTransition.setAlpha(0); + this.scene.arenaBgTransition.setVisible(true); + this.scene.arenaPlayerTransition.setBiome(this.nextBiome); + this.scene.arenaPlayerTransition.setAlpha(0); + this.scene.arenaPlayerTransition.setVisible(true); + + this.scene.tweens.add({ + targets: [this.scene.arenaPlayer, this.scene.arenaBgTransition, this.scene.arenaPlayerTransition], + duration: 1000, + delay: 1000, + ease: "Sine.easeInOut", + alpha: (target: any) => target === this.scene.arenaPlayer ? 0 : 1, + onComplete: () => { + this.scene.arenaBg.setTexture(bgTexture); + this.scene.arenaPlayer.setBiome(this.nextBiome); + this.scene.arenaPlayer.setAlpha(1); + this.scene.arenaEnemy.setBiome(this.nextBiome); + this.scene.arenaEnemy.setAlpha(1); + this.scene.arenaNextEnemy.setBiome(this.nextBiome); + this.scene.arenaBgTransition.setVisible(false); + this.scene.arenaPlayerTransition.setVisible(false); + if (this.scene.lastEnemyTrainer) { + this.scene.lastEnemyTrainer.destroy(); + } + + this.end(); + } + }); + } + }); + } +} diff --git a/src/phases/switch-phase.ts b/src/phases/switch-phase.ts new file mode 100644 index 00000000000..b1a2e991ed8 --- /dev/null +++ b/src/phases/switch-phase.ts @@ -0,0 +1,65 @@ +import BattleScene from "#app/battle-scene"; +import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { BattlePhase } from "./battle-phase"; +import { SwitchSummonPhase } from "./switch-summon-phase"; + +/** + * Opens the party selector UI and transitions into a {@linkcode SwitchSummonPhase} + * for the player (if a switch would be valid for the current battle state). + */ +export class SwitchPhase extends BattlePhase { + protected fieldIndex: integer; + private isModal: boolean; + private doReturn: boolean; + + /** + * Creates a new SwitchPhase + * @param scene {@linkcode BattleScene} Current battle scene + * @param fieldIndex Field index to switch out + * @param isModal Indicates if the switch should be forced (true) or is + * optional (false). + * @param doReturn Indicates if the party member on the field should be + * recalled to ball or has already left the field. Passed to {@linkcode SwitchSummonPhase}. + */ + constructor(scene: BattleScene, fieldIndex: integer, isModal: boolean, doReturn: boolean) { + super(scene); + + this.fieldIndex = fieldIndex; + this.isModal = isModal; + this.doReturn = doReturn; + } + + start() { + super.start(); + + // Skip modal switch if impossible (no remaining party members that aren't in battle) + if (this.isModal && !this.scene.getParty().filter(p => p.isAllowedInBattle() && !p.isActive(true)).length) { + return super.end(); + } + + // Skip if the fainted party member has been revived already. doReturn is + // only passed as `false` from FaintPhase (as opposed to other usages such + // as ForceSwitchOutAttr or CheckSwitchPhase), so we only want to check this + // if the mon should have already been returned but is still alive and well + // on the field. see also; battle.test.ts + if (this.isModal && !this.doReturn && !this.scene.getParty()[this.fieldIndex].isFainted()) { + return super.end(); + } + + // Check if there is any space still in field + if (this.isModal && this.scene.getPlayerField().filter(p => p.isAllowedInBattle() && p.isActive(true)).length >= this.scene.currentBattle.getBattlerCount()) { + return super.end(); + } + + // Override field index to 0 in case of double battle where 2/3 remaining legal party members fainted at once + const fieldIndex = this.scene.currentBattle.getBattlerCount() === 1 || this.scene.getParty().filter(p => p.isAllowedInBattle()).length > 1 ? this.fieldIndex : 0; + + this.scene.ui.setMode(Mode.PARTY, this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, fieldIndex, (slotIndex: integer, option: PartyOption) => { + if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, fieldIndex, slotIndex, this.doReturn, option === PartyOption.PASS_BATON)); + } + this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + }, PartyUiHandler.FilterNonFainted); + } +} diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts new file mode 100644 index 00000000000..2a5fd0cc3ac --- /dev/null +++ b/src/phases/switch-summon-phase.ts @@ -0,0 +1,170 @@ +import BattleScene from "#app/battle-scene"; +import { applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr } from "#app/data/ability"; +import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; +import { getPokeballTintColor } from "#app/data/pokeball"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; +import { TrainerSlot } from "#app/data/trainer-config"; +import Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { SwitchEffectTransferModifier } from "#app/modifier/modifier"; +import { Command } from "#app/ui/command-ui-handler"; +import i18next from "i18next"; +import { PostSummonPhase } from "./post-summon-phase"; +import { SummonPhase } from "./summon-phase"; + +export class SwitchSummonPhase extends SummonPhase { + private slotIndex: integer; + private doReturn: boolean; + private batonPass: boolean; + + private lastPokemon: Pokemon; + + /** + * Constructor for creating a new SwitchSummonPhase + * @param scene {@linkcode BattleScene} the scene the phase is associated with + * @param fieldIndex integer representing position on the battle field + * @param slotIndex integer for the index of pokemon (in party of 6) to switch into + * @param doReturn boolean whether to render "comeback" dialogue + * @param batonPass boolean if the switch is from baton pass + * @param player boolean if the switch is from the player + */ + constructor(scene: BattleScene, fieldIndex: integer, slotIndex: integer, doReturn: boolean, batonPass: boolean, player?: boolean) { + super(scene, fieldIndex, player !== undefined ? player : true); + + this.slotIndex = slotIndex; + this.doReturn = doReturn; + this.batonPass = batonPass; + } + + start(): void { + super.start(); + } + + preSummon(): void { + if (!this.player) { + if (this.slotIndex === -1) { + //@ts-ignore + this.slotIndex = this.scene.currentBattle.trainer?.getNextSummonIndex(!this.fieldIndex ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); // TODO: what would be the default trainer-slot fallback? + } + if (this.slotIndex > -1) { + this.showEnemyTrainer(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); + this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); + } + } + + if (!this.doReturn || (this.slotIndex !== -1 && !(this.player ? this.scene.getParty() : this.scene.getEnemyParty())[this.slotIndex])) { + if (this.player) { + return this.switchAndSummon(); + } else { + this.scene.time.delayedCall(750, () => this.switchAndSummon()); + return; + } + } + + const pokemon = this.getPokemon(); + + if (!this.batonPass) { + (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); + } + + this.scene.ui.showText(this.player ? + 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: pokemon.getNameToRender() + }) + ); + this.scene.playSound("se/pb_rel"); + pokemon.hideInfo(); + pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn"); + this.scene.tweens.add({ + targets: pokemon, + duration: 250, + ease: "Sine.easeIn", + scale: 0.5, + onComplete: () => { + pokemon.leaveField(!this.batonPass, false); + this.scene.time.delayedCall(750, () => this.switchAndSummon()); + } + }); + } + + switchAndSummon() { + const party = this.player ? this.getParty() : this.scene.getEnemyParty(); + const switchedInPokemon = party[this.slotIndex]; + this.lastPokemon = this.getPokemon(); + applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, this.lastPokemon); + if (this.batonPass && switchedInPokemon) { + (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedInPokemon.id)); + if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { + const batonPassModifier = this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier + && (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id) as SwitchEffectTransferModifier; + if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { + this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedInPokemon, false); + } + } + } + if (switchedInPokemon) { + party[this.slotIndex] = this.lastPokemon; + party[this.fieldIndex] = switchedInPokemon; + const showTextAndSummon = () => { + this.scene.ui.showText(this.player ? + i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedInPokemon) }) : + i18next.t("battle:trainerGo", { + trainerName: this.scene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), + pokemonName: this.getPokemon().getNameToRender() + }) + ); + // Ensure improperly persisted summon data (such as tags) is cleared upon switching + if (!this.batonPass) { + switchedInPokemon.resetBattleData(); + switchedInPokemon.resetSummonData(); + } + this.summon(); + }; + if (this.player) { + showTextAndSummon(); + } else { + this.scene.time.delayedCall(1500, () => { + this.hideEnemyTrainer(); + this.scene.pbTrayEnemy.hide(); + showTextAndSummon(); + }); + } + } else { + this.end(); + } + } + + onEnd(): void { + super.onEnd(); + + const pokemon = this.getPokemon(); + + const moveId = this.lastPokemon?.scene.currentBattle.lastMove; + const lastUsedMove = moveId ? allMoves[moveId] : undefined; + + const currentCommand = pokemon.scene.currentBattle.turnCommands[this.fieldIndex]?.command; + const lastPokemonIsForceSwitchedAndNotFainted = lastUsedMove?.hasAttr(ForceSwitchOutAttr) && !this.lastPokemon.isFainted(); + + // Compensate for turn spent summoning + // Or compensate for force switch move if switched out pokemon is not fainted + if (currentCommand === Command.POKEMON || lastPokemonIsForceSwitchedAndNotFainted) { + pokemon.battleSummonData.turnCount--; + } + + if (this.batonPass && pokemon) { + pokemon.transferSummon(this.lastPokemon); + } + + this.lastPokemon?.resetSummonData(); + + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + // Reverts to weather-based forms when weather suppressors (Cloud Nine/Air Lock) are switched out + this.scene.arena.triggerWeatherBasedFormChanges(); + } + + queuePostSummon(): void { + this.scene.unshiftPhase(new PostSummonPhase(this.scene, this.getPokemon().getBattlerIndex())); + } +} diff --git a/src/phases/test-message-phase.ts b/src/phases/test-message-phase.ts new file mode 100644 index 00000000000..464a5ed1f94 --- /dev/null +++ b/src/phases/test-message-phase.ts @@ -0,0 +1,8 @@ +import BattleScene from "#app/battle-scene"; +import { MessagePhase } from "./message-phase"; + +export class TestMessagePhase extends MessagePhase { + constructor(scene: BattleScene, message: string) { + super(scene, message, null, true); + } +} diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts new file mode 100644 index 00000000000..52503501837 --- /dev/null +++ b/src/phases/title-phase.ts @@ -0,0 +1,303 @@ +import { loggedInUser } from "#app/account"; +import BattleScene from "#app/battle-scene"; +import { BattleType } from "#app/battle"; +import { getDailyRunStarters, fetchDailyRunSeed } from "#app/data/daily-run"; +import { Gender } from "#app/data/gender"; +import { getBiomeKey } from "#app/field/arena"; +import { GameModes, GameMode, getGameMode } from "#app/game-mode"; +import { regenerateModifierPoolThresholds, ModifierPoolType, modifierTypes, getDailyRunStarterModifiers } from "#app/modifier/modifier-type"; +import { Phase } from "#app/phase"; +import { SessionSaveData } from "#app/system/game-data"; +import { Unlockables } from "#app/system/unlockables"; +import { vouchers } from "#app/system/voucher"; +import { OptionSelectItem, OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler"; +import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { Modifier } from "#app/modifier/modifier"; +import { CheckSwitchPhase } from "./check-switch-phase"; +import { EncounterPhase } from "./encounter-phase"; +import { SelectChallengePhase } from "./select-challenge-phase"; +import { SelectStarterPhase } from "./select-starter-phase"; +import { SummonPhase } from "./summon-phase"; + + +export class TitlePhase extends Phase { + private loaded: boolean; + private lastSessionData: SessionSaveData; + public gameMode: GameModes; + + constructor(scene: BattleScene) { + super(scene); + + this.loaded = false; + } + + start(): void { + super.start(); + + this.scene.ui.clearText(); + this.scene.ui.fadeIn(250); + + this.scene.playBgm("title", true); + + this.scene.gameData.getSession(loggedInUser?.lastSessionSlot ?? -1).then(sessionData => { + if (sessionData) { + this.lastSessionData = sessionData; + const biomeKey = getBiomeKey(sessionData.arena.biome); + const bgTexture = `${biomeKey}_bg`; + this.scene.arenaBg.setTexture(bgTexture); + } + this.showOptions(); + }).catch(err => { + console.error(err); + this.showOptions(); + }); + } + + showOptions(): void { + const options: OptionSelectItem[] = []; + if (loggedInUser && loggedInUser.lastSessionSlot > -1) { + options.push({ + label: i18next.t("continue", {ns: "menu"}), + handler: () => { + this.loadSaveSlot(this.lastSessionData || !loggedInUser ? -1 : loggedInUser.lastSessionSlot); + return true; + } + }); + } + options.push({ + label: i18next.t("menu:newGame"), + handler: () => { + const setModeAndEnd = (gameMode: GameModes) => { + this.gameMode = gameMode; + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.clearText(); + this.end(); + }; + if (this.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]) { + const options: OptionSelectItem[] = [ + { + label: GameMode.getModeName(GameModes.CLASSIC), + handler: () => { + setModeAndEnd(GameModes.CLASSIC); + return true; + } + }, + { + label: GameMode.getModeName(GameModes.CHALLENGE), + handler: () => { + setModeAndEnd(GameModes.CHALLENGE); + return true; + } + }, + { + label: GameMode.getModeName(GameModes.ENDLESS), + handler: () => { + setModeAndEnd(GameModes.ENDLESS); + return true; + } + } + ]; + if (this.scene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE]) { + options.push({ + label: GameMode.getModeName(GameModes.SPLICED_ENDLESS), + handler: () => { + setModeAndEnd(GameModes.SPLICED_ENDLESS); + return true; + } + }); + } + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + this.scene.clearPhaseQueue(); + this.scene.pushPhase(new TitlePhase(this.scene)); + super.end(); + return true; + } + }); + this.scene.ui.showText(i18next.t("menu:selectGameMode"), null, () => this.scene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options })); + } else { + this.gameMode = GameModes.CLASSIC; + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.clearText(); + this.end(); + } + return true; + } + }, + { + label: i18next.t("menu:loadGame"), + handler: () => { + this.scene.ui.setOverlayMode(Mode.SAVE_SLOT, SaveSlotUiMode.LOAD, + (slotId: integer) => { + if (slotId === -1) { + return this.showOptions(); + } + this.loadSaveSlot(slotId); + }); + return true; + } + }, + { + label: i18next.t("menu:dailyRun"), + handler: () => { + this.initDailyRun(); + return true; + }, + keepOpen: true + }, + { + label: i18next.t("menu:settings"), + handler: () => { + this.scene.ui.setOverlayMode(Mode.SETTINGS); + return true; + }, + keepOpen: true + }); + const config: OptionSelectConfig = { + options: options, + noCancel: true, + yOffset: 47 + }; + this.scene.ui.setMode(Mode.TITLE, config); + } + + loadSaveSlot(slotId: integer): void { + this.scene.sessionSlotId = slotId > -1 || !loggedInUser ? slotId : loggedInUser.lastSessionSlot; + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.resetModeChain(); + this.scene.gameData.loadSession(this.scene, slotId, slotId === -1 ? this.lastSessionData : undefined).then((success: boolean) => { + if (success) { + this.loaded = true; + this.scene.ui.showText(i18next.t("menu:sessionSuccess"), null, () => this.end()); + } else { + this.end(); + } + }).catch(err => { + console.error(err); + this.scene.ui.showText(i18next.t("menu:failedToLoadSession"), null); + }); + } + + initDailyRun(): void { + this.scene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: integer) => { + this.scene.clearPhaseQueue(); + if (slotId === -1) { + this.scene.pushPhase(new TitlePhase(this.scene)); + return super.end(); + } + this.scene.sessionSlotId = slotId; + + const generateDaily = (seed: string) => { + this.scene.gameMode = getGameMode(GameModes.DAILY); + + this.scene.setSeed(seed); + this.scene.resetSeed(1); + + this.scene.money = this.scene.gameMode.getStartingMoney(); + + const starters = getDailyRunStarters(this.scene, seed); + const startingLevel = this.scene.gameMode.getStartingLevel(); + + const party = this.scene.getParty(); + const loadPokemonAssets: Promise[] = []; + for (const starter of starters) { + const starterProps = this.scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); + const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); + const starterGender = starter.species.malePercent !== null + ? !starterProps.female ? Gender.MALE : Gender.FEMALE + : Gender.GENDERLESS; + const starterPokemon = this.scene.addPlayerPokemon(starter.species, startingLevel, starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, undefined, starter.nature); + starterPokemon.setVisible(false); + party.push(starterPokemon); + loadPokemonAssets.push(starterPokemon.loadAssets()); + } + + regenerateModifierPoolThresholds(party, ModifierPoolType.DAILY_STARTER); + + const modifiers: Modifier[] = Array(3).fill(null).map(() => modifierTypes.EXP_SHARE().withIdFromFunc(modifierTypes.EXP_SHARE).newModifier()) + .concat(Array(3).fill(null).map(() => modifierTypes.GOLDEN_EXP_CHARM().withIdFromFunc(modifierTypes.GOLDEN_EXP_CHARM).newModifier())) + .concat(getDailyRunStarterModifiers(party)) + .filter((m) => m !== null); + + for (const m of modifiers) { + this.scene.addModifier(m, true, false, false, true); + } + this.scene.updateModifiers(true, true); + + Promise.all(loadPokemonAssets).then(() => { + this.scene.time.delayedCall(500, () => this.scene.playBgm()); + this.scene.gameData.gameStats.dailyRunSessionsPlayed++; + this.scene.newArena(this.scene.gameMode.getStartingBiome(this.scene)); + this.scene.newBattle(); + this.scene.arena.init(); + this.scene.sessionPlayTime = 0; + this.scene.lastSavePlayTime = 0; + this.end(); + }); + }; + + // If Online, calls seed fetch from db to generate daily run. If Offline, generates a daily run based on current date. + if (!Utils.isLocal) { + fetchDailyRunSeed().then(seed => { + if (seed) { + generateDaily(seed); + } else { + throw new Error("Daily run seed is null!"); + } + }).catch(err => { + console.error("Failed to load daily run:\n", err); + }); + } else { + generateDaily(btoa(new Date().toISOString().substring(0, 10))); + } + }); + } + + end(): void { + if (!this.loaded && !this.scene.gameMode.isDaily) { + this.scene.arena.preloadBgm(); + this.scene.gameMode = getGameMode(this.gameMode); + if (this.gameMode === GameModes.CHALLENGE) { + this.scene.pushPhase(new SelectChallengePhase(this.scene)); + } else { + this.scene.pushPhase(new SelectStarterPhase(this.scene)); + } + this.scene.newArena(this.scene.gameMode.getStartingBiome(this.scene)); + } else { + this.scene.playBgm(); + } + + this.scene.pushPhase(new EncounterPhase(this.scene, this.loaded)); + + if (this.loaded) { + const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()).length; + + this.scene.pushPhase(new SummonPhase(this.scene, 0, true, true)); + if (this.scene.currentBattle.double && availablePartyMembers > 1) { + this.scene.pushPhase(new SummonPhase(this.scene, 1, true, true)); + } + + if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { + const minPartySize = this.scene.currentBattle.double ? 2 : 1; + if (availablePartyMembers > minPartySize) { + this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); + if (this.scene.currentBattle.double) { + this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + } + } + } + } + + for (const achv of Object.keys(this.scene.gameData.achvUnlocks)) { + if (vouchers.hasOwnProperty(achv) && achv !== "CLASSIC_VICTORY") { + this.scene.validateVoucher(vouchers[achv]); + } + } + + super.end(); + } +} diff --git a/src/phases/toggle-double-position-phase.ts b/src/phases/toggle-double-position-phase.ts new file mode 100644 index 00000000000..563af8575d7 --- /dev/null +++ b/src/phases/toggle-double-position-phase.ts @@ -0,0 +1,31 @@ +import BattleScene from "#app/battle-scene"; +import { FieldPosition } from "#app/field/pokemon"; +import { BattlePhase } from "./battle-phase"; + +export class ToggleDoublePositionPhase extends BattlePhase { + private double: boolean; + + constructor(scene: BattleScene, double: boolean) { + super(scene); + + this.double = double; + } + + start() { + super.start(); + + const playerPokemon = this.scene.getPlayerField().find(p => p.isActive(true)); + if (playerPokemon) { + playerPokemon.setFieldPosition(this.double && this.scene.getParty().filter(p => p.isAllowedInBattle()).length > 1 ? FieldPosition.LEFT : FieldPosition.CENTER, 500).then(() => { + if (playerPokemon.getFieldIndex() === 1) { + const party = this.scene.getParty(); + party[1] = party[0]; + party[0] = playerPokemon; + } + this.end(); + }); + } else { + this.end(); + } + } +} diff --git a/src/phases/trainer-message-test-phase.ts b/src/phases/trainer-message-test-phase.ts new file mode 100644 index 00000000000..8075dd761e2 --- /dev/null +++ b/src/phases/trainer-message-test-phase.ts @@ -0,0 +1,41 @@ +import BattleScene from "#app/battle-scene"; +import { trainerConfigs } from "#app/data/trainer-config"; +import { TrainerType } from "#app/enums/trainer-type"; +import { BattlePhase } from "./battle-phase"; +import { TestMessagePhase } from "./test-message-phase"; + +export class TrainerMessageTestPhase extends BattlePhase { + private trainerTypes: TrainerType[]; + + constructor(scene: BattleScene, ...trainerTypes: TrainerType[]) { + super(scene); + + this.trainerTypes = trainerTypes; + } + + start() { + super.start(); + + const testMessages: string[] = []; + + for (const t of Object.keys(trainerConfigs)) { + const type = parseInt(t); + if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === type as TrainerType)) { + continue; + } + const config = trainerConfigs[type]; + [config.encounterMessages, config.femaleEncounterMessages, config.victoryMessages, config.femaleVictoryMessages, config.defeatMessages, config.femaleDefeatMessages] + .map(messages => { + if (messages?.length) { + testMessages.push(...messages); + } + }); + } + + for (const message of testMessages) { + this.scene.pushPhase(new TestMessagePhase(this.scene, message)); + } + + this.end(); + } +} diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts new file mode 100644 index 00000000000..e925f0c47d4 --- /dev/null +++ b/src/phases/trainer-victory-phase.ts @@ -0,0 +1,65 @@ +import BattleScene from "#app/battle-scene"; +import { getCharVariantFromDialogue } from "#app/data/dialogue"; +import { TrainerType } from "#app/enums/trainer-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { vouchers } from "#app/system/voucher"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "./battle-phase"; +import { ModifierRewardPhase } from "./modifier-reward-phase"; +import { MoneyRewardPhase } from "./money-reward-phase"; +import { TrainerSlot } from "#app/data/trainer-config"; + +export class TrainerVictoryPhase extends BattlePhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + this.scene.disableMenu = true; + + this.scene.playBgm(this.scene.currentBattle.trainer?.config.victoryBgm); + + this.scene.unshiftPhase(new MoneyRewardPhase(this.scene, this.scene.currentBattle.trainer?.config.moneyMultiplier!)); // TODO: is this bang correct? + + const modifierRewardFuncs = this.scene.currentBattle.trainer?.config.modifierRewardFuncs!; // TODO: is this bang correct? + for (const modifierRewardFunc of modifierRewardFuncs) { + this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, modifierRewardFunc)); + } + + const trainerType = this.scene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct? + if (vouchers.hasOwnProperty(TrainerType[trainerType])) { + if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer?.config.isBoss) { + this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType])); + } + } + + this.scene.ui.showText(i18next.t("battle:trainerDefeated", { trainerName: this.scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }), null, () => { + const victoryMessages = this.scene.currentBattle.trainer?.getVictoryMessages()!; // TODO: is this bang correct? + let message: string; + this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(victoryMessages), this.scene.currentBattle.waveIndex); + message = message!; // tell TS compiler it's defined now + + const showMessage = () => { + const originalFunc = showMessageOrEnd; + showMessageOrEnd = () => this.scene.ui.showDialogue(message, this.scene.currentBattle.trainer?.getName(TrainerSlot.TRAINER, true), null, originalFunc); + + showMessageOrEnd(); + }; + let showMessageOrEnd = () => this.end(); + if (victoryMessages?.length) { + if (this.scene.currentBattle.trainer?.config.hasCharSprite && !this.scene.ui.shouldSkipDialogue(message)) { + const originalFunc = showMessageOrEnd; + showMessageOrEnd = () => this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => originalFunc())); + this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(this.scene.currentBattle.trainer?.getKey()!, getCharVariantFromDialogue(victoryMessages[0])).then(() => showMessage())); // TODO: is this bang correct? + } else { + showMessage(); + } + } else { + showMessageOrEnd(); + } + }, null, true); + + this.showEnemyTrainer(); + } +} diff --git a/src/phases/turn-end-phase.ts b/src/phases/turn-end-phase.ts new file mode 100644 index 00000000000..724a5206d74 --- /dev/null +++ b/src/phases/turn-end-phase.ts @@ -0,0 +1,64 @@ +import BattleScene from "#app/battle-scene"; +import { applyPostTurnAbAttrs, PostTurnAbAttr } from "#app/data/ability"; +import { BattlerTagLapseType } from "#app/data/battler-tags"; +import { TerrainType } from "#app/data/terrain"; +import { WeatherType } from "#app/enums/weather-type"; +import { TurnEndEvent } from "#app/events/battle-scene"; +import Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { TurnHealModifier, EnemyTurnHealModifier, EnemyStatusEffectHealChanceModifier, TurnStatusEffectModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier"; +import i18next from "i18next"; +import { FieldPhase } from "./field-phase"; +import { PokemonHealPhase } from "./pokemon-heal-phase"; + +export class TurnEndPhase extends FieldPhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.currentBattle.incrementTurn(this.scene); + this.scene.eventTarget.dispatchEvent(new TurnEndEvent(this.scene.currentBattle.turn)); + + const handlePokemon = (pokemon: Pokemon) => { + pokemon.lapseTags(BattlerTagLapseType.TURN_END); + + this.scene.applyModifiers(TurnHealModifier, pokemon.isPlayer(), pokemon); + + if (this.scene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { + this.scene.unshiftPhase(new PokemonHealPhase(this.scene, pokemon.getBattlerIndex(), + Math.max(pokemon.getMaxHp() >> 4, 1), i18next.t("battle:turnEndHpRestore", { pokemonName: getPokemonNameWithAffix(pokemon) }), true)); + } + + if (!pokemon.isPlayer()) { + this.scene.applyModifiers(EnemyTurnHealModifier, false, pokemon); + this.scene.applyModifier(EnemyStatusEffectHealChanceModifier, false, pokemon); + } + + applyPostTurnAbAttrs(PostTurnAbAttr, pokemon); + + this.scene.applyModifiers(TurnStatusEffectModifier, pokemon.isPlayer(), pokemon); + + this.scene.applyModifiers(TurnHeldItemTransferModifier, pokemon.isPlayer(), pokemon); + + pokemon.battleSummonData.turnCount++; + }; + + this.executeForAll(handlePokemon); + + this.scene.arena.lapseTags(); + + if (this.scene.arena.weather && !this.scene.arena.weather.lapse()) { + this.scene.arena.trySetWeather(WeatherType.NONE, false); + this.scene.arena.triggerWeatherBasedFormChangesToNormal(); + } + + if (this.scene.arena.terrain && !this.scene.arena.terrain.lapse()) { + this.scene.arena.trySetTerrain(TerrainType.NONE, false); + } + + this.end(); + } +} diff --git a/src/phases/turn-init-phase.ts b/src/phases/turn-init-phase.ts new file mode 100644 index 00000000000..568cfdc5714 --- /dev/null +++ b/src/phases/turn-init-phase.ts @@ -0,0 +1,65 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { TurnInitEvent } from "#app/events/battle-scene"; +import { PlayerPokemon } from "#app/field/pokemon"; +import i18next from "i18next"; +import { FieldPhase } from "./field-phase"; +import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; +import { CommandPhase } from "./command-phase"; +import { EnemyCommandPhase } from "./enemy-command-phase"; +import { GameOverPhase } from "./game-over-phase"; +import { TurnStartPhase } from "./turn-start-phase"; + +export class TurnInitPhase extends FieldPhase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.getPlayerField().forEach(p => { + // If this pokemon is in play and evolved into something illegal under the current challenge, force a switch + if (p.isOnField() && !p.isAllowedInBattle()) { + this.scene.queueMessage(i18next.t("challenges:illegalEvolution", { "pokemon": p.name }), null, true); + + const allowedPokemon = this.scene.getParty().filter(p => p.isAllowedInBattle()); + + if (!allowedPokemon.length) { + // If there are no longer any legal pokemon in the party, game over. + this.scene.clearPhaseQueue(); + this.scene.unshiftPhase(new GameOverPhase(this.scene)); + } else if (allowedPokemon.length >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !allowedPokemon[0].isActive(true))) { + // If there is at least one pokemon in the back that is legal to switch in, force a switch. + p.switchOut(false); + } else { + // If there are no pokemon in the back but we're not game overing, just hide the pokemon. + // This should only happen in double battles. + p.leaveField(); + } + if (allowedPokemon.length === 1 && this.scene.currentBattle.double) { + this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + } + } + }); + + //this.scene.pushPhase(new MoveAnimTestPhase(this.scene)); + this.scene.eventTarget.dispatchEvent(new TurnInitEvent()); + + this.scene.getField().forEach((pokemon, i) => { + if (pokemon?.isActive()) { + if (pokemon.isPlayer()) { + this.scene.currentBattle.addParticipant(pokemon as PlayerPokemon); + } + + pokemon.resetTurnData(); + + this.scene.pushPhase(pokemon.isPlayer() ? new CommandPhase(this.scene, i) : new EnemyCommandPhase(this.scene, i - BattlerIndex.ENEMY)); + } + }); + + this.scene.pushPhase(new TurnStartPhase(this.scene)); + + this.end(); + } +} diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts new file mode 100644 index 00000000000..5c1af4228c6 --- /dev/null +++ b/src/phases/turn-start-phase.ts @@ -0,0 +1,226 @@ +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"; +import { FieldPhase } from "./field-phase"; +import { MoveHeaderPhase } from "./move-header-phase"; +import { MovePhase } from "./move-phase"; +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); + } + + /** + * 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[]; + + // 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 => { + const bypassSpeed = new Utils.BooleanHolder(false); + const canCheckHeldItems = new Utils.BooleanHolder(true); + applyAbAttrs(BypassSpeedChanceAbAttr, p, null, false, bypassSpeed); + applyAbAttrs(PreventBypassSpeedChanceAbAttr, p, null, false, bypassSpeed, canCheckHeldItems); + if (canCheckHeldItems.value) { + this.scene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); + } + battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; + }); + + // 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]; + + if (aCommand?.command !== bCommand?.command) { + if (aCommand?.command === Command.FIGHT) { + return 1; + } else if (bCommand?.command === Command.FIGHT) { + return -1; + } + } else if (aCommand?.command === Command.FIGHT) { + const aMove = allMoves[aCommand.move!.move]; + const bMove = allMoves[bCommand!.move!.move]; + + // 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); + 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); + 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) { + 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 = 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; + + for (const o of moveOrder) { + + const pokemon = field[o]; + const turnCommand = this.scene.currentBattle.turnCommands[o]; + + if (turnCommand?.skip) { + continue; + } + + switch (turnCommand?.command) { + case Command.FIGHT: + const queuedMove = turnCommand.move; + pokemon.turnData.order = orderIndex++; + if (!queuedMove) { + continue; + } + const move = pokemon.getMoveset().find(m => m?.moveId === queuedMove.move) || new PokemonMove(queuedMove.move); + if (move.getMove().hasAttr(MoveHeaderAttr)) { + this.scene.unshiftPhase(new MoveHeaderPhase(this.scene, pokemon, move)); + } + if (pokemon.isPlayer()) { + if (turnCommand.cursor === -1) { + this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move));//TODO: is the bang correct here? + } else { + const playerPhase = new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP);//TODO: is the bang correct here? + this.scene.pushPhase(playerPhase); + } + } else { + this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP));//TODO: is the bang correct here? + } + break; + case Command.BALL: + this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets![0] % 2, turnCommand.cursor!));//TODO: is the bang correct here? + break; + case Command.POKEMON: + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), turnCommand.cursor!, true, turnCommand.args![0] as boolean, pokemon.isPlayer()));//TODO: is the bang correct here? + break; + case Command.RUN: + let runningPokemon = pokemon; + if (this.scene.currentBattle.double) { + const playerActivePokemon = field.filter(pokemon => { + if (!!pokemon) { + return pokemon.isPlayer() && pokemon.isActive(); + } else { + return; + } + }); + // if only one pokemon is alive, use that one + if (playerActivePokemon.length > 1) { + // find which active pokemon has faster speed + const fasterPokemon = playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) ? playerActivePokemon[0] : playerActivePokemon[1]; + // check if either active pokemon has the ability "Run Away" + const hasRunAway = playerActivePokemon.find(p => p.hasAbility(Abilities.RUN_AWAY)); + runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon; + } + } + this.scene.unshiftPhase(new AttemptRunPhase(this.scene, runningPokemon.getFieldIndex())); + break; + } + } + + this.scene.pushPhase(new WeatherEffectPhase(this.scene)); + + for (const o of moveOrder) { + if (field[o].status && field[o].status.isPostTurn()) { + this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, o)); + } + } + + this.scene.pushPhase(new BerryPhase(this.scene)); + this.scene.pushPhase(new TurnEndPhase(this.scene)); + + /** + * this.end() will call shiftPhase(), which dumps everything from PrependQueue (aka everything that is unshifted()) to the front + * of the queue and dequeues to start the next phase + * this is important since stuff like SwitchSummon, AttemptRun, AttemptCapture Phases break the "flow" and should take precedence + */ + this.end(); + } +} diff --git a/src/phases/unavailable-phase.ts b/src/phases/unavailable-phase.ts new file mode 100644 index 00000000000..59bfca7875e --- /dev/null +++ b/src/phases/unavailable-phase.ts @@ -0,0 +1,17 @@ +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Mode } from "#app/ui/ui"; +import { LoginPhase } from "./login-phase"; + +export class UnavailablePhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start(): void { + this.scene.ui.setMode(Mode.UNAVAILABLE, () => { + this.scene.unshiftPhase(new LoginPhase(this.scene, true)); + this.end(); + }); + } +} diff --git a/src/phases/unlock-phase.ts b/src/phases/unlock-phase.ts new file mode 100644 index 00000000000..65060309a6c --- /dev/null +++ b/src/phases/unlock-phase.ts @@ -0,0 +1,28 @@ +import BattleScene from "#app/battle-scene"; +import { Phase } from "#app/phase"; +import { Unlockables, getUnlockableName } from "#app/system/unlockables"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; + +export class UnlockPhase extends Phase { + private unlockable: Unlockables; + + constructor(scene: BattleScene, unlockable: Unlockables) { + super(scene); + + this.unlockable = unlockable; + } + + start(): void { + this.scene.time.delayedCall(2000, () => { + this.scene.gameData.unlocks[this.unlockable] = true; + // Sound loaded into game as is + this.scene.playSound("level_up_fanfare"); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:unlockedSomething", { unlockedThing: getUnlockableName(this.unlockable) }), null, () => { + this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); + this.end(); + }, null, true, 1500); + }); + } +} diff --git a/src/phases/victory-phase.ts b/src/phases/victory-phase.ts new file mode 100644 index 00000000000..9679a79a37d --- /dev/null +++ b/src/phases/victory-phase.ts @@ -0,0 +1,151 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex, BattleType } from "#app/battle"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { ExpShareModifier, ExpBalanceModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; +import * as Utils from "#app/utils"; +import Overrides from "#app/overrides"; +import { BattleEndPhase } from "./battle-end-phase"; +import { NewBattlePhase } from "./new-battle-phase"; +import { PokemonPhase } from "./pokemon-phase"; +import { AddEnemyBuffModifierPhase } from "./add-enemy-buff-modifier-phase"; +import { EggLapsePhase } from "./egg-lapse-phase"; +import { ExpPhase } from "./exp-phase"; +import { GameOverPhase } from "./game-over-phase"; +import { ModifierRewardPhase } from "./modifier-reward-phase"; +import { SelectModifierPhase } from "./select-modifier-phase"; +import { ShowPartyExpBarPhase } from "./show-party-exp-bar-phase"; +import { TrainerVictoryPhase } from "./trainer-victory-phase"; + +export class VictoryPhase extends PokemonPhase { + constructor(scene: BattleScene, battlerIndex: BattlerIndex) { + super(scene, battlerIndex); + } + + start() { + super.start(); + + this.scene.gameData.gameStats.pokemonDefeated++; + + const participantIds = this.scene.currentBattle.playerParticipantIds; + const party = this.scene.getParty(); + const expShareModifier = this.scene.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; + const expBalanceModifier = this.scene.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; + const multipleParticipantExpBonusModifier = this.scene.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; + const nonFaintedPartyMembers = party.filter(p => p.hp); + const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < this.scene.getMaxExpLevel()); + const partyMemberExp: number[] = []; + + if (participantIds.size) { + let expValue = this.getPokemon().getExpValue(); + if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + expValue = Math.floor(expValue * 1.5); + } + for (const partyMember of nonFaintedPartyMembers) { + const pId = partyMember.id; + const participated = participantIds.has(pId); + if (participated) { + partyMember.addFriendship(2); + } + if (!expPartyMembers.includes(partyMember)) { + continue; + } + if (!participated && !expShareModifier) { + partyMemberExp.push(0); + continue; + } + let expMultiplier = 0; + if (participated) { + expMultiplier += (1 / participantIds.size); + if (participantIds.size > 1 && multipleParticipantExpBonusModifier) { + expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; + } + } else if (expShareModifier) { + expMultiplier += (expShareModifier.getStackCount() * 0.2) / participantIds.size; + } + if (partyMember.pokerus) { + expMultiplier *= 1.5; + } + if (Overrides.XP_MULTIPLIER_OVERRIDE !== null) { + expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; + } + const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); + this.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); + partyMemberExp.push(Math.floor(pokemonExp.value)); + } + + if (expBalanceModifier) { + let totalLevel = 0; + let totalExp = 0; + expPartyMembers.forEach((expPartyMember, epm) => { + totalExp += partyMemberExp[epm]; + totalLevel += expPartyMember.level; + }); + + const medianLevel = Math.floor(totalLevel / expPartyMembers.length); + + const recipientExpPartyMemberIndexes: number[] = []; + expPartyMembers.forEach((expPartyMember, epm) => { + if (expPartyMember.level <= medianLevel) { + recipientExpPartyMemberIndexes.push(epm); + } + }); + + const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); + + expPartyMembers.forEach((_partyMember, pm) => { + partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); + }); + } + + for (let pm = 0; pm < expPartyMembers.length; pm++) { + const exp = partyMemberExp[pm]; + + if (exp) { + const partyMemberIndex = party.indexOf(expPartyMembers[pm]); + this.scene.unshiftPhase(expPartyMembers[pm].isOnField() ? new ExpPhase(this.scene, partyMemberIndex, exp) : new ShowPartyExpBarPhase(this.scene, partyMemberIndex, exp)); + } + } + } + + if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType ? !p?.isFainted(true) : p.isOnField())) { + this.scene.pushPhase(new BattleEndPhase(this.scene)); + if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + this.scene.pushPhase(new TrainerVictoryPhase(this.scene)); + } + if (this.scene.gameMode.isEndless || !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) { + this.scene.pushPhase(new EggLapsePhase(this.scene)); + if (this.scene.currentBattle.waveIndex % 10) { + this.scene.pushPhase(new SelectModifierPhase(this.scene)); + } else if (this.scene.gameMode.isDaily) { + this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.EXP_CHARM)); + if (this.scene.currentBattle.waveIndex > 10 && !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) { + this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.GOLDEN_POKEBALL)); + } + } else { + const superExpWave = !this.scene.gameMode.isEndless ? (this.scene.offsetGym ? 0 : 20) : 10; + if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex === 10) { + this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.EXP_SHARE)); + } + if (this.scene.currentBattle.waveIndex <= 750 && (this.scene.currentBattle.waveIndex <= 500 || (this.scene.currentBattle.waveIndex % 30) === superExpWave)) { + this.scene.pushPhase(new ModifierRewardPhase(this.scene, (this.scene.currentBattle.waveIndex % 30) !== superExpWave || this.scene.currentBattle.waveIndex > 250 ? modifierTypes.EXP_CHARM : modifierTypes.SUPER_EXP_CHARM)); + } + if (this.scene.currentBattle.waveIndex <= 150 && !(this.scene.currentBattle.waveIndex % 50)) { + this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.GOLDEN_POKEBALL)); + } + if (this.scene.gameMode.isEndless && !(this.scene.currentBattle.waveIndex % 50)) { + this.scene.pushPhase(new ModifierRewardPhase(this.scene, !(this.scene.currentBattle.waveIndex % 250) ? modifierTypes.VOUCHER_PREMIUM : modifierTypes.VOUCHER_PLUS)); + this.scene.pushPhase(new AddEnemyBuffModifierPhase(this.scene)); + } + } + this.scene.pushPhase(new NewBattlePhase(this.scene)); + } else { + this.scene.currentBattle.battleType = BattleType.CLEAR; + this.scene.score += this.scene.gameMode.getClearScoreBonus(); + this.scene.updateScoreText(); + this.scene.pushPhase(new GameOverPhase(this.scene, true)); + } + } + + this.end(); + } +} diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts new file mode 100644 index 00000000000..e85ef0326f6 --- /dev/null +++ b/src/phases/weather-effect-phase.ts @@ -0,0 +1,68 @@ +import BattleScene from "#app/battle-scene"; +import { applyPreWeatherEffectAbAttrs, SuppressWeatherEffectAbAttr, PreWeatherDamageAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPostWeatherLapseAbAttrs, PostWeatherLapseAbAttr } from "#app/data/ability.js"; +import { CommonAnim } from "#app/data/battle-anims"; +import { Weather, getWeatherDamageMessage, getWeatherLapseMessage } from "#app/data/weather"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { WeatherType } from "#app/enums/weather-type"; +import Pokemon, { HitResult } from "#app/field/pokemon"; +import * as Utils from "#app/utils"; +import { CommonAnimPhase } from "./common-anim-phase"; + +export class WeatherEffectPhase extends CommonAnimPhase { + public weather: Weather | null; + + constructor(scene: BattleScene) { + super(scene, undefined, undefined, CommonAnim.SUNNY + ((scene?.arena?.weather?.weatherType || WeatherType.NONE) - 1)); + this.weather = scene?.arena?.weather; + } + + start() { + // Update weather state with any changes that occurred during the turn + this.weather = this.scene?.arena?.weather; + + if (!this.weather) { + this.end(); + return; + } + + this.setAnimation(CommonAnim.SUNNY + (this.weather.weatherType - 1)); + + if (this.weather.isDamaging()) { + + const cancelled = new Utils.BooleanHolder(false); + + this.executeForAll((pokemon: Pokemon) => applyPreWeatherEffectAbAttrs(SuppressWeatherEffectAbAttr, pokemon, this.weather, cancelled)); + + if (!cancelled.value) { + const inflictDamage = (pokemon: Pokemon) => { + const cancelled = new Utils.BooleanHolder(false); + + applyPreWeatherEffectAbAttrs(PreWeatherDamageAbAttr, pokemon, this.weather, cancelled); + applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); + + if (cancelled.value || pokemon.getTag(BattlerTagType.UNDERGROUND) || pokemon.getTag(BattlerTagType.UNDERWATER)) { + return; + } + + const damage = Math.ceil(pokemon.getMaxHp() / 16); + + this.scene.queueMessage(getWeatherDamageMessage(this.weather?.weatherType!, pokemon)!); // TODO: are those bangs correct? + pokemon.damageAndUpdate(damage, HitResult.EFFECTIVE, false, false, true); + }; + + this.executeForAll((pokemon: Pokemon) => { + const immune = !pokemon || !!pokemon.getTypes(true, true).filter(t => this.weather?.isTypeDamageImmune(t)).length; + if (!immune) { + inflictDamage(pokemon); + } + }); + } + } + + this.scene.ui.showText(getWeatherLapseMessage(this.weather.weatherType)!, null, () => { // TODO: is this bang correct? + this.executeForAll((pokemon: Pokemon) => applyPostWeatherLapseAbAttrs(PostWeatherLapseAbAttr, pokemon, this.weather)); + + super.start(); + }); + } +} diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index 741c31183d4..c9a76dc50a4 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -377,7 +377,7 @@ export default class SpritePipeline extends FieldSpritePipeline { this.set2f("texSize", sprite.texture.source[0].width, sprite.texture.source[0].height); this.set1f("yOffset", sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); this.set4fv("tone", tone); - this.bindTexture(this.game.textures.get("tera").source[0].glTexture, 1); + this.bindTexture(this.game.textures.get("tera").source[0].glTexture!, 1); // TODO: is this bang correct? if ((gameObject.scene as BattleScene).fusionPaletteSwaps) { const spriteColors = ((ignoreOverride && data["spriteColorsBase"]) || data["spriteColors"] || []) as number[][]; diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 3bcac101465..705fd5143a4 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -2,59 +2,84 @@ import i18next from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import processor, { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; -import { deConfig } from "#app/locales/de/config.js"; -import { enConfig } from "#app/locales/en/config.js"; -import { esConfig } from "#app/locales/es/config.js"; -import { frConfig } from "#app/locales/fr/config.js"; -import { itConfig } from "#app/locales/it/config.js"; -import { koConfig } from "#app/locales/ko/config.js"; -import { ptBrConfig } from "#app/locales/pt_BR/config.js"; -import { zhCnConfig } from "#app/locales/zh_CN/config.js"; -import { zhTwConfig } from "#app/locales/zh_TW/config.js"; +import { caEsConfig} from "#app/locales/ca_ES/config"; +import { deConfig } from "#app/locales/de/config"; +import { enConfig } from "#app/locales/en/config"; +import { esConfig } from "#app/locales/es/config"; +import { frConfig } from "#app/locales/fr/config"; +import { itConfig } from "#app/locales/it/config"; +import { koConfig } from "#app/locales/ko/config"; +import { jaConfig } from "#app/locales/ja/config"; +import { ptBrConfig } from "#app/locales/pt_BR/config"; +import { zhCnConfig } from "#app/locales/zh_CN/config"; +import { zhTwConfig } from "#app/locales/zh_TW/config"; -const unicodeHalfAndFullWidthForms = [ - "U+FF00-FFEF" +interface LoadingFontFaceProperty { + face: FontFace, + extraOptions?: { [key:string]: any }, + only?: Array +} + +const unicodeRanges = { + fullwidth: "U+FF00-FFEF", + hangul: "U+1100-11FF,U+3130-318F,U+A960-A97F,U+AC00-D7AF,U+D7B0-D7FF", + kana: "U+3040-30FF", + CJKCommon: "U+2E80-2EFF,U+3000-303F,U+31C0-31EF,U+3200-32FF,U+3400-4DBF,U+F900-FAFF,U+FE30-FE4F", + CJKIdeograph: "U+4E00-9FFF", + specialCharacters: "U+266A,U+2605,U+2665,U+2663" //♪.★,♥,♣ +}; +const rangesByLanguage = { + korean: [unicodeRanges.CJKCommon, unicodeRanges.hangul].join(","), + chinese: [unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.CJKIdeograph].join(","), + japanese: [unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.kana, unicodeRanges.CJKIdeograph].join(",") +}; + +const fonts: Array = [ + // unicode (special character from PokePT) + { + face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: unicodeRanges.specialCharacters }), + }, + { + face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: unicodeRanges.specialCharacters }), + extraOptions: { sizeAdjust: "133%" }, + }, + // unicode (korean) + { + face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: rangesByLanguage.korean }), + }, + { + face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: rangesByLanguage.korean }), + extraOptions: { sizeAdjust: "133%" }, + }, + // unicode (chinese) + { + face: new FontFace("emerald", "url(./fonts/unifont-15.1.05.subset.woff2)", { unicodeRange: rangesByLanguage.chinese }), + extraOptions: { sizeAdjust: "70%", format: "woff2" }, + only: [ "en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca" ], + }, + { + face: new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.subset.woff2)", { unicodeRange: rangesByLanguage.chinese }), + extraOptions: { format: "woff2" }, + only: [ "en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca" ], + }, + // japanese + { + face: new FontFace("emerald", "url(./fonts/Galmuri11.subset.woff2)", { unicodeRange: rangesByLanguage.japanese }), + extraOptions: { sizeAdjust: "66%" }, + only: [ "ja" ], + }, + { + face: new FontFace("pkmnems", "url(./fonts/Galmuri9.subset.woff2)", { unicodeRange: rangesByLanguage.japanese }), + only: [ "ja" ], + }, ]; -const unicodeCJK = [ - "U+2E80-2EFF", - "U+3000-303F", - "U+31C0-31EF", - "U+3200-32FF", - "U+3400-4DBF", - "U+4E00-9FFF", - "U+F900-FAFF", - "U+FE30-FE4F", -].join(","); - -const unicodeHangul = [ - "U+1100-11FF", - "U+3130-318F", - "U+A960-A97F", - "U+AC00-D7AF", - "U+D7B0-D7FF", -].join(","); - -const fonts = [ - // korean - new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: unicodeHangul}), - Object.assign( - new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: unicodeHangul}), - { sizeAdjust: "133%" } - ), - // unicode - Object.assign( - new FontFace("emerald", "url(./fonts/unifont-15.1.05.otf)", { unicodeRange: [unicodeCJK, unicodeHalfAndFullWidthForms].join(",") }), - { sizeAdjust: "70%", format: "opentype" } - ), - Object.assign( - new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.otf)", { unicodeRange: [unicodeCJK, unicodeHalfAndFullWidthForms].join(",") }), - { format: "opentype" } - ), -]; - -async function initFonts() { - const results = await Promise.allSettled(fonts.map(font => font.load())); +async function initFonts(language: string | undefined) { + const results = await Promise.allSettled( + fonts + .filter(font => !font.only || font.only.some(exclude => language?.indexOf(exclude) === 0)) + .map(font => Object.assign(font.face, font.extraOptions ?? {}).load()) + ); for (const result of results) { if (result.status === "fulfilled") { document.fonts?.add(result.value); @@ -94,13 +119,13 @@ export async function initI18n(): Promise { await i18next.init({ nonExplicitSupportedLngs: true, fallbackLng: "en", - supportedLngs: ["en", "es", "fr", "it", "de", "zh", "pt", "ko"], + supportedLngs: ["en", "es", "fr", "it", "de", "zh", "pt", "ko", "ja", "ca"], defaultNS: "menu", ns: Object.keys(enConfig), detection: { lookupLocalStorage: "prLang" }, - debug: true, + debug: Number(import.meta.env.VITE_I18N_DEBUG) === 1, interpolation: { escapeValue: false, }, @@ -132,11 +157,17 @@ export async function initI18n(): Promise { ko: { ...koConfig }, + ja: { + ...jaConfig + }, + "ca-ES": { + ...caEsConfig + } }, postProcess: ["korean-postposition"], }); - await initFonts(); + await initFonts(localStorage.getItem("prLang") ?? undefined); } export default i18next; diff --git a/src/plugins/vite/vite-minify-json-plugin.ts b/src/plugins/vite/vite-minify-json-plugin.ts new file mode 100644 index 00000000000..57130669075 --- /dev/null +++ b/src/plugins/vite/vite-minify-json-plugin.ts @@ -0,0 +1,57 @@ +import path from "path"; +import fs from "fs"; +import { type Plugin as VitePlugin } from "vite"; + +/** + * Crawl a directory (recursively if wanted) for json files and minifies found ones. + * @param dir the directory to crawl + * @param recursive if true, will crawl subdirectories + */ +function applyToDir(dir: string, recursive?: boolean) { + const files = fs.readdirSync(dir).filter((file) => !/^\..*/.test(file)); + + for (const file of files) { + const filePath = path.join(dir, file); + const stat = fs.lstatSync(filePath); + + if (stat.isDirectory() && recursive) { + applyToDir(filePath, recursive); // only if recursive is true + } else if (path.extname(file) === ".json") { + const contents = fs.readFileSync(filePath, "utf8"); + const minifiedContent = JSON.stringify(JSON.parse(contents)); + + fs.writeFileSync(filePath, minifiedContent, "utf8"); + } + } +} + +/** + * Plugin to mnify json files in the build folder after the bundling is done. + * @param basePath base path/es starting inside the build dir (e.g. will always start with "/dist" if dist is the build dir) + * @param recursive if true, will crawl subdirectories + */ +export function minifyJsonPlugin(basePath: string | string[], recursive?: boolean): VitePlugin { + let buildDir = "dist"; // Default build dir + + return { + name: "flx-minify-json", + apply: "build", + configResolved(config) { + buildDir = config.build.outDir; // Read the build output directory from Vite config + }, + async closeBundle() { + console.log("Minifying JSON files..."); + const basePathes = Array.isArray(basePath) ? basePath : [basePath]; + + basePathes.forEach((basePath) => { + const baseDir = path.resolve(buildDir, basePath); + if (fs.existsSync(baseDir)) { + applyToDir(baseDir, recursive); + } else { + console.error(`Path ${baseDir} does not exist!`); + } + }); + console.log("Finished minifying JSON files!"); + }, + }; +} diff --git a/src/scene-base.ts b/src/scene-base.ts index 1d7a2518300..298b8096e54 100644 --- a/src/scene-base.ts +++ b/src/scene-base.ts @@ -73,7 +73,7 @@ export class SceneBase extends Phaser.Scene { filenames = `${key}.wav`; } if (!folder) { - folder = ""; + folder = "se/"; } else { folder += "/"; } @@ -81,7 +81,7 @@ export class SceneBase extends Phaser.Scene { filenames = [ filenames ]; } for (const f of filenames as string[]) { - this.load.audio(key, this.getCachedUrl(`audio/se/${folder}${f}`)); + this.load.audio(folder+key, this.getCachedUrl(`audio/${folder}${f}`)); } } diff --git a/src/system/achv.ts b/src/system/achv.ts index 511ddd1eb8e..89e5493eb2e 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -1,11 +1,14 @@ import { Modifier } from "typescript"; import BattleScene from "../battle-scene"; import { TurnHeldItemTransferModifier } from "../modifier/modifier"; +import { pokemonEvolutions } from "#app/data/pokemon-evolutions"; import i18next from "i18next"; import * as Utils from "../utils"; import { PlayerGender } from "#enums/player-gender"; -import { ParseKeys } from "i18next"; -import { Challenge, SingleGenerationChallenge, SingleTypeChallenge } from "#app/data/challenge.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, @@ -27,9 +30,9 @@ export class Achv { public hasParent: boolean; public parentId: string; - private conditionFunc: (scene: BattleScene, args: any[]) => boolean; + private conditionFunc: ConditionFn | undefined; - constructor(localizationKey:string, name: string, description: string, iconImage: string, score: integer, conditionFunc?: (scene: BattleScene, args: any[]) => boolean) { + constructor(localizationKey:string, name: string, description: string, iconImage: string, score: integer, conditionFunc?: ConditionFn) { this.name = name; this.description = description; this.iconImage = iconImage; @@ -40,13 +43,13 @@ export class Achv { /** * Get the name of the achievement based on the gender of the player - * @param playerGender - the gender of the player + * @param playerGender - the gender of the player (default: {@linkcode PlayerGender.UNSET}) * @returns the name of the achievement localized for the player gender */ - getName(playerGender: PlayerGender): string { - const prefix = playerGender === PlayerGender.FEMALE ?"PGF" : "PGM"; + getName(playerGender: PlayerGender = PlayerGender.UNSET): string { + const genderStr = PlayerGender[playerGender].toLowerCase(); // Localization key is used to get the name of the achievement - return i18next.t(`${prefix}achv:${this.localizationKey}.name` as ParseKeys); + return i18next.t(`achv:${this.localizationKey}.name`, { context: genderStr }); } getDescription(): string { @@ -63,7 +66,7 @@ export class Achv { return this; } - validate(scene: BattleScene, args: any[]): boolean { + validate(scene: BattleScene, args?: any[]): boolean { return !this.conditionFunc || this.conditionFunc(scene, args); } @@ -136,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)); } } @@ -149,114 +152,110 @@ export class ChallengeAchv extends Achv { */ export function getAchievementDescription(localizationKey: string): string { // We need to get the player gender from the game data to add the correct prefix to the achievement name - let playerGender = PlayerGender.MALE; - if (this?.scene) { - playerGender = this.scene.gameData.gender; - } - let genderPrefix = "PGM"; - if (playerGender === PlayerGender.FEMALE) { - genderPrefix = "PGF"; - } + const genderIndex = this?.scene?.gameData?.gender ?? PlayerGender.MALE; //TODO: why is `this` being used here!? We are not inside a scope (copied from original) + const genderStr = PlayerGender[genderIndex].toLowerCase(); switch (localizationKey) { case "10K_MONEY": - return i18next.t(`${genderPrefix}achv:MoneyAchv.description` as ParseKeys, {"moneyAmount": achvs._10K_MONEY.moneyAmount.toLocaleString("en-US")}); + return i18next.t("achv:MoneyAchv.description", {context: genderStr, "moneyAmount": achvs._10K_MONEY.moneyAmount.toLocaleString("en-US")}); case "100K_MONEY": - return i18next.t(`${genderPrefix}achv:MoneyAchv.description` as ParseKeys, {"moneyAmount": achvs._100K_MONEY.moneyAmount.toLocaleString("en-US")}); + return i18next.t("achv:MoneyAchv.description", {context: genderStr, "moneyAmount": achvs._100K_MONEY.moneyAmount.toLocaleString("en-US")}); case "1M_MONEY": - return i18next.t(`${genderPrefix}achv:MoneyAchv.description` as ParseKeys, {"moneyAmount": achvs._1M_MONEY.moneyAmount.toLocaleString("en-US")}); + return i18next.t("achv:MoneyAchv.description", {context: genderStr, "moneyAmount": achvs._1M_MONEY.moneyAmount.toLocaleString("en-US")}); case "10M_MONEY": - return i18next.t(`${genderPrefix}achv:MoneyAchv.description` as ParseKeys, {"moneyAmount": achvs._10M_MONEY.moneyAmount.toLocaleString("en-US")}); + return i18next.t("achv:MoneyAchv.description", {context: genderStr, "moneyAmount": achvs._10M_MONEY.moneyAmount.toLocaleString("en-US")}); case "250_DMG": - return i18next.t(`${genderPrefix}achv:DamageAchv.description` as ParseKeys, {"damageAmount": achvs._250_DMG.damageAmount.toLocaleString("en-US")}); + return i18next.t("achv:DamageAchv.description", {context: genderStr, "damageAmount": achvs._250_DMG.damageAmount.toLocaleString("en-US")}); case "1000_DMG": - return i18next.t(`${genderPrefix}achv:DamageAchv.description` as ParseKeys, {"damageAmount": achvs._1000_DMG.damageAmount.toLocaleString("en-US")}); + return i18next.t("achv:DamageAchv.description", {context: genderStr, "damageAmount": achvs._1000_DMG.damageAmount.toLocaleString("en-US")}); case "2500_DMG": - return i18next.t(`${genderPrefix}achv:DamageAchv.description` as ParseKeys, {"damageAmount": achvs._2500_DMG.damageAmount.toLocaleString("en-US")}); + return i18next.t("achv:DamageAchv.description", {context: genderStr, "damageAmount": achvs._2500_DMG.damageAmount.toLocaleString("en-US")}); case "10000_DMG": - return i18next.t(`${genderPrefix}achv:DamageAchv.description` as ParseKeys, {"damageAmount": achvs._10000_DMG.damageAmount.toLocaleString("en-US")}); + return i18next.t("achv:DamageAchv.description", {context: genderStr, "damageAmount": achvs._10000_DMG.damageAmount.toLocaleString("en-US")}); case "250_HEAL": - return i18next.t(`${genderPrefix}achv:HealAchv.description` as ParseKeys, {"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(`${genderPrefix}achv:HealAchv.description` as ParseKeys, {"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(`${genderPrefix}achv:HealAchv.description` as ParseKeys, {"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(`${genderPrefix}achv:HealAchv.description` as ParseKeys, {"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(`${genderPrefix}achv:LevelAchv.description` as ParseKeys, {"level": achvs.LV_100.level}); + return i18next.t("achv:LevelAchv.description", {context: genderStr, "level": achvs.LV_100.level}); case "LV_250": - return i18next.t(`${genderPrefix}achv:LevelAchv.description` as ParseKeys, {"level": achvs.LV_250.level}); + return i18next.t("achv:LevelAchv.description", {context: genderStr, "level": achvs.LV_250.level}); case "LV_1000": - return i18next.t(`${genderPrefix}achv:LevelAchv.description` as ParseKeys, {"level": achvs.LV_1000.level}); + return i18next.t("achv:LevelAchv.description", {context: genderStr, "level": achvs.LV_1000.level}); case "10_RIBBONS": - return i18next.t(`${genderPrefix}achv:RibbonAchv.description` as ParseKeys, {"ribbonAmount": achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US")}); + return i18next.t("achv:RibbonAchv.description", {context: genderStr, "ribbonAmount": achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US")}); case "25_RIBBONS": - return i18next.t(`${genderPrefix}achv:RibbonAchv.description` as ParseKeys, {"ribbonAmount": achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US")}); + return i18next.t("achv:RibbonAchv.description", {context: genderStr, "ribbonAmount": achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US")}); case "50_RIBBONS": - return i18next.t(`${genderPrefix}achv:RibbonAchv.description` as ParseKeys, {"ribbonAmount": achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US")}); + return i18next.t("achv:RibbonAchv.description", {context: genderStr, "ribbonAmount": achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US")}); case "75_RIBBONS": - return i18next.t(`${genderPrefix}achv:RibbonAchv.description` as ParseKeys, {"ribbonAmount": achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US")}); + return i18next.t("achv:RibbonAchv.description", {context: genderStr, "ribbonAmount": achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US")}); case "100_RIBBONS": - return i18next.t(`${genderPrefix}achv:RibbonAchv.description` as ParseKeys, {"ribbonAmount": achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US")}); - case "TRANSFER_MAX_BATTLE_STAT": - return i18next.t(`${genderPrefix}achv:TRANSFER_MAX_BATTLE_STAT.description` as ParseKeys); + return i18next.t("achv:RibbonAchv.description", {context: genderStr, "ribbonAmount": achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US")}); + case "TRANSFER_MAX_STAT_STAGE": + return i18next.t("achv:TRANSFER_MAX_BATTLE_STAT.description", { context: genderStr }); case "MAX_FRIENDSHIP": - return i18next.t(`${genderPrefix}achv:MAX_FRIENDSHIP.description` as ParseKeys); + return i18next.t("achv:MAX_FRIENDSHIP.description", { context: genderStr }); case "MEGA_EVOLVE": - return i18next.t(`${genderPrefix}achv:MEGA_EVOLVE.description` as ParseKeys); + return i18next.t("achv:MEGA_EVOLVE.description", { context: genderStr }); case "GIGANTAMAX": - return i18next.t(`${genderPrefix}achv:GIGANTAMAX.description` as ParseKeys); + return i18next.t("achv:GIGANTAMAX.description", { context: genderStr }); case "TERASTALLIZE": - return i18next.t(`${genderPrefix}achv:TERASTALLIZE.description` as ParseKeys); + return i18next.t("achv:TERASTALLIZE.description", { context: genderStr }); case "STELLAR_TERASTALLIZE": - return i18next.t(`${genderPrefix}achv:STELLAR_TERASTALLIZE.description` as ParseKeys); + return i18next.t("achv:STELLAR_TERASTALLIZE.description", { context: genderStr }); case "SPLICE": - return i18next.t(`${genderPrefix}achv:SPLICE.description` as ParseKeys); + return i18next.t("achv:SPLICE.description", { context: genderStr }); case "MINI_BLACK_HOLE": - return i18next.t(`${genderPrefix}achv:MINI_BLACK_HOLE.description` as ParseKeys); + return i18next.t("achv:MINI_BLACK_HOLE.description", { context: genderStr }); case "CATCH_MYTHICAL": - return i18next.t(`${genderPrefix}achv:CATCH_MYTHICAL.description` as ParseKeys); + return i18next.t("achv:CATCH_MYTHICAL.description", { context: genderStr }); case "CATCH_SUB_LEGENDARY": - return i18next.t(`${genderPrefix}achv:CATCH_SUB_LEGENDARY.description` as ParseKeys); + return i18next.t("achv:CATCH_SUB_LEGENDARY.description", { context: genderStr }); case "CATCH_LEGENDARY": - return i18next.t(`${genderPrefix}achv:CATCH_LEGENDARY.description` as ParseKeys); + return i18next.t("achv:CATCH_LEGENDARY.description", { context: genderStr }); case "SEE_SHINY": - return i18next.t(`${genderPrefix}achv:SEE_SHINY.description` as ParseKeys); + return i18next.t("achv:SEE_SHINY.description", { context: genderStr }); case "SHINY_PARTY": - return i18next.t(`${genderPrefix}achv:SHINY_PARTY.description` as ParseKeys); + return i18next.t("achv:SHINY_PARTY.description", { context: genderStr }); case "HATCH_MYTHICAL": - return i18next.t(`${genderPrefix}achv:HATCH_MYTHICAL.description` as ParseKeys); + return i18next.t("achv:HATCH_MYTHICAL.description", { context: genderStr }); case "HATCH_SUB_LEGENDARY": - return i18next.t(`${genderPrefix}achv:HATCH_SUB_LEGENDARY.description` as ParseKeys); + return i18next.t("achv:HATCH_SUB_LEGENDARY.description", { context: genderStr }); case "HATCH_LEGENDARY": - return i18next.t(`${genderPrefix}achv:HATCH_LEGENDARY.description` as ParseKeys); + return i18next.t("achv:HATCH_LEGENDARY.description", { context: genderStr }); case "HATCH_SHINY": - return i18next.t(`${genderPrefix}achv:HATCH_SHINY.description` as ParseKeys); + return i18next.t("achv:HATCH_SHINY.description", { context: genderStr }); case "HIDDEN_ABILITY": - return i18next.t(`${genderPrefix}achv:HIDDEN_ABILITY.description` as ParseKeys); + return i18next.t("achv:HIDDEN_ABILITY.description", { context: genderStr }); case "PERFECT_IVS": - return i18next.t(`${genderPrefix}achv:PERFECT_IVS.description` as ParseKeys); + return i18next.t("achv:PERFECT_IVS.description", { context: genderStr }); case "CLASSIC_VICTORY": - return i18next.t(`${genderPrefix}achv:CLASSIC_VICTORY.description` as ParseKeys); + return i18next.t("achv:CLASSIC_VICTORY.description", { context: genderStr }); + case "UNEVOLVED_CLASSIC_VICTORY": + return i18next.t("achv:UNEVOLVED_CLASSIC_VICTORY.description", { context: genderStr }); case "MONO_GEN_ONE": - return i18next.t(`${genderPrefix}achv:MONO_GEN_ONE.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_ONE.description", { context: genderStr }); case "MONO_GEN_TWO": - return i18next.t(`${genderPrefix}achv:MONO_GEN_TWO.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_TWO.description", { context: genderStr }); case "MONO_GEN_THREE": - return i18next.t(`${genderPrefix}achv:MONO_GEN_THREE.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_THREE.description", { context: genderStr }); case "MONO_GEN_FOUR": - return i18next.t(`${genderPrefix}achv:MONO_GEN_FOUR.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_FOUR.description", { context: genderStr }); case "MONO_GEN_FIVE": - return i18next.t(`${genderPrefix}achv:MONO_GEN_FIVE.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_FIVE.description", { context: genderStr }); case "MONO_GEN_SIX": - return i18next.t(`${genderPrefix}achv:MONO_GEN_SIX.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_SIX.description", { context: genderStr }); case "MONO_GEN_SEVEN": - return i18next.t(`${genderPrefix}achv:MONO_GEN_SEVEN.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_SEVEN.description", { context: genderStr }); case "MONO_GEN_EIGHT": - return i18next.t(`${genderPrefix}achv:MONO_GEN_EIGHT.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_EIGHT.description", { context: genderStr }); case "MONO_GEN_NINE": - return i18next.t(`${genderPrefix}achv:MONO_GEN_NINE.description` as ParseKeys); + return i18next.t("achv:MONO_GEN_NINE.description", { context: genderStr }); case "MONO_NORMAL": case "MONO_FIGHTING": case "MONO_FLYING": @@ -275,7 +274,11 @@ export function getAchievementDescription(localizationKey: string): string { case "MONO_DRAGON": case "MONO_DARK": case "MONO_FAIRY": - return i18next.t(`${genderPrefix}achv:MonoType.description` as ParseKeys, {"type": i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`)}); + 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 ""; } @@ -283,73 +286,76 @@ export function getAchievementDescription(localizationKey: string): string { } export const achvs = { - _10K_MONEY: new MoneyAchv("10K_MONEY", "",10000, "nugget", 10), - _100K_MONEY: new MoneyAchv("100K_MONEY", "",100000, "big_nugget", 25).setSecret(true), - _1M_MONEY: new MoneyAchv("1M_MONEY","", 1000000, "relic_gold", 50).setSecret(true), - _10M_MONEY: new MoneyAchv("10M_MONEY","", 10000000, "coin_case", 100).setSecret(true), - _250_DMG: new DamageAchv("250_DMG","", 250, "lucky_punch", 10), - _1000_DMG: new DamageAchv("1000_DMG","", 1000, "lucky_punch_great", 25).setSecret(true), - _2500_DMG: new DamageAchv("2500_DMG","", 2500, "lucky_punch_ultra", 50).setSecret(true), - _10000_DMG: new DamageAchv("10000_DMG","", 10000, "lucky_punch_master", 100).setSecret(true), - _250_HEAL: new HealAchv("250_HEAL","", 250, "potion", 10), - _1000_HEAL: new HealAchv("1000_HEAL", "",1000, "super_potion", 25).setSecret(true), - _2500_HEAL: new HealAchv("2500_HEAL","", 2500, "hyper_potion", 50).setSecret(true), - _10000_HEAL: new HealAchv("10000_HEAL","", 10000, "max_potion", 100).setSecret(true), - LV_100: new LevelAchv("LV_100", "",100, "rare_candy", 25).setSecret(), - LV_250: new LevelAchv("LV_250", "",250, "rarer_candy", 50).setSecret(true), - LV_1000: new LevelAchv("LV_1000", "",1000, "candy_jar", 100).setSecret(true), - _10_RIBBONS: new RibbonAchv("10_RIBBONS","", 10, "bronze_ribbon", 10), - _25_RIBBONS: new RibbonAchv("25_RIBBONS", "",25, "great_ribbon", 25).setSecret(true), - _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","stick", 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), - TERASTALLIZE: new Achv("TERASTALLIZE","", "TERASTALLIZE.description","tera_orb", 25), - STELLAR_TERASTALLIZE: new Achv("STELLAR_TERASTALLIZE", "", "STELLAR_TERASTALLIZE.description","stellar_tera_shard", 25).setSecret(true), - SPLICE: new Achv("SPLICE","", "SPLICE.description","dna_splicers", 10), - MINI_BLACK_HOLE: new ModifierAchv("MINI_BLACK_HOLE","", "MINI_BLACK_HOLE.description","mini_black_hole", 25, modifier => modifier instanceof TurnHeldItemTransferModifier).setSecret(), - CATCH_MYTHICAL: new Achv("CATCH_MYTHICAL","", "CATCH_MYTHICAL.description","strange_ball", 50).setSecret(), - CATCH_SUB_LEGENDARY: new Achv("CATCH_SUB_LEGENDARY","", "CATCH_SUB_LEGENDARY.description","rb", 75).setSecret(), - CATCH_LEGENDARY: new Achv("CATCH_LEGENDARY", "", "CATCH_LEGENDARY.description","mb", 100).setSecret(), - SEE_SHINY: new Achv("SEE_SHINY", "", "SEE_SHINY.description","pb_gold", 75), - SHINY_PARTY: new Achv("SHINY_PARTY", "", "SHINY_PARTY.description","shiny_charm", 100).setSecret(true), - HATCH_MYTHICAL: new Achv("HATCH_MYTHICAL", "", "HATCH_MYTHICAL.description","pair_of_tickets", 75).setSecret(), - HATCH_SUB_LEGENDARY: new Achv("HATCH_SUB_LEGENDARY","", "HATCH_SUB_LEGENDARY.description","mystic_ticket", 100).setSecret(), - HATCH_LEGENDARY: new Achv("HATCH_LEGENDARY","", "HATCH_LEGENDARY.description","mystic_ticket", 125).setSecret(), - HATCH_SHINY: new Achv("HATCH_SHINY","", "HATCH_SHINY.description","golden_mystic_ticket", 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), - MONO_GEN_ONE_VICTORY: new ChallengeAchv("MONO_GEN_ONE","", "MONO_GEN_ONE.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 1), - MONO_GEN_TWO_VICTORY: new ChallengeAchv("MONO_GEN_TWO","", "MONO_GEN_TWO.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 2), - MONO_GEN_THREE_VICTORY: new ChallengeAchv("MONO_GEN_THREE","", "MONO_GEN_THREE.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 3), - MONO_GEN_FOUR_VICTORY: new ChallengeAchv("MONO_GEN_FOUR","", "MONO_GEN_FOUR.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 4), - MONO_GEN_FIVE_VICTORY: new ChallengeAchv("MONO_GEN_FIVE","", "MONO_GEN_FIVE.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 5), - MONO_GEN_SIX_VICTORY: new ChallengeAchv("MONO_GEN_SIX","", "MONO_GEN_SIX.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 6), - MONO_GEN_SEVEN_VICTORY: new ChallengeAchv("MONO_GEN_SEVEN","", "MONO_GEN_SEVEN.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 7), - MONO_GEN_EIGHT_VICTORY: new ChallengeAchv("MONO_GEN_EIGHT","", "MONO_GEN_EIGHT.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 8), - MONO_GEN_NINE_VICTORY: new ChallengeAchv("MONO_GEN_NINE","", "MONO_GEN_NINE.description", "mystic_ticket", 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), + _10K_MONEY: new MoneyAchv("10K_MONEY", "", 10000, "nugget", 10), + _100K_MONEY: new MoneyAchv("100K_MONEY", "", 100000, "big_nugget", 25).setSecret(true), + _1M_MONEY: new MoneyAchv("1M_MONEY", "", 1000000, "relic_gold", 50).setSecret(true), + _10M_MONEY: new MoneyAchv("10M_MONEY", "", 10000000, "coin_case", 100).setSecret(true), + _250_DMG: new DamageAchv("250_DMG", "", 250, "lucky_punch", 10), + _1000_DMG: new DamageAchv("1000_DMG", "", 1000, "lucky_punch_great", 25).setSecret(true), + _2500_DMG: new DamageAchv("2500_DMG", "", 2500, "lucky_punch_ultra", 50).setSecret(true), + _10000_DMG: new DamageAchv("10000_DMG", "", 10000, "lucky_punch_master", 100).setSecret(true), + _250_HEAL: new HealAchv("250_HEAL", "", 250, "potion", 10), + _1000_HEAL: new HealAchv("1000_HEAL", "", 1000, "super_potion", 25).setSecret(true), + _2500_HEAL: new HealAchv("2500_HEAL", "", 2500, "hyper_potion", 50).setSecret(true), + _10000_HEAL: new HealAchv("10000_HEAL", "", 10000, "max_potion", 100).setSecret(true), + LV_100: new LevelAchv("LV_100", "", 100, "rare_candy", 25).setSecret(), + LV_250: new LevelAchv("LV_250", "", 250, "rarer_candy", 50).setSecret(true), + LV_1000: new LevelAchv("LV_1000", "", 1000, "candy_jar", 100).setSecret(true), + _10_RIBBONS: new RibbonAchv("10_RIBBONS", "", 10, "bronze_ribbon", 10), + _25_RIBBONS: new RibbonAchv("25_RIBBONS", "", 25, "great_ribbon", 25).setSecret(true), + _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_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), + TERASTALLIZE: new Achv("TERASTALLIZE", "", "TERASTALLIZE.description", "tera_orb", 25), + STELLAR_TERASTALLIZE: new Achv("STELLAR_TERASTALLIZE", "", "STELLAR_TERASTALLIZE.description", "stellar_tera_shard", 25).setSecret(true), + SPLICE: new Achv("SPLICE", "", "SPLICE.description", "dna_splicers", 10), + MINI_BLACK_HOLE: new ModifierAchv("MINI_BLACK_HOLE", "", "MINI_BLACK_HOLE.description", "mini_black_hole", 25, modifier => modifier instanceof TurnHeldItemTransferModifier).setSecret(), + CATCH_MYTHICAL: new Achv("CATCH_MYTHICAL", "", "CATCH_MYTHICAL.description", "strange_ball", 50).setSecret(), + CATCH_SUB_LEGENDARY: new Achv("CATCH_SUB_LEGENDARY", "", "CATCH_SUB_LEGENDARY.description", "rb", 75).setSecret(), + CATCH_LEGENDARY: new Achv("CATCH_LEGENDARY", "", "CATCH_LEGENDARY.description", "mb", 100).setSecret(), + SEE_SHINY: new Achv("SEE_SHINY", "", "SEE_SHINY.description", "pb_gold", 75), + SHINY_PARTY: new Achv("SHINY_PARTY", "", "SHINY_PARTY.description", "shiny_charm", 100).setSecret(true), + HATCH_MYTHICAL: new Achv("HATCH_MYTHICAL", "", "HATCH_MYTHICAL.description", "mystery_egg", 75).setSecret(), + HATCH_SUB_LEGENDARY: new Achv("HATCH_SUB_LEGENDARY", "", "HATCH_SUB_LEGENDARY.description", "oval_stone", 100).setSecret(), + HATCH_LEGENDARY: new Achv("HATCH_LEGENDARY", "", "HATCH_LEGENDARY.description", "lucky_egg", 125).setSecret(), + 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, 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, 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/arena-data.ts b/src/system/arena-data.ts index f6db53d7f7f..5b907805372 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -2,19 +2,19 @@ import { Arena } from "../field/arena"; import { ArenaTag } from "../data/arena-tag"; import { Biome } from "#enums/biome"; import { Weather } from "../data/weather"; -import { Terrain } from "#app/data/terrain.js"; +import { Terrain } from "#app/data/terrain"; export default class ArenaData { public biome: Biome; - public weather: Weather; - public terrain: Terrain; + public weather: Weather | null; + public terrain: Terrain | null; public tags: ArenaTag[]; constructor(source: Arena | any) { const sourceArena = source instanceof Arena ? source as Arena : null; this.biome = sourceArena ? sourceArena.biomeType : source.biome; - this.weather = sourceArena ? sourceArena.weather : source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : undefined; - this.terrain = sourceArena ? sourceArena.terrain : source.terrain ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) : undefined; + this.weather = sourceArena ? sourceArena.weather : source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : null; + this.terrain = sourceArena ? sourceArena.terrain : source.terrain ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) : null; this.tags = sourceArena ? sourceArena.tags : []; } } diff --git a/src/system/challenge-data.ts b/src/system/challenge-data.ts index 69df11dd395..394d63867be 100644 --- a/src/system/challenge-data.ts +++ b/src/system/challenge-data.ts @@ -1,4 +1,4 @@ -import { Challenge, copyChallenge } from "#app/data/challenge.js"; +import { Challenge, copyChallenge } from "#app/data/challenge"; export default class ChallengeData { public id: integer; diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts index b4bd4368bd9..785ae364efe 100644 --- a/src/system/egg-data.ts +++ b/src/system/egg-data.ts @@ -2,7 +2,7 @@ import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; import { VariantTier } from "#enums/variant-tiers"; import { EGG_SEED, Egg } from "../data/egg"; -import { EggSourceType } from "#app/enums/egg-source-types.js"; +import { EggSourceType } from "#app/enums/egg-source-types"; export default class EggData { public id: integer; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index ac54c942fc7..677bbe4add6 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1,10 +1,10 @@ import i18next from "i18next"; import BattleScene, { PokeballCounts, bypassLogin } from "../battle-scene"; import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon"; -import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; +import { pokemonPrevolutions } from "../data/pokemon-evolutions"; import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys, speciesStarters } from "../data/pokemon-species"; import * as Utils from "../utils"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import PokemonData from "./pokemon-data"; import PersistentModifierData from "./modifier-data"; import ArenaData from "./arena-data"; @@ -27,19 +27,25 @@ import { Tutorial } from "../tutorial"; import { speciesEggMoves } from "../data/egg-moves"; import { allMoves } from "../data/move"; import { TrainerVariant } from "../field/trainer"; -import { OutdatedPhase, ReloadSessionPhase } from "#app/phases"; -import { Variant, variantData } from "#app/data/variant"; +import { Variant } from "#app/data/variant"; import {setSettingGamepad, SettingGamepad, settingGamepadDefaults} from "./settings/settings-gamepad"; import {setSettingKeyboard, SettingKeyboard} from "#app/system/settings/settings-keyboard"; -import { TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena.js"; -import { EnemyAttackStatusEffectChanceModifier } from "../modifier/modifier"; -import { StatusEffect } from "#app/data/status-effect.js"; +import { TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; +import * as Modifier from "../modifier/modifier"; +import { StatusEffect } from "#app/data/status-effect"; import ChallengeData from "./challenge-data"; import { Device } from "#enums/devices"; import { GameDataType } from "#enums/game-data-type"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; +import { applyChallenges, ChallengeType } from "#app/data/challenge"; +import { WeatherType } from "#app/enums/weather-type"; +import { TerrainType } from "#app/data/terrain"; +import { OutdatedPhase } from "#app/phases/outdated-phase"; +import { ReloadSessionPhase } from "#app/phases/reload-session-phase"; +import { RUN_HISTORY_LIMIT } from "#app/ui/run-history-ui-handler"; +import { applySessionDataPatches, applySettingsDataPatches, applySystemDataPatches } from "./version-converter"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -71,13 +77,15 @@ export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): str return "tutorials"; case GameDataType.SEEN_DIALOGUES: return "seenDialogues"; + case GameDataType.RUN_HISTORY: + return "runHistoryData"; } } export function encrypt(data: string, bypassLogin: boolean): string { return (bypassLogin ? (data: string) => btoa(data) - : (data: string) => AES.encrypt(data, saveKey))(data); + : (data: string) => AES.encrypt(data, saveKey))(data) as unknown as string; // TODO: is this correct? } export function decrypt(data: string, bypassLogin: boolean): string { @@ -86,7 +94,7 @@ export function decrypt(data: string, bypassLogin: boolean): string { : (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))(data); } -interface SystemSaveData { +export interface SystemSaveData { trainerId: integer; secretId: integer; gender: PlayerGender; @@ -178,6 +186,15 @@ export const AbilityAttr = { ABILITY_HIDDEN: 4 }; +export type RunHistoryData = Record; + +export interface RunEntry { + entry: SessionSaveData; + isVictory: boolean; + /*Automatically set to false at the moment - implementation TBD*/ + isFavorite: boolean; +} + export type StarterMoveset = [ Moves ] | [ Moves, Moves ] | [ Moves, Moves, Moves ] | [ Moves, Moves, Moves, Moves ]; export interface StarterFormMoveData { @@ -194,6 +211,9 @@ export interface StarterAttributes { variant?: integer; form?: integer; female?: boolean; + shiny?: boolean; + favorite?: boolean; + nickname?: string; } export interface StarterPreferences { @@ -224,12 +244,14 @@ 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; } } } export interface StarterDataEntry { - moveset: StarterMoveset | StarterFormMoveData; + moveset: StarterMoveset | StarterFormMoveData | null; eggMoves: integer; candyCount: integer; friendship: integer; @@ -255,7 +277,7 @@ const systemShortKeys = { seenAttr: "$sa", caughtAttr: "$ca", natureAttr: "$na", - seenCount: "$s" , + seenCount: "$s", caughtCount: "$c", hatchedCount: "$hc", ivs: "$i", @@ -278,11 +300,12 @@ export class GameData { public gender: PlayerGender; public dexData: DexData; - private defaultDexData: DexData; + private defaultDexData: DexData | null; public starterData: StarterData; public gameStats: GameStats; + public runHistory: RunHistoryData; public unlocks: Unlocks; @@ -303,10 +326,12 @@ export class GameData { this.secretId = Utils.randInt(65536); this.starterData = {}; this.gameStats = new GameStats(); + this.runHistory = {}; this.unlocks = { [Unlockables.ENDLESS_MODE]: false, [Unlockables.MINI_BLACK_HOLE]: false, - [Unlockables.SPLICED_ENDLESS_MODE]: false + [Unlockables.SPLICED_ENDLESS_MODE]: false, + [Unlockables.EVIOLITE]: false }; this.achvUnlocks = {}; this.voucherUnlocks = {}; @@ -348,10 +373,10 @@ export class GameData { this.scene.ui.savingIcon.show(); const data = this.getSystemSaveData(); - const maxIntAttrValue = Math.pow(2, 31); + const maxIntAttrValue = 0x80000000; const systemData = JSON.stringify(data, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v); - localStorage.setItem(`data_${loggedInUser.username}`, encrypt(systemData, bypassLogin)); + localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(systemData, bypassLogin)); if (!bypassLogin) { Utils.apiPost(`savedata/system/update?clientSessionId=${clientSessionId}`, systemData, undefined, true) @@ -383,7 +408,7 @@ export class GameData { return new Promise(resolve => { console.log("Client Session:", clientSessionId); - if (bypassLogin && !localStorage.getItem(`data_${loggedInUser.username}`)) { + if (bypassLogin && !localStorage.getItem(`data_${loggedInUser?.username}`)) { return resolve(false); } @@ -403,11 +428,11 @@ export class GameData { return resolve(false); } - const cachedSystem = localStorage.getItem(`data_${loggedInUser.username}`); - this.initSystem(response, cachedSystem ? AES.decrypt(cachedSystem, saveKey).toString(enc.Utf8) : null).then(resolve); + const cachedSystem = localStorage.getItem(`data_${loggedInUser?.username}`); + this.initSystem(response, cachedSystem ? AES.decrypt(cachedSystem, saveKey).toString(enc.Utf8) : undefined).then(resolve); }); } else { - this.initSystem(decrypt(localStorage.getItem(`data_${loggedInUser.username}`), bypassLogin)).then(resolve); + this.initSystem(decrypt(localStorage.getItem(`data_${loggedInUser?.username}`)!, bypassLogin)).then(resolve); // TODO: is this bang correct? } }); } @@ -430,13 +455,15 @@ export class GameData { console.debug(systemData); - localStorage.setItem(`data_${loggedInUser.username}`, encrypt(systemDataStr, bypassLogin)); + localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(systemDataStr, bypassLogin)); - /*const versions = [ this.scene.game.config.gameVersion, data.gameVersion || '0.0.0' ]; + const lsItemKey = `runHistoryData_${loggedInUser?.username}`; + const lsItem = localStorage.getItem(lsItemKey); + if (!lsItem) { + localStorage.setItem(lsItemKey, ""); + } - if (versions[0] !== versions[1]) { - const [ versionNumbers, oldVersionNumbers ] = versions.map(ver => ver.split('.').map(v => parseInt(v))); - }*/ + applySystemDataPatches(systemData); this.trainerId = systemData.trainerId; this.secretId = systemData.secretId; @@ -445,9 +472,7 @@ export class GameData { this.saveSetting(SettingKeys.Player_Gender, systemData.gender === PlayerGender.FEMALE ? 1 : 0); - const initStarterData = !systemData.starterData; - - if (initStarterData) { + if (!systemData.starterData) { this.initStarterData(); if (systemData["starterMoveData"]) { @@ -465,25 +490,20 @@ export class GameData { } this.migrateStarterAbilities(systemData, this.starterData); - } else { - if ([ "1.0.0", "1.0.1" ].includes(systemData.gameVersion)) { - this.migrateStarterAbilities(systemData); - } - //this.fixVariantData(systemData); - this.fixStarterData(systemData); - // Migrate ability starter data if empty for caught species - Object.keys(systemData.starterData).forEach(sd => { - if (systemData.dexData[sd].caughtAttr && !systemData.starterData[sd].abilityAttr) { - systemData.starterData[sd].abilityAttr = 1; + + const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); + for (const s of starterIds) { + this.starterData[s].candyCount += this.dexData[s].caughtCount; + this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2; + if (this.dexData[s].caughtAttr & DexAttr.SHINY) { + this.starterData[s].candyCount += 4; } - }); + } + } else { this.starterData = systemData.starterData; } if (systemData.gameStats) { - if (systemData.gameStats.legendaryPokemonCaught !== undefined && systemData.gameStats.subLegendaryPokemonCaught === undefined) { - this.fixLegendaryStats(systemData); - } this.gameStats = systemData.gameStats; } @@ -529,17 +549,6 @@ export class GameData { this.consolidateDexData(this.dexData); this.defaultDexData = null; - if (initStarterData) { - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); - for (const s of starterIds) { - this.starterData[s].candyCount += this.dexData[s].caughtCount; - this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2; - if (this.dexData[s].caughtAttr & DexAttr.SHINY) { - this.starterData[s].candyCount += 4; - } - } - } - resolve(true); } catch (err) { console.error(err); @@ -548,6 +557,98 @@ export class GameData { }); } + /** + * Retrieves current run history data, organized by time stamp. + * At the moment, only retrievable from locale cache + */ + async getRunHistoryData(scene: BattleScene): Promise { + if (!Utils.isLocal) { + /** + * Networking Code DO NOT DELETE! + * + const response = await Utils.apiFetch("savedata/runHistory", true); + const data = await response.json(); + */ + const lsItemKey = `runHistoryData_${loggedInUser?.username}`; + const lsItem = localStorage.getItem(lsItemKey); + if (lsItem) { + const cachedResponse = lsItem; + if (cachedResponse) { + const runHistory = JSON.parse(decrypt(cachedResponse, bypassLogin)); + return runHistory; + } + return {}; + // check to see whether cachedData or serverData is more up-to-date + /** + * Networking Code DO NOT DELETE! + * + if ( Object.keys(cachedRHData).length >= Object.keys(data).length ) { + return cachedRHData; + } + */ + } else { + localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); + return {}; + } + } else { + const lsItemKey = `runHistoryData_${loggedInUser?.username}`; + const lsItem = localStorage.getItem(lsItemKey); + if (lsItem) { + const cachedResponse = lsItem; + if (cachedResponse) { + const runHistory : RunHistoryData = JSON.parse(decrypt(cachedResponse, bypassLogin)); + return runHistory; + } + return {}; + } else { + localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); + return {}; + } + } + } + + /** + * Saves a new entry to Run History + * @param scene: BattleScene object + * @param runEntry: most recent SessionSaveData of the run + * @param isVictory: result of the run + * Arbitrary limit of 25 runs per player - Will delete runs, starting with the oldest one, if needed + */ + async saveRunHistory(scene: BattleScene, runEntry : SessionSaveData, isVictory: boolean): Promise { + const runHistoryData = await this.getRunHistoryData(scene); + // runHistoryData should always return run history or {} empty object + let timestamps = Object.keys(runHistoryData).map(Number); + + // Arbitrary limit of 25 entries per user --> Can increase or decrease + while (timestamps.length >= RUN_HISTORY_LIMIT ) { + const oldestTimestamp = (Math.min.apply(Math, timestamps)).toString(); + delete runHistoryData[oldestTimestamp]; + timestamps = Object.keys(runHistoryData).map(Number); + } + + const timestamp = (runEntry.timestamp).toString(); + runHistoryData[timestamp] = { + entry: runEntry, + isVictory: isVictory, + isFavorite: false, + }; + localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, encrypt(JSON.stringify(runHistoryData), bypassLogin)); + /** + * Networking Code DO NOT DELETE + * + if (!Utils.isLocal) { + try { + await Utils.apiPost("savedata/runHistory", JSON.stringify(runHistoryData), undefined, true); + return true; + } catch (err) { + console.log("savedata/runHistory POST failed : ", err); + return false; + } + } + */ + return true; + } + parseSystemData(dataStr: string): SystemSaveData { return JSON.parse(dataStr, (k: string, v: any) => { if (k === "gameStats") { @@ -572,6 +673,8 @@ export class GameData { // Account for past key oversight dataStr = dataStr.replace(/\$pAttr/g, "$pa"); } + dataStr = dataStr.replace(/"trainerId":\d+/g, `"trainerId":${this.trainerId}`); + dataStr = dataStr.replace(/"secretId":\d+/g, `"secretId":${this.secretId}`); const fromKeys = shorten ? Object.keys(systemShortKeys) : Object.values(systemShortKeys); const toKeys = shorten ? Object.values(systemShortKeys) : Object.keys(systemShortKeys); for (const k in fromKeys) { @@ -603,9 +706,9 @@ export class GameData { if (bypassLogin) { return; } - localStorage.removeItem(`data_${loggedInUser.username}`); + localStorage.removeItem(`data_${loggedInUser?.username}`); for (let s = 0; s < 5; s++) { - localStorage.removeItem(`sessionData${s ? s : ""}_${loggedInUser.username}`); + localStorage.removeItem(`sessionData${s ? s : ""}_${loggedInUser?.username}`); } } @@ -618,12 +721,13 @@ export class GameData { public saveSetting(setting: string, valueIndex: integer): boolean { let settings: object = {}; if (localStorage.hasOwnProperty("settings")) { - settings = JSON.parse(localStorage.getItem("settings")); + settings = JSON.parse(localStorage.getItem("settings")!); // TODO: is this bang correct? } setSetting(this.scene, setting, valueIndex); settings[setting] = valueIndex; + settings["gameVersion"] = this.scene.game.config.gameVersion; localStorage.setItem("settings", JSON.stringify(settings)); @@ -641,7 +745,7 @@ export class GameData { const key = deviceName.toLowerCase(); // Convert the gamepad name to lowercase to use as a key let mappingConfigs: object = {}; // Initialize an empty object to hold the mapping configurations if (localStorage.hasOwnProperty("mappingConfigs")) {// Check if 'mappingConfigs' exists in localStorage - mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")); + mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")!); // TODO: is this bang correct? } // Parse the existing 'mappingConfigs' from localStorage if (!mappingConfigs[key]) { mappingConfigs[key] = {}; @@ -666,7 +770,7 @@ export class GameData { return false; } // If 'mappingConfigs' does not exist, return false - const mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")); // Parse the existing 'mappingConfigs' from localStorage + const mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")!); // Parse the existing 'mappingConfigs' from localStorage // TODO: is this bang correct? for (const key of Object.keys(mappingConfigs)) {// Iterate over the keys of the mapping configurations this.scene.inputController.injectConfig(key, mappingConfigs[key]); @@ -681,6 +785,7 @@ export class GameData { } // If 'mappingConfigs' does not exist, return false localStorage.removeItem("mappingConfigs"); this.scene.inputController.resetConfigs(); + return true; // TODO: is `true` the correct return value? } /** @@ -700,7 +805,7 @@ export class GameData { let settingsControls: object = {}; // Initialize an empty object to hold the gamepad settings if (localStorage.hasOwnProperty(localStoragePropertyName)) { // Check if 'settingsControls' exists in localStorage - settingsControls = JSON.parse(localStorage.getItem(localStoragePropertyName)); // Parse the existing 'settingsControls' from localStorage + settingsControls = JSON.parse(localStorage.getItem(localStoragePropertyName)!); // Parse the existing 'settingsControls' from localStorage // TODO: is this bang correct? } if (device === Device.GAMEPAD) { @@ -731,11 +836,15 @@ export class GameData { return false; } - const settings = JSON.parse(localStorage.getItem("settings")); + const settings = JSON.parse(localStorage.getItem("settings")!); // TODO: is this bang correct? + + applySettingsDataPatches(settings); for (const setting of Object.keys(settings)) { setSetting(this.scene, setting, settings[setting]); } + + return true; // TODO: is `true` the correct return value? } private loadGamepadSettings(): boolean { @@ -744,18 +853,20 @@ export class GameData { if (!localStorage.hasOwnProperty("settingsGamepad")) { return false; } - const settingsGamepad = JSON.parse(localStorage.getItem("settingsGamepad")); + const settingsGamepad = JSON.parse(localStorage.getItem("settingsGamepad")!); // TODO: is this bang correct? for (const setting of Object.keys(settingsGamepad)) { setSettingGamepad(this.scene, setting as SettingGamepad, settingsGamepad[setting]); } + + return true; // TODO: is `true` the correct return value? } public saveTutorialFlag(tutorial: Tutorial, flag: boolean): boolean { const key = getDataTypeKey(GameDataType.TUTORIALS); let tutorials: object = {}; if (localStorage.hasOwnProperty(key)) { - tutorials = JSON.parse(localStorage.getItem(key)); + tutorials = JSON.parse(localStorage.getItem(key)!); // TODO: is this bang correct? } Object.keys(Tutorial).map(t => t as Tutorial).forEach(t => { @@ -781,7 +892,7 @@ export class GameData { return ret; } - const tutorials = JSON.parse(localStorage.getItem(key)); + const tutorials = JSON.parse(localStorage.getItem(key)!); // TODO: is this bang correct? for (const tutorial of Object.keys(tutorials)) { ret[tutorial] = tutorials[tutorial]; @@ -809,7 +920,7 @@ export class GameData { return ret; } - const dialogues = JSON.parse(localStorage.getItem(key)); + const dialogues = JSON.parse(localStorage.getItem(key)!); // TODO: is this bang correct? for (const dialogue of Object.keys(dialogues)) { ret[dialogue] = dialogues[dialogue]; @@ -818,7 +929,7 @@ export class GameData { return ret; } - private getSessionSaveData(scene: BattleScene): SessionSaveData { + public getSessionSaveData(scene: BattleScene): SessionSaveData { return { seed: scene.seed, playTime: scene.sessionPlayTime, @@ -840,7 +951,7 @@ export class GameData { } as SessionSaveData; } - getSession(slotId: integer): Promise { + getSession(slotId: integer): Promise { return new Promise(async (resolve, reject) => { if (slotId < 0) { return resolve(null); @@ -855,7 +966,7 @@ export class GameData { } }; - if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`)) { + if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`)) { Utils.apiFetch(`savedata/session/get?slot=${slotId}&clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(async response => { @@ -864,12 +975,12 @@ export class GameData { return resolve(null); } - localStorage.setItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`, encrypt(response, bypassLogin)); + localStorage.setItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`, encrypt(response, bypassLogin)); await handleSessionData(response); }); } else { - const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`); + const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); if (sessionData) { await handleSessionData(decrypt(sessionData, bypassLogin)); } else { @@ -931,7 +1042,7 @@ export class GameData { const battleType = sessionData.battleType || 0; const trainerConfig = sessionData.trainer ? trainerConfigs[sessionData.trainer.trainerType] : null; - const battle = scene.newBattle(sessionData.waveIndex, battleType, sessionData.trainer, battleType === BattleType.TRAINER ? trainerConfig?.doubleOnly || sessionData.trainer?.variant === TrainerVariant.DOUBLE : sessionData.enemyParty.length > 1); + const battle = scene.newBattle(sessionData.waveIndex, battleType, sessionData.trainer, battleType === BattleType.TRAINER ? trainerConfig?.doubleOnly || sessionData.trainer?.variant === TrainerVariant.DOUBLE : sessionData.enemyParty.length > 1)!; // TODO: is this bang correct? battle.enemyLevels = sessionData.enemyParty.map(p => p.level); scene.arena.init(); @@ -947,17 +1058,15 @@ export class GameData { }); scene.arena.weather = sessionData.arena.weather; - scene.arena.eventTarget.dispatchEvent(new WeatherChangedEvent(null, scene.arena.weather?.weatherType, scene.arena.weather?.turnsLeft)); + scene.arena.eventTarget.dispatchEvent(new WeatherChangedEvent(WeatherType.NONE, scene.arena.weather?.weatherType!, scene.arena.weather?.turnsLeft!)); // TODO: is this bang correct? scene.arena.terrain = sessionData.arena.terrain; - scene.arena.eventTarget.dispatchEvent(new TerrainChangedEvent(null, scene.arena.terrain?.terrainType, scene.arena.terrain?.turnsLeft)); + scene.arena.eventTarget.dispatchEvent(new TerrainChangedEvent(TerrainType.NONE, scene.arena.terrain?.terrainType!, scene.arena.terrain?.turnsLeft!)); // TODO: is this bang correct? // TODO //scene.arena.tags = sessionData.arena.tags; - const modifiersModule = await import("../modifier/modifier"); - for (const modifierData of sessionData.modifiers) { - const modifier = modifierData.toModifier(scene, modifiersModule[modifierData.className]); + const modifier = modifierData.toModifier(scene, Modifier[modifierData.className]); if (modifier) { scene.addModifier(modifier, true); } @@ -966,7 +1075,7 @@ export class GameData { scene.updateModifiers(true); for (const enemyModifierData of sessionData.enemyModifiers) { - const modifier = enemyModifierData.toModifier(scene, modifiersModule[enemyModifierData.className]); + const modifier = enemyModifierData.toModifier(scene, Modifier[enemyModifierData.className]); if (modifier) { scene.addEnemyModifier(modifier, true); } @@ -980,7 +1089,7 @@ export class GameData { initSessionFromData(sessionData); } else { this.getSession(slotId) - .then(data => initSessionFromData(data)) + .then(data => data && initSessionFromData(data)) .catch(err => { reject(err); return; @@ -996,7 +1105,7 @@ export class GameData { deleteSession(slotId: integer): Promise { return new Promise(resolve => { if (bypassLogin) { - localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser.username}`); + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser?.username}`); return resolve(true); } @@ -1006,8 +1115,8 @@ export class GameData { } Utils.apiFetch(`savedata/session/delete?slot=${slotId}&clientSessionId=${clientSessionId}`, true).then(response => { if (response.ok) { - loggedInUser.lastSessionSlot = -1; - localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser.username}`); + loggedInUser!.lastSessionSlot = -1; // TODO: is the bang correct? + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser?.username}`); resolve(true); } return response.text(); @@ -1037,7 +1146,7 @@ export class GameData { if (sessionData.gameMode === GameModes.DAILY) { if (localStorage.hasOwnProperty("daily")) { - daily = JSON.parse(atob(localStorage.getItem("daily"))); + daily = JSON.parse(atob(localStorage.getItem("daily")!)); // TODO: is this bang correct? if (daily.includes(seed)) { return resolve(false); } else { @@ -1059,7 +1168,7 @@ export class GameData { tryClearSession(scene: BattleScene, slotId: integer): Promise<[success: boolean, newClear: boolean]> { return new Promise<[boolean, boolean]>(resolve => { if (bypassLogin) { - localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`); + localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); return resolve([true, true]); } @@ -1070,8 +1179,8 @@ export class GameData { const sessionData = this.getSessionSaveData(scene); Utils.apiPost(`savedata/session/clear?slot=${slotId}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`, JSON.stringify(sessionData), undefined, true).then(response => { if (response.ok) { - loggedInUser.lastSessionSlot = -1; - localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser.username}`); + loggedInUser!.lastSessionSlot = -1; // TODO: is the bang correct? + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser?.username}`); } return response.json(); }).then(jsonResponse => { @@ -1090,7 +1199,7 @@ export class GameData { } parseSessionData(dataStr: string): SessionSaveData { - return JSON.parse(dataStr, (k: string, v: any) => { + const sessionData = JSON.parse(dataStr, (k: string, v: any) => { /*const versions = [ scene.game.config.gameVersion, sessionData.gameVersion || '0.0.0' ]; if (versions[0] !== versions[1]) { @@ -1122,7 +1231,7 @@ export class GameData { if (md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked md.stackCount = Math.min(md.stackCount, 4); } - if (md instanceof EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) { + if (md instanceof Modifier.EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) { continue; } ret.push(new PersistentModifierData(md, player)); @@ -1147,6 +1256,10 @@ export class GameData { return v; }) as SessionSaveData; + + applySessionDataPatches(sessionData); + + return sessionData; } saveAll(scene: BattleScene, skipVerification: boolean = false, sync: boolean = false, useCachedSession: boolean = false, useCachedSystem: boolean = false): Promise { @@ -1158,10 +1271,10 @@ export class GameData { if (sync) { this.scene.ui.savingIcon.show(); } - const sessionData = useCachedSession ? this.parseSessionData(decrypt(localStorage.getItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser.username}`), bypassLogin)) : this.getSessionSaveData(scene); + const sessionData = useCachedSession ? this.parseSessionData(decrypt(localStorage.getItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser?.username}`)!, bypassLogin)) : this.getSessionSaveData(scene); // TODO: is this bang correct? - const maxIntAttrValue = Math.pow(2, 31); - const systemData = useCachedSystem ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser.username}`), bypassLogin)) : this.getSystemSaveData(); + const maxIntAttrValue = 0x80000000; + const systemData = useCachedSystem ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser?.username}`)!, bypassLogin)) : this.getSystemSaveData(); // TODO: is this bang correct? const request = { system: systemData, @@ -1170,9 +1283,9 @@ export class GameData { clientSessionId: clientSessionId }; - localStorage.setItem(`data_${loggedInUser.username}`, encrypt(JSON.stringify(systemData, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), bypassLogin)); + localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(JSON.stringify(systemData, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), bypassLogin)); - localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser.username}`, encrypt(JSON.stringify(sessionData), bypassLogin)); + localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser?.username}`, encrypt(JSON.stringify(sessionData), bypassLogin)); console.debug("Session data saved"); @@ -1209,7 +1322,7 @@ export class GameData { public tryExportData(dataType: GameDataType, slotId: integer = 0): Promise { return new Promise(resolve => { - const dataKey: string = `${getDataTypeKey(dataType, slotId)}_${loggedInUser.username}`; + const dataKey: string = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`; const handleData = (dataStr: string) => { switch (dataType) { case GameDataType.SYSTEM: @@ -1248,7 +1361,7 @@ export class GameData { } public importData(dataType: GameDataType, slotId: integer = 0): void { - const dataKey = `${getDataTypeKey(dataType, slotId)}_${loggedInUser.username}`; + const dataKey = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`; let saveFile: any = document.getElementById("saveFile"); if (saveFile) { @@ -1267,7 +1380,7 @@ export class GameData { reader.onload = (_ => { return e => { let dataName: string; - let dataStr = AES.decrypt(e.target.result.toString(), saveKey).toString(enc.Utf8); + let dataStr = AES.decrypt(e.target?.result?.toString()!, saveKey).toString(enc.Utf8); // TODO: is this bang correct? let valid = false; try { dataName = GameDataType[dataType].toLowerCase(); @@ -1281,6 +1394,15 @@ export class GameData { const sessionData = this.parseSessionData(dataStr); valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; break; + case GameDataType.RUN_HISTORY: + const data = JSON.parse(dataStr); + const keys = Object.keys(data); + dataName = i18next.t("menuUiHandler:RUN_HISTORY").toLowerCase(); + keys.forEach((key) => { + const entryKeys = Object.keys(data[key]); + valid = ["isFavorite", "isVictory", "entry"].every(v => entryKeys.includes(v)) && entryKeys.length === 3; + }); + break; case GameDataType.SETTINGS: case GameDataType.TUTORIALS: valid = true; @@ -1290,10 +1412,11 @@ export class GameData { console.error(ex); } - const displayError = (error: string) => this.scene.ui.showText(error, null, () => this.scene.ui.showText(null, 0), Utils.fixedInt(1500)); + const displayError = (error: string) => this.scene.ui.showText(error, null, () => this.scene.ui.showText("", 0), Utils.fixedInt(1500)); + dataName = dataName!; // tell TS compiler that dataName is defined! if (!valid) { - return this.scene.ui.showText(`Your ${dataName} data could not be loaded. It may be corrupted.`, null, () => this.scene.ui.showText(null, 0), Utils.fixedInt(1500)); + return this.scene.ui.showText(`Your ${dataName} data could not be loaded. It may be corrupted.`, null, () => this.scene.ui.showText("", 0), Utils.fixedInt(1500)); } this.scene.ui.showText(`Your ${dataName} data will be overridden and the page will reload. Proceed?`, null, () => { @@ -1326,7 +1449,7 @@ export class GameData { } }, () => { this.scene.ui.revertMode(); - this.scene.ui.showText(null, 0); + this.scene.ui.showText("", 0); }, false, -98); }); }; @@ -1350,7 +1473,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[] = []; @@ -1365,7 +1488,7 @@ export class GameData { const entry = data[defaultStarterSpecies[ds]] as DexEntry; entry.seenAttr = defaultStarterAttr; entry.caughtAttr = defaultStarterAttr; - entry.natureAttr = Math.pow(2, defaultStarterNatures[ds] + 1); + entry.natureAttr = 1 << (defaultStarterNatures[ds] + 1); for (const i in entry.ivs) { entry.ivs[i] = 10; } @@ -1415,11 +1538,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; @@ -1432,10 +1555,10 @@ export class GameData { dexEntry.caughtAttr |= dexAttr; if (speciesStarters.hasOwnProperty(species.speciesId)) { this.starterData[species.speciesId].abilityAttr |= pokemon.abilityIndex !== 1 || pokemon.species.ability2 - ? Math.pow(2, pokemon.abilityIndex) + ? 1 << pokemon.abilityIndex : AbilityAttr.ABILITY_HIDDEN; } - dexEntry.natureAttr |= Math.pow(2, pokemon.nature + 1); + dexEntry.natureAttr |= 1 << (pokemon.nature + 1); const hasPrevolution = pokemonPrevolutions.hasOwnProperty(species.speciesId); const newCatch = !caughtAttr; @@ -1471,20 +1594,24 @@ export class GameData { } if (!hasPrevolution && (!pokemon.scene.gameMode.isDaily || hasNewAttr || fromEgg)) { - this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * Math.pow(2, pokemon.variant || 0) : 1)) * (fromEgg || pokemon.isBoss() ? 2 : 1)); + this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * (1 << (pokemon.variant ?? 0)) : 1)) * (fromEgg || pokemon.isBoss() ? 2 : 1)); } } const checkPrevolution = () => { if (hasPrevolution) { const prevolutionSpecies = pokemonPrevolutions[species.speciesId]; - return this.setPokemonSpeciesCaught(pokemon, getPokemonSpecies(prevolutionSpecies), incrementCount, fromEgg).then(() => resolve()); + 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 { @@ -1530,7 +1657,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]) { @@ -1542,7 +1669,7 @@ export class GameData { this.starterData[speciesId].eggMoves = 0; } - const value = Math.pow(2, eggMoveIndex); + const value = 1 << eggMoveIndex; if (this.starterData[speciesId].eggMoves & value) { resolve(false); @@ -1550,11 +1677,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); }); } @@ -1634,7 +1765,7 @@ export class GameData { getSpeciesDefaultNature(species: PokemonSpecies): Nature { const dexEntry = this.dexData[species.speciesId]; for (let n = 0; n < 25; n++) { - if (dexEntry.natureAttr & Math.pow(2, n + 1)) { + if (dexEntry.natureAttr & (1 << (n + 1))) { return n as Nature; } } @@ -1642,17 +1773,17 @@ export class GameData { } getSpeciesDefaultNatureAttr(species: PokemonSpecies): integer { - return Math.pow(2, this.getSpeciesDefaultNature(species)); + return 1 << (this.getSpeciesDefaultNature(species)); } getDexAttrLuck(dexAttr: bigint): integer { return dexAttr & DexAttr.SHINY ? dexAttr & DexAttr.VARIANT_3 ? 3 : dexAttr & DexAttr.VARIANT_2 ? 2 : 1 : 0; } - getNaturesForAttr(natureAttr: integer): Nature[] { + getNaturesForAttr(natureAttr: integer = 0): Nature[] { const ret: Nature[] = []; for (let n = 0; n < 25; n++) { - if (natureAttr & Math.pow(2, n + 1)) { + if (natureAttr & (1 << (n + 1))) { ret.push(n); } } @@ -1676,7 +1807,10 @@ export class GameData { value = decrementValue(value); } - return value; + const cost = new Utils.NumberHolder(value); + applyChallenges(this.scene.gameMode, ChallengeType.STARTER_COST, speciesId, cost); + + return cost.value; } getFormIndex(attr: bigint): integer { @@ -1691,7 +1825,7 @@ export class GameData { } getFormAttr(formIndex: integer): bigint { - return BigInt(Math.pow(2, 7 + formIndex)); + return BigInt(1) << BigInt(7 + formIndex); } consolidateDexData(dexData: DexData): void { @@ -1701,7 +1835,7 @@ export class GameData { entry.hatchedCount = 0; } if (!entry.hasOwnProperty("natureAttr") || (entry.caughtAttr && !entry.natureAttr)) { - entry.natureAttr = this.defaultDexData[k].natureAttr || Math.pow(2, Utils.randInt(25, 1)); + entry.natureAttr = this.defaultDexData?.[k].natureAttr || (1 << Utils.randInt(25, 1)); } } } @@ -1728,74 +1862,4 @@ export class GameData { } } } - - fixVariantData(systemData: SystemSaveData): void { - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); - const starterData = systemData.starterData; - const dexData = systemData.dexData; - if (starterIds.find(id => (dexData[id].caughtAttr & DexAttr.VARIANT_2 || dexData[id].caughtAttr & DexAttr.VARIANT_3) && !variantData[id])) { - for (const s of starterIds) { - const species = getPokemonSpecies(s); - if (variantData[s]) { - const tempCaughtAttr = dexData[s].caughtAttr; - let seenVariant2 = false; - let seenVariant3 = false; - const checkEvoSpecies = (es: Species) => { - seenVariant2 ||= !!(dexData[es].seenAttr & DexAttr.VARIANT_2); - seenVariant3 ||= !!(dexData[es].seenAttr & DexAttr.VARIANT_3); - if (pokemonEvolutions.hasOwnProperty(es)) { - for (const pe of pokemonEvolutions[es]) { - checkEvoSpecies(pe.speciesId); - } - } - }; - checkEvoSpecies(s); - if (dexData[s].caughtAttr & DexAttr.VARIANT_2 && !seenVariant2) { - dexData[s].caughtAttr ^= DexAttr.VARIANT_2; - } - if (dexData[s].caughtAttr & DexAttr.VARIANT_3 && !seenVariant3) { - dexData[s].caughtAttr ^= DexAttr.VARIANT_3; - } - starterData[s].abilityAttr = (tempCaughtAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) - | (tempCaughtAttr & DexAttr.VARIANT_2 && species.ability2 ? AbilityAttr.ABILITY_2 : 0) - | (tempCaughtAttr & DexAttr.VARIANT_3 && species.abilityHidden ? AbilityAttr.ABILITY_HIDDEN : 0); - } else { - const tempCaughtAttr = dexData[s].caughtAttr; - if (dexData[s].caughtAttr & DexAttr.VARIANT_2) { - dexData[s].caughtAttr ^= DexAttr.VARIANT_2; - } - if (dexData[s].caughtAttr & DexAttr.VARIANT_3) { - dexData[s].caughtAttr ^= DexAttr.VARIANT_3; - } - starterData[s].abilityAttr = (tempCaughtAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) - | (tempCaughtAttr & DexAttr.VARIANT_2 && species.ability2 ? AbilityAttr.ABILITY_2 : 0) - | (tempCaughtAttr & DexAttr.VARIANT_3 && species.abilityHidden ? AbilityAttr.ABILITY_HIDDEN : 0); - } - } - } - } - - fixStarterData(systemData: SystemSaveData): void { - for (const starterId of defaultStarterSpecies) { - systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; - } - } - - fixLegendaryStats(systemData: SystemSaveData): void { - systemData.gameStats.subLegendaryPokemonSeen = 0; - systemData.gameStats.subLegendaryPokemonCaught = 0; - systemData.gameStats.subLegendaryPokemonHatched = 0; - allSpecies.filter(s => s.subLegendary).forEach(s => { - const dexEntry = systemData.dexData[s.speciesId]; - systemData.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount; - systemData.gameStats.legendaryPokemonSeen = Math.max(systemData.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0); - systemData.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount; - systemData.gameStats.legendaryPokemonCaught = Math.max(systemData.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, 0); - systemData.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount; - systemData.gameStats.legendaryPokemonHatched = Math.max(systemData.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, 0); - }); - systemData.gameStats.subLegendaryPokemonSeen = Math.max(systemData.gameStats.subLegendaryPokemonSeen, systemData.gameStats.subLegendaryPokemonCaught); - systemData.gameStats.legendaryPokemonSeen = Math.max(systemData.gameStats.legendaryPokemonSeen, systemData.gameStats.legendaryPokemonCaught); - systemData.gameStats.mythicalPokemonSeen = Math.max(systemData.gameStats.mythicalPokemonSeen, systemData.gameStats.mythicalPokemonCaught); - } } diff --git a/src/system/game-stats.ts b/src/system/game-stats.ts index 4c3f40e5d1e..a8b74f29bb7 100644 --- a/src/system/game-stats.ts +++ b/src/system/game-stats.ts @@ -58,9 +58,9 @@ export class GameStats { this.pokemonCaught = source?.pokemonCaught || 0; this.pokemonHatched = source?.pokemonHatched || 0; // Currently handled by migration - this.subLegendaryPokemonSeen = source?.subLegendaryPokemonSeen; - this.subLegendaryPokemonCaught = source?.subLegendaryPokemonCaught; - this.subLegendaryPokemonHatched = source?.subLegendaryPokemonHatched; + this.subLegendaryPokemonSeen = source?.subLegendaryPokemonSeen ?? 0; + this.subLegendaryPokemonCaught = source?.subLegendaryPokemonCaught ?? 0; + this.subLegendaryPokemonHatched = source?.subLegendaryPokemonHatched ?? 0; this.legendaryPokemonSeen = source?.legendaryPokemonSeen || 0; this.legendaryPokemonCaught = source?.legendaryPokemonCaught || 0; this.legendaryPokemonHatched = source?.legendaryPokemonHatched || 0; diff --git a/src/system/modifier-data.ts b/src/system/modifier-data.ts index 6f169280da1..1514f7e3fb3 100644 --- a/src/system/modifier-data.ts +++ b/src/system/modifier-data.ts @@ -1,13 +1,13 @@ import BattleScene from "../battle-scene"; import { PersistentModifier } from "../modifier/modifier"; -import { GeneratedPersistentModifierType, ModifierTypeGenerator, getModifierTypeFuncById } from "../modifier/modifier-type"; +import { GeneratedPersistentModifierType, ModifierType, ModifierTypeGenerator, getModifierTypeFuncById } from "../modifier/modifier-type"; export default class ModifierData { - private player: boolean; - private typeId: string; - private typePregenArgs: any[]; - private args: any[]; - private stackCount: integer; + public player: boolean; + public typeId: string; + public typePregenArgs: any[]; + public args: any[]; + public stackCount: integer; public className: string; @@ -27,14 +27,14 @@ export default class ModifierData { this.className = sourceModifier ? sourceModifier.constructor.name : source.className; } - toModifier(scene: BattleScene, constructor: any): PersistentModifier { + toModifier(scene: BattleScene, constructor: any): PersistentModifier | null { const typeFunc = getModifierTypeFuncById(this.typeId); if (!typeFunc) { return null; } try { - let type = typeFunc(); + let type: ModifierType | null = typeFunc(); type.id = this.typeId; if (type instanceof ModifierTypeGenerator) { diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 57f4c0aea93..1fafcbf8acc 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -17,6 +17,7 @@ export default class PokemonData { public id: integer; public player: boolean; public species: Species; + public nickname: string; public formIndex: integer; public abilityIndex: integer; public passive: boolean; @@ -32,14 +33,16 @@ export default class PokemonData { public ivs: integer[]; public nature: Nature; public natureOverride: Nature | -1; - public moveset: PokemonMove[]; - public status: Status; + public moveset: (PokemonMove | null)[]; + public status: Status | null; public friendship: integer; public metLevel: integer; public metBiome: Biome | -1; + public metSpecies: Species; public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; + public usedTMs: Moves[]; public fusionSpecies: Species; public fusionFormIndex: integer; @@ -59,6 +62,7 @@ export default class PokemonData { this.id = source.id; this.player = sourcePokemon ? sourcePokemon.isPlayer() : source.player; this.species = sourcePokemon ? sourcePokemon.species.speciesId : source.species; + this.nickname = sourcePokemon ? sourcePokemon.nickname : source.nickname; this.formIndex = Math.max(Math.min(source.formIndex, getPokemonSpecies(this.species).forms.length - 1), 0); this.abilityIndex = source.abilityIndex; this.passive = source.passive; @@ -81,6 +85,7 @@ export default class PokemonData { this.friendship = source.friendship !== undefined ? source.friendship : getPokemonSpecies(this.species).baseFriendship; this.metLevel = source.metLevel || 5; this.metBiome = source.metBiome !== undefined ? source.metBiome : -1; + this.metSpecies = source.metSpecies; this.luck = source.luck !== undefined ? source.luck : (source.shiny ? (source.variant + 1) : 0); if (!forHistory) { this.pauseEvolutions = !!source.pauseEvolutions; @@ -94,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); @@ -113,15 +119,14 @@ export default class PokemonData { if (!forHistory) { this.status = source.status ? new Status(source.status.effect, source.status.turnCount, source.status.cureTurn) - : undefined; + : null; } 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; this.summonData.abilitySuppressed = source.summonData.abilitySuppressed; this.summonData.abilitiesApplied = source.summonData.abilitiesApplied; @@ -141,7 +146,11 @@ export default class PokemonData { toPokemon(scene: BattleScene, battleType?: BattleType, partyMemberIndex: integer = 0, double: boolean = false): Pokemon { const species = getPokemonSpecies(this.species); const ret: Pokemon = this.player - ? scene.addPlayerPokemon(species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this) + ? scene.addPlayerPokemon(species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this, (playerPokemon) => { + if (this.nickname) { + playerPokemon.nickname = this.nickname; + } + }) : scene.addEnemyPokemon(species, this.level, battleType === BattleType.TRAINER ? !double || !(partyMemberIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER : TrainerSlot.NONE, this.boss, this); if (this.summonData) { ret.primeSummonData(this.summonData); diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index b09de095259..bc88c21e1e1 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -8,14 +8,32 @@ import SettingsUiHandler from "#app/ui/settings/settings-ui-handler"; import { EaseType } from "#enums/ease-type"; import { MoneyFormat } from "#enums/money-format"; import { PlayerGender } from "#enums/player-gender"; +import { getIsInitialized, initI18n } from "#app/plugins/i18n"; +import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; + +function getTranslation(key: string): string { + if (!getIsInitialized()) { + initI18n(); + } + return i18next.t(key); +} const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => i ? { value: (i * 10).toString(), label: (i * 10).toString(), } : { value: "Mute", - label: i18next.t("settings:mute") + label: getTranslation("settings:mute") }); + +const SHOP_OVERLAY_OPACITY_OPTIONS: SettingOption[] = new Array(9).fill(null).map((_, i) => { + const value = ((i + 1) * 10).toString(); + return { + value, + label: value, + }; +}); + const OFF_ON: SettingOption[] = [ { value: "Off", @@ -37,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 */ @@ -58,6 +110,10 @@ export interface Setting { default: number type: SettingType requireReload?: boolean + /** Whether the setting can be activated or not */ + activatable?: boolean + /** Determines whether the setting should be hidden from the UI */ + isHidden?: () => boolean } /** @@ -72,6 +128,7 @@ export const SettingKeys = { Skip_Seen_Dialogues: "SKIP_SEEN_DIALOGUES", Battle_Style: "BATTLE_STYLE", Enable_Retries: "ENABLE_RETRIES", + Hide_IVs: "HIDE_IVS", Tutorials: "TUTORIALS", Touch_Controls: "TOUCH_CONTROLS", Vibration: "VIBRATION", @@ -82,6 +139,7 @@ export const SettingKeys = { Damage_Numbers: "DAMAGE_NUMBERS", Move_Animations: "MOVE_ANIMATIONS", Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS", + Shop_Cursor_Target: "SHOP_CURSOR_TARGET", Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION", Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY", Move_Info: "MOVE_INFO", @@ -95,9 +153,13 @@ export const SettingKeys = { Type_Hints: "TYPE_HINTS", Master_Volume: "MASTER_VOLUME", BGM_Volume: "BGM_VOLUME", + Field_Volume: "FIELD_VOLUME", SE_Volume: "SE_VOLUME", + UI_Volume: "UI_SOUND_EFFECTS", Music_Preference: "MUSIC_PREFERENCE", Show_BGM_Bar: "SHOW_BGM_BAR", + Move_Touch_Controls: "MOVE_TOUCH_CONTROLS", + Shop_Overlay_Opacity: "SHOP_OVERLAY_OPACITY" }; /** @@ -242,6 +304,13 @@ export const Setting: Array = [ default: 0, type: SettingType.GENERAL }, + { + key: SettingKeys.Hide_IVs, + label: i18next.t("settings:hideIvs"), + options: OFF_ON, + default: 0, + type: SettingType.GENERAL + }, { key: SettingKeys.Tutorials, label: i18next.t("settings:tutorials"), @@ -493,9 +562,8 @@ export const Setting: Array = [ key: SettingKeys.Show_BGM_Bar, label: i18next.t("settings:showBgmBar"), options: OFF_ON, - default: 0, - type: SettingType.DISPLAY, - requireReload: true + default: 1, + type: SettingType.DISPLAY }, { key: SettingKeys.Master_Volume, @@ -511,6 +579,13 @@ export const Setting: Array = [ default: 10, type: SettingType.AUDIO }, + { + key: SettingKeys.Field_Volume, + label: i18next.t("settings:fieldVolume"), + options: VOLUME_OPTIONS, + default: 10, + type: SettingType.AUDIO + }, { key: SettingKeys.SE_Volume, label: i18next.t("settings:seVolume"), @@ -518,6 +593,13 @@ export const Setting: Array = [ default: 10, type: SettingType.AUDIO }, + { + key: SettingKeys.UI_Volume, + label: i18next.t("settings:uiVolume"), + options: VOLUME_OPTIONS, + default: 10, + type: SettingType.AUDIO + }, { key: SettingKeys.Music_Preference, label: i18next.t("settings:musicPreference"), @@ -535,7 +617,35 @@ export const Setting: Array = [ type: SettingType.AUDIO, requireReload: true }, - + { + key: SettingKeys.Move_Touch_Controls, + label: i18next.t("settings:moveTouchControls"), + options: [ + { + value: "Configure", + label: i18next.t("settings:change") + } + ], + default: 0, + type: SettingType.GENERAL, + activatable: true, + isHidden: () => !hasTouchscreen() + }, + { + key: SettingKeys.Shop_Cursor_Target, + label: i18next.t("settings:shopCursorTarget"), + options: SHOP_CURSOR_TARGET_OPTIONS, + default: 0, + type: SettingType.DISPLAY + }, + { + key: SettingKeys.Shop_Overlay_Opacity, + label: i18next.t("settings:shopOverlayOpacity"), + options: SHOP_OVERLAY_OPACITY_OPTIONS, + default: 7, + type: SettingType.DISPLAY, + requireReload: false + } ]; /** @@ -579,10 +689,17 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): scene.bgmVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; scene.updateSoundVolume(); break; + case SettingKeys.Field_Volume: + scene.fieldVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + scene.updateSoundVolume(); + break; case SettingKeys.SE_Volume: scene.seVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; scene.updateSoundVolume(); break; + case SettingKeys.UI_Volume: + scene.uiVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + break; case SettingKeys.Music_Preference: scene.musicPreference = value; break; @@ -604,6 +721,9 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): case SettingKeys.Enable_Retries: scene.enableRetries = Setting[index].options[value].value === "On"; break; + case SettingKeys.Hide_IVs: + scene.hideIvs = Setting[index].options[value].value === "On"; + break; case SettingKeys.Skip_Seen_Dialogues: scene.skipSeenDialogues = Setting[index].options[value].value === "On"; break; @@ -657,6 +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.Shop_Cursor_Target: + const selectedValue = shopCursorTargetIndexMap[value]; + scene.shopCursorTarget = selectedValue; + break; case SettingKeys.EXP_Gains_Speed: scene.expGainsSpeed = value; break; @@ -749,6 +873,14 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): label: "한국어", handler: () => changeLocaleHandler("ko") }, + { + label: "日本語", + handler: () => changeLocaleHandler("ja") + }, + // { + // label: "Català", + // handler: () => changeLocaleHandler("ca-ES") + // }, { label: i18next.t("settings:back"), handler: () => cancelHandler() @@ -760,6 +892,9 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): } } break; + case SettingKeys.Shop_Overlay_Opacity: + scene.updateShopOverlayOpacity(parseInt(Setting[index].options[value].value) * .01); + break; } return true; diff --git a/src/system/unlockables.ts b/src/system/unlockables.ts index d8e7d97edf6..983909373fd 100644 --- a/src/system/unlockables.ts +++ b/src/system/unlockables.ts @@ -1,9 +1,11 @@ +import i18next from "i18next"; import { GameMode, GameModes } from "../game-mode"; export enum Unlockables { ENDLESS_MODE, MINI_BLACK_HOLE, - SPLICED_ENDLESS_MODE + SPLICED_ENDLESS_MODE, + EVIOLITE } export function getUnlockableName(unlockable: Unlockables) { @@ -11,8 +13,10 @@ export function getUnlockableName(unlockable: Unlockables) { case Unlockables.ENDLESS_MODE: return `${GameMode.getModeName(GameModes.ENDLESS)} Mode`; case Unlockables.MINI_BLACK_HOLE: - return "Mini Black Hole"; + return i18next.t("modifierType:ModifierType.MINI_BLACK_HOLE.name"); case Unlockables.SPLICED_ENDLESS_MODE: return `${GameMode.getModeName(GameModes.SPLICED_ENDLESS)} Mode`; + case Unlockables.EVIOLITE: + return i18next.t("modifierType:ModifierType.EVIOLITE.name"); } } diff --git a/src/system/version-converter.ts b/src/system/version-converter.ts new file mode 100644 index 00000000000..ed65fcd99b8 --- /dev/null +++ b/src/system/version-converter.ts @@ -0,0 +1,137 @@ +import { allSpecies } from "#app/data/pokemon-species.js"; +import { AbilityAttr, defaultStarterSpecies, DexAttr, SessionSaveData, SystemSaveData } from "./game-data"; +import { SettingKeys } from "./settings/settings"; + +const LATEST_VERSION = "1.0.5"; + +export function applySessionDataPatches(data: SessionSaveData) { + const curVersion = data.gameVersion; + if (curVersion !== LATEST_VERSION) { + switch (curVersion) { + case "1.0.0": + case "1.0.1": + case "1.0.2": + case "1.0.3": + case "1.0.4": + // --- PATCHES --- + + // Fix Battle Items, Vitamins, and Lures + data.modifiers.forEach((m) => { + if (m.className === "PokemonBaseStatModifier") { + m.className = "BaseStatModifier"; + } else if (m.className === "PokemonResetNegativeStatStageModifier") { + m.className = "ResetNegativeStatStageModifier"; + } else if (m.className === "TempBattleStatBoosterModifier") { + m.className = "TempStatStageBoosterModifier"; + m.typeId = "TEMP_STAT_STAGE_BOOSTER"; + + // Migration from TempBattleStat to Stat + const newStat = m.typePregenArgs[0] + 1; + m.typePregenArgs[0] = newStat; + + // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] + m.args = [ newStat, 5, m.args[1] ]; + } else if (m.className === "DoubleBattleChanceBoosterModifier") { + let maxBattles: number; + switch (m.typeId) { + case "MAX_LURE": + maxBattles = 30; + break; + case "SUPER_LURE": + maxBattles = 15; + break; + default: + maxBattles = 10; + break; + } + + // From [ battlesLeft ] to [ maxBattles, battleCount ] + m.args = [ maxBattles, m.args[0] ]; + } + }); + + data.enemyModifiers.forEach((m) => { + if (m.className === "PokemonBaseStatModifier") { + m.className = "BaseStatModifier"; + } + }); + } + + data.gameVersion = LATEST_VERSION; + } +} + +export function applySystemDataPatches(data: SystemSaveData) { + const curVersion = data.gameVersion; + if (curVersion !== LATEST_VERSION) { + switch (curVersion) { + case "1.0.0": + case "1.0.1": + case "1.0.2": + case "1.0.3": + case "1.0.4": + // --- LEGACY PATCHES --- + if (data.starterData) { + // Migrate ability starter data if empty for caught species + Object.keys(data.starterData).forEach(sd => { + if (data.dexData[sd].caughtAttr && !data.starterData[sd].abilityAttr) { + data.starterData[sd].abilityAttr = 1; + } + }); + } + + // Fix Legendary Stats + if (data.gameStats && (data.gameStats.legendaryPokemonCaught !== undefined && data.gameStats.subLegendaryPokemonCaught === undefined)) { + data.gameStats.subLegendaryPokemonSeen = 0; + data.gameStats.subLegendaryPokemonCaught = 0; + data.gameStats.subLegendaryPokemonHatched = 0; + allSpecies.filter(s => s.subLegendary).forEach(s => { + const dexEntry = data.dexData[s.speciesId]; + data.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount; + data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0); + data.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount; + data.gameStats.legendaryPokemonCaught = Math.max(data.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, 0); + data.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount; + data.gameStats.legendaryPokemonHatched = Math.max(data.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, 0); + }); + data.gameStats.subLegendaryPokemonSeen = Math.max(data.gameStats.subLegendaryPokemonSeen, data.gameStats.subLegendaryPokemonCaught); + data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen, data.gameStats.legendaryPokemonCaught); + data.gameStats.mythicalPokemonSeen = Math.max(data.gameStats.mythicalPokemonSeen, data.gameStats.mythicalPokemonCaught); + } + + // --- PATCHES --- + + // Fix Starter Data + if (data.gameVersion) { + for (const starterId of defaultStarterSpecies) { + data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; + data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; + } + } + } + + data.gameVersion = LATEST_VERSION; + } +} + +export function applySettingsDataPatches(settings: Object) { + const curVersion = settings.hasOwnProperty("gameVersion") ? settings["gameVersion"] : "1.0.0"; + if (curVersion !== LATEST_VERSION) { + switch (curVersion) { + case "1.0.0": + case "1.0.1": + case "1.0.2": + case "1.0.3": + case "1.0.4": + // --- PATCHES --- + + // Fix Reward Cursor Target + if (settings.hasOwnProperty("REROLL_TARGET") && !settings.hasOwnProperty(SettingKeys.Shop_Cursor_Target)) { + settings[SettingKeys.Shop_Cursor_Target] = settings["REROLL_TARGET"]; + delete settings["REROLL_TARGET"]; + localStorage.setItem("settings", JSON.stringify(settings)); + } + } + // Note that the current game version will be written at `saveSettings` + } +} diff --git a/src/system/voucher.ts b/src/system/voucher.ts index 2238a95e690..06edfe5c6a6 100644 --- a/src/system/voucher.ts +++ b/src/system/voucher.ts @@ -1,8 +1,10 @@ import BattleScene from "../battle-scene"; import i18next from "i18next"; -import { Achv, AchvTier, achvs, getAchievementDescription } from "./achv"; +import { AchvTier, achvs, getAchievementDescription } from "./achv"; import { PlayerGender } from "#enums/player-gender"; import { TrainerType } from "#enums/trainer-type"; +import { ConditionFn } from "#app/@types/common"; +import { trainerConfigs } from "#app/data/trainer-config"; export enum VoucherType { REGULAR, @@ -16,15 +18,15 @@ export class Voucher { public voucherType: VoucherType; public description: string; - private conditionFunc: (scene: BattleScene, args: any[]) => boolean; + private conditionFunc: ConditionFn | undefined; - constructor(voucherType: VoucherType, description: string, conditionFunc?: (scene: BattleScene, args: any[]) => boolean) { + constructor(voucherType: VoucherType, description: string, conditionFunc?: ConditionFn) { this.description = description; this.voucherType = voucherType; this.conditionFunc = conditionFunc; } - validate(scene: BattleScene, args: any[]): boolean { + validate(scene: BattleScene, args?: any[]): boolean { return !this.conditionFunc || this.conditionFunc(scene, args); } @@ -87,42 +89,36 @@ export interface Vouchers { export const vouchers: Vouchers = {}; -const voucherAchvs: Achv[] = [ achvs.CLASSIC_VICTORY ]; - export function initVouchers() { - import("../data/trainer-config").then(tc => { - const trainerConfigs = tc.trainerConfigs; + for (const achv of [achvs.CLASSIC_VICTORY]) { + const voucherType = achv.score >= 150 + ? VoucherType.GOLDEN + : achv.score >= 100 + ? VoucherType.PREMIUM + : achv.score >= 75 + ? VoucherType.PLUS + : VoucherType.REGULAR; + vouchers[achv.id] = new Voucher(voucherType, getAchievementDescription(achv.localizationKey)); + } - for (const achv of voucherAchvs) { - const voucherType = achv.score >= 150 - ? VoucherType.GOLDEN - : achv.score >= 100 - ? VoucherType.PREMIUM - : achv.score >= 75 - ? VoucherType.PLUS - : VoucherType.REGULAR; - vouchers[achv.id] = new Voucher(voucherType, getAchievementDescription(achv.localizationKey)); - } + const bossTrainerTypes = Object.keys(trainerConfigs) + .filter(tt => trainerConfigs[tt].isBoss && trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL && trainerConfigs[tt].hasVoucher); - const bossTrainerTypes = Object.keys(trainerConfigs) - .filter(tt => trainerConfigs[tt].isBoss && trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL); - - for (const trainerType of bossTrainerTypes) { - const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10 - ? VoucherType.PLUS - : VoucherType.PREMIUM; - const key = TrainerType[trainerType]; - const trainerName = trainerConfigs[trainerType].name; - const trainer = trainerConfigs[trainerType]; - const title = trainer.title ? ` (${trainer.title})` : ""; - vouchers[key] = new Voucher( - voucherType, - `${i18next.t("voucher:defeatTrainer", { trainerName })} ${title}`, - ); - } - const voucherKeys = Object.keys(vouchers); - for (const k of voucherKeys) { - vouchers[k].id = k; - } - }); + for (const trainerType of bossTrainerTypes) { + const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10 + ? VoucherType.PLUS + : VoucherType.PREMIUM; + const key = TrainerType[trainerType]; + const trainerName = trainerConfigs[trainerType].name; + const trainer = trainerConfigs[trainerType]; + const title = trainer.title ? ` (${trainer.title})` : ""; + vouchers[key] = new Voucher( + voucherType, + `${i18next.t("voucher:defeatTrainer", { trainerName })} ${title}`, + ); + } + const voucherKeys = Object.keys(vouchers); + for (const k of voucherKeys) { + vouchers[k].id = k; + } } diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts new file mode 100644 index 00000000000..fb3d3af1a6b --- /dev/null +++ b/src/test/abilities/ability_timing.test.ts @@ -0,0 +1,52 @@ +import { BattleStyle } from "#app/enums/battle-style"; +import { CommandPhase } from "#app/phases/command-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 { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + + +describe("Ability Timing", () => { + 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) + .enemyAbility(Abilities.INTIMIDATE) + .ability(Abilities.BALL_FETCH); + }); + + 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, () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + + await game.phaseInterceptor.to("MessagePhase"); + const message = game.textInterceptor.getLatestMessage(); + expect(message).toContain("Attack fell"); + }, 5000); +}); diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index bfd1fdf59fe..0fb2212d817 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -1,21 +1,17 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { MoveEffectPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { allMoves } from "#app/data/move"; import { Abilities } from "#enums/abilities"; -import Move, { allMoves } from "#app/data/move.js"; -import Pokemon from "#app/field/pokemon.js"; -import { FieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; +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"; describe("Abilities - Aura Break", () => { let phaserGame: Phaser.Game; let game: GameManager; - const multiplier = 9 / 16; + + const auraBreakMultiplier = 9 / 16 * 4 / 3; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -29,67 +25,52 @@ describe("Abilities - Aura Break", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); + game.override.battleType("single"); + game.override.moveset([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyAbility(Abilities.AURA_BREAK); + game.override.enemySpecies(Species.SHUCKLE); }); - it("reverses the effect of fairy aura", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FAIRY_AURA); - const basePower = allMoves[Moves.MOONBLAST].power; - await game.startBattle([Species.MAGIKARP]); + it("reverses the effect of Fairy Aura", async () => { + const moveToCheck = allMoves[Moves.MOONBLAST]; + const basePower = moveToCheck.power; - game.doAttack(getMovePosition(game.scene, 0, Moves.MOONBLAST)); + game.override.ability(Abilities.FAIRY_AURA); + vi.spyOn(moveToCheck, "calculateBattlePower"); - const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.MOONBLAST]); - - await game.phaseInterceptor.to(MoveEffectPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + await game.classicMode.startBattle([Species.PIKACHU]); + game.move.select(Moves.MOONBLAST); + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(expect.closeTo(basePower * auraBreakMultiplier)); }); - it("reverses the effect of dark aura", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DARK_AURA); - const basePower = allMoves[Moves.DARK_PULSE].power; - await game.startBattle([Species.MAGIKARP]); + it("reverses the effect of Dark Aura", async () => { + const moveToCheck = allMoves[Moves.DARK_PULSE]; + const basePower = moveToCheck.power; - game.doAttack(getMovePosition(game.scene, 0, Moves.DARK_PULSE)); + game.override.ability(Abilities.DARK_AURA); + vi.spyOn(moveToCheck, "calculateBattlePower"); - const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.DARK_PULSE]); + await game.classicMode.startBattle([Species.PIKACHU]); + game.move.select(Moves.DARK_PULSE); + await game.phaseInterceptor.to("MoveEffectPhase"); - await game.phaseInterceptor.to(MoveEffectPhase); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(expect.closeTo(basePower * auraBreakMultiplier)); + }); - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + it("has no effect if neither Fairy Aura nor Dark Aura are present", async () => { + const moveToCheck = allMoves[Moves.MOONBLAST]; + const basePower = moveToCheck.power; + + game.override.ability(Abilities.BALL_FETCH); + vi.spyOn(moveToCheck, "calculateBattlePower"); + + await game.classicMode.startBattle([Species.PIKACHU]); + game.move.select(Moves.MOONBLAST); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower); }); }); - -/** - * Calculates the mocked power of a move in a Pokémon battle, taking into account certain abilities. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used in the attack. - * @returns The calculated power of the move after applying any relevant ability effects. - * - * @remarks - * This function creates a NumberHolder with the initial power of the move. - * It then checks if the defender has an ability with the FieldMoveTypePowerBoostAbAttr. - * If so, it applies a power modification of 9/16 using an instance of FieldMoveTypePowerBoostAbAttr. - * The final calculated power is then returned. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move): number => { - const powerHolder = new NumberHolder(move.power); - - if (defender.hasAbilityWithAttr(FieldMoveTypePowerBoostAbAttr)) { - const auraBreakInstance = new FieldMoveTypePowerBoostAbAttr(move.type, 9 / 16); - auraBreakInstance.applyPreAttack(attacker, false, defender, move, [powerHolder]); - } - - return powerHolder.value; -}; diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 53a04732b74..020866509d6 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -1,19 +1,20 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import Move, { allMoves, MoveCategory } from "#app/data/move.js"; -import { AllyMoveCategoryPowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +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"; describe("Abilities - Battery", () => { let phaserGame: Phaser.Game; let game: GameManager; + const batteryMultiplier = 1.3; + beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, @@ -26,95 +27,55 @@ describe("Abilities - Battery", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ROCK_SLIDE, Moves.SPLASH, Moves.HEAT_WAVE]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.battleType("double"); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("raises the power of allies' special moves by 30%", async () => { - const moveToBeUsed = Moves.HEAT_WAVE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.DAZZLING_GLEAM]; + const basePower = moveToCheck.power; - await game.startBattle([Species.MAGIKARP, Species.CHARJABUG]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + game.move.select(Moves.DAZZLING_GLEAM); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(MoveEffectPhase); - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).not.toBe(basePower); - expect(mockedPower).toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower * batteryMultiplier); }); it("does not raise the power of allies' non-special moves", async () => { - const moveToBeUsed = Moves.ROCK_SLIDE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.BREAKING_SWIPE]; + const basePower = moveToCheck.power; - await game.startBattle([Species.MAGIKARP, Species.CHARJABUG]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + game.move.select(Moves.BREAKING_SWIPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(MoveEffectPhase); - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).toBe(basePower); - expect(mockedPower).not.toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower); }); it("does not raise the power of the ability owner's special moves", async () => { - const moveToBeUsed = Moves.HEAT_WAVE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.DAZZLING_GLEAM]; + const basePower = moveToCheck.power; - await game.startBattle([Species.CHARJABUG, Species.MAGIKARP]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.startBattle([Species.CHARJABUG, Species.PIKACHU]); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + game.move.select(Moves.DAZZLING_GLEAM); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(TurnEndPhase); - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).toBe(basePower); - expect(mockedPower).not.toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower); }); }); - -/** - * Calculates the mocked power of a move. - * Note this does not consider other damage calculations - * except the power multiplier from Battery. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used by the attacker. - * @returns The adjusted power of the move. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const powerHolder = new NumberHolder(move.power); - - /** - * @see AllyMoveCategoryPowerBoostAbAttr - */ - if (attacker.getAlly().hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { - const batteryInstance = new AllyMoveCategoryPowerBoostAbAttr([MoveCategory.SPECIAL], 1.3); - batteryInstance.applyPreAttack(attacker, false, defender, move, [ powerHolder ]); - } - - return powerHolder.value; -}; - -/** - * Retrieves the power multiplier from a Pokémon's ability attribute. - * - * @param pokemon - The Pokémon whose ability attributes are being queried. - * @returns The power multiplier of the `AllyMoveCategoryPowerBoostAbAttr` attribute. - */ -const getAttrPowerMultiplier = (pokemon: Pokemon) => { - const attr = pokemon.getAbilityAttrs(AllyMoveCategoryPowerBoostAbAttr); - - return (attr[0] as AllyMoveCategoryPowerBoostAbAttr)["powerMultiplier"]; -}; diff --git a/src/test/abilities/battle_bond.test.ts b/src/test/abilities/battle_bond.test.ts index b2ff73f5b76..71e9438db8f 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -1,13 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "#test/utils/gameManager"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-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 { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,39 +26,39 @@ describe("Abilities - BATTLE BOND", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BATTLE_BOND); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.battleType("single"); + game.override.ability(Abilities.BATTLE_BOND); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( "check if fainted pokemon switches to base form on arena reset", async () => { - const baseForm = 1, - ashForm = 2; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + const baseForm = 1; + const ashForm = 2; + game.override.startingWave(4); + game.override.starterForms({ [Species.GRENINJA]: ashForm, }); await game.startBattle([Species.MAGIKARP, Species.GRENINJA]); const greninja = game.scene.getParty().find((p) => p.species.speciesId === Species.GRENINJA); - expect(greninja).not.toBe(undefined); - expect(greninja.formIndex).toBe(ashForm); + expect(greninja).toBeDefined(); + expect(greninja!.formIndex).toBe(ashForm); - greninja.hp = 0; - greninja.status = new Status(StatusEffect.FAINT); - expect(greninja.isFainted()).toBe(true); + greninja!.hp = 0; + greninja!.status = new Status(StatusEffect.FAINT); + expect(greninja!.isFainted()).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to(TurnEndPhase); game.doSelectModifier(); await game.phaseInterceptor.to(QuietFormChangePhase); - expect(greninja.formIndex).toBe(baseForm); + expect(greninja!.formIndex).toBe(baseForm); }, TIMEOUT ); 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 1b7eb3f7b90..96ec775f2a0 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -1,13 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import { Stat } from "#enums/stat"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { CommandPhase } from "#app/phases/command-phase"; +import { MessagePhase } from "#app/phases/message-phase"; +import GameManager from "#test/utils/gameManager"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; -import * as Overrides from "#app/overrides"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { CommandPhase, MessagePhase } from "#app/phases.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { Abilities } from "#app/enums/abilities.js"; -import { Moves } from "#app/enums/moves.js"; -import { Species } from "#app/enums/species.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -27,64 +27,62 @@ describe("Abilities - COSTAR", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COSTAR); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT, Moves.CURSE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.battleType("double"); + game.override.ability(Abilities.COSTAR); + game.override.moveset([Moves.SPLASH, Moves.NASTY_PLOT]); + game.override.enemyMoveset(SPLASH_ONLY); }); test( - "ability copies positive stat changes", + "ability copies positive stat stages", async () => { + game.override.enemyAbility(Abilities.BALL_FETCH); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); - expect(leftPokemon).not.toBe(undefined); - expect(rightPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.NASTY_PLOT)); + game.move.select(Moves.NASTY_PLOT); await game.phaseInterceptor.to(CommandPhase); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + 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.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(CommandPhase); game.doSwitchPokemon(2); await game.phaseInterceptor.to(MessagePhase); [leftPokemon, rightPokemon] = game.scene.getPlayerField(); - expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); - expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + 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 () => { - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + game.override.enemyAbility(Abilities.INTIMIDATE); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); - expect(leftPokemon).not.toBe(undefined); - expect(rightPokemon).not.toBe(undefined); - expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); - expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(CommandPhase); game.doSwitchPokemon(2); await game.phaseInterceptor.to(MessagePhase); [leftPokemon, rightPokemon] = game.scene.getPlayerField(); - expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); - expect(rightPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + 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 297aa33e06c..ef145262954 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -1,19 +1,20 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "#test/utils/gameManager"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; +import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +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"; const TIMEOUT = 20 * 1000; -describe("Abilities - DISGUISE", () => { +describe("Abilities - Disguise", () => { let phaserGame: Phaser.Game; let game: GameManager; + const bustedForm = 1; + const disguisedForm = 0; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -27,72 +28,200 @@ describe("Abilities - DISGUISE", () => { beforeEach(() => { game = new GameManager(phaserGame); - const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DISGUISE); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - }); + 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); - test( - "check if fainted pokemon switched to base form on arena reset", - async () => { - const baseForm = 0, - bustedForm = 1; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ - [Species.MIMIKYU]: bustedForm, - }); + 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.classicMode.startBattle(); - await game.startBattle([Species.MAGIKARP, Species.MIMIKYU]); + const mimikyu = game.scene.getEnemyPokemon()!; + const maxHp = mimikyu.getMaxHp(); + const disguiseDamage = toDmgValue(maxHp / 8); - const mimikyu = game.scene.getParty().find((p) => p.species.speciesId === Species.MIMIKYU); - expect(mimikyu).not.toBe(undefined); - expect(mimikyu.formIndex).toBe(bustedForm); + expect(mimikyu.formIndex).toBe(disguisedForm); - mimikyu.hp = 0; - mimikyu.status = new Status(StatusEffect.FAINT); - expect(mimikyu.isFainted()).toBe(true); + game.move.select(Moves.SHADOW_SNEAK); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); + await game.phaseInterceptor.to("MoveEndPhase"); - expect(mimikyu.formIndex).toBe(baseForm); - }, - TIMEOUT - ); + expect(mimikyu.hp).equals(maxHp - disguiseDamage); + expect(mimikyu.formIndex).toBe(bustedForm); + }, TIMEOUT); - test( - "damage taken should be equal to 1/8 of its maximum HP, rounded down", - async () => { - const baseForm = 0, - bustedForm = 1; + it("doesn't break disguise when attacked with ineffective move", async () => { + await game.classicMode.startBattle(); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(20); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ - [Species.MIMIKYU]: baseForm, - }); + const mimikyu = game.scene.getEnemyPokemon()!; - await game.startBattle([Species.MIMIKYU]); + expect(mimikyu.formIndex).toBe(disguisedForm); - const mimikyu = game.scene.getPlayerPokemon(); - const damage = (Math.floor(mimikyu.getMaxHp()/8)); + game.move.select(Moves.VACUUM_WAVE); - expect(mimikyu).not.toBe(undefined); - expect(mimikyu.formIndex).toBe(baseForm); + await game.phaseInterceptor.to("MoveEndPhase"); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); - await game.phaseInterceptor.to(TurnEndPhase); + expect(mimikyu.formIndex).toBe(disguisedForm); + }, TIMEOUT); - expect(mimikyu.formIndex).toBe(bustedForm); - expect(game.scene.getEnemyPokemon().turnData.currDamageDealt).toBe(damage); - }, - 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.enemyLevel(5); + await game.classicMode.startBattle(); + + const mimikyu = game.scene.getEnemyPokemon()!; + const maxHp = mimikyu.getMaxHp(); + const disguiseDamage = toDmgValue(maxHp / 8); + + expect(mimikyu.formIndex).toBe(disguisedForm); + + game.move.select(Moves.SURGING_STRIKES); + + // First hit + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(mimikyu.hp).equals(maxHp - disguiseDamage); + expect(mimikyu.formIndex).toBe(disguisedForm); + + // Second hit + 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.classicMode.startBattle(); + + const mimikyu = game.scene.getEnemyPokemon()!; + expect(mimikyu.hp).toBe(mimikyu.getMaxHp()); + + game.move.select(Moves.TOXIC_THREAD); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(mimikyu.formIndex).toBe(disguisedForm); + expect(mimikyu.status?.effect).toBe(StatusEffect.POISON); + expect(mimikyu.getStatStage(Stat.SPD)).toBe(-1); + expect(mimikyu.hp).toBeLessThan(mimikyu.getMaxHp()); + }, TIMEOUT); + + it("persists form change when switched out", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); + game.override.starterSpecies(0); + + await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]); + + const mimikyu = game.scene.getPlayerPokemon()!; + const maxHp = mimikyu.getMaxHp(); + const disguiseDamage = toDmgValue(maxHp / 8); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(mimikyu.formIndex).toBe(bustedForm); + expect(mimikyu.hp).equals(maxHp - disguiseDamage); + + await game.toNextTurn(); + game.doSwitchPokemon(1); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(mimikyu.formIndex).toBe(bustedForm); + }, TIMEOUT); + + it("persists form change when wave changes with no arena reset", async () => { + game.override.starterSpecies(0); + game.override.starterForms({ + [Species.MIMIKYU]: bustedForm + }); + await game.classicMode.startBattle([ Species.FURRET, Species.MIMIKYU ]); + + const mimikyu = game.scene.getParty()[1]!; + expect(mimikyu.formIndex).toBe(bustedForm); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.toNextWave(); + + expect(mimikyu.formIndex).toBe(bustedForm); + }, TIMEOUT); + + it("reverts to Disguised form on arena reset", async () => { + game.override.startingWave(4); + game.override.starterSpecies(Species.MIMIKYU); + game.override.starterForms({ + [Species.MIMIKYU]: bustedForm + }); + + await game.classicMode.startBattle(); + + const mimikyu = game.scene.getPlayerPokemon()!; + + expect(mimikyu.formIndex).toBe(bustedForm); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.toNextWave(); + + expect(mimikyu.formIndex).toBe(disguisedForm); + }, TIMEOUT); + + it("reverts to Disguised form on biome change when fainted", async () => { + game.override.startingWave(10); + game.override.starterSpecies(0); + game.override.starterForms({ + [Species.MIMIKYU]: bustedForm + }); + + await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]); + + const mimikyu1 = game.scene.getPlayerPokemon()!; + + expect(mimikyu1.formIndex).toBe(bustedForm); + + game.move.select(Moves.SPLASH); + await game.killPokemon(mimikyu1); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to("PartyHealPhase"); + + expect(mimikyu1.formIndex).toBe(disguisedForm); + }, TIMEOUT); + + 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.classicMode.startBattle(); + + const mimikyu = game.scene.getEnemyPokemon()!; + mimikyu.hp = 1; + + game.move.select(Moves.SHADOW_SNEAK); + await game.toNextWave(); + + expect(game.scene.getCurrentPhase()?.constructor.name).toBe("CommandPhase"); + expect(game.scene.currentBattle.waveIndex).toBe(2); + }, TIMEOUT); + + it("activates when Aerilate circumvents immunity to the move's base type", async () => { + game.override.ability(Abilities.AERILATE); + game.override.moveset([Moves.TACKLE]); + + await game.classicMode.startBattle(); + + const mimikyu = game.scene.getEnemyPokemon()!; + const maxHp = mimikyu.getMaxHp(); + const disguiseDamage = toDmgValue(maxHp / 8); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(mimikyu.formIndex).toBe(bustedForm); + expect(mimikyu.hp).toBe(maxHp - disguiseDamage); + }, TIMEOUT); }); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index bfb8f45a11f..b337e4d96f7 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -1,12 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { TurnEndPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Species } from "#app/enums/species"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; -import { Species } from "#app/enums/species.js"; +import { Moves } from "#enums/moves"; +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 - Dry Skin", () => { let phaserGame: Phaser.Game; @@ -24,137 +23,135 @@ describe("Abilities - Dry Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DRY_SKIN); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHARMANDER); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHANDELURE); + game.override.battleType("single"); + game.override.disableCrits(); + game.override.enemyAbility(Abilities.DRY_SKIN); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemySpecies(Species.CHARMANDER); + game.override.ability(Abilities.UNNERVE); + game.override.starterSpecies(Species.CHANDELURE); }); it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUNNY_DAY, Moves.SPLASH]); + game.override.moveset([Moves.SUNNY_DAY, Moves.SPLASH]); await game.startBattle(); - const enemy = game.scene.getEnemyPokemon(); + const enemy = game.scene.getEnemyPokemon()!; expect(enemy).not.toBe(undefined); // first turn let previousEnemyHp = enemy.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.SUNNY_DAY)); + game.move.select(Moves.SUNNY_DAY); await game.phaseInterceptor.to(TurnEndPhase); expect(enemy.hp).toBeLessThan(previousEnemyHp); // second turn previousEnemyHp = enemy.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); expect(enemy.hp).toBeLessThan(previousEnemyHp); }); it("during rain, gain 1/8 of maximum health at the end of each turn", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.RAIN_DANCE, Moves.SPLASH]); + game.override.moveset([Moves.RAIN_DANCE, Moves.SPLASH]); await game.startBattle(); - const enemy = game.scene.getEnemyPokemon(); + const enemy = game.scene.getEnemyPokemon()!; expect(enemy).not.toBe(undefined); enemy.hp = 1; // first turn let previousEnemyHp = enemy.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.RAIN_DANCE)); + game.move.select(Moves.RAIN_DANCE); await game.phaseInterceptor.to(TurnEndPhase); expect(enemy.hp).toBeGreaterThan(previousEnemyHp); // second turn previousEnemyHp = enemy.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); expect(enemy.hp).toBeGreaterThan(previousEnemyHp); }); it("opposing fire attacks do 25% more damage", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EMBER]); - - // ensure the enemy doesn't die to this - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(30); + game.override.moveset([Moves.FLAMETHROWER]); await game.startBattle(); - const enemy = game.scene.getEnemyPokemon(); - expect(enemy).not.toBe(undefined); + const enemy = game.scene.getEnemyPokemon()!; + const initialHP = 1000; + enemy.hp = initialHP; // first turn - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(0); // this makes moves always deal 85% damage - game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER)); + game.move.select(Moves.FLAMETHROWER); await game.phaseInterceptor.to(TurnEndPhase); - const fireDamageTakenWithDrySkin = enemy.getMaxHp() - enemy.hp; + const fireDamageTakenWithDrySkin = initialHP - enemy.hp; expect(enemy.hp > 0); - enemy.hp = enemy.getMaxHp(); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + enemy.hp = initialHP; + game.override.enemyAbility(Abilities.NONE); // second turn - game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER)); + game.move.select(Moves.FLAMETHROWER); await game.phaseInterceptor.to(TurnEndPhase); - const fireDamageTakenWithoutDrySkin = enemy.getMaxHp() - enemy.hp; + const fireDamageTakenWithoutDrySkin = initialHP - enemy.hp; expect(fireDamageTakenWithDrySkin).toBeGreaterThan(fireDamageTakenWithoutDrySkin); }); it("opposing water attacks heal 1/4 of maximum health and deal no damage", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + game.override.moveset([Moves.WATER_GUN]); await game.startBattle(); - const enemy = game.scene.getEnemyPokemon(); + const enemy = game.scene.getEnemyPokemon()!; expect(enemy).not.toBe(undefined); enemy.hp = 1; - game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.move.select(Moves.WATER_GUN); await game.phaseInterceptor.to(TurnEndPhase); expect(enemy.hp).toBeGreaterThan(1); }); it("opposing water attacks do not heal if they were protected from", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + game.override.moveset([Moves.WATER_GUN]); await game.startBattle(); - const enemy = game.scene.getEnemyPokemon(); + const enemy = game.scene.getEnemyPokemon()!; expect(enemy).not.toBe(undefined); enemy.hp = 1; - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); - game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.move.select(Moves.WATER_GUN); await game.phaseInterceptor.to(TurnEndPhase); expect(enemy.hp).toBe(1); }); it("multi-strike water attacks only heal once", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); + game.override.moveset([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); await game.startBattle(); - const enemy = game.scene.getEnemyPokemon(); + const enemy = game.scene.getEnemyPokemon()!; expect(enemy).not.toBe(undefined); enemy.hp = 1; // first turn - game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_SHURIKEN)); + game.move.select(Moves.WATER_SHURIKEN); await game.phaseInterceptor.to(TurnEndPhase); const healthGainedFromWaterShuriken = enemy.hp - 1; enemy.hp = 1; // second turn - game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.move.select(Moves.WATER_GUN); await game.phaseInterceptor.to(TurnEndPhase); const healthGainedFromWaterGun = enemy.hp - 1; diff --git a/src/test/abilities/flash_fire.test.ts b/src/test/abilities/flash_fire.test.ts new file mode 100644 index 00000000000..de40873998f --- /dev/null +++ b/src/test/abilities/flash_fire.test.ts @@ -0,0 +1,130 @@ +import { BattlerIndex } from "#app/battle"; +import { StatusEffect } from "#app/data/status-effect"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Species } from "#app/enums/species"; +import { MovePhase } from "#app/phases/move-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +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 - Flash Fire", () => { + 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.FLASH_FIRE) + .enemyAbility(Abilities.BALL_FETCH) + .startingLevel(20) + .enemyLevel(20) + .disableCrits(); + }); + + + it("immune to Fire-type moves", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY); + await game.startBattle([Species.BLISSEY]); + + const blissey = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + expect(blissey.hp).toBe(blissey.getMaxHp()); + }, 20000); + + it("not activate if the Pokémon is protected from the Fire-type move", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset([Moves.PROTECT]); + await game.startBattle([Species.BLISSEY]); + + const blissey = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.PROTECT); + await game.phaseInterceptor.to(TurnEndPhase); + expect(blissey!.getTag(BattlerTagType.FIRE_BOOST)).toBeUndefined(); + }, 20000); + + it("activated by Will-O-Wisp", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.WILL_O_WISP)).moveset(SPLASH_ONLY); + await game.startBattle([Species.BLISSEY]); + + const blissey = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + await game.move.forceHit(); + await game.phaseInterceptor.to(MovePhase, false); + await game.move.forceHit(); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(blissey!.getTag(BattlerTagType.FIRE_BOOST)).toBeDefined(); + }, 20000); + + it("activated after being frozen", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY); + game.override.statusEffect(StatusEffect.FREEZE); + await game.startBattle([Species.BLISSEY]); + + const blissey = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(blissey!.getTag(BattlerTagType.FIRE_BOOST)).toBeDefined(); + }, 20000); + + it("not passing with baton pass", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset([Moves.BATON_PASS]); + await game.startBattle([Species.BLISSEY, Species.CHANSEY]); + + // ensure use baton pass after enemy moved + game.move.select(Moves.BATON_PASS); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + game.doSelectPartyPokemon(1); + + await game.phaseInterceptor.to(TurnEndPhase); + const chansey = game.scene.getPlayerPokemon()!; + expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.CHANSEY); + expect(chansey!.getTag(BattlerTagType.FIRE_BOOST)).toBeUndefined(); + }, 20000); + + it("boosts Fire-type move when the ability is activated", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.FIRE_PLEDGE)).moveset([Moves.EMBER, Moves.SPLASH]); + game.override.enemyAbility(Abilities.FLASH_FIRE).ability(Abilities.NONE); + await game.startBattle([Species.BLISSEY]); + const blissey = game.scene.getPlayerPokemon()!; + const initialHP = 1000; + blissey.hp = initialHP; + + // first turn + game.move.select(Moves.EMBER); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to(TurnEndPhase); + const originalDmg = initialHP - blissey.hp; + + expect(blissey.hp > 0); + blissey.hp = initialHP; + + // second turn + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + const flashFireDmg = initialHP - blissey.hp; + + expect(flashFireDmg).toBeGreaterThan(originalDmg); + }, 20000); +}); 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/forecast.test.ts b/src/test/abilities/forecast.test.ts new file mode 100644 index 00000000000..78453c5f4d2 --- /dev/null +++ b/src/test/abilities/forecast.test.ts @@ -0,0 +1,298 @@ +import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; +import { Abilities } from "#app/enums/abilities"; +import { WeatherType } from "#app/enums/weather-type"; +import { DamagePhase } from "#app/phases/damage-phase"; +import { MovePhase } from "#app/phases/move-phase"; +import { PostSummonPhase } from "#app/phases/post-summon-phase"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; +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 { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Forecast", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const NORMAL_FORM = 0; + const SUNNY_FORM = 1; + const RAINY_FORM = 2; + const SNOWY_FORM = 3; + + /** + * Tests form changes based on weather changes + * @param {GameManager} game The game manager instance + * @param {WeatherType} weather The active weather to set + * @param form The expected form based on the active weather + * @param initialForm The initial form pre form change + */ + const testWeatherFormChange = async (game: GameManager, weather: WeatherType, form: number, initialForm?: number) => { + game.override.weather(weather).starterForms({ [Species.CASTFORM]: initialForm }); + await game.startBattle([Species.CASTFORM]); + + game.move.select(Moves.SPLASH); + + expect(game.scene.getPlayerPokemon()?.formIndex).toBe(form); + }; + + /** + * 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]: SUNNY_FORM }).enemyAbility(ability); + await game.startBattle([Species.CASTFORM]); + + game.move.select(Moves.SPLASH); + + expect(game.scene.getPlayerPokemon()?.formIndex).toBe(NORMAL_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.TACKLE]) + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(SPLASH_ONLY) + .enemyAbility(Abilities.BALL_FETCH); + }); + + it("changes form based on weather", async () => { + game.override + .moveset([Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SNOWSCAPE, Moves.SPLASH]) + .battleType("double") + .starterForms({ + [Species.KYOGRE]: 1, + [Species.GROUDON]: 1, + [Species.RAYQUAZA]: 1 + }); + await game.startBattle([Species.CASTFORM, Species.FEEBAS, Species.KYOGRE, Species.GROUDON, Species.RAYQUAZA, Species.ALTARIA]); + + vi.spyOn(game.scene.getParty()[5], "getAbility").mockReturnValue(allAbilities[Abilities.CLOUD_NINE]); + + const castform = game.scene.getPlayerField()[0]; + expect(castform.formIndex).toBe(NORMAL_FORM); + + game.move.select(Moves.RAIN_DANCE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(RAINY_FORM); + + game.move.select(Moves.SUNNY_DAY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(SUNNY_FORM); + + game.move.select(Moves.SNOWSCAPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(SNOWY_FORM); + + game.override.moveset([Moves.HAIL, Moves.SANDSTORM, Moves.SNOWSCAPE, Moves.SPLASH]); + + game.move.select(Moves.SANDSTORM); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(NORMAL_FORM); + + game.move.select(Moves.HAIL); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(SNOWY_FORM); + + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); // Feebas now 2, Kyogre 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(RAINY_FORM); + + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(3); // Kyogre now 3, Groudon 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(SUNNY_FORM); + + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(4); // Groudon now 4, Rayquaza 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(NORMAL_FORM); + + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); // Rayquaza now 2, Feebas 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(NORMAL_FORM); + + game.move.select(Moves.SNOWSCAPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(SNOWY_FORM); + + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(5); // Feebas now 5, Altaria 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(NORMAL_FORM); + + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(5); // Altaria now 5, Feebas 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(SNOWY_FORM); + + game.scene.arena.trySetWeather(WeatherType.FOG, false); + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("TurnStartPhase"); + + expect(castform.formIndex).toBe(NORMAL_FORM); + }, 30 * 1000); + + it("reverts to Normal Form during Clear weather", async () => { + await testWeatherFormChange(game, WeatherType.NONE, NORMAL_FORM, SUNNY_FORM); + }); + + it("reverts to Normal Form if a Pokémon on the field has Air Lock", async () => { + await testRevertFormAgainstAbility(game, Abilities.AIR_LOCK); + }); + + it("has no effect on Pokémon other than Castform", async () => { + game.override.enemyAbility(Abilities.FORECAST).enemySpecies(Species.SHUCKLE); + await game.startBattle([Species.CASTFORM]); + + game.move.select(Moves.RAIN_DANCE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerPokemon()?.formIndex).toBe(RAINY_FORM); + expect(game.scene.getEnemyPokemon()?.formIndex).not.toBe(RAINY_FORM); + }); + + it("reverts to Normal Form when Castform loses Forecast, changes form to match the weather when it regains it", async () => { + game.override.moveset([Moves.SKILL_SWAP, Moves.WORRY_SEED, Moves.SPLASH]).weather(WeatherType.RAIN).battleType("double"); + await game.startBattle([Species.CASTFORM, Species.FEEBAS]); + + const castform = game.scene.getPlayerField()[0]; + + expect(castform.formIndex).toBe(RAINY_FORM); + + game.move.select(Moves.SKILL_SWAP, 0, BattlerIndex.PLAYER_2); + game.move.select(Moves.SKILL_SWAP, 1, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(castform.formIndex).toBe(NORMAL_FORM); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(castform.formIndex).toBe(RAINY_FORM); + + await game.toNextTurn(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.WORRY_SEED, 1, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(castform.formIndex).toBe(NORMAL_FORM); + }); + + it("reverts to Normal Form when Forecast is suppressed, changes form to match the weather when it regains it", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)).weather(WeatherType.RAIN); + await game.startBattle([Species.CASTFORM, Species.PIKACHU]); + const castform = game.scene.getPlayerPokemon()!; + + expect(castform.formIndex).toBe(RAINY_FORM); + + // First turn - Forecast is suppressed + game.move.select(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.move.forceHit(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(castform.summonData.abilitySuppressed).toBe(true); + expect(castform.formIndex).toBe(NORMAL_FORM); + + await game.toNextTurn(); + + // Second turn - switch out Castform, regains Forecast + game.doSwitchPokemon(1); + await game.toNextTurn(); + + // Third turn - switch in Castform + game.doSwitchPokemon(1); + await game.phaseInterceptor.to(MovePhase); + + expect(castform.summonData.abilitySuppressed).toBe(false); + expect(castform.formIndex).toBe(RAINY_FORM); + }); + + it("does not change Castform's form until after Stealth Rock deals damage", async () => { + game.override.weather(WeatherType.RAIN).enemyMoveset(Array(4).fill(Moves.STEALTH_ROCK)); + await game.startBattle([Species.PIKACHU, Species.CASTFORM]); + + // First turn - set up stealth rock + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // Second turn - switch in Castform, regains Forecast + game.doSwitchPokemon(1); + await game.phaseInterceptor.to(PostSummonPhase); + + const castform = game.scene.getPlayerPokemon()!; + + // Damage phase should come first + await game.phaseInterceptor.to(DamagePhase); + expect(castform.hp).toBeLessThan(castform.getMaxHp()); + + // Then change form + await game.phaseInterceptor.to(QuietFormChangePhase); + expect(castform.formIndex).toBe(RAINY_FORM); + }); + + it("should be in Normal Form after the user is switched out", async () => { + game.override.weather(WeatherType.RAIN); + + await game.startBattle([Species.CASTFORM, Species.MAGIKARP]); + const castform = game.scene.getPlayerPokemon()!; + + expect(castform.formIndex).toBe(RAINY_FORM); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + expect(castform.formIndex).toBe(NORMAL_FORM); + }); +}); diff --git a/src/test/abilities/galvanize.test.ts b/src/test/abilities/galvanize.test.ts new file mode 100644 index 00000000000..4b0ddc14d7c --- /dev/null +++ b/src/test/abilities/galvanize.test.ts @@ -0,0 +1,133 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { Type } from "#app/data/type"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { HitResult } from "#app/field/pokemon"; +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"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - Galvanize", () => { + 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") + .startingLevel(100) + .ability(Abilities.GALVANIZE) + .moveset([Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES]) + .enemySpecies(Species.DUSCLOPS) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(100); + }); + + it("should change Normal-type attacks to Electric type and boost their power", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveType"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + const move = allMoves[Moves.TACKLE]; + vi.spyOn(move, "calculateBattlePower"); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.EFFECTIVE); + expect(move.calculateBattlePower).toHaveReturnedWith(48); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }, TIMEOUT); + + it("should cause Normal-type attacks to activate Volt Absorb", async () => { + game.override.enemyAbility(Abilities.VOLT_ABSORB); + + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveType"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + enemyPokemon.hp = Math.floor(enemyPokemon.getMaxHp() * 0.8); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.NO_EFFECT); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }, TIMEOUT); + + it("should not change the type of variable-type moves", async () => { + game.override.enemySpecies(Species.MIGHTYENA); + + await game.startBattle([Species.ESPEON]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveType"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + game.move.select(Moves.REVELATION_DANCE); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getMoveType).not.toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.NO_EFFECT); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }, TIMEOUT); + + it("should affect all hits of a Normal-type multi-hit move", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveType"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + game.move.select(Moves.FURY_SWIPES); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(playerPokemon.turnData.hitCount).toBeGreaterThan(1); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + + while (playerPokemon.turnData.hitsLeft > 0) { + const enemyStartingHp = enemyPokemon.hp; + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } + + expect(enemyPokemon.apply).not.toHaveReturnedWith(HitResult.NO_EFFECT); + }, TIMEOUT); +}); diff --git a/src/test/abilities/gulp_missile.test.ts b/src/test/abilities/gulp_missile.test.ts new file mode 100644 index 00000000000..286c3af1c56 --- /dev/null +++ b/src/test/abilities/gulp_missile.test.ts @@ -0,0 +1,276 @@ +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { StatusEffect } from "#app/enums/status-effect"; +import Pokemon from "#app/field/pokemon"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { TurnStartPhase } from "#app/phases/turn-start-phase"; +import GameManager from "#app/test/utils/gameManager"; +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, vi } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; +import { Stat } from "#enums/stat"; + +describe("Abilities - Gulp Missile", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const NORMAL_FORM = 0; + const GULPING_FORM = 1; + const GORGING_FORM = 2; + + /** + * Gets the effect damage of Gulp Missile + * See Gulp Missile {@link https://bulbapedia.bulbagarden.net/wiki/Gulp_Missile_(Ability)} + * @param {Pokemon} pokemon The pokemon taking the effect damage. + * @returns The effect damage of Gulp Missile + */ + const getEffectDamage = (pokemon: Pokemon): number => { + return Math.max(1, Math.floor(pokemon.getMaxHp() * 1 / 4)); + }; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .moveset([Moves.SURF, Moves.DIVE, Moves.SPLASH]) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(5); + }); + + it("changes to Gulping Form if HP is over half when Surf or Dive is used", async () => { + await game.startBattle([Species.CRAMORANT]); + const cramorant = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.DIVE); + await game.toNextTurn(); + game.move.select(Moves.DIVE); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getHpRatio()).toBeGreaterThanOrEqual(.5); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + it("changes to Gorging Form if HP is under half when Surf or Dive is used", async () => { + await game.startBattle([Species.CRAMORANT]); + const cramorant = game.scene.getPlayerPokemon()!; + + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.49); + expect(cramorant.getHpRatio()).toBe(.49); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_PIKACHU)).toBeDefined(); + expect(cramorant.formIndex).toBe(GORGING_FORM); + }); + + it("changes to base form when switched out after Surf or Dive is used", async () => { + await game.startBattle([Species.CRAMORANT, Species.MAGIKARP]); + const cramorant = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SURF); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.toNextTurn(); // form change is delayed until after end of turn + + expect(cramorant.formIndex).toBe(NORMAL_FORM); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeUndefined(); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_PIKACHU)).toBeUndefined(); + }); + + it("changes form during Dive's charge turn", async () => { + await game.startBattle([Species.CRAMORANT]); + const cramorant = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.DIVE); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + 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]); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "damageAndUpdate"); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.damageAndUpdate).toHaveReturnedWith(getEffectDamage(enemy)); + }); + + it("does not have any effect when hit by non-damaging attack", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TAIL_WHIP)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon()!; + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + 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]); + + const cramorant = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "damageAndUpdate"); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.damageAndUpdate).toHaveReturnedWith(getEffectDamage(enemy)); + expect(enemy.getStatStage(Stat.DEF)).toBe(-1); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeUndefined(); + expect(cramorant.formIndex).toBe(NORMAL_FORM); + }); + + it("paralyzes the enemy when hit in Gorging form", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "damageAndUpdate"); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.45); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_PIKACHU)).toBeDefined(); + expect(cramorant.formIndex).toBe(GORGING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.damageAndUpdate).toHaveReturnedWith(getEffectDamage(enemy)); + expect(enemy.status?.effect).toBe(StatusEffect.PARALYSIS); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_PIKACHU)).toBeUndefined(); + expect(cramorant.formIndex).toBe(NORMAL_FORM); + }); + + it("does not activate the ability when underwater", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SURF)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.DIVE); + await game.phaseInterceptor.to(BerryPhase, false); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + it("prevents effect damage but inflicts secondary effect on attacker with Magic Guard", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)).enemyAbility(Abilities.MAGIC_GUARD); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(MoveEndPhase); + const enemyHpPreEffect = enemy.hp; + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.hp).toBe(enemyHpPreEffect); + expect(enemy.getStatStage(Stat.DEF)).toBe(-1); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeUndefined(); + expect(cramorant.formIndex).toBe(NORMAL_FORM); + }); + + it("cannot be suppressed", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon()!; + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(cramorant.hasAbility(Abilities.GULP_MISSILE)).toBe(true); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + it("cannot be swapped with another ability", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SKILL_SWAP)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon()!; + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(cramorant.hasAbility(Abilities.GULP_MISSILE)).toBe(true); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + it("cannot be copied", async () => { + game.override.enemyAbility(Abilities.TRACE); + + await game.startBattle([Species.CRAMORANT]); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnStartPhase); + + expect(game.scene.getEnemyPokemon()?.hasAbility(Abilities.GULP_MISSILE)).toBe(false); + }); +}); diff --git a/src/test/abilities/heatproof.test.ts b/src/test/abilities/heatproof.test.ts new file mode 100644 index 00000000000..e2a558e6d99 --- /dev/null +++ b/src/test/abilities/heatproof.test.ts @@ -0,0 +1,77 @@ +import { Species } from "#app/enums/species"; +import { StatusEffect } from "#app/enums/status-effect"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +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 - Heatproof", () => { + 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.CHARMANDER) + .enemyAbility(Abilities.HEATPROOF) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(100) + .starterSpecies(Species.CHANDELURE) + .ability(Abilities.BALL_FETCH) + .moveset([Moves.FLAMETHROWER, Moves.SPLASH]) + .startingLevel(100); + }); + + it("reduces Fire type damage by half", async () => { + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + const initialHP = 1000; + enemy.hp = initialHP; + + game.move.select(Moves.FLAMETHROWER); + await game.phaseInterceptor.to(TurnEndPhase); + const heatproofDamage = initialHP - enemy.hp; + + enemy.hp = initialHP; + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.move.select(Moves.FLAMETHROWER); + await game.phaseInterceptor.to(TurnEndPhase); + const regularDamage = initialHP - enemy.hp; + + expect(heatproofDamage).toBeLessThanOrEqual((regularDamage / 2) + 1); + expect(heatproofDamage).toBeGreaterThanOrEqual((regularDamage / 2) - 1); + }); + + it("reduces Burn damage by half", async () => { + game.override + .enemyStatusEffect(StatusEffect.BURN) + .enemySpecies(Species.ABRA); + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // Normal burn damage is /16 + expect(enemy.hp).toBe(enemy.getMaxHp() - toDmgValue(enemy.getMaxHp() / 32)); + }); +}); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts new file mode 100644 index 00000000000..ff96b98c7ac --- /dev/null +++ b/src/test/abilities/hustle.test.ts @@ -0,0 +1,96 @@ +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { Stat } from "#app/enums/stat"; +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"; + +describe("Abilities - Hustle", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .ability(Abilities.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.classicMode.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon()!; + const atk = pikachu.stats[Stat.ATK]; + + vi.spyOn(pikachu, "getEffectiveStat"); + + game.move.select(Moves.TACKLE); + await game.move.forceHit(); + await game.phaseInterceptor.to("DamagePhase"); + + expect(pikachu.getEffectiveStat).toHaveReturnedWith(Math.floor(atk * 1.5)); + }); + + it("lowers the accuracy of the user's physical moves by 20%", async () => { + 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"); + + expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(0.8); + }); + + it("does not affect non-physical moves", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon()!; + const spatk = pikachu.stats[Stat.SPATK]; + + vi.spyOn(pikachu, "getEffectiveStat"); + vi.spyOn(pikachu, "getAccuracyMultiplier"); + + game.move.select(Moves.GIGA_DRAIN); + await game.phaseInterceptor.to("DamagePhase"); + + expect(pikachu.getEffectiveStat).toHaveReturnedWith(spatk); + expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1); + }); + + it("does not affect OHKO moves", async () => { + game.override.startingLevel(100); + game.override.enemyLevel(30); + + await game.classicMode.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + vi.spyOn(pikachu, "getAccuracyMultiplier"); + vi.spyOn(allMoves[Moves.FISSURE], "calculateBattleAccuracy"); + + game.move.select(Moves.FISSURE); + await game.phaseInterceptor.to("DamagePhase"); + + expect(enemyPokemon.turnData.damageTaken).toBe(enemyPokemon.getMaxHp()); + expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1); + expect(allMoves[Moves.FISSURE].calculateBattleAccuracy).toHaveReturnedWith(100); + }); +}); diff --git a/src/test/abilities/hyper_cutter.test.ts b/src/test/abilities/hyper_cutter.test.ts new file mode 100644 index 00000000000..64e04ac2fd3 --- /dev/null +++ b/src/test/abilities/hyper_cutter.test.ts @@ -0,0 +1,57 @@ +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"; + +describe("Abilities - Hyper Cutter", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .moveset([Moves.SAND_ATTACK, Moves.NOBLE_ROAR, Moves.DEFOG, Moves.OCTOLOCK]) + .ability(Abilities.BALL_FETCH) + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.HYPER_CUTTER) + .enemyMoveset(SPLASH_ONLY); + }); + + // Reference Link: https://bulbapedia.bulbagarden.net/wiki/Hyper_Cutter_(Ability) + + it("only prevents ATK drops", async () => { + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.OCTOLOCK); + await game.toNextTurn(); + game.move.select(Moves.DEFOG); + await game.toNextTurn(); + game.move.select(Moves.NOBLE_ROAR); + await game.toNextTurn(); + game.move.select(Moves.SAND_ATTACK); + await game.toNextTurn(); + game.override.moveset([Moves.STRING_SHOT]); + game.move.select(Moves.STRING_SHOT); + await game.toNextTurn(); + + 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/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 7d85f5bbc55..fbc660c27c2 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -1,19 +1,15 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { - MoveEffectPhase, - MoveEndPhase, - TurnEndPhase, - TurnInitPhase, -} from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; -import { QuietFormChangePhase } from "#app/form-change-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"; describe("Abilities - Ice Face", () => { let phaserGame: Phaser.Game; @@ -33,39 +29,39 @@ describe("Abilities - Ice Face", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.EISCUE); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_FACE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); + game.override.battleType("single"); + game.override.enemySpecies(Species.EISCUE); + game.override.enemyAbility(Abilities.ICE_FACE); + game.override.moveset([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); }); it("takes no damage from physical move and transforms to Noice", async () => { await game.startBattle([Species.HITMONLEE]); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(MoveEndPhase); - const eiscue = game.scene.getEnemyPokemon(); + const eiscue = game.scene.getEnemyPokemon()!; - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); }); it("takes no damage from the first hit of multihit physical move and transforms to Noice", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SURGING_STRIKES]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.moveset([Moves.SURGING_STRIKES]); + game.override.enemyLevel(1); await game.startBattle([Species.HITMONLEE]); - game.doAttack(getMovePosition(game.scene, 0, Moves.SURGING_STRIKES)); + game.move.select(Moves.SURGING_STRIKES); - const eiscue = game.scene.getEnemyPokemon(); + const eiscue = game.scene.getEnemyPokemon()!; expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeDefined(); // First hit await game.phaseInterceptor.to(MoveEffectPhase); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); expect(eiscue.formIndex).toBe(icefaceForm); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); @@ -84,11 +80,11 @@ describe("Abilities - Ice Face", () => { it("takes damage from special moves", async () => { await game.startBattle([Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.ICE_BEAM)); + game.move.select(Moves.ICE_BEAM); await game.phaseInterceptor.to(MoveEndPhase); - const eiscue = game.scene.getEnemyPokemon(); + const eiscue = game.scene.getEnemyPokemon()!; expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); expect(eiscue.formIndex).toBe(icefaceForm); @@ -98,52 +94,52 @@ describe("Abilities - Ice Face", () => { it("takes effects from status moves", async () => { await game.startBattle([Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC_THREAD)); + game.move.select(Moves.TOXIC_THREAD); await game.phaseInterceptor.to(MoveEndPhase); - const eiscue = game.scene.getEnemyPokemon(); + const eiscue = game.scene.getEnemyPokemon()!; expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); expect(eiscue.formIndex).toBe(icefaceForm); }); it("transforms to Ice Face when Hail or Snow starts", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); + game.override.moveset([Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); await game.startBattle([Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); + game.move.select(Moves.QUICK_ATTACK); await game.phaseInterceptor.to(MoveEndPhase); - const eiscue = game.scene.getEnemyPokemon(); + const eiscue = game.scene.getEnemyPokemon()!; - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); await game.phaseInterceptor.to(MoveEndPhase); - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBeNull(); expect(eiscue.formIndex).toBe(icefaceForm); }); it("transforms to Ice Face when summoned on arena with active Snow or Hail", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SNOWSCAPE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.moveset([Moves.SNOWSCAPE]); await game.startBattle([Species.EISCUE, Species.NINJASK]); - game.doAttack(getMovePosition(game.scene, 0, Moves.SNOWSCAPE)); + game.move.select(Moves.SNOWSCAPE); await game.phaseInterceptor.to(TurnEndPhase); - let eiscue = game.scene.getPlayerPokemon(); + let eiscue = game.scene.getPlayerPokemon()!; - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); await game.toNextTurn(); game.doSwitchPokemon(1); @@ -151,45 +147,45 @@ describe("Abilities - Ice Face", () => { game.doSwitchPokemon(1); await game.phaseInterceptor.to(QuietFormChangePhase); - eiscue = game.scene.getPlayerPokemon(); + eiscue = game.scene.getPlayerPokemon()!; expect(eiscue.formIndex).toBe(icefaceForm); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); }); it("will not revert to its Ice Face if there is already Hail when it changes into Noice", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle([Species.EISCUE]); - game.doAttack(getMovePosition(game.scene, 0, Moves.HAIL)); - const eiscue = game.scene.getPlayerPokemon(); + game.move.select(Moves.HAIL); + const eiscue = game.scene.getPlayerPokemon()!; await game.phaseInterceptor.to(QuietFormChangePhase); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); await game.phaseInterceptor.to(TurnEndPhase); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); }); it("persists form change when switched out", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); await game.startBattle([Species.EISCUE, Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.ICE_BEAM)); + game.move.select(Moves.ICE_BEAM); await game.phaseInterceptor.to(TurnEndPhase); - let eiscue = game.scene.getPlayerPokemon(); + let eiscue = game.scene.getPlayerPokemon()!; - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); await game.toNextTurn(); game.doSwitchPokemon(1); @@ -198,25 +194,25 @@ describe("Abilities - Ice Face", () => { eiscue = game.scene.getParty()[1]; expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); }); it("reverts to Ice Face on arena reset", async () => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.startingWave(4); + game.override.startingLevel(4); + game.override.enemySpecies(Species.MAGIKARP); + game.override.starterForms({ [Species.EISCUE]: noiceForm, }); await game.startBattle([Species.EISCUE]); - const eiscue = game.scene.getPlayerPokemon(); + const eiscue = game.scene.getPlayerPokemon()!; expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.ICE_BEAM)); + game.move.select(Moves.ICE_BEAM); await game.doKillOpponents(); await game.phaseInterceptor.to(TurnEndPhase); game.doSelectModifier(); @@ -227,15 +223,15 @@ describe("Abilities - Ice Face", () => { }); it("cannot be suppressed", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID]); + game.override.moveset([Moves.GASTRO_ACID]); await game.startBattle([Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + game.move.select(Moves.GASTRO_ACID); await game.phaseInterceptor.to(TurnEndPhase); - const eiscue = game.scene.getEnemyPokemon(); + const eiscue = game.scene.getEnemyPokemon()!; expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); expect(eiscue.formIndex).toBe(icefaceForm); @@ -243,15 +239,15 @@ describe("Abilities - Ice Face", () => { }); it("cannot be swapped with another ability", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SKILL_SWAP]); + game.override.moveset([Moves.SKILL_SWAP]); await game.startBattle([Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.SKILL_SWAP)); + game.move.select(Moves.SKILL_SWAP); await game.phaseInterceptor.to(TurnEndPhase); - const eiscue = game.scene.getEnemyPokemon(); + const eiscue = game.scene.getEnemyPokemon()!; expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); expect(eiscue.formIndex).toBe(icefaceForm); @@ -259,18 +255,18 @@ describe("Abilities - Ice Face", () => { }); it("cannot be copied", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TRACE); + game.override.ability(Abilities.TRACE); await game.startBattle([Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.SIMPLE_BEAM)); + game.move.select(Moves.SIMPLE_BEAM); await game.phaseInterceptor.to(TurnInitPhase); - const eiscue = game.scene.getEnemyPokemon(); + const eiscue = game.scene.getEnemyPokemon()!; expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); expect(eiscue.formIndex).toBe(icefaceForm); - expect(game.scene.getPlayerPokemon().hasAbility(Abilities.TRACE)).toBe(true); + expect(game.scene.getPlayerPokemon()!.hasAbility(Abilities.TRACE)).toBe(true); }); }); 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 4a690e76b56..f90ba6c0e1e 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -1,22 +1,13 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, DamagePhase, EncounterPhase, - EnemyCommandPhase, SelectStarterPhase, - TurnInitPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {BattleStat} from "#app/data/battle-stat"; -import {generateStarter, getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {Status, StatusEffect} from "#app/data/status-effect"; -import {GameModes, getGameMode} from "#app/game-mode"; +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 { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Intimidate", () => { let phaserGame: Phaser.Game; @@ -34,358 +25,113 @@ describe("Abilities - Intimidate", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); - vi.spyOn(overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + 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() => { - await game.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); - 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); + 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", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase") + ); + 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() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); - await game.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); + 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", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase") + ); + 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() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); - await game.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); + 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.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); - battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; - expect(battleStatsPokemon[BattleStat.ATK]).toBe(0); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; - expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); + expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); + expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1); + }, 20000); + + 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 ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + let enemyPokemon = game.scene.getEnemyPokemon()!; + + 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(); + + 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("double - trainer should only trigger once per pokemon", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); - await game.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() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - await game.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() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); - await game.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() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.AERIAL_ACE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - 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() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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); - - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.AERIAL_ACE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - 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("single - trainer should only trigger once and each time he switch", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.VOLT_SWITCH,Moves.VOLT_SWITCH,Moves.VOLT_SWITCH,Moves.VOLT_SWITCH]); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(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.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.AERIAL_ACE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - 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); - - - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.AERIAL_ACE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - console.log("===to new turn==="); - 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); - }, 200000); - - it("single - trainer should only trigger once whatever turn we are", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(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.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.AERIAL_ACE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - 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.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.AERIAL_ACE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - 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() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - await game.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() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(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 2d51642be70..7bf0654276c 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/src/test/abilities/intrepid_sword.test.ts @@ -1,13 +1,10 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +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 Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import {Abilities} from "#enums/abilities"; -import {Species} from "#enums/species"; -import { - CommandPhase, -} from "#app/phases"; -import {BattleStat} from "#app/data/battle-stat"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Intrepid Sword", () => { @@ -26,20 +23,23 @@ describe("Abilities - Intrepid Sword", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ZACIAN); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); + game.override.battleType("single"); + game.override.enemySpecies(Species.ZACIAN); + game.override.enemyAbility(Abilities.INTREPID_SWORD); + game.override.ability(Abilities.INTREPID_SWORD); }); - it("INTREPID SWORD on player", async() => { - await game.runToSummon([ + 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/libero.test.ts b/src/test/abilities/libero.test.ts index a00239a651b..7895e7de6bf 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -1,22 +1,21 @@ +import { allMoves } from "#app/data/move"; +import { Type } from "#app/data/type"; +import { Weather, WeatherType } from "#app/data/weather"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Biome } from "#enums/biome"; +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, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import { allMoves } from "#app/data/move.js"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { Weather, WeatherType } from "#app/data/weather.js"; -import { Type } from "#app/data/type.js"; -import { Biome } from "#enums/biome"; -import { PlayerPokemon } from "#app/field/pokemon.js"; const TIMEOUT = 20 * 1000; -describe("Abilities - Protean", () => { +describe("Abilities - Libero", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -32,24 +31,24 @@ describe("Abilities - Protean", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIBERO); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); + game.override.battleType("single"); + game.override.ability(Abilities.LIBERO); + game.override.startingLevel(100); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); test( "ability applies and changes a pokemon's type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); @@ -60,24 +59,24 @@ describe("Abilities - Protean", () => { test.skip( "ability applies only once per switch in", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); + game.override.moveset([Moves.SPLASH, Moves.AGILITY]); await game.startBattle([Species.MAGIKARP, Species.BULBASAUR]); - let leadPokemon = game.scene.getPlayerPokemon(); + let leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - game.doAttack(getMovePosition(game.scene, 0, Moves.AGILITY)); + game.move.select(Moves.AGILITY); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.LIBERO)).toHaveLength(1); const leadPokemonType = Type[leadPokemon.getTypes()[0]]; - const moveType = Type[allMoves[Moves.AGILITY].defaultType]; + const moveType = Type[allMoves[Moves.AGILITY].type]; expect(leadPokemonType).not.toBe(moveType); await game.toNextTurn(); @@ -86,10 +85,10 @@ describe("Abilities - Protean", () => { game.doSwitchPokemon(1); await game.toNextTurn(); - leadPokemon = game.scene.getPlayerPokemon(); + leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); @@ -100,15 +99,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move has a variable type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WEATHER_BALL]); + game.override.moveset([Moves.WEATHER_BALL]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); game.scene.arena.weather = new Weather(WeatherType.SUNNY); - game.doAttack(getMovePosition(game.scene, 0, Moves.WEATHER_BALL)); + game.move.select(Moves.WEATHER_BALL); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); @@ -123,15 +122,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the type has changed by another ability", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.REFRIGERATE); + game.override.moveset([Moves.TACKLE]); + game.override.passiveAbility(Abilities.REFRIGERATE); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); @@ -146,15 +145,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move calls another move", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.NATURE_POWER]); + game.override.moveset([Moves.NATURE_POWER]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); game.scene.arena.biomeType = Biome.MOUNTAIN; - game.doAttack(getMovePosition(game.scene, 0, Moves.NATURE_POWER)); + game.move.select(Moves.NATURE_POWER); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); @@ -165,14 +164,14 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move is delayed / charging", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG]); + game.override.moveset([Moves.DIG]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.DIG)); + game.move.select(Moves.DIG); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); @@ -183,21 +182,20 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move misses", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset(SPLASH_ONLY); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValueOnce(false); + game.move.select(Moves.TACKLE); + await game.move.forceMiss(); await game.phaseInterceptor.to(TurnEndPhase); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.isFullHp()).toBe(true); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); }, TIMEOUT, @@ -206,15 +204,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move is protected against", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); @@ -225,15 +223,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move fails because of type immunity", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GASTLY); + game.override.moveset([Moves.TACKLE]); + game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); @@ -244,15 +242,15 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon's type is the same as the move's type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - leadPokemon.summonData.types = [allMoves[Moves.SPLASH].defaultType]; - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + leadPokemon.summonData.types = [allMoves[Moves.SPLASH].type]; + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); @@ -263,16 +261,16 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon is terastallized", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); vi.spyOn(leadPokemon, "isTerastallized").mockReturnValue(true); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); @@ -283,14 +281,14 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon uses struggle", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STRUGGLE]); + game.override.moveset([Moves.STRUGGLE]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.STRUGGLE)); + game.move.select(Moves.STRUGGLE); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); @@ -301,14 +299,14 @@ describe("Abilities - Protean", () => { test( "ability is not applied if the pokemon's move fails", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + game.override.moveset([Moves.BURN_UP]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.BURN_UP)); + game.move.select(Moves.BURN_UP); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); @@ -319,15 +317,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TRICK_OR_TREAT]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GASTLY); + game.override.moveset([Moves.TRICK_OR_TREAT]); + game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TRICK_OR_TREAT)); + game.move.select(Moves.TRICK_OR_TREAT); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); @@ -338,14 +336,14 @@ describe("Abilities - Protean", () => { test( "ability applies correctly and the pokemon curses itself", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CURSE]); + game.override.moveset([Moves.CURSE]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.CURSE)); + game.move.select(Moves.CURSE); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); @@ -359,6 +357,6 @@ function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Mov expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); expect(pokemon.getTypes()).toHaveLength(1); const pokemonType = Type[pokemon.getTypes()[0]], - moveType = Type[allMoves[move].defaultType]; + moveType = Type[allMoves[move].type]; expect(pokemonType).toBe(moveType); } diff --git a/src/test/abilities/magic_guard.test.ts b/src/test/abilities/magic_guard.test.ts new file mode 100644 index 00000000000..64c1746c7d9 --- /dev/null +++ b/src/test/abilities/magic_guard.test.ts @@ -0,0 +1,470 @@ +import { ArenaTagSide, getArenaTag } from "#app/data/arena-tag"; +import { StatusEffect, getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; +import { WeatherType } from "#app/data/weather"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +const TIMEOUT = 20 * 1000; // 20 sec timeout + +describe("Abilities - Magic Guard", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + /** Player Pokemon overrides */ + game.override.ability(Abilities.MAGIC_GUARD); + game.override.moveset([Moves.SPLASH]); + game.override.startingLevel(100); + + /** Enemy Pokemon overrides */ + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyLevel(100); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(Ability) + + it( + "ability should prevent damage caused by weather", + async () => { + game.override.weather(WeatherType.SANDSTORM); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from weather + * - The enemy Pokemon (without Magic Guard) has taken damage from weather + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }, TIMEOUT + ); + + it( + "ability should prevent damage caused by status effects but other non-damage effects still apply", + async () => { + //Toxic keeps track of the turn counters -> important that Magic Guard keeps track of post-Toxic turns + game.override.statusEffect(StatusEffect.POISON); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from poison + * - The Pokemon's CatchRateMultiplier should be 1.5 + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(getStatusEffectCatchRateMultiplier(leadPokemon.status!.effect)).toBe(1.5); + }, TIMEOUT + ); + + it( + "ability effect should not persist when the ability is replaced", + async () => { + game.override.enemyMoveset([Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED]); + game.override.statusEffect(StatusEffect.POISON); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (that just lost its Magic Guard ability) has taken damage from poison + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + + it("Magic Guard prevents damage caused by burn but other non-damaging effects are still applied", + async () => { + game.override.enemyStatusEffect(StatusEffect.BURN); + game.override.enemyAbility(Abilities.MAGIC_GUARD); + + await game.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The enemy Pokemon (with Magic Guard) has not taken damage from burn + * - The enemy Pokemon's physical attack damage is halved (TBD) + * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 + */ + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); + }, TIMEOUT + ); + + it("Magic Guard prevents damage caused by toxic but other non-damaging effects are still applied", + async () => { + game.override.enemyStatusEffect(StatusEffect.TOXIC); + game.override.enemyAbility(Abilities.MAGIC_GUARD); + + await game.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const toxicStartCounter = enemyPokemon.status!.turnCount; + //should be 0 + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The enemy Pokemon (with Magic Guard) has not taken damage from toxic + * - The enemy Pokemon's status effect duration should be incremented + * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 + */ + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.status!.turnCount).toBeGreaterThan(toxicStartCounter); + expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); + }, TIMEOUT + ); + + + it("Magic Guard prevents damage caused by entry hazards", async () => { + //Adds and applies Spikes to both sides of the arena + const newTag = getArenaTag(ArenaTagType.SPIKES, 5, Moves.SPIKES, 0, 0, ArenaTagSide.BOTH)!; + game.scene.arena.tags.push(newTag); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from spikes + * - The enemy Pokemon (without Magic Guard) has taken damage from spikes + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard does not prevent poison from Toxic Spikes", async () => { + //Adds and applies Spikes to both sides of the arena + const playerTag = getArenaTag(ArenaTagType.TOXIC_SPIKES, 5, Moves.TOXIC_SPIKES, 0, 0, ArenaTagSide.PLAYER)!; + const enemyTag = getArenaTag(ArenaTagType.TOXIC_SPIKES, 5, Moves.TOXIC_SPIKES, 0, 0, ArenaTagSide.ENEMY)!; + game.scene.arena.tags.push(playerTag); + game.scene.arena.tags.push(enemyTag); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - Both Pokemon gain the poison status effect + * - The player Pokemon (with Magic Guard) has not taken damage from poison + * - The enemy Pokemon (without Magic Guard) has taken damage from poison + */ + expect(leadPokemon.status!.effect).toBe(StatusEffect.POISON); + expect(enemyPokemon.status!.effect).toBe(StatusEffect.POISON); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents against damage from volatile status effects", + async () => { + await game.startBattle([Species.DUSKULL]); + game.override.moveset([Moves.CURSE]); + game.override.enemyAbility(Abilities.MAGIC_GUARD); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.CURSE); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) has cut its HP to inflict curse + * - The enemy Pokemon (with Magic Guard) is cursed + * - The enemy Pokemon (with Magic Guard) does not lose HP from being cursed + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + expect(enemyPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents crash damage", async () => { + game.override.moveset([Moves.HIGH_JUMP_KICK]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.HIGH_JUMP_KICK); + await game.move.forceMiss(); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) misses High Jump Kick but does not lose HP as a result + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from recoil", async () => { + game.override.moveset([Moves.TAKE_DOWN]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TAKE_DOWN); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses a recoil move but does not lose HP from recoil + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard does not prevent damage from Struggle's recoil", async () => { + game.override.moveset([Moves.STRUGGLE]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.STRUGGLE); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses Struggle but does lose HP from Struggle's recoil + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + //This tests different move attributes than the recoil tests above + it("Magic Guard prevents self-damage from attacking moves", async () => { + game.override.moveset([Moves.STEEL_BEAM]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.STEEL_BEAM); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses a move with an HP cost but does not lose HP from using it + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + /* + it("Magic Guard does not prevent self-damage from confusion", async () => { + await game.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.CHARM); + + await game.phaseInterceptor.to(TurnEndPhase); + }); +*/ + + it("Magic Guard does not prevent self-damage from non-attacking moves", async () => { + game.override.moveset([Moves.BELLY_DRUM]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.BELLY_DRUM); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses a non-attacking move with an HP cost and thus loses HP from using it + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from abilities with PostTurnHurtIfSleepingAbAttr", async () => { + //Tests the ability Bad Dreams + game.override.statusEffect(StatusEffect.SLEEP); + //enemy pokemon is given Spore just in case player pokemon somehow awakens during test + game.override.enemyMoveset([Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE]); + game.override.enemyAbility(Abilities.BAD_DREAMS); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon is asleep + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.status!.effect).toBe(StatusEffect.SLEEP); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from abilities with PostFaintContactDamageAbAttr", async () => { + //Tests the abilities Innards Out/Aftermath + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.AFTERMATH); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.hp = 1; + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The enemy Pokemon has fainted + */ + expect(enemyPokemon.hp).toBe(0); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from abilities with PostDefendContactDamageAbAttr", async () => { + //Tests the abilities Iron Barbs/Rough Skin + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.IRON_BARBS); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon's move should have connected + */ + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from abilities with ReverseDrainAbAttr", async () => { + //Tests the ability Liquid Ooze + game.override.moveset([Moves.ABSORB]); + game.override.enemyAbility(Abilities.LIQUID_OOZE); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ABSORB); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon's move should have connected + */ + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents HP loss from abilities with PostWeatherLapseDamageAbAttr", async () => { + //Tests the abilities Solar Power/Dry Skin + game.override.passiveAbility(Abilities.SOLAR_POWER); + game.override.weather(WeatherType.SUNNY); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); +}); diff --git a/src/test/abilities/moody.test.ts b/src/test/abilities/moody.test.ts new file mode 100644 index 00000000000..5c46ea68ec5 --- /dev/null +++ b/src/test/abilities/moody.test.ts @@ -0,0 +1,89 @@ +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, vi } from "vitest"; + +describe("Abilities - Moody", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .battleType("single") + .enemySpecies(Species.RATTATA) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.MOODY) + .enemyMoveset(SPLASH_ONLY) + .moveset(SPLASH_ONLY); + }); + + it("should increase one stat stage by 2 and decrease a different stat stage by 1", + async () => { + 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 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 stat stage by 2 if all stat stages are at -6", + async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + // 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 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 stat stage by 1 stage if all stat stages are at 6", + async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + // 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 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 46fc4e5c34c..e713d78f39e 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -1,21 +1,15 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, - EnemyCommandPhase, - VictoryPhase -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {BattleStat} from "#app/data/battle-stat"; +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 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; @@ -34,34 +28,52 @@ describe("Abilities - Moxie", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.AERIAL_ACE; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.MOXIE); + game.override.ability(Abilities.MOXIE); + game.override.startingLevel(2000); + 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()!; - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + 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 new file mode 100644 index 00000000000..d8947935880 --- /dev/null +++ b/src/test/abilities/mycelium_might.test.ts @@ -0,0 +1,107 @@ +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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Mycelium Might", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.disableCrits(); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.CLEAR_BODY); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); + game.override.ability(Abilities.MYCELIUM_MIGHT); + game.override.moveset([Moves.QUICK_ATTACK, Moves.BABY_DOLL_EYES]); + }); + + /** + * 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 + **/ + + it("will move last in its priority bracket and ignore protective abilities", async () => { + await game.startBattle([Species.REGIELEKI]); + + 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(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. + // The player Pokemon (with Mycelium Might) goes last despite having higher speed than the opponent. + expect(speedOrder).toEqual([playerIndex, enemyIndex]); + expect(commandOrder).toEqual([enemyIndex, playerIndex]); + await game.phaseInterceptor.to(TurnEndPhase); + + // 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 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(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. + // The enemy Pokemon goes second because its move is in a lower priority bracket. + expect(speedOrder).toEqual([playerIndex, enemyIndex]); + expect(commandOrder).toEqual([playerIndex, enemyIndex]); + await game.phaseInterceptor.to(TurnEndPhase); + // 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 playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); + const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); + + game.move.select(Moves.QUICK_ATTACK); + + 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. + // The enemy Pokemon (without M.M.) goes second because its speed is lower. + // 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 4401ee0d40a..81a30524a5e 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -1,16 +1,15 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { 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"; +import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { BerryPhase, CommandPhase, DamagePhase, MoveEffectPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { Type } from "#app/data/type.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { StatusEffect } from "#app/data/status-effect.js"; +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"; const TIMEOUT = 20 * 1000; @@ -30,621 +29,497 @@ describe("Abilities - Parental Bond", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.battleType("single"); + game.override.disableCrits(); + game.override.ability(Abilities.PARENTAL_BOND); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.FUR_COAT); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.startingLevel(100); + game.override.enemyLevel(100); }); - test( - "ability should add second strike to attack move", + it( + "should add second strike to attack move", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); - - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; let enemyStartingHp = enemyPokemon.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; enemyStartingHp = enemyPokemon.hp; - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to("BerryPhase", false); const secondStrikeDamage = enemyStartingHp - enemyPokemon.hp; expect(leadPokemon.turnData.hitCount).toBe(2); - expect(secondStrikeDamage).toBe(Math.ceil(0.25 * firstStrikeDamage)); + expect(secondStrikeDamage).toBe(toDmgValue(0.25 * firstStrikeDamage)); }, TIMEOUT ); - test( - "ability should apply secondary effects to both strikes", + it( + "should apply secondary effects to both strikes", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.POWER_UP_PUNCH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + game.override.moveset([Moves.POWER_UP_PUNCH]); + game.override.enemySpecies(Species.AMOONGUSS); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.POWER_UP_PUNCH); - game.doAttack(getMovePosition(game.scene, 0, Moves.POWER_UP_PUNCH)); - - await game.phaseInterceptor.to(BerryPhase, false); + 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 ); - test( - "ability should not apply to Status moves", + it( + "should not apply to Status moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BABY_DOLL_EYES]); + game.override.moveset([Moves.BABY_DOLL_EYES]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.BABY_DOLL_EYES); - game.doAttack(getMovePosition(game.scene, 0, Moves.BABY_DOLL_EYES)); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); }, TIMEOUT ); - test( - "ability should not apply to multi-hit moves", + it( + "should not apply to multi-hit moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_HIT]); + game.override.moveset([Moves.DOUBLE_HIT]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.DOUBLE_HIT); + await game.move.forceHit(); - game.doAttack(getMovePosition(game.scene, 0, Moves.DOUBLE_HIT)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to("BerryPhase", false); expect(leadPokemon.turnData.hitCount).toBe(2); }, TIMEOUT ); - test( - "ability should not apply to self-sacrifice moves", + it( + "should not apply to self-sacrifice moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SELF_DESTRUCT]); + game.override.moveset([Moves.SELF_DESTRUCT]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.SELF_DESTRUCT); - game.doAttack(getMovePosition(game.scene, 0, Moves.SELF_DESTRUCT)); - - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to("DamagePhase", false); expect(leadPokemon.turnData.hitCount).toBe(1); }, TIMEOUT ); - test( - "ability should not apply to Rollout", + it( + "should not apply to Rollout", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROLLOUT]); + game.override.moveset([Moves.ROLLOUT]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.ROLLOUT); + await game.move.forceHit(); - game.doAttack(getMovePosition(game.scene, 0, Moves.ROLLOUT)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to("DamagePhase", false); expect(leadPokemon.turnData.hitCount).toBe(1); }, TIMEOUT ); - test( - "ability should not apply multiplier to fixed-damage moves", + it( + "should not apply multiplier to fixed-damage moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); + game.override.moveset([Moves.DRAGON_RAGE]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to("BerryPhase", false); - const enemyStartingHp = enemyPokemon.hp; - - game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.hp).toBe(enemyStartingHp - 80); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 80); }, TIMEOUT ); - test( - "ability should not apply multiplier to counter moves", + it( + "should not apply multiplier to counter moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.COUNTER]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.moveset([Moves.COUNTER]); + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.SHUCKLE]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.COUNTER); + await game.phaseInterceptor.to("DamagePhase"); - const playerStartingHp = leadPokemon.hp; - const enemyStartingHp = enemyPokemon.hp; + const playerDamage = leadPokemon.getMaxHp() - leadPokemon.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.COUNTER)); - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("BerryPhase", false); - const playerDamage = playerStartingHp - leadPokemon.hp; - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.hp).toBe(enemyStartingHp - 4*playerDamage); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 4 * playerDamage); }, TIMEOUT ); - test( - "ability should not apply to multi-target moves", + it( + "should not apply to multi-target moves", async () => { - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + game.override.battleType("double"); + game.override.moveset([Moves.EARTHQUAKE]); + game.override.passiveAbility(Abilities.LEVITATE); - await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); - const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + game.move.select(Moves.EARTHQUAKE); + game.move.select(Moves.EARTHQUAKE, 1); - game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); - await game.phaseInterceptor.to(CommandPhase); - - game.doAttack(getMovePosition(game.scene, 1, Moves.EARTHQUAKE)); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to("BerryPhase", false); playerPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); }, TIMEOUT ); - test( - "ability should apply to multi-target moves when hitting only one target", + it( + "should apply to multi-target moves when hitting only one target", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + game.override.moveset([Moves.EARTHQUAKE]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); - - game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); - await game.phaseInterceptor.to(DamagePhase, false); + game.move.select(Moves.EARTHQUAKE); + await game.phaseInterceptor.to("DamagePhase", false); expect(leadPokemon.turnData.hitCount).toBe(2); }, TIMEOUT ); - test( - "ability should only trigger post-target move effects once", + it( + "should only trigger post-target move effects once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MIND_BLOWN]); + game.override.moveset([Moves.MIND_BLOWN]); - await game.startBattle([Species.PIDGEOT]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.MIND_BLOWN); - game.doAttack(getMovePosition(game.scene, 0, Moves.MIND_BLOWN)); - - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to("DamagePhase", false); expect(leadPokemon.turnData.hitCount).toBe(2); // This test will time out if the user faints - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(Math.floor(leadPokemon.getMaxHp()/2)); + expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() / 2)); }, TIMEOUT ); - test( - "Burn Up only removes type after second strike with this ability", + it( + "Burn Up only removes type after the second strike", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + game.override.moveset([Moves.BURN_UP]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.BURN_UP); - game.doAttack(getMovePosition(game.scene, 0, Moves.BURN_UP)); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("MoveEffectPhase"); expect(leadPokemon.turnData.hitCount).toBe(2); expect(enemyPokemon.hp).toBeGreaterThan(0); expect(leadPokemon.isOfType(Type.FIRE)).toBe(true); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to("BerryPhase", false); expect(leadPokemon.isOfType(Type.FIRE)).toBe(false); }, TIMEOUT ); - test( + it( "Moves boosted by this ability and Multi-Lens should strike 4 times", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.moveset([Moves.TACKLE]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.TACKLE); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(leadPokemon.turnData.hitCount).toBe(4); }, TIMEOUT ); - test( + it( "Super Fang boosted by this ability and Multi-Lens should strike twice", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUPER_FANG]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.moveset([Moves.SUPER_FANG]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.SUPER_FANG); + await game.move.forceHit(); - const enemyStartingHp = enemyPokemon.hp; - - game.doAttack(getMovePosition(game.scene, 0, Moves.SUPER_FANG)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(leadPokemon.turnData.hitCount).toBe(2); - await game.phaseInterceptor.to(MoveEndPhase, false); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(enemyPokemon.hp).toBe(Math.ceil(enemyStartingHp * 0.25)); + expect(enemyPokemon.hp).toBe(Math.ceil(enemyPokemon.getMaxHp() * 0.25)); }, TIMEOUT ); - test( + it( "Seismic Toss boosted by this ability and Multi-Lens should strike twice", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SEISMIC_TOSS]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.moveset([Moves.SEISMIC_TOSS]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); - - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; const enemyStartingHp = enemyPokemon.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.SEISMIC_TOSS)); + game.move.select(Moves.SEISMIC_TOSS); + await game.move.forceHit(); - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(leadPokemon.turnData.hitCount).toBe(2); - await game.phaseInterceptor.to(MoveEndPhase, false); + await game.phaseInterceptor.to("MoveEndPhase", false); expect(enemyPokemon.hp).toBe(enemyStartingHp - 200); }, TIMEOUT ); - test( + it( "Hyper Beam boosted by this ability should strike twice, then recharge", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HYPER_BEAM]); + game.override.moveset([Moves.HYPER_BEAM]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.HYPER_BEAM); + await game.move.forceHit(); - game.doAttack(getMovePosition(game.scene, 0, Moves.HYPER_BEAM)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(leadPokemon.turnData.hitCount).toBe(2); expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); }, TIMEOUT ); - /** TODO: Fix TRAPPED tag lapsing incorrectly, then run this test */ - test.skip( + it( "Anchor Shot boosted by this ability should only trap the target after the second hit", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ANCHOR_SHOT]); + game.override.moveset([Moves.ANCHOR_SHOT]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.ANCHOR_SHOT); + await game.move.forceHit(); - game.doAttack(getMovePosition(game.scene, 0, Moves.ANCHOR_SHOT)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); // Passes + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - await game.phaseInterceptor.to(MoveEndPhase); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); // Passes + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); // Fails :( + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); }, TIMEOUT ); - test( + it( "Smack Down boosted by this ability should only ground the target after the second hit", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SMACK_DOWN]); + game.override.moveset([Moves.SMACK_DOWN]); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.SMACK_DOWN); + await game.move.forceHit(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SMACK_DOWN)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(leadPokemon.turnData.hitCount).toBe(2); expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); }, TIMEOUT ); - test( + it( "U-turn boosted by this ability should strike twice before forcing a switch", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.U_TURN]); + game.override.moveset([Moves.U_TURN]); - await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.U_TURN); + await game.move.forceHit(); - game.doAttack(getMovePosition(game.scene, 0, Moves.U_TURN)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to("MoveEffectPhase"); expect(leadPokemon.turnData.hitCount).toBe(2); // This will cause this test to time out if the switch was forced on the first hit. - await game.phaseInterceptor.to(MoveEffectPhase, false); + await game.phaseInterceptor.to("MoveEffectPhase", false); }, TIMEOUT ); - test( + it( "Wake-Up Slap boosted by this ability should only wake up the target after the second hit", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WAKE_UP_SLAP]); - vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); + game.override.moveset([Moves.WAKE_UP_SLAP]).enemyStatusEffect(StatusEffect.SLEEP); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.WAKE_UP_SLAP); + await game.move.forceHit(); - game.doAttack(getMovePosition(game.scene, 0, Moves.WAKE_UP_SLAP)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(leadPokemon.turnData.hitCount).toBe(2); expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.status?.effect).toBeUndefined(); }, TIMEOUT ); - test( - "ability should not cause user to hit into King's Shield more than once", + it( + "should not cause user to hit into King's Shield more than once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD]); + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset(Array(4).fill(Moves.KINGS_SHIELD)); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.TACKLE); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to("BerryPhase", false); - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(-1); }, TIMEOUT ); - test( - "ability should not cause user to hit into Storm Drain more than once", + it( + "should not cause user to hit into Storm Drain more than once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STORM_DRAIN); + game.override.moveset([Moves.WATER_GUN]); + game.override.enemyAbility(Abilities.STORM_DRAIN); - await game.startBattle([Species.CHARIZARD]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).not.toBe(undefined); + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).not.toBe(undefined); + game.move.select(Moves.WATER_GUN); - game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + await game.phaseInterceptor.to("BerryPhase", false); - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(1); + expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(1); }, TIMEOUT ); - test( - "ability should not apply to multi-target moves with Multi-Lens", + it( + "should not apply to multi-target moves with Multi-Lens", async () => { - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.SPLASH]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.battleType("double"); + game.override.moveset([Moves.EARTHQUAKE, Moves.SPLASH]); + game.override.passiveAbility(Abilities.LEVITATE); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); - - const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); const enemyStartingHp = enemyPokemon.map(p => p.hp); - game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); - await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.EARTHQUAKE); + game.move.select(Moves.SPLASH, 1); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); - - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); const enemyFirstHitDamage = enemyStartingHp.map((hp, i) => hp - enemyPokemon[i].hp); - await game.phaseInterceptor.to(BerryPhase, false); - - enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(2*enemyFirstHitDamage[i])); + await game.phaseInterceptor.to("BerryPhase", false); + enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(2 * enemyFirstHitDamage[i])); }, TIMEOUT ); }); diff --git a/src/test/abilities/pastel_veil.test.ts b/src/test/abilities/pastel_veil.test.ts new file mode 100644 index 00000000000..ba90c7e3b3f --- /dev/null +++ b/src/test/abilities/pastel_veil.test.ts @@ -0,0 +1,74 @@ +import { BattlerIndex } from "#app/battle"; +import { StatusEffect } from "#app/data/status-effect"; +import { Abilities } from "#app/enums/abilities"; +import { CommandPhase } from "#app/phases/command-phase"; +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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +describe("Abilities - Pastel Veil", () => { + 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.TOXIC_THREAD, Moves.SPLASH]) + .enemyAbility(Abilities.BALL_FETCH) + .enemySpecies(Species.SUNKERN) + .enemyMoveset(SPLASH_ONLY); + }); + + it("prevents the user and its allies from being afflicted by poison", async () => { + await game.startBattle([Species.MAGIKARP, Species.GALAR_PONYTA]); + const ponyta = game.scene.getPlayerField()[1]; + const magikarp = game.scene.getPlayerField()[0]; + ponyta.abilityIndex = 1; + + expect(ponyta.hasAbility(Abilities.PASTEL_VEIL)).toBe(true); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.TOXIC_THREAD, 1, BattlerIndex.PLAYER); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(magikarp.status?.effect).toBeUndefined(); + }); + + it("it heals the poisoned status condition of allies if user is sent out into battle", async () => { + await game.startBattle([Species.MAGIKARP, Species.FEEBAS, Species.GALAR_PONYTA]); + const ponyta = game.scene.getParty()[2]; + const magikarp = game.scene.getPlayerField()[0]; + ponyta.abilityIndex = 1; + + expect(ponyta.hasAbility(Abilities.PASTEL_VEIL)).toBe(true); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.TOXIC_THREAD, 1, BattlerIndex.PLAYER); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(magikarp.status?.effect).toBe(StatusEffect.POISON); + + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(magikarp.status?.effect).toBeUndefined(); + }); +}); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index 68a360a60a2..ec37bc96c2f 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -1,13 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "#test/utils/gameManager"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-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 { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,10 +26,10 @@ describe("Abilities - POWER CONSTRUCT", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.POWER_CONSTRUCT); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.battleType("single"); + game.override.ability(Abilities.POWER_CONSTRUCT); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( @@ -39,8 +37,8 @@ describe("Abilities - POWER CONSTRUCT", () => { async () => { const baseForm = 2, completeForm = 4; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.startingWave(4); + game.override.starterForms({ [Species.ZYGARDE]: completeForm, }); @@ -48,19 +46,19 @@ describe("Abilities - POWER CONSTRUCT", () => { const zygarde = game.scene.getParty().find((p) => p.species.speciesId === Species.ZYGARDE); expect(zygarde).not.toBe(undefined); - expect(zygarde.formIndex).toBe(completeForm); + expect(zygarde!.formIndex).toBe(completeForm); - zygarde.hp = 0; - zygarde.status = new Status(StatusEffect.FAINT); - expect(zygarde.isFainted()).toBe(true); + zygarde!.hp = 0; + zygarde!.status = new Status(StatusEffect.FAINT); + expect(zygarde!.isFainted()).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to(TurnEndPhase); game.doSelectModifier(); await game.phaseInterceptor.to(QuietFormChangePhase); - expect(zygarde.formIndex).toBe(baseForm); + expect(zygarde!.formIndex).toBe(baseForm); }, TIMEOUT ); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index 0ed2b10f4be..b83284c0bac 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -1,19 +1,20 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import Move, { allMoves, MoveCategory } from "#app/data/move.js"; -import { AllyMoveCategoryPowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +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"; describe("Abilities - Power Spot", () => { let phaserGame: Phaser.Game; let game: GameManager; + const powerSpotMultiplier = 1.3; + beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, @@ -26,95 +27,52 @@ describe("Abilities - Power Spot", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ROCK_SLIDE, Moves.SPLASH, Moves.HEAT_WAVE]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.battleType("double"); + game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.BALL_FETCH); }); it("raises the power of allies' special moves by 30%", async () => { - const moveToBeUsed = Moves.HEAT_WAVE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.DAZZLING_GLEAM]; + const basePower = moveToCheck.power; - await game.startBattle([Species.MAGIKARP, Species.STONJOURNER]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.startBattle([Species.REGIELEKI, Species.STONJOURNER]); + game.move.select(Moves.DAZZLING_GLEAM); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(MoveEffectPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).not.toBe(basePower); - expect(mockedPower).toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower * powerSpotMultiplier); }); it("raises the power of allies' physical moves by 30%", async () => { - const moveToBeUsed = Moves.ROCK_SLIDE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.BREAKING_SWIPE]; + const basePower = moveToCheck.power; - await game.startBattle([Species.MAGIKARP, Species.STONJOURNER]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.startBattle([Species.REGIELEKI, Species.STONJOURNER]); + game.move.select(Moves.BREAKING_SWIPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(MoveEffectPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).not.toBe(basePower); - expect(mockedPower).toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower * powerSpotMultiplier); }); it("does not raise the power of the ability owner's moves", async () => { - const moveToBeUsed = Moves.HEAT_WAVE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.BREAKING_SWIPE]; + const basePower = moveToCheck.power; - await game.startBattle([Species.STONJOURNER, Species.MAGIKARP]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.startBattle([Species.STONJOURNER, Species.REGIELEKI]); + game.move.select(Moves.BREAKING_SWIPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(TurnEndPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).toBe(basePower); - expect(mockedPower).not.toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower); }); }); - -/** - * Calculates the mocked power of a move. - * Note this does not consider other damage calculations - * except the power multiplier from Power Spot. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used by the attacker. - * @returns The adjusted power of the move. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const powerHolder = new NumberHolder(move.power); - - /** - * @see AllyMoveCategoryPowerBoostAbAttr - */ - if (attacker.getAlly().hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { - const powerSpotInstance = new AllyMoveCategoryPowerBoostAbAttr([MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3); - powerSpotInstance.applyPreAttack(attacker, false, defender, move, [ powerHolder ]); - } - - return powerHolder.value; -}; - -/** - * Retrieves the power multiplier from a Pokémon's ability attribute. - * - * @param pokemon - The Pokémon whose ability attributes are being queried. - * @returns The power multiplier of the `AllyMoveCategoryPowerBoostAbAttr` attribute. - */ -const getAttrPowerMultiplier = (pokemon: Pokemon) => { - const attr = pokemon.getAbilityAttrs(AllyMoveCategoryPowerBoostAbAttr); - - return (attr[0] as AllyMoveCategoryPowerBoostAbAttr)["powerMultiplier"]; -}; diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 125c03eb39c..6ecabbfade0 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -1,18 +1,17 @@ +import { allMoves } from "#app/data/move"; +import { Type } from "#app/data/type"; +import { Weather, WeatherType } from "#app/data/weather"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Biome } from "#enums/biome"; +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, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import { allMoves } from "#app/data/move.js"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { Weather, WeatherType } from "#app/data/weather.js"; -import { Type } from "#app/data/type.js"; -import { Biome } from "#enums/biome"; -import { PlayerPokemon } from "#app/field/pokemon.js"; const TIMEOUT = 20 * 1000; @@ -32,24 +31,24 @@ describe("Abilities - Protean", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PROTEAN); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); + game.override.battleType("single"); + game.override.ability(Abilities.PROTEAN); + game.override.startingLevel(100); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); test( "ability applies and changes a pokemon's type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); @@ -60,24 +59,24 @@ describe("Abilities - Protean", () => { test.skip( "ability applies only once per switch in", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); + game.override.moveset([Moves.SPLASH, Moves.AGILITY]); await game.startBattle([Species.MAGIKARP, Species.BULBASAUR]); - let leadPokemon = game.scene.getPlayerPokemon(); + let leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - game.doAttack(getMovePosition(game.scene, 0, Moves.AGILITY)); + game.move.select(Moves.AGILITY); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.PROTEAN)).toHaveLength(1); const leadPokemonType = Type[leadPokemon.getTypes()[0]]; - const moveType = Type[allMoves[Moves.AGILITY].defaultType]; + const moveType = Type[allMoves[Moves.AGILITY].type]; expect(leadPokemonType).not.toBe(moveType); await game.toNextTurn(); @@ -86,10 +85,10 @@ describe("Abilities - Protean", () => { game.doSwitchPokemon(1); await game.toNextTurn(); - leadPokemon = game.scene.getPlayerPokemon(); + leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); @@ -100,15 +99,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move has a variable type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WEATHER_BALL]); + game.override.moveset([Moves.WEATHER_BALL]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); game.scene.arena.weather = new Weather(WeatherType.SUNNY); - game.doAttack(getMovePosition(game.scene, 0, Moves.WEATHER_BALL)); + game.move.select(Moves.WEATHER_BALL); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); @@ -123,15 +122,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the type has changed by another ability", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.REFRIGERATE); + game.override.moveset([Moves.TACKLE]); + game.override.passiveAbility(Abilities.REFRIGERATE); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); @@ -146,15 +145,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move calls another move", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.NATURE_POWER]); + game.override.moveset([Moves.NATURE_POWER]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); game.scene.arena.biomeType = Biome.MOUNTAIN; - game.doAttack(getMovePosition(game.scene, 0, Moves.NATURE_POWER)); + game.move.select(Moves.NATURE_POWER); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); @@ -165,14 +164,14 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move is delayed / charging", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG]); + game.override.moveset([Moves.DIG]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.DIG)); + game.move.select(Moves.DIG); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); @@ -183,21 +182,20 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move misses", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset(SPLASH_ONLY); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); - await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValueOnce(false); + game.move.select(Moves.TACKLE); + await game.move.forceMiss(); await game.phaseInterceptor.to(TurnEndPhase); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.isFullHp()).toBe(true); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); }, TIMEOUT, @@ -206,15 +204,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move is protected against", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); @@ -225,15 +223,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move fails because of type immunity", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GASTLY); + game.override.moveset([Moves.TACKLE]); + game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); @@ -244,15 +242,15 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon's type is the same as the move's type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - leadPokemon.summonData.types = [allMoves[Moves.SPLASH].defaultType]; - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + leadPokemon.summonData.types = [allMoves[Moves.SPLASH].type]; + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); @@ -263,16 +261,16 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon is terastallized", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); vi.spyOn(leadPokemon, "isTerastallized").mockReturnValue(true); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); @@ -283,14 +281,14 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon uses struggle", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STRUGGLE]); + game.override.moveset([Moves.STRUGGLE]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.STRUGGLE)); + game.move.select(Moves.STRUGGLE); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); @@ -301,14 +299,14 @@ describe("Abilities - Protean", () => { test( "ability is not applied if the pokemon's move fails", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + game.override.moveset([Moves.BURN_UP]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.BURN_UP)); + game.move.select(Moves.BURN_UP); await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); @@ -319,15 +317,15 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TRICK_OR_TREAT]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GASTLY); + game.override.moveset([Moves.TRICK_OR_TREAT]); + game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.TRICK_OR_TREAT)); + game.move.select(Moves.TRICK_OR_TREAT); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); @@ -338,14 +336,14 @@ describe("Abilities - Protean", () => { test( "ability applies correctly and the pokemon curses itself", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CURSE]); + game.override.moveset([Moves.CURSE]); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - game.doAttack(getMovePosition(game.scene, 0, Moves.CURSE)); + game.move.select(Moves.CURSE); await game.phaseInterceptor.to(TurnEndPhase); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); @@ -359,6 +357,6 @@ function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Mov expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); expect(pokemon.getTypes()).toHaveLength(1); const pokemonType = Type[pokemon.getTypes()[0]], - moveType = Type[allMoves[move].defaultType]; + moveType = Type[allMoves[move].type]; expect(pokemonType).toBe(moveType); } diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 884b108381d..00d344ed333 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -1,12 +1,10 @@ -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as Overrides from "#app/overrides"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#enums/species"; -import { FaintPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { allAbilities, BypassSpeedChanceAbAttr } from "#app/data/ability"; +import { FaintPhase } from "#app/phases/faint-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, test, vi } from "vitest"; describe("Abilities - Quick Draw", () => { @@ -25,26 +23,30 @@ describe("Abilities - Quick Draw", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.QUICK_DRAW); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TAIL_WHIP]); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.battleType("single"); + + game.override.starterSpecies(Species.MAGIKARP); + game.override.ability(Abilities.QUICK_DRAW); + game.override.moveset([Moves.TACKLE, Moves.TAIL_WHIP]); + + game.override.enemyLevel(100); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); }); test("makes pokemon going first in its priority bracket", async () => { - await game.startBattle([Species.SLOWBRO]); + await game.startBattle(); - const pokemon = game.scene.getPlayerPokemon(); - const enemy = game.scene.getEnemyPokemon(); + const pokemon = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; pokemon.hp = 1; enemy.hp = 1; - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(FaintPhase, false); expect(pokemon.isFainted()).toBe(false); @@ -52,35 +54,39 @@ describe("Abilities - Quick Draw", () => { expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); }, 20000); - test("does not triggered by non damage moves", async () => { - await game.startBattle([Species.SLOWBRO]); + test("does not triggered by non damage moves", { + timeout: 20000, + retry: 5 + }, async () => { + await game.startBattle(); - const pokemon = game.scene.getPlayerPokemon(); - const enemy = game.scene.getEnemyPokemon(); + const pokemon = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; pokemon.hp = 1; enemy.hp = 1; - game.doAttack(getMovePosition(game.scene, 0, Moves.TAIL_WHIP)); + game.move.select(Moves.TAIL_WHIP); await game.phaseInterceptor.to(FaintPhase, false); expect(pokemon.isFainted()).toBe(true); expect(enemy.isFainted()).toBe(false); expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); - }, 20000); + } + ); test("does not increase priority", async () => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.EXTREME_SPEED)); + game.override.enemyMoveset(Array(4).fill(Moves.EXTREME_SPEED)); - await game.startBattle([Species.SLOWBRO]); + await game.startBattle(); - const pokemon = game.scene.getPlayerPokemon(); - const enemy = game.scene.getEnemyPokemon(); + const pokemon = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; pokemon.hp = 1; enemy.hp = 1; - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(FaintPhase, false); expect(pokemon.isFainted()).toBe(true); diff --git a/src/test/abilities/sand_spit.test.ts b/src/test/abilities/sand_spit.test.ts new file mode 100644 index 00000000000..041e20faf7f --- /dev/null +++ b/src/test/abilities/sand_spit.test.ts @@ -0,0 +1,56 @@ +import { WeatherType } from "#app/enums/weather-type"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + + +describe("Abilities - Sand Spit", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.disableCrits(); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.starterSpecies(Species.SILICOBRA); + game.override.ability(Abilities.SAND_SPIT); + game.override.moveset([Moves.SPLASH, Moves.COIL]); + }); + + it("should trigger when hit with damaging move", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + await game.startBattle(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM); + }, 20000); + + it("should not trigger when targetted with status moves", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + await game.startBattle(); + + game.move.select(Moves.COIL); + await game.toNextTurn(); + + expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.SANDSTORM); + }, 20000); +}); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index 221d48d3ca1..da9fdcc01ab 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -1,15 +1,15 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { 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"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { CommandPhase, MoveEffectPhase, MoveEndPhase } from "#app/phases.js"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { WeatherType } from "#app/data/weather.js"; -import { BattleStatMultiplierAbAttr, allAbilities } from "#app/data/ability.js"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; const TIMEOUT = 20 * 1000; @@ -29,14 +29,15 @@ describe("Abilities - Sand Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEOWSCARADA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SANDSTORM); + game.override.moveset([Moves.SPLASH]); + game.override.enemySpecies(Species.MEOWSCARADA); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override + .weather(WeatherType.SANDSTORM) + .battleType("double"); }); test( @@ -45,17 +46,13 @@ describe("Abilities - Sand Veil", () => { await game.startBattle([Species.SNORLAX, Species.BLISSEY]); const leadPokemon = game.scene.getPlayerField(); - leadPokemon.forEach(p => expect(p).toBeDefined()); - - const enemyPokemon = game.scene.getEnemyField(); - enemyPokemon.forEach(p => expect(p).toBeDefined()); 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, 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; } @@ -66,17 +63,17 @@ describe("Abilities - Sand Veil", () => { expect(leadPokemon[0].hasAbility(Abilities.SAND_VEIL)).toBe(true); expect(leadPokemon[1].hasAbility(Abilities.SAND_VEIL)).toBe(false); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(CommandPhase); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to(MoveEffectPhase, false); await game.phaseInterceptor.to(MoveEndPhase, false); - expect(leadPokemon[0].hp).toBe(leadPokemon[0].getMaxHp()); + expect(leadPokemon[0].isFullHp()).toBe(true); expect(leadPokemon[1].hp).toBeLessThan(leadPokemon[1].getMaxHp()); }, TIMEOUT ); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 403ac1bf4ff..2d70ede3530 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -1,17 +1,15 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - MoveEndPhase, TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { TerrainType } from "#app/data/terrain.js"; +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"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; 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"; // See also: TypeImmunityAbAttr describe("Abilities - Sap Sipper", () => { @@ -30,137 +28,142 @@ describe("Abilities - Sap Sipper", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); + 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; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + 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.doAttack(getMovePosition(game.scene, 0, moveToUse)); + 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; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + game.override.moveset([ moveToUse ]); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(enemyAbility); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + 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() => { + it("do not activate against status moves that target the field", async () => { const moveToUse = Moves.GRASSY_TERRAIN; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + game.override.moveset([ moveToUse ]); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(enemyAbility); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); 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.arena.terrain!.terrainType).toBe(TerrainType.GRASSY); + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(0); }); - it("activate once against multi-hit grass attacks", async() => { + it("activate once against multi-hit grass attacks", async () => { const moveToUse = Moves.BULLET_SEED; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + 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.doAttack(getMovePosition(game.scene, 0, moveToUse)); + 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() => { + it("do not activate against status moves that target the user", async () => { const moveToUse = Moves.SPIKY_SHIELD; const ability = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.moveset([ moveToUse ]); + game.override.ability(ability); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.NONE); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + 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"); }); - /* // TODO Add METRONOME outcome override // To run this testcase, manually modify the METRONOME move to always give SAP_SIPPER, then uncomment - it("activate once against multi-hit grass attacks (metronome)", async() => { + it.todo("activate once against multi-hit grass attacks (metronome)", async () => { const moveToUse = Moves.METRONOME; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + 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.doAttack(getMovePosition(game.scene, 0, moveToUse)); + 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/schooling.test.ts b/src/test/abilities/schooling.test.ts index 4fd64b97246..ad9663bf8e5 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -1,13 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "#test/utils/gameManager"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-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 { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,10 +26,10 @@ describe("Abilities - SCHOOLING", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCHOOLING); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.battleType("single"); + game.override.ability(Abilities.SCHOOLING); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( @@ -39,14 +37,14 @@ describe("Abilities - SCHOOLING", () => { async () => { const soloForm = 0, schoolForm = 1; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.startingWave(4); + game.override.starterForms({ [Species.WISHIWASHI]: schoolForm, }); await game.startBattle([Species.MAGIKARP, Species.WISHIWASHI]); - const wishiwashi = game.scene.getParty().find((p) => p.species.speciesId === Species.WISHIWASHI); + const wishiwashi = game.scene.getParty().find((p) => p.species.speciesId === Species.WISHIWASHI)!; expect(wishiwashi).not.toBe(undefined); expect(wishiwashi.formIndex).toBe(schoolForm); @@ -54,7 +52,7 @@ describe("Abilities - SCHOOLING", () => { wishiwashi.status = new Status(StatusEffect.FAINT); expect(wishiwashi.isFainted()).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to(TurnEndPhase); game.doSelectModifier(); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index d790469e952..3c0d12a06ea 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { PostSummonPhase, TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { PostSummonPhase } from "#app/phases/post-summon-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +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 - Screen Cleaner", () => { let phaserGame: Phaser.Game; @@ -25,18 +24,18 @@ describe("Abilities - Screen Cleaner", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.battleType("single"); + game.override.ability(Abilities.SCREEN_CLEANER); + game.override.enemySpecies(Species.SHUCKLE); }); it("removes Aurora Veil", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); + game.override.moveset([Moves.HAIL]); + game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.HAIL)); + game.move.select(Moves.HAIL); await game.phaseInterceptor.to(TurnEndPhase); expect(game.scene.arena.getTag(ArenaTagType.AURORA_VEIL)).toBeDefined(); @@ -49,11 +48,11 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Light Screen", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); + game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); expect(game.scene.arena.getTag(ArenaTagType.LIGHT_SCREEN)).toBeDefined(); @@ -66,11 +65,11 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Reflect", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); expect(game.scene.arena.getTag(ArenaTagType.REFLECT)).toBeDefined(); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index cf283ea92a8..e06288b9de9 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -1,20 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import {Abilities} from "#enums/abilities"; -import {applyAbAttrs ,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; -import { - CommandPhase, - MoveEffectPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {Moves} from "#enums/moves"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; +import { BattlerIndex } from "#app/battle"; +import { applyAbAttrs, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; +import { Stat } from "#enums/stat"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import * as Utils from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Serene Grace", () => { @@ -34,14 +28,14 @@ describe("Abilities - Serene Grace", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH, Moves.TACKLE]; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.enemySpecies(Species.ONIX); + game.override.startingLevel(100); + game.override.moveset(movesToUse); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); - it("Move chance without Serene Grace", async() => { + it("Move chance without Serene Grace", async () => { const moveToUse = Moves.AIR_SLASH; await game.startBattle([ Species.PIDGEOT @@ -49,17 +43,11 @@ describe("Abilities - Serene Grace", () => { game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); // Check chance of Air Slash without Serene Grace @@ -68,31 +56,25 @@ describe("Abilities - Serene Grace", () => { expect(move.id).toBe(Moves.AIR_SLASH); const chance = new Utils.IntegerHolder(move.chance); - console.log(move.chance + " Their ability is " + phase.getUserPokemon().getAbility().name); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); + console.log(move.chance + " Their ability is " + phase.getUserPokemon()!.getAbility().name); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); expect(chance.value).toBe(30); }, 20000); - it("Move chance with Serene Grace", async() => { + it("Move chance with Serene Grace", async () => { const moveToUse = Moves.AIR_SLASH; - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SERENE_GRACE); + game.override.ability(Abilities.SERENE_GRACE); await game.startBattle([ Species.TOGEKISS ]); game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); // Check chance of Air Slash with Serene Grace @@ -101,7 +83,7 @@ describe("Abilities - Serene Grace", () => { expect(move.id).toBe(Moves.AIR_SLASH); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); expect(chance.value).toBe(60); }, 20000); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index c01ec176f4d..69b47e1eaae 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -1,20 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import {Abilities} from "#enums/abilities"; -import {applyAbAttrs ,applyPreAttackAbAttrs,applyPostDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; -import { - CommandPhase, - MoveEffectPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {Moves} from "#enums/moves"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; +import { BattlerIndex } from "#app/battle"; +import { applyAbAttrs, applyPostDefendAbAttrs, applyPreAttackAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr } from "#app/data/ability"; +import { Stat } from "#enums/stat"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import * as Utils from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Sheer Force", () => { @@ -34,33 +28,27 @@ describe("Abilities - Sheer Force", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH, Moves.BIND, Moves.CRUSH_CLAW, Moves.TACKLE]; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.enemySpecies(Species.ONIX); + game.override.startingLevel(100); + game.override.moveset(movesToUse); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); - it("Sheer Force", async() => { + it("Sheer Force", async () => { const moveToUse = Moves.AIR_SLASH; - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); const phase = game.scene.getCurrentPhase() as MoveEffectPhase; @@ -71,35 +59,29 @@ describe("Abilities - Sheer Force", () => { const power = new Utils.IntegerHolder(move.power); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon(), phase.getTarget(), move, power); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, move, false, power); expect(chance.value).toBe(0); - expect(power.value).toBe(move.power * 5461/4096); + expect(power.value).toBe(move.power * 5461 / 4096); }, 20000); - it("Sheer Force with exceptions including binding moves", async() => { + it("Sheer Force with exceptions including binding moves", async () => { const moveToUse = Moves.BIND; - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); game.scene.getEnemyParty()[0].stats[Stat.DEF] = 10000; - game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); const phase = game.scene.getCurrentPhase() as MoveEffectPhase; @@ -110,8 +92,8 @@ describe("Abilities - Sheer Force", () => { const power = new Utils.IntegerHolder(move.power); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon(), phase.getTarget(), move, power); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, move, false, power); expect(chance.value).toBe(-1); expect(power.value).toBe(move.power); @@ -119,26 +101,20 @@ describe("Abilities - Sheer Force", () => { }, 20000); - it("Sheer Force with moves with no secondary effect", async() => { + it("Sheer Force with moves with no secondary effect", async () => { const moveToUse = Moves.TACKLE; - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); game.scene.getEnemyParty()[0].stats[Stat.DEF] = 10000; - game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); const phase = game.scene.getCurrentPhase() as MoveEffectPhase; @@ -149,8 +125,8 @@ describe("Abilities - Sheer Force", () => { const power = new Utils.IntegerHolder(move.power); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon(), phase.getTarget(), move, power); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, move, false, power); expect(chance.value).toBe(-1); expect(power.value).toBe(move.power); @@ -158,28 +134,22 @@ describe("Abilities - Sheer Force", () => { }, 20000); - it("Sheer Force Disabling Specific Abilities", async() => { + it("Sheer Force Disabling Specific Abilities", async () => { const moveToUse = Moves.CRUSH_CLAW; - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COLOR_CHANGE); - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "KINGS_ROCK", count: 1}]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + game.override.enemyAbility(Abilities.COLOR_CHANGE); + game.override.startingHeldItems([{ name: "KINGS_ROCK", count: 1 }]); + game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); game.scene.getEnemyParty()[0].stats[Stat.DEF] = 10000; - game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); const phase = game.scene.getCurrentPhase() as MoveEffectPhase; @@ -189,16 +159,16 @@ describe("Abilities - Sheer Force", () => { //Disable color change due to being hit by Sheer Force const power = new Utils.IntegerHolder(move.power); const chance = new Utils.IntegerHolder(move.chance); - const user = phase.getUserPokemon(); - const target = phase.getTarget(); + const user = phase.getUserPokemon()!; + const target = phase.getTarget()!; const opponentType = target.getTypes()[0]; - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, chance, move, target, false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, user, target, move, power); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, chance, move, target, false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, user, target, move, false, power); applyPostDefendAbAttrs(PostDefendTypeChangeAbAttr, target, user, move, target.apply(user, move)); expect(chance.value).toBe(0); - expect(power.value).toBe(move.power * 5461/4096); + expect(power.value).toBe(move.power * 5461 / 4096); expect(target.getTypes().length).toBe(2); expect(target.getTypes()[0]).toBe(opponentType); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index f52a1d6c7d4..8a0b769827d 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -1,20 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Abilities } from "#enums/abilities"; -import {applyAbAttrs ,applyPreDefendAbAttrs,IgnoreMoveEffectsAbAttr,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; -import { - CommandPhase, - MoveEffectPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {Moves} from "#enums/moves"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; +import { BattlerIndex } from "#app/battle"; +import { applyAbAttrs, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; +import { Stat } from "#enums/stat"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import * as Utils from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Shield Dust", () => { @@ -34,15 +28,15 @@ describe("Abilities - Shield Dust", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH]; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELD_DUST); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.enemySpecies(Species.ONIX); + game.override.enemyAbility(Abilities.SHIELD_DUST); + game.override.startingLevel(100); + game.override.moveset(movesToUse); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); - it("Shield Dust", async() => { + it("Shield Dust", async () => { const moveToUse = Moves.AIR_SLASH; await game.startBattle([ Species.PIDGEOT @@ -50,17 +44,11 @@ describe("Abilities - Shield Dust", () => { game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); // Shield Dust negates secondary effect @@ -69,8 +57,8 @@ describe("Abilities - Shield Dust", () => { expect(move.id).toBe(Moves.AIR_SLASH); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); - applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getTarget(),phase.getUserPokemon(),null,null, chance); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); + applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getTarget()!, phase.getUserPokemon()!, null, null, false, chance); expect(chance.value).toBe(0); }, 20000); diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index f35fdd9ed79..9bfec23ddf1 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -1,13 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "#test/utils/gameManager"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-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 { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,10 +26,10 @@ describe("Abilities - SHIELDS DOWN", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELDS_DOWN); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.battleType("single"); + game.override.ability(Abilities.SHIELDS_DOWN); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( @@ -39,14 +37,14 @@ describe("Abilities - SHIELDS DOWN", () => { async () => { const meteorForm = 0, coreForm = 7; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.startingWave(4); + game.override.starterForms({ [Species.MINIOR]: coreForm, }); await game.startBattle([Species.MAGIKARP, Species.MINIOR]); - const minior = game.scene.getParty().find((p) => p.species.speciesId === Species.MINIOR); + const minior = game.scene.getParty().find((p) => p.species.speciesId === Species.MINIOR)!; expect(minior).not.toBe(undefined); expect(minior.formIndex).toBe(coreForm); @@ -54,7 +52,7 @@ describe("Abilities - SHIELDS DOWN", () => { minior.status = new Status(StatusEffect.FAINT); expect(minior.isFainted()).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to(TurnEndPhase); game.doSelectModifier(); 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 new file mode 100644 index 00000000000..7baf7c846f0 --- /dev/null +++ b/src/test/abilities/stall.test.ts @@ -0,0 +1,94 @@ +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; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.disableCrits(); + game.override.enemySpecies(Species.REGIELEKI); + game.override.enemyAbility(Abilities.STALL); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); + game.override.moveset([Moves.QUICK_ATTACK, Moves.TACKLE]); + }); + + /** + * References: + * https://bulbapedia.bulbagarden.net/wiki/Stall_(Ability) + * https://bulbapedia.bulbagarden.net/wiki/Priority + **/ + + it("Pokemon with Stall should move last in its priority bracket regardless of speed", async () => { + await game.startBattle([Species.SHUCKLE]); + + const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); + const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); + + game.move.select(Moves.QUICK_ATTACK); + + 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. + // The opponent Pokemon (with Stall) goes last despite having higher speed than the player Pokemon. + 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 playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); + const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); + + game.move.select(Moves.TACKLE); + + 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. + // The player Pokemon goes second because its move is in a lower priority bracket. + 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 playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); + const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); + + game.move.select(Moves.TACKLE); + + 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 it has a higher speed. + // The player Pokemon (with Stall) goes second because its speed is lower. + expect(speedOrder).toEqual([enemyIndex, playerIndex]); + expect(commandOrder).toEqual([enemyIndex, playerIndex]); + }, 20000); +}); diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index e9c673a102a..7aaa0a42ae3 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -1,21 +1,19 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { allAbilities } from "#app/data/ability"; +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon.js"; -import Move, { allMoves } from "#app/data/move.js"; -import { NumberHolder } from "#app/utils.js"; -import { allAbilities, applyPreAttackAbAttrs, UserFieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; -import { Abilities } from "#app/enums/abilities.js"; +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"; describe("Abilities - Steely Spirit", () => { let phaserGame: Phaser.Game; let game: GameManager; const steelySpiritMultiplier = 1.5; const moveToCheck = Moves.IRON_HEAD; + const ironHeadPower = allMoves[moveToCheck].power; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -29,30 +27,33 @@ describe("Abilities - Steely Spirit", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.battleType("double"); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.moveset([Moves.IRON_HEAD, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); + vi.spyOn(allMoves[moveToCheck], "calculateBattlePower"); }); - it("increases Steel-type moves used by the user and its allies", async () => { - await game.startBattle([Species.MAGIKARP, Species.PERRSERKER]); - const perserrker = game.scene.getPlayerField()[1]; + it("increases Steel-type moves' power used by the user and its allies by 50%", async () => { + await game.classicMode.startBattle([Species.PIKACHU, Species.SHUCKLE]); + const boostSource = game.scene.getPlayerField()[1]; + const enemyToCheck = game.scene.getEnemyPokemon()!; - vi.spyOn(perserrker, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + vi.spyOn(boostSource, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); - expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + game.move.select(moveToCheck, 0, enemyToCheck.getBattlerIndex()); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MoveEffectPhase"); - const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), perserrker, allMoves[moveToCheck]); - - expect(mockedMovePower).toBe(allMoves[moveToCheck].power * steelySpiritMultiplier); + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower * steelySpiritMultiplier); }); it("stacks if multiple users with this ability are on the field.", async () => { - await game.startBattle([Species.PERRSERKER, Species.PERRSERKER]); + await game.classicMode.startBattle([Species.PIKACHU, Species.PIKACHU]); + const enemyToCheck = game.scene.getEnemyPokemon()!; game.scene.getPlayerField().forEach(p => { vi.spyOn(p, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); @@ -60,56 +61,47 @@ describe("Abilities - Steely Spirit", () => { expect(game.scene.getPlayerField().every(p => p.hasAbility(Abilities.STEELY_SPIRIT))).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + game.move.select(moveToCheck, 0, enemyToCheck.getBattlerIndex()); + game.move.select(moveToCheck, 1, enemyToCheck.getBattlerIndex()); + await game.phaseInterceptor.to("MoveEffectPhase"); - const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToCheck]); - - expect(mockedMovePower).toBe(allMoves[moveToCheck].power * Math.pow(steelySpiritMultiplier, 2)); + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower * Math.pow(steelySpiritMultiplier, 2)); }); it("does not take effect when suppressed", async () => { - await game.startBattle([Species.MAGIKARP, Species.PERRSERKER]); - const perserrker = game.scene.getPlayerField()[1]; + await game.classicMode.startBattle([Species.PIKACHU, Species.SHUCKLE]); + const boostSource = game.scene.getPlayerField()[1]; + const enemyToCheck = game.scene.getEnemyPokemon()!; - vi.spyOn(perserrker, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); - expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); + vi.spyOn(boostSource, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); - perserrker.summonData.abilitySuppressed = true; + boostSource.summonData.abilitySuppressed = true; - expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(false); - expect(perserrker.summonData.abilitySuppressed).toBe(true); + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(false); + expect(boostSource.summonData.abilitySuppressed).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + game.move.select(moveToCheck, 0, enemyToCheck.getBattlerIndex()); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MoveEffectPhase"); - const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), perserrker, allMoves[moveToCheck]); + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower); + }); - expect(mockedMovePower).toBe(allMoves[moveToCheck].power); + it("affects variable-type moves if their resolved type is Steel", async () => { + game.override + .ability(Abilities.STEELY_SPIRIT) + .moveset([Moves.REVELATION_DANCE]); + + const revelationDance = allMoves[Moves.REVELATION_DANCE]; + vi.spyOn(revelationDance, "calculateBattlePower"); + + await game.classicMode.startBattle([Species.KLINKLANG]); + + game.move.select(Moves.REVELATION_DANCE); + + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(revelationDance.calculateBattlePower).toHaveReturnedWith(revelationDance.power * 1.5); }); }); - -/** - * Calculates the mocked power of a move. - * Note this does not consider other damage calculations - * except the power multiplier from Steely Spirit. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used by the attacker. - * @returns The adjusted power of the move. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const powerHolder = new NumberHolder(move.power); - - /** - * Check if pokemon has the specified ability and is in effect. - * See Pokemon.hasAbility {@linkcode Pokemon.hasAbility} - */ - if (attacker.hasAbility(Abilities.STEELY_SPIRIT)) { - const alliedField: Pokemon[] = attacker instanceof PlayerPokemon ? attacker.scene.getPlayerField() : attacker.scene.getEnemyField(); - alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, this, move, powerHolder)); - } - - return powerHolder.value; -}; diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index b9d764971f0..dc9f774cc5b 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -1,16 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - DamagePhase, - MoveEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { EnemyPokemon } from "#app/field/pokemon"; +import { DamagePhase } from "#app/phases/damage-phase"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { EnemyPokemon } from "#app/field/pokemon.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -30,22 +26,22 @@ describe("Abilities - Sturdy", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.LUCARIO); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CLOSE_COMBAT, Moves.FISSURE]); + game.override.starterSpecies(Species.LUCARIO); + game.override.startingLevel(100); + game.override.moveset([Moves.CLOSE_COMBAT, Moves.FISSURE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ARON); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STURDY); + game.override.enemySpecies(Species.ARON); + game.override.enemyLevel(5); + game.override.enemyAbility(Abilities.STURDY); }); test( "Sturdy activates when user is at full HP", async () => { await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); + game.move.select(Moves.CLOSE_COMBAT); await game.phaseInterceptor.to(MoveEndPhase); expect(game.scene.getEnemyParty()[0].hp).toBe(1); }, @@ -60,7 +56,7 @@ describe("Abilities - Sturdy", () => { const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; - game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); + game.move.select(Moves.CLOSE_COMBAT); await game.phaseInterceptor.to(DamagePhase); expect(enemyPokemon.hp).toBe(0); @@ -73,11 +69,11 @@ describe("Abilities - Sturdy", () => { "Sturdy pokemon should be immune to OHKO moves", async () => { await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + game.move.select(Moves.FISSURE); await game.phaseInterceptor.to(MoveEndPhase); const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.isFullHp()).toBe(true); }, TIMEOUT ); @@ -85,10 +81,10 @@ describe("Abilities - Sturdy", () => { test( "Sturdy is ignored by pokemon with `Abilities.MOLD_BREAKER`", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOLD_BREAKER); + game.override.ability(Abilities.MOLD_BREAKER); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); + game.move.select(Moves.CLOSE_COMBAT); await game.phaseInterceptor.to(DamagePhase); const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; diff --git a/src/test/abilities/sweet_veil.test.ts b/src/test/abilities/sweet_veil.test.ts new file mode 100644 index 00000000000..5de3c7285a9 --- /dev/null +++ b/src/test/abilities/sweet_veil.test.ts @@ -0,0 +1,92 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { CommandPhase } from "#app/phases/command-phase"; +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 { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Sweet Veil", () => { + 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"); + game.override.moveset([Moves.SPLASH, Moves.REST, Moves.YAWN]); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset([Moves.POWDER, Moves.POWDER, Moves.POWDER, Moves.POWDER]); + }); + + it("prevents the user and its allies from falling asleep", async () => { + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); + + it("causes Rest to fail when used by the user or its allies", async () => { + game.override.enemyMoveset(SPLASH_ONLY); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.REST, 1); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); + + it("causes Yawn to fail if used on the user or its allies", async () => { + game.override.enemyMoveset([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => !!p.getTag(BattlerTagType.DROWSY))).toBe(false); + }); + + it("prevents the user and its allies already drowsy due to Yawn from falling asleep.", async () => { + game.override.enemySpecies(Species.PIKACHU); + game.override.enemyLevel(5); + game.override.startingLevel(5); + game.override.enemyMoveset(SPLASH_ONLY); + + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.YAWN, 1, BattlerIndex.PLAYER); + + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerField().some(p => !!p.getTag(BattlerTagType.DROWSY))).toBe(true); + + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); +}); diff --git a/src/test/abilities/tera_shell.test.ts b/src/test/abilities/tera_shell.test.ts new file mode 100644 index 00000000000..6a6b7bb252b --- /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"; +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/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index c53be8c82a4..ea1996ec66b 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -1,12 +1,10 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { TurnEndPhase } from "#app/phases.js"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -26,12 +24,12 @@ describe("Abilities - Unseen Fist", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.URSHIFU); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.battleType("single"); + game.override.starterSpecies(Species.URSHIFU); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.startingLevel(100); + game.override.enemyLevel(100); }); test( @@ -49,7 +47,7 @@ describe("Abilities - Unseen Fist", () => { test( "ability does not apply if the source has Long Reach", () => { - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LONG_REACH); + game.override.passiveAbility(Abilities.LONG_REACH); testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); }, TIMEOUT ); @@ -68,20 +66,20 @@ describe("Abilities - Unseen Fist", () => { }); async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, protectMove: Moves, shouldSucceed: boolean = true): Promise { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([attackMove]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([protectMove, protectMove, protectMove, protectMove]); + game.override.moveset([attackMove]); + game.override.enemyMoveset([protectMove, protectMove, protectMove, protectMove]); await game.startBattle(); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - const enemyPokemon = game.scene.getEnemyPokemon(); + const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon).not.toBe(undefined); const enemyStartingHp = enemyPokemon.hp; - game.doAttack(getMovePosition(game.scene, 0, attackMove)); + game.move.select(attackMove); await game.phaseInterceptor.to(TurnEndPhase, false); if (shouldSucceed) { diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 86efd1a9d93..7f3e160c7d0 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -1,16 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import { BattleStat } from "#app/data/battle-stat.js"; +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"; 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"; // See also: TypeImmunityAbAttr describe("Abilities - Volt Absorb", () => { @@ -29,28 +25,30 @@ describe("Abilities - Volt Absorb", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); + game.override.disableCrits(); }); it("does not activate when CHARGE is used", async () => { const moveToUse = Moves.CHARGE; const ability = Abilities.VOLT_ABSORB; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.moveset([moveToUse]); + game.override.ability(ability); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemySpecies(Species.DUSKULL); + game.override.enemyAbility(Abilities.BALL_FETCH); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + 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_power.test.ts b/src/test/abilities/wind_power.test.ts index 89957362268..c944e01b43a 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -1,15 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { - TurnEndPhase, -} from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +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 - Wind Power", () => { let phaserGame: Phaser.Game; @@ -27,52 +24,52 @@ describe("Abilities - Wind Power", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.battleType("single"); + game.override.enemySpecies(Species.SHIFTRY); + game.override.enemyAbility(Abilities.WIND_POWER); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("it becomes charged when hit by wind moves", async () => { await game.startBattle([Species.MAGIKARP]); - const shiftry = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getEnemyPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.PETAL_BLIZZARD)); + game.move.select(Moves.PETAL_BLIZZARD); await game.phaseInterceptor.to(TurnEndPhase); expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); }); it("it becomes charged when Tailwind takes effect on its side", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.ability(Abilities.WIND_POWER); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); - const shiftry = game.scene.getPlayerPokemon(); + const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + game.move.select(Moves.TAILWIND); await game.phaseInterceptor.to(TurnEndPhase); expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); }); it("does not become charged when Tailwind takes effect on opposing side", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + game.override.enemySpecies(Species.MAGIKARP); + game.override.ability(Abilities.WIND_POWER); await game.startBattle([Species.SHIFTRY]); - const magikarp = game.scene.getEnemyPokemon(); - const shiftry = game.scene.getPlayerPokemon(); + const magikarp = game.scene.getEnemyPokemon()!; + const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); expect(magikarp.getTag(BattlerTagType.CHARGED)).toBeUndefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + game.move.select(Moves.TAILWIND); await game.phaseInterceptor.to(TurnEndPhase); @@ -81,14 +78,14 @@ describe("Abilities - Wind Power", () => { }); it("does not interact with Sandstorm", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); - const shiftry = game.scene.getPlayerPokemon(); + const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); + game.move.select(Moves.SANDSTORM); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index 2b9361f5839..7a1fee6794a 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -1,15 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { - TurnEndPhase, -} from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/utils/gameManager"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Wind Rider", () => { let phaserGame: Phaser.Game; @@ -27,94 +23,99 @@ describe("Abilities - Wind Rider", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + 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]); - const shiftry = game.scene.getEnemyPokemon(); + 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.doAttack(getMovePosition(game.scene, 0, Moves.PETAL_BLIZZARD)); + game.move.select(Moves.PETAL_BLIZZARD); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(shiftry.hp).equals(shiftry.getMaxHp()); - expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(shiftry.isFullHp()).toBe(true); + expect(shiftry.getStatStage(Stat.ATK)).toBe(1); }); - it("Attack is increased by one stage when Tailwind is present on its side", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + 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]); - const shiftry = game.scene.getPlayerPokemon(); + 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.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + 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 () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(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]); - const magikarp = game.scene.getEnemyPokemon(); - const shiftry = game.scene.getPlayerPokemon(); + 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.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + 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 () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(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]); - const magikarp = game.scene.getEnemyPokemon(); - const shiftry = game.scene.getPlayerPokemon(); + 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.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + 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 () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); - await game.startBattle([Species.SHIFTRY]); - const shiftry = game.scene.getPlayerPokemon(); + await game.classicMode.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon()!; - expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); - expect(shiftry.hp).equals(shiftry.getMaxHp()); + expect(shiftry.getStatStage(Stat.ATK)).toBe(0); + expect(shiftry.isFullHp()).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); + 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/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index 4dc4b1d4282..0c2aedc8ce8 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -1,16 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { allAbilities } from "#app/data/ability"; +import { allMoves } from "#app/data/move"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; -import Move, { allMoves } from "#app/data/move.js"; -import { MoveAbilityBypassAbAttr, WonderSkinAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +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"; describe("Abilities - Wonder Skin", () => { let phaserGame: Phaser.Game; @@ -28,114 +25,52 @@ describe("Abilities - Wonder Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WONDER_SKIN); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.CHARM]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.battleType("single"); + game.override.moveset([Moves.TACKLE, Moves.CHARM]); + game.override.ability(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.WONDER_SKIN); + game.override.enemyMoveset(SPLASH_ONLY); }); it("lowers accuracy of status moves to 50%", async () => { - await game.startBattle([Species.MAGIKARP]); + const moveToCheck = allMoves[Moves.CHARM]; - game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + await game.startBattle([Species.PIKACHU]); + game.move.select(Moves.CHARM); + await game.phaseInterceptor.to(MoveEffectPhase); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).not.toBe(100); - expect(mockedAccuracy).toBe(50); + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(50); }); it("does not lower accuracy of non-status moves", async () => { - await game.startBattle([Species.MAGIKARP]); + const moveToCheck = allMoves[Moves.TACKLE]; - game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.TACKLE]); + await game.startBattle([Species.PIKACHU]); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(MoveEffectPhase); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100); }); - it("does not affect pokemon with Mold Breaker", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOLD_BREAKER); + const bypassAbilities = [Abilities.MOLD_BREAKER, Abilities.TERAVOLT, Abilities.TURBOBLAZE]; - await game.startBattle([Species.MAGIKARP]); + bypassAbilities.forEach(ability => { + it(`does not affect pokemon with ${allAbilities[ability].name}`, async () => { + const moveToCheck = allMoves[Moves.CHARM]; - game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + game.override.ability(ability); + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + await game.startBattle([Species.PIKACHU]); + game.move.select(Moves.CHARM); + await game.phaseInterceptor.to(MoveEffectPhase); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); - }); - - it("does not affect pokemon with Teravolt", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TERAVOLT); - - await game.startBattle([Species.MAGIKARP]); - - game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); - }); - - it("does not affect pokemon with Turboblaze", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TURBOBLAZE); - - await game.startBattle([Species.MAGIKARP]); - - game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100); + }); }); }); - -/** - * Calculates the mocked accuracy of a move. - * Note this does not consider other accuracy calculations - * except the power multiplier from Wonder Skin. - * Bypassed by MoveAbilityBypassAbAttr {@linkcode MoveAbilityBypassAbAttr} - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used by the attacker. - * @returns The adjusted accuracy of the move. - */ -const getMockedMoveAccuracy = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const accuracyHolder = new NumberHolder(move.accuracy); - - /** - * Simulate ignoring ability - * @see MoveAbilityBypassAbAttr - */ - if (attacker.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) { - return accuracyHolder.value; - } - - const wonderSkinInstance = new WonderSkinAbAttr(); - - wonderSkinInstance.applyPreDefend(defender, false, attacker, move, { value: false }, [ accuracyHolder ]); - - return accuracyHolder.value; -}; diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index 4a3caaaa157..fd378647184 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -1,28 +1,23 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as Overrides from "#app/overrides"; -import { - CommandPhase, - DamagePhase, - EnemyCommandPhase, - MessagePhase, - PostSummonPhase, - SwitchPhase, - SwitchSummonPhase, - TurnEndPhase, - TurnInitPhase, - TurnStartPhase, -} from "#app/phases"; +import { Stat } from "#enums/stat"; +import { BattlerIndex } from "#app/battle"; +import { DamagePhase } from "#app/phases/damage-phase"; +import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; +import { MessagePhase } from "#app/phases/message-phase"; +import { PostSummonPhase } from "#app/phases/post-summon-phase"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; +import { SwitchPhase } from "#app/phases/switch-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Mode } from "#app/ui/ui"; -import { Stat } from "#app/data/pokemon-stat"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { Command } from "#app/ui/command-ui-handler"; -import { QuietFormChangePhase } from "#app/form-change-phase"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; 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, test } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect"; const TIMEOUT = 20 * 1000; @@ -43,13 +38,13 @@ describe("Abilities - ZEN MODE", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.battleType("single"); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.ZEN_MODE); + game.override.startingLevel(100); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( @@ -57,19 +52,14 @@ describe("Abilities - ZEN MODE", () => { async () => { const moveToUse = Moves.SPLASH; await game.startBattle([Species.DARMANITAN]); - game.scene.getParty()[0].stats[Stat.SPD] = 1; game.scene.getParty()[0].stats[Stat.HP] = 100; game.scene.getParty()[0].hp = 100; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(DamagePhase, false); + game.move.select(moveToUse); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to(DamagePhase, false); // await game.phaseInterceptor.runFrom(DamagePhase).to(DamagePhase, false); const damagePhase = game.scene.getCurrentPhase() as DamagePhase; damagePhase.updateAmount(40); @@ -85,19 +75,14 @@ describe("Abilities - ZEN MODE", () => { async () => { const moveToUse = Moves.SPLASH; await game.startBattle([Species.DARMANITAN]); - game.scene.getParty()[0].stats[Stat.SPD] = 1; game.scene.getParty()[0].stats[Stat.HP] = 1000; game.scene.getParty()[0].hp = 100; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(QuietFormChangePhase); + game.move.select(moveToUse); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to(QuietFormChangePhase); await game.phaseInterceptor.to(TurnInitPhase, false); expect(game.scene.getParty()[0].hp).not.toBe(100); expect(game.scene.getParty()[0].formIndex).not.toBe(0); @@ -110,19 +95,14 @@ describe("Abilities - ZEN MODE", () => { async () => { const moveToUse = Moves.SPLASH; await game.startBattle([Species.DARMANITAN, Species.CHARIZARD]); - game.scene.getParty()[0].stats[Stat.SPD] = 1; game.scene.getParty()[0].stats[Stat.HP] = 1000; game.scene.getParty()[0].hp = 100; expect(game.scene.getParty()[0].formIndex).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(DamagePhase, false); + game.move.select(moveToUse); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to(DamagePhase, false); // await game.phaseInterceptor.runFrom(DamagePhase).to(DamagePhase, false); const damagePhase = game.scene.getCurrentPhase() as DamagePhase; damagePhase.updateAmount(80); @@ -153,14 +133,14 @@ describe("Abilities - ZEN MODE", () => { async () => { const baseForm = 0, zenForm = 1; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.startingWave(4); + game.override.starterForms({ [Species.DARMANITAN]: zenForm, }); await game.startBattle([Species.MAGIKARP, Species.DARMANITAN]); - const darmanitan = game.scene.getParty().find((p) => p.species.speciesId === Species.DARMANITAN); + const darmanitan = game.scene.getParty().find((p) => p.species.speciesId === Species.DARMANITAN)!; expect(darmanitan).not.toBe(undefined); expect(darmanitan.formIndex).toBe(zenForm); @@ -168,7 +148,7 @@ describe("Abilities - ZEN MODE", () => { darmanitan.status = new Status(StatusEffect.FAINT); expect(darmanitan.isFainted()).toBe(true); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to(TurnEndPhase); game.doSelectModifier(); diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index e0264729125..1a9697f974e 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -1,19 +1,20 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "#test/utils/gameManager"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-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 { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; describe("Abilities - ZERO TO HERO", () => { let phaserGame: Phaser.Game; let game: GameManager; + const baseForm = 0; + const heroForm = 1; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -27,41 +28,83 @@ describe("Abilities - ZERO TO HERO", () => { beforeEach(() => { game = new GameManager(phaserGame); - const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZERO_TO_HERO); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override + .battleType("single") + .moveset(SPLASH_ONLY) + .enemyMoveset(SPLASH_ONLY) + .enemyAbility(Abilities.BALL_FETCH); }); - test( - "check if fainted pokemon switches to base form on arena reset", - async () => { - const baseForm = 0, - heroForm = 1; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ - [Species.PALAFIN]: heroForm, - }); + it("should swap to base form on arena reset", async () => { + game.override.startingWave(4); + game.override.starterForms({ + [Species.PALAFIN]: heroForm, + }); - await game.startBattle([Species.MAGIKARP, Species.PALAFIN]); + await game.startBattle([Species.FEEBAS, Species.PALAFIN, Species.PALAFIN]); - const palafin = game.scene.getParty().find((p) => p.species.speciesId === Species.PALAFIN); - expect(palafin).not.toBe(undefined); - expect(palafin.formIndex).toBe(heroForm); + const palafin1 = game.scene.getParty()[1]; + const palafin2 = game.scene.getParty()[2]; + expect(palafin1.formIndex).toBe(heroForm); + expect(palafin2.formIndex).toBe(heroForm); + palafin2.hp = 0; + palafin2.status = new Status(StatusEffect.FAINT); + expect(palafin2.isFainted()).toBe(true); - palafin.hp = 0; - palafin.status = new Status(StatusEffect.FAINT); - expect(palafin.isFainted()).toBe(true); + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); + await game.phaseInterceptor.to(QuietFormChangePhase); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); + expect(palafin1.formIndex).toBe(baseForm); + expect(palafin2.formIndex).toBe(baseForm); + }, TIMEOUT); - expect(palafin.formIndex).toBe(baseForm); - }, - TIMEOUT - ); + it("should swap to Hero form when switching out during a battle", async () => { + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); + + const palafin = game.scene.getPlayerPokemon()!; + expect(palafin.formIndex).toBe(baseForm); + + game.doSwitchPokemon(1); + await game.phaseInterceptor.to(QuietFormChangePhase); + expect(palafin.formIndex).toBe(heroForm); + }, TIMEOUT); + + it("should not swap to Hero form if switching due to faint", async () => { + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); + + const palafin = game.scene.getPlayerPokemon()!; + expect(palafin.formIndex).toBe(baseForm); + + game.move.select(Moves.SPLASH); + await game.killPokemon(palafin); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + expect(palafin.formIndex).toBe(baseForm); + }, TIMEOUT); + + it("should stay hero form if fainted and then revived", async () => { + game.override.starterForms({ + [Species.PALAFIN]: heroForm, + }); + + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); + + const palafin = game.scene.getPlayerPokemon()!; + expect(palafin.formIndex).toBe(heroForm); + + game.move.select(Moves.SPLASH); + await game.killPokemon(palafin); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.doRevivePokemon(1); + game.doSwitchPokemon(1); + await game.toNextTurn(); + + expect(palafin.formIndex).toBe(heroForm); + }, TIMEOUT); }); diff --git a/src/test/account.spec.ts b/src/test/account.spec.ts index 28e48ce9933..eb6002f3cf2 100644 --- a/src/test/account.spec.ts +++ b/src/test/account.spec.ts @@ -1,4 +1,4 @@ -import * as battleScene from "#app/battle-scene.js"; +import * as battleScene from "#app/battle-scene"; import { describe, expect, it, vi } from "vitest"; import { initLoggedInUser, loggedInUser, updateUserInfo } from "../account"; import * as utils from "../utils"; @@ -8,21 +8,21 @@ describe("account", () => { it("should set loggedInUser to Guest and lastSessionSlot to -1", () => { initLoggedInUser(); - expect(loggedInUser.username).toBe("Guest"); - expect(loggedInUser.lastSessionSlot).toBe(-1); + expect(loggedInUser!.username).toBe("Guest"); + expect(loggedInUser!.lastSessionSlot).toBe(-1); }); }); describe("updateUserInfo", () => { - it("should set loggedInUser to Guest if bypassLogin is true", async () => { + it("should set loggedInUser! to Guest if bypassLogin is true", async () => { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(true); const [success, status] = await updateUserInfo(); expect(success).toBe(true); expect(status).toBe(200); - expect(loggedInUser.username).toBe("Guest"); - expect(loggedInUser.lastSessionSlot).toBe(-1); + expect(loggedInUser!.username).toBe("Guest"); + expect(loggedInUser!.lastSessionSlot).toBe(-1); }); it("should fetch user info from the API if bypassLogin is false", async () => { @@ -43,8 +43,8 @@ describe("account", () => { expect(success).toBe(true); expect(status).toBe(200); - expect(loggedInUser.username).toBe("test"); - expect(loggedInUser.lastSessionSlot).toBe(99); + expect(loggedInUser!.username).toBe("test"); + expect(loggedInUser!.lastSessionSlot).toBe(99); }); it("should handle resolved API errors", async () => { diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index f24529187c6..24d00a3e77b 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -1,15 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import {MoneyAchv, Achv, AchvTier, RibbonAchv, DamageAchv, HealAchv, LevelAchv, ModifierAchv, achvs} from "#app/system/achv"; -import BattleScene from "../../battle-scene"; -import { IntegerHolder, NumberHolder } from "#app/utils.js"; -import { TurnHeldItemTransferModifier } from "#app/modifier/modifier.js"; +import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; +import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; +import { IntegerHolder, NumberHolder } from "#app/utils"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import BattleScene from "../../battle-scene"; describe("check some Achievement related stuff", () => { it ("should check Achievement creation", () => { - const ach = new MoneyAchv("", "Achievement", 1000, null, 100); + const ach = new MoneyAchv("", "Achievement", 1000, null!, 100); expect(ach.name).toBe("Achievement"); }); }); @@ -59,7 +58,7 @@ describe("Achv", () => { }); it("should validate the achievement based on the condition function", () => { - const conditionFunc = jest.fn((scene: BattleScene, args: any[]) => args[0] === 10); + const conditionFunc = vi.fn((scene: BattleScene, args: any[]) => args[0] === 10); const achv = new Achv("", "Test Achievement", "Test Description", "test_icon", 10, conditionFunc); expect(achv.validate(new BattleScene(), [5])).toBe(false); @@ -103,15 +102,13 @@ describe("RibbonAchv", () => { }); beforeEach(() => { - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); game = new GameManager(phaserGame); + game.override.moveset([]); + game.override.startingLevel(0); + game.override.starterSpecies(0); + game.override.enemyMoveset([]); + game.override.enemySpecies(0); + game.override.startingWave(0); scene = game.scene; }); @@ -199,7 +196,7 @@ describe("ModifierAchv", () => { it("should validate the achievement based on the modifier function", () => { const modifierAchv = new ModifierAchv("", "Test Modifier Achievement", "Test Description", "modifier_icon", 10, () => true); const scene = new BattleScene(); - const modifier = new TurnHeldItemTransferModifier(null, 3, 1); + const modifier = new TurnHeldItemTransferModifier(null!, 3, 1); expect(modifierAchv.validate(scene, [modifier])).toBe(true); }); @@ -227,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/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts new file mode 100644 index 00000000000..eda8c687ba1 --- /dev/null +++ b/src/test/arena/arena_gravity.test.ts @@ -0,0 +1,144 @@ +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { 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"; + +describe("Arena - Gravity", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .moveset([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]) + .ability(Abilities.UNNERVE) + .enemyAbility(Abilities.BALL_FETCH) + .enemySpecies(Species.SHUCKLE) + .enemyMoveset(SPLASH_ONLY); + }); + + // Reference: https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) + + it("non-OHKO move accuracy is multiplied by 1.67", async () => { + const moveToCheck = allMoves[Moves.TACKLE]; + + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + // Setup Gravity on first turn + await game.startBattle([Species.PIKACHU]); + game.move.select(Moves.GRAVITY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); + + // Use non-OHKO move on second turn + await game.toNextTurn(); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100 * 1.67); + }); + + it("OHKO move accuracy is not affected", async () => { + game.override.startingLevel(5); + game.override.enemyLevel(5); + + /** See Fissure {@link https://bulbapedia.bulbagarden.net/wiki/Fissure_(move)} */ + const moveToCheck = allMoves[Moves.FISSURE]; + + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + // Setup Gravity on first turn + await game.startBattle([Species.PIKACHU]); + game.move.select(Moves.GRAVITY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); + + // Use OHKO move on second turn + await game.toNextTurn(); + game.move.select(Moves.FISSURE); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(30); + }); + + describe("Against flying types", () => { + it("can be hit by ground-type moves now", async () => { + game.override + .startingLevel(5) + .enemyLevel(5) + .enemySpecies(Species.PIDGEOT) + .moveset([Moves.GRAVITY, Moves.EARTHQUAKE]); + + await game.startBattle([Species.PIKACHU]); + + const pidgeot = game.scene.getEnemyPokemon()!; + vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); + + // Try earthquake on 1st turn (fails!); + game.move.select(Moves.EARTHQUAKE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(pidgeot.getAttackTypeEffectiveness).toHaveReturnedWith(0); + + // Setup Gravity on 2nd turn + await game.toNextTurn(); + game.move.select(Moves.GRAVITY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); + + // Use ground move on 3rd turn + await game.toNextTurn(); + game.move.select(Moves.EARTHQUAKE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(pidgeot.getAttackTypeEffectiveness).toHaveReturnedWith(1); + }); + + it("keeps super-effective moves super-effective after using gravity", async () => { + game.override + .startingLevel(5) + .enemyLevel(5) + .enemySpecies(Species.PIDGEOT) + .moveset([Moves.GRAVITY, Moves.THUNDERBOLT]); + + await game.startBattle([Species.PIKACHU]); + + const pidgeot = game.scene.getEnemyPokemon()!; + vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); + + // Setup Gravity on 1st turn + game.move.select(Moves.GRAVITY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); + + // Use electric move on 2nd turn + await game.toNextTurn(); + game.move.select(Moves.THUNDERBOLT); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(pidgeot.getAttackTypeEffectiveness).toHaveReturnedWith(2); + }); + }); +}); diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts new file mode 100644 index 00000000000..b36b0de2e06 --- /dev/null +++ b/src/test/arena/weather_fog.test.ts @@ -0,0 +1,48 @@ +import { allMoves } from "#app/data/move"; +import { WeatherType } from "#app/data/weather"; +import { Abilities } from "#app/enums/abilities"; +import { MoveEffectPhase } from "#app/phases/move-effect-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, vi } from "vitest"; + +describe("Weather - Fog", () => { + 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 + .weather(WeatherType.FOG) + .battleType("single"); + game.override.moveset([Moves.TACKLE]); + game.override.ability(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); + }); + + it("move accuracy is multiplied by 90%", async () => { + const moveToCheck = allMoves[Moves.TACKLE]; + + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + await game.startBattle([Species.MAGIKARP]); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100 * 0.9); + }); +}); diff --git a/src/test/arena/weather_hail.test.ts b/src/test/arena/weather_hail.test.ts new file mode 100644 index 00000000000..75125b3448c --- /dev/null +++ b/src/test/arena/weather_hail.test.ts @@ -0,0 +1,62 @@ +import { WeatherType } from "#app/data/weather"; +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"; + +describe("Weather - Hail", () => { + 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 + .weather(WeatherType.HAIL) + .battleType("single") + .moveset(SPLASH_ONLY) + .enemyMoveset(SPLASH_ONLY) + .enemySpecies(Species.MAGIKARP); + }); + + it("inflicts damage equal to 1/16 of Pokemon's max HP at turn end", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("TurnEndPhase"); + + game.scene.getField(true).forEach(pokemon => { + expect(pokemon.hp).toBeLessThan(pokemon.getMaxHp() - Math.floor(pokemon.getMaxHp() / 16)); + }); + }); + + it("does not inflict damage to a Pokemon that is underwater (Dive) or underground (Dig)", async () => { + game.override.moveset([Moves.DIG]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.DIG); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("TurnEndPhase"); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp() - Math.floor(enemyPokemon.getMaxHp() / 16)); + }); +}); diff --git a/src/test/arena/weather_sandstorm.test.ts b/src/test/arena/weather_sandstorm.test.ts new file mode 100644 index 00000000000..978774ba4c1 --- /dev/null +++ b/src/test/arena/weather_sandstorm.test.ts @@ -0,0 +1,59 @@ +import { WeatherType } from "#app/data/weather"; +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("Weather - Sandstorm", () => { + 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 + .weather(WeatherType.SANDSTORM) + .battleType("single") + .moveset(SPLASH_ONLY) + .enemyMoveset(SPLASH_ONLY) + .enemySpecies(Species.MAGIKARP); + }); + + it("inflicts damage equal to 1/16 of Pokemon's max HP at turn end", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("TurnEndPhase"); + + game.scene.getField(true).forEach(pokemon => { + expect(pokemon.hp).toBeLessThan(pokemon.getMaxHp() - Math.floor(pokemon.getMaxHp() / 16)); + }); + }); + + it("does not inflict damage to a Pokemon that is underwater (Dive) or underground (Dig)", async () => { + game.override.moveset([Moves.DIVE]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.DIVE); + + await game.phaseInterceptor.to("TurnEndPhase"); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp() - Math.floor(enemyPokemon.getMaxHp() / 16)); + }); +}); diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts new file mode 100644 index 00000000000..8b2d3e2547e --- /dev/null +++ b/src/test/arena/weather_strong_winds.test.ts @@ -0,0 +1,78 @@ +import { allMoves } from "#app/data/move"; +import { TurnStartPhase } from "#app/phases/turn-start-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"; + +describe("Weather - Strong Winds", () => { + 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.startingLevel(10); + game.override.enemySpecies(Species.TAILLOW); + game.override.enemyAbility(Abilities.DELTA_STREAM); + game.override.moveset([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); + }); + + it("electric type move is not very effective on Rayquaza", async () => { + game.override.enemySpecies(Species.RAYQUAZA); + + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDERBOLT); + + await game.phaseInterceptor.to(TurnStartPhase); + expect(enemy.getAttackTypeEffectiveness(allMoves[Moves.THUNDERBOLT].type, pikachu)).toBe(0.5); + }); + + it("electric type move is neutral for flying type pokemon", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDERBOLT); + + await game.phaseInterceptor.to(TurnStartPhase); + expect(enemy.getAttackTypeEffectiveness(allMoves[Moves.THUNDERBOLT].type, pikachu)).toBe(1); + }); + + it("ice type move is neutral for flying type pokemon", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ICE_BEAM); + + await game.phaseInterceptor.to(TurnStartPhase); + expect(enemy.getAttackTypeEffectiveness(allMoves[Moves.ICE_BEAM].type, pikachu)).toBe(1); + }); + + it("rock type move is neutral for flying type pokemon", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ROCK_SLIDE); + + await game.phaseInterceptor.to(TurnStartPhase); + expect(enemy.getAttackTypeEffectiveness(allMoves[Moves.ROCK_SLIDE].type, pikachu)).toBe(1); + }); +}); diff --git a/src/test/battle-scene.test.ts b/src/test/battle-scene.test.ts new file mode 100644 index 00000000000..4da75cea197 --- /dev/null +++ b/src/test/battle-scene.test.ts @@ -0,0 +1,35 @@ +import { LoadingScene } from "#app/loading-scene"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import GameManager from "./utils/gameManager"; + +describe("BattleScene", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("should remove LoadingScene on create", () => { + // `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/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 5d8f9d2c98f..e19168962dc 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -1,21 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, EnemyCommandPhase, SelectTargetPhase, - TurnStartPhase -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {Stat} from "#app/data/pokemon-stat"; -import TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; +import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; +import { SelectTargetPhase } from "#app/phases/select-target-phase"; +import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import {Button} from "#enums/buttons"; - +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Battle order", () => { let phaserGame: Phaser.Game; @@ -33,180 +24,134 @@ describe("Battle order", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.battleType("single"); + game.override.enemySpecies(Species.MEWTWO); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.ability(Abilities.INSOMNIA); + game.override.moveset([Moves.TACKLE]); }); - it("opponent faster than player 50 vs 150", async() => { + it("opponent faster than player 50 vs 150", async () => { await game.startBattle([ Species.BULBASAUR, ]); - game.scene.getParty()[0].stats[Stat.SPD] = 50; - game.scene.currentBattle.enemyParty[0].stats[Stat.SPD] = 150; - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + 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() => { + 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; - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + 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() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("double - both opponents faster than player 50/50 vs 150/150", async () => { + game.override.battleType("double"); await game.startBattle([ 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; - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - game.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { - const handler = game.scene.ui.getHandler() as TargetSelectUiHandler; - handler.processInput(Button.ACTION); - }); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - game.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { - const handler = game.scene.ui.getHandler() as TargetSelectUiHandler; - handler.processInput(Button.ACTION); - }); + 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() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("double - speed tie except 1 - 100/100 vs 100/150", async () => { + game.override.battleType("double"); await game.startBattle([ 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; - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - game.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { - const handler = game.scene.ui.getHandler() as TargetSelectUiHandler; - handler.processInput(Button.ACTION); - }); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - game.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { - const handler = game.scene.ui.getHandler() as TargetSelectUiHandler; - handler.processInput(Button.ACTION); - }); + 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() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("double - speed tie 100/150 vs 100/150", async () => { + game.override.battleType("double"); await game.startBattle([ 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; - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - game.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { - const handler = game.scene.ui.getHandler() as TargetSelectUiHandler; - handler.processInput(Button.ACTION); - }); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - game.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { - const handler = game.scene.ui.getHandler() as TargetSelectUiHandler; - handler.processInput(Button.ACTION); - }); + 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 87949be70a8..25dfbc765bd 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -1,29 +1,31 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import {generateStarter, getMovePosition,} from "#app/test/utils/gameManagerUtils"; -import {Mode} from "#app/ui/ui"; -import {GameModes} from "#app/game-mode"; -import * as overrides from "../../overrides"; -import {Command} from "#app/ui/command-ui-handler"; -import { - CommandPhase, DamagePhase, - EncounterPhase, - EnemyCommandPhase, - LoginPhase, - SelectGenderPhase, - SelectModifierPhase, - SelectStarterPhase, - SummonPhase, - TitlePhase, - TurnInitPhase, VictoryPhase, -} from "#app/phases"; +import { allSpecies } from "#app/data/pokemon-species"; +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"; +import { DamagePhase } from "#app/phases/damage-phase"; +import { EncounterPhase } from "#app/phases/encounter-phase"; +import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; +import { LoginPhase } from "#app/phases/login-phase"; +import { NextEncounterPhase } from "#app/phases/next-encounter-phase"; +import { SelectGenderPhase } from "#app/phases/select-gender-phase"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { SelectStarterPhase } from "#app/phases/select-starter-phase"; +import { SummonPhase } from "#app/phases/summon-phase"; +import { SwitchPhase } from "#app/phases/switch-phase"; +import { TitlePhase } from "#app/phases/title-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +import { VictoryPhase } from "#app/phases/victory-phase"; import GameManager from "#app/test/utils/gameManager"; -import Phaser from "phaser"; -import {allSpecies} from "#app/data/pokemon-species"; -import { getGameMode } from "#app/game-mode.js"; +import { generateStarter } from "#app/test/utils/gameManagerUtils"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; 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("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -41,9 +43,10 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); + game.scene.gameData.gender = undefined!; // just for these tests! }); - it("test phase interceptor with prompt", async() => { + it("test phase interceptor with prompt", async () => { await game.phaseInterceptor.run(LoginPhase); game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { @@ -61,7 +64,7 @@ describe("Test Battle Phase", () => { expect(game.scene.gameData.gender).toBe(PlayerGender.MALE); }, 20000); - it("test phase interceptor with prompt with preparation for a future prompt", async() => { + it("test phase interceptor with prompt with preparation for a future prompt", async () => { await game.phaseInterceptor.run(LoginPhase); game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { @@ -83,53 +86,42 @@ describe("Test Battle Phase", () => { expect(game.scene.gameData.gender).toBe(PlayerGender.MALE); }, 20000); - it("newGame one-liner", async() => { + it("newGame one-liner", async () => { await game.startBattle(); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("do attack wave 3 - single battle - regular - OHKO", async() => { - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("do attack wave 3 - single battle - regular - OHKO", async () => { + game.override.starterSpecies(Species.MEWTWO); + game.override.enemySpecies(Species.RATTATA); + game.override.startingLevel(2000); + game.override + .startingWave(3) + .battleType("single"); + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(SelectModifierPhase, false); }, 20000); - it("do attack wave 3 - single battle - regular - NO OHKO with opponent using non damage attack", async() => { - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("do attack wave 3 - single battle - regular - NO OHKO with opponent using non damage attack", async () => { + game.override.starterSpecies(Species.MEWTWO); + game.override.enemySpecies(Species.RATTATA); + game.override.startingLevel(5); + game.override.startingWave(3); + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.enemyMoveset([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); + game.override.battleType("single"); await game.startBattle(); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(Moves.TACKLE); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnInitPhase, false); }, 20000); - it("load 100% data file", async() => { + it("load 100% data file", 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]; @@ -138,7 +130,7 @@ describe("Test Battle Phase", () => { expect(caughtCount).toBe(Object.keys(allSpecies).length); }, 20000); - it("start battle with selected team", async() => { + it("start battle with selected team", async () => { await game.startBattle([ Species.CHARIZARD, Species.CHANSEY, @@ -149,26 +141,26 @@ describe("Test Battle Phase", () => { expect(game.scene.getParty()[2].species.speciesId).toBe(Species.MEW); }, 20000); - it("test remove random battle seed int", async() => { - for (let i=0; i<10; i++) { - const rand = game.scene.randBattleSeedInt(15); - expect(rand).toBe(14); + it("test remove random battle seed int", async () => { + for (let i = 0; i < 10; i++) { + const rand = game.scene.randBattleSeedInt(16); + expect(rand).toBe(15); } }); - it("wrong phase", async() => { + it("wrong phase", async () => { await game.phaseInterceptor.run(LoginPhase); await game.phaseInterceptor.run(LoginPhase).catch((e) => { expect(e).toBe("Wrong phase: this is SelectGenderPhase and not LoginPhase"); }); }, 20000); - it("wrong phase but skip", async() => { + it("wrong phase but skip", async () => { await game.phaseInterceptor.run(LoginPhase); await game.phaseInterceptor.run(LoginPhase, () => game.isCurrentPhase(SelectGenderPhase)); }, 20000); - it("good run", async() => { + it("good run", async () => { await game.phaseInterceptor.run(LoginPhase); game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { game.scene.gameData.gender = PlayerGender.MALE; @@ -178,7 +170,7 @@ describe("Test Battle Phase", () => { await game.phaseInterceptor.run(TitlePhase); }, 20000); - it("good run from select gender to title", async() => { + it("good run from select gender to title", async () => { await game.phaseInterceptor.run(LoginPhase); game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { game.scene.gameData.gender = PlayerGender.MALE; @@ -187,7 +179,7 @@ describe("Test Battle Phase", () => { await game.phaseInterceptor.runFrom(SelectGenderPhase).to(TitlePhase); }, 20000); - it("good run to SummonPhase phase", async() => { + it("good run to SummonPhase phase", async () => { await game.phaseInterceptor.run(LoginPhase); game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { game.scene.gameData.gender = PlayerGender.MALE; @@ -203,51 +195,51 @@ describe("Test Battle Phase", () => { await game.phaseInterceptor.runFrom(SelectGenderPhase).to(SummonPhase); }, 20000); - it("2vs1", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + it("2vs1", async () => { + game.override.battleType("single"); + game.override.enemySpecies(Species.MIGHTYENA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("1vs1", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + it("1vs1", async () => { + game.override.battleType("single"); + game.override.enemySpecies(Species.MIGHTYENA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("2vs2", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + it("2vs2", async () => { + game.override.battleType("double"); + game.override.enemySpecies(Species.MIGHTYENA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); + game.override.startingWave(3); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("4vs2", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + it("4vs2", async () => { + game.override.battleType("double"); + game.override.enemySpecies(Species.MIGHTYENA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); + game.override.startingWave(3); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -255,73 +247,93 @@ describe("Test Battle Phase", () => { Species.GABITE, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("kill opponent pokemon", async() => { + it("kill opponent pokemon", async () => { const moveToUse = Moves.SPLASH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.starterSpecies(Species.MEWTWO); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.ZEN_MODE); + game.override.startingLevel(2000); + game.override.startingWave(3); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle([ Species.DARMANITAN, Species.CHARIZARD, ]); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); await game.phaseInterceptor.to(DamagePhase, false); await game.killPokemon(game.scene.currentBattle.enemyParty[0]); expect(game.scene.currentBattle.enemyParty[0].isFainted()).toBe(true); await game.phaseInterceptor.to(VictoryPhase, false); }, 200000); - it("to next turn", async() => { + it("to next turn", async () => { const moveToUse = Moves.SPLASH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.starterSpecies(Species.MEWTWO); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.ZEN_MODE); + game.override.startingLevel(2000); + game.override.startingWave(3); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); const turn = game.scene.currentBattle.turn; - game.doAttack(0); + game.move.select(moveToUse); await game.toNextTurn(); expect(game.scene.currentBattle.turn).toBeGreaterThan(turn); }, 20000); - it("to next wave with pokemon killed, single", async() => { + it("to next wave with pokemon killed, single", async () => { const moveToUse = Moves.SPLASH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.starterSpecies(Species.MEWTWO); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.ZEN_MODE); + game.override.startingLevel(2000); + game.override.startingWave(3); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); const waveIndex = game.scene.currentBattle.waveIndex; - game.doAttack(0); + game.move.select(moveToUse); await game.doKillOpponents(); await game.toNextWave(); expect(game.scene.currentBattle.waveIndex).toBeGreaterThan(waveIndex); }, 20000); + + it("does not force switch if active pokemon faints at same time as enemy mon and is revived in post-battle", async () => { + const moveToUse = Moves.TAKE_DOWN; + game.override + .battleType("single") + .starterSpecies(Species.SAWK) + .enemySpecies(Species.RATTATA) + .startingWave(1) + .startingLevel(100) + .moveset([moveToUse]) + .enemyMoveset(SPLASH_ONLY) + .startingHeldItems([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]); + + await game.startBattle(); + game.scene.getPlayerPokemon()!.hp = 1; + game.move.select(moveToUse); + + await game.phaseInterceptor.to(BattleEndPhase); + game.doRevivePokemon(0); // pretend max revive was picked + game.doSelectModifier(); + + game.onNextPrompt("SwitchPhase", Mode.PARTY, () => { + expect.fail("Switch was forced"); + }, () => game.isCurrentPhase(NextEncounterPhase)); + await game.phaseInterceptor.to(SwitchPhase); + }, 20000); }); diff --git a/src/test/battle/damage_calculation.test.ts b/src/test/battle/damage_calculation.test.ts new file mode 100644 index 00000000000..9c7c9dc9d3e --- /dev/null +++ b/src/test/battle/damage_calculation.test.ts @@ -0,0 +1,70 @@ +import { DamagePhase } from "#app/phases/damage-phase"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-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("Round Down and Minimun 1 test in Damage Calculation", () => { + 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.startingLevel(10); + }); + + it("When the user fails to use Jump Kick with Wonder Guard ability, the damage should be 1.", async () => { + game.override.enemySpecies(Species.GASTLY); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.starterSpecies(Species.SHEDINJA); + game.override.moveset([Moves.JUMP_KICK]); + game.override.ability(Abilities.WONDER_GUARD); + + await game.startBattle(); + + const shedinja = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.JUMP_KICK); + + await game.phaseInterceptor.to(DamagePhase); + + expect(shedinja.hp).toBe(shedinja.getMaxHp() - 1); + }); + + + it("Charizard with odd HP survives Stealth Rock damage twice", async () => { + game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0); + game.override.seed("Charizard Stealth Rock test"); + game.override.enemySpecies(Species.CHARIZARD); + game.override.enemyAbility(Abilities.BLAZE); + game.override.starterSpecies(Species.PIKACHU); + game.override.enemyLevel(100); + + await game.startBattle(); + + const charizard = game.scene.getEnemyPokemon()!; + + const maxHp = charizard.getMaxHp(); + const damage_prediction = toDmgValue(charizard.getMaxHp() / 2); + const currentHp = charizard.hp; + const expectedHP = maxHp - damage_prediction; + + expect(currentHp).toBe(expectedHP); + }); +}); diff --git a/src/test/battle/double_battle.test.ts b/src/test/battle/double_battle.test.ts new file mode 100644 index 00000000000..d264a29ef9b --- /dev/null +++ b/src/test/battle/double_battle.test.ts @@ -0,0 +1,59 @@ +import { Status, StatusEffect } from "#app/data/status-effect"; +import { BattleEndPhase } from "#app/phases/battle-end-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +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("Double Battles", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + // double-battle player's pokemon both fainted in same round, then revive one, and next double battle summons two player's pokemon successfully. + // (There were bugs that either only summon one when can summon two, player stuck in switchPhase etc) + it("3v2 edge case: player summons 2 pokemon on the next battle after being fainted and revived", async () => { + game.override.battleType("double").enemyMoveset(SPLASH_ONLY).moveset(SPLASH_ONLY); + await game.startBattle([ + Species.BULBASAUR, + Species.CHARIZARD, + Species.SQUIRTLE, + ]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + + for (const pokemon of game.scene.getPlayerField()) { + pokemon.hp = 0; + pokemon.status = new Status(StatusEffect.FAINT); + expect(pokemon.isFainted()).toBe(true); + } + + await game.doKillOpponents(); + + await game.phaseInterceptor.to(BattleEndPhase); + game.doSelectModifier(); + + const charizard = game.scene.getParty().findIndex(p => p.species.speciesId === Species.CHARIZARD); + game.doRevivePokemon(charizard); + + await game.phaseInterceptor.to(TurnInitPhase); + expect(game.scene.getPlayerField().filter(p => !p.isFainted())).toHaveLength(2); + }, 20000); +}); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index d46d8bcf7e8..da5cc4d1969 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -1,14 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import GameManager from "#app/test/utils/gameManager"; -import Phaser from "phaser"; -import * as overrides from "#app/overrides"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -describe("Test Battle Phase", () => { +describe("Error Handling", () => { let phaserGame: Phaser.Game; let game: GameManager; + const moveToUse = Moves.SPLASH; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -22,22 +22,22 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); - const moveToUse = Moves.SPLASH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override + .battleType("single") + .startingWave(3); + game.override.starterSpecies(Species.MEWTWO); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.ZEN_MODE); + game.override.startingLevel(2000); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); - it.skip("to next turn", async() => { + it.skip("to next turn", async () => { await game.startBattle(); const turn = game.scene.currentBattle.turn; - game.doAttack(0); + game.move.select(moveToUse); await game.toNextTurn(); expect(game.scene.currentBattle.turn).toBeGreaterThan(turn); }, 20000); diff --git a/src/test/battle/inverse_battle.test.ts b/src/test/battle/inverse_battle.test.ts new file mode 100644 index 00000000000..2a561a09e5e --- /dev/null +++ b/src/test/battle/inverse_battle.test.ts @@ -0,0 +1,284 @@ +import { BattlerIndex } from "#app/battle"; +import { Type } from "#app/data/type"; +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 { SPLASH_ONLY } from "#test/utils/testUtils"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } 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) + .enemyMoveset(SPLASH_ONLY); + }); + + it("Immune types are 2x effective - Thunderbolt against Ground Type", async () => { + game.override + .moveset([Moves.THUNDERBOLT]) + .enemySpecies(Species.SANDSHREW); + + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.THUNDERBOLT); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); + }, TIMEOUT); + + it("2x effective types are 0.5x effective - Thunderbolt against Flying Type", async () => { + game.override + .moveset([Moves.THUNDERBOLT]) + .enemySpecies(Species.PIDGEY); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.THUNDERBOLT); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.5); + }, TIMEOUT); + + it("0.5x effective types are 2x effective - Thunderbolt against Electric Type", async () => { + game.override + .moveset([Moves.THUNDERBOLT]) + .enemySpecies(Species.CHIKORITA); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.THUNDERBOLT); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); + }, TIMEOUT); + + it("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("Freeze Dry is 2x effective against Water Type like other Ice type Move - Freeze Dry against Squirtle", async () => { + game.override + .moveset([Moves.FREEZE_DRY]) + .enemySpecies(Species.SQUIRTLE); + + await game.challengeMode.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).toHaveLastReturnedWith(2); + }, TIMEOUT); + + it("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("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("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("Ground type is not immune to Thunder Wave - Thunder Wave against Sandshrew", async () => { + game.override + .moveset([Moves.THUNDER_WAVE]) + .enemySpecies(Species.SANDSHREW); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(enemy.status?.effect).toBe(StatusEffect.PARALYSIS); + }, TIMEOUT); + + + it("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("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("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 enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FLYING_PRESS); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.25); + }, TIMEOUT); + + it("Scrappy ability has no effect - Tackle against Ghost Type still 2x effective with Scrappy", async () => { + game.override + .moveset([Moves.TACKLE]) + .ability(Abilities.SCRAPPY) + .enemySpecies(Species.GASTLY); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); + }, TIMEOUT); + + it("FORESIGHT has no effect - Tackle against Ghost Type still 2x effective with Foresight", async () => { + game.override + .moveset([Moves.FORESIGHT, Moves.TACKLE]) + .enemySpecies(Species.GASTLY); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FORESIGHT); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("TurnEndPhase"); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); + }, TIMEOUT); +}); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 01ae7d05359..1d319bea372 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -1,14 +1,11 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import {Mode} from "#app/ui/ui"; -import * as overrides from "../../overrides"; -import { - CommandPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import Phaser from "phaser"; +import { CommandPhase } from "#app/phases/command-phase"; +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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -26,104 +23,113 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemySpecies(Species.RATTATA); + game.override.startingLevel(2000); + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); it("startBattle 2vs1 boss", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + game.override + .battleType("single") + .startingWave(10); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); it("startBattle 2vs2 boss", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + game.override + .battleType("double") + .startingWave(10); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); it("startBattle 2vs2 trainer", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override + .battleType("double") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); it("startBattle 2vs1 trainer", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override + .battleType("single") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); it("startBattle 2vs1 rival", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); + game.override + .battleType("single") + .startingWave(8); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); it("startBattle 2vs2 rival", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); + game.override + .battleType("double") + .startingWave(8); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); it("startBattle 1vs1 trainer", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override + .battleType("single") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); it("startBattle 2vs2 trainer", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override + .battleType("double") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); it("startBattle 4vs2 trainer", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override + .battleType("double") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -131,7 +137,7 @@ describe("Test Battle Phase", () => { Species.GABITE, ]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); - expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); }); diff --git a/src/test/battlerTags/octolock.test.ts b/src/test/battlerTags/octolock.test.ts new file mode 100644 index 00000000000..7b1f9264370 --- /dev/null +++ b/src/test/battlerTags/octolock.test.ts @@ -0,0 +1,62 @@ +import BattleScene from "#app/battle-scene"; +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 StatStageChangePhase with expected stat stage changes", { timeout: 10000 }, async () => { + const mockPokemon = { + scene: new BattleScene(), + getBattlerIndex: () => 0, + } as Pokemon; + + const subject = new OctolockTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + 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); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + }); + + it ("traps its target (extends TrappedTag)", { timeout: 2000 }, async () => { + expect(new OctolockTag(1)).toBeInstanceOf(TrappedTag); + }); + + it("can be added to pokemon who are not octolocked", { timeout: 2000 }, async => { + const mockPokemon = { + getTag: vi.fn().mockReturnValue(undefined) as Pokemon["getTag"], + } as Pokemon; + + const subject = new OctolockTag(1); + + expect(subject.canAdd(mockPokemon)).toBeTruthy(); + + expect(mockPokemon.getTag).toHaveBeenCalledTimes(1); + expect(mockPokemon.getTag).toHaveBeenCalledWith(BattlerTagType.OCTOLOCK); + }); + + it("cannot be added to pokemon who are octolocked", { timeout: 2000 }, async => { + const mockPokemon = { + getTag: vi.fn().mockReturnValue(new BattlerTag(null!, null!, null!, null!)) as Pokemon["getTag"], + } as Pokemon; + + const subject = new OctolockTag(1); + + expect(subject.canAdd(mockPokemon)).toBeFalsy(); + + expect(mockPokemon.getTag).toHaveBeenCalledTimes(1); + expect(mockPokemon.getTag).toHaveBeenCalledWith(BattlerTagType.OCTOLOCK); + }); +}); diff --git a/src/test/battlerTags/stockpiling.test.ts b/src/test/battlerTags/stockpiling.test.ts new file mode 100644 index 00000000000..e568016dfef --- /dev/null +++ b/src/test/battlerTags/stockpiling.test.ts @@ -0,0 +1,161 @@ +import BattleScene from "#app/battle-scene"; +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(() => ""); +}); + +describe("BattlerTag - StockpilingTag", () => { + describe("onAdd", () => { + 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, + } as Pokemon; + + vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + + const subject = new StockpilingTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + 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 StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.DEF, Stat.SPDEF], [1, 1]); + }); + + subject.onAdd(mockPokemon); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + + it("unshifts a StatStageChangePhase with expected stat changes on add (one stat maxed)", { timeout: 10000 }, async () => { + const mockPokemon = { + scene: new BattleScene(), + summonData: new PokemonSummonData(), + getBattlerIndex: () => 0, + } as Pokemon; + + vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + + 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(StatStageChangePhase); + expect((phase as StatStageChangePhase)["stages"]).toEqual(1); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); + + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [1, 1]); + }); + + subject.onAdd(mockPokemon); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + }); + + describe("onOverlap", () => { + it("unshifts a StatStageChangePhase with expected stat changes on overlap", { timeout: 10000 }, async () => { + const mockPokemon = { + scene: new BattleScene(), + getBattlerIndex: () => 0, + } as Pokemon; + + vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + + const subject = new StockpilingTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + 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 StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [1, 1]); + }); + + subject.onOverlap(mockPokemon); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + }); + + describe("stack limit, stat tracking, and removal", () => { + it("can be added up to three times, even when one stat does not change", { timeout: 10000 }, async () => { + const mockPokemon = { + scene: new BattleScene(), + summonData: new PokemonSummonData(), + getBattlerIndex: () => 0, + } as Pokemon; + + vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + + 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(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 StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.SPDEF ], [1]); + }); + + subject.onAdd(mockPokemon); + expect(subject.stockpiledCount).toBe(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + 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 StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.SPDEF ], [1]); + }); + + subject.onOverlap(mockPokemon); + expect(subject.stockpiledCount).toBe(2); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + 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 + }); + + subject.onOverlap(mockPokemon); + expect(subject.stockpiledCount).toBe(3); + + 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({ [ Stat.DEF ]: 0, [Stat.SPDEF]: 2 }); + + // removing tag should reverse stat changes + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatStageChangePhase); + expect((phase as StatStageChangePhase)["stages"]).toEqual(-2); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.SPDEF])); + }); + + subject.onRemove(mockPokemon); + expect(mockPokemon.scene.unshiftPhase).toHaveBeenCalledOnce(); // note that re-spying each add/overlap has been refreshing call count + }); + }); +}); 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/daily_mode.test.ts b/src/test/daily_mode.test.ts new file mode 100644 index 00000000000..5cc61a62874 --- /dev/null +++ b/src/test/daily_mode.test.ts @@ -0,0 +1,32 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "./utils/gameManager"; + +describe("Daily Mode", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("should initialize properly", async () => { + await game.dailyMode.runToSummon(); + + const party = game.scene.getParty(); + expect(party).toHaveLength(3); + party.forEach(pkm => { + expect(pkm.level).toBe(20); + expect(pkm.moveset.length).toBeGreaterThan(0); + }); + }); +}); diff --git a/src/test/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index a098620f5eb..4f00e843b47 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -1,23 +1,24 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import BattleScene from "../../battle-scene"; -import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg.js"; +import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg"; +import { EggSourceType } from "#app/enums/egg-source-types"; +import { EggTier } from "#app/enums/egg-type"; +import { VariantTier } from "#app/enums/variant-tiers"; +import EggData from "#app/system/egg-data"; +import * as Utils from "#app/utils"; import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { EggSourceType } from "#app/enums/egg-source-types.js"; -import { EggTier } from "#app/enums/egg-type.js"; -import { VariantTier } from "#app/enums/variant-tiers.js"; -import GameManager from "../utils/gameManager"; -import EggData from "#app/system/egg-data.js"; -import * as Utils from "#app/utils.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Egg Generation Tests", () => { let phaserGame: Phaser.Game; let game: GameManager; + const EGG_HATCH_COUNT: integer = 1000; beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, }); + game = new GameManager(phaserGame); }); afterEach(() => { @@ -25,13 +26,12 @@ describe("Egg Generation Tests", () => { vi.restoreAllMocks(); }); - beforeEach(async() => { - game = new GameManager(phaserGame); + beforeEach(async () => { await game.importData("src/test/utils/saves/everything.prsv"); }); it("should return Arceus for the 10th of June", () => { - const scene = new BattleScene(); + const scene = game.scene; const timestamp = new Date(2024, 5, 10, 15, 0, 0, 0).getTime(); const expectedSpecies = Species.ARCEUS; @@ -40,7 +40,7 @@ describe("Egg Generation Tests", () => { expect(result).toBe(expectedSpecies); }); it("should return Arceus for the 10th of July", () => { - const scene = new BattleScene(); + const scene = game.scene; const timestamp = new Date(2024, 6, 10, 15, 0, 0, 0).getTime(); const expectedSpecies = Species.ARCEUS; @@ -48,20 +48,27 @@ 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; const expectedSpecies = Species.ARCEUS; - const result = new Egg({scene,species: expectedSpecies}).generatePlayerPokemon(scene).species.speciesId; + const result = new Egg({ scene, species: expectedSpecies }).generatePlayerPokemon(scene).species.speciesId; expect(result).toBe(expectedSpecies); }); @@ -69,7 +76,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedTier = EggTier.COMMON; - const result = new Egg({scene, tier: expectedTier}).tier; + const result = new Egg({ scene, tier: expectedTier }).tier; expect(result).toBe(expectedTier); }); @@ -77,7 +84,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedTier = EggTier.GREAT; - const result = new Egg({scene, tier: expectedTier}).tier; + const result = new Egg({ scene, tier: expectedTier }).tier; expect(result).toBe(expectedTier); }); @@ -85,7 +92,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedTier = EggTier.ULTRA; - const result = new Egg({scene, tier: expectedTier}).tier; + const result = new Egg({ scene, tier: expectedTier }).tier; expect(result).toBe(expectedTier); }); @@ -93,7 +100,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedTier = EggTier.MASTER; - const result = new Egg({scene, tier: expectedTier}).tier; + const result = new Egg({ scene, tier: expectedTier }).tier; expect(result).toBe(expectedTier); }); @@ -101,7 +108,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedResult = true; - const result = new Egg({scene, species: Species.MANAPHY}).isManaphyEgg(); + const result = new Egg({ scene, species: Species.MANAPHY }).isManaphyEgg(); expect(result).toBe(expectedResult); }); @@ -109,7 +116,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedResult = true; - const result = new Egg({scene, tier: EggTier.COMMON, id: 204}).isManaphyEgg(); + const result = new Egg({ scene, tier: EggTier.COMMON, id: 204 }).isManaphyEgg(); expect(result).toBe(expectedResult); }); @@ -117,7 +124,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedHatchWaves = 1000; - const result = new Egg({scene, hatchWaves: expectedHatchWaves}).hatchWaves; + const result = new Egg({ scene, hatchWaves: expectedHatchWaves }).hatchWaves; expect(result).toBe(expectedHatchWaves); }); @@ -125,7 +132,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedResult = true; - const result = new Egg({scene, isShiny: expectedResult, species: Species.BULBASAUR}).generatePlayerPokemon(scene).isShiny(); + const result = new Egg({ scene, isShiny: expectedResult, species: Species.BULBASAUR }).generatePlayerPokemon(scene).isShiny(); expect(result).toBe(expectedResult); }); @@ -133,7 +140,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.COMMON; - const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon(scene).variant; expect(result).toBe(expectedVariantTier); }); @@ -141,7 +148,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.RARE; - const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon(scene).variant; expect(result).toBe(expectedVariantTier); }); @@ -149,15 +156,15 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.EPIC; - const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon(scene).variant; expect(result).toBe(expectedVariantTier); }); it("should return an egg with an egg move index of 0, 1, 2 or 3", () => { const scene = game.scene; - const eggMoveIndex = new Egg({scene}).eggMoveIndex; - const result = eggMoveIndex && eggMoveIndex >= 0 && eggMoveIndex <= 3; + const eggMoveIndex = new Egg({ scene }).eggMoveIndex; + const result = !Utils.isNullOrUndefined(eggMoveIndex) && eggMoveIndex >= 0 && eggMoveIndex <= 3; expect(result).toBe(true); }); @@ -165,14 +172,14 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedEggMoveIndex = 3; - const result = new Egg({scene, eggMoveIndex: expectedEggMoveIndex}).eggMoveIndex; + const result = new Egg({ scene, eggMoveIndex: expectedEggMoveIndex }).eggMoveIndex; expect(result).toBe(expectedEggMoveIndex); }); it("should return a hatched pokemon with a hidden ability", () => { const scene = game.scene; - const playerPokemon = new Egg({scene, overrideHiddenAbility: true, species: Species.BULBASAUR}).generatePlayerPokemon(scene); + const playerPokemon = new Egg({ scene, overrideHiddenAbility: true, species: Species.BULBASAUR }).generatePlayerPokemon(scene); const expectedAbilityIndex = playerPokemon.species.ability2 ? 2 : 1; const result = playerPokemon.abilityIndex; @@ -183,7 +190,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedEggCount = 1; - new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true}); + new Egg({ scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true }); const result = scene.gameData.eggs.length; @@ -193,7 +200,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedEggTier = EggTier.COMMON; - const result = new Egg({scene, tier: EggTier.MASTER, species: Species.BULBASAUR}).tier; + const result = new Egg({ scene, tier: EggTier.MASTER, species: Species.BULBASAUR }).tier; expect(result).toBe(expectedEggTier); }); @@ -201,7 +208,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedHatchWaves = 10; - const result = new Egg({scene, tier: EggTier.MASTER, species: Species.BULBASAUR}).hatchWaves; + const result = new Egg({ scene, tier: EggTier.MASTER, species: Species.BULBASAUR }).hatchWaves; expect(result).toBe(expectedHatchWaves); }); @@ -232,7 +239,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startPityValues = [...scene.gameData.eggPity]; - new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.COMMON}); + new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.COMMON }); expect(scene.gameData.eggPity[EggTier.GREAT]).toBe(startPityValues[EggTier.GREAT] + 1); expect(scene.gameData.eggPity[EggTier.ULTRA]).toBe(startPityValues[EggTier.ULTRA] + 1); @@ -242,7 +249,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startPityValues = [...scene.gameData.eggPity]; - new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true, tier: EggTier.COMMON}); + new Egg({ scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true, tier: EggTier.COMMON }); expect(scene.gameData.eggPity[EggTier.GREAT]).toBe(startPityValues[EggTier.GREAT] + 1); expect(scene.gameData.eggPity[EggTier.ULTRA]).toBe(startPityValues[EggTier.ULTRA] + 1); @@ -253,7 +260,7 @@ describe("Egg Generation Tests", () => { const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; for (let i = 0; i < 200; i++) { - new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, species: Species.BULBASAUR}); + new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, species: Species.BULBASAUR }); } expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount); @@ -262,7 +269,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; - new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, id: 204, tier: EggTier.COMMON}); + new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, id: 204, tier: EggTier.COMMON }); expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount + 1); }); @@ -270,7 +277,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingRareEggsPulled = scene.gameData.gameStats.rareEggsPulled; - new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.GREAT}); + new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.GREAT }); expect(scene.gameData.gameStats.rareEggsPulled).toBe(startingRareEggsPulled + 1); }); @@ -278,7 +285,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingEpicEggsPulled = scene.gameData.gameStats.epicEggsPulled; - new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.ULTRA}); + new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.ULTRA }); expect(scene.gameData.gameStats.epicEggsPulled).toBe(startingEpicEggsPulled + 1); }); @@ -286,7 +293,7 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingLegendaryEggsPulled = scene.gameData.gameStats.legendaryEggsPulled; - new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.MASTER}); + new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.MASTER }); expect(scene.gameData.gameStats.legendaryEggsPulled).toBe(startingLegendaryEggsPulled + 1); }); @@ -297,10 +304,76 @@ describe("Egg Generation Tests", () => { const expectedTier1 = EggTier.MASTER; const expectedTier2 = EggTier.ULTRA; - const result1 = new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true}).tier; - const result2 = new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true}).tier; + const result1 = new Egg({ scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true }).tier; + const result2 = new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true }).tier; expect(result1).toBe(expectedTier1); expect(result2).toBe(expectedTier2); }); + + it("should generate an epic shiny from pokemon with a different form", () => { + const scene = game.scene; + const egg = new Egg({ scene, isShiny: true, variantTier: VariantTier.EPIC, species: Species.MIRAIDON }); + + 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 new file mode 100644 index 00000000000..8a564695e42 --- /dev/null +++ b/src/test/endless_boss.test.ts @@ -0,0 +1,88 @@ +import { Biome } from "#app/enums/biome"; +import { Species } from "#app/enums/species"; +import { GameModes } from "#app/game-mode"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "./utils/gameManager"; + +const EndlessBossWave = { + Minor: 250, + Major: 1000 +}; + +describe("Endless Boss", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .startingBiome(Biome.END) + .disableCrits(); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it(`should spawn a minor boss every ${EndlessBossWave.Minor} waves in END biome in Endless`, async () => { + game.override.startingWave(EndlessBossWave.Minor); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS); + + expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor); + expect(game.scene.arena.biomeType).toBe(Biome.END); + const eternatus = game.scene.getEnemyPokemon(); + expect(eternatus?.species.speciesId).toBe(Species.ETERNATUS); + expect(eternatus?.hasPassive()).toBe(false); + expect(eternatus?.formIndex).toBe(0); + }); + + it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Endless`, async () => { + game.override.startingWave(EndlessBossWave.Major); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS); + + expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major); + expect(game.scene.arena.biomeType).toBe(Biome.END); + const eternatus = game.scene.getEnemyPokemon(); + expect(eternatus?.species.speciesId).toBe(Species.ETERNATUS); + expect(eternatus?.hasPassive()).toBe(false); + expect(eternatus?.formIndex).toBe(1); + }); + + 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([Species.BIDOOF], GameModes.SPLICED_ENDLESS); + + expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor); + expect(game.scene.arena.biomeType).toBe(Biome.END); + const eternatus = game.scene.getEnemyPokemon(); + expect(eternatus?.species.speciesId).toBe(Species.ETERNATUS); + expect(eternatus?.hasPassive()).toBe(false); + expect(eternatus?.formIndex).toBe(0); + }); + + 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([Species.BIDOOF], GameModes.SPLICED_ENDLESS); + + expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major); + expect(game.scene.arena.biomeType).toBe(Biome.END); + const eternatus = game.scene.getEnemyPokemon(); + expect(eternatus?.species.speciesId).toBe(Species.ETERNATUS); + expect(eternatus?.hasPassive()).toBe(false); + expect(eternatus?.formIndex).toBe(1); + }); + + 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([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/escape-calculations.test.ts b/src/test/escape-calculations.test.ts new file mode 100644 index 00000000000..ecf22fc74aa --- /dev/null +++ b/src/test/escape-calculations.test.ts @@ -0,0 +1,303 @@ +import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; +import { CommandPhase } from "#app/phases/command-phase"; +import { Command } from "#app/ui/command-ui-handler"; +import * as Utils from "#app/utils"; +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, vi } from "vitest"; + +describe("Escape chance calculations", () => { + 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.INSOMNIA) + .ability(Abilities.INSOMNIA); + }); + + it("single non-boss opponent", async () => { + await game.classicMode.startBattle([Species.BULBASAUR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyField = game.scene.getEnemyField(); + const enemySpeed = 100; + // set enemyPokemon's speed to 100 + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemySpeed]); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + + await game.phaseInterceptor.to(AttemptRunPhase, false); + const phase = game.scene.getCurrentPhase() as AttemptRunPhase; + const escapePercentage = new Utils.NumberHolder(0); + + // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping + const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + { pokemonSpeedRatio: 0.01, escapeAttempts: 0, expectedEscapeChance: 5 }, + { pokemonSpeedRatio: 0.1, escapeAttempts: 0, expectedEscapeChance: 7 }, + { pokemonSpeedRatio: 0.25, escapeAttempts: 0, expectedEscapeChance: 11 }, + { pokemonSpeedRatio: 0.5, escapeAttempts: 0, expectedEscapeChance: 16 }, + { pokemonSpeedRatio: 0.8, escapeAttempts: 0, expectedEscapeChance: 23 }, + { pokemonSpeedRatio: 1, escapeAttempts: 0, expectedEscapeChance: 28 }, + { pokemonSpeedRatio: 1.2, escapeAttempts: 0, expectedEscapeChance: 32 }, + { pokemonSpeedRatio: 1.5, escapeAttempts: 0, expectedEscapeChance: 39 }, + { pokemonSpeedRatio: 3, escapeAttempts: 0, expectedEscapeChance: 73 }, + { pokemonSpeedRatio: 3.8, escapeAttempts: 0, expectedEscapeChance: 91 }, + { pokemonSpeedRatio: 4, escapeAttempts: 0, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 4.2, escapeAttempts: 0, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 10, escapeAttempts: 0, expectedEscapeChance: 95 }, + + // retries section + { pokemonSpeedRatio: 0.4, escapeAttempts: 1, expectedEscapeChance: 24 }, + { pokemonSpeedRatio: 1.6, escapeAttempts: 2, expectedEscapeChance: 61 }, + { pokemonSpeedRatio: 3.7, escapeAttempts: 5, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 0.2, escapeAttempts: 2, expectedEscapeChance: 30 }, + { pokemonSpeedRatio: 1, escapeAttempts: 3, expectedEscapeChance: 58 }, + { pokemonSpeedRatio: 2.9, escapeAttempts: 0, expectedEscapeChance: 70 }, + { pokemonSpeedRatio: 0.01, escapeAttempts: 7, expectedEscapeChance: 75 }, + { pokemonSpeedRatio: 16.2, escapeAttempts: 4, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 2, escapeAttempts: 3, expectedEscapeChance: 80 }, + ]; + + for (let i = 0; i < escapeChances.length; i++) { + // sets the number of escape attempts to the required amount + game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; + // set playerPokemon's speed to a multiple of the enemySpeed + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * enemySpeed]); + phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); + expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); + } + }, 20000); + + it("double non-boss opponent", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([Species.BULBASAUR, Species.ABOMASNOW]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyField = game.scene.getEnemyField(); + const enemyASpeed = 70; + const enemyBSpeed = 30; + // gets the sum of the speed of the two pokemon + const totalEnemySpeed = enemyASpeed + enemyBSpeed; + // this is used to find the ratio of the player's first pokemon + const playerASpeedPercentage = 0.4; + // set enemyAPokemon's speed to 70 + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyASpeed]); + // set enemyBPokemon's speed to 30 + vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyBSpeed]); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + + await game.phaseInterceptor.to(AttemptRunPhase, false); + const phase = game.scene.getCurrentPhase() as AttemptRunPhase; + const escapePercentage = new Utils.NumberHolder(0); + + // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping + const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + { pokemonSpeedRatio: 0.3, escapeAttempts: 0, expectedEscapeChance: 12 }, + { pokemonSpeedRatio: 0.7, escapeAttempts: 0, expectedEscapeChance: 21 }, + { pokemonSpeedRatio: 1.5, escapeAttempts: 0, expectedEscapeChance: 39 }, + { pokemonSpeedRatio: 3, escapeAttempts: 0, expectedEscapeChance: 73 }, + { pokemonSpeedRatio: 9, escapeAttempts: 0, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 0.01, escapeAttempts: 0, expectedEscapeChance: 5 }, + { pokemonSpeedRatio: 1, escapeAttempts: 0, expectedEscapeChance: 28 }, + { pokemonSpeedRatio: 4.3, escapeAttempts: 0, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 2.7, escapeAttempts: 0, expectedEscapeChance: 66 }, + { pokemonSpeedRatio: 2.1, escapeAttempts: 0, expectedEscapeChance: 52 }, + { pokemonSpeedRatio: 1.8, escapeAttempts: 0, expectedEscapeChance: 46 }, + { pokemonSpeedRatio: 6, escapeAttempts: 0, expectedEscapeChance: 95 }, + + // retries section + { pokemonSpeedRatio: 0.9, escapeAttempts: 1, expectedEscapeChance: 35 }, + { pokemonSpeedRatio: 3.6, escapeAttempts: 2, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 0.03, escapeAttempts: 7, expectedEscapeChance: 76 }, + { pokemonSpeedRatio: 0.02, escapeAttempts: 7, expectedEscapeChance: 75 }, + { pokemonSpeedRatio: 1, escapeAttempts: 5, expectedEscapeChance: 78 }, + { pokemonSpeedRatio: 0.7, escapeAttempts: 3, expectedEscapeChance: 51 }, + { pokemonSpeedRatio: 2.4, escapeAttempts: 9, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 1.8, escapeAttempts: 7, expectedEscapeChance: 95 }, + { pokemonSpeedRatio: 2, escapeAttempts: 10, expectedEscapeChance: 95 }, + + ]; + + for (let i = 0; i < escapeChances.length; i++) { + // sets the number of escape attempts to the required amount + game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; + // set the first playerPokemon's speed to a multiple of the enemySpeed + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage)]); + // set the second playerPokemon's speed to the remaining value of speed + vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5]]); + phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); + // checks to make sure the escape values are the same + expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); + // checks to make sure the sum of the player's speed for all pokemon is equal to the appropriate ratio of the total enemy speed + expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed); + } + }, 20000); + + it("single boss opponent", async () => { + game.override.startingWave(10); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const playerPokemon = game.scene.getPlayerField()!; + const enemyField = game.scene.getEnemyField()!; + const enemySpeed = 100; + // set enemyPokemon's speed to 100 + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemySpeed]); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + + await game.phaseInterceptor.to(AttemptRunPhase, false); + const phase = game.scene.getCurrentPhase() as AttemptRunPhase; + const escapePercentage = new Utils.NumberHolder(0); + + // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping + const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + { pokemonSpeedRatio: 0.01, escapeAttempts: 0, expectedEscapeChance: 5 }, + { pokemonSpeedRatio: 0.1, escapeAttempts: 0, expectedEscapeChance: 5 }, + { pokemonSpeedRatio: 0.25, escapeAttempts: 0, expectedEscapeChance: 6 }, + { pokemonSpeedRatio: 0.5, escapeAttempts: 0, expectedEscapeChance: 7 }, + { pokemonSpeedRatio: 0.8, escapeAttempts: 0, expectedEscapeChance: 8 }, + { pokemonSpeedRatio: 1, escapeAttempts: 0, expectedEscapeChance: 8 }, + { pokemonSpeedRatio: 1.2, escapeAttempts: 0, expectedEscapeChance: 9 }, + { pokemonSpeedRatio: 1.5, escapeAttempts: 0, expectedEscapeChance: 10 }, + { pokemonSpeedRatio: 3, escapeAttempts: 0, expectedEscapeChance: 15 }, + { pokemonSpeedRatio: 3.8, escapeAttempts: 0, expectedEscapeChance: 18 }, + { pokemonSpeedRatio: 4, escapeAttempts: 0, expectedEscapeChance: 18 }, + { pokemonSpeedRatio: 4.2, escapeAttempts: 0, expectedEscapeChance: 19 }, + { pokemonSpeedRatio: 4.7, escapeAttempts: 0, expectedEscapeChance: 21 }, + { pokemonSpeedRatio: 5, escapeAttempts: 0, expectedEscapeChance: 22 }, + { pokemonSpeedRatio: 5.9, escapeAttempts: 0, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 6, escapeAttempts: 0, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 6.7, escapeAttempts: 0, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 10, escapeAttempts: 0, expectedEscapeChance: 25 }, + + // retries section + { pokemonSpeedRatio: 0.4, escapeAttempts: 1, expectedEscapeChance: 8 }, + { pokemonSpeedRatio: 1.6, escapeAttempts: 2, expectedEscapeChance: 14 }, + { pokemonSpeedRatio: 3.7, escapeAttempts: 5, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 0.2, escapeAttempts: 2, expectedEscapeChance: 10 }, + { pokemonSpeedRatio: 1, escapeAttempts: 3, expectedEscapeChance: 14 }, + { pokemonSpeedRatio: 2.9, escapeAttempts: 0, expectedEscapeChance: 15 }, + { pokemonSpeedRatio: 0.01, escapeAttempts: 7, expectedEscapeChance: 19 }, + { pokemonSpeedRatio: 16.2, escapeAttempts: 4, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 2, escapeAttempts: 3, expectedEscapeChance: 18 }, + { pokemonSpeedRatio: 4.5, escapeAttempts: 1, expectedEscapeChance: 22 }, + { pokemonSpeedRatio: 6.8, escapeAttempts: 6, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 5.2, escapeAttempts: 8, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 4.7, escapeAttempts: 10, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 5.1, escapeAttempts: 1, expectedEscapeChance: 24 }, + { pokemonSpeedRatio: 6, escapeAttempts: 0, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 5.9, escapeAttempts: 2, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 6.1, escapeAttempts: 3, expectedEscapeChance: 25 }, + + ]; + + for (let i = 0; i < escapeChances.length; i++) { + // sets the number of escape attempts to the required amount + game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; + // set playerPokemon's speed to a multiple of the enemySpeed + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * enemySpeed]); + phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); + expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); + } + }, 20000); + + it("double boss opponent", async () => { + game.override.battleType("double"); + game.override.startingWave(10); + await game.classicMode.startBattle([Species.BULBASAUR, Species.ABOMASNOW]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyField = game.scene.getEnemyField(); + const enemyASpeed = 70; + const enemyBSpeed = 30; + // gets the sum of the speed of the two pokemon + const totalEnemySpeed = enemyASpeed + enemyBSpeed; + // this is used to find the ratio of the player's first pokemon + const playerASpeedPercentage = 0.8; + // set enemyAPokemon's speed to 70 + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyASpeed]); + // set enemyBPokemon's speed to 30 + vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyBSpeed]); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + + await game.phaseInterceptor.to(AttemptRunPhase, false); + const phase = game.scene.getCurrentPhase() as AttemptRunPhase; + const escapePercentage = new Utils.NumberHolder(0); + + // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping + const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + { pokemonSpeedRatio: 0.3, escapeAttempts: 0, expectedEscapeChance: 6 }, + { pokemonSpeedRatio: 0.7, escapeAttempts: 0, expectedEscapeChance: 7 }, + { pokemonSpeedRatio: 1.5, escapeAttempts: 0, expectedEscapeChance: 10 }, + { pokemonSpeedRatio: 3, escapeAttempts: 0, expectedEscapeChance: 15 }, + { pokemonSpeedRatio: 9, escapeAttempts: 0, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 0.01, escapeAttempts: 0, expectedEscapeChance: 5 }, + { pokemonSpeedRatio: 1, escapeAttempts: 0, expectedEscapeChance: 8 }, + { pokemonSpeedRatio: 4.3, escapeAttempts: 0, expectedEscapeChance: 19 }, + { pokemonSpeedRatio: 2.7, escapeAttempts: 0, expectedEscapeChance: 14 }, + { pokemonSpeedRatio: 2.1, escapeAttempts: 0, expectedEscapeChance: 12 }, + { pokemonSpeedRatio: 1.8, escapeAttempts: 0, expectedEscapeChance: 11 }, + { pokemonSpeedRatio: 6, escapeAttempts: 0, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 4, escapeAttempts: 0, expectedEscapeChance: 18 }, + { pokemonSpeedRatio: 5.7, escapeAttempts: 0, expectedEscapeChance: 24 }, + { pokemonSpeedRatio: 5, escapeAttempts: 0, expectedEscapeChance: 22 }, + { pokemonSpeedRatio: 6.1, escapeAttempts: 0, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 6.8, escapeAttempts: 0, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 10, escapeAttempts: 0, expectedEscapeChance: 25 }, + + // retries section + { pokemonSpeedRatio: 0.9, escapeAttempts: 1, expectedEscapeChance: 10 }, + { pokemonSpeedRatio: 3.6, escapeAttempts: 2, expectedEscapeChance: 21 }, + { pokemonSpeedRatio: 0.03, escapeAttempts: 7, expectedEscapeChance: 19 }, + { pokemonSpeedRatio: 0.02, escapeAttempts: 7, expectedEscapeChance: 19 }, + { pokemonSpeedRatio: 1, escapeAttempts: 5, expectedEscapeChance: 18 }, + { pokemonSpeedRatio: 0.7, escapeAttempts: 3, expectedEscapeChance: 13 }, + { pokemonSpeedRatio: 2.4, escapeAttempts: 9, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 1.8, escapeAttempts: 7, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 2, escapeAttempts: 10, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 3, escapeAttempts: 1, expectedEscapeChance: 17 }, + { pokemonSpeedRatio: 4.5, escapeAttempts: 3, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 3.7, escapeAttempts: 1, expectedEscapeChance: 19 }, + { pokemonSpeedRatio: 6.5, escapeAttempts: 1, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 12, escapeAttempts: 4, expectedEscapeChance: 25 }, + { pokemonSpeedRatio: 5.2, escapeAttempts: 2, expectedEscapeChance: 25 }, + + ]; + + for (let i = 0; i < escapeChances.length; i++) { + // sets the number of escape attempts to the required amount + game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; + // set the first playerPokemon's speed to a multiple of the enemySpeed + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage)]); + // set the second playerPokemon's speed to the remaining value of speed + vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5]]); + phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); + // checks to make sure the escape values are the same + expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); + // checks to make sure the sum of the player's speed for all pokemon is equal to the appropriate ratio of the total enemy speed + expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed); + } + }, 20000); +}); diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts new file mode 100644 index 00000000000..9f0806b8e24 --- /dev/null +++ b/src/test/evolution.test.ts @@ -0,0 +1,179 @@ +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, vi } from "vitest"; +import { SPLASH_ONLY } from "./utils/testUtils"; + +describe("Evolution", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 1000 * 20; + + 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.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.startingLevel(60); + }); + + it("should keep hidden ability after evolving", async () => { + await game.classicMode.runToSummon([Species.EEVEE, Species.TRAPINCH]); + + const eevee = game.scene.getParty()[0]; + const trapinch = game.scene.getParty()[1]; + eevee.abilityIndex = 2; + trapinch.abilityIndex = 2; + + eevee.evolve(pokemonEvolutions[Species.EEVEE][6], eevee.getSpeciesForm()); + expect(eevee.abilityIndex).toBe(2); + + trapinch.evolve(pokemonEvolutions[Species.TRAPINCH][0], trapinch.getSpeciesForm()); + expect(trapinch.abilityIndex).toBe(1); + }, TIMEOUT); + + it("should keep same ability slot after evolving", async () => { + await game.classicMode.runToSummon([Species.BULBASAUR, Species.CHARMANDER]); + + const bulbasaur = game.scene.getParty()[0]; + const charmander = game.scene.getParty()[1]; + bulbasaur.abilityIndex = 0; + charmander.abilityIndex = 1; + + bulbasaur.evolve(pokemonEvolutions[Species.BULBASAUR][0], bulbasaur.getSpeciesForm()); + expect(bulbasaur.abilityIndex).toBe(0); + + charmander.evolve(pokemonEvolutions[Species.CHARMANDER][0], charmander.getSpeciesForm()); + expect(charmander.abilityIndex).toBe(1); + }, TIMEOUT); + + it("should handle illegal abilityIndex values", async () => { + await game.classicMode.runToSummon([Species.SQUIRTLE]); + + const squirtle = game.scene.getPlayerPokemon()!; + squirtle.abilityIndex = 5; + + squirtle.evolve(pokemonEvolutions[Species.SQUIRTLE][0], squirtle.getSpeciesForm()); + expect(squirtle.abilityIndex).toBe(0); + }, TIMEOUT); + + it("should handle nincada's unique evolution", async () => { + await game.classicMode.runToSummon([Species.NINCADA]); + + 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", () => { + const speciesFormEvo = new SpeciesFormEvolution(Species.ABRA, null, null, 1000, null, null); + + 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/field/pokemon.test.ts b/src/test/field/pokemon.test.ts new file mode 100644 index 00000000000..d597cd5219c --- /dev/null +++ b/src/test/field/pokemon.test.ts @@ -0,0 +1,31 @@ +import { Species } from "#app/enums/species"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "../utils/gameManager"; + +describe("Spec - Pokemon", () => { + 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 crash when trying to set status of undefined", async () => { + await game.classicMode.runToSummon([Species.ABRA]); + + const pkm = game.scene.getPlayerPokemon()!; + expect(pkm).toBeDefined(); + + expect(pkm.trySetStatus(undefined)).toBe(true); + }); +}); diff --git a/src/test/final_boss.test.ts b/src/test/final_boss.test.ts new file mode 100644 index 00000000000..5d006998a0b --- /dev/null +++ b/src/test/final_boss.test.ts @@ -0,0 +1,145 @@ +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, +}; + +describe("Final Boss", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + 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(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("should spawn Eternatus on wave 200 in END biome", async () => { + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); + + expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); + expect(game.scene.arena.biomeType).toBe(Biome.END); + expect(game.scene.getEnemyPokemon()!.species.speciesId).toBe(Species.ETERNATUS); + }); + + it("should NOT spawn Eternatus before wave 200 in END biome", async () => { + game.override.startingWave(FinalWave.Classic - 1); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); + + expect(game.scene.currentBattle.waveIndex).not.toBe(FinalWave.Classic); + expect(game.scene.arena.biomeType).toBe(Biome.END); + expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(Species.ETERNATUS); + }); + + it("should NOT spawn Eternatus outside of END biome", async () => { + game.override.startingBiome(Biome.FOREST); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); + + expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); + expect(game.scene.arena.biomeType).not.toBe(Biome.END); + expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(Species.ETERNATUS); + }); + + it("should not have passive enabled on Eternatus", async () => { + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); + + 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); + }); + +}); diff --git a/src/test/game-mode.test.ts b/src/test/game-mode.test.ts new file mode 100644 index 00000000000..ccec3a3aa16 --- /dev/null +++ b/src/test/game-mode.test.ts @@ -0,0 +1,44 @@ +import { GameMode, GameModes, getGameMode } from "#app/game-mode"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import * as Utils from "../utils"; +import GameManager from "./utils/gameManager"; +describe("game-mode", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.resetAllMocks(); + }); + beforeEach(() => { + game = new GameManager(phaserGame); + }); + describe("classic", () => { + let classicGameMode: GameMode; + beforeEach(() => { + classicGameMode = getGameMode(GameModes.CLASSIC); + }); + it("does NOT spawn trainers within 3 waves of fixed battle", () => { + const { arena } = game.scene; + /** set wave 16 to be a fixed trainer fight meaning wave 13-19 don't allow trainer spawns */ + vi.spyOn(classicGameMode, "isFixedBattle").mockImplementation( + (n: number) => (n === 16 ? true : false) + ); + vi.spyOn(arena, "getTrainerChance").mockReturnValue(1); + vi.spyOn(Utils, "randSeedInt").mockReturnValue(0); + expect(classicGameMode.isWaveTrainer(11, arena)).toBeFalsy(); + expect(classicGameMode.isWaveTrainer(12, arena)).toBeTruthy(); + expect(classicGameMode.isWaveTrainer(13, arena)).toBeFalsy(); + expect(classicGameMode.isWaveTrainer(14, arena)).toBeFalsy(); + expect(classicGameMode.isWaveTrainer(15, arena)).toBeFalsy(); + // Wave 16 is a fixed trainer battle + expect(classicGameMode.isWaveTrainer(17, arena)).toBeFalsy(); + expect(classicGameMode.isWaveTrainer(18, arena)).toBeFalsy(); + expect(classicGameMode.isWaveTrainer(19, arena)).toBeFalsy(); + }); + }); +}); diff --git a/src/test/imports.test.ts b/src/test/imports.test.ts index 5c0272e191d..305eccdc465 100644 --- a/src/test/imports.test.ts +++ b/src/test/imports.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, it} from "vitest"; -import {initStatsKeys} from "#app/ui/game-stats-ui-handler"; +import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; +import { describe, expect, it } from "vitest"; async function importModule() { try { diff --git a/src/test/inputs/inputs.test.ts b/src/test/inputs/inputs.test.ts index 5acee145011..6306c1b9da6 100644 --- a/src/test/inputs/inputs.test.ts +++ b/src/test/inputs/inputs.test.ts @@ -1,9 +1,9 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; -import InputsHandler from "#app/test/utils/inputsHandler"; +import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; +import GameManager from "#test/utils/gameManager"; +import InputsHandler from "#test/utils/inputsHandler"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Inputs", () => { diff --git a/src/test/internals.test.ts b/src/test/internals.test.ts new file mode 100644 index 00000000000..3c76b40e901 --- /dev/null +++ b/src/test/internals.test.ts @@ -0,0 +1,43 @@ +import { Abilities } from "#app/enums/abilities"; +import { Species } from "#app/enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Internals", () => { + 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 provide Eevee with 3 defined abilities", async () => { + await game.classicMode.runToSummon([Species.EEVEE]); + const eevee = game.scene.getPlayerPokemon()!; + + expect(eevee.getSpeciesForm().getAbilityCount()).toBe(3); + + expect(eevee.getSpeciesForm().getAbility(0)).toBe(Abilities.RUN_AWAY); + expect(eevee.getSpeciesForm().getAbility(1)).toBe(Abilities.ADAPTABILITY); + expect(eevee.getSpeciesForm().getAbility(2)).toBe(Abilities.ANTICIPATION); + }); + + it("should set Eeeve abilityIndex between 0-2", async () => { + await game.classicMode.runToSummon([Species.EEVEE]); + const eevee = game.scene.getPlayerPokemon()!; + + expect(eevee.abilityIndex).toBeGreaterThanOrEqual(0); + expect(eevee.abilityIndex).toBeLessThanOrEqual(2); + }); +}); diff --git a/src/test/items/dire_hit.test.ts b/src/test/items/dire_hit.test.ts new file mode 100644 index 00000000000..4b5988294f3 --- /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.getBattleCount()).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).getBattleCount()).toBe(5); + } + } + expect(count).toBe(1); + }, 20000); +}); diff --git a/src/test/items/double_battle_chance_booster.test.ts b/src/test/items/double_battle_chance_booster.test.ts new file mode 100644 index 00000000000..808d4c7ca51 --- /dev/null +++ b/src/test/items/double_battle_chance_booster.test.ts @@ -0,0 +1,105 @@ +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier"; +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 { ShopCursorTarget } from "#app/enums/shop-cursor-target.js"; +import { Mode } from "#app/ui/ui.js"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler.js"; +import { Button } from "#app/enums/buttons.js"; + +describe("Items - Double Battle Chance Boosters", () => { + 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); + }); + + it("should guarantee double battle with 2 unique tiers", async () => { + game.override + .startingModifier([ + { name: "LURE" }, + { name: "SUPER_LURE" } + ]) + .startingWave(2); + + await game.classicMode.startBattle(); + + expect(game.scene.getEnemyField().length).toBe(2); + }, TIMEOUT); + + it("should guarantee double boss battle with 3 unique tiers", async () => { + game.override + .startingModifier([ + { name: "LURE" }, + { name: "SUPER_LURE" }, + { name: "MAX_LURE" } + ]) + .startingWave(10); + + await game.classicMode.startBattle(); + + const enemyField = game.scene.getEnemyField(); + + expect(enemyField.length).toBe(2); + expect(enemyField[0].isBoss()).toBe(true); + expect(enemyField[1].isBoss()).toBe(true); + }, TIMEOUT); + + it("should renew how many battles are left of existing booster when picking up new booster of same tier", async() => { + game.override + .startingModifier([{ name: "LURE" }]) + .itemRewards([{ name: "LURE" }]) + .moveset(SPLASH_ONLY) + .startingLevel(200); + + await game.classicMode.startBattle([ + Species.PIKACHU + ]); + + game.move.select(Moves.SPLASH); + + await game.doKillOpponents(); + + await game.phaseInterceptor.to("BattleEndPhase"); + + const modifier = game.scene.findModifier(m => m instanceof DoubleBattleChanceBoosterModifier) as DoubleBattleChanceBoosterModifier; + expect(modifier.getBattleCount()).toBe(9); + + // Forced LURE 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 DoubleBattleChanceBoosterModifier) { + count++; + const modifierInstance = m as DoubleBattleChanceBoosterModifier; + expect(modifierInstance.getBattleCount()).toBe(modifierInstance.getMaxBattles()); + } + } + expect(count).toBe(1); + }, TIMEOUT); +}); diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts index 5b4561d4877..83b00583893 100644 --- a/src/test/items/eviolite.test.ts +++ b/src/test/items/eviolite.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Stat } from "#app/data/pokemon-stat"; +import { Stat } from "#enums/stat"; import { EvolutionStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import * as Utils from "#app/utils"; 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"; describe("Items - Eviolite", () => { let phaserGame: Phaser.Game; @@ -26,11 +25,11 @@ describe("Items - Eviolite", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); }); it("EVIOLITE activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "EVIOLITE" }]); + game.override.startingHeldItems([{ name: "EVIOLITE" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.PICHU @@ -38,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/exp_booster.test.ts b/src/test/items/exp_booster.test.ts new file mode 100644 index 00000000000..9a7464e4866 --- /dev/null +++ b/src/test/items/exp_booster.test.ts @@ -0,0 +1,40 @@ +import { Abilities } from "#app/enums/abilities"; +import { PokemonExpBoosterModifier } from "#app/modifier/modifier"; +import * as Utils from "#app/utils"; +import GameManager from "#test/utils/gameManager"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("EXP Modifier Items", () => { + 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.enemyAbility(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); + game.override.battleType("single"); + }); + + it("EXP booster items stack multiplicatively", async() => { + game.override.startingHeldItems([{name: "LUCKY_EGG", count: 3}, {name: "GOLDEN_EGG"}]); + await game.startBattle(); + + const partyMember = game.scene.getPlayerPokemon()!; + partyMember.exp = 100; + const expHolder = new Utils.NumberHolder(partyMember.exp); + partyMember.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, expHolder); + expect(expHolder.value).toBe(440); + }, 20000); +}); diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index ae621770da6..09afa9aea0b 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -1,15 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { BerryType } from "#app/enums/berry-type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import GameManager from "#test/utils/gameManager"; import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Moves } from "#app/enums/moves.js"; -import { Species } from "#app/enums/species.js"; -import { BerryType } from "#app/enums/berry-type.js"; -import { Abilities } from "#app/enums/abilities.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { CommandPhase, MoveEndPhase, SelectTargetPhase } from "#app/phases.js"; -import { BattlerIndex } from "#app/battle.js"; -import { allMoves } from "#app/data/move.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; // 20 seconds @@ -30,18 +29,22 @@ describe("Items - Grip Claw", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POPULATION_BOMB, Moves.SPLASH ]); - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.KLUTZ); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - vi.spyOn(overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ - {name: "BERRY", type: BerryType.SITRUS, count: 2}, - {name: "BERRY", type: BerryType.LUM, count: 2} - ]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override + .battleType("double") + .moveset([Moves.POPULATION_BOMB, Moves.SPLASH]) + .startingHeldItems([ + { name: "GRIP_CLAW", count: 5 }, // TODO: Find a way to mock the steal chance of grip claw + { name: "MULTI_LENS", count: 3 }, + ]) + .enemySpecies(Species.SNORLAX) + .ability(Abilities.KLUTZ) + .enemyMoveset(SPLASH_ONLY) + .enemyHeldItems([ + { name: "BERRY", type: BerryType.SITRUS, count: 2 }, + { name: "BERRY", type: BerryType.LUM, count: 2 }, + ]) + .startingLevel(100) + .enemyLevel(100); vi.spyOn(allMoves[Moves.POPULATION_BOMB], "accuracy", "get").mockReturnValue(100); }); @@ -49,23 +52,14 @@ describe("Items - Grip Claw", () => { it( "should only steal items from the attack target", async () => { - await game.startBattle([Species.PANSEAR, Species.ROWLET, Species.PANPOUR, Species.PANSAGE, Species.CHARMANDER, Species.SQUIRTLE]); - - const playerPokemon = game.scene.getPlayerField(); - playerPokemon.forEach(p => expect(p).toBeDefined()); + await game.startBattle([Species.PANSEAR, Species.ROWLET]); const enemyPokemon = game.scene.getEnemyField(); - enemyPokemon.forEach(p => expect(p).toBeDefined()); const enemyHeldItemCt = enemyPokemon.map(p => p.getHeldItems.length); - game.doAttack(getMovePosition(game.scene, 0, Moves.POPULATION_BOMB)); - - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY); - - await game.phaseInterceptor.to(CommandPhase, false); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + game.move.select(Moves.POPULATION_BOMB, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to(MoveEndPhase, false); diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts new file mode 100644 index 00000000000..af20516ef83 --- /dev/null +++ b/src/test/items/leek.test.ts @@ -0,0 +1,161 @@ +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import * as Utils from "#app/utils"; +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"; + +describe("Items - Leek", () => { + 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([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]) + .startingHeldItems([{ name: "LEEK" }]) + .moveset([ Moves.TACKLE ]) + .disableCrits() + .battleType("single"); + }); + + it("should raise CRIT stage by 2 when held by FARFETCHD", async () => { + await game.startBattle([ + Species.FARFETCHD + ]); + + const enemyMember = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemyMember, "getCritStage"); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyMember.getCritStage).toHaveReturnedWith(2); + }, 20000); + + it("should raise CRIT stage by 2 when held by GALAR_FARFETCHD", async () => { + await game.startBattle([ + Species.GALAR_FARFETCHD + ]); + + const enemyMember = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemyMember, "getCritStage"); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyMember.getCritStage).toHaveReturnedWith(2); + }, 20000); + + it("should raise CRIT stage by 2 when held by SIRFETCHD", async () => { + await game.startBattle([ + Species.SIRFETCHD + ]); + + const enemyMember = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemyMember, "getCritStage"); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyMember.getCritStage).toHaveReturnedWith(2); + }, 20000); + + 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]; + + await game.startBattle([ + species[Utils.randInt(species.length)], + Species.PIKACHU, + ]); + + const [ partyMember, ally ] = game.scene.getParty(); + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const enemyMember = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemyMember, "getCritStage"); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyMember.getCritStage).toHaveReturnedWith(2); + }, 20000); + + 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]; + + await game.startBattle([ + Species.PIKACHU, + species[Utils.randInt(species.length)] + ]); + + const [ partyMember, ally ] = game.scene.getParty(); + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + + const enemyMember = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemyMember, "getCritStage"); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyMember.getCritStage).toHaveReturnedWith(2); + }, 20000); + + it("should not raise CRIT stage when held by a Pokemon outside of FARFETCHD line", async () => { + await game.startBattle([ + Species.PIKACHU + ]); + + const enemyMember = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemyMember, "getCritStage"); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyMember.getCritStage).toHaveReturnedWith(0); + }, 20000); +}); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts new file mode 100644 index 00000000000..8e548542436 --- /dev/null +++ b/src/test/items/leftovers.test.ts @@ -0,0 +1,60 @@ +import { DamagePhase } from "#app/phases/damage-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 GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + + +describe("Items - Leftovers", () => { + 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.startingLevel(2000); + game.override.ability(Abilities.UNNERVE); + game.override.moveset([Moves.SPLASH]); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.UNNERVE); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.startingHeldItems([{ name: "LEFTOVERS", count: 1 }]); + }); + + it("leftovers works", async () => { + await game.startBattle([Species.ARCANINE]); + + // Make sure leftovers are there + expect(game.scene.modifiers[0].type.id).toBe("LEFTOVERS"); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + // We should have full hp + expect(leadPokemon.isFullHp()).toBe(true); + + game.move.select(Moves.SPLASH); + + // We should have less hp after the attack + await game.phaseInterceptor.to(DamagePhase, false); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + + const leadHpAfterDamage = leadPokemon.hp; + + // Check if leftovers heal us + await game.phaseInterceptor.to(TurnEndPhase); + expect(leadPokemon.hp).toBeGreaterThan(leadHpAfterDamage); + }, 20000); +}); diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts index 52fab7b044a..673348e7b7a 100644 --- a/src/test/items/light_ball.test.ts +++ b/src/test/items/light_ball.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Stat } from "#app/data/pokemon-stat"; +import { Stat } from "#enums/stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import * as Utils from "#app/utils"; +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"; describe("Items - Light Ball", () => { let phaserGame: Phaser.Game; @@ -26,11 +25,11 @@ describe("Items - Light Ball", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); }); it("LIGHT_BALL activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.PIKACHU @@ -38,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"), ""); }); @@ -84,7 +83,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -123,7 +122,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -162,7 +161,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -190,7 +189,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); diff --git a/src/test/items/lock_capsule.test.ts b/src/test/items/lock_capsule.test.ts new file mode 100644 index 00000000000..bc4ca1cb014 --- /dev/null +++ b/src/test/items/lock_capsule.test.ts @@ -0,0 +1,46 @@ +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import GameManager from "#test/utils/gameManager"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Items - Lock Capsule", () => { + 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") + .startingLevel(200) + .moveset([Moves.SURF]) + .enemyAbility(Abilities.BALL_FETCH) + .startingModifier([{ name: "LOCK_CAPSULE" }]); + }); + + it("doesn't set the cost of common tier items to 0", async () => { + await game.startBattle(); + + game.move.select(Moves.SURF); + await game.phaseInterceptor.to(SelectModifierPhase, false); + + const rewards = game.scene.getCurrentPhase() as SelectModifierPhase; + const potion = new ModifierTypeOption(modifierTypes.POTION(), 0, 40); // Common tier item + const rerollCost = rewards.getRerollCost([potion, potion, potion], true); + + expect(rerollCost).toBe(150); + }, 20000); +}); diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts index 5aa2c517ac9..0206fd1f471 100644 --- a/src/test/items/metal_powder.test.ts +++ b/src/test/items/metal_powder.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Stat } from "#app/data/pokemon-stat"; +import { Stat } from "#enums/stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import * as Utils from "#app/utils"; +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"; describe("Items - Metal Powder", () => { let phaserGame: Phaser.Game; @@ -26,11 +25,11 @@ describe("Items - Metal Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); }); it("METAL_POWDER activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.DITTO @@ -38,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"), ""); }); @@ -80,7 +79,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -113,7 +112,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -146,7 +145,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -168,7 +167,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts index 753f62e36eb..344b772feb4 100644 --- a/src/test/items/quick_powder.test.ts +++ b/src/test/items/quick_powder.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Stat } from "#app/data/pokemon-stat"; +import { Stat } from "#enums/stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import * as Utils from "#app/utils"; +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"; describe("Items - Quick Powder", () => { let phaserGame: Phaser.Game; @@ -26,11 +25,11 @@ describe("Items - Quick Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); }); it("QUICK_POWDER activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.DITTO @@ -38,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"), ""); }); @@ -80,7 +79,7 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); @@ -113,7 +112,7 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); @@ -146,7 +145,7 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); @@ -168,7 +167,7 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts new file mode 100644 index 00000000000..c8629093ab5 --- /dev/null +++ b/src/test/items/scope_lens.test.ts @@ -0,0 +1,51 @@ +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; + 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: "SCOPE_LENS" }]) + .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); +}); 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..3e32fa13a04 --- /dev/null +++ b/src/test/items/temp_stat_stage_booster.test.ts @@ -0,0 +1,171 @@ +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 ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +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.classicMode.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.classicMode.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.classicMode.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.classicMode.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.classicMode.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.getBattleCount()).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++; + const modifierInstance = m as TempStatStageBoosterModifier; + expect(modifierInstance.getBattleCount()).toBe(modifierInstance.getMaxBattles()); + } + } + expect(count).toBe(1); + }, 20000); +}); diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts index 3356196e8c5..bcb6b371264 100644 --- a/src/test/items/thick_club.test.ts +++ b/src/test/items/thick_club.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Stat } from "#app/data/pokemon-stat"; +import { Stat } from "#enums/stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import * as Utils from "#app/utils"; +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"; describe("Items - Thick Club", () => { let phaserGame: Phaser.Game; @@ -26,11 +25,11 @@ describe("Items - Thick Club", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); }); it("THICK_CLUB activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.CUBONE @@ -38,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"), ""); }); @@ -80,7 +79,7 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); @@ -102,7 +101,7 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); @@ -124,7 +123,7 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); @@ -161,7 +160,7 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); @@ -198,7 +197,7 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); @@ -220,7 +219,7 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), true); partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(1); diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 64dc3191d88..95336c0793e 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -1,21 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, - EnemyCommandPhase, - MessagePhase, - TurnEndPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {StatusEffect} from "#app/data/status-effect"; +import { StatusEffect } from "#app/data/status-effect"; +import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; +import { MessagePhase } from "#app/phases/message-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import i18next, { initI18n } from "#app/plugins/i18n"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import i18next, { initI18n } from "#app/plugins/i18n"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Items - Toxic orb", () => { @@ -36,19 +29,19 @@ describe("Items - Toxic orb", () => { game = new GameManager(phaserGame); const moveToUse = Moves.GROWTH; const oppMoveToUse = Moves.TACKLE; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ + game.override.battleType("single"); + game.override.enemySpecies(Species.RATTATA); + game.override.ability(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.startingLevel(2000); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); + game.override.startingHeldItems([{ name: "TOXIC_ORB", }]); }); - it("TOXIC ORB", async() => { + it("TOXIC ORB", async () => { initI18n(); i18next.changeLanguage("en"); const moveToUse = Moves.GROWTH; @@ -58,26 +51,18 @@ describe("Items - Toxic orb", () => { ]); expect(game.scene.modifiers[0].type.id).toBe("TOXIC_ORB"); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - // Select Attack - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - // Select Move Growth - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); // will run the 13 phase from enemyCommandPhase to TurnEndPhase await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnEndPhase); // Toxic orb should trigger here await game.phaseInterceptor.run(MessagePhase); const message = game.textInterceptor.getLatestMessage(); - expect(message).toContain("was badly poisoned by Toxic Orb"); + expect(message).toContain("was badly poisoned by the Toxic Orb"); await game.phaseInterceptor.run(MessagePhase); const message2 = game.textInterceptor.getLatestMessage(); expect(message2).toContain("is hurt"); expect(message2).toContain("by poison"); - expect(game.scene.getParty()[0].status.effect).toBe(StatusEffect.TOXIC); + expect(game.scene.getParty()[0].status!.effect).toBe(StatusEffect.TOXIC); }, 20000); }); diff --git a/src/test/lokalisation/french.test.ts b/src/test/localization/french.test.ts similarity index 81% rename from src/test/lokalisation/french.test.ts rename to src/test/localization/french.test.ts index 45429b1b157..92b4c82d7cb 100644 --- a/src/test/lokalisation/french.test.ts +++ b/src/test/localization/french.test.ts @@ -1,9 +1,9 @@ -import {afterEach, beforeAll, describe, expect, it} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import {Species} from "#enums/species"; +import { initI18n } from "#app/plugins/i18n"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; import i18next from "i18next"; -import {initI18n} from "#app/plugins/i18n"; +import Phaser from "phaser"; +import { afterEach, beforeAll, describe, expect, it } from "vitest"; describe("Lokalization - french", () => { let phaserGame: Phaser.Game; diff --git a/src/test/lokalisation/status-effect.test.ts b/src/test/localization/status-effect.test.ts similarity index 78% rename from src/test/lokalisation/status-effect.test.ts rename to src/test/localization/status-effect.test.ts index b4267ea7b8b..9dcab5aeb5f 100644 --- a/src/test/lokalisation/status-effect.test.ts +++ b/src/test/localization/status-effect.test.ts @@ -1,15 +1,8 @@ -import { beforeAll, describe, afterEach, expect, it, vi } from "vitest"; -import { - StatusEffect, - getStatusEffectActivationText, - getStatusEffectDescriptor, - getStatusEffectHealText, - getStatusEffectObtainText, - getStatusEffectOverlapText, -} from "#app/data/status-effect"; -import i18next, { ParseKeys } from "i18next"; +import { StatusEffect, getStatusEffectActivationText, getStatusEffectDescriptor, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText } from "#app/data/status-effect"; +import { mockI18next } from "#test/utils/testUtils"; +import i18next from "i18next"; +import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; -const tMock = (key: ParseKeys) => key; const pokemonName = "PKM"; const sourceText = "SOURCE"; @@ -22,7 +15,7 @@ describe("status-effect", () => { const statusEffect = StatusEffect.NONE; it("should return the obtain text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName); expect(text).toBe("statusEffect:none.obtain"); @@ -32,7 +25,7 @@ describe("status-effect", () => { }); it("should return the source-obtain text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName, sourceText); expect(text).toBe("statusEffect:none.obtainSource"); @@ -42,25 +35,25 @@ describe("status-effect", () => { }); it("should return the activation text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectActivationText(statusEffect, pokemonName); expect(text).toBe("statusEffect:none.activation"); }); it("should return the overlap text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectOverlapText(statusEffect, pokemonName); expect(text).toBe("statusEffect:none.overlap"); }); it("should return the heal text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectHealText(statusEffect, pokemonName); expect(text).toBe("statusEffect:none.heal"); }); it("should return the descriptor", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectDescriptor(statusEffect); expect(text).toBe("statusEffect:none.description"); }); @@ -70,7 +63,7 @@ describe("status-effect", () => { const statusEffect = StatusEffect.POISON; it("should return the obtain text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName); expect(text).toBe("statusEffect:poison.obtain"); @@ -80,25 +73,25 @@ describe("status-effect", () => { }); it("should return the activation text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectActivationText(statusEffect, pokemonName); expect(text).toBe("statusEffect:poison.activation"); }); it("should return the descriptor", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectDescriptor(statusEffect); expect(text).toBe("statusEffect:poison.description"); }); it("should return the heal text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectHealText(statusEffect, pokemonName); expect(text).toBe("statusEffect:poison.heal"); }); it("should return the overlap text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectOverlapText(statusEffect, pokemonName); expect(text).toBe("statusEffect:poison.overlap"); }); @@ -108,7 +101,7 @@ describe("status-effect", () => { const statusEffect = StatusEffect.TOXIC; it("should return the obtain text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName); expect(text).toBe("statusEffect:toxic.obtain"); @@ -118,25 +111,25 @@ describe("status-effect", () => { }); it("should return the activation text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectActivationText(statusEffect, pokemonName); expect(text).toBe("statusEffect:toxic.activation"); }); it("should return the descriptor", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectDescriptor(statusEffect); expect(text).toBe("statusEffect:toxic.description"); }); it("should return the heal text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectHealText(statusEffect, pokemonName); expect(text).toBe("statusEffect:toxic.heal"); }); it("should return the overlap text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectOverlapText(statusEffect, pokemonName); expect(text).toBe("statusEffect:toxic.overlap"); }); @@ -146,7 +139,7 @@ describe("status-effect", () => { const statusEffect = StatusEffect.PARALYSIS; it("should return the obtain text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName); expect(text).toBe("statusEffect:paralysis.obtain"); @@ -156,25 +149,25 @@ describe("status-effect", () => { }); it("should return the activation text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectActivationText(statusEffect, pokemonName); expect(text).toBe("statusEffect:paralysis.activation"); }); it("should return the descriptor", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectDescriptor(statusEffect); expect(text).toBe("statusEffect:paralysis.description"); }); it("should return the heal text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectHealText(statusEffect, pokemonName); expect(text).toBe("statusEffect:paralysis.heal"); }); it("should return the overlap text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectOverlapText(statusEffect, pokemonName); expect(text).toBe("statusEffect:paralysis.overlap"); }); @@ -184,7 +177,7 @@ describe("status-effect", () => { const statusEffect = StatusEffect.SLEEP; it("should return the obtain text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName); expect(text).toBe("statusEffect:sleep.obtain"); @@ -194,25 +187,25 @@ describe("status-effect", () => { }); it("should return the activation text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectActivationText(statusEffect, pokemonName); expect(text).toBe("statusEffect:sleep.activation"); }); it("should return the descriptor", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectDescriptor(statusEffect); expect(text).toBe("statusEffect:sleep.description"); }); it("should return the heal text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectHealText(statusEffect, pokemonName); expect(text).toBe("statusEffect:sleep.heal"); }); it("should return the overlap text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectOverlapText(statusEffect, pokemonName); expect(text).toBe("statusEffect:sleep.overlap"); }); @@ -222,7 +215,7 @@ describe("status-effect", () => { const statusEffect = StatusEffect.FREEZE; it("should return the obtain text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName); expect(text).toBe("statusEffect:freeze.obtain"); @@ -232,25 +225,25 @@ describe("status-effect", () => { }); it("should return the activation text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectActivationText(statusEffect, pokemonName); expect(text).toBe("statusEffect:freeze.activation"); }); it("should return the descriptor", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectDescriptor(statusEffect); expect(text).toBe("statusEffect:freeze.description"); }); it("should return the heal text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectHealText(statusEffect, pokemonName); expect(text).toBe("statusEffect:freeze.heal"); }); it("should return the overlap text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectOverlapText(statusEffect, pokemonName); expect(text).toBe("statusEffect:freeze.overlap"); }); @@ -260,7 +253,7 @@ describe("status-effect", () => { const statusEffect = StatusEffect.BURN; it("should return the obtain text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName); expect(text).toBe("statusEffect:burn.obtain"); @@ -270,25 +263,25 @@ describe("status-effect", () => { }); it("should return the activation text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectActivationText(statusEffect, pokemonName); expect(text).toBe("statusEffect:burn.activation"); }); it("should return the descriptor", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectDescriptor(statusEffect); expect(text).toBe("statusEffect:burn.description"); }); it("should return the heal text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectHealText(statusEffect, pokemonName); expect(text).toBe("statusEffect:burn.heal"); }); it("should return the overlap text", () => { - vi.spyOn(i18next, "t").mockImplementation(tMock); + mockI18next(); const text = getStatusEffectOverlapText(statusEffect, pokemonName); expect(text).toBe("statusEffect:burn.overlap"); }); diff --git a/src/test/localization/terrain.test.ts b/src/test/localization/terrain.test.ts new file mode 100644 index 00000000000..ed280177a06 --- /dev/null +++ b/src/test/localization/terrain.test.ts @@ -0,0 +1,191 @@ +import { TerrainType, getTerrainName } from "#app/data/terrain"; +import { getTerrainBlockMessage, getTerrainClearMessage, getTerrainStartMessage } from "#app/data/weather"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { mockI18next } from "#test/utils/testUtils"; +import i18next from "i18next"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("terrain", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + i18next.init(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + }); + + describe("NONE", () => { + const terrainType = TerrainType.NONE; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getTerrainName(terrainType); + expect(text).toBe(""); + }); + + it("should return the start text", () => { + mockI18next(); + + const text = getTerrainStartMessage(terrainType); + expect(text).toBeNull(); + }); + + it("should return the clear text", () => { + mockI18next(); + const text = getTerrainClearMessage(terrainType); + expect(text).toBeNull(); + }); + + it("should return the block text", async () => { + await game.startBattle([Species.MAGIKARP]); + const pokemon = game.scene.getPlayerPokemon()!; + mockI18next(); + const text = getTerrainBlockMessage(pokemon, terrainType); + expect(text).toBe("terrain:defaultBlockMessage"); + }); + }); + + describe("MISTY", () => { + const terrainType = TerrainType.MISTY; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getTerrainName(terrainType); + expect(text).toBe("terrain:misty"); + }); + + it("should return the start text", () => { + mockI18next(); + + const text = getTerrainStartMessage(terrainType); + expect(text).toBe("terrain:mistyStartMessage"); + }); + + it("should return the clear text", () => { + mockI18next(); + const text = getTerrainClearMessage(terrainType); + expect(text).toBe("terrain:mistyClearMessage"); + }); + + it("should return the block text", async () => { + await game.startBattle([Species.MAGIKARP]); + const pokemon = game.scene.getPlayerPokemon()!; + mockI18next(); + const text = getTerrainBlockMessage(pokemon, terrainType); + expect(text).toBe("terrain:mistyBlockMessage"); + }); + }); + + describe("ELECTRIC", () => { + const terrainType = TerrainType.ELECTRIC; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getTerrainName(terrainType); + expect(text).toBe("terrain:electric"); + }); + + it("should return the start text", () => { + mockI18next(); + + const text = getTerrainStartMessage(terrainType); + expect(text).toBe("terrain:electricStartMessage"); + }); + + it("should return the clear text", () => { + mockI18next(); + const text = getTerrainClearMessage(terrainType); + expect(text).toBe("terrain:electricClearMessage"); + }); + + it("should return the block text", async () => { + await game.startBattle([Species.MAGIKARP]); + const pokemon = game.scene.getPlayerPokemon()!; + mockI18next(); + const text = getTerrainBlockMessage(pokemon, terrainType); + expect(text).toBe("terrain:defaultBlockMessage"); + }); + }); + + describe("GRASSY", () => { + const terrainType = TerrainType.GRASSY; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getTerrainName(terrainType); + expect(text).toBe("terrain:grassy"); + }); + + it("should return the start text", () => { + mockI18next(); + + const text = getTerrainStartMessage(terrainType); + expect(text).toBe("terrain:grassyStartMessage"); + }); + + it("should return the clear text", () => { + mockI18next(); + const text = getTerrainClearMessage(terrainType); + expect(text).toBe("terrain:grassyClearMessage"); + }); + + it("should return the block text", async () => { + await game.startBattle([Species.MAGIKARP]); + const pokemon = game.scene.getPlayerPokemon()!; + mockI18next(); + const text = getTerrainBlockMessage(pokemon, terrainType); + expect(text).toBe("terrain:defaultBlockMessage"); + }); + }); + + describe("PSYCHIC", () => { + const terrainType = TerrainType.PSYCHIC; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getTerrainName(terrainType); + expect(text).toBe("terrain:psychic"); + }); + + it("should return the start text", () => { + mockI18next(); + + const text = getTerrainStartMessage(terrainType); + expect(text).toBe("terrain:psychicStartMessage"); + }); + + it("should return the clear text", () => { + mockI18next(); + const text = getTerrainClearMessage(terrainType); + expect(text).toBe("terrain:psychicClearMessage"); + }); + + it("should return the block text", async () => { + await game.startBattle([Species.MAGIKARP]); + const pokemon = game.scene.getPlayerPokemon()!; + mockI18next(); + const text = getTerrainBlockMessage(pokemon, terrainType); + expect(text).toBe("terrain:defaultBlockMessage"); + }); + }); + + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.resetAllMocks(); + }); +}); diff --git a/src/test/lokalisation/battle-stat.test.ts b/src/test/lokalisation/battle-stat.test.ts deleted file mode 100644 index d894d705947..00000000000 --- a/src/test/lokalisation/battle-stat.test.ts +++ /dev/null @@ -1,208 +0,0 @@ -import {beforeAll, describe, expect, it} from "vitest"; -import { getBattleStatName, getBattleStatLevelChangeDescription } from "#app/data/battle-stat.js"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { pokemonInfo as enPokemonInfo } from "#app/locales/en/pokemon-info.js"; -import { battle as enBattleStat } from "#app/locales/en/battle.js"; -import { pokemonInfo as dePokemonInfo } from "#app/locales/de/pokemon-info.js"; -import { battle as deBattleStat } from "#app/locales/de/battle.js"; -import { pokemonInfo as esPokemonInfo } from "#app/locales/es/pokemon-info.js"; -import { battle as esBattleStat } from "#app/locales/es/battle.js"; -import { pokemonInfo as frPokemonInfo } from "#app/locales/fr/pokemon-info.js"; -import { battle as frBattleStat } from "#app/locales/fr/battle.js"; -import { pokemonInfo as itPokemonInfo } from "#app/locales/it/pokemon-info.js"; -import { battle as itBattleStat } from "#app/locales/it/battle.js"; -import { pokemonInfo as koPokemonInfo } from "#app/locales/ko/pokemon-info.js"; -import { battle as koBattleStat } from "#app/locales/ko/battle.js"; -import { pokemonInfo as ptBrPokemonInfo } from "#app/locales/pt_BR/pokemon-info.js"; -import { battle as ptBrBattleStat } from "#app/locales/pt_BR/battle.js"; -import { pokemonInfo as zhCnPokemonInfo } from "#app/locales/zh_CN/pokemon-info.js"; -import { battle as zhCnBattleStat } from "#app/locales/zh_CN/battle.js"; -import { pokemonInfo as zhTwPokemonInfo } from "#app/locales/zh_TW/pokemon-info.js"; -import { battle as zhTwBattleStat } from "#app/locales/zh_TW/battle.js"; - -import i18next, {initI18n} from "#app/plugins/i18n"; -import { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; - -interface BattleStatTestUnit { - stat: BattleStat, - key: string -} - -interface BattleStatLevelTestUnit { - levels: integer, - up: boolean, - key: string -} - -function testBattleStatName(stat: BattleStat, expectMessage: string) { - const message = getBattleStatName(stat); - console.log(`message ${message}, expected ${expectMessage}`); - expect(message).toBe(expectMessage); -} - -function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string) { - const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up); - console.log(`message ${message}, expected ${expectMessage}`); - expect(message).toBe(expectMessage); -} - -describe("Test for BattleStat Localization", () => { - const battleStatUnits: BattleStatTestUnit[] = []; - const battleStatLevelUnits: BattleStatLevelTestUnit[] = []; - - beforeAll(() => { - initI18n(); - - battleStatUnits.push({ stat: BattleStat.ATK, key: "Stat.ATK" }); - battleStatUnits.push({ stat: BattleStat.DEF, key: "Stat.DEF" }); - battleStatUnits.push({ stat: BattleStat.SPATK, key: "Stat.SPATK" }); - battleStatUnits.push({ stat: BattleStat.SPDEF, key: "Stat.SPDEF" }); - battleStatUnits.push({ stat: BattleStat.SPD, key: "Stat.SPD" }); - battleStatUnits.push({ stat: BattleStat.ACC, key: "Stat.ACC" }); - battleStatUnits.push({ stat: BattleStat.EVA, key: "Stat.EVA" }); - - battleStatLevelUnits.push({ levels: 1, up: true, key: "statRose" }); - battleStatLevelUnits.push({ levels: 2, up: true, key: "statSharplyRose" }); - battleStatLevelUnits.push({ levels: 3, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 4, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 5, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 6, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 7, up: true, key: "statWontGoAnyHigher" }); - battleStatLevelUnits.push({ levels: 1, up: false, key: "statFell" }); - battleStatLevelUnits.push({ levels: 2, up: false, key: "statHarshlyFell" }); - battleStatLevelUnits.push({ levels: 3, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 4, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 5, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 6, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 7, up: false, key: "statWontGoAnyLower" }); - }); - - it("Test getBattleStatName() in English", async () => { - i18next.changeLanguage("en"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, enPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in English", async () => { - i18next.changeLanguage("en"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Español", async () => { - i18next.changeLanguage("es"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, esPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Español", async () => { - i18next.changeLanguage("es"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Italiano", async () => { - i18next.changeLanguage("it"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, itPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Italiano", async () => { - i18next.changeLanguage("it"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Français", async () => { - i18next.changeLanguage("fr"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, frPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Français", async () => { - i18next.changeLanguage("fr"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Deutsch", async () => { - i18next.changeLanguage("de"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, dePokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Deutsch", async () => { - i18next.changeLanguage("de"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Português (BR)", async () => { - i18next.changeLanguage("pt-BR"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, ptBrPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Português (BR)", async () => { - i18next.changeLanguage("pt-BR"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in 简体中文", async () => { - i18next.changeLanguage("zh-CN"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, zhCnPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in 简体中文", async () => { - i18next.changeLanguage("zh-CN"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in 繁體中文", async () => { - i18next.changeLanguage("zh-TW"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, zhTwPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in 繁體中文", async () => { - i18next.changeLanguage("zh-TW"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in 한국어", async () => { - await i18next.changeLanguage("ko"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, koPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in 한국어", async () => { - i18next.changeLanguage("ko", () => { - battleStatLevelUnits.forEach(unit => { - const processor = new KoreanPostpositionProcessor(); - const message = processor.process(koBattleStat[unit.key]); - testBattleStatLevelChangeDescription(unit.levels, unit.up, message); - }); - }); - }); -}); diff --git a/src/test/utils/misc.test.ts b/src/test/misc.test.ts similarity index 79% rename from src/test/utils/misc.test.ts rename to src/test/misc.test.ts index da67fb48192..1052a282a64 100644 --- a/src/test/utils/misc.test.ts +++ b/src/test/misc.test.ts @@ -1,8 +1,8 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import { apiFetch } from "#app/utils"; +import GameManager from "#test/utils/gameManager"; +import { waitUntil } from "#test/utils/gameManagerUtils"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import {apiFetch} from "#app/utils"; -import {waitUntil} from "#app/test/utils/gameManagerUtils"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Test misc", () => { let phaserGame: Phaser.Game; @@ -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,12 +54,12 @@ 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 () => { const data = await game.scene.cachedFetch("./battle-anims/splishy-splash.json"); - expect(data).not.toBeUndefined(); + expect(data).toBeDefined(); }); it("testing wait phase queue", 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/astonish.test.ts b/src/test/moves/astonish.test.ts new file mode 100644 index 00000000000..b21e2a06051 --- /dev/null +++ b/src/test/moves/astonish.test.ts @@ -0,0 +1,72 @@ +import { allMoves } from "#app/data/move"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { CommandPhase } from "#app/phases/command-phase"; +import { MoveEndPhase } from "#app/phases/move-end-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 GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Astonish", () => { + 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.moveset([Moves.ASTONISH, Moves.SPLASH]); + game.override.enemySpecies(Species.BLASTOISE); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.startingLevel(100); + game.override.enemyLevel(100); + + vi.spyOn(allMoves[Moves.ASTONISH], "chance", "get").mockReturnValue(100); + }); + + test( + "move effect should cancel the target's move on the turn it applies", + async () => { + await game.startBattle([Species.MEOWSCARADA]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ASTONISH); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeUndefined(); + + await game.phaseInterceptor.to(CommandPhase, false); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index e9c3d920717..fec280debf4 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -1,27 +1,23 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import Move, { allMoves } from "#app/data/move"; +import { WeatherType } from "#app/data/weather"; +import { Abilities } from "#app/enums/abilities"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import Pokemon from "#app/field/pokemon"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Abilities } from "#app/enums/abilities.js"; -import Pokemon from "#app/field/pokemon.js"; -import Move, { allMoves } from "#app/data/move.js"; -import { NumberHolder } from "#app/utils.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; -import { WeatherType } from "#app/data/weather.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Aurora Veil", () => { let phaserGame: Phaser.Game; let game: GameManager; const singleBattleMultiplier = 0.5; - const doubleBattleMultiplier = 2732/4096; + const doubleBattleMultiplier = 2732 / 4096; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -35,69 +31,67 @@ describe("Moves - Aurora Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.HAIL); + game.override.battleType("single"); + game.override.ability(Abilities.NONE); + game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + game.override.enemyLevel(100); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); + game.override.disableCrits(); + game.override.weather(WeatherType.HAIL); }); - it("reduces damage of physical attacks by half in a single battle", async() => { + it("reduces damage of physical attacks by half in a single battle", async () => { const moveToUse = Moves.TACKLE; await game.startBattle([Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); - it("reduces damage of physical attacks by a third in a double battle", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("reduces damage of physical attacks by a third in a double battle", async () => { + game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); - game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + game.move.select(moveToUse); + game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); - it("reduces damage of special attacks by half in a single battle", async() => { + it("reduces damage of special attacks by half in a single battle", async () => { const moveToUse = Moves.ABSORB; await game.startBattle([Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); - it("reduces damage of special attacks by a third in a double battle", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("reduces damage of special attacks by a third in a double battle", async () => { + game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); - game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + game.move.select(moveToUse); + game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); diff --git a/src/test/moves/baton_pass.test.ts b/src/test/moves/baton_pass.test.ts new file mode 100644 index 00000000000..1a4edafdd36 --- /dev/null +++ b/src/test/moves/baton_pass.test.ts @@ -0,0 +1,107 @@ +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"; + +describe("Moves - Baton Pass", () => { + 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) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([Moves.BATON_PASS, Moves.NASTY_PLOT, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY) + .disableCrits(); + }); + + it("transfers all stat stages when player uses it", async() => { + // arrange + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); + + // round 1 - buff + game.move.select(Moves.NASTY_PLOT); + await game.toNextTurn(); + + 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"); + + // assert + 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 () => { + // arrange + game.override + .startingWave(5) + .enemyMoveset(new Array(4).fill([Moves.NASTY_PLOT])); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); + + // round 1 - ai buffs + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // round 2 - 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); + + // assert + // check buffs are still there + 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); + expect(game.phaseInterceptor.log.slice(-4)).toEqual([ + "MoveEffectPhase", + "SwitchSummonPhase", + "SummonPhase", + "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/beak_blast.test.ts b/src/test/moves/beak_blast.test.ts new file mode 100644 index 00000000000..2a93dc00a54 --- /dev/null +++ b/src/test/moves/beak_blast.test.ts @@ -0,0 +1,136 @@ +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { StatusEffect } from "#app/enums/status-effect"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { MovePhase } from "#app/phases/move-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 GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Beak Blast", () => { + 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.UNNERVE) + .moveset([Moves.BEAK_BLAST]) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset(Array(4).fill(Moves.TACKLE)) + .startingLevel(100) + .enemyLevel(100); + }); + + it( + "should add a charge effect that burns attackers on contact", + async () => { + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); + }, TIMEOUT + ); + + it( + "should still charge and burn opponents if the user is sleeping", + async () => { + game.override.statusEffect(StatusEffect.SLEEP); + + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); + }, TIMEOUT + ); + + it( + "should not burn attackers that don't make contact", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.WATER_GUN)); + + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); + }, TIMEOUT + ); + + it( + "should only hit twice with Multi-Lens", + async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(leadPokemon.turnData.hitCount).toBe(2); + }, TIMEOUT + ); + + it( + "should be blocked by Protect", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.PROTECT)); + + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeUndefined(); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/beat_up.test.ts b/src/test/moves/beat_up.test.ts new file mode 100644 index 00000000000..ce1598a49b4 --- /dev/null +++ b/src/test/moves/beat_up.test.ts @@ -0,0 +1,104 @@ +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { StatusEffect } from "#app/enums/status-effect"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +const TIMEOUT = 20 * 1000; // 20 sec timeout + +describe("Moves - Beat Up", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyLevel(100); + game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.moveset([Moves.BEAT_UP]); + }); + + it( + "should hit once for each healthy player Pokemon", + async () => { + await game.startBattle([Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + let enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.BEAT_UP); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon.turnData.hitCount).toBe(6); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + + while (playerPokemon.turnData.hitsLeft > 0) { + enemyStartingHp = enemyPokemon.hp; + await game.phaseInterceptor.to(MoveEffectPhase); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } + }, TIMEOUT + ); + + it( + "should not count player Pokemon with status effects towards hit count", + async () => { + await game.startBattle([Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.scene.getParty()[1].trySetStatus(StatusEffect.BURN); + + game.move.select(Moves.BEAT_UP); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon.turnData.hitCount).toBe(5); + }, TIMEOUT + ); + + it( + "should hit twice for each player Pokemon if the user has Multi-Lens", + async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + await game.startBattle([Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + let enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.BEAT_UP); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon.turnData.hitCount).toBe(12); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + + while (playerPokemon.turnData.hitsLeft > 0) { + enemyStartingHp = enemyPokemon.hp; + await game.phaseInterceptor.to(MoveEffectPhase); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } + }, TIMEOUT + ); +}); diff --git a/src/test/moves/belly_drum.test.ts b/src/test/moves/belly_drum.test.ts new file mode 100644 index 00000000000..7024deb3f18 --- /dev/null +++ b/src/test/moves/belly_drum.test.ts @@ -0,0 +1,112 @@ +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"; +import { SPLASH_ONLY } from "../utils/testUtils"; +import { Abilities } from "#app/enums/abilities"; + +const TIMEOUT = 20 * 1000; +// RATIO : HP Cost of Move +const RATIO = 2; +// PREDAMAGE : Amount of extra HP lost +const PREDAMAGE = 15; + +describe("Moves - BELLY DRUM", () => { + 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 + .starterSpecies(Species.MAGIKARP) + .enemySpecies(Species.SNORLAX) + .startingLevel(100) + .enemyLevel(100) + .moveset([Moves.BELLY_DRUM]) + .enemyMoveset(SPLASH_ONLY) + .enemyAbility(Abilities.BALL_FETCH); + }); + + // Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move) + + 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()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + }, TIMEOUT + ); + + 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 - 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.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + }, TIMEOUT + ); + + 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.setStatStage(Stat.ATK, 6); + + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + }, TIMEOUT + ); + + test("fails if the user's health is less than 1/2", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + 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 new file mode 100644 index 00000000000..8511b3179c6 --- /dev/null +++ b/src/test/moves/ceaseless_edge.test.ts @@ -0,0 +1,119 @@ +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { 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, test, vi } from "vitest"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Ceaseless Edge", () => { + 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.enemyAbility(Abilities.RUN_AWAY); + game.override.enemyPassiveAbility(Abilities.RUN_AWAY); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); + + }); + + test( + "move should hit and apply spikes", + async () => { + await game.startBattle([Species.ILLUMISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.CEASELESS_EDGE); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + + await game.phaseInterceptor.to(TurnEndPhase); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(1); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }, TIMEOUT + ); + + test( + "move should hit twice with multi lens and apply two layers of spikes", + async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS" }]); + await game.startBattle([Species.ILLUMISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.CEASELESS_EDGE); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + + await game.phaseInterceptor.to(TurnEndPhase); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(2); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }, TIMEOUT + ); + + test( + "trainer - move should hit twice, apply two layers of spikes, force switch opponent - opponent takes damage", + async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS" }]); + game.override.startingWave(5); + + await game.startBattle([Species.ILLUMISE]); + + game.move.select(Moves.CEASELESS_EDGE); + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + + await game.phaseInterceptor.to(TurnEndPhase, false); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(2); + + const hpBeforeSpikes = game.scene.currentBattle.enemyParty[1].hp; + // Check HP of pokemon that WILL BE switched in (index 1) + game.forceEnemyToSwitch(); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase, false); + expect(game.scene.currentBattle.enemyParty[0].hp).toBeLessThan(hpBeforeSpikes); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/clangorous_soul.test.ts b/src/test/moves/clangorous_soul.test.ts new file mode 100644 index 00000000000..9bd3bc2379e --- /dev/null +++ b/src/test/moves/clangorous_soul.test.ts @@ -0,0 +1,129 @@ +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 { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; + +const TIMEOUT = 20 * 1000; +/** HP Cost of Move */ +const RATIO = 3; +/** Amount of extra HP lost */ +const PREDAMAGE = 15; + +describe("Moves - Clangorous Soul", () => { + 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.starterSpecies(Species.MAGIKARP); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.CLANGOROUS_SOUL]); + game.override.enemyMoveset(SPLASH_ONLY); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move) + + 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 = 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.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 + ); + + 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 = Math.floor(leadPokemon.getMaxHp() / RATIO); + + //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.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 + ); + + it("fails if all stat stages involved are at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + 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.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 + ); + + 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 = 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.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 new file mode 100644 index 00000000000..e73a1fd256d --- /dev/null +++ b/src/test/moves/crafty_shield.test.ts @@ -0,0 +1,124 @@ +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; + +describe("Moves - Crafty Shield", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("double"); + + game.override.moveset([Moves.CRAFTY_SHIELD, Moves.SPLASH, Moves.SWORDS_DANCE]); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test( + "should protect the user and allies from status moves", + async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.CRAFTY_SHIELD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }, TIMEOUT + ); + + test( + "should not protect the user and allies from attack moves", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.CRAFTY_SHIELD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); + }, TIMEOUT + ); + + test( + "should protect the user and allies from moves that ignore other protection", + async () => { + game.override.enemySpecies(Species.DUSCLOPS); + game.override.enemyMoveset(Array(4).fill(Moves.CURSE)); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.CRAFTY_SHIELD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.getTag(BattlerTagType.CURSED)).toBeUndefined()); + }, TIMEOUT + ); + + test( + "should not block allies' self-targeted moves", + async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.CRAFTY_SHIELD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SWORDS_DANCE, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon[0].getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon[1].getStatStage(Stat.ATK)).toBe(2); + } + ); +}); diff --git a/src/test/moves/disable.test.ts b/src/test/moves/disable.test.ts new file mode 100644 index 00000000000..3d207035ce3 --- /dev/null +++ b/src/test/moves/disable.test.ts @@ -0,0 +1,129 @@ +import { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Disable", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([Moves.DISABLE, Moves.SPLASH]) + .enemyMoveset(SPLASH_ONLY) + .starterSpecies(Species.PIKACHU) + .enemySpecies(Species.SHUCKLE); + }); + + it("restricts moves", async () => { + await game.classicMode.startBattle(); + + const enemyMon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DISABLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(enemyMon.getMoveHistory()).toHaveLength(1); + expect(enemyMon.isMoveRestricted(Moves.SPLASH)).toBe(true); + }); + + it("fails if enemy has no move history", async() => { + await game.classicMode.startBattle(); + + const playerMon = game.scene.getPlayerPokemon()!; + const enemyMon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DISABLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + + expect(playerMon.getMoveHistory()[0]).toMatchObject({ move: Moves.DISABLE, result: MoveResult.FAIL }); + expect(enemyMon.isMoveRestricted(Moves.SPLASH)).toBe(false); + }, 20000); + + it("causes STRUGGLE if all usable moves are disabled", async() => { + await game.classicMode.startBattle(); + + const enemyMon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DISABLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + const enemyHistory = enemyMon.getMoveHistory(); + expect(enemyHistory).toHaveLength(2); + expect(enemyHistory[0].move).toBe(Moves.SPLASH); + expect(enemyHistory[1].move).toBe(Moves.STRUGGLE); + }, 20000); + + it("cannot disable STRUGGLE", async() => { + game.override.enemyMoveset(Array(4).fill(Moves.STRUGGLE)); + await game.classicMode.startBattle(); + + const playerMon = game.scene.getPlayerPokemon()!; + const enemyMon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DISABLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(playerMon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyMon.getLastXMoves()[0].move).toBe(Moves.STRUGGLE); + expect(enemyMon.isMoveRestricted(Moves.STRUGGLE)).toBe(false); + }, 20000); + + it("interrupts target's move when target moves after", async() => { + await game.classicMode.startBattle(); + + const enemyMon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // Both mons just used Splash last turn; now have player use Disable. + game.move.select(Moves.DISABLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + + const enemyHistory = enemyMon.getMoveHistory(); + expect(enemyHistory).toHaveLength(2); + expect(enemyHistory[0]).toMatchObject({ move: Moves.SPLASH, result: MoveResult.SUCCESS }); + expect(enemyHistory[1].result).toBe(MoveResult.FAIL); + }, 20000); + + it("disables NATURE POWER, not the move invoked by it", async() => { + game.override.enemyMoveset(Array(4).fill(Moves.NATURE_POWER)); + await game.classicMode.startBattle(); + + const enemyMon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DISABLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(enemyMon.isMoveRestricted(Moves.NATURE_POWER)).toBe(true); + expect(enemyMon.isMoveRestricted(enemyMon.getLastXMoves(2)[1].move)).toBe(false); + }, 20000); +}); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts new file mode 100644 index 00000000000..fa224c8df9e --- /dev/null +++ b/src/test/moves/double_team.test.ts @@ -0,0 +1,51 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#app/enums/abilities"; +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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Double Team", () => { + 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.moveset([Moves.DOUBLE_TEAM]); + game.override.disableCrits(); + game.override.ability(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + }); + + 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.getStatStage(Stat.EVA)).toBe(0); + + game.move.select(Moves.DOUBLE_TEAM); + await game.phaseInterceptor.to(TurnEndPhase); + await game.toNextTurn(); + + expect(ally.getStatStage(Stat.EVA)).toBe(1); + expect(enemy.getAccuracyMultiplier).toHaveReturnedWith(.75); + }); +}); diff --git a/src/test/moves/dragon_cheer.test.ts b/src/test/moves/dragon_cheer.test.ts new file mode 100644 index 00000000000..747d71bd000 --- /dev/null +++ b/src/test/moves/dragon_cheer.test.ts @@ -0,0 +1,101 @@ +import { BattlerIndex } from "#app/battle"; +import { Type } from "#app/data/type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +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, expect, it, vi } from "vitest"; + +describe("Moves - Dragon Cheer", () => { + 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("double") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(20) + .moveset([Moves.DRAGON_CHEER, Moves.TACKLE, Moves.SPLASH]); + }); + + it("increases the user's allies' critical hit ratio by one stage", async () => { + await game.classicMode.startBattle([Species.DRAGONAIR, Species.MAGIKARP]); + + const enemy = game.scene.getEnemyField()[0]; + + vi.spyOn(enemy, "getCritStage"); + + game.move.select(Moves.DRAGON_CHEER, 0); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + // After Tackle + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender + }, TIMEOUT); + + it("increases the user's Dragon-type allies' critical hit ratio by two stages", async () => { + await game.classicMode.startBattle([Species.MAGIKARP, Species.DRAGONAIR]); + + const enemy = game.scene.getEnemyField()[0]; + + vi.spyOn(enemy, "getCritStage"); + + game.move.select(Moves.DRAGON_CHEER, 0); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + // After Tackle + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getCritStage).toHaveReturnedWith(2); // getCritStage is called on defender + }, TIMEOUT); + + it("applies the effect based on the allies' type upon use of the move, and do not change if the allies' type changes later in battle", async () => { + await game.classicMode.startBattle([Species.DRAGONAIR, Species.MAGIKARP]); + + const magikarp = game.scene.getPlayerField()[1]; + const enemy = game.scene.getEnemyField()[0]; + + vi.spyOn(enemy, "getCritStage"); + + game.move.select(Moves.DRAGON_CHEER, 0); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + // After Tackle + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender + + await game.toNextTurn(); + + // Change Magikarp's type to Dragon + vi.spyOn(magikarp, "getTypes").mockReturnValue([Type.DRAGON]); + expect(magikarp.getTypes()).toEqual([Type.DRAGON]); + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender + }, TIMEOUT); +}); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts new file mode 100644 index 00000000000..5da6e082ce5 --- /dev/null +++ b/src/test/moves/dragon_rage.test.ts @@ -0,0 +1,128 @@ +import { Stat } from "#enums/stat"; +import { Type } from "#app/data/type"; +import { Species } from "#app/enums/species"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +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 - Dragon Rage", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let partyPokemon: PlayerPokemon; + let enemyPokemon: EnemyPokemon; + + const dragonRageDamage = 40; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + + game.override.battleType("single"); + + game.override.starterSpecies(Species.SNORLAX); + game.override.moveset([Moves.DRAGON_RAGE]); + game.override.ability(Abilities.BALL_FETCH); + game.override.passiveAbility(Abilities.BALL_FETCH); + game.override.startingLevel(100); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyPassiveAbility(Abilities.BALL_FETCH); + game.override.enemyLevel(100); + + await game.startBattle(); + + partyPokemon = game.scene.getParty()[0]; + enemyPokemon = game.scene.getEnemyPokemon()!; + + // remove berries + game.scene.removePartyMemberModifiers(0); + game.scene.clearEnemyHeldItemModifiers(); + }); + + it("ignores weaknesses", async () => { + game.override.disableCrits(); + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([Type.DRAGON]); + + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); + }); + + it("ignores resistances", async () => { + game.override.disableCrits(); + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([Type.STEEL]); + + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); + }); + + it("ignores SPATK stat stages", async () => { + game.override.disableCrits(); + partyPokemon.setStatStage(Stat.SPATK, 2); + + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); + }); + + it("ignores stab", async () => { + game.override.disableCrits(); + vi.spyOn(partyPokemon, "getTypes").mockReturnValue([Type.DRAGON]); + + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); + }); + + it("ignores criticals", async () => { + partyPokemon.addTag(BattlerTagType.ALWAYS_CRIT, 99); + + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); + }); + + 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); + + expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); + }); + + it("ignores multi hit", async () => { + game.override.disableCrits(); + game.scene.addModifier(modifierTypes.MULTI_LENS().newModifier(partyPokemon), false); + + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); + }); +}); diff --git a/src/test/moves/dragon_tail.test.ts b/src/test/moves/dragon_tail.test.ts new file mode 100644 index 00000000000..362383e2fe3 --- /dev/null +++ b/src/test/moves/dragon_tail.test.ts @@ -0,0 +1,147 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { BattleEndPhase } from "#app/phases/battle-end-phase"; +import { BerryPhase } from "#app/phases/berry-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, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Dragon Tail", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single") + .moveset([Moves.DRAGON_TAIL, Moves.SPLASH]) + .enemySpecies(Species.WAILORD) + .enemyMoveset(SPLASH_ONLY) + .startingLevel(5) + .enemyLevel(5); + + vi.spyOn(allMoves[Moves.DRAGON_TAIL], "accuracy", "get").mockReturnValue(100); + }); + + test( + "Single battle should cause opponent to flee, and not crash", + async () => { + await game.startBattle([Species.DRATINI]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DRAGON_TAIL); + + await game.phaseInterceptor.to(BerryPhase); + + const isVisible = enemyPokemon.visible; + const hasFled = enemyPokemon.wildFlee; + expect(!isVisible && hasFled).toBe(true); + + // simply want to test that the game makes it this far without crashing + await game.phaseInterceptor.to(BattleEndPhase); + }, TIMEOUT + ); + + test( + "Single battle should cause opponent to flee, display ability, and not crash", + async () => { + game.override.enemyAbility(Abilities.ROUGH_SKIN); + await game.startBattle([Species.DRATINI]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DRAGON_TAIL); + + await game.phaseInterceptor.to(BerryPhase); + + const isVisible = enemyPokemon.visible; + const hasFled = enemyPokemon.wildFlee; + expect(!isVisible && hasFled).toBe(true); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + test( + "Double battles should proceed without crashing", + async () => { + game.override.battleType("double").enemyMoveset(SPLASH_ONLY); + game.override.moveset([Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER]) + .enemyAbility(Abilities.ROUGH_SKIN); + await game.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]); + + const leadPokemon = game.scene.getParty()[0]!; + + const enemyLeadPokemon = game.scene.getEnemyParty()[0]!; + const enemySecPokemon = game.scene.getEnemyParty()[1]!; + + game.move.select(Moves.DRAGON_TAIL, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(TurnEndPhase); + + const isVisibleLead = enemyLeadPokemon.visible; + const hasFledLead = enemyLeadPokemon.wildFlee; + const isVisibleSec = enemySecPokemon.visible; + const hasFledSec = enemySecPokemon.wildFlee; + expect(!isVisibleLead && hasFledLead && isVisibleSec && !hasFledSec).toBe(true); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + + // second turn + game.move.select(Moves.FLAMETHROWER, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase); + expect(enemySecPokemon.hp).toBeLessThan(enemySecPokemon.getMaxHp()); + }, TIMEOUT + ); + + test( + "Flee move redirection works", + async () => { + game.override.battleType("double").enemyMoveset(SPLASH_ONLY); + game.override.moveset([Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER]); + game.override.enemyAbility(Abilities.ROUGH_SKIN); + await game.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]); + + const leadPokemon = game.scene.getParty()[0]!; + const secPokemon = game.scene.getParty()[1]!; + + const enemyLeadPokemon = game.scene.getEnemyParty()[0]!; + const enemySecPokemon = game.scene.getEnemyParty()[1]!; + + game.move.select(Moves.DRAGON_TAIL, 0, BattlerIndex.ENEMY); + // target the same pokemon, second move should be redirected after first flees + game.move.select(Moves.DRAGON_TAIL, 1, BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(BerryPhase); + + const isVisibleLead = enemyLeadPokemon.visible; + const hasFledLead = enemyLeadPokemon.wildFlee; + const isVisibleSec = enemySecPokemon.visible; + const hasFledSec = enemySecPokemon.wildFlee; + expect(!isVisibleLead && hasFledLead && !isVisibleSec && hasFledSec).toBe(true); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + expect(secPokemon.hp).toBeLessThan(secPokemon.getMaxHp()); + expect(enemyLeadPokemon.hp).toBeLessThan(enemyLeadPokemon.getMaxHp()); + expect(enemySecPokemon.hp).toBeLessThan(enemySecPokemon.getMaxHp()); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts new file mode 100644 index 00000000000..6ac0befdb36 --- /dev/null +++ b/src/test/moves/dynamax_cannon.test.ts @@ -0,0 +1,171 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +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"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Dynamax Cannon", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const dynamaxCannon = allMoves[Moves.DYNAMAX_CANNON]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.moveset([dynamaxCannon.id]); + game.override.startingLevel(200); + + // Note that, for Waves 1-10, the level cap is 10 + game.override.startingWave(1); + game.override.battleType("single"); + game.override.disableCrits(); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + + vi.spyOn(dynamaxCannon, "calculateBattlePower"); + }); + + it("should return 100 power against an enemy below level cap", async () => { + game.override.enemyLevel(1); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.move.select(dynamaxCannon.id); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(dynamaxCannon.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(100); + }, 20000); + + it("should return 100 power against an enemy at level cap", async () => { + game.override.enemyLevel(10); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.move.select(dynamaxCannon.id); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(dynamaxCannon.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(100); + }, 20000); + + it("should return 120 power against an enemy 1% above level cap", async () => { + game.override.enemyLevel(101); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.move.select(dynamaxCannon.id); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + expect(phase.move.moveId).toBe(dynamaxCannon.id); + // Force level cap to be 100 + vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamagePhase, false); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(120); + }, 20000); + + it("should return 140 power against an enemy 2% above level capp", async () => { + game.override.enemyLevel(102); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.move.select(dynamaxCannon.id); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + expect(phase.move.moveId).toBe(dynamaxCannon.id); + // Force level cap to be 100 + vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamagePhase, false); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(140); + }, 20000); + + it("should return 160 power against an enemy 3% above level cap", async () => { + game.override.enemyLevel(103); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.move.select(dynamaxCannon.id); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + expect(phase.move.moveId).toBe(dynamaxCannon.id); + // Force level cap to be 100 + vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamagePhase, false); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(160); + }, 20000); + + it("should return 180 power against an enemy 4% above level cap", async () => { + game.override.enemyLevel(104); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.move.select(dynamaxCannon.id); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + expect(phase.move.moveId).toBe(dynamaxCannon.id); + // Force level cap to be 100 + vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamagePhase, false); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(180); + }, 20000); + + it("should return 200 power against an enemy 5% above level cap", async () => { + game.override.enemyLevel(105); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.move.select(dynamaxCannon.id); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + expect(phase.move.moveId).toBe(dynamaxCannon.id); + // Force level cap to be 100 + vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamagePhase, false); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("should return 200 power against an enemy way above level cap", async () => { + game.override.enemyLevel(999); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.move.select(dynamaxCannon.id); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(dynamaxCannon.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); +}); diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts new file mode 100644 index 00000000000..af44586b69d --- /dev/null +++ b/src/test/moves/effectiveness.test.ts @@ -0,0 +1,70 @@ +import { allMoves } from "#app/data/move"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import * as Messages from "#app/messages"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; + +function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Species, + expected: number, targetAbility: Abilities = Abilities.BALL_FETCH): void { + // Suppress getPokemonNameWithAffix because it calls on a null battle spec + vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); + game.override.enemyAbility(targetAbility); + const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); + const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); + + expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); +} + +describe("Moves - Type Effectiveness", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + game = new GameManager(phaserGame); + game.override.ability(Abilities.BALL_FETCH); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("Normal-type attacks are neutrally effective against Normal-type Pokemon", + () => testMoveEffectiveness(game, Moves.TACKLE, Species.SNORLAX, 1) + ); + + it("Normal-type attacks are not very effective against Steel-type Pokemon", + () => testMoveEffectiveness(game, Moves.TACKLE, Species.REGISTEEL, 0.5) + ); + + it("Normal-type attacks are doubly resisted by Steel/Rock-type Pokemon", + () => testMoveEffectiveness(game, Moves.TACKLE, Species.AGGRON, 0.25) + ); + + it("Normal-type attacks have no effect on Ghost-type Pokemon", + () => testMoveEffectiveness(game, Moves.TACKLE, Species.DUSCLOPS, 0) + ); + + it("Normal-type status moves are not affected by type matchups", + () => testMoveEffectiveness(game, Moves.GROWL, Species.DUSCLOPS, 1) + ); + + it("Electric-type attacks are super-effective against Water-type Pokemon", + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.BLASTOISE, 2) + ); + + it("Electric-type attacks are doubly super-effective against Water/Flying-type Pokemon", + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 4) + ); + + it("Electric-type attacks are negated by Volt Absorb", + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB) + ); +}); 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 new file mode 100644 index 00000000000..a639a86c5c1 --- /dev/null +++ b/src/test/moves/fillet_away.test.ts @@ -0,0 +1,118 @@ +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"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +const TIMEOUT = 20 * 1000; +/** HP Cost of Move */ +const RATIO = 2; +/** Amount of extra HP lost */ +const PREDAMAGE = 15; + +describe("Moves - FILLET AWAY", () => { + 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.starterSpecies(Species.MAGIKARP); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.FILLET_AWAY]); + game.override.enemyMoveset(SPLASH_ONLY); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move) + + 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()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(2); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); + }, TIMEOUT + ); + + 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 - 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.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(5); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); + }, TIMEOUT + ); + + test("fails if all stat stages involved are at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + 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.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); + }, TIMEOUT + ); + + test("fails if the user's health is less than 1/2", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + 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 new file mode 100644 index 00000000000..34612d1fb18 --- /dev/null +++ b/src/test/moves/fissure.test.ts @@ -0,0 +1,90 @@ +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"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +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 - Fissure", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let partyPokemon: PlayerPokemon; + let enemyPokemon: EnemyPokemon; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + + game.override.battleType("single"); + game.override.disableCrits(); + + game.override.starterSpecies(Species.SNORLAX); + game.override.moveset([Moves.FISSURE]); + game.override.passiveAbility(Abilities.BALL_FETCH); + game.override.startingLevel(100); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyPassiveAbility(Abilities.BALL_FETCH); + game.override.enemyLevel(100); + + await game.startBattle(); + + partyPokemon = game.scene.getParty()[0]; + enemyPokemon = game.scene.getEnemyPokemon()!; + + // remove berries + game.scene.removePartyMemberModifiers(0); + game.scene.clearEnemyHeldItemModifiers(); + }); + + it("ignores damage modification from abilities, for example FUR_COAT", async () => { + game.override.ability(Abilities.NO_GUARD); + game.override.enemyAbility(Abilities.FUR_COAT); + + game.move.select(Moves.FISSURE); + await game.phaseInterceptor.to(DamagePhase, true); + + expect(enemyPokemon.isFainted()).toBe(true); + }); + + it("ignores user's ACC stat stage", async () => { + vi.spyOn(partyPokemon, "getAccuracyMultiplier"); + + partyPokemon.setStatStage(Stat.ACC, -6); + + game.move.select(Moves.FISSURE); + + // wait for TurnEndPhase instead of DamagePhase as fissure might not actually inflict damage + await game.phaseInterceptor.to(TurnEndPhase); + + expect(partyPokemon.getAccuracyMultiplier).toHaveReturnedWith(1); + }); + + it("ignores target's EVA stat stage", async () => { + vi.spyOn(partyPokemon, "getAccuracyMultiplier"); + + enemyPokemon.setStatStage(Stat.EVA, 6); + + game.move.select(Moves.FISSURE); + + // wait for TurnEndPhase instead of DamagePhase as fissure might not actually inflict damage + await game.phaseInterceptor.to(TurnEndPhase); + + expect(partyPokemon.getAccuracyMultiplier).toHaveReturnedWith(1); + }); +}); diff --git a/src/test/moves/flame_burst.test.ts b/src/test/moves/flame_burst.test.ts new file mode 100644 index 00000000000..2777b8178b8 --- /dev/null +++ b/src/test/moves/flame_burst.test.ts @@ -0,0 +1,105 @@ +import { allAbilities } from "#app/data/ability"; +import { Abilities } from "#app/enums/abilities"; +import Pokemon from "#app/field/pokemon"; +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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Flame Burst", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + /** + * Calculates the effect damage of Flame Burst which is 1/16 of the target ally's max HP + * See Flame Burst {@link https://bulbapedia.bulbagarden.net/wiki/Flame_Burst_(move)} + * See Flame Burst's move attribute {@linkcode FlameBurstAttr} + * @param pokemon {@linkcode Pokemon} - The ally of the move's target + * @returns Effect damage of Flame Burst + */ + const getEffectDamage = (pokemon: Pokemon): number => { + return Math.max(1, Math.floor(pokemon.getMaxHp() * 1 / 16)); + }; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("double"); + game.override.moveset([Moves.FLAME_BURST, Moves.SPLASH]); + game.override.disableCrits(); + game.override.ability(Abilities.UNNERVE); + game.override.startingWave(4); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); + }); + + it("inflicts damage to the target's ally equal to 1/16 of its max HP", async () => { + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); + + game.move.select(Moves.FLAME_BURST, 0, leftEnemy.getBattlerIndex()); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leftEnemy.hp).toBeLessThan(leftEnemy.getMaxHp()); + expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp() - getEffectDamage(rightEnemy)); + }); + + it("does not inflict damage to the target's ally if the target was not affected by Flame Burst", async () => { + game.override.enemyAbility(Abilities.FLASH_FIRE); + + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); + + game.move.select(Moves.FLAME_BURST, 0, leftEnemy.getBattlerIndex()); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leftEnemy.hp).toBe(leftEnemy.getMaxHp()); + expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp()); + }); + + it("does not interact with the target ally's abilities", async () => { + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); + + vi.spyOn(rightEnemy, "getAbility").mockReturnValue(allAbilities[Abilities.FLASH_FIRE]); + + game.move.select(Moves.FLAME_BURST, 0, leftEnemy.getBattlerIndex()); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leftEnemy.hp).toBeLessThan(leftEnemy.getMaxHp()); + expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp() - getEffectDamage(rightEnemy)); + }); + + it("effect damage is prevented by Magic Guard", async () => { + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); + + vi.spyOn(rightEnemy, "getAbility").mockReturnValue(allAbilities[Abilities.MAGIC_GUARD]); + + game.move.select(Moves.FLAME_BURST, 0, leftEnemy.getBattlerIndex()); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leftEnemy.hp).toBeLessThan(leftEnemy.getMaxHp()); + expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp()); + }); + + it("is not affected by protection moves and Endure", async () => { + // TODO: update this test when it's possible to select move for each enemy + }, { skip: true }); +}); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index f94af93fc66..ffe8ae995d3 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -1,18 +1,15 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { - TurnEndPhase, -} from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#enums/stat"; +import { SemiInvulnerableTag } from "#app/data/battler-tags"; +import { Type } from "#app/data/type"; +import { Biome } from "#app/enums/biome"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { Biome } from "#app/enums/biome.js"; -import { Type } from "#app/data/type.js"; -import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; +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("Moves - Flower Shield", () => { let phaserGame: Phaser.Game; @@ -30,35 +27,32 @@ describe("Moves - Flower Shield", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.ability(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); + game.override.battleType("single"); + game.override.moveset([Moves.FLOWER_SHIELD, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); - it("increases defense of all Grass-type Pokemon on the field by one stage - single battle", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHERRIM); + 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(); + 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.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + 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 () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + 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]); const field = game.scene.getField(true); @@ -66,55 +60,55 @@ 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.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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 () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PARAS); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); + 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); await game.startBattle([Species.CHERRIM]); - const paras = game.scene.getEnemyPokemon(); - const cherrim = game.scene.getPlayerPokemon(); + 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.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + 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 () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + 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(); + 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.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + 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 new file mode 100644 index 00000000000..249647f0294 --- /dev/null +++ b/src/test/moves/focus_punch.test.ts @@ -0,0 +1,135 @@ +import { BerryPhase } from "#app/phases/berry-phase"; +import { MessagePhase } from "#app/phases/message-phase"; +import { MoveHeaderPhase } from "#app/phases/move-header-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { TurnStartPhase } from "#app/phases/turn-start-phase"; +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"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Focus Punch", () => { + 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.UNNERVE) + .moveset([Moves.FOCUS_PUNCH]) + .enemySpecies(Species.GROUDON) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset(SPLASH_ONLY) + .startingLevel(100) + .enemyLevel(100); + }); + + it( + "should deal damage at the end of turn if uninterrupted", + async () => { + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to(MessagePhase); + + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(0); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(leadPokemon.turnData.damageDealt).toBe(enemyStartingHp - enemyPokemon.hp); + }, TIMEOUT + ); + + it( + "should fail if the user is hit", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to(MessagePhase); + + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(0); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(leadPokemon.turnData.damageDealt).toBe(0); + }, TIMEOUT + ); + + it( + "should be cancelled if the user falls asleep mid-turn", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SPORE)); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to(MessagePhase); // Header message + + expect(leadPokemon.getMoveHistory().length).toBe(0); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }, TIMEOUT + ); + + it( + "should not queue its pre-move message before an enemy switches", + async () => { + /** Guarantee a Trainer battle with multiple enemy Pokemon */ + game.override.startingWave(25); + + await game.startBattle([Species.CHARIZARD]); + + game.forceEnemyToSwitch(); + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to(TurnStartPhase); + + expect(game.scene.getCurrentPhase() instanceof SwitchSummonPhase).toBeTruthy(); + expect(game.scene.phaseQueue.find(phase => phase instanceof MoveHeaderPhase)).toBeDefined(); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index f0b80ab90c0..7d0c4fdb546 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -1,18 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, - SelectTargetPhase, - TurnEndPhase, -} from "#app/phases"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#enums/stat"; +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; -import { Abilities } from "#app/enums/abilities.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -32,138 +26,105 @@ describe("Moves - Follow Me", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + 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.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(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); - const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY); - const playerStartingHp = playerPokemon.map(p => p.hp); + // 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); - game.doAttack(getMovePosition(game.scene, 0, Moves.FOLLOW_ME)); - await game.phaseInterceptor.to(CommandPhase); - - game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - - game.doSelectTarget(BattlerIndex.ENEMY); await game.phaseInterceptor.to(TurnEndPhase, false); - expect(playerPokemon[0].hp).toBeLessThan(playerStartingHp[0]); - expect(playerPokemon[1].hp).toBe(playerStartingHp[1]); + 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(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); - const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.FOLLOW_ME, 1); - const playerStartingHp = playerPokemon.map(p => p.hp); + // Each player is targeted by an enemy + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - game.doAttack(getMovePosition(game.scene, 0, Moves.FOLLOW_ME)); - await game.phaseInterceptor.to(CommandPhase); - - game.doAttack(getMovePosition(game.scene, 1, Moves.FOLLOW_ME)); await game.phaseInterceptor.to(TurnEndPhase, false); - playerPokemon.sort((a, b) => a.getBattleStat(Stat.SPD) - b.getBattleStat(Stat.SPD)); + 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 ); test( "move effect should be bypassed by Stalwart", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STALWART); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.QUICK_ATTACK ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + game.override.ability(Abilities.STALWART); + game.override.moveset([Moves.QUICK_ATTACK]); - await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - const enemyStartingHp = enemyPokemon.map(p => p.hp); + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY); - await game.phaseInterceptor.to(CommandPhase); + // Target doesn't need to be specified if the move is self-targeted + await game.forceEnemyMove(Moves.FOLLOW_ME); + await game.forceEnemyMove(Moves.SPLASH); - game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY_2); await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); - expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); }, TIMEOUT ); test( "move effect should be bypassed by Snipe Shot", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SNIPE_SHOT ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + game.override.moveset([Moves.SNIPE_SHOT]); - await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - const enemyStartingHp = enemyPokemon.map(p => p.hp); + game.move.select(Moves.SNIPE_SHOT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SNIPE_SHOT, 1, BattlerIndex.ENEMY_2); - game.doAttack(getMovePosition(game.scene, 0, Moves.SNIPE_SHOT)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY); - await game.phaseInterceptor.to(CommandPhase); + await game.forceEnemyMove(Moves.FOLLOW_ME); + await game.forceEnemyMove(Moves.SPLASH); - game.doAttack(getMovePosition(game.scene, 1, Moves.SNIPE_SHOT)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY_2); await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); - expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); }, TIMEOUT ); }); diff --git a/src/test/moves/foresight.test.ts b/src/test/moves/foresight.test.ts new file mode 100644 index 00000000000..b856ec0f852 --- /dev/null +++ b/src/test/moves/foresight.test.ts @@ -0,0 +1,71 @@ +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +describe("Moves - Foresight", () => { + 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 + .disableCrits() + .enemySpecies(Species.GASTLY) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(5) + .starterSpecies(Species.MAGIKARP) + .moveset([Moves.FORESIGHT, Moves.QUICK_ATTACK, Moves.MACH_PUNCH]); + }); + + it("should allow Normal and Fighting moves to hit Ghost types", async () => { + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.QUICK_ATTACK); + await game.toNextTurn(); + expect(enemy.hp).toBe(enemy.getMaxHp()); + + game.move.select(Moves.FORESIGHT); + await game.toNextTurn(); + game.move.select(Moves.QUICK_ATTACK); + await game.toNextTurn(); + + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + enemy.hp = enemy.getMaxHp(); + + game.move.select(Moves.MACH_PUNCH); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + }); + + it("should ignore target's evasiveness boosts", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.MINIMIZE)); + await game.startBattle(); + + const pokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(pokemon, "getAccuracyMultiplier"); + + game.move.select(Moves.FORESIGHT); + await game.toNextTurn(); + game.move.select(Moves.QUICK_ATTACK); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(pokemon.getAccuracyMultiplier).toHaveReturnedWith(1); + }); +}); 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 new file mode 100644 index 00000000000..ae42d5b6dc6 --- /dev/null +++ b/src/test/moves/freezy_frost.test.ts @@ -0,0 +1,61 @@ +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 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", () => { + 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.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); + }); + + 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()!; + + 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); + expect(user.getStatStage(Stat.ATK)).toBe(2); + expect(enemy.getStatStage(Stat.ATK)).toBe(-2); + + 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_bolt.test.ts b/src/test/moves/fusion_bolt.test.ts new file mode 100644 index 00000000000..db31863ad03 --- /dev/null +++ b/src/test/moves/fusion_bolt.test.ts @@ -0,0 +1,52 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Fusion Bolt", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const fusionBolt = Moves.FUSION_BOLT; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.moveset([fusionBolt]); + game.override.startingLevel(1); + + game.override.enemySpecies(Species.RESHIRAM); + game.override.enemyAbility(Abilities.ROUGH_SKIN); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + + game.override.battleType("single"); + game.override.startingWave(97); + game.override.disableCrits(); + }); + + it("should not make contact", async () => { + await game.startBattle([ + Species.ZEKROM, + ]); + + const partyMember = game.scene.getPlayerPokemon()!; + const initialHp = partyMember.hp; + + game.move.select(fusionBolt); + + await game.toNextTurn(); + + expect(initialHp - partyMember.hp).toBe(0); + }, 20000); +}); diff --git a/src/test/moves/fusion_flare.test.ts b/src/test/moves/fusion_flare.test.ts new file mode 100644 index 00000000000..0a8f6f9115d --- /dev/null +++ b/src/test/moves/fusion_flare.test.ts @@ -0,0 +1,58 @@ +import { StatusEffect } from "#app/data/status-effect"; +import { TurnStartPhase } from "#app/phases/turn-start-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"; + +describe("Moves - Fusion Flare", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const fusionFlare = Moves.FUSION_FLARE; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.moveset([fusionFlare]); + game.override.startingLevel(1); + + game.override.enemySpecies(Species.RATTATA); + game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]); + + game.override.battleType("single"); + game.override.startingWave(97); + game.override.disableCrits(); + }); + + it("should thaw freeze status condition", async () => { + await game.startBattle([ + Species.RESHIRAM, + ]); + + const partyMember = game.scene.getPlayerPokemon()!; + + game.move.select(fusionFlare); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Inflict freeze quietly and check if it was properly inflicted + partyMember.trySetStatus(StatusEffect.FREEZE, false); + expect(partyMember.status!.effect).toBe(StatusEffect.FREEZE); + + await game.toNextTurn(); + + // Check if FUSION_FLARE thawed freeze + expect(partyMember.status?.effect).toBeUndefined(); + }); +}); diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/src/test/moves/fusion_flare_bolt.test.ts new file mode 100644 index 00000000000..a8372fcaaab --- /dev/null +++ b/src/test/moves/fusion_flare_bolt.test.ts @@ -0,0 +1,289 @@ +import { Stat } from "#enums/stat"; +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { DamagePhase } from "#app/phases/damage-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 { 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"; + +describe("Moves - Fusion Flare and Fusion Bolt", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const fusionFlare = allMoves[Moves.FUSION_FLARE]; + const fusionBolt = allMoves[Moves.FUSION_BOLT]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.moveset([fusionFlare.id, fusionBolt.id]); + game.override.startingLevel(1); + + game.override.enemySpecies(Species.RESHIRAM); + game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]); + + game.override.battleType("double"); + game.override.startingWave(97); + game.override.disableCrits(); + + vi.spyOn(fusionFlare, "calculateBattlePower"); + vi.spyOn(fusionBolt, "calculateBattlePower"); + }); + + it("FUSION_FLARE should double power of subsequent FUSION_BOLT", async () => { + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + game.move.select(fusionFlare.id, 0, BattlerIndex.ENEMY); + game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); + + // Force user party to act before enemy party + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_BOLT should double power of subsequent FUSION_FLARE", async () => { + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + game.move.select(fusionBolt.id, 0, BattlerIndex.ENEMY); + game.move.select(fusionFlare.id, 1, BattlerIndex.ENEMY); + + // Force user party to act before enemy party + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_FLARE should double power of subsequent FUSION_BOLT if a move failed in between", async () => { + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + game.move.select(fusionFlare.id, 0, BattlerIndex.PLAYER); + game.move.select(fusionBolt.id, 1, BattlerIndex.PLAYER); + + // Force first enemy to act (and fail) in between party + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEndPhase); + + // Skip enemy move; because the enemy is at full HP, Rest should fail + await game.phaseInterceptor.runFrom(MovePhase).to(MoveEndPhase); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_FLARE should not double power of subsequent FUSION_BOLT if a move succeeded in between", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + game.move.select(fusionFlare.id, 0, BattlerIndex.ENEMY); + game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); + + // Force first enemy to act in between party + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEndPhase); + // Skip enemy move + await game.phaseInterceptor.runFrom(MovePhase).to(MoveEndPhase); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + }, 20000); + + it("FUSION_FLARE should double power of subsequent FUSION_BOLT if moves are aimed at allies", async () => { + await game.startBattle([ + Species.ZEKROM, + Species.RESHIRAM + ]); + + game.move.select(fusionBolt.id, 0, BattlerIndex.PLAYER_2); + game.move.select(fusionFlare.id, 1, BattlerIndex.PLAYER); + + // Force user party to act before enemy party + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves", async () => { + game.override.enemyMoveset([fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id]); + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + const party = game.scene.getParty(); + const enemyParty = game.scene.getEnemyParty(); + + // Get rid of any modifiers that may alter power + game.scene.clearEnemyHeldItemModifiers(); + game.scene.clearEnemyModifiers(); + + // Mock stats by replacing entries in copy with desired values for specific stats + const stats = { + enemy: [ + [...enemyParty[0].stats], + [...enemyParty[1].stats], + ], + player: [ + [...party[0].stats], + [...party[1].stats], + ] + }; + + // Ensure survival by reducing enemy Sp. Atk and boosting party Sp. Def + vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue(stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val))); + vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue(stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val))); + vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[0].map((val, i) => (i === Stat.SPDEF ? 250 : val))); + vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[1].map((val, i) => (i === Stat.SPDEF ? 250 : val))); + + game.move.select(fusionBolt.id, 0, BattlerIndex.ENEMY); + game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); + + // Force first enemy to act in between party + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves if moves are aimed at allies", async () => { + game.override.enemyMoveset([fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id]); + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + const party = game.scene.getParty(); + const enemyParty = game.scene.getEnemyParty(); + + // Get rid of any modifiers that may alter power + game.scene.clearEnemyHeldItemModifiers(); + game.scene.clearEnemyModifiers(); + + // Mock stats by replacing entries in copy with desired values for specific stats + const stats = { + enemy: [ + [...enemyParty[0].stats], + [...enemyParty[1].stats], + ], + player: [ + [...party[0].stats], + [...party[1].stats], + ] + }; + + // Ensure survival by reducing enemy Sp. Atk and boosting party Sp. Def + vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue(stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val))); + vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue(stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val))); + vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[0].map((val, i) => (i === Stat.SPDEF ? 250 : val))); + vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[1].map((val, i) => (i === Stat.SPDEF ? 250 : val))); + + game.move.select(fusionBolt.id, 0, BattlerIndex.PLAYER_2); + game.move.select(fusionBolt.id, 1, BattlerIndex.PLAYER); + + // Force first enemy to act in between party + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); +}); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 063a17aead9..67fd3464cf9 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -1,15 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import { - Moves -} from "#app/enums/moves.js"; -import * as overrides from "#app/overrides"; -import { Abilities } from "#app/enums/abilities.js"; -import { BattlerIndex } from "#app/battle.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { MoveResult } from "#app/field/pokemon.js"; -import { Stat } from "#app/data/pokemon-stat.js"; -import { Species } from "#app/enums/species.js"; +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { MoveResult } from "#app/field/pokemon"; +import GameManager from "#test/utils/gameManager"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const TIMEOUT = 20 * 1000; @@ -29,14 +25,14 @@ describe("Moves - Gastro Acid", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WATER_ABSORB); + game.override.battleType("double"); + game.override.startingLevel(1); + game.override.enemyLevel(100); + game.override.ability(Abilities.NONE); + game.override.moveset([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); + game.override.enemySpecies(Species.BIDOOF); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyAbility(Abilities.WATER_ABSORB); }); it("suppresses effect of ability", async () => { @@ -49,10 +45,8 @@ describe("Moves - Gastro Acid", () => { await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); - game.doSelectTarget(BattlerIndex.ENEMY); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); - game.doSelectTarget(BattlerIndex.PLAYER_2); + game.move.select(Moves.GASTRO_ACID, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to("TurnInitPhase"); @@ -60,34 +54,30 @@ describe("Moves - Gastro Acid", () => { expect(enemyField[0].summonData.abilitySuppressed).toBe(true); expect(enemyField[1].summonData.abilitySuppressed).toBe(false); - game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); - game.doSelectTarget(BattlerIndex.ENEMY); - game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); - game.doSelectTarget(BattlerIndex.ENEMY_2); + game.move.select(Moves.WATER_GUN, 0, BattlerIndex.ENEMY); + game.move.select(Moves.WATER_GUN, 1, BattlerIndex.ENEMY_2); await game.phaseInterceptor.to("TurnEndPhase"); expect(enemyField[0].hp).toBeLessThan(enemyField[0].getMaxHp()); - expect(enemyField[1].hp).toBe(enemyField[1].getMaxHp()); + expect(enemyField[1].isFullHp()).toBe(true); }, TIMEOUT); it("fails if used on an enemy with an already-suppressed ability", async () => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + game.override.battleType(null); await game.startBattle(); + game.move.select(Moves.CORE_ENFORCER); // Force player to be slower to enable Core Enforcer to proc its suppression effect - game.scene.getPlayerPokemon().stats[Stat.SPD] = 1; - game.scene.getEnemyPokemon().stats[Stat.SPD] = 2; - - game.doAttack(getMovePosition(game.scene, 0, Moves.CORE_ENFORCER)); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnInitPhase"); - game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + game.move.select(Moves.GASTRO_ACID); await game.phaseInterceptor.to("TurnInitPhase"); - expect(game.scene.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); }, TIMEOUT); }); diff --git a/src/test/moves/gigaton_hammer.test.ts b/src/test/moves/gigaton_hammer.test.ts new file mode 100644 index 00000000000..0162375cdb2 --- /dev/null +++ b/src/test/moves/gigaton_hammer.test.ts @@ -0,0 +1,80 @@ +import { BattlerIndex } from "#app/battle"; +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/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts new file mode 100644 index 00000000000..5867ef751b8 --- /dev/null +++ b/src/test/moves/glaive_rush.test.ts @@ -0,0 +1,165 @@ +import { allMoves } from "#app/data/move"; +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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Glaive Rush", () => { + 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.BALL_FETCH) + .enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)) + .starterSpecies(Species.KLINK) + .ability(Abilities.BALL_FETCH) + .moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); + }); + + it("takes double damage from attacks", async () => { + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + enemy.hp = 1000; + + game.move.select(Moves.SHADOW_SNEAK); + await game.phaseInterceptor.to("DamagePhase"); + const damageDealt = 1000 - enemy.hp; + await game.phaseInterceptor.to("TurnEndPhase"); + game.move.select(Moves.SHADOW_SNEAK); + await game.phaseInterceptor.to("DamagePhase"); + expect(enemy.hp).toBeLessThanOrEqual(1001 - (damageDealt * 3)); + + }, TIMEOUT); + + it("always gets hit by attacks", async () => { + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + enemy.hp = 1000; + + allMoves[Moves.AVALANCHE].accuracy = 0; + game.move.select(Moves.AVALANCHE); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.hp).toBeLessThan(1000); + + }, TIMEOUT); + + it("interacts properly with multi-lens", async () => { + game.override + .startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) + .enemyMoveset(Array(4).fill(Moves.AVALANCHE)); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.hp = 1000; + player.hp = 1000; + + allMoves[Moves.AVALANCHE].accuracy = 0; + game.move.select(Moves.GLAIVE_RUSH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(player.hp).toBeLessThan(1000); + player.hp = 1000; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(player.hp).toBe(1000); + + }, TIMEOUT); + + it("secondary effects only last until next move", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.hp = 1000; + player.hp = 1000; + allMoves[Moves.SHADOW_SNEAK].accuracy = 0; + + game.move.select(Moves.GLAIVE_RUSH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(player.hp).toBe(1000); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + const damagedHp = player.hp; + expect(player.hp).toBeLessThan(1000); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(player.hp).toBe(damagedHp); + + }, TIMEOUT); + + it("secondary effects are removed upon switching", async () => { + game.override + .enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)) + .starterSpecies(0); + await game.classicMode.startBattle([Species.KLINK, Species.FEEBAS]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.hp = 1000; + allMoves[Moves.SHADOW_SNEAK].accuracy = 0; + + game.move.select(Moves.GLAIVE_RUSH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(player.hp).toBe(player.getMaxHp()); + + game.doSwitchPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + game.doSwitchPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(player.hp).toBe(player.getMaxHp()); + + }, TIMEOUT); + + it("secondary effects don't activate if move fails", async () => { + game.override.moveset([Moves.SHADOW_SNEAK, Moves.PROTECT, Moves.SPLASH, Moves.GLAIVE_RUSH]); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.hp = 1000; + player.hp = 1000; + + game.move.select(Moves.PROTECT); + await game.phaseInterceptor.to("TurnEndPhase"); + + game.move.select(Moves.SHADOW_SNEAK); + await game.phaseInterceptor.to("TurnEndPhase"); + game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + const damagedHP1 = 1000 - enemy.hp; + enemy.hp = 1000; + + game.move.select(Moves.SHADOW_SNEAK); + await game.phaseInterceptor.to("TurnEndPhase"); + const damagedHP2 = 1000 - enemy.hp; + + expect(damagedHP2).toBeGreaterThanOrEqual((damagedHP1 * 2) - 1); + }, TIMEOUT); +}); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 4e5add26207..defe5e26f41 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -1,21 +1,13 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, - EnemyCommandPhase, - TurnInitPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {BattleStat} from "#app/data/battle-stat"; +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 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; @@ -33,37 +25,25 @@ describe("Moves - Growth", () => { beforeEach(() => { game = new GameManager(phaserGame); - const moveToUse = Moves.GROWTH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.enemyAbility(Abilities.MOXIE); + game.override.ability(Abilities.INSOMNIA); + 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.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + 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/hard_press.test.ts b/src/test/moves/hard_press.test.ts new file mode 100644 index 00000000000..70c78490269 --- /dev/null +++ b/src/test/moves/hard_press.test.ts @@ -0,0 +1,85 @@ +import { allMoves } from "#app/data/move"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +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"; + +describe("Moves - Hard Press", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const moveToCheck = allMoves[Moves.HARD_PRESS]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.ability(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.MUNCHLAX); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.moveset([Moves.HARD_PRESS]); + vi.spyOn(moveToCheck, "calculateBattlePower"); + }); + + it("should return 100 power if target HP ratio is at 100%", async () => { + await game.startBattle([Species.PIKACHU]); + + game.move.select(Moves.HARD_PRESS); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(100); + }); + + it("should return 50 power if target HP ratio is at 50%", async () => { + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = .5; + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); + + game.move.select(Moves.HARD_PRESS); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(50); + }); + + it("should return 1 power if target HP ratio is at 1%", async () => { + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = .01; + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); + + game.move.select(Moves.HARD_PRESS); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(1); + }); + + it("should return 1 power if target HP ratio is less than 1%", async () => { + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = .005; + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); + + game.move.select(Moves.HARD_PRESS); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(1); + }); +}); diff --git a/src/test/moves/haze.test.ts b/src/test/moves/haze.test.ts new file mode 100644 index 00000000000..42081ce74e8 --- /dev/null +++ b/src/test/moves/haze.test.ts @@ -0,0 +1,63 @@ +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 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", () => { + 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.enemyLevel(100); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyAbility(Abilities.NONE); + + game.override.startingLevel(100); + game.override.moveset([Moves.HAZE, Moves.SWORDS_DANCE, Moves.CHARM, Moves.SPLASH]); + game.override.ability(Abilities.NONE); + }); + + 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.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); + + 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.getStatStage(Stat.ATK)).toBe(0); + expect(enemy.getStatStage(Stat.ATK)).toBe(0); + }); + }); +}); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts new file mode 100644 index 00000000000..1280d8b429a --- /dev/null +++ b/src/test/moves/hyper_beam.test.ts @@ -0,0 +1,72 @@ +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +const TIMEOUT = 20 * 1000; // 20 sec timeout for all tests + +describe("Moves - Hyper Beam", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("single"); + game.override.ability(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + game.override.enemyLevel(100); + + game.override.moveset([Moves.HYPER_BEAM, Moves.TACKLE]); + vi.spyOn(allMoves[Moves.HYPER_BEAM], "accuracy", "get").mockReturnValue(100); + }); + + it( + "should force the user to recharge on the next turn (and only that turn)", + async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.HYPER_BEAM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); + + const enemyPostAttackHp = enemyPokemon.hp; + + /** Game should progress without a new command from the player */ + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.hp).toBe(enemyPostAttackHp); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBeLessThan(enemyPostAttackHp); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/jaw_lock.test.ts b/src/test/moves/jaw_lock.test.ts new file mode 100644 index 00000000000..42f7a244977 --- /dev/null +++ b/src/test/moves/jaw_lock.test.ts @@ -0,0 +1,171 @@ +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 { FaintPhase } from "#app/phases/faint-phase"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#app/test/utils/gameManager"; +import { SPLASH_ONLY } from "#app/test/utils/testUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Jaw Lock", () => { + 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.SNORLAX) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset(SPLASH_ONLY) + .moveset([Moves.JAW_LOCK, Moves.SPLASH]) + .startingLevel(100) + .enemyLevel(100) + .disableCrits(); + }); + + it( + "should trap the move's user and target", + async () => { + await game.startBattle([Species.BULBASAUR]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + }, TIMEOUT + ); + + it( + "should not trap either pokemon if the target faints", + async () => { + game.override.enemyLevel(1); + await game.startBattle([Species.BULBASAUR]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + + await game.phaseInterceptor.to(FaintPhase); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }, TIMEOUT + ); + + it( + "should only trap the user until the target faints", + async () => { + await game.startBattle([Species.BULBASAUR]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + await game.doKillOpponents(); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }, TIMEOUT + ); + + it( + "should not trap other targets after the first target is trapped", + async () => { + game.override.battleType("double"); + + await game.startBattle([Species.CHARMANDER, Species.BULBASAUR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + + await game.toNextTurn(); + + game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(enemyPokemon[1].getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)?.sourceId).toBe(enemyPokemon[0].id); + }, TIMEOUT + ); + + it( + "should not trap either pokemon if the target is protected", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.PROTECT)); + + await game.startBattle([Species.BULBASAUR]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.JAW_LOCK); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(playerPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }, TIMEOUT + ); +}); 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/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 30a27ce4412..e94dc4a299e 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -1,26 +1,22 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import Move, { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import Pokemon from "#app/field/pokemon"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Abilities } from "#app/enums/abilities.js"; -import Pokemon from "#app/field/pokemon.js"; -import Move, { allMoves } from "#app/data/move.js"; -import { NumberHolder } from "#app/utils.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Light Screen", () => { let phaserGame: Phaser.Game; let game: GameManager; const singleBattleMultiplier = 0.5; - const doubleBattleMultiplier = 2732/4096; + const doubleBattleMultiplier = 2732 / 4096; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -34,52 +30,51 @@ describe("Moves - Light Screen", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); + game.override.ability(Abilities.NONE); + game.override.moveset([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); + game.override.enemyLevel(100); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); + game.override.disableCrits(); }); - it("reduces damage of special attacks by half in a single battle", async() => { + it("reduces damage of special attacks by half in a single battle", async () => { const moveToUse = Moves.ABSORB; await game.startBattle([Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); - it("reduces damage of special attacks by a third in a double battle", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("reduces damage of special attacks by a third in a double battle", async () => { + game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); - game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + game.move.select(moveToUse); + game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); - it("does not affect physical attacks", async() => { + it("does not affect physical attacks", async () => { const moveToUse = Moves.TACKLE; await game.startBattle([Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); diff --git a/src/test/moves/lucky_chant.test.ts b/src/test/moves/lucky_chant.test.ts new file mode 100644 index 00000000000..7d5bfe02476 --- /dev/null +++ b/src/test/moves/lucky_chant.test.ts @@ -0,0 +1,113 @@ +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "../utils/gameManager"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Lucky Chant", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .battleType("single") + .moveset([Moves.LUCKY_CHANT, Moves.SPLASH, Moves.FOLLOW_ME]) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset(Array(4).fill(Moves.FLOWER_TRICK)) + .startingLevel(100) + .enemyLevel(100); + }); + + it( + "should prevent critical hits from moves", + async () => { + await game.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; + + game.move.select(Moves.LUCKY_CHANT); + + await game.phaseInterceptor.to(BerryPhase, false); + + const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }, TIMEOUT + ); + + it( + "should prevent critical hits against the user's ally", + async () => { + game.override.battleType("double"); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(TurnEndPhase); + + const firstTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp; + + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.LUCKY_CHANT, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + const secondTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }, TIMEOUT + ); + + it( + "should prevent critical hits from field effects", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + + await game.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + enemyPokemon.addTag(BattlerTagType.ALWAYS_CRIT, 2, Moves.NONE, 0); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; + + game.move.select(Moves.LUCKY_CHANT); + + await game.phaseInterceptor.to(BerryPhase, false); + + const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/lunar_blessing.test.ts b/src/test/moves/lunar_blessing.test.ts new file mode 100644 index 00000000000..92428c39029 --- /dev/null +++ b/src/test/moves/lunar_blessing.test.ts @@ -0,0 +1,83 @@ +import { StatusEffect } from "#app/enums/status-effect"; +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 { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Lunar Blessing", () => { + 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"); + + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.moveset([Moves.LUNAR_BLESSING, Moves.SPLASH]); + game.override.ability(Abilities.BALL_FETCH); + }); + + it("should restore 25% HP of the user and its ally", async () => { + await game.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); + + vi.spyOn(leftPlayer, "getMaxHp").mockReturnValue(100); + vi.spyOn(rightPlayer, "getMaxHp").mockReturnValue(100); + + const initialHp = 1; + leftPlayer["hp"] = initialHp; + rightPlayer["hp"] = initialHp; + const expectedHeal = 25; + + vi.spyOn(leftPlayer, "heal"); + vi.spyOn(rightPlayer, "heal"); + + + game.move.select(Moves.LUNAR_BLESSING, 0); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + + expect(leftPlayer.heal).toHaveBeenCalledOnce(); + expect(leftPlayer.heal).toHaveReturnedWith(expectedHeal); + + expect(rightPlayer.heal).toHaveBeenCalledOnce(); + expect(rightPlayer.heal).toHaveReturnedWith(expectedHeal); + }); + + it("should cure status effect of the user and its ally", async () => { + game.override.statusEffect(StatusEffect.BURN); + await game.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); + + vi.spyOn(leftPlayer, "resetStatus"); + vi.spyOn(rightPlayer, "resetStatus"); + + game.move.select(Moves.LUNAR_BLESSING, 0); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + + expect(leftPlayer.resetStatus).toHaveBeenCalledOnce(); + expect(rightPlayer.resetStatus).toHaveBeenCalledOnce(); + + expect(leftPlayer.status?.effect).toBeUndefined(); + expect(rightPlayer.status?.effect).toBeUndefined(); + }); +}); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index 7ed5b84654c..9037e377090 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -1,14 +1,15 @@ -import {beforeAll, afterEach, beforeEach, describe, vi, it, expect} from "vitest"; +import { CommandPhase } from "#app/phases/command-phase"; +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 Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import {Moves} from "#enums/moves"; -import {Species} from "#enums/species"; -import {CommandPhase, TurnEndPhase} from "#app/phases.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Magnet Rise", () => { let phaserGame: Phaser.Game; let game: GameManager; + const moveToUse = Moves.MAGNET_RISE; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -22,21 +23,20 @@ describe("Moves - Magnet Rise", () => { beforeEach(() => { game = new GameManager(phaserGame); - const moveToUse = Moves.MAGNET_RISE; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGNEZONE); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); + game.override.battleType("single"); + game.override.starterSpecies(Species.MAGNEZONE); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyMoveset([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); + game.override.disableCrits(); + game.override.enemyLevel(1); + game.override.moveset([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); }); it("MAGNET RISE", async () => { await game.startBattle(); const startingHp = game.scene.getParty()[0].hp; - game.doAttack(0); + game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); const finalHp = game.scene.getParty()[0].hp; const hpLost = finalHp - startingHp; @@ -47,12 +47,12 @@ describe("Moves - Magnet Rise", () => { await game.startBattle(); const startingHp = game.scene.getParty()[0].hp; - game.doAttack(0); + game.move.select(moveToUse); await game.phaseInterceptor.to(CommandPhase); let finalHp = game.scene.getParty()[0].hp; let hpLost = finalHp - startingHp; expect(hpLost).toBe(0); - game.doAttack(2); + game.move.select(Moves.GRAVITY); await game.phaseInterceptor.to(TurnEndPhase); finalHp = game.scene.getParty()[0].hp; hpLost = finalHp - startingHp; diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index a700ff10aae..e41472d7561 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -1,17 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { - CommandPhase, - MoveEndPhase, - StatChangePhase, -} from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; +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 "#test/utils/testUtils"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; const TIMEOUT = 20 * 1000; @@ -31,76 +27,75 @@ describe("Moves - Make It Rain", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.battleType("double"); + game.override.moveset([Moves.MAKE_IT_RAIN, Moves.SPLASH]); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.startingLevel(100); + 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(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).toBeDefined()); + const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).toBeDefined()); - - game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); - - await game.phaseInterceptor.to(CommandPhase); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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 () => { - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.enemyLevel(1); // ensures the enemy will faint + game.override.battleType("single"); await game.startBattle([Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon(); - expect(playerPokemon).toBeDefined(); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); + game.move.select(Moves.MAKE_IT_RAIN); - game.doAttack(getMovePosition(game.scene, 0, 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 () => { - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + game.override.enemyLevel(1); // ensures the enemy will faint await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerField(); - playerPokemon.forEach(p => expect(p).toBeDefined()); - + const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyField(); - enemyPokemon.forEach(p => expect(p).toBeDefined()); - game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); + game.move.select(Moves.MAKE_IT_RAIN); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(CommandPhase); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); - - 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 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.getPlayerPokemon()!; + + game.move.select(Moves.MAKE_IT_RAIN); + game.move.select(Moves.SPLASH, 1); + + // Make Make It Rain miss the first target + await game.move.forceMiss(true); + + await game.phaseInterceptor.to(MoveEndPhase); + + 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 new file mode 100644 index 00000000000..4a95985eb92 --- /dev/null +++ b/src/test/moves/mat_block.test.ts @@ -0,0 +1,108 @@ +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; + +describe("Moves - Mat Block", () => { + 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"); + + game.override.moveset([Moves.MAT_BLOCK, Moves.SPLASH]); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test( + "should protect the user and allies from attack moves", + async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.MAT_BLOCK); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }, TIMEOUT + ); + + test( + "should not protect the user and allies from status moves", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.MAT_BLOCK); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(-2)); + }, TIMEOUT + ); + + test( + "should fail when used after the first turn", + async () => { + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(TurnEndPhase); + + const leadStartingHp = leadPokemon.map(p => p.hp); + + await game.phaseInterceptor.to(CommandPhase, false); + game.move.select(Moves.MAT_BLOCK); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.MAT_BLOCK, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.some((p, i) => p.hp < leadStartingHp[i])).toBeTruthy(); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/miracle_eye.test.ts b/src/test/moves/miracle_eye.test.ts new file mode 100644 index 00000000000..d6b21a5dc2f --- /dev/null +++ b/src/test/moves/miracle_eye.test.ts @@ -0,0 +1,52 @@ +import { BattlerIndex } from "#app/battle"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +describe("Moves - Miracle Eye", () => { + 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 + .disableCrits() + .enemySpecies(Species.UMBREON) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(5) + .starterSpecies(Species.MAGIKARP) + .moveset([Moves.MIRACLE_EYE, Moves.CONFUSION]); + }); + + it("should allow Psychic moves to hit Dark types", async () => { + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.CONFUSION); + 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/multi_target.test.ts b/src/test/moves/multi_target.test.ts new file mode 100644 index 00000000000..16ccd5519b1 --- /dev/null +++ b/src/test/moves/multi_target.test.ts @@ -0,0 +1,131 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { Species } from "#app/enums/species"; +import * as Utils from "#app/utils"; +import { Moves } from "#enums/moves"; +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"; + +const TIMEOUT = 20 * 1000; + +describe("Multi-target damage reduction", () => { + 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 + .disableCrits() + .battleType("double") + .enemyLevel(100) + .startingLevel(100) + .enemySpecies(Species.POLIWAG) + .enemyMoveset(SPLASH_ONLY) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([Moves.TACKLE, Moves.DAZZLING_GLEAM, Moves.EARTHQUAKE, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH); + }); + + it("should reduce d.gleam damage when multiple enemies but not tackle", async () => { + await game.startBattle([Species.MAGIKARP, Species.FEEBAS]); + + const [enemy1, enemy2] = game.scene.getEnemyField(); + + game.move.select(Moves.DAZZLING_GLEAM); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MoveEndPhase"); + + const gleam1 = enemy1.getMaxHp() - enemy1.hp; + enemy1.hp = enemy1.getMaxHp(); + + await game.phaseInterceptor.to("MoveEndPhase"); + + const tackle1 = enemy1.getMaxHp() - enemy1.hp; + enemy1.hp = enemy1.getMaxHp(); + + await game.killPokemon(enemy2); + await game.toNextTurn(); + + game.move.select(Moves.DAZZLING_GLEAM); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + + const gleam2 = enemy1.getMaxHp() - enemy1.hp; + enemy1.hp = enemy1.getMaxHp(); + + await game.phaseInterceptor.to("MoveEndPhase"); + const tackle2 = enemy1.getMaxHp() - enemy1.hp; + + // Single target moves don't get reduced + expect(tackle1).toBe(tackle2); + // Moves that target all enemies get reduced if there's more than one enemy + expect(gleam1).toBeLessThanOrEqual(Utils.toDmgValue(gleam2 * 0.75) + 1); + expect(gleam1).toBeGreaterThanOrEqual(Utils.toDmgValue(gleam2 * 0.75) - 1); + }, TIMEOUT); + + it("should reduce earthquake when more than one pokemon other than user is not fainted", async () => { + await game.startBattle([Species.MAGIKARP, Species.FEEBAS]); + + const player2 = game.scene.getParty()[1]; + const [enemy1, enemy2] = game.scene.getEnemyField(); + + game.move.select(Moves.EARTHQUAKE); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to("MoveEndPhase"); + + const damagePlayer2Turn1 = player2.getMaxHp() - player2.hp; + const damageEnemy1Turn1 = enemy1.getMaxHp() - enemy1.hp; + + player2.hp = player2.getMaxHp(); + enemy1.hp = enemy1.getMaxHp(); + + await game.killPokemon(enemy2); + await game.toNextTurn(); + + game.move.select(Moves.EARTHQUAKE); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + + const damagePlayer2Turn2 = player2.getMaxHp() - player2.hp; + const damageEnemy1Turn2 = enemy1.getMaxHp() - enemy1.hp; + + enemy1.hp = enemy1.getMaxHp(); + + // Turn 1: 3 targets, turn 2: 2 targets + // Both should have damage reduction + expect(damageEnemy1Turn1).toBe(damageEnemy1Turn2); + expect(damagePlayer2Turn1).toBe(damagePlayer2Turn2); + + await game.killPokemon(player2); + await game.toNextTurn(); + + game.move.select(Moves.EARTHQUAKE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + + const damageEnemy1Turn3 = enemy1.getMaxHp() - enemy1.hp; + // Turn 3: 1 target, should be no damage reduction + expect(damageEnemy1Turn1).toBeLessThanOrEqual(Utils.toDmgValue(damageEnemy1Turn3 * 0.75) + 1); + expect(damageEnemy1Turn1).toBeGreaterThanOrEqual(Utils.toDmgValue(damageEnemy1Turn3 * 0.75) - 1); + }, TIMEOUT); +}); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts new file mode 100644 index 00000000000..c86906ea240 --- /dev/null +++ b/src/test/moves/octolock.test.ts @@ -0,0 +1,117 @@ +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"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +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"; + +describe("Moves - Octolock", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("single") + .enemySpecies(Species.RATTATA) + .enemyMoveset(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 new file mode 100644 index 00000000000..d9535ca6482 --- /dev/null +++ b/src/test/moves/parting_shot.test.ts @@ -0,0 +1,202 @@ +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; + +describe("Moves - Parting Shot", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.moveset([Moves.PARTING_SHOT, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.startingLevel(5); + game.override.enemyLevel(5); + + }); + + test( + "Parting Shot when buffed by prankster should fail against dark types", + async () => { + game.override + .enemySpecies(Species.POOCHYENA) + .ability(Abilities.PRANKSTER); + await game.startBattle([Species.MURKROW, Species.MEOWTH]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); + + game.move.select(Moves.PARTING_SHOT); + + await game.phaseInterceptor.to(BerryPhase, false); + 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 + ); + + test( + "Parting shot should fail against good as gold ability", + async () => { + game.override + .enemySpecies(Species.GHOLDENGO) + .enemyAbility(Abilities.GOOD_AS_GOLD); + await game.startBattle([Species.MURKROW, Species.MEOWTH]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); + + game.move.select(Moves.PARTING_SHOT); + + await game.phaseInterceptor.to(BerryPhase, false); + 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 + ); + + it.skip( // TODO: fix this bug to pass the test! + "Parting shot should fail if target is -6/-6 de-buffed", + async () => { + game.override.moveset([Moves.PARTING_SHOT, Moves.MEMENTO, Moves.SPLASH]); + await game.startBattle([Species.MEOWTH, Species.MEOWTH, Species.MEOWTH, Species.MURKROW, Species.ABRA]); + + // use Memento 3 times to debuff enemy + game.move.select(Moves.MEMENTO); + await game.phaseInterceptor.to(FaintPhase); + expect(game.scene.getParty()[0].isFainted()).toBe(true); + game.doSelectPartyPokemon(1); + + await game.phaseInterceptor.to(TurnInitPhase, false); + game.move.select(Moves.MEMENTO); + await game.phaseInterceptor.to(FaintPhase); + expect(game.scene.getParty()[0].isFainted()).toBe(true); + game.doSelectPartyPokemon(2); + + await game.phaseInterceptor.to(TurnInitPhase, false); + game.move.select(Moves.MEMENTO); + await game.phaseInterceptor.to(FaintPhase); + expect(game.scene.getParty()[0].isFainted()).toBe(true); + game.doSelectPartyPokemon(3); + + // set up done + await game.phaseInterceptor.to(TurnInitPhase, false); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); + + 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(enemyPokemon.getStatStage(Stat.ATK)).toBe(-6); + expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-6); + expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); + }, TIMEOUT + ); + + it.skip( // TODO: fix this bug to pass the test! + "Parting shot shouldn't allow switch out when mist is active", + async () => { + game.override + .enemySpecies(Species.ALTARIA) + .enemyAbility(Abilities.NONE) + .enemyMoveset(Array(4).fill(Moves.MIST)); + await game.startBattle([Species.SNORLAX, Species.MEOWTH]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); + + game.move.select(Moves.PARTING_SHOT); + + await game.phaseInterceptor.to(BerryPhase, false); + 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 + ); + + it.skip( // TODO: fix this bug to pass the test! + "Parting shot shouldn't allow switch out against clear body ability", + async () => { + game.override + .enemySpecies(Species.TENTACOOL) + .enemyAbility(Abilities.CLEAR_BODY); + await game.startBattle([Species.SNORLAX, Species.MEOWTH]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); + + game.move.select(Moves.PARTING_SHOT); + + await game.phaseInterceptor.to(BerryPhase, false); + 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 + ); + + it.skip( // TODO: fix this bug to pass the test! + "Parting shot should de-buff and not fail if no party available to switch - party size 1", + async () => { + await game.startBattle([Species.MURKROW]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); + + game.move.select(Moves.PARTING_SHOT); + + await game.phaseInterceptor.to(BerryPhase, false); + 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 + ); + + it.skip( // TODO: fix this bug to pass the test! + "Parting shot regularly not fail if no party available to switch - party fainted", + async () => { + await game.startBattle([Species.MURKROW, Species.MEOWTH]); + game.move.select(Moves.SPLASH); + + // intentionally kill party pokemon, switch to second slot (now 1 party mon is fainted) + await game.killPokemon(game.scene.getParty()[0]); + expect(game.scene.getParty()[0].isFainted()).toBe(true); + await game.phaseInterceptor.run(MessagePhase); + game.doSelectPartyPokemon(1); + + await game.phaseInterceptor.to(TurnInitPhase, false); + game.move.select(Moves.PARTING_SHOT); + + await game.phaseInterceptor.to(BerryPhase, false); + 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 new file mode 100644 index 00000000000..83cd088aa47 --- /dev/null +++ b/src/test/moves/protect.test.ts @@ -0,0 +1,134 @@ +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 { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Protect", () => { + 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.moveset([Moves.PROTECT]); + game.override.enemySpecies(Species.SNORLAX); + + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test( + "should protect the user from attacks", + async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + test( + "should prevent secondary effects from the opponent's attack", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.CEASELESS_EDGE)); + vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(game.scene.arena.getTagOnSide(ArenaTrapTag, ArenaTagSide.ENEMY)).toBeUndefined(); + }, TIMEOUT + ); + + test( + "should protect the user from status moves", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.CHARM)); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }, TIMEOUT + ); + + test( + "should stop subsequent hits of a multi-hit move", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACHYON_CUTTER)); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.turnData.hitCount).toBe(1); + }, TIMEOUT + ); + + test( + "should fail if the user is the last to move in the turn", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.PROTECT)); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(leadPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 21ebb3d5515..15d684b2d60 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -1,15 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - MoveEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { BattlerIndex } from "#app/battle"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon.js"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -29,15 +26,15 @@ describe("Moves - Purify", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PYUKUMUKU); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); + game.override.starterSpecies(Species.PYUKUMUKU); + game.override.startingLevel(10); + game.override.moveset([Moves.PURIFY, Moves.SIZZLY_SLIDE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyLevel(10); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); }); test( @@ -45,17 +42,18 @@ describe("Moves - Purify", () => { async () => { await game.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; playerPokemon.hp = playerPokemon.getMaxHp() - 1; enemyPokemon.status = new Status(StatusEffect.BURN); - game.doAttack(getMovePosition(game.scene, 0, Moves.PURIFY)); + game.move.select(Moves.PURIFY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEndPhase); - expect(enemyPokemon.status).toBe(undefined); - expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(enemyPokemon.status).toBeNull(); + expect(playerPokemon.isFullHp()).toBe(true); }, TIMEOUT ); @@ -65,12 +63,13 @@ describe("Moves - Purify", () => { async () => { await game.startBattle(); - const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon(); + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; playerPokemon.hp = playerPokemon.getMaxHp() - 1; const playerInitialHp = playerPokemon.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.PURIFY)); + game.move.select(Moves.PURIFY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEndPhase); expect(playerPokemon.hp).toBe(playerInitialHp); diff --git a/src/test/moves/quick_guard.test.ts b/src/test/moves/quick_guard.test.ts new file mode 100644 index 00000000000..5f4af40eb71 --- /dev/null +++ b/src/test/moves/quick_guard.test.ts @@ -0,0 +1,118 @@ +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 { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Quick Guard", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("double"); + + game.override.moveset([Moves.QUICK_GUARD, Moves.SPLASH, Moves.FOLLOW_ME]); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset(Array(4).fill(Moves.QUICK_ATTACK)); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test( + "should protect the user and allies from priority moves", + async () => { + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }, TIMEOUT + ); + + test( + "should protect the user and allies from Prankster-boosted moves", + async () => { + game.override.enemyAbility(Abilities.PRANKSTER); + game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + playerPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }, TIMEOUT + ); + + test( + "should stop subsequent hits of a multi-hit priority move", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.WATER_SHURIKEN)); + + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.FOLLOW_ME, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + enemyPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); + } + ); + + test( + "should fail if the user is the last to move in the turn", + async () => { + game.override.battleType("single"); + game.override.enemyMoveset(Array(4).fill(Moves.QUICK_GUARD)); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.QUICK_GUARD); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 1116810f743..86bc48ef882 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -1,17 +1,10 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, - SelectTargetPhase, - TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -31,76 +24,54 @@ describe("Moves - Rage Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("double"); + 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.RAGE_POWDER, Moves.TACKLE, Moves.SPLASH]); }); test( "move effect should be bypassed by Grass type", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); - - await game.startBattle([ Species.AMOONGUSS, Species.VENUSAUR ]); - - const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.VENUSAUR]); const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - const enemyStartingHp = enemyPokemon.map(p => p.hp); + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY); - await game.phaseInterceptor.to(CommandPhase); + await game.forceEnemyMove(Moves.RAGE_POWDER); + await game.forceEnemyMove(Moves.SPLASH); - game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase, false); + 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 ); test( "move effect should be bypassed by Overcoat", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.OVERCOAT); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); + game.override.ability(Abilities.OVERCOAT); // Test with two non-Grass type player Pokemon - await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); const enemyStartingHp = enemyPokemon.map(p => p.hp); - game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY); - await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase, false); + 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]); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 00fb9a69f2f..9780ede3c55 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -1,26 +1,22 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import Move, { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import Pokemon from "#app/field/pokemon"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Abilities } from "#app/enums/abilities.js"; -import Pokemon from "#app/field/pokemon.js"; -import Move, { allMoves } from "#app/data/move.js"; -import { NumberHolder } from "#app/utils.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Reflect", () => { let phaserGame: Phaser.Game; let game: GameManager; const singleBattleMultiplier = 0.5; - const doubleBattleMultiplier = 2732/4096; + const doubleBattleMultiplier = 2732 / 4096; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -34,52 +30,51 @@ describe("Moves - Reflect", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); + game.override.ability(Abilities.NONE); + game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + game.override.enemyLevel(100); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + game.override.disableCrits(); }); - it("reduces damage of physical attacks by half in a single battle", async() => { + it("reduces damage of physical attacks by half in a single battle", async () => { const moveToUse = Moves.TACKLE; await game.startBattle([Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); - it("reduces damage of physical attacks by a third in a double battle", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + it("reduces damage of physical attacks by a third in a double battle", async () => { + game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); - game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + game.move.select(moveToUse); + game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); - it("does not affect special attacks", async() => { + it("does not affect special attacks", async () => { const moveToUse = Moves.ABSORB; await game.startBattle([Species.SHUCKLE]); - game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts new file mode 100644 index 00000000000..ddb0b22e642 --- /dev/null +++ b/src/test/moves/rollout.test.ts @@ -0,0 +1,80 @@ +import { allMoves } from "#app/data/move"; +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 { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Rollout", () => { + 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.disableCrits(); + game.override.battleType("single"); + game.override.starterSpecies(Species.RATTATA); + game.override.ability(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.BIDOOF); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.enemyMoveset(SPLASH_ONLY); + }); + + it("should double it's dmg on sequential uses but reset after 5", async () => { + game.override.moveset([Moves.ROLLOUT]); + vi.spyOn(allMoves[Moves.ROLLOUT], "accuracy", "get").mockReturnValue(100); //always hit + + const variance = 5; + const turns = 6; + const dmgHistory: number[] = []; + + await game.startBattle(); + + const playerPkm = game.scene.getParty()[0]; + vi.spyOn(playerPkm, "stats", "get").mockReturnValue([500000, 1, 1, 1, 1, 1]); // HP, ATK, DEF, SPATK, SPDEF, SPD + + const enemyPkm = game.scene.getEnemyParty()[0]; + vi.spyOn(enemyPkm, "stats", "get").mockReturnValue([500000, 1, 1, 1, 1, 1]); // HP, ATK, DEF, SPATK, SPDEF, SPD + vi.spyOn(enemyPkm, "getHeldItems").mockReturnValue([]); //no berries + + enemyPkm.hp = enemyPkm.getMaxHp(); + let previousHp = enemyPkm.hp; + + for (let i = 0; i < turns; i++) { + game.move.select(Moves.ROLLOUT); + await game.phaseInterceptor.to(CommandPhase); + + dmgHistory.push(previousHp - enemyPkm.hp); + previousHp = enemyPkm.hp; + } + + const [turn1Dmg, turn2Dmg, turn3Dmg, turn4Dmg, turn5Dmg, turn6Dmg] = dmgHistory; + + expect(turn2Dmg).toBeGreaterThanOrEqual(turn1Dmg * 2 - variance); + expect(turn2Dmg).toBeLessThanOrEqual(turn1Dmg * 2 + variance); + expect(turn3Dmg).toBeGreaterThanOrEqual(turn2Dmg * 2 - variance); + expect(turn3Dmg).toBeLessThanOrEqual(turn2Dmg * 2 + variance); + expect(turn4Dmg).toBeGreaterThanOrEqual(turn3Dmg * 2 - variance); + expect(turn4Dmg).toBeLessThanOrEqual(turn3Dmg * 2 + variance); + expect(turn5Dmg).toBeGreaterThanOrEqual(turn4Dmg * 2 - variance); + expect(turn5Dmg).toBeLessThanOrEqual(turn4Dmg * 2 + variance); + // reset + expect(turn6Dmg).toBeGreaterThanOrEqual(turn1Dmg - variance); + expect(turn6Dmg).toBeLessThanOrEqual(turn1Dmg + variance); + }); +}); diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index db9363313a1..cf07a3485e7 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -1,13 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#app/enums/species.js"; -import { Moves } from "#app/enums/moves.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { Abilities } from "#app/enums/abilities.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -27,13 +26,13 @@ describe("Moves - Roost", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.STARAPTOR); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); + game.override.battleType("single"); + game.override.enemySpecies(Species.STARAPTOR); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.STOMPING_TANTRUM]); + game.override.enemyMoveset([Moves.ROOST, Moves.ROOST, Moves.ROOST, Moves.ROOST]); }); test( @@ -41,15 +40,11 @@ describe("Moves - Roost", () => { async () => { await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); + const enemyPokemon = game.scene.getEnemyPokemon()!; const enemyStartingHp = enemyPokemon.hp; - game.doAttack(getMovePosition(game.scene, 0, Moves.STOMPING_TANTRUM)); + game.move.select(Moves.STOMPING_TANTRUM); await game.phaseInterceptor.to(MoveEffectPhase); 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/shell_trap.test.ts b/src/test/moves/shell_trap.test.ts new file mode 100644 index 00000000000..4549a8b2b73 --- /dev/null +++ b/src/test/moves/shell_trap.test.ts @@ -0,0 +1,164 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { MoveResult } from "#app/field/pokemon"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import { MovePhase } from "#app/phases/move-phase"; +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 - Shell Trap", () => { + 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.SHELL_TRAP, Moves.SPLASH, Moves.BULLDOZE]) + .enemySpecies(Species.SNORLAX) + .enemyMoveset(Array(4).fill(Moves.RAZOR_LEAF)) + .startingLevel(100) + .enemyLevel(100); + + vi.spyOn(allMoves[Moves.RAZOR_LEAF], "accuracy", "get").mockReturnValue(100); + }); + + it( + "should activate after the user is hit by a physical attack", + async () => { + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); + + await game.phaseInterceptor.to(MoveEndPhase); + + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).toBe(playerPokemon[1]); + + await game.phaseInterceptor.to(MoveEndPhase); + enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + }, TIMEOUT + ); + + it( + "should fail if the user is only hit by special attacks", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SWIFT)); + + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); + + await game.phaseInterceptor.to(MoveEndPhase); + + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }, TIMEOUT + ); + + it( + "should fail if the user isn't hit with any attack", + async () => { + game.override.enemyMoveset(SPLASH_ONLY); + + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); + + await game.phaseInterceptor.to(MoveEndPhase); + + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }, TIMEOUT + ); + + it( + "should not activate from an ally's attack", + async () => { + game.override.enemyMoveset(SPLASH_ONLY); + + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SHELL_TRAP); + game.move.select(Moves.BULLDOZE, 1); + + await game.phaseInterceptor.to(MoveEndPhase); + + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach((p, i) => expect(p.hp).toBe(enemyStartingHp[i])); + }, TIMEOUT + ); + + it( + "should not activate from a subsequent physical attack", + async () => { + game.override.battleType("single"); + vi.spyOn(allMoves[Moves.RAZOR_LEAF], "priority", "get").mockReturnValue(-4); + + await game.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SHELL_TRAP); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }, 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 0544442f31e..fa2e7521152 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -1,13 +1,10 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase -} from "#app/phases"; 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", () => { @@ -26,103 +23,61 @@ describe("Moves - Spikes", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.scene.battleStyle = 1; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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() => { - // player set spikes on the field and do splash for 3 turns - // opponent do splash for 4 turns - // nobody should take damage - await game.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); - game.doAttack(0); - await game.toNextTurn(); - game.doAttack(1); - await game.toNextTurn(); - game.doAttack(1); - await game.toNextTurn(); - game.doAttack(1); - await game.toNextTurn(); - game.doAttack(1); - await game.toNextTurn(); - expect(game.scene.getParty()[0].hp).toBe(initialHp); - console.log(game.textInterceptor.logs); - }, 20000); + it("should not damage the team that set them", async () => { + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); - 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.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - await game.phaseInterceptor.to(CommandPhase, false); + game.move.select(Moves.SPIKES); + await game.toNextTurn(); - const initialHp = game.scene.getParty()[0].hp; - game.doSwitchPokemon(1); - await game.phaseInterceptor.run(CommandPhase); - await game.phaseInterceptor.to(CommandPhase, false); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); 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() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(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.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - await game.phaseInterceptor.to(CommandPhase, true); - const initialHpOpponent = game.scene.currentBattle.enemyParty[1].hp; - game.doAttack(0); + it("should damage opposing pokemon that are forced to switch in", async () => { + game.override.startingWave(5); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + + game.move.select(Moves.SPIKES); await game.toNextTurn(); - game.doAttack(2); + + 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() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5000); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(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.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - await game.phaseInterceptor.to(CommandPhase, true); - const initialHpOpponent = game.scene.currentBattle.enemyParty[1].hp; - game.doAttack(0); + it("should damage opposing pokemon that choose to switch in", async () => { + game.override.startingWave(5); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + + game.move.select(Moves.SPIKES); await game.toNextTurn(); - game.forceOpponentToSwitch(); - game.doAttack(1); + 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 new file mode 100644 index 00000000000..f88791efb74 --- /dev/null +++ b/src/test/moves/spit_up.test.ts @@ -0,0 +1,189 @@ +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 GameManager from "#test/utils/gameManager"; +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, 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 }); + }); + + 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.NONE); + game.override.enemyLevel(2000); + + 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)", () => { + it("1 stack -> 100 power", { timeout: 10000 }, async () => { + const stacksToSetup = 1; + const expectedPower = 100; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + game.move.select(Moves.SPIT_UP); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); + expect(spitUp.calculateBattlePower).toHaveReturnedWith(expectedPower); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("2 stacks -> 200 power", { timeout: 10000 }, async () => { + const stacksToSetup = 2; + const expectedPower = 200; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + game.move.select(Moves.SPIT_UP); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); + expect(spitUp.calculateBattlePower).toHaveReturnedWith(expectedPower); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("3 stacks -> 300 power", { timeout: 10000 }, async () => { + const stacksToSetup = 3; + const expectedPower = 300; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + game.move.select(Moves.SPIT_UP); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); + expect(spitUp.calculateBattlePower).toHaveReturnedWith(expectedPower); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + }); + + it("fails without stacks", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeUndefined(); + + 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(spitUp.calculateBattlePower).not.toHaveBeenCalled(); + }); + + describe("restores stat boosts granted by stacks", () => { + it("decreases stats based on stored values (both boosts equal)", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + + game.move.select(Moves.SPIT_UP); + await game.phaseInterceptor.to(MovePhase); + + 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(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); + + 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 () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + + // for the sake of simplicity (and because other tests cover the setup), set boost amounts directly + stockpilingTag.statChangeCounts = { + [Stat.DEF]: -1, + [Stat.SPDEF]: 2, + }; + + 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(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); + + 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 ec3f4977007..aef44369642 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -1,17 +1,10 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, - SelectTargetPhase, - TurnEndPhase, -} from "#app/phases"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { BattlerIndex } from "#app/battle"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -31,82 +24,52 @@ describe("Moves - Spotlight", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("double"); + game.override.starterSpecies(Species.AMOONGUSS); + 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.FOLLOW_ME, Moves.SPLASH]); }); test( "move should redirect attacks to the target", async () => { - await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - const enemyStartingHp = enemyPokemon.map(p => p.hp); + game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPOTLIGHT)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY); - await game.phaseInterceptor.to(CommandPhase); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); - game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(BattlerIndex.ENEMY_2); await game.phaseInterceptor.to(TurnEndPhase, false); - expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); - expect(enemyPokemon[1].hp).toBe(enemyStartingHp[1]); + 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 () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); - - await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - /** - * Spotlight will target the slower enemy. In this situation without Spotlight being used, - * the faster enemy would normally end up with the Center of Attention tag. - */ - enemyPokemon.sort((a, b) => b.getBattleStat(Stat.SPD) - a.getBattleStat(Stat.SPD)); - const spotTarget = enemyPokemon[1].getBattlerIndex(); - const attackTarget = enemyPokemon[0].getBattlerIndex(); + 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.doAttack(getMovePosition(game.scene, 0, Moves.SPOTLIGHT)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(spotTarget); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to("BerryPhase", false); - game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); - await game.phaseInterceptor.to(SelectTargetPhase, false); - game.doSelectTarget(attackTarget); - await game.phaseInterceptor.to(TurnEndPhase, false); - - expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); - expect(enemyPokemon[0].hp).toBe(enemyStartingHp[0]); + 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 new file mode 100644 index 00000000000..d57768d0ffd --- /dev/null +++ b/src/test/moves/stockpile.test.ts @@ -0,0 +1,114 @@ +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"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +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"; + +describe("Moves - Stockpile", () => { + describe("integration 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); + + game.override.battleType("single"); + + game.override.enemySpecies(Species.RATTATA); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyAbility(Abilities.NONE); + + game.override.startingLevel(2000); + game.override.moveset([Moves.STOCKPILE, Moves.SPLASH]); + game.override.ability(Abilities.NONE); + }); + + 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()!; + + // Unfortunately, Stockpile stacks are not directly queryable (i.e. there is no pokemon.getStockpileStacks()), + // we just have to know that they're implemented as a BattlerTag. + + expect(user.getTag(StockpilingTag)).toBeUndefined(); + 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++) { + if (i !== 0) { + await game.phaseInterceptor.to(CommandPhase); + } + + game.move.select(Moves.STOCKPILE); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTag = user.getTag(StockpilingTag)!; + + if (i < 3) { // first three uses should behave normally + 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(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 }); + } + } + }); + + 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.setStatStage(Stat.DEF, 6); + user.setStatStage(Stat.SPDEF, 6); + + expect(user.getTag(StockpilingTag)).toBeUndefined(); + expect(user.getStatStage(Stat.DEF)).toBe(6); + expect(user.getStatStage(Stat.SPDEF)).toBe(6); + + game.move.select(Moves.STOCKPILE); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTag = user.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(1); + 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); + + game.move.select(Moves.STOCKPILE); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTagAgain = user.getTag(StockpilingTag)!; + expect(stockpilingTagAgain).toBeDefined(); + expect(stockpilingTagAgain.stockpiledCount).toBe(2); + 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 new file mode 100644 index 00000000000..9cea7ae8dc9 --- /dev/null +++ b/src/test/moves/swallow.test.ts @@ -0,0 +1,194 @@ +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"; +import { MovePhase } from "#app/phases/move-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 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 - Swallow", () => { + 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.NONE); + game.override.enemyLevel(2000); + + game.override.moveset([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); + game.override.ability(Abilities.NONE); + }); + + describe("consumes all stockpile stacks to heal (scaling with stacks)", () => { + it("1 stack -> 25% heal", { timeout: 10000 }, async () => { + const stacksToSetup = 1; + const expectedHeal = 25; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); + pokemon["hp"] = 1; + + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(pokemon, "heal"); + + game.move.select(Moves.SWALLOW); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.heal).toHaveBeenCalledOnce(); + expect(pokemon.heal).toHaveReturnedWith(expectedHeal); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("2 stacks -> 50% heal", { timeout: 10000 }, async () => { + const stacksToSetup = 2; + const expectedHeal = 50; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); + pokemon["hp"] = 1; + + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(pokemon, "heal"); + + game.move.select(Moves.SWALLOW); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.heal).toHaveBeenCalledOnce(); + expect(pokemon.heal).toHaveReturnedWith(expectedHeal); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("3 stacks -> 100% heal", { timeout: 10000 }, async () => { + const stacksToSetup = 3; + const expectedHeal = 100; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); + pokemon["hp"] = 0.0001; + + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(pokemon, "heal"); + + game.move.select(Moves.SWALLOW); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.heal).toHaveBeenCalledOnce(); + expect(pokemon.heal).toHaveReturnedWith(expect.closeTo(expectedHeal)); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + }); + + it("fails without stacks", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeUndefined(); + + game.move.select(Moves.SWALLOW); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.FAIL }); + }); + + 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]); + + const pokemon = game.scene.getPlayerPokemon()!; + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + + game.move.select(Moves.SWALLOW); + await game.phaseInterceptor.to(MovePhase); + + 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.getStatStage(Stat.DEF)).toBe(0); + expect(pokemon.getStatStage(Stat.SPDEF)).toBe(0); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("lower stat stages based on stored values (different boosts)", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon()!; + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag)!; + expect(stockpilingTag).toBeDefined(); + + // for the sake of simplicity (and because other tests cover the setup), set boost amounts directly + stockpilingTag.statChangeCounts = { + [Stat.DEF]: -1, + [Stat.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.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 dabf7db5f7e..b25c7524a1a 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -1,17 +1,11 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, - EnemyCommandPhase, TurnEndPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -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"; import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Tackle", () => { @@ -31,35 +25,29 @@ describe("Moves - Tackle", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.TACKLE; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); + game.override.enemySpecies(Species.MAGIKARP); + game.override.startingLevel(1); + game.override.startingWave(97); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.GROWTH, Moves.GROWTH, Moves.GROWTH, Moves.GROWTH]); + game.override.disableCrits(); }); - it("TACKLE against ghost", async() => { + it("TACKLE against ghost", async () => { const moveToUse = Moves.TACKLE; - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GENGAR); + game.override.enemySpecies(Species.GENGAR); await game.startBattle([ Species.MIGHTYENA, ]); const hpOpponent = game.scene.currentBattle.enemyParty[0].hp; - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnEndPhase); const hpLost = hpOpponent - game.scene.currentBattle.enemyParty[0].hp; expect(hpLost).toBe(0); }, 20000); - it("TACKLE against not resistant", async() => { + it("TACKLE against not resistant", async () => { const moveToUse = Moves.TACKLE; await game.startBattle([ Species.MIGHTYENA, @@ -70,16 +58,10 @@ describe("Moves - Tackle", () => { const hpOpponent = game.scene.currentBattle.enemyParty[0].hp; - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + game.move.select(moveToUse); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnEndPhase); const hpLost = hpOpponent - game.scene.currentBattle.enemyParty[0].hp; expect(hpLost).toBeGreaterThan(0); - expect(hpLost).toBe(4); + expect(hpLost).toBeLessThan(4); }, 20000); }); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 3e89e9cb14e..04730a04f7a 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -1,19 +1,13 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, - EnemyCommandPhase, - TurnInitPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {BattleStat} from "#app/data/battle-stat"; +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 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", () => { @@ -33,34 +27,28 @@ describe("Moves - Tail whip", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.TAIL_WHIP; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.battleType("single"); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.ability(Abilities.INSOMNIA); + game.override.startingLevel(2000); + 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.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - const movePosition = getMovePosition(game.scene, 0, moveToUse); - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); + 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 efba97f8fe1..d158a9cce86 100644 --- a/src/test/moves/tailwind.test.ts +++ b/src/test/moves/tailwind.test.ts @@ -1,18 +1,15 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { - TurnEndPhase, -} from "#app/phases"; +import { Stat } from "#enums/stat"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { Stat } from "#app/data/pokemon-stat.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; +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 - Wind Rider", () => { +describe("Moves - Tailwind", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,9 +25,9 @@ describe("Abilities - Wind Rider", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.battleType("double"); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("doubles the Speed stat of the Pokemons on its side", async () => { @@ -41,67 +38,65 @@ describe("Abilities - Wind Rider", () => { 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.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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(); }); it("lasts for 4 turns", async () => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); await game.startBattle([Species.MAGIKARP]); - game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + game.move.select(Moves.TAILWIND); await game.toNextTurn(); expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.toNextTurn(); expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.toNextTurn(); expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.move.select(Moves.SPLASH); await game.toNextTurn(); expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); }); it("does not affect the opposing side", async () => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); await game.startBattle([Species.MAGIKARP]); - const ally = game.scene.getPlayerPokemon(); - const enemy = game.scene.getEnemyPokemon(); + const ally = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; const allySpd = ally.getStat(Stat.SPD); const enemySpd = enemy.getStat(Stat.SPD); - expect(ally.getBattleStat(Stat.SPD)).equal(allySpd); - expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd); + expect(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(); - game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + game.move.select(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 new file mode 100644 index 00000000000..fa7a99adc14 --- /dev/null +++ b/src/test/moves/tera_blast.test.ts @@ -0,0 +1,117 @@ +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#enums/stat"; +import { allMoves } from "#app/data/move"; +import { Type } from "#app/data/type"; +import { Abilities } from "#app/enums/abilities"; +import { HitResult } from "#app/field/pokemon"; +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"; + +describe("Moves - Tera Blast", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const moveToCheck = allMoves[Moves.TERA_BLAST]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .battleType("single") + .disableCrits() + .starterSpecies(Species.FEEBAS) + .moveset([Moves.TERA_BLAST]) + .ability(Abilities.BALL_FETCH) + .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]) + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(SPLASH_ONLY) + .enemyAbility(Abilities.BALL_FETCH) + .enemyLevel(20); + + vi.spyOn(moveToCheck, "calculateBattlePower"); + }); + + it("changes type to match user's tera type", async () => { + game.override + .enemySpecies(Species.FURRET) + .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIGHTING }]); + await game.startBattle(); + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); + }, 20000); + + it("increases power if user is Stellar tera type", async () => { + game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); + + await game.startBattle(); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(100); + }, 20000); + + it("is super effective against terastallized targets if user is Stellar tera type", async () => { + game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); + + await game.startBattle(); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + vi.spyOn(enemyPokemon, "isTerastallized").mockReturnValue(true); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); + }); + + // Currently abilities are bugged and can't see when a move's category is changed + it.skip("uses the higher stat of the user's Atk and SpAtk for damage calculation", async () => { + game.override.enemyAbility(Abilities.TOXIC_DEBRIS); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 100; + playerPokemon.stats[Stat.SPATK] = 1; + + game.move.select(Moves.TERA_BLAST); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(game.scene.getEnemyPokemon()!.battleData.abilityRevealed).toBe(true); + }, 20000); + + it("causes stat drops if user is Stellar tera type", async () => { + game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1); + expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1); + }, 20000); +}); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index c641643593e..8d1d6ee5f4a 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -1,16 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - MoveEffectPhase, - TurnEndPhase -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { Abilities } from "#app/enums/abilities.js"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const TIMEOUT = 20 * 1000; @@ -30,66 +26,75 @@ describe("Moves - Thousand Arrows", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TOGETIC); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + game.override.battleType("single"); + game.override.enemySpecies(Species.TOGETIC); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.THOUSAND_ARROWS]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); - test( + it( "move should hit and ground Flying-type targets", async () => { - await game.startBattle([ Species.ILLUMISE ]); + await game.startBattle([Species.ILLUMISE]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); - - const enemyStartingHp = enemyPokemon.hp; - - game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + game.move.select(Moves.THOUSAND_ARROWS); await game.phaseInterceptor.to(MoveEffectPhase, false); // Enemy should not be grounded before move effect is applied expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(BerryPhase, false); expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); }, TIMEOUT ); - test( + it( "move should hit and ground targets with Levitate", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LEVITATE); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.LEVITATE); - await game.startBattle([ Species.ILLUMISE ]); + await game.startBattle([Species.ILLUMISE]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); - - const enemyStartingHp = enemyPokemon.hp; - - game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + game.move.select(Moves.THOUSAND_ARROWS); await game.phaseInterceptor.to(MoveEffectPhase, false); // Enemy should not be grounded before move effect is applied expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - await game.phaseInterceptor.to(TurnEndPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); }, TIMEOUT ); + + it( + "move should hit and ground targets under the effects of Magnet Rise", + async () => { + game.override.enemySpecies(Species.SNORLAX); + + await game.startBattle([Species.ILLUMISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + enemyPokemon.addTag(BattlerTagType.MAGNET_RISEN, undefined, Moves.MAGNET_RISE); + + game.move.select(Moves.THOUSAND_ARROWS); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.MAGNET_RISEN)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + } + ); }); diff --git a/src/test/moves/thunder_wave.test.ts b/src/test/moves/thunder_wave.test.ts new file mode 100644 index 00000000000..0c91be29714 --- /dev/null +++ b/src/test/moves/thunder_wave.test.ts @@ -0,0 +1,102 @@ +import { StatusEffect } from "#app/data/status-effect"; +import { Abilities } from "#app/enums/abilities"; +import { EnemyPokemon } from "#app/field/pokemon"; +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"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Thunder Wave", () => { + 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") + .starterSpecies(Species.PIKACHU) + .moveset([Moves.THUNDER_WAVE]) + .enemyMoveset(SPLASH_ONLY); + }); + + // References: https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) + + it("paralyzes non-statused Pokemon that are not Ground types", async () => { + game.override.enemySpecies(Species.MAGIKARP); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status?.effect).toBe(StatusEffect.PARALYSIS); + }, TIMEOUT); + + it("does not paralyze if the Pokemon is a Ground-type", async () => { + game.override.enemySpecies(Species.DIGLETT); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status).toBeUndefined(); + }, TIMEOUT); + + it("does not paralyze if the Pokemon already has a status effect", async () => { + game.override.enemySpecies(Species.MAGIKARP).enemyStatusEffect(StatusEffect.BURN); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.PARALYSIS); + }, TIMEOUT); + + it("affects Ground types if the user has Normalize", async () => { + game.override.ability(Abilities.NORMALIZE).enemySpecies(Species.DIGLETT); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status?.effect).toBe(StatusEffect.PARALYSIS); + }, TIMEOUT); + + it("does not affect Ghost types if the user has Normalize", async () => { + game.override.ability(Abilities.NORMALIZE).enemySpecies(Species.HAUNTER); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status).toBeUndefined(); + }, TIMEOUT); +}); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index 78b72492e04..5204b06106b 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -1,14 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { MoveEndPhase, TurnEndPhase } from "#app/phases"; +import { 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"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; -import { BattleStat } from "#app/data/battle-stat.js"; +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("Moves - Tidy Up", () => { @@ -27,96 +27,91 @@ describe("Moves - Tidy Up", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); + game.override.battleType("single"); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.starterSpecies(Species.FEEBAS); + game.override.ability(Abilities.BALL_FETCH); + game.override.moveset([Moves.TIDY_UP]); + game.override.startingLevel(50); }); - it("spikes are cleared", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); + it("spikes are cleared", async () => { + game.override.moveset([Moves.SPIKES, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPIKES)); + game.move.select(Moves.SPIKES); await game.phaseInterceptor.to(TurnEndPhase); - game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + game.move.select(Moves.TIDY_UP); await game.phaseInterceptor.to(MoveEndPhase); expect(game.scene.arena.getTag(ArenaTagType.SPIKES)).toBeUndefined(); }, 20000); - it("stealth rocks are cleared", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); + it("stealth rocks are cleared", async () => { + game.override.moveset([Moves.STEALTH_ROCK, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.STEALTH_ROCK)); + game.move.select(Moves.STEALTH_ROCK); await game.phaseInterceptor.to(TurnEndPhase); - game.doAttack(getMovePosition(game.scene, 0, 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() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); + it("toxic spikes are cleared", async () => { + game.override.moveset([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC_SPIKES)); + game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to(TurnEndPhase); - game.doAttack(getMovePosition(game.scene, 0, 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() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); + it("sticky webs are cleared", async () => { + game.override.moveset([Moves.STICKY_WEB, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.STICKY_WEB)); + game.move.select(Moves.STICKY_WEB); await game.phaseInterceptor.to(TurnEndPhase); - game.doAttack(getMovePosition(game.scene, 0, 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() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); + it.skip("substitutes are cleared", async () => { + game.override.moveset([Moves.SUBSTITUTE, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); await game.startBattle(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SUBSTITUTE)); + game.move.select(Moves.SUBSTITUTE); await game.phaseInterceptor.to(TurnEndPhase); - game.doAttack(getMovePosition(game.scene, 0, 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() => { + 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()!; - game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + 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/u_turn.test.ts b/src/test/moves/u_turn.test.ts new file mode 100644 index 00000000000..ae55302bb42 --- /dev/null +++ b/src/test/moves/u_turn.test.ts @@ -0,0 +1,100 @@ +import { Abilities } from "#app/enums/abilities"; +import { StatusEffect } from "#app/enums/status-effect"; +import { SwitchPhase } from "#app/phases/switch-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +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"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +describe("Moves - U-turn", () => { + 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.GENGAR) + .startingLevel(90) + .startingWave(97) + .moveset([Moves.U_TURN]) + .enemyMoveset(SPLASH_ONLY) + .disableCrits(); + }); + + it("triggers regenerator a single time when a regenerator user switches out with u-turn", async () => { + // arrange + const playerHp = 1; + game.override.ability(Abilities.REGENERATOR); + await game.startBattle([ + Species.RAICHU, + Species.SHUCKLE + ]); + game.scene.getPlayerPokemon()!.hp = playerHp; + + // act + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to(TurnEndPhase); + + // assert + expect(game.scene.getParty()[1].hp).toEqual(Math.floor(game.scene.getParty()[1].getMaxHp() * 0.33 + playerHp)); + expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); + expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.SHUCKLE); + }, 20000); + + it("triggers rough skin on the u-turn user before a new pokemon is switched in", async () => { + // arrange + game.override.enemyAbility(Abilities.ROUGH_SKIN); + await game.startBattle([ + Species.RAICHU, + Species.SHUCKLE + ]); + + // act + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to(SwitchPhase, false); + + // assert + const playerPkm = game.scene.getPlayerPokemon()!; + expect(playerPkm.hp).not.toEqual(playerPkm.getMaxHp()); + expect(game.scene.getEnemyPokemon()!.battleData.abilityRevealed).toBe(true); // proxy for asserting ability activated + expect(playerPkm.species.speciesId).toEqual(Species.RAICHU); + expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); + }, 20000); + + it("triggers contact abilities on the u-turn user (eg poison point) before a new pokemon is switched in", async () => { + // arrange + game.override.enemyAbility(Abilities.POISON_POINT); + await game.startBattle([ + Species.RAICHU, + Species.SHUCKLE + ]); + vi.spyOn(game.scene.getEnemyPokemon()!, "randSeedInt").mockReturnValue(0); + + // act + game.move.select(Moves.U_TURN); + await game.phaseInterceptor.to(SwitchPhase, false); + + // assert + const playerPkm = game.scene.getPlayerPokemon()!; + expect(playerPkm.status?.effect).toEqual(StatusEffect.POISON); + expect(playerPkm.species.speciesId).toEqual(Species.RAICHU); + expect(game.scene.getEnemyPokemon()!.battleData.abilityRevealed).toBe(true); // proxy for asserting ability activated + expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); + }, 20000); +}); diff --git a/src/test/moves/wide_guard.test.ts b/src/test/moves/wide_guard.test.ts new file mode 100644 index 00000000000..6feeff815b5 --- /dev/null +++ b/src/test/moves/wide_guard.test.ts @@ -0,0 +1,125 @@ +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; + +describe("Moves - Wide Guard", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("double"); + + game.override.moveset([Moves.WIDE_GUARD, Moves.SPLASH, Moves.SURF]); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset(Array(4).fill(Moves.SWIFT)); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test( + "should protect the user and allies from multi-target attack moves", + async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.WIDE_GUARD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }, TIMEOUT + ); + + test( + "should protect the user and allies from multi-target status moves", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.WIDE_GUARD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }, TIMEOUT + ); + + test( + "should not protect the user and allies from single-target moves", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.WIDE_GUARD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); + }, TIMEOUT + ); + + test( + "should protect the user from its ally's multi-target move", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.WIDE_GUARD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SURF, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon[0].hp).toBe(leadPokemon[0].getMaxHp()); + enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + }, TIMEOUT + ); +}); diff --git a/src/test/phases/phases.test.ts b/src/test/phases/phases.test.ts index 3d6da362004..5ef25361a3f 100644 --- a/src/test/phases/phases.test.ts +++ b/src/test/phases/phases.test.ts @@ -1,9 +1,11 @@ -import BattleScene from "#app/battle-scene.js"; -import { LoginPhase, TitlePhase, UnavailablePhase } from "#app/phases.js"; -import { Mode } from "#app/ui/ui.js"; -import {afterEach, beforeAll, beforeEach, describe, expect, it} from "vitest"; +import BattleScene from "#app/battle-scene"; +import { LoginPhase } from "#app/phases/login-phase"; +import { TitlePhase } from "#app/phases/title-phase"; +import { UnavailablePhase } from "#app/phases/unavailable-phase"; +import { Mode } from "#app/ui/ui"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Phases", () => { let phaserGame: Phaser.Game; diff --git a/src/test/pre.test.ts b/src/test/pre.test.ts new file mode 100644 index 00000000000..6ed29dce481 --- /dev/null +++ b/src/test/pre.test.ts @@ -0,0 +1,6 @@ +import Overrides, { defaultOverrides } from "#app/overrides"; +import { expect, test } from "vitest"; + +test("Overrides are default values", () => { + expect(Overrides).toEqual(defaultOverrides); +}); 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/settingMenu/helpers/inGameManip.ts b/src/test/settingMenu/helpers/inGameManip.ts index 1edab75fd27..b81e577f5b9 100644 --- a/src/test/settingMenu/helpers/inGameManip.ts +++ b/src/test/settingMenu/helpers/inGameManip.ts @@ -1,9 +1,6 @@ -import { - getIconForLatestInput, - getSettingNameWithKeycode -} from "#app/configs/inputs/configHandler"; -import {expect} from "vitest"; -import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; +import { getIconForLatestInput, getSettingNameWithKeycode } from "#app/configs/inputs/configHandler"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { expect } from "vitest"; export class InGameManip { private config; diff --git a/src/test/settingMenu/helpers/menuManip.ts b/src/test/settingMenu/helpers/menuManip.ts index 7b4080c3d75..90b3f1e96e6 100644 --- a/src/test/settingMenu/helpers/menuManip.ts +++ b/src/test/settingMenu/helpers/menuManip.ts @@ -1,14 +1,6 @@ -import {expect} from "vitest"; -import { - deleteBind, - getIconWithKeycode, - getIconWithSettingName, - getKeyWithKeycode, - getKeyWithSettingName, - assign, - getSettingNameWithKeycode, canIAssignThisKey, canIDeleteThisKey, canIOverrideThisSetting -} from "#app/configs/inputs/configHandler"; -import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; +import { assign, canIAssignThisKey, canIDeleteThisKey, canIOverrideThisSetting, deleteBind, getIconWithKeycode, getIconWithSettingName, getKeyWithKeycode, getKeyWithSettingName, getSettingNameWithKeycode } from "#app/configs/inputs/configHandler"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { expect } from "vitest"; export class MenuManip { private config; @@ -78,7 +70,7 @@ export class MenuManip { weWantThisBindInstead(keycode) { this.keycode = Phaser.Input.Keyboard.KeyCodes[keycode]; const icon = getIconWithKeycode(this.config, this.keycode); - const key = getKeyWithKeycode(this.config, this.keycode); + const key = getKeyWithKeycode(this.config, this.keycode)!; // TODO: is this bang correct? const _keys = key.toLowerCase().split("_"); const iconIdentifier = _keys[_keys.length-1]; expect(icon.toLowerCase().includes(iconIdentifier)).toEqual(true); @@ -86,7 +78,7 @@ export class MenuManip { } whenWeDelete(settingName?: string) { - this.settingName = SettingKeyboard[settingName] || this.settingName; + this.settingName = settingName ? SettingKeyboard[settingName] : this.settingName; // const key = getKeyWithSettingName(this.config, this.settingName); deleteBind(this.config, this.settingName); // expect(this.config.custom[key]).toEqual(-1); @@ -94,7 +86,7 @@ export class MenuManip { } whenWeTryToDelete(settingName?: string) { - this.settingName = SettingKeyboard[settingName] || this.settingName; + this.settingName = settingName ? SettingKeyboard[settingName] : this.settingName; deleteBind(this.config, this.settingName); return this; } diff --git a/src/test/settingMenu/rebinding_setting.test.ts b/src/test/settingMenu/rebinding_setting.test.ts index 010ad427d6e..ec2343cfb41 100644 --- a/src/test/settingMenu/rebinding_setting.test.ts +++ b/src/test/settingMenu/rebinding_setting.test.ts @@ -1,16 +1,13 @@ -import {beforeEach, describe, expect, it} from "vitest"; -import {deepCopy} from "#app/utils"; -import { - getKeyWithKeycode, - getKeyWithSettingName, -} from "#app/configs/inputs/configHandler"; -import {MenuManip} from "#app/test/settingMenu/helpers/menuManip"; -import {InGameManip} from "#app/test/settingMenu/helpers/inGameManip"; -import {InterfaceConfig} from "#app/inputs-controller"; import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; -import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; -import { Device } from "#enums/devices"; +import { getKeyWithKeycode, getKeyWithSettingName } from "#app/configs/inputs/configHandler"; +import { InterfaceConfig } from "#app/inputs-controller"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { deepCopy } from "#app/utils"; import { Button } from "#enums/buttons"; +import { Device } from "#enums/devices"; +import { InGameManip } from "#test/settingMenu/helpers/inGameManip"; +import { MenuManip } from "#test/settingMenu/helpers/menuManip"; +import { beforeEach, describe, expect, it } from "vitest"; describe("Test Rebinding", () => { @@ -40,13 +37,13 @@ describe("Test Rebinding", () => { expect(button).toEqual(Button.LEFT); }); it("Check key for Keyboard KeyCode", () => { - const key = getKeyWithKeycode(config, Phaser.Input.Keyboard.KeyCodes.LEFT); + const key = getKeyWithKeycode(config, Phaser.Input.Keyboard.KeyCodes.LEFT) ?? ""; const settingName = config.custom[key]; const button = config.settings[settingName]; expect(button).toEqual(Button.LEFT); }); it("Check key for currenly Assigned to action not alt", () => { - const key = getKeyWithKeycode(config, Phaser.Input.Keyboard.KeyCodes.A); + const key = getKeyWithKeycode(config, Phaser.Input.Keyboard.KeyCodes.A) ?? ""; const settingName = config.custom[key]; const button = config.settings[settingName]; expect(button).toEqual(Button.LEFT); @@ -69,25 +66,25 @@ describe("Test Rebinding", () => { }); it("Check icon for currenly Assigned to key code", () => { const keycode = Phaser.Input.Keyboard.KeyCodes.LEFT; - const key = getKeyWithKeycode(config, keycode); + const key = getKeyWithKeycode(config, keycode) ?? ""; const icon = config.icons[key]; expect(icon).toEqual("KEY_ARROW_LEFT.png"); }); it("Check icon for currenly Assigned to key code", () => { const keycode = Phaser.Input.Keyboard.KeyCodes.A; - const key = getKeyWithKeycode(config, keycode); + const key = getKeyWithKeycode(config, keycode) ?? ""; const icon = config.icons[key]; expect(icon).toEqual("A.png"); }); it("Check icon for currenly Assigned to setting name", () => { const settingName = SettingKeyboard.Button_Left; - const key = getKeyWithSettingName(config, settingName); + const key = getKeyWithSettingName(config, settingName) ?? ""; const icon = config.icons[key]; expect(icon).toEqual("KEY_ARROW_LEFT.png"); }); it("Check icon for currenly Assigned to setting name alt", () => { const settingName = SettingKeyboard.Alt_Button_Left; - const key = getKeyWithSettingName(config, settingName); + const key = getKeyWithSettingName(config, settingName) ?? ""; const icon = config.icons[key]; expect(icon).toEqual("A.png"); }); @@ -372,7 +369,7 @@ describe("Test Rebinding", () => { it("test keyboard listener", () => { const keyDown = Phaser.Input.Keyboard.KeyCodes.S; - const key = getKeyWithKeycode(config, keyDown); + const key = getKeyWithKeycode(config, keyDown) ?? ""; const settingName = config.custom[key]; const buttonDown = config.settings[settingName]; expect(buttonDown).toEqual(Button.DOWN); diff --git a/src/test/sprites/pokemonSprite.test.ts b/src/test/sprites/pokemonSprite.test.ts index 5c1db85fa6f..faf0626b365 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/src/test/sprites/pokemonSprite.test.ts @@ -1,20 +1,21 @@ -import {beforeAll, describe, expect, it} from "vitest"; -import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; +import { getAppRootDir } from "#test/sprites/spritesUtils"; import fs from "fs"; import path from "path"; -import {getAppRootDir} from "#app/test/sprites/spritesUtils"; +import { beforeAll, describe, expect, it } from "vitest"; +import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; -const deepCopy = (data) => { +type PokemonVariantMasterlist = typeof _masterlist; + +const deepCopy = (data: any) => { return JSON.parse(JSON.stringify(data)); }; - describe("check if every variant's sprite are correctly set", () => { - let masterlist; - let expVariant; - let femaleVariant; - let backVariant; - let rootDir; + let masterlist: PokemonVariantMasterlist; + let expVariant: PokemonVariantMasterlist["exp"]; + let femaleVariant: PokemonVariantMasterlist["female"]; + let backVariant: PokemonVariantMasterlist["back"]; + let rootDir: string; beforeAll(() => { rootDir = `${getAppRootDir()}${path.sep}public${path.sep}images${path.sep}pokemon${path.sep}variant${path.sep}`; @@ -22,23 +23,26 @@ describe("check if every variant's sprite are correctly set", () => { expVariant = masterlist.exp; femaleVariant = masterlist.female; backVariant = masterlist.back; - delete masterlist.exp; - delete masterlist.female; - delete masterlist.back; + //@ts-ignore + delete masterlist.exp; //TODO: resolve ts-ignore + //@ts-ignore + delete masterlist.female; //TODO: resolve ts-ignore + //@ts-ignore + delete masterlist.back; //TODO: resolve ts-ignore }); it("data should not be undefined", () => { - expect(masterlist).not.toBeUndefined(); - expect(expVariant).not.toBeUndefined(); - expect(femaleVariant).not.toBeUndefined(); - expect(backVariant).not.toBeUndefined(); + expect(masterlist).toBeDefined(); + expect(expVariant).toBeDefined(); + expect(femaleVariant).toBeDefined(); + expect(backVariant).toBeDefined(); }); - function getMissingMasterlist(mlist, dirpath, excludes = []) { - const errors = []; + function getMissingMasterlist(mlist: any, dirpath: string, excludes: string[] = []): string[] { + const errors: string[] = []; const trimmedDirpath = `variant${path.sep}${dirpath.split(rootDir)[1]}`; if (fs.existsSync(dirpath)) { - const files = fs.readdirSync(dirpath); + const files = fs.readdirSync(dirpath).filter((filename) => !/^\..*/.test(filename)); for (const filename of files) { const filePath = `${dirpath}${filename}`; const trimmedFilePath = `${trimmedDirpath}${filename}`; @@ -101,12 +105,12 @@ describe("check if every variant's sprite are correctly set", () => { return errors; } - function getMissingFiles(keys, dirPath) { - const errors = []; + function getMissingFiles(keys: Record, dirPath: string): string[] { + const errors: string[] = []; for (const key of Object.keys(keys)) { const row = keys[key]; for (const [index, elm] of row.entries()) { - let url; + let url: string; if (elm === 0) { continue; } else if (elm === 1) { diff --git a/src/test/ui/starter-select.test.ts b/src/test/ui/starter-select.test.ts index 2b5df315a70..6d26ebfd6b3 100644 --- a/src/test/ui/starter-select.test.ts +++ b/src/test/ui/starter-select.test.ts @@ -1,23 +1,21 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import { - EncounterPhase, - SelectStarterPhase, - TitlePhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {GameModes} from "#app/game-mode"; -import StarterSelectUiHandler from "#app/ui/starter-select-ui-handler"; -import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; +import { Gender } from "#app/data/gender"; +import { Nature } from "#app/data/nature"; +import { allSpecies } from "#app/data/pokemon-species"; +import { GameModes } from "#app/game-mode"; +import { EncounterPhase } from "#app/phases/encounter-phase"; +import { SelectStarterPhase } from "#app/phases/select-starter-phase"; +import { TitlePhase } from "#app/phases/title-phase"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import SaveSlotSelectUiHandler from "#app/ui/save-slot-select-ui-handler"; -import {OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; -import {Gender} from "#app/data/gender"; -import {allSpecies} from "#app/data/pokemon-species"; -import {Nature} from "#app/data/nature"; -import { Button } from "#enums/buttons"; +import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; +import StarterSelectUiHandler from "#app/ui/starter-select-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; +import { Button } from "#enums/buttons"; 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("UI - Starter select", () => { @@ -54,12 +52,13 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -72,7 +71,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { @@ -113,13 +112,14 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.CYCLE_GENDER); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -132,7 +132,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { @@ -174,6 +174,7 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.CYCLE_GENDER); handler.processInput(Button.CYCLE_NATURE); handler.processInput(Button.CYCLE_ABILITY); @@ -181,8 +182,8 @@ describe("UI - Starter select", () => { game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -195,7 +196,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { @@ -217,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]; @@ -237,13 +239,14 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.CYCLE_GENDER); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -256,7 +259,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { @@ -297,13 +300,14 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); - handler.processInput(Button.CYCLE_SHINY); + handler.processInput(Button.LEFT); handler.processInput(Button.ACTION); + handler.processInput(Button.CYCLE_SHINY); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -316,7 +320,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { @@ -356,14 +360,15 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.V); handler.processInput(Button.V); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -376,7 +381,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { @@ -400,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]; @@ -416,15 +421,14 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); - handler.processInput(Button.V); - handler.processInput(Button.V); + handler.processInput(Button.LEFT); handler.processInput(Button.V); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -437,7 +441,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { @@ -458,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() => { @@ -479,13 +483,12 @@ describe("UI - Starter select", () => { handler.processInput(Button.RIGHT); handler.processInput(Button.RIGHT); handler.processInput(Button.RIGHT); - handler.processInput(Button.RIGHT); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -498,7 +501,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); let starterSelectUiHandler: StarterSelectUiHandler; await new Promise((resolve) => { @@ -509,10 +512,10 @@ describe("UI - Starter select", () => { }); }); - expect(starterSelectUiHandler.starterGens[0]).toBe(0); - expect(starterSelectUiHandler.starterCursors[0]).toBe(3); - expect(starterSelectUiHandler.cursorObj.x).toBe(132 + 4 * 18); - expect(starterSelectUiHandler.cursorObj.y).toBe(10); + // expect(starterSelectUiHandler.starterGens[0]).toBe(0); + // expect(starterSelectUiHandler.starterCursors[0]).toBe(3); + // expect(starterSelectUiHandler.cursorObj.x).toBe(132 + 4 * 18); + // expect(starterSelectUiHandler.cursorObj.y).toBe(10); game.onNextPrompt("SelectStarterPhase", Mode.CONFIRM, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; @@ -544,14 +547,13 @@ describe("UI - Starter select", () => { handler.processInput(Button.RIGHT); handler.processInput(Button.RIGHT); handler.processInput(Button.RIGHT); - handler.processInput(Button.RIGHT); handler.processInput(Button.DOWN); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); - let options: OptionSelectItem[]; - let optionSelectUiHandler: OptionSelectUiHandler; + let options: OptionSelectItem[] = []; + let optionSelectUiHandler: OptionSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; @@ -564,9 +566,9 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === "Manage Moves")).toBe(true); expect(options.some(option => option.label === "Use Candies")).toBe(true); expect(options.some(option => option.label === "Cancel")).toBe(true); - optionSelectUiHandler.processInput(Button.ACTION); + optionSelectUiHandler?.processInput(Button.ACTION); - let starterSelectUiHandler: StarterSelectUiHandler; + let starterSelectUiHandler: StarterSelectUiHandler | undefined; await new Promise((resolve) => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { starterSelectUiHandler = game.scene.ui.getHandler() as StarterSelectUiHandler; @@ -575,10 +577,11 @@ describe("UI - Starter select", () => { }); }); - expect(starterSelectUiHandler.starterGens[0]).toBe(0); - expect(starterSelectUiHandler.starterCursors[0]).toBe(12); - expect(starterSelectUiHandler.cursorObj.x).toBe(132 + 4 * 18); - expect(starterSelectUiHandler.cursorObj.y).toBe(28); + expect(starterSelectUiHandler?.starterSpecies.length).toBe(1); + expect(starterSelectUiHandler?.starterSpecies[0].generation).toBe(1); + expect(starterSelectUiHandler?.starterSpecies[0].speciesId).toBe(32); + expect(starterSelectUiHandler?.cursorObj.x).toBe(53); + expect(starterSelectUiHandler?.cursorObj.y).toBe(31); game.onNextPrompt("SelectStarterPhase", Mode.CONFIRM, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts new file mode 100644 index 00000000000..f7dea463574 --- /dev/null +++ b/src/test/ui/transfer-item.test.ts @@ -0,0 +1,96 @@ +import { BerryType } from "#app/enums/berry-type"; +import { Button } from "#app/enums/buttons"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { BattleEndPhase } from "#app/phases/battle-end-phase"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + + +describe("UI - Transfer Items", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.startingLevel(100); + game.override.startingWave(1); + game.override.startingHeldItems([ + { name: "BERRY", count: 1, type: BerryType.SITRUS }, + { name: "BERRY", count: 2, type: BerryType.APICOT }, + { name: "BERRY", count: 2, type: BerryType.LUM }, + ]); + game.override.moveset([Moves.DRAGON_CLAW]); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyMoveset([Moves.SPLASH]); + + await game.startBattle([Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA]); + + game.move.select(Moves.DRAGON_CLAW); + + game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { + expect(game.scene.ui.getHandler()).toBeInstanceOf(ModifierSelectUiHandler); + + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + handler.setCursor(1); + handler.processInput(Button.ACTION); + + game.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER); + }); + + await game.phaseInterceptor.to(BattleEndPhase); + }); + + it("check red tint for held item limit in transfer menu", async () => { + game.onNextPrompt("SelectModifierPhase", Mode.PARTY, () => { + expect(game.scene.ui.getHandler()).toBeInstanceOf(PartyUiHandler); + + const handler = game.scene.ui.getHandler() as PartyUiHandler; + handler.processInput(Button.ACTION); + + expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Sitrus Berry"))).toBe(true); + expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Apicot Berry (2)"))).toBe(true); + expect(handler.optionsContainer.list.some((option) => RegExp(/Lum Berry\[color.*(2)/).exec((option as BBCodeText).text))).toBe(true); + + game.phaseInterceptor.unlock(); + }); + + await game.phaseInterceptor.to(SelectModifierPhase); + }, 20000); + + it("check transfer option for pokemon to transfer to", async () => { + game.onNextPrompt("SelectModifierPhase", Mode.PARTY, () => { + expect(game.scene.ui.getHandler()).toBeInstanceOf(PartyUiHandler); + + const handler = game.scene.ui.getHandler() as PartyUiHandler; + handler.processInput(Button.ACTION); // select Pokemon + handler.processInput(Button.ACTION); // select held item (Sitrus Berry) + + handler.setCursor(1); // move to other Pokemon + handler.processInput(Button.ACTION); // select Pokemon + + expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Transfer"))).toBe(true); + + game.phaseInterceptor.unlock(); + }); + + await game.phaseInterceptor.to(SelectModifierPhase); + }, 20000); +}); diff --git a/src/test/ui/type-hints.test.ts b/src/test/ui/type-hints.test.ts new file mode 100644 index 00000000000..ccab02b82bf --- /dev/null +++ b/src/test/ui/type-hints.test.ts @@ -0,0 +1,89 @@ +import { Button } from "#app/enums/buttons"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { CommandPhase } from "#app/phases/command-phase"; +import FightUiHandler from "#app/ui/fight-ui-handler"; +import { Mode } from "#app/ui/ui"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import MockText from "../utils/mocks/mocksContainer/mockText"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +describe("UI - Type Hints", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + game.settings.typeHints(true); //activate type hints + game.override.battleType("single").startingLevel(100).startingWave(1).enemyMoveset(SPLASH_ONLY); + }); + + it("check immunity color", async () => { + game.override + .battleType("single") + .startingLevel(100) + .startingWave(1) + .enemySpecies(Species.FLORGES) + .enemyMoveset(SPLASH_ONLY) + .moveset([Moves.DRAGON_CLAW]); + game.settings.typeHints(true); //activate type hints + + await game.startBattle([Species.RAYQUAZA]); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + const { ui } = game.scene; + const handler = ui.getHandler(); + handler.processInput(Button.ACTION); // select "Fight" + game.phaseInterceptor.unlock(); + }); + + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const { ui } = game.scene; + const movesContainer = ui.getByName(FightUiHandler.MOVES_CONTAINER_NAME); + const dragonClawText = movesContainer + .getAll() + .find((text) => text.text === "Dragon Claw")! as unknown as MockText; + + expect.soft(dragonClawText.color).toBe("#929292"); + ui.getHandler().processInput(Button.ACTION); + }); + await game.phaseInterceptor.to(CommandPhase); + }); + + it("check status move color", async () => { + game.override.enemySpecies(Species.FLORGES).moveset([Moves.GROWL]); + + await game.startBattle([Species.RAYQUAZA]); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + const { ui } = game.scene; + const handler = ui.getHandler(); + handler.processInput(Button.ACTION); // select "Fight" + game.phaseInterceptor.unlock(); + }); + + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const { ui } = game.scene; + const movesContainer = ui.getByName(FightUiHandler.MOVES_CONTAINER_NAME); + const growlText = movesContainer + .getAll() + .find((text) => text.text === "Growl")! as unknown as MockText; + + expect.soft(growlText.color).toBe(undefined); + ui.getHandler().processInput(Button.ACTION); + }); + await game.phaseInterceptor.to(CommandPhase); + }); +}); diff --git a/src/test/utils/TextInterceptor.ts b/src/test/utils/TextInterceptor.ts index 34b55aa30ac..507161eb6d0 100644 --- a/src/test/utils/TextInterceptor.ts +++ b/src/test/utils/TextInterceptor.ts @@ -1,6 +1,6 @@ export default class TextInterceptor { private scene; - public logs = []; + public logs: string[] = []; constructor(scene) { this.scene = scene; scene.messageWrapper = this; @@ -11,7 +11,12 @@ export default class TextInterceptor { this.logs.push(text); } + showDialogue(text: string, name: string, delay?: integer, callback?: Function, callbackDelay?: integer, promptDelay?: integer): void { + console.log(name, text); + this.logs.push(name, text); + } + getLatestMessage(): string { - return this.logs.pop(); + return this.logs.pop() ?? ""; } } diff --git a/src/test/utils/fakeMobile.html b/src/test/utils/fakeMobile.html index 6fa0406f361..4b566d592d9 100644 --- a/src/test/utils/fakeMobile.html +++ b/src/test/utils/fakeMobile.html @@ -1,50 +1,69 @@
-
- - - - - - - +
+
+
+ + + + + + + +
+
-
-
- A -
-
- B -
-
-
- R -
-
- V -
-
- C -
-
- Menu +
+
+
+ A
-
-
- F -
-
- G -
-
- E -
-
- N + +
+
+ B
+ +
+
+ R +
+
+ V +
+
+ C +
+
+ Menu +
+
+ +
+
+ F +
+
+ G +
+
+ E +
+
+ N +
+
+ V +
+
+
\ No newline at end of file diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 84d39024dc9..ade33aa1148 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -1,38 +1,55 @@ -import GameWrapper from "#app/test/utils/gameWrapper"; -import {Mode} from "#app/ui/ui"; -import {generateStarter, waitUntil} from "#app/test/utils/gameManagerUtils"; -import { - CommandPhase, - EncounterPhase, - FaintPhase, - LoginPhase, - NewBattlePhase, - SelectStarterPhase, - TitlePhase, TurnInitPhase, - TurnStartPhase, -} from "#app/phases"; -import BattleScene from "#app/battle-scene.js"; -import PhaseInterceptor from "#app/test/utils/phaseInterceptor"; -import TextInterceptor from "#app/test/utils/TextInterceptor"; -import {GameModes, getGameMode} from "#app/game-mode"; -import fs from "fs"; -import {AES, enc} from "crypto-js"; -import {updateUserInfo} from "#app/account"; -import InputsHandler from "#app/test/utils/inputsHandler"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import {EnemyPokemon, PlayerPokemon} from "#app/field/pokemon"; -import {MockClock} from "#app/test/utils/mocks/mockClock"; -import {Command} from "#app/ui/command-ui-handler"; -import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import PartyUiHandler, {PartyUiMode} from "#app/ui/party-ui-handler"; +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"; +import { NewBattlePhase } from "#app/phases/new-battle-phase"; +import { SelectStarterPhase } from "#app/phases/select-starter-phase"; +import { SelectTargetPhase } from "#app/phases/select-target-phase"; +import { TitlePhase } from "#app/phases/title-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +import { TurnStartPhase } from "#app/phases/turn-start-phase"; +import ErrorInterceptor from "#app/test/utils/errorInterceptor"; +import InputsHandler from "#app/test/utils/inputsHandler"; +import { MockClock } from "#app/test/utils/mocks/mockClock"; +import CommandUiHandler from "#app/ui/command-ui-handler"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import PartyUiHandler from "#app/ui/party-ui-handler"; +import TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { Button } from "#enums/buttons"; import { ExpNotification } from "#enums/exp-notification"; import { GameDataType } from "#enums/game-data-type"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; -import { Button } from "#enums/buttons"; -import { BattlerIndex } from "#app/battle.js"; -import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; +import { generateStarter, waitUntil } from "#test/utils/gameManagerUtils"; +import GameWrapper from "#test/utils/gameWrapper"; +import PhaseInterceptor from "#test/utils/phaseInterceptor"; +import TextInterceptor from "#test/utils/TextInterceptor"; +import { AES, enc } from "crypto-js"; +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. @@ -43,6 +60,13 @@ export default class GameManager { public phaseInterceptor: PhaseInterceptor; public textInterceptor: TextInterceptor; public inputsHandler: InputsHandler; + public readonly override: OverridesHelper; + 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. @@ -52,12 +76,19 @@ export default class GameManager { constructor(phaserGame: Phaser.Game, bypassLogin: boolean = true) { localStorage.clear(); ErrorInterceptor.getInstance().clear(); - BattleScene.prototype.randBattleSeedInt = (arg) => arg-1; + BattleScene.prototype.randBattleSeedInt = (range, min: number = 0) => min + range - 1; // This simulates a max roll this.gameWrapper = new GameWrapper(phaserGame, bypassLogin); this.scene = new BattleScene(); this.phaseInterceptor = new PhaseInterceptor(this.scene); this.textInterceptor = new TextInterceptor(this.scene); this.gameWrapper.setScene(this.scene); + this.override = new OverridesHelper(this); + 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); } /** @@ -84,7 +115,7 @@ export default class GameManager { * Ends the current phase. */ endPhase() { - this.scene.getCurrentPhase().end(); + this.scene.getCurrentPhase()?.end(); } /** @@ -114,75 +145,84 @@ export default class GameManager { this.scene.expParty = ExpNotification.SKIP; this.scene.hpBarSpeed = 3; this.scene.enableTutorials = false; - this.scene.gameData.gender = PlayerGender.MALE; - + this.scene.gameData.gender = PlayerGender.MALE; // set initial player gender + this.scene.battleStyle = this.settings.battleStyle; } /** - * Runs the game to the summon phase. - * @param species - Optional array of species to summon. - * @returns A promise that resolves when the summon phase is reached. + * Helper function to run to the final boss encounter as it's a bit tricky due to extra dialogue + * Also handles Major/Minor bosses from endless modes + * @param game - The game manager + * @param species + * @param mode */ - async runToSummon(species?: Species[]) { + async runToFinalBossEncounter(species: Species[], mode: GameModes) { + console.log("===to final boss encounter==="); await this.runToTitle(); this.onNextPrompt("TitlePhase", Mode.TITLE, () => { - this.scene.gameMode = getGameMode(GameModes.CLASSIC); + 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); }); - await this.phaseInterceptor.run(EncounterPhase); + // This will consider all battle entry dialog as seens and skip them + vi.spyOn(this.scene.ui, "shouldSkipDialogue").mockReturnValue(true); + + if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { + this.removeEnemyHeldItems(); + } + + await this.phaseInterceptor.to(EncounterPhase); + console.log("===finished run to final boss encounter==="); } /** + * @deprecated Use `game.classicMode.startBattle()` or `game.dailyMode.startBattle()` instead + * * 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); + await this.classicMode.runToSummon(species); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + if (this.scene.battleStyle === BattleStyle.SWITCH) { + this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + } await this.phaseInterceptor.to(CommandPhase); console.log("==================[New Turn]=================="); } /** - * Emulate a player attack - * @param movePosition the index of the move in the pokemon's moveset array + * Emulate a player's target selection after a move is chosen, usually called automatically by {@linkcode MoveHelper.select}. + * Will trigger during the next {@linkcode SelectTargetPhase} + * @param {BattlerIndex} targetIndex The index of the attack target, or `undefined` for multi-target attacks + * @param movePosition The index of the move in the pokemon's moveset array */ - doAttack(movePosition: integer) { - this.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - this.scene.ui.setMode(Mode.FIGHT, (this.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - }); - this.onNextPrompt("CommandPhase", Mode.FIGHT, () => { - (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); - }); - } - - /** - * Emulate a player's target selection after an attack is chosen, - * usually called after {@linkcode doAttack} in a double battle. - * @param {BattlerIndex} targetIndex the index of the attack target - */ - doSelectTarget(targetIndex: BattlerIndex) { + selectTarget(movePosition: integer, targetIndex?: BattlerIndex) { this.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { const handler = this.scene.ui.getHandler() as TargetSelectUiHandler; - handler.setCursor(targetIndex); + const move = (this.scene.getCurrentPhase() as SelectTargetPhase).getPokemon().getMoveset()[movePosition]!.getMove(); // TODO: is the bang correct? + if (!move.isMultiTarget()) { + handler.setCursor(targetIndex !== undefined ? targetIndex : BattlerIndex.ENEMY); + } + if (move.isMultiTarget() && targetIndex !== undefined) { + throw new Error(`targetIndex was passed to selectMove() but move ("${move.name}") is not targetted`); + } handler.processInput(Button.ACTION); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnStartPhase)); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(MovePhase) || this.isCurrentPhase(TurnStartPhase) || this.isCurrentPhase(TurnEndPhase)); } /** Faint all opponents currently on the field */ @@ -198,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; @@ -246,7 +313,7 @@ export default class GameManager { */ isCurrentPhase(phaseTarget) { const targetName = typeof phaseTarget === "string" ? phaseTarget : phaseTarget.name; - return this.scene.getCurrentPhase().constructor.name === targetName; + return this.scene.getCurrentPhase()?.constructor.name === targetName; } /** @@ -269,7 +336,7 @@ export default class GameManager { await waitUntil(() => this.scene.ui?.getMode() === Mode.TITLE); await this.scene.gameData.tryExportData(GameDataType.SESSION, 0); await waitUntil(() => localStorage.hasOwnProperty("toExport")); - return resolve(localStorage.getItem("toExport")); + return resolve(localStorage.getItem("toExport")!); // TODO: is this bang correct?; }); } @@ -280,7 +347,7 @@ export default class GameManager { */ async importData(path): Promise<[boolean, integer]> { const saveKey = "x0i2O7WRiANTqPmZ"; - const dataRaw = fs.readFileSync(path, {encoding: "utf8", flag: "r"}); + const dataRaw = fs.readFileSync(path, { encoding: "utf8", flag: "r" }); let dataStr = AES.decrypt(dataRaw, saveKey).toString(enc.Utf8); dataStr = this.scene.gameData.convertSystemDataStr(dataStr); const systemData = this.scene.gameData.parseSystemData(dataStr); @@ -294,7 +361,7 @@ export default class GameManager { async killPokemon(pokemon: PlayerPokemon | EnemyPokemon) { (this.scene.time as MockClock).overrideDelay = 0.01; - return new Promise(async(resolve, reject) => { + return new Promise(async (resolve, reject) => { pokemon.hp = 0; this.scene.pushPhase(new FaintPhase(this.scene, pokemon.getBattlerIndex(), true)); await this.phaseInterceptor.to(FaintPhase).catch((e) => reject(e)); @@ -304,15 +371,69 @@ export default class GameManager { } /** - * Switch pokemon and transition to the enemy command phase + * Command an in-battle switch to another Pokemon via the main battle menu. * @param pokemonIndex the index of the pokemon in your party to switch to */ doSwitchPokemon(pokemonIndex: number) { this.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - this.scene.ui.setMode(Mode.PARTY, PartyUiMode.SWITCH, (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), null, PartyUiHandler.FilterNonFainted); + (this.scene.ui.getHandler() as CommandUiHandler).setCursor(2); + (this.scene.ui.getHandler() as CommandUiHandler).processInput(Button.ACTION); }); - this.onNextPrompt("CommandPhase", Mode.PARTY, () => { - (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, pokemonIndex, false); + + this.doSelectPartyPokemon(pokemonIndex, "CommandPhase"); + } + + /** + * Revive pokemon, currently players only. + * @param pokemonIndex the index of the pokemon in your party to revive + */ + doRevivePokemon(pokemonIndex: number) { + const party = this.scene.getParty(); + const candidate = new ModifierTypeOption(modifierTypes.MAX_REVIVE(), 0); + const modifier = candidate.type!.newModifier(party[pokemonIndex]); + this.scene.addModifier(modifier, false); + } + + /** + * Select a pokemon from the party menu. Only really handles the basic cases + * of the party UI, where you just need to navigate to a party slot and press + * Action twice - navigating any menus that come up after you select a party member + * is not supported. + * @param slot the index of the pokemon in your party to switch to + * @param inPhase Which phase to expect the selection to occur in. Typically + * non-command switch actions happen in SwitchPhase. + */ + doSelectPartyPokemon(slot: number, inPhase = "SwitchPhase") { + this.onNextPrompt(inPhase, Mode.PARTY, () => { + const partyHandler = this.scene.ui.getHandler() as PartyUiHandler; + + partyHandler.setCursor(slot); + partyHandler.processInput(Button.ACTION); // select party slot + partyHandler.processInput(Button.ACTION); // send out (or whatever option is at the top) }); } + + /** + * 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 + * ```ts + * await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2]); + * ``` + */ + async setTurnOrder(order: BattlerIndex[]): Promise { + await this.phaseInterceptor.to(TurnStartPhase, false); + + vi.spyOn(this.scene.getCurrentPhase() as TurnStartPhase, "getSpeedOrder").mockReturnValue(order); + } + + /** + * Removes all held items from enemy pokemon + */ + removeEnemyHeldItems(): void { + this.scene.clearEnemyHeldItemModifiers(); + this.scene.clearEnemyModifiers(); + console.log("Enemy held items removed"); + } } diff --git a/src/test/utils/gameManagerUtils.ts b/src/test/utils/gameManagerUtils.ts index db9ba7174a9..20a3fd179fd 100644 --- a/src/test/utils/gameManagerUtils.ts +++ b/src/test/utils/gameManagerUtils.ts @@ -1,12 +1,14 @@ -// Function to convert Blob to string -import {getDailyRunStarters} from "#app/data/daily-run"; -import {Gender} from "#app/data/gender"; -import {Species} from "#enums/species"; -import {Starter} from "#app/ui/starter-select-ui-handler"; -import {GameModes, getGameMode} from "#app/game-mode"; -import {getPokemonSpecies, getPokemonSpeciesForm} from "#app/data/pokemon-species"; -import {PlayerPokemon} from "#app/field/pokemon"; +import BattleScene from "#app/battle-scene"; +import { getDailyRunStarters } from "#app/data/daily-run"; +import { Gender } from "#app/data/gender"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import { Moves } from "#app/enums/moves"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { GameModes, getGameMode } from "#app/game-mode"; +import { Starter } from "#app/ui/starter-select-ui-handler"; +import { Species } from "#enums/species"; +/** Function to convert Blob to string */ export function blobToString(blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -79,9 +81,11 @@ export function waitUntil(truth) { }); } -export function getMovePosition(scene, pokemonIndex, moveIndex) { +/** Get the index of `move` from the moveset of the pokemon on the player's field at location `pokemonIndex` */ +export function getMovePosition(scene: BattleScene, pokemonIndex: 0 | 1, move: Moves) { const playerPokemon = scene.getPlayerField()[pokemonIndex]; const moveSet = playerPokemon.getMoveset(); - const index = moveSet.findIndex((move) => move.moveId === moveIndex); + const index = moveSet.findIndex((m) => m?.moveId === move); + console.log(`Move position for ${Moves[move]} (=${move}):`, index); return index; } diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index b1b00c8e15d..f3098fa9b71 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -1,30 +1,28 @@ /* eslint-disable */ // @ts-nocheck -import * as main from "#app/main"; +import BattleScene, * as battleScene from "#app/battle-scene"; +import { MoveAnim } from "#app/data/battle-anims"; +import Pokemon from "#app/field/pokemon"; +import * as Utils from "#app/utils"; +import { blobToString } from "#test/utils/gameManagerUtils"; +import { MockClock } from "#test/utils/mocks/mockClock"; +import mockConsoleLog from "#test/utils/mocks/mockConsoleLog"; +import { MockFetch } from "#test/utils/mocks/mockFetch"; +import MockLoader from "#test/utils/mocks/mockLoader"; +import mockLocalStorage from "#test/utils/mocks/mockLocalStorage"; +import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; +import MockTextureManager from "#test/utils/mocks/mockTextureManager"; import fs from "fs"; +import Phaser from "phaser"; +import InputText from "phaser3-rex-plugins/plugins/inputtext"; +import { vi } from "vitest"; +import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; import InputManager = Phaser.Input.InputManager; import KeyboardManager = Phaser.Input.Keyboard.KeyboardManager; import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; import EventEmitter = Phaser.Events.EventEmitter; import UpdateList = Phaser.GameObjects.UpdateList; -import MockGraphics from "#app/test/utils/mocks/mocksContainer/mockGraphics"; -import MockTextureManager from "#app/test/utils/mocks/mockTextureManager"; -import Phaser from "phaser"; -import {blobToString} from "#app/test/utils/gameManagerUtils"; -import {vi} from "vitest"; -import mockLocalStorage from "#app/test/utils/mocks/mockLocalStorage"; -import mockConsoleLog from "#app/test/utils/mocks/mockConsoleLog"; -import MockLoader from "#app/test/utils/mocks/mockLoader"; -import {MockFetch} from "#app/test/utils/mocks/mockFetch"; -import * as Utils from "#app/utils"; -import InputText from "phaser3-rex-plugins/plugins/inputtext"; -import {MockClock} from "#app/test/utils/mocks/mockClock"; -import BattleScene from "#app/battle-scene.js"; -import {MoveAnim} from "#app/data/battle-anims"; -import Pokemon from "#app/field/pokemon"; -import * as battleScene from "#app/battle-scene"; -import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage.js"; Object.defineProperty(window, "localStorage", { value: mockLocalStorage(), @@ -40,7 +38,7 @@ Phaser.GameObjects.Image = MockImage; window.URL.createObjectURL = (blob: Blob) => { blobToString(blob).then((data: string) => { localStorage.setItem("toExport", data); - }) + }); return null; }; navigator.getGamepads = vi.fn().mockReturnValue([]); @@ -88,6 +86,7 @@ export default class GameWrapper { frames: {}, }); Pokemon.prototype.enableMask = () => null; + Pokemon.prototype.updateFusionPalette = () => null; } setScene(scene: BattleScene) { @@ -100,7 +99,7 @@ export default class GameWrapper { injectMandatory() { this.game.config = { seed: ["test"], - } + }; this.scene.game = this.game; this.game.renderer = { maxTextures: -1, @@ -127,7 +126,9 @@ export default class GameWrapper { manager: { game: this.game, }, + destroy: () => null, setVolume: () => null, + stop: () => null, stopByKey: () => null, on: (evt, callback) => callback(), key: "", @@ -138,7 +139,7 @@ export default class GameWrapper { setPostPipeline: () => null, removePostPipeline: () => null, }, - } + }; this.scene.tweens = { add: (data) => { @@ -201,6 +202,7 @@ export default class GameWrapper { }; const mockTextureManager = new MockTextureManager(this.scene); this.scene.add = mockTextureManager.add; + this.scene.textures = mockTextureManager; this.scene.sys.displayList = this.scene.add.displayList; this.scene.sys.updateList = new UpdateList(this.scene); this.scene.systems = this.scene.sys; @@ -223,13 +225,9 @@ export default class GameWrapper { return resolve(response); }); }; - this.scene.make = { - graphics: (config) => new MockGraphics(mockTextureManager, config), - rexTransitionImagePack: () => ({ - transit: () => null, - }), - }; + this.scene.make = new MockGameObjectCreator(mockTextureManager); this.scene.time = new MockClock(this.scene); + this.scene.remove = vi.fn(); } } @@ -245,6 +243,7 @@ function createFetchResponse(data) { return { ok: true, status: 200, + headers: new Headers(), json: () => Promise.resolve(data), text: () => Promise.resolve(JSON.stringify(data)), }; @@ -254,7 +253,8 @@ function createFetchBadResponse(data) { return { ok: false, status: 404, + headers: new Headers(), json: () => Promise.resolve(data), text: () => Promise.resolve(JSON.stringify(data)), }; -} \ No newline at end of file +} 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/classicModeHelper.ts b/src/test/utils/helpers/classicModeHelper.ts new file mode 100644 index 00000000000..55e995fc9dc --- /dev/null +++ b/src/test/utils/helpers/classicModeHelper.ts @@ -0,0 +1,63 @@ +import { BattleStyle } from "#app/enums/battle-style"; +import { Species } from "#app/enums/species"; +import { GameModes, getGameMode } from "#app/game-mode"; +import overrides from "#app/overrides"; +import { CommandPhase } from "#app/phases/command-phase"; +import { EncounterPhase } from "#app/phases/encounter-phase"; +import { SelectStarterPhase } from "#app/phases/select-starter-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +import { Mode } from "#app/ui/ui"; +import { generateStarter } from "../gameManagerUtils"; +import { GameManagerHelper } from "./gameManagerHelper"; + +/** + * Helper to handle classic mode specifics + */ +export class ClassicModeHelper extends GameManagerHelper { + + /** + * Runs the classic game to the summon phase. + * @param species - Optional array of species to summon. + * @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 = getGameMode(GameModes.CLASSIC); + 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/dailyModeHelper.ts b/src/test/utils/helpers/dailyModeHelper.ts new file mode 100644 index 00000000000..e40fada8ac7 --- /dev/null +++ b/src/test/utils/helpers/dailyModeHelper.ts @@ -0,0 +1,63 @@ +import { BattleStyle } from "#app/enums/battle-style"; +import { Button } from "#app/enums/buttons"; +import overrides from "#app/overrides"; +import { CommandPhase } from "#app/phases/command-phase"; +import { EncounterPhase } from "#app/phases/encounter-phase"; +import { TitlePhase } from "#app/phases/title-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +import SaveSlotSelectUiHandler from "#app/ui/save-slot-select-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { GameManagerHelper } from "./gameManagerHelper"; + +/** + * Helper to handle daily mode specifics + */ +export class DailyModeHelper extends GameManagerHelper { + + /** + * Runs the daily game to the summon phase. + * @returns A promise that resolves when the summon phase is reached. + */ + async runToSummon() { + await this.game.runToTitle(); + + this.game.onNextPrompt("TitlePhase", Mode.TITLE, () => { + const titlePhase = new TitlePhase(this.game.scene); + titlePhase.initDailyRun(); + }); + + this.game.onNextPrompt("TitlePhase", Mode.SAVE_SLOT, () => { + const uihandler = this.game.scene.ui.getHandler(); + uihandler.processInput(Button.ACTION); // select first slot. that's fine + }); + + await this.game.phaseInterceptor.to(EncounterPhase); + + if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { + this.game.removeEnemyHeldItems(); + } + } + + /** + * Transitions to the start of a battle. + * @returns A promise that resolves when the battle is started. + */ + async startBattle() { + await this.runToSummon(); + + 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/gameManagerHelper.ts b/src/test/utils/helpers/gameManagerHelper.ts new file mode 100644 index 00000000000..432e6fdf853 --- /dev/null +++ b/src/test/utils/helpers/gameManagerHelper.ts @@ -0,0 +1,12 @@ +import GameManager from "../gameManager"; + +/** + * Base class for defining all game helpers. + */ +export abstract class GameManagerHelper { + protected readonly game: GameManager; + + constructor(game: GameManager) { + this.game = game; + } +} diff --git a/src/test/utils/helpers/moveHelper.ts b/src/test/utils/helpers/moveHelper.ts new file mode 100644 index 00000000000..a53fa521785 --- /dev/null +++ b/src/test/utils/helpers/moveHelper.ts @@ -0,0 +1,62 @@ +import { BattlerIndex } from "#app/battle"; +import { Moves } from "#app/enums/moves"; +import { CommandPhase } from "#app/phases/command-phase"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { vi } from "vitest"; +import { getMovePosition } from "../gameManagerUtils"; +import { GameManagerHelper } from "./gameManagerHelper"; + +/** + * Helper to handle a Pokemon's move + */ +export class MoveHelper extends GameManagerHelper { + /** + * Intercepts `MoveEffectPhase` and mocks the hitCheck's + * return value to `true` {@linkcode MoveEffectPhase.hitCheck}. + * Used to force a move to hit. + */ + async forceHit(): Promise { + await this.game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(this.game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + } + + /** + * Intercepts `MoveEffectPhase` and mocks the hitCheck's + * return value to `false` {@linkcode MoveEffectPhase.hitCheck}. + * Used to force a move to miss. + * @param firstTargetOnly Whether the move should force miss on the first target only, in the case of multi-target moves. + */ + async forceMiss(firstTargetOnly: boolean = false): Promise { + await this.game.phaseInterceptor.to(MoveEffectPhase, false); + const hitCheck = vi.spyOn(this.game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck"); + + if (firstTargetOnly) { + hitCheck.mockReturnValueOnce(false); + } else { + hitCheck.mockReturnValue(false); + } + } + + /** + * Select the move to be used by the given Pokemon(-index). Triggers during the next {@linkcode CommandPhase} + * @param move the move to use + * @param pkmIndex the pokemon index. Relevant for double-battles only (defaults to 0) + * @param targetIndex The {@linkcode BattlerIndex} of the Pokemon to target for single-target moves, or `null` if a manual call to `selectTarget()` is required + */ + select(move: Moves, pkmIndex: 0 | 1 = 0, targetIndex?: BattlerIndex | null) { + const movePosition = getMovePosition(this.game.scene, pkmIndex, move); + + this.game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + this.game.scene.ui.setMode(Mode.FIGHT, (this.game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + this.game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + (this.game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + + if (targetIndex !== null) { + this.game.selectTarget(movePosition, targetIndex); + } + } +} diff --git a/src/test/utils/helpers/overridesHelper.ts b/src/test/utils/helpers/overridesHelper.ts new file mode 100644 index 00000000000..a42ef84b496 --- /dev/null +++ b/src/test/utils/helpers/overridesHelper.ts @@ -0,0 +1,312 @@ +import { StatusEffect } from "#app/data/status-effect"; +import { Weather, WeatherType } from "#app/data/weather"; +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 * as GameMode from "#app/game-mode"; +import { GameModes, getGameMode } from "#app/game-mode"; +import { ModifierOverride } from "#app/modifier/modifier-type"; +import Overrides from "#app/overrides"; +import { vi } from "vitest"; +import { GameManagerHelper } from "./gameManagerHelper"; + +/** + * Helper to handle overrides in tests + */ +export class OverridesHelper extends GameManagerHelper { + /** + * Override the starting biome + * @warning Any event listeners that are attached to [NewArenaEvent](events\battle-scene.ts) may need to be handled down the line + * @param biome the biome to set + */ + startingBiome(biome: Biome): this { + this.game.scene.newArena(biome); + this.log(`Starting biome set to ${Biome[biome]} (=${biome})!`); + return this; + } + + /** + * Override the starting wave (index) + * @param wave the wave (index) to set. Classic: `1`-`200` + * @returns this + */ + startingWave(wave: number): this { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(wave); + this.log(`Starting wave set to ${wave}!`); + return this; + } + + /** + * Override the player (pokemon) starting level + * @param level the (pokemon) level to set + * @returns this + */ + startingLevel(level: Species | number): this { + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(level); + this.log(`Player Pokemon starting level set to ${level}!`); + return this; + } + + /** + * Override the player (pokemon) starting held items + * @param items the items to hold + * @returns this + */ + startingHeldItems(items: ModifierOverride[]) { + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue(items); + this.log("Player Pokemon starting held items set to:", items); + return this; + } + + /** + * Override the player (pokemon) {@linkcode Species | species} + * @param species the (pokemon) {@linkcode Species | species} to set + * @returns this + */ + starterSpecies(species: Species | number): this { + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(species); + this.log(`Player Pokemon species set to ${Species[species]} (=${species})!`); + return this; + } + + /** + * Override the player (pokemons) forms + * @param forms the (pokemon) forms to set + * @returns this + */ + starterForms(forms: Partial>): this { + vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue(forms); + const formsStr = Object.entries(forms) + .map(([speciesId, formIndex]) => `${Species[speciesId]}=${formIndex}`) + .join(", "); + this.log(`Player Pokemon form set to: ${formsStr}!`); + return this; + } + + /** + * Override the player's starting modifiers + * @param modifiers the modifiers to set + * @returns this + */ + startingModifier(modifiers: ModifierOverride[]): this { + vi.spyOn(Overrides, "STARTING_MODIFIER_OVERRIDE", "get").mockReturnValue(modifiers); + this.log(`Player starting modifiers set to: ${modifiers}`); + return this; + } + + /** + * Override the player (pokemon) {@linkcode Abilities | ability} + * @param ability the (pokemon) {@linkcode Abilities | ability} to set + * @returns this + */ + ability(ability: Abilities): this { + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); + this.log(`Player Pokemon ability set to ${Abilities[ability]} (=${ability})!`); + return this; + } + + /** + * Override the player (pokemon) **passive** {@linkcode Abilities | ability} + * @param passiveAbility the (pokemon) **passive** {@linkcode Abilities | ability} to set + * @returns this + */ + passiveAbility(passiveAbility: Abilities): this { + vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(passiveAbility); + this.log(`Player Pokemon PASSIVE ability set to ${Abilities[passiveAbility]} (=${passiveAbility})!`); + return this; + } + + /** + * Override the player (pokemon) {@linkcode Moves | moves}set + * @param moveset the {@linkcode Moves | moves}set to set + * @returns this + */ + moveset(moveset: Moves[]): this { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(moveset); + const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + this.log(`Player Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); + return this; + } + + /** + * Override the player (pokemon) {@linkcode StatusEffect | status-effect} + * @param statusEffect the {@linkcode StatusEffect | status-effect} to set + * @returns + */ + statusEffect(statusEffect: StatusEffect): this { + vi.spyOn(Overrides, "STATUS_OVERRIDE", "get").mockReturnValue(statusEffect); + this.log(`Player Pokemon status-effect set to ${StatusEffect[statusEffect]} (=${statusEffect})!`); + return this; + } + + /** + * Override each wave to not have standard trainer battles + * @returns this + */ + disableTrainerWaves(): this { + const realFn = getGameMode; + vi.spyOn(GameMode, "getGameMode").mockImplementation((gameMode: GameModes) => { + const mode = realFn(gameMode); + mode.hasTrainers = false; + return mode; + }); + this.log("Standard trainer waves are disabled!"); + return this; + } + + /** + * Override each wave to not have critical hits + * @returns this + */ + disableCrits() { + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + this.log("Critical hits are disabled!"); + return this; + } + + /** + * Override the {@linkcode WeatherType | weather (type)} + * @param type {@linkcode WeatherType | weather type} to set + * @returns this + */ + weather(type: WeatherType): this { + vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(type); + this.log(`Weather set to ${Weather[type]} (=${type})!`); + return this; + } + + /** + * Override the seed + * @param seed the seed to set + * @returns this + */ + seed(seed: string): this { + vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { + this.game.scene.waveSeed = seed; + Phaser.Math.RND.sow([seed]); + this.game.scene.rngCounter = 0; + }); + this.game.scene.resetSeed(); + this.log(`Seed set to "${seed}"!`); + return this; + } + + /** + * Override the battle type (single or double) + * @param battleType battle type to set + * @returns this + */ + battleType(battleType: "single" | "double" | null): this { + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue(battleType); + this.log(`Battle type set to ${battleType} only!`); + return this; + } + + /** + * Override the enemy (pokemon) {@linkcode Species | species} + * @param species the (pokemon) {@linkcode Species | species} to set + * @returns this + */ + enemySpecies(species: Species | number): this { + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(species); + this.log(`Enemy Pokemon species set to ${Species[species]} (=${species})!`); + return this; + } + + /** + * Override the enemy (pokemon) {@linkcode Abilities | ability} + * @param ability the (pokemon) {@linkcode Abilities | ability} to set + * @returns this + */ + enemyAbility(ability: Abilities): this { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(ability); + this.log(`Enemy Pokemon ability set to ${Abilities[ability]} (=${ability})!`); + return this; + } + + /** + * Override the enemy (pokemon) **passive** {@linkcode Abilities | ability} + * @param passiveAbility the (pokemon) **passive** {@linkcode Abilities | ability} to set + * @returns this + */ + enemyPassiveAbility(passiveAbility: Abilities): this { + vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(passiveAbility); + this.log(`Enemy Pokemon PASSIVE ability set to ${Abilities[passiveAbility]} (=${passiveAbility})!`); + return this; + } + + /** + * Override the enemy (pokemon) {@linkcode Moves | moves}set + * @param moveset the {@linkcode Moves | moves}set to set + * @returns this + */ + enemyMoveset(moveset: Moves[]): this { + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(moveset); + const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + this.log(`Enemy Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); + return this; + } + + /** + * Override the enemy (pokemon) level + * @param level the level to set + * @returns this + */ + enemyLevel(level: number): this { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(level); + this.log(`Enemy Pokemon level set to ${level}!`); + return this; + } + + /** + * Override the enemy (pokemon) {@linkcode StatusEffect | status-effect} + * @param statusEffect the {@linkcode StatusEffect | status-effect} to set + * @returns + */ + enemyStatusEffect(statusEffect: StatusEffect): this { + vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(statusEffect); + this.log(`Enemy Pokemon status-effect set to ${StatusEffect[statusEffect]} (=${statusEffect})!`); + return this; + } + + /** + * Override the enemy (pokemon) held items + * @param items the items to hold + * @returns this + */ + enemyHeldItems(items: ModifierOverride[]) { + vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue(items); + this.log("Enemy Pokemon held items set to:", items); + 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 new file mode 100644 index 00000000000..8fca2a34d47 --- /dev/null +++ b/src/test/utils/helpers/settingsHelper.ts @@ -0,0 +1,44 @@ +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): void { + this.game.scene.typeHints = enable; + this.log(`Type Hints ${enable? "enabled" : "disabled"}` ); + } + + /** + * Change the player gender + * @param gender the {@linkcode PlayerGender} to set + */ + playerGender(gender: PlayerGender) { + this.game.scene.gameData.gender = gender; + this.log(`Gender set to: ${PlayerGender[gender]} (=${gender})` ); + } + + private log(...params: any[]) { + console.log("Settings:", ...params); + } +} diff --git a/src/test/utils/inputsHandler.ts b/src/test/utils/inputsHandler.ts index 043dcffbdb9..30dd101f43d 100644 --- a/src/test/utils/inputsHandler.ts +++ b/src/test/utils/inputsHandler.ts @@ -1,19 +1,23 @@ import BattleScene from "#app/battle-scene"; -import Phaser from "phaser"; -import {InputsController} from "#app/inputs-controller"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; -import {holdOn} from "#app/test/utils/gameManagerUtils"; +import { InputsController } from "#app/inputs-controller"; import TouchControl from "#app/touch-controls"; -import { JSDOM } from "jsdom"; +import { holdOn } from "#test/utils/gameManagerUtils"; import fs from "fs"; +import { JSDOM } from "jsdom"; +import Phaser from "phaser"; +interface LogEntry { + type: string; + button: any; +} export default class InputsHandler { private scene: BattleScene; private events: Phaser.Events.EventEmitter; private inputController: InputsController; - public log = []; - public logUp = []; + public log: LogEntry[] = []; + public logUp: LogEntry[] = []; private fakePad: Fakepad; private fakeMobile: FakeMobile; @@ -22,7 +26,7 @@ export default class InputsHandler { this.inputController = this.scene.inputController; this.fakePad = new Fakepad(pad_xbox360); this.fakeMobile = new FakeMobile(); - this.scene.input.gamepad.gamepads.push(this.fakePad); + this.scene.input.gamepad?.gamepads.push(this.fakePad); this.init(); } @@ -37,18 +41,18 @@ export default class InputsHandler { pressGamepadButton(button: integer, duration: integer): Promise { return new Promise(async (resolve) => { - this.scene.input.gamepad.emit("down", this.fakePad, {index: button}); + this.scene.input.gamepad?.emit("down", this.fakePad, {index: button}); await holdOn(duration); - this.scene.input.gamepad.emit("up", this.fakePad, {index: button}); + this.scene.input.gamepad?.emit("up", this.fakePad, {index: button}); resolve(); }); } pressKeyboardKey(key: integer, duration: integer): Promise { return new Promise(async (resolve) => { - this.scene.input.keyboard.emit("keydown", {keyCode: key}); + this.scene.input.keyboard?.emit("keydown", {keyCode: key}); await holdOn(duration); - this.scene.input.keyboard.emit("keyup", {keyCode: key}); + this.scene.input.keyboard?.emit("keyup", {keyCode: key}); resolve(); }); } @@ -57,7 +61,7 @@ export default class InputsHandler { const touchControl = new TouchControl(this.scene); touchControl.deactivatePressedKey(); //test purpose this.events = this.inputController.events; - this.scene.input.gamepad.emit("connected", this.fakePad); + this.scene.input.gamepad?.emit("connected", this.fakePad); this.listenInputs(); } @@ -77,7 +81,8 @@ class Fakepad extends Phaser.Input.Gamepad.Gamepad { public index: number; constructor(pad) { - super(undefined, {...pad, buttons: pad.deviceMapping, axes: []}); + //@ts-ignore + super(undefined, {...pad, buttons: pad.deviceMapping, axes: []}); //TODO: resolve ts-ignore this.id = "xbox_360_fakepad"; this.index = 0; } diff --git a/src/test/utils/mocks/mockClock.ts b/src/test/utils/mocks/mockClock.ts index ba12dc002cc..3664a831305 100644 --- a/src/test/utils/mocks/mockClock.ts +++ b/src/test/utils/mocks/mockClock.ts @@ -2,7 +2,7 @@ import Clock = Phaser.Time.Clock; export class MockClock extends Clock { - public overrideDelay: number; + public overrideDelay: number | undefined; constructor(scene) { super(scene); this.overrideDelay = undefined; diff --git a/src/test/utils/mocks/mockConsoleLog.ts b/src/test/utils/mocks/mockConsoleLog.ts index 61c6c14b989..f44a0c7d6cd 100644 --- a/src/test/utils/mocks/mockConsoleLog.ts +++ b/src/test/utils/mocks/mockConsoleLog.ts @@ -1,12 +1,12 @@ const MockConsoleLog = (_logDisabled= false, _phaseText=false) => { - let logs = []; + let logs: any[] = []; const logDisabled: boolean = _logDisabled; const phaseText: boolean = _phaseText; const originalLog = console.log; const originalError = console.error; const originalDebug = console.debug; const originalWarn = console.warn; - const notified = []; + const notified: any[] = []; const blacklist = ["Phaser", "variant icon does not exist", "Texture \"%s\" not found"]; const whitelist = ["Phase"]; diff --git a/src/test/utils/mocks/mockFetch.ts b/src/test/utils/mocks/mockFetch.ts index ad364a95885..ad3758775d1 100644 --- a/src/test/utils/mocks/mockFetch.ts +++ b/src/test/utils/mocks/mockFetch.ts @@ -5,12 +5,12 @@ export const MockFetch = (input, init) => { let responseText; const handlers = { - "account/info": {"username":"greenlamp","lastSessionSlot":0}, + "account/info": {"username":"greenlamp", "lastSessionSlot":0}, "savedata/session": {}, "savedata/system": {}, "savedata/updateall": "", "daily/rankingpagecount": { data: 0 }, - "game/titlestats": {"playerCount":0,"battleCount":5}, + "game/titlestats": {"playerCount":0, "battleCount":5}, "daily/rankings": [], }; @@ -23,10 +23,13 @@ export const MockFetch = (input, init) => { } } - return Promise.resolve({ + const response: Partial = { ok: true, status: 200, json: responseHandler, text: responseText, - }); + headers: new Headers({}), + }; + + return Promise.resolve(response); }; diff --git a/src/test/utils/mocks/mockGameObject.ts b/src/test/utils/mocks/mockGameObject.ts new file mode 100644 index 00000000000..9138e0f687a --- /dev/null +++ b/src/test/utils/mocks/mockGameObject.ts @@ -0,0 +1,3 @@ +export interface MockGameObject { + +} diff --git a/src/test/utils/mocks/mockGameObjectCreator.ts b/src/test/utils/mocks/mockGameObjectCreator.ts new file mode 100644 index 00000000000..19406a46923 --- /dev/null +++ b/src/test/utils/mocks/mockGameObjectCreator.ts @@ -0,0 +1,23 @@ +import { vi } from "vitest"; +import MockGraphics from "./mocksContainer/mockGraphics"; +import MockTextureManager from "./mockTextureManager"; + +export class MockGameObjectCreator { + private readonly textureManager: MockTextureManager; + + constructor(textureManager: MockTextureManager) { + console.log("Mocking Phaser.GameObjects.GameObjectCreator;"); + this.textureManager = textureManager; + } + + graphics(config: any) { + return new MockGraphics(this.textureManager, config); + } + + rexTransitionImagePack() { + return { + transit: vi.fn(), + once: vi.fn(), + }; + } +} diff --git a/src/test/utils/mocks/mockTextureManager.ts b/src/test/utils/mocks/mockTextureManager.ts index e207f96b722..ca8065bef97 100644 --- a/src/test/utils/mocks/mockTextureManager.ts +++ b/src/test/utils/mocks/mockTextureManager.ts @@ -1,18 +1,24 @@ -import MockContainer from "#app/test/utils/mocks/mocksContainer/mockContainer"; -import MockSprite from "#app/test/utils/mocks/mocksContainer/mockSprite"; -import MockRectangle from "#app/test/utils/mocks/mocksContainer/mockRectangle"; -import MockNineslice from "#app/test/utils/mocks/mocksContainer/mockNineslice"; -import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage"; -import MockText from "#app/test/utils/mocks/mocksContainer/mockText"; -import MockPolygon from "#app/test/utils/mocks/mocksContainer/mockPolygon"; - +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; +import MockNineslice from "#test/utils/mocks/mocksContainer/mockNineslice"; +import MockPolygon from "#test/utils/mocks/mocksContainer/mockPolygon"; +import MockRectangle from "#test/utils/mocks/mocksContainer/mockRectangle"; +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 + */ export default class MockTextureManager { private textures: Map; private scene; public add; public displayList; - public list = []; + public list: MockGameObject[] = []; constructor(scene) { this.scene = scene; @@ -30,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()), }; } @@ -39,7 +46,7 @@ export default class MockTextureManager { return container; } - sprite(x,y, texture) { + sprite(x, y, texture) { const sprite = new MockSprite(this, x, y, texture); this.list.push(sprite); return sprite; @@ -53,6 +60,14 @@ export default class MockTextureManager { // } } + /** + * Returns a mock texture + * @param key + */ + get(key) { + return new MockTexture(this, key, null); + } + rectangle(x, y, width, height, fillColor) { const rectangle = new MockRectangle(this, x, y, width, height, fillColor); this.list.push(rectangle); 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/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts index 2e2b9567796..d2cdd852257 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts @@ -1,6 +1,8 @@ -import MockTextureManager from "#app/test/utils/mocks/mockTextureManager"; +import MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import { vi } from "vitest"; +import { MockGameObject } from "../mockGameObject"; -export default class MockContainer { +export default class MockContainer implements MockGameObject { protected x; protected y; protected scene; @@ -11,7 +13,8 @@ export default class MockContainer { private style; public frame; protected textureManager; - public list = []; + public list: MockGameObject[] = []; + private name?: string; constructor(textureManager: MockTextureManager, x, y) { this.x = x; @@ -158,9 +161,10 @@ export default class MockContainer { // Moves this Game Object to be below the given Game Object in the display list. } - setName(name) { + setName = vi.fn((name: string) => { + this.name = name; // return this.phaserSprite.setName(name); - } + }); bringToTop(obj) { // Brings this Game Object to the top of its parents display list. @@ -204,4 +208,5 @@ export default class MockContainer { return this.list; } + disableInteractive = vi.fn(); } diff --git a/src/test/utils/mocks/mocksContainer/mockGraphics.ts b/src/test/utils/mocks/mocksContainer/mockGraphics.ts index a08f150fe61..e026b212e16 100644 --- a/src/test/utils/mocks/mocksContainer/mockGraphics.ts +++ b/src/test/utils/mocks/mocksContainer/mockGraphics.ts @@ -1,6 +1,8 @@ -export default class MockGraphics { +import { MockGameObject } from "../mockGameObject"; + +export default class MockGraphics implements MockGameObject { private scene; - public list = []; + public list: MockGameObject[] = []; constructor(textureManager, config) { this.scene = textureManager.scene; } diff --git a/src/test/utils/mocks/mocksContainer/mockImage.ts b/src/test/utils/mocks/mocksContainer/mockImage.ts index 601dfd22811..be183a0dd89 100644 --- a/src/test/utils/mocks/mocksContainer/mockImage.ts +++ b/src/test/utils/mocks/mocksContainer/mockImage.ts @@ -1,4 +1,4 @@ -import MockContainer from "#app/test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; export default class MockImage extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockNineslice.ts b/src/test/utils/mocks/mocksContainer/mockNineslice.ts index 3edbbb18c31..a8e10036a72 100644 --- a/src/test/utils/mocks/mocksContainer/mockNineslice.ts +++ b/src/test/utils/mocks/mocksContainer/mockNineslice.ts @@ -1,4 +1,4 @@ -import MockContainer from "#app/test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; export default class MockNineslice extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockPolygon.ts b/src/test/utils/mocks/mocksContainer/mockPolygon.ts index cf448883ce0..12b60904a96 100644 --- a/src/test/utils/mocks/mocksContainer/mockPolygon.ts +++ b/src/test/utils/mocks/mocksContainer/mockPolygon.ts @@ -1,4 +1,4 @@ -import MockContainer from "#app/test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; export default class MockPolygon extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockRectangle.ts b/src/test/utils/mocks/mocksContainer/mockRectangle.ts index db323268037..26c2f74ea42 100644 --- a/src/test/utils/mocks/mocksContainer/mockRectangle.ts +++ b/src/test/utils/mocks/mocksContainer/mockRectangle.ts @@ -1,7 +1,9 @@ -export default class MockRectangle { +import { MockGameObject } from "../mockGameObject"; + +export default class MockRectangle implements MockGameObject { private fillColor; private scene; - public list = []; + public list: MockGameObject[] = []; constructor(textureManager, x, y, width, height, fillColor) { this.fillColor = fillColor; diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 2eb77f81302..35cd2d5faab 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -1,9 +1,10 @@ +import Phaser from "phaser"; +import { MockGameObject } from "../mockGameObject"; import Sprite = Phaser.GameObjects.Sprite; import Frame = Phaser.Textures.Frame; -import Phaser from "phaser"; -export default class MockSprite { +export default class MockSprite implements MockGameObject { private phaserSprite; public pipelineData; public texture; @@ -12,10 +13,11 @@ export default class MockSprite { public textureManager; public scene; public anims; - public list = []; + public list: MockGameObject[] = []; constructor(textureManager, x, y, texture) { this.textureManager = textureManager; this.scene = textureManager.scene; + // @ts-ignore Phaser.GameObjects.Sprite.prototype.setInteractive = this.setInteractive; // @ts-ignore Phaser.GameObjects.Sprite.prototype.setTexture = this.setTexture; @@ -31,6 +33,7 @@ export default class MockSprite { }; this.anims = { pause: () => null, + stop: () => null, }; } @@ -90,6 +93,10 @@ export default class MockSprite { return this.phaserSprite.setPosition(x, y); } + setRotation(radians) { + return this.phaserSprite.setRotation(radians); + } + stop() { return this.phaserSprite.stop(); } diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/src/test/utils/mocks/mocksContainer/mockText.ts index 1dd440fde7c..6b9ecf083fd 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/src/test/utils/mocks/mocksContainer/mockText.ts @@ -1,13 +1,18 @@ import UI from "#app/ui/ui"; +import { vi } from "vitest"; +import { MockGameObject } from "../mockGameObject"; -export default class MockText { +export default class MockText implements MockGameObject { private phaserText; private wordWrapWidth; private splitRegExp; private scene; private textureManager; - public list = []; + public list: MockGameObject[] = []; public style; + public text = ""; + private name?: string; + public color?: string; constructor(textureManager, x, y, content, styleOptions) { this.scene = textureManager.scene; @@ -17,6 +22,8 @@ export default class MockText { // Phaser.GameObjects.Text.prototype.updateText = () => null; // Phaser.Textures.TextureManager.prototype.addCanvas = () => {}; UI.prototype.showText = this.showText; + this.text = ""; + this.phaserText = ""; // super(scene, x, y); // this.phaserText = new Phaser.GameObjects.Text(scene, x, y, content, styleOptions); } @@ -150,7 +157,8 @@ export default class MockText { setText(text) { // Sets the text this Game Object will display. - // return this.phaserText.setText(text); + // return this.phaserText.setText\(text); + this.text = text; } setAngle(angle) { @@ -185,10 +193,9 @@ export default class MockText { }; } - setColor(color) { - // Sets the tint of this Game Object. - // return this.phaserText.setColor(color); - } + setColor = vi.fn((color: string) => { + this.color = color; + }); setShadowColor(color) { // Sets the shadow color. @@ -214,9 +221,9 @@ export default class MockText { // return this.phaserText.setAlpha(alpha); } - setName(name) { - // return this.phaserText.setName(name); - } + setName = vi.fn((name: string) => { + this.name = name; + }); setAlign(align) { // return this.phaserText.setAlign(align); diff --git a/src/test/utils/mocks/mocksContainer/mockTexture.ts b/src/test/utils/mocks/mocksContainer/mockTexture.ts new file mode 100644 index 00000000000..cb31480cc60 --- /dev/null +++ b/src/test/utils/mocks/mocksContainer/mockTexture.ts @@ -0,0 +1,42 @@ +import MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import { MockGameObject } from "../mockGameObject"; + + +/** + * Stub for Phaser.Textures.Texture object + * Just mocks the function calls and data required for use in tests + */ +export default class MockTexture implements MockGameObject { + public manager: MockTextureManager; + public key: string; + public source; + public frames: object; + public firstFrame: string; + + constructor(manager, key: string, source) { + this.manager = manager; + this.key = key; + this.source = source; + + const mockFrame = { + width: 100, + height: 100, + cutX: 0, + cutY: 0 + }; + this.frames = { + firstFrame: mockFrame, + 0: mockFrame, + 1: mockFrame, + 2: mockFrame, + 3: mockFrame, + 4: mockFrame + }; + this.firstFrame = "firstFrame"; + } + + /** Mocks the function call that gets an HTMLImageElement, see {@link Pokemon.updateFusionPalette} */ + getSourceImage() { + return null; + } +} diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index e8cec7c9989..2eb5324a2aa 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -1,48 +1,52 @@ -import { - BattleEndPhase, - BerryPhase, - CheckSwitchPhase, - CommandPhase, - DamagePhase, - EggLapsePhase, - EncounterPhase, - EnemyCommandPhase, - FaintPhase, - LoginPhase, - MessagePhase, - MoveEffectPhase, - MoveEndPhase, - MovePhase, - NewBattlePhase, - NextEncounterPhase, - PostSummonPhase, - SelectGenderPhase, - SelectModifierPhase, - SelectStarterPhase, - SelectTargetPhase, - ShinySparklePhase, - ShowAbilityPhase, - StatChangePhase, - SummonPhase, - SwitchPhase, - SwitchSummonPhase, - TitlePhase, - ToggleDoublePositionPhase, - TurnEndPhase, - TurnInitPhase, - TurnStartPhase, - UnavailablePhase, - VictoryPhase -} from "#app/phases"; -import UI, {Mode} from "#app/ui/ui"; -import {Phase} from "#app/phase"; +import { Phase } from "#app/phase"; import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import {QuietFormChangePhase} from "#app/form-change-phase"; +import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; +import { BattleEndPhase } from "#app/phases/battle-end-phase"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; +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 { PostSummonPhase } from "#app/phases/post-summon-phase"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; +import { SelectGenderPhase } from "#app/phases/select-gender-phase"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +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 { 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"; +import { TitlePhase } from "#app/phases/title-phase"; +import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +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 { PartyHealPhase } from "#app/phases/party-heal-phase"; +import UI, { Mode } from "#app/ui/ui"; export default class PhaseInterceptor { public scene; public phases = {}; - public log; + public log: string[]; private onHold; private interval; private promptInterval; @@ -61,6 +65,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], @@ -85,13 +90,18 @@ 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], [QuietFormChangePhase, this.startPhase], [SwitchPhase, this.startPhase], [SwitchSummonPhase, this.startPhase], + [PartyHealPhase, this.startPhase], + [EvolutionPhase, this.startPhase], + [EndEvolutionPhase, this.startPhase], + [LevelCapPhase, this.startPhase], + [AttemptRunPhase, this.startPhase], ]; private endBySetMode = [ @@ -104,13 +114,20 @@ export default class PhaseInterceptor { */ constructor(scene) { this.scene = scene; - this.log = []; this.onHold = []; this.prompts = []; + this.clearLogs(); this.startPromptHandler(); this.initPhases(); } + /** + * Clears phase logs + */ + clearLogs() { + this.log = []; + } + rejectAll(error) { if (this.inProgress) { clearInterval(this.promptInterval); @@ -226,6 +243,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. */ @@ -282,7 +315,7 @@ export default class PhaseInterceptor { setMode(mode: Mode, ...args: any[]): Promise { const currentPhase = this.scene.getCurrentPhase(); const instance = this.scene.ui; - console.log("setMode", mode, args); + console.log("setMode", `${Mode[mode]} (=${mode})`, args); const ret = this.originalSetMode.apply(instance, [mode, ...args]); if (!this.phases[currentPhase.constructor.name]) { throw new Error(`missing ${currentPhase.constructor.name} in phaseInterceptior PHASES list`); @@ -321,7 +354,7 @@ export default class PhaseInterceptor { * @param callback - The callback function to execute. * @param expireFn - The function to determine if the prompt has expired. */ - addToNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn: () => void, awaitingActionInput: boolean = false) { + addToNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn?: () => void, awaitingActionInput: boolean = false) { this.prompts.push({ phaseTarget, mode, diff --git a/src/test/utils/saves/everything.prsv b/src/test/utils/saves/everything.prsv index 2e4a851eb8f..1985a6649ca 100644 --- a/src/test/utils/saves/everything.prsv +++ b/src/test/utils/saves/everything.prsv @@ -1 +1 @@ -U2FsdGVkX18MDWJUMG1IAj6PNoJ0MdLbA7p5OHjZmOMeI33tI8HYH9aoFDTpEOqldDfq0OGMCqDg0dRHMgB1nCtEIqA9gtWNL82bhIT4uYozaNmWJ4vWm6M1IDKpeWrwjdy5KCb2ufIzrwDYeH/XkbsI6KCh2t1JrYOiCblY+VuUW0Ha0m5xvnq/6Ac13Qo1Iv2C7prgIS0oOrrTQuwvP2KR2h5am9WFCRWtvMYHaYKI8KxXbxxD6DGN7W1yQJj4GDNvZ8WwWbCC8Okj5h6Yp3MuJ7RTj1XFHmWRwSJJ5Fp+asq8ToWmlrE2OszTEA6yYx8ncywOJHns/sW7108rix7NuSe5loyw2ZFL7pCbIKXuuZcrIfyic+TlG9rstkb64tPyAmF4wZEnCmERrPdcmhgqeEU/aJkDsUtQDwLRPeGejGA4Kif3W9o3yDAcTNO8woESyxqUjdbcb71CJ36HHIZMU8WwqcE26P9OTa3UwemxS0kcortUPK+T86NwgoGnZA/4Em1BuhcYFjOlohDJXH0l1QoLKzRZZCNUdqt4qZY30fVMMOpGUbt3NCbtBPazG/g8bYehqsM/9xTUwaoCgS/DtJ/LbKGo4ByBpoNJzlWtSus6BfrXcQSGFJoWhsLEVHFJ6oMbS8ZupTiX5nEfEiJGCY3exRp1bbQ5a2UwEheIyfGk5GhEF8026PQ9011BVBNerOfmvCqEgBFlJVfcUEHUbIRkpOM11QctMAmjTuROfBd+8LFHt/CbsnpEv4sVwZExMDoyaHSDY6sCMrQWPfbUf28NC2MxW6X0dV7ylKwZXrSyGJlro68dqlDI86hjltbocrUuLZykMoNT5iSZzGVYe/7r4Bo4jjF+AeUh0NQUE7Q69/3Klts83oEla9/xn0eR1RToffidW/b8C01DUpv+++zFB7d1Zq5b4MV/HFlhvc/eRya3Mr/vLHvWXk603rs1LxIF/PGY7p8QSgU+50/T2XS1gzbO6m6Pu9N6TzV/lk+MK4XnxdOEtTVBZsK8cQ94KUVjADds6vN1TiGr/QgngXvyQGZgmDhFbDAwQWKlOIItcGw30NHzFU8oxP3B8L/6ERgIJdBhco7cLEKXF3GeiUGxaW//+OCoAVqxt81Nggf9h28MBIO9s7YQl6dWNOm+tkigpxgVcFEBybuzEVmzPIZKnEMq269JCtWZ/b6RyPaa1uPIvP1986txHZs4uIJtqr7Ed7E2542OwpCxITqQNu2M5ffVBEC8RfSVFKdvUfsOM6zvTH0/f8Q12kmYIWU4tzUbkTkf0Bna53uosz0LyDvKRWc5lwEATs4Akp5IUkbGGiIXUaXUXSuSN+Wlmy6any5Ibz+fxoQaCsbapQTzoti1AaCY2VJ8Ih4K5n0Lj2M8aX7GHHplswVDMUSzuL9nml4AJk0fkMUMy66Pjw/zxVqBfE/tLd+zTCpI6YAMbcXo3gxs4tTYMxwwltvmKcl1o2ugTSxKJ64iEV/hqHdgyFu9u7lqKdJ56Wag0NftZO0ba0ruzd1OzXDTlQhFXSckeOFjagiUHiGO4nhs3L7Acoyi84eBgB0StCAC0uQgqUGiIvvOEPMHV9FTHOdewqFRtHOE/iBJ6hqTsJoMaCDwaZV5KHwDpdl/XUTBKXmeWqVa8CbbjTYZd6+zYx5WkJ3EUQ9XulgHHCJQsDEjn9nZt4NEJYVX+iket/PzVtOXAV3+NGa4raiNUFZQChf0q3sgumyj5EVKwLEUkAdht5qpEuOV2I4GFb791iCoXVmODGI70uyukRFiilh3wH+SQFIDdB3F5D9tx+lDDNpLWx4/rSK8VjGqzAFAO/OkErHLtkP/Ao2jgqJVHqI48GhQLsTUx6DQ7PxNtM7KiqH+DKml8UICyWolwTj/di4zXcuFyr86uA6kH9UdL2viouJneaMM8ZtzQVOUqxm3VEMb6wr60ooe86oxKAqYkWtCSRB/kDaDmBAP5LcAgIr1+8QZcm/qNJYJATO7gDWQohT4E/NHQGd3jnF9+zN6Kz3O8VXe96VOscjS4QCLJlOnjqAFuu/t79JFZLgXZCYU2Ybj0DIADYUlj08Me3KeEr+z4GF/8Z2oE2f0PoR1AOs50TIaFmJOy4arR3hDXiY1MKbi2H534rGlbwDg//NOEoawkO5SYzXsZK4oZMWC7FTTMfX7iOkTNkPE///vb3AUexPOkDrp+kfZH/xdD0sNlggyNy2uDu91NjramnjvFIqQ5KKu0AXhGt4NfSbZtODJhZukqt4IadmAjKPIQn2Kq+KzajY22cd+Drw/XCM1oSItIuad/z0+rUOhbKw/3ImKc4XJEgWGixz8A7RptGMZ5qrs9RJgwso+1Jzb+++8D4cMmbqIGrZNDycJbqT8IjFUaydlh8IIijay1K6H5FBC9zzsZs4mRk6W4bvJt0LpvpxwK//BmwDAywi1KtPiUeqgRQ3fYmLNyS1OZTha0ivZ16TPTbuq+UMdL7wLmLkNPvfaNz6er5l6G3mR6ieghxRUjvLTdrGaxaiXjAiSuIrNdBcUHGkypviSwZM+p/t/vtJa0LZqLwKRoo/LiSj8zEvbQtv1aiYpy+0gRBXSt9c9EzGzWGwr/gIrLr87BlK3vvNNy5utM54YG+iCVBmGXyqdBUxpabV9Uxm20ISgtQhKU51jtSmpGByHa+M0IHjeeuouhxAbis/s5sV9po6fILdlo53FZzTJveky/RzMA3POxfG2zNcmv/ZL1L+29oJHC6mhJuttdAccU+lPmdHkKsC2VJcu0c1kR2GZJO1WguqHo5pg84dn5sysi2MCsq+Rfypqme6VAqTMB2Mi3Lg/RLbiDp4vIDLv8OQoLI+yQ6ODx31pQGPt6dPUv8bJWST6VkKi3WMCibYutWnVnVbjSqK5d+Cuvl7pU4knD+gIYFmlvMxFJm2OpCl55XK8VtWboPWsv4ZTWq4CPlZO4mXg0L2x0+ohbPnixqvot0p3f20tIqSHWI3eA38v/9B54heWBCZrsxOxJmF+ys0UbkK9VJs1R5ZpNKJcnZnvQIOp7rFN9Wt8orQ47/wjvOFhTpuiWQMXOAxk0TSk9opPXKU93xdJmmjCrHHitR39E9ZT18qfAHU17aSUc5a8zbLeBvhd80APJQmpgPvLbvvMw72nGp6oeXNthC8rQ4mJapn2ozLVSSA5JVvmUNLRLhP0O0sTvDrXguu0yKWc62bP9/QC2fFae+0oGoT8pHatQeVzjc4jWWwsIuBfjebWf52sJClRoY9iRfID+Hu7emgt8GqSvS/TI7V6YCzwreFXZSt+C0RzHlLntsV0jqeGIs2vLrrZ8rV5LwcynDqlE0S5N9x/j5EyYHf6SJu7OO8pf+vh33qHqfdDmOSHX5fOvxE8snmk6cgR7MQFBbW5JinELdAzoB0uuGoNJGlXqS2xUpmtwYAX8Wh4dm5TW4mhMuo2WFBaWU1ejFquQkkFNXjEwaR87t5nyo45CkWqKmZ6xVNbkoVDqEMc+wCRcsGgp9aQ5o1fFrtKTef91gyrF3b1fhKlhSn3X/r5gOqo9y/i80vT09L9byIN1v1dBqz2zC0Bd8kGeaCZFEezgQeznOZ02TbPBhePJL/qH3ZsEm0CPItb/O16l4UZb/uPgdWLsIvH0VN1i91jwR5v3IEvyHw7t/y1c0/0LjbNoewaX+CQ2iW9E1P6tQd32ctIhGCfj18SBLzZyayxCZtFZjJekT8zRDIN7bLFkVKGQP5/qeTTplV2fQ0CHyAA71WfUYzGgRxtd5DjecBa0JuW15LrY7OaCtifMea1xUMm+MVtA2yY0UQGK4M6UWAuWQfYyOUfFL5bXcmvWANuY7we3CLRxuIlo8OkbGtzQNfMxytMEX39X5tIVhiW9GyqlqaYIT95DwFW9JFiIz9o/JdeOZyN24HXhVlmJLzTGUP1KLnRX7XDLF7n+3p2HZdJHSg7HoUBooYaVOwY9FQW25AH/UlP3/wBwPdBBDtLviRwTfuQSlV1TyujfiQoyeaYRGIwrxYZMLyRNoro+XWn9/s742weUSUqZ+qeviWifpAMHM/mH6sYYTKWzny3gX+PLWOEkHFCAcpPC6QJAiEIFK85eW5KzWVEumhpgljmGazvxYMrrCW6engEzM9U6Cl+Yp4lQaZ+HtOwGxeTiRorihLLpW9LI4gbzG4v+DG7bfSwQY6d380fEs2MYM7bx8c4D6TyDHwu8OBJU9liYsC3CRvCf8zbvgDe0jkrjyhcVJJctKmmSuzJdykJdGvGXOf74q6JXX9Lg3V+ODVc6g7tJhuOYscQyQNM8G+VhT0Ayu+eHCdlNZWUeO3j6ejCCFzDtgtz7FdFRBjJ8zTIvkikf9CoWAxW7NCRgOHE69Hg778o/u6pBcGqQS43SdKOdrGxEzTyuU4HI7a1hd+v91qeKD4MS7rSFQ4K+WhdsTpsxr0M8qEfZa9S8HnPXW9XaZH1hLUWaAosxDGYg/2JDS7nNQn6k2oW5VeaKrogCneFp9waQGGcLGsK5oxUoYAmCJgvJaHNTcr43XukNT+35tyEtiEWhDwl5rHPnoAcgBMkAAugidpGe9h46JrDECU/XHc5B4sV+NAdMF/YiWQXMcomu9nvpAOjzcqFvmK+15+jrBJL4OTVu7ZL/B2pPOC+Dtr7yxAL8XKbtXJTAWBH7wa7/vu54xqWsbNLJCVh65//LPJD7Dz6nKFwnRpXh2D483e8QWPGgR2VQQAXV0mwvrqCLm1njnYPPpQYnYcEgEESUrJpjuFYMx7zL2p+sb7LDSkVgVLvopsvNejRc0T18p78ELQZq9FBpRI5ucKxpZb7C7ZVHskT0qwj98wV8hKN2DjavfHyjAILEFeQpV36NO5CQLRTAbPbm4n21qFqi4PZwB0lcX/N0sNRd5w1z3g/isA5pRh3xwB+HK03uln1VKLTN2pPbCVKc5OEXSD2Y+aigSknYvYbsoex6Wa0JIbyibb8TpktTJp171F7Lg+c+C0CBxcy1s6MQPj4GVLc+/mE+3nEMwbD5OBa9W73sZP/B7ZjisGNevRzaLX1dMn4CiPGRQiLYd+Gf3d4Aa1OF8C7fp1KJVEEvzrjhp4kCpZI2jsw3YppoPLrYhFDLHnEfogJvm3cXotGzRHcX5iCCe5XD79Erno9OXfBpbkDYUyTf6vOu6IU1XKXxjGQoJgus6M8IU0V+pM0fWzDwPLTwDHTstkF01/pyzeGLklHUoRCvd+SIKKULZPZCLOE2tuZnuxJ0tgBszAigEv7YxUwqMqPxcqgQyZ+/tqiHggPyx54n9oYjuDYPQ3nWj/55dOEHzvm2Mv7mjTt5XxOhHvphZWyBPoIcrM9B/te4VOsEXu4axnZkRmA70Ycf7bDUERbKJoPd6mH7Valzwfod6M9NreiRIc4HYijdZRr4Jm//+BB2IgSVPKLVxeJrNBYusJPQKa2eAYPrq0MtrYozJucBVEIcLhCOm80RbYqCyS30uPWINHu3/RIkyzVvNB9DS7sR7b/F8T1REcjJD7YWVZNT77HMSuhcWPzugWcX5BaKb7+eyM6/EzALsgZGGyn2FNKI5YHhLry9g2xbv9/sAAev9FAl6VTlOgEUH4sJDYlUWSia5NyKOu4Dq1cr3ql1PbxopGXyxxCPZOVdn6SFLLDms8S8HZX+hhhFjgT9ngzZL3k6ye7mQ9ICuLRjolCDRHwN6hwfZkvoB1J4smMTl0C48EZ51+3RRlkf0iZUzVugbGYmKEhcgOdxEM03z6XRzmallbxUbet1Nl5Ft4IL4el41vTtMgngtuICDjiaDIA+Ye/12Z+xlTBGGlxC+xbUosYjovTm8doP26jyRneSl+3KVTv2DpCCg0ieux4CESqtqVVXePK0RR4Rq7RGumL7O7i4+UUEPvwHsaBGuqvAS8aVaGYkH2r4dhjvxMHvR4FKGZc8doZgA5dmqLOGv7d7u422kS9XJvWsPpKwV9r1QM/jZ9EZHVh/Wg06f6MbMEb4BShMwYlo5zdtd7/0HSZTBhcJq7rmK6FLm735vQJ49xnbXSUXHEUaTumQK0gkUO9g3HfhqosN/ykUS4Sjx5PfM1jv5PTXGtQMqxLuZE6dhfXO69P88bdbHWHjSwtUmbNzX/06fJFJPaKrTVSnGr3faAx5VeBUDGKkJYHrrNWzFBy//gwgzctOFDBbK/y9P40ztO46txGvEMn2bGzKwdiSSWalesF1A2dR2/UAv/pQ/i6KguKNMqqd53vKcQVFYd3hhHiuBu0GtazAobGiBuX0FRyeK4pR81hDrwmbpyh+e+Ra/jffCDJfwcg/YNXK8vb3W+MZXznHygq05ghOPhv4dbKAya4KNeYHTSfBD+qkXWSbpbDvZwYXictUjpb1gvV0LnlWaY+kl3UH7z4HSojzr2iLgDv/viXcbHPDfgGV1DFft2x5pALwa2EhjovJfItnoaUpqIQ0ub70lzELW2+T+8x6ovJt+jwpNWyl28xj1NBNsX5dwPXKuYMw+O0s9tHSdv70jR0PKKhA0ovSOpqt2FoKCgKahO9FCMBqU8cTzmE1vCbC3GvNHRIaXBbveyGl3LX9/ADyVjt6itgie7ezoovql5/1yCDx7qgukAbaejm2011v3smxDK+Dmqf26wOCWWgtPM+hQM/5VSPJzt0y6BksDKbigm0TOdLinLCGYKCGobQPKArn1ucZBFWj3NzoGWkaI1VZNmhxHQPo7mScJg8fLKXYupiRyWkMGKVObMWQm/17tN7YtVFsMP3oEzopqhOCnwuOr/rQ9qkx5WlbfTeDWiZGR1dHd/K1WQOBd856iNwRYKWxRjBo2pW52FE98SkLwwbcQ25cqflIZHl1Zfqu/C7RYvuMODGZI8vCecaZoai28zko7Y+2INQiLMRks+143WgiPzK2nO/B6ElGzCpEI2bAw+DdcfXSYX4tBoP2SzvzXxFGWd7ComtifENwyUxq3lPwAtpEU0388nDRaCQxeqKCpqAsNNtLE9QPcy4wiRjViGPpQlR40uJXzzfSmsAMCeYXx/76WwULrBSQtY07VJm/W6ZZPJI8hppIgb6zUM/kXC0XeLdilggPqPFHMVPt7eLrbjOsR0vOiomk1oj0QBCSW+hETZDy1MbN5TvJ8N+tnbzTQHZXnUq2jddyear29dplqluZL9G+gUw8NLB1rFDju+vhV4y8y9Hbhu6Kfl6FIC/629i2KkRMYs+f26EuD3O3sXDlAGlKEduxL0J2qpkG+hESZAQqiVtqJBtDya+2RreSDl8ZT7cRtf0SRs+YeJxo1T0miR3Q67eFOayiwlubyvkSkvLuErxuyCOORzjYLmeL5/Jolb7yWT7JKo1aL1Ec2Asdc2pMtMqf2M43eZnVG3Y/LKs0MEnvnIRqDsWa7d1QZrLs7TlSuCSPmkuEC0Z66fWqCTGAwT9po1HuO/I5xiqjp4nBUM4/23abQt4k248YrtBTkH/FbLHZYSGtafFjbk7d5t4lBQYOLJNpeOlyIUDX93/Y9YrbTPhL/dOYzXaJ4YILr/aNxXYgIsjKyt9x32T3MCif3qkRV2jeTqwDa1jfERLpWhZEkH9Rdpm7NvPc7S02truuTokzMzMQCQAdVNq5T8CswvBgZ5u/rew6niJH3a6abvgKvQ97cH3AtnguExrPZvUSdsOCv3e9FHgJnTAYOdh7AfGq7CP5E+BqdZlM0ljFTmoFgtwavNR4RHktbSyMJY8CTsf19TcI6GFcUTKT5mOnsX7+cz33rP43GArSOSI8CrbxHKvmENM/cKlFQkYsejuLvRMIkPFPY+YshcONGu7vCKJL9nXBQwRWE3lAMcq3ds3oqbVEnA0isCmg9VvjnTzJQXkIyM1p1/aw8VVO5ch2unUm1s2WMbnNQ5OnLcSZV+3ZFd9jAUxcilZZ1u07fNz6md6aIzBCO5HJhVsC91ozsNV/0jp7D8gqXZblhoXqUodFs7P1vMJvkxiTrQGLSNbgHNNvsvCYXGHNPrRLWCScYHr50lYTUAhc8bhD+O6EhejD+DGKGGDrfNcyAUatcsj3JJa2fc5M6y3SaHahi/wRMZTqUDnRy0lqfvlaInC9BvTNl5/W1MWrixcTZ2rEPsq+HFQrNkVY+cxIAebL2wSlBE55wKSL8AvYe0inVHsX0mYyJkiDjIo8/oQhNTVRHyKItRbnWosNRey0GNConQHcV/K28v6JZm2f1YaSSvaiv4DjeUt8cXVCfbs2cRCvqdRbEh4WuPbp9icLyrAIl1d8c46IQdmDHBsSUf0m7blWVpykfE+1xqmSFdsSY4dfc+QSZ3j6Bg+9K1iwut0TX1OIbo4K+z/e+3MewkwZ3GBEjG1het3TTc2Jj14eTqRcgfUES927mLXoxL3BTRI0Tf06HTp9dgUG1p8e0d92YVSRufY6D8YUVaF6YhMls5IMNHpEX8GUd2OCC4jni7bJ7/Z8IEmjzEj5dj24q120h1l6EH+/PvzHrRlbdUk8xfLF6vk7Vu1Q3SEfUfQimxCOc/Z53xTSRlnZ84IYnnti0LZYCiYvhG4Zi7iKkZ0jXoeKgYGsolHj254LcTx1jNXkad0DFU4atpDaYDz/Sd+t/8lWAUNikmDN3fKOqEizLQobnWl71He1nHVh+stQ3yLefY9sTIE1Xaczy3EaKKr7RqpdXdh3+d44JJYEHrOZaFj5ygWOMRVN1gMVL5Mc1+Ah21RYzIhb+Bu5utbQCmZdhi9YTUud1PDuRQlrCpeasLB8uXb2/npE4e01o+tm28uz96SHbXICSwO/Pdvf8eLhOR+/P13jlj876wKndWqVm4nBFZ086XYef2L20WyOnQWYlpkCHf9VRPzH5tnW0d24k3sRqi26DCA34K5V6xSWngPDux+HaCGvl6ZujE5lb/g6F4jneDvxCkiQxtHOgucg9SuS3BvT3XX1lCA12nRujcVDBhEvMZice4vM41so3nu7NG1UULeC8G5s41wrmCWJkP70tcV/ngGhLJVvZg5VG3nPviVcw1Ow3mKvsrSnzdUau+yiUqtWjBeQTgRwtHmhIxfggN5BHz3bfFhPO9HZeBGCmid0v/WEcfGsdFRzQQBtKYSLrQIcU6ugMdhmd+f7J6ZI81zc0gEnEx1ilZU8VU7czN9TQS8A1vy/q7c8visEp0lSxHvsxhmwNzwN/lVlRnK3GbODKmMt2lysoK2mTvuhMungErL/4DUThdBnU1l1E4Zec54prSXkTZ8Bs3LSgEU1Pexp32d+vGY69DXXF7RyXGIQ2cJThKjfrEY9Ep2/KgZiW+26zN+NOuHCPyN1z8de9cAKbGMyPE9EdlCYWUJkDuxMLNYFay+nTZcPIrp+opzwSw2/frz218+/i3sXBsVmNewXrWd2xZAxDTlQYa7n9sbZhOVy2xnGPXOgbTlEvEJyQL0IGfPy/9msTSnMsFrN0j5n18hwa9IiiGNr5nKOFgjRgP17Cas0bh/22eK0EIUwlovGE6XYD3GEZ8MYMmtY2elFzVYpd8Kyt2jaTj9IyCEGCy/gnNyK3DqI3oNyGp6Vo2lxnWBAt1aDqh8Iy3BacgMSiEj3PFsN6vOFXYv1ikWRu1RoNv9yBK8BzhLsBi8YcCPx3EZ0FEGf56B3VzAIrG3KkfOFA1uQfkMLcCBBVdJHVyt1IsYzEDHvl/Xdr0v1ffT5r1sloOxTclUGbi5wdA8OVSer5//QpcUzygqSqrE7dhZ7uWFrRp+jcp0yQrgL1fTsTXN8ANErrjXXfJw9EYNqyXnkCmxvqb7R4ydjeAiQpFNc+QCOg0ZalK0C7XBj4rdrj3b0mbNIhug0NNIeisajKXQGer+R2J34wTFvWlPMqo8hv/9e5a5zWLKjX/qLLgzso6637KNdJXHbwvUMd4aSQHX//z/afXlMF3QvR60wakDWBFLOJb6VITnx6HAK9/Ja33WpCnrY7h+iHoOr1CVzc61PyD8SE3E/mAHWXjy1YQVrKJVg3/f9hgGnE4l2iWPj5QxHw+VOpGYd8eThTITE1nHCpx0q9gUhpu5l49wPxmyMZ1RjZslDgy2mOX83XbLwHmOSGOZPs/UkuSAAYkk/+kyH0abK7Z3OvWEH2jCQZLWTzWbc4cdjONErmt+Glc7EB+5ftfgOVK/uEjtahLaCA1gPivhnu95cghW6CSXfnSiD1gk8KPp3iI7ATFFOGfan5Y2YWqjZDR59YU/l6f19L1pVZMg/cXX7ipSfZQ4/95+BJOvb+gj9DcQdZmQkvQx+krKy3+SAPc1QrJiqIfGduvgYwSPvtsLRPX0fr+dmBm/VK1D3aMgPNShUfV0VHTgyRw7+jXQC3EQ6ivyCoEacrRK2qC5zucY/EUPSqoiVlaLwlFoc6gX9AhRu2ufra3IEV9I8zEJsfI+/IWBOmn+07Jdrr4QZNXgNUJn5JfjcmT6J1KQGT2Dq7W4oCffNuwdNtul9N56uhprJrzBG5j9gJEgpbwv6rDQC9GcUlGYTCI79EXPn/K5KjesNkRZtikCD9RIZoJl3IqC87DJlYX9h8GXoZC7cVbswOWiBaI3W/mZeoZKsBKLIqy13YuqsKseW+VwSLWoR3moLf98TLTKtnlRCFDN7ZN2uXonBHTVkwv4twqK1rLpK1X/5RT0QUbDKZOaCgl7Pbne8tOZcWceq2K96A2cFrHsRuLYdo4FbIn1lzw1+8+0QeIbNNi2vYUbf/D+nSx7s2fe1g8rgL93NNyrSpjhcq131jlgpwU8EXGW+eCV5tIZQrihj5biMuGXbYP8xB0VwSsXICU1DyO0Xrr45kCfxkicjm8OxljvtDHuXW/YT2wZ3HbkaAbIHBL+Gchatj5Byz7H8ZQ+RkHcECdlZaH+VHAQhtsroO7ojHrGv1wizF8XxsCHiaEdJ6vfeQ6PtSJpPgs36y5MFXtAWHQnpYCogowhljGQhpLCvk/eRQN5MJcHZap/RPUEPCwIlS2CPcJxQox61if8N48oG3rE6SzAIr9eI6MH2tpVOshzmrMuwQJPlu6FgRaXDoG9qf44+cxQg8S+jWT/RFpyUPbuXUU78z8Px18QKIbBM/wudx8xExwWp2lYXX9s4q99433w6unXJ+4g9lw5ZbH3ocwowxnLUFCR9R48HJRnn4odzrzO9mdyuWpwaZ5N2atYm2qNwMxY3LsfWKtJ2gR73ccJUzjrDnfSThPIDJAf7Bhc2XjA82+1v+30rUmYKa+sZRSl+ysHjzyiYDhqoVI1O7Psv3uuKV08MLpzNRhWp/j+AZkRoAw7rXpgZ/03cri63Kxno/6wN/Xl+w0zCXxbgEhBzbvEi+/IzEd51qz8KcQFmqdTcNvc5j4uqiamuMxEBXUIdxz+IqdxIq09SSNsXIpNiYFKxJ/DywSWmuzj/Nf9+IDB33l/88WhjDi14WmjLbQOK+N7n4bzi85HTkuiC91MrWbCQoyxQbbNQ1waKH995GFpIcugtIJ0uAMrIP5X4CvQ79oy3apJ7+lAbNT9LxIBY6AEjYRfNW4Gt48m+qAB8bYHH2Z4PmS2Wie8syU38vudux8vkJD9ka6pj/TyCduYsgbM3qzk3gU1YtagQPvqTR8xCNHslEXYVorbMm28ul1u7EJ6dKsdBjNmDMVNoP2Xw8MKSGmo7t3my3KH/cfWovX+X1fYoz0sbnb1MRwfqjQEbmZv7XQu3pFYo3n04BK2QuIKXgzkL54skg6H6P+P7wtn9/GqkBh83XIAtnK1fxW2/i5DZlPIEF3XFH75aZAQDSHNEV9/xKLyIo9CYvnQ3ZW5ZIxn/tt6tQzL2bKOOcaDxW5hbpB3UhYZnBZKmPsr3FoO5IwamJWQBsBuOJSUE22XdzwOh4eGsKi8qfBJ4pSp58K4k44GYf7Y4a8606wFUlEX0m70Ghm5kH0pzAhiOwCU3CxmaRzHXe86nYQDXpR/zGdLYUdCyf1/iIvyLEvKdegI+nyOXz5qYQNwlB7H6kyFSe9x674CrvxPzxnlQDPRAg+wqbuFTZbGScfN3Pe2VHa2EQfBaxt1dMXWSfWS+3dJqL+QwB6ddX7DyPcOidJVCI0VaNGIJwwcwx5hcqiZZiIswuXIzr1U/CC2ArUnxQDUku4gvJXggLVW8js5VOxXMEVJa8pejap7GNblHhDTM2MKiUNeS+fHT97oF76aGBHaJR5Jj5uOlrxrWrh5w5YkQRbZ7m8xsc0bH0fjlmFn2trZ/LPELDwqwxLAESP927Hd01znaywRRP6TrN1powwP33LMLTQjySgPIiJ9hA07PtSAkJiv3e+XbpNFMiBtv7kzeFCOi1qmsV099iqnscISCBN31MabV7grViDJntC23ckWwTzzew9X7ZxwCGWSYaSAurBLYnW6LvlaCkS6dmKiW6xQQSVlAQevIU0u180kKb9ETtEpdvylshsIotCqfbyn/bnw4eHxOaCiLxe6WTE6UJMB7yXqKVgzX+CF7JZqSVhk4xIIjHn4W5tundheQYTUecQRj+uaukgufEulk9/FuH4FX+5a+2RhiGWNyWWCkymdaMyCp4RcWKOeHgQuvrXoobDzDoczilI4QeFch19mlIJvj6ns30J96PDevawG+dhryH9f796azVqgVmcFPmRvd9ITj4RylnKwRT0sIzSlnm9N0D/2wJ799jZ+9+1kC3FJoPJM8/UXeGPOrZLwOqJ2jiUCLLV5Bk02yaEhT8ifc1zlQ7uyxmhTdC7nfc3xoo/XCaFCWzTvoPLE5/cYsGzpP7l94lHFkZ8MQUAaG12f8KJYsykRPUnD79KjotGJl5s9yVO2/oJx7k1iXu49pFMwp5+xahBUs0o9UQbymVk7Vfm5ojeKFSjBniNjhmIZshDKGK9LPZflX8KW4eWMB0qgPZ/fnMu2dFoP0NlmCWQpninQKb7ixCLFmQ9ffjtexcBELk48PS6SmSC2HMmbsd2ODlfPnNZcECTDjIXZjnCA2rCMhDtRr2e4iDs3CSvTX4WUst4P015lm2fJos0ps2oHBrDlgpE6HULjKAPd/mw0a6emE60fhitH9zPP1TUCakJK6p8oM38+QfXyR9iJhzHPsRc44/naKdBKJCTfcJJkudEGJMHjTHEiaGCOMe48OBcMs/S6D3w4Q9w+BIIOBSuLwqolf+fnS3BM5dRPCw4BxuU1+7HzIPuJey7G9Va1CsqP/ZB2R8/9JZ1ztEbXk10RDEjZSrA9QDWgek69RTGxarnyTO+PlPR0yWgcGlgDfpMzt1/15bUuL4KKBqLa9Dg4Uy4Sw1rIpzjcvPAZrXjx73aamdccM4XAZYasa9SrP1QubSGwwUaRsTbkegsnpUItmzfFy/Ib3YopKf/yv936zhfi02xMScWksUewvEvASN1Hda1BtDtN32eVWzlpf0OdQk++xPJlCmKgGJR5aZyziTUpTUHCOI/pglxUeDE8+uh2Liz6gtQRkpft68/uAjNGF+YRGBVx3rvMOn5hKQCvSU7IslcEMBHMi+BZkVEKAvKM2xNynl1hvmS2EyGJUVkUdLy4okYvV9JRPiMqhnKsdFx9kYwj6ZlMcRhxhOcD/5kZVFfqzw5T8zMj2v/CBp2AjjFoHtjPqadu3Z/RtRGt7XUSzghzfVJcKf7ON4intCwVdLhm3BRKgOCu4kgGy/tmd6AnJ278Z42eepwA4/faCAFh4KciGZKaRW5imccSqleCGIbtLrLeqKd93k+kS4lUGGAp+Bja+Zi7DWoa+LYQz/x1RtZdPpuA+PCF5M3GbB1F9B3Vcj2QPDs4JwrfBgdhDnoe5YWrILLUXlWMSLmT6ZmlJD4Pn9fnNwg8T1qR5MwLlUXKhS4ZQaUQXBACOqG51UwOeqaBtATK6v71IGSvtcysEUMq5xaMSGHZLUsjloLz6Y4XgSC0xjJol5WAQIlEooArj4kMud29XG9G/HK+XDpEcXLddGpUbNpkLaLIjeoYq4XQCsBIqkp/IKqL/YO4IU0zozvq87HKUTYQTeE0K4x8BjuIysU1owI9xkOzEeU9pVbrstfnaynZwOPzUG/xncuQfJYPrGbjX/H0nH4lcnen/lVmfMb3tcXcLm8EolGpfnbrLbhrAbkdlDfRBh33x4Xu1TlxW8C1IM/DLO58r1O2c8Z0oaWDLiZ9aYMbBwWyZ43xjMmUlUrHcVpWPyHJBfCa6x/v3tiaRwaL+RYvwKEByPEBdT2X21K7UxWMi5JF3FsEhrJlZTpH4IDq6KE0OjlsQbIjpKIUFcNnkMHUbCcxv6n3Pbr9NalMNb/tieeZ8nZMECL4Oj+0pUVXNzfmvBPgYGDhY3pw8QcwDBWiYIT2Cjm20XMA1kuAgKCHIU4YWfPoA7k5OK0ur72tc5SShFrkbHfCv8hB79LUPkAiIATxxRMSwW41XnpZBJ6fRxxkL9TnPI/ucXXdkgClLc/GQKh3rGSHsZorhvmT3xbzKc+jhEnV8xvSSB+WhMGrgFyDgZHvQ5dzeWxz6O4EYW+ToyLRzcSN8JXnPwwqR+vAxWgAuBhe0YNJ0sazUt7BAHOmCN0F7mhCFLrYMQX2K86p8AWj1m6pJNDzIdH0RiJeKV6c8/9N9FLYjHSyWuJjSLRt6dVu/qp7a7aHtYHHxb+NJPHBKObm9dvZA33qcHl1QUkrREL1Y4QAljnbmOeEV9njPmOttqjlODMriFvKdZ/A2FK7Z7xT7xjeL1sJmwwsNilG3IN63VBX6UEQEcpXNvSpQzZO3uz6pW0M8bBSSYHtugQAiaW8MP4+UmuN+d//q4aK1ci7lKfO/oQpIvyGh+zoaFA2HooZUFJLgJZAnW/sAm50yoH7PkLJID0BZvWx0XKR6XFwT7PKjY/DQfvCwT5dlDqCbRKQOahAxLgGNV7dpNI9V5nc58LJ8Q2FskloUNrRs2BxHMjvlip0MaD5tLAwkL3Jjrst/XYm9HskkNJ+R9fNwEBNDSnKcxwTNiOJF3ZYvZ7uFmLElLvGKbu/oD7+wxekZH2wyfJ00lc9b9XM8t/4GKg1UPnzHb29xjRzHh8DivO8VelJUTns11yMIJgbPsqFqNgFofAJEXV1Diyc3zlhEqAsH8qGfl6WMscrK+afogOU89oNa5Kl26dwRfoD1xgNQtco864K3UT8ApVQNLh3afp95ujGJ5KQBobGUD/sERCU/ukRrBft0ITrTyYMD6fBUbAhQm5+QYJWV3MeF92y/JMbpKRxXn5l1A4dR36+uRk/vWP+nWdFE1puPvNCunaTj5yITX8qLYIb1U2lEEreO+4mE19rU2Fx8dfqQ16jl2eQJ+355MMIy7JOw98AYcP6z7vPwE3P+/PsDXkTsfBHdXXZgoyrrEZ3by/G77fVxJuQaCRtMS7KQaYSlk9CJVByhEgqIPGIewbNaElk7Nelt2bZYlYro8EHWyhYxixFZz1Y0r1A5Mx9CxWP3pJQrdfRGxLqRj1CHczv0AtnGsRfGnKBlWD/sKZp7IsX1QegSJ4jB0kGRSmOZ7nDjhg30rYnGvrCBmr7m4EE1UUiZfQvNm1mRoxMXUWOf1J4ssbnnmb7Vo5ED8HxEtbkrYfr1+VvAqR99cRFWvnUg0bDf50P9KCAh6Q5Tq4aPwEBuJghA6+89sSHldW4M0ag+pzc0BPy/D16HbatRHGovGIsXQhq5i+RGbSYOuThakyUOs6BP3O9xp6ZdNPzYrl1xIBGl1MxTBQ59ue7QkP4hO5F572FgV4Q+tGSwPMY3/1TWCP1c3zblimELnxk+Bcm1tB2XTFvAYNAHGKJ4lM5WV1qs2itM59qC/IoEEZto5yZFt5+XowVlTtvs6XgoY0RJ/gO7d3XLL+KbLLWsb6qcwTAnoFCxYo4kZ+rmlJDREkWVYOEW3P1Rk3/V9wqcrcNGfRu4Chz8JKYEpVFM98MCAUewahzHNXZpRT1pUFXs2b9qgvh7qpefZHNT4WJv3LLnF0C1ihI0DXQha6tk7PInvEvZ9ddsLoeSSKCOdBUJJVMZbXhJYBzyFiwUxu619s8I/JL1eWr90Be2i0jfFFyfKLvRSe3q5Czg+Uz6Ui+fVXmyFv4z9TxjkqHCM2uiT80jHMav3EGgLMN43gKojvU5COk/x9DZIFxMBhNk0t2pgTBDIBffKzBwWt/FozHqIGO0yV+O9qNOxTpb3WbL6aerT03a12PMy7ufV8MAsxBA/EJmDfh7LGYLnKYXm2Em9FyCvuFI2hlUjb2Rl5p8gu/Ykqa/DPK0W88yjguPjeqQc0lF+Uv3VbWg+InQLZrGsYmmvHAbfCU4WADDs8bSa07fb2TEjHE+P3T2oXpoSXWYEsZkV/ELtnKjEnlnKpvCHETqwcbZ7NkPgrsGI7unKAd/XmpcsDW7VVlEEIeP9gZLVO81zPwz78r0mreJztwgmu7R6ultIVTKb4wD+8b8UZuFBSYOXnlbjqOo5JWe49aHhFe/ep49fUqLyCkeiVaY7wF8vRPoLlf+7hNb0kPvaI6dTtkyAnD+tVh6sPFq9zf/QG1VWHuk3pckBA5MN0zB9DkCyH1T2PXwtsQugc/q3Mxr+l0yx/SmfmZfrcskXUBBige2+MCywBAAZFNGUqiUr13njBWnVcMC+3NHmtE/HGepeN18cc6hb85iZFdiTovWnXeMxGtte+pvjpr9pbSbZfXk93P80ueTIzvFMbKHO4awrLmWc0AlBEqiBUk+hMSlmQ8mNFMf+FBBiydgxoDn7CpAzkbU7WUdduNlioxsgz442AyLXKmm9jQhkCdAGofQzgxMwmc7n9xXwQrMcOiXpM0eqI0ao3wuvdvq3wBzXdTIL9p7mZGvPgO1fthAfmawTePZmPJO4uviKWpQ/ZSMeRSOji/KP0whZWllF/7E4jKtLFDIQTURWzS+QvBw++dB/Blscz5jQY5+ogSagf9VjTTUVNs/58wFpZNgeoLf4QgUvgmeCT0E+1puJ7GT3h0xC5DjQr8KTaONqZDH++ckawrRDkTpdvrKt9ZA/YnalwHThj9TmIIv+DMGGSN9WwW1q4x7S2exBO4gCAGf77S9StKubbpJ42HcO9dfiIfsmJ/L6x9esG/AqBVoSKfd4tNZhdKkzRNrM2vmFmfbEgyzwPPA+yvnQN91YQcvab1RqeuPsXQTVCA5tGicPKXz9SYfCwgG1CKvCXhFoIOErvvqM3y3IVFOUvBA+ZO+6507YarOF//u3OWL0D6KoUbUE+3d7jDk2g0aeRR3VhpXHT2tIhRA30w25qvP+U9DoWzyPwcjCzpjzRZmK4OKtX0cCsWq7XMnpShlxbmpGv2yQkuXwiqBATIsrN2iDVi7zxl4ccqre1V7yV6Yp4L4IdpAWOYejRhAhQT7Yq/AAtheljWDn2pKIFrxa24zF1pz2rTbtkxeXnqGFDBzTpoM059SpneRyNo4kfFyMzsT9VlkfawtvgmhhE74wJc1yv2dHxgUKYvKexoQg7PygSyhRxSKSohbgPc3nckB+NeWTDXT3+J8+8D9/g45sv2X8vZLh1Wl0IUBx4dIhJyqVKhWe2s17+JoRmVWxAGANSHhynNiHkEUXxtLzS/Iz1PIttDU9STejAfJx5JawheGvV1EfFJylKnRBtdc0U6kZwLTo+7lCbJbjBOo54Sz/oEL1nI8QHY2ojtINLEFMEF8RQHwbMKhDdJJ6Kud1wet2HD0Ih+j35zq9/nnaFYY3siNVPN9Iv6KSSpwhzm/1LcKMzX6rPrRmqulSxcaiTsXLBnQVfKPERK30yk2AjeTUUXsKSJcHcUqyswIzmkE9+04VM8qd5GYtbZZNBnX+6KoEve6f1jFqy0hwn1mAtTHhvpgFlTxui2h6QR8r0xFDx5j9JHjkJ6R7jR8+JQ3XypmKqhcn+R18d21c8FRnaC+cYJCOhWTmn+dJ0kpDgKzcyR6cXlWAeTixZ2GQfyCVAGrktFUPb8FOs0RdLYwHoqePzs/2ML9v7oaJtF+KWdnr8JUlnkP3pZfPVe3PtVnAubuXRfwETlcAOdJNjzUnvWFrcUQKe5xDY2qiuL5nV7Hkft1GXLi4WQ4/EsIApjpsfoo1zXBIj4nRx6lzyjX6qP2eAcL+ngFM2ltkF/1863o2DCvbArRX+3oqc5dC614qVd/E3l2YLPqt3yyfMVqB+D1TQg1Jq2EzELt8znEbQy9xldhaV4cI625LXpdHiFm2S0/Mw5Ik0PN8qC0GU/vaDA5GplD6NOdMG98MtSajlNXki8slvrtLDDm4fk9w1/gcddPh6cByQLMS55hiY/J09O6k4W2sosidpZjrbnwWsFx8GrXw1eeh9dRSZYAAH8QW/0XSoL9J3Ws6W1UZ9dIU7aoQOt4hGJcUplpA8aUBmeqvLH3Xx7gNg8rNRw/N3/Sm/hvuaZ0Xd/T0AJKGMIUqmdQXiG8O+LbawCPRCFwVncyoYrIc9fB3aZ85rZunkQhM50nJdidLoydPrDNKshsjHGg113CbReX0HOujlfKFXoksDLpcVyKmO75SGV1L6w8FC5cSpdG2WAKELeTm4dPt5xGhzPwcVmRer7RvJwNHabjowjo4vWTEeaEM84dKwePl3dvgO2NyTF9WI5g6SAMni9yVqcLZLj7Ww5hV8Y1S4tJ+mShlUyeYZpUdx8NIQUx0FpJYqX3VNJZfEfiX0Y9oMdReRDBWGRUX3fYsVHwxTTNq84LigrGLgNdwY7Q/mNsFrAskNfOAG7wT8B5bhOdAfJFW3NhQ7gDovJw0SHc1BKLk4/U1qf8QgX2l+4i/60Kz0ePNOHeH34z4vx4Txz974Iyr28ZOMZwAOiFJ6SC/dZXAHQLkgDvqdxO2udMfiRLMIybpI7a+gVkNL7HaMudLhhXB/P/8DyVq//T+K/fPgipJp99syUj3l4Yn+bTiS0SRXw5/PmCK+VKPPUXDadg1G6gRLIQua9jvFdvCx8s/dMH2UEks1pn0ho9XFNLxKrpGeceUCsmTLhcvVgum3MtpTAK+3K1NqSlWKklDYhZfLBL5mw4yrCxc/61BSy1HXUF/dXp3/wIqjrZVsy9KXyxHdbuFgBXT+SWFD4dybwhUZhNkfSuT4qkTdJ/WHweBD0FAhdcDQMBeFPNvCSxw8TIjJ+uJALwipbQstInfNQ5hD5qOyOvGb5GoF+6Et9yTyHOLQhgi5TBEvmyGaJWQFNRt+oVeR4kPfwFfPL3JF9agxyM5QotBWJujqRma7ry5fe8bfqlBHjx2b+QPYDHWFYUa4dUyk9ZdHYRJUCJDYvkz0TNaVHMZaYmDQWkD4y1/OrOW0N3ch25mN8sxLfAKsxIU1s9wmx0LCteNbsd9cLVjEI7fU9wdpaxM1Yum0PdKm18v+DjGQeAJyfOMpX15JFheYE28f8SV0HdODwB+5daoCztkSXFBmNTQ3FmPBV0piKYUO5bemLSWtedJFjKRVnQZxRDxlXmPSy+UUElap8k5A/ofvd6KI8Nfc+xYuIeJWAmI+4ulIEve0YGd8eDopws2+fCz8phvUIsL7bHjr9tOEGHX8pQHkZKdkNkyLPOXFrmSHx6m/5Ofw3w1XRBPR76cffn4zbGUXMa6TTBuFdr8/BaiYr7p8waITWds7Eferq0A7jvSZrnVW0/Dt12RlYS5ROj/zII5JsrfWNzyr1GebZvFmLEYvsQnJmr036IcuQ/FypkA7clfXs6ZPsNWCpjxRGTOW+kblK1KtmkIkgFt2hJWDoXQJoqDlAnPKNHiVx/laWokrjhDHsxZZu4Am0e81FU2BzBdReGxn80LywKUJvl3LKePYR++hUm7vqWa8olPVmfZc4RmIb4TjuQV6rhDKLfBxl9g24YPPN9wWvr5kNvk4+d7y95fQfNJci99I/RyND3U/OR2PSFfDGDZLBVRbM7CxCJ4CajvPGW4H9wHicaDCSvE14J0w4BGZinOd8lz8DfblPUNGT5F1aS6IrYAfrz1+KbGKg818oGKGkZAEE76UPl5QBmo9ljVWw33RbCem9aPRZ+GnOK1vdYTEvTb8w5zSt0rPIlzzq7Z8UHP0IJLQYDRv/Hfi2QZUEXvJL0rPtIjUym5RnIMVjLac0FnhD3w0Zz4s6JlDuf/mWF0GD8ikKWdV9IvJtnShGDkYkYvgLNgTS8RjxKscAh+ESuZeAqWhR0jduYmwdw04KUROhadfs0eCBPlT/JUm6lyLA//CAn63gRcmKtKcGdFOdew4OlEYM3QudoyeTHKf5yAOZcAKxEJkD5xV63piC8LObBkvHSnfJV0eEKCKFkOUjqX4M3o6a/MiVl71fhLIaHWKdKArfe5vRbTvmBo1O72jw2A5zzd5+hVRNtHaoH8xyrCuKqTlH+8MhoMZU4aOtVV43Bdcg2u/JFrZ3r5i/rgJdAYzZ+m3e5R3lBRVTWTwZsTptJ1cbz0j9sSxtYBzN0gVxPjXk79IW7hHEry8qcaVAoQZMnq2fjaMQrYQiZcby7ssQMlj4ieESzqJzYQMVjW85roVjHwUSbddhkaB3BIFotKma2YJzoEYSXBajjDW20RUr4V1POHCqUFysVDUeQwolFndPZNvq7PJMsA2oO1sEIEqsWKtGFV7xdczagEPEa6mQM1rSXhoCyQq7A+iRbxID4VxKvvxC7NPwv0Sal3ukyyeu7TwRp6eo9//vamC9/jTIol817fqEuLrHrYF1OvVMu/QJnbwEWRBl12FLmsao5ld1tZLiCW5yIHh47rD7nzrIUMi0uOqDlkPU9B998FhbSxvONxLsqfI+7+f/QEpaAy8lygkNUM3hX37kqbR12mmmLRMyLuZjHJ2mo0yc1sz3ubC206XW9FY5oAzaOrm1kJwJgJpHnKKao4d/srNhgR2teN0duSwTr/6xcUIEz7Z+jkjOMe/ASM4Xxt9YDTh70yxcDK3tBtYWTxj/922NiEYiGJtt2SOvxNvCoMJ03la8Eze2bbBe1NVm2BTqmpDquuWuSy9w5/RTP/LaJ5IEO5SUhM41MwiOJJjzxmds/DieW5OGH7At7fKztaL+VE4EQb1h33MtCMVLs9ZfKpEGEengYVBeJGkK2k6NnuxwsdpbjdhrjtqRI1WYclSGMEEqg7l4wDCnDsmDY9B6KDkg9v3SbpIopaB7knQPCjVEkeiiW/48AOgAc1P4KHrdB9skKEMX4K3BHDRqJfIWEcr0Rb941xiJfhpirgYiwwpN6/llM8bKGaNSiD8mBl6eMSOvWGYsH5b5hMdG2LFQbxmUyUPzZA8sxudqpv/sKiuvPOdPBkXJ5g06iwS5h7E5XvylYQpsmMK+CtHkclBlXPp3gkU03p3ex+7IE0Liyx2okqSmWgAUqwmjld/Pul/3UTtd0/HSfK0NdWgtY+znUqccw8MTcdkcWlGBC9s6PnP/yZQZ07l4QmYfOTjNVTwGx2ytbs7ibd2x3s8F6KhUQDBPpIqs6rUWUNvYII5SNGt1gD+Ia0eqN5MDA+OmrOCW2jSUbK9/nZbHVtJRE6EfMIbDhh+5pgbwLAy8kQQky59IHzCWVBFhOKtoakCAtCJqaGQEICyainZSFr9KG0Rn2XVSVlaa2uvffbknx67u3Hits9SprCGjzR4jW8lYXTMnLZPpj0UZMXRimte1VF3Kn3CM+bPmhmvbI+pxyQsdNT/TNJFrTv8GUdpY+Trko6PZAs7dS7GJ4C8c6i4E6gqcoQW5bFpfK7p1dMbglTfzTPvzbPQHdcff0FC1ENPKQhqfisxvo5p/Eqb0YQOJAbdHQ0Jsl98PXFNCM+7t+1x216POWL9v6Cmt9cWj6BfhZ4XTNs77XfZ2X6py+QUZ3xSUPOAHM27vyJKVxj+LMnYjQEaRl3cc2VfeoHSnfvMqqScnIJ/Ms2Eo6rhROV8Bhd7+h0pl07A+CRi8rp+c99q4K9Gdo/cymoAP4BmHXKA2m53CTrjN2Cl1kHOb0iyFkb0f0mCRJQ43ZkYozqSx55h5rbQOaXz4MtZWpMQuTOwL2htRoTFbzib4BjO4EUEV+KN87GDHS6XfPvwHu31+46tlq/5qXFNiFoPgHSRrRm271heI8yTFSbwroUgP8D9MgQDLubLY0J+67appgnMOZ7nkW/+ija0SA2u+R9LCKCIgdDUmWIVrS0mN0yPH+wc7xxbED8L3rpM3VkGR6R/90wZd8djtR/5ckDU6qprYLxwVv1Gfdn9v5CfpBlyDGPLdyBBlnjglYB2iYIuTJ8rjvUElUUYU+q/6jd/0KDmSwgMEreFEzB88QEZtk3b1FflUlw3CxV6snDJm+orJeieLzDuo5mcyHB7uGmntazAEsILIzS+bCUb0N4To25/93IJU7ldWQPL4f3ohMeXf1gmke/Hd7h+MnAicvZJlFDsZKKYwsGfXHJKdefBwKIgh8/KuHEqYEd5mBxn9x/t2+k5CCseHpoGMeLx2XUZeamKBXaa3iVee9k1SUE/Vpf8j9ooXUXHmT3PR0AiAkZo3/FWlfqYSSRjfYLink1wfg9V90DZQVplCSsexoqUAVcfTV3wVLIYwszyc8sXq9TbtG9Cq1/ocGtqJ4WUM9uufIf3W3CuQG2D4yOfhSUqpGx93uCc9JBSsVMhe3Ypd4TI8ZH/7KWvkj9de6FYVm9g9cURg9FxAvK2+B38H15bu6Llu4+61v5GjbIUanBSmwqWcXO3CxOyWRiHKDuu8jNxLHWv5mImRQRczzxkbu6FhxIYJ8h05wl3yARyfYVR6O/exIAyCL1bWhal0bcvboreDCuQP9/aelFd3FVX1GHOMo1WSkAFv/rZ4fBHaEnd70g4bQzJfcA7vO6IVAR8h+PI9TEa543nj6bB3qjs1sMoanVLORp5uAOIcaM/8tKo9rwo3akUa5cZ9l8ZoDo+bYHAq/Kfk4jxsg9VMePqf6kp/ter98xuRnfTCn8B4yLwEjqhQqlgFNPGTDnxZugasWzrjhNYT7mlKb4Kcz+Bm1r8BhdFO0V/rDFnA+t5UZwyDMfz5dh50SQwhiOquKqCehcBSymGRpQm1EVpJpRk3IPBb02ywNPFdygWWbMvxxuBQSGfSnQX0eWRGp7utNDKQGQkwfR7kMndGWruJWt71TCWGwcuGmkToK2QcQC8VzmAsh2cmQw5UL3fSsAtlKgmEh8lBXdjLcNRZzMUwSqGpPJgDSVYIhRlOpTZYvhtKShN1RzDn/yNHzNSRhz7uh0kyRMkDZdybI/3y4J/nZQUfaxQ6zi1dCp3x8h1LIsvQmWFDCPKbsaWy7JrlZMVapBofIeQHz17WOLjLHaPNdDK947idZBu11WF+Ds1mJhLugWkTOD+SOSAQL/Vc7mcVTOHZcQj5S6cJZqTd8TZZRMZ5/mVCkWueRNdQMFDtFFIMW3vPiGJoFmx+v97KbzcQjOID9iyxhqvFKQulCa1ntyBwv1wleTU1uXGLGVqcLptOr43R8IRtbsbyW/nwNsCd63EI7iqLQ8npj2sAxjRA9H+G5vCaJ4n3gHc/bF/fWk1W/fKF/xKxNm5WJusLvoz28LNVbDV/+yM3T2BB9cZhvwDXBZ4bIiFxrD4V9vIVkeBVZRFZRCPqb798VF+UwdamcgS9yypk3nF0nnvfsg0gbdg+DUEO3XZCx2x7TVWQn0lVvkyi4AdFDJqemFRkuow0eyikNezLwElJ3MSIAQrsn5tno1Dm5ujyBkeflQUU21IRoruzHBoNt9fZfL/JpOAR/62B9sxvqCo2OKyZ9/9YWxvuSJxSgvnrKqYeAAHLDZrEJ0me9ktelaw4bD6WgmZi03i1BUUpbMf/aFbCfenwuANHyABUYMA2HpLHeJc6lzb4zYVvapOMpqSqB5dKQMrCflT4l59r2EQq+Vwf9mo4qPyGoGwHdTFmYSFgxnS2s0kkHjU2AXo+O/MmIRx8DcO0807u3khnklwG9HnCzWfL85BrP9YvAMqM9w2zANkGOKXZBngBTzJGXEdALWR5oYyEvxRF5o8ko+kabV7/i6cMLyM1zJXYAZRdgb7YQ+LujPlEe9EMMJHU6siOPlBBuQnfS06w4sVGrTZ+T0BeeGV0QqOrprBRp8bGkyle6UZuyquxNVaAIMp+MHEESGeUZuvY1ALBpMOXgC8DQMo+1PrylmxGaV/NY6ksNrN4EOwcVyk6ZStaoSFGjEAz3cQzMTFSkTus8mcSlxq7Hb9EGk7Hyr1Rp+ht+ZNpMvgNI5WDvnEpR609d0IauJKNSed0At+nSRewnpmgVjGhavsifk/thOu7HND1n0mVtpTYQLaaWZrR+OyMOakNCVKdwoqFqglEEUgRFq1OnCQzyiYrPo7akePninJoiao8eSl6qbiWdlY8A/ucjy3BWgnSXQZH0q+rFp+lj/FgKV7WqC1SLWOvWAETsXTk0L9vGUW+iKM+WGXxyzIjb4D2z4n4cJp0vexPA95zJLP1oYrfHDDIM1PVlpD8DS4Qn07nkHq67ZEoK0ZjGzSyv4wDRqt1FpznUOhZWLCfBFFupOQnoJ/8CszxnBcLQIKKQPxChCMiHydbXWzrChLTKImUYcqhxi+qBLpW2I4X+MS6zs9cbpCJs4GQE7vS0eceX/WLGLR6vwC53ncjk/e0PdvQsAO3wK981gz0RWavBkctyOjVdZ16QZz/iQRUyIc5j9DSOPcYzb9ZemiVb82VzcOIRZb3JXIYBcO8OOm1zZDW57xnUXoE25VjSs/RKYvBop43sWKjVtj+PgljiRQEOuuOOH7o1jaS9JsOCw40TOPjY/WNH5hqxnpQv5v26A5oKz2laaQ8uHmEWNXhlBHSklkO1NSS74CZSjJ3A4ABFyswBG/GRYiq+D8UiwnS+ijT/NfA7FPXjZc016otzDVmTnqTe5nh9KFbhyFb+z5jqfLPFM/2ylDDGOjmv12FAkb+COROR8nyOaP0EOPQ+TL2D3W3Zf+KHb6gtTWL9iOjG90GtG8AbIDvC74gaaDyiKnv92b+iSpRPVMgNCsMprjoDNTqpQIw0+wl3oLoEzVSks5va/z4JFdM6MHV5DoPn/3Up7cDs8XPRyQHdz0C8eZ2qCQiZ82AJHSEhwpyNO7/romxd0MKzFFVfaGDpTeYhMeqnxkQqkgYtnSCwdrj+RtISyglbsxvATaPpSupIQmhqUsmDePyuqRKiioMBGQviQySuKzaB163ZLDh9lk3VVmnhraUKHpleGt2S+AlOMbsfswfRglvqyl+HayiA1W5XfRimRTv0MiI6yZ1tn0YPv/cVLqYTsygmY1STY1qE80aHcyyAr3wWA9eAO3cUZiWSmaQb0V6UVndOauju6cHBdsEBgYL+pXE7YZTFYc0adNcrPMRr8GlgMDGBLA75gbBvm+CAYI4xuex2oPRzdGDFu4HvR9gP6FZI65IAzxq1qV8jJIoAqbQdO5qKygT3gSSuFExEaEr6HZi5PXJpxzgZIAyTmiizZnlkq2t4hc0XK/M9Si6eBurzjIfADxsU5hA2rPhOOrEp/+bRgb6W7sCaBaXvNWI3eMt0Lg5Y5O+aAEJPvpXrRJmufF3r79BUtzhFis/BbmF9TnCDvbLDLhrz53eY8GvEKPB+N1nwgCJhkNRYpA3UlQuN+ziefaKpOQkV4drsuu5OUtsfRwoAUsfrwWvTRYeSxWxO0I8s6fU9rPO6v61CpttZmsocZCfgpsHuFELDNRwmQZIwhxK1Lohpd5Gq0to8yS3LuWXPgZ3AQVY9ALpfHmJPBZMeHfYtBQjdl+g8GufO2uB96VmvVK00Y/64izoLNge466/s3LfySmrofkWxDrcGtKtNWRe8jXbrlL6szIfexuqJ9Yt962YnGmW/a4zGs1aKX0SafmBFoJnvGl4ZRbQRq9UYrrqW4P+7fYkkGqvnAKESnZN49gPQSzvRz1UjC6MNUhHIEOJhxb9T2/b7wwaM0vAGNZqn3Bts+v3s6G8/cOt/kuNOdYXFk0LdMC4RoyZltl1q3PYPMv75hXInY2ksMmw9t9I9Vcz/+9XMObAgiB2d0zDXIsWyPRrRgAIy2O1pHf+o5s9nxFkLKYXxQP16sV+eZHqmI1KEa9o+JTCly6KsUx0/u6P8ykCt2vdNLBfVN9srQC7XTm3zissiwjn9ZKUhyi+WLYeeUdh+FjB9Xyq2bs1Pe7JwaZJjsxsIstI4FhmUjJcUazfI7Wr1C0yZcF6Ss9FuPrfVdKsS5Lk42L4mHAdZsWG2qvfVUbrhxXtVZB1u78xIva1jRYYDbn54UU/rFNooFzre/PLNebsItbW1XRtOFlAvGffLxzPtCIbjr1ZZdTyxvCbifkHwDI3H2Tvvrtt6l9D7Rry1z7LmD6p9Cgmu0GMqk2j1d5HyzU9FVbJz8aDvcP1e6tWypIBV0O15IGAcwzw+KbLOa3kN7X7GN4FPXRseeEgiwm2Vbh3F4/lMm/fxQKlQ5O+yv65w7Ngvj198fBmsYXDm8gCFgRtjBNvCG4lzBGu5SORJZZnYw6/eSQ82uUMFyxgURlhxwPQS0Px8rv9B2fC0i+Rn/59ctBc6ZKu3PZbPRX4PHM64Xy7Ikg/pC131O/g1nmsawEc8r7zaFa4xH1C3Y6HV4apUBHCsyPgH6aeIIyYkcr6QdZACrH5Wlp0Hg0XcHzBgQqaJ8me6Y/bgbk4XrcFn6aOocOeJy9vcDGwxw5j+qnXOe0yMBnbt+Dj0VVUnQt/IyGYUbv0KLrMavZgG/XBreuVO7AHuYPskafw1lQMFaqjaDEvgEgajcuN/1UMwlbQH2XPxEoBeOSGF8P2zQmtgZrV17Q4VL6uZbmYauI2YRZrh2HzoYNlRmSUmoZoPOn2UrRV2Xr5L9egxWYhMShoFx3cLKjFOCIUMyP/xyEoGQOTrsnQt72bLt9eXUimGHtDiMAmzATpnw6o9sEjzsnoNf8I5XsrIdIzV2Oj1z+4L6lcMNlcEjvhnjvZiz0wTfHjwXcsaIffwfvjvxYha+aO2NXImXLdeuVsBJL8bpBSNGXG6iIbTEvYNZlpkh6oaeJGnvf6kwMuCCCoEudaZPGUtRyyQOczAR3x4UM0LAKmn4+Bf7wIfFbRQd4p7VG55z9J4XXt6jPYIEahUwaWZIKKDNs7JSQ8mb4tLYusiidzN3pUTgIaI7bjU53EBSUcR+bypPkZaIJ2tctuldRB4pCoWOddfgPynayzsclmPHoaKADwSlWTbofYeBJw2cAI0Wz/TZekkSrZrEIIChCQL3uW1qUgmhVMfC0VnuAyPwctTOFv5F31DHJe2w3HkA7LqcuWDT6qllDkHyR58AdOllY20CV1nkhb68hZnoWYHnJ21HT/3x6nhd6wpQCRvwBZ6qTPWZz5PFPC7/+ds40cNUV4nKYUfOv5hNpXGH6d5COMm8nbd3WHaxz1pt4xgDZx9uxPQjm9bF2S9f8x9SbCCw/E4zL9EV7kp8jxyIaUQpBk+IC18qSJS01hL75/P5HLjofbHJtyM2MB+mNZSsbYQaSmSnCCjh7/qpq1gzePEUBF58BHJoDf64ChLBN0tPNnf8kuLK0sJza8HbFmmXZK5bNmtKKfO0Wv/QG94rzm+J01AR9iS+afQzvoNLFcx6LPoN75fW7Nk1vZBqEuRKQrHBIBgxQh4GL7yxEf9wVtiHZ9szAmhBYnnQxJWFfOpW/BPD2jabIMSax42/uxezONi2x1c2G2dd6PMkF78rLLNcGSekla2Y4WrzNS4KPc31I+P/WOBD2uWmRxtQalbWzOcH3Ai8PJxjAuFV6/cuditMr/34tEAqW5MngHkWyBSMpjDr2V0jfVPfg9aI6d+KVp1yXQcX4F7XINJxAo2rXgwuUvsJxw0WqFlg8ivf/sq/AQGkeSLo0MyiXCrE5QFyPFZ/JvQjtcNBZhaX5sjc8uWz8ftMLVwiUCj2QvjNHb7Ln9Zl2SPrCjvYOGy5N9jOaKE7XVG8U5sQhh8FW4mosja4YkJ0pXLJa93ZSknA14z3t+Wjnz8y7w4hOWQ4VBqOaSuV+h4tzG5Ft7GUf/KaQ7z4u0LIs8tQgHUiy36Gge8CU82Vi6YuhkH5V78Pys3LNavuPEWJdPThUnZbJ2D07QlcllG43J4jbOdWvb1g0S/3S/BgausUvn5MSsizu5Zo0SIsuWCwKl0561EDlHSqIQPZhGA4uCJ+HLTXd9pTGu0m4Ucq3wL378ON/9QVSFzdpHfKUlNezS9ntoR16QM7SKJQ06FiiStfyFgwmUdaROjY8WNt1pBT69QB5qN2+qob1Pm9FngqK9pkuh13MzkmpFpWm02rdmRokr0s0B+UtbZDBK68Zwzr+LzCynQ1Mqt0tbsFpBiNUVzOTe6J7idVZi4Uf4QUOw7I4BonVk0Qcng1AgVRFoIO5sot4cs+o0gPMVcZEVEBLoftYR61ps2+4rIbbY0lRVZkP47Z27aF+l+72Xt+GyTvYpuHCXkDqE9cIs/YJGDs+C5EydHViWIZ9c+RKMv+tDLsTq7f/YCkzokmk7h00zXBcfqge5+qlqOKTSTAK9TmTclpsEzk74BANF4WKNDwVmiyv/CHqyTNFJJXuJbP1wfnBvePH8BwJNU76pFl0ZX6fhsJ2b+/FKNd/f17W6Dxs3fCup9xKK8gBdF+PDDHe+7ceI8HGpWGfZIntrBTkv8YINc9xMap0maDfbZS2kZ71acSnyqUsplQN8pf1nr+B00TxfHgqW7TvOeJt/aXAXwnOcEtJ6N6JN8Zt0nw4SmQPyqOxNGaI0iOSIq0Mucr/y0dfbMgGPdHigNQ4Pf4nAcTjNmokjm/y9U8RNUYn/mZRLFtiwbvXR+yS9SsnCnPWFU2+zrMpxON3saj+2uV9OkRGBUdDyNGoI3yz8xfYll2FrtIXxT9d70rT9DLT15Ciaih4UkHrJmriA8VS/gXHiAl97oSfDfKAspb6ESeQwvEyt6Trbjtr5F9FpxF8vdfh8YaAzauyrxFRc9sC73jVf7JruaTHIYMxxnn4AqRxuExipNkohhF81VeDkeJhbDf1j89P1MZ9cpA4GYvjX91YLutTyETkSU5XT2w3u1eNPv6vZ57OuO10zPWFt/Ztm7xwn2E+ThHQa6uL1xvluZNtuXD6zZ1qhqYRKnWFlwLuvlOlzMlzhpRMt0OyAqOPrmDmHNslnH2pZBuVcMYsZF3So6eG0tnymQ1zkFASdwE/6vqMA1JaIzVlxOndw0scrq0O6XMu+zZGHAmr9jWw0a954yBFnaGvNZKNYllT0IOa+LPqyeF2kTwawoEv485YyiwQh2EooIL2dyKy2M0ObWCbEZi6TMY4CGKj8I4o08rSc1dvFa9TfXbpUJSh7EbsUcofhboJe1WwwCpPb1cevUBYC7ocz8X4FTCPiTlE1jxXzjSEX/tPgouf5WmJc7tXI6iBCsLjtk0rwaxVQkampu6jZDkEatTeCl70bfZYu4rUidoUIh47Y3XL4siCOjjjeI4NGxMUnOADFd6UJ6Vp6oubs+D1YOU5HCvGl0Rlpo3CoF3DkPYTS2/4kB849Vl87wA1TT4t1I98Y1r+FJJYNHdjhxr1bDhuslgSIMPZohnZ6iANa3ytzjjDvvM/5ylI9/wL5X24ME3OA/tZhyYHAbNdcLEDkx2jWH6/mpdrs4B8VgdT641+BELBlnYZoC6l7BkdkMRjxGsSjPmnezIHurLgB43CD0zSFpO0lQpK2tmICGhBszf/jDI7CvAVKDPkxotIJnM4uUmyHJrBdvXp3f15i4MntAl3jF9fQej8idHJ4dxfvcXFNTC6XdLdfZ5SNvlsHEB//F0m/vj9p9V/OS+tauaLpDGrZNIx9WDurtOhrHDc32uRSMa8yrvT7gd5da9w7P87irFd3fI4sXvsCyVa1KpwUL5kfzUbxJIO0T56NIvFvOWFcFiUjlG82fAKyhiHXFbN0HAcyNGGqhlgeMHI2UZKhCOvHKdZkvFHFr3FMOyoxc0zdHITtl2HhJ486inQkJ7yzSN7DZF0fI86jTS2NnzVT7pmZ5HDurh30mvaNWvmYCwYV7V3QxgSQO46penGgsUt23QFoMTOJEB5e4hV9S9hnoPBzmywDL692TJD4qaNMx9iiIlI17bkbfCtZnVtrBh2K7MOptWNx+Y8KEv/dO/hE6JuIF6H3jQul83GjunpDmDOkcDroABwldVRzbOBtzjCslBijLxA/TET+Wo+Cp9FpO6QsJTH9NRAb6ve7A4HEVlfxvejDTKKf2q8+fSkuRak2SjKZFrdNyKFlFxt+ynPfUZMCO5kvwhgcCrMYpy7GqQEsVS630Ujaex3dD6YT022kBGouwqBSNznhV5fAZmwhHctxoalwy7hXQ/3ocaq7EYr5RusN8ybxTcnZB11JF4avQACSJ3LyImV/MrjQojQ2Ca1PATdfqeZJrTK+iSXsYlFgWacNQiNYDNkZ4mrzUKLDPKlS7S1+BtWWfvzZlu7+cEOxq9eycpFpqViPNuDnvGw/GNgOUbnPnr9LtRGF8rAScy5F27vuYiAl3EfQ4EEzK7gcWVMVNWnDdGVCgcdT7G/167eXLEt4C8vX/jQipsihzUfza0mpeNMcQLm6ZCgVdV0HUGufUIgPzwop7eUHHznr86uJZeDOSs5WfiMYNF/oeeTylkpkcBjl6HKU34XpGOmqm2i5avArrZDQgM+r8KhPBt85nHZ3LTaLXgbgH4TTpZzpkcBiJF9PMf9mckCFonh9FUwKe3lydmsyXRcb+jtW2bHWI7lCbY/klaQUfbvPEIkVO+T+5KH8td4q6uXNpJxCVzWt6rdYyO9tljGxEjqInbTKYlXzBe7mgp1m7we/PtWUbiCOrAKt9dwcM63sP8HJ6Pf3bTnEEU7m35EkbQW3M/pIqeMeyBxUwZVFM56aIhC3/lSoQVPQVUdYvIc5Mb4/pHcjSTw3YhoVJDcffwJ+TGWHy507E6ShsJxiBK0s9mNrgJcwiiN5FB44pubP+e9JOQN5PVilht9nvXIlaI2HlywQc24ewCQDFZqHoRWrMzyckvboVvY3RFYkx4xVqEb7bUpLKHkb4N2EiSG3yohD0UcpVK8XUt0g6x4Pv78m9rw0pex9wzO930BHcFXOkNjWnDjJMxHmO4YyRqYLKKisXQzGmaaH/PDqTIzUGpzWyQXgF/IqQnmabrnYpvnrZ0ikRxKT1qBzxNE3bT8xwXQlQGc6mzBbDsiDa5Qw9W9o9585RzPid3azYxYEfowws5GMjNkOICeMtddXACRDsE6jwuM689eBGM+1AduA+aTxkcycfWEtHBXv/z93A1oxise7ErxDodSjJgfHOBIpO+ab3+AYIMDK4C3FOOIVy8RrDtu/9l8PudAbtS2tOddQ6GAssaDkx87UXxq15VbUnP0ERERwKhV62TJuVrrhkLNfYTbNa7kz4e/Yj7NcGObBMDuGwWurysBtwfMCxBLvLyVQxuBfwawzdsukCWwuWXepbO7fWQWdBsK3Zb9mePX44Mh27MxGKfvsBfUkxurjyOROecsprrz+HzZR0+gTIuTcZG6u/uR0ZsqPIBiOf9zBUFC1uiV0RmjR8azdqu3z1xYaMac7Fx7I51gqA4HJwy4ZStz4fS1QXD8D06a+XPxXG95TeensL5ys81g7M2F5kkdIZiYo7zrX7NpvnapN0LbQU2pngEVThTuvSPHK9kJMbVDnhRSRxuVphDPgPtqFjf5sybR5cJrfyxXEpEcsAF7PVs9dcF+56QdfrYtHK0ZhQbwyac03ekB2RISzVVbRYf1tYhGTc4zSZOKIRHE/fw4V+YLm0p3KPQV3SWeTg6yj10TCTAkDgayB5GaeK2JIczkKY0e62CjYfRThBXmeMMOdFUNqSloTb+UT9Lym/RzGxoI/cEAgkqmUF4MMo4RsyPnFyqaZlaYwPAbJoICPJza71TUDsAo20SH4khB9CV++zmTdZrrehSpWZ9lWRgtjsuSRzeM/SCBdxmYBMajWooLC18JXN5ONfFnDLfqLDieOBCZv+AwLfSwE5L3mjvlG1liTkhLykgpesqWfNmbzCok0tv7jALwlazYaYc87mVHbaABJFCevNygFEHhessbo13JMoiLJm7JtVV5ETNMaZmVX3QsRFTTHFZWP+cQHLQl7ocN7e3lZ/rAQVXQ6IU4EEV7pesWDRaUuY5Ir/2rHNskN703wknqEcB7FbghPGp4Hv7ofk6NxQgJ028q0/hTKsSLHvTmwZZIJnNb0GHFmQMPtFM/rpofgyrB0O15OJiFjIHLIyu6tmMbn39KlHE64whMfJhJbRQy0Aq+Fpvcd/QvQWWpZng+O+tx2XIItnQfIEEy6u2SbJ8gdWd0qJAV9o02fc+TMfdNQn2doYo4JtHemTxnuXQwz/74ue/CxKn85/mGQxiLQMrjCZFagnRCrxgKxcKRrorPqv0IsKrUv2Ty9k5iOfZihZX7WUicVle19ZwFTAeeeZWUAlcXrtdik9lZRiK6pT32vQmx//Zb23aCvCPJV+JfY48VY+MLMUHyAx/vVFFsuGj+I8bEmI5FjjilhXmCgWiQN48Hs8TOGJ5klKVJMdW19yiF91C4Afz5mU9AhAQ6Tmf0bmyAzAQokFe/ZcjAYYzlb3BM1TwGzrtyQzRXcBCZqV5LyocCpXj9iNObI8hpz4UILT04Uv3rq/XHMdFnNGU/NexGgGufDQGrMTadbU97fNOV1d39BzCzEZ3IkEUX089hdnWCxfOlQd5QEYy2qrX54Qv8YQxdaHoraX6sa15ux8NN4zFP5yt/d7xgs8Hktxdw7tEYTeK5bqsujY20RlGArFsG5Lk8xVFwlPT6KQxDMaRpio4XbJdH/QMkKX5C14LZ9CFC9zxSeJ8tcsx/P5MKyndytwEodPDAwXX/1QNAy0bec07pEaCEJ2fIUzdR6r34lHz0NnXKfXzoy1r9bnlL2dPJ2NZBrYNJnNxKJ42qbSb7bdrlhfly0GXTsAs0/WCcJHEr4daPlAIrIQQ+kWzHUWEnyB6c7XoQr5gK0f9PinH/zpoZZigDP9291g2x7wA81SPp07f2kDIBrVV9HDZB7Dor6dMxFsnPzUNWSFsVg5JfO5fs4PjeAgg80E/XVudk978Ve5jUkWJS6VgRB+GwVzXBpzcJCKBEAQhcwYeZpFoaWJ/NBlBhcsfx0tXPX/LTwIKFg8BlddKl7j4j7Mt6X2G1N90iS9I14cVdIj7sSX0UzZKpZpp81/C2UKlMGKE3EXBXAjEBXI7caPN7M4qzqGZtfjczAtn0J/CPHp13BkBdLz9r51f0APsuCMGdeH/pXCVZMg9V63U3lOAy4ol89TecuRPrxuCklYvuv+cEiWE61pAEUTIDDSj+kShsyEutTAo507Q4fiiUQieeleOwVCnnV12lxo7/u1YCGsOo8WK+twhHazxThESNPgElFXVQgzW68wnDt+fSXKlb9zb/8aXU8ceh4M0DKAuwyHgSA/IpFdxGfXXCzfFeRqcGKs/RJq5/vELvAp/0zQb9BC2fN+dHf3rdj+dwjV1CSFdl6PXAzULURplZ72q3h0i8+sJvhGI0beY2jIrPKedYWibLZMt//1pXvU9Xn2I7ogwI26EILdEqbt9E7586sYopDAoIHkrdGsrfSeDOvFdLtaz6GnwBLMKrXAj3VHzyUGJzU0enewr7JSqIRa3gkNko1gs0WkPjOTNFj9rGgR5ejx8Yzz1YdlwsEc1cVumIF2uXyw7gdsHY7P8urRq6TY0jSC4PPOOvyC3M3FN2102//uWg/Lhy2yNEKlTSH8R1JESKxu0Udr2TFQY4HgYVQ6JwQPfjaHllmvca/R+ZXBkxGFLyK9ShPnvchd9us0azlZdfXZa1GC7eCPfTp9BAwgVeSp8XAp7eQJbgqiWBEMsa+aqpVxwXyT4/J0b22RwHF9mZ1UAFjtIe1L3/aV0c1b4mMdRANozJ1WjNHqyBAQzMyq6N3fsQSeUsPiTwWQsjYB5W6EqKMfRK+kybLnNKpXLiCMCfoPvSx3YMyjGxUbOz3bBh9TusQ0MsuJpYnweAD9f/RlnlUJc/dRqRHTEdZwdB+WqcXsDLSYws40hc93YQHqt/8EQSAEV0QzEymQEt7hM2pk3R0u8md4+Bten37MpM0AcbcKCQvpVZYErRpAh1F1f693r7c1bkUGUoLSZTHwy+VnBX6sovQM4T2yWzgdQTJ6/MUHlPUTYSo4WEgHClHY0L9lyXsdJo/J9jBYdlRBqVPEv4Hf2RoxJljON56mbX01VIDadfQ7+wO8cxgwtWuJqwma9WlKxU0d6yMjmq+OzSvxId9j8YIe7hE+ovFvHP5dDnPMf510khrXpnbEBE5HLdlS+1sb8iHbC7hyNxxTvMzS2EE5hAwx8RY6rHUd+L/4sc9/WM3VFqZpp1eXkNEcvyKle6FEbxR04BrS6+VGPWvTmogp3tmf7Ke/yy0yV7boZoO9YznughRg9bKQiH//cv1arOYnTI6pPbFE0Dibr2nxNUQEjd4lFgyvjQp/m9nmm32YO286fmR+p1GRqGs+YAE50lyeuJRF5Ql74rGDmaWMvu+uqKzOB4mxQyo1w0s39Y2Kp0xQQhi5CF7Hecr2GVmXy9mq1vNfAQKcrp2yEl5mggri39NZ8isVfZrC8QUJgXMlWhGkkW7oCemznIQ+dUdUOU3BGRJPOzbr3SiKl0XZfP8VudGzPJRYJeZaevuon4yMX60uKFMkYW7CVzG7G8fj4sryiFmn22m59RJo7vWPsGnoYGNRwIC9NaR+bJWKKJFd1up+W78RPhNps+hXWB4Y0TGRcmMG1OAZCUpkNQFgczlGh1UA8DqzueX0/XfSx6LYzCf44zQSxVbU23CQ/S/DHvFYg5EcbvHBRHTQfKSpjQuyVevD4znmtLeY90CIzd2sNBTT52sKk6cXU2aXwfXMrZKn2dn7w8YM+lvOUcBYEJlnPln3kbvm2Rrwszpspqsb6/69JB8yEqqpVeIHTWqc1CELlz2T1CqSpC4Tkh5eUUs2SY9JukcxdiEzaGoBy7qyopKm7c2OHq/Sork7mbtiy61cF81vWbdqhUiRjobFE0CF7zibSrgLAb1/bhBmcdPu2ClkcaCfusS+uno3KET+1rZLXPpJwCirEQTolZaGy3C+iPF61qfBJt/Uzq27m478c1WmWVTTRDJAEK4t0hip/fGczLO92ZeuGO72LdHpFeNSJzwtZBMtW1CCw2juIUBD+oDKyK23Rj7rphyhMuH+zrHxXTOLWfRshO6aK9G3feCM7neDpDjzGV9yvP9ykvI1jOyN8mc49DXkNyY+yemtEziJIoZXK/IVyVsMu4mCHSThc3RAJGKOOVWKt9kOjO4it3QfBCTyYi09zO1gQk3bFenDBzv4PuWi7pCHX8HQvy9tr3hssesT/EHCSbwPrzpxuCHZj0vUMZEmkiWUQDM+dNr4REXE4y+TPrIgImQ71IKOlAhXryZmDL1NkHI3hfVXRx3pS52FsCx5p4SaouBnUtsQO1MOa8vryEkQubfg+EG9aoeZlWi8iJJU7W7l9X85dmJfd0ywgy4DTg+XF0S4qY2iY3o4m3sIZSF/YWgdxY/xnlBOIAYPOXYe7E9p+ewGYmjVI7bu+uyqHw0ZOxRzafn0TSnhD91BAo9nm4IB7qXwvG0P0XHEGvXJEhuGyiowgH4uV5D7VcOddFhc/ebvjn598GoUMER8VM+3NpiIxwLW7IreBpocg7pZvrk4FbuY75/YkCmhhjkFRYVu9PI07R6oF4068RZpQhdB0sxCa/cwDeNThDm0XhdMHBRae5ePW+R9hDcG/4ZAmYQ8FUZAZE1Gmd9OWKhxkv+uWrDk/UulM2vL/OEGpCQPXuW7fjgiw5H8HxK3dyVk6NJkyK8Lc56mI0fDiYP24X5dYLRU+pGaxtMhLR/GFEZwIlsp8jZDnwfrDZSWsRif8FWDj8E1SSFrMVh4tAZVEhggl4f56+f8xqEA6pvsCdD/ioOthekWq5jwEPwF9faV8ivsIJfaH7a8CUvRIy52aFXqo6SG7Cudi5ROnnh0IpDcdyPIhEPcA0S/3Mlhernf2+YHSQqtg8mnLYUPXgwrryjiwzf7d4q6qb4ZqwZ76oGxO8LW9BGxjSA0MQE4TQUYPFX3/HbJjIC4oZg/koDS4R7UylZnqs1LDkbn2NItRnH4RaRUaKZFwh5p67piVJU5DINIS+EVKCzdY+EPXNlbrTJ/nA2hpAcaIsntUHO0/wHrJqI28nbUbRvwJQysL4hTpGjmTb2is4Ews6Y5k/9wNxOvryjBANgt7B/Y7BcSx85CRMLAbZwf3dS/SelQ8tK00fdgK+2o0/wMhgFHtENgCVjJYjvRWAa4u4/Le9tV2Mt44IB6XZOzY2MBkgFNUPWtOk3/DYzIQ/712bTTK79QIJqr7wRmR8BKeq8U8UafYf2sQO2k817muFMa6OW+DVbp9yk0dmjR4XGqf2KIYFLm5aJVddvEOR6JeTT+v1Zqe5uCyEg7UcfSeTx8s5xP50LZ9ADbElFoau/MBtlMaR5g9XE5lKiwQAh4Idjf2qkb9jeXQrXR7zO+/bmNmA3GtEqDRdJMemJrOT/U35Gxg1GWra0pLTC8yeiuxAyWHVCpwssRmcz1MSmo8jy0+jcTKdLUuf2iqTlMLBjqDX41YUPo58oOtBJrMBUHknUoXSfksG8/sMvRlaSfbSxl1BJuRnNVU7nhIiuXfrHPPUVOiKYQ/j3KiPVsEwgq3KLrWbaD7JsK1H7rBWKPG0MXTS6DvZvemGbR8Y1UOwVeLUQT2+92mwl8u8cieBVUEW3L5EvoIB/paBkHVJGr1PJJ8SCp4mSHqJ8UpoEk65sS5lPpqqDtoOj8btG2lGSvekWtZjIXQ4tLNRhzrk4gM6nzbwDjn9vftBA2zuY2wouZ0nddPEtXaywoBe1lBsWld7P0QudHWBq6/Fb1kRcqEde3ehrXaa2ZvCBCWh+YeCkZoU35+MMHvK4xmxJv7Iq8PmajJ6JOy4hIlD7pFhckqzjCaRFtH9xeBHP9w0syhnMi1+c4BuRnZATGT7icRfIsaes5ms0uaNJprUWMp4XtbA+WlVrehDrw2IUYP6E0gC5K+f8cCSWk6STnp44AbF5gdEuBDW4m6GzWLga8mZ8ejLhJDy3Qyw3ai4uzxjGRSfAmTMOj2yuwPTuYTh5hXPLatLReN3iwczDE5Cv/tUmpDrC6osoJMV000Kh3WQZiCYYcNRJwk4H6v/ByhGOQQIBOSXN7JnA5CuM0/9WGJ5VlabhMmF3+X8eBW4zNjEqbiqSoYswA125eTYIp/mNdrUtt5EogZy+V9MfhA6OIOFyz3Qxi7HoXOPz5BJJ8t27grgvaMLnpMXSw2wI7CYXlNVNZmle+NFNwr+RXNaOQHjrGuBIVvtE0znbKRBhAR+L7LsXt7iQAqZ2WQr3CJqJaIyrO7gGhTb/YT3zHFMlsjkcsPaZ2CAeWd9jwoCzuSca8/dDsQBdV5isgs+58lzkTslHip4ZEhZbcwtt+IbH727L7uWVfu86Q0fD688b3gJ1hkJKunSzYz2i00br8aqTUPx0TGIFwFR82QpfKYIV3br+/t6qI34dPejf6fyWXMlJkSyPiZcMvzJSu0q5LqjhNWDvgTRNaJTRuUq1wzCb7Sn22s8dzib/gQzkE606Nz7mooIDuYNgKEOYwJnKZoz3ENZbLzgiimBaa6ap1qdG+ekls5j5ZO3sG9p7cLs05l5lCAWAXt1AP31FsPhHAUuxLMU8OxcTmQwjbS7VNVHyKOljYqbdUb6TArcHF/YyVc+iK/ajnB5AwO5wRP2b5kCnAgLxaFdCX3kSak0d8h13Awr6lbyqMl0onM9mFbNHQxQlxgJLjU+fW+2fs6KNTWDLoyLalIQ9n+6XF71v4oAhR2DcqTjw3EZy1BNKjY5X6f3oY8I5yfbCzEjOsVbosz+iIgXvKgzm5cpj5PcLu0MNEvnMcv+wGK14pPPgnYOU2MUxoxqTIBcRY7oLxorMYnQsgJNol/FmgTAWeH17eRCl7xYQxdzcz+NObgD/aF40O7Pbwt+/qLV3RGWkDDsAGcXEd1Ir90CQHC2v3ugg2pgW2u9g8wVql4ndzorLolHX11xh8f6jteWpYIwRAwt3Y8uvBlx0aM+xlPBdjKBLqm9ml635KApk/KbKL7kHaq+CmmTjhbEIBEkMvYwnqvbzp8WSN42nzaI7tt1JTHtH6LGepmpXMfg6aB8nG9pY4xyQT287KP8LZlUBvBeuMSVJy0/xvyowdnaafoc+vmZbut2I1Tqw2pPLSySAKNeYzJIlVzxRv5UsPUIz8xJwqMiOblLRjv/fSMnotE5Bk/B6/QGCUC7k3wEXlgdAY6JzSZEnKoyS+L96S4d/Da9VJX4RfcUUZWKW++t7g/jPY7t0B5SkZYnX/fjl8yhgVwEIH7NGBbdIimzqT+p/t9OJMi6pUwDJsJOJbGOc5CoDPp4Dn79rb8Idy1Kms0Ou0INxRS7sxrqYJrtkdlMvL4NAzFgs0vc3GshWFTWD8GsuRYIwNK3iNDaHqfCjCyVjBOreI+uTiQA05LWGGnW+9vX4THMnRbE1raYN/gYIiUiBBypaU1kX65vgK8OwlIdXbLaqVXsBAwQDUgGSYo7XcxLWNVuSg2p4CdFWvk4W0Fm/E4nsVr/jywANykcm891Ko2JMds2W8Yy2JhhAOWdy3ZZpbUb7jq9ESAzYNgoukQ5YDjdc1qdy+3EpI9lOHOQTVYy7P5sTidl1eeHP5zYP2WrFMcPK05xYWJtpok1W/sqWqijkK2vEu5NhQZnuGzdG8hBr9b3J6rX9j/RK9ZFQSfhtNFm685kOFZZNC5cb/7ynJg9n4uJWhYry5ddl9icNFz24E+w6e04ZOd/ZYdhA+8IljLYpXAXAxq+UTN0fTduBHxvJSxMlSGf1Sz658QlvA9eeXFDfNQfnuNFC6VG9hFMF123n3kI5lmB/iiBfHqMjMyopWc2ZbFz7I6zmDZEU0Qh6ZCYolnUBUKD2PnWGa2jhRbh+VZ7XQVSviuFvcSCa6ZEqrfd0Lnea/tLEu+6vb2bt0NxKIwC3dGZZA7QxxY/uB0DjcBLeeWizuz/tRC1m1Qs4JcfHfpEO3c78pA5C2xmCBnsEwz4N3OkPfilJ/3+m8p/r6T0GQdOU4yzgyZj6pnohWMFcljjSwuTFghHVOOXov0/PhWjib1iDjriDWfov/Aeh8VjC9jlbG4+5CwPg0ti1AmE2KLZoPcsIpN2LCOfPWZwSXb+7j+X30ebzlx+rSiqfsWjPHDq54k38jZct7AWWUz0zATds46VvaK3aqQKfwvz2kQw0pHtZd+pKq6sB6rMEcgfDBv7EYo5Df2opgYEqufD6Vk/nrpdOguCZ6yVUxZPAGVx44ZfMDaed+MZuFn1rdQwg8ZObMg6C/bHx2gb1xowMmTfWDepkGbxYhlRLSllJxH2/968mbn2rmPmPqH8Owst1eincf2cEmIItYWYAXr340y0YGG/Q6/smf1GLcBxSNKlQANH0XcS7zNa6pplZHv+NqS2Wf1GH8x2GiBeowlI/cKjLulw4kiSytS7MdbvbFHIhh8Lm+sJ4X0Ubopwl9qDo4a4PckaMeYX1IX8dArzcJiNOFDeOs+SOMW7jZ2KtGeF7dZNCf15WEG9/67VLZGDjiFR6RogK5pZ1TKqDMn3lhzfYkyfqXpaphyliDsrvuZQw8O/4D2R/FV2j/6bopN53Yd51aQ+eEgi9bKRqbVBjGHVgAU+UcD39NoE3M6a+23/+K6HEaEQiwiL3t89sJ6H6YLYXCEUlL1bGRPiVNqOInH4XthiTf47XXlgJs7XVbX2CcExJQ7e0dCJSuG4Kq3+bwjJLdgkVI1Tpjgeq77f2QMeX7+zTZN+jVenbr1jMGFVE7Xi3YfTh+aH0t/ecuAd9Tp7sbfHyQ7mRlqouRl8M90NzE+inUJjTA2Em531R4VIG+fwMv05dgJ/5aQ/a+KZ3yN6BOdOh8zcIZT8Ur0dHDnBfT7rtOStgWMQNXIGbGNzgr+s0JNv305oCKaxSBu07qJUH7BhbuA8vEDzK/4GVd1PDjs9ocGP+Whe+87a0FTWSr/7wr12GbTkl99W6X/7/Minhmt15G8xq6BLVYj7uDkH+V5iTGGiaeAr11RMntUVS5TD6xScdGdhTlPJSYvmqbEFpGVt7mA3Wwjj/MpXCUIiMQPnmjzOfs4DBPm8je2Swlzr+01jBV82RPAs6onB1fzhdTH0ohjnAvuCA/kv56WZoDvWRZMFyvJlt5REE8uFrJaBLh7CXVuIZO6xyhi+lceMOILr+eIS8/GEfvKaHMe05HdVeXbWYac7jbP2zb2Y1e3KoEq2X5l8gfh5okniw9yIQN/aHw7FKuTyBwh8KU4QdU6P02V+0vtW/juFPOuy9q0sg6kGjO6XdqClOvD8n5aa4D5ywbn2WaLzV0Zs9calO6ud+AlxZZ8kGlhx1k9/qXDahmrWEWeuQbvHjv32SLDggmLvB5ZiKuUSo4uz6xLxlcbxYdIHcoEEVBeKOes9qru+8tmKke0NoyCJPvQaYXm87h1wkmB721UbA70umgvn+pGtNjarQ7Jk+Z8lRnd5MP52gIB0fBocvoDmz8JxQ4kfZ8xMJVqmuWCt0QF9RouUtvvJP6Q4z8W6kaNr4MCHyski6HlQOO+cCl6mCMWLh7hDOsjxxgqUbLw8fsJvtHGFr05p4dJftqYdoDvoFjwRdjifiajqW+kfU3xbm8qoNIjOvHWCwtYNBxaH0PwqV9TTlaXS0DR/zWKbukELgpWMCVUuW2Y9OG+McSgGQDk8o/wtMxMiPSPtqWUSb0VIhJ3fKhmp4iHkxB036iBEmvKxKrv+1xIo9pVtMw1sk+Aa+xKqULIk+nuSq0KMUuaHaww3SEK1gWq/+/0BdRy/6gfYLmHa6Ye5pdpXdJhH9rTKgyuGxHLcrloiDkUzaF66ND3fkvBAqhTMx3aRRoMv4iPaeHYnc1ENoiYZJ3g9CuiATvlh5M2/kQCnTot1PA0iNudu8UQz/4F6ODu76rZ7VyUcVYyxCMhtuRdL23BC9lLbH7HdhAxjdNOd1bnV1dEvK/vJSsGWZipYS2bwQC1T+SbdoZ5KCqw9sjp7MyipcWTtSOpQYxw0FYC1XmU62AsGKswV3R7NbhMjOqwEg6Fhs9FNDCigmXaPeAtBC1ZpBaRZPV4IIH6BY+zTpU++SAWHQcsl64fIRwg7FckThictguIhJ8vupP+wKzOAw45z5mYuydJEbDU8U6GG2DO4IrDkF0jyBmYG+XSqKlKiB67+Qp5NoNaxnstIlQ5/wy0y3azJl06HiwGEYurexij2RoHKEUkHOkZjGKNsrxhQq/KXm21wTCc6lZvxSP8S3p7Q0rlsOdtq3Uy4li5gSfZXwYHQW+FKayRb2WYAIlG8o5u5MDpybGVZU3gAAWI8jteJgfrT9Vl2BDw4hXs7c6i4V+s1bvwySR44hXMbfDO6/IFc+nX6Ng8WBWrK95QO4dz11Xz8qX9XmpXCQLR/cWQV+Eq3ZgvQPq1jaXuP0tADkclEyufaibSi2A+f6syJqQBWudFjVc8vNuLu69w0KvZFOErvGJsMdbQqp5QhEeuSSwwTSti4DBa7Dh+Svh2QBTHvNshauc/+wZ7/Jrm6zJNN+Fj5obd1q+ZonjNqeUPQ6I01zyX8z9qGBovp8sq7RClZkUEu9WCA7BTFwTz7352vA6UgFlF7Uo7gTc9zsDxE+GwPPJbw3cqrfrFkmQIAA9qku3Te2FlhxUy3FLCQ1aWl1XubNnZaE6jHegdg6DZtsVU7bami6wBt0tg4Y2ZMzdABPstD9PuccEmlgH6kjJvAap0g7DeIErX3n39iZbSFBS0cOwvDHGX4TC/g2vy55rPkDToQ72MNN3jR+f90zUqX6VcH6YY9qaCXVQxAk4OZof+BTaxl8YPXMbq2fywZb/xDXXWrQ03qztjCylbSEqP7h6jqZaaS20wRHl0M1yriAseP3zk4x6ywHqhIEiEmr9HYvB6f/i2+FyEm6kKuQtlDXGgWSc68cGuDuMjR34xpUCyxDvTOKVvz4E9sMBMIQb8FOqI6XHVf0wkcagD+ZGBGWmIctQD6R4Jvmu5kFcHC0PoM9fl+hwL6BmGbm+C+uVm/vh2r7Y2wEgcAmZrT19Jd/61gtolVeViv9UAO995N0o0PRuiUg908QF5JLIkebp4OTR0DBSo43Txchi/jh+RwlGs43Mm0OzZ+v7hylcbyzOiZ06ipX4UinC/gTCqx0v1fTGNL2hQs+mSE7j0miEKlHO2Re5ASCkcWtUy6P9SW76rTsRyHElrRnCBzmDNHMFIecwjQHeonSDtJornXmndZNgY+sLmuDLA5TmbSe5C8LGSBGIkGZkof7ldbEMQjkE2T0/bxmuNMC2YcTn8zIEequBtVrmzo99QCziKNSkLCtePSl5bXzxdwRAKQx+IN4PuRS+FXoDVize4Mo191fJts+L0bzdh8TaiAk6bzAAs/5HFCZBOscDs1oTUaLZzRxX3CFnH8P+hMud5iNu4mfxZqStswvdG1Ec3HdvU7E6yA2s2a1skjYLejyGpWkTSbVBD2vDfPMB6J1LoCR7S+thMvaRpXYRu8wwL+juUQGKqfW4wgYDJffGqS2B0gps0fyJDRNTZh/OfbobYF7LvtuDfJbuf8tIpUvVa0G9qe3XpH5RjDgrEjE7f5KSKem6gwS3lcHDXsy2nHiP17FTkcUEvs2wG0W75IwD8okTl3eOcUYNFG5dQf7pd16sLBOyAufERNQmSAVsVqHTPg5yaJENMeYnPS2nMeWR7x4B+86qtsnLB26dpec6HkbMZCrWJbMwoBMljlGUTfJbope3+pWKOjx0tZCKxeXUlA5A72aPbtmyT+4BanXJzFdh0hEHQeWDYAe6fOD36rePIjOVC4/DzgF4IliTSzu/3Nh0K4sTlBZuBGEr/QXyHStORa3Y9rQ52ovZxjtfQiX/Z5Mpian3D0oo9WhTux+FMVv8OsdLwkxZEgaZsCxNYCVrgcFDlrnfdTZX+GbWMQ1W9g8DWAcnSKvavi/EBpObn2zYTGaN5MJc5yqR1vrwdT8fvcpZrDOgEcOfmMrA5Wsxg7QD2RJ9v8ai0mvKAGV9FTMv4YTGclOXDm29FbHfhslTJlhHC6KNtVbic0HBRvedJ6qfpvNodwm+LuTxeXovXCwgM/S9rRVyl25w71cCQ5M37en86WNVaVIqV4zVxSb6mXH8hX00IpUxb77McvV6WJGt1blm6mHaa4KmWIlN3XxDsIkLQt8EaRbJ+vdT+a7E7IMe8f+/yPh4nV4Fu3AoNrfdkJkx8kK4X8oQ7oKppwf0LmrWPdeoUs0RwQhozCFV6hd1rRENuLZusn631mmp2lCfLUE25wyiNGB3p4Jxc+Ta6FmRYxZqlWblcxM8k8AZwJrJYymV40OCpFb8O9mq4VaaSCcIhuIMYZFZzVpMYJoqBITY8P6bCxfBP2quD5CZu/FMOJhdmS0IJsx/6O0yJxTEOeMfg/7MUgvE9hJ9ZQ/b66KzDF+SqYW9Kr6PLBBfQzyX3GEDfqbP9x0XIY9Xoctb3NLIkFI/cKRXcT0HbTVbLhe+Q1DczsMhuNRdUgZs2PJ+PabFt7ovAEmJSPWFiupXCpMdd1TjvqngBhBnhysO7V8jIMgpmkkv40x3Wj+kUnJ7sG8Qnys0IpBC/2MbAe0d9wMT+dbIxhnFwrxWSnvwaLZQ1S/e+b8ezasu9c2ivxRi288VvmXXojsn6axJtL8M9tN1rNJp9rgp0q9wCAESnDO3rqDi6pxfGMF/CpWYeBCefvHdqLr8lP0qNm9alu+uS3mYK+Cpy7wJjOU3gysPofNwX9SqbAhWcDT8ZMB/gcqSTjhivz44U2NUg+Q0Xe2kAi0wYJbsX/YRt/KXoeJoMXrlEUMqqpQlndzsWmBKqjTsf4/ONW8ep7r9vlcvn5sB9Z0XRzwan/wA8W3lBWjt/NVPSfedhrjoALtUTaziKbTp+BRBeDYjCOzmxd1JESNeh+en+Q3AtowQGExVguSsAriPgtq1t25WcnFkGkItE8cvugqvh+yJBGuMMWSCIT1+jQeRc5fiHHxFo+pAJuXwQMNrlpI4s/E5gjlcU25TeQ3aB8PiH/AC/yFIs27rjJtPtnfuIi3+t2ijeXXi2bUaPpzoSQ+Sus19lQ/PBBNZVvqsKJO4X2+lNQjR4MkOhZIutMLiwzFSIR96dheVOrSXkz2y0WxtlYA/RJ0diEPcHYqCTzjx4Z8Xe1CyFmZd05D0lp5KMydgrBNRfiLW2+oKRCE8lMS8NPpRaISeAllMkupFEU1ZlCOLNa3cT1zp/USl2mFDVEFluTKi+D+VycFFxeFzCu/LQSYJumKspZcJmb0GvVAz8tjTsykMTHqatOGhppM0MFaegNJ/5iDb5og1sXipGwcElMG1OHa17deflxTS4/xKtfX9OmfiDy5WLKNd7Yt+BprWm89Z9iOL9fLahC8+MM2twCnj1NP/pFgd4kvMTV/WoeI8I626FNv9+uAoCkhZPlDZouwZZTkPdjBSys9GmGp1Tf4WyAxCkjQ2WO05vxmWq7WwvB8qajNrgz6rtwUiZ1whnSoLGcAoL2ZPJMc9xdUuUrlM3wvzBshP5419aYhSSy9a2EmBAmQyzZ/fVVtQ0IR1n5y3Y7nHP5BtQuUwxCKyCPnK3CBCrDEwxZnlEpyHJAKi6tzbHMUB54AszbH7hFPTznjzkD6iWDMN0OC1nYPuElesBsMxG/r773zcdqAQCMMD0slCbQFJFeHfZyBa1+tp3ydt5SleU5CfacbqzSkuPqAZCpuANv5+ucaeCv5RHzcfzpAt6xxIsRE8/iBLDzeZWQPweto7M/HAEzwDP4mhIjm7Uj2kDY+BdkyhIXgWoNohBKtY0OJXpKykF1CSkde4dfEZ9SN4ocGl6AV9moMDbpnbP/RY3Ej0LuFlhPBgMYtZTuOzw+I3xZe1sc+a+mVZ+A1B9j+ptwfM/+Oh/ce/cpLFzwVTAfPjXLe6VbsvnsJUGe0l7MwtjPUE0PqaZDPo9+Veo8sjiL5sVYxJx0ZcQzT7K+412qLQqFUR1j8gjb7l2NY1sGPokQou5BLwtjqTP/pVIPs93DpS1XLWQF2+SRVEJ9IFrTxWau2I5XLQD9KregZ8uD1rUtJ1mq9gTPvgjQxY69PeGL8IOgkDAJs5nhhxZp1XZ9pIyDVzhEKCyEuynzKwVlY/YBOce+xDN/aMUE2JvWfAFWimrjyeh10CKu3VOEYD91d29IeXUaPt2tlSJsSw1qZOpm4DrZU2hkfDT4d8IA4JW2OfvXKbdG4cDCoqYxadfigTJFT2nGZOdtoYxW7BLrJJN9ZNYWGzxiH1cbsuOd+A2/gq6foB5Ib3juj/PXQ1k0+kLb/e6uvdm2L21pzeZgBEZlSmE3tYjdrdpvcmluGLG2S3LStcdlu3rnvW1VV1YQrwAOYRI2Uxkvdnc2XW65buY9i5mI/9oW+EAxzPBVBeXntCELNbXRc+p3ga4+YZW/ysRMf8xClHSAugqr+ymb+stS5wRjBs9HEFRNVfN9lxNS9PNeM31jEuXVQuAjPYDzL/8yUbVWhRW3o6VwDKn0VlvPMLDnpkJ9zHzMOTTDMnBQalXeKww3ZXUGIdzWVWTIdwuLOj+kr8bqUfV+umRrHUKM1G5P5hRqsOGMvtqEITehw5BK5697KL2q22htHEJ8uZrfqgd8kyFNNrcI8gE2aMn9QFbAh7INfTh1zofqmObR0SefhrELx7ZXadgN4f1faGS3QUgankGEf6j7PFzkFL6x4dX5qMX9xVJ0od+Ko6nzPBFUabnzhLFSH1n+DA3tWJU7FJ7ln5hIPa/sbpXSFpitEi93dQvjMh/pIsi5yt4SBYxgLkovbcWL6hb/AcMYbu0fqLT677jDEuGzcoHxsXG1s3NcYGCNORwxcsREhUhXWOZsyoWOpPmb5URdAMjJ2Yl6jNA1j120kbrg0M/sfXYRkDImDOGqStKcD1Fsk+nsE9WR4PbUyaa57KIgJcMja36K4YzFeOeYpJ33WHagj2/fnXX5waAJd/OvyejqfYuL9JPVwQ7dshy49fMkufpoawxtLvJScOWH/cIiiXxozGR1IpRwpXV82SBpV44nBKgadFNBUMGSEunpdEF0D5tGhNTC5jvySiqLllhUb4i8zf5MIU59XpqjpEVizBZC+Lba+E339nulYlQguqzFnZA+4N2sBLUnvEdhQSei5ZN/dRRzxogmw9o6WtVbNlosgsIWasuXa6WgmQBLBNgS8DOyvVseGVTRcKUT8MxLtSbv2dchPMfvo/+OkggYNEF3TsMPovpwYBSgtVGQo4CPu9Bpj+1cA9N4PifxwN459aS9RFahBTdThMZ9GZLC5ocUeckli76cEQ2cKqBpzY3B3KuF9eweH+3Z2BumlBwWtA1VaDgtCAGrnJMMHAuZgkWTQEzQNv7J/c+7CbSUns/tGp9mp/5dPaEcOUiPSTjMlz4JE87abv5K62dUap/pOBKkBR1AJ7szrI/AkLvfMX129o3znFleXYfexB6FgGlLbc/He/5mD3TNzy5f49KnAuG+qPCx/wN15p6C1ud7ehnsWUOtr9g7/v2v6Kai0VvCgxS1kyohQ+N15hDcLoEQT0KH6Xi6oi6KXh0fIS5X8QNwBH6M9MxINKu5944Rckil+kbUh4+giUhn9yauAjws0tshmVpFibsxLvOd+c0366exk2DdToh8M73axiAq9g/IBwV9jW+V+K2dSAwueZeHkIsFKfG9otj798Fn6YZhJzia+/5QdJobuPJdat+oqZYnvC0r2tZi6mYkML4aGyBCvzPoJpR8FLguIKV1dSiduPFM4Nk8Xzhl2PM6AQhgjrvB9bpboOK+ljGTuCtaxSAJQHMtOTQLPlh6sQLGjOjs2V8Kg/GF5vV569lSXGXtyP8VuW4E92QkB4Mfj2jHE5UufEoZyisPfoP28tmjWN2q1DCYB579Icg880Mu0rCVDKZ3uuQsA1i38HVRyjq0Z2sxu10L0ZKlxU4TGwzB/nmO4t3G4ageMEuvD+mnpSGVzwoj/4ena1vau7YyzK1Gee2I85jJsSLzblA49y8rN+5zPtmEOoi5tjp7jBplNVshqf9S4L6WLzHzUl+iSJmkc7DLg8JJN6DBypvitZUPujAr8xSch7KuqT1A5mAklPGj6/pUyH0bJqTKE9JSwfCr0HbPyvOBWJ6yocyKdf0ZYBJyBoTsZSiBFFyASXyVD7frLJ376BdrXDQhp3b3TtTfjsZF26bV6jS/BB/vQ+tIFVUYqbqsxDd8MR68sQoZG3u/OYLZkqhFUWyFTUo87zI2WzBDVOIjkIu5l9tw1rWRvKokOQkcIaLXkiYQV0UNhFKP1OQ0qiRT9yl2szUZ/PrqHWOpvr3zs5rFu3IgZpb5f3otMkjlBKD5oj6ipjjZd9cuWEsDoe1cgIUOQ8+tUuSmh3OXcnvdi0JFUCU5+ytNGgGJh6rpaA7SLMeC8NBg7F1o6qWwStdXZUgj//RED84jsLwpnKEEAptd74py4j2q6+2VrIF2TNQZKUF1AM/mi/1xQPTiaSGPod+/nSx3ky9f0RlFZnwNiyGxPoc7/iKz5wZqr8BsZ1xFCzVlD8NhtvdUXpzQKT/Jcr8LkP1vxxOmF7ATygvjLa0qm6Q/yR0ATYrgZNUUuVPQ0RmWkMJeO/q/Y7GxIpaFstCV00bb7k+PC0R25rzTF+180J0WjzIlwYJkqvv7+Z1iwSFKNx2e3ztotuFwfaZEaS8HTeATCkJqE2LD3b155FbVkL0XfUhzOMd6FyDYh41jS2tlWIx5+ea2BbE7arNf98wxLmKaffFkkt5zBrsj0gKQSQQF88fOQfOMOmj2kmUAoSGSut16nIF/kVo5vbMOQizf6WEU21HbrqTGKfrhUmUjgcs19h2r8eXvxErnEQ8oQ2vPb4wk/HMz2piQNtL5Dx32IkcD67Ayj9ECageF3iu30jGrvUN1zspPBGMrY8UfY90iqzZspkcxOGQKLTyCkvbd+OrE6qw7ZNlDM41VDHxskzAKyTzX1vD+SFmMT8Ktvfe82yYkwlL+FjERvUw7UsEEIfZ0OG+/Rzu+t/T+S8M2VP7ZdtMF4Q1Hv9p+6S9/zZCjUplkVzCIlKrPHFIC9P2/bNYknZ9np2n8plooEN489bqcVeQi9Y3AU272vnMkshbdVrwLCt+AIsMghqsKOZWv3kHLAss1Os+41BBhZwoogVRQHCx6d8r2fF9bW18N9wwCh/ElOzMGc7/MLIeUAdS5TqT4eKB5x9unR+5yElpdx1VZ0aWb2CQnHprPz82wIS6+9kI5y/1jqwZfhLeGY2IEcCTzqaM9btsGl+cqxPoSQ84T7rEP69Q9FiEwDLBY9L1zgaDdandMCi3AGjBVoIzSmGOz1VP9CssCaCJ7Pg7hLcTniP9bTdUAg/lOKmPkSUJszpgUtBz9oOxtiHL2U/Zx60n2i/I4OLy8lc4O3U9U3X4hzu98ZivRbmjh4WYh828J3WCrWt6e+7vgcO0U9bP+hDCKbYinACfQ+WkWRQQg3SulCnypotiIjOoGz27V2xeIjRC2cQcueyfJ6KMjwtP1fv/4lZRolisI7nabUq+2Np/4jPajWrwrJO1sh5dbIa/73bex2h7az8iI+5wqR1hp8V9FffwXn+EAXDl+k5ZlMvANElFevuLFTlWZYGrGJDp1sDCkdSPOLh/EFp7xTpxhCkH/S7y+NbRsbJtKX0obzm3CrpNapYlpR6J9u2pEGc6MjIwcYp2oj8J8ULWOKdNmn2V0GEvAqsTpGUX+6kOwHCHDDUt+40YYY6p417arRfAwuPUKyi9U5UIG1aU14McXBN8BbfNA1Jc6D8NGyCaOxo2O39HMjsPe8zqUWwBp9+W9fHffvPHaSX8fLo2enBD4gmXFB4IFogRuxj38y/SXV5PwSbHf+M8mN7/JKi0DcNLsDUeXllYTB2cTvp/cBC2HRDHEli/qUFsQqCe3Jt8D8eEpMqJpG//34H8o3wnsw7fVqpLypVI1OuFuz+Mkj+471wZd4GpKNL8wY3RpEqQXGqcfrAnsSbJdFz3ExBkTDpyF8NbUhzQJPUWTVoOYSelW0FDwAk0L6i1lHUtgOqIxLxCG8/RYKXDP3xN/ATjRSTHUg4vtyIibnDq8E2CxkX+QCm7yXhCCptemOJhifgn0zDinXdCTQ4IoIshSHXOg99VHfncqJ7p/0WklEMazW9+B10E38oZi9SMZNHjEu4CXWIKiJZdCm4O55exRwx9Q8i6N35hloJZ95z4zJhla5vo06+6HXdgSvsU34Fp2WI1IEnd/BdXgIiCJc79pLddSDU26mxSgPvmjVWlO++So4bcYWqRbnJByDtGFNcpKPMshHU0MqbQhAFWEeDdyJVC08GI3ZAHdpbIMXHrOZge6LtRjoao13HUe+cdaraCoLMI2fObjuks+VSlsa3EGk48swYSB8gmK8oq04ygPt7VhsS3rs1w0QoQeKYBsyXN1vBOTHdQYydOgWr5FuoatOrrQbR758p59sdFjp+WySrYr/JuD4ekgDXCIdFtcjFjHdFtK1Nc70s+R9IpJapQVDYpu8GpYZ2rh8wtFOiI5FvPrrkE0r+0T6pPO8/iZ0AOTlhko2Me0h/mgHuh3LX7JhUHZ9eWUpxtKJWDdKESxom01INBGvYAyIRT4ZRumN+9bt2/fkyzr+B9Q3eI8bMxm/w8enysdhm7wSdybVyOHbvSak+AL9q0OwujcOGoOLwegMGO4pzf4w8pVJC1VNMY5Lj9VmkvNLXdwcEYtcUi6BfCVOxiAb3Oj4uSmPj1fGGL/VnnJXLXiKjHu6rIcNyiWvq2auJPdYgTaE9REBfkyqIg4VDdkwwjAzrAs94707WYa5b79GgeyJ2Af3fCyfDX68euUJLqaayInHT16b0fRrrrHOP+RUL+2h71A/viVuVdsj2NHoze0qUjhrsH7jDw4AAO/MyIUi3lRdOYZhmg3Eh99ffv+xtkGl95UFa0pCXNA/k0ByjHjb1CXH2i3Ehe2uqFYitAy2OItwA40/4MSYdYxHR1WrXUDYUx/XNGpBvj+SACtq/soe52SPMQwVp9LYH5VhgVmJty6L7OdiaD/OHJBtOYgnxNUaEhA8Rf5rXPx43KSDLpEEp/iNZeYfLQmtzEPt/TR1oSx6ijQbPgi6YVflvf1ggtlTOYqG2qdiQbcvl1dhzqJrstNxeObSeiEjZW6cD9fzRnyYmMcCkB/ifJtwTvxrzBJbu0bE7a7r0q0uDtdkWtLrMhoA/IBS6pMc8iK6hNd0luHIXKe8qqRtBin1VzuyAx8fzevy2jLEkA+o9SZfGHgjilfYD2A4ZX3MX2poi2EGSTugnCgRt/l48YwYuZAvV5CVHObqaEUg229eIPBsp5FRbwkTNwuWEW5Y+rD7naNqgvIpZTShcBR/j2XHqM/quABKU4xqxHwwMErBAAJi8zibd9mAXFmxVeEL7B+J/iwszMa1KQ3EXyeTh/0FUgjM4X35IZNkQnd09lZ40ZGeTF2CzJXzg4kmBl8FxIh9XPz/tCgxAgbK26WCKtlAcyBganqTBjuS3VVRG4od6+t6XHkdaCv4AVpuCZEM2sErP2FBNxDZSCm+LfrrwCIwnbuMAp6ze2XzpzKAPiKWejFE+7At+Aju/nCjEf1QWxgEW9kHjZqdhAdNdaQMrVYStBOELmKK8pyF9scDA9cRIn0Fq/bymldLexmSQykkP4fFdduYwHbiRPZX2BteBlBCoxFi+JX/sGdjTSRDLqFq4r8JYnOoifdHv/XAg1Yndr58qMoOjUwUBx2DG45vKFIMUzIHyrgksUws/pjut4XPEiuw73o5zW8gwbQN0Sae0lgvZPw0Xi/USSiL2YHTsnY+7OZ/oSIq1kxJddBh5xcmW+ba9xbsiA93Hv2INB1E4zueJTXkzK+XGt+OyI9kBiNpZLYZuyFO3/GsHY97tjsTjOFWx1mqMOBNmDV4QtgJsFw7tQK+FCEFw8vz7+Ny3ko+7OWPxqCrFI5uTm7fvNKFUkjFFVCJVBI4JnbZIAcmucLy+1Yse/DgVtkUl2V8t3AfOct5HAHqMAHbWm7fSexCbsa+ZB3LIznwn6yEGNeLmR6gCEO5MbEkxm69m3LtmQOJmU9rn2hK1CyuUmkvsLm/3OUHvmqHo00GBP/b+EMP641bwlyvH0lRGn14BX/5ZSP9yjerOxOpEOs6fcgUmjFgVUurJ08+Sd8yDWgGQuPbUOdA25Hlao/flKeNZZZggaRFVmmiJ88CmcH+A1QqynI0Iivwtx5ocGsq7NpMA8hLUJXk0prgpJKYri+NXPb0Lw8T0R7OSZ6q6y3za1jsa3ZQoLdaiN9EsMPlWF0uo16+NK8JU+0cDolwaPp01t0xa0dSe39Wy10b7fQ+fFNAWfNqkwyHSZpAdWAbcpAEATDAwd8NUfU2HboQpumOXl2JAxoA9qp/eUydM7viVnPcvH6CpellV45jb/P19LAw1tNpm35daqB1+8f6lY5PhjpzZ/LYyj1z8ClCUUKoHOYw0ihSL0/07rfD52VirxDb8RTL6e3vDvASsdQQDSULoXo4K20ZcO4jjqRLZgh74VF/PRZ0efDEM3RZn0n9A/iNDJpPKfvWrtRTLNpXWE6kr6+QZK8Hpr0rV0+tDoHSKW2A7JwcfhYYDAU00Kmg71V61TcApWYjENBMqlqafVErq6xsnvcVVHepWM+70ZiF6ndom/yPjoKbI7m+Bnb/QqcMn+eaADOyUvsMaYxZyR350njd+DFSgaoA+WV+6vssIAv2fEobZ9aEKqJoOFKNqQFy2ZEnBdcmcynqVfUGezeKXVj0/fUj629rnquY7jM/u2ubcGUOpUcRDH+RKYNyjGWPaO7OvKGbqrfDelleXP+rcVHTHT12GzaO52yIifFU87RXvL/xg5LE9rVwBXdYpBh/l8ZBBsM50EEA9maULXJKQ4Q0G0p3U4EH0IRYf+nY8JAGrPJQ8zHAYKPpulbvqZ2Nv2JQwyAMXq0zgu+W0td4wP/TnAm4/X2ZNz7+4VmGHxTyddNxanv867fvp4SngIlo7QW5PsEQYAd5ib7HumAsmgOVNt2KuFbH8q0l70GuWzFt2WV+YBjLhhdBtP1vI+xTT9KHX7RyKtmdORUnV7kh6gNsoY2UokVzAnMREuwGGK33GiCcUgUcrpMUKs2CgYAb9bgJvJa4md4N+yd3kg7cHD6ZyyIol3QEJ5E4h2Qbh8kpCnI/0ohDyUm096fj5rtlUwDlRWEZZNLnGJUibcAA2WCKgVdKXjD/9kF08Tx8mr7ovB20HbQs3/n6hEkSwaGVRue6XCSFeQredZf6dCLDT2PXa2M9rHzVpyzooDswXkAQFPfH5bxd5A/rO3CJG/+5WcbM0qPElsMRiW1nqHorD4FYy4fbpk0XboHL1A04hlKpY7pnAK/apUozoU1AhISNLEr3UOUTeKiQJPnIf9vdcQ3mJLHaT+zvl3QxG1sDFGawTHl2MnJGuQQjh7QJBQqyk5D8WjSTgh0TfrcnO64O5Z6gjvJ6uul+DhpFrF4YZmWH5jWTZFwgCWIqBukkTuh6eS136gAXpVM2IAWYp5X9mO/U0a7l0Njg8d5Ai3j1Sc89UYTxBFgrDgaTtBdR38OmtHEbMrqfZgcDrEq2GvdSzGQJ3vPwMuNBev3h56fiD8zNJOHCk4kgs8giVHvV1S/XkNvaMJOoqzptOHjOGI517X4gr/llLCzp/hrEe6Qg56A0Z2bRFafqvlr6VMQkpiwHz6tDt6SQTMQeprukpXsKo4wlVYMgmSX4+B6+enyqvCDfceVg32LmXAWi11p6ei3xIvM+LfbR/hyqf1r7dt2QdYi3/OJEP/0eP9WW+aVbP9hwsL5GmrewlK70M/7TQPXNnEBm00U1eVLESAqK7L7+Hi8dhwT3htl09hoRmPIC098u8xSLQNRsj+B7CIWQH0XVDLtuG44a25/dg73LIynmWWQd5AVqOXxV6yLbxw5jemx6NaGw3Dx2OTr2YuNJbv42VcBIGnlpdSiGNmzdSPYQaWfhwz/C7igMTtgQpgbRVE4PB/hvBgWf4uqbP3KuuHO0Z57y3KQiC4yWjFR2+dgKy4mOggD9E0l1mRFMMW6AGmp+dQoTLH8p4f+fBUtT31VXBK+7lpiKba3rK4lC+5if0G7D8GkLkocT+yvdu1fNHDl3A6jGUDg36zNxWZVcVWwNOXrkWWcZZ28Q3P5JeJFsbsT3S51jEan3lq0fiKimP//ssbAd8jWQ8OJHZmcMopXSTubryVy07rm+YIl+cUVXmA5DUTkjAxFnH2BInhyVgBJr/MHeqScr2cJSW01RivRr6OfwrKUGuojdbuhpKY8vQiCA1AayNE09JohMiXnTbB9PWjgsl/+mOpBEcFSdGMySyUOIBmcsq1MDtKBnRhsKf6nLRvZ3ohKY+Nd49/s0S2bxMK2N1snDlP/YAWqrDupBJdOe8ZqmEWQkmiJJWQyrS2fJ149k2VLfzZx/HzvZeDklvrVu0Ne3ICSbqBdIyGjbsqZxQ9JMKUI3iVC+We+plYy5MZvJdci21kUX5ztg0QFgF1GROE/nbRvsruA3gtQEU3o7p5ZV3pVK6Raeeg/MIxd5C0K59SzH2q19of0kOo6rhWVnsC0z872ioeddo9DV3ihXTTRVGQnqTRoT7vIz3oajgPx9MS3e8dY8onosaIUxZzU1xZBzFiGw1UhLpDEVtbSezRm6ObJeZvxp+8hJnBRo840xhORzVSBMv6uNaRW6ruM5UOS5RtMXZiwtmoCPsWvJljZ3AnD8LGcKnxsE0OAm5vp58wjx/JD6HnjD9lwD//S3E0FphgIxc+DqpqKzLGjeQPD8AhV3Xr1+L+8CRlJaHfBUkMxmAP958iHzFqvDmD4lNqJXFlGOec4iRsOUpcNGLL28lk39UlLUGofthK25FkJNH/sXDlQdqLRpuCnGBXQdKotsVlGt/Efg1M/y8TLIAN/M7wlt0PYq/BKZ59E8+Ixw33oH1kNwmp4Dbj/TKH2rmIQ59KTvEKaytY3ufS4pE7LPX1fIyUd82PRsrJCk1n+xWUirb9cWsDpVTxY6DQC7u3vPLrl6FX1X5BBv7PpTavnYIu6WFpNIu//PomysfBamuphoFSg0PTi26KIWRzFQKenXGSfLg5kgsunsxNDedDObOXzj5krlFDdYyujNvEQDPdfMNuppwSB5CXv0nm1jSCk8gRbHAXTWIL4DTKEVI0R1SJhq6lhby2YvFlQu5ZfUEJUoZ8/gE8K2NTxI/X8vw7alLTKEgkpkR/EbJleie5/QnZwkfYSgRKrGCIkL7zK49L6PXYz+cJPHT1DYjBGp2SYOpnyaxwm8Wxy0kA3yiqdXsF5VbPR5+Jv3D85MvVLYifTgjUm+tJ8k8OUhMNgFfz7lfoQ/xz6dOUUscvzrWAnijhg9Sa2oZkglK3TxR8Z0NFZp6b5mgInQ/BZrbWrf6YfrUPrcFXfjSUzz3/fmq1fp/ZnmHWL3w4CBP0ovBDbTTeQaqsVh1XJdrd5bZ+Ev5SSMgQoN1LSOADRxWrVVBKFGREKYCHWo8zrlN6BK99/yWrCTKY5SwT09CpZTvz7ueHiZEopHI/ZfeB2T0DkpyWIVrqO010FMOhQhxgigfyLYEmQQQMzIo0YkuobkMtf0yNkLSmt9bmn9VLVc9plDU5bkQw5Dh7h/SXqc8RPrnZAJ4PNMkijhf9ojts0FvUGOPUCkY3MUCXzAO0uyAs9SL2YS3gEooCS3KucpfTOHCrPW325WpmjwkfPAX9mNVFQ124jpUNB+a5aiFctvtvlGFjXW4ZqFm4E9nAMFoJ0NeOMeI6oDVk4HjSpspAAr0Hm8arX2YXw1CMq8KrFwY5oh/kuLwrFOEOZBdTNDK0qDJgaBHH0xxWZ4J6blMBUO6tjcvdbahFect4AzNExS375HswYSieW5fiwrQDu59SdPtCv8OKde1DynwjN3C451N83FTqvKzZLchaosiAm18+OBB5oZSdlLJFaXIJI7X+vbu9HKaulUWrD+9nWw1G2KmJ5QguIIRWyfIRMDXuednyWP8Wd1E5fpZ12fJvzD7wTWeeb4uUJtTm+zLTxAfruzM2dSqcuSCgxmjtSXTynfvwTNWN0ISBqxr7AKDeb/VqC2Yvlwp6/65Vji0MEgjmyuoaQe2H97MaGxZIRxvtnGCiQ9X2ZfveNOhmTqXoMyXqVk7OIYOyKdSKzJj/m9QqIBYIrQ40DU5EHneewJW5RwmdXk7zWB54ErrY5o7r7voLWTq2Jg8blTbC2X7Wv8Cpx5hIhT9Tg+/xeqTaLB2PL9/+e+9/Ed17gmpJbl/k15CcCbhXswaEBhsOT1Lx/flKDZ2f/uk6O/Qx4VoZAv90ynE7dlraZUySKV0uToNPBNYme6KmFghc7Be0Zb+6kZWE4OXRdd7ftJRKpws/TMhHuBEpflkwSdTGN/qjBou7B5HHWM+4hJBF0w7fyrp7QcI9TK+YKlxVAlx0maQQH2Gpx2Zv/mHYyoHsk3F3u+x7gSi1nwo9iaJmY9EdVcXQ7qxD+akZrEAtPZyKdfPPzCJyUqkqT/ugpT8q2hiagQUSDam7QRA3i/3o1EaFJ6eb3ZG98irSD5lCpaImL2ey7eG4f7m99lH1HOKloe6ETNm0ID1zgpuSh01nySKHCjZbDTwSFw6JOKL6vCwmnaKRl5Iw9VuVq4xfMycu0HUnOi0X6jVErObOdflFprG1+vYdHTq7Iv3VBMmthqILiwaWEROhSzp4p5Ytt8aAcSwRNiq4mfQwd5XxW+hWZASSdaXR5pQggW71VqFsNLk4LKNtpzG5STNeDIEaf4qciId2IL1IOSzECtnmToL5jahMYZU9uoAN2ZERWb+Fa2mnK2EuGvO8mp0lbDFBEmEcI7cRYYreGfKGj8QQVMIs+UYoxFrxVncz99IdtGoH28CHBeVDy4f5O6SasYsireP2XY5NA+ZN4l3yXosN7UUtamISUofT4LQdqTEOKkpTDTrUoQWDHmeyRz9kPN7c5otlWQClHAA1qgLmesVRumDYyGgJek0sd+c7/zgBo5K7ERYHnp4pHVLqi8wmp9wW1591J8TrqfVHfrKPYvpqjO/Iau0aPaCenIl8BE7qbDkk1jrycxDx06SzaT07/MFPAZhNYSXi5yIAcZsV87+xMZK1Rsavhs04WhjB6EtyNxwKwr9+jE3t4IMOIYEB0QtCejVDCj5TTZA6P36Od9aUldfSKKKwsQFTALU/PFRcp3raRzBVbMjmwlna0LUj4V+4NkSoNEri3zGdEptQRlQ161zmW2ND1bb3h8HOHOQM+DIYjA5KO9LpCOCIw4y761gzNAv12+ALKSLh1s3c/XdIE25wH75iLBXiYG42mcTNMIN/GmX2XGepIuNfmB4x7IL3kwaGwKUQqZGNhZm8LN9+2PpjmVfAO3pHgR64xws0j2fnwo/cJzgVifJgwvbtnWh4XkBcwWPi9PzkS+RYk5lkDmShhpr3KZk3qUJO9EMBvtNje8miS6Z3bbBHEdZ0GZj4sz7bNtGMrgIXThVgQNClkwHEpaopeKPsL7KCXLBIDjEkXPKP6jXvk5Q5lIiGB8crNMx61eaHYqCJ9ZzfLKXDzSFp4eEelNEwnr3MtemedLN/ezX/CR14lxqGbv0IBGuOPwUJgvYveCwMG3BSanItzm5HV0j8+RlUkP+gMAbi3ltZHNhiCFi7lolx6uw6oJyuXldTga9HtADSWCAhaZAu6jVCCBq4gj2EPM+lmYAdu4L084rdANyVOC5ZkZggfdDS5wtmDzEmumYL3X4SVKOJjnqDjSypKTak5zbcI9p01nfCIhA+Im9HTFWiQn4h2p7NoTMJr6gaEV1lyN+pfgYvcRs5K66L+dMR8gLcWU4rJ8w6cVHDt8pMp8CGJKE3o5NOQAT+rPGKr8vKb4Oryto0+i3Yx1bu5x+ofaY6ApQAbR04EobrJb7RpW/BWUNMa3uyEAo65BRealwFiyAycAgcGBvtXXT9VDRN/N4/n3nLoMwmmR/GwqoJFQALhcwpI1DQrw+mJ2OIeDJxTr7x5BrXbgIjTr6lCWOAOnCJydrCTcigU12Cgt7p4JygnVyMBwUBnKsdtymX/GUx1phDRBDvcyCEelLTZNvqcVnvQGd65xb7hxmSziqdRw20MY9H5VXLnyDI2db0xitq5sR/Y3lqNhpYFKhIZpp/lbTiEOlE8b2RnNdOku4IO/9JV+pdT4ZY5VvOVG7PVKzrWrLCwqCUA5qOdM+SDqg/UtSfzNFF5nL7GxoM0OGnVB5AOOwAmP+giA8mkc6sP7DRP+3GRGdifB/FOzwQIS2vRyjMxSJm0gHI13qXekdN9esvNEeq883Eu95F1OWbkLxrFiS1/8ZvyXJII5sl0rbRDgmtKN52LYg1oZn6Ukn2YZm28wq77wpXpW9zTPpTJuq+P1Rb4HKGkPx3yuI/k6GDk1hHXI46i5krIBgCNCk1dRzp4chNOsqxAIlxuAyj1zf+bOeWzX2Yfuy/XO3AAlePUoB8PfhqOgKKIBWHc96mtr2kRLcbSf2ZdBKOtayxeivkf4qEN2mM+fObQflaU0kDuR8vjfXGxxnGHj9l75u49IXqA25a1RwBs9Jm4C+5FrWXWvJP6hXFgaLAKcJyrAN7rX0jafh15kp8I1FWEwHmcNrsg4kmHQkQ1sWxT/RfLzRTI8gWTGlxS7KIngIY8ORvxWaFbbVn8gcyEEQRFLVr7fbklq60KOJITqMtFcIUtQw8HNP+12N4XktfDXcEg3LIRIM6i7Kqo/1vkcCJ6ZiddwqVuwwakDoZQ+opD61Sa/L9SCr7wcF9t19QXYYp8dCv8NksqVWRkH4tLWlD0WLpPIcE1IrKSbYtqSQtqeqRIku3AB1GqMZrST3qYTMLht9KF7oD+rH5sNuzp2vzhW7KLkJb7gAauyUxCS5K1TKt5Y42IGD14OfQj7JVTS/HX9tK1Gp76fliK4WOQ79jV+TUK1GoPxC35BQFIuYdTyqi7UArp3bXRa0kWkDLoYNI8sx0Eo46iWRLWlmkjXf9gC28ghvzSb8cVB3Qa1dzGvoPJCwbbtDGu2IczzkpzVVcG4nH2MwmeGRZ1nLPIk1UD+098+aL05lQiQ96zE3uHBnBb7yt1x115cLRuUOvTBZ3Oqjxg6W+0l3/PbvHM2rP0nh3tQ5ws6aHLod+Pzw+a6bkFTA8yksB6LogsTMgm9REyBH/AyOdCsdunc2Y3/cd74LWSMOWrHX5Fj4iXMYvF2qKRqt+VL7JSqDF7lK1UDN1KsDys1uqUdML8Ph2YYHa6hn3bnY2/c94mMvM/XfrmjMdX5uqJBGG8dys8WKlRV9vcI6tCJdSEOiXbDPr7rT/5+CTuDi2Dd/CITowON15hsui2zhgdxxfkWOoBUJjuWSv9K2Vl2LZqlWoUCjIYt3QlJJTMIQqOFfVafpbYoeRPAmGhMjuscGCzfvpht4/MW5mk+RnsdmQIrNzVp/Zmd9Q0pkxgsde71wqFsSwqZzGZif4PNHICCeAV6pcCh5Tgk16qRXvrSYTZ2t5hziYR2khzgSRMr2DNrocNtspZlHIQZ9q+R7uk8jrsPhP96r2bEeQTARxYj/IXcDolLHAE9FVVDWHGvFZIYFB7IvZisSMcVRsHqF1yxb9YvRzKqO9wPchXnFm36uP5GaKBU2jkrB7PlYXeOuvw2fL2MJiu6UEg49NcWfwRpYjDnCqISj3WHgSAjyazHcUAnpfuAQTUV89uLG/MBfI2wJcElbIKfu5VSv+ypBUyf3m5tk9yK2RqiT6UUC7QvmPuX0EHUoUK+N6oRzRrT03/nZbs03iYK2hPyslF1vkpGkQp4m5j9h172xiGf280d+n46VSHDTPRA+dpqF3buoRMsO9pRCf1T0gfpGknesnhTnWRJOf79YAonUKAoeK1U5Tzi9yN/8PDvgNnKnqIVubPSKzQ+3I/b5HErIy/5b3tFGIfP0O8HZsCQA9pn9MvCRInBOA6nnIYfw3aY0g5dRGfklQ6iUXQflUnOvw2NiS1tEtn1E4ZnwEsYvB092eS5H6yo3ISdZYUnXwaez3gUsYz2opCl7j5mbzoBZY9zqrAk+8c3IPkxn4nw55rc8Cq5m1ZgGZW75UrOPnAtBq9+hoYjuPrhO+lQkFw7Xd9w54YLDmaMRZaRfsze/aTajWdVzriexHBEwwhLHI+KA/k8lF8Ewu9eBSbAYDPF9ZcOW3bhqXUwvBTFygiF7oceMzkMGfXbMcN3Wyvvbk69y6QDC7g2U9UhWd20l3lan61k7Cu9AQSAAvv4SklJDb5TxdccSm82bCn+BCMnZhYSfAedzVvlvPpSlGG5rPNXfJMJstkP2s3YYJpXWtRyKuWiOtMvD3U4VbtILnZTprxX/QC9sZFSJY1HHiOWx6R1vw7ZR98CP4APnTO3vV1tsbSlw8Z/V1ZBkrTuaCRG8O9luy++UHyJhlbp5bpqeWyZ5+/IlqVXmVeMPNIo0YVOvK7HW1YsTTilCF8X8KGHNc4RV9F74YI6LKScSCAq6RLqjgAAaisFe/Yq3UnnGsE8BRyqvqts/FEdVtEypeBgF7rfUMmjD7ieEkCbSdBP7QN/rgqhytPnpZMnzQRRCkI6fb6r7tf89vsg/1rPTUQjTscl1notFrJTo7GVIgfuBq61Cw0cS86hs24AthKiHi1n/7XC/PhzEpFtISXmw/Ct7jq4QLRYqq8TUztHZ7yWwYRRaBaeY0kTUBV44csdcP/G0aMwvbOVjNyD5GfA1ypC+wQ++tfll4qbOQHVGLwOWSDQCgc/Qzkc6VrAdk2d46HRBjBwOw9dP0pODL/4c/AFq1pkCug4DwYV37r/YnXn10zgwUChFK3q04oKDjs6itPpOxCFyJyMUB9nFeLaK/b2aLCn1odbWQHeZPsDKLHy/F6Cn80BfWdWca5Nfw35hK/1yNvlZen6r3e6XBCg7cjvRX5SiuMtVSVLSiguCdn3W3wdQS5D7naMkBDNiXNsSkCBpXqmn9txV9qJm5+6kraCfM/fCSxltLfM1Unq7rkyYaR1PMujL8OI5a8mCuIDSS72FQUH0l+VLi3OYsB4iuqCyF6/NG5Ro9EYEwjdVffCDC3p9dV1QsZ9ve3wmMGNH4BUT64FxnW6Nj1DU2CofDQrmsdbk9Sl+FEDTgkKGdI6Ndre9ECP2eM0Q1WFLP4SuXvvb3LFFTm7Ijvjqnu8l2pshY6sdTSJ/lyNbG1g7f54bBxETMRhOKq6izPVSfwgIYlInp9rH5VD3e4Ajw2P7Qb8AkLUVYv/ra1MQ+7wi8QHxU5IlkiFe3slIiqukv0Do0NYgf0EIV7ewjcN3nAjEnWMoRVqdVMG7t1sJHelJV9DtX9snjfHHDn3jaV88NEYGXtzlXHz5mCXSRl8CVIACs06Y1N8NMYmlg6Anz6NUUt4hefMyMgrfa9oVF/VGB8haHc4GyqP6auCPMNrmbmi5+OpQYUfLCQ4IT4Lg2ieYOE+ZMVIr2PXQ9Ch3HOXzq3RiKszSB+ZyQPCBXi5XA70/f0whLsaMnll6GzXnIG4cwXo6mHjdTvyKxJF5uanlG7O3nvPETdSYhHKjhg4vYuIp+dsxpQxEOlDZWJMjl8Kmc1I/TF60+hjEVV9NqXelPulr1BKMoNUKUQfkxwmPwrHKeLlMdHutL8+P+crs3SG+EOsTHDSfckQD+g/hTCGK+E55gWyqUvQrOfWw8lNidbLeBAmO3IieoLdD3bhKjPBqqrH+Izr/FoovAd0PumYj1YT33hUq2imvZQHxxqx0I8SIttix/cdk3nMtnI9MlXXTxOIBABKr7FdJtHiNnTCnr5ObWQgAoe6c9W7OHxFbp3irl0Gz07g8zdFYMScfIV3609vuhGHFO2CrW0VkGie7/1zxZnJfrDGlHqfxw5fRwI+PYG3wXJIHaAMjYTyBg4IZCkV5CjWzOKtHYZLBcMv2QXRl3Fsn6ry3YAmwewRrN8g6uMSh/3TYvto5xiMcXposjqgkwl0EcZJqHfE1zQ6d4tcjs6cdQWS11lCvt/VIKYefWnKmoK+lsjXzslVKQEwGx8XLyC8WNl6RI14G7HKeVOEVL29a5ho8Ns8OsCgvr/EFg9JmgbGzx9VYAW1vCEo6l/GSlTLlegh/HcwrZMfI2oYc/Pn2lDnEl3iwgSo6egEhzAhcdJh7x55zJpP6ugxA6wP/5Tuw8hL2oiCOZtwV5AKm3Tb8OiLYqpRh+0Izb8ESCahLfnE/ez7kYoV6guT3ZLeblUAkOEkLFtFp15CXjx5qyYCLUOzjDbBTAzCUmpcQt7jE0g0HwjJs6fi7gOYgfF0eAnprNI+oHgahlyNh/0munU8O1y+wzaSze66c/5r1rjSmorFXy99FKXMY/yHz5vi/e7jyvduguFgxj2+3PEwdBgYbP0OzyVj1pIiJjLSi8qM8p4KhTpZUXyrmo9vI8TGn1fggPMhWq2JrmY6tApIkFD1D4T5EOQVyLf0eUhd4TKPB3b6saq13N/8OsBgyWBDtP8/hN4qpmByyE7FSLwhN+9XQvH3tuK4KX9hsmgkwIbsB1RDTobZyQ+w4xzQYYrxf8Ri4agLQX7n24VR6QvdZkChgpThHZ38nVQeXUVA12Bve2CGBuAfg3BJNqeV/UKsPjwbSUfAorcCuszvAn3Kz4ZMaOYn8BCK9+sOJEOH2LaOZmFTFmBRozWK83vFpjF60JcURmJMuvNQEWpQFMeSHxjggI1zxxjRLkRkQcPoxpW6knHU0uZcKSK/CfqYlkuuEa+1cpIY0BMElTzHr5UyC5qoq7Znv5TgaVPO3C7rWNTOTuzdx4TqaXNytiSC9yQE4EtHRSRkj1EtivRYX3eGhDZ10+tFwCQt14mWXj3Y+XJVobXf/od9aRo/tFtGy/KqLrHa33WIZBrtM+6b5XW8HbBeywszrAblUHrv7XT+LYRV1R8iUKn1BmmZmA8EcWMtPxx+WYFbBgyVeCQbz9etwhNBjG8ay04zUaz43gUjA4Y4QIURQZuGJH6kxKERsoQSo4w/7Dxw71ephcSLDzuES3JMRr+faewEemJHxilIdCQ7re+/YjiXTYqHTn0ryTTUbScpo7iPdqKjwkX7mKGIk3kTdakZPbPnz6c0pwOOzOLbJMEAPtqZ/X11VNvJqlH8He/k5DbAZlETrPajb2ZYCn2vzTOuiHvn1K9N0AdljMkp/YEX2peytySQD7RjjWfOSK65i+ZW6GcRNGmpGoAwcZgMNyFkRGUgrROtwmCEkG9QMwmqYZK0nPO5sI5dhATOJrke/HdLvIyha/GRHj7VMEwK4dRY9AEPyi7P5i5FjpfwR2NM/jyvvasO2jvisSweQ/l/XbccWIiUSKIVnEU+iEHMzWJvKNubUWOxhvslQJRXkXCkZh1HS9TTZLtb6LoKryQfTCfXe/eyokTHhM5JObAjvaXcZDcHVZgzPus1yOqQxuHVYACugwPIENU/lgvGn0ViVh4flstMwxk97HVqzkE8DJFbdtjq7Upw7cFhk+vZTFki0WXf7u2DWgYb6f7+bYz9tZ6a49LYkr5H7DitFkiZQPAteafq74q/173lJ5kniWH/QGZ2VbKIGdafb3uokLezEb3ZLJq5NgpaaCsxgNrOpKmJ/BeQagwec0fa5NYalLlfTrzdNyyLH/wJ0dxEmPwXeA0erUzZn1EqkHEloCRfvW7p7k7es2SEsFeRADpApHdC1YfbLUncRnBzAiYMD19DTSLiV4f4SezdAYgbbjqe5e5njJB7Iu0XG10mwGawPE87FmOo01bnai7hznryoie5Y1+h8iskwJUUo4KL66VrhsGLk68gtG+5763btSLT2FrY18+tN2cIJ4x7x1IvxrF7T9Ek6ad5EDgtbDBgtkX+7/cimrzAw0Vbqi3iXP816qZgo/8Ckx3fipDHrdOqC7QdLskJpM6Q5WN7LoObtKRXQoXasRBvIl6RTpj+d0p/2J2lNjLu/kHoe3VVIKFAPf1l5WsZSTCHJDBj0yMY2M8TNFxTjecf1KEa3mydYYz+BIjoFnq/Pgk2i/kcFmtqX5N/cPfA2mXxJeP4dY980nGlFrtBRV8epnGWvzj/XyVDh8A0aiogjTHOByNdZmDK/XhIKMsJ6NG+DNrvtJAKuh6JVebOScINl+GLFDQW/puK/nxCchDoRwNeC+l+9zeSfny7LblpynNspgL8b4oHgbVndmZLGsUZT2CQqF0OU7YmRLMxrgDZZPjBwB5FTcJCJxiYmPP4PZRvRlebZbmTnwXT+aktW83EG5tMxzd0msH1lHNGP1sU2LVVIvJR4xuAzfU9KqpQLMeqqSJ56Ryr4M9OvCnV/X0GOPEVaV1dwMEYBD1K2pEvjvlU95qUhmkgUg3toG+s1jsXsyEiZBKSoWzgei14TdY+aq9p5DNsFhXRl8pS3FO2BQWoSukZA1TnKR3/pl3fjfigBLBPquQ3sNEjMhExiLKRxM/bHwpLPyXT2/yihjM9Ks5UvnqaPCxFN6gyltk+5J4oH8FGyOafnI3lKFIIngxMXl1AN0z+PuwjbXJZmtk6Y7KqOh+bjNKTRzMTyBR+axLD8xHQEIPHiwrGrw0wndLfcQGTP2A3no/R8bzQm275fsx3WZogsB9nlLelpHia4a7TlUUqBBX5ix2ZGGOs6TFZDsypi+h4ZQIiCzkpBvJ+t8T3YRtBFEx3zrbqavzaSYOd4ypErBDzlkCjCmzSt4fhITMLOfzN/cA6gwfcWkPvJTWxN6Vis/o0Ls4CqDjSu3qwDxYAmUB7RAwTwzps1hU0Jno1LClOrp8jz+JF/jSEn4JYpyzBHpP2xWp/9M1EWkrQPTYtRDKltzudmu///A+cOeN2V0vOkn4RF4vgjEV5tEk4ezlwYUJY3VvIFjsa3YfnYNXheXQ2u+KVmkgppDxWSSUoMwy7tjyMwLEgqsBuJ2vakwkyEAbUeikMnxPbhWViFcYi5ynMIU/Kz+vPAf/ykZt6tsKvU0+T0q2xFjcTYiajbOVQLBKA5FfEm+7qYUk2wIFEe+jd3DvGucz87sSL2GT+AHoQH6Ax2iQxlnmp533QNVKPbAKWa4m0KtHFEiz6jW02AeWyYkeaEMi5EukLPMFjlqTY+M+zXJ9Ep9p2sBtV603HN1USznIzjvWMhUbVVUevDPSzO/boXeDhU674C2FITTvbww76sqau0osNUP+Ozyw25X+K6jeAQmgB3Q2sib6ZdT1crvSK8vnt0h/O4VqYjCQdhSfB0mNPPlRC5h4ZUUcUGZ+mBbcLeR49E6/+0DCuB9FXlzN4s5lXXOaRcjLwX4dZTeXVdQKq5kvsHiCBX1XKjo4p8SXFLIocRPzP3X1hXXsRoAzrH59ewXo6Zm1zuT3Uf/TKeALhh+rg8BBuTzYbpjwlM02o+E1lOhNKcQVICIBC4EFRFFEZbf7SxGaBtFzv+9o41wiNNQT5z2U/UqNuoJqe1cdDRgPCDMu5Krh87uGEd4kpwCHyUWw+VLRl8fFiDQs70qWjJ4kwv3TvfUrjNwJ5kN5tcf8NFDNGPaViPu3PiJvbdl4d4f3oboy6vg86DW/PPmxYJDt19foJ4q/MCQosJCMxT2vcSKb1XSIIFJdbTNYkevjoqFly1p04GVVEKxJ/TJcXDJl2ScgiIaeGabcgjhrqgJupzJFik1+tR2fps5AvRIRelmYPSUQtd1X6QT365CcQ/HFdkoyyzOwrvLv3iASb7RDZekNHwbVJnggRes1SG9ZDo8v9WMefi6hh9BGhPlC8REg8E5XWjmFH5AuzD1VVwZG+QIMEj9fvgZwe00oeG5FF288EH5AnuKD1EtJVhM1W1iQTDpz+E/79y3mZMOXWI46Wa7HKFMMGnNeE0S2GMD/pXQnuZxbs4DerwO+6P7hR1IHJlfqZn9zWizt8A4ZOLGiKrKFErR+ywiZ9GYq1vfvs7gnEnnO5pRiLFErUdsYQLR1ECIChgTCERi1rubv+xusHqOoECXpbdqC1w+nqdUlvqHJfwCHejPbt3TBt0qTzwItV+QP0M2MCQI9ucu8ZbJR3nkk0+bC2qW0cR0sfxH6mfbLRFgn4/CGhPziRE2aRrILqBKfFhVNehD3WFiJLOaB3Uf+oz6dshcVc5c2u38JIMS3//JEXFue5Vh8UwQQF2YeJS/0T0xcExIz0wQ8SxF7LegIek2aNm22P/Pz9k84xJgRexvCO8NdtT/RgXydYm/UWnc+9RsBpMAhD39F6OyX8TCPfoyC8b1HsmZ2IVcFw+mWogpFYBMbU0vaGMNsNyxVTUDDk+7MPz31WzmnuwSLjEs3rRtiIcad4K4wurwMchDJIJPZku2kjlq5utA5wIh9XxfGkoCVA1U7JLfA+tsIRjKmKh7yFATuDDqxpAE2/6ThgeW95eJ3E6+lOhlrAtZTR3Iab/zXMNpbSr1MUiIXr+YsIZDjUipGMgVkIp/NvPX6dRVkXfQelcFQzCKTiT2+6cL2P+fDUPS+yh2/Tf2bAvEHHMv1xVEZeETqm2T+K4T4fObCxvrKRuITj2wgpEeO2nKbKwdgpw5RcLkmH52TY2tIGPoKDB8Vat2cIW9dm9G1BPCiUn7CdroidanNZTDDMlNGwifkvRHrK7bGmdoU/tAdK+EcFsw9267blcn2rGFjxZX/Ngxqd3yOzUS5tAO2ePdTKUmX6rUo9nLQYTXzDnervlU+16xu67O5nR80qDKYM07hCueoakYyga2bX714oRYeWvlC+8qGx3ret9YsgESSkfarj6r/yUmYhB8fQCtvKUojgd11guGnVleYP/s13zeM1X+Ob7Y03S8TpMki0z/01zsXvKYvi2IO/+niTZEOIcTtIHCOYXW2Um9aCA6Bbw0Oove2hTW8yLIkY4pOYYvXfKiQnnXOdZj6FuF0xLiNQMv9/2L2+A8nZmeB89Y/fcSMlYalJehi8E2vaqnpoamCj6UtDHN2YMv8Av+WpDjTvYy1hfUD+hr2bsVKW4DPqfCz9aa/0zE3coVDr3tNTiQ/JC0vUQ7D+oN4K68nPcZU5pbbAtZ8cAUJfjhR8CrbI5Xz0+IL1AGWKW82q/qnAmCJ7GFYPGQJn8p3GqXtBRal/nb/Ew4lwDZbWg7/31rboQsNxwKuwLI+XNjxvfrMpVE1myB1ZyemMsspYrVEbkKb5bTMiH3x0XEpKusu1+mAtMy4tEQiRkzYO/0Zlmtfc+lNiHg6YTnrJsW6PeT1trHQdfm5ZfHMSbIqJWzYlk3E1Cy7G1BFOOiqDqjDgq25ymSeWB9TPWIZWjd7vYh4+NCMR8RycV2MK4imiwG3RPfu4ZWPr4AaA9+U2rATydwLr06TBviuMGwEk3ejxVCUrg6ysUVK33KnIutsOWtIj/VbNhms6mhnlIR7YxsZtmD7o6kL0qdXOYOkr016DzN4ZNdolPJIyvOo47D4tqnD62vcL7+Ifiy1J8rtEjbT7NF5X5RHztQTXXt87BZLXG3MfxINspOMXjs5mPTYtegb8z+Fod0BSaTyA5evOMJaOZbtUcP+v9WIg33pny+Pic1WaTgghvKX+S9VyueSSEKK2BLskGTo+GvkhCwST2W0Ch/L1kHjRHIiux++ONEw07NJ4cdszNs5i//71sucFb2rlAfa/ewbeuYk2fOrnhsD27Z0NUispUGGxccE9VP3ZvUWs9IV+sOt6zPC1GEEIq+oPrW7YcwT8z3wPZ9cxmhvHs4ghjWiSaQlomcKFCBFg3j37Hd3LT4Icl/dO6kTCk50g5kE42+2d24lnl0hyjM42qKnPjA0N63Zs5HOZp/no7ha+5uSkeA3ob73n71BbPiHNs3RxliYrZtoGHtLJed45K5HvZcDT6brjTnfOVpj7hf3EM8LuC3VCHTsgA4kFRtiqN/oU/X+op8konOMc3NRmvWg3Y4A62qfNPRggvjdy/lr7ycDm/e/8vddFs+mLmp3hLH92XJSUX7Y9eceKXPb9E/jK5pT1daMPskAAyEMupJwWB2gFOCO64yUGxyzT9lOH77RbTbQCZSd5vNaCdQCSEITahcIkVmwMGdBDbZgICK4k5RWVc7aC1C7kc8hSGPI2dQne0GfHP5gTWb1fbxKSuaGNOr7eFY/eemEw7hRxaw4ofGpPXTTx4HBu6VOzDmhXdtfUAv3lqUhHFsWKQBnWexZOqZP7A8BO+J73iw8f+Wf7eVGbhdPAc3IMaJ8A/cB2ilxnE6HpU1w0i/ftM26op2lwIfZqnetQpBsLqout5Br5ICT826UEblysGh5v2tte39Ov/n1AGb3MT6QKfNrjDWxG1+BrGJllr2j5XEolKZYIFQIQL4Ic3TRAd1EYWkT6W6jmTz/HlLjTor2ZiAv/Pfg/UtOK8EAXAdjuJC/lYSZMyuBHfbgLrPZHHdoFd3Ur7DM4K5yMgLr4Fe7jooKLUtkzQ7qM4JG6uSubKEvCW9CiWmlEJU9Gg8EI7vbiyijv+WQaS2zTmbifId4Fuyf6Ffx0ahxV20vY0KHstzUPV1FS8EEC6G6dRvH4bOYkSsZxTDg/hcwovz52I353PemyVW2JT1Z/Z7U6hxd19l5pS2vmBow2prpMN5zDHLwAMwyW9UDDm2eyz5RcpDgz4EOKcM4wzUwHrheMuGzVFy6kq0jIGQ4GxAtU/Xsw/exlljWTZv3tVMpYj6iAugNQE83adt5gYVyEJhbuMtsCSso9YgAMeBlnHzwHNQ8auH2k3qCKHn4hX3QO0tp9piMzzTARJHdXbzog2oao3Erj89vbpbmO4A3MUogg1U0cTrmCOJFuHB9EjFQWJahifsy9HLMadXoI1Vj/S2phABOzt95FuNlr0xmIRuuVpyULOQO9YAODPMP7ed5wtcSq52lqOQkbb5MbDiuEMfNtswa/v5LI3c4b6zTd9H/uhg5UipxZ6ptLU7WsAdxkUMNFmDZrNdVJYGCYXF2Ncgg438K5jwkhrvZf5k0uTgGiUMTssR1kLq0uA3j9mwB7e4OYRN+3LA4s7anSldWD2051/Tn3M1mUosfspZQ+XiXpcvMGbxJ4XedMCDdkDRWFpAlvHrZrtARIv5eSH7q4JbgJqb72nK/ajGEfhYizWnKjvj4/TMU+ze8ZEbLdWHoUHMy7bs+ZTuuQ1UjECc0MP6tOJ1EYEGEHtQmr039L5XeY7yn6cIodjr3QH8Dd4h2WnsN+IZYHq/7Lddk3/4pJcGMl83q2V73GaPB5+xRTwBa8AHgfTuHKIUoRO66JF1aOS3d7IutUWqphF61ZEvtWJIXXNlUZWr5Fz3IdYXNC42Ek1Wl1m6ULEqJ5UD0Vxm5b/EqbBPvp0aZ1plfy/UeZ5lBAJyi8b+KLL9/ilQsT2/wfyzflhCcS2dxs/r88A/jNG51Zb39iwBoGD+erSVi1kyttPXrCFQT900kAAu4q0k/IYVJ2se5BmWwd9g+2d1qK9Pyz6qz5jZJ4iZRNfdnJ2VUXfcgqlowoX4f5mKUNLJDIE/tuMELJyI/X8cR2C7B+ylvmsDwjFgjkUBDO6lQpulx8GWUBjdtKTsOZwKu6Gfz3Kr7DsWclmlKuwV48k4OzmdOlxh3NePBn+83aHupCPT4lmK/mLiMN6K2XNxgyrDZFdneDr8s0HPFv71zMNAyYkwm/UctCzMvDAtxzHuLNRJEAnHSkMdmROlk8cTO1twVENdnn4mjhYwCKFnzsNogxe1GRNlFNSl5jmvx07lenVa9u0YYeP6n3X6taizEF/lTHfc8HJ6oGyJsVQtNPfKBC63WFA30DTznAqKkfQHzva/2ahpC4Hpo+bb5QnICaC9VKyNtA94/LG+DVIrZbGi3NpmSc1+wP0Vs3JuRyYVUFe+nxOXeCgtHUul6qej0dbQorj+dfd+gY3StjcHg9nxODtN6LudiEEjTirhBTtpv8myCh704H14AE17KlvE/UUK82cGWGU2reUOOy2BooYMS0KdKFtllZgXPdWtGXRDFjMdhMtBNo5QB6mdr10tWdJJRRLCPDOOgpsUSket2KweY24pMmEk6PwoxnMlFten/8Qkdn6FzvOD3ak/VmbPfjZqUojZXq3cj0G0qNv2zqR6Um6XEi8hVLGeNpQYGiIYJXzIgojL+rZtTsy12VbxPgRojRS5cWMqumlRH2/MFgaxTy8SpqymJ2qBDTT7WiKazUIlMIGHhCcwcp72tDlCwqLLjilmepklh7tiQyJxMvdRYXrtCcRaYSfSTywIjQnEbIrucmvy8MHvlu8qA9pJkJj1GdKJsE6KEvmnT9TqLQ3Y6iGlnhnKzhvQGBXSEvMlg9c9ANU2VrVRejR+9oGwl5v0uw80AE0ODvv6jV0smnmNoDUtfdCco98lpkR0KS1hui227LJTA0P/+Q9Df8kxpFMyASqTcmTWVK8+OVgmWSsOHfndhHpF1GxnLQtPl6vQ7CDZ+LUMMeB0OwlYTDOAmGwhUjE+U9eCviF2IBF+kYltZ/j6RZuW+kb+MosBm4Ak4CAvSdnMjlCS0QTscQvQmzBjhhTpLT3l92b8UudZEJ6njb1SWyQOwGjyG8QUIp0rET7htRQCCvmV4ll4f+Y54+VqVSZXlRa+W2M3Z6cd72YXNsIdLfnCjfgJnug/dCSfZUIlMhDChvzCGmljbCCDEkqMzTjrIVG5Vzi8P4cWVgJ9ktIIaZf2GZkMZ8cRwNaG7qG4AwuTWIY4QPcxtebAYgk/WyPeUb1XF3m9VpSphvml4SlzSmjri+gV7M5m5yc7VjLCQv8zfD3LetxDRfIt8C3Aq0MQ2GFq3iyEmilfT//+gzQ0KDCzOI4ecUufyWBpXWQlIaC6OfiziNwDeiNw3MyI4zHisuZWrdXQIEonb2hmbCy6GU0xZW7zToQ4yWTJEJyVJt3kR8g5i32NCY7sxbYdWKy+A6Ugh0+8FhkD8SV8L+ezplGRBaHzN8+PlLYTRiFSS8ZO+5laj62OQvFQ52bD5c2nlqx8xZx20WxnUSVSxfs479QLm5ToijvsoDxtbCfPa8KmYK4prTbmMt/o/u2tfHcPxP1TXen7O4TVwzAzAWRoNMj3o5eyANIw06QoE2XK1EVko+BB/8G5u8O4b+E0WKrwgJkskVafgmL/NCBUcRz9FVMVyuNBqVH9uizvtGjJl4wYn4d4r+XfdhaTTsMr6gjWuQB2xnOwZiobIvQ/W/kG4cRpYSv/+A58XkWiCsp2U674fcS7j6guAq6SVq7GSMXPbCEi0gubvdJOB0N8g+aMW0DjbKOPA7lCRWoHOg5fcVP3KYhjMo1RnQ/oC3zo8567dGDEBae2FiOPX6G/KwEckHle2cET1WG3UzY6v43Xe03LepsyRPbTCeNn2H6a2veHN+JYTEiF0wr5CvCkDWQn7YwiuSp/rASfQrch3X6IUMyFIeNOzbkAQ/BXjyTPdycZe4d/AmoL2xc2HX8CG7GfeY1fY39XPyCaQmHRnzj9O33X4x2JH3A0b/PDtko3U61lEE3TguoZVKEx9R9js5Eav9xe/LUHKsmCTO7FMJpjm3unyLorTHek3IWk5qI9g0fnNewRqd3jPzzBSU/LOgBdTUexeMvuX44tzwU9mWPffDsjsZJl+f/vXpzoXNJ48wUTmRoOUG4vHqZGqo/NBSwGBdKVyrWMXc1EglAOmVqhghHOKlaGX9uoylocdfSdcz6t/g1/McjGoEXaTxqZHmsrvRFoppvJP4o9g0QuCPtWcelSjP49e6wMh/mQSDdA6K1ZjwEZqaMG+20bSdLEhfryUX1d6q6mTtAUo4fIKYXomoYJDSuLxtDYTuTxz6suqg/iUJ4cHVE1GVsZpzIajp2+d5Sycb+53VG42IJph+ggqvEN/StrArxLQeZ/2ULmmgZtckeL7MrHb/onXoxZsGBorPOnnIZOfFv15P9U+Xj7VPYOFzUJgWXWkjHHcZF/ngFVm4azIqw5JzrZvxsRC+4w2+v3bWmn6KO4zipXKC1vNSfh1ZhWAlTD4kB1BvNepAA9EfAL/3bgS/+wpfKk06WSN/ueMNr0+IXjaLwvCwmn/NncDsW5T8Uar8Ixzv+sFLDo8Gv58gkxjPCvUsWJTUa8RdlsHeKsXc0JQFq19lFOvGbmoDq9M8PPJyHcJnAE11aN/cVbE+UbNgFXEh7MKULniOmb4b2tbCN+D8ONgh7Xzfppg+S+VTpxjloEjCNGs65hhSBV/0lBPhbMHZMGEwoKv+q0vQX7RqTK5+j2+hb1ao/YhaBrv3F3OUmiYT0lDqk7Ndgjl334MjYu3fSuNGLITeafsXUFCygLq+HPV3fFfkXAdE6M7gTl0dFPgvA2G5d3ntqfvjj8NHE2QY4hH+hVpOLMQl9EqWShjMbyHjhzL2wkJ2J5B+kNlJcpTpGr78NloYE5TR0g6QLvv3cumh9PqT6MAzd2Vb+vJ/G5ibwh7xilpkvlB64E5OtR6YMEkFTgki0JXlZgGrPVHR4LSaZo8K+SacjJtYWR5NQt6RP7NsDw4bAhpRZvtNQFlgQzHinckpS46y8XJ+OrRI0bGN6CqTaxbXLpyZDNFIqH6zEAfqL0Md+HCYm5n1b7g48nS/4vr6rpLpaoNvZj3W6f4qqnA5KeJ/INsprLfYLqr4Maiahno5Vzcc0r66u21VrO/2FqmBRVt73gzrzitxcrm3IhsOYZNDRU95ZUC12Mpk9frw3PQUIaJWcclKykZGuiCGsRH4y4FWhs1+4TrUZTtqnWrU3Y2iEr9XQjiQ/1pleaVKdhxd11bQOzesgkVuV5uFxvl37quEwL5xuQbvbICJbDwuiwbav8Ix33IitADv8Ar/u+pelC1/Okm2xU18oYY/eQ+lqg+dySl34rNvuu4+/Bk6JGxX6ikB0PECzLOkss1AeksHIsprchCJoVMU4XFvyklcRBIQx1/ZoiB36/6yRPlOBgl3JaK/X87jvQaY5QixCN42c2OMbhipiYYxIPbvjxBp5ckWKihsgnjbtOJEaqGUNkAHjc/QP/k+2r1tYuJ6Y5n2KnrsEw+YDvJHKZHFnPsQIdf1rZfmtNtTJHjslAtjWOv6XCFRnQIFz5gBY7KjvPHH2uwETAFne8Q61Pol86YVf0CZwr7SkFNGru3ydnJqoKCMKeiAaO04PcTkH/P8JP+5dyiAU8Pfh6dZWf65BN3yySGfkn5l3Fn0HB+s7r288BicT9WbzvRIhpmOJgLOXnbs+mzfuXYQWcv4jgJmYs5+efcz5QxzvCuuyL+tYjZkqgqeUJ03jxk/kg2Xp0cFddCnM/4+ShcnJ2V0CyL/RCY2vfsIyH9WE1OciXV1rd9Cy87zBnCqRFwzBKk99JPXQIQYDKkFJFxllAl6bdCtJ2qL2Q9BqG/mSgmvDk97uPWAYID08zorZF1Z0z+lWEsqs+UcFGb2Z9W6ojS9Yc6YU4gxec9sIYiIn4wBYwifKZz/v/i9SLYgrT/4BiGID87OCayKIEFP3ML8B43sqlm2Ih+nww0KmEj5eiY3AOYOeHFBs6vITFwgDDXk2wrCTVk7H75DHGiXTsZlkiEetDDsc82WbyT21O/MoJAW93+p9LwDSzpxrVkEg0ZqkhFiEh3a7fkKz/bDHU12hN9h5EX3sPE59z/85/6ckj5QjYSKbkMZuaDnmBHqZxI2/yV4kPRcjrsFpAzQhMoiFW/QxnoFcONFGTo1cUOsUoV5LYz79jo1t/67b8KPK7L+Ajwav623ed8VXlnFX9rVwBSk5rEqyzScarjcnwtrKC4EDjL67P31ywb6z7W10LDS+UBhiS/D5NQswk0XcS3T2mzgNsGfGaCu2P6sBFsX3kKEHhhjYDL9OUPgUMuhzGy9125tEIdN+6sWb7ePJWQCayjKjxIFZIxiv91u28Xq4C9Fo7/D5oZiij6wBg42Do7Asm4FkeqeF6hYP+LwdFjapQCyUrF1p46+W3/XgIklHifBm3Rrtf6L8gO6thWnvSRTOlrBOoDRi4ojVzCnLGixEjjqcDWEO4L/N4K2pvaf3iQRQrFj68O78VY2D1HbRFCMcc+JWuJEylh3KAZAO5o7fUelL3otJn4K13yZjHyGzy0ni9ZcjVs+pqgiAyq/e/rGl8vBlZgod5BmRHBDb4acwnLp+jJ2T+cjmpCb6MIFlakvaHSKBD/pYKIkTReOPRTiLBJneNuzaLydTFYUv8fREICD7AUgAnZnbvwVHg0dpM5rg2o/Ovp6HfIkLHVk5bU0i4vcYm6wZwdcAjFfJN3rthq4fIFxSZDXNWtv7AcolnRwodTaeDoTR63Q32t8/7F+mecwfkX9gBCVhu5KNQfrFDxkj7g/kfJHh0clTJ2dsnRzdy6pJ3j43FuYZ95SI8SPTsQzAkVT5CqXgdj4a/SEy+4bAkMehLf6r4s4S3DotYuCbtqUvsvlwZ3ojAgrteKbTMt00Ug2tEReoyn3Viro2+Qvs+vCfi03w/uFcqvHOuoQ7Nif6AzK3ZoTmW7DBRHcZO+iOHbD8+oKbvWvrIomc4qSWE7ZJVIySBx2l/wTEN57iu3HUdSLMzHrGBhyQJ8h5xFKMieKPcENWvUKtEdQeL8EHUc6BIhvn5Eg9VOk9P70k3vgu0zp5fjdDweBEKm36JO7+MXsDA+4bj+rCLnEHfqyDzerrNpDyRYaHXCXuN3kse5qTjfh6C9fy0hreIVaKGv8lBriTVNLbhCv4f8vxJk2Cl7uroz4ruKo5rrIH8nvTNUa0N46tA0QylSw2GFz+cxSZ6gMbpiEAMVUruNzk+RePVZRkGGN/Ww4THwSPYPmngEM4Q0t9+GaVnN8RfMzqVrAKckk/DXTxztklvL4hAQwkVs++HBvqjPjX5su5k3tLXAjYlDzCCQU+cSX2SwbVGot1gvasLlC/552ktozySougfisBeBgdRW8h6WWdAGWocLDcP3rJDfsNC/NlrpMCPam7bUON0qZb7P6nIZctfHXv2ThUmBye7lJAHkcUN2AmzV7wERfxUkpeTov90r8Pi+J9UNyJUnwDI2nWuIygUGiwalSKxKUI8npR8qJxd/UG8gUX+QGrFWoRHBMRlpMjgCZ8RnzwKYPuBc+/rjy1d1x6C5tkPNlLMXGU+18M53t9NKvj2OVCqpJ0rwb6uePpOAtlOQdtaQ81vyETG1C0urOoKVf84bGGSSF4rwNZdwLb6sJTovyWcy0ZZARaGup4et/dgm9NqL6BeYWgAIkGDgbK3HOo1hVH7dlxO/XUto0HYAXT9s6KKHFgV7hu+6q3nT6mvq/sGhrDBBkLjJ6Y5y0DcSFW4uCPQxjbQScrxoYMSsEZ2xjI11d8acjHDMa9rnSOn9DFQl4oMhqiYyvvt7+NWeq9nVu3ZTAcoBBkoEzl0NzW/5dFPDTQxR5lPEsTJX1kzIA8eP5JLD3FGKmdCfCW4pbDSxrPbAbmXIS1U9dubLXrG6mK8GRlFhBkCgDvWbsikPMQZZK5dO2QVSPfeTRbZHu65A5/5CBjYD2ZGxe1/WEQB1aHrUh5jXihrfCAN0JEIax7rSzLpgyw0HCDKh0LftptIpee/o2Sm87WGC6VLHgqFZgRBVMREBEJqS+gf6gsrbPQ9IBnamMGXtDMMcwTJUSl+OE9NGCM4ItbkqIcf+u9u37nkk4sbTtDvBKMhsZ7Fjnja6n87PCQ/xqq6GmIIs7NfuLCLNs1QT0ty3fWQmM+nVD72XIitFfY41F8y2xog344YVAk5mlf811UE4NMNVsR1gs2jMdUDWn2OYdafqI/tkfE43/mifk18B1SbQJo4u1LxF2HChEnlNISJq/Ivtl9fQmsdvsYZhNMCctZLXtUZebHtotFsjHjXpPYnjqM+tWc0dZFHfS4bD9/JxCW8G2cI8jiEimnwFEIB9lQPQe9aGRi8hQLH33pv8xZcN+vhDY5Cme+Bp+zRA58z0000EUYSok8BkgzyRXQNjEbwSlsSXz1t0Ev5gk5XMkF1+wuiB5mkQ3TgsaSFvAh6jKsACGfio76iQVhsf5jjlpVbg0NTSk5WxxbJJRp4Le118AlUCDJ75fvFc3bFeUj32vYTszFUjtOac+YzzjViUKZ7IBnd9Ya+L8xkMmP7+7QUSui77JdiZzeN6NE1quoKV2gFdkFV4DpM8qhISrF37wRS04cjMxpcocTlUW/tnIvm/Th7VZMOjCuVzIsddTNatf7l+jtIxm+WBva0mqNR/woPI9S0gx++qhKlQ5ZY28JDDpG5nn93iNk4B2neGZdnh93sPE+4sw5xUzebhruwyHwOYVLEr71l7UA2iBkpa7VMKqz1+jMxR4/a06xqHQ/uxn8bOmSgI/BkLWgvjLGwtIlh9QdZDzkdsCSVNaUzkdX6zfZSvGAsUAzbvlGJEcwASVstrJPCLucLwzQ4w80PglJ/pvQg5rJ3WU/+9ZYkQTEI9L8KLrRLbKUljkf0rK1sqJ7rULm9llrx3EboXyfA9xhbEnWRzgsL/C3UtU9Gh9vWRyXoBmMKbuN06n0mHDiux1Q4HfFTQ1i3YFAZHeOAvv6X0Xso+L75L7rGMmtH0EkNj5ohHyhR1KQGUocCLex1bZysWUHhqBFinrim5uZdWJBxWLwymFIvwflVB3S5eZGYa7NQfya2n7sri0RXQnJ+Qqr7wg8ZLS7/rCSFouXuPCDS0ZifA5l6Nxjg9hnbc3wGbd54WKs7DbTGV4W0Yd7mq3nRpKnQmu8vpxQdRVP+pMcd9ubJQakGyxByv/53J/wwFvex2w7bnU6QVjqIYY1z/swMJMjItAktfcTMi2B8EimPFdNWoVxfhajLi7//6NekQvlqMmAXAloUs1LQwuiQLg7xz1PoZgu5CIuBGDw7S9rwKo8KRjV1S8lLIMse2isfD0sJvSjDzmEPf76ZSxlCvcxOu5hpEcQs9JiVdPzmf0gZ50pZAeGwzY7bqKhil+/ByVhPPTYw5MTsMAXeAP4lZWzvmq7zWDfR90iYFNXqYCX6TLblz4fKaM6BMfHdCLUhRT99ZbZdurl3V+Kx2LSO0MuUP4Jw7zq3ZElOD6XvBo1H+nbjpmylbG/LDcCeglZH2V/bNMMp6ERmPmAaLGsjeqxTAmbEkd5apa6/BQirH/dCRVMrAg7eKn9foPfsHJbivvXa/HmlpfxkOkoEa0AN6Bg+ftzn6ECCKaAZ/1mCQ6nWjgucB4v3emcli8hSq116Q33yGpcPDW7I7FwWF/bqA+2AGfnWu8ypUasum9rIq8mSIKBkCvqPvOgWupVYeKtSvqxnPu+8Y344JMB9tg/HUCZjDcgYmOCy61WzHl+e93R5xPdN8C50PQ81pWsHyFQ+8D+09S83zN2P76X4TVFYCEgxbuH3pIWEDqXC+phWmpaYqiqA70XnG8V0cx9IaVkZNMfpdAaH/HXSBZSNY9hibfByUrAy438Bi9KFMRWXtARcFTDq5iWo9L/V1nczNdq2eXx1a9RKLLMb2X1CCaT/ETZ7HoxtYo48mQT+H+vghrY8KTTrR0wEKDSHNv6ziBbg8pTHSG8JaZr6dNdPfVyhIzMu8f6i27F5cB/Jpw89ZBl2TiqU6kcFVRpAne2O6WaWc9gutaTopJU/0gXP6dmlOpt4lkIVxF/APftiAuqTRCajSQVrcIMXUz/bEuu+9NyXcakpwFTJ0CnQl5bjMKK6ILmVK5LUNfSNJ7IJJ6bHpZLEqyfPlQykog/N1xg+fTjUuwFn8+BKVulsjek4I5BzEi+/5lOtr17T84lZAm64AGryicS9LwSSqJRqAZ6S+ewtK4J6T7XaQePZaKt3uj3dD6EDmkyeqgAoLUuN6L46bS1SWm3b5yR81wDxVoZn3Jd03bvvPmN+tG2wym7d5RLw24/LRpELIhRVfvTdtdMkJHv/XcEXR7Oa+rPhWZvIpW4JX+LVR1K3RqapZIRpYWGofihdoF5SVCU4rD8i8H/J6WOOOxXphX10mmXraJJhVgBzWT9lj3O8hu5h03ITRtI8tAz9l9DEu/uzixhLaU1rsjU5NMvsm9FMRrQp70W0ERWah8nOPlK2/y/+dwu6rkZkttbeCb0zAX1oL2Ug8wi5fCtplqPKkGEETeX9bLl3CuSbHFiICo5meCdfiXK3SX2gBmm0PjmJfviByPH3UXhbW7lRay4jclw6C+jBdhA2gZyzEmOoYzmQ9nEuEnYjtTaEYEqybmiqH+nkoRr9UlatpmCx5bnEsLuQzwSpXs31yu7vmQWeQ39BoF6nRSlnmc5YtAsfOoOa7ZzEB0odaxTCChr13mZh8ktJxFqo3tiGGGf+rfBrvBbuz1NMydfBsUj1Kpm+Rf9WJhzOnGz7YOCFMh4Y6ECy9kbU0XrI2oxQL/P5fMPcdmPxtdRms62m+KHCbbUdOvikohxhsKo76S3qiZPOiwRCx01uVLGCxn7Tru8j35zYoYPis507uHw8u8cRuryNuuUrVZ+o+CkLcNYXrInb+4A7krCiFnlBikhRrhOuaIprLlSQSzq6UR8ydekITB1FckZ+X266SMCcF/pHBOppj8STxZq+dOPNJ528ar+0slMSPsjdb2iRnH5YxLwiTeBApg4Es5Z0SVvO+r9IOC0m2zjP77LF0V7SGAsuy1/hGlpQljrJbFwy/jtXmWppOfCAuSn0Hu3RnOh+5gIl311jRHZruesIuJNXn0DpV0PGP2oOoAkgLRJS9GWz5KvMPrcTwQZyfLiNU4/u/IznPo6S8BMdFli2T7mIBaa2Ft/eSaHs/EKVDWcmEfryTi4s6t0Gv5Ok8utItTy6snqfvQxIo/XH93pBEnsbtU7GUrmFQtXX2m2wfnGIBMKyGd6tqcTZ12Xxr9zQmFbZVhBwYwFVcpKuwFIScfw53VIb8qmkwvzH37JxWWD5mYuLwkRPu85akGBe0nKvdwNUDK2tb1XzOcapp0QvdtKVHudGbpGV3TqqZYcyFwtyScHD+srZ58riZl2bQ7DSC4BqLM9t+B0aIwrLimYoHAcEeIcrOBdfjGbdyocTUqemuOZMzSp38j/XaCvJIyqDsJppor4lQCTFi3IyBgvu8Jdbi890I1fMgS+P9MEKpjYt/3ZqTybOQXA9PgEdmKowW9AygU7BeWRQXl3MTK63fYiEu9J6C1ZG57tLuMIuA+fKoxdpxrWALkVOLHE2Zm1tesVFyeLioCFMSJmkbo/BOppDn9rz8jnpo3H+G6V9qCdGmI2TwDu3LwA/vANKnBT0j39HLRi5eI6OGZCfxb04U0qe6TANTV6IiImxfzU9aQPt/q+E4HbUgfUIoo3E10La5hww4U7tp3RHMk1aJab7pVdZ/xsK8ziHDLsKOLrv7ogaaWTOKm7v4nlXPyqePSL5ivKvN3pzfEI7VAnvwsTM+tmbbTc6744ehYnrrHzntMn6+O3DTpQAUSLRNeskFyuRDAhbIbaWJWuPf3O9PSCN/o2JVL0l3RlokQ3ND7cm0hvR+e/THbRIDRHQFBrcssRLRwdpeeO/sce1jdUEWW6FrHuqmid+cpxcqtdF+IIGQyRGOEHefZ7BIimOn35FPvLly9vv9VwAaq06VOpz+PrUYPq+6bXeFFlBDrfhmPXKAqmQ9NgikdncChhpJPOU4EjJKYeIABWZBwD951va06uRRfqgFirZZMon4w93VG6AXor+MqiG2MnDNjM/r3BxUlneUW2QUhOZHwhFfGOOx5+prODMZpOvDt/HDhWOQ8CFUqgKFo3DmGnKJ0KJFuSXVqr5ZdzqYy5D/ToRo33OaWQOOf/Hm8szxZB9gY2FKVN2E8/eHW6GcKPqo5whdq3DtH79+LouBriWupg69cYIEWVkuqHs51PqiLIMotg3xsgSqeEhJW6P8wuUr8W3sBfYTdiLVZGT4djwm0QCzaKWGak9zyJT9dha5pGz4kbFYFwBC158ryM44dkekHR48dfnAHtmSKwm32KZekr2zAzao9F4+TJ7JuJuH21diGHRN01LmMwZ+X7tPOyLz5F0ZULvwVpIoavgjxZTNfDYEv6d35Q4tP3e0CKfzbHB7Qf02TDgUNh3tes7za7TScnedN4KqovSPJ38Fe2J/4njAw3WH/PeiG23TIBLERihb/39NfQAm6vZ48oqP+p2qI9p65pqSLvqyGB6JfkZZAbituD05SsFlFmSoMEIC5SLvPSsO1lvzqq9/hFzeiXcbadTGm6VgPW7hoPDSNSEOfNN2gQjV24n9A/1dmGS8hIpJSrBVGr8leHYyMeaDur6Og+i/PNXv9SWBHpwVnmfpxfovqJNyfIXjHvVFoBKRhkrM1VF87RCyQUwRrZ6g6IazrqT1EIiv9Ub1wDTaZWWP2vyAAVJQK/F8r83Gk/+A9tM0DNb5dgHNLsxHCIHBKK2b8qubrfmNubN/dICFKnWYV/8v2pKAxHXZ+WcRqRYL2xW+tQrp0tO6m4m15hkTZrDiVkClF1inK32iDnTG+4xq9thW0zCxyGMzI3d/GfJH/vhwXqpWha21ruLki/t9Kb1Hg4e0RsqT26DFyvknaQ0NY0N4+ITU31aObp+T+wIwYuRvgZqZla38Lg6ABNjh1aBufzFxaNMRqWXuAlxnwa08zm2YcuoDF/mrwgXnGul3kp+2rO9C5hK+VhFXmVWAvVJey19HvPSF7mDeDopchOyMA4xXzhELnv04XHCnrpbbkS+SfLTbU+uGwnLwvPiutUx0ViYvjsZptkoDxqYSJb/tVRzVB05rMwU/8TnxedjiBOsxmuAfQL5GwOmc0fsYDF9XnQsNScNy7IGknSrQrt6H8jxNPGR9J8L++uWoFS7/xpgaYBAevkFjHg0a/c1yilMNKxmd6QA702cbfNVEXBgLTRyIIp1TCqsdNCAGWK/kZEmin7Mz50/LkFZYPtksfVX4IO5wgk9c5aHvvyN2Ye5oAvxrRVLoEb7SBiamoYPsy+9kZQpM2sFm55On9bbwQtQcOUGNwcu7XgCO3rIbQp/qTILsVJ6G2H3dHkzPHPw94DkStMstWtFA7sxjQsbVqOwSqUjJ1UAI/fVYwGjTSK2vI5Nix/rgwuxAIBXKfUzkoVzCKULyF9w0umn5bUvDD8Yu76m5rYjnlV0RAvkTh1Z9YHfNin2wyHUuRMaltExnLFTzVns05KPGW9C+R80w8BoS+9+0aJU6l94xvgXn5Sx+KnAHESd4tSqhTLuF2pgBsSw4RyMjsf8LvRZvtavsMWMSAh/3zw++BLsZhlcCMBEsKI7vQA9yTLaTlxOmKg0xQvZifWRnJdLcsbmHFVfjMY3vBNfTivnX8ROtO+YS7EhEoSzc+PeuGncs3cRckDs0JOBBHCOwAzOhnYtE55rgk1L/NDKdqD34QuNc8XoezB5IYBB65aufXI03C4W6g73Ji3w+6B6KwTneYdoNS9BUGua1pXfR+qSZJbuWSf/3DJu+JCawU+wEKN3Q1ArPfhcU05ePksRQjKBtyn71wfQCtk7WC+Y5+kpsEzxHNFQrEWcA1lpXLGEXE7qWnfFbsxs4qj14EdF6tYVC9h06iriCq3mQgTGhbwmHTmqK7O256SYnkXFkNz2lcvGCgPnx0WSAHr375xsrTws7TggyJlcvKMd9vJ4hcAzN1hdWPy3fxjQQJ/L+PZRa8IVSSqKfVqvk0dJMepTQYYcrWZPsJmtxx6SRJpQhYOsvMPm6qtHvb15HIBiNhx5ZDv06U/sfkElYOqVrCvVQRCYc4HZDM4SYURjYxpVU0qOO6LOqF68Hx398d9+8xjT+85b9aBREZneDFq4pIoLrnil+OCeGe5zZJKUIUKF5JZ0j3P+n+sA/XFTU+lED/g8wrrgq8utm+oI8zu1pb2APbJQNXOZCFUi4ayUk90L4xQ4GzC8H9+yDU/3kJaydzpv/E25jY8d25x6Ozs0j/ze79p1P4KdkuDFgxVJc1jH/aWFE0TD92qnKSOulGDpQUxIY2GEQiRqMagq4HG7lrNpiGt47lfyzjgWLY/VF65/W+IAms9/9d/nW8VZ2pa0LAYD5lk8U+LKuMYbDiWsnMwCi9iWAboAev0lM7dgxxsL6mcfhwYjuxNx6iXAqokx3lAw48r/RLlZeHZTyPgglkXRasqb/VcH2UZcim14SD82S/iWfqYCFvdOsXZbKMFspriYTvteN98W5AZD8EOckw31d3Bvg7j+vL9o1587uIAV3NHHIwq5K0Jr4UrPD0XdZVTErNG3rsSAizaMo6BCddtXoHTYLKQNQ7IoB/mpMlcQXVbBZU5gEBqiNn9vVUwzHzKrLTdssctKZtN6nZWrUC1Zn54iZm8Wy8+Z/ReUFfh1t3nF4jph6xudXatOvAYeE3Yezl6uH8oKWS2D4ksR4oCSwrqU1s0pP6OU+RgKej3KYhFn9vvgfp11E/HuGeUpYHTzerbrBDvLFytG7taqE+k3LskgCgxTY0J9aYXXgzL6EqQjdQK6U0wNK5uL0RNWVIBJtkI7JoAvEDI5/co0BGRLsJINutK9NnSryFix66Zusz/HumetPfRQ+o8fTqiQFSc6EPz4gn5G6aQgVYMxVbDnzKYOyMNsf7xOZ5e15A6hexUGAx7788FxjCU1JJHQqSnuP9wH4XsLm0SVIoD8+ZLCOnT/sha+JVxZt8gTUWlrmaHkGjQ+bTPKk9JY/eKPr77fi7mqqyA+cI3wM40KEOJEx+pzUc/l+uZqOe/ZxcIR2qN3QlPHbLgqygCUMsx4xwlzaW5nME1R2v2JygaB/5Iw+ml0GknyVZvBRHiJ7YC12qjNPhfzl8J/rNRDiX1nQlffOi6neVBTy0J5zj7hbfQwSy04g6kXbp2IBsnuTCVq8zipej+NgikeiAS1uEo3RFFF+8PLJCUr77MQOCIEmO7PlDbcXe+OrwaX8dV3WSn2TVfN0Pej/f1eYpFZ5yqVLf/sNrOFrXt52c7pdYa7FHZmrhA9K54KHLf04QYeLictjD5O/NvzkD/pZNs512kfsdPFSQMhnL75r3uBaLmZd8XH+GRR+dlCnyd0LIlU0oI62Lm6Vt7M/JmPUNV0iZH6oBq+G+JT+pZJKFqAvlS+ByVRzs+L67T3TOXMK3xlVGsf58CUVU7zeexX87ISIS+5ho4lJOsNJcmS8tN4Rn2Ar4HeUfz+7l2puYSP57LCHNlHXFufmPPehB4NzGXoBAm/lPxTwlEPSrfTv/3KAmyt1YYTTW2/XRLyYvrTJij/dAxfUEkGKQ+heTfGXL9q95BrwdzrazHkKoldDPZzZWod0vwYo7Y68+ztQavLsNvumfekvheKKsHn3dV3/Xsj3z/pfelv5XqjHe5yOKE6nzlYRsA66sHzPj2BqrlddJrio8oZ+h2ziZ1XtJadDKA3Jh2wQt8l+MQ22tQYkxnv1cSA1ccac7jKzojk8kMqoPJpRS6HvAzzfKDVCpqcm3LNlhIriO81nWDEohSQD4YbbyI21Dx7DAgu1rkGRdo+5T/zKAJiKyEH9vRnkTP4qHJcpt24TvMCwO7nMXJFKsPnweAXruc3MOXMWzXknbNv3sKg/dKMmKR0qXkhxs2/g6leEeWatildvpnRmlCUsGSTn24jR0AV+8/mptAQXZT2niO2c9WjzVm+mZBEcFClyc1phSoSo0M2RLOBQHH5rLWGEwrSYYFE14lFkCWt6t1fNx+7711xr16HEXdlXP3+LMQP5+Uk9BQw/SBXJ73MScJpvVBwu+WsG6pny0ic/8R1wJmTI5OEAX4BqEtJEenBimtaee7kz2xM+TFaWHZDeYT2TesXZuk2sLABNYkYMMpWH9i4fP6hzI/svuZ7Skv1Ob5abk0HPhMoRzB9Dfsv2h1vuU0mZuNypiDOmX46qJWeE2UEK8Oem/TTqVTG0s//l5URfx9+O2409vFccgHP6kWo5J3b2YrJ8H+UgV4XtLS0vPqoKHhnR7P5keE4j+TZPQBRi3wpLzHpgVBSISjzVaGMeZoPgFwWzxZfQv9QVx4EewWgCHoMqyeguLmQEqPwKhYUL5uMAovD00Dk0qbRGkN2c2sBn8gITmIPohqmmD9YI0vnr1Ffb1PTZlEVF2zLbCS5qp1RPRgfNJcNXbNGk2ymUkNgewiEaLTL6Bj/9SKYH39l36C/R2NnzwaNI0lcwC4F3YisYslgsk/JXxe3H3CnQroO9uXtxyG26BJDS1t4Hk2pc7N6GZsSujRvig7u6UBxCaEwMDSKdr144390LYqHBF2d5xW7isyTP4T6zZ0NjWLCSoDvBJfskjkLzqz+/Cypa4BeUUj1KqQxRVc3FE54I75LjD5BlseU5SCoCgFK25ZPwylyd203d+PFZnMhW4tGTDib9wSldggJZbU1vhlOnpE1rp+RqwcSO/GLYdJOUdazOF715wnV+rL1I+L+IyjUanJEnoFOEuWxGV895hJHM02Zc0jKX5MLFE+EB9r61ZzqHwIXERncMMQbnoTmJ/ETCP4M1q52TArxlfZ0BKdmO6IK/ldc5fL2DWEGZeXmMKGvE30iGby2lXOhWRamU7wTsX9HnAei6dZAJoUYFgXdB8GjGxpvniweJZM2qs2k/7uuRqPaPSozXwr4SWoxxImcTZmaogfe1f9CYSQThKMJGTVw15l194weu49tSml+jrI2Zlk1IY9ELln/0moVdXZYQOApwG16N1Z05RRl9qF85jqCfv66SMq7UeXpoIkeHLRxiB3Tf9Q+CPLA5q824Ryg1ToACBGVlGHNZLhk18e2DGq/J+FV8wgtoVjCiIPzQGHDNYInlGflsRFxhlh1gRdgxkZkp71YFoBVal5JC8X4Y0hHH5akl4YEeMADVeDTnxWTSWNCpQfRqOreS84DHLCXIdPtFpOn7QdUrk8GQcD+cN5Bk5FMgCfnXtdNifQ6uxq1nEFzczmkEzuVd/2K9NVm+zBkOwIxn3F4Fj5My4ShWjicViHUQhfsIXl30OxWLbq7MQ0EMgnhtFoiufTFGi4VZwJMsLXviuyJofcwIBd824RxtrvHLavSMEvy6MeMcUH/gkc/M5GO4raT0X1pr0wYPzmE/j+1xNu8tXdKvDJhaO2N1jbXbkPyGyNr7itMkS8KENKeF3rFJWpUyIAZWnA4GZySl+LdlpUsEGmpwzRHhGzTs+tngcIkQORGNf++a8z9x6cEUbgpTK+4wBhumrUf6E5W+aDWPy9sAPRExuOKncTmdr20tQpKaGcKGojSsB55dx9zXQk6fsWLVZiGC+iWbc0o5GelzCh2YydOP3r8OLS0VZmjpooNiL0bSBJde/br8IAW0WkjhbWQKFObvXPjMDNWXs3gKCnLPN8LtzGyYcVdTbWlNwaWkULNic+nNurHpjOhgyiCv29khTko1gLQC6aTz7rbNqGyEKJAYpNCOYULGoIepmydS+mIrjHx3RoAzLGp/Dx437GpQYUKoap8D2ibebed9zJapcqIdrbivzOWKc3/t38owYnnUUBDpswQr8nrKKDPvSqX+uvQ9fB86u/w4y+e/BSeNk6JGESzal62s87aJJlK7ewa/07uuKVE8YLiQdWcgPGRUsfkJrAc0gc1SchtU5WmtwblW1gIiJ3WSq6iXDm7kxVd5huO6SWaTqK49nrdD+Z9K/ew9ABBc3lVXB51Y0Y2vTocHBIVtsQQIQ71mqOWyMDYY9SdAr5Hl9oIjzHqlGSEMBI+Imwe1puv26khr7NIVXn3dqO/M7ul5iUaWyrBDPMHvEwSl+A6xLq8jdHIU1TUwkdITEF3xVRyZSr/Z6cNFKKi4VLhPV0X0GpF3zVWvNDfny9Y1KtV6oAgdTlRB2tvO8Am86eKlKgMJe1BZPzq5/xrSTNCDAYYU8RLgE9584Qc+h4TtccqfMtqKwFMPRsAdGXUmezUbulW1JxFGEonJpSX++n9nQ60+9yzLdn27iWlO5r596xhxLBw+bISTfohgT3lyN5GDML64pSLImUv4XfXKhj58FZ1eMnSLdyT+sfz4/plNTqMFlZWV/h6ChTVe7rKCDfVOhlzxwWDh2F3kRfica+vwTnr/wxTFhdnPbyV3IVD070qD6i7IqJYslL0umU7gQBcDuQ8EBA5u0nJtq0Hw4hxV9H1RJAG7D3J+3ZBK9hMGgssHo7Xe2q5WpPz37N0YLH44olIi5bYzXQZxT9lrVTADJTt6DDbepek/uGwX6b391FYxHzKcXYupwUK1zvgrBvDsmDUxIbddIsrGd6QIEso+aoVXlhtJ5bhpJhwma2fpThN1WJpTOa0MyuAuqBu7Q6Z2U9QvSVUHoBSKAdSQTN44JaTzHpHev2EAa4fiUENR6LDkkJirt/m38XCsljMcjGjRI20Op4xUGwF2RivUu73QsK1wzMJcZIGZQgcXpdB6nqvooQv8j1YUZv4Wel3s3G97btOash6EG2cI4vCyKga9n8zaFqW/oL5hkXH90IkRUyJ1ca8+RsjHM3UvcOE/8Od6cKadipfxYd3shw5jP7Cossw5xLtYVPGkR1Jwx8Hr3b87kq4NS6zBgBJUgYkabQYG0x/dv0Stb3EFhnBpBgjJF8BVkBWmfrlSGahfDKw1d43dZdOBtR+KiKvYPEiB+Qzp4bI4w5vBWWhFgv2q6e/2FvTINYMNb7owWTfgmA7yLimyHXK0kJJ8aQKFsZGhBo07JBwdBzOiFTMSsiPxNquEmVg5ydZFjJvNuzejhaWyO+kZZ26eV22+gOPY6AuGUPv2ykaTnitJKn6/08cRJcqCbdmvZ46BfJYM4qu9KnZve+NgNmqwltyY5rk7AqkcsH4vyZhUQ2PW1cQvNuFXlVhElWcsanEJtUsOaM4lg/bkYN8Xjb5qFW+n4ND87x1iJyfsWTHOcwD3Qn1eiAAMEdJPGejsXKi4Y7tWPa5f1svEQe4KB0vfrLd4yjObppKlcOWXbi1hM8gh599xwzTZ8pYG+yKOtNqcqbG+IZG2xBMgf16d7mof/oWsgIxSqFtjCalzVCkFg/zUF3cxYy0vvt1LnDnkRH8zHy5Ax5zBLC6IMGIu261hqn7fwoW3FbLoZFM6/BJoNOOVofrxnyJYl8xjtCvwingqUDVYD5Ogrq9+1M6H7YfQ9MZijfr/r6ONnzjPSYXJVXM2oe0qSP6RdXgBeMCLQMX3A4u+y+7WXPU3MB0H4Eb4irKxbJ3pkEkys6eb9Y1k+9TdYDLqxBQKNYH1Sc5kTsxmCgah+auPpHo0fSet7KchKYiEtFvVO/keABSHAXvL/EUYoUsG2pUh18WBbvjLF4UtKpuOPssy0OOcwXOQ7H83f3WTpeLASgaM1aXbYTfgi/9JQ9VfOHsFy9xAWHPlSxc39vEuKyO6dzzEutJ+OnHO971Wtzhx3exrteigCwgP49sf1uUe6mJHbVYI5C+ryvw/mDAeYh6PsZBFPEzdToutLiMrlpZkSMarK8l436+1YwufOlnHB5OcexPG8SdpTaVcl8nD1v411+weQzljCFROqr+M9K7ZWp8FCvmiSuaFAWu0MKH4ZE63kz6DeWUkSg+5bm8CxF+mkvsN3YpnLrA1w2Ro2bzY1wztnSq/fVPShFuWlUi5ELV2NgIEtbKydleDpswBq+XWhTy8mfsYOyAx/+XHz5wXUtvyINZ0yIKP4nxjJym4afP24GjVcAFgFaXtS43wW6f216PZ5CNKnT4DvM0Eexip3cg/ivXZ35HpigrjVIxrSb6JKjv71wXiGNmKC7fYLST2YGnPkiAeckZdWXT/U6IAB7yqg2yWUEKPjSgxHoy5TChJ9E5k+QuHgVI4V4uNgaXJjRE3zpl813lWj0oxUfniBeeFM6bsId2/lAnx/wlhCkTx3Z3Rx6AkZ+hnUqo8lSm/H/GacvLqYlVV1RuaOzibyPALYxHACnrdEE0bBnAq5gIS0h/tkmXdWEde1fwZNiwyPHA6Z0wX0GNlL0DsnlBKdshK74xCWYa5slIeKYUQ0qeK0M5B7AHgEhMHvYMch1pb1N1i8BvM7NUf1YTKpC7fTJMsaW6n+R0v+0PvIW/wT+BG8Vq2F5XblrmvPOLIgMll/MVgPoi5a0H7veul1Q/pvvtiykDmBbLfaBdsNumncTXJ4r5ZHBOma18b+hlWj8WmcjQ+9eVyjORJ9nBh2LseDx3Pvli3d5jYpSMw7LwHJtwjTGc7umE3sUcktOR5bnKXmJRVnF/HXeFgEjsmA9L2/rbBz3bXZEPWvkY6uB6yF7NVK1iD6yhlBdWJka2ouHonQ2wVCUnZxpNwPeVHB/U/OJs8A8MGnWZ8VQk6nTodCGX4lft+n64xX9v3LUAzmFZZFKXOIw1ICAfmED8qja/GUsGCaw3ZwUHx2qizW+kFWvp3zRd2yfGeL64i6/zi4yg1YJ2OmMzviUe+MajtvQlgDcnmP5W9h1kKQi16rSIgE0J/dMqVDJCNyZi/oi6sUVEhuWHSJWTe/qQ8KUaLo5sG8KmYGeM9aQDhDkYigKF6VtpPlb5jmYKJevXYMSgXPD4w5m2Uplo6LptYkNIhswb2PwftPMLeO8rKb+jh17i1gHln35FSUgGJxsOD2+jiXKY58nmpf27nVsZIy2zhdgQri+p28uAr5iLFbKXihEKeeISoAtfjy53XnbA6bp1mF7jMGdeDGk49o0ziKmieH38nPxgVMO5Hmnc85NRWffqLr5Jpuk8shhWOrqNPeL5RBYoWELrzI4nB2F3nz8HTc/0jDK7aPt/nYtOHF4W8IrB3c6Br3drCab0D40i9rzXWd4CE0oBa8XWGXhBAgwEZRL+/+1//QPkhByVNo96zfkHUd0N7Sp6nbI845LUfAdppUMJRyrJ8tJ+ugLLQ/i/8GrAdMIUch0z3V9+kWqJ9Vix1A8K54yRqmH1+DdeBQNmceyamRi6eRXxNiEJfytdmfosQ3qXPlrANuq5WqJ1XW54yiJskxdw17IcEqCkur0cWs5DC5zGTXmfhfnRwzRmlZ4gu+qWSZdX/l3WxwP1OJ484d/WY4hforyOEI3maNJ0LlMBiMd9Ye9a7fZ7B9fV8cqocrQRpuB8iIZjVRk0TVDyQcj7K98DlZIV2f/6AZRDgjZ4NrDX8NWg3EwwmVkhK3LZNNJuxHWJYptZw6iGZGN3HJMB8mH+ZHfsKQRA65BR8uyW41fB7qnROrziEbUeJ0gjVLYKfKcnhcpqNZaY/19s1G7HSYUgKQh2JNgeqWDGEZ6l4wKlDZEisXnzlRLcQto0+7lBxRJz2f/WTXpiaqsBjnZBPPnEu1aYEbTOPTjE2yY8OJfIJ5I4zyB7/rgzk2aRDiqAuny6sPDPFoIlRxLJioOw28wN1F9Qk7yApA6LulKuex1sT/rsMYeKuEwN4EXN9zQxrZpGoH2GSWKw6RwH+1QHtZbDkEWJTfkAvzD4zaaaU2KVHK3joF81yJRV2xUBOrAMhuZyoGPWFcRElBPjZfthJRrIWQM5teeveoYzy7bsMBSdQ9RllbpG0ggOnSfnR5iqbKBOKH4co+bGnnGnP9AflbA+2cl873R7eeDIpPhPQeP4eg1Lai+9nZeFVO1kImLy6IfBKGndoBY48DXuYo6kpQM+DiUGMX3PQ0JS5CcTHsTDvqVM+HRDbGzaDJosQyto+6mms8z/gRcP/VCgD8S6qBYq2x0GdByE1hzrKy5xRi3ol1BSHCCqKIJW3Ezzc99FB/aAwDt4Ot3LCOa2Q7wXf1qJAP5F09/dbiNqhL7GUAwQzFOYIBdrdutZLa3BjUUZq0qV64JUVG4hruc3uiyy3FBL4l3rAUucd/uVsqdNKWUoxmQ1GyUEyV0LEg5x50SgtznibLYIpfpAA6oSVLkomkP1b+7p7HpTi7jsSYHINorBOWsAnQ8/BeFjGtDVhWfJJ/kK9Zh7AqxGe4pxIDEChT1+3L6mEXwQkxMarBXo/r+oLq2K/++JU47vM0ZiHxlApZto8JUYYQg6TPitONICHYhmBRnXq403trQA6XnXSGaw9ixLpvQiZ6as3iDnjqnTXzjVfV9qWwtDORNnsWYmOCDcHBwd+kLvHQrTFnXTYdBvMZ/8tYrk2aNgMi1gFcKSc+HBRM0VGcYI7+WKdEE13ABOiNPgcPMSMcPiX/Ia1lR7kb5r21s2FKDsT7In2sB3HLXchZ6Jj5SlNIvyVHyfGRd0EQ6Z0Xc/5Y1F495Z+V2HR6hvqy9bEZNi71Wiave16LoXeMDuJCWHCcOy5YGga/U53jVmD12OkEjsiUJSepBYGsTys+wAJWukxjayjZW2rsrLLoPl02oNmBLTdDAR2HxRzZ927vHYZbNbolvqvSHWwJXZ501+FFjHcyfPqZ2fZKGQT3uemiaiLAd0lxZyzg1AXf7fmP/JbpFZVxt802Sscycjr6HHUGgh2Lhy2KiOVL9Fp9uwtRIlPHo7qfBWnMo9H8+8UVSzOXnLQ8rUeX2DhLD28UA+1Su1cXK2n7+wXlnilq11Tr8yOd1l+oMA1W0XAeoTX1f7mKdhSvFM1KU+ZpDjsjG5kviRCEDK8WUsFLcpju8gWTiYRe+zzqbr0/vux01qi2iicySqRP78x6SCFleRRIj/Q31ZkWXUxL140o5JeoPYdEXcT1DUHTcsj1Z/OSEFFD+yrV8KsTBrSwr0KQmEQGbGX/j4CBQVLJnoMQqVfb+5B820C20gaBGHAjcCSOTjY234BQ2etIy3Gf4QdF6jkVeue2mUxOQyTs3XrpXln8k+Jq/qOc03IBXFFGbElZLopECLL44kc2UAKTwE9Ls8P5KFZHsWyKO8wJL8VgeV37UscfZaBPDZqLGVMuup3pousjiv+ehQi1xMjUvaX7L/sgCKJt79QhgvoWeEQKXO7tH0+t0wlSXRT97d3c57CVpPfdr5u+GsOmXwB1LSjEpfV90yYDCr1KOl8voGnCsBHkwHlLOtGuz7oI9If7UAewoYHnsktpiIEfeoHr1CxoP8KPI2kr9u5L4FHVSKBfK1iLxTCV1/Sdn79kluvPeEfAX9DUHg8xbA8VpHUJfqK6oUvfE6NLfq1B5sREDksiUDK7BARb3BiO9Vriz0TRpQM09N/P6Qj4+2OnXvkTHplbT/ihUZOp07qmIOmST8/Df6d5FJCYPKdVrmuX7Ii2EvMWvBnGyBEYyND4e8d+TH+YG+d8Cm8H6aQMY8rBo+53bw0KHfO5gji33+HV0V3b8bL1/+it1oF5zj9yKd8YBSyCPBJAOkY5wKku3iumqbA9hDf0yBvwaqPz4CX2jSwjG7+XwemfdZ2nMZnDM4QQuXHe+ticcetBURJkiWgr4DTl7ePDfMWO315FKhsJVEiUtc9HHq4uekqiH3nIdQdOVMSHS1Xeu44d9bn61JaXytmitKBdofDEj9NBXei78QIbr60A8IWUWkEQ9LYLf2P3TOmtEySK9hk37Kpi2RhyAL2w4DVbwO33E7EuAtUTi4TjXXKwpt8yhdY31l4usHWQYpaVewGmJSVLgNpsc5mYhlYB0nVNO+eX3iHopr88j5rWney749IvJ/fe7BEB5DYCcShyM4McOF7fgBB80w2KhyIF82ejr05GMjFG8WaQZOQuKtNpDudsdQyHBbd+UlHfcvfd4mehpixICiGrBmSCfPa9GYGKwtCp2B4Qo4m2AVkX35xRLLP+F+5JkiTx961chjGY3MjVyeoLk/qZe+VFwjufHBQzsVbCijI4kHhZ4iY+nllM9XrK3MZiDoDS4We3iMNHUjZQAzm+/LujmBRkkBw1aR2bC4xtQxWaky+r9FkGZMofjI1eT0MwNFoSPemM/UONBoZRudhYIWBbYeSc5fw2dwwNL0la/o7gsmKEDF9RbJsLr8gIaCvCKpNx/29IMUX96LEAwTEf5S94lOiY8sKvdbP4giuiVZ8kpuk1cu6TLVSvXTCgilJxq3qjsxm4h3+6OvkgdxiBGJ2gRkJs1zg75uIeZ7PysgFkumclsa1b88KefwrLimg7rUzBB1KbamWWD29QPLMFTC7EaScTKvk71MScoS2GwsB3wPW3RYbTcWPU+mJSrTsIEnxQsfhPIBRflpg4pDXxfE0RoRSF7PkQwuVKmcbKnLt8COzKirbEe/Ajho8lVewAlF0dwbp3uqW70dpxr8eli8DM3Bo/WIFo06bkDqo4Swa0OwRmo5kjL/SnT5TUKwVC5XRZoZZ3mq2HosRD0bcbJvDFUKHbMJnUzjTJ8qaxAVQD3BfbsSXUoANTGWUOPnxX11EZAohZAcLM5FZYtGlobkSWGkQmq4thUJ1vSwbWPFQig6sktmqdiG+B/VvH/6VayOJUDGf9o5VKGovkXnzcL0VuOAa/XQCzShY0Il1r4NAcmkFe3iTvWL3uZxutgg2qGr+2IQC3EKlXir01xsPWktREnaRVvO1kVW/UBjZH4JWe+IHI6ywu+N9FYOtP9aDZKA/mq3TrcqgRJ1Cwb4nbksD1GPD2INxn2VseNraivjCKbl+ULkfV5juiMXwSNhPr/Q87xuQe5ulCwDR5egbyBgVpaGttOIfOZJC0IRupJqgzawO0r+jM/tsr8Qcvdqhdh4W/21/ibaOp6d0Xw7gJywgVJh8/zSyGsOW82FVOLCDyRceMbLWjbVSXr87YQ55CD1s2EFoeaMjSaeqy1f26mrgODG9Je8BiWry1I7CIHY7Ny/KgAAsYSBl1OcacNxkfGU1RJda6cH6maKCVQKokTf7nQ+FF7aVczsT4sZrDIlZDzjC3xl7EXrcfKboXDp4YLIv0BIFNlNMetPEiCPi4bT04OvBGuQz7FofVCWdUwb7rXUpz0i2SF3HrGY5kLM9CqNAghdgemKqXt45hBPOoJm87ulMyXVwbJzHu2pWLaIYaN8l/RvWpLNMufdLalhrvwJ1i9ZazJqToC3SNg7Yw90Sh02UVC5ozODxozzK6rBDdl+SVtMvNxhva4SzLB+gQjfUb0dQv/Zof5Z1lyJCyOoC3EksR/vr575Rx3N+QIOduaeGjlGDjL//6kvCQVEri6tM46LOFSL/fHo4i0y18jLSq5fkwvF+reYlR3B/uouEQ3PCpoB61z44nnINfChAUM+qF16NImGa/ZPHrYwPlW5GHUeE+A9dU/Tq2P+no0ltDe644k6Llj+wYmQ6OrM4LWL0C20CM/SLZp8gMo+tFlU4YMSLNJOnnUKM1VsEuJv72Te5wC40baPhxMuakueSaZq8hKHth78FzWZA3rHg3a4nXSv0VxSx+kmL6hEpdFnE0/AmzJhhrgghDtiRDu7ayTxHD2lW30Zoi3NjkMBfGcGOJgstQMjFKZfMyZkROdiAxBhsDgWcWWaxqHxIB+XaAAUP0AHqfCal68PK3BJEmDwGfx68En6XQtW1dKIn1CG8RkZ7YmHCXQxXQKD8vO6t5SKKDpUkqTDrbeXjfeOb2HuhlUTSav/xgdcJ35ZyGD8JNRYfj04YUXUDU0fmz+r3jWqKgLBgbckUr3hdJkZ+Q0I+eCj6v5oUc8YGHnvAUiyEZFSnPqJjoS0X4K/UJCU3JwfgiJchwdU7BDsKtT26R9K25lLakuAI/WGiNHsly7iKrh4SP/cz7j2XCZj3BQmrFNkoei33QpY0m4tVs2vbzN641TI4MmjNU7jZ/Raz13myIJ1Fzj2AF6n3SP6MohAaaJh9uHw8tm+1UOxPlq8VWwtbVWStHgLheFFpQhUphtpvQ5pe+JZepckKvrqSZCLeDxBld4rlUT8dcr1CqXOPiphMD1epXPqNDmxzjWjXgjio36/U4Pxy128falVJt8FLRd4mCgTwT4zJ9wL0ZsIB/eZVyxAv+8RLekb6XApMNg9vphlt3UUf4IFlWx4b84SSsPCN59BQvAXwiGk9uyd0fXHr0SMeqPGLEnrTtlhnw9cQwfO+Finky0ZJvtsPaTc+iqu/7HDgSjcmn0uAX9RRUh3edd+IfLMFFjUSyFKnLvZzvTBgMIqk2DrFeRpcb3DA5xHck6ICCmq7oQ/iRPx9nROx4tyBJgfPJ6ZUl1hz27EKiMKyCMq3npTWktRjDY7eiLT367vLN7WOWlhfNpBGt604QPKv6IbonnErp+GsqVc2l+l4XXiss5aesv3CJibl88KiVQUpWtKB13YYrZKunhfkVrbA68kzbSxdXOwy3Zp3qYWX6qCAsqtuavjypuMQAzMDvSR9vsstkVS1aeKYpG/XPoQkF+Onvtk54aOWNeIkPBV8pBVVUdrRNLRrTYCogaFuf2Z/LxOfzkO1+GdO6yk/T9f1WqcgxfBV6+ANf59ZbvdtVm2nR74Mnd+qsB4fOcUZs1jsuitlDDgZOshpMcVVMRsG2rVWNWe+X0yDNw8EDRiFcc567XoihIZDH0oKbfiOYBZX9MU6qzWYg4P2Scz+BGFXw1AnSNTSaTaOuw3EsQfsPTfIu60d9FOLW0sPhbo3TCGv7DPL0UAegjPlCDbzMaL4fVR/H0yPhPsSc3px7IR08JKseARvdPc+rg2BSX/3bX71ZGubUIdorFter4Cbh3+67idht9Rm0htrRwKxPaU/jfkW3VCzCW1Lmfizo6hiK0Xe5SIUfG95c7UcJ+l8nmlMEmFXYlqU+V/efbX7VUl7WRzQ5KuZ37fPvRP58wczxXFfbYKaTuHK5Q3xQZ2hv7KNlBRYdFQKUEm0WfCbcBiOiSlfLOp0+Uf0ufvMqpnrxOWJgAs5t1YjUGRIkyeU7paQriZkLGV3d8l3WMJBOZqgjYoAJehglmO0Lhf4Tv1G5ePugfxlW2/1RPFfWXH73W/A42QFwMhSIh4gJEIvcJCrmQWrmAfI7QoZaiOHdgPGQg1t19eh25+kogO6Ol1HB1O/+klGljCAJ1c9hN2wMira/1zY9EdJjuMBKVmNjFPzgpA8SroMB0bT5y2YasOC1/zAzr+NfgGVhfPk3VJpujm0c0iR2t5o2vg89ooQVg5NLOj44ZVYlqOKYxwws3nVOYlPLA05cS0t9XBbxs9WnjFlafp6gL7EUdHSC2QY+0dMOyRR1mHBVfFf9W2YjI9jBHsn2qxdB5JdZBOG6UxX7HQVR8Wma0XQYf6phZAObSVnxgWYYLuJl2P+F7dUKMYw7MC94v9ExPEi87an9ZY+6zLXfU2UJ/Isu0NwOKU8ToDAMCW42daZr9Qdb+CZv/rirnIAsq+nTwGNzPAabOTxssumHcnDuabRlkj9gu5tPeVTuEMl+5US0h23sWdC51hJZPgYps/sCOc61qV88YLJeCjfIRch2WWSvlz+4feTxfWTVQWesO6F9xfBuWfN9hk35NinC5evJthX2DJRBu4WMOLFhOJ/fiFBixeSW44LMrt5QSQkrD5PK/a1K8qnd/HqLDL3cqVYRutWXIG4OrYEKC5oQ8KHgqoshd3S8vsGOC6a1I8ZtT+1Ee/rvjhInRWNVGHdxQCr+6ud9qx4n2JgqnQR5rfhFN4L8xQ6m8WFe70/hGRXAgUgSBPCRj2/g2sNA94ORO5DAUP4//McziUGQCjq+dG8nnYm+K68DV55W3spNFIZvbfxGndC6Gt6bq22kFx88150MQmKxkTj0WZ65jS/LFA1YFyTq1/5EOiOE/p6I1GEtbhIj7GFfwa9Cj6iqKvj4qWIoVIWfaFyUYgI1YXXb/inEaxvST7lFcTaWNz/uB1dFyTcfr7McCO+UBdfFU0Cz8KurZP5PKLMyZHmoi7dRO7BjWFcSmJuZUcFGXonyy8OquJmcR50lKcQcVWKHVszrzy2FqOQ6mdsmY2WqyH7QD+MZbqxBqfZhbj1Pihx/W75kot1rBIxh52wkdLm6qMNtTykioadQBEQLUZp+IIxD8kOxRo+cs7s2b2FGRwCPjU3g2GX1pAvZN5282VGXDKS+4SkjYcAy3WQ9ClYRn2gOaBlJ+aljGG2VRuvqLoyw/vtsuKZq3hrz3osm35Ip5vw7cIxzzf9E206Sv/G38fnlPA9bESKDZbp1jhOutMSRDcYc0JroKhBRf8R4bRMYgyoGlyg9ItF1IZkuKGIzz1cwGWA88U4L5tB/+QflICXSa7kIei9cqkDb2gUCXbWhMriZPSmrvqf90A1BFV1BqvS53/cLwQg5k6RUj6onfUDoLz+Dip7QrB1gnXrSJzsZRcIlb9nvqL6SA8CiDjaXaW51J+aTrJmBmaEPxSZjFY6TpQOiDvlrHyP4iWtVcdbeLiHtS1vnJo9hmeoT1RsaQmSWf3eNkQ+7/cbq6IrbdAO3aTDH6o1lquKJ8ioWMhfcI6hb6WuJrTcEMlEDU9KsTYgxQd8OiZqZJBKk+RYwLw8v2ktOZ1AoTy0f8253d3yzocUSb0IrKFcSbBhQlpFIaxujQ2QsIw1Bu56DkSQylIz5ZRVPjkTJrDE68sfu3CgHqdoO4Sdk68cdU7kYQRg4wD603/wf5KIwdO/0p9+i1Bas3XPBtOnQpzEj3BCZzXnFIFgrvITSxdjpl0c3ylRgm6KHa/DlHaFz8tfAz6KgPGCaF7LERoFf4KLsVQMbnQCzheAbgik/fClLruwYHJrkl5P8Z05IaYW29t2dDR+insxh/fE9z0ElQJ0LfDnUeGOpzETWYKP1si4oQY16VAKRx06jraCDMlja09HFYulbR+srg3jCHCzToNM1TNEGPZwO3NwNsJau09+lkwoK66q3roDJTJOoZqAjaJ+e5uQWsvoAoNZ69SDap2pNgXKJpf1lvD7cbzNVZk5y130QDZXkDsRR/xRg221ADz9e7VDXaDzyHbwTx+0/+dwXLNfOcsY1Ky7oD1lON2dNb435DmXq+QFRtj+5E2PLQJWA9Cts1BF+zDozbO1L910jGYV9BJWE3VY4INxbVCfzFRm03jHzQSm1XXsn629DaN1x8evpL9Xv/oTXXRid7T9nLtE6JdZFJBy+10SnjyX9bLciw1tNU0yJ+tLyx5Ah2QXfaZst+Pb0+TY+Nlf9HA/GCEUapO94AkAZDsTcO1XbB4HBT24rAcva+kPa6w7UwswrLo95wxjJVLyYbp3bRAp3/Mmh8nyvBh2A3u5OTIH+YqPzrsGlowULwCHXnxLLQV8vkPITHeghLnrxVKhARIgtRP1r0pOry9o00LXKnmh51aV35E5dPk4mr+Kn4C1tpjk8F60CItGXShIRsSXfCZEPEJNg17hZcsSkieCmhQYLAv/PGByhBgFRvLAPZ/qfh4RUpTDnKuxizdpOUSk7Y9ctNvA029Jc1xWX9kTFyLxznd2he6C0lI00OAAGzJxyYHFa49wJA7geva3zItBh1RtlpVPvr9/akF7TYPBe8ivGzB2BsCrNlfniGRBTCzs0RZyrB7RWcZ+T3X42kJdhm2MeUG0dr3elRWyzvzRYDMrKNBbQmRv9MturICVGRJvxuAnOQCcppfiFk0/vZSGM8k4ns/4AJeL7yCyYAoaq92Y3c91wqYkyiF1Fpy3d61iACOqS3xwo7w87b2KgA7QXSb3URSFV3xrlh2brnD0OksxCLddZwA+dlXBGM08+k++jS2SbZRiipKTWC2azjs5suCyaq1cwbAG6hm5Cd6/DYIji8NDsoSrFtCB37iH9bi6gryWjvGdxNRXyYzL6fLP+6+SH8OaFrRRzFgkkE2KkMuuZMtJF4qCxxflAKL3SbVhD6nnHFRejm9t+ao7r7pcXD0o+zZ+OnAONQV9WPfa1haoZWMAFQOzI2W1T37XiFsHaeG0uHI26W8MsjNN2rp1zE3GyIAymS4UbLAJKNFq9RUqAa8eajpGD3MkbCISpqqte/+FwL8P6bvVAV1mqXLBRuFP21ZD2GxyLbojpMNBa3YmCZNR8fLCigASpWP4rgUpCw+Otq2GSnBHXykc/2JFKzbXl39uwjiGYE2cW73ccZGZ0qNTiYcgb850+tpvQ83XJr8bgItRhbeKCydvQf81kYuWwe08w6k+tPxqLOtIwHx3MBSw8m7CVMaHV5KtZ1P2sYAfs89Z2My7YeswiIhJxgnXGnvyxP37A/6U3VUlLYhS75ZF0X1nlDTsW2OXeUovW4m41bqcXsP7wZgdMfFIUF7XIrsLoL3ACAWa7nuUFF+Tevk147pjxj70n/ki65NPuBS4Ma3koZ0iDK7sNy6PsD37De3BOS+t/knNcJwPvMrN0YEyZSX3apdFcb/ZeVIkkPu9e5sm2y/+gKCWw+fa9kBZTsyeK0uq/KWWN90VidpXPHc/gpQ4rLrKrdPYzlhaFPAofttT7h2spGwbH3/WAUdo80bOb8WRHS+BanOmQC8pl6CNHcNgcHKIwOGY44pv6bjpdBVhuokBacqtJ4WYT8zjyFkdxoVOgFIIkjSftP7L5zy/GQygPshMjr05Hv8p5dtqF+TYMq36VE5jIJp91Xw/d/2220Jbq82RdrHTOo2uslhUusj/zOGNPjfJuK65J4VEH8lgJdY4dk7A30emInmlaHC/GVZR4HUWwDlbGJKG0wA35YnS1wV3cKOexXm7SrN1WYPx+MyAsSSiWjVtZYghsoIJPeNfs8j9RYE2ld6X9om6r2jWRiNT3dy1Gv5l6K0jaCsaWT6R3hiVMYBBJWCsH2y0Uzc19865At1a+FlSVLXSkOloFj61JQU9xAwvPYMNXiq+3bC+GZaziSHvuOLuRzAG75OU7te04x3NCi/L+LD5OPSNDHalat/dfP692uMIEyR7wxQNSSQMwyC3XrDu0k9K2TX8e7GI0IDRcK3azZuyia41ZqMb9wN01AFqf2z3T3yl3UdyBlwNRLRJZzGdmH4G6THWN2ueSK4H1owIXqTJpCAgi4A8fIa8QaJ4YVJZbn98OGhcYn538RKGODfSecSoEpTGBb+0kO9SbgXQvNBTrvBUsVKXm4UfLNzLkH9kTx5edGt4n8LCkvdrpJcA0sMCl/1JtQwnRtKut2kUY5UFQ8B6eeMF+oyXJWiqMKGqiJGGdLftGXmAoNZ5kOD/V0Pfi3ddU/dGpJ5kyKnyGohfPcYwWS54mQ7z0av3N/Ytpvzff7pSfvRFzZ+Jy8UlvuK9271IDz+HaBMQbunc/BAHFkNnO3bvOVLQCJu/f6JtB+w3Lk9W3ROlCN7NiFfllzoaGrDOpguqQL7Mn4tNf3QyIJtm2DNDbPa3eEgtfhkcKI983dR0uW0I1uCvZRINTgHnMhOHQfMgB60V3yNKzftzYnhg6IEamOp0j5i6o2PMI4s0N32XKNlpuhPUjI031ZnT1IgUEDz5q0+Uu3mpF4tQ0ogOU6tm2euNQ9cqBxiDGnMGOpcucMbsp2Ce49QZdaV5zeX7/j4RyeAR2QTCCEuz2usuva3JknpDnGDb2kiaJL/M8Yd5yBEQom3IhGZqnFTtecByT6cOGr377nLJOXPRGMIcPrzS9C8paGhKuNes5zgeMePM4UrZxp8btsIrM2dkOpRymnJo4IdxH6sq6zypXklcDJVCcQq0FXg2aC8NAqPBP2DgJR4nbFNMuTBHouUV0XGkHctlSaMrj7Kj3+FtsaTjrWuL3ir9hcib7FMjUKd8+ASUqtKudEV0ZBAE+JXW1j+hTxHoDx99hwg1drc3npRXDBGwinnUj2JDPWIWwPacse6LjMpzxBdpi/H5PoEb8mSlBdFcxGkD0Wr80DNZuuPJpYqt07C3b0eioTkCWoXsd490OT+OSrhsFtXm4TJTpKn/3IeCsd6z25cxMFxpf/dA69QKfJDeURlDYhRtRz0RuKEbUwULdDZg7+qYFK9681OvMucI+CvIo9d76YqceA4m26GEZy91qrmWztrc3Vr4SVT65iHKu0AvWLC/NVczn4+ttWD5TzxbAGcrECnQ1vq6Zt8ojY1Zb4inU850RSPAf66eN+i3adVqlOfpd8PE4jmuBYfp69Of/hJatWqLaUMhTXGCLpjcG9N5GJ9EGm65lVyVWrzbgppjgqQaBxxuiBspGntJMEUIXj2T4tEw6bPE6SgdUiVFV/DqQ2U14b5yL5cMPatSBNK6To8wpQbPD8lci7tEZ0d0PnNxxp/r6kbLfvWHj/BCegxucAsZCNcalzyL1St+sbuda4vpRbRhI5fPolzhGeA+aFjM03bZanMVQWrPMoVif6pcNIh2S+KTYWuB61NRMKvlzoLvfcGjF7KyEqGicFSrxya/KQRypfa5OWbGu4EAj0d1tuDLi8uqDLiHghShU0CbPjp9HMbopx5YcJOxc8Gh0wprt9TeTkTZ3jp7RIEbtLPIHVqiZDKZqmTjAwpu1gUjG76r8fHrd4fV0SgaCeShXucT3cPHFGUXj1GcYQlOt9o9zXAgxRKEEI4sSrr65xbpghf75sJKO+W+rsdH+CBQQo3NfVJhdSmzypEHU587GqSU9XrlhfNmcSutRLNYLhhYTrzHrraFF4tw2N6JHhRgeYU0QefNWiWXIeF4CtGWLNt4WwhTtQS98+aeMbKhVS1GiRwxFAeYIeoDA+6VV0hn7e/fEZ7u7pTG7sGGUngwJLnxo3ZVBxoDKt30qnwhK05VTqNf5KhUsxHP1FTJhMuET9HuNvtva9MPGEdCi9cny6VDhfmAe1tD47PPDlABhaj248E5iigo0+Qz/vdWxpXA3xw2Z9KWvR24/GHLzwiLnOWv4a3kNZZwqif3QOMaV5dCpeSjy3OK4nTwju2eyoALpbw+SjWxcwFVBOrwIwMrS50o9M9W1zcan4lGIHMD/Tqalx0dJr5jqkyQW4x3CWvm9IXDNs4Hhlwjjxlq8EpmYZ7bOF04VctUNyN7oXX8ZaFrnj/oGI/tOL/U2Kv6Gp7ZJUn+DzWE0/CsEGfgdv1GEdvrZnTbPATTM38G1NXD04lqkxBBVvMEjvVGlZ2Yeu2J78fDl3Doj4fBCst+pmrineSjZFdhoN6D9VmIuHF4mz8O0rJp+dWWvTmsYPpub0XyQIzl9X8AgUVmJjV71Gn82agQDH+Ml1saKhDiwNp/hlr2T0jwzG5EhEZ5ITtwtfQzttD3FdbFnPBl17LbPPt4mgRxMsa7ox9TyWWfo6nEIu1N9kxnXIePw3AyGpi7bYCOLQn5f/sIEipLonaEkuG5DuYcI3vGROt2bl4/J7PEAlcTwSZtyTvme8tamAlKS+SJnXHXFOf6PwshFK+RTxt5EyqxwbG4GVuqktU01SrJ1d+TEp5Lt7ckCUQ+DhApqTsUfgaKZmB17YuKZp73GoZUrBNhUYfJlyyZYvYxAUD6N/adcaDHkJGUrP9NwbllHIhh59E6ZEcfoaNjnDdXLq0bQ9mSPMUYebh1szqipUkYL1p+pt7BG5S0z2wKRrAWBuUcLmJU96+CVe6fXuY1Mv2kn7VKp7WJPfB8bBYQKLwrXPCW6Mp+OJmdtmWosULdaSxrST1n1fUqX9lVA3SFQxpIYjYGmpDw2yyhTbGeWLxQBTD0cZnqJCRrAev+m6P1UyQRqT+OEQtGwD2yJ5lwqAzGa1ur0+EaDFPzmbD7DtbkJQFpVkgDnCztNNvWN1ljTCs3PyAcTRXMIm288fSbOmUnIjSR17dH1cRdUGudhaXHbieznhKTYvLUMZjKX5ql2wUSvT376g0DsbvDYoQntfvP6zd6ZYgtgLxIcRXzOG6ZI54WdAPmzEDwtE3LR+518/cl8VA/yINETGbbd56sL7eiCSVqIMC8BlK//tyfzcZqhJ8AlTCdgw+aYYLOzFhBKbkdFgyrVoNdd9LE7a7ANEVUb/KO68u6wNBuL6teMuKUhorA2px/Td3XXjqzG+dxpotnEQW8xQ+C90vXkjHgfwS/ghy9xinfsj6VY5P6pq9M7DtQ6fncZbNffOycanYhTn6sn8UUufp39F69/4AUmJuoo0rqaH12aR4ZgWDQV+XSrVP2oyxTH9pSrKV/xTETelUtBbI2uBnXZy4JfahiUjYxu/phX3SAENQoMrbRn9Ic/O5larHjZIO3+4eHrNrkc1feNdpAtLeSId4RlhHCzF2W2CuhJeFK0ycTNJpsiIaOLcwlbSAxRZQLy42AxSqiF58agPdcF43BQEUYgqimnaq0NfAAhNQmH8IHqREgpL5Fb7Y+M/VGOxNhYm3yFnA+/gciePzyp2FA0yf3EHjDBIOonwetqllzbAAaSuHR+yq6xA7snyXMNoeka12PfTb/v8XTOpr6Fdi3d+Z8YFC6nVvqqIkN1gAJmvaEzhdpF05r9TpSiO0OxN1ytdGRQe3oLc5PQ/owW+6QSMlJEhuOXsXpXEClFEuQkRY8OQSClJwUSy7ggIIv9WzLWJ499rFurtm4yYZcl5G1dglYc325+iVNKw5zdm4piN1zqwThacinXMnXL4cS+8g2Wp9Un4hA46X+F5M7DgGQlv4oV8F/xOQ8LDS4FHnWAwzKKxQwRNKLccZknPxQMQzp0TJaRSQYMe1iyZtyJ6N/hK+TDOmFSxnsdG6lZHypTUOBFFFZUkyLefwbMeiqp8sG1gvDUycsACfCjZ74wLk2OCmjoKOR64JwitAfv/t2mNwYW6BO09rYkz+QwsKEZcFCTE4gDl5BzKRtA+xS6PJpmiVF4B7VLqoztYmSexPcBSnd7ZFWYXbFjWpr/GcXk6eHRy8dyGHORCxlLh/cfhsk8oGhqNXsL+lBs4176n3ceTey+g3Iq+5IB+N0na2LsU3mYDRf54faF7gZBLnFfQvB4GZoBQgi6h/HfouA320g7KHgmOBTlwjyzULQQozr1cRGISqifw9Ing/5fdytBfjKfsAiIbDOkoUnx0juuDc+EKrma7jyuIICrWabDjIE9t+PZbzVslLF81fPwavRZQYe0rnvVWxVmc/cW46c7pmv8JQc8VWyIgJsoXkrAhovOMiJB+OkF7SFDYLcTIagVxRk7JhmmoZD0HhTqDSSFFFs5zFcQIjV8bT/JSJFdIdnFn8LyKj4hDlDRGiSewicQvSmw0oOSy9s90Rqzb/+VgnYAf/zRGpNg6t85pKFh8X6ZRXt3Ily6ZOZ5IxpzSOPUIkTV7nRNWJDhXOpqZasTOmXepA9muykyMhh8Wut4p7BnRgOrMMJbdjthA2nAfkODq5mjwWiR4CUHGueyu8+WDqZCfBzr2CMJqH6zbyKIbgf1/soYpI97bkOxMUGMJLMUju1ghCrHFulqFAIBOi3UEe8lgWNCHIimht6QQOCJ/nFWPlyZ9Yr42Mas6/kwxZguESkYDYUtLItpXNRLl0G00IsylI7idnTDJgYk77273Odshzft545uM+8oXv5PVtXgIsMCzLPySyQvLMFDyK0rHUfZ7YAG9sl9o8p/VALLcMkiQCJi1qVhxtjD0Bymk8M+2meP/v0Ypih+NNJJxcvZCg7x2fbv0t30FEG2fhnii84kECOIPGKTBXAST/yMENEjsPP2GHBQARv8dZjosX2ZNHX7/1QOC8EnRb2AVGF40DvVfZqCQbCaBPU+97llqFN5A9JSJppcu1x3MqFlgiB9rRbuuZVEK57VM4nxUlwbFv3C9hglQ+P75HIOsNNXF7K1nCcRmPfgavorF6W6QSQWvJOANwsUxyQZO1Uf5z4EdBkhi9JjoNGZ58xjtDzeqKNxgHsGqLNP2DSIEhmxcEj/HRltRfSQzclmd/M+wDmR5Ar2d7cuO4U27xmRMjznxONhdqrGPqzd3c2TL2DJRKyA4L4u4lefIuNdMzxl1w6Pd5zJRsmmBVnphmlt+PMTE0y/nszko4vajPgIA0SZIeVmfWNj3A6zEuiMGm60ieHgsbPi/EHLuck9fr9tSc8h5AGSFddv/NcQ1UqnF8whBegxnC1OFU8z4fu0lgsizLx+HDUS5CE1vHcUqiZ6Jhr4SCJGodsEMhWOPgKNdK+ciA81J4eg+iV8rb8+GUGIqd93nzHOi+OJcWIYMYMe9JYmgk44qJbuDpXSQvWHhWE5vKp236Us/N9N+o38O+Tc0c/Ap0ZrsWklZq8KhFbuH+yWDND53rAUv7OPjwa3K3J6sDXrCmdQif1bZ+v7UHY41rYQfdbc0jknSk16ENG7IilKF2nKKaNaXbF/Tr+lFlmIZGmHW4DFv4ezefjLfF/H8Mtp45bGvwMkgsm6K0tZgd1rC7vhl2fVbmrjbiJsQKQPAQametdNvlqcHHmPBji4QDQOFS2fpGjDcGcbAVe+DXcvjydn74us2Pitb9g3O+l/4ZXC/KYmSd1xmcHu8c0qfj6HYvX3Ghmzw81o3RQGRyBtvp4bo279Dew5Pu6bT0F0eLIVRKI3BXChUJ6+KgCg8QOpQ5vnaGagF1hetcDEiplDVxhoqMR1q5a5YO+Tad1Vv+lKt89IiYOErNRLXGUgpkC3tu8ui0xca5V4CPyzbxaIlPrXycUozpzo7eFzWad7px2glUZ7/77QLdLPvcaTgqH8Ye5gr93YzfgOJa0Pf5IeuF3PuCZp230MX5VUpbjC3uu1l7ge3icBJFiyEAbH3jN9JRGUb40Xj9n5DjoG1cX3d5SSQ2DwAYriKKFa5is1iXQGJ0tuXKsarAIz4vwKJG7LFcD4f985fSCqFot6Z9tM0yayfYjMYs/YCaJPDOKpcHy3vR2zUPoAmdR1ikSaGlM8Kf3vgdPJ8mPZXaI10dETwDGYzDOiSBq+Nado6RAmHwKwcqyu4o1nFWGdalee4/E8vIzZyFzCV9I9imccW1c8LapXOjuC7mc9NZJq4tbBVBpFtcS6zZrRILYFCVazkj+wt8nmkSHuVey/NYwz1P838TDI2y3tcJVE4aPTX008OpkhOwMaHjkJ8/PnxjtCK+ZKGTbYSLpe7/5D+haWfXv+yeOh6B3h/4nhrV7hpqmhrQR2ZQbm6blBz/XiCj7MJdoBFmsjqtTudqtS5I9S5k2MHeOW3uDCg/niiIXp0gYN0NznxNGUeVDBRkFtf61DpjGCTmButj7gWxxER/JiqVSp8du16gY1iT2nR6q0DIJaP8PKRcYyQcLwtDDwHky3kqlh7hqbOwF0vwc38V36MSrtDv057rLTdGoCbGgSWKTFcPZl65gezh1BNDMtHhTavbpGMlhP2f3BOirhzsB77YlinGx1OhdqRfNIXKS4R27tMgz+HLVIRKbMj/BVB8/ZhzutYf53Aw8PsXE5gE/w8XUWhZQyxWcgvFilkzsiK8bP4mXyi95baroKc1yPs4TZxmVIPqIApNqYGO2BXMRYwLi1ixmGFBpPEg5dbEBErkkUGgon5LqN9sxC/L/HxwMQbm2siclzA4KmUUevhAidQ/GXV1CjrsOTkqBWyQYlWnB8vrJbOTGu/qEdDAKzY/8x0pirNSlHk3uBmyCiXVFniXIMUuC6nYXfNXDdamHnHy49gQT90zDZHOGdBfEip26pHMPuJew+8f3b9Xhii6oYbaLwaYWKl4CZuKth4xRF/XV+tVJVqHz4KcoUa8Ve1Afp2dXWqZ+e1ByWjb5SzwrZ/NHD3HMUPRl1ecdZ6r4LujLjuX+pgbhfstDvezmGYGDSq8ANKIN7n8rA+tatFce+Sgr2NqEmnEoCsOTvgB7CIlg+2trCaXEsUCqDp0B17ebK5Va6oABjvJ/e20KDUalyka+tK7sShAArOVPy06JoKpPRwlyYmF34U25pi39hIOozjMUSjp7/XhjKFYXDW4DYGU7hkM1W8taQJKbwHRluCpimGhUqRfUEyLxaD9uy+XfjmmQxsa3aRxIczKb7lErz1N82GA7SJfD/FCnhgW/wJuVTbGB8124XST7xCYZc5jxLGz8g+Wsk6pcDrCuuJFBAGNci0GLsdGJl5AFM703u/jy/wPVt48jO+jxtnpzg68cfsxqqchZr/4z5jSyeVV9XnglizhMXUfsDkiOZZZ2IIKDCytrDYIdarchmJS9QWW+DrsHXiHFkGl0toNsdFogAAhMhAwljFN5Ab/s0gmaSvV3cIEsfu3/hKHuHxe7CY9PeszZ2meqHFTFz7Ird1DHfuguHX3LYaHsYagYzpe3pnhpvT//WQ5akOvnO2SiV0Baj7wfAV1/SfOhycce9OPDaVnianTnOsxEcb2hg/2bZtANibnZRDcg/6y6AiRAopFW+yUYO64DFwClT0VKoKoV+7EJgEe4h1XMjKr8JYq2B2AjGSHP6IAOwu4WQPRU0lE31AD1SFmx5DxJP8+oGV5gPAMKpWmTReCV0oixqixdxm6Zcga1o8pZzTmtA1onadOmg9C+XFvWKHacGHEpOonWFM1grOUf9AX5Gu+bPwmUVlCBrwvWUq5ftiu2Dr1qiuP/FoaUerg9FXs5BJU03IItQ3eKtnkmos33tEJLXs8g3HZs8M1CBIBuHhBd3Mh3Q4osLBuWv0oHCR86YFO3YIGj3i0CZ98wiR5GPq87/pIzYlYA00r/lA9yPSwk7rJqriNLpNJuodRBWqywJ+ZELb5Ut3o1g2P5uozkgLvWW9WfMPW1TySIGYxbyxV82N7m6xpeH720ge1jRuefYovAAwU03PTQMAdeNQxvrurAOqTburJWhUXMdx8EKkQMQpVQgT1yRnOTduqmEL8bEnCwSZILKtL4S36oW2cSVR0StVuOPLq2A97/Urq1ta9jFNXz16RbVb/weexMtmBWbDaNhwLtlZmjV+4Yzw4D3Si02sAUMYrNpIOpTnmp9+VVY8YUp3gyIGLxCPi3Y3dfK0cehybyOyOXi+9CuxFDXXz1/dS1eLq+v393VraphyD4IH706PkXmwjwDjW1cVPurYVpy9iPDWF9UTAXdUkgFQLCYkwHbgLkbRhMvOAwIOqLTD5MLmoPRBMEcI4z53SNfpyfyYp0AsngoEbP07+AuCjvSvKNvFI/GILk6uUtK8xU/xbmb0zNMIfqggL57tDcm3mxyPH5Ylo1yBQ2JswDXqalBkOOUt/24RwVamMclwWEYUmjbOmpVa1Dsztu/yTaIixOERNc6uXWLqqvgbdVXRSF2E4j+r9KMjOjpfJIhK78qxC9cG+wqzx8jx+qHJfGOl1wlB5NbNtOLxfeSoa1R1RIInzlSuo3yQO0FsQbEoTq2zfQGpjYzxrqe0vbDlwkfP+2I4Tfn8ivypbUODqo8cL/O8cKs8Np3xb+JglrtjCnMG7WVZP2l7PvzsMXC7bpaCdRGOSNlp2l3200geSjltJeNgixM5sj8/+F8dnDMOP/c+u7CDTQZaRNvzund8uJ3JxhvrLoDGsbuvSgs5XiEuYK45qwQrw6Fju7moB8rNYkvXCdqv9THLFx0bkgXK5qPi2SYdl+kVvmReErC1X7AKPpNWQBKZdBwZMzgZTDcZr3UBkdDhVcWDx5kC5/iMzcs3suP+RloNQ0VLtNElLT+pmg7qbTCNsimYlaLyvD3LqhQI6aTMV4hpaYKjs7CDYkoxX5QVr2g6sounGlEKz7ZyLa3YiRD1uazHfE1OkOlkEYsj0FftDeakBwdRyFroRFYyEpHqmlAHQVggES6okSTmIHv8nmJry5YqRJLU09LcYOMaGoUUHKAx767kncau/6nOsVwLbWSKJ0TuFzVscbDfgXeireve3KhZsSMAbBjDYDb3BkuQKkiWMuoUJhYVdcsXT7bGoOcG0dcaLUKdOxfN/p2VVprbd1/5Bi8f3cFdPuWy/9NHQUvYmYhuhyQOHbkouP3mg6haJD4BUL5cGQMafb4PEhq7Emnj0110X+jKZ/xwzvKwJwfv9drsqmalfRsWBmrqCj1oPvkAV3kt9P43u+AhGKiNr3J7BajFs/W3ycBt06IywtMSLh2CovFogfmSOFBFp43JGIuEY4mJZyVMbYmZ4uAVDoYEjIQ50laI76patncyLlC+xzKmJk9u9MK0ACMnptYffXtBWeNi5nv4F+XC+HWx0kGHexN9wRs7TsAj0tJJINSj2zktH7R2W/UrC7jV5R1aaxqttfOzQSOOvd6tEZfwCXhmfUpIc5tQrgkTvB2rrXhSmr9Os7tRLPoNTBAMCxn3GqtfT/323gfFks3SgVmjI2n4diUAuHoQHRDzEhBd59KeTz23ans9CQfvCTGw4onoS7TKUkG8b/bdSvYnZ3zDdJutw8heoEJO0WI0tkuIfJSHemHPcwjuZyOCnIXkALLEDAowmnQMXa3LS7RSwT/3+csG0bB0Sh4AQY7SG7n8XuP7/BD8nvsCcFv+TW4ywJSaVyyW3Dfiwj4s0tWLT3Joo1b4nsdTRYF+eWh9ntDCwcAHMt4vLBPmvbA3dv0q/of86pJVbpNcyKltNuwvx92iUtkxEocBOH0wDQ2717ECKit46Ut2XtcvNoapSqmukIh47mrSF8hsv8+/i9mb9V0QIcqDiYpLo9GCsJTibcyIDiEWkr+UKzA5GqNz8mEdaxVVDCCgerFqFNz5nj/gfgMRLt0ABIvd7dvAhFSuGADV88OIHrUy8BG7+bteLkbwoQdVJfBThB3l9QKbtD4iT6xRd605usaGiKBhCNSuIMrTSno0poTdgrlEx4a+0SJK1Yd391B2CLOdao4m3DRXKy99kxdxUr1KA6c7wO4OBlGrleb+cBj8v9kuRiUCplt9E1SViu3ZQjazK4tpNQRr2lnz26y9RF8yg0dBtTam6iH/K/x88HYfD0yYKThHhMxm+UTj+CQFWpQJXylh40faFNXTtUP1NXzieh0/n5iaeTMbAanTHoLlN9YrTSqd+3vbKbemLo+1d3XT7MrjvD6dyvcKD6TG6F/+H8C41X6dvaBgDVDY5vWWaY2h1kiuYD83eYMGw68+DXWg9smvQMRdUxBflxF0WVPWrCEgaihMM9p5eWgaAiXMByAlx2iuZFmV22nqhrmf/5aIMoNqr1feDdDTOH2r6G0veJR/Ff4ckIgBYEJ8IiE815pb2tyodxow/G9B4t693+D5kA8Mw5NYJoqTjw5Cj/2uX1rbbq1bVGEtj2h1EzucIJZ7Jh4BvT93ew0cqu7QFg+O7rqOVxJOLc7bRB5+yATED/HsioTJUMzBw/dHSzRvK98rdwReZXtuyUx56/SToKhvYSeSRJHuk2HoceW+BS9dZ0fkLd+RqMddETJCAbCBaZEGQCJlNh5bKMmzawrghmWeHsnT0QPpZ+D4dmLlO2vWXIzTkNAoRb19PzOAPGoOQXK+j9aM3Q7xgXkazIyAV7xgQ5NNyQxI81q7G3lCvpk/uoh5tVqPLaDzLPoe/hTXcAnPU2FVbKYcebXT/rE8KZUuSysW8K4MQcV4onl6iACPrXGqVBs4XwTDG+QOAL2HOaVAbMoKPWh2z54PS4/+kYEbbJsPvQIxBreyXA884SFr9+hhKKSiu7G0eTEMBjdoujq2vXAktBe0f4jKPfWICrYDnU0EiAcfj8OvmVSfEWadd/9DGv5uLHZ92pLfD7AClQcifXAMLJZKWZPjAf9Zynimd/JzYNbDzfu8efkUsiDX4Et/Fvjq3O4XXGnTfh6yBWO1awkmzrtSVX7R2Zb+AVIAQRqHQkGqdEu3YUQE7z4x6oYlJTKJUobzwUubF09BhS+Fldo8zfkzS+vNdqqOxaRbM1FDBCdNy0P8ZGTg6nYq3PW7ne0Q3yAFnq/zpx9aWNUjNFIVn/OiE++uJ6ZjCeFNvKspmC+S2sMhWe2VwJlbPt9t2bMuFlEOc8iYp/CF2iilk6HMb8BRHdMvVKOGhip4nSJKpzgnMwxYB2mNR9hsPrTUFLYJ87afb9EF2B5UWsCf/unUdtiopb53hOFQZC26TEcm2jELBsjAlKVhgT+jujnwfogKL/x/Je7Qj6kcUxd2F134Phlf9tpv0laNnzjHgp1mqsFTVYs+/fk94hNuEXSud0x2104YiBBTWXxp8u0diV5/1hRysoKlKOyH2kd87UiOoY+pivAD/xgx8y3UnuvuBSZUUSzyB3qSR4LWA4ez+TwpvlL6X0ds2HS6VUOQe3DjlnUuzbVmN0+Q4FRzHrsvxM27gjs8+B6Y6VW5e3dn1WkumcrOZqjeiUzDz7joSikOaR+4Gh7UUqPb5QwTUiGvF/FJ9IYNQfYnaaIJZnA+zs4WiSyAtquTdtXSDtMQ7mVEduFCi5KpdvZC5C1FDKvFn1IbwE8147LMdXG/egGlj3QzAB5EI9aaYcXKrvghJuPq3Ujjhn0+sjqxXTcbsvnhPIWtIpDLbF4l9vCA/StRneuL9hL/rmLt8uQL3XxdqfAFmckYoxjSgT+PKSuIaNN88vjbhWYXxZq1HX1NiyB7F5L7+4X8XO3qA9hHDX1kYKDU3Lj5B0TXRUiqZdLWgA870xI+Q/CwYC4IWc+a4RO+AWMwrBhGeoGbXpum2l+uFBiiU9SpyGBmAsQ5+VmuxXWRZPKfXD3HQLt4pZEWIKtoKnjl1Dx5vqaFeIY+ObLiXPn4XVN/41D36iLAb1g7MyesQ1mg31hsjWvENg7wY2Jta0S5oaLkdAaTmYzAtr2xNlCVrEnlLnAFxcMTV8yTCtKA5w3yM7NZ2zlrvrDROrbud8TAxZYxdCAbvL9KT4/3/dPST/ESm8nW89qb30A5WfyFhvYiPqXMfI7oct0aKVuwsRmGUxqwpoy7BBPKVzs1qfEa/Tl199tmHFMqis8sZLY022RDEHhhM4zphKK6vGt2NV45tMNkHynpS+WO+qObgOtEQkfauwIhuV7yXMmgf/rzYFXp1+haVMehlPN5CNXDjdkBY8pBpL0CZ6jaMxNBfDoADZJHDFq1NGSDs4Je631To8YaaBtWaI0iMFVPMIw8pq8Dw0ywzLQo7mk/aC+XZ3C+JdJjVFLBv98ZiGFL+oUxlVhXBlMIlyTLYkO8XrYqneTnS7PxfVIpMX6+U1fRTrlxb8LMWz8r+WoCVAAEa4aaWMC3CMu+lhtfzppjWfsaELtgb4YedYq5qwUaMIIgtXpLbtHl4LCF3RkRwKWRoKmy5cv33skoe7m8lw3/WFJ4f1yW0BNl9Uic7OXCWeFJB45s0lfreTW6zwgMq/Gx778N6YAh+5LVkGMu/ZmP13teOWbatIIpZMSAbZ1X+VkyCylV01u6Nl9r2VeN6+eIrE9mqEkzqgeNOmxq5TMuJg5rfV7m5w8hkY8tEw2cdSW8npQlO92iF9+aSG3N1ZnzEGM7WoLKaWGN6em/jurOR9ZJTgHkBHYInNCo4zovpkstfq/zQgYYYSPUzHjqA6HGZ0ORhQQwpzQ5JbBwBEhmT9y5qe4F7eiPaQXexWmJ19gkNcWNfMnzyTJrjR49ij6FJQ6qq3qBA3sbk5ykyzbp2KI2pBIufDEhjsB+i9q4wdH1PX/8P4UW+Q9td8kBSSoa6v91vf6k8gRNP70E0isX5LpJch1RkAzhWWdBUYYGxjAY6jY8MbPfqX2zHsiBs3ZHquUgThoEGA87zxAvRfoLlZ03tk1DERP7SH3yotPj1wqKeBMh24WD6Z4OGTbYn68XW7n6wKmUETZPMp6PgJqVZKpd1kUe7WEYbVVWDDVQYyKWdGIgYBx/n7L8ozQYvbEWhiA4C8+it69LAjOhiIR+xIXo0nohmRcGN74IS43PYeUNrl1y/q86t1EsmScbr3qrK66R6uXW1nM4uXXde3Ra9Pg/oz7pr+Ak43E6G5GKA+e4msnoH6ElFVHyuk/Hpt5CmfmtL/VoRDwNp0nLsXCCz3hjgNa1ddVov+qPP/t1wyeSDuZ9rBMHAgnHfuYgaRmHjlmpJlg36EjSddaHmfhCfG7AONTNmdmxNcDvR8+IOFAxKVoKyMZMRkcggj4/hB3XPPj2P5g3wMr4hq9BIy5aZjWfDNCG9thXfMqA36quzjSh0t1DPbUQLSTYYyJgwCe5Y6mvQOs0ce2fkz3wpqeA+CHviVHk9ttapL1JaEEnc2pqIQTJ/v90JiDLSUmLW48zQA5Frj6uINjBfY0vpxpOAMSNQfpDqtvtFWzYDtkpnZNO5ZNlFoq8zyiKE1WM/igiOxM8a5lLDXM38FEymVHuczjXmflmQFKyjoVAs2oYfahkByj20VtjdjK+MS1XnASw14LI5VRUFuJCcSRxLHJ/wbpvpiNi87k/YLJY9NFs7tOLQe6FkzCMF+blVbOS6Gl0G95tb1+aZayM3OxEnqG2cJXLtv9dVFKJmiWyZqbglibOB9YvLzdvDvh0F90h4DmNA4ZJUPn1/8GA2Xr7OkG7nu+xKZ9zzx16fsrD+C8wQFkbE6glzdPo8W3bpKTF+YQeDDwc0Mw4WSQWnr9v9UV5KHQZsq4QTi/5uUSaipHW1bJ8daMxsfrVSkXvljemXTRjQLPEUdSBjfTEa2D5RWGmsj53wMvmgiveO6C6sxuxlF8Fse5mNaTVYjVc74iAHf+/q472UpzBDo6dgSG9f4shjexlhtR8Pn0/c5HRvdZKsr6YI10Do1HsMBG4hN+B8p2fzsi3/XVmSY3+HInTejLPXHuNtABSpCmsL+MYZY9b16LECnXhsUF1Zmgx7ZvoPodKih4N1NDXbXd/xkZkA+KbZzNrSesrhC0Y/iVwKS2wJDQmcavnb1ZwlGDCEWKhQVVHcLj7QmQ0Z/XZ04KuZHjGCy099yq8wkz967Hv9QgUENI9s/dwTPFlCZP5daIEqb3XULGvvyZff3Ettm0MoLgKCSENgv29IKTVzTggSDfJswUgDvcXcdcvuU+2WDxuBvy9MKoqT5GfAfb2qZHN95HLcXQvh9sBv2gKFonxKaDn0zBcbqk2qFYbkGwnnQM2z9ZJ1od+SxccS1/RwdEuFurCYf5CroV8iNvzSjxaj78rue8MJttFditWmjNGVfrc9HXXXXCHC8jVkK4l4EgGosrrsf3AfZ9TWhjKGEnooLfwi7GA69NzJeIEjBB7YdLgQD95BogwQ+mkp1WOQpUhtmtQiKRcUK3r9VbbRzopUXb0y6I+wU1sylM6yRaMHEhtxU/RhdJX2I/wICguveedNTF2RRoiii3m89+HAcKhJ2dTGS2dTzgo5259h/B+kVeWGQEd2DkyOkO2ATtphZLl2ylDkyLM36Fw/s8TXwh9IWVSpSTY4PltEqsJU/k5A043MMvWyH8hB4P2/OXfQnxNVc+7NeIXuQ8x7MpIAMGkbjyGCvsjlbKdvp+XNLSiKPnCrLngCEJfA/3uqMi4OXqkBTFZJ/+XLHMTvzXyR4BDifc30+smTv5b++iA6tYkHuzWa2eIXW40ezIDsHDTO6hZ6D2YqcM71lMqE5Sw6TV/lUU6PFfllqQh1DKBBtPM1ccM0fmnqku9oxXfNJYaiz1K2x03ExX3XBltkrVU1wVben8GBUQ2XNwKlWoAanXKH6mS/CzG462m2Gq1RwwsJO3tUfKX66MNbp45twhpDjuLeSLO7hjycURaS9DXEVs4Xja4llAiTBuYckxhoZarDSsrWqjE7Mgbir8Xh4ZTMVVjJobJ51VUOEkov9tqtT5AKc3kQrJCZX+jzbA2wDVCgxWVOvhbPYvLgsV+mV5MHuF6n4JJrdBEIc2SKvx4qqGgt2hdDdbZF43rxl4RFs0JwQdxJ6yiB/PwGEeddaqreBU+EZkGp3jwPuWkoDDrQQazN5RtbulUjmRP+zzi8YjUG6G6++qjwArPUbC5ATjTLlpiObru4XDACgxIajGxONZjVlUZElyW6JEI9f7G+GNyqPXBCPpKe1kbmQgwhMV8WcuSJLEIoHc55Dn/8v7FEQWAh+KVscAlNPdD+OJCJsKN/Wl3ZvAwo4tUXpqNRB0gvKqKeHMrayvO97UYlAnMgVkUc/lJ4lcFjjl9I4AdqgMSsRkj/ZCvawe+g7zuP0z+xVxTfAXIcvEz+IluFviwf8V88XzW6xMsizbq3EtfHESuRVBEer7evTYqRsXhl/zV6dYvpST+scXFo3ZsUf8DoBNTSbyC4EQCVgGM+k1qSlr8l0keVt9d28bLBoxYtHWxqH1lb/DQW4oovg2vLkT3vPGatBeqI51AaS3VORgzcSuHUw8sFyGdhqyzbojtEY2fJww68HQa6zXJzp95F8mHc2VfXwHBbzR0lcg4t6xMxsLyP8MztkAN747meOjSgFBwVacSz5V8FRMnWgx1ke78q+Ag+hUW+H43QMkuUcOh/n8k867iJOeJwrji6a2yaQj9S2XRqxk61u7cVr4l+A8XaOlXt8HVAf1xCvEcB9wY6Vksv9UXkwVqJ8CUMHvieXjRUmHBPj5xtcY4cH2+E82XPqHLVZcMA9OmPyptCK7c8Xp9aYUxMHKu4+jpnTNiksMmo7/Ek3dEUgw4aR0HELl5LPNYJ+HB+v1WX83fxXn2tOex02D16oaiJ9UxCLX8N1s2G5uGJYknN3Gag8r4FnCd0s6usYD4yarAxoGDOJJUK2yPnF6emUz8Feq6WAvPeuXNQ+IoP6xQd4AwSzxM6FinnNm/dE2nruiX2pTQN/oSK5QyRDeedw5LaFihTDxyNceAhlExRWWtJKSuYG0rWE3Ug4GeSJkZ4rcyetiuPJLf9eKr+HWWGI1YV35Zu6B0133GM2y5qJ3/laTTN7ox/ShYVmTSl6j8HpIm8nF8hnEfnsdtn7uJt0D+B6F7V31/83lTPUPjB+KcAHWZzOmxGnZ0IjGeXQvKprTGNjwtnuEOE8wSly5WRocYVL/in20zz64zrcFjSbIcCqrXy2oMQ+fE6n3R2GSx6GGW1kvRTYqGOzVOGKiBtnZN/hqjgTvL2JJHZqojyZNWdo8cdpMriFb4LSRX/v07x+MdLVoQBOCHORvgQWtShb12satbzQ/mLEwrjRMMIzp3DR1yMsiJGAr9Yh31badEILVQtUxbgf1LF+IcTLWzZL3GpVk7ZfY3irACmdiAAA07ta4ZvUofj9qGE+Q54NNFOp/vVErGSBI5dIQuRdXtg51qxTuXuKWrRLCumfUfHgbug4T225qwCqU6ni6BDaazpqThtTjVNnuPYaQDmtW6+rZRrdH+ZH2wqbGD89FYeso+UOtahpt9jOXB4x7GCHwa9KBKMEHwLbv1Hnwn/CkIMSNOc1tfQYlYvHJXh3XatjaFMlFQFovE63FZW9D2G6x+jHbfDLHgl0BBg9oNMaHGr/T91JM0gJjfTC/c/xMiw1TELYNdXITw5d/qx6lTXp+OcB4Sh3foEF59rYbHZEs13FV3xIlA4jfFjnm2t5WSw2KBJA0FgSDm4TC/3dmKOe+KzS/nQ1CL4UB2TPzdC1dt45YnPu/h5hX1qEq7S2Lu5eZVIHqWMxRQJ9XWED9dF68oQOEQTG7X75SYAnRmImrx8grQD4QX0VKQpnifUcCUTitDNLW3x0MIAiY1h30G79w7wFyVKLPwxq842rXIn/mjv+kxIQZ0zwJ/2GkII2kJO95XQm4QCYoYqK4kVompBH32GwZ7P87TULtu6C4BMHHwfXutGkhYXlStu9JCddPhbZ2pdsVg30oIX8Osc64mq7i8Lpd12YAwAjWtDTzF76Dsq3BH35PhqusGt2SPoJVMUEXV4+8b16W7ach/zNqFP9nWAfHVFrSv7YRHtYI7SySR0cWnSSzLszd9qSG2tPPdyHrZScLH9+JkqYf9ah++PfDdrk+MvsaWauz32JNErzhwGhnrzWCsIrX97dEfq/Il/xm9or3VbuZnhPftaaWoLJBumigYMboRxtFQZzWf0eadbcb3BvT0yzAITdeUuFaKG1P5QHs1MJbDjRvLs0+om3Y6lYLI9J5/qCLahpVBpzZQZfsfdh0hpYaJT5fCADAAqMH9aYNWKFPSsN0342Bhxf4lmt5NxsWys3Q+xbPK3jwqH8sYhxfEHp4QEYQ5tMwD038QNQrXA6dz/0o9MC+vNTyaqHCq04b8FZmByMdEOloIqS73giyHNPQ32yOCfLQ+B8GF6C1EhxDq/yTerZdz7im7WWav4KagcIypYv71XWpTSZ7Kq8XKwcCfa8NNJjPSguVPbwd5DJfglf2WI5nudasG24lPBP1Luc7dGVVamyl7FGBBRfCMwchC3SnUFGp5/SQT8uBuLjX2tMVNbA+Hf+ZhARyy/tSHRik2OsyPADN+LU8jVg1ZCUg6/qbF59/26+APpmEEGuMBcRMU+rrhDZmkV1WjUjbfcVDvjjxneBZ2Q16sJJsahkH1YQbqkgN02hljOoPMlfmNF/P92IzWLSaXKP7hxfHU92JC34vkbTYNfWQG3gjoHpqe5OeiJyFFFQNgH7YaVuuJZUvzB/XJ1XymiKun9bFQEBU9Ae3sdO15R1djaHaRWCIj7JVznpYaMu5DjdpDyU7hXoQW6k5yfz+/HiYnRBzUNlslwdQ9iAXe8DKGVqDM8iG97rlYFguChMdvza4sbZbWz3RF8qmb7RpFnFc57eQZRO7VW1+k8yrUsJyn1zc9p/wOddk9rbu/cEAFGoPKFS+8rHPoQv9QdrxuxBEKCCUGvnedmXXLylFpiWL8KdryrA5Zz7tiPEhcYBEw70Cca36iubeSRSDxMZ8BxGM60pIguryrTebErgYFBncklftg+iyh7Yv4NaniW37TuoDNAhWw/qAOKgiXFJ5gHWVefK4xTZo0ozZ/RcUNrjVHzn6HVyO9laH9qWcBqT1e8EQJxIb5ovF+VlgqvoQ/fnYMPz48Pgatl0EYY7FkRQvfyNEHLGoi7arAzFJ6BUZTFcEpMfI+6EhlZz/ajsjriW46ONdx6t15hR9h2idMNQe18tEXxUznmb7YT9+NxjXGKFg0ynJ4CPzwNj+n17uevKwcj7ktOUzg2aux8paQ4OnHdCNOy+XoETIXvcPAvQFK5pJsxg7Zi5Svd8fqWMZEFP7eLHnwxAu2bRMQuVOj52xjnVUIv4auznLF/AK6Ar3VvVd3FI2lQunCl0zSXQxHb+Smh6Ne3+ZKhVs3yma+Io3zbcelvCN+C4I7vOFsCxuMmXfinyDw+PI4+6TBJUJ75Hkfm4TLfESff9sGkDOJ44B8XutbCqlsuB7pyZQpmiDY81RxxMAelZBryn2CKL6VVievXoxNNE3NREMoqA+q/XfwY/zMWCuNNHupUxs5PtB9K/zyQVkYwV4dEGEAf8C5FXp9VW2eWD508iSxifxMpAGPHd5iayf99I1WSCpqyuutkkoDhYtV7sU4HoHdazNpwTHT4p9oljJo0oml+YVQopktl5CfyQGyr6p6bZRKF8/wJH/qS4xjfLvT3oG0teYkEOYHG3x1E6kKDBCnExEFxxlKyq2WytJpRPdr9U/pY3v4uj5zjWfGVU5oMXdZ6B/O6uwSSzL24jgUD0WxZnytgcJ/81mGFi64rj6NSn0owIXfpl/wIVsHGBf+Ah8QXY/0F08ZH1xrnH5cvr7LhG8ggbK/Go3PGVB6PrP0KiYewUEnkvs4GyNTiO6oF5ZTw6BDNAGHdxCLLplHKkCoDlGDNEdJqeCK1XwIebHW/qD4dOPJHRX4vpWxoqFbBy3rFRvgKzGFteeHBoZ5l56u/43rxs/KN5NIzTK1xrNqnkj3Vfd+QPXYji4klFnm/zLAYN5+jZButrtFPqNDEQd0kaLm+a4cKmTWxqgBHI3Ti7TDD9U4cWRZGdcP2BCt/7v7n0AtnfrL+MPwNJZEcC/NISzwas0qDds3IVWg6MaABSVJcjImSOX47WEbpwiLpoDCZpP3LnpEh6t3pcPasZvwtD4UZogrK+E50oyjHPO13y+1OZflrfY38msk6uTa0/dH7ZjnF+Gq2q2qoQVl1kkFOJVNgCNnY2uxAhSUS5DPzArCnhyVoExDtuOzMya3lYXeAjPGxQAO4uiYyFGPlhMGVFHx1e/gd5UUgy2w+ghjDaqPFcTRSploZY0hOOE7WYYjcUXVuQZPyn+zdsUDF4p6E7Jwx8dHMotBtn2TMyKT9WxtgrCIxCWK1eKI9cJ21FRgTR/AF8+mJ4jvp71Xe4nSWT4fEx6maxkwKHBgnRbnrRvTTSwHfp2plfFyCDAFnukhgWVGujBHL5iDqSnE4KxEtyyo3Z2xONkko5wJsWeF1daGXRneYjKxoS7oAAWUBbtlHjr0JvQnK7kQC0mwO8OzjlpXP271gQ3m6W0GOpFBh3jk1GTJ1Dbu/qu2j9aIN62qapitJCyVrP+lXUiRr6iM9IDwAVstofdPLvNt4Q9TKHIJ7tnar3L/nM1Ekv4WmlwVtbjwC3dFqMxAqFe32dpQbNz/v9pz19zwoTgmRswQKntdHTOYAOLFUY9kHzu7IMgLlLPipRIZVc0cOn6nLXMJ99spm/0WwFDN3RArtQKmFEHS+36klLpZj2QEJUP1MEtvVSx1dM8UcsURpo43B+iRLkpyHE3GpQiNwERgYqgg7b1VW5Ev5KRoF4vgp342wClKg7y8YlrNqGFm7VYgc5SgrQgrKR0BZgYjG1a0cQRPs6I0YoIsAsUlDZKpUGvQJDCos5NpT5PfyQ+dd3/VdGcVnPyheh/Vl7KhLalG3i5szd4VxmxEcq8WXOYWompWUr7Rbk2bYQiKYcrEacetBi71otzklIz1ovnydbtumEhGOPJItOIT+ANpxhR2Qc/nCtD+a82h5pgHWnRIr5Vtzs/LAUFOKVLSt2keSw96o+zsiLT7fkZT0Dfe7nsm+KGxtpWQ5CbV12Tua2dFuT1speyllo57YPVaViVZAgcCtRmKJik1Cs2QRTcp3m6wQBY2COmDniTjlTC35auFeyQ1KA0dnzj9nesf/6+5ks0CqyVmEOgHDRXL7wRUzyIVPxs3N4dJkMbNUO5UV0bFUER19yP7BKxyEtrP6VDXlEe7gn/HG/+A9SOegvTYCTD1IgrEUc1XFehCk0JWzlSLxyVM3ydZM6yleMry8/qeX9iyrjg+PgNorunIyO3J0aetAWYy0IRkU9/G58Oyo0ybPb3QuC7lNblvtiGgGNT1vTm9O4p8D+2smYTiC302eOqFLK9Hlg11QMwH1HEDoyifG/qZ3RKAEKK4XMfxDipnAtSOLzsXwybVHPb/CgpTwz2xrL/SRfYF0wHUUUJcyRgEUy2QqqHjRpBOB2Pkvtj8lg1KUMjtrbtSDm+vzNrEb8q6ndwudhYdhD19AEaGSH7TbKQejgikSqwuTcrYXM/Wd8mlgYUqbRPRwBkxVC8oZcvazqIQ6QXfr9mynzNINXtQwO5IknmtKkBzb7AL4De/YBZf8YVl5D9YaPl4WYVcvaCcIXns3ncyyptf7ukMorBoqJ4610DRqJM+V413JFHHCE+uIBA3SYeAiLEVHdT6+lPnNWgZwh04CQucvhlEyxbrD6YwJTsAzASNVqDdLCcy82m/S+9CH4n3Kwsxxa671GpyJ56PkETiDcLrJf+pqoBKljSi3p2Bq22Z4ZOkj0nPjXwJFQwKAEOjm47/SuW5xSnh7IQFhh/P690XEOOT38xrSUFmRwma/AeRtXZo2VFT9GJIiTMmtdY2nSZMLG9h+nXLCy/VrXPnejGPwle+dI2hWmnUv5QQK5JR1PkQQf91sDJh/ay5eJRyXqBmIQneXzHulFYwOqaOzJBkKBM+aj8zF5NzA6xHbAfzW7B1KeW1nJPduQQ8XV6DRMmQ3J46XqcggLYwzEVm7mWFiBtQ5nVvwxh9sV60o+O8rJpVd10jXFdW0KVYNPXzCa11fxjVXGeC+0GnDlOQuRt8NpWTXG1/K5D+VLIIiZiy9NpwbyeGjEfFA0OWUub4uRyoeylrEg2b9qOFipHfFmHVPZ/g+W817bgTd7+mubIDZiQepTb+fgT8stUxh8pl1Nf7eHKHp6udPpiDLX97JoALb7IbyFnZA1QttEPgoYTWV3kztrRPyYTkJjDJAZIbs0SgH8jP7xcXk+1BMr79aQQazEozxN/5BVSoo7cJUo6WmMKodmCP6dOI6cY/LiJqmsMdQD86/A6XjwPpsNd86koTiZTBb+zDKeb47HgNlAPZlVcRX4MA+0G8wyd+afnFkAqmyCtZg+5el0QgNoCCS278/SY2KS45XqGgm57Axv0vjI/FDhoioAeA9z0ZQ5fCZd4wSzyrbIUD2B2K080Z1peVEJqBwBb7Xu185EhKcHm9RjJehj9jkFf0l7Y2YULJ9XRK3BkcNpEZLCtFb/TolT1b8HyyC4GI1YEv4jH8/4YazA6+sm/m5h8/IuK79BDil1Pl4GnCdry5xomCq4BQqxj8TeVLpY/4dnO8wFad/V2Eph5oh+ERP4nfmWNnHhKl0mNJLAPSuf6+0dOgxznNjpMKNn8AeDLu/g7RH3oLqhLQejM5RX296QSMXBeCVeVyEqTsgmQCIFWpu3nr9TxpzSQIGR0pxN6msuQ6FVs7iGfVrS7d/9EvZI1c4z2JYPShLNs0/nczgTmgaLLtv3/8MeN1zOuqIa4vSGpUqf1DSWQh1KkUSdPmC0Dqz8oD5j8fVQvzRBMJ8K19kHmTtf+K+yBDFliZe76WyPGLTonUGKwnylrzM2QQLq5/0UZ7l39ImzmZjl9xHqp0DHekD6yShg/DHU42Z+yQ5vx83yrNvjI9ggvEPEUtTHl9e6fEZrwoHQp4nm+3DLBiM1KzooLlB7MMiMG2HLMk/aXja7UL0XYc+OCUdu9v8m13iiuOLP6xVf2MP3Agn4kjO+mPYNLlKBIZj4/U9ZgDa+SDj+0qhC/SnGJrsdSJWUDpAmJWXLlauYPbLGyrmWui6zylTphqySZEu0EQ1OVm4nrL9++VkaOD9DHlm+KnKfczjIvauHaJhTzJVtMN5wzlLJBEJ6RMuIdISy6TedQEje8wJNIIsW04NuWHh9mAACSOqhOduJxVrrx3MSBr6GheZULb/H6woYLsCL8IrDBT1py+qsyQrlgkNeK6iWWWJbi+nF2obxFA9zsBEwq0tJW2yOH9WG/0M/lURd+5/65uSe/qQYJc9lJ2nZXc2pCrE+/+p11GHe7QENcPp2Eh78gf37WrCvTlHjVHjaRNlDpQOyIT1k/zzdvMLbBAZlTv/he8omsObgpvWX1BYYmkDpcEtYZQpspX3kX00UAmwNj6EqIUYg0FtRZM9N7jbxle1OycIbmWoh7zRGaOPYapr6y5tY1xDCxdGg3NdIS7AYe+QdpSb/JUdk9kuRy6p3KTw9Bh+a9n5a69S3lCZWng7vHOH9eBpQck1+/2woCnqzUaMB//kIfIgSN2/1ftk/pv3WF8Eit7Ubk9IxZgsko1OR5n3zH9TS4r/2IgfSfo79Iz9JqzRcQsPaJ3nbO0RYmS21IbdXqmFyxiy0H9lqmBl2s5Zps3FMcjHFrxUhrt0ym4FBtCRxJNrDkLz5nYLfvXdG79N4JIUKYdSCK8Sm3xzPfkau3IDGrAi08TRroDzlRSeOa2kWih4KXdEiFCQmBLfwjSyAb/6AqvoU8ObSm/xU1SfAVLWlgLXq13ybBbsX1/6taBBbBXRvOvxa1Tvede6z3kA635uxG9R3uli1o7iMMVG3oZXYlKj4BOBib5zoH8UrRPr2ma9AZ6Usi4VLfNHZ7pZuqARZ0z0aMjtoTq5n9rwm/UdldtVBp38qo71afHK+Hx59fI6KmywIXxxGvLI4WITQnW8FCWrCzJseoQdHvOt9nlfzpDdXe08RO8ooyPUctG5llpJTUfDudgxS3tPu05Y33KzjMHVG3SgC069Ni53z9z5RuYDn0+kADspo6/HoKxx5Qm5zyK3Skh7l8pxVPsRTz2vvpKnHQIguExKgW2SoGWXcGSkOy9iMPBTjN5PsHczsJUhauoUVQ9uH9s5f9x2fwbHu5JNaE1OnvImFBeYGb9qjl+VDeeLURltz1NoZ4Xtm7NYHYgh1PLMilMtDnKceQ0xy0JY5yox5Gl2ScdWHJ2SvWrIUGBW4m2HgpLwXQJMDPRGwtKN9AXdpq+9ZvYdpnXJfHQQjo4AJ3LtDZaWOYuUZ8xFh0cQHqnUoIQfmmUhjjEp5Nvzxk3cSOulcym4D90Aw+nTE2AuhAlKGh18FSjQQjChHqkKwCQHdeAMNObwCjXCJU4M2ANa3xCIDIFMPvvmv8/2NBFDD8CRH7Kub+ij+XD7Fde3xzJxvBFZlJuId8OUGXiNoczZEsCJrIrdbwLj2Ed9ISxWPM8hvJVx8GPmhHRF0m8DmZ9tiU6sP67XPK+mgjxq8tjA08DoqfIoaZjKwir7rNMJ51gXjjIiFGXI+2wh4c5POdZnfV2GqTR7WGUIa8r3SZKB5M1ygy7g0wJXHCR3xTEecvLOPFJAOlzAdDSf1SJEMiIrmEUNRJ4czNuZTf8Mhr6nCeHWvBvMJSsdRly3DjQ9CK2zbqKU6u8GeOSZASWAI6UmS1PVsxMw6jDy5ts/Db5Fmy+mZGIpkSQEtrNVNj4WJztSBxdPwPoUedGm7uZo/N/mJnvT8xPiE5L0tRY6qC6GwqrIUIYMHz49LTCN4y8ctaiYbHHQV7hNKSZKnFOtW3P4eRO5maNUt6V/1qfFEFvPzW5VwDQjxZVmMcpimAFBp9NECE6REG/6CPMzkKWPcLx5oL3IOEjEN06G2ruayE5hSmaVo3iM2ZvW5dTIHWDwWr/rOWMagWligJTSYa0gKlvLzQ88+kcBPXkU7EoohElp3iXW7QXLjNQ883080WyjGS8Kgz4rQnXm2woeJQ5duR1dvls9rV5TKpTnjrOuljbq/lDhvObsMvfmTNJQ+BF780DvDI4emj1ppA2YLVyiZhHRBcM6UulAqdyuCopmDV7SMY97j7jD86uP88FUklSUE1V7fB42r7w3StuFTdkOnGzevOlJplrFgxSpXuzxREz2B5ClwkSujWaf15UKcT+rZmSHRKm+nl4sOi5xBoT3EAoE7xZl0msfDcAZL4ZY/g0HHFQQsm5Ogs+J/j4sWjFj8YI/tHziLgzvPF8P8FHZF88ZhTiHqzrWPgYxpcMKsNM/chob5UDlr2jXkf/vPYjySZLrnsGLquUuxWE/8S5CHiUfvQK7SHqAn4w7HY5D7oWn2WC7pCHYPjT08FJWWEYhd4UmZHY3m2ucjxMAS/phCj20jP6Tu7CmYBcayS6WtGSKdzjAqPpv5HcLaJsoA16Kl7dGCQrBUiDa94utF/awemcDRlcYTe85qqrOf5Dd5eIPM6ovMYgxAsHYF8Yn4aVsw2lS54qKhkNCLnuCRaol+Kajwu1cA65lMLAsaFEYfxwncYDS0Ys9cME84fyr9O01V9eS63e8e3qN1eY6dQ1AgS/4Msj9fICXA3uR6AYzPNTkqxJO1f0eQ+1AQ55gH0D9xaaqQMRAVXUmP35z1yjBn7QK9Swb9sMW+Q/FOFFn+6Vjn633IFQCC0cyhe4Vo8JMUm9ggYSTaX86uSLH2PUhkH/Ep4DoemZRDL0AQWupDUIGF3ZsqaivPyRdZEMl2CstlYHZPxz1Fsu6X2I2z4wW6s2vq4KG7Cy155bf8xmrQ1AzhyXbJTb3k6l1sJP425Afl2BtHfB9r57AxxkKzcGDWyvVUXZho1WIYLFEzherobRq+ihLF+PSzwvP8rm4XeV4Q1i7v9MaXLm0spSd17oJGFCqdbKFuYB740TjwADaUdtrxLICF9YuCCcYEaIBwf5KuuEAqswQK69Lqqn/JG7dVOLSZSMU1VsJqy9iVqRiZbXIN034ZlbTXnntdqMX3TsUJ93OcPJIrTWuHdLoJG0OeZ61NHzyNW5QNTrNIBm4Ce8F+CKjR5rU6JqbGCWgkEbuU7ZhakDqvvv0jW2eI/rJ5Z7ziVuunVT7fe2JU5YVEbYVU3RQ8FV62UFethiSLA+Zxs4syuSHRUwPndG7/ZplV3WQnR9JvfgPNKtXH4XTfITaQhbsD/f8NpseHcO0cFAe3/N1651G78Gw2sWnzq05rOL9w844rxNU/iEMhN46Yuywv0prc37m3u7M8WnQxoLeGWfF+F7FWVIxS6d8jCrbVZkl8ZAtsh+8LeSeQiRn7OD8sWbTFWZoShCoLSHMNOE5P0XSAeR32HKGD3lFesRjb6hzAWYQk8Opt63x0P5iQ4Q98jesZSKxe7xKU/SrmQQ0tYEIBMQLmxfx0qyOoBDkAftATpCwUKeSf3A0dSIfj1fphSuMPZl0pnojeRg3VVJGQ16dLn0LprQDCM+vs7/hUuqf9vkLtx/sEwI0w7hDhY9H1zhghAod4yyBkPAQ4amzd304YsalRNXH12+GO7jzw96HWdTzXoC5pwfjrKhdn+jpetHkHGn8+QfK8ZhP6mkAxR33cJhZrQMtDBQKPZu45xYCNfdpljMEk1XivQsJhktFF9FEBp1fQ37sffVq2ARKmLx58DLt3ztFN6vz6jJVuwTCdOcChLP+nRk6Z9qzqf658PjWG5alQ76qKGbqi2TlWF2E8hEE50bhkGV62tDBWcFkhuXpPXJLgSN+MNGT1HXj/9zLa6PAZS8clqvDIb6i0vVqL/RWsMC1VdV2gA6wsMMN+gJymK3E4iVcRUvaDeg+WeMsyFuI1nvA8RuYMDdLD1JNzY5180hL7cNPzi/oKkyGngguYm3oOlP7l5NotbBwjjHI2936b/NocYWHPOaCata32UKCFx1wy7XEXMJ2Okjo9ih+kZ3FN4InypSHteuSVN37aiNXbWVxGyXfIqHd4DGSNeNKZ88EZ+sR9oLxa2WVeQl28jne6R/pxbrgVoDPgjGOv7ARALUpWiPNVO1jq07YwKgm/pQk2A+Mye9Wm6vcV9PSGIvzgNZrm5omkVaGOG3nxpiL8UASrynGN4PxdBfLyKTU0fPxKCy45QsIUoP+9z0QjYkFgd3DmX64AIPPMQOaC2wR4dg9NVH4CHqDosTmMRFacLGEqfVR1rvOjCrtTkLJ0P7ZHdItPFU07kJxXF6kC/glYdDsy0TUwbAorMSlaw7VI/61MDtsUgnIKGMZJHYjlpUtDmiDlhTAdym/2uRjVUY8rSTRiDEXIPfjnHfnTA0vG1qJObf4ANTnah8WprLw6PbbicbZN7gQhyp60uC93z6iEIoSwIZUGYSUzMD7pyrdpIdCozMOI4Q8izo15iEcixDS1CGT/C+U1N8ZM+j5wvDGYFZfQkXLElZfvVwAMNosLUejW2ZFyI9ZMHyhZNHgl79c6DfAV6mrhopGYSkZ4WDq9nh29mjfaucdBZlVChWq8247fAoqwZbgCLrxFEyfMSZYBKXDHJuKj6ZCmDmiOX1vc61VzdZ/MWRlMKfb89TuerQ/OsMGouz8noeeP6i07ZBLPwEMLGgnKeSxV5VqPN+z0Fs4oJc3uNpRG/S4rdpDCZnUU6NekiFZ5/uy4TeB8teCagAGfrixXPIp51k/hts0c2URKrMBotS8le568IgWOC5cJO0vd6hI244nphYHmtFmiGHnSfyhRdXXc5MnrF7tuODzOB4I5AQlaCnYtEGFLKvs8RxJmekkLHqqiSQ56AZTHPAztF9SPyBNQYbjjxKKaMWoy0RLS2rEvLXPwtIZey0pRro+ozmW2/0JA1v/Dcw2Z/spz1Cds6I9mNs9YsRwhRle8PA1nadaNKK8ul8QVCv3P4xZIuLYnyoI+HNPvcOJPjRdTjGHwhqqLIv6eD6tQcYdU7M6fF1E5SaCDj89MDH+jG/gX+LvN6mABzLlXYC9HJ6g/OxXv/ESd4NEyRDcNx4ezEhY+v7iOyV9v7SBobvZCHBWnZsjYRSHcCdgVdmCroyzO+vLbPEI8NG+xAsLRc8pv87DLncrI+jHKybdRymsymFPqBN00dQ9bnLyuhRJDiZbnw2qhcCw7GHb1qdafDo9UojxQF/oKQIN+K9epQ+OxCb3k+OhvsmsUdggp1tJAD5QowO3DtNkYoEpKc6PIh5jXJvkTgCAOPLnfBgMUGPKI/4NObiOc6b8/VoSHmA72yxWSw176zc65QuuzEaW4ei26pq0gYPP/WfdQ0YzOT1KttsjkXA9B3L0Q0TfTsOJ/i73Snat5useVTylNwgexABraLTGrIB8pnXSBOX8RBRs+gpkN3Il5nKvTbiKIHHFN30E/VthmeRSbLZ2DgvCNsLYfI6Kbdnl6uLLQG9pFIFq6qlogB0gLwqWis17uIClJbw9N/mJq3OaA8wYRWhOX53/b8dgl3hs4nfAaj9QOI3EGV0ww8CYpQaUt3JzJUNkHo4eodlTxei+DV/qlKVhiLWET6flpGGuYwwfVaKswF/fO86GDTNviGqA7UoiGcN1kgy4QnTq/Y5mmDsM+qVtEve8n/t3crbw9cgmYdffkGYV2jXodAOkIwFCL0tXX+Ov5O7sxFAlscXNGPXYCfIzd0YT1H0+pH+s66i3gSNwVKnvDFSj+yENv/kFVl0NGIqjnwtAC7kaIvsJIdaViWNWiy1f5T3UbUbC20xXagMLxePQ6GdFTmB3h/SVhAcB9fadaKr9kHVPrdkWsoQqCUAQ0fb0fnTMSF0Ui0ofznHYDNaZznbyIDr9LFdkCxakhJCcB2PbtYsUv8mInOCZSQ5rw5rdOEwrSAxpYvicOhVBhVUoUuz+YS+z7Jz3/+/Cyl+fbLMPl5RiPq40IfTNaDdQFLT4Eq1Lrfq2QGDZ2BLFgeSZsbFjTp/1OweHsS05mA/el+aljFxfnWTAwNAgrxOBkmJw5tMO9/XHpI8NdwddCW6YvdxMllkDJyID7V9dtWaiZOBt4niiyTWAX8bD8O2TUmt0xRXL5io277HBQolvaISWjQC1juDTt+3iQ6pnJqP9U5yH/apdo860R+4yRpBF5Z0qNtYsQavaGbo8FfXSktrCh+mjhjjUJbumoK4q9WzwnonV8dQ4M1YYaY4dPjajBbqlkWSOgBYN1+b10ZuQx0wQLxT9Gi6/g5Wvw4fb2N+AJplmy6itPFsM7vqIAQfGG0V+YK78WFBU38lC8qMUxKrWaA5RTWis/iDYs1z+X1ZG2CkR4mjiEhzFhr97f9F0/Zor3tPfa2QDs9hBA+Hi20DxFmmhoO7jEN7f1xObpBLnzVFDZTwIBwv0Qphftf9trn2xurWQVt6kgh2/CBtmupyoNXyF4y7J4s45cnzw6Dkxvs3FQW5f7nVLG2UAx2cewnYgW2z2rmeOiE7+8SDGLsxGRAtrw0BUJ26P6NUWZFY75LnSRrZ0hd8N0y1MtAVzPnPeV2PLW0Sd9H2ITWfkea4GwEKcdEEORTukAs9F0pntDSzi79uyBJr03ATh7wcx8r8bbrBVsvVvTdM4d1oLgyUTA8vc6pKS3SUj9ir8kCPJj83a1v1NHjrRHTHuTsZvMIqdTNc3YKWZBUrP9w6qGLOEz8kGzYYqXts8JFCA2EPoqugjngRZp6vH5FuCxTUcKSP30N5q2H308IvdaiELTl9zjT/RgRh4hnkYFE2Xicz4FJTdojK8VXdty6DMhMxbdZv8v3ClJVeDqQ4K+3+L/KUnfncXo6F/wGfClfasq9Zy7ahdeQtDuP8O8fFIEMu92tH5qJI55QaPxZq9eKoAgb7SCJXrhhUJt7lV0KoQshYs2AM2dwZ+vjiUby2UI0HsSZS6qg0eYZHdeBalXzb08/RU1TqtB1FHIGmy57h5c99ycNSA9Z/Xk5uOZXjk9SFXbPWeiBMUIM/gxJeFzbCsUEzcL7EFvfxfwLnmkHPu/A5VxgwanPLGEltSsicJjWr4je/jmfDWCQDXf2h6L7MTOnt5WgodLto55hSD9UmYkkaRzRQLwvfiugG58qkuMjb+SHuC5qHzu8oubUbze06oKD2ExLg59qg0SUsk+ed5P07PWAGU78Y/CGCe/ZKZQappnDZvFTaoNitO6HPLKSh2ChpmAGOCkJeNbi0ljhZVqqv8IExX6b4RPUrVXuAmnQPfV1eMjI51ZZ6hvmorsA4X70r2AZpPzpvsfwUceXPXBXMzgheCsJSy48xA2dNL3VDY6rKQ0cvFtNbZIR1Ii1ARSAwZzH0dHWjADrQMQqXINLDmDfL5pEBts4TwcjBEauaJzmJMDSQUyjX2lC14jS1nkUnIgSJP2BwNZdjjqRdZM4msBd0eJatePn1c8mncd38HXnKJDUNz2NgtoPbfAVN4pukLo6HbKOIJK1CkbkkbKJcAxgF7SE/aeW0wkau9Odm2A8l3NgDVVE2EMTx2J0y2LoYuNPzHyuCBxY9ifp7J/bK90ssr49Zi+82WdfL5y4fWwNIopPoOA7mzSnzIfZKCE9BMybdFXgHqh0Uja4NyssW90tr/YSrBvei7jM4bGaiW4LT8JUqgRGNwCD60/rOab2cdHxEp6QlmXjd8J37kJ/b//00g0+XvbLCxGTpenIIvIQigXKjHkCAksCAwgxoSwHwX8ErUpR2Qj2M4L6mY6wEH33dkp/V+XU77LzfAGj7p0cbyXnRRxYQvtaxokei2OTdc/Zxvw5AOl9+kIm4ItPC4ECmQIIGGusgj0TaKPxUCHzMPCMPBCA4zxHgZQHxKHCdQhCDYsp0az+o8lA1rsWNZKWIhVLBvbXqCuGPUiScmpRM116sYUM2CEccAo0L7GkcTcdJ+eaX+23uB4ukg5FdjZcxUONwd9lpje2ps+irU8m9T5N9iSj7HUF67tJVZZQoNufNj36L/BpPYDMPFC9sn4Qb3tHqcLWp5rehdk2IcSmU85Q2kNF5LrINBovkri89p8/jYl5GtxC0UqXJJE/8ORihhwM9SzpHE4MnLhNdqFBiYCs68yHScvGZw3akznfJdSyKig5DOqf6OvizMuXlm6/YNAbYBmzGLECJ5sCbzcwsPh1RKTWmqW2MNd++FsRc1zKFE6caSt3u0ZGnFXnNFBCFn9xV1cOVUx2QLjkU323e6nyrBiJJPSOsnuKD20Ob+FTPM4gxrwq5BRmhNAy/n6PLgvsR5tdftGSnCNvSXAca75D3l0T3Gi3rEAQO4qvUws828xrU7iDMSJzFDX1d4O/9ACGvyed6DLujpbXPdoi+yoigsx2eqXWQgGkTv+7NR8wkuqKXbyJHXFs/bMdFolTNPrfuxXoba9CKYoT5ylH4I6S+mBa6VExY6y06kHqZGpRWVTn5CjjT+pFBXF5Q1TupSd+MMqrqFdTdSrIyGN9xaHKaiivT8u6rAO8v3wopwOd5mPdB+zOBpuGkLVQdr/wackqH1q0GnjBANAHhtjGjrC/xjZl+di4KRDL+6uURegcXXIPbv8k9GXPImTINYzEJ1PAG2wG/sFh7kjuepcfHwcD1toBtfLyNh4V6VcyXUGHvwguxXLmxQ8qATOj5/2Uyn7ibSJYvt9n6/lXcytwxP/elaTROYunQd9+ovW6x4Z0k+KVtNjg55vQB2RslAtxBYWnX5mSEHAAes9S9d/5SaiMpuyGu3u4jlyI4AEA3yZsx7/j/SYREgtJ0tI8mCIaNSrGB1OnYZrXtArGhQZK9B318uu6lBTj6lvpkrLuQAR4HVJOz7j2IBBAXFTHC/eAUhWQE922L0hZH5Iq6gaEyVOH+fKq9jFAl2hs/7nC9H7s9SPEYcmUA95QwfXXAlZZQ/oi1beW0Eq3SXD+QxAC63rKQx4ZmJeFZBXHRbMUpsz+wa7bUpnYj/8xwbkAF7w9Gwmg/yXy+3fpYcsLZ7OYXIZ8kdHy1qcCxqWFSfqbnnukNJSm7+etUaNGEpo4Mp7paIuSKaajrt+L8DYXd08utmKbHE3Q8u9Spx4bdmzat+t7y7+wr+IZ39fR0y9xEIcsoMf3lyboubta1DrQKP96NoW0bQFHL7NOHlbAyxlbDUltS7ifUnrlD1R/cJ6tZGhJ+nth4LPKIKqfNGeWq/3ma24ExK28KkFr5oegr1H88MrfBXaZG6zzkqhuDzoanP/GHz29TExHezT955QNLmWlq3m3Ml3Oc8saW47Qjfk6f5c8oQ1zwekcyZiV6zYltm7rWbwOw0sV3dZbAQM3MYH/usL1uVVGUKY9MaUU8Sy8Hqy8EkEXeUGEf7Qks9XAII66UHRFUOL7+2TFdHZk553eAXPcXiuvgxNcY2q8DEOlXPR3koa+dF9kbBF0SZ7itvh22Om4crgJEQHRqvfUgdSIa1HdwWrpngruKmWhwjOJolchk/A/5QDNcKjFmoADkVF3zIItptXjJWXpG54FmR6/s+D6udGhyal5Jkawl4HYpRRiAnASa7QE5gdvPsO5cqruxUwAo5eEs689EPu304HP+fTpX6m9KzPwil8Yn3C2wJJCF0lwG9vsi6yN915taJNZ1uzHkTjpqIUeDA998fsirnkMw5BEwVjoiNzE2s0l39V+AUlDX8jkz4Q4isPadAUaKs2tWotmFniTACtRFd5RfcPyF2B/Ee6onIMHRIeRBrMJTSmidrGu7mQawdMjnRwue+HyFoSAOg3VXMSjTdteIsZj5VJZuhev8cPAdsRaZ8CXkaB/4cnyyoFdySmKFKHd4XW88799rFNW02Ne7vundh3/NfZW3ab8fNE6pJ4lYIrbOw6dJ4S/Lb0nkGezQXwggg6fvBjtYvgU/XPxfShUgKSTmtDar2/Lg2pxqaTrMzPR419joIjdSiKkBV3Lwgg9aMvMzu3BvtfN1pkMr1OZK9pt6cFB0EamKiGsdv12bEsg9gN2TaAArnZsGzpcWVYg0KPzX0wQzODFiayCNLVtXY0RFPE16nDpP9O+DIhlKbZzF6kGWkmsRzDss83FKRKZ/WisnaGHxU4VN6yXi/NZuwkVSl/t3NCzwCJN/EayhSQFPOmnP1yTgYLkkZ82MNvopVRoZZoHZ2ohIPyEnX6Ssy72a5WM1r9Vn+RJCufMsR+AGd9bo3MkO6IZd8TAkOkd6NXDIs/uJF3Rn1JoRXdSbBrP/Nt+GvobkFeHz4Jm3XvdVt2gYyi5fWrl14Dr9jj3GvLlCcPpBqlL9TCcUCzX18dqBZC8oNbbXDwB8tHLiuQW/cpjkdtnSD5cCUIFYkG6W9I/JCfsXejEpS/cFFviCPkxxurBZjlP1cYqIZyFPSTLsbcMCG0cGrZEQZiw8HjAeJhN8ZGehcMbHZniA3Lli9J4G9eslXduNxXdPSVMGi+Qvo0wlcsPxB/sTAIN5+qWfh3PEqfI2NsrbRIVgmowSbV1zDCNWLCGqjgSZj5gtoDUXCv9FzPue1ZhcFc7t5xWs1DX5r2z2o+tA4p2y2aHtv6APPAR5Zs9ZlPrrrMlSmuDX/fSsvjDbaQ9T7ZyvZUURV1wSZH4ezFBrdXCY8GBgDHujNqpR6WZO1zMLzeFs7FEy/JI9J+SVDPbdn5gt/tqFk0UwQiqexAHtlCJ27m6VJg9r9UeZ8QrMugvgXz3u3Wh5cEVkfaPx42J1ta5kIUyhgreAojfV+usw3HJqdwR7Els7NiyiYt+ErEI0RkFoQ6D+CxmWv1gknpG26gqr6rZJhmaGbVSIC+g1o251k9VSNhvaq4CgGmgwN/5QH4s2FkD661BLBSp/LHqDf2kZPiBLNMXyPr8RpJOQWFyyr9CeAoDAT5CdJW55wzpcjkWU/22LXwTkLZ3sk/eMF2cQcV473KKkFcgKx14ktLl+Zxo3Uneizzf4+FQu3xFP7aM+vFWZT0PkeJNthWC4y5mmWWlHAJ3ULb5veDl6CGIaP8L3M0CTgV3RGU3XtI4IVZiUsXNe9ijONhnMQ+0uSe6f4vLf/XVdTs0u/Ze6ZIhwhy2FkxGsdffnoTAY2zRhHJKLxcHnS3sT8r+3jYBtneqTeDlyt3SJBJN7ZOQcGcBcnOATZpaR7TilOaSN+BHkHiRuvyQOlBjNi6nBqdsjQhiVCOFOVWZU8NHiBOAemDAry3L9Ti3AJlMfKhwOlVvj2N2JhsbGez+EcaMJcyQV/GbmW4T3D1ojKGjFs4BVx7Zm8Z4nxPEKGz/a7p8itkxbVLA1hRHAlv2YiEdlQuJl5iR+h0T9QZt7zuQIr0RszerWf0tEbs++TlCHqmFVfKeHkJ2G3gG55EBmtIM+VUp9uxDtDW95ciM1Ake/nOwQdud2ydRkeEcw2uDNDimm2H8PBBQKIuh3ctQ/xJPQ1aYIT0idz4nW3cVBwGxHtN0hyvimdIBC2pvQ/Bu21u2bUnpHYwnEmh7nLTDR0okbY5S291DmGQKRjCNWpT5VaV8Y3A1wDgKbYzv6HhSxPMynI5nv/rgxEmbulgXmfsgZLFpjTrG50adI2fBpldaHF3ZbWgb+RBkPKeU8iT3KMA5h9809os/ppSs/bMfheJ6HbFgDxwM1QQuP6wRqPFrAW9uwbOEVGCt+EDLw+6U/Xzq2fHsoN+tLQE1VPcboythblR6t/B4a9paeIUFgh2CWUSxWb/0cnLJxmWLGx83fxcEhZ9Xat2Df4rznE9REfJ40mrdPxJWYhe6a9WfU6/qsXMBhoYJW+9iy1OpGabCK3qIWlruunkKCzt50/pQX9bZnwGVQAgx6XAiA3WX4Qsc7KLYuvRbNjb4wO2riFqw4V2b9tNEQPq16Oab7jDzW6mI0ZsbCjptd1oKBNpMsUFFlms0uRmckuAwGWEbk4qWPrzeDnbENv18+IjM1geXBq1IC/DlDksh93Sb6/GP19cA+J44EWwB1rAvFtAe5oQhb7jIz/OwC6R1Z8tPMRZQUcy5ilEGkN3KcoYCyKwx8SdUN9UYfmZcF/kU9ElQTPKh4PAwNd+Z3U0cGgBjtoCWa8mUh9FsxzF6DHe52HPFleupBKwDdD9Hv08y25PTkuGSJ3Z1WtFjEWFSl3n3eyhAh9xspcjeGxjazWeDE6DJVp/n2WFDTfj9mqDNTFQpc0FBSxhGJWwf9vI4jW5LQQeIr9Rcyg6rLLx8Py52JTwEtdmlsjJQyEfLXqfVg8ZfJ7q1CI8BCj3WhspWqf7FqzBN/5IR9FQ7TCspsDmVx1t7oYX3+45euhjnmeBM9fqLm6EZFQH6hmIkTalwOxiik76GayBFPlfNr8MdsdwirHvdRwP+oySmO7I/OtYFlLhPTrjZWZbMYaN7aS7bYnIGb25ILHK0AcGjuqBZ88Gw3tSqX9RRLP7Lpf1uylv7wR+RZfDRICv0QTQ2ZlBXHcvuZtSnxdhdADJOambHaYMzFOCvlY7pXq8AI5DYouGHzUeaq2GshWXPXcKEBVN+xdTmOL8prTnA1sUdE5IXWIDUIrTPGAmHTX0rgOfhjX9paGVY79us/MMbXnbMSiPs1OAPcCbgpXd5+dqQVK+OdYw/CPn+UOOS1BMGZ1+Iz+UFWSdDIn52acPLLgkDAVr+M+he7P/gv/PFxBGp9lJfzpDyauMHjEP6BVzwUc6j4M21azTD3nnFwJFhsWAqd+rMmEJZR/PxlZaBAmhGRB6Lmyu/9ShngS/1LLywq8eEnU8aIo3izDb7oW1C/AWa/TLSaDxLnE660hMBcGczdWRbcOjbCaSxTFnSFDnhQ454TP1eMYAim1I2BcZ8u7d2XBxs4olTKFsqnL7mdXOJn+xX1S6eU5Rvpb+JOf65wZY6UXGlm2+TTHcfQX6hQwOTYY21XHNsJebwrLppN9q7xdwXPZOgMZFrZ3ENmz/sw0Wtm2h0ZdHnlLq4WDyA1DWNBNjHCVLKxyhebvegAYpAeeHMQqTskfHxaGpeKbNQuIpJ44C48lSVnq3VTnJlJgVXJvoUl0vakwEqlaW6EZDNO8f+3kV5gmQt3Anfys1Kda8FQEjoSTZKLYHhMw2BzLzZSNO7WbZ6DkwJOtlG+RCdCouSYcFPwQnwuaQj6tB4l77XjOExYh0yhTn4hTwJAUb39XM/6vx/E7FbPditbN4/Nde1t9OCRf/2Q3xi4u//0uo+fox+dbny2dyqQSanrgPVQSLOr1x9Y4BSn9Oslbc0hADlcGX6vbtD6F2+t6dD6RFkHYD+6xuxsF87nJWvH/f46Yd77EFdOIAEAajWKCVdk4vjmp8xRIwN1RYrJ7+EoiV6xsikzJgPx+MRdeVX4GYD+pbfmJFaOKGuKnQi4iE41iBdYhJx6c4ZXvaHnghL1ZWzP8u6bmme0NgOMVyS4LIiXOi/c+juh57CPQ4mDSuwit8kUN8szDg98Qoa2ZDsw9J8XqDp7gnBtL5oHili2OtgvfGTMnpyoMdsJsMdbFLtnj1ONT66NTyQAIPt8AHtKHbzW+RdqJC/wehNQFTlYiCXVDHrWrx6TzEXuKIPA5IXUGsCyO6NM+FrWVg/ZaoXB6kv7xA3Ci5THPXz9g8bOYK7tvmmkkGl3yuQe1l2/9ooZGqBlDZwT1s3xf2ZAABnilDSshWDA33eGCmwmwHPP6vpCQgAgw6Lh4sp2pTpXgIybT1hrYVQna1nGYU1FfZG0tHeI4hqlgnId0NKEw9vQgHdHcp6WNtvD8MsSkPvs8u23GR8XhSO+xrzns/kk2TCtZI0nYgkd9wYElSu1fQHVj8QgwNCfNSFVR74449YdsUbq/sk7sR6JpWaagiu7V0yOj4KU0/fagwo1pgSv1ghpzaB7anGQdWFmw90p1u9fgCZOIxG69s4pljiggcAJoNg79JRcVTaOFTliwaPxAhkg/D1nQ9NmlII5Uw4H14lRYvo5cXmYL8iUogXJeC1peiA8tJ3rxYufOyV/oJT+MSp5i6EnQ7Om7Kqndz2MbrheB2FqeLyIdKISUj1dGQakRz3R+a2zqLb8LR8vn+8sKU/M87uAsowBaP5qEHLQD2vhBam1aqiJ++b6JzzCJhyGWkdYzBE7nsGG6i0ZQYdl71d84YB+gbdMc4S3H7OaSDPXCaEHp/JuPWxUn49QOyhSWlCzF8PSVC/ywNZnW9i3DSZCkPSXhBZApvA5gJBKWZ8fxWTDcl6uCYLTHSPQNwo7cOpAe9Dw6lJoJFZD+d/+BB504+ddKFYE7XKRdSJaVHcBQfxml1KDCVNYtftr4ML/l2llbGZj9dq6cc4dkHeHUzuupNXFXax0gdhmrOAOZDIxn+5rGU/6CGf5Pv9PBDyVgFnKfZdScHeyNfxUrVL+T1tEe4w+TezdApoA2R1I8AutsBjRDuC9zsck+niH6RnRysZMdhZUgd6tvHg1/7OUlI0IPoUBBQPBKtyF/cRLjRLUJ/J1YiR2A6t5KGH0xv3bIfK3elXJUDo0ryveEBrmYCAHr2ERqBPqAAUPEErEjEzcRdjigVYiGoNgV5D3Dv0cZbZUYn8RgeGP8XA7lpT/eEjIeN/DDPnLVj1cBTTSbfO2H3QHq+iCfwlGnV4sKljZhbcSf5YePE6IfN5Nub2nr82yvjWBoioKIeM//d4+7Bh37LvE2QF5Oo6Uc+3RH9U+hUli1CgJji4EbA7Fmzcw3sOMIJUvCPld6byil/MbZOSyA7F1/dGed6FIEijX0xDVBgMFAkqQjY6ym2BVJvwg/vGXGdlCexRRhuVAibKwAFRFMzu9w+3+n7URJYQEIAsf1KpynaIBUu/nspDLeHVEOAMWLhgsV+y9vnj+cDtDPfHB2WuzoiX7ldYLwJjSKGnnUcPoJYNNZC4O/xn+0XMyAflLRMzACG0JyAMdInpsp7ciOVeOSml7eAGz7L6tQd8hSTf1rYCYKfhR9wVRXiTl+s5ECt4CkeEzT1ODiy89uLmwehgO5IIRGUM6blFPStPkT36eW7nj1KH9+IDRbXnlMSeDi5leRoqVJORfziLZaN08vT38AHmRQ2Q5PlielMgeRc6Ymwce68xcPV6wl4AjaFBCsxUHsz3hwyGQ6mifrYnTo0doECUmV1JkO9HHOWTynBPZ2AX/JT4BfwlfqTHuahiFHHj/I20d731VpnB2V8Mt3UhyDgYvturPlQZ9hPmUszBdf12lC4emwfcPdAaIV8+BfS8S5ymRdf9uLGFf8310SOhsYP15iQZpwhmWA+x5biJm2nCNuiTrZbI6vl6aI+pp8OlfCgywv7ZnBrz1xUvkHWTooqMRmBRSdAUg9Mwtsu6Gv4lzaQlY0sErPRPRUWI8D9smlJ6RQn8rV2m1h5RiBdzYvbDjOApo2bDHtrJg8/BnldsupQ4id665tXbSekCpz8flOPIwj46N7sxJF2pmOBUDdZCBGi6KA3Ef3ukivYRWtFUtC30Gnqq3kTrwW5WOAkBk92ERfgUndI2t4jRFIiOy1/KgXZM/+FitPcmDtv2XHFgrT92JULsTx9BKwACJIMA4R0gfN/SKYcI+3RHr+4WV7t3aLJl32voIQeT7qodquFtoNphHsLSgZlOIchIhesyXXR8Lneq9kztv352nZ/j9bJYqDFPTnDRA1dP3oTM/VaCQrYspAAzPGBR2EP3dDJ3xYU1RwDFjjIeXCu9kLLtoRxlrippb8U6sM6PRgUO2Z4dlTA5dqikScK4ZxM9z7twrmzv6J69LJVBOVLRiY8C1lLAJ1Ho1yPZsTq2AB6pakAbsgRgiHj4+8xEgRQkvX/IpAlv8CoLRYseSZTdMWN5j9PLtX5vnQKAt0W8ZfJVthXiswzNP4TE8dJYvT7wm5mpyIzg6z906A/gR9tmwuaNUM07dXrB4xzdVQBbmztn3jzqw6Bgxm4RGYhy5dkXeVSEDeObbL7xwPrX41xsfKYEYq94XzjHqXk5/ZcEB+af74qHidIW96fzI32BxwZihMon52+NiGgeh9kHBc/zbSDLJFYz2ekTqv458/gfKq1HLUsVKJDtIZbMStbru97AkCR9pdlzn+78gN4baO3p8qxh1pv3ZEpy8+GinnAIvFFSBAGZEAfT2oJKgw2KwsNzU3k+AMqo4F6RorMrd9cHVhizVkFShcbHDMtbEZwT5JkB3/1Lt6aA9HcflJebVJTZAMmrjo3mi9HYJxVbhzNZbRUo5Ik7ItNthngWM6MsZ4OKvahi76k5dWxey6PBdOu/6snXyytt+oTv13p/qco70y8gQQhFDjqYVdHd+NJ5woLvcxuLVDdVJ5KBeyhAMQGhloYKvy4x/t7VsYUHnEDyzPdhIv6Sr8DsxBzidOfoLcwwiOZ2ekhidwsX9Mp3MemZp1naXnQb/6Y9ffJnWqNe7wtbds9WgxNefwDhIZy3G1KWjSIgJLqXTlZ9oJCjsCgsy51xOR9e72MyZ4OoIO5voG440bnl7rql/d1y3QZFPG04oV0aiKx2skduw5mAb6JrhS4z7P4J3tFhcrD6QJD5NoPb3FOigjginI3nP3Zrg08PldK63IjHEDULry3b/gV7g7za1CMx5a32QNUkgth9y0SR1pX53bG92AWO5ZD6b10cSvnEhmddmJh6bkOHpfgTRJHQ1+Ka4xRxLe8YpfblwnfdHjqp/iGinZ7aXVQE655ftSZP0L5LcwdV/MvmKkssyThk8xbDtGQJ7/0LfkxTQEIs6jKCf9Vj0mXZjvskCmatyW1cZghr67TfSd/eiEjJbf9x0jLS3kS9TLi2RB10qiQVOHPG+0rxKY2d5kQn25cgqRU6hL2XYuWmoL7dmJ6ZM2Ult6x2+4TPCcJzPHUhxxzVhnordxlxSmzPBfTr7UaFwZweh/EMadP3u18SNHdcvulXjCmJlaqemrmzxeA2l0webi7MF1RhstUt7dpH3MIUEozP6lxrnA63p0qE3HHVfQ3GF8VlVePiepu+aYa6V5JOxzwE0PmdPamusAPAkgeqKlBp1xdkHU0odHbhsfpuNCIcw0E/1/XmHnWjWq6Oe0gxRSO6n7XaL5IL72xBiiVRrosCs7xhrRQQMJBDDuyv3e8IYKz1GvnpT5xuo7ZyBCmHQVB1jOoMLKdSyzCOIzN4wvsiwG2GzGocZGmYT3xpJqRp3Adm9tv3KJiI5lIEDqIa73UAbEp8rbBotqq4znpsSonsRu7Ikbpz+JJgb92zVMz7d2JW3X87MmVYYNu/z1uPUKc9kOeP7FBuV64CRpZ77v8yU9Mw4kQxP4f5piTIZLzeS4qbabX9qkbaeQE0OmtAZ7Pp7sS7K/D1bW/KfciZh+KcSAFeU7Bjv2wbOnSIiTK8lyN5ZJivb6Zg1DWmM9yG1ErlBHIqjh0WFqnm//5rrLvKuWus5riycZcjTMA+NyhXCqkCttKbu9rX+vrXd8iDN5S/IJbdqmpBp0Lna1b9oCGWKOS3oOsPbqlMR9Yd0vZhH3nTQU/uy4Co38vgoFa9tkepfMz8nl7hp5j5dHu8ZdIE5jEAWlWShQnW7vJBSZ0qJMnIdY8U0BrUh2GupGaltgBhwR8VyWlFHNzc2Uo64Ex8PgaJ2JI0mF/L49eQ7mUgYRRt2m5eiI526Hbzbgs5XAiWca0qIPAYrT5amTHL9JCNUKerfOZhvETBamebLIwjlPYxggPKxjHjrN0Q9g9teb3R2LemPTG7ON9qdGTqGJfBHxVO45VbjhQFmPyiHcsK86qW4engwuxN3aG/igRAOsBYjJ+l8nasov49wXg3pjdS8AYzYM+JJHynmD0a21FRceCGJEIvnC0vVAoUopMc1m8WQK3nNMX76o8WriTF3MIrHpMzMv5GBV41cgHaE4AAStPwoKkYnVQ39C+DtVBYjP/sU4DnlV+KgoOFUMaezRu0mPg5wNfTkHhNLfPrsghwtHCAaijCdIFfVbBsgEvlxHw8BHeJi4gxTgbubRXLrAs94wDYJb8hvkjllbpHaPaYcIuKjnpJ4GPTIhXWsEZUwozt+ABA6rnu8lM1wxdFPGeI9Namfzr6m7CfNm0FVnemxKEf185BeIyA5k3KvasCkbgi+rfx3EA1rohWWNVUcc2PFtnS0c7kWakg7wMwmXGSJMn3RY1Pn3wOlAVMTlju58h8oXXDq4eICa1WRSCrVr48SpWGZNMUdSOubliP28zDDeQp5PypWL9T1l/1mqySFxZcbl2uFwpwK2ErvIxS1zyNt0k8v4vUl0RNtKlukHKnjFDhTkHhYBYNLpdJiAuT4N7cSzSnkqWeKR5cnMgUg9ph2BylPJhfxTwS/rjqrZcv53p3S5nUzXjLu7XX2ojWfMdU3XjUdMcLeBr0CExTrNMlxWQfM78m9qKJYrR9qwlGp0P7s7Ay7YV2JCg2bI1RJPLRshLWyqN6YWtL/dDmBjxsxg2muF/tQz2dHXP0XooQkgUMZriKZCW8/ZXqjQPiSVAUHJcoMpU45cuqqGShOi1j7qIecBGq4uEr1lHyTL6K4i7KjNU3W3evPQkQO0u6g0mgRE7z8EmKSKiOH0LIjx3vBhK89fyp8VpMAX5fS0fHlouSK57f/a4PYIqFr8qWc6RKqXK7822Dw/7fkEADvon7z8FwG7Dqv/Q+ARs3+uIBnNI8aqtg2zOqmsi95/4nFM55QL5Pne+b7OMPtcOxO7U43ZmBFflAjOhHqqJLyPGbvQbqMy94d2vr6e4vzVF88Wde5mGgBA2ngqV0+EWB8JlHQqB9ej4ymN8/3bmfupKQSkoE7MgoeqYjagMnIBFNmHUElw9U6SZd7j5+5nnaiwioXNp1+PHRmA5JgutQMdcoDThmammzyOuKJvDm6xDeXh1FGx/Dc28LeMBNkMVQCVJvyv4noaKEOrNudukV2AB9tOKxe8CFHS+/7ZmG9xa0G5Oget6jQz6zV2DSRP+YVpn3kuzeIRieOVTKM6f2eJZVJ2p+NJ5NunGh0DiEd2jDSm7oZjKs8zARTs1GMXrcUYyJtcBJfmDBkJ+vo/un8Kp7mTYWGBk1/xzU103QDv1rkq0kWfo5swaglNjEJpar373Oaw0cTgy74lQlunlorFU0xCE5XKu5htVj2R+EPr7ppWLTj3DHvlnwQikAm1euY4MhY6gspT/dkutpukPJOzFU60G+7oc85Awzs5Rgzs4tg8g4EpucAoZ5NFn4coAnYZ9w77DyGK1751/kWuv/w/qODFeWdnKTajqv261I5wrXn2emkBRF7UF4Gjca6mDgAG4tN6Et/RXsSrwaVcUZqo9fejFUeTGMZ3QBtAUDVCyZ2aax6IfWgYhCLqxFlWgB65l+Ce3a6kV68qMYd/0l4pLJnfRJxphNVppPw9OxLmBGkNhJjNdpJWy6SXHm/nArQ0HJnRKaVg/CB1XzAp+bqrxvTJH6oZf4RELOmgkU/NJ1L7s+bJ9XJkJtwF4l62wHKHIF4EGfSf6EVlKcvC4bvheoPKtkuhr86hKokRSnFSqu7VeKdJ58JNwIJYI0OnuySy0PtQA22wZmG50iPAqyc9rGVCCSDd1ulj0knQV/JSo3B2/zpW5tx4Qqy2aEsWBEXA1Gc0j9AB4JBVJKImTbGpxIXaXXvxymhhmRJ+h1lyESWMsY7xc+NHlyyrI+aZSANeK7mU1LqkfJJfPt/BrkZhr32NnVHmMXMzJPyEyh8LL0FQF3KqGWMQb4ALV/sVPl5k0VPAjreRD+nRUAvMqK53jz2J5/q2kwIEPMFdbHqx91BLwCGuATEEiSnYWFBvwD9w/MkUhdwzXf8RoVc8Fm+3P3bnJCghoVawDSqbdRhuWKjlf6cSHz0wgBj9u4QeKX2BsrNOp4h1rKIOlPBdUQy1q37phnHStgNB6Ql/oFfdQ3rcHppyEuaNrooWzkrzi6qpaI7UQI0J7SuwKf+Pi7zhIIef8o31tyj+OFqjS7qXE7NzC0FnCLKVAh3UJ7P/JpqmfjmK1w+7jS48D2/zGRrX0eBG+q0NI6jBMLUrJlDPRj1NvfJGPi8nk8SB5Ikr0C2R4ceDqGB4yJdfwa1tSxdjxgZ0Q7Mvqc0sqPcRdNaNlKT/Tqkm+GpWgspAQqVuh60skvZkgR9+lZSeQekWVrrDGFakjw/IwgkzccqpTKve1gZN+/TvWkfJd9+Jniafl420e2ug7tFDi1y6nJ63OnfjapPenkHtEP5OsId135hc4tSqpjowgLctQvQ5Bp9pJWYe46RYvfrmab7l3+xAsgMHxWmVJh4U0A8AcCr0y/eNaQM7F0huTN9QW4MkFbu/1j/9K6rDur1GkGji716H4TcCAZOiXLmj4JolvdcAc0b3kysGC9v/oD7rb20133ct6ntYvtKDzRoFj+/xBAXyxhGvdnfzxoaqvow+hpLprbVnZ0fnyVXWq5a+IXn3fCfBFRWh+SIrkQ+jCCruUwC49XfuooV1g3xsvQz71yLI/b4QfkRRCloJu30qvTvtdqv1opeU9pfUF4cAMQlkSRHZq87GIsBhL6c5MZyM9tuuv3ghJTUAleCKJ3G8EHzI/iJ6dlr5vrdBQnv+9FAfQcmPwybsa78Zc3y8RTIYCiS+UMee5PK0E+xn/M8xyVBhaXCmMPwCYPryGVFp8jZ9rNmcaXi7KaWG/BVb0xSSQPPHtpAhKRwRDeZ3CsbVP8BfrIUeWvRdRgx4zlG9krN2G3vdS+uzaY+UcaRBso0sGNfRo4G+qEfB0jQq2MMpDCpcYuBhpFaYzLe8yz1XGwMHyYWUOvXy5O4O2DYlk1/JVL59rqAQgVppJAwjKQ3upBGJcCeQcWeoe1GXROgI3GSxdzjl1W71364QTGPrqxlveu89q+L4b6oR1QHo+VbsAMPuT54YqHkYQOIxfIHkCkgPuBE/053sycVe4C0/KOSmIMaf85ZBBOe291yCaQdl+vfq06jlqccbkV8Q1o6fk9YWgX8YLsRdkUM7O8m5cy3wgW6y3YOhblkXvH5jy9EthXWwnt75qkBcFx2hoDxTSCltMWwmO4XZ9ez17zm7JabcNZooU/wFgTNvFNAf1uINHCYwiOKofw/Ql3S6Ngdhm2gDaCsrhIUVvWJLXP504WOBKYQetYm25SpF7VZ/HcGhHTurELubevjKmClkt7PCKfxLEnv0LYq6mmQFJjnAQU31m7iB514v0Pw7ZmsAMU7hndclIgOtl0wUV+rJfmAq5uNzj61C9Cmd1RSI4JbxisaYqBxQqbiY4pz8fPEJNCFsSuV7x9dbIqy36HEc/uqOEqpS6Vv1IaoSvQo+2rF3/al4BCgl8DpJb2KDRm8+tkGQhze7BArJDNsMmQSx0nrvv5cD+YuoSKT/M6cUSM5J2tOk8pTuSdF675zQrW8dL0kjLw0sPZyBppzaP7+A6uicTok95BEExfu5pekExfgwSSlAno8QVEPRtMZPDg09xg6Z60iow5ntjp3ZAnsndaFhfAeFMt0XAfsOOzebsRvsKCHmioCE9TzHN9xVq+JjSqf6DBVstiJNYW9GjLKibVur7QWOhf9kQK3sHXxWrL6ojwl7QhSJvJx1/oNnHddiSwBiaWg53+UVbIXekP/wRKyS7nBwFU9M+ALEzw8pSoxBWTD9L3oSc0G0qfg/iUR+apzmrmsoCdD/OHYQGWbU3xePe63ItgrgrLbax/8RD5a+SGRtypggRHRIJv0nctFXxDtnALwRF88S/q4RMJyA21XInPCdLTbvxuD9PxpEmc4z5spiN9ErjMbK6HH/+fRxyQJke0loQv4wew/U+fJBSdps0tTWGfSxFPEUuLkGr1LYqitV687MdguO+bC76IPeGD6koFtG4kY7KN9eg2Wbwk3rGdBXrkHxWdlzOBS+b5EdFSTG3jltLUEjrQWXrIRxWcxJpje4XexApjR2uiQz9+TMh53vfIMExoe5SUN9/pSf2vGX53ckIaaTdgClnuA8Ahc5r3/GY6DId1FptLQveG36evV5UUCYo3cPkNlOx88iifGJJGLtYmRaQFjJgX9xzmdm/dU0/5trLOYJ5I/IRMh/Yq6HojQQJnQLAa8FNHiu+QSzRZZviorNSNXYp+r0UqY4opDbsC8NiNTcTGajaVMoqL8WwB5/owESdtJ2vsgKkDqAtxS8bl1pgLFoNhG8Zv3xE3ZTe3Y6w74a2cae3CkhO3vT1hPmB5PP92kxcdZAXjIvo6LoYg2CdRqEVNnW+a6nwri6FxXLmBsvum3C7Zov4Uw72jI/2rjx16XsDrEBpoRQ+nX/Oc3okIhQsW2Vx34LiAkwApOKCT5pcGtGvsxSTGFE77mI+VcTJk+tzDxAi8n0zBPaEHGe7FwSpGm5M0zSnqmzNnQWa/vA6fI1/KMSRsMXZPEgdMpGpg8bkh7s9bbxpaSKg9y7uoUgM3VKIH8KY74FUJzthuPFhVrBMU5R4zMOOM7uY04icQ73C6xb/1ccoxwFi3a52AXWJxIW2XmlILTu+MU0XEt/V3WETacx6PXxKPE9Lt9EHb6aJ3kcZoW9VH2frcNOHRDZvcN7KkjKK0JGbX32t5rX0IEsGdmj/d3USvIRgffjYYZ2K4Q9dEiZF9Yis2ik68cTsFu9mQhMse3h4B5k4WHjgF6nWIjPxtgfzDn9CVlDfo6mIkSrDgwcEfTX8iMRVJI4gLm3TkS6NpjVv+Qlk9bRhr6h9fSloxzZ5Qls9fd5pp0Zz5LBadNWi4D3XP5dHc2l0mz7cEAsMW4yeveskEbR9kuuxA5p4cnrwV3QDn5S5HeHNz2jmyl7StljMd7FHbQLJGBE5h++CBVFM8lt4nDYgUmGnUI81swjF6CasWPTZFEXOGvLsPxBxvPRPCg+yL7x7XX/NCxbQrtlzTMpODvGkbxIchX3fZxCazz9lpGbyGRqr7L4smN/gI4lL82xsZ50yC4qFQ3fXlTrkP3mrNMRAmza590DnDnT3lgE5pDUpXlUTpnxbzA8Yx4CYVTm7fJn0ij5M+3mChW1gy6z/89/UQh+A3zThZYJQIVdFnkUbszvJEdpox0spZ1pB6YdL0xWUaP3G3kFfjssa5/b2feDWkfYyNKfeNVXTZj7psgkhLUzKJrrsP/0E8tVfXqVTuSi5LH9KyTQ6jNWdlq01DDxOxVEYrByLNgvGQaKd4PJ7N0Ilhk6DF70NXlRi5jlVgqXqGeJuDcNceIdMCAuw88ta5/Gnt/ZeZdPbGheoKVepmhjkfP2nNBoUuNLJM8bPbFVJF3G1OtYU0YDFSPv2qUj8D0wzb9zBPt18NpOFx1wztxLdx4SJJNobMbTL/PdGRBX6+YNkAVfrl3YfuzRGhJxsWumHN55BhymnZ5ykT2lAntezUd6U1JPJlz0Bt2fE5J6bt5U5jozDinDB2gNVm6NSut4Z0NcyGUqMufju+jldSG/tEUJu3lOHNH2EhC8IsImte6cOEWzlLjYFTuicgQfi9qqmhCB7aA9+LPhvZRp0Iv01YsZFNC4rOuzpu/yZ0OFiSj6XSLcR1Cdrj0079+BzX5uPUuYLof6CquiykrNagjYjF5H/q2j2/fN3iXzsFuiKhthwR+rJ35yr/zEwLHgI2Y0VlAOlcoYlxV6VUONIg4iNGveRZTXyVfil060h8qG1TSOc2PG0TKB7kqmCTZAmxBbSBqyy9pT9dWUPND/t5o1G6yAUS90Tfc8jHE6G0hZYMPD3L8hysk55klWmthVGb+0YJ9CqWDAOFGECWgFyI1UmT9QGYHsGTqezxIPGa6hYFtJJ/ECGdG0oOapd2K9rSd9TO6WVhuSylmUqN73Us2wwOGYHsr75hCNTd3G1VZszdks8n+EvkEqu5ZFJJT+H/ZIEBtzi1KwAvwaXCVAj4TqnADuIH7U6Bt8mmpCWAny3VgsFMyDao+Md0bkETEU4jwBADLEElRDD2oRDl6LBUahYv8cox3xxCEzC37VhrKeezHWci0E/9f44VTsh9yDDXAGmS3lrls1ln6urJ/nbBU1aedLg0nNPq22NwnAvqMTV25X9EOaDnNuRWB/URVfBY6ofryUkeMG1PvbRCHE3BQv+IdS6CNv1qKAMIM0LFVTjqCfQgWS2vv4YBd4zrepDcaqTHqTDbil7YT9Fy0rVKeaDQs8rQUGiiwuL5jtUwk1rZkWZlJzMM6OKKYnFE0CKKG/6su6kqNOjwhTdtLAnsRiqGHfeankNVmV2UNQUrMI1Pm1dyti5jb5cdT0QMRsPHfiHq9tNCwWJGJ9vlufSgjXkQYgW+gLKnqbgCYu9lsviXUq5l8F/BGvB7ZQSgmIEhAdH4TzpZNoZsqo6mwHgeZt+k2XnMRTrNHDuR6XQs/E+y2t+VAEMDMFSruj5DtJoO6l6wolKb6Py7T5bdNvWb7eY3JZf5IdWLnqhzmQGK42CcE8Uoxo+Kxbcvni0pBjfkSX1QKj5PnhvveviZaILCPYjXhAugePF0sY0bJbFrLPReNdVKYtsKYf1J0tPk6avVO91onz4408lFnqEp+o2wQDg1kF11fo4MPuaN+N5+HvtZJyhKz5hLW92G4aH5xVXmESV3Aa9uzgKcPsNtDSJV5ICqdxas8rW8P3uoYtuP9441zABGb5q9penWo1/VIx2qQDAt2aTOCUhPICF8D6/r0o7mJgyD7FSh7gHCAFCXeVp7MYqGupDzcp6n7a+i4YCfzlseVkA3QWhSL8L2OtpzSkQMmWZ5ST1slxCI2wD7lMvWXqrfHzDrfROInH3rKVB9E65ysi91VLmROQvBA2u7/MIaqBBRAdkIXdeP2h9ubdRqLEKfjBQnXyQUroPOKqGVUX0vtAVabZfrn/K6FM+BVpKPwKLwdMtI94FBGi3qWAXuuEWGPFTKz5pM2bi4uPUEE6hIwQujObqOJIKD0nBIjKAve6DdarT9KdYs+dDyM7s243fLKo/gIrB2RH6EwzH9tRN9HJY0SQ5lT11cu0SU3ZMYjogtxbsfTJEbjqCdxYX9Vjx6nNQHl5qhP5LvEri6j1NZbDSqZQZOEW/NzP3Rba9KBspkDANazyo4Sa3bfFcXD0klUqcHAFW9dw97h/BMgnIK6f522sEFscXSMrSKM4mUp9hQjFXPFL05DSTb6DhFC4endFdSEpxMXWuO+a7bru/izlmfTvc2ZsSysROOzOPYd/zzQn5b93jgpZH0dqkQtHNtii0J5cEtLBKp1fFObaPzaZ1HHsDYBZOjby6InV0aXKZwEFwhlsHLnDdaOYyRy6PmFp2rENqRtq6VVfradjMI4/ekMG/66A1kprGsFh84O5mHLErbrWi4PAUey+om09mdUE3Udtcr32I8Ke8gzaQqC9MYGvr4SyRGWGLWn1NuL+frJo1IBkOU7uAr49g3hfZpohaIG4vUuJtjHE1Ntg1uqX1e2e7Pw+RxkDl4uSnJOZT4sbnwHt3q3V52FtYe8GWAhHYQe0sZo8wdZau+l8vZ8DOSmSLVPHx0wR0DKC3YgwJ1cVLZUmfnhjRDkvyvA5+0g2lJDDRdYEi/48VKDifeCTAQC5FEnrsyLU6j6N+jBZJ2DAnOoNYUvsFlu+i8U4rk600/m5eK2VqTXxue29EHlAFAXbzxKLgkaTWSiZD8sIKzR5zEpFPaJcSJkqnIvQjJLWrE1IQ4YoWnCiQcOVe847a2VI4Gef+CdFowXYK93taKO532HJ4a+WUjJKaHru252jQZGAcT1qAfeGftgGkX3ZGjExHgGS4ibJowaTRwFmmJdIIkioBIwSp9bSF/icPVz9PfFbHJoiDP8k6NqyzAvMdTr0kZK5HQfcWVkhel/aPJIJbhDVkJp4DBghCH0xyp8uIA2e+MGbR/kixlbegp1AFCAdepCS0b/vg2ZRy8MhqvZdorU09TN3ua7LMVHCbKEaXJ+SVymVEveuVh/TYanyYL2LCx1eP53r+hNGMzzs6cxU44c/+dL99zlLzED+cV1lbupQlSCbGjk6YT8bQ0NtipvoLmlnBQ65cFQuWaBXtom5WbTG7pH85MpVQJo86QVK1pGsgpWbf6WX1C272lPyNs6No+UYqHaOsOfKO1AS8OWcPkht+9bDvVHSU6/Q2/+WxTuWEB8m5jx0HST6iySNSXIBlVAc1/ieLEAOWZddYzFtVJArmSQtTJc5YeVvjGkwrz4+G+xrhy5B3AgbXUmXfDjZe3bQpDYmYBiJkCKyBKUHP6fSSGSHTa5jl9hznhbwEGQods6oRYPEjuFNyrUnHq2mfhPjdWXTI0AB94AgZ1WcaFnlkG8273eYYcIsp+E8tO6xo5kdPF28o5eTTTR1P3W+7juT+i6tIJ/X+R6jaU4X9tL0wQtYZLu/O38/3im0+g9EpljglWpPRkiiw3rdXR8YLGHaqBJn3oxdBZLTjJ1bVufRm7k3fggUHMDJTcklbh86VW46HTXiTq8VU2G6Q1jx37oUJGK6n5QSZeDnr1hZgTP8vHyu8kVy4XnaHya2HPE8bGC7mzOcAGBp6x2S9lnW5bgbL1FzGBD6e+5SfL+g4kTtay2Gdy94mHa0PDk0dCWy4QSOrYc6D8CZpA+ZlQk03XDTCLhYkJRKmtwZSnfjmq9LrPWfHO7Kta5Dong5upRk9gVuN5tBhID2/fSIgUMfSNjdtcAqCP4au79lxZ+TlgJ4FL6U90JE92ZtnZgVJpRw+l4HdgA971ecca1jZ/JOrUc6mDjW2WcMi2n5CrCgaizPkv1RkKI1TKNx+j1/O8AVVqRA/aCq7xMrNOkNZpByenS4L4gfim9U6K8dYbdSHI6jZeMWxtmN7vDdhaswdnakj9+K0Mjd2F/aY1upSzIxYOUov3jSp8IIbwCyuiyd4m1KOvMalHp/GHHxYrNlhkSt/PR3w1cDq68KjHcA3yASyoSnXRgjFK8iIP2FPuTyo3iOffiebsxfggXQkfXyKVfwk57mTF+h7QCsNgrF67IM6H4W5bTpud8DICuKXhkBf4aHEOSO1mXd+JU07c61Iy7dHX+78Mhq+EF5jiIbcKtsecnwhCgS+DxIghe/HPDXweTmayk23I2nnHYe5ROqwIm3xm7URJzXbxJozk+/439xR3kJNTBCHJY2V0oIz85fsJkNhCQiPZAq3gXtgg/vYO7PSF+TPykyy1E2/ScsyhlapNDBiZGM81i+S8pGUt2/KHBzuLVVtxSInylQyevd8b4pmUZoyTSLvlLoKlAXvb5TehuvKdwptPh+QkoRsVOLrY4Fk69kJVbbpBW4ek0ZKzdJLhKdzNRjY+Gfp07TJn3/i+YoFPQw2ZbgEoF7AQqHg2XivDe4O61SaqAwONe8pG2J+pJb3qv7GLqtIpUnNYp6KGcFivZXqmDaw37kHheL00xuZHSTY3DMPxVThpn7ugvYP/DwZKwFPCCXvkW/2bXrI0ZAPyfvFjYGMGFuM8nIa8JJQvteLz0e5C1Vsx/bj1CvMXQCQtzOAV7xZONl+9bb7eayfjF8IKv5Gae+EnX8Ul7P8m8eA+AO6cM5+DMxHWc9VKIcHuoz2LdZc6JYLwofcuWPu8TJnTMIFVN6ntS49IXUFjJfFmHjbC7VwM48Z2ghn3HEux/hHX7w55n0px3068mlE0qCAvATy4d6akAdkBOz9J4OOAffJwhkbd8Udg9NnQe9kZ69srYVqwMqTbDJdTdQrvtQf5BOhEkfp/mb/vBQn7e5OQwQzhfQgn44VU2qFg+P1PGaTvzW/xNpQ8lyDRoGJy5qfPHVTjsGjppwcee5cj+Nyjc4z0djjM1U6HarD7PniDX8GsDUA252bHvBM8dYlTTw9/1Hl0SFpw2eKUXDAN3KRcRRzDRrx+fnQqvCy9BFADczeEXShRL1MNfnt1vGoB0YMv5tlygSDyNO0Z5hlIwYVrrFMpr1K1xipmCnXx6QlHPh2CL4zwdXnjHIm57JJRX/tPtlSXiVA85JU8QR3+tuMgXgkIraE2E2i5lHzIpvJtoPhtOOw7H36dvqlUaWZQ328W/j30KvK16yWNdNnk0bqFNDMDLppMcAJt3lnUB9DhJcEEBxUfDw92L0Cw96b1kXzC5UTSXsryjb668XFBx8aWW0v9dQVpjsuhOaHQBFVZJGnVOsVxjcjqas9EcnC6nlAfcIkAQ+FGfRwaXSsG7uYrvjaaaBlibTufMcTIapPprovBB4N9uYULk2E6XuLG6mysTDQh4E+Eh7cO19LyJqKuJX6Xa3pF182j3VRNhIt7wwolkajkbfGvNqb+h79lvZn5ZK5Cnjom3FAtkdBBNY0z6U3XuxSBQfLMjf/umS0x8pCMlb/hQpyccfUZqbFpLbscQtsQuceuGMi5PbS8sVM8CXezi/mR6NTmY7bzRqGsZpcoBLvKDPmw4VvdVbcD2CJwPaUSYli+SmfEw9tr2gSuGN3VIKMeHqjDrH6Wwu23XMUYQY2va0yi8/DcwiYFyqfhWqehhVBMYc9KgHL4jOtZ/nY46655zR/jvwhQHxbAw2wa2rdNcgHuMfsufsp7XdI43qn6td2HxOBK7DbP0zP9CFZlTplxNsyuCeRmTaVdpGeKbkMzSqmvLr6iq9KGJjbm0IMIzgevu3iKCzMU+ul6sAVySlTGKUI6IINf4kv2dOz5oQrMmriedc9mn8MSRWkbanvNeemC7h7FHssMGBDR+u5Bz0MZhLS8VbouCSnfuR9SFmiuJ+76iL/q64j9ngsR+qJUk3Y1ZgBawkhlnEdiotyAqlYSBFikZ/U7D/i3y096KFt3GiD09pPzT8AUNHmbbZOnZkVUIlblQsOabuZbSY8MH01iMXPmeeXSDP6cTppSc+V7sXz87qPi+r1HXqWTU/TuU+3rpWcL04EieZjklLqKZUyJ/MzVnGuNrCdYik0RCbcgohyUUmFkcut7rBJ3vfAsTpXqkvW2JXktWkkPeYy9ZkuAIG78K57odw+h7gV7B/dEiWv7y73VQqwDYLzOxmkvkZo8NDrEZSkXFhp1bBBymB/yDGW8CuXE+XDzvMON6ovlU2S+cvJSWHZAhW15/oVZ9Os1EYalsaoiSC8PbO7T19Pkljs1YE88H5tfU30aMvfBeRLu2twlovp+zkmsZ7Lre3TUoaVsNUudos0Cwwu5mZgR+RjszEASCBxYy3UQt8t41UrDvX7rPScJRaa96JT/7lhaFCACHiMHuOMQawogE48Lsp5Rp4+7wL7GNznySppHtvwsLIGb497EJbXT36ldBHdssUwX2vGnB530oHhGRwfclqmNCSU65doZzJNiUkfTWFexANC1fqGn7/i+f2WesEfssJ4/ORSxbh+Smp5mb2LvS/NEGcWoGhg0X2ZMeleZ1M1wVLsbtyAwsDaOKQDmaWozY1ofk20eyAT9SW9UD3FXfsMKv/QngMWHDCdKBbq7ntS611+qyA77DlplCokYenG6e11GT8dYFa8pItPKgBHu4c4gvPeWuTN6YUDiIXJFbTrBtFW9n2IuYM+IRoccnldIPvofkQ7fOOdGaEosmCJGpKLmDAGjEiSqQl/1Aw4h8Wt9oHiEr7G+HzYsZVV6Q4MXbwuwk514Dz9IobYuxT8VHfuyFvg6qLC33aorLDdFypBmJdVJoYEcnhIa9LHf6ubPZFk0H+7VY4/EXuzp3VGhAdFC3IoxTXWWnP06tvU6je15K1IOwiGHbrCnnl702o/oYJTPPk+yimK2kw3E6ShyjuldU3ZkyUuWnQ2B2Kdub6Xw1EG8GT6Q2xpU+dGAZ+OWjfGPoFqg2u8H6ud/wWTqy9yI79R5+bbv6T/2SjhGvaMKMpLDpX+kFtx3spLyqcq+oo2WZS3eDXXrWRELy7Gx6W5uyoDtG1z9dHx9x3kBX9t6PHJGJ0DCX6HGlE7IfsAU29VIdbgMUuG3MUQPZQ8oyZjl9T3rNWBJKF+4STHjGPzfV2EpghVYV3hTYc7+DrJliUijmPmoD/VKuXKSpi3QXk5lkP9XAL4eRTtqkDeF23fYGdjCzNlV0z3N9SsPTW5ujcL1inPJWaE01r95yyQtTy0WhEOpECSUFVZvBGpkeJpDSOhbk0J9Fpelr8mkasCgsisE5dpnjsZerY6PG4nUmkIhzD2HNMRPLYQP3+pX8mDX6tFbCyNIsUv8L2/Qr75AYJdjVweu0L2dInPXFcv3c1kRtIw6neIeR/aaeWCfytyJQbs4hH98jf4s7Lh5n6RfjfRYZNjqRxHS03ibFu8ZU3cfqQItY3VZj3oj5zqU1xbvmzluV2YgryKGo8sg6o80ELVqkE4i6cBFgARGEMXloJfbA1NauzDspPUYeiTbNVFTAPFOZiynGBpxNw8gppDzeguz2kGQqyKWDtV4wYpwrBa8aVFTzTF2rpawR2f2uu5ANOUzDpnqlWIAIFs9iuAFTqK6zqpOOcfRaumkO9Sal2J+nbpz0dDXxHM89/D9XYYTT5ZdC/0MyH9DcpuU2h5Cy53tqbf0a16e85thvkd5XvTg+cylfYLoqEWJqK8SapLPjK8bpw1s9SFRaQd8nM0EKBZEgc5X4CNYth7Q48Y/EdHBq+aSvZHjcVhKaMR+6TrQ0ekiRrNDwcjFrHePTN+I4ge64XVpNvNb4mbvsCH6pGHYvGn+vwc6h1C+AxMb9kbbyKLx9k1FlsSkZAbJpPzxkHKLb49ILzzO4kLbf4pBpqoHcCkox7cpF+bV2qoeLZ/L2pVML5mbYRc1dGYBOgS0+/F4gCtMJGAVSEYPZtjIimXx6bNcrZi/Zn+HHTWXpdLg2adua/FF4tlY22tUuUkS5jTI55GfI1E+uEREwHLIozAlh+EzlN/i6YtiAL4iowI88BSkmEWFT80hTBqvknY0siKg74QW58wBdN2z4GDD8fqOOsfkRfSt0uoOZCrNwhuNddMAUWEC9NmGMYwpBdqrIt+Ij5i+Z3A6yfBCiMCygCuGQaSn1c+Hrc2Uo9SOXUTIYFr9Xa6s2Hcyrz911zGVIyO28Ug0XPUyJ+BCpcadr5oLmZHDVS+YClw+NodWPspkTx5+T8VNej2D7p+81Kt86rwPcVBbL2peHqkK0p/53uueeWhq63hxgbKqTtK3uH4Yw7TMjpYrCvSdnNbqjFLdzVxfZ5prhGss+SMksj2sNKkb8ctiReI01kwnYP/8w++UERKzVSkeBmWK0FoIy7PiiDPB4FD0jBr23SyJ4in2bAsIhTdAK6h1nRrT5UipFiQhq1XRR4abn2FU42tHsr3LXU681lG4R8aXYQ/gGY74pL+m6P92o1PRKQ7/4oZZLwdVhW+ZE00Y9A25aHQGqtoC8Yg3U+71/12MJ5G/BOOL2l1vem3f7GgBbz+k8BcKNN6F2KXKZa8OAPaxmnkn6dtfSc0rSy42Fho9SaSomENpEW4RmFelmhfoMLwvE0oCITOuTBt8l4DPk3kIEcQ/lF7WCS5Z1LDArdaQalYDBU55m47ts95Zt9xFMLT7tGjQDpoE7qA3eqtDmxqZwBTLuT11WXXmGhhs3UswHSISh5FkXGWCVUK8rcDNsSO3+XOqSH1727VUeH1HSjCdu6FKosy/l7K5xDqeYv3axPJGWTvT60gpB5lw5LA7NykL0GEU8gZmHjkqrqFy8+5/2Rrle9MfHOF8/wr2A3nENjoSVtIw1VNeU6jp5VaBoA//RUqc8fXIKg05JPpECJ825cloSjOZUqV9mdyH7h58Hut0d+G1nsLvYQ9Z4w1Xu5XbkgSxbZTnJNnW60UbFffW5yw42sds6T6E4v4DUTQVwio0V3LT9vIDCCp3NdvPLnwSqDBPGIc9DRaurpv0e95jJ2r0ieo7Yg6FK8y17K7A5x7PFbaWRDQK6yA6/fmIlKr0e4l2aVN8Pm5WW/t2dgfPiGyWE9DtVXXf/i+CdtJfppLRWNCUspXUjxyIZtPfIoFxVbkGN2DPZJVMcqFob0NtTUPJbOm89OAOewRlPH+sXXzFluy/jzmxBhSGB5DthmWzbaREq68IWn+SxldZzRtIxhl0AyqqVI2PU74mHZC6Nl7anqJ7WDdjCibzW0dRoDTw5E7gjYwAw9MPk890fzGZPZ8aG2rrnGUwZZ+KLdsiWzeijFn4BmSmxonOrtc8iPoKLgXrbZDPDOwKq4FZyaTZ9/2a7FFDgnDY15wdRp+JWFgvQZnqjzDPIoxaoys6lCWzyIiM8Lw3Hmr2MfUaG7oV95Ji/DZrQtkBzwEA3jdRN3NvL+xbBCbz4FnqxFPoXHn6fsTbc1JB3jmElSX2J6xHjk0Dg/UidKxL+7hSB8++QyQM89EHdOptmNZ4DMe9MOBt+py93Dge0Oh9W88lGfMSFbhczkRtvI57ZmTWCgsma1H9LhJUu6fzLbmqOp+csUwb8HPygUUqUaCag9wZCfyVtDl2BpnT42L8ZqlOLlOZ2H+ERQwMc+PITtBc/CB24qxqVIgGQZYSFbwsfWeuWcUF/G7sE/qUoU30cecvsL/bqJC4ZtVeepEEeDQvqZndsbGIfJ/dX7785/W0SneM4LabkQNdNPdDZWYFa7vVN01x7bzUvKo4SQOZpIMk5llHpTiGkZAzs4rZUtg0xGiEm3sDS8y80nijdSS2DF7lwf+Dk+MkTuxyhAZ61Ar8B7GOfEPKoOqYWp2SnyR/5e5oDCjT/DBQLRiV+OMjQiI4HzBHhdhfvuNoYKWQip+DyHqr4oTnBsNYHiEGMlSejZkpom9EGYYiavBpCPBK0SbEcI6sw08663lYdgfdKSDkg9TE7VWdmYNMA18ALgj6fwV2SwaVZxbz1rNWekcLGL+huGuS3Fc1PNfe98sbSXhTq1i5xWCxy7GMNnaskA8R6W5u6vldy3/7OhiqFF1/FH9TWJHQqO+4K3m/tvhSvseNam71oCknqJV0T4q59Ig5jTelKX1IvrEvSc6UdxPXmM43lGoXdZ531dLvqJZ7SrYb5YSZ5kYLEEMiisjl2NDy67CCKZEuojra6I6V7ngn08tlgwEJsRO1vqdJmqMR4PvMYsKc8bNiLKPQ5KvjGm0kQxEMDIMrDK+oRPiYK/IWvKDay1XL87w+4XhflWAXa6mXoYIL+nZSZrYC6qELuUkeYEUUNvX5/K5QUvm23IrliuRxHR3aHucUdhDunKKIBS5fCCqiD89hlR2wQzWpJt84mVNcTynz40Tuo1nGLGQRdmWrZEvof+wugwOb6PQOfHwDv7/N0MAyZMQ4xV23HOQhzsaOXWnYDKqnk6e6rdi4DOweWnTH8nMk+yw84JUswXJ4ELTkAfp+1VZ7p+OT9I/PpvMDmRgWdqYf2ciPn/7tW+5t+dMKAlDeExRBsordpoYb7MBNS2wSGiPv+vjV0s2Odgc2Rn+T3uNIkq7k/rZpJ71n9ZJx3r83emrrZcjR4MTjaefvmv3pGaG/jNWzMD/wo4YWsK6yS1LPSadeMgtSTS/iZLVEp4ERx+PVisbVsJOHIs0Ps3uQLU+D8oNb8ITXAWMfyvWEPTzLDVp4pRgTXhmy2bTdGZv/XzBul99a5i1E/7r14P7CVzCsiiAQV0cG02iQRuQ419M9qhBIFyLjZMVtV+buQNrJil6PxHflGTD5b4/UDFfuZ+Hmlc+1/ztP5ybRfABdCEH0i/oxpX2MZHWeDbs0NMviGqDWJWT6Auiwt4DuT4LVaRCAGRkUVOrAvVqfDAeAvLI0udGwiYsuYjF7c4vz+jEqAKeJhDpYGmZH+6HNN0G0kyp271cOIiKmUtTEGIA2gQX2QqIUSwir/9gl5kQ7f1aSu0yn+XHHPhzC0SUtPUi05MWYBHJPw++ARRiCAHYAFyWTacXrjvsjHDSpj6XZxBg8q4qGXQPnUE+MOLRxlQ4a0fbSu2X334YfOcUjIDK53aFx9NwdFrv6yiOnmNUcMwBYRQfVP5mSJ3njhhR/WjmfN+D7ouY0c7/lE3LN+/aBTxo1aRvrqKQk5+0/rR08B8gs4Em5/Wx1qNkIFTXFR/GpcLcVPJIIXIrxqVXTycdhKnFWhIH5H9WdnRAEm6hFbETTyTUC9n/lexfGlfDr6Giddt1IyhmYNSl1gTpe0Y4lWpPyxd+3jgDjsf9Al7DjukSfSHLBzhqQuDa0aNxwgkKjRFFiWxCz2EwY+xpfd2O52purlxV3+OKoySkxEW6G0NN8iYdVc1BjA1jwBKVn0orTCfiJzbWhv12zJVRmnBx70PMviYalyu8JNjsMQlEK6CVLFbpNvcjDKrM8Qnl3v6Q/rNUaJ0J5BP6YvaS3fRv+8P+5BAMU6U4EKJwurLv49PXbkshW9YYrC0p94PQiFk77e4qIg/BRa5pKi8SE/3HSJJ4w+oEZY6h4FAuZ6KFQesFuoM+XsnTVLYIX4qhGHfpygOfG1VIaPcgh7UkKQgMxPZ1Wqi8FRAtQOjE/FuTkmocMcbsfW2N6RKbwNu8MEEL5RyBgPzMqfYljq5uFZSU1qTfXsS5n+6PuSKIL8Ri5/PzP+TyHaBmu8XK7DHGAaOr8gsH0FUGbHOmdb1HJc2qjKsfo0e9qsJaWdePSRDL2FAW6+oMgS0WL010SO6wJBbloBVLccD5EdpEAdu5AQXCevtQneoBanRF2NpCbfkpFlZxnCNE1C2tPcJ5ti0xelcBabProa3AEEuzrimcVLP+RMttlTfITVdLFeKswgtZKAIhdR302iwoUW6XjViS2KzR0UZ0WiJet3y73J+FdEuYqpSTyRev2Hd4WHk6ata/lmIKJiO/o4XXIc6KESCtqhJoO8nVihUVxEaPiw/spjIKT3E2XBLtpE+p9kZicx5/vXdquF49yKFF6peg7bYYYD6mPx4QnGM8Rmu1oWD000SUJT1TwlD/7j+22A6OTrVBYvjZF2G8e3bVKvrXBvW9AONSKGGmCXIqYWp39Jlq/Fb0R/zxJNatoRFzz2nmkIAeRyZcasqs6mZW7FKu47BHqPdJfY8OSXCNIrWMRtQFucl6kmSblyoQMbRFhq8Gl6agIw/oVQc6qiM0L28dfgNhoDTf/KDg6chLzByefcjTi8Wl/fevAX08oGyOeoCaEiivj/bk0PrhAEL0Lau6+6o2Yv4IafZh1dD0OeojDO0PX30NPZgxJZ30qeqAJ7EM5Xz5e93/K3L79EQkagX2JQRVAPc6wifYeQTXt1hkmYgPAj9k37ImUweJeyIsa4+2iUtftmpDsU7DFNqVBGtz23gjw9USgPRQSldnMxVbuMYAKl8m7zaLRWMYAZux/xwh1pglWZEULubvexaGCTYtRWn7nxYAHHJMg0YHWychHKkYHTcIetOarHbTEn/0l6+NTICZ2zSqgvS8zqLHON2ilKBLdtLwCDM7Bw0RRlICa2b9KYpfkRU4pqC1I0T7gPQCRzXri/FAzcPp+Y92CC81Cy1VK03+Ki3QoznoVXCIjPSWNbDMzzVOGrtp9+Qugo3KmE14dYYue+6gQvavMDJNiOACCMQtKmlHtmZ75qzS+JCbdWB17w1b2tmg4S7XJJp87Ug7vKUi3w7ZTdeU3WMlAQw3duX3sLJqXd/TNIJX0I06TGnzeOWoNvNbxv/G0NPfuQM5cC22BqSbSlpUudr1nMZkn7FHoufc4T7azdzlDyNC2ogZ0ppl/4vVgPRF34+xUEwFEDaU3NiViPZU2hUF8K2ChyaxKw0Td6c89GNHtTiVMmh8jRSStWNFE/NpLrneRsYzRehOiH2s0S15magMXSc6HatSQjd3YhVsUyBfpAbWi3KjWJSLw/giFmNEdQd5a9ZllHYpxArBZE/IPoit0N4SK9V0tGzchEpGJhvEXmO9H/98Cq4epIYfwootHVAkAV7gT9s/E+wQL/snGMh5kyxjXU7GrmASNg0KVzrumcQ6EGDpGcVJrf4E41DurboJg4pOprVH97HjQglzMmtuO696Xs6VSVQ0Rpjcdrjj91REXo2+Ju7WY0MI34Ehjlx2z+tmLFLysKxyr3yevoC6JGqiJcR2Z3mAibKrYspKba55N8jrq9g34IODXMfM6WEIwe7bF4/Ivo6MQZk8uK9NpLbmfZXxHI75KIDJB6+FnysK1GMG1NZcdWZ7D+jayBJ7qhwq78+rWSIO4JECv+FvB6vt/2DQG23c/i8xw0DphlcEIeC45G99NQezerYhPHBrRj4XRV7W7n2AHK5UKX58YQ3Ddm1qqpoWhM6shHeGmQwlckcH/NFztBgiNi/EQf/4LAnS3WCyx/XQ7JQ+Cm/RDEMtEHEg+aTg+PzRWVa9KxDzbpCeyvN/SLAF75cnZzF7M/4NMcFgdsvarphLjU/lIG6qOAiwnX28HdaELYvJNDJcHIRGvr3tzo1FqXv+dLSYKmSQVcjKuOBJtffjSwx/GIsZCcWccvefCZ412fbH2VAr2j7gkiFXefT/qTk6AqVdRgDTT1HIlRPV+11zUiAcZ924JBmMt87PvPzIRUCDxK72ChKvDhzxqSosOs0FTiy+vcmtvofphgN757OixOSq9dEvb24EC7RXgwO1aMKSJPhzU1oF3rhlX1y+rSlwY5UCscigkhqJyJhvQ/GYYsDl4+ie/uyD1Fzq6eubySMBWA6q6trc9ArFrpP8W0EU+Wz6d7hAR5AjhG/ZMMSngQn9WS1ROfVxjmdxNrBb3zvHK18N4kxeMD3IdcrwWnuGaJhxdNWGjqCWbhNvL3DCmCrvKLm2gjpA6xOSq1HnCIV+Yyw+vz4FAHDrDdLSJtkoehVJm4RuUEeRX9u9RJ6a6tqrrm5p8RLv+hdvnF3Tq2SKvaCNARkNOH1I5aSWZo1rCfbRkj9DUJQzmnHwZP96oa18XdisCmLSFCVNFU9Y8+REbDxBJgI8g5S5wpRAHWmUEalSA5u+Q10i7hxmRRSYGCuq5qgoIRar+XcQbfWnhX4lytP/82CBzXecdbfq2hwQt85rWlfxZgNeqQZOlFTroQuQJ+r7F2WfSbuQ1nauMO82ByQTNUwym/0+rxBnnmi3BCUHGfyBFntYPtEuTFOwYIKcRAJrsh76SI7BWt5q2eGRTNXa2opAxjDfm+l3lL5lBHzsKkoPTq5np1yCUcxgBpe4juKGPJuXGp5n5O+Bo95Tzf78TfPAN8b+aWs707A3Mjj3PL8sSdqP40NqrtL3hcki7ZG6AE4YYZ8YPrL4GRRhwF7FLTCy6mphCqo0SdyMtwbvoGjFFQ1Bak+zy9bAz8+rVwOcZDtOEeFw6ui2XvHV2XcqNO75WzOeUKebrxa9itw82A1hrZbK9/NN0wp5cPy8/pe0eIOHE3ApCsrpgMXPz7XDCv/WjSKxJg1FTdAPZJEyATc5Ywsq6cSg70Yx7yyOr0SD4+aJwl2yAP9YdkfMDDpSyfwLlWW9c7QxxeoIDaHDhl/PDggCI8zNg9rnYTitrXX28k98UdWV8g9oNgUaR3mo7Kwp+JeK++4SOt9THh5Y3b6N0FziomZGMfuZkq4MLHwMAGnXF5QYtoFw6QolUAFgWtdlys9UCIU5rJNo9Nl4O05Qs49uJdGgnxBsl0D8R4EfuTO1bvOkLzhfZE1ktR4JIKfqQPSwqUuYZUcmdrsOX9YzdiT8g/Tncy89gS2ONb+niLdTZvkyVpRqFLfgsdq1yjbkX8IFPaFg9pihlynO7T/e8MqR5uaNcPc+P3+FNrltUjOeyj85aJO8wQrOpQ6eAF4yKEcnpPZ90qOACfHjyqpd17F6SlRS2r09WaRU1qm0AHQRXYXm5NL+CG2dZX3Gj7BDyJfd7nC7nJd+g9rVphODOxpnfdRG4oK/VGfNtRknlEgCpR2Le9i+3XIX0TWUEUbQLqsPiQYzdvVv78iyAfFo+SzheJlXH5YP73mDXRoC6BNq3wy8hpdtaxwJ/O4T4n9tENXDobRW1PStQeOdBtyHg/KuwnVOPwc5oj+iSu3u60F6QFPe8SjVT15bG63QO4QQDiLwq0xdembjP+b2jdjn7RhHHRdfPdQCg4LfZkS14VDJvU8m5JX9ReUfYTRHcXNgiFn6xSMCEX3CastivRgd08xrHMcpowZ/MM3QI4RaLnq3MEBLQtvEn25sQ8n9z6rZNxjvi2DUOGNhLR/4F+eGJql7tL57rrWOLllc9iWdXbkHEiFNAFjUctLKP2b9NL11tzRbcDywQY9h/A78F0j0bTwmj+vhGLZsYd/L8z+8g14LASm9kWd6M7yM/1nRkWT+9pylau4g/za2Whg4+YgIKsUPB7r91B/Lu99AIuwBj/SNCcOz7R6YKtslZB7QeoTGa4wizsG245wZTkVQLiAHcKCXbx07F5PamnEow/p7hFeOFZQrSh+qnNjV2UH01cAvkFp+I/xilf9ElhzBimi9BFEdjO5btqT4xDvFTX5xff6cyOMLtPhDRR/kd7mAugOdpC4YcsDRqJAKiQMAqC4J7loUA8E/faNmLTD5Dd76rzEWBjpY/D7P5Z5e7WHiBfl3gaEvNqcAD+EhFchbDaW8MgIYSs1h8rHx3DBqpYElCsiKEjwUDwr854rNSl7ckS3/oIfeW86hq3dQhSrhE5u1C2IoBESn28F4BdECxI9lzgnqS6LaPu7sdmH1waPh/IH0sfV0DGYv5uS+ZMmiy1wAh/kp6nfjhMvXo+bp0nssBcSAoIeg14BBkPPVQZSVksK6Vfvi+WFhrB0GMgcxHEtp6tE/cgpnIY7QsoOt332dXYQynyeZaIr3v6CIuUIMByTk+DYI6paKz/a+MmQQ5UCliw8VVxmvH8guYgtnNASQPrdI5bVtM5MINGI7TdlBMJRyDWxWTitc1+UV7nuMqky6jN96NgT9u/JDDcQ4rhkqpfAQ/xN8J+CqwxmTp8Tk3Y8Nhx2PXE1XIvtmusJW9jHcsRypuaRtpBlWdpg/+74yqVwr7B6KQSUmbFqyCGFO48j2lWjRgFXldTn/wMRkG/Tahp4haZOJu9X97hV3zs6NS4oqACOyS7dLvu03bIOEpserzW4BHvNQuoXEO4oQHZUEMZlTAkdH7QcrjjelXESvkLvJdAeBGnrZ0B+BsO1jg3IeDQWvpfUMD8pk6217joUT8zqCq6JtO/ossNtr4yQqP+V9rcGNwSJ3HzVOycWu4x64Oufr0KzxI9Bl7gUT+Wb7zsOM0BVHUwyK5RDwDqQZXv5GRvSHi6MjFuMwXEqlIreRC5Ymf8HJmtqQ2Oy2S1EpKG7vkxkwzFk86Z9p6h41WkVl4GNZEGft1OzxtxuFpCjKMxKONucielrW2hvLxO7ta5p2Pjq7kxaza8rCm9OSrR1FMGByJjschIVA3ngxT8bEbmzzzokfO1u06vFF1tuyErZQjYJg7lIZ8X+yWKrgIMCHhIUAHr0Vpw3k3k20TYUY/vvwKfT6LUJ6qRw2srn/WlQC4UhQLzcvjUEymcUzGqPv6zoOjhJ7vP8fJsmtHCBEqr7OzmOU/x1aiHpwwGj8FsutysbretJx3l4d7qVNYoH9z6qmm4GZU8tlSo3TIL9yZ20jpn2KauR8UWx7ITnk+R0JslrwfmrSCAyW9adVzyPijqz1HXaThTLPWf+SC/VHqI2OXIX5IiKCWnlVneqh2ziw+OmCUqdvHXJuJgPG17zvuQwh3pWjtt5GP5ToR4Q8oWUnbUobvlLpID2zPqLP1OGkXZVmf+AzuoYZVCDpZ8GU5oYo8JYLTjYlifpcs1tQL/clnB+Ac8S0Ls6ML4Kcg7XAM8KylLwRjdQn/enNWZuYDxvTnfZDaBGo5zMVb8/RKWjJh+yFHTzEz9tDh07ZoiUPXUg5Jya6Nb4j8mANqwOgFxlJE1AMOCJa95qZsNTeE6CBMR9KLKAPlO99kyHtizaMo0xiBqV2a+rI5o4k9v2DGBGzIp0/oo/S7JQAFFlMBT9xXoyu+4mK8tg1MP1og9sjd8gQ3W+LHIh+tJKmLQdXOmr2smpAW9RfOwmmu/QQ7hkvQ94ORzT33KCxkzpKJh75oVsrm0ujYC7DYdvSgm8NbcaVCoVcDEql3EnumMPsyocPSb9Jt7CtJ4ENjfmzI/zBX84TTpFje8sW7dSIZWUlAsh7LqG307f4G03wGBu3EowZsXjiUpemYbXIx5JxCzLYczuvXE9AAb5N/IwqX5rF9HVGk79Ixa95kUBvJaTJhGlm2rSm/PTqpH72ijBWexGdpejD+dTBMz0ccpuwmKySfAWGOMLVcEa5dW7BJPL4Mdf/LSCASDHjNqzynLrVzU+97hGsYemxCkwtIC7jtLvuMTDoEsORjzSpUuM2e9dVKn/pKX2u9QUSAPUusBjcgf/iByrK02tO8ccY+gqC5ViV0LpS/89Pf4ujgx+Vls0ExXPOpqi5iAx94/fqhlDujGV6sRk4U1rsdUvQ+uXBY1kHxhYpqjzLEFO9HIW/hAkquOK8hQle5fTSepEgi+cQ5qEeSKXkqCUBDQbBxQeCEJU4zaKQTT/4pU1rOUenrnB4fVBfHUx8Pu8iPs0nB0HY+F+QdJGK2tjARfH2VJbo+PimPUSJXrLvcXy1qJjGWMvc2qSCbGRvQlwU6BVZFuQ07Os9tR4ZM/PH6CY/a+Dv26afMNZQ4NQ99e5etWsU9gE4yo7sp8cZERgP4p5FHiXZB/UpTYMbz821Dq8W1GFhREc/wSKHYCylOOasg8v1cOy9jPoWb3XRHZlc4M/9D+6UyoABG3+0q5fs+o3wW2YWyTanYJ+CJtkb9NDwohGLhOnD9hzzOVfidRrHVp0FWX3YIBNIJ2OJ8uwhW2glBsixDPcHtEehaJSPP0zjHGXZvRB8IhTM9kVD0s7jgrQm+DAC/bvb0ckGJQqfq0F8yBiEsgLfjb8stOKtCadUxdYAQrK+9qW0zD+h/zVgrHVFSmlAonNld77stakVMvNRMJWGEnvBjNQGkyVJ7toGuCepQXpdcSrNKoOJemIquUCI6Vy1XUxhfk3jK7rlE013rPdnjJb1x/KgUZ+jd32exonmNY8/f4AD0ALI3BohjxbRYPYn1fDYvcBsy7+gu5xt0NZ021raH5qFEG96jxAa8i8uV3jNlSekGAQrdRPYiV6aj2+u4X+t6I2dN7JiOp6WqhpOPcLSz5NPOPSNqXpLGTPuR9WFfPBMVf350q+fxtTcY8UGCKDv3WLDYblthkc/ug8fSrjwwLOAMBgwoInozpTc47ddA1semlClBvW6FPDobfTBzwyVylQHVxXwy9DUTDFb9IfZcEm/jf5Sy5vI7QHNs5EwkLk4F08t67Z9Y6WIkOCMUU2u3H3OLxyu6B2YVrGKsbDVBh8weEUltN6iXb8O3NJMaBFcusVjkSEK7wzbQ+Y3gkZCJIK9K5vIweUYW4fzZlM/l1osrQ+eLam++d8MZJOTof9cw8c7Qbzn6xDXfQGZxQvR1fDOiovwpm2BXxCZoQt7ZHXj2sssI1eJyXoInO4YwTN24Yff444kwzxcy+I0mx0C5mylXqg3r8OlMvgeYe6gkfOr8bxivTI0cvcXNh2YqPqAtZvBUF8yTPqnc2tcJLI4+QC/DwLV7xBIur7MfIO379YUYeu95J4WX+WBcvFuw2Okbq4WAvzyxG0WA2tGeRXt3sfpus5fXDWdE98fWLocwbSPUp/vrnghsFAuERTdWvesjKFsrGekO20+ai0vfwT8op8Tyof4itq/HBUFlQgN55Ga2wH+IeVKvMbcws8YTMuTuGVEoI3SZru0xEaqbi1j7M6cSHC8CQILr3M8QrOrk6chf64vBP8TEDDavZp16ZKuDWDCZ1ZML/FOTDnvnDlXHdX+nvVhXQW57WJTSKPZdLU9f2i4H1x8YoQKNgL2dWkNqZHtay8sDPJ+hP96ZwFE0aP1pLa2lwPjvqBnMVDS4P2YNfD+buUEGV7ewhiXfvMPa8F6pTdfa0HJJEqK6Q2ibDxSK1CB1p2IpypceOz1bmjQmk935uNcNjqTSxnhj+F5sIVdzrHSf9lwGfhxjpYHOMpjQbicSKh2OAO4J9Za65pb6zGfZdtJBB7hh7rPpeG24V6KrB8AuqFRXA2OSO2ns6F+I7zUUy4lgH/TmneWvSxXuxv9ERALMQ8S3ZloGSNcZT9jn8P5bAu0Fh1vQvxGBFUqqObtgccLEYSmjhJ6tqg9w0cyE8NAKI0N9nHHvVsx0cc6qxYyTr8tr2t5RUNLuckE/D7I1REUIOye9rGGa52A6aT7rEdxDUhpxw/qWMYS86q/cW1WlwihtGCXdnNUXY3Z6lBIfBCn4npiLC7J2JasIgisj9xfArmaHG6GjkZG3KqZ1F60cYeu20iDVixjHDpIfHNYNF5v3Xv4OvsaO065VIJ2iok4jnHW72WAyQm+2Hs3gQJfpD2hB5BeAgtN0EEA/cf+/XM4SazHTOnc+j9K8x+Op2kUSTcUr7alhjoZkD6qVqqt0mD3XklG9xZj/vAeH1d7/QHalMwO9TZFXj+bCKCDQxl1EldHpnxNMiLCl70dgrYXgcwYkI3iTkBrPelfo7BcYNw2vD3wm7sl9IlTFDFjjfvijSaNeZwjejMGCtwjYuCkrHBWRO47bFHoSV5IMZoauSfb6F0JHWx4HxJQ4Qzwv5GyXs3YOtPueSAyUaGYVMXoEZy7s5xFmKMtzwSlQnNhDcKIpQH68d2rIK3BCdwI44skW0DFLyEnGLuTY0YWx8uBs7NYLLNZ6OUQ0i96NddeuFrObkqkcVOM32WPuByaBadA6YHot6ldqLQuYVTSlp1mOyz05CyptnVjlPsEtLGcAS/sFcODAEIc0SAVWkd2Z07GIGlGJCQ2y1l+L6jpWH2asPBT9PYIj+Opgnx+MTO6CG7fSVOySurjjv8DnvKkNXCDVlcBVW6+ob8xIL4StCQYE36kAOHrdp3Sy7hDxGUcDsxiabyuQKCfKQa4wGVVqqKhnPcc0pWw8KYL8c/lOJEpS3w0kdiXiF4N5DNpGx2jNu0CGnlx2qFrdc36F3VFXZHkrJfxHt+EnRv+E9J2/g3o1X9niDUQ28Rr83xVmNq1Gv1Mhiy5YcLLAiksz27GvmywQ9M9I4ImljI34tnh9+wz0avDZwuERLy1axu1zimTSlHMnqrzcZ+05ieEq19yGG4CUvXKNlKezemKBigocralCTKIdb24h9G7cmO8/P3KPQmzcqv/M2KYqUyJ5kt4wmUnqEgO/5jEdMCvXfrDXaPvggs6WU7aMTJep9Ql5aik/MpRCUcDz5R3YTk9Bm0uM941eqhkeu59PrmmYz5WVlDoVLTCIDYWE0H76m9maKPVg/re1lFC3nNcn6eMtH61Rt2vxwxw4o7VeM8OTTLRJ5HJl2xQQOML/Eh33/7u9fC1QkhP2BszvPB0PQ6vBR+T1UbbGvpm2A3NPDi5s6UCjzyOa/y1HXTWyi8Ltf4ZO9Li69avJTVwY16xZEGar+KTIDYLy3+ABkvVAR6y7yQZoMpC6Rx47mTMphTDRW9Np7DBO3KbwysphHK792Bxc7BbOa+ED4co/KSGZTe/IzMC8n36i1B24+IXKFdwRsZFyV/lWXxbaXncWMPP/kVg6gI0AI7PIhDwcUmvnCZ8QLaL1M8YypGq1XOtL8flh653SbsMGmoFVnqn+xtE56kwlAqoGVXBvfGmdpfoQOu39EqUMDWQDuyNmRJiAwx5ECl/jbU3QryGMHnh3GuMgxzrhKCjW71o75YtUu4XpFvhaum5q5Fv5gGWif8wXVJVZILHGACiiAbwgEKiYFUdFdpEHOHQge0jMk6qYAgyE0UmYEm603BSGTGHy0XHoAFMxn9FAwmHCEKUPwoE2WgH98NrSexTSkoflWrYhNglgi6f0mOugjZUmE0SmMDECXb56DobIX9zugunjvzyES95WEGtJIlySler12DlWcxSZxUoUq3IcgHExRFMEcjtamND/0xioK/vJ9cddo9/1cusR2HfgwrelNI7EMC82fdzGxssrsTN20DO4mTZbiwhjaRT9bQafN6A2KBQ1Rp4LYJIv+Y40rG++UPt90rkTj4YXHjrTzg3EsjY9H1/dTzsUvkK8aN1XsfsRkWq8/W5Y0PJHqtg0OTtqQTxoNt8/99k1NEim29rZNqdcjApm4Vzb+3fYGlVte4TZMcHjY2ml8FBlTyfkqPA2tqRqXXGGr2Y90jPnpttQ83jmiGYPKw53xJciq+6qlv2mJ7WGLj0T08CxvlIrfzErR8IdCapUj0Bfuz+UoJIw1jHNgOPJqwJnYnzhCqRABu7uV8kfErk/QqbKlsruj2PyCzyHPzmlL9mzclM44hZuZl27LT3emlG9hfjK3kdSzCEEZLPaNxQjyS6BNJ2ZZGHIKqUyuf0eTRQleEkdazE1H7StIdA/2tD8Cwh550lQZY7EOtjgEcnWCydxFLTaTRv+i2j3qTCI053YmsNzKYg7gaBrGAezYgtJ8ojompzZ7wXclU1eyoSi1dprX0zrOBUo3GqiOw/2zgMoPHDdzi0811hI0iERb1rfXpQXYVj4RIABGA4ObAI1WtuYJF/aDHnath3sIChNvz3ltZbs1JJ1UvLs/T2kCnYQdKF/XQSXvYu6FRLLD+a31TeBDfpc730eEf93FMR8MZiKtY+eb7Tqcesl3lnkEu+7Q6h9ONx7Af0djeol3SyEbRXGjiXP32y51PWPPk/tvYWUCNORrw/30y6QdJ0Fj1PHh5NQgSsdkHVP3gVeSmd5OOwRevmOl8MJcQ/1MUMTf6qW0Ax/6Lu+G0Qeo6w7/QB2XCf9HRO5wXfZQMVOkrB6q3VjgdMv21ip2lO54mYW7a79M5qWY4SVVFJsuqEYxKFzbLjbzDSt3JKGl5+qBMqF79LQGEt+B8tDFLW+erDoZI35PXgTqRNt5N5ww5ax5Zocj8W51n7Ge89Cm+tgDNMQO4aL83DRWesX73DJgR4OTYOogyg5fsYTkhNueI0xshvo9RR8mYWSK6bcl/tJLBUGYm9kRKb9UUrR/Ufc1Ir4Y5Tv55JyG1FUKSEo55QRrfLao0FLDeT3ijLTIeYkT1r3FY0A5c2jBGHqdb4vj/Ym/1oGIHyZlaNXQLqsHRQImOZPkIZufR7wItsQ0zTjzkaFPxMkYWym2qLWF2CvIzcwYROhQ+rNFAuJWgUIkxMKoh3zKBxvJLvHtRSNIpqPwiNHLo7o0hkzKeJ20N2DaM6rZMajc5fNMWB/u0Vpub+qPIPI+wPXl8Z4XFeHiy4i9FLE6MaAA5GnLEEafi9zV3JFc6p0tlXkGnRM/4REn3vGvQSa7CpetWUfFFFGsn+8DX02TeHTyqLIXIqLuvE8aL9nPo1tHIlp7eYvxyQNu6f8Ck/UrUOt54SamlvUDuADVn4+/wCyyoiBEMBPc8c96a8LoiLHeqrY6N8VwkBxSm3r0N0mQWTfO2Ypf5asffhTDn9ycdh/Ag62nrnpa4uHsFw6sWtz7deAe+RBiYSzTeTSVqK8f3bD9qKJKOaeLz+uflervjNHCHwTyQJzhKL4jTOCRzCB0Yt+KvryzOWyVJWR6ZuC17HHzuD+thLK+ILJeNvi5cUM4bYBJiNmOk/u6Cq+XDzIx57dSicq8tpgIemjSI36Tv9QRCUdRTjRyIZeWr1pU0hqF13qi6wak+nUNMMRZiYro2WMKKigKQv2hTdJ3XYnyfnHBVLiOBPhnOjyLhXNd4KYyMPNEheY1j8JrK43P4oXaBVE+/UXebiSHOUohwIz2AYp8TfwHlN+tYiIwya8mcQ7LOxrRGiOTZiJYNIgF9QCb1y0l66oG5hdHWYEpfMas/AnDUNlbo9RS1NWR4a1PKrn7dKIcCucK34/hUsdM765OO275TZ7x7ZjK/p1bH5saAFgjm33lBWPd4/i+Q4FPsnKmBntCNIcb1W2qZfv2gwWfZJshsV4iSrA7A/QZalqKimKRB3Ps3dCI9kIjhcKAhZxNARN85hL1/LIuyT207HOG1ZXKKaiF8WfF30aVzHeZ3DgBUsHzaCYORyq2pPyZ47vrlOjlDMQNV8BKqTCBJOQWzXiiAI3kCIuq1iujTcKIPT9IDa3a6Fv27v0HOIDooyRsa69ekfSU2zDXazT/mG9hbIfhjCtgkliAxnF33ID/fkVWRR8vmiiaMjZxdrk/isx6l7whGNz8i5I0VlcTI9HXOWYlR2SMtEcwEQPFQHD4ZocsWnB46gL2T51voeCMj6Wem2XF7PbZAwm2N8+SVBG5chPCXrcXjgtEZ9bZyI5fT9SstAbY4pKPoWPjpgijkCrOP8WkdtFpKdig+vC/82HeitkFtxXCv7dZBDsM9EcSkBfLO2q8q6Hcw7/KQ+MwVB/yNjv7/ljinanFY/uqFgxZsf6d2+j0C6dthmKXCMXelm6g2tjG5WVY04IrTB1rq6PF0nHckeHWBYvs69cyIvNxNabhjBwPaFn39sXJVxL740JtR9eFQOtFo1utwEIIU6tT9/RLx0wdbqO3rOhE8WW0HYvWPC/2uMnoWXxSa2/2vuvQ5Ati2K5yIhKtvNez8zx2eCxPcBOI5f0YGmGJHypHGeJ80/2VUNRXL5mOYYAo74mG4vTQtxhZ7XY54cji00cZxya7PSYx2dPElKBVcGp4AxNIHa8moQmvZbwEcFIhLXmC0fzoNaywYQVOCUfTZjW0A9rr2VMkzHHbycwvQZVP5HJwq+4ONgZmUdkiRBLP2glBgkOphDWclznByG+zbxIsFfIHlM1ajMyI0J0M9rdjE8PKXCIF/j/ISWBGcK/Bv0uBGaNRgPvptWK2F4q5GaqttDfYJ8LiibGjnDrRArRROLVQASLowZneUg27ePzAJqoiFh6saxbdm2z8HbCOetu0d1DNR7vf7W//TEOxc8hXPaLFyednokEcWNueayu1ExhshdDq83EhlBS1Gd1XMFseKdIS/hKei0owusKn9Mep2K3W+BDvuyGJxInFtwyZjwgQJ3BVTR6C6BfvKTBD/6aUoLTUM2jQT9YAwrq38uRvZWe1F+BLtXmd6erUn8i8m2lYESRiXMdQMsVQMNLnsJmi6Glj0DLyAHtfrPUbEzAQWrOmAxdaDrYKw1n4yZMLKC9szDuXDSjwVR4k5TOPpQ9pgR+KXvwZ0QPna9ZYaG4JbExKiteKOqilG02XDK+kZsoIPZ7eC31d55yTqffEBj5BrjNV6rxWOCZTi9wnNTRdvDSIodGkm2l9hK6cwwaYBUszA4l90Mt9HanxlebA+TCqGmkDFIoDGwo1RFhh64Q//ZWfu99mbBa8BejZ6tVZm4DrhLtfCEgktgfDrCecsX8i+vTJ4yn5kOeiBgW8n6+EexPOTBcWqq7CRQe0hR0Pf+Luz7x5ZN62K1yGvA/C1zS9FOBBuKaOb6U65N6srdX4krpdiA3/KNteyqxs8ueqEc2mLas4yqW6YtLl5mAKwvcH5B5rm4j4hi1R598kp1PEqk7ObPku7P5LEs20lUS6nUKVdXW22SgJcluZjMZjxvFmHaCIqDXL+g7tzuZIk/GPvt3lZ1cyzk1oXM0cPLDiRoBap8jf5xoi0C7TDxcbEgv2umlro3AnWL/XH60ueY38CDESdqJXjRUYlFGcvDIwtOJpbhbb5aoefM2oc6FO+21pkDXqLxdfzcZS2k3yLOlYvUSG2wyUN+5vNcKha/Wf9c9qV9K/PMfFmc+wn3+146TpHuImZYWjtavscurANtB4K+vyB0hceRE2Lnav9q4xnGzidUnksEVAgBSLMHqTTNT+ItnS5iM2b52YiJkMdmDdpR1uadUlZJySEapVMXBhctLCLidFtgDXuSDyPlmRPnqLX3PL7522CPm9b/Fmw7vm33HN4w/81IYxGoO7LbiArzZqLVKoUI9C4JJD9lW4TxBl6frPJw9SRAhU1h1IdRDmYr81kEmfcOQkE59U7WAFE1h07f29Dqfgvc4V1l2MSWaGeU5DTiLH4nhk/d7RsNpojViBH0R4JleLtG4EhccGxA8WamNk2hzkQExxz9aZ99Xj4VfEAOAJbRaNouVOdW5z8wuLkBfPvCsPUfMcQEW+zZYINn1rbfw7citpPfwbh6a8MDFkfkTi3fJQsQhnFADKFJf2pZwPzNM36CHyzg0WrmKNEEa8M4OkgomLD1w0wFF5H0W8P87SAz9TSSxZa9G6mOx+sdY0t7NOTwmlWMq8S73TIXkhsdjL6KRVruRSGE/rT+nVZept5J5o6G8Qz7tsJWhpIZ743oMR9njyB3JgWRcfsf5vASOTfw1U5IjeBZJ465tHsas1IrUzKsQBuL3gRPKPykabt1Z/ZCodnKanHpTNY5ZZ9qmDUQ6TivduAZ+/BUC//g/sl1bJ5Mnfns8mkFS6uTK/jcYvjUpsvu2glvxO6Iu9b3uwzpTTCh5cf1LTHfl3UsA25kipe+s7qRyYQQYn7GaH7I3NlYNq1AgY9pMn/dtXun09Bx9HqCc0NguSc6To6GU33JCjrRzMxCH2NpottSKvtN4MKH/kYfzA1VSyFgAg30CUmElX0vwiIf/oOr3dNaIsNuFPtqc+EDTo9wKzzKQyQHCkc0qL5PhKUwPtfC+rhD5sGKXPF8qMnLOkhwqOleJvHjIy+1QsSHEeU/OWJDU6JuUg/nlOcr+oQn3RLW/s2EDzzYWtDu/OH2caX5r4xuQCCL62LPgAsBgW1jo/YwVzvzxJvayw0sduFiZiSGLIB0rrVXYwW73ZNA2cJttESoGOnGTSrf4jaeQOCnURQf+1V/4SN6KEaRsau1k0vJVi/OMcJVgTOqi2/KCrgtFU1S/wssEBerRzABc/L8pyqBMhplSm+kwu1XnXSWQYjC1902vvFv2hFPc/Q8YaT6f55FMOFXTK1X9ZhmhOLDjTBcO1pC50yuQejNbmm1o3ASmFNRDyx3FchIy0uwG1m9+Hvi911tTwLw8WP3G1tvvCLr9JdLxlmJooVqvhvRuvgdjrLGwmG8dU53wtRr3fbrPvC0gVtfnlmCvkvrQfdmc/PIASnniTq+bur8AKS/D2/1yOn5J6+SuSSLRjXowm7CjVXvgDvzJr8VVcNd7d9IliY3C34GZlI099pcUO5Vp22vWWBmDJo5EFe4Whz+8V8tDAbLsBCYDY46pQqrd7go6Pr20j14L+r9wVE4gVIqLiTxoeCgobEmJwKgZUAZwLtk4b7F+z5x9CRl2k2rZB06VHts0N3CweP6962oU6uPPpXWq9urb5THPizzsBSMe3OezBvNxNnzlfmq0D0d781RVj0J9Bi4YyxiAczQtxm9Nxz/Au5sWXsv/Ywv993PiA1qBJjzbLJQxLU2N9twqS2dfw8/NZYaDM90fX7m+25ViJSTCDq+2HADo5e1oCSln9/GBvXhJOAF+J4GqV1RYJl2C+TlScj1iJ9skSBPcJn7RFAyYMg9R0cAdW0EZWsiUPyLJZvG3rdisHRYQ9M6red/upYss0ZwKMAwIv6EZhWWMgMocVDOo8tz6c9pssrEjkQEM/nRuOu8Y5ToeoyJefBUABx2VLibJ+B1l+j7AXV4cjalTnalk0JGxJtiZKa1quwHMQRyE8O6vnb5/niWdCaj7DULf6Lw9k6/6XGXNcPLSm/BEt43XF1hGlPcTSixMafwU4DquaT/tbzcrYYt1xeqjf1itT6vA7f5ieTtE1ZqPAqxY1lnIPbvsW/uCPo7cg/GuHoceG+WBHRmoFec6cMIoDMErquKeWkNROHdd4kwncYmPqwgqvALdQjTzyrAd58OfzvvPXdYQHbij8a8wUSCrkpmakwKXZN8sqRWVBPv/1qtAgsmmXgDGdTnf+7vR9UDpLRyAgDbaiR89FEGZPld1FIsQyNZ/kb8tcvBHC9UOG4vli2M3FoQVgZSeiWJRTPER27jePqzpGj05ctzqAdE76rkpg8Y8GoBngPqtVm46eTRP37wv4kCDxk/2UwZSwbA8dNe4nVYPu0EXQkBLdiHIQ6GQpqWD5YAjB4GcnUrbI5WjdHuhrv2ddC3FNFd5aJmoklYFJPonVhkQSohC2T2CYG6sZzIIKWk6pwCQ/5g4GdV7tW8kvonnQhXxvP/gOL0170a48GcYSLYsPGu4BmPGiWy6rErK6uGXHm7CUfjsCgN6HWO/D9EJHakpAj18uirzm4exUneE8C8koOWHZHsvtWa0cV10fI/vYqefQUrOGoEUxYhH0PpWTeceIArmdr4ADEw8cMlBQao4LVO23ifRAiW26Ir19el2vSQamMCYbUkj5afRPSHv4F5Gdm+J9ed+v5cI7f/qOtxHArouza7Tk0dEsVLO8Y4clTXh2YqzrCZa1rQ3qPK9lXPc2aRLPxliPIT4dMx57YkI1jBQPaim3XgQbrbINV2nsI9cPo8cPOTrNk6m6667a2DfyGxF28bjDMuVlbCPp4/tVhv5H/Opy/TxYn7DT0aNloIpkztFciA3bFbQU/MKLpN7V6DwNi16a8EkU99VkB7+TK8ON2paI2qFugZcsbbaxLaz2B6vikaXO38y4tgVLxSBhsH9epbx1a4MdHA1C98AoH5N02Hw/D7n0vTwbchV0TYNVyepnA01IU4bbWgIfM/jZrfjsB44KK3VIdzbyj05gk+qRmuoBHJ0X/+oJ1jeNB7XUihdTRZkrNY1STFIuFSVlNcCeOm6i2jThmrOVnojpEiqpZoDsjI2TdFX2IB2/yee/8alrd4tHQ/zy7BJ4Dftztk4klv40mY9Lur+mWy0ghE0jrSoNp5LLz8ykqr3nRzR4oq0zzNB8Kv10O95eHQ6mxh02cvhUTDsSdPNpRggr4sczWbufz2uHh5xRB6aPn/df57EQ+3uNLP1xqBM4xAvs8loD4aatBFNHQsh8hB4BukFq2o1TR4YhHg5uMfmFhcP3MIRSVinvFX9+up0iRg9XojCCrMecT75ogNdPKetHCbqjTgidV/9AG6f1Uav41cQri1KF6aEmPAt59L1zi6gxgnYLbsGXyCRnXN4bKUr8KJwaLA3rvQTQCNaP4iPBSBpIiP/a26KKUnW4JzNKFybFS9pLfTgkeDhn42TK4s6mjQHhSI133/MtF1bjgTF7Xq1vAmZYPiJIEdhhseQh9uWXTSmBSsfFy7OYk3ih1+4ONgIbT26w7mSMtW5J3XUYWkpQmMXv6L7MaJWeFO+JzZ0HKe53QVqgt5VK4FAs1Iz3trGqr2qgUx+wBG5boQ3oULl2JoHDpeJgycgyo8R+DynFqHWYSuQUPQhFy8OxS9k4g7aopk3u4hGXqx1nUOLOfO8sDgIaxm1HaTgZpx4nPaHvW03yH4QtG0gdqzBKR9d7GltNvUPYV5YzQJ44hp8d07eA72Bd7nIR2Hnp3M/aDiCX6E/iyx+c04Cx4Z3x0ViiNBuC/hw2yP5mZ3exLouvZW4nJCgzc5QVTpLbuaYq8ROE+sVgc4ANJGUyohvlPQEozmAicCa8R1A8PkwUl587kIfft41m7wxRHrZgIQkKp26LhzJxvaPWENWzkK5+MnQfmbWvUNjZHZSDqMX5/4ND4RC1EpHH2GY1ZRe4/KKkpQwAipbpLq/1/b4SoSbIePamUyVM1/rtLT/9SB1zlK8qePUWq3abH9a8prLOU1fr3OmctCdTOlTB4rypFzSzHCQ7gW2IJU72ZYj+3uxsX3zPvmeeXmoFlt/WLWKaC2ILGnR8XylX6JMSxvWWno971cNOOMBEzWX5MNK4Q9lap2hfrJ89ZV63kh7nwzNiTtvxnn2smtyKojWlno7gtCUMD6TehmzaX/eEs31SgHzcgFELBJgOcAnU8nFW6kDrA7bM8xjbEvJpIqXIpbxg1W2fCl7LuELf2OOppBs/60ULfKgjc9gr1Cwbc4Q323BAkm59UzzfSJy/xwe2OIcvx9edwagBZQkKw3QP9QpeXJWJeaPX1HhA/CzkSXlipLFY7OmqWx18LWMrH3NSeM4ruiQ3vzj5JOeBGqolv3CaAXsYakJkOu+6/j4YvUH4Ktq7Sip9J5dTnfdyp2SJlIAaKVjr2PH4XNqWJmdhRx4lYmC6VANrK1j6SKDvO4IuiExIKiCs3vZITSM6hgLVIzU+hX2VZoKHr/oabVzCH36S7qnqG2oD4TFeYRwZSQFmsFPpt7+G1m/f9O2xCMrW2bxkDHBmNrxMey42fKpF8nzVOnXJrhtH2q/+Vzc0xG3m2LyUgsY25e7Wqx0hq/D0gPy/P0VWnmWmnYsyHiCpaOHVMosYeGI0JD4sRi1GyOn9iySoSNDn2cjPzs1r3FxlaGf0ugPH1D2BwlViTrLyShELZlreZb1SXNteF8TIpvAGGxD0X7tyRJ6T/aat8eEiPd0kluPi4zW/sb6SF3OoFDz1rGLHBNTFjJI9PWBY5U5amo2neXvoyoH1H86yDARYhxbfhCUuC34Ixuev+kq3yY590Bu/wWDSjc18y5X0wtuUdh9fVGUuocaR2jlRDGzYZUc7nvil/OPswk8ApOuhXC139t8ZkIpU54xW+hZCc6r4S4V/NP+UDnDyA8ky6ZSmDMwFCZlP6XWyGaRjKeAOcggIh1nB89pbpWKHAxBHYCUzvW9x8QRI111Qx6Fmg/Oh95Gu06vttZWDCBUlRKkeioNPIx0eh/eFtzAHL9xMItwh5mnUrIE9GvVWscdjSX7wXzjEY6riDThmN/iL2fPi6F+nuGKDoPafs8jsh6cAq/DWvWAr9A2rQUFwxcE2hUS1+mi0X3M1aysi/D1Nzc6Zech3Zwvk0qxQBPwP04U8G+tbUACnYcfI7jCmgI4eejp2V0a790/4wKiu1O/SwD9BQhpJIjIM6YUJ16N8m4souIfGdGjVdzOMzY+ze1/12XjwqWmqPeo3XRASvtNuwSuxBdaFVgs8kwme08POJWoqh9/qC7xSApPm6NkrJQ8Yqk3KCLmXe4B/OEmpnrmMB6F/Lbz/UEdgGId6wMrKe8K50N+r8mHoyHoqktOzDZ9Jz4YfaZU9dD2N/jmtOEbzSw/T/NDstOnRu+HAm7glO4Jl99Wlq5VewsTyMGm4W2XNnHyGntNi4woKKa8AL6RsWW/yhCp3DJ4i5NBGGVSeR4HSKGTvtc1QPlBfVXPvmerrfbvjG+ZTPqhc7uqQ4BUNtvm04K6R8k/60UMI93qtpHbPW0b3csDFKA2tI/0Uby6dhRZtZ747+DhpRHRTNxtngd/qY3OfdP/+HEqNhdNLd3Z/kEivPOg5vu4v9LmwtiI95/LyxBqEmjgncEITIPSP4T1tF4vToPlc/SgM70X9vcuEhep16rC8YGT9OQdwarcKItJ7GP4MJ5ns6uXM6sx7CZyOpm2gK38eUzt77UQvJtGMF9YIAODDhZGs/H1td5d7rr78iUZHYa8XnrxS3k9yJtoMMg+axw8i+isuWX8jPxRToc/4qWg2QerCuKGbqpi+ulTEypMTWmqwKEk2JJc2SpqZ7FN7ChFZGUb5hujqRIBSaHb0tHZPs1npnJGpGB3i1gitWQinCYDkwudy1HHNvaYEMZMgsnJ8Cu9QHoQBsYEGZVK46aE169mIskIQqSkEHGP+rIttte7Hx8KNpS6A31cwKbhPBZNhHZGzSAGR0C6hnK8Eag8DeJs9Svijlwdc2fRnIw+w49vLrz2UyJzOKTTkfKVViZAswXAYb9n/tWPGfKhEWs05kTM+zNvPj6EZZ98Xu0IJRz7a+2VfjYalTVhLQDQK8umtixlSiCTAXRwcNeyappiP5TKw9i1Gu04oJCSVc4iHDGowsZPx80b28zVWdZJIRKJiYkWj+9kEMo+pK1+MZ/q4CnYjOzA5A0rb4LYo53ar/1HTrpBeveTXr25zxykCZMWu84Ik3ROjPI9K/kKSBazCPeWNtU4BVFXvYiGOyD+LGkpX49xLZmvKa5cQZonGCkhJR2f+bgFDWvY5eExCZtIXTEmEJbh45wi4/neqoP16gA1X4vtUXalM0nTd+2WoFuh3LcydIeApl7Mb+qJ7bv4habwhI/BDGzxtCA+TVSpNsR+ApOnW/+g4HEsKTwZ6D9ie1qyBMXjuoxwbSYTGo7KSPe9rfKqYGx1lVk5fHTZg9J+azGpaYHC7oXym0/Lhzqmo539OYNuzi6ggIsXm2/hbN7+nGxdF8GPNffEKiFukAPM4ezIHZyz1qyVAokWhS4NRhhJB49cbDj8ymeIo4cSjchSjUdzRHZm7+fRLVVoqd8QxovexHZPH0r8A9WmMuByNt2wlIByztdTm0bc7Xsuw3sZQGkK0nWjSVbhk40N6JnNb+5Gbh+qiKI2YjHsDnxO37QITAa1ulc3v/ahPgQssU6dUWsvLAVes0608mhu2ASj/NJpjDscNMUKV1nxpWf4Xiqxt6NV91Udfsgn0lFobsyq8XdrziRJS5Z461IlFpvOkoAzskxxOmahbGvRmYoof67+6jRIu7LI6Zy3OAlaFpDSjJVGFMkhqjeBn4/6WijgpP2PT05cVisCslFSrc/qwv5pDP9W3/2ZVq7MUFSIVvPDxYywcJ0DHfB+MIqcwQQbJ3U8ukNTovW6d/SQaXzxOxJCQEm1r2TRy6bJoFmwxJ3wqXeVLXIZFWB9AiRJo8AmmBRzUyk5feuss0O+Y3md6Wli6JMlt5j+tEiRGdjEXmiyvKGBP0QZDcjP15hkGX125xpKNyyipTvagrFrqVOfU/6RNOyyw00dlzle+ga85kVzoMKgAIOLUVT0PoOlAx9fh+8NqcWVQ4PBS3gInEwjY4cNneNX11OXvRo8CMi/7bErbfrWKhXDAYuT3sgvdo6Vz+AucOTD0G5Q+H4J3TAah+/jnxmOrXYgHCVsHD75A1SyvcngNulHyOXUQwoStEihp+uNtPJ0CHGogcdUJ2+eRa5fwvQ2nss0dY4W945w4uVBA+fn/nC7IVTeeVyLcwFWzQWJiOCKpbOsb2bG+X+Q5EVZdsmjIVediaKutI3vr173DdkRrmhXrMbN62dGo4xavcTG6UtS90BiywfrOzmpECpF1LjOUiNh2m/wJECn41f0Q6iVPcYHvFgAfCa2igY98+aYi7mLaVZ2zNCh/LpV2APIuRKxvPBPOFLPj5OW7ZPi64JVE7Ci/MZWOn3THyA7thpvY3zZ6pNUD3nHJGLmrNO9iEj8dAHFrSnfy+eFo7WXa0EKkZllfnnzlSLM8IlzlUs74tcRmzIbStOUappsp1we0abgQZTqZF+lrBOAv5aPfV5ZIw3t/Xfg0zJrUQLhu+eXX3lSjG2cj4/Rw4d8wuPtT6VzG6N0BNDitup1+jPjlR9YHilwF2FsvyKzSGNnNrkTPjJMCPw/+qwDEVNdhS4dg3ybfQwL0yqol3lsCpDzGQMBK6FpyomPueReKSK+ThPadTjUDgNU0VSlSu38s0Aamsfr3YT/Tmz7NbcxQKpuAfvKvf2wjfk6b3nqGScnFNmzQcRgRQGzllwZ8wKouUEac0Z3UtEnvLqCrBFOkNCM5qbl1mB8XqvNHb+BQr0ZNgbjuzIKnu6iemgU/q2ruL2ii7GXRZl8RzEk+1+mxXOlqTX4HdLwyHT37FiZ/e+MJ2csJH8h2Tw+qj385ybgPEHQjPs19ZnQZfRoPUoULXBM1dtXZCnkrnVL8cMEr8ZiFvFg1jRAI60cA+5PpWsd/ESRZ99vu6PiCdnVTHmLtW5xmhcgWtdRhdaucnK65FKnJF42PVa1NZfm9DgT+ikqcHnJ7Y8dyGayjPR3sMHQbQM5rU8xEDq8UUesmeZYIoXfUuJcujuGKigNUam46Z30Zg6tzvGmGO+6nSzzVzWD8uN1pqUOrWPQqLE9EwH9zSOqoHEPLxhg4h+6/L09qKr4V+2S9+ccBTDk5uQ/EVkQbbbBg24SUv00uNujSAZXY0Ih4vZruyQddRRGe0l4iqjjn6BEiau5VKT2I9eUr5onTV1LR7CuzIWylglx76jGIvLS35w5MJRMcwz6DV3lNWH+8fHqEu+K2a3HwRQ9CJkXXE6TOTjlp5406cqi5c9hlnYWiUxJd9I7QJKAhYCBH0uCCzU4KfFHw/7sUl8niVwXJObEydsG0mk4X9u4mPuJyS3wFYVZHH5eAhyoy0Jcaeom0inEkcykly6R8hED7VyyB2nkI8nGv/eaEXQoCghXnE1omk1TuEulgK9u1RypMuJ/aM+LE2HY20Jtkvle51UDgNrHbSat1Nmukehfgbj6bEtaGNs8reFpNHsbGoKpbCWAC59F06YdUvYA8QBG7vgfTpSBoYPAKx43glcC2dD7RbSdFH6HSPVZsoHm5KOHguhvOIh7SdL+4MU3mu5Y2cXxUq1QZmPhFBID274jVxxFtWJtHL9oHTmG/aj6Hbq+NbNpwuslqsuLKAnlHgk/dCghbxhTA45YRhxWXbZq3ZJHt/HsvuciwRl11LM0VFl2tsx9lgoZI0/FhLjbWD3eSAzIUaYZ1CPJTN27B8SdiZFvi1IpkuZQ/+JNfhzAyhqINsnPYJW1FSoOlU665grvZ+OExNhwHwvsEXY+Fc0/Hhny5cOsRxbBFR82pnFDdT7W5bKx7FLddUrcR3ofMYYnxWBAu5fq3dNVtUrI/uWik3cdIcjXmmfHXxQgTjgPPGiUAh2+P8emxZpjwyy29BxyrLe0p3W3xR7yLya6Kz5B3yn9LGVY/mQdTuHJYj0CNAOe9lTZPewRaaxfOlKWUcvkwDcEtWRcNN+oBAvuFHIa1Af0WvFfPjZGvnrdBfDn4MZw/PC6BWdG5ofEwfMoYw7CxjyCnE8RgPd1QN8X0xKcYEDx+jj7kLCnznGHx3GAwQJDQxxDV7RYTqCZHVTVAZy2JlCy9TbL0lXQcLNxqIsQ3Qxxvcjoeyz/DkOuq6zn6jltmjGi2sSiEkqeqFp2XaE9BV8wyiafOtCEL8ndEtgBfIpbItAdV26FEb+OJNPEMnfK35QkqH4WpCHlYQwA/woy4VuLAUR8hz66fXbmNxQvAvcAG69yDxVanF7rfvaXC5amxpOTGiCimUqvUn/wpfnnFGXLPNC1JaOgYodbkTVQXh8hO9xklKBKvgOQrh1/snLfrFhg8NNXwihSTzizRPyaRQINwqVhy8+/ImoClLQ6msYnjvSwW1rCbkcuYCjAbUT8uBrGIh6RPYeJtEKBHe71GvuC7xKaGtAp5oSHcyTblF8AGn3ri0q2OJqdkVFC02jKfmZIvzQ9omAVDajWkhs+UVcXkTgHC1JlYndgXO+JS6QjmpjNaw9wRt1O8k2xqikKidOnh7CrcYcZ8Y4/sBLEbEBuF0EXaDcXP8JItD+tuyBldZ9cKtvWj/Js1uqX8H14A1zSpWmWE9cEEh21gPlGF2ArVCKpqy/UCAjG4txU1Spw4s3aguNUe3G9FkXaoqbFYzhhdFsky/5QC8h49K24TFont5BT6EIa5VaMlFfeK1G8VMzi+nhT0+1pGo6g5psiNvFyRjLoBQ89DDzxJWqZD7ThpglVuZB30XPLVDOIayL88LxvBag4UoFnS9+ullf+WSWEyDblD4pO+OKXCWpSgWIVH3UDXO5/wgTcPcnVOl6AUpLZ5NtFlSNh74ZxtIkTBw3R5kU3/zT/KwDkm6naKGvudGwbUlGq57t+vOth+2bxsUpZ+KEHVG55An768iRyluDSQD8Bq0WLWHhbYUrfVj8HIlHBO9a5IhjCgO7lzRGO0koD1n3MVIBnp5RLGqdwFs5SDWnwZAMLgt6yZ7h00dNVLvOi2Um2ZP0Bpu7VDh4kVWYTf6HPxXV5/TYvFJY+6UbDwPFL8ybnVpgREbKjaDyumuXGMFtGrRcHJkNYIrWrSwDLbefFsnIBMvzzagGn7ExY4zWprJzYKQZj9/trU7xmTlfxGJHmZustjrkw11Py/oQNWhTK3ACTt702+O9C1AORdQb2dUX+AR7XkQxi2Z4cyGF/EMuVZNkJudWyAsw4DuDUs3x+892f7FIrCSwDqxhCdH+xU2UZwjic67HCcM2tP78zCC5hKXCd4O5ri0wVIcP4w3KhtNZxcgpvIP4r3RrBZGv8uISyJ9tlOVhNPmDhXtGDO1MRue0AO8iqr+fJzhZMXZrIjWDuYLwBOrtyZCDHxMPuBqLVOLZi8iKTe2mjb6nJYOcZQ4jLCLa3bx1xGdjMfCOWkI+yIwSddCmWKc0C0c1+b3RpJbon3aC+vnWYzCMHC0VWXkfQp6gkVFCMoOUdT1MCx47EkddFgS0j5+Vyec7pnFhAXWR9DdqNPcbq6yzrMakyo9xAoHt1OYLgXwYTB7H40LUU0SDmGOhlE+VaYhGQ+kz29kcujFfXSejfkQIKLqOlSCpJQ/8/WtYyrGeaEh3O66bYj1w9Tm6FhiEG4uV/UO1k2+UnXpgQbE4wUeC4DnIUosFw5+YvqnYuKA7Gk+ghLall8tMxXc8NEICXoUz3429RrxQU5YOtpSzk/5+VdkIkN6Ms6QT1/oWWClNU5bYdft1q2o28woiC+g9wxFNriNDpSO4/33g5jNoIgFFIxwOcxbewbIztIfCYDJmPgQdqCzAslU+G1fnIOXHE0hOf/8lwTPf4bwGs1REJUFl787G7iVua68zATMGeNb5DAzbfSbH5sOl9dtLiaZtII57Ca9EFOuTfG3K3GWD8rj2F4WEFxK+TR4ZLzEUufhz3JCR3QLm5L0+DDVOVuGAwLCpw117rDYjeoFY+laFFDEzo2/ZfrT52ayC30k3LcH8F2pg781eFQbVuy9F25jmcCOfPXMnkABwQ+9XmjXEVnbqvsbdPbWWJ5N5SLK6ou1Jp4PM4KYpdwH844r8c5xu35CFRp5L+xYI9rWJAFoq/n2OcYXPM9LEsuhShGwgWNMmPMZnXZr9hYwqucGl/lRezrjQiYWYr1Rv4FPDHz2uH0V6f57/iHWqIGZ0yee55RbDG83gRNY5dLH8qpoSq5CBL8aqWvWoz3JX2sbYEE2gA69zAAesK4uy2a/vt7VoM8SuA+KtWSNFgZo/kUDIx5ukPhogCrL9mxQ1pCjI479NLWsgvatjDm37HtGtdOVIINuQoMSoUeYV86BdUiiqSjlp3hKy1M4jjcIS4RER+pQG/o4blj1+XvPNb8F+S7hi7u+PagC1o0vJoJZonnFXxlTSUnejLsIrdyBQif/8HVvmkSX6u0NMEdM64pg5PcJx+T9hjzO+GDhQ8Fs5DQsaWHNjk1losnFtGCHvMmVTuQlvEXeNnAHIs9VxAyI0/HhgdX5mCujIsBh2ZF5G0UXHTSKHkiYZGzpLegTRh6agDzq5q2jN/78WuyOic+PecPS+MLOW1AFJaTloZOJDqmlRisrODfz0AyTOOpUeH+30VumWkrfZZU/KahIJSqMMwi83neGn5J58LJlNcT8adDRg66qugBmZ3bvED+noITbTNjtOw8sE4lE8fhZD7RT7X4DQjHK5JKJ0WnQXxY0ZlY3Z9XOB+8qW6OdXafYMZqLBWl5WgUSEREMwbODk9TBW3L1U5xjPXMX2VO59pnQ5RxiGTvxT9uItswINaONT8N12hb/N+8I4PY+rpnL0UIguq+sQhcMQpVCEBSvWItdpgH/bmiujN3+ClCgrjwTbX69khfYvbPxkDeTMF2zWq+6tR5WslDr1k11k6chKY8HrjXR0or2awaSz26uFh+cHfVp2gKgigAgHmFU+z4InnbcVL99RHIxOGKOGPhJ6+N2n5qubNGrsTuVqbbMWPuYn00P6Y5k74w3KUqAiTbLuhX1mnlwX39SkiOLGlfWt9o+Krlfwyr/9hkiEUV7q/KPkorerUX1GaD3UZI3QdyyzSQUsGl8J57ZZbvqscgYm5LNvs7GCsd+E1SldM6rYyUK3zOFwyc35cDeEkWMN4FdoZJvnRd1UmWAA7yGRHf1fWTg1jEl/GNBeIZ3MhBxubBcMdGqcGy/dskGlX2BXmlcQx7ljAdiQuSXJqkdw6xazBcrh2F/cobtBrkrFEzQDriSwR64lncfOXX4QSHHREi1PlzamlLMvSsgtRIkozCSEpujiuqcmKAvF0bv4LSmuKt/7/pkIOzGYdQIBXWnqkZU/6Kxiw2FeLYTkezqo3PJstCeRn8AcKfZL1oAu/XJ/Wt8hYDAUkRvaiAl9qWvQtuEISqVz/8qciW23OYmUSDmIulaNvbJZbnBeoSgTIj88EyDP4ps6SaTEjNioIg7NEfFJp+XFU+9ZTdcR80pMPlL8PFpKp1in6hEQc0zwOPTcT6Uu1w8Xd3h9VQnzj8xuiaRNcGp7LFiZXjznuYDxaj0cKIPxsYa10wGoEIANx+orga9r/1KhkcWNK1uBluINvSbIrGT+cV3aoS9wKxd+X8BvXPhEf3Ykziaiu8InUmYZQkZJGd/vLV3doBc6tdOkjSWYK3/v7dcdfZgcT34hoqgA/ZFD1a9m3htP0DuCZgV5iYqLEbQFNl6RuSPS8tuCmF0AQJCzGECNidlqsEq1dlOcSnmQIiiQlVx5JZVsKMjrDV3A0plffoqdkz7I7HxSMu7HmgQgp/LNo2N9HwZZ1eau+sjmzF62NtRABeKpC9N0CfjMYEOSMzr8FhVZpU2qsZtbb9aSAHXXXihwUJZRC0te/lUP1tpDwFHKVut8L+56BL/CIYxiTS6GdXp7WCr/Kum8l/M1kZHxlos+5J5ux+fx65t8FsXPrwF+ALPRPtricU/w7Yb25w8IIzOHZmzbCV+L/0rDdpScvwKsooIeU3GGYIKFLh9tcSPks8HS5Vr4oNb6O+7gBVWzfGaGAKlUjUHKFFvfMau2KLfmBi8AF8p6OYL4HeGcbWJT7GKUO1YODh1MM42CW/hP9HBizzBlfcwvcRLgkdCtGnAUb73cW6VsX1YtA3W9qbyUcrD55aHsaq4pPGbsnMZ+ZTah8JI5wquvUaY8BLMxwW6cCjoAKQJsp9xngMrtgvuTQIwgXGThLMyeJKk09IFdfMJWqv3izuZkgh+Vlkfh0OJ5jwqw3tileK0ge1m1WOhTiQO3qrOth3tTZwmrQlG/8GA3YUkBBOxOAPdK+lly6BJ/xHDADhWSmNAweYm5Nl4Emci0j58cHs+hStJ2zHp71ObnhJ8l+5VMQrGMJweK31/lx0Y0DtUXZlwA0jMocK2I//wFCzuPCqM4e/Q0krEES2s+rqPHQDCURtoJMQZlf107tAvM5hn+OYnnJoNSBokthsgKRw+1WT0bbedlrNW/VrCF8eKxjGEnFafJYX4OOjDmbwK/WrVwXGeLXjYY/4ShXMZ9Oq4ydW1nDS8wrV7r3uOeUTc8NBeZ2xU/7wVGR60u1NU1kjfi5YMvuE4iWCoq0r42l1uPphpnKcndJIFIS1OtKTC71H4b/1OlSrRM0dGjonfFaKRvvaFKtL27M7AtBxj3IB34/rls012CMsYSlOZLdB4cs2SAdGWuOR054QP2cu0sfn/FsQO+EunSeerymIeKqjSkn21oUksPnmpKyDdwLMA/syRos38bH+rI1V8K/7Nj8wrCqQh8EZniFcJJfpZFSA6PhwAKPd7iLwp1ASPz079SumKeplii5oYBs2IhFG2pfHSP4c8KXXHOQ3e4SyiEwbZpJRjBYUqKBFT2mt6p3XiOdYr84Z9iDsgCJhfEBMvtfuwjeMcEUn6OEhZhzJCDIF0sGOMpJhjNdDOTI+fq0u5NuuHoHAzXqtL8DdbpQ6b5q5uMHUlir4mVsrnFp1Cphn60FTuCORk+1z/LkB6PBZeBxgUtZ8vaext3eDVs/mMyoNW1+iS/7lmyuhOtSvvxNlNzMTzAHr9kECC1D8Tm/+aX7wRwAvGXooq53fJmdYlvG7KA3bQbRWyq0HXay2/UBTUJaEU9/D/oNmVnrNnu2HxcnRlVW32hHn/8fcARkfJhZn16zKYqIqjzMnPOu2t+e69TFm+7DSLV7VGgRyQpNtoa2pKvylcica84+puti5RfQqWAcsQ9sgRtLdUDLygkgBbYfmMFmaZpQkaPUF7koaEG6J8FBtCX/nhMKFub4+irfHCKstXWhlcw4SE01ZepcXTOGciSfPG/0omeCnUTRC6zP3K6+hm0CQn8Vzwg+fHpZeh0XUZvVw3HNoKiG5yXovEzAVRhk+RPeJ1U7ntVJ8BiZGhgquQX9LY1Rh6KtX4Kg5JFVFOwENh9Ln7MScKf0JoFVcfmqgyIm8HAPNf8hvVGj/6rkXROCDoH0mczBA/LN4wT6PrwO9F+FtBe+L1jp3ibZTbcOyE3ZvvCEUjmBEQhCBK56ZOHasNedPoqFupUWKZyBunJAOrqijMgo6qr3ZywNTPygcD3+cI0gZxIhrX+NfccNKpWRR0M16wUiUOC3h4BLyEFxQvipSJqSbwD1ixAOorT69EEP/GqfwtUgh78P32VtcMDiND1E2RrOSEAtXHrkt9jFUOZVcYUxnKYVnX8ujvbi8komr5rCw49E5F+lDIJI4UtuIstdWRizuiepsi0KRxjWghg+NvQJGJYR+/w9ejCznWn6mw+y+qEJZZKgZtzEJfuTSXoldBUYBKI6QCFeZXClQmm5SPBWvUUugGip5FLAWuDSxPgkzpEGWK2r62ARcVYgnAIMAyBbkueJPxtPNreFt65tCmRNHpKyrERibR20LzAiVjjJ10kzc0DF5eyMlwfp8ZY7RnOvVpmYc0k4Jjygjxx4HAoACr7FhJiOipxRyaOU8sWz0LLpMKU425IF0+cjLSbznv3gdmRGQCGltIwgB9rnblf3VkaBA383OPqznpxiRN42C9mRlDr8fvzOsJewi/c5x4of8QV//lDQWqrL5A5UNctZfkBScdneEgslQijgPFKcio7v0+Wh5Ga/VB/oPOO7eWcFU//RikecTFObX9Vkf48dRIIGYTsv7JUFTmt0wRuyFddwOM+N4nw+gFziIWU8ug9vkZBo28JzBXtcB/dA+hMNEAKobpdY6yV81WZHKJJwM+3jHxEGToidMqBr71HAelNelZkNznhoOpadVZFOPUAn3U708KzKiqeMO4aBh1zbkuLd+uB72/Kfa947/XvMiWfLa2sZunQ6dslf6vR8tzOS4L2MNBBZonCaPJNzYwUId7NORwDXgUPUBjqJhosms00EFJ1bE4Iy0r0+TXL0aIzt3x+ppgFH8ceFSlezs0SG/X4jbNgMnaCQJpsQUflXSL6UJoF2K8iLWSP43A8etecxqUwE7WUw30KBJF8kQY6XE9yxbggRTW2uL9layoXteSnuDEa2HUSsFsYKP+JNIygpHpSu4wjOnvV+x09k66gffw6808J+Nbcf+oDEihstHKiWX3eOxpYZ6ElwRYKLM7yli6rD8pJiUt7MbLQsgVei1WLCBlSeUYM2V4GdD+p3m+waIoACkfs6oCW0Diup+WUTH+PdGRq/Ep4Ep6v9J3dO84mdMLATAvkyrMUqbMuBBLRoQIzArDmRDCJcMJNCvw7MUhXEmHxLZw3tUa8E/Gv7BprSbPvwg/O0e4gAfV5ThL4L0U4lH3+xzDGusjkkIHu62Gr4VZloG6VEhfL7eQZrvLN/6pFIQwuBkKeGXmAdSJ8B3Eo9zxEbfmTddkohWfkZlq7mvYcQ5kfhlD7ESmPhOcHIYtazMrWLxn5Cxow9m8APRG8sVn/GFCsg1tyQ8raIew0u/l5xKejf31vl+CJYDIyX1G/zsZyroNXNz4+hC7P+I1Pvl8624cTjmVCj0fCLM9wdf+fVQMo7NVx2tQdEVp3ize73jQYf6ZT0AHZ87pPJuz5hA6lA0SGLvHuyMPrf5naFx/nsOegHZTbZfXphbApEWzl7QP4kHVf83W/6gSTb0YunVD0bJ2CD7X1emEqUwispUeSlJ82NkhDIVQ4s3Z1U5OGqX0UdhI1lL3IA7YeC58lVhfjWH/wctjtb4JA3R1E0uQLydUpwWsxE5FOihCeOAC3d9KLdE/7y/cG3nNp0YbdDQGiKUZyqlUXDvrLCaj6T2X3EC3CsjOP11icxcd3qYFCvhhXZeU++fzO68iWsLh51IPxWiLfpA1jY+L3wzxNkvunKuWAsS2NgFhevf4uyfsFTGdgKA6lsBh+aSaDZ0I9vPOdTbsYQHTD7I/MLoyUsrn0VtTCerd4pQmXB8IKziA0TfARgUix1v6idR+A5T/FF/9gxKO2y3wp8JDf/K86HoOH7B6gBxBYeBgrlJuA3l6UbCNVhpwNMoPSDkPyUomjWiE+OBdsI/IFxpsdoWT9mVw3t8RYxCNwE4sP1crztwshvbpNoMC7WPkMGkTo5w5JCeklNJ/H3ottY3yLqWZXooV0of9o10+5WXvSIE25HFxPjD6PS/eK1co6PwDqTIRBmOzb3Lg1/wahKgbP+dcwVlmKLY1+b+EYNEMXMsFF0d/3eG5PMNLU+V6a3sCuMqUtZfjCoLfHbjLbl+k6qB470dV3tvOntr/JDY1vffr7tEP2wqLmcdB37+Du0vtgm7j9THg1/xpgdF6LPZBClOhaEd4GTB8yBpUE8Cil8Mc6UfAVHrE7HhYcPr/UbSQpsbjVnscKhs59aXtYagYz/gShq6nydrNVRLXPIOZhXrL9U4yZFWEtHojQZ9VooW7/70RXRBxLf1rKX4jgpBMOFH4Z16/g6nlWnN/Khcvs+V0FUxw3rHk+Vb/oHw+0MJZ9sXAWCNZIXOVKlCMpoGyn9TmkTjFDO4migei6nNrUgEVUbjfVtTyXemBWRR7bEPiWCPcPCGblzRYquAX491hrNNRsYLZbY6/HMV0KyOxmzpJ3T10HL4UGOoA7A1YNPfTKmWwUmMuTb81znJz2KudPURM+2gl0R1cb4AurhsQYjsiIKJAnL9C8yCVLpowkYns7uyHakyF6G5ddM1ZGEocx3VwqtU0pG3bC/vdEfvm6NJ8Pl6OKh1hxr3E7l+kr7sCi5uGdWtHxRf5BdENOekXGLoqiD4pygDsCzR1WVQ/m0WSJk2OBMtjj9Fh2pOUmXiBzNkWkG2e1zwmP0vDyU8ucBREvJHqJRReW7AzHr2217XQaQDG9yx/TUYO4d0GF/lUGZ3odgY085m2fMF5UjIMLAOEk/KFGD2+/e2f2jrRa22WiNrJiEJwxJeXfXvpXdA3tJglah6MsmZUYxKuCwJuPNb2d0+NLddNautfPP1gC51wgryRFz9rk106XFyVPkuJcAZ/L5dXoUP9j/EW4JzA9p11wLvxXJLoqUvevdkkO1eTVyum4AZf2BMBYsmVMU/7DmjdtJGaZSV6Wi9flrUTEdJmMZcRT77fTQbefEYA6yqP6/FYoZ/QOOfONmTFUSrgtoJX2BDmJKjIZreg/GYZek+bLBkCD4hF3bqemIsq+kpEiS5QfF0qkTpwljWAhaEFmRgZ+vkW66t0q8yXobkTse4oNfX5ag+itmaLPZELlJk+YxeoYNlDDAZfSGmsy9u1I8neMpINJDLgsndevQhfKcYc5V3HrwKDBjvhY+dlb9IaE7XUzO3pbcst9Bm2N4xlL9fWanEMB/aTleeklCaLA2DAR1cyXxYXhTP7HFc+o7bV02UD0Cnxp6MTHrYfu/+uuEBe/pBFkCVuBu4TWmTk1dXWR8PUIrNxoxur5FiG/q9pP85x8MBRJbjVtufuh3wY0b2nlcl1K0YVmvLVS2/GI6VSbXWUeZrswC4swuz8T5Tsg1PkEbA0itCtnKckG/u0eyhf2haXEfnJrm02iWNyfdquUOynehJqwGZtOQC1600QUsb4H+/mOhrTqLP9XOKsD9L9H1XqEZ731oNfVi2yUyHkd+OqNJJIgW2S28itfGzjBBFUXinMWRSfwIOycoMI2PZGj03Bt1x1uaQfdbHU+YL+hZVewavnKfSsa8nlR9hst3H0PJj08ROLj6V6QWBTXTPuBgPg1LpVy6RldYJ4PVqSKHYVIY7ZIZVbMXzCNIKPVSzp1vNrArkpIeKDr+hhqnwISLWGXkwNWxPb3gut5+0WP+1CVVf+XjVI3WAiP50csVKoarnT9/D2sp+aZ6HSu9n5waVM0z3/6ve5sos2rJmhBLenjA8g8j9NWQy8gyGv1lA3j2YS2B50IgHA4AEO2zXMMhuMNkT+TK9bJ+3xISDq6cit26x/HGJU588Bdi2cuhmkncJ3sDhz7UMHStKj1G5tPedzJ6eBgA/ykx0lMeVETU/YJ2Rj6X1AP+evK0LjSJPmmiVQE3S3HjwzPj7S4zmJV+tOGzip/CcGjFqC2BplxFoUthxb1TiXexnTszla3plTCVN3uc/styxwh74BjaIEzVtFSw6k/Hr7QjT4KV0R/w43WzRi17cAPFb2RZvvDRol68Fem9HBswzuLZd3rODGZm7WuG8lsoYbaJAFscqb7etl1PDwIj/n0GJnCBdYkaUFdyWeYZKVOiS+jQI0EN5SPq2D+Q/vSNrYBujiEEWe20BNJIhEtz2yfQjDbDLwHrf/nqzrbfK+SB0Y8R5Z2cKGgEy2ApqleJHvzibAGtErX8ffMBHTt5TLtsQ9ayBfWTk/ihLdpFo49vL9qOi2wJJJ3A9cG1n90GwUtccdbxGqzyCIgMHqgdGa4x/E+V0/SQU0rdC1nE0YFkI8RfGcJtiKtgeYYwEOB77tHv9h1siAYBIrl93f25F0laqvSac7tzV+FxbNAJx09uQNKftU5/rdNkijheIzOWAXaBfb7fbMpYGvlO+Ble4HChQHy3kw6k4l75eL+V55C13MtfkH9nMyxc0vawR5h6PNcc+0g6oABcR/nfv4xZg2Y6VzpiyfVWvL0DVbnummdaZeiTPoG2Fz6FbJ3LmDQPbh840WwjwQIiEZmIjxqUgedJ2hCXBPvX5g7WRrrsa4hls8DVOYKfGma/vh3iaVCDWpf5+8IzaFujmTtdUEuXH2nkZT9EmqF4ZVhiyCmqn2T5pE1zgkpya9YNoSwFlVAfiYzLLcE6DYJj1vOVyu86JCHlAnlRXBNKOKJNVTcLqDbY6ImGZ1X4B9gqYaVjmIrsmk2orWwMUqk6nq2aWcVW9DzuDk890Syc3YsqPcNY+dwlQlvxoq/zFUJ3PdWUpEJLZi0e32Oo/H+Q/cV9HscNAjRqd5ZuF08j6aI7z698SQmE6t/fRSxrzSbXdDEibNI0bcjwk8NkxbGHSE6O8Y3oaQk2llF+00LJ3zXGIL5uaqxqlCY9Ex5/fEckCBCMiU2HN4T44PMMZH3LicKnxoaUNw89LFpW+JMdyAjnvVtD7BLBRKta7AnsFavhTLSf/3QB+EI1eY2x4LTjm+qBnwdRTH3V1sFhsNkmAmh8daCyCF93XVkLcduDvDtH8jkQdcaNc9bWEC93l2SVytS4QIe8fpI9sj18Z6op+nJcPsHTJF0vNv1Opw4tQ438i2lsA4C1+cKrClM88gS/8lhHPkCtmIgL2pZTeC8IVkoGS14VekFOlsGWeCMjeUUNMLxw/W7ork+ajn2Dh17RZNYEEsxqI0eWJEdxeMEqPS3p25BJDhr3aNxGpUIv+0meAPUy0bMumJr+jjOFELDEJP+e5kbSKuWjRNFFwDTxoJd97wH517jBUO2dHpgHX8ed+ywx59L3IbYoBmKJ4wiI7fDyWewmq/9UxzS8o8L4lAg278GyOlPNkoeLZE3ZXa/kdrkgXryO+JDkO3d14IYRp4FDFbvRROcYE28nd6ifYf+BrMBUxvwyfpygVcPm0DwxqZvhAqaN/cEe1lMIMjKL9BqjnI9JYiNbZAaTCArGsLZbuOd/1KIKG1l3Xw+KWQ7kDY/Y7yNfpsNd7/OmjoiAvBhnKTXdHuCCer5B8i//UiQ1p02SH58jbA1C4reVumQ0a5r3oPU8acX8E/JU5DtgpOSgk34iSZJzi3jm8T4PPdpJM7wjLZNxLTG1JnOJzoiRcfYwVYf3Vifb/bwm7O2M/DFYR4U5B0pObjSGvG5mNpUglQsEt0rHWF/VJKVGzBe+rNr+3hkKdMFBeW4BHfmzFgbeA6n5P5m49XuSzwC67QgEEFU1kG3h6Ag4nmh/siDx04ZYbn3srGXWKDqN4f2TZir0waFj0NKFB/Viv6xt6A0UuFycbOymCdmPRrgRUFS370UQkVWNWi8q8h4d6lkZFm5FokAevn0dcDfEkppvUtafeB4XMm7cVctLJpN4vFSUKsFcA1u8bi0JJLnRQqb9M+q3akwrrhNMBspQEnwX6YH775D8tZKkyAQFE3yqQ/C4ALGclWAJ9p0Vuyfd3kqGcWUccOpE1oP8OjwKDl0ynVg+4U6rCtqiYYbhW4dgTjaznzXSIQT8lrSdIEuj9U7DDFuN732jzzGlNw9D7ZFUWWwKtZBpp3B2uxE26xs8fy+jxGS0qfDZPk8dq6rAWvaV1E3oN50qNPit1FE+IYRuJZ49qq6DY+FtIODYx86z/HHszOAN3UnVslOe05fmAxrG5HoZHChjs76WD0H3HPk+a81b7KbUD0oYHa1sbQu+icV1X2+ifFPuzTBp+WVtlZzie49iVrpyKRZje3U6GjyiM3KVAGlEXf3Abi1rAcAp/Wb/TZ4/0Je81rtbGxL4Ka+al4mSiCNYnohM8p9UwkTCl21Fhb2k+nAFxQBGbOPVnxYU7AzdIQ0+htPjgIYi1aWXel3JEudNRxnSjYO6dQZDHaJfv3U3m1V8X/IltSJ8cFEFbCSdWaOn4yNZBagXlcIvP9JG4gSMYsBd9Fta9glj/YV4fwkh2fCcki6+us1ioYQm/GkO594JwY66vyk4PWEcSgR4e5tE2UzgRYCHfLPcJOr+iK5eer5s6XXLDsTkEl+jkiLEWMwVLrKEN2WFWGeY5479KoppM5+ZiWtV0NYfQfVlx3dumWcqm1dLg56pnMUK63EzD4L4PWjcthN+dYXCZqPGw4V+f2yMx3hGLecDEASdmQVYLLDA/nrzxi5qBLuwlH6dqNSEhNPjd7E2jQWo/Kiq3z2xEYa4XNtAErxxTZlxkKXRyXnGJyooeosqdDr+KDsdZ6Xse3Dtd7rgAgcyzdMyTDa3yPcHJBIsIRHEJlQIiz9zPLEGSnB+vj7gItOQCUStJzNitFnbR7rRCXiK5Qmkl/OZOrts8viWQibimadPq/jYbHm3kVlNK7rUDR5GdH7KUtSgJh2tyktUw/Z26un17MGRNqwYBJMXvkLgE4cz9YOucDDyde00D23Vad8lKgklM5PMEEupQe84fU4R+yPV7cefdIaYZAvezf+T7pQul7pYsVhAgaUuB8z1hWeEprdYD7JCXREqseWRDy7DplK16StlJi6Pu/a/VOyYBQtHmIKzfFH/lHxrV71clUf+e16lLVTziCznAk2moO/qLlMr771V0mQNAk2aAb9ZJ/nc+crtbbLlDV0zwdA0ion2cFhJzsm2DktJEkSmttdDKNcwV2qT6oQmtMis4KO8b6wgbwc92pCcPZaEEKqFC3MOZ+sPKxgn74sKWQ9FD5G8IwdVgfkrDretDavJaEAW/XZiw79n9Gh0hiFmjv9f4WlRU1PvJonVS7qSKPy3F3m2IoWyfQVZU2kuvhZAEufMmLTPnQ0Mvsj6pUOMKdUVGnfEqrrST7XqG3ePNB+YdMR+oo1ULg1Qew396YKu3J6e7kWVCjdqXwbVTOMMkdY4X2xlaE2Y2OEduRdiZ4GuJ8DzBxcbD9luT8Nu2py6eq9FKFvjtqyi0YRfO/PxmAaYQ16NFVRP8zXoIYwc2R/QVUapCV+fbPONouBK0MvUBACJ/73Nc5QU6Wefmkz9tziPEKEKJFdEG1K94WiKUf/Oa+2P7MWs/d58o3TVrXpYTV5O4i1LlF/9D1PHiLpAn1SnqSZ2RfByaFuEMaU+R7NurOx1AIm18DlHPccldNApJr6atvboggfQSwLWtUO71nOwMvCRMQaBJt54t34Zfcpe9vael7nYvJhF1VHIrG79OsffBhrDk4fhtZwveF7HGVvafNfYlCO4955Yk+XsKsde/rgmpmQ9YQwi/GYPJg9LlWlTaVmDDAKUno5LXWpYlyaDkq5WqfG+uovNxhnNDjSA8idSwkDeJ6CmwI+pi+lZs2wF+0Se6FJM4Q/uyERe6IXSFR6vNIU1mIk+/vFduWY3JwUgX2ZwFDFC3WmKdW3kBsP9SKI3g58Rfjxve4d4N1/8u5rOQBkMx8km6t36kiSEkEM23vVlqi9yG2ZmC9EI9qPTAqaDNypEeCM+lQrb7Bb9iz2fDbL7wct++MeHr4uaHYO1WNIa4BG6+fQZosjCEp1+0JoWB0nnc1CMTuM/uzp3c8beIUC3K0v4j52RCIiHo4vZTRrd1Yn48xKlgfoPshcfXCN/AkJ3BEUZjkpR5VCTWXuanbrB4BLmM735QII1dvmjgEKfELW0MXjt5E627N3ri+h8ePumNj70jIeK/PFNZyBVMD5JMA7YdQlGwkC+WrZHewoIoibXqkabgC2uoXBr9vRE9LlP/KnXn4/hIsTIqF9bMpD1nWyMI7l6gFVxTjdjErr80Ta/DkKldOWjI4JuxjpE49ntZv5WqT2ynL1f3k0/9284jML2f7kfKzLsksY4mkCX/jtG3S3T+bivFOOfnEn37cvwFo1RZplWI0jQSLDJVVZQ+pLvSHS/4rPrAvtMGdXrIowkEcF86Sk+3yNm5cQkIXYQgUr5HO9pD41j3B2gIWdNbuzx4Kyua+1FnUfNeb8oyvoUY6gLgFRJoDFKJcZa7V/LsFbRFN0cVNVpaBsEcpLkck7eEulpncOAgy7oDsVYnytK50ysIzQHdYw2O44z3DJmwE0Pa2jaGFm7HCBuikgt7UakUZEB9O2rDF3HzbnWEKNhto7Yofn98rr9LraVkHhrQa01v1wnirJV1Y8aqLfoJcEPsuZGJC/Wr4/NakiNzAwXnk34qe+1OEliYu4SKXOt0XegkAaUOpBPaJILfWOa57HCMVurLGnx+U1ZXZH3eltiu3S2vXQwMBtGSJ0P8mMutcel/yxqkf5NTFk7E6SdzWUllQhbufXkOkL6u7bsC0cHCdMjf7X6NXLnSHDd3bM+SYSWZOSCcyKoA46p5LMJ95+TeB0FTHDz+2qyoKamvU4sT0GfzyuJgR3xn57pw1XNLGqxS3fm0z2Z4rl4kXNWgKgtoYw50kqkOItpLip213rYwHO/85/RIJqMpclppZP1SJdtigZ3W6Nh86027fJF4TyAGrQknFQEMeUIjgHPbgFspl9TzvFWmbrzr2DiyeOPM6yCl3H+0ZxNH0nf5GIDro9yk656J7e8rylyq/M7uVUptA4XhVnzqnLmYn8JJ5j3HXHwEVBqQSKletl6FXsvCvB7bFH0eJul+weHk7ySUcOsC3KQYzHXysFNiiMl3aw6urdAQvUlEmDRZMWwtIE8Lqnt9/5JKWylSTwA93LyKMMeFgaWuymefZDxdi4Rf6W1f81L62E0KAHvT9OeVHUX3XpAmOpBGfmjCHa7oEXXi2SGmj3P0IuBjRgiRTVsLhe52PbrMAT/gfDdwzBDmG1UELPm9dJYLqV92ls5l0vZ/orBr/T4R+dldeCSSY0Al2ma7+iJaFDwMDX9HzbYvpDvhtJ7C8jylS1yivWm5L01ZF8XG9Pz9FX/IN0aQTQOAXYIHAJ7ZK2ffyOynSzcvo4SkuUYERivI3Yl/XDVORkG3halZuiwMqByztcjX/KfpKNGZ05ETNKQs1y2nq+NaKM1aleOw8clWSYDK1o3DEul1t2+pZR/ITxjv8iLjXIiRB0sCYI5Bonvl4kAdKTg++6cnt/Ij9lMPKmYHQ78RhF6xbZeuTUZHfgOu6eAG5uHXC6tH/HHI3SgXI1qK88H67CsXB6EzmYfSP/xvjy0qo0FPscU7eV5HZItBdr+ppFHOLxXl+KFjFeijQkZsMGUK1aS9GW7EDvt9yTDduG14SxoeRAlAnl4FTc2lSYF9o92n3+HBB3FZVGp/H6epFSRBuPh9EW4mdP3XwjmvtwyUpUsUKwNwSA1N7DCWD2DYa1cBovKC/8WPKzb2G2kW1xIG/Kb42LvQCkDeT+PQIIxhPYSYdajYeiYKgNmmePtCDBUl1xXP85xmcuNGwO8VkSqr8xwEssOPONLENwmmBh8w45eCO0KETmDfr99yQZxBnlrV8YZT9Ft9pFRwWp4jeb4n9K6pZJjuYI6Rbb5lnqDzzagjkgaDEUw/AH+Jb6VBQyWLM1bF7GWukfbG9qlx14k7Ymb2y7nD4ZpnuwGaFSN1LEWcVOI+9oCAiH0fnN++b6tCGWWqY6gKjkAhzqcs5xInFmDWAyT56SSqufl6KaupZF+kgtZPxIwK080dm8f0KOjv9p6HpCrl4SJ3qLLGmbJqD+6VhMF3dFeQ5AKTtmaBuHsoGLiQM2LjeU0dtvzA7qCmoxvD1nhuf6YHG0yrtVY5wa2aqcoIbdVN1K1fnNWYiLhmKM2pNoGMM1gS+0BMzGVSZS7rk9l6Butp3EX2V8lVpVm1FgO22GZA9y7UvlRYN0ioWmcZ46B/ebT2oVhsD0XM8O7zw8dGw1yIA01RPYtWE1KsUaF8sA9dUARfgSN99aiqG4miLDZu46EL+MClNZ/B3Xwi4M6uS5VwkGxfpRpwlsxaRnrBUPm3/JXSUfAAKK7zCuaUnOwgJvYzcMvtM7UIPVerJeT4RRL44TyxH7mFaQI9dbheX89/Uj5wltgE15W4nq+UDtMD35Qdxa9zedsVFBqq1yA6PiOGtfoWXJSNHUAdhDADuLYs0BqwVuZM/MrfPww+/MblOhgZs/RXBRzQbEdIuy1MOicO3p0fCvMLrRaYxzi9/bIZ9rXwMcCLuFvacR4rk76XguV83KkFu3F75OcPHVi2JrUn/Lvo8Q2h0LGc5FZ3pCAyb/QVWZ7i3xg6bYB7luaKUGBH3Mhpa4Dkk9smaOiCv1FBohCwfzJy50APfBdEga8FRTD9XXrH5PmSb+/tFuB/ecyN7Ej6/WjHahFROY2HgBvaOhxeXFwpnbBGbbppeM/yu1ebr9l1jGrNJh6wNtlkJk5PY44WCh5+dL1xSXDNlJ0ay973heZTbJ64Fg6tJjVF0fCpYZGCybmrs98nfsBbryLkIQ57aXqqA5hJJ6YO7y8s7r2nYztmdRhHq7c4eOa7NBA5pJjc0AtXwb7C+brDUxdB0e57eX9JUw51DFX5ld8ZzyxUq1feNhVuRyoQxtm+zzShAJVM78XLPc+cfnZjOHa404GAfE/GTtSeotFkak+zT+T8qH2CoVYb9s8x28hYUm5OPA5QlWm9HFA3qvAXK6OPzBrttpDUNBChCIsxrwXb2qr4pznWfGlso8yVUn8csX/ZhFBx7tQCKDEwpQGPFuqOFHJ0hRcrBmJDBUpqxEVLrrlPWyI1fIJBlcQ2+Ub/y71jREShDM2JGZ/iTudmQVMN6h+PeqAL6uAYG3YGmuSIZWIidzfeL4TLu9y4M/mz/YX29/ENsdmUvMADX4JvWURk00ufUaqgCP3OrEYLYP6FCbrrDH98hAOglzOYssdD5jniKOAcpHZex6qAnpVPH1u+5BZYDLPWxMkRi7znWJHp6E6+ROXc72SGjRfOo76jkwGDGX+LyWbcRSpOtjFMIloaT3xv9NjpNH1mQ9OajxXBnpu46lSvIGrpCZdH5waZ9CPozLXp9dd48PPEY7G5UFkU3UDO1N9DPh6m/vYOL5+EhiNK5R2wcDN5HGEBxT6dyNc5kCALlxfwRt0xR6TmBwLCuVUwPTnYI9+cPV03aerjAccuBuM5Q2mNdk9aE7Dxjrrol6aamKptnBjma1gwVOI7mea3AoPrU1GgSu8V9oazM2t/2jlU4wMRZ4KJVwuX74n8DvvL0r7q9ftcegcTsaYPPMlIgiq02XrYMFW3ilA28A/nlvOuhpWZinrT8NmJIK5FY7CrsOJG2L1yAVTWlOlzLMnyr/KHHvKvmyG95mYlRoY5iDmHY3Wm3oIO4LHYa+8J91sQ3eQl4jP1CRvI/fbLYuABV2+7UySs6My4z4Y3s7HxsqfbP2eqvHg04Vet96DOgnUbdw3J6sUnijEKuzCLjuCO5++4c/ASG6yZUC6w6klIL7xU2+7nsQlJ7W1kG54ow8jje7WTwb5A0dOuPnxNBz3az5nGzlx2+tGbYgjvKXWzk3eC+Gkla5OqU4BeaQLOANjfBVhgZHx0N7RPWnjhstapU1vLGzGZ8oPed/g6YJoJFmSmO173CTQwJySxHnmvvBlulYzBffc2K2Yzc9sLiEzCxPAyaLZstpPAgfIpnos7AAjESJ6y/mwxk7zDD+4rgyWc14gKmkuIfpZDLfrA4LjONvDk2EDjKs5p5+4GBKfgo+hbgEgO00LKTR6YD7x6/sD0OyPWCYc4TlhsbfwKyqoOeReK3Z/L/zdXnzJ1IvJkIBV1DzZP7GgV3IED+fRDJhj+Mri5M0ILO8HVlFZatcMXKtHVmFCu77tEhs/itq3K1PNEa5CMIx7QE3x8OSBYoJC8Py7V6SEPEn6pLqx50xy7JcFn0SwChjs7QwfxiguZvpB6BvOs70hHQeUyDPQ/mMAXJehelJYNELZdUyZh83Rppg4DZokdS4Gzox5dUcmSLqRAfjqqueQhge0fmQRxM6MKJKI0bimalwAQZjOMcNcN07hr8auIc3ZTTCT/Rl68eUrdhp1wBceVdd/nmGoSk5mLSxvyq8XSyZ5Q29VBYgUZj2KC37Ntz/WYVLpu335RjucJv45cEpnZJmdAZRUbyxYFG4XhzWTGEqhhKIjGSOS4CniQoyRKB2PIh7YfER78/jH8AGKRZxXI0v7LsOzZ/6My/SvjByu/WolUAmRS1URoYrRRmZAOrQUwELkqWCokN+0+IQINYfeUd9J3IYGw6fBjC0kMVvxlDeO18ihZC7DXS2tZ6IMrydZvq/T+M71p0eOjbkvqb9G3U8h5soLOvbqwdIdLIGkDn1BTWPiFBeNiaEcdUhFrHjwgNEvoeI4RHjsHag7veX9a9l4ySRGadv77YNU91ijuymS2rIer7DtEQ/XcYshqRio6kFFQWdtZLxbpNZ9XR0Rv6/YSJkK9DB0NEKHhc6E5+a3ZVpSlDxmDWHUlHN+dO44n8dRMWUgZd0OJySdaDnzFaZ0aNi3qezrb7rlamVYY+6YBs01+XeNhDw1GDSdB+W1EoIUoti3P+8xxQAqvrpbn/7EbMziqVJaOzVAafCJ7/brwzuW+vcKr1ExQZwn99P01rPLm6DehOhl8koCM3OQV1i2iKLYz4+j3kekNUdvRqtc21Oejs6aUcqTA145cnWept4w5ONaEDPdFveJQr/vPJyz0KrLAg3a8O2zV+c60R/Nhx+5sKuse7LHQFYdXcPULpCrj22/EjOzV7xxHVRT1ANjQwxaSzMISusbi8ZaFqnWOE4RoJ5fGC2RF6EZ2FT+YB8mLQ9Farq6vFVq/XYDXbW6i8XECRgC5b9m+uqMgX8g8fjtOZaVhRvvb4RDvMOYRE6wSQ+KHTiXoIjDHf5uDtfkgX+3umPYb670aMGKN6tFVZI46qYGYPnXln0m2OXlZx8pfpGO6H/S0qZWG9qiSY+lsF4X0P4mUvgY+ffBXkEEyKyi2jI/yxpuL83HYcDWHpdlmS8MHWDVX21zF8MvxTSOZjU9Ecg9JBCyVi6Kc44yvUdjq8BycL7HpESCf1un3LMiT1aToDZaCqNMK3b5JBhHyU4T2mWq3q7yS0ttlmHorkYsBR5OC/KZEJMOxrCZLDvGwTdkedNXOC5oP+miKaoNcjpTKxLv9QluezX+rTjlk3tr/lzqGBU4LtoeHe1Rzw8pRaTfzTUSSMLTlx+0YN9s4gkq26+sVGnWJgON6Q4fBuh+9hXtbfLyS2hEcXsge1eW1cKWD6K12t61lQXlWDKqHsmd3O1bKqzYAQFDgrYhRye3yDQOSXM12eqHXoa7lvOeMwrsF4kptoqmhy2KRlLsqavmIyk+6f9Dz4lvLN+UxlkB/x6hBiZr1DP0v1HvqB6O6RvvwEKklqICSbCW8fP54rW4PRfFVgVv7P0a1PvZDjX9LXeB2S0C0VlYbR5xM8BT+T/7qHW8gEl5SlNdo/5rCQqBQTplrPOQNAT2c4/9Xhj05IULXxfhYFVLABet3WykQPn2MQ/Pyfq+/rzD2+6su2y6ESirOiVJBRcPkW/hvWy64n2OvuwcOUe3EvxP/k+BRo0dTfn++8ebFcQOfv2+cmJKBNdHMaDy/k3NbOUVdQ+Qegp15UlVGKiCsrAmwdURjYjDzK8jGtE+IV2yrJWqdE5j1aoAP5KqmbGVUUYq+M2q7J4eFEICDYHfcdhAW9KcCwpk2NLQyHXdYVcYhMikOyiYsqs4blP8RBdkdqDIc7KsNxgxwMYF0Hz+hTu+G/9sK6EZh5RqwZlkODA+0HcaHS7OxoJ/6R0v6zLBgHZ9N+B3H7IIXro57a/nCCXuyMc6WUExVYKHVPZdpZneqe8Juk0UG6jK9IZ2gTtdBsBAGAl6M1kLtCEcUc9P8/qjZ7flfPNl+Dqwp4quSBoqo7l1S+37XOSBPhGCFwuGTIj1puR5lCENbtpsMH8RYW077APJzR8zS2suH//T0wymS2jGcmzIG3ueUR7P0M0Uodp8Bs+bPoZbqxKperssDDBFG1xMppALLqRowLTkHWzZ3lCkpdrBWdPh1iiw03joleLe5ClTcfLIUV7qcJfH35inQsGpS61KI716jUOUXNHrCdcV66eaHSwq8cFze9pQKhtqxIRhMdrtMiHv3pDiqjZNBWLD9dCXAfZT5xfa5OP2mP3Dtyn89mdvyJrNKuZQJhuiwsRZe5jCs+9enAB+zRW73A4FWsInlgJnKhjMJvf/zxe9ta+L8JW1CVf0+IVHpXTcOAaVcq6QH2CuIGiVWUURimiU5cm9Vlh2055y9lwr9ebZMPRpZ+pt2DSRVLK6AV1UPvMdu5TaqwtRJOTgGICvybJgyCVUn0053TBBqQK1fnVQJ6W690BsW+4IFht3pN/1YHX3PtrT0duexTrX9qwYLuY9+ItX5RLjLeisdjWLlHpmhtZql9S9TdAclkudO681xunD8QnKh0XjMCfOqdof32Jk6W6pgXR/o6UQGKHutDIwN/+BrJ4ruXS++DduYDfcv1HqfLO01kewgqsyGebVnkUwdFtIkfWAOhhpHqQldIk/3/IgnlRtGnA7O0Sv/AP2SmOsmOitbDPdqXiJ9JbBNf6ZgJe/Hp27/PttzDLgyO7J1J687hHnfrIPmc73V2rWjysRRP1t/tSLHEqQqAQv2ah3a0nGHkp00A7H7D0lEM06Sg4ju52J78oWLoPe2mXVIvpGwj2SzpOJuHjrafLeWVkOAuZ3N5XUGowY9Fd4602XvZEmwWpjmZbO70GPTtahOwcbjJ7oSc4uMJF0dY1zK6s29ABl1k/q0+1bk/yrrMXPa26SituDksfeUqonKROm8jjiuDjCER+AEc5NmapammCTa2m6FNwBZ/bjP8Plaw+x4N6+1tnbE0y+k5vH+wExC89BN4SbxTUxgkG/w3OaHl57c/TvPqMtNBDrV29+VPn1h/oOS0rwA7cTp8CIShejfwiPb0wIVvgwBLpYl80zLUl/DOutkkD+jmV2dEQAzE6vZq0iaMA4x/wb2g6nDMZqFUVZt1FmcPcUGBhZRFLUg2McAXKL7WWJdLniEAfa4CWLi3XFbZyBwAC6qnn1LVvyp1zDZHBoZMeje+nyoCZmmVKThiTrgPGsLxzDmQYRAMOnNs4rM+g2YL33GlJpDNRzF3u9CAnhusoZqRd22oKKMgBZDYUBX7aQuh0fP3C4krs2C3qW89jQRbkFqMVV26Ph1iWByY8nmyBqSkFMu9h395YcN38q5KE1V+1z7jDbbTAr4E1KVCHEYqCclWX5gqYLDpv2uZSOc+vYYSpNr0xMMXt0NPFVSb45r4F5A/UhGVNFMzxH2PvZdLQ5v/Jw3KG7vz+3K9UuzrmmzNTbEIjWzZzRoux2a3jbjo0Ah92VkbNrXVTg48Le9vxSgtCeFNZxcIUK/2wNV06TPmXUSxe2rZXQvg7BMimggYn6p6bY+vOdX3HpTm82dFwLDZGNimDhEeOg1i5eiFcIEyOe5alu0IVVcQoqaQ1BXg1QBpVDn9rrcpQ+xrXPsiYnb5CiCsQB7MlplUpzV4O4x9koGSdJjcKcf9+hHzcH+OGVxn5lUMRJMn/CIPtmPsDC+x6F/w/vTeoNtyfZ4MHO+KEWjbUwBANvn1yYUWeCnOOHlsfsYzZRSPHOvkTizSN2+BbZI0p6q1UoYlCq8KfsipPEd8drRxB+UPwFZhLIsosn4/Rb1KxvQSv65pVGzDg3qQGUimzyQ/XcKEdqDdhKXfry/3+AoTn2gaEQWgaKNBbEeCTUSB3zmgGVKmum7xOnR9AqnIAyLLovY0+peJr3pLMOAR+DrPLSnJds7QJy+Us0s6WkHT1d5KC3ufbv+oHC9A5ABTEPwidYSDcQKF2GFUZk0SZJKxLOwnmKjcQ5kxu7idtAuNWvMedg5Q1JMCBjxyHOEOSjzAFIB4WIg5cFZ5AeB0XpIXpOndm0riAXP8bseXxhfe+2nFZVby4quqRkae635syBVKzVKzIuqqC7pixcnTDpS+b+TNdd7ArM9ttsP48SlUooU8IQlvoGtxA3XUpYiEv6vy6oRrY4+B1BJzF5RonyFgutAlW4UidkDJ8G3N5hvUsbZirL5bsx9s5b+hUVv72nL3706k1TTDQq1eJhuH6qhjxWMyNmdpnxQcm4Gw3JcvW65yikhzRDDPxiyUGg6xNd5ua99fOzhmNMXn9FWoqT5UgHZ7wfK+uefsQKAZBAS45psAwXzkxQcYL1GF6H3NU2qGY+rtMnwHXBL/wnE1tuj4kOnaenvk9JnRCZSJaLmbSOw09SmfhQ85vFHZ7hqmLmN/PhspBLEyj9oDD8EI8n6jLyE40x0gwX4+kQX1tYVLabPb8VenjYkZcY8E+TfLWy8DwZTZy9RjOAg1gjKqanLnEpbheHesbcIpUq7f9D73oYeWNYlshipmt3Qnrg8Zb0CQKJeqdRBRxTYE5N2g0sNlgkKrqXAlH57YH8AYnl6FqExNGUe92BnC9vN2oO7QgBd1NOfTxId15MX57RxJaVGcoynzsHK9lutLZUyX9K3iPOt9MrUtd/2oRA9YLgSYqc8lJGvyqOSv23IiLosP6hZsjKyHZk69VHL4Tl9RzRG+3eBEYCLjBqWr4h2z9XT9NrIbLSusoqfANMAe/5mN6OYJvHApq05c+q5Mz6y9EEHmp+McxaXTLZEmYFAJCTbO3KURS8bBLXuHOAilOem1D2efi4BmlD/obGfO6CZe1bVxF/Y4Dw4EPJL2Az/g5BRC316u7byXTjuiL0y0Mq10sJU/aAqJHgsxT0ubxezSN1zP6dpWanaPaQ4mf9JSNKcE5s/2F6QkocYBEyxK05E31li98rlSLMfYVJnU4y+/cJ4hBXlWIolguB0AhUu0AD6mP4d0v+4OcFRirjSxFnodqljyTYDCxtf/pxFzWLgRqJU+z8HPdvG0rl8wro31gz+J3LVIhDAFOj06nUqR9KM6jTlXtrWx1pZWBAhouD5mM0T4mKPOlU4x+4pg1IFH5CBRFov8iKDsL9G2q/ed4bt/fS/uLp/ge6Bwuk1Z/RZx2AZivn9ZqrT6qyivY7rO6AepAQU3GiWnPEpNuiZbnFSQX9HYrm8YF+VR18uGFEqZEBFziH7XOW0Llu/9sAEAXD9gHSQJromuq05CZvwzmm1ZB6lQsqVf9D4tCzn/On3wOiheGe3QA7+ipacXEj6z8ZsDwdypsktuj2dxhd73pMZCtmL6z9SUVX55PTVgBIk/l+Isv4LVm/SdmZDoGsOxRuXv40ceOkgtoexSDQRsmGzlsqcgLaS9X/Q9CO0oTZcPl1u6PFCVE+cstHMEqsFBR4YZU7RtnTWx04tExseaYLncdq4Lkv1U40gk6pKrP+1Ea4xoEoDf+WqttSHVKW87boCzCjpRb6oxRxKuOCtIvfbkAKJ0RMzHHrGsGhqo2mvSQ67SkUww+qY2jZJHIYE6BkxEhkC6xtxqKkWfEvGdyPxwiqtcd4tAmmoCpSNezWkDlOz01hP+iVITpskClSs9T6xe6wMCSWuHu20VoM1rOyx0V+MIT4c1CyDxUKdmA0jAB71hInsoreWqukOhl7V+z4DQ/tCj+BJCiQD0f5/fqIy1qqAs/yBntbM+QSnmWMpG+88w+UcWXg/plmXUN5LH6mVcY1PkDeW5nvVS1ZVcwyTTnfRlKWPLklsK+Rgp12PZQTQYTjE8JQOwIYPxMmEwJwbL8uRODC8Kjle4U9Hd/ApJTe8CWWpCqMJ1g9PtjH1ojiuuz/E0Q4q8ofvRSHnaIVW9Zpya1SjaJ7vLoJETCPsGgza30l+cUXMVVvPEp39wXV3mgRSeGoBloEJu/UcK0Nj20j76Gk/ioz+OwPz4UkylcyLocFpqCTTTuhStFEooseLOdS8vx0aiEU+JFDfEIBd1ZSxHXzS3kicjMd4lH39ea9txS/o4Uh7yL4EihVI1hOZuoyH8UatYqz7m9KFSMyj8mVTfR7HRFziL3qSA1KHV+SLxvaNvGReBS38r2v9XOI2dHhDVLxUPJ7Q4MVVXhlDhQrDIqqqAXnJupv/B0fY2CioTArK4drB/nO+sIjO6RtWQzaLL7W8brGREWpYqERC9LvEbay2D7sIG4W8L4rkzJv72Uym99UjlgADn/ewIWoomB8H2HbjE9cQd6SPRSZixF8iW4gn71+Ae8LiPIxhx/dFi4WcekleaSRlGH4rUiabAom+oTYHnhyvbIdjMgx9y7dAz0KKqkIeKGKUph3LbbHQNaGPnJLQvX4UM2xqJEkejeVuaL0MdsiFhy/Bf2VP3AtlPBr4TuVzVwHIJCjhGeuRX6eMYwILlEPsGblagWPsOLRaIepiH75iwJE86UZHClqI2CG5iH6nHsH7PszCHIOBewH0sLhXhBBUVM1A7J15ggSWbqjjR9LONcz1IsUhWHWbA7KVa/iKWk55W/X3ZYF8pGdgGLAJx17VnA16JDuWor6nJZxnn6q3Hi+TzrscYlgQlpSr38kpgbPc94/2bKtpVTYdIDRz6fSPX1sW9C9ZINqZtYl2FlpofquBm1JZbxXY8nEpJdypc/omzU7Uu3bGhzI//ZiH2fbuBftPDX0pX7IyqVwOa1DjBR2wVWM79ttvo0/Ngx1Zf0r0JqgAzxef1FlQn7I5yy0/JzSe31kQwpUs/UaDjbB0cgjjokZ9Rg9lcow4i3WRXTtyyHReomJ1NZJVHDPUiuyy6zBpnSf21Lq9bqtBJ0uXvzxqwQEbl4oJ97tjVcZ6Pq4It4rUuXqagr5znWyvW7Fow3bl7paEiBysD+tu0vYLn4TryDGxvjcp7bosFXpXYkNL9kJdwU+pZE2zarFDVwZFXNDcH/oGoad9fS8AZe0+1Zl7H5noVUgIYu1kUdnXlIg+e1W9kw9ZsNgcLalI2ifUPu4/chS7FeEv108Kcy9Fl4AqSnIf+sVGcrlG/e4u+hqYAqNTOSmFtcOLjB++utWozyAreOAElVKfAzjSJtG4etdSchR580sADyNDx7w64FzVwkWF6qfDEI8lU7jkL6huUktbOIJgcKW6NatTD3Mmpn4b9SD81Tl0PRohAn+uRoRiXBcSSLiqgSbBilzn5CJGjA7Ok919aGZ+flhuP7y6/irj6/oX4SLTLx8lGzlPQarN/nx6vxY3T9rHOPgeqWBUHkNGgA4CLLAMmzrRDHA2xbw0H946x+hfEIEvd0errClMF/cGyQXmwFu/C7H6EsxFt9ny27CZxJMZCUIqKt381ynsZQ4H9eWn2Gnz5z7Fi+hha4rMO2HATh/aSCzEsBjXoASAAB8V8+Ll9I00lsn7JT5KH2Yp+Hk+tsksE15j6WBObW5jqI+9XC55IcgNENp4YFw9zzPBEmGHjrQedjyoz/H+LWNWJl+oRUrVlQUisX6KhZTx/nxH0chJ2dStaJwn7yiMyZTUF+5d7bbl1RjlY94AdQoJjP7Flq5BEDnYpr0JlYHm/J0bfQMclXDRCJwkgkM9YTkt8FgjE0kiN+zL7VSnCeErPBIO5TlRUaEBhB8tYBkt6l56/OfWCeLI3An93CBVQU6GaFc8HKeAvPW3BceT67JDAufs3ViqQL3O4ji6wpRuxXBEF/Xh3NrVNi+LYCpOPVoitR8KTIVE3liKYw+lvqdD4Jl0ezpPerwJ2ws/9xXA1x3JePFBqZQL9wNrBk/e6ETJlEQz0QlZPw8EI2pNEh+yFde2JeIM5XZ+7NiP4uVxNwhCBLveCV0Gy2+KgPCpEFORnhcrPc71DAdNrn+AxLIBe20VT1lbf5a4FgXrjKXc946iN8bvup2zgNrYnv56Xr6/fYPLxb+v2/EqfAwRv7sybYN0acJEqafjIhgb0l30fSKVBEEfnX7axFoD+3Br7Hx0STV+f+uMBULkQz+iclRIEFb5pXGS+6rnpfxcMqHefjDBLkOhVgjRU1c3Vd/nJwBQkXjdF7CHG5hvFCxMrT6LUrzpmImF4+Ku/vL1sjxg17ebfIjuoy66Rh6tEKAz+XNrkyI4z1ySHxWKQVTOG04279JdPEDgbbHXsY7JUY5IauQvbWyiUQhpYRhCctq6qOOT+Xfwqksp8g4//LRJgvwfRneochOxso/V/kqBByI+AuTLpmFksw7uQ6qb7V3hhXX1HZ0RX3P4wAQ2bowT6Z/ezsEDbeqixa+ZQM9vgYjf9tgrL1bqIWEmh1w5Fm+On+MKCt6PPYp9qTJbyC3HgQyyxuAg/AKQHMk2S6OkqaZupAYRIqwbAecOwYqv5pz+5qgl4TT3hJlLunj7g12BPjSFWuFuhMlGUYTRzaE30uRpsH5T/hkGPeNQvI5kyrTKbogX/WghlzJhK0cp/Z+GxfvDXaWAI4+NnlRFHZl+3vRcXGawoURm+vveZoFGMN2D4GI0Hb7QRqaFNXT98ITS1Npai8nsdSmXSj4m+yCDi3nrjhLW0QGsjbUNEAkLfxifQCaoinuKbn3rK9xAhEqHhWnq0cA+5Q2JwELQJeaCGroajEiAh/0UqPKncv9Ff1YjZzDkuyyZAxVrq2YwB+wH5uX1vTZaiA1zHglRQMd3ipecWQmht6tXjyziUHwDYeBGdGrFtxKveOj8LqOr5GemZFxZ0ADyjQX2VvMBpPBKazY9p0U5QkGcC7D95uvOEaoVzeD7wCYChM9ldjr9aL7ht+rAn7LMjwJ/9F/eDDqlEveT1ZjSOvM3NpRh2av4Wz/ZtQFSf4NkWgqzQdpBiDizTfA82+WNuAIrZLUewqDGIA+BBl26IPtaB4ECh+L+gmo0RJyzkIHlrrfKvfj6NkEvjyjM+rs4pu0SgAMrBt/mY0V/WSPjR84RsG2cS5XcGyBPtck4p8cFE6YHwnwcSfOvnw2AF8w+510DFbNLryZu5S4TRiiX4qQMqHYiq6cCKImy5YAuwNtXH+TdF3IF3PTLj/Ng0pk4kvwuiD8g6SfggOpsUhR6qlbNAURi04Gzra2+3yRJhXqbjKUIiTCNroWSH4d3s9dBJC6DvXq1K2QO/SMMIJ36W4AKIvo0MV1opQDOACbsSZJjQ3s+9gv4NdnxIVQ+yb9Ki8iu7AJB1sNfzR6VaLH+ddAX1RBq9vu5ttSl0jOhXplrHl9T/qF1JYv80uX8qybwWYZrgIhIO9jvJW6DTcjMICVyHks36I5lP8qsyEGl3yRn3a3k58Ge0J8nNyw1VT6JGRHe6iMYmr2uUJoG3jxnwl/5iOBAh8LrVO/+Y5dXa2ev3SAY6OvoEcv6v8kjNm8ewbSmp8TJ8vLKDGClzLy/S1khZJJc8617ppFYvQhb85bEu/WQywmTa7p6gDXj22e6xhoUo6wyngs8WWgvydR1gEtWSh1bY2ox6YYVDggdpthcpY8sBXSzYoxkCJf0pLcV4GTJcRBVWtGAHu7Zhx8ogOAeqH7fvMixwegpn6VYVWxiw0fHDQC71x/qSVh1np6x4dMSHpJbeju7KXckginXYu4JCACVbg9xil2TUifiS7ze7LRbGzIwvpUVIlF7fzMv7eQHfDtqoWACaRbD8Oq1n3fZF2CPNYxkDFwLFeCdRR7bj6lb3CIy7xImbUGBHFakPbTK518/s+VPQ+s3owNVE35yvEDAgvuVHkJamB7/MZrSIDEqedkQ/RWfGqDl7LbQCCmgcRNxFS5wvzwTeufJY4dvPqVu37fb84DhyHJoMkmS26pqbQJFwuEMv7w63F10VTtoOk5Vz7/RQ85HenDyahNWtUmSao/nnoHPUc4kV2+ASTeFPas3VJtvVFFancaXWQoPRi7upB/3BY//rqwha8rurgbH5sNJDTz5UbfRxB84HqmMRSpZ1hC2Kq5TK5f4hYUNrnGhNB9CKa3jZYRceFBcuMUafQLAZRqVX1DukxKQZ2VPKTRuSJyVBFZZs9/R/YfXMHP1o5qU9oVHa9Iw/KcYjWjlkT0nqwxyB7TI2fpxsrBcbLIUbSGBBriTj6QzcDfIhibjWgYKcLXNTT40WCyqSJ27wjOC1uiogN68LhNync8BPlh1f53V2CWdtWOxkOX++tYYHOQWMwRFKOmjp/OtISyyBVTBHHXiFlTZYMPV18cEu0FvXa+9ZUrMvfxs+92OnGkLzUkHa94rgfOELoiprijp4qKKKca/Mym5lLvTMCFowySRe4zIB59s2z6cCIIoVhG6REv4BoLGX46//LkFC1hFxPeUwGLwKAF5oNuT0qMTQCOuqsF8TXLoeOFWyEpV9ujaFfgcZbbQ2CgCNzpgGrGPMTbQORtEhbG5d6SJsHG/UevPevwHidrWoIC2/U5EJecPv0ibBCv3ih3siO5Neqnr7S3s+9PtFpjzJaleRhPgEL44OByj8iyAiccNoyNZ/AsWftx5brccqlwLB21+zrhAPq2NKXC0SL1F30gyND0hrMBKPl/5hmyYHiYNtk1GDXzagBKCCVVYVrBaVMGbC57l6Muu0Lr6itxEWPrRbs6cISqYD3XVEsUk/oldogNxSnC9dJ1IOXfZdeS5XVpGn5ZE9a068+OgL9pAhR35Kmw8KzQ0djuOiOYrSAj/HtUJfZLWH1a4eoj4ioEPoRFBESYCiQFUXFixqqX/+fUM73Zv0KlAWbjeJVR8dl/T0x/5WSB1uY1TaN57KUFW95rLRg6tgEUD3v4vMzP9KVcYonlYXqtn4Z9AyvYWzsIkcbpRpH+2vEHEvtycCXBCu991QJZmFBVQCD6R9JEuQIhlWzmm9Ry/ziQ7dW813EIC+4T+yfA6SyxrnF/7r6ar3VV0R5W/pH18CWVagcDuATSrRXIM/5ulY+3BGlbKg5rTVmfJEKivjlXFdhGPiYAffnluMTQ+7CdiZh8joTuvVA/hsU25lmFrajAymIn0ysuDeCQHA2Uo0jVs42kk0aMqwU7omHO92vuEosd6JH6nGKdl0VHEXnADg5d22TGccPD9WzHvTamE+84YmjUwKSIwXD5kIJZ3uT6rvto4iwATXc1mHHNeGxkuIXhwr++3wLHrVTDMyJqZlZ97Dwc7Bw3XdkgyM/fx+UYhs5GMHlu59Js64YrxLi+HIeE3KhcbradpSOvYoJx7Teif4fNSyVWXW5X5+kXANwICDeDZXaVJsqBvIHtaJMOrCL1dy1VC2P/vFg6DmJv35U8eTYHurt8dGygwG7B0TpUXq3cXP2nJBhj8v52HV+4TltMkpsmKCnOKQFqvUXfw1a6IfKwiJXGvjvOJSowGzyQqXdC5YD2NLnzFlkCV9/NmtXBxCIhFThCU057N9JTq5m5HqKlVEV2QsjfwqN11BUJNOEd9jjoyWbzTvqGtg/1RvNhMJWa253JqJgCxrvHGJ9RB1GdOLiqbkcRBtS4Vj9JNJbAvk24r7xW9E4WG9rf82yVc+3gsbp8g7lXDwy52sPD1wCIeaXDRcAm3pR1/csy1Fc89VuE7E+mQDhQWqhUCvAuRzempbuWtdPMnVJUVV91VXvgusJ8k53Q1CirMJJ2/+/0A9M4QGZD+kj/PoE06cNaOFobPQjfAjXWmVgiyi4Vv0tX5hJNFzZcPrNCW6mgsiBXJggaqtob9pf/cnfS4n0Kih0hdw3MmbiVhTQo93EkaaVJ5TeDAraJoMhhpL9ER+oVDaYZfZ831WyzcM27UUKqw0n82Uv4/TdUS4rGC5Ue/h2CFAAU2JX/iDhoxEz4woGhMxRB9+uHp1wcuGQ7m0ok42ZcQzdZlvGmMOdB4UlzMfNDqM4dlT9bZK1npJnQfzKAWw7Xksc9oR5xsrBtUh91R0JkiYrPHxD6mvLLpiyr2tfCrhEGGL20c30cbYrK58jOO/1meMliPQfdKLTOxjyh8eaazyteoYSrkiKY/KeKtyWplPkAJ7Q0j5qgACk8yYgZpNzp9KsojfpsHgbMS3oLYvgdrcp1Vnhqg8DE1M/FRogboc0fLq+54Mk/LN3Ls1ZhBYvt0S79doR7D02rq5i0sNO948mxf6PURRp/hQcNsJmsxzAtod95RM1vq5vzibrgH6IDIWBDnU1csbjwC2XRABRRR5tPUtXk1SWyWKdq2zeBubZfsYuiOb2MgEDHaLdxqr3GdRJCmR6f2X4cxzhbtZ5tuG2PrOiV9W1Hl8Fe9rxxoN1Fr309CG9+jYmIzXa+ZDQWJPEva23ndm6ry6ZxD2Vhs/xXewZWyU0NkM+w41T2MsC/gGDL+r/DcjxsdhWUtuH82Im8BxJ6LionFT0zb2h+fR8liEuZRipQksfh/6XjIiPMa7eKQyvBcKbn3ONJQxqOszIf6rgl9nm8ydWLkOapgGgNjDQIffFLFb1CZirlR1v/GWZNXBQq741+MIQQ9y9/qKmJLgHVVy3W8h/H/LKUXR84Zl/bYqkm49UflAKDG0tIfbhxIXFx9jYP+NdCFDLTFPN6z8ogmX4EE02qMNRtO3/h8pyUF9kW7YYcpmCiXX4chSwelneWoJYUIyPhQjaDvjzNldIL636cGbex+r34PVmvOerB3CFGN+8+MMsOIGa03jkPBd9E1xoOb2mgx3urf8kAgRwSozD1kJmOb1wxRcNG3+P6M+jlNHGSSokvDV0D9akO0dWPmKO9f2RhNSmbyxkqJV0nVFnGAMiI1w4CnQ4skTDTp+gdKUDDrXw0XQziDVAIpRnBrJ/4LzGkj+Q6y9CucT/2qwvMeoYk2xAtmm/qdFh5HPmjoJrRLHYTMP5AooxPeJAaumdzoB1fOU/gEPCwUghZmnb60PPgFeY6wqGBCRQ4yHMqwosDw78rxi1NGW9VQSA7OvBXHmORx2ILvntzYILCWTK4Rwn70X2XMjEF32DNeTQBCxzrfuM7Sbk9odSY7YogPEYG0WFBaBaw7l/jxClH6PVibPe7uCzbF8gbOE+A0ztLAlsZtJrvuUGDx02IMTRdHnKkAnofcbJuwQa8cukyKtFEyRNNc5MwoZLX/UwtLFOCsZ6eqR4c41ngzaD0SGXrTKTfiNjGwNd3EiGxFZsP/0dHRmiIWASLOlYYnOrW99te9LTQDzPE+VxXjdT/+Txar92JQgdpWaIH93+n0YTs6xI87oqLnHQJp6CXDXob3OB63i4GBtK85gHnWWQXIk4pUNQZvV+U7rVR3m6bZ/czHRndjQidJprJhVsshQ+v9jaqYRGekcpAWWeilYlvbHp/1GaVD2HCLKANAeavgRQ5PDuhsZwEAYi26l53ZaaDVRrgSxp8/DemNPSHy3JoGWks1O9mkBTU6ms3y2VRGA3yfJIftCAAIkac9NePv4wsBjRMaEkeynjDI6MKuXOXplomnuX760Ja/Bj4j/c24+89Q1m5DzuSxbt7mQmq+cIVVSoBGVa6/wvMCPGctd1JRM6ExHgb/vDWLs876Rp2Z8O9f9Kh0cff/E1vB+g2WL4W2tAGZU69432PMxBL0haSqcEgxioRTca5q6aML/0dgGm7fG3is2Y64KFSrHw64s+O5Q+gg9Qu6N/15AiifEisFHqhSEWL/j/PREJJb0SZt0+FKhrx6EzopM5Tz7z3I/0dwo7Z+5TDPl7oCpe2eS8VN+FwyoxXGNGBUvyN7X6BmcYwHfKiK698hxLgeZAHOXZzXtfY5ZJwnUv/htrMRNj3cZ7emmnIFjJe5tFnojVU+7OPVz8E8Q+LU7kNFARiAsGbHhzCgbKA/Z1cxnpX3+z17iJn+hU19UN5VZHPffCqxOYFByd19flq9lU7cE14EQ8m18jYzj2ImpsvMj43KUA98kp/vQa4Nr8aUWII7S5l9P8TwcLJY4Cq2slyR8fLheewmr4Q9+6QJKU707sqsHGPXupIUHvt5FEgdZPFuqmFMlONivviLpAWfW3PBSkZn3Ktae4KHRev55fiT4NsVCVCWH2busBTMgXudBytH03E3beTwkYD5vqp417EpPNUePwsb5ztPiu/dj2BMcmKF87hxHsAJ3GLcOUFjg5+NgAKnn3ld4Pp/+y0uYxPB4bT6AqAh7eDKN74WXGSLjJ8B8Qh6VhvrhONgbrJkbfR9fL6eCkvULuFxX0E0+2wI5Tly2XIPHgJIT15ISzUQw7eTYMseAVBmTdwNrbFF34gs7Fl38NV73lv3TTqhjpXYmmOlzo27FxGENK0+af2NGU51rB7YowmJ9uLkL+Vg23jQ+xt0q385ZMQy3RLrtZ8Tcq53SWV4DK/D+l9ZtrpN+2CYGG66TS2L617PcjF8DHGoftJNjx7xDYJ02w1ijCCYwCQD8acOlPibRzLbZxvhJawUcpADUQvaWrxkMivvP6eIpFccPeb4HsM6L0mCp+PGWQ3/llM5WkZIgU7wUXS4WVFM4o5CLfvcveXkxdafRJ8L0kaDSMR90YohTmc6MG7xjQmP8L8w+IjlkWadIqyX+R7RmqJTLzMiBnyjLr2p9lyA8RxOGqtc9NviWi1gODBU0JMU12m3oLRfJNUxF9K58uD0f1TzAc8NLrnwYpYaJQeV5gmIdg0nUZLMEW9pc4mu/+uDEk+F7cZqxgYfTwDvVv7PQFhxUtq4Ay3PFsPNhIpqHDIBN0q/53+CpkYxuVhmknwoqc0y91QyVoeM9zWCLjV+RXUGtolJyPxGu0YTD4l8wkOLTBURl42nIRbw5iUKTVzm4Sotw5M+jhZ29iGmx3smHlqH5xTlyouhfGiPWBEhYAm6kzCST1d9UawdLA0DG+2e6UdV8hdT9XPxErhaubAeTg0CC7LLYuAjx9e55RSuukCSRGGJduBPZf4c5/v4RRiDbGffUps3hQQ9eaoE90nMN5qZneHPo/X3h2s1RpAIyg14dwbH5gsbP4O0lSoYLdTpAE6buZGsdyzC5HJFb+RSoN63teWjYma6qnAWkq61SaIHGqQ/ng0u2dW/qQEoxlhXUlXw2iThjv+cQtN6Nv5rbLb1K/4JeKa6Lsq+lTfE/xfmSI9Wfr2U2mxdB5vkzxbrivKhe9rFHj1FrkV7IcM7vDYjN1Hy6xKTrpq85r2WA0bii4/YElkx54bw7qSaY8U7IYPSgJ5pnnrdId24Cs3p5poX5Q2CSTaY1r9i6jsTdazrCXvOiRQ2rwQm0kWDzJj8UXy+bq8ju+3LR72PgcIlJL8ejVlu4667Cf3SLN7hKTmfm+Bnt0DnLx1hpQd4m18ZwdoRihYKsKqap0EvvVfxP1K13yAzwhOarF2DvzWdvxN6jypFBMkJJW/BNtawXcsxemwvP+AJbqDl1fwsm4MvT9UHwRI1AFeg5VP8FylGqQhgt8zCa3zIly1Xeh2K9tD/yatXHJSosCf+j0jk+gLAyBYANfrg0rNEkJAG59MOTDSIiNl7oVTHFKczTsSG0fCshOrkrARDJ68yHB40ZKsYlsj8VO+SFSNfWNLUZwuy0LpcWfiheHDiEnEm+7vL3e6J4fMtMqrgPweHXr0iHgmjPzG2TQsHtDxMx6zr1Zmq9hwidIVTS4wgADCheLO4d3PwmConxCoOslSrL0IqbIwQXcKTE8w6A3psGveUzFh6rnVA2BJnUf6ztsiE8M9zNsjbiBO5VxELfjUseMWP/mV9M/CUn7JuBvKnYXpLvApxo/fpQbJLz5GsLxep8tMuVToY2yjRAMYbcA3PGBnpGy2mneCdpRUUE0ZCQgsgqdg6Tsgz7+SHsGxffuW9/DvHwv7VC5pDeE0vBmgEZdEAasHX0OwKI+ins0PMHUqKJwAp2vwM+UhjxALAFu2GkxGqFVJnkHoDEJeLJ1Nb2lZC8qdnm6tb2a+ej3BAWvOl5xai55UtXi99kCJEOve2HJB0rEz4CB9IbbnwiefMhBNBQW81noVySXDnrkIB5pBiuK8GUhY44cWeVHQaFFbwENGDTFpz3300KVBUph6KhoSQmMJYDm/QtXcxr9kAvbaCbSYhw8ektitNu4J7x4KjBMF5KjANNUCnLVKUZhPyuuiayO8CzLhcK7ChpKLqk5TZap8iewhW4x5droFjn51rhpdqne6GVBZZB2FgdZMLb6zzI7hM2kxgZ8/czHyVAEl3KXZVGHoqs0nQnlDbseDTTa2NCMbq+8BCNwn/Ksb7r4WTQK0YO3J8JulBHkHsNsD48rkqtAOnqeVZxiW2BZ8b1iWKCxiTN9i3ngviLxugkjjaGQ9UteicoxrpTFlHhVIw+K9j5RQNfy2RVr4vttaM6p68ujB8Sw0bUApTr0jH8/FAXbgo0XdldG43xha0+OGwO+mmptLKSkz00LCizMUvyE6BkUVH4r7AYAzIR9edO1hsqXPiNB1M04qdLmWmrOUZIv6b6nIw+54Y79xQuSBBWjxuiboVZp3+n0riVfninuds+YuKGZaPpnlOHOvYDzHOWCtH51hfQi0m/pNykM7g+TX5vAgkBboE06ijg1Riypqv/COO5n+JAoiq4YMnvjg1D35WAp5/WsDHVCMLDbIY8e8L4oRJ6nXPdqMYwkSNy0Vcf7/ZfelpYSIQ7qUPROD33jhzVSnsrfB8DNZ7UZctB1SFW5CRRJ4ipUyWeXOATjOXwcQJBBNxBo6n8geGcJoTBCTvbBMICtBelhpcKXllaOExAeXpZ2JFtLUsmOqJXebdkNxJd6gJIMLrQtFccUn/33PxWH023R3c15Y9vRRTl5Y76SzaHEvrnwyGFHqtEIgGV6IYslMLzu6R2MtTkrs5cXy7/uS2HjIsg6WzVhkCpUJPPoEZnw38Ki4f0mTv5XZ9lbmGqOZsPN+TLBn6SZBDbtOgJyZ4m0W1XscXAjOVqgNMbHQzQ5mu6tH+PgamsqWD5oeIs1HCABZvfeyub0CLN1UrXE/QoDOPpmgFgcbUzuUIEw66wxD7sVrZMaDN+5Fk07u0fA34j09RgyBE3vPkTasqz3R85aKAYuOjFo7jr+TFDqJbIhx/+IxVL7o1vogD1Lz2f2vU6FQkWZzU2z8HegLlXnvVt05bjd4OKb0h3mrsqJf9TkAfU37XNAH6oBwv3xBPXm/ru6epiwhOIfJjtfWkEE1PQJanNXYy3eVPKdB5EftGQ1m1PU1E/PQQcO23Wn8RgsG5rGQ+7oRBmc9tswh+OyRFNnznZo3u6zOtZrnw0SvwdJ50qbM3W/Ocnur4DeCK4KxroSSW5pClloAn4JmJqJ0H2TTr96Kw1M/RDB3W4Yz0QTgqP7BF8vT5dUo+yqqEM7mybtNDFThwbPs1oy9fuddKh88cFvGSoiQ+TkcxNt5aZqFa4482fTNtmEip+DhLmKL1QLIV6XD0vLGWvBGrtg3InjHTaiD21hnO3UduBA9AmL+Y+tR7TSgapl1i041mNsQYtHj6BUuz0ZmT5e8E9fox7JXQMCwTE/9HIvPfGBW2Z+dDa6AIAWr20nrlo9vCsUi/YEX2Og3ZBj5UZq3bYyS+UfyprqbQXTNCfglJBOybf6TuZaE1QNmwSR3bZrCeIEvnY5Wj7scF0h500c4gDulAVLJzkLy2unvNJm0eyso4TZvhKzJ37+MF32s8cWOygUp9DB6nGJDIwE6bnfHtiWOFhVytP5E59e7zk80Ph0J7jFSVju7KsgQ1TTgEvOABAHCoPHXNiPELJPVje6Oa16xOhIyKWY3cbTd/w3+dpN1geSdOrMhWFQ1CTwnnQ+TSbq67X7rO0eJsxr8jU9uVArclxlLXS2Wq0XqFIpnKGKNhWZVThg6LFjkVJw9iGdVxLN2cqdsbEFWm3Opkf+wfPMCc0lV1sL/QtQvD2wV++cNH1YW3mWpcio5r5sNSkYOXwCheY3y/sdy3v+SJV/e//r6eZ1eLnHl1BM/980epdjzMXAgJRw0t/ZXM6AxmytGWJF6LBxgr+TjjpjnLZCJMFCxjmrpJpqaXnhnKzcyhTM5NrL2htqvOMirMWYKzohBAoKN++7LiRB6Ve8hEHdvjuH5hjBMdHwucyEWWpid+PtDXPF+pUyqaGq4+ikZnbiyvzJyd/pYhX8DH9Bv5ZKmrljswmmW9OjkPBcZd6KpjdVxRyXbYbfYEjBEogJuNSKsAc2L8PelWFnT3bLPg/z+JOfG6csJ1h58TSZft4H4H+m0RbDbvSWKUonrPN0soowbESQjlimA0u0YZKm+mCnjfdq6hPZ+nB8U1UZ3ISqzmdgvAMC9ItJc6imdWqdY1NNKklAixxHYNxAjJ1FhrCFTlmsQopI+TANML7hiB3ifFHcuszbLEF6jFpZdT1spq5c7nIrusWvC2mORtDIFcZhpRcKFANPqAlPPjgnKF5GkOYW/hZcKq5YKmMsuGc4ZMbHbSe1ATyNLOlnPkVvKMh/qyqofeYhSrNJiiz/np4jXOAFMea4yK3iY6EaGy0RF56l9/TPN+V1bcpKpr7s1DBuIiz70vAbJjH0iuUgEymNMbCJc1qZ5a9cCFSl+qaM2LzNPE3IN2pEiOubbQeho3/YaJArmmYS6nhv2lODshZt7BE51R7E2aU71qVC7TKqCcHNZTqQNTB+x6KgdMM+hCDowLOUqFxg7hvJeogwPOZHtfeug4fqQ3jRyHefkOrj9Tc8Q4IcSwdGA5pRUdZ4NL4FE6S4+3mJ6hi32HY5lMtwcczBww7FsBnwSDOiGyyeIdf7Srlh2d5LGF+Z6qvmc7Y3x0W0rCwFB/lNHkZp49bQijbU7ss2Tqed0+8Vx9x16aIMby/4upSVg7/LxUObFSEWRE79PlyLlobP8qDfcVczNs2+4d2Ild9lWevELAUwPzUDD5QINf1R8FvS9sel4KxjBejgLcmuWCSapdlhGTDacflzerCWUXtVQJC5cW+3z4eJms0kqjaMClskLA4A3Mu3atoPOdZ7TNHLkc59j50YVkV0cn7Wr2RtZ4rKA+La3N8V+at89YTs2YzVwgA2bnNEzb08FsHXfxgrRDB3CerKyBA+FBkeWTvepGnS2JvQb73UYjazUnEJ/TjtfpB8fb+MAj3PV10KC0l//1Z+3aMMJxbojwgkdIFm8eeR4NCc5goJpX22dFXedCwp030Gs4FuYrJtWrMMq7ydlg1cAn5Ts7tCu2zcWwbuAPnxyoGHsPcRn+DLpWCUHMmWDhhpmh/4Uzf04a/y8PgN9mmUUw0LN9k5VRoYb699KLB/4S6rLvtstUUQ7ZbljitAGtdJ/A7eGYt1IUX/U51IS0r3SJsJU7ofie3PZDo2nYYJwxTGVj/IoAwa3szBNWbvNk0aX78TybHaVmPJLgtBhMsaNZH1O9txMJe/eOi30e3LS0zLntgmtYxToNEptKvvARLngVX9yl7XkJ1niroe0dnDcP+0UK1n1dZRsE+ZH3goeCeIDXaWssO3P59oIH1Pb/lURUGfWqxMWVYv5u3onxoH+mR+3tB7ZOtrw9OHRqXbi2NDZSZ4I9Ju0wP0TGmA+3isM9mkCGPxmVtUHEVgymb8wSRUW4QXBq6Po+MsM89F7CaW8f6A0ugEcJV40ZS45Ant2Bazcs/WbrcegTMEIuFzn/Z5dubOgianr0GVkFon5OJ+w7YjfdpTQwlnkiyfV6VUJNcINaYknV7hk2GhHulZPct9nxx1Y653jRc8A8JC5fHi2o//7sAhaulGvLqZVyqhbeJoVxJBHjIDiiHFA/QtePS3Yq0vUtqiAA2A6ScvnjUkOHwi0nXfq/HFAwN5S0E/yQETqA+7ofVwzUnp9wKQZhTJGKlQ91UeXN/dl3KgniLnZocP0EjObr4PwY4A0LxVPb5WFYHKUuxLDXhTklGDqETzkQ2EviYwQMVc2wCfpbrpuOEGT5p+yA/9/2vjJsKt+cHPh73LyqSDWrtNzFw6B1qu0ByeyFBhZwQzXcYpwI8pmlftXC+/3JYbbiKcptxDjM5QB72Ed44/zwsmr0r80DF4ycuq4xc9aU9AIDsa9jqrbfHGg9/B0n3ooKOsLFKSpUog/IZzsek6AGkyNOPXIwXUQNaN74jNQlGUjjkIEx/RtXKQ2X1nZHlBAoQJv86SjFZ4cgrGHIZ1SqZWUVd25cn+qGQmZlV/TZpQDBvxgkBJebWWZeNDE2JvGuKkdFBCsQuQPUVwL+c8tpyLoLNnycSDcOzJNu2oKBMZ8g2cOVd4VB/zNZa3LLghUppJdR5FBkLMN4Q8KzHyCG4kwFNRkJfiBrDFLa1vYDg7a7al/CfmviE0d/ZmTauKC0EM727cMVAbl6AbsM8xwL/w6almp36SNWL2g+OgQjeFhaYjfHNdFggkmkmrxQPtaq03cQqWx3x598g3DeLGirC1plLoQ5E+CCL/T0nHicNvrgxEQqRV59M3uRCnlcCXfLFa5Dq/lZ/ojSQTfk7Byg2fxKPO9kNA0JJ9nxyEZKUz5NMGyVIVunwGFkOFHmR7Hacqx6THi2DPHgNgtUZ52bA6ps5+fHRC4dHYLa5HmOunW69+yaLI5J8GUghsvdBFKjZnhnMbutGoz3zIs1ZAMH4Z8DfXMciLHJxCx4NF7/ZAM+5EyvVjRMjTraI9AujmwkmAKy4u/oUbH64yOgaglL9QUvMal2TWp97fObXjcmWzYv15l05WRlAvzB6DUDgfb8A6mbaqTA7b3DrNHL9GoTDUQa2rqH9oswqD7IJsalSMpGAWhKA7H73h+BIGnDFcMZ/Ei9wN3L+1oP6ey+MxP4xUJq8syN0e3a6rauGPMofB/JjbBF41ZLqehSc1VLYldzRHZ8BGajzHTuxIhC5j4B6fWeUkJ1RCGWYb5R/gl1t/K0UALZd6xWyqa5vVYgmUt5HN9vWaPZg4ICuSOO5ZdvO/72a5vStCUkgu11QTpCySQAnb4AxOYee4F7qLKyR7tSbxiEs63bAE4uyxHpZjcKDqfJIEF2AAiE2moJ4L689OLQRmTSuiAI5H6QzX0H7U59hCFC3l72rb/Nry2j3jeUhjAfg6JSR9WmohPX4zOm34zfLivRoLUdLY3K9sOQgC5NIqLMQj92nFzDSh9xbk0Lzx9lAIlboyoyFvZVg/TF2857qEk77Stt2lbel6x4M+Spj+CNi7tYbxNAJqymuSZMPK4w8s0c9gjrzQnhVC36ylvAD9ZuW26+pQ2dSQXtF9eLtaHb/S2P8+fUCGj/Nd40cFxjBQfvzxCNKegXlqs03gXfRBv1/y1jw0U+RvSEaPgGPqL3kyr/9i945KCynjzWwWWjI2CsL6BrGg3exgo28rFSxM302Q/XEWuf7GLfcEo+7rTSb+MZvdUCTODQhfhYayVd4PhrYf07NEvTDfRPOPdC1MAwHoEfg6d1ayf98eX9vQKZqE1V0txEPTQndtDas7MlfW85Pr6ZeDGS8k7giqgDOREhYBrLQZp0ANlpPgs8Q4xBKeA6k5P5/8w/lc1+BhbLST1/QO8NyjC60jDfKOSzuzQjijfC0vbJsbrksTvh+obAWQxNA8VN34Q3faVTsE7Ts2A8kv19+T+yINpCrNb8KveNuef3HkjQAk4XM0RJu+Kp6T2Nm0q3TxRMGlED8/SSLanWgFJ/vizAF4rBTnsMarHjUG7US2JKJ6X3F/Xik62iToiC1wEkyHeLb5amNIunYvwNVWOwjvqQtGS3mYTXrMqHtHmPJljE5s6dd4rRapvxmejfAyVoIla/XFzbr/DXJOz4yBNkON+CjnuqNVTlGJbQuXO7lpPVIcLzy9YXol3Br3zaS3eDTORDNv9QELoe+MbS9prlih4I1J2uXxBbIPWWNBD16qRHjWgqhqDnOj3MlC4yYsw0fwdM8+VADFCKm1pkR0vEA2/bJDGuqS69US89pZ2zDl3G4wE8oqXg9E1xxfm1YQuPzi0KwnmpCdEFrcBqQrGaoPW2hbK/uRg0pyCtGWUfdkeBIX/kuEeaR01QDjqLPwCiJI4lt5dpJZnuvt5sdvPZynKRCvL37dFAwHlTDeIOiqPo/svDT1kwZc8yigVMRlTUCvWjbcpTGYoDNGU56LvwNgQ3eW9hwF/ERpFMlWoXzd0EXuYIRKUg1E3XPzI7HlNzjDy9oiMz79QMEYlqJ3ltHGpYlwNunf6ZTvFi7ZRw4+8cNaEohnBiXw9SIkAMeFCVMCxBlkj++vlEdkOhjP+GMRgwgkZTOTKo0fHJMxia6mY3ZfUJ1enuvInqGAKVhPhNBDI0ctlVBiIKfgAjrvDTQebWJYLm5IXibojsrZNa7UfGXTXtY1PFapav0PbL+o5I7BAAFj26eqHB6SarX1yPoOhnV8FbFnonZ87vvFgyV+FkcsPR5KB6LWSOahIr/djpq/bxliFFCAF5EHPPZDbK4ArHEi9LnPIQmAeXrn/NvoghHTYsLEmlZrSdFM/hbryI+SJsLRMr2OjEm31hV16+4jZbGyDamrWEjW26MDPTC9J9voLzDlxAkJgJIalk8FfVD2OVj3r4KkZtTBhvQSI55o211GcGqVaGojc454pE4NZww9V5nOlXThmiRabL/hucu/jWIW2y2ytO3q4f9sxyvhk/kqbMUr1SFIv8mfCGwxMXLcs5Dt+WdBN2j2W4/v3zXPySoUYE+CYYaF6byxuoHhBF7PkTMshttTTq6wDVxDRtgYpHXKUpGFhpiALBDX1w9OxjjOGHbOR7wXaxwwoApwYBuG6Sr0Ri0msibcKzAGX/Ng590/KscWiKcXI5JZsJt/4X+eSAPcBjAp5Q4PEOHYfHYboqwGAEYjHglCbh8uj6tXvQzxDL0n9wP+Pg34pvBirVE+Z4Gq1gDxZeKMEt9FtuUICB9fo+ufZJZOm/l9+PSvDYVebxB2Wfiu7rLe5RtnUWIPa08KALZ6vI+EwhnlU8BIUcq/HcX5YHK/ARxAbvk9OQbFFLB2RdMJ3Vg5jBeITNGLN1q0Hd9cbaB937730IUEO27ao7UsAEhOSubVFOaNaXUhNkRWbEXBQrd47ftDhT/7/I9SczBdNfcDM6dJ7ZbTpcAcJz/35SWXDYniTPL9CxHsL0iZz8YzJz89ssRZXGGM8zlHnN8tLDRLGrN75un80g2Of64bxsFY1UTPlcx806sPa3zSxIvweTQXUiFW0oHpPs9r057UbkkE32L1TezgSm6rTMiYYn/G+C042f8YwHo6qZGRZhABbMnVFsr7cxhq6nutry570T4ilkBvguKFd/3Up2shQKWb3OGt+dgoSzCc3AQuAbTK7tP5hPj/Ch6plODNnMgH29LsCSg8VKvj1KCmmShNoETVFHoI5MRLPROpFB8QjJtvRQflVJYSSxkGWZylf5ROvKVSWuJiACCO5d9C5CgDfgOvUTA34Qy3tBCh9uS1ohdF0/aujfQKIm8FYlyrOuXtxsNwR3NQY2jEio9+E3OvLrKPHuy9EmOoW1vVWTRGU/UhEMoYBqWI4nGBfx2dZ7eRbCcOmnIl2gDZtiYSw7m/vGZKSnEhYyfslDCnSxwvqiR/2bop1/f1uZgSEXt8YMpRqegWCp7NxXmoGFcV8GpWdYQI02FR5CyI3jow/g6SQYR0Y8uBXjaGNXay3tnjjulEeu5TKMgoU4h2RZ+JhUa/jWOioFNwKqmFfzb2NiXk6PjJoGq7qKvsVI43gk/1a6ssCHNwjEdYTHoFK+Bggw1y+ZZ2t3VcJxxZCwENZTttZypPRtFTH93ncLb2E3mKKvmCdjnf8WRyjgiyWlDLJ3vOcNl9Y76iNPXmAe6HOYJyLGO1wj5UyNgUy6EhNN1Neba6QHEgV8RCazlpS+4GVYslEhw5O/0x8Zz6+vrH9F66sYsJggcsviRssyrQ/vRz2DDxNRx9z5Egx8O3gF6/nW/PkbJlhq3i6HdCbPimbqK6RmQkFtDZTuWo8XUidzduUBks387uQ/CnKdkNFXLy3RDQJntw9VANp4FU05sP0IZFL8dg/riIJY+0RQ0hJOtgDVNBhi96G7NgQyRP2D7iVaYuWia7fKQLUqDuIfUOvAXzgLfsnxH8klpRtJ0NkCURSWWsVTD0C6PMqYvutbs2v/Y+PccVwA0o9frU3qH6mV850dTT7EcI4gTAybnfUFHanh5v8i0yZ3ETdnVOoeG9nPpsP/YC/kGIFur/RLoRHItAAxvopxpkqc0OGM+Zrdj/UlJwl3VvGurJked5MfeqO3ZnRdGFegycLdBB1AZnO8XnohKLg17wpeya3hlO+MdfmoTM5ORgAUYe+eh0mLc1LMkWMp+8nlmPill1KFOxkdxqN6udFvTSne8yrBa0KKhmYozXh/wVbYcuU/7eIWFiEW1E4C7FAk00DtTgs4fD7h8S0yHRn9UM7QHKBCQYuy3rXVLFZZKzhNvRYWs+qcLAC1Hp9VqieU+XjYSPsLAxFku6vLS+cMGYrkhA8kRXKLB+ZQgwPqDrIYcd/E8cVLKIQB2xul9gHfGfKeiJ/UQyTLLzNRwHPxATQXQubOXv3UlFizqs9wwi/FeISASZY6pg4Io+WhanYH7sMc0gHCvqgdJOG84E6qMW3QJYwibo+wtTzPNlWoddeUHXfKR1wxf5K1yGpg0XlN7+mwen6bVRHRgUiDeEav+CqCSyzELu6qt/Yuhbryc27F+kmG/TYF9j7zZ8+h4Dpg9J6/9zdFYDVolRuPHdwidhGPjSV3DUy6MHOBy1XznAN8RpiGcHeHTRUMqcnaILqhNZl/TWarUN0TsX3AevJAiLb/8Cfzm9zvF3LKgaRk38kd6l32FhR2cHImVsABTnJnLtJrrYwQ/pPLDNkx9azPTq9no0FPcYhLIVFXCw+w6sUKb4JZSJuKYupThxNshj6u8yGoy9zug50F3oNw26sCkM+QWCby0o7P1g4MKrWwmlJ4S0PYPwix7tEPn2DCF7BzrH9ZuNVwmZIEbU/TT2RXXGB6hXQ5nLvoFp9BXy1to3l3WXjHGBmC02XewFLHWP/9/qjcwlhmHdoMC43MTG3LWfTTOyGT9bquSn1b45zKRUx0ipDJIV5X/zk9dGwQrnA5ntGTYcSlb2Y+24ZBXbe3a84bxFedLkoHaiaUadsShYtJDauJVJ3v+CY9Wnt0cjsV7csj5nwtzosGyCc6y9VioAdsly8KUAM1bK4xJKCpMXNsTO0Z2/HtPkaJhz3kzWKxoPU4GlIMXLwTFVKsxNGUkRID6QR//ROvc3qlSXeUIlqHwwHTLHkNM8epLVAd0TgLRejtJnvibyMcfAsRKIScopvksmv0O0Yk2x7GRUyolJKNOOYku/EBX87CB2UKeZxqkirFuKktHtcApGCnCCFLMkjG9C/2nqTrQcxIB3VHPYm/MWtIpxFvG52zBiAmGmAIEXAVepeq6J+jJI/L5kwiGRNikiX/QdkLs0NJi+DzLsrn5HG1kO8N3Oc40eQA4dz6uY/Qvn/s46JsjQ5w1yTc6LU8b1fneqlrpvPmFuCEZWi2c0im1qriVM9LTZwRuGng5gOGtpkkUTkHyc/oCTdEa6M+Fjpsqw7UO99DPZWOgSm7pmLjQPjhwK5ecyqNObTTOotmyag5hz8Pf5ZFh/SAAqp/xo4/npBK5YG6Bim4FNbEyxG9z74t7SHfwJPfbdSzTAsju76bF6w00lPlRka3KOIG72hSEhWBabqkQ/Iu7gIBZmC3cmVBd+uqUrmjfAwBpUoHQqX2Z6By7QkDMGXmvkdnLHbJCwpreQb5aigHgdUdDTzsnwSZwLByY9CnxG5/b41KR+gOiLXKRIHkZEl+xwWciAdt4rR3NBr5QHuA2y/wtPXiEOt9tqSpnQ4EtSmQv0n2cOGsCRUF6MdFJTmKK89gGDlVSGdHDi/e+IWY4wvnYfMWHcxs7v5A39fG98bUtYOZlzOML1qsxpkOb2K2utriTgxBX64bY0pVa+arY39i+RunbOe2yukwvdUbFrBehnGu1ilMBLPkPPw09S0hQkZACl9oFzaUcW308tKXFVtChetQU7nTd+C7yfirElkD7gId6Ylwdo+vRVN/LLi/Jnyk4VWjVCdw8x6dvM3os3DrLpn7bOXXZi240QbZF028CMtDiTMA4a5IWpjmg2+QSTgZOcH3B7bxRVl9WhpRqBdkMOmLaiS2lRC2tb5FOUHXw6FYrlNcreB2JISkvGBT7MHDra57zFiXoBWRfK5bG+RYojOpmrgMTNd5Kab3QzqgO+Dcu2CbTNJImqWq8o2CMS2KDtN5Hq3ZYTg1OPG3cVDeC+Zo0a8QEbmxVuQCjnjGYo+ZlL8R1RJVCnF80b2lWOBqKXGDNt8iSsntXkpGAcQNok2mYCEviYzDUyHrfVvfPKqS+At17O5yfvlaaj3U39MyJwAZR//G9X4OWmNMn7FpG5oscycMcInLTanphyWIQKiPjYAOo0JZ6Pek8+KrU5k59pWMQdHzmZRh3RMe/beSMQZyea4PzrQ4XbAqfHMPNhoFIbj3K4HwchxDXGgJ5awGUY24vdygvOcExvO3pkfv7zCxmJDsVM4YMCmqwo+g+1kU95UGVBgjBBkZCQ0ZMUWKYnp/KdSpmpyD/VsiHKbBUwD5Iq0RnY3+bkRR+V7jtlM+MNK1lG78B+XDuwtpdScYm8iGl8RJc1b8b11ilX4QfrcPEk9o1jx83x//k4ab6JNASWC9jeoGjgzthTHqku1C7ZZTT8I7HsX0M/lZbEr3zuxjpbth0iXpmPx2MqptbIM36MhRaT410wjCtMwZKFhAKF1FE44hKP0XN5nrN4ab/uatLd99AiJpOUY2Xoo0XULGaM8wgt93BL1gP2cnqUohfDCMZbykHV1mu+7VC5MiWD1NXriZ12PLW+ychx+v2w8FoIjtInm2BM1HrUTeh230ul7b1ttkBoA4x6Cbv4DmE/K7WfjI3j0p/8YtEq70FgqpmLvXkE25t5AZJ146Ubw9jEKm+PI+QjLk9ExTiyGe2nZX5lu4L+pqF86rDXZ8tpUJ4YFNunl2c8M/Rxt2kKwYT8ggsSa5KfAQtF6LIYyfIeWd2ov3LMGwJvt/KIMepJZpTLekikHTjblVs6n47+mHew5K87RwPkOMIz53+y3uZQGLs0LuOrhg+EVee+fgiM2lOdCwJm/T4Xs8Rtb11iipre+a4Ft8KS8uufqTGhdl9XC4rCd0ABIS3B5R6leEYSfLmkVAG/V3vqV7i1zZ3pIqc3R8kRBgAnA6jMtukS03e17w67begGcsRFSgafjop50OM1X/GvdXjsDe6ibihIm9FQ/8W/Ar38YrHOE1deWE7o37VXUxu6au0QIUz2ClhoNpnGIGy+re1ylWYEzuNmho54aXrbkDC7LMv2r+jbidFhREsfw/2jyo6MG80qco1GcZR5/PSnLvy9efTiV3i+Xny0vXXSc3daECw7gIP0vdZoyqPHERoDSLBW5sdA46tVZ0FVGKCG7tMFDo4oFFcBFAhgcPdff1WlUL4p4S4rDf/f1u/fxEU7tMbPF7gsVDTWLWXkE0enlH6u/tLLrAIy4wHhGcDOju04OvILXhU3/VAy9jilK3GoeybjQIwFC9KV5awOipWU/I1RHbkGYlE13ntQExTmv4A2+LERZaSEv1c0eIvdaEfUouO2lCDedS5u0Mq9fWNCRGVNg9ZhD3VyX2Qc+IJIM4w6FAoL62PSu288u+8oK0OerNdYfmrKe4YZnIMWDjHtNmyFj6w5pJPVZAUigZgLy0AWdhyGLcG//qpGdsSz92CeCgVUsMFjaSci5ZQEIlMPk3p1oYlOivHC22aKEciktftQ7pxSjFD/zI0EmnmXRnLyx4sPKZlHa0oXKqB7RPKf+qei2vLiv3BwcKvW/5qeOuGOmyuE4SZa/sUCKa516LOwtxeJVcWu49SdX0/4xFQ6ZonPAJgYGX4OBYCXagx4W67dPZm0rk1bDbvW4ebjsKMs9i1AhNjkq5IbacMwH0A7LZbmKCpySyGXszJs20gWZP6TF10kycidGZyMIi8SVlP3H/ErtLr9Cv0zsD6fr7OvjdA3pLQkpIUNAR6gKxIpd5fUNMRnDz0BO6N0ONzykbBeCsJKKVanLvwg2Ci5q46H3eMtlexxlidEJdCqYrgE7gqMo7pLVikDbuLirRvEgCUInfpcyxDRxcgSrhzNwXfluVEmEnsDRlue6fC+UUhwMXWQNd+LsKD0DoiuMwCDhn26+6EzN+zDSfJpjibGuUHE4b4rJxGWVLzbUaLnqzPGi/qBSuVvYTOv1qNI1Xt+PVSL4dfEpqp4HXPGHGE89gr7pkS7aHwm/FgihS5Sn6rlcnryvCTx6Tuwjb2maUiWU2WSBMgSCzNev/09WjVVbXRi3eNpDoSGqEzc5K/9AVz0TnT1sIycn40tS8eaLtkvTqYx+aI292mYHPE+dspFV+oJPD4jJ6GU9Frjpuq7aCB3qhQ+1DuvfBR4uoR1azsvyXZL118Um1V+xGBfQasX0jqve6PRXJArI8wfL3crorCD2t8Bzldi/rNgu8td6BBYRCDFenK4Yzk33Whhc99pqKJsYsQYKROUxcGHQcgmqA3xzKppHF/1nQAWitEI2GDrnLfnk0GRZSNvqHEujgwQn76bTbKrmba2heZgqoQY7TrS5qP3jsQo/W1ko0Q4VUWug6E99wf5OgahcD06lDHk0kvuQgAoFbj0tiI7BOWcAXsYjZWZTgNJ+h6a25GeRtuX2NStxyYzqHohoITMBTUtT3q2XwJpRM1vgKd9XpbTl+/wFgPNtFjyUPINRGbCfSet5MHbEuLnc8ICeJug5Jc0LJtCjx7wFLNgW0trzhFlMz3ih1LVB/qJsyL1bT3qTCvstvLdQEn9JOXmDgW3OSfLiQ8ddNnrw2wEwyZeDadRXzSScReBGheu1W0nD++jA73aaSHNaqKHO93H9eIcpiUKjbJcRqZLdWPeIazdRCZxPCTlZMJoUFPHFSSpbe4C0OsISketM76fhwtaa67RVjrSnim3qvwVpkY+hmqgmBEHMbyPw/xJWPkUdpiIcuwN4JUIkCfB2IvtTeJeYut9ImH44jqYytDOE3qlpEShEDZ3G/A+rJT8jUC0VTuGyjt4uhaRxnKF/cRE7x8L4bePgAisRD4tEBINya+uYcB4F5NFofz0RUuGJyuhrYYtYuP3etIdQJcG5nFuccosxsKYcwLg6YvH9CJryqJ2MecXAN8p9XF/r66CRl3uZXtIzUXS7TK9NXQ9MA4ySGf/6LoliZYibn5zRMSJVXdhHUogz92PfyNm1tfQ86Rti1iLyryO5mNoDzjRTNMrNeizO8aI/+Vr1ofcI3hZur7JpHNqIs53ReF9/v5tyl1IuWo2RKFkrc9EIkwjDCAyWHh0t+RpUk892G2Q= \ No newline at end of file +U2FsdGVkX1/4DTixhxQcAYS2/Di/pqeu/nRpupkjBuWMNPyi+EU5+XagpDb3U95TieqHIklaFb+j7Pd6A/hz87xqpTZlaELG7sPTaVHcghitW2NbqKQn30ghp1jZ4YclXiBLaust5iT9CfGZ2Nd9XSNxgUPg/j+H0hWMgkpx4T28rB/RipRUgwwoPB2018E48E5b9Or55aZ2Ddh/zXXnOPFOghOn2+0XaLhyXKWHf/8/VPgGTzyvAdzwIC0C8dPCEuSgPoELY7nigHpX+9N3P5DHv1K3RlG4QfAF9tmgkXwuddsSCT1/4yQxhXSPTXG8dQ4HWa9aLFLCjVbqsnHFnLmd5TQt1PdzDo5uPlSS8OXVyRcs1ghtLfdhoVOJNYQIEW/vyfRuitHmvnZiQQiV10meueTUnmtsvBIdKOkbf9c/DB4muwQVuV/X5Y4Fhat6GrsqVsYT9NhKgKZdk6ohTb8RJz3CmjiNxYzKMF9q32DazDWIlaKEy4Z/aoHJshuxG/v9mHHs6K3Yx6hhMjUMAC+0BP+M+SVc5CpfJWP46cBtXeFLRHSC+XOyq/Rawe36QTF84pfZFMTd3H3ZqYDMMs55Ldsky51AyKLs9u5Onw6uzFKX8DmbSlO3ak0o65EBBe1TXadQHbzT/0wlWMt9pj2kcA+4AAl9wgqtXOLWR9dfSq7tZEz5U4iTd8kOi4OgeLHZqueH9rXF0YdTOgqJtsnbXKz91+EwkMfaTE8GrtpgaWYorN72j3DryFx2zMK/L2zUDV6XJEhRXb5udHxcrg+0l5EQgLfWjT92GGuomj2E20E0lUN02JRZHYQjH89w464cAy4kvFdJtmydYYNWp3olBwIb8tRGXifXgkFacFCXwOmtGIrUkwN6Gm1MOh0l0bS3suaQklqaTyzBAkAQMKNYKlenmXwgs23e3PNfe9SRKXmTDaH8ZikoWT10ur/G17O+p+73ufkYh8VbLUcSbDUtSuSCCipAyxxaJ5alhAXlFprEkkVNJb9jES/403KRcLVxk/8i9Yym7ftBxDNQc3j0q3bEz5FMm8GFWcTBOctBJjXQ32wCitF6MGOM7pefhFeuZo9j6SatV8Wm9++/QYYp9WykY7K3zGwvQ6jCrSCKZWnNK7+ESrNhgzUQKcaU2xp2cdv30Z5Yy5HYPwSE61bVJsdXYeeNIewsT0V0n7P7FgVvJ2f9jF2RN4avD1uH1xmWAZVckJ08D2i0JYz9PeygJhpN8MrlLQQCu2AmWkXx5GTDf4WsYhDfkTxW4YQn6Ba1Jr1kUdApT0KZzlJxtQTcTxpB720WQ08E1ZNHhk/pEsG3/uDe3tbOyhCHT6o4xhLMKfkdJYOyWwYht/SMkqTJGwNMGJVADZbSDFT5t0gRibCZTErXoGgTEmPWUDevRQhWPeAEgy73GmmvFWJgAMzwwmCxhFqhAzyWUR/dv6LC/t0acBqrW1EjoYKqlxDMBQH5vbcCE6pI0jfei8N4EIA7qOqI2Fd/GvM3pdX2d5yO5MRzxq7y5nxzRNfaxPh+aW9WGDeK/jm4UOwchWIrLrYDQsh6PED3B3stBpftJcx6RigmhsKhdF79/si2/ifh3X6gutsK95693bR6rdUYSymYUxo4dF8HFhtxIBFf6OZnIIROr8uiOe+goeQ0fp+JQjQ2wFWVs5p3oDbwhvNgViDDZ4eJlxQTyMXgKOq3sn3EQ3/WMknHykSZy1n7nP1sPIUmG8+dh275xbFBCkLbhm4gh+FmAzAmXrnb+7UupqqZiINR8O+WKJCYEWeknDBCDOOYgzEESzzN5J/54bbKrbQVvrwmIxXVeI7/VE9MrLVdH6F+vwFrAWzRlUic7xu8/BK0dfvbIaArImgUFCdQZFL8JwVpyhDSAm6IkzGQ9A97b+9cdydYr8zjggNm+L5nIAxsOXfg+fEhDnMnBLqvoQkd7jwHgsjHTygpMIYdkTTOSsDnpr78c9LXRXN0h9YYrTMIdniUHsPf58nLGNhKdyopGCm7MYllFdZgt4IDSZwslDsgWAqg7/zZ+35tU44XlRi0g/c72192Zsv7z5SM1m/jqkB4aN5a1yT/NSLF4dST34DWGFBptCkbhLWT0C6e7K7r2TQ2GC90C8jyznwJhvUqJzDExokYrIhhDhHu0ae6x+yFLAWR08RrsKpBFqVCDhT4dV2lwMYx1CsS71a/9OPn+WIEZT/MuKKHjDsNRZF+nKUaUc3MpW37Qcb+8s5c9O5dFuaokPSkklRioWOeoi+DGg34ZIqcoBZhp4FQHIDpEZrF2yigXbRKuJeoy6uXQOK5zREkgcdnUfzMlScuOYNg4FfnMg5406paWoj15GrIhaM2w+EZTcDxawlbMdSkFg4uud6Fhywkvj1vnFdyksLia0IE9ysnfbNQQOxfC82Z56/qC/HOgTzjflWyomgbd51RDQVnT5k1Hss1L2dA4JG6OLBJozMrG3TuPmTfnUvoen3dzbJJrIyKHKIeg69YozG/uL23bHX/6M0RnfkwXkAenzyaepbKqRxrYKvfbRT0E3W9V3tZeI7NwSiYO7Jfs7XkIRLrtdquChnYLd1MfjdS7Vj1cY/uoUeN9ZIHgJxtp9Q83GOmtqaoGOtngn4QvRuTkim6xVYG8SkDefHE9Ey7csA0kVccR4y709uk5tYjdGQqOt/9dIYhQxEHRyXjQ03k5U59hlAw6C+R7LoTZ1xEBDb/+ctJffqMh4kZsIC5Uue/KqLPfQomjPO+Q9ZrDkXLwe0ylCILxVeqWB96TSrQF5m5AQbF1ukYLGcjLZUPJW41OzJfeuMmh5jqjXdjOnD+C0Kte0SiDyFro50ij7DrdZTDXbw+Umfq6MkLlzXy8Xe4Bpbr+GFGuOKXhjWu9wlhlkkuFzxHc+2Vk7uvtCct6wIwlXqi6HoBFSzubsjyeAZPzKXxhOgxYandoubsoLTmQ4R8dJ+tIVjv/cF754I5OZNz9YPVQQSpSr87SQPGRktSpxUypSAeA3TMhnDuaFMaxsUcsxsGhEZi9FPM1BCCC94OI9Q8wdwM0jPwYuJBOtcS4M4aheEEn9v2SHTns+mBckVZxLxIAbhqpQ0UkyJPwCL94/lqIC7kJXxgLTS93p2BWuMBsjb2kew5AbcTgTdSqK/f5GA10yV9D2V3mhX6htHEqpe73qw/cn3jkhzILscJVMDeLV0KLUq7TkbagKS2zLX84XEjAsZWFahN6WZFmdPBpmYlC7obOo+mdgOZwgDc2JYEWTyVcuHY9xf+uU7sToDikqGs35NiatCm7IH6gZslAqw5pMpwlHHgzgeM8TDposfs1iVbdVnjoB3YLeS0mVlkLgYNIOz0Wi8L37CW8Y73yVMx3yFiZTE41VNU1FzmuBLzxDjF9h7XyEGYGyVKP6I7kxPGIq3JBNCQKDdg8lpqx7j+2Yt3OdpPRbZ4XAYL3JDohWRjKLV7HHyRtYmuqUmBAdS2U591JdlNfyq0hO2/qwowtpex6miBgZW9B2AGcZxRLlSKRdmVyhd0WNk4sp5hkKJQLX5Ny10YbDi0KOo2iw9bQJ42T/UfFqODC+dIA2l+4OCNqDAZ9r4pPHHaxeVys0zJfvsMMfJ69wH3sVTMXWRN1HkyDD/dZtaqSD/4vXifuGFhQ2pDB4UskA1NiUFmUX2mgLicB2IUHeW7CIXFdBTUj+NGcVFFzdTGvZ9tT0dYqyRO00QQQrjmEEyhlWJaju3nNcVmgiDWD4Tiz40Huf3kZ4Ssp0ppZJcFnFuMfo8nagmGKwhiAw4TbmCOI+ME0rLWkaGyS7YNGgAlzr+rbY+n9vhBDTddTIv5qhQ/ORzWxV5VO+Z4ItwEPGuLZCiZ4JKIxVnK4N1JrDI5FG17yvbBFWtgDgz5s2GsnLCHnyf/OzSOkbOjHZ3HLYDFZwqtt8D9lSWvZQo9yq5qqZcSI25oSiNkuf5JcSiSwfCmFkLlvxyMjWXTgpG5lxK+17E5RZljY9ONbGXYAArzZ0d7cFOqcym6zil73PUHDudc6dIaUsis0X27SSBq4WbNDbCVqJEEPYKZBVPNCavpcj29y/JeefFHM3+dUwubqUyIdePLDpsNKXJ/VWq3b5HdJz0sZCJ74GMYeRw9J5OSWcXIAxJxEub4K0tfpdQd9WGSIb5tBBj78uNeK4/hh/POq1Wu5nMq1VQUHoHlysVFNYssgBKEIvkIoiJwbCDsJm1NUxLkKaQbQjIEPeixX46USVs4hB2tv74OxqOgAaQikErsJQ899TEu5puZ4uYiE4KfyG6X3Xcxy/A+aXpRNNf/USneVIjbo4Lj8VMxrHHt46p43Jn18McfIjhH7CxTCSvByqG1tYtn1hyk0UEQWOGT+ZHkDER2Kxpuqg2QKJoNh6Z4n9TyPmtqGCm5Xd/AccHJSKWXWsckSaazlpHelz83ANhbxZNAyPeHw4QLUpWkn5zrPGo9qeYBdxmBxHYB1mq60luC9qJObE8irLP17p/PJ3PNpiX4GNeX8tCsiaLsB1rhVC/4/s6pBRJRoPu2uyt+vsljBRlpmNM9F3na0E92Mk6Hclo1XDNYi38hmP9olpsQoRORlXbzTyKyVijbQX1MOBLvxQQPRT83scwLyVvKM64prRfepfwgU+DPJjcOUke1FsQdA1FHneuWTxJO9QxrXOkAPyq18L2l56n9MCe6we+7znfGusrWDuxJanSyI+mR1v3OendDgMGEQ4KPsCCYkXBtcVawyJl31xJRSknXXmLVR40BLkzPAsxXcmK1f/nCxvRZtnxDQltplZb1Wp5OPP/bkkhMoikULuOR9QBWExwXmZALoJv6HCjmUfcKsYaKH311NlFyOWQJLeNGscGde4z2hot4pNauoqpeOFdksT7i/G4ihsvG/GSYpU5USMSMFVcryEmIJIuxzP66W9YgDvvDhl0uSHWatUTK6FjS5vqVqiZE+M4V38zngs8uc0lFSQ9l7VIzgcLuFQhtHX17HT1RNmjhcoqoDBG3u1Y9vHr+GMqOYpqOxtzAEDGx+JPmSmZNRbP/SdC+iu2Y5c5nbW99aAP9E8ZNUVDSLdz9QniQNKshYWI6a6j7LCBFK36uL1aUBhog30cdBCMT/IZ09NPR+E6mGy4RNkevgbUhTbVT5sf9OIeFv9djLL+ywZ1iRDbA5/smI95cSwVhuEvWRoRmXlekHruiJ/HKjsusGHXJ2LV8gg31pxVWNpBochUlJJiPd1wk6ETC6UVwKAqFMNIwtyN2SvH6SRj7AztD7xlXAC099hCAMokCHpmlCrLoMQEdpNmv19VSmTpX9B2882G6TgxZQzgJj4wbxmudZYkXPJ3Gpusi8PMzKcFvApDiNO9+rTNsEEFR4a6Akb055HYyGfFVWh68TOv3KTA/MlvIQZjLCLqIX9FdYFQYwL1xki9ccocKP6fmSM09OofSfabmFjtyHHPbFAPzUB4xC/qikSjQPCo7uDLyuO1Yxzj3cBhzQpwUKT8Qvek59xfuqmZF+DNvXWm6M5OG9RQT2/3vqje4MZCf5Q65hyuc5m19ABCl/XUBiUiFLNGODoVCECcgtOIidNYMIxLAMlYs9pnbxFADgZs5yB1hAe7XTvd4Y4ZAR7t5AvzccCanGX70cYiJcJJ6hhLqmomta58hhAzQkkDam/G+M3z8luFZxnKMW7u90ZoGzfNhtTSclpFFxSoWVJT2P2Qrgi8WH42ySJKoBBQ7rZZRj3/rUOn+UnzdN3fISQY5sjgeRuzcta3YCL2QB9x+OixeU5gVtWJX2B0OBDUHs2CcZEwcQ8BaOYs0CsqtTPhWVG+ndjnCuGD1sSBnerNEN4g4CNKvsA1WtwDImpoqlKNGOPhkP5ZKdXlsliMksMt67xKau69bgC1lYwIcVGAnLZbmvbyB7S8ycfAWIY+6xYfbVA15d3JbU2brh0773KEJDD19CanO328rYluXSc/TeX5vrqDWZ97tT5w1377spi7n3GjJovITot5I6UgrTF/w3/XT0+ZTbgWNPjDoc+veJyhJF/q51FoThrIL87HEIxPU6jMFE5qgd3ugU49veY8V2wHzKcwxl4LfFOiEVh2eS92Fr2xy3RVvsyJoncblwDA4SGUbaQpFs/0vodfSmxbObrADqoDo4hweTSDs9eJE+3GdckgRrgvcoV0kmPRbUUnDmY2QCCdNa0yQRQ5D2zBVjujpKDTtCxEZecybePXMAIQkG93DHCq1wJuFfKPKaP7M82g24KXTWcSS72t3a+S0Be+1pD1mDwZx7ePvyULziaqUHLg6R0JOQJKTqI1SzcIMAh+ISipKFIfCf1Oe0DBuoT/GsmmpRlcxnx8cuz9e5po8u1l9DzHUR3GSQpxc+5aINgHlctRymgqq4A04Rwie6r5IUga8o5MD2w4VJTKH9kwRSarPnyzZ7ruMeJGn4JoScUlH3DB9uJbJaYrB9lrwIBixdxU1ZlONoD9aDGIWnwytsft4vKtTBYtRE7S4cPwhik6L60yJq6PxanUIUDLB6o4NHP9ozc6T/nI/7Z+rJZkwoldaPTms+lCvR5pWluMwk1zp5kbhfciJBCOLKwiXjfm0HcNGHKkIY/SXJqjlMj16cLppuLtRPeqE2szbn+A40jBIckTjnbnKAE4P+xuZHzYFej6AoocVFoDAuI2LomImN8Yk1ZmqOC5WPbaL9VZGaMSeQ3DJkYaIViPFq41wEKmtBb0U0VCcRVkdpr3yqa2u+ikT4Lz4tkjtofl6hqlJ3ii94Nl7esEGMxzcjvduCiNuJEQ13ftsSkRnfsMBN7ZZW2MdK39zdtWTGdiHcKx/mPCIE5Essph7Il5pc/V7UcXdlR+221KOz6UA8EkNDZxBd5Ut2LuiZ4b4P1n4QC0szlulnVbsMqG3TY1Tl0kflK8v3dlbeVboljZ/k7wYx2/IzqgJTnFWKvTkYsJHZcpIqnpUHyQCEeyn5vjgZNfk//EmbkY/AH6c96xMjkx+d4c3FnS9FLeDeSRsTEqSAvGvkn9BwGxfalHQr6BSIiDI9W250UB1efUFBvgrJ2lTWgFqC7BCIuiEFitjugFNlsaSz7RDxtmPiCXXHWnxigd5MoJgX8WRDsgYec1mMeFphAsw4bzc66mVXC0uqsnRg5twyTyLe6cyCe8gTfmKvPspoQnq/hz2ret3a8B0u6tAOBlh7wAeH+5LfEzHss9/gAwaoUzJE5r8b9i4blMmy01biRhXHOE04k1BZsYzhiaW+Nl0XRM4QHuF4LPe3Ec0kTwwZI4/CBKNfrjiv5jr0VQxJbrQM8RVwVDPj9RcX9d/0RTOtyMan/BbbvzjKNK8MaNSoEcUvtnBv0+88madMo3EG2DTxwEnE8MnzxdMjc0gYcaYnlGVz2vrkuKc5YIyM3Dnq5lltXrjHlx7jTn5LcUn05US+3POJgHLFDMJlMQi/50XS0gIqiQKerxgL8H65fa+T+snyblP/cG2Arwjwoob0CyVurQMwd8kPLEtheBwZu6Qv2gWwHusqqOzyaUPi1iJV4pjbWMrgekQdxpo1MSm8+B7C+5DiWX+3I/Ds28PUzl0d4O3Ry4vwSsq7rDN7FWF4mpA+Jx0VakNOuhu/SMqc1cEqEaTRuDIr0evob76FMagTVnIYmIhXClUNQp6xWyBu/gBCloA3z5O7ENI00bmKKEj397nGFytlDpmFg1ddVbMcS7Q0PY9wS/YLMeFDKt010QmX2+9Xe52XGmnQ6dlw4/8nOr0GPKXihSmhL0ID8jBEEHKMfYKgz8RyBhn5tuhb8jLd1APGLhRJrP3IEyzMhJS+BywdsQCJ2SC/6aPvaVlGpxOKuU/RMCwC/0SPwpnLYXx+DnV+ylc8i1380phW7K2jcS6icvc+Pi/BkgGPE/LUzbg6OkeTkHmv8GeSPF3jxfY+9/3L3JvR/FGClvAUGt1UGf4Aa2P8c4oWL5I0m8Bro5bQqavOm0OQoUc8yCmxtukzr4McCEPJwd1bp1EeaBNz5T4VGq7VofoK1GqN8HJBsTKW1XWcfhQyx3AcRsVRFPQfTsj6PQyLt7ru7F48OAp9vY+VBgRDf7PY2a0CvNawybPNjixRw3oLI21YmYwin7a97r+WEYKGyDPQK5OC46QuhEfeBMu0ep9WgNhc8mFpIqY9tqFed1RuzL88HEjvG2mqILTeh/flAKMuCsUpzf2BjKshknO0TiS/YbJi6ifugQ+Lq5R4iLFMmkkFf9S2hR5eg3Foy9RWQvIdWpT0d+rCbb+51sRwFeDi+YXvePXfn5GZESH8F86CsFlnEHqGDCpRJFOcnmK26egmx3D1LtZFGgAyuyzEzONwfgNu+m5A4KltslRkFqpOD5pwlwXFCJefU7a6d+9hsqhrEDRykTx0F7UmxnrE2jLlHwsbkleohg24p2Enu9FpsUqk0CJGFA+XV0QJeSSgAlyXDrixJVbXPARShO6zyr3leH/6KI0gUC7Bv9zQAW5e+VBveZDu0k4caOiYZloi6veCWe8J9YAN+rHi3V+5Awl+Vfs7uuI57bjvSeYrY0izyStp+YVei41/j3dvOMP8n3vIy216e7064m6QqGZzwxtNAmc/xJIhhUynO70DVtGs70iPX5+b24NeXvDasJrnnAui+2rRAR7EwKsbIHad+nyAPUxDndYYrD85HDBPlsWoQ4OBxk5PX8TdRnzHrtxp8EVFYGF7l/PKY8D4BnJ6F7AK/xfcpVfm+MBneft7vXv2x4JRF/8zZZz8ylJUn2erR1YaXfPNPaD1/GCgqXXrE7w513r4gCKTgWOILb1fWnwJwUyNlhayqR9BESYhG8SbdN0Zsr5z49zBn5Qaf8DxuhEWbfzXz+hwJmU1jQblB/96won8S6ewuk5o6TkHo3tmRTSTM1H81vAsCR1Nz2Wk2P7IiZBPv2a2h7nyMwJK1u6MNW/BHJ+ZdSEEIzTkDlZPdgt9AfzDnwAPuZrO/icdybDYX2p86MsFP7ZI0gPKwRUR4LK3UBpisIqc/1+cjPowp6wp/5NJmQH2UWuCZzNADl/hpjBVYIG6jnKeoaXZR6BwkocyKC+S/3I6VPBre4mg1FDsgUKgTQfH68kk1JMo/fifEEd9sK/g1YM9TzIPb5MjrIEG2e8TeQolf3r0vhiJEDYE1TwYZqGeXfZRD2Ar7bFrPWzjYN26y7RhO1E47EBKbZ6cJLGV/G0vA/aMmWJ//Y/IVd17cwW7p3XwJx5058zRM8lCK6J2mlt15ISEa0uaKrmgmtpXjtXjc/VUCP2QWrJNL9OytpXhLefufgSeWQ731IrtWrmvEu2HpdFTjXrmCZoa11Diuq24A/9+JHHK4C5i+NOcTQt0Fi93iQLqLavACJSzoQD9edD+1F7ZMou5e+zI2QlvKQFEeQ+pMyCNeWLAtK1E+Mk6jitCSqnRYgNAGG3yMLGWv65g+IqDzDZWYBWsAO8bxHpLdy1AoK/SZLgwMTEQ1lTp6W2208hjD5oE+g25sw3xCgS/Q6eb2dXF6K7QC5j4gCr2zsalCH0Lbgir+pLqWFVJ2CJJJPX13Iznd1tssQNOCn04F1RWrdjHX6hgyHsA3O/8dSGB1pMKlRtbezWNOz5qxz3ipj7Ge33nrgLfWyC68/WIaGLvf2Z2cM4rJC84l5harjFsuoXu+1Ici/TQkDsNa3OcBBj621TfQogBKfcIhFnNu0t5hboJfDaiSeqD9mNNgugW1ZzwN+ACILJAR7IiVAbnkT8FkMIlQ08JlmfThHrsOqWhamUBcX0OEC4bzCOk6QgGkHZTHsMaPcfGyPbYzj8whGkgMSdWkb11phhK/+KT8gcKNQiLrbue5yV9IYGIKYskkj7S88RiA7+w1XTXCkz4q9CDTQvyo6cv1kd8zAYPHWhaagywfPqZIsn1J/m0dPddNxRSgUoxdYKryokDPsQmm71Rk2lOKwNhCpQJywDaqObn48wIGxzugkjycV7S6gbkt9PoYT9rJbgV0JVRQrO7E8NI38ZrKE1BRbVfsGAyOeObhcXEQU1aj2mcySd5JYhqiB7W8PWRdeK7TELWIvgp9PHQu0PJjeoX39PA8Mx6dnzOA+0aRelTDXUmtHlChTlgzSuEJul4uqtz6CwEKZxE6A/T6smIYew8cvkcUlccj+Td7RhT5vbF479pQ8rljDnVS0f2LOLSjbNwOYwC1hov9jjv9EG9sUXslPKeTKgffX3rOrnE7/vKIpuAH5eZYtLrL3ycTG31yp7Pgev3lmMXyfbpq8wp3GW1SHa0jgLHADOoknng5RNIKVh0sWAQmWu5M98kHI7wRZqvnIjwwR1yU7qYYTWrGW+6fdU6/noczv+DrRvu5Ry7mYwskSnKWgSitCgGcPcjayczd8S8CGHkvDYuM3zJRHYneQoLFi5ojr8GK+c3TYInrrV+4LYCY5JLsOhnQgTx8ppBTeE6v+F8WDQ4MbjmxI2ljCSRohoK4ydPfkOnLodsCmOMMCXhgwaU5szM0r910EwwqW0fH2CHJ3tOigJ7kiSZ8hDKQojFJsK3FkzahA0uflrCDs3CGRlut6oz5KtWvu7GnnIqvjSdIeq/EMFcmDU176lxqKhgUs85aoOk0QBkN5Vho81wu6+AQPI2P2PVvyEif68L/VywZMsYix7csHpEB1vlUDD+oXc1nmUGmJ5shEbLli8i0H6N5e2U1DoaHuSc5oQ7/RMol0HseHtgKC2c7LH72y+oizUZa1oDJr7GhmiPCqSWeBo48Z9fUfPil8U1nC/pUH9JqGuvQcTgbNjqQO7ZpXIqhhqnv3Shytj2T0i8CqigQaGAiiQDeEmV9uGZ/IoIrIVHd95sBdxkMOJ13rbhpi1WJYYx9n7rBPD/hCYKfHDxIvuUOntPdKFHDtju8iMPErw/V4atd8UH7G7m/JuIJ4IKvPUvP5/R5awy8KHjkcEWO4v7KVn6ISKtSdLoHzcPej6BNqX5nJi8Xx178hcidJl5vTKACrqDJfmqkjbge3c1xKQfbQtDkpMhvK3qexVi3TzyT864bGOaWMZCEGhtb/gmOYk0VzUmOJe9FlLdZbxh5gApczcIISWEj1ZpVpWw2xMd10M4jvLIa5fvkO4fT0iWXHpttJvLGk/m0lrYG7i1h82ysJNyHbhb0u5tU8zVpwzQQ5yoF6hIVPc7GDnV/iNRaZVpi+VCsRhRXIQjNEn9CwlcSizp2z58x//y3COuXf5gw9Jz2s+OxD4SOvpBOuByQKUiE5/WaSAhA8BUjFVbmBkdvYgwd+z36HNtk94Tr3ny/wjGDGriCeqox1p9Y2SYPpFdc3X6vJzGRSObnaOpWmT0Bj2Ziuq3Aam3xMW4aHQBo6VhV8bMdmYEcdRPyI2ukDYrX1GXSv1VJe/CirDRPNb5jGaIcSsmcjwIi6NKn+MpOISaHBRi+1OE62AU1pWk2YGEJpuPJcpKSwseqry6KPHxs4Qy+QQZmHLZWF3n58zJYmfk1vSfyw/oo+axiWwbocPn1LTmk3wpRLrm//DrA2U+NGaT1faSLiI3VCzjVzqrsleEx2Y7btg9aHvxaUs6pdeq5gb364d5l2t66xzLAXNT2F+TQ+0uvGk/djYq3anvHLfY6ZCvasEae3WhaxMsu8aXmnBSFWRnFtySj80r13Fc2Em+Kp6QJtQRyKvpRp+f1MmYhqD5cZWHCJ0BFZRDEXOl7zIYSXjqIONH2bmGiiw/ZndOArdNMjV7Q8sdcGZ6dHrf8NtQ3a4iT1G2BZjelEy0b+pLG6hbuSyDmnLFCtbtQ1fUjkPkfwzVlN3Yq3py5JxwhVtVDCeNX/Pe0b62iPngckCdkJapw4kokl75FGFuZKFf8zpZD51X76nIYiJ0whqAId82pdm8szyIfYz5Cn/9Ue3PDHNRXa866idoscviNqS8wr+0eRFOSoZy3oR8CCA39PHcPScO0XdmIDWTqQ+YHXoDfo/99w1VS9VQl+0Zrn28LsS2KsLcbVxMnqMcOIjAh8JlELUCmB2QnfLMfpIeU2Vt8JTv57M8VL02HdZ/nwbPzlFoap0/Ow3ksIQ7LBFYr5folrwCOGtf9vKLnd4Qc7nuaRmQHErfWmQyBGogzgNQKFO8havcwkKGayP/FJjmim2EJrC8R/SxoJ46fsVkn3Nm3UqVMCmmv2muHw4tLrcWINM+iiZIFbmhK2EMEIcXuMajO365HzH60HBY8x3ZvLZCx+Hi9VkAgZvDB8HYoTJgh90hr7Px6xJs6F9QyjsnmbnlMFBnJkh6hWhd5TaZ3V82pO9MnGQ/zXX/6Ew6ea+fxFf7CQxTGC5uoYQNvfDPxPVLd/nQIrNUNy7SYieCVypd4UElN63y0H/TA3A2RTgV8agBmTJH6T5KuBVRPdR659edEWECmlOooG9TRPQTvI/e933fT5WlTJ+Vlg8kqKKvYVZ5QlcX/Ys5pIvwfIwiA3lGl+aw0j/ys/dDW6jg5JCX/A26m8a8YTlXnZTxeVBui4Ag8Es4amSi7AQibmBl9i+u7OGE1VxwnQzGjS2aDvcsgJFH8H1wtHuhH13zvo6yHmhF3UfHwM7vS/dnL5NRIcQKk1CrQDeBDtPHQuZrP7VrS00f7mXcueVQ1xJwDDOBRjmYBg5HPH8XIc1jIfUThtEs+a/ssAkF8SoVJnvCYrsMPDLFnw9IEJw04nfYDc4y0TB1Eb9488oDMmw5ANDADf70cJtqt2+SkOVxVIu/bWGQJY4te11xPxZRmLj+ouVKnmQtOj+PUvoenyi1NrEgMqU07VidmVPMwftRVHJ+wa/yzOevlcrqBZc6koeBysgijr4QXMu1LMQ+1fCmBEUOyGG8t7LxZDHJNMBzf3LoK4l1VHJfvvo5mE0xDAnwSdeYAZysrrirfgL0iO2gDSCC5uem48nhU/te0v/5HteDo99qdLDeILD0XfIdEig3Tu+7iDFaMK4iOr3l6dbh6VE5XsH2VD1ue9536BOTdcrK+BoPcrF6rSIog+Tp4oJqAyRPesTjvsua1Bek8GBwWod22LMLoXM7nP0e5//JCiD6R9q5xe/BBFmGpdf52ruympI2GKQIz5CA007D9IWqVvlHsjQLMTHQEoxLVB5moHYWk5CC/xoJmq5cQ+481ak3QhNMQrTuBQ2HPkvz6+gD68Kb6rRkXxMXTVxaKrTD50a10zg7SiPJtusQzcChAfhWDef4VTOGt4CQ7X5jxWZvq7V4nRtG79BzkGxAu7Rnf2sLoCqPWx7I3XZASKczgwtEONO7pyp5/PRxLjZ53RxqdrFNLFnvcBCBWG4ssoZZt02bBlbenF7iel8YQZf/mPmNPgBEPX0otVskmhaPAEVm7I0UfdXb8eZEVK6ZBJNFA6y0wKqsEmjSIoyK/XfwAYuBZc4uXn3ECSPyoB61olsHBO+x+rWure8bWPhpCHIRiZOPnXbhM29q5Hmf+BFTCu/JTusaGD54xE1c24EtsvgJECO/y8DsIC653E2AXm1G61N1HF5Eq892nzab4yVdBrn8xes+ZYKzmFHC0rghmaYHIrQndGV75B5DhfuHRm+KXeuU9Y+neVgvT2G585eqvj+RcqVL+DOdc/t91OQzDpLM6PxRLPuZpfxe2uEa/Ye3q3+PU5sXp2q5SuTGNj049ac3FGhqoPC0dnSFJE3IHWX5RYcaKNSubtDaLhCyPaMlvH2vux1HYsDrm/Z2/goU2m5TtlG1bZQOt1TP/OnHjsudVMEXBEJW02nZicvGnH6CUfyncG1yUfOGx6hfQDRWaBpMZ56SwuOHMIY0J03XBDiGzv6iYemjH6zqqvUv5sHzERzjZe6OS34vPsC3eyTF/e6nMvjebEgglpXzmE3PleIQs85ijcI2OcAsxN0AP3l4sefXnPjw3a7wrJoI9QUrDfQ+wTshJ2jPxDFmh9c5GCIG+g6NJma0NW3QVtXeDIFbt+MPoUGrv/1c00/7sFDlsciFGJQ0tnqS/9UBbuGiHPg0NrY0jgT54Gi3B45gk3NTnJFY1Bgl2JXJWi2eO2C1mYMilFif6DcM4y27jXbM4FoPt+EM5FHU7QW2rr0VD769xmwIP73YRSVgP0cBHxp8Lw2UfdQzEPg8w+9qtHwHUnsUf8Xt9bJmqk50zzVKG8qOmskF2l3KukToOtTlCSs1fKT+bl7TTd5anr4AHF071ieTfORWo7WqXwwLq6BA3NFy156sIp6AEjLcXvaMh1xr91bQVsJ0dK0mMPVvRbIXMpmuCBJNbGMTEyzbUZPPaAM8VeNkMyulOSPNwumxQybHwv8+CXdY6fIOfMwJxaBJlLntlSyL9l4DsvN2mdLZLDUJR9Knj8z3TZhfJqEII3nWz31hjO/47vUm+pRH8MB1DAwFcJAuYk0sg1KRp2wvDYQPINAm13r4Ahs5cKSKPiB8RDO3+QhKoeY7TkTgQWi2tqTRRtjtQks+v/Kc0ab3h4klHXPM4mYgqpUhlLetcoOuwX/afH5qvyYYtXnp0h5EoObEx1FzmD9rSunEGu4STaki/dxegqe0ftVzSXILOocEygIwh/10Vyy5GAUT5LQ2+UMLmdEQDBmjODWoK5D0AJUQ6igbjZ4yn4yuQ32iKx+5avvd24BxbNNeMByW51tRWDeGs9WR3/P9D0qTDWQrWffJGgWA+Xb886pFHJS/jZ4ePXhxiwd7XU8CMI8orjTmlIosnYgFvWX/7f9NW51oDmGPC22xxvjxmJbVJNMJuagAZLAwZVXqwJLiUGfDuKStLuGSdXbvoqxgwjCy0ZjbrvLdggIFjhDs16IdOsPoMWDxR0Y1eHdVIOPuZ+FSi215te1NXyIPg8t1gqyB0+b62XusMRq/79UzESuKpaSPsg+3UNqagfIlD7T27MVsvasUte4Jhrjz2j86l4Omb4Q6cDU3Xz/2QFvhNj2fAcbpnzcyiRxFKl9HO09S7XdxLf26N+RFb0Kjb2lwSRPbPgVhfe/aJbxAV+v5Cx5MzCvnnP1OzGGMO9u6lcZzLyMjO/wdEBvGd/pRGhKKRKfkBqRAyuslbnvCdzHnZh6NCzNrXhQ5lH14R8nz7z+MxnXYa8zR3TEnQu6MLfnaKDpw8FOmUyO0uJ7BoCK0TdVmw/8PmKivQme/N1MMQPrGZ4ftQ+Q1nykvK1DsnNYbPbu/qH3y3p1AT8YZHzUTkvmIIWr7UIJbH/GgaMwy7u8FfjzyjtrV133p3IhkGT/hjVP8mZXuDX5TvBt3AOIafuv3bI8TEFkyQvzJgiUM30RX1PNKA/fhDcekXqT9xrdL3WO0FIS4XBPAMbvdk5EdkbUpB54Bd2y6tuk2bDvuoO0iMZAcKrs9Jnf3Fqt5nUxuru7Kcg2g8c2vtLNnidzrcjxI1f3ZcYs7ZC0QxOo2r46wxBSnkU17WcvsDZzp0hPmyGyffLohvR/2j5uGeZ8+rSdrqzWzzLWFRmI4+GikKcOryH7wY92zLBx8QP+j5xNMbox9a51YFIRC7eJTczuAnKEi+jbbmjpKywqwizrziVSmj9lw856c1Xpcf4oob4h0pEVmHHORB9DyJutEatfhNjtIHdFXOx75XkcXliUzLRfHh5Eo06OTYj90DEDpYeT3+eycN2Lk8wgNedkDpT3YhJccTHp9nbuHZhhIePOtHf/7NoQbYsSyMythaxH2OklX1pWFHKGo7k/QqTH3Bo5j/5tIf2AhEJ68TGAnl8cClS7CdnAfwj/sbmGwUeoWJNRD0MNbnWdZrjZMs1tr8yX7Ms0z6rMHBa+bT8rlgyvtgoOfdSX121tNxBWJIXfI8gdpLrBr3zZUbN/bUZdG/o0BrDUEN9z51lEDILCCe1U01sX+3IeWC0MhUXOa4fAbDE9/uGIepLLuI0dG3sYE+dE5lWYFz2FGzY1z0jW4B9nb3SXy20DSXpl0vg/8QuV1ajSUIMfjRLisIoGsldLDGIfHcwpAh1FiasNkjCbcZj2Gs5yzw74goTCFJR3Idiqeb0PQVOURLc2HE94aimR4QWy7mCVJD3uMXdVtyowNbAUGnhG2oD4lD6i8hR8nq9RFoH7TzQElrII+HS88kJmD2WLhKBvv2/wt2yj3kF72FwUaGa0H3awUW2GUHcsXg2poYxEVMt9wgviuOBVGGeh8BGAdBls6nzQ+u1MTPEj6ROfr7+ct3qGPrzwGScaP/wRZlTpcJQ65UwE+LkiOpmKM//YVP2hCF0RXQGfgZmTW1SGpSt4ZDdVmm3tpL3DBygS6dqQ0UG43kLfSl7xoGD95S4PyXrVc31ZfnJa18jjQDoOCm5p3tO0/PXIPxJu1mAQapXIRxDXreEt5wbJSiurubckLz/YO0j+A35XyioA4+31iqwqx/Y09fmn+oYuoems3x7YJ90xE2n5sDU/putgaO/ueOMcXugIqCbU7NkW7TfXHwZBGtKPnn8YtTlugq3b1wNZBLUhz0rXR4MmqkeK1ZCo8+/5x42WjRUgetK6RKZ0uHWrzd81Ml+aZ17TCVKcDNAYaDHEW+j/Lugp83KlZI6YHRJzzeCSrlGnxj/ggCR4h04IpDBlheVA/VosJSXzUx/zPg1mAZG/CMifyFZ9poJk+GfzWhiLzRP5ls9n7MjXa5A5h+rkpwOcDr5/ssHZAK3OHgTIFA6Cb3UEJXqygL+kf+dDgSfIFyYP+L3OAuHcQrmTTSwve1vcyF64x57XUVifmA2D4atchw+Fa7agspudU0MY0axCr35r1fnNSTe+M4pkCkKEvpqM8sdfjW42fsh8N1RvJyVo3uoT3DRjHtv+NGlYaKQY+SnF2a18Eb2zLbFLvvmQyG7c50Y1zTD2T+mB2i7oKaxUad1+yuNwnbqwUVcvy4Mb6c1AcdoUYMOCuZVkwpBP0qH0V527iVmjfnnJRaNhRXaajhBkXNFzRtM19ju1XXNBEUfxmdB0z6ndL0U0RvzUbO/4McDGNnou/cacU9qDRhRIJgVLu91GYk5PVS2vXhjmO4sJKFd+FkTNHENN9RhFbPw7gi9+Ep68+vef6gnSGEbcbfBFGmAtAGxN1Dk9MWhS8AHb37p9TrGVnsAdAiM0Vy5UsJtUcr7mSlr8G8hFlwk/EDueMqFSywfnBXff3xLKb79uFdhwKbLFjVxT4SLEv/tbaisQyyNfa+JYFgzHR1m6lnRgJv0Sreabytjvm1jniyy0I6h9h9AhABDk+7cSA0Wu1K2qtmhghbsCZOGKm2o3+2cFotERUGZfXHbH/nijZl4FwbnLCLkvsWpxG2ee4MfOawjunYkedXrS7y8TPWYTt0lI6xpIAMUZekoJEKody7iJArZpdZ4UWkffMj0+2SKCJGA1cPeaic72RvRMuhu2/wvDiOuwxl0sszwiL0ACxBICOhGI3P8PdcwjB+AqVAfEEg6eF8AnpCgqbxmKLYYirrNcYdLPYuNt7wOvsmAuWTqI1bOWj1YX39xlXBAimY5nrOKZ5hwz3ks9mWkPCJCLrjw4VfdmvuXX9XN9BWJ8IPhMee3qMxMv/jO7Vwy/D9HxEt/euCh7XFHWeHJRyuWlPFj60s/hF4oOH6k4ML2MO+ZAuACok4FnFeWVHwuRXTVVBSo+lBmMYi+SVNz3C8wYQxg7mC/SDyQmVAcNpwkC6DtSPEVbKUvmrKpzcQ1fGG8D/Pbc7NHZfbybFvFl4w6EEF6bdh0aaEeNtcHOUoSS8fbrtsSKppGzgW1X9X7PiLLGvERQV0LnpsmkrCQXvGbMVaCg/9b4ac8Xja4u0tYpL8iEY6bR1Y767pG4MIh2UpKshIPrRLpc2QSgMRURXDgFqGHh5Jm0WJ6aNUp1KFRRQjIbsXGiLgSkXwrUVMuPZRecIfAfjXUnahTCwU+tfZ8Z0aiBozFR+xDUXEkoFpOn5K+VDdSihxDHHzPUQP7e/BrGLBMOAELik6VKPaFWhmw+5qu1ZuhthBi83fkQfbaiaSRFXx0JTkoHbbloOypoKtbGiP90B6hVNXT1Fyhp91FT348yVGGfqy9OR+2ESFcvfFSZ/Gpv2ZLkwvKFDlgtQCUBZFTUGh8qZxDqBPVymBhMZs+hQcy5Svhe7nJNPLmWmtf+Usmh+nsSZKVkJwsRSVXk0vyF8vXL9iOrIIxNCwsh36HI7fIXSa58GM69Lhpy7Yv9buTbDNc8gTynBXvpyrr4QHc4rlZR5p96THSCjH54q7OpN+qF4TiOwsfnWXfV0BxrRQZNP3Z8WVVl1g4W6/MvsL0Qm9ufJKZqAfBW1VAOjbM01g0Mu2DYm06vnUJqFABzfSDEiXplzzBc4l8GTWpDiHtdKSVm/zbNwxpiStR9uXypCOAAWGBH7odA3dpPjOCjF2YCJeNhmpbzV0QO4pCsbWlf3rHECKVQPmqO416umnnZHxfI9Rtt4EHVXYrvop4iYUMTq3uxQm9d9VImz8g7/P82MYJOq9/vAG7nZNwIC5Ui/YbWKvUGmhiTQXgXsfdo24ZH/a/SuYwS8fR4HWJJDTuz1FI9SKeE8/Lb92+InyseihYoYCvGh5k/WmD1VnaS4uAWELEymvhXnSdertmbjBCIVwNlhgXX2dKKBlqB7rvssLvaIe/2utMcQiz/zfenGgBeebtqujuP//4rQ49AgCQ0/FtX349u6N0x3sOItjXCPyjqAhJGitGMtXaGoZswZrRK9JRdGEnGduGP19l3XwR0/1eg0ylkA8RMHK3zK7X6GVbYMnUfQyHlIkBxfSpLLhvCcx+1q4g4F+NGgp3u5ST/R9LDK4RDuZoroT/nsm1dp8Ou0VqQm2kfy2x35L01M8Kk+VeEYZwqs7m3fAgzfTwW9OmngTL1h1ZXP0IwKrzRcGh++eTSy4EeAmPtJWtvYVhtlF1sDxzDyoBTgZ2ToVwdeSUMIMJghRi77/zY5PhNnTymn8RHiGYUIEsQmgD8QcrrvX+ELfLUhDpKNCrP/5SiCn5KUmTM2G648gwQ+c2g1O5PBSGa8Lt1L9JSREaeS2vl5sEOTyKdoIOO+ANwgqrOjEQonKgLKgvH+ChCc3PUxBTyLiOfvB4SPG/Wv+htPPYNXMng82Lr8zWSDguuuzZ6F+14bFam6L7jEpW/M33O/CxXCltc28OJ70bUE4S//LEVmpa7nhiuYLhh/eIp/Ds6IK7nG8uaC93zVc2WZJbb/Scm55JY8kBZVuOkD4Zq02PAgpdzbw3qI6BrKYLfPhjau7TuUDwry5M87ch3s38UBHYgcaldUTX+p4WCR9pF5z2vJcHDyM+JV/iba6DohbhWgV4yaH6sB/TYcSB5oeHLUkU9wC36z4Obez6i8sBbzIiNCN/r3sXm9wivNY1uwFsbPxLlOCGmh5FG4ci9UZQWM136q/Oku+CjKiSqtjCEIPU0OlJSULuKxz/fmA5rBUEabImG7m663JIEzE5VO2yR1BDf7uiE7w8vZtAkSoWRq/Z6cHPceDUT1ImRZ8stIJ35W27lk/OCJrjmn3WaQrJ6HBZFx6m3Vb2nEPQrA/tsEsIa+0THb8nYMqJnHMbuXE1TdPKv/Bcq1SVDige55J6poOEG0R+fB1L1X4E1Hqi5rzx/+NCLnysLjdnj8185bWpkn/Lt4xSbkFaIUTs5PVL0qTCgf/aUGRh4XsOrkgSqxBS5270Td+k+mFZ9MI14HYLa8TqLJwIBM7QyiEYS9ASjeJZKc9ROU824qy8acuQHnuuk/wQ82MsP9ajFlFtth3A3+AznmDhAgDi+TIR5JXeWMalmGoxiHOMhw0AsVpRZ8+W4dBqh9aRorCAvNVFljE0TAoM02aIZuyVA8VeT7K7+vmC88J7P7SjhKbqRYW0XxwzDg9FSPVnClKyNzgEvafc6ucLJoNXIOzFIQqKTDZMgQinbo4B4JJZ6MPdFa8rp+qPivqMkaPKNb8M28ySD19rEwZ/pK2Am4Iv4Z/6NzDkE7r0TqRFeBLGzBnQdBl5UxKH4P/BNIIKbRvwUOJAIA8KJoCf2m1LT0cGAhGEeLpArhKkiBj2DEYD0D2sbX16w1f3tHCgu4DKo0LUHAH11c5/atoFFWOFLDSVnG2A+uTF5NCPdZ7r/1dd2qgnGtJtESDLgDZPYpPRzWP7SmiizdwT+gxBXwS14YEuwaLLImssHPv+o47od51QrxfVU2FV6NEL3QghHAAW6cL9+2Uc5o5jtfcoTwKtwX4+adjseKLDxmDT8gXSPIoh+/NJUa8RJgL0LJ3pn7PkwfF+aRHBRY9QP6ceW+Q+2uv0vepN/4V7VUb6/LJ7eRm58pl0sRvDaN07s35+Cw+BeFoo/jkNtrd58L/7mAAnmCFE5s60nXRMqB4c3HVZoRvy800KRYjkJMFqGcDp7aGTjtylbb99vJgwa000+RJNZgzGvAUfY0LgOMFwVk/hNCmmhAjCuOZAvzMGGCslvGwQgSQzcSY5uoGZk94PMp2vM758Jd/zgPGU3RkOvEGEX4XPtGtxy17x9nnDgRO4j2mb/G3KNSaCLOhcKPTwGZz9yVTvMyZlIBrxJ1ZnXjLlKG6whH177HE4e3cOuBD4t1OHJbfDDw3Dmnuq3y/TCIfNtgo+/zbqQi3Klw7rSDXl1fUdPHN1LXSVMjfkhAg9PoiYVhguxskl6SdUV3n8Ij6yXlZCSphP223OtxE/+XjeO3e8DjNV0gtVWLyTG144lw4dP+OQPAKolmGhHIvD6RfS9iT+IxqKpHqFMjr81m3b78qgwAQTeW4wJuNU0XYN5JGvCZf1ggG3qceqZMtW9GuzA7cVjwldVDM126TBdH+zU0JlTFunRltMhJhKuPR7Ripl2rD4CtjB++IXPxz1WrUaP+jrRKkxAFc64jFpDgOeUkPt/2XHsYPZVe0Uva052TaCT21dj/7ZmtnRAKNlkoqpDfOiRnPuDQNGxAZthD96MtLyVp2JOAYsjixAKzaFXNhOcGmj0bg/B34wQP99e6nfbwoybLkB+QOlT8ROLwyiMjM/4bCDSwapFVUU1953l0aatAWVoASCz9lMINJlozkqzX65Lp/OcXGnidon7zHnaRmlvVALNHAZVPN/jaMpwWYlAWA/j8SYxeVmOVe2CWWB2AAUwFiZB5YzCO640rsGAcsGcnJSsmgECCwEk8w51g4Enj5SCGqxCrvoW4BPHAWM37WiFT1/cHy0A921so6LoVCYAfk2xfxVMnpqu6XQWGuuNnATc/ddO+RaqlmnQtB1cmd5m8nDRKucr33eJvpgdtG+PiMyCpVdv0+1Bop0nEL0fNc8lqWLBBdODVybJTNyzaUm2elzCTQqXEYRPWRcwq51B5tF93I9/mc8BL05E+TvFAgeCe6hxG+kX4akhnuHD7D2M+FEztcwH3Bdjbmmhm66bwtRp+ifKgCYwX2pdXxXhqn1/WPOdZo8vW8Or5WEI8/DCXTd7fl1rWcBDYEpr0dCJTPKljBaJ2WLNIT5GRV/nwgLeQOJMUpbDdSpM8DOxyLaZYxZ6hnkw6TJhp5HeZGyUuy5oYbYh7bE9WO51bcQdWbqyokR7FoI9IBl7ojSQk9vMGThBN6FLI5vO0azkUN5GCLsPetcZWvQQwRO+uMGHazQfngqde55ieC3aKOkz+1uBEQ16e0sMVRySFno/3K7IJr6oiwocxXK7QDp0IiXXROFTVTWtzGD6Z69oBSPBxKhRb//d2A5XBtAtpfNR1qGYncf4/YsreQUcKYzio60xX2lrryHjOt8srr3d63wnipVvg8nBaW3jINao7T30ixtFQ0kb0KxYNcxUqtbyAz0CEj0/gb80wBdMd1kVLHiSD+ZbSZHtM5x3sP2/hGYR64tmhmoakFvSNy8kO/rJ5ag+3B9twkonPRBmnO3oDsOFi4u4sJau1UF+5u729hLPjO+yKnVgLFJG7qsFCRX0PnGEl1MHZg+M1VdaYj6V3ufP+RsvX2dQTpSvyPXiPq/UCoDNcLfoyyoPU/krJIdfo61Y6yLplVC1YHGGoXllVoSUK9DKkjapylI4CQ8cpeYxsTl2g9muM7VWXcSNgr/4sHRaM5nJ4AUvj8D01514/E60H4wpA9EOo7qqEt8ph/O7CX4gEPDmlrKyQjROg2kN5vvr1AgfAOwyv/JEp+kMuiNBql4YplbvU2MnYq1JJXkgcz0QJWOpaxniWo5WfH4v9ceAixqnuBrdYu9XlqZC13kOCxRRV8bqHJd/1Twf/AupBEgRONaV9V+Rd92BVD56hct74kWkBJfsFGwCkWTGbhaIpRPa1y7R0N33MJxOI1o+L83AcPdLNOCdRwB8dUTyhICjYJ1z+1Bw3B2F9zzhJ8f/Z+rP8k4HaZIqZpQ6n2yG69u+7zxVGC7HTT3reHs3r44eJAHLrnu6wZAWoJLoSuQIaLizO3aldxRLlYva47ckJpWVXVXUQxPsgxRcZJzMJRM2r5LOpLnyPow8069NshnyldWv6pZZ4S5Zyftrb5bHNARLrdCc11IvZ8NjPP5Ki3ggA1Wg31PWG3eK+YdVd719ifxt1tw0CxTbrDua7Y8nfGAR3gWdM2PEiMdKBAz2wCBxBxdk3rkVLOd2dJJ9oMgR/rknhPpdEQMcWxAaUXzaGsgxpyT4z1dKH8Vj0tVGFxIbZfSUliVFnKBpraEdGX/TCQGdtnlCBY1IX6/AtoZTCIjDA19n9WFNWTQxPiD94D4+9gzkwfKCxYiUBCmv8C2CvvLYRHcdEI7MIPBBxJ2qkZH14HdHT8wSuqTRU16V+iIEXBeTmxjHO/UYxwWqCKTR2Fa4+HwwwjJIXwA7OzN3whwVsUBC2xPITl5yAC4FU8Ji7hL1KKC58FtDEzvU/UulWT3ish5WsIbzplZnAeHcPvKKS0Y2JX/wLeCrRsi3tC6h2l0ZWxMkjy8ZKqt2aQgO27Cf6sZ+O1g1N0VyKwIbho4YJ9X5xIJTpNwFbdJocsf2nFKs/MXdIAyxGHbkGF7R00B51sBbjXwc5BQeOsAxZk/g+NnJW52lhi+FMrVxIDmb++hrt/JBpgMUWef3w4Q6Jdhpbra5oh3biLeJk9njFqSlz9nmWqb3exPnUGnMWRdaBvd06Qkvar3ARvYlNWIhiLpoLsmUiL1HJ+xUaU+iZ953cE5La+ShPPMrHJavelVGwx+jBVHatviOgQ0ythz9MNBFGVnq9gwl3F04rG3gBpnpXtsJMvrOZUPUjnlJRcTNZeBhEl5ppzOBUJLhxyjZSbW+TE3iQ67rm/8342Mt3cqYuAxyLh20yUsDuaha0uCYzxv4S7vgEY91F9+RzxOw+esdQVe01SpV2nzXl5cp+2n/QWQ0gKZe1VVo9RGpH+soqRuWFc/xiiQgRIbK6L9d43/pwDTvxzgJPiao5FUHX4Q2k+N/7z4W4fvC/4Qus/ptz3jDc8gCqHRdzx24Awrx0nRiJir0pDrvWq+QNloDbn+NnjXS0UlWZKgn4m3BK+T+UCosfs56WoyUcbWDRZvJrTg0o0X7KWCMmD4tZ09EoEgMd/CMF/90eseTKolMXjL1hco79K2CJ/7S8eBNh/q9SeJE31rGrjIw7TpQgINcZwWNTmmeDaqN8qy1LtF+bHB9cMCmK9QSE2HSGABUT56rkQLTMOlbOuaFp31vEnQSRG7nQ+owPozL81uUfWb7+cdPCrLUTo7SWmVK87EbslUSuEe+Vv6R8OdJjvERvUoQOJj0ozoxEQptRounvNCLFVFaRfX0yIEa+3SNttpBWH/2+UDDTFHI9cJ+x5bFzleTif5AyHVHnzqo8YC+ABr1TgHD8394C5i+1keoK5D0DZGtBuUA3TheEqylMpy5nd2FBKBQMF0A2+kpkFt4+xoWH+RN8Uy0w3vwwc+fXAbJuA2m9Bq3PYp2bFIgjrNgRgei/6cgGSYn/Zno8X6aFrSHEpJb35e0P7dCDsbHb5UaaxMS19wStXstqdga5WwIvABkYslt4tCEL9konFLw1kT/H3KalpZoUZEdz6RTWJ6Te7rTqFXUDjiKQBUx38DMMjS7dkGMO8onCiXQrn8twAFiXaEKHFmzxXQ5u1vM/pK0V813ZvoxafECfM/VMPTQd/j485+5wKScSQfjX9GCMuBciy+dbap5SkJmmTXdoVzb2UTV6D+8vLkSWX6/NB8mO8Lid+oOcdfmAH19yYDZ11AtSxBWxT5csTt5nAzoM6YbureQLGOTqJYnDM9JnXMZoyJdwA+IX1mH0WvttmThtHuUnACYcdO9lh0G4vM2pu3JDvmKdhr2G01NE5xtoswsPX0g7gUuEj76Y53k8Z3LfK3By4UtnatsPvSPFJtgGfuxTM6mOox483ywgcwzsWAHHv6gTw2hdyGD0ayshK/DtCTsTSR4+ME1iVVOSeIaLIMVQN3S4kfoRexCWlZlIDMZVHlkauK8Iz9Y1f41+Z7SEVmQQPX+hl4q2wBMEedqSqA/0gFEfRppWXgSNtBbUoeQ5Uv2l/22RaI/k715cha7FLAyGq5ctiAL3qJyjEBDtsEOJoWL90YpIxPy5olRCludvnSN34zzlhD3qEE47vuzEp0CkAMsALJE/aPDSHpYj6CdfLU3CV3nZKSaoKpI+SnJrmjTqccdrLRJJGMt/7adIoPtqmQAIVWW+NXlseA2PTsSWzbeaY53GjywhDV0c9G6lG3+RL3Xi0p8Xouk0+kIKbi8FtbELprOP8veaY6iyEL3lzD1GHQqU7zF9L3dPqe4ViZf8i9VVksQN5bCZmMauqS6qIxLuNcqh7ki45XxFNC+J0lR5KAVVBEIi+bIOyBu4+bBY0fYBuatkQtFb24R7DLeNA4jXJYYp6XxhUYoRN45iC5+OE+2W0jayrVPiaHkVEgNzJ/BVwWNHJTNNfsx0Boz2zc5g5YNvcbanCRuYVdLKZmL28wsF6KMEG+Bs2gMF11FX4qO/Ela+RcjbJatZyE84rILl3kdyxGwoCxctolaXn6O65l+C/JJlfVlwuSiSUPDkrZC6wGIoJywpJi286XBA2LSR0yywTwv7l2gLbiyEYH4mIqA7TixFk58j3ZwqpEa2S0TXx4XbC06NQTR2PehlAnylexad5asufzlmoKbs5Kb4DbOp2yO9ADAOQVoCANWawqw0cM7bZBD/KIFyw2KyqiFxWsrfOzoKZe8rSJMdfdE9gPm+gV5nrW5D+2RooNfniB2Ers4HIML1kd71m5gX0TniLFZNMW9xm2IjXlkEPpc5z/5uE2frvA+MyqpaVfllI2JK+rMPV3ZB0NLZTA6SF2/eryBW9V7x3A1qx2h5+yzTBvAuTTrFVadeJy7uWwEppFiwSUnDI6SB6NluNPkyHok55hjhyfYEqhay6KfcIiOH3FfnUATCLtORjqaYs6DgzuWcVZaHDAAfs9teFQ0bwtO1fQd1Wc/BI9k/cmiYuQEMDASU4myefTU/zMb/bi3HXhkE48xaQdzBoxJJERUKUzGhhUBFUD3WNcLpW1izeQ6r/I/B8yhpAaAugPgFW/kt+W5RPjGNeJYywf1FPJZdQZOHCEd1jgrkuxZsATRgD40StGgQ4BGZvqJG/j5jhNSja+wEx2hsTEpc5jwAezZGNyxLFfwzICEiL5gg2OeUrl8gLvj7KfkLRyebYp3iY/s4X0t7LeZKfP9hUNJckUOJ6qZfzgeJlI/yqcMtSPjcjRZ/mMCtt9zt2sNXOjFg0JAsjPTv91gXbm4lT0ZPaXna7w0VDmdE0JVhyj6j28QaFj93ujvoiPt0ptoS7inThBl2KnxLOMDPkJLSVJQtywk8kcG7tBYb+nopKJNKEttH/kTkwgaq8b8jEy6oWBw4g+KsGdOCPYkVQlmv6CmFDLJHs+6n7jY5XyOvSRXFaXEAeO+94LEylsg+dZ0a7YAmj8rYvO9WxqdZcDl8NDFuHUfsoNZ31cF2Kl2ZbIL9YIPOFr7iu43kRa7/xSYMb0Gpy26kJ6W3lZSOMHeYiCWMMdJeBChs2qMrZ9YVAZrMN73Zn2daq4H8PmBU7QgKhcT0uyOiCm3JdFShpC/cJ6Zane4xYWOrj+kpeOUNJ8txlSvbR+MMy3l0Vy5VpGXURpjdPkH2Bm6oMUPT4bTeLDwDpPheezt18w0aTcUMEccjtAvcFvYPoCtG4te/wsjho/GLq4cx3gu3IdPBi7vE8GfD2OwAbMrO2rNTANQ6Lp5Hyt+RnEflbRl3zn5o4OCzoH6q6Kvqc6p1wMfi1xr/NOo6nkGG9EXUX9uGasw5hWtZ+fx4BnfzRllHVu47xgCKYlwBnGcDR0V/ORdIrHouhlzge5H4izAvEkGwP3hqMEWcI2DDesKiCrDpF1oihrdzLc9R5Ym+CoC0Nu89O0qFjFZhL8B7CJbk1xJOH7cUjSQWD37SVqXyL+lfG9UjTV5m4lKxB5kzMQlquJFgGMClrlZaatEnJlPFiqbjjbyRb3nbTR7q6GMNPGyy2ubp5exlfNL/TRbhn2N7GYnQ7FtTY1MuwCFkrpo92AMBdh2/SohrFPd0Lg1vCdZjyxJZ/mW1Z8Ltly+E9on3BhBe/b36x+zg/vqIqJR/LygEPZhhVvg21O2Xzfp1r9ofVM9lCfbfDb0olkRKQNUxPhw0uuYJvyK5C/78wlKqXsRVQbi0XftP0P4DpNRXiyQg8Jn8oZlcCdpgRO1znx+135cEG6TRFOGDq4GZgaeu47o4Q6YlnsUOEG9U0V3rEAUZT3QUykN/dVinYJ3S7HSLX20UnyRynxQ1HqVcpxeURvcCsc3cHqjGNOn71KGQS/4dHuqXQKbxzJzrVfLcw+t0tMIaV06fJwDPrflpYpsm57FZinb6Ru3Uvajweb9IJbEYbdfLe9cJ2dWIVX7XP3GFTHiMloy8Nibt8UyLCwkLEd+lm0tp/bWRr19ZP2d4lluXSe8rjDlCGnUwNoJA/Z0OsnqeL7Zumi2t7TSa9dWYvyQpOgwoEvHf1j+lK1sOvX+pi4B2EOMTsdl79cx0zjJAMnG2h/emlNkFhj7RYv9eQpKtpqv5Dx+R2UHW/deyOqSLJ0p/iHnr5ge81jSG9b2gzECWf6aqncKa2hNOoYaeI81VtnNezPPhCaQ0kBz2QUIy2wz3EhwtK/STQ5SKj5vbzCagEFXQ+bo6neLIpnH5syJyAoaZQc8oU59dXH1+RobzHuiGLWoFH9G+16FEFSLH10n5cu9Xy0IR9/uRmy5U3SIN+PpNk/p49Tfvb5ZDqd5Zp7RIaFr/uED1ZJH66iHQbQDW9rMCRnX9XtpMBoR1OzMw4j4Jm4a0zIHfzA5Uo+iQgHuC7mgkpeP7ozVmysly9qhyFvd6tPZDUh3qTHRhel+ko2AV+HU1LWKqaZQ2eekgVL7f7meBiF7Dox4IC2+zD0X0PVWXz+trzhfIEWQ945f0HEhYHD91SZkjUf67EFSSwq6X0oDIffTOP9mQKY2l0YnWPDAw/dLryp0n774rvpMkRrW6FPlkkQuzl1EYEAVTz9WO6VbG0DI6YBvfkusLT1gFidsTsTz4MZsAdCXrEArKIsvfy7DmgDgaKsM9ZJSk94h6DsccAYJ2TdBRE6Sw/xqrMTa6LQ71R30ON69sQShsxwVK25eT6XGhSM4x6fMLWShGEr6pGK87K3Qu0OW7wS6qCmem7mrItcUiqrQtoe2yORjGrGvMBSV/vhGaVAHAf/owJ83oPZNReGsc1KLrYwgJ77kvz5AmqtS0Q3FGJQHV4zoacPD5kIAznPhBfJVmFWYHW+abTx7MiwDy65wly0vJKB54IrAM88+FNCrAgT2Nylsm+5V04syXctbR+3XqUe+y7GXi/sY2NHWTL/9+RjCULZQwsgdHwlZJVSiQH2JMXL4kfM7qsuAVa0+HAMzUpcavm4jXOyFvNIHKT6D6+glrGttKpiXZ8XbOGomM2P9uk4OgKMI8oBbplnEFOpnQ14OOy8VPO1NHvea9tSpZXp7jJhE0isUJzBeyI0shv/QKQORyf6O3F56LC+1d7hw+Ice3/984pg7w9ItuslC++EHWXWzN7Poca24/AxJFLoro83V6RJjWaR8LUS+DEi8vGXItqaMsZGANNMFN2Dzprd/q2AHALprJJHjg5tsoKqC2j/BcDWyAog28qtfXsFcpjVgiwRt85VwtWjMyc4QA8iDo6uvFbR6/mQKf6akD40FaJxHetoBjh607AEIEfc+bfEbsAGfN+VEmh5OuI+fgmalJPWnv/TJu2Ji9D5T6jmjDqw/XEkZXOA3WmQNPaBrRIf9XjL24+Ma+cdsNV1Vvu68gzb4aSSqDi6r5Mw46bmHs0f1OabmGX4YP1w7gXgkuCc99YfKjvDn+328LwSFvaEMyx3WfRahERLLYXfqRZeSdlMKDo8s+TXXCml2FL6oIlUqs8sZldreyzRNaD/QFmLyiB2FUbHwGlGyQOMYB6cUbTCvvSOT+JBnzul8nk7CC+UCl/6Ro6JzBAsKguAVQSAHedJeon+n3cobKS9OxCSiS0vmZy9HpOFmH12p2KxxsqLN9ZdYWyM3Pb3jCZmBvOrbbw7SKEG0Hbf434/eUz8bC21ZgTCeUSJMgGrGr6sObT+XxHR+lKm/rSrrcppzRfUPDQQd7e5XcAfXMrxazrUxAy4O9uw+B3gdkwMz4yQzGB0Mi2gAYf6pxzb+6kKnlRqB2YXaCqV1le/zuGQV+pYXRN1vkd1EpNWpOkS2NiwIyzQSehLhSaYjgBauHwZEiTDV5mNq3+e43CUHb8691YJXlQF2YO7Ing/f6/wR1NpDg1gmcpmtG0aL+GoNmEeU0qedKNwWAnEvQLT9vELbRi8u/jrMHQ6kkv2kFzzhlWEstVAJCiD1do7cg4TgvS5bTJy9yM3fIghS+FE0VLUwoudNWtCKK2t8fkIwlqNk4fcnOyUEgIIo2NoKYoIZEHnQAzPOh5nUgPO79zqhTnTx6an6NzmD9U38/o2alS2TRmgaSH7MtRHd2dEWE6PK1JbpQEXPVt+mZHPfhn2uN3gSsjqFZoqCjiB9Yy/ibrNos0JrjTaVpsIuSC1FVS5JbQnwsBzmXX8qzFJpGjEQ2J6R5ty5IhRksf0LxHZ/G8ZK3/qS1qPa5nyYlKIC6wfXWA5PJESiJXvDxnpdD80O/rGhGEaj/L54AI6BFCmj+oUVLb30iOE1aHrW3tovDm7eBHHNmnRPIH4QwVtFgJzjZM1ibWVFISq1t/MQd8uYG23S6WWAfEtiZpnTQXk1GcFjYKtZYswjxasRR9ye6Vt5RYIkRzc5RdYuBdDWIMrY1JRGBOrt3hyPR1CwaQqD3S+oky5mbJiA2sA4SW8QFVmZH5aM14Aet1anmKSaAnXzCT/i+Zdjk+epmoFeLavktOrFvZBxKev/ED8nEvqB3Vv6IJvOomHd+EZztKKR8YcV1DD9Vzu/7vYZx5+4uuElps1G6wMrP0DfaolTdh2lQq9VCiMsYr2GgAr9U6h93QmZsWCfi5YoG2a8ok2YVRSSuxEeR/TQtebO2aIA4PTEGHMEA4k2VyuH286X8em4SScNgBTRag0VAT5IivVMvBSxLfOMo9Ombq2t88XlHYmkPmyGRJYXjPnW4UvSNzyCKhbqP1ydH7P+bS8ce2lhWCpBelmtJtbrQyjo8MRhRImaS9wSifBi2Vh4/oTnVXsv7B9m41e/RaT4g85RkPyLkKs/rXIRHbZUN+ZmMmGr0Of1623r0NFcEbv5NC8AdRsJbNNTeMMfSRZDSlroNT7ekXCoQc4xs3MY/q9BBwiwuUzULzFu1WhVvKrlIL03cWHV3VOhp/NnkVA3WgcfxO5ls+vELa1fRAwFdQXPowbHNotgJWVKSPhXuROW4NzF26mSysFjxS2N8wSg3SYYNtvSDAoBtfaqbVt1xwpT4d42+U3jANNfnQ4mjdv6CVzXyraWN2TFVMJlwfuccKOTrkP6ZZwrrMyUAsDEf0Nz4+pjQIVnqAF17C+yOi/EJmLlRzPj/X4NP2cty6L7xMg9g0nqqEFQwyJxe15Kg738rARWk9eRO+2Ag60WXC8s0JFeRFzRGHH5RpM79po61RtPZHQSUsDgRFQ9SkweLFm68YuhHBwW9kYuU99ZkuxKDFhPzj5/UCvQ9rCLWC0EeGvRNPAdyCJe51SmOeYn+HXcqtMzPKMz9rMMQ8Opsht2oTHK3BYgrpb8th+LG+gkk0CSGe3/eCfodjWMbT6wGtaY5Kttxt6R8ouSiztl0lgBDf9+vvdQYtVo+gjcTV9MwQuOAdZLA9v3BZozGxB8dlSSoxNadFx67azN9iJJTUmc7ag7ex91FNi630CmconJSEtOM2IutUQxkC3FKHbuDCgvZrFNiYiqqMt5hPfAWtypj6hKDeKEiIPjvbNcwUra6w8B01LTsdVuKsams5YQN8eNsFAwuyPy4jgH6CK7f81q+30h7bjuc12p4r/jlgeV0b1Mz873U67aIfR2xyEgAn1DUGF6uHrRh1gB0dtyo1uQBjhnoe31p+60aXLR3XeO1AqQa358EW+WRiL5xq+d3jdBgBKjyNiKP59s5wcsUSQZkWlyT2yDSy+8gqBdjgPeU6ALFdTPApHeGGpTOqRedrmMoevNO/ML4DItZlJETLAsUcjezfvT4j/4uFvC2PWnXHIYxegHnm2AUNREWywA+FnUIvDLy41FYnyQuv4pCdLVbKuYkXRbDsAjKI4nvxkbGFqLwFoQP43roHGfk0eRXCNZO7weLohH5aF72GMoUnR42UU9r1Ut1D4eEjcvc7OdhzOxQ9wIziZtfCdp0DYJNf0dek2fNvIMB7dCAMG1JQEBHYP6xsuVN2eUIOZn+rSDC+ZrLI5FO7jaOJOSazC5IQL5bceq8SLVv0/r7Qgvl4p11i3D4qEssaaU19UiiY8ZZ6C5yvvldzea/IQA9WUQu86Cv0fGmmzkK/gN0fqd/tXDFin9yvocahOPkC16oeLvZxbL4n2y/K6TJUGTxjXRykJSoFx8ra1yzGqqLKeh1NLlsne0SDTneGdUm3W/TNqspQc2Lc16VvILFJvQISdsXTCey3nohCYYJ8SKiqNhHXsr9+dTbh+vA5cgjvVfCPCgzlbS/bKTF3qgOUJqe6SYGnOhxt82YPeAV11Q/mY3u0DCTwyeHjqn1vKMcuZW1P5aqh+uqKK7xtJSGuiArNh/59O3UXJ5BIjrrPkkdC/4rtzJj7Qzu7gZbFIA6ySY+mvJccW4CKAFpWOOpCmPurUUXYRWhB88p1CURGqJvkrfkJlecv8byleyT+g/owtXQI40Ihg1Qg7LceKL2yd4QOrrGZYwVe0M1T+nvGGrgimzeBrqTk+KZOAE/u5FHmv9hiJrs6YVwMF636IS9XDvhUOhkeBe0ysCMESW7orTu5hWPw5aoleE33xKU34TovMDIkib4BnWZgyVK33IE3l/jCzvJZoDBqGPMxTq2rFRI9nLD5y+TMHjO1lZ9tzbp7FWgAMyPdbQ2WftdMkpnta3xQdtuN1ErmMUvNOiBdoikeGoLZ6HIsTqAchPodxZYs61S1DdhbDXaXto16+czJZZnHXm360fBGT7rJF2hKQdGMAsvAz4YNf9AHHfqFGQ6jH1040jyf7sJYEhox32N5CWPTJLyAguq6eJWicl7mHp10ixmohfIT43gZWKGed7MDmRvLTN3chQeqd9O8Vwooveg0jNzRnpavtzqFFEGcpjGntT8bGLVJEvdXCQnhRdVYCYocnKelXh/xE1XmJF+iQuvhZXleJRTuUMTzs/sfFZ9ndXDwmnLVWELqDz3qCh6fGiR0PJ8JlM+Sol0o/cV2eaCmGDh8oDVIlawcA+LoqG3tTdkXzHXZDCEfxQI5AERGb0+4+sm6YjonOJQrb1TypA8tBK/JdKuB5WAj51HBczt0JXxMZUrj6UTLErzAaA+sS7jkAOL7k7DAXAPbRKlSMjqS1Ds05+De6IkS/mfaBWTcoBEelMSHYCksuA1LbW7X46Jf/FlLWXd+Tfut58plB594l3oIDBxdLQ0KMhqE076wk3HPk/gxZsrpnMZETHC49wbLGwckOGWUIlPeDozf8E4GA/FcvltIJNB6NycClB6Fm8mGu7qRXqP8QF7MdTgyi/xJ/0L4hFyTbevxtrpdFPg+ujSgn4cy5PhKP+C+CPdDicXshCgxNaGVcmGVi1+bRgsc0Nhp6w5zHYatksnWXDlx8YkjnD0hjfebSNQ2bv5A6W+ORWzwIpQR1C/CLULy2ujhs6ykFluRoQ03EK5RxUzR3fv6FCL9KLCEnpwPj+5C9qgPoz0LluGE2nKSmdvNp2eJ21GyhIb4DOcdq4bLPLHrCN1ckMXjnahC7LdYPU4lUmqMXOmqsr9UNE8+Xk+zTyCOAziVMLUEZovVcdQC8vH8J/EluGp3Cb4pL1lIPGCUg4FA/y0aHOP6MIAeFUT/gVV9bnPhhfjYh9QbM+3chNIdDHvpNA2yZY/V0V8cEkyLVlrhZOH5SIRpHM3FcYyYzHIxZ+WoVCoRrOG9m0E+L055BwSU3Tk4MPUdB3ThixMNz/W78FZl0YkenOx4WwuCCUFUwRAPGpdNajkm/rbX4D+fB5Km1ZMCeJOjbg/17atpEA7SN+XMM4olVSGafyOpj7H5TV4lAyR4dOkgoznX5Cv8ANWOJG2Su1ejafSEyIdXqNMHRoSRFuXChh+cVcbLvKaVvleehBdShNKiIxQw1AyVg7T2K0DX8D95BoZwRDJZAKQhIg2WEU6LfAQTqrdFnfja1rqhG1KDzEEl4MSvjIHbnZ1viLNXARjxYSZSdm17Gcg+dyWrBTV33XlvlMUwaudReVDHiWE5zwSLd+nAuO6ch5969R769jngGTj5/wRtjQRQ+FPMDJcKhqSFlJv/j/PE9W4Q1325Ax3uVkby3u0Te7k797vY5PR581JuNZ9guMSHCt9+5MnUhy3zPloO3YObg48b2vV+Fb+KPjmOPOuP0PU9gDCifJpl4+dV1oJpNFtUBRLbZu0MJjWOwhgxJjaGGiB345PxNjsBPFiGRtw4U1XViC2Q/XwlAiCZ9BQvFXPnisJ/XWb72nw1a38803gAUavnLVwD5D09pIi4BOVaxewjlMYTFyYHha1yZcytXz276WvedcMChZifb6bcE55xAav7XADxKlLMNbLNv4sovSXZMfh/pa3zzrV+37rqTTpFmxYIdN1qnedGlbFzum5DswmWkouB4lM0rNhtpxXD+/LlnaqLMYVsEzi1SAnzC/OhwYYjh6xVhFRBwG7FtNF+z2YID0/vdhDBCHp8GV1/B9HaCroE8SedwMK1q4+3uRlbDK+P9Cy/BImGzwGQ5Skk4TWUzas5ZOweVU/JhXwjKgCVJQjji7R7KraXivM5/jBQOH4+cuXzwPQn/uaqt5WG4dwkAsN/H70Xw2G3yOhYX+EXXI0vGIJpC/m3JuQRu7Tr9Gp5q6bigYIxV0dco1jYnSCQOC+4tKQ0EV0N1RkllfVw0BGGyAy1mRsTOGla/3P9dhwF6k75YhqfHSDLWUNkNwFnELVVtqVDkgGkffHfwbK7B/8FhGQs/wqzqINy/fJlWymnREmNVykqU/3xqY2saHr7cNz3G3sICn4Hd1TxXSR8iVtDow7uMk5dkBZJZaf1/JcHUzI7QFgLJmV3S1B1a3dFSztyRH56xI16r0QzpcMAC9gO9coZwsvP7uaRogrfo5r5T2NUcwEdcWjPW9Y1m6/TsiNMcQZ/yYmXnHXeguwNkBDaN+K+PzOnntTy74oOU7tT3W/IH+86ZuXVsYqqLymLW8il+V3TkoTnwzclKeDnvk4trVVi1TAmJqDFNpBOk/graC2sj66uF4Lf3oxbW2J3mn0L1DDX/0JnOcOoabk+J5gsa2Lw0kFzLvl/D35eD+q4TrMPASWaaQ6fBQtdz96fgNrOPdBG14okPx4uiuUHKQWqbDePeD5FchYFc9dg4U71jLGmJmot1/4y+MN7TxTNk9bQfuW0YngJhRQfxS1hucnEs4Ho/So1ZgUBuMwP9371IqByE3MWZott0V19VlhysoBA3rBOpoAZw1DddzXrsP87cRTsxwNHKgvXp/khkR9E4//T0zL30gCOIRhnt0HFIOtfo52qz0HzI5N/btGTzY0kgZ4Y6/ypNwCim8GKNJorFiTJEIHB1yvXt3Zrq/yl2akZDX+jgDGJRgw3quNJ/yEPf2ItdUrzVxk1H3jl/bKTjBEaXN4W4t7s6fXX/TeivixUYCNMH1yKRawbUTJR2cpq24BP1mX3nqBM2jBfesBirJsiSpPq5zjZ9hFs6oKFps4h2ZVEDpA7KHKapRunZf5xZWH2SuWxKQAywAPVHPHQ4I0AhWUlek1rHcufobCmVJU11WrO1d3Fnwa4zNxl8DOZiMORG/gl9D2xL0472rS6VcQSvC0adtHTFiEm5H3LfQxLc8WElaJBqc16OqqMHgppTpdJGxtwjLm9/NT+i4YdADNSTSfarLhP0W6wkFgAvfekk9ABCo7iQrGonMDqC0UCof6UnvcnkBDQiWwXt4natvD13ZO2k7DroEk76kd7wqYvSTzO19mCJu2IUoKXxTKi6hHttNqUbEFXWymbEoh7GzD7ZD5/vDRQpEx1tjXlxkIpMebS427WkYIPCRHaZg8PRTJipjxqTXBrxGSFBJU9mXb+fGpr4aOc0W//BlHdfgJrOBXhRerwiBkbU6ijqCnespZ/Tw5GOOrHVfVzZ1mK7p9mJttxi2n9HlAEwyTHQ852uNu2S6gN9c3Bhi3Apj2pqHoj4n9dvlGwol1Ffonywo0psHiphyeaVI8b2aj8kAFpjZBDAueyE7Yg5p7HWkCEHSrSTYZF9uTy4DHrEDerrrJ58fP3a4FD2zFszpjmYsTaKwy8viTkW1UAsxHBa7KN89JxY2PRib95LgHLNh7zedv5CtemBz37G/Yp1ah590OSjwApfjgR5B32kF3eY3NvYL0JbzFUezi3jVhCDLGYMxpRenHfEeYVdtQCDHin8WJSrWLU5WssxGfGEvyX1eWnkUoh7+4Dwqor9XhsLGCWe91TdnNT0MZXE6R6KG7nPvGmzCWDE7EkBFkXMBbBhoHpEPAw7qoAd+5+eKK6iQZIL9yY6LCeFHkRfKx4hg3YNo6mZVWDxMd9tGWomq3DtVWTvWSE7wBCK0giEnPn/JRd+UFgKJMz8Jud39fnz8g3XxiKGigNQuSEanV87yi06A387tMRx+2itPcRaceqKTQC0LFhj4gENQqmL4/Y/wSWjS2xtYN5FBKjUN6gh8MsNsC399I6qgAii5yUvs03NTv/Mwkhuo+cDGZwthX6Ngv+x3IQPYXeYf3wucFySWlg8rD2QuAa+WfPwArBIr7hsmyeicx9gNw5xLoripGBPhiFH+lUyos8/FcOZ++BzCoam9sk/HVPIusQEvqy2dRTgs8Ye6jh9KoQ2B4lj980izv4NWAAuxUgksxA+6y1/uUn4BNDWFAtZtG1pbYIS+erD1n5wvLMCvIiKHXSSmcG7JaomSq5Li8I4suUuTYPtpEh1sJgbK7EEb4lFlaRELlrP+2nZkswHtDvPDxmgYnLVJyhTWCztKlt+LQbWGPTmQaRMn5TbnMY91AXYIVQnbiHYVUBD8XD1O/ZfBUshiLGCPcMWjeVdTpe3p6nJ3NUNKKOHj/KU6RcaqZZOqubs+TvObIdV8DesUHD+rP+0i0ZW0yfKagV0Ha/pybtaCl/1zbpGtuNUEcsV5q0rsTjf9Z9P5MHKrLkoqQZSC6+3DyG31/CnOqeaWByCpxHw4OongWV3xypWjgO/CNBEIvoNly3UYFD/bBX56/0Nl/ARZvV4isbsF1f3jVbZArkdZAkgPCr1/WAQWJ99xziXwcTPd0cTUiDjUaTDmUOnXay8j18rZWlcKzGUj9TffoMeI4kTXkOlcRFJTivwn0Ulrvf/dMTNISrTYYqutzJbj1HAqVW2CuxlGNDGMYrYnJVIuoZn3cobcdnzypzPBrLx7WVhHtz0BzMlICJW6FMiAXingJuz++NGG7fBxzCX6x2c3NZI72qn47ijfO+ncHW/HxuA0+m1PN3FfSkhjDCjwut7lX/lSiVRMOiax85Yyxwzx55YBcWEHrl8sp/Hfe6mQE2YzpmHIBajaKhM//8qP9a6XqcHBN2Q7GCdfc05JYokVyOxkTbGl1SMHAGyV89c8t6KVaQwvghua2hqix1hT4G0xseCDUaqnTsOb1+2rHh/99o7ryBlwsiFehGPSqdxoCqAH2ijCflgDDh2jhdz1SAPAlJiAytftYqze1u1aVTJwxAqCPOqrpukGTAqLqbLgLoLH8cP9mTnUhCbmRcgIlU5/yd/B+IXrHbY+GiSc85gVTps823xhlQv3GpXwyWHsFTLAeToRLvEqmHgT+UXCXIdOMTSUhPnFWojtDgFjhLoSWPcsUQW6p/PLbPUAxF2QxO76ddOW5DDp+yT0UXa6mMm19Zo0n4IkhtGYvB8s6cE5XzQTgs5AMWuXgJbewXukB6o5LplKgeCNxD+Z3L1w5MQ3HEW3An8bqzko+xfOlzItal2FEcoVxXY6/mMzoRvXGBFCtCfAErban8UyoLvkBsLGo11u6WCiEnhIeha1yaMdEjGnp5E1JlDufM05Am1z3VvJNDgB4GDZ26cQUdHDVZasSzQXU14kxhLpJbXRkkhhQPH+P6f7yG2pD4mcW5wVv8lY24iyzYIEdOwCe+8QGyuZCU7r3BaWezgkWF3KwZqps1hc35b3MJvRpBLe4j5fiDxZBuGeAN2XFWLqX3zzyiMM5D63RykB0cacQ6HlS2U69nvaKufUzWO12kaXOYDLnNyrvkOXJKFdgWF5lebRW8gbxSb09lon3rsNYLdVm4TjWbqIwyCMMlZy2Ugt98Xb/wDhgINW3l3BDCUzeTnqbiIOYDxwwe7m5V0IQxFOMK6pjpHPz/si/kapSbvaV70TSnszi2r8Gaz4R+IydOreOgaR8h24vPlqMFIas+zIpIse79DZnppmx+OTEqMqkaR4elOv6qTq/q77jpmAqniaj8WkFVXcEZP6/JpJScS/GrRDeJRCeQeR3dGlwtw1r8TwySXchOVZQZ4hedD25Qlx7rCxVBJw2/Ghgkufs6eDMgMyvvUzKaVLl7F+V02panpCbT9CZxEL7OcZLWMAVEYUm91wPfkgLRvJh7fUxU9K4FpLcWy1T7kiAlNBPY+7wIbVtBuU6opnBXW7f2FvzLESo62HJDD6dRVFw2dmWUDrFBzC4NQqBsFvgkEVjQTVx+1c1cIZwbpQsmwJ18G6doDb+utUUu9SbYy4DH919/uvpra9stys8SZL9H+aRP6eL9jx8QSpjUugm4LhvfJl18+BQvPKZQgdLzDX8nTbXSHGzpjfzI0I4cy/siMx8vqndwQcRbOAr+21d8S0FjL8LY7Ov2HdgkD1HeB0LG9A9+AI4iq6nJ/hGK8LK+9EH5M6wR/RYIuR50mUKJmC0WbXIwXoaA9MPdiSzn+V0N2NEhcPGfYGbVu7qce8jarDN1nJKoxJlu5cIVrxp8SWsKxvWgfSeGEKyplR3wUpcpdIPdnuYkQNGYug6FfEWBkfAc15K6T3yK1FuI5RDRgiNUJgCxS4bfgK/TNuEpuniQZKoaqFH/nridoSFrFAbGgrtqnwD9YK3vqV9cOnjBsPj7CJa5V6zLG7fS9JuOq/XnY2LZzJBa8cbHPnoG/wPQRiwZdUDfjlGMEQnPiDU4TpWPuWHM54EiRaC+fP58yDiCJ5jTPvcZL0r51xEqIY5YiGtkT+Rjc4oHpxOyTcWlcackYDTit0+ghdFPt/BMPiZSc2LVU21RI5YtDH8PDiLTjPXdjV+l/tczFM3vbdu3K9RGbCmhbBhHV0sWuTanOKw2qsg92pHmtMzfD2IgvQ+hi/aPl+E0bm21hYnd7G2ZCBxxF/Hcl4nXnDryumG6uVCXTHQSlFeUQyRiykvpMpiWq67MhJiqawmZS9JhVL56nn93pzvKRI38B2uvG8yb6z+kyCy9kV6pGSJOfMN0th+g5Htuyy7XpvYP1zC91pfSKLhge9c9UF+idA0i9tXtkCl5vSHTGVBsnxTntcEae2v8+guJfnLZsTlort3QiBjw+oxDrS6xkbDtGR8NyLZ8tPcDGL4/PoIY9SXkmfmj0AAQq/Ja5/EVzwxjO0yr+pErm0IamBBYyAK1FwuwUit0dUEJqYbuZofuaDwU4/1At9tQC21zPvxNO+A8cnWu+6qeDlfWEkBfrbmjvZWrV+WPIhXZA1gnWn8tZrkdDSdNAkj22Nrg6/75NGhvBO4gUa+RhGc52PbcjoByux0o9irhHILvIWdMg8buZ5fUoMLxHMbJk/KaAwjkEVWAHv8TVbN3/CX641yQ7YLBtfG803Jwu75syJWDCPojpcoVgVieP95O9FWMyvS2oaofjZDaY+5D5wCrARX/y7JaD1yZaNWqHPk/Ka6WfEjczVaIeaQXhmWKVdg5rxp9K9b9MzZfkQZGGz5WFgJKAkoPCDyGHLiHAqBS+5dyZQQOL36ZZIuVsQMI9Z09q/17DdJQJbTlQfBcjNI0rdf1U2FcvWu4ljYpTfTb8+pLemQrGpBxWWUGyydT+se/f/pucbdH6KYRTLsKFy1cY7irYij7CGQBZktVSzX0RcwbLoKLpZT5m2h+6gnqoKNeJMrSyZojySE7h0LZl5hxigbXv81sc00Ye7FjJHI1OVFkMkzkouPtnVzN3oROVMCMU/yGAqe55AFKLjumnWPvPfFxVoyuPrxmRxDCG6vTdRhcJwciJ9MUUgJ2PsMZiAhX6K0o4xwFxy25/IJoFrx2oDvjN/pcT1soiEA9K/nD2V9YaxY6Mo/NP0wHQ/CXek2InjKtqrWh+yd4UV63O2JXp3GvpMnwdHFgaQOdnyMvQUuyIAWzED5QpMcMmqOqm7Fsyf1H/a57DztPhSe6OfJ+hj0JlJZ6tWzzqofMNgZFRNs5jrVFgFcw2bu2zaC8FQaQrwSEOi8VKiDvcpfibnS3Jb/HQrW9m7tdbAdD7hXrHzMtZTuGVFxjlDa+ftImvpW5zwDkSZwHOPoz4pylw93ljbd1e/+JhNfAycZ+pX09OHMbqeo5+FlteyYwYeBNRQ4XdIdjngm0w4LzPaLfh4Ee2zW4KnSNZRrqZGDPEVylwo/Nu7Tf5/XIHPL0kcUHC6T9Ztttm9w7GhhNPBbmdJ32L9q+Z0d/nt1lZ27isS73yeLFgUtQsCUyeNpH72+OjJuvHSpDPhSMokrN/pm08tyWMYDS0mTfmC5Zfqe7r784cEiTnhLXPaStTSrmFB+dizJXkg6k5ElMDCup3lbfQNmgqgXZi9jqhQKpUoGU4+9seN1zQ2XnNzwL2RmOH3QKwPAcTJYbnjTRdwdEsnKbsWqxIJyKoQCT/q9ApOki4Uj8B5WJT2McqWqDszI/dhcNVlCRXbl/BRg1872mdtcMlwum40o+0HUzp5Y4DfGzbxecuiSNHee8Izt3GTgoLPhQyyutYQnAff3jJ5kIVoNuK6ADR94aYzzxA50ptD1r+l8ifAv7jSZeaxVG5kQYVl4Y6ochZ44TKO0u/NiD0UW1YG9poI1qY5CdLXTJ1TL3thLihv4z27+1lxV9vrRzYGgS63pu0Uu22K/zrVP1U2UsJnV8ECNSlPQOLfDyXDOUup1fVCiu1LKrl/1kqPHSwiailbSsFBb3gMxaW54VuBNCPVEgeX2a18IiAfscttZnZ8Mc1A+L+BcMFX/bp6yoMiUoTSlRc3N8JELh9wYGAd6cPGjMDSHYmsX4epOkpL+ozgoC5zNK7erMWC2gUfQeXiJ9t06wSW5jSRQ8zllRHLKRHLO4MxVPtMf3yPfX4LJYekT79DCJGYj0s1lFvCsVN5Kae8HydbgjQ88+VcRe8hGfR2JRaME8eHRGW6WXmiHw0QZg4jhuiLWC4lwA70fqN7pDlZkegc9DC8iNyJ9jr3vsO23F1H+ZdJpBhZ+qHw3nGLczvkiUMHeW/5UiEFAldkoc1PBwTEBM94g70P0bosWuw93oMzEsNRgODk8yXGavlNpsCYV59Upn9aktwI4kS4DTor7gYJuSmtVu6bdcQMK4yazesd0YYwMMa0anvTYm2Y8xaWCvze02pfr7Aiwo8fmUafejfoWOuTGr/qobZd6ISXZclzy/7l8tl8UK9vUAyWsEwY/Wy3uFt1h0zUO9/Ok7DDP/qNUnl2gyF62pzHIUWLNu4KtI5e7onZT/CblM+YR/ylYfUuMTOsCA0mrYoVytUKnnhIRmC9Cg0fAsnaYtD/oxkP3Z+cdNsTcq2E2euj09ZDq5ifjlEM7BbJITDIOFbvmnxNHvdFuq3df297UwBnxn0et1S4YgapV4Ewtp1YN/S5P6xSIKFAeMCxww5yEC4S27K+uyArLYLIQDmtlV0oJvvnFrbEVq/14Tqg4xT69tj2nx5SjbSxbRhFCtdGpbHM6sr1WGLgv9w9trhxNseLsPIN+acCk1GONQmR2GETF6i+/v3V2oEdpWYQ6SBnM2KM/5qVvEC5Brf/14Xmm+RbvdXdZWpV430QbzHplGxbgVyPtihHmkUnwqA1jnHYLErCiUoV2Dst/Hq+FR4BIr9mPNBEvKWKe4kKyeVL6AiH8K/zlK4dCCeW6hCxg5+4hzzG3tRYf1XOLba0wjkS+j48L7b95Xp1jiz8Gd9Ut94FnkcaEzKtAzLN14XapSh++gJpbTIdZPjoP0G7J52FFpek8P7wnJVPTN2F3zE4EE8ceH8HmBZXmj8jTNNztxefPBIS7yO/yevSVncesZzj0RQL/HAZdwc1EJRFBGeT8PCCXiehrKAEHlhMhLs4RQWpz2JMTADcqO5WorG6oTpku96yZQdAwY4csyUi2wyYJk0ISrTWGvFM3ChVoG4KrS1s69/QLnCmZ6Cci2v4Gl2cjrIva6WTggPQ8HhVFtSxN59/v7Trd9tImNDrYIySUy7PqTkOBTXKRUqpkTefBO1Sg+mHa+VJwdBOARkAyeRkZyFKIIzJG+FPdMtNuvo3OYGjj40cwAemLqFlu7cY3Ycynx/TWhV0dVq6DXvHIV08SG9oRiMU0MWOyQG4E983ZlrXnIVTajYll8pFJ6MUVlu/23Y/py5HZNuRpEON968Gt9e46i95bNM/mFtEsE11r4FdTvkNPjluG/hhgyvh3pdhqwpKuxMehtSyRe9M3FX+SIEziRU4QeMfddvRBFvp8sLD5n5oUf0aA9YDTjc3S0VrPdlknSwM9NsdAUbOJS4WzgVxNISKk4eiyz8cR8gcsPqsZBbrRaM7dBDsYcfQyPZZ2ssbaax4W+AqRYBLPsKxC0XJN3JgD60TatmcgtBFikcx+35RNeH9UF5VFiOXWnYL9HaZ0mmLr0oiXEyD/isTof91b0Rfbh07REqg+GXrEFzXtNkNkkrK1xmUN/8FAn86vs/q26gapvhEnLpDbHjFFepIoK5vWrAHR0GImcGeMIawEhXDR+ArTenUNdyl0+ysAH0gM6eUpfH0X8xfnVkyHfQMPyDOVIYdL9YQLS42U1d250eTOjBj3jYcodGKVLd3TEKSZgTq20s8FxyePTQZX3B1SsrShnpcuf5sKUukNWnJA/7J1HaE5JXtlmcR2AtdJwWjwXNU9bNjwvO/DZbG9OdtvpU+8+FyrVKjiirZF0v3mArCKe2O8z4p3Hxegs+xYrSJ3gwFwet7KzeFn8698HaSGVJKBY3Cu7qDIq5GbLdo29tWTSsakqv1lAR7LaNHaDEY4hOEB9iBMdIfcRE5cRGEKOnQj0iEfCxQ8Phd97KbjuNi7HJvBxm3UDNM73Q3P99+Ns/PbJqIcABp4s3jVP+1Smxda+ZjpkgWRsvUkYU87Olz6ODLcOZBUJ6uqSHaLX5CtSY22VOwQ+Td2x0bV85I+tRMcOiOLdfVCJ24V6EJfvyyBxngczp8p6y7J9w9wAl5bHSMsWiJhsTWDTxwZXDrly04YCiJqhVU9F3DmFlc55uBCwJl1R3NyRnI8nBkngYcAoPzBZNCAMWuUem1VunIQmndlZw7gNNEQf9jVr8zS29h7fN1prvvd5l6nhPgs8lexuyQ+mTF6hfkR084wsAdg0dj4O97B86dGoUgnC0tNMyZ3DF57jmoygb3M7Dac+zyIUwzOPrnagM6EsaCN/tpMBdFmgHRABJbF0jdHQER1sA9350kRSwbClFWRaCeNh0jItXEbLUlrWNyCfQj9x5AX+SdOLiOng5rKVyNY+desWfhN4BDtkbWAOFW6tCnxE+qCtj2GgcNvobRuEfoc0mMYFwMMAjNvrdvt4QIT5aRpNRwRhdnvERWBio/QmThQYLIhxhfj5nL1MegogTvSkbYMh5RzVw/ZCcvK1wGcU8x+cquVjeDgbxPbnKqixjts6S2jPXAyBz7QcoxpSfE5zrrdy1lIoAJPZSyruch7utiDQr/Ai19y1KItkV1g+zSJYkxQze+Z/f4XdZRNOUdNYrXn17e4p5O2PlZKOVNs2nqaZghztnuh8Ogn0YHsiVg//5P8B2F+tXDu0Iq4AXMUNXX+uz1GDq3FkY49/ZnvlD+mad5YhFsCcnrfPlIoV5e1NTVJ1tv9z+taY+ZJJm44g+gV72eGqc/sGaDUwYWqPRxSiZUpfHI12gr/eo254Q1Rmm7+CdBhYvvHTRMJCNxBj9/fJliS3e5LZN19Gkb0Y/g7QDTORkCLof1qaMTyGJ83sjYKsk5nwKwGvwAmocKdegR/7wynHYbUqeaz9TL6PGIXLQwLB5Dzeg+79w3PWolWd+lWSJ6rXHF63QKIMpNqrtDILyhyyaPejskQTuEsoTGOgMFj6z0BDwe3BH4TQp2BVMXQWG7Rc09HoU92Pydk3A7rszO48iqUAQPObZwXcpKOQDUSQK4MmkHmTJ4ft/FsWsfmyqttVOw9cvh6lNGjfRk2CEZvHQrNei1jfzzls9glC4QYOastCQ0mAcqaMQ8xFRzt4it6zNMaYwqiJeG78XisUeeMlcaq/NURdiDnIRtaK1Eeiq1hqmDkDl574UtxdM9jY74QPNFDkVffESv4XGz4kEAXfhRVsQ29ttnGyYPdD21SVpgGaXw17NvdvtQEk+8728ZodvzTrf4q+V/XxGdGGwyM49oqyFdeJlj+Gnyt2BxQM+B+7J2pdZAMn8qEXTTJVvAAgJT+JzKdXMYmEk/7L6emeCdZmP9Z0LDAxhbzCfGjCYl9eMvRbUvyjbCkgkVEKEWIJNnQKWxD35o8s+0OSG4ZsStMC7XyTBdQEomnpLp0KQtbpRbTvdxe2YHDVOSWo0zhfr9ReGsvDXJv0YSBil7UDrbfc/YJ5vZp5dOQxD658gnalWLMV4PsRpdyRiwpuQ+ZYyd1qhZeROUs/pFvjD7ZitLPOPKYdZKsv2bN8bKFyLKpM2LtIoyvmIbC/DMyrqlddGyARl7l2qF3n8vhfM6NP8rieqEuTK7+0aY5xSJqgA+PK30ymWKjiPaaXjsCJJam+XQKTSlmw2uL7wqRlqTOSWzD9A/w06s6soYgu5zmjevVhsX76oyApJpp6eJS9my7/ZPPN1Mpv3u9b8XsoRDGGusPtl8plkC3i9tFAc1xjWQXCbyA4Hc3y7DfrKpYENFWQTA5SxLdGHqfR8yd7jHxff2qVlegltHunrJUPiSPx+ai/gxzMBMuUnpo3kRtXKPBG4dluJMQI7/CYf+v9OYbg4hL1GXISB7815DfIgcfOYMUPBmgm9Sk7p0SHi0PaUqzxsUk210xDRIesoSraIHgDGcT/iP2hJUkZD4EIcWiowmwm11CALNDTGHQW+0ltses9XGcB1KOshnV/BoD4zRB1uYuF8CHMY/ArFqkB7x0MV4qHNNzoDrt09jZh6LGn5f8IbMnvr6DfFNz07pcIJmijiBerjrEtYCE+23Ojqym8mKtBw6KmiTg8E0Vv2Jap36d0NnklHudfcrHjTm0RVmEXwGmjqCiUiRW45zv7PV4TiJ26tPQ+L2BPDshKOGizSynCkhEwvPMKhUCwqIhY0GAxUo8ohWzRhSOPZRm6UQOFe4NUyRPsfG0yy//2eVk9sh+mUn4YG/qhAhpjSTykvViVCSLhuaGtb98/NcPZJSRts2zJncrQfGXOSNQJ/JeYAiLdDpDHvlZOD8Na+zfrl0yQYpFPWfGie0hMBZmH5Ltpb3Btivr3T0TQCUZj+gqXp162Fvg80VgOs61RCYBIpzckQYaP9ADUccqZdfb+gTerS7q6j8rQvx8GJzxm3Z0L1o/OYRKIqZvCPzyuQXj9coxj1/n6bW/0uCjTeCkUsc8AG4azrsssi1Ppf/GH3pfAf/jIWSa3Fp+96guYTMHBuoLG0oX7Z439lDrzYe78cwAngV6TuOJL+SSsyxhCoUyzXl525FxUALfirpqEI/v+s2Lg4GX44pWTu4hPQW1crDlaWntvmBUFPKyhvQxRAkXfyCvkDulqXzxrl9N51Cow/US67BwDYN5TRh5pH0OzNBNSnqEUyJyAoeP/GQvgzvkfTl/Ox7FWpJLGnGPbA2Vk4KtWD11RKiHbjbxRMI9cLb16AQj+VmZxahtuqecs3Fma9D90icZDDeaUshAwa/M4eYR0WkSXHDas6bKIquRsA0+3eOyJhXjgaPYhrEbncAxkimIOctSPuo2YqQgyZmCzVEhrxFCcZKWRvYwjz+ryJ55JhGR9TDmDK7B8sUhLpPoo7Fwj/r71pxTQUO7YQHOnQkPhAHaYuzMZGDoawBHPqxI2WlMtsrIuVc47esgxBkh8rZ/HZbr1o46p6y90eDwK8pwhmFlji8IaZGAlvCQRJwyNSpgdnJCmmg+XpB5yOZsTLS4mJp3y/kSU51AQ3Ob9xm14zVMOhHwJklMwFCrG3URI4tp3FshC68J5lW6zphdJO2rlnYl/ckXgJuazd0OJ07/k7MRt+L+PSHJNhPy5Q1yu5RCrurfukKjeqpyS9NJyffve7dUhbeB2Um/jGXHug4/KsPT7RZi4yW4F8Zsa3EYw4qJEYWMSbeL7MgrtxanpKQX9+vuTWghGyFgB1hmzEG64ayBH6+IRKMPgA5sWfuG/+pgRxe8kvmhn0ZC1GxfEdVqs8pPn9K5SuWtGdSJER+lBTtW4QWkqqt/7ErUC2YmWIArARJkWN17LwYR5VCyOnUG6E8YmQwoPzNFGb1QXr4eybzp31AHYBaloDkqAFbmsMJQPEipWKgiRGUhy6lDKr3G14iHuYR9oar86uw7nMC03sWBhk9wX1HDDQbIC071sOXmuebBQCXdObr5lGOuj5UjauZEb/JX8UhwV00LP25S2rpQYdPDQlUn8eUY3HyoA1dWbKBrmMqNB/sXunOjG9hYFmAvX8ib5g+yyi4AXADUfu33SmTDOEP2YtZ0PAMVYXevPHpUxM4sI7LVTCwlQCxJkO1dUaQmjID+Sy8qLuDOkdi31HUH7mL/kC+hkBdIgugMISMJ7+WfgVriZ5BH25WX7DYRRiwRhh1zGLVE8rX2n1/bwYSfOxhE5rGTCCmfo7fDKh6KBYLWwiqNFXs1BHTZqBtN9oY3cHN4jd21vDl1YLo8LnFvTAir17fXIJ6Ga91x5ViAl7Uu1ndfofcoAgIsPS/uGfpN0XQe75ceB92+grm3wZun6ibPo9I7R3j1Wrplvps5lEf9PInjobhs98ZrZCME3Ey4dh88nzN9NBrJvAWnjHJw+Pz6v46xs12q0rjqt2hC66bqSwJMz17M9Pvi99UUsql7yAGjnUk0bHgHBOPBnkl0hZWV23Edx8n7WidHDmmnL/KQ3q3kw3IP0L5X8RY9afpmRc0+bCDd+8wkxw+9HAT2yb1QlmoThx5F3DmNZqbMOxGd8mXotI9A0nQ3wFYrPrc+nQadfw14cQZkHcWePoakp1KA5FoFzg78VKp/FljZaRdcZA0rNp3dL21kxgZI2ChLIK3x7a5d8hzhXzwSjlb4/GUXWNxYCPXw92/61VaAJruwkAOfMbXp6cuS7TfsFpFTWuzX+XcR+itFYVC0z7D2s6uM7VOsKP6YEx0bkKWrWJO4A+8zUD85B37WtmSDlHn/9KtykClUpXbXS39N9QcSv/OSVOkUI3K4xkh9T8/M8FRdFbHjd4Y1I6OMyqsIV5JV4dOjpNi0//vp6vfbjWBg2O4REU5KOQOKZ4H5v6uRce+8ycCVWFJYQ8zmTUcax628nrB+LQwiJI25nMLy32nhW2GNag2buHj9ib6/MhaTgQxMus1naonMtFq1B6zIRFZ/wJ8MVTSDhzHmBubt1LN/bma7c1OYm9l+jiGV3nTFMyHTKznhUlDQ5+NBQf26Dvf0k/kEuNZgs0npZEJF6aBV+xcqRQTHj3yEAy5P7G6jx3Fseay2S4ppvMGdyIGrvZkBC14e7iaXX/4Qp2DJZe7bX02QGLnyKI/NhKRhKIwMd9Vc0SedZunv3HaQEE0YY7ulqi7lZR4bpvbUkovJjPOLKYncyFr06IThYK+iNJffhkoXS06oj/KwdZqB9GZH/OawNDciZLqCkuMqfICW95OpXb15kMtvLfViGve1v57K1pvkv2J/HAlkmgleglfuBxd7Eu3Cnman9LABCf7A9Khb7NR3/89TF8gAGNbxN76iguawFQlC56l9JraLj+Fy/3x3FSHmW+ixqOgyz8YWz9SeUErgeJYQvTXSNdqWuicJFICIpDIrRUweVgy2vYojORgr431zP0J3a14TZfSuo5CLESQf7sKK+Cv+nBKl2SaHfHwQ4quPj19kIKLNv1EoZaWgOY/EVbipoRP1iQDcZjHRYlERN2et/BwiCY2hObKqda8gvM8nhTYN61rMr1nLsUpijPeNbZmZ9aYxJMesjbpCaG+2DI6cz0xYEdBuUjzR/ljh62tFYbon1sdOlUjKdcr5L3PajEDk1l2j03iKqb4ZoWtYIGM6LMqLN0kBc4PBUPnydLgXVvrvG6otcZM0MWxmx/9NTVjJjGVvpLCyX2XNeYoK9xuFqAt7NyhBiUnfTSw+pVKp1wHCwtYj4yll/BdqzLQTH5aKGAbgAlXoSP3GPTvEMAklxZCF5uYuZ5DuvnMkW9ZGYSecFXOqwOKvw52pfSB+JfVKMPbOCbG8OAzHrOHw8Us78Z6UxaCCn0XK+WjC+yAThbkkS8pEBJYHrzmG8V85mZPoLbI/i1FpjuwoIbwSNpVred5LvTSIZpcMtRjpvW96C5jtiAVSZZawrHng8wk/kqZimoPDelszOVUjadjgV1lMCj45UdSl0Y0o/hqB8QjPPnjrbYe0Dg+z2U5AvzV3tslnGuVd2tyaLJtCEoxB0mAQtb5Vp0pJtzwRahkbN4c9ZXqYGlUAGw279uoC32wdr8ZB8yi6ABjNPAPsSBRaGhDF5mGy7/tXtU87HFU7o2ppKnrNI9uupn8uGHf97NI/YGGexs7p/Gh6DcdugUMRI3lUA2yKpFynw8STV8M/bi5SJ4FkkwCxhT1ygQLJZ5zGnQ0M8yreIVSfxW9V/nbdM1Tzt5iVtw5J3QhVvC0YjHQCyRb52u3D3rQMNgG4NTZ3V/HupqMzLV8UmHACm91USUgMQV7R39mYcEEeapxAZB9nd1deQNN27WjMxV4bkoMokzvRjeVXHjORW93ArjvWZK6GKoypXo7rx6EEgWkQt0yPW+mQ1I9jGoQNhyn+gW259U3Mocxdbm1QGxwz7vXyxq1YtvuAorg4Kh8xdt3t+l9DPFrLfjxUAPRPk4u42C2yafEBs2WMwp6GlWNMeHr/e8tp+VM1wMVK9DIIDOdWj8AU+AaQMGdiBVnG3+jCuJs2+oPzri/2MLtrw1tFeWmaY7E1o+PPKkm0WWcg09Mh+CeWKXFaeMa4G4QiTPlZkh//D8zVbEybFfau72LM5KCyjvx5LAchgwHAg+icF0B22YFdlkgLPwnU8MzsVEzVE5PHQEMrhndCoULFnPdfhqz5OKv3f4kqckdCY0pXVZU+3sV8OnBE6/lST77lR49YyVcF0pKqFZTYrYQXUvpbZB/nLorfhwsDj7+rhhMFmzCbLN+VIpJ7I//kZYO42LFw12m0cbczGWOKQSCsn43w+Ur0oyeqzlfqWylBS2o+QAwSNogMz5vxzkCDTN7qpRw6scjP+TsZ9yzBJz9oFFLoD8S6v1sq8LNPxmsVACb4C1idUmBbe/QG5MWcg4r/KVS8F4pFkBym0yK9nCd9KRxF/R9PdZjf4IHgAScfB5f7n2SBVD5AKNc4IWrMJhw7cSKAwyxXcA9rq60l7NoZIX+8KUNY6hG3XJkXQCvCxfetdzx4Mt7rlVhEYNlK1tc+eyzUIdLmVzpdV9DHRrbk+ez2Ra4yGUVlIMozaiqywCppxuu5QR99ShvAa7KZgdjj/vyimQgy+qLVkp3iO0opMSOMjTOalQEN2Rojk1/DjITZS/HVKGF7M6D8XIG106QqJDMnISDNhk3DtocW6L+9L4domRvO0eVHR3v7Xe3wTCfIrnxHjM6fDnEaSSRreYGeUH124GuLofYMIVmkL0G+8s/zIcMxdO1AcQOfh/e/Rc/jUAhTgXoL9kozLXMBxEnyS4ua8arnePxoamfsrwil3ObhoXcIyAMtRnUspjXepEXfDshEtXF/8b5AgfdOjXgzXa2ekluGYVHTIYgsI2IBz6GJ2qXxVd6G2ns1x6NRuleDNQgLDa9JsTg6X+kO3b2mepMPDFx4bqHvq5pb8V0TtwOeiK2JrX2c/8ro5trzRc0IR2PECn/ac3tfpnAneFO6sicxuYm7cywWgY81bqpDgin9ZXQ5H8ng7ba1aR2zf81qJu8zOBW/cHEbqYbAyJgZnu+U8gFhtRzPjOZqC6llRroD/x0h1ksxj/PlVF8KyBBkpr+7kbIPyYqNjkTXMlocyVMWIoCXMPqaAAwHVc4ADDzD7qOLXA8VuQ0+ETvsh3QBlz3aMwGHz9IiM1gMhxw3bjdlKJFW5j74zDb8hsVt3AkdjsXUUCJxzi4nAFtcrY8jAmH0Ogei76hwA3dDFp1kMjMV6orjxV+lhCqKT38gd/LDP0mSXIQeJZoRff4L3g0odjvsFN9+CMrl9S1tvYo/ziIEt/mu7FfBam0jpW4lfZxHtZcwAR5dBc9tSmEhw+84cd+c+NFj4ebJT7lXfUHx5kAv2b5zihGEIDJR6BnBKqjbJ1Fo1k8ZSShMU2hJcJUaec1FfML3GAfJbd9HlmMhStItlt7ffmXAL4lydypM65hXS/oR17fqRfV1Dg73nZN2yARGmosvYRVlTHDN9spkHA5R9WSQym2lMQSwkYzy4EqlxS/Ti1+D2LEE6WhrN34A/EOMDYqZooQVC0sBK4Cv8YvWQiWHoZwQtoq4G2dRNUh6q4YsTfdwUuNlZNsmSZXe3XSSkfrNmSxIWLa7DSQLcg+/LLxbDQli2bcvo1wpFHSHNQWa4Bu4Ruj3Ux42wp0q/sRq7Qatv+iFYlo/p50ReHTHA8Mt2+8IDwmHt75Sc/ZOsHvQTIqpMiKOjQoaXHz7xV67rVfIBskjQK21WUthXFz+3Vmec1ndBeSzL00yKyltcm+1ghj5nRRsDeZXzcRa2y+/YADHFgZb5ZeOLQrGs0aFYHVYruyIQQjzMzS2eGIb1F4h5sMrj82i8P780CLQ6H79SkyFMhQjDbDRjJsvXiTZmPOO6GozvhH33pa/bDd9BURGjQ85RCDfJRf7tgwTu+jZ3sNJwvJOkBWGK4UeRsg4YEojUDcHPOvSjuKjUlGss3KnHUI3+TT6JBOgr+L5XTYARqf1kVaQF7fk3GHWRY0aeL87+oYwHYOPKdX3gQIFxsyg595yf9ipkm4XsYtUEGQ6wKBSs5ryMMo1+lNMwMCSgexCQfSc2yAzB7Umq1X+XF+Gj6l2UHYUmTP/9D0gBkl8n5K+OWHxlHbYoD0lbvr8OeEoxEWAfiEVhzQ3H53vP6HgLv9YiLwXeoFsNOiR+ZryZCHvOqARYYgqMnuOq4Rs63qmnK+pcNkG+C2c3gIDPH+zRmV4xqoC9xOmB7EoRrlZGOb4fnrXryfpX34gqRSGDUb6GG/L+nV0SUpdcwai0aIIruQpzrjRiDC4+dxn+/gEzOLv9YU5OfLVsCxMRkAM7Z8fThEuebdvnTNUhjy03ea8dNLvEamavAkaazdVc7muyYqhMV0OLmW1Gzl2UKN1o9DLToI9/Bt6T8bukqRaBvAqC2VYDCZqGtPED1eUDLfYt5noVGfpjmhp8Lm1GHlsOtRitJmhr7R9PcPSrBr4j10nYRqE7Y46fXXC7i6V8ApuulbYRJHp3nLK+yDNaWUPsAH+mtlgSR546P3V4fqBL4ACPkr+J1pLvxgfAV+eHbA2nJr2kCqotHYtBFgIq+qp8DbDXGvOSgor4frznZRH/d85YKk1Jigv2uNVW43LJYJnq/ahSCBFmscgr/ay9AJ/QXS+hPh15fZCPY+LoySoj10dskq6en4vz4mZB/Rirq1u43bVaagIT0ltC7wCKMGq+sWpn03awyBuUaYOrvBBVDjM6/iPEvQ1GFLjRwH3qVtWCyOCaDQ3lRFOavCjIjJsZ8jMw4nKPS+D2xp2NKdrkNJK60qG9RXPpa4p1UKY3BkpbcjGdFtRTnP7z9g5APlc4LHbz3niA08YdXoI4PPgHQKvZvyiNYWGtP7IJIlW/HLDXWz75QmvFV4Sble4H8wbMSkI+CI5g3XzmxNsH+nB0aLo1HC5FAr+Behs3a80ny9RMsFfwwodVzRYVhE1n2Ehu/t3qDkBRm5SJRtDIncoTp+uAMxp7gTZJpsXpaiQpKCGZlmfA0pIANU+AV3vepOrdzEMf2wEb9c4go4CXsoamW/ZV/I1nfRdY8+c+tSxGlu0ojLN72o+VEUZ09/eFPdaT4APhhmeHRzuwQC/eEnS1qmmH/ooW8YZh61A0mfGWQvWrWG17RIc6yMP/8+6AHNYAt8+c5TZ6ufWs8WMjRcSzE4uuhrbhqtt4QIgQQu87PhSz1/KWdT2V24Z87j5RnukMBupqEPu5crQcL5tfTA2HEqb6dv8NSzTZtZXm492+2LHKy543m5eTCOIJvadkn+lZn9qYYnB/fZyP2lUOnU9Ce13JBVDNXsQER1fWCN+o/GTdFffdBlaISBx0NEgDUASlFle6+Up5BNfJXPNhw50bGmHJZeb9nDpWtiP8v+kuz4u0Iw+oZ5qqhQNGcQ6Dih6NGjq5o57RuvBVYxnHOfdEeaQsz5jXlpnbDTYlKKk5gSfpe0mr7v2yEssyx+M+/BJrljXWSzUSQrZofV8oUkH2Hpv1xn1nYtZ3s6t4TcRmcstyd33IArXhf6Keszi2STLfLgS0Qo/gIE9kZRMzIYM4YF8xJgkjr+NgIAR89rUT73tuGGaq4ufLVHNelxzu8pgUKTcNjesZB1cXNNx2j3KTsuePlEns5ntrJs32UuCTXoyTpSK9Zh5qa4xpxE+y1/5Guj8fSPB2HWyzgIhpueWFrrG+or+pIZrs9NzDvt1QQKnOtf3C14DFhhMvDkXwvnfOvUZ9DPdeFgDT1A1lkrvNHkQF38MpdaYhs8f8w0tn47X9TU20QsczEWgI2EqlmQvGFZ/TNy8khooGs8Xhsqvx2irTRKSnOE2kOShw2ylD/YHAhNazAOB91X2fOdCBCnFak4dcl0qStgN2JCP+nE0SqKcmh7K+Wfpb42Yb51TUEXexf6lHW6epKnoML9x0Zq0S8DSovyiSJ+x1YzB8AIfXyHpN/4O8Ry9pXzaeT7FJkxXsdkiZDx72k9sUKjfmZQ1Dazq1s3XQyYIqulUJKumeLaVClIYvF2jgMImQwY8ESppPxvPMtYDkrJbwyK+4r5w+C/5dzxrBvZ/KB2RwlHwL/U6svwgewETIeafdy7sV7RM17qAEAmScIOZwIc4VsGFFDAtDQ6RW9Voa9zqnqhUViJ5KKV/S58f2HAQB+UkRyENbe8G7SkjIm5FOjcWsu/NEDeWHnP8yVP8edCvaoethxLa7pmwVSUSchE2CMVsPUYfaiZAINA4vsLHFdSrBFIKOC/QINwF6yrvRlM7FamaQAc8P+3ijuR5RxJRpUs9rg0xFUHsfSDROj/08JmbzfLPHigQMaKJ3PmHQy/nezk5GoCYzcMGDbw+6QtR3Yr/5nKpjU0JgRsgkOL2TrMEDq4A661gXN1L1+hXJ7lIO/7DqDPXUCGEzayNJUt2K1Mr60nD45B+tJT0gfiQftUNb6yZbti2JdF39ZZYDMlaaU7bIylUOLftUlfbXnse/fF83COFlMDoQYyvYlKI+Ov56VZzodUlqvUdRJY814w3g4ZwAlpMCvKbKVXJG9m+0exGZlunpuz42Pcj/AaTf7cmKs8Nm5dyVYBrUpEVgE3tqM2+Cj9OwkeP4emjU6ScHWpb3DR5C4IS7xXx8MetZM38QbreJ75cuhxVTzAemH2PDwKVBHFqO2bc/o4YVhJoo336hQH5mjI9U4BWh+OQLJDvl0nFrWyN/GkY8gwBLxQXF9zGw7f686dEWqgf+jujD8YsmcgVKf5XktKe1uA6AvmEgnfQkJ/tuF7oUwWovHiVTznAgyyIcaTP1x0j0gMMEn2zZ2bJscZzZ7fY2rJYfUv5Qz3UhtTKh40RkhIziag19Rnpe8eXs9ZGxieoIDEwGqXRQEP9IC2vFT0QwPGIEcXGi1rIiERP60XgzbXgBq/Pv68WcLrACZvD5tjFS+E/socEc7ZxMjE3kXlRdLJpoVWxe6I2f+RO+DI0IRIpnUj75q8tYhZeATuq+k1cJCAkjHw252Z0Lgoc4puATuW8idjF5qbCTYu6U88g49r10ygOwL0LfqklsSkjqn0Usge2XuWaWFNpbzNbO/0urRYXO0iPOsbnJkBIUwN06RDd/r3VsEeMOc2gsIxXNcJ8mIdOVVbrUYJBBdCTc99n0LivIs7JEdNtrfhKXwtsBfFu54v+JqaqFE8NXiHuTkEL247dZO6XXiqGwsI+Qm1mbcTNfXtg1GfDmriw6pRNWt+uwQFuYwCxznPDy9cqaruojdacVK/AYwUjfAlScEmJeEzSp1idY0eahi0i3+6twYTIZc64+hZMg5//DTTY9wXP9J7rPrRZ1tUUBX+9L3acgnrHR2HJDKuzvyhgsapLP4MZ8snjKvdCmrs/x1dcwXX8OWArqNFc9eCr/j8hNq7lZN6P92hbG8IDQiwG7qGpPERFbB2ryv7uKbfNZVFmbYjJ2nZ2MGxIBFfvwIw1/bGEHtNZKw40j5ZqnzoYyTrEDZPg3aLQnfTf62Xm6kNk+FW8m4RNJt/KffKfuRn0W5cw5R/MgJwLA+t5h/w8G032k7D9t2cfiTMQF/KfHqm613Teb907Wmt8Bj6bBCQEoeJCXPlnNo8hhKH1J6RDQJBO7t3EU8jsDzIeDkqMni+gjhbo+RCGmf7Ui4JV0+/x5NhJpus/Cm4JhhtCFRwKCFJYuqvvist8hKzkyQG8ZSdfvQQbxA8KlZOfim+VG4VGQfIdc3uT0a8jm1FmePUPxBpSHIKsWmC8N7nIR/AzTv0GqbP3gZHqVWzhWqogp6doJyn9/7OTeCc0oixZCh/+X/GfoDLX+OGScWIWuLgigx9A9fGLtZgcXKlJGI5XbwNpkDcD6iBKZacVf1cShN3lTVt99rmFSzmhgQ+PgJywFe4qRHZfwuMHN637jcPqUny47/T1PPEYpMvVcb/B4pOfIL8n8fivHd4iWvR4PqryJM/V7poPJQ12O9L5lWh1dzOSoAmoZfOJXsnPVAAIOghV9w+dVzgy3SisFlvPnIsHWo+Gg6jb6k/CkPWgwIVafSe3VRh+541XV+oNMp6Og08jCPOBwKZxahrsHgIRcvxoEfvWUzhh6ST54pLVlOrclMe9m6L9ta4b7uJs7wbptlPohs+BsbHFTSKFRmySWF51VLatJBslHCx+MOIV7GerkMC0Mb9IWaEspnIgFXrW83yjbDaRDBQTU5mfvZDqohklj7KfwwAPB4qusS3pZ8lKGv8AW+azdc9F0AqVkmvlWaaxy0lMtczwtCWFKQY+ljDrxPeGMd1ZLnpcpAaBFUsZMw/vGFq8r+gaxac4lHescYr/WXQuKrUL6CGh2TTJABnwbN+4H+Q99M9D9Ec8gYqL+9sY0ema9Kc7uPGJaAImMf2LEWphHOeLf6EXj8uyo/FOEVtYL/324fc+PFoObtAsGXP3u9NkZGB4evlhr+Og8GCT4XIYJRzwulhaozlb4am64nhm/3Vn0H6M2zLa3zYoXuKYynEu2MWahayR9OHHV8J4ViaeGvAgfm66UXb+lQ4/3CtmHws9l0PeaU2stTkjqHroSIGDRkk9j19DO61B9wkJnzqxTsokol5a0ViUgY7KgVuVlZ8+jvtU86JgiX67X42y3GqLaBFZG5W76Rco1U2TKd202PJDLpDa+jr96wMR3ef6wxny55+i9Jp0iqSykShWhwyqFB1OS4yavrTNqJvO//VFEE+JVuYgFtRH9ZeWgKruTuHnlKRe/o2rEsenBy7M4tnf6eXCVs33Z6hQ+DKhnCOoybXuMbGu6sRDakBPG4vhq2oBjZ9boTQr8yGb9odnwvzEClc4c/M60rQihi65oIgoQ9gxzlvyeENjCA/BgSIaM9+rVzuxXb2RkBy5BfndNjgz1JHvz+0ZWbcrhP4bwyKLcU3wAs/hOkN04DYjeJgi7Ca/Jd3ftQo6HEC3Pnq+b2hQLrrb5ezAnV5vJp/NVyTOfRfUYyvpRBLSWo5os8YC80U7HQ5KwgzjONgtnYSwMZ23SNj0B4p9lcU8d5oJEz6GGsKmpuNy9GxAYVQ5Z7lGxchj1VDxJfOSzBBeuPfFDg09wKtFbY+1ipUFeaGUmdyr9/Y03wTXFoVee6Q6AJOpbuluCaas6QQa34KIKnh0kC+ZmocZSe/k2BeZyEFVV4Lzio2XvRviQBq4pIY9eQLtjPDQkVHUiljV5nloPbkdAYAQYB4yQPf7357zYLNPTVgg00aqmkAsXxSa2fLHchGaFt4m0pu+Vs1fTnDQqLA9SdEbyVwL2rhNB4WWr89wdbjuHmAv/esAmKviQpZ5fjOEgDrmpqSIDQkh6Jju8UyIDkd5Lo9yH9WoeJ/jR3couzwQIAtT3dIiO3HCjbIaYNKcKQlrSsPIpZJUbJKrvUeLe+eDe8yBi79ejQYh3cSyVqV9Ozl+qNfh3IzLQePtZTmgA5RD7tCBVtF/BPsCoDrLDMIixZkmBx33IPHNN2WPptI1FRHNxTEfJPFEOr7JY6NuaR96TMohHwi/TfmaHIl7pTtmR7Vl/r+aFTk1cVBYIuMGe8/PkyPeAu72xaESeTsE9Zp3IG1kCj8kHc/Nd130MxYCxToaXzZJH2gIrALfTcEVo9w+PSiXyk9Ip1z+y3i6QEErbok8irKxhHuAtGuxgzROAs1q+2HMgcDv1duYVBjqXFgi4UFL5ddwnglmiSgwX/K+hVTqXR9G+KSEqJLDkgr3r+FJoN/wTS+bsGvljsvRokdECnZvTrOcNZm/hjMWWfvMV8M/WfpXBgxs7ZCYxe6NG9oRhhy70VOO5plMmlU4UhEWTSPkLiyKxYAdvOWsKlkpc7U0maQNjlR5WFbSml8QfNriUJUsrHpeQbOd6NzJikWkVwMOLTTgiibAHU+Loo6gC7FVTiouPEQBsq3NfrqHWfaj9eTFApJdLymzngQ76J9RgxWriXy9PE772KMbSybk2e6Vyq5oFtNaaeey9SLg7BH4fjee1Ii/yxBYemjtefBHnZ2Dul+76yCDnIblwDbjGAFJf24lfwlnPEERd4x+z8+yyXCYHbICXaAx9UvKs8aHwvXcx7vXHs4WmGngNIqnpTSpBBYm9JGZR6G8rAd9E6ZhQ18Z8hlMOsrLLKyLisz3f7mtcRRlHQPnTnTeVnQAqLkQbVZ7ws9mC+1cONxh/YtXiNRpoP52pAUzPBFeckwJpjDf0+Tbr57qsszh/vvheKQX2rWVsD8cm4pcBmPGipOAtSKoO8qLMI/VQ0wQ0YGeMPX95Qk7IZSB1RHF9cu5P60cpyd2UVPv9bQPG6nntqFIhwTAKphIxUibfgDeAS+JbwWSinfrnNLQbJPVx2GJlJypPR2c9iIRaLZVwXrG9GO/xg+P/O0nuFegfW+B4Csr5pG4vh8KvgDGw6tKYu4Zg8ZATUwsnwiJ68mRopo6LKjcP8h77sOiUEhJpPkEvtp+cv7KicAwh9dIU009Pnuo4ZpO6j96xETRo5LzpfG3FeJ+Tpv8aUaAziQxBlo8UoB0kCJWsvBFnrtJKHqzEdRFZOZEb9R9elrbSvlZjGvjbKpPnMP00WMD0o8aGwdjoXs89V9ubJT8aYL82oYtEY+kd1Ylhq34Lo9qXp8NuKMy3sW/JiTZXmeffUwZRs2Y4sEFqTL4gipAD7UF1BZTvtv+YL4mSxagd/GfZXcf7zuhwAkhXy0LemiAZ+BjXtKU4tCKVv0WAzLxFeRk+zVLqedB+RnVxSo0hC0OrbLe1d1CNtYm+r8J8dz63oAuzQoLRtvJGXC4fFrMzaLI2ejtexm5Wza8m34N8iAkQO4N3dWTMe2iegCO/JtUm9ULcDI1bVvq4V5Vrx2R4ij92cbh5dJkT44n8TjyQZZj1VLifyPKN9qRlfnUWUBQxfweuUVcnOOdRXioF7cQ8RM13R6MZU2PvkVJImy6/MkoLhewm9Z+nqb9yQNJuy/ENhSDm3S3lvkON59UTrIN4E8kEWEyJ3nEwQTkjIw393aDhTnlZkftevGZ9vt5EJ/NJ+lJvhu+pub3noB32Z8vVBjQS1xOiQakCKwZiSw26p4bwANk2QkiJrrIpKukfGMD0fktQj2e/gxiUsap/5jqdhbO31/9Buh+rA9x9KgphC+RZMBPZMRczA5vg4ag0wjpVn6yxrclvnaFt/s3IgdjT1w9AuNQTLUQQ+mMO1gi92RLzVPgjbNmQXzgQzAbb/k5U+E3bcxWUEKEhiZG8zS05pwLoXfkftYjPdBZEHAb9W/PQBA2eoAYeX7SZpjD3oXMUK3YB5ZrVB8hRtqyB6tUyu5K3gl8rvwMmiLPGyZuw+jEmUY8sJHbWlSSpa6eIQa4cPVrmZwKsXefble4pDqQWPQwRhoO0KB6Se06/DsXroJyx9P4A4ft8NXFb4pFbAYi1iCaj94Ijxtb6GCI7fYEhACkAoidGTzIYcCPe+f5wwEkwKOjTFYCMl547qXuHKvynXY+oraS39PwnMPLxlLM/4huvnaKxtPV9fXd7B0o/ddXMalrtVjY0kuvyBD59GG3Cp9nA7pjSrr/fvRzWuH1Ogq1umLuDdbq6xS7ix5zCZCyuS/NQZ5jDBNe5Cq6M6RFVwiUGZ9fmtLOQJzN1yeCYbAcXsq1ZuMmQnpqMAECpko+7NAt31eUCZN84gtCcte5SUolMRvZSbmjW/I3jxUbIDMu1JqfxLQ7WepkPAC3trIrk+pH7eOytk6Tjuf/rjKNXf7v0s9ME48mEiLH16WBR1rr1PDfLMe3ee9Q1oGrH9UxL7rZPUB1d5T/6orBInkTMDG4nB4xNr/ynmRGL74+SlPcnC2i3WpcMlx0fA8JywfWrQ87ZxD3uCAZlZfvL440b17NCqbaTeWCLnnTZSpDCm/OCmZ+w9qfc3BThx0ZKA6BlxQRQjUKVEF+3jo08ukqWcPGmH+svm6OC78IlqW6qRrdz10JWlo2nn98tUps//vRD6MMlHVJmafv6uIsIkgxCtcjJ4h5igdijsl7OSPr5cqF1N89K5Bk9zuxI+9Sdt6lrTipZ9zX6hhgdqfTLtLTpHK3rMhhYxKkVIPJgs8XG5LGNFdThXWwbyd0YnEU/Vo4mb6J8bFnip5s6GhlL3OyaXMW7vO0gjEkwR4IfZ+1INbrg3lGebH+tsJD9egctEZTo+NczV8+HaGGyvdAJi5Ae0e+muB0afYbwnQ89nSgU0Lc4v8QTY6BEoDHBfjnUP10d9mCG+SVXI7eFqAUmHDUcjxbg/zHBC5A3fOTi6uWiPTpg9MslSVrNvDWsCKKWMYG1tGXfUmvFsU/ZcPw+DhGNcPt2321fUmj5WIFAL+2X+OShKflPB3rQCiZyD3a7R41KzGsAnP+2nuWKlS0wlQD4gbyqTebvN98izTOS0OhO8CImet5bkRi9Cz2u0Q4erKEoaHMwf2Wv2I/u2LsYtmt8EnDElbH878c5KZPyCKeG0kVS0e3HI9K1LgrzDd6+iuX9iOjX9yC90gG9srwCVo6OTXUzaRBE81b1gK09U4FyUQ2zWagr7EkqfZAixT+5KPqb1M5fsQw8WEi6jZiYn3brs8Dc7Z3OqayN6wp9r+2Nidf8gpJO7lz4qjOVF3vD0kEQ4xGVH8rIYnfudT5+u1zPJuY8yMRoOiI35sPvN5ykzCwRHSohI/NJGBgerhZBrBDf2uc/+1K6x2wTYPY0L/g9/U/bH+irSKca6fGPX/hIwKGXWtAE479MeUkM5zQGuBghTXB7KfoIi+im4wH/wJZsEFIRNowNRZsFMLDc+SsBSC7pSQyG4y9N+qc9AGDGzD5cegBVyHnEsRuSD7ACkZI+bSIMAPeXyHbWYvDTtUJ6K3gkCOrl6pWywAWL7dBzHpSi34gsP049sB2s/EdJN2oUQWStKTLVClEeOfPfGhO867NoCMvZZwGOgkdlmbLu6fy5HgCZAInmCWNWg6t4ctO5z+PT3l0ma3cGo+MEbAOLgYCj+sA6MDnBi1Zy8f+DjOaan9whWehxYEYmLIt2ZhqUpGu7VQPO9R6rNcGIe/7d8are3u2pkm51yDeDDgwXE9rfXzjv7Sy7QNSVkx2PBaw/f+cQk6n34+KZ6Iwq+gR9uod8JApJ7TyS2IfwgkggYdM84/xTxgNrk1wOhP6K8kGTAPcLed77UtKuwok0TnI/+nE31PIQtHfjFUgMAUO7NSYO1jeeHpHOh+XCyeqn5sOCuTTPm9rTUUYZD/UNEco0qFCC/VyrYYizIqBqHjqRe/rmMn/Wp2nnVSEfDH0ips3hM6Pbex7k0YoVqQoWAM8vKoZlgQ3tA5ZlcyT6yduuNILub4Anfv110t5PsIXckDtmNgqqoE918bmkM9HZoA+owW1qcW8eH8lsAdzleqdM8ovpu9VRvuB43VZwX76RZ7HGrurQdXk8Hw9kbod1UbXmQdq/GdBm5Xh9TbmW1R6QFGE4mm339qE57/5WDFaFJDkIzYnBgjDLNpWKqSwJT4T+aaIONnDVTpmxFfT4RzbQXawOQ61INPAm/NAUcl4T3/DawDbXlx/dcC+UTTWfozR0oTLt3xE1I5HsVNAKu2UEaCL9E1olA2gCIbAE1lxKYDhMKYAFXX0eU0oEFQA6e9Blr5b4TesS0d7nVdkh5hHFE7C6aWaVk/iX9jgWJtaPFhksUjINXP9a0i6o+uGEdRWrOiWJIYBBd+LUPHhp6TsisbcQ/YB4krFL/7O8o9iLEWawmZlhS7iwWZmSEIksY5JX6QRcD4CzMeMtT13ODL/lk+QhY8F2o2La31/ixYR3Qs8ZK26cODbzkEuweZpGzng/1pSeNIQDBpiOgG+tb7i7mN6EnJoBt/fEvt4qQFpgjqV/FGOsiu0n+QFLOXLq4i6jGR0qcmvUd+2xrOrny4TQ0nvE58wbPupd04Z252pDTzR8SNkI4ZHAeChXAyHfq14IDw9N24QaEi60d3kjBlkPi2dPMfBmt8foOvbmvBdj6/mSamYAO7M+GzTQso/FE1OvNN0rzJI0/+uzbn9aNSzzc48jX0CiU/h4fmATs74dbxCH90ZIQRp1kcuv9Ib+hNnaOFOiV2/cqyXco+xFWNdFHsPHra8UYy4qCvOC9n6koHF91ibWlr0mmlpobRL3GOaxq/2KgwAoZskpVrHCO0Y5EUsHy9uCHgbML+x0KiUAVNaCSCJrLzWG7J/ftymjVvTi9ipjCtkJj8qmgvkqusaAh0XsRIX500/4zjSdrxUhMzVJOxojghjKwxEuZ5KJavm36bjsgLOtdJR/o2HfeBG+fiby3Wgip0h2yeFMLDpUaFqfU909yM3PRkOk2aQG2MO13hvYFBVaDoSfrZJB7z7bbWoO5ftDQLhaml7cnI/+S7Z9J++V97xaekV3b8ku3RGLpGzAPWVZaWbjdMUAe6StUZJhjmKlzGnSX/f82z16w7edZhIGHQq9LFza638fUSbHWwzQIibTRrD3XGuxWzvRKt0Nx+G4N7Ig3xh+6G8YlQA+taKQ4xxJcmlK2+pcAOmO1JLw3Q1h66z46GoZujWLkOCbKkZp8x8hpKJ6GTROY+oKULwR8DtJDHHIP06KUowBquoemnqGU8aE2QoVnAgnXdAaER7ZAbpVuAa5BFWhVvRjeLJz/pJyFulxTjHI37nH/B1sj1PLS78+Yc4V9qb8+K5b4Az3hbexLwOF2Ay/keZ8dkuGRS0ZCIH+RMLJAN2JETJAaRlQ6Pcu/CBK0nsBhgrDeBvQXnyMFIfX9YrFo4fzAtoyvJ91cAHwfo9iV2ELHtOvxFeF62wqvH6y+sa0j44HPnmxpB9xYB3e6U7w6k1ktYfyjDeTlEp0jPJanin9LEvgB9j8NuScmzrpC535qePt962PKWR3hPoMbcnzGtjgAMW1OW6XsknT/Ni7WtIRiFsLqgHSnnapFTSofoMoTRmqVd/p9Hfb2L61JQzRTIwHXSEnIVXJrlxDHWoUCk6eYYHFQb2xGIsIXW53heKm7EahJLpWOiDFrR2DhoEib1bxGkKXm44IS1JnHiVSR6Cqt3FnlI3jzrm0u1if2bTeB9zozMwgpEmw/hIxY3sTJk8KgVxXwu6NlAsmjbAj0ec0Lj5JvU7zkfBSkBBkwulJJeLHs6r426CXsbSRZZogCO94ZAqr8QMdPTSsam7ZSGHc6IGyG1NTnzmz6Lu0CNld6fxkiRCtEMmuG3OEqFcIZ4XxjlfRt5PcqnEbQ7UIdHFS2YTWNhF8ixgsvGS1rmNya1U8zHNAu8J4cM3vlus71tu9/AA6xUBh0sd/GtgTsYNcyKz9h6kKu2IFb3a0pVNA6CECivduPUvcEk6CZLphnU5xXyFBsmfsuARRW49FjO8rkBl2BIclCzbiPnSC4PW/MgRDzQxFchvpQGsQ8RZlqz2z3cybmySZz4TwcqWUkYik+Y1ZiQpEBx6tLAa1/kAVVMfj69EHInr0UrAywEIxYYHHRZ40iGz/OFuylqW90uIgmBzLLbbSoFNfYGyTbL1a7YHDPg5FJf5N2ZD2bCkY2YvmVESKeNUSO9cjGbBxfahrVmZGN54ZHEK37RAH0bHNvXN+fCwSPu1n8JPLR4c8JHrJmfWqjtU0MnhwINsDxUuZVvSEjomVnnejzPG9dSdt+IRM2XS256odySPqqcT3vH+2CsCX+hsofHCi5NX7zS/jnqhZNlG2DfZQ99Gt80F0R9nfBljkkwEQpNKGmg1w1oqHnEwZM3W5MyOBKFDaok9nsn3LNJ2acrgDAxb+EstsDQbGNJpZRVdzROXUJ9kB5Df/motVz3cseK/qSUPQ04mfOoMilN57vEthtmd7KiyIV3C7Sd/fgR39ssWc7xgIA3dVEAQkqPpoC6W04a8AmYUH0k9KBbeD1T8VatQI2ZjUV3jpLw2rmDimDjiqd5iYb+FtLgOzGIa7T9JDTtBoDhRfVRMAJFnlf9GwRv3toARhI2Jm5GxtvpdUC6D0qxo1x3l3d6i347eo8xM+p4A0GDqTAD0GdqBjc+b84xA0l8VuyHoKCNZnimx3ImakWXppsJ2DeQv36e5fQaZn9Bi8DpAZcGH3mSBeZkFfqhnbkqkYpAZhiXh3Ekwq26YQqtgVOPqv8TYEe67zrMYEP1tXVEwmjkbQxCZuLWM0Q1RPIAVf59QuLjpEON9ckKi3hYbxNXzutKQODUZIEAafIhmD86U5813ktLL3LZyKeV99C8AfHp3EKRdxI+73vSVRj5RKURIZvASGwoh1R+dNmPIC8LHsed+UpaIhiDDZcdrhLMEcKZl4vpfOei3MASaX0aLFLaJg0d1b4GD4snAE+AwsaziiSClgt2oKgyf4D4Cv88GGeW07dGOIhJfRJyB7dZSIsudn2l7+LMhQM9qhdGU2Yx2aGymQyV5KoDCkz+wxsdZE/RTIeg19YHjyWFjvPW4xUCChFr1hEvnSpzj3loFZfQimvGOR7U3DKu6jJroYErIJzvVbqbdnMJJVxCP7KbcFNwb/IIDPlt9fKkQwVY0hZnsjHUqgrkywxHrSaleLhS6fXT/WJlj+MVRdvpIbRhEXAIrIB2oMervzuiSMnYZwcgUuBYZQxbvhwpwOmMLlqDxyhhOtKFzFbwmtvks3eBGYSvDAI8c85LnHqNmGr7iYrEQqr6FHLFZvLSWjaYOnwiBOIG3xzbxzoXYGY95kAy0+6Pg1x3Qr3Y6m5582JkHg2lKwkL/jMT1utH7vbsCgtfG24xFDr55U08VR0B38YduAIZdjoJ8H+TRPf+ioLbtXgoGJE9lW4miBiV3EPyuY5GbIR7aONhkGMHIljVXlrGz/QG73SqEtkOj7XF4UnKwF/eZVHrCsIa6CQH22w/E8EWY0nUfCKaN+poZ2IqxL0wWxW7FJv+X8Wd0fBOOi0E6iy5K5NTZcGqz495y8c8pnVvYeeZPjtWJP60QqqTrHh7gc3gdP7UQRaI49AZZUyCK7wrMXIFOa16QLSt19b57eca8k6lJXeOWYFdMOCvsawwSVfS18WPOMY7oBlavsXFcOEb6sAqfTgVWafZFCbmI4zRDoJo2Kn6qSso0v2imGOvfsNG3pGt9Pqm95aQ2xgL7KVm1jKNqa2LuLMGGwDUjjuStK+gawYggEWPBPx4voh8yj5NMNarVjtui9V2RfvB0Umi4bLKZJTxV7CG6lBwWB6FimWtaMGnTkNMeqHFvyiDWErwG3cd+yHtwv1HTI7mT64zFaUPvzFxoU4N8Mj48QlVkhBm1cpa+sMlQhiXBb++Y2ZVheWLRq83dLQFBAFy957JXjZbN3Q5tifsFj74zJmK+3Duk1Eow02kHTbO8yGNGpVEN7Bcyrj5TihoXac/7mQj62pEcfJiVOOXgGliekbDvX6S8pUHjPwCMlKs/SeAFacBm57eAL0C3+Rpx1UsTupJFUr1RWYdSI/jAJj1tYe9Bh4KSmMrHqhLFuePYP6/HGQCixuRv8NV+OzMCpb8Le5P2bEkoqa5fNJsPLlqUURlqNwT+J1uRFXCj0UNkv9pjr/WAj0naPlQCftWWTXb5bLKVYgzEFrGnyAUKeFJ7uz13dRTAuGVKQqzR2+xTeMaZKFfIxvl7nk8tEeywGgoUqQqfaT2PTZ9Mn6uX14w4YMgCVKXbqws9uRLsIsq2sbCeqpHI9kM7g0tND/dcq011i2eijJKGRrIDimQIQZZJ6rzTF/jsRfDSa6gBaiOEracvkQ0cinq8f/Gd2j8j/Ytz4MgIQUtVn5YkYzi/XltZHd/fLARZyI3ccm0wi+z+wpiSpnRLGN7AiPOBu7mwU6XY50tTTqCVylBfp5D4g+G1rOeRI2mWsfGHisfhb+1v4hICrewt2iYv63mjpsYkUoGnCBWrNOMWtnIX4bk2oGQwvTc0hbxITPddHH2tHN101bgUnbmtoJEWeZtoqqgjRl9VWyyWyvcWUHr9KznoFhBSyz1TKIt9FvpGgPO+QNBKJXiQ+1JEmg7p0wYObnbXjxjn0+KlpUJUmwgd8GDzbUp0sLeNao5gD9Y+Ax17vVaSYE9476nzC6qN6PREewOIIXCCLIjjmZX7WWpCvpFu6Czl5q8Cgx6zKYr6zoLXxKFb4ZQWkTK2ijzUNGjsxZZIt5G1RLDZrMfYgb82ZrL+TClCL4WlUX/EkwHdVPXB0DyvcgvsinZdk50bEWG69E+dIuNJYh5WoPaWJTtEIQ5bcWtDnVJ9ryN4AN0g+iuYm9cdoWPC46mfEU/+iGTZK7if9RW4g1sTuXrrpfrVhv7cNOq7I41VH7tEhBzht6WystlYclJdX+dsNN4zVJsc+ip+Wo+D9m1La0GqI6gHaoWlW3OMFnf8u5p+iLwaJGpWMdG8e+aOLTeNoUNQZwA1Dmh9A1/izCG7EQIPYbIMnzteFkG+ukSKHUnx+1KZPDqqlYBkmbgXwZuBgNYmzj0MfvihDhkViw5d9QjojT0OeXH0tzNTKYE5fBfK0PEpSGpmrBpybAltu4vuITh1KR48VRy3r+ErudHVAOUuKmFFicbRmNPd4lUhqbk7AJCRFoBIRbIsg4h3gfFeQHSCny+gKyyMmF6onBH8h/cOwFLpy9dW/uItz5gj4eD8W0Ro7M2Nmg4AqA1hcNtQW2d8K5NG+IlIZ6CSMotrcivDHA4om7kgf0m4oH3KcKAGJzi4Lql5ako8ezVz3aSoPIcG9icIy+GopuA84E7pRsIMaKIHboZo1aMIOXX2YbSJvzRrxxrbSLB30sWcgFAPlwDfgfVzWV5p+IdFMyvcwubmLrPiO5RRXhkNM84sN2l2NjBG5olJNaYyssGHlBEN4NE05Sjma14q1XopgUJKo7vh+ljqU80mL+kPdMR3hzL9e7iUtiDprylKXyIwlU5FGHw17FKbXlvvdbyj0ylq/V3v559482lUvg6IzHibphZKfxp3IDMOIKuQeT1QuSW2THAVX5cTzQWmqG6KAPZlshc3FGQOzCLXMe4s0q3X5JVuB8lGEcVIAsKminecb0b0XsgZ9aNwvTrMVtiKkQEeJ51XXNHRvbGUlXtxPii4PLT8t0TX3E/xsrK+rlSKrj/cb6Yz2DZtY/kfg+w3mXCSAZC+RDPrkWUUluYPSTijCRuKB47+IN401udkCxpdLFzRNptANbJh9dV0vt5SqYBL3c8f2+JryrSz5yfO7PRQOVY+DzB5EvqjnEblCfAOadVNQ4YGFgthRmlF3wxk8xuJRXcDSjXPpQkOw2KPXOc1dVUOE+tI5y95Dljjvvg0Dm2CxPhbBD1lBcu0SrOQrIggouC4ibzdu+zrSm6NekcKTPhQvoz9Ik0SRB7OKNydW3MiscdAo5Yk0Qt1HG7uR4nhw8qLlYnqIKxJxbIzSVdoGM5b76cWvSmoxfmgONHkgOWaOn01QHWfXMV/NaCYFj+LUaxjYBvVpg/DAlVqZXQLjenHNAnrbN0oIdQffZnDqVClCIZBIbO6z3WFmJqcRULdzWUHJpLUL46XOZBog+IJYN1XEL6WCqgLOkOBTlKmPOLWlF3ZoXcQCFHhfhQz+0I9/mGYUhzKyIqfnS/AcNceJYn3C0sEPNVqJfYGJDyIjlvF7evmzb4TliviqGEjWfTRZSv0Tq9O+F7INmX8hUP8UTzVi097P3yP4YM8H7a8zFsiZNy2QtJERWalRAOYeDZCHm9GA3TsZXXrQZ54/8xEzm2gauMpDNUN0j6ejPEJam4eLnRCvb9WWmufBnXKqAcnKP+bY4DX4xF4jcooE/LAlYtZRXeeXAJMJgDT3tuS/d5yLp39AmF8kjB1zWniNPY+kvm0Ml/ZccjwJHPtx3cV0dE4uVYiBcsfxIdo4y+vFCnlprNuzL4eI3FhnLcXonJOg53QoBNjC10RCblhUf5QQP8jGvpt343ja/++9xzU0nt4noKxtkvObSHanHssYOVDBRI4M5QUfVf2l0eMSgLAlDhB65OjjFIhvDWZjx2EHKqy3aXy/v1+gP7QFpbTT3cRKnjbolNHZlSZleidyTCdejUqWBNXpZf+rlEGrPdLtocrYShE2aOGZdk3xbKyQI0tR9aQCg71rVIkLHdXYAyPkAhOWwlmsHOLIS8F3g+nyGGunzs2CBBs1KMXvXGwpNVgerBd3s3QzOfgNj7XJx5+W9e8oxVLOwSLVWHxz6OnfCkW0Vd4mSIEP8L2n7VsDSx0kR+/fzSH0n5sOCXzrbi7c8qPi+xiKYRwTYx2x4PONlCIekyEQE60++sOOLV3YtDd+bqOP4beGnNOvmR+wjIfcj0si9pK7XZgHzRNq8ocxKCjHRf5fbswC5u12wCaHzrvqi2XZ4L6X3N5AoARZrZvVyaaUFrIOlk/tfpoFbwQJPKh+WL0AzIsIo9vd209eUfokjOmWEcukVVgWUOHsA1lI9TIe/0KZ7LBCXJbc2wWBdu/jo987rr8UC6+Yu7vdMePqC6I7GtvhliftXnbDRLXDD1CxZigit79sJ7NGs1Tau8YN6Swgj/pqLz9El2t5/XqjRl+BvuTB3V6ajNJarj+eHEPtU9skeSYd54XLpyTt/rAD76zpzHYRGihs9FSLbADg6bOYiaclP3Qn86TggdcdfeOjSxoEiQB0t5L3DRwj2sReFhuEDO+S3nuBi1/tlCn4dY83xA5GLvSHZ40Ne317EKbXEwudxm6UiKxqlVPaEc4S7Yd4pqiIjstkvOU4V7SmAQUyMPHq2hujVxS+P+8iWd1B9oiI953Ts2NryTpFHY2ouKRtWqQa2gjeCbpAwrfG61p0Cn+dg1NPm2Vdn6LJcoJz6v9AnRcsvRp9Kj6A9+ebBe+Q1f0Bh22r0Xc1UrX4S6kpXdDb2q5ZFO7iNMZyR3AxanTyxwIs7BaVUl+oqSchH2K2UClCKiYW3AfNPkbV9O4JrUzcWfrOuzT6GEH0Zum7WL5gnvz/cmyu3y+6Jp3QS0hTjvYxni9dQik2fB1ghapwcor/1qeMQOd/q8iIr24ZwqllEtne9YBrOs293kf+B6tw7WjWQm6gbfGPUQ+wKkm3VuPp3LznvOX9VE2pysLJ+e2Bm85ePD1vs0Cci48WQjOxwWot59vpe+3JVgn9EDOHHYG7fGyL/XS5HMccTV/RR2KfSD6RQX9WZpNaRawYvQfPBIqtAZ/CtB8ZiVpdHhsR2b/C1uE0ehwU1Px+UnZUsR5x10VAFHSPGyFJRGdPN3dJtukPojAeHa+fNjjR6sfYQAjCSE24DLRP5jos3bHwXNRi5DrrswAA2/9r6Ol3MGEu7dHwLAH93Uq/c8Qxx461aGajXhLLExlahPpoWAcoxm61pzThnCzYpsDNIkzVAIBz4ughKd4Vv6linRZCSBsXlzQyD/PgaHdozC6oUf3dXwhuE+GQwS8FtnBSE2t5fZCYPY7hDGbf61sHotUmIm6dIxJ1U3IGzUcs0X5pmIr4QeMkrxYd0g5TpQczoC0jUMUqazEO+CuKvgkXNq7lMBMyDoOduyno8L6CPuFLzIbjHDc0CskSWDJRzBYg9LZh60iRRfwKWZBjZQtcFYezSkiJx41DQ0f5v5ixNnabSghsFOQ7DG+ALaGRoNWh4vXnCkhL1Mx3FKqC1usmDJqF+F+r+LZQl5WISpCw8i1fxfs7xamytA+7LAsLtCxYfj5b5GjMAMo1r2e6gR+HYjVjj8uHtqxacPln8GYSVchtA1VK/xdBn5kkfswtBzRavBLYAxLO3+xwkSp2EFFem9aITswsY1lvchtmMSqLxtsXf2qe7ERtcU296jstOdnfDeTPbxTBQJXhrjCZKu+gTGtcxObJlsb1eI08DOZeSEniWKVmSQAvxiFC7SFUWVQjHtL/1CaQ4QPUeveaUyyVEf66ll6JX03OxblM4li5qzuL7Z1IbdNEB5IWPTQYofwaeI4yhmIEAQQ9TEDYnPZmDpr2qdaZlIm+AdmO9zP2nkLu5g80l5ids8sHnqlzUTEA+GjKvnyhZSpAakFvpzTLoRvqi0AKLYmPORAindQq7hLMRTzMkBHf3FqS9L366ERZpz3eCVdH50DcQpy4sVtE5lh80uj85G0vdeB+dp8nd1Hpm8TbiMCBg1Nyclf3r34qSA4ik2sWP7G/reK/S53k6C2wgHlusAtLoF5gCR+QUUrMLVvNnyfou3IHyho9Nxiu0rbqqY6euiJYeGgmRJi0o7wjY+I+9LBJaeF55O5+fPLp2M8OZvuzPVgFACZEAZ2mGhm/iu8uAxeyqlVpVsJCS53JNTYWWV/3h2AVrmpT0aXqECoYXL5U6UtWY6ntw0CD2BQapsnqruEfShLNP3bytv/btzq/j4GnQOgznsU9PYbOtzFoa8VJDGMcrQvngHVM/F0Yp82RbD4QBYZmXJQfclZNEAM2G2OUp8S/82erNsRUc/bzLQDMtgtzeUzs18/+L3H7lkdVUbiLxbDro5jyWAdoiX4QotLs97yeD+bHiXFVGMcjqA/JQ84PJ1lbmmKourDuFuxagFADxe9P4zj08LKVrGQ+KtDoA7U7jmJFhF9q/iphwZ4afqvSNgwApLI3d59wCNZr4Qo3cmgtOBEpLZhsEwnDElSaKiOvb2UEvVRk98zOxDqqMD8Z/DrAG0dDfFyJ/KP9y6IAjUJaFjhU0CQ/K/We5Mok0gIzfSnM5r15SVqsQBczSnSiycFRqtdhPdj2XGo6E0tw61VZeVtd8ymCXBDrUs4idr/n5Vjewz9FEBM6DVUFWVIGX6I7cyV3+FYq1hrW435kf2ppbYqylcbB9Rsd0JSVt4Oq9PhFro8H0VmlT57Qrn+DUAyXdS85X3o0RFcyLmmho5EcaE2/pnpFFv7GOFulJCUvIIn/tx0Q5S8nQPiwsDq7pKCtV09Ip12gCSa/67+vFrnSlPSlcQAiVvIkfvTeTe680029bi2aqKxzUeuwbY+gaPUVpYbxklhUJ1G3f5MRfHdR4y4k0AiUHhvFL9qVgSeZIs3zbVofobMpBNOBt4HKApSReZsiUxLjHylGdf6A2xhoDSz6mhXrgGBvzGMXWOtTxzDikOCDQMJ1KtSxBPL/aErVfl8vZPrbiLMC/ywIzpWWFMogwNzNXYXxlQGCiKkEyGNZUDghhR41GZYXYIqL303YBtr0xLTGiP5JuZq1j/IN97jTREVtFfD6YQrCIMhyFpsTxQ8QSe42McuQcwBnhTfFtQ2l9uaFTsPSTgxNvmfbLdTviLlUYsUJ7Eb9No196aBE2xf6WgpQAkYt/wp6tY18upOKvcipqmB275roD44231h3g2OZOXlWr3WlcFkjQQMLdfBrtCDOtE9j5pAVVTbvrXbD+X4irrgCd8iZLNxtJ3robv3AWgDtb4+J4rn73EDzcSL3eDjNPXr+OghYYQ8+75c/bbyoonXIUW0mbs480lt1oNE0LscnQfkzMaoQr5xoUMkc33W3VW6VgflXILosEmEoPT5Z7EOhKR2W7/T69cUdNWcrXuFVFGX/GRkLXog+ixPsTf9lrPRdRIoryN3FbL0F3s1cjAFn3N5TKd3EYO6v74ya0dmsts3SXmsMkLV0Wfix2ERDCEbvGp01rUfSDJ9Y0uBVQmdGEL+PUUYwYfCjxENlC2KYJKtJLbGyDlEYMVhuCsvm5i+fI+xJkN4cd32Xq3hMqvRNmXPByRrOo58yAVh961QPkl8Cl9QtBhgO1vfREUl9gdjOv3H2ESSXqmgn/Kr2amKZrHsp/LXlojipGCyK1gU4BCEiJ1js45lKzwJDeaNzPylTDjCXAuG9PnCi/Z06h+OlxCUxgbcNyygje87Cd6j0nmL6lLl8G84dR9e7mWtNjOe2d+Bxw7gkiFZUUqiYKKbd781DxTz18JYMTtcKJCdyjSKDo6MJXSvdgsIGy/FI4lgs/99Z2McWKimMbOuKDxZGjL/CA21JUqmsJCtVI5aig9J3Ss5AKAjnhBAQHwDIwcbqBv3sWu0rNRtNtFmXExtu1XZ8/KxmSidGD0ZCz26/v6NttcvOYTimuYanuwqrySmTvedzFQdDW6aV8+Aa7/f4DGxdMUfiDIy2GtyLvFR0eUxTVjxUvrr8ouYl5zRJCjbuZAdW+qXECZIoyOAxY96Wdwxoo/3dN7GHx9YWcNS1RmQyfJEdNwhgQODaSnbGuL4/f2LokSd0xV87JRQijedVavjJreOoh03zUgpyM12caPm239gusy0m6QS8NPTsdbwbZTrTxokjNmxuqdb+fn9th9ri0XbiBlQRF89rGo7uLtrJ7JzNRZ8sabUwef0Wd2uhc6iKQ/T2nyWSnuXiXCDSi6JQEopAN+JxT3xZSp6ETQ3bx4p06y9FiPAO6K1IVZLr/beK9VNztlIHJakNV7mR5S/Rok62o6YAXwBc7QNzlkExfgr2nO8A+tkl0zcib124LeqF04SK4AhsbpcrZvXth74NCRD3DwU38GUN23D5V9yzNm+pqjDCMv99gluHi7TFmMzIXAXM/+9x8F5CkqTv4Id0R92RWIaxOrmWvjMOubcA6ntgxuN9oM4kjtK+WG9FmXZjFxq/fYOMxD/pnmhYNyEUsI+gCASAPrGuMtt9R1p8+Spstjd2JmGan5TDlcRHbdnk1MfUNV3MHs131zbiUVaWDnj4rzLlLWpaXSKl7C8EnbAB69RnVxMUmnMT0yXRXu1P1ZDmFSnSuOVyeuY88RwD7DoyX6lPy9ew4MtNYvJ2ewbrief3sHQpJHvmJuME1uwpHz5Dk7RIvEIhrmTVQ9Mq+dEW8xIoVL04Y0boN2CcgZX0wjdBBBDGZ+EmlaXkneOdqFnJZElmWhAdGrJH7P/StPw9vrR8uwNay19znL8gRDvibf9MqseskN22HY1H2/Mum+T429HkPig6pGO95kXcKoxARUUw2TrXToWxagx+fsknwWOP4liadQyoHrdqp8/FFwNOhEPObi55B7QB/K3Ol39TZ1uOkI+t5mW8Dp32X+cTwNxJIKhLLauHttt71bBo/V5LoeraHysR0gBVkMYPMBfM3tErgkjPJz6TFwrOKKfHTTfx6LJMo5VDd+Ldqc9krRQ85z31eHWtnSxZteLK3wjxlV0C2QsjwK8pR/v0F8W06xBq0vmq+Ztjj86fFKt6tNVr2JSyNZMueO6urTV803iRoKOoM9hZJJWqKjfBbFZUAW6it7+QnkcczAxZ97rruSC8tmYjjDR1b7RfdPm88/BHVr0Mz3Ge4XK55jwIDxPNHPHZCijYFglr9V0vU0kkFbsBFLMxr5PoigFzwaa2oWhZw1bWtF+loRH6LXqX4TYjVhdLOuZbFT3OF1HSFnYq0In/ZZNMpstYdqhDO2deAb0G3kVAg1wN3kNR9keaOSE5rRIAmQ29f1CsWmqnLm7QvwU9Gb0pxwRmtLLW8jkcsPBoTFuD2zG11GBydd6iGFhWKe0faaq1Z/3nlnaVA0aANCI5EMPfV4Hd9hVaG9scSx84f9eGgWMDJuqYqQ66AT9m2akYaKwBmtxeUKEY7S4tLifaJ+hYWOLGPRbLJajp+J//divPfswyJlrZ3oxcpFZ+LSEZ2sBAq2sqmYs5t7IwgelcRhVg/V9Fg2SzYGo2m6oAm8j4wcDttBA6KgFccL7h0lPjbr2sogxnutMin1/DECJf4BHdf4I0kiytUfaUNfU2AoNBT3Xp90stRowxSDtjiRaGKVG64zuyAEtXP2NicGd4xz19/6s9duLolSvLKjHNswNroUCLdXiVN6lkJMTS/+7zNiiaPyhZ/8SnfpMSo5W7GOhK+wdRgqwV8YR2yVXPTLRIVhlHRXTI6ZblkODZ4XEtGII7eagvx4360FJDg5b/uWxokmlfMe0qT4HYNb9u886f2G/3Y3xJkW1bo9ghxYZggzzCu1/fosWHhIAlnZp5qNwbiugXHo74jppjbuRCJqkxXBitIcR1GtaPnfUIi3gdru33DWrHGmNu484oS1DiV40C15icQm4zAOZ/tq4BuW3bVT8AC8fx3b49i3WNW33hO0rR64b5TK0KFmAew2Z2UV7m1HDgMmATdpXl03yQTBRk5HXxgCXci6ZzxggsJrpCkuX3fTozTeH9nZFHjNPg9S52CgK9dnsRKQhWbivV98iW0/V8JS/LW8vEykeZlumvJYqKivo7GLaO0N2FsPlP9BA5k3eknPhC4xjHLQWBc59scymVhvNjTeVPTEVz6qa/PWeGp8zgme7yjwdiR7SeNbJSDVPJ98tqa3L6JwYaXPdHwjJGhBYbdASETeQCpgwaGnM9BsTI+2LVI4IOyDxsXz3C0gmBvPcirnYdTx42/merx95OV+raKa0UhNHFvHydKyssSu9jRmvSoswqdIOqTqTyXt+F9bBNDallr+8f5xkL6DnQE1QzLLP5Q6x2nQxjbZ0Hzd+zgM2IyGZm5Zthm+oIsE35pntsKH9LaBgt0JWSiywb6xsmyBqakc/tPAwimlwF9A8G9QD6EgMot1q20LFxTgMsB4VIbnwPhXOSeJ+mKGN9FceioeB7JuYdhf3vylNhvimQIXFGtriLg098gQtCuVzIjsSWKbsW0s3YHxIGhLcwSub1RV3VfwLdLOw2WleEu4L/ZOv1G9kIv5EORDYEW+f00sz7rWR4LsksVnBCXN5JHH+5sOFlHd7g1VrihHwigmjBgWf0B1jVpjpZxEdrWB7aNJHCJhdjqH/oha3jgVx6WmPuT1sJ54dOKSFPxCevF+GO2hFNEp2Y6VS99efw/Os5hhxJj6E7BB0OljXix0AgBPNF+ouLE8KtcoI7E/i+mYSGNz+mjsFLM0T0dq9BXe9fYN4KpmYgq+OJrlImdqw4pubDsK8CwV5bMCYutAZfUBzng9sF3USApCdctlpXa6OwVOHDIRtBlT6O9LG12osIVyZgcUpEBH/++tKxxKpuIy+UzpQYBpyJXeu1oZIsJeWbkZ3lEmKXSbB9p3kbRb4qumAm5huhYCdDcIEL6+ZsrSsa7zK06yjoZlq4RCE5CCA/XhkEkohu6FCyng4oaOiNsOMo4edr/vIARAKwAr5OpxTwAu5T980pjfJHr5yNhz2G/bj83HqzBBG9gnhoZtZORfUTo7sJnKzsFlqodwtE9nTqfGmVGyZjhWQzdaQKffSyLR00KZHs8n2Qpn1hqBuZf2T5mGWwsA2pZacwAJsQXBli3c3iwZ8ibDVu4rNTqj5mHTC4Dt2nfA6rfK68jGycd2fzknfsTCI9mAYgYACrSvxNWqDUTYgO/a/wchlFGsNOAXG/x5RgpirNlurmFxZ635vhJEj/s/hvTVQi9RL7JwsvPtD6oo/MITdLnfk8lVg8OmrlELyv0OWhORRnZpo0f9As3ydKhr+yYCb6N2wu/mP1w+O2pk0a5sf3Th1UYl7xnigAdMqx3e1NaUqn/g3MZdrFE4hwrmKfQ9Obo6RDT0mprhCmGfNWkM3FwqoC5zLOxatreqjrA34vavvUvjGmcJyufm7sLXIb0766qjjdZc+5xIKdj84kx6q+EBgJFmv0N7lCVH5tBFuydQPkysuOKy5fRgp3zEarTESQXqacj5151yzwCiiV5xyefhYmaUJEFKo1EIFRNR/g8lRFg5fPfG5ScME5UDVZKMlADnn6i90bm9AzVSq5OqZc3Lsn24TNFJF8sWWChQyC65LxO6YfeobmLDTxSumTdK97BC7GVA8qZBx1VOXkZ/RibQDMeHKCpzAvV1lwSOSH9BmU73acJTTwOCv5pPGUZXcREh/I6Thj8xUmK51c9207YTy6EPOzpzlSEFfX6rAp1wnJUHETWbVQh+gHGTJ23bEb34ofyPFQGITKN1Vepa1gjISVjO93L8vpWrp8/o34/MliuPf4adUtDcfiQk0P/+yo9B2hHXeVuD9zaEhQ47yioE5mpajAeaA6RWfaROdWp3q1ZrW0Wyh1pC4BYQDRvnOYJmGvZ3XXThSdP7W7jOfWY7GgYK+5MMA45yTJpCbq4FX6vlfvFIhiAiOrt60aV5XciAbLGxynUyu3cGDx8Hbd71VeSioI6FOGwWkOJAxbpPdD4q23mXOXZx821UyAFVY8DJ38W227lJfvy8efLkZyzHmDX84Vl8KeE/isRbUcAl7h/hWKKIrTVqtMXKMEN6M57lIayAQ6YMzl1giwEw+aE+9OY9dJynC8OrTwmYRUijQgnTmvppBQsVXzr+BYGal/v7CNbNIyoMr8l3PRn43tkwLP1jdtcSJlsLoFa7Z7XI3F1qbMKVFeVda4ACcE9XHsM5v5ebR4BO13wyrdBPNE/QyorZ0MWW3XBghIQelWq0e/iIo6WDdph2Wf05zX27jqHIvzhrg4F4NsPKVD7KPZcf6EksD7mRwYBO60qBq/ISXAMf01TZzFxWGGATAsCj3rGkvdqEBLKv2Zv5SU7ZMUs9eDwzVCt1eWvQp6ovX2uIl+EBnV0OLgRk57fRiiHIm3QUkrKQwb3/vSpPEg0l6X2aP1OYefBtNhPbRIE6YkrT9udeaofdlBmgooxLCAP9ZGxBVk78rwD3gA1mfhAezaaCPRMJ0eobMRhJmuOcJj72NVt+MXIM4tgq0O19FNroSqZRjhXn0HgeL4EMqMXjWM57F++nkTxaF1RLYdzLpKekU6aPUPmPqaPcjEuIQgjOuVJI1KnokdhZmwgP8hdycAfKX4SqnmhM9AXNE9T1Map9Yq9fiIaLyADAg5iJfgH5b9U46yfoyXJMwB65yGkOo91uEsVCaLW49I/mdnLatLx1THnwRo43eleCtxjqDwaOjFGQyafP+yyhh7Wpoi6kuo3eB1Z55kRAG0aFTkHnITROc0WQSR8hD9wYiP1Rc5//Nqr2yKSp+EPNsIxOot3Kn0L26ESqG20sd3bJieW++ENHOzDo5cDueCe73FeAq7ijhszEW15X2Z6DQZnqjraZYKctI/lMoWinmU4oEJII3CFlaHwkcPQ3JQUKqkhTTWiLSDMLHjUQbJJS86ZLOQ5Pc3GEMgDJqVKM9G+kiXJms8g3ivq/XxpHFP24We3DogcKOmLn1sDf4VLf6XSNRVG/GzZN302HcbihvCHHlom9UZieT0D0GFgntpCbuFQhFp/9nXWrwbLNmpF0zpZ6Ejz9DiVLWUUbCl+AA5CldgY7n62RrSHE2zjiJctEcht0cAhlKM00xLlnuptrGuobjDnp/jCxh99f3+3IENy81Vgi+iHoNimhrX9val5k0e0H+2SOnRw1bKe/Dp6jTq+WjBwIRqnlv134mZeNgbwzjdrqWC4FMC9U2O8EkbbfDoBe+uaH0W+W1ZvNEQiB70CFnB68YctoBdoZmvN3/D5tOuLGSCwFmNtd94Mo5oeaW2r4I+l+rFe84TK6XMnfnBHpvT1na2+F3dsoKLNAEqp7IBPSXvDtKIoV/sv4AWIlhcygLPowZSU9M0iBXlDt06qAMG5ZKg4hHcoA7Mos4gz9TOCWWeSA8UFT//S7i9UaU9NPHZAuHF4H82n3yq51wyA5wiNuV8U5Cuj79JMtP5z1MsjL2ps9TMEf4PtOr1kMV/vtFnI++/JJ1juEAoaMhTZQnVleaZNDN3VM/36dqLsw+J0B+v5jS6jFzYOOScpGROKiFBbCoga81xJBsdsY4YxK9u3mIKM2pEhzSKBj6Q/KRCdUiRlEYbX4a8XAMi3171yIGM5cWoXdoI6d9++CHXu5K3si/2dT9lRomYDWo3kEUxB4apbkgS95LYkcxSLGA1BKePkwk3Q1KCAbNb+XzQd9gYM5sXDBEyFnaGqnrFhG0uFt7D2K6O0kaEzvFe3Xmg4EOw9tcFz0T4v7plmBuIUdDhH8KessZHTK98TO0RH/QEEwxMwZJbtK1BVhKhhbgJV83aZyxBb+owpWvfbRTBLczxJlP+7XgGwjZ5Wx3LXk1tudG4gGTBr3LoVyNcFjk2Q8kuo7KTa4IgpnqERHf9o4qiXz1h53OonIAiOJ0Do8Gm7LVNgZOuc5Qy+FyOWb54SmjBPAqQrk03N60a7zbqB8A5OI1WdA4afqgMS5EAzNmc+qxrU11vZIm3myOZOOvPXGUDD5qMirkWJfqH/XMQsMcIl65V5mx3Qc/Hp6FniN8O/4vFd5CuMa3pke+dnoQ4OM/Pn/0PpgL3wHe10AlscIMdI/QfWuDJ7oiHY/PqHu/7Y8qbId++19oIsH3QIgA0xIu7oQAHJVzKUKq6/e1Xr0AGAUohA85bVV0XuFZridotaoqWcEQD6+hdvOJ0k8a7B2P6VwO7L0PlxK7qRbAhMKCJZEpGCxmKwj2JbCHkuQPxwTvtxQZijZc5+9YU1ZCKXE2iiTJthkKY3rtDqIUTLD80wTj0o44UTS9qBSjrbUgZaIXVBcrN3c94VYYTkfxn7xU7urS/k5jPUmXV2gphgONUH77dWSEfUWpA0xHW/HnISA3nHR6mPL0WS80UsZPx1Sy3TRDQyTofdikS1n5C9ZdQc5vL8gf3YZ9wLMVkhDY9GxDzkEvXAhv2596stfVQNvkV7QQWf5oKswpA/EGWl1w7ZzUv4s88RAwFuo3p5P9esV/WNQqUQL3/+OFD5csWiWjDE+PU/9X3SKsY7KnychR5xePUH7m6+K1Xh2OiqZXT/vRw+NDn1VK4ggzv4o5v1I/zNdCSWWDuFxHrCvjSMZaE1WgcWZU/zYD67hHCREcOIG69UKVPXpI1oSnbxaVwGkJKr3V6sOckbQ/Q+0V7bo0ump90aSOmQEpYMIx9dLFrZZLwDvj9LobEpjM46qS/bG7XYo2iqqL8l1A1PZK9IGSxXJSLNEYoP6FomuAJmcBOVriPTFP78abR1t1VoaRlPr8kz+3ovkVgVW/QbXKlq3eFTyYVuaOOMZMMWoF1jezOO2HYDzbYP0gHIvVow+AfKY8btp1AEL+FIhkWZWHdMsUHjMPzA7iHR6dGnCPyQQbPW5FeAK4uQQ2xXOSKs+ShbNBDynnlwOqNRyDURSXXoV+H6VsuaFoK8GSyRRbqxcJMsIWcyyAS2O9otDM9LnrDfikw3duzfXwz0MYgsWTTFkmbJRXkhV/xjlrmSlMqI+OxxCjZI2ZMkk9Act7gsVIjvmTQ3HgBfRWX6narBIF6yw8moF7wOzvRfWRCAsMS7whR7qqBYo639UTriZmR8vSJiprJ2Dbeg8+kl87I7yQ3qI9NuYcRsDtIH1Vj+e+D3KazEySk6Q+h3XmCIP1r10ydKBPZsVu/umeW/kyglXzkoExkXl9oFh3viFBNZ40HMEkeiGcw30VXfpqsMRVj5ToIwnVv49ecsJEW89M6NVCpPqIsCz4DC6vFNOkxcovL0wdLuzyaUjGQQYN1moBFJCC+ntOPa/mqiXwCcrsr0NjUiFMNuD/PnFDbLwY7oaGtRU2c1FWTHsQajP21usvmTQNBk8WK89K15fCCcrP8aO6lMURHkWyAGxHHXjg6SnRDY7kiw+plItscT7I1drSHrvg66VY7FiWY7OCICsMXsK4dow6vP8U/SpDEnneEGaA6jjcBCHM72vojzwDTA3gnzPZlResyzkRuUBBsY41/IHGTrO1yVve0jNNngUW99pRq0lllmkW1QuppJz3IxI7EGdm9axgbNDgjwLXXJlDX/9ouBFu1gXYhhIOb5A+kXRUf3UQ+csJWBlw1pMAu+4Ur+EsqMqM4KKqjUzJLfCWFczhGyzOuF87pX0FgJwGnxUJNeqVn5S/AsKyaJrJJGZpba8eWKnFqeG9X2dThIyYjXicE/JNN+nAOX3uwte5Ahl1hbNJEh5zjnLciGCdGOPAmJfT6wQGVwVwFeE8VbET7Lir8k4x2LXnn3ERRndLvzH7awWWPjEqdqaeEMVfgEtAY+Fz4tLa7Mn7tdkh9FD/3R+WhvISRMgBJHBoaK+CepREflTEOzZM0DXAIfNP+d9xsSEXaU7K0OOEFJCeTYvOJpyjNcu+7Wif3Qh55/uoZ0QeXY43mbUmF6jkqejczWFhSAicG7uqVycvPN8sD42uYuQF1igN2B2esPVXetWf7+1KP88/b+ZoPMV8TFPt2HvQhCQKPvsa+tlLNpL14llre+tP4U3pd98vJeuEr0VIrGRYvx82dlAOJ2tKpwuLLYfWG1dWY+5yXW+xOfGDlbwl0x3zhc8TNoPgFoznYRbB5JfuVIL+kqw4EOGxs2WQXcgqZocR3fZUw8/yFcXstPcvyEU6owAICv/eB2fKfBnlquOdaiRhIsYF32XHmeBYdAa8bas9hdokJJavvHsTB++4W3AgvXT9LU5wGqFK/FqToscCYEo7W700cJ+5Ihsrpn2YPiY9MRCVK0sndcK0hl/8HDOwX1Ju2VV9y5RhjmuIoIUw15Aul5Hr7eGtrUaYx+kVOfRYfaWgF35tf0MXO9uKDPiVrpQ0vzh08naCfabYPJw54ve17ZRvXzOGQKyrfNW605JnNNpTezCELtevsoOSEY2yBkCkLnuX9FPvdVCVAMkv3wQgP697cZc6Ps3qn/g7/1D8HaWQXHHa+CGv3E5wruO7O0gp7ARdof2LAHCJ6LNoERrF2YxTkTNLbpJbYDTIRztsg0m9b8sQKmbrW6o+BqlbCyMf9eXJKl8l4JJmUcGoweiVVZYFDbf9c4vw5WAhIB0XQcDQb7ElxM4fAbQfzoP8hydYS5ZMkIQesTg0t4ax0Y+R3aw+eukjhtQMp7TX3kq5CCfWwhKSdWqAFv7FKl1OdWVdeOluKoeZyHLEn98IVCO2KPdFuLOsKWYt1nJN/Y887sXdihbl+cVS61yA000MFS7dCnr3U2h6l4ZXZUsVJ3cTuEzcU/TFAVHPIqsP78KEItRlll9R3nZwd2QptomYKSO5IFtkmJhyThhgRKlNkwae2q+OVSBnUPf7TRX+RBeffzXoXjvgHum9BLqiZFIV2YPgxBA7OGv+HBeCvcjL4NmERJDsutvzmRfMNuToUVPc3xmRiulF5/cYawRKgm0y7y5dc6do0WuJTntQbvf75gQZNAg8d3pt8gnUTJ7ZhgtATaDr7JRa3AjyG/4m4ywDaVKz7hOeCkxSmRZ7YPDatDFyjG8zUd90tKrDydpsg568L1712yxFWia9cpXka2tjUjOngTdmAA7e46ilbCKIvfpa9qtHk3Dsxg8uVPeKY+7YhUXYyqQYXJJttjr0Ynwfxxy8x8ZW4g2zA9u6Stlpr2JxvN1aKQ7wDuO/LlhsfMvIcNYaThvgX8RRbBvARfhBNaiZwkXGq1dAxz8VstdidUSn2DB0pPL1Vu0k2IH2xDeMeLEimlSALtpu3fDWpkqxhMxgLa9l3cq+em3A/hu0ZUWmjoaCdYJM2TPUqCKKPxfJTmK4VLhMXtpsCocjy2bL7qWOd8JKb8YxjU/XivbiQQGJFPu3mgfi8u0oa4PUlN3iC0m+YOlEXgF9a7LgGcSVDjgQwNC9bsHTkoyguze5UArbYyxAHqSudTNhB0NYBjPXeSxTE53NqyHdah7LHKXn58xBlPqZaj3/j65lzMeajsUpNMmaCUn0x4VcYiR6r2VDXmdluaoauMexv6iaerxKr5RcwtBKWEZB+PE1Ec8ElLwiFPr6wuPbpoz4WLvI0KMyhYsGiuZZbVLZSERinnetM7cn6fg4u2gy6mGQm+QTWo8yh3OszxxkGs8dLSFi3eEiBlSoQAerOXv3G6sEBD7wxs44Z3c3CoYdbR7HOJjjKDqCo8AnfIgYqrQ+0Wd1ix1X8fqCH63LsAdkssmA8zp/ZDnh/ujCPtwffj4fw2+poDoj98PXSsFXPNUMTC+NGQJsvrPbD5fiATDlQqtWeuSZwBJwdGIOZMEzEUDgGzgGBo08gXUscWIXb/z+ftyt+TJ0OY3OUflIEJZjuOkGKaZmVJTi/OPP01pB3HZwtnCPg1XgXL/y3Qixvih7nfh8QY1vfJ5LnS3EbzuoPmKXzu38HhIuHyYQLXZqaYCFCb+dmaN6ui6K68oezxnipl0VcCsJOVThX3UGx/cHkAJv04qXxIXdSgAisC0bHjmro2XsMFt2r0bPqf9IDD6e+28aq4fpJL21SyCrM+wSQeReFdBA/t2XJXm6I0rU9O6m7UbSM5zGKYYBwehAB2H3FjqicunUjPIwkerL+LKuDbrJdutu/mYs3H/6tNJvHnv/CLhk4VBYd2+1tWjwXl9NWLzzOKmjcf1bSoTvAgw4gIE2RN6azBRyMALrDCBmtYh4tK0QQpY8Ujwdy3ra5Sphd1eKLzPn3o+nxDcuUV6Z9z0DHqw0MhhGn45mZJSsbk/DYyifJac0bMlZWvxw8h8W0E1gHluCVORFJ+pAgMGkwLeGFtRqeC8NlISFtCy7pDdCqTtl1xTzchGueME9yZCA0FlebJBggABaocemsDGM8u9UPu0aFeuGFYB5RdrnJn95+D+rRxN1ALIdsiUraIUKKMrUaZjA8KKuUw4+0bSf/C0uXIsRJbtu7q1SPP3lfb+wgw9X2jwUnO0OLwAaD7hmJxKgW6jwlucewnYBXRk4zX6FTxMQbRGl85BW9cEkPluTFrdfTRsn0iM7dfZuw/u/tiDiw7WKs84Kx9Dnjas6v7VJykVpz865phX1AkjgswiEb1zol5fnKuNGMZl2gs07hkOPYAAipz7O82zhDoH9y9hLLvJKg7yLE/4f4ZP3SuxZGgVwVipYNfON8xX8QRYNaLICR11obiCuttfnRURok3InP9DuJBc6hrZ2ANg/ajnGQAG8kiSj3v27HbE07sj6NJy/2aI++NIyhKBSoHB/KloUDxa4ChhGxSEuFisAHLUMuSWjetjFEStNrRqmK+Usmcz7ZWkZf3jFbBTPedYyo/aBpyhhkAS55qmB46hNlZLqmxrY3F72P0NsypY+gK6xo2bTX1TCpNdRvRpNAj8pj3oosFn34oVbRefUSOrxRgBllPyzNsPNarHH8M7MxnE+T7eIlQEDWoy+bJDFAGh5IgEU2yYz+z6Uvv8jhzrvxkQSBUCO1KLwbTqpmyDyOdMih2E5e3yNKSo6AFkLqi/fjRwi9GzoY9NSJIDLyaPZWGmgDGTvWfV2fo7suhWFCPTT9+fER/hilj1ccx4DtV+ObMUS+p19T8JKk7gFK53DANnwidyxdvAZ3o50bN+154y9sd7ilp3ier3leDnEg/7AaAnnFc6bqeD7xin+cGem3XV4Cl+xcKykUwnhKx+8D1gSx8K8aHaynkU4AtCKSn/HVHS972FPrmwDRgXIgbm6VCupHQEuf6vQn26mFp/DFYzISqCVddvLxbv3rmjPo4Q503qGvFJZCXbFB7FsgwAPS9rnuHEMFGCPDMpvsGhD+4D4yoaluTNGENB2VU6gNVUBQilXzEyGvTmscvIw5rRyzzszfQCaW1nYUq1TUX6HudDDisqEYgRkzG9M0px66NsNzGPBiezPMFJMhQdv6qbW5afWwvaz1oz9aDwe4R0q3jQdSKtvmRnCBleirRv+kmFppXn7by4brjuJ6CHE6KnNz9ZIW6jappUYyZt6sKQWSX33NAsDc97c/RGsz0zFdnip5VK40p2JIyco5F0ANJmgWO3GJBUEJEjlt2PZBiDqY/lBLRtZvMGQap7P/BTj45L6yEKzI+v6BXWl1SF7YHbaNp/iw/SEgeJC3HHIprV/29L/7MVGuDSz7YpcJKHMQPq9WCBJEDiz/MWnC7miuVSh9N55VtSCbeqPZGD3YHSkPJjB0BRC/COZT+xgCPEQ8pE99VXS2g0tg4SPcA76Vs3Bx36BhdybPvzyD50P4WxSU5KwZu6SCVt3PteBkFef/qxN8CpMRPZhLGNWgMKNG31W1dOu4Ul7R/Yt9C/H4EXA9GYv/pUpw3mnOEk8HOlxqPBr0BOh8XjMsi7fAcKPFVKcYTuiicY0eZK1aK1/+uQcN2v86JOlEDa1e9DKoMGrwJ3HJn9ZSH6Lo09cwYm92sgPBS6e2FwLB5+BgcSdw1OGpohveHVCt/JPICT++fesEm96YMyU39SZtP7P1k2qUcnXcXVF89CEY4ZBSRe4+hesVdhkkwva8DX8YT8nDc/9oNHJzP7mp4ejvQ4wb9dckld6u45eFMwBxKPqjeK5/pxJFKOJGicXSgiKUncZr4gVqYGRpCPA1Msw8c3/+pDNxeyVV/IOhx/T1Aa8XOI+2NTI25Ap0HoCuTpmewj55wZZqWQFR55vqlnrSYXGSee1bXdPxkJcQsdDyqShbrdp576dhk1yvKQz8CBJNkDyLamK3+B+eziyfGgo1cLUyoebnscvzZOy6dvN3cv39xXk+wq0VFPGNCSTxoQqLJAFX2I2QFyrDFgz5CfngzbQKAmuMKbFmlcfWxYYgShjJ746fGZD1vCsVF0qbp7rgCEE2+WKYYRVo2tP6vEgE+TAha6CVeGlHMAR+LWIhMoCcpMc3Zzif/LCX2FvFJ1+Hr/in1hMX+vA7aZDMlFZ+GbRqgxnlNbhKxxFIHJfw82GdU5pvZxv7vLTrAt9L28TZDL65UrswCTFJlkGAvea5j3oey3SD2og3+ufjSrcR1VwsXuP9zn4H0XeJIgrt6B5P1JL3R3cwtZmWPPhXXJcBxBZL7fmZvrjzAD3sEflRV8dAjj5ngALsYfalZC5d2hpP6B9IVYyP9iLeEYkIvKYAY8luOYuN2LzQcEKGZNTzHYj0Jj/1zPVlbwmNLjZUd6OJULEjS0YCq7EoMuTm7Mf9QkjZe8BzCUMGwYUn4nCTqr6Jtv+CdAyIP1dGWXd22x8atdhARqIH5uZXZemxYO6/h3+devsCtn4WA75LRwTw8ui8w/pKFv9KmEZ7I1RHrqkHxRmlwTRpwrmocGInXxF9DCBMMs84oruL49qBGfwLDJASQNpsqmOH4VMgM4F2JQLCyQ3C6Ts1+j3Gsgi90h+jb9gE2TdbCyUvStTlyE++/h/hnQX41eimWt27XuvJ/mQWDn+XflmHV7y1xzpmwR0g6s+a5BJXvRAYz8g/EwOhuNgwtdH2tJ9c7NTmlT9MepmZbkboTalBt2xh1fI6bhlwFe72Yfey72KSvpLtrk7L81CA54uhLN9LKXmGY+TZqwBCdkaPnOKSg/1y2Sbe4RSW2ggTRPIzbimtBwZsaXeFByzcPxyJrW2bGCI2ktMyE7XwLeDWPUMKXou84wBq2fUq9gItCP2khPY31tZwEU2iZzVuLGVW+CLMS8Ux0uo+3yDwf1aUFbCkI5UyuwqmKjJnj+Or7tBxBH460nXrAXrNithmv4pXKhYTiB60XtYslltRY5bjvPEM84pOlC5aXR2VsVrudo8wRHZsGLes7T8T1SMpoYsaQnQQT8oAqifMTiqj906lS0ZG00+HTxGS1VfINfGv9o7zuDP5JF2dowvXhhm22LVHn0IUrceJ92MBPboruTC66dd+IbXw702LgzBXk6ZGrMMiG66WRCnfZ1GcJFlaYj6x9CM5Rlahkl0E0qrNT95+U30q0WdrIokQbYtaTWz1lT3+EFIIhbYj4UUAMaVrOm51SEq02UzF5ly0Iw2GbiBLtTKE9ThpjQwnawRIYfjHjL0RXaTVdfaQI07uOyPwOjXSaL14VTDsGWtjpYFP8/Un+smHnpfgzYyTGp+89u0r/WGFZ/fzm2ufNWo3VD6/1aBBb6IvUaDhgm0gByfkW1okRU6Tfhe8HLdnAFfIo11gEi4g1C5FkEKlUzBknZ+9wbLo2eJaDm2CRjWHsHkBKFVb5ZrZPsCWdSuaQH7GhiMgNQxdcNchl0NIvvcmVoZ+lSu0kUL+4q/rYy1hGOERQpT2Vmh4/iE0Bvt565wkbB5oXlqA5/NNKJoNTKSolhm5l8J9i3xBpQqUM7UtceSITSkqF5npTug1PJ+CB4PtGz3o+bpZ9XF7bttsv5cou8ARS857TLyUHCsNvAJmrKxkPloxjtrgXV7maYF34Qj0gq9Bn0Em3dXYeMUdjshecdzLHlwXXxi3fbjiiUYtSjSZkSRpqKjJr/no1X45CPwViohx4bbArfys1xlj4Fca/NCNPrSrcyE57HCdqun3c25GqBYtYwIQS5l/vdlAe85nVDu/54AAto3AVlJE6XFPi1CBIw12R0dhjoalTTG8Uz5Z24Ek9oDjFxT5EgqqvQH+tIhEkMXiGbgm9vYL31mlYGS2rLlWGZbCoi4k3pIRUfLiZ7kEsEi7A6G/VeEtXdd/917HZynKNoVyEkpucmGxtZetMm8DOGvySEXmP/9SAgn3QhCfquKV0bdW9IFrwN11wUYHgCfg0wMVwdj6Wwkm+5WIUJVZGV20PcgEa5QZNGwyN/Zj+9TTAQkMXBx1uBnqxHOzeVRm7iBchzYTYWz0fWLC5z2nIxpBrzgiSVVNSClEzppfeg1shGZ2rXWRFto6TZG0osG4OvrGC1MldC7MbzxQboJ/r4hh04IB4Y9DLR6+HVg2QHTQjhVta47At0EsRYsMssvSHe67FxSeL5g/wv+6NgMiB1nWtJh4Gj9GTtc3O+9bokAFlGjVJ28CMI18PnP6Ke1XCVlO5ZYUBaV8fMk84IH4K53VjkhReINfMDzKnVPO1NyQXUoY+Q0KwSMPOVJRYojX7lHH0We2aMsLSnCHQWOMWfAmD11CTGLF1N3cy3Iv6BJCkt9jLFY2JJ3FHCBmN1cx+lo263EVSqw/L7KZ1IaUAM50Fz/w5InSI5QU9UVPJnCg8LCZb2/CZWRif9s+ML2jdzB7e3+lBT+Ui6htOv9JOVZXgv92hNsmbdHaHhca/4LF8HyL5ixE/aWorzjeko+C4OCnk/GNESJtQxntGKO/SzPLKAtO6htksIAFNNxQCj94sg7k6s1zKGCOA4/xRhBxFn+NOSYIO1c18+IbVCDsX3b1X2Aw6vw3LEoaW1oxAiJVmGeIiuwWfV+JkSV4zfkvAIX0+um8jbm5q44ilHOhhcTZkhfldxTtJ6acYrqOWfkqDPxDsAVtf+OmdeMb5nuexLZxqBZGoaDf7rKIsVZAPzDVbSHnu6fb1/6AfoWRj8GMwTDfvROJSCqNSbGQcV3K0QK37nanZNiRMgW9vmmdTe+nHM07O0b6DWbxcq8K/n9fwl7QMbelgFUagF9V1QBoJS0UUi9L8hTH1L4k4wyawQ67StmN1lLcEy93oojz8+YzjRWFZzKt+mVRUMwA7GtyDfnFiKo1lVzg0FrHrmYv+Wh9ZgEXGMzw2FQ97Fu3mTCeJTr/qnlZxNp2xLo/cs5F5kod/Y/SMG/FUMuK5NJkzgd8NGLZ52CrfQ8CRMLfMCzK1jib02T0dZzNTF6tTgMkYksGF0/w9sv0GtgdSXM9+Adn56dmdTQsxVe59wTtadKPvjMkLajYsFSH7KBmbO3vWv5Bel/rN6psAEj7lD60ot/SL6LVjWgFhRdyzy//z4i016FFUib+OJvg74PoSftua45hM9Rq6HKeTpEYxYFxHm8Y/8R5lhIQLf7OPIphHhFGFAadawEUK30zEUA8fLd8Sbp2iwvxU3GJRpDxHodVEaeFt0PaG6xIXyj1zUu5yRYpQGl5mf0QQ/RrSHd1wVwDOv9elh2/PM8W+GnY1M/MMjRyyPMIpUQTdYTOC27dYEaRm/5Od5s7AWzsP/wqa+4I+5JKnIKLe2amNrXoLL5BytVHgfiVt2wA+9vDyHTSTE4emlb6xIXvgf9nu93gSN9Yzu1NWzxZIVgZPulK/uTRrvgTSazdC1goCvp2LYaIm0DovODQFfk685drjNYkZqPtqW5935qMpfK7npPmJ6AX38AdSRuLo6dv/Yp2nHCIvyFxfgbuVCUo8cdjg7cMLZOCYiNEdlp7mZNPHKXmimgr9eQ0KiQ0s8ZLtHHU12oxl62WerUqGXCF664ZZ6JnvSvkP4AhRrpzzjW4mYf8gYoiqmshhimLKEfFnk02wb9TaidAvIfqJOAt5RVIKVkB+w+ner2SDLcc7RPqDtWbxKj3dtnySQ0k21AxxJtCY5hOkfmQ+mKs9va/uFCTUoaTzuGhS7w7y8XhfORCq4NKzGQiQq8klCCZxcmRPxSlfmQOez/qyQ5Zt/2aSwuCgI7etC04rOVnkDmoeKxaMgwxkUROT7aEDWAEBSm4C+2wNuNF8vwnNy+2UlWQSZudLNJPfyqxUE2A6zJG9zHzgvIyCTr4fOc7Qu+A/zdTVJvhtd+3c1ANSHkh15t6dp/MEDKQvYmvp/80/VJ9IfXwrNAGPlXWFoiabQA5GKQEO1XaWaxDwrkyt+hMtTVTnGr9CwGsi48yatGVRpZahxE/2f6xOR2ugsmA2aU7sMqM7c2J2EhitSIWJXtDMN6TAoY+5kgzEW+OVEabQMC1vJoQg2k3AfrdNgDybmormhtJpIz60vJ7zqK51H/eRsWNQURBcBJ88g/6Me/vyspbqBxcszfStIh4mo77b/USle9LMPrtG84EkH9xur00JvHQeveZynSm88mHvsQY4/R9toHDWD4EG2YXyYPNpHCrIhN5lbz2Ilb7q7D7is2D2b0nG3vHze32JFoHrtBSo+E2AKIQgg58HOU+cqCPCFMeAvo1o41tavAogysLTPZNzayW9VVZphPm5RsSfHLTtLqBCx926L/25zkgSLblmRzjXjaUiZdifTR+X6URQ9FMB3Eas6fzZXx3q61iwwliyTZIm6PnOj7++ClzMdvKQKcI98e/xxe2WjRmu3gC/3Ieshi01vie6blqTOLdCH7/TrDUGtk+lop5ie4yW0rsKRfZB9Ax9lG1P1WbNblHH0NLXHk6Xvcva1EhBYTK/upqByezA2VXAnP+UDPglt4gexIfmGv7UXIQdKAVs3gG5Bh9h078ijMmoN8YADvQwFZsiqomIuqgoIAmRL3EzjSScTLi7Es2afp+rhfcJwAU/4OYrGn3dASvUu6/HQIj/6kDf9yV1UogWRaYyKm1MW6Pq9arnBFjcKjP8J1O1/e7+TzLtLBOhbztu7lkOzJyXO9KhCVdCfSMkwsdHKcXiA7BOd3c1LQtHxJHVAquCgDha/JRgb6QRJToqJMFzZ9Pu1XHE3fvQKvMqiJ6ampH32yrs+3lohVxYLYeRvFAa3iILPuBBoA97wFL75o/jtI86/L13TUI/wXMGj79vO31lxFPWbLwZIoAfxUcGPbdZHYz4qVW4/RNAYGyl9Xii2JmC1xV0gqvj4+n5Lpex5EAj1F8sPMvDsUC5oyt0hWinDo1MTJgPLXN8+Numdv1i26R40tuHnUVcnqqvqYhNbjrQ/jK87nkUDUax8UnZ1eLxa5k+wZSEyZ/DM/nL0+5oP9oVTZyGthnpIe3j1bQkmM9cyw9vb2suAqMUuxuLRYDivoG+em/+JSKKVPOZrSyU4dwzLu8bHupmzybNAqh16a07hlCsvKbyTO/DMvaHAixTwp5oBj5bQuVZuFWzDin/b0z+W1KURzsznR5krWPNf7s6jZKXD6kzU2fwAGzVLfxxdNLRzsa4L9kD94SDZ3hU85AEg79phMM8ItTAgv9BjpRXUtGE9H7zmhsTXZNI6YXzBrtGLWK3HlBLjQwJ5/7B499tDMu1D7nIYIo335FK9vmJmgEEvFyamyaMnAV4T9Rqs5A0odpHpTNw4/+Z9tjSEVffdBlpJpOJmfJMlovrtIr5NH0pdVNr6ru04BEw2DBxpD/mm/N1ZTPKLe4xcN1os6HTjLzBipltauGc/U8hM3JwwvQZ12mHWk2xqcJvZMOq4OqW5sJO1xFGILW/bmhVUZNpMA+xGvphspihlJbSRHPnXwW8dTVKFPNFVQ0vDlikBK1dnvOQb+b0dQDurS9GX6V4gUQd7PEVySOq1RKJi+2wRPodos/9DsvsiKjzuapS+1GoZ1ZOWNG4SWCm/B4w7Mjcg7sv0a/o2d3LJwhJpTkIpui/+xOI+5WyG5Go6MrmVeCgRmbpk5qmk0odofy/D8gQNnLAVkhNeSA3dSFuc0p1aEfpGv4H56HTww4C3NaBRKzd7VNvamMSdDm9ocjevV2pT6pOI5oQ36VGNA5Kb+u2etMVKcTsAMQ0K1lUa0KrSsqv5///9AFL2p014gL3lXvyADbHVzVMoWQ4XbLzp9ipHl4GXzaKNTL6wPRHUJyQDXeQzU7YOaee+p8J6/F5s1dCwgVTeLCoPY/X8m5kEwvM/ciRstbrR8iM0B8xRQmlQcJNYscxyNwFEZXaEiwSzjWL+lRy9635p/9FU1XUx7XyHpteZczcVxiIB9cbbOsHVmNefbl4sX9ZEsdfNB9owa2T6vFGF4yS3uQEehN1rlim9UifynOLmuHz/sAU54ohanii0jrXBI0W9az1TqcGKs66/AC8wzoFgiQdzMGBTnsUuDueSsCjTLeiGfaoZBDGsdsr67ypuEsAkQ/EGhT9PUC/UTkHQiZy9ZNgip+/EXHSlrkMB+OCsGNIqQswE/0+FCLs8qnbRlrUoVqUSePoqHr6SFW6sJy6+ISOXmyT3yoFMIY6GCahbSMZA87JVcbwjcBrMyA+TL7KQzwmQJZRHSZcqSftHsFHID2fwWnGyPI8++6VJ8j21/QKoQEkcenSmB2ItD/gan1W6qc932JBldCFaC7eLMJ93h2FNNeOe2dzRF83jC360hvBUz1JKWibEbijdP1wkbyIzPYCQuoL3BsCaYrEIwJh9LMTA+ap+2A35QA1/s1J0miySy7VX1gMX7xt+mKjal1x1k2VIMXprm+gCZrGJB+c7dSEM8r+ZBtlINtah6Nt2oBy2kJDOhLc6OrTrNtjvvIY3MdtBDLzr5XBvfcb8KntMCtEah7AWt/mWcOk5OEmbTmT8Jl/uEe9UNZk0R8rYnNELrWVn6DJfMg33rvMvieLB6ym3a6FcwVx49mvjoFIb+tB3McYy3D+wl8UzexWyxJxZhiMfL45jye3RvAe+gT1kqjlHwCViXZIxvBZv7R2fW4qZhbRgt67xWSYbTHVFMC6aOQYMFWju51zIF3wmsdO7hOUfvLFTPqz6SuDTeGFwDXejKF9GpwAuoyb5tB0+/dhpyixuM767X3qrenY8PjXRUZbI89FzbMJ/LyH/JDsZDD0LYdEKLlONqkNL52tyOtFdQP663Eg5L+8vKS2CKHoKA4etjSpKyWEhgfVfq06ZKZ69FAfZxQbX7+UJe0/Tane5kL/pfoaP/fAjn87ysGHJ4DGhbFXJhmobJ3wiVfNWOBeXm/mLSHheMQMTtCaVXFccKKwhpqcjO3cVz0HOCGfb0+YFcEvxa/LqM9u1a1zo2rX+i83YzFvjT/fLQDW9aETrShiA9IycEXYtETLeeKXgajQ+3FiZRS/SViup6xZWXGZeuJQhumKJbjeg7WMkxiCDQ5TKOBIgFe4rz7/pX1OdZiQ3NZPU7sXmblzQHtURMus3IAI11oHEgNIUcUb6ZWSNFK4kubOhNhQdRHlTAQQFDK6WhgCID8i5Kf0YT/pG6kpDg7fRB+Sqj9S2LhuZ4t5SzQopgbgHCFw85XF9Oe+WNsfeGSfsrbdubGsmGEEC3B0fveaySePc/OWN42JLyTR+gbonOK2hRAhxyzZn0/3tZdWzwEZpjcqVRkbMuiWJM/3BSIr3rrLrzK6Y41Dpui/6acBmDrvNmbUW+wM7LOyjNAMKdQxCkt/XDACbuTtTdIAvI7J41hpjz7SLWH6DZwK2emcWELUToUn/jJTzOSB0FtPRFXQxLOkLmyCUg9G1is4cvB5pYiXbhXLUB9Ea5+wLC78G975qUS0I4b/RE2w9wDZd5AitbYgDFXb9bRzkeIodZ8sBLytlosbtnJaJIHk4xUiC5ou8j1xL7T9GUA7kP2/sik/BBzuehnsmRrtQ9zzymxTSSRFbGItUmPN5UFOTVxynjBXmQ239xmMQaj6DReUYu7Zti6OjzcSmU0boYy1vqefPS3FT/qYxwhdOJ9a39J/6Kgy33+yemnAIUODgR797kEH2PmlipJ4XusO1zCcSFjjOdCTv6XdXClXZio3LB34oVfecz0+UhoAV2eH/9r5KYvQPg0weBGLEuUkQoZrB6u0xNCtyRFKJFcM9Vu2QMnQ6sFQE1g58mFtsS0Apf2Nvd8EtY0S/zAAD51h24YnYMkfqIEiweg/jcBQaOrCLRZ7+9++Iv9DQOkQIm2t6uq9dzmBhNKZ+Z2V72f7mGFvz1edVGP1pMTKLHubpY+4S7ho6dYwcsCSJ7LfzIvDpMSnTSzKioOMs6MoRyfaVWHKxPjst63SErFu07Kn3cX9LvxK80s1sTKs31RWrA8NOo4+m/15vILsp4JehuPrtkaQ6OlOqwVFZoMyeGB2AjjbSUbT5Nl13y/3JYNgAheRO3LV9uf7vFG9x9XvV16cSajTWG3kdJu+XS9AvjWKPkpnN5+KuXcyMcPDMmv6/OV7wPYeGOv/5DUO/gmko9KQc06aTrggOkBkBnLnl/4UIwWZBRdWUjOj9dTEzpISLIS881/VWrU6ABOfD9wTK0zkg4M7K5Bi9Lk6Yt67Aa3BQA4UKpDV+4HwOKnfLd7N4Xg5L9vF3sOvGuwaTuueUZhz7ur8v4EDRrHxzfMu44ZlHit6Hbedb5CCaaXPLiqG3mm78yfqe0f04CaO3dNNuaDFeCCPayIKXNsClklz+FvkFw1EDxFwJLHJ759N+xeWB40pH2yLrW44JTuNEhIRiM4ujIwUxS8GW8M4Aml6kCV5DCK5ksy1OCYafu0tQ1BZYkx3dQdpWD0FbMFkIYlXJdILHQO5j7A2mwiX6ysVJN44BDN6x/AqmtgpMzWW2zOOZkG/8l6igiY+/zasvIAlWt+L87ShMVqnUhgzaNYwykm2zFHndtZnc1Exk/j3/S/3gF64ecyn6sDF6g93r14G9VzFAmZCaKuqAX2/Sl4EBMWd/AbQXyibVKI+oktuu4CKwrDUHJqbVAdopb8WLOb1mQys/hpxc3b/fx3HoQqKfqjKSXlV49GkO0wNOlXOxqXOdP1zlfK+/k3ZBFe31XQs3gwjqZZv600UK++u1o6MGWSAbwxeW5PbfEgn3vKNamoyDgTLeS3e/xOnTzMHrK0YUoWgEXkHfdE+Ll6RPX1BnSpGSRM4p5v19Qx2HXIU+esNI5ZhgQ7JhwIzTHjMdhRQNN6WMW98Lt2A1iuXkayWaSuZpqLkskJ1heraIedCW5mjInsJX+dG/ZcIFNoBTVGzE7labj0hq6zIXDd9DaMw7STNCfT1LEegRDr2EKaR3AAs78GBIac+YAhDZlpd0CwOiviPpnFCO0B31p0f8tN9p6Y5ngNFv3YhowgDyR1/uTD/iseidManzKMZA4wGVih0Wye803Sn1Uy5rj6VygU6U934fFqrWnwAIa93+YNsFxfsqQTPop8N+YZjQDJ657FdBWDVgMY6I4KcFMIju8lwArZ5SzKnhXJi7XozQ/Bi84BeWkpmZTqoQck9Xm8el0xCgUiYQdG8aBKjzaSf87SAbpnGJOHm2uyHGsIeUl1W84APK/0MUGXVAiWVNS5r70ZBC0ybruC++Rfmcd3on+rZ3I2+xkJ2r1ZbcOcoLScUz/Rz27MsEwqofBwtIYRtuDTgDRVlj2tC/ttgTaLf5bUYStgTnSktmCX9GVt/307h8WhmxHLKTd4/GaGfwzqr/rpKw4CY7jjp1lCyx2r81qUPZrq69SMm04O6OsnuCfas1ohW0uRWrAuYFhaMSQF4xKYc8fHd0lIKrr1kaoMj2jgJZbONvTP9HDOtM9MTPbiAkmxg5IT59Rbn1UP9FslHugISatvwbXokW+IJ6nsGZPzjcKiJpIrXXPOv5X0X7I3yjHXBKBUqhraigqHg09KEH049LcC/tT3m8LGIcW8J9u39+Z2LkQGRv8q4tzhoT0iK4nvm8sZESjv9rFjNxHCCsKscRy8sFMZGJ5ggUffc7rfv0umIMKUoFy6HRPn/m+hBi+cIl8RX6Q91KDHucS1gjDHLvAO+AoJX3n5pD4oNGzCcL3zXJzBOK/PjDqe5Z2hHEZZFqlbdY9ecu3Nlg0R7L4RJZIpvXLDVP3OZ2L6BNppIPdPU7Z+Q02H3FiEGKB+otHgdQsjYayLldcZf7hulUjhH3VvtjChx9Rz3kN0lpPTjSFX77HejTfcVvSdrc3IAN4se8IFIWOC/yOJR0bbgBt2IZSEEUznTTpJGBXM5w6fqYB3z0+diN43JN1hIuk/1X4eK3n1cTfQ8gPWdMyISmuBnzqOJmpDfpn0UUVV+wQcGR+F2f3DIKtWSzM1JJz0AH3lVQndVPQ1PejW4Kl4x1NOthoQT+ijGpeZrbRQcRWVjp0Qvkt/n4ovWWy558vylh1kCjyYJOgd7xPi33FqSomqmuaD6Y1D3xGv6TQHx2SnyTcJeC2XxDg62i88wNdg4hYKYQkraE5d3rJb8gGw1R3k9vbu5jeH9wT73xR12sigJnHfSf82G49Yg4ikOdf7YyhFegEW4AN9ulF6y9r3mIk6sjEMQg0eI8pEj59+hOKNRWuaJ7SQlY7wArbnWprMzBleJ+xyJ45imM1MlFprti/Dq6sjZQvmu/6bOuN+4o8N3Sv7Hkf71l/eBLNkZOPds2r+RXYJcwyrJRu8bZLpBXn2xKBIoZauz2nUG+ArGya8pPgiHv/OtEgW+SBErxm286Hp57y+3HpsZfBzR5oj8VifVjYu1QZjba6QKawMW/tZIdUHn1VighFW09MGi7iPSKhcv00NiRm1IwBm+bB/GMAaihJG0EfJ2yu9x9yJIADcgQjnK23wWf6U8xs528iz0Z6d34/xwSeySwgMm7f/0qg7QVH4OUmT1LZY0pZmCmUv+Wafd1ukVvk+ULkli7+mCFukb77vs+P7nmgbBWKtpAJe1gStlpn8nGlSztitdwJz+SYli8tx1Gt3KC7Ct8Io/WrS8Xf9PMU1/LaLrZJmx46SqosmqPs459ysHmPdyUuT8g/AbMuyNXi4194gyeP7Jy9LzTJAMZ36wCQjSoFwo8txGl6aT6obf++AG/Zh5fV5diCvdp0RLLA4lMOLB/7n6XgUWsR3fyf0EYMw/U3Zed/kqnMj4nHjQ+FhIC8WHCqWNfOAm8fV/aknpnkfCRsLvp5r33e7Er5/MTUiUQ0/joCZZxRa4KuwhKq7JDmT4uueI4z72CVV6zBVUsVd5l59D05o+/441tPR9RJ7pOGMMl5rVljUQoXISrewHyn4Oa5xR1xyvEkZ8UIEzWBisHC1uD0J+0D/xwZgCFPBc3lolcd8myXdw0uZv8Y2DdwFaDGJB/4Qer7M0UxlrICTqQ3fK+amGAcH03oHgVpjsx711CkgwU5K7E2iOPZoFxvVVMfwAOf6L7E+uSkAcTIATOJI8C8MnZLSk1DC5ExgMAJptGKTftFaZ3d8bP8iAwAbLze7gC9/c/eU7VFp4LHRGZzQTS1KyKt8AWeILhUH/KFzMJJnZaRuqI80JJxvfm9km1iUm3VQQY9Ihaw82GxDrA9heOqsVzet1BZtKX+NgQwK6uzHR3zhiPaKkbaFMqbAqZ0m2HG2lgXcLjcQkHzpyZ99aE51OWNUY+tFdCnUnAg9LxgUY2MLEVW8UycmwPn1T8dXpW16NXsHDPmUDmazoz6tDMTobeUo1XxhLj5fHZjSs992knswOm7ng6MfXpVHxihc45SSRVOBkBpiJF7dg4Q9Xf1COxutpqPk3fuRSWfxuvvu2eL9aA4YhMR5hsOd7jecsoPik15NwpKQqWLA4f342co0tu4YXU4Uff0R1t0D17C35EL66CvoUY76BAO/CDONCMD3Ccfyb2MvhRw0q7iXnpWm0XTwfgZReWhVb1kKbFl/SV+dQOE4xZSNL+ILmQPeQGNOYG3MaudalfmIfGEhg+NDApovaExpWnH3K5bhiAlzbZUpXZcL5ezf/abrcD1FhAUctf/dLDI0mBPkZRj32mP1+gBC+gp1k38AcH7Go2eF7osNs8OyaOQ7/ENUw0v2l3Sc/lKk8eTGidSTfmqI1htUorRO49NEY8nOdR/3lpFwfmeOcypKL/slOmLI1ziBQjch2lhD+HrR9ag1auGlnfy2BKwHVHYozQ7b7HvUz9EAv3bPBHfmr0VTojyjbFRSQS0meaydgr3/DHVnDTSCwOTGhwqgvmgQtMXdB7O5p/yfcPAwVRCXTPj5XmTyb4Il9cRX8OjQIttrwwxs8d0/i/m1PKvjEdEZ3JQ750laOfUPC4ORhRL1iGd9A+c1xGq/D956nFf/rxMd3Cf2d07XZkjHfwdFJvmOhu3yzXpT84l35/mA+ZJBz6x05Zmyd2HzcAD5DkNvuikVQz8sb9gkjPOAd1m+/+pHFXhbGYCrsIWiwa8lmGkqKXeHnbEV0knPkk6CLdeyn7P6y62LrGtGMz+pIEAZqwKptkDlmQcvlwVIILPlv5scnZVS5Sahp/1sGQgfXLWn7ETTiYa0OLcuUC+9l4Z4Bl7EKB9RYrINpUxRrgtIlarJueRNJS0VaDBjMT1VhPPLV+WWEkp4nVH1FxhScB2P314bessAkGF+BQLmK/YL9Cmw5c29Nuney7c0dmh9x8Itli4AOOMrVah7cKMhpBemCR6VIEIE/DY2Qv3QzICGaFmVXzhMF6ealZMwmxJ8jyOmfX+tP8n0PWqfsWtGb9hZtVaRCtmWx9pkLLScU5rlZ5q0ucdMH1Z73UkYLNIYkCgAHicCqJEBOTB7vGiKBGZLiJ69+rO3r1q5n4LaXFTP/Hsz/uNbWnLrzZXWqdaR/WY5WwL0l+7wHJS7EFTaMYWiUFEro3U9Rw+F+8ck2bfS+rvHuE6VU2gTWvb/YP54g4SHQxP688q3IdwIYW//TcDhN1tVq4vbkChiR/6f/1qFOrVw+aTE7J0FATMmGSnj+N4iIyseBFDFnHNgVO14fzAyXyNSRxOZy0lLz6Am3myT4+7g0sQ+P6SHVA8Yr7iOzsz6j7Y1jW+6hJ3y9W02aMFCMDDPRmGHQAw0CRtifCTgaBaSb4MayprwU0C3wSaShGRNVuNrMfdamZ0pcmE77UMekARi87bQ10n1nLqRefoMkt0MdueJF/6rOt5Qwyoo34ethOTPJ9aWVgVa1IQoI2arqbCa35ISiCVg/QT7PgRP0L1YHGXENlgtsSWCw6pSJGBvKCnDx3TgWX4MCqXJScT7qDQDZFNOK3gpqlMJMU1G75t1rLMWfEbJzvWcKtK8A/BgYQObQQ/ZctYdYMowkII1ZDS6MbYcNRidAll0EWOuqYRT6OdTBDbdPYWGOk1Wn/hh8uzkmkVJwtuNC+UCoQDgkgxysTwJFuqjJ6S7NkRANBxIPi2+PYpJj5HFp7A8iMDJfDhZJtS4XvwO0nP+5Bo+k36ddgYZBN1p4ZLSyG7YKzdBiHLdKGyvoOVq0P/5Fa8N6r8T2h22hMak7a5Bt2F/b5Hzx6bDiLenAI3TG7XnW/C4DZa80kKElWL955VCMxLKPdM+/FDW22KZjTfMzhkR8xDqElxR21Tf63SucHlzgcmE6do9a86+ZqWZ9hRgEU1q+nLny9yIIGgIxnKmy67kjjCjOmiSVi5s2XYwZKh+b4zr7XSTxb8Snu2tHXfCz6pqxRNQczYWpmYQdJKWJ7jBH6KvIMIxh0x2rbJZFnsfrPWxzmIcl1KV+OyQ0Q9SYaCavUiY9PRq2JpfpiMH9x8e/SZmVIMNjcHau/B44kjUkbG66FgFs4/Lz8R8aDlNOtqSMr01amhikGfCwgM9zWQUFfiF705W2w94132Ccz1DkiLoGnfu7teSJ0GM1q765BrowD4JeFAw8uQ0MS/0YerotUv/aTkLJ/EpAcPpRIH2A9mjbgQjVbfOhIH71JEu8iGp9fihNlCzVHR+1hzRvWk61enOccvjp7xebpSjr6oEfrcnCzIrkRcrCEdxt0Fs1NxBGYfcT2xb8Lw10aG0q7TX0LGZVJ0BSTfxm63GFhy7JLfAy1PU922+3nG1vnS7didcgTAZ7+EuXB2WgQhCrsTkF51ynGDn886NKKHQvkpZ+zQAr9M5C9t4DrakXHDqhBMofZAhWCAlL+DoG18XoUHupWG7CWjHpyM0iWTbE4PQPmBxq3f1J3QeEb7OlQ/pTw2PGyLER+ROoC81GzpXRYIYOzWwU7/nCDSnyeUsG/du9ObAblAKdN7ry0rKLFWMEBw9JorEnD1iOj8NhpJ7o2ihevi641RmUE9n58gqjNy83FtY8qcj3TNLqt3fRyZgHBqzcjBBkl8cXl1lGMw3hNn10FwCrJ/m4/vQAsFf6NMMKuP46R/zvg0ojVPVJ+IsT/6PmHaKVWijbyeNpTP35lwJFt3UMK4usB05Gd4r4UPQmRe551yqjJxKJT2Hnsy5Atptds8T56zZ6g82iBdruh/N7LlAvVsCTn+wAeYYoNynsiCfGWAajlrERA/rtqUw4EWgzgcXuOfi/zCtpttsEb/C+5A1IqGrklj7e0HJqohnEMq3tezBQKIrI2rVkXhKe3VrcMUQy62VX4AYh3VlkfP+WUUbK13wW8G4gAJ+tPBcugNvvsmTBWTLJS/1Y7d2Eq3xb3oh0xUWlgRcmjpq20wLoE+iufOR5ObbpH+TeERkeVZd9ir3n8cfl6/bxBIF2u3sxBtuI06kJHgCisR1bSW1fiIkI4UvbfapJcicC3CAsQ693bTfnS8yGXsl/YNMvSC8fSyMVXaHAHZkk+EZX9AbroDQcZHS+z60Zw8Wf8SLMV1fXzQhCdmJvH57hy2WzpPVqg4hdB9SOUB7QUUh3wrJ4INhYj0pKHmHA3JqmIR5FfiFmqJ0/AdeKl+6137rGiEr6St6hWzT96z2ydlZgVsvtJeV/UOXtBeCy4YIBAQoqWmZ+jVa4qhNAvMpQ0+sQnUW1j+ZiJMSKc1TttbmtFnWmxjsFD6bMayEhJJ7Z4bs02cfVyZlVPESmNCJAQH7FnaYOOfBeHIkPK3l2TPJUGPGt3hY5rJPS8OC4GNYIQ7JTnp9HhNNadQz4yB/TGnsVXsM9I4PrfAKU8xU3jtPbBkkyYUizC1qGPlELSYHZK0N4HJe+zVFnoEXkmFXpTDvCKAENV0AzR1DxswmqTmt0CClANh4NpC2h1XR4h3WBl200DOiNERtqzEebFwMR7pmrP/BYMS5vNmClxRjUQVkxb2LRvEuXs/hMXfDvW3EgPxtJXkEp48jwWFkyvABOzLad+iWRe/KpxPpBz2WXMKt8Y9AzeChMqsu8NEIrNzlYa1qn0x1ztnLiodPzvuwXykW2a6s/I9OaPYUbdsHM1zVREKQHR3s/SM2HFJ1Qo9y44nfW5wIuY0nrfUJT9Fe+61lBbCwLKbxafE8RimA9Qvz/4NyWkD3oB5E6u/f5x87lDzMa8NPjLXPNesdI2OJplgLmE3T5Iri6yGm4vWnlxyIMzziJM1oE76ZQ6ikj2Spqn78zttg0YXdy6WHDTIQBlHumimoV/0js4z1b2mouneP88XcXkAKrfEJt5Bj1ykhLrRYgsI0KZynC19Fc9uS1ZCWO2QEI1XzRkBwyk4gzvHyRZA1RdD5tHh4QDBsjnU4Tmhj/NnoJA5M1tU7Qh+JaaqAaCnoqzuKjMAkShBLK+gy2eMbjkqj6e2lCWaXZzUt37LsvCI3MJcxa/XuBiD+QPRVc4C2cAQ7SL1wv2y4qshp+iB7QP1hSBqNV+lmXwYuN14JaPBi+HJ80rjmvhieurGA42IdB259hPi/cQnh4QdqPdBwsJQqWBdslCUz+ZQbSvdSHb7pB61v1thHDMNta/rcfXFgGN0gRVTZ2bKIrlx69kqyGG67lpCUpst7hUYemYkEoKAf1EEbZt0EeZVfP/Ak2wnhylrc8u2gXHfM7wwiMxMpN6AfOCjyplAOiob5sgBOeMeG8TGTN+rTTet6nsWwM15uwbQmHFhF4rcrok5f1qJ0Q/gtOIwjMWaCEtwLepebr6awokajomYuoCmst30fY8aaoDQz5BMsY+Dbq9Q4ombRvReimtWQahwKylkQTvOWGLPkQPnRkJBfGMqxkAJAbDXikBBxr8yDLLTOWnHgnDagZBzsTe6XmjmTfOPxrLf0K75chaZYtHb/ZQas9gBPrfAf6FfSWVRbYDNuv9K+nWBzEFR1IxUOiF4Vsb/45S460Q9tiIflv65OQy8p4qrkbPUjCsD6H8L13i09pvKsCgcT5ec55qNc06lU2BLoRHVnTdDsT4XbWDqpXBkj/aeqJ62mLFLfXJ6k7obeFhUaB/CkjrPtRXzxEMd43uzj2xL8DCwA8xWH758r1w7y2PeUC1k/3hmUMWW3MO6Nt1HudK9rjBW7XWH9GWfuYPKygsrPypu3lkcnFOcw31s+m3ZSeeda6q/YK3VYJDd2GHGjbKCIWegANMIBSp1aWRAHTUnIDO7Pa3adCXT0q2T6jZTenM2Wab2NwM7HkF/A5mHsBr9KfE2H+jlWBQB8kmavWGvey3YdcG31Y5a1VAPalxnACy1x3hjyc88dIyeXB/eUyfW4AZrw+oIkfw5dEdEmpyZk0M8LOPW96jIQifcReRlkOhBn/Mnehdq0u+Hc0jrkvDKFFnTuiXL/69/hYcjJNOt5iUfRUHNMqjdI2mogJJXovk9yOI5+MIwhw2GXRTyXN52YHa3DXJG7NJacJQ1MLIpPxM7TYDBh6Og/y1ItRv0FnRh1a7fbhtu8jH0XOngRX7h9mawXDz+xHQ1u72y+bXhlLZGrIfZf1I7QWqQ626p0L/wlPBkJUWDjLpxN3jN67TjdGOf90Lp6ETMt+aL7SRNLOnRpDehEDSniXjGvgxH8zxHgyY8CfeWYgZVu0gDNkaldOfTs1ZiOHT01eIkMmoqJ3qAcK+qZkutQMTwHWytbdkiKffAEU1+shJ9kjs4y6BDDSXjQskW0sQo1eI3r2Cx23v8MDR/NtptGGApmObWsUdd2obphPIiL5xHJUVlktCqkf01kI19zkhNa4RZSgOTGY5FypouGtjS+QHvmJ0qTHQ34vq61GlFsk/BYMo6RgAEPaGRKduTN1jr0niRwnPrCkhjTVqIwxYVCOPoqCNqUN75HCeTe8IK1NzY1msDBMSnca91/R+st+SFyxGcdFRXnhPXWPKoR1kqfGUPP/Fh5+EoNSVD+IAuKvA2n4oLNKwGXt5IqfHIEMZxUUpRWes3o1j0hwWQGH2xUoaPB0QwR3Cvqpjmkqb9/ouCdPzT5grWvE4ojyHNx5V/uSSSWvq9IFeBBQp7qU/WG1i5lPLfQM/Sr/QAiNlEeOn0Ps4yZkyGnd0PUS5VyyNCIPgHud2JKvhxlMJFIN7o8fEZtzD5wCWNTx7B5OCJ6EB/TyxMVKln9pF77Yjulo6EiZH/4zmsKHkq1gHGoATtqthJ5drypGgO2Ac7FzPDcHJ6yk10QogkzQFhpT0kNc8I1EN3QYT144+3nCo8rkq610Z22z/+wjqpacwACZ5ec2d0bDgE4G06vnjXDhoa2DKnNgeLWayE5h9NT5IEBxI3vJi3BMxlJFS74UsUHGdav/5tfR/qfOk5aSg0nC+DLoOFF6NbALOuDbWgxSc7zifYoM5TfYYE7cho7YHw0QauZnrYYgHGKWKPVbOlToHi7kyeMEdjDBY17rqYzKa4botHBBeDkb2+o1QF4h3Z31/vJRqct9J5y/uufKahPP3ky70JgtBKUBePbT5o3Z2dYb15rYec08YK0DEuIzk0BTPHzatFGhggxpteLTwtalTI0+b0BoDpvTq+rLUmPBfmuBOAJ/Xu137hcT2c6hGmsHmqn7tFtFMaqMSb+2rxjOGsN3nXlaxLbCZprKi831245HcEOBJ06OQVd1dmunNTjV+ixWDdZperxUZvaxgyvRpyqlj0x7o6aLc7QujHzHfEXYCq2NPMUU2uPLe9z0YFF8C9fpFq+zRreJgEN9wTDzHQhwOsicwrnvCUcodDtmG5VAn/1ooeTA9b1eixUuZr8BrV5xIMO2mnqX13Eky7WhxFQzKmgZudNANv6uvmJ0AF1skgF2Kg7RS4XINhrlI6tWOkuI9ZNMZ2M/8jf6RMJUKEdo66oopIrGeHT6Ulyat8j0gzDg7Vge0K45AxV27+7XvjRM5Bdrx1zp1yf43CfVStoaa2MI48gXaurAdcE7R2m+uYGSE5E7VLiG+e2RAR/cfvw29kiXpWj+8Ow2TlbNHLeQCCpOB5ijB58VoJTzyObVkAtIYvkOylyxiFYJ3nr/ak9zv8ntYobEFo6Cl050bRNgB9nT7SYTk9mPnjM8z8QIav+/pXSkfq83TvCxwOQroRvygIuUQqaEanTBksa2k3g85U35+ddHPKOTsKBqil2LdDe+rQFe0BqBcHqLHITfbWiHYniQSekbzv3scQ3ISoLaiinlC52yI/TlO9TwXk1+QCoE9rPwtlwj0pSrhQO7zc+xL6C/JQxvdvl2how+HDCVYHeoYsGrNBoe8Y2vqLIkP6hm/ScO2U0ERxDOYv2dOCgi/u5r7iFqzWY46lyvTpdsKx8QmD52Sg5fwnPVBRozON0zmkibiDjmVcdNMT1v4B2lZJHOOwSQKT9bcwSAEbCtY0xK/54g+rmUvSxWG3D5naNC1UBjppj2iIRg3PkGARLMroR5Qjtc57y7m7tgJlfRBp99LfdW0hHXYN8s+yxrYo5KO71IeHlx0k8wUKmWJaB3/WlVNn21b4l9Rso17nQNTBDRJQh4E2yJIvc6NaiRxNDPllxI0PMBUHORukFeqwNZxKRVNaABol7Ne5/vXCWsk6O2oxmDRDES+lAkK5Ibje9DiOJ4AtRpIHXAEKrQEviOVRjIOnPMO4E48zNekSgN9odNzsgONBvRCuQwIyh977MXrA4I4/ZylGZ9zDoMm8uE/hAd1xQCHOhRhB/Dqdiwj3UMZDtoy+eTE6tY/a6QT72ikDX7QRKNZDgZxdLPsCf/NSVpgxTAiYpi9ORGDvadtJQrNB5VvW0PoxyN9lW8t70zRewVwoNsXclQk2UbnN1xBSX2yF7nmifAUaAy126TQKiSub8CC+R2AciGgTOLdkazwBLumNOJDRJsEfU5WaKChMbROYapZkHhTyXZJo/9TXpBQq+Tg9VLEvprsTVN+NS+6jKmvzv2DYoz+N8nKapwAPyluYPpnvgcakYqwdZGIhvtg9zHrMdt4Bo/C6W1wzCdv/T6TEOEnJ3rlB22AdF/7X5jM6mHCxUdgvQRFXmdniTsCHQ4QpW6JpxhOFX/RgTx4DJbBAoIvBBKEhYu+i0BvvJHxkmkLHu4vTlwSx+hJCZKOJhkPFWEGRmKQoUHK3YVebtLmoZ1Lno8codbL7r2ZZssvh330ftFCRs7wW5EKBXFJAvZyBn0cW5LmcObKx23Mlnetlynq23wi7dabOccZI6LVaHksu7zPSaJG8GKvvraDkAW58jtLezgqof6gU0JMhyFbqH6Dvh2dncXHHxwnouMifs6vfYY9Ba66ecY4PPTFMGJUF8cHX6fmOrUp8tGRK0EGJFN+r3Au0iaki9XjQ1vO+R+BoIuJD0xssimhCKNo9Gt1W01hute9oci7q22nzRi8dSDirlLxqRmkICpm0Oqp7vf4q5TaExNlkbOh+PIdUE0J1NscPeNPcUX/JD5Cwn5dcoatdfFeDRTXsQ9MapEYj52/ZBVBXU2KBP1w48c4wfCSmSyKbSSU31rDYcrLzy8kfGSVBTsXa/HfRE454Z6Kg+PTlwdhzjKl7BW5Ubjvxa2wJJXwTqpPj8nTRlrDorB1B8ChWGbd9VVbtsyUB/KJej8gvyYO5S8xO9XbxKkVgAYdo0GxcfOpCyNThchZ+edLk3njxfIaGNqO8ZAdC9hJbpJDFWWExiIzDfAnvxoTEo4wPBY9ioCySsy5Mghz0pz+M93iYNvEFRytdS69aOQ2Njb0M9JxS+8w4prwICWnGAap5IivrNL4/y0tRAm8k2tvgJxzHfOb7vKpSBD8NkExoIr9PlMhptNPvUmozBttUCDNTIHd/AaMaxhVUG3Qov0aASfzNF5JPlJ6trnRPar+ebNMJVSIUlmro++ScH8JR/KR85GR/qb3joWTP0jwlArAYB+HzafEKLJsq/opUGyFRcIjqjpmugMjdCwXFSc51iw+VppoeKxM5Yc+NEfi7/hsPJ0Omy1peHpmCHGRDocAisKlgPK5g0n6f21bkjOY9Phju3xhEXG+ZX+OD+1ZZ3ngaTYDdTF+K9rPzkwZfqYnNesPjFym0uLxXaTg4X1cljNLkTNnGkdHjfHvNdRwm56oWuaOHlnuSBhw56fkE65r5fYn29Qr1fote8FWYaF4Np4e+tP2syFj92mBBhAgbZEH6U14xhMrZXmplUJIUJh7i1Di+OE6kyVFB1ZG+5KOMH5WpLKi2i1vzy3w0aZMSc3QTLqoeJMD9S4S2VKtWfZd0TJdnfXSvn/MMUPQvU1gN8z8V+NJYnipkUiEZNLPjocRhn4TVkl6QFfuO2CShi8x0kAaMpGjkdltWhjTeUiqdPuNh0hJbd+WM9HZXmx60uxl/RXTR4EJ1oCK3V5Lk+/00ToquyZu8Q+bPOlLIS9KbFBFsjGsuGbhOpMgPkpozp97oU7+/gfy67p6zNbuYyUbYRqD7fk7WzEafqYfWx2PWjzHy3DL+j2T09WRzreFAimfy2Rodltfi+F7EPKHPMS3aCaONrNLDLs1mUjPiWbmjv1wHw2C6s5kvm+mBtyP2nVzCrpKW7+ZvYdmEiUhNNm/IUHD99CFSCULndn6/bKLp6KRN6tQ+rny+5kmYXD3pSPSrWgJ1kB6pLFuqfK2l3XkqjCOWlU/ZZ+yi4a4uMtJX60bkq81AkG5mCRFp+tSuI7+QfNVxqy0V0bJ3oatuMhBLIkH9E7HRBHeDVz+J7n1bqVxC7KS/K4cibgUENaV+nfiWQg9+U2u7XzfXXFT85zbsLirgtosQBN+6tHpknm5IP5vzoBlvgRBq45J5oes/Zoh7BwFbkYn8DBw1NmUMAYUKGzAc/gCx2vos1JMffeFqidBlcxm1bB3297EHNoCwZqN55Ou6pQ6Y0mddCfGKQdvrVyA2nMsiq6MgaXuRcP7zauugXBum4nJtAE35v+HFn97GIn4hmZqPEUL91i9I5VzsuS7bOfbYDPxsT6GNLJOUb5V4UEwaf9mwwQuquVVw0p+h4AGb7hSfoB3pKwTgRqIxp/Tuo/sYo4pV+kWWlCEpl9C0IHsBcdmCsPVX1SXW17w4UPvmEgXgBlSUH39HHv4v4nV3pB+6b0hr5GLUPfTMv9wDm8rtxOmXPSmHfgkkMVxQuMH2FwwTbA0xjApFy2y9lgmsHQP14uO2nbRZsV0h2i2kr6R5SvaNMCJhvfecxtki1+87R7NMdtgvZyZqWGgi/BnHbC0vhBc/AgNNlSiHertTwzEQE9Hg3Q4hAMJqL5lwE1vYi2oKPYHCSJvEpxFDudMC4MC53TnoxsCxLXgwvzfUM/KaFmlvne0KIgdYM4Yea7J0yE8Zn5I5nl8+lIiIUqtl9IEMvGEP+5EC2imwXBU6Yo/l5uiFdkNMgiQTg5eBPHCFYGAoTlAfEtmRJ0FH8msJ7ydezRrTXFsnQIKK1uBOIZULN6Lpf0oteqn3Ob26/uzJ1MCi7IzT/q7gmLKMYGwTuA7x9O/9iCUfPGDTBSvDwEtPDaoMPGyfdFdzWCVyNQqC1VnNXw07HoQe3WSUq/nvQ96zcNqJp+Jcie9M7ux0QsYGZ2X2k9Ih84CseiFycxhuziVe2/cFvdq5DBj5ELsD0BOyhDp78evXkxqjNLEQWZsni7wlUpGUTdlmfhHBD1IAYddDP9xed7IhlGZLPRdrvBPPqxMRjaP35vXyfp87ZwcbrXW8VFMKtDRYLddJeYk3rnS3upU+rSbTRhSbKcwMvMlPZYpuYJUtvRjLYqC2yco+QDQEtPIqYvGWziszjHfyoa+KSdEIf5vVb5MJJrufqfMycnytZi3G6J6upd8StdBhm+vqM/KnSMlq8K6dwQBLhHq8oWIiCkZVgIV/Zc+ou6K+MAzkw9Oo6AOYnmVgXhPM6oz7EGWhz5EAsLUs65f6LfBXD9Ju5nZyFJq3z0nQHT3MyEly83s63Lwdazl52xRO0sqdKJLaHzI29xdpYb9N+NnQV/dP05jhX5tIjia9Eeiphb9MpsuizfQ+bWN/BxWMXnLJprjpn/Q5gifLL1CG1mu3sNhPJWtE7BUgMuTFR9IpuSe+RfSK3/ISE8NNKkR3Ybw3n8SkW3Py28dmFc4oz2+6O753jZqTD6TKmn7kuhfPneazOavrRKJJebafvMkaAQROEdP34lKgf5N5Yyky0eykL3YkFyGPz08IbiyLyJz/uJJqGfR72mT17ITfC+MkSBZuN7SexrS6qZd4duoJRbGr73UWfbB/S6gi9WBFNYGZJtiJxm/du1kDXW74pvBm1E/G0RWAvxrjPffUWLfA+P9NOalsgAW/JuI4wML8Ewr1Ysuhatd/4sHLebR15J8J/Ba/X5StQ33SkeNaaGtyyr90rec+KD2lzc4ZkUJ+uAMsy2qp8b80KidkPfr4GrZpyNgZEs34/Uujkpuj/+D3WsfVzedwJCJLYtqnY4i0WegVV9BKcFu/st5XXAjm1oplBJ2FUkNN3ugP8F+qXlzjK+st0bSLeB1plyGQfNkQl1vDXpZntAklHcrQgCnJULSCYhMf860JSSEq9hKolZZOcI76/VDuCNVleWJMAAxk3cPNsJKXLMl18eNm1n30USXQmancmTnLjgqYZefU8IEtHA76L9PEg5BMuhdqNsOwVZdDjQyWMawbm4o9jq5aD/400ljLBls3WqxUoTnouSOgN/7gZPNgtCV1HHIghXoPwxsW1APlq0xgsSFmfPJLlD2D/hMHcU/f8+9yW81G+45YXz8aKRQre1Xd5XInpWSfgcGff+HFxRQkuS+giKejaBu5w+T9jH820W9QbSgJVW9DAsfpXOj9goMdqlfzVPrkZ/Zi/b6i8FVBA9fBH2PN2eaiCPG3OTsMVYyivnvDEMdSvQGCcZeNse1cxjRfzDcnGOyW/93iS16yGUQIZAnWOaAeA12PMUxoa3BDTTRxu/Hdc0DJyCDW18yn10+IBT0e+h5+bLdhkQNhWu/Ub4ScFge2+5LtbXZ6OmcJytFIgLwqilKEQVj2WcUwmHmxdfUMCjdeEW+91PXjgFbKQyjF9GJMCDvROSqy1ZzSRtt+IFvxcSQJIYTuKopap7kWGRyx9aH2aIiQHHGVsf5eVoGtgspOdSu7pmDuiXTQGfq3xTKRxWFUhyUSpixKX7HuV4JicWzv1FMQVMv4oq9BkOYxHNJp0VPSsksdNJ1yqmjqkb6lGSSLq5BGFfDtxae47XkyMZXeUkHuqsU/IMgiQMUpyGQGYdjhFTfHphNikbmhUspAAudNJkSIL72Og6de3bKsXqoJ5u1TL3K+lNbmpBgXMlsddiAQ6dlxAkq3HbH8mA5RGS6rlwSojUaXjd3HSwkGf+sXpYj/leb7f7/NkWGB7o5X4RmGy8o5oUAUMpCDubvJ/JPiJfD9ZuEraiocifS4/O84skPfXHOxRrQONEfCtmZtVznwddZGpSCxXZLZn5l/ehQuQ6+d5YQzWKzdbz7LVnl6+2p29TnJEiLqMwX9BlTySktdauV0G15l6p9Wmr5wuD/sPJXrFoIIzgNocLv039/PvkS6Q6P4Yd0jMA77bP+ayg1JK2iKuT73xuRuMUhrHwNpSmyNCA+H5GdK+0D2BAMeZaGXemFraKjtq6kkZr2n1+4lQbNGowlXmFRJWhykCLOTu/5Yc1sxGylNZ5iE/EKd6IBbZK2lvxq7xQVA8+xxbaxF+KA6URNjwzoTt623lGumz7xHtvpG+b0JMjZfl6cg32WjCcH/Tw7mdtiV51p01EZzue3aAR6T1leBIE3WHdIs1z1l9irofAH/fqNnPRiNbd4JcTXJ2KtNARHAvTnsmThXh391oGfCioRfKGd5UWlfRGSiUy7Rkc+LxkMyG2e7IW8kpy1HjsNYT2rpN0Td9kBtn9Js6MS3Mhr4E7hvcfP1vebaWbG7ue5hW9FJJfY2u/ELUAJ9H3lJbaXMUDHmvuCI4Il5SrLLirNaeYe8QabQT9BGjwDl7iQYA2nfwBwxUMxQ/GAy5QecO1SboMdmDpPjWeNj9UcFe7w0OqvLukLNdR0Ugit3rVlw2ddHBbgUaa4dYA2v26q7j6P1h3hCJVc3AdMVk6vwvMDygK9M3p5NXpBlVorlcr2YOs7wU9J72yMgGAF89DIwKV/rSDQasS2iEweaXB+obFBbuuofhy7EWlljBXXNC38A3XhfpbWocw0lO9tsG93wX1GRg3vpp6S23Gbw2fcWbQ98WTSGw1gmR4r6uXgPsmYBKG961Pespfd802vBONdy3yr7y8sO57T8Uor/GWu0KGt+q6+lwj0F8NxXqToyZTCJZquXXhzV2Ns+/QSwYRqMLFiQGHt9TQBs0wyg2sy4Jx+c/RbVo19040VhFQtYvOXgSTISdr8p6LUt3l+H1ljAQp4tifbXKA5Z0snZUcwaiSKSCZYz3UnksOI80rotN1HSR7TINNqKXKV4KtGuSvx/9G5xZZbVTSrN7R8nMTHNyk1q4rhob3Uk3vrOQHFfyxi0jigOx3X3CoSgGcRBeONtdzd0Lk4zb8GGd2jwT9vD1xzFQVbf7qF/LktFJh5AY2h06H0cR2a0PAGlkCB3FcMAcabDqHuS+aMAxHvVSI4gpUWcioRPbI52zl56yZONkHzNBlHBp5GhOUOrHCP5HaHmVd0fITfKlCgA1U2X0ZKMibe0J8oVfGryC4P+qOXfJzi6qE9o+uJn3n7EtJG74xaEcm6QyU76loCSGBNMNJrAmWsrAQNdecdphjxH8T+boEFk7pQveuWgUjJdx20vBhsGYw9bf8ARd2cGpnLf5Ouz0IVHQx7p1CSHRrhgOx+kE38DMRYgNp7Uu76ZGieiqBy/6hFZljqbFu2QNlkQyLQKLqgAOvs/bYtpjMkA7GMbItHEylwXb/2B0ZTXE49FEY17HOYEkOhEQlBV4tSniwi8SPRDxymEoVuRWbhrrLyvB0IKM2w8wlhzCpwtHyKtFoQpJQ6hzmNbepeQgdFpcxGtI0JnoL9GmS+f7pgrMsufSfGRg3t+s3FtPHwcwVFhCmJF8RxvNkjcZk1RbCjZMKhZmc06KOjmFp9Vl9OG/+Qps4hObVv25Yx2z5HBDuEdxzOqrJz6+OUZ6gvRL5sO4CtXrNxz6950q/tuhHh/qZ8naYjeVcwDIbMxBET9+pCfGq3yaqXbs7mhhuzGMccC/Ofoye3BbTz7fhPcYGwPLRXFxj9oXGXscJ7FyGFIB5F9Ymud1pvm0l8l8yklMG7ky/wZYbJnMcHitPkG4DGFgPSVCBC8vTocbNNxpLv6lzEhWDn38RwWjxPmbgL7KgYv2/L9YC+Ev8FT4hq3dyFj7W9QtznE0kjg2mFDyDZPJDgxN72ypaHwuk1klOehRUY8eASHPQX7CSIrCUFoCx9HpVammmROeClc3YJ4Dgc1G4n6kv3J1IT13bvSAyIP7LcR0hMu7MJyAM5QFPrNdvFxagfcvVW5HOGctGw6YjkHcJkeX7Wn41WbqacqKoX/DIueh1vK3pkqGJNr+oDNFmf38sFQmWJ+iZ8GGw1eLs70MXNu5usZLnLpY+jCZ3T866t1FSAgEOGnROAbDEKl4wv+SoQl/pi5JHnjDFB7xLQcQg9hJYkieuQhkZJzAYbDRB3a1Mr5VvnkL467szEiIAnloPFzmpK1oinUDKa0i5bA4hngPCGt0lkyPuqmwxFBrnpPPPR65yOclqhAgD01i7ArcJtcOHvquKW8b3FXEsO/rsQoK6EwNnQ6lGnTg1VFa9UdwyFd362cCRmzbair4Aiv/vUe/wHkziXxEW/rIXsmFASzluHIerqKezDiaT9aLTRBWZMZrccVFuZOIZAg0Il1Z1+yLvXFFJmed4gBzpVD+R4hlvUeu7ke1bXVwC3UICsyDWKqUN1ti/fFLQHySG5VHidCPpcxhV6JXGPsAX49xTW5MyrkR09QjQQwD+Pk0a2dhf02nm589WIzrhx3BmRgjkgQ38tPMVci1Yaam6vEG9ef6S24TBLb2zvbVeW/W8K9yJSmKvWTeVfSd45B/Rx7i37grx+NgedgseXl8CbtHJYFpS/1+p+HOJjea73MUrY7Z/NKfkJA7fDRa7D5Ibjh8eVVaraZQKun2dcc2KRxQjt/oDpgjpGSKxWS3o5lGiaFaKIkjKytAOhTAbj//htJwW25FsKCvYIpC9vKTMzy/EX+tlhlPOciXM4pOsMN1UGxjkdMjK3U/T2ZdgUHOkBnHZPeCM3nCJLQWCMrbG8iaX0CdP/A6Q1GAgw4l+vqiqXIeEri214X8MMqeUmsD88tcjrSEQGXLKgNd3a274xgMm9I4MZKNmgq1wNsS6E3jEnSyDDNbmYNh9/6qM0FolTFvOhDGvPMRVvwolHnRNejmlvXmFkaE3GIw0zg2Hn3xXDQ2bxwnxZjzI1xP38PITmAC1uBNPDDsuoknzPHceLP2Oka/QlmBRnZj3HBlPm3+mZ/t+NlTIjptywZFZVdpqb9MAl1H5+t7HmZI6nc4dVuay3+We8No/WlVTTd+Zf6RsGMn2apWtTi4jKDcxwOGplFJ9Fp9e8tYTM/a39Jvp2rNcvk9zErUFWY2mdOauxKd2IEOAU866dlu1KH/iMnCdr7NIp9xnVgs0J1PhXUMXjc/Ni4QaLK7u8YRGYt6QP/k3KWOOHCVsyv7SNaATLYhZylPnjO8qdWNaTmcaXk8WG82VAowbp6IHdSQWlAOKUm5TIYxuv2tlWp82CCziq4BKuxbD2RDtmCKuE7vAYYpUi9aJxpM1DEqxwSyko0hbcayLqIkzgevFfb6Xu5hpNmUZZn3Ln6BikPy2rof0+AbepgAWrEMdlGUfhWjICsepybx3m+62eG0Ad6MH/bLSBp2L/ucir+LtOk8cw2KTWG08cMDWmEBvGFtK5PJOOFXuPFCuphFIM5Hg+OnGGGkUD5D+VDYG7jTTpoQRgonJ45kgFPSr9UsNEKY4dbX/DLUxq44EORplZHHQT7Upo3tBhJXAAMbfTbqJoW+KReWemHpI5Rf9pA5fqGi0yq0f2DgbXdlJCHrSmby5MERNwCNZvy6JZMnPw6OKIXaTg79EUI/0IWSi2dzmp3ybsuXBloTK8eagcKKzwrWYLz9EsoFxeBDmLrDdNyPyXlb4oyxEoRiIxI4K7kk/qRYksKBt9SMmSr5p223czZWNPfmICOKqAbyKqe+aSJ0vGmmSnYVuWUrrhXUKJgN877KHzyC8ZlkKPrEomlyJhg87WEEnn7t9JJOvTBrxNRHaOgav7I2X9m9JaMYOhW4EzOFo8KR7LZeEuEeAWiWVjWb2+XMQ8V62cH02KnXL4DAbVdVZdvhroLOfDckDVrsgeCJFyn0/A8Bmq2qhyQwbPni/m05WbLeDHVVgaAmWHfeBF5jSvcHPHbr3iSr53KoH34NuQGXZDOQPMsAA0eeip2znN2PT91JYjeILqBq/2GvzVunyX2ncRk0+2yeS9Ag+gvaY8F2MEn5ttaMoAQHnWz45OvcddXAsSytFSPbU7UyC8FqJ9LSIr+bPpX65Jm5Xl7PAYJV4elpvVi/wrCxDA6Nc1B3ieBr7naUN1FfqHGYc2GqQ7SrOLVVi/mBMFRAK38EE5DEXHlV8Xbkv7tFjU5IwKHSQE4HwAWCbs1RuNcpmx0HjlFI8qQbDKQPU+ftXOU6k2cmpAZqwGvkgF7EcnFMcGTxv6akmHN3cP1J14vRO3Mp/vjzlOJGe4yqZKteRmuoa/pBsPthJ82o9B+aGmU2/64Pl+ZCqwxnyundgIapyp/tmzBRu4oucGmloGCQAFOOvaDYI6f0A4wGyzOb43BArKgmAhJgPw27A3waVPnfa8BDhZgfJJnfTN1Nw4xPp2E5qFFyU0m995ucDa34U8Jak3O6HfXDswgC3yHckhKRPczGrtrzthh7ei7ZkKVhIuGfx5BXbIC+EcPeCEZIv4GeyVd6fVIuObkYDCk8QiuNvdVhEW535Wil4NFVYkfn42FdhaQyWFuda/gcbGd8kbO/LD1j659l2fGpUVy9esSGg0fRo6YqRTanmdKbllY4IXstcNRmYkQ99TugTdSng84rzAy+umNI8SO8MA7ZdNxFrTEUEg/vqkHjhnIVgvTwJ6EM/RhdQqxgAgzdELGgocrCy2qdPiQcwHhTGb1oqiWJCoystboSXKcdFxVsVa8zAspTe1JGbJ3kCRm4g5vXtyKirAUsdpPhrABLZ+eiPk+M62n5fOgsgtfIlCO/3GVnZEQY8Ua9PzeNLiGhff5D41QwRgKt71OsUtzDnDk/a7RzR2WB7X2JqLNL8h/1xkt5fjYjOn1TQvg8Q2invL10vbdEZaDLlYN3UpWmrVv0/1CLriX8CbKl0SSwrBRD6WLZmJciz3e+9WjbIUYQgY3ScIiBwl1wNFsET8fIlPGWm2uOifRyznz8EIDWvFQikxpIpfz+2Q/DUMcmy8+ikc6aNahGncHehevuW/bYKCWmhd689/uPFc3EVjhO9vfPzCNH3LO2YjyywyQoGFxJUrWfx5uRn9CDR1hJ35CyU9uZjc3TBgSGMT/Z/qm3BlIHoGH+SDOb3u02ScsxGmVlY4ivYdGlfswFTI8v+uotUkmKbUeZcAMgmjZMQXKLbhpRbHt2zGYWXSiqr+qzAGMtMRSCX3JQ6ShuwPTADITNYR9IID04f2/fKgemc9Q3mz7l28zHiaKjcHf6uYB70DbpwS7fZPxhIhunreV5nLrgGvNi6UCU6HWLpIHGiIIUtZtErVBw3Ud9vQy7XYCytVZFVUkyQHF6iiut3c01JsxShftk17NU39hO5t4Cwh5ip6lt9n/tV8JlHavS06PAVjsPvT51trZyUvX5Zbtx9zGT4oSprB8jv7ra2oaclnFb8dOkJFR4CRqcNFCUeb7MaoLSKRk/5VaQ7yhXM67Na+fbJoovX65sVU3hbq10OqOpF/NpGpnj/xnNfoW+sGkJbknFly726SvKO5nEa4g5PWI8sCiW28NR53+xIG3DSWp20cjbTSQeFIvjt/7UlSizUX6pRLfrnc5aRafMq9wAW7MpO1wHLAGLcWpXO5+AbaO+gWbCUX155CiNU1s+tB0XYry1ka+plxMfmE3+YM9DIFyNa2f9bSlVICqTx9QIYCiWLNvbJS5beHrwSsfXtmnGYlgDB0MZHKfBOEQsfMS7vAwSmuliXiNS0ejH0cvTsEaCZUrr1Fq+8Nh+yVQ67JdmHqI2qyC68AK+bk3aZKmc9aVuqK813EhBiZKEUf0f04bFUG+5HPiLPjGKugD7GM/ifK4V1Ux0XiZjWQHCIhZ6elQYdFMg+b4CbV8V3MAxjAcbpOSMdvjBtFLGSlyY5QeRSPJSOSxImnXN9/Bxkzag27O/dMKsYawz0H0bC5BswML2Pyt5iBQ0zB5Imja7nbWDB+YYj/MhiBMb3mcZkCFVzOJCh80roPOgtg3Xio/Eg3qMEnobUM9UtmkaabgN3n30tGnrf4Sw4bM/BuKLW+iGZgXOpVSo1bP1m4kIveOC2XN7pbTj6mN2HL1xtIA4IuugiwEOOC6kjqaJ6uG0vmyobqiuKY1XMWxDpoxZjKNC66DaKzYXE3gJO9rVGft3s/usPcqaWQm7liGEP2GlcT0MKVCEaESlDemVd5d94WK9CS5hWN3RKrYoqwEbYZfJ8LJedj8HLNaWjdSohaxBky6O0SI2z0DL3nbjg1zQJDcbEFv1YAnJ3njKj5Mejuq5yToW/mO6EyDuEB1RPEUarItNJcWkTpIvOxnX4CM+idOXLG1vFFolw1HsrJUiZ1gBhIj5BeFRsAi8nsbPTmnzWosSFfFlHXi8zwFWQ71u7UVHW/LUCotv5ls8Rq58oGTvulPTMeukaFe8myWMa/kiFqpvoJ9AwoE/rrpwa33ZlvvLpTCBkJtkQQ+RHlbKd0nepQAmFYYurg6XdeRFvLe0+aM1KO54XP4q2fyBZDy1x3RAB4rZt6VwAmUGs1Iar35y7/ChyDpangsAJQXU2qrSY49l14YtBw644ULAHLy9hYmUw9sfleG8W44IRLz74n8cdMUvEfMmSUsZI/Q+T96yg+lKKDhaPeYqMRn2n8UUOfzpcXOytT3IN5eajzuEv3v4U4d+p0i65yt4XU/yKwUfKWfxNgxb+PvGKDw8klJ7NmHWqn0iQJe7dVMCwSCsLEYYqD3436u5sHe7c4qGiNM5RCG02hFNUyVRz2z238ST3MVTadvb6vLqh+zwVLCvPDQMCI8/AlM9VmM+CHAkTQbAL4Z8Cj+AWVKvtAE1IaShJKRqVXpGxr9pi0hpgviF4seQ+rOXxAhZ0VtJB4oxzy0jWlKARGnP0lhEHJpWd058sqzZZ5LYIqxBtRzCG9vbSh1ra/95gJfIvkX0TWytQ2j6vCaWV2+FV0/lrNwFQLWXoa4jGFSccFS246rDBDkLXuSkCnLFYzjyj/56cPvZz06s6BVz+ZzVoBZfsDWQKxmGQot+8KaSNjHh2lDxSG04/NlfwN/kxIPowG4UIhbprhk3lGxPA1Wn9KmMkjnrM+5ERTADb2YYwmX9bkpDtgm8iqwGaUq/39qVs09prYSXsIP14rRxkw3zhNN1ebOfyDawB7s/ldU0oSnka9mw3UBUfYtrmQCQdW4FNROm5LfmJ78akDIhV+s5dDS/k91mSoSbNrsFpF1jSYPvBydGSeu0nkETkyM4XiFlY4ovzISH1JUuxXxcl5UaUMDofrMGb24k75N486obYM9fCcyyHoLIfIZHkP8cQhwwLiYX55lrHTFWsWBumM4G4lty3YOxKrUYZ4Zpf/zbhFm+Zj32CE/B1ImG8qPB4yAa2+6BGwMCfY8qqdCVp38Vft9CdxQyVoi98pTKU2vXNW3psXw0D1UipYStIq3JxiEhQT2AMsotVlRRFt4H2lG8Q4zABalkdpHKWKfTDORQCt48weatLREQjeNx4HvxgJ8X9WcVFoi1Z9s5WeakqQnclbL7ZG3xb6zBtVmBqo5FA+b4mWkz4rtqwu/kdaGDTsOulv6FFKnU0kp3gJ7Efyn1FLBGH74MqLKnUXRD6va4zjYqx8QB6q9NveBnTVAqBOKpKL1hayAthrH+4OrGX+sGCLWVJkb8KBYPv1r8Sudb82xLql6N79EyLHg4iZPvqDSX7/jo0VV93hdpKZ8ccHdBWaaEu9gnvuRq2y+f0JrIdp5qFpzWMvd9/tPJKAqO4l51RlLvjJ4nsfjO9EXFWqXnVwe6DXI8p8ixotSqVJxRB72O3qxVzZtKgyEq08yU8fQl295l0/CI11n/c3nUZq5JXbc3TErohNtGoJi1KLPtVENkS+WHc8Tlb1Ph61fh4T3/k7Uf4d7JbBJEf72PogbPBAf9NGe7AvOYzZHgxgPm0PSP9/rUJRN8I5ISTOUsrKMYo8ArLvQ38H9al20kraBP0uVeB/sXqbbvc2yqzb7D6GrbCWm6mhCwjYWlIskuEi8G/9lConfNxwKel7WRJO4ZchB0icMJg44TM+9p9JfHwq9GPJK6q2WjG5kC1wO6k3Q2oDUSuNsRCcHihTItgPyps58M2ZGQFYMIwHJ4H34K3YTuuZZVlAsXlyGU8/qu0ph+RZnxkduW25s8l7Gq2vJzzIGuN+5BrMuox3Ebejx/EA/ZB8L6assaToPt0M4A5hwqYn7yF6FxVCUo2Uw3AYzdNoPHm1gJzmv7l7ko/54vzixnQsljXYnu61ndH3RWonYpTkRwska1+NNu97yVGVYAKsMJVeXjYpeP2Tt0t+pegN7KaZryT/R3XaD+aWVlpy6ttJqXM6wU8gtG7XL8lrXNVpB9H7PThIu3yOHsNpSvUU3Srif4i302NXUWbxyGMW+2j/gFiU4h9COT/i46lCAD5j7CLUp0sz2GvneDy9Z9dV3ZYZvuwf7gUS/1tVkGUyWvUo3V92SAMZjkJl4tV+NAvlFkdzIL+NG+ZLKjMQ8xz+cFGMYSClaomllODPQK4X1145atUoktuxU+WwOBeHg/vYQeyJf2sjRwTEDOcJlWVG1D4eqDNjlyPoPzrxXUOE9HJaPW2KZT4YusJkOP2j7Yjv82d1f8m60tzqa4K1HrswpSGbC8zjX+xugW4WgnqzaaE80VA6c29ElqdyUhAmi6XZVQA7/TgEEEgVej7poiW8oFKq6AJHp13s9FP0XvEmbmzgslNGY7/AEFRJ5BeGeTOhEtwZO8Kx9gAk0DCMbr3IIRhGKZx0FhM9zX/+vAF6gXPaM32l0MJs2Q5iGTWq3GyjcDxTGopNi6jxq6hXmWHdfkmtiiuPgBZOwUlE9HF2rgrfT1sQgc+iSUEstlT1vm+No110vAO86BO9fYiq3lYukpOtP98zPd7F0hKaHd04tgGPK9EiW2BDyUQV/4LWCba5viVVzrfUNeAlDYU3lTZ0VG+K4m5OI+iS5goCsUjfMjayrMjmOJf5KT4dmRjYzPvMm2oQTA94/xRoGBbP6lJjX5pRitquHAtaZ4Bnubb7Pe3vNOGKV3/4eQy787+k8hoOp95c8YWretj9S/go33wV3gFFWvhXYHaygEuWZGpQzDsrBnBsz5wgYK4TVi4ceDn6RHX+ru3XmUGn1ZGV9hMSfDwfnAU9xOxwi7oc+4/xVhCUZv9CB6CloAj0+RrA7gmmdeh9A7Zf5+awwjQW70OCyYxL/o5+6v0w4FuUTQ36jaB+h7bsAgTRPMoh+k2h2XRGq3RTOgnL95T+z1VoWQgmn5CnXxAgfaplJJYxg8bJZ8uDvQ/KtW74JCiPrufkEjEbrABpCc0VpjQIR2SYLc2d34HifcBtCwgxwhcehdoEbzvH9+x2Tt6YS1WqHd65BnDjQt9fsx3N3/qYmaLzMAeuaHHvxTvCvguJsevIGsOvkPSL7txmPyEHpVJ+Nj6G+i1BbWkc+72YyFCHgvFti0yQmA5Vq4z7za1gLypr6D9ljiwk/Pr+zDMwM9R8/6BcKQDPgthFqN3z7wBxlmxlnRsOBGaBI4cBcjKuG1E1nf48C2r6rrCn+Q64P9+2tLWKQQlqLcbccxH/dwcbMBtVP6GpxRFNuKvWPwxvTBZgH239sTyOf2lnFixVYsuq7g6/b1X7ome55Wjs4bL+DYQnba+GhZLLVyfPZQa9er0YKwnusrRBStU2mljd6bpe/0cRl3biBgiNBhr0sL4z1ZEMrNSBJgV6jOMA3j94yS9M0UQzo2sY3ggZxC6L7dM0uqU1/vASK43HGKECbnLwOcSuf4O+WO5BoNI8Nnq1nKi/2Dk7sa/X5KmB8jk4BGeixgnfJ/kieKK0Wd65/qRuMlDWOHBHcxvqZE2kuYFbdlOg2ZkxWvlbkGx7JFXiQ4jNRLbeeK0FNTWaOmunFPWbH1/ojI/8NVu+ZPw6cXoOEE1BjTTYCa/nmnk6IZj9NbvW4hg1U6Cog3pYasgRjQq/hvnAO958xTHt+5F/Uo1y1TwRS/2raafKj8gLkd++ssuXta4MWyMYtQWpxl/Ekdg3jBHLCOVMh4ZJ/hm7Dlp7zeoEniH0vOo8hsTprkYoxO5ZrbHlfzht2RbcHDh0k748BT3nC9ZHWbR4WTeZCJ2nN9AMWKuOjncSSkX7XtvBrNWjjOROMx3n9OFLlGqumJtVUs2DVPYddd95Q56U0tZjhKSBVjn2zoSlyiKer05vqbTv/kiEz/DjkZdMzHU9BietfeYtQ2tOzINzpyL7u1sYClYMwUAC77QCjzEZ9hhbF22jwIYKGc+NqzrYUcafAQEom5iuzqr2mKbiRrp8ODxqAo1ZU0ocxVsCuVAnL3XhCQEXd6IJ9y+b/wLt818QNS6vewib54NqVIw3UARKzBq3vvOud82HZiCD6ZZ2yzz2jtxH6m9uTe1LgzOsniccuWcDoIEeCb0yRDQ+EfesK1hzdrIsG80lXr7lG6zc1UV7jdOS0Gc+c3N2ArX5i+KjaSTEI41tD8XqPbanpLFCpfc/BOqppiNWTyFsqRlEmZxUtoFMEPFzzlyglXhzdT7Cx2F5CoNo8h4h4jxa6SqZndEKn+HEwS/JyNMuJwzrmDsATAmsWpt02KRka4gwioFCzfBbp6BjAhCC3Zdf+M0qcZ1tiJPBISnWWBfa24TWeSCFXjKEyuM7t9khF5RG4E1JIRs0WLA6wWkORvWl1ZkqFekOr1btMbY9vlo4R8RkyHDH2F543XGpcXeC6u0mUFNZueU1ojn03z+rF5E4wSh1o1wssvcL14SqwbQ82zN7ZCm4zxItjJZbH5VMZzGC2yZzqm1zY3lyOOeE3LRk4XRzr0FeVyJqz+6pMAS5Gn9HYn5u+UQ8iHG4DXxAhLu/pO4X70DeNrxswBmR9BGu9f5qVWkz+x2s7fO9TvAZSuwP4ENtxoNTa3yazuHCUqrs3GdcJ3lo7/5O9hs+PLi1J00RkOxbwTZEyKKUO7/KkClIO7Wy7/gMYqdJLLbv/JLBuCBoEAax7GcQ9HDcaiLfayicAVSQD2J+/7s8HPY8e9Ylxkxo8la85jsbKuiDdpZ2y8SRveyRqJ4U3QlH3wbVSXPhxoTGGoZ4p3HdikBlVude2e/PTZ/3X9XkOjS6vGwsTtXpSCSHYv/ANInUgOVgrbtMfz7FI+W50CP1f7AOHa7W887uQP02DptB298gywKPlsQtU4kz+mob9UXWLEIxH9u5jr0Bz8TYalshvg+alwaBO+Ic2O5BS3WX+F0lvd49bZygC7EYBoaws4kmgp/gOXUXx9N3JA9FQ/PpabEgIDbsopK05CxOlVOQTXQ9gGD4vBHAUYi/dKAY1BdM61HcI4T0LPwgFbtX+UwFE2pKlfpDScNYCNmaflYIj5jAV4Ih0bdhRYDU8W2sodIGUQLNfxbwrdfilKg6QqdMfgnSeACg23JUQkWqhIfliQ88KMrr3n8smBDT+gtWe8wcPunM/Q8/W908BtX9B8R1yi1+0eKabHKgUKyUmg41T4ILUXxy0ifgMwRgjhcBH+hVctqb/5dqULt9TVx95//3JImnbYzmSpJ5eCLhUQTK3EojiBHqO5ar6yw7wn91KzmZteu80CFDGycRiV/a5AxZXyaydtIV5t1LIrQqsNjCI+2O54+uwtzaQLaBs7rWjFdcS6Z72Y6iHHi0qg+JkPWoKL1EV6she3yIR9wFVvfBuGsCz2KJwZrX54KGqAPx5Rq7nXSGUdvf+VOKYD9lI/FuMT1uvMRB4KAEGKRCSkpFkYx/zdCtVFXfLYl595PIWJ+kAazc1QpzF+qZrVKqurb8FX41vJbExCU0O/XDFMXo7vIiX71oM7Hdkh1/SIlAt9MgVaB1oLFb34u/rS3EYunZxzy9mJzaMiwLKVcpBsfFtrplwaREORPbtgAbafSYQa6Pe0mHUDgIjSDiEKOGQ+BBtGkAiRApHTtMzqA47qe9LgYI9Uk54VGbWUFmjsdkbggYW8k9Ash+AebOxnrFl/PAV0d2FQZAlD0cquKgBQMffNVjmMot81+SI8vfT/leBo3+eBi+fNqmb+HIZqEiYRsex1KvG/WLLqN+cwoROs90g0TrQPqBBK6Wz5Nz+lcbKwI/3R9TwBJl9utm5i6L5jICMh6umthYXEorXWARlYdhZgXiB8q/NWP8w0nraOE+08Mwv1qt07dCV4Y/NE8kV/AiKkHWeYGmMsGbBevA1z3GZ5S1iRjKlDDgRbORylbY9DPoDnXJ/GWQSRJB2hjZaZOXSwgj44RSuC3pHM8j8SPnvD/bTnfrRFrM/TYb61RfYmol5cMmPnXOMoVNK+BqiQDR2N19Ay/UNMTAMg05p5MuCflg25CQDgTqOj7RMa6bONlCzFCPP1akjnNa2SIfETq65T/UegeNaLG7RVyHgcArW8JMdCmrMi8ay3PO7Fuc/x1o0xjpBy5upe+asx0HCElL1oJEejkqswdK0Y8XSxn1I2w0VgcOZySy92Xg9h0R0aXSrNASP81R0bmPIE3vhP2+hxnnEIchwvemoF/914vDITG/NGBrBwMSX9W9Gi8kqrzFtL0DOAlaJ93fyTeoGk7BDz6/QC9NnwIslfXVhPg7uAQZqVDRAFFeh948o9FbpqusfNwvpHwhJZG26cFd0WNYkqwnMWVj7mlXc5O1wknViFi3m1kq2p1SN4wdTnSXRwEYKDU6Q3Mtc8B3KMokuDBHwnQ8ANDIHlZ4LsUIrqL6SHT+FdEImrL3K29GYekUYqcNO5ehUbDUnKPCUVXxsQ/bmYKL/RJ1x1MLK7t6/jzhHa+TOLCdM6vxYcKe2oq58Jq9KaeQOGamkfsKq1qoiVFxL/n8yKPMRFMufo//20cTS9M6wb/tZ2QLqH/xoff9liwtLiXEF5wH7FcqBCmqa1Cs2pqVecq8uf7cVpAY1/uFb0KAnzn/FdLM3EMFQU0kiDiWua4Dt/7TBq0z62234iP6j8gdPKpqHwpsdOpEJdjcRUHyysPrbAKB3fas9q+0eUAWe/JqyAhsWBfLX0LOFgDMEcFgYfMvlgchAw2u/Yk55gJQICOyOUiiM2hNNhXV8PBJ32qH5ZojOqBhT+wtvn1y5/zBVO2MwXzXGrLW/IBPjFuqVY/2C7jftlCsKWGnpx6P8DJoSfMUZL9cvzE5jVCo7+K0El9ol6Z87qSW7zZidDVv5IuVvNE0kcog37Ipi8/gVHhpYA6BgctPH1OWlSHGc31DPQGWGMwDaU1FNi20cweqOS7oH0QvH0jUezGu0LFImRQxIgaVQMRSKiDLC9K2mK8qup2fOhpEUoc+TcGgVpGslPZL7sxs9WvBs7rg9Rgi3zrzpsYEcpELZinJJv9XhIUCRlLLbvLVVVaeLT8+r/v+mrBgo6E8ne91+KU6zkZA/NY2vfXu5wMa+T04DyaZWsxz3Uz33STXD1MP9LwysoRzqsj1bsMwgOwrOMkS7kx1hcArJFnsU50R0s32mLTFj4axBH2UXZ7L4jKNj27bnBPvRpu5FISzssFN3qJA5RwEz185HKcenatLiPqqfNPUWOlbp6PODtqHC5FGDTbDlQR1hcKwu+0wkqiVR/JfkPjK6tK9oAAd6dsdDD10D0ypiDixKTNN4/wvabMa1V9HinIbM1RJDoqJHkVD2I9ZujUaNbXgDCm/nq2RQOGiiWUF6zBjQ0GnIIDTJP4xkKJSAzU0HzGbz7zf+DpClbtqSclvQvlxVN64rUqiGFan+xYGGFAbY7oOthXd1Tf6vOLRvfVgFmJZT3BmCEglwu2QVG0WHt6N94Is4/SIWLvWikyC1IvneH65wdq6EQwWMJFxrdBiubF0E5774j9ulhf3CaffIalm/1NDGzMEvrn0LdWqMIur+EsL932r2ia8IBgocY/fPx9AEgGvUCr/SZAOFxIFRYtXM/cpyL4VJAzY1deM4gqWlfjA4q9n+xoz8Xc4goqZOiB5R/pRuhGtcqnAmI6cESJurVT+PI6VkjMwqjHci4Q76r8iVd7QTVv2VuOCcCnPa86MOmb9d2s+C4by5cdFriyixVdvWq4P/Di/YxMruMMZVzVPtUB6zVPjLbbhvz+Rox5BrzWPEl+HdwnuXXddpbs+KSvqBEFFdQk/RxG2ZAwPdb6bVPWpO2dWqNgHB9FEcXq6hbhBzFcJWnv2/uS49Nm9K5poS9wa3Wbw2vBHGEmaZq/tRo2lJbmGqmEOT3Kx8kAO/kDAmy0vzixM5somfhzd/UQxfNwcJ2IYEb7ktVowELgJO2IpvSF0OgGXHqjy2RiTw+m57efclWK+EJ3bQHyU9Q8qPSbfwiq3bxgRNgkETBmwFs5G9Yqach58LEraIlZpQWiUBtAyJntgsMBOj4opTPlvNaBTR0mCG8c4g1zGVVQuYsw+4bMevtAdLrOTlLENsrw6pLydITplmtwVKJ+c1VNSFUj/n3fLwbLvHpDowKDd46Dbq7csT8foElTEJdCIjN1BjBuvDpLoRCS0GRpI8tSyyaY+6L4SWC182L9nNLJvADvxV6DScif+N+AU3bd3wJx97+wCRmU1mer4XzSknOcUodV6yyTJCCn93/LBpzHos9PW0aY1EFSEk3c39Zsn/QakUzd5yf3Ht4mMuJgJVYSRtkvLHRudrpiZS0r4aGNCtLQycrPCT7jzxRulmq9pP6WR9CV2OMgn1+Hs+azpeYDadrh8opRwcU5FFCHv66GF88oT6wpls9oHtsqlwSWWF9boUqrtmTmAk9zJx7iL2nko1lF7iYbtWNGFklx18nz5Cjk8/LLYEnUvlQMlDD0j51cxA6aCD14o2PTDiFrrfMCiGC+BVI3LRHUGuHGA9ish+j6SppTGy0cxTq5uf1etQmPLYLAD+yg+HsEZMfBu9O7hXgTUcexLLXjS8TszPJTIlIXoSY9PrTXhIa8f2B6nA2KNSgweaUHQ8WhU1Q1E7l359/kNR4v+3Ro/XJAJIk/9vIBEzxnoOmGA+zDkTSQ0r3BUXfZqG7vWTPkpeRKtiGVUgLqO1pGRTJI65NSk146PkC7a/cgIY7aBZd1hRW14rsqOZYD/KW7u/DfrLHRXJ+p9DNPj2QaU12R2IocfqTtRUH9PqSh59ujDrSk5xhuOn4tZ/s+txr8TjiPk9Nh/1n1YtkMls4zLRqyaaEPpqtBKUvJ6Uxzfls5ssNl17zp4gHZA9O/xkUJT/bPgJ8el5DpTh/YzRTKMXDVVt/EF8sCKlU0yt48/P3lhr2SziaTxd/ExMV6gtOu+DbkvOQ6PUgYZy3R4ETiX/5Y219vUJwSNJN0Ia85MoQu6iUpLYvWM8RzIECWsvcLqImFGTKA5KsygzL4jf9pdtK2knBMlbrUnljzNGOxYFj/iRvJxh6rc8ljtwb2PxKGex4VXjxCKTdOqQY96Cvi94PUwl/NMz56Bk7YiQX0vrE7MHhSMfT2PKXyybqXV5vAwfjpGy+I8LE7rIz15LKKc1szZqDt6h0y6ZKNirmGrIhHi/XzuQzEu/hVYxkNkiAW5JywaxptUSje3PBaeXNwJgFcd6LOa6ogoQGVV9sU15V20SQohISzUR8e9jBrXz8k9pF4I3NrniLQWtkUmGSoBxzwiLgDObT8TmenMsSYZAGwERrkNUQXoSRW4OiQtcc3/7lb7nQRv8gkf1yd/uLTs9XJwb5wx4KsisGDk1BVSpu/zu8eLD56/VQWl5/q/ayYevLJs7IhKSWCxdBp601hr8GA+oixmRvpHA1cf14ccbg+V6jhfSS6nsgvRsGaRTQnjBfwjpv07P1uyl2/C+PsTjKUYv+epgQRlyb6VrZ4qSy4XrQ9KroJn9F4mLLe3wre9DvaEP2+P26A+HQCzQJEtfBHbPPpypJI0VVTYV90BARjH7HTcn3wxZ4m9ajSrMp/8UhNrnu/OPId2At8IdvJHdjkqJZUZlgUH98y2MOjkdY8pKlBQGGtCs709ki1L2wNALKFhd48EnhEMhemlWwPV6mN1ngRwUlqBLGfYlqQ639iB/IWHe5T8M8KFubtevbHeqzCGLxGu/lu/odJaWxPTEZNzy3kgGqBhmzyeQ2NVKVfd3lAHZ1Mx9vEz2w445HNvVHdEYEnUR/Zmsui6TFnJBliBjGMye+XRR2xCbw2cuN7hoH5gIUHIBeoHVP0Woo6R7oVd8gGjCBnqyg746QdVxGhB5Zt5XadOayP8HSt8hfegE7T4fRQGDz/hJgDk50qSPjEYXXn7Hzg+zxayzf+JkQATQNt1gEnXvS/MI7QrJe2Y7BEpYP51T8wFbb4cDbZD64Rj7Cs7+yaQWS+CwuH6wX8iGXv8jgjbjs8VecfrP/IaYZjXv/KiV+AMw95KsTYaKapzl17Ocg9q9/Vc9uB5TBEos7yqEPn26nbrXZ2xf02AzmjAiNHT53Lhk4EwFagvbFDnxJmc2ZOVj0QvUiNw2r9q7/m4yz0pXfpO2SvlzjpXM/9TaDyjeWHLnNiDizvHWzgOUDS+/X9dECHxYf5789XoBduTbT+GHpS/Zmb1RBgALxS4GQy2ris0orCXbQwUilWMOHQvVe2CxcS7KVsrmaFXktypKL1Nw8w8RATaqFigxjTX39/tVC7+7Iv0rphIDsWYDCs5KQrYweDft+fWlljsyIX/mhyBQaY0QoMmcNya/u4g8MlioeU672ZJ7PIhdTXpuxjbPJteTRPgw2d74WWgImp6O5jyie+bBM6DZMSyNZQis/hvbPVsMzYPe5dngHzJNaencW46j9dUWtk319WRsc81SeafYBaMy9X3SZZQdS1SXasmABOanqa1G50axXJZUKHU57mwrWqQAzhQjbT6HWc2963YQB+UkL7x8QiEPFAkienaoHP7Juv75niYRA3ZFwXS+llWWCyQMqdasK7QU2DR+5EYaRXkSJE3Ygav8+oiJJlrlwPUO1zAhyc5uuDaMCJvd4hhVMHn7eK6guBk0l1m9b5XOI/wyjTJGJEsKxUjExwyMephWgW+y7RxvgIE7+7Ztq5ikWQdsMVQhTbbMI4FTyEKljlKWN2Wjl8fk3wjR1XEHtjexSSQUMpTUvKIYmfbzyYdfEx/zfoI/MnfgColhDH+IrCb9c4K+VH1kQeFmd+KMJgDHVBAFNNydOhqhMTI9y/d4rgU4KzMk3t4kygpXCW2mo7N7gSg9FwWo686sBdPOASuwz0nym0cxZhkJnqgtxAigpOZ153vZcSBBPnEwMGtcWeiUwmPD83kbr4GqxzTbTmybwWChXY6fGKY0zd7TZMfgE5X0Bzr//Dmc1UFmRSMmmj2mxGQCZyYyRyM1wmzOjDKVHVOdqz+B9dHJbuwC2Q3yhtCRgUVt8Bn4ZBtj8JiSmZvNP98qDD8OFsb6EL1a4Ewhz2QH0x34auVnE773o7GIoC8UWtDITCmE9Frtwlu2f83Fg8/XdCaejaIkruvYHiBEErZaZgDctb7B1Q18ikWA9iW/J/vBLzR9sOFa6Ezuk0czMTrag3J5xviRb6x/MH3n6a1CUZ8Kf8rt9viHBAS8T/7djTbBxmRF09j+sz/vdMcDR41sDI2W5BEJRLshO5/xrU6DkB2Sjd0KkmLZJ3YGkTIUu5vqz7imTaAMdJ3U2at8IZH/yihuoIVlCetJJ1NRdEphHNESuYfXtNy7rEiU6EYOWachuzjLDJF6JcjSRdi1Na2pEYiVqxJPDiESMwXtFEr04Ynwm5+K1vJxzCnviMTP838BFx9ILrHkiWkFsLx3GIRtXs7noNX2+KgWkCG3gus5geIsFn2RJIy7ZXHm5YKsUvzTTfncqivBVlsW2v7pO3EX14yHjhtcjM17QtdmGYwxOk4OuGUmbN8IGh/ESqNkNPrk2diupflGLnfc9jgLhzRWLuVlK3eMvmE09XmA2XRhskC0wugTL6FnWMJpmzaCTzmSA2UsNEPXbIxzMTZZ2KrwU70S7P/5PNF7dIRDpuJkR35LlMtmUe0QhO7WyaXMX2+3PlgU9fiLH9W627KKPk38umdlQNBsJEO34yZXd7Yu8YfOC61YO6dOSKbUxJCV9Z7dnKFAbOGvdNdX4davl6kMinJdhr//HVeUWXkeXudAoBbAqoMCimrqoRI4OXamqWB0pSNAQPIkDYRq2SIJ71mdaCeTcH/ReZlKfjBf6qS45In2O5LDi48ub5qZ0lWTGNfmY89ktPAAK+atOt8Lp/ExQ/EY6F9hSjACzD1dMyNvBfmvhT3c9ZoZn6Tgha6urQSgpV/IJzczJFtGscvR5WwkzWSevbGC349XACSBy3t600Pae2Hi6XDgjsCmbBuOSAi0caabHbYVrTq1A+meiUCxlt438/rTui2JXdHXQvvx5THSK1r6MchmA5U/ft+HtLVU1Bo3Pblzif5IW76w3dpqzYzgOeEOkkVeE/gqOiau+6Z7imjLCVzTts/RfNJDuM+c1y9UQWvPW41I4HnNq8TpmlR8s9cWVa+5p0YM33exTC4s3PydNCPD0v7dEb3YkHn+SMKMLv3wlRzN6p0iqzH+1q01nZaEjaRVx25YrvlaLxnlvDSyfyD6VBPpR5AhhILR7pxj6u+yozVcG+iZD4jZdEYGOHpQIRi9rdmBJYSp2d65JhdoDOEue7ZyULzlWZdZsUJhSn9qo1oKW5LfgjR8M0C3lUTav7bfQm0qLCfFYyZRJsGczfNrgLxYTsGa9x9WiKOUuh7OdIt7bo5P4D+UlIpVMC1kJ99ykCovU7Yp3YfY/yzI277/JVsDOKvL1m5dw5mh19rG0rhUeidM2klyfgy8XoqYsbsoX0M/Hn6I+yc4a4+tOxxFofy4/bCy2brvZA7IdZdEJYh0koz8Vzg+tZ966oaxLNkk9ydkA233A35OekHUMjuhMtL+mpAYZ2/SqzafZVRslZ4tjQ0ngZpzY8Uu11GO41rn2MVrs15eQWJs9NaDU3QH2GxEwkG3dWr6amepTYGd+qKyjVOKhrAww5gEp0g8rfZaUOAorXFiG7gvwoIpUveioaRKuUG0LofWpPQphGQ8nNYLvaEFrpIEm3zJ1Ybd4OAQJpbFgZpi1fA/9OoHZgi4BHST4r6JvxZ5dL2aZ3VABRgbgTnEhPOjAzaUgW2c8Me4tajmETeXjZEQRFxPb67Ued87ZX5aGqlRt/hsAyZa5MgEm8R8Y7nbq/7FgwOOVmqmqrlqDjI2nijf1v3L11o980iySORVembZktWDodsfLTQrWbtYstLplrhA42iRznMm/tgaGgCt5vzY/l6ekaupM7F4EhWyHp7k+tYFEnAiZnHAnlrQdf2C6Rm/vJeeLGaaIn8dVW+O8+B86BaHpicdoLavyRivS2NlunzXeg00Mj3VVcQ9EmvEXHCy7TEW4sNqe6X3nfGISCDhOfv+OgswUFnj3L8Q2NqjPbdEGSo3FPFISdIqyRXquJoo+LnowlAlpeT24WuYxF9KAjUykXUGV6WiJPXjjunBV2gt56ixyhGnav4XT9mxeQQJVs2OarTnkdWc4nOw57RNkvEY+o+UI5m36oULMcLIL6/aODzFV3zcRiQhW6S4Ou5qRJsXw9yUBgFHNJYCciDyCdx/H7DsHpbEisjtB5YFMxt77Uw4qHAzFtJfGuQCIbySI+lmo3qKBKZgJAlejL+fRyF+Ja4L76OBbfmAHFzSQ88LcKcEIwezyoRR58Ol2fCB/aRqHIjXXqMEaDjHzmhNEG6qF4Hc2JKfi+WZeQ5vi1ThoE81HyT210TqIGnldrVaJbpeLf5hW3Ilqb0WurL+pGjFruL4V5sFLyn9/tbIgE1W74RnOGRFcAZh2qsFx/kV0ik/cIA9lHIVtjhkanGK5vMp1FJMkIkTE84MioxOj39Y5AEr2ziFvJdi1dqssx9TFTwy+aDmIGU2+Dm377KNxzu2zwtytejw6834uCQrYEoyE50jjiw1AAfN4oe12okBYW2xRJ0m0brwFrPr+vwETAFcy+fyXaaF9J0r79F8TKsFM5QIk922mD6KCOrcnUaOg7tKhVkma7ZwoF7I98Q7zHVpYFdxX0bvau6JIm50qQBGZOQbH8JJjQGIBf4Kf70uSibuheku/A10hE/46JpYxt2YM3uQVynMc5CcqXmz0+mSBhPSXuC7N1Tq5D3Fwx21x4jsSh4tCEdCTDDAAPGz/cB7QSFawDqi+MPJSTXSNiHcojHU2wv7gA8/1s5EcqXb4ocUekvIUUgvdUiqq6vOtwIbSINc33nJJ/TFpzd6QRTzOGPrQXe12CZWaQjcRtlTmdZQm0+oAkhre0ydRQ/x4KVje560uoD+IJTnjb7I1G7MCE4kh3lTNLJGDcfj40skkK3TDlfDzSRVweq3j73bknKobHG4wEiODx3XoAsrK/WwIXsoPHdFDrAiLyd/FBoBTAuNwnDZW29K5GnolBqyMf6TtnNu++DHJAWfYLDjpW+XnTPTV45l5kjfyypMWdYIl2SiZ76a/eDtxWrsGf1DkidUENdR73I47AH6tt0FOMGXBE8SpTfqpZmqvVR5s4H3JJjjhITY1D8tGp13od2qv5NbniGYogzSzRbgr0+R9JeoYGVuoyu1PNK/V7bP7wrIYMSrrhBSyOQNWRFd4a77EdcfBKM15qlgeRB72HubQx7sMamcoB1lKBa1s+I3WritjrLPBfWICv8R0Z0EZZCoC/ae5OaBKNw9ES02+k3JymvspuyxgcRF+cGXFtT5AWefBg9y/yBg8R1fnDKri9eY6no4DMiuEvRWpfhRaIgx6suuMa2OqV4maTxaH5mMhkbDAmYa8Ou6XyMLiz1NidG6zJxEEbgHJPfjcPIWT4jjAcGVCyDKpDzmRPqbppmZGW43EFjgrYeGSXQO1xxPRqYi6cIZIdC4VgsBKZtqT6gHoN3I0r65d1L+XskzB3eqtlEj1qatFd+uV9+ryRq34grH5OgUEtRlHSH04aYF1KuSPiQ/ZRdk3c9Fa8/KSNmcJL7ZgV/ky5WWxH7E3ThAbyUB8Pnaot2bRCwoHn/rBoh1XkYss4+0spLzMTLvnRIvR8V9BDjbosBp8cZXI0dBf33e01H8ZeTkGPtimShHGhSuNJo7qBeKon8+DCG8YOVSTNrErjroedGDESShNU1ZJWZSr7cEgoS7yhXBK7f8ou/ikJQ6Vm4X4EZYi1qPCgA5S0cdc1+4L17xw4lBb5SLF/ShH3wS5MrkJhJZvcCnrv37cQHhl+81E7r6SQuYcRHSXMJ7nq9r5Uz+UxmuMxRl0XlnxNHG6OpoeiNd/KGS7yx2j7a3jijFquqyKsYqlSNzw8TX+Zv0HW9xsi65wcLCJ0iV0tmOzIcoVZiwsbcGjTtZWAX84lyzItDj/FwT6RKa5xtg2RVKV0w4xcGNDxHH5LLNMWvZQFQrPw+sXVpySK/RVa98W+McE38num4aOA3fLJ6M6VwxBO4r/zEPm+7dFNbBgPpBxEDQMUf8f6NulYX3g5NTDf0ADMV612hR53+4FuQisksigoXC7PK5VDuD08HXi3F9UdiENUHlncbHIM3j6KBMjpg9akSgzAKA/krFfWorsFbwh9bS2oyyxzsQycfudv2/VeGrfNJNRzaErLKCu60ZX6/FcqXPFpmesXmWFL48UPEPOuoLjHbvwuHJ7XFoqVp9i89Y87Nc2cOgsXOCr/HBSS02RrQIvltC1+6AqS20Gmt+20+Ab4wtrWza+e/rFE9yovaNCUPRPHp84fTqtZTEQ4QXNeVP3qzehCvhR8PeIhr8PSp3Lw+WDNppKd77f0GwwKr5e9XQLtu4JfRGKxxJFiAqu5uosiZCZbE8UYzF86ZTuGDGpbrpNcOiUEa1dLwwFlSc/tB8Jiy3QxZe2x8wFYEpyZUgTjdCaXRZHJgMfeblN9xUAy7NTtGgto5BxO7NJGqg7z1dsgpC1vkdeDEbaPJ7IHsjoiGjsmFczU/v38xFxTDvAkDHbFuFVA8257h7j9hTJo/seMqWRjN/u+PywbyzZXsTMA+kx2DkDxezkNKfyqr5s8oDIqJLu/QG2cyd7wdhJKPAmzJqxA/md/obPX1cbGbH8FfhGPbCygSg6oyoz5GB/7xdqIkjEwRmmKH8KIvo5A3yLSHcieOlLfG8F1HsYFBjSSGbewMxpq7E5wMSaYUjSQawrTGX/1QrWky9uFUrtBFKgCV4k40wPEk79BEvy31tP1JIgL0itKNIkqT1aC8QEBZIjcR7DCzKxkHBYevQRZQ6bmG+7Qw9+49t9X1WPKlpQnO6DuqlakHMVbQuU8bxmG4sIAa53mHpCFe6T4m/pIy5kKK5EmP8bRMEfabAg19WjJKpw1zrqDmt1XvMsj3Wbv/Pk1NiIcTIVJozFEN1119MgzurQj/1eLk5QAlv5TL004f/GO6f0jabtkX3fj+tt60P4UOAP5qKcBrf7zOF95t1ThyrntStPpanI34ODGKcQi7wtFRJ2LwPHF/DbmkJXXNzwHceGm7DtJLtpDD0Qt9SM+aoaPw/er3HJTONY6JfF3zC71hvRmeXnwemrqT3kDxhNHBKeiEHNhiFThEjlV2KXiLYyqQxFs86UwNqepgm1yMV7HEkfaDzXUu6u/GhIzKevLtrkYB9y/7t5AxdLZgJg6/XPl2+LVDSFCkkXkp6YAD6UnBHctRwe0QQBGDaUMv419iygMWPSpoPFMTy0MD2zg4CUK3JXq3ycnUEO/3PkK0EN5gKv5jHKHtf6RUtsVDVu/YEvkXa3ywedmj38PXhumSfyf9VL15zIZ651wQ3K1UFiAHBSvnjbYM03gt/ScH01mavhrWAXxUYjiEiCytP1ttwURWVHKdGmU89Liy/6v8p7ER+goLmdKO1c5vFrQKIRnD9UYJ+jmMBU2vuh0EEuoFJYiM1a+oK+YE7EOoLRiScx/kn3KkXa1Oc9JnC11poJPlATtTideQDZITCEbOdYJo52wwm6xNhtLvJwM6sdu/WpgV5f418QYlB1S6Bd9vp5QrBc2ooL2YUH+mlGsMiEcQNkqAqQiSPFCpOOTc/ms0j6LS7tDUPQ6KQ/jAbSz3UcHIc5jzGwtt9fIqx8xzhOWNOvIjx+O+zCaHAl96Pm/gQsMJjHPdU45pj4hqfd72tpHkoeu9QOwm17Ysc6pReXWWI3pmDl6nDW6VjIrqG8PfS8L7gxEPdGV5JALA4pY6A7G2LtCMIunrTu6ujV0bl2+iquUXWwOS8W6pl+IENhLKJkVJsEop0fnWP16FxRJGxDWaupELraH6jCfRknwGPVeL7jYIs4/78QdQrjYey4lUIOxpq9fzsdLC6eoO3E4zrUVjlj/5rP2iiJfZCWCaXgfza/I8UOJJ7xnqo6hwn3njQkIrLTp04SbEkq7Xk2tDj3+XMdKhCe0Xrvs2fFD/K29fNjg09bN/n3dmMiwpUMlFTxIFVKSr5s01MTrPCs6fNcEkpysbgAMeCmZtsm9SyucXajuJdwq/3k3L3LKugYO8WwSx1mBlvb6hiIQyo5bVShF1zSz+CHLWDMctytSBe0zVrTYmA2uWoy2z3MjV5q7TQDONz+1138UdqkTE+A1P5JPN37yD92JFcAUvY9tu5GwHnwD4rIpec1nAUtsTjSAPdcygqI2mA4iPpHXjdJjG/w0CZMeIv4n2aT3B8+5Saa8ZIYAaHfd2LaRwvewTx4/zg9ZBA9Wsc0zsPycVdyU7Nizkbp2THEbrlniZTsebc2TgS+KbJkvZZ6qXSNW3/Vc394nnUJY5XOxcuTJusulGkee0DOS7POfT2oJ2DFRecIKolPhGVPriyJj+ygwHfkl9xwUg2MVSkfj2b1sJOFVkYUYMt336N9x+9wyEhFH3WGcfu+oi9LqTvhLOl8qjQZTXghFrXwC1s3ZIp36lgEY9XjXyWrt67AdjIo1Ch7z3e64Y0CF2DgGy0iIOnwSPxitxWcc2PEOQ65K9nG9r1Yee9akWGULIPCVJweEpziBkZhQH2QhoHV+Xm7QDmpWJEJPkZYmGUs2LfasBnNQJRgGQ+42Umub6EBesLkSdUHZ8u+Q8zTeeguwl5n8C/Una0vdMnLGDw3bWitN881WpOvgyx9xxJdAXmZnC2EZJcJWThD59/GRY7SFxZXlL8EhPZbbPA1ed/+n/eLOlKPnDSWxILjUOjcWszySLjx4QXGSSHXoCLV56/rdrcR9L6sSeb8YP8l/O6NAlrao7C3WSgY06Lci1KA14iLCaoWxdhz1+8VF1hDWxe8fGrvt5qy4sPy6AQjaLLL+ozRUs/ZCySOqJzgtyFGkK9TwhMeqAYo2yoeOZkwQgRuQJojIcag0jF4Z35G6uOet6GUsrw614h2IcrMbzc1Gi6dMrJeJwcgVOhsZ0qAwQEvJQaOKbuPuIY+DFivVRoNpjZG6h+RK1H7uRElt+11dS5eR/y8VnfzPfryQXN4PiWhnmxyXzOueVdq/ZKzTRLC10ImBFRRubpq04VIVwK67xBGt7uMh90Up7/yXuHjsEoB80AmyviAI7gygW1RnBEwtWnGWQts7NKCteGa2rJfFQUVEfv9N7L9NVGpQQzwOimIsO7Oj/dV2/C0cqrxNJC8Rn7Bef/mrLyLmUZvgxLl5kxOUJjOMM4r7KsNdGnlH4lzGaVt6tf2TXOcfz0Tsw3d9Q5SSGXK0fi1NFBf8H6q0QRNbIzO8gK9zT8CsZdpZVaC1BJMDCZrIV7mU6EvTE3hy+soWWyjczf9bD3Dv++PGURF/usMqW9J1UNaZuBJojPlRdJTBYzEbERIm7SeXU3sqKa2R4DG6gxB190LH6o7py5E+tJ8h08CaBNI4ILTk3a1qcOvubzgWsgv9Sna/f+yvivs9GM35Nw4DMVpAS70gYzzCQuLvBxdseR7RGPRq1nY6+Lx8dj51BkUnvmmySJCWV0qebtOJOVvhFKgjkkRb8iRxgsT8NzxnmRSiEYu8cdN/6ZsZN2hCYjKIZjyNQr3LMl//weZWTyOTvI/tKvnG0GAt3VUr+TGwWvn7pkWjL/4fbeKaKue3V0Ee3oppoBtQsKp/h7AlYjfk48sddB12vfgGITuvRYa+C3x6p45KbSiaDE/6wcpa1UpZjbJAcVxwe3d/SFqiZ4+JuKPGkXBGIJhib6FbmKwA7wAZz/Y6cIN73vC4gBg0l54n+oYnyBsi404P7yoTvM5Lp4mZQ/YHM7b2HbW06cW9ElmiGwnod1t+bNEa92jnU9GeikPh4URZ3FYRux5UCRakkqLQmTWQu2coMb1/7qXpyMKdaPUOKw823U+yPWjg7JwH+MfRR24umttAT8vbLcGMPx3Uw4fe5yerO4Txpp+CRE34yQYgg5LMKCY2rWNkq4B1G0SeyiAJcrrjGKwfxCwFJ3dY/HDCb7hFrkKIkhyv4f7fhTWsBrLvMfeMVgLebzw3B53l7j3z6UW2xSeNDw8/160Ne5N7QEeNhaIXFy5s/5GjHKw7R930ecONOW93pkW8ToyLSlz/Q7Y6tSkvmbnj3ZSN+a3vWUbmLwaSOk6po8WMz73Uc7hj16PjmvHrpDPA3vsfmkMoEpwkMFvHiTF6AZJ+o8TTRCMkZBo9jjnLuhilr1IXGDaa0nFBzhlRH0HFkKbAmtM+eoT2kM7D3WtnlSrgAd6aKsYXEVU0LCFTTeCn9HLv5cggFpl+EVDXe1pk/zpxSBP0Eyy5mDk0WDEMg9AMhw/8AK2BrZdAyfRN5JI4CE+e1NW/RYfAWXh6iBKwH3dl2FZvwrO53QSY8RTyw0MEdy9JHuYZt6o521341VAG3BLyIz5WYXI6gYEHAofs+XQRzBTrZsvDZ+X8xV/PHlz+1XMGGv+CTaI8/cLNvxcIxmZxtEOCtuYH0TseUDzDMXcX71tf496phVx7fhXuuQMpk1kF/YB1auPbeA8zIIuLpUBpe3BUmb2BaG3xj22leCwktSUVDi/V0LCUprW+9dyNcRFImqaH7PvMUxoCKhNLIy/BS6dlSFaSL+BfkgutTUp7Poqx2LF8bj4Ul4rEdwPw9A//C6LpRC9MTkeuB0HCmlY0XgDqKSwhi+LnqMeDy3EaApVxujkrVlHji5bJ3Bwknq93lZf99TKpApF/ED4jm7eLkHJgxCQuouQxp8Dze+INQH455n8DOby45tiThWurra+xSqBsVRTDT7mtV2yeaiFkm3oJHa6cM5eARAkBkhCFEAhnIoJoB4pUUrbC6tKQMPKbT+qM1hUsCyiGefCOQvIcNlincU1Q+pCqtZMr4DSg59ie3NLqi5TfajsvxjZrzQIPWUkcP8/0mdmXITXnApEePUhxOKndC4tSSCDBGGwevWdthMTjrwPoufy50EgpZrjh4oYJ/DNeTeUqYnRg/cCN+cmyxhcPgG7YmTlz4o80Bja+OzHf08lPPCgc6aLHu/LHQ6IbUb26sn+P2DuyArWgvhtYfIbTTXAKdp91o0l2cziKRCVzz/fLHKo/eyBecv4jP4+CxbQdX4d0qzTZ/Zl9JXZtIfFRDl54+Zm9rgMJ8suz3vcuR8Kg4ZcmkC9cY1AGlbCzmCiQR587IQEiEwkIBi5C7VvJ2cDGQBObf6j0dOPohoGWmgdEW77tQp8HbQNk9Y2sO5CHwb34HGkSmzIm6TyShWQtEnUHaAhqB2SmkhJDFfOjN8QM4fsK3sz9uLiwD2idUKovKX9c/a2k53r4PLMkBJX0oIZ2+i+NxxV0Dc7db6dwNKkoZjKRFH1zp7KmNam91n2VpsBE7BwXdN8RunU9fPAwALtUAlVUto27nvcTzxk/WJbPw5ezQ9e47Kxmh3Zdg7zXR/BNQcr3qvDGnd0rx/vKJa2vr9SRJqXIHlzE13WoEzG9M1BTeZBVZtH4Oy2QyCJdBwqBaKgAYh2DsCsGAebzH/bHfkY+dxClU8kCrJaaOWuvpaufuViLP4d1X6iUNiurmOt0c4rjyvudmAl6aRVfEg3dqSAsQW/5nzfzBecdFMbyfoqfmRpYWjggh4kpwWPsqLc15p6MBrDTclR0p59tAhnOJaybY24S2i6j1AnxX1HmfxY1y6xkDv7RGcHdlZl7EaMSEB76CiWAg125VQkNMl3zYQH8r19qMgEPYIn+NJW9vRNIOx7NzAzNOsWCBW3YJL/hcX4rvU3glrVfAwqc2VizudH5S0LFmu+8usk2wR1mPjGOYfk7OE0AxrJGDvNHwiWiLNGf/ZBU7TAUw3To42GljTZcWgbwthKY1W4EGx3q4au04O4CkOryOYvvY0asxxV3AGfRuiXvrxVtBdiBYpkmFvGnE9uAoSCkYUN7efNG5o8eRSzSbTbO0NpbjqdmRv0pUlfMQ1oWW5f8gXfVyRaTd+S5zTC0HbnVPPaE1pDR3RbWwKJm6VXIdAlFk03VbVHDZ2EKTeuhteZsz70lGjF4aTymp0gwXAjFsDpJIrQG4OpWHO4CsPbrB59Tc/PsVnyzclDmCCUGYR6HrxQejKTJTqp3FKY/98dolzrY+pUJ0LBM4BOUwUFyB4KhFghd7Zsu4xW6z36FqehV52S7oLM0wazjBIvMW1RJvg/qzW153G+anTRFCNV0FATSRcR5+XyxnNmR8uqEJ//6BDjVU4090INlkRodH+c75sPTrBzP1xR4jg6Uv3696+QsnwIIgBsgaR0MERHTgoH0xL7dhQWrZ+EAsq/AJffP85L1CSHM6UoMWxbuNM3mxfpmEk/vCVJnWjYc5ajy6kRqQfZdiju12OIlXU8ujO1fInheqRF2QOpLq96ajkP0QMGc3d/D2V8A8MBNMlBCoy9bobfKqnryoAO12V4ygux/qy1gfEAcEl/dWxblwfmcLv7iDTA6XRi9++cG/uF/1iQPvxb4fmynIbjINTgnTnuupmLjYfXJwH7HluChQ4XYsQQPYOwV2dgc722MsV1BY9bvkmz6RqDuZJDhotIVyMiLLHszX8kGmLQg7biAGU+nUkUjdsU/nUQH/IFKye0VR35wqAmzSUo1a6T9IEJUq3zt9koPdvykc5EEEUR+8z1r2H0pgcpZakRSACWCPpFxptDPW0g0wUvrU8TNIlQ+bTPFJNFFwTYAQi8Z8UrxW+Mhl6bkkir/PYGvmthHmsPzqT+j9RPkTl5DjpmXSKRFH0TNnndavZwbsE9w5s2QF30sOTVGVr1a7rcWHfbEg7qyE8NLiVGkohNPSDaSJVLzAFRZrVrEUrYAHyVNr1lu6CyP0pdxdRtUSyaQQmZnsfPs9FFzWUZfrD1hfKOUCVukGpfb9iVju7CjptxEWQ1jm1ExT31WD6mNL5+A3W8PwJWtOQur+3M1VDx5UMKLmw6nKHfTIBqFis32qiLX7d0mK7HZQyN6BmF1+3sg2eNkxNH7A+g8C+Fl/b5Tlue1hfW6J8giXwKpX+0iuilfY/Qoj0T6KNxqxaJbcRI3mnnrT6LZ8hqS2vs/VYyEG/b+50YYUr+w7gqmtwEokEN6T7GM83JUJX8ZDKoeGrJTtdi+qJMcc1RUkc6S/Otvh5G56MKj7R2qWdwHV/cwZyAPfTi8abWC1+A3CPyv6BO22Z893qWdTKC7rztNxLfrgAfZKH1JNnMR8HgHeUmC6G1qwllcW4rNNak7W10PdCf5GH8zHpPkbWx/5MFcpVqiKmPXOuMjeoYycQvyP/FYXI0Z0POvGkj/TQz5IOEaHDFEt0pmaDzJUE3snPS8EN/faH26GuDnqHuZCZoSvGNlpcmtRaH1P7OWFyPK+xPGaWacuRCf+MhH2DRkhGnmJd0YjWH3fq17v7C7z3hVLCgF+txu0zqo5mpnyjKXXqy7L2fzqobYyL6jxYGy8x4oq1V2KpgfCLP8qoZ+wptbmDx+8g1TFCDZ1KaByRa31Q6hT15SN3FFilt2iGr9clo2mo/F+7F6pGtWj5a8pQ2h3ZuKyDiYxSO9pZVn2aTe3fHz+AmQ7FsnEbfzSLki/2QCYwvvTCWF6Tmjl4bjIGIW6jQ56DGn+QiA4pgHriroeXWATCX90N6fMVnpz/VgGHruve3lUnzFVcmaqj300d7MsmU2Exi6px+94jCo02Rn60NZ1Fyryrg/yLl684ZpFQr1HTo6wXk0avZbnyahgxd/do3QT3p2RmGi1RehMSr2wwg7KPaqSH/9XnUqdh1hyIZf+GfqmrJOs7xZk5DGB0J5Iz/oM7aiL2s5eoilIsU+Fd3e3Wv4H5el3CGlTHxAYB2Ug3WD0AvGGANKyszAOE5UraNiMTdaV5SNYsCCmHSS0vBmesHDo2G766zOx9HO6kiqZvQLswINt2a/0yo2Vmh4iyH+T2PvazHnC2xE+dN5CD9wtk+dcAKDi/zN4Ad0u+dWNu7bnDRPtu6E+J0WvyoEUquRIZfmdwIWdyBqA33bTzWqDn0xiWCkoZY7lFHo2SXfCnwJPmO4hExlxFJPUIfNByQ4Bshm1K6Gb+5p/2AKif3n7puW7SCjfPMhz9EEcxtP9mWpeAfz8L+zpJYiaj7MMegefrtc5JBf3XQDJlIF4ews3WpVXJp7ivJzbrJvTpFo1hiFRHzY7uNgYA3MZSkPSy42OUYtetRW26at+jiMXJIwavQbIg70IH63E/34c+wuf91PldUIQMdkxxebu3I5EUsDMUm+/AUZJrEn+A3bU93c3WyOcKkspGmaFIfpaB2GrWXpaIh44leHn0LXJTLllDJz2wP36I4ObH75W6pC2cv7vBhowGLye4+Pk0avBkiA5macbjKrBrXU4OBd1xQ1M6NLIMKs5JWSsC7qSx5WzVidoCGiHgk7rKchYCVvo3vSPx95efKAt1vFp9XuMiCRYPEzK1Qfd9y8y6D9m0SjN3WBn0LzWJ0n/zx5ZZirgYh2x/NPcUalrFgBuM7ZxZUSMufBMbBXh4gTxRWwbInikDzWAeK0BaqVF+AZG3TlS0QZVFFuVhk/xPAMjZsKebXUwxbD4Ol5rcm/a15in338AnKuaPfMZnltf5PyVqEeW5wMvI/ZHke+tHCXBe9QIuvbdoHaH7XHe6oAxK2BKMasHDvrDlHhy22ly31KGFSP0V+wfsefEE166TQO7ksv/UEdByRVZzm9/CT30TWTCJ+V9DC6Xee79Nd4u77Kyh/pGaeIMjXF3pNn9P5DSywKhs8r1uxmKqp5d4/28oAAvXKU5cwHEeqAUBkvrz6ZzIgn2Uj0aiUkkS+p8EQx8FhqQU4xYW9HOSJYhKw/cHOZYi52drfhKJnhThv8zToC6K2/1CVIc1dRL8uQEleWySbGyiaKhQnclniE3TWlBkw/qdPewYTSEiMsG5NoZR1hHdwwTRgtSVhlir+ryhkaID6akVjKFjogaIP2fl2lt9xX+C7gbh4DpoRHyoztEfjt0YD/Hy9nZlAFRUBUmffd8EUVVPlAJiXnAW6a793XD3+vkF8X6MX4sarcO57NBYx+6HcxKsBEykl48guuO3Au4VJ3rG20ko3sh3fbW+v5UYKi5Z1W3n/QPG95xh5DDrwtmNxBcMDVApWSxRkd0Jpnsz7IZQIoa4/tJn+lRypDrNjvxNDBOhm2V3Uwnd2BQomZzAWPTMiIxo/gQt4o/kuQK19c88oa9G2mjc6Wy1vFDpHbGD7ysQuPdZ78mM58+4/W/9vH/jWr4gl052l2n0s86XWioOIQuNiPHqKTOLpC62rfSWQ2moM1hoKsGVwCrjEtDZvyliC2qiqJiECeYLVezQ6uw5VfpXmNfAwwEd0xe5ew2GykX5gLTDHLegKn7+Ep+6e+kct1ZtnBSHoUmfEHCYPVan1QUWHCfrmDYIk7eQtNj8S4Vdk7ztbvOAW0I9fKW3KbNc6BqGCpc/JAABu+0bvBV5xQSqYjCPAvmpcLXHenikkWZn1W/e6mM0KDmkFf3XTcGlaDnpZxokTQzvDfzuqxFa3Gby+vHEc8vfNkX5FVP0/2O+X1R1avfdHBgkzPqsbgt/SVgQfuOreeGvYjbMNRU46BEvnIO9haLhSJqvGz/nJD7AtqC/5tAjPlGlKtxWoV2lu7+2M3h5coA2VGH7HjCviv4jL8lX9H1LvPbpsGSR3NrXUvu+GqSj/XgxA1dgqmwfq5BlML7+o7nDDkzHOc2MulS9LRo2P4Kf5Pv0HLGorIn2zRroBIVrnmHxmSiSXq2XW4xV/4TQZe2vyDvSyFNEl5+qx6hpb89UtMY81vjVmCkK+4N3NT1yrkJyuUZlDcWdOxjIll7kpFpf58FdRT+t5F6s1i9g6srx8sUeMWrqjyVqZC4KRSbYUbWHbT2Mx6Dyc1xEFM10zmBnd/HgZpA9oJ+nCTOFSP8Arcop1e8dwY37WzlN3JXNLhzv/kpvTozsBNKSM0kcxgCuRDZ6QtPYi30m3To6nSutmXWJAoRplfxzTN72rAVRZR9vlcxbMgn/vvXAx7OpE0HHb06H0la4vk9i8IFIrNwujyUJ0evWNszSH2srCbryRxKgirKBy1G6MbcLYFjSn6mi+j3nRMtzqxneEEGXY8CMZHDpIrEEV7sKsLQCyFftW2312du0DRGFaTqt3dAtHmkBVCb08SYNBWHRnBic6z71Oj0cXrzLRCruqqgO4c+weuCTBdAkDd4pBcMPCN6RuvaI0kDFtZOrALiR7kSmU2n3IgNkJOKFS2d9Jys98CAsPgtcIbxU8FTabMBUU68B12JsckXNm3yqMXz1CfB9S4rU5tUQEToY1QOpmLRNznIg/Zblv+a5Khfto5aUC5KZeE/n8YlN+R/h2RtkQI7kuElFo4OBECH4/JvLMXsnVsjTbulliyp13lEvVdW+3L3mMV2kqU8OZqqxkfnyA/qNDifduQ1R2XjHJst7QGtAh18ijBuiEuyNuNmmreFOhljPneK0N8jaujuMUcfVhd1WYGxoEgNoB/mbw4jlbNRDyHg3Yh5LaQdJYqJujxzNBQBWvOT/gBpxTw6H+e7D7SgJhGMPlOc2LSCmUf2mEKHTXt4+B1SsY4GpILOL+xcVBRtChtEOaoebISmebgoOTfzILDQAfdYWoBzlz/0NTy+aiCVeyVpCk+yh4KSRTn4T3RS+eICvEvOuCu9z5unuWC7t+INPupkRxuSwgUp9MeK/hZyDhgNtKEOjfamkv9l7zCCkAFPkYN/Og9DxDZVEqjpPZeHnmbTR4o8uvv1fieoILmFbP0pgH14lciuie+3dakaqbw0prfjq4YB3tcPPDwtDaw5bTOyjk7LM7hnmfkBvEhGytf2A6R9e3j4gptfqoDG7IgI9kJl0MVrxyht88Xxz+iC2/NuBNVh5tN9CUIS03Dd40UHx82yNU+n1P5eQuOMlk1zz38GceOW+hfNk/FYEES5TL1uGBUFI7xZLn/54tU1lZav8VQRl21eTSTYELMNVuExgIvVjoaEs/KHf7LKm6o/0I+QYoR9Fl+OBJjSmQGRxw2844IE1bx2If1G1v4Xp/rPwFezucZSMXHqYRQe7vUOu+VEh3fybFY234OMnt8oVdCTjyUMJ1TzxMH5NXr0xlOZl2t11SEz0hn3nRXZxyBaziIqmJ8OgFeudjFBV3lcc0l9rcfEqVxWmxR4sdMKI74idM1af0TewGgISC5y8RZGlZvhchEQhVhvUR+hlPtho9UKUbFbFdZDmDKBri+5rG9yV7a7HtB3FE15ypRCZi+QAliYA2R7gw8yltXKAnkrZMJc1L/Koe3HNknDVJz0P+v5zhwSN3oGBrenhWlB4MERBR7M0o586bBojJbKjlmWkawkMSRPQbSruAivFMWqvkzO/4wc0MqUvT4dzQP43lQEVXUTcmc0ZnNeipGWKSYXAG+9j3tUph6pXLpAzdevq1ddn4UtH6NRcEIsJFxvqiUHAis8nenH9ag2DLwo/1iIAU/iEJyaQjiItMdSXo8Jgr+KpZQ0gWZs4AvPAbMPgOfdIiiqPpEVRpXsPdRUG/5RKQG/IZAqY5F2cdzdZh90erADpI6LzmewBD4Wg/QmLm8KypZkhwQu5KT1NuOTYBT7VaGMq2b34jqGtF/jscx58xzO/tAqXd7jb24WEvet8gv7a2rIWvEWlnNW/m3o4k0aBSI9qFoJHC2trHjG9i0kKzptVMDfXACoMR2ZPY/QVwEjOkpEQ0S++KUqdHq8coX3gCqe8GxSWtr3a7DTjDrOdZorPo+aE+smrFSIAoWH5PBE98yJTIqe2FaqzEuETTdOk1vaMkLzOszmlhZHIQLe/IkKF8MsL/MI93m1EwnXhfYx7QYakE3GwhMI8rHOINW2JvMyb8ERAOsg4N3ZICgTykivklN7/xlnaxRpIp55HJ0F3t95FOzGFj2kqwHtlEvZAk5An1fLNpItkAaXwbcHXN646qB+9rALAaF7a2Sbo9zNulRgJt9U5Mj1BMwjhnbumO/50RmlphF253U3Va5r9ZOVeHNjFrz1JGTWyXpuwZz3BhEg70dzsWs90IziSSq5oAiQyhcuLibdh5CwZNCZY97TNC/Z9P0ISc1Z/RziJo4ENWgdXsJpgKsMoZY4rU9Z/0iIILKmVCToD8eJoz8wmmTnbzDl2f5RKXNaVqVXbX3MZv6it6GZ2a/s9wlXhNm+aQ7Izzc451AQMaNZCtrGvKFQRRXu59cpBBoJ9Z0YqBgx8AUKktyYleH2ILq8hRSVElB9uFJ39RKFyXYScDc0K8Acu21y2ydwCGU5MnNkRCOikWsTnLp4lJFwa1s9BPK/lyrF7G+Tac7M1sYYfaez62/fdrCdZMrwbC/xtSqZ/DbV5t/5qLiWYlWr5AC2bJK8ZvOxCypJVkY3RNuq0+91sORIVGLlLkFv2S4WvnYXzM7tD4hmVxt1YvbxcCHvBvq1vh8Zt+HfiYJIDyZNucV7k7UAmqrs99uRgG7+2EJhCcTpuPZlAm3cTSoo7xNSzXOivQLafMq9GJ0SPV01+CwWGP1Ln5zxMgdN21zLh7SzwyndGM+5/uhW0yQ3Iyk8TeHGVjMwa7FKA58HJ7LzyIHgax/3uTrFWPmBBpT2bgvzirloNrHWsTyR9OLRbGnZPVhRHVQ5M4ek0GSmIhsIxcLQQujTqsP2sNRpOcOu8n4ysz5LFozCaEszpuLg/Hsrpvvsa7ddO/UlnSe3fkVaflV39cdIomfoOMD1UblNRdgxhCoNLIJC4sTa8mjFzqruEi8ckUZsNUTAuV2wpa96woBTXszIsnqIaZpeZwr+OXme8vLICGbHkAPvOb6pD4XXSaWadAgKgmP9Zf6DHQgKPAgAJXlO2EaueDJQ+SalmJeT74MFMcmKyfHCa5chzO+QEETguAUY6hoX/Phft8qXd1l5XnEvboV7/KOXQfXVXlj/lx/mRUow5OSH9jHFbkdA2VhAXVpOgJeAn4C80SaDiTmRcuuU7ITuli20JkMD2O8iuhtJKWNwF8aFIl3rqpW9K2VTkmCMiWtQhu6spBLRTbX3qSVwMJdmXDRS1iOFBanEz/oHotg/zq+KPZo3VP9OhDpjd8J3aaURMrKYdxS8DdRbLMQrKgeFaQqlTHQ1GNXr5akFvkHOvS4tffXu1rnLPgbw2gX6/jZBr/utK6Hfq+/HmsYKtMKgIpHVsrsSy6HOBqEztAj7ElDyU1oeSk1L5oK9NO2V8TtIm15AVrnhongI8XATZ6wrgxVNDF4MkRyXrZSo+tyMisMe7fYVlXpOFu/Roa0mCBS653i/o/84z489Ee20335FTZXp8qGzG1aXhHhYCVv+Y4tHc6K0sCTkbLaQzfuK2zijEI7mvPLhKYwhvt9enZL0CL1kuL8W/6YLnnbAMvM49NjqBoFr5lf2gHM3E8Q8px9OzS8b0/kw/dv6NOhxc5/d3+XAIj+8/udAT7B7u8GSzy0Hr37suyq/a21gYM6qbPLwWl2EoV5gBfm1EsE1B6sVc1dwY37MnGuZNl2fRDl6oMn0D2n5eTStYJ8xju/uMbuOZyhaWCQUoHCYwksfNRaNKGae+4ezEm0PkSD2NNKNP6KU/qSihfhZ8NKumbjZEXM3A47sn5AacHKIsVeJDH3Wyp16NknYOj2iNaiWFfFK0PILlZ9Zy/m2IYAfcrS0IPOtaPs94nvg7JpMwSakL1wqrxxxbQ3xV2puM74e9O3C9qIVODYNiMI+bZm3X5drPrw/kP6UTqieS75noMdrz5+ONIv2nrgt4lj50emEIuLNNoPJlnLl7ryHC/FcHNFB9/oWJ11thVdNPdZLGiJkRo3RWZRKT0x8fVH2Zf/GMi0pUX+amgQS4tytyi0puT1ByGuBSu3tALeU6kf9nXVVoiGSz2jx18wpGE3tRWeqxQl7CyCEbWuurE4ZjzHSOL5i2Te8aEuIV4jYgz5vAXUb/KAYtOjNCm0taJnW0ClCdRG04ISyVpufxlS9La7hD/iRCXrItdNUxH37Iz3FrLYEl/ng1a9qqxAt6XRK/RVrG0LHKXHBchTiRo4bwdkYwAPZQvXRrqbxcaFuA3V7lQ0U0kmQtx1nseLZvL+ZDEbClD+hvgZSs9UCAabtiDK1HlvdU51DSiHt9GPTVNy6V5ar4/2OLhBnTWLsnBJ+Xaicto7zuhMP5Q4xpJsNCxkb6nbepB3jboR/nD7MUrorQjXSjaARkx9ikgs8XzEPaFNAhfZIZD2ZePuBhbg9yDmp5IrZkwcGNhddoXfHxaDldElb3DHMNtSFB8zwvz5Ke/WpqTVrk66PTcSaYoNuNmYJZx1LKlN26CtTLE6UwwxZWOT6kdOqo600FrACcLuKn0abGF4kJf+cO1OxXcb8zBqFPHCvVu63CaThfLreYej9I/RPqxONHQB/bITVJ95poIcl5i7b0EfkOT0FL3MrMmuWE7hbrCYcVIqS2xGxAegcQIACyMNj/d4SyKgBKoUyFgpEtu7GutHlBuarbHeuwj3iQgL/3snnKiLRDaaY+3pAXE7LcmZMTFqxVUWt6dbE2NcnOr22U52K6LsEfKiWjx0Mirobf2cxIYzhcTcbrG1AEfS44xFmdvJC3SLjTONGaZWkbuonuc2hCJ6hl2W8LpgHbY71ki6hx6wir7QXTNsTAVTLUq8crm6vaQOeStW9z9YXiKkyhDYL/AMAftxKTsHCaUao8PMHgWmGdzkQn4zmqecC4HvhSOdQUG850uQn+gK+d0W1x/Yz9K/lylrL2313bGHsxfmup5dmlZzEu9I50aBR+NCl94GZzNfyBtiuYFFXKfB0pwaZdRCJSE0l2BydI9MO3ua3JZHPUPcQMvtvpCUsuwuWo8+tP98QFaUSJZYDYVsbHfbnCnswaUiLYWsqtJGZNERtVB7Vwjyz9mygTWdI0gkTROqbP6kCr0kMOpM1PQ5HmGAA6UxJJ0LzFOnXEzfeLtUWnYwqw2jkvPq5Xj1yUX6eFYDZT36JJKRIX2AfTJERZUztOiQouJYs3UuHWIdvPs6NPefwPV3DBCgsUlttXZCRsCoLv3y5iTHPwg6jLZAXZDhEd/y1Qzynhu6ecXK/8TwDFCX3jHimb0TYog6bHQoQUUuQ42VQn0JKRQdn/Dxmx0SDKtMgbnnm8RVWHO5Xex+KCZjeOCA2r+GqpFtnMKqr963ekooUoD2wsYN3liHW1Sqpjoo6wUYR0e0M6JV8hYJqeGn29C/olKX8NhKvxB5CS9hvVXU9/d+21qFbBnUlGZNer/BIQQaeBzvQ+oZ3DwOp01YD2AEo1vaw4wB/rYVDp6P1gJv0wlJjJhAhr2UR2ghw0iJeg6PvHyC9bijk1cuzuSEZrvXKDdCPkCx8tG2ptxZp8LNFs36gmRLJIlrAKGaTL/NNOlFp+aEUZinZHKdd9wu7E5XLMjQx0Qu8JwhK4AC17lVj7/mmwLtXLxtxP7anLxZQvF6YOEG2odb0lq91xCWniUP3YMaCDJJZTTMKybrKYrvGuvqK35bwcZ3F2jJRzhbESvPdFJ8YRgeRjXKUIkbuWbaY1Odb7xJwdymI7tAlqXQTj8BnkHCZr6K7oaTrZ3uygrmXgUgZqiEznByDdLA/XydFemuzWtjTIly4tc5zp7XLm1cHiCtkgME8KVFFIXOFiypaEg/pGXIADl7wgEPd2wv7WtIKVTt2Jkt7m98zX7y2mIIljRlIWlCbOktsdLGbKqk3l5UNXZWRJ77e9Kzf6bCDjT43+wrnHDRfk0m9HAOGc1jtWsZSVl3mBPOCyFiJS4CUdltFSo2zE+yGRPkHX9cAgk3DPvysMuI2a2dEhSgfU2BKAsGZmyijiGyuwf40RrJLo4uFq0UR6aFvhgCVbmoDj4Z8ntrVjHMOgzush/xuTGoWJlrcl973H8YtLsIzE3551NTB92ESWEIM0LWtbeNHQr2k9mZzrn8AP0LW2jTHWfLFRnNxlodV0hoKXANLQX37L/E/1avAOEfhsdNdE7StYgxjv9+qF3AFHspyNqWS1n3KCC0dSQYYHSkpBZccG8IaXBWeP82PQh4kevaHyLQKeUbSmFeftSYciMgkXhImejWk1RwuySa9anYqU63TKKzT7nq5Sdx0uailps9+r636YGVRVAkbmmvL8jDA1iTf0kYmymMorSPtKwketidjSmDzca7X6PspFcN8jd+sRO/UFK8rDd5lpTL0Mkn9Pdv7hWi/hw7tTQwCez6Sk4AtsQK6myvdtlQeOUug7XA7ldQjPEfYn1j2gwVpB0jdrojMnGiAr1CEO85gV69scDysPSjVrD60puNZ4bR3RkY7kMZQFS9EWdwhcWqSKNIhgpAKcALHNnlAyDb6lqHnzoWyqzJsrN9gTs9XgIqaYMDLqfztjHUl6h7tJuYaBluVH1YFb8SLlD7oj/hHgrBDMiL8lGCDD+VeZci/Rk10xxZX9JQOStYucBhH4greKmDFCRwDtzuqRoBsJhv1uhlAgQZsepiPkVGHz35HGawCa61165nv7DhrSnLf5iB8EOqUc7BRhITIXvAe3fGCoR7XIf61JBDOKzLM/XRaF+D3adQ4hzZJNEt4kram+vNoyVwKc/KsbzV9WNdGCFJ0oi81uEfJAzg8pZUlkgY2BubFnyK7jAMprndr3d/sy5rh6U7x367lzSSY5ZVq0kIRf4myCwuKN2xY1l++XK9m441lOBIrOYQNGPVHmIrObI9NuLLgjzaldOa+TW47kXStn4moaCBneDbrhGO+QQxiszFbFlX1qgVGHE4dnH3+N67MrOy75mLABpFmaIyc5oHUOUHX8NZRDSgQVcvMri+KgQ4e7PjqzYMw9Q02CyCESDL1nOrCra7Pj2PXU8IPlP57J0LNNptwD1TGp0aJl3l2pE6uCSuR9sB6TU/IeheZ0x0ymARIHY2hLI087PhPpUDghBw32hu8OpKgMQs09MGMt8MEWZdFlhzSo0Jk961CWolhK0VYBCfZgFzcQQSLIy46CYOlvOQrLxks4Y61jhdkTmIF+rYjmvdqDIZgfl/o4Igl5sm1ohQrkJrJdmVk/2wLji+boSDw40RSVee2jsZh86uttEIzlF6Dgbp/VPx2EbSrZxghiUX2MR0uiZYWQA5ARnFVN4/734IPZygG+iTzRzt5Z/BVT+2aNdz5brwMLSt7cXv8i8PQvr1RFTX7OCAdmVDvMiZO+Axk4JcU7xVxcNMefQlGzO111rCB9pnk3NRibpE1gJHZSgoNFjquBD0ZQSQcByH5WcK0vxRQq2d80DDJMVAbF4epLY00/GzvHKELG6WHdIKg7pzUaNQtgfUbvcxroO1ARCMm5umDQyuliBp/ixwhieiNmamr+5JDxI0sDaB8R1drs34ku3kkNRv8OCPvVR4p7JtcH4wWh2oMK3iP3JgPjp6aWyI4rnSUHRwdm5anUyAAraCzmMjv9aJVOukvdgFsolxzTeU3R7sqroS4sS9wLEWXJ6k9pSs3hII5O5xxXeShbovBN68GgSup5xUELx6wpNnp5XlZlEDWHqhgVbX4i+lj/iHYrC2riQV1YcxpvOMmtJykUDl70BTy5qqYWkbpf/jtTEIQYEE0lM5F84J95F3r0/KtczJIqWvAYw30gHgU0t3Pyg7Ek1j3oZ3dUhDEADTW4Lg1ZK7RXCh75NFE/SYZwRMosURP4vVPTBJCV5iUKT9QOYp8XlWGEeFCxAMaNlPG9H32YGvqK6INy29yUnlFXRW0KrFFiRVdKxFj/9UPSwEIEme8R58hjm32GSvgGfbOdT63kd1NW921a70xwD7uN0UFmmZHcWhypYlnaqDCGN/XM9W5WD5sbLEJR/65roSZyX3+CzAMF6M/i1nmVtEH7vpByVICxceq1pmII2WOk7gGApsUc6+DQPlCjfxfx/0YQH+gPuunPCLR8BsfcGiREy/0eVsxFx5s1xrhl0iRgQumBgX8ipFonR4UVO78J1gd9FPaIpTSms4HophTtNCRdyR7oMsg0kfvtRm1UBBSkJurhJ47TaM8bUfdOkvOcsiKklaMF4R4Dy+nVfO5mFyTZ9fR+U2Y6+b78sfaQ8K9YHkyd/55xOwRtGUo3vxy63jx4V1T1BWHSU0gqpeNuHw34KnW1MtKUX75eHShdDZqizd42HEoq0kLO1qAQXRA87MQMRZ9qDMi/pQJzXX8k3ocCMPe1R+wRCVWvbTF2OKmIuMS9lArE7fc/kDquu2m/7uVqibz1wtgs7YFPA7qDke84GWjFTjPInlfjUQTB3StsLRW5QKdhoPcSft51mENEQc9AR1RmQWdjBI2HvhyF+Yy6Ury07a0bWZWPSihE4LPZettnOyfXZAn6l00P3jqmoYm5EqZjtXJL36hqUdd4pJAjus1d8lbRiytgARSOBPwzTUc8KEnZj33Gq0vhpB+igwgQWSDBg7Dus1sfo6InTBf71HvY+ZoMoy46pDfLdrSbaynfwHvtG2xMiPnCd9JrMoxnpNX2tPGRutirFG8n3nyH9n/hrOPAEIBr2MCcgV+o00fq+mjXRFMmNC/EsnkTxWRMTIVlFHzX24jndyiy2gGNU2hMoryH5Az0HEgVUEvlP+xVSpXxKtg+A7arpuPBEeEOxdpifgtLdaTKmG3oMa2Nvmz56hHQIMEq4AbO0LjNDymx6Fw4PluwjTJu3ypi+8+QpYiD5hsE6dl/CBe1BWyFniaY1NyOn7QULDQS+1a/ru/wz6nQuVfRA/XhQHmmZU33fjzUphzUo9/W5WAL0sBi/TKM5+sjQY2WxWljSj8sE5TGzLUAZbsmfJhN36sT5PnquSkLHgQ22RiJbZNj4RsK9u+6m6Njk/gMh+V53pOegmp68LRRQ7HmJcNDFMC57WHtb+uq0VI30DTImvh4zQcw5vz54UzenuSCB6XdBCrSPi/BXu//W6Yu6K37xLBAAW2MmepTxqXxOJsT86mf/QXCfuvHmtFT/mYSD30iUgqKDE7s587DW0w4qVZ4TgQTYbY4CYz/lFpI81UBYEoJcfPSPMLS0Kia4ExAa+xa1bySKPr8svBQykEopWdWBnaOYhipcYpWnVZipNPlsXTSSscoyyatWQmknb6aUKQs46R6DlJmI8+1H4z2UadbpamAPOXLZPcxlyrp4kTf8nZq9hU/pkrr2SrjmqiHqT5Tc0MrbEwpVMK/ELFjYNNRJ8DP5cltY6hr2LJSe+4fO6B0iFbMN1QZuqiCHg6BmsBedNeJ9Gs8XUtN1i1eaO2nCG4jefSBx6ebcBooAa7HfRYwUVr480lDlHGtwRzbNEyinWVkVLaUqLw040xUFC3FSYXGgpCFvhCr2hZa+UgYADr/35sw6DVQQKy5pMobNO+SBbtK/2npPQuCj5te2D0SP3fbpK44fy1If3iGVc+BDaiqLfSHH31jf1GrktdR2zmk1luO5HyuDte303Y/jeKt8137Paux8KSTUbqH5D3K9x3ypIE4L5y9ThMrhXxUYyoVWjne9hrok/XjDkBXs3PwmR8Y3RHXS1ZEDdQd7zv6tBDVH9S/uVbyUgp+9QzjBMljJBN1biFwqDZCdcGtLsfUfV4V9mS7R/6EspKecaJscQCc2iHdiGPTUqyamSrCzvAg+QVXfI4vtPmKinqlt/njyXTaed1+1iF/yJdbhyp8mW7wafTVu7EkEE7cyiofsBaClROVbnjgXtnV4/AJd1rASd69B/KF+vyr0aN4amBfXqZ7g44brBRgN29K/BGRPv+rYan+uktF0BFKhCe9uvT5sEWA8n+gh8fVBPvdPiuu98FxZKbM5KneVs50H3MCC/lpwNDhc+Rp9KoeMHSTdkUnrpJdo/ghMAL9PdZzTSfS9W2UcT8k1TYXXLa6IMj7AkKjabMfX8nm529EE4Vb03Pvc8q80TEA2kQb0Ko0HctBmGFZH+HVUSCWeDky1bHIB9gt9O6ycVzlrmZStlwVmM9H57BDVf5rnoq2LtlISp3/QjF6I62g9SwTeIZ3fcmct8M8UbdrxsSEviAAnQ4h6bytvmubEgx0A2vNMfUxC9bb/y2jD++mE41quZDCeuLQq4yYC9tFgyF8YWQlHvZryjfc9vFsqrPOgA21rEn1ryTzILRZA7qqpOBuM+E3Lpy22oTRzsk7xOVl5mgkFMOHjw2A8gsj1yg75iYCOYkSyaT5Ynz1kLfXXmM8X8P64V0vdfFrc9B1jXWxXLeMFCTfqfkmxlFBjdZu7GumQ9DZNM267IQFxMF9VW2IFT1VxH/JmuafloR5telG6w2ih3XKhAHQZBBG1xQisLzLLaa/2ZvcjFHSN2vXYyGttn7EBdNiyjTuGCrgkpBpCQako6TexU71lZ12N1npqhf9Ci1WW6VAfKG4cRyy0hZYEaAg3MM0caYZ3SY49mwkKTRdp5jfb1SI7ifgX3HC3Tz9xGmj9zIcIGejNS4a3ViW6FBHoW6aYg2FmGQskGhByQCHye4eelx8BHwy3oGyf8AuETSL+vyp++7ef3tcIOrJMiRs/+DRjxCV0J/zkovEG+KRVek9VXC7d7O/2mB2wsHLXkz1ShQ+c/JGVQSVCRTyjlIkIi/YiV8v96tbFz/YQ4d8UFQEbf9Z5Vo/S987rfJ9BDCPpqDzgisGQOUzTJrZopLu+/ntHGHXaXu2t7PntmTqWF2PkUYANb9fidg85EtV1B+4EO74TrVq0WCAbPw6fqDYiCy+FseyKn42+SrocLcg2Q+XJQumj6vMcRdzQJsGqsmb2wwg9ZQD7BKBzCR1nEvFVwAlA0Q8kjGztOWqQ6VK01jHLV+5/seMoEHVTE/MFxApfiRjCPKub2igJPemw0Cf3pNhilWPYomzafcI9IC1uTc1W6jmra95ZBJ2OLJs4Be9KokbpkaiuXJY0qSdC35hTes0CLwlnCaf/ROY1RvxmT1a6bfgsQ8KHIu5N87OYwIEDNHNld7vY7jlqFyxHfEydEGKaG3P8iaJrrJKAZWmeD4+KXs215toznuMYVMYHP4bdOm8fLSK8roDU5UG5YL+ScF/O/6ETZ2KHezDNe/SfaUWHHcVzQ2fhD+VxmgqFNozr1ymkQnfOKP8q6GAtSPfLCEky/Mmx+v6FTCegdeVd7ITh6eW8psZS1NbX190XAvLP24+ZieIN119j5nPT+LrU1iUjQsdi50w2YTztaZRnIqx02lUPh14/OL64AGGNmxisBLNAEcGMSgdIp4gVuZUBvPYxFyPLGaTvlnMtvkrOa2fZhS/7i/+t+8zTqTbole2wOC+26pl873yP/IPQZhQuYpTxzon+0XRtDXpW++nFvz8uPy4/vLfzkuK+Vt7nvuLAkKDKSw5AszqnmJCp+FBW/+cSvsn/9R+Kk6Yhf45NLXoS8M2pG0QdB2wwsX/y3oNZQNQd4oIAMRpN0ywSNh7n48j3ngOXJEAoI1dHUTLhVvBJgMZsFaLtU8JSqBRJ5n03g7ZtV+1AX3GUiGTYzzQWzdb7Fto/jVz9jJtFBNCIqLC0OylJTv3GbRPT4J01NcJABWIkDHrQTTaAfvmTyaFsy/kzcTeYVXELJiUL2QMuHLNcr84LcFYL3jwvkFP6JzSUz9HySXlCTVyw/VcJ9N/EdWXQ5rdhsaYAVWhXBGVvSRtdEVONSnF/idV85eE35TctkPAxm65/1Gov01oijkKdNAFUpMJQn8fX0GChXkb372Jt/+UIQuPY3Ieb/5lbJhBmpp2MYWzEdHzjTQ0OV5RDLxxZqNt3uAqdBaMo4XxOYLo9xroJOSCHAzcHK3Ng0paakEe9y8abmIWEMIxS1xr/6ULsiZpwPhPuh6CbHGHnAUlSiMpz+CmKWEIn6LQB/SMK7knkZvNoqiJXObmw4j3PXpwAlGowrFfGiwN5c2viSwJwGvZzns3ZPdAuePZvnwSsGuzYCDd1NMjzv+MZMXBuJIZlxeLSIFC4Gdy9Ig5/gAK40X36Ydi8ZMr6iUzmNZwYJBwBtbN29WXidcv2y9RF4Fut1GW9xG6C7EzQpbXorhCTWzdTS5wrJ6rf9hqgtyN/jlbd0zkiKn8jM0oxsFFyGw2lSgU0APlKkmDHGyYcUQk4ePf1oT/SSF16CbsbPkc37J/ZiDQmohP1RIV7pRgdpCn2tXLd4jlhjc0EFlcv74rsAqQz43RIgyJG/KI+tKd1I6jStMOH5dO1S54hLHPaf+Ikr8hgloy+/fLS6Gfz/I29mOTrxq44ucr6V5CUt9hvUdinAy0ZdbRfFzxdPEDz7Tj3AV7QQFrmgM3rXlco92L793blvN+1vhIOiUJk+j4EQEiD3hbeKbTuEPhejyqWTr3GNFs+/wWJAqCFPQMirASgotmU3Krd563fJBonk/w+lVSfPe45afc8JZCu6Pr7wr1UjwD5t/K29Z1wZsaOVfRa779DVAgV9O4cgIvRwkeDp2I76y+GTqrYKHU7vcW1ztGhZffp+JWSy+BVkAl6k9l4YDShLhI0pc/QgwivCCBPUrOtItWm47HtqlNYhJimdJsSQqvpKDG1F8BG7SzWxpV0L8uipqdLF4URTryTBIxIJtNa/nwGWWDtOTVH4dvP2xUwkZm5ysiob+NAyIIvdHbyGg3gY6bjNzLUjWJsOSShVgBuciltKcMpccBWAIiIfYhjXAnJ0wS4mwQnWtadMoI3/TMHAMNhdKmdanX4gc+Gx6mFzP4tbwVieGTnMY5s46IlKGJEocUSxxGZAVgq19OstEyruexDMYUKz6u4AiX7QuYyYSKOIpDcWQtjT3LyyOvZyr7fYI9D+VExoxcGLyPcGvIvIxTN2FDb7uPRP5A18zW7znhl6lAJvgsERHoUUCa+GtBqdL/HHNbIvV/v5zwkkhH03YXGDEO2Kx7qghjqQPsMOdyX4oRjkca3/a+lc3Nfh63ivpmXTcHyJUXc4vS6ZaZmyCC5qEDdnkxTW7Gymo61JICXha3CbD7dUBKGtmWbTG/9v+Zu82RRGl4YANQgFncprXUzUgKPKVb8P930yCSf29zqVLDXrH3AggWhHn8EkZhge/qv4O7FzvjgkofiJpBLvREMXUnzMbRFR5fKbkXPm6wDxSeAXKJZr3xjUQJWk/MOID2UNCZtNUuTsO4ZKWfs3MUh1ZQ9/ol9D+WcTwxK1diXdSPxFEIbqrCKoBM4odznHFIWu+k0cR016J3+ZngSHI0hNYtXriVldW5jGhyyYZ0pqB2thYkkWSVti1zrLmnCXW5BUgfZx6Tbz2msG4k1FtcPieKH0OvOVlPwmHKuCDF2Nt/vM9dxKeg/x8yiW7/YFylyeQChPSPtF9NlroJu0UTAILpQdJ2MNsJlL19nS2abvQEk5s46qe6WGA0VQ6nba9PEK0ViG2zsc6TSHRP9wYWTXmiVbgutIV5eQYrNb+jPQhddVGagofdP9VWg5LlsqOAk+wgtD4CD5/Bckn2zc1yqMy5oBwnjURPcO/iQZxyc6wnN3N+xRGg6XHvWmP/l593sDH+nx2xh1dJT5yeoW+RKy41+0EDWqqE0u3zsvNOLqanMYchxMdduO//bbvbiXZB7fGbt5EIXUzQLA/F19qk2b/O041D1EcLVTq9v9kfbD7aJM9UtAYCOjTqSg2eRemy9I9VU0kP2MkewVKSPUN6qm+QRZ/5a6UM0RyGb2BNpQPv1Da2vFdhfpVCkBstnoNuTNvcpJ/4N8izQItUqwJnJh2jDXRqBYp5FSJgQdVwYH6Pa029qFf0FCtbXKT9DYwr8nzX5rpdaOOOqH5jqWYhBggudeYOefEy5GgQ8VWxlU87BPCMoZjlBaZO7iJ9WJ7LpDFcE3Qxcvjjf4iGEC+4WQou97hgM3e43m3jdFIo+Ofdr0rHQl69C4qfA+PiVqyAUI0s3qkd/EDkw9sdZ1VyDi/dDDGOB27jIzZAMYSYpMLE+CF6v8/VjQR4nDb/hujkK81bG/O1YYyeU90WGYM+69cbMYbpV+5TtM+ZqTklOhz+4koVgpK+HJKEqvSTuFxjS1ZUCaUIlt3DzdCHbiZm5ARFNDkgS4Cl5ORmWva0/ACJ4OIbVsxKRpGq1CY0MYMcQHesREKTditTplAltnTsIPKembPFrWCn7W2L1U+ta5fbCWne+f4peqj9dZOCAoaXaC2iETlmluK4dfWxEY7Iqdn+Po2ueYT7iu5HyrsXRraJmR9Nd2jS9PTlGD4KSJc+7SSePtcnAOIbRGMtY6QLkWHqRoYYiLyQRZUcSoO1cxO6kR1S6A0P0ShhiYt/6B95twqSctM0C35I9LVS0pfciVlJP3c/lJFfXveVabVYOzLcMSXAXsHzp+luS3hO0AHSApqwip94AReVBu9jGT/I0mh6PED22v6I8xJdI6CXVz+MzL6Y0H/Wf3UZoGTAuTKw73YQj1V1JjTIjDwCV1Cl67oaDVqT+rhXFjOFBkcBFN7rIjkNSo4V+6rEVIx38ERUp22HMPSfinYfT4ist3lVmcg4SKlC1ZwQI7A6AykxWdu1nR4+k4w6lkum6k6ttyqxWeyjgSpzP2hPfbLpUBK9KmfCOfhs742HzEM7MahKRDPAZ5BSktGhg9NbdmD4fXlm+hBTMm4i3+8zA3mxhZUQWw4snqdkHkVucF3nA+fpdEArbdcm8kSUxWf6O6TvtewCkAOT5a5h082kGGOGiUWBXnU+RtS5YJprpOPubXaektCwGQoYw6pVDqdyIG6wF6xnmHydiZb28lTSvUzZIJog/1pXnbIcdR7/6835+1xmiAfRkBCiUop2AAQhjuBlaKSk1m4ko1BB2tkxGNJznth6y7E9l95/Kv4cLgMZ4Wv0R6Yaa2HsxV6Sg0kR8u3egyY4TajauKWK9NXNnzN4/zPdAnTNI9BAOmNQOtvljwqq51Q99rMnOkZA9hv5E8X1Mt1M6oo+gMZ3+h5O3vcpFGmE0E2CSt/y5SmGZyZlnR7oFuqzXcMwpis/sQr9CX5XLA/Sn78xpx8KzBHTN5uk8SrOCBkpiTs8cnBOY2Fc5/n6EdPwvw1FXQtiFg5y4ojFgfIQbYfL4t0BpIflQxO64MsswjcMLQ1HDo4B9cv9TkzT4qIbNmFMCQJTbS3TJUP9zsewecAZ/UzdyOVsXj/ds/ya1wOH3CAkRJWfFNhM4AqGCtng0wjCCgJm0bpo57eMvCsIzzr9JogVigqw5djwjCj8Fzd2k+/y4BDaFfKuVyIBbszCOgtYZVV3xiB8zq0fAg6VCbRbmRFUSXKz1rfwzddIeg1Vez6EGk5vWHBG+q9ww8cNRqyabTPEmNCUkeUgAqsV/sab2jpc3jW4WszlfPw7Hg8S/QklOBJSKefuaIsC0+WAWt2DYe/2YQZ17B02LAJs8pfHvp/ZF4rCZTv/tk+Kf3LCDW6N2O5QvoRJRR9jZ7HQ/KtofqXr8QUesCb4SbmlN50tDTh3nsK7cpxX+ZqOSF3c9uhBLZlelqSAz3VS7eqm87aZbPfnSxYw9IcCkDzT5bVY+0np/HooPt0kZPtSE+gIxULHpI12mQYW/AW36vcEozg250B0ai44z7QCH6ayuYTK1ocV3bKg7gS0n/mUfHW1VU/KoxcxH6bMCT+o/0IbuvnLkHxn3oefFyj7gC9EgZFUoWoLOpKPbpmYugJG/KrWY1oW1gGk5rLeLGYPTv6SfH6jGimoBlzYwbOEpNJhTVwZbO59nJNf79bTcWbCrH8g1NLrRKItyFCb8yB0OYZBHrQUYnr8elJiBKK4ONXXU5CCmU4n85iHLj/8zjM2Fya+haOTrdAGfMeY+Bj51q0HobMmTkyIT8dWb64l2FvPEqPDKJuLkpCs3SaMtsUDYMyQ+RK/t2jZ4E95lFdNLE9E0Nlp1yI/1CzEalVRGwR0+akDiIHyK9ytTSFRarnkvz1l/8YVOPckTtV25w/AGvP18RWSFJgQvdoXCb/ZYZmZhVrN88mW7gjoWLgbhj+1zChnMRo0i3n3VbLE1JQmt1mTTcmJc9R1NaPHI4vjWE1yevqvbH97XGuDehdd2RNPFk5syekZJ62kdFXeKlSV+WeDodQ/jtM4B87udoSmEf7y9kjWn0NRYt8Fn4TJIC+/W6SphcXoFndWcqjuUDTJ7goU6/vyATHbVGsNn8fyHXJLf/8qiZSOzeZsxs0q98faP8pXfUe+dJ5GOhpSgk2mcAnnltneaiNnAzZ3rTa1hm5EvW2jVXIP3b43/9ytujmAZxjLCC5y35tGJhqunEuuA6UV15Um0kazt/XSnTF37WZ3+j8+AS6MmEbUhdGc9bklX8g3LKtT7ik11kwKcnNEegtzg6dnN5Sc/PnaM9vLqanfFbYY1BE2FRC+0NanPybSkr03MPMa5Tmy5MaePq23ma+9ksimiwn/OLBz0JyDSLAbUjeBbNczYjDQRnYaIGca8X3FBZBxnPPOljk9TaDh7ZOKjNcLJkf+SaLRO3qAUcrFPH5eJqxepXMYnscIrNkTHhN7/X/or9o3sNTbNw4S8eDIFg49PmGCK1F1A7fWjhFTCmmG3+zQHeJEM2MBQ23UuQ/hsRlDrd8DPqzt+0azIliij7FFgs05kq64k5D1UXjzDBlWAzeXds+/jca+vzcdVBHoTNBY0R12xnqnxKOxidrKMq0rl7fv+W+pYUhyPNYX6trKqvFxt7xKpiNtkhdb0bWWvtDBrvnlcL5itCR5B/Y3ZHNYKcWxZOzCulH1e1j4I2dr+09l2i36p1hy+uHcJgjdcX+QkVZaQf3WzlR1qXhX1+KLRv1kxe4uPBCHVJ+RzRa8ymWh/l5FPJ7BRIGVTz/2e8aSJmt9wCxPSBY2Sb48YxAbP4klqylIun9++jjpWmR3Nlu1ncDjJ+Qmv6tRQ2thcr/dOwq3Y1UYtjoNIpOwt+djepHUSkj+ubhc9svUswTLofw9Vx8nRSvfESEPEUnd+l8+n308blpPT9T6HFqY2JQFP319FksQYkKfn4PLSR4oBJO1qd1/qWSDvL2mOQPBcbJQtSwYftXfakHCO8EdfdykxUsdJtHN1NRKE9Fao3fm0mEOV6m/fQyL1jDEqdUPiyXSOhoVm0Ve0nOGE7Vo/bPqr2VoOCKIaUI+ipjGQeUXK/T8qtf5Fb7pi48yMnDYqBzKr0S+UixyDCLR3J2YRWd2HSs0NtZISJU/abI/b7sJjKFeOtTVl6L1ynlUmMGKCmi86w24DWUWRE04xjK3pfACaZEEfhN5XXObd6xOdOKW4fajq6gKYbF24RyDVnt9AeLQL+pVzQeEGUC4gRG11XzArCizHQ1/GU3A7bCI6eeYFm5DZpBr+E8hzfUb7aeG8lf0BT5URyI5XLOO2a2/qZIwY7sIEOxNTUaJS0E215xXC8kbZzGB7iJCobebz33aT5TuNafAHrX18tc/VonxdZ6MxJy0L8DEg/r+fvI5zPNe9rymVBnF7tIZa22DgCupLy0mCMY946+7pgBWB72t6SaYOuF/xDOMYi1pvJFd5meIOjx1+RqDK9EtQNSRqnrS73gzLcZz24cllgOCYMt24vTCuspV2JYiM2qt4p10OCx6lWOu5r/2UBU/1qEnvjcxKkMPVS1wHb8RXcJpZGhlipAt6FH/9dBVA+F1BvnC1EjNWOK7SpWF1zhras0H/l0NrX+d3Z+gJbv7FVPnZheYU4WvgZ9STCek8rcIkPG0H3XfTqC/JX1bRBW5jyk+Eftibxv1Q6sdKCqjBsWA4G97OV5VGbAbCrAhCd148Zm85kK2kLRX/jdKLy/00V8u82j7nHUMlnn7tA0fgXVYWdk3KyYDvye7OyuqZyerbgsa893JDOfd+DF0LdU+V+D7sg1+9Cbv7vUEupvHbFSuPkDl4st2r3VkC65DquXaoVFV1XpTh9Q/OkZx2AW3tV0NjlyO/5O3Shp4piU/yQiskKMosDKmbgEQrSk8EvqOxUeIvSzGipJMA1taCjXa2L5X2Zg9hRoPjIo2UXLsJ2STlirJwUbpoMLSLoqfmCB8v+pl5iPhTCcbgry1skaetxsQ80w/eEKg/I6VE+mrJBQh0YJRSck0V8JnsJq2l3BvfqDodoYJhXqyf3fqySftfHNJD3tpjMuSij5tRwKCiHegjkhR4HEYLbjzlLvXGRLBtAmNN3mQwlnQgzrOOoLQcbXSWh6+6S5ZjlKVplFB4+SAf3hfVcVqU4YDvq6kjpwI+/FKWLm6O86XOZCUlVWeRCB1bnU5HoKDYy6VKAY/4sQreM6vcz5SmQT0Z6MaDZgkkcOo7FtTbIKg1jzt8JhfOJ2QRwRq4evJil4zacLBZJNrdeTsaXso3vpEEWAIZ5BjQ+vq6wc+2Qqh8WiiVrCfQU20M0J4KUloOZEyTIOthGyulkOAD82FzVBJ6FRsLX6OVFy9ifwWeaZfU2fwHtRV2wdXC6cCKdjdnUuBwVK0e2ney9Y2hmaC6EKToZzOjiWQaJ2RkexIe5g0I1cLVC5zfj3z6MVooMn97Q86QVF0lhG2WF8mlEkLGGEv672bYwUPF3HVJ3Pn7y+sea3aFrSbMaMW2LTFGNqIiDdMBWfXcDNyM3qqxZbl8IPfJjLOqdyk1ch89F9oJ/8ml00UOshajLaHAN/1xSU8ozO5vItBBTf7VY0wvDJUP/9T1+KNJTwIvNtwiL5g1U6eCUBFTosjWVdMVs5ahhxZtp8SWRf1l6CLnHLEHENhCYHDCcrlFYd53+rGMfiwMXasFU349MZsNUVJaWbG3PPQd6yWiNjtdlHxVTlG9TQZa13fU6tnp9EVU4Xjj8WOiIqER+VImvh6cPV79d+XAtAs3BRZ5SWO5IBq29Vd4D5hWAsI5/yeSl5yHQ6u8W7+U2kb4vVp8QvrE/JwJ11LrTwtssOl6GcFO215oOjYtUGKExzq95ep02pgvEgnapsXyiC9qJQH65QSkUJXTpRvKcsgUS2b3hfNkhi+ikRCL2dWypoKgdVH1UioWpzqkPxrusg+5SinLDjn6bHN50uUsvMOQPxmIFMGY/mCPWBAN7UUbOJbYAq5+qXVOdWi2DjBMnLO+da66hLtAAuXue4U9kIacPY2nVmRE+/UXzsT2vvrzv1tSuvAA/RtQN0NjUyVmsLBm61ycWrc5KmHPbBDC8iXgvNvNL1xwvYt0dU8KQ1q9h0jP4Uwd2xuxiHc7RgCC/evdQu03jxoYclWgL0E0W/HOVJQCSzaIVt7X/PMlS5KYFHUSB/xY6N2lA8RWmAXPDrTjBB11BUJaCP5gxNPA+xTHcVcd7qUf80Ms+d0Y7E+jy6guGvqOD6P5l0DrXZORJ5LgFIxbJGx72r0LeiV7I5ekWNwO1ZLpasGLsJ4Ef3rS1AEafum4azalviOVOshy1Dh0ZHMzZN4f53iUM0OUhAcZfce5OQX7dhhMmGRVMfOF0oTZ2exBl2MWNU1BUS4skRRARzF2H0sd9NzgF6ebRcwV7loVngWhcXjDeInD3CsHUSdtgpiZdsHiDAMZ6k7SmAMncdb0HXnw+uL+gPWAD6x1VjyliTPW3ndoyN59GlklLBmSiTRLHADOFOURnaK5IBmUv8X3Yl+CWGHXDyxlzfL2IMH7M60eBST86AGK4mNWnGo+JkkWevnlGytH+Ak0Xi1b/YR1WojS7FmXkXTOtcwChv6qgRrM2cGoW9SJ6hxUqTgaI6sFehbrZ8hHaJHLUJ0OyxvbYML7hPM0HHMl48E+RQ7Y6c0EK9bA4wmbp8GDYPDugrnHfretBIIhx76G0teUBV+rYT+7kbNd/4fBCdpTAJcs2Jba85ISkfwMLZdG/hEL4eguX2PfgRFVRAC8tSNSwiDwq1gRnGPWQaRN5lkC1gkM3jWHiNNW8x+VFwxOaqG47agi5uhqpWndrL+9VllKAASgr3YNZ57mvZb55lv1oR4XC4zq1OYnrBFu/SXic/bXWyOtHYczl5x1d/1fj93BlUhhwCBQaHz1FGdvFAFWfv2TJAoN/mCHFTVadsAYlCdRv8rjKNfi+5awYT6ixUozbhN8AlCW2FT/ZBNhkAOw4ZTtN3YJaVWmS0kPL82ixithVML3Lfe7TG5bObrVZlJDRyK9sJgr/J6aqPWjzyHLRMQQsQS5Ylt18fR5XnNl8ijAK+aAQjweo9gG1z8MH+Lj/aglTZtUFJPRi6Nn9iXKqDwzXk5oNqfESGGDP+rKfnNnfvoq5IqTePZYF0TSAbBfRKUtXzU7OlaphR8KL7U/OGBK/NKX8//obkxSTEQpizQffmMxxQY9bJn5uo3ujDOS8e7OsGA5Lg6blmZgJkRKiFv+mtOhMcWtjmZJrlJcQ+7O0NFoWWGkwJZy7WAmeVeOaZbVxaZ/pPBGUCXbEp3ZlSxYD0t7Vv7cpqykZFFLMLystmV8AeGYKd0HLAFiGMvp/XqsiJPCN2N6rceSTLp4lRAiP6jEg0v89ihK3WrTS38+2GJY1Vi1Btxb3foqIZFlpLn067kBsQfInoC8sexua66vc8yeajOUX+PpHkGYNJPdgxU8LKeOb/6EMwJGWdvqrrr4xNiUa0iLSjvyDgRul4LdOFgJSttaDd4YYWoX2EgRw2cb6OWf+3cIgfQ+rslnzXXPfT1ygAFw734HQ3Arts4/K/ihUYZ/TEu3kTqAFfVQO+C3TF8YBpEUHxIQBbKr+JebpaCcf1CU4ZcwYYsb96MV/irK+eNjQqvO+ANp3kcYWO6uRIAL/iNjSJKfEo7dkQfgpktpjjaE0CpaPQCy84KgMtgXzpWF3FRjzQ34meKSP+J7b2m9mIRhn/iXKTbBo8jPndvmNONn6Qnuna6/x+X19T5ZgaLYgaAGCrPU5aM/eBSH1q4VwcAlrg9MOeUVtdHJgtN5lnXUNSLlAC2O6wi+/sRPtHjwEqaYB4WqGFEOwZyptYT7kEPnv6yRCOEHANpgM0Qpoaai9zt0RiUa8S6G0Lvk0BIAxFt1SkRRLEkpacQuICLTe5ZleSb2dywmb0/bVp4A/qXiZXlraP3iY2BBWscQoZ0GXIOEWyXS97hxbymXMJ+ehFBvFUlx0QlGoK31GoKJkrbYJEdM1nfefSkUEVv2iLYznWiUH4nKZA8wolZ4MBI7aItEmDMPCu6NLwnUsbzTCyeorG5lwxF/CzYgae7227CI5AhD/dbIoQGsvPwSnfv5fyzX/LiuJtK9/BwdMbF5AZeCNnGMXX1w8kcv9z4mezkyzTsGXJgb/Oql9BTrwx72/HHlJJnjXADzj1DB1eTb6XIdqZmuV+stHlw+eOvPwtY20mFfzMX2sq6uKEPXAD1IxlGpTH+tB08Z7gZtn3NTDtUNRIZz5mgoXDTeFSLMtME+ejgQfDYahddYwE7bzYspwRou0DexoGaodekKbZgWnCuBTj0ZBjFpgsh7NyFGaXwyjALnlmGq/Gq4pBDsuVH7Bgpr8UH3tYOQ0FljQae4ct8zPS5k6C5ZgEGZlifGdwhBQMQrfshb9obqS0rBG7ZNmE+i3AdRzlUkFOfDRhRxEU6iWbf/Gs8vXaxJvfpy5yeQHUK8VPwQNgyWsvDldWo39KF54gWw9oGXQky3xY1hk9JnXuL+7fpms+QNUCO9SB2ylp5Ga8P0vIxpf6rnzolBlk9iIrNFUKFe1V9W0TtAHSfXRpovkQLkDAL6/G2CczNY+yCNC+Jav+QXx1shm9ayVJQY5HnYFH98prru/5oqjgQ+mYW/hzHtGfh6x0e1w9ECEJSXwWjUrpXMHVDZzYLbCevaOparQ/lXUKEiE1q7rCvSofTrtp8QUjRB2IdGV3El/HciDAuuVn0/yUqsYNGU7zmH3wYwVhfMA5wjqx1zMwENAbg2YSOz6Jv72O+NLMj0orvY9XL6NQMszLT7rwoW5987omUER+8G6cGNqT6+J116+vLnVAFv5jGvubWlyrG5pp5EHy7ujvPikCNLEuhmS/U5kuo4ngi8vgyyyy+3EGvj6s4jykn9GYtvb55FwedWlaMoqS0a9t1nFDqiAH/AQMiAgajg4V3Ck9zeHKm0leRfcIeyvWGwDRPKAl0lFxunYGuJsoPBya+GucUTmJlX4GTi/VqEqQf/zvOa5XcZIxwusarUsatGCCVj1Q4dhJO6LiN4b/orXHuaZvXTGZbVH3FaPtUVrgHVfzFXqidXEHXC+ywdGw957hndbxmKB/TwOxA3nQF0CoPvT6TBss7++BTKC7rU1c3QmEDErsmbzJXHTcVT7aUiA7M7p51mW75I4/w9iHUYaM4prT60QOf6/7jmUXRdpzwtomlDsm7kspjQICjGSURRS2HnKkU5QDtVhH+uhZi/pTTrcfLMnlun2Eqin/V+vZ7kX8KzN7P1mh7srzmo+ZuzzF/GOwJXvyTwhWclTi2kIc+LMAhol3n0TdcX7SqjdVB693KG938PAtztDOEXMg3Kq51Ir6VuuT4TyXAD3boeMxSuBYvGOsba4inMq63XympEL874ntJHg23F4OZR+YvERJXdVjqT/oN4CBQHIOUCursxr0CGnFrVat+oHXu7N00gxeyw5uHo4ky1PGoASjNccWI59v3irN/zT/Tw4sQzIXGLzBhMEvIYntT5S6h/C+wvuuiGJkKXICP1tc4tKfzFxyb00AR7zb/TmvabOzCYRcQ/TpWu33cESM89G7IZcKtDPsu2gQdmD6n0titHNKPIsDrjva++l/LCk+kyjC0sxBtBFb61zGrz6qgTR8WtB12FIQC6HN8MAqwiq2T3HcxJXaisoSMviGKg045VIEEAA3OhQFJpTlnXizUVOrZ/UgGmXkDyj7gcp6oGmH4+6DnoXeFJUDU5dC+iMZAvtAymljGqdRCztX+E+WbN6qbJ5U3jHKwF9HoQGd4usQxUdfeie7L715DWcEe6eyPSwbomYTqbQPxRoevIHgEToBLH2A6AxBSigaPMp7PiLig0ca3/1IGRykA4OVFc4UIUl8ZkP/QVJXOqhEzqN9xR34/rpOj2Jx6w2ZggCSAe5SkEg2uxesb+IDep4nKIOPqbtMqQ597vJKtd7CNcAv53tfOlGttZCdesFou/N8NYoev0D/1SHaskKv23ute9fnszrCJ+Jbi1+4sLglfzrmYPf0P9kjNM/OsMO0UNJmkIIp+qxVNwPCrx3yw+u1aGOqCvVY2YSREn8TyttxVRDHVGhJgnw0NR4tR8nUvt9rTAkzjMi3voX8zUrODd2cDRBLFeoAbOzlt3lbPt8h6N4p7Xwt/zqMcEmACAXzgK3o39itb3teWvBYkXYyj7hsod47MH4OPgmgQ6ysmQCwCn6thOm1NN9ybFZUfPLApnt4JZO4R+qDCmyFL20HPC1/oLUADh63U9S7ZUGRLzx5DhTYxDRUVpOf8pYjmwEimj58bBnBCXTcV3VxahqvEDjr1kKwUUBZieQU0gsVoAZRHfOaTbwfor8v8wM/5Dk0ya5IOHgz5LWJjHRE9QxhCJKS6rKhn6k30GkwZMxflmi/Imz0L8fiQjBIgLIk9l+q+ows4bmmnpIWk7DxxAqXborq+/EBoY3JT1i6b5Q2G3boI9c+RC5ptIpHXRoCHgZ1H0h4U7IRKKj3f/JHf+gZhs4q68CJ5d2u1/RpX4U2cW3gKaPRfl377EUoj8REgLKFdfQ9fBbZGLMxY7rjUUaupC9qLMVlFWqAH43EnEvJx2VWwpPl8rgUwFtzf/oorE/q2rje0ChGlW6HipJTTOHGu61TzCLWad+Eya6o2GCks5ykc58jOCrYh6SSHRFkoRxVNKCus3zqPeVQBiP0JOITeFdtOTceHqF283SBAEmXWnQgv0F16txq/R2v34Qocl5YbIRLxglLaRFQuNVrwNYuvZKMxG+eRxF+buYJjy9JvsIs8YVnMQpcKoRYFqj29J9bNrcP679JlFhAwBvPYDNYbYfZ/c45i9e6zQqUlnNvQR8Hl+1QSWHe5S4l/e9fsgZh9nRdFVNj+8Y9pKDrI8dr7329sVJa1OpSPnWXOogiqVWKGZj/jMlGnB6z7b3tHFCpZX77u67itly/aXAL/0ObbAVN1//lT6oHlKR6Ap0z9aWPIn5p8dcV97Cy/N2wRDpnNufuuHqS2S1PjjvF0SvXl2LOK5lSP7IL7nCPE0yGc99/urMqbUAXq/01m+UIwgr6gPx+JjVmuQwpP+NlC54LYATCLJcd5LPlu67Wu3x1RI+3Npt3gMGkJvMA/OZN82OWaWuaP9sH6rpGtXGrwcMnIJlDEgTQnCWg8/mQRt+nLv/J/Qgzp0t3OTvBK74wr/09XQ5UQ68PA3aTnBtth9T/oV4ksaCHimrDEAcAvcV4NqT1e5QiSOLUj77agdtBSr6xk0iGEmOcngz3exlh+Bx0R78s1Zdl9DTBwIBUI492K6cSPHrGZ186AHJUVuymuMEKV8o+MS+HxyPixVNVqD/4Mp5xRGJhTmhJOhMDn+MzQY1f6SSUMzd00tQXnDOn8tYVEBS8XVHmE1gG8u7f/HBJx3UzTN4n0sEK+8I+heu2lzGcIkS3wELEg9SRmvt3a2XUknZvhAkh96mpXiXQOU4EzPD+op6OMYvV6ZZ8meZZRmHTF6cjDxNgW1FVY+nM1zRHc8vnSg4dywJut9PTP5o7Scd48MYIdemljZegfihXLArPisMnVPvsW3XsdrwilzAbizNcxepksjESGY2E7jjA+b8MwXVPvzO2cDvLShctdPi0VPb4SXmODX5Rtv1lfqeAmBtVd8+Q4mIq20cPukuyz9ZOyDpKn1TDhDMGIhY/qOKOV0upLw/7NAmNoIacGVPOO6Wyx0UprLHDj9Uv9LxmvueKymMU2CltrD5LKcRFVr19qFs/UeBklOBjB0CvjzqBlr5Cw983J0fypso/KoniCr1C1iS2t6/skJxvmdCsUDp1r88uqtO4ghokDoPCJJdQigUuk4+Ksu6tUfX9vOyPhWcddbMf0iMBT5TbUHhCIVaSPlWeAKH4KADDz8BT1xQ9swdZ7sfAwd7X4c37RhQQAw3IVeVMy4iAgsH/8aWHVB9qLXfxekJuySxFNSVDDkNk0Yl5JH8F+I9W+elHnc/AvB2/Ju0EfpnaBZf8B3L+b5P1pGBycOolpm9ReMHzkRP3q0ud2RVjB/r8B8Tlj9zu1yYgEB0KgOY22DTkS+yuzoFbbzI1cB2nbprK+zL1oPsVFtE08XeW+3s8WaNSKIsi/0BisWAxQJZwCloiYrfGBITH43oRGeZlMnj0gvnTH1kwSDOdAQSD274SNvjn0yMhSq3J3RWaCYyILKANEESMvCef+6rZXlC+58d115nGbUkWUS02dz6hbh9NiIAEFXaLmN3Jm09Noc1VUy+n2IlhJs45bCx1P3rChdEt5DefO8ZV0DtDQ04hhAmBsTPyYZK0igoDG3R6XRQB/7VwEY1MlnRNYFH2ipZnCM/0Lo27okVIsCMC89dNEziMgjcgNgeBwjN36yFKQv8jv9jt/TjOWm5jcshgu3IXkZqZ9bHZqXswtbQQU6I6XDcuqqkNTwUiMyF/tpbQicq4MXFx28BkGq73fiBMV7XNSyUVCsz/cq+2U8582XwDxKjacI74ZRrsz3sIIQdeMrBsuPTqSJ6oy8s5nYwn8UV0NEIxz3INxmfZz/SOBJWrw7VIE6nriR3k4F1k8EEBd/tupT3Nt2JnSqOIo6JlRNwLgver85IHDwIeXMQNbesWcIDTJhsa+hhqCsLmkgv54aDLU1fwXi2VQXrQNEvglgwFQcg7ubnh8GeU4uUrG3fAS55bKa5NgS5HvLJUFuZMLPyIh7sLOFrdW3RrjIAim78yv9JDXxS8LLWv9lOwydvk7M4VeuAyL40nC1JIfPXi32xD3ODsoNdxqTBv6zL+rg6cpLZo1Td/FVtH+aVd2nEMbUxTLp5uR9yo9h+YSswO4xPNM0ok2vqLfiWaa2/M4RXJbraXbnpTR0skXC1JVhRgFRcK+dJo10/VeSbV57C32G7X1s6LTSGRJ6C/bya0E0KV4Fr4QTCmyJHU50VSULPKTfwqFGz1ayv+NT+cwvUO8xX/FLsAJp74nh5Gb44/+ls0QbChhM38w8z5mQqD60dRyrFUDpH57VblBkGRn+l3EnziBKgbuWCnsk7JR/qphasT4mPGSgUf1FeIWQN624Bfow5taoJgIFx/L/QXHyejTq4KJ03Ows6PeBmBGVfgrQDljmHQqutRsZrI/z32AoaDd5Nwujl+NmjJeCTkzyA5CsA0GNuDiHJYVvhZtvWA8hPY/slOSbwkBuWi7encZ9HE6vFqjQaWXSt6s2WhlBqUbh+/mq6mfvpbjiMx0gMherJqihXleHBDw0pt/w1LcTwIO2PV8eVwGOBCpqBg6vSwOQDzWUg6/FwkTAl+QVPuaNoBld5Fe6zBuoneLiDUDOndZ+sKnp67ZWyabXTdR3yup+U4CIkyqxlMNQu4Rq3BUdFrFyZutAX8WLLVzMpo6WfxGStPK/rR5jJ8fwuWBsGMFSo/8fBzE4pRXFY9WrM8RNrNe+u/muCMZk74Oh6JxxEyHrUn97VpV48Yk0oS+QVC45Ej3daRSG6cL4RYZiE8MeFWKAOUGpLqYCDuacgllssXVB1hnc7SKfg5zE0zEIct5zkOOLjP4u/bknkgxrx7Kq9Zh8DdvwpkbMSX3e7VDksF82Df0Hb75suNWL4Bp/M90tnWrHZwzqRUpGDXXCmnKkGlt45uvHWR3negmkPpG2BD5ZhFadc9/hluNKklRDNNAornuxvc3iUgQ5/91EB7UsFqe2yCVz/bzJ/BWYKaTiWnqFH9QAMjEJINvy33XF1qkd5/dJKuF/LMqjHWd/GxDg2mM1Dk5D8HDRT8iWeG8yATk53eCKeQ98i1R9841fTwyoTwW7v7VdKLHvgSkrbd3JjkksTZP4cAKr/RF5qeTSMtE26G9upCZ/nSKDU2OkcF6Z6hXPtxLDC4c5/+iGCUxb6uuMSFx3J4/9yqwOFnSXmhaFP+po6qJwITQd8Tj7gur5W88RZNffuPPCSWaNXoOKZEoHDIht5N/eTFdUJKnm5SAxSj0GmG+WCQgh+0gyyrhd/NEc1iM3D2dzoUn/lGqEivqOrOfMWlQ7w3nRkxNhro0Z7u2MMQ7VM25UPMV+a9Nf+pGO66mR/HkXbo2PGG4IeyT2HcNNLafH7ZGLjIxMAjogkDDWN0uYsMKWddj9+tLsOvBkeYLoay4NNSSQiyyYbZ3kB2vyBE1GfXNyn/cQBSspwRLlVEAn5q+jIshnfBHR8S3dUuZ6+6xycwI5rCMoOKVwCZGNVUJA1t/nbZPch5sKWisCHhn2ckV2L2qizD+KVs9xMPx2x5fslvAAhk32wPe+6CeA2dHZ5u2oKjv6R5XEks0Nl79+Ucmbz0Ekx3vneBY33lSg8+a/Q+cJCVPIm1rCNORb7CnY+ZIge0y8hG+v4zy7zTe1NiGrRGbjansGgWymVjZnHa7HiU6DyUJri/0DUVeHpx63HZMifpHXQ/vXQzuubIiSHjaNBJ+H98bK+MFL8ShFAXOcUUoBhHvCs+qEayvVAMHtnvg8e9MBimcrh9dSQeDz9d1ZeYYHAaUF8xp8cQNLPaqFAxTb2N+hvOi1RPE/M98k4ClcAiFMCIZ/VYHk5Ys1Vx73l5n8eo/yDKXZuf5LP9ZdDhMGo98RU3HLXSV1bKlSocMv1aRFxYAxfS4VG7E++QccpaBY/QeBcWNno83Mw8cTlSm+fUEoHCRTr650O15zfc/f59DORviXzf2ySlWkT//c2pQnRgxP9gVM9M49/OG9jCJmkvGC+yXkMmQ9n8Rxz5BAxL0UwCsVCqOhDEMNa1lQeRyZuQU4fMPqVJHQXJATIqVDMWHBN2B4H3DvCG9e2B2EgyM2Se3E+BA8S2qvksY6S4IMiisI7TrVPLg0j7YkMPIR9z9+LsmxI7euMEdLyWu5aLs2TMfgOKPW3vWqB6PdrQgJuvQYp6Ux1KDtN39FU8Ba8jMazfSHDwxtI3TeZZEBRF0XjPPv+47R6DUD0/O9WgIo+gpjOfmg3A0mBVJzh0RYiyIdWmcB15FvlNMwSGz/yXQv/rshMDkhmxnbCsiQ9+1CWviw9n7kfe9E7i/SQZtuAeuq9/gF7IYSx7J6SxpReOz6YDslcpSuAZIpTPlNbz+4hiVKaWAHJkS93Sug+OceEVO1vW0xeE4nxaSQ/HDy4fkF+QkESoSQcoSBu8N8iHYJIWYEhbqg+8w0EXqTb/DymxX1lVxgahkpL+YILq+/zkb/0gO8rfNHqGDa3SipIIx0FjhCM0FFtyxdUgYuA2+wYhrtVYmakCBBwX0SRRgk3HD53loMOKNLBZf6g8S6mHLYGUfYOY8dL5FoHLPQCAoCv5fsWyiZ6mdQPD0vZYGW6j0p0JhUeoMh0d9dB/uqtPcWWRWoDtbxOmXZ2PudzddN2oNDClkzD8Nz8KTkW0uHSV98fqjBx5EEkX9cTv/AfOTEx3aqdp2bveVjWEIDVHHp8cJj/+DyxsQIaJEU1XL9wefI+wKExhRPItVJpVT8IJNzQSz6+55Oauu+pbwRA8WYTWZ9sDk/F1b40xa+R3GSvPCO95iD1SSTg3reVQwkwaQbEO/e685ax5KkWPYr06qmgkV1ilHipiVmtIfielvDFCC0JhmVW7spRfPA8xul+XoLNf0L7159NHDpu1JCR14iZJzUAb5BRUZfSWsAhevEmvmLJGtGuMN1XZ/9tRt/gNnlQn7PWHE/MfRufsGO8LKR4PEDsKei4QCqXbiUSPTxXZo4yyPlAjgOunlTnlEAq+yMlgWGyZbFCM7VqFpZliNlhoJoKgEl5L9rvjXhU3XhSUS/hm3ANxfE8pE8uCpVT1+cYX7eWvdNmLBRJzgra2nmxGcex6zUXIRpOEdO/QL14dak97JHD4lX+AfHzvhojdSMjBQSqVforXd1UOLzgt4SuRYvFOutuu0eD2+mYgi/ATSALE7b9iBETequyDoTZoabqIV3wO1y7Es9CURSeXkeRurVhH/SV5D+Wsvq8o888ehcgZoXMO8YBbtW3ZOnn3wLqv4kCBeYkiBKEkUE7WA6UUyXn0LnMyxjc+vc60UBFW121npzzpoG1qKSygQ8pK24CSSdGVhf88NuWNbrgIjYSS40dpInpSuhwIMnT/tA9mASiChUDohkl08Bso4Y+WaBrIRS/0n6uTgmI45bkzAUq5OxLKQDrQX30byBzbyaniYYvO+Vd9l9NI4X0PwCXl5h8Wwjn2rCXgH9hjbDICjYcqSRIc2zVl+Fvge48xZVbcGq6AH5xeSfqR+PaHLMxxKV/Sq4NFHtQJAJVVF0srSA1L/Xs0Lf+55oFOnjnJAYFLaqCSGXVK5GIGnAcm14v/FSRFRFUc+sikx4VtsSJZfWOm8Gk/uT6nj76eKu4o2k0hPRAkaVtIOhkql9mlBHlJJf1ISUaLj/QpBqtWaDKHxhRDBjLb9TqSG8DAbq+ogEtkWaY6fA151NfpRLuiway666vKrRwlwXCy87HQ/L44XOERZlb+XeZqowcJVb4I2ciHpGeCfeovoNVMfTGuUoSwzvHmEV6lyyBfkLIaTTVvNFu9oROl6UWNVoNj+2pfdY2BvyMoGkQW0NWn0liFU6hKGbdYhxk5GdW1kJmSoKxWdg+5WN+coqzjS5YDBMTovHzI3sWFygticCU5r6GvY7jYAmmMUvnLD1tMUJn7M141o1JwUJcc/9gImW0duIbvGrBZOI3UAv2H3JHlM92+4HtrlcGe9JcnFVe5VhPgfzNgvzCc/P+Cwpi3iUh1j/olTKbDHxseJqmVlaT673QpVADiWWNQnLC98YAQGCO9T4ZoLPAtk6V0sxL4KvAp+EgnzsjJotS15lKaMzzFCP2sBoTfADYKgRFndD52KX4GxJsJmFG5JD86thcuSUYQi7+sU7fnBcJUsTqR/S+NARt3nuu8GsZwx0WIRnDiyhTztqXoyhshy0RkoyJ2rcviaSWSMWFL1QGTvxoqkRF+JmXESEC27ThaFOk2YqreUUnsObvL/ZZWYTN5EYrAy/BARpKLPMEdjvNfvs8EQ/pCwEDyMA70Gn4JITW+C6aYF5dXXWzwFLoykmsltJbsm9yv7KTHBeRYkVhAXIBZg78huYTCtqr8oouxBmPdkVUCkpVe3TU86599KaNjh0lCYKrCwhXRLZaa98DpVtPFI08NBNixY/00ab/BCKlBZq1dg35SCF+LPLqPocN1y4zhxGHtyCo6i4mRdWK5Z5c4i9f4JWuorDAe+7fkRnPMXde7yLbm7swjiDIOoxg/yQQTKElU6anOZrb6SLXzUeZxRIpBYOY3nDakbVfmyEoGRP9riFa194IGHsLwWeMh5/gJIzsPrE/3HV50gVVk0vsPZFoQQDouRjba1vSR5EoCQvdP4hkX+BeQMFhJ5y4hzJ0gm+rlnttjkD9NguAQis37aEp7X0BCMSQbY2P80NZPtvxS840fk9xbjNspl31HdmzHAxQK/ETrw5VsaITENCI7vAWreW4/aNoyjvaM9aoCaPYtyC+DnMoOGVOQZIHaCyxr2v57NbR9cRob1mkgrrWrttUwU2cCGwj3BTcpLkWiUrKFJXmg8TOU50vWqhwlOO9arqHkrKV5D4uhTtfwRl4AW39IAxSx47e0Bv4rJesIK8lkYrb8uSh8czTj/ddsmOW/1fwfKRuN/DGgZhAb5OkkUIGZA8+WG4a2l1dMYymVvTQFAFQwXwbTWVhCMuhWuQiOSRUWgVgw8ftUWc7enVFREhH1bPOP8UrKVnGKo+RVtNblcyLYyrL/47iWJ6Hav3hhAmiwNjyXwrymciWPCGMOHSHcetrJ2eccKfK/joF7ByDDH4zBKPBYsEOH8NXkDRMv/D/d3o/AXv9RZX8MNWUBgnW+rq9JQNItL2Ng2uP2hoKrmtBZQv2flqWwPrHFw6yMGQ7fKzeNaMirJvC9r5FnCyb1JpP+nNxCFWUc7jAY0z87P3y490OQiaUIxkrqrz4LFnJNVpEnZyuipXNJ21VjL1gTlPgn92nchQWjM7JoxPTrMIGHSZ0JnG+96x+VjkI9uve9wbOMYvK/UDOF+T9sdBOoOXZi0+Qj9cys3sei8dxERcJevwzh5ByB+tVfbM/KhinpB8yRkLldb6uZpszczIqec9NzF0fF8j+t4K8eGxcuON/fC2bEZLN4duUkTITUiScKiVQ0qZ8CEQHfcvFeW7+WZ0/84UEPzrD0kN/dMKe8l+a1CqMcW7QiAbTBAYkBMGrsU0JOXi6oy3y7275G/bo8Vlib3mJC7FHIAWS1XbmS+dZPe0GmikqNWWjCMuuJkpRleFt0bEd3vex/sNAaW0GNylGap5/TApdN0ian8gtU1jiTz8vLZZSfHnoPCpTOmA+VlMWqcHytD1HM4gvuS0slDN8i/9emX89O1VlUY7wMEkUsAQApyxbu405n0LnST8MUltLCbKGsTM6Fary2z65eh1P1GkSLGdTmJwCAJxtRrIZdGRWF3tB0992EYZ2Q62KQYxFv2wMLZumAnymhdxDAApRqsC6kU7AorZu+nUkJB6Z7zZ2o0avQz43yBaGWWkFBwUgspG/XSaEr47S6O1GzISHeRL792N26adh40uINZUEQj9eb1JUMsZLWukkSLWsUNHS3T80XN+Poz4Val0KN/yLcwuz8NC2E0Ji00E0HoeMYMf3zkxDeWHtSk7IRwdjU9G1ou31u4bi3qbQsCEzdOMaBWdwCWpFwKZjibZVSS0LM7knYY9LHrW9RMHCDc2B58PJWYYUZKlpIcZCUCYRp0aeVMf0lB7lZlKpRVLfO5S5EJ8tvUqq4iIgLZ3jb08dd7qLCsXBJEIpvBfb/r0ba72LolAAPNZpJA2IXPiqWT/cWNrZwG7gd+haydv1KksGhb0olyf+6Gdx5d5H5F66RBbolPb881cbO6Ns9byGtH4Gx80aTd7bWfIhx/duXa5MeZ5+nG2iCAoUlI/vTsxGCd+Jm8WS4g8/eyUVO8XbqbVoFh2SXaBb81Y/6405Gy7WhIfh25RlAGX5lOfCUH9g+aOEAXEVCJ+Px8VYIXjdS/6v+Ma+RncFayiEJaBGjY5sEhJzIiqYvgsElEJWL1bh5DnYOFo8n35lrieKmF2ojLU46u0210vTUUaxf6uKlBxIm/J7R21Ki2Ce6wCUORExX5acKN1Aqx8Hl5BFT95q+4AEUBXYoQc7pfrLbwRTDKpep3jauRHx1zTtI5+HgB25tTF+a+id1Jj8qn5/yBjP+OkRKSwpO82mfGKhdwSuWLPP6oLB5lPG5TCbKMnL7DP/RBDj6qLEhPKtEzzMnoLyBt1VQ7jEwp5jMSxpbTYPHyyd31IcnDGh/H1N1ov10lKkniSx+5ysNmufkUbW5o9/SGpat+T0G1aSaqzxxeUDsRSqaHIB74O8NA0B2fnTpbcadI4xsPwPd4OwVtMqlvo/tMtKnYmwgFmQ+MXXQYkRGhS6DLgooJhrDyQjwCQiylth2/mLCeg80JWxx4TNMog0xx6TQ0gExpQtpdKV/OgEURgFjISbDiD879MhzZCQC3oDs5xb5oFWRo/vgxRipXW0o1z9l2hPzyciaLPk2c/7IP3WP+unrtTYm+g0zCgdrjLbjpPloeYR0KbxnMS0tQrDRbmiBCtM/MabPHn3Y/RyIIurxqodZUx0hH4GYUpcdYWA/Xl1B7sfWrwSV92JOzBdZ0lGhh4VG6D1/8VnJFYNnyeYrw2t+U5klwTWD0OVmynZ6kpxvZEk6Keu2aNSrHuRj/v+qgOLY3kmLGXNwZWnlqYqz8HzBTKfnYul5Q5kiCzo6q4cljPzqudIsfSymB0xwN6+rxzVr8p1ZPVMGVx3+YVymK0MLpv3TCdlIItrIGP50+dhW27ZRlfIQFjldTk+4YIoeilh2TtGHRMG0mvUTJdMpxVKznXI0wq8aTjOVNoaEn8Vn+Sg0Bwl42unWb8UpgeMxQ75mYSf6cDXumrwX7hKcnLAiQswMsMKVqoYwZaabz2FQriqsZsPd00z/1XvIoWHaP9/2OOdxQtzuLDJ9c+asll56FMWGsR8Bti6EmTM6dYVn0KCzC0Ypklqn4B/Ii0sTSffnPsJ99DF0ML3u1fpYDBz4ySuNoUmM2OMQHXsSSw+CTzYNy0tFwn2GYmZ7WVu5SMFMYwnl5NYPCoj1M9K1Sa8WViUvi9PlZnHz4UhM4wnepxM1CkAbBuHTAbWEBe91iDyKE5ZQtaXFOtwQZp3qkQp8NzuMsBC/Ercu9iZsbAWkkAFe1HDr7vxqbkZZF9P5UKuKtSXDJveuEAeYCm01uFw/Fv2LZUaR5rPxyhZRh/McC2+Hg/G2/p+BX8i8+JYNcEkVi5FcNw3vNhL2dS710YBciU4ySBbhCZVyUtzsFmYtNO6flh+hqBZbZq9Ds75thDyjpj6499uh3t6lwsIZ42ngPrWAzPuVtULIZakpB0/D4JJtq76dvATWq3nNLBu0uVohg2YzhVrFsyY72hUPXPlI7cceGk4ImxfZyDjWLqFoGvbsn/qgmcgN6y3gtZT3m3Di6bly2aj797ibWDvw8NLXA4vFC2qTh0o89yp1fsgHIQlUiojwmd2dBTAxOe6Y3WXZoO+xXQK50mZXEwfW7QZo295bfEVmvOGiKrlyNHqTyM/5wjnTOIC67xzouyLSMrQ+98gFwH38WtGxHhbXzyRTltVN9eavnjzZ2DME13iH6dMXWaDyV2BuScirLhF4SPniS0bjnJWxoBmE3ZY9xEJWKZejuSfm7++eW94Kp+Pyl43jbgf4hywbsrCpSM6jSXqexApaFFmlS2R9MVAFeqoS33fdAourNIvls9NrwxahBdb/BlrDtdrIx5QnirdhC4f6GQHSUgWh0uiwb5ROKPbnBPjz0ZfvXR5QPRctiiFizd75aAAVU9zAFMQ6TPnfX/TiKicDEcZPre1r+MjxGgWFxKHpHll5NWeSc+uNNRx4m7wNrj/SYp+1+H/prRFroxina5LXMjir2YcAAxHfoPCExw5W3tt24eRRh1ubX2uiTInFYVasZtdruo3ZfIShFbf7lnrbCsnLgwNFBJMF2cYGktTsmoaIcLs7wKXIe1Y5XnU1buMaVl3C/F6/VQOUBkhvbkWPqTaIUqGNPZ0LsB1AxZvEJ5ZS35/gFiuBxdXHha4s2cdKn6JHH4xTsWpMj12KX4eEfvk1CLIF1hQ2qHJPKu+Tj0CnXI0gakSOX7MQNrFSEKpkScOgxyYrMN5Y6ER+BsP7R/eET4EUqUgVRqtB0ZE07oDwpkt8TrHfMUEoxo7FEMrwyTWiUikQIORAXI9VvNru2Y/L4odDnmT/uI3Jc7qhNTZCXG/B1y9mirEA4Kiyny8Dl10MFJr9jMqLPnOaWyTuAGfAw/X4ExWg/afiROueGMiGjiiDIGm2ajgMkL/jJw0Ici6yFCKBChy+7TlkX74wm79CjtedpTLbgzXwLyL1rKSNr+VeSavlE8T5IaN26kJDYSWvWhhZoGl8c91gqVd3XJTW7libAoLrHoux68WD17YxANwsmGEOq0UiJzGNZD31tAv5z+zBDXmvR1zppiYSe571BBfOnJW+FHlRj4MyXusVfnkMnYkHwxbZbdTMIjf5K/uEOJslsWzsxPkJbzHoaGmQ91rAFiygyGT6SRsuDykbjVk0pAbpi1ISejeX3ZLcWypeCZrE95CukSX74Vp3gTo+GO9Fp+is95+JFSjbPMbRtqD8ID5y/lLmj1jGLRX8AqAa/kKPhOAgV9EiByMcOM2m5AFod/cFz+BFFvoC+EBG8tU6+jot6cw7ZfdOsrUrhzeO3QKOBKJy0swLx2B38XiLRuB4dvM8ZyQrMmNOgYR1IFE1cXJwj+iV561/1IwSHsJZ0AyK1g42FGMQxIfDQzECoVvXXr8KIBIoGDwu1AXdK/hluOnI0uGRd3DElyonOt4eryhTPNZSjeSYrUPlxm3rnrIPAm6CUDO0HrC+L+KB16Sj2pZaBT3gDisnm7f0ouNW9ZxSh1h5jJcDwC+Av0zQhBqFLe8U9JjaldOnBZ3JqaCupR217qdX51u/Mx1YnRXkXXQt7cXbOqrm/FDfSQQVhzvpmhZnEBvN0LJSWz0hNL+vgixxhrwUDNV/kQlARTr17jPl84easzidIJNGm4rq8tApI3/N+A57nQ4FbS9DYKX1nOHazPfYNuRDKkAPcSGAfjZgpYz3+NEwTwbMTJlCU4v2woSSKqRens8zIW9gvt0UhrJseGvUW9EYEIVH4O78KlhP5Hh7fBs5yFf9gR7KTkrDuKMX2OWg5kyXJGywFqnuVLS427wM0ASKQad0+Zu0AdkdEFFwzKNIolB6LPQs+1XWihYst8w2p1iaNPgZyYB7TCoFWlQTLZyQxdo4SXUXtWJNHCJUByx3FS5dSxM6/5QkCulAgekKwwOuw7bIjnyO7FuqwMjaKXWjMGol7w2OeNFSjSxb9WqzxxJxcRuoHt3EKhR8tUxRJ/BG6BMwt3Zue5rakMtGk3D05frzPHPqzd1bJ5Gh8zoJfLz8IId7H4ikP7zoNEEeZ47VCxiTpMyQ9g3LuWEUxK0Y4SJP6cglbVNhSuZSG6fc3Mie8MhnnsEtyioKBYbVswhcQzP9N7NgNT7c5SBMruH6dmGXGEAlTRYeFMuKBW30WtDbDNSL0N63Eqc59a5rP6W8GZoGqkmBOrTHK4x2NPyRz+bvQ2yv7a0SpfQn30HgvJdOdsDFO+/huPojUH9J+Z8GCu8kwa7duH2Xvie5ioHpeVBRNAUOeZOnc4B3aBNyOocB+11MsOiEQL6C2s6xlVhJMSIeDl4fRkL6IjEbGklYbVfItkX62I2p1fCEoWl58opnXuJrC+8ZSLELJMmqFfzlDEchHY+7eJTj0WfmSVuz7NM5wULZfL6LcioFIieWqDl4MQiwpx4pbkJlsKYbL77s+Sfdn+gptiF+QV1RiMClE7IiV3frEh7aFYTly1e21M/bhjE9n3SD5SXdSountjyTLzSXQWVi52mvuWVxRZEhKxQwF63etAwP3MpNhRz2oJU+aYWHisSEMp00d5kJrmlpkKSMb0AgZ0SFysuMb0tUAyetrc89nqpXEs/9ZTXzy8IFur5Tk03mNHT39N4yVgmTURVbKUZ9qI41KczppSB84kC5I0XXQ2EEmdu1aEBv5vwu7WFCJ4IJmL1ldquuSMoRISzDQ9+fvxrMRr0Nt4O880WVDTT5w566czJw2PVqQqWyqh9s6PW2zLReeuNSYxfMro7BtHjM7oxXFKrokaN/JyayXShUrl2OHPeW11oHnazw+V6/vfCHHWa73hJBvaSxPa4KLoATJSYK5jPkrJbAd7Cb4HqvOPgbtj7XzRFEg4dtQYHFicGxz1TMHHl+ZJ0bcHJDhe3gVVqi9ZbK5PXk10ZkOAYHztALcy0Nnm3OKn1tdvXMq3cv/GVAgzFrPjkkyYRPBoYr7pzLlXdnwFiLzlz+SCnhZuxFUfWzjAc8kzGnKjLI+X4goJcBeILtPriPYCvIFGjAoujwbXhhW3l6Wlnen+K9g8aBNRpA+BudBGj72F+s0glIkrKcpZDc5dLxqjs1qNzfmG4jbDzWvtk30WsBgUIfBoPRg40k9Qd4IVGRMgpCUyj8cFdKNpXlUNiLFDJX2JVURCbyt8EjobZSVrWhHhVNZuEedJzqeStWbsivkwcYx7VCFjYBleEVUvicYoQU0VT4OB0S0wZnKqI4/1PyLJRgPRTbq25zwAYYAquaytNzgzfBCqbAdsm4ZjCcv4p9PXIgTvuFWrIwbiq4fpsHiVPX86z0gSZ8Fat5nj6kBweZVwQ7sJVEvAa8+sS/4FtHVMQnNVsKXlkrIfWeSr4zBT2CfpBWqzJ84DMqXndOcM7EVuxaATlKt8H9/wSd8bMpEcT6xM/mlPFSINqccWC5GdXGMRj1/oDps1IVEARPm7JVTPSvOtSutj7/7kf/YS9SSc2Blj/OcgJ80mSDP12o+qPPAz2OoOzgIph80U7jpjKYwWx+WmtVBGM5IjyAy4J2NCpezqqVv4nxjd0FbthFjtFLctX2l5bDJ8HKyrOGBlACdh1FoMevSbq94bN2T9g/WxLjMCR33yMgiqqGyid7Kq4eZXN7fcs6FO27A1meJrwqaLq7YHkFCK9jXBuXI1/pBACW3tZsSRptVQTBr3OGdFGKtifD19tiIfKAbuwQID24xSrGM8aIP2k5a8SjWyaimUXpOH4+1c2bD8nf8kItdL9ehw/0W/BceD9/rbZ7l/t9o9+lVYm656I7LigKYw6QHPJJxN62Jmx3uV0eyKU6n8U0HPHep3M8BWJ1Uaf0+RQlcT/xo9Mc+MjZjLwy2ThT2PpVxck/mHJ3iYw4DBQf6mXgKOMnEDNsbiAfg410t6EiIADu3GnftV0TZSO1sY4EQiLHGjRnqto8oBSOvS9qLcD+/Bm+F3ZajTdwcvtO+j2vVo4dTv8wMdAtlUbdbrdcuawQSCZ6sxwtbP8i8LG2CEKbsYuIKd5Q6HdYeE3ugU7Q5bx3UtsTOgZSLJq5TSfbGFrm1QN3Sw9JuzYzb/4CMr/KSeLyMQVRoZD71NgyNLLFUQqf0/P5YcEakXsqordjlXCvOTNnSdCy3C3r1SByoFVZZkWNAT7dsaj+/7i0RThXkPTt4XPIJW9YmKDTULGFHi/x5M4QOSIC1vRTQU/PUNm7RElaw5j9jNz8VJSIb+5AWf2X0NaUHt5Df2MDeKieC08oC+LnsibhctsMRoD+5LyOoTD/EmC9lN6hrA4/rIZif15n71+oIMpqhhAbiF/7N6JZZFHN8D8F6NiRODnKyKdZOVzokgVyHQNkybXEJAUHGXTPDfxTaph52MxRytAtWvVcauj62JzpucqI3fgfanWbawxw5pHE9xmOd0wJQ+ptFku28iMWLhzjNY+HaOtxxE4eNrCshPEqhcNVRe1keJ7TUohNssRzxhrgg705776cDECIc2tNRTALhjOTz+A/Y0dG+ZpDRltq092dJyZfHbMjhsRUqghEFYj1dlj7kdF74EqtG/b6vVr+/ZGfcQxespTcRfZO9imXMgRjY6R4x91tk6Txz9YhdTKCBBT9QrkkYm1hjElV8rH9xeTlDd+krVp/xzl/rTI1WEWMd3/AsvhrzLG+/aT3ZUTEPg6cRRX34knnvym5eFeNuFAUghTquYfwQYMGe5C+rN7ySc9JHwwKl0PNqwp3xvL4SS1UehW8/DcMleFE8RmhyPob8lre3unAz8wEyYQJgfst3bNyFXrUsqM9LyplOd2qgYpAg3hXnB64JBxam7mjxVir9Ukr6fNY+SEMEXu6ohUDjPsoTju7msWl9J4hoefnc76+ajB4iQiUH4/B60EoJZ3qw8TY3UFXr3aNKGhh7EsQIk1S26cg3lqPyD/mKcDBcqYylLq1bCGWmW2JX172XaDnI0Kc84f2l7Hp3OrAbHrEM1MZhsbM1a4LNeE/RBOWrBiWiX8yuAW43wcVp4Sxwaf8WbEKNCmrAy8r4KKWrDaxEMysa8kkWR9CAjW8xYuNVav8kpkcZKzWs4ig3z6/M/8tfrfXdKkZ6P7wcibmjFeAiivwAJTuZSocuoFJvcT57Dcd484qqLa8phfy1TZ6i7/dSXKIYVS27V0U113tRpAewlxelFR/xqNbGYD/IF1s6t+SsizrDaIndNGhLanr7w4Nu53GhPPJ815O3tWr+9Vb32JbYU3yzGlUq69BtvI3iuBxFaU9+dgBbhlzZUMVv00kvXVicgogGYVpXsnhekd8NuqptQo9/QyeyJdU4930Fk32DgbZMmJOH5075PB7VufhWucOIGZYrCfI7EXLn+JPQ4gyiX9ZfIKMBHsLb4U2kv5khmNHDZxkvv0O6jedCegoZSbltUxs5654sx1lQ2fFIpHb47vDZgCo0w22Y4fLzkZlUHmp1/wEn/HLbOOwbVBHK7jy14NSjsQ1QSWWqmdb7+KTAICND31lJd6NsE1pm1rxMETg4CUuL7qKlzTrSR5TbS5QZ1ZjzwrQ4uyw2arM8F2VY/1Ekih7zde7VkyeftoTZDuNu066G2n/QCQ/LxYyZXHP+gWcgzLkA0qu0CwsY1hcFh4LpDCLfk1luDVx0wnZJg1nKGx+DQkFt1OW4EtRLMg71T/NR8cble4V8OmJ2rFm6esXsvfSzIvmESls0MU7F5TNUW25liMod6SsL4u8b8wcBySgfH3WQzkKIl/cNFAwLPd9cYPtslzRZ548TZL1nL6kmbHkelT6KHtv0uf5AzOSZpCYoOKzFs6twaDTbv4+ePt4pgb78/FRqNCQI/wnbUeIl+zXcaS/MB4wsbTLyqx2VHkDn0/IcJ3dvE381NrfhF7t4B1w5fJEMtVKeBcKmUv+VtYwQFNnz7vwTHYHipWuaGPWPo0M6glXHjL6szEu2uAlULxElHN8shol05NX6lp8OSCBv08feORCQ/Ox2EqX8UPzCPTFd4gCFcFiJ5V2xftHF8HY3+oibHBn1jBqn6idk34W9HCATAfrB4x9piZeHvCEABszhjamDYb7Q1QOTbGlyGShuneQMdNga+I3dMvw4vRggrHQpv4KTjUoXiMxwjc8vzqxwKjy7iGxB5BP8jK3Ty3lGBsytnsPAo+jV1QHTtSnm6diTWFgK4ajZ3+tibfHK59JEYC2Ym8AdsUkN3ZyBe2ZaXBpWiGvtfcWrLDberiSqo7S1KvaVgswM7JJzbTz51AzbS4ZTQNbZMg0srElQB0tAxzPXd2kT17oaB+mZaPcLKlMfYe/0OM2DCVSBdOXu56oGQaIE9b+Q7XLBedp0LbHrOx9wL6ZGzoiZZLaKSjD30Ys73sgIzxbTAC0O8hCJxHsWJ+OA67lW5DBESco+vEwheg+c5cNEYZe2tL2DZxhpi5MPzG5sZAdZ3SC+qEYGcuORf1ysbinMYtzlNry/I8h7DNP5J3v/cHQo6dToY2EM+U55P5lFu5W0/f0ru6EiFnip7jabxlnwvBJx3koe2u6Jn/XYYCqWYPBd0ZtM8cknMxerwXXLFaGw9EpyECVkaIE2D2wxGggiycWufAO51YGZDcRtq9vMNzyCbzV8R2R1R4HyVHLkkbEeBgTObI4OJdqlSrgCuI3Bh4uBl+twhXtFdDrMQxnXLOP4zK8a9/qBZEnC91QPx6att0316z0CJGNq/5V26kFeiKh4efRr66iTCwjDvdJ6qYeQn7T/XkTYtuM1Qt7l602GBLxgBEtHZhyC5XKKt48cl5/ly3xOtchJ5XeZXKU1czPeOb2oBbA7fC4NWf8rEftDLYY9nAfosmTivVUia9nBHcRhDoDlwsYU0dZG3Riovu97CGCefSiujAB9FStGpk6qmlDgGoUme5zlXYzY3Q+3qqUkx77iu8QRiPbVvTKGNVgUkKElSFHMRDq5wSSFFIne11BVWN2a3URcG43mjnpX6sPEsnBcjfh0dIfAfW4ZF2BM0fGKNBKdivp17fKgidGWTDWfFH6iOPbV84tfVmAoFwl07m8JuZqnEzmf4yBMYwVu7dv5viO+6kn2lO2x7nWTCmfvM8QlA9blVbOiCDYwzuE8HkCmWCVF36xUSM/C9POd8wZ/S9HiV7Cc1uSYMadSwBcaN3RqsLzLw49lp/nIDGqnBTX9eK91zPPe6ADOT4wp8K+gYHxa21E7di0jEmij9mPUeGEl4+wBy8nRfkwkxI2XPNNHFKBOdXFpMRuc6FHHm1cAAUxyluBTg8UyeKBDqpBBdIGXfgp76baGJPH4gyTD2kz2QETIczjsCdqNfV4TQPISOsLIS+UL3aBCCddT6NRZLwE8Zma/J4VS5p1py4aiM8wq1AtJa6Bd7jVZYlBP5GwnFhqpXl7pJF9iZ5x7CYNog8ENWuOuydJAiSxBNuZKGRi0xIAhM32lVCajU1OYu6pj4gO7r4M0VJnRUQt91yw5Odq2TEF2C/5t8GB4GGkOwghvXbYjQt3qxjOpcGU//Mjl472bw7buGMcAmPWmShE3zcONvRRcAdYY4Vmbu7K8wUU4ppP9igEZrGFX2+K+KXQujDHYSjnKXVuZIEW6e7bwWPqSwplE0JPxQSHmX1n7lFE5CtXrdahIbYcL+laNB87ysLciPVecQ68qp7Vz91FVYIiFrTC+FumTpQ0UwPaczqYargo7q6d5m+5yF15JA9CUgwnpbtFVEMZYcbzWnmNgYBE/xBNrimpa42WD8UoLNXNyC/Hi1SyixPog37H91QOsuEacs5jtYsYRpIOHQ4FsCogC1C4feVw7elvhPcJqzAoZlnH1mDD4mrWjVmdwa0hDAWlDlBNswlVdGBvbcXVSYmxCrx4NAbXdX8Gzq9x+ICa7Wcw6wqeBtclJNaNQQWwPBqTj60MUJimLBcfG6smIny9wQeHRdhYW3eyh++JYHh2LRBqOpWYJfN/VJTnuO/aX4FenusfgJTqVHJYrJs3zsJ7N2W00O9x1ZpY3stUXw2UBuWFJjZoyObk9YZg+0u55PdCpL5LVKVOqlXFJmuLiGRKqEbbhvO2oehSxnlFUVPw7oZQG17TCNeMVwmvuNkN4xM3KWt0bkAXI/m4+Bj5ltbghpyK45q3mh20a5KGoRQL/GPxNFPLwvWtUxCQiZtLaHU6T1OHs2rKgKz9QXVs29Tg53biXMQLBdAQLpIapWjRrVLe53t61wraTTmZeK+os/J13IrTIigZ7ShNBqHsjyNgqi7W0kxaq+UAtF3fQKTSQPT36LMq6DvlbML0Zw5rs239XsGHkxg6clkvFB85ym8FwZq0WkX8JJXKf97on2VTdWG1twH8IbvizeqNhPMSEjyaVRsVPJnvU/zBCIyiJtFhyWQxks97gzX3dAehmnIA3YAloIWpupwlr9JAdg1xd7klqrseTOQVF2SGODLtPlYg55zqGsk1BuunJYCrvnMSK/mqktjpAe68DKcAX+3v1hbp3JQKEHLGPTk66HW8lrpZJ2VK1gSdGecLi3uX1npXxBCJCMTQOqGRdV+F2JSmFq/7K85JPkJ5h60CeWWBVCwNWU04SCtpPjQZKmUmA+jQHN1cg+4/l4GvhnxchxIZudh4D6ED7B67NHacnNJt1QdcS+DgV4gZiBUer30zmsE3WCjX5rXQJDO0CSHSr3fV9XemLUHeHiIe18QcQ4JwT4J/uaat3iGVS58UUywiiBTUxn2Uv6F+kZn001LGhSjCtC91tiOBoFGBJQB/gJgjcZCSNl9r1X3mAcNAT1SChXKjWrGNHAF+tehCLmSP4CWK4cE6JEaAUQrHbjHrtSan5QkmPl4XsHn9BqW1aAVGZQpBrYvUBxowmiEw2KMxd5501+SKWOKrvk7OgLl0pn0OZN4VKfO/3P2cD/iwLNYvEMUWECHxCMfQ8taDKu4KLI9q9ha8ZtcykEcYNfG8K2DdNwQ2M/ADmKZQvKLgDUu3+Ui0otdCzgpmQuahvdSo0z+PkVNiIIIQu8lYaos/iPlmHhLWMfBy70KS1RyJahOTLbz0VsHPaz3+B8HYAbrp84FU3skEFBRcbDzWk6FnsESkEsD7uCaetHcCjeLyEIpxK9OZ790M53oNH2V4G2eCU2XVQ/I4mTkWSeL7em7JCBSIyzpvZHRQPG08zWGcJ767g6YB051IBlxEdUBabCP/uHG+ZXcq+UYg/alv2eaZlhlDLmH2A6P4WoaQ6ExJip5w6ktYtd6fLJRULfADpUsSWsrKfvRA5SUQ6a0rI21IZ/KVrNWDGKS42101zyu26d3yUI88CtmdqOZMS+McTWTk+fSgOvoYdiXSPb+kHpotnPsZTIzRNSpYanSlgl4T1XTjDelyYY7OAfAex8aPVRi5f0PzsmQu5ZEOsZd38oRorLgc36hyr1zFj31yMOAzCRkEs0JNAbXhJmkD19B0Cc6MTnZzq4u64Vd4Ixgd+MK26mrJxlmZUD9VCEINEiD6UTNRfumldC+xAWTrWkyXqUYw/YS/gUtJ/fhciWaAKG4i3s9QN5n+LKC7H1i3k6xXHLHOr2gtlkPxj+J8HhXhtBdwZO00zAtTZXjFkt6GLBa3oEaY0fWwSu9ZVhmT68xMEJGrJPLQFp4S3twARM6vLC9ESu8Yyyzhwt30MfnAA2SK4OxqW9iaZ0OIotwxXw5ah5cSkBFv2OguXl34/ZPrnqYLnUu9lLZKeB0vyAewzRZ12wICaPygl2Nh6JNmkQJVCkVqG92MF5rdUky1Bi9g0L08nI+qucCctC26mNZEwrQBbBuvn3az0vB07v5cVE2qy3jfOXIcfMPfsQlmI11PTOmIlg9+FoaX63DZ3FSw5KAI+SUs1FuVpwnpSYx+oIDpdO0uCIkZi9aMNsqfgbU85Ivf7MaIo5a73L1Aosl+mJ6CDrzu66GI31afWRrvikYPB+28P+fQI5163ncoEtFkAbW4o2Y4NG5I093HelxGMy1Y+FgBMf5Sc7GGSpcdtQRbR9syc9iOdHEyosU0t88tQxOY6RfGRBK2z3bFdfgtBaONrASVIPAtWx+UmWUgk90RddhPcYBkACi212gBEBFu9FbmpJFC7NPA125wRaI2GVYX46qHWgIpNCA7/nSllO2m9IDO+oYHvGH3zCgXJQEKtbdJoT9QGXPqljv2MVuyUkIwJJBetsmRzE0ycNtWT4hCO+qb+gRLgN9q3mqcREbv+txjYUnqFLBE5BVKgm91o3ySnhjb4YEsoCBVxwYuZubLqhfL1CXL3Rvi8Z2mKXtKYNhmoezW+y2qvh14AP1ieLhliH3b3DIERj2Asj+FvfjjY6hf1TSBurah+gAsPeIz01jYNQK/VMPsaI008evSD4TIGFpQUehr7RLJMzAEio5SxV3AS2yB8+OQ7Zg+iBMdkFDjuk7jYOY+VmBvLJLLIs81ISBzn/bBibeqgvQUWyIEc3xcFQJPkVuuu8TIaLWRti0b5R5lD92iTfWjasTlSzpT3kgCN3Mm/Yff619x3tUYqAM0tuvUqpIIAxeIwHnkCx/LB4ZVhPfWIXvR+k3tWZdgELOxS9NqncLjtVDi2mXnPSX3T7WV/8WFUJFPm/7At6ZUMIPbEp/ioFRs62Lq4iCwTrl28R3tJ8h5rBJpTiqoBvmgKCmluvOr+Rufj+1xkXmTxP+WbvjI7WoAjssOy95wTao7rgxY/KFBwv9Eu17qa9i0hNnWQB+vvg01ErmvHoR0Zx7TQrDKDvLVkw9LWLdRbA+tDZdbEu6C1MROFW4Wf2WbhcFvfe/ItrgEAvcZfs9QbPYww4TMu27Znx22iQp90K7DLmF+wPEhK3czZiUiL4lDwU6gu+DEiirTQaOF66vb+ZuSGrz6eTXQfhWLDkYOnQm/y1Q5fdyJKz5nBjG/Z8/XTKwh612FgwFHx6FKCpeMgq6PV/GDBNqLz295vB+OQdQGaDhtddytQI5Fst55m6Uqoigd/TzYu40kUz3UF26SKTOiYa8oKh7ANRv0jRJcJ2pdnMYlWhKy/O+qnCawoGmNC5i0/PqqZDMuyz6Lvg/ZNBuTz9ku08rdin2E6JjsWiAspfWjWVUyTbRs5ZMWF6BduoumfSYgH3OfNeHWtgBYwY+5I3l1s4Rll8xmera8rUDZ8QXLoH3OWPnHlr3I8nLIviqEOYLumcJEu3MdREKhEDlwxQ59scaS9R/bK2K3L9vhemGzwggGpDe1Av4vo47c0iUxn7ziKSUfHoCRd7k49E5BfskjQTw85kCvoM77yK+GNDIgHlkaBQhnsVvosKXrNPZbTr9V99d4s3l5/o+LU+JvtLV/kNK4AirfjKsdnlcxFZ0Dt24iq5CtYm6v2tgQVmGOkED/TzaUYLneUD7iey9bzezm0BQHZ4MAlmB0v0/6hXXo/DcRjoNbS40Zal2c+T4X94q83jURxnhrATyC0b5q7RcIeS7aDqbrTy5S0zfCjPmtvGZgpB3EfCYyXpaS69dhJxdI9sC41Wd7vA14RSQb6/z/n4QBdCggL8o4QCG0XAvqMkHZtHSczxjBv+/hpcBA3t5S304Ns3bXBa/hJazBFxZ1Nxj+kMMOprgicue5YHR/iKAtV3aPdP0dxDr1X7zoy/0g6bXTYWuzbkZmZkRzFwP+E4kogiBXplEs4Qqod5LIIyC2c5ooybG/ibHhkLWab81Hvi3PxYBR3hXdJhMU0DV2asBF6Bv6WIg1jyMArStj4gAP2sEXDtQwmjBScSTf/V8KbqYS5u0I6fcFfo7wjNqnu8+0rYf2EGmWo2CYN2+e9BWT98iv4/CWOW86GtN/PYpKHqGl3wtIwMQ3q07pIcDoBwksPBM5EKNJGQe6RjfbjJkueATCv7Wp8nWljDBasdTv1SBtMBPGfRmw8Y7C6/+TKn5z5MMVzMEth8XBrAsprg/UFyKhWH3zVLaVJGdAmKOcz8KESORAcRlA9d9itlvQgPpIo0IoAtYwuNC6xg/++HL8jxP32NzdFlu1moJsuqr8fVGV5UZdzA0T7mz6X/bS7/4I7/cc0CFHuxVTpW90vGf1gA1mDRWfyR0u1gpXrXKvyZItL1yvT0PnmQICKPqpkNaF0plU3f4SIjjk4viXLy3YrWixlHAX4gk7IarkYlx797Cd5cp6h/1zyrZipFsYn6PRpYWWC+1twbI02nxkChFz7Ye35dLpU6/J073P7b/v8PQtImsvkOf1zwP4NPt4qZMbXWya3+iG3OKjo4IVMsHfvAm10YnvojT8NmZUXTFw9eEOQroIt4YMCGRRCtz6IkOWpz9Qd19GiesvMPwwxQzLm5/0sSmTZlT1L3OBBrnOrBXcH50m9kOwxr2yLT/pz1TVo4Ag6iEie7zzEVxnWI89jNZXuWX7OytubRbL1YLEGuRqLzpo8Mb6/Efd1oR835bKzEj/fFVujaC8f2W8HCM0VHvJ7/tZhAJqT3XS4tJ0qc4nrEfLYGEzpAZcxW94tQxuk6gfVtTau4CdCKeV+TPgn5qCixxWeXMQGhcrAN67yG2ntI5mQ3piBfP0pPDu2EzT68c3jszHwlyVggch+G1x2nyajssXkQrTy8ymm4HUgUhY/NQMnU8GmlP+KG7XJE1kah8MzPAYw6xOClqgSkVtqof40LRcHfo/QbH4Otqo5Ew3ZWqP+JH9RzPISNUKfWONKQM4cEG1hFWNqSAJ8y33NpwQKScYbCb788z2/DYdYrsrgINJu3bKqbgL0HulXs4657RaqwPaAOv94RJO+QciLOrOdQFvBeppAj70i318QVd/2RXGDEhj33cb+U/2a/3dhXu6LDTysN11gvjYRaWAoTnCE8x2jj0opjoYKulKc0yBZHcupttha0JnA3sg6NgigiUD4nnnye7nvpC7jJYWrkUacu3TDRr4dhw+T3Rxz/OHo+Dz5lyrHRMDnrS+vAbtLjEZrCQaoOK434y6TFAUqIxtRdm0HpL0lmBHBgNA5XZn+9pDuN5af8p52dPy+3r832I+yo/JWJtT/TlwZOG5tSfSCFlj2j8MR+o7LGfwXlp94wAg4CDZsQAdW1IZ4EwC/7pwJsgwHXe+ht2pted/WVsv864+zaCUAoVzE6ZYP/LIlwNG/dFVnpF3aT1QtwBgBu5gGVmss0PnK+e7/o9N7cd1AtP1aqJniTwU5toKk7VmwrXnH9Wh6kJ6w0K01UWs7ushkjv84FZ2HruV8WhcvzBYGJcJyGXB28OfnnjFudEAiVh/8glSQsBQZHZqzz/PBAuHEkL6dfEGcE8iySK+XjyjpVhp+stkvVygnjyI0J3VvIXDKTiyTmVIS3m/68fCXH5CHV5DGiJXs02pGmwF60uxi8+8KeQiWlzUmA8cVjGwQ4YzS5eMKSwhfzOfkZ7HI40bbJBn+RCTWwVfu/83lzGk+b3H2BMIoOtv1TC3hRC3xxvyMlcn6hCEC2u0QNC49aKMAtkrnxkNA2Y8u/ea5C8xh9rPIzCCAnJQBGj7px0eyc18BwXO8eENoweg3l+M2pNx+5TjjInohyc7EmrP2KBQa6pK2ozddv4eFjq5TVBLCCgyDQxc9t6NB/+GbtMqeVdqhKfrEfLq6No1PYSY01KYJ9yW3HoeuVVNd8ct8vEVXdbAKGMZbpU0VdfRrYvC5E7cKTp//U698hRfLDZoF9hVHbLS++ev7a+l/deebi1Z/8UCln7McIRgnD5xsuRAIXtlJxn786GznUlw8bQTsTg+4BUBfRdq+RUbCBc9nFAcALEXnZrMWBPKETVRV2MZX1XlHXHbhjyz+5xPvF/rCocsxyJYMOmp1Cqada8ilkjNo0H8c4GoqExeqtd2hNyngw5HEQDE3Iw7LADAn/eQyyU2cyNIUBSrxZdHULtPhXhKF8vk+VYz/miYAwSeSwGiSJPiOUlfJCjOhgYw8zj3YSlbIny1yy/FNspBKNYnHUG5sDvG2k2qfSfdUxgb2nY0+q0C3EL3U9HB6un241jB3X1PJbOPuQMAK/L10atzfH0tWC1Wups6olg+S6djfIHDB50gLBB71XfrPJN1mTofVw/1LFJfTruNOiUv4SZeTQndAvxYorjTX5TbkAJM96Ms+77A4fbVY+hOrMOfJ3rjfAOKPsEwUUlDMWrBOMhXeTze5uEz7ledO9AnnlQCqMF/akZ0CCVeBnBU9nNoTiaJRh72w+NsJoyIGjV4FWjUmTo3wiffRBOxECVPbk6e/KZWqiWwyyZ4nJUoAy24nkhwxjhVd7HN9J7tXo8LR/1zaz/acbPL/wIKO0melaNw/zIHa9i8IAUvAbXdbzHZM4IAGsFuo6yzQdeBzlabqA3n20V3ve+IJzD9FzxSjafjMH1tIdQYPori9foid8xhcCVt4CROlDlYW9OuaqUC5p6OdydLt4ac6GSB0wSMitGZ4UZ4z4+Ys6NrQ4/y9t1qA9RlOi2NQGPW+onfL4kEQYXixlzZlcLLcSE5dRDUwqaG+9VGyDCf1pcvJ/8pPE8doONJQCISD6f/Jsoix1nLjrZneTgqPEKu3wd40zfMNwgoXrf6FWzH00NDtHWaVzrmhOZQFttgeCz4T9/oD1uVsaOwThq+/s364Gg42fUsdnojcw7Fj/Ark2BmSo55GbJonh0rv9YzPCR06tnIu6mEC1yH3gcOGYw7UltZaKe7GJeI9xtpwtYeL0uLq8OYWK2AHaZ15+lz7BoALJdv3XLDyIqrR/b/MrYvDSsnrGwfwUeZH2ANbAVXUKsXy12yrZUt78JaDFPQI/foeYOvo4sz6mt9snZLSWvO4P9XmPOzEd6EbGVzveN6v2cPfR0DL59ZVArIMN6+0LAMZr2i9kDTjxXV1kMMwGEouhC3YLXUUCOICv9cq7pAoU9WpccYWRQmDMjR5k0VxehRVA+a/ls4v1qFSWf+JBzka7uAHtN+/R6RMFpoayIqZ/9pOl7wP9aLmCzdMJBzplrZ0rkBHSBswiZTop5R4vfjaKaac3AugIkWhWeljPau5sMnwzQzwqs3tYs06Nm/8jCzTTo7wt7j5E8MIqSjOZ6luJE1NgjfmexoDDLXJPFILxA/yvjPEXN9P6wDzWVhuBM6FDTxAeSMCRzaiqhgxM7yEuKpW0mlL3jX5qdcEG4ai2kh4vcV4Rq7xHsxstKQq1+t61LUnvHXpupXkNMvcO/0xWaT+Em+6/1BhSylzoelgn2GJM9IidFN3NDOPgSgMF8qStB5k92qGDNMEZIXy7LFmvd+qFEArRahxmORN6ShA+IvJC2ZuBSnXKRfqCeX7na7uWh5j0Eju8Vb+x0w2suNGdw9rl6kcGHXmbaGxqEx1wY7XiQfRZwDs07BmIaqE4YcdOMWyjTE0ifNHKqxq8JxZj5xA/Pz8NmbL8MScBp9TTNfA/grRZcNLtlSsQgdRH740IQsSc+VQEHOlnWA9vN33Mw0hkYKwFmwVhisMSz3GX4VN+HKGijOG7H1uDgoNfas5+cCxH34B2bLIP4UmWlLDaPxeUnPvZDH7DueLKQJ6lCcEyVm1cK1dhogbemIm34kpQ02uLj4XpEjlWKnWGD0b7Lnwt2uL1MQGLkHCM1a0OWKxIGZ7xLHdBlSUK67kXiwrTpwzlqwtuSJla8alTc6pOz5QBQtaibnI+SoJpRdWVNXtOfnW4F82p6O77NBr6T2qzd86144q0A5KNlDB0AAObWE7oR4x3b65+Ekawx+zJIzQgAkduh1Af0jNKVCZmbdpcBAgEhVGOjuteyJ/z7s/30nxTnKhj1i5oUaZuw+HhWHgXlKtNBKGpFzm0qOQ8tbO+uNQX6tbI/54c4R/BAxgmwR7A1bVwZHbvlTr2B3yXFP9AbxXMXhvzeIC+ria5RRpdHLHgqDLgsn8ADUHug6XusZCdzXLcfKrw57L3Liq606iTMwMEF53/4KSjXD94pC7SR7Gtelx/vc/CmPQY231OL5jSFhsFOGBlfqbHABcC/KqD+8NTiL7mKWbHd3XKyWNoyx1+ulubpxsO1CEvvOV/zNtdfP75t9BtQo1SqxjeV/DQ1XocBQACFKDKOau6qtz0k4xJ29sIVc7xdZZ9pt873dX6td6Cw/YuNSCY+7MTYhTTycI8KZq8l4pRQlnVPIw8QDcTjop9MphGND2D2+TLbRp1FIsobu6ql3l5iHQn9R9KqgZj+1sK9VQzoOfKoNttV68znR9eGHKK4ex+5lkCLmk0nrpWRAadjU0l50al71oDNf7TlbRJAMeGTw14bZb1IvovN/qWVIG34Vk6TcYuKgyV9jmOY9lY2f3X63WL+LTaU9zo/W4OAPO0OSFcUf89V3jxCvyJXuAqcZ28W4GWFHg3bZNqnNM1CGLzbmXkao+fcU9yk70NfnqeanO3JFp3zLSI4NchQPgXPSAMOvTDcrcq5uK7xc+w5pK/ZBrRrpfXXHiCYHKx1BcYuLdqlQoH9DJIpiSk38roM8i8v3df+lvpsyG+tT4HxpPHCgDKU07cYv8jhyc9+NgS9VOWFwU6NiAoSAVnKj5K6w0KLfomo1yswYCSXbd1fj+RKrDAQe8dMsDIEXGOcEfbbGu+lgjL5rJ/jqJZQgdFKXK4n5eYLn3qXbbEHtdod/hzBWh+tTyfZST0h0Kkg8thDW9l3X7DpTL6XbDjs/cEkvVyFbaUf/TdSvxnOu0ILn49Lm7TEr+/joL4t5C95uev30KtoWURAoiYkflyufZeMp9kz3kGleyCU1rngSSX9O+W87rCniA594Lm4VA1owWvbPklXdroDufmVY00dAXnzn/rSHrVkABBc/JokaTnJj7Jq+7q5ZHjIZGXW+T2LwVynStJ7xOy0ku6lGazSdhNYs02b0Y8KKtsj5SZKYD0D2eO3R3BbR9La4E1bhVjB11WiZBik9R5YejRY5ZSOSWHnycCtWZetkP6mfwajwIIdmXbSI2j1+GDc+Xgc7/iAnKipJOw5QSWUHRfDBzksKz0ktO+BybKE3fd1bA+9yR+PA71mfH8Ycq/FWHDc69/2f0MA61ACcLb5ghCFxJvsknIY6VIaJrrmIu09i/tU0TSAN6IUcMTl6XO+gQ8D2+hW7ksgkAspEYI+FxFvDnbmOn/Wi08SaIdGsSpIm6QYE4uNQyWhCTVtIwsOEwL/guhwIBP4KEOQ1tZA9YiLdMZIecXOh3RsQ03C2doUn0/Z8R2yljsC1RHNnFHJpEbjLlpSmi7Pxjt4rbqogCDkwbTUpbH71uHt6JRwRSVECQVQHgGHL2+QsxiJRcl3UxoY0RCIfn6V4f4kdEZf2VWWaw+XGhAF+ncjOe6ZGDBQNAcVbv3pkc3sWuPsSkLj8Ep1cdvWDZD1VZWQBZcqpJS9bV61cdkIpvSwsdr2cwoFNSWTM9u9RLtU0SzYIzmy+n+Awho657s91qxXjVt11nwaTa2Ilpso7iOFrX2B389aZyycwKhpP348WCQOQM9KpMvf81FfBUzWwJCGqV+42aXVltKC7dAtebe+reHztHvzlcUiHq9Ek/IFm+piBBnwSHzs0rLb2i4P4QkOqUOsvPa9RF8dwHbOsOwch9hMiXEP7n+c0aWOXunR5vdCSjh+smMBTNckrDAzNy0qsSVSwIiKlwsCHY7P8dz+NwMlzkhAhQieWDabJa5S5jiHKKu/w4TK0ZbkBJYiXjECZAz+yZh3jQkX1uyoSa+RThCk5KlWmeF+aVl0RGHca6IS7uDYdXRJRwdAvgwE0Ri8b1d2T0nXzbaown5Nv+mofiT5Tt2VricVr5Qt0ulVROA2ZqZHYz0TDE3nAMsLp5ql8AoC5ctzHwkToSTKPoblkmW2VFPnDSpTboTnz6Wedrpjak166xa0WVZZkBn1tpmknk8+/pitCgWOYp5OEY+fhIaqy1StlM43fc5LULDTSQq/EJRvgOAQAE3JYIbex2WSbunN1TuYnYtU88WPQ9FChrlOZJgRJ0G8QMxUXlcXbPc7YYayn4IUh5KBNv2HXlyATnok0oCvBegxgaUmsjnASgu6tby38sVhcEFi4vWmNlPvR+e/yzsH9LZUFkbi0ZLhjBkDjCuQ5uInaQXAyhVYrRVF1AlbHBuSp+tP4eDBsP7AEOpDBlbty6Pq9MJk1e3jCVtcWXh0I3aWqfzdRP61PxrsuoOheSjIhA3vHv1J7BftULSaaWpmEttUGmo5z6SjTDJ6RD/aTAtN5HDngD3GM6FAN0C1vVLRbmSbD+lNewSgiduyDvED4CKO9ByTCER5uU6jwYupUERnDoLv/HzKqB0Hx8+HrhED2W7LdV7x+RCGDuyXygqAmkmYUMi56ZCEURu6EzGtZPMGSDLZr+OwbNl3KtceDt3QJJ3RkonlSetPCH8s7j9sCqXNGQmJjC/2QyloihMdcxRPhwcyvdOIVTisim70J+ivzkrz8TYfOsaRtrrPbUDpIbI0aykt0WW+7s46mSSX2Hh3Ayzz42QDJFlMI0f/phKLFOyqcPq87MeDo6rOLsK+r2jlzOp07KfYEQf2nd5KQI7FY0v5EPoTLLdQvV7FL8m8F5YlnAjxn5Tp9XR6NTiSX/syWr2ao3TXYgwbama8DkOasnCquH1mG8yrB8RVIQVJWuH+9rHv3FqxU3XEN0o2SPwolRXVAFqOG90vIkJ6Rnm6aFUYbWyCropsFFf/95IZ7zwBRvobs653S30kQ8SxPYqgzRRcZbFQSofdIBuer3Emi9YDt3+od6L29mHShZZyGyaUtySjgD/UKl+6QlMs0uqzeydm3BEztkP1uz1EG8IoMxNWb9fxvBti/DAAVlrZYCO7HCiZ51vz3kB3gDt587UWihHPcc+V9GKRyg0n0/O8lKpb3SvL/cc6UQR6V6ikfiRX2LHQMtV2S/q8EumiwFdAO6/vtGhzjNIff53immQ1Ag/kmm/p8e84xaiiUKiwasteUgjxbOcYlDv7GZkgBjklMSUe5cQjnya2f3xxi1+CODveOq1DZ6tk59JIPElvFk1fwDq+Rf7XussQ5ZWB2bURUF/mBKq/3OfZoMMV8it8tJQTxa5VFzpqCYSiRIVXUcm4VISqKW7Ph8nVWAl1ktlqIB3JsY7SzJoyQDO8xPmpbyg8vbzcsjdYnkz9y2E3K9NPbvb1aaYT+cbGUS3vTcOsGMQtK8PsILmAhGPNgPggzQSwv1PkmOGJVl3piKUhDF57x7rrvZ1hlS9OabhlaOrN3EueOB8ZnAZD71L4Yxk2tsWMsTtoxSCRocdHr0bDIVudEQ59ukGq+zC10krJ0t5ajzCnCbLQMYe/HCmrOSxr8VTf2JqmjbjMme8ssl/8BuKurY9u6SxOqx65fvIwUZRPBv8V37utSkmM03j2zZL1XU0tW8sBAVaSQM6o2/I9iDmkjScY4zhWZc4vXqZOgw13ndfSnXv4E3G8cK6KXP9BFtb67+I4hKpxlfBD6kBNGLLEqtdB1QjPy+oA40QMEA9LOwnVoVV19dNDfDgupYQlirdp2I4TheZICIiLaxtygcZsD5kP5rCJCU15lDka76u+Vn+kLPPYlG3uOAuXVTY7/llQ5SKRjCwZ6MD3GvidMbAi1/vOsW70Pqiegc5B3lEHuyfbSZg0CRr1ge06vgYH7n0a5LY7xAuTgIxX+RPiFYpCDH0cpx7Dtxo8lvyvmdTldIu3oYP3TNLNmtvcHeLmc2W9Xbh5cjliiYY4tSfD8elI2YJGQMsLCPZ+ACgg66nPjjWLwfgM3SM3vPUx0dhanWUyiFjCK/oWtgOAQwh1pdQtW6HQJpHugnpiDYzIiXC+m9SOITAauph9iRAunEFeq8wXtpiiQyFjNjZKaMxURQ4buEcLF3GeBX0St/7Mdave/HrXtHTGikbykzbu69r2+76JlMaYNtAwf8c+MRundEo+CPLqk2Cp56tIZGzKORroSBv8VZjwReiuBs0XymmNXp0ZodzCDK5bDrBiEjNg1gRwOS9mw7JlXrgRqRAI4H24NQiAjj5ZlIi6KjyWHrwx9SUrEQlOYWtPFWEBbQqFPZr957w4XaHRS/eLk6BCBtyAzGZeVxrfUv52nFSleGbUDWLGnlVGLVejEAX7kyqOhIgcZwlWVLf7FyuNtAP1r1HRZOAuzmic7sgA7avlZ0TtYWr/sb0A+7njnBlmSfd+QUW7FTqQaRylw7uYfBpQVb4lSYyxbdhIFxktBtGj5YUhn6SFn1fHhnk/Zj6G8z4F7nx9LI9io1s6Hifr82FnuseOf6KQhN2RJ9mhXri2DSjVbjF7SVmbGV0VoEqrOLHg2RsVyHcA7W6B2kl2UZmSmxrT/Q+QvuB2xEuRpcHO67S0u5QibarzrcHXvyNLnB2nt03rtnO9q/UPwuYVFcig+ysSZp2Cc7q/5XmRYaAzPpnr1umkbGYXkZkihZKUF7sl+Flizmk6nl+1zM7ECg6jNgnskIqyFzNMAMb6cN+l7z2KVb6J262acVoq9GVZIp2v8UgqUGRhmGRQ9+pOrdI6TztxHeovO4gXc0WfzaMfXKYny8Omdsq+b+JXcKHtGeYtUv++RSSBBIQW8cpMrdwC+D/xaFQuhhV7xkPv0iaRNE4izoWolsgn/0yI5bpEmYjHd6cFU2mKqUEf4BWboP8uridZM9b4mEkV41nUsbBL3zb3mcw3yKCtTETbEcU6GGWH1VXeFLvHB1zF8fAwRYev4MJAAXvsfmN2RaqJvAX6FoFG/A63sCl1hRcFyEeiGiXC9ueumQzLMPmstRgKMdqm9xykkvx2X+2U9d/Nj0V9fMQArwbh8BRexVDc2MfjS9OtWXoc2tVTaC36q2BlCSIHhPUhn9Ws1SDfJJdP95JHI3jwNzNRgy60+ClhtKZ8ARcJSl5puo7EeydjVr8UCd537xPvZXnaSVu6e7Aw5vTNZas80z7jQSZbvZ+M6GjakL+jgR9jOL8wSYaQZji5f1kFUTlvaz8MUM0fNBkPNYI4z+wMww6Wwn0d5TI1BJ+rpQFY8gv5WPmiXLU46hYQ6rZM60Fn/3f3Go+ChJF93GR3LgThwTYi57pBxSxT8yfRI8Kl08QzQMRPJzLvmaDHcwbn+9+ZJkRHWdNzusHRTvFhhAfcqdsEV4rnI1hJcapvNmAu4+UwWthTZT/5zotFFU5P3ZMbPoHURhZnJi0F5Es8CAA2k5kFfxK+KFRL2zYrXjFt3rTDaBguCRByJ2zeyZGTgNhqqkc1DHAzgC1GUBTrzDHesOjoJGL7ZBsAZhKTkkWdr+m1Bx2jf8VaEsbwNoyJEb6kTzmG0mICFKQdH5x4zPaqOhHIi3vb/NjddhseZFfvnJHRaJx6S9Cna1Dl8GVILY4pC9/h2ALz1ORSHaV8llPYPpWl4XY7JfMdebA6jJNd8x3VNKCeoPVDClg2FcvRZ1v8qlSkaM6vAYoo9I1PAECUrPZszkQSNba2Rd6Drr8US8ONXQfngw8tTjRaKgJ4ROZlYdBML7Oe5aicudvy/eZjeifCvQSMpQjE/gAIO320HrFGPFDZRpamOKK0wl86yESyzvG89txixtg1A8Vvo31ML12QKNm0iW/19R8HeSIr1Qw8N+MWOVotDAcUXoQroT7P7q4zwN/yWFitBUR+KEoT3xv+Vt5HiOoyJl9K08MfhmH7dBpVKnYosaDZQdJjKqFbZFFkz93+kVElNc1iqikm5MZZ2FajtfZcrdc7zJBt+bRwfd5Nckld7hJIsrMYHzzsSySl+4kf+eFJQriRTsfIQxW9V8k8bMLJ5K5HXC279Y3Vw75prFwzTy3VcQGXkgDK1PnzoyOhKpUrTrTc4OzR9CgANwWIj8UHspS6TBYXO8YqIFYPfj5kPntaMHYsKIgpepAz7p7Yc7ccmcklECf94nOBBgS4hwMd+G5hsW/gza8mZbiF2fcmIEKQCzzrRHOjxR1Rv+6mH26mggwbKBTKYrX3XYDmPrQdyaASyOmLC6mcKfoed9we2eEfUjNJlNXpm5UON4pqqj6euaMe9FdCowI1F4cDHbSZe6dOQdT1AQbf3nbo6m5vUq9UE6xDAbQYba8fQ/xoi8ZAc+skqFbReCapfRipx4Kgqq8c6RHxgBm9SC9EzgJqHBDRrbDd4pBl7T3DNSSLkldAFuNf3+hvvFxVE9D/zlDXOeGyXngYtctJlCxO6+MpZxFLGJlKy1XXDwn4BBe3s5nTE2XHhDZguxGO8V54DQtkuDhUndiN+hw+kc2KYkIsFD186ux0R/fnAH6l0HfBv68AswxAxsvCUZXb33rORht39YWLtrC3FdZX7Q4MeP4ML4gGlvvCA7xLJwj1ptiCo2C99itBKJQzIMvaD8h2V8TepX/fyoq9TYvH0qEWgZCILSjwjQPIr14DxqPBYtwiwy9Fwtvd0vMnMbldYCyK7G+jSVPHL74yGbv6rM4f9d4Kmg16aM/gmGu5uZ0lZP+65RHtUlrSoD6eGz+2tktbqUCTPFny2L6/zyQSg1ttJRVfhd9/GwAANHZUVd5FX/ygpucxWVSTQr6y/r4MYzMbyaVm8dKY4HxOcYXhg0ob9V++COkAE8Hm/jpJSuPOWalM0HBvxXVPNXNqsKeljuTIBLXLa9QeUsYfW80DZoxY7KYmtqpTqXpFhJK5Eh1p+8VmCi5g933cO9q/TiCOsR/wKI4SMTyZRcGaazGc7Ef/PGc89F8lzo9NtF6NwGpCDEY24Nj/1hZt0r6nOX0djLk7WaoxyfrAdubcfh2Wuaer+M5qu9I3UWVkzPjpyBSOwFZFEPfpkj+2RfxqHxfQz/dwgbDroPME6xeyOYN2kbmHBj8Kh/O+66qxn6tZqecrQ+3EBfElDuXCYUtil97c1ZN6fnj6bX/J8SRbvbuiSU7TQci1lIe/CvUoTz5bBv47ipz1LdHCTQnVjIqXvfCUnKqtNew8zBBr4PHJ2OMpr/jDMmXMQjQevipx87QpRiv0SYNr12R3wcmnqbo9TAVMVd2QvhiNJYkxUeV1RZMAPhj4co42RMVHrg2NS0CQPP4vwcOjnUC912Iz1adUnVTYosJSf95jmofqRLYVp5lPX16anCYV3RtwMRGQtWrXKfHuD1WGfMXhXe2kSbeNBXwemo0tITctP7AGUQ94Kym7WXauCUnE6u6ffHsGr/JH4g2nqTXx/nWqqmKAlmRrZCe7qyfD4zznlCaboeKqAKi06oWD3PiI9u8TXBklQC8wSTeiLIWg05+mzH0T9Vy5uVe4E0ZJigvvqIHV7cixjO7dhn2xB+uieRCEflDvTZ9Rq5CvToeN1SOsxYWMinwq1pGCRd5OGIJJCIPZnoAAHZu/3gXc/dpd/cSvikdkHOT+/8kQgOpIS247I+8zIror6Pk8GMvrkbzPx7VOcB3zZTKNlQZpOAxcf6ZVxBb7NPDr6cF3yglghssu7f38dJWQUSth8ZhNX5mRvvGFHIrnittlkeysEVedwXIhzTlnS3Pp+6ctflscwFTVNAbLGpXi/f7hxQlfMqipMP4T+XKA4Kf/wkXcmQGlWsvPb8aa7qBZ9p7QaN8PhGxtoSxMCKC6urrSvsraFPrqr1ODTJvZau9J6z1N52C2/KXSYHX77ABSWJj6vHm2E5ZsXxBC0aSla18lhgadXKk4b2cFhTSzn3RDC37wriTD+lDey1SULKr1C4Jn6o689boj3ZeGz+T56xJ7xRd2C1hF2I3FYSGliSpa2ZwIAy09nTEvud1EvZpDY7r+yDC2pPtfgWjhr1BNw6HKNqLa9rU4ufzUaldRF8TeWEK7OsvKRHqo3SWrPf+ylSMr8I7kZDRU5Mg4Yz+ykYTjzuH/+blEeAGhNnnRC7xO37+flnC2Gfg6zWttxjcNRXYnDq/cxoz7Ooh6Tzmo/6FiOhEU8yUFRBJRxBlsMpemTOlXxgzYnvVe/mDYfT80sRrZSwRLzPGbEc1xQQ0m6RMQJ7VW8RVXF4PMRagyA9qBPS4H21Tb7gzN2+3b5W5SZViD5YGoRQogHW2XpOFcZL1V4Q9LRVchcZ5R7oCsOXdX26KEHn0FGcIYQTjYtFQTyBo9krQLUBsOwmR7PaT31lqkW/sLdUQTgRCqoiMHyzHJfS/Ga75hDaTd2sHyxiS1lSiIuMUX0BQNSWjry7QPg5SlDD7oSu/qUHvbg9mLKxBlisQE2tcmT14MIHxno0fEuvzZ2P+agc+379coHuZ0T19ic9qULvrBr6YtteLtRitcFKUgbGvxfWHlYn6PqtbAxQ9cVjsmkPWXNbdQ97hUXkcdy+JCyUz026bcbQXih8CJmGyZARwS18acGb9vP4Dv0fJsEFCJiYlQlnl3wb2H12H+a1JVb1hELfHAdiuGu1H//9a8O99zfb8n53VvE8slbv33HMhANVKJ4JOhCEHNaKYeu8zhDJKh7pXclLGBURSPHeIeAbvKYfwodr1Vh8rD6OIGZQ5qCWg1zAHtqhFrkjEee1tbN36a1c9940icju6a1L5vNacS06uqoHr10O386tIvIVA8kYa0TVylVm0l0ub34cR22Em3tJwh12aRAGn5w27Z+7uTL4ZC0NgheoHoaMIP9k43kz1i99H9LcYtjFVL/kTQvWo8IJC3vaKlO995Vkfu4O5tVC7r/oa/l11daFhfLdfLNA6cV9/MfNPcsUyxd6PEbgiM5Skue38hslULc1Eq7KC9ZzhVxD/OC3tMRFkP/myKM5cLHBjKjnxd5sZknG1S0pujb73b08TxkjFP3uF7l4wSveYKJB1OD4cK6eFuymFTMrdi9NNrCN+ezjH78nXYy9sx3wJP+fxoEAlrXhyG4Q7+LIKgy74S5jzE2uxs/eMmfmvBFEuFu1BhGfwL4TQPkRNG6ZR4XKuS1k1zaa/T88IQ79k3hFT9la9W+GScHaWib8IjdBLAi9CeqqKyaRe7rAukLjsdKxNC/2yF/nIyoTqMhs5CiKu6ixwwa/grIPHdTWs5xN5olwSbJTgqEjrMfie49x042DL1pPMnZ58WiCl5fDeDDMCnLoMZVVX9AbyHdXU0g3xrv85UpQdtMafKTY1LnZfNsuX3CE1Nvnre0tgjpoXO8ROczZVkiuFtP+CkViTweAfot8p6BQRuW4MUPG5OKIqqn7Y24/Td2ZJIJNAJWtZSnbNqs5Ub4YY49XKq5whOtfcRSiKfIZAozbzRCYL5ALArNJeBHhR+FsxAflzR9Aw8U6KxJVk8Ue0H4fynDSEKdS/OTT1weOpuzzEGWq6Sb8Ef4d1JNUPxqyKUO+WOHfruNSIR91lqaOQVBs3qWUcqQmQL6M7iwV6jd2HlBZK4acKivpxLHuHBvhfPwSPGNWvkyK57c4GJgqj5I7fRkAKBiorcOwPWdhiSvn9zFOft1B9ySOK2a4aOtcC6yylqmdasU1wet0jF6MnecEdnSimE/Ye7O9jP7/hexQnmkiO+K9PELr5o6ytzWyGhJPxD9lrf7QNHCxYbuTrZMNfrCcyM0AaaYVUq7xpzoB8fG44Z7mQ/MH6HG6BA39JW7+ylBt3NTXkvwokyM/kr2Yxk4llDoW9EP317iysFwqCKGGbpsQLk7QnUxV4g0qpYjZnP89qenG/MyOQjPkOpa8e6jy65Eiy5EUl3oHnXvL1wuG0ztm2le/DLSXUMJlna4Y21SYw43MX0QFBxXGMhZGcaozxxCxKMt9zFsm5J8pWAOOgGMUEJlLLdy+WmaJVuiqVj954jOYgiW5iSaDo+a8IhOEUmylJbXFpmEZloHviZTM3WMdeN+krforX7f2AmkdYnOZUBmXYIPrqgFKmt7KpORHD7LEo+BNKnvYKQa/YoLOwv/0L+qvEDkOr8aasFqUvv3kudd+06NZXzvkVQptq7s9HGX08FjNeIwahbOdhLcqc599TMpmTX/nC4DbmQjqufEGhxDVprYpgUElK0gOI40lp2R+dB+t6pAWjHWDriDAsnWwmK7T7wqeVH2sDsmkFjqiBCHtde4Hz4YUaJP99RrNM4eTi/p5CK1Uk/piTG5bFz8H/5hV9LyI/s12GLbcg21I3OAq3AHRE6ucTs1xf2NxPN7adVoN0xCb2TnEUk87EGWGSHQEWsLpRxh2V4WKREJ/x9S8l5hzHhCAOWW5wqOlXpXE1IAFkKECKHqhX4DME0x8ZMXaB42Y3DtX4R0+Q+tqLwoh1gwEEXaxaP3cAZ6NlR6c8yfu79DQ9msWeMHD+DwyFumQGtIrIUpuJGoxVhC+kh0ug4VqI6pl7wx0yhkuQaXQph/0rzhaAODFT229Ysdp0q7dqdsCJaegHX2SQJflBDHbys6nJXLlOxl7eK3yDE2A2c3jsnMzLso2bLoofwEg9FAy/9Tw/ikoth5hVT62B/8IRQlRoIn7DJ/xKJ778ix1JXB53MhKNwaSD7AHN+dBMy+i5/28ghoc0rc8MOBzDQByvxhqIdjjvLFE3bXGAPvHybtiRRJWX7qUrQ6YzuhaHydownQ2+fSP+xZPVXa/m/SK29QjT7uiTTbP4S0dfS8HII5NYWpiqePwfrO2AJz4Zu7tDHZpWMx6LMawh3DGonkAm8WWnrRLsskSbpohNQQLzIMPKYQClWZMGDycKgq+TNNzwdn6Mg7TgMq+tb4XB1dsuxrGnDQ77j4fPQ6DRuQPikO2tcWN3yXofeyAe8CdX7AHGSUib7AwxWGuOQsGrBQrkJEgL410w+pdYHgWXHxik+NaTUq1OuWCnDWYbRi/mpzB3vKHCNH9E8Qv/ucZ09v3FEEoJt9j/X9eS0apD/O/VI8HTWDgtDw51g87dTG8VV77rFnwkN1Iyz2vfGsBVuIZHgUecoJLt5PTkPG2ExgWtgwT1DP8iszT7dMSvnweF3S9icjvJkk//PgwAtgdIOjVmjP6U44oNZ0RgNM4zg5tEKutzEUg61BqeXCrpgjPW1zEZRJakN6CkJMZOeNO+50Iz78JCJg/Lcsq1BmSyCMUdexCwLcdPfYmzQMBouLhBZu9H3P0LcYGYGdoDdMyvCId6aZHxCP1+nkRFM+GBq00WEDX43rW5r3vL+xZI6v3rNslR7jKJEnHwjt+XZ9raEgKZSpjU1qOZft8aPoTf3J73EQwMKLcHryQG+5SpiuXy+2wNOI8syXwhhj5ZF4XeM5bML5QlbVl+FPt42223acPLoeGZvwmM9nSuCynlUMhgw32JrDSp9Z2m6uie2aIL9r52KTqawr5UxnIjQoyCWcw886Ye6lBmHC4mayrLxDTQAKaVEwkw0tQTEojGBSZ7CKgk/2xFB/G4cSsd3t05nC7/sVAXAVUxCDpTrpK3JueMiGgFnSd1bD9n5lSGOsvvWrWkMjpnCNYt4kxUjWClIZSB9MtomnWOBa7LV3omDy689sebTc2JQp+4gN6s94fLWSYMFEcOJixk3qOlqDk9uguCBczuJZ5WM0uQbDZ9HvwmScyJ4ag6e8pVywOLsYbfYyE32RZtq0MO2W5WB+1E/mxhYjN8BrA+TUM7owTnOi1r3P/qWmwBpfgC+jyNQyG7k12BahrfBhYsA/Orux6xZzKfcNYowOEjbJ018ymCVi8l8OQnCv9JnZz5JAgsCLFp1aRNRuRI9KmJA/s/tQLUwJK9iPsQuVgtR2dsQOT8F4adV7pPu78Jnaq7ZD6+rZa5ijaRAv1Y7oiwXfSwwLEXCKNpVkGsSeimN3TYqZe8CTbQHjdot75ufuQQQMrV5/3CRFTKXXtTbw7keGNPvTPvgqlUdj3B3mt5OYqqGNR23oaGosN+DfPfewbuATKn7TkDZF/UHoyNhqCWg0nGooOP9kX+h1B8iXk4Z+DzL8ffKfJMlTxR8LFtrfToLE7dLLSHtCoHSpDBLWR12FWkYFJHD3g2QbQ/7FGcBzFzQigeOof/tMKqDwTQruQAg2CAzKdMey50BgaogOrcdJl0vPyVpWVG+DNmU1D0kK7Cc0XepUP3hJ7tkzh1f5i0nCKUMdTlHgbCeecSAdwENlGiweFP2m393QAZaga1xU30RMR1nbjOTJ3ZBOe1SRcZvo+9her1xFbSZDr5fEGKE3hEflF0gD6TdDdBB9l80xxTTStQ+I46c7aP36z/8RDwb9Qj/NC6GUNdR20rOD5ZVxec8Cxc4W3+zbg27HjQTMkpW76HypfRkOpFE6tHH2l61b57vv1Blxo5n0pavPoTej1d2fyKF7SOBzK8o4tVYk9CjPFa6xZax05Y7AJxsjsObPpt3XCzwMjVkAdf2Aof37EVeGt2GUa1nv4U4ZZDSNJ1E/7+PEs0nRhZ63VrYGLO9y6HjIkx56J+LiTF0casn+M53g03doOSewPX5uQ26UKy4m53u7Pc+28pCl7lCP5p7xgi2ZNPiciw1kDohmp+UR7EY6Dw+XtIGYD7366aCdkABuGY28nuN2TBrPgT0LkJxwWC4MMWUJea+6iL/yFPobIS2Gq/7r8bnkLwjAgr2flSnVolUTCfDafPGrk6wxZYSYrB45K9HdNZ0YmOouA1cjXVAIgmVqoWoqGbf+ScuMpkKAcspx6Uy7egTnnY1igW4RqzOTtWGklnDXwjjphXszmM/sfzasSahu1LrVOc+jmmZ7jHpe6ikwn5exUvM8vGhqW8SIEcX3Bjq6vtKgUJGkT30dAo1r9AljKpNNsmMp6exwMTLEj0vFSWu5pFBnjyIapKuJuedvE3IVGRiNnXt+d0LeD+L7T9DOTEgvYxrG1SsVPuGSmZfWviW9sqXz0JkBTPW8U8bAN2yNF8RViaG+ALayDYNSqRElNAQx14RJzyA27eg0wh0LaU5+N+T+Ol3UPj/I1Tyrz35V0HqoESebyL2lxiNBvTVjst0qKKiRV57kKq91j1CNRwKYKK3Xg30Han1VPPN5gfxZKi+XklA8j/RTfSB7Cm/PWtEgH8Kospw1RXm64qYRnVdV1g+4BoQi+ooXZBKJnYaTnyco96au2T7t36Vx2cHiVDSjkFHnJPUGtkdKtiUoL+peoXwCeMvQc0aOND6tAMkj3mKYuzIbNqfpK20y2q71ekV6Md6Wfe6vRjXjPBdwJ+ZUK9BQVdqy2uo+TY9On4ZrAZ/Fg3rr+EyIEmm20G874lLcsbaAOBeFcOFrLWqHRYw8WcuFDef/Hnnmul34S0e5zoXtaUZVMmIRgPJWMEzICbpIPd78w+aVziWSiczc3il3RliL0snqHgQI6ouioz2ew+KzZBSuo2PpHG6bcxPFMDZre6UBUYwoq6RpGmm/X63e2hZzGMJ0YEqnyQr7wPftuwIquEra01TJrZEntSXQnlGmkPIHEAMUP2+uy+lgrJpQjilycxOfdl7tgxZTvoRn6Ru9VfIhOdLmW18bO632gno5/wjo7d/B56MmqMHFHBoJx1ymEviP4Arwbl/qresTjZyvv2Gscac63qK/SrynI9S2rjy4oT1PtVV+HiLo3z6XGcX3vqdrETBzYGKhsdTdUmi8D07bWbPy5PS0SG/4czsqq+HweSj3f9/J/+F70cW9Eapka8DvCck9NV6zSft7QthAz8fIx5XGmF5eU2PLzUDNd++IE22wqM51g7zAiNMasOOU9MCqztzW8YXv15ieAiPrdgYz0sAOZ98EUfDEzyDX5hqJw2ncN3Y+YGm5GoGnYAgl9OLniaUdc0fd \ No newline at end of file diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts new file mode 100644 index 00000000000..2265cf8d79c --- /dev/null +++ b/src/test/utils/testUtils.ts @@ -0,0 +1,27 @@ +import { Moves } from "#app/enums/moves"; +import i18next, { type ParseKeys } from "i18next"; +import { vi } from "vitest"; + +/** Ready to use array of Moves.SPLASH x4 */ +export const SPLASH_ONLY = [Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]; + +/** + * Sets up the i18next mock. + * Includes a i18next.t mocked implementation only returning the raw key (`(key) => key`) + * + * @returns A spy/mock of i18next + */ +export function mockI18next() { + return vi.spyOn(i18next, "t").mockImplementation((key: ParseKeys) => key); +} + +/** + * Creates an array of range `start - end` + * + * @param start start number e.g. 1 + * @param end end number e.g. 10 + * @returns an array of numbers + */ +export function arrayOfRange(start: integer, end: integer) { + return Array.from({ length: end - start }, (_v, k) => k + start); +} diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index 2caa82289d9..eaa987c1a66 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -1,4 +1,4 @@ -import "#app/test/fontFace.setup"; +import "#test/fontFace.setup"; import "vitest-canvas-mock"; import { initLoggedInUser } from "#app/account"; @@ -9,11 +9,21 @@ import { initMoves } from "#app/data/move"; import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; -import { initAchievements } from "#app/system/achv.js"; -import { initVouchers } from "#app/system/voucher.js"; +import { initAchievements } from "#app/system/achv"; +import { initVouchers } from "#app/system/voucher"; import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; -import { beforeAll } from "vitest"; +import { beforeAll, vi } from "vitest"; + +/** Mock the override import to always return default values, ignoring any custom overrides. */ +vi.mock("#app/overrides", async (importOriginal) => { + const { defaultOverrides } = await importOriginal(); + + return { + default: defaultOverrides, + defaultOverrides + } satisfies typeof import("#app/overrides"); +}); initVouchers(); initAchievements(); diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index dac67bd7b4e..874bf6a8b46 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -1,28 +1,40 @@ -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: "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"] + } ]; export class TimedEventManager { @@ -52,59 +64,62 @@ export class TimedEventManager { let multiplier = 1; const shinyEvents = timedEvents.filter((te) => te.eventType === EventType.SHINY && this.isActive(te)); shinyEvents.forEach((se) => { - multiplier *= se.shinyMultiplier; + multiplier *= se.shinyMultiplier!; // TODO: is this bang correct? }); return multiplier; } getEventBannerFilename(): string { - return timedEvents.find((te: TimedEvent) => this.isActive(te)).bannerFilename ?? null; + return timedEvents.find((te: TimedEvent) => this.isActive(te))?.bannerKey!; // TODO: is this bang correct? } } export class TimedEventDisplay extends Phaser.GameObjects.Container { - private event: TimedEvent; + private event: TimedEvent | null; private eventTimerText: Phaser.GameObjects.Text; private banner: Phaser.GameObjects.Image; private bannerShadow: Phaser.GameObjects.Rectangle; - private eventTimer: NodeJS.Timeout; + private eventTimer: NodeJS.Timeout | null; - constructor(scene: BattleScene, x: number, y: number, event: TimedEvent) { + constructor(scene: BattleScene, x: number, y: number, event?: TimedEvent) { super(scene, x, y); - this.event = event; + this.event = event!; // TODO: is this bang correct? this.setVisible(false); } setup() { - this.banner = new Phaser.GameObjects.Image(this.scene, 29, 64, this.event.bannerFilename); - this.banner.setName("img-event-banner"); - this.banner.setOrigin(0, 0); - this.banner.setScale(0.07); - this.bannerShadow = new Phaser.GameObjects.Rectangle( - this.scene, - this.banner.x - 2, - this.banner.y + 2, - this.banner.width, - this.banner.height, - 0x484848 - ); - this.bannerShadow.setName("rect-event-banner-shadow"); - this.bannerShadow.setScale(0.07); - this.bannerShadow.setAlpha(0.5); - this.bannerShadow.setOrigin(0,0); - this.eventTimerText = addTextObject( - this.scene, - this.banner.x + 8, - this.banner.y + 100, - this.timeToGo(this.event.endDate), - TextStyle.WINDOW - ); - this.eventTimerText.setName("text-event-timer"); - this.eventTimerText.setScale(0.15); - this.eventTimerText.setOrigin(0,0); + 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() { @@ -118,7 +133,7 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { clear() { this.setVisible(false); - clearInterval(this.eventTimer); + this.eventTimer && clearInterval(this.eventTimer); this.eventTimer = null; } @@ -145,6 +160,8 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { } updateCountdown() { - this.eventTimerText.setText(this.timeToGo(this.event.endDate)); + if (this.event && this.event.eventType !== EventType.GENERIC) { + this.eventTimerText.setText(this.timeToGo(this.event.endDate)); + } } } diff --git a/src/touch-controls.ts b/src/touch-controls.ts index 9953e99c81a..53df545e27f 100644 --- a/src/touch-controls.ts +++ b/src/touch-controls.ts @@ -8,18 +8,38 @@ export default class TouchControl { events: EventEmitter; private buttonLock: string[] = new Array(); private inputInterval: NodeJS.Timeout[] = new Array(); + /** Whether touch controls are disabled */ + private disabled: boolean = false; + /** Whether the last touch event has finished before disabling */ + private finishedLastTouch: boolean = false; constructor(scene: BattleScene) { this.events = scene.game.events; this.init(); } + /** + * Disable touch controls + */ + disable() { + this.disabled = true; + this.finishedLastTouch = false; + } + + /** + * Enable touch controls + */ + enable() { + this.disabled = false; + this.finishedLastTouch = false; + } + /** * Initialize touch controls by binding keys to buttons. */ init() { this.preventElementZoom(document.querySelector("#dpad")); - this.preventElementZoom(document.querySelector("#apad")); + document.querySelectorAll(".apad-button").forEach((element) => this.preventElementZoom(element as HTMLElement)); // Select all elements with the 'data-key' attribute and bind keys to them for (const button of document.querySelectorAll("[data-key]")) { // @ts-ignore - Bind the key to the button using the dataset key @@ -48,7 +68,7 @@ export default class TouchControl { node.addEventListener("touchend", event => { event.preventDefault(); - this.touchButtonUp(node, key, event.target["id"]); + this.touchButtonUp(node, key, event.target?.["id"]); }); } @@ -56,10 +76,14 @@ export default class TouchControl { if (this.buttonLock.includes(key)) { return; } - this.simulateKeyboardEvent("keydown", key); + if (!this.simulateKeyboardEvent("keydown", key)) { + return; + } clearInterval(this.inputInterval[key]); this.inputInterval[key] = setInterval(() => { - this.simulateKeyboardEvent("keydown", key); + if (!this.simulateKeyboardEvent("keydown", key)) { + clearInterval(this.inputInterval[key]); + } }, repeatInputDelayMillis); this.buttonLock.push(key); node.classList.add("active"); @@ -67,11 +91,11 @@ export default class TouchControl { } touchButtonUp(node: HTMLElement, key: string, id: string) { - if (!this.buttonLock.includes(key)) { + if (!this.buttonLock.includes(key) || this.disabled && this.finishedLastTouch) { return; } + this.finishedLastTouch = true; this.simulateKeyboardEvent("keyup", key); - node.classList.remove("active"); document.getElementById(id)?.classList.remove("active"); @@ -81,18 +105,19 @@ export default class TouchControl { } /** - * Simulates a keyboard event on the canvas. + * Simulates a keyboard event on the canvas if the button is not disabled. * * @param eventType - The type of the keyboard event ('keydown' or 'keyup'). * @param key - The key to simulate. - * + * @returns Whether the simulation was successful. * @remarks * This function checks if the key exists in the Button enum. If it does, it retrieves the corresponding button * and emits the appropriate event ('input_down' or 'input_up') based on the event type. */ - simulateKeyboardEvent(eventType: string, key: string) { - if (!Button.hasOwnProperty(key)) { - return; + simulateKeyboardEvent(eventType: string, key: string): boolean { + console.log("simulateKeyboardEvent", eventType, key); + if (!Button.hasOwnProperty(key) || this.disabled) { + return false; } const button = Button[key]; @@ -112,6 +137,7 @@ export default class TouchControl { }); break; } + return true; } /** @@ -120,7 +146,7 @@ export default class TouchControl { * Prevent zoom on specified element * @param {HTMLElement} element */ - preventElementZoom(element: HTMLElement): void { + preventElementZoom(element: HTMLElement | null): void { if (!element) { return; } diff --git a/src/typings/phaser/index.d.ts b/src/typings/phaser/index.d.ts new file mode 100644 index 00000000000..f3665768cec --- /dev/null +++ b/src/typings/phaser/index.d.ts @@ -0,0 +1,68 @@ +import "phaser"; + +declare module "phaser" { + namespace GameObjects { + interface GameObject { + width: number; + + height: number; + + originX: number; + + originY: number; + + x: number; + + y: number; + } + + interface Container { + /** + * Sets this object's position relative to another object with a given offset + */ + setPositionRelative(guideObject: any, x: number, y: number): void; + } + interface Sprite { + /** + * Sets this object's position relative to another object with a given offset + */ + setPositionRelative(guideObject: any, x: number, y: number): void; + } + interface Image { + /** + * Sets this object's position relative to another object with a given offset + */ + setPositionRelative(guideObject: any, x: number, y: number): void; + } + interface NineSlice { + /** + * Sets this object's position relative to another object with a given offset + */ + setPositionRelative(guideObject: any, x: number, y: number): void; + } + interface Text { + /** + * Sets this object's position relative to another object with a given offset + */ + setPositionRelative(guideObject: any, x: number, y: number): void; + } + interface Rectangle { + /** + * Sets this object's position relative to another object with a given offset + */ + setPositionRelative(guideObject: any, x: number, y: number): void; + } + } + + namespace Input { + namespace Gamepad { + interface GamepadPlugin { + /** + * Refreshes the list of connected Gamepads. + * This is called automatically when a gamepad is connected or disconnected, and during the update loop. + */ + refreshPads(): void; + } + } + } +} diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 9288fd35892..5860702a15b 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -11,6 +11,7 @@ import SettingsKeyboardUiHandler from "#app/ui/settings/settings-keyboard-ui-han import BattleScene from "./battle-scene"; import SettingsDisplayUiHandler from "./ui/settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./ui/settings/settings-audio-ui-handler"; +import RunInfoUiHandler from "./ui/run-info-ui-handler"; type ActionKeys = Record void>; @@ -79,7 +80,7 @@ export class UiInputs { [Button.ACTION]: () => this.buttonAb(Button.ACTION), [Button.CANCEL]: () => this.buttonAb(Button.CANCEL), [Button.MENU]: () => this.buttonMenu(), - [Button.STATS]: () => this.buttonStats(true), + [Button.STATS]: () => this.buttonGoToFilter(Button.STATS), [Button.CYCLE_SHINY]: () => this.buttonCycleOption(Button.CYCLE_SHINY), [Button.CYCLE_FORM]: () => this.buttonCycleOption(Button.CYCLE_FORM), [Button.CYCLE_GENDER]: () => this.buttonCycleOption(Button.CYCLE_GENDER), @@ -139,6 +140,17 @@ export class UiInputs { p.toggleStats(pressed); } } + + buttonGoToFilter(button: Button): void { + const whitelist = [StarterSelectUiHandler]; + const uiHandler = this.scene.ui?.getHandler(); + if (whitelist.some(handler => uiHandler instanceof handler)) { + this.scene.ui.processInput(button); + } else { + this.buttonStats(true); + } + } + buttonInfo(pressed: boolean = true): void { if (this.scene.showMovesetFlyout ) { for (const p of this.scene.getField().filter(p => p?.isActive(true))) { @@ -170,7 +182,7 @@ export class UiInputs { break; case Mode.MENU: this.scene.ui.revertMode(); - this.scene.playSound("select"); + this.scene.playSound("ui/select"); break; default: return; @@ -178,7 +190,7 @@ export class UiInputs { } buttonCycleOption(button: Button): void { - const whitelist = [StarterSelectUiHandler, SettingsUiHandler, SettingsDisplayUiHandler, SettingsAudioUiHandler, SettingsGamepadUiHandler, SettingsKeyboardUiHandler]; + const whitelist = [StarterSelectUiHandler, SettingsUiHandler, RunInfoUiHandler, SettingsDisplayUiHandler, SettingsAudioUiHandler, SettingsGamepadUiHandler, SettingsKeyboardUiHandler]; const uiHandler = this.scene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { this.scene.ui.processInput(button); diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index a0b249695b9..a924d545852 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -1,3 +1,4 @@ +import { getPokemonNameWithAffix } from "#app/messages"; import BattleScene from "../battle-scene"; import Pokemon from "../field/pokemon"; import { TextStyle, addTextObject } from "./text"; @@ -11,8 +12,8 @@ export default class AbilityBar extends Phaser.GameObjects.Container { private bg: Phaser.GameObjects.Image; private abilityBarText: Phaser.GameObjects.Text; - private tween: Phaser.Tweens.Tween; - private autoHideTimer: NodeJS.Timeout; + private tween: Phaser.Tweens.Tween | null; + private autoHideTimer: NodeJS.Timeout | null; public shown: boolean; @@ -36,7 +37,7 @@ export default class AbilityBar extends Phaser.GameObjects.Container { } showAbility(pokemon: Pokemon, passive: boolean = false): void { - this.abilityBarText.setText(`${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: pokemon.name, passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: !passive ? pokemon.getAbility().name : pokemon.getPassiveAbility().name })}`); + this.abilityBarText.setText(`${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: getPokemonNameWithAffix(pokemon), passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: !passive ? pokemon.getAbility().name : pokemon.getPassiveAbility().name })}`); if (this.shown) { return; diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 2069f034e89..c6abecda4c0 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -1,5 +1,5 @@ import BattleScene from "../battle-scene"; -import { TextStyle, addTextObject } from "./text"; +import { TextStyle, addTextObject, getTextStyleOptions } from "./text"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; @@ -36,29 +36,31 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected optionSelectText: Phaser.GameObjects.Text; protected optionSelectIcons: Phaser.GameObjects.Sprite[]; - protected config: OptionSelectConfig; + protected config: OptionSelectConfig | null; protected blockInput: boolean; protected scrollCursor: integer = 0; - private cursorObj: Phaser.GameObjects.Image; + protected scale: number = 0.1666666667; - constructor(scene: BattleScene, mode?: Mode) { + private cursorObj: Phaser.GameObjects.Image | null; + + constructor(scene: BattleScene, mode: Mode | null) { super(scene, mode); } abstract getWindowWidth(): integer; getWindowHeight(): integer { - return (Math.min((this.config?.options || []).length, this.config?.maxOptions || 99) + 1) * 16; + return (Math.min((this.config?.options || []).length, this.config?.maxOptions || 99) + 1) * 96 * this.scale; } setup() { const ui = this.getUi(); this.optionSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -48); - this.optionSelectContainer.setName(`option-select-${Mode[this.mode]}`); + this.optionSelectContainer.setName(`option-select-${this.mode ? Mode[this.mode] : "UNKNOWN"}`); this.optionSelectContainer.setVisible(false); ui.add(this.optionSelectContainer); @@ -69,11 +71,27 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectIcons = []; + this.scale = getTextStyleOptions(TextStyle.WINDOW, (this.scene as BattleScene).uiTheme).scale; + this.setCursor(0); } 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(); @@ -84,6 +102,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } this.optionSelectText = addTextObject(this.scene, 0, 0, options.map(o => o.item ? ` ${o.label}` : o.label).join("\n"), TextStyle.WINDOW, { maxLines: options.length }); + this.optionSelectText.setLineSpacing(this.scale * 72); this.optionSelectText.setName("text-option-select"); this.optionSelectText.setLineSpacing(12); this.optionSelectContainer.add(this.optionSelectText); @@ -91,35 +110,37 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); - if (this.config?.options.length > this.config?.maxOptions) { + if (this.config?.options && this.config?.options.length > (this.config?.maxOptions!)) { // TODO: is this bang correct? this.optionSelectText.setText(this.getOptionsWithScroll().map(o => o.label).join("\n")); } this.optionSelectBg.height = this.getWindowHeight(); - this.optionSelectText.setPositionRelative(this.optionSelectBg, 16, 9); + this.optionSelectText.setPositionRelative(this.optionSelectBg, 12+24*this.scale, 2+42*this.scale); options.forEach((option: OptionSelectItem, i: integer) => { if (option.item) { const itemIcon = this.scene.add.sprite(0, 0, "items", option.item); - itemIcon.setScale(0.5); + itemIcon.setScale(3 * this.scale); this.optionSelectIcons.push(itemIcon); this.optionSelectContainer.add(itemIcon); - itemIcon.setPositionRelative(this.optionSelectText, 6, 7 + 16 * i); + itemIcon.setPositionRelative(this.optionSelectText, 36 * this.scale, 7 + i * (114 * this.scale - 3)); if (option.item === "candy") { const itemOverlayIcon = this.scene.add.sprite(0, 0, "items", "candy_overlay"); - itemOverlayIcon.setScale(0.5); + itemOverlayIcon.setScale(3 * this.scale); this.optionSelectIcons.push(itemOverlayIcon); this.optionSelectContainer.add(itemOverlayIcon); - itemOverlayIcon.setPositionRelative(this.optionSelectText, 6, 7 + 16 * i); + itemOverlayIcon.setPositionRelative(this.optionSelectText, 36 * this.scale, 7 + i * (114 * this.scale - 3)); - itemIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(option.itemArgs[0]))); - itemOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(option.itemArgs[1]))); + if (option.itemArgs) { + itemIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(option.itemArgs[0]))); + itemOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(option.itemArgs[1]))); + } } } }); @@ -185,16 +206,33 @@ 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: if (this.cursor) { success = this.setCursor(this.cursor - 1); + } else if (this.cursor === 0) { + success = this.setCursor(options.length -1); } break; case Button.DOWN: if (this.cursor < options.length - 1) { success = this.setCursor(this.cursor + 1); + } else { + success = this.setCursor(0); } break; } @@ -261,11 +299,13 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { let isScroll = false; const options = this.getOptionsWithScroll(); if (changed && this.config?.maxOptions && this.config.options.length > this.config.maxOptions) { - const optionsScrollTotal = options.length; if (Math.abs(cursor - this.cursor) === options.length - 1) { + // Wrap around the list + const optionsScrollTotal = this.config.options.length; this.scrollCursor = cursor ? optionsScrollTotal - (this.config.maxOptions - 1) : 0; this.setupOptions(); } else { + // Move the cursor up or down by 1 const isDown = cursor && cursor > this.cursor; if (isDown) { if (options[cursor].label === scrollDownLabel) { @@ -294,7 +334,8 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectContainer.add(this.cursorObj); } - this.cursorObj.setPositionRelative(this.optionSelectBg, 12, 17 + this.cursor * 16); + this.cursorObj.setScale(this.scale * 6); + this.cursorObj.setPositionRelative(this.optionSelectBg, 12, 102*this.scale + this.cursor * (114 * this.scale - 3)); return changed; } diff --git a/src/ui/achv-bar.ts b/src/ui/achv-bar.ts index 05dde03aed7..6e7b3185024 100644 --- a/src/ui/achv-bar.ts +++ b/src/ui/achv-bar.ts @@ -25,10 +25,10 @@ export default class AchvBar extends Phaser.GameObjects.Container { } setup(): void { - this.defaultWidth = 160; + this.defaultWidth = 200; this.defaultHeight = 40; - this.bg = this.scene.add.nineslice(0, 0, "achv_bar", null, this.defaultWidth, this.defaultHeight, 41, 6, 16, 4); + this.bg = this.scene.add.nineslice(0, 0, "achv_bar", undefined, this.defaultWidth, this.defaultHeight, 41, 6, 16, 4); this.bg.setOrigin(0, 0); this.add(this.bg); @@ -90,7 +90,7 @@ export default class AchvBar extends Phaser.GameObjects.Container { this.bg.height = Math.max(this.defaultHeight, this.titleText.displayHeight + this.descriptionText.displayHeight + 8); this.icon.y = (this.bg.height / 2) - (this.icon.height / 2); - (this.scene as BattleScene).playSound("achv"); + (this.scene as BattleScene).playSound("se/achv"); this.scene.tweens.add({ targets: this, @@ -119,7 +119,8 @@ export default class AchvBar extends Phaser.GameObjects.Container { this.shown = false; this.setVisible(false); if (this.queue.length) { - this.showAchv(this.queue.shift()); + const shifted = this.queue.shift(); + shifted && this.showAchv(shifted); } } }); diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index b5e17ce2b67..605b8c538a9 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -2,75 +2,122 @@ import BattleScene from "../battle-scene"; import { Button } from "#enums/buttons"; import i18next from "i18next"; import { Achv, achvs, getAchievementDescription } from "../system/achv"; +import { Voucher, getVoucherTypeIcon, getVoucherTypeName, vouchers } from "../system/voucher"; import MessageUiHandler from "./message-ui-handler"; import { addTextObject, TextStyle } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; -import { ParseKeys } from "i18next"; import { PlayerGender } from "#enums/player-gender"; -export default class AchvsUiHandler extends MessageUiHandler { - private achvsContainer: Phaser.GameObjects.Container; - private achvIconsContainer: Phaser.GameObjects.Container; +enum Page { + ACHIEVEMENTS, + VOUCHERS +} + +interface LanguageSetting { + TextSize: string, +} + +const languageSettings: { [key: string]: LanguageSetting } = { + "de":{ + TextSize: "80px" + } +}; + +export default class AchvsUiHandler extends MessageUiHandler { + private readonly ROWS = 4; + private readonly COLS = 17; + + private mainContainer: Phaser.GameObjects.Container; + private iconsContainer: Phaser.GameObjects.Container; + + private headerBg: Phaser.GameObjects.NineSlice; + private headerText: Phaser.GameObjects.Text; + private headerActionText: Phaser.GameObjects.Text; + private headerActionButton: Phaser.GameObjects.Sprite; + private headerBgX: number; + private iconsBg: Phaser.GameObjects.NineSlice; + private icons: Phaser.GameObjects.Sprite[]; - private achvIconsBg: Phaser.GameObjects.NineSlice; - private achvIcons: Phaser.GameObjects.Sprite[]; private titleText: Phaser.GameObjects.Text; private scoreText: Phaser.GameObjects.Text; private unlockText: Phaser.GameObjects.Text; - private cursorObj: Phaser.GameObjects.NineSlice; + private achvsName: string; + private achvsTotal: number; + private vouchersName: string; + private vouchersTotal: number; + private currentTotal: number; - constructor(scene: BattleScene, mode?: Mode) { + private scrollCursor: number; + private cursorObj: Phaser.GameObjects.NineSlice | null; + private currentPage: Page; + + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); + + this.achvsTotal = Object.keys(achvs).length; + this.vouchersTotal = Object.keys(vouchers).length; + this.scrollCursor = 0; } setup() { const ui = this.getUi(); - this.achvsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.mainContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - this.achvsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.mainContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); - const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); - headerBg.setOrigin(0, 0); + this.headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); + this.headerBg.setOrigin(0, 0); + + 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", "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"}); + this.headerActionText.setOrigin(0, 0); + this.headerActionText.setPositionRelative(this.headerBg, 264, 8); // We need to get the player gender from the game data to add the correct prefix to the achievement name - const playerGender = this.scene.gameData.gender; - let genderPrefix = "PGM"; - if (playerGender === PlayerGender.FEMALE) { - genderPrefix = "PGF"; - } + const genderIndex = this.scene.gameData.gender ?? PlayerGender.MALE; + const genderStr = PlayerGender[genderIndex].toLowerCase(); - const headerText = addTextObject(this.scene, 0, 0, i18next.t(`${genderPrefix}achv:Achievements.name` as ParseKeys), TextStyle.SETTINGS_LABEL); - headerText.setOrigin(0, 0); - headerText.setPositionRelative(headerBg, 8, 4); + this.achvsName = i18next.t("achv:Achievements.name", { context: genderStr }); + this.vouchersName = i18next.t("voucher:vouchers"); - this.achvIconsBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - headerBg.height - 68); - this.achvIconsBg.setOrigin(0, 0); + this.iconsBg = addWindow(this.scene, 0, this.headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - this.headerBg.height - 68); + this.iconsBg.setOrigin(0, 0); - this.achvIconsContainer = this.scene.add.container(6, headerBg.height + 6); + this.iconsContainer = this.scene.add.container(6, this.headerBg.height + 6); - this.achvIcons = []; + this.icons = []; - for (let a = 0; a < Object.keys(achvs).length; a++) { - const x = (a % 17) * 18; - const y = Math.floor(a / 17) * 18; + for (let a = 0; a < this.ROWS * this.COLS; a++) { + const x = (a % this.COLS) * 18; + const y = Math.floor(a / this.COLS) * 18; const icon = this.scene.add.sprite(x, y, "items", "unknown"); icon.setOrigin(0, 0); icon.setScale(0.5); - this.achvIcons.push(icon); - this.achvIconsContainer.add(icon); + this.icons.push(icon); + this.iconsContainer.add(icon); } - const titleBg = addWindow(this.scene, 0, headerBg.height + this.achvIconsBg.height, 174, 24); + const titleBg = addWindow(this.scene, 0, this.headerBg.height + this.iconsBg.height, 174, 24); titleBg.setOrigin(0, 0); this.titleText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); + const textSize = languageSettings[i18next.language]?.TextSize ?? this.titleText.style.fontSize; + this.titleText.setFontSize(textSize); this.titleText.setOrigin(0, 0); - this.titleText.setPositionRelative(titleBg, 8, 4); + const titleBgCenterX = titleBg.x + titleBg.width / 2; + const titleBgCenterY = titleBg.y + titleBg.height / 2; + this.titleText.setOrigin(0.5, 0.5); + this.titleText.setPosition(titleBgCenterX, titleBgCenterY); const scoreBg = addWindow(this.scene, titleBg.x + titleBg.width, titleBg.y, 46, 24); scoreBg.setOrigin(0, 0); @@ -96,49 +143,40 @@ export default class AchvsUiHandler extends MessageUiHandler { this.message = descriptionText; - this.achvsContainer.add(headerBg); - this.achvsContainer.add(headerText); - this.achvsContainer.add(this.achvIconsBg); - this.achvsContainer.add(this.achvIconsContainer); - this.achvsContainer.add(titleBg); - this.achvsContainer.add(this.titleText); - this.achvsContainer.add(scoreBg); - this.achvsContainer.add(this.scoreText); - this.achvsContainer.add(unlockBg); - this.achvsContainer.add(this.unlockText); - this.achvsContainer.add(descriptionBg); - this.achvsContainer.add(descriptionText); + this.mainContainer.add(this.headerBg); + this.mainContainer.add(this.headerActionButton); + this.mainContainer.add(this.headerText); + this.mainContainer.add(this.headerActionText); + this.mainContainer.add(this.iconsBg); + this.mainContainer.add(this.iconsContainer); + this.mainContainer.add(titleBg); + this.mainContainer.add(this.titleText); + this.mainContainer.add(scoreBg); + this.mainContainer.add(this.scoreText); + this.mainContainer.add(unlockBg); + this.mainContainer.add(this.unlockText); + this.mainContainer.add(descriptionBg); + this.mainContainer.add(descriptionText); - ui.add(this.achvsContainer); + ui.add(this.mainContainer); + this.currentPage = Page.ACHIEVEMENTS; this.setCursor(0); - this.achvsContainer.setVisible(false); + this.mainContainer.setVisible(false); } show(args: any[]): boolean { super.show(args); - const achvUnlocks = this.scene.gameData.achvUnlocks; + this.headerBgX = this.headerBg.getTopRight().x; + this.updateAchvIcons(); - Object.values(achvs).forEach((achv: Achv, i: integer) => { - const icon = this.achvIcons[i]; - const unlocked = achvUnlocks.hasOwnProperty(achv.id); - const hidden = !unlocked && achv.secret && (!achv.parentId || !achvUnlocks.hasOwnProperty(achv.parentId)); - const tinted = !hidden && !unlocked; - - icon.setFrame(!hidden ? achv.iconImage : "unknown"); - if (tinted) { - icon.setTintFill(0); - } else { - icon.clearTint(); - } - }); - - this.achvsContainer.setVisible(true); + this.mainContainer.setVisible(true); this.setCursor(0); + this.setScrollCursor(0); - this.getUi().moveTo(this.achvsContainer, this.getUi().length - 1); + this.getUi().moveTo(this.mainContainer, this.getUi().length - 1); this.getUi().hideTooltip(); @@ -147,13 +185,10 @@ export default class AchvsUiHandler extends MessageUiHandler { protected showAchv(achv: Achv) { // We need to get the player gender from the game data to add the correct prefix to the achievement name - const playerGender = this.scene.gameData.gender; - let genderPrefix = "PGM"; - if (playerGender === PlayerGender.FEMALE) { - genderPrefix = "PGF"; - } + const genderIndex = this.scene.gameData.gender ?? PlayerGender.MALE; + const genderStr = PlayerGender[genderIndex].toLowerCase(); - achv.name = i18next.t(`${genderPrefix}achv:${achv.localizationKey}.name` as ParseKeys); + achv.name = i18next.t(`achv:${achv.localizationKey}.name`, { context: genderStr }); achv.description = getAchievementDescription(achv.localizationKey); const achvUnlocks = this.scene.gameData.achvUnlocks; const unlocked = achvUnlocks.hasOwnProperty(achv.id); @@ -161,7 +196,16 @@ export default class AchvsUiHandler extends MessageUiHandler { this.titleText.setText(unlocked ? achv.name : "???"); this.showText(!hidden ? achv.description : ""); this.scoreText.setText(`${achv.score}pt`); - this.unlockText.setText(unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : i18next.t(`${genderPrefix}achv:Locked.name` as ParseKeys)); + this.unlockText.setText(unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : i18next.t("achv:Locked.name")); + } + + protected showVoucher(voucher: Voucher) { + const voucherUnlocks = this.scene.gameData.voucherUnlocks; + const unlocked = voucherUnlocks.hasOwnProperty(voucher.id); + + this.titleText.setText(getVoucherTypeName(voucher.voucherType)); + this.showText(voucher.description); + this.unlockText.setText(unlocked ? new Date(voucherUnlocks[voucher.id]).toLocaleDateString() : i18next.t("voucher:locked")); } processInput(button: Button): boolean { @@ -169,28 +213,56 @@ export default class AchvsUiHandler extends MessageUiHandler { let success = false; + if (button === Button.ACTION) { + success = true; + this.setScrollCursor(0); + if (this.currentPage === Page.ACHIEVEMENTS) { + this.currentPage = Page.VOUCHERS; + this.updateVoucherIcons(); + } else if (this.currentPage === Page.VOUCHERS) { + this.currentPage = Page.ACHIEVEMENTS; + this.updateAchvIcons(); + } + this.setCursor(0, true); + this.mainContainer.update(); + } if (button === Button.CANCEL) { success = true; this.scene.ui.revertMode(); } else { + const rowIndex = Math.floor(this.cursor / this.COLS); + const itemOffset = (this.scrollCursor * this.COLS); switch (button) { case Button.UP: - if (this.cursor >= 17) { - success = this.setCursor(this.cursor - 17); + if (this.cursor < this.COLS) { + if (this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1); + } + } else { + success = this.setCursor(this.cursor - this.COLS); } break; case Button.DOWN: - if (this.cursor + 17 < Object.keys(achvs).length) { - success = this.setCursor(this.cursor + 17); + const canMoveDown = (this.cursor + itemOffset) + this.COLS < this.currentTotal; + if (rowIndex >= this.ROWS - 1) { + if (this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS && canMoveDown) { + success = this.setScrollCursor(this.scrollCursor + 1); + } + } else if (canMoveDown) { + success = this.setCursor(this.cursor + this.COLS); } break; case Button.LEFT: - if (this.cursor) { + if (!this.cursor && this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1) && this.setCursor(this.cursor + (this.COLS - 1)); + } else if (this.cursor) { success = this.setCursor(this.cursor - 1); } break; case Button.RIGHT: - if (this.cursor < Object.keys(achvs).length - 1) { + if (this.cursor + 1 === this.ROWS * this.COLS && this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS) { + success = this.setScrollCursor(this.scrollCursor + 1) && this.setCursor(this.cursor - (this.COLS - 1)); + } else if (this.cursor + itemOffset < this.currentTotal - 1) { success = this.setCursor(this.cursor + 1); } break; @@ -204,30 +276,141 @@ export default class AchvsUiHandler extends MessageUiHandler { return success; } - setCursor(cursor: integer): boolean { + setCursor(cursor: integer, pageChange?: boolean): boolean { const ret = super.setCursor(cursor); - let updateAchv = ret; + let update = ret; if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight", null, 16, 16, 1, 1, 1, 1); + this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight", undefined, 16, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); - this.achvIconsContainer.add(this.cursorObj); - updateAchv = true; + this.iconsContainer.add(this.cursorObj); + update = true; } - this.cursorObj.setPositionRelative(this.achvIcons[this.cursor], 0, 0); + this.cursorObj.setPositionRelative(this.icons[this.cursor], 0, 0); - if (updateAchv) { - this.showAchv(achvs[Object.keys(achvs)[cursor]]); + if (update || pageChange) { + switch (this.currentPage) { + case Page.ACHIEVEMENTS: + this.showAchv(achvs[Object.keys(achvs)[cursor + this.scrollCursor * this.COLS]]); + break; + case Page.VOUCHERS: + this.showVoucher(vouchers[Object.keys(vouchers)[cursor + this.scrollCursor * this.COLS]]); + break; + } } - return ret; } + /** + * setScrollCursor(scrollCursor: integer) : boolean + * scrollCursor refers to the page's position within the entire sum of the data, unlike cursor, which refers to a user's position within displayed data + * @param takes a scrollCursor that has been updated based on user behavior + * @returns returns a boolean that indicates whether the updated scrollCursor led to an update in the data displayed. + */ + setScrollCursor(scrollCursor: integer): boolean { + if (scrollCursor === this.scrollCursor) { + return false; + } + + this.scrollCursor = scrollCursor; + + switch (this.currentPage) { + case Page.ACHIEVEMENTS: + this.updateAchvIcons(); + this.showAchv(achvs[Object.keys(achvs)[Math.min(this.cursor + this.scrollCursor * this.COLS, Object.values(achvs).length - 1)]]); + break; + case Page.VOUCHERS: + this.updateVoucherIcons(); + this.showVoucher(vouchers[Object.keys(vouchers)[Math.min(this.cursor + this.scrollCursor * this.COLS, Object.values(vouchers).length - 1)]]); + break; + } + return true; + } + + + /** + * updateAchvIcons(): void + * Determines what data is to be displayed on the UI and updates it accordingly based on the current value of this.scrollCursor + */ + updateAchvIcons(): void { + this.headerText.text = this.achvsName; + this.headerActionText.text = this.vouchersName; + const textPosition = this.headerBgX - this.headerActionText.displayWidth - 8; + this.headerActionText.setX(textPosition); + this.headerActionButton.setX(textPosition - this.headerActionButton.displayWidth - 4); + + const achvUnlocks = this.scene.gameData.achvUnlocks; + + const itemOffset = this.scrollCursor * this.COLS; + const itemLimit = this.ROWS * this.COLS; + + const achvRange = Object.values(achvs).slice(itemOffset, itemLimit + itemOffset); + + achvRange.forEach((achv: Achv, i: integer) => { + const icon = this.icons[i]; + const unlocked = achvUnlocks.hasOwnProperty(achv.id); + const hidden = !unlocked && achv.secret && (!achv.parentId || !achvUnlocks.hasOwnProperty(achv.parentId)); + const tinted = !hidden && !unlocked; + + icon.setFrame(!hidden ? achv.iconImage : "unknown"); + icon.setVisible(true); + if (tinted) { + icon.setTintFill(0); + } else { + icon.clearTint(); + } + }); + + if (achvRange.length < this.icons.length) { + this.icons.slice(achvRange.length).map(i => i.setVisible(false)); + } + + this.currentTotal = this.achvsTotal; + } + + /** + * updateVoucherIcons(): void + * Determines what data is to be displayed on the UI and updates it accordingly based on the current value of this.scrollCursor + */ + updateVoucherIcons(): void { + this.headerText.text = this.vouchersName; + this.headerActionText.text = this.achvsName; + const textPosition = this.headerBgX - this.headerActionText.displayWidth - 8; + this.headerActionText.setX(textPosition); + this.headerActionButton.setX(textPosition - this.headerActionButton.displayWidth - 4); + + const voucherUnlocks = this.scene.gameData.voucherUnlocks; + + const itemOffset = this.scrollCursor * this.COLS; + const itemLimit = this.ROWS * this.COLS; + + const voucherRange = Object.values(vouchers).slice(itemOffset, itemLimit + itemOffset); + + voucherRange.forEach((voucher: Voucher, i: integer) => { + const icon = this.icons[i]; + const unlocked = voucherUnlocks.hasOwnProperty(voucher.id); + + icon.setFrame(getVoucherTypeIcon(voucher.voucherType)); + icon.setVisible(true); + if (!unlocked) { + icon.setTintFill(0); + } else { + icon.clearTint(); + } + }); + + if (voucherRange.length < this.icons.length) { + this.icons.slice(voucherRange.length).map(i => i.setVisible(false)); + } + this.currentTotal = this.vouchersTotal; + } + clear() { super.clear(); - this.achvsContainer.setVisible(false); + this.currentPage = Page.ACHIEVEMENTS; + this.mainContainer.setVisible(false); this.eraseCursor(); } diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts new file mode 100644 index 00000000000..c48138853fc --- /dev/null +++ b/src/ui/admin-ui-handler.ts @@ -0,0 +1,88 @@ +import BattleScene from "#app/battle-scene"; +import { ModalConfig } from "./modal-ui-handler"; +import { Mode } from "./ui"; +import * as Utils from "../utils"; +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { Button } from "#app/enums/buttons"; + +export default class AdminUiHandler extends FormModalUiHandler { + + constructor(scene: BattleScene, mode: Mode | null = null) { + super(scene, mode); + } + + setup(): void { + super.setup(); + } + + getModalTitle(config?: ModalConfig): string { + return "Admin panel"; + } + + getFields(config?: ModalConfig): string[] { + return ["Username", "Discord ID"]; + } + + getWidth(config?: ModalConfig): number { + return 160; + } + + getMargin(config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; + } + + getButtonLabels(config?: ModalConfig): string[] { + return ["Link account", "Cancel"]; + } + + processInput(button: Button): boolean { + if (button === Button.SUBMIT && this.submitAction) { + this.submitAction(); + return true; + } + + return false; + } + + show(args: any[]): boolean { + if (super.show(args)) { + const config = args[0] as ModalConfig; + const originalSubmitAction = this.submitAction; + this.submitAction = (_) => { + this.submitAction = originalSubmitAction; + this.scene.ui.setMode(Mode.LOADING, { buttonActions: [] }); + const onFail = error => { + this.scene.ui.setMode(Mode.ADMIN, Object.assign(config, { errorMessage: error?.trim() })); + this.scene.ui.playError(); + }; + if (!this.inputs[0].text) { + return onFail("Username is required"); + } + if (!this.inputs[1].text) { + return onFail("Discord Id is required"); + } + Utils.apiPost("admin/account/discord-link", `username=${encodeURIComponent(this.inputs[0].text)}&discordId=${encodeURIComponent(this.inputs[1].text)}`, "application/x-www-form-urlencoded", true) + .then(response => { + if (!response.ok) { + console.error(response); + } + this.inputs[0].setText(""); + this.inputs[1].setText(""); + this.scene.ui.revertMode(); + }) + .catch((err) => { + console.error(err); + this.scene.ui.revertMode(); + }); + return false; + }; + return true; + } + return false; + + } + + clear(): void { + super.clear(); + } +} diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 9c0a2e7c8ce..42a2396e665 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -1,14 +1,15 @@ import { addTextObject, TextStyle } from "./text"; -import BattleScene from "#app/battle-scene.js"; -import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag.js"; -import { WeatherType } from "#app/data/weather.js"; -import { TerrainType } from "#app/data/terrain.js"; +import BattleScene from "#app/battle-scene"; +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { WeatherType } from "#app/data/weather"; +import { TerrainType } from "#app/data/terrain"; import { addWindow, WindowVariant } from "./ui-theme"; -import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena.js"; +import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; import { BattleSceneEventType, TurnEndEvent } from "../events/battle-scene"; import { ArenaTagType } from "#enums/arena-tag-type"; import TimeOfDayWidget from "./time-of-day-widget"; import * as Utils from "../utils"; +import i18next, {ParseKeys} from "i18next"; /** Enum used to differentiate {@linkcode Arena} effects */ enum ArenaEffectType { @@ -33,7 +34,17 @@ interface ArenaEffectInfo { tagType?: ArenaTagType; } -export default class ArenaFlyout extends Phaser.GameObjects.Container { +export function getFieldEffectText(arenaTagType: string): string { + if (!arenaTagType || arenaTagType === ArenaTagType.NONE) { + return arenaTagType; + } + const effectName = Utils.toCamelCaseString(arenaTagType); + const i18nKey = `arenaFlyout:${effectName}` as ParseKeys; + const resultName = i18next.t(i18nKey); + return (!resultName || resultName === i18nKey) ? Utils.formatText(arenaTagType) : resultName; +} + +export class ArenaFlyout extends Phaser.GameObjects.Container { /** An alias for the scene typecast to a {@linkcode BattleScene} */ private battleScene: BattleScene; @@ -111,7 +122,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { this.flyoutContainer.add(this.flyoutWindowHeader); - this.flyoutTextHeader = addTextObject(this.scene, this.flyoutWidth / 2, 0, "Active Battle Effects", TextStyle.BATTLE_INFO); + this.flyoutTextHeader = addTextObject(this.scene, this.flyoutWidth / 2, 0, i18next.t("arenaFlyout:activeBattleEffects"), TextStyle.BATTLE_INFO); this.flyoutTextHeader.setFontSize(54); this.flyoutTextHeader.setAlign("center"); this.flyoutTextHeader.setOrigin(); @@ -121,21 +132,21 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { this.timeOfDayWidget = new TimeOfDayWidget(this.scene, (this.flyoutWidth / 2) + (this.flyoutWindowHeader.displayWidth / 2)); this.flyoutContainer.add(this.timeOfDayWidget); - this.flyoutTextHeaderPlayer = addTextObject(this.scene, 6, 5, "Player", TextStyle.SUMMARY_BLUE); + this.flyoutTextHeaderPlayer = addTextObject(this.scene, 6, 5, i18next.t("arenaFlyout:player"), TextStyle.SUMMARY_BLUE); this.flyoutTextHeaderPlayer.setFontSize(54); this.flyoutTextHeaderPlayer.setAlign("left"); this.flyoutTextHeaderPlayer.setOrigin(0, 0); this.flyoutContainer.add(this.flyoutTextHeaderPlayer); - this.flyoutTextHeaderField = addTextObject(this.scene, this.flyoutWidth / 2, 5, "Neutral", TextStyle.SUMMARY_GREEN); + this.flyoutTextHeaderField = addTextObject(this.scene, this.flyoutWidth / 2, 5, i18next.t("arenaFlyout:neutral"), TextStyle.SUMMARY_GREEN); this.flyoutTextHeaderField.setFontSize(54); this.flyoutTextHeaderField.setAlign("center"); this.flyoutTextHeaderField.setOrigin(0.5, 0); this.flyoutContainer.add(this.flyoutTextHeaderField); - this.flyoutTextHeaderEnemy = addTextObject(this.scene, this.flyoutWidth - 6, 5, "Enemy", TextStyle.SUMMARY_RED); + this.flyoutTextHeaderEnemy = addTextObject(this.scene, this.flyoutWidth - 6, 5, i18next.t("arenaFlyout:enemy"), TextStyle.SUMMARY_RED); this.flyoutTextHeaderEnemy.setFontSize(54); this.flyoutTextHeaderEnemy.setAlign("right"); this.flyoutTextHeaderEnemy.setOrigin(1, 0); @@ -221,10 +232,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { break; } - textObject.text += Utils.formatText(fieldEffectInfo.name); - if (fieldEffectInfo.effecType === ArenaEffectType.TERRAIN) { - textObject.text += " Terrain"; // Adds 'Terrain' since the enum does not contain it - } + textObject.text += fieldEffectInfo.name; if (fieldEffectInfo.maxDuration !== 0) { textObject.text += " " + fieldEffectInfo.duration + "/" + fieldEffectInfo.maxDuration; @@ -260,7 +268,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { } const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex(e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType) : -1; - let name: string = ArenaTagType[tagAddedEvent.arenaTagType]; + let name: string = getFieldEffectText(ArenaTagType[tagAddedEvent.arenaTagType]); if (isArenaTrapTag) { if (existingTrapTagIndex !== -1) { @@ -295,15 +303,15 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { // Stores the old Weather/Terrain name in case it's in the array already const oldName = - fieldEffectChangedEvent instanceof WeatherChangedEvent - ? WeatherType[fieldEffectChangedEvent.oldWeatherType] - : TerrainType[fieldEffectChangedEvent.oldTerrainType]; + getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent + ? WeatherType[fieldEffectChangedEvent.oldWeatherType] + : TerrainType[fieldEffectChangedEvent.oldTerrainType]); // Stores the new Weather/Terrain info const newInfo = { name: - fieldEffectChangedEvent instanceof WeatherChangedEvent + getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent ? WeatherType[fieldEffectChangedEvent.newWeatherType] - : TerrainType[fieldEffectChangedEvent.newTerrainType], + : TerrainType[fieldEffectChangedEvent.newTerrainType]), effecType: fieldEffectChangedEvent instanceof WeatherChangedEvent ? ArenaEffectType.WEATHER : ArenaEffectType.TERRAIN, 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/awaitable-ui-handler.ts b/src/ui/awaitable-ui-handler.ts index 18635b132f9..2052c6e2ade 100644 --- a/src/ui/awaitable-ui-handler.ts +++ b/src/ui/awaitable-ui-handler.ts @@ -5,10 +5,10 @@ import {Button} from "#enums/buttons"; export default abstract class AwaitableUiHandler extends UiHandler { protected awaitingActionInput: boolean; - protected onActionInput: Function; + protected onActionInput: Function | null; public tutorialActive: boolean = false; - constructor(scene: BattleScene, mode: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); } diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index 70349444647..332fe5f65b9 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -1,19 +1,21 @@ -import { CommandPhase } from "../phases"; import BattleScene from "../battle-scene"; import { getPokeballName } from "../data/pokeball"; -import { addTextObject, TextStyle } from "./text"; +import { addTextObject, getTextStyleOptions, TextStyle } from "./text"; import { Command } from "./command-ui-handler"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; +import { CommandPhase } from "#app/phases/command-phase"; export default class BallUiHandler extends UiHandler { private pokeballSelectContainer: Phaser.GameObjects.Container; private pokeballSelectBg: Phaser.GameObjects.NineSlice; private countsText: Phaser.GameObjects.Text; - private cursorObj: Phaser.GameObjects.Image; + private cursorObj: Phaser.GameObjects.Image | null; + + private scale: number = 0.1666666667; constructor(scene: BattleScene) { super(scene, Mode.BALL); @@ -22,13 +24,7 @@ export default class BallUiHandler extends UiHandler { setup() { const ui = this.getUi(); - this.pokeballSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 115, -49); - this.pokeballSelectContainer.setVisible(false); - ui.add(this.pokeballSelectContainer); - - this.pokeballSelectBg = addWindow(this.scene, 0, 0, 114, 112); - this.pokeballSelectBg.setOrigin(0, 1); - this.pokeballSelectContainer.add(this.pokeballSelectBg); + this.scale = getTextStyleOptions(TextStyle.WINDOW, this.scene.uiTheme).scale; let optionsTextContent = ""; @@ -37,14 +33,22 @@ export default class BallUiHandler extends UiHandler { } optionsTextContent += "Cancel"; const optionsText = addTextObject(this.scene, 0, 0, optionsTextContent, TextStyle.WINDOW, { align: "right", maxLines: 6 }); + const optionsTextWidth = optionsText.displayWidth; + this.pokeballSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 51 - Math.max(64, optionsTextWidth), -49); + this.pokeballSelectContainer.setVisible(false); + ui.add(this.pokeballSelectContainer); + + this.pokeballSelectBg = addWindow(this.scene, 0, 0, 50 + Math.max(64, optionsTextWidth), 32 + 480 * this.scale); + this.pokeballSelectBg.setOrigin(0, 1); + this.pokeballSelectContainer.add(this.pokeballSelectBg); + this.pokeballSelectContainer.add(optionsText); optionsText.setOrigin(0, 0); optionsText.setPositionRelative(this.pokeballSelectBg, 42, 9); - optionsText.setLineSpacing(12); - this.pokeballSelectContainer.add(optionsText); + optionsText.setLineSpacing(this.scale * 72); this.countsText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { maxLines: 5 }); this.countsText.setPositionRelative(this.pokeballSelectBg, 18, 9); - this.countsText.setLineSpacing(12); + this.countsText.setLineSpacing(this.scale * 72); this.pokeballSelectContainer.add(this.countsText); this.setCursor(0); @@ -114,7 +118,8 @@ export default class BallUiHandler extends UiHandler { this.pokeballSelectContainer.add(this.cursorObj); } - this.cursorObj.setPositionRelative(this.pokeballSelectBg, 12, 17 + 16 * this.cursor); + this.cursorObj.setScale(this.scale * 6); + this.cursorObj.setPositionRelative(this.pokeballSelectBg, 12, 15 + (6 + this.cursor * 96) * this.scale); return ret; } diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index 5b34a6b5411..fe561b76c9f 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -1,12 +1,13 @@ import { default as Pokemon } from "../field/pokemon"; import { addTextObject, TextStyle } from "./text"; import * as Utils from "../utils"; -import BattleScene from "#app/battle-scene.js"; -import Move from "#app/data/move.js"; +import BattleScene from "#app/battle-scene"; +import Move from "#app/data/move"; import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { UiTheme } from "#enums/ui-theme"; +import { getPokemonNameWithAffix } from "#app/messages"; /** Container for info about a {@linkcode Move} */ interface MoveInfo { @@ -113,8 +114,8 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { initInfo(pokemon: Pokemon) { this.pokemon = pokemon; - this.name = `Flyout ${this.pokemon.name}`; - this.flyoutParent.name = `Flyout Parent ${this.pokemon.name}`; + this.name = `Flyout ${getPokemonNameWithAffix(this.pokemon)}`; + this.flyoutParent.name = `Flyout Parent ${getPokemonNameWithAffix(this.pokemon)}`; this.battleScene.eventTarget.addEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsedEvent); this.battleScene.eventTarget.addEventListener(BattleSceneEventType.BERRY_USED, this.onBerryUsedEvent); @@ -146,7 +147,7 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { const foundInfo = this.moveInfo.find(x => x?.move.id === moveUsedEvent.move.id); if (foundInfo) { - foundInfo.ppUsed = Math.min(foundInfo.ppUsed + moveUsedEvent.ppUsed, foundInfo.maxPp); + foundInfo.ppUsed = moveUsedEvent.ppUsed; } else { this.moveInfo.push({move: moveUsedEvent.move, maxPp: moveUsedEvent.move.pp, ppUsed: moveUsedEvent.ppUsed}); } diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index c246af73d07..05c634609f8 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -7,11 +7,10 @@ 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"; - -const battleStatOrder = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.ACC, BattleStat.EVA, BattleStat.SPD ]; +import i18next from "i18next"; export default class BattleInfo extends Phaser.GameObjects.Container { private baseY: number; @@ -21,17 +20,17 @@ export default class BattleInfo extends Phaser.GameObjects.Container { private boss: boolean; private bossSegments: integer; private offset: boolean; - private lastName: string; + private lastName: string | null; private lastTeraType: Type; private lastStatus: StatusEffect; private lastHp: integer; private lastMaxHp: integer; - private lastHpFrame: string; + private lastHpFrame: string | null; private lastExp: integer; 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; @@ -69,6 +68,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container { public flyoutMenu?: BattleFlyout; + 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); this.baseY = y; @@ -117,7 +120,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.championRibbon.setName("icon_champion_ribbon"); this.championRibbon.setVisible(false); this.championRibbon.setOrigin(0, 0); - this.championRibbon.setPositionRelative(this.nameText, 11.75, 11.75); + this.championRibbon.setPositionRelative(this.nameText, 8, 11.75); this.add(this.championRibbon); } @@ -221,20 +224,44 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.statValuesContainer = this.scene.add.container(0, 0); this.statsContainer.add(this.statValuesContainer); - battleStatOrder.map((s, i) => { - const statX = i > 1 ? this.statNumbers[i - 2].x + this.statNumbers[i - 2].width + 4 : -this.statsBox.width + 8; - const statY = -this.statsBox.height / 2 + 4 + (i < battleStatOrder.length - 1 ? (i % 2 ? 10 : 0) : 5); - const statLabel = this.scene.add.sprite(statX, statY, "pbinfo_stat", BattleStat[s]); + // this gives us a different starting location from the left of the label and padding between stats for a player vs enemy + // since the player won't have HP to show, it doesn't need to change from the current version + 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.statOrder = this.player ? this.statOrderPlayer : this.statOrderEnemy; // this tells us whether or not to use the player or enemy battle stat order + + 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 + const statX = i > statOverflow ? this.statNumbers[Math.max(i - 2, 0)].x + this.statNumbers[Math.max(i - 2, 0)].width + paddingX : startingX; // we have the Math.max(i - 2, 0) in there so for i===1 to not return a negative number; since this is now based on anything >0 instead of >1, we need to allow for i-2 < 0 + + 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.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", 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", "3"); + 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.statOrder[i] === Stat.HP) { + statLabel.setVisible(false); + statNumber.setVisible(false); + } + }); if (!this.player) { @@ -266,19 +293,23 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.add(this.effectivenessContainer); this.effectivenessText = addTextObject(this.scene, 5, 4.5, "", TextStyle.BATTLE_INFO); - this.effectivenessWindow = addWindow((this.scene as BattleScene), 0, 0, 0, 20, false, false, null, null, WindowVariant.XTHIN); + this.effectivenessWindow = addWindow((this.scene as BattleScene), 0, 0, 0, 20, undefined, false, undefined, undefined, WindowVariant.XTHIN); this.effectivenessContainer.add(this.effectivenessWindow); this.effectivenessContainer.add(this.effectivenessText); } } + getStatsValueContainer(): Phaser.GameObjects.Container { + return this.statValuesContainer; + } + initInfo(pokemon: Pokemon) { this.updateNameText(pokemon); const nameTextWidth = this.nameText.displayWidth; - this.name = pokemon.name; - this.box.name = pokemon.name; + this.name = pokemon.getNameToRender(); + this.box.name = pokemon.getNameToRender(); this.flyoutMenu?.initInfo(pokemon); @@ -292,7 +323,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN); this.teraIcon.on("pointerover", () => { if (this.lastTeraType !== Type.UNKNOWN) { - (this.scene as BattleScene).ui.showTooltip(null, `${Utils.toReadableString(Type[this.lastTeraType])} Terastallized`); + (this.scene as BattleScene).ui.showTooltip("", `${Utils.toReadableString(Type[this.lastTeraType])} Terastallized`); } }); this.teraIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); @@ -302,7 +333,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 2.5); this.splicedIcon.setVisible(isFusion); if (this.splicedIcon.visible) { - this.splicedIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies.getName(pokemon.fusionFormIndex)}`)); + this.splicedIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies?.getName(pokemon.fusionFormIndex)}`)); this.splicedIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } @@ -315,9 +346,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.shinyIcon.setTint(getVariantTint(baseVariant)); if (this.shinyIcon.visible) { const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? "Epic" : baseVariant === 1 ? "Rare" : "Common"}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? "Epic" : pokemon.fusionVariant === 1 ? "Rare" : "Common"}` : ""}` + `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` : ""; - this.shinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`)); + this.shinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`)); this.shinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } @@ -328,6 +359,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } if (!this.player) { + if (this.nameText.visible) { + this.nameText.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", i18next.t("battleInfo:generation", { generation: i18next.t(`starterSelectUiHandler:gen${pokemon.species.generation}`) }))); + this.nameText.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + } + const dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId]; this.ownedIcon.setVisible(!!dexEntry.caughtAttr); const opponentPokemonDexAttr = pokemon.getDexAttr(); @@ -340,18 +376,21 @@ export default class BattleInfo extends Phaser.GameObjects.Container { // Check if Player owns all genders and forms of the Pokemon const missingDexAttrs = ((dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr); - /** - * If the opposing Pokemon only has 1 normal ability and is using the hidden ability it should have the same behavior - * if it had 2 normal abilities. This code checks if that is the case and uses the correct opponent Pokemon abilityIndex (2) - * for calculations so it aligns with where the hidden ability is stored in the starter data's abilityAttr (4) - */ - const opponentPokemonOneNormalAbility = (pokemon.species.getAbilityCount() === 2); - const opponentPokemonAbilityIndex = (opponentPokemonOneNormalAbility && pokemon.abilityIndex === 1) ? 2 : pokemon.abilityIndex; - const opponentPokemonAbilityAttr = Math.pow(2, opponentPokemonAbilityIndex); + const ownedAbilityAttrs = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr; - const rootFormHasHiddenAbility = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & opponentPokemonAbilityAttr; + let playerOwnsThisAbility = false; + // Check if the player owns ability for the root form + if ((ownedAbilityAttrs & 1) > 0 && pokemon.hasSameAbilityInRootForm(0)) { + playerOwnsThisAbility = true; + } + if ((ownedAbilityAttrs & 2) > 0 && pokemon.hasSameAbilityInRootForm(1)) { + playerOwnsThisAbility = true; + } + if ((ownedAbilityAttrs & 4) > 0 && pokemon.hasSameAbilityInRootForm(2)) { + playerOwnsThisAbility = true; + } - if (missingDexAttrs || !rootFormHasHiddenAbility) { + if (missingDexAttrs || !playerOwnsThisAbility) { this.ownedIcon.setTint(0x808080); } @@ -394,10 +433,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.statValuesContainer.setPosition(8, 7); } - const battleStats = 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 { @@ -463,7 +502,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { updateBossSegmentDividers(pokemon: EnemyPokemon): void { while (this.hpBarSegmentDividers.length) { - this.hpBarSegmentDividers.pop().destroy(); + this.hpBarSegmentDividers.pop()?.destroy(); } if (this.boss && this.bossSegments > 1) { @@ -501,7 +540,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { return resolve(); } - const nameUpdated = this.lastName !== pokemon.name; + const nameUpdated = this.lastName !== pokemon.getNameToRender(); if (nameUpdated) { this.updateNameText(pokemon); @@ -532,11 +571,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (this.lastStatus !== StatusEffect.NONE) { this.statusIndicator.setFrame(StatusEffect[this.lastStatus].toLowerCase()); } - this.statusIndicator.setVisible(!!this.lastStatus); - if (!this.player && this.ownedIcon.visible) { - this.ownedIcon.setAlpha(this.statusIndicator.visible ? 0 : 1); - } + const offsetX = !this.player ? (this.ownedIcon.visible ? 8 : 0) + (this.championRibbon.visible ? 8 : 0) : 0; + this.statusIndicator.setPositionRelative(this.nameText, offsetX, 11.5); + + this.statusIndicator.setVisible(!!this.lastStatus); } const types = pokemon.getTypes(true); @@ -611,14 +650,12 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastLevel = pokemon.level; } - const battleStats = pokemon.summonData - ? pokemon.summonData.battleStats - : 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()); @@ -628,7 +665,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } updateNameText(pokemon: Pokemon): void { - let displayName = pokemon.name.replace(/[♂♀]/g, ""); + let displayName = pokemon.getNameToRender().replace(/[♂♀]/g, ""); let nameTextWidth: number; const nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.BATTLE_INFO); @@ -643,7 +680,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { nameSizeTest.destroy(); this.nameText.setText(displayName); - this.lastName = pokemon.name; + this.lastName = pokemon.getNameToRender(); + + if (this.nameText.visible) { + this.nameText.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.nameText.width, this.nameText.height), Phaser.Geom.Rectangle.Contains); + } } updatePokemonExp(pokemon: Pokemon, instant?: boolean, levelDurationMultiplier: number = 1): Promise { @@ -670,7 +711,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastLevelExp = pokemon.levelExp; } if (duration) { - (this.scene as BattleScene).playSound("exp"); + (this.scene as BattleScene).playSound("se/exp"); } this.scene.tweens.add({ targets: this.expMaskRect, @@ -682,10 +723,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container { return resolve(); } if (duration) { - this.scene.sound.stopByKey("exp"); + this.scene.sound.stopByKey("se/exp"); } if (ratio === 1) { - (this.scene as BattleScene).playSound("level_up"); + (this.scene as BattleScene).playSound("se/level_up"); this.setLevel(this.lastLevel); this.scene.time.delayedCall(500 * levelDurationMultiplier, () => { this.expMaskRect.x = 0; @@ -726,9 +767,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } } - updateBattleStats(battleStats: integer[]): void { - battleStatOrder.map((s, i) => { - 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()); + } }); } @@ -755,7 +798,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } this.currentEffectiveness = effectiveness; - if (!(this.scene as BattleScene).typeHints || effectiveness === undefined || this.flyoutMenu.flyoutVisible) { + if (!(this.scene as BattleScene).typeHints || effectiveness === undefined || this.flyoutMenu?.flyoutVisible) { this.effectivenessContainer.setVisible(false); return; } diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index f2da553c6da..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; @@ -116,7 +116,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.levelUpStatsIncrContent = levelUpStatsIncrContent; - const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, "", TextStyle.WINDOW, { maxLines: 6 , lineSpacing: 5}); + const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, "", TextStyle.WINDOW, { maxLines: 6, lineSpacing: 5}); levelUpStatsValuesContent.setOrigin(1, 0); levelUpStatsValuesContent.setAlign("right"); levelUpStatsContainer.add(levelUpStatsValuesContent); @@ -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; } @@ -147,19 +147,23 @@ export default class BattleMessageUiHandler extends MessageUiHandler { } } } + + return false; } clear() { super.clear(); } - showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { this.hideNameText(); super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); } - showDialogue(text: string, name: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { - this.showNameText(name); + showDialogue(text: string, name?: string, delay?: integer | null, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + if (name) { + this.showNameText(name); + } super.showDialogue(text, name, delay, callback, callbackDelay, prompt, promptDelay); } @@ -170,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; @@ -180,7 +183,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.awaitingActionInput = true; this.onActionInput = () => { if (!showTotals) { - return this.promptLevelUpStats(partyMemberIndex, null, true).then(() => resolve()); + return this.promptLevelUpStats(partyMemberIndex, [], true).then(() => resolve()); } else { this.levelUpStatsContainer.setVisible(false); resolve(); @@ -193,27 +196,9 @@ export default class BattleMessageUiHandler extends MessageUiHandler { return new Promise(resolve => { this.scene.executeWithSeedOffset(() => { let levelUpStatsValuesText = ""; - const stats = Utils.getEnumValues(Stat); - let shownStats: Stat[] = []; - if (shownIvsCount < 6) { - const statsPool = stats.slice(0); - for (let i = 0; i < shownIvsCount; i++) { - let shownStat: Stat; - let highestIv = -1; - statsPool.map(s => { - if (ivs[s] > highestIv) { - shownStat = s as Stat; - highestIv = ivs[s]; - } - }); - shownStats.push(shownStat); - statsPool.splice(statsPool.indexOf(shownStat), 1); - } - } else { - shownStats = stats; - } - for (const s of stats) { - levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s], s, pokemonId) : "???"}\n`; + const shownStats = this.getTopIvs(ivs, shownIvsCount); + 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); @@ -227,35 +212,59 @@ export default class BattleMessageUiHandler extends MessageUiHandler { }); } + getTopIvs(ivs: integer[], shownIvsCount: integer): Stat[] { + let shownStats: Stat[] = []; + if (shownIvsCount < 6) { + const statsPool = PERMANENT_STATS.slice(); + // Sort the stats from highest to lowest iv + statsPool.sort((s1, s2) => ivs[s2] - ivs[s1]); + for (let i = 0; i < shownIvsCount; i++) { + shownStats.push(statsPool[i]); + } + } else { + shownStats = PERMANENT_STATS.slice(); + } + return shownStats; + } + getIvDescriptor(value: integer, typeIv: integer, pokemonId: integer): string { - const starterSpecies = this.scene.getPokemonById(pokemonId).species.getRootSpeciesId(true); + const starterSpecies = this.scene.getPokemonById(pokemonId)!.species.getRootSpeciesId(); // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists const starterIvs: number[] = this.scene.gameData.dexData[starterSpecies].ivs; const uiTheme = (this.scene as BattleScene).uiTheme; // Assuming uiTheme is accessible // Function to wrap text in color based on comparison - const coloredText = (text: string, isBetter: boolean) => { - const textStyle: TextStyle = isBetter ? TextStyle.SUMMARY_GREEN : TextStyle.SUMMARY; + const coloredText = (text: string, isBetter: boolean, ivValue) => { + let textStyle: TextStyle; + if (isBetter) { + if (ivValue === 31) { + textStyle = TextStyle.PERFECT_IV; + } else { + textStyle = TextStyle.SUMMARY_GREEN; + } + } else { + textStyle = TextStyle.WINDOW; + } const color = getTextColor(textStyle, false, uiTheme); return `[color=${color}][shadow=${getTextColor(textStyle, true, uiTheme)}]${text}[/shadow][/color]`; }; if (value > 30) { - return coloredText(i18next.t("battleMessageUiHandler:ivBest"), value > starterIvs[typeIv]); + return coloredText(i18next.t("battleMessageUiHandler:ivBest"), value > starterIvs[typeIv], value); } if (value === 30) { - return coloredText(i18next.t("battleMessageUiHandler:ivFantastic"), value > starterIvs[typeIv]); + return coloredText(i18next.t("battleMessageUiHandler:ivFantastic"), value > starterIvs[typeIv], value); } if (value > 20) { - return coloredText(i18next.t("battleMessageUiHandler:ivVeryGood"), value > starterIvs[typeIv]); + return coloredText(i18next.t("battleMessageUiHandler:ivVeryGood"), value > starterIvs[typeIv], value); } if (value > 10) { - return coloredText(i18next.t("battleMessageUiHandler:ivPrettyGood"), value > starterIvs[typeIv]); + return coloredText(i18next.t("battleMessageUiHandler:ivPrettyGood"), value > starterIvs[typeIv], value); } if (value > 0) { - return coloredText(i18next.t("battleMessageUiHandler:ivDecent"), value > starterIvs[typeIv]); + return coloredText(i18next.t("battleMessageUiHandler:ivDecent"), value > starterIvs[typeIv], value); } - return coloredText(i18next.t("battleMessageUiHandler:ivNoGood"), value > starterIvs[typeIv]); + return coloredText(i18next.t("battleMessageUiHandler:ivNoGood"), value > starterIvs[typeIv], value); } showNameText(name: string): void { diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts index 5bca9632012..936ab91d8fa 100644 --- a/src/ui/bgm-bar.ts +++ b/src/ui/bgm-bar.ts @@ -3,24 +3,16 @@ import {addTextObject, TextStyle} from "./text"; import i18next from "i18next"; import * as Utils from "#app/utils"; - const hiddenX = -150; const shownX = 0; const baseY = 0; - export default class BgmBar extends Phaser.GameObjects.Container { private defaultWidth: number; private defaultHeight: number; private bg: Phaser.GameObjects.NineSlice; private musicText: Phaser.GameObjects.Text; - private noteText: Phaser.GameObjects.Text; - - private tween: Phaser.Tweens.Tween; - private autoHideTimer: NodeJS.Timeout; - private queue: (string)[] = []; - public shown: boolean; @@ -29,19 +21,15 @@ export default class BgmBar extends Phaser.GameObjects.Container { } setup(): void { - this.defaultWidth = 200; + this.defaultWidth = 230; this.defaultHeight = 100; - this.bg = this.scene.add.nineslice(-5, -5, "ability_bar_left", null, this.defaultWidth, this.defaultHeight, 0, 0, 10, 10); + this.bg = this.scene.add.nineslice(-5, -5, "bgm_bar", undefined, this.defaultWidth, this.defaultHeight, 0, 0, 10, 10); this.bg.setOrigin(0, 0); this.add(this.bg); - this.noteText = addTextObject(this.scene, 5, 5, "", TextStyle.MESSAGE, {fontSize: "72px"}); - this.noteText.setOrigin(0, 0); - this.add(this.noteText); - - this.musicText = addTextObject(this.scene, 30, 5, "", TextStyle.MESSAGE, {fontSize: "72px"}); + this.musicText = addTextObject(this.scene, 5, 5, "", TextStyle.BGM_BAR); this.musicText.setOrigin(0, 0); this.musicText.setWordWrapWidth(650, true); @@ -56,16 +44,12 @@ export default class BgmBar extends Phaser.GameObjects.Container { * @param {string} bgmName The name of the BGM to set. */ setBgmToBgmBar(bgmName: string): void { - this.noteText.setText(`${i18next.t("bgmName:music")}:`); - this.musicText.setText(`${this.getRealBgmName(bgmName)}`); - if (!(this.scene as BattleScene).showBgmBar) { - return; - } + this.musicText.setText(`${i18next.t("bgmName:music")}${this.getRealBgmName(bgmName)}`); this.musicText.width = this.bg.width - 20; this.musicText.setWordWrapWidth(this.defaultWidth * 4); - this.bg.width = Math.min(this.defaultWidth, this.noteText.displayWidth + this.musicText.displayWidth + 30); + this.bg.width = Math.min(this.defaultWidth, this.musicText.displayWidth + 23); this.bg.height = Math.min(this.defaultHeight, this.musicText.displayHeight + 20); (this.scene as BattleScene).fieldUI.bringToTop(this); @@ -78,6 +62,16 @@ export default class BgmBar extends Phaser.GameObjects.Container { @param {boolean} visible Whether to show or hide the BGM bar. */ public toggleBgmBar(visible: boolean): void { + /* + Prevents the bar from being displayed if musicText is completely empty. + This can be the case, for example, when the game's 1st music track takes a long time to reach the client, + and the menu is opened before it is played. + */ + if (this.musicText.text === "") { + this.setVisible(false); + return; + } + if (!(this.scene as BattleScene).showBgmBar) { this.setVisible(false); return; @@ -97,5 +91,3 @@ export default class BgmBar extends Phaser.GameObjects.Container { return i18next.t([`bgmName:${bgmName}`, "bgmName:missing_entries"], {name: Utils.formatText(bgmName)}); } } - - diff --git a/src/ui/candy-bar.ts b/src/ui/candy-bar.ts index 3a9f180dd59..14015f02259 100644 --- a/src/ui/candy-bar.ts +++ b/src/ui/candy-bar.ts @@ -11,8 +11,8 @@ export default class CandyBar extends Phaser.GameObjects.Container { private countText: Phaser.GameObjects.Text; private speciesId: Species; - private tween: Phaser.Tweens.Tween; - private autoHideTimer: NodeJS.Timeout; + private tween: Phaser.Tweens.Tween | null; + private autoHideTimer: NodeJS.Timeout | null; public shown: boolean; @@ -21,7 +21,7 @@ export default class CandyBar extends Phaser.GameObjects.Container { } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, "party_exp_bar", null, 8, 18, 21, 5, 6, 4); + this.bg = this.scene.add.nineslice(0, 0, "party_exp_bar", undefined, 8, 18, 21, 5, 6, 4); this.bg.setOrigin(0, 0); this.add(this.bg); @@ -71,7 +71,7 @@ export default class CandyBar extends Phaser.GameObjects.Container { this.tween.stop(); } - (this.scene as BattleScene).playSound("shing"); + (this.scene as BattleScene).playSound("se/shing"); this.tween = this.scene.tweens.add({ targets: this, diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index dce04276a4d..e08736d2b70 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -5,12 +5,13 @@ import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; import i18next from "i18next"; -import { SelectStarterPhase, TitlePhase } from "#app/phases.js"; -import { Challenge, ChallengeType } 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 { 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. @@ -27,13 +28,19 @@ export default class GameChallengesUiHandler extends UiHandler { private descriptionText: BBCodeText; - private challengeLabels: Array<{ label: Phaser.GameObjects.Text, value: Phaser.GameObjects.Text | Phaser.GameObjects.Sprite }>; + private challengeLabels: Array<{ label: Phaser.GameObjects.Text, value: Phaser.GameObjects.Text }>; + private monoTypeValue: Phaser.GameObjects.Sprite; - private cursorObj: Phaser.GameObjects.NineSlice; + private cursorObj: Phaser.GameObjects.NineSlice | null; + private startBg: Phaser.GameObjects.NineSlice; private startCursor: Phaser.GameObjects.NineSlice; + private startText: Phaser.GameObjects.Text; + private hasSelectedChallenge: boolean; - constructor(scene: BattleScene, mode?: Mode) { + private optionsWidth: number; + + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); } @@ -72,18 +79,19 @@ export default class GameChallengesUiHandler extends UiHandler { // difficultyName.setOrigin(0, 0); // difficultyName.setPositionRelative(difficultyBg, difficultyBg.width - difficultyName.displayWidth - 8, 4); - this.optionsBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 9), (this.scene.game.canvas.height / 6) - headerBg.height - 2); + this.optionsWidth = this.scene.scaledCanvas.width * 0.6; + this.optionsBg = addWindow(this.scene, 0, headerBg.height, this.optionsWidth, this.scene.scaledCanvas.height - headerBg.height - 2); this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); - const descriptionBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 18) - 2, (this.scene.game.canvas.height / 6) - headerBg.height - 26); + const descriptionBg = addWindow(this.scene, 0, headerBg.height, this.scene.scaledCanvas.width - this.optionsWidth, this.scene.scaledCanvas.height - headerBg.height - 26); descriptionBg.setName("window-desc-bg"); descriptionBg.setOrigin(0, 0); descriptionBg.setPositionRelative(this.optionsBg, this.optionsBg.width, 0); this.descriptionText = new BBCodeText(this.scene, descriptionBg.x + 6, descriptionBg.y + 4, "", { fontFamily: "emerald", - fontSize: 96, + fontSize: 84, color: Color.ORANGE, padding: { bottom: 6 @@ -99,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, 8, 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", null, (this.scene.game.canvas.width / 18) - 10, 16, 1, 1, 1, 1); + 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, 4); + this.startCursor.setPositionRelative(this.startBg, 4, 3); this.startCursor.setVisible(false); this.valuesContainer = this.scene.add.container(0, 0); @@ -120,33 +128,30 @@ export default class GameChallengesUiHandler extends UiHandler { this.challengeLabels = []; - for (let i = 0; i < Object.keys(ChallengeType).length; i++) { + for (let i = 0; i < 9; i++) { const label = addTextObject(this.scene, 8, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); label.setName(`text-challenge-label-${i}`); label.setOrigin(0, 0); this.valuesContainer.add(label); - let value; - if (i === Challenges.SINGLE_TYPE) { - const type = `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; - value = this.scene.add.sprite(8, 98, type); - value.setName("sprite-single-type"); - value.setScale(0.86); - value.setPositionRelative(label, 113, 8); - } else { - value = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); - value.setName(`text-challenge-value-label-${i}`); - value.setPositionRelative(label, 100, 0); - } - + const value = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); + value.setName(`challenge-value-text-${i}`); + value.setPositionRelative(label, 100, 0); this.valuesContainer.add(value); + this.challengeLabels[i] = { label: label, value: value }; } + this.monoTypeValue = this.scene.add.sprite(8, 98, Utils.getLocalizedSpriteKey("types")); + this.monoTypeValue.setName("challenge-value-monotype-sprite"); + this.monoTypeValue.setScale(0.86); + this.monoTypeValue.setVisible(false); + this.valuesContainer.add(this.monoTypeValue); + this.challengesContainer.add(headerBg); this.challengesContainer.add(headerText); // this.challengesContainer.add(difficultyBg); @@ -155,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); @@ -181,32 +186,54 @@ export default class GameChallengesUiHandler extends UiHandler { * init all challenge labels */ initLabels(): void { - this.setDescription(this.scene.gameMode.challenges[this.cursor].getDescription()); - this.scene.gameMode.challenges.forEach((challenge, i) => { - this.challengeLabels[i].label.setVisible(true); - this.challengeLabels[i].value.setVisible(true); - this.challengeLabels[i].label.setText(challenge.getName()); - if (this.challengeLabels[i].value.type.toLowerCase() === "sprite") { - (this.challengeLabels[i].value as Phaser.GameObjects.Sprite).setFrame(challenge.getValue()); - } else { - (this.challengeLabels[i].value as Phaser.GameObjects.Text).setText(challenge.getValue()); + this.setDescription(this.scene.gameMode.challenges[0].getDescription()); + for (let i = 0; i < 9; i++) { + if (i < this.scene.gameMode.challenges.length) { + this.challengeLabels[i].label.setVisible(true); + this.challengeLabels[i].value.setVisible(true); } - }); + } } /** * update the text the cursor is on */ updateText(): void { - const challenge = this.getActiveChallenge(); - const { id } = challenge; this.setDescription(this.getActiveChallenge().getDescription()); - - if (this.challengeLabels[id].value.type.toLowerCase() === "sprite") { - (this.challengeLabels[id].value as Phaser.GameObjects.Sprite).setFrame(challenge.getValue()); - } else { - (this.challengeLabels[id].value as Phaser.GameObjects.Text).setText(challenge.getValue()); + let monoTypeVisible = false; + for (let i = 0; i < Math.min(9, this.scene.gameMode.challenges.length); i++) { + const challenge = this.scene.gameMode.challenges[this.scrollCursor + i]; + this.challengeLabels[i].label.setText(challenge.getName()); + if (challenge.id === Challenges.SINGLE_TYPE) { + this.monoTypeValue.setPositionRelative(this.challengeLabels[i].label, 113, 8); + this.monoTypeValue.setFrame(challenge.getValue()); + this.monoTypeValue.setVisible(true); + this.challengeLabels[i].value.setVisible(false); + monoTypeVisible = true; + } else { + this.challengeLabels[i].value.setText(challenge.getValue()); + this.challengeLabels[i].value.setVisible(true); + } } + if (!monoTypeVisible) { + 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}` : ""); @@ -218,9 +245,12 @@ 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(); + this.updateText(); this.getUi().moveTo(this.challengesContainer, this.getUi().length - 1); @@ -247,92 +277,92 @@ 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 { this.scene.clearPhaseQueue(); this.scene.pushPhase(new TitlePhase(this.scene)); - this.scene.getCurrentPhase().end(); + this.scene.getCurrentPhase()?.end(); } 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; + this.scene.getCurrentPhase()?.end(); } 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; } } @@ -340,7 +370,6 @@ export default class GameChallengesUiHandler extends UiHandler { if (success) { ui.playSelect(); } - return success; } @@ -348,7 +377,7 @@ export default class GameChallengesUiHandler extends UiHandler { let ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", null, (this.scene.game.canvas.width / 9) - 10, 16, 1, 1, 1, 1); + this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, this.optionsWidth - 8, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); this.valuesContainer.add(this.cursorObj); } diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 8ccd05675c8..764e71a8c3f 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -1,4 +1,3 @@ -import { CommandPhase } from "../phases"; import BattleScene from "../battle-scene"; import { addTextObject, TextStyle } from "./text"; import PartyUiHandler, { PartyUiMode } from "./party-ui-handler"; @@ -6,6 +5,8 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import i18next from "i18next"; import {Button} from "#enums/buttons"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { CommandPhase } from "#app/phases/command-phase"; export enum Command { FIGHT = 0, @@ -16,7 +17,7 @@ export enum Command { export default class CommandUiHandler extends UiHandler { private commandsContainer: Phaser.GameObjects.Container; - private cursorObj: Phaser.GameObjects.Image; + private cursorObj: Phaser.GameObjects.Image | null; protected fieldIndex: integer = 0; protected cursor2: integer = 0; @@ -66,8 +67,12 @@ export default class CommandUiHandler extends UiHandler { messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(1110); - messageHandler.showText(i18next.t("commandUiHandler:actionMessage", {pokemonName: commandPhase.getPokemon().name}), 0); - this.setCursor(this.getCursor()); + messageHandler.showText(i18next.t("commandUiHandler:actionMessage", {pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon())}), 0); + if (this.getCursor() === Command.POKEMON) { + this.setCursor(Command.FIGHT); + } else { + this.setCursor(this.getCursor()); + } return true; } @@ -84,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; } @@ -92,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/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index 953ed4972ac..4a60b0c9689 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -4,6 +4,7 @@ import { Mode } from "./ui"; import i18next from "i18next"; import {Button} from "#enums/buttons"; + export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { public static readonly windowWidth: integer = 48; @@ -20,7 +21,44 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { } show(args: any[]): boolean { - if (args.length >= 2 && args[0] instanceof Function && args[1] instanceof Function) { + if (args.length === 4 && args[0] instanceof Function && args[1] instanceof Function && args[2] instanceof Function && args[3] === "fullParty") { + const config: OptionSelectConfig = { + options: [ + { + label: i18next.t("partyUiHandler:SUMMARY"), + handler: () => { + args[0](); + return true; + }, + }, { + label: i18next.t("menu:yes"), + handler: () => { + args[1](); + return true; + } + }, { + label: i18next.t("menu:no"), + handler: () => { + args[2](); + return true; + } + } + ], + delay: args.length >= 8 && args[7] !== null ? args[7] as integer : 0 + }; + + super.show([ config ]); + + this.switchCheck = args.length >= 5 && args[4] !== null && args[4] as boolean; + + const xOffset = (args.length >= 6 && args[5] !== null ? args[5] as number : 0); + const yOffset = (args.length >= 7 && args[6] !== null ? args[6] as number : 0); + + this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 + xOffset, -48 + yOffset); + + this.setCursor(this.switchCheck ? this.switchCheckCursor : 0); + return true; + } else if (args.length >= 2 && args[0] instanceof Function && args[1] instanceof Function) { const config: OptionSelectConfig = { options: [ { @@ -54,7 +92,6 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { return true; } - return false; } diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index 212d7b2a66c..b535a94d35c 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -59,14 +59,14 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { } setup() { - const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN); + const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, undefined, undefined, WindowVariant.THIN); this.add(titleWindow); this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t("menu:loading"), TextStyle.WINDOW, { fontSize: "64px" }); this.titleLabel.setOrigin(0.5, 0.5); this.add(this.titleLabel); - const window = addWindow(this.scene, 0, 17, 114, 118, false, false, null, null, WindowVariant.THIN); + const window = addWindow(this.scene, 0, 17, 114, 118, false, false, undefined, undefined, WindowVariant.THIN); this.add(window); this.rankingsContainer = this.scene.add.container(6, 21); diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts new file mode 100644 index 00000000000..4e1235c211d --- /dev/null +++ b/src/ui/dropdown.ts @@ -0,0 +1,596 @@ +import BattleScene from "#app/battle-scene"; +import { SceneBase } from "#app/scene-base"; +import { addTextObject, TextStyle } from "./text"; +import { addWindow, WindowVariant } from "./ui-theme"; +import i18next from "i18next"; + +export enum DropDownState { + ON = 0, + OFF = 1, + EXCLUDE = 2, + UNLOCKABLE = 3 +} + +export enum DropDownType { + SINGLE = 0, + MULTI = 1, + HYBRID = 2, + RADIAL = 3 +} + +export enum SortDirection { + ASC = -1, + DESC = 1 +} + +export enum SortCriteria { + NUMBER = 0, + COST = 1, + CANDY = 2, + IV = 3, + NAME = 4 +} + +export class DropDownLabel { + public state: DropDownState; + public text: string; + public sprite?: Phaser.GameObjects.Sprite; + + constructor(label: string, sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.OFF) { + this.text = label || ""; + this.sprite = sprite; + this.state = state; + } +} + + +export class DropDownOption extends Phaser.GameObjects.Container { + public state: DropDownState = DropDownState.ON; + public toggle: Phaser.GameObjects.Sprite; + public text: Phaser.GameObjects.Text; + public val: any; + public dir: SortDirection = SortDirection.ASC; + private currentLabelIndex: number; + private labels: DropDownLabel[]; + private onColor = 0x33bbff; + private offColor = 0x272727; + private excludeColor = 0xff5555; + private unlockableColor = 0xffff00; + + constructor(scene: SceneBase, val: any, labels: DropDownLabel | DropDownLabel[]) { + super(scene); + this.val = val; + + if (Array.isArray(labels)) { + this.labels = labels; + } else { + this.labels = labels? [ labels ] : [ new DropDownLabel("") ]; + } + this.currentLabelIndex = 0; + const currentLabel = this.labels[this.currentLabelIndex]; + + this.state = currentLabel.state; + this.text = addTextObject(scene, 0, 0, currentLabel.text || "", TextStyle.TOOLTIP_CONTENT); + this.text.setOrigin(0, 0.5); + this.add(this.text); + + // Add to container the sprite for each label if there is one + for (let i=0; i < this.labels.length; i++) { + const sprite = this.labels[i].sprite; + if (sprite) { + this.add(sprite); + sprite.setOrigin(0, 0.5); + if (i!== this.currentLabelIndex) { + sprite.setVisible(false); + } + } + } + } + + /** + * Initialize the toggle icon based on the provided DropDownType + * For DropDownType.SINGLE: uses a cursor arrow icon + * For other types: uses a candy icon + * @param type the DropDownType to use + * @param visible whether the icon should be visible or not + */ + setupToggleIcon(type: DropDownType, visible: boolean): void { + if (type === DropDownType.SINGLE) { + this.toggle = this.scene.add.sprite(0, 0, "cursor"); + this.toggle.setScale(0.5); + this.toggle.setOrigin(0, 0.5); + this.toggle.setRotation(Math.PI / 180 * -90); + } else { + this.toggle = this.scene.add.sprite(0, 0, "candy"); + this.toggle.setScale(0.3); + this.toggle.setOrigin(0, 0.5); + } + this.add(this.toggle); + this.toggle.setVisible(visible); + this.updateToggleIconColor(); + } + + /** + * Set the toggle icon color based on the current state + */ + private updateToggleIconColor(): void { + switch (this.state) { + case DropDownState.ON: + this.toggle.setTint(this.onColor); + break; + case DropDownState.OFF: + this.toggle.setTint(this.offColor); + break; + case DropDownState.EXCLUDE: + this.toggle.setTint(this.excludeColor); + break; + case DropDownState.UNLOCKABLE: + this.toggle.setTint(this.unlockableColor); + break; + } + } + + /** + * Switch the option to its next state and update visuals + * If only ON/OFF are possible, toggle between the two + * For radials, move to the next state in the list + * @returns the updated DropDownState + */ + public toggleOptionState(): DropDownState { + if (this.labels.length > 1) { + return this.setCurrentLabel((this.currentLabelIndex + 1) % this.labels.length); + } + const newState = this.state === DropDownState.ON ? DropDownState.OFF : DropDownState.ON; + return this.setOptionState(newState); + } + + /** + * Set the option to the given state and update visuals + * @param newState the state to switch to + * @returns the new DropDownState + */ + public setOptionState(newState: DropDownState): DropDownState { + const newLabelIndex = this.labels.findIndex(label => label.state === newState); + if (newLabelIndex !== -1 && newLabelIndex !== this.currentLabelIndex) { + return this.setCurrentLabel(newLabelIndex); + } + + this.state = newState; + this.updateToggleIconColor(); + return newState; + } + + /** + * Change the option state to the one at the given index and update visuals + * @param index index of the state to switch to + * @returns the new DropDownState + */ + private setCurrentLabel(index: number): DropDownState { + const currentLabel = this.labels[this.currentLabelIndex]; + const newLabel = this.labels[index]; + + if (!newLabel) { + return this.state; + } + + this.currentLabelIndex = index; + + // update state, sprite and text to fit the new label + this.state = newLabel.state; + this.updateToggleIconColor(); + + if (currentLabel.sprite) { + this.text.x -= currentLabel.sprite.displayWidth + 2; + currentLabel.sprite.setVisible(false); + } + if (newLabel.sprite) { + this.text.x += newLabel.sprite.displayWidth + 2; + newLabel.sprite.setVisible(true); + } + this.text.setText(newLabel.text); + + return this.state; + } + + /** + * Set the current SortDirection to the provided value and update icon accordingly + * @param SortDirection the new SortDirection to use + */ + public setDirection(dir: SortDirection): void { + this.dir = dir; + this.toggle.flipX = this.dir === SortDirection.DESC; + } + + /** + * Toggle the current SortDirection value + */ + public toggleDirection(): void { + this.setDirection(this.dir * -1); + } + + /** + * Place the label elements (text and sprite if there is one) to the provided x and y position + * @param x the horizontal position + * @param y the vertical position + */ + setLabelPosition(x: number, y: number) { + let textX = x; + for (let i=0; i < this.labels.length; i++) { + const label = this.labels[i]; + if (label.sprite) { + label.sprite.x = x; + label.sprite.y = y; + if (i === this.currentLabelIndex) { + textX += label.sprite.displayWidth + 2; + } + } + } + if (this.text) { + this.text.x = textX; + this.text.y = y; + } + } + + /** + * Place the toggle icon at the provided position + * @param x the horizontal position + * @param y the vertical position + */ + setTogglePosition(x: number, y: number) { + if (this.toggle) { + this.toggle.x = x; + this.toggle.y = y; + } + } + + /** + * @returns the x position to use for the current label depending on if it has a sprite or not + */ + getCurrentLabelX(): number | undefined { + if (this.labels[this.currentLabelIndex].sprite) { + return this.labels[this.currentLabelIndex].sprite?.x; + } + return this.text.x; + } + + /** + * @returns max width needed to display all of the labels + */ + getWidth(): number { + let w = 0; + const currentText = this.text.text; + for (const label of this.labels) { + this.text.setText(label.text); + const spriteWidth = label.sprite? label.sprite.displayWidth + 2 : 0; + w = Math.max(w, this.text.displayWidth + spriteWidth); + } + this.text.setText(currentText); + return w; + } + +} + + +export class DropDown extends Phaser.GameObjects.Container { + public options: DropDownOption[]; + private window: Phaser.GameObjects.NineSlice; + private cursorObj: Phaser.GameObjects.Image; + public dropDownType: DropDownType = DropDownType.MULTI; + public cursor: number = 0; + private lastCursor: number = -1; + public defaultCursor: number = 0; + private onChange: () => void; + private lastDir: SortDirection = SortDirection.ASC; + private defaultSettings: any[]; + + constructor(scene: BattleScene, x: number, y: number, options: DropDownOption[], onChange: () => void, type: DropDownType = DropDownType.MULTI, optionSpacing: number = 2) { + const windowPadding = 5; + const optionHeight = 7; + const optionPaddingX = 4; + const optionPaddingY = 6; + const cursorOffset = 7; + const optionWidth = 100; + + super(scene, x - cursorOffset - windowPadding, y); + this.options = options; + this.dropDownType = type; + this.onChange = onChange; + + this.cursorObj = scene.add.image(optionPaddingX + 3, 0, "cursor"); + this.cursorObj.setScale(0.5); + this.cursorObj.setOrigin(0, 0.5); + this.cursorObj.setVisible(false); + + // For MULTI and HYBRID filter, add an ALL option at the top + if (this.dropDownType === DropDownType.MULTI || this.dropDownType === DropDownType.HYBRID) { + this.options.unshift(new DropDownOption(scene, "ALL", new DropDownLabel(i18next.t("filterBar:all"), undefined, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF))); + } + + this.defaultSettings = this.getSettings(); + + // Place ui elements in the correct spot + options.forEach((option, index) => { + const toggleVisibility = type !== DropDownType.SINGLE || option.state === DropDownState.ON; + option.setupToggleIcon(type, toggleVisibility); + + option.width = optionWidth; + option.y = index * optionHeight + index * optionSpacing + optionPaddingY; + + const baseX = cursorOffset + optionPaddingX + 3; + const baseY = optionHeight / 2; + option.setLabelPosition(baseX + 8, baseY); + if (type === DropDownType.SINGLE) { + option.setTogglePosition(baseX + 3, baseY + 1); + } else { + option.setTogglePosition(baseX, baseY); + } + }); + + this.window = addWindow(scene, 0, 0, optionWidth, options[options.length - 1].y + optionHeight + optionPaddingY, false, false, undefined, undefined, WindowVariant.XTHIN); + this.add(this.window); + this.add(options); + this.add(this.cursorObj); + this.setVisible(false); + } + + getWidth(): number { + return this.window? this.window.width : this.width; + } + + toggleVisibility(): void { + this.setVisible(!this.visible); + } + + setVisible(value: boolean): this { + super.setVisible(value); + + if (value) { + this.autoSize(); + } + + return this; + } + + resetCursor(): boolean { + // If we are an hybrid dropdown in "hover" mode, don't move the cursor back to 0 + if (this.dropDownType === DropDownType.HYBRID && this.checkForAllOff()) { + return this.setCursor(this.lastCursor); + } + return this.setCursor(this.defaultCursor); + } + + setCursor(cursor: integer): boolean { + this.cursor = cursor; + if (cursor < 0) { + cursor = 0; + this.cursorObj.setVisible(false); + return false; + } else if (cursor >= this.options.length) { + cursor = this.options.length - 1; + this.cursorObj.y = this.options[cursor].y + 3.5; + this.cursorObj.setVisible(true); + return false; + } else { + this.cursorObj.y = this.options[cursor].y + 3.5; + this.cursorObj.setVisible(true); + // If hydrid type, we need to update the filters when going up/down in the list + if (this.dropDownType === DropDownType.HYBRID) { + this.lastCursor = cursor; + this.onChange(); + } + } + return true; + } + + /** + * Switch the option at the provided index to its next state and update visuals + * Update accordingly the other options if needed: + * - if "all" is toggled, also update all other options + * - for DropDownType.SINGLE, unselect the previously selected option if applicable + * @param index the index of the option for which to update the state + */ + toggleOptionState(index: number = this.cursor): void { + const option: DropDownOption = this.options[index]; + if (this.dropDownType === DropDownType.MULTI || this.dropDownType === DropDownType.HYBRID) { + const newState = option.toggleOptionState(); + if (index === 0) { + // we are on the All option > put all other options to the newState + this.setAllOptions(newState); + } else { + // select the "all" option if all others are selected, other unselect it + if (newState === DropDownState.ON && this.checkForAllOn()) { + this.options[0].setOptionState(DropDownState.ON); + } else { + this.options[0].setOptionState(DropDownState.OFF); + } + } + } else if (this.dropDownType === DropDownType.SINGLE) { + if (option.state === DropDownState.OFF) { + this.options.forEach((option) => { + option.setOptionState(DropDownState.OFF); + option.setDirection(SortDirection.ASC); + option.toggle.setVisible(false); + }); + option.setOptionState(DropDownState.ON); + option.setDirection(this.lastDir); + option.toggle.setVisible(true); + } else { + option.toggleDirection(); + this.lastDir = this.options[this.cursor].dir; + } + } else if (this.dropDownType === DropDownType.RADIAL) { + option.toggleOptionState(); + } + this.onChange(); + } + + /** + * Check whether all options except the "ALL" one are ON + * @returns true if all options are set to DropDownState.ON, false otherwise + */ + checkForAllOn(): boolean { + return this.options.every((option, i) => i === 0 || option.state === DropDownState.ON); + } + + /** + * Check whether all options except the "ALL" one are OFF + * @returns true if all options are set to DropDownState.OFF, false otherwise + */ + checkForAllOff(): boolean { + return this.options.every((option, i) => i === 0 || option.state === DropDownState.OFF); + } + + /** + * Get the current selected values for each option + * @returns an array of values, depending on the DropDownType + * - if MULTI or HYBRID, an array of all the values of the options set to ON (except the ALL one) + * - if RADIAL, an array where the value for each option is of the form { val: any, state: DropDownState } + * - if SINGLE, a single object of the form { val: any, state: SortDirection } + */ + getVals(): any[] { + if (this.dropDownType === DropDownType.MULTI) { + return this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map((option) => option.val); + } else if (this.dropDownType === DropDownType.HYBRID) { + const selected = this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map((option) => option.val); + if (selected.length > 0) { + return selected; + } + // if nothing is selected and the ALL option is hovered, return all elements + if (this.cursor === 0) { + return this.options.filter((_, i) => i > 0).map(option => option.val); + } + // if nothing is selected and a single option is hovered, return that one + return [this.options[this.cursor].val]; + } else if (this.dropDownType === DropDownType.RADIAL) { + return this.options.map((option) => { + return { val: option.val, state: option.state }; + }); + } else { + return this.options.filter(option => option.state === DropDownState.ON).map((option) => { + return { val: option.val, dir: option.dir }; + }); + } + } + + /** + * Get the current selected settings dictionary for each option + * @returns an array of dictionaries with the current state of each option + * - the settings dictionary is like this { val: any, state: DropDownState, cursor: boolean, dir: SortDirection } + */ + private getSettings(): any[] { + const settings : any[] = []; + for (let i = 0; i < this.options.length; i++) { + settings.push({ val: this.options[i].val, state: this.options[i].state, cursor: (this.cursor === i), dir: this.options[i].dir }); + } + return settings; + } + + /** + * Check whether the values of all options are the same as the default ones + * @returns true if they are the same, false otherwise + */ + public hasDefaultValues(): boolean { + const currentValues = this.getSettings(); + + const compareValues = (keys: string[]): boolean => { + return currentValues.length === this.defaultSettings.length && + currentValues.every((value, index) => + keys.every(key => value[key] === this.defaultSettings[index][key]) + ); + }; + + switch (this.dropDownType) { + case DropDownType.MULTI: + case DropDownType.RADIAL: + return compareValues(["val", "state"]); + + case DropDownType.HYBRID: + return compareValues(["val", "state", "cursor"]); + + case DropDownType.SINGLE: + return compareValues(["val", "state", "dir"]); + + default: + return false; + } + } + + /** + * Set all values to their default state + */ + public resetToDefault(): void { + if (this.defaultSettings.length > 0) { + this.setCursor(this.defaultCursor); + this.lastDir = SortDirection.ASC; + + for (let i = 0; i < this.options.length; i++) { + // reset values with the defaultValues + if (this.dropDownType === DropDownType.SINGLE) { + if (this.defaultSettings[i].state === DropDownState.OFF) { + this.options[i].setOptionState(DropDownState.OFF); + this.options[i].setDirection(SortDirection.ASC); + this.options[i].toggle.setVisible(false); + } else { + this.options[i].setOptionState(DropDownState.ON); + this.options[i].setDirection(SortDirection.ASC); + this.options[i].toggle.setVisible(true); + } + } else { + if (this.defaultSettings[i]) { + this.options[i].setOptionState(this.defaultSettings[i]["state"]); + } + } + } + } + } + + /** + * Set all options to a specific state + * @param state the DropDownState to assign to each option + */ + private setAllOptions(state: DropDownState) : void { + // For single type dropdown, setting all options is not relevant + if (this.dropDownType === DropDownType.SINGLE) { + return; + } + + for (const option of this.options) { + option.setOptionState(state); + } + } + + /** + * Set all options to their ON state + */ + public selectAllOptions() { + this.setAllOptions(DropDownState.ON); + } + + /** + * Set all options to their OFF state + */ + public unselectAllOptions() { + this.setAllOptions(DropDownState.OFF); + } + + /** + * Automatically set the width and position based on the size of options + */ + autoSize(): void { + let maxWidth = 0; + let x = 0; + for (let i = 0; i < this.options.length; i++) { + const optionWidth = this.options[i].getWidth(); + if (optionWidth > maxWidth) { + maxWidth = optionWidth; + x = this.options[i].getCurrentLabelX() ?? 0; + } + } + this.window.width = maxWidth + x - this.window.x + 6; + + if (this.x + this.window.width > this.parentContainer.width) { + this.x = this.parentContainer.width - this.window.width; + } + } + +} diff --git a/src/ui/egg-counter-container.ts b/src/ui/egg-counter-container.ts index a688b8b7efc..21cebf5d97e 100644 --- a/src/ui/egg-counter-container.ts +++ b/src/ui/egg-counter-container.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { addWindow } from "./ui-theme"; import { addTextObject, TextStyle } from "./text"; -import { EggCountChangedEvent, EggEventType } from "#app/events/egg.js"; +import { EggCountChangedEvent, EggEventType } from "#app/events/egg"; import EggHatchSceneHandler from "./egg-hatch-scene-handler"; /** diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 0081b589288..9497dfe58c6 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -1,6 +1,6 @@ import BattleScene from "../battle-scene"; import { Mode } from "./ui"; -import { TextStyle, addTextObject, getEggTierTextTint } from "./text"; +import { TextStyle, addTextObject, getEggTierTextTint, getTextStyleOptions } from "./text"; import MessageUiHandler from "./message-ui-handler"; import * as Utils from "../utils"; import { Egg, getLegendaryGachaSpeciesForTimestamp, IEggOptions } from "../data/egg"; @@ -9,7 +9,7 @@ import { getPokemonSpecies } from "../data/pokemon-species"; import { addWindow } from "./ui-theme"; import { Tutorial, handleTutorial } from "../tutorial"; import {Button} from "#enums/buttons"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { GachaType } from "#app/enums/gacha-types"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; @@ -36,6 +36,8 @@ export default class EggGachaUiHandler extends MessageUiHandler { private transitionCancelled: boolean; private defaultText: string; + private scale: number = 0.1666666667; + constructor(scene: BattleScene) { super(scene, Mode.EGG_GACHA); @@ -50,6 +52,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { setup() { this.gachaCursor = 0; + this.scale = getTextStyleOptions(TextStyle.WINDOW, this.scene.uiTheme).scale; const ui = this.getUi(); @@ -57,7 +60,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.setVisible(false); ui.add(this.eggGachaContainer); - const bg = this.scene.add.nineslice(0, 0, "default_bg", null, 320, 180, 0, 0, 16, 0); + const bg = this.scene.add.nineslice(0, 0, "default_bg", undefined, 320, 180, 0, 0, 16, 0); bg.setOrigin(0, 0); this.eggGachaContainer.add(bg); @@ -96,25 +99,71 @@ export default class EggGachaUiHandler extends MessageUiHandler { const gachaInfoContainer = this.scene.add.container(160, 46); - const gachaUpLabel = addTextObject(this.scene, 4, 0, "UP!", TextStyle.WINDOW_ALT); + const currentLanguage = i18next.resolvedLanguage!; // TODO: is this bang correct? + let gachaTextStyle = TextStyle.WINDOW_ALT; + let gachaX = 4; + let gachaY = 0; + let pokemonIconX = -20; + let pokemonIconY = 6; + + if (["de", "es", "fr", "ko", "pt-BR"].includes(currentLanguage)) { + gachaTextStyle = TextStyle.SMALLER_WINDOW_ALT; + gachaX = 2; + gachaY = 2; + } + + let legendaryLabelX = gachaX; + let legendaryLabelY = gachaY; + if (["de", "es"].includes(currentLanguage)) { + pokemonIconX = -25; + pokemonIconY = 10; + legendaryLabelX = -6; + legendaryLabelY = 0; + } + + const gachaUpLabel = addTextObject(this.scene, gachaX, gachaY, i18next.t("egg:legendaryUPGacha"), gachaTextStyle); gachaUpLabel.setOrigin(0, 0); gachaInfoContainer.add(gachaUpLabel); switch (gachaType as GachaType) { case GachaType.LEGENDARY: - const pokemonIcon = this.scene.add.sprite(-20, 6, "pokemon_icons_0"); + if (["de", "es"].includes(currentLanguage)) { + gachaUpLabel.setAlign("center"); + gachaUpLabel.setY(0); + } + if (["pt-BR"].includes(currentLanguage)) { + gachaUpLabel.setX(legendaryLabelX - 2); + } else { + gachaUpLabel.setX(legendaryLabelX); + } + gachaUpLabel.setY(legendaryLabelY); + + const pokemonIcon = this.scene.add.sprite(pokemonIconX, pokemonIconY, "pokemon_icons_0"); + if (["pt-BR"].includes(currentLanguage)) { + pokemonIcon.setX(pokemonIconX - 2); + } pokemonIcon.setScale(0.5); pokemonIcon.setOrigin(0, 0.5); gachaInfoContainer.add(pokemonIcon); break; case GachaType.MOVE: - gachaUpLabel.setText("Move UP!"); + if (["de", "es", "fr", "pt-BR"].includes(currentLanguage)) { + gachaUpLabel.setAlign("center"); + gachaUpLabel.setY(0); + } + + gachaUpLabel.setText(i18next.t("egg:moveUPGacha")); gachaUpLabel.setX(0); gachaUpLabel.setOrigin(0.5, 0); break; case GachaType.SHINY: - gachaUpLabel.setText("Shiny UP!"); + if (["de", "fr", "ko"].includes(currentLanguage)) { + gachaUpLabel.setAlign("center"); + gachaUpLabel.setY(0); + } + + gachaUpLabel.setText(i18next.t("egg:shinyUPGacha")); gachaUpLabel.setX(0); gachaUpLabel.setOrigin(0.5, 0); break; @@ -154,7 +203,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(this.eggGachaOptionsContainer); - this.eggGachaOptionSelectBg = addWindow(this.scene, 0, 0, 96, 112); + this.eggGachaOptionSelectBg = addWindow(this.scene, 0, 0, 96, 16 + 576 * this.scale); this.eggGachaOptionSelectBg.setOrigin(1, 1); this.eggGachaOptionsContainer.add(this.eggGachaOptionSelectBg); @@ -168,11 +217,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { { multiplier: multiplierOne, description: `25 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.GOLDEN) } ]; - const { resolvedLanguage } = i18next; + const resolvedLanguage = i18next.resolvedLanguage!; // TODO: is this bang correct? const pullOptionsText = pullOptions.map(option =>{ const desc = option.description.split(" "); if (desc[0].length < 2) { - desc[0] += ["zh", "ko"].includes(resolvedLanguage.substring(0,2)) ? " " : " "; + desc[0] += ["zh", "ko"].includes(resolvedLanguage.substring(0, 2)) ? " " : " "; } if (option.multiplier === multiplierOne) { desc[0] = " " + desc[0]; @@ -197,8 +246,8 @@ export default class EggGachaUiHandler extends MessageUiHandler { pullOptions.forEach((option, i) => { const icon = this.scene.add.sprite(0, 0, "items", option.icon); - icon.setScale(0.5); - icon.setPositionRelative(this.eggGachaOptionSelectBg, 20, 17 + i * 16); + icon.setScale(3 * this.scale); + icon.setPositionRelative(this.eggGachaOptionSelectBg, 20, 9 + (48 + i * 96) * this.scale); this.eggGachaOptionsContainer.add(icon); }); @@ -286,7 +335,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { return Utils.fixedInt(delay); } - pull(pullCount?: integer, count?: integer, eggs?: Egg[]): void { + pull(pullCount: integer = 0, count: integer = 0, eggs?: Egg[]): void { if (Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE && !count) { pullCount = Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE; } @@ -296,21 +345,21 @@ export default class EggGachaUiHandler extends MessageUiHandler { const doPull = () => { if (this.transitionCancelled) { - return this.showSummary(eggs); + return this.showSummary(eggs!); } - const egg = this.scene.add.sprite(127, 75, "egg", `egg_${eggs[count].getKey()}`); + const egg = this.scene.add.sprite(127, 75, "egg", `egg_${eggs![count].getKey()}`); egg.setScale(0.5); this.gachaContainers[this.gachaCursor].add(egg); this.gachaContainers[this.gachaCursor].moveTo(egg, 2); const doPullAnim = () => { - this.scene.playSound("gacha_running", { loop: true }); + this.scene.playSound("se/gacha_running", { loop: true }); this.scene.time.delayedCall(this.getDelayValue(count ? 500 : 1250), () => { - this.scene.playSound("gacha_dispense"); + this.scene.playSound("se/gacha_dispense"); this.scene.time.delayedCall(this.getDelayValue(750), () => { - this.scene.sound.stopByKey("gacha_running"); + this.scene.sound.stopByKey("se/gacha_running"); this.scene.tweens.add({ targets: egg, duration: this.getDelayValue(350), @@ -318,7 +367,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { ease: "Bounce.easeOut", onComplete: () => { this.scene.time.delayedCall(this.getDelayValue(125), () => { - this.scene.playSound("pb_catch"); + this.scene.playSound("se/pb_catch"); this.gachaHatches[this.gachaCursor].play("open"); this.scene.tweens.add({ targets: egg, @@ -342,7 +391,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { if (++count < pullCount) { this.pull(pullCount, count, eggs); } else { - this.showSummary(eggs); + this.showSummary(eggs!); } } }); @@ -356,7 +405,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { }; if (!count) { - this.scene.playSound("gacha_dial"); + this.scene.playSound("se/gacha_dial"); this.scene.tweens.add({ targets: this.gachaKnobs[this.gachaCursor], duration: this.getDelayValue(350), @@ -535,7 +584,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { } showError(text: string): void { - this.showText(text, null, () => this.showText(this.defaultText), Utils.fixedInt(1500)); + this.showText(text, undefined, () => this.showText(this.defaultText), Utils.fixedInt(1500)); } setTransitioning(transitioning: boolean): void { @@ -689,7 +738,8 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaOptionsContainer.add(this.cursorObj); } - this.cursorObj.setPositionRelative(this.eggGachaOptionSelectBg, 10, 17 + this.cursor * 16); + this.cursorObj.setScale(this.scale * 6); + this.cursorObj.setPositionRelative(this.eggGachaOptionSelectBg, 10, 9 + (48 + this.cursor * 96) * this.scale); return ret; } diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index 0e247da60ab..7b01ef7a3a6 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -1,8 +1,8 @@ import BattleScene from "../battle-scene"; -import { EggHatchPhase } from "../egg-hatch-phase"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import {Button} from "#enums/buttons"; +import { EggHatchPhase } from "#app/phases/egg-hatch-phase"; export default class EggHatchSceneHandler extends UiHandler { public eggHatchContainer: Phaser.GameObjects.Container; @@ -36,7 +36,7 @@ export default class EggHatchSceneHandler extends UiHandler { show(_args: any[]): boolean { super.show(_args); - this.getUi().showText(null, 0); + this.getUi().showText("", 0); this.scene.setModifiersVisible(false); 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/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index 64d190c4d3f..ffbd06afde3 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -83,6 +83,8 @@ export default class EvolutionSceneHandler extends MessageUiHandler { } } } + + return false; } setCursor(_cursor: integer): boolean { diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index ed520512443..60db9d19eef 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -5,13 +5,15 @@ import { Command } from "./command-ui-handler"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; -import { CommandPhase } from "../phases"; -import { MoveCategory } from "#app/data/move.js"; +import { MoveCategory } from "#app/data/move"; import i18next from "i18next"; import {Button} from "#enums/buttons"; -import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import { CommandPhase } from "#app/phases/command-phase"; export default class FightUiHandler extends UiHandler { + public static readonly MOVES_CONTAINER_NAME = "moves"; + private movesContainer: Phaser.GameObjects.Container; private moveInfoContainer: Phaser.GameObjects.Container; private typeIcon: Phaser.GameObjects.Sprite; @@ -21,7 +23,7 @@ export default class FightUiHandler extends UiHandler { private powerText: Phaser.GameObjects.Text; private accuracyLabel: Phaser.GameObjects.Text; private accuracyText: Phaser.GameObjects.Text; - private cursorObj: Phaser.GameObjects.Image; + private cursorObj: Phaser.GameObjects.Image | null; private moveCategoryIcon: Phaser.GameObjects.Sprite; protected fieldIndex: integer = 0; @@ -35,14 +37,14 @@ export default class FightUiHandler extends UiHandler { const ui = this.getUi(); this.movesContainer = this.scene.add.container(18, -38.7); - this.movesContainer.setName("moves"); + this.movesContainer.setName(FightUiHandler.MOVES_CONTAINER_NAME); ui.add(this.movesContainer); this.moveInfoContainer = this.scene.add.container(1, 0); this.moveInfoContainer.setName("move-info"); ui.add(this.moveInfoContainer); - this.typeIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 57, -36,`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}` , "unknown"); + this.typeIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 57, -36, Utils.getLocalizedSpriteKey("types"), "unknown"); this.typeIcon.setVisible(false); this.moveInfoContainer.add(this.typeIcon); @@ -93,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; } @@ -176,16 +182,21 @@ export default class FightUiHandler extends UiHandler { const hasMove = cursor < moveset.length; if (hasMove) { - const pokemonMove = moveset[cursor]; - this.typeIcon.setTexture(`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[pokemonMove.getMove().type].toLowerCase()).setScale(0.8); - this.moveCategoryIcon.setTexture("categories", MoveCategory[pokemonMove.getMove().category].toLowerCase()).setScale(1.0); + const pokemonMove = moveset[cursor]!; // TODO: is the bang correct? + const moveType = pokemon.getMoveType(pokemonMove.getMove()); + const textureKey = Utils.getLocalizedSpriteKey("types"); + this.typeIcon.setTexture(textureKey, Type[moveType].toLowerCase()).setScale(0.8); + const moveCategory = pokemonMove.getMove().category; + this.moveCategoryIcon.setTexture("categories", MoveCategory[moveCategory].toLowerCase()).setScale(1.0); const power = pokemonMove.getMove().power; const accuracy = pokemonMove.getMove().accuracy; const maxPP = pokemonMove.getMovePp(); const pp = maxPP - pokemonMove.ppUsed; - this.ppText.setText(`${Utils.padInt(pp, 2, " ")}/${Utils.padInt(maxPP, 2, " ")}`); + const ppLeftStr = Utils.padInt(pp, 2, " "); + const ppMaxStr = Utils.padInt(maxPP, 2, " "); + this.ppText.setText(`${ppLeftStr}/${ppMaxStr}`); this.powerText.setText(`${power >= 0 ? power : "---"}`); this.accuracyText.setText(`${accuracy >= 0 ? accuracy : "---"}`); @@ -229,7 +240,7 @@ export default class FightUiHandler extends UiHandler { * Returns undefined if it's a status move */ private getEffectivenessText(pokemon: Pokemon, opponent: Pokemon, pokemonMove: PokemonMove): string | undefined { - const effectiveness = opponent.getMoveEffectiveness(pokemon, pokemonMove); + const effectiveness = opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData?.abilityRevealed); if (effectiveness === undefined) { return undefined; } @@ -246,7 +257,7 @@ export default class FightUiHandler extends UiHandler { moveText.setName("text-empty-move"); if (moveIndex < moveset.length) { - const pokemonMove = moveset[moveIndex]; + const pokemonMove = moveset[moveIndex]!; // TODO is the bang correct? moveText.setText(pokemonMove.getName()); moveText.setName(pokemonMove.getName()); moveText.setColor(this.getMoveColor(pokemon, pokemonMove) ?? moveText.style.color); @@ -271,11 +282,10 @@ export default class FightUiHandler extends UiHandler { return undefined; } - const moveColors = opponents.map((opponent) => { - return opponent.getMoveEffectiveness(pokemon, pokemonMove); - }).sort((a, b) => b - a).map((effectiveness) => { - return getTypeDamageMultiplierColor(effectiveness, "offense"); - }); + const moveColors = opponents + .map((opponent) => opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData.abilityRevealed)) + .sort((a, b) => b - a) + .map((effectiveness) => getTypeDamageMultiplierColor(effectiveness ?? 0, "offense")); return moveColors[0]; } diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts new file mode 100644 index 00000000000..aa0f575d398 --- /dev/null +++ b/src/ui/filter-bar.ts @@ -0,0 +1,211 @@ +import BattleScene from "#app/battle-scene"; +import { DropDown, DropDownType } from "./dropdown"; +import { StarterContainer } from "./starter-container"; +import { addTextObject, getTextColor, TextStyle } from "./text"; +import { UiTheme } from "#enums/ui-theme"; +import { addWindow, WindowVariant } from "./ui-theme"; + +export enum DropDownColumn { + GEN, + TYPES, + CAUGHT, + UNLOCKS, + MISC, + SORT +} + +export class FilterBar extends Phaser.GameObjects.Container { + private window: Phaser.GameObjects.NineSlice; + private labels: Phaser.GameObjects.Text[] = []; + private dropDowns: DropDown[] = []; + private columns: DropDownColumn[] = []; + public cursorObj: Phaser.GameObjects.Image; + public numFilters: number = 0; + public openDropDown: boolean = false; + private lastCursor: number = -1; + private uiTheme: UiTheme; + + constructor(scene: BattleScene, x: number, y: number, width: number, height: number) { + super(scene, x, y); + + this.width = width; + this.height = height; + + this.window = addWindow(scene, 0, 0, width, height, false, false, undefined, undefined, WindowVariant.THIN); + this.add(this.window); + + this.cursorObj = this.scene.add.image(1, 1, "cursor"); + this.cursorObj.setScale(0.5); + this.cursorObj.setVisible(false); + this.cursorObj.setOrigin(0, 0); + this.add(this.cursorObj); + + this.uiTheme = scene.uiTheme; + } + + /** + * Add a new filter to the FilterBar, as long that a unique DropDownColumn is provided + * @param column the DropDownColumn that will be used to access the filter values + * @param title the string that will get displayed in the filter bar + * @param dropDown the DropDown with all options for this filter + * @returns true if successful, false if the provided column was already in use for another filter + */ + addFilter(column: DropDownColumn, title: string, dropDown: DropDown): boolean { + // The column should be unique to each filter, + if (this.columns.includes(column)) { + return false; + } + + this.columns.push(column); + + const filterTypesLabel = addTextObject(this.scene, 0, 3, title, TextStyle.TOOLTIP_CONTENT); + this.labels.push(filterTypesLabel); + this.add(filterTypesLabel); + this.dropDowns.push(dropDown); + this.add(dropDown); + + this.calcFilterPositions(); + this.numFilters++; + + return true; + } + + /** + * Get the DropDown associated to a given filter + * @param col the DropDownColumn used to register the filter to retrieve + * @returns the associated DropDown if it exists, undefined otherwise + */ + getFilter(col: DropDownColumn) : DropDown { + return this.dropDowns[this.columns.indexOf(col)]; + } + + /** + * Highlight the labels of the FilterBar if the filters are different from their default values + */ + updateFilterLabels(): void { + for (let i = 0; i < this.numFilters; i++) { + if (this.dropDowns[i].hasDefaultValues()) { + this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, this.uiTheme)); + } else { + this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, this.uiTheme)); + } + } + } + + /** + * Position the filter dropdowns evenly across the width of the container + */ + private calcFilterPositions(): void { + const paddingX = 6; + const cursorOffset = 8; + + let totalWidth = paddingX * 2 + cursorOffset; + this.labels.forEach(label => { + totalWidth += label.displayWidth + cursorOffset; + }); + const spacing = (this.width - totalWidth) / (this.labels.length - 1); + for (let i=0; i -1) { + if (this.dropDowns[this.lastCursor].visible) { + this.dropDowns[this.lastCursor].setVisible(false); + this.dropDowns[cursor].setVisible(true); + this.dropDowns[cursor].resetCursor(); + } + } + + const cursorOffset = 8; + this.cursorObj.setPosition(this.labels[cursor].x - cursorOffset + 2, 6); + this.lastCursor = cursor; + } + + toggleDropDown(index: number): void { + this.dropDowns[index].toggleVisibility(); + this.openDropDown = this.dropDowns[index].visible; + this.dropDowns[index].resetCursor(); + } + + hideDropDowns(): void { + this.dropDowns.forEach(dropDown => { + dropDown.setVisible(false); + }); + this.openDropDown = false; + } + + incDropDownCursor(): boolean { + if (this.dropDowns[this.lastCursor].cursor === this.dropDowns[this.lastCursor].options.length - 1) {// if at the bottom of the list, wrap around + return this.dropDowns[this.lastCursor].setCursor(0); + } else { + return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor + 1); + } + } + + decDropDownCursor(): boolean { + if (this.dropDowns[this.lastCursor].cursor === 0) {// if at the top of the list, wrap around + return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].options.length - 1); + } else { + return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor - 1); + } + } + + toggleOptionState(): void { + this.dropDowns[this.lastCursor].toggleOptionState(); + } + + getVals(col: DropDownColumn): any[] { + return this.getFilter(col).getVals(); + } + + setValsToDefault(): void { + for (const dropDown of this.dropDowns) { + dropDown.resetToDefault(); + } + } + + /** + * Find the nearest filter to the provided container + * @param container the StarterContainer to compare position against + * @returns the index of the closest filter + */ + getNearestFilter(container: StarterContainer): number { + + const midx = container.x + container.icon.displayWidth / 2; + let nearest = 0; + let nearestDist = 1000; + for (let i=0; i < this.labels.length; i++) { + const dist = Math.abs(midx - (this.labels[i].x + this.labels[i].displayWidth / 3)); + if (dist < nearestDist) { + nearest = i; + nearestDist = dist; + } + } + + return nearest; + } + +} diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 2c576a0fbaa..8c4ea5f6768 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -6,7 +6,7 @@ import { WindowVariant, addWindow } from "./ui-theme"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; import * as Utils from "../utils"; import i18next from "i18next"; -import {Button} from "#enums/buttons"; +import { Button } from "#enums/buttons"; export interface FormModalConfig extends ModalConfig { errorMessage?: string; @@ -17,10 +17,10 @@ export abstract class FormModalUiHandler extends ModalUiHandler { protected inputContainers: Phaser.GameObjects.Container[]; protected inputs: InputText[]; protected errorMessage: Phaser.GameObjects.Text; - protected submitAction: Function; + protected submitAction: Function | null; protected tween: Phaser.Tweens.Tween; - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.editing = false; @@ -60,7 +60,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { const inputBg = addWindow(this.scene, 0, 0, 80, 16, false, false, 0, 0, WindowVariant.XTHIN); const isPassword = field.includes(i18next.t("menu:password")) || field.includes(i18next.t("menu:confirmPassword")); - const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 16 }); + const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 18 }); input.setOrigin(0, 0); inputContainer.add(inputBg); diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 8f1e8890a76..967b3ae0dc4 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -9,6 +9,7 @@ import { DexAttr, GameData } from "../system/game-data"; import { speciesStarters } from "../data/pokemon-species"; import {Button} from "#enums/buttons"; import i18next from "i18next"; +import { UiTheme } from "#app/enums/ui-theme"; interface DisplayStat { label_key?: string; @@ -218,7 +219,10 @@ export default class GameStatsUiHandler extends UiHandler { private statLabels: Phaser.GameObjects.Text[]; private statValues: Phaser.GameObjects.Text[]; - constructor(scene: BattleScene, mode?: Mode) { + private arrowUp: Phaser.GameObjects.Sprite; + private arrowDown: Phaser.GameObjects.Sprite; + + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.statLabels = []; @@ -241,11 +245,9 @@ export default class GameStatsUiHandler extends UiHandler { const statsBgWidth = ((this.scene.game.canvas.width / 6) - 2) / 2; const [ statsBgLeft, statsBgRight ] = new Array(2).fill(null).map((_, i) => { - let width = statsBgWidth; - if (!i) { - width += 5; - } - const statsBg = addWindow(this.scene, statsBgWidth * i, headerBg.height, width, (this.scene.game.canvas.height / 6) - headerBg.height - 2, false, !!i, 2); + const width = statsBgWidth + 2; + const height = Math.floor((this.scene.game.canvas.height / 6) - headerBg.height - 2); + const statsBg = addWindow(this.scene, (statsBgWidth - 2) * i, headerBg.height, width, height, false, false, i>0?-3:0, 1); statsBg.setOrigin(0, 0); return statsBg; }); @@ -272,6 +274,14 @@ export default class GameStatsUiHandler extends UiHandler { this.gameStatsContainer.add(statsBgRight); this.gameStatsContainer.add(this.statsContainer); + // arrows to show that we can scroll through the stats + const isLegacyTheme = this.scene.uiTheme === UiTheme.LEGACY; + this.arrowDown = this.scene.add.sprite(statsBgWidth, this.scene.game.canvas.height / 6 - (isLegacyTheme? 9 : 5), "prompt"); + this.gameStatsContainer.add(this.arrowDown); + this.arrowUp = this.scene.add.sprite(statsBgWidth, headerBg.height + (isLegacyTheme? 7 : 3), "prompt"); + this.arrowUp.flipY = true; + this.gameStatsContainer.add(this.arrowUp); + ui.add(this.gameStatsContainer); this.setCursor(0); @@ -286,6 +296,15 @@ export default class GameStatsUiHandler extends UiHandler { this.updateStats(); + this.arrowUp.play("prompt"); + this.arrowDown.play("prompt"); + if (this.scene.uiTheme === UiTheme.LEGACY) { + this.arrowUp.setTint(0x484848); + this.arrowDown.setTint(0x484848); + } + + this.updateArrows(); + this.gameStatsContainer.setVisible(true); this.getUi().moveTo(this.gameStatsContainer, this.getUi().length - 1); @@ -299,7 +318,7 @@ export default class GameStatsUiHandler extends UiHandler { const statKeys = Object.keys(displayStats).slice(this.cursor * 2, this.cursor * 2 + 18); statKeys.forEach((key, s) => { const stat = displayStats[key] as DisplayStat; - const value = stat.sourceFunc(this.scene.gameData); + const value = stat.sourceFunc!(this.scene.gameData); // TODO: is this bang correct? this.statLabels[s].setText(!stat.hidden || isNaN(parseInt(value)) || parseInt(value) ? i18next.t(`gameStatsUiHandler:${stat.label_key}`) : "???"); this.statValues[s].setText(value); }); @@ -311,6 +330,17 @@ export default class GameStatsUiHandler extends UiHandler { } } + /** + * Show arrows at the top / bottom of the page if it's possible to scroll in that direction + */ + updateArrows(): void { + const showUpArrow = this.cursor > 0; + this.arrowUp.setVisible(showUpArrow); + + const showDownArrow = this.cursor < Math.ceil((Object.keys(displayStats).length - 18) / 2); + this.arrowDown.setVisible(showDownArrow); + } + processInput(button: Button): boolean { const ui = this.getUi(); @@ -346,6 +376,7 @@ export default class GameStatsUiHandler extends UiHandler { if (ret) { this.updateStats(); + this.updateArrows(); } return ret; diff --git a/src/ui/loading-modal-ui-handler.ts b/src/ui/loading-modal-ui-handler.ts index c335b59de9f..d86f7afd3b6 100644 --- a/src/ui/loading-modal-ui-handler.ts +++ b/src/ui/loading-modal-ui-handler.ts @@ -5,7 +5,7 @@ import { addTextObject, TextStyle } from "./text"; import { Mode } from "./ui"; export default class LoadingModalUiHandler extends ModalUiHandler { - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); } diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 3b75c6f7c13..631b2e50b02 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -3,51 +3,122 @@ import { ModalConfig } from "./modal-ui-handler"; import * as Utils from "../utils"; import { Mode } from "./ui"; import i18next from "i18next"; +import BattleScene from "#app/battle-scene"; +import { addTextObject, TextStyle } from "./text"; +import { addWindow } from "./ui-theme"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; + +interface BuildInteractableImageOpts { + scale?: number; + x?: number; + y?: number; + origin?: { x: number; y: number }; +} export default class LoginFormUiHandler extends FormModalUiHandler { - getModalTitle(config?: ModalConfig): string { + private readonly ERR_USERNAME: string = "invalid username"; + private readonly ERR_PASSWORD: string = "invalid password"; + private readonly ERR_ACCOUNT_EXIST: string = "account doesn't exist"; + private readonly ERR_PASSWORD_MATCH: string = "password doesn't match"; + private readonly ERR_NO_SAVES: string = "No save files found"; + private readonly ERR_TOO_MANY_SAVES: string = "Too many save files found"; + + private googleImage: Phaser.GameObjects.Image; + private discordImage: Phaser.GameObjects.Image; + private usernameInfoImage: Phaser.GameObjects.Image; + private externalPartyContainer: Phaser.GameObjects.Container; + private infoContainer: Phaser.GameObjects.Container; + private externalPartyBg: Phaser.GameObjects.NineSlice; + private externalPartyTitle: Phaser.GameObjects.Text; + constructor(scene: BattleScene, mode: Mode | null = null) { + super(scene, mode); + } + + setup(): void { + super.setup(); + this.buildExternalPartyContainer(); + + this.infoContainer = this.scene.add.container(0, 0); + + this.usernameInfoImage = this.buildInteractableImage("settings_icon", "username-info-icon", { + x: 20, + scale: 0.5 + }); + + this.infoContainer.add(this.usernameInfoImage); + this.getUi().add(this.infoContainer); + this.infoContainer.setVisible(false); + this.infoContainer.disableInteractive(); + } + + private buildExternalPartyContainer() { + this.externalPartyContainer = this.scene.add.container(0, 0); + this.externalPartyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 12, this.scene.game.canvas.height / 12), Phaser.Geom.Rectangle.Contains); + this.externalPartyTitle = addTextObject(this.scene, 0, 4, "", TextStyle.SETTINGS_LABEL); + this.externalPartyTitle.setOrigin(0.5, 0); + this.externalPartyBg = addWindow(this.scene, 0, 0, 0, 0); + this.externalPartyContainer.add(this.externalPartyBg); + this.externalPartyContainer.add(this.externalPartyTitle); + + this.googleImage = this.buildInteractableImage("google", "google-icon"); + this.discordImage = this.buildInteractableImage("discord", "discord-icon"); + + this.externalPartyContainer.add(this.googleImage); + this.externalPartyContainer.add(this.discordImage); + this.getUi().add(this.externalPartyContainer); + this.externalPartyContainer.add(this.googleImage); + this.externalPartyContainer.add(this.discordImage); + this.externalPartyContainer.setVisible(false); + } + + override getModalTitle(_config?: ModalConfig): string { return i18next.t("menu:login"); } - getFields(config?: ModalConfig): string[] { + override getFields(_config?: ModalConfig): string[] { return [ i18next.t("menu:username"), i18next.t("menu:password") ]; } - getWidth(config?: ModalConfig): number { + override getWidth(_config?: ModalConfig): number { return 160; } - getMargin(config?: ModalConfig): [number, number, number, number] { + override getMargin(_config?: ModalConfig): [number, number, number, number] { return [ 0, 0, 48, 0 ]; } - getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t("menu:login"), i18next.t("menu:register") ]; + override getButtonLabels(_config?: ModalConfig): string[] { + return [ i18next.t("menu:login"), i18next.t("menu:register")]; } - getReadableErrorMessage(error: string): string { + override getReadableErrorMessage(error: string): string { const colonIndex = error?.indexOf(":"); if (colonIndex > 0) { error = error.slice(0, colonIndex); } switch (error) { - case "invalid username": + case this.ERR_USERNAME: return i18next.t("menu:invalidLoginUsername"); - case "invalid password": + case this.ERR_PASSWORD: return i18next.t("menu:invalidLoginPassword"); - case "account doesn't exist": + case this.ERR_ACCOUNT_EXIST: return i18next.t("menu:accountNonExistent"); - case "password doesn't match": + case this.ERR_PASSWORD_MATCH: return i18next.t("menu:unmatchingPassword"); + case this.ERR_NO_SAVES: + return i18next.t("menu:noSaves"); + case this.ERR_TOO_MANY_SAVES: + return i18next.t("menu:tooManySaves"); } return super.getReadableErrorMessage(error); } - show(args: any[]): boolean { + override show(args: any[]): boolean { if (super.show(args)) { - const config = args[0] as ModalConfig; + const config = args[0] as ModalConfig; + this.processExternalProvider(config); const originalLoginAction = this.submitAction; this.submitAction = (_) => { // Prevent overlapping overrides on action modification @@ -71,7 +142,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { .then(response => { if (response.hasOwnProperty("token")) { Utils.setCookie(Utils.sessionIdKey, response.token); - originalLoginAction(); + originalLoginAction && originalLoginAction(); } else { onFail(response); } @@ -83,4 +154,115 @@ export default class LoginFormUiHandler extends FormModalUiHandler { return false; } + + override clear() { + super.clear(); + this.externalPartyContainer.setVisible(false); + this.infoContainer.setVisible(false); + this.setMouseCursorStyle("default"); //reset cursor + + [this.discordImage, this.googleImage, this.usernameInfoImage].forEach((img) => img.off("pointerdown")); + } + + private processExternalProvider(config: ModalConfig) : void { + this.externalPartyTitle.setText(i18next.t("menu:orUse") ?? ""); + this.externalPartyTitle.setX(20+this.externalPartyTitle.text.length); + this.externalPartyTitle.setVisible(true); + this.externalPartyContainer.setPositionRelative(this.modalContainer, 175, 0); + this.externalPartyContainer.setVisible(true); + this.externalPartyBg.setSize(this.externalPartyTitle.text.length + 50, this.modalBg.height); + this.getUi().moveTo(this.externalPartyContainer, this.getUi().length - 1); + this.googleImage.setPosition(this.externalPartyBg.width/3.1, this.externalPartyBg.height-60); + this.discordImage.setPosition(this.externalPartyBg.width/3.1, this.externalPartyBg.height-40); + + this.infoContainer.setPosition(5, -76); + this.infoContainer.setVisible(true); + this.getUi().moveTo(this.infoContainer, this.getUi().length - 1); + this.usernameInfoImage.setPositionRelative(this.infoContainer, 0, 0); + + this.discordImage.on("pointerdown", () => { + const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`); + const discordId = import.meta.env.VITE_DISCORD_CLIENT_ID; + const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&prompt=none`; + window.open(discordUrl, "_self"); + }); + + this.googleImage.on("pointerdown", () => { + const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/google/callback`); + const googleId = import.meta.env.VITE_GOOGLE_CLIENT_ID; + const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&redirect_uri=${redirectUri}&response_type=code&scope=openid`; + window.open(googleUrl, "_self"); + }); + + const onFail = error => { + this.scene.ui.setMode(Mode.LOADING, { buttonActions: [] }); + this.scene.ui.setModeForceTransition(Mode.LOGIN_FORM, Object.assign(config, { errorMessage: error?.trim() })); + this.scene.ui.playError(); + }; + + this.usernameInfoImage.on("pointerdown", () => { + const localStorageKeys = Object.keys(localStorage); // this gets the keys for localStorage + const keyToFind = "data_"; + const dataKeys = localStorageKeys.filter(ls => ls.indexOf(keyToFind) >= 0); + if (dataKeys.length > 0 && dataKeys.length <= 2) { + const options: OptionSelectItem[] = []; + for (let i = 0; i < dataKeys.length; i++) { + options.push({ + label: dataKeys[i].replace(keyToFind, ""), + handler: () => { + this.scene.ui.revertMode(); + this.infoContainer.disableInteractive(); + return true; + } + }); + } + this.scene.ui.setOverlayMode(Mode.OPTION_SELECT, { + options: options, + delay: 1000 + }); + this.infoContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width, this.scene.game.canvas.height), Phaser.Geom.Rectangle.Contains); + } else { + if (dataKeys.length > 2) { + return onFail(this.ERR_TOO_MANY_SAVES); + } else { + return onFail(this.ERR_NO_SAVES); + } + } + }); + + this.externalPartyContainer.setAlpha(0); + this.scene.tweens.add({ + targets: this.externalPartyContainer, + duration: Utils.fixedInt(1000), + ease: "Sine.easeInOut", + y: "-=24", + alpha: 1 + }); + + this.infoContainer.setAlpha(0); + this.scene.tweens.add({ + targets: this.infoContainer, + duration: Utils.fixedInt(1000), + ease: "Sine.easeInOut", + y: "-=24", + alpha: 1 + }); + } + + private buildInteractableImage(texture: string, name: string, opts: BuildInteractableImageOpts = {}) { + const { + scale = 0.07, + x = 0, + y = 0, + origin = { x: 0, y: 0 } + } = opts; + const img = this.scene.add.image(x, y, texture); + img.setName(name); + img.setOrigin(origin.x, origin.y); + img.setScale(scale); + img.setInteractive(); + this.addInteractionHoverEffect(img); + + return img; + } } diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 571a09f3b37..adbb3089e5c 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -1,36 +1,43 @@ import BattleScene, { bypassLogin } from "../battle-scene"; -import { TextStyle, addTextObject } from "./text"; +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"; -import { updateUserInfo } from "../account"; +import { loggedInUser, updateUserInfo } from "../account"; import i18next from "i18next"; -import {Button} from "#enums/buttons"; +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, ACHIEVEMENTS, STATS, - VOUCHERS, + RUN_HISTORY, EGG_LIST, EGG_GACHA, MANAGE_DATA, COMMUNITY, SAVE_AND_QUIT, - LOG_OUT + LOG_OUT, } 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; @@ -38,30 +45,41 @@ export default class MenuUiHandler extends MessageUiHandler { private menuBg: Phaser.GameObjects.NineSlice; protected optionSelectText: Phaser.GameObjects.Text; - private cursorObj: Phaser.GameObjects.Image; + private cursorObj: Phaser.GameObjects.Image | null; - protected ignoredMenuOptions: MenuOptions[]; - protected menuOptions: MenuOptions[]; + private excludedMenus: () => ConditionalMenu[]; + private menuOptions: MenuOptions[]; 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) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); - this.ignoredMenuOptions = !bypassLogin - ? [ ] - : [ MenuOptions.LOG_OUT ]; - this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => parseInt(MenuOptions[m]) as MenuOptions).filter(m => !this.ignoredMenuOptions.includes(m)); + this.excludedMenus = () => [ + { 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) + .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .filter(m => { + return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); + }); } - setup() { + setup(): void { const ui = this.getUi(); // wiki url directs based on languges available on wiki - const lang = i18next.resolvedLanguage.substring(0,2); + const lang = i18next.resolvedLanguage?.substring(0, 2)!; // TODO: is this bang correct? if (["de", "fr", "ko", "zh"].includes(lang)) { wikiUrl = `https://wiki.pokerogue.net/${lang}:start`; } @@ -77,21 +95,42 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuOverlay = new Phaser.GameObjects.Rectangle(this.scene, -1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0xffffff, 0.3); this.menuOverlay.setName("menu-overlay"); - this.menuOverlay.setOrigin(0,0); + this.menuOverlay.setOrigin(0, 0); this.menuContainer.add(this.menuOverlay); - const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); - menuMessageText.setName("menu-message"); - menuMessageText.setWordWrapWidth(1224); - menuMessageText.setOrigin(0, 0); + this.menuContainer.add(this.bgmBar); + + this.menuContainer.setVisible(false); + + } + + + render() { + const ui = this.getUi(); + this.excludedMenus = () => [ + { condition: this.scene.getCurrentPhase() instanceof SelectModifierPhase, options: [MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST] }, + { condition: bypassLogin, options: [MenuOptions.LOG_OUT] } + ]; + + this.menuOptions = Utils.getEnumKeys(MenuOptions) + .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .filter(m => { + return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); + }); this.optionSelectText = addTextObject(this.scene, 0, 0, this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); this.optionSelectText.setLineSpacing(12); - this.menuBg = addWindow(this.scene, (this.scene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25), 0, this.optionSelectText.displayWidth + 23, (this.scene.game.canvas.height / 6) - 2); + this.scale = getTextStyleOptions(TextStyle.WINDOW, (this.scene as BattleScene).uiTheme).scale; + this.menuBg = addWindow(this.scene, + (this.scene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25), + 0, + this.optionSelectText.displayWidth + 19 + 24 * this.scale, + (this.scene.game.canvas.height / 6) - 2 + ); this.menuBg.setOrigin(0, 0); - this.optionSelectText.setPositionRelative(this.menuBg, 14, 6); + this.optionSelectText.setPositionRelative(this.menuBg, 10 + 24 * this.scale, 6); this.menuContainer.add(this.menuBg); @@ -102,21 +141,30 @@ 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); + // 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.setOrigin(0, 0); this.menuMessageBoxContainer.add(menuMessageText); - this.menuContainer.add(this.bgmBar); - this.message = menuMessageText; + // By default we use the general purpose message window + this.setDialogTestMode(false); + this.menuContainer.add(this.menuMessageBoxContainer); - const manageDataOptions = []; + const manageDataOptions: any[] = []; // TODO: proper type const confirmSlot = (message: string, slotFilter: (i: integer) => boolean, callback: (i: integer) => void) => { ui.revertMode(); @@ -124,11 +172,11 @@ 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(); - ui.showText(null, 0); + ui.showText("", 0); return true; } }; @@ -136,7 +184,7 @@ export default class MenuUiHandler extends MessageUiHandler { label: i18next.t("menuUiHandler:cancel"), handler: () => { ui.revertMode(); - ui.showText(null, 0); + ui.showText("", 0); return true; } }]), @@ -146,7 +194,7 @@ export default class MenuUiHandler extends MessageUiHandler { }); }; - if (Utils.isLocal) { + if (Utils.isLocal || Utils.isBeta) { manageDataOptions.push({ label: i18next.t("menuUiHandler:importSession"), handler: () => { @@ -177,7 +225,23 @@ export default class MenuUiHandler extends MessageUiHandler { }, keepOpen: true }); - if (Utils.isLocal) { + manageDataOptions.push({ + label: i18next.t("menuUiHandler:importRunHistory"), + handler: () => { + this.scene.gameData.importData(GameDataType.RUN_HISTORY); + return true; + }, + keepOpen: true + }); + manageDataOptions.push({ + label: i18next.t("menuUiHandler:exportRunHistory"), + handler: () => { + this.scene.gameData.tryExportData(GameDataType.RUN_HISTORY); + return true; + }, + keepOpen: true + }); + if (Utils.isLocal || Utils.isBeta) { manageDataOptions.push({ label: i18next.t("menuUiHandler:importData"), handler: () => { @@ -188,34 +252,97 @@ export default class MenuUiHandler extends MessageUiHandler { keepOpen: true }); } - manageDataOptions.push( - { - label: i18next.t("menuUiHandler:exportData"), + manageDataOptions.push({ + label: i18next.t("menuUiHandler:exportData"), + handler: () => { + this.scene.gameData.tryExportData(GameDataType.SYSTEM); + return true; + }, + keepOpen: true + }, + { + label: i18next.t("menuUiHandler:consentPreferences"), + handler: () => { + const consentLink = document.querySelector(".termly-display-preferences") as HTMLInputElement; + const clickEvent = new MouseEvent("click", { + view: window, + bubbles: true, + cancelable: true + }); + consentLink.dispatchEvent(clickEvent); + consentLink.focus(); + 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: () => { - this.scene.gameData.tryExportData(GameDataType.SYSTEM); + 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(); + return true; }, - { - label: i18next.t("menuUiHandler:cancel"), - handler: () => { - this.scene.ui.revertMode(); - return true; - } - } - ); + keepOpen: true + }); + //Thank you Vassiat this.manageDataConfig = { xOffset: 98, - options: manageDataOptions + options: manageDataOptions, + maxOptions: 7 }; const communityOptions: OptionSelectItem[] = [ { label: "Wiki", handler: () => { - window.open(wikiUrl, "_blank").focus(); + window.open(wikiUrl, "_blank")?.focus(); return true; }, keepOpen: true @@ -223,7 +350,7 @@ export default class MenuUiHandler extends MessageUiHandler { { label: "Discord", handler: () => { - window.open(discordUrl, "_blank").focus(); + window.open(discordUrl, "_blank")?.focus(); return true; }, keepOpen: true @@ -231,7 +358,7 @@ export default class MenuUiHandler extends MessageUiHandler { { label: "GitHub", handler: () => { - window.open(githubUrl, "_blank").focus(); + window.open(githubUrl, "_blank")?.focus(); return true; }, keepOpen: true @@ -239,34 +366,64 @@ export default class MenuUiHandler extends MessageUiHandler { { label: "Reddit", handler: () => { - window.open(redditUrl, "_blank").focus(); + window.open(redditUrl, "_blank")?.focus(); return true; }, keepOpen: true }, { - label: i18next.t("menuUiHandler:cancel"), + label: i18next.t("menuUiHandler:donate"), handler: () => { - this.scene.ui.revertMode(); + window.open(donateUrl, "_blank")?.focus(); return true; - } + }, + keepOpen: true } ]; - + if (!bypassLogin && loggedInUser?.hasAdminRole) { + communityOptions.push({ + label: "Admin", + handler: () => { + ui.playSelect(); + ui.setOverlayMode(Mode.ADMIN, { + buttonActions: [ + () => { + ui.revertMode(); + }, + () => { + ui.revertMode(); + } + ] + }); + return true; + }, + keepOpen: true + }); + } + communityOptions.push({ + label: i18next.t("menuUiHandler:cancel"), + handler: () => { + this.scene.ui.revertMode(); + return true; + } + }); this.communityConfig = { xOffset: 98, options: communityOptions }; - this.setCursor(0); - - this.menuContainer.setVisible(false); } show(args: any[]): boolean { - + this.render(); super.show(args); + this.menuOptions = Utils.getEnumKeys(MenuOptions) + .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .filter(m => { + return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); + }); + this.menuContainer.setVisible(true); this.setCursor(0); @@ -274,7 +431,7 @@ export default class MenuUiHandler extends MessageUiHandler { this.getUi().hideTooltip(); - this.scene.playSound("menu_open"); + this.scene.playSound("ui/menu_open"); handleTutorial(this.scene, Tutorial.Menu); @@ -292,11 +449,15 @@ export default class MenuUiHandler extends MessageUiHandler { if (button === Button.ACTION) { let adjustedCursor = this.cursor; - for (const imo of this.ignoredMenuOptions) { - if (adjustedCursor >= imo) { - adjustedCursor++; - } else { - break; + const excludedMenu = this.excludedMenus().find(e => e.condition); + if (excludedMenu !== undefined && excludedMenu.options !== undefined && excludedMenu.options.length > 0) { + const sortedOptions = excludedMenu.options.sort(); + for (const imo of sortedOptions) { + if (adjustedCursor >= imo) { + adjustedCursor++; + } else { + break; + } } } switch (adjustedCursor) { @@ -312,8 +473,8 @@ export default class MenuUiHandler extends MessageUiHandler { ui.setOverlayMode(Mode.GAME_STATS); success = true; break; - case MenuOptions.VOUCHERS: - ui.setOverlayMode(Mode.VOUCHERS); + case MenuOptions.RUN_HISTORY: + ui.setOverlayMode(Mode.RUN_HISTORY); success = true; break; case MenuOptions.EGG_LIST: @@ -332,6 +493,51 @@ export default class MenuUiHandler extends MessageUiHandler { success = true; break; case MenuOptions.MANAGE_DATA: + if (!bypassLogin && !this.manageDataConfig.options.some(o => o.label === i18next.t("menuUiHandler:linkDiscord") || o.label === i18next.t("menuUiHandler:unlinkDiscord"))) { + this.manageDataConfig.options.splice(this.manageDataConfig.options.length - 1, 0, + { + label: loggedInUser?.discordId === "" ? i18next.t("menuUiHandler:linkDiscord") : i18next.t("menuUiHandler:unlinkDiscord"), + handler: () => { + if (loggedInUser?.discordId === "") { + const token = Utils.getCookie(Utils.sessionIdKey); + const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`); + const discordId = import.meta.env.VITE_DISCORD_CLIENT_ID; + const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&state=${token}&prompt=none`; + window.open(discordUrl, "_self"); + return true; + } else { + Utils.apiPost("/auth/discord/logout", undefined, undefined, true).then(res => { + if (!res.ok) { + console.error(`Unlink failed (${res.status}: ${res.statusText})`); + } + updateUserInfo().then(() => this.scene.reset(true, true)); + }); + return true; + } + } + }, + { + label: loggedInUser?.googleId === "" ? i18next.t("menuUiHandler:linkGoogle") : i18next.t("menuUiHandler:unlinkGoogle"), + handler: () => { + if (loggedInUser?.googleId === "") { + const token = Utils.getCookie(Utils.sessionIdKey); + const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/google/callback`); + const googleId = import.meta.env.VITE_GOOGLE_CLIENT_ID; + const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&response_type=code&redirect_uri=${redirectUri}&scope=openid&state=${token}`; + window.open(googleUrl, "_self"); + return true; + } else { + Utils.apiPost("/auth/google/logout", undefined, undefined, true).then(res => { + if (!res.ok) { + console.error(`Unlink failed (${res.status}: ${res.statusText})`); + } + updateUserInfo().then(() => this.scene.reset(true, true)); + }); + return true; + } + } + }); + } ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.manageDataConfig); success = true; break; @@ -346,7 +552,7 @@ export default class MenuUiHandler extends MessageUiHandler { ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { ui.setOverlayMode(Mode.CONFIRM, () => this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => this.scene.reset(true)), () => { ui.revertMode(); - ui.showText(null, 0); + ui.showText("", 0); }, false, -98); }); } else { @@ -363,7 +569,7 @@ export default class MenuUiHandler extends MessageUiHandler { if (!res.ok) { console.error(`Log out failed (${res.status}: ${res.statusText})`); } - Utils.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); updateUserInfo().then(() => this.scene.reset(true, true)); }); }; @@ -371,7 +577,7 @@ export default class MenuUiHandler extends MessageUiHandler { ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { ui.setOverlayMode(Mode.CONFIRM, doLogout, () => { ui.revertMode(); - ui.showText(null, 0); + ui.showText("", 0); }, false, -98); }); } else { @@ -414,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); @@ -429,7 +650,8 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuContainer.add(this.cursorObj); } - this.cursorObj.setPositionRelative(this.menuBg, 7, 9 + this.cursor * 16); + this.cursorObj.setScale(this.scale * 6); + this.cursorObj.setPositionRelative(this.menuBg, 7, 6 + (18 + this.cursor * 96) * this.scale); return ret; } @@ -448,3 +670,8 @@ export default class MenuUiHandler extends MessageUiHandler { this.cursorObj = null; } } + +interface ConditionalMenu { + condition: boolean; + options: MenuOptions[]; +} diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 05c91ca1643..a78887e1581 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -4,28 +4,28 @@ import { Mode } from "./ui"; import * as Utils from "../utils"; export default abstract class MessageUiHandler extends AwaitableUiHandler { - protected textTimer: Phaser.Time.TimerEvent; - protected textCallbackTimer: Phaser.Time.TimerEvent; + protected textTimer: Phaser.Time.TimerEvent | null; + protected textCallbackTimer: Phaser.Time.TimerEvent | null; public pendingPrompt: boolean; public message: Phaser.GameObjects.Text; public prompt: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene, mode: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.pendingPrompt = false; } - showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { this.showTextInternal(text, delay, callback, callbackDelay, prompt, promptDelay); } - showDialogue(text: string, name: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + showDialogue(text: string, name?: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { this.showTextInternal(text, delay, callback, callbackDelay, prompt, promptDelay); } - private showTextInternal(text: string, delay: integer, callback: Function, callbackDelay: integer, prompt: boolean, promptDelay: integer) { + private showTextInternal(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { if (delay === null || delay === undefined) { delay = 20; } @@ -33,7 +33,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const delayMap = new Map(); const soundMap = new Map(); const actionPattern = /@(c|d|s)\{(.*?)\}/; - let actionMatch: RegExpExecArray; + let actionMatch: RegExpExecArray | null; while ((actionMatch = actionPattern.exec(text))) { switch (actionMatch[1]) { case "c": @@ -99,7 +99,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { this.textTimer = this.scene.time.addEvent({ delay: delay, callback: () => { - const charIndex = text.length - this.textTimer.repeatCount; + const charIndex = text.length - (this.textTimer?.repeatCount!); // TODO: is this bang correct? const charVar = charVarMap.get(charIndex); const charSound = soundMap.get(charIndex); const charDelay = delayMap.get(charIndex); @@ -111,7 +111,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { if (charSound) { this.scene.playSound(charSound); } - if (callback && !this.textTimer.repeatCount) { + if (callback && !this.textTimer?.repeatCount) { if (callbackDelay && !prompt) { this.textCallbackTimer = this.scene.time.delayedCall(callbackDelay, () => { if (this.textCallbackTimer) { @@ -126,11 +126,11 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } }; if (charDelay) { - this.textTimer.paused = true; + this.textTimer!.paused = true; // TODO: is the bang correct? this.scene.tweens.addCounter({ duration: Utils.getFrameMs(charDelay), onComplete: () => { - this.textTimer.paused = false; + this.textTimer!.paused = false; // TODO: is the bang correct? advance(); } }); @@ -151,7 +151,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } } - showPrompt(callback: Function, callbackDelay: integer) { + showPrompt(callback?: Function | null, callbackDelay?: integer | null) { const wrappedTextLines = this.message.runWordWrap(this.message.text).split(/\n/g); const textLinesCount = wrappedTextLines.length; const lastTextLine = wrappedTextLines[wrappedTextLines.length - 1]; diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 85b20e423c3..5f586ec8db7 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -16,7 +16,7 @@ export abstract class ModalUiHandler extends UiHandler { protected buttonContainers: Phaser.GameObjects.Container[]; protected buttonBgs: Phaser.GameObjects.NineSlice[]; - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.buttonContainers = []; @@ -57,29 +57,35 @@ export abstract class ModalUiHandler extends UiHandler { const buttonLabels = this.getButtonLabels(); - const buttonTopMargin = this.getButtonTopMargin(); - for (const label of buttonLabels) { - const buttonLabel = addTextObject(this.scene, 0, 8, label, TextStyle.TOOLTIP_CONTENT); - buttonLabel.setOrigin(0.5, 0.5); - - const buttonBg = addWindow(this.scene, 0, 0, buttonLabel.getBounds().width + 8, 16, false, false, 0, 0, WindowVariant.THIN); - buttonBg.setOrigin(0.5, 0); - buttonBg.setInteractive(new Phaser.Geom.Rectangle(0, 0, buttonBg.width, buttonBg.height), Phaser.Geom.Rectangle.Contains); - - const buttonContainer = this.scene.add.container(0, buttonTopMargin); - - this.buttonBgs.push(buttonBg); - this.buttonContainers.push(buttonContainer); - - buttonContainer.add(buttonBg); - buttonContainer.add(buttonLabel); - this.modalContainer.add(buttonContainer); + this.addButton(label); } this.modalContainer.setVisible(false); } + private addButton(label: string) { + const buttonTopMargin = this.getButtonTopMargin(); + const buttonLabel = addTextObject(this.scene, 0, 8, label, TextStyle.TOOLTIP_CONTENT); + buttonLabel.setOrigin(0.5, 0.5); + + const buttonBg = addWindow(this.scene, 0, 0, buttonLabel.getBounds().width + 8, 16, false, false, 0, 0, WindowVariant.THIN); + buttonBg.setOrigin(0.5, 0); + buttonBg.setInteractive(new Phaser.Geom.Rectangle(0, 0, buttonBg.width, buttonBg.height), Phaser.Geom.Rectangle.Contains); + + const buttonContainer = this.scene.add.container(0, buttonTopMargin); + + this.buttonBgs.push(buttonBg); + this.buttonContainers.push(buttonContainer); + + buttonContainer.add(buttonBg); + buttonContainer.add(buttonLabel); + + this.addInteractionHoverEffect(buttonBg); + + this.modalContainer.add(buttonContainer); + } + show(args: any[]): boolean { if (args.length >= 1 && "buttonActions" in args[0]) { super.show(args); @@ -135,4 +141,20 @@ export abstract class ModalUiHandler extends UiHandler { this.buttonBgs.map(bg => bg.off("pointerdown")); } + + /** + * Adds a hover effect to a game object which changes the cursor to a `pointer` and tints it slighly + * @param gameObject the game object to add hover events/effects to + */ + protected addInteractionHoverEffect(gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.NineSlice | Phaser.GameObjects.Sprite) { + gameObject.on("pointerover", () => { + this.setMouseCursorStyle("pointer"); + gameObject.setTint(0xbbbbbb); + }); + + gameObject.on("pointerout", () => { + this.setMouseCursorStyle("default"); + gameObject.clearTint(); + }); + } } diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index c403dc28abb..ca5d27f96a4 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -1,7 +1,7 @@ import BattleScene from "../battle-scene"; import { getPlayerShopModifierTypeOptionsForWave, ModifierTypeOption, TmModifierType } from "../modifier/modifier-type"; import { getPokeballAtlasKey, PokeballType } from "../data/pokeball"; -import { addTextObject, getModifierTierTextTint, getTextColor, TextStyle } from "./text"; +import { addTextObject, getTextStyleOptions, getModifierTierTextTint, getTextColor, TextStyle } from "./text"; import AwaitableUiHandler from "./awaitable-ui-handler"; import { Mode } from "./ui"; import { LockModifierTiersModifier, PokemonHeldItemModifier } from "../modifier/modifier"; @@ -10,6 +10,9 @@ import {Button} from "#enums/buttons"; import MoveInfoOverlay from "./move-info-overlay"; import { allMoves } from "../data/move"; import * as Utils from "./../utils"; +import Overrides from "#app/overrides"; +import i18next from "i18next"; +import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; export const SHOP_OPTIONS_ROW_LIMIT = 6; @@ -27,11 +30,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { private rowCursor: integer = 0; private player: boolean; private rerollCost: integer; + private transferButtonWidth: integer; + private checkButtonWidth: integer; public options: ModifierOption[]; public shopOptionsRows: ModifierOption[][]; - private cursorObj: Phaser.GameObjects.Image; + private cursorObj: Phaser.GameObjects.Image | null; constructor(scene: BattleScene) { super(scene, Mode.CONFIRM); @@ -46,22 +51,32 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.modifierContainer = this.scene.add.container(0, 0); ui.add(this.modifierContainer); - this.transferButtonContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 71, -64); + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + const styleOptions = getTextStyleOptions(TextStyle.PARTY, (this.scene as BattleScene).uiTheme).styleOptions; + + if (context) { + context.font = styleOptions.fontSize + "px " + styleOptions.fontFamily; + this.transferButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:transfer")).width; + this.checkButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:checkTeam")).width; + } + + this.transferButtonContainer = this.scene.add.container((this.scene.game.canvas.width - this.checkButtonWidth) / 6 - 21, -64); this.transferButtonContainer.setName("transfer-btn"); this.transferButtonContainer.setVisible(false); ui.add(this.transferButtonContainer); - const transferButtonText = addTextObject(this.scene, -4, -2, "Transfer", TextStyle.PARTY); + const transferButtonText = addTextObject(this.scene, -4, -2, i18next.t("modifierSelectUiHandler:transfer"), TextStyle.PARTY); transferButtonText.setName("text-transfer-btn"); transferButtonText.setOrigin(1, 0); this.transferButtonContainer.add(transferButtonText); - this.checkButtonContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -64); + this.checkButtonContainer = this.scene.add.container((this.scene.game.canvas.width) / 6 - 1, -64); this.checkButtonContainer.setName("use-btn"); this.checkButtonContainer.setVisible(false); ui.add(this.checkButtonContainer); - const checkButtonText = addTextObject(this.scene, -4, -2, "Check Team", TextStyle.PARTY); + const checkButtonText = addTextObject(this.scene, -4, -2, i18next.t("modifierSelectUiHandler:checkTeam"), TextStyle.PARTY); checkButtonText.setName("text-use-btn"); checkButtonText.setOrigin(1, 0); this.checkButtonContainer.add(checkButtonText); @@ -71,7 +86,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.rerollButtonContainer.setVisible(false); ui.add(this.rerollButtonContainer); - const rerollButtonText = addTextObject(this.scene, -4, -2, "Reroll", TextStyle.PARTY); + const rerollButtonText = addTextObject(this.scene, -4, -2, i18next.t("modifierSelectUiHandler:reroll"), TextStyle.PARTY); rerollButtonText.setName("text-reroll-btn"); rerollButtonText.setOrigin(0, 0); this.rerollButtonContainer.add(rerollButtonText); @@ -86,7 +101,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.lockRarityButtonContainer.setVisible(false); ui.add(this.lockRarityButtonContainer); - this.lockRarityButtonText = addTextObject(this.scene, -4, -2, "Lock Rarities", TextStyle.PARTY); + this.lockRarityButtonText = addTextObject(this.scene, -4, -2, i18next.t("modifierSelectUiHandler:lockRarities"), TextStyle.PARTY); this.lockRarityButtonText.setOrigin(0, 0); this.lockRarityButtonContainer.add(this.lockRarityButtonText); @@ -107,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; @@ -126,7 +144,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.player = args[0]; - const partyHasHeldItem = this.player && !!this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).getTransferrable(true)).length; + const partyHasHeldItem = this.player && !!this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferrable).length; const canLockRarities = !!this.scene.findModifier(m => m instanceof LockModifierTiersModifier); this.transferButtonContainer.setVisible(false); @@ -235,11 +253,25 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { duration: 250 }); - this.setCursor(0); - this.setRowCursor(1); + const updateCursorTarget = () => { + 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); + } + }; - handleTutorial(this.scene, Tutorial.Select_Item).then(() => { - this.setCursor(0); + updateCursorTarget(); + + handleTutorial(this.scene, Tutorial.Select_Item).then((res) => { + if (res) { + updateCursorTarget(); + } this.awaitingActionInput = true; this.onActionInput = args[2]; }); @@ -308,7 +340,11 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { success = false; break; case 1: - success = this.rerollButtonContainer.visible && this.setCursor(0); + if (this.lockRarityButtonContainer.visible) { + success = this.setCursor(3); + } else { + success = this.rerollButtonContainer.visible && this.setCursor(0); + } break; case 2: if (this.transferButtonContainer.visible) { @@ -342,6 +378,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { case 2: success = false; break; + case 3: + if (this.transferButtonContainer.visible) { + success = this.setCursor(1); + } else { + success = this.setCursor(2); + } + break; } } else if (this.cursor < this.getRowItems(this.rowCursor) - 1) { success = this.setCursor(this.cursor + 1); @@ -383,23 +426,23 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } const type = options[this.cursor].modifierTypeOption.type; - ui.showText(type.getDescription(this.scene)); + type && ui.showText(type.getDescription(this.scene)); if (type instanceof TmModifierType) { // prepare the move overlay to be shown with the toggle this.moveInfoOverlay.show(allMoves[type.moveId]); } } else if (cursor === 0) { this.cursorObj.setPosition(6, this.lockRarityButtonContainer.visible ? -72 : -60); - ui.showText("Spend money to reroll your item options."); + ui.showText(i18next.t("modifierSelectUiHandler:rerollDesc")); } else if (cursor === 1) { - this.cursorObj.setPosition((this.scene.game.canvas.width / 6) - 120, -60); - ui.showText("Transfer a held item from one Pokémon to another."); + this.cursorObj.setPosition((this.scene.game.canvas.width - this.transferButtonWidth - this.checkButtonWidth)/6 - 30, -60); + ui.showText(i18next.t("modifierSelectUiHandler:transferDesc")); } else if (cursor === 2) { - this.cursorObj.setPosition((this.scene.game.canvas.width / 6) - 60, -60); - ui.showText("Check your team or use a form changing item."); + this.cursorObj.setPosition((this.scene.game.canvas.width - this.checkButtonWidth)/6 - 10, -60); + ui.showText(i18next.t("modifierSelectUiHandler:checkTeamDesc")); } else { this.cursorObj.setPosition(6, -60); - ui.showText("Lock item rarities on reroll (affects reroll cost)."); + ui.showText(i18next.t("modifierSelectUiHandler:lockRaritiesDesc")); } return ret; @@ -456,7 +499,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const formattedMoney = Utils.formatMoney(this.scene.moneyFormat, this.rerollCost); - this.rerollCostText.setText(`₽${formattedMoney}`); + this.rerollCostText.setText(i18next.t("modifierSelectUiHandler:rerollCost", { formattedMoney })); this.rerollCostText.setColor(this.getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED)); this.rerollCostText.setShadowColor(this.getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED, true)); } @@ -563,7 +606,7 @@ class ModifierOption extends Phaser.GameObjects.Container { this.add(this.itemContainer); const getItem = () => { - const item = this.scene.add.sprite(0, 0, "items", this.modifierTypeOption.type.iconImage); + const item = this.scene.add.sprite(0, 0, "items", this.modifierTypeOption.type?.iconImage); return item; }; @@ -576,10 +619,10 @@ class ModifierOption extends Phaser.GameObjects.Container { this.itemContainer.add(this.itemTint); } - this.itemText = addTextObject(this.scene, 0, 35, this.modifierTypeOption.type.name, TextStyle.PARTY, { align: "center" }); + this.itemText = addTextObject(this.scene, 0, 35, this.modifierTypeOption.type?.name!, TextStyle.PARTY, { align: "center" }); // TODO: is this bang correct? this.itemText.setOrigin(0.5, 0); this.itemText.setAlpha(0); - this.itemText.setTint(getModifierTierTextTint(this.modifierTypeOption.type.tier)); + this.itemText.setTint(this.modifierTypeOption.type?.tier ? getModifierTierTextTint(this.modifierTypeOption.type?.tier) : undefined); this.add(this.itemText); if (this.modifierTypeOption.cost) { @@ -617,7 +660,7 @@ class ModifierOption extends Phaser.GameObjects.Container { } const value = t.getValue(); if (!bounce && value > lastValue) { - (this.scene as BattleScene).playSound("pb_bounce_1", { volume: 1 / ++bounceCount }); + (this.scene as BattleScene).playSound("se/pb_bounce_1", { volume: 1 / ++bounceCount }); bounce = true; } else if (bounce && value < lastValue) { bounce = false; @@ -629,7 +672,7 @@ class ModifierOption extends Phaser.GameObjects.Container { for (let u = 0; u < this.modifierTypeOption.upgradeCount; u++) { const upgradeIndex = u; this.scene.time.delayedCall(remainingDuration - 2000 * (this.modifierTypeOption.upgradeCount - (upgradeIndex + 1 + upgradeCountOffset)), () => { - (this.scene as BattleScene).playSound("upgrade", { rate: 1 + 0.25 * upgradeIndex }); + (this.scene as BattleScene).playSound("se/upgrade", { rate: 1 + 0.25 * upgradeIndex }); this.pbTint.setPosition(this.pb.x, this.pb.y); this.pbTint.setTintFill(0xFFFFFF); this.pbTint.setAlpha(0); @@ -663,7 +706,7 @@ class ModifierOption extends Phaser.GameObjects.Container { if (!this.modifierTypeOption.cost) { this.pb.setTexture("pb", `${this.getPbAtlasKey(0)}_open`); - (this.scene as BattleScene).playSound("pb_rel"); + (this.scene as BattleScene).playSound("se/pb_rel"); this.scene.tweens.add({ targets: this.pb, @@ -711,16 +754,17 @@ class ModifierOption extends Phaser.GameObjects.Container { } getPbAtlasKey(tierOffset: integer = 0) { - return getPokeballAtlasKey((this.modifierTypeOption.type.tier + tierOffset) as integer as PokeballType); + return getPokeballAtlasKey((this.modifierTypeOption.type?.tier! + tierOffset) as integer as PokeballType); // TODO: is this bang correct? } updateCostText(): void { const scene = this.scene as BattleScene; - const textStyle = this.modifierTypeOption.cost <= scene.money ? TextStyle.MONEY : TextStyle.PARTY_RED; + const cost = Overrides.WAIVE_ROLL_FEE_OVERRIDE ? 0 : this.modifierTypeOption.cost; + const textStyle = cost <= scene.money ? TextStyle.MONEY : TextStyle.PARTY_RED; - const formattedMoney = Utils.formatMoney(scene.moneyFormat, this.modifierTypeOption.cost); + const formattedMoney = Utils.formatMoney(scene.moneyFormat, cost); - this.itemCostText.setText(`₽${formattedMoney}`); + this.itemCostText.setText(i18next.t("modifierSelectUiHandler:itemCost", { formattedMoney })); this.itemCostText.setColor(getTextColor(textStyle, false, scene.uiTheme)); this.itemCostText.setShadowColor(getTextColor(textStyle, true, scene.uiTheme)); } diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts index 3b947cb842d..859e95a39b6 100644 --- a/src/ui/move-info-overlay.ts +++ b/src/ui/move-info-overlay.ts @@ -30,7 +30,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem private move: Move; private desc: Phaser.GameObjects.Text; - private descScroll : Phaser.Tweens.Tween = null; + private descScroll : Phaser.Tweens.Tween | null = null; private val: Phaser.GameObjects.Container; private pp: Phaser.GameObjects.Text; @@ -90,7 +90,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem valuesBg.setOrigin(0, 0); this.val.add(valuesBg); - this.typ = this.scene.add.sprite(25, EFF_HEIGHT - 35,`types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}` , "unknown"); + this.typ = this.scene.add.sprite(25, EFF_HEIGHT - 35, `types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, "unknown"); this.typ.setScale(0.8); this.val.add(this.typ); @@ -131,7 +131,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem // show this component with infos for the specific move show(move : Move):boolean { if (!(this.scene as BattleScene).enableMoveInfo) { - return; // move infos have been disabled + return false; // move infos have been disabled // TODO:: is `false` correct? i used to be `undeefined` } this.move = move; this.pow.setText(move.power >= 0 ? move.power.toString() : "---"); diff --git a/src/ui/outdated-modal-ui-handler.ts b/src/ui/outdated-modal-ui-handler.ts index 1e737cf638b..fc4b93f9b8a 100644 --- a/src/ui/outdated-modal-ui-handler.ts +++ b/src/ui/outdated-modal-ui-handler.ts @@ -4,7 +4,7 @@ import { addTextObject, TextStyle } from "./text"; import { Mode } from "./ui"; export default class OutdatedModalUiHandler extends ModalUiHandler { - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); } diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index 506b8b5c825..d2521225375 100644 --- a/src/ui/party-exp-bar.ts +++ b/src/ui/party-exp-bar.ts @@ -7,7 +7,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { private pokemonIcon: Phaser.GameObjects.Container; private expText: Phaser.GameObjects.Text; - private tween: Phaser.Tweens.Tween; + private tween: Phaser.Tweens.Tween | null; public shown: boolean; @@ -16,7 +16,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, "party_exp_bar", null, 8, 18, 21, 5, 6, 4); + this.bg = this.scene.add.nineslice(0, 0, "party_exp_bar", undefined, 8, 18, 21, 5, 6, 4); this.bg.setOrigin(0, 0); this.add(this.bg); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 93dc052b09d..9e025dbe086 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1,40 +1,95 @@ -import { CommandPhase, SelectModifierPhase } from "../phases"; import BattleScene from "../battle-scene"; -import { PlayerPokemon, PokemonMove } from "../field/pokemon"; -import { addTextObject, TextStyle } from "./text"; +import Pokemon, { MoveResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; +import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text"; import { Command } from "./command-ui-handler"; import MessageUiHandler from "./message-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "../modifier/modifier"; -import { allMoves } from "../data/move"; +import { allMoves, ForceSwitchOutAttr } from "../data/move"; import { getGenderColor, getGenderSymbol } from "../data/gender"; import { StatusEffect } from "../data/status-effect"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; import { pokemonEvolutions } from "../data/pokemon-evolutions"; import { addWindow } from "./ui-theme"; -import { SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; +import { SpeciesFormChangeItemTrigger, FormChangeItem } from "../data/pokemon-forms"; import { getVariantTint } from "#app/data/variant"; import {Button} from "#enums/buttons"; -import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; +import { applyChallenges, ChallengeType } from "#app/data/challenge"; import MoveInfoOverlay from "./move-info-overlay"; import i18next from "i18next"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { CommandPhase } from "#app/phases/command-phase"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; -const defaultMessage = i18next.t("menu:choosePokemon"); +const defaultMessage = i18next.t("partyUiHandler:choosePokemon"); +/** + * Indicates the reason why the party UI is being opened. + */ export enum PartyUiMode { + /** + * Indicates that the party UI is open because of a user-opted switch. This + * type of switch can be cancelled. + */ SWITCH, + /** + * Indicates that the party UI is open because of a faint or other forced + * switch (eg, move effect). This type of switch cannot be cancelled. + */ FAINT_SWITCH, + /** + * Indicates that the party UI is open because of a start-of-encounter optional + * switch. This type of switch can be cancelled. + */ POST_BATTLE_SWITCH, + /** + * Indicates that the party UI is open because of the move Revival Blessing. + * This selection cannot be cancelled. + */ REVIVAL_BLESSING, + /** + * Indicates that the party UI is open to select a mon to apply a modifier to. + * This type of selection can be cancelled. + */ MODIFIER, + /** + * Indicates that the party UI is open to select a mon to apply a move + * modifier to (such as an Ether or PP Up). This type of selection can be cancelled. + */ MOVE_MODIFIER, + /** + * Indicates that the party UI is open to select a mon to teach a TM. This + * type of selection can be cancelled. + */ TM_MODIFIER, + /** + * Indicates that the party UI is open to select a mon to remember a move. + * This type of selection can be cancelled. + */ REMEMBER_MOVE_MODIFIER, + /** + * Indicates that the party UI is open to transfer items between mons. This + * type of selection can be cancelled. + */ MODIFIER_TRANSFER, + /** + * Indicates that the party UI is open because of a DNA Splicer. This + * type of selection can be cancelled. + */ SPLICE, + /** + * Indicates that the party UI is open to release a party member. This + * type of selection can be cancelled. + */ RELEASE, + /** + * Indicates that the party UI is open to check the team. This + * type of selection can be cancelled. + */ CHECK } @@ -51,6 +106,7 @@ export enum PartyOption { SPLICE, UNSPLICE, RELEASE, + RENAME, SCROLL_UP = 1000, SCROLL_DOWN = 1001, FORM_CHANGE_ITEM = 2000, @@ -58,15 +114,15 @@ export enum PartyOption { MOVE_2, MOVE_3, MOVE_4, - ALL = 4000 + ALL = 4000, } export type PartySelectCallback = (cursor: integer, option: PartyOption) => void; export type PartyModifierTransferSelectCallback = (fromCursor: integer, index: integer, itemQuantity?: integer, toCursor?: integer) => void; export type PartyModifierSpliceSelectCallback = (fromCursor: integer, toCursor?: integer) => void; -export type PokemonSelectFilter = (pokemon: PlayerPokemon) => string; -export type PokemonModifierTransferSelectFilter = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => string; -export type PokemonMoveSelectFilter = (pokemonMove: PokemonMove) => string; +export type PokemonSelectFilter = (pokemon: PlayerPokemon) => string | null; +export type PokemonModifierTransferSelectFilter = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => string | null; +export type PokemonMoveSelectFilter = (pokemonMove: PokemonMove) => string | null; export default class PartyUiHandler extends MessageUiHandler { private partyUiMode: PartyUiMode; @@ -85,9 +141,10 @@ export default class PartyUiHandler extends MessageUiHandler { private optionsCursor: integer = 0; private optionsScrollCursor: integer = 0; private optionsScrollTotal: integer = 0; - private optionsContainer: Phaser.GameObjects.Container; + /** This is only public for test/ui/transfer-item.test.ts */ + public optionsContainer: Phaser.GameObjects.Container; private optionsBg: Phaser.GameObjects.NineSlice; - private optionsCursorObj: Phaser.GameObjects.Image; + private optionsCursorObj: Phaser.GameObjects.Image | null; private options: integer[]; private transferMode: boolean; @@ -101,7 +158,7 @@ export default class PartyUiHandler extends MessageUiHandler { private transferAll: boolean; private lastCursor: integer = 0; - private selectCallback: PartySelectCallback | PartyModifierTransferSelectCallback; + private selectCallback: PartySelectCallback | PartyModifierTransferSelectCallback | null; private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter; private moveSelectFilter: PokemonMoveSelectFilter; private tmMoveId: Moves; @@ -109,18 +166,20 @@ export default class PartyUiHandler extends MessageUiHandler { private iconAnimHandler: PokemonIconAnimHandler; + private blockInput: boolean; + private static FilterAll = (_pokemon: PlayerPokemon) => null; public static FilterNonFainted = (pokemon: PlayerPokemon) => { if (pokemon.isFainted()) { - return `${pokemon.name} has no energy\nleft to battle!`; + return i18next.t("partyUiHandler:noEnergy", { pokemonName: getPokemonNameWithAffix(pokemon) }); } return null; }; public static FilterFainted = (pokemon: PlayerPokemon) => { if (!pokemon.isFainted()) { - return `${pokemon.name} still has energy\nto battle!`; + return i18next.t("partyUiHandler:hasEnergy", { pokemonName: getPokemonNameWithAffix(pokemon) }); } return null; }; @@ -134,7 +193,7 @@ export default class PartyUiHandler extends MessageUiHandler { const challengeAllowed = new Utils.BooleanHolder(true); applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, pokemon, challengeAllowed); if (!challengeAllowed.value) { - return `${pokemon.name} can't be used in\nthis challenge!`; + return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: getPokemonNameWithAffix(pokemon) }); } return null; }; @@ -144,14 +203,14 @@ export default class PartyUiHandler extends MessageUiHandler { public static FilterItemMaxStacks = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => { const matchingModifier = pokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier)) as PokemonHeldItemModifier; if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount(pokemon.scene)) { - return `${pokemon.name} has too many\nof this item!`; + return i18next.t("partyUiHandler:tooManyItems", { pokemonName: getPokemonNameWithAffix(pokemon) }); } return null; }; - public static NoEffectMessage = "It won't have any effect."; + public static NoEffectMessage = i18next.t("partyUiHandler:anyEffect"); - private localizedOptions = [PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH]; + private localizedOptions = [PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH, PartyOption.SPLICE, PartyOption.UNSPLICE, PartyOption.REVIVE, PartyOption.TRANSFER, PartyOption.UNPAUSE_EVOLUTION, PartyOption.PASS_BATON, PartyOption.RENAME]; constructor(scene: BattleScene) { super(scene, Mode.PARTY); @@ -252,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; } @@ -260,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; } @@ -284,6 +343,36 @@ export default class PartyUiHandler extends MessageUiHandler { const pokemon = this.scene.getParty()[this.cursor]; if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode && option !== PartyOption.CANCEL) { this.startTransfer(); + + let ableToTransfer: string; + for (let p = 0; p < this.scene.getParty().length; p++) { // this fore look goes through each of the party pokemon + const newPokemon = this.scene.getParty()[p]; + // this next line gets all of the transferable items from pokemon [p]; it does this by getting all the held modifiers that are transferable and checking to see if they belong to pokemon [p] + const getTransferrableItemsFromPokemon = (newPokemon: PlayerPokemon) => + this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).isTransferrable && (m as PokemonHeldItemModifier).pokemonId === newPokemon.id) as PokemonHeldItemModifier[]; + // this next bit checks to see if the the selected item from the original transfer pokemon exists on the new pokemon [p]; this returns undefined if the new pokemon doesn't have the item at all, otherwise it returns the pokemonHeldItemModifier for that item + const matchingModifier = newPokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === newPokemon.id && m.matchType(getTransferrableItemsFromPokemon(pokemon)[this.transferOptionCursor])) as PokemonHeldItemModifier; + const partySlot = this.partySlots.filter(m => m.getPokemon() === newPokemon)[0]; // this gets pokemon [p] for us + if (p !== this.transferCursor) { // this skips adding the able/not able labels on the pokemon doing the transfer + if (matchingModifier) { // if matchingModifier exists then the item exists on the new pokemon + if (matchingModifier.getMaxStackCount(this.scene) === matchingModifier.stackCount) { // checks to see if the stack of items is at max stack; if so, set the description label to "Not able" + ableToTransfer = "Not able"; + } else { // if the pokemon isn't at max stack, make the label "Able" + ableToTransfer = "Able"; + } + } else { // if matchingModifier doesn't exist, that means the pokemon doesn't have any of the item, and we need to show "Able" + ableToTransfer = "Able"; + } + } else { // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text + ableToTransfer = ""; + } + partySlot.slotHpBar.setVisible(false); + partySlot.slotHpOverlay.setVisible(false); + partySlot.slotHpText.setVisible(false); + partySlot.slotDescriptionLabel.setText(ableToTransfer); + partySlot.slotDescriptionLabel.setVisible(true); + } + this.clearOptions(); ui.playSelect(); return true; @@ -292,26 +381,26 @@ export default class PartyUiHandler extends MessageUiHandler { this.moveInfoOverlay.clear(); const filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); if (filterResult === null) { - this.selectCallback(this.cursor, option); + this.selectCallback?.(this.cursor, option); this.clearOptions(); } else { this.clearOptions(); - this.showText(filterResult as string, null, () => this.showText(null, 0), null, true); + this.showText(filterResult as string, undefined, () => this.showText("", 0), undefined, true); } ui.playSelect(); return true; - } else if ((option !== PartyOption.SUMMARY && option !== PartyOption.UNPAUSE_EVOLUTION && option !== PartyOption.UNSPLICE && option !== PartyOption.RELEASE && option !== PartyOption.CANCEL) + } else if ((option !== PartyOption.SUMMARY && option !== PartyOption.UNPAUSE_EVOLUTION && option !== PartyOption.UNSPLICE && option !== PartyOption.RELEASE && option !== PartyOption.CANCEL && option !== PartyOption.RENAME) || (option === PartyOption.RELEASE && this.partyUiMode === PartyUiMode.RELEASE)) { - let filterResult: string; + let filterResult: string | null; const getTransferrableItemsFromPokemon = (pokemon: PlayerPokemon) => - this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === pokemon.id) as PokemonHeldItemModifier[]; + this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferrable && m.pokemonId === pokemon.id) as PokemonHeldItemModifier[]; if (option !== PartyOption.TRANSFER && option !== PartyOption.SPLICE) { filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); if (filterResult === null && (option === PartyOption.SEND_OUT || option === PartyOption.PASS_BATON)) { filterResult = this.FilterChallengeLegal(pokemon); } if (filterResult === null && this.partyUiMode === PartyUiMode.MOVE_MODIFIER) { - filterResult = this.moveSelectFilter(pokemon.moveset[this.optionsCursor]); + filterResult = this.moveSelectFilter(pokemon.moveset[this.optionsCursor]!); // TODO: is this bang correct? } } else { filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)(pokemon, getTransferrableItemsFromPokemon(this.scene.getParty()[this.transferCursor])[this.transferOptionCursor]); @@ -348,10 +437,7 @@ export default class PartyUiHandler extends MessageUiHandler { } else { if (option >= PartyOption.FORM_CHANGE_ITEM && this.scene.getCurrentPhase() instanceof SelectModifierPhase) { if (this.partyUiMode === PartyUiMode.CHECK) { - let formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; - if (formChangeItemModifiers.find(m => m.active)) { - formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active); - } + const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; modifier.active = !modifier.active; this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger, false, true); @@ -366,7 +452,7 @@ export default class PartyUiHandler extends MessageUiHandler { return true; } else { this.clearOptions(); - this.showText(filterResult as string, null, () => this.showText(null, 0), null, true); + this.showText(filterResult as string, undefined, () => this.showText("", 0), undefined, true); } } else if (option === PartyOption.SUMMARY) { ui.playSelect(); @@ -376,44 +462,65 @@ export default class PartyUiHandler extends MessageUiHandler { this.clearOptions(); ui.playSelect(); pokemon.pauseEvolutions = false; - this.showText(`Evolutions have been unpaused for ${pokemon.name}.`, null, () => this.showText(null, 0), null, true); + this.showText(i18next.t("partyUiHandler:unpausedEvolutions", { pokemonName: getPokemonNameWithAffix(pokemon) }), undefined, () => this.showText("", 0), null, true); } else if (option === PartyOption.UNSPLICE) { this.clearOptions(); ui.playSelect(); - this.showText(`Do you really want to unsplice ${pokemon.fusionSpecies.name}\nfrom ${pokemon.name}? ${pokemon.fusionSpecies.name} will be lost.`, null, () => { + this.showText(i18next.t("partyUiHandler:unspliceConfirmation", { fusionName: pokemon.fusionSpecies?.name, pokemonName: pokemon.name }), null, () => { ui.setModeWithoutClear(Mode.CONFIRM, () => { const fusionName = pokemon.name; pokemon.unfuse().then(() => { this.clearPartySlots(); this.populatePartySlots(); ui.setMode(Mode.PARTY); - this.showText(`${fusionName} was reverted to ${pokemon.name}.`, null, () => { + this.showText(i18next.t("partyUiHandler:wasReverted", { fusionName: fusionName, pokemonName: pokemon.name }), undefined, () => { ui.setMode(Mode.PARTY); - this.showText(null, 0); + this.showText("", 0); }, null, true); }); }, () => { ui.setMode(Mode.PARTY); - this.showText(null, 0); + this.showText("", 0); }); }); } else if (option === PartyOption.RELEASE) { this.clearOptions(); ui.playSelect(); if (this.cursor >= this.scene.currentBattle.getBattlerCount() || !pokemon.isAllowedInBattle()) { - this.showText(`Do you really want to release ${pokemon.name}?`, null, () => { + 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); }, () => { ui.setMode(Mode.PARTY); - this.showText(null, 0); + this.showText("", 0); }); }); } else { - this.showText("You can't release a Pokémon that's in battle!", null, () => this.showText(null, 0), null, true); + this.showText(i18next.t("partyUiHandler:releaseInBattle"), null, () => this.showText("", 0), null, true); } return true; + } else if (option === PartyOption.RENAME) { + this.clearOptions(); + ui.playSelect(); + ui.setModeWithoutClear(Mode.RENAME_POKEMON, { + buttonActions: [ + (nickname: string) => { + ui.playSelect(); + pokemon.nickname = nickname; + pokemon.updateInfo(); + this.clearPartySlots(); + this.populatePartySlots(); + ui.setMode(Mode.PARTY); + }, + () => { + ui.setMode(Mode.PARTY); + } + ] + }, pokemon); + return true; } else if (option === PartyOption.CANCEL) { return this.processInput(Button.CANCEL); } @@ -480,7 +587,7 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode) { /** Initialize item quantities for the selected Pokemon */ const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === this.scene.getParty()[this.cursor].id) as PokemonHeldItemModifier[]; + && m.isTransferrable && m.pokemonId === this.scene.getParty()[this.cursor].id) as PokemonHeldItemModifier[]; this.transferQuantities = itemModifiers.map(item => item.getStackCount()); this.transferQuantitiesMax = itemModifiers.map(item => item.getStackCount()); } @@ -628,8 +735,8 @@ export default class PartyUiHandler extends MessageUiHandler { return changed; } - showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { - if (text === null) { + showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { + if (text.length === 0) { text = defaultMessage; } @@ -651,20 +758,20 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsMode = true; - let optionsMessage = "Do what with this Pokémon?"; + let optionsMessage = i18next.t("partyUiHandler:doWhatWithThisPokemon"); switch (this.partyUiMode) { case PartyUiMode.MOVE_MODIFIER: - optionsMessage = "Select a move."; + optionsMessage = i18next.t("partyUiHandler:selectAMove"); break; case PartyUiMode.MODIFIER_TRANSFER: if (!this.transferMode) { - optionsMessage = "Select a held item to transfer.\nUse < and > to change the quantity."; + optionsMessage = i18next.t("partyUiHandler:changeQuantity"); } break; case PartyUiMode.SPLICE: if (!this.transferMode) { - optionsMessage = "Select another Pokémon to splice."; + optionsMessage = i18next.t("partyUiHandler:selectAnotherPokemonToSplice"); } break; } @@ -688,7 +795,7 @@ export default class PartyUiHandler extends MessageUiHandler { const learnableLevelMoves = this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER ? pokemon.getLearnableLevelMoves() - : null; + : []; if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER && learnableLevelMoves?.length) { // show the move overlay with info for the first move @@ -697,8 +804,8 @@ export default class PartyUiHandler extends MessageUiHandler { const itemModifiers = this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER ? this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === pokemon.id) as PokemonHeldItemModifier[] - : null; + && m.isTransferrable && m.pokemonId === pokemon.id) as PokemonHeldItemModifier[] + : []; if (this.options.length) { this.options.splice(0, this.options.length); @@ -706,7 +813,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.eraseOptionsCursor(); } - let formChangeItemModifiers: PokemonFormChangeItemModifier[]; + let formChangeItemModifiers: PokemonFormChangeItemModifier[] | undefined; if (this.partyUiMode !== PartyUiMode.MOVE_MODIFIER && this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.transferMode || this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER)) { switch (this.partyUiMode) { @@ -714,10 +821,21 @@ export default class PartyUiHandler extends MessageUiHandler { case PartyUiMode.FAINT_SWITCH: case PartyUiMode.POST_BATTLE_SWITCH: if (this.cursor >= this.scene.currentBattle.getBattlerCount()) { - this.options.push(PartyOption.SEND_OUT); - if (this.partyUiMode !== PartyUiMode.FAINT_SWITCH - && this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier - && (m as SwitchEffectTransferModifier).pokemonId === this.scene.getPlayerField()[this.fieldIndex].id)) { + const allowBatonModifierSwitch = + this.partyUiMode !== PartyUiMode.FAINT_SWITCH + && this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier + && (m as SwitchEffectTransferModifier).pokemonId === this.scene.getPlayerField()[this.fieldIndex].id); + + const moveHistory = this.scene.getPlayerField()[this.fieldIndex].getMoveHistory(); + const isBatonPassMove = this.partyUiMode === PartyUiMode.FAINT_SWITCH && moveHistory.length && allMoves[moveHistory[moveHistory.length - 1].move].getAttrs(ForceSwitchOutAttr)[0]?.isBatonPass() && moveHistory[moveHistory.length - 1].result === MoveResult.SUCCESS; + + // isBatonPassMove and allowBatonModifierSwitch shouldn't ever be true + // at the same time, because they both explicitly check for a mutually + // exclusive partyUiMode. But better safe than sorry. + this.options.push(isBatonPassMove && !allowBatonModifierSwitch ? PartyOption.PASS_BATON : PartyOption.SEND_OUT); + if (allowBatonModifierSwitch && !isBatonPassMove) { + // the BATON modifier gives an extra switch option for + // pokemon-command switches, allowing buffs to be optionally passed this.options.push(PartyOption.PASS_BATON); } } @@ -748,10 +866,7 @@ export default class PartyUiHandler extends MessageUiHandler { break; case PartyUiMode.CHECK: if (this.scene.getCurrentPhase() instanceof SelectModifierPhase) { - formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; - if (formChangeItemModifiers.find(m => m.active)) { - formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active); - } + formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); for (let i = 0; i < formChangeItemModifiers.length; i++) { this.options.push(PartyOption.FORM_CHANGE_ITEM + i); } @@ -760,6 +875,7 @@ export default class PartyUiHandler extends MessageUiHandler { } this.options.push(PartyOption.SUMMARY); + this.options.push(PartyOption.RENAME); if (pokemon.pauseEvolutions && pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId)) { this.options.push(PartyOption.UNPAUSE_EVOLUTION); @@ -819,7 +935,7 @@ export default class PartyUiHandler extends MessageUiHandler { optionEndIndex = this.options.length; let widestOptionWidth = 0; - const optionTexts: Phaser.GameObjects.Text[] = []; + const optionTexts: BBCodeText[] = []; for (let o = optionStartIndex; o < optionEndIndex; o++) { const option = this.options[this.options.length - (o + 1)]; @@ -835,7 +951,7 @@ export default class PartyUiHandler extends MessageUiHandler { case PartyOption.MOVE_2: case PartyOption.MOVE_3: case PartyOption.MOVE_4: - const move = pokemon.moveset[option - PartyOption.MOVE_1]; + const move = pokemon.moveset[option - PartyOption.MOVE_1]!; // TODO: is the bang correct? if (this.showMovePp) { const maxPP = move.getMovePp(); const currPP = maxPP - move.ppUsed; @@ -847,7 +963,7 @@ export default class PartyUiHandler extends MessageUiHandler { default: if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; - optionName = `${modifier.active ? "Deactivate" : "Activate"} ${modifier.type.name}`; + optionName = `${modifier.active ? i18next.t("partyUiHandler:DEACTIVATE") : i18next.t("partyUiHandler:ACTIVATE")} ${modifier.type.name}`; } else { if (this.localizedOptions.includes(option)) { optionName = i18next.t(`partyUiHandler:${PartyOption[option]}`); @@ -861,27 +977,36 @@ export default class PartyUiHandler extends MessageUiHandler { const move = learnableLevelMoves[option]; optionName = allMoves[move].name; altText = !pokemon.getSpeciesForm().getLevelMoves().find(plm => plm[1] === move); + } else if (option === PartyOption.ALL) { + optionName = i18next.t("partyUiHandler:ALL"); } else { - if (option === PartyOption.ALL) { - optionName = i18next.t("partyUiHandler:ALL"); - } else { - const itemModifier = itemModifiers[option]; - optionName = itemModifier.type.name; - /** For every item that has stack bigger than 1, display the current quantity selection */ - if (this.transferQuantitiesMax[option] > 1) { - optionName += ` (${this.transferQuantities[option]})`; - } - } + const itemModifier = itemModifiers[option]; + optionName = itemModifier.type.name; } const yCoord = -6 - 16 * o; - const optionText = addTextObject(this.scene, 0, yCoord - 16, optionName, TextStyle.WINDOW); + const optionText = addBBCodeTextObject(this.scene, 0, yCoord - 16, optionName, TextStyle.WINDOW, { maxLines: 1 }); if (altText) { optionText.setColor("#40c8f8"); optionText.setShadowColor("#006090"); } optionText.setOrigin(0, 0); + /** For every item that has stack bigger than 1, display the current quantity selection */ + const itemModifier = itemModifiers[option]; + if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && this.transferQuantitiesMax[option] > 1 && !this.transferMode && itemModifier !== undefined && itemModifier.type.name === optionName) { + let amountText = ` (${this.transferQuantities[option]})`; + + /** If the amount held is the maximum, display the count in red */ + if (this.transferQuantitiesMax[option] === itemModifier.getMaxHeldItemCount(undefined)) { + amountText = `[color=${getTextColor(TextStyle.SUMMARY_RED)}]${amountText}[/color]`; + } + + optionText.setText(optionName + amountText); + } + + optionText.setText(`[shadow]${optionText.text}[/shadow]`); + optionTexts.push(optionText); widestOptionWidth = Math.max(optionText.displayWidth, widestOptionWidth); @@ -908,10 +1033,16 @@ export default class PartyUiHandler extends MessageUiHandler { this.transferMode = false; this.transferAll = false; this.partySlots[this.transferCursor].setTransfer(false); + for (let i = 0; i < this.partySlots.length; i++) { + this.partySlots[i].slotDescriptionLabel.setVisible(false); + this.partySlots[i].slotHpBar.setVisible(true); + this.partySlots[i].slotHpOverlay.setVisible(true); + this.partySlots[i].slotHpText.setVisible(true); + } } doRelease(slotIndex: integer): void { - this.showText(this.getReleaseMessage(this.scene.getParty()[slotIndex].name), null, () => { + this.showText(this.getReleaseMessage(getPokemonNameWithAffix(this.scene.getParty()[slotIndex])), null, () => { this.clearPartySlots(); this.scene.removePartyMemberModifiers(slotIndex); const releasedPokemon = this.scene.getParty().splice(slotIndex, 1)[0]; @@ -923,37 +1054,54 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.partyUiMode === PartyUiMode.RELEASE) { const selectCallback = this.selectCallback; this.selectCallback = null; - selectCallback(this.cursor, PartyOption.RELEASE); + selectCallback && selectCallback(this.cursor, PartyOption.RELEASE); } - this.showText(null, 0); + this.showText("", 0); }, null, true); } getReleaseMessage(pokemonName: string): string { const rand = Utils.randInt(128); if (rand < 20) { - return `Goodbye, ${pokemonName}!`; + return i18next.t("partyUiHandler:goodbye", { pokemonName: pokemonName }); } else if (rand < 40) { - return `Byebye, ${pokemonName}!`; + return i18next.t("partyUiHandler:byebye", { pokemonName: pokemonName }); } else if (rand < 60) { - return `Farewell, ${pokemonName}!`; + return i18next.t("partyUiHandler:farewell", { pokemonName: pokemonName }); } else if (rand < 80) { - return `So long, ${pokemonName}!`; + return i18next.t("partyUiHandler:soLong", { pokemonName: pokemonName }); } else if (rand < 100) { - return `This is where we part, ${pokemonName}!`; + return i18next.t("partyUiHandler:thisIsWhereWePart", { pokemonName: pokemonName }); } else if (rand < 108) { - return `I'll miss you, ${pokemonName}!`; + return i18next.t("partyUiHandler:illMissYou", { pokemonName: pokemonName }); } else if (rand < 116) { - return `I'll never forget you, ${pokemonName}!`; + return i18next.t("partyUiHandler:illNeverForgetYou", { pokemonName: pokemonName }); } else if (rand < 124) { - return `Until we meet again, ${pokemonName}!`; + return i18next.t("partyUiHandler:untilWeMeetAgain", { pokemonName: pokemonName }); } else if (rand < 127) { - return `Sayonara, ${pokemonName}!`; + return i18next.t("partyUiHandler:sayonara", { pokemonName: pokemonName }); } else { - return `Smell ya later, ${pokemonName}!`; + return i18next.t("partyUiHandler:smellYaLater", { pokemonName: pokemonName }); } } + getFormChangeItemsModifiers(pokemon: Pokemon) { + let formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; + const ultraNecrozmaModifiers = formChangeItemModifiers.filter(m => m.active && m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z); + if (ultraNecrozmaModifiers.length > 0) { + // ULTRANECROZIUM_Z is active and deactivating it should be the only option + return ultraNecrozmaModifiers; + } + if (formChangeItemModifiers.find(m => m.active)) { + // a form is currently active. the user has to disable the form or activate ULTRANECROZIUM_Z + formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active || m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z); + } else if (pokemon.species.speciesId === Species.NECROZMA) { + // no form is currently active. the user has to activate some form, except ULTRANECROZIUM_Z + formChangeItemModifiers = formChangeItemModifiers.filter(m => m.formChangeItem !== FormChangeItem.ULTRANECROZIUM_Z); + } + return formChangeItemModifiers; + } + getOptionsCursorWithScroll(): integer { return this.optionsCursor + this.optionsScrollCursor + (this.options && this.options[0] === PartyOption.SCROLL_UP ? -1 : 0); } @@ -970,7 +1118,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.eraseOptionsCursor(); this.partyMessageBox.setSize(262, 30); - this.showText(null, 0); + this.showText("", 0); } eraseOptionsCursor() { @@ -1002,6 +1150,12 @@ class PartySlot extends Phaser.GameObjects.Container { private slotBg: Phaser.GameObjects.Image; private slotPb: Phaser.GameObjects.Sprite; + public slotName: Phaser.GameObjects.Text; + public slotHpBar: Phaser.GameObjects.Image; + public slotHpOverlay: Phaser.GameObjects.Sprite; + public slotHpText: Phaser.GameObjects.Text; + public slotDescriptionLabel: Phaser.GameObjects.Text; // this is used to show text instead of the HP bar i.e. for showing "Able"/"Not Able" for TMs when you try to learn them + private pokemonIcon: Phaser.GameObjects.Container; private iconAnimHandler: PokemonIconAnimHandler; @@ -1018,6 +1172,10 @@ class PartySlot extends Phaser.GameObjects.Container { this.setup(partyUiMode, tmMoveId); } + getPokemon(): PlayerPokemon { + return this.pokemon; + } + setup(partyUiMode: PartyUiMode, tmMoveId: Moves) { const battlerCount = (this.scene as BattleScene).currentBattle.getBattlerCount(); @@ -1042,7 +1200,7 @@ class PartySlot extends Phaser.GameObjects.Container { const slotInfoContainer = this.scene.add.container(0, 0); this.add(slotInfoContainer); - let displayName = this.pokemon.name; + let displayName = this.pokemon.getNameToRender(); let nameTextWidth: number; const nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); @@ -1056,19 +1214,19 @@ class PartySlot extends Phaser.GameObjects.Container { nameSizeTest.destroy(); - const slotName = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); - slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, this.slotIndex >= battlerCount ? 2 : 10); - slotName.setOrigin(0, 0); + this.slotName = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); + this.slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, this.slotIndex >= battlerCount ? 2 : 10); + this.slotName.setOrigin(0, 0); const slotLevelLabel = this.scene.add.image(0, 0, "party_slot_overlay_lv"); - slotLevelLabel.setPositionRelative(slotName, 8, 12); + slotLevelLabel.setPositionRelative(this.slotName, 8, 12); slotLevelLabel.setOrigin(0, 0); const slotLevelText = addTextObject(this.scene, 0, 0, this.pokemon.level.toString(), this.pokemon.level < (this.scene as BattleScene).getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED); slotLevelText.setPositionRelative(slotLevelLabel, 9, 0); slotLevelText.setOrigin(0, 0.25); - slotInfoContainer.add([ slotName, slotLevelLabel, slotLevelText ]); + slotInfoContainer.add([this.slotName, slotLevelLabel, slotLevelText ]); const genderSymbol = getGenderSymbol(this.pokemon.getGender(true)); @@ -1079,7 +1237,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.slotIndex >= battlerCount) { slotGenderText.setPositionRelative(slotLevelLabel, 36, 0); } else { - slotGenderText.setPositionRelative(slotName, 76 - (this.pokemon.fusionSpecies ? 8 : 0), 3); + slotGenderText.setPositionRelative(this.slotName, 76 - (this.pokemon.fusionSpecies ? 8 : 0), 3); } slotGenderText.setOrigin(0, 0.25); @@ -1093,7 +1251,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.slotIndex >= battlerCount) { splicedIcon.setPositionRelative(slotLevelLabel, 36 + (genderSymbol ? 8 : 0), 0.5); } else { - splicedIcon.setPositionRelative(slotName, 76, 3.5); + splicedIcon.setPositionRelative(this.slotName, 76, 3.5); } slotInfoContainer.add(splicedIcon); @@ -1113,7 +1271,7 @@ class PartySlot extends Phaser.GameObjects.Container { const shinyStar = this.scene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); shinyStar.setOrigin(0, 0); - shinyStar.setPositionRelative(slotName, -9, 3); + shinyStar.setPositionRelative(this.slotName, -9, 3); shinyStar.setTint(getVariantTint(!doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant)); slotInfoContainer.add(shinyStar); @@ -1128,42 +1286,53 @@ class PartySlot extends Phaser.GameObjects.Container { } } + this.slotHpBar = this.scene.add.image(0, 0, "party_slot_hp_bar"); + this.slotHpBar.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 72 : 8, this.slotIndex >= battlerCount ? 6 : 31); + this.slotHpBar.setOrigin(0, 0); + this.slotHpBar.setVisible(false); + + const hpRatio = this.pokemon.getHpRatio(); + + this.slotHpOverlay = this.scene.add.sprite(0, 0, "party_slot_hp_overlay", hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low"); + this.slotHpOverlay.setPositionRelative(this.slotHpBar, 16, 2); + this.slotHpOverlay.setOrigin(0, 0); + this.slotHpOverlay.setScale(hpRatio, 1); + this.slotHpOverlay.setVisible(false); + + this.slotHpText = addTextObject(this.scene, 0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY); + this.slotHpText.setPositionRelative(this.slotHpBar, this.slotHpBar.width - 3, this.slotHpBar.height - 2); + this.slotHpText.setOrigin(1, 0); + this.slotHpText.setVisible(false); + + this.slotDescriptionLabel = addTextObject(this.scene, 0, 0, "", TextStyle.MESSAGE); + this.slotDescriptionLabel.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 94 : 32, this.slotIndex >= battlerCount ? 16 : 46); + this.slotDescriptionLabel.setOrigin(0, 1); + this.slotDescriptionLabel.setVisible(false); + + slotInfoContainer.add([this.slotHpBar, this.slotHpOverlay, this.slotHpText, this.slotDescriptionLabel]); + if (partyUiMode !== PartyUiMode.TM_MODIFIER) { - const slotHpBar = this.scene.add.image(0, 0, "party_slot_hp_bar"); - slotHpBar.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 72 : 8, this.slotIndex >= battlerCount ? 6 : 31); - slotHpBar.setOrigin(0, 0); - - const hpRatio = this.pokemon.getHpRatio(); - - const slotHpOverlay = this.scene.add.sprite(0, 0, "party_slot_hp_overlay", hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low"); - slotHpOverlay.setPositionRelative(slotHpBar, 16, 2); - slotHpOverlay.setOrigin(0, 0); - slotHpOverlay.setScale(hpRatio, 1); - - const slotHpText = addTextObject(this.scene, 0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY); - slotHpText.setPositionRelative(slotHpBar, slotHpBar.width - 3, slotHpBar.height - 2); - slotHpText.setOrigin(1, 0); - - slotInfoContainer.add([ slotHpBar, slotHpOverlay, slotHpText ]); + this.slotDescriptionLabel.setVisible(false); + this.slotHpBar.setVisible(true); + this.slotHpOverlay.setVisible(true); + this.slotHpText.setVisible(true); } else { + this.slotHpBar.setVisible(false); + this.slotHpOverlay.setVisible(false); + this.slotHpText.setVisible(false); let slotTmText: string; - switch (true) { - case (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1): - slotTmText = "Not Able"; - break; - case (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0): - slotTmText = "Learned"; - break; - default: - slotTmText = "Able"; - break; + + if (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0) { + slotTmText = i18next.t("partyUiHandler:learned"); + } else if (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1) { + slotTmText = i18next.t("partyUiHandler:notAble"); + } else { + slotTmText = i18next.t("partyUiHandler:able"); } - const slotTmLabel = addTextObject(this.scene, 0, 0, slotTmText, TextStyle.MESSAGE); - slotTmLabel.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 94 : 32, this.slotIndex >= battlerCount ? 16 : 46); - slotTmLabel.setOrigin(0, 1); + this.slotDescriptionLabel.setText(slotTmText); + this.slotDescriptionLabel.setVisible(true); - slotInfoContainer.add(slotTmLabel); } } @@ -1230,7 +1399,7 @@ class PartyCancelButton extends Phaser.GameObjects.Container { this.partyCancelPb = partyCancelPb; - const partyCancelText = addTextObject(this.scene, -8, -7, "Cancel", TextStyle.PARTY); + const partyCancelText = addTextObject(this.scene, -8, -7, i18next.t("partyUiHandler:cancel"), TextStyle.PARTY); this.add(partyCancelText); } diff --git a/src/ui/pokeball-tray.ts b/src/ui/pokeball-tray.ts index 00a8cdadc97..0313812ef79 100644 --- a/src/ui/pokeball-tray.ts +++ b/src/ui/pokeball-tray.ts @@ -15,7 +15,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, `pb_tray_overlay_${this.player ? "player" : "enemy"}`, null, 104, 4, 48, 8, 0, 0); + this.bg = this.scene.add.nineslice(0, 0, `pb_tray_overlay_${this.player ? "player" : "enemy"}`, undefined, 104, 4, 48, 8, 0, 0); this.bg.setOrigin(this.player ? 1 : 0, 0); this.add(this.bg); @@ -57,7 +57,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { ball.setFrame(ballFrame); }); - (this.scene as BattleScene).playSound("pb_tray_enter"); + (this.scene as BattleScene).playSound("se/pb_tray_enter"); this.scene.tweens.add({ targets: this, @@ -71,7 +71,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { x: `${this.player ? "-" : "+"}=104`, duration: b * 100, ease: "Sine.easeIn", - onComplete: () => (this.scene as BattleScene).playSound(b < party.length ? "pb_tray_ball" : "pb_tray_empty") + onComplete: () => (this.scene as BattleScene).playSound(`se/${(b < party.length ? "pb_tray_ball" : "pb_tray_empty")}`) }); }); } 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-icon-anim-handler.ts b/src/ui/pokemon-icon-anim-handler.ts index 99fe39c4184..d6796d5cb5d 100644 --- a/src/ui/pokemon-icon-anim-handler.ts +++ b/src/ui/pokemon-icon-anim-handler.ts @@ -21,7 +21,9 @@ export default class PokemonIconAnimHandler { const value = tween.getValue(); this.toggled = !!value; for (const i of this.icons.keys()) { - i.y += this.getModeYDelta(this.icons.get(i)) * (this.toggled ? 1 : -1); + const icon = this.icons.get(i); + const delta = icon ? this.getModeYDelta(icon) : 0; + i.y += delta * (this.toggled ? 1 : -1); } }; scene.tweens.addCounter({ @@ -56,7 +58,7 @@ export default class PokemonIconAnimHandler { } if (this.toggled) { const lastYDelta = this.icons.has(i) - ? this.icons.get(i) + ? this.icons.get(i)! : 0; const yDelta = this.getModeYDelta(mode); i.y += yDelta + lastYDelta; @@ -71,7 +73,9 @@ export default class PokemonIconAnimHandler { } for (const i of icons) { if (this.toggled) { - i.y -= this.getModeYDelta(this.icons.get(i)); + const icon = this.icons.get(i); + const delta = icon ? this.getModeYDelta(icon) : 0; + i.y -= delta; } this.icons.delete(i); } @@ -80,7 +84,9 @@ export default class PokemonIconAnimHandler { removeAll(): void { for (const i of this.icons.keys()) { if (this.toggled) { - i.y -= this.getModeYDelta(this.icons.get(i)); + const icon = this.icons.get(i); + const delta = icon ? this.getModeYDelta(icon) : 0; + i.y -= delta; } this.icons.delete(i); } diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 9ab3028b564..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; @@ -80,12 +81,12 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { setup(): void { this.setName("pkmn-info"); - const currentLanguage = i18next.resolvedLanguage; - const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)); + 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,16 +208,23 @@ 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)); this.pokemonGenderText.setShadowColor(getGenderColor(pokemon.gender, true)); this.pokemonGenderText.setVisible(true); - const newGender = BigInt(Math.pow(2, pokemon.gender)) * DexAttr.MALE; + const newGender = BigInt(1 << pokemon.gender) * DexAttr.MALE; this.pokemonGenderNewText.setText("(+)"); this.pokemonGenderNewText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); this.pokemonGenderNewText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); @@ -229,7 +237,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { if (pokemon.species.forms?.[pokemon.formIndex]?.formName) { this.pokemonFormLabelText.setVisible(true); this.pokemonFormText.setVisible(true); - const newForm = BigInt(Math.pow(2, pokemon.formIndex)) * DexAttr.DEFAULT_FORM; + const newForm = BigInt(1 << pokemon.formIndex) * DexAttr.DEFAULT_FORM; if ((newForm & caughtAttr) === BigInt(0)) { this.pokemonFormLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); @@ -243,7 +251,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonFormText.setText(formName.length > this.numCharsBeforeCutoff ? formName.substring(0, this.numCharsBeforeCutoff - 3) + "..." : formName); if (formName.length > this.numCharsBeforeCutoff) { this.pokemonFormText.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.pokemonFormText.width, this.pokemonFormText.height), Phaser.Geom.Rectangle.Contains); - this.pokemonFormText.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, pokemon.species.forms?.[pokemon.formIndex]?.formName, true)); + this.pokemonFormText.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", pokemon.species.forms?.[pokemon.formIndex]?.formName, true)); this.pokemonFormText.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } else { this.pokemonFormText.disableInteractive(); @@ -266,9 +274,9 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { */ const opponentPokemonOneNormalAbility = (pokemon.species.getAbilityCount() === 2); const opponentPokemonAbilityIndex = (opponentPokemonOneNormalAbility && pokemon.abilityIndex === 1) ? 2 : pokemon.abilityIndex; - const opponentPokemonAbilityAttr = Math.pow(2, opponentPokemonAbilityIndex); + 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,8 +288,8 @@ 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 newNature = Math.pow(2, pokemon.nature + 1); + const dexNatures = dexEntry.natureAttr; + const newNature = 1 << (pokemon.nature + 1); if (!(dexNatures & newNature)) { this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); @@ -300,13 +308,13 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyIcon.setTint(getVariantTint(baseVariant)); if (this.pokemonShinyIcon.visible) { const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? i18next.t("pokemonInfoContainer:epic") : baseVariant === 1 ? i18next.t("pokemonInfoContainer:rare") : i18next.t("pokemonInfoContainer:common")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("pokemonInfoContainer:epic") : pokemon.fusionVariant === 1 ? i18next.t("pokemonInfoContainer:rare") : i18next.t("pokemonInfoContainer:common")}` : ""}` + `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` : ""; - this.pokemonShinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); + this.pokemonShinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); this.pokemonShinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); - const newShiny = BigInt(Math.pow(2, (pokemon.shiny ? 1 : 0))); - const newVariant = BigInt(Math.pow(2, pokemon.variant + 4)); + const newShiny = BigInt(1 << (pokemon.shiny ? 1 : 0)); + const newVariant = BigInt(1 << (pokemon.variant + 4)); this.pokemonShinyNewIcon.setText("(+)"); this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); @@ -324,35 +332,35 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { } const starterSpeciesId = pokemon.species.getRootSpeciesId(); - const originalIvs: integer[] = 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); - - 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) { + this.statsContainer.updateIvs(pokemon.ivs, originalIvs!); // TODO: is this bang correct? + 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++) { - const move = m < pokemon.moveset.length ? pokemon.moveset[m].getMove() : null; + const move = m < pokemon.moveset.length && pokemon.moveset[m] ? pokemon.moveset[m]!.getMove() : null; this.pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); this.pokemonMoveLabels[m].setText(move ? move.name : "-"); this.pokemonMovesContainers[m].setVisible(!!move); @@ -364,13 +372,44 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { }); } - makeRoomForConfirmUi(speedMultiplier: number = 1): Promise { + 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 => { this.scene.tweens.add({ targets: this, duration: Utils.fixedInt(Math.floor(150 / speedMultiplier)), ease: "Cubic.easeInOut", - x: this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth, + x: xPosition, onComplete: () => { resolve(); } diff --git a/src/ui/registration-form-ui-handler.ts b/src/ui/registration-form-ui-handler.ts index d5e7f239378..0c4b54ac723 100644 --- a/src/ui/registration-form-ui-handler.ts +++ b/src/ui/registration-form-ui-handler.ts @@ -5,6 +5,20 @@ import { Mode } from "./ui"; import { TextStyle, addTextObject } from "./text"; import i18next from "i18next"; + +interface LanguageSetting { + inputFieldFontSize?: string, + warningMessageFontSize?: string, + errorMessageFontSize?: string, +} + +const languageSettings: { [key: string]: LanguageSetting } = { + "es":{ + inputFieldFontSize: "50px", + errorMessageFontSize: "40px", + } +}; + export default class RegistrationFormUiHandler extends FormModalUiHandler { getModalTitle(config?: ModalConfig): string { return i18next.t("menu:register"); @@ -50,7 +64,17 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { setup(): void { super.setup(); - const label = addTextObject(this.scene, 10, 87, i18next.t("menu:registrationAgeWarning"), TextStyle.TOOLTIP_CONTENT, { fontSize: "42px" }); + this.modalContainer.list.forEach((child: Phaser.GameObjects.GameObject) => { + if (child instanceof Phaser.GameObjects.Text && child !== this.titleText) { + const inputFieldFontSize = languageSettings[i18next.resolvedLanguage!]?.inputFieldFontSize; + if (inputFieldFontSize) { + child.setFontSize(inputFieldFontSize); + } + } + }); + + const warningMessageFontSize = languageSettings[i18next.resolvedLanguage!]?.warningMessageFontSize ?? "42px"; + const label = addTextObject(this.scene, 10, 87, i18next.t("menu:registrationAgeWarning"), TextStyle.TOOLTIP_CONTENT, { fontSize: warningMessageFontSize}); this.modalContainer.add(label); } @@ -68,6 +92,10 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { const onFail = error => { this.scene.ui.setMode(Mode.REGISTRATION_FORM, Object.assign(config, { errorMessage: error?.trim() })); this.scene.ui.playError(); + const errorMessageFontSize = languageSettings[i18next.resolvedLanguage!]?.errorMessageFontSize; + if (errorMessageFontSize) { + this.errorMessage.setFontSize(errorMessageFontSize); + } }; if (!this.inputs[0].text) { return onFail(i18next.t("menu:emptyUsername")); @@ -92,7 +120,7 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { .then(response => { if (response.hasOwnProperty("token")) { Utils.setCookie(Utils.sessionIdKey, response.token); - originalRegistrationAction(); + originalRegistrationAction && originalRegistrationAction(); } else { onFail(response); } diff --git a/src/ui/rename-form-ui-handler.ts b/src/ui/rename-form-ui-handler.ts new file mode 100644 index 00000000000..078177cafb1 --- /dev/null +++ b/src/ui/rename-form-ui-handler.ts @@ -0,0 +1,54 @@ +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { ModalConfig } from "./modal-ui-handler"; +import i18next from "i18next"; +import { PlayerPokemon } from "#app/field/pokemon"; + +export default class RenameFormUiHandler extends FormModalUiHandler { + getModalTitle(config?: ModalConfig): string { + return i18next.t("menu:renamePokemon"); + } + + getFields(config?: ModalConfig): string[] { + return [ i18next.t("menu:nickname") ]; + } + + getWidth(config?: ModalConfig): number { + return 160; + } + + getMargin(config?: ModalConfig): [number, number, number, number] { + return [ 0, 0, 48, 0 ]; + } + + getButtonLabels(config?: ModalConfig): string[] { + return [ i18next.t("menu:rename"), i18next.t("menu: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 { + if (super.show(args)) { + const config = args[0] as ModalConfig; + 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 = (_) => { + this.sanitizeInputs(); + const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); + config.buttonActions[0](sanitizedName); + return true; + }; + return true; + } + return false; + } +} diff --git a/src/ui/run-history-ui-handler.ts b/src/ui/run-history-ui-handler.ts new file mode 100644 index 00000000000..8f132a1ab1c --- /dev/null +++ b/src/ui/run-history-ui-handler.ts @@ -0,0 +1,389 @@ +import BattleScene from "../battle-scene"; +import { GameModes } from "../game-mode"; +import { TextStyle, addTextObject } from "./text"; +import { Mode } from "./ui"; +import { addWindow } from "./ui-theme"; +import * as Utils from "../utils"; +import PokemonData from "../system/pokemon-data"; +import MessageUiHandler from "./message-ui-handler"; +import i18next from "i18next"; +import {Button} from "../enums/buttons"; +import { BattleType } from "../battle"; +import { RunEntry } from "../system/game-data"; +import { PlayerGender } from "#enums/player-gender"; +import { TrainerVariant } from "../field/trainer"; + +export type RunSelectCallback = (cursor: integer) => void; + +export const RUN_HISTORY_LIMIT: number = 25; + +/** + * RunHistoryUiHandler handles the UI of the Run History Menu + * Run History itself is broken into an array of RunEntryContainer objects that can show the user basic details about their run and allow them to access more details about their run through cursor action. + * It navigates similarly to the UI of the save slot select menu. + * The only valid input buttons are Button.ACTION and Button.CANCEL. + */ +export default class RunHistoryUiHandler extends MessageUiHandler { + + private runSelectContainer: Phaser.GameObjects.Container; + private runsContainer: Phaser.GameObjects.Container; + private runSelectMessageBox: Phaser.GameObjects.NineSlice; + private runSelectMessageBoxContainer: Phaser.GameObjects.Container; + private runs: RunEntryContainer[]; + + private runSelectCallback: RunSelectCallback | null; + + private scrollCursor: integer = 0; + + private cursorObj: Phaser.GameObjects.NineSlice | null; + + private runContainerInitialY: number; + + constructor(scene: BattleScene) { + super(scene, Mode.RUN_HISTORY); + } + + override setup() { + const ui = this.getUi(); + + this.runSelectContainer = this.scene.add.container(0, 0); + this.runSelectContainer.setVisible(false); + ui.add(this.runSelectContainer); + + const loadSessionBg = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, -this.scene.game.canvas.height / 6, 0x006860); + loadSessionBg.setOrigin(0, 0); + this.runSelectContainer.add(loadSessionBg); + + this.runContainerInitialY = -this.scene.game.canvas.height / 6 + 8; + + this.runsContainer = this.scene.add.container(8, this.runContainerInitialY); + this.runSelectContainer.add(this.runsContainer); + + this.runs = []; + + this.scene.loadImage("hall_of_fame_red", "ui"); + this.scene.loadImage("hall_of_fame_blue", "ui"); + // For some reason, the game deletes/unloads the rival sprites. As a result, Run Info cannot access the rival sprites. + // The rivals are loaded here to have some way of accessing those sprites. + this.scene.loadAtlas("rival_f", "trainer"); + this.scene.loadAtlas("rival_m", "trainer"); + } + + override show(args: any[]): boolean { + super.show(args); + + this.getUi().bringToTop(this.runSelectContainer); + this.runSelectContainer.setVisible(true); + this.populateRuns(this.scene); + + this.setScrollCursor(0); + this.setCursor(0); + + //Destroys the cursor if there are no runs saved so far. + if (this.runs.length === 0) { + this.clearCursor(); + } + + return true; + } + + /** + * Performs a certain action based on the button pressed by the user + * @param button + * The user can navigate through the runs with Button.UP/Button.DOWN. + * Button.ACTION allows the user to access more information about their runs. + * Button.CANCEL allows the user to go back. + */ + override processInput(button: Button): boolean { + const ui = this.getUi(); + + let success = false; + const error = false; + + if ([Button.ACTION, Button.CANCEL].includes(button)) { + if (button === Button.ACTION) { + const cursor = this.cursor + this.scrollCursor; + if (this.runs[cursor]) { + this.scene.ui.setOverlayMode(Mode.RUN_INFO, this.runs[cursor].entryData, true); + } else { + return false; + } + success = true; + return success; + } else { + this.runSelectCallback = null; + success = true; + this.scene.ui.revertMode(); + } + } else if (this.runs.length > 0) { + switch (button) { + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else if (this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1); + } + break; + case Button.DOWN: + if (this.cursor < 2) { + success = this.setCursor(this.cursor + 1); + } else if (this.scrollCursor < this.runs.length - 3) { + success = this.setScrollCursor(this.scrollCursor + 1); + } + break; + } + } + + if (success) { + ui.playSelect(); + } else if (error) { + ui.playError(); + } + return success || error; + } + + /** + * This retrieves the player's run history and facilitates the processes necessary for the output display. + * @param scene: BattleScene + * Runs are displayed from newest --> oldest in descending order. + * In the for loop, each run is processed to create an RunEntryContainer used to display and store the run's unique information + */ + private async populateRuns(scene: BattleScene) { + const response = await this.scene.gameData.getRunHistoryData(this.scene); + const timestamps = Object.keys(response); + if (timestamps.length === 0) { + this.showEmpty(); + return; + } + const timestampsNo = timestamps.map(Number); + if (timestamps.length > 1) { + timestampsNo.sort((a, b) => b - a); + } + const entryCount = timestamps.length; + for (let s = 0; s < entryCount; s++) { + const entry = new RunEntryContainer(this.scene, response[timestampsNo[s]], s); + this.scene.add.existing(entry); + this.runsContainer.add(entry); + this.runs.push(entry); + } + if (this.cursorObj && timestamps.length > 0) { + this.runsContainer.bringToTop(this.cursorObj); + } + } + + /** + * If the player has no runs saved so far, this creates a giant window labeled empty instead. + */ + private async showEmpty() { + const emptyWindow = addWindow(this.scene, 0, 0, 304, 165); + this.runsContainer.add(emptyWindow); + const emptyWindowCoordinates = emptyWindow.getCenter(); + const emptyText = addTextObject(this.scene, 0, 0, i18next.t("saveSlotSelectUiHandler:empty"), TextStyle.WINDOW, {fontSize: "128px"}); + emptyText.setPosition(emptyWindowCoordinates.x-18, emptyWindowCoordinates.y-15); + this.runsContainer.add(emptyText); + } + + override setCursor(cursor: number): boolean { + const changed = super.setCursor(cursor); + + if (!this.cursorObj) { + this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight_thick", undefined, 296, 46, 6, 6, 6, 6); + this.cursorObj.setOrigin(0, 0); + this.runsContainer.add(this.cursorObj); + } + this.cursorObj.setPosition(4, 4 + (cursor + this.scrollCursor) * 56); + return changed; + } + + private setScrollCursor(scrollCursor: number): boolean { + const changed = scrollCursor !== this.scrollCursor; + + if (changed) { + this.scrollCursor = scrollCursor; + this.setCursor(this.cursor); + this.scene.tweens.add({ + targets: this.runsContainer, + y: this.runContainerInitialY - 56 * scrollCursor, + duration: Utils.fixedInt(325), + ease: "Sine.easeInOut" + }); + } + return changed; + } + + /** + * Called when the player returns back to the menu + * Uses the functions clearCursor() and clearRuns() + */ + override clear() { + super.clear(); + this.runSelectContainer.setVisible(false); + this.clearCursor(); + this.runSelectCallback = null; + this.clearRuns(); + } + + private clearCursor() { + if (this.cursorObj) { + this.cursorObj.destroy(); + } + this.cursorObj = null; + } + + private clearRuns() { + this.runs.splice(0, this.runs.length); + this.runsContainer.removeAll(true); + } +} + +/** + * RunEntryContainer : stores/displays an individual run + * slotId: necessary for positioning + * entryData: the data of an individual run + */ +class RunEntryContainer extends Phaser.GameObjects.Container { + private slotId: number; + public entryData: RunEntry; + + constructor(scene: BattleScene, entryData: RunEntry, slotId: number) { + super(scene, 0, slotId*56); + + this.slotId = slotId; + this.entryData = entryData; + + this.setup(this.entryData); + + } + + /** + * This processes the individual run's data for display. + * + * Each RunEntryContainer displayed should have the following information: + * Run Result: Victory || Defeat + * Game Mode + Final Wave + * Time Stamp + * + * The player's party and their levels at the time of the last wave of the run are also displayed. + */ + private setup(run: RunEntry) { + + const victory = run.isVictory; + const data = this.scene.gameData.parseSessionData(JSON.stringify(run.entry)); + + const slotWindow = addWindow(this.scene, 0, 0, 304, 52); + this.add(slotWindow); + + // Run Result: Victory + if (victory) { + const gameOutcomeLabel = addTextObject(this.scene, 8, 5, `${i18next.t("runHistory:victory")}`, TextStyle.WINDOW); + this.add(gameOutcomeLabel); + } else { // Run Result: Defeats + const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const genderStr = PlayerGender[genderIndex].toLowerCase(); + // Defeats from wild Pokemon battles will show the Pokemon responsible by the text of the run result. + if (data.battleType === BattleType.WILD) { + const enemyContainer = this.scene.add.container(8, 5); + const gameOutcomeLabel = addTextObject(this.scene, 0, 0, `${i18next.t("runHistory:defeatedWild", { context: genderStr })}`, TextStyle.WINDOW); + enemyContainer.add(gameOutcomeLabel); + data.enemyParty.forEach((enemyData, e) => { + const enemyIconContainer = this.scene.add.container(65+(e*25), -8); + enemyIconContainer.setScale(0.75); + enemyData.boss = false; + enemyData["player"] = true; + const enemy = enemyData.toPokemon(this.scene); + const enemyIcon = this.scene.addPokemonIcon(enemy, 0, 0, 0, 0); + const enemyLevel = addTextObject(this.scene, 32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); + enemyLevel.setShadow(0, 0, undefined); + enemyLevel.setStroke("#424242", 14); + enemyLevel.setOrigin(1, 0); + enemyIconContainer.add(enemyIcon); + enemyIconContainer.add(enemyLevel); + enemyContainer.add(enemyIconContainer); + enemy.destroy(); + }); + this.add(enemyContainer); + } else if (data.battleType === BattleType.TRAINER) { // Defeats from Trainers show the trainer's title and name + const tObj = data.trainer.toTrainer(this.scene); + // Because of the interesting mechanics behind rival names, the rival name and title have to be retrieved differently + const RIVAL_TRAINER_ID_THRESHOLD = 375; + if (data.trainer.trainerType >= RIVAL_TRAINER_ID_THRESHOLD) { + const rivalName = (tObj.variant === TrainerVariant.FEMALE) ? "trainerNames:rival_female" : "trainerNames:rival"; + const gameOutcomeLabel = addTextObject(this.scene, 8, 5, `${i18next.t("runHistory:defeatedRival", { context: genderStr })} ${i18next.t(rivalName)}`, TextStyle.WINDOW); + this.add(gameOutcomeLabel); + } else { + const gameOutcomeLabel = addTextObject(this.scene, 8, 5, `${i18next.t("runHistory:defeatedTrainer", { context: genderStr })}${tObj.getName(0, true)}`, TextStyle.WINDOW); + this.add(gameOutcomeLabel); + } + } + } + + // Game Mode + Waves + // Because Endless (Spliced) tends to have the longest name across languages, the line tends to spill into the party icons. + // To fix this, the Spliced icon is used to indicate an Endless Spliced run + const gameModeLabel = addTextObject(this.scene, 8, 19, "", TextStyle.WINDOW); + let mode = ""; + switch (data.gameMode) { + case GameModes.DAILY: + mode = i18next.t("gameMode:dailyRun"); + break; + case GameModes.SPLICED_ENDLESS: + case GameModes.ENDLESS: + mode = i18next.t("gameMode:endless"); + break; + case GameModes.CLASSIC: + mode = i18next.t("gameMode:classic"); + break; + case GameModes.CHALLENGE: + mode = i18next.t("gameMode:challenge"); + break; + } + gameModeLabel.appendText(mode, false); + if (data.gameMode === GameModes.SPLICED_ENDLESS) { + const splicedIcon = this.scene.add.image(0, 0, "icon_spliced"); + splicedIcon.setScale(0.75); + const coords = gameModeLabel.getTopRight(); + splicedIcon.setPosition(coords.x+5, 27); + this.add(splicedIcon); + // 4 spaces of room for the Spliced icon + gameModeLabel.appendText(" - ", false); + } else { + gameModeLabel.appendText(" - ", false); + } + gameModeLabel.appendText(i18next.t("saveSlotSelectUiHandler:wave")+" "+data.waveIndex, false); + this.add(gameModeLabel); + + const timestampLabel = addTextObject(this.scene, 8, 33, new Date(data.timestamp).toLocaleString(), TextStyle.WINDOW); + this.add(timestampLabel); + + // pokemonIconsContainer holds the run's party Pokemon icons and levels + // Icons should be level with each other here, but there are significant number of icons that have a center axis / position far from the norm. + // The code here does not account for icon weirdness. + const pokemonIconsContainer = this.scene.add.container(140, 17); + + data.party.forEach((p: PokemonData, i: integer) => { + const iconContainer = this.scene.add.container(26 * i, 0); + iconContainer.setScale(0.75); + const pokemon = p.toPokemon(this.scene); + const icon = this.scene.addPokemonIcon(pokemon, 0, 0, 0, 0); + + const text = addTextObject(this.scene, 32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); + text.setShadow(0, 0, undefined); + text.setStroke("#424242", 14); + text.setOrigin(1, 0); + + iconContainer.add(icon); + iconContainer.add(text); + + pokemonIconsContainer.add(iconContainer); + + pokemon.destroy(); + }); + + this.add(pokemonIconsContainer); + } +} + +interface RunEntryContainer { + scene: BattleScene; +} + diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts new file mode 100644 index 00000000000..d6bafb8599e --- /dev/null +++ b/src/ui/run-info-ui-handler.ts @@ -0,0 +1,886 @@ +import BattleScene from "../battle-scene"; +import { GameModes } from "../game-mode"; +import UiHandler from "./ui-handler"; +import { SessionSaveData } from "../system/game-data"; +import { TextStyle, addTextObject, addBBCodeTextObject, getTextColor } from "./text"; +import { Mode } from "./ui"; +import { addWindow } from "./ui-theme"; +import * as Utils from "../utils"; +import PokemonData from "../system/pokemon-data"; +import i18next from "i18next"; +import {Button} from "../enums/buttons"; +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"; +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 * as Modifier from "../modifier/modifier"; +import { Species } from "#enums/species"; +import { PlayerGender } from "#enums/player-gender"; + +/** + * RunInfoUiMode indicates possible overlays of RunInfoUiHandler. + * MAIN <-- default overlay that can return back to RunHistoryUiHandler + should eventually have its own enum once more pages are added to RunInfoUiHandler + * HALL_OF_FAME, ENDING_ART, etc. <-- overlays that should return back to MAIN + */ +enum RunInfoUiMode { + MAIN, + HALL_OF_FAME, + ENDING_ART +} + +/** + * Some variables are protected because this UI class will most likely be extended in the future to display more information. + * These variables will most likely be shared across 'classes' aka pages. + * I believe that it is possible that the contents/methods of the first page will be placed in their own class that is an extension of RunInfoUiHandler as more pages are added. + * For now, I leave as is. + */ +export default class RunInfoUiHandler extends UiHandler { + protected runInfo: SessionSaveData; + protected isVictory: boolean; + protected pageMode: RunInfoUiMode; + protected runContainer: Phaser.GameObjects.Container; + + private runResultContainer: Phaser.GameObjects.Container; + private runInfoContainer: Phaser.GameObjects.Container; + private partyContainer: Phaser.GameObjects.Container; + private partyHeldItemsContainer: Phaser.GameObjects.Container; + private statsBgWidth: integer; + private partyContainerHeight: integer; + private partyContainerWidth: integer; + + private hallofFameContainer: Phaser.GameObjects.Container; + private endCardContainer: Phaser.GameObjects.Container; + + private partyInfo: Phaser.GameObjects.Container[]; + private partyVisibility: Boolean; + private modifiersModule: any; + + constructor(scene: BattleScene) { + super(scene, Mode.RUN_INFO); + } + + override async setup() { + this.runContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + // The import of the modifiersModule is loaded here to sidestep async/await issues. + this.modifiersModule = Modifier; + this.runContainer.setVisible(false); + } + + /** + * This takes a run's RunEntry and uses the information provided to display essential information about the player's run. + * @param args[0] : a RunEntry object + * + * show() creates these UI objects in order - + * A solid-color background used to hide RunHistoryUiHandler + * Header: Page Title + Option to Display Modifiers + * Run Result Container: + * Party Container: + * this.isVictory === true --> Hall of Fame Container: + */ + override show(args: any[]): boolean { + super.show(args); + + const gameStatsBg = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width, this.scene.game.canvas.height, 0x006860); + gameStatsBg.setOrigin(0, 0); + this.runContainer.add(gameStatsBg); + + const run = args[0]; + // Assigning information necessary for the UI's creation + this.runInfo = this.scene.gameData.parseSessionData(JSON.stringify(run.entry)); + this.isVictory = run.isVictory; + this.pageMode = RunInfoUiMode.MAIN; + + // Creates Header and adds to this.runContainer + this.addHeader(); + + this.statsBgWidth = ((this.scene.game.canvas.width / 6) - 2) / 3; + + // Creates Run Result Container + this.runResultContainer = this.scene.add.container(0, 24); + const runResultWindow = addWindow(this.scene, 0, 0, this.statsBgWidth-11, 65); + runResultWindow.setOrigin(0, 0); + this.runResultContainer.add(runResultWindow); + this.parseRunResult(); + + // Creates Run Info Container + this.runInfoContainer = this.scene.add.container(0, 89); + const runInfoWindow = addWindow(this.scene, 0, 0, this.statsBgWidth-11, 90); + const runInfoWindowCoords = runInfoWindow.getBottomRight(); + this.runInfoContainer.add(runInfoWindow); + this.parseRunInfo(runInfoWindowCoords.x, runInfoWindowCoords.y); + + // Creates Player Party Container + this.partyContainer = this.scene.add.container(this.statsBgWidth-10, 23); + this.parsePartyInfo(); + this.showParty(true); + + this.runContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.getUi().bringToTop(this.runContainer); + this.runContainer.setVisible(true); + + // Creates Hall of Fame if the run entry contains a victory + if (this.isVictory) { + this.createHallofFame(); + this.getUi().bringToTop(this.hallofFameContainer); + } + + this.setCursor(0); + + this.getUi().add(this.runContainer); + + this.getUi().hideTooltip(); + + return true; + } + + /** + * Creates and adds the header background, title text, and important buttons to RunInfoUiHandler + * It does check if the run has modifiers before adding a button for the user to display their party's held items + * It does not check if the run has any PokemonHeldItemModifiers though. + */ + private addHeader() { + const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); + headerBg.setOrigin(0, 0); + this.runContainer.add(headerBg); + if (this.runInfo.modifiers.length !== 0) { + const headerBgCoords = headerBg.getTopRight(); + const abilityButtonContainer = this.scene.add.container(0, 0); + const abilityButtonText = addTextObject(this.scene, 8, 0, i18next.t("runHistory:viewHeldItems"), TextStyle.WINDOW, {fontSize:"34px"}); + const abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, "keyboard", "E.png"); + abilityButtonContainer.add([abilityButtonText, abilityButtonElement]); + abilityButtonContainer.setPosition(headerBgCoords.x - abilityButtonText.displayWidth - abilityButtonElement.displayWidth - 8, 10); + this.runContainer.add(abilityButtonContainer); + } + const headerText = addTextObject(this.scene, 0, 0, i18next.t("runHistory:runInfo"), TextStyle.SETTINGS_LABEL); + headerText.setOrigin(0, 0); + headerText.setPositionRelative(headerBg, 8, 4); + this.runContainer.add(headerText); + } + + /** + * Shows the run's end result + * + * Victory : The run will display options to allow the player to view the Hall of Fame + Ending Art + * Defeat : The run will show the opposing Pokemon (+ Trainer) that the trainer was defeated by. + * Defeat can call either parseWildSingleDefeat(), parseWildDoubleDefeat(), or parseTrainerDefeat() + * + */ + private async parseRunResult() { + const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const genderStr = PlayerGender[genderIndex]; + const runResultTextStyle = this.isVictory ? TextStyle.SUMMARY : TextStyle.SUMMARY_RED; + const runResultTitle = this.isVictory ? i18next.t("runHistory:victory") : i18next.t("runHistory:defeated", { context: genderStr }); + const runResultText = addBBCodeTextObject(this.scene, 6, 5, `${runResultTitle} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, runResultTextStyle, {fontSize : "65px", lineSpacing: 0.1}); + + if (this.isVictory) { + const hallofFameInstructionContainer = this.scene.add.container(0, 0); + const shinyButtonText = addTextObject(this.scene, 8, 0, i18next.t("runHistory:viewHallOfFame"), TextStyle.WINDOW, {fontSize:"65px"}); + const shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, "keyboard", "R.png"); + hallofFameInstructionContainer.add([shinyButtonText, shinyButtonElement]); + + const formButtonText = addTextObject(this.scene, 8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, {fontSize:"65px"}); + const formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, "keyboard", "F.png"); + hallofFameInstructionContainer.add([formButtonText, formButtonElement]); + + hallofFameInstructionContainer.setPosition(12, 25); + this.runResultContainer.add(hallofFameInstructionContainer); + } + + this.runResultContainer.add(runResultText); + + if (!this.isVictory) { + const enemyContainer = this.scene.add.container(0, 0); + // Wild - Single and Doubles + if (this.runInfo.battleType === BattleType.WILD) { + switch (this.runInfo.enemyParty.length) { + case 1: + // Wild - Singles + this.parseWildSingleDefeat(enemyContainer); + break; + case 2: + //Wild - Doubles + this.parseWildDoubleDefeat(enemyContainer); + break; + } + } else if (this.runInfo.battleType === BattleType.TRAINER) { + this.parseTrainerDefeat(enemyContainer); + } + this.runResultContainer.add(enemyContainer); + } + this.runContainer.add(this.runResultContainer); + } + + /** + * This function is called to edit an enemyContainer to represent a loss from a defeat by a wild single Pokemon battle. + * @param enemyContainer - container holding enemy visual and level information + */ + private parseWildSingleDefeat(enemyContainer: Phaser.GameObjects.Container) { + const enemyIconContainer = this.scene.add.container(0, 0); + const enemyData = this.runInfo.enemyParty[0]; + const bossStatus = enemyData.boss; + enemyData.boss = false; + enemyData["player"] = true; + //addPokemonIcon() throws an error if the Pokemon used is a boss + const enemy = enemyData.toPokemon(this.scene); + const enemyIcon = this.scene.addPokemonIcon(enemy, 0, 0, 0, 0); + const enemyLevelStyle = bossStatus ? TextStyle.PARTY_RED : TextStyle.PARTY; + const enemyLevel = addTextObject(this.scene, 36, 26, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, enemyLevelStyle, { fontSize: "44px", color: "#f8f8f8" }); + enemyLevel.setShadow(0, 0, undefined); + enemyLevel.setStroke("#424242", 14); + enemyLevel.setOrigin(1, 0); + enemyIconContainer.add(enemyIcon); + enemyIconContainer.add(enemyLevel); + enemyContainer.add(enemyIconContainer); + enemyContainer.setPosition(27, 12); + enemy.destroy(); + } + + /** + * This function is called to edit a container to represent a loss from a defeat by a wild double Pokemon battle. + * This function and parseWildSingleDefeat can technically be merged, but I find it tricky to manipulate the different 'centers' a single battle / double battle container will hold. + * @param enemyContainer - container holding enemy visuals and level information + */ + private parseWildDoubleDefeat(enemyContainer: Phaser.GameObjects.Container) { + this.runInfo.enemyParty.forEach((enemyData, e) => { + const enemyIconContainer = this.scene.add.container(0, 0); + const bossStatus = enemyData.boss; + enemyData.boss = false; + enemyData["player"] = true; + const enemy = enemyData.toPokemon(this.scene); + const enemyIcon = this.scene.addPokemonIcon(enemy, 0, 0, 0, 0); + const enemyLevel = addTextObject(this.scene, 36, 26, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, bossStatus ? TextStyle.PARTY_RED : TextStyle.PARTY, { fontSize: "44px", color: "#f8f8f8" }); + enemyLevel.setShadow(0, 0, undefined); + enemyLevel.setStroke("#424242", 14); + enemyLevel.setOrigin(1, 0); + enemyIconContainer.add(enemyIcon); + enemyIconContainer.add(enemyLevel); + enemyIconContainer.setPosition(e*35, 0); + enemyContainer.add(enemyIconContainer); + enemy.destroy(); + }); + enemyContainer.setPosition(8, 14); + } + + /** + * This edits a container to represent a loss from a defeat by a trainer battle. + * @param enemyContainer - container holding enemy visuals and level information + * The trainers are placed to the left of their party. + * Depending on the trainer icon, there may be overlap between the edges of the box or their party. (Capes...) + * + * Party Pokemon have their icons, terastalization status, and level shown. + */ + private parseTrainerDefeat(enemyContainer: Phaser.GameObjects.Container) { + // Creating the trainer sprite and adding it to enemyContainer + const tObj = this.runInfo.trainer.toTrainer(this.scene); + const tObjSpriteKey = tObj.config.getSpriteKey(this.runInfo.trainer.variant === TrainerVariant.FEMALE, false); + const tObjSprite = this.scene.add.sprite(0, 5, tObjSpriteKey); + if (this.runInfo.trainer.variant === TrainerVariant.DOUBLE) { + const doubleContainer = this.scene.add.container(5, 8); + tObjSprite.setPosition(-3, -3); + const tObjPartnerSpriteKey = tObj.config.getSpriteKey(true, true); + const tObjPartnerSprite = this.scene.add.sprite(5, -3, tObjPartnerSpriteKey); + // Double Trainers have smaller sprites than Single Trainers + tObjPartnerSprite.setScale(0.20); + tObjSprite.setScale(0.20); + doubleContainer.add(tObjSprite); + doubleContainer.add(tObjPartnerSprite); + doubleContainer.setPosition(12, 38); + enemyContainer.add(doubleContainer); + } else { + tObjSprite.setScale(0.35, 0.35); + tObjSprite.setPosition(12, 28); + enemyContainer.add(tObjSprite); + } + + // Determining which Terastallize Modifier belongs to which Pokemon + // Creates a dictionary {PokemonId: TeraShardType} + const teraPokemon = {}; + this.runInfo.enemyModifiers.forEach((m) => { + const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); + if (modifier instanceof Modifier.TerastallizeModifier) { + const teraDetails = modifier?.getArgs(); + const pkmnId = teraDetails[0]; + teraPokemon[pkmnId] = teraDetails[1]; + } + }); + + // Creates the Pokemon icons + level information and adds it to enemyContainer + // 2 Rows x 3 Columns + const enemyPartyContainer = this.scene.add.container(0, 0); + this.runInfo.enemyParty.forEach((enemyData, e) => { + const pokemonRowHeight = Math.floor(e/3); + const enemyIconContainer = this.scene.add.container(0, 0); + enemyIconContainer.setScale(0.6); + const isBoss = enemyData.boss; + enemyData.boss = false; + enemyData["player"] = true; + const enemy = enemyData.toPokemon(this.scene); + const enemyIcon = this.scene.addPokemonIcon(enemy, 0, 0, 0, 0); + // Applying Terastallizing Type tint to Pokemon icon + // If the Pokemon is a fusion, it has two sprites and so, the tint has to be applied to each icon separately + const enemySprite1 = enemyIcon.list[0] as Phaser.GameObjects.Sprite; + const enemySprite2 = (enemyIcon.list.length > 1) ? enemyIcon.list[1] as Phaser.GameObjects.Sprite : undefined; + if (teraPokemon[enemyData.id]) { + const teraTint = getTypeRgb(teraPokemon[enemyData.id]); + const teraColor = new Phaser.Display.Color(teraTint[0], teraTint[1], teraTint[2]); + enemySprite1.setTint(teraColor.color); + if (enemySprite2) { + enemySprite2.setTint(teraColor.color); + } + } + enemyIcon.setPosition(39*(e%3)+5, (35*pokemonRowHeight)); + const enemyLevel = addTextObject(this.scene, 43*(e%3), (27*(pokemonRowHeight+1)), `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, isBoss ? TextStyle.PARTY_RED : TextStyle.PARTY, { fontSize: "54px" }); + enemyLevel.setShadow(0, 0, undefined); + enemyLevel.setStroke("#424242", 14); + enemyLevel.setOrigin(0, 0); + + enemyIconContainer.add(enemyIcon); + enemyIconContainer.add(enemyLevel); + enemyPartyContainer.add(enemyIconContainer); + enemy.destroy(); + }); + enemyPartyContainer.setPosition(25, 15); + enemyContainer.add(enemyPartyContainer); + } + + /** + * Shows information about the run like the run's mode, duration, luck, money, and player held items + * The values for luck and money are from the end of the run, not the player's luck at the start of the run. + * @param windowX + * @param windowY These two params are the coordinates of the window's bottom right corner. This is used to dynamically position Luck based on its length, creating a nice layout regardless of language / luck value. + */ + private async parseRunInfo(windowX: number, windowY: number) { + // Parsing and displaying the mode. + // In the future, parsing Challenges + Challenge Rules may have to be reworked as PokeRogue adds additional challenges and users can stack these challenges in various ways. + const modeText = addBBCodeTextObject(this.scene, 7, 0, "", TextStyle.WINDOW, {fontSize : "50px", lineSpacing:3}); + modeText.setPosition(7, 5); + modeText.appendText(i18next.t("runHistory:mode")+": ", false); + switch (this.runInfo.gameMode) { + case GameModes.DAILY: + modeText.appendText(`${i18next.t("gameMode:dailyRun")}`, false); + break; + case GameModes.SPLICED_ENDLESS: + modeText.appendText(`${i18next.t("gameMode:endlessSpliced")}`, false); + if (this.runInfo.waveIndex === this.scene.gameData.gameStats.highestEndlessWave) { + modeText.appendText(` [${i18next.t("runHistory:personalBest")}]`, false); + modeText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); + } + break; + case GameModes.CHALLENGE: + modeText.appendText(`${i18next.t("gameMode:challenge")}`, false); + modeText.appendText(`${i18next.t("runHistory:challengeRules")}: `); + modeText.setWrapMode(1); // wrap by word + modeText.setWrapWidth(500); + const rules: string[] = this.challengeParser(); + if (rules) { + for (let i = 0; i < rules.length; i++) { + if (i > 0) { + modeText.appendText(" + ", false); + } + modeText.appendText(rules[i], false); + } + } + break; + case GameModes.ENDLESS: + modeText.appendText(`${i18next.t("gameMode:endless")}`, false); + // If the player achieves a personal best in Endless, the mode text will be tinted similarly to SSS luck to celebrate their achievement. + if (this.runInfo.waveIndex === this.scene.gameData.gameStats.highestEndlessWave) { + modeText.appendText(` [${i18next.t("runHistory:personalBest")}]`, false); + modeText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); + } + break; + case GameModes.CLASSIC: + modeText.appendText(`${i18next.t("gameMode:classic")}`, false); + break; + } + + // Duration + Money + const runInfoTextContainer = this.scene.add.container(0, 0); + // Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12. + const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3; + const runInfoText = addBBCodeTextObject(this.scene, 7, 0, "", TextStyle.WINDOW, {fontSize: "50px", lineSpacing: lineSpacing}); + const runTime = Utils.getPlayTimeString(this.runInfo.playTime); + runInfoText.appendText(`${i18next.t("runHistory:runLength")}: ${runTime}`, false); + const runMoney = Utils.formatMoney(this.scene.moneyFormat, this.runInfo.money); + runInfoText.appendText(`[color=${getTextColor(TextStyle.MONEY)}]${i18next.t("battleScene:moneyOwned", {formattedMoney : runMoney})}[/color]`); + runInfoText.setPosition(7, 70); + runInfoTextContainer.add(runInfoText); + // Luck + // Uses the parameters windowX and windowY to dynamically position the luck value neatly into the bottom right corner + const luckText = addBBCodeTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, {fontSize: "55px"}); + const luckValue = Phaser.Math.Clamp(this.runInfo.party.map(p => p.toPokemon(this.scene).getLuck()).reduce((total: integer, value: integer) => total += value, 0), 0, 14); + let luckInfo = i18next.t("runHistory:luck")+": "+getLuckString(luckValue); + if (luckValue < 14) { + luckInfo = "[color=#"+(getLuckTextTint(luckValue)).toString(16)+"]"+luckInfo+"[/color]"; + } else { + luckText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); + } + luckText.appendText("[align=right]"+luckInfo+"[/align]", false); + luckText.setPosition(windowX-luckText.displayWidth-5, windowY-13); + runInfoTextContainer.add(luckText); + + // Player Held Items + // A max of 20 items can be displayed. A + sign will be added if the run's held items pushes past this maximum to show the user that there are more. + if (this.runInfo.modifiers.length) { + let visibleModifierIndex = 0; + + const modifierIconsContainer = this.scene.add.container(8, (this.runInfo.gameMode === GameModes.CHALLENGE) ? 20 : 15); + modifierIconsContainer.setScale(0.45); + for (const m of this.runInfo.modifiers) { + const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); + if (modifier instanceof Modifier.PokemonHeldItemModifier) { + continue; + } + const icon = modifier?.getIcon(this.scene, false); + if (icon) { + const rowHeightModifier = Math.floor(visibleModifierIndex/7); + icon.setPosition(24 * (visibleModifierIndex%7), 20 + (35 * rowHeightModifier)); + modifierIconsContainer.add(icon); + } + + if (++visibleModifierIndex === 20) { + const maxItems = addTextObject(this.scene, 45, 90, "+", TextStyle.WINDOW); + maxItems.setPositionRelative(modifierIconsContainer, 70, 45); + this.runInfoContainer.add(maxItems); + break; + } + } + this.runInfoContainer.add(modifierIconsContainer); + } + + this.runInfoContainer.add(modeText); + this.runInfoContainer.add(runInfoTextContainer); + 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. + * B-Side Information: Icon + Held Items (Can be displayed to the user through pressing the abilityButton) + */ + private parsePartyInfo(): void { + const party = this.runInfo.party; + const currentLanguage = i18next.resolvedLanguage ?? "en"; + const windowHeight = ((this.scene.game.canvas.height / 6) - 23)/6; + + party.forEach((p: PokemonData, i: integer) => { + const pokemonInfoWindow = new RoundRectangle(this.scene, 0, 14, (this.statsBgWidth*2)+10, windowHeight-2, 3); + + const pokemon = p.toPokemon(this.scene); + const pokemonInfoContainer = this.scene.add.container(this.statsBgWidth+5, (windowHeight-0.5)*i); + + const types = pokemon.getTypes(); + const type1 = getTypeRgb(types[0]); + const type1Color = new Phaser.Display.Color(type1[0], type1[1], type1[2]); + + const bgColor = type1Color.clone().darken(45); + pokemonInfoWindow.setFillStyle(bgColor.color); + + const iconContainer = this.scene.add.container(0, 0); + const icon = this.scene.addPokemonIcon(pokemon, 0, 0, 0, 0); + icon.setScale(0.75); + icon.setPosition(-99, 1); + const type2 = types[1] ? getTypeRgb(types[1]) : undefined; + const type2Color = type2 ? new Phaser.Display.Color(type2[0], type2[1], type2[2]) : undefined; + type2Color ? pokemonInfoWindow.setStrokeStyle(1, type2Color.color, 0.95) : pokemonInfoWindow.setStrokeStyle(1, type1Color.color, 0.95); + + this.getUi().bringToTop(icon); + + // Contains Name, Level + Nature, Ability, Passive + const pokeInfoTextContainer = this.scene.add.container(-85, 3.5); + const textContainerFontSize = "34px"; + const pNature = getNatureName(pokemon.nature); + const pName = pokemon.getNameToRender(); + //With the exception of Korean/Traditional Chinese/Simplified Chinese, the code shortens the terms for ability and passive to their first letter. + //These languages are exempted because they are already short enough. + const exemptedLanguages = ["ko", "zh_CN", "zh_TW"]; + let passiveLabel = i18next.t("starterSelectUiHandler:passive") ?? "-"; + let abilityLabel = i18next.t("starterSelectUiHandler:ability") ?? "-"; + if (!exemptedLanguages.includes(currentLanguage)) { + passiveLabel = passiveLabel.charAt(0); + abilityLabel = abilityLabel.charAt(0); + } + const pPassiveInfo = pokemon.passive ? passiveLabel+": "+pokemon.getPassiveAbility().name : ""; + const pAbilityInfo = abilityLabel + ": " + pokemon.getAbility().name; + // Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12. + const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3; + const pokeInfoText = addBBCodeTextObject(this.scene, 0, 0, pName, TextStyle.SUMMARY, {fontSize: textContainerFontSize, lineSpacing: lineSpacing}); + pokeInfoText.appendText(`${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNature}`); + pokeInfoText.appendText(pAbilityInfo); + pokeInfoText.appendText(pPassiveInfo); + pokeInfoTextContainer.add(pokeInfoText); + + // Pokemon Stats + // Colored Arrows (Red/Blue) are placed by stats that are boosted from natures + const pokeStatTextContainer = this.scene.add.container(-35, 6); + const pStats : string[]= []; + pokemon.stats.forEach((element) => pStats.push(Utils.formatFancyLargeNumber(element, 1))); + for (let i = 0; i < pStats.length; i++) { + const isMult = getNatureStatMultiplier(pokemon.nature, i); + pStats[i] = (isMult < 1) ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i]; + pStats[i] = (isMult > 1) ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i]; + } + const hp = i18next.t("pokemonInfo:Stat.HPshortened")+": "+pStats[0]; + const atk = i18next.t("pokemonInfo:Stat.ATKshortened")+": "+pStats[1]; + const def = i18next.t("pokemonInfo:Stat.DEFshortened")+": "+pStats[2]; + const spatk = i18next.t("pokemonInfo:Stat.SPATKshortened")+": "+pStats[3]; + const spdef = i18next.t("pokemonInfo:Stat.SPDEFshortened")+": "+pStats[4]; + const speedLabel = (currentLanguage==="es"||currentLanguage==="pt_BR") ? i18next.t("runHistory:SPDshortened") : i18next.t("pokemonInfo:Stat.SPDshortened"); + const speed = speedLabel+": "+pStats[5]; + // Column 1: HP Atk Def + const pokeStatText1 = addBBCodeTextObject(this.scene, -5, 0, hp, TextStyle.SUMMARY, {fontSize: textContainerFontSize, lineSpacing: lineSpacing}); + pokeStatText1.appendText(atk); + pokeStatText1.appendText(def); + pokeStatTextContainer.add(pokeStatText1); + // Column 2: SpAtk SpDef Speed + const pokeStatText2 = addBBCodeTextObject(this.scene, 25, 0, spatk, TextStyle.SUMMARY, {fontSize: textContainerFontSize, lineSpacing: lineSpacing}); + pokeStatText2.appendText(spdef); + pokeStatText2.appendText(speed); + pokeStatTextContainer.add(pokeStatText2); + + // Shiny + Fusion Status + const marksContainer = this.scene.add.container(0, 0); + if (pokemon.fusionSpecies) { + const splicedIcon = this.scene.add.image(0, 0, "icon_spliced"); + splicedIcon.setScale(0.35); + splicedIcon.setOrigin(0, 0); + pokemon.isShiny() ? splicedIcon.setPositionRelative(pokeInfoTextContainer, 35, 0) : splicedIcon.setPositionRelative(pokeInfoTextContainer, 28, 0); + marksContainer.add(splicedIcon); + this.getUi().bringToTop(splicedIcon); + } + if (pokemon.isShiny()) { + const doubleShiny = pokemon.isFusion() && pokemon.shiny && pokemon.fusionShiny; + const shinyStar = this.scene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); + shinyStar.setOrigin(0, 0); + shinyStar.setScale(0.65); + shinyStar.setPositionRelative(pokeInfoTextContainer, 28, 0); + shinyStar.setTint(getVariantTint(!doubleShiny ? pokemon.getVariant() : pokemon.variant)); + marksContainer.add(shinyStar); + this.getUi().bringToTop(shinyStar); + if (doubleShiny) { + const fusionShinyStar = this.scene.add.image(0, 0, "shiny_star_small_2"); + fusionShinyStar.setOrigin(0, 0); + fusionShinyStar.setScale(0.5); + fusionShinyStar.setPosition(shinyStar.x+1, shinyStar.y+1); + fusionShinyStar.setTint(getVariantTint(pokemon.fusionVariant)); + marksContainer.add(fusionShinyStar); + this.getUi().bringToTop(fusionShinyStar); + } + } + + // Pokemon Moveset + // Need to check if dynamically typed moves + const pokemonMoveset = pokemon.getMoveset(); + const movesetContainer = this.scene.add.container(70, -29); + const pokemonMoveBgs : Phaser.GameObjects.NineSlice[] = []; + const pokemonMoveLabels : Phaser.GameObjects.Text[] = []; + const movePos = [[-6.5, 35.5], [37, 35.5], [-6.5, 43.5], [37, 43.5]]; + for (let m = 0; m < pokemonMoveset?.length; m++) { + const moveContainer = this.scene.add.container(movePos[m][0], movePos[m][1]); + moveContainer.setScale(0.5); + const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 85, 15, 2, 2, 2, 2); + moveBg.setOrigin(1, 0); + const moveLabel = addTextObject(this.scene, -moveBg.width / 2, 2, "-", TextStyle.PARTY); + moveLabel.setOrigin(0.5, 0); + moveLabel.setName("text-move-label"); + pokemonMoveBgs.push(moveBg); + pokemonMoveLabels.push(moveLabel); + moveContainer.add(moveBg); + moveContainer.add(moveLabel); + movesetContainer.add(moveContainer); + const move = pokemonMoveset[m]?.getMove(); + pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); + pokemonMoveLabels[m].setText(move ? move.name : "-"); + } + + // 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, 2); + const heldItemsList : Modifier.PokemonHeldItemModifier[] = []; + if (this.runInfo.modifiers.length) { + for (const m of this.runInfo.modifiers) { + const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); + if (modifier instanceof Modifier.PokemonHeldItemModifier && modifier.pokemonId === pokemon.id) { + modifier.stackCount = m["stackCount"]; + heldItemsList.push(modifier); + } + } + if (heldItemsList.length > 0) { + (heldItemsList as Modifier.PokemonHeldItemModifier[]).sort(Modifier.modifierSortFunc); + let row = 0; + for (const [index, item] of heldItemsList.entries()) { + if ( index > 36 ) { + const overflowIcon = addTextObject(this.scene, 182, 4, "+", TextStyle.WINDOW); + heldItemsContainer.add(overflowIcon); + 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); + if (index !== 0 && index % 18 === 0) { + row++; + } + } + } + } + heldItemsContainer.setName("heldItems"); + heldItemsContainer.setVisible(false); + + // Labels are applied for future differentiation in showParty() + pokemonInfoContainer.add(pokemonInfoWindow); + iconContainer.add(icon); + pokemonInfoContainer.add(iconContainer); + marksContainer.setName("PkmnMarks"); + pokemonInfoContainer.add(marksContainer); + movesetContainer.setName("PkmnMoves"); + pokemonInfoContainer.add(movesetContainer); + pokeInfoTextContainer.setName("PkmnInfoText"); + pokemonInfoContainer.add(pokeInfoTextContainer); + pokeStatTextContainer.setName("PkmnStatsText"); + pokemonInfoContainer.add(pokeStatTextContainer); + pokemonInfoContainer.add(heldItemsContainer); + pokemonInfoContainer.setName("PkmnInfo"); + this.partyContainer.add(pokemonInfoContainer); + pokemon.destroy(); + }); + this.runContainer.add(this.partyContainer); + } + + /** + * Changes what is displayed of the Pokemon's held items + * @param partyVisible {boolean} + * True -> Shows the Pokemon's default information and hides held items + * False -> Shows the Pokemon's held items and hides default information + */ + private showParty(partyVisible: boolean): void { + const allContainers = this.partyContainer.getAll("name", "PkmnInfo"); + allContainers.forEach((c: Phaser.GameObjects.Container) => { + c.getByName("PkmnMoves").setVisible(partyVisible); + c.getByName("PkmnInfoText").setVisible(partyVisible); + c.getByName("PkmnStatsText").setVisible(partyVisible); + c.getByName("PkmnMarks").setVisible(partyVisible); + c.getByName("heldItems").setVisible(!partyVisible); + this.partyVisibility = partyVisible; + }); + } + + /** + * Shows the ending art. + */ + private createVictorySplash(): void { + this.endCardContainer = this.scene.add.container(0, 0); + const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const isFemale = genderIndex === PlayerGender.FEMALE; + const endCard = this.scene.add.image(0, 0, `end_${isFemale ? "f" : "m"}`); + endCard.setOrigin(0); + endCard.setScale(0.5); + const text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }); + text.setOrigin(0.5); + this.endCardContainer.add(endCard); + this.endCardContainer.add(text); + } + + /** createHallofFame() - if the run is victorious, this creates a hall of fame image for the player to view + * Overlay created by Koda (Thank you!) + * This could be adapted into a public-facing method for victory screens. Perhaps. + */ + private createHallofFame(): void { + const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const isFemale = genderIndex === PlayerGender.FEMALE; + const genderStr = PlayerGender[genderIndex].toLowerCase(); + // Issue Note (08-05-2024): It seems as if fused pokemon do not appear with the averaged color b/c pokemonData's loadAsset requires there to be some active battle? + // As an alternative, the icons of the second/bottom fused Pokemon have been placed next to their fellow fused Pokemon in Hall of Fame + this.hallofFameContainer = this.scene.add.container(0, 0); + // Thank you Hayuna for the code + const endCard = this.scene.add.image(0, 0, `end_${isFemale ? "f" : "m"}`); + endCard.setOrigin(0); + endCard.setPosition(-1, -1); + endCard.setScale(0.5); + const endCardCoords = endCard.getBottomCenter(); + const overlayColor = isFemale ? "red" : "blue"; + const hallofFameBg = this.scene.add.image(0, 0, "hall_of_fame_"+overlayColor); + hallofFameBg.setPosition(159, 89); + hallofFameBg.setSize(this.scene.game.canvas.width, this.scene.game.canvas.height+10); + hallofFameBg.setAlpha(0.8); + this.hallofFameContainer.add(endCard); + this.hallofFameContainer.add(hallofFameBg); + + const hallofFameText = addTextObject(this.scene, 0, 0, i18next.t("runHistory:hallofFameText", { context: genderStr }), TextStyle.WINDOW); + hallofFameText.setPosition(endCardCoords.x-(hallofFameText.displayWidth/2), 164); + this.hallofFameContainer.add(hallofFameText); + this.runInfo.party.forEach((p, i) => { + const pkmn = p.toPokemon(this.scene); + const row = i % 2; + const id = pkmn.id; + const shiny = pkmn.shiny; + const formIndex = pkmn.formIndex; + const variant = pkmn.variant; + const species = pkmn.getSpeciesForm(); + const pokemonSprite: Phaser.GameObjects.Sprite = this.scene.add.sprite(60 + 40 * i, 40 + row * 80, "pkmn__sub"); + pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.hallofFameContainer.add(pokemonSprite); + const speciesLoaded: Map = new Map(); + speciesLoaded.set(id, false); + + const female = pkmn.gender === 1; + species.loadAssets(this.scene, female, formIndex, shiny, variant, true).then(() => { + speciesLoaded.set(id, true); + pokemonSprite.play(species.getSpriteKey(female, formIndex, shiny, variant)); + pokemonSprite.setPipelineData("shiny", shiny); + pokemonSprite.setPipelineData("variant", variant); + pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female, formIndex, shiny, variant)); + pokemonSprite.setVisible(true); + }); + if (pkmn.isFusion()) { + const fusionIcon = this.scene.add.sprite(80 + 40 * i, 50 + row * 80, pkmn.getFusionIconAtlasKey()); + fusionIcon.setName("sprite-fusion-icon"); + fusionIcon.setOrigin(0.5, 0); + fusionIcon.setFrame(pkmn.getFusionIconId(true)); + this.hallofFameContainer.add(fusionIcon); + } + pkmn.destroy(); + }); + this.hallofFameContainer.setVisible(false); + this.runContainer.add(this.hallofFameContainer); + } + + /** + * Takes input from the user to perform a desired action. + * @param button - Button object to be processed + * Button.CANCEL - removes all containers related to RunInfo and returns the user to Run History + * Button.CYCLE_FORM, Button.CYCLE_SHINY, Button.CYCLE_ABILITY - runs the function buttonCycleOption() + */ + override processInput(button: Button): boolean { + const ui = this.getUi(); + + let success = false; + const error = false; + + switch (button) { + case Button.CANCEL: + success = true; + if (this.pageMode === RunInfoUiMode.MAIN) { + this.runInfoContainer.removeAll(true); + this.runResultContainer.removeAll(true); + this.partyContainer.removeAll(true); + this.runContainer.removeAll(true); + if (this.isVictory) { + this.hallofFameContainer.removeAll(true); + } + super.clear(); + this.runContainer.setVisible(false); + ui.revertMode(); + } else if (this.pageMode === RunInfoUiMode.HALL_OF_FAME) { + this.hallofFameContainer.setVisible(false); + this.pageMode = RunInfoUiMode.MAIN; + } else if (this.pageMode === RunInfoUiMode.ENDING_ART) { + this.endCardContainer.setVisible(false); + this.runContainer.remove(this.endCardContainer); + this.pageMode = RunInfoUiMode.MAIN; + } + break; + case Button.DOWN: + case Button.UP: + break; + case Button.CYCLE_FORM: + case Button.CYCLE_SHINY: + case Button.CYCLE_ABILITY: + this.buttonCycleOption(button); + break; + } + + if (success) { + ui.playSelect(); + } else if (error) { + ui.playError(); + } + return success || error; + } + + /** + * buttonCycleOption : takes a parameter button to execute different actions in the run-info page + * The use of non-directional / A / B buttons is named in relation to functions used during starter-select. + * Button.CYCLE_FORM (F key) --> displays ending art (victory only) + * Button.CYCLE_SHINY (R key) --> displays hall of fame (victory only) + * Button.CYCLE_ABILITY (E key) --> shows pokemon held items + */ + private buttonCycleOption(button: Button) { + switch (button) { + case Button.CYCLE_FORM: + if (this.isVictory) { + if (!this.endCardContainer || !this.endCardContainer.visible) { + this.createVictorySplash(); + this.endCardContainer.setVisible(true); + this.runContainer.add(this.endCardContainer); + this.pageMode = RunInfoUiMode.ENDING_ART; + } else { + this.endCardContainer.setVisible(false); + this.runContainer.remove(this.endCardContainer); + this.pageMode = RunInfoUiMode.MAIN; + } + } + break; + case Button.CYCLE_SHINY: + if (this.isVictory) { + if (!this.hallofFameContainer.visible) { + this.hallofFameContainer.setVisible(true); + this.pageMode = RunInfoUiMode.HALL_OF_FAME; + } else { + this.hallofFameContainer.setVisible(false); + this.pageMode = RunInfoUiMode.MAIN; + } + } + break; + case Button.CYCLE_ABILITY: + if (this.partyVisibility) { + this.showParty(false); + } else { + this.showParty(true); + } + break; + } + } +} + diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 8a81ac4858d..89b20322a68 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -2,7 +2,7 @@ import i18next from "i18next"; import BattleScene from "../battle-scene"; import { Button } from "#enums/buttons"; import { GameMode } from "../game-mode"; -import { PokemonHeldItemModifier } from "../modifier/modifier"; +import * as Modifier from "../modifier/modifier"; import { SessionSaveData } from "../system/game-data"; import PokemonData from "../system/pokemon-data"; import * as Utils from "../utils"; @@ -29,11 +29,11 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { private sessionSlots: SessionSlot[]; private uiMode: SaveSlotUiMode; - private saveSlotSelectCallback: SaveSlotSelectCallback; + private saveSlotSelectCallback: SaveSlotSelectCallback | null; private scrollCursor: integer = 0; - private cursorObj: Phaser.GameObjects.NineSlice; + private cursorObj: Phaser.GameObjects.NineSlice | null; private sessionSlotsContainerInitialY: number; @@ -106,16 +106,16 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { switch (this.uiMode) { case SaveSlotUiMode.LOAD: this.saveSlotSelectCallback = null; - originalCallback(cursor); + originalCallback && originalCallback(cursor); break; case SaveSlotUiMode.SAVE: const saveAndCallback = () => { const originalCallback = this.saveSlotSelectCallback; this.saveSlotSelectCallback = null; ui.revertMode(); - ui.showText(null, 0); + ui.showText("", 0); ui.setMode(Mode.MESSAGE); - originalCallback(cursor); + originalCallback && originalCallback(cursor); }; if (this.sessionSlots[cursor].hasData) { ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { @@ -129,7 +129,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { }); }, () => { ui.revertMode(); - ui.showText(null, 0); + ui.showText("", 0); }, false, 0, 19, 2000); }); } else if (this.sessionSlots[cursor].hasData === false) { @@ -143,7 +143,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } } else { this.saveSlotSelectCallback = null; - originalCallback(-1); + originalCallback && originalCallback(-1); success = true; } } else { @@ -202,7 +202,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { const changed = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight_thick", null, 296, 44, 6, 6, 6, 6); + this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight_thick", undefined, 296, 44, 6, 6, 6, 6); this.cursorObj.setOrigin(0, 0); this.sessionSlotsContainer.add(this.cursorObj); } @@ -292,7 +292,7 @@ class SessionSlot extends Phaser.GameObjects.Container { const icon = this.scene.addPokemonIcon(pokemon, 0, 0, 0, 0); const text = addTextObject(this.scene, 32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); - text.setShadow(0, 0, null); + text.setShadow(0, 0, undefined); text.setStroke("#424242", 14); text.setOrigin(1, 0); @@ -306,19 +306,19 @@ class SessionSlot extends Phaser.GameObjects.Container { this.add(pokemonIconsContainer); - const modifiersModule = await import("../modifier/modifier"); - const modifierIconsContainer = this.scene.add.container(148, 30); modifierIconsContainer.setScale(0.5); let visibleModifierIndex = 0; for (const m of data.modifiers) { - const modifier = m.toModifier(this.scene, modifiersModule[m.className]); - if (modifier instanceof PokemonHeldItemModifier) { + const modifier = m.toModifier(this.scene, Modifier[m.className]); + if (modifier instanceof Modifier.PokemonHeldItemModifier) { continue; } - const icon = modifier.getIcon(this.scene, false); - icon.setPosition(24 * visibleModifierIndex, 0); - modifierIconsContainer.add(icon); + const icon = modifier?.getIcon(this.scene, false); + if (icon) { + icon.setPosition(24 * visibleModifierIndex, 0); + modifierIconsContainer.add(icon); + } if (++visibleModifierIndex === 12) { break; } diff --git a/src/ui/scroll-bar.ts b/src/ui/scroll-bar.ts new file mode 100644 index 00000000000..e756393ae1a --- /dev/null +++ b/src/ui/scroll-bar.ts @@ -0,0 +1,36 @@ +export class ScrollBar extends Phaser.GameObjects.Container { + private bg: Phaser.GameObjects.Image; + private handleBody: Phaser.GameObjects.Rectangle; + private handleBottom: Phaser.GameObjects.Image; + private pages: number; + private page: number; + + constructor(scene: Phaser.Scene, x: number, y: number, pages: number) { + super(scene, x, y); + + this.bg = scene.add.image(0, 0, "scroll_bar"); + this.bg.setOrigin(0, 0); + this.add(this.bg); + + this.handleBody = scene.add.rectangle(1, 1, 3, 4, 0xaaaaaa); + this.handleBody.setOrigin(0, 0); + this.add(this.handleBody); + + this.handleBottom = scene.add.image(1, 1, "scroll_bar_handle"); + this.handleBottom.setOrigin(0, 0); + this.add(this.handleBottom); + } + + setPage(page: number): void { + this.page = page; + this.handleBody.y = 1 + (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.pages * page; + this.handleBottom.y = this.handleBody.y + this.handleBody.displayHeight; + } + + setPages(pages: number): void { + this.pages = pages; + this.handleBody.height = (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * 9 / this.pages; + + this.setVisible(this.pages > 9); + } +} diff --git a/src/ui/session-reload-modal-ui-handler.ts b/src/ui/session-reload-modal-ui-handler.ts index 5313de58580..147634b19d2 100644 --- a/src/ui/session-reload-modal-ui-handler.ts +++ b/src/ui/session-reload-modal-ui-handler.ts @@ -4,7 +4,7 @@ import { addTextObject, TextStyle } from "./text"; import { Mode } from "./ui"; export default class SessionReloadModalUiHandler extends ModalUiHandler { - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); } diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index 809c4ffa2f8..5e6dd80c6d6 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -7,6 +7,8 @@ import {Button} from "#enums/buttons"; import {NavigationManager} from "#app/ui/settings/navigationMenu"; import i18next from "i18next"; +type CancelFn = (succes?: boolean) => boolean; + /** * Abstract class for handling UI elements related to button bindings. */ @@ -35,7 +37,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { protected targetButtonIcon: Phaser.GameObjects.Sprite; // Function to call on cancel or completion of binding. - protected cancelFn: (boolean?) => boolean; + protected cancelFn: CancelFn | null; abstract swapAction(): boolean; protected timeLeftAutoClose: number = 5; @@ -50,7 +52,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { * @param scene - The BattleScene instance. * @param mode - The UI mode. */ - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); } @@ -107,7 +109,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { if (this.timeLeftAutoClose >= 0) { this.manageAutoCloseTimer(); } else { - this.cancelFn(); + this.cancelFn && this.cancelFn(); } }, 1000); } @@ -163,7 +165,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { */ processInput(button: Button): boolean { if (this.buttonPressed === null) { - return; + return false; // TODO: is false correct as default? (previously was `undefined`) } const ui = this.getUi(); let success = false; @@ -177,11 +179,11 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { case Button.ACTION: // Process actions based on current cursor position. if (this.cursor === 0) { - this.cancelFn(); + this.cancelFn && this.cancelFn(); } else { success = this.swapAction(); NavigationManager.getInstance().updateIcons(); - this.cancelFn(success); + this.cancelFn && this.cancelFn(success); } break; } @@ -242,7 +244,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { * @param assignedButtonIcon - The icon of the button that is assigned. * @param type - The type of button press. */ - onInputDown(buttonIcon: string, assignedButtonIcon: string, type: string): void { + onInputDown(buttonIcon: string, assignedButtonIcon: string | null, type: string): void { clearTimeout(this.countdownTimer); this.timerText.setText(""); this.newButtonIcon.setTexture(type); diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 9bf0cb40975..f8dab1bf7cc 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -33,7 +33,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler protected scrollCursor: integer; protected optionCursors: integer[]; - protected cursorObj: Phaser.GameObjects.NineSlice; + protected cursorObj: Phaser.GameObjects.NineSlice | null; protected optionsBg: Phaser.GameObjects.NineSlice; protected actionsBg: Phaser.GameObjects.NineSlice; @@ -73,14 +73,14 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler * @param scene - The BattleScene instance. * @param mode - The UI mode. */ - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.rowsToDisplay = 8; } getLocalStorageSetting(): object { // Retrieve the settings from local storage or use an empty object if none exist. - const settings: object = localStorage.hasOwnProperty(this.localStoragePropertyName) ? JSON.parse(localStorage.getItem(this.localStoragePropertyName)) : {}; + const settings: object = localStorage.hasOwnProperty(this.localStoragePropertyName) ? JSON.parse(localStorage.getItem(this.localStoragePropertyName)!) : {}; // TODO: is this bang correct? return settings; } @@ -442,7 +442,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler switch (button) { case Button.ACTION: if (!this.optionCursors || !this.optionValueLabels) { - return; + return false; // TODO: is false correct as default? (previously was `undefined`) } if (this.settingBlacklisted.includes(setting) || !setting.includes("BUTTON_")) { success = false; @@ -490,7 +490,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler break; case Button.LEFT: // Move selection left within the current option set. if (!this.optionCursors || !this.optionValueLabels) { - return; + return false; // TODO: is false correct as default? (previously was `undefined`) } if (this.settingBlacklisted.includes(setting) || setting.includes("BUTTON_")) { success = false; @@ -500,7 +500,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler break; case Button.RIGHT: // Move selection right within the current option set. if (!this.optionCursors || !this.optionValueLabels) { - return; + return false; // TODO: is false correct as default? (previously was `undefined`) } if (this.settingBlacklisted.includes(setting) || setting.includes("BUTTON_")) { success = false; @@ -526,7 +526,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler resetScroll() { this.cursorObj?.destroy(); this.cursorObj = null; - this.cursor = null; + this.cursor = 0; this.setCursor(0); this.setScrollCursor(0); this.updateSettingsScroll(); @@ -547,7 +547,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Check if the cursor object exists, if not, create it. if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", null, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1); + this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); // Set the origin to the top-left corner. this.optionsContainer.add(this.cursorObj); // Add the cursor to the options container. } diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 6763c8d3d85..570377eab43 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -5,9 +5,9 @@ import { Mode } from "../ui"; import UiHandler from "../ui-handler"; import { addWindow } from "../ui-theme"; import {Button} from "#enums/buttons"; -import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler.js"; +import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler"; import NavigationMenu, {NavigationManager} from "#app/ui/settings/navigationMenu"; -import { Setting, SettingKeys } from "#app/system/settings/settings"; +import { Setting, SettingKeys, SettingType } from "#app/system/settings/settings"; import i18next from "i18next"; @@ -30,7 +30,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { protected navigationIcons: InputsIcons; - private cursorObj: Phaser.GameObjects.NineSlice; + private cursorObj: Phaser.GameObjects.NineSlice | null; private reloadSettings: Array; private reloadRequired: boolean; @@ -40,9 +40,9 @@ export default class AbstractSettingsUiHandler extends UiHandler { protected settings: Array; protected localStorageKey: string; - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, type: SettingType, mode: Mode | null = null) { super(scene, mode); - + this.settings = Setting.filter(s => s.type === type && !s?.isHidden?.()); this.reloadRequired = false; this.rowsToDisplay = 8; } @@ -105,7 +105,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.optionsContainer.add(this.settingLabels[s]); this.optionValueLabels.push(setting.options.map((option, o) => { - const valueLabel = addTextObject(this.scene, 0, 0, option.label, setting.default === o ? TextStyle.SETTINGS_SELECTED : TextStyle.WINDOW); + const valueLabel = addTextObject(this.scene, 0, 0, option.label, setting.default === o ? TextStyle.SETTINGS_SELECTED : TextStyle.SETTINGS_VALUE); valueLabel.setOrigin(0, 0); this.optionsContainer.add(valueLabel); @@ -180,7 +180,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { super.show(args); this.updateBindings(); - const settings: object = localStorage.hasOwnProperty(this.localStorageKey) ? JSON.parse(localStorage.getItem(this.localStorageKey)) : {}; + const settings: object = localStorage.hasOwnProperty(this.localStorageKey) ? JSON.parse(localStorage.getItem(this.localStorageKey)!) : {}; // TODO: is this bang correct? this.settings.forEach((setting, s) => this.setOptionCursor(s, settings.hasOwnProperty(setting.key) ? settings[setting.key] : this.settings[s].default)); @@ -264,6 +264,12 @@ export default class AbstractSettingsUiHandler extends UiHandler { case Button.CYCLE_SHINY: success = this.navigationContainer.navigate(button); break; + case Button.ACTION: + const setting: Setting = this.settings[cursor]; + if (setting?.activatable) { + success = this.activateSetting(setting); + } + break; } } @@ -275,6 +281,20 @@ export default class AbstractSettingsUiHandler extends UiHandler { return success; } + /** + * Activate the specified setting if it is activatable. + * @param setting The setting to activate. + * @returns Whether the setting was successfully activated. + */ + activateSetting(setting: Setting): boolean { + switch (setting.key) { + case SettingKeys.Move_Touch_Controls: + this.scene.inputController.moveTouchControlsHandler.enableConfigurationMode(this.getUi(), this.scene); + return true; + } + return false; + } + /** * Set the cursor to the specified position. * @@ -285,7 +305,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", null, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1); + this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); this.optionsContainer.add(this.cursorObj); } @@ -314,8 +334,8 @@ export default class AbstractSettingsUiHandler extends UiHandler { const lastCursor = this.optionCursors[settingIndex]; const lastValueLabel = this.optionValueLabels[settingIndex][lastCursor]; - lastValueLabel.setColor(this.getTextColor(TextStyle.WINDOW)); - lastValueLabel.setShadowColor(this.getTextColor(TextStyle.WINDOW, true)); + lastValueLabel.setColor(this.getTextColor(TextStyle.SETTINGS_VALUE)); + lastValueLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_VALUE, true)); this.optionCursors[settingIndex] = cursor; @@ -375,6 +395,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { super.clear(); this.settingsContainer.setVisible(false); this.eraseCursor(); + this.getUi().bgmBar.toggleBgmBar(this.scene.showBgmBar); if (this.reloadRequired) { this.reloadRequired = false; this.scene.reset(true, false, true); diff --git a/src/ui/settings/gamepad-binding-ui-handler.ts b/src/ui/settings/gamepad-binding-ui-handler.ts index 70291da15a2..4e5b4576b85 100644 --- a/src/ui/settings/gamepad-binding-ui-handler.ts +++ b/src/ui/settings/gamepad-binding-ui-handler.ts @@ -8,9 +8,9 @@ import {addTextObject, TextStyle} from "#app/ui/text"; export default class GamepadBindingUiHandler extends AbstractBindingUiHandler { - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); - this.scene.input.gamepad.on("down", this.gamepadButtonDown, this); + this.scene.input.gamepad?.on("down", this.gamepadButtonDown, this); } setup() { super.setup(); diff --git a/src/ui/settings/keyboard-binding-ui-handler.ts b/src/ui/settings/keyboard-binding-ui-handler.ts index 2a92bb0fa6c..043c5fba6a5 100644 --- a/src/ui/settings/keyboard-binding-ui-handler.ts +++ b/src/ui/settings/keyboard-binding-ui-handler.ts @@ -8,11 +8,12 @@ import {addTextObject, TextStyle} from "#app/ui/text"; export default class KeyboardBindingUiHandler extends AbstractBindingUiHandler { - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); // Listen to gamepad button down events to initiate binding. - scene.input.keyboard.on("keydown", this.onKeyDown, this); + scene.input.keyboard?.on("keydown", this.onKeyDown, this); } + setup() { super.setup(); diff --git a/src/ui/settings/move-touch-controls-handler.ts b/src/ui/settings/move-touch-controls-handler.ts new file mode 100644 index 00000000000..cff68fa523d --- /dev/null +++ b/src/ui/settings/move-touch-controls-handler.ts @@ -0,0 +1,380 @@ +import TouchControl from "#app/touch-controls"; +import UI from "#app/ui/ui"; +import { Scene } from "phaser"; + +export const TOUCH_CONTROL_POSITIONS_LANDSCAPE = "touchControlPositionsLandscape"; +export const TOUCH_CONTROL_POSITIONS_PORTRAIT = "touchControlPositionsPortrait"; + + + +type ControlPosition = { id: string, x: number, y: number }; + +type ConfigurationEventListeners = { + "touchstart": EventListener[] + "touchmove": EventListener[] + "touchend": EventListener[] +}; + +type ToolbarRefs = { + toolbar: HTMLDivElement, + saveButton: HTMLDivElement + resetButton: HTMLDivElement + cancelButton: HTMLDivElement +}; + +/** + * Handles the dragging of touch controls around the screen. + */ +export default class MoveTouchControlsHandler { + + /** The element that is currently being dragged */ + private draggingElement: HTMLElement | null = null; + + /** + * Whether the user is currently configuring the touch controls. + * When this is true, the touch controls can be dragged around the screen and the controls of the game are disabled. + */ + public inConfigurationMode: boolean; + + /** + * The event listeners for the configuration mode. + * These are used to remove the event listeners when the configuration mode is disabled. + */ + private configurationEventListeners: ConfigurationEventListeners = { + "touchstart": [], + "touchmove": [], + "touchend": [] + }; + + private overlay: Phaser.GameObjects.Container; + + private isLandscapeMode: boolean = this.getScreenSize().width > this.getScreenSize().height; + private touchControls: TouchControl; + + constructor(touchControls: TouchControl) { + this.touchControls = touchControls; + this.inConfigurationMode = false; + this.setPositions(this.getSavedPositionsOfCurrentOrientation() ?? []); + window.addEventListener("resize", (event) => { + const screenSize = this.getScreenSize(); + if (screenSize.width > screenSize.height !== this.isLandscapeMode) { + this.changeOrientation(screenSize.width > screenSize.height); + } + }); + } + + /** + * Changes the state of the touch controls to the given orientation. + * @param isLandscapeMode Whether the screen is in landscape mode. + */ + private async changeOrientation(isLandscapeMode: boolean) { + this.isLandscapeMode = isLandscapeMode; + if (this.inConfigurationMode) { + const orientation = document.querySelector("#touchControls #orientation"); + if (orientation) { + orientation.textContent = this.isLandscapeMode? "Landscape" : "Portrait"; + } + } + const positions = this.getSavedPositionsOfCurrentOrientation() ?? []; + this.setPositions(positions); + } + + private getScreenSize() { + return { width: window.screen.width, height: window.screen.height }; + } + + /** + * Creates the toolbar element for the configuration mode. + * @returns A new div element that contains the toolbar for the configuration mode. + */ + private createToolbarElement(): HTMLDivElement { + const toolbar = document.createElement("div"); + toolbar.id = "configToolbar"; + toolbar.innerHTML = ` +
+
+
Reset
+
Save & close
+
Cancel
+
+
+
+ Orientation: ${this.isLandscapeMode ? "Landscape" : "Portrait"} +
+
+
+ `; + return toolbar; + } + + /** + * Initializes the toolbar of the configuration mode. + * Places its elements at the top of the touch controls and adds event listeners to them. + */ + private createToolbar() { + document.querySelector("#touchControls")?.prepend(this.createToolbarElement()); + const refs = this.getConfigToolbarRefs(); + if (!refs) { + return; + } + const { saveButton, resetButton, cancelButton } = refs; + + saveButton.addEventListener("click", () => { + this.saveCurrentPositions(); + this.disableConfigurationMode(); + }); + resetButton.addEventListener("click", () => { + this.resetPositions(); + }); + cancelButton.addEventListener("click", () => { + const positions = this.getSavedPositionsOfCurrentOrientation(); + this.setPositions(positions); + this.disableConfigurationMode(); + }); + } + + /** + * Returns the references to the elements of the configuration toolbar. + * @returns The references to the elements of the configuration toolbar + * or undefined if the elements can not be found (e.g. during tests) + */ + private getConfigToolbarRefs(): ToolbarRefs | undefined { + const toolbar = document.querySelector("#touchControls #configToolbar") as HTMLDivElement; + if (!toolbar) { + return; + } + return { + toolbar, + saveButton: toolbar.querySelector("#saveButton")!, + resetButton: toolbar.querySelector("#resetButton")!, + cancelButton: toolbar.querySelector("#cancelButton")! + }; + } + + /** + * Elements that are inside the left div are anchored to the left boundary of the screen. + * The x value of the positions are considered offsets to their respective boundaries. + * @param element Either an element in the left div or the right div. + * @returns Whether the given element is inside the left div. + */ + private isLeft = (element: HTMLElement) => document.querySelector("#touchControls .left")?.contains(element); + + /** + * Start dragging the given button. + * @param controlGroup The button that is being dragged. + * @param touch The touch event that started the drag. + */ + private startDrag = (controlGroup: HTMLElement): void => { + this.draggingElement = controlGroup; + }; + + /** + * Drags the currently dragged element to the given touch position. + * @param touch The touch event that is currently happening. + * @param isLeft Whether the dragged element is a left button. + */ + private drag = (touch: Touch): void => { + if (!this.draggingElement) { + return; + } + const rect = this.draggingElement.getBoundingClientRect(); + // Map the touch position to the center of the dragged element. + const xOffset = this.isLeft(this.draggingElement) ? touch.clientX - rect.width / 2 : window.innerWidth - touch.clientX - rect.width / 2; + const yOffset = window.innerHeight - touch.clientY - rect.height / 2; + this.setPosition(this.draggingElement, xOffset, yOffset); + }; + + /** + * Stops dragging the currently dragged element. + */ + private stopDrag = () => { + this.draggingElement = null; + }; + + /** + * Returns the current positions of all touch controls that have moved from their default positions of this orientation. + * @returns {ControlPosition[]} The current positions of all touch controls that have moved from their default positions of this orientation + */ + private getModifiedCurrentPositions(): ControlPosition[] { + return this.getControlGroupElements() + .filter((controlGroup: HTMLElement) => controlGroup.style.right || controlGroup.style.left) + .map((controlGroup: HTMLElement) => { + return { + id: controlGroup.id, + x: parseFloat(this.isLeft(controlGroup) ? controlGroup.style.left : controlGroup.style.right), + y: parseFloat(controlGroup.style.bottom), + }; + }); + } + + /** + * Returns the key of the local storage for the control positions data of this orientation + */ + private getLocalStorageKey(): string { + return this.isLandscapeMode ? TOUCH_CONTROL_POSITIONS_LANDSCAPE : TOUCH_CONTROL_POSITIONS_PORTRAIT; + } + + /** + * Returns the saved positions of the touch controls. + * Filters result by the given orientation. + * @returns The saved positions of the touch controls of this orientation + */ + private getSavedPositionsOfCurrentOrientation(): ControlPosition[] { + const positions = localStorage.getItem(this.getLocalStorageKey()); + if (!positions) { + return []; + } + return JSON.parse(positions) as ControlPosition[]; + } + + /** + * Saves the current positions of the touch controls to the local storage. + */ + private saveCurrentPositions() { + const pos = this.getModifiedCurrentPositions(); + localStorage.setItem(this.getLocalStorageKey(), JSON.stringify(pos)); + } + + /** + * Updates the positions of the touch controls. + * @param positions The new positions of the touch controls. + */ + private setPositions(positions: ControlPosition[]) { + this.resetPositions(); + return positions.forEach((pos: ControlPosition) => { + const controlGroup = document.querySelector(`#${pos.id}`) as HTMLElement; + this.setPosition(controlGroup, pos.x, pos.y); + }); + } + + /** + * Sets a control element to the given position. + * The x values are either offsets to the left or right boundary of the screen, depending on the side of the element. + * E.g. For left elements, (0, 0) is the bottom left corner of the screen and + * for right elements, (0, 0) is the bottom right corner of the screen. + * @param controlElement + * @param x Either an offset to the left or right boundary of the screen. + * @param y An offset to the bottom boundary of the screen. + */ + private setPosition(controlElement: HTMLElement, x: number, y: number) { + const rect = controlElement.getBoundingClientRect(); + const checkBound = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max); + const { height, width } = this.getScreenSize(); + x = checkBound(x, 0, width - rect.width); + y = checkBound(y, 0, height - rect.height); + if (this.isLeft(controlElement)) { + controlElement.style.left = `${x}px`; + } else { + controlElement.style.right = `${x}px`; + } + controlElement.style.bottom = `${y}px`; + } + + /** + * Resets the positions of the touch controls to their default positions and clears the saved positions. + * Does not save the changes. + */ + private resetPositions() { + this.getControlGroupElements().forEach((controlGroup: HTMLDivElement) => { + controlGroup.style.removeProperty("left"); + controlGroup.style.removeProperty("right"); + controlGroup.style.removeProperty("bottom"); + }); + } + + /** + * Returns all control groups of the touch controls. + * These are groups of buttons that can be dragged around the screen. + * @returns All control groups of the touch controls. + */ + private getControlGroupElements(): HTMLDivElement[] { + return [...document.querySelectorAll("#touchControls .control-group")] as HTMLDivElement[]; + } + + /** + * Creates the event listeners for the configuration mode. + * @param controlGroups The elements that can be dragged around the screen. + * @returns The event listeners for the configuration mode. + */ + private createConfigurationEventListeners(controlGroups: HTMLDivElement[]): ConfigurationEventListeners { + return { + "touchstart": controlGroups.map((element: HTMLDivElement) => { + const startDrag = () => this.startDrag(element); + element.addEventListener("touchstart", startDrag, { passive: true }); + return startDrag; + }), + "touchmove": controlGroups.map(() => { + const drag = (event) => this.drag(event.touches[0]); + window.addEventListener("touchmove", drag, { passive: true }); + return drag; + }), + "touchend": controlGroups.map(() => { + const stopDrag = () => this.stopDrag(); + window.addEventListener("touchend", stopDrag, { passive: true }); + return stopDrag; + }) + }; + } + + /** + * Creates an overlay that covers the screen and allows the user to drag the touch controls around. + * Also enables the toolbar for saving, resetting, and canceling the changes. + * @param ui The UI of the game. + * @param scene The scene of the game. + */ + private createOverlay(ui: UI, scene: Scene) { + const container = new Phaser.GameObjects.Container(scene, 0, 0); + const overlay = new Phaser.GameObjects.Rectangle(scene, 0, 0, scene.game.canvas.width, scene.game.canvas.height, 0x000000, 0.5); + overlay.setInteractive(); + container.add(overlay); + ui.add(container); + this.overlay = container; + + // Display toolbar + document.querySelector("#touchControls")?.classList.add("config-mode"); + } + + /** + * Allows the user to configure the touch controls by dragging buttons around the screen. + * @param ui The UI of the game. + * @param scene The scene of the game. + */ + public enableConfigurationMode(ui: UI, scene: Scene) { + if (this.inConfigurationMode) { + return; + } + this.inConfigurationMode = true; + this.touchControls.disable(); + this.createOverlay(ui, scene); + this.createToolbar(); + // Create event listeners with a delay to prevent the touchstart event from being triggered immediately. + setTimeout(() => { + // Remember the event listeners so they can be removed later. + this.configurationEventListeners = this.createConfigurationEventListeners(this.getControlGroupElements()); + }, 500); + } + + /** + * Disables the configuration mode. + */ + public disableConfigurationMode() { + this.inConfigurationMode = false; + this.draggingElement = null; + + // Remove event listeners + const { touchstart, touchmove, touchend } = this.configurationEventListeners; + this.getControlGroupElements().forEach((element, index) => element.removeEventListener("touchstart", touchstart[index])); + touchmove.forEach((listener) => window.removeEventListener("touchmove", listener)); + touchend.forEach((listener) => window.removeEventListener("touchend", listener)); + + // Remove configuration toolbar + const toolbar = document.querySelector("#touchControls #configToolbar"); + toolbar?.remove(); + + // Remove overlay + this.overlay?.destroy(); + document.querySelector("#touchControls")?.classList.remove("config-mode"); + this.touchControls.enable(); + } + +} diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index 370b6f67c76..7d7761b7b69 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -1,6 +1,6 @@ import BattleScene from "#app/battle-scene"; import {Mode} from "#app/ui/ui"; -import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler.js"; +import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler"; import {addTextObject, setTextStyle, TextStyle} from "#app/ui/text"; import {addWindow} from "#app/ui/ui-theme"; import {Button} from "#enums/buttons"; diff --git a/src/ui/settings/settings-audio-ui-handler.ts b/src/ui/settings/settings-audio-ui-handler.ts index 10313ed388c..86c6a9bce40 100644 --- a/src/ui/settings/settings-audio-ui-handler.ts +++ b/src/ui/settings/settings-audio-ui-handler.ts @@ -1,8 +1,8 @@ import BattleScene from "../../battle-scene"; import { Mode } from "../ui"; -"#app/inputs-controller.js"; +"#app/inputs-controller"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; -import { Setting, SettingType } from "#app/system/settings/settings"; +import { SettingType } from "#app/system/settings/settings"; export default class SettingsAudioUiHandler extends AbstractSettingsUiHandler { /** @@ -11,11 +11,10 @@ export default class SettingsAudioUiHandler extends AbstractSettingsUiHandler { * @param scene - The BattleScene instance. * @param mode - The UI mode, optional. */ - constructor(scene: BattleScene, mode?: Mode) { - super(scene, mode); + constructor(scene: BattleScene, mode: Mode | null = null) { + super(scene, SettingType.AUDIO, mode); this.title = "Audio"; - this.settings = Setting.filter(s => s.type === SettingType.AUDIO); this.localStorageKey = "settings"; - this.rowsToDisplay = 4; + this.rowsToDisplay = 6; } } diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index f0e84f29e00..3d602c50a78 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -1,8 +1,8 @@ import BattleScene from "../../battle-scene"; import { Mode } from "../ui"; -"#app/inputs-controller.js"; +"#app/inputs-controller"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; -import { Setting, SettingKeys, SettingType } from "#app/system/settings/settings"; +import { SettingKeys, SettingType } from "#app/system/settings/settings"; export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler { /** @@ -11,10 +11,9 @@ export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler * @param scene - The BattleScene instance. * @param mode - The UI mode, optional. */ - constructor(scene: BattleScene, mode?: Mode) { - super(scene, mode); + constructor(scene: BattleScene, mode: Mode | null = null) { + super(scene, SettingType.DISPLAY, mode); this.title = "Display"; - this.settings = Setting.filter(s => s.type === SettingType.DISPLAY); /** * Update to current language from default value. @@ -79,6 +78,18 @@ export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler label: "한국어", }; break; + case "ja": + this.settings[languageIndex].options[0] = { + value: "日本語", + label: "日本語", + }; + break; + case "ca-ES": + this.settings[languageIndex].options[0] = { + value: "Català", + label: "Català", + }; + break; default: this.settings[languageIndex].options[0] = { value: "English", diff --git a/src/ui/settings/settings-gamepad-ui-handler.ts b/src/ui/settings/settings-gamepad-ui-handler.ts index f86e8088ec6..63a9d2ab23b 100644 --- a/src/ui/settings/settings-gamepad-ui-handler.ts +++ b/src/ui/settings/settings-gamepad-ui-handler.ts @@ -12,7 +12,7 @@ import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import pad_dualshock from "#app/configs/inputs/pad_dualshock"; import pad_unlicensedSNES from "#app/configs/inputs/pad_unlicensedSNES"; import {InterfaceConfig} from "#app/inputs-controller"; -import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler.js"; +import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler"; import {Device} from "#enums/devices"; import {truncateString} from "#app/utils"; import i18next from "i18next"; @@ -31,7 +31,7 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH * @param scene - The BattleScene instance. * @param mode - The UI mode, optional. */ - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.titleSelected = "Gamepad"; this.setting = SettingGamepad; diff --git a/src/ui/settings/settings-keyboard-ui-handler.ts b/src/ui/settings/settings-keyboard-ui-handler.ts index 5c4444991ad..7e020034bc6 100644 --- a/src/ui/settings/settings-keyboard-ui-handler.ts +++ b/src/ui/settings/settings-keyboard-ui-handler.ts @@ -9,7 +9,7 @@ import { settingKeyboardOptions } from "#app/system/settings/settings-keyboard"; import {reverseValueToKeySetting, truncateString} from "#app/utils"; -import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler.js"; +import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler"; import {InterfaceConfig} from "#app/inputs-controller"; import {addTextObject, TextStyle} from "#app/ui/text"; import {deleteBind} from "#app/configs/inputs/configHandler"; @@ -29,7 +29,7 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi * @param scene - The BattleScene instance. * @param mode - The UI mode, optional. */ - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.titleSelected = "Keyboard"; this.setting = SettingKeyboard; @@ -42,10 +42,10 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi this.settingBlacklisted = settingKeyboardBlackList; this.device = Device.KEYBOARD; - const deleteEvent = scene.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.DELETE); - const restoreDefaultEvent = scene.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.HOME); - deleteEvent.on("up", this.onDeleteDown, this); - restoreDefaultEvent.on("up", this.onHomeDown, this); + const deleteEvent = scene.input.keyboard?.addKey(Phaser.Input.Keyboard.KeyCodes.DELETE); + const restoreDefaultEvent = scene.input.keyboard?.addKey(Phaser.Input.Keyboard.KeyCodes.HOME); + deleteEvent && deleteEvent.on("up", this.onDeleteDown, this); + restoreDefaultEvent && restoreDefaultEvent.on("up", this.onHomeDown, this); } setSetting = setSettingKeyboard; diff --git a/src/ui/settings/settings-ui-handler.ts b/src/ui/settings/settings-ui-handler.ts index a6332be1343..3c5a7dd2c90 100644 --- a/src/ui/settings/settings-ui-handler.ts +++ b/src/ui/settings/settings-ui-handler.ts @@ -1,5 +1,5 @@ import BattleScene from "../../battle-scene"; -import {Setting, SettingType} from "../../system/settings/settings"; +import { SettingType } from "../../system/settings/settings"; import { Mode } from "../ui"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; @@ -10,10 +10,9 @@ export default class SettingsUiHandler extends AbstractSettingsUiHandler { * @param scene - The BattleScene instance. * @param mode - The UI mode, optional. */ - constructor(scene: BattleScene, mode?: Mode) { - super(scene, mode); + constructor(scene: BattleScene, mode: Mode | null = null) { + super(scene, SettingType.GENERAL, mode); this.title = "General"; - this.settings = Setting.filter(s => s.type === SettingType.GENERAL); this.localStorageKey = "settings"; } } diff --git a/src/ui/starter-container.ts b/src/ui/starter-container.ts new file mode 100644 index 00000000000..ce21d13add8 --- /dev/null +++ b/src/ui/starter-container.ts @@ -0,0 +1,110 @@ +import BattleScene from "../battle-scene"; +import PokemonSpecies from "../data/pokemon-species"; +import { addTextObject, TextStyle } from "./text"; + +export class StarterContainer extends Phaser.GameObjects.Container { + public scene: BattleScene; + public species: PokemonSpecies; + public icon: Phaser.GameObjects.Sprite; + public shinyIcons: Phaser.GameObjects.Image[] = []; + public label: Phaser.GameObjects.Text; + public starterPassiveBgs: Phaser.GameObjects.Image; + public hiddenAbilityIcon: Phaser.GameObjects.Image; + public favoriteIcon: Phaser.GameObjects.Image; + public classicWinIcon: Phaser.GameObjects.Image; + public candyUpgradeIcon: Phaser.GameObjects.Image; + public candyUpgradeOverlayIcon: Phaser.GameObjects.Image; + public cost: number = 0; + + constructor(scene: BattleScene, species: PokemonSpecies) { + super(scene, 0, 0); + + this.species = species; + + const defaultDexAttr = scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + // starter passive bg + const starterPassiveBg = this.scene.add.image(2, 5, "passive_bg"); + starterPassiveBg.setOrigin(0, 0); + starterPassiveBg.setScale(0.75); + starterPassiveBg.setVisible(false); + this.add(starterPassiveBg); + this.starterPassiveBgs = starterPassiveBg; + + // icon + this.icon = this.scene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon.setScale(0.5); + this.icon.setOrigin(0, 0); + this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); + this.icon.setTint(0); + this.add(this.icon); + + // shiny icons + for (let i = 0; i < 3; i++) { + const shinyIcon = this.scene.add.image(i * -3 + 12, 2, "shiny_star_small"); + shinyIcon.setScale(0.5); + shinyIcon.setOrigin(0, 0); + shinyIcon.setVisible(false); + this.shinyIcons.push(shinyIcon); + } + this.add(this.shinyIcons); + + // value label + const label = addTextObject(this.scene, 1, 2, "0", TextStyle.WINDOW, { fontSize: "32px" }); + label.setShadowOffset(2, 2); + label.setOrigin(0, 0); + label.setVisible(false); + this.add(label); + this.label = label; + + // hidden ability icon + const abilityIcon = this.scene.add.image(12, 7, "ha_capsule"); + abilityIcon.setOrigin(0, 0); + abilityIcon.setScale(0.5); + abilityIcon.setVisible(false); + this.add(abilityIcon); + this.hiddenAbilityIcon = abilityIcon; + + // favorite icon + const favoriteIcon = this.scene.add.image(0, 7, "favorite"); + favoriteIcon.setOrigin(0, 0); + favoriteIcon.setScale(0.5); + favoriteIcon.setVisible(false); + this.add(favoriteIcon); + this.favoriteIcon = favoriteIcon; + + // classic win icon + const classicWinIcon = this.scene.add.image(0, 12, "champion_ribbon"); + classicWinIcon.setOrigin(0, 0); + classicWinIcon.setScale(0.5); + classicWinIcon.setVisible(false); + this.add(classicWinIcon); + this.classicWinIcon = classicWinIcon; + + // candy upgrade icon + const candyUpgradeIcon = this.scene.add.image(12, 12, "candy"); + candyUpgradeIcon.setOrigin(0, 0); + candyUpgradeIcon.setScale(0.25); + candyUpgradeIcon.setVisible(false); + this.add(candyUpgradeIcon); + this.candyUpgradeIcon = candyUpgradeIcon; + + // candy upgrade overlay icon + const candyUpgradeOverlayIcon = this.scene.add.image(12, 12, "candy_overlay"); + candyUpgradeOverlayIcon.setOrigin(0, 0); + candyUpgradeOverlayIcon.setScale(0.25); + candyUpgradeOverlayIcon.setVisible(false); + this.add(candyUpgradeOverlayIcon); + this.candyUpgradeOverlayIcon = candyUpgradeOverlayIcon; + } + + checkIconId(female, formIndex, shiny, variant) { + if (this.icon.frame.name !== this.species.getIconId(female, formIndex, shiny, variant)) { + console.log(`${this.species.name}'s variant icon does not exist. Replacing with default.`); + this.icon.setTexture(this.species.getIconAtlasKey(formIndex, false, variant)); + this.icon.setFrame(this.species.getIconId(female, formIndex, false, variant)); + } + } +} diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index d0e644870a1..6b75c46bd45 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -13,11 +13,10 @@ import { allMoves } from "../data/move"; import { Nature, getNatureName } from "../data/nature"; import { pokemonFormChanges } from "../data/pokemon-forms"; import { LevelMoves, pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "../data/pokemon-level-moves"; -import PokemonSpecies, { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; +import PokemonSpecies, { allSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities, getPokerusStarters } from "../data/pokemon-species"; import { Type } from "../data/type"; import { GameModes } from "../game-mode"; -import { SelectChallengePhase, TitlePhase } from "../phases"; -import { AbilityAttr, DexAttr, DexAttrProps, DexEntry, StarterFormMoveData, StarterMoveset, StarterAttributes, StarterPreferences, StarterPrefs } from "../system/game-data"; +import { AbilityAttr, DexAttr, DexAttrProps, DexEntry, StarterMoveset, StarterAttributes, StarterPreferences, StarterPrefs } from "../system/game-data"; import { Tutorial, handleTutorial } from "../tutorial"; import * as Utils from "../utils"; import { OptionSelectItem } from "./abstact-option-select-ui-handler"; @@ -28,17 +27,25 @@ import { TextStyle, addBBCodeTextObject, addTextObject } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; import { Egg } from "#app/data/egg"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; 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, 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"; +import { TitlePhase } from "#app/phases/title-phase"; +import { Abilities } from "#app/enums/abilities"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -50,6 +57,7 @@ export interface Starter { nature: Nature; moveset?: StarterMoveset; pokerus: boolean; + nickname?: string; } interface LanguageSetting { @@ -65,8 +73,9 @@ const languageSettings: { [key: string]: LanguageSetting } = { instructionTextSize: "38px", }, "de":{ - starterInfoTextSize: "56px", + starterInfoTextSize: "48px", instructionTextSize: "35px", + starterInfoXPos: 33, }, "es":{ starterInfoTextSize: "56px", @@ -74,7 +83,7 @@ const languageSettings: { [key: string]: LanguageSetting } = { }, "fr":{ starterInfoTextSize: "54px", - instructionTextSize: "42px", + instructionTextSize: "35px", }, "it":{ starterInfoTextSize: "56px", @@ -86,9 +95,10 @@ const languageSettings: { [key: string]: LanguageSetting } = { starterInfoXPos: 33, }, "zh":{ - starterInfoTextSize: "40px", - instructionTextSize: "42px", - starterInfoYOffset: 2 + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoYOffset: 1, + starterInfoXPos: 24, }, "pt":{ starterInfoTextSize: "48px", @@ -98,22 +108,40 @@ const languageSettings: { [key: string]: LanguageSetting } = { "ko":{ starterInfoTextSize: "52px", instructionTextSize: "38px", - } + }, + "ja":{ + starterInfoTextSize: "51px", + instructionTextSize: "38px", + }, + "ca-ES":{ + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, }; const starterCandyCosts: { passive: integer, costReduction: [integer, integer], egg: integer }[] = [ - { passive: 50, costReduction: [30, 75], egg: 35 }, // 1 - { passive: 45, costReduction: [25, 60], egg: 35 }, // 2 - { passive: 40, costReduction: [20, 50], egg: 35 }, // 3 - { passive: 30, costReduction: [15, 40], egg: 30 }, // 4 - { passive: 25, costReduction: [12, 35], egg: 25 }, // 5 - { passive: 20, costReduction: [10, 30], egg: 20 }, // 6 - { passive: 15, costReduction: [8, 20], egg: 15 }, // 7 - { passive: 10, costReduction: [5, 15], egg: 10 }, // 8 - { passive: 10, costReduction: [3, 10], egg: 10 }, // 9 - { passive: 10, costReduction: [3, 10], egg: 10 }, // 10 + { passive: 40, costReduction: [25, 60], egg: 30 }, // 1 Cost + { passive: 40, costReduction: [25, 60], egg: 30 }, // 2 Cost + { passive: 35, costReduction: [20, 50], egg: 25 }, // 3 Cost + { passive: 30, costReduction: [15, 40], egg: 20 }, // 4 Cost + { passive: 25, costReduction: [12, 35], egg: 18 }, // 5 Cost + { passive: 20, costReduction: [10, 30], egg: 15 }, // 6 Cost + { passive: 15, costReduction: [8, 20], egg: 12 }, // 7 Cost + { passive: 10, costReduction: [5, 15], egg: 10 }, // 8 Cost + { passive: 10, costReduction: [5, 15], egg: 10 }, // 9 Cost + { passive: 10, costReduction: [5, 15], egg: 10 }, // 10 Cost ]; +const valueReductionMax = 2; + +// Position of UI elements +const filterBarHeight = 17; +const speciesContainerX = 109; // if team on the RIGHT: 109 / if on the LEFT: 143 +const teamWindowX = 285; // if team on the RIGHT: 285 / if on the LEFT: 109 +const teamWindowY = 18; +const teamWindowWidth = 34; +const teamWindowHeight = 132; + function getPassiveCandyCount(baseValue: integer): integer { return starterCandyCosts[baseValue - 1].passive; } @@ -127,44 +155,79 @@ function getSameSpeciesEggCandyCounts(baseValue: integer): integer { } /** - * Calculates the icon position for a Pokemon of a given UI index - * @param index UI index to calculate the icon position of + * Calculates the starter position for a Pokemon of a given UI index + * @param index UI index to calculate the starter position of * @returns An interface with an x and y property */ -function calcIconPosition(index: number): {x: number, y: number} { +function calcStarterPosition(index: number, scrollCursor:number = 0): {x: number, y: number} { + const yOffset = 13; + const height = 17; const x = (index % 9) * 18; - const y = Math.floor(index / 9) * 18; + const y = yOffset + (Math.floor(index / 9) - scrollCursor) * height; return {x: x, y: y}; } /** - * Calculates the {@linkcode Phaser.GameObjects.Sprite} position for a Pokemon of a given UI index - * @param index UI index to calculate the icon position of - * @returns An interface with an x and y property + * Calculates the y position for the icon of stater pokemon selected for the team + * @param index index of the Pokemon in the team (0-5) + * @returns the y position to use for the icon */ -function calcSpritePosition(index: number): {x: number, y: number} { - const position = calcIconPosition(index); - - return {x: position.x - 2, y: position.y + 2}; +function calcStarterIconY(index: number) { + const starterSpacing = teamWindowHeight / 7; + const firstStarterY = teamWindowY + starterSpacing / 2; + return Math.round(firstStarterY + starterSpacing * index); +} + +/** + * Finds the index of the team Pokemon closest vertically to the given y position + * @param y the y position to find closest starter Pokemon + * @param teamSize how many Pokemon are in the team (0-6) + * @returns index of the closest Pokemon in the team container + */ +function findClosestStarterIndex(y: number, teamSize: number = 6): number { + let smallestDistance = teamWindowHeight; + let closestStarterIndex = 0; + for (let i = 0; i < teamSize; i++) { + const distance = Math.abs(y - (calcStarterIconY(i) - 13)); + if (distance < smallestDistance) { + closestStarterIndex = i; + smallestDistance = distance; + } + } + return closestStarterIndex; +} + +/** + * Finds the row of the filtered Pokemon closest vertically to the given Pokemon in the team + * @param index index of the Pokemon in the team (0-5) + * @param numberOfRows the number of rows to check against + * @returns index of the row closest vertically to the given Pokemon + */ +function findClosestStarterRow(index: number, numberOfRows: number) { + const currentY = calcStarterIconY(index) - 13; + let smallestDistance = teamWindowHeight; + let closestRowIndex = 0; + for (let i=0; i < numberOfRows; i++) { + const distance = Math.abs(currentY - calcStarterPosition(i * 9).y); + if (distance < smallestDistance) { + closestRowIndex = i; + smallestDistance = distance; + } + } + return closestRowIndex; } -const gens = [ - i18next.t("starterSelectUiHandler:gen1"), - i18next.t("starterSelectUiHandler:gen2"), - i18next.t("starterSelectUiHandler:gen3"), - i18next.t("starterSelectUiHandler:gen4"), - i18next.t("starterSelectUiHandler:gen5"), - i18next.t("starterSelectUiHandler:gen6"), - i18next.t("starterSelectUiHandler:gen7"), - i18next.t("starterSelectUiHandler:gen8"), - i18next.t("starterSelectUiHandler:gen9") -]; export default class StarterSelectUiHandler extends MessageUiHandler { private starterSelectContainer: Phaser.GameObjects.Container; + private starterSelectScrollBar: ScrollBar; + private filterBarContainer: Phaser.GameObjects.Container; + private filterBar: FilterBar; private shinyOverlay: Phaser.GameObjects.Image; - private starterSelectGenIconContainers: Phaser.GameObjects.Container[]; + private starterContainers: StarterContainer[] = []; + private filteredStarterContainers: StarterContainer[] = []; + private validStarterContainers: StarterContainer[] = []; private pokemonNumberText: Phaser.GameObjects.Text; private pokemonSprite: Phaser.GameObjects.Sprite; private pokemonNameText: Phaser.GameObjects.Text; @@ -200,21 +263,25 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; private pokemonShinyIcon: Phaser.GameObjects.Sprite; - private genOptionsText: Phaser.GameObjects.Text; + private pokemonPassiveDisabledIcon: Phaser.GameObjects.Sprite; + private pokemonPassiveLockedIcon: Phaser.GameObjects.Sprite; private instructionsContainer: Phaser.GameObjects.Container; + private filterInstructionsContainer: Phaser.GameObjects.Container; private shinyIconElement: Phaser.GameObjects.Sprite; private formIconElement: Phaser.GameObjects.Sprite; private abilityIconElement: Phaser.GameObjects.Sprite; private genderIconElement: Phaser.GameObjects.Sprite; private natureIconElement: Phaser.GameObjects.Sprite; private variantIconElement: Phaser.GameObjects.Sprite; + private goFilterIconElement: Phaser.GameObjects.Sprite; private shinyLabel: Phaser.GameObjects.Text; private formLabel: Phaser.GameObjects.Text; private genderLabel: Phaser.GameObjects.Text; private abilityLabel: Phaser.GameObjects.Text; private natureLabel: Phaser.GameObjects.Text; private variantLabel: Phaser.GameObjects.Text; + private goFilterLabel: Phaser.GameObjects.Text; private starterSelectMessageBox: Phaser.GameObjects.NineSlice; private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; @@ -222,27 +289,28 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonFormText: Phaser.GameObjects.Text; private moveInfoOverlay : MoveInfoOverlay; - private genMode: boolean; private statsMode: boolean; + private starterIconsCursorXOffset: number = -3; + private starterIconsCursorYOffset: number = 1; + private starterIconsCursorIndex: number; + private filterMode: boolean; private dexAttrCursor: bigint = 0n; - private abilityCursor: integer = -1; - private natureCursor: integer = -1; - private genCursor: integer = 0; - private genScrollCursor: integer = 0; - private starterMoveset: StarterMoveset; + private abilityCursor: number = -1; + private natureCursor: number = -1; + private filterBarCursor: integer = 0; + private starterMoveset: StarterMoveset | null; + private scrollCursor: number; - private genSpecies: PokemonSpecies[][] = []; + private allSpecies: PokemonSpecies[] = []; private lastSpecies: PokemonSpecies; private speciesLoaded: Map = new Map(); - public starterGens: integer[] = []; - public starterCursors: integer[] = []; - private pokerusGens: integer[] = []; - private pokerusCursors: integer[] = []; + public starterSpecies: PokemonSpecies[] = []; + private pokerusSpecies: PokemonSpecies[] = []; private starterAttr: bigint[] = []; private starterAbilityIndexes: integer[] = []; private starterNatures: Nature[] = []; private starterMovesets: StarterMoveset[] = []; - private speciesStarterDexEntry: DexEntry; + private speciesStarterDexEntry: DexEntry | null; private speciesStarterMoves: Moves[]; private canCycleShiny: boolean; private canCycleForm: boolean; @@ -253,30 +321,31 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private value: integer = 0; private canAddParty: boolean; - private assetLoadCancelled: Utils.BooleanHolder; + private assetLoadCancelled: Utils.BooleanHolder | null; public cursorObj: Phaser.GameObjects.Image; private starterCursorObjs: Phaser.GameObjects.Image[]; private pokerusCursorObjs: Phaser.GameObjects.Image[]; private starterIcons: Phaser.GameObjects.Sprite[]; - private genCursorObj: Phaser.GameObjects.Image; - private genCursorHighlightObj: Phaser.GameObjects.Image; + private starterIconsCursorObj: Phaser.GameObjects.Image; private valueLimitLabel: Phaser.GameObjects.Text; private startCursorObj: Phaser.GameObjects.NineSlice; - private starterValueLabels: Phaser.GameObjects.Text[]; - private shinyIcons: Phaser.GameObjects.Image[][]; - private hiddenAbilityIcons: Phaser.GameObjects.Image[]; - private classicWinIcons: Phaser.GameObjects.Image[]; - private candyUpgradeIcon: Phaser.GameObjects.Image[]; - private candyUpgradeOverlayIcon: Phaser.GameObjects.Image[]; - + // private starterValueLabels: Phaser.GameObjects.Text[]; + // private shinyIcons: Phaser.GameObjects.Image[][]; + // private hiddenAbilityIcons: Phaser.GameObjects.Image[]; + // private classicWinIcons: Phaser.GameObjects.Image[]; + // private candyUpgradeIcon: Phaser.GameObjects.Image[]; + // private candyUpgradeOverlayIcon: Phaser.GameObjects.Image[]; + // private iconAnimHandler: PokemonIconAnimHandler; //variables to keep track of the dynamically rendered list of instruction prompts for starter select private instructionRowX = 0; private instructionRowY = 0; - private instructionRowTextOffset = 12; + private instructionRowTextOffset = 9; + private filterInstructionRowX = 0; + private filterInstructionRowY = 0; - private starterSelectCallback: StarterSelectCallback; + private starterSelectCallback: StarterSelectCallback | null; private starterPreferences: StarterPreferences; @@ -288,8 +357,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); - const currentLanguage = i18next.resolvedLanguage; - const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)); + 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]; this.starterSelectContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); @@ -309,13 +378,146 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.shinyOverlay.setVisible(false); this.starterSelectContainer.add(this.shinyOverlay); - const starterContainerWindow = addWindow(this.scene, 141, 1, 178, 178); + const starterContainerWindow = addWindow(this.scene, speciesContainerX, filterBarHeight + 1, 175, 161); + const starterContainerBg = this.scene.add.image(speciesContainerX+1, filterBarHeight + 2, "starter_container_bg"); + starterContainerBg.setOrigin(0, 0); + this.starterSelectContainer.add(starterContainerBg); - this.starterSelectContainer.add(addWindow(this.scene, 107, 1, 34, 58)); - this.starterSelectContainer.add(addWindow(this.scene, 107, 59, 34, 91)); - this.starterSelectContainer.add(addWindow(this.scene, 107, 145, 34, 34, true)); + this.starterSelectContainer.add(addWindow(this.scene, teamWindowX, teamWindowY, teamWindowWidth, teamWindowHeight)); + this.starterSelectContainer.add(addWindow(this.scene, teamWindowX, teamWindowY + teamWindowHeight - 5, teamWindowWidth, teamWindowWidth, true)); this.starterSelectContainer.add(starterContainerWindow); + // Create and initialise filter bar + this.filterBarContainer = this.scene.add.container(0, 0); + this.filterBar = new FilterBar(this.scene, Math.min(speciesContainerX, teamWindowX), 1, 210, filterBarHeight); + + // gen filter + const genOptions: DropDownOption[] = [ + new DropDownOption(this.scene, 1, new DropDownLabel(i18next.t("starterSelectUiHandler:gen1"))), + new DropDownOption(this.scene, 2, new DropDownLabel(i18next.t("starterSelectUiHandler:gen2"))), + new DropDownOption(this.scene, 3, new DropDownLabel(i18next.t("starterSelectUiHandler:gen3"))), + new DropDownOption(this.scene, 4, new DropDownLabel(i18next.t("starterSelectUiHandler:gen4"))), + new DropDownOption(this.scene, 5, new DropDownLabel(i18next.t("starterSelectUiHandler:gen5"))), + new DropDownOption(this.scene, 6, new DropDownLabel(i18next.t("starterSelectUiHandler:gen6"))), + new DropDownOption(this.scene, 7, new DropDownLabel(i18next.t("starterSelectUiHandler:gen7"))), + new DropDownOption(this.scene, 8, new DropDownLabel(i18next.t("starterSelectUiHandler:gen8"))), + new DropDownOption(this.scene, 9, new DropDownLabel(i18next.t("starterSelectUiHandler:gen9"))), + ]; + const genDropDown: DropDown = new DropDown(this.scene, 0, 0, genOptions, this.updateStarters, DropDownType.HYBRID); + this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); + + // type filter + const typeKeys = Object.keys(Type).filter(v => isNaN(Number(v))); + const typeOptions: DropDownOption[] = []; + typeKeys.forEach((type, index) => { + if (index === 0 || index === 19) { + return; + } + const typeSprite = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("types")); + typeSprite.setScale(0.5); + typeSprite.setFrame(type.toLowerCase()); + typeOptions.push(new DropDownOption(this.scene, index, new DropDownLabel("", typeSprite))); + }); + this.filterBar.addFilter(DropDownColumn.TYPES, i18next.t("filterBar:typeFilter"), new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5)); + + // caught filter + const shiny1Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + shiny1Sprite.setOrigin(0.15, 0.2); + shiny1Sprite.setScale(0.6); + shiny1Sprite.setFrame(getVariantIcon(0)); + shiny1Sprite.setTint(getVariantTint(0)); + const shiny2Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + shiny2Sprite.setOrigin(0.15, 0.2); + shiny2Sprite.setScale(0.6); + shiny2Sprite.setFrame(getVariantIcon(1)); + shiny2Sprite.setTint(getVariantTint(1)); + const shiny3Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + shiny3Sprite.setOrigin(0.15, 0.2); + shiny3Sprite.setScale(0.6); + shiny3Sprite.setFrame(getVariantIcon(2)); + shiny3Sprite.setTint(getVariantTint(2)); + + const caughtOptions = [ + new DropDownOption(this.scene, "SHINY3", new DropDownLabel("", shiny3Sprite)), + new DropDownOption(this.scene, "SHINY2", new DropDownLabel("", shiny2Sprite)), + new DropDownOption(this.scene, "SHINY", new DropDownLabel("", shiny1Sprite)), + new DropDownOption(this.scene, "NORMAL", new DropDownLabel(i18next.t("filterBar:normal"))), + new DropDownOption(this.scene, "UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))) + ]; + + this.filterBar.addFilter(DropDownColumn.CAUGHT, i18next.t("filterBar:caughtFilter"), new DropDown(this.scene, 0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID)); + + // unlocks filter + const passiveLabels = [ + new DropDownLabel(i18next.t("filterBar:passive"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:passiveUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:passiveUnlockable"), undefined, DropDownState.UNLOCKABLE), + new DropDownLabel(i18next.t("filterBar:passiveLocked"), undefined, DropDownState.EXCLUDE), + ]; + + const costReductionLabels = [ + new DropDownLabel(i18next.t("filterBar:costReduction"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:costReductionUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockable"), undefined, DropDownState.UNLOCKABLE), + new DropDownLabel(i18next.t("filterBar:costReductionLocked"), undefined, DropDownState.EXCLUDE), + ]; + + const unlocksOptions = [ + new DropDownOption(this.scene, "PASSIVE", passiveLabels), + new DropDownOption(this.scene, "COST_REDUCTION", costReductionLabels), + ]; + + this.filterBar.addFilter(DropDownColumn.UNLOCKS, i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL)); + + // misc filter + const favoriteLabels = [ + new DropDownLabel(i18next.t("filterBar:favorite"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:isFavorite"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:notFavorite"), undefined, DropDownState.EXCLUDE), + ]; + const winLabels = [ + new DropDownLabel(i18next.t("filterBar:ribbon"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasWon"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:hasNotWon"), undefined, DropDownState.EXCLUDE), + ]; + const hiddenAbilityLabels = [ + new DropDownLabel(i18next.t("filterBar:hiddenAbility"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasHiddenAbility"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:noHiddenAbility"), undefined, DropDownState.EXCLUDE), + ]; + const eggLabels = [ + new DropDownLabel(i18next.t("filterBar:egg"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:eggPurchasable"), undefined, DropDownState.ON), + ]; + const pokerusLabels = [ + new DropDownLabel(i18next.t("filterBar:pokerus"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasPokerus"), undefined, DropDownState.ON), + ]; + const miscOptions = [ + new DropDownOption(this.scene, "FAVORITE", favoriteLabels), + new DropDownOption(this.scene, "WIN", winLabels), + new DropDownOption(this.scene, "HIDDEN_ABILITY", hiddenAbilityLabels), + new DropDownOption(this.scene, "EGG", eggLabels), + new DropDownOption(this.scene, "POKERUS", pokerusLabels), + ]; + this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(this.scene, 0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL)); + + // sort filter + const sortOptions = [ + 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); + + this.starterSelectContainer.add(this.filterBarContainer); + + // Offset the generation filter dropdown to avoid covering the filtered pokemon + this.filterBar.offsetHybridFilters(); + if (!this.scene.uiTheme) { starterContainerWindow.setVisible(false); } @@ -374,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); @@ -391,27 +605,32 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMoveBgs = []; this.pokemonEggMoveLabels = []; - this.genOptionsText = addTextObject(this.scene, 124, 7, "", TextStyle.WINDOW, { fontSize: 72, lineSpacing: 39, align: "center" }); - this.genOptionsText.setShadowOffset(4.5, 4.5); - this.genOptionsText.setOrigin(0.5, 0); - this.starterSelectContainer.add(this.genOptionsText); + this.valueLimitLabel = addTextObject(this.scene, teamWindowX+17, 150, "0/10", TextStyle.TOOLTIP_CONTENT); + this.valueLimitLabel.setOrigin(0.5, 0); + this.starterSelectContainer.add(this.valueLimitLabel); - this.updateGenOptions(); + const startLabel = addTextObject(this.scene, teamWindowX+17, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); + startLabel.setOrigin(0.5, 0); + this.starterSelectContainer.add(startLabel); - this.starterSelectGenIconContainers = new Array(gens.length).fill(null).map((_, i) => { - const container = this.scene.add.container(151, 9); - if (i) { - container.setVisible(false); - } - this.starterSelectContainer.add(container); - return container; - }); + this.startCursorObj = this.scene.add.nineslice(teamWindowX+4, 160, "select_cursor", undefined, 26, 15, 6, 6, 6, 6); + this.startCursorObj.setVisible(false); + this.startCursorObj.setOrigin(0, 0); + this.starterSelectContainer.add(this.startCursorObj); + + const starterSpecies: Species[] = []; + + const starterBoxContainer = this.scene.add.container(speciesContainerX + 6, 9); //115 + + this.starterSelectScrollBar = new ScrollBar(this.scene, 161, 12, 0); + + starterBoxContainer.add(this.starterSelectScrollBar); this.pokerusCursorObjs = new Array(3).fill(null).map(() => { const cursorObj = this.scene.add.image(0, 0, "select_cursor_pokerus"); cursorObj.setVisible(false); cursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(cursorObj); + starterBoxContainer.add(cursorObj); return cursorObj; }); @@ -419,66 +638,39 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const cursorObj = this.scene.add.image(0, 0, "select_cursor_highlight"); cursorObj.setVisible(false); cursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(cursorObj); + starterBoxContainer.add(cursorObj); return cursorObj; }); this.cursorObj = this.scene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.cursorObj); + this.starterIconsCursorObj = this.scene.add.image(289, 64, "select_gen_cursor"); + this.starterIconsCursorObj.setName("starter-icons-cursor"); + this.starterIconsCursorObj.setVisible(false); + this.starterIconsCursorObj.setOrigin(0, 0); + this.starterSelectContainer.add(this.starterIconsCursorObj); - this.genCursorHighlightObj = this.scene.add.image(111, 5, "select_gen_cursor_highlight"); - this.genCursorHighlightObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.genCursorHighlightObj); + starterBoxContainer.add(this.cursorObj); - this.genCursorObj = this.scene.add.image(111, 5, "select_gen_cursor"); - this.genCursorObj.setVisible(false); - this.genCursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.genCursorObj); - - this.valueLimitLabel = addTextObject(this.scene, 124, 150, "0/10", TextStyle.TOOLTIP_CONTENT); - this.valueLimitLabel.setOrigin(0.5, 0); - this.starterSelectContainer.add(this.valueLimitLabel); - - const startLabel = addTextObject(this.scene, 124, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); - startLabel.setOrigin(0.5, 0); - this.starterSelectContainer.add(startLabel); - - this.startCursorObj = this.scene.add.nineslice(111, 160, "select_cursor", null, 26, 15, 6, 6, 6, 6); - this.startCursorObj.setVisible(false); - this.startCursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.startCursorObj); - - const starterSpecies: Species[] = []; - - for (let g = 0; g < this.starterSelectGenIconContainers.length; g++) { - let s = 0; - this.genSpecies.push([]); - - for (const species of allSpecies) { - if (!speciesStarters.hasOwnProperty(species.speciesId) || species.generation !== g + 1 || !species.isObtainable()) { - continue; - } - starterSpecies.push(species.speciesId); - this.speciesLoaded.set(species.speciesId, false); - this.genSpecies[g].push(species); - const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); - const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - const position = calcIconPosition(s); - const icon = this.scene.add.sprite(position.x - 2, position.y + 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); - icon.setScale(0.5); - icon.setOrigin(0, 0); - icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); - this.checkIconId(icon, species, defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); - icon.setTint(0); - this.starterSelectGenIconContainers[g].add(icon); - this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE); - s++; + for (const species of allSpecies) { + if (!speciesStarters.hasOwnProperty(species.speciesId) || !species.isObtainable()) { + continue; } + + starterSpecies.push(species.speciesId); + this.speciesLoaded.set(species.speciesId, false); + this.allSpecies.push(species); + + const starterContainer = new StarterContainer(this.scene, species).setVisible(false); + this.iconAnimHandler.addOrUpdate(starterContainer.icon, PokemonIconAnimMode.NONE); + this.starterContainers.push(starterContainer); + starterBoxContainer.add(starterContainer); } + this.starterSelectContainer.add(starterBoxContainer); + this.starterIcons = new Array(6).fill(null).map((_, i) => { - const icon = this.scene.add.sprite(113, 63 + 13 * i, "pokemon_icons_0"); + const icon = this.scene.add.sprite(teamWindowX + 7, calcStarterIconY(i), "pokemon_icons_0"); icon.setScale(0.5); icon.setOrigin(0, 0); icon.setFrame("unknown"); @@ -487,85 +679,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return icon; }); - this.starterValueLabels = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = addTextObject(this.scene, position.x + 152, position.y + 11, "0", TextStyle.WINDOW, { fontSize: "32px" }); - ret.setShadowOffset(2, 2); - ret.setOrigin(0, 0); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - - const getShinyStar = (i: integer, v: integer): Phaser.GameObjects.Image => { - const position = calcIconPosition(i); - const ret = this.scene.add.image((position.x - v * 3) + 163, position.y + 11, "shiny_star_small"); - ret.setOrigin(0, 0); - ret.setScale(0.5); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }; - - this.shinyIcons = new Array(81).fill(null).map((_, i) => { - return new Array(3).fill(null).map((_, v) => getShinyStar(i, v)); - }); - - this.hiddenAbilityIcons = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = this.scene.add.image(position.x + 163, position.y + 16, "ha_capsule"); - ret.setOrigin(0, 0); - ret.setScale(0.5); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - - this.classicWinIcons = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = this.scene.add.image(position.x + 153, position.y + 21, "champion_ribbon"); - ret.setOrigin(0, 0); - ret.setScale(0.5); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - - this.candyUpgradeIcon = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = this.scene.add.image(position.x + 163, position.y + 21, "candy"); - ret.setOrigin(0, 0); - ret.setScale(0.25); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - - this.candyUpgradeOverlayIcon = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = this.scene.add.image(position.x + 163, position.y + 21, "candy_overlay"); - ret.setOrigin(0, 0); - ret.setScale(0.25); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - this.pokemonSprite = this.scene.add.sprite(53, 63, "pkmn__sub"); this.pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); this.starterSelectContainer.add(this.pokemonSprite); - this.type1Icon = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.type1Icon = this.scene.add.sprite(8, 98, Utils.getLocalizedSpriteKey("types")); this.type1Icon.setScale(0.5); this.type1Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type1Icon); - this.type2Icon = this.scene.add.sprite(26, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.type2Icon = this.scene.add.sprite(26, 98, Utils.getLocalizedSpriteKey("types")); this.type2Icon.setScale(0.5); this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); - this.pokemonLuckLabelText = addTextObject(this.scene, 8, 89, "Luck:", TextStyle.WINDOW_ALT, { fontSize: "56px" }); + this.pokemonLuckLabelText = addTextObject(this.scene, 8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { fontSize: "56px" }); this.pokemonLuckLabelText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckLabelText); @@ -620,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); @@ -736,8 +864,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.variantLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleVariant"), TextStyle.PARTY, { fontSize: instructionTextSize }); this.variantLabel.setName("text-variant-label"); + this.goFilterIconElement = new Phaser.GameObjects.Sprite(this.scene, this.filterInstructionRowX, this.filterInstructionRowY, "keyboard", "C.png"); + this.goFilterIconElement.setName("sprite-goFilter-icon-element"); + this.goFilterIconElement.setScale(0.675); + this.goFilterIconElement.setOrigin(0.0, 0.0); + this.goFilterLabel = addTextObject(this.scene, this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY, i18next.t("starterSelectUiHandler:goFilter"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.goFilterLabel.setName("text-goFilter-label"); + this.hideInstructions(); + this.filterInstructionsContainer = this.scene.add.container(50, 5); + this.filterInstructionsContainer.setVisible(true); + this.starterSelectContainer.add(this.filterInstructionsContainer); + this.starterSelectMessageBoxContainer = this.scene.add.container(0, this.scene.game.canvas.height / 6); this.starterSelectMessageBoxContainer.setVisible(false); this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); @@ -750,42 +889,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.message.setOrigin(0, 0); this.starterSelectMessageBoxContainer.add(this.message); - const date = new Date(); - date.setUTCHours(0, 0, 0, 0); - - this.scene.executeWithSeedOffset(() => { - for (let c = 0; c < 3; c++) { - let randomSpeciesId: Species; - let species: PokemonSpecies; - let pokerusCursor: integer; - - const generateSpecies = () => { - randomSpeciesId = Utils.randSeedItem(starterSpecies); - species = getPokemonSpecies(randomSpeciesId); - pokerusCursor = this.genSpecies[species.generation - 1].indexOf(species); - }; - - let dupe = false; - - do { - dupe = false; - - generateSpecies(); - - for (let pc = 0; pc < c; pc++) { - if (this.pokerusGens[pc] === species.generation -1 && this.pokerusCursors[pc] === pokerusCursor) { - dupe = true; - break; - } - } - } while (dupe); - - this.pokerusGens.push(species.generation - 1); - this.pokerusCursors.push(pokerusCursor); - this.pokerusCursorObjs[c].setPosition(150 + 18 * (pokerusCursor % 9), 10 + 18 * Math.floor(pokerusCursor / 9)); - } - }, 0, date.getTime().toString()); - this.statsContainer = new StatsContainer(this.scene, 6, 16); this.scene.add.existing(this.statsContainer); @@ -803,6 +906,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { y: this.scene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, }); this.starterSelectContainer.add(this.moveInfoOverlay); + this.starterSelectContainer.bringToTop(this.filterBarContainer); this.scene.eventTarget.addEventListener(BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED, (e) => this.onCandyUpgradeDisplayChanged(e)); @@ -815,34 +919,38 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterPreferences = StarterPrefs.load(); } this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers + this.pokerusSpecies = getPokerusStarters(this.scene); + if (args.length >= 1 && args[0] instanceof Function) { super.show(args); this.starterSelectCallback = args[0] as StarterSelectCallback; this.starterSelectContainer.setVisible(true); - this.setCursor(0); - this.setGenMode(false); - this.setCursor(0); - this.setGenMode(true); + this.allSpecies.forEach((species, s) => { + const icon = this.starterContainers[s].icon; + const dexEntry = this.scene.gameData.dexData[species.speciesId]; + + // Initialize the StarterAttributes for this species + this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); + + if (dexEntry.caughtAttr) { + icon.clearTint(); + } else if (dexEntry.seenAttr) { + icon.setTint(0x808080); + } + + this.setUpgradeAnimation(icon, species); + }); + + this.resetFilters(); + this.updateStarters(); + + this.setFilterMode(false); + this.filterBarCursor = 0; this.setCursor(0); this.tryUpdateValue(0); - for (let g = 0; g < this.genSpecies.length; g++) { - this.genSpecies[g].forEach((species, s) => { - const icon = this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite; - const dexEntry = this.scene.gameData.dexData[species.speciesId]; - - if (dexEntry.caughtAttr) { - icon.clearTint(); - } else if (dexEntry.seenAttr) { - icon.setTint(0x808080); - } - - this.setUpgradeAnimation(icon, species); - }); - } - handleTutorial(this.scene, Tutorial.Starter_Select); return true; @@ -851,6 +959,110 @@ 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 + */ + resetFilters() : void { + const caughtDropDown: DropDown = this.filterBar.getFilter(DropDownColumn.CAUGHT); + + this.filterBar.setValsToDefault(); + + // initial setting, in caught filter, select the options excluding the uncaught option + for (let i = 0; i < caughtDropDown.options.length; i++) { + // if the option is not "ALL" or "UNCAUGHT", toggle it + if (caughtDropDown.options[i].val !== "ALL" && caughtDropDown.options[i].val !== "UNCAUGHT") { + caughtDropDown.toggleOptionState(i); + } + } + } + showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); @@ -903,11 +1115,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const starterData = this.scene.gameData.starterData[speciesId]; return starterData.candyCount >= getValueReductionCandyCounts(speciesStarters[speciesId])[starterData.valueReduction] - && starterData.valueReduction < 2; + && starterData.valueReduction < valueReductionMax; } /** - * Determines if an same species egg can be baught for the given species ID + * Determines if an same species egg can be bought for the given species ID * @param speciesId The ID of the species to check the value reduction of * @returns true if the user has enough candies */ @@ -931,8 +1143,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return; } - const position = calcSpritePosition(this.genSpecies[species.generation - 1].indexOf(species)); - icon.y = position.y; + icon.y = 2; const tweenChain: Phaser.Types.Tweens.TweenChainBuilderConfig = { targets: icon, @@ -943,63 +1154,64 @@ export default class StarterSelectUiHandler extends MessageUiHandler { tweens: [ { targets: icon, - y: position.y - 5, + y: 2 - 5, duration: Utils.fixedInt(125), ease: "Cubic.easeOut", yoyo: true }, { targets: icon, - y: position.y - 3, + y: 2 - 3, duration: Utils.fixedInt(150), ease: "Cubic.easeOut", yoyo: true } ],}; - const passiveAvailable = this.isPassiveAvailable(species.speciesId); - // 'Only Passives' mode + const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); + const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); + const isSameSpeciesEggAvailable = this.isSameSpeciesEggAvailable(species.speciesId); + + // 'Passives Only' mode if (this.scene.candyUpgradeNotification === 1) { - if (passiveAvailable) { + if (isPassiveAvailable) { this.scene.tweens.chain(tweenChain).paused = startPaused; } // 'On' mode } else if (this.scene.candyUpgradeNotification === 2) { - if (passiveAvailable || this.isValueReductionAvailable(species.speciesId)) { + if (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable) { this.scene.tweens.chain(tweenChain).paused = startPaused; } } } /** - * Sets the visibility of a Candy Upgrade Icon given an index - * @param index The UI index of the icon within this generation container + * Sets the visibility of a Candy Upgrade Icon */ - setUpgradeIcon(index: number): void { - const species = this.genSpecies[this.getGenCursorWithScroll()][index]; + setUpgradeIcon(starter: StarterContainer): void { + const species = starter.species; const slotVisible = !!species?.speciesId; - if (!species // No Pokemon exists at that UI index - || this.scene.candyUpgradeNotification === 0 // Notification setting is 'Off' - || species.speciesId !== species.getRootSpeciesId(false)) { // Pokemon is not the base evolution and can't use candy - // Set all icons as hidden and exit early - this.candyUpgradeIcon[index].setVisible(false); - this.candyUpgradeOverlayIcon[index].setVisible(false); - + if (!species || this.scene.candyUpgradeNotification === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + starter.candyUpgradeIcon.setVisible(false); + starter.candyUpgradeOverlayIcon.setVisible(false); return; } - const passiveAvailable = this.isPassiveAvailable(species.speciesId); - // 'Only Passive Unlocks' mode + const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); + const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); + const isSameSpeciesEggAvailable = this.isSameSpeciesEggAvailable(species.speciesId); + + // 'Passive Only' mode if (this.scene.candyUpgradeNotification === 1) { - this.candyUpgradeIcon[index].setVisible(slotVisible && passiveAvailable); - this.candyUpgradeOverlayIcon[index].setVisible(slotVisible && this.candyUpgradeIcon[index].visible); + starter.candyUpgradeIcon.setVisible(slotVisible && isPassiveAvailable); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); // 'On' mode } else if (this.scene.candyUpgradeNotification === 2) { - this.candyUpgradeIcon[index].setVisible( - slotVisible && ( passiveAvailable || this.isValueReductionAvailable(species.speciesId))); - this.candyUpgradeOverlayIcon[index].setVisible(slotVisible && this.candyUpgradeIcon[index].visible); + starter.candyUpgradeIcon.setVisible( + slotVisible && ( isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable )); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); } } @@ -1015,21 +1227,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Loop through all visible candy icons when set to 'Icon' mode if (this.scene.candyUpgradeDisplay === 0) { - this.genSpecies[this.getGenCursorWithScroll()].forEach((_species, s) => { - this.setUpgradeIcon(s); + this.filteredStarterContainers.forEach((starter) => { + this.setUpgradeIcon(starter); }); return; } // Loop through all animations when set to 'Animation' mode - for (let g = 0; g < this.genSpecies.length; g++) { - this.genSpecies[g].forEach((species, s) => { - const icon = this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite; + this.filteredStarterContainers.forEach((starter, s) => { + const icon = this.filteredStarterContainers[s].icon; - this.setUpgradeAnimation(icon, species); - }); - } + this.setUpgradeAnimation(icon, starter.species); + }); } processInput(button: Button): boolean { @@ -1037,6 +1247,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } + const maxColumns = 9; + const maxRows = 9; + const numberOfStarters = this.filteredStarterContainers.length; + const numOfRows = Math.ceil(numberOfStarters / maxColumns); + const currentRow = Math.floor(this.cursor / maxColumns); + const onScreenFirstIndex = this.scrollCursor * maxColumns; // this is first starter index on the screen + const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns - 1); // this is the last starter index on the screen + const onScreenNumberOfStarters = onScreenLastIndex - onScreenFirstIndex + 1; + const onScreenNumberOfRows = Math.ceil(onScreenNumberOfStarters / maxColumns); + const onScreenCurrentRow = Math.floor((this.cursor - onScreenFirstIndex) / maxColumns); + const ui = this.getUi(); let success = false; @@ -1049,25 +1270,41 @@ export default class StarterSelectUiHandler extends MessageUiHandler { error = true; } } else if (button === Button.CANCEL) { - if (this.statsMode) { + if (this.filterMode && this.filterBar.openDropDown) { + // CANCEL with a filter menu open > close it + this.filterBar.toggleDropDown(this.filterBarCursor); + + // if there are possible starters go the first one of the list + if (numberOfStarters > 0) { + this.setFilterMode(false); + this.scrollCursor = 0; + this.updateScroll(); + this.setCursor(0); + } + success = true; + + } else if (this.statsMode) { this.toggleStatsMode(false); success = true; - } else if (this.starterCursors.length) { - this.popStarter(); + } else if (this.starterSpecies.length) { + this.popStarter(this.starterSpecies.length - 1); success = true; this.updateInstructions(); } else { - this.blockInput = true; - this.scene.clearPhaseQueue(); - if (this.scene.gameMode.isChallenge) { - this.scene.pushPhase(new SelectChallengePhase(this.scene)); - } else { - this.scene.pushPhase(new TitlePhase(this.scene)); - } - this.scene.getCurrentPhase().end(); + this.tryExit(); success = true; } - } else if (this.startCursorObj.visible) { + } else if (button === Button.STATS) { + // if stats button is pressed, go to filter directly + if (!this.filterMode) { + this.startCursorObj.setVisible(false); + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.filterBarCursor = 0; + this.setFilterMode(true); + this.filterBar.toggleDropDown(this.filterBarCursor); + } + } else if (this.startCursorObj.visible) { // this checks to see if the start button is selected switch (button) { case Button.ACTION: if (this.tryStart(true)) { @@ -1078,106 +1315,164 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; case Button.UP: this.startCursorObj.setVisible(false); - this.setGenMode(true); + if (this.starterSpecies.length > 0) { + this.starterIconsCursorIndex = this.starterSpecies.length - 1; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + // up from start button with no Pokemon in the team > go to filter + this.startCursorObj.setVisible(false); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); + this.setFilterMode(true); + } + success = true; + break; + case Button.DOWN: + this.startCursorObj.setVisible(false); + if (this.starterSpecies.length > 0) { + this.starterIconsCursorIndex = 0; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + // down from start button with no Pokemon in the team > go to filter + this.startCursorObj.setVisible(false); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); + this.setFilterMode(true); + } success = true; break; case Button.LEFT: this.startCursorObj.setVisible(false); - this.setGenMode(false); - this.setCursor(this.cursor + 8); + this.cursorObj.setVisible(true); + success = this.setCursor(onScreenFirstIndex + (onScreenNumberOfRows-1) * 9 + 8); // set last column success = true; break; case Button.RIGHT: this.startCursorObj.setVisible(false); - this.setGenMode(false); + this.cursorObj.setVisible(true); + success = this.setCursor(onScreenFirstIndex + (onScreenNumberOfRows-1) * 9); // set first column success = true; break; } - } else if (this.genMode) { + } else if (this.filterMode) { switch (button) { - case Button.UP: - if (this.genCursor) { - success = this.setCursor(this.genCursor - 1); + case Button.LEFT: + if (this.filterBarCursor > 0) { + success = this.setCursor(this.filterBarCursor - 1); + } else { + success = this.setCursor(this.filterBar.numFilters - 1); } break; - case Button.DOWN: - if (this.genCursor < 2) { - success = this.setCursor(this.genCursor + 1); + case Button.RIGHT: + if (this.filterBarCursor < this.filterBar.numFilters - 1) { + success = this.setCursor(this.filterBarCursor + 1); } else { - this.startCursorObj.setVisible(true); - this.setGenMode(true); + success = this.setCursor(0); + } + break; + case Button.UP: + if (this.filterBar.openDropDown) { + success = this.filterBar.decDropDownCursor(); + // else if there is filtered starters + } else if (numberOfStarters > 0) { + // UP from filter bar to bottom of Pokemon list + this.setFilterMode(false); + this.scrollCursor = Math.max(0, numOfRows - 9); + this.updateScroll(); + const proportion = (this.filterBarCursor + 0.5) / this.filterBar.numFilters; + const targetCol = Math.min(8, Math.floor(proportion * 11)); + if (numberOfStarters % 9 > targetCol) { + this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + } else { + this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); + } success = true; } break; - case Button.LEFT: - success = this.setGenMode(false); - this.setCursor(this.cursor + 8); + case Button.DOWN: + if (this.filterBar.openDropDown) { + success = this.filterBar.incDropDownCursor(); + } else if (numberOfStarters > 0) { + // DOWN from filter bar to top of Pokemon list + this.setFilterMode(false); + this.scrollCursor = 0; + this.updateScroll(); + const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); + const targetCol = Math.min(8, Math.floor(proportion * 11)); + this.setCursor(Math.min(targetCol, numberOfStarters)); + success = true; + } break; - case Button.RIGHT: - success = this.setGenMode(false); + case Button.ACTION: + if (!this.filterBar.openDropDown) { + this.filterBar.toggleDropDown(this.filterBarCursor); + } else { + this.filterBar.toggleOptionState(); + } + success = true; break; } } else { + + let starterContainer; + const starterData = this.scene.gameData.starterData[this.lastSpecies.speciesId]; + // prepare persistent starter data to store changes + let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; + + // this gets the correct pokemon cursor depending on whether you're in the starter screen or the party icons + if (!this.starterIconsCursorObj.visible) { + starterContainer = this.filteredStarterContainers[this.cursor]; + } else { + // if species is in filtered starters, get the starter container from the filtered starters, it can be undefined if the species is not in the filtered starters + starterContainer = this.filteredStarterContainers[this.filteredStarterContainers.findIndex(container => container.species === this.lastSpecies)]; + } + if (button === Button.ACTION) { if (!this.speciesStarterDexEntry?.caughtAttr) { error = true; - } else if (this.starterCursors.length < 6) { - const options = [ - { - label: i18next.t("starterSelectUiHandler:addToParty"), + } else if (this.starterSpecies.length <= 6) { // checks to see if the party has 6 or fewer pokemon + const ui = this.getUi(); + let options: any[] = []; // TODO: add proper type + + const [isDupe, removeIndex]: [boolean, number] = this.isInParty(this.lastSpecies); // checks to see if the pokemon is a duplicate; if it is, returns the index that will be removed + + const isPartyValid = this.isPartyValid(); + const isValidForChallenge = new Utils.BooleanHolder(true); + + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.lastSpecies, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)), isPartyValid); + + const currentPartyValue = this.starterSpecies.map(s => s.generation).reduce((total: number, gen: number, i: number) => total += this.scene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); + const newCost = this.scene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId); + if (!isDupe && isValidForChallenge.value && currentPartyValue + newCost <= this.getValueLimit() && this.starterSpecies.length < 6) { // this checks to make sure the pokemon doesn't exist in your party, it's valid for the challenge and that it won't go over the cost limit; if it meets all these criteria it will add it to your party + options = [ + { + label: i18next.t("starterSelectUiHandler:addToParty"), + handler: () => { + ui.setMode(Mode.STARTER_SELECT); + const isOverValueLimit = this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId), true); + if (!isDupe && isValidForChallenge.value && isOverValueLimit) { + const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; + cursorObj.setVisible(true); + cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); + this.addToParty(this.lastSpecies, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset); + ui.playSelect(); + } else { + ui.playError(); // this should be redundant as there is now a trigger for when a pokemon can't be added to party + } + return true; + }, + overrideSound: true + }]; + } else if (isDupe) { // if it already exists in your party, it will give you the option to remove from your party + options = [{ + label: i18next.t("starterSelectUiHandler:removeFromParty"), handler: () => { + this.popStarter(removeIndex); ui.setMode(Mode.STARTER_SELECT); - let isDupe = false; - for (let s = 0; s < this.starterCursors.length; s++) { - if (this.starterGens[s] === this.getGenCursorWithScroll() && this.starterCursors[s] === this.cursor) { - isDupe = true; - break; - } - } - const species = this.genSpecies[this.getGenCursorWithScroll()][this.cursor]; - - const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), this.starterGens.length); - - if (!isDupe && isValidForChallenge.value && this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(species.speciesId))) { - const cursorObj = this.starterCursorObjs[this.starterCursors.length]; - cursorObj.setVisible(true); - cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); - const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor); - this.starterIcons[this.starterCursors.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); - this.starterIcons[this.starterCursors.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); - this.checkIconId(this.starterIcons[this.starterCursors.length], species, props.female, props.formIndex, props.shiny, props.variant); - this.starterGens.push(this.getGenCursorWithScroll()); - this.starterCursors.push(this.cursor); - this.starterAttr.push(this.dexAttrCursor); - this.starterAbilityIndexes.push(this.abilityCursor); - this.starterNatures.push(this.natureCursor as unknown as Nature); - this.starterMovesets.push(this.starterMoveset.slice(0) as StarterMoveset); - if (this.speciesLoaded.get(species.speciesId)) { - getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(this.scene); - } - if (this.starterCursors.length === 6 || this.value === this.getValueLimit()) { - this.tryStart(); - } - this.updateInstructions(); - - /** - * If the user can't select a pokemon anymore, - * go to start button. - */ - if (!this.canAddParty) { - this.startCursorObj.setVisible(true); - this.setGenMode(true); - } - - ui.playSelect(); - } else { - ui.playError(); - } return true; - }, - overrideSound: true - }, + } + }]; + } + + options.push( // this shows the IVs for the pokemon { label: i18next.t("starterSelectUiHandler:toggleIVs"), handler: () => { @@ -1185,10 +1480,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); return true; } - } - ]; - if (this.speciesStarterMoves.length > 1) { + }); + if (this.speciesStarterMoves.length > 1) { // this lets you change the pokemon moves const showSwapOptions = (moveset: StarterMoveset) => { + + this.blockInput = true; + ui.setMode(Mode.STARTER_SELECT).then(() => { ui.showText(i18next.t("starterSelectUiHandler:selectMoveSwapOut"), null, () => { this.moveInfoOverlay.show(allMoves[moveset[0]]); @@ -1198,6 +1495,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const option: OptionSelectItem = { label: allMoves[m].name, handler: () => { + this.blockInput = true; ui.setMode(Mode.STARTER_SELECT).then(() => { ui.showText(`${i18next.t("starterSelectUiHandler:selectMoveSwapWith")} ${allMoves[m].name}.`, null, () => { const possibleMoves = this.speciesStarterMoves.filter((sm: Moves) => sm !== m); @@ -1210,7 +1508,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { label: allMoves[sm].name, handler: () => { this.switchMoveHandler(i, sm, m); - showSwapOptions(this.starterMoveset); + showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? return true; }, onHover: () => { @@ -1221,7 +1519,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }).concat({ label: i18next.t("menu:cancel"), handler: () => { - showSwapOptions(this.starterMoveset); + showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? return true; }, onHover: () => { @@ -1232,6 +1530,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { maxOptions: 8, yOffset: 19 }); + this.blockInput = false; }); }); return true; @@ -1257,25 +1556,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { maxOptions: 8, yOffset: 19 }); + this.blockInput = false; }); }); }; options.push({ label: i18next.t("starterSelectUiHandler:manageMoves"), handler: () => { - showSwapOptions(this.starterMoveset); + showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? return true; } }); } - const starterData = this.scene.gameData.starterData[this.lastSpecies.speciesId]; - let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; if (this.canCycleNature) { // if we could cycle natures, enable the improved nature menu const showNatureOptions = () => { + + this.blockInput = true; + ui.setMode(Mode.STARTER_SELECT).then(() => { ui.showText(i18next.t("starterSelectUiHandler:selectNature"), null, () => { - const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr); + const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: natures.map((n: Nature, i: number) => { const option: OptionSelectItem = { @@ -1283,14 +1584,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { // update default nature in starter save data if (!starterAttributes) { - starterAttributes= - this.starterPreferences[this.lastSpecies.speciesId] = {}; + starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; } starterAttributes.nature = n as unknown as integer; this.clearText(); ui.setMode(Mode.STARTER_SELECT); // set nature for starter this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, n, undefined); + this.blockInput = false; return true; } }; @@ -1300,6 +1601,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { this.clearText(); ui.setMode(Mode.STARTER_SELECT); + this.blockInput = false; return true; } }), @@ -1319,7 +1621,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } const candyCount = starterData.candyCount; const passiveAttr = starterData.passiveAttr; - if (passiveAttr & PassiveAttr.UNLOCKED) { + if (passiveAttr & PassiveAttr.UNLOCKED) { // this is for enabling and disabling the passive if (!(passiveAttr & PassiveAttr.ENABLED)) { options.push({ label: i18next.t("starterSelectUiHandler:enablePassive"), @@ -1342,8 +1644,64 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); } } - const showUseCandies = () => { - const options = []; + // if container.favorite is false, show the favorite option + const isFavorite = starterAttributes?.favorite ?? false; + if (!isFavorite) { + options.push({ + label: i18next.t("starterSelectUiHandler:addToFavorites"), + handler: () => { + starterAttributes.favorite = true; + // if the starter container not exists, it means the species is not in the filtered starters + if (starterContainer) { + starterContainer.favoriteIcon.setVisible(starterAttributes.favorite); + } + ui.setMode(Mode.STARTER_SELECT); + return true; + } + }); + } else { + options.push({ + label: i18next.t("starterSelectUiHandler:removeFromFavorites"), + handler: () => { + starterAttributes.favorite = false; + // if the starter container not exists, it means the species is not in the filtered starters + if (starterContainer) { + starterContainer.favoriteIcon.setVisible(starterAttributes.favorite); + } + ui.setMode(Mode.STARTER_SELECT); + return true; + } + }); + } + options.push({ + label: i18next.t("menu:rename"), + handler: () => { + ui.playSelect(); + let nickname = starterAttributes.nickname ? String(starterAttributes.nickname) : ""; + nickname = decodeURIComponent(escape(atob(nickname))); + ui.setModeWithoutClear(Mode.RENAME_POKEMON, { + buttonActions: [ + (sanitizedName: string) => { + ui.playSelect(); + starterAttributes.nickname = sanitizedName; + const name = decodeURIComponent(escape(atob(starterAttributes.nickname))); + if (name.length > 0) { + this.pokemonNameText.setText(name); + } else { + this.pokemonNameText.setText(this.lastSpecies.name); + } + ui.setMode(Mode.STARTER_SELECT); + }, + () => { + ui.setMode(Mode.STARTER_SELECT); + } + ] + }, nickname); + return true; + } + }); + const showUseCandies = () => { // this lets you use your candies + const options: any[] = []; // TODO: add proper type if (!(passiveAttr & PassiveAttr.UNLOCKED)) { const passiveCost = getPassiveCandyCount(speciesStarters[this.lastSpecies.speciesId]); options.push({ @@ -1363,15 +1721,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined); - // Update the candy upgrade display - if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(this.cursor); - } - if (this.isUpgradeAnimationEnabled()) { - const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; - this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); - } + // if starterContainer exists, update the passive background + if (starterContainer) { + // Update the candy upgrade display + if (this.isUpgradeIconEnabled() ) { + this.setUpgradeIcon(starterContainer); + } + if (this.isUpgradeAnimationEnabled()) { + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); + } + starterContainer.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr); + } return true; } return false; @@ -1381,7 +1742,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); } const valueReduction = starterData.valueReduction; - if (valueReduction < 2) { + if (valueReduction < valueReductionMax) { const reductionCost = getValueReductionCandyCounts(speciesStarters[this.lastSpecies.speciesId])[valueReduction]; options.push({ label: `x${reductionCost} ${i18next.t("starterSelectUiHandler:reduceCost")}`, @@ -1397,22 +1758,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return this.scene.reset(true); } }); - this.updateStarterValueLabel(this.cursor); this.tryUpdateValue(0); ui.setMode(Mode.STARTER_SELECT); - this.scene.playSound("buy"); + this.scene.playSound("se/buy"); - // If the notification setting is set to 'On', update the candy upgrade display - if (this.scene.candyUpgradeNotification === 2) { - if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(this.cursor); - } - if (this.isUpgradeAnimationEnabled()) { - const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; - this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); + // if starterContainer exists, update the value reduction background + if (starterContainer) { + this.updateStarterValueLabel(starterContainer); + + // If the notification setting is set to 'On', update the candy upgrade display + if (this.scene.candyUpgradeNotification === 2) { + if (this.isUpgradeIconEnabled() ) { + this.setUpgradeIcon(starterContainer); + } + if (this.isUpgradeAnimationEnabled()) { + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); + } } } - return true; } return false; @@ -1422,48 +1785,35 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); } - // Same species egg menu option. Only visible if passive is bought - if (passiveAttr & PassiveAttr.UNLOCKED) { - const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarters[this.lastSpecies.speciesId]); - options.push({ - label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`, - handler: () => { - if (this.scene.gameData.eggs.length < 99 && (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost)) { - if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { - starterData.candyCount -= sameSpeciesEggCost; - } - this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - - const egg = new Egg({scene: this.scene, species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG}); - egg.addEggToGameData(this.scene); - - this.scene.gameData.saveSystem().then(success => { - if (!success) { - return this.scene.reset(true); - } - }); - ui.setMode(Mode.STARTER_SELECT); - this.scene.playSound("buy"); - - // If the notification setting is set to 'On', update the candy upgrade display - // if (this.scene.candyUpgradeNotification === 2) { - // if (this.isUpgradeIconEnabled() ) { - // this.setUpgradeIcon(this.cursor); - // } - // if (this.isUpgradeAnimationEnabled()) { - // const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; - // this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); - // } - // } - - return true; + // Same species egg menu option. + const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarters[this.lastSpecies.speciesId]); + options.push({ + label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`, + handler: () => { + if (this.scene.gameData.eggs.length < 99 && (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost)) { + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= sameSpeciesEggCost; } - return false; - }, - item: "candy", - itemArgs: starterColors[this.lastSpecies.speciesId] - }); - } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + + const egg = new Egg({scene: this.scene, species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG}); + egg.addEggToGameData(this.scene); + + this.scene.gameData.saveSystem().then(success => { + if (!success) { + return this.scene.reset(true); + } + }); + ui.setMode(Mode.STARTER_SELECT); + this.scene.playSound("se/buy"); + + return true; + } + return false; + }, + item: "candy", + itemArgs: starterColors[this.lastSpecies.speciesId] + }); options.push({ label: i18next.t("menu:cancel"), handler: () => { @@ -1499,29 +1849,26 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; } } else { - const genStarters = this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAll().length; - const rows = Math.ceil(genStarters / 9); - const row = Math.floor(this.cursor / 9); - const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); - // prepare persistent starter data to store changes - let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; - if (!starterAttributes) { - starterAttributes = - this.starterPreferences[this.lastSpecies.speciesId] = {}; - } + const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); switch (button) { case Button.CYCLE_SHINY: if (this.canCycleShiny) { - const newVariant = props.variant; - this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined); - if (this.dexAttrCursor & DexAttr.SHINY) { - this.scene.playSound("sparkle"); + 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); this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); this.pokemonShinyIcon.setTint(tint); this.pokemonShinyIcon.setVisible(true); } else { + this.setSpeciesDetails(this.lastSpecies, false, undefined, undefined, 0, undefined, undefined); this.pokemonShinyIcon.setVisible(false); success = true; } @@ -1533,7 +1880,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let newFormIndex = props.formIndex; do { newFormIndex = (newFormIndex + 1) % formCount; - if (this.lastSpecies.forms[newFormIndex].isStarterSelectable && this.speciesStarterDexEntry.caughtAttr & this.scene.gameData.getFormAttr(newFormIndex)) { + if (this.lastSpecies.forms[newFormIndex].isStarterSelectable && this.speciesStarterDexEntry!.caughtAttr! & this.scene.gameData.getFormAttr(newFormIndex)) { // TODO: are those bangs correct? break; } } while (newFormIndex !== props.formIndex); @@ -1553,17 +1900,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.canCycleAbility) { const abilityCount = this.lastSpecies.getAbilityCount(); const abilityAttr = this.scene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr; + const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; let newAbilityIndex = this.abilityCursor; do { newAbilityIndex = (newAbilityIndex + 1) % abilityCount; - if (!newAbilityIndex) { - if (abilityAttr & AbilityAttr.ABILITY_1) { + if (newAbilityIndex === 0) { + if (hasAbility1) { break; } } else if (newAbilityIndex === 1) { - if (abilityAttr & (this.lastSpecies.ability2 ? AbilityAttr.ABILITY_2 : AbilityAttr.ABILITY_HIDDEN)) { - break; + // If ability 1 and 2 are the same and ability 1 is unlocked, skip over ability 2 + if (this.lastSpecies.ability1 === this.lastSpecies.ability2 && hasAbility1) { + newAbilityIndex = (newAbilityIndex + 1) % abilityCount; } + break; } else { if (abilityAttr & AbilityAttr.ABILITY_HIDDEN) { break; @@ -1577,7 +1927,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; case Button.CYCLE_NATURE: if (this.canCycleNature) { - const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr); + const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); const natureIndex = natures.indexOf(this.natureCursor); const newNature = natures[natureIndex < natures.length - 1 ? natureIndex + 1 : 0]; // store cycled nature as default @@ -1592,71 +1942,158 @@ export default class StarterSelectUiHandler extends MessageUiHandler { do { newVariant = (newVariant + 1) % 3; if (!newVariant) { - if (this.speciesStarterDexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT) { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.DEFAULT_VARIANT) { // TODO: is this bang correct? break; } } else if (newVariant === 1) { - if (this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_2) { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_2) { // TODO: is this bang correct? break; } } else { - if (this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_3) { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_3) { // TODO: is this bang correct? break; } } } while (newVariant !== props.variant); - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant, undefined, undefined); + starterAttributes.variant = newVariant; // store the selected variant + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant as Variant, undefined, undefined); // Cycle tint based on current sprite tint - const tint = getVariantTint(newVariant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); + const tint = getVariantTint(newVariant as Variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); this.pokemonShinyIcon.setTint(tint); success = true; } break; case Button.UP: - if (row) { - success = this.setCursor(this.cursor - 9); - } else { - // when strictly opposite starter based on rows length - // does not exits, set cursor on the second to last row - if (this.cursor + (rows - 1) * 9 > genStarters - 1) { - success = this.setCursor(this.cursor + (rows - 2) * 9); + if (!this.starterIconsCursorObj.visible) { + if (currentRow > 0) { + if (this.scrollCursor > 0 && currentRow - this.scrollCursor === 0) { + this.scrollCursor--; + this.updateScroll(); + } + success = this.setCursor(this.cursor - 9); } else { - success = this.setCursor(this.cursor + (rows - 1) * 9); + this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); + this.setFilterMode(true); + success = true; } + } else { + if (this.starterIconsCursorIndex === 0) { + // Up from first Pokemon in the team > go to filter + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); + this.setFilterMode(true); + } else { + this.starterIconsCursorIndex--; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } + success = true; } break; case Button.DOWN: - if (row < rows - 2 || (row < rows - 1 && this.cursor % 9 <= (genStarters - 1) % 9)) { - success = this.setCursor(this.cursor + 9); - } else { - // if there is no starter below while being on the second to - // last row, adjust cursor position with one line less - if (row === rows - 2 && this.cursor + 9 > genStarters - 1) { - success = this.setCursor(this.cursor - (rows - 2) * 9); + if (!this.starterIconsCursorObj.visible) { + if (currentRow < numOfRows - 1) { // not last row + if (currentRow - this.scrollCursor === 8) { // last row of visible starters + this.scrollCursor++; + } + success = this.setCursor(this.cursor + 9); + this.updateScroll(); + } else if (numOfRows > 1) { + // DOWN from last row of Pokemon > Wrap around to first row + this.scrollCursor = 0; + this.updateScroll(); + success = this.setCursor(this.cursor % 9); } else { - success = this.setCursor(this.cursor - (rows - 1) * 9); + // DOWN from single row of Pokemon > Go to filters + this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); + this.setFilterMode(true); + success = true; } + } else { + if (this.starterIconsCursorIndex <= this.starterSpecies.length - 2) { + this.starterIconsCursorIndex++; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; } break; case Button.LEFT: - if (this.cursor % 9) { - success = this.setCursor(this.cursor - 1); - } else { - if (row >= Math.min(5, rows - 1)) { - this.startCursorObj.setVisible(true); + if (!this.starterIconsCursorObj.visible) { + if (this.cursor % 9 !== 0) { + success = this.setCursor(this.cursor - 1); + } else { + // LEFT from filtered Pokemon, on the left edge + + if (this.starterSpecies.length === 0) { + // no starter in team > wrap around to the last column + success = this.setCursor(this.cursor + Math.min(8, numberOfStarters - this.cursor)); + + } else if (onScreenCurrentRow < 7) { + // at least one pokemon in team > for the first 7 rows, go to closest starter + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + + } else { + // at least one pokemon in team > from the bottom 2 rows, go to start run button + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; } - success = this.setGenMode(true); + } else if (numberOfStarters > 0) { + // LEFT from team > Go to closest filtered Pokemon + const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); + this.starterIconsCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9 + 8, onScreenLastIndex)); + success = true; + } else { + // LEFT from team and no Pokemon in filter > do nothing + success = false; } break; case Button.RIGHT: - if (this.cursor % 9 < (row < rows - 1 ? 8 : (genStarters - 1) % 9)) { - success = this.setCursor(this.cursor + 1); - } else { - if (row >= Math.min(5, rows - 1)) { - this.startCursorObj.setVisible(true); + if (!this.starterIconsCursorObj.visible) { + // is not right edge + if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { + success = this.setCursor(this.cursor + 1); + } else { + // RIGHT from filtered Pokemon, on the right edge + if (this.starterSpecies.length === 0) { + // no selected starter in team > wrap around to the first column + success = this.setCursor(this.cursor - Math.min(8, this.cursor % 9)); + + } else if (onScreenCurrentRow < 7) { + // at least one pokemon in team > for the first 7 rows, go to closest starter + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + + } else { + // at least one pokemon in team > from the bottom 2 rows, go to start run button + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; } - success = this.setGenMode(true); + } else if (numberOfStarters > 0) { + // RIGHT from team > Go to closest filtered Pokemon + const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); + this.starterIconsCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9, onScreenLastIndex - (onScreenLastIndex % 9))); + success = true; + } else { + // RIGHT from team and no Pokemon in filter > do nothing + success = false; } break; } @@ -1672,38 +2109,85 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return success || error; } + isInParty(species: PokemonSpecies): [boolean, number] { + let removeIndex = 0; + let isDupe = false; + for (let s = 0; s < this.starterSpecies.length; s++) { + if (this.starterSpecies[s] === species) { + isDupe = true; + removeIndex = s; + break; + } + } + return [isDupe, removeIndex]; + } + + addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: integer, nature: Nature, moveset: StarterMoveset) { + const props = this.scene.gameData.getSpeciesDexAttrProps(species, dexAttr); + this.starterIcons[this.starterSpecies.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); + this.starterIcons[this.starterSpecies.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); + this.checkIconId(this.starterIcons[this.starterSpecies.length], species, props.female, props.formIndex, props.shiny, props.variant); + + this.starterSpecies.push(species); + this.starterAttr.push(dexAttr); + this.starterAbilityIndexes.push(abilityIndex); + this.starterNatures.push(nature); + this.starterMovesets.push(moveset); + if (this.speciesLoaded.get(species.speciesId)) { + getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(this.scene); + } + this.updateInstructions(); + } + + updatePartyIcon(species: PokemonSpecies, index: number) { + const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)); + this.starterIcons[index].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); + this.starterIcons[index].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); + this.checkIconId(this.starterIcons[index], species, props.female, props.formIndex, props.shiny, props.variant); + } + switchMoveHandler(i: number, newMove: Moves, move: Moves) { const speciesId = this.lastSpecies.speciesId; - const existingMoveIndex = this.starterMoveset.indexOf(newMove); - this.starterMoveset[i] = newMove; + const existingMoveIndex = this.starterMoveset?.indexOf(newMove)!; // TODO: is this bang correct? + this.starterMoveset![i] = newMove; // TODO: is this bang correct? if (existingMoveIndex > -1) { - this.starterMoveset[existingMoveIndex] = move; + this.starterMoveset![existingMoveIndex] = move; // TODO: is this bang correct? } const props: DexAttrProps = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); // species has different forms if (pokemonFormLevelMoves.hasOwnProperty(speciesId)) { // starterMoveData doesn't have base form moves or is using the single form format if (!this.scene.gameData.starterData[speciesId].moveset || Array.isArray(this.scene.gameData.starterData[speciesId].moveset)) { - this.scene.gameData.starterData[speciesId].moveset = { [props.formIndex]: this.starterMoveset.slice(0) as StarterMoveset }; + this.scene.gameData.starterData[speciesId].moveset = { [props.formIndex]: this.starterMoveset?.slice(0) as StarterMoveset }; } const starterMoveData = this.scene.gameData.starterData[speciesId].moveset; // starterMoveData doesn't have active form moves if (!starterMoveData.hasOwnProperty(props.formIndex)) { - this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset; + this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice(0) as StarterMoveset; } // does the species' starter move data have its form's starter moves and has it been updated if (starterMoveData.hasOwnProperty(props.formIndex)) { // active form move hasn't been updated if (starterMoveData[props.formIndex][existingMoveIndex] !== newMove) { - this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset; + this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice(0) as StarterMoveset; } } } else { - this.scene.gameData.starterData[speciesId].moveset = this.starterMoveset.slice(0) as StarterMoveset; + this.scene.gameData.starterData[speciesId].moveset = this.starterMoveset?.slice(0) as StarterMoveset; } this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined, false); + + // switch moves of starter if exists + if (this.starterMovesets.length) { + Array.from({ length: this.starterSpecies.length }, (_, i) => { + const starterSpecies = this.starterSpecies[i]; + if (starterSpecies.speciesId === speciesId) { + this.starterMovesets[i] = this.starterMoveset!; // TODO: is this bang correct? + } + }); + } } updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { @@ -1731,6 +2215,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { case SettingKeyboard.Button_Cycle_Variant: iconPath = "V.png"; break; + case SettingKeyboard.Button_Stats: + iconPath = "C.png"; + break; default: break; } @@ -1750,11 +2237,36 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } + updateFilterButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + let iconPath; + // touch controls cannot be rebound as is, and are just emulating a keyboard event. + // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls + if (gamepadType === "touch") { + gamepadType = "keyboard"; + iconPath = "C.png"; + } else { + iconPath = this.scene.inputController?.getIconForLatestInputRecorded(iconSetting); + } + iconElement.setTexture(gamepadType, iconPath); + iconElement.setPosition(this.filterInstructionRowX, this.filterInstructionRowY); + controlLabel.setPosition(this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY); + iconElement.setVisible(true); + controlLabel.setVisible(true); + this.filterInstructionsContainer.add([iconElement, controlLabel]); + this.filterInstructionRowY += 8; + if (this.filterInstructionRowY >= 24) { + this.filterInstructionRowY = 0; + this.filterInstructionRowX += 50; + } + } updateInstructions(): void { this.instructionRowX = 0; this.instructionRowY = 0; + this.filterInstructionRowX = 0; + this.filterInstructionRowY = 0; this.hideInstructions(); this.instructionsContainer.removeAll(); + this.filterInstructionsContainer.removeAll(); let gamepadType; if (this.scene.inputMethod === "gamepad") { gamepadType = this.scene.inputController.getConfig(this.scene.inputController.selectedDevice[Device.GAMEPAD]).padType; @@ -1762,6 +2274,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { gamepadType = this.scene.inputMethod; } + if (!gamepadType) { + return; + } + if (this.speciesStarterDexEntry?.caughtAttr) { if (this.canCycleShiny) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Shiny, gamepadType, this.shinyIconElement, this.shinyLabel); @@ -1782,6 +2298,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Variant, gamepadType, this.variantIconElement, this.variantLabel); } } + + // if filter mode is inactivated and gamepadType is not undefined, update the button icons + if (!this.filterMode) { + this.updateFilterButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.goFilterIconElement, this.goFilterLabel); + } + } getValueLimit(): integer { @@ -1800,61 +2322,284 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return valueLimit.value; } - setCursor(cursor: integer): boolean { - let changed = false; + updateStarters = () => { + this.scrollCursor = 0; + this.filteredStarterContainers = []; + this.validStarterContainers = []; - if (this.genMode) { - changed = this.genCursor !== cursor; + this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false)); + this.starterCursorObjs.forEach(cursor => cursor.setVisible(false)); - let genCursorWithScroll = this.getGenCursorWithScroll(); + this.filterBar.updateFilterLabels(); - if (!cursor && this.genScrollCursor) { - this.genScrollCursor--; - cursor++; - this.updateGenOptions(); - } else if (cursor === 2 && this.genScrollCursor < gens.length - 3) { - this.genScrollCursor++; - cursor--; - this.updateGenOptions(); - } - - if (genCursorWithScroll !== undefined) { - this.starterSelectGenIconContainers[genCursorWithScroll].setVisible(false); - } - this.cursor = 0; - this.genCursor = cursor; - genCursorWithScroll = this.getGenCursorWithScroll(); - this.genCursorObj.setY(5 + 17 * this.genCursor); - this.genCursorHighlightObj.setY(this.genCursorObj.y); - this.starterSelectGenIconContainers[genCursorWithScroll].setVisible(true); - - for (let s = 0; s < this.starterCursorObjs.length; s++) { - this.starterCursorObjs[s].setVisible(this.starterGens[s] === genCursorWithScroll); - } - for (let s = 0; s < this.pokerusCursorObjs.length; s++) { - this.pokerusCursorObjs[s].setVisible(this.pokerusGens[s] === genCursorWithScroll); - } - - const genLimit = this.genSpecies[genCursorWithScroll].length; - for (let s = 0; s < 81; s++) { - const speciesId = s < genLimit ? this.genSpecies[genCursorWithScroll][s].speciesId : 0 as Species; - const slotVisible = !!speciesId; - if (slotVisible) { - this.updateStarterValueLabel(s); + // pre filter for challenges + if (this.scene.gameMode.modeId === GameModes.CHALLENGE) { + this.starterContainers.forEach(container => { + const species = container.species; + let allFormsValid = false; + if (species.forms?.length > 0) { + for (let i = 0; i < species.forms.length; i++) { + /* Here we are making a fake form index dex props for challenges + * Since some pokemon rely on forms to be valid (i.e. blaze tauros for fire challenges), we make a fake form and dex props to use in the challenge + */ + const tempFormProps = BigInt(Math.pow(2, i)) * DexAttr.DEFAULT_FORM; + const isValidForChallenge = new Utils.BooleanHolder(true); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, tempFormProps), true); + allFormsValid = allFormsValid || isValidForChallenge.value; + } + } else { + const isValidForChallenge = new Utils.BooleanHolder(true); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(container.species, false, true)), true); + allFormsValid = isValidForChallenge.value; } - this.starterValueLabels[s].setVisible(slotVisible); + if (allFormsValid) { + this.validStarterContainers.push(container); + } else { + container.setVisible(false); + } + }); + } else { + this.validStarterContainers = this.starterContainers; + } + + // this updates icons for previously saved pokemon + for (let i = 0; i < this.validStarterContainers.length; i++) { + const currentFilteredContainer = this.validStarterContainers[i]; + const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; + + const currentDexAttr = this.getCurrentDexProps(currentFilteredContainer.species.speciesId); + const props = this.scene.gameData.getSpeciesDexAttrProps(currentFilteredContainer.species, currentDexAttr); + + starterSprite.setTexture(currentFilteredContainer.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), currentFilteredContainer.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); + currentFilteredContainer.checkIconId(props.female, props.formIndex, props.shiny, props.variant); + } + + // filter + this.validStarterContainers.forEach(container => { + container.setVisible(false); + + 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 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 isVariant1Caught && !isVariant2Caught && !isVariant3Caught; + } else if (caught === "NORMAL") { + return isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught; + } else if (caught === "UNCAUGHT") { + return isUncaught; + } + }); + + // Passive Filter + const isPassiveUnlocked = starterData.passiveAttr > 0; + const isPassiveUnlockable = this.isPassiveAvailable(container.species.speciesId) && !isPassiveUnlocked; + const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { + return isPassiveUnlocked; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !isPassiveUnlocked; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { + return isPassiveUnlockable; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { + return true; + } + }); + + // Cost Reduction Filter + const 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 isStarterProgressable && !isCostReduced; + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { + return isCostReductionUnlockable; + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { + return true; + } + }); + + // Favorite Filter + const isFavorite = this.starterPreferences[container.species.speciesId]?.favorite ?? false; + const fitsFavorite = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "FAVORITE" && misc.state === DropDownState.ON) { + return isFavorite; + } + if (misc.val === "FAVORITE" && misc.state === DropDownState.EXCLUDE) { + return !isFavorite; + } + if (misc.val === "FAVORITE" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Ribbon / Classic Win Filter + const hasWon = starterData.classicWinCount > 0; + const hasNotWon = starterData.classicWinCount === 0; + const isUndefined = starterData.classicWinCount === undefined; + const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "WIN" && misc.state === DropDownState.ON) { + return hasWon; + } else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { + return hasNotWon || isUndefined; + } else if (misc.val === "WIN" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // HA Filter + const speciesHasHiddenAbility = container.species.abilityHidden !== container.species.ability1 && container.species.abilityHidden !== Abilities.NONE; + const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN; + const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { + return hasHA; + } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { + return speciesHasHiddenAbility && !hasHA; + } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Egg Purchasable Filter + const isEggPurchasable = this.isSameSpeciesEggAvailable(container.species.speciesId); + const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "EGG" && misc.state === DropDownState.ON) { + return isEggPurchasable; + } else if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !isEggPurchasable; + } else if (misc.val === "EGG" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Pokerus Filter + const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { + return this.pokerusSpecies.includes(container.species); + } else if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { + return !this.pokerusSpecies.includes(container.species); + } else if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { + return true; + } + }); + + if (fitsGen && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { + this.filteredStarterContainers.push(container); + } + }); + + this.starterSelectScrollBar.setPages(Math.max(Math.ceil(this.filteredStarterContainers.length / 9), 1)); + this.starterSelectScrollBar.setPage(0); + + // sort + const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; + this.filteredStarterContainers.sort((a, b) => { + switch (sort.val) { + default: + break; + case SortCriteria.NUMBER: + return (a.species.speciesId - b.species.speciesId) * -sort.dir; + case SortCriteria.COST: + return (a.cost - b.cost) * -sort.dir; + case SortCriteria.CANDY: + const candyCountA = this.scene.gameData.starterData[a.species.speciesId].candyCount; + const candyCountB = this.scene.gameData.starterData[b.species.speciesId].candyCount; + return (candyCountA - candyCountB) * -sort.dir; + case SortCriteria.IV: + const avgIVsA = this.scene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[a.species.speciesId].ivs.length; + const avgIVsB = this.scene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[b.species.speciesId].ivs.length; + return (avgIVsA - avgIVsB) * -sort.dir; + case SortCriteria.NAME: + return a.species.name.localeCompare(b.species.name) * -sort.dir; + } + return 0; + }); + + this.updateScroll(); + }; + + updateScroll = () => { + const maxColumns = 9; + const maxRows = 9; + const onScreenFirstIndex = this.scrollCursor * maxColumns; + const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns -1); + + this.starterSelectScrollBar.setPage(this.scrollCursor); + + let pokerusCursorIndex = 0; + this.filteredStarterContainers.forEach((container, i) => { + const pos = calcStarterPosition(i, this.scrollCursor); + container.setPosition(pos.x, pos.y); + if (i < onScreenFirstIndex || i > onScreenLastIndex) { + container.setVisible(false); + + if (this.pokerusSpecies.includes(container.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(false); + pokerusCursorIndex++; + } + + if (this.starterSpecies.includes(container.species)) { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); + } + return; + } else { + container.setVisible(true); + + if (this.pokerusSpecies.includes(container.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); + pokerusCursorIndex++; + } + + if (this.starterSpecies.includes(container.species)) { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); + } + + const speciesId = container.species.speciesId; + this.updateStarterValueLabel(container); + + container.label.setVisible(true); const speciesVariants = speciesId && this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(this.scene.gameData.dexData[speciesId].caughtAttr & v)) : []; for (let v = 0; v < 3; v++) { const hasVariant = speciesVariants.length > v; - this.shinyIcons[s][v].setVisible(slotVisible && hasVariant); + container.shinyIcons[v].setVisible(hasVariant); if (hasVariant) { - this.shinyIcons[s][v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2)); + container.shinyIcons[v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2)); } } - this.hiddenAbilityIcons[s].setVisible(slotVisible && !!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.starterData[speciesId].abilityAttr & 4)); - this.classicWinIcons[s].setVisible(slotVisible && this.scene.gameData.starterData[speciesId].classicWinCount > 0); + + container.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[speciesId].passiveAttr); + container.hiddenAbilityIcon.setVisible(!!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.starterData[speciesId].abilityAttr & 4)); + container.classicWinIcon.setVisible(this.scene.gameData.starterData[speciesId].classicWinCount > 0); + container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); // 'Candy Icon' mode if (this.scene.candyUpgradeDisplay === 0) { @@ -1865,67 +2610,63 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } // Set the candy colors - this.candyUpgradeIcon[s].setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][0]))); - this.candyUpgradeOverlayIcon[s].setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][1]))); + container.candyUpgradeIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][0]))); + container.candyUpgradeOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][1]))); - this.setUpgradeIcon(s); + this.setUpgradeIcon(container); } else if (this.scene.candyUpgradeDisplay === 1) { - this.candyUpgradeIcon[s].setVisible(false); - this.candyUpgradeOverlayIcon[s].setVisible(false); + container.candyUpgradeIcon.setVisible(false); + container.candyUpgradeOverlayIcon.setVisible(false); } } + }); + }; + + setCursor(cursor: integer): boolean { + let changed = false; + + if (this.filterMode) { + changed = this.filterBarCursor !== cursor; + this.filterBarCursor = cursor; + + this.filterBar.setCursor(cursor); } else { + cursor = Math.max(Math.min(this.filteredStarterContainers.length - 1, cursor), 0); changed = super.setCursor(cursor); - this.cursorObj.setPosition(150 + 18 * (cursor % 9), 10 + 18 * Math.floor(cursor / 9)); + const pos = calcStarterPosition(cursor, this.scrollCursor); + this.cursorObj.setPosition(pos.x - 1, pos.y + 1); - const species = this.genSpecies[this.getGenCursorWithScroll()][cursor]; + const species = this.filteredStarterContainers[cursor]?.species; - const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); - const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - const variant = defaultProps.variant; - const tint = getVariantTint(variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); - this.pokemonShinyIcon.setTint(tint); - this.setSpecies(species); - this.updateInstructions(); + if (species) { + const defaultDexAttr = this.getCurrentDexProps(species.speciesId); + const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const variant = this.starterPreferences[species.speciesId]?.variant ? this.starterPreferences[species.speciesId].variant as Variant : defaultProps.variant; + const tint = getVariantTint(variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonShinyIcon.setTint(tint); + this.setSpecies(species); + this.updateInstructions(); + } else { + console.warn("Species is undefined for cursor position", cursor); + this.setFilterMode(true); + } } return changed; } - getGenCursorWithScroll(): integer { - return this.genCursor !== undefined - ? this.genCursor + this.genScrollCursor - : undefined; - } + setFilterMode(filterMode: boolean): boolean { + this.cursorObj.setVisible(!filterMode); + this.filterBar.cursorObj.setVisible(filterMode); - updateGenOptions(): void { - let text = ""; - for (let g = this.genScrollCursor; g <= this.genScrollCursor + 2; g++) { - let optionText = ""; - if (g === this.genScrollCursor && this.genScrollCursor) { - optionText = "↑"; - } else if (g === this.genScrollCursor + 2 && this.genScrollCursor < gens.length - 3) { - optionText = "↓"; - } else { - optionText = i18next.t(`starterSelectUiHandler:gen${g + 1}`); - } - text += `${text ? "\n" : ""}${optionText}`; - } - this.genOptionsText.setText(text); - } - - setGenMode(genMode: boolean): boolean { - this.genCursorObj.setVisible(genMode && !this.startCursorObj.visible); - this.cursorObj.setVisible(!genMode && !this.startCursorObj.visible); - - if (genMode !== this.genMode) { - this.genMode = genMode; - - this.setCursor(genMode ? this.genCursor : this.cursor); - if (genMode) { + if (filterMode !== this.filterMode) { + this.filterMode = filterMode; + this.setCursor(filterMode ? this.filterBarCursor : this.cursor); + if (filterMode) { this.setSpecies(null); + this.updateInstructions(); } return true; @@ -1934,65 +2675,32 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } + moveStarterIconsCursor(index: number): void { + this.starterIconsCursorObj.x = this.starterIcons[index].x + this.starterIconsCursorXOffset; + this.starterIconsCursorObj.y = this.starterIcons[index].y + this.starterIconsCursorYOffset; + if (this.starterSpecies.length > 0) { + this.starterIconsCursorObj.setVisible(true); + this.setSpecies(this.starterSpecies[index]); + } else { + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + } + } - - setSpecies(species: PokemonSpecies) { + setSpecies(species: PokemonSpecies | null) { this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null; - this.dexAttrCursor = species ? this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true) : 0n; + this.dexAttrCursor = species ? this.getCurrentDexProps(species.speciesId) : 0n; this.abilityCursor = species ? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; this.natureCursor = species ? this.scene.gameData.getSpeciesDefaultNature(species) : 0; - const starterAttributes : StarterAttributes = species ? {...this.starterPreferences[species.speciesId]} : null; - // validate starterAttributes - if (starterAttributes) { - // this may cause changes so we created a copy of the attributes before - if (!isNaN(starterAttributes.variant)) { - if (![ - this.speciesStarterDexEntry.caughtAttr & DexAttr.NON_SHINY, - this.speciesStarterDexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT, - this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_2, - this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_3 - ][starterAttributes.variant+1]) { // add 1 as -1 = non-shiny - // requested variant wasn't unlocked, purging setting - delete starterAttributes.variant; - } - } - - if (typeof starterAttributes.female !== "boolean" || !(starterAttributes.female ? - this.speciesStarterDexEntry.caughtAttr & DexAttr.FEMALE : - this.speciesStarterDexEntry.caughtAttr & DexAttr.MALE - )) { - // requested gender wasn't unlocked, purging setting - delete starterAttributes.female; - } - - const abilityAttr = this.scene.gameData.starterData[species.speciesId].abilityAttr; - if (![ - abilityAttr & AbilityAttr.ABILITY_1, - species.ability2 ? (abilityAttr & AbilityAttr.ABILITY_2) : abilityAttr & AbilityAttr.ABILITY_HIDDEN, - species.ability2 && abilityAttr & AbilityAttr.ABILITY_HIDDEN - ][starterAttributes.ability]) { - // requested ability wasn't unlocked, purging setting - delete starterAttributes.ability; - } - - if (!(species.forms[starterAttributes.form]?.isStarterSelectable && this.speciesStarterDexEntry.caughtAttr & this.scene.gameData.getFormAttr(starterAttributes.form))) { - // requested form wasn't unlocked/isn't a starter form, purging setting - delete starterAttributes.form; - } - - if (this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr).indexOf(starterAttributes.nature as unknown as Nature) < 0) { - // requested nature wasn't unlocked, purging setting - delete starterAttributes.nature; - } - } + const starterAttributes : StarterAttributes | null = species ? {...this.starterPreferences[species.speciesId]} : null; if (starterAttributes?.nature) { // load default nature from stater save data, if set this.natureCursor = starterAttributes.nature; } - if (!isNaN(starterAttributes?.ability)) { - // load default nature from stater save data, if set + if (starterAttributes?.ability && !isNaN(starterAttributes.ability)) { + // load default ability from stater save data, if set this.abilityCursor = starterAttributes.ability; } @@ -2002,29 +2710,34 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.showStats(); } else { this.statsContainer.setVisible(false); - this.statsContainer.updateIvs(null); + //@ts-ignore + this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. what. how? huh? } } if (this.lastSpecies) { - const dexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(this.lastSpecies, false, true); + const dexAttr = this.getCurrentDexProps(this.lastSpecies.speciesId); const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr); - const lastSpeciesIcon = (this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(this.genSpecies[this.lastSpecies.generation - 1].indexOf(this.lastSpecies)) as Phaser.GameObjects.Sprite); - lastSpeciesIcon.setTexture(this.lastSpecies.getIconAtlasKey(props.formIndex, props.shiny, props.variant), this.lastSpecies.getIconId(props.female, props.formIndex, props.shiny, props.variant)); + const speciesIndex = this.allSpecies.indexOf(this.lastSpecies); + const lastSpeciesIcon = this.starterContainers[speciesIndex].icon; this.checkIconId(lastSpeciesIcon, this.lastSpecies, props.female, props.formIndex, props.shiny, props.variant); this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); // Resume the animation for the previously selected species - const speciesIndex = this.genSpecies[this.lastSpecies.generation - 1].indexOf(this.lastSpecies); - const icon = this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(speciesIndex) as Phaser.GameObjects.Sprite; + const icon = this.starterContainers[speciesIndex].icon; this.scene.tweens.getTweensOf(icon).forEach(tween => tween.resume()); } - this.lastSpecies = species; + this.lastSpecies = species!; // TODO: is this bang correct? if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr)) { this.pokemonNumberText.setText(Utils.padInt(species.speciesId, 4)); - this.pokemonNameText.setText(species.name); + if (starterAttributes?.nickname) { + const name = decodeURIComponent(escape(atob(starterAttributes.nickname))); + this.pokemonNameText.setText(name); + } else { + this.pokemonNameText.setText(species.name); + } if (this.speciesStarterDexEntry?.caughtAttr) { const colorScheme = starterColors[species.speciesId]; @@ -2034,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.pokemonLuckText.visible); //Growth translate let growthReadable = Utils.toReadableString(GrowthRate[species.growthRate]); @@ -2058,12 +2770,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); } this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry.hatchedCount}`); - const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + + const 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); @@ -2102,39 +2816,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); if (this.pokemonCandyDarknessOverlay.visible) { - this.pokemonCandyDarknessOverlay.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${currentFriendship}/${friendshipCap}`, true)); + this.pokemonCandyDarknessOverlay.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true)); this.pokemonCandyDarknessOverlay.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } - this.pokemonCandyDarknessOverlay.setCrop(0,0,16, candyCropY); + this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY); } // Pause the animation when the species is selected - const speciesIndex = this.genSpecies[species.generation - 1].indexOf(species); - const icon = this.starterSelectGenIconContainers[species.generation - 1].getAt(speciesIndex) as Phaser.GameObjects.Sprite; + const speciesIndex = this.allSpecies.indexOf(species); + const icon = this.starterContainers[speciesIndex].icon; if (this.isUpgradeAnimationEnabled()) { this.scene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); // Reset the position of the icon - const position = calcSpritePosition(speciesIndex); - icon.x = position.x; - icon.y = position.y; + icon.x = -2; + icon.y = 2; } // Initiates the small up and down idle animation this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); - let starterIndex = -1; - - this.starterGens.every((g, i) => { - const starterSpecies = this.genSpecies[g][this.starterCursors[i]]; - if (starterSpecies.speciesId === species.speciesId) { - starterIndex = i; - return false; - } - return true; - }); + const starterIndex = this.starterSpecies.indexOf(species); let props: DexAttrProps; @@ -2142,13 +2846,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { props = this.scene.gameData.getSpeciesDexAttrProps(species, this.starterAttr[starterIndex]); this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, this.starterAbilityIndexes[starterIndex], this.starterNatures[starterIndex]); } else { - const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultDexAttr = this.getCurrentDexProps(species.speciesId); const defaultAbilityIndex = starterAttributes?.ability ?? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); // load default nature from stater save data, if set const defaultNature = starterAttributes?.nature || this.scene.gameData.getSpeciesDefaultNature(species); props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - if (!isNaN(starterAttributes?.variant)) { - if (props.shiny = (starterAttributes.variant >= 0)) { + if (starterAttributes?.variant && !isNaN(starterAttributes.variant)) { + if (props.shiny) { props.variant = starterAttributes.variant as Variant; } } @@ -2159,10 +2863,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } const speciesForm = getPokemonSpeciesForm(species.speciesId, props.formIndex); - this.setTypeIcons(speciesForm.type1, speciesForm.type2); + this.setTypeIcons(speciesForm.type1, speciesForm!.type2!); // TODO: are those bangs correct? this.pokemonSprite.clearTint(); - if (this.pokerusCursors.find((cursor: integer, i: integer) => cursor === this.cursor && this.pokerusGens[i] === this.getGenCursorWithScroll())) { + if (this.pokerusSpecies.includes(species)) { handleTutorial(this.scene, Tutorial.Pokerus); } } else { @@ -2213,14 +2917,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCandyCountText.setVisible(false); this.pokemonFormText.setVisible(false); - this.setSpeciesDetails(species, false, 0, false, 0, 0, 0); + this.setSpeciesDetails(species!, false, 0, false, 0, 0, 0); // TODO: is this bang correct? this.pokemonSprite.clearTint(); } } - setSpeciesDetails(species: PokemonSpecies, shiny: boolean, formIndex: integer, female: boolean, variant: Variant, abilityIndex: integer, natureIndex: integer, forSeen: boolean = false): void { + setSpeciesDetails(species: PokemonSpecies, shiny?: boolean, formIndex?: integer, female?: boolean, variant?: Variant, abilityIndex?: integer, natureIndex?: integer, forSeen: boolean = false): void { const oldProps = species ? this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); const oldNatureIndex = this.natureCursor > -1 ? this.natureCursor : this.scene.gameData.getSpeciesDefaultNature(species); @@ -2237,15 +2941,23 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } if (species) { - this.dexAttrCursor |= (shiny !== undefined ? !shiny : !(shiny = oldProps.shiny)) ? DexAttr.NON_SHINY : DexAttr.SHINY; - this.dexAttrCursor |= (female !== undefined ? !female : !(female = oldProps.female)) ? DexAttr.MALE : DexAttr.FEMALE; - this.dexAttrCursor |= (variant !== undefined ? !variant : !(variant = oldProps.variant)) ? DexAttr.DEFAULT_VARIANT : variant === 1 ? DexAttr.VARIANT_2 : DexAttr.VARIANT_3; - this.dexAttrCursor |= this.scene.gameData.getFormAttr(formIndex !== undefined ? formIndex : (formIndex = oldProps.formIndex)); + this.dexAttrCursor |= (shiny !== undefined ? !shiny : !(shiny = oldProps?.shiny)) ? DexAttr.NON_SHINY : DexAttr.SHINY; + this.dexAttrCursor |= (female !== undefined ? !female : !(female = oldProps?.female)) ? DexAttr.MALE : DexAttr.FEMALE; + this.dexAttrCursor |= (variant !== undefined ? !variant : !(variant = oldProps?.variant)) ? DexAttr.DEFAULT_VARIANT : variant === 1 ? DexAttr.VARIANT_2 : DexAttr.VARIANT_3; + this.dexAttrCursor |= this.scene.gameData.getFormAttr(formIndex !== undefined ? formIndex : (formIndex = oldProps!.formIndex)); // TODO: is this bang correct? this.abilityCursor = abilityIndex !== undefined ? abilityIndex : (abilityIndex = oldAbilityIndex); this.natureCursor = natureIndex !== undefined ? natureIndex : (natureIndex = oldNatureIndex); + const [isInParty, partyIndex]: [boolean, number] = this.isInParty(species); // we use this to firstly check if the pokemon is in the party, and if so, to get the party index in order to update the icon image + if (isInParty) { + this.updatePartyIcon(species, partyIndex); + } } 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; @@ -2258,10 +2970,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (species) { const dexEntry = this.scene.gameData.dexData[species.speciesId]; const abilityAttr = this.scene.gameData.starterData[species.speciesId].abilityAttr; + + const caughtAttr = this.scene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0); + if (!dexEntry.caughtAttr) { - const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, forSeen, !forSeen)); + 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; } @@ -2282,21 +2998,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - this.shinyOverlay.setVisible(shiny); + this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false)); this.pokemonNumberText.setShadowColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true)); if (forSeen ? this.speciesStarterDexEntry?.seenAttr : this.speciesStarterDexEntry?.caughtAttr) { - let starterIndex = -1; - - this.starterGens.every((g, i) => { - const starterSpecies = this.genSpecies[g][this.starterCursors[i]]; - if (starterSpecies.speciesId === species.speciesId) { - starterIndex = i; - return false; - } - return true; - }); + const starterIndex = this.starterSpecies.indexOf(species); if (starterIndex > -1) { this.starterAttr[starterIndex] = this.dexAttrCursor; @@ -2307,33 +3014,61 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const assetLoadCancelled = new Utils.BooleanHolder(false); this.assetLoadCancelled = assetLoadCancelled; - species.loadAssets(this.scene, female, formIndex, shiny, variant, true).then(() => { + species.loadAssets(this.scene, female!, formIndex, shiny, variant, true).then(() => { // TODO: is this bang correct? if (assetLoadCancelled.value) { return; } this.assetLoadCancelled = null; this.speciesLoaded.set(species.speciesId, true); - this.pokemonSprite.play(species.getSpriteKey(female, formIndex, shiny, variant)); + this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? this.pokemonSprite.setPipelineData("shiny", shiny); this.pokemonSprite.setPipelineData("variant", variant); - this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female, formIndex, shiny, variant)); + this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? this.pokemonSprite.setVisible(!this.statsMode); }); const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), this.starterGens.length); - const starterSprite = this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite; - starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female, formIndex, shiny, variant)); - starterSprite.setAlpha(isValidForChallenge.value ? 1 : 0.375); - this.checkIconId((this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite), species, female, formIndex, shiny, variant); - this.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY); - this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE); - this.canCycleAbility = [ abilityAttr & AbilityAttr.ABILITY_1, (abilityAttr & AbilityAttr.ABILITY_2) && species.ability2, abilityAttr & AbilityAttr.ABILITY_HIDDEN ].filter(a => a).length > 1; + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), !!this.starterSpecies.length); + const currentFilteredContainer = this.filteredStarterContainers.find(p => p.species.speciesId === species.speciesId); + if (currentFilteredContainer) { + const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; + starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female!, formIndex, shiny, variant)); + currentFilteredContainer.checkIconId(female, formIndex, shiny, variant); + } + + 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; + + /* + * Check for Pokemon with a single ability (at some point it was possible to catch them with their ability 2 attribute) + * This prevents cycling between ability 1 and 2 if they are both unlocked and the same + * but we still need to account for the possibility ability 1 was never unlocked and fallback on ability 2 in this case + */ + if (hasAbility1 && hasAbility2 && species.ability1 === species.ability2) { + hasAbility2 = 0; + } + + 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) { @@ -2346,7 +3081,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } if (dexEntry.caughtAttr) { - const ability = this.lastSpecies.getAbility(abilityIndex); + const ability = this.lastSpecies.getAbility(abilityIndex!); // TODO: is this bang correct? this.pokemonAbilityText.setText(allAbilities[ability].name); const isHidden = abilityIndex === (this.lastSpecies.ability2 ? 2 : 1); @@ -2354,14 +3089,39 @@ 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)); let levelMoves: LevelMoves; - if (pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) { + if (pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && formIndex && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) { levelMoves = pokemonFormLevelMoves[species.speciesId][formIndex]; } else { levelMoves = pokemonSpeciesLevelMoves[species.speciesId]; @@ -2369,46 +3129,49 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.speciesStarterMoves.push(...levelMoves.filter(lm => lm[0] > 0 && lm[0] <= 5).map(lm => lm[1])); if (speciesEggMoves.hasOwnProperty(species.speciesId)) { for (let em = 0; em < 4; em++) { - if (this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em)) { + if (this.scene.gameData.starterData[species.speciesId].eggMoves & (1 << em)) { this.speciesStarterMoves.push(speciesEggMoves[species.speciesId][em]); } } } const speciesMoveData = this.scene.gameData.starterData[species.speciesId].moveset; - const moveData: StarterMoveset = speciesMoveData + const moveData: StarterMoveset | null = speciesMoveData ? Array.isArray(speciesMoveData) - ? speciesMoveData as StarterMoveset - : (speciesMoveData as StarterFormMoveData)[formIndex] + ? speciesMoveData + : speciesMoveData[formIndex!] // TODO: is this bang correct? : null; - const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: integer) => this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em)) : []); + const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: integer) => this.scene.gameData.starterData[species.speciesId].eggMoves & (1 << em)) : []); this.starterMoveset = (moveData || (this.speciesStarterMoves.slice(0, 4) as StarterMoveset)).filter(m => availableStarterMoves.find(sm => sm === m)) as StarterMoveset; // Consolidate move data if it contains an incompatible move if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length) { - this.starterMoveset.push(...availableStarterMoves.filter(sm => this.starterMoveset.indexOf(sm) === -1).slice(0, 4 - this.starterMoveset.length)); + this.starterMoveset.push(...availableStarterMoves.filter(sm => this.starterMoveset?.indexOf(sm) === -1).slice(0, 4 - this.starterMoveset.length)); } // Remove duplicate moves this.starterMoveset = this.starterMoveset.filter( (move, i) => { - return this.starterMoveset.indexOf(move) === i; + return this.starterMoveset?.indexOf(move) === i; }) as StarterMoveset; - const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex); + const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? + const formText = Utils.capitalizeString(species?.forms[formIndex!]?.formKey, "-", false, false); // TODO: is the bang correct? - const formText = species?.forms[formIndex]?.formKey.split("-"); - for (let i = 0; i < formText?.length; i++) { - formText[i] = formText[i].charAt(0).toUpperCase() + formText[i].substring(1); + const speciesName = Utils.capitalizeString(Species[species.speciesId], "_", true, false); + + if (species.speciesId === Species.ARCEUS) { + this.pokemonFormText.setText(i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`)); + } else { + this.pokemonFormText.setText(formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : ""); } - this.pokemonFormText.setText(formText?.join(" ")); - - this.setTypeIcons(speciesForm.type1, speciesForm.type2); + this.setTypeIcons(speciesForm.type1, speciesForm.type2!); // TODO: is this bang correct? } else { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); this.pokemonNatureText.setText(""); - this.setTypeIcons(null, null); + // @ts-ignore + this.setTypeIcons(null, null); // TODO: resolve ts-ignore.. huh!? } } else { this.shinyOverlay.setVisible(false); @@ -2418,7 +3181,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); this.pokemonNatureText.setText(""); - this.setTypeIcons(null, null); + // @ts-ignore + this.setTypeIcons(null, null); // TODO: resolve ts-ignore.. huh!? } if (!this.starterMoveset) { @@ -2436,16 +3200,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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); + const eggMoveUnlocked = eggMove && this.scene.gameData.starterData[species.speciesId].eggMoves & (1 << em); this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase()); this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); } - this.pokemonEggMovesContainer.setVisible(this.speciesStarterDexEntry?.caughtAttr && hasEggMoves); + this.pokemonEggMovesContainer.setVisible(!!this.speciesStarterDexEntry?.caughtAttr && hasEggMoves); this.pokemonAdditionalMoveCountLabel.setText(`(+${Math.max(this.speciesStarterMoves.length - 4, 0)})`); this.pokemonAdditionalMoveCountLabel.setVisible(this.speciesStarterMoves.length > 4); + this.tryUpdateValue(); + this.updateInstructions(); } @@ -2464,28 +3230,57 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - popStarter(): void { - this.starterGens.pop(); - this.starterCursors.pop(); - this.starterAttr.pop(); - this.starterAbilityIndexes.pop(); - this.starterNatures.pop(); - this.starterMovesets.pop(); - this.starterCursorObjs[this.starterCursors.length].setVisible(false); - this.starterIcons[this.starterCursors.length].setTexture("pokemon_icons_0"); - this.starterIcons[this.starterCursors.length].setFrame("unknown"); + popStarter(index: number): void { + this.starterSpecies.splice(index, 1); + this.starterAttr.splice(index, 1); + this.starterAbilityIndexes.splice(index, 1); + this.starterNatures.splice(index, 1); + this.starterMovesets.splice(index, 1); + + for (let s = 0; s < this.starterSpecies.length; s++) { + const species = this.starterSpecies[s]; + const currentDexAttr = this.getCurrentDexProps(species.speciesId); + const props = this.scene.gameData.getSpeciesDexAttrProps(species, currentDexAttr); + this.starterIcons[s].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); + this.starterIcons[s].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); + this.checkIconId(this.starterIcons[s], species, props.female, props.formIndex, props.shiny, props.variant); + if (s >= index) { + this.starterCursorObjs[s].setPosition(this.starterCursorObjs[s + 1].x, this.starterCursorObjs[s + 1].y); + this.starterCursorObjs[s].setVisible(this.starterCursorObjs[s + 1].visible); + } + } + this.starterCursorObjs[this.starterSpecies.length].setVisible(false); + this.starterIcons[this.starterSpecies.length].setTexture("pokemon_icons_0"); + this.starterIcons[this.starterSpecies.length].setFrame("unknown"); + + if (this.starterIconsCursorObj.visible) { + if (this.starterIconsCursorIndex === this.starterSpecies.length) { + if (this.starterSpecies.length > 0) { + this.starterIconsCursorIndex--; + } else { + // No more Pokemon selected, go back to filters + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); + this.setFilterMode(true); + } + } + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } + this.tryUpdateValue(); } - updateStarterValueLabel(cursor: integer): void { - const speciesId = this.genSpecies[this.getGenCursorWithScroll()][cursor].speciesId; + updateStarterValueLabel(starter: StarterContainer): void { + const speciesId = starter.species.speciesId; const baseStarterValue = speciesStarters[speciesId]; const starterValue = this.scene.gameData.getSpeciesStarterValue(speciesId); + starter.cost = starterValue; let valueStr = starterValue.toString(); if (valueStr.startsWith("0.")) { valueStr = valueStr.slice(1); } - this.starterValueLabels[cursor].setText(valueStr); + starter.label.setText(valueStr); let textStyle: TextStyle; switch (baseStarterValue - starterValue) { case 0: @@ -2499,12 +3294,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { textStyle = TextStyle.SUMMARY_GOLD; break; } - this.starterValueLabels[cursor].setColor(this.getTextColor(textStyle)); - this.starterValueLabels[cursor].setShadowColor(this.getTextColor(textStyle, true)); + if (baseStarterValue - starterValue > 0) { + starter.label.setColor(this.getTextColor(textStyle)); + starter.label.setShadowColor(this.getTextColor(textStyle, true)); + } } - tryUpdateValue(add?: integer): boolean { - const value = this.starterGens.reduce((total: integer, gen: integer, i: integer) => total += this.scene.gameData.getSpeciesStarterValue(this.genSpecies[gen][this.starterCursors[i]].speciesId), 0); + tryUpdateValue(add?: integer, addingToParty?: boolean): boolean { + const value = this.starterSpecies.map(s => s.generation).reduce((total: integer, gen: integer, i: integer) => total += this.scene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); const newValue = value + (add || 0); const valueLimit = this.getValueLimit(); const overLimit = newValue > valueLimit; @@ -2519,45 +3316,63 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.scene.time.delayedCall(Utils.fixedInt(500), () => this.tryUpdateValue()); return false; } + let isPartyValid: boolean = this.isPartyValid(); // this checks to see if the party is valid + if (addingToParty) { // this does a check to see if the pokemon being added is valid; if so, it will update the isPartyValid boolean + const isNewPokemonValid = new Utils.BooleanHolder(true); + const species = this.filteredStarterContainers[this.cursor].species; + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isNewPokemonValid, this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false); + isPartyValid = isPartyValid || isNewPokemonValid.value; + } /** * this loop is used to set the Sprite's alpha value and check if the user can select other pokemon more. */ this.canAddParty = false; const remainValue = valueLimit - newValue; - for (let g = 0; g < this.genSpecies.length; g++) { - for (let s = 0; s < this.genSpecies[g].length; s++) { - /** Cost of pokemon species */ - const speciesStarterValue = this.scene.gameData.getSpeciesStarterValue(this.genSpecies[g][s].speciesId); - /** Used to detect if this pokemon is registered in starter */ - const speciesStarterDexEntry = this.scene.gameData.dexData[this.genSpecies[g][s].speciesId]; - /** {@linkcode Phaser.GameObjects.Sprite} object of Pokémon for setting the alpha value */ - const speciesSprite = this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite; + for (let s = 0; s < this.allSpecies.length; s++) { + /** Cost of pokemon species */ + const speciesStarterValue = this.scene.gameData.getSpeciesStarterValue(this.allSpecies[s].speciesId); + /** Used to detect if this pokemon is registered in starter */ + const speciesStarterDexEntry = this.scene.gameData.dexData[this.allSpecies[s].speciesId]; + /** {@linkcode Phaser.GameObjects.Sprite} object of Pokémon for setting the alpha value */ + const speciesSprite = this.starterContainers[s].icon; - /** - * If remainValue greater than or equal pokemon species and the pokemon is legal for this challenge, the user can select. - * so that the alpha value of pokemon sprite set 1. - * - * If speciesStarterDexEntry?.caughtAttr is true, this species registered in stater. - * we change to can AddParty value to true since the user has enough cost to choose this pokemon and this pokemon registered too. - */ - const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.genSpecies[g][s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.genSpecies[g][s], this.scene.gameData.getSpeciesDefaultDexAttr(this.genSpecies[g][s], false, true)), this.starterGens.length + (add ? 1 : 0)); + /** + * If remainValue greater than or equal pokemon species and the pokemon is legal for this challenge, the user can select. + * so that the alpha value of pokemon sprite set 1. + * + * However, if isPartyValid is false, that means none of the party members are valid for the run. In this case, we should + * check the challenge to make sure evolutions and forms aren't being checked for mono type runs. + * This will let us set the sprite's alpha to show it can't be selected + * + * If speciesStarterDexEntry?.caughtAttr is true, this species registered in stater. + * we change to can AddParty value to true since the user has enough cost to choose this pokemon and this pokemon registered too. + */ + const isValidForChallenge = new Utils.BooleanHolder(true); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.allSpecies[s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.allSpecies[s], this.getCurrentDexProps(this.allSpecies[s].speciesId)), isPartyValid); - const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge.value; + const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge.value; - if (canBeChosen) { - speciesSprite.setAlpha(1); - if (speciesStarterDexEntry?.caughtAttr) { - this.canAddParty = true; - } - } else { - /** - * If it can't be chosen, the user can't select. - * so that the alpha value of pokemon sprite set 0.375. - */ - speciesSprite.setAlpha(0.375); + const isPokemonInParty = this.isInParty(this.allSpecies[s])[0]; // this will get the valud of isDupe from isInParty. This will let us see if the pokemon in question is in our party already so we don't grey out the sprites if they're invalid + + /* This code does a check to tell whether or not a sprite should be lit up or greyed out. There are 3 ways a pokemon's sprite should be lit up: + * 1) If it's in your party, it's a valid pokemon (i.e. for challenge) and you have enough points to have it + * 2) If it's in your party, it's not valid (i.e. for challenges), and you have enough points to have it + * 3) If it's not in your party, but it's a valid pokemon and you have enough points for it + * Any other time, the sprite should be greyed out. + * For example, if it's in your party, valid, but costs too much, or if it's not in your party and not valid, regardless of cost + */ + if (canBeChosen || (isPokemonInParty && remainValue >= speciesStarterValue)) { + speciesSprite.setAlpha(1); + if (speciesStarterDexEntry?.caughtAttr) { + this.canAddParty = true; } + } else { + /** + * If it can't be chosen, the user can't select. + * so that the alpha value of pokemon sprite set 0.375. + */ + speciesSprite.setAlpha(0.375); } } @@ -2565,8 +3380,34 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return true; } + tryExit(): boolean { + this.blockInput = true; + const ui = this.getUi(); + + const cancel = () => { + ui.setMode(Mode.STARTER_SELECT); + this.clearText(); + this.blockInput = false; + }; + ui.showText(i18next.t("starterSelectUiHandler:confirmExit"), null, () => { + ui.setModeWithoutClear(Mode.CONFIRM, () => { + ui.setMode(Mode.STARTER_SELECT); + this.scene.clearPhaseQueue(); + if (this.scene.gameMode.isChallenge) { + this.scene.pushPhase(new SelectChallengePhase(this.scene)); + } else { + this.scene.pushPhase(new TitlePhase(this.scene)); + } + this.clearText(); + this.scene.getCurrentPhase()?.end(); + }, cancel, null, null, 19); + }); + + return true; + } + tryStart(manualTrigger: boolean = false): boolean { - if (!this.starterGens.length) { + if (!this.starterSpecies.length) { return false; } @@ -2575,39 +3416,114 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const cancel = () => { ui.setMode(Mode.STARTER_SELECT); if (!manualTrigger) { - this.popStarter(); + this.popStarter(this.starterSpecies.length - 1); } this.clearText(); }; - ui.showText(i18next.t("starterSelectUiHandler:confirmStartTeam"), null, () => { - ui.setModeWithoutClear(Mode.CONFIRM, () => { - const startRun = () => { - this.scene.money = this.scene.gameMode.getStartingMoney(); - ui.setMode(Mode.STARTER_SELECT); - const thisObj = this; - const originalStarterSelectCallback = this.starterSelectCallback; - this.starterSelectCallback = null; - originalStarterSelectCallback(new Array(this.starterGens.length).fill(0).map(function (_, i) { - const starterSpecies = thisObj.genSpecies[thisObj.starterGens[i]][thisObj.starterCursors[i]]; - return { - species: starterSpecies, - dexAttr: thisObj.starterAttr[i], - abilityIndex: thisObj.starterAbilityIndexes[i], - passive: !(thisObj.scene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED)), - nature: thisObj.starterNatures[i] as Nature, - moveset: thisObj.starterMovesets[i], - pokerus: !![ 0, 1, 2 ].filter(n => thisObj.pokerusGens[n] === starterSpecies.generation - 1 && thisObj.pokerusCursors[n] === thisObj.genSpecies[starterSpecies.generation - 1].indexOf(starterSpecies)).length - }; - })); - }; - startRun(); - }, cancel, null, null, 19); - }); + const canStart = this.isPartyValid(); + if (canStart) { + ui.showText(i18next.t("starterSelectUiHandler:confirmStartTeam"), null, () => { + ui.setModeWithoutClear(Mode.CONFIRM, () => { + const startRun = () => { + this.scene.money = this.scene.gameMode.getStartingMoney(); + ui.setMode(Mode.STARTER_SELECT); + const thisObj = this; + const originalStarterSelectCallback = this.starterSelectCallback; + this.starterSelectCallback = null; + originalStarterSelectCallback && originalStarterSelectCallback(new Array(this.starterSpecies.length).fill(0).map(function (_, i) { + const starterSpecies = thisObj.starterSpecies[i]; + return { + species: starterSpecies, + dexAttr: thisObj.starterAttr[i], + abilityIndex: thisObj.starterAbilityIndexes[i], + passive: !(thisObj.scene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED)), + nature: thisObj.starterNatures[i] as Nature, + moveset: thisObj.starterMovesets[i], + pokerus: thisObj.pokerusSpecies.includes(starterSpecies), + nickname: thisObj.starterPreferences[starterSpecies.speciesId]?.nickname, + }; + })); + }; + startRun(); + }, cancel, null, null, 19); + }); + } else { + const handler = this.scene.ui.getHandler() as AwaitableUiHandler; + handler.tutorialActive = true; + this.scene.ui.showText(i18next.t("starterSelectUiHandler:invalidParty"), null, () => this.scene.ui.showText("", 0, () => handler.tutorialActive = false), null, true); + } return true; } + /* This block checks to see if your party is valid + * It checks each pokemon against the challenge - noting that due to monotype challenges it needs to check the pokemon while ignoring their evolutions/form change items + */ + isPartyValid(): boolean { + let canStart = false; + for (let s = 0; s < this.starterSpecies.length; s++) { + const isValidForChallenge = new Utils.BooleanHolder(true); + const species = this.starterSpecies[s]; + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false); + canStart = canStart || isValidForChallenge.value; + } + return canStart; + } + + /** + * 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; + + /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props + * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props + * If neither of these pass, we add DexAttr.MALE to our temp props + */ + if (this.starterPreferences[speciesId]?.female || ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n)) { + props += DexAttr.FEMALE; + } else { + props += DexAttr.MALE; + } + /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. + * If they're not there, it enables shiny state by default if any shiny was caught + */ + if (this.starterPreferences[speciesId]?.shiny || ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false)) { + props += DexAttr.SHINY; + if (this.starterPreferences[speciesId]?.variant !== undefined) { + props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.variant)) * DexAttr.DEFAULT_VARIANT; + } else { + /* This calculates the correct variant if there's no starter preferences for it. + * This gets the highest tier variant that you've caught and adds it to the temp props + */ + if ((caughtAttr & DexAttr.VARIANT_3) > 0) { + props += DexAttr.VARIANT_3; + } else if ((caughtAttr & DexAttr.VARIANT_2) > 0) { + props += DexAttr.VARIANT_2; + } else { + props += DexAttr.DEFAULT_VARIANT; + } + } + } else { + props += DexAttr.NON_SHINY; + props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant + } + if (this.starterPreferences[speciesId]?.form) { // this checks for the form of the pokemon + props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.form)) * DexAttr.DEFAULT_FORM; + } else { + // Get the first unlocked form + props += this.scene.gameData.getFormAttr(this.scene.gameData.getFormIndex(caughtAttr)); + } + + return props; + } + toggleStatsMode(on?: boolean): void { if (on === undefined) { on = !this.statsMode; @@ -2620,7 +3536,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.statsMode = false; this.statsContainer.setVisible(false); this.pokemonSprite.setVisible(!!this.speciesStarterDexEntry?.caughtAttr); - this.statsContainer.updateIvs(null); + //@ts-ignore + this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? } } @@ -2652,6 +3569,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.natureLabel.setVisible(false); this.variantIconElement.setVisible(false); this.variantLabel.setVisible(false); + this.goFilterIconElement.setVisible(false); + this.goFilterLabel.setVisible(false); } clear(): void { @@ -2663,8 +3582,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.setVisible(false); this.blockInput = false; - while (this.starterCursors.length) { - this.popStarter(); + while (this.starterSpecies.length) { + this.popStarter(this.starterSpecies.length - 1); } if (this.statsMode) { @@ -2672,9 +3591,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female, formIndex, shiny, variant) { + checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female: boolean, formIndex: number, shiny: boolean, variant: number) { if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { - console.log(`${species.name}'s variant icon does not exist. Replacing with default.`); + console.log(`${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`); icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); icon.setFrame(species.getIconId(female, formIndex, false, variant)); } diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index b4e799bafc0..c6e0ea3a71c 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -1,14 +1,15 @@ 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]]; const speedLabelOffset = -3; const sideLabelOffset = 1; const ivLabelOffset = [0, sideLabelOffset, -sideLabelOffset, sideLabelOffset, -sideLabelOffset, speedLabelOffset]; -const ivChartStatIndexes = [0,1,2,5,4,3]; // swap special attack and speed +const ivChartStatIndexes = [0, 1, 2, 5, 4, 3]; // swap special attack and speed const defaultIvChartData = new Array(12).fill(null).map(() => 0); export class StatsContainer extends Phaser.GameObjects.Container { @@ -53,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 73edda0ba44..8ae72f08edd 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -2,7 +2,7 @@ import BattleScene, { starterColors } from "../battle-scene"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; -import { PlayerPokemon } from "../field/pokemon"; +import { PlayerPokemon, PokemonMove } from "../field/pokemon"; import { getStarterValueFriendshipCap, speciesStarters } from "../data/pokemon-species"; import { argbFromRgba } from "@material/material-color-utilities"; import { Type, getTypeRgb } from "../data/type"; @@ -11,19 +11,18 @@ 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"; -import { getNatureName, getNatureStatMultiplier } from "../data/nature"; +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, @@ -41,11 +40,11 @@ interface abilityContainer { /** An image displaying the summary label */ labelImage: Phaser.GameObjects.Image, /** The ability object */ - ability: Ability, + ability: Ability | null, /** The text object displaying the name of the ability */ - nameText: Phaser.GameObjects.Text, + nameText: Phaser.GameObjects.Text | null, /** The text object displaying the description of the ability */ - descriptionText: Phaser.GameObjects.Text, + descriptionText: Phaser.GameObjects.Text | null, } export default class SummaryUiHandler extends UiHandler { @@ -79,8 +78,8 @@ export default class SummaryUiHandler extends UiHandler { private summaryPageContainer: Phaser.GameObjects.Container; private movesContainer: Phaser.GameObjects.Container; private moveDescriptionText: Phaser.GameObjects.Text; - private moveCursorObj: Phaser.GameObjects.Sprite; - private selectedMoveCursorObj: Phaser.GameObjects.Sprite; + private moveCursorObj: Phaser.GameObjects.Sprite | null; + private selectedMoveCursorObj: Phaser.GameObjects.Sprite | null; private moveRowsContainer: Phaser.GameObjects.Container; private extraMoveRowContainer: Phaser.GameObjects.Container; private moveEffectContainer: Phaser.GameObjects.Container; @@ -89,12 +88,14 @@ export default class SummaryUiHandler extends UiHandler { private moveCategoryIcon: Phaser.GameObjects.Sprite; private summaryPageTransitionContainer: Phaser.GameObjects.Container; - private descriptionScrollTween: Phaser.Tweens.Tween; - private moveCursorBlinkTimer: Phaser.Time.TimerEvent; + private descriptionScrollTween: Phaser.Tweens.Tween | null; + private moveCursorBlinkTimer: Phaser.Time.TimerEvent | null; - private pokemon: PlayerPokemon; - private newMove: Move; - private moveSelectFunction: Function; + private pokemon: PlayerPokemon | null; + private playerParty: boolean; + /**This is set to false when checking the summary of a freshly caught Pokemon as it is not part of a player's party yet but still needs to display its items**/ + private newMove: Move | null; + private moveSelectFunction: Function | null; private transitioning: boolean; private statusVisible: boolean; private moveEffectsVisible: boolean; @@ -102,6 +103,7 @@ export default class SummaryUiHandler extends UiHandler { private moveSelect: boolean; private moveCursor: integer; private selectedMoveIndex: integer; + private selectCallback: Function | null; constructor(scene: BattleScene) { super(scene, Mode.SUMMARY); @@ -122,7 +124,7 @@ export default class SummaryUiHandler extends UiHandler { this.tabSprite.setOrigin(1, 1); this.summaryContainer.add(this.tabSprite); - const summaryLabel = addTextObject(this.scene, 4, -165, "Pokémon Info", TextStyle.SUMMARY); + const summaryLabel = addTextObject(this.scene, 4, -165, i18next.t("pokemonSummary:pokemonInfo"), TextStyle.SUMMARY); summaryLabel.setOrigin(0, 1); this.summaryContainer.add(summaryLabel); @@ -135,7 +137,7 @@ export default class SummaryUiHandler extends UiHandler { this.numberText.setOrigin(0, 1); this.summaryContainer.add(this.numberText); - this.pokemonSprite = this.scene.initPokemonSprite(this.scene.add.sprite(56, -106, "pkmn__sub"), null, false, true); + this.pokemonSprite = this.scene.initPokemonSprite(this.scene.add.sprite(56, -106, "pkmn__sub"), undefined, false, true); this.summaryContainer.add(this.pokemonSprite); this.nameText = addTextObject(this.scene, 6, -54, "", TextStyle.SUMMARY); @@ -207,7 +209,7 @@ export default class SummaryUiHandler extends UiHandler { this.statusContainer.add(statusBg); - const statusLabel = addTextObject(this.scene, 3, 0, "Status", TextStyle.SUMMARY); + const statusLabel = addTextObject(this.scene, 3, 0, i18next.t("pokemonSummary:status"), TextStyle.SUMMARY); statusLabel.setOrigin(0, 0); this.statusContainer.add(statusLabel); @@ -227,7 +229,7 @@ export default class SummaryUiHandler extends UiHandler { moveEffectBg.setOrigin(0, 0); this.moveEffectContainer.add(moveEffectBg); - const moveEffectLabels = addTextObject(this.scene, 8, 12, "Power\nAccuracy\nCategory", TextStyle.SUMMARY); + const moveEffectLabels = addTextObject(this.scene, 8, 12, i18next.t("pokemonSummary:powerAccuracyCategory"), TextStyle.SUMMARY); moveEffectLabels.setLineSpacing(9); moveEffectLabels.setOrigin(0, 0); @@ -269,9 +271,16 @@ export default class SummaryUiHandler extends UiHandler { show(args: any[]): boolean { super.show(args); + /* args[] information + * args[0] : the Pokemon displayed in the Summary-UI + * args[1] : the summaryUiMode (defaults to 0) + * args[2] : the start page (defaults to Page.PROFILE) + * args[3] : contains the function executed when the user exits out of Summary UI + * args[4] : optional boolean used to determine if the Pokemon is part of the player's party or not (defaults to true, necessary for PR #2921 to display all relevant information) + */ this.pokemon = args[0] as PlayerPokemon; this.summaryUiMode = args.length > 1 ? args[1] as SummaryUiMode : SummaryUiMode.DEFAULT; - + this.playerParty = args[4] ?? true; this.scene.ui.bringToTop(this.summaryContainer); this.summaryContainer.setVisible(true); @@ -295,21 +304,21 @@ export default class SummaryUiHandler extends UiHandler { this.pokemonSprite.setPipelineData("variant", this.pokemon.variant); [ "spriteColors", "fusionSpriteColors" ].map(k => { delete this.pokemonSprite.pipelineData[`${k}Base`]; - if (this.pokemon.summonData?.speciesForm) { + if (this.pokemon?.summonData?.speciesForm) { k += "Base"; } - this.pokemonSprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; + this.pokemonSprite.pipelineData[k] = this.pokemon?.getSprite().pipelineData[k]; }); this.pokemon.cry(); - this.nameText.setText(this.pokemon.name); + this.nameText.setText(this.pokemon.getNameToRender()); const isFusion = this.pokemon.isFusion(); this.splicedIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + 2, 3); this.splicedIcon.setVisible(isFusion); if (this.splicedIcon.visible) { - this.splicedIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${this.pokemon.species.getName(this.pokemon.formIndex)}/${this.pokemon.fusionSpecies.getName(this.pokemon.fusionFormIndex)}`, true)); + this.splicedIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${this.pokemon?.species.getName(this.pokemon.formIndex)}/${this.pokemon?.fusionSpecies?.getName(this.pokemon?.fusionFormIndex)}`, true)); this.splicedIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } @@ -328,13 +337,13 @@ export default class SummaryUiHandler extends UiHandler { const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); if (this.candyShadow.visible) { - this.candyShadow.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${currentFriendship}/${friendshipCap}`, true)); + this.candyShadow.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true)); this.candyShadow.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } this.candyCountText.setText(`x${this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].candyCount}`); - this.candyShadow.setCrop(0,0,16, candyCropY); + this.candyShadow.setCrop(0, 0, 16, candyCropY); const doubleShiny = isFusion && this.pokemon.shiny && this.pokemon.fusionShiny; const baseVariant = !doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant; @@ -345,9 +354,9 @@ export default class SummaryUiHandler extends UiHandler { this.shinyIcon.setTint(getVariantTint(baseVariant)); if (this.shinyIcon.visible) { const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? "Epic" : baseVariant === 1 ? "Rare" : "Common"}${doubleShiny ? `/${this.pokemon.fusionVariant === 2 ? "Epic" : this.pokemon.fusionVariant === 1 ? "Rare" : "Common"}` : ""}` + `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${this.pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : this.pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` : ""; - this.shinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); + this.shinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); this.shinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } @@ -368,6 +377,9 @@ export default class SummaryUiHandler extends UiHandler { const page = args.length < 2 ? Page.PROFILE : args[2] as Page; this.hideMoveEffect(true); this.setCursor(page); + if (args.length > 3) { + this.selectCallback = args[3]; + } break; case SummaryUiMode.LEARN_MOVE: this.newMove = args[2] as Move; @@ -397,22 +409,22 @@ export default class SummaryUiHandler extends UiHandler { } const ui = this.getUi(); - + const fromPartyMode = ui.handlers[Mode.PARTY].active; let success = false; let error = false; if (this.moveSelect) { if (button === Button.ACTION) { - if (this.moveCursor < this.pokemon.moveset.length) { + if (this.pokemon && this.moveCursor < this.pokemon.moveset.length) { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.moveSelectFunction(this.moveCursor); + this.moveSelectFunction && this.moveSelectFunction(this.moveCursor); } else { if (this.selectedMoveIndex === -1) { this.selectedMoveIndex = this.moveCursor; this.setCursor(this.moveCursor); } else { if (this.selectedMoveIndex !== this.moveCursor) { - const tempMove = this.pokemon.moveset[this.selectedMoveIndex]; + const tempMove = this.pokemon?.moveset[this.selectedMoveIndex]; this.pokemon.moveset[this.selectedMoveIndex] = this.pokemon.moveset[this.moveCursor]; this.pokemon.moveset[this.moveCursor] = tempMove; @@ -470,22 +482,32 @@ export default class SummaryUiHandler extends UiHandler { if (this.cursor === Page.MOVES) { this.showMoveSelect(); success = true; - } else if (this.cursor === Page.PROFILE && this.pokemon.hasPassive()) { + } else if (this.cursor === Page.PROFILE && this.pokemon?.hasPassive()) { // if we're on the PROFILE page and this pokemon has a passive unlocked.. // Since abilities are displayed by default, all we need to do is toggle visibility on all elements to show passives - this.abilityContainer.nameText.setVisible(!this.abilityContainer.descriptionText.visible); - this.abilityContainer.descriptionText.setVisible(!this.abilityContainer.descriptionText.visible); + this.abilityContainer.nameText?.setVisible(!this.abilityContainer.descriptionText?.visible); + this.abilityContainer.descriptionText?.setVisible(!this.abilityContainer.descriptionText.visible); this.abilityContainer.labelImage.setVisible(!this.abilityContainer.labelImage.visible); - this.passiveContainer.nameText.setVisible(!this.passiveContainer.descriptionText.visible); - this.passiveContainer.descriptionText.setVisible(!this.passiveContainer.descriptionText.visible); + this.passiveContainer.nameText?.setVisible(!this.passiveContainer.descriptionText?.visible); + this.passiveContainer.descriptionText?.setVisible(!this.passiveContainer.descriptionText.visible); this.passiveContainer.labelImage.setVisible(!this.passiveContainer.labelImage.visible); } } else if (button === Button.CANCEL) { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { this.hideMoveSelect(); } else { - ui.setMode(Mode.PARTY); + if (this.selectCallback instanceof Function) { + const selectCallback = this.selectCallback; + this.selectCallback = null; + selectCallback(); + } + + if (!fromPartyMode) { + ui.setMode(Mode.MESSAGE); + } else { + ui.setMode(Mode.PARTY); + } } success = true; } else { @@ -495,10 +517,12 @@ export default class SummaryUiHandler extends UiHandler { case Button.DOWN: if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { break; + } else if (!fromPartyMode) { + break; } const isDown = button === Button.DOWN; const party = this.scene.getParty(); - const partyMemberIndex = party.indexOf(this.pokemon); + const partyMemberIndex = this.pokemon ? party.indexOf(this.pokemon) : -1; if ((isDown && partyMemberIndex < party.length - 1) || (!isDown && partyMemberIndex)) { const page = this.cursor; this.clear(); @@ -584,7 +608,7 @@ export default class SummaryUiHandler extends UiHandler { loop: true, delay: Utils.fixedInt(600), callback: () => { - this.moveCursorObj.setVisible(false); + this.moveCursorObj?.setVisible(false); this.scene.time.delayedCall(Utils.fixedInt(100), () => { if (!this.moveCursorObj) { return; @@ -677,12 +701,7 @@ export default class SummaryUiHandler extends UiHandler { const profileContainer = this.scene.add.container(0, -pageBg.height); pageContainer.add(profileContainer); - const trainerLabel = addTextObject(this.scene, 7, 12, "OT/", TextStyle.SUMMARY_ALT); - trainerLabel.setOrigin(0, 0); - profileContainer.add(trainerLabel); - - const trainerText = addTextObject(this.scene, 25, 12, loggedInUser?.username || "Unknown", - this.scene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + const trainerText = addBBCodeTextObject(this.scene, 7, 12, `${i18next.t("pokemonSummary:ot")}/${getBBCodeFrag(loggedInUser?.username || i18next.t("pokemonSummary:unknown"), this.scene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE)}`, TextStyle.SUMMARY_ALT); trainerText.setOrigin(0, 0); profileContainer.add(trainerText); @@ -690,14 +709,15 @@ export default class SummaryUiHandler extends UiHandler { trainerIdText.setOrigin(0, 0); profileContainer.add(trainerIdText); - const typeLabel = addTextObject(this.scene, 7, 28, "Type/", TextStyle.WINDOW_ALT); + const typeLabel = addTextObject(this.scene, 7, 28, `${i18next.t("pokemonSummary:type")}/`, TextStyle.WINDOW_ALT); typeLabel.setOrigin(0, 0); profileContainer.add(typeLabel); const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => { - const xCoord = 39 + 34 * index; + const xCoord = typeLabel.width * typeLabel.scale + 9 + 34 * index; const typeIcon = !tera - ? this.scene.add.sprite(xCoord, 42, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[type].toLowerCase()) : this.scene.add.sprite(xCoord, 42, "type_tera"); + ? this.scene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), Type[type].toLowerCase()) + : this.scene.add.sprite(xCoord, 42, "type_tera"); if (tera) { typeIcon.setScale(0.5); const typeRgb = getTypeRgb(type); @@ -707,17 +727,17 @@ export default class SummaryUiHandler extends UiHandler { return typeIcon; }; - const types = this.pokemon.getTypes(false, false, true); + const types = this.pokemon?.getTypes(false, false, true)!; // TODO: is this bang correct? profileContainer.add(getTypeIcon(0, types[0])); if (types.length > 1) { profileContainer.add(getTypeIcon(1, types[1])); } - if (this.pokemon.isTerastallized()) { + if (this.pokemon?.isTerastallized()) { profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); } - if (this.pokemon.getLuck()) { - const luckLabelText = addTextObject(this.scene, 141, 28, "Luck:", TextStyle.SUMMARY_ALT); + if (this.pokemon?.getLuck()) { + const luckLabelText = addTextObject(this.scene, 141, 28, i18next.t("common:luckIndicator"), TextStyle.SUMMARY_ALT); luckLabelText.setOrigin(0, 0); profileContainer.add(luckLabelText); @@ -729,13 +749,13 @@ export default class SummaryUiHandler extends UiHandler { this.abilityContainer = { labelImage: this.scene.add.image(0, 0, "summary_profile_ability"), - ability: this.pokemon.getAbility(true), + ability: this.pokemon?.getAbility(true)!, // TODO: is this bang correct? nameText: null, descriptionText: null}; const allAbilityInfo = [this.abilityContainer]; // Creates an array to iterate through // Only add to the array and set up displaying a passive if it's unlocked - if (this.pokemon.hasPassive()) { + if (this.pokemon?.hasPassive()) { this.passiveContainer = { labelImage: this.scene.add.image(0, 0, "summary_profile_passive"), ability: this.pokemon.getPassiveAbility(), @@ -757,11 +777,11 @@ export default class SummaryUiHandler extends UiHandler { abilityInfo.labelImage.setOrigin(0, 0); profileContainer.add(abilityInfo.labelImage); - abilityInfo.nameText = addTextObject(this.scene, 7, 66, abilityInfo.ability.name, TextStyle.SUMMARY_ALT); + abilityInfo.nameText = addTextObject(this.scene, 7, 66, abilityInfo.ability?.name!, TextStyle.SUMMARY_ALT); // TODO: is this bang correct? abilityInfo.nameText.setOrigin(0, 1); profileContainer.add(abilityInfo.nameText); - abilityInfo.descriptionText = addTextObject(this.scene, 7, 69, abilityInfo.ability.description, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 } }); + abilityInfo.descriptionText = addTextObject(this.scene, 7, 69, abilityInfo.ability?.description!, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 } }); // TODO: is this bang correct? abilityInfo.descriptionText.setOrigin(0, 0); profileContainer.add(abilityInfo.descriptionText); @@ -793,12 +813,22 @@ export default class SummaryUiHandler extends UiHandler { }); // Turn off visibility of passive info by default this.passiveContainer?.labelImage.setVisible(false); - this.passiveContainer?.nameText.setVisible(false); - this.passiveContainer?.descriptionText.setVisible(false); + this.passiveContainer?.nameText?.setVisible(false); + this.passiveContainer?.descriptionText?.setVisible(false); - const memoString = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon.getNature())), TextStyle.SUMMARY_RED)}${getBBCodeFrag(" nature,", TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? "apparently " : ""}met at Lv`, TextStyle.WINDOW_ALT)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(",", TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag(".", TextStyle.WINDOW_ALT)}`; + const closeFragment = getBBCodeFrag("", TextStyle.WINDOW_ALT); + const rawNature = Utils.toReadableString(Nature[this.pokemon?.getNature()!]); // TODO: is this bang correct? + const nature = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? - const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT); + const memoString = i18next.t("pokemonSummary:memoString", { + metFragment: i18next.t(`pokemonSummary:metFragment.${this.pokemon?.metBiome === -1? "apparently": "normal"}`, { + biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + }), + natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) + }); + + const memoText = addBBCodeTextObject(this.scene, 7, 113, String(memoString), TextStyle.WINDOW_ALT); memoText.setOrigin(0, 0); profileContainer.add(memoText); break; @@ -806,24 +836,20 @@ 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 = stat !== Stat.HP - ? getStatName(stat) - : "HP"; + PERMANENT_STATS.forEach((stat, s) => { + const statName = i18next.t(getStatKey(stat)); const rowIndex = s % 3; const colIndex = Math.floor(s / 3); - const natureStatMultiplier = getNatureStatMultiplier(this.pokemon.getNature(), s); + const natureStatMultiplier = getNatureStatMultiplier(this.pokemon?.getNature()!, s); // TODO: is this bang correct? const statLabel = addTextObject(this.scene, 27 + 115 * colIndex + (colIndex === 1 ? 5 : 0), 56 + 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); statLabel.setOrigin(0.5, 0); statsContainer.add(statLabel); const statValueText = stat !== Stat.HP - ? Utils.formatStat(this.pokemon.stats[s]) - : `${Utils.formatStat(this.pokemon.hp, true)}/${Utils.formatStat(this.pokemon.getMaxHp(), true)}`; + ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? + : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? const statValue = addTextObject(this.scene, 120 + 88 * colIndex, 56 + 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); statValue.setOrigin(1, 0); @@ -831,7 +857,7 @@ export default class SummaryUiHandler extends UiHandler { }); const itemModifiers = (this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === this.pokemon.id, true) as PokemonHeldItemModifier[]) + && m.pokemonId === this.pokemon?.id, this.playerParty) as PokemonHeldItemModifier[]) .sort(modifierSortFunc); itemModifiers.forEach((item, i) => { @@ -845,23 +871,27 @@ export default class SummaryUiHandler extends UiHandler { icon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); }); - const relLvExp = getLevelRelExp(this.pokemon.level + 1, this.pokemon.species.growthRate); - const expRatio = this.pokemon.level < this.scene.getMaxExpLevel() ? this.pokemon.levelExp / relLvExp : 0; + const pkmLvl = this.pokemon?.level!; // TODO: is this bang correct? + const pkmLvlExp = this.pokemon?.levelExp!; // TODO: is this bang correct? + const pkmExp = this.pokemon?.exp!; // TODO: is this bang correct? + const pkmSpeciesGrowthRate = this.pokemon?.species.growthRate!; // TODO: is this bang correct? + const relLvExp = getLevelRelExp(pkmLvl + 1, pkmSpeciesGrowthRate); + const expRatio = pkmLvl < this.scene.getMaxExpLevel() ? pkmLvlExp / relLvExp : 0; - const expLabel = addTextObject(this.scene, 6, 112, "EXP. Points", TextStyle.SUMMARY); + const expLabel = addTextObject(this.scene, 6, 112, i18next.t("pokemonSummary:expPoints"), TextStyle.SUMMARY); expLabel.setOrigin(0, 0); statsContainer.add(expLabel); - const nextLvExpLabel = addTextObject(this.scene, 6, 128, "Next Lv.", TextStyle.SUMMARY); + const nextLvExpLabel = addTextObject(this.scene, 6, 128, i18next.t("pokemonSummary:nextLv"), TextStyle.SUMMARY); nextLvExpLabel.setOrigin(0, 0); statsContainer.add(nextLvExpLabel); - const expText = addTextObject(this.scene, 208, 112, this.pokemon.exp.toString(), TextStyle.WINDOW_ALT); + const expText = addTextObject(this.scene, 208, 112, pkmExp.toString(), TextStyle.WINDOW_ALT); expText.setOrigin(1, 0); statsContainer.add(expText); - const nextLvExp = this.pokemon.level < this.scene.getMaxExpLevel() - ? getLevelTotalExp(this.pokemon.level + 1, this.pokemon.species.growthRate) - this.pokemon.exp + const nextLvExp = pkmLvl < this.scene.getMaxExpLevel() + ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp : 0; const nextLvExpText = addTextObject(this.scene, 208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); nextLvExpText.setOrigin(1, 0); @@ -893,22 +923,26 @@ export default class SummaryUiHandler extends UiHandler { extraRowOverlay.setOrigin(0, 1); this.extraMoveRowContainer.add(extraRowOverlay); - const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? this.newMove.name : "Cancel", + const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.newMove ? this.newMove.name : i18next.t("pokemonSummary:cancel"), this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY); extraRowText.setOrigin(0, 1); this.extraMoveRowContainer.add(extraRowText); if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { this.extraMoveRowContainer.setVisible(true); - const newMoveTypeIcon = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[this.newMove.type].toLowerCase()); - newMoveTypeIcon.setOrigin(0, 1); - this.extraMoveRowContainer.add(newMoveTypeIcon); + if (this.newMove && this.pokemon) { + const spriteKey = Utils.getLocalizedSpriteKey("types"); + const moveType = this.pokemon.getMoveType(this.newMove); + const newMoveTypeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + newMoveTypeIcon.setOrigin(0, 1); + this.extraMoveRowContainer.add(newMoveTypeIcon); + } const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); ppOverlay.setOrigin(0, 1); this.extraMoveRowContainer.add(ppOverlay); - const pp = Utils.padInt(this.newMove.pp, 2, " "); + const pp = Utils.padInt(this.newMove?.pp!, 2, " "); // TODO: is this bang correct? const ppText = addTextObject(this.scene, 173, 1, `${pp}/${pp}`, TextStyle.WINDOW); ppText.setOrigin(0, 1); this.extraMoveRowContainer.add(ppText); @@ -918,12 +952,15 @@ export default class SummaryUiHandler extends UiHandler { this.movesContainer.add(this.moveRowsContainer); for (let m = 0; m < 4; m++) { - const move = m < this.pokemon.moveset.length ? this.pokemon.moveset[m] : null; + const move: PokemonMove | null = this.pokemon && this.pokemon.moveset.length > m ? this.pokemon?.moveset[m] : null; const moveRowContainer = this.scene.add.container(0, 16 * m); this.moveRowsContainer.add(moveRowContainer); - if (move) { - const typeIcon = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[move.getMove().type].toLowerCase()); typeIcon.setOrigin(0, 1); + if (move && this.pokemon) { + const spriteKey = Utils.getLocalizedSpriteKey("types"); + const moveType = this.pokemon.getMoveType(move.getMove()); + const typeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + typeIcon.setOrigin(0, 1); moveRowContainer.add(typeIcon); } @@ -989,13 +1026,13 @@ export default class SummaryUiHandler extends UiHandler { }); } - getSelectedMove(): Move { + getSelectedMove(): Move | null { if (this.cursor !== Page.MOVES) { return null; } - if (this.moveCursor < 4 && this.moveCursor < this.pokemon.moveset.length) { - return this.pokemon.moveset[this.moveCursor].getMove(); + if (this.moveCursor < 4 && this.pokemon && this.moveCursor < this.pokemon.moveset.length) { + return this.pokemon.moveset[this.moveCursor]!.getMove(); // TODO: is this bang correct? } else if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.moveCursor === 4) { return this.newMove; } @@ -1012,7 +1049,7 @@ export default class SummaryUiHandler extends UiHandler { hideMoveSelect() { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.moveSelectFunction(4); + this.moveSelectFunction && this.moveSelectFunction(4); return; } diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 772500e8901..6ca580dc2b2 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -6,17 +6,22 @@ import * as Utils from "../utils"; import { getMoveTargets } from "../data/move"; import {Button} from "#enums/buttons"; import { Moves } from "#enums/moves"; +import Pokemon from "#app/field/pokemon"; +import { ModifierBar } from "#app/modifier/modifier"; -export type TargetSelectCallback = (cursor: integer) => void; +export type TargetSelectCallback = (targets: BattlerIndex[]) => void; export default class TargetSelectUiHandler extends UiHandler { private fieldIndex: integer; private move: Moves; private targetSelectCallback: TargetSelectCallback; + private isMultipleTargets: boolean = false; private targets: BattlerIndex[]; - private targetFlashTween: Phaser.Tweens.Tween; - private targetBattleInfoMoveTween: Phaser.Tweens.Tween; + private targetsHighlighted: Pokemon[]; + private targetFlashTween: Phaser.Tweens.Tween | null; + private enemyModifiers: ModifierBar; + private targetBattleInfoMoveTween: Phaser.Tweens.Tween[] = []; constructor(scene: BattleScene) { super(scene, Mode.TARGET_SELECT); @@ -37,13 +42,17 @@ export default class TargetSelectUiHandler extends UiHandler { this.move = args[1] as Moves; this.targetSelectCallback = args[2] as TargetSelectCallback; - this.targets = getMoveTargets(this.scene.getPlayerField()[this.fieldIndex], this.move).targets; + const moveTargets = getMoveTargets(this.scene.getPlayerField()[this.fieldIndex], this.move); + this.targets = moveTargets.targets; + this.isMultipleTargets = moveTargets.multiple ?? false; if (!this.targets.length) { return false; } - this.setCursor(this.targets.indexOf(this.cursor) > -1 ? this.cursor : this.targets[0]); + this.enemyModifiers = this.scene.getModifierBar(true); + + this.setCursor(this.targets.includes(this.cursor) ? this.cursor : this.targets[0]); return true; } @@ -54,18 +63,21 @@ export default class TargetSelectUiHandler extends UiHandler { let success = false; if (button === Button.ACTION || button === Button.CANCEL) { - this.targetSelectCallback(button === Button.ACTION ? this.cursor : -1); + const targetIndexes: BattlerIndex[] = this.isMultipleTargets ? this.targets : [this.cursor]; + this.targetSelectCallback(button === Button.ACTION ? targetIndexes : []); success = true; + } else if (this.isMultipleTargets) { + success = false; } else { switch (button) { case Button.UP: if (this.cursor < BattlerIndex.ENEMY && this.targets.findIndex(t => t >= BattlerIndex.ENEMY) > -1) { - success = this.setCursor(this.targets.find(t => t >= BattlerIndex.ENEMY)); + success = this.setCursor(this.targets.find(t => t >= BattlerIndex.ENEMY)!); // TODO: is the bang correct here? } break; case Button.DOWN: if (this.cursor >= BattlerIndex.ENEMY && this.targets.findIndex(t => t < BattlerIndex.ENEMY) > -1) { - success = this.setCursor(this.targets.find(t => t < BattlerIndex.ENEMY)); + success = this.setCursor(this.targets.find(t => t < BattlerIndex.ENEMY)!); // TODO: is the bang correct here? } break; case Button.LEFT: @@ -89,73 +101,84 @@ export default class TargetSelectUiHandler extends UiHandler { } setCursor(cursor: integer): boolean { - const lastCursor = this.cursor; + const singleTarget = this.scene.getField()[cursor]; + const multipleTargets = this.targets.map(index => this.scene.getField()[index]); + + this.targetsHighlighted = this.isMultipleTargets ? multipleTargets : [ singleTarget ]; const ret = super.setCursor(cursor); if (this.targetFlashTween) { this.targetFlashTween.stop(); - const lastTarget = this.scene.getField()[lastCursor]; - if (lastTarget) { - lastTarget.setAlpha(1); + for (const pokemon of multipleTargets) { + pokemon.setAlpha(1); + this.highlightItems(pokemon.id, 1); } } - const target = this.scene.getField()[cursor]; - this.targetFlashTween = this.scene.tweens.add({ - targets: [ target ], - alpha: 0, + targets: this.targetsHighlighted, + key: { start: 1, to: 0.25 }, loop: -1, - duration: Utils.fixedInt(250), - ease: "Sine.easeIn", + loopDelay: 150, + duration: Utils.fixedInt(450), + ease: "Sine.easeInOut", yoyo: true, onUpdate: t => { - if (target) { + for (const target of this.targetsHighlighted) { target.setAlpha(t.getValue()); + this.highlightItems(target.id, t.getValue()); } } }); - if (this.targetBattleInfoMoveTween) { - this.targetBattleInfoMoveTween.stop(); - const lastTarget = this.scene.getField()[lastCursor]; - if (lastTarget) { - lastTarget.getBattleInfo().resetY(); + if (this.targetBattleInfoMoveTween.length >= 1) { + this.targetBattleInfoMoveTween.filter(t => t !== undefined).forEach(tween => tween.stop()); + for (const pokemon of multipleTargets) { + pokemon.getBattleInfo().resetY(); } } - const targetBattleInfo = target.getBattleInfo(); + const targetsBattleInfo = this.targetsHighlighted.map(target => target.getBattleInfo()); - this.targetBattleInfoMoveTween = this.scene.tweens.add({ - targets: [ targetBattleInfo ], - y: { start: targetBattleInfo.getBaseY(), to: targetBattleInfo.getBaseY() + 1 }, - loop: -1, - duration: Utils.fixedInt(250), - ease: "Linear", - yoyo: true + targetsBattleInfo.map(info => { + this.targetBattleInfoMoveTween.push(this.scene.tweens.add({ + targets: [ info ], + y: { start: info.getBaseY(), to: info.getBaseY() + 1 }, + loop: -1, + duration: Utils.fixedInt(250), + ease: "Linear", + yoyo: true + })); }); return ret; } eraseCursor() { - const target = this.scene.getField()[this.cursor]; if (this.targetFlashTween) { this.targetFlashTween.stop(); this.targetFlashTween = null; } - if (target) { - target.setAlpha(1); + + for (const pokemon of this.targetsHighlighted) { + pokemon.setAlpha(1); + this.highlightItems(pokemon.id, 1); } - const targetBattleInfo = target.getBattleInfo(); - if (this.targetBattleInfoMoveTween) { - this.targetBattleInfoMoveTween.stop(); - this.targetBattleInfoMoveTween = null; + if (this.targetBattleInfoMoveTween.length >= 1) { + this.targetBattleInfoMoveTween.filter(t => t !== undefined).forEach(tween => tween.stop()); + this.targetBattleInfoMoveTween = []; } - if (targetBattleInfo) { - targetBattleInfo.resetY(); + for (const pokemon of this.targetsHighlighted) { + pokemon.getBattleInfo().resetY(); + } + } + + private highlightItems(targetId: number, val: number) : void { + const targetItems = this.enemyModifiers.getAll("name", targetId.toString()); + for (const item of targetItems as Phaser.GameObjects.Container[]) { + item.setAlpha(val); } } 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/text.ts b/src/ui/text.ts index dd1ac57523a..99a0436bba3 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -1,10 +1,11 @@ +import { EggTier } from "#enums/egg-type"; +import { UiTheme } from "#enums/ui-theme"; +import Phaser from "phaser"; import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; import BattleScene from "../battle-scene"; import { ModifierTier } from "../modifier/modifier-tier"; -import Phaser from "phaser"; -import { EggTier } from "#enums/egg-type"; -import { UiTheme } from "#enums/ui-theme"; +import i18next from "#app/plugins/i18n"; export enum TextStyle { MESSAGE, @@ -24,6 +25,7 @@ export enum TextStyle { MONEY, STATS_LABEL, STATS_VALUE, + SETTINGS_VALUE, SETTINGS_LABEL, SETTINGS_SELECTED, SETTINGS_LOCKED, @@ -33,47 +35,70 @@ export enum TextStyle { MOVE_PP_FULL, MOVE_PP_HALF_FULL, MOVE_PP_NEAR_EMPTY, - MOVE_PP_EMPTY + MOVE_PP_EMPTY, + SMALLER_WINDOW_ALT, + BGM_BAR, + PERFECT_IV +} + +export interface TextStyleOptions { + scale: number, + styleOptions: Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, + shadowColor: string, + shadowXpos: number, + shadowYpos: number } export function addTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text { - const [ scale, styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); const ret = scene.add.text(x, y, content, styleOptions); ret.setScale(scale); ret.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { - ret.setLineSpacing(5); + ret.setLineSpacing(scale * 30); + } + + if (ret.lineSpacing < 12 && i18next.resolvedLanguage === "ja") { + ret.setLineSpacing(ret.lineSpacing + 35); } return ret; } export function setTextStyle(obj: Phaser.GameObjects.Text, scene: Phaser.Scene, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle) { - const [ scale, styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); obj.setScale(scale); obj.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { - obj.setLineSpacing(5); + obj.setLineSpacing(scale * 30); + } + + if (obj.lineSpacing < 12 && i18next.resolvedLanguage === "ja") { + obj.setLineSpacing(obj.lineSpacing + 35); } } export function addBBCodeTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): BBCodeText { - const [ scale, styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); const ret = new BBCodeText(scene, x, y, content, styleOptions as BBCodeText.TextStyle); scene.add.existing(ret); ret.setScale(scale); ret.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as BBCodeText.TextStyle).lineSpacing) { - ret.setLineSpacing(10); + ret.setLineSpacing(scale * 60); + } + + if (ret.lineSpacing < 12 && i18next.resolvedLanguage === "ja") { + ret.setLineSpacing(ret.lineSpacing + 35); } return ret; } export function addTextInputObject(scene: Phaser.Scene, x: number, y: number, width: number, height: number, style: TextStyle, extraStyleOptions?: InputText.IConfig): InputText { - const [ scale, styleOptions ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); + const { scale, styleOptions } = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); const ret = new InputText(scene, x, y, width, height, styleOptions as InputText.IConfig); scene.add.existing(ret); @@ -82,10 +107,11 @@ export function addTextInputObject(scene: Phaser.Scene, x: number, y: number, wi return ret; } -function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): [ number, Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, string, number, number ] { +export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): TextStyleOptions { + const lang = i18next.resolvedLanguage; let shadowXpos = 4; let shadowYpos = 5; - const scale = 0.1666666667; + let scale = 0.1666666667; const defaultFontSize = 96; let styleOptions: Phaser.Types.GameObjects.Text.TextStyle = { @@ -97,6 +123,11 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio } }; + if (i18next.resolvedLanguage === "ja") { + scale = 0.1388888889; + styleOptions.padding = { top:2, bottom:4 }; + } + switch (style) { case TextStyle.SUMMARY: case TextStyle.SUMMARY_ALT: @@ -108,11 +139,37 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio case TextStyle.SUMMARY_GREEN: case TextStyle.WINDOW: case TextStyle.WINDOW_ALT: - case TextStyle.STATS_VALUE: shadowXpos = 3; shadowYpos = 3; break; case TextStyle.STATS_LABEL: + let fontSizeLabel = "96px"; + switch (lang) { + case "de": + shadowXpos = 3; + shadowYpos = 3; + fontSizeLabel = "80px"; + break; + default: + fontSizeLabel = "96px"; + break; + } + styleOptions.fontSize = fontSizeLabel; + break; + case TextStyle.STATS_VALUE: + shadowXpos = 3; + shadowYpos = 3; + let fontSizeValue = "96px"; + switch (lang) { + case "de": + fontSizeValue = "80px"; + break; + default: + fontSizeValue = "96px"; + break; + } + styleOptions.fontSize = fontSizeValue; + break; case TextStyle.MESSAGE: case TextStyle.SETTINGS_LABEL: case TextStyle.SETTINGS_LOCKED: @@ -140,19 +197,29 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio shadowXpos = 3; shadowYpos = 3; break; + case TextStyle.SMALLER_WINDOW_ALT: + styleOptions.fontSize = defaultFontSize - 36; + shadowXpos = 3; + shadowYpos = 3; + break; + case TextStyle.BGM_BAR: + styleOptions.fontSize = defaultFontSize - 24; + shadowXpos = 3; + shadowYpos = 3; + break; } const shadowColor = getTextColor(style, true, uiTheme); if (extraStyleOptions) { if (extraStyleOptions.fontSize) { - const sizeRatio = parseInt(extraStyleOptions.fontSize.toString().slice(0, -2)) / parseInt(styleOptions.fontSize.toString().slice(0, -2)); + const sizeRatio = parseInt(extraStyleOptions.fontSize.toString().slice(0, -2)) / parseInt(styleOptions.fontSize?.toString().slice(0, -2) ?? "1"); shadowXpos *= sizeRatio; } styleOptions = Object.assign(styleOptions, extraStyleOptions); } - return [ scale, styleOptions, shadowColor, shadowXpos, shadowYpos ]; + return { scale, styleOptions, shadowColor, shadowXpos, shadowYpos }; } export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { @@ -160,6 +227,7 @@ export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: Ui } export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: UiTheme = UiTheme.DEFAULT): string { + const isLegacyTheme = uiTheme === UiTheme.LEGACY; switch (textStyle) { case TextStyle.MESSAGE: return !shadow ? "#f8f8f8" : "#6b5a73"; @@ -167,29 +235,30 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui case TextStyle.MOVE_INFO_CONTENT: case TextStyle.MOVE_PP_FULL: case TextStyle.TOOLTIP_CONTENT: - if (uiTheme) { + case TextStyle.SETTINGS_VALUE: + if (isLegacyTheme) { return !shadow ? "#484848" : "#d0d0c8"; } return !shadow ? "#f8f8f8" : "#6b5a73"; case TextStyle.MOVE_PP_HALF_FULL: - if (uiTheme) { + if (isLegacyTheme) { return !shadow ? "#a68e17" : "#ebd773"; } return !shadow ? "#ccbe00" : "#6e672c"; case TextStyle.MOVE_PP_NEAR_EMPTY: - if (uiTheme) { + if (isLegacyTheme) { return !shadow ? "#d64b00" : "#f7b18b"; } return !shadow ? "#d64b00" : "#69402a"; case TextStyle.MOVE_PP_EMPTY: - if (uiTheme) { + if (isLegacyTheme) { return !shadow ? "#e13d3d" : "#fca2a2"; } return !shadow ? "#e13d3d" : "#632929"; case TextStyle.WINDOW_ALT: return !shadow ? "#484848" : "#d0d0c8"; case TextStyle.BATTLE_INFO: - if (uiTheme) { + if (isLegacyTheme) { return !shadow ? "#404040" : "#ded6b5"; } return !shadow ? "#f8f8f8" : "#6b5a73"; @@ -200,7 +269,7 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui case TextStyle.SUMMARY: return !shadow ? "#f8f8f8" : "#636363"; case TextStyle.SUMMARY_ALT: - if (uiTheme) { + if (isLegacyTheme) { return !shadow ? "#f8f8f8" : "#636363"; } return !shadow ? "#484848" : "#d0d0c8"; @@ -220,13 +289,21 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui case TextStyle.STATS_LABEL: return !shadow ? "#f8b050" : "#c07800"; case TextStyle.STATS_VALUE: + if (isLegacyTheme) { + return !shadow ? "#484848" : "#d0d0c8"; + } return !shadow ? "#f8f8f8" : "#6b5a73"; case TextStyle.SUMMARY_GREEN: return !shadow ? "#78c850" : "#306850"; case TextStyle.SETTINGS_LABEL: + case TextStyle.PERFECT_IV: return !shadow ? "#f8b050" : "#c07800"; case TextStyle.SETTINGS_SELECTED: return !shadow ? "#f88880" : "#f83018"; + case TextStyle.SMALLER_WINDOW_ALT: + return !shadow ? "#484848" : "#d0d0c8"; + case TextStyle.BGM_BAR: + return !shadow ? "#f8f8f8" : "#6b5a73"; } } diff --git a/src/ui/time-of-day-widget.ts b/src/ui/time-of-day-widget.ts index e71839a84c5..ea80a6e524a 100644 --- a/src/ui/time-of-day-widget.ts +++ b/src/ui/time-of-day-widget.ts @@ -1,5 +1,5 @@ import * as Utils from "../utils"; -import BattleScene from "#app/battle-scene.js"; +import BattleScene from "#app/battle-scene"; import { BattleSceneEventType } from "../events/battle-scene"; import { EaseType } from "#enums/ease-type"; import { TimeOfDay } from "#enums/time-of-day"; @@ -147,7 +147,10 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { // Swaps all elements of the icon arrays by shifting the first element onto the end of the array // This ensures index[0] is always the new time of day icon and index[1] is always the current one this.timeOfDayIconPairs.forEach( - icons => icons.push(icons.shift())); + icons => { + const shifted = icons.shift(); + shifted && icons.push(shifted); + }); } /** diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 4036e0b9922..67a4f7260e6 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -2,10 +2,10 @@ import BattleScene from "../battle-scene"; import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; -import { TextStyle, addTextObject } from "./text"; +import { TextStyle, addTextObject, getTextStyleOptions } from "./text"; import { getBattleCountSplashMessage, getSplashMessages } from "../data/splash-messages"; import i18next from "i18next"; -import { TimedEventDisplay } from "#app/timed-event-manager.js"; +import { TimedEventDisplay } from "#app/timed-event-manager"; export default class TitleUiHandler extends OptionSelectUiHandler { private titleContainer: Phaser.GameObjects.Container; @@ -14,7 +14,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { private splashMessageText: Phaser.GameObjects.Text; private eventDisplay: TimedEventDisplay; - private titleStatsTimer: NodeJS.Timeout; + private titleStatsTimer: NodeJS.Timeout | null; constructor(scene: BattleScene, mode: Mode = Mode.TITLE) { super(scene, mode); @@ -40,7 +40,14 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.titleContainer.add(this.eventDisplay); } - this.playerCountLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 109, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, { fontSize: "54px" }); + this.playerCountLabel = addTextObject( + this.scene, + (this.scene.game.canvas.width / 6) - 2, + (this.scene.game.canvas.height / 6) - 13 - 576 * getTextStyleOptions(TextStyle.WINDOW, this.scene.uiTheme).scale, + `? ${i18next.t("menu:playersOnline")}`, + TextStyle.MESSAGE, + { fontSize: "54px" } + ); this.playerCountLabel.setOrigin(1, 0); this.titleContainer.add(this.playerCountLabel); @@ -111,7 +118,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.eventDisplay?.clear(); - clearInterval(this.titleStatsTimer); + this.titleStatsTimer && clearInterval(this.titleStatsTimer); this.titleStatsTimer = null; this.scene.tweens.add({ diff --git a/src/ui/ui-handler.ts b/src/ui/ui-handler.ts index 8336109847e..d9f0a876b71 100644 --- a/src/ui/ui-handler.ts +++ b/src/ui/ui-handler.ts @@ -8,7 +8,7 @@ import {Button} from "#enums/buttons"; */ export default abstract class UiHandler { protected scene: BattleScene; - protected mode: integer; + protected mode: integer | null; protected cursor: integer = 0; public active: boolean = false; @@ -16,7 +16,7 @@ export default abstract class UiHandler { * @param {BattleScene} scene The same scene as everything else. * @param {Mode} mode The mode of the UI element. These should be unique. */ - constructor(scene: BattleScene, mode: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { this.scene = scene; this.mode = mode; } @@ -52,6 +52,15 @@ export default abstract class UiHandler { return changed; } + /** + * Changes the style of the mouse cursor. + * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/cursor} + * @param cursorStyle cursor style to apply + */ + protected setMouseCursorStyle(cursorStyle: "pointer" | "default") { + this.scene.input.manager.canvas.style.cursor = cursorStyle; + } + clear() { this.active = false; } diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index 58490e1c618..75725910b82 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -43,7 +43,7 @@ export function addWindow(scene: BattleScene, x: number, y: number, width: numbe const borderSize = scene.uiTheme ? 6 : 8; - const window = scene.add.nineslice(x, y, `window_${scene.windowType}${getWindowVariantSuffix(windowVariant)}`, null, width, height, borderSize, borderSize, borderSize, borderSize); + const window = scene.add.nineslice(x, y, `window_${scene.windowType}${getWindowVariantSuffix(windowVariant)}`, undefined, width, height, borderSize, borderSize, borderSize, borderSize); window.setOrigin(0, 0); if (mergeMaskLeft || mergeMaskTop || maskOffsetX || maskOffsetY) { diff --git a/src/ui/ui.ts b/src/ui/ui.ts index ce834a83645..6c988b43043 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -1,4 +1,4 @@ -import {default as BattleScene} from "../battle-scene"; +import { default as BattleScene } from "../battle-scene"; import UiHandler from "./ui-handler"; import BattleMessageUiHandler from "./battle-message-ui-handler"; import CommandUiHandler from "./command-ui-handler"; @@ -23,8 +23,7 @@ import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import EggHatchSceneHandler from "./egg-hatch-scene-handler"; import EggListUiHandler from "./egg-list-ui-handler"; import EggGachaUiHandler from "./egg-gacha-ui-handler"; -import VouchersUiHandler from "./vouchers-ui-handler"; -import {addWindow} from "./ui-theme"; +import { addWindow } from "./ui-theme"; import LoginFormUiHandler from "./login-form-ui-handler"; import RegistrationFormUiHandler from "./registration-form-ui-handler"; import LoadingModalUiHandler from "./loading-modal-ui-handler"; @@ -37,8 +36,8 @@ import SavingIconHandler from "./saving-icon-handler"; import UnavailableModalUiHandler from "./unavailable-modal-ui-handler"; import OutdatedModalUiHandler from "./outdated-modal-ui-handler"; import SessionReloadModalUiHandler from "./session-reload-modal-ui-handler"; -import {Button} from "#enums/buttons"; -import i18next, {ParseKeys} from "i18next"; +import { Button } from "#enums/buttons"; +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"; @@ -46,6 +45,13 @@ import SettingsDisplayUiHandler from "./settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./settings/settings-audio-ui-handler"; import { PlayerGender } from "#enums/player-gender"; import BgmBar from "#app/ui/bgm-bar"; +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, @@ -61,6 +67,7 @@ export enum Mode { STARTER_SELECT, EVOLUTION_SCENE, EGG_HATCH_SCENE, + EGG_HATCH_SUMMARY, CONFIRM, OPTION_SELECT, MENU, @@ -74,7 +81,6 @@ export enum Mode { KEYBOARD_BINDING, ACHIEVEMENTS, GAME_STATS, - VOUCHERS, EGG_LIST, EGG_GACHA, LOGIN_FORM, @@ -83,7 +89,13 @@ export enum Mode { SESSION_RELOAD, UNAVAILABLE, OUTDATED, - CHALLENGE_SELECT + CHALLENGE_SELECT, + RENAME_POKEMON, + RUN_HISTORY, + RUN_INFO, + TEST_DIALOGUE, + AUTO_COMPLETE, + ADMIN, } const transitionModes = [ @@ -95,7 +107,8 @@ const transitionModes = [ Mode.EGG_HATCH_SCENE, Mode.EGG_LIST, Mode.EGG_GACHA, - Mode.CHALLENGE_SELECT + Mode.CHALLENGE_SELECT, + Mode.RUN_HISTORY, ]; const noTransitionModes = [ @@ -113,13 +126,16 @@ const noTransitionModes = [ Mode.SETTINGS_KEYBOARD, Mode.ACHIEVEMENTS, Mode.GAME_STATS, - Mode.VOUCHERS, Mode.LOGIN_FORM, Mode.REGISTRATION_FORM, Mode.LOADING, Mode.SESSION_RELOAD, Mode.UNAVAILABLE, - Mode.OUTDATED + Mode.OUTDATED, + Mode.RENAME_POKEMON, + Mode.TEST_DIALOGUE, + Mode.AUTO_COMPLETE, + Mode.ADMIN, ]; export default class UI extends Phaser.GameObjects.Container { @@ -157,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), @@ -171,7 +188,6 @@ export default class UI extends Phaser.GameObjects.Container { new KeyboardBindingUiHandler(scene), new AchvsUiHandler(scene), new GameStatsUiHandler(scene), - new VouchersUiHandler(scene), new EggListUiHandler(scene), new EggGachaUiHandler(scene), new LoginFormUiHandler(scene), @@ -180,7 +196,13 @@ export default class UI extends Phaser.GameObjects.Container { new SessionReloadModalUiHandler(scene), new UnavailableModalUiHandler(scene), new OutdatedModalUiHandler(scene), - new GameChallengesUiHandler(scene) + new GameChallengesUiHandler(scene), + new RenameFormUiHandler(scene), + new RunHistoryUiHandler(scene), + new RunInfoUiHandler(scene), + new TestDialogueUiHandler(scene, Mode.TEST_DIALOGUE), + new AutoCompleteUiHandler(scene), + new AdminUiHandler(scene), ]; } @@ -231,8 +253,8 @@ export default class UI extends Phaser.GameObjects.Container { (this.scene as BattleScene).uiContainer.add(this.tooltipContainer); } - getHandler(): UiHandler { - return this.handlers[this.mode]; + getHandler(): H { + return this.handlers[this.mode] as H; } getMessageHandler(): BattleMessageUiHandler { @@ -267,10 +289,10 @@ export default class UI extends Phaser.GameObjects.Container { return handler.processInput(button); } - showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer): void { + showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null): void { if (prompt && text.indexOf("$") > -1) { const messagePages = text.split(/\$/g).map(m => m.trim()); - let showMessageAndCallback = () => callback(); + let showMessageAndCallback = () => callback && callback(); for (let p = messagePages.length - 1; p >= 0; p--) { const originalFunc = showMessageAndCallback; showMessageAndCallback = () => this.showText(messagePages[p], null, originalFunc, null, true); @@ -283,33 +305,33 @@ export default class UI extends Phaser.GameObjects.Container { } else { this.getMessageHandler().showText(text, delay, callback, callbackDelay, prompt, promptDelay); } + } } - showDialogue(text: string, name: string, delay: integer = 0, callback: Function, callbackDelay?: integer, promptDelay?: integer): void { - // 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 = 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 as ParseKeys) ) { - 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) { @@ -329,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 as ParseKeys) ) { - 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; } } @@ -367,8 +384,8 @@ export default class UI extends Phaser.GameObjects.Container { update(): void { if (this.tooltipContainer.visible) { - const reverse = this.scene.game.input.mousePointer.x >= this.scene.game.canvas.width - this.tooltipBg.width * 6 - 12; - this.tooltipContainer.setPosition(!reverse ? this.scene.game.input.mousePointer.x / 6 + 2 : this.scene.game.input.mousePointer.x / 6 - this.tooltipBg.width - 2, this.scene.game.input.mousePointer.y / 6 + 2); + const reverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.x >= this.scene.game.canvas.width - this.tooltipBg.width * 6 - 12; + this.tooltipContainer.setPosition(!reverse ? this.scene.game.input.mousePointer!.x / 6 + 2 : this.scene.game.input.mousePointer!.x / 6 - this.tooltipBg.width - 2, this.scene.game.input.mousePointer!.y / 6 + 2); // TODO: are these bangs correct? } } @@ -391,11 +408,11 @@ export default class UI extends Phaser.GameObjects.Container { } playSelect(): void { - (this.scene as BattleScene).playSound("select"); + (this.scene as BattleScene).playSound("ui/select"); } playError(): void { - (this.scene as BattleScene).playSound("error"); + (this.scene as BattleScene).playSound("ui/error"); } fadeOut(duration: integer): Promise { @@ -448,9 +465,10 @@ export default class UI extends Phaser.GameObjects.Container { } if (chainMode && this.mode && !clear) { this.modeChain.push(this.mode); + (this.scene as BattleScene).updateGameInfo(); } this.mode = mode; - const touchControls = document.getElementById("touchControls"); + const touchControls = document?.getElementById("touchControls"); if (touchControls) { touchControls.dataset.uiMode = Mode[mode]; } @@ -493,6 +511,11 @@ export default class UI extends Phaser.GameObjects.Container { return this.setModeInternal(mode, false, false, true, args); } + resetModeChain(): void { + this.modeChain = []; + (this.scene as BattleScene).updateGameInfo(); + } + revertMode(): Promise { return new Promise(resolve => { if (!this?.modeChain?.length) { @@ -503,7 +526,8 @@ export default class UI extends Phaser.GameObjects.Container { const doRevertMode = () => { this.getHandler().clear(); - this.mode = this.modeChain.pop(); + this.mode = this.modeChain.pop()!; // TODO: is this bang correct? + (this.scene as BattleScene).updateGameInfo(); const touchControls = document.getElementById("touchControls"); if (touchControls) { touchControls.dataset.uiMode = Mode[this.mode]; @@ -532,4 +556,8 @@ export default class UI extends Phaser.GameObjects.Container { this.revertMode().then(success => Utils.executeIf(success, this.revertModes).then(() => resolve())); }); } + + public getModeChain(): Mode[] { + return this.modeChain; + } } diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index 2f6e1c08832..3375fb930e6 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -7,7 +7,7 @@ import * as Utils from "#app/utils"; import i18next from "i18next"; export default class UnavailableModalUiHandler extends ModalUiHandler { - private reconnectTimer: NodeJS.Timeout; + private reconnectTimer: NodeJS.Timeout | null; private reconnectDuration: number; private reconnectCallback: () => void; @@ -16,7 +16,7 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { private readonly randVarianceTime = 1000 * 10; - constructor(scene: BattleScene, mode?: Mode) { + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.reconnectDuration = this.minTime; } @@ -55,10 +55,10 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { if (response[0] || [200, 400].includes(response[1])) { this.reconnectTimer = null; this.reconnectDuration = this.minTime; - this.scene.playSound("pb_bounce_1"); + this.scene.playSound("se/pb_bounce_1"); this.reconnectCallback(); } else if (response[1] === 401) { - Utils.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); this.scene.reset(true, true); } else { this.reconnectDuration = Math.min(this.reconnectDuration * 2, this.maxTime); // Set a max delay so it isn't infinite diff --git a/src/ui/vouchers-ui-handler.ts b/src/ui/vouchers-ui-handler.ts deleted file mode 100644 index 370859bed54..00000000000 --- a/src/ui/vouchers-ui-handler.ts +++ /dev/null @@ -1,262 +0,0 @@ -import BattleScene from "../battle-scene"; -import { Button } from "#enums/buttons"; -import i18next from "i18next"; -import { Voucher, getVoucherTypeIcon, getVoucherTypeName, vouchers } from "../system/voucher"; -import MessageUiHandler from "./message-ui-handler"; -import { TextStyle, addTextObject } from "./text"; -import { Mode } from "./ui"; -import { addWindow } from "./ui-theme"; - -const itemRows = 4; -const itemCols = 17; - -export default class VouchersUiHandler extends MessageUiHandler { - private vouchersContainer: Phaser.GameObjects.Container; - private voucherIconsContainer: Phaser.GameObjects.Container; - - private voucherIconsBg: Phaser.GameObjects.NineSlice; - private voucherIcons: Phaser.GameObjects.Sprite[]; - private titleText: Phaser.GameObjects.Text; - private unlockText: Phaser.GameObjects.Text; - - private itemsTotal: integer; - private scrollCursor: integer; - - private cursorObj: Phaser.GameObjects.NineSlice; - - constructor(scene: BattleScene, mode?: Mode) { - super(scene, mode); - - this.itemsTotal = Object.keys(vouchers).length; - this.scrollCursor = 0; - } - - setup() { - const ui = this.getUi(); - - this.vouchersContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - - this.vouchersContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); - - const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); - headerBg.setOrigin(0, 0); - - const headerText = addTextObject(this.scene, 0, 0, i18next.t("voucher:vouchers"), TextStyle.SETTINGS_LABEL); - headerText.setOrigin(0, 0); - headerText.setPositionRelative(headerBg, 8, 4); - - this.voucherIconsBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - headerBg.height - 68); - this.voucherIconsBg.setOrigin(0, 0); - - this.voucherIconsContainer = this.scene.add.container(6, headerBg.height + 6); - - this.voucherIcons = []; - - for (let a = 0; a < itemRows * itemCols; a++) { - const x = (a % itemCols) * 18; - const y = Math.floor(a / itemCols) * 18; - - const icon = this.scene.add.sprite(x, y, "items", "unknown"); - icon.setOrigin(0, 0); - icon.setScale(0.5); - - this.voucherIcons.push(icon); - this.voucherIconsContainer.add(icon); - } - - const titleBg = addWindow(this.scene, 0, headerBg.height + this.voucherIconsBg.height, 220, 24); - titleBg.setOrigin(0, 0); - - this.titleText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); - this.titleText.setOrigin(0, 0); - this.titleText.setPositionRelative(titleBg, 8, 4); - - const unlockBg = addWindow(this.scene, titleBg.x + titleBg.width, titleBg.y, 98, 24); - unlockBg.setOrigin(0, 0); - - this.unlockText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); - this.unlockText.setOrigin(0, 0); - this.unlockText.setPositionRelative(unlockBg, 8, 4); - - const descriptionBg = addWindow(this.scene, 0, titleBg.y + titleBg.height, (this.scene.game.canvas.width / 6) - 2, 42); - descriptionBg.setOrigin(0, 0); - - const descriptionText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { maxLines: 2 }); - descriptionText.setWordWrapWidth(1870); - descriptionText.setOrigin(0, 0); - descriptionText.setPositionRelative(descriptionBg, 8, 4); - - this.message = descriptionText; - - this.vouchersContainer.add(headerBg); - this.vouchersContainer.add(headerText); - this.vouchersContainer.add(this.voucherIconsBg); - this.vouchersContainer.add(this.voucherIconsContainer); - this.vouchersContainer.add(titleBg); - this.vouchersContainer.add(this.titleText); - this.vouchersContainer.add(unlockBg); - this.vouchersContainer.add(this.unlockText); - this.vouchersContainer.add(descriptionBg); - this.vouchersContainer.add(descriptionText); - - ui.add(this.vouchersContainer); - - this.setCursor(0); - - this.vouchersContainer.setVisible(false); - } - - show(args: any[]): boolean { - super.show(args); - - this.vouchersContainer.setVisible(true); - this.setCursor(0); - this.setScrollCursor(0); - - this.updateVoucherIcons(); - - this.getUi().moveTo(this.vouchersContainer, this.getUi().length - 1); - - this.getUi().hideTooltip(); - - return true; - } - - protected showVoucher(voucher: Voucher) { - const voucherUnlocks = this.scene.gameData.voucherUnlocks; - const unlocked = voucherUnlocks.hasOwnProperty(voucher.id); - - this.titleText.setText(getVoucherTypeName(voucher.voucherType)); - this.showText(voucher.description); - this.unlockText.setText(unlocked ? new Date(voucherUnlocks[voucher.id]).toLocaleDateString() : i18next.t("voucher:locked")); - } - - processInput(button: Button): boolean { - const ui = this.getUi(); - - let success = false; - - if (button === Button.CANCEL) { - success = true; - this.scene.ui.revertMode(); - } else { - const rowIndex = Math.floor(this.cursor / itemCols); - const itemOffset = (this.scrollCursor * itemCols); - switch (button) { - case Button.UP: - if (this.cursor < itemCols) { - if (this.scrollCursor) { - success = this.setScrollCursor(this.scrollCursor - 1); - } - } else { - success = this.setCursor(this.cursor - itemCols); - } - break; - case Button.DOWN: - const canMoveDown = (this.cursor + itemOffset) + itemCols < this.itemsTotal; - if (rowIndex >= itemRows - 1) { - if (this.scrollCursor < Math.ceil(this.itemsTotal / itemCols) - itemRows && canMoveDown) { - success = this.setScrollCursor(this.scrollCursor + 1); - } - } else if (canMoveDown) { - success = this.setCursor(this.cursor + itemCols); - } - break; - case Button.LEFT: - if (!this.cursor && this.scrollCursor) { - success = this.setScrollCursor(this.scrollCursor - 1) && this.setCursor(this.cursor + (itemCols - 1)); - } else if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } - break; - case Button.RIGHT: - if (this.cursor + 1 === itemRows * itemCols && this.scrollCursor < Math.ceil(this.itemsTotal / itemCols) - itemRows) { - success = this.setScrollCursor(this.scrollCursor + 1) && this.setCursor(this.cursor - (itemCols - 1)); - } else if (this.cursor + itemOffset < Object.keys(vouchers).length - 1) { - success = this.setCursor(this.cursor + 1); - } - break; - } - } - - if (success) { - ui.playSelect(); - } - - return success; - } - - setCursor(cursor: integer): boolean { - const ret = super.setCursor(cursor); - - let updateVoucher = ret; - - if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight", null, 16, 16, 1, 1, 1, 1); - this.cursorObj.setOrigin(0, 0); - this.voucherIconsContainer.add(this.cursorObj); - updateVoucher = true; - } - - this.cursorObj.setPositionRelative(this.voucherIcons[this.cursor], 0, 0); - - if (updateVoucher) { - this.showVoucher(vouchers[Object.keys(vouchers)[cursor + this.scrollCursor * itemCols]]); - } - - return ret; - } - - setScrollCursor(scrollCursor: integer): boolean { - if (scrollCursor === this.scrollCursor) { - return false; - } - - this.scrollCursor = scrollCursor; - - this.updateVoucherIcons(); - - this.showVoucher(vouchers[Object.keys(vouchers)[Math.min(this.cursor + this.scrollCursor * itemCols, Object.values(vouchers).length - 1)]]); - - return true; - } - - updateVoucherIcons(): void { - const voucherUnlocks = this.scene.gameData.voucherUnlocks; - - const itemOffset = this.scrollCursor * itemCols; - const itemLimit = itemRows * itemCols; - - const voucherRange = Object.values(vouchers).slice(itemOffset, itemLimit + itemOffset); - - voucherRange.forEach((voucher: Voucher, i: integer) => { - const icon = this.voucherIcons[i]; - const unlocked = voucherUnlocks.hasOwnProperty(voucher.id); - - icon.setFrame(getVoucherTypeIcon(voucher.voucherType)); - icon.setVisible(true); - if (!unlocked) { - icon.setTintFill(0); - } else { - icon.clearTint(); - } - }); - - if (voucherRange.length < this.voucherIcons.length) { - this.voucherIcons.slice(voucherRange.length).map(i => i.setVisible(false)); - } - } - - clear() { - super.clear(); - this.vouchersContainer.setVisible(false); - this.eraseCursor(); - } - - eraseCursor() { - if (this.cursorObj) { - this.cursorObj.destroy(); - } - this.cursorObj = null; - } -} diff --git a/src/utils.ts b/src/utils.ts index 5aa558bae3a..592981c7643 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,5 @@ -import i18next from "i18next"; import { MoneyFormat } from "#enums/money-format"; +import i18next from "i18next"; export const MissingTextureKey = "__MISSING"; @@ -82,6 +82,12 @@ export function randInt(range: integer, min: integer = 0): integer { return Math.floor(Math.random() * range) + min; } +/** + * Generates a random number using the global seed, or the current battle's seed if called via `Battle.randSeedInt` + * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} + * @param min The minimum integer to pick, default `0` + * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) + */ export function randSeedInt(range: integer, min: integer = 0): integer { if (range <= 1) { return min; @@ -116,7 +122,7 @@ export function randSeedWeightedItem(items: T[]): T { : Phaser.Math.RND.weightedPick(items); } -export function randSeedEasedWeightedItem(items: T[], easingFunction: string = "Sine.easeIn"): T { +export function randSeedEasedWeightedItem(items: T[], easingFunction: string = "Sine.easeIn"): T | null { if (!items.length) { return null; } @@ -165,40 +171,20 @@ export function getPlayTimeString(totalSeconds: integer): string { return `${days.padStart(2, "0")}:${hours.padStart(2, "0")}:${minutes.padStart(2, "0")}:${seconds.padStart(2, "0")}`; } -export function binToDec(input: string): integer { - const place: integer[] = []; - const binary: string[] = []; - - let decimalNum = 0; - - for (let i = 0; i < input.length; i++) { - binary.push(input[i]); - place.push(Math.pow(2, i)); - decimalNum += place[i] * parseInt(binary[i]); - } - - return decimalNum; -} - -export function decToBin(input: integer): string { - let bin = ""; - let intNum = input; - while (intNum > 0) { - bin = intNum % 2 ? `1${bin}` : `0${bin}`; - intNum = Math.floor(intNum * 0.5); - } - - return bin; -} - -export function getIvsFromId(id: integer): integer[] { +/** + * Generates IVs from a given {@linkcode id} by extracting 5 bits at a time + * starting from the least significant bit up to the 30th most significant bit. + * @param id 32-bit number + * @returns An array of six numbers corresponding to 5-bit chunks from {@linkcode id} + */ +export function getIvsFromId(id: number): number[] { return [ - binToDec(decToBin(id).substring(0, 5)), - binToDec(decToBin(id).substring(5, 10)), - binToDec(decToBin(id).substring(10, 15)), - binToDec(decToBin(id).substring(15, 20)), - binToDec(decToBin(id).substring(20, 25)), - binToDec(decToBin(id).substring(25, 30)) + (id & 0x3E000000) >>> 25, + (id & 0x01F00000) >>> 20, + (id & 0x000F8000) >>> 15, + (id & 0x00007C00) >>> 10, + (id & 0x000003E0) >>> 5, + (id & 0x0000001F) ]; } @@ -266,16 +252,16 @@ export function formatStat(stat: integer, forHp: boolean = false): string { return formatLargeNumber(stat, forHp ? 100000 : 1000000); } -export function getEnumKeys(enumType): string[] { - return Object.values(enumType).filter(v => isNaN(parseInt(v.toString()))).map(v => v.toString()); +export function getEnumKeys(enumType: any): string[] { + return Object.values(enumType).filter(v => isNaN(parseInt(v!.toString()))).map(v => v!.toString()); } -export function getEnumValues(enumType): integer[] { - return Object.values(enumType).filter(v => !isNaN(parseInt(v.toString()))).map(v => parseInt(v.toString())); +export function getEnumValues(enumType: any): integer[] { + return Object.values(enumType).filter(v => !isNaN(parseInt(v!.toString()))).map(v => parseInt(v!.toString())); } -export function executeIf(condition: boolean, promiseFunc: () => Promise): Promise { - return condition ? promiseFunc() : new Promise(resolve => resolve(null)); +export function executeIf(condition: boolean, promiseFunc: () => Promise): Promise { + return condition ? promiseFunc() : new Promise(resolve => resolve(null)); } export const sessionIdKey = "pokerogue_sessionId"; @@ -292,13 +278,29 @@ export const apiUrl = localServerUrl ?? "https://api.pokerogue.net"; // used to disable api calls when isLocal is true and a server is not found export let isLocalServerConnected = true; +export const isBeta = import.meta.env.MODE === "beta"; // this checks to see if the env mode is development. Technically this gives the same value for beta AND for dev envs + export function setCookie(cName: string, cValue: string): void { const expiration = new Date(); expiration.setTime(new Date().getTime() + 3600000 * 24 * 30 * 3/*7*/); - document.cookie = `${cName}=${cValue};Secure;SameSite=Strict;Path=/;Expires=${expiration.toUTCString()}`; + document.cookie = `${cName}=${cValue};Secure;SameSite=Strict;Domain=${window.location.hostname};Path=/;Expires=${expiration.toUTCString()}`; +} + +export function removeCookie(cName: string): void { + if (isBeta) { + document.cookie = `${cName}=;Secure;SameSite=Strict;Domain=pokerogue.net;Path=/;Max-Age=-1`; // we need to remove the cookie from the main domain as well + } + + document.cookie = `${cName}=;Secure;SameSite=Strict;Domain=${window.location.hostname};Path=/;Max-Age=-1`; + document.cookie = `${cName}=;Secure;SameSite=Strict;Path=/;Max-Age=-1`; // legacy cookie without domain, for older cookies to prevent a login loop } export function getCookie(cName: string): string { + // check if there are multiple cookies with the same name and delete them + if (document.cookie.split(";").filter(c => c.includes(cName)).length > 1) { + removeCookie(cName); + return ""; + } const name = `${cName}=`; const ca = document.cookie.split(";"); for (let i = 0; i < ca.length; i++) { @@ -409,6 +411,13 @@ export function formatText(unformattedText: string): string { return text.join(" "); } +export function toCamelCaseString(unformattedText: string): string { + if (!unformattedText) { + return ""; + } + return unformattedText.split(/[_ ]/).filter(f => f).map((f, i) => i ? `${f[0].toUpperCase()}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); +} + export function rgbToHsv(r: integer, g: integer, b: integer) { const v = Math.max(r, g, b); const c = v - Math.min(r, g, b); @@ -433,7 +442,7 @@ export function deltaRgb(rgb1: integer[], rgb2: integer[]): integer { } export function rgbHexToRgba(hex: string) { - const color = hex.match(/^([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i); + const color = hex.match(/^([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i)!; // TODO: is this bang correct? return { r: parseInt(color[1], 16), g: parseInt(color[2], 16), @@ -446,6 +455,26 @@ export function rgbaToInt(rgba: integer[]): integer { return (rgba[0] << 24) + (rgba[1] << 16) + (rgba[2] << 8) + rgba[3]; } +/** + * Provided valid HSV values, calculates and stitches together a string of that + * HSV color's corresponding hex code. + * + * Sourced from {@link https://stackoverflow.com/a/44134328}. + * @param h Hue in degrees, must be in a range of [0, 360] + * @param s Saturation percentage, must be in a range of [0, 1] + * @param l Ligthness percentage, must be in a range of [0, 1] + * @returns a string of the corresponding color hex code with a "#" prefix + */ +export function hslToHex(h: number, s: number, l: number): string { + const a = s * Math.min(l, 1 - l); + const f = (n: number) => { + const k = (n + h / 30) % 12; + const rgb = l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)); + return Math.round(rgb * 255).toString(16).padStart(2, "0"); + }; + return `#${f(0)}${f(8)}${f(4)}`; +} + /*This function returns true if the current lang is available for some functions If the lang is not in the function, it usually means that lang is going to use the default english version This function is used in: @@ -467,6 +496,7 @@ export function verifyLang(lang?: string): boolean { case "zh-TW": case "pt-BR": case "ko": + case "ja": return true; default: return false; @@ -527,4 +557,55 @@ export function reverseValueToKeySetting(input) { return capitalizedWords.join("_"); } +/** + * Capitalize a string. + * + * @param str - The string to be capitalized. + * @param sep - The separator between the words of the string. + * @param lowerFirstChar - Whether the first character of the string should be lowercase or not. + * @param returnWithSpaces - Whether the returned string should have spaces between the words or not. + * @returns The capitalized string. + */ +export function capitalizeString(str: string, sep: string, lowerFirstChar: boolean = true, returnWithSpaces: boolean = false) { + if (str) { + const splitedStr = str.toLowerCase().split(sep); + for (let i = +lowerFirstChar; i < splitedStr?.length; i++) { + splitedStr[i] = splitedStr[i].charAt(0).toUpperCase() + splitedStr[i].substring(1); + } + + return returnWithSpaces ? splitedStr.join(" ") : splitedStr.join(""); + } + return null; +} + +/** + * Returns if an object is null or undefined + * @param object + */ +export function isNullOrUndefined(object: any): boolean { + return null === object || undefined === object; +} + +/** + * This function is used in the context of a Pokémon battle game to calculate the actual integer damage value from a float result. + * Many damage calculation formulas involve various parameters and result in float values. + * The actual damage applied to a Pokémon's HP must be an integer. + * This function helps in ensuring that by flooring the float value and enforcing a minimum damage value. + * + * @param value - The float value to convert. + * @param minValue - The minimum integer value to return. Defaults to 1. + * @returns The converted value as an integer. + */ +export function toDmgValue(value: number, minValue: number = 1) { + return Math.max(Math.floor(value), minValue); +} + +/** + * Helper method to localize a sprite key (e.g. for types) + * @param baseKey the base key of the sprite (e.g. `type`) + * @returns the localized sprite key + */ +export function getLocalizedSpriteKey(baseKey: string) { + return `${baseKey}${verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; +} diff --git a/src/vite.env.d.ts b/src/vite.env.d.ts index b588b5b1145..a2acc658a10 100644 --- a/src/vite.env.d.ts +++ b/src/vite.env.d.ts @@ -1,10 +1,14 @@ /// interface ImportMetaEnv { + readonly VITE_PORT?: string; readonly VITE_BYPASS_LOGIN?: string; readonly VITE_BYPASS_TUTORIAL?: string; readonly VITE_API_BASE_URL?: string; readonly VITE_SERVER_URL?: string; + readonly VITE_DISCORD_CLIENT_ID?: string; + readonly VITE_GOOGLE_CLIENT_ID?: string; + readonly VITE_I18N_DEBUG?: string; } interface ImportMeta { diff --git a/tsconfig.json b/tsconfig.json index 682b3a7084b..f8e019a1b8b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "esModuleInterop": true, - "strictNullChecks": false, + "strictNullChecks": true, "sourceMap": false, "strict": false, "rootDir": "./src", @@ -29,6 +29,7 @@ "node_modules", "dist", "vite.config.ts", - "vitest.config.ts" + "vitest.config.ts", + "vitest.workspace.ts", ] } \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index f0830f5b9be..1fd85e2572f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,30 +1,42 @@ -import { defineConfig } from 'vite'; +import { defineConfig, loadEnv, Rollup, UserConfig } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; +import { minifyJsonPlugin } from "./src/plugins/vite/vite-minify-json-plugin"; -export const defaultConfig = { - plugins: [tsconfigPaths() as any], - server: { host: '0.0.0.0', port: 8000 }, +export const defaultConfig: UserConfig = { + plugins: [ + tsconfigPaths(), + minifyJsonPlugin(["images", "battle-anims"], true) + ], clearScreen: false, + appType: "mpa", build: { - minify: 'esbuild' as const, + chunkSizeWarningLimit: 10000, + minify: 'esbuild', sourcemap: false, - }, - rollupOptions: { - onwarn(warning, warn) { - // Suppress "Module level directives cause errors when bundled" warnings - if (warning.code === "MODULE_LEVEL_DIRECTIVE") { - return; - } - warn(warning); + rollupOptions: { + onwarn(warning: Rollup.RollupLog, defaultHandler: (warning: string | Rollup.RollupLog) => void) { + // Suppress "Module level directives cause errors when bundled" warnings + if (warning.code === "MODULE_LEVEL_DIRECTIVE") { + return; + } + defaultHandler(warning); + }, }, - } + }, }; -export default defineConfig(({mode}) => ({ - ...defaultConfig, - esbuild: { - pure: mode === 'production' ? [ 'console.log' ] : [], - keepNames: true, - }, -})); +export default defineConfig(({mode}) => { + const envPort = Number(loadEnv(mode, process.cwd()).VITE_PORT); + + return ({ + ...defaultConfig, + esbuild: { + pure: mode === 'production' ? ['console.log'] : [], + keepNames: true, + }, + server: { + port: !isNaN(envPort) ? envPort : 8000, + } + }); +}); diff --git a/vitest.config.ts b/vitest.config.ts index 7f16059a8ad..9a765a89ae7 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,35 +1,43 @@ -import { defineConfig } from 'vitest/config'; +import { defineProject, UserWorkspaceConfig } from 'vitest/config'; import { defaultConfig } from './vite.config'; -export default defineConfig(({mode}) => ({ - ...defaultConfig, - test: { - setupFiles: ['./src/test/vitest.setup.ts'], - server: { - deps: { - inline: ['vitest-canvas-mock'], - optimizer: { - web: { - include: ['vitest-canvas-mock'], - } +export const defaultProjectTestConfig: UserWorkspaceConfig["test"] = { + setupFiles: ['./src/test/vitest.setup.ts'], + server: { + deps: { + inline: ['vitest-canvas-mock'], + //@ts-ignore + optimizer: { + web: { + include: ['vitest-canvas-mock'], } } + } + }, + environment: 'jsdom' as const, + environmentOptions: { + jsdom: { + resources: 'usable', }, - environment: 'jsdom' as const, - environmentOptions: { - jsdom: { - resources: 'usable', - }, - }, - threads: false, - trace: true, - restoreMocks: true, - watch: false, - coverage: { - provider: 'istanbul' as const, - reportsDirectory: 'coverage' as const, - reporters: ['text-summary', 'html'], - }, + }, + threads: false, + trace: true, + restoreMocks: true, + watch: false, + coverage: { + provider: 'istanbul' as const, + reportsDirectory: 'coverage' as const, + reporters: ['text-summary', 'html'], + }, +} + +export default defineProject(({ mode }) => ({ + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "main", + include: ["./src/test/**/*.{test,spec}.ts"], + exclude: ["./src/test/pre.test.ts"], }, esbuild: { pure: mode === 'production' ? [ 'console.log' ] : [], diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 00000000000..a885b77dc9d --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,68 @@ +import { defineWorkspace } from "vitest/config"; +import { defaultConfig } from "./vite.config"; +import { defaultProjectTestConfig } from "./vitest.config"; + +export default defineWorkspace([ + { + ...defaultConfig, + test: { + name: "pre", + include: ["src/test/pre.test.ts"], + environment: "jsdom", + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "misc", + include: [ + "src/test/achievements/**/*.{test,spec}.ts", + "src/test/arena/**/*.{test,spec}.ts", + "src/test/battlerTags/**/*.{test,spec}.ts", + "src/test/eggs/**/*.{test,spec}.ts", + "src/test/field/**/*.{test,spec}.ts", + "src/test/inputs/**/*.{test,spec}.ts", + "src/test/localization/**/*.{test,spec}.ts", + "src/test/phases/**/*.{test,spec}.ts", + "src/test/settingMenu/**/*.{test,spec}.ts", + "src/test/sprites/**/*.{test,spec}.ts", + "src/test/ui/**/*.{test,spec}.ts", + "src/test/*.{test,spec}.ts", + ], + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "abilities", + include: ["src/test/abilities/**/*.{test,spec}.ts"], + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "battle", + include: ["src/test/battle/**/*.{test,spec}.ts"], + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "items", + include: ["src/test/items/**/*.{test,spec}.ts"], + }, + }, + { + ...defaultConfig, + test: { + ...defaultProjectTestConfig, + name: "moves", + include: ["src/test/moves/**/*.{test,spec}.ts"], + }, + }, + "./vitest.config.ts", +]);